Repository: whitebearcode/typecho-bearsimple Branch: v2.x Commit: dd2f6c33d6ab Files: 2965 Total size: 27.6 MB Directory structure: gitextract_gmgxw60q/ ├── 404.php ├── LICENSE ├── README.MD ├── about.php ├── acg.php ├── archive.php ├── archived.php ├── assets/ │ ├── check.json │ ├── css/ │ │ ├── copycode.css │ │ ├── donate.css │ │ ├── lxgw/ │ │ │ ├── lxgwwenkaigbscreen.css │ │ │ ├── lxgwwenkaigbscreenr.css │ │ │ ├── lxgwwenkaiscreen.css │ │ │ ├── lxgwwenkaiscreenr.css │ │ │ └── style.css │ │ └── modules/ │ │ ├── steam/ │ │ │ └── style.css │ │ └── timeline_custom.css │ ├── images/ │ │ └── loaders/ │ │ └── index.html │ ├── js/ │ │ ├── article_donate.js │ │ ├── bearsimple-comments.js │ │ ├── commentTyping.js │ │ ├── emaction.js │ │ ├── gt4.js │ │ ├── instantPage.js │ │ ├── jquery.pjax.js │ │ ├── lazyloads.js │ │ ├── modules/ │ │ │ └── darkmode.js │ │ ├── nprogress.js │ │ ├── progress.js │ │ ├── sw-toolbox.js │ │ └── tokeninput.js │ └── vendors/ │ ├── bangumi/ │ │ ├── bangumi.css │ │ └── bangumi.js │ ├── bs-audio/ │ │ ├── audio.css │ │ └── audio.js │ ├── bs-emoji/ │ │ ├── bs-emoji.css │ │ ├── bs-emoji.js │ │ └── bs-emoji.json │ ├── douban/ │ │ ├── douban.css │ │ └── douban.js │ ├── driver.js/ │ │ └── driver.min.js.iife.js │ ├── fomantic-ui/ │ │ ├── components/ │ │ │ ├── accordion.css │ │ │ ├── accordion.js │ │ │ ├── ad.css │ │ │ ├── api.js │ │ │ ├── breadcrumb.css │ │ │ ├── button.css │ │ │ ├── calendar.css │ │ │ ├── calendar.js │ │ │ ├── card.css │ │ │ ├── checkbox.css │ │ │ ├── checkbox.js │ │ │ ├── comment.css │ │ │ ├── container.css │ │ │ ├── dimmer.css │ │ │ ├── dimmer.js │ │ │ ├── divider.css │ │ │ ├── dropdown.css │ │ │ ├── dropdown.js │ │ │ ├── embed.css │ │ │ ├── embed.js │ │ │ ├── emoji.css │ │ │ ├── feed.css │ │ │ ├── flag.css │ │ │ ├── flyout.css │ │ │ ├── flyout.js │ │ │ ├── form.css │ │ │ ├── form.js │ │ │ ├── grid.css │ │ │ ├── header.css │ │ │ ├── icon.css │ │ │ ├── image.css │ │ │ ├── input.css │ │ │ ├── item.css │ │ │ ├── label.css │ │ │ ├── list.css │ │ │ ├── loader.css │ │ │ ├── menu.css │ │ │ ├── message.css │ │ │ ├── modal.css │ │ │ ├── modal.js │ │ │ ├── nag.css │ │ │ ├── nag.js │ │ │ ├── placeholder.css │ │ │ ├── popup.css │ │ │ ├── popup.js │ │ │ ├── progress.css │ │ │ ├── progress.js │ │ │ ├── rail.css │ │ │ ├── rating.css │ │ │ ├── rating.js │ │ │ ├── reset.css │ │ │ ├── reveal.css │ │ │ ├── search.css │ │ │ ├── search.js │ │ │ ├── segment.css │ │ │ ├── shape.css │ │ │ ├── shape.js │ │ │ ├── sidebar.css │ │ │ ├── sidebar.js │ │ │ ├── site.css │ │ │ ├── site.js │ │ │ ├── slider.css │ │ │ ├── slider.js │ │ │ ├── state.js │ │ │ ├── statistic.css │ │ │ ├── step.css │ │ │ ├── sticky.css │ │ │ ├── sticky.js │ │ │ ├── tab.css │ │ │ ├── tab.js │ │ │ ├── table.css │ │ │ ├── text.css │ │ │ ├── toast.css │ │ │ ├── toast.js │ │ │ ├── transition.css │ │ │ ├── transition.js │ │ │ └── visibility.js │ │ └── themes/ │ │ ├── basic/ │ │ │ └── assets/ │ │ │ └── fonts/ │ │ │ └── LICENSE.txt │ │ ├── default/ │ │ │ └── assets/ │ │ │ └── fonts/ │ │ │ ├── LICENSE_Lato.txt │ │ │ └── LICENSE_icons.txt │ │ ├── github/ │ │ │ └── assets/ │ │ │ └── fonts/ │ │ │ └── LICENSE.txt │ │ └── material/ │ │ └── assets/ │ │ └── fonts/ │ │ └── LICENSE.txt │ ├── friendcircle/ │ │ ├── Moxie.swf │ │ ├── amrParse.js │ │ ├── friendcircle.css │ │ ├── moxie.js │ │ └── plupload.js │ ├── layer/ │ │ └── theme/ │ │ ├── default/ │ │ │ └── layer.css │ │ └── moon/ │ │ └── style.css │ ├── mathjax-v3/ │ │ ├── output/ │ │ │ ├── chtml/ │ │ │ │ └── fonts/ │ │ │ │ └── tex.js │ │ │ ├── chtml.js │ │ │ ├── svg/ │ │ │ │ └── fonts/ │ │ │ │ └── tex.js │ │ │ └── svg.js │ │ └── tex-chtml.js │ ├── mp3/ │ │ └── load-mp3.js │ ├── player/ │ │ └── load-player.js │ ├── translate/ │ │ └── translate.js │ └── watermark/ │ └── watermark.js ├── comments.php ├── compoment/ │ ├── foot.php │ ├── head.php │ └── sidebar.php ├── core/ │ ├── assetsdir.php │ ├── compresshtml.php │ ├── curl.php │ ├── extend/ │ │ ├── ChinesePinyin.class.php │ │ ├── Comments.php │ │ ├── Comments_n.php │ │ ├── FriendCircle.php │ │ ├── FriendCircle_n.php │ │ ├── UserAgent.class.php │ │ ├── get_browser.php │ │ ├── get_os.php │ │ ├── otherFunc.php │ │ ├── pinyin.lang │ │ └── vendor/ │ │ ├── autoload_538.php │ │ ├── composer/ │ │ │ ├── ClassLoader.php │ │ │ ├── InstalledVersions.php │ │ │ ├── LICENSE │ │ │ ├── autoload_classmap.php │ │ │ ├── autoload_namespaces.php │ │ │ ├── autoload_psr4.php │ │ │ ├── autoload_real_538.php │ │ │ ├── autoload_static.php │ │ │ ├── installed.json │ │ │ ├── installed.php │ │ │ └── platform_check.php │ │ └── maxmind-db/ │ │ └── reader/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── autoload.php │ │ ├── composer.json │ │ ├── ext/ │ │ │ ├── config.m4 │ │ │ ├── config.w32 │ │ │ ├── maxminddb.c │ │ │ ├── php_maxminddb.h │ │ │ └── tests/ │ │ │ ├── 001-load.phpt │ │ │ ├── 002-final.phpt │ │ │ └── 003-open-basedir.phpt │ │ ├── package.xml │ │ └── src/ │ │ └── MaxMind/ │ │ └── Db/ │ │ ├── Reader/ │ │ │ ├── Decoder.php │ │ │ ├── InvalidDatabaseException.php │ │ │ ├── Metadata.php │ │ │ └── Util.php │ │ └── Reader.php │ ├── func.php │ ├── general.php │ ├── getcheck.php │ ├── gravatar.php │ ├── parse.php │ ├── replyview.php │ ├── tongji.php │ ├── usercenter.php │ └── widget/ │ ├── Dom.php │ ├── UserAction.php │ ├── aiTools.php │ ├── bsBackendAction.php │ ├── bsajax.php │ ├── circleAction.php │ ├── commentlike.php │ ├── cron.php │ ├── encrypt.php │ ├── friendlink.php │ ├── friendlinkAction.php │ ├── friendlinkData.php │ ├── getBangumi.php │ ├── getCommentAction.php │ ├── getDouban.php │ ├── getEmaction.php │ ├── getEmoji.php │ ├── getLogin.php │ ├── getLoginAction.php │ ├── getMemosAction.php │ ├── getPosterInfo.php │ ├── getTags.php │ ├── getUsers.php │ ├── getarticle.php │ ├── getgithub.php │ ├── getsign.php │ ├── pageContent.php │ ├── postlike.php │ ├── safeRedirection.php │ ├── syncData.php │ ├── usernotify.php │ ├── wechatServer/ │ │ ├── Config.php │ │ ├── ImgCompress.php │ │ ├── WechatUtils.php │ │ ├── bearWechatHandler.php │ │ ├── vendor/ │ │ │ ├── autoload.php │ │ │ ├── composer/ │ │ │ │ ├── ClassLoader.php │ │ │ │ ├── InstalledVersions.php │ │ │ │ ├── LICENSE │ │ │ │ ├── autoload_classmap.php │ │ │ │ ├── autoload_files.php │ │ │ │ ├── autoload_namespaces.php │ │ │ │ ├── autoload_psr4.php │ │ │ │ ├── autoload_real.php │ │ │ │ ├── autoload_static.php │ │ │ │ ├── installed.json │ │ │ │ ├── installed.php │ │ │ │ └── platform_check.php │ │ │ ├── easywechat-composer/ │ │ │ │ └── easywechat-composer/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .php_cs │ │ │ │ ├── .travis.yml │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ ├── phpunit.xml │ │ │ │ ├── src/ │ │ │ │ │ ├── Commands/ │ │ │ │ │ │ ├── ExtensionsCommand.php │ │ │ │ │ │ └── Provider.php │ │ │ │ │ ├── Contracts/ │ │ │ │ │ │ └── Encrypter.php │ │ │ │ │ ├── Delegation/ │ │ │ │ │ │ ├── DelegationOptions.php │ │ │ │ │ │ ├── DelegationTo.php │ │ │ │ │ │ └── Hydrate.php │ │ │ │ │ ├── EasyWeChat.php │ │ │ │ │ ├── Encryption/ │ │ │ │ │ │ └── DefaultEncrypter.php │ │ │ │ │ ├── Exceptions/ │ │ │ │ │ │ ├── DecryptException.php │ │ │ │ │ │ ├── DelegationException.php │ │ │ │ │ │ └── EncryptException.php │ │ │ │ │ ├── Extension.php │ │ │ │ │ ├── Http/ │ │ │ │ │ │ ├── DelegationResponse.php │ │ │ │ │ │ └── Response.php │ │ │ │ │ ├── Laravel/ │ │ │ │ │ │ ├── Http/ │ │ │ │ │ │ │ └── Controllers/ │ │ │ │ │ │ │ └── DelegatesController.php │ │ │ │ │ │ ├── ServiceProvider.php │ │ │ │ │ │ ├── config.php │ │ │ │ │ │ └── routes.php │ │ │ │ │ ├── ManifestManager.php │ │ │ │ │ ├── Plugin.php │ │ │ │ │ └── Traits/ │ │ │ │ │ ├── MakesHttpRequests.php │ │ │ │ │ └── WithAggregator.php │ │ │ │ └── tests/ │ │ │ │ └── ManifestManagerTest.php │ │ │ ├── guzzlehttp/ │ │ │ │ ├── guzzle/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── UPGRADING.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── BodySummarizer.php │ │ │ │ │ ├── BodySummarizerInterface.php │ │ │ │ │ ├── Client.php │ │ │ │ │ ├── ClientInterface.php │ │ │ │ │ ├── ClientTrait.php │ │ │ │ │ ├── Cookie/ │ │ │ │ │ │ ├── CookieJar.php │ │ │ │ │ │ ├── CookieJarInterface.php │ │ │ │ │ │ ├── FileCookieJar.php │ │ │ │ │ │ ├── SessionCookieJar.php │ │ │ │ │ │ └── SetCookie.php │ │ │ │ │ ├── Exception/ │ │ │ │ │ │ ├── BadResponseException.php │ │ │ │ │ │ ├── ClientException.php │ │ │ │ │ │ ├── ConnectException.php │ │ │ │ │ │ ├── GuzzleException.php │ │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ │ ├── RequestException.php │ │ │ │ │ │ ├── ServerException.php │ │ │ │ │ │ ├── TooManyRedirectsException.php │ │ │ │ │ │ └── TransferException.php │ │ │ │ │ ├── Handler/ │ │ │ │ │ │ ├── CurlFactory.php │ │ │ │ │ │ ├── CurlFactoryInterface.php │ │ │ │ │ │ ├── CurlHandler.php │ │ │ │ │ │ ├── CurlMultiHandler.php │ │ │ │ │ │ ├── EasyHandle.php │ │ │ │ │ │ ├── HeaderProcessor.php │ │ │ │ │ │ ├── MockHandler.php │ │ │ │ │ │ ├── Proxy.php │ │ │ │ │ │ └── StreamHandler.php │ │ │ │ │ ├── HandlerStack.php │ │ │ │ │ ├── MessageFormatter.php │ │ │ │ │ ├── MessageFormatterInterface.php │ │ │ │ │ ├── Middleware.php │ │ │ │ │ ├── Pool.php │ │ │ │ │ ├── PrepareBodyMiddleware.php │ │ │ │ │ ├── RedirectMiddleware.php │ │ │ │ │ ├── RequestOptions.php │ │ │ │ │ ├── RetryMiddleware.php │ │ │ │ │ ├── TransferStats.php │ │ │ │ │ ├── Utils.php │ │ │ │ │ ├── functions.php │ │ │ │ │ └── functions_include.php │ │ │ │ ├── promises/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── AggregateException.php │ │ │ │ │ ├── CancellationException.php │ │ │ │ │ ├── Coroutine.php │ │ │ │ │ ├── Create.php │ │ │ │ │ ├── Each.php │ │ │ │ │ ├── EachPromise.php │ │ │ │ │ ├── FulfilledPromise.php │ │ │ │ │ ├── Is.php │ │ │ │ │ ├── Promise.php │ │ │ │ │ ├── PromiseInterface.php │ │ │ │ │ ├── PromisorInterface.php │ │ │ │ │ ├── RejectedPromise.php │ │ │ │ │ ├── RejectionException.php │ │ │ │ │ ├── TaskQueue.php │ │ │ │ │ ├── TaskQueueInterface.php │ │ │ │ │ └── Utils.php │ │ │ │ └── psr7/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── AppendStream.php │ │ │ │ ├── BufferStream.php │ │ │ │ ├── CachingStream.php │ │ │ │ ├── DroppingStream.php │ │ │ │ ├── Exception/ │ │ │ │ │ └── MalformedUriException.php │ │ │ │ ├── FnStream.php │ │ │ │ ├── Header.php │ │ │ │ ├── HttpFactory.php │ │ │ │ ├── InflateStream.php │ │ │ │ ├── LazyOpenStream.php │ │ │ │ ├── LimitStream.php │ │ │ │ ├── Message.php │ │ │ │ ├── MessageTrait.php │ │ │ │ ├── MimeType.php │ │ │ │ ├── MultipartStream.php │ │ │ │ ├── NoSeekStream.php │ │ │ │ ├── PumpStream.php │ │ │ │ ├── Query.php │ │ │ │ ├── Request.php │ │ │ │ ├── Response.php │ │ │ │ ├── Rfc7230.php │ │ │ │ ├── ServerRequest.php │ │ │ │ ├── Stream.php │ │ │ │ ├── StreamDecoratorTrait.php │ │ │ │ ├── StreamWrapper.php │ │ │ │ ├── UploadedFile.php │ │ │ │ ├── Uri.php │ │ │ │ ├── UriComparator.php │ │ │ │ ├── UriNormalizer.php │ │ │ │ ├── UriResolver.php │ │ │ │ └── Utils.php │ │ │ ├── monolog/ │ │ │ │ └── monolog/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ └── Monolog/ │ │ │ │ ├── Attribute/ │ │ │ │ │ ├── AsMonologProcessor.php │ │ │ │ │ └── WithMonologChannel.php │ │ │ │ ├── DateTimeImmutable.php │ │ │ │ ├── ErrorHandler.php │ │ │ │ ├── Formatter/ │ │ │ │ │ ├── ChromePHPFormatter.php │ │ │ │ │ ├── ElasticaFormatter.php │ │ │ │ │ ├── ElasticsearchFormatter.php │ │ │ │ │ ├── FlowdockFormatter.php │ │ │ │ │ ├── FluentdFormatter.php │ │ │ │ │ ├── FormatterInterface.php │ │ │ │ │ ├── GelfMessageFormatter.php │ │ │ │ │ ├── GoogleCloudLoggingFormatter.php │ │ │ │ │ ├── HtmlFormatter.php │ │ │ │ │ ├── JsonFormatter.php │ │ │ │ │ ├── LineFormatter.php │ │ │ │ │ ├── LogglyFormatter.php │ │ │ │ │ ├── LogmaticFormatter.php │ │ │ │ │ ├── LogstashFormatter.php │ │ │ │ │ ├── MongoDBFormatter.php │ │ │ │ │ ├── NormalizerFormatter.php │ │ │ │ │ ├── ScalarFormatter.php │ │ │ │ │ ├── SyslogFormatter.php │ │ │ │ │ └── WildfireFormatter.php │ │ │ │ ├── Handler/ │ │ │ │ │ ├── AbstractHandler.php │ │ │ │ │ ├── AbstractProcessingHandler.php │ │ │ │ │ ├── AbstractSyslogHandler.php │ │ │ │ │ ├── AmqpHandler.php │ │ │ │ │ ├── BrowserConsoleHandler.php │ │ │ │ │ ├── BufferHandler.php │ │ │ │ │ ├── ChromePHPHandler.php │ │ │ │ │ ├── CouchDBHandler.php │ │ │ │ │ ├── CubeHandler.php │ │ │ │ │ ├── Curl/ │ │ │ │ │ │ └── Util.php │ │ │ │ │ ├── DeduplicationHandler.php │ │ │ │ │ ├── DoctrineCouchDBHandler.php │ │ │ │ │ ├── DynamoDbHandler.php │ │ │ │ │ ├── ElasticaHandler.php │ │ │ │ │ ├── ElasticsearchHandler.php │ │ │ │ │ ├── ErrorLogHandler.php │ │ │ │ │ ├── FallbackGroupHandler.php │ │ │ │ │ ├── FilterHandler.php │ │ │ │ │ ├── FingersCrossed/ │ │ │ │ │ │ ├── ActivationStrategyInterface.php │ │ │ │ │ │ ├── ChannelLevelActivationStrategy.php │ │ │ │ │ │ └── ErrorLevelActivationStrategy.php │ │ │ │ │ ├── FingersCrossedHandler.php │ │ │ │ │ ├── FirePHPHandler.php │ │ │ │ │ ├── FleepHookHandler.php │ │ │ │ │ ├── FlowdockHandler.php │ │ │ │ │ ├── FormattableHandlerInterface.php │ │ │ │ │ ├── FormattableHandlerTrait.php │ │ │ │ │ ├── GelfHandler.php │ │ │ │ │ ├── GroupHandler.php │ │ │ │ │ ├── Handler.php │ │ │ │ │ ├── HandlerInterface.php │ │ │ │ │ ├── HandlerWrapper.php │ │ │ │ │ ├── IFTTTHandler.php │ │ │ │ │ ├── InsightOpsHandler.php │ │ │ │ │ ├── LogEntriesHandler.php │ │ │ │ │ ├── LogglyHandler.php │ │ │ │ │ ├── LogmaticHandler.php │ │ │ │ │ ├── MailHandler.php │ │ │ │ │ ├── MandrillHandler.php │ │ │ │ │ ├── MissingExtensionException.php │ │ │ │ │ ├── MongoDBHandler.php │ │ │ │ │ ├── NativeMailerHandler.php │ │ │ │ │ ├── NewRelicHandler.php │ │ │ │ │ ├── NoopHandler.php │ │ │ │ │ ├── NullHandler.php │ │ │ │ │ ├── OverflowHandler.php │ │ │ │ │ ├── PHPConsoleHandler.php │ │ │ │ │ ├── ProcessHandler.php │ │ │ │ │ ├── ProcessableHandlerInterface.php │ │ │ │ │ ├── ProcessableHandlerTrait.php │ │ │ │ │ ├── PsrHandler.php │ │ │ │ │ ├── PushoverHandler.php │ │ │ │ │ ├── RedisHandler.php │ │ │ │ │ ├── RedisPubSubHandler.php │ │ │ │ │ ├── RollbarHandler.php │ │ │ │ │ ├── RotatingFileHandler.php │ │ │ │ │ ├── SamplingHandler.php │ │ │ │ │ ├── SendGridHandler.php │ │ │ │ │ ├── Slack/ │ │ │ │ │ │ └── SlackRecord.php │ │ │ │ │ ├── SlackHandler.php │ │ │ │ │ ├── SlackWebhookHandler.php │ │ │ │ │ ├── SocketHandler.php │ │ │ │ │ ├── SqsHandler.php │ │ │ │ │ ├── StreamHandler.php │ │ │ │ │ ├── SymfonyMailerHandler.php │ │ │ │ │ ├── SyslogHandler.php │ │ │ │ │ ├── SyslogUdp/ │ │ │ │ │ │ └── UdpSocket.php │ │ │ │ │ ├── SyslogUdpHandler.php │ │ │ │ │ ├── TelegramBotHandler.php │ │ │ │ │ ├── TestHandler.php │ │ │ │ │ ├── WebRequestRecognizerTrait.php │ │ │ │ │ ├── WhatFailureGroupHandler.php │ │ │ │ │ └── ZendMonitorHandler.php │ │ │ │ ├── Level.php │ │ │ │ ├── LogRecord.php │ │ │ │ ├── Logger.php │ │ │ │ ├── Processor/ │ │ │ │ │ ├── ClosureContextProcessor.php │ │ │ │ │ ├── GitProcessor.php │ │ │ │ │ ├── HostnameProcessor.php │ │ │ │ │ ├── IntrospectionProcessor.php │ │ │ │ │ ├── LoadAverageProcessor.php │ │ │ │ │ ├── MemoryPeakUsageProcessor.php │ │ │ │ │ ├── MemoryProcessor.php │ │ │ │ │ ├── MemoryUsageProcessor.php │ │ │ │ │ ├── MercurialProcessor.php │ │ │ │ │ ├── ProcessIdProcessor.php │ │ │ │ │ ├── ProcessorInterface.php │ │ │ │ │ ├── PsrLogMessageProcessor.php │ │ │ │ │ ├── TagProcessor.php │ │ │ │ │ ├── UidProcessor.php │ │ │ │ │ └── WebProcessor.php │ │ │ │ ├── Registry.php │ │ │ │ ├── ResettableInterface.php │ │ │ │ ├── SignalHandler.php │ │ │ │ ├── Test/ │ │ │ │ │ └── TestCase.php │ │ │ │ └── Utils.php │ │ │ ├── overtrue/ │ │ │ │ └── socialite/ │ │ │ │ ├── .github/ │ │ │ │ │ ├── FUNDING.yml │ │ │ │ │ ├── dependabot.yml │ │ │ │ │ └── workflows/ │ │ │ │ │ ├── lint.yml │ │ │ │ │ └── test.yml │ │ │ │ ├── .gitignore │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── README_EN.md │ │ │ │ ├── composer.json │ │ │ │ ├── phpstan.neon.dist │ │ │ │ ├── phpunit.xml │ │ │ │ ├── src/ │ │ │ │ │ ├── Config.php │ │ │ │ │ ├── Contracts/ │ │ │ │ │ │ ├── FactoryInterface.php │ │ │ │ │ │ ├── ProviderInterface.php │ │ │ │ │ │ └── UserInterface.php │ │ │ │ │ ├── Exceptions/ │ │ │ │ │ │ ├── AuthorizeFailedException.php │ │ │ │ │ │ ├── BadRequestException.php │ │ │ │ │ │ ├── Exception.php │ │ │ │ │ │ ├── FeiShu/ │ │ │ │ │ │ │ └── InvalidTicketException.php │ │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ │ ├── InvalidTokenException.php │ │ │ │ │ │ └── MethodDoesNotSupportException.php │ │ │ │ │ ├── Providers/ │ │ │ │ │ │ ├── Alipay.php │ │ │ │ │ │ ├── Azure.php │ │ │ │ │ │ ├── Baidu.php │ │ │ │ │ │ ├── Base.php │ │ │ │ │ │ ├── Coding.php │ │ │ │ │ │ ├── DingTalk.php │ │ │ │ │ │ ├── DouYin.php │ │ │ │ │ │ ├── Douban.php │ │ │ │ │ │ ├── Facebook.php │ │ │ │ │ │ ├── FeiShu.php │ │ │ │ │ │ ├── Figma.php │ │ │ │ │ │ ├── GitHub.php │ │ │ │ │ │ ├── Gitee.php │ │ │ │ │ │ ├── Google.php │ │ │ │ │ │ ├── Lark.php │ │ │ │ │ │ ├── Line.php │ │ │ │ │ │ ├── Linkedin.php │ │ │ │ │ │ ├── OpenWeWork.php │ │ │ │ │ │ ├── Outlook.php │ │ │ │ │ │ ├── QCloud.php │ │ │ │ │ │ ├── QQ.php │ │ │ │ │ │ ├── Taobao.php │ │ │ │ │ │ ├── Tapd.php │ │ │ │ │ │ ├── TouTiao.php │ │ │ │ │ │ ├── WeChat.php │ │ │ │ │ │ ├── WeWork.php │ │ │ │ │ │ ├── Weibo.php │ │ │ │ │ │ └── XiGua.php │ │ │ │ │ ├── SocialiteManager.php │ │ │ │ │ ├── Traits/ │ │ │ │ │ │ └── HasAttributes.php │ │ │ │ │ └── User.php │ │ │ │ └── tests/ │ │ │ │ ├── OAuthTest.php │ │ │ │ ├── Providers/ │ │ │ │ │ ├── FeiShuTest.php │ │ │ │ │ ├── WeWorkTest.php │ │ │ │ │ └── WechatTest.php │ │ │ │ ├── SocialiteManagerTest.php │ │ │ │ └── UserTest.php │ │ │ ├── pimple/ │ │ │ │ └── pimple/ │ │ │ │ ├── .github/ │ │ │ │ │ └── workflows/ │ │ │ │ │ └── tests.yml │ │ │ │ ├── .gitignore │ │ │ │ ├── .php_cs.dist │ │ │ │ ├── CHANGELOG │ │ │ │ ├── LICENSE │ │ │ │ ├── README.rst │ │ │ │ ├── composer.json │ │ │ │ ├── phpunit.xml.dist │ │ │ │ └── src/ │ │ │ │ └── Pimple/ │ │ │ │ ├── Container.php │ │ │ │ ├── Exception/ │ │ │ │ │ ├── ExpectedInvokableException.php │ │ │ │ │ ├── FrozenServiceException.php │ │ │ │ │ ├── InvalidServiceIdentifierException.php │ │ │ │ │ └── UnknownIdentifierException.php │ │ │ │ ├── Psr11/ │ │ │ │ │ ├── Container.php │ │ │ │ │ └── ServiceLocator.php │ │ │ │ ├── ServiceIterator.php │ │ │ │ ├── ServiceProviderInterface.php │ │ │ │ └── Tests/ │ │ │ │ ├── Fixtures/ │ │ │ │ │ ├── Invokable.php │ │ │ │ │ ├── NonInvokable.php │ │ │ │ │ ├── PimpleServiceProvider.php │ │ │ │ │ └── Service.php │ │ │ │ ├── PimpleServiceProviderInterfaceTest.php │ │ │ │ ├── PimpleTest.php │ │ │ │ ├── Psr11/ │ │ │ │ │ ├── ContainerTest.php │ │ │ │ │ └── ServiceLocatorTest.php │ │ │ │ └── ServiceIteratorTest.php │ │ │ ├── psr/ │ │ │ │ ├── cache/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── CacheException.php │ │ │ │ │ ├── CacheItemInterface.php │ │ │ │ │ ├── CacheItemPoolInterface.php │ │ │ │ │ └── InvalidArgumentException.php │ │ │ │ ├── container/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── ContainerExceptionInterface.php │ │ │ │ │ ├── ContainerInterface.php │ │ │ │ │ └── NotFoundExceptionInterface.php │ │ │ │ ├── event-dispatcher/ │ │ │ │ │ ├── .editorconfig │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── EventDispatcherInterface.php │ │ │ │ │ ├── ListenerProviderInterface.php │ │ │ │ │ └── StoppableEventInterface.php │ │ │ │ ├── http-client/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── ClientExceptionInterface.php │ │ │ │ │ ├── ClientInterface.php │ │ │ │ │ ├── NetworkExceptionInterface.php │ │ │ │ │ └── RequestExceptionInterface.php │ │ │ │ ├── http-factory/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── RequestFactoryInterface.php │ │ │ │ │ ├── ResponseFactoryInterface.php │ │ │ │ │ ├── ServerRequestFactoryInterface.php │ │ │ │ │ ├── StreamFactoryInterface.php │ │ │ │ │ ├── UploadedFileFactoryInterface.php │ │ │ │ │ └── UriFactoryInterface.php │ │ │ │ ├── http-message/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ ├── docs/ │ │ │ │ │ │ ├── PSR7-Interfaces.md │ │ │ │ │ │ └── PSR7-Usage.md │ │ │ │ │ └── src/ │ │ │ │ │ ├── MessageInterface.php │ │ │ │ │ ├── RequestInterface.php │ │ │ │ │ ├── ResponseInterface.php │ │ │ │ │ ├── ServerRequestInterface.php │ │ │ │ │ ├── StreamInterface.php │ │ │ │ │ ├── UploadedFileInterface.php │ │ │ │ │ └── UriInterface.php │ │ │ │ ├── log/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── AbstractLogger.php │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ ├── LogLevel.php │ │ │ │ │ ├── LoggerAwareInterface.php │ │ │ │ │ ├── LoggerAwareTrait.php │ │ │ │ │ ├── LoggerInterface.php │ │ │ │ │ ├── LoggerTrait.php │ │ │ │ │ └── NullLogger.php │ │ │ │ └── simple-cache/ │ │ │ │ ├── .editorconfig │ │ │ │ ├── LICENSE.md │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── CacheException.php │ │ │ │ ├── CacheInterface.php │ │ │ │ └── InvalidArgumentException.php │ │ │ ├── ralouphie/ │ │ │ │ └── getallheaders/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ └── getallheaders.php │ │ │ ├── symfony/ │ │ │ │ ├── cache/ │ │ │ │ │ ├── Adapter/ │ │ │ │ │ │ ├── AbstractAdapter.php │ │ │ │ │ │ ├── AbstractTagAwareAdapter.php │ │ │ │ │ │ ├── AdapterInterface.php │ │ │ │ │ │ ├── ApcuAdapter.php │ │ │ │ │ │ ├── ArrayAdapter.php │ │ │ │ │ │ ├── ChainAdapter.php │ │ │ │ │ │ ├── CouchbaseBucketAdapter.php │ │ │ │ │ │ ├── CouchbaseCollectionAdapter.php │ │ │ │ │ │ ├── DoctrineDbalAdapter.php │ │ │ │ │ │ ├── FilesystemAdapter.php │ │ │ │ │ │ ├── FilesystemTagAwareAdapter.php │ │ │ │ │ │ ├── MemcachedAdapter.php │ │ │ │ │ │ ├── NullAdapter.php │ │ │ │ │ │ ├── ParameterNormalizer.php │ │ │ │ │ │ ├── PdoAdapter.php │ │ │ │ │ │ ├── PhpArrayAdapter.php │ │ │ │ │ │ ├── PhpFilesAdapter.php │ │ │ │ │ │ ├── ProxyAdapter.php │ │ │ │ │ │ ├── Psr16Adapter.php │ │ │ │ │ │ ├── RedisAdapter.php │ │ │ │ │ │ ├── RedisTagAwareAdapter.php │ │ │ │ │ │ ├── TagAwareAdapter.php │ │ │ │ │ │ ├── TagAwareAdapterInterface.php │ │ │ │ │ │ ├── TraceableAdapter.php │ │ │ │ │ │ └── TraceableTagAwareAdapter.php │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── CacheItem.php │ │ │ │ │ ├── DataCollector/ │ │ │ │ │ │ └── CacheDataCollector.php │ │ │ │ │ ├── DependencyInjection/ │ │ │ │ │ │ ├── CacheCollectorPass.php │ │ │ │ │ │ ├── CachePoolClearerPass.php │ │ │ │ │ │ ├── CachePoolPass.php │ │ │ │ │ │ └── CachePoolPrunerPass.php │ │ │ │ │ ├── Exception/ │ │ │ │ │ │ ├── CacheException.php │ │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ │ └── LogicException.php │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── LockRegistry.php │ │ │ │ │ ├── Marshaller/ │ │ │ │ │ │ ├── DefaultMarshaller.php │ │ │ │ │ │ ├── DeflateMarshaller.php │ │ │ │ │ │ ├── MarshallerInterface.php │ │ │ │ │ │ ├── SodiumMarshaller.php │ │ │ │ │ │ └── TagAwareMarshaller.php │ │ │ │ │ ├── Messenger/ │ │ │ │ │ │ ├── EarlyExpirationDispatcher.php │ │ │ │ │ │ ├── EarlyExpirationHandler.php │ │ │ │ │ │ └── EarlyExpirationMessage.php │ │ │ │ │ ├── PruneableInterface.php │ │ │ │ │ ├── Psr16Cache.php │ │ │ │ │ ├── README.md │ │ │ │ │ ├── ResettableInterface.php │ │ │ │ │ ├── Traits/ │ │ │ │ │ │ ├── AbstractAdapterTrait.php │ │ │ │ │ │ ├── ContractsTrait.php │ │ │ │ │ │ ├── FilesystemCommonTrait.php │ │ │ │ │ │ ├── FilesystemTrait.php │ │ │ │ │ │ ├── ProxyTrait.php │ │ │ │ │ │ ├── Redis5Proxy.php │ │ │ │ │ │ ├── Redis6Proxy.php │ │ │ │ │ │ ├── RedisCluster5Proxy.php │ │ │ │ │ │ ├── RedisCluster6Proxy.php │ │ │ │ │ │ ├── RedisClusterNodeProxy.php │ │ │ │ │ │ ├── RedisClusterProxy.php │ │ │ │ │ │ ├── RedisProxy.php │ │ │ │ │ │ ├── RedisTrait.php │ │ │ │ │ │ ├── RelayProxy.php │ │ │ │ │ │ └── ValueWrapper.php │ │ │ │ │ └── composer.json │ │ │ │ ├── cache-contracts/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── CacheInterface.php │ │ │ │ │ ├── CacheTrait.php │ │ │ │ │ ├── CallbackInterface.php │ │ │ │ │ ├── ItemInterface.php │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── TagAwareCacheInterface.php │ │ │ │ │ └── composer.json │ │ │ │ ├── deprecation-contracts/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── composer.json │ │ │ │ │ └── function.php │ │ │ │ ├── event-dispatcher/ │ │ │ │ │ ├── Attribute/ │ │ │ │ │ │ └── AsEventListener.php │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── Debug/ │ │ │ │ │ │ ├── TraceableEventDispatcher.php │ │ │ │ │ │ └── WrappedListener.php │ │ │ │ │ ├── DependencyInjection/ │ │ │ │ │ │ ├── AddEventAliasesPass.php │ │ │ │ │ │ └── RegisterListenersPass.php │ │ │ │ │ ├── EventDispatcher.php │ │ │ │ │ ├── EventDispatcherInterface.php │ │ │ │ │ ├── EventSubscriberInterface.php │ │ │ │ │ ├── GenericEvent.php │ │ │ │ │ ├── ImmutableEventDispatcher.php │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ └── composer.json │ │ │ │ ├── event-dispatcher-contracts/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── Event.php │ │ │ │ │ ├── EventDispatcherInterface.php │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ └── composer.json │ │ │ │ ├── http-foundation/ │ │ │ │ │ ├── AcceptHeader.php │ │ │ │ │ ├── AcceptHeaderItem.php │ │ │ │ │ ├── BinaryFileResponse.php │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── ChainRequestMatcher.php │ │ │ │ │ ├── Cookie.php │ │ │ │ │ ├── Exception/ │ │ │ │ │ │ ├── BadRequestException.php │ │ │ │ │ │ ├── ConflictingHeadersException.php │ │ │ │ │ │ ├── JsonException.php │ │ │ │ │ │ ├── RequestExceptionInterface.php │ │ │ │ │ │ ├── SessionNotFoundException.php │ │ │ │ │ │ ├── SuspiciousOperationException.php │ │ │ │ │ │ └── UnexpectedValueException.php │ │ │ │ │ ├── ExpressionRequestMatcher.php │ │ │ │ │ ├── File/ │ │ │ │ │ │ ├── Exception/ │ │ │ │ │ │ │ ├── AccessDeniedException.php │ │ │ │ │ │ │ ├── CannotWriteFileException.php │ │ │ │ │ │ │ ├── ExtensionFileException.php │ │ │ │ │ │ │ ├── FileException.php │ │ │ │ │ │ │ ├── FileNotFoundException.php │ │ │ │ │ │ │ ├── FormSizeFileException.php │ │ │ │ │ │ │ ├── IniSizeFileException.php │ │ │ │ │ │ │ ├── NoFileException.php │ │ │ │ │ │ │ ├── NoTmpDirFileException.php │ │ │ │ │ │ │ ├── PartialFileException.php │ │ │ │ │ │ │ ├── UnexpectedTypeException.php │ │ │ │ │ │ │ └── UploadException.php │ │ │ │ │ │ ├── File.php │ │ │ │ │ │ ├── Stream.php │ │ │ │ │ │ └── UploadedFile.php │ │ │ │ │ ├── FileBag.php │ │ │ │ │ ├── HeaderBag.php │ │ │ │ │ ├── HeaderUtils.php │ │ │ │ │ ├── InputBag.php │ │ │ │ │ ├── IpUtils.php │ │ │ │ │ ├── JsonResponse.php │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── ParameterBag.php │ │ │ │ │ ├── README.md │ │ │ │ │ ├── RateLimiter/ │ │ │ │ │ │ ├── AbstractRequestRateLimiter.php │ │ │ │ │ │ ├── PeekableRequestRateLimiterInterface.php │ │ │ │ │ │ └── RequestRateLimiterInterface.php │ │ │ │ │ ├── RedirectResponse.php │ │ │ │ │ ├── Request.php │ │ │ │ │ ├── RequestMatcher/ │ │ │ │ │ │ ├── AttributesRequestMatcher.php │ │ │ │ │ │ ├── ExpressionRequestMatcher.php │ │ │ │ │ │ ├── HostRequestMatcher.php │ │ │ │ │ │ ├── IpsRequestMatcher.php │ │ │ │ │ │ ├── IsJsonRequestMatcher.php │ │ │ │ │ │ ├── MethodRequestMatcher.php │ │ │ │ │ │ ├── PathRequestMatcher.php │ │ │ │ │ │ ├── PortRequestMatcher.php │ │ │ │ │ │ └── SchemeRequestMatcher.php │ │ │ │ │ ├── RequestMatcher.php │ │ │ │ │ ├── RequestMatcherInterface.php │ │ │ │ │ ├── RequestStack.php │ │ │ │ │ ├── Response.php │ │ │ │ │ ├── ResponseHeaderBag.php │ │ │ │ │ ├── ServerBag.php │ │ │ │ │ ├── Session/ │ │ │ │ │ │ ├── Attribute/ │ │ │ │ │ │ │ ├── AttributeBag.php │ │ │ │ │ │ │ └── AttributeBagInterface.php │ │ │ │ │ │ ├── Flash/ │ │ │ │ │ │ │ ├── AutoExpireFlashBag.php │ │ │ │ │ │ │ ├── FlashBag.php │ │ │ │ │ │ │ └── FlashBagInterface.php │ │ │ │ │ │ ├── FlashBagAwareSessionInterface.php │ │ │ │ │ │ ├── Session.php │ │ │ │ │ │ ├── SessionBagInterface.php │ │ │ │ │ │ ├── SessionBagProxy.php │ │ │ │ │ │ ├── SessionFactory.php │ │ │ │ │ │ ├── SessionFactoryInterface.php │ │ │ │ │ │ ├── SessionInterface.php │ │ │ │ │ │ ├── SessionUtils.php │ │ │ │ │ │ └── Storage/ │ │ │ │ │ │ ├── Handler/ │ │ │ │ │ │ │ ├── AbstractSessionHandler.php │ │ │ │ │ │ │ ├── IdentityMarshaller.php │ │ │ │ │ │ │ ├── MarshallingSessionHandler.php │ │ │ │ │ │ │ ├── MemcachedSessionHandler.php │ │ │ │ │ │ │ ├── MigratingSessionHandler.php │ │ │ │ │ │ │ ├── MongoDbSessionHandler.php │ │ │ │ │ │ │ ├── NativeFileSessionHandler.php │ │ │ │ │ │ │ ├── NullSessionHandler.php │ │ │ │ │ │ │ ├── PdoSessionHandler.php │ │ │ │ │ │ │ ├── RedisSessionHandler.php │ │ │ │ │ │ │ ├── SessionHandlerFactory.php │ │ │ │ │ │ │ └── StrictSessionHandler.php │ │ │ │ │ │ ├── MetadataBag.php │ │ │ │ │ │ ├── MockArraySessionStorage.php │ │ │ │ │ │ ├── MockFileSessionStorage.php │ │ │ │ │ │ ├── MockFileSessionStorageFactory.php │ │ │ │ │ │ ├── NativeSessionStorage.php │ │ │ │ │ │ ├── NativeSessionStorageFactory.php │ │ │ │ │ │ ├── PhpBridgeSessionStorage.php │ │ │ │ │ │ ├── PhpBridgeSessionStorageFactory.php │ │ │ │ │ │ ├── Proxy/ │ │ │ │ │ │ │ ├── AbstractProxy.php │ │ │ │ │ │ │ └── SessionHandlerProxy.php │ │ │ │ │ │ ├── SessionStorageFactoryInterface.php │ │ │ │ │ │ └── SessionStorageInterface.php │ │ │ │ │ ├── StreamedJsonResponse.php │ │ │ │ │ ├── StreamedResponse.php │ │ │ │ │ ├── Test/ │ │ │ │ │ │ └── Constraint/ │ │ │ │ │ │ ├── RequestAttributeValueSame.php │ │ │ │ │ │ ├── ResponseCookieValueSame.php │ │ │ │ │ │ ├── ResponseFormatSame.php │ │ │ │ │ │ ├── ResponseHasCookie.php │ │ │ │ │ │ ├── ResponseHasHeader.php │ │ │ │ │ │ ├── ResponseHeaderLocationSame.php │ │ │ │ │ │ ├── ResponseHeaderSame.php │ │ │ │ │ │ ├── ResponseIsRedirected.php │ │ │ │ │ │ ├── ResponseIsSuccessful.php │ │ │ │ │ │ ├── ResponseIsUnprocessable.php │ │ │ │ │ │ └── ResponseStatusCodeSame.php │ │ │ │ │ ├── UriSigner.php │ │ │ │ │ ├── UrlHelper.php │ │ │ │ │ └── composer.json │ │ │ │ ├── polyfill-mbstring/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── Mbstring.php │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ └── unidata/ │ │ │ │ │ │ ├── caseFolding.php │ │ │ │ │ │ ├── lowerCase.php │ │ │ │ │ │ ├── titleCaseRegexp.php │ │ │ │ │ │ └── upperCase.php │ │ │ │ │ ├── bootstrap.php │ │ │ │ │ ├── bootstrap80.php │ │ │ │ │ └── composer.json │ │ │ │ ├── polyfill-php80/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── Php80.php │ │ │ │ │ ├── PhpToken.php │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ └── stubs/ │ │ │ │ │ │ ├── Attribute.php │ │ │ │ │ │ ├── PhpToken.php │ │ │ │ │ │ ├── Stringable.php │ │ │ │ │ │ ├── UnhandledMatchError.php │ │ │ │ │ │ └── ValueError.php │ │ │ │ │ ├── bootstrap.php │ │ │ │ │ └── composer.json │ │ │ │ ├── polyfill-php83/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── Php83.php │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ └── stubs/ │ │ │ │ │ │ ├── DateError.php │ │ │ │ │ │ ├── DateException.php │ │ │ │ │ │ ├── DateInvalidOperationException.php │ │ │ │ │ │ ├── DateInvalidTimeZoneException.php │ │ │ │ │ │ ├── DateMalformedIntervalStringException.php │ │ │ │ │ │ ├── DateMalformedPeriodStringException.php │ │ │ │ │ │ ├── DateMalformedStringException.php │ │ │ │ │ │ ├── DateObjectError.php │ │ │ │ │ │ ├── DateRangeError.php │ │ │ │ │ │ ├── Override.php │ │ │ │ │ │ └── SQLite3Exception.php │ │ │ │ │ ├── bootstrap.php │ │ │ │ │ ├── bootstrap81.php │ │ │ │ │ └── composer.json │ │ │ │ ├── psr-http-message-bridge/ │ │ │ │ │ ├── .php-cs-fixer.dist.php │ │ │ │ │ ├── ArgumentValueResolver/ │ │ │ │ │ │ ├── PsrServerRequestResolver.php │ │ │ │ │ │ └── ValueResolverInterface.php │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── EventListener/ │ │ │ │ │ │ └── PsrResponseListener.php │ │ │ │ │ ├── Factory/ │ │ │ │ │ │ ├── HttpFoundationFactory.php │ │ │ │ │ │ ├── PsrHttpFactory.php │ │ │ │ │ │ └── UploadedFile.php │ │ │ │ │ ├── HttpFoundationFactoryInterface.php │ │ │ │ │ ├── HttpMessageFactoryInterface.php │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ └── composer.json │ │ │ │ ├── service-contracts/ │ │ │ │ │ ├── Attribute/ │ │ │ │ │ │ ├── Required.php │ │ │ │ │ │ └── SubscribedService.php │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── ResetInterface.php │ │ │ │ │ ├── ServiceCollectionInterface.php │ │ │ │ │ ├── ServiceLocatorTrait.php │ │ │ │ │ ├── ServiceMethodsSubscriberTrait.php │ │ │ │ │ ├── ServiceProviderInterface.php │ │ │ │ │ ├── ServiceSubscriberInterface.php │ │ │ │ │ ├── ServiceSubscriberTrait.php │ │ │ │ │ ├── Test/ │ │ │ │ │ │ ├── ServiceLocatorTest.php │ │ │ │ │ │ └── ServiceLocatorTestCase.php │ │ │ │ │ └── composer.json │ │ │ │ └── var-exporter/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── Exception/ │ │ │ │ │ ├── ClassNotFoundException.php │ │ │ │ │ ├── ExceptionInterface.php │ │ │ │ │ ├── LogicException.php │ │ │ │ │ └── NotInstantiableTypeException.php │ │ │ │ ├── Hydrator.php │ │ │ │ ├── Instantiator.php │ │ │ │ ├── Internal/ │ │ │ │ │ ├── Exporter.php │ │ │ │ │ ├── Hydrator.php │ │ │ │ │ ├── LazyObjectRegistry.php │ │ │ │ │ ├── LazyObjectState.php │ │ │ │ │ ├── LazyObjectTrait.php │ │ │ │ │ ├── Reference.php │ │ │ │ │ ├── Registry.php │ │ │ │ │ └── Values.php │ │ │ │ ├── LICENSE │ │ │ │ ├── LazyGhostTrait.php │ │ │ │ ├── LazyObjectInterface.php │ │ │ │ ├── LazyProxyTrait.php │ │ │ │ ├── ProxyHelper.php │ │ │ │ ├── README.md │ │ │ │ ├── VarExporter.php │ │ │ │ └── composer.json │ │ │ └── w7corp/ │ │ │ └── easywechat/ │ │ │ ├── CHANGELOG.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── SECURITY.md │ │ │ ├── composer.json │ │ │ └── src/ │ │ │ ├── BasicService/ │ │ │ │ ├── Application.php │ │ │ │ ├── ContentSecurity/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Jssdk/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Media/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── QrCode/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ └── Url/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Factory.php │ │ │ ├── Kernel/ │ │ │ │ ├── AccessToken.php │ │ │ │ ├── BaseClient.php │ │ │ │ ├── Clauses/ │ │ │ │ │ └── Clause.php │ │ │ │ ├── Config.php │ │ │ │ ├── Contracts/ │ │ │ │ │ ├── AccessTokenInterface.php │ │ │ │ │ ├── Arrayable.php │ │ │ │ │ ├── EventHandlerInterface.php │ │ │ │ │ ├── MediaInterface.php │ │ │ │ │ └── MessageInterface.php │ │ │ │ ├── Decorators/ │ │ │ │ │ ├── FinallyResult.php │ │ │ │ │ └── TerminateResult.php │ │ │ │ ├── Encryptor.php │ │ │ │ ├── Events/ │ │ │ │ │ ├── AccessTokenRefreshed.php │ │ │ │ │ ├── ApplicationInitialized.php │ │ │ │ │ ├── HttpResponseCreated.php │ │ │ │ │ └── ServerGuardResponseCreated.php │ │ │ │ ├── Exceptions/ │ │ │ │ │ ├── BadRequestException.php │ │ │ │ │ ├── DecryptException.php │ │ │ │ │ ├── Exception.php │ │ │ │ │ ├── HttpException.php │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ ├── InvalidConfigException.php │ │ │ │ │ ├── RuntimeException.php │ │ │ │ │ └── UnboundServiceException.php │ │ │ │ ├── Helpers.php │ │ │ │ ├── Http/ │ │ │ │ │ ├── Response.php │ │ │ │ │ └── StreamResponse.php │ │ │ │ ├── Log/ │ │ │ │ │ └── LogManager.php │ │ │ │ ├── Messages/ │ │ │ │ │ ├── Article.php │ │ │ │ │ ├── Card.php │ │ │ │ │ ├── DeviceEvent.php │ │ │ │ │ ├── DeviceText.php │ │ │ │ │ ├── File.php │ │ │ │ │ ├── Image.php │ │ │ │ │ ├── InteractiveTaskCard.php │ │ │ │ │ ├── Link.php │ │ │ │ │ ├── Location.php │ │ │ │ │ ├── Media.php │ │ │ │ │ ├── Message.php │ │ │ │ │ ├── MiniProgramPage.php │ │ │ │ │ ├── MiniprogramNotice.php │ │ │ │ │ ├── Music.php │ │ │ │ │ ├── News.php │ │ │ │ │ ├── NewsItem.php │ │ │ │ │ ├── Raw.php │ │ │ │ │ ├── ReplyInteractiveTaskCard.php │ │ │ │ │ ├── ShortVideo.php │ │ │ │ │ ├── TaskCard.php │ │ │ │ │ ├── Text.php │ │ │ │ │ ├── TextCard.php │ │ │ │ │ ├── Transfer.php │ │ │ │ │ ├── Video.php │ │ │ │ │ └── Voice.php │ │ │ │ ├── Providers/ │ │ │ │ │ ├── ConfigServiceProvider.php │ │ │ │ │ ├── EventDispatcherServiceProvider.php │ │ │ │ │ ├── ExtensionServiceProvider.php │ │ │ │ │ ├── HttpClientServiceProvider.php │ │ │ │ │ ├── LogServiceProvider.php │ │ │ │ │ └── RequestServiceProvider.php │ │ │ │ ├── ServerGuard.php │ │ │ │ ├── ServiceContainer.php │ │ │ │ ├── Support/ │ │ │ │ │ ├── AES.php │ │ │ │ │ ├── Arr.php │ │ │ │ │ ├── ArrayAccessible.php │ │ │ │ │ ├── Collection.php │ │ │ │ │ ├── File.php │ │ │ │ │ ├── Helpers.php │ │ │ │ │ ├── Str.php │ │ │ │ │ └── XML.php │ │ │ │ └── Traits/ │ │ │ │ ├── HasAttributes.php │ │ │ │ ├── HasHttpRequests.php │ │ │ │ ├── InteractsWithCache.php │ │ │ │ ├── Observable.php │ │ │ │ └── ResponseCastable.php │ │ │ ├── MicroMerchant/ │ │ │ │ ├── Application.php │ │ │ │ ├── Base/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Certficates/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Kernel/ │ │ │ │ │ ├── BaseClient.php │ │ │ │ │ └── Exceptions/ │ │ │ │ │ ├── EncryptException.php │ │ │ │ │ ├── InvalidExtensionException.php │ │ │ │ │ └── InvalidSignException.php │ │ │ │ ├── Material/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Media/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── MerchantConfig/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ └── Withdraw/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── MiniProgram/ │ │ │ │ ├── ActivityMessage/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── AppCode/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Application.php │ │ │ │ ├── Auth/ │ │ │ │ │ ├── AccessToken.php │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Base/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Broadcast/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Business/ │ │ │ │ │ ├── Client.php │ │ │ │ │ ├── Messenger.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── CustomerService/ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── DataCube/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Encryptor.php │ │ │ │ ├── Express/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Live/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Mall/ │ │ │ │ │ ├── CartClient.php │ │ │ │ │ ├── ForwardsMall.php │ │ │ │ │ ├── MediaClient.php │ │ │ │ │ ├── OrderClient.php │ │ │ │ │ ├── ProductClient.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── NearbyPoi/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── OCR/ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── OpenData/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── PhoneNumber/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Plugin/ │ │ │ │ │ ├── Client.php │ │ │ │ │ ├── DevClient.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── QrCode/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── RealtimeLog/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── RiskControl/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Search/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Server/ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Shop/ │ │ │ │ │ ├── Account/ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ ├── Aftersale/ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ ├── Basic/ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ ├── Delivery/ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ ├── Order/ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ ├── Register/ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ └── Spu/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── ShortLink/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Soter/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── SubscribeMessage/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── TemplateMessage/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── UniformMessage/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Union/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── UrlLink/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ └── UrlScheme/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── OfficialAccount/ │ │ │ │ ├── Application.php │ │ │ │ ├── Auth/ │ │ │ │ │ ├── AccessToken.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── AutoReply/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Base/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Broadcasting/ │ │ │ │ │ ├── Client.php │ │ │ │ │ ├── MessageBuilder.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Card/ │ │ │ │ │ ├── BoardingPassClient.php │ │ │ │ │ ├── Card.php │ │ │ │ │ ├── Client.php │ │ │ │ │ ├── CodeClient.php │ │ │ │ │ ├── CoinClient.php │ │ │ │ │ ├── GeneralCardClient.php │ │ │ │ │ ├── GiftCardClient.php │ │ │ │ │ ├── GiftCardOrderClient.php │ │ │ │ │ ├── GiftCardPageClient.php │ │ │ │ │ ├── InvoiceClient.php │ │ │ │ │ ├── JssdkClient.php │ │ │ │ │ ├── MeetingTicketClient.php │ │ │ │ │ ├── MemberCardClient.php │ │ │ │ │ ├── MovieTicketClient.php │ │ │ │ │ ├── ServiceProvider.php │ │ │ │ │ └── SubMerchantClient.php │ │ │ │ ├── Comment/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── CustomerService/ │ │ │ │ │ ├── Client.php │ │ │ │ │ ├── Messenger.php │ │ │ │ │ ├── ServiceProvider.php │ │ │ │ │ └── SessionClient.php │ │ │ │ ├── DataCube/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Device/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Draft/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── FreePublish/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Goods/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Guide/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Material/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Menu/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── OAuth/ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── OCR/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── POI/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Semantic/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Server/ │ │ │ │ │ ├── Guard.php │ │ │ │ │ ├── Handlers/ │ │ │ │ │ │ └── EchoStrHandler.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── ShakeAround/ │ │ │ │ │ ├── Client.php │ │ │ │ │ ├── DeviceClient.php │ │ │ │ │ ├── GroupClient.php │ │ │ │ │ ├── MaterialClient.php │ │ │ │ │ ├── PageClient.php │ │ │ │ │ ├── RelationClient.php │ │ │ │ │ ├── ServiceProvider.php │ │ │ │ │ ├── ShakeAround.php │ │ │ │ │ └── StatsClient.php │ │ │ │ ├── Store/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── SubscribeMessage/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── TemplateMessage/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── User/ │ │ │ │ │ ├── ServiceProvider.php │ │ │ │ │ ├── TagClient.php │ │ │ │ │ └── UserClient.php │ │ │ │ └── WiFi/ │ │ │ │ ├── CardClient.php │ │ │ │ ├── Client.php │ │ │ │ ├── DeviceClient.php │ │ │ │ ├── ServiceProvider.php │ │ │ │ └── ShopClient.php │ │ │ ├── OpenPlatform/ │ │ │ │ ├── Application.php │ │ │ │ ├── Auth/ │ │ │ │ │ ├── AccessToken.php │ │ │ │ │ ├── ServiceProvider.php │ │ │ │ │ └── VerifyTicket.php │ │ │ │ ├── Authorizer/ │ │ │ │ │ ├── Aggregate/ │ │ │ │ │ │ ├── Account/ │ │ │ │ │ │ │ └── Client.php │ │ │ │ │ │ └── AggregateServiceProvider.php │ │ │ │ │ ├── Auth/ │ │ │ │ │ │ └── AccessToken.php │ │ │ │ │ ├── MiniProgram/ │ │ │ │ │ │ ├── Account/ │ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ │ ├── Application.php │ │ │ │ │ │ ├── Auth/ │ │ │ │ │ │ │ └── Client.php │ │ │ │ │ │ ├── Code/ │ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ │ ├── Domain/ │ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ │ ├── Material/ │ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ │ ├── Privacy/ │ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ │ ├── Security/ │ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ │ ├── Setting/ │ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ │ └── Tester/ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ ├── OfficialAccount/ │ │ │ │ │ │ ├── Account/ │ │ │ │ │ │ │ └── Client.php │ │ │ │ │ │ ├── Application.php │ │ │ │ │ │ └── MiniProgram/ │ │ │ │ │ │ ├── Client.php │ │ │ │ │ │ └── ServiceProvider.php │ │ │ │ │ └── Server/ │ │ │ │ │ └── Guard.php │ │ │ │ ├── Base/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── CodeTemplate/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Component/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ └── Server/ │ │ │ │ ├── Guard.php │ │ │ │ ├── Handlers/ │ │ │ │ │ ├── Authorized.php │ │ │ │ │ ├── Unauthorized.php │ │ │ │ │ ├── UpdateAuthorized.php │ │ │ │ │ └── VerifyTicketRefreshed.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── OpenWork/ │ │ │ │ ├── Application.php │ │ │ │ ├── Auth/ │ │ │ │ │ ├── AccessToken.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Contact/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Corp/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Device/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── License/ │ │ │ │ │ ├── Account.php │ │ │ │ │ ├── App.php │ │ │ │ │ ├── AutoActive.php │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Media/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── MiniProgram/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Provider/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Server/ │ │ │ │ │ ├── Guard.php │ │ │ │ │ ├── Handlers/ │ │ │ │ │ │ └── EchoStrHandler.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── SuiteAuth/ │ │ │ │ │ ├── AccessToken.php │ │ │ │ │ ├── ServiceProvider.php │ │ │ │ │ └── SuiteTicket.php │ │ │ │ └── Work/ │ │ │ │ ├── Application.php │ │ │ │ └── Auth/ │ │ │ │ └── AccessToken.php │ │ │ ├── Payment/ │ │ │ │ ├── Application.php │ │ │ │ ├── Base/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Bill/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Contract/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Coupon/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Fundflow/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Jssdk/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Kernel/ │ │ │ │ │ ├── BaseClient.php │ │ │ │ │ └── Exceptions/ │ │ │ │ │ ├── InvalidSignException.php │ │ │ │ │ └── SandboxException.php │ │ │ │ ├── Merchant/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Notify/ │ │ │ │ │ ├── Handler.php │ │ │ │ │ ├── Paid.php │ │ │ │ │ ├── Refunded.php │ │ │ │ │ └── Scanned.php │ │ │ │ ├── Order/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── ProfitSharing/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Redpack/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Refund/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Reverse/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Sandbox/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ ├── Security/ │ │ │ │ │ ├── Client.php │ │ │ │ │ └── ServiceProvider.php │ │ │ │ └── Transfer/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ └── Work/ │ │ │ ├── Agent/ │ │ │ │ ├── Client.php │ │ │ │ ├── ServiceProvider.php │ │ │ │ └── WorkbenchClient.php │ │ │ ├── Application.php │ │ │ ├── Auth/ │ │ │ │ ├── AccessToken.php │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Base/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Calendar/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Chat/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── CorpGroup/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Department/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── ExternalContact/ │ │ │ │ ├── Client.php │ │ │ │ ├── ContactWayClient.php │ │ │ │ ├── GroupChatWayClient.php │ │ │ │ ├── InterceptClient.php │ │ │ │ ├── MessageClient.php │ │ │ │ ├── MessageTemplateClient.php │ │ │ │ ├── MomentClient.php │ │ │ │ ├── ProductClient.php │ │ │ │ ├── SchoolClient.php │ │ │ │ ├── ServiceProvider.php │ │ │ │ └── StatisticsClient.php │ │ │ ├── GroupRobot/ │ │ │ │ ├── Client.php │ │ │ │ ├── Messages/ │ │ │ │ │ ├── Image.php │ │ │ │ │ ├── Markdown.php │ │ │ │ │ ├── Message.php │ │ │ │ │ ├── News.php │ │ │ │ │ ├── NewsItem.php │ │ │ │ │ └── Text.php │ │ │ │ ├── Messenger.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── GroupWelcomeTemplate/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Invoice/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Jssdk/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Kf/ │ │ │ │ ├── AccountClient.php │ │ │ │ ├── MessageClient.php │ │ │ │ ├── ServiceProvider.php │ │ │ │ └── ServicerClient.php │ │ │ ├── Live/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Media/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Menu/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Message/ │ │ │ │ ├── Client.php │ │ │ │ ├── Messenger.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── MiniProgram/ │ │ │ │ ├── Application.php │ │ │ │ └── Auth/ │ │ │ │ └── Client.php │ │ │ ├── Mobile/ │ │ │ │ ├── Auth/ │ │ │ │ │ └── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── MsgAudit/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── OA/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── OAuth/ │ │ │ │ ├── Manager.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Schedule/ │ │ │ │ ├── Client.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── Server/ │ │ │ │ ├── Guard.php │ │ │ │ ├── Handlers/ │ │ │ │ │ └── EchoStrHandler.php │ │ │ │ └── ServiceProvider.php │ │ │ ├── User/ │ │ │ │ ├── BatchJobsClient.php │ │ │ │ ├── Client.php │ │ │ │ ├── LinkedCorpClient.php │ │ │ │ ├── ServiceProvider.php │ │ │ │ └── TagClient.php │ │ │ └── Wedrive/ │ │ │ ├── Client.php │ │ │ ├── FileClient.php │ │ │ ├── ServiceProvider.php │ │ │ ├── SpaceClient.php │ │ │ └── Wedrive.php │ │ └── wechatServer.php │ └── write.php ├── cross-says.php ├── cross.php ├── douban.php ├── friendcircle.php ├── functions.php ├── github.php ├── index.php ├── links.php ├── links_new.php ├── memos.php ├── messages.php ├── modules/ │ ├── GoLinks/ │ │ └── templates/ │ │ ├── theme1.html │ │ ├── theme2.html │ │ ├── theme3.html │ │ ├── theme4.html │ │ ├── theme5.html │ │ └── theme6.html │ ├── SiteMap/ │ │ └── sitemap.php │ ├── Upgrade/ │ │ ├── Upgrade.php │ │ └── pclzip.lib.php │ ├── UserCenter/ │ │ ├── common/ │ │ │ └── head.php │ │ └── user.php │ ├── Verify/ │ │ └── BearCaptcha/ │ │ ├── Captcha/ │ │ │ ├── Captcha.php │ │ │ ├── Captcha_Link.php │ │ │ └── Captcha_Memo.php │ │ ├── Dingxiang/ │ │ │ ├── DX_Captcha.php │ │ │ ├── DX_Captcha_Link.php │ │ │ └── DX_Captcha_Memo.php │ │ ├── Geetest/ │ │ │ ├── Geetest.php │ │ │ ├── Geetest_Link.php │ │ │ ├── Geetest_Memo.php │ │ │ └── Geetest_Message.php │ │ ├── Turnstile/ │ │ │ ├── Turnstile.php │ │ │ ├── Turnstile_Link.php │ │ │ └── Turnstile_Memo.php │ │ └── Vaptcha/ │ │ ├── Vaptcha.php │ │ ├── Vaptcha_Link.php │ │ └── Vaptcha_Memo.php │ ├── codehightlight/ │ │ └── static/ │ │ ├── prism.js │ │ └── styles/ │ │ ├── BlackMac.css │ │ ├── GrayMac.css │ │ ├── WhiteMac.css │ │ ├── coy.css │ │ ├── gruvbox-light.css │ │ ├── material-dark.css │ │ ├── material-light.css │ │ ├── one-dark.css │ │ └── one-light.css │ ├── lock.php │ ├── lock_article.php │ ├── poster.php │ ├── siteMaintenance/ │ │ └── default.html │ ├── sticky.php │ ├── tools.php │ ├── translate.php │ └── tw_cn.js ├── page.php ├── pages/ │ ├── album.php │ ├── archive.php │ ├── author.php │ ├── index-z.php │ ├── page.php │ ├── post.php │ └── sidebar.php ├── post.php ├── steam.php ├── tags.php ├── thirdparty_comments.php ├── vendors/ │ ├── BearSimpleCacheRules.js │ └── Upload.php └── 配套插件/ └── BsCore/ ├── Action.php ├── Console.php ├── Plugin.php ├── assets/ │ ├── css/ │ │ ├── color-picker.css │ │ └── style.scss │ ├── js/ │ │ ├── IndexNowViewScript.js │ │ ├── backend.js │ │ ├── color-picker.js │ │ ├── iris.js │ │ ├── jquery/ │ │ │ └── ui/ │ │ │ ├── accordion.js │ │ │ ├── autocomplete.js │ │ │ ├── button.js │ │ │ ├── checkboxradio.js │ │ │ ├── controlgroup.js │ │ │ ├── core.js │ │ │ ├── datepicker.js │ │ │ ├── dialog.js │ │ │ ├── draggable.js │ │ │ ├── droppable.js │ │ │ ├── effect-blind.js │ │ │ ├── effect-bounce.js │ │ │ ├── effect-clip.js │ │ │ ├── effect-drop.js │ │ │ ├── effect-explode.js │ │ │ ├── effect-fade.js │ │ │ ├── effect-fold.js │ │ │ ├── effect-highlight.js │ │ │ ├── effect-puff.js │ │ │ ├── effect-pulsate.js │ │ │ ├── effect-scale.js │ │ │ ├── effect-shake.js │ │ │ ├── effect-size.js │ │ │ ├── effect-slide.js │ │ │ ├── effect-transfer.js │ │ │ ├── effect.js │ │ │ ├── menu.js │ │ │ ├── mouse.js │ │ │ ├── progressbar.js │ │ │ ├── resizable.js │ │ │ ├── selectable.js │ │ │ ├── selectmenu.js │ │ │ ├── slider.js │ │ │ ├── sortable.js │ │ │ ├── spinner.js │ │ │ ├── tabs.js │ │ │ └── tooltip.js │ │ ├── lodash.js │ │ ├── main.js │ │ ├── media-editor.js │ │ ├── media-models.js │ │ ├── media-views.js │ │ ├── moxie.js │ │ ├── paste.js │ │ ├── plupload.js │ │ ├── tokeninput.js │ │ └── wplink.js │ └── vendors/ │ ├── codemirror/ │ │ └── 5.65.2/ │ │ ├── addon/ │ │ │ ├── comment/ │ │ │ │ ├── comment.js │ │ │ │ └── continuecomment.js │ │ │ ├── dialog/ │ │ │ │ ├── dialog.css │ │ │ │ └── dialog.js │ │ │ ├── display/ │ │ │ │ ├── autorefresh.js │ │ │ │ ├── fullscreen.css │ │ │ │ ├── fullscreen.js │ │ │ │ ├── panel.js │ │ │ │ ├── placeholder.js │ │ │ │ └── rulers.js │ │ │ ├── edit/ │ │ │ │ ├── closebrackets.js │ │ │ │ ├── closetag.js │ │ │ │ ├── continuelist.js │ │ │ │ ├── matchbrackets.js │ │ │ │ ├── matchtags.js │ │ │ │ └── trailingspace.js │ │ │ ├── fold/ │ │ │ │ ├── brace-fold.js │ │ │ │ ├── comment-fold.js │ │ │ │ ├── foldcode.js │ │ │ │ ├── foldgutter.css │ │ │ │ ├── foldgutter.js │ │ │ │ ├── indent-fold.js │ │ │ │ ├── markdown-fold.js │ │ │ │ └── xml-fold.js │ │ │ ├── hint/ │ │ │ │ ├── anyword-hint.js │ │ │ │ ├── css-hint.js │ │ │ │ ├── html-hint.js │ │ │ │ ├── javascript-hint.js │ │ │ │ ├── show-hint.css │ │ │ │ ├── show-hint.js │ │ │ │ ├── sql-hint.js │ │ │ │ └── xml-hint.js │ │ │ ├── lint/ │ │ │ │ ├── coffeescript-lint.js │ │ │ │ ├── css-lint.js │ │ │ │ ├── html-lint.js │ │ │ │ ├── javascript-lint.js │ │ │ │ ├── json-lint.js │ │ │ │ ├── lint.css │ │ │ │ ├── lint.js │ │ │ │ └── yaml-lint.js │ │ │ ├── merge/ │ │ │ │ ├── merge.css │ │ │ │ └── merge.js │ │ │ ├── mode/ │ │ │ │ ├── loadmode.js │ │ │ │ ├── multiplex.js │ │ │ │ ├── multiplex_test.js │ │ │ │ ├── overlay.js │ │ │ │ └── simple.js │ │ │ ├── runmode/ │ │ │ │ ├── colorize.js │ │ │ │ ├── runmode-standalone.js │ │ │ │ ├── runmode.js │ │ │ │ └── runmode.node.js │ │ │ ├── scroll/ │ │ │ │ ├── annotatescrollbar.js │ │ │ │ ├── scrollpastend.js │ │ │ │ ├── simplescrollbars.css │ │ │ │ └── simplescrollbars.js │ │ │ ├── search/ │ │ │ │ ├── jump-to-line.js │ │ │ │ ├── match-highlighter.js │ │ │ │ ├── matchesonscrollbar.css │ │ │ │ ├── matchesonscrollbar.js │ │ │ │ ├── search.js │ │ │ │ └── searchcursor.js │ │ │ ├── selection/ │ │ │ │ ├── active-line.js │ │ │ │ ├── mark-selection.js │ │ │ │ └── selection-pointer.js │ │ │ ├── tern/ │ │ │ │ ├── tern.css │ │ │ │ ├── tern.js │ │ │ │ └── worker.js │ │ │ └── wrap/ │ │ │ └── hardwrap.js │ │ ├── bin/ │ │ │ └── source-highlight │ │ ├── keymap/ │ │ │ ├── emacs.js │ │ │ ├── sublime.js │ │ │ └── vim.js │ │ ├── lib/ │ │ │ ├── codemirror.css │ │ │ └── codemirror.js │ │ ├── mode/ │ │ │ ├── apl/ │ │ │ │ └── apl.js │ │ │ ├── asciiarmor/ │ │ │ │ └── asciiarmor.js │ │ │ ├── asn.1/ │ │ │ │ └── asn.1.js │ │ │ ├── asterisk/ │ │ │ │ └── asterisk.js │ │ │ ├── brainfuck/ │ │ │ │ └── brainfuck.js │ │ │ ├── clike/ │ │ │ │ └── clike.js │ │ │ ├── clojure/ │ │ │ │ └── clojure.js │ │ │ ├── cmake/ │ │ │ │ └── cmake.js │ │ │ ├── cobol/ │ │ │ │ └── cobol.js │ │ │ ├── coffeescript/ │ │ │ │ └── coffeescript.js │ │ │ ├── commonlisp/ │ │ │ │ └── commonlisp.js │ │ │ ├── crystal/ │ │ │ │ └── crystal.js │ │ │ ├── css/ │ │ │ │ └── css.js │ │ │ ├── cypher/ │ │ │ │ └── cypher.js │ │ │ ├── d/ │ │ │ │ └── d.js │ │ │ ├── dart/ │ │ │ │ └── dart.js │ │ │ ├── diff/ │ │ │ │ └── diff.js │ │ │ ├── django/ │ │ │ │ └── django.js │ │ │ ├── dockerfile/ │ │ │ │ └── dockerfile.js │ │ │ ├── dtd/ │ │ │ │ └── dtd.js │ │ │ ├── dylan/ │ │ │ │ └── dylan.js │ │ │ ├── ebnf/ │ │ │ │ └── ebnf.js │ │ │ ├── ecl/ │ │ │ │ └── ecl.js │ │ │ ├── eiffel/ │ │ │ │ └── eiffel.js │ │ │ ├── elm/ │ │ │ │ └── elm.js │ │ │ ├── erlang/ │ │ │ │ └── erlang.js │ │ │ ├── factor/ │ │ │ │ └── factor.js │ │ │ ├── fcl/ │ │ │ │ └── fcl.js │ │ │ ├── forth/ │ │ │ │ └── forth.js │ │ │ ├── fortran/ │ │ │ │ └── fortran.js │ │ │ ├── gas/ │ │ │ │ └── gas.js │ │ │ ├── gfm/ │ │ │ │ └── gfm.js │ │ │ ├── gherkin/ │ │ │ │ └── gherkin.js │ │ │ ├── go/ │ │ │ │ └── go.js │ │ │ ├── groovy/ │ │ │ │ └── groovy.js │ │ │ ├── haml/ │ │ │ │ └── haml.js │ │ │ ├── handlebars/ │ │ │ │ └── handlebars.js │ │ │ ├── haskell/ │ │ │ │ └── haskell.js │ │ │ ├── haskell-literate/ │ │ │ │ └── haskell-literate.js │ │ │ ├── haxe/ │ │ │ │ └── haxe.js │ │ │ ├── htmlembedded/ │ │ │ │ └── htmlembedded.js │ │ │ ├── htmlmixed/ │ │ │ │ └── htmlmixed.js │ │ │ ├── http/ │ │ │ │ └── http.js │ │ │ ├── idl/ │ │ │ │ └── idl.js │ │ │ ├── javascript/ │ │ │ │ └── javascript.js │ │ │ ├── jinja2/ │ │ │ │ └── jinja2.js │ │ │ ├── jsx/ │ │ │ │ └── jsx.js │ │ │ ├── julia/ │ │ │ │ └── julia.js │ │ │ ├── livescript/ │ │ │ │ └── livescript.js │ │ │ ├── lua/ │ │ │ │ └── lua.js │ │ │ ├── markdown/ │ │ │ │ └── markdown.js │ │ │ ├── mathematica/ │ │ │ │ └── mathematica.js │ │ │ ├── mbox/ │ │ │ │ └── mbox.js │ │ │ ├── meta.js │ │ │ ├── mirc/ │ │ │ │ └── mirc.js │ │ │ ├── mllike/ │ │ │ │ └── mllike.js │ │ │ ├── modelica/ │ │ │ │ └── modelica.js │ │ │ ├── mscgen/ │ │ │ │ └── mscgen.js │ │ │ ├── mumps/ │ │ │ │ └── mumps.js │ │ │ ├── nginx/ │ │ │ │ └── nginx.js │ │ │ ├── nsis/ │ │ │ │ └── nsis.js │ │ │ ├── ntriples/ │ │ │ │ └── ntriples.js │ │ │ ├── octave/ │ │ │ │ └── octave.js │ │ │ ├── oz/ │ │ │ │ └── oz.js │ │ │ ├── pascal/ │ │ │ │ └── pascal.js │ │ │ ├── pegjs/ │ │ │ │ └── pegjs.js │ │ │ ├── perl/ │ │ │ │ └── perl.js │ │ │ ├── php/ │ │ │ │ └── php.js │ │ │ ├── pig/ │ │ │ │ └── pig.js │ │ │ ├── powershell/ │ │ │ │ └── powershell.js │ │ │ ├── properties/ │ │ │ │ └── properties.js │ │ │ ├── protobuf/ │ │ │ │ └── protobuf.js │ │ │ ├── pug/ │ │ │ │ └── pug.js │ │ │ ├── puppet/ │ │ │ │ └── puppet.js │ │ │ ├── python/ │ │ │ │ └── python.js │ │ │ ├── q/ │ │ │ │ └── q.js │ │ │ ├── r/ │ │ │ │ └── r.js │ │ │ ├── rpm/ │ │ │ │ ├── changes/ │ │ │ │ │ └── index.html │ │ │ │ └── rpm.js │ │ │ ├── rst/ │ │ │ │ └── rst.js │ │ │ ├── ruby/ │ │ │ │ └── ruby.js │ │ │ ├── rust/ │ │ │ │ └── rust.js │ │ │ ├── sas/ │ │ │ │ └── sas.js │ │ │ ├── sass/ │ │ │ │ └── sass.js │ │ │ ├── scheme/ │ │ │ │ └── scheme.js │ │ │ ├── shell/ │ │ │ │ └── shell.js │ │ │ ├── sieve/ │ │ │ │ └── sieve.js │ │ │ ├── slim/ │ │ │ │ └── slim.js │ │ │ ├── smalltalk/ │ │ │ │ └── smalltalk.js │ │ │ ├── smarty/ │ │ │ │ └── smarty.js │ │ │ ├── solr/ │ │ │ │ └── solr.js │ │ │ ├── soy/ │ │ │ │ └── soy.js │ │ │ ├── sparql/ │ │ │ │ └── sparql.js │ │ │ ├── spreadsheet/ │ │ │ │ └── spreadsheet.js │ │ │ ├── sql/ │ │ │ │ └── sql.js │ │ │ ├── stex/ │ │ │ │ └── stex.js │ │ │ ├── stylus/ │ │ │ │ └── stylus.js │ │ │ ├── swift/ │ │ │ │ └── swift.js │ │ │ ├── tcl/ │ │ │ │ └── tcl.js │ │ │ ├── textile/ │ │ │ │ └── textile.js │ │ │ ├── tiddlywiki/ │ │ │ │ ├── tiddlywiki.css │ │ │ │ └── tiddlywiki.js │ │ │ ├── tiki/ │ │ │ │ ├── tiki.css │ │ │ │ └── tiki.js │ │ │ ├── toml/ │ │ │ │ └── toml.js │ │ │ ├── tornado/ │ │ │ │ └── tornado.js │ │ │ ├── troff/ │ │ │ │ └── troff.js │ │ │ ├── ttcn/ │ │ │ │ └── ttcn.js │ │ │ ├── ttcn-cfg/ │ │ │ │ └── ttcn-cfg.js │ │ │ ├── turtle/ │ │ │ │ └── turtle.js │ │ │ ├── twig/ │ │ │ │ └── twig.js │ │ │ ├── vb/ │ │ │ │ └── vb.js │ │ │ ├── vbscript/ │ │ │ │ └── vbscript.js │ │ │ ├── velocity/ │ │ │ │ └── velocity.js │ │ │ ├── verilog/ │ │ │ │ └── verilog.js │ │ │ ├── vhdl/ │ │ │ │ └── vhdl.js │ │ │ ├── vue/ │ │ │ │ └── vue.js │ │ │ ├── wast/ │ │ │ │ └── wast.js │ │ │ ├── webidl/ │ │ │ │ └── webidl.js │ │ │ ├── xml/ │ │ │ │ └── xml.js │ │ │ ├── xquery/ │ │ │ │ └── xquery.js │ │ │ ├── yacas/ │ │ │ │ └── yacas.js │ │ │ ├── yaml/ │ │ │ │ └── yaml.js │ │ │ ├── yaml-frontmatter/ │ │ │ │ └── yaml-frontmatter.js │ │ │ └── z80/ │ │ │ └── z80.js │ │ ├── package/ │ │ │ ├── AUTHORS │ │ │ ├── CHANGELOG.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── addon/ │ │ │ │ ├── comment/ │ │ │ │ │ ├── comment.js │ │ │ │ │ └── continuecomment.js │ │ │ │ ├── dialog/ │ │ │ │ │ ├── dialog.css │ │ │ │ │ └── dialog.js │ │ │ │ ├── display/ │ │ │ │ │ ├── autorefresh.js │ │ │ │ │ ├── fullscreen.css │ │ │ │ │ ├── fullscreen.js │ │ │ │ │ ├── panel.js │ │ │ │ │ ├── placeholder.js │ │ │ │ │ └── rulers.js │ │ │ │ ├── edit/ │ │ │ │ │ ├── closebrackets.js │ │ │ │ │ ├── closetag.js │ │ │ │ │ ├── continuelist.js │ │ │ │ │ ├── matchbrackets.js │ │ │ │ │ ├── matchtags.js │ │ │ │ │ └── trailingspace.js │ │ │ │ ├── fold/ │ │ │ │ │ ├── brace-fold.js │ │ │ │ │ ├── comment-fold.js │ │ │ │ │ ├── foldcode.js │ │ │ │ │ ├── foldgutter.css │ │ │ │ │ ├── foldgutter.js │ │ │ │ │ ├── indent-fold.js │ │ │ │ │ ├── markdown-fold.js │ │ │ │ │ └── xml-fold.js │ │ │ │ ├── hint/ │ │ │ │ │ ├── anyword-hint.js │ │ │ │ │ ├── css-hint.js │ │ │ │ │ ├── html-hint.js │ │ │ │ │ ├── javascript-hint.js │ │ │ │ │ ├── show-hint.css │ │ │ │ │ ├── show-hint.js │ │ │ │ │ ├── sql-hint.js │ │ │ │ │ └── xml-hint.js │ │ │ │ ├── lint/ │ │ │ │ │ ├── coffeescript-lint.js │ │ │ │ │ ├── css-lint.js │ │ │ │ │ ├── html-lint.js │ │ │ │ │ ├── javascript-lint.js │ │ │ │ │ ├── json-lint.js │ │ │ │ │ ├── lint.css │ │ │ │ │ ├── lint.js │ │ │ │ │ └── yaml-lint.js │ │ │ │ ├── merge/ │ │ │ │ │ ├── merge.css │ │ │ │ │ └── merge.js │ │ │ │ ├── mode/ │ │ │ │ │ ├── loadmode.js │ │ │ │ │ ├── multiplex.js │ │ │ │ │ ├── multiplex_test.js │ │ │ │ │ ├── overlay.js │ │ │ │ │ └── simple.js │ │ │ │ ├── runmode/ │ │ │ │ │ ├── colorize.js │ │ │ │ │ ├── runmode-standalone.js │ │ │ │ │ ├── runmode.js │ │ │ │ │ └── runmode.node.js │ │ │ │ ├── scroll/ │ │ │ │ │ ├── annotatescrollbar.js │ │ │ │ │ ├── scrollpastend.js │ │ │ │ │ ├── simplescrollbars.css │ │ │ │ │ └── simplescrollbars.js │ │ │ │ ├── search/ │ │ │ │ │ ├── jump-to-line.js │ │ │ │ │ ├── match-highlighter.js │ │ │ │ │ ├── matchesonscrollbar.css │ │ │ │ │ ├── matchesonscrollbar.js │ │ │ │ │ ├── search.js │ │ │ │ │ └── searchcursor.js │ │ │ │ ├── selection/ │ │ │ │ │ ├── active-line.js │ │ │ │ │ ├── mark-selection.js │ │ │ │ │ └── selection-pointer.js │ │ │ │ ├── tern/ │ │ │ │ │ ├── tern.css │ │ │ │ │ ├── tern.js │ │ │ │ │ └── worker.js │ │ │ │ └── wrap/ │ │ │ │ └── hardwrap.js │ │ │ ├── bin/ │ │ │ │ └── source-highlight │ │ │ ├── diff │ │ │ ├── keymap/ │ │ │ │ ├── emacs.js │ │ │ │ ├── sublime.js │ │ │ │ └── vim.js │ │ │ ├── lib/ │ │ │ │ ├── codemirror.css │ │ │ │ └── codemirror.js │ │ │ ├── mode/ │ │ │ │ ├── apl/ │ │ │ │ │ └── apl.js │ │ │ │ ├── asciiarmor/ │ │ │ │ │ └── asciiarmor.js │ │ │ │ ├── asn.1/ │ │ │ │ │ └── asn.1.js │ │ │ │ ├── asterisk/ │ │ │ │ │ └── asterisk.js │ │ │ │ ├── brainfuck/ │ │ │ │ │ └── brainfuck.js │ │ │ │ ├── clike/ │ │ │ │ │ └── clike.js │ │ │ │ ├── clojure/ │ │ │ │ │ └── clojure.js │ │ │ │ ├── cmake/ │ │ │ │ │ └── cmake.js │ │ │ │ ├── cobol/ │ │ │ │ │ └── cobol.js │ │ │ │ ├── coffeescript/ │ │ │ │ │ └── coffeescript.js │ │ │ │ ├── commonlisp/ │ │ │ │ │ └── commonlisp.js │ │ │ │ ├── crystal/ │ │ │ │ │ └── crystal.js │ │ │ │ ├── css/ │ │ │ │ │ └── css.js │ │ │ │ ├── cypher/ │ │ │ │ │ └── cypher.js │ │ │ │ ├── d/ │ │ │ │ │ └── d.js │ │ │ │ ├── dart/ │ │ │ │ │ └── dart.js │ │ │ │ ├── diff/ │ │ │ │ │ └── diff.js │ │ │ │ ├── django/ │ │ │ │ │ └── django.js │ │ │ │ ├── dockerfile/ │ │ │ │ │ └── dockerfile.js │ │ │ │ ├── dtd/ │ │ │ │ │ └── dtd.js │ │ │ │ ├── dylan/ │ │ │ │ │ └── dylan.js │ │ │ │ ├── ebnf/ │ │ │ │ │ └── ebnf.js │ │ │ │ ├── ecl/ │ │ │ │ │ └── ecl.js │ │ │ │ ├── eiffel/ │ │ │ │ │ └── eiffel.js │ │ │ │ ├── elm/ │ │ │ │ │ └── elm.js │ │ │ │ ├── erlang/ │ │ │ │ │ └── erlang.js │ │ │ │ ├── factor/ │ │ │ │ │ └── factor.js │ │ │ │ ├── fcl/ │ │ │ │ │ └── fcl.js │ │ │ │ ├── forth/ │ │ │ │ │ └── forth.js │ │ │ │ ├── fortran/ │ │ │ │ │ └── fortran.js │ │ │ │ ├── gas/ │ │ │ │ │ └── gas.js │ │ │ │ ├── gfm/ │ │ │ │ │ └── gfm.js │ │ │ │ ├── gherkin/ │ │ │ │ │ └── gherkin.js │ │ │ │ ├── go/ │ │ │ │ │ └── go.js │ │ │ │ ├── groovy/ │ │ │ │ │ └── groovy.js │ │ │ │ ├── haml/ │ │ │ │ │ └── haml.js │ │ │ │ ├── handlebars/ │ │ │ │ │ └── handlebars.js │ │ │ │ ├── haskell/ │ │ │ │ │ └── haskell.js │ │ │ │ ├── haskell-literate/ │ │ │ │ │ └── haskell-literate.js │ │ │ │ ├── haxe/ │ │ │ │ │ └── haxe.js │ │ │ │ ├── htmlembedded/ │ │ │ │ │ └── htmlembedded.js │ │ │ │ ├── htmlmixed/ │ │ │ │ │ └── htmlmixed.js │ │ │ │ ├── http/ │ │ │ │ │ └── http.js │ │ │ │ ├── idl/ │ │ │ │ │ └── idl.js │ │ │ │ ├── javascript/ │ │ │ │ │ └── javascript.js │ │ │ │ ├── jinja2/ │ │ │ │ │ └── jinja2.js │ │ │ │ ├── jsx/ │ │ │ │ │ └── jsx.js │ │ │ │ ├── julia/ │ │ │ │ │ └── julia.js │ │ │ │ ├── livescript/ │ │ │ │ │ └── livescript.js │ │ │ │ ├── lua/ │ │ │ │ │ └── lua.js │ │ │ │ ├── markdown/ │ │ │ │ │ └── markdown.js │ │ │ │ ├── mathematica/ │ │ │ │ │ └── mathematica.js │ │ │ │ ├── mbox/ │ │ │ │ │ └── mbox.js │ │ │ │ ├── meta.js │ │ │ │ ├── mirc/ │ │ │ │ │ └── mirc.js │ │ │ │ ├── mllike/ │ │ │ │ │ └── mllike.js │ │ │ │ ├── modelica/ │ │ │ │ │ └── modelica.js │ │ │ │ ├── mscgen/ │ │ │ │ │ └── mscgen.js │ │ │ │ ├── mumps/ │ │ │ │ │ └── mumps.js │ │ │ │ ├── nginx/ │ │ │ │ │ └── nginx.js │ │ │ │ ├── nsis/ │ │ │ │ │ └── nsis.js │ │ │ │ ├── ntriples/ │ │ │ │ │ └── ntriples.js │ │ │ │ ├── octave/ │ │ │ │ │ └── octave.js │ │ │ │ ├── oz/ │ │ │ │ │ └── oz.js │ │ │ │ ├── pascal/ │ │ │ │ │ └── pascal.js │ │ │ │ ├── pegjs/ │ │ │ │ │ └── pegjs.js │ │ │ │ ├── perl/ │ │ │ │ │ └── perl.js │ │ │ │ ├── php/ │ │ │ │ │ └── php.js │ │ │ │ ├── pig/ │ │ │ │ │ └── pig.js │ │ │ │ ├── powershell/ │ │ │ │ │ └── powershell.js │ │ │ │ ├── properties/ │ │ │ │ │ └── properties.js │ │ │ │ ├── protobuf/ │ │ │ │ │ └── protobuf.js │ │ │ │ ├── pug/ │ │ │ │ │ └── pug.js │ │ │ │ ├── puppet/ │ │ │ │ │ └── puppet.js │ │ │ │ ├── python/ │ │ │ │ │ └── python.js │ │ │ │ ├── q/ │ │ │ │ │ └── q.js │ │ │ │ ├── r/ │ │ │ │ │ └── r.js │ │ │ │ ├── rpm/ │ │ │ │ │ ├── changes/ │ │ │ │ │ │ └── index.html │ │ │ │ │ └── rpm.js │ │ │ │ ├── rst/ │ │ │ │ │ └── rst.js │ │ │ │ ├── ruby/ │ │ │ │ │ └── ruby.js │ │ │ │ ├── rust/ │ │ │ │ │ └── rust.js │ │ │ │ ├── sas/ │ │ │ │ │ └── sas.js │ │ │ │ ├── sass/ │ │ │ │ │ └── sass.js │ │ │ │ ├── scheme/ │ │ │ │ │ └── scheme.js │ │ │ │ ├── shell/ │ │ │ │ │ └── shell.js │ │ │ │ ├── sieve/ │ │ │ │ │ └── sieve.js │ │ │ │ ├── slim/ │ │ │ │ │ └── slim.js │ │ │ │ ├── smalltalk/ │ │ │ │ │ └── smalltalk.js │ │ │ │ ├── smarty/ │ │ │ │ │ └── smarty.js │ │ │ │ ├── solr/ │ │ │ │ │ └── solr.js │ │ │ │ ├── soy/ │ │ │ │ │ └── soy.js │ │ │ │ ├── sparql/ │ │ │ │ │ └── sparql.js │ │ │ │ ├── spreadsheet/ │ │ │ │ │ └── spreadsheet.js │ │ │ │ ├── sql/ │ │ │ │ │ └── sql.js │ │ │ │ ├── stex/ │ │ │ │ │ └── stex.js │ │ │ │ ├── stylus/ │ │ │ │ │ └── stylus.js │ │ │ │ ├── swift/ │ │ │ │ │ └── swift.js │ │ │ │ ├── tcl/ │ │ │ │ │ └── tcl.js │ │ │ │ ├── textile/ │ │ │ │ │ └── textile.js │ │ │ │ ├── tiddlywiki/ │ │ │ │ │ ├── tiddlywiki.css │ │ │ │ │ └── tiddlywiki.js │ │ │ │ ├── tiki/ │ │ │ │ │ ├── tiki.css │ │ │ │ │ └── tiki.js │ │ │ │ ├── toml/ │ │ │ │ │ └── toml.js │ │ │ │ ├── tornado/ │ │ │ │ │ └── tornado.js │ │ │ │ ├── troff/ │ │ │ │ │ └── troff.js │ │ │ │ ├── ttcn/ │ │ │ │ │ └── ttcn.js │ │ │ │ ├── ttcn-cfg/ │ │ │ │ │ └── ttcn-cfg.js │ │ │ │ ├── turtle/ │ │ │ │ │ └── turtle.js │ │ │ │ ├── twig/ │ │ │ │ │ └── twig.js │ │ │ │ ├── vb/ │ │ │ │ │ └── vb.js │ │ │ │ ├── vbscript/ │ │ │ │ │ └── vbscript.js │ │ │ │ ├── velocity/ │ │ │ │ │ └── velocity.js │ │ │ │ ├── verilog/ │ │ │ │ │ └── verilog.js │ │ │ │ ├── vhdl/ │ │ │ │ │ └── vhdl.js │ │ │ │ ├── vue/ │ │ │ │ │ └── vue.js │ │ │ │ ├── wast/ │ │ │ │ │ └── wast.js │ │ │ │ ├── webidl/ │ │ │ │ │ └── webidl.js │ │ │ │ ├── xml/ │ │ │ │ │ └── xml.js │ │ │ │ ├── xquery/ │ │ │ │ │ └── xquery.js │ │ │ │ ├── yacas/ │ │ │ │ │ └── yacas.js │ │ │ │ ├── yaml/ │ │ │ │ │ └── yaml.js │ │ │ │ ├── yaml-frontmatter/ │ │ │ │ │ └── yaml-frontmatter.js │ │ │ │ └── z80/ │ │ │ │ └── z80.js │ │ │ ├── package.json │ │ │ ├── rollup.config.js │ │ │ ├── src/ │ │ │ │ ├── addon/ │ │ │ │ │ └── runmode/ │ │ │ │ │ ├── codemirror-standalone.js │ │ │ │ │ ├── codemirror.node.js │ │ │ │ │ ├── runmode-standalone.js │ │ │ │ │ └── runmode.node.js │ │ │ │ ├── codemirror.js │ │ │ │ ├── display/ │ │ │ │ │ ├── Display.js │ │ │ │ │ ├── focus.js │ │ │ │ │ ├── gutters.js │ │ │ │ │ ├── highlight_worker.js │ │ │ │ │ ├── line_numbers.js │ │ │ │ │ ├── mode_state.js │ │ │ │ │ ├── operations.js │ │ │ │ │ ├── scroll_events.js │ │ │ │ │ ├── scrollbars.js │ │ │ │ │ ├── scrolling.js │ │ │ │ │ ├── selection.js │ │ │ │ │ ├── update_display.js │ │ │ │ │ ├── update_line.js │ │ │ │ │ ├── update_lines.js │ │ │ │ │ └── view_tracking.js │ │ │ │ ├── edit/ │ │ │ │ │ ├── CodeMirror.js │ │ │ │ │ ├── commands.js │ │ │ │ │ ├── deleteNearSelection.js │ │ │ │ │ ├── drop_events.js │ │ │ │ │ ├── fromTextArea.js │ │ │ │ │ ├── global_events.js │ │ │ │ │ ├── key_events.js │ │ │ │ │ ├── legacy.js │ │ │ │ │ ├── main.js │ │ │ │ │ ├── methods.js │ │ │ │ │ ├── mouse_events.js │ │ │ │ │ ├── options.js │ │ │ │ │ └── utils.js │ │ │ │ ├── input/ │ │ │ │ │ ├── ContentEditableInput.js │ │ │ │ │ ├── TextareaInput.js │ │ │ │ │ ├── indent.js │ │ │ │ │ ├── input.js │ │ │ │ │ ├── keymap.js │ │ │ │ │ ├── keynames.js │ │ │ │ │ └── movement.js │ │ │ │ ├── line/ │ │ │ │ │ ├── highlight.js │ │ │ │ │ ├── line_data.js │ │ │ │ │ ├── pos.js │ │ │ │ │ ├── saw_special_spans.js │ │ │ │ │ ├── spans.js │ │ │ │ │ └── utils_line.js │ │ │ │ ├── measurement/ │ │ │ │ │ ├── position_measurement.js │ │ │ │ │ └── widgets.js │ │ │ │ ├── model/ │ │ │ │ │ ├── Doc.js │ │ │ │ │ ├── change_measurement.js │ │ │ │ │ ├── changes.js │ │ │ │ │ ├── chunk.js │ │ │ │ │ ├── document_data.js │ │ │ │ │ ├── history.js │ │ │ │ │ ├── line_widget.js │ │ │ │ │ ├── mark_text.js │ │ │ │ │ ├── selection.js │ │ │ │ │ └── selection_updates.js │ │ │ │ ├── modes.js │ │ │ │ └── util/ │ │ │ │ ├── StringStream.js │ │ │ │ ├── bidi.js │ │ │ │ ├── browser.js │ │ │ │ ├── dom.js │ │ │ │ ├── event.js │ │ │ │ ├── feature_detection.js │ │ │ │ ├── misc.js │ │ │ │ └── operation_group.js │ │ │ └── theme/ │ │ │ ├── 3024-day.css │ │ │ ├── 3024-night.css │ │ │ ├── abbott.css │ │ │ ├── abcdef.css │ │ │ ├── ambiance-mobile.css │ │ │ ├── ambiance.css │ │ │ ├── ayu-dark.css │ │ │ ├── ayu-mirage.css │ │ │ ├── base16-dark.css │ │ │ ├── base16-light.css │ │ │ ├── bespin.css │ │ │ ├── blackboard.css │ │ │ ├── cobalt.css │ │ │ ├── colorforth.css │ │ │ ├── darcula.css │ │ │ ├── dracula.css │ │ │ ├── duotone-dark.css │ │ │ ├── duotone-light.css │ │ │ ├── eclipse.css │ │ │ ├── elegant.css │ │ │ ├── erlang-dark.css │ │ │ ├── gruvbox-dark.css │ │ │ ├── hopscotch.css │ │ │ ├── icecoder.css │ │ │ ├── idea.css │ │ │ ├── isotope.css │ │ │ ├── juejin.css │ │ │ ├── lesser-dark.css │ │ │ ├── liquibyte.css │ │ │ ├── lucario.css │ │ │ ├── material-darker.css │ │ │ ├── material-ocean.css │ │ │ ├── material-palenight.css │ │ │ ├── material.css │ │ │ ├── mbo.css │ │ │ ├── mdn-like.css │ │ │ ├── midnight.css │ │ │ ├── monokai.css │ │ │ ├── moxer.css │ │ │ ├── neat.css │ │ │ ├── neo.css │ │ │ ├── night.css │ │ │ ├── nord.css │ │ │ ├── oceanic-next.css │ │ │ ├── panda-syntax.css │ │ │ ├── paraiso-dark.css │ │ │ ├── paraiso-light.css │ │ │ ├── pastel-on-dark.css │ │ │ ├── railscasts.css │ │ │ ├── rubyblue.css │ │ │ ├── seti.css │ │ │ ├── shadowfox.css │ │ │ ├── solarized.css │ │ │ ├── ssms.css │ │ │ ├── the-matrix.css │ │ │ ├── tomorrow-night-bright.css │ │ │ ├── tomorrow-night-eighties.css │ │ │ ├── ttcn.css │ │ │ ├── twilight.css │ │ │ ├── vibrant-ink.css │ │ │ ├── xq-dark.css │ │ │ ├── xq-light.css │ │ │ ├── yeti.css │ │ │ ├── yonce.css │ │ │ └── zenburn.css │ │ ├── src/ │ │ │ ├── addon/ │ │ │ │ └── runmode/ │ │ │ │ ├── codemirror-standalone.js │ │ │ │ ├── codemirror.node.js │ │ │ │ ├── runmode-standalone.js │ │ │ │ └── runmode.node.js │ │ │ ├── codemirror.js │ │ │ ├── display/ │ │ │ │ ├── Display.js │ │ │ │ ├── focus.js │ │ │ │ ├── gutters.js │ │ │ │ ├── highlight_worker.js │ │ │ │ ├── line_numbers.js │ │ │ │ ├── mode_state.js │ │ │ │ ├── operations.js │ │ │ │ ├── scroll_events.js │ │ │ │ ├── scrollbars.js │ │ │ │ ├── scrolling.js │ │ │ │ ├── selection.js │ │ │ │ ├── update_display.js │ │ │ │ ├── update_line.js │ │ │ │ ├── update_lines.js │ │ │ │ └── view_tracking.js │ │ │ ├── edit/ │ │ │ │ ├── CodeMirror.js │ │ │ │ ├── commands.js │ │ │ │ ├── deleteNearSelection.js │ │ │ │ ├── drop_events.js │ │ │ │ ├── fromTextArea.js │ │ │ │ ├── global_events.js │ │ │ │ ├── key_events.js │ │ │ │ ├── legacy.js │ │ │ │ ├── main.js │ │ │ │ ├── methods.js │ │ │ │ ├── mouse_events.js │ │ │ │ ├── options.js │ │ │ │ └── utils.js │ │ │ ├── input/ │ │ │ │ ├── ContentEditableInput.js │ │ │ │ ├── TextareaInput.js │ │ │ │ ├── indent.js │ │ │ │ ├── input.js │ │ │ │ ├── keymap.js │ │ │ │ ├── keynames.js │ │ │ │ └── movement.js │ │ │ ├── line/ │ │ │ │ ├── highlight.js │ │ │ │ ├── line_data.js │ │ │ │ ├── pos.js │ │ │ │ ├── saw_special_spans.js │ │ │ │ ├── spans.js │ │ │ │ └── utils_line.js │ │ │ ├── measurement/ │ │ │ │ ├── position_measurement.js │ │ │ │ └── widgets.js │ │ │ ├── model/ │ │ │ │ ├── Doc.js │ │ │ │ ├── change_measurement.js │ │ │ │ ├── changes.js │ │ │ │ ├── chunk.js │ │ │ │ ├── document_data.js │ │ │ │ ├── history.js │ │ │ │ ├── line_widget.js │ │ │ │ ├── mark_text.js │ │ │ │ ├── selection.js │ │ │ │ └── selection_updates.js │ │ │ ├── modes.js │ │ │ └── util/ │ │ │ ├── StringStream.js │ │ │ ├── bidi.js │ │ │ ├── browser.js │ │ │ ├── dom.js │ │ │ ├── event.js │ │ │ ├── feature_detection.js │ │ │ ├── misc.js │ │ │ └── operation_group.js │ │ └── theme/ │ │ ├── 3024-day.css │ │ ├── 3024-night.css │ │ ├── abbott.css │ │ ├── abcdef.css │ │ ├── ambiance-mobile.css │ │ ├── ambiance.css │ │ ├── ayu-dark.css │ │ ├── ayu-mirage.css │ │ ├── base16-dark.css │ │ ├── base16-light.css │ │ ├── bespin.css │ │ ├── blackboard.css │ │ ├── cobalt.css │ │ ├── colorforth.css │ │ ├── darcula.css │ │ ├── dracula.css │ │ ├── duotone-dark.css │ │ ├── duotone-light.css │ │ ├── eclipse.css │ │ ├── elegant.css │ │ ├── erlang-dark.css │ │ ├── gruvbox-dark.css │ │ ├── hopscotch.css │ │ ├── icecoder.css │ │ ├── idea.css │ │ ├── isotope.css │ │ ├── juejin.css │ │ ├── lesser-dark.css │ │ ├── liquibyte.css │ │ ├── lucario.css │ │ ├── material-darker.css │ │ ├── material-ocean.css │ │ ├── material-palenight.css │ │ ├── material.css │ │ ├── mbo.css │ │ ├── mdn-like.css │ │ ├── midnight.css │ │ ├── monokai.css │ │ ├── moxer.css │ │ ├── neat.css │ │ ├── neo.css │ │ ├── night.css │ │ ├── nord.css │ │ ├── oceanic-next.css │ │ ├── panda-syntax.css │ │ ├── paraiso-dark.css │ │ ├── paraiso-light.css │ │ ├── pastel-on-dark.css │ │ ├── railscasts.css │ │ ├── rubyblue.css │ │ ├── seti.css │ │ ├── shadowfox.css │ │ ├── solarized.css │ │ ├── ssms.css │ │ ├── the-matrix.css │ │ ├── tomorrow-night-bright.css │ │ ├── tomorrow-night-eighties.css │ │ ├── ttcn.css │ │ ├── twilight.css │ │ ├── vibrant-ink.css │ │ ├── xq-dark.css │ │ ├── xq-light.css │ │ ├── yeti.css │ │ ├── yonce.css │ │ └── zenburn.css │ ├── easymde/ │ │ └── codemirror/ │ │ └── tablist.js │ ├── fontawesome/ │ │ └── fonts/ │ │ └── FontAwesome.otf │ └── sweetalert2/ │ └── bootstrap-4.css ├── bsOptions.php ├── bsRouter.php ├── bsoptions-framework.php ├── classes/ │ ├── abstract.class.php │ ├── admin-options.class.php │ ├── fields.class.php │ └── setup.class.php ├── fields/ │ ├── accordion/ │ │ └── accordion.php │ ├── background/ │ │ └── background.php │ ├── backup/ │ │ └── backup.php │ ├── border/ │ │ └── border.php │ ├── button_set/ │ │ └── button_set.php │ ├── callback/ │ │ └── callback.php │ ├── checkbox/ │ │ └── checkbox.php │ ├── code_editor/ │ │ └── code_editor.php │ ├── color/ │ │ └── color.php │ ├── color_group/ │ │ └── color_group.php │ ├── content/ │ │ └── content.php │ ├── date/ │ │ └── date.php │ ├── datetime/ │ │ └── datetime.php │ ├── dimensions/ │ │ └── dimensions.php │ ├── fieldset/ │ │ └── fieldset.php │ ├── gallery/ │ │ └── gallery.php │ ├── group/ │ │ └── group.php │ ├── heading/ │ │ └── heading.php │ ├── icon/ │ │ ├── fa4-icons.php │ │ ├── fa5-icons.php │ │ └── icon.php │ ├── image_select/ │ │ └── image_select.php │ ├── index.php │ ├── link/ │ │ └── link.php │ ├── link_color/ │ │ └── link_color.php │ ├── map/ │ │ └── map.php │ ├── media/ │ │ └── media.php │ ├── notice/ │ │ └── notice.php │ ├── number/ │ │ └── number.php │ ├── palette/ │ │ └── palette.php │ ├── radio/ │ │ └── radio.php │ ├── repeater/ │ │ └── repeater.php │ ├── select/ │ │ └── select.php │ ├── slider/ │ │ └── slider.php │ ├── sortable/ │ │ └── sortable.php │ ├── sorter/ │ │ └── sorter.php │ ├── spacing/ │ │ └── spacing.php │ ├── spinner/ │ │ └── spinner.php │ ├── subheading/ │ │ └── subheading.php │ ├── submessage/ │ │ └── submessage.php │ ├── switcher/ │ │ └── switcher.php │ ├── tabbed/ │ │ └── tabbed.php │ ├── text/ │ │ └── text.php │ ├── textarea/ │ │ └── textarea.php │ ├── typography/ │ │ ├── google-fonts.php │ │ └── typography.php │ ├── upload/ │ │ └── upload.php │ └── wp_editor/ │ └── wp_editor.php ├── functions/ │ ├── Attachments.php │ ├── actions.php │ ├── class-list-util.php │ ├── class.wp_meta_query.php │ ├── class.wp_object_cache.php │ ├── class.wp_post.php │ ├── class.wp_roles.php │ ├── class.wp_term_query.php │ ├── class.wp_user_query.php │ ├── customize.php │ ├── defines.php │ ├── helpers.php │ ├── kses.php │ ├── media-template.php │ ├── options.php │ ├── plugin.php │ ├── sanitize.php │ ├── validate.php │ ├── walker.php │ └── wp_query.php ├── index.php ├── languages/ │ ├── zh_CN.mo │ └── zh_CN.po ├── lib/ │ └── phpmailer/ │ ├── DSNConfigurator.php │ ├── Exception.php │ ├── OAuth.php │ ├── OAuthTokenProvider.php │ ├── PHPMailer.php │ ├── POP3.php │ └── SMTP.php ├── modules/ │ ├── DX_Captcha/ │ │ ├── CaptchaClient.php │ │ ├── CaptchaDemo.php │ │ ├── CtuClient.php │ │ ├── CtuDemo.php │ │ ├── model/ │ │ │ ├── CaptchaResponse.php │ │ │ ├── CtuRequest.php │ │ │ ├── CtuResponse.php │ │ │ ├── CtuResponseStatus.php │ │ │ ├── CtuResult.php │ │ │ ├── HitRule.php │ │ │ ├── RiskLevel.php │ │ │ ├── RiskType.php │ │ │ ├── SuggestPolicy.php │ │ │ └── Suggestion.php │ │ └── util/ │ │ └── SignUtil.php │ ├── MailServices/ │ │ ├── friendlink_approved.html │ │ ├── friendlink_notify.html │ │ ├── friendlink_reject.html │ │ ├── guest.html │ │ └── owner.html │ ├── Markdown/ │ │ ├── Parsedown.php │ │ ├── ParsedownExtension.php │ │ ├── ParsedownExtra.php │ │ └── Parser.php │ ├── Tinypng/ │ │ ├── Tinify/ │ │ │ ├── Client.php │ │ │ ├── Exception.php │ │ │ ├── Result.php │ │ │ ├── ResultMeta.php │ │ │ └── Source.php │ │ ├── Tinify.php │ │ └── data/ │ │ └── cacert.pem │ ├── aliyun_oss/ │ │ └── aliyun-oss-php-sdk-2.6.0.phar │ ├── baidu_bos/ │ │ └── BaiduBce.phar │ ├── bs-emoji/ │ │ ├── bs-emoji.css │ │ ├── bs-emoji.js │ │ └── bs-emoji.json │ ├── cache/ │ │ ├── autoload.php │ │ ├── cache.interface.php │ │ ├── composer/ │ │ │ ├── ClassLoader.php │ │ │ ├── InstalledVersions.php │ │ │ ├── LICENSE │ │ │ ├── autoload_classmap.php │ │ │ ├── autoload_namespaces.php │ │ │ ├── autoload_psr4.php │ │ │ ├── autoload_real.php │ │ │ ├── autoload_static.php │ │ │ ├── installed.json │ │ │ ├── installed.php │ │ │ └── platform_check.php │ │ ├── league/ │ │ │ ├── flysystem/ │ │ │ │ ├── INFO.md │ │ │ │ ├── LICENSE │ │ │ │ ├── composer.json │ │ │ │ ├── readme.md │ │ │ │ └── src/ │ │ │ │ ├── CalculateChecksumFromStream.php │ │ │ │ ├── ChecksumAlgoIsNotSupported.php │ │ │ │ ├── ChecksumProvider.php │ │ │ │ ├── Config.php │ │ │ │ ├── CorruptedPathDetected.php │ │ │ │ ├── DecoratedAdapter.php │ │ │ │ ├── DirectoryAttributes.php │ │ │ │ ├── DirectoryListing.php │ │ │ │ ├── FileAttributes.php │ │ │ │ ├── Filesystem.php │ │ │ │ ├── FilesystemAdapter.php │ │ │ │ ├── FilesystemException.php │ │ │ │ ├── FilesystemOperationFailed.php │ │ │ │ ├── FilesystemOperator.php │ │ │ │ ├── FilesystemReader.php │ │ │ │ ├── FilesystemWriter.php │ │ │ │ ├── InvalidStreamProvided.php │ │ │ │ ├── InvalidVisibilityProvided.php │ │ │ │ ├── MountManager.php │ │ │ │ ├── PathNormalizer.php │ │ │ │ ├── PathPrefixer.php │ │ │ │ ├── PathTraversalDetected.php │ │ │ │ ├── PortableVisibilityGuard.php │ │ │ │ ├── ProxyArrayAccessToProperties.php │ │ │ │ ├── ResolveIdenticalPathConflict.php │ │ │ │ ├── StorageAttributes.php │ │ │ │ ├── SymbolicLinkEncountered.php │ │ │ │ ├── UnableToCheckDirectoryExistence.php │ │ │ │ ├── UnableToCheckExistence.php │ │ │ │ ├── UnableToCheckFileExistence.php │ │ │ │ ├── UnableToCopyFile.php │ │ │ │ ├── UnableToCreateDirectory.php │ │ │ │ ├── UnableToDeleteDirectory.php │ │ │ │ ├── UnableToDeleteFile.php │ │ │ │ ├── UnableToGeneratePublicUrl.php │ │ │ │ ├── UnableToGenerateTemporaryUrl.php │ │ │ │ ├── UnableToListContents.php │ │ │ │ ├── UnableToMountFilesystem.php │ │ │ │ ├── UnableToMoveFile.php │ │ │ │ ├── UnableToProvideChecksum.php │ │ │ │ ├── UnableToReadFile.php │ │ │ │ ├── UnableToResolveFilesystemMount.php │ │ │ │ ├── UnableToRetrieveMetadata.php │ │ │ │ ├── UnableToSetVisibility.php │ │ │ │ ├── UnableToWriteFile.php │ │ │ │ ├── UnixVisibility/ │ │ │ │ │ ├── PortableVisibilityConverter.php │ │ │ │ │ └── VisibilityConverter.php │ │ │ │ ├── UnreadableFileEncountered.php │ │ │ │ ├── UrlGeneration/ │ │ │ │ │ ├── ChainedPublicUrlGenerator.php │ │ │ │ │ ├── PrefixPublicUrlGenerator.php │ │ │ │ │ ├── PublicUrlGenerator.php │ │ │ │ │ ├── ShardedPrefixPublicUrlGenerator.php │ │ │ │ │ └── TemporaryUrlGenerator.php │ │ │ │ ├── Visibility.php │ │ │ │ └── WhitespacePathNormalizer.php │ │ │ ├── flysystem-local/ │ │ │ │ ├── FallbackMimeTypeDetector.php │ │ │ │ ├── LICENSE │ │ │ │ ├── LocalFilesystemAdapter.php │ │ │ │ └── composer.json │ │ │ └── mime-type-detection/ │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── composer.json │ │ │ └── src/ │ │ │ ├── EmptyExtensionToMimeTypeMap.php │ │ │ ├── ExtensionLookup.php │ │ │ ├── ExtensionMimeTypeDetector.php │ │ │ ├── ExtensionToMimeTypeMap.php │ │ │ ├── FinfoMimeTypeDetector.php │ │ │ ├── GeneratedExtensionToMimeTypeMap.php │ │ │ ├── MimeTypeDetector.php │ │ │ └── OverridingExtensionToMimeTypeMap.php │ │ ├── matthiasmullie/ │ │ │ └── scrapbook/ │ │ │ ├── LICENSE │ │ │ ├── composer.json │ │ │ ├── phpunit.xml │ │ │ ├── ruleset.xml │ │ │ └── src/ │ │ │ ├── Adapters/ │ │ │ │ ├── Apc.php │ │ │ │ ├── Collections/ │ │ │ │ │ ├── Apc.php │ │ │ │ │ ├── Couchbase.php │ │ │ │ │ ├── Flysystem.php │ │ │ │ │ ├── Memcached.php │ │ │ │ │ ├── MemoryStore.php │ │ │ │ │ ├── Redis.php │ │ │ │ │ ├── SQL.php │ │ │ │ │ └── Utils/ │ │ │ │ │ ├── PrefixKeys.php │ │ │ │ │ └── PrefixReset.php │ │ │ │ ├── Couchbase.php │ │ │ │ ├── Flysystem.php │ │ │ │ ├── Memcached.php │ │ │ │ ├── MemoryStore.php │ │ │ │ ├── MySQL.php │ │ │ │ ├── PostgreSQL.php │ │ │ │ ├── Redis.php │ │ │ │ ├── SQL.php │ │ │ │ └── SQLite.php │ │ │ ├── Buffered/ │ │ │ │ ├── BufferedStore.php │ │ │ │ ├── TransactionalStore.php │ │ │ │ └── Utils/ │ │ │ │ ├── Buffer.php │ │ │ │ ├── BufferCollection.php │ │ │ │ ├── Defer.php │ │ │ │ └── Transaction.php │ │ │ ├── Exception/ │ │ │ │ ├── Exception.php │ │ │ │ ├── InvalidCollection.php │ │ │ │ ├── InvalidKey.php │ │ │ │ ├── OperationFailed.php │ │ │ │ ├── UnbegunTransaction.php │ │ │ │ └── UncommittedTransaction.php │ │ │ ├── KeyValueStore.php │ │ │ ├── Psr16/ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ └── SimpleCache.php │ │ │ ├── Psr6/ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ ├── Item.php │ │ │ │ ├── Pool.php │ │ │ │ └── Repository.php │ │ │ └── Scale/ │ │ │ ├── Shard.php │ │ │ └── StampedeProtector.php │ │ ├── psr/ │ │ │ ├── cache/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── CacheException.php │ │ │ │ ├── CacheItemInterface.php │ │ │ │ ├── CacheItemPoolInterface.php │ │ │ │ └── InvalidArgumentException.php │ │ │ └── simple-cache/ │ │ │ ├── .editorconfig │ │ │ ├── LICENSE.md │ │ │ ├── README.md │ │ │ ├── composer.json │ │ │ └── src/ │ │ │ ├── CacheException.php │ │ │ ├── CacheInterface.php │ │ │ └── InvalidArgumentException.php │ │ ├── typecho_apcu.class.php │ │ ├── typecho_flysystem.class.php │ │ ├── typecho_memcached.class.php │ │ ├── typecho_memory.class.php │ │ ├── typecho_redis.class.php │ │ └── typecho_sqlite.class.php │ ├── huawei_obs/ │ │ ├── Obs/ │ │ │ ├── Internal/ │ │ │ │ ├── Common/ │ │ │ │ │ ├── CheckoutStream.php │ │ │ │ │ ├── ITransform.php │ │ │ │ │ ├── Model.php │ │ │ │ │ ├── ObsTransform.php │ │ │ │ │ ├── SchemaFormatter.php │ │ │ │ │ ├── SdkCurlFactory.php │ │ │ │ │ ├── SdkStreamHandler.php │ │ │ │ │ ├── ToArrayInterface.php │ │ │ │ │ └── V2Transform.php │ │ │ │ ├── GetResponseTrait.php │ │ │ │ ├── Resource/ │ │ │ │ │ ├── Constants.php │ │ │ │ │ ├── OBSConstants.php │ │ │ │ │ ├── OBSRequestResource.php │ │ │ │ │ ├── V2Constants.php │ │ │ │ │ └── V2RequestResource.php │ │ │ │ ├── SendRequestTrait.php │ │ │ │ └── Signature/ │ │ │ │ ├── AbstractSignature.php │ │ │ │ ├── DefaultSignature.php │ │ │ │ ├── SignatureInterface.php │ │ │ │ └── V4Signature.php │ │ │ ├── Log/ │ │ │ │ ├── ObsConfig.php │ │ │ │ └── ObsLog.php │ │ │ ├── ObsClient.php │ │ │ └── ObsException.php │ │ ├── composer.json │ │ ├── obs-autoloader.php │ │ └── vendor/ │ │ ├── autoload.php │ │ ├── composer/ │ │ │ ├── ClassLoader.php │ │ │ ├── LICENSE │ │ │ ├── autoload_classmap.php │ │ │ ├── autoload_files.php │ │ │ ├── autoload_namespaces.php │ │ │ ├── autoload_psr4.php │ │ │ ├── autoload_real.php │ │ │ ├── autoload_static.php │ │ │ └── installed.json │ │ ├── guzzlehttp/ │ │ │ ├── guzzle/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── UPGRADING.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── Client.php │ │ │ │ ├── ClientInterface.php │ │ │ │ ├── Cookie/ │ │ │ │ │ ├── CookieJar.php │ │ │ │ │ ├── CookieJarInterface.php │ │ │ │ │ ├── FileCookieJar.php │ │ │ │ │ ├── SessionCookieJar.php │ │ │ │ │ └── SetCookie.php │ │ │ │ ├── Exception/ │ │ │ │ │ ├── BadResponseException.php │ │ │ │ │ ├── ClientException.php │ │ │ │ │ ├── ConnectException.php │ │ │ │ │ ├── GuzzleException.php │ │ │ │ │ ├── RequestException.php │ │ │ │ │ ├── SeekException.php │ │ │ │ │ ├── ServerException.php │ │ │ │ │ ├── TooManyRedirectsException.php │ │ │ │ │ └── TransferException.php │ │ │ │ ├── Handler/ │ │ │ │ │ ├── CurlFactory.php │ │ │ │ │ ├── CurlFactoryInterface.php │ │ │ │ │ ├── CurlHandler.php │ │ │ │ │ ├── CurlMultiHandler.php │ │ │ │ │ ├── EasyHandle.php │ │ │ │ │ ├── MockHandler.php │ │ │ │ │ ├── Proxy.php │ │ │ │ │ └── StreamHandler.php │ │ │ │ ├── HandlerStack.php │ │ │ │ ├── MessageFormatter.php │ │ │ │ ├── Middleware.php │ │ │ │ ├── Pool.php │ │ │ │ ├── PrepareBodyMiddleware.php │ │ │ │ ├── RedirectMiddleware.php │ │ │ │ ├── RequestOptions.php │ │ │ │ ├── RetryMiddleware.php │ │ │ │ ├── TransferStats.php │ │ │ │ ├── UriTemplate.php │ │ │ │ ├── functions.php │ │ │ │ └── functions_include.php │ │ │ ├── promises/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── Makefile │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src/ │ │ │ │ ├── AggregateException.php │ │ │ │ ├── CancellationException.php │ │ │ │ ├── Coroutine.php │ │ │ │ ├── EachPromise.php │ │ │ │ ├── FulfilledPromise.php │ │ │ │ ├── Promise.php │ │ │ │ ├── PromiseInterface.php │ │ │ │ ├── PromisorInterface.php │ │ │ │ ├── RejectedPromise.php │ │ │ │ ├── RejectionException.php │ │ │ │ ├── TaskQueue.php │ │ │ │ ├── TaskQueueInterface.php │ │ │ │ ├── functions.php │ │ │ │ └── functions_include.php │ │ │ └── psr7/ │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── composer.json │ │ │ └── src/ │ │ │ ├── AppendStream.php │ │ │ ├── BufferStream.php │ │ │ ├── CachingStream.php │ │ │ ├── DroppingStream.php │ │ │ ├── FnStream.php │ │ │ ├── InflateStream.php │ │ │ ├── LazyOpenStream.php │ │ │ ├── LimitStream.php │ │ │ ├── MessageTrait.php │ │ │ ├── MultipartStream.php │ │ │ ├── NoSeekStream.php │ │ │ ├── PumpStream.php │ │ │ ├── Request.php │ │ │ ├── Response.php │ │ │ ├── ServerRequest.php │ │ │ ├── Stream.php │ │ │ ├── StreamDecoratorTrait.php │ │ │ ├── StreamWrapper.php │ │ │ ├── UploadedFile.php │ │ │ ├── Uri.php │ │ │ ├── UriNormalizer.php │ │ │ ├── UriResolver.php │ │ │ ├── functions.php │ │ │ └── functions_include.php │ │ ├── monolog/ │ │ │ └── monolog/ │ │ │ ├── .php_cs │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── composer.json │ │ │ ├── doc/ │ │ │ │ ├── 01-usage.md │ │ │ │ ├── 02-handlers-formatters-processors.md │ │ │ │ ├── 03-utilities.md │ │ │ │ ├── 04-extending.md │ │ │ │ └── sockets.md │ │ │ ├── phpunit.xml.dist │ │ │ ├── src/ │ │ │ │ └── Monolog/ │ │ │ │ ├── ErrorHandler.php │ │ │ │ ├── Formatter/ │ │ │ │ │ ├── ChromePHPFormatter.php │ │ │ │ │ ├── ElasticaFormatter.php │ │ │ │ │ ├── FlowdockFormatter.php │ │ │ │ │ ├── FluentdFormatter.php │ │ │ │ │ ├── FormatterInterface.php │ │ │ │ │ ├── GelfMessageFormatter.php │ │ │ │ │ ├── HtmlFormatter.php │ │ │ │ │ ├── JsonFormatter.php │ │ │ │ │ ├── LineFormatter.php │ │ │ │ │ ├── LogglyFormatter.php │ │ │ │ │ ├── LogstashFormatter.php │ │ │ │ │ ├── MongoDBFormatter.php │ │ │ │ │ ├── NormalizerFormatter.php │ │ │ │ │ ├── ScalarFormatter.php │ │ │ │ │ └── WildfireFormatter.php │ │ │ │ ├── Handler/ │ │ │ │ │ ├── AbstractHandler.php │ │ │ │ │ ├── AbstractProcessingHandler.php │ │ │ │ │ ├── AbstractSyslogHandler.php │ │ │ │ │ ├── AmqpHandler.php │ │ │ │ │ ├── BrowserConsoleHandler.php │ │ │ │ │ ├── BufferHandler.php │ │ │ │ │ ├── ChromePHPHandler.php │ │ │ │ │ ├── CouchDBHandler.php │ │ │ │ │ ├── CubeHandler.php │ │ │ │ │ ├── Curl/ │ │ │ │ │ │ └── Util.php │ │ │ │ │ ├── DeduplicationHandler.php │ │ │ │ │ ├── DoctrineCouchDBHandler.php │ │ │ │ │ ├── DynamoDbHandler.php │ │ │ │ │ ├── ElasticSearchHandler.php │ │ │ │ │ ├── ErrorLogHandler.php │ │ │ │ │ ├── FilterHandler.php │ │ │ │ │ ├── FingersCrossed/ │ │ │ │ │ │ ├── ActivationStrategyInterface.php │ │ │ │ │ │ ├── ChannelLevelActivationStrategy.php │ │ │ │ │ │ └── ErrorLevelActivationStrategy.php │ │ │ │ │ ├── FingersCrossedHandler.php │ │ │ │ │ ├── FirePHPHandler.php │ │ │ │ │ ├── FleepHookHandler.php │ │ │ │ │ ├── FlowdockHandler.php │ │ │ │ │ ├── GelfHandler.php │ │ │ │ │ ├── GroupHandler.php │ │ │ │ │ ├── HandlerInterface.php │ │ │ │ │ ├── HandlerWrapper.php │ │ │ │ │ ├── HipChatHandler.php │ │ │ │ │ ├── IFTTTHandler.php │ │ │ │ │ ├── LogEntriesHandler.php │ │ │ │ │ ├── LogglyHandler.php │ │ │ │ │ ├── MailHandler.php │ │ │ │ │ ├── MandrillHandler.php │ │ │ │ │ ├── MissingExtensionException.php │ │ │ │ │ ├── MongoDBHandler.php │ │ │ │ │ ├── NativeMailerHandler.php │ │ │ │ │ ├── NewRelicHandler.php │ │ │ │ │ ├── NullHandler.php │ │ │ │ │ ├── PHPConsoleHandler.php │ │ │ │ │ ├── PsrHandler.php │ │ │ │ │ ├── PushoverHandler.php │ │ │ │ │ ├── RavenHandler.php │ │ │ │ │ ├── RedisHandler.php │ │ │ │ │ ├── RollbarHandler.php │ │ │ │ │ ├── RotatingFileHandler.php │ │ │ │ │ ├── SamplingHandler.php │ │ │ │ │ ├── Slack/ │ │ │ │ │ │ └── SlackRecord.php │ │ │ │ │ ├── SlackHandler.php │ │ │ │ │ ├── SlackWebhookHandler.php │ │ │ │ │ ├── SlackbotHandler.php │ │ │ │ │ ├── SocketHandler.php │ │ │ │ │ ├── StreamHandler.php │ │ │ │ │ ├── SwiftMailerHandler.php │ │ │ │ │ ├── SyslogHandler.php │ │ │ │ │ ├── SyslogUdp/ │ │ │ │ │ │ └── UdpSocket.php │ │ │ │ │ ├── SyslogUdpHandler.php │ │ │ │ │ ├── TestHandler.php │ │ │ │ │ ├── WhatFailureGroupHandler.php │ │ │ │ │ └── ZendMonitorHandler.php │ │ │ │ ├── Logger.php │ │ │ │ ├── Processor/ │ │ │ │ │ ├── GitProcessor.php │ │ │ │ │ ├── IntrospectionProcessor.php │ │ │ │ │ ├── MemoryPeakUsageProcessor.php │ │ │ │ │ ├── MemoryProcessor.php │ │ │ │ │ ├── MemoryUsageProcessor.php │ │ │ │ │ ├── MercurialProcessor.php │ │ │ │ │ ├── ProcessIdProcessor.php │ │ │ │ │ ├── PsrLogMessageProcessor.php │ │ │ │ │ ├── TagProcessor.php │ │ │ │ │ ├── UidProcessor.php │ │ │ │ │ └── WebProcessor.php │ │ │ │ └── Registry.php │ │ │ └── tests/ │ │ │ └── Monolog/ │ │ │ ├── ErrorHandlerTest.php │ │ │ ├── Formatter/ │ │ │ │ ├── ChromePHPFormatterTest.php │ │ │ │ ├── ElasticaFormatterTest.php │ │ │ │ ├── FlowdockFormatterTest.php │ │ │ │ ├── FluentdFormatterTest.php │ │ │ │ ├── GelfMessageFormatterTest.php │ │ │ │ ├── JsonFormatterTest.php │ │ │ │ ├── LineFormatterTest.php │ │ │ │ ├── LogglyFormatterTest.php │ │ │ │ ├── LogstashFormatterTest.php │ │ │ │ ├── MongoDBFormatterTest.php │ │ │ │ ├── NormalizerFormatterTest.php │ │ │ │ ├── ScalarFormatterTest.php │ │ │ │ └── WildfireFormatterTest.php │ │ │ ├── Handler/ │ │ │ │ ├── AbstractHandlerTest.php │ │ │ │ ├── AbstractProcessingHandlerTest.php │ │ │ │ ├── AmqpHandlerTest.php │ │ │ │ ├── BrowserConsoleHandlerTest.php │ │ │ │ ├── BufferHandlerTest.php │ │ │ │ ├── ChromePHPHandlerTest.php │ │ │ │ ├── CouchDBHandlerTest.php │ │ │ │ ├── DeduplicationHandlerTest.php │ │ │ │ ├── DoctrineCouchDBHandlerTest.php │ │ │ │ ├── DynamoDbHandlerTest.php │ │ │ │ ├── ElasticSearchHandlerTest.php │ │ │ │ ├── ErrorLogHandlerTest.php │ │ │ │ ├── FilterHandlerTest.php │ │ │ │ ├── FingersCrossedHandlerTest.php │ │ │ │ ├── FirePHPHandlerTest.php │ │ │ │ ├── Fixtures/ │ │ │ │ │ └── .gitkeep │ │ │ │ ├── FleepHookHandlerTest.php │ │ │ │ ├── FlowdockHandlerTest.php │ │ │ │ ├── GelfHandlerLegacyTest.php │ │ │ │ ├── GelfHandlerTest.php │ │ │ │ ├── GelfMockMessagePublisher.php │ │ │ │ ├── GroupHandlerTest.php │ │ │ │ ├── HandlerWrapperTest.php │ │ │ │ ├── HipChatHandlerTest.php │ │ │ │ ├── LogEntriesHandlerTest.php │ │ │ │ ├── MailHandlerTest.php │ │ │ │ ├── MockRavenClient.php │ │ │ │ ├── MongoDBHandlerTest.php │ │ │ │ ├── NativeMailerHandlerTest.php │ │ │ │ ├── NewRelicHandlerTest.php │ │ │ │ ├── NullHandlerTest.php │ │ │ │ ├── PHPConsoleHandlerTest.php │ │ │ │ ├── PsrHandlerTest.php │ │ │ │ ├── PushoverHandlerTest.php │ │ │ │ ├── RavenHandlerTest.php │ │ │ │ ├── RedisHandlerTest.php │ │ │ │ ├── RollbarHandlerTest.php │ │ │ │ ├── RotatingFileHandlerTest.php │ │ │ │ ├── SamplingHandlerTest.php │ │ │ │ ├── Slack/ │ │ │ │ │ └── SlackRecordTest.php │ │ │ │ ├── SlackHandlerTest.php │ │ │ │ ├── SlackWebhookHandlerTest.php │ │ │ │ ├── SlackbotHandlerTest.php │ │ │ │ ├── SocketHandlerTest.php │ │ │ │ ├── StreamHandlerTest.php │ │ │ │ ├── SwiftMailerHandlerTest.php │ │ │ │ ├── SyslogHandlerTest.php │ │ │ │ ├── SyslogUdpHandlerTest.php │ │ │ │ ├── TestHandlerTest.php │ │ │ │ ├── UdpSocketTest.php │ │ │ │ ├── WhatFailureGroupHandlerTest.php │ │ │ │ └── ZendMonitorHandlerTest.php │ │ │ ├── LoggerTest.php │ │ │ ├── Processor/ │ │ │ │ ├── GitProcessorTest.php │ │ │ │ ├── IntrospectionProcessorTest.php │ │ │ │ ├── MemoryPeakUsageProcessorTest.php │ │ │ │ ├── MemoryUsageProcessorTest.php │ │ │ │ ├── MercurialProcessorTest.php │ │ │ │ ├── ProcessIdProcessorTest.php │ │ │ │ ├── PsrLogMessageProcessorTest.php │ │ │ │ ├── TagProcessorTest.php │ │ │ │ ├── UidProcessorTest.php │ │ │ │ └── WebProcessorTest.php │ │ │ ├── PsrLogCompatTest.php │ │ │ ├── RegistryTest.php │ │ │ └── TestCase.php │ │ └── psr/ │ │ └── http-message/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── composer.json │ │ └── src/ │ │ ├── MessageInterface.php │ │ ├── RequestInterface.php │ │ ├── ResponseInterface.php │ │ ├── ServerRequestInterface.php │ │ ├── StreamInterface.php │ │ ├── UploadedFileInterface.php │ │ └── UriInterface.php │ ├── qiniu_kodo/ │ │ ├── autoload.php │ │ └── src/ │ │ └── Qiniu/ │ │ ├── Auth.php │ │ ├── Cdn/ │ │ │ └── CdnManager.php │ │ ├── Config.php │ │ ├── Etag.php │ │ ├── Http/ │ │ │ ├── Client.php │ │ │ ├── Error.php │ │ │ ├── Request.php │ │ │ └── Response.php │ │ ├── Processing/ │ │ │ ├── ImageUrlBuilder.php │ │ │ ├── Operation.php │ │ │ └── PersistentFop.php │ │ ├── Storage/ │ │ │ ├── BucketManager.php │ │ │ ├── FormUploader.php │ │ │ ├── ResumeUploader.php │ │ │ └── UploadManager.php │ │ ├── Zone.php │ │ └── functions.php │ ├── tencent_cos/ │ │ └── phar/ │ │ └── cos-sdk-v5-7.phar │ └── upyun_uss/ │ ├── src/ │ │ └── Upyun/ │ │ ├── Api/ │ │ │ ├── Form.php │ │ │ ├── Pretreat.php │ │ │ ├── Rest.php │ │ │ └── SyncVideo.php │ │ ├── Config.php │ │ ├── Signature.php │ │ ├── Uploader.php │ │ ├── Upyun.php │ │ └── Util.php │ └── vendor/ │ ├── autoload.php │ ├── composer/ │ │ ├── ClassLoader.php │ │ ├── LICENSE │ │ ├── autoload_classmap.php │ │ ├── autoload_files.php │ │ ├── autoload_namespaces.php │ │ ├── autoload_psr4.php │ │ ├── autoload_real.php │ │ ├── autoload_static.php │ │ └── installed.json │ ├── guzzlehttp/ │ │ ├── guzzle/ │ │ │ ├── .php_cs │ │ │ ├── CHANGELOG.md │ │ │ ├── Dockerfile │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── UPGRADING.md │ │ │ ├── composer.json │ │ │ └── src/ │ │ │ ├── Client.php │ │ │ ├── ClientInterface.php │ │ │ ├── Cookie/ │ │ │ │ ├── CookieJar.php │ │ │ │ ├── CookieJarInterface.php │ │ │ │ ├── FileCookieJar.php │ │ │ │ ├── SessionCookieJar.php │ │ │ │ └── SetCookie.php │ │ │ ├── Exception/ │ │ │ │ ├── BadResponseException.php │ │ │ │ ├── ClientException.php │ │ │ │ ├── ConnectException.php │ │ │ │ ├── GuzzleException.php │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ ├── RequestException.php │ │ │ │ ├── SeekException.php │ │ │ │ ├── ServerException.php │ │ │ │ ├── TooManyRedirectsException.php │ │ │ │ └── TransferException.php │ │ │ ├── Handler/ │ │ │ │ ├── CurlFactory.php │ │ │ │ ├── CurlFactoryInterface.php │ │ │ │ ├── CurlHandler.php │ │ │ │ ├── CurlMultiHandler.php │ │ │ │ ├── EasyHandle.php │ │ │ │ ├── MockHandler.php │ │ │ │ ├── Proxy.php │ │ │ │ └── StreamHandler.php │ │ │ ├── HandlerStack.php │ │ │ ├── MessageFormatter.php │ │ │ ├── Middleware.php │ │ │ ├── Pool.php │ │ │ ├── PrepareBodyMiddleware.php │ │ │ ├── RedirectMiddleware.php │ │ │ ├── RequestOptions.php │ │ │ ├── RetryMiddleware.php │ │ │ ├── TransferStats.php │ │ │ ├── UriTemplate.php │ │ │ ├── Utils.php │ │ │ ├── functions.php │ │ │ └── functions_include.php │ │ ├── promises/ │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── composer.json │ │ │ └── src/ │ │ │ ├── AggregateException.php │ │ │ ├── CancellationException.php │ │ │ ├── Coroutine.php │ │ │ ├── EachPromise.php │ │ │ ├── FulfilledPromise.php │ │ │ ├── Promise.php │ │ │ ├── PromiseInterface.php │ │ │ ├── PromisorInterface.php │ │ │ ├── RejectedPromise.php │ │ │ ├── RejectionException.php │ │ │ ├── TaskQueue.php │ │ │ ├── TaskQueueInterface.php │ │ │ ├── functions.php │ │ │ └── functions_include.php │ │ └── psr7/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── composer.json │ │ └── src/ │ │ ├── AppendStream.php │ │ ├── BufferStream.php │ │ ├── CachingStream.php │ │ ├── DroppingStream.php │ │ ├── FnStream.php │ │ ├── InflateStream.php │ │ ├── LazyOpenStream.php │ │ ├── LimitStream.php │ │ ├── MessageTrait.php │ │ ├── MultipartStream.php │ │ ├── NoSeekStream.php │ │ ├── PumpStream.php │ │ ├── Request.php │ │ ├── Response.php │ │ ├── Rfc7230.php │ │ ├── ServerRequest.php │ │ ├── Stream.php │ │ ├── StreamDecoratorTrait.php │ │ ├── StreamWrapper.php │ │ ├── UploadedFile.php │ │ ├── Uri.php │ │ ├── UriNormalizer.php │ │ ├── UriResolver.php │ │ ├── functions.php │ │ └── functions_include.php │ ├── psr/ │ │ └── http-message/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── composer.json │ │ └── src/ │ │ ├── MessageInterface.php │ │ ├── RequestInterface.php │ │ ├── ResponseInterface.php │ │ ├── ServerRequestInterface.php │ │ ├── StreamInterface.php │ │ ├── UploadedFileInterface.php │ │ └── UriInterface.php │ ├── ralouphie/ │ │ └── getallheaders/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── composer.json │ │ └── src/ │ │ └── getallheaders.php │ └── symfony/ │ ├── polyfill-intl-idn/ │ │ ├── Idn.php │ │ ├── LICENSE │ │ ├── README.md │ │ ├── bootstrap.php │ │ └── composer.json │ ├── polyfill-mbstring/ │ │ ├── LICENSE │ │ ├── Mbstring.php │ │ ├── README.md │ │ ├── Resources/ │ │ │ └── unidata/ │ │ │ ├── lowerCase.php │ │ │ ├── titleCaseRegexp.php │ │ │ └── upperCase.php │ │ ├── bootstrap.php │ │ └── composer.json │ └── polyfill-php72/ │ ├── LICENSE │ ├── Php72.php │ ├── README.md │ ├── bootstrap.php │ └── composer.json └── pages/ └── panel.php ================================================ FILE CONTENTS ================================================ ================================================ FILE: 404.php ================================================ need('compoment/head.php');?>

404 -

need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: README.MD ================================================

Typecho主题 - Bearsimple V2

一款简洁大方的Typecho主题
QQ交流群:561848356
若主题目录名为typecho-bearsimple-v2.x,则需改为bearsimple,配套插件目录中的BsCore需放入/usr/plugins中,否则无法正常使用。
特别声明:本主题仅适用于单纯的博客日志,请勿用于违法站点,在遵守国家法律法规的前提下合理使用,谢谢~
使用说明 最新版本[v2.9.9]下载 文档中心 演示站 我的博客

主题功能

  • Pjax、图片灯箱、隐私评论、用户中心、投稿、微海报、切换文章字体等实用的功能
  • BearSimple主打的就是简约而不简陋,所以功能全面也是BearSimple主题的一大特点
  • Thanks

    IDE:JetBrains、UI FrameWork:Semantic-UI

    License

    GPL-3.0 license ================================================ FILE: about.php ================================================ need('compoment/head.php');?>

    title() ?>


    自我介绍

    博主很懒,连自我介绍都懒得写~

    [ 'url' => Bsoptions('Github_URL'), 'icon' => 'github', 'id' => 'contactgithub', 'blank' => false, ], 'Wechat_QRCODE' => [ 'url' => Bsoptions('Wechat_QRCODE'), 'icon' => 'wechat', 'id' => 'contactwechat', 'blank' => false, ], 'QQ_QRCODE' => [ 'url' => Bsoptions('QQ_QRCODE'), 'icon' => 'qq', 'id' => 'contactqq', 'blank' => false, ], 'Weibo_URL' => [ 'url' => Bsoptions('Weibo_URL'), 'icon' => 'weibo', 'id' => 'contactweibo', 'blank' => (Bsoptions('Link_blank') == '2'), ], 'Facebook_URL' => [ 'url' => Bsoptions('Facebook_URL'), 'icon' => 'facebook', 'id' => 'contactfacebook', 'blank' => (Bsoptions('Link_blank') == '2'), ], 'Twitter_URL' => [ 'url' => Bsoptions('Twitter_URL'), 'icon' => 'times', 'id' => 'contacttwitter', 'blank' => (Bsoptions('Link_blank') == '2'), ], 'Telegram_URL' => [ 'url' => Bsoptions('Telegram_URL'), 'icon' => 'telegram', 'id' => 'contacttelegram', 'blank' => (Bsoptions('Link_blank') == '2'), ], ]; $hasSocial = false; foreach ($socialLinks as $link) { if (!empty($link['url'])) { $hasSocial = true; break; } } if ($hasSocial) : ?>
    $link): ?> >
    历程
    规划
    联系方式
    QQ:
    微博:@
    微信:
    need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: acg.php ================================================ need('compoment/head.php');?>
    need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: archive.php ================================================ need('compoment/head.php');?> getArchiveTitle(); if(empty(CategoryEncrypt(categeid($this->getArchiveSlug()))['Cate_Encrypt_Password'])){ $category['md5_password'] = md5Encode('654321');//初始密码,即加密密码没填的情况下的默认密码,可改动 } else{ $category['md5_password'] = md5Encode(CategoryEncrypt(categeid($this->getArchiveSlug()))['Cate_Encrypt_Password']); } $category['type'] = "category"; $category['category'] = $this->getArchiveSlug(); $_POST['data'] = $category; $password = Typecho_Cookie::get('category_'.$this->getArchiveSlug()); if ((!empty($password) && $password == $category['md5_password']) || $this->user->hasLogin()){ $cookie = true; } ?> getArchiveSlug()))) && !$cookie):?> need('modules/lock.php'); ?> getArchiveSlug()))) && $this->is('category')):?> need('pages/album.php'); ?> is('author')):?> need('pages/author.php'); ?> need('pages/archive.php'); ?> need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: archived.php ================================================ need('compoment/head.php');?>

    title() ?>

    分类统计
    widget('Widget_Metas_Category_List'); $categoryData = []; while ($categories->next()) { $categoryData[] = [ 'name' => $categories->name, 'count' => $categories->count, 'color' => sprintf('#%06X', mt_rand(0, 0xFFFFFF)) ]; } ?>
    文章归档
    request->get('page', 1); $pageSize = 5; $archives = $this->widget('Widget_Contents_Post_Recent', 'pageSize=10000'); while ($archives->next()) { $year = date('Y', $archives->created); $years[$year][] = [ 'title' => $archives->title, 'permalink' => $archives->permalink, 'date' => date('Y-m-d', $archives->created) ]; } krsort($years); $yearKeys = array_keys($years); $totalYears = count($yearKeys); $currentPageYears = array_slice($yearKeys, ($page-1)*$pageSize, $pageSize); foreach ($currentPageYears as $year): $isCurrentYear = $year == $currentYear; ?>
    篇文章
    need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: assets/check.json ================================================ { "code": "1", "message": "success" } ================================================ FILE: assets/css/copycode.css ================================================ .highlight{position:relative}.btn-copy{position:absolute;top:6px;right:6px;display:flex;justify-content:center;align-items:center;width:32px;height:24px;cursor:pointer;border-radius:6px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-appearance:none;color:grey;-webkit-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;opacity:0}.btn-copy:hover{color:#000}.highlight:hover .btn-copy{opacity:1} ================================================ FILE: assets/css/donate.css ================================================ #donate{position:relative;font-family:"Helvetica Neue",Ubuntu,"WenQuanYi Micro Hei",Helvetica,"Hiragino Sans GB","Microsoft YaHei","Wenquanyi Micro Hei","WenQuanYi Micro Hei Mono","WenQuanYi Zen Hei","WenQuanYi Zen Hei","Apple LiGothic Medium",SimHei,"ST Heiti","WenQuanYi Zen Hei Sharp",Arial,sans-serif;-webkit-font-smoothing:antialiased;line-height:1.8em;text-shadow:0 0 1px rgba(255,255,255,.1);height:15em}#donate img{border-width:0}#donate a{color:#000;text-decoration:none;outline:0;border:none}#donate .list,.list li,.list-left li{list-style:none;list-style-type:none;margin:0;padding:0}#donate .pos-f{position:absolute}#donate .left-100{width:100%;height:100%}#donate .blur{-webkit-filter:blur(3px);filter:blur(3px)}#donate .tr3{transition:all .3s}#donate #DonateText{position:absolute;font-size:12px;width:70px;height:70px;line-height:70px;color:#fff;background:#ffd886 url(//cdn.jsdelivr.net/gh/whitebearcode/bearspace/assets/image/like.svg) no-repeat center 10px;background-size:20px;border-radius:35px;text-align:center;left:calc(50% - 120px);top:calc(50% - 60px);transform:rotatez(-15deg)}#donate #donateBox{display:table;left:calc(50% - 150px);top:calc(50% - 15px);background-color:#fff;border:1px solid #ddd;border-radius:6px;width:299px;height:28px;float:left;z-index:1;overflow:hidden}#donate #donateBox li{width:74px;display:table-cell;text-align:center;border-right:1px solid #ddd;background:no-repeat center center;background-color:rgba(204,217,220,.1);background-size:45px;cursor:pointer;overflow:hidden;height:28px;-webkit-filter:grayscale(1);filter:grayscale(1);opacity:.5}#donate #donateBox li:hover{background-color:rgba(204,217,220,.3);-webkit-filter:grayscale(0);filter:grayscale(0);opacity:1}#donate #donateBox>li:last-child{border-width:0}#donate #donateBox a{display:block;height:100%;width:100%}#donate #donateBox #PayPal{background-image:url(//cdn.jsdelivr.net/gh/whitebearcode/bearspace/assets/image/paypal.svg)}#donate #donateBox>#BTC{background-image:url(//cdn.jsdelivr.net/gh/whitebearcode/bearspace/assets/image/bitcoin.svg);line-height:28px}#donate #donateBox>#BTC:hover{overflow:visible}#donate #BTC>button{opacity:0;cursor:pointer}#donate #donateBox #AliPay{background-image:url(//cdn.jsdelivr.net/gh/whitebearcode/bearspace/assets/image/alipay.svg)}#donate #donateBox #WeChat{background-image:url(//cdn.jsdelivr.net/gh/whitebearcode/bearspace/assets/image/wechat.svg)}#donate #QRBox{top:0;left:0;z-index:1;background-color:rgba(255,255,255,.3);display:none;perspective:400px}#donate #MainBox{cursor:pointer;position:absolute;text-align:center;width:200px;height:200px;left:calc(50% - 100px);top:calc(50% - 100px);background:#fff no-repeat center center;background-size:190px;border-radius:6px;box-shadow:0 2px 7px rgba(0,0,0,.3);opacity:0;transition:all 1s ease-in-out;transform-style:preserve-3d;transform-origin:center center;overflow:hidden}#donate #github{width:24px;height:24px;left:calc(50% + 135px);top:calc(50% - 30px);background:no-repeat center center url(/usr/themes/bearsimple/assets/image/github.svg);background-size:contain;opacity:.3;transform:rotatez(15deg)}#donate #ps{color:red;text-align:center;line-height:28px!important;font-size:12px!important}#donate [data-footnote]{position:relative;overflow:hidden}#donate [data-footnote]:hover{overflow:visible}#donate [data-footnote]::before,[data-footnote]::after{position:absolute;transition:all .3s;transform:translate3d(-50%,0,0);opacity:0;left:37px;z-index:10}#donate [data-footnote]::before{content:attr(data-footnote);border-radius:6px;background-color:rgba(100,100,100,.8);color:#fff;height:24px;line-height:24px;padding:0 6px;font-size:12px;white-space:nowrap;top:-24px;left:37px}#donate [data-footnote]::after{content:'';border:5px solid #333;border-color:rgba(100,100,100,.8) transparent transparent transparent;top:0;left:37px}#donate [data-footnote]:hover::before,[data-footnote]:hover::after{opacity:1}#donate [data-footnote]:hover::before,[data-footnote]:hover::after{transform:translate3d(-50%,-7px,0)}#donate #MainBox.showQR{opacity:1;animation-name:showQR;animation-duration:3s;animation-timing-function:ease-in-out;animation-iteration-count:1;animation-fill-mode:forwards;-webkit-animation:showQR 3s ease-in-out 0s 1 normal forwards}@keyframes showQR{from{transform:rotateX(90deg)}8%{opacity:1;transform:rotateX(-60deg)}18%{opacity:1;transform:rotateX(40deg)}34%{opacity:1;transform:rotateX(-28deg)}44%{opacity:1;transform:rotateX(18deg)}58%{opacity:1;transform:rotateX(-12deg)}72%{opacity:1;transform:rotateX(9deg)}88%{opacity:1;transform:rotateX(-5deg)}96%{opacity:1;transform:rotateX(2deg)}to{opacity:1}}#MainBox.hideQR{opacity:1;animation-name:hideQR;animation-duration:.5s;animation-timing-function:ease-in-out;animation-iteration-count:1;animation-fill-mode:forwards;-webkit-animation:hideQR .5s ease-in-out 0s 1 normal forwards}@keyframes hideQR{20%,50%{transform:scale(1.08,1.08);opacity:1}to{opacity:0;transform:rotateZ(40deg) scale(.6,.6)}} ================================================ FILE: assets/css/lxgw/lxgwwenkaigbscreen.css ================================================ /* LXGW WenKai Screen [4] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-4.woff2') format('woff2'); unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e } /* LXGW WenKai Screen [5] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-5.woff2') format('woff2'); unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8 } /* LXGW WenKai Screen [6] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-6.woff2') format('woff2'); unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0 } /* LXGW WenKai Screen [21] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-21.woff2') format('woff2'); unicode-range: U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81, U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff4, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d, U+af34 } /* LXGW WenKai Screen [22] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-22.woff2') format('woff2'); unicode-range: U+9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39 } /* LXGW WenKai Screen [23] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-23.woff2') format('woff2'); unicode-range: U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80, U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9 } /* LXGW WenKai Screen [24] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-24.woff2') format('woff2'); unicode-range: U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d, U+9a80, U+9a83, U+9a85, U+9a87-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9abc, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39 } /* LXGW WenKai Screen [25] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-25.woff2') format('woff2'); unicode-range: U+98c8, U+98cf-98d6, U+98da-98db, U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b } /* LXGW WenKai Screen [26] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-26.woff2') format('woff2'); unicode-range: U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c7 } /* LXGW WenKai Screen [27] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-27.woff2') format('woff2'); unicode-range: U+95b9-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727 } /* LXGW WenKai Screen [28] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-28.woff2') format('woff2'); unicode-range: U+94e7-94ec, U+94ee-94f1, U+94f3, U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8 } /* LXGW WenKai Screen [29] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-29.woff2') format('woff2'); unicode-range: U+9410-941a, U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94e6 } /* LXGW WenKai Screen [30] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-30.woff2') format('woff2'); unicode-range: U+92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea, U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-940f } /* LXGW WenKai Screen [31] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-31.woff2') format('woff2'); unicode-range: U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6 } /* LXGW WenKai Screen [32] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-32.woff2') format('woff2'); unicode-range: U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa, U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a } /* LXGW WenKai Screen [33] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-33.woff2') format('woff2'); unicode-range: U+8e2d-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda } /* LXGW WenKai Screen [34] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-34.woff2') format('woff2'); unicode-range: U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d2e, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e2c } /* LXGW WenKai Screen [35] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-35.woff2') format('woff2'); unicode-range: U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d, U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb3-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac } /* LXGW WenKai Screen [36] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-36.woff2') format('woff2'); unicode-range: U+8a02-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13, U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c } /* LXGW WenKai Screen [37] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-37.woff2') format('woff2'); unicode-range: U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f, U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01 } /* LXGW WenKai Screen [38] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-38.woff2') format('woff2'); unicode-range: U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864 } /* LXGW WenKai Screen [39] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-39.woff2') format('woff2'); unicode-range: U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545, U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df } /* LXGW WenKai Screen [40] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-40.woff2') format('woff2'); unicode-range: U+83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2, U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d } /* LXGW WenKai Screen [41] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-41.woff2') format('woff2'); unicode-range: U+82a9-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6, U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3 } /* LXGW WenKai Screen [42] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-42.woff2') format('woff2'); unicode-range: U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160, U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82a8 } /* LXGW WenKai Screen [43] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-43.woff2') format('woff2'); unicode-range: U+7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014, U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148 } /* LXGW WenKai Screen [44] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-44.woff2') format('woff2'); unicode-range: U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb, U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9 } /* LXGW WenKai Screen [45] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-45.woff2') format('woff2'); unicode-range: U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1-7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4 } /* LXGW WenKai Screen [46] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-46.woff2') format('woff2'); unicode-range: U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7-7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1 } /* LXGW WenKai Screen [47] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-47.woff2') format('woff2'); unicode-range: U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1, U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9 } /* LXGW WenKai Screen [48] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-48.woff2') format('woff2'); unicode-range: U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4, U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1 } /* LXGW WenKai Screen [49] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-49.woff2') format('woff2'); unicode-range: U+797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8 } /* LXGW WenKai Screen [50] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-50.woff2') format('woff2'); unicode-range: U+783e, U+7841-7844, U+7847-7849, U+784b-784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b } /* LXGW WenKai Screen [51] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-51.woff2') format('woff2'); unicode-range: U+770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721-7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c } /* LXGW WenKai Screen [52] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-52.woff2') format('woff2'); unicode-range: U+760a-760e, U+7610-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770e } /* LXGW WenKai Screen [53] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-53.woff2') format('woff2'); unicode-range: U+74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508, U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-7609 } /* LXGW WenKai Screen [54] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-54.woff2') format('woff2'); unicode-range: U+73e7-73ea, U+73ee-73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee } /* LXGW WenKai Screen [55] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-55.woff2') format('woff2'); unicode-range: U+72dd-72df, U+72e1, U+72e5-72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73e6 } /* LXGW WenKai Screen [56] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-56.woff2') format('woff2'); unicode-range: U+719c, U+71a0, U+71a4-71a5, U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db } /* LXGW WenKai Screen [57] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-57.woff2') format('woff2'); unicode-range: U+7005-7006, U+7009, U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198 } /* LXGW WenKai Screen [58] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-58.woff2') format('woff2'); unicode-range: U+6ed8-6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f31-6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe } /* LXGW WenKai Screen [59] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-59.woff2') format('woff2'); unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7 } /* LXGW WenKai Screen [60] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-60.woff2') format('woff2'); unicode-range: U+6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2 } /* LXGW WenKai Screen [61] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-61.woff2') format('woff2'); unicode-range: U+6b85-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae, U+6cb1 } /* LXGW WenKai Screen [62] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-62.woff2') format('woff2'); unicode-range: U+6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b84 } /* LXGW WenKai Screen [63] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-63.woff2') format('woff2'); unicode-range: U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc, U+69fe-6a00 } /* LXGW WenKai Screen [64] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-64.woff2') format('woff2'); unicode-range: U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1, U+68d3, U+68d7, U+68dd, U+68df } /* LXGW WenKai Screen [65] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-65.woff2') format('woff2'); unicode-range: U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a-678d, U+678f } /* LXGW WenKai Screen [66] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-66.woff2') format('woff2'); unicode-range: U+64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630-6631, U+6633-6634, U+6636 } /* LXGW WenKai Screen [67] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-67.woff2') format('woff2'); unicode-range: U+63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0-64f2, U+64f4, U+64f7 } /* LXGW WenKai Screen [68] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-68.woff2') format('woff2'); unicode-range: U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62ce-62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5, U+63b7-63bb } /* LXGW WenKai Screen [69] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-69.woff2') format('woff2'); unicode-range: U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226, U+622c, U+622e-6230, U+6232, U+6238 } /* LXGW WenKai Screen [70] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-70.woff2') format('woff2'); unicode-range: U+5fd1-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec-60ee, U+60f0-60f1, U+60f4, U+60f6 } /* LXGW WenKai Screen [71] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-71.woff2') format('woff2'); unicode-range: U+5ea3-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc, U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd0 } /* LXGW WenKai Screen [72] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-72.woff2') format('woff2'); unicode-range: U+5d32-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96, U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea2 } /* LXGW WenKai Screen [73] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-73.woff2') format('woff2'); unicode-range: U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d27, U+5d2e-5d31 } /* LXGW WenKai Screen [74] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-74.woff2') format('woff2'); unicode-range: U+5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be7, U+5be9, U+5beb-5bec, U+5bee-5bf0, U+5bf2-5bf3 } /* LXGW WenKai Screen [75] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-75.woff2') format('woff2'); unicode-range: U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e, U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1 } /* LXGW WenKai Screen [76] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-76.woff2') format('woff2'); unicode-range: U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968, U+596a, U+596c-596e, U+5977, U+597b-597c } /* LXGW WenKai Screen [77] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-77.woff2') format('woff2'); unicode-range: U+570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-5820, U+5822-5823, U+5825-5826, U+582c, U+582f } /* LXGW WenKai Screen [78] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-78.woff2') format('woff2'); unicode-range: U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709 } /* LXGW WenKai Screen [79] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-79.woff2') format('woff2'); unicode-range: U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3, U+55f5-55f7, U+55fb, U+55fe, U+5600-5601 } /* LXGW WenKai Screen [80] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-80.woff2') format('woff2'); unicode-range: U+53fb-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550f, U+5511-5514, U+5516-5517 } /* LXGW WenKai Screen [81] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-81.woff2') format('woff2'); unicode-range: U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5340, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2, U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa } /* LXGW WenKai Screen [82] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-82.woff2') format('woff2'); unicode-range: U+5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287, U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a } /* LXGW WenKai Screen [83] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-83.woff2') format('woff2'); unicode-range: U+4fe3-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102, U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f } /* LXGW WenKai Screen [84] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-84.woff2') format('woff2'); unicode-range: U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0-4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2 } /* LXGW WenKai Screen [85] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-85.woff2') format('woff2'); unicode-range: U+3127-3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2-4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6 } /* LXGW WenKai Screen [86] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-86.woff2') format('woff2'); unicode-range: U+279c, U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126 } /* LXGW WenKai Screen [87] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-87.woff2') format('woff2'); unicode-range: U+2650-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796 } /* LXGW WenKai Screen [88] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-88.woff2') format('woff2'); unicode-range: U+254b, U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-264f } /* LXGW WenKai Screen [89] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-89.woff2') format('woff2'); unicode-range: U+23e9, U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a } /* LXGW WenKai Screen [90] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-90.woff2') format('woff2'); unicode-range: U+207b-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0 } /* LXGW WenKai Screen [91] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-91.woff2') format('woff2'); unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2027-2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a } /* LXGW WenKai Screen [97] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-97.woff2') format('woff2'); unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579 } /* LXGW WenKai Screen [98] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-98.woff2') format('woff2'); unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab } /* LXGW WenKai Screen [99] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-99.woff2') format('woff2'); unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175 } /* LXGW WenKai Screen [100] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-100.woff2') format('woff2'); unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+560e, U+5618, U+565c, U+56bc, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ac9, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+620c, U+62c7, U+62ed, U+6320, U+6345, U+6390, U+63b0, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+72e9, U+733f, U+7396, U+739f, U+7459-745a, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8aaa, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+9a6f, U+9a8b, U+9ab7, U+9ac5, U+9e25, U+e608, U+ff06, U+ff14-ff16 } /* LXGW WenKai Screen [101] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-101.woff2') format('woff2'); unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+2463, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+516e, U+51c4, U+5225, U+5364, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+5662, U+5669, U+566c, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+6273, U+62f7, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6ed5, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+7409, U+7422, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+803f, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8c41, U+8cec, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9704, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+9f9a, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e, U+ff3d } /* LXGW WenKai Screen [102] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-102.woff2') format('woff2'); unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+60df, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+6813, U+6869, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+73fe, U+7405, U+7455, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+8046, U+80fa, U+81b3, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+904e, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+9119, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+f012b } /* LXGW WenKai Screen [103] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-103.woff2') format('woff2'); unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5a1f, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+5f6c, U+603c, U+609a, U+6168, U+61c8, U+6236, U+62d0, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+6703, U+67da, U+67ec, U+6816, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+7410, U+7426, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8d50, U+8e72, U+8f9c, U+900d, U+904b, U+9063, U+90a2, U+90b9, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+9631, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd } /* LXGW WenKai Screen [104] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-104.woff2') format('woff2'); unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a49, U+5ac2, U+5bb0, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f8c, U+608d, U+611b, U+6127, U+62a0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6e9c, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+8328, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d63, U+8e81, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9540, U+9610, U+9699, U+96c7, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b } /* LXGW WenKai Screen [105] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-105.woff2') format('woff2'); unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+300f, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54b1, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+61be, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6380, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82ad, U+82bd, U+8305, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+958b, U+9600, U+9640, U+96b6, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f } /* LXGW WenKai Screen [106] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-106.woff2') format('woff2'); unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+8304, U+8393, U+83b9, U+83ca, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95ef, U+95f7, U+9706, U+9709, U+9774, U+9887, U+98a0, U+9e64, U+9f9f, U+e601, U+e603 } /* LXGW WenKai Screen [107] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-107.woff2') format('woff2'); unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+886c, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95fa, U+95fd, U+964c, U+96c0, U+971c, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9b4f, U+9e2d, U+9f0e, U+e602, U+e604-e605, U+ff5c } /* LXGW WenKai Screen [108] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-108.woff2') format('woff2'); unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+85aa, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+90aa, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+9675, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715 } /* LXGW WenKai Screen [109] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-109.woff2') format('woff2'); unicode-range: U+a5, U+2022, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5 } /* LXGW WenKai Screen [110] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-110.woff2') format('woff2'); unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d } /* LXGW WenKai Screen [111] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-111.woff2') format('woff2'); unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e } /* LXGW WenKai Screen [112] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-112.woff2') format('woff2'); unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8 } /* LXGW WenKai Screen [113] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-113.woff2') format('woff2'); unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4ee4, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50 } /* LXGW WenKai Screen [114] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-114.woff2') format('woff2'); unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6740, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c } /* LXGW WenKai Screen [115] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-115.woff2') format('woff2'); unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b63, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b } /* LXGW WenKai Screen [116] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-116.woff2') format('woff2'); unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6d4b, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99 } /* LXGW WenKai Screen [117] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-117.woff2') format('woff2'); unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53ea, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f } /* LXGW WenKai Screen [118] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-118.woff2') format('woff2'); unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e38, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09 } /* LXGW WenKai Screen [119] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreen-subset-119.woff2') format('woff2'); unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a } ================================================ FILE: assets/css/lxgw/lxgwwenkaigbscreenr.css ================================================ /* LXGW WenKai Screen R [4] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-4.woff2') format('woff2'); unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e } /* LXGW WenKai Screen R [5] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-5.woff2') format('woff2'); unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8 } /* LXGW WenKai Screen R [6] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-6.woff2') format('woff2'); unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0 } /* LXGW WenKai Screen R [21] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-21.woff2') format('woff2'); unicode-range: U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81, U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff4, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d, U+af34 } /* LXGW WenKai Screen R [22] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-22.woff2') format('woff2'); unicode-range: U+9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39 } /* LXGW WenKai Screen R [23] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-23.woff2') format('woff2'); unicode-range: U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80, U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9 } /* LXGW WenKai Screen R [24] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-24.woff2') format('woff2'); unicode-range: U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d, U+9a80, U+9a83, U+9a85, U+9a87-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9abc, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39 } /* LXGW WenKai Screen R [25] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-25.woff2') format('woff2'); unicode-range: U+98c8, U+98cf-98d6, U+98da-98db, U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b } /* LXGW WenKai Screen R [26] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-26.woff2') format('woff2'); unicode-range: U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c7 } /* LXGW WenKai Screen R [27] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-27.woff2') format('woff2'); unicode-range: U+95b9-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727 } /* LXGW WenKai Screen R [28] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-28.woff2') format('woff2'); unicode-range: U+94e7-94ec, U+94ee-94f1, U+94f3, U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8 } /* LXGW WenKai Screen R [29] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-29.woff2') format('woff2'); unicode-range: U+9410-941a, U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94e6 } /* LXGW WenKai Screen R [30] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-30.woff2') format('woff2'); unicode-range: U+92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea, U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-940f } /* LXGW WenKai Screen R [31] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-31.woff2') format('woff2'); unicode-range: U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6 } /* LXGW WenKai Screen R [32] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-32.woff2') format('woff2'); unicode-range: U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa, U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a } /* LXGW WenKai Screen R [33] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-33.woff2') format('woff2'); unicode-range: U+8e2d-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda } /* LXGW WenKai Screen R [34] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-34.woff2') format('woff2'); unicode-range: U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d2e, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e2c } /* LXGW WenKai Screen R [35] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-35.woff2') format('woff2'); unicode-range: U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d, U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb3-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac } /* LXGW WenKai Screen R [36] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-36.woff2') format('woff2'); unicode-range: U+8a02-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13, U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c } /* LXGW WenKai Screen R [37] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-37.woff2') format('woff2'); unicode-range: U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f, U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01 } /* LXGW WenKai Screen R [38] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-38.woff2') format('woff2'); unicode-range: U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864 } /* LXGW WenKai Screen R [39] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-39.woff2') format('woff2'); unicode-range: U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545, U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df } /* LXGW WenKai Screen R [40] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-40.woff2') format('woff2'); unicode-range: U+83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2, U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d } /* LXGW WenKai Screen R [41] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-41.woff2') format('woff2'); unicode-range: U+82a9-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6, U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3 } /* LXGW WenKai Screen R [42] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-42.woff2') format('woff2'); unicode-range: U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160, U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82a8 } /* LXGW WenKai Screen R [43] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-43.woff2') format('woff2'); unicode-range: U+7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014, U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148 } /* LXGW WenKai Screen R [44] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-44.woff2') format('woff2'); unicode-range: U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb, U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9 } /* LXGW WenKai Screen R [45] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-45.woff2') format('woff2'); unicode-range: U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1-7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4 } /* LXGW WenKai Screen R [46] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-46.woff2') format('woff2'); unicode-range: U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7-7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1 } /* LXGW WenKai Screen R [47] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-47.woff2') format('woff2'); unicode-range: U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1, U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9 } /* LXGW WenKai Screen R [48] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-48.woff2') format('woff2'); unicode-range: U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4, U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1 } /* LXGW WenKai Screen R [49] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-49.woff2') format('woff2'); unicode-range: U+797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8 } /* LXGW WenKai Screen R [50] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-50.woff2') format('woff2'); unicode-range: U+783e, U+7841-7844, U+7847-7849, U+784b-784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b } /* LXGW WenKai Screen R [51] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-51.woff2') format('woff2'); unicode-range: U+770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721-7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c } /* LXGW WenKai Screen R [52] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-52.woff2') format('woff2'); unicode-range: U+760a-760e, U+7610-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770e } /* LXGW WenKai Screen R [53] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-53.woff2') format('woff2'); unicode-range: U+74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508, U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-7609 } /* LXGW WenKai Screen R [54] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-54.woff2') format('woff2'); unicode-range: U+73e7-73ea, U+73ee-73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee } /* LXGW WenKai Screen R [55] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-55.woff2') format('woff2'); unicode-range: U+72dd-72df, U+72e1, U+72e5-72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73e6 } /* LXGW WenKai Screen R [56] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-56.woff2') format('woff2'); unicode-range: U+719c, U+71a0, U+71a4-71a5, U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db } /* LXGW WenKai Screen R [57] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-57.woff2') format('woff2'); unicode-range: U+7005-7006, U+7009, U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198 } /* LXGW WenKai Screen R [58] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-58.woff2') format('woff2'); unicode-range: U+6ed8-6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f31-6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe } /* LXGW WenKai Screen R [59] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-59.woff2') format('woff2'); unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7 } /* LXGW WenKai Screen R [60] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-60.woff2') format('woff2'); unicode-range: U+6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2 } /* LXGW WenKai Screen R [61] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-61.woff2') format('woff2'); unicode-range: U+6b85-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae, U+6cb1 } /* LXGW WenKai Screen R [62] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-62.woff2') format('woff2'); unicode-range: U+6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b84 } /* LXGW WenKai Screen R [63] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-63.woff2') format('woff2'); unicode-range: U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc, U+69fe-6a00 } /* LXGW WenKai Screen R [64] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-64.woff2') format('woff2'); unicode-range: U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1, U+68d3, U+68d7, U+68dd, U+68df } /* LXGW WenKai Screen R [65] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-65.woff2') format('woff2'); unicode-range: U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a-678d, U+678f } /* LXGW WenKai Screen R [66] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-66.woff2') format('woff2'); unicode-range: U+64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630-6631, U+6633-6634, U+6636 } /* LXGW WenKai Screen R [67] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-67.woff2') format('woff2'); unicode-range: U+63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0-64f2, U+64f4, U+64f7 } /* LXGW WenKai Screen R [68] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-68.woff2') format('woff2'); unicode-range: U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62ce-62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5, U+63b7-63bb } /* LXGW WenKai Screen R [69] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-69.woff2') format('woff2'); unicode-range: U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226, U+622c, U+622e-6230, U+6232, U+6238 } /* LXGW WenKai Screen R [70] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-70.woff2') format('woff2'); unicode-range: U+5fd1-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec-60ee, U+60f0-60f1, U+60f4, U+60f6 } /* LXGW WenKai Screen R [71] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-71.woff2') format('woff2'); unicode-range: U+5ea3-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc, U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd0 } /* LXGW WenKai Screen R [72] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-72.woff2') format('woff2'); unicode-range: U+5d32-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96, U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea2 } /* LXGW WenKai Screen R [73] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-73.woff2') format('woff2'); unicode-range: U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d27, U+5d2e-5d31 } /* LXGW WenKai Screen R [74] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-74.woff2') format('woff2'); unicode-range: U+5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be7, U+5be9, U+5beb-5bec, U+5bee-5bf0, U+5bf2-5bf3 } /* LXGW WenKai Screen R [75] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-75.woff2') format('woff2'); unicode-range: U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e, U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1 } /* LXGW WenKai Screen R [76] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-76.woff2') format('woff2'); unicode-range: U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968, U+596a, U+596c-596e, U+5977, U+597b-597c } /* LXGW WenKai Screen R [77] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-77.woff2') format('woff2'); unicode-range: U+570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-5820, U+5822-5823, U+5825-5826, U+582c, U+582f } /* LXGW WenKai Screen R [78] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-78.woff2') format('woff2'); unicode-range: U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709 } /* LXGW WenKai Screen R [79] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-79.woff2') format('woff2'); unicode-range: U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3, U+55f5-55f7, U+55fb, U+55fe, U+5600-5601 } /* LXGW WenKai Screen R [80] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-80.woff2') format('woff2'); unicode-range: U+53fb-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550f, U+5511-5514, U+5516-5517 } /* LXGW WenKai Screen R [81] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-81.woff2') format('woff2'); unicode-range: U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5340, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2, U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa } /* LXGW WenKai Screen R [82] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-82.woff2') format('woff2'); unicode-range: U+5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287, U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a } /* LXGW WenKai Screen R [83] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-83.woff2') format('woff2'); unicode-range: U+4fe3-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102, U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f } /* LXGW WenKai Screen R [84] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-84.woff2') format('woff2'); unicode-range: U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0-4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2 } /* LXGW WenKai Screen R [85] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-85.woff2') format('woff2'); unicode-range: U+3127-3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2-4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6 } /* LXGW WenKai Screen R [86] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-86.woff2') format('woff2'); unicode-range: U+279c, U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126 } /* LXGW WenKai Screen R [87] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-87.woff2') format('woff2'); unicode-range: U+2650-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796 } /* LXGW WenKai Screen R [88] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-88.woff2') format('woff2'); unicode-range: U+254b, U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-264f } /* LXGW WenKai Screen R [89] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-89.woff2') format('woff2'); unicode-range: U+23e9, U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a } /* LXGW WenKai Screen R [90] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-90.woff2') format('woff2'); unicode-range: U+207b-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0 } /* LXGW WenKai Screen R [91] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-91.woff2') format('woff2'); unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2027-2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a } /* LXGW WenKai Screen R [97] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-97.woff2') format('woff2'); unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579 } /* LXGW WenKai Screen R [98] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-98.woff2') format('woff2'); unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab } /* LXGW WenKai Screen R [99] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-99.woff2') format('woff2'); unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175 } /* LXGW WenKai Screen R [100] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-100.woff2') format('woff2'); unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+560e, U+5618, U+565c, U+56bc, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ac9, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+620c, U+62c7, U+62ed, U+6320, U+6345, U+6390, U+63b0, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+72e9, U+733f, U+7396, U+739f, U+7459-745a, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8aaa, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+9a6f, U+9a8b, U+9ab7, U+9ac5, U+9e25, U+e608, U+ff06, U+ff14-ff16 } /* LXGW WenKai Screen R [101] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-101.woff2') format('woff2'); unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+2463, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+516e, U+51c4, U+5225, U+5364, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+5662, U+5669, U+566c, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+6273, U+62f7, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6ed5, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+7409, U+7422, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+803f, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8c41, U+8cec, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9704, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+9f9a, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e, U+ff3d } /* LXGW WenKai Screen R [102] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-102.woff2') format('woff2'); unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+60df, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+6813, U+6869, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+73fe, U+7405, U+7455, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+8046, U+80fa, U+81b3, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+904e, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+9119, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+f012b } /* LXGW WenKai Screen R [103] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-103.woff2') format('woff2'); unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5a1f, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+5f6c, U+603c, U+609a, U+6168, U+61c8, U+6236, U+62d0, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+6703, U+67da, U+67ec, U+6816, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+7410, U+7426, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8d50, U+8e72, U+8f9c, U+900d, U+904b, U+9063, U+90a2, U+90b9, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+9631, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd } /* LXGW WenKai Screen R [104] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-104.woff2') format('woff2'); unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a49, U+5ac2, U+5bb0, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f8c, U+608d, U+611b, U+6127, U+62a0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6e9c, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+8328, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d63, U+8e81, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9540, U+9610, U+9699, U+96c7, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b } /* LXGW WenKai Screen R [105] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-105.woff2') format('woff2'); unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+300f, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54b1, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+61be, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6380, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82ad, U+82bd, U+8305, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+958b, U+9600, U+9640, U+96b6, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f } /* LXGW WenKai Screen R [106] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-106.woff2') format('woff2'); unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+8304, U+8393, U+83b9, U+83ca, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95ef, U+95f7, U+9706, U+9709, U+9774, U+9887, U+98a0, U+9e64, U+9f9f, U+e601, U+e603 } /* LXGW WenKai Screen R [107] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-107.woff2') format('woff2'); unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+886c, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95fa, U+95fd, U+964c, U+96c0, U+971c, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9b4f, U+9e2d, U+9f0e, U+e602, U+e604-e605, U+ff5c } /* LXGW WenKai Screen R [108] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-108.woff2') format('woff2'); unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+85aa, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+90aa, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+9675, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715 } /* LXGW WenKai Screen R [109] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-109.woff2') format('woff2'); unicode-range: U+a5, U+2022, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5 } /* LXGW WenKai Screen R [110] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-110.woff2') format('woff2'); unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d } /* LXGW WenKai Screen R [111] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-111.woff2') format('woff2'); unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e } /* LXGW WenKai Screen R [112] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-112.woff2') format('woff2'); unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8 } /* LXGW WenKai Screen R [113] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-113.woff2') format('woff2'); unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4ee4, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50 } /* LXGW WenKai Screen R [114] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-114.woff2') format('woff2'); unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6740, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c } /* LXGW WenKai Screen R [115] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-115.woff2') format('woff2'); unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b63, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b } /* LXGW WenKai Screen R [116] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-116.woff2') format('woff2'); unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6d4b, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99 } /* LXGW WenKai Screen R [117] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-117.woff2') format('woff2'); unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53ea, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f } /* LXGW WenKai Screen R [118] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-118.woff2') format('woff2'); unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e38, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09 } /* LXGW WenKai Screen R [119] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaigbscreenr-subset-119.woff2') format('woff2'); unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a } ================================================ FILE: assets/css/lxgw/lxgwwenkaiscreen.css ================================================ /* LXGW WenKai Screen [4] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-4.woff2') format('woff2'); unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e } /* LXGW WenKai Screen [5] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-5.woff2') format('woff2'); unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8 } /* LXGW WenKai Screen [6] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-6.woff2') format('woff2'); unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0 } /* LXGW WenKai Screen [21] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-21.woff2') format('woff2'); unicode-range: U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81, U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff4, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d, U+af34 } /* LXGW WenKai Screen [22] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-22.woff2') format('woff2'); unicode-range: U+9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39 } /* LXGW WenKai Screen [23] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-23.woff2') format('woff2'); unicode-range: U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80, U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9 } /* LXGW WenKai Screen [24] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-24.woff2') format('woff2'); unicode-range: U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d, U+9a80, U+9a83, U+9a85, U+9a87-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9abc, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39 } /* LXGW WenKai Screen [25] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-25.woff2') format('woff2'); unicode-range: U+98c8, U+98cf-98d6, U+98da-98db, U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b } /* LXGW WenKai Screen [26] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-26.woff2') format('woff2'); unicode-range: U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c7 } /* LXGW WenKai Screen [27] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-27.woff2') format('woff2'); unicode-range: U+95b9-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727 } /* LXGW WenKai Screen [28] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-28.woff2') format('woff2'); unicode-range: U+94e7-94ec, U+94ee-94f1, U+94f3, U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8 } /* LXGW WenKai Screen [29] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-29.woff2') format('woff2'); unicode-range: U+9410-941a, U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94e6 } /* LXGW WenKai Screen [30] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-30.woff2') format('woff2'); unicode-range: U+92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea, U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-940f } /* LXGW WenKai Screen [31] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-31.woff2') format('woff2'); unicode-range: U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6 } /* LXGW WenKai Screen [32] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-32.woff2') format('woff2'); unicode-range: U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa, U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a } /* LXGW WenKai Screen [33] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-33.woff2') format('woff2'); unicode-range: U+8e2d-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda } /* LXGW WenKai Screen [34] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-34.woff2') format('woff2'); unicode-range: U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d2e, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e2c } /* LXGW WenKai Screen [35] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-35.woff2') format('woff2'); unicode-range: U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d, U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb3-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac } /* LXGW WenKai Screen [36] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-36.woff2') format('woff2'); unicode-range: U+8a02-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13, U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c } /* LXGW WenKai Screen [37] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-37.woff2') format('woff2'); unicode-range: U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f, U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01 } /* LXGW WenKai Screen [38] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-38.woff2') format('woff2'); unicode-range: U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864 } /* LXGW WenKai Screen [39] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-39.woff2') format('woff2'); unicode-range: U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545, U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df } /* LXGW WenKai Screen [40] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-40.woff2') format('woff2'); unicode-range: U+83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2, U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d } /* LXGW WenKai Screen [41] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-41.woff2') format('woff2'); unicode-range: U+82a9-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6, U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3 } /* LXGW WenKai Screen [42] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-42.woff2') format('woff2'); unicode-range: U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160, U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82a8 } /* LXGW WenKai Screen [43] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-43.woff2') format('woff2'); unicode-range: U+7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014, U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148 } /* LXGW WenKai Screen [44] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-44.woff2') format('woff2'); unicode-range: U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb, U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9 } /* LXGW WenKai Screen [45] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-45.woff2') format('woff2'); unicode-range: U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1-7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4 } /* LXGW WenKai Screen [46] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-46.woff2') format('woff2'); unicode-range: U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7-7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1 } /* LXGW WenKai Screen [47] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-47.woff2') format('woff2'); unicode-range: U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1, U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9 } /* LXGW WenKai Screen [48] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-48.woff2') format('woff2'); unicode-range: U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4, U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1 } /* LXGW WenKai Screen [49] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-49.woff2') format('woff2'); unicode-range: U+797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8 } /* LXGW WenKai Screen [50] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-50.woff2') format('woff2'); unicode-range: U+783e, U+7841-7844, U+7847-7849, U+784b-784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b } /* LXGW WenKai Screen [51] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-51.woff2') format('woff2'); unicode-range: U+770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721-7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c } /* LXGW WenKai Screen [52] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-52.woff2') format('woff2'); unicode-range: U+760a-760e, U+7610-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770e } /* LXGW WenKai Screen [53] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-53.woff2') format('woff2'); unicode-range: U+74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508, U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-7609 } /* LXGW WenKai Screen [54] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-54.woff2') format('woff2'); unicode-range: U+73e7-73ea, U+73ee-73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee } /* LXGW WenKai Screen [55] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-55.woff2') format('woff2'); unicode-range: U+72dd-72df, U+72e1, U+72e5-72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73e6 } /* LXGW WenKai Screen [56] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-56.woff2') format('woff2'); unicode-range: U+719c, U+71a0, U+71a4-71a5, U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db } /* LXGW WenKai Screen [57] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-57.woff2') format('woff2'); unicode-range: U+7005-7006, U+7009, U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198 } /* LXGW WenKai Screen [58] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-58.woff2') format('woff2'); unicode-range: U+6ed8-6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f31-6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe } /* LXGW WenKai Screen [59] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-59.woff2') format('woff2'); unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7 } /* LXGW WenKai Screen [60] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-60.woff2') format('woff2'); unicode-range: U+6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2 } /* LXGW WenKai Screen [61] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-61.woff2') format('woff2'); unicode-range: U+6b85-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae, U+6cb1 } /* LXGW WenKai Screen [62] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-62.woff2') format('woff2'); unicode-range: U+6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b84 } /* LXGW WenKai Screen [63] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-63.woff2') format('woff2'); unicode-range: U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc, U+69fe-6a00 } /* LXGW WenKai Screen [64] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-64.woff2') format('woff2'); unicode-range: U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1, U+68d3, U+68d7, U+68dd, U+68df } /* LXGW WenKai Screen [65] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-65.woff2') format('woff2'); unicode-range: U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a-678d, U+678f } /* LXGW WenKai Screen [66] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-66.woff2') format('woff2'); unicode-range: U+64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630-6631, U+6633-6634, U+6636 } /* LXGW WenKai Screen [67] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-67.woff2') format('woff2'); unicode-range: U+63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0-64f2, U+64f4, U+64f7 } /* LXGW WenKai Screen [68] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-68.woff2') format('woff2'); unicode-range: U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62ce-62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5, U+63b7-63bb } /* LXGW WenKai Screen [69] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-69.woff2') format('woff2'); unicode-range: U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226, U+622c, U+622e-6230, U+6232, U+6238 } /* LXGW WenKai Screen [70] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-70.woff2') format('woff2'); unicode-range: U+5fd1-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec-60ee, U+60f0-60f1, U+60f4, U+60f6 } /* LXGW WenKai Screen [71] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-71.woff2') format('woff2'); unicode-range: U+5ea3-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc, U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd0 } /* LXGW WenKai Screen [72] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-72.woff2') format('woff2'); unicode-range: U+5d32-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96, U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea2 } /* LXGW WenKai Screen [73] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-73.woff2') format('woff2'); unicode-range: U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d27, U+5d2e-5d31 } /* LXGW WenKai Screen [74] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-74.woff2') format('woff2'); unicode-range: U+5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be7, U+5be9, U+5beb-5bec, U+5bee-5bf0, U+5bf2-5bf3 } /* LXGW WenKai Screen [75] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-75.woff2') format('woff2'); unicode-range: U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e, U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1 } /* LXGW WenKai Screen [76] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-76.woff2') format('woff2'); unicode-range: U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968, U+596a, U+596c-596e, U+5977, U+597b-597c } /* LXGW WenKai Screen [77] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-77.woff2') format('woff2'); unicode-range: U+570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-5820, U+5822-5823, U+5825-5826, U+582c, U+582f } /* LXGW WenKai Screen [78] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-78.woff2') format('woff2'); unicode-range: U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709 } /* LXGW WenKai Screen [79] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-79.woff2') format('woff2'); unicode-range: U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3, U+55f5-55f7, U+55fb, U+55fe, U+5600-5601 } /* LXGW WenKai Screen [80] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-80.woff2') format('woff2'); unicode-range: U+53fb-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550f, U+5511-5514, U+5516-5517 } /* LXGW WenKai Screen [81] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-81.woff2') format('woff2'); unicode-range: U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5340, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2, U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa } /* LXGW WenKai Screen [82] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-82.woff2') format('woff2'); unicode-range: U+5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287, U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a } /* LXGW WenKai Screen [83] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-83.woff2') format('woff2'); unicode-range: U+4fe3-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102, U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f } /* LXGW WenKai Screen [84] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-84.woff2') format('woff2'); unicode-range: U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0-4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2 } /* LXGW WenKai Screen [85] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-85.woff2') format('woff2'); unicode-range: U+3127-3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2-4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6 } /* LXGW WenKai Screen [86] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-86.woff2') format('woff2'); unicode-range: U+279c, U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126 } /* LXGW WenKai Screen [87] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-87.woff2') format('woff2'); unicode-range: U+2650-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796 } /* LXGW WenKai Screen [88] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-88.woff2') format('woff2'); unicode-range: U+254b, U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-264f } /* LXGW WenKai Screen [89] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-89.woff2') format('woff2'); unicode-range: U+23e9, U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a } /* LXGW WenKai Screen [90] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-90.woff2') format('woff2'); unicode-range: U+207b-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0 } /* LXGW WenKai Screen [91] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-91.woff2') format('woff2'); unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2027-2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a } /* LXGW WenKai Screen [97] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-97.woff2') format('woff2'); unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579 } /* LXGW WenKai Screen [98] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-98.woff2') format('woff2'); unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab } /* LXGW WenKai Screen [99] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-99.woff2') format('woff2'); unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175 } /* LXGW WenKai Screen [100] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-100.woff2') format('woff2'); unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+560e, U+5618, U+565c, U+56bc, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ac9, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+620c, U+62c7, U+62ed, U+6320, U+6345, U+6390, U+63b0, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+72e9, U+733f, U+7396, U+739f, U+7459-745a, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8aaa, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+9a6f, U+9a8b, U+9ab7, U+9ac5, U+9e25, U+e608, U+ff06, U+ff14-ff16 } /* LXGW WenKai Screen [101] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-101.woff2') format('woff2'); unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+2463, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+516e, U+51c4, U+5225, U+5364, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+5662, U+5669, U+566c, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+6273, U+62f7, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6ed5, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+7409, U+7422, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+803f, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8c41, U+8cec, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9704, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+9f9a, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e, U+ff3d } /* LXGW WenKai Screen [102] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-102.woff2') format('woff2'); unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+60df, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+6813, U+6869, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+73fe, U+7405, U+7455, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+8046, U+80fa, U+81b3, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+904e, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+9119, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+f012b } /* LXGW WenKai Screen [103] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-103.woff2') format('woff2'); unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5a1f, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+5f6c, U+603c, U+609a, U+6168, U+61c8, U+6236, U+62d0, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+6703, U+67da, U+67ec, U+6816, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+7410, U+7426, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8d50, U+8e72, U+8f9c, U+900d, U+904b, U+9063, U+90a2, U+90b9, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+9631, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd } /* LXGW WenKai Screen [104] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-104.woff2') format('woff2'); unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a49, U+5ac2, U+5bb0, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f8c, U+608d, U+611b, U+6127, U+62a0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6e9c, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+8328, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d63, U+8e81, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9540, U+9610, U+9699, U+96c7, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b } /* LXGW WenKai Screen [105] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-105.woff2') format('woff2'); unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+300f, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54b1, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+61be, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6380, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82ad, U+82bd, U+8305, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+958b, U+9600, U+9640, U+96b6, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f } /* LXGW WenKai Screen [106] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-106.woff2') format('woff2'); unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+8304, U+8393, U+83b9, U+83ca, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95ef, U+95f7, U+9706, U+9709, U+9774, U+9887, U+98a0, U+9e64, U+9f9f, U+e601, U+e603 } /* LXGW WenKai Screen [107] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-107.woff2') format('woff2'); unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+886c, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95fa, U+95fd, U+964c, U+96c0, U+971c, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9b4f, U+9e2d, U+9f0e, U+e602, U+e604-e605, U+ff5c } /* LXGW WenKai Screen [108] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-108.woff2') format('woff2'); unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+85aa, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+90aa, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+9675, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715 } /* LXGW WenKai Screen [109] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-109.woff2') format('woff2'); unicode-range: U+a5, U+2022, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5 } /* LXGW WenKai Screen [110] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-110.woff2') format('woff2'); unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d } /* LXGW WenKai Screen [111] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-111.woff2') format('woff2'); unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e } /* LXGW WenKai Screen [112] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-112.woff2') format('woff2'); unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8 } /* LXGW WenKai Screen [113] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-113.woff2') format('woff2'); unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4ee4, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50 } /* LXGW WenKai Screen [114] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-114.woff2') format('woff2'); unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6740, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c } /* LXGW WenKai Screen [115] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-115.woff2') format('woff2'); unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b63, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b } /* LXGW WenKai Screen [116] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-116.woff2') format('woff2'); unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6d4b, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99 } /* LXGW WenKai Screen [117] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-117.woff2') format('woff2'); unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53ea, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f } /* LXGW WenKai Screen [118] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-118.woff2') format('woff2'); unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e38, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09 } /* LXGW WenKai Screen [119] */ @font-face { font-family: 'LXGW WenKai Screen'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreen-subset-119.woff2') format('woff2'); unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a } ================================================ FILE: assets/css/lxgw/lxgwwenkaiscreenr.css ================================================ /* LXGW WenKai Screen R [4] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-4.woff2') format('woff2'); unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e } /* LXGW WenKai Screen R [5] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-5.woff2') format('woff2'); unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8 } /* LXGW WenKai Screen R [6] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-6.woff2') format('woff2'); unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0 } /* LXGW WenKai Screen R [21] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-21.woff2') format('woff2'); unicode-range: U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81, U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff4, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d, U+af34 } /* LXGW WenKai Screen R [22] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-22.woff2') format('woff2'); unicode-range: U+9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39 } /* LXGW WenKai Screen R [23] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-23.woff2') format('woff2'); unicode-range: U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80, U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9 } /* LXGW WenKai Screen R [24] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-24.woff2') format('woff2'); unicode-range: U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d, U+9a80, U+9a83, U+9a85, U+9a87-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9abc, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39 } /* LXGW WenKai Screen R [25] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-25.woff2') format('woff2'); unicode-range: U+98c8, U+98cf-98d6, U+98da-98db, U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b } /* LXGW WenKai Screen R [26] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-26.woff2') format('woff2'); unicode-range: U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c7 } /* LXGW WenKai Screen R [27] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-27.woff2') format('woff2'); unicode-range: U+95b9-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727 } /* LXGW WenKai Screen R [28] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-28.woff2') format('woff2'); unicode-range: U+94e7-94ec, U+94ee-94f1, U+94f3, U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8 } /* LXGW WenKai Screen R [29] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-29.woff2') format('woff2'); unicode-range: U+9410-941a, U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94e6 } /* LXGW WenKai Screen R [30] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-30.woff2') format('woff2'); unicode-range: U+92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea, U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-940f } /* LXGW WenKai Screen R [31] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-31.woff2') format('woff2'); unicode-range: U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6 } /* LXGW WenKai Screen R [32] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-32.woff2') format('woff2'); unicode-range: U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa, U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a } /* LXGW WenKai Screen R [33] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-33.woff2') format('woff2'); unicode-range: U+8e2d-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda } /* LXGW WenKai Screen R [34] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-34.woff2') format('woff2'); unicode-range: U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d2e, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e2c } /* LXGW WenKai Screen R [35] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-35.woff2') format('woff2'); unicode-range: U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d, U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb3-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac } /* LXGW WenKai Screen R [36] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-36.woff2') format('woff2'); unicode-range: U+8a02-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13, U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c } /* LXGW WenKai Screen R [37] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-37.woff2') format('woff2'); unicode-range: U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f, U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01 } /* LXGW WenKai Screen R [38] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-38.woff2') format('woff2'); unicode-range: U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864 } /* LXGW WenKai Screen R [39] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-39.woff2') format('woff2'); unicode-range: U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545, U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df } /* LXGW WenKai Screen R [40] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-40.woff2') format('woff2'); unicode-range: U+83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2, U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d } /* LXGW WenKai Screen R [41] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-41.woff2') format('woff2'); unicode-range: U+82a9-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6, U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3 } /* LXGW WenKai Screen R [42] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-42.woff2') format('woff2'); unicode-range: U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160, U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82a8 } /* LXGW WenKai Screen R [43] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-43.woff2') format('woff2'); unicode-range: U+7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014, U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148 } /* LXGW WenKai Screen R [44] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-44.woff2') format('woff2'); unicode-range: U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb, U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9 } /* LXGW WenKai Screen R [45] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-45.woff2') format('woff2'); unicode-range: U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1-7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4 } /* LXGW WenKai Screen R [46] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-46.woff2') format('woff2'); unicode-range: U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7-7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1 } /* LXGW WenKai Screen R [47] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-47.woff2') format('woff2'); unicode-range: U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1, U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9 } /* LXGW WenKai Screen R [48] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-48.woff2') format('woff2'); unicode-range: U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4, U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1 } /* LXGW WenKai Screen R [49] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-49.woff2') format('woff2'); unicode-range: U+797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8 } /* LXGW WenKai Screen R [50] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-50.woff2') format('woff2'); unicode-range: U+783e, U+7841-7844, U+7847-7849, U+784b-784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b } /* LXGW WenKai Screen R [51] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-51.woff2') format('woff2'); unicode-range: U+770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721-7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c } /* LXGW WenKai Screen R [52] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-52.woff2') format('woff2'); unicode-range: U+760a-760e, U+7610-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770e } /* LXGW WenKai Screen R [53] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-53.woff2') format('woff2'); unicode-range: U+74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508, U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-7609 } /* LXGW WenKai Screen R [54] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-54.woff2') format('woff2'); unicode-range: U+73e7-73ea, U+73ee-73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee } /* LXGW WenKai Screen R [55] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-55.woff2') format('woff2'); unicode-range: U+72dd-72df, U+72e1, U+72e5-72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73e6 } /* LXGW WenKai Screen R [56] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-56.woff2') format('woff2'); unicode-range: U+719c, U+71a0, U+71a4-71a5, U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db } /* LXGW WenKai Screen R [57] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-57.woff2') format('woff2'); unicode-range: U+7005-7006, U+7009, U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198 } /* LXGW WenKai Screen R [58] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-58.woff2') format('woff2'); unicode-range: U+6ed8-6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f31-6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe } /* LXGW WenKai Screen R [59] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-59.woff2') format('woff2'); unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7 } /* LXGW WenKai Screen R [60] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-60.woff2') format('woff2'); unicode-range: U+6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2 } /* LXGW WenKai Screen R [61] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-61.woff2') format('woff2'); unicode-range: U+6b85-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae, U+6cb1 } /* LXGW WenKai Screen R [62] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-62.woff2') format('woff2'); unicode-range: U+6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b84 } /* LXGW WenKai Screen R [63] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-63.woff2') format('woff2'); unicode-range: U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc, U+69fe-6a00 } /* LXGW WenKai Screen R [64] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-64.woff2') format('woff2'); unicode-range: U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1, U+68d3, U+68d7, U+68dd, U+68df } /* LXGW WenKai Screen R [65] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-65.woff2') format('woff2'); unicode-range: U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a-678d, U+678f } /* LXGW WenKai Screen R [66] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-66.woff2') format('woff2'); unicode-range: U+64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630-6631, U+6633-6634, U+6636 } /* LXGW WenKai Screen R [67] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-67.woff2') format('woff2'); unicode-range: U+63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0-64f2, U+64f4, U+64f7 } /* LXGW WenKai Screen R [68] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-68.woff2') format('woff2'); unicode-range: U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62ce-62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5, U+63b7-63bb } /* LXGW WenKai Screen R [69] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-69.woff2') format('woff2'); unicode-range: U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226, U+622c, U+622e-6230, U+6232, U+6238 } /* LXGW WenKai Screen R [70] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-70.woff2') format('woff2'); unicode-range: U+5fd1-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec-60ee, U+60f0-60f1, U+60f4, U+60f6 } /* LXGW WenKai Screen R [71] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-71.woff2') format('woff2'); unicode-range: U+5ea3-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc, U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd0 } /* LXGW WenKai Screen R [72] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-72.woff2') format('woff2'); unicode-range: U+5d32-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96, U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea2 } /* LXGW WenKai Screen R [73] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-73.woff2') format('woff2'); unicode-range: U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d27, U+5d2e-5d31 } /* LXGW WenKai Screen R [74] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-74.woff2') format('woff2'); unicode-range: U+5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be7, U+5be9, U+5beb-5bec, U+5bee-5bf0, U+5bf2-5bf3 } /* LXGW WenKai Screen R [75] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-75.woff2') format('woff2'); unicode-range: U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e, U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1 } /* LXGW WenKai Screen R [76] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-76.woff2') format('woff2'); unicode-range: U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968, U+596a, U+596c-596e, U+5977, U+597b-597c } /* LXGW WenKai Screen R [77] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-77.woff2') format('woff2'); unicode-range: U+570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-5820, U+5822-5823, U+5825-5826, U+582c, U+582f } /* LXGW WenKai Screen R [78] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-78.woff2') format('woff2'); unicode-range: U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709 } /* LXGW WenKai Screen R [79] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-79.woff2') format('woff2'); unicode-range: U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3, U+55f5-55f7, U+55fb, U+55fe, U+5600-5601 } /* LXGW WenKai Screen R [80] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-80.woff2') format('woff2'); unicode-range: U+53fb-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550f, U+5511-5514, U+5516-5517 } /* LXGW WenKai Screen R [81] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-81.woff2') format('woff2'); unicode-range: U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5340, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2, U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa } /* LXGW WenKai Screen R [82] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-82.woff2') format('woff2'); unicode-range: U+5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287, U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a } /* LXGW WenKai Screen R [83] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-83.woff2') format('woff2'); unicode-range: U+4fe3-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102, U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f } /* LXGW WenKai Screen R [84] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-84.woff2') format('woff2'); unicode-range: U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0-4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2 } /* LXGW WenKai Screen R [85] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-85.woff2') format('woff2'); unicode-range: U+3127-3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2-4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6 } /* LXGW WenKai Screen R [86] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-86.woff2') format('woff2'); unicode-range: U+279c, U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126 } /* LXGW WenKai Screen R [87] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-87.woff2') format('woff2'); unicode-range: U+2650-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796 } /* LXGW WenKai Screen R [88] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-88.woff2') format('woff2'); unicode-range: U+254b, U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-264f } /* LXGW WenKai Screen R [89] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-89.woff2') format('woff2'); unicode-range: U+23e9, U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a } /* LXGW WenKai Screen R [90] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-90.woff2') format('woff2'); unicode-range: U+207b-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0 } /* LXGW WenKai Screen R [91] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-91.woff2') format('woff2'); unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2027-2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a } /* LXGW WenKai Screen R [97] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-97.woff2') format('woff2'); unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579 } /* LXGW WenKai Screen R [98] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-98.woff2') format('woff2'); unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab } /* LXGW WenKai Screen R [99] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-99.woff2') format('woff2'); unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175 } /* LXGW WenKai Screen R [100] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-100.woff2') format('woff2'); unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+560e, U+5618, U+565c, U+56bc, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ac9, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+620c, U+62c7, U+62ed, U+6320, U+6345, U+6390, U+63b0, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+72e9, U+733f, U+7396, U+739f, U+7459-745a, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8aaa, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+9a6f, U+9a8b, U+9ab7, U+9ac5, U+9e25, U+e608, U+ff06, U+ff14-ff16 } /* LXGW WenKai Screen R [101] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-101.woff2') format('woff2'); unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+2463, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+516e, U+51c4, U+5225, U+5364, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+5662, U+5669, U+566c, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+6273, U+62f7, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6ed5, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+7409, U+7422, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+803f, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8c41, U+8cec, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9704, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+9f9a, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e, U+ff3d } /* LXGW WenKai Screen R [102] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-102.woff2') format('woff2'); unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+60df, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+6813, U+6869, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+73fe, U+7405, U+7455, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+8046, U+80fa, U+81b3, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+904e, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+9119, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+f012b } /* LXGW WenKai Screen R [103] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-103.woff2') format('woff2'); unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5a1f, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+5f6c, U+603c, U+609a, U+6168, U+61c8, U+6236, U+62d0, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+6703, U+67da, U+67ec, U+6816, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+7410, U+7426, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8d50, U+8e72, U+8f9c, U+900d, U+904b, U+9063, U+90a2, U+90b9, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+9631, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd } /* LXGW WenKai Screen R [104] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-104.woff2') format('woff2'); unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a49, U+5ac2, U+5bb0, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f8c, U+608d, U+611b, U+6127, U+62a0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6e9c, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+8328, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d63, U+8e81, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9540, U+9610, U+9699, U+96c7, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b } /* LXGW WenKai Screen R [105] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-105.woff2') format('woff2'); unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+300f, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54b1, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+61be, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6380, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82ad, U+82bd, U+8305, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+958b, U+9600, U+9640, U+96b6, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f } /* LXGW WenKai Screen R [106] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-106.woff2') format('woff2'); unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+8304, U+8393, U+83b9, U+83ca, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95ef, U+95f7, U+9706, U+9709, U+9774, U+9887, U+98a0, U+9e64, U+9f9f, U+e601, U+e603 } /* LXGW WenKai Screen R [107] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-107.woff2') format('woff2'); unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+886c, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95fa, U+95fd, U+964c, U+96c0, U+971c, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9b4f, U+9e2d, U+9f0e, U+e602, U+e604-e605, U+ff5c } /* LXGW WenKai Screen R [108] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-108.woff2') format('woff2'); unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+85aa, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+90aa, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+9675, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715 } /* LXGW WenKai Screen R [109] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-109.woff2') format('woff2'); unicode-range: U+a5, U+2022, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5 } /* LXGW WenKai Screen R [110] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-110.woff2') format('woff2'); unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d } /* LXGW WenKai Screen R [111] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-111.woff2') format('woff2'); unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e } /* LXGW WenKai Screen R [112] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-112.woff2') format('woff2'); unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8 } /* LXGW WenKai Screen R [113] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-113.woff2') format('woff2'); unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4ee4, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50 } /* LXGW WenKai Screen R [114] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-114.woff2') format('woff2'); unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6740, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c } /* LXGW WenKai Screen R [115] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-115.woff2') format('woff2'); unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b63, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b } /* LXGW WenKai Screen R [116] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-116.woff2') format('woff2'); unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6d4b, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99 } /* LXGW WenKai Screen R [117] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-117.woff2') format('woff2'); unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53ea, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f } /* LXGW WenKai Screen R [118] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-118.woff2') format('woff2'); unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e38, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09 } /* LXGW WenKai Screen R [119] */ @font-face { font-family: 'LXGW WenKai Screen R'; font-style: normal; font-weight: 400; font-display: swap; src: url('./files/lxgwwenkaiscreenr-subset-119.woff2') format('woff2'); unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a } ================================================ FILE: assets/css/lxgw/style.css ================================================ @import url('./lxgwwenkaigbscreen.css'); @import url('./lxgwwenkaigbscreenr.css'); @import url('./lxgwwenkaiscreen.css'); @import url('./lxgwwenkaiscreenr.css'); ================================================ FILE: assets/css/modules/steam/style.css ================================================ .steamContainer { border-radius: 4px; display: flex; flex-direction: column; align-items: flex-start; } .userProf { display: flex; flex-direction: row; width: 100%; justify-content: space-between; align-items: center; position: relative; margin: 0 0 48px 0; } .leftSide { display: flex; flex-direction: row; } .avatar_b { height: 80px; width: 80px; margin: 0 18px 0 0; position: relative; border-radius: 30em; } .avatar_b .wrapp { border-radius: 10px; position: relative; } .avatar_b img { display: block; width: 100%; border-radius:50%; } .avatar_b span { position: absolute; top: 6px; bottom: 0; left: 0; right: 0; height: 50px; border-radius: 30em; width: 50px; background-size: cover !important; filter: blur(12px); opacity: 0.6; } .userTitle { display: flex; flex-direction: column; justify-content: center; } .userTitle h1 { font-size: 24px!important; margin: 0 0 15px 0; font-weight: 500; } .userTitle h1:hover { cursor: pointer; } .userTitle h1 a { color: #000; text-decoration: none; } .userTitle h1:active { color: #7A92A5; } .userTitle h1 img { margin: 0 0 0 6px; opacity: 0; height: 14px; transform: translateX(2px); } .userTitle h5 { font-size: 14px; font-weight: 300; color: #577083; opacity: 0; } .userTitle h1:hover > a img { opacity: 1; transform: translateX(0px); } .userDesc { display: flex; flex-direction: row; align-items: center; flex-wrap: wrap; } .userDesc .userlevel { padding: 3px 6px; border: 1px solid #577083; border-radius: 2px; font-size: 14px!important; color: #577083; font-weight: 400; margin-top:-5px; } .userDesc .userhave { padding: 3px 6px; border: 1px solid #577083; border-radius: 2px; font-size: 14px!important; color: #577083; font-weight: 400; margin-top:-5px; margin-left:5px; } .avatar_b badge { position: absolute; height: 18px; width: 18px; background-color: green; border-radius: 30em; top: 60px; display: flex; align-items: center; align-content: center; justify-content: center; right: 0; box-shadow: 0 0 0 2px white; z-index:10; } #honeynavbar{ z-index:100; } .userGames { margin:-20px 20px 20px 20px; } .gamesTitle { margin: 0 0 10px 0; } .gamesTitle h3 { text-transform: uppercase; font-weight: 500; letter-spacing: 1.4px; } section{ margin-top:30px; } .steamgames-container { --grid: 180px; display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--grid), 1fr)); grid-gap: 25px; } @media (max-width: 780px) { .steamgames-container { --grid: 170px; } } @media (max-width: 450px) { .steamgames-container { --grid: 130px; } } .steamgames-card { background: var(--foreground); border-radius: 5px; box-shadow: 0 0 20px 0px rgba(0, 0, 0, 0.1); border-radius:8px; } .steamgames-card:hover .cta { opacity: 1; } .steamgames-card .image-wrapper { position: relative; width: 100%; } .steamgames-card img { display: block; width: 1200px; border-radius: 10px 10px 0 0; } .steamgames-card .cta { width: 40px; height: 40px; border: none; outline: none; position: absolute; cursor: pointer; bottom: 16px; right: 16px; background: rgba(0, 0, 0, 0.2); border-radius: 50%; display: flex; opacity: 0; transition: 0.3s; } .steamgames-card .cta:hover { background: rgba(0, 0, 0, 0.5); } .steamgames-card .cta svg { display: block; fill: #fff; width: 20px; margin: auto; } .steamgames-card .details { padding: 16px; margin-top:-5px; } .steamgames-card a { display: block; text-decoration: none; line-height: 1.8; color: inherit; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-decoration: none!important; } .steamgames-card a:hover { text-decoration: underline; } .steamgames-card a.title { font-weight: bold; } .steamgames-card a.sub-title { font-size: 14px; } .positioning { margin: 50px auto; position: relative; } .loading-sticks { height: 5rem; width: 5rem; display: flex; justify-content: space-between; align-items: center; } .loading-sticks .loading { flex: 0 0 20%; height: 30%; -webkit-animation: pulse 1s ease infinite; animation: pulse 1s ease infinite; background-color: #000; -webkit-animation-delay: 0; animation-delay: 0; } .loading-sticks .loading:nth-child(2) { -webkit-animation-delay: 0.3s; animation-delay: 0.3s; } .loading-sticks .loading:nth-child(3) { -webkit-animation-delay: 0.6s; animation-delay: 0.6s; } @-webkit-keyframes pulse { 0% { height: 30%; } 50% { height: 100%; } 100% { height: 30%; } } @keyframes pulse { 0% { height: 30%; } 50% { height: 100%; } 100% { height: 30%; } } ================================================ FILE: assets/css/modules/timeline_custom.css ================================================ /** * * BearSimple主题自定义样式 - 时光机微语 * Update:18/01/2023 * **/ /* 时光机 PC端树状样式 */ @media only screen and (min-width:1170px){#bs-timeline{margin-top:3em;margin-bottom:3em;}#bs-timeline::before{left:50%;margin-left:-2px;}}@media only screen and (min-width:1170px){.bs-timeline-block{margin:4em 0;}.bs-timeline-block:first-child{margin-top:0;}.bs-timeline-block:last-child{margin-bottom:0;}}@media only screen and (min-width:1170px){.bs-timeline-img{width:60px;height:60px;left:50%;margin-left:-30px;-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;}.bs-timeline-img img{display:block;border-radius:50%;width:60px;height:60px;position:relative;left:50%;top:50%;margin-left:-30px;margin-top:-30px;}.cssanimations .bs-timeline-img.is-hidden{visibility:hidden;}.cssanimations .bs-timeline-img.bounce-in{visibility:visible;-webkit-animation:bs-bounce-1 0.6s;-moz-animation:bs-bounce-1 0.6s;animation:bs-bounce-1 0.6s;}}@media only screen and (min-width:1170px){.bs-timeline-content{margin-left:0;padding:1.6em;width:45%;}.bs-timeline-content::before{top:24px;left:100%;border-color:transparent;border-left-color:#ffffff;}.bs-timeline-content .bs-read-more{float:left;}.bs-timeline-content .bs-date{position:absolute;width:100%;left:122%;top:6px;font-size:16px;font-size:1rem;}.bs-timeline-block:nth-child(even) .bs-timeline-content{float:right;}.bs-timeline-block:nth-child(even) .bs-timeline-content::before{top:24px;left:auto;right:100%;border-color:transparent;border-right-color:#ffffff;}.bs-timeline-block:nth-child(even) .bs-timeline-content .bs-read-more{float:right;}.bs-timeline-block:nth-child(even) .bs-timeline-content .bs-date{left:auto;right:122%;text-align:right;}.cssanimations .bs-timeline-content.is-hidden{visibility:hidden;}.cssanimations .bs-timeline-content.bounce-in{visibility:visible;-webkit-animation:bs-bounce-2 0.6s;-moz-animation:bs-bounce-2 0.6s;animation:bs-bounce-2 0.6s;}}@media only screen and (min-width:1170px){.cssanimations .bs-timeline-block:nth-child(even) .bs-timeline-content.bounce-in{-webkit-animation:bs-bounce-2-inverse 0.6s;-moz-animation:bs-bounce-2-inverse 0.6s;animation:bs-bounce-2-inverse 0.6s;}} ================================================ FILE: assets/images/loaders/index.html ================================================ 加载动画预览
    • #1
    • #2
    • #3
    • #4
    • #5
    • #6
    • #7
    • #8
    • #9
    • #10
    • #11
    • 关闭当前页面
    ================================================ FILE: assets/js/article_donate.js ================================================ window.__DONATE_INSTANCE = null; function destroyDonateModal() { if (window.__DONATE_INSTANCE) { window.__DONATE_INSTANCE.destroy(); window.__DONATE_INSTANCE = null; } } (function() { class DonateModal { constructor() { this.modal = document.querySelector('.donate-modal__mask'); this.closeBtn = document.querySelector('.donate-modal__close'); this.tabs = document.querySelectorAll('.donate-tab'); this.panes = document.querySelectorAll('.donate-pane'); this._closeHandler = null; this._maskHandler = null; this._tabHandlers = new Map(); this.init(); } init() { this.destroy(); this._closeHandler = () => this.hide(); this._maskHandler = (e) => { if (e.target === this.modal) this.hide(); }; this.closeBtn.addEventListener('click', this._closeHandler); this.modal.addEventListener('click', this._maskHandler); this.tabs.forEach(tab => { const handler = () => this.switchTab(tab); this._tabHandlers.set(tab, handler); tab.addEventListener('click', handler); }); this.panes.forEach(pane => { if (!pane.children.length) { const tab = document.querySelector(`[data-target="${pane.id}"]`); if (tab) tab.style.display = 'none'; } }); } switchTab(selectedTab) { this.tabs.forEach(tab => tab.classList.remove('active')); selectedTab.classList.add('active'); const target = selectedTab.dataset.target; this.panes.forEach(pane => { pane.classList.remove('active'); if (pane.id === target) pane.classList.add('active'); }); } show() { this.modal.style.display = 'flex'; } hide() { this.modal.style.display = 'none'; } destroy() { if (this.closeBtn && this._closeHandler) { this.closeBtn.removeEventListener('click', this._closeHandler); } if (this.modal && this._maskHandler) { this.modal.removeEventListener('click', this._maskHandler); } this.tabs.forEach(tab => { const handler = this._tabHandlers.get(tab); if (handler) { tab.removeEventListener('click', handler); } }); this._tabHandlers.clear(); } } function initDonateModal() { destroyDonateModal(); window.__DONATE_INSTANCE = new DonateModal(); } if (document.readyState !== 'loading') { initDonateModal(); } else { document.addEventListener('DOMContentLoaded', initDonateModal); } if (typeof pjax !== 'undefined') { document.addEventListener('pjax:complete', initDonateModal); } })(); ================================================ FILE: assets/js/bearsimple-comments.js ================================================ function wordStatic(input) { var content = document.getElementById('num'); if (content && input) { var value = input.value; value = value.replace(/\n|\r/gi,""); content .innerText = value.length; } } ================================================ FILE: assets/js/commentTyping.js ================================================ (function webpackUniversalModuleDefinition(a,b){if(typeof exports==="object"&&typeof module==="object"){module.exports=b()}else{if(typeof define==="function"&&define.amd){define([],b)}else{if(typeof exports==="object"){exports["POWERMODE"]=b()}else{a["POWERMODE"]=b()}}}})(this,function(){return(function(a){var b={};function c(e){if(b[e]){return b[e].exports}var d=b[e]={exports:{},id:e,loaded:false};a[e].call(d.exports,d,d.exports,c);d.loaded=true;return d.exports}c.m=a;c.c=b;c.p="";return c(0)})([function(c,g,b){var d=document.createElement("canvas");d.width=window.innerWidth;d.height=window.innerHeight;d.style.cssText="position:fixed;top:0;left:0;pointer-events:none;z-index:999999";window.addEventListener("resize",function(){d.width=window.innerWidth;d.height=window.innerHeight});document.body.appendChild(d);var a=d.getContext("2d");var n=[];var j=0;var k=120;var f=k;var p=false;o.shake=true;function l(r,q){return Math.random()*(q-r)+r}function m(r){if(o.colorful){var q=l(0,360);return"hsla("+l(q-10,q+10)+", 100%, "+l(50,80)+"%, "+1+")"}else{return window.getComputedStyle(r).color}}function e(){var t=document.activeElement;var v;if(t.tagName==="TEXTAREA"||(t.tagName==="INPUT"&&t.getAttribute("type")==="text")){var u=b(1)(t,t.selectionStart);v=t.getBoundingClientRect();return{x:u.left+v.left,y:u.top+v.top,color:m(t)}}var s=window.getSelection();if(s.rangeCount){var q=s.getRangeAt(0);var r=q.startContainer;if(r.nodeType===document.TEXT_NODE){r=r.parentNode}v=q.getBoundingClientRect();return{x:v.left,y:v.top,color:m(r)}}return{x:0,y:0,color:"transparent"}}function h(q,s,r){return{x:q,y:s,alpha:1,color:r,velocity:{x:-1+Math.random()*2,y:-3.5+Math.random()*2}}}function o(){var t=e();var s=5+Math.round(Math.random()*10);while(s--){n[j]=h(t.x,t.y,t.color);j=(j+1)%500}f=k;if(!p){requestAnimationFrame(i)}if(o.shake){var r=1+2*Math.random();var q=r*(Math.random()>0.5?-1:1);var u=r*(Math.random()>0.5?-1:1);document.body.style.marginLeft=q+"px";document.body.style.marginTop=u+"px";setTimeout(function(){document.body.style.marginLeft="";document.body.style.marginTop=""},75)}}o.colorful=false;function i(){if(f>0){requestAnimationFrame(i);f--;p=true}else{p=false}a.clearRect(0,0,d.width,d.height);for(var q=0;qparseInt(j.height)){g.overflowY="scroll"}}else{g.overflow="hidden"}f.textContent=k.value.substring(0,l);if(k.nodeName==="INPUT"){f.textContent=f.textContent.replace(/\s/g,"\u00a0")}var n=document.createElement("span");n.textContent=k.value.substring(l)||".";f.appendChild(n);var m={top:n.offsetTop+parseInt(j["borderTopWidth"]),left:n.offsetLeft+parseInt(j["borderLeftWidth"])};if(h){n.style.backgroundColor="#aaa"}else{document.body.removeChild(f)}return m}if(typeof b!="undefined"&&typeof b.exports!="undefined"){b.exports=c}else{window.getCaretCoordinates=c}}())}])}); POWERMODE.colorful=true;POWERMODE.shake=false;document.body.addEventListener("input",POWERMODE); ================================================ FILE: assets/js/emaction.js ================================================ /** * @license * Copyright 2019 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ const t$1=window,e$2=t$1.ShadowRoot&&(void 0===t$1.ShadyCSS||t$1.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,s$3=Symbol(),n$3=new WeakMap;let o$3 = class o{constructor(t,e,n){if(this._$cssResult$=!0,n!==s$3)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e;}get styleSheet(){let t=this.o;const s=this.t;if(e$2&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=n$3.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&n$3.set(s,t));}return t}toString(){return this.cssText}};const r$2=t=>new o$3("string"==typeof t?t:t+"",void 0,s$3),i$1=(t,...e)=>{const n=1===t.length?t[0]:e.reduce(((e,s,n)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(s)+t[n+1]),t[0]);return new o$3(n,t,s$3)},S$1=(s,n)=>{e$2?s.adoptedStyleSheets=n.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):n.forEach((e=>{const n=document.createElement("style"),o=t$1.litNonce;void 0!==o&&n.setAttribute("nonce",o),n.textContent=e.cssText,s.appendChild(n);}));},c$1=e$2?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const s of t.cssRules)e+=s.cssText;return r$2(e)})(t):t; /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */var s$2;const e$1=window,r$1=e$1.trustedTypes,h$1=r$1?r$1.emptyScript:"",o$2=e$1.reactiveElementPolyfillSupport,n$2={toAttribute(t,i){switch(i){case Boolean:t=t?h$1:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t);}return t},fromAttribute(t,i){let s=t;switch(i){case Boolean:s=null!==t;break;case Number:s=null===t?null:Number(t);break;case Object:case Array:try{s=JSON.parse(t);}catch(t){s=null;}}return s}},a$1=(t,i)=>i!==t&&(i==i||t==t),l$2={attribute:!0,type:String,converter:n$2,reflect:!1,hasChanged:a$1},d$1="finalized";let u$1 = class u extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this.u();}static addInitializer(t){var i;this.finalize(),(null!==(i=this.h)&&void 0!==i?i:this.h=[]).push(t);}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((i,s)=>{const e=this._$Ep(s,i);void 0!==e&&(this._$Ev.set(e,s),t.push(e));})),t}static createProperty(t,i=l$2){if(i.state&&(i.attribute=!1),this.finalize(),this.elementProperties.set(t,i),!i.noAccessor&&!this.prototype.hasOwnProperty(t)){const s="symbol"==typeof t?Symbol():"__"+t,e=this.getPropertyDescriptor(t,s,i);void 0!==e&&Object.defineProperty(this.prototype,t,e);}}static getPropertyDescriptor(t,i,s){return {get(){return this[i]},set(e){const r=this[t];this[i]=e,this.requestUpdate(t,r,s);},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||l$2}static finalize(){if(this.hasOwnProperty(d$1))return !1;this[d$1]=!0;const t=Object.getPrototypeOf(this);if(t.finalize(),void 0!==t.h&&(this.h=[...t.h]),this.elementProperties=new Map(t.elementProperties),this._$Ev=new Map,this.hasOwnProperty("properties")){const t=this.properties,i=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const s of i)this.createProperty(s,t[s]);}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(i){const s=[];if(Array.isArray(i)){const e=new Set(i.flat(1/0).reverse());for(const i of e)s.unshift(c$1(i));}else void 0!==i&&s.push(c$1(i));return s}static _$Ep(t,i){const s=i.attribute;return !1===s?void 0:"string"==typeof s?s:"string"==typeof t?t.toLowerCase():void 0}u(){var t;this._$E_=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$Eg(),this.requestUpdate(),null===(t=this.constructor.h)||void 0===t||t.forEach((t=>t(this)));}addController(t){var i,s;(null!==(i=this._$ES)&&void 0!==i?i:this._$ES=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(s=t.hostConnected)||void 0===s||s.call(t));}removeController(t){var i;null===(i=this._$ES)||void 0===i||i.splice(this._$ES.indexOf(t)>>>0,1);}_$Eg(){this.constructor.elementProperties.forEach(((t,i)=>{this.hasOwnProperty(i)&&(this._$Ei.set(i,this[i]),delete this[i]);}));}createRenderRoot(){var t;const s=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return S$1(s,this.constructor.elementStyles),s}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostConnected)||void 0===i?void 0:i.call(t)}));}enableUpdating(t){}disconnectedCallback(){var t;null===(t=this._$ES)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostDisconnected)||void 0===i?void 0:i.call(t)}));}attributeChangedCallback(t,i,s){this._$AK(t,s);}_$EO(t,i,s=l$2){var e;const r=this.constructor._$Ep(t,s);if(void 0!==r&&!0===s.reflect){const h=(void 0!==(null===(e=s.converter)||void 0===e?void 0:e.toAttribute)?s.converter:n$2).toAttribute(i,s.type);this._$El=t,null==h?this.removeAttribute(r):this.setAttribute(r,h),this._$El=null;}}_$AK(t,i){var s;const e=this.constructor,r=e._$Ev.get(t);if(void 0!==r&&this._$El!==r){const t=e.getPropertyOptions(r),h="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==(null===(s=t.converter)||void 0===s?void 0:s.fromAttribute)?t.converter:n$2;this._$El=r,this[r]=h.fromAttribute(i,t.type),this._$El=null;}}requestUpdate(t,i,s){let e=!0;void 0!==t&&(((s=s||this.constructor.getPropertyOptions(t)).hasChanged||a$1)(this[t],i)?(this._$AL.has(t)||this._$AL.set(t,i),!0===s.reflect&&this._$El!==t&&(void 0===this._$EC&&(this._$EC=new Map),this._$EC.set(t,s))):e=!1),!this.isUpdatePending&&e&&(this._$E_=this._$Ej());}async _$Ej(){this.isUpdatePending=!0;try{await this._$E_;}catch(t){Promise.reject(t);}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var t;if(!this.isUpdatePending)return;this.hasUpdated,this._$Ei&&(this._$Ei.forEach(((t,i)=>this[i]=t)),this._$Ei=void 0);let i=!1;const s=this._$AL;try{i=this.shouldUpdate(s),i?(this.willUpdate(s),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostUpdate)||void 0===i?void 0:i.call(t)})),this.update(s)):this._$Ek();}catch(t){throw i=!1,this._$Ek(),t}i&&this._$AE(s);}willUpdate(t){}_$AE(t){var i;null===(i=this._$ES)||void 0===i||i.forEach((t=>{var i;return null===(i=t.hostUpdated)||void 0===i?void 0:i.call(t)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t);}_$Ek(){this._$AL=new Map,this.isUpdatePending=!1;}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$E_}shouldUpdate(t){return !0}update(t){void 0!==this._$EC&&(this._$EC.forEach(((t,i)=>this._$EO(i,this[i],t))),this._$EC=void 0),this._$Ek();}updated(t){}firstUpdated(t){}};u$1[d$1]=!0,u$1.elementProperties=new Map,u$1.elementStyles=[],u$1.shadowRootOptions={mode:"open"},null==o$2||o$2({ReactiveElement:u$1}),(null!==(s$2=e$1.reactiveElementVersions)&&void 0!==s$2?s$2:e$1.reactiveElementVersions=[]).push("1.6.2"); /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ var t;const i=window,s$1=i.trustedTypes,e=s$1?s$1.createPolicy("lit-html",{createHTML:t=>t}):void 0,o$1="$lit$",n$1=`lit$${(Math.random()+"").slice(9)}$`,l$1="?"+n$1,h=`<${l$1}>`,r=document,u=()=>r.createComment(""),d=t=>null===t||"object"!=typeof t&&"function"!=typeof t,c=Array.isArray,v=t=>c(t)||"function"==typeof(null==t?void 0:t[Symbol.iterator]),a="[ \t\n\f\r]",f=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${a}(?:([^\\s"'>=/]+)(${a}*=${a}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),g=/'/g,$=/"/g,y=/^(?:script|style|textarea|title)$/i,w=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),x=w(1),T=Symbol.for("lit-noChange"),A=Symbol.for("lit-nothing"),E=new WeakMap,C=r.createTreeWalker(r,129,null,!1);function P(t,i){if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==e?e.createHTML(i):i}const V=(t,i)=>{const s=t.length-1,e=[];let l,r=2===i?"":"",u=f;for(let i=0;i"===c[0]?(u=null!=l?l:f,v=-1):void 0===c[1]?v=-2:(v=u.lastIndex-c[2].length,d=c[1],u=void 0===c[3]?p:'"'===c[3]?$:g):u===$||u===g?u=p:u===_||u===m?u=f:(u=p,l=void 0);const w=u===p&&t[i+1].startsWith("/>")?" ":"";r+=u===f?s+h:v>=0?(e.push(d),s.slice(0,v)+o$1+s.slice(v)+n$1+w):s+n$1+(-2===v?(e.push(void 0),i):w);}return [P(t,r+(t[s]||"")+(2===i?"":"")),e]};class N{constructor({strings:t,_$litType$:i},e){let h;this.parts=[];let r=0,d=0;const c=t.length-1,v=this.parts,[a,f]=V(t,i);if(this.el=N.createElement(a,e),C.currentNode=this.el.content,2===i){const t=this.el.content,i=t.firstChild;i.remove(),t.append(...i.childNodes);}for(;null!==(h=C.nextNode())&&v.length0){h.textContent=s$1?s$1.emptyScript:"";for(let s=0;s2||""!==s[0]||""!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A;}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(t,i=this,s,e){const o=this.strings;let n=!1;if(void 0===o)t=S(this,t,i,0),n=!d(t)||t!==this._$AH&&t!==T,n&&(this._$AH=t);else {const e=t;let l,h;for(t=o[0],l=0;l{var e,o;const n=null!==(e=null==s?void 0:s.renderBefore)&&void 0!==e?e:i;let l=n._$litPart$;if(void 0===l){const t=null!==(o=null==s?void 0:s.renderBefore)&&void 0!==o?o:null;n._$litPart$=l=new R(i.insertBefore(u(),t),t,void 0,null!=s?s:{});}return l._$AI(t),l}; /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */var l,o;class s extends u$1{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0;}createRenderRoot(){var t,e;const i=super.createRenderRoot();return null!==(t=(e=this.renderOptions).renderBefore)&&void 0!==t||(e.renderBefore=i.firstChild),i}update(t){const i=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=D(i,this.renderRoot,this.renderOptions);}connectedCallback(){var t;super.connectedCallback(),null===(t=this._$Do)||void 0===t||t.setConnected(!0);}disconnectedCallback(){var t;super.disconnectedCallback(),null===(t=this._$Do)||void 0===t||t.setConnected(!1);}render(){return T}}s.finalized=!0,s._$litElement$=!0,null===(l=globalThis.litElementHydrateSupport)||void 0===l||l.call(globalThis,{LitElement:s});const n=globalThis.litElementPolyfillSupport;null==n||n({LitElement:s});(null!==(o=globalThis.litElementVersions)&&void 0!==o?o:globalThis.litElementVersions=[]).push("3.3.2"); //const DEFAULT_EMOJIS = '👍,thumbs-up;😄,smile-face;🎉,party-popper;😎,cool;😕,confused-face;❤️,red-heart;🚀,rocket;👀,eyes;👎,thumbs-down;'; const DEFAULT_EMOJIS = '👍,thumbs-up;🎉,party-popper;❤️,red-heart;😎,cool;😄,smile-face;🚀,rocket;'; class EmojiReaction extends s { static properties = { showAvailable: {attribute: false}, availableReactions: { attribute: false }, availableArrayString: {}, endpoint: {}, reactTargetId: {}, theme: {}, }; // Define scoped styles right with your component, in plain CSS static styles = i$1` /* default light */ .container { --start-smile-border-color-default: #d0d7de; --start-smile-border-color-hover-default: #1f232826; --start-smile-bg-color-default: #f6f8fa; --start-smile-svg-fill-color-default: #656d76; --reaction-got-not-reacted-bg-color-default: transparent; --reaction-got-not-reacted-bg-color-hover-default: #eaeef2; --reaction-got-not-reacted-border-color-default: #d0d7de; --reaction-got-not-reacted-text-color-default: #656d76; --reaction-got-reacted-bg-color-default: transparent; --reaction-got-reacted-bg-color-hover-default: #eaeef2; --reaction-got-reacted-border-color-default: #42b983; --reaction-got-reacted-text-color-default: #42b983; --reaction-available-popup-bg-color-default: #ffffff; --reaction-available-popup-border-color-default: #d0d7de; --reaction-available-popup-box-shadow-default: 0 4px 6px rgba(0,0,0,.04); --reaction-available-emoji-reacted-bg-color-default: #ddf4ff; --reaction-available-emoji-bg-color-hover-default: #f3f4f6; --reaction-available-emoji-z-index-default: 100; --reaction-available-mask-z-index-default: 80; } /* default dark */ .container-dark{ --start-smile-border-color-default: #3b3d42; --start-smile-border-color-hover-default: #3b3d42; --start-smile-bg-color-default: transparent; --start-smile-svg-fill-color-default: #ffffff; --reaction-got-not-reacted-bg-color-default: transparent; --reaction-got-not-reacted-bg-color-hover-default: #272727; --reaction-got-not-reacted-border-color-default: #3b3d42; --reaction-got-not-reacted-text-color-default: #ffffff; --reaction-got-reacted-bg-color-default: #272727; --reaction-got-reacted-bg-color-hover-default: #272727; --reaction-got-reacted-border-color-default: #42b983; --reaction-got-reacted-text-color-default: #42b983; --reaction-available-popup-bg-color-default: #161b22; --reaction-available-popup-border-color-default: #30363d; --reaction-available-popup-box-shadow-default: 0 4px 6px rgba(0,0,0,.04); --reaction-available-emoji-reacted-bg-color-default: #388bfd1a; --reaction-available-emoji-bg-color-hover-default: #30363d; --reaction-available-emoji-z-index-default: 100; --reaction-available-mask-z-index-default: 80; } .anim-scale-in { animation-name: scale-in; animation-duration: .15s; animation-timing-function: cubic-bezier(0.2, 0, 0.13, 1.5); } @keyframes scale-in { 0% { opacity: 0; transform: scale(0.5); } 100% { opacity: 1; transform: scale(1); } } `; // Render the UI as a function of component state render() { var system_theme = localStorage.getItem("theme") || '' if (system_theme == null || system_theme == "undefined" || system_theme == "") { system_theme = window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark"; } return x`
    ${this.availableReactions.map(item => x` ${item.emoji} `)}
    ${this.availableReactions.map(item => x`
    ${item.emoji}${item.count} `)}
    `; } constructor() { super(); // Declare reactive properties this.showAvailable = false; this.availableReactions = []; } connectedCallback() { super.connectedCallback(); this.initReactions(); } async initReactions() { let arr_string = this?.availableArrayString; if (!arr_string) { arr_string = DEFAULT_EMOJIS; } const arr = arr_string.split(';').map(val => { const [emoji, reaction_name] = val.split(','); if (!emoji || !reaction_name) { return null } return { emoji, reaction_name } }).filter(val => val); // 初始化 endpoint if (!this?.endpoint) { this.endpoint = 'https://www.diu2.com/emoji'; } // 请求接口,获取哪些 emoji 有 reaction 数量 let url_2_generate_id = ''; const canonical = document.head.querySelector("link[rel='canonical']"); url_2_generate_id = canonical && canonical.href ? canonical.href : window.location.href; const urlObj = new URL(url_2_generate_id); const url_without_hash = urlObj.origin + urlObj.pathname + urlObj.search; if (!this?.reactTargetId) { this.reactTargetId = await this._sha256(url_without_hash); } const { data: { reactionsGot } } = await fetch(this.endpoint, { method: 'POST', body: JSON.stringify({ action:'getReact', targetId: this.reactTargetId }), headers: { 'content-type': 'application/json' // 数据格式 }, }) .then(resp => resp.json()) .then(resp => { if (!resp?.data || !Array.isArray(resp?.data?.reactionsGot)) { throw new Error("获取 reactions 出错!") } return resp; }); // 获得的 reactions 数量放到 arr 里 reactionsGot.forEach(reaction => { arr.forEach(availableReaction => { if (reaction.reaction_name === availableReaction.reaction_name) { availableReaction.count = Number(reaction.count); } }); }); // 读取 localStorage,获取当前用户点击过的 emoji const storageKey = `meReactedReactions_${this.reactTargetId}`; const meReactedReactions = JSON.parse(window.localStorage.getItem(storageKey) || "[]"); // 当前用户点击状态放到 arr meReactedReactions.forEach(reaction_name => { arr.forEach(availableReaction => { if (reaction_name === availableReaction.reaction_name) { availableReaction.meReacted = true; } }); }); // 初始化 avaiableArray this.availableReactions = arr; } _closePopup(e) { console.log(e.target); this.showAvailable = false; } async _react(e) { const { name: reaction_name } = e.target.dataset; const reaction = this.availableReactions.find(ele => ele.reaction_name === reaction_name); if (!reaction) { console.error("未知的 reaction!"); return } const cancel = reaction?.meReacted ? true : false; const currentCount = Number(reaction?.count) || 0; const count = Math.max(0, currentCount + (cancel ? -1 : 1)); const meReacted = !reaction.meReacted; this.availableReactions = this.availableReactions.map(val => { if (val.reaction_name === reaction_name) { val.count = count; val.meReacted = meReacted; } return val }); this.showAvailable = false; // 请求接口,更新 react 数量 await fetch(this.endpoint, { method: "POST", body: JSON.stringify({ action: 'updateReact', targetId: this.reactTargetId, reaction_name: reaction_name, diff: cancel ? -1 : 1 }), headers: { 'content-type': 'application/json' // 数据格式 }, }); // 更新 localStorage const storageKey = `meReactedReactions_${this.reactTargetId}`; const meReactedReactionsSet = new Set(JSON.parse(window.localStorage.getItem(storageKey) || "[]")); if (cancel) { meReactedReactionsSet.delete(reaction_name); } else { meReactedReactionsSet.add(reaction_name); } window.localStorage.setItem(storageKey, JSON.stringify(Array.from(meReactedReactionsSet))); } _showAvailable(e) { e.preventDefault(); this.showAvailable = !this.showAvailable; } async _sha256(string) { return Array.from(new Uint8Array( await crypto.subtle.digest('sha-256', new TextEncoder().encode(string)) )) .map(b => b.toString(16).padStart(2, "0")).join("") } } customElements.define('emoji-reaction', EmojiReaction); export { EmojiReaction }; ================================================ FILE: assets/js/gt4.js ================================================ "v4.1.5 Geetest Inc."; (function (window) { "use strict"; if (typeof window === 'undefined') { throw new Error('Geetest requires browser environment'); } var document = window.document; var Math = window.Math; var head = document.getElementsByTagName("head")[0]; var TIMEOUT = 10000; function _Object(obj) { this._obj = obj; } _Object.prototype = { _each: function (process) { var _obj = this._obj; for (var k in _obj) { if (_obj.hasOwnProperty(k)) { process(k, _obj[k]); } } return this; }, _extend: function (obj){ var self = this; new _Object(obj)._each(function (key, value){ self._obj[key] = value; }) } }; var uuid = function () { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0; var v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }; function Config(config) { var self = this; new _Object(config)._each(function (key, value) { self[key] = value; }); } Config.prototype = { apiServers: ['gcaptcha4.geetest.com','gcaptcha4.geevisit.com','gcaptcha4.gsensebot.com'], staticServers: ["static.geetest.com",'static.geevisit.com', "dn-staticdown.qbox.me"], protocol: 'http://', typePath: '/load', fallback_config: { bypass: { staticServers: ["static.geetest.com",'static.geevisit.com',"dn-staticdown.qbox.me"], type: 'bypass', bypass: '/v4/bypass.js' } }, _get_fallback_config: function () { var self = this; if (isString(self.type)) { return self.fallback_config[self.type]; } else { return self.fallback_config.bypass; } }, _extend: function (obj) { var self = this; new _Object(obj)._each(function (key, value) { self[key] = value; }) } }; var isNumber = function (value) { return (typeof value === 'number'); }; var isString = function (value) { return (typeof value === 'string'); }; var isBoolean = function (value) { return (typeof value === 'boolean'); }; var isObject = function (value) { return (typeof value === 'object' && value !== null); }; var isFunction = function (value) { return (typeof value === 'function'); }; var MOBILE = /Mobi/i.test(navigator.userAgent); var callbacks = {}; var status = {}; var random = function () { return parseInt(Math.random() * 10000) + (new Date()).valueOf(); }; // bind 函数polify, 不带new功能的bind var bind = function(target,context){ if(typeof target !== 'function'){ return; } var args = Array.prototype.slice.call(arguments,2); if(Function.prototype.bind){ return target.bind(context, args); }else { return function(){ var _args = Array.prototype.slice.call(arguments); return target.apply(context,args.concat(_args)); } } } var toString = Object.prototype.toString; var _isFunction = function(obj) { return typeof(obj) === 'function'; }; var _isObject = function(obj) { return obj === Object(obj); }; var _isArray = function(obj) { return toString.call(obj) == '[object Array]'; }; var _isDate = function(obj) { return toString.call(obj) == '[object Date]'; }; var _isRegExp = function(obj) { return toString.call(obj) == '[object RegExp]'; }; var _isBoolean = function(obj) { return toString.call(obj) == '[object Boolean]'; }; function resolveKey(input){ return input.replace(/(\S)(_([a-zA-Z]))/g, function(match, $1, $2, $3){ return $1 + $3.toUpperCase() || ""; }) } function camelizeKeys(input, convert){ if(!_isObject(input) || _isDate(input) || _isRegExp(input) || _isBoolean(input) || _isFunction(input)){ return convert ? resolveKey(input) : input; } if(_isArray(input)){ var temp = []; for(var i = 0; i < input.length; i++){ temp.push(camelizeKeys(input[i])); } }else { var temp = {}; for(var prop in input){ if(input.hasOwnProperty(prop)){ temp[camelizeKeys(prop, true)] = camelizeKeys(input[prop]); } } } return temp; } var loadScript = function (url, cb, timeout) { var script = document.createElement("script"); script.charset = "UTF-8"; script.async = true; // 对geetest的静态资源添加 crossOrigin if ( /static\.geetest\.com/g.test(url)) { script.crossOrigin = "anonymous"; } script.onerror = function () { cb(true); // 错误触发了,超时逻辑就不用了 loaded = true; }; var loaded = false; script.onload = script.onreadystatechange = function () { if (!loaded && (!script.readyState || "loaded" === script.readyState || "complete" === script.readyState)) { loaded = true; setTimeout(function () { cb(false); }, 0); } }; script.src = url; head.appendChild(script); setTimeout(function () { if (!loaded) { script.onerror = script.onload = null; script.remove && script.remove(); cb(true); } }, timeout || TIMEOUT); }; var normalizeDomain = function (domain) { // special domain: uems.sysu.edu.cn/jwxt/geetest/ // return domain.replace(/^https?:\/\/|\/.*$/g, ''); uems.sysu.edu.cn return domain.replace(/^https?:\/\/|\/$/g, ''); // uems.sysu.edu.cn/jwxt/geetest }; var normalizePath = function (path) { path = path.replace(/\/+/g, '/'); if (path.indexOf('/') !== 0) { path = '/' + path; } return path; }; var normalizeQuery = function (query) { if (!query) { return ''; } var q = '?'; new _Object(query)._each(function (key, value) { if (isString(value) || isNumber(value) || isBoolean(value)) { q = q + encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&'; } }); if (q === '?') { q = ''; } return q.replace(/&$/, ''); }; var makeURL = function (protocol, domain, path, query) { domain = normalizeDomain(domain); var url = normalizePath(path) + normalizeQuery(query); if (domain) { url = protocol + domain + url; } return url; }; var load = function (config, protocol, domains, path, query, cb, handleCb) { var tryRequest = function (at) { // 处理jsonp回调,这里为了保证每个不同jsonp都有唯一的回调函数 if(handleCb){ var cbName = "geetest_" + random(); // 需要与预先定义好cbname参数,删除对象 window[cbName] = bind(handleCb, null, cbName); query.callback = cbName; } var url = makeURL(protocol, domains[at], path, query); loadScript(url, function (err) { if (err) { // 超时或者出错的时候 移除回调 if(cbName){ try { window[cbName] = function(){ window[cbName] = null; } } catch (e) {} } if (at >= domains.length - 1) { cb(true); // report gettype error } else { tryRequest(at + 1); } } else { cb(false); } }, config.timeout); }; tryRequest(0); }; var jsonp = function (domains, path, config, callback) { var handleCb = function (cbName, data) { // 保证只执行一次,全部超时的情况下不会再触发; if (data.status == 'success') { callback(data.data); } else if (!data.status) { callback(data); } else { //接口有返回,但是返回了错误状态,进入报错逻辑 callback(data); } window[cbName] = undefined; try { delete window[cbName]; } catch (e) { } }; load(config, config.protocol, domains, path, { captcha_id: config.captchaId, challenge: config.challenge || uuid(), client_type: MOBILE? 'h5':'web', risk_type: config.riskType, user_info: config.userInfo, call_type: config.callType, lang: config.language? config.language : navigator.appName === 'Netscape' ? navigator.language.toLowerCase() : navigator.userLanguage.toLowerCase() }, function (err) { // 网络问题接口没有返回,直接使用本地验证码,走宕机模式 // 这里可以添加用户的逻辑 if(err && typeof config.offlineCb === 'function'){ // 执行自己的宕机 config.offlineCb(); return; } if(err){ callback(config._get_fallback_config()); } }, handleCb); }; var reportError = function (config, url) { load(config, config.protocol, ['monitor.geetest.com'], '/monitor/send', { time: Date.now().getTime(), captcha_id: config.gt, challenge: config.challenge, exception_url: url, error_code: config.error_code }, function (err) {}) } var throwError = function (errorType, config, errObj) { var errors = { networkError: '网络错误', gtTypeError: 'gt字段不是字符串类型' }; if (typeof config.onError === 'function') { config.onError({ desc: errObj.desc, msg: errObj.msg, code: errObj.code }); } else { throw new Error(errors[errorType]); } }; var detect = function () { return window.Geetest || document.getElementById("gt_lib"); }; if (detect()) { status.slide = "loaded"; } var GeetestIsLoad = function (fname) { var GeetestIsLoad = false; var tags = { js: 'script', css: 'link' }; var tagname = tags[fname.split('.').pop()]; if (tagname !== undefined) { var elts = document.getElementsByTagName(tagname); for (var i in elts) { if ((elts[i].href && elts[i].href.toString().indexOf(fname) > 0) || (elts[i].src && elts[i].src.toString().indexOf(fname) > 0)) { GeetestIsLoad = true; } } } return GeetestIsLoad; }; window.initGeetest4 = function (userConfig,callback) { var config = new Config(userConfig); if (userConfig.https) { config.protocol = 'https://'; } else if (!userConfig.protocol) { config.protocol = window.location.protocol + '//'; } if (isObject(userConfig.getType)) { config._extend(userConfig.getType); } jsonp(config.apiServers , config.typePath, config, function (newConfig) { //错误捕获,第一个load请求可能直接报错 var newConfig = camelizeKeys(newConfig); if(newConfig.status === 'error'){ return throwError('networkError', config, newConfig); } var type = newConfig.type; if(config.debug){ new _Object(newConfig)._extend(config.debug) } var init = function () { config._extend(newConfig); callback(new window.Geetest4(config)); }; callbacks[type] = callbacks[type] || []; var s = status[type] || 'init'; if (s === 'init') { status[type] = 'loading'; callbacks[type].push(init); if(newConfig.gctPath){ load(config, config.protocol, Object.hasOwnProperty.call(config, 'staticServers') ? config.staticServers : newConfig.staticServers || config.staticServers , newConfig.gctPath, null, function (err){ if(err){ throwError('networkError', config, { code: '60205', msg: 'Network failure', desc: { detail: 'gct resource load timeout' } }); } }) } load(config, config.protocol, Object.hasOwnProperty.call(config, 'staticServers') ? config.staticServers : newConfig.staticServers || config.staticServers, newConfig.bypass || (newConfig.staticPath + newConfig.js), null, function (err) { if (err) { status[type] = 'fail'; throwError('networkError', config, { code: '60204', msg: 'Network failure', desc: { detail: 'js resource load timeout' } }); } else { status[type] = 'loaded'; var cbs = callbacks[type]; for (var i = 0, len = cbs.length; i < len; i = i + 1) { var cb = cbs[i]; if (isFunction(cb)) { cb(); } } callbacks[type] = []; } }); } else if (s === "loaded") { // 判断gct是否需要重新加载 if(!GeetestIsLoad(newConfig.gctPath)){ load(config, config.protocol, Object.hasOwnProperty.call(config, 'staticServers') ? config.staticServers : newConfig.staticServers || config.staticServers , newConfig.gctPath, null, function (err){ if(err){ throwError('networkError', config, { code: '60205', msg: 'Network failure', desc: { detail: 'gct resource load timeout' } }); } }) } return init(); } else if (s === "fail") { throwError('networkError', config, { code: '60204', msg: 'Network failure', desc: { detail: 'js resource load timeout' } }); } else if (s === "loading") { callbacks[type].push(init); } }); }; })(window); ================================================ FILE: assets/js/instantPage.js ================================================ /*! instant.page v5.2.0 - (C) 2019-2023 Alexandre Dieulot - https://instant.page/license */ let t,e,n,o,i,a=null,s=65,c=new Set;const r=1111;function d(t){o=performance.now();const e=t.target.closest("a");m(e)&&p(e.href,"high")}function u(t){if(performance.now()-o{p(e.href,"high"),i=void 0},s))}function l(t){const e=t.target.closest("a");m(e)&&p(e.href,"high")}function f(t){t.relatedTarget&&t.target.closest("a")==t.relatedTarget.closest("a")||i&&(clearTimeout(i),i=void 0)}function h(t){if(performance.now()-o1||t.metaKey||t.ctrlKey)return;if(!e)return;e.addEventListener("click",function(t){1337!=t.detail&&t.preventDefault()},{capture:!0,passive:!1,once:!0});const n=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1,detail:1337});e.dispatchEvent(n)}function m(o){if(o&&o.href&&(!n||"instant"in o.dataset)){if(o.origin!=location.origin){if(!(e||"instant"in o.dataset)||!a)return}if(["http:","https:"].includes(o.protocol)&&("http:"!=o.protocol||"https:"!=location.protocol)&&(t||!o.search||"instant"in o.dataset)&&!(o.hash&&o.pathname+o.search==location.pathname+location.search||"noInstant"in o.dataset))return!0}}function p(t,e="auto"){if(c.has(t))return;const n=document.createElement("link");n.rel="prefetch",n.href=t,n.fetchPriority=e,n.as="document",document.head.appendChild(n),c.add(t)}!function(){if(!document.createElement("link").relList.supports("prefetch"))return;const o="instantVaryAccept"in document.body.dataset||"Shopify"in window,i=navigator.userAgent.indexOf("Chrome/");i>-1&&(a=parseInt(navigator.userAgent.substring(i+"Chrome/".length)));if(o&&a&&a<110)return;const c="instantMousedownShortcut"in document.body.dataset;t="instantAllowQueryString"in document.body.dataset,e="instantAllowExternalLinks"in document.body.dataset,n="instantWhitelist"in document.body.dataset;const r={capture:!0,passive:!0};let f=!1,v=!1,g=!1;if("instantIntensity"in document.body.dataset){const t=document.body.dataset.instantIntensity;if(t.startsWith("mousedown"))f=!0,"mousedown-only"==t&&(v=!0);else if(t.startsWith("viewport")){const e=navigator.connection&&navigator.connection.saveData,n=navigator.connection&&navigator.connection.effectiveType&&navigator.connection.effectiveType.includes("2g");e||n||("viewport"==t?document.documentElement.clientWidth*document.documentElement.clientHeight<45e4&&(g=!0):"viewport-all"==t&&(g=!0))}else{const e=parseInt(t);isNaN(e)||(s=e)}}v||document.addEventListener("touchstart",d,r);f?c||document.addEventListener("mousedown",l,r):document.addEventListener("mouseover",u,r);c&&document.addEventListener("mousedown",h,r);if(g){let t=window.requestIdleCallback;t||(t=(t=>{t()})),t(function(){const t=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const n=e.target;t.unobserve(n),p(n.href)}})});document.querySelectorAll("a").forEach(e=>{m(e)&&t.observe(e)})},{timeout:1500})}}(); ================================================ FILE: assets/js/jquery.pjax.js ================================================ /*! * Copyright 2012, Chris Wanstrath * Released under the MIT License * https://github.com/defunkt/jquery-pjax */ (function($){ // When called on a container with a selector, fetches the href with // ajax into the container or with the data-pjax attribute on the link // itself. // // Tries to make sure the back button and ctrl+click work the way // you'd expect. // // Exported as $.fn.pjax // // Accepts a jQuery ajax options object that may include these // pjax specific options: // // // container - String selector for the element where to place the response body. // push - Whether to pushState the URL. Defaults to true (of course). // replace - Want to use replaceState instead? That's cool. // // For convenience the second parameter can be either the container or // the options object. // // Returns the jQuery object function fnPjax(selector, container, options) { options = optionsFor(container, options) return this.on('click.pjax', selector, function(event) { var opts = options if (!opts.container) { opts = $.extend({}, options) opts.container = $(this).attr('data-pjax') } handleClick(event, opts) }) } // Public: pjax on click handler // // Exported as $.pjax.click. // // event - "click" jQuery.Event // options - pjax options // // Examples // // $(document).on('click', 'a', $.pjax.click) // // is the same as // $(document).pjax('a') // // Returns nothing. function handleClick(event, container, options) { options = optionsFor(container, options) var link = event.currentTarget var $link = $(link) if (link.tagName.toUpperCase() !== 'A') throw "$.fn.pjax or $.pjax.click requires an anchor element" // Middle click, cmd click, and ctrl click should open // links in a new tab as normal. if ( event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey ) return // Ignore cross origin links if ( location.protocol !== link.protocol || location.hostname !== link.hostname ) return // Ignore case when a hash is being tacked on the current URL if ( link.href.indexOf('#') > -1 && stripHash(link) == stripHash(location) ) return // Ignore event with default prevented if (event.isDefaultPrevented()) return var defaults = { url: link.href, container: $link.attr('data-pjax'), target: link } var opts = $.extend({}, defaults, options) var clickEvent = $.Event('pjax:click') $link.trigger(clickEvent, [opts]) if (!clickEvent.isDefaultPrevented()) { pjax(opts) event.preventDefault() $link.trigger('pjax:clicked', [opts]) } } // Public: pjax on form submit handler // // Exported as $.pjax.submit // // event - "click" jQuery.Event // options - pjax options // // Examples // // $(document).on('submit', 'form', function(event) { // $.pjax.submit(event, '[data-pjax-container]') // }) // // Returns nothing. function handleSubmit(event, container, options) { options = optionsFor(container, options) var form = event.currentTarget var $form = $(form) if (form.tagName.toUpperCase() !== 'FORM') throw "$.pjax.submit requires a form element" var defaults = { type: ($form.attr('method') || 'GET').toUpperCase(), url: $form.attr('action'), container: $form.attr('data-pjax'), target: form } if (defaults.type !== 'GET' && window.FormData !== undefined) { defaults.data = new FormData(form) defaults.processData = false defaults.contentType = false } else { // Can't handle file uploads, exit if ($form.find(':file').length) { return } // Fallback to manually serializing the fields defaults.data = $form.serializeArray() } pjax($.extend({}, defaults, options)) event.preventDefault() } // Loads a URL with ajax, puts the response body inside a container, // then pushState()'s the loaded URL. // // Works just like $.ajax in that it accepts a jQuery ajax // settings object (with keys like url, type, data, etc). // // Accepts these extra keys: // // container - String selector for where to stick the response body. // push - Whether to pushState the URL. Defaults to true (of course). // replace - Want to use replaceState instead? That's cool. // // Use it just like $.ajax: // // var xhr = $.pjax({ url: this.href, container: '#main' }) // console.log( xhr.readyState ) // // Returns whatever $.ajax returns. function pjax(options) { options = $.extend(true, {}, $.ajaxSettings, pjax.defaults, options) if ($.isFunction(options.url)) { options.url = options.url() } var hash = parseURL(options.url).hash var containerType = $.type(options.container) if (containerType !== 'string') { throw "expected string value for 'container' option; got " + containerType } var context = options.context = $(options.container) if (!context.length) { throw "the container selector '" + options.container + "' did not match anything" } // We want the browser to maintain two separate internal caches: one // for pjax'd partial page loads and one for normal page loads. // Without adding this secret parameter, some browsers will often // confuse the two. if (!options.data) options.data = {} if ($.isArray(options.data)) { options.data.push({name: '_pjax', value: options.container}) } else { options.data._pjax = options.container } function fire(type, args, props) { if (!props) props = {} props.relatedTarget = options.target var event = $.Event(type, props) context.trigger(event, args) return !event.isDefaultPrevented() } var timeoutTimer options.beforeSend = function(xhr, settings) { // No timeout for non-GET requests // Its not safe to request the resource again with a fallback method. if (settings.type !== 'GET') { settings.timeout = 0 } xhr.setRequestHeader('X-PJAX', 'true') xhr.setRequestHeader('X-PJAX-Container', options.container) if (!fire('pjax:beforeSend', [xhr, settings])) return false if (settings.timeout > 0) { timeoutTimer = setTimeout(function() { if (fire('pjax:timeout', [xhr, options])) xhr.abort('timeout') }, settings.timeout) // Clear timeout setting so jquerys internal timeout isn't invoked settings.timeout = 0 } var url = parseURL(settings.url) if (hash) url.hash = hash options.requestUrl = stripInternalParams(url) } options.complete = function(xhr, textStatus) { if (timeoutTimer) clearTimeout(timeoutTimer) fire('pjax:complete', [xhr, textStatus, options]) fire('pjax:end', [xhr, options]) } options.error = function(xhr, textStatus, errorThrown) { var container = extractContainer("", xhr, options) var allowed = fire('pjax:error', [xhr, textStatus, errorThrown, options]) if (options.type == 'GET' && textStatus !== 'abort' && allowed) { locationReplace(container.url) } } options.success = function(data, status, xhr) { var previousState = pjax.state // If $.pjax.defaults.version is a function, invoke it first. // Otherwise it can be a static string. var currentVersion = typeof $.pjax.defaults.version === 'function' ? $.pjax.defaults.version() : $.pjax.defaults.version var latestVersion = xhr.getResponseHeader('X-PJAX-Version') var container = extractContainer(data, xhr, options) var url = parseURL(container.url) if (hash) { url.hash = hash container.url = url.href } // If there is a layout version mismatch, hard load the new url if (currentVersion && latestVersion && currentVersion !== latestVersion) { locationReplace(container.url) return } // If the new response is missing a body, hard load the page if (!container.contents) { locationReplace(container.url) return } pjax.state = { id: options.id || uniqueId(), url: container.url, title: container.title, container: options.container, fragment: options.fragment, timeout: options.timeout } if (options.push || options.replace) { window.history.replaceState(pjax.state, container.title, container.url) } // Only blur the focus if the focused element is within the container. var blurFocus = $.contains(context, document.activeElement) // Clear out any focused controls before inserting new page contents. if (blurFocus) { try { document.activeElement.blur() } catch (e) { /* ignore */ } } if (container.title) document.title = container.title fire('pjax:beforeReplace', [container.contents, options], { state: pjax.state, previousState: previousState }) context.html(container.contents) // FF bug: Won't autofocus fields that are inserted via JS. // This behavior is incorrect. So if theres no current focus, autofocus // the last field. // // http://www.w3.org/html/wg/drafts/html/master/forms.html var autofocusEl = context.find('input[autofocus], textarea[autofocus]').last()[0] if (autofocusEl && document.activeElement !== autofocusEl) { autofocusEl.focus() } executeScriptTags(container.scripts) var scrollTo = options.scrollTo // Ensure browser scrolls to the element referenced by the URL anchor if (hash) { var name = decodeURIComponent(hash.slice(1)) var target = document.getElementById(name) || document.getElementsByName(name)[0] if (target) scrollTo = $(target).offset().top } if (typeof scrollTo == 'number') $(window).scrollTop(scrollTo) fire('pjax:success', [data, status, xhr, options]) } // Initialize pjax.state for the initial page load. Assume we're // using the container and options of the link we're loading for the // back button to the initial page. This ensures good back button // behavior. if (!pjax.state) { pjax.state = { id: uniqueId(), url: window.location.href, title: document.title, container: options.container, fragment: options.fragment, timeout: options.timeout } window.history.replaceState(pjax.state, document.title) } // Cancel the current request if we're already pjaxing abortXHR(pjax.xhr) pjax.options = options var xhr = pjax.xhr = $.ajax(options) if (xhr.readyState > 0) { if (options.push && !options.replace) { // Cache current container element before replacing it cachePush(pjax.state.id, [options.container, cloneContents(context)]) window.history.pushState(null, "", options.requestUrl) } fire('pjax:start', [xhr, options]) fire('pjax:send', [xhr, options]) } return pjax.xhr } // Public: Reload current page with pjax. // // Returns whatever $.pjax returns. function pjaxReload(container, options) { var defaults = { url: window.location.href, push: false, replace: true, scrollTo: false } return pjax($.extend(defaults, optionsFor(container, options))) } // Internal: Hard replace current state with url. // // Work for around WebKit // https://bugs.webkit.org/show_bug.cgi?id=93506 // // Returns nothing. function locationReplace(url) { window.history.replaceState(null, "", pjax.state.url) window.location.replace(url) } var initialPop = true var initialURL = window.location.href var initialState = window.history.state // Initialize $.pjax.state if possible // Happens when reloading a page and coming forward from a different // session history. if (initialState && initialState.container) { pjax.state = initialState } // Non-webkit browsers don't fire an initial popstate event if ('state' in window.history) { initialPop = false } // popstate handler takes care of the back and forward buttons // // You probably shouldn't use pjax on pages with other pushState // stuff yet. function onPjaxPopstate(event) { // Hitting back or forward should override any pending PJAX request. if (!initialPop) { abortXHR(pjax.xhr) } var previousState = pjax.state var state = event.state var direction if (state && state.container) { // When coming forward from a separate history session, will get an // initial pop with a state we are already at. Skip reloading the current // page. if (initialPop && initialURL == state.url) return if (previousState) { // If popping back to the same state, just skip. // Could be clicking back from hashchange rather than a pushState. if (previousState.id === state.id) return // Since state IDs always increase, we can deduce the navigation direction direction = previousState.id < state.id ? 'forward' : 'back' } var cache = cacheMapping[state.id] || [] var containerSelector = cache[0] || state.container var container = $(containerSelector), contents = cache[1] if (container.length) { if (previousState) { // Cache current container before replacement and inform the // cache which direction the history shifted. cachePop(direction, previousState.id, [containerSelector, cloneContents(container)]) } var popstateEvent = $.Event('pjax:popstate', { state: state, direction: direction }) container.trigger(popstateEvent) var options = { id: state.id, url: state.url, container: containerSelector, push: false, fragment: state.fragment, timeout: state.timeout, scrollTo: false } if (contents) { container.trigger('pjax:start', [null, options]) pjax.state = state if (state.title) document.title = state.title var beforeReplaceEvent = $.Event('pjax:beforeReplace', { state: state, previousState: previousState }) container.trigger(beforeReplaceEvent, [contents, options]) container.html(contents) container.trigger('pjax:end', [null, options]) } else { pjax(options) } // Force reflow/relayout before the browser tries to restore the // scroll position. container[0].offsetHeight // eslint-disable-line no-unused-expressions } else { locationReplace(location.href) } } initialPop = false } // Fallback version of main pjax function for browsers that don't // support pushState. // // Returns nothing since it retriggers a hard form submission. function fallbackPjax(options) { var url = $.isFunction(options.url) ? options.url() : options.url, method = options.type ? options.type.toUpperCase() : 'GET' var form = $('
    ', { method: method === 'GET' ? 'GET' : 'POST', action: url, style: 'display:none' }) if (method !== 'GET' && method !== 'POST') { form.append($('', { type: 'hidden', name: '_method', value: method.toLowerCase() })) } var data = options.data if (typeof data === 'string') { $.each(data.split('&'), function(index, value) { var pair = value.split('=') form.append($('', {type: 'hidden', name: pair[0], value: pair[1]})) }) } else if ($.isArray(data)) { $.each(data, function(index, value) { form.append($('', {type: 'hidden', name: value.name, value: value.value})) }) } else if (typeof data === 'object') { var key for (key in data) form.append($('', {type: 'hidden', name: key, value: data[key]})) } $(document.body).append(form) form.submit() } // Internal: Abort an XmlHttpRequest if it hasn't been completed, // also removing its event handlers. function abortXHR(xhr) { if ( xhr && xhr.readyState < 4) { xhr.onreadystatechange = $.noop xhr.abort() } } // Internal: Generate unique id for state object. // // Use a timestamp instead of a counter since ids should still be // unique across page loads. // // Returns Number. function uniqueId() { return (new Date).getTime() } function cloneContents(container) { var cloned = container.clone() // Unmark script tags as already being eval'd so they can get executed again // when restored from cache. HAXX: Uses jQuery internal method. cloned.find('script').each(function(){ if (!this.src) $._data(this, 'globalEval', false) }) return cloned.contents() } // Internal: Strip internal query params from parsed URL. // // Returns sanitized url.href String. function stripInternalParams(url) { url.search = url.search.replace(/([?&])(_pjax|_)=[^&]*/g, '').replace(/^&/, '') return url.href.replace(/\?($|#)/, '$1') } // Internal: Parse URL components and returns a Locationish object. // // url - String URL // // Returns HTMLAnchorElement that acts like Location. function parseURL(url) { var a = document.createElement('a') a.href = url return a } // Internal: Return the `href` component of given URL object with the hash // portion removed. // // location - Location or HTMLAnchorElement // // Returns String function stripHash(location) { return location.href.replace(/#.*/, '') } // Internal: Build options Object for arguments. // // For convenience the first parameter can be either the container or // the options object. // // Examples // // optionsFor('#container') // // => {container: '#container'} // // optionsFor('#container', {push: true}) // // => {container: '#container', push: true} // // optionsFor({container: '#container', push: true}) // // => {container: '#container', push: true} // // Returns options Object. function optionsFor(container, options) { if (container && options) { options = $.extend({}, options) options.container = container return options } else if ($.isPlainObject(container)) { return container } else { return {container: container} } } // Internal: Filter and find all elements matching the selector. // // Where $.fn.find only matches descendants, findAll will test all the // top level elements in the jQuery object as well. // // elems - jQuery object of Elements // selector - String selector to match // // Returns a jQuery object. function findAll(elems, selector) { return elems.filter(selector).add(elems.find(selector)) } function parseHTML(html) { return $.parseHTML(html, document, true) } // Internal: Extracts container and metadata from response. // // 1. Extracts X-PJAX-URL header if set // 2. Extracts inline tags // 3. Builds response Element and extracts fragment if set // // data - String response data // xhr - XHR response // options - pjax options Object // // Returns an Object with url, title, and contents keys. function extractContainer(data, xhr, options) { var obj = {}, fullDocument = /<html/i.test(data) // Prefer X-PJAX-URL header if it was set, otherwise fallback to // using the original requested url. var serverUrl = xhr.getResponseHeader('X-PJAX-URL') obj.url = serverUrl ? stripInternalParams(parseURL(serverUrl)) : options.requestUrl var $head, $body // Attempt to parse response html into elements if (fullDocument) { $body = $(parseHTML(data.match(/<body[^>]*>([\s\S.]*)<\/body>/i)[0])) var head = data.match(/<head[^>]*>([\s\S.]*)<\/head>/i) $head = head != null ? $(parseHTML(head[0])) : $body } else { $head = $body = $(parseHTML(data)) } // If response data is empty, return fast if ($body.length === 0) return obj // If there's a <title> tag in the header, use it as // the page's title. obj.title = findAll($head, 'title').last().text() if (options.fragment) { var $fragment = $body // If they specified a fragment, look for it in the response // and pull it out. if (options.fragment !== 'body') { $fragment = findAll($fragment, options.fragment).first() } if ($fragment.length) { obj.contents = options.fragment === 'body' ? $fragment : $fragment.contents() // If there's no title, look for data-title and title attributes // on the fragment if (!obj.title) obj.title = $fragment.attr('title') || $fragment.data('title') } } else if (!fullDocument) { obj.contents = $body } // Clean up any <title> tags if (obj.contents) { // Remove any parent title elements obj.contents = obj.contents.not(function() { return $(this).is('title') }) // Then scrub any titles from their descendants obj.contents.find('title').remove() // Gather all script[src] elements } // Trim any whitespace off the title if (obj.title) obj.title = $.trim(obj.title) return obj } // Load an execute scripts using standard script request. // // Avoids jQuery's traditional $.getScript which does a XHR request and // globalEval. // // scripts - jQuery object of script Elements // // Returns nothing. function executeScriptTags(scripts) { if (!scripts) return var existingScripts = $('script[src]') scripts.each(function() { var src = this.src var matchedScripts = existingScripts.filter(function() { return this.src === src }) if (matchedScripts.length) return var script = document.createElement('script') var type = $(this).attr('type') if (type) script.type = type script.src = $(this).attr('src') document.head.appendChild(script) }) } // Internal: History DOM caching class. var cacheMapping = {} var cacheForwardStack = [] var cacheBackStack = [] // Push previous state id and container contents into the history // cache. Should be called in conjunction with `pushState` to save the // previous container contents. // // id - State ID Number // value - DOM Element to cache // // Returns nothing. function cachePush(id, value) { cacheMapping[id] = value cacheBackStack.push(id) // Remove all entries in forward history stack after pushing a new page. trimCacheStack(cacheForwardStack, 0) // Trim back history stack to max cache length. trimCacheStack(cacheBackStack, pjax.defaults.maxCacheLength) } // Shifts cache from directional history cache. Should be // called on `popstate` with the previous state id and container // contents. // // direction - "forward" or "back" String // id - State ID Number // value - DOM Element to cache // // Returns nothing. function cachePop(direction, id, value) { var pushStack, popStack cacheMapping[id] = value if (direction === 'forward') { pushStack = cacheBackStack popStack = cacheForwardStack } else { pushStack = cacheForwardStack popStack = cacheBackStack } pushStack.push(id) id = popStack.pop() if (id) delete cacheMapping[id] // Trim whichever stack we just pushed to to max cache length. trimCacheStack(pushStack, pjax.defaults.maxCacheLength) } // Trim a cache stack (either cacheBackStack or cacheForwardStack) to be no // longer than the specified length, deleting cached DOM elements as necessary. // // stack - Array of state IDs // length - Maximum length to trim to // // Returns nothing. function trimCacheStack(stack, length) { while (stack.length > length) delete cacheMapping[stack.shift()] } // Public: Find version identifier for the initial page load. // // Returns String version or undefined. function findVersion() { return $('meta').filter(function() { var name = $(this).attr('http-equiv') return name && name.toUpperCase() === 'X-PJAX-VERSION' }).attr('content') } // Install pjax functions on $.pjax to enable pushState behavior. // // Does nothing if already enabled. // // Examples // // $.pjax.enable() // // Returns nothing. function enable() { $.fn.pjax = fnPjax $.pjax = pjax $.pjax.enable = $.noop $.pjax.disable = disable $.pjax.click = handleClick $.pjax.submit = handleSubmit $.pjax.reload = pjaxReload $.pjax.defaults = { timeout: 650, push: true, replace: false, type: 'GET', dataType: 'html', scrollTo: 0, maxCacheLength: 20, version: findVersion } $(window).on('popstate.pjax', onPjaxPopstate) } // Disable pushState behavior. // // This is the case when a browser doesn't support pushState. It is // sometimes useful to disable pushState for debugging on a modern // browser. // // Examples // // $.pjax.disable() // // Returns nothing. function disable() { $.fn.pjax = function() { return this } $.pjax = fallbackPjax $.pjax.enable = enable $.pjax.disable = $.noop $.pjax.click = $.noop $.pjax.submit = $.noop $.pjax.reload = function() { window.location.reload() } $(window).off('popstate.pjax', onPjaxPopstate) } // Add the state property to jQuery's event object so we can use it in // $(window).bind('popstate') if ($.event.props && $.inArray('state', $.event.props) < 0) { $.event.props.push('state') } else if (!('state' in $.Event.prototype)) { $.event.addProp('state') } // Is pjax supported by this browser? $.support.pjax = window.history && window.history.pushState && window.history.replaceState && // pushState isn't reliable on iOS until 5. !navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/) if ($.support.pjax) { enable() } else { disable() } })(jQuery) ================================================ FILE: assets/js/lazyloads.js ================================================ /*! * Lazy Load - JavaScript plugin for lazy loading images * * Copyright (c) 2007-2019 Mika Tuupola * * Licensed under the MIT license: * http://www.opensource.org/licenses/mit-license.php * * Project home: * https://appelsiini.net/projects/lazyload * * Version: 2.0.0-rc.2 * */ (function (root, factory) { if (typeof exports === "object") { module.exports = factory(root); } else if (typeof define === "function" && define.amd) { define([], factory); } else { root.LazyLoad = factory(root); } }) (typeof global !== "undefined" ? global : this.window || this.global, function (root) { "use strict"; if (typeof define === "function" && define.amd){ root = window; } const defaults = { src: "data-src", srcset: "data-srcset", selector: ".lazyload", root: null, rootMargin: "0px", threshold: 0 }; /** * Merge two or more objects. Returns a new object. * @private * @param {Boolean} deep If true, do a deep (or recursive) merge [optional] * @param {Object} objects The objects to merge together * @returns {Object} Merged values of defaults and options */ const extend = function () { let extended = {}; let deep = false; let i = 0; let length = arguments.length; /* Check if a deep merge */ if (Object.prototype.toString.call(arguments[0]) === "[object Boolean]") { deep = arguments[0]; i++; } /* Merge the object into the extended object */ let merge = function (obj) { for (let prop in obj) { if (Object.prototype.hasOwnProperty.call(obj, prop)) { /* If deep merge and property is an object, merge properties */ if (deep && Object.prototype.toString.call(obj[prop]) === "[object Object]") { extended[prop] = extend(true, extended[prop], obj[prop]); } else { extended[prop] = obj[prop]; } } } }; /* Loop through each object and conduct a merge */ for (; i < length; i++) { let obj = arguments[i]; merge(obj); } return extended; }; function LazyLoad(images, options) { this.settings = extend(defaults, options || {}); this.images = images || document.querySelectorAll(this.settings.selector); this.observer = null; this.init(); } LazyLoad.prototype = { init: function() { /* Without observers load everything and bail out early. */ if (!root.IntersectionObserver) { this.loadImages(); return; } let self = this; let observerConfig = { root: this.settings.root, rootMargin: this.settings.rootMargin, threshold: [this.settings.threshold] }; this.observer = new IntersectionObserver(function(entries) { Array.prototype.forEach.call(entries, function (entry) { if (entry.isIntersecting) { self.observer.unobserve(entry.target); let src = entry.target.getAttribute(self.settings.src); let srcset = entry.target.getAttribute(self.settings.srcset); if ("img" === entry.target.tagName.toLowerCase()) { if (src) { entry.target.src = src; } if (srcset) { entry.target.srcset = srcset; } } else { entry.target.style.backgroundImage = "url(" + src + ")"; } } }); }, observerConfig); Array.prototype.forEach.call(this.images, function (image) { self.observer.observe(image); }); }, loadAndDestroy: function () { if (!this.settings) { return; } this.loadImages(); this.destroy(); }, loadImages: function () { if (!this.settings) { return; } let self = this; Array.prototype.forEach.call(this.images, function (image) { let src = image.getAttribute(self.settings.src); let srcset = image.getAttribute(self.settings.srcset); if ("img" === image.tagName.toLowerCase()) { if (src) { image.src = src; } if (srcset) { image.srcset = srcset; } } else { image.style.backgroundImage = "url('" + src + "')"; } }); }, destroy: function () { if (!this.settings) { return; } this.observer.disconnect(); this.settings = null; } }; root.lazyload = function(images, options) { return new LazyLoad(images, options); }; if (root.jQuery) { const $ = root.jQuery; $.fn.lazyload = function (options) { options = options || {}; options.attribute = options.attribute || "data-src"; new LazyLoad($.makeArray(this), options); return this; }; } return LazyLoad; }); ================================================ FILE: assets/js/modules/darkmode.js ================================================ //黑暗模式 function darkMode(){ //黑暗模式 if(setting.darkmode == 'true'){ const logo = $('#sitelogo').attr('src'); if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){ if(localStorage.getItem('theme') == 'dark'){ $('#sitelogo').attr("src",setting.darkmode_logo); } else{ $('#sitelogo').attr("src",logo); } } if(setting.darkmodetype !== '' && setting.darkmodetype.indexOf("2") !== -1){ //跟随系统逻辑判断 const media = window.matchMedia('(prefers-color-scheme:dark)'); media.addEventListener('change',(e) => { if (e.matches) { $('#darkmode').attr("checked", true); document.documentElement.setAttribute('data-theme', 'dark'); localStorage.setItem('theme', 'dark'); if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){ $('#sitelogo').attr("src",setting.darkmode_logo); } } else { $('#darkmode').attr("checked", false); document.documentElement.setAttribute('data-theme', 'light'); localStorage.setItem('theme', 'light'); if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){ $('#sitelogo').attr("src",logo); } } }); } if(setting.darkmodetype !== '' && setting.darkmodetype.indexOf("1") != -1){ //根据早晚时间自动设置 const nowtime = new Date().getHours(); if(localStorage.getItem('clickmode') !== 'true'){ if (nowtime >= 22 && nowtime <= 6 || nowtime === 22){ $('#darkmode').attr("checked", true); document.documentElement.setAttribute('data-theme', 'dark'); localStorage.setItem('theme', 'dark'); localStorage.setItem('automode', 'true'); if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){ $('#sitelogo').attr("src",setting.darkmode_logo); } } else{ if(localStorage.getItem("automode") == 'true'){ localStorage.removeItem('automode'); if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){ $('#sitelogo').attr("src",logo); } } } } } const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null; $('#darkmode').on('click',function(){ if (setting.Mournmode == 'true') { $('body').toast({ title:'抱歉', class: 'warning', message: '当前处于哀悼模式,无法进入夜间模式哦~', showIcon: 'flushed outline', showProgress: 'top', }); return false; } if(localStorage.getItem("automode") == 'true'){ localStorage.setItem('clickmode', 'true'); } else{ localStorage.removeItem('clickmode'); } if($('#darkmode').is(':checked')){ document.documentElement.setAttribute('data-theme', 'dark'); localStorage.setItem('theme', 'dark'); if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){ $('#sitelogo').attr("src",setting.darkmode_logo); } } else{ document.documentElement.setAttribute('data-theme', 'light'); localStorage.setItem('theme', 'light'); if(setting.logo_type == 'image' && setting.darkmode_logo !== ''){ $('#sitelogo').attr("src",logo); } } }); if (currentTheme && setting.Mournmode !== 'true') { document.documentElement.setAttribute('data-theme', currentTheme); if (currentTheme === 'light') { $('#darkmode').attr("checked", false); } else if (currentTheme === 'dark') { $('#darkmode').attr("checked", true); } } } } darkMode(); ================================================ FILE: assets/js/nprogress.js ================================================ /* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress * @license MIT */ ;(function(root, factory) { if (typeof define === 'function' && define.amd) { define(factory); } else if (typeof exports === 'object') { module.exports = factory(); } else { root.NProgress = factory(); } })(this, function() { var NProgress = {}; NProgress.version = '0.2.0'; var Settings = NProgress.settings = { minimum: 0.08, easing: 'ease', positionUsing: '', speed: 200, trickle: true, trickleRate: 0.02, trickleSpeed: 800, showSpinner: true, barSelector: '[role="bar"]', spinnerSelector: '[role="spinner"]', parent: 'body', template: '<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>' }; /** * Updates configuration. * * NProgress.configure({ * minimum: 0.1 * }); */ NProgress.configure = function(options) { var key, value; for (key in options) { value = options[key]; if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value; } return this; }; /** * Last number. */ NProgress.status = null; /** * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`. * * NProgress.set(0.4); * NProgress.set(1.0); */ NProgress.set = function(n) { var started = NProgress.isStarted(); n = clamp(n, Settings.minimum, 1); NProgress.status = (n === 1 ? null : n); var progress = NProgress.render(!started), bar = progress.querySelector(Settings.barSelector), speed = Settings.speed, ease = Settings.easing; progress.offsetWidth; /* Repaint */ queue(function(next) { // Set positionUsing if it hasn't already been set if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS(); // Add transition css(bar, barPositionCSS(n, speed, ease)); if (n === 1) { // Fade out css(progress, { transition: 'none', opacity: 1 }); progress.offsetWidth; /* Repaint */ setTimeout(function() { css(progress, { transition: 'all ' + speed + 'ms linear', opacity: 0 }); setTimeout(function() { NProgress.remove(); next(); }, speed); }, speed); } else { setTimeout(next, speed); } }); return this; }; NProgress.isStarted = function() { return typeof NProgress.status === 'number'; }; /** * Shows the progress bar. * This is the same as setting the status to 0%, except that it doesn't go backwards. * * NProgress.start(); * */ NProgress.start = function() { if (!NProgress.status) NProgress.set(0); var work = function() { setTimeout(function() { if (!NProgress.status) return; NProgress.trickle(); work(); }, Settings.trickleSpeed); }; if (Settings.trickle) work(); return this; }; /** * Hides the progress bar. * This is the *sort of* the same as setting the status to 100%, with the * difference being `done()` makes some placebo effect of some realistic motion. * * NProgress.done(); * * If `true` is passed, it will show the progress bar even if its hidden. * * NProgress.done(true); */ NProgress.done = function(force) { if (!force && !NProgress.status) return this; return NProgress.inc(0.3 + 0.5 * Math.random()).set(1); }; /** * Increments by a random amount. */ NProgress.inc = function(amount) { var n = NProgress.status; if (!n) { return NProgress.start(); } else { if (typeof amount !== 'number') { amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95); } n = clamp(n + amount, 0, 0.994); return NProgress.set(n); } }; NProgress.trickle = function() { return NProgress.inc(Math.random() * Settings.trickleRate); }; /** * Waits for all supplied jQuery promises and * increases the progress as the promises resolve. * * @param $promise jQUery Promise */ (function() { var initial = 0, current = 0; NProgress.promise = function($promise) { if (!$promise || $promise.state() === "resolved") { return this; } if (current === 0) { NProgress.start(); } initial++; current++; $promise.always(function() { current--; if (current === 0) { initial = 0; NProgress.done(); } else { NProgress.set((initial - current) / initial); } }); return this; }; })(); /** * (Internal) renders the progress bar markup based on the `template` * setting. */ NProgress.render = function(fromStart) { if (NProgress.isRendered()) return document.getElementById('nprogress'); addClass(document.documentElement, 'nprogress-busy'); var progress = document.createElement('div'); progress.id = 'nprogress'; progress.innerHTML = Settings.template; var bar = progress.querySelector(Settings.barSelector), perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0), parent = document.querySelector(Settings.parent), spinner; css(bar, { transition: 'all 0 linear', transform: 'translate3d(' + perc + '%,0,0)' }); if (!Settings.showSpinner) { spinner = progress.querySelector(Settings.spinnerSelector); spinner && removeElement(spinner); } if (parent != document.body) { addClass(parent, 'nprogress-custom-parent'); } parent.appendChild(progress); return progress; }; /** * Removes the element. Opposite of render(). */ NProgress.remove = function() { removeClass(document.documentElement, 'nprogress-busy'); removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent'); var progress = document.getElementById('nprogress'); progress && removeElement(progress); }; /** * Checks if the progress bar is rendered. */ NProgress.isRendered = function() { return !!document.getElementById('nprogress'); }; /** * Determine which positioning CSS rule to use. */ NProgress.getPositioningCSS = function() { // Sniff on document.body.style var bodyStyle = document.body.style; // Sniff prefixes var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' : ('MozTransform' in bodyStyle) ? 'Moz' : ('msTransform' in bodyStyle) ? 'ms' : ('OTransform' in bodyStyle) ? 'O' : ''; if (vendorPrefix + 'Perspective' in bodyStyle) { // Modern browsers with 3D support, e.g. Webkit, IE10 return 'translate3d'; } else if (vendorPrefix + 'Transform' in bodyStyle) { // Browsers without 3D support, e.g. IE9 return 'translate'; } else { // Browsers without translate() support, e.g. IE7-8 return 'margin'; } }; /** * Helpers */ function clamp(n, min, max) { if (n < min) return min; if (n > max) return max; return n; } /** * (Internal) converts a percentage (`0..1`) to a bar translateX * percentage (`-100%..0%`). */ function toBarPerc(n) { return (-1 + n) * 100; } /** * (Internal) returns the correct CSS for changing the bar's * position given an n percentage, and speed and ease from Settings */ function barPositionCSS(n, speed, ease) { var barCSS; if (Settings.positionUsing === 'translate3d') { barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' }; } else if (Settings.positionUsing === 'translate') { barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' }; } else { barCSS = { 'margin-left': toBarPerc(n)+'%' }; } barCSS.transition = 'all '+speed+'ms '+ease; return barCSS; } /** * (Internal) Queues a function to be executed. */ var queue = (function() { var pending = []; function next() { var fn = pending.shift(); if (fn) { fn(next); } } return function(fn) { pending.push(fn); if (pending.length == 1) next(); }; })(); /** * (Internal) Applies css properties to an element, similar to the jQuery * css method. * * While this helper does assist with vendor prefixed property names, it * does not perform any manipulation of values prior to setting styles. */ var css = (function() { var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ], cssProps = {}; function camelCase(string) { return string.replace(/^-ms-/, 'ms-').replace(/-([\da-z])/gi, function(match, letter) { return letter.toUpperCase(); }); } function getVendorProp(name) { var style = document.body.style; if (name in style) return name; var i = cssPrefixes.length, capName = name.charAt(0).toUpperCase() + name.slice(1), vendorName; while (i--) { vendorName = cssPrefixes[i] + capName; if (vendorName in style) return vendorName; } return name; } function getStyleProp(name) { name = camelCase(name); return cssProps[name] || (cssProps[name] = getVendorProp(name)); } function applyCss(element, prop, value) { prop = getStyleProp(prop); element.style[prop] = value; } return function(element, properties) { var args = arguments, prop, value; if (args.length == 2) { for (prop in properties) { value = properties[prop]; if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value); } } else { applyCss(element, args[1], args[2]); } } })(); /** * (Internal) Determines if an element or space separated list of class names contains a class name. */ function hasClass(element, name) { var list = typeof element == 'string' ? element : classList(element); return list.indexOf(' ' + name + ' ') >= 0; } /** * (Internal) Adds a class to an element. */ function addClass(element, name) { var oldList = classList(element), newList = oldList + name; if (hasClass(oldList, name)) return; // Trim the opening space. element.className = newList.substring(1); } /** * (Internal) Removes a class from an element. */ function removeClass(element, name) { var oldList = classList(element), newList; if (!hasClass(element, name)) return; // Replace the class name. newList = oldList.replace(' ' + name + ' ', ' '); // Trim the opening and closing spaces. element.className = newList.substring(1, newList.length - 1); } /** * (Internal) Gets a space separated list of the class names on the element. * The list is wrapped with a single space on each end to facilitate finding * matches within the list. */ function classList(element) { return (' ' + (element.className || '') + ' ').replace(/\s+/gi, ' '); } /** * (Internal) Removes an element from the DOM. */ function removeElement(element) { element && element.parentNode && element.parentNode.removeChild(element); } return NProgress; }); ================================================ FILE: assets/js/progress.js ================================================ (function($){$.fn.extend({headBand:function(option){var ViewH=$(window).height(),ScrollH=$('body')[0].scrollHeight,S_V=ScrollH-ViewH,getThis=this.prop("className")!==""?"."+this.prop("className"):this.prop("id")!==""?"#"+this.prop("id"):this.prop("nodeName");$(window).scroll(function(){var ViewH_s=$(this).height(),ScrollH_s=$('body')[0].scrollHeight,ScoT_s=$(this).scrollTop(),Band_w=100-(ScrollH_s-ViewH_s-ScoT_s)/S_V*100;defaultSetting={background:"green",height:3,width:Band_w+'%'};setting=$.extend(defaultSetting,option);$(getThis).css({"background":setting.background,'position':'fixed','top':'0','z-index':'99999',"height":setting.height+"px",'width':defaultSetting.width})});return this}})}(jQuery)); ================================================ FILE: assets/js/sw-toolbox.js ================================================ /* Copyright 2016 Google Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.toolbox=e()}}(function(){return function e(t,n,r){function o(c,s){if(!n[c]){if(!t[c]){var a="function"==typeof require&&require;if(!s&&a)return a(c,!0);if(i)return i(c,!0);var u=new Error("Cannot find module '"+c+"'");throw u.code="MODULE_NOT_FOUND",u}var f=n[c]={exports:{}};t[c][0].call(f.exports,function(e){var n=t[c][1][e];return o(n||e)},f,f.exports,e,t,n,r)}return n[c].exports}for(var i="function"==typeof require&&require,c=0;c<r.length;c++)o(r[c]);return o}({1:[function(e,t,n){"use strict";function r(e,t){t=t||{},(t.debug||m.debug)&&console.log("[sw-toolbox] "+e)}function o(e){var t;return e&&e.cache&&(t=e.cache.name),t=t||m.cache.name,caches.open(t)}function i(e,t){t=t||{};var n=t.successResponses||m.successResponses;return fetch(e.clone()).then(function(r){return"GET"===e.method&&n.test(r.status)&&o(t).then(function(n){n.put(e,r).then(function(){var r=t.cache||m.cache;(r.maxEntries||r.maxAgeSeconds)&&r.name&&c(e,n,r)})}),r.clone()})}function c(e,t,n){var r=s.bind(null,e,t,n);d=d?d.then(r):r()}function s(e,t,n){var o=e.url,i=n.maxAgeSeconds,c=n.maxEntries,s=n.name,a=Date.now();return r("Updating LRU order for "+o+". Max entries is "+c+", max age is "+i),g.getDb(s).then(function(e){return g.setTimestampForUrl(e,o,a)}).then(function(e){return g.expireEntries(e,c,i,a)}).then(function(e){r("Successfully updated IDB.");var n=e.map(function(e){return t.delete(e)});return Promise.all(n).then(function(){r("Done with cache cleanup.")})}).catch(function(e){r(e)})}function a(e,t,n){return r("Renaming cache: ["+e+"] to ["+t+"]",n),caches.delete(t).then(function(){return Promise.all([caches.open(e),caches.open(t)]).then(function(t){var n=t[0],r=t[1];return n.keys().then(function(e){return Promise.all(e.map(function(e){return n.match(e).then(function(t){return r.put(e,t)})}))}).then(function(){return caches.delete(e)})})})}function u(e,t){return o(t).then(function(t){return t.add(e)})}function f(e,t){return o(t).then(function(t){return t.delete(e)})}function h(e){e instanceof Promise||p(e),m.preCacheItems=m.preCacheItems.concat(e)}function p(e){var t=Array.isArray(e);if(t&&e.forEach(function(e){"string"==typeof e||e instanceof Request||(t=!1)}),!t)throw new TypeError("The precache method expects either an array of strings and/or Requests or a Promise that resolves to an array of strings and/or Requests.");return e}function l(e,t,n){if(!e)return!1;if(t){var r=e.headers.get("date");if(r){if(new Date(r).getTime()+1e3*t<n)return!1}}return!0}var d,m=e("./options"),g=e("./idb-cache-expiration");t.exports={debug:r,fetchAndCache:i,openCache:o,renameCache:a,cache:u,uncache:f,precache:h,validatePrecacheInput:p,isResponseFresh:l}},{"./idb-cache-expiration":2,"./options":4}],2:[function(e,t,n){"use strict";function r(e){return new Promise(function(t,n){var r=indexedDB.open(u+e,f);r.onupgradeneeded=function(){r.result.createObjectStore(h,{keyPath:p}).createIndex(l,l,{unique:!1})},r.onsuccess=function(){t(r.result)},r.onerror=function(){n(r.error)}})}function o(e){return e in d||(d[e]=r(e)),d[e]}function i(e,t,n){return new Promise(function(r,o){var i=e.transaction(h,"readwrite");i.objectStore(h).put({url:t,timestamp:n}),i.oncomplete=function(){r(e)},i.onabort=function(){o(i.error)}})}function c(e,t,n){return t?new Promise(function(r,o){var i=1e3*t,c=[],s=e.transaction(h,"readwrite"),a=s.objectStore(h);a.index(l).openCursor().onsuccess=function(e){var t=e.target.result;if(t&&n-i>t.value[l]){var r=t.value[p];c.push(r),a.delete(r),t.continue()}},s.oncomplete=function(){r(c)},s.onabort=o}):Promise.resolve([])}function s(e,t){return t?new Promise(function(n,r){var o=[],i=e.transaction(h,"readwrite"),c=i.objectStore(h),s=c.index(l),a=s.count();s.count().onsuccess=function(){var e=a.result;e>t&&(s.openCursor().onsuccess=function(n){var r=n.target.result;if(r){var i=r.value[p];o.push(i),c.delete(i),e-o.length>t&&r.continue()}})},i.oncomplete=function(){n(o)},i.onabort=r}):Promise.resolve([])}function a(e,t,n,r){return c(e,n,r).then(function(n){return s(e,t).then(function(e){return n.concat(e)})})}var u="sw-toolbox-",f=1,h="store",p="url",l="timestamp",d={};t.exports={getDb:o,setTimestampForUrl:i,expireEntries:a}},{}],3:[function(e,t,n){"use strict";function r(e){var t=a.match(e.request);t?e.respondWith(t(e.request)):a.default&&"GET"===e.request.method&&0===e.request.url.indexOf("http")&&e.respondWith(a.default(e.request))}function o(e){s.debug("activate event fired");var t=u.cache.name+"$$$inactive$$$";e.waitUntil(s.renameCache(t,u.cache.name))}function i(e){return e.reduce(function(e,t){return e.concat(t)},[])}function c(e){var t=u.cache.name+"$$$inactive$$$";s.debug("install event fired"),s.debug("creating cache ["+t+"]"),e.waitUntil(s.openCache({cache:{name:t}}).then(function(e){return Promise.all(u.preCacheItems).then(i).then(s.validatePrecacheInput).then(function(t){return s.debug("preCache list: "+(t.join(", ")||"(none)")),e.addAll(t)})}))}e("serviceworker-cache-polyfill");var s=e("./helpers"),a=e("./router"),u=e("./options");t.exports={fetchListener:r,activateListener:o,installListener:c}},{"./helpers":1,"./options":4,"./router":6,"serviceworker-cache-polyfill":16}],4:[function(e,t,n){"use strict";var r;r=self.registration?self.registration.scope:self.scope||new URL("./",self.location).href,t.exports={cache:{name:"$$$toolbox-cache$$$"+r+"$$$",maxAgeSeconds:null,maxEntries:null,queryOptions:null},debug:!1,networkTimeoutSeconds:null,preCacheItems:[],successResponses:/^0|([123]\d\d)|(40[14567])|410$/}},{}],5:[function(e,t,n){"use strict";var r=new URL("./",self.location),o=r.pathname,i=e("path-to-regexp"),c=function(e,t,n,r){t instanceof RegExp?this.fullUrlRegExp=t:(0!==t.indexOf("/")&&(t=o+t),this.keys=[],this.regexp=i(t,this.keys)),this.method=e,this.options=r,this.handler=n};c.prototype.makeHandler=function(e){var t;if(this.regexp){var n=this.regexp.exec(e);t={},this.keys.forEach(function(e,r){t[e.name]=n[r+1]})}return function(e){return this.handler(e,t,this.options)}.bind(this)},t.exports=c},{"path-to-regexp":15}],6:[function(e,t,n){"use strict";function r(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var o=e("./route"),i=e("./helpers"),c=function(e,t){for(var n=e.entries(),r=n.next(),o=[];!r.done;){new RegExp(r.value[0]).test(t)&&o.push(r.value[1]),r=n.next()}return o},s=function(){this.routes=new Map,this.routes.set(RegExp,new Map),this.default=null};["get","post","put","delete","head","any"].forEach(function(e){s.prototype[e]=function(t,n,r){return this.add(e,t,n,r)}}),s.prototype.add=function(e,t,n,c){c=c||{};var s;t instanceof RegExp?s=RegExp:(s=c.origin||self.location.origin,s=s instanceof RegExp?s.source:r(s)),e=e.toLowerCase();var a=new o(e,t,n,c);this.routes.has(s)||this.routes.set(s,new Map);var u=this.routes.get(s);u.has(e)||u.set(e,new Map);var f=u.get(e),h=a.regexp||a.fullUrlRegExp;f.has(h.source)&&i.debug('"'+t+'" resolves to same regex as existing route.'),f.set(h.source,a)},s.prototype.matchMethod=function(e,t){var n=new URL(t),r=n.origin,o=n.pathname;return this._match(e,c(this.routes,r),o)||this._match(e,[this.routes.get(RegExp)],t)},s.prototype._match=function(e,t,n){if(0===t.length)return null;for(var r=0;r<t.length;r++){var o=t[r],i=o&&o.get(e.toLowerCase());if(i){var s=c(i,n);if(s.length>0)return s[0].makeHandler(n)}}return null},s.prototype.match=function(e){return this.matchMethod(e.method,e.url)||this.matchMethod("any",e.url)},t.exports=new s},{"./helpers":1,"./route":5}],7:[function(e,t,n){"use strict";function r(e,t,n){n=n||{};var r=n.cache||o.cache,c=r.queryOptions;return i.debug("Strategy: cache first ["+e.url+"]",n),i.openCache(n).then(function(t){return t.match(e,c).then(function(t){var o=Date.now();return i.isResponseFresh(t,r.maxAgeSeconds,o)?t:i.fetchAndCache(e,n)})})}var o=e("../options"),i=e("../helpers");t.exports=r},{"../helpers":1,"../options":4}],8:[function(e,t,n){"use strict";function r(e,t,n){n=n||{};var r=n.cache||o.cache,c=r.queryOptions;return i.debug("Strategy: cache only ["+e.url+"]",n),i.openCache(n).then(function(t){return t.match(e,c).then(function(e){var t=Date.now();if(i.isResponseFresh(e,r.maxAgeSeconds,t))return e})})}var o=e("../options"),i=e("../helpers");t.exports=r},{"../helpers":1,"../options":4}],9:[function(e,t,n){"use strict";function r(e,t,n){return o.debug("Strategy: fastest ["+e.url+"]",n),new Promise(function(r,c){var s=!1,a=[],u=function(e){a.push(e.toString()),s?c(new Error('Both cache and network failed: "'+a.join('", "')+'"')):s=!0},f=function(e){e instanceof Response?r(e):u("No result returned")};o.fetchAndCache(e.clone(),n).then(f,u),i(e,t,n).then(f,u)})}var o=e("../helpers"),i=e("./cacheOnly");t.exports=r},{"../helpers":1,"./cacheOnly":8}],10:[function(e,t,n){t.exports={networkOnly:e("./networkOnly"),networkFirst:e("./networkFirst"),cacheOnly:e("./cacheOnly"),cacheFirst:e("./cacheFirst"),fastest:e("./fastest")}},{"./cacheFirst":7,"./cacheOnly":8,"./fastest":9,"./networkFirst":11,"./networkOnly":12}],11:[function(e,t,n){"use strict";function r(e,t,n){n=n||{};var r=n.cache||o.cache,c=r.queryOptions,s=n.successResponses||o.successResponses,a=n.networkTimeoutSeconds||o.networkTimeoutSeconds;return i.debug("Strategy: network first ["+e.url+"]",n),i.openCache(n).then(function(t){var o,u,f=[];if(a){var h=new Promise(function(n){o=setTimeout(function(){t.match(e,c).then(function(e){var t=Date.now(),o=r.maxAgeSeconds;i.isResponseFresh(e,o,t)&&n(e)})},1e3*a)});f.push(h)}var p=i.fetchAndCache(e,n).then(function(e){if(o&&clearTimeout(o),s.test(e.status))return e;throw i.debug("Response was an HTTP error: "+e.statusText,n),u=e,new Error("Bad response")}).catch(function(r){return i.debug("Network or response error, fallback to cache ["+e.url+"]",n),t.match(e,c).then(function(e){if(e)return e;if(u)return u;throw r})});return f.push(p),Promise.race(f)})}var o=e("../options"),i=e("../helpers");t.exports=r},{"../helpers":1,"../options":4}],12:[function(e,t,n){"use strict";function r(e,t,n){return o.debug("Strategy: network only ["+e.url+"]",n),fetch(e)}var o=e("../helpers");t.exports=r},{"../helpers":1}],13:[function(e,t,n){"use strict";var r=e("./options"),o=e("./router"),i=e("./helpers"),c=e("./strategies"),s=e("./listeners");i.debug("Service Worker Toolbox is loading"),self.addEventListener("install",s.installListener),self.addEventListener("activate",s.activateListener),self.addEventListener("fetch",s.fetchListener),t.exports={networkOnly:c.networkOnly,networkFirst:c.networkFirst,cacheOnly:c.cacheOnly,cacheFirst:c.cacheFirst,fastest:c.fastest,router:o,options:r,cache:i.cache,uncache:i.uncache,precache:i.precache}},{"./helpers":1,"./listeners":3,"./options":4,"./router":6,"./strategies":10}],14:[function(e,t,n){t.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},{}],15:[function(e,t,n){function r(e,t){for(var n,r=[],o=0,i=0,c="",s=t&&t.delimiter||"/";null!=(n=x.exec(e));){var f=n[0],h=n[1],p=n.index;if(c+=e.slice(i,p),i=p+f.length,h)c+=h[1];else{var l=e[i],d=n[2],m=n[3],g=n[4],v=n[5],w=n[6],y=n[7];c&&(r.push(c),c="");var b=null!=d&&null!=l&&l!==d,E="+"===w||"*"===w,R="?"===w||"*"===w,k=n[2]||s,$=g||v;r.push({name:m||o++,prefix:d||"",delimiter:k,optional:R,repeat:E,partial:b,asterisk:!!y,pattern:$?u($):y?".*":"[^"+a(k)+"]+?"})}}return i<e.length&&(c+=e.substr(i)),c&&r.push(c),r}function o(e,t){return s(r(e,t))}function i(e){return encodeURI(e).replace(/[\/?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function c(e){return encodeURI(e).replace(/[?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function s(e){for(var t=new Array(e.length),n=0;n<e.length;n++)"object"==typeof e[n]&&(t[n]=new RegExp("^(?:"+e[n].pattern+")$"));return function(n,r){for(var o="",s=n||{},a=r||{},u=a.pretty?i:encodeURIComponent,f=0;f<e.length;f++){var h=e[f];if("string"!=typeof h){var p,l=s[h.name];if(null==l){if(h.optional){h.partial&&(o+=h.prefix);continue}throw new TypeError('Expected "'+h.name+'" to be defined')}if(v(l)){if(!h.repeat)throw new TypeError('Expected "'+h.name+'" to not repeat, but received `'+JSON.stringify(l)+"`");if(0===l.length){if(h.optional)continue;throw new TypeError('Expected "'+h.name+'" to not be empty')}for(var d=0;d<l.length;d++){if(p=u(l[d]),!t[f].test(p))throw new TypeError('Expected all "'+h.name+'" to match "'+h.pattern+'", but received `'+JSON.stringify(p)+"`");o+=(0===d?h.prefix:h.delimiter)+p}}else{if(p=h.asterisk?c(l):u(l),!t[f].test(p))throw new TypeError('Expected "'+h.name+'" to match "'+h.pattern+'", but received "'+p+'"');o+=h.prefix+p}}else o+=h}return o}}function a(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function u(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function f(e,t){return e.keys=t,e}function h(e){return e.sensitive?"":"i"}function p(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return f(e,t)}function l(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(g(e[o],t,n).source);return f(new RegExp("(?:"+r.join("|")+")",h(n)),t)}function d(e,t,n){return m(r(e,n),t,n)}function m(e,t,n){v(t)||(n=t||n,t=[]),n=n||{};for(var r=n.strict,o=!1!==n.end,i="",c=0;c<e.length;c++){var s=e[c];if("string"==typeof s)i+=a(s);else{var u=a(s.prefix),p="(?:"+s.pattern+")";t.push(s),s.repeat&&(p+="(?:"+u+p+")*"),p=s.optional?s.partial?u+"("+p+")?":"(?:"+u+"("+p+"))?":u+"("+p+")",i+=p}}var l=a(n.delimiter||"/"),d=i.slice(-l.length)===l;return r||(i=(d?i.slice(0,-l.length):i)+"(?:"+l+"(?=$))?"),i+=o?"$":r&&d?"":"(?="+l+"|$)",f(new RegExp("^"+i,h(n)),t)}function g(e,t,n){return v(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?p(e,t):v(e)?l(e,t,n):d(e,t,n)}var v=e("isarray");t.exports=g,t.exports.parse=r,t.exports.compile=o,t.exports.tokensToFunction=s,t.exports.tokensToRegExp=m;var x=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g")},{isarray:14}],16:[function(e,t,n){!function(){var e=Cache.prototype.addAll,t=navigator.userAgent.match(/(Firefox|Chrome)\/(\d+\.)/);if(t)var n=t[1],r=parseInt(t[2]);e&&(!t||"Firefox"===n&&r>=46||"Chrome"===n&&r>=50)||(Cache.prototype.addAll=function(e){function t(e){this.name="NetworkError",this.code=19,this.message=e}var n=this;return t.prototype=Object.create(Error.prototype),Promise.resolve().then(function(){if(arguments.length<1)throw new TypeError;return e=e.map(function(e){return e instanceof Request?e:String(e)}),Promise.all(e.map(function(e){"string"==typeof e&&(e=new Request(e));var n=new URL(e.url).protocol;if("http:"!==n&&"https:"!==n)throw new t("Invalid scheme");return fetch(e.clone())}))}).then(function(r){if(r.some(function(e){return!e.ok}))throw new t("Incorrect response status");return Promise.all(r.map(function(t,r){return n.put(e[r],t)}))}).then(function(){})},Cache.prototype.add=function(e){return this.addAll([e])})}()},{}]},{},[13])(13)}); ================================================ FILE: assets/js/tokeninput.js ================================================ !function(I){var o={method:"GET",contentType:"json",queryParam:"q",searchDelay:300,minChars:1,propertyToSearch:"name",jsonContainer:null,hintText:"Type in a search term",noResultsText:"No results",searchingText:"Searching...",deleteText:"×",animateDropdown:!0,tokenLimit:null,tokenDelimiter:",",preventDuplicates:!1,tokenValue:"id",prePopulate:null,processPrePopulate:!1,idPrefix:"token-input-",resultsFormatter:function(e){return"<li>"+e[this.propertyToSearch]+"</li>"},tokenFormatter:function(e){return"<li><p>"+e[this.propertyToSearch]+"</p></li>"},onResult:null,onAdd:null,onDelete:null,onReady:null},F={tokenList:"token-input-list",token:"token-input-token",tokenDelete:"token-input-delete-token",selectedToken:"token-input-selected-token",highlightedToken:"token-input-highlighted-token",dropdown:"token-input-dropdown",dropdownItem:"token-input-dropdown-item",dropdownItem2:"token-input-dropdown-item2",selectedDropdownItem:"token-input-selected-dropdown-item",inputToken:"token-input-input-token"},P=0,O=1,A=2,z=8,_=13,q=27,B=37,E=38,V=39,W=40,G=108,H=188,t={init:function(e,t){var n=I.extend({},o,t||{});return this.each(function(){I(this).data("tokenInputObject",new I.TokenList(this,e,n))})},clear:function(){return this.data("tokenInputObject").clear(),this},add:function(e){return this.data("tokenInputObject").add(e),this},remove:function(e){return this.data("tokenInputObject").remove(e),this},get:function(){return this.data("tokenInputObject").getTokens()}};I.fn.tokenInput=function(e){return t[e]?t[e].apply(this,Array.prototype.slice.call(arguments,1)):t.init.apply(this,arguments)},I.TokenList=function(e,t,a){var n;"string"===I.type(t)||"function"===I.type(t)?(a.url=t,n=S(),void 0===a.crossDomain&&(-1===n.indexOf("://")?a.crossDomain=!1:a.crossDomain=location.href.split(/\/+/g)[1]!==n.split(/\/+/g)[1])):"object"==typeof t&&(a.local_data=t),a.classes?a.classes=I.extend({},F,a.classes):a.theme?(a.classes={},I.each(F,function(e,t){a.classes[e]=t+"-"+a.theme})):a.classes=F;var o,i=[],s=0,l=new I.TokenList.Cache,r=I('<input type="text" autocomplete="off">').css({outline:"none"}).attr("id",a.idPrefix+e.id).focus(function(){null!==a.tokenLimit&&a.tokenLimit===s||a.hintText&&(k.html("<p>"+a.hintText+"</p>"),D())}).blur(function(){x(),I(this).val("")}).keydown(function(e){var t;switch(e.keyCode){case B:case V:case E:case W:if(I(this).val()){var n=null;return(n=e.keyCode===W||e.keyCode===V?I(p).next():I(p).prev()).length&&j(n),!1}t=f.prev(),n=f.next(),t.length&&t.get(0)===u||n.length&&n.get(0)===u?e.keyCode===B||e.keyCode===E?y(I(u),P):y(I(u),O):e.keyCode!==B&&e.keyCode!==E||!t.length?e.keyCode!==V&&e.keyCode!==W||!n.length||T(I(n.get(0))):T(I(t.get(0)));break;case z:if(t=f.prev(),!I(this).val().length)return u?(C(I(u)),c.change()):t.length&&T(I(t.get(0))),!1;1===I(this).val().length?x():setTimeout(function(){R()},5);break;case _:case G:case H:return p?(v(I(p).data("tokeninput")),c.change()):v(null),!1;case q:return x(),!0;default:String.fromCharCode(e.which)&&setTimeout(function(){R()},5)}}),c=I(e).hide().val("").focus(function(){r.focus()}).blur(function(){r.blur()}),u=null,d=0,p=null,h=I("<ul />").addClass(a.classes.tokenList).click(function(e){e=I(e.target).closest("li");e&&e.get(0)&&I.data(e.get(0),"tokeninput")?function(e){var t=u;u&&y(I(u),A);t===e.get(0)?y(e,A):T(e)}(e):(u&&y(I(u),A),r.focus())}).mouseover(function(e){e=I(e.target).closest("li");e&&u!==this&&e.addClass(a.classes.highlightedToken)}).mouseout(function(e){e=I(e.target).closest("li");e&&u!==this&&e.removeClass(a.classes.highlightedToken)}).insertBefore(c),f=I("<li />").addClass(a.classes.inputToken).appendTo(h).append(r),k=I("<div>").addClass(a.classes.dropdown).appendTo("body").hide();I("<tester/>").insertAfter(r).css({position:"absolute",top:-9999,left:-9999,width:"auto",fontSize:r.css("fontSize"),fontFamily:r.css("fontFamily"),fontWeight:r.css("fontWeight"),letterSpacing:r.css("letterSpacing"),whiteSpace:"nowrap"});c.val("");e=a.prePopulate||c.data("pre");function g(){null!==a.tokenLimit&&s>=a.tokenLimit&&(r.hide(),x())}function m(e){var t=a.tokenFormatter(e),t=I(t).addClass(a.classes.token).insertBefore(f);I("<span>"+a.deleteText+"</span>").addClass(a.classes.tokenDelete).appendTo(t).click(function(){return C(I(this).parent()),c.change(),!1});var n={id:e.id};return n[a.propertyToSearch]=e[a.propertyToSearch],I.data(t.get(0),"tokeninput",e),i=i.slice(0,d).concat([n]).concat(i.slice(d)),d++,w(i,c),s+=1,null!==a.tokenLimit&&s>=a.tokenLimit&&(r.hide(),x()),t}function v(n){var e=a.onAdd;if(!n&&0<r.val().length&&((n={id:r.val()})[a.propertyToSearch]=r.val()),n){if(0<s&&a.preventDuplicates){var o=null;if(h.children().each(function(){var e=I(this),t=I.data(e.get(0),"tokeninput");if(t&&t.id===n.id)return o=e,!1}),o)return T(o),f.insertAfter(o),void r.focus()}(null==a.tokenLimit||s<a.tokenLimit)&&(m(n),g()),r.val(""),x(),I.isFunction(e)&&e.call(c,n)}}function T(e){e.addClass(a.classes.selectedToken),u=e.get(0),r.val(""),x()}function y(e,t){e.removeClass(a.classes.selectedToken),u=null,t===P?(f.insertBefore(e),d--):t===O?(f.insertAfter(e),d++):(f.appendTo(h),d=s),r.focus()}function C(e){var t=I.data(e.get(0),"tokeninput"),n=a.onDelete,o=e.prevAll().length;d<o&&o--,e.remove(),u=null,r.focus(),i=i.slice(0,o).concat(i.slice(o+1)),o<d&&d--,w(i,c),--s,null!==a.tokenLimit&&r.show().val("").focus(),I.isFunction(n)&&n.call(c,t)}function w(e,t){e=I.map(e,function(e){return e[a.tokenValue]});t.val(e.join(a.tokenDelimiter))}function x(){k.hide().empty(),p=null}function D(){k.css({position:"absolute",top:I(h).offset().top+I(h).outerHeight(),left:I(h).offset().left,zindex:999}).show()}function L(e,t,n){return e.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+t+")(?![^<>]*>)(?![^&;]+;)","g"),t.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+n+")(?![^<>]*>)(?![^&;]+;)","gi"),"<b>$1</b>"))}function b(o,e){var i;e&&e.length?(k.empty(),i=I("<ul>").appendTo(k).mouseover(function(e){j(I(e.target).closest("li"))}).mousedown(function(e){return v(I(e.target).closest("li").data("tokeninput")),c.change(),!1}).hide(),I.each(e,function(e,t){var n=L(n=a.resultsFormatter(t),t[a.propertyToSearch],o);n=I(n).appendTo(i),e%2?n.addClass(a.classes.dropdownItem):n.addClass(a.classes.dropdownItem2),0===e&&j(n),I.data(n.get(0),"tokeninput",t)}),D(),a.animateDropdown?i.slideDown("fast"):i.show()):a.noResultsText&&(k.html("<p>"+a.noResultsText+"</p>"),D())}function j(e){e&&(p&&(I(p).removeClass(a.classes.selectedDropdownItem),p=null),e.addClass(a.classes.selectedDropdownItem),p=e.get(0))}function R(){var e=r.val(),t=e.toLowerCase();t&&t.length&&(u&&y(I(u),O),t.length>=a.minChars?(a.searchingText&&(k.html("<p>"+a.searchingText+"</p>"),D()),clearTimeout(o),o=setTimeout(function(){!function(t,n){var o=n+S(),e=l.get(o);{var i,s;e?b(t,e):a.url?(s=S(),i={data:{}},-1<s.indexOf("?")?(e=s.split("?"),i.url=e[0],e=e[1].split("&"),I.each(e,function(e,t){t=t.split("=");i.data[t[0]]=t[1]})):i.url=s,i.data[a.queryParam]=t,i.type=a.method,i.dataType=a.contentType,a.crossDomain&&(i.dataType="jsonp"),i.success=function(e){I.isFunction(a.onResult)&&(e=a.onResult.call(c,e,t,n)),l.add(o,a.jsonContainer?e[a.jsonContainer]:e),r.val().toLowerCase()===t&&b(t,a.jsonContainer?e[a.jsonContainer]:e)},I.ajax(i)):a.local_data&&(s=I.grep(a.local_data,function(e){return-1<e[a.propertyToSearch].toLowerCase().indexOf(t.toLowerCase())}),I.isFunction(a.onResult)&&(s=a.onResult.call(c,s,t,n)),l.add(o,s),b(t,s))}}(t,e)},a.searchDelay)):x())}function S(){var e=a.url;return e="function"==typeof a.url?a.url.call():e}(e=a.processPrePopulate&&I.isFunction(a.onResult)?a.onResult.call(c,e):e)&&e.length&&I.each(e,function(e,t){m(t),g()}),I.isFunction(a.onReady)&&a.onReady.call(),this.clear=function(){h.children("li").each(function(){0===I(this).children("input").length&&C(I(this))})},this.add=function(e){v(e)},this.remove=function(o){h.children("li").each(function(){if(0===I(this).children("input").length){var e,t=I(this).data("tokeninput"),n=!0;for(e in o)if(o[e]!==t[e]){n=!1;break}n&&C(I(this))}})},this.getTokens=function(){return i}},I.TokenList.Cache=function(e){var n=I.extend({max_size:500},e),o={},i=0;this.add=function(e,t){i>n.max_size&&(o={},i=0),o[e]||(i+=1),o[e]=t},this.get=function(e){return o[e]}}}(jQuery); ================================================ FILE: assets/vendors/bangumi/bangumi.css ================================================ .tab { padding-top: 10px; position: relative; overflow: hidden; margin: 0 auto; line-height: 1.5; font-weight: 300; color: #888; -webkit-font-smoothing: antialiased; } .tabs { display: table; position: relative; overflow: hidden; margin: 0; width: 100%; list-style:none!important; } .tabs li { float: left; line-height: 38px; overflow: hidden; padding: 0; position: relative; } .tabs a{ background-color: #eff0f2; border-bottom: 1px solid #000; color: #888; font-weight: 500; display: block; letter-spacing: 0; outline: none; padding: 0 20px; text-decoration: none; -webkit-transition: all 0.2s ease-in-out; -moz-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; border-bottom: 2px solid #000; cursor:pointer; } .tabs_item { display: none; padding: 30px 0; } .tabs_item h4 { font-weight: bold; color: #fff; font-size: 20px; } .tabs_item img { width: 200px; float: left; margin-right: 30px; } .tabs_item:first-child { display: block; } .current a{ color:#fff; background: #000; } .current{ color: #fff; } .bangumiboard-list{ display: flex; flex-flow: row wrap; justify-content: flex-start; margin-top: 1em; width: calc(100% + 15px); margin-left: -15px; } .bangumiboard-list,.bangumiboard-list *{ box-sizing: border-box; } .bangumiboard-item { position: relative; cursor: pointer; box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); transition: ease all 0.3s; overflow: hidden; background: #f7fbf7; display: flex; flex-flow: column nowrap; justify-content: flex-start; border: none!important; display: block; margin-left: 15px; margin-bottom: 15px; border-radius:8px; } .bangumiboard-item:hover{ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); } .bangumiboard-thumb { width: 100%; /* customize this for diffrent style */ padding-top: 141%; background-repeat: no-repeat; background-size: cover; } .bangumiboard-title,.bangumiboard-title a{ margin: 8px 0!important; font-size: 1.2em!important; overflow: hidden!important; text-overflow: ellipsis!important; white-space: nowrap !important; text-align: center !important; color: #202020 !important; font-weight: 700 !important; border:none !important; padding:8px!important; } /* detail panel */ .bangumiboard-info{ position: absolute; top:0; left: 0; width: 100%; height: 100%; overflow: auto; -webkit-overflow-scrolling: touch; transition: all 0.3s; background-color: #f7fbf7; color: black; font-size: 0.9em; line-height: 1.3em; transform: translateY(100%); padding: 0.5em; font-size: 16px; font-weight: 400; } .bangumiboard-info::-webkit-scrollbar{ background: none; width: 4px; height: 6px; border-radius:2px; } .bangumiboard-info::-webkit-scrollbar-thumb{ background: rgba(0,0,0,0.2); border-radius:2px; line-height: 1.15; font-size: 1em; } .bangumiboard-info::-webkit-scrollbar-thumb:hover{ background: rgba(0,0,0,0.6); } .bangumiboard-info-show > .bangumiboard-info{ transform: translateY(0); } /* special for bangumi */ .bangumiboard-info>.bangumiboard-info-basic{ white-space: nowrap!important; overflow: hidden; text-overflow: ellipsis; } /* loadmore button (span) */ .bangumi-loadmore{ display: block; padding: 0.3em; background: #000; color: white; transition:0.2s; margin: 20px auto!important; width: 6em; text-align: center; cursor: pointer; border-radius:5px; } .bangumi-loadmore:hover{ background: rgba(0,0,0,0.6); } /* media query for responsive design */ @media screen and (max-width: 767.5px){ .bangumiboard-item{ width: calc(33.333333333% - 15px); } } @media screen and (min-width:767.5px){ .bangumiboard-item{ width: calc(25% - 15px); } } @media screen and (max-width:450px){ .bangumiboard-item{ width: calc(50% - 15px); } } .bangumi-single{ max-width: 100%; height: 230px; box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); border-radius: 8px; overflow: hidden; position: relative; } .bangumi-single-img{ position: absolute; left: 0; top: 0; width: 22%; height: 100%; float: left; background-size: cover; background-position: center center; } .bangumi-single-info{ position: absolute; width: 76%; height: 100%; top: 0; right: 0; margin-left: 24%; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 0.2em 0.5em 0.5em 0; font-size: 16px; font-weight: 400; line-height: 1.4; } .bangumi-single-info::-webkit-scrollbar{ background: none; width: 4px; height: 6px; border-radius:2px; } .bangumi-single-info::-webkit-scrollbar-thumb{ background: rgba(0,0,0,0.2); border-radius:2px; line-height: 1.15; font-size: 1em; } .bangumi-single-info::-webkit-scrollbar-thumb:hover{ background: rgba(0,0,0,0.6); } .bangumi-single-summary{ margin-top: 0.3em; display: inline-block; } .bangumi-single-title{ font-size: 1.3em; color: #1abc9c; text-decoration: none; padding: 0; margin: 0; border:none!important; } .bangumi-single-rating{ background-image: url(/usr/plugins/bangumiBoard/assets/rating.png); display: inline-block; width: 75px; height: 15px; } .bangumi-single-meta{ font-size: 0.8em; font-size: 0.8em; display: inline-block; margin: 0.5em 0; opacity: 0.5; } @media screen and (max-width:767px){ .bangumi-single{ height: 160px; } .bangumi-single-img{ width: 32%; } .bangumi-single-info{ margin-left: 35%; width: 65%; } } ================================================ FILE: assets/vendors/bangumi/bangumi.js ================================================ // Author:熊猫小A // Modified:Whitebear(whitebear@msn.com) var curMovies_watched = 0; var curMovies_acg= 0; var curMovies_watching = 0; var curMovies_wish = 0; var curMovies_on_hold = 0; var curMovies_dropped = 0; BangumiBoard = { initBangumiBoard: function () { $(`.bangumi-movie-list[data-status="acg"]`).after(`<div class="bangumi-loadmore" id="loadMoreMovies_acg" onclick="BangumiBoard.loadBangumi('acg');">加载更多</div>`); $(`.bangumi-movie-list[data-status="watched"]`).after(`<div class="bangumi-loadmore" id="loadMoreMovies_watched" onclick="BangumiBoard.loadBangumi('watched');">加载更多</div>`); $(`.bangumi-movie-list[data-status="watching"]`).after(`<div class="bangumi-loadmore" id="loadMoreMovies_watching" onclick="BangumiBoard.loadBangumi('watching');">加载更多</div>`); $(`.bangumi-movie-list[data-status="wish"]`).after(`<div class="bangumi-loadmore" id="loadMoreMovies_wish" onclick="BangumiBoard.loadBangumi('wish');">加载更多</div>`); $(`.bangumi-movie-list[data-status="on_hold"]`).after(`<div class="bangumi-loadmore" id="loadMoreMovies_on_hold" onclick="BangumiBoard.loadBangumi('on_hold');">加载更多</div>`); $(`.bangumi-movie-list[data-status="dropped"]`).after(`<div class="bangumi-loadmore" id="loadMoreMovies_dropped" onclick="BangumiBoard.loadBangumi('dropped');">加载更多</div>`); curMovies_watched = 0; curMovies_watching = 0; curMovies_wish = 0; curMovies_on_hold = 0; curMovies_dropped = 0; curMovies_acg = 0; BangumiBoard.loadBangumi('watched'); BangumiBoard.loadBangumi('watching'); BangumiBoard.loadBangumi('wish'); BangumiBoard.loadBangumi('on_hold'); BangumiBoard.loadBangumi('dropped'); BangumiBoard.loadBangumi('acg'); }, loadBangumi: function (status) { if ($(`.bangumi-movie-list[data-status="` + status + `"]`).length < 1) return; $("#loadMoreMovies_" + status).html("加载中..."); var curMovies; if (status == 'watched') curMovies = curMovies_watched; else if (status == 'watching') curMovies = curMovies_watching; else if (status == 'on_hold') curMovies = curMovies_on_hold; else if (status == 'dropped') curMovies = curMovies_dropped; else if (status == 'acg') curMovies = curMovies_acg; else curMovies = curMovies_wish; if(status == 'acg'){ $.getJSON(window.BangumiAPI + "?type=bilibili&from=" + String(curMovies) + "&status=" + status, function (result) { $("#loadMoreMovies_" + status).html("加载更多"); if (result.length < BangumiPageSize) { $("#loadMoreMovies_" + status).html("没有啦"); } $.each(result, function (i, item) { var html = `<a href="` + item.url + `" target="_blank" id="bangumiboard-movie-item-` + String(curMovies) + `" class="bangumiboard-item" title="`+ item.name + `"> <div class="bangumiboard-thumb" id="bangumiboard-movie-bg-item-` + String(curMovies) + `" style="background-image:url(`+ item.img + `)"></div> <div class="bangumiboard-title">`+ item.name + `</div> </a>`; $(`.bangumi-movie-list[data-status="` + status + `"]`).append(html); curMovies_acg++; }); }); } else{ $.getJSON(window.BangumiAPI + "?type=bangumi&from=" + String(curMovies) + "&status=" + status, function (result) { $("#loadMoreMovies_" + status).html("加载更多"); if (result.length < BangumiPageSize) { $("#loadMoreMovies_" + status).html("没有啦"); } $.each(result, function (i, item) { var html = `<a href="` + item.url + `" target="_blank" id="bangumiboard-movie-item-` + String(curMovies) + `" class="bangumiboard-item" title="`+ item.name + `"> <div class="bangumiboard-thumb" style="background-image:url(`+ item.img + `)"></div> <div class="bangumiboard-title">`+ item.name + `</div> </a>`; $(`.bangumi-movie-list[data-status="` + status + `"]`).append(html); if (status == 'watched') curMovies_watched++; else if (status == 'watching') curMovies_watching++; else if (status == 'on_hold') curMovies = curMovies_on_hold++; else if (status == 'dropped') curMovies = curMovies_dropped++; else curMovies_wish++; }); }); } }, } $(document).ready(function () { BangumiBoard.initBangumiBoard(); }) $(document).click(function (e) { var target = e.target; $(".bangumiboard-item").removeClass("bangumiboard-info-show"); $(".bangumiboard-item").each(function () { if ($(target).parent()[0] == $(this)[0] || $(target) == $(this)[0]) { $(this).addClass("bangumiboard-info-show"); } }) }) ================================================ FILE: assets/vendors/bs-audio/audio.css ================================================ .BAudio { margin:10px 0 10px 0; } .toLus { display: block; position: absolute; top: 0; left: 0; } .toLus img { display: block; width: 40px; height: 40px; } .BAudio { display: flex; width: 100%; color: #333; font-family: Arial, Helvetica, sans-serif; overflow: hidden; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; line-height: normal; position: relative; --theme-color: #d72630; } .BAudio .BAudio-artword { width: 160px; height: 160px; margin-right: 15px; } .BAudio .BAudio-artword .BAudio-figure { display: block; width: 100%; height: 100%; margin: 0; padding: 0; background-color: #f8f8f8; } .BAudio .BAudio-artword .BAudio-pic { display: block; width: 100%; height: 100%; object-fit: cover; } .BAudio .BAudio-content { flex: 1; } .BAudio .BAudio-content .BAudio-header { display: flex; align-items: center; padding: 5px 0 7px; } .BAudio .BAudio-content .BAudio-play { width: 38px; height: 38px; border-radius: 50%; color: #fff; background-color: var(--theme-color); margin-right: 5px; cursor: not-allowed; position: relative; } .BAudio.load .BAudio-content .BAudio-play { cursor: pointer; } .BAudio .BAudio-content .BAudio-play svg { position: absolute; top: 8px; left: 10px; width: 22px; height: 22px; } .BAudio .BAudio-content .BAudio-play svg path { fill: #fff; } .BAudio .BAudio-content .BAudio-play__pause, .BAudio.play .BAudio-content .BAudio-play__playing { visibility: visible; } .BAudio .BAudio-content .BAudio-play__playing, .BAudio.play .BAudio-content .BAudio-play__pause { visibility: hidden; } .BAudio .BAudio-content .BAudio-play__playing { left: 8px; } .BAudio .BAudio-content .BAudio-container { flex: 1; } .BAudio .BAudio-content .BAudio-author { font-size: 12px; color: #999; font-weight: 300; margin: 0; } .BAudio .BAudio-content .BAudio-title { font-size: 15px; margin: 0; } .BAudio .BAudio-content .BAudio-time { color: #ccc; font-size: 12px; font-weight: 100; line-height: 1; } .BAudio .BAudio-content .BAudio-main { width: 100%; position: relative; } .BAudio .BAudio-content .BAudio-waveform { width: 100%; height: 60px; cursor: pointer; opacity: 0.8; transform: scaleY(0); transform-origin: left 75%; transition: all 0.3s ease-out; position: relative; } .BAudio .BAudio-content .BAudio-waveform::before { content: ''; position: absolute; top: 0; left: var(--bar-left); width: 1px; height: 100%; opacity: 0; background-color: var(--theme-color); transition: opacity 0.3s ease-out; } .BAudio .BAudio-content .BAudio-waveform:hover, .BAudio.start .BAudio-content .BAudio-waveform, .BAudio .BAudio-content .BAudio-waveform:hover::before { opacity: 1; } .BAudio.load .BAudio-content .BAudio-waveform { transform: scaleY(1); } .BAudio .BAudio-content .BAudio-waveform .BAudio-pro { position: absolute; top: 0; left: 0; width: 0; height: 60px; overflow: hidden; background-color: transparent; } .BAudio .BAudio-content .BAudio-current, .BAudio .BAudio-content .BAudio-total{ position: absolute; top: 50px; color: #fff; padding: 3px 2px; font-size: 15px; line-height: 1; opacity: 0; border-radius:5px; } .BAudio .BAudio-content .BAudio-totaltip{ position: absolute; top: 50px; color: #999; padding: 3px 2px; font-size: 15px; line-height: 1; border-radius:5px; } .BAudio .BAudio-content .BAudio-current { left:0; z-index: 9; color: #999; } .BAudio.start .BAudio-content .BAudio-current { opacity: 1; } .BAudio .BAudio-content .BAudio-total { right:0; color: #999; } .BAudio.load .BAudio-content .BAudio-total { opacity: 1; animation: opacity 0.6s linear; } .BAudio .BAudio-content .BAudio-comments { width: 100%; position: relative; } .BAudio .BAudio-content .BAudio-wrapper { position: absolute; top: -15px; left: 0; width: 100%; height: 12px; cursor: pointer; } .BAudio .BAudio-content .BAudio-wrapper__item { position: absolute; top: 0; left: 10px; width: 12px; height: 12px; background-color: #222; background-repeat: no-repeat; background-size: cover; } .BAudio .BAudio-content .BAudio-wrapper__item.current { border-radius: 50%; box-shadow: 1px 2px 6px #6c6c6c; z-index: 9; } .BAudio .BAudio-content .BAudio-popover { display: flex; width: 100%; height: 30px; line-height: 30px; font-size: 12px; box-sizing: border-box; transition: all 0.3s ease-out; } .BAudio .BAudio-content .BAudio-popover-wrapper { position: absolute; top: 4px; left: 0; line-height: 1; opacity: 0; transition: top 0.25s, opacity 0.25s; } .BAudio .BAudio-content .BAudio-wrapper.active ~ .BAudio-popover .BAudio-popover-wrapper { top: 7px; opacity: 1; } .BAudio .BAudio-content .BAudio-popover-wrapper__user { display: block; float: left; color: var(--theme-color); padding: 0 8px; text-decoration: none; position: relative; } .BAudio .BAudio-content .BAudio-popover-wrapper__user::before { content: ''; display: block; position: absolute; top: -12px; left: 0; width: 1px; height: 200%; background-image: linear-gradient( rgba(255, 85, 0, 0.95), rgba(255, 85, 0, 0.1) ); } .BAudio .BAudio-content .BAudio-popover-wrapper.right .BAudio-popover-wrapper__user { float: right; } .BAudio .BAudio-content .BAudio-popover-wrapper.right, .BAudio .BAudio-content .BAudio-popover-wrapper.right .BAudio-popover-wrapper__user::before { right: 0; left: auto; } .BAudio .BAudio-content .BAudio-popover-wrapper__comment { color: #666; float: left; margin: 0; } .BAudio .BAudio-content .BAudio-comments-from { width: 100%; height: 0; opacity: 0; padding: 5px 5px 5px 25px; background-color: #f2f2f2; border: 1px solid #e5e5e5; box-sizing: border-box; overflow: hidden; position: relative; transition: all 0.3s ease-out; } .BAudio.start .BAudio-content .BAudio-comments-from, .BAudio.comment .BAudio-content .BAudio-comments-from { opacity: 1; height: 32px; } .BAudio .BAudio-content .BAudio-comments-from::before { content: ''; position: absolute; top: 6px; left: 6px; width: 19px; height: 19px; background-image: linear-gradient(135deg, #846170, #70929c); } .BAudio .BAudio-content .BAudio-comments-from__input { width: 100%; height: 20px; border-radius: 0 4px 4px 0; padding: 0 9px; font-size: 12px; outline: none; cursor: pointer; border: 1px solid #e5e5e5; border-left: none; box-sizing: border-box; } .BAudio .BAudio-content .BAudio-footer { position: relative; box-sizing: border-box; margin-top: 10px; } .BAudio .BAudio-content .BAudio-list { border-radius: 0 0 4px 4px; border: 1px solid #f2f2f2; font-size: 12px; overflow: hidden; } .BAudio .BAudio-content .BAudio-list-container { max-height: 150px; overflow-y: hidden; transition: max-height 0.3s; } .BAudio .BAudio-content .BAudio-list-container.active { overflow-y: scroll; max-height: 300px; } .BAudio .BAudio-content .BAudio-list-wrapper { margin: 0; padding: 0; transition: all 0.6s; } .BAudio .BAudio-content .BAudio-list-wrapper__item { width: 100%; height: 30px; display: flex; align-items: center; padding: 0 5px; box-sizing: border-box; color: #ccc; cursor: not-allowed; border-bottom: 1px solid #f2f2f2; transition: all 0.3s; } .BAudio .BAudio-content .BAudio-list-wrapper__item:last-child { border-bottom: none; } .BAudio .BAudio-content .BAudio-list-wrapper__item.active, .BAudio .BAudio-content .BAudio-list-wrapper__item:hover, .BAudio .BAudio-content .BAudio-more:hover { background-color: #f2f2f2; } .BAudio .BAudio-content .BAudio-list-wrapper__item-img { display: block; width: 20px; height: 20px; margin-right: 5px; opacity: 0.5; transition: all 0.3s; } .BAudio .BAudio-content .BAudio-list-wrapper__item-number { margin-right: 5px; font-size: 12px; line-height: 1; color: #ccc; transition: all 0.3s; } .BAudio .BAudio-content .BAudio-list-wrapper__item-content { flex: 1; font-size: 0; } .BAudio .BAudio-content .BAudio-list-wrapper__item-user, .BAudio .BAudio-content .BAudio-list-wrapper__item-title { display: inline-block; font-size: 12px; line-height: 1; margin-right: 5px; } .BAudio .BAudio-content .BAudio-list-wrapper__item-title { color: #ccc; transition: all 0.3s; } .BAudio .BAudio-content .BAudio-list-bar { position: absolute; top: 4px; right: 4px; width: 6px; height: 30px; background-color: #ccc; border-radius: 6px; opacity: 0; transition: opacity 0.6s; } .BAudio .BAudio-content .BAudio-list-bar.active, .BAudio .BAudio-content .BAudio-list-container.active:hover .BAudio-list-bar { opacity: 1; } .BAudio .BAudio-content .BAudio-more { text-align: center; padding: 5px 10px; color: #999; border: none; font-size: 12px; cursor: pointer; } .BAudio.load .BAudio-content .BAudio-list-wrapper__item { color: #999; cursor: pointer; } .BAudio.load .BAudio-content .BAudio-list-wrapper__item-img { opacity: 1; } .BAudio.load .BAudio-content .BAudio-list-wrapper__item-number, .BAudio.load .BAudio-content .BAudio-list-wrapper__item-title { color: #333; } .BAudio .BAudio-content .BAudio-list-wrapper__item.isload .BAudio-list-wrapper__item-number, .BAudio .BAudio-content .BAudio-list-wrapper__item.isload .BAudio-list-wrapper__item-title, .BAudio .BAudio-content .BAudio-list-wrapper__item.isload .BAudio-list-wrapper__item-user { color: #b5b5b5; } .BAudio .BAudio-content .BAudio-list-wrapper__item.isload .BAudio-list-wrapper__item-img { opacity: 0.5; } .BAudio .BAudio-content .BAudio-list-wrapper__item.active .BAudio-list-wrapper__item-number .BAudio .BAudio-content .BAudio-list-wrapper__item.active .BAudio-list-wrapper__item-user, .BAudio .BAudio-content .BAudio-list-wrapper__item.active .BAudio-list-wrapper__item-title { color: var(--theme-color); } .BAudio .BAudio-content .BAudio-list-wrapper__item.active .BAudio-list-wrapper__item-img { opacity: 1; } .BAudio .BAudio-content .BAudio-list-container.active::-webkit-scrollbar { width: 0; height: 0; } @keyframes opacity { 0% { opacity: 0; } 100% { opacity: 1; } } ================================================ FILE: assets/vendors/bs-audio/audio.js ================================================ //根据YAudio修改适配并进行优化处理 (function (window) { var BAudio = function (params) { var defaultOption = { element: null, autoplay: false, audio: null, playIndex: 0, barColor: '#666666', proBarColor: '#fe4f58,#b1060f' } // 合并后的参数 this.option = Object.assign({}, defaultOption, params) // 歌曲索引 this.playIndex = this._isArray(this.option.audio) ? this.option.playIndex : -1 // 是否是单曲 this.single = (this._isArray(this.option.audio) && this.option.audio.length === 1) || !this._isArray(this.option.audio) this.music = this.getMusic(this.playIndex) // 是否正在播放 this.playing = false // 鼠标是否正在 波形 滑动中 this.moving = false // 是否音频加载完成 this.load = false // 是否已经开始播放 this.start = false // 进度是否滚动到评论区 this.commentMoving = false // 保存音频 this.audioMap = new Map() // 保存滚动的参数 this.data = { offsetTop: 0, pageY: 0, touching: false } this.init() this.setMusic(this.playIndex, 'click') } BAudio.prototype = { init: function () { var element = 'string' === typeof this.option.element ? document.querySelector(this.option.element) : this.option.element if (!element) { throw new Error('必须要一个容器承载') } this.bindHandlers() // 获取评论列表 this.getCommentList() this.initDom() this.attachDomEvents() }, bindHandlers: function () { for (var methodName of [ 'onWaveformClick', 'onWaveformMouseMove', 'onWaveformMouseLeave', 'onCommentMouseMove', 'onCommentMouseLeave', 'onAudioEnd', 'onAudioLoadedData', 'onAudioDurationChange', 'onAudilListScroll', 'onAudioListClick', 'onAudioListMore', 'onScrollBarMousedown', 'onScrollBarMousemove', 'onScrollBarMouseup', 'onPlay', 'onSubmit' ]) { this[methodName] = this[methodName].bind(this) } }, initDom: function () { var element = this.option.element var html = ` <div class="BAudio-content"> <headers class="BAudio-header"> <div class="BAudio-play"> <svg class="BAudio-play__pause" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 16 31" > <path d="M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z" ></path> </svg> <svg class="BAudio-play__playing" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 17 32" > <path d="M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z"></path></svg> </div> <div class="BAudio-container"> <p class="BAudio-author">${this.music.artist}</p> <p class="BAudio-title">${this.music.name}</p> </div> </headers> <main class="BAudio-main"> <div class="BAudio-waveform" style="display:none"> <canvas class="BAudio-waveform-canvas"></canvas> <div class="BAudio-pro" style="display:none"> <canvas class="BAudio-pro-canvas"></canvas> </div> </div> ${ this.single ? ` <div class="BAudio-comments"> <div class="BAudio-wrapper"></div> <div class="BAudio-popover"> <div class="BAudio-popover-wrapper"> <a href="javascript:;" class="BAudio-popover-wrapper__user">中原</a> <p class="BAudio-popover-wrapper__comment">这是一条评论!</p> </div> </div> <div class="BAudio-comments-from"> <input class="BAudio-comments-from__input" placeholder="评论一下吧" /> </div> </div> ` : `` } </main><br> <time class="BAudio-current">00:00</time> <div class="BAudio-totaltip">加载中,请稍候~~</div> <time class="BAudio-total">00:00</time> ${ !this.single ? ` <footer class="BAudio-footer"> <div class="BAudio-list"> <div class="BAudio-list-container"> <ul class="BAudio-list-wrapper"> ${this.option.audio .map( (_, i) => ` <li class="BAudio-list-wrapper__item"> <img class="BAudio-list-wrapper__item-img" src="${ _.pic }" /> <div class="BAudio-list-wrapper__item-number">${ i + 1 }</div> <div class="BAudio-list-wrapper__item-content"> <span class="BAudio-list-wrapper__item-user">${ _.artist } -</span> <span class="BAudio-list-wrapper__item-title">${ _.name }</span> </div> <div class="BAudio-list-wrapper__item-btn"></div> </li> ` ) .join('')} </ul> </div> <div class="BAudio-more">查看更多 ${ this.option.audio.length } 首</div> </div> </footer> ` : `` } </div> ` element.insertAdjacentHTML('beforeEnd', html) }, initAudio: function () { // 创建一个音频上下文 var audioCtx = (this.audioCtx = new (window.AudioContext || window.webkitAudioContext)()) // 创建一个分析音频模块 this.analyser = audioCtx.createAnalyser() // 设置音频的数量大小 默认是2048 this.analyser.fftSize = 512 // 关联音频 this.analyser.connect(audioCtx.destination) // 对音频进行解码 this.decodeArrayBuffer() }, decodeArrayBuffer: function () { var self = this this.width = this.waveform.clientWidth this.height = this.waveform.clientHeight this.audioCtx.decodeAudioData( this.arraybuffer, function (buffer) { var pcm = self.loadDecodedBuffer(buffer) self.pcm = pcm self.pcmToCanvas(pcm) }, function (err) { console.log(err) } ) }, loadDecodedBuffer: function (buffer) { var accuracy = 100 // 创建 AudioBufferSourceNode this.befferSource = this.audioCtx.createBufferSource() // 讲解码之后的 buffer 放到 AudioBufferSourceNode 的 buffer 中 this.befferSource.buffer = buffer this.befferSource.connect(this.analyser) // 返回计算断开时波形的最大值和最小值 var peaks = this.drawPeaks() return peaks.map(function (item) { return Math.abs(Math.round(item * accuracy) / accuracy) }) }, drawPeaks: function () { var befferSource = this.befferSource.buffer, length = 200 var sampleSize = befferSource.length / length var sampleStep = ~~(sampleSize / 10) || 1 var channels = befferSource.numberOfChannels var splitPeaks = [] var mergedPeaks = [] for (var c = 0; c < channels; c++) { var peaks = (splitPeaks[c] = []) var chan = befferSource.getChannelData(c) for (var i = 0; i < length; i++) { var start = ~~(i * sampleSize) var end = ~~(start + sampleSize) var min = 0 var max = 0 for (var j = start; j < end; j += sampleStep) { var value = chan[j] if (value > max) { max = value } if (value < min) { min = value } } peaks[2 * i] = max peaks[2 * i + 1] = min if (c == 0 || max > mergedPeaks[2 * i]) { mergedPeaks[2 * i] = max } if (c == 0 || min < mergedPeaks[2 * i + 1]) { mergedPeaks[2 * i + 1] = min } } } return mergedPeaks }, drawCanvas: function (canvas, peaks, color) { var bar_space = 1, botSize = 0.25, self = this var ctx = canvas.getContext('2d') var ratio = self._getPixelRatio(ctx) canvas.width = self.width * ratio canvas.height = self.height * ratio canvas.style.width = self.width + 'px' canvas.style.height = self.height + 'px' ctx.scale(ratio, ratio) ctx.imageSmoothingEnabled = false ctx.imageSmoothing = false ctx.imageSmoothingQuality = 'high' ctx.webkitImageSmoothing = false var max = Math.max.apply(null, peaks) var newArr = [] for (var i = 0; i < peaks.length; i++) { newArr[i] = parseFloat(peaks[i] / Number(max)) } var barCount = self.width / 3 var bar_w = Math.ceil(self.width / barCount) var topSize = 1 - botSize var lastBarHeight = 0 var searched_index = null var proBarColors = [] function drawBars(isReflection) { for (var i = 0; i < barCount; i++) { ctx.save() searched_index = Math.ceil(i * (newArr.length / barCount)) if (i < barCount / 5) { if (newArr[searched_index] < 0.1) { newArr[searched_index] = 0.1 } } if ( newArr.length > barCount * 2.5 && i > 0 && i < newArr.length - 1 ) { newArr[searched_index] = Math.abs( newArr[searched_index] + newArr[searched_index - 1] + newArr[searched_index + 1] ) / 3 } var targetRatio = isReflection ? botSize : topSize var barHeight = Math.abs( newArr[searched_index] * self.height * targetRatio ) if (isNaN(lastBarHeight)) { lastBarHeight = 0 } barHeight = barHeight / 1.5 + lastBarHeight / 2.5 lastBarHeight = barHeight ctx.lineWidth = 0 barHeight = Math.floor(barHeight) var barPositionTop = isReflection ? self.height * topSize : Math.ceil(self.height * targetRatio - barHeight) ctx.beginPath() ctx.rect(i * bar_w, barPositionTop, bar_w - bar_space, barHeight) if (isReflection) { ctx.fillStyle = self.hexToRgb(color, 0.25) } else { ctx.fillStyle = color } if (color === self.option.proBarColor) { if (color.indexOf(',') > -1) { proBarColors = color.split(',') } if (proBarColors.length) { var startColor = isReflection ? self.hexToRgb(proBarColors[0], 0.25) : proBarColors[0] var endColor = isReflection ? self.hexToRgb(proBarColors[1], 0.25) : proBarColors[1] gradient = ctx.createLinearGradient(0, 0, 0, self.height) gradient.addColorStop(0, startColor) gradient.addColorStop(1, endColor) ctx.fillStyle = gradient } } ctx.fill() ctx.closePath() ctx.restore() } } ctx.clearRect(0, 0, self.width, self.height) drawBars() drawBars(true) }, ready: function () { var element = this.option.element, playIndex = this.playIndex if ( (playIndex > -1 && !this.audioMap.get(playIndex)) || playIndex === -1 ) { this.audio = document.createElement('audio') this.audio.src = this.music.url this.audio.preload = 'metadata' this.audio.volume = 0.7 } else { this.audio = this.audioMap.get(playIndex) } this.load = true this.attachAudioEvents() element.classList.add('load') element.querySelector('.BAudio-author').innerHTML = this.music.artist element.querySelector('.BAudio-title').innerHTML = this.music.name if (this.option.autoplay && !this._isMobile()) { this.onPlay() } this.option.autoplay = true if (playIndex > -1) { this.audio.pcm = this.pcm this.audioMap.set(playIndex, this.audio) } }, onWaveformClick: function (event) { if (!this.playing && !this.start) return var element = this.option.element var duration = this.audio.duration var x = event.pageX var left = x - event.currentTarget.getBoundingClientRect().left var time = (left / this.width) * duration var totalWidth = element.querySelector('.BAudio-total').clientWidth this.audio.currentTime = time if (this.width - left > totalWidth) { element.querySelector('.BAudio-current').style.left = left + 'px' } else { element.querySelector('.BAudio-current').style.left = this.width - totalWidth + 'px' } event.currentTarget.style.setProperty('--bar-left', left + 'px') element.querySelector('.BAudio-pro').style.width = left + 'px' element.querySelector('.BAudio-current').innerHTML = this.formatTime(time) this.single && this.renderComment(left) }, onWaveformMouseMove: function (event) { var element = this.option.element var duration = this.audio.duration var x = event.pageX var left = x - event.currentTarget.getBoundingClientRect().left var time = (left / this.width) * duration this.moving = true event.currentTarget.style.setProperty('--bar-left', left + 'px') element.querySelector('.BAudio-current').innerHTML = this.formatTime(time) }, onWaveformMouseLeave: function () { var element = this.option.element this.moving = false element.querySelector('.BAudio-current').innerHTML = this.formatTime( this.audio.currentTime ) }, onCommentMouseMove: function (event) { this.commentMoving = true var element = this.option.element, currentTarget = event.currentTarget element.classList.add('comment') currentTarget.classList.add('current') this.single && this.renderComment(currentTarget.offsetLeft) }, onCommentMouseLeave: function (event) { this.commentMoving = false var element = this.option.element, currentTarget = event.currentTarget, wrapper = element.querySelector('.BAudio-wrapper') wrapper.classList.remove('active') currentTarget.classList.remove('current') }, onAudioError: function () { this.waveform.innerHTML = ' - Error happens ╥﹏╥' }, onAudioEnd: function () { this.resetMusic() if (this.playIndex < this.option.audio.length - 1) { this.setMusic(this.playIndex, 'next') } else { this.audioPause() } }, onAudioLoadedData: function () { var self = this var element = this.option.element, commentList = this.commentList, wrapper = element.querySelector('.BAudio-wrapper') wrapper.innerHTML = '' commentList.forEach(function (item) { var left = (item.duration / self.audio.duration) * self.width var obj = { class: 'BAudio-wrapper__item', style: 'left: ' + left + 'px;background-image: url(' + item.avatar + ')', 'data-user': item.user, 'data-text': item.text } var comment = document.createElement('div') for (var [key, value] of Object.entries(obj)) { comment.setAttribute(key, value) } wrapper.appendChild(comment) self.addEvent(comment, 'mousemove', self.onCommentMouseMove) self.addEvent(comment, 'mouseleave', self.onCommentMouseLeave) }) }, onAudioDurationChange: function () { var element = this.option.element var duration = this.audio.duration if (duration !== 1) { $('.BAudio-totaltip').fadeOut(); element.querySelector('.BAudio-total').innerHTML = this.formatTime(duration) } }, onAudilListScroll: function () { var element = this.option.element, container = element.querySelector('.BAudio-list-container'), wrapper = element.querySelector('.BAudio-list-wrapper'), bar = element.querySelector('.BAudio-list-bar') var wHeight = wrapper.offsetHeight var cHeight = container.offsetHeight var top = (container.scrollTop * cHeight) / wHeight if (bar) { bar.style.top = top + 'px' } }, onAudioListClick: function (event) { var element = this.option.element, items = element.querySelectorAll('.BAudio-list-wrapper__item'), item = event.target var target = item.closest('.BAudio-list-wrapper__item') var index = this._getIndex(target) for (var i = 0, len = items.length; i < len; i++) { items[i].classList.remove('active') } items[index].classList.add('active') this.resetMusic() this.audioPause() this.setMusic(index, 'click') }, onAudioListMore: function () { var self = this var element = this.option.element, container = element.querySelector('.BAudio-list-container'), wrapper = element.querySelector('.BAudio-list-wrapper'), more = element.querySelector('.BAudio-more'), height = 30 if (container.classList.contains('active')) { container.classList.remove('active') more.innerHTML = `查看更多 ${this.option.audio.length} 首` element.querySelector('.BAudio-list-bar').remove() container.scrollTo({ top: height * this.playIndex, behavior: 'smooth' }) } else { container.classList.add('active') more.innerHTML = `收起` setTimeout(function () { var wHeight = wrapper.offsetHeight var cHeight = container.offsetHeight var height = cHeight * (cHeight / wHeight) var top = (container.scrollTop * cHeight) / wHeight var bar = document.createElement('div') bar.className = 'BAudio-list-bar' bar.style.height = height + 'px' bar.style.top = top + 'px' self.addEvent(bar, 'mousedown', self.onScrollBarMousedown) container.appendChild(bar) }, 300) } }, onScrollBarMousedown: function (event) { event.preventDefault() var bar = event.target this.data.offsetTop = bar.offsetTop this.data.mouseY = event.pageY this.data.touching = true bar.classList.add('active') this.addEvent(document, 'mousemove', this.onScrollBarMousemove) this.addEvent(document, 'mouseup', this.onScrollBarMouseup) }, onScrollBarMousemove: function (event) { event.preventDefault() if (!this.data.touching) return var element = this.option.element, container = element.querySelector('.BAudio-list-container'), wrapper = element.querySelector('.BAudio-list-wrapper'), bar = element.querySelector('.BAudio-list-bar'), data = this.data var wHeight = wrapper.offsetHeight var cHeight = container.offsetHeight var diff = (wHeight * cHeight) / wHeight - bar.offsetHeight var diff2 = data.offsetTop + (event.pageY - data.mouseY) var top = 0 if (data.offsetTop + (event.pageY - data.mouseY) <= 0) { top = 0 } else if (data.offsetTop + (event.pageY - data.mouseY) >= diff) { top = diff } else { top = diff2 } bar.style.top = top + 'px' container.scrollTop = bar.offsetTop * (wHeight / cHeight) }, onScrollBarMouseup: function () { var element = this.option.element, bar = element.querySelector('.BAudio-list-bar') this.data.touching = false bar.classList.remove('active') this.removeEvent(document, 'mousemove', this.onScrollBarMousemove) this.removeEvent(document, 'mouseup', this.onScrollBarMouseup) }, onPlay: function () { if (!this.load) return var element = this.option.element, width = this.width, self = this var totalWidth = element.querySelector('.BAudio-total').clientWidth this.playing = !this.playing if (this.playing) { this.audio.play() this.start = true element.classList.add('start') element.classList.add('play') function getCurrentTime() { var proBarWidth = (self.audio.currentTime / self.audio.duration) * width if (proBarWidth > width) { proBarWidth = width } if (!self.commentMoving && self.single) { // 渲染评论 self.renderComment(proBarWidth) } if (!self.moving) { element.querySelector('.BAudio-current').innerHTML = self.formatTime(self.audio.currentTime) } if (self.width - proBarWidth > totalWidth) { element.querySelector('.BAudio-current').style.left = proBarWidth + 'px' } element.querySelector('.BAudio-pro').style.width = proBarWidth + 'px' if (self.playing) { requestAnimationFrame(getCurrentTime) } } requestAnimationFrame(getCurrentTime) } else { this.audioPause() } }, onSubmit: function (event) { console.log(11) var duration = this.audio.currentTime if (event.keyCode === 13) { var text = event.target.value this.commentList.push({ duration: duration, avatar: './1.jpeg', user: '周杰伦', text: text }) this.onAudioLoadedData() } }, audioPause: function () { var element = this.option.element this.audio.pause() this.playing = false element.classList.remove('play') }, attachDomEvents: function () { var element = this.option.element this.waveform = element.querySelector('.BAudio-waveform') this.addEvent(this.waveform, 'click', this.onWaveformClick) this.addEvent(this.waveform, 'mousemove', this.onWaveformMouseMove) this.addEvent(this.waveform, 'mouseleave', this.onWaveformMouseLeave) !this.single && this.addEvent( element.querySelector('.BAudio-list-container'), 'scroll', this.onAudilListScroll ) !this.single && this.addEvent( element.querySelector('.BAudio-list-wrapper'), 'click', this.onAudioListClick ) !this.single && this.addEvent( element.querySelector('.BAudio-more'), 'click', this.onAudioListMore ) this.addEvent(element.querySelector('.BAudio-play'), 'click', this.onPlay) this.single && this.addEvent( element.querySelector('.BAudio-comments-from__input'), 'keydown', this.onSubmit ) }, attachAudioEvents: function () { this.addEvent(this.audio, 'error', this.onAudioError) this.addEvent(this.audio, 'ended', this.onAudioEnd) this.addEvent(this.audio, 'durationchange', this.onAudioDurationChange) this.single && this.addEvent(this.audio, 'loadeddata', this.onAudioLoadedData) }, hexToRgb: function (hex, palpha) { var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex) var str = '' if (result) { result = { r: parseInt(result[1], 16), g: parseInt(result[2], 16), b: parseInt(result[3], 16) } str = 'rgba(' + result.r + ',' + result.g + ',' + result.b + ',' + (palpha ? palpha : 1) + ')' } return str }, formatTime: function (time) { time = time | 0 var minute = (time / 60) | 0 var second = this._pad(time % 60) return minute + ':' + second }, addEvent: function (elm, type, fn) { if (window.attachEvent) { elm.attachEvent('on' + type, fn) } else if (window.addEventListener) { elm.addEventListener(type, fn, false) } else { elm['on' + type] = fn } }, removeEvent: function (elm, type, fn) { if (window.detachEvent) { elm.detachEvent('on' + type, fn) } else if (window.removeEventListener) { elm.removeEventListener(type, fn, false) } else { elm['on' + type] = null } }, renderComment: function (offsetLeft) { var element = this.option.element, popover = element.querySelector('.BAudio-popover-wrapper'), wrapper = element.querySelector('.BAudio-wrapper'), user = popover.querySelector('.BAudio-popover-wrapper__user'), comment = popover.querySelector('.BAudio-popover-wrapper__comment'), items = element.querySelectorAll('.BAudio-wrapper__item') items.forEach(function (item) { item.classList.remove('current') }) var index = this._findClosestElementIndex(items, offsetLeft) if (index === -1) { wrapper.classList.remove('active') return } if (offsetLeft < this.width / 2) { popover.classList.remove('right') popover.style.right = 'auto' popover.style.left = items[index].offsetLeft + 'px' } else { popover.classList.add('right') popover.style.left = 'auto' popover.style.right = this.width - items[index].offsetLeft - items[index].clientWidth + 'px' } wrapper.classList.add('active') items[index].classList.add('current') user.innerHTML = items[index].getAttribute('data-user') comment.innerHTML = items[index].getAttribute('data-text') }, getCommentList: function () { this.commentList = [ { duration: 8, avatar: 'https://cdn.staticaly.com/gh/ZHOUYUANN/BlogBed@master/1.1mq8h4qx4ups.webp?raw=true', user: '卷灯酒', text: '哈哈哈哈哈' }, { duration: 40, avatar: 'https://cdn.staticaly.com/gh/ZHOUYUANN/BlogBed@master/2.11s74qf2536o.webp?raw=true', user: '深院空巷', text: '我是一只小可爱' }, { duration: 42, avatar: 'https://cdn.staticaly.com/gh/ZHOUYUANN/BlogBed@master/4.56lixtsqn0s0.webp?raw=true', user: '周大帅', text: '我是大帅哥!!!' }, { duration: 44, avatar: 'https://cdn.staticaly.com/gh/ZHOUYUANN/BlogBed@master/3.5z5sa9i3xwg0.webp?raw=true', user: '孤痞°', text: '当爱情遗落成遗迹 用象形刻划成回忆' }, { duration: 146, avatar: 'https://cdn.staticaly.com/gh/ZHOUYUANN/BlogBed@master/20210127165426_83208.5u72n89gbas0.gif?raw=true', user: '莫忘初心丶', text: '垃圾王者荣耀' } ] }, getMusic: function (index) { return index > -1 ? this.option.audio[index] : this.option.audio }, setMusic: function (index, type) { var self = this var element = this.option.element, container = element.querySelector('.BAudio-list-container'), items = element.querySelectorAll('.BAudio-list-wrapper__item'), height = 30 if (this.single) { this.getMusicArrayBuffer(function () { self.initAudio() }) return } if (type === 'next') { if (this.playIndex > -1) { index++ } } items[this.playIndex].classList.remove('active') items[this.playIndex].classList.add('isload') items[index].classList.add('active') this.playIndex = index this.music = this.getMusic(this.playIndex) var audio = this.audioMap.get(this.playIndex) if (audio && audio.pcm) { setTimeout(function () { self.pcm = audio.pcm self.pcmToCanvas(audio.pcm) }, 300) } else { this.getMusicArrayBuffer(function () { self.initAudio() }) } if (!container.classList.contains('active')) { // 滚动列表 container.scrollTo({ top: height * this.playIndex, behavior: 'smooth' }) } }, resetMusic: function () { var element = this.option.element this.load = false this.start = false this.playing = false this.audio.currentTime = 0 element.classList.remove('load') element.classList.remove('start') element.classList.remove('play') }, getMusicArrayBuffer: function (callback) { var self = this var xhr = new XMLHttpRequest() xhr.open('GET', this.music.url, true) xhr.responseType = 'arraybuffer' xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) { self.arraybuffer = xhr.response callback() } else { throw new Error('获取音频地址失败: ' + xhr.status) } } } xhr.send() }, pcmToCanvas: function (pcm) { var element = this.option.element, barColor = this.option.barColor, proBarColor = this.option.proBarColor this.drawCanvas( element.querySelector('.BAudio-waveform-canvas'), pcm, barColor ) this.drawCanvas( element.querySelector('.BAudio-pro-canvas'), pcm, proBarColor ) this.ready() }, _getPixelRatio: function (context) { var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1 return (window.devicePixelRatio || 1) / backingStore }, _pad: function (num) { var len = num.toString().length while (len < 2) { num = '0' + num len++ } return num }, _isMobile: function () { return navigator.userAgent.match( /(iPad)|(iPhone)|(iPod)|(android)|(webOS)/i ) }, _getIndex: function (ele) { var index = 0 for (var p = ele.previousSibling; p; ) { if (p.nodeType == 1) { index++ } p = p.previousSibling } return index }, _findClosestElementIndex: function (elements, offsetLeft) { var elementsArr = [].slice.call(elements) var result = elementsArr.reduce( function (last, current, index) { var difference = offsetLeft - current.offsetLeft if ( Math.abs(difference) < last.diff && 0 <= difference && difference <= current.clientWidth ) { last.diff = Math.abs(difference) last.index = index } return { diff: last.diff, index: last.index } }, { diff: Infinity, index: -1 } ) return result.index }, _isArray: function (data) { return Object.prototype.toString.call(data) === '[object Array]' } } window.BAudio = BAudio })(window) ================================================ FILE: assets/vendors/bs-emoji/bs-emoji.css ================================================ #face { position: absolute; transform:translate(10px,-60px); } #facecross { transform:translate(10px,-60px); } #facesays { transform:translate(10px,-45px); } #facecircle { transform:translate(10px,-45px); } .emotions { z-index: 94361; font-size: 14px; background: #f8f9fa; width: 100%; max-width: 500px; border: 1px solid #e0e3e7; border-radius: 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); overflow:hidden; } .emotions .categorys { background: #f1f3f5; padding: 10px 15px; border-bottom: 1px solid #e9ecef; display: flex; gap: 8px; overflow-x: auto; } .emotions .categorys::-webkit-scrollbar { height: 6px; } .emotions .categorys::-webkit-scrollbar-track { background: #f1f1f1; } .emotions .categorys::-webkit-scrollbar-thumb { background: #f1f3f5!important; border-radius: 3px; } .emotions .categorys::-webkit-scrollbar-thumb:hover { background: #555; } .emotions .categorys a { display: inline-flex; padding: 8px 16px; border-radius: 8px; color: #495057; font-weight: 500; transition: all 0.2s ease; white-space: nowrap; font-size: 13px; } .emotions .categorys a.current { background: #495057; color: white; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08); } .emotions .categorys a:hover:not(.current) { background: #dee2e6; color: #343a40; } .emotions .container a span{ display: inline-block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; margin: 5px; } .emotions .container { padding: 15px; display: grid; grid-template-columns: repeat(auto-fill, 52px); justify-content: center; gap: 10px; background: white; min-height: 200px; } .emotions .emoticon-item { width: 52px !important; height: 52px !important; border: 1px solid transparent; border-radius: 8px; padding: 4px; transition: all 0.2s ease; display: flex; justify-content: center; align-items: center; box-sizing: border-box; } .emotions .emoticon-item img { width: 100%; height: 100%; object-fit: contain; border-radius: 6px; } .emotions .emoticon-item:hover { transform: scale(1.08); border-color: #6c757d; box-shadow: 0 4px 8px rgba(108, 117, 125, 0.2); z-index: 1; } .emotions .page { padding: 12px 15px; background: #f8f9fa; border-top: 1px solid #e9ecef; display: flex; justify-content: flex-end; gap: 8px; } .emotions .page a { display: inline-flex; padding: 8px 14px; border-radius: 8px; background: #dee2e6; color: #343a40; font-weight: 500; transition: all 0.2s ease; font-size: 13px; } .emotions .page a:hover { background: #6c757d; color: white; } .emotions .page a.current { background: #495057; color: white; } @media (max-width: 480px) { .emotions .container { grid-template-columns: repeat(auto-fill, 46px); gap: 8px; padding: 10px; } .emotions .emoticon-item { width: 46px !important; height: 46px !important; } .emotions .categorys { padding: 8px 12px; } .emotions .categorys a { padding: 6px 12px; } } ================================================ FILE: assets/vendors/bs-emoji/bs-emoji.js ================================================ /* * * Emoji * */ function Hashtable() { this._hash = new Object(); this.put = function(key, value) { if (typeof (key) != "undefined") { if (this.containsKey(key) == false) { this._hash[key] = typeof (value) == "undefined" ? null : value; return true; } else { return false; } } else { return false; } } this.remove = function(key) { delete this._hash[key]; } this.size = function() { var i = 0; for (var k in this._hash) { i++; } return i; } this.get = function(key) { return this._hash[key]; } this.containsKey = function(key) { return typeof (this._hash[key]) != "undefined"; } this.clear = function() { for (var k in this._hash) { delete this._hash[k]; } } } var emotions = new Array(); var categorys = new Array(); var uBsEmotionsHt = new Hashtable(); $(function() { $.ajax( { dataType : 'json', url : '/index.php/bearEmoji', success : function(response) { //json = JSON.parse(response); data = response; for ( var i in data) { if (data[i].category == '') { data[i].category = 'OwO颜文字'; } if (emotions[data[i].category] == undefined) { emotions[data[i].category] = new Array(); categorys.push(data[i].category); } emotions[data[i].category].push( { name : data[i].data, icon : data[i].icon, text : data[i].text }); uBsEmotionsHt.put(data[i].data, data[i].icon, data[i].text); } } }); }); //替换 function AnalyticEmotion(s) { if(typeof (s) != "undefined") { var sArr = s.match(/\[.*?\]/g); for(var i = 0; i < sArr.length; i++){ if(uBsEmotionsHt.containsKey(sArr[i])) { var reStr = "<img src=\"" + uBsEmotionsHt.get(sArr[i]) + "\" />"; s = s.replace(sArr[i], reStr); } } } return s; } (function($){ $.fn.BearsimpleEmoji = function(target){ var cat_current; var cat_page; $(this).click(function(event){ //console.log(event.target.id); event.stopPropagation(); var eTop = target.offset().top + target.height() + 15; var eLeft = target.offset().left - 1; if($('.emotions .categorys')[0]){ $('.emotions').css({top: eTop, left: eLeft}); $('.emotions').toggle(); return; } $('.emoemo').append('<div class="emotions"></div>'); $('.emotions').css({top: eTop, left: eLeft}); $('.emotions').html('<div>正在加载,请稍候...</div>'); $('.emotions').click(function(event){ event.stopPropagation(); }); $('.emotions').html('<div style="display:flex; align-items:center; gap:12px; padding:10px 15px; background:#f1f3f5; border-bottom:1px solid #e9ecef;"><div class="categorys"style="flex-grow:1; overflow-x:auto; display:flex; gap:8px; scrollbar-width:thin;"></div><div style="display:flex; gap:8px; flex-shrink:0; margin-left:12px;"><a href="javascript:void(0);"id="sync"style="display:inline-flex; padding:6px; border-radius:6px; background:#dee2e6; color:#343a40;"><i class="sync icon" style="margin-top:3px;margin-left:2px;"></i></a><a href="javascript:void(0);"id="prev"style="display:inline-flex; align-items:center; padding:6px 10px; border-radius:6px; background:#dee2e6; color:#343a40;">«</a><a href="javascript:void(0);"id="next"style="display:inline-flex; align-items:center; padding:6px 10px; border-radius:6px; background:#dee2e6; color:#343a40;">»</a></div></div><div class="container"></div><div class="page"></div>'); $('.emotions #prev').click(function(){ showCategorys(cat_page - 1); }); $('.emotions #next').click(function(){ showCategorys(cat_page + 1); }); $('.emotions #sync').click(function(){ showCategorys(); showEmotions(); }); showCategorys(); showEmotions(); }); $('body').click(function(){ $('.emotions').fadeOut(); }); $.fn.insertText = function(text){ this.each(function() { if(this.tagName !== 'INPUT' && this.tagName !== 'TEXTAREA') {return;} if (document.selection) { this.focus(); var cr = document.selection.createRange(); cr.text = text; cr.collapse(); cr.select(); }else if (this.selectionStart || this.selectionStart == '0') { var start = this.selectionStart, end = this.selectionEnd; this.value = this.value.substring(0, start)+ text+ this.value.substring(end, this.value.length); this.selectionStart = this.selectionEnd = start+text.length; }else { this.value += text; } }); return this; } function showCategorys(){ var page = arguments[0]?arguments[0]:0; if(page < 0 || page >= categorys.length / 5){ return; } $('.emotions .categorys').html(''); cat_page = page; for(var i = page * 5; i < (page + 1) * 5 && i < categorys.length; ++i){ $('.emotions .categorys').append($('<a href="javascript:void(0);">' + categorys[i] + '</a>')); } $('.emotions .categorys a').click(function(){ showEmotions($(this).text()); }); $('.emotions .categorys a').each(function(){ if($(this).text() == cat_current){ $(this).addClass('current'); } }); } function showEmotions(){ var category = arguments[0]?arguments[0]:'OwO颜文字'; var page = arguments[1]?arguments[1] - 1:0; $('.emotions .container').html(''); $('.emotions .page').html(''); cat_current = category; for(var i = page * 72; i < (page + 1) * 72 && i < emotions[category].length; ++i){ if(cat_current == 'OwO颜文字'){ $('.emotions .container').append($('<a style="margin-left:5px;margin-bottom:5px;width:auto;height:auto" href="javascript:void(0);" title="' + emotions[category][i].name + '"><span>' +emotions[category][i].name + ' </span></a>')); } else{ $('.emotions .container').append($('<a href="javascript:void(0);" title="' + emotions[category][i].name + '"><img src="' + emotions[category][i].icon + '" alt="' + emotions[category][i].text + '" /></a>')); } } $('.emotions .container a').click(function(){ target.insertText($(this).attr('title')); var $textarea = $("#friendcircle-comment-textarea"); if ($textarea.length && $textarea.val().length > 1) { $("#friendcircle-comment-container").attr("style", "box-shadow: inset 0px 0px 0px 1px #07c160;"); $("#friendcircle-comment-submit").addClass("friendcircle-comment-readySubmit"); } $('.emotions').remove(); }); for(var i = 1; i < emotions[category].length / 72 + 1; ++i){ $('.emotions .page').append($('<a href="javascript:void(0);"' + (i == page + 1?' class="current"':'') + '>' + i + '</a>')); } $('.emotions .page a').click(function(){ showEmotions(category, $(this).text()); }); $('.emotions .categorys a.current').removeClass('current'); $('.emotions .categorys a').each(function(){ if($(this).text() == category){ $(this).addClass('current'); } }); } } })(jQuery); ================================================ FILE: assets/vendors/bs-emoji/bs-emoji.json ================================================ [{ "data": "OωO", "text": "owo", "category": "" }, { "data": "|´・ω・)ノ", "text": "Hi", "category": "" }, { "data": "ヾ(≧∇≦*)ゝ", "text": "开心", "category": "" }, { "data": "(☆ω☆)", "text": "星星眼", "category": "" }, { "data": "(╯‵□′)╯︵┴─┴", "text": "掀桌", "category": "" }, { "data": " ̄﹃ ̄", "text": "流口水", "category": "" }, { "data": "(/ω\)", "text": "捂脸", "category": "" }, { "data": "∠( ᐛ 」∠)_", "text": "给跪", "category": "" }, { "data": "(๑•̀ㅁ•́ฅ)", "text": "Hi", "category": "" }, { "data": "→_→", "text": "斜眼", "category": "" }, { "data": "୧(๑•̀⌄•́๑)૭", "text": "加油", "category": "" }, { "data": "٩(ˊᗜˋ*)و", "text": "有木有WiFi", "category": "" }, { "data": "(ノ°ο°)ノ", "text": "前方高能预警", "category": "" }, { "data": "(´இ皿இ`)", "text": "我从未见过如此厚颜无耻之人", "category": "" }, { "data": "⌇●﹏●⌇", "text": "吓死宝宝惹", "category": "" }, { "data": "(ฅ´ω`ฅ)", "text": "已阅留爪", "category": "" }, { "data": "(╯°A°)╯︵○○○", "text": "去吧大师球", "category": "" }, { "data": "φ( ̄∇ ̄o)", "text": "太萌惹", "category": "" }, { "data": "ヾ(´・ ・`。)ノ", "text": "咦咦咦", "category": "" }, { "data": "( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃", "text": "气呼呼", "category": "" }, { "data": "(ó﹏ò。)", "text": "我受到了惊吓", "category": "" }, { "data": "Σ(っ °Д °;)っ", "text": "什么鬼", "category": "" }, { "data": "( ,,´・ω・)ノ\"(´っω・`。)", "text": "摸摸头", "category": "" }, { "data": "╮(╯▽╰)╭ ", "text": "无奈", "category": "" }, { "data": "o(*////▽////*)q ", "text": "脸红", "category": "" }, { "data": ">﹏<", "text": "", "category": "" }, { "data": "( ๑´•ω•) \"(ㆆᴗㆆ)", "text": "", "category": "" }, { "data": "(。•ˇ‸ˇ•。)", "text": "(。•ˇ‸ˇ•。)", "category": "" }, { "text": "[微笑]", "zh": "[微笑]", "data": "[Smile]", "codex": "/::)", "web_codex": "/微笑", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Smile.png", "category": "微信" }, { "text": "[撇嘴]", "zh": "[撇嘴]", "data": "[Grimace]", "codex": "/::~", "web_codex": "/撇嘴", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Grimace.png", "category": "微信" }, { "text": "[色]", "zh": "[色]", "data": "[Drool]", "codex": "/::B", "web_codex": "/色", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Drool.png", "category": "微信" }, { "text": "[发呆]", "zh": "[發呆]", "data": "[Scowl]", "codex": "/::|", "web_codex": "/发呆", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Scowl.png", "category": "微信" }, { "text": "[得意]", "zh": "[得意]", "data": "[CoolGuy]", "codex": "/:8-)", "web_codex": "/得意", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/CoolGuy.png", "category": "微信" }, { "text": "[流泪]", "zh": "[流淚]", "data": "[Sob]", "codex": "/::<", "web_codex": "/流泪", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Sob.png", "category": "微信" }, { "text": "[害羞]", "zh": "[害羞]", "data": "[Shy]", "codex": "/::$", "web_codex": "/害羞", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Shy.png", "category": "微信" }, { "text": "[闭嘴]", "zh": "[閉嘴]", "data": "[Silent]", "codex": "/::X", "web_codex": "/闭嘴", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Silent.png", "category": "微信" }, { "text": "[睡]", "zh": "[睡]", "data": "[Sleep]", "codex": "/::Z", "web_codex": "/睡", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Sleep.png", "category": "微信" }, { "text": "[大哭]", "zh": "[大哭]", "data": "[Cry]", "codex": "/::'(", "web_codex": "/大哭", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Cry.png", "category": "微信" }, { "text": "[尴尬]", "zh": "[尷尬]", "data": "[Awkward]", "codex": "/::-|", "web_codex": "/尴尬", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Awkward.png", "category": "微信" }, { "text": "[发怒]", "zh": "[發怒]", "data": "[Angry]", "codex": "/::@", "web_codex": "/发怒", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Angry.png", "category": "微信" }, { "text": "[调皮]", "zh": "[調皮]", "data": "[Tongue]", "codex": "/::P", "web_codex": "/调皮", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Tongue.png", "category": "微信" }, { "text": "[呲牙]", "zh": "[呲牙]", "data": "[Grin]", "codex": "/::D", "web_codex": "/呲牙", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Grin.png", "category": "微信" }, { "text": "[惊讶]", "zh": "[驚訝]", "data": "[Surprise]", "codex": "/::O", "web_codex": "/惊讶", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Surprise.png", "category": "微信" }, { "text": "[难过]", "zh": "[難過]", "data": "[Frown]", "codex": "/::(", "web_codex": "/难过", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Frown.png", "category": "微信" }, { "text": "[酷]", "zh": "[酷]", "data": "[Ruthless]", "codex": "/::+", "web_codex": "/酷", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Ruthless.png", "category": "微信" }, { "text": "[囧]", "zh": "[囧]", "data": "[Blush]", "codex": "/:--b", "web_codex": "/冷汗", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Blush.png", "category": "微信" }, { "text": "[抓狂]", "zh": "[抓狂]", "data": "[Scream]", "codex": "/::Q", "web_codex": "/抓狂", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Scream.png", "category": "微信" }, { "text": "[吐]", "zh": "[吐]", "data": "[Puke]", "codex": "/::T", "web_codex": "/吐", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Puke.png", "category": "微信" }, { "text": "[偷笑]", "zh": "[偷笑]", "data": "[Chuckle]", "codex": "/:,@P", "web_codex": "/偷笑", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Chuckle.png", "category": "微信" }, { "text": "[愉快]", "zh": "[愉快]", "data": "[Joyful]", "codex": "/:,@-D", "web_codex": "/可爱", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Joyful.png", "category": "微信" }, { "text": "[白眼]", "zh": "[白眼]", "data": "[Slight]", "codex": "/::d", "web_codex": "/白眼", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Slight.png", "category": "微信" }, { "text": "[傲慢]", "zh": "[傲慢]", "data": "[Smug]", "codex": "/:,@o", "web_codex": "/傲慢", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Smug.png", "category": "微信" }, { "text": "[饥饿]", "zh": "[饑餓]", "data": "[Hungry]", "codex": "/::g", "web_codex": "/饥饿", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Hungry.png", "category": "微信" }, { "text": "[困]", "zh": "[累]", "data": "[Drowsy]", "codex": "/:|-)", "web_codex": "/困", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Drowsy.png", "category": "微信" }, { "text": "[惊恐]", "zh": "[驚恐]", "data": "[Panic]", "codex": "/::!", "web_codex": "/惊恐", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Panic.png", "category": "微信" }, { "text": "[流汗]", "zh": "[流汗]", "data": "[Sweat]", "codex": "/::L", "web_codex": "/流汗", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Sweat.png", "category": "微信" }, { "text": "[憨笑]", "zh": "[大笑]", "data": "[Laugh]", "codex": "/::>", "web_codex": "/憨笑", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Laugh.png", "category": "微信" }, { "text": "[悠闲]", "zh": "[悠閑]", "data": "[Commando]", "codex": "/::,@", "web_codex": "/大兵", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Commando.png", "category": "微信" }, { "text": "[奋斗]", "zh": "[奮鬥]", "data": "[Determined]", "codex": "/:,@f", "web_codex": "/奋斗", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Determined.png", "category": "微信" }, { "text": "[咒骂]", "zh": "[咒罵]", "data": "[Scold]", "codex": "/::-S", "web_codex": "/咒骂", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Scold.png", "category": "微信" }, { "text": "[疑问]", "zh": "[疑問]", "data": "[Shocked]", "codex": "/:?", "web_codex": "/疑问", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Shocked.png", "category": "微信" }, { "text": "[嘘]", "zh": "[噓]", "data": "[Shhh]", "codex": "/:,@x", "web_codex": "/嘘", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Shhh.png", "category": "微信" }, { "text": "[晕]", "zh": "[暈]", "data": "[Dizzy]", "codex": "/:,@@", "web_codex": "/晕", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Dizzy.png", "category": "微信" }, { "text": "[疯了]", "zh": "[瘋了]", "data": "[Tormented]", "codex": "/::8", "web_codex": "/折磨", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Tormented.png", "category": "微信" }, { "text": "[衰]", "zh": "[衰]", "data": "[Toasted]", "codex": "/:,@!", "web_codex": "/衰", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Toasted.png", "category": "微信" }, { "text": "[骷髅]", "zh": "[骷髏頭]", "data": "[Skull]", "codex": "/:!!!", "web_codex": "/骷髅", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Skull.png", "category": "微信" }, { "text": "[敲打]", "zh": "[敲打]", "data": "[Hammer]", "codex": "/:xx", "web_codex": "/敲打", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Hammer.png", "category": "微信" }, { "text": "[再见]", "zh": "[再見]", "data": "[Wave]", "codex": "/:bye", "web_codex": "/再见", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Wave.png", "category": "微信" }, { "text": "[擦汗]", "zh": "[擦汗]", "data": "[Speechless]", "codex": "/:wipe", "web_codex": "/擦汗", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Speechless.png", "category": "微信" }, { "text": "[抠鼻]", "zh": "[摳鼻]", "data": "[NosePick]", "codex": "/:dig", "web_codex": "/抠鼻", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/NosePick.png", "category": "微信" }, { "text": "[鼓掌]", "zh": "[鼓掌]", "data": "[Clap]", "codex": "/:handclap", "web_codex": "/鼓掌", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Clap.png", "category": "微信" }, { "text": "[糗大了]", "zh": "[羞辱]", "data": "[Shame]", "codex": "/:&-(", "web_codex": "/糗大了", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Shame.png", "category": "微信" }, { "text": "[坏笑]", "zh": "[壞笑]", "data": "[Trick]", "codex": "/:B-)", "web_codex": "/坏笑", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Trick.png", "category": "微信" }, { "text": "[左哼哼]", "zh": "[左哼哼]", "data": "[Bah!L]", "codex": "/:<@", "web_codex": "/左哼哼", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Bah!L.png", "category": "微信" }, { "text": "[右哼哼]", "zh": "[右哼哼]", "data": "[Bah!R]", "codex": "/:@>", "web_codex": "/右哼哼", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Bah!R.png", "category": "微信" }, { "text": "[哈欠]", "zh": "[哈欠]", "data": "[Yawn]", "codex": "/::-O", "web_codex": "/哈欠", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Yawn.png", "category": "微信" }, { "text": "[鄙视]", "zh": "[鄙視]", "data": "[Pooh-pooh]", "codex": "/:>-|", "web_codex": "/鄙视", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Pooh-pooh.png", "category": "微信" }, { "text": "[委屈]", "zh": "[委屈]", "data": "[Shrunken]", "codex": "/:P-(", "web_codex": "/委屈", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Shrunken.png", "category": "微信" }, { "text": "[快哭了]", "zh": "[快哭了]", "data": "[TearingUp]", "codex": "/::'|", "web_codex": "/快哭了", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/TearingUp.png", "category": "微信" }, { "text": "[阴险]", "zh": "[陰險]", "data": "[Sly]", "codex": "/:X-)", "web_codex": "/阴险", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Sly.png", "category": "微信" }, { "text": "[亲亲]", "zh": "[親親]", "data": "[Kiss]", "codex": "/::*", "web_codex": "/亲亲", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Kiss.png", "category": "微信" }, { "text": "[吓]", "zh": "[嚇]", "data": "[Wrath]", "codex": "/:@x", "web_codex": "/吓", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Wrath.png", "category": "微信" }, { "text": "[可怜]", "zh": "[可憐]", "data": "[Whimper]", "codex": "/:8*", "web_codex": "/可怜", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Whimper.png", "category": "微信" }, { "text": "[菜刀]", "zh": "[菜刀]", "data": "[Cleaver]", "codex": "/:pd", "web_codex": "/菜刀", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Cleaver.png", "category": "微信" }, { "text": "[西瓜]", "zh": "[西瓜]", "data": "[Watermelon]", "codex": "/:<W>", "web_codex": "/西瓜", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Watermelon.png", "category": "微信" }, { "text": "[啤酒]", "zh": "[啤酒]", "data": "[Beer]", "codex": "/:beer", "web_codex": "/啤酒", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Beer.png", "category": "微信" }, { "text": "[篮球]", "zh": "[籃球]", "data": "[Basketball]", "codex": "/:basketb", "web_codex": "/篮球", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Basketball.png", "category": "微信" }, { "text": "[乒乓]", "zh": "[乒乓]", "data": "[PingPong]", "codex": "/:oo", "web_codex": "/乒乓", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/PingPong.png", "category": "微信" }, { "text": "[咖啡]", "zh": "[咖啡]", "data": "[Coffee]", "codex": "/:coffee", "web_codex": "/咖啡", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Coffee.png", "category": "微信" }, { "text": "[饭]", "zh": "[飯]", "data": "[Rice]", "codex": "/:eat", "web_codex": "/饭", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Rice.png", "category": "微信" }, { "text": "[猪头]", "zh": "[豬頭]", "data": "[Pig]", "codex": "/:pig", "web_codex": "/猪头", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Pig.png", "category": "微信" }, { "text": "[玫瑰]", "zh": "[玫瑰]", "data": "[Rose]", "codex": "/:rose", "web_codex": "/玫瑰", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Rose.png", "category": "微信" }, { "text": "[凋谢]", "zh": "[枯萎]", "data": "[Wilt]", "codex": "/:fade", "web_codex": "/凋谢", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Wilt.png", "category": "微信" }, { "text": "[嘴唇]", "zh": "[嘴唇]", "data": "[Lips]", "codex": "/:showlove", "web_codex": "/示爱", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Lips.png", "category": "微信" }, { "text": "[爱心]", "zh": "[愛心]", "data": "[Heart]", "codex": "/:heart", "web_codex": "/爱心", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Heart.png", "category": "微信" }, { "text": "[心碎]", "zh": "[心碎]", "data": "[BrokenHeart]", "codex": "/:break", "web_codex": "/心碎", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/BrokenHeart.png", "category": "微信" }, { "text": "[蛋糕]", "zh": "[蛋糕]", "data": "[Cake]", "codex": "/:cake", "web_codex": "/蛋糕", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Cake.png", "category": "微信" }, { "text": "[闪电]", "zh": "[閃電]", "data": "[Lightning]", "codex": "/:li", "web_codex": "/闪电", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Lightning.png", "category": "微信" }, { "text": "[炸弹]", "zh": "[炸彈]", "data": "[Bomb]", "codex": "/:bome", "web_codex": "/炸弹", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Bomb.png", "category": "微信" }, { "text": "[刀]", "zh": "[刀]", "data": "[Dagger]", "codex": "/:kn", "web_codex": "/刀", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Dagger.png", "category": "微信" }, { "text": "[足球]", "zh": "[足球]", "data": "[Soccer]", "codex": "/:footb", "web_codex": "/足球", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Soccer.png", "category": "微信" }, { "text": "[瓢虫]", "zh": "[甲蟲]", "data": "[Ladybug]", "codex": "/:ladybug", "web_codex": "/瓢虫", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Ladybug.png", "category": "微信" }, { "text": "[便便]", "zh": "[便便]", "data": "[Poop]", "codex": "/:shit", "web_codex": "/便便", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Poop.png", "category": "微信" }, { "text": "[月亮]", "zh": "[月亮]", "data": "[Moon]", "codex": "/:moon", "web_codex": "/月亮", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Moon.png", "category": "微信" }, { "text": "[太阳]", "zh": "[太陽]", "data": "[Sun]", "codex": "/:sun", "web_codex": "/太阳", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Sun.png", "category": "微信" }, { "text": "[礼物]", "zh": "[禮物]", "data": "[Gift]", "codex": "/:gift", "web_codex": "/礼物", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Gift.png", "category": "微信" }, { "text": "[拥抱]", "zh": "[擁抱]", "data": "[Hug]", "codex": "/:hug", "web_codex": "/拥抱", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Hug.png", "category": "微信" }, { "text": "[强]", "zh": "[強]", "data": "[ThumbsUp]", "codex": "/:strong", "web_codex": "/强", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/ThumbsUp.png", "category": "微信" }, { "text": "[弱]", "zh": "[弱]", "data": "[ThumbsDown]", "codex": "/:weak", "web_codex": "/弱", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/ThumbsDown.png", "category": "微信" }, { "text": "[握手]", "zh": "[握手]", "data": "[Shake]", "codex": "/:share", "web_codex": "/握手", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Shake.png", "category": "微信" }, { "text": "[胜利]", "zh": "[勝利]", "data": "[Peace]", "codex": "/:v", "web_codex": "/胜利", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Peace.png", "category": "微信" }, { "text": "[抱拳]", "zh": "[抱拳]", "data": "[Fight]", "codex": "/:@)", "web_codex": "/抱拳", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Fight.png", "category": "微信" }, { "text": "[勾引]", "zh": "[勾引]", "data": "[Beckon]", "codex": "/:jj", "web_codex": "/勾引", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Beckon.png", "category": "微信" }, { "text": "[拳头]", "zh": "[拳頭]", "data": "[Fist]", "codex": "/:@@", "web_codex": "/拳头", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Fist.png", "category": "微信" }, { "text": "[差劲]", "zh": "[差勁]", "data": "[Pinky]", "codex": "/:bad", "web_codex": "/差劲", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Pinky.png", "category": "微信" }, { "text": "[爱你]", "zh": "[愛你]", "data": "[RockOn]", "codex": "/:lvu", "web_codex": "/爱你", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/RockOn.png", "category": "微信" }, { "text": "[NO]", "zh": "[NO]", "data": "[Nuh-uh]", "codex": "/:no", "web_codex": "/NO", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Nuh-uh.png", "category": "微信" }, { "text": "[OK]", "zh": "[OK]", "data": "[OK]", "codex": "/:ok", "web_codex": "/OK", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/OK.png", "category": "微信" }, { "text": "[爱情]", "zh": "[愛情]", "data": "[InLove]", "codex": "/:love", "web_codex": "/爱情", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/InLove.png", "category": "微信" }, { "text": "[飞吻]", "zh": "[飛吻]", "data": "[Blowkiss]", "codex": "/:<L>", "web_codex": "/飞吻", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Blowkiss.png", "category": "微信" }, { "text": "[跳跳]", "zh": "[跳跳]", "data": "[Waddle]", "codex": "/:jump", "web_codex": "/跳跳", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Waddle.png", "category": "微信" }, { "text": "[发抖]", "zh": "[發抖]", "data": "[Tremble]", "codex": "/:shake", "web_codex": "/发抖", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Tremble.png", "category": "微信" }, { "text": "[怄火]", "zh": "[噴火]", "data": "[Aaagh!]", "codex": "/:<O>", "web_codex": "/怄火", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Aaagh!.png", "category": "微信" }, { "text": "[转圈]", "zh": "[轉圈]", "data": "[Twirl]", "codex": "/:circle", "web_codex": "/转圈", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Twirl.png", "category": "微信" }, { "text": "[磕头]", "zh": "[磕頭]", "data": "[Kotow]", "codex": "/:kotow", "web_codex": "/磕头", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Kotow.png", "category": "微信" }, { "text": "[回头]", "zh": "[回頭]", "data": "[Dramatic]", "codex": "/:turn", "web_codex": "/回头", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Dramatic.png", "category": "微信" }, { "text": "[跳绳]", "zh": "[跳繩]", "data": "[JumpRope]", "codex": "/:skip", "web_codex": "/跳绳", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/JumpRope.png", "category": "微信" }, { "text": "[投降]", "zh": "[投降]", "data": "[Surrender]", "codex": "/:oY", "web_codex": "/挥手", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Surrender.png", "category": "微信" }, { "text": "[激动]", "zh": "[激動]", "data": "[Hooray]", "codex": "/:#-0", "web_codex": "/激动", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Hooray.png", "category": "微信" }, { "text": "[乱舞]", "zh": "[亂舞]", "data": "[Meditate]", "codex": "/:hiphot", "web_codex": "/街舞", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Meditate.png", "category": "微信" }, { "text": "[献吻]", "zh": "[獻吻]", "data": "[Smooch]", "codex": "/:kiss", "web_codex": "/献吻", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Smooch.png", "category": "微信" }, { "text": "[左太极]", "zh": "[左太極]", "data": "[TaiChi L]", "codex": "/:<&", "web_codex": "/左太极", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/TaiChi L.png", "category": "微信" }, { "text": "[右太极]", "zh": "[右太極]", "data": "[TaiChi R]", "codex": "/:&\"", "web_codex": "/右太极", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/TaiChi R.png", "category": "微信" }, { "text": "[奸笑]", "zh": "[奸笑]", "data": "[Smirk]", "codex": "[Smirk]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Smirk.png", "category": "微信" }, { "text": "[嘿哈]", "zh": "[吼嘿]", "data": "[Hey]", "codex": "[Hey]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Hey.png", "category": "微信" }, { "text": "[捂脸]", "zh": "[掩面]", "data": "[Facepalm]", "codex": "[Facepalm]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Facepalm.png", "category": "微信" }, { "text": "[机智]", "zh": "[機智]", "data": "[Smart]", "codex": "[Smart]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Smart.png", "category": "微信" }, { "text": "[茶]", "zh": "[茶]", "data": "[Tea]", "codex": "[Tea]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Tea.png", "category": "微信" }, { "text": "[红包]", "zh": "[Packet]", "data": "[Packet]", "codex": "[Packet]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Packet.png", "category": "微信" }, { "text": "[蜡烛]", "zh": "[蠟燭]", "data": "[Candle]", "codex": "[Candle]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Candle.png", "category": "微信" }, { "text": "[耶]", "zh": "[歐耶]", "data": "[Yeah!]", "codex": "[Yeah!]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Yeah!.png", "category": "微信" }, { "text": "[皱眉]", "zh": "[皺眉]", "data": "[Concerned]", "codex": "[Concerned]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Concerned.png", "category": "微信" }, { "text": "[抱拳]", "zh": "[抱拳]", "data": "[Salute]", "codex": "[Salute]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Salute.png", "category": "微信" }, { "text": "[鸡]", "zh": "[小雞]", "data": "[Chick]", "codex": "[Chick]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Chick.png", "category": "微信" }, { "text": "[福]", "zh": "[福]", "data": "[Blessing]", "codex": "[Blessing]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Blessing.png", "category": "微信" }, { "text": "[再见]", "zh": "[再見]", "data": "[Bye]", "codex": "[Bye]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Bye.png", "category": "微信" }, { "text": "[發]", "zh": "[發]", "data": "[Rich]", "codex": "[Rich]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Rich.png", "category": "微信" }, { "text": "[小狗]", "zh": "[小狗]", "data": "[Pup]", "codex": "[Pup]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Pup.png", "category": "微信" }, { "text": "[吃瓜]", "zh": "[吃西瓜]", "data": "[Onlooker]", "codex": "[Onlooker]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Onlooker.png", "category": "微信" }, { "text": "[加油]", "zh": "[加油]", "data": "[GoForIt]", "codex": "[GoForIt]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/GoForIt.png", "category": "微信" }, { "text": "[汗]", "zh": "[汗]", "data": "[Sweats]", "codex": "[Sweats]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Sweats.png", "category": "微信" }, { "text": "[天啊]", "zh": "[天啊]", "data": "[OMG]", "codex": "[OMG]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/OMG.png", "category": "微信" }, { "text": "[Emm]", "zh": "[一言難盡]", "data": "[Emm]", "codex": "[Emm]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Emm.png", "category": "微信" }, { "text": "[社会社会]", "zh": "[失敬失敬]", "data": "[Respect]", "codex": "[Respect]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Respect.png", "category": "微信" }, { "text": "[旺柴]", "zh": "[旺柴]", "data": "[Doge]", "codex": "[Doge]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Doge.png", "category": "微信" }, { "text": "[好的]", "zh": "[好的]", "data": "[NoProb]", "codex": "[NoProb]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/NoProb.png", "category": "微信" }, { "text": "[打脸]", "zh": "[打臉]", "data": "[MyBad]", "codex": "[MyBad]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/MyBad.png", "category": "微信" }, { "text": "[哇]", "zh": "[哇]", "data": "[Wow]", "codex": "[Wow]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Wow.png", "category": "微信" }, { "text": "[加油加油]", "zh": "[加油!]", "data": "[KeepFighting]", "codex": "[KeepFighting]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/KeepFighting.png", "category": "微信" }, { "text": "[翻白眼]", "zh": "[翻白眼]", "data": "[Boring]", "codex": "[Boring]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Boring.png", "category": "微信" }, { "text": "[666]", "zh": "[666]", "data": "[Awesome]", "codex": "[666]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Awesome.png", "category": "微信" }, { "text": "[让我看看]", "zh": "[讓我看看]", "data": "[LetMeSee]", "codex": "[LetMeSee]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/LetMeSee.png", "category": "微信" }, { "text": "[叹气]", "zh": "[嘆息]", "data": "[Sigh]", "codex": "[Sigh]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Sigh.png", "category": "微信" }, { "text": "[苦涩]", "zh": "[難受]", "data": "[Hurt]", "codex": "[Hurt]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Hurt.png", "category": "微信" }, { "text": "[裂开]", "zh": "[崩潰]", "data": "[Broken]", "codex": "[Broken]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Broken.png", "category": "微信" }, { "text": "[脸红]", "zh": "[臉紅]", "data": "[Flushed]", "codex": "[Flushed]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Flushed.png", "category": "微信" }, { "text": "[笑脸]", "zh": "[笑臉]", "data": "[Happy]", "codex": "[Happy]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Happy.png", "category": "微信" }, { "text": "[破涕为笑]", "zh": "[破涕為笑]", "data": "[Lol]", "codex": "[Lol]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Lol.png", "category": "微信" }, { "text": "[烟花]", "zh": "[煙花]", "data": "[Fireworks]", "codex": "[Fireworks]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Fireworks.png", "category": "微信" }, { "text": "[爆竹]", "zh": "[爆竹]", "data": "[爆竹]", "codex": "[爆竹]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Firecracker.png", "category": "微信" }, { "text": "[庆祝]", "zh": "[慶祝]", "data": "[Party]", "codex": "[Party]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Party.png", "category": "微信" }, { "text": "[恐惧]", "zh": "[恐懼]", "data": "[Terror]", "codex": "[Terror]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Terror.png", "category": "微信" }, { "text": "[无语]", "zh": "[無語]", "data": "[Duh]", "codex": "[Duh]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Duh.png", "category": "微信" }, { "text": "[失望]", "zh": "[失望]", "data": "[Let Down]", "codex": "[LetDown]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Let Down.png", "category": "微信" }, { "text": "[生病]", "zh": "[生病]", "data": "[Sick]", "codex": "[Sick]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Sick.png", "category": "微信" }, { "text": "[合十]", "zh": "[合十]", "data": "[Worship]", "codex": "[Worship]", "icon": "https://staticfile.typecho.co.uk/emoji/wechat/Worship.png", "category": "微信" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/ablobcatheart.png", "data": ":[ablobcatheart]", "text": "ablobcatheart", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/ablobcatheartbroken.png", "data": ":[ablobcatheartbroken]", "text": "ablobcatheartbroken", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatheart.png", "data": ":[blobcatheart]", "text": "blobcatheart", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatheartpride.png", "data": ":[blobcatheartpride]", "text": "blobcatheartpride", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatlove.png", "data": ":[blobcatlove]", "text": "blobcatlove", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatkissheart.png", "data": ":[blobcatkissheart]", "text": "blobcatkissheart", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatsnuggle.png", "data": ":[blobcatsnuggle]", "text": "blobcatsnuggle", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/comfyuee.png", "data": ":[comfyuee]", "text": "comfyuee", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/comfyslep.png", "data": ":[comfyslep]", "text": "comfyslep", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/comfynight.png", "data": ":[comfynight]", "text": "comfynight", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatcomfysweat.png", "data": ":[blobcatcomfysweat]", "text": "blobcatcomfysweat", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatcomfy.png", "data": ":[blobcatcomfy]", "text": "blobcatcomfy", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatcomftears.png", "data": ":[blobcatcomftears]", "text": "blobcatcomftears", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatfacepalm.png", "data": ":[blobcatfacepalm]", "text": "blobcatfacepalm", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcat0_0.png", "data": ":[blobcat0_0]", "text": "blobcat0_0", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatangry.png", "data": ":[blobcatangry]", "text": "blobcatangry", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobbanhammerr.png", "data": ":[blobbanhammerr]", "text": "blobbanhammerr", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatt.png", "data": ":[blobcatt]", "text": "blobcatt", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatblush.png", "data": ":[blobcatblush]", "text": "blobcatblush", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatcoffee.png", "data": ":[blobcatcoffee]", "text": "blobcatcoffee", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatcry.png", "data": ":[blobcatcry]", "text": "blobcatcry", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatdead.png", "data": ":[blobcatdead]", "text": "blobcatdead", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatdied.png", "data": ":[blobcatdied]", "text": "blobcatdied", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatdisturbed.png", "data": ":[blobcatdisturbed]", "text": "blobcatdisturbed", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatfearful.png", "data": ":[blobcatfearful]", "text": "blobcatfearful", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatfingerguns.png", "data": ":[blobcatfingerguns]", "text": "blobcatfingerguns", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatflip.png", "data": ":[blobcatflip]", "text": "blobcatflip", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatflower.png", "data": ":[blobcatflower]", "text": "blobcatflower", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatgay.png", "data": ":[blobcatgay]", "text": "blobcatgay", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatgooglycry.png", "data": ":[blobcatgooglycry]", "text": "blobcatgooglycry", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatneutral.png", "data": ":[blobcatneutral]", "text": "blobcatneutral", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatopenmouth.png", "data": ":[blobcatopenmouth]", "text": "blobcatopenmouth", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatsadreach.png", "data": ":[blobcatsadreach]", "text": "blobcatsadreach", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatscared.png", "data": ":[blobcatscared]", "text": "blobcatscared", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatnomblobcat.png", "data": ":[blobcatnomblobcat]", "text": "blobcatnomblobcat", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatpresentred.png", "data": ":[blobcatpresentred]", "text": "blobcatpresentred", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatread.png", "data": ":[blobcatread]", "text": "blobcatread", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatsipsweat.png", "data": ":[blobcatsipsweat]", "text": "blobcatsipsweat", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatsnapped.png", "data": ":[blobcatsnapped]", "text": "blobcatsnapped", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatthink.png", "data": ":[blobcatthink]", "text": "blobcatthink", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcattriumph.png", "data": ":[blobcattriumph]", "text": "blobcattriumph", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatumm.png", "data": ":[blobcatumm]", "text": "blobcatumm", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatverified.png", "data": ":[blobcatverified]", "text": "blobcatverified", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatbox.png", "data": ":[blobcatbox]", "text": "blobcatbox", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatcaged.png", "data": ":[blobcatcaged]", "text": "blobcatcaged", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatgooglytrash.png", "data": ":[blobcatgooglytrash]", "text": "blobcatgooglytrash", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatheadphones.png", "data": ":[blobcatheadphones]", "text": "blobcatheadphones", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcathighfive.png", "data": ":[blobcathighfive]", "text": "blobcathighfive", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatmelt.png", "data": ":[blobcatmelt]", "text": "blobcatmelt", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatmeltthumb.png", "data": ":[blobcatmeltthumb]", "text": "blobcatmeltthumb", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatnotlikethis.png", "data": ":[blobcatnotlikethis]", "text": "blobcatnotlikethis", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatsaitama.png", "data": ":[blobcatsaitama]", "text": "blobcatsaitama", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatyandere.png", "data": ":[blobcatyandere]", "text": "blobcatyandere", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatpeek2.png", "data": ":[blobcatpeek2]", "text": "blobcatpeek2", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatpeekaboo.png", "data": ":[blobcatpeekaboo]", "text": "blobcatpeekaboo", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatphoto.png", "data": ":[blobcatphoto]", "text": "blobcatphoto", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/ablobcatattentionreverse.png", "data": ":[ablobcatattentionreverse]", "text": "ablobcatattentionreverse", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/ablobcatreachrev.png", "data": ":[ablobcatreachrev]", "text": "ablobcatreachrev", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/ablobcatwave.png", "data": ":[ablobcatwave]", "text": "ablobcatwave", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatalt.png", "data": ":[blobcatalt]", "text": "blobcatalt", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatpolice.png", "data": ":[blobcatpolice]", "text": "blobcatpolice", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/blobcatshocked.png", "data": ":[blobcatshocked]", "text": "blobcatshocked", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/cat/ablobcatrainbow.png", "data": ":[ablobcatrainbow]", "text": "ablobcatrainbow", "category": "Cat" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/3d眼镜.png", "data": ":[3d眼镜]", "text": "3d眼镜", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/EDG.png", "data": ":[EDG]", "text": "EDG", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/LPL.png", "data": ":[LPL]", "text": "LPL", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/beluga.png", "data": ":[beluga]", "text": "beluga", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/不好意思.png", "data": ":[不好意思]", "text": "不好意思", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/不服吗.png", "data": ":[不服吗]", "text": "不服吗", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/亲亲.png", "data": ":[亲亲]", "text": "亲亲", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/伞兵.png", "data": ":[伞兵]", "text": "伞兵", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/倚墙笑.png", "data": ":[倚墙笑]", "text": "倚墙笑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/值得肯定.png", "data": ":[值得肯定]", "text": "值得肯定", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/偷偷看.png", "data": ":[偷偷看]", "text": "偷偷看", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/傻笑.png", "data": ":[傻笑]", "text": "傻笑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/再见.png", "data": ":[再见]", "text": "再见", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/出家人.png", "data": ":[出家人]", "text": "出家人", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/击剑.png", "data": ":[击剑]", "text": "击剑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/加班.png", "data": ":[加班]", "text": "加班", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/勉强笑.png", "data": ":[勉强笑]", "text": "勉强笑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/危险.png", "data": ":[危险]", "text": "危险", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/发红包.png", "data": ":[发红包]", "text": "发红包", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/吃手.png", "data": ":[吃手]", "text": "吃手", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/吃瓜.png", "data": ":[吃瓜]", "text": "吃瓜", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/吐血.png", "data": ":[吐血]", "text": "吐血", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/吵架.png", "data": ":[吵架]", "text": "吵架", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/呦吼.png", "data": ":[呦吼]", "text": "呦吼", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/呲牙笑.png", "data": ":[呲牙笑]", "text": "呲牙笑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/哈士奇.png", "data": ":[哈士奇]", "text": "哈士奇", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/哈士奇失去意识.png", "data": ":[哈士奇失去意识]", "text": "哈士奇失去意识", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/哈士奇失望.png", "data": ":[哈士奇失望]", "text": "哈士奇失望", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/哭泣.png", "data": ":[哭泣]", "text": "哭泣", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/唱歌.png", "data": ":[唱歌]", "text": "唱歌", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/喜欢.png", "data": ":[喜欢]", "text": "喜欢", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/嘿哈.png", "data": ":[嘿哈]", "text": "嘿哈", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/大笑.png", "data": ":[大笑]", "text": "大笑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/失去信号.png", "data": ":[失去信号]", "text": "失去信号", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/失望.png", "data": ":[失望]", "text": "失望", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/头秃.png", "data": ":[头秃]", "text": "头秃", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/奋斗.png", "data": ":[奋斗]", "text": "奋斗", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/好奇.png", "data": ":[好奇]", "text": "好奇", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/好的.png", "data": ":[好的]", "text": "好的", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/害羞.png", "data": ":[害羞]", "text": "害羞", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/小丑.png", "data": ":[小丑]", "text": "小丑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/小偷.png", "data": ":[小偷]", "text": "小偷", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/尬笑.png", "data": ":[尬笑]", "text": "尬笑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/尴尬.png", "data": ":[尴尬]", "text": "尴尬", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/应援.png", "data": ":[应援]", "text": "应援", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/开心.png", "data": ":[开心]", "text": "开心", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/引起不适.png", "data": ":[引起不适]", "text": "引起不适", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/微笑.png", "data": ":[微笑]", "text": "微笑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/思考.png", "data": ":[思考]", "text": "思考", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/恶心.png", "data": ":[恶心]", "text": "恶心", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/恶魔.png", "data": ":[恶魔]", "text": "恶魔", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/恶魔恐惧.png", "data": ":[恶魔恐惧]", "text": "恶魔恐惧", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/惊吓.png", "data": ":[惊吓]", "text": "惊吓", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/惊吓白眼.png", "data": ":[惊吓白眼]", "text": "惊吓白眼", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/惊讶.png", "data": ":[惊讶]", "text": "惊讶", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/惬意.png", "data": ":[惬意]", "text": "惬意", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/感动.png", "data": ":[感动]", "text": "感动", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/愤怒.png", "data": ":[愤怒]", "text": "愤怒", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/我看好你.png", "data": ":[我看好你]", "text": "我看好你", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/手机相机.png", "data": ":[手机相机]", "text": "手机相机", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/打咩.png", "data": ":[打咩]", "text": "打咩", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/打牌.png", "data": ":[打牌]", "text": "打牌", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/托腮.png", "data": ":[托腮]", "text": "托腮", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/扶额.png", "data": ":[扶额]", "text": "扶额", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/抠鼻.png", "data": ":[抠鼻]", "text": "抠鼻", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/抬眼镜.png", "data": ":[抬眼镜]", "text": "抬眼镜", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/拜托.png", "data": ":[拜托]", "text": "拜托", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/捂嘴笑.png", "data": ":[捂嘴笑]", "text": "捂嘴笑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/捂脸.png", "data": ":[捂脸]", "text": "捂脸", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/擦汗.png", "data": ":[擦汗]", "text": "擦汗", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/放鞭炮.png", "data": ":[放鞭炮]", "text": "放鞭炮", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/敬礼.png", "data": ":[敬礼]", "text": "敬礼", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/整理发型.png", "data": ":[整理发型]", "text": "整理发型", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/斗鸡眼.png", "data": ":[斗鸡眼]", "text": "斗鸡眼", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/智慧的眼神.png", "data": ":[智慧的眼神]", "text": "智慧的眼神", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/月饼.png", "data": ":[月饼]", "text": "月饼", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/有没有搞错.png", "data": ":[有没有搞错]", "text": "有没有搞错", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/正确.png", "data": ":[正确]", "text": "正确", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/没招.png", "data": ":[没招]", "text": "没招", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/波吉.png", "data": ":[波吉]", "text": "波吉", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/泪奔.png", "data": ":[泪奔]", "text": "泪奔", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/流汗微笑.png", "data": ":[流汗微笑]", "text": "流汗微笑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/流鼻涕.png", "data": ":[流鼻涕]", "text": "流鼻涕", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/深思.png", "data": ":[深思]", "text": "深思", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/滑稽.png", "data": ":[滑稽]", "text": "滑稽", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/滑稽吃瓜.png", "data": ":[滑稽吃瓜]", "text": "滑稽吃瓜", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/滑稽喝水.png", "data": ":[滑稽喝水]", "text": "滑稽喝水", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/滑稽奶茶.png", "data": ":[滑稽奶茶]", "text": "滑稽奶茶", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/滑稽柠檬.png", "data": ":[滑稽柠檬]", "text": "滑稽柠檬", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/滑稽狂汗.png", "data": ":[滑稽狂汗]", "text": "滑稽狂汗", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/滑稽被子.png", "data": ":[滑稽被子]", "text": "滑稽被子", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/烦恼.png", "data": ":[烦恼]", "text": "烦恼", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/熊熊.png", "data": ":[熊熊]", "text": "熊熊", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/熊猫.png", "data": ":[熊猫]", "text": "熊猫", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/熊猫唱歌.png", "data": ":[熊猫唱歌]", "text": "熊猫唱歌", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/熊猫喜欢.png", "data": ":[熊猫喜欢]", "text": "熊猫喜欢", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/熊猫失望.png", "data": ":[熊猫失望]", "text": "熊猫失望", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/熊猫意外.png", "data": ":[熊猫意外]", "text": "熊猫意外", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/熬夜.png", "data": ":[熬夜]", "text": "熬夜", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/爆炸.png", "data": ":[爆炸]", "text": "爆炸", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/牛年进宝.png", "data": ":[牛年进宝]", "text": "牛年进宝", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/狂热.png", "data": ":[狂热]", "text": "狂热", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/狗头.png", "data": ":[狗头]", "text": "狗头", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/狗头围脖.png", "data": ":[狗头围脖]", "text": "狗头围脖", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/狗头失望.png", "data": ":[狗头失望]", "text": "狗头失望", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/狗头意外.png", "data": ":[狗头意外]", "text": "狗头意外", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/狗头胖次.png", "data": ":[狗头胖次]", "text": "狗头胖次", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/狗头花.png", "data": ":[狗头花]", "text": "狗头花", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/狗头草.png", "data": ":[狗头草]", "text": "狗头草", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/猪头.png", "data": ":[猪头]", "text": "猪头", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/猪头意外.png", "data": ":[猪头意外]", "text": "猪头意外", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/生病.png", "data": ":[生病]", "text": "生病", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/电话.png", "data": ":[电话]", "text": "电话", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/疑问.png", "data": ":[疑问]", "text": "疑问", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/疼痛.png", "data": ":[疼痛]", "text": "疼痛", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/痛哭.png", "data": ":[痛哭]", "text": "痛哭", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/看穿一切.png", "data": ":[看穿一切]", "text": "看穿一切", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/眩晕.png", "data": ":[眩晕]", "text": "眩晕", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/睡觉.png", "data": ":[睡觉]", "text": "睡觉", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/禁言.png", "data": ":[禁言]", "text": "禁言", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/笑哭.png", "data": ":[笑哭]", "text": "笑哭", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/纠结.png", "data": ":[纠结]", "text": "纠结", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/绿帽.png", "data": ":[绿帽]", "text": "绿帽", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/缺牙笑.png", "data": ":[缺牙笑]", "text": "缺牙笑", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/翻白眼.png", "data": ":[翻白眼]", "text": "翻白眼", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/老虎意外.png", "data": ":[老虎意外]", "text": "老虎意外", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/耍酷.png", "data": ":[耍酷]", "text": "耍酷", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/胡子.png", "data": ":[胡子]", "text": "胡子", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/菜狗.png", "data": ":[菜狗]", "text": "菜狗", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/菜狗花.png", "data": ":[菜狗花]", "text": "菜狗花", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/蒙面滑稽.png", "data": ":[蒙面滑稽]", "text": "蒙面滑稽", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/虎年进宝.png", "data": ":[虎年进宝]", "text": "虎年进宝", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/被打.png", "data": ":[被打]", "text": "被打", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/裂开.png", "data": ":[裂开]", "text": "裂开", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/警告.png", "data": ":[警告]", "text": "警告", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/读书.png", "data": ":[读书]", "text": "读书", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/财神红包.png", "data": ":[财神红包]", "text": "财神红包", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/超爱.png", "data": ":[超爱]", "text": "超爱", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/这是啥.png", "data": ":[这是啥]", "text": "这是啥", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/送福.png", "data": ":[送福]", "text": "送福", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/送花.png", "data": ":[送花]", "text": "送花", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/错误.png", "data": ":[错误]", "text": "错误", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/阴险.png", "data": ":[阴险]", "text": "阴险", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/难以置信.png", "data": ":[难以置信]", "text": "难以置信", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/面具.png", "data": ":[面具]", "text": "面具", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/饥渴.png", "data": ":[饥渴]", "text": "饥渴", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/鬼脸.png", "data": ":[鬼脸]", "text": "鬼脸", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/黑线.png", "data": ":[黑线]", "text": "黑线", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/heo/鼓掌.png", "data": ":[鼓掌]", "text": "鼓掌", "category": "Heo" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/微笑.gif", "data": ":^(微笑)", "text": "微笑", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/撇嘴.gif", "data": ":^(撇嘴)", "text": "撇嘴", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/色.gif", "data": ":^(色)", "text": "色", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/发呆.gif", "data": ":^(发呆)", "text": "发呆", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/得意.gif", "data": ":^(得意)", "text": "得意", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/流泪.gif", "data": ":^(流泪)", "text": "流泪", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/害羞.gif", "data": ":^(害羞)", "text": "害羞", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/闭嘴.gif", "data": ":^(闭嘴)", "text": "闭嘴", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/睡.gif", "data": ":^(睡)", "text": "睡", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/大哭.gif", "data": ":^(大哭)", "text": "大哭", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/尴尬.gif", "data": ":^(尴尬)", "text": "尴尬", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/呲牙.gif", "data": ":^(呲牙)", "text": "呲牙", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/发怒.gif", "data": ":^(发怒)", "text": "发怒", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/调皮.gif", "data": ":^(调皮)", "text": "调皮", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/惊讶.gif", "data": ":^(惊讶)", "text": "惊讶", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/难过.gif", "data": ":^(难过)", "text": "难过", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/酷.gif", "data": ":^(酷)", "text": "酷", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/冷汗.gif", "data": ":^(冷汗)", "text": "冷汗", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/抓狂.gif", "data": ":^(抓狂)", "text": "抓狂", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/吐.gif", "data": ":^(吐)", "text": "吐", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/偷笑.gif", "data": ":^(偷笑)", "text": "偷笑", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/可爱.gif", "data": ":^(可爱)", "text": "可爱", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/白眼.gif", "data": ":^(白眼)", "text": "白眼", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/傲慢.gif", "data": ":^(傲慢)", "text": "傲慢", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/饥饿.gif", "data": ":^(饥饿)", "text": "饥饿", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/困.gif", "data": ":^(困)", "text": "困", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/惊恐.gif", "data": ":^(惊恐)", "text": "惊恐", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/流汗.gif", "data": ":^(流汗)", "text": "流汗", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/憨笑.gif", "data": ":^(憨笑)", "text": "憨笑", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/大兵.gif", "data": ":^(大兵)", "text": "大兵", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/奋斗.gif", "data": ":^(奋斗)", "text": "奋斗", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/咒骂.gif", "data": ":^(咒骂)", "text": "咒骂", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/疑问.gif", "data": ":^(疑问)", "text": "疑问", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/嘘.gif", "data": ":^(嘘)", "text": "嘘", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/晕.gif", "data": ":^(晕)", "text": "晕", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/折磨.gif", "data": ":^(折磨)", "text": "折磨", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/衰.gif", "data": ":^(衰)", "text": "衰", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/骷髅.gif", "data": ":^(骷髅)", "text": "骷髅", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/敲打.gif", "data": ":^(敲打)", "text": "敲打", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/再见.gif", "data": ":^(再见)", "text": "再见", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/擦汗.gif", "data": ":^(擦汗)", "text": "擦汗", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/抠鼻.gif", "data": ":^(抠鼻)", "text": "抠鼻", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/鼓掌.gif", "data": ":^(鼓掌)", "text": "鼓掌", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/嗅大了.gif", "data": ":^(嗅大了)", "text": "嗅大了", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/坏笑.gif", "data": ":^(坏笑)", "text": "坏笑", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/左哼哼.gif", "data": ":^(左哼哼)", "text": "左哼哼", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/右哼哼.gif", "data": ":^(右哼哼)", "text": "右哼哼", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/哈欠.gif", "data": ":^(哈欠)", "text": "哈欠", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/鄙视.gif", "data": ":^(鄙视)", "text": "鄙视", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/委屈.gif", "data": ":^(委屈)", "text": "委屈", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/可怜.gif", "data": ":^(可怜)", "text": "可怜", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/阴险.gif", "data": ":^(阴险)", "text": "阴险", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/亲亲.gif", "data": ":^(亲亲)", "text": "亲亲", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/吓.gif", "data": ":^(吓)", "text": "吓", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/快哭了.gif", "data": ":^(快哭了)", "text": "快哭了", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/菜刀.gif", "data": ":^(菜刀)", "text": "菜刀", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/西瓜.gif", "data": ":^(西瓜)", "text": "西瓜", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/啤酒.gif", "data": ":^(啤酒)", "text": "啤酒", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/篮球.gif", "data": ":^(篮球)", "text": "篮球", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/乒乓.gif", "data": ":^(乒乓)", "text": "乒乓", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/咖啡.gif", "data": ":^(咖啡)", "text": "咖啡", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/饭.gif", "data": ":^(饭)", "text": "饭", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/猪头.gif", "data": ":^(猪头)", "text": "猪头", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/玫瑰.gif", "data": ":^(玫瑰)", "text": "玫瑰", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/凋谢.gif", "data": ":^(凋谢)", "text": "凋谢", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/心.gif", "data": ":^(心)", "text": "心", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/心碎.gif", "data": ":^(心碎)", "text": "心碎", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/蛋糕.gif", "data": ":^(蛋糕)", "text": "蛋糕", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/炸弹.gif", "data": ":^(炸弹)", "text": "炸弹", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/刀.gif", "data": ":^(刀)", "text": "刀", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/足球.gif", "data": ":^(足球)", "text": "足球", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/瓢虫.gif", "data": ":^(瓢虫)", "text": "瓢虫", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/便便.gif", "data": ":^(便便)", "text": "便便", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/夜晚.gif", "data": ":^(夜晚)", "text": "夜晚", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/太阳.gif", "data": ":^(太阳)", "text": "太阳", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/礼物.gif", "data": ":^(礼物)", "text": "礼物", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/拥抱.gif", "data": ":^(拥抱)", "text": "拥抱", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/强.gif", "data": ":^(强)", "text": "强", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/弱.gif", "data": ":^(弱)", "text": "弱", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/握手.gif", "data": ":^(握手)", "text": "握手", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/胜利.gif", "data": ":^(胜利)", "text": "胜利", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/抱拳.gif", "data": ":^(抱拳)", "text": "抱拳", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/勾引.gif", "data": ":^(勾引)", "text": "勾引", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/拳头.gif", "data": ":^(拳头)", "text": "拳头", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/差劲.gif", "data": ":^(差劲)", "text": "差劲", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/爱你.gif", "data": ":^(爱你)", "text": "爱你", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/NO.gif", "data": ":^(NO)", "text": "NO", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/OK.gif", "data": ":^(OK)", "text": "OK", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/爱情.gif", "data": ":^(爱情)", "text": "爱情", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/飞吻.gif", "data": ":^(飞吻)", "text": "飞吻", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/发财.gif", "data": ":^(发财)", "text": "发财", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/帅.gif", "data": ":^(帅)", "text": "帅", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/雨伞.gif", "data": ":^(雨伞)", "text": "雨伞", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/高铁左车头.gif", "data": ":^(高铁左车头)", "text": "高铁左车头", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/车厢.gif", "data": ":^(车厢)", "text": "车厢", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/高铁右车头.gif", "data": ":^(高铁右车头)", "text": "高铁右车头", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/纸巾.gif", "data": ":^(纸巾)", "text": "纸巾", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/右太极.gif", "data": ":^(右太极)", "text": "右太极", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/左太极.gif", "data": ":^(左太极)", "text": "左太极", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/献吻.gif", "data": ":^(献吻)", "text": "献吻", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/街舞.gif", "data": ":^(街舞)", "text": "街舞", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/激动.gif", "data": ":^(激动)", "text": "激动", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/挥动.gif", "data": ":^(挥动)", "text": "挥动", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/跳绳.gif", "data": ":^(跳绳)", "text": "跳绳", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/回头.gif", "data": ":^(回头)", "text": "回头", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/磕头.gif", "data": ":^(磕头)", "text": "磕头", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/转圈.gif", "data": ":^(转圈)", "text": "转圈", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/怄火.gif", "data": ":^(怄火)", "text": "怄火", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/发抖.gif", "data": ":^(发抖)", "text": "发抖", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/跳跳.gif", "data": ":^(跳跳)", "text": "跳跳", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/爆筋.gif", "data": ":^(爆筋)", "text": "爆筋", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/沙发.gif", "data": ":^(沙发)", "text": "沙发", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/钱.gif", "data": ":^(钱)", "text": "钱", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/蜡烛.gif", "data": ":^(蜡烛)", "text": "蜡烛", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/枪.gif", "data": ":^(枪)", "text": "枪", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/灯.gif", "data": ":^(灯)", "text": "灯", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/香蕉.gif", "data": ":^(香蕉)", "text": "香蕉", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/吻.gif", "data": ":^(吻)", "text": "吻", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/下雨.gif", "data": ":^(下雨)", "text": "下雨", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/闹钟.gif", "data": ":^(闹钟)", "text": "闹钟", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/囍.gif", "data": ":^(囍)", "text": "囍", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/棒棒糖.gif", "data": ":^(棒棒糖)", "text": "棒棒糖", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/面条.gif", "data": ":^(面条)", "text": "面条", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/车.gif", "data": ":^(车)", "text": "车", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/邮件.gif", "data": ":^(邮件)", "text": "邮件", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/风车.gif", "data": ":^(风车)", "text": "风车", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/药丸.gif", "data": ":^(药丸)", "text": "药丸", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/奶瓶.gif", "data": ":^(奶瓶)", "text": "奶瓶", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/灯笼.gif", "data": ":^(灯笼)", "text": "灯笼", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/青蛙.gif", "data": ":^(青蛙)", "text": "青蛙", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/戒指.gif", "data": ":^(戒指)", "text": "戒指", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/K歌.gif", "data": ":^(K歌)", "text": "K歌", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/熊猫.gif", "data": ":^(熊猫)", "text": "熊猫", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/喝彩.gif", "data": ":^(喝彩)", "text": "喝彩", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/购物.gif", "data": ":^(购物)", "text": "购物", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/多云.gif", "data": ":^(多云)", "text": "多云", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/鞭炮.gif", "data": ":^(鞭炮)", "text": "鞭炮", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/飞机.gif", "data": ":^(飞机)", "text": "飞机", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/qq/气球.gif", "data": ":^(气球)", "text": "气球", "category": "QQ" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/doge.png", "data": ":)(doge)", "text": "doge", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/miao.png", "data": ":)(miao)", "text": "miao", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog1.png", "data": ":)(dog1)", "text": "dog1", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/erha.png", "data": ":)(erha)", "text": "erha", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog2.png", "data": ":)(doge2)", "text": "doge2", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog3.png", "data": ":)(doge3)", "text": "doge3", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog4.png", "data": ":)(doge4)", "text": "doge4", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog5.png", "data": ":)(doge5)", "text": "doge5", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog6.png", "data": ":)(doge6)", "text": "doge6", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog7.png", "data": ":)(doge7)", "text": "doge7", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog8.png", "data": ":)(doge8)", "text": "doge8", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog9.png", "data": ":)(doge9)", "text": "doge9", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog10.png", "data": ":)(doge10)", "text": "doge10", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog11.png", "data": ":)(doge11)", "text": "doge11", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog12.png", "data": ":)(doge12)", "text": "doge12", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog13.png", "data": ":)(doge13)", "text": "doge13", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog14.png", "data": ":)(doge14)", "text": "doge14", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dog15.png", "data": ":)(doge15)", "text": "doge15", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/aini.png", "data": ":)(aini)", "text": "aini", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/aoteman.png", "data": ":)(aoteman)", "text": "aoteman", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/baibai.png", "data": ":)(baibai)", "text": "baibai", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/beishang.png", "data": ":)(beishang)", "text": "beishang", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/bishi.png", "data": ":)(bishi)", "text": "bishi", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/bizui.png", "data": ":)(bizui)", "text": "bizui", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/chanzui.png", "data": ":)(chanzui)", "text": "chanzui", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/chijing.png", "data": ":)(chijing)", "text": "chijing", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dahaqi.png", "data": ":)(dahaqi)", "text": "dahaqi", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/dalian.png", "data": ":)(dalian)", "text": "dalian", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/ding.png", "data": ":)(ding)", "text": "ding", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/feizao.png", "data": ":)(feizao)", "text": "feizao", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/ganmao.png", "data": ":)(ganmao)", "text": "ganmao", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/guzhang.png", "data": ":)(guzhang)", "text": "guzhang", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/haha.png", "data": ":)(haha)", "text": "haha", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/haixiu.png", "data": ":)(haixiu)", "text": "haixiu", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/hehe.png", "data": ":)(hehe)", "text": "hehe", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/heixian.png", "data": ":)(heixian)", "text": "heixian", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/heng.png", "data": ":)(heng)", "text": "heng", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/huaxin.png", "data": ":)(huaxin)", "text": "huaxin", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/jiyan.png", "data": ":)(jiyan)", "text": "jiyan", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/keai.png", "data": ":)(keai)", "text": "keai", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/kelian.png", "data": ":)(kelian)", "text": "kelian", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/ku.png", "data": ":)(ku)", "text": "ku", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/kun.png", "data": ":)(kun)", "text": "kun", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/landelini.png", "data": ":)(landelini)", "text": "landelini", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/lei.png", "data": ":)(lei)", "text": "lei", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/nanhaier.png", "data": ":)(nanhaier)", "text": "nanhaier", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/nu.png", "data": ":)(nu)", "text": "nu", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/numa.png", "data": ":)(numa)", "text": "numa", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/nvhaier.png", "data": ":)(nvhaier)", "text": "nvhaier", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/qian.png", "data": ":)(qian)", "text": "qian", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/qinqin.png", "data": ":)(qinqin)", "text": "qinqin", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/shayan.png", "data": ":)(shayan)", "text": "shayan", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/shengbing.png", "data": ":)(shengbing)", "text": "shengbing", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/shenshou.png", "data": ":)(shenshou)", "text": "shenshou", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/shiwang.png", "data": ":)(shiwang)", "text": "shiwang", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/shuai.png", "data": ":)(shuai)", "text": "shuai", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/shuijiao.png", "data": ":)(shuijiao)", "text": "shuijiao", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/sikao.png", "data": ":)(sikao)", "text": "sikao", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/taikaixin.png", "data": ":)(taikaixin)", "text": "taikaixin", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/touxiao.png", "data": ":)(touxiao)", "text": "touxiao", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/tu.png", "data": ":)(tu)", "text": "tu", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/tuzi.png", "data": ":)(tuzi)", "text": "tuzi", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/wabishi.png", "data": ":)(wabishi)", "text": "wabishi", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/weiqu.png", "data": ":)(weiqu)", "text": "weiqu", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/xiaoku.png", "data": ":)(xiaoku)", "text": "xiaoku", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/xiongmao.png", "data": ":)(xiongmao)", "text": "xiongmao", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/xixi.png", "data": ":)(xixi)", "text": "xixi", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/xu.png", "data": ":)(xu)", "text": "xu", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/yinxian.png", "data": ":)(yinxian)", "text": "yinxian", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/yiwen.png", "data": ":)(yiwen)", "text": "yiwen", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/youhengheng.png", "data": ":)(youhengheng)", "text": "youhengheng", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/yun.png", "data": ":)(yun)", "text": "yun", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/zhuakuang.png", "data": ":)(zhuakuang)", "text": "zhuakuang", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/zhutou.png", "data": ":)(zhutou)", "text": "zhutou", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/zuiyou.png", "data": ":)(zuiyou)", "text": "zuiyou", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/zuohengheng.png", "data": ":)(zuohengheng)", "text": "zuohengheng", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/geili.png", "data": ":)(geili)", "text": "geili", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/hufen.png", "data": ":)(hufen)", "text": "hufen", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/jiong.png", "data": ":)(jiong)", "text": "jiong", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/meng.png", "data": ":)(meng)", "text": "meng", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/shenma.png", "data": ":)(shenma)", "text": "shenma", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/v5.png", "data": ":)(v5)", "text": "v5", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/xi.png", "data": ":)(xi)", "text": "xi", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/weibo/zhi.png", "data": ":)(zhi)", "text": "zhi", "category": "微博" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/呵呵.png", "data": ":u(呵呵)", "text": "呵呵", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/哈哈.png", "data": ":u(哈哈)", "text": "哈哈", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/吐舌.png", "data": ":u(吐舌)", "text": "吐舌", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/太开心.png", "data": ":u(太开心)", "text": "太开心", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/笑眼.png", "data": ":u(笑眼)", "text": "笑眼", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/花心.png", "data": ":u(花心)", "text": "花心", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/小乖.png", "data": ":u(小乖)", "text": "小乖", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/乖.png", "data": ":u(乖)", "text": "乖", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/捂嘴笑.png", "data": ":u(捂嘴笑)", "text": "捂嘴笑", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/滑稽.png", "data": ":u(滑稽)", "text": "滑稽", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/你懂的.png", "data": ":u(你懂的)", "text": "你懂的", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/不高兴.png", "data": ":u(不高兴)", "text": "不高兴", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/怒.png", "data": ":u(怒)", "text": "怒", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/汗.png", "data": ":u(汗)", "text": "汗", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/黑线.png", "data": ":u(黑线)", "text": "黑线", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/泪.png", "data": ":u(泪)", "text": "泪", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/喷.png", "data": ":u(喷)", "text": "喷", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/惊哭.png", "data": ":u(惊哭)", "text": "惊哭", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/阴险.png", "data": ":u(阴险)", "text": "阴险", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/鄙视.png", "data": ":u(鄙视)", "text": "鄙视", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/酷.png", "data": ":u(酷)", "text": "酷", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/啊.png", "data": ":u(啊)", "text": "啊", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/狂汗.png", "data": ":u(狂汗)", "text": "狂汗", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/what.png", "data": ":u(what)", "text": "what", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/疑问.png", "data": ":u(疑问)", "text": "疑问", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/酸爽.png", "data": ":u(酸爽)", "text": "酸爽", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/呀咩爹.png", "data": ":u(呀咩爹)", "text": "呀咩爹", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/委屈.png", "data": ":u(委屈)", "text": "委屈", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/惊讶.png", "data": ":u(惊讶)", "text": "惊讶", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/睡觉.png", "data": ":u(睡觉)", "text": "睡觉", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/笑尿.png", "data": ":u(笑尿)", "text": "笑尿", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/挖鼻.png", "data": ":u(挖鼻)", "text": "挖鼻", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/吐.png", "data": ":u(吐)", "text": "吐", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/犀利.png", "data": ":u(犀利)", "text": "犀利", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/小红脸.png", "data": ":u(小红脸)", "text": "小红脸", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/懒得理.png", "data": ":u(懒得理)", "text": "懒得理", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/勉强.png", "data": ":u(勉强)", "text": "勉强", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/爱心.png", "data": ":u(爱心)", "text": "爱心", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/心碎.png", "data": ":u(心碎)", "text": "心碎", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/玫瑰.png", "data": ":u(玫瑰)", "text": "玫瑰", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/礼物.png", "data": ":u(礼物)", "text": "礼物", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/彩虹.png", "data": ":u(彩虹)", "text": "彩虹", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/太阳.png", "data": ":u(太阳)", "text": "太阳", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/星星月亮.png", "data": ":u(星星月亮)", "text": "星星月亮", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/钱币.png", "data": ":u(钱币)", "text": "钱币", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/茶杯.png", "data": ":u(茶杯)", "text": "茶杯", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/蛋糕.png", "data": ":u(蛋糕)", "text": "蛋糕", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/大拇指.png", "data": ":u(大拇指)", "text": "大拇指", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/胜利.png", "data": ":u(胜利)", "text": "胜利", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/haha.png", "data": ":u(haha)", "text": "haha", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/OK.png", "data": ":u(OK)", "text": "OK", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/沙发.png", "data": ":u(沙发)", "text": "沙发", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/手纸.png", "data": ":u(手纸)", "text": "手纸", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/香蕉.png", "data": ":u(香蕉)", "text": "香蕉", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/便便.png", "data": ":u(便便)", "text": "便便", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/药丸.png", "data": ":u(药丸)", "text": "药丸", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/红领巾.png", "data": ":u(红领巾)", "text": "红领巾", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/蜡烛.png", "data": ":u(蜡烛)", "text": "蜡烛", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/音乐.png", "data": ":u(音乐)", "text": "音乐", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/newtieba/灯泡.png", "data": ":u(灯泡)", "text": "灯泡", "category": "新贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/呵呵.png", "data": ":w(呵呵)", "text": "呵呵", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/哈哈.png", "data": ":w(哈哈)", "text": "哈哈", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/吐舌.png", "data": ":w(吐舌)", "text": "吐舌", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/啊.png", "data": ":w(啊)", "text": "啊", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/酷.png", "data": ":w(酷)", "text": "酷", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/怒.png", "data": ":w(怒)", "text": "怒", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/开心.png", "data": ":w(开心)", "text": "开心", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/汗.png", "data": ":w(汗)", "text": "汗", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/泪.png", "data": ":w(泪)", "text": "泪", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/黑线.png", "data": ":w(黑线)", "text": "黑线", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/鄙视.png", "data": ":w(鄙视)", "text": "鄙视", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/不高兴.png", "data": ":w(不高兴)", "text": "不高兴", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/真棒.png", "data": ":w(真棒)", "text": "真棒", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/钱.png", "data": ":w(钱)", "text": "钱", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/疑问.png", "data": ":w(疑问)", "text": "疑问", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/阴险.png", "data": ":w(阴险)", "text": "阴险", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/吐.png", "data": ":w(吐)", "text": "吐", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/咦.png", "data": ":w(咦)", "text": "咦", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/委屈.png", "data": ":w(委屈)", "text": "委屈", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/花心.png", "data": ":w(花心)", "text": "花心", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/呼.png", "data": ":w(呼)", "text": "呼", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/笑眼.png", "data": ":w(笑眼)", "text": "笑眼", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/冷.png", "data": ":w(冷)", "text": "冷", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/太开心.png", "data": ":w(太开心)", "text": "太开心", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/滑稽.png", "data": ":w(滑稽)", "text": "滑稽", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/勉强.png", "data": ":w(勉强)", "text": "勉强", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/狂汗.png", "data": ":w(狂汗)", "text": "狂汗", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/乖.png", "data": ":w(乖)", "text": "乖", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/睡觉.png", "data": ":w(睡觉)", "text": "睡觉", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/惊哭.png", "data": ":w(惊哭)", "text": "惊哭", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/生气.png", "data": ":w(生气)", "text": "生气", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/惊讶.png", "data": ":w(惊讶)", "text": "惊讶", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/喷.png", "data": ":w(喷)", "text": "喷", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/玫瑰.png", "data": ":w(玫瑰)", "text": "玫瑰", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/礼物.png", "data": ":w(礼物)", "text": "礼物", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/彩虹.png", "data": ":w(彩虹)", "text": "彩虹", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/钱币.png", "data": ":w(钱币)", "text": "钱币", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/灯泡.png", "data": ":w(灯泡)", "text": "灯泡", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/茶杯.png", "data": ":w(茶杯)", "text": "茶杯", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/音乐.png", "data": ":w(音乐)", "text": "音乐", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/haha.png", "data": ":w(haha)", "text": "haha", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/胜利.png", "data": ":w(胜利)", "text": "胜利", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/大拇指.png", "data": ":w(大拇指)", "text": "大拇指", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/tieba/弱.png", "data": ":w(弱)", "text": "弱", "category": "贴吧" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E9AB98E585B4_2x.png", "data": ":@(高兴)", "text": "高兴", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E5B08FE68092_2x.png", "data": ":@(小怒)", "text": "小怒", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E884B8E7BAA2_2x.png", "data": ":@(脸红)", "text": "脸红", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E58685E4BCA4_2x.png", "data": ":@(内伤)", "text": "内伤", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E8A385E5A4A7E6ACBE_2x.png", "data": ":@(装大款)", "text": "装大款", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E8B59EE4B880E4B8AA_2x.png", "data": ":@(赞一个)", "text": "赞一个", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E5AEB3E7BE9E_2x.png", "data": ":@(害羞)", "text": "害羞", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E6B197_2x.png", "data": ":@(汗)", "text": "汗", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E59090E8A180E58092E59CB0_2x.png", "data": ":@(吐血倒地)", "text": "吐血倒地", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E6B7B1E6809D_2x.png", "data": ":@(深思)", "text": "深思", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E4B88DE9AB98E585B4_2x.png", "data": ":@(不高兴)", "text": "不高兴", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E697A0E8AFAD_2x.png", "data": ":@(无语)", "text": "无语", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E4BAB2E4BAB2_2x.png", "data": ":@(亲亲)", "text": "亲亲", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E58FA3E6B0B4_2x.png", "data": ":@(口水)", "text": "口水", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E5B0B4E5B0AC_2x.png", "data": ":@(尴尬)", "text": "尴尬", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E4B8ADE68C87_2x.png", "data": ":@(中指)", "text": "中指", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E683B3E4B880E683B3_2x.png", "data": ":@(想一想)", "text": "想一想", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E593ADE6B3A3_2x.png", "data": ":@(哭泣)", "text": "哭泣", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E4BEBFE4BEBF_2x.png", "data": ":@(便便)", "text": "便便", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E78CAEE88AB1_2x.png", "data": ":@(献花)", "text": "献花", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E79AB1E79C89_2x.png", "data": ":@(皱眉)", "text": "皱眉", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E582BBE7AC91_2x.png", "data": ":@(傻笑)", "text": "傻笑", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E78B82E6B197_2x.png", "data": ":@(狂汗)", "text": "狂汗", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E59090_2x.png", "data": ":@(吐)", "text": "吐", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E596B7E6B0B4_2x.png", "data": ":@(喷水)", "text": "喷水", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E79C8BE4B88DE8A781_2x.png", "data": ":@(看不见)", "text": "看不见", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E9BC93E68E8C_2x.png", "data": ":@(鼓掌)", "text": "鼓掌", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E998B4E69A97_2x.png", "data": ":@(阴暗)", "text": "阴暗", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E995BFE88D89_2x.png", "data": ":@(长草)", "text": "长草", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E78CAEE9BB84E7939C_2x.png", "data": ":@(献黄瓜)", "text": "献黄瓜", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E982AAE681B6_2x.png", "data": ":@(邪恶)", "text": "邪恶", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E69C9FE5BE85_2x.png", "data": ":@(期待)", "text": "期待", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E5BE97E6848F_2x.png", "data": ":@(得意)", "text": "得意", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E59090E8888C_2x.png", "data": ":@(吐舌)", "text": "吐舌", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E596B7E8A180_2x.png", "data": ":@(喷血)", "text": "喷血", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E697A0E68980E8B093_2x.png", "data": ":@(无所谓)", "text": "无所谓", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E8A782E5AF9F_2x.png", "data": ":@(观察)", "text": "观察", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E69A97E59CB0E8A782E5AF9F_2x.png", "data": ":@(暗地观察)", "text": "暗地观察", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E882BFE58C85_2x.png", "data": ":@(肿包)", "text": "肿包", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E4B8ADE69EAA_2x.png", "data": ":@(中枪)", "text": "中枪", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E5A4A7E59BA7_2x.png", "data": ":@(大囧)", "text": "大囧", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E591B2E78999_2x.png", "data": ":@(呲牙)", "text": "呲牙", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E68AA0E9BCBB_2x.png", "data": ":@(抠鼻)", "text": "抠鼻", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E4B88DE8AFB4E8AF9D_2x.png", "data": ":@(不说话)", "text": "不说话", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E592BDE6B094_2x.png", "data": ":@(咽气)", "text": "咽气", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E6ACA2E591BC_2x.png", "data": ":@(欢呼)", "text": "欢呼", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E99481E79C89_2x.png", "data": ":@(锁眉)", "text": "锁眉", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E89CA1E7839B_2x.png", "data": ":@(蜡烛)", "text": "蜡烛", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E59D90E7AD89_2x.png", "data": ":@(坐等)", "text": "坐等", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E587BBE68E8C_2x.png", "data": ":@(击掌)", "text": "击掌", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E6838AE5969C_2x.png", "data": ":@(惊喜)", "text": "惊喜", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E5969CE69E81E8808CE6B3A3_2x.png", "data": ":@(喜极而泣)", "text": "喜极而泣", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E68ABDE7839F_2x.png", "data": ":@(抽烟)", "text": "抽烟", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E4B88DE587BAE68980E69699_2x.png", "data": ":@(不出所料)", "text": "不出所料", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E684A4E68092_2x.png", "data": ":@(愤怒)", "text": "愤怒", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E697A0E5A588_2x.png", "data": ":@(无奈)", "text": "无奈", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E9BB91E7BABF_2x.png", "data": ":@(黑线)", "text": "黑线", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E68A95E9998D_2x.png", "data": ":@(投降)", "text": "投降", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E79C8BE783ADE997B9_2x.png", "data": ":@(看热闹)", "text": "看热闹", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E68987E880B3E58589_2x.png", "data": ":@(扇耳光)", "text": "扇耳光", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E5B08FE79CBCE79D9B_2x.png", "data": ":@(小眼睛)", "text": "小眼睛", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/aru/E4B8ADE58880_2x.png", "data": ":@(中刀)", "text": "中刀", "category": "阿鲁" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E581B7E79C8B.png", "data": ":&(蛆音娘_偷看)", "text": "蛆音娘_偷看", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E6918AE6898B.png", "data": ":&(蛆音娘_摊手)", "text": "蛆音娘_摊手", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E697A0E8AFAD.png", "data": ":&(蛆音娘_无语)", "text": "蛆音娘_无语", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E5AEB3E68095.png", "data": ":&(蛆音娘_害怕)", "text": "蛆音娘_害怕", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E58EBBE4B896.png", "data": ":&(蛆音娘_去世)", "text": "蛆音娘_去世", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E79DA1E8A789.png", "data": ":&(蛆音娘_睡觉)", "text": "蛆音娘_睡觉", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E593ADE6B3A3.png", "data": ":&(蛆音娘_哭泣)", "text": "蛆音娘_哭泣", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E6BB91E7A8BD.png", "data": ":&(蛆音娘_滑稽)", "text": "蛆音娘_滑稽", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E882A5E79A82.png", "data": ":&(蛆音娘_肥皂)", "text": "蛆音娘_肥皂", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E7949FE6B094.png", "data": ":&(蛆音娘_生气)", "text": "蛆音娘_生气", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E4B88DE684A7E698AFE68891.png", "data": ":&(蛆音娘_不愧是我)", "text": "蛆音娘_不愧是我", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E59083E6838A.png", "data": ":&(蛆音娘_吃惊)", "text": "蛆音娘_吃惊", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E689B6E9A29D.png", "data": ":&(蛆音娘_扶额)", "text": "蛆音娘_扶额", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E5A4A7E7AC91.png", "data": ":&(蛆音娘_大笑)", "text": "蛆音娘_大笑", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E58D96E8908C.png", "data": ":&(蛆音娘_卖萌)", "text": "蛆音娘_卖萌", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E59083E7939C.png", "data": ":&(蛆音娘_吃瓜)", "text": "蛆音娘_吃瓜", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E59090E8A180.png", "data": ":&(蛆音娘_吐血)", "text": "蛆音娘_吐血", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_OK.png", "data": ":&(蛆音娘_OK)", "text": "蛆音娘_OK", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E593BC.png", "data": ":&(蛆音娘_哼)", "text": "蛆音娘_哼", "category": "蛆音娘" }, { "icon": "https://staticfile.typecho.co.uk/emoji/quyin/E89B86E99FB3E5A898_E79691E997AE.png", "data": ":&(蛆音娘_疑问)", "text": "蛆音娘_疑问", "category": "蛆音娘" } ] ================================================ FILE: assets/vendors/douban/douban.css ================================================ .tab { padding-top: 10px; position: relative; overflow: hidden; margin: 0 auto; line-height: 1.5; font-weight: 300; color: #888; -webkit-font-smoothing: antialiased; } .tabs { display: table; position: relative; overflow: hidden; margin: 0; width: 100%; list-style:none!important; } .tabs li { float: left; line-height: 38px; overflow: hidden; padding: 0; position: relative; } .tabs a{ background-color: #eff0f2; border-bottom: 1px solid #000; color: #888; font-weight: 500; display: block; letter-spacing: 0; outline: none; padding: 0 20px; text-decoration: none; -webkit-transition: all 0.2s ease-in-out; -moz-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; border-bottom: 2px solid #000; cursor:pointer; } .tabs_item { display: none; padding: 30px 0; } .tabs_item h4 { font-weight: bold; color: #fff; font-size: 20px; } .tabs_item img { width: 200px; float: left; margin-right: 30px; } .tabs_item:first-child { display: block; } .current a{ color:#fff; background: #000; } .current{ color: #fff; } .doubanboard-list{ display: flex; flex-flow: row wrap; justify-content: flex-start; margin-top: 1em; width: calc(100% + 15px); margin-left: -15px; } .doubanboard-list,.doubanboard-list *{ box-sizing: border-box; } .doubanboard-item { position: relative; cursor: pointer; box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); transition: ease all 0.3s; overflow: hidden; background: #f7fbf7; display: flex; flex-flow: column nowrap; justify-content: flex-start; border: none!important; display: block; margin-left: 15px; margin-bottom: 15px; border-radius:8px; } .doubanboard-item:hover{ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); } .doubanboard-thumb { width: 100%; /* customize this for diffrent style */ padding-top: 141%; background-repeat: no-repeat; background-size: cover; } .doubanboard-title,.doubanboard-title a{ margin: 8px 0!important; font-size: 1.2em!important; overflow: hidden!important; text-overflow: ellipsis!important; white-space: nowrap !important; text-align: center !important; color: #202020 !important; font-weight: 700 !important; border:none !important; padding:8px!important; } /* detail panel */ .doubanboard-info{ position: absolute; top:0; left: 0; width: 100%; height: 100%; overflow: auto; -webkit-overflow-scrolling: touch; transition: all 0.3s; background-color: #f7fbf7; color: black; font-size: 0.9em; line-height: 1.3em; transform: translateY(100%); padding: 0.5em; font-size: 16px; font-weight: 400; } .doubanboard-info::-webkit-scrollbar{ background: none; width: 4px; height: 6px; border-radius:2px; } .doubanboard-info::-webkit-scrollbar-thumb{ background: rgba(0,0,0,0.2); border-radius:2px; line-height: 1.15; font-size: 1em; } .doubanboard-info::-webkit-scrollbar-thumb:hover{ background: rgba(0,0,0,0.6); } .doubanboard-info-show > .doubanboard-info{ transform: translateY(0); } /* special for douban */ .doubanboard-info>.doubanboard-info-basic{ white-space: nowrap!important; overflow: hidden; text-overflow: ellipsis; } /* loadmore button (span) */ .douban-loadmore{ display: block; padding: 0.3em; background: #000; color: white; transition:0.2s; margin: 20px auto!important; width: 6em; text-align: center; cursor: pointer; border-radius:5px; } .douban-loadmore:hover{ background: rgba(0,0,0,0.6); } /* media query for responsive design */ @media screen and (max-width: 767.5px){ .doubanboard-item{ width: calc(33.333333333% - 15px); } } @media screen and (min-width:767.5px){ .doubanboard-item{ width: calc(25% - 15px); } } @media screen and (max-width:450px){ .doubanboard-item{ width: calc(50% - 15px); } } .douban-single{ max-width: 100%; height: 230px; box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); border-radius: 8px; overflow: hidden; position: relative; } .douban-single-img{ position: absolute; left: 0; top: 0; width: 22%; height: 100%; float: left; background-size: cover; background-position: center center; } .douban-single-info{ position: absolute; width: 76%; height: 100%; top: 0; right: 0; margin-left: 24%; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 0.2em 0.5em 0.5em 0; font-size: 16px; font-weight: 400; line-height: 1.4; } .douban-single-info::-webkit-scrollbar{ background: none; width: 4px; height: 6px; border-radius:2px; } .douban-single-info::-webkit-scrollbar-thumb{ background: rgba(0,0,0,0.2); border-radius:2px; line-height: 1.15; font-size: 1em; } .douban-single-info::-webkit-scrollbar-thumb:hover{ background: rgba(0,0,0,0.6); } .douban-single-summary{ margin-top: 0.3em; display: inline-block; } .douban-single-title{ font-size: 1.3em; color: #1abc9c; text-decoration: none; padding: 0; margin: 0; border:none!important; } .douban-single-rating{ background-image: url(/usr/plugins/DoubanBoard/assets/rating.png); display: inline-block; width: 75px; height: 15px; } .douban-single-meta{ font-size: 0.8em; font-size: 0.8em; display: inline-block; margin: 0.5em 0; opacity: 0.5; } @media screen and (max-width:767px){ .douban-single{ height: 160px; } .douban-single-img{ width: 32%; } .douban-single-info{ margin-left: 35%; width: 65%; } } ================================================ FILE: assets/vendors/douban/douban.js ================================================ // Author:熊猫小A // Modified:Whitebear(whitebear@msn.com) var curBooks_read = 0; var curBooks_reading = 0; var curBooks_wish = 0; var curMovies_watched = 0; var curMovies_watching = 0; var curMovies_wish = 0; var curMusic_listened = 0; var curMusic_listening = 0; var curMusic_wish = 0; DoubanBoard = { initDoubanBoard: function () { $(`.douban-book-list[data-status="read"]`).after(`<div class="douban-loadmore" id="loadMoreBooks_read" onclick="DoubanBoard.loadBooks('read');">加载更多</div>`); $(`.douban-book-list[data-status="reading"]`).after(`<div class="douban-loadmore" id="loadMoreBooks_reading" onclick="DoubanBoard.loadBooks('reading');">加载更多</div>`); $(`.douban-book-list[data-status="wish"]`).after(`<div class="douban-loadmore" id="loadMoreBooks_wish" onclick="DoubanBoard.loadBooks('wish');">加载更多</div>`); $(`.douban-movie-list[data-status="watched"]`).after(`<div class="douban-loadmore" id="loadMoreMovies_watched" onclick="DoubanBoard.loadMovies('watched');">加载更多</div>`); $(`.douban-movie-list[data-status="watching"]`).after(`<div class="douban-loadmore" id="loadMoreMovies_watching" onclick="DoubanBoard.loadMovies('watching');">加载更多</div>`); $(`.douban-movie-list[data-status="wish"]`).after(`<div class="douban-loadmore" id="loadMoreMovies_wish" onclick="DoubanBoard.loadMovies('wish');">加载更多</div>`); $(`.douban-music-list[data-status="listened"]`).after(`<div class="douban-loadmore" id="loadMoreMusics_listened" onclick="DoubanBoard.loadMusics('listened');">加载更多</div>`); $(`.douban-music-list[data-status="listening"]`).after(`<div class="douban-loadmore" id="loadMoreMusics_listening" onclick="DoubanBoard.loadMusics('listening');">加载更多</div>`); $(`.douban-music-list[data-status="wish"]`).after(`<div class="douban-loadmore" id="loadMoreMusics_wish" onclick="DoubanBoard.loadMusics('wish');">加载更多</div>`); curBooks_read = 0; curBooks_reading = 0; curBooks_wish = 0; curMovies_watched = 0; curMovies_watching = 0; curMovies_wish = 0; curMusics_listened = 0; curMusics_listening = 0; curMusics_wish = 0; DoubanBoard.loadBooks('read'); DoubanBoard.loadBooks('reading'); DoubanBoard.loadBooks('wish'); DoubanBoard.loadMovies('watched'); DoubanBoard.loadMovies('watching'); DoubanBoard.loadMovies('wish'); DoubanBoard.loadMusics('listened'); DoubanBoard.loadMusics('listening'); DoubanBoard.loadMusics('wish'); }, loadBooks: function (status) { $("#honeyLoading").show(); if ($(`.douban-book-list[data-status="` + status + `"]`).length < 1) return; $(`#loadMoreBooks_` + status).html("加载中..."); var curBooks; if (status == 'read') curBooks = curBooks_read; else if (status == 'reading') curBooks = curBooks_reading; else curBooks = curBooks_wish; var api = window.DoubanAPI + "?type=book&from=" + String(curBooks) + "&status=" + status; $.getJSON(api, function (result) { $(`#loadMoreBooks_` + status).html("加载更多"); if (result.length < DoubanPageSize) { $(`#loadMoreBooks_` + status).html("没有啦"); } $.each(result, function (i, item) { var html = `<a href="` + item.url + `" target="_blank" id="doubanboard-book-item-` + String(curBooks) + `" class="doubanboard-item"> <div class="doubanboard-thumb" style="background-image:url(`+ item.img + `)"></div> <div class="doubanboard-title">`+ item.name + `</div> </a>`; $(`.douban-book-list[data-status="` + status + `"]`).append(html); if (status == 'read') curBooks_read++; else if (status == 'reading') curBooks_reading++; else curBooks_wish++; }); }); }, loadMovies: function (status) { if ($(`.douban-movie-list[data-status="` + status + `"]`).length < 1) return; $("#loadMoreMovies_" + status).html("加载中..."); var curMovies; if (status == 'watched') curMovies = curMovies_watched; else if (status == 'watching') curMovies = curMovies_watching; else curMovies = curMovies_wish; $.getJSON(window.DoubanAPI + "?type=movie&from=" + String(curMovies) + "&status=" + status, function (result) { $("#loadMoreMovies_" + status).html("加载更多"); if (result.length < DoubanPageSize) { $("#loadMoreMovies_" + status).html("没有啦"); } $.each(result, function (i, item) { var html = `<a href="` + item.url + `" target="_blank" id="doubanboard-movie-item-` + String(curMovies) + `" class="doubanboard-item"> <div class="doubanboard-thumb" style="background-image:url(`+ item.img + `)"></div> <div class="doubanboard-title">`+ item.name + `</div> </a>`; $(`.douban-movie-list[data-status="` + status + `"]`).append(html); if (status == 'watched') curMovies_watched++; else if (status == 'watching') curMovies_watching++; else curMovies_wish++; }); }); }, loadMusics: function (status) { if ($(`.douban-music-list[data-status="` + status + `"]`).length < 1) return; $("#loadMoreMusics_" + status).html("加载中..."); var curMusics; if (status == 'listened') curMusics = curMusics_listened; else if (status == 'listening') curMusics = curMusics_listening; else curMusics = curMusics_wish; $.getJSON(window.DoubanAPI + "?type=music&from=" + String(curMusics) + "&status=" + status, function (result) { $("#loadMoreMusics_" + status).html("加载更多"); if (result.length < DoubanPageSize) { $("#loadMoreMusics_" + status).html("没有啦"); } $.each(result, function (i, item) { var html = `<a href="` + item.url + `" target="_blank" id="doubanboard-music-item-` + String(curMusics) + `" class="doubanboard-item"> <div class="doubanboard-thumb" style="background-image:url(`+ item.img + `)"></div> <div class="doubanboard-title">`+ item.name + `</div> </a>`; $(`.douban-music-list[data-status="` + status + `"]`).append(html); if (status == 'listened') curMusics_listened++; else if (status == 'listening') curMusics_listening++; else curMusics_wish++; }); }); } } $(document).ready(function () { DoubanBoard.initDoubanBoard(); }) $(document).click(function (e) { var target = e.target; $(".doubanboard-item").removeClass("doubanboard-info-show"); $(".doubanboard-item").each(function () { if ($(target).parent()[0] == $(this)[0] || $(target) == $(this)[0]) { $(this).addClass("doubanboard-info-show"); } }) }) ================================================ FILE: assets/vendors/driver.js/driver.min.js.iife.js ================================================ this.driver=this.driver||{},this.driver.js=function(e){"use strict";let t={};function l(e={}){t={animate:!0,allowClose:!0,overlayOpacity:.7,smoothScroll:!1,disableActiveInteraction:!1,showProgress:!1,stagePadding:10,stageRadius:5,popoverOffset:10,showButtons:["next","previous","close"],disableButtons:[],overlayColor:"#000",...e}}function S(e){return e?t[e]:t}function x(e,t,o,i){return(e/=i/2)<1?o/2*e*e+t:-o/2*(--e*(e-2)-1)+t}function b(e){const i='a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])';return e.flatMap(e=>{var t=e.matches(i),o=Array.from(e.querySelectorAll(i));return[...t?[e]:[],...o]}).filter(e=>"none"!==getComputedStyle(e).pointerEvents&&function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)}(e))}function C(e){var t;e&&!function(e){e=e.getBoundingClientRect();return 0<=e.top&&0<=e.left&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}(e)&&(t=S("smoothScroll"),e.scrollIntoView({behavior:!t||function(e){if(e&&e.parentElement)return(e=e.parentElement).scrollHeight>e.clientHeight}(e)?"auto":"smooth",inline:"center",block:"center"}))}let o={};function _(e,t){o[e]=t}function H(e){return e?o[e]:o}function a(){o={}}let p={};function d(e,t){p[e]=t}function L(e){null!=(e=p[e])&&e.call(p)}function E(e){e&&(_("__activeStagePosition",e={x:(e=e.getBoundingClientRect()).x,y:e.y,width:e.width,height:e.height}),k(e))}function i(e){e=function(e){const t=window.innerWidth,o=window.innerHeight,i=document.createElementNS("http://www.w3.org/2000/svg","svg"),n=(i.classList.add("driver-overlay","driver-overlay-animated"),i.setAttribute("viewBox",`0 0 ${t} `+o),i.setAttribute("xmlSpace","preserve"),i.setAttribute("xmlnsXlink","http://www.w3.org/1999/xlink"),i.setAttribute("version","1.1"),i.setAttribute("preserveAspectRatio","xMinYMin slice"),i.style.fillRule="evenodd",i.style.clipRule="evenodd",i.style.strokeLinejoin="round",i.style.strokeMiterlimit="2",i.style.zIndex="10000",i.style.position="fixed",i.style.top="0",i.style.left="0",i.style.width="100%",i.style.height="100%",document.createElementNS("http://www.w3.org/2000/svg","path"));return n.setAttribute("d",r(e)),n.style.fill=S("overlayColor")||"rgb(0,0,0)",n.style.opacity=""+S("overlayOpacity"),n.style.pointerEvents="auto",n.style.cursor="auto",i.appendChild(n),i}(e);document.body.appendChild(e),P(e,e=>{"path"===e.target.tagName&&L("overlayClick")}),_("__overlaySvg",e)}function k(e){var t=H("__overlaySvg");if(t){const o=t.firstElementChild;if("path"!==(null==o?void 0:o.tagName))throw new Error("no path element found in stage svg");o.setAttribute("d",r(e))}else i(e)}function r(e){var t=window.innerWidth,o=window.innerHeight,i=S("stagePadding")||0,n=S("stageRadius")||0,r=e.width+2*i,s=e.height+2*i,n=Math.min(n,r/2,s/2),n=Math.floor(Math.max(n,0)),r=r-2*n,s=s-2*n;return`M${t},0L0,0L0,${o}L${t},${o}L${t},0Z M${e.x-i+n},${e.y-i} h${r} a${n},${n} 0 0 1 ${n},${n} v${s} a${n},${n} 0 0 1 -${n},${n} h-${r} a${n},${n} 0 0 1 -${n},-${n} v-${s} a${n},${n} 0 0 1 ${n},-${n} z`}function g(e){var t=e["element"];let o="string"==typeof t?document.querySelector(t):t;o=o||function(){var e=document.getElementById("driver-dummy-element");if(e)return e;let t=document.createElement("div");return t.id="driver-dummy-element",t.style.width="0",t.style.height="0",t.style.pointerEvents="none",t.style.opacity="0",t.style.position="fixed",t.style.top="50%",t.style.left="50%",document.body.appendChild(t),t}();{var r=o,s=e;const l=Date.now(),d=H("__activeStep"),a=H("__activeElement")||r,i=!a||a===r,p="driver-dummy-element"===r.id,v="driver-dummy-element"===a.id,c=S("animate"),u=s.onHighlightStarted||S("onHighlightStarted"),h=(null==s?void 0:s.onHighlighted)||S("onHighlighted"),m=(null==d?void 0:d.onDeselected)||S("onDeselected"),w=S(),g=H(),y=(!i&&m&&m(v?void 0:a,d,{config:w,state:g}),u&&u(p?void 0:r,s,{config:w,state:g}),!i&&c);let n=!1;{const b=H("popover");b&&(b.wrapper.style.display="none")}_("previousStep",d),_("previousElement",a),_("activeStep",s),_("activeElement",r);const f=()=>{var e,t,o,i;H("__transitionCallback")===f&&(e=Date.now()-l,s.popover&&400-e<=200&&!n&&y&&(B(r,s),n=!0),S("animate")&&e<400?(e=e,t=400,o=a,i=r,o=H("__activeStagePosition")||o.getBoundingClientRect(),i=i.getBoundingClientRect(),k(e={x:x(e,o.x,i.x-o.x,t),y:x(e,o.y,i.y-o.y,t),width:x(e,o.width,i.width-o.width,t),height:x(e,o.height,i.height-o.height,t)}),_("__activeStagePosition",e)):(E(r),h&&h(p?void 0:r,s,{config:S(),state:H()}),_("__transitionCallback",void 0),_("__previousStep",d),_("__previousElement",a),_("__activeStep",s),_("__activeElement",r)),window.requestAnimationFrame(f))};return _("__transitionCallback",f),window.requestAnimationFrame(f),C(r),!y&&s.popover&&B(r,s),a.classList.remove("driver-active-element","driver-no-interaction"),a.removeAttribute("aria-haspopup"),a.removeAttribute("aria-expanded"),a.removeAttribute("aria-controls"),S("disableActiveInteraction")&&r.classList.add("driver-no-interaction"),r.classList.add("driver-active-element"),r.setAttribute("aria-haspopup","dialog"),r.setAttribute("aria-expanded","true"),void r.setAttribute("aria-controls","driver-popover-content")}}function n(){var e,t,o=H("__activeElement"),i=H("__activeStep");if(o){E(o);{const n=H("__activeStagePosition"),r=H("__overlaySvg");n&&(r?(e=window.innerWidth,t=window.innerHeight,r.setAttribute("viewBox",`0 0 ${e} `+t)):console.warn("No stage svg found."))}A(o,i)}}function v(){var e=H("__resizeTimeout");e&&window.cancelAnimationFrame(e),_("__resizeTimeout",window.requestAnimationFrame(n))}function c(e){var t;if(H("isInitialized")&&("Tab"===e.key||9===e.keyCode)){const o=H("__activeElement"),i=null==(t=H("popover"))?void 0:t.wrapper,n=b([...i?[i]:[],...o?[o]:[]]),r=n[0],s=n[n.length-1];if(e.preventDefault(),e.shiftKey){const l=n[n.indexOf(document.activeElement)-1]||s;null!=l&&l.focus()}else{const d=n[n.indexOf(document.activeElement)+1]||r;null!=d&&d.focus()}}}function u(e){var t;null!=(t=S("allowKeyboardControl"))&&!t||("Escape"===e.key?L("escapePress"):"ArrowRight"===e.key?L("arrowRightPress"):"ArrowLeft"===e.key&&L("arrowLeftPress"))}function P(i,t,n){const o=(e,t)=>{var o=e.target;i.contains(o)&&(n&&!n(o)||(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation()),null!=t&&t(e))};document.addEventListener("pointerdown",o,!0),document.addEventListener("mousedown",o,!0),document.addEventListener("pointerup",o,!0),document.addEventListener("mouseup",o,!0),document.addEventListener("click",e=>{o(e,t)},!0)}function B(r,s){let t=H("popover");t&&document.body.removeChild(t.wrapper),t=function(){const e=document.createElement("div"),t=(e.classList.add("driver-popover"),document.createElement("div")),o=(t.classList.add("driver-popover-arrow"),document.createElement("header")),i=(o.id="driver-popover-title",o.classList.add("driver-popover-title"),o.style.display="none",o.innerText="Popover Title",document.createElement("div")),n=(i.id="driver-popover-description",i.classList.add("driver-popover-description"),i.style.display="none",i.innerText="Popover description is here",document.createElement("button")),r=(n.type="button",n.classList.add("driver-popover-close-btn"),n.setAttribute("aria-label","Close"),n.innerHTML="×",document.createElement("footer")),s=(r.classList.add("driver-popover-footer"),document.createElement("span")),l=(s.classList.add("driver-popover-progress-text"),s.innerText="",document.createElement("span")),d=(l.classList.add("driver-popover-navigation-btns"),document.createElement("button")),a=(d.type="button",d.classList.add("driver-popover-prev-btn"),d.innerHTML="← Previous",document.createElement("button"));return a.type="button",a.classList.add("driver-popover-next-btn"),a.innerHTML="Next →",l.appendChild(d),l.appendChild(a),r.appendChild(s),r.appendChild(l),e.appendChild(n),e.appendChild(t),e.appendChild(o),e.appendChild(i),e.appendChild(r),{wrapper:e,arrow:t,title:o,description:i,footer:r,previousButton:d,nextButton:a,closeButton:n,footerButtons:l,progress:s}}(),document.body.appendChild(t.wrapper);var{title:e,description:o,showButtons:i,disableButtons:n,showProgress:l,nextBtnText:d=S("nextBtnText")||"Next →",prevBtnText:a=S("prevBtnText")||"← Previous",progressText:p=S("progressText")||"{current} of {total}"}=s.popover||{};t.nextButton.innerHTML=d,t.previousButton.innerHTML=a,t.progress.innerHTML=p,e?(t.title.innerHTML=e,t.title.style.display="block"):t.title.style.display="none",o?(t.description.innerHTML=o,t.description.style.display="block"):t.description.style.display="none";const v=i||S("showButtons"),c=l||S("showProgress")||!1,u=(null==v?void 0:v.includes("next"))||(null==v?void 0:v.includes("previous"))||c,h=(t.closeButton.style.display=v.includes("close")?"block":"none",u?(t.footer.style.display="flex",t.progress.style.display=c?"block":"none",t.nextButton.style.display=v.includes("next")?"block":"none",t.previousButton.style.display=v.includes("previous")?"block":"none"):t.footer.style.display="none",n||S("disableButtons")||[]),m=(null!=h&&h.includes("next")&&(t.nextButton.disabled=!0,t.nextButton.classList.add("driver-popover-btn-disabled")),null!=h&&h.includes("previous")&&(t.previousButton.disabled=!0,t.previousButton.classList.add("driver-popover-btn-disabled")),null!=h&&h.includes("close")&&(t.closeButton.disabled=!0,t.closeButton.classList.add("driver-popover-btn-disabled")),t.wrapper),w=(m.style.display="block",m.style.left="",m.style.top="",m.style.bottom="",m.style.right="",m.id="driver-popover-content",m.setAttribute("role","dialog"),m.setAttribute("aria-labelledby","driver-popover-title"),m.setAttribute("aria-describedby","driver-popover-description"),t.arrow);w.className="driver-popover-arrow";a=(null==(d=s.popover)?void 0:d.popoverClass)||S("popoverClass")||"";m.className=("driver-popover "+a).trim(),P(t.wrapper,e=>{const t=e.target,o=(null==(e=s.popover)?void 0:e.onNextClick)||S("onNextClick"),i=(null==(e=s.popover)?void 0:e.onPrevClick)||S("onPrevClick"),n=(null==(e=s.popover)?void 0:e.onCloseClick)||S("onCloseClick");return t.classList.contains("driver-popover-next-btn")?o?o(r,s,{config:S(),state:H()}):L("nextClick"):t.classList.contains("driver-popover-prev-btn")?i?i(r,s,{config:S(),state:H()}):L("prevClick"):t.classList.contains("driver-popover-close-btn")?n?n(r,s,{config:S(),state:H()}):L("closeClick"):void 0},e=>!(null!=t&&t.description.contains(e))&&!(null!=t&&t.title.contains(e))&&"string"==typeof e.className&&e.className.includes("driver-popover")),_("popover",t);const g=(null==(p=s.popover)?void 0:p.onPopoverRender)||S("onPopoverRender"),y=(g&&g(t,{config:S(),state:H()}),A(r,s),C(m),r.classList.contains("driver-dummy-element")),f=b([m,...y?[]:[r]]);0<f.length&&f[0].focus()}function M(){const e=H("popover");var t,o,i;if(null!=e&&e.wrapper)return t=e.wrapper.getBoundingClientRect(),o=S("stagePadding")||0,i=S("popoverOffset")||0,{width:t.width+o+i,height:t.height+o+i,realWidth:t.width,realHeight:t.height}}function D(e,t){var{elementDimensions:t,popoverDimensions:o,popoverPadding:i,popoverArrowDimensions:n}=t;return"start"===e?Math.max(Math.min(t.top-i,window.innerHeight-o.realHeight-n.width),n.width):"end"===e?Math.max(Math.min(t.top-(null==o?void 0:o.realHeight)+t.height+i,window.innerHeight-(null==o?void 0:o.realHeight)-n.width),n.width):"center"===e?Math.max(Math.min(t.top+t.height/2-(null==o?void 0:o.realHeight)/2,window.innerHeight-(null==o?void 0:o.realHeight)-n.width),n.width):0}function T(e,t){var{elementDimensions:t,popoverDimensions:o,popoverPadding:i,popoverArrowDimensions:n}=t;return"start"===e?Math.max(Math.min(t.left-i,window.innerWidth-o.realWidth-n.width),n.width):"end"===e?Math.max(Math.min(t.left-(null==o?void 0:o.realWidth)+t.width+i,window.innerWidth-(null==o?void 0:o.realWidth)-n.width),n.width):"center"===e?Math.max(Math.min(t.left+t.width/2-(null==o?void 0:o.realWidth)/2,window.innerWidth-(null==o?void 0:o.realWidth)-n.width),n.width):0}function A(r,s){const l=H("popover");if(l){var{align:s="start",side:d="left"}=(null==s?void 0:s.popover)||{},d="driver-dummy-element"===r.id?"over":d,a=S("stagePadding")||0,p=M(),v=l.arrow.getBoundingClientRect(),c=r.getBoundingClientRect(),u=c.top-p.height;let e=0<=u;var h=window.innerHeight-(c.bottom+p.height);let t=0<=h;var m=c.left-p.width;let o=0<=m;var w=window.innerWidth-(c.right+p.width);let i=0<=w;var g,y=!(e||t||o||i);let n=d;if("top"===d&&e?i=o=t=!1:"bottom"===d&&t?i=o=e=!1:"left"===d&&o?i=e=t=!1:"right"===d&&i&&(o=e=t=!1),"over"===d?(d=window.innerWidth/2-p.realWidth/2,g=window.innerHeight/2-p.realHeight/2,l.wrapper.style.left=d+"px",l.wrapper.style.right="auto",l.wrapper.style.top=g+"px",l.wrapper.style.bottom="auto"):y?(d=window.innerWidth/2-(null==p?void 0:p.realWidth)/2,l.wrapper.style.left=d+"px",l.wrapper.style.right="auto",l.wrapper.style.bottom="10px",l.wrapper.style.top="auto"):o?(g=Math.min(m,window.innerWidth-(null==p?void 0:p.realWidth)-v.width),d=D(s,{elementDimensions:c,popoverDimensions:p,popoverPadding:a,popoverArrowDimensions:v}),l.wrapper.style.left=g+"px",l.wrapper.style.top=d+"px",l.wrapper.style.bottom="auto",l.wrapper.style.right="auto",n="left"):i?(m=Math.min(w,window.innerWidth-(null==p?void 0:p.realWidth)-v.width),g=D(s,{elementDimensions:c,popoverDimensions:p,popoverPadding:a,popoverArrowDimensions:v}),l.wrapper.style.right=m+"px",l.wrapper.style.top=g+"px",l.wrapper.style.bottom="auto",l.wrapper.style.left="auto",n="right"):e?(d=Math.min(u,window.innerHeight-p.realHeight-v.width),w=T(s,{elementDimensions:c,popoverDimensions:p,popoverPadding:a,popoverArrowDimensions:v}),l.wrapper.style.top=d+"px",l.wrapper.style.left=w+"px",l.wrapper.style.bottom="auto",l.wrapper.style.right="auto",n="top"):t&&(m=Math.min(h,window.innerHeight-(null==p?void 0:p.realHeight)-v.width),g=T(s,{elementDimensions:c,popoverDimensions:p,popoverPadding:a,popoverArrowDimensions:v}),l.wrapper.style.left=g+"px",l.wrapper.style.bottom=m+"px",l.wrapper.style.top="auto",l.wrapper.style.right="auto",n="bottom"),y)l.arrow.classList.add("driver-popover-arrow-none");else{u=s,d=n,w=r,h=H("popover");if(h){const f=w.getBoundingClientRect(),b=M(),x=h.arrow,C=b.width,_=window.innerWidth,L=f.width,E=f.left,k=b.height,P=window.innerHeight,B=f.top,A=f.height;x.className="driver-popover-arrow";let e=d,t=u;"top"===d?(E+L<=0?(e="right",t="end"):E+L-C<=0&&(e="top",t="start"),_<=E?(e="left",t="end"):_<=E+C&&(e="top",t="end")):"bottom"===d?(E+L<=0?(e="right",t="start"):E+L-C<=0&&(e="bottom",t="start"),_<=E?(e="left",t="start"):_<=E+C&&(e="bottom",t="end")):"left"===d?(B+A<=0?(e="bottom",t="end"):B+A-k<=0&&(e="left",t="start"),P<=B?(e="top",t="end"):P<=B+k&&(e="left",t="end")):"right"===d&&(B+A<=0?(e="bottom",t="start"):B+A-k<=0&&(e="right",t="start"),P<=B?(e="top",t="start"):P<=B+k&&(e="right",t="end")),e?(x.classList.add("driver-popover-arrow-side-"+e),x.classList.add("driver-popover-arrow-align-"+t)):x.classList.add("driver-popover-arrow-none")}}}}return e.driver=function(e={}){function t(){S("allowClose")&&w()}function n(){var e=H("activeIndex"),t=S("steps")||[];void 0!==e&&(t[t=e+1]?m(t):w())}function r(){var e=H("activeIndex"),t=S("steps")||[];void 0!==e&&(t[t=e-1]?m(t):w())}function o(){if(!H("__transitionCallback")){var e=H("activeIndex"),t=H("__activeStep"),o=H("__activeElement");if(void 0!==e&&void 0!==t&&void 0!==H("activeIndex")){const i=(null==(e=t.popover)?void 0:e.onPrevClick)||S("onPrevClick");if(i)return i(o,t,{config:S(),state:H()});r()}}}function i(){if(!H("__transitionCallback")){var e=H("activeIndex"),t=H("__activeStep"),o=H("__activeElement");if(void 0!==e&&void 0!==t){const i=(null==(e=t.popover)?void 0:e.onNextClick)||S("onNextClick");if(i)return i(o,t,{config:S(),state:H()});n()}}}function s(){H("isInitialized")||(_("isInitialized",!0),document.body.classList.add("driver-active",S("animate")?"driver-fade":"driver-simple"),window.addEventListener("keyup",u,!1),window.addEventListener("keydown",c,!1),window.addEventListener("resize",v),window.addEventListener("scroll",v),d("overlayClick",t),d("escapePress",t),d("arrowLeftPress",o),d("arrowRightPress",i))}function m(e=0){var t,o=S("steps");if(!o)return console.error("No steps to drive through"),void w();if(o[e]){_("__activeOnDestroyed",document.activeElement),_("activeIndex",e);const i=o[e],n=o[e+1],r=o[e-1],s=(null==(t=i.popover)?void 0:t.doneBtnText)||S("doneBtnText")||"Done",l=S("allowClose"),d=void 0!==(null==(t=i.popover)?void 0:t.showProgress)?null==(t=i.popover)?void 0:t.showProgress:S("showProgress"),a=((null==(t=i.popover)?void 0:t.progressText)||S("progressText")||"{{current}} of {{total}}").replace("{{current}}",""+(e+1)).replace("{{total}}",""+o.length),p=(null==(t=i.popover)?void 0:t.showButtons)||S("showButtons"),v=["next","previous",...l?["close"]:[]].filter(e=>!(null!=p&&p.length)||p.includes(e)),c=(null==(o=i.popover)?void 0:o.onNextClick)||S("onNextClick"),u=(null==(t=i.popover)?void 0:t.onPrevClick)||S("onPrevClick"),h=(null==(o=i.popover)?void 0:o.onCloseClick)||S("onCloseClick");g({...i,popover:{showButtons:v,nextBtnText:n?void 0:s,disableButtons:[...r?[]:["previous"]],showProgress:d,progressText:a,onNextClick:c||(()=>{n?m(e+1):w()}),onPrevClick:u||(()=>{m(e-1)}),onCloseClick:h||(()=>{w()}),...(null==i?void 0:i.popover)||{}}})}else w()}function w(e=!0){const t=H("__activeElement"),o=H("__activeStep"),i=H("__activeOnDestroyed"),n=S("onDestroyStarted");var r;if(e&&n)return e=!t||"driver-dummy-element"===(null==t?void 0:t.id),void n(e?void 0:t,o,{config:S(),state:H()});const s=(null==o?void 0:o.onDeselected)||S("onDeselected"),l=S("onDestroyed");document.body.classList.remove("driver-active","driver-fade","driver-simple"),window.removeEventListener("keyup",u),window.removeEventListener("resize",v),window.removeEventListener("scroll",v),(e=H("popover"))&&null!=(r=e.wrapper.parentElement)&&r.removeChild(e.wrapper),null!=(r=document.getElementById("driver-dummy-element"))&&r.remove(),document.querySelectorAll(".driver-active-element").forEach(e=>{e.classList.remove("driver-active-element","driver-no-interaction"),e.removeAttribute("aria-haspopup"),e.removeAttribute("aria-expanded"),e.removeAttribute("aria-controls")});{const d=H("__overlaySvg");d&&d.remove()}p={},a(),t&&o&&(e="driver-dummy-element"===t.id,s&&s(e?void 0:t,o,{config:S(),state:H()}),l&&l(e?void 0:t,o,{config:S(),state:H()})),i&&i.focus()}return l(e),{isActive:()=>H("isInitialized")||!1,refresh:v,drive:(e=0)=>{s(),m(e)},setConfig:l,setSteps:e=>{a(),l({...S(),steps:e})},getConfig:S,getState:H,getActiveIndex:()=>H("activeIndex"),isFirstStep:()=>0===H("activeIndex"),isLastStep:()=>{var e=S("steps")||[],t=H("activeIndex");return void 0!==t&&t===e.length-1},getActiveStep:()=>H("activeStep"),getActiveElement:()=>H("activeElement"),getPreviousElement:()=>H("previousElement"),getPreviousStep:()=>H("previousStep"),moveNext:n,movePrevious:r,moveTo:function(e){(S("steps")||[])[e]?m(e):w()},hasNextStep:()=>{var e=S("steps")||[],t=H("activeIndex");return void 0!==t&&e[t+1]},hasPreviousStep:()=>{var e=S("steps")||[],t=H("activeIndex");return void 0!==t&&e[t-1]},highlight:e=>{s(),g({...e,popover:e.popover?{showButtons:[],showProgress:!1,progressText:"",...e.popover}:void 0})},destroy:()=>{w(!1)}}},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),e}({}); ================================================ FILE: assets/vendors/fomantic-ui/components/accordion.css ================================================ /*! * # Fomantic-UI 2.9.4 - Accordion * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Accordion *******************************/ .ui.accordion, .ui.accordion .accordion { max-width: 100%; } .ui.accordion .accordion { margin: 1em 0 0; padding: 0; } /* Title */ .ui.accordion.menu .item > .title, .ui.accordion > .title, .ui.accordion .accordion > .title { cursor: pointer; padding: 0.5em 0; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 1em; color: rgba(0, 0, 0, 0.87); list-style: none; line-height: 1; } /* Default Styling */ .ui.accordion:not(.styled) .title ~ .content, .ui.accordion:not(.styled) .accordion .title ~ .content { margin: ""; padding: 0.5em 0 1em; } .ui.accordion:not(.styled) .title ~ .content:last-child { padding-bottom: 0; } /* Arrow */ .ui.accordion .ui.header > .dropdown.icon, .ui.accordion .title > .dropdown.icon, .ui.accordion .accordion .title > .dropdown.icon { display: inline-block; float: none; opacity: 1; width: 1.25em; height: 1em; margin: 0 0.25rem 0 0; padding: 0; font-size: 1em; transition: transform 0.1s ease, opacity 0.1s ease; vertical-align: baseline; transform: none; } .ui.accordion .ui.header > .dropdown.icon.right, .ui.accordion .title > .dropdown.icon.right, .ui.accordion .accordion .title > .dropdown.icon.right { float: right; transform: rotate(180deg); } /* -------------- Coupling --------------- */ /* Menu */ .ui.accordion.menu .item .title { display: block; padding: 0; } .ui.accordion.menu .item .title > .dropdown.icon { float: right; margin: 0 0.25rem 0 0; transform: rotate(180deg); } /* Header */ .ui.accordion .ui.header > .dropdown.icon { font-size: 1em; margin: 0 0.25rem 0 0; } /******************************* States *******************************/ .ui.accordion[open] > .title > .dropdown.icon, .ui.accordion .accordion[open] > .title > .dropdown.icon, .ui.accordion .active.title > .dropdown.icon, .ui.accordion .accordion .active.title > .dropdown.icon { transform: rotate(90deg); } .ui.accordion.menu .item .active.title > .dropdown.icon { transform: rotate(90deg); } /******************************* Types *******************************/ /* -------------- Styled --------------- */ .ui.styled.accordion { width: 600px; } .ui.styled.accordion, .ui.styled.accordion .accordion { border-radius: 0.28571429rem; background: #fff; box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15); } .ui.styled.accordion > .title, .ui.styled.accordion .accordion > .title { margin: 0; padding: 0.75em 1em; color: rgba(0, 0, 0, 0.4); font-weight: bold; border-top: 1px solid rgba(34, 36, 38, 0.15); transition: background 0.1s ease, color 0.1s ease; } .ui.styled.accordion > .title:first-child, .ui.styled.accordion .accordion > .title:first-child { border-top: none; } /* Content */ .ui.styled.accordion > .content { margin: 0; padding: 0.5em 1em 1.5em; } .ui.styled.accordion .accordion > .content { margin: 0; padding: 0.5em 1em 1.5em; } /* Hover */ .ui.styled.accordion > .title:hover { background: transparent; color: rgba(0, 0, 0, 0.87); } .ui.styled.accordion .accordion > .title:hover { background: transparent; color: rgba(0, 0, 0, 0.87); } /* Active */ .ui.styled.accordion[open] > .title, .ui.styled.accordion .active.title { background: transparent; color: rgba(0, 0, 0, 0.95); } .ui.styled.accordion .accordion[open] > .title, .ui.styled.accordion .accordion .active.title { background: transparent; color: rgba(0, 0, 0, 0.95); } /* -------------- Compact --------------- */ /* Default Styling */ .ui.compact.accordion:not(.styled) > .title, .ui.compact.accordion:not(.styled) .accordion > .title { padding: 0.25em 0; } .ui.compact.accordion:not(.styled) .title ~ .content, .ui.compact.accordion:not(.styled) .accordion .title ~ .content { padding: 0.25em 0 0.5em; } /* Styled */ .ui.compact.styled.accordion > .title, .ui.compact.styled.accordion .accordion > .title { padding: 0.375em 0.5em; } .ui.compact.styled.accordion .title ~ .content, .ui.compact.styled.accordion .accordion .title ~ .content { padding: 0.25em 0.5em 0.75em; } /* -------------- Very Compact --------------- */ .ui[class*="very compact"].accordion:not(.styled) > .title, .ui[class*="very compact"].accordion:not(.styled) .accordion > .title { padding: 0.125em 0; } .ui[class*="very compact"].accordion:not(.styled) .title ~ .content, .ui[class*="very compact"].accordion:not(.styled) .accordion .title ~ .content { padding: 0.125em 0 0.25em; } .ui[class*="very compact"].styled.accordion > .title, .ui[class*="very compact"].styled.accordion .accordion > .title { padding: 0.1875em 0.25em; } .ui[class*="very compact"].styled.accordion .title ~ .content, .ui[class*="very compact"].styled.accordion .accordion .title ~ .content { padding: 0.125em 0.25em 0.375em; } /******************************* States *******************************/ /* -------------- Not Active --------------- */ .ui.accordion:not(details) .title ~ .content:not(.active), .ui.accordion .accordion:not(details) .title ~ .content:not(.active) { display: none; } /******************************* Variations *******************************/ /* -------------- Fluid --------------- */ .ui.fluid.accordion, .ui.fluid.accordion .accordion { width: 100%; } /* -------------- Inverted --------------- */ .ui.inverted.accordion.menu .item > .title, .ui.inverted.accordion > .title, .ui.inverted.accordion .accordion > .title { color: rgba(255, 255, 255, 0.9); } .ui.inverted.styled.accordion, .ui.inverted.styled.accordion .accordion { background: #1b1c1d; box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(255, 255, 255, 0.1); } .ui.inverted.styled.accordion > .title, .ui.inverted.styled.accordion .accordion > .title { color: rgba(255, 255, 255, 0.5); border-top: 1px solid rgba(255, 255, 255, 0.1); } /* Hover */ .ui.inverted.styled.accordion > .title:hover { background: transparent; color: rgba(255, 255, 255, 0.9); } .ui.inverted.styled.accordion .accordion > .title:hover { background: transparent; color: rgba(255, 255, 255, 0.9); } /* Active */ .ui.inverted.styled.accordion[open] > .title, .ui.inverted.styled.accordion .active.title { background: transparent; color: #ffffff; } .ui.inverted.styled.accordion .accordion[open] > .title, .ui.inverted.styled.accordion .accordion .active.title { background: transparent; color: #ffffff; } .ui.basic.styled.accordion, .ui.basic.styled.accordion .accordion { background: transparent; box-shadow: none; } .ui.basic.styled.accordion > .title, .ui.basic.styled.accordion .accordion > .title { border: none; color: rgba(0, 0, 0, 0.6); } .ui.basic.styled.accordion > .title:hover, .ui.basic.styled.accordion .accordion > .title:hover { background: transparent; color: rgba(0, 0, 0, 0.87); } .ui.basic.styled.accordion[open] > .title, .ui.basic.styled.accordion .active.title, .ui.basic.styled.accordion .accordion[open] > .title, .ui.basic.styled.accordion .accordion .active.title { background: transparent; color: rgba(0, 0, 0, 0.95); } .ui.inverted.basic.styled.accordion > .title, .ui.inverted.basic.styled.accordion .accordion > .title { background: transparent; color: rgba(255, 255, 255, 0.8); } .ui.inverted.basic.styled.accordion > .title:hover, .ui.inverted.basic.styled.accordion .accordion > .title:hover { background: transparent; color: rgba(255, 255, 255, 0.9); } .ui.inverted.basic.styled.accordion[open] > .title, .ui.inverted.basic.styled.accordion .active.title, .ui.inverted.basic.styled.accordion .accordion[open] > .title, .ui.inverted.basic.styled.accordion .accordion .active.title { background: transparent; color: #ffffff; } .ui.tree.accordion:not(.styled) .title ~ .content, .ui.tree.accordion:not(.styled) .accordion .title ~ .content { padding: 0; } .ui.tree.accordion > .content, .ui.tree.accordion .accordion > .content { margin-left: 1.7em; } .ui.tree.accordion .accordion { margin-top: 0; } /******************************* Theme Overrides *******************************/ @font-face { font-family: Accordion; src: url("data:application/font-woff;base64,d09GRk9UVE8AAAREAAsAAAAABkAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAC7AAAAQoAAAE/j/fxwUZGVE0AAAQUAAAAHAAAAByNqvxQR0RFRgAAA/gAAAAcAAAAIAAnABhPUy8yAAABYAAAAEIAAABgTadW5mNtYXAAAAKMAAAAUQAAAWAFZuKDaGVhZAAAAQgAAAAyAAAANg8zT8toaGVhAAABPAAAABoAAAAkApkA5mhtdHgAAAQwAAAAEwAAABYBtwASbWF4cAAAAVgAAAAGAAAABgAGUABuYW1lAAABpAAAAOYAAAGq/HAhWXBvc3QAAALgAAAADAAAACAAAwAAeJxjYGRgYADi8KWRsvH8Nl8ZuJkYQOD838XvQPT9hGxNIOXJsJ0xD0hzMIClARzsCcoAAHicY2BkYGB88P8BkGQAg+0wBhywAgBgjgOAAAAAAFAAAAYAAHicY2BmOM84gYGVgYHRhzGNgYHBHUp/ZZBkaGFABYwCSJyANNcUBgcGhg+3GB/8fwCUfMCgAFIDV6AAhIwARVcMJwAAeJx1jrFOwzAURU/SNKgFIVgQ6uSRKWolZjaQOnQBqQNb2lpRpMqW3HTowhew8U9I/BU37WOjtmyfd/3utYEbvsn4G7lxRsmtcc4FD8YD6U/GhfjNeMglybjU/DQeM+FHrqwY2QsnzrgSnTjnmnvjgfSpcSF+Nh5yx7txKf3DeMwjX31soqajJdCoqLs26HzFq9yz1WVS6Zv9tk5nmv8Vl0pI7CRHXThmVPofS592bQxuVk3PGF+Ohk6WRhHhGNO3eTbSVhy0z1mra6HV91YyxdC5xgevFL9xq4Obr+MixlDxC/HTOrsAAHicY2BgYGaAYBkGRgYQiALyGMF8FgY7IM3FwMHABISMDAofbv3/+/8/WJXCh5tgNuP/x2A+RC8bUC0DUB8rWIgNiJkY8AJm/NJDHgAALqoOxgAAAHicY2BmwAsAAH0ABHicPY7BSsNAEIZnkk2zlhg1JKAYxOrJi6RepMdC8SKefAJP4kVBzCtkNw7ZjeK1j9C38Rn6CO5CDrppigwMM8P/f/8gMAaIGL4+vD09PwJ6gLCwp2AnaM88e+7bQ0aRTxE7GcPRffJL9D9EIX2bW+sFOXzu5QD7OSwPcuA5Xiew05N8CIDDLiSQuTqGSVmU0/KqKG+Kxaxv8+llMURvHwBAgRJrfEeCEaLns9HdRxzHP/FqaV4yaptWK25SkwZKu4Va0rUSWjYVVbz7CqmqhZBSiNodqGqk5l2vFqrW1PJ4tWbGqZxVKa31htA6gmN2aTBwBobzuYsU1YYkGheyZVBqLjKKxn8cSmvuAAB4nGNgZGBg4AFiAQYJBiYgzQLEIJoRggEFbQBAAAAAAQAAAADeTO04AAAAAM/9o+4AAAAA32BrKXicY2BAAEYQsZ1BiIEBAAPpAMsA") format("woff"); font-weight: normal; font-style: normal; } /* Dropdown Icon */ .ui.accordion .ui.header > .dropdown.icon, .ui.accordion .title > .dropdown.icon, .ui.accordion .accordion .title > .dropdown.icon { font-family: Accordion; line-height: 1; -webkit-backface-visibility: hidden; backface-visibility: hidden; font-weight: normal; font-style: normal; text-align: center; } .ui.accordion .ui.header > .dropdown.icon::before, .ui.accordion .title > .dropdown.icon::before, .ui.accordion .accordion .title > .dropdown.icon::before { content: "\f0da" /* rtl: "\f0d9" */; } /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/accordion.js ================================================ /*! * # Fomantic-UI 2.9.4 - Accordion * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.accordion = function (parameters) { var $allModules = $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.accordion.settings, parameters) : $.extend({}, $.fn.accordion.settings), className = settings.className, namespace = settings.namespace, selector = settings.selector, error = settings.error, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $title = $module.find(selector.title), $content = $module.find(selector.content), element = this, instance = $module.data(moduleNamespace), observer, module ; module = { initialize: function () { module.debug('Initializing', $module); module.bind.events(); if (settings.observeChanges) { module.observeChanges(); } module.instantiate(); }, instantiate: function () { instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.debug('Destroying previous instance', $module); $module .off(eventNamespace) .removeData(moduleNamespace) ; }, refresh: function () { $title = $module.find(selector.title); $content = $module.find(selector.content); }, observeChanges: function () { if ('MutationObserver' in window) { observer = new MutationObserver(function (mutations) { module.debug('DOM tree modified, updating selector cache'); module.refresh(); }); observer.observe(element, { childList: true, subtree: true, }); module.debug('Setting up mutation observer', observer); } }, bind: { events: function () { module.debug('Binding delegated events'); $module .on(settings.on + eventNamespace, selector.trigger, module.event.click) ; }, }, event: { click: function (event) { if ($(event.target).closest(selector.ignore).length === 0) { module.toggle.call(this); } }, }, toggle: function (query) { var $activeTitle = query !== undefined ? (typeof query === 'number' ? $title.eq(query) : $(query).closest(selector.title)) : $(this).closest(selector.title), $activeContent = $activeTitle.next($content), isAnimating = $activeContent.hasClass(className.animating), isActive = $activeContent.hasClass(className.active), isOpen = isActive && !isAnimating, isOpening = !isActive && isAnimating ; module.debug('Toggling visibility of content', $activeTitle); if (isOpen || isOpening) { if (settings.collapsible) { module.close.call($activeTitle); } else { module.debug('Cannot close accordion content collapsing is disabled'); } } else { module.open.call($activeTitle); } }, open: function (query) { var $activeTitle = query !== undefined ? (typeof query === 'number' ? $title.eq(query) : $(query).closest(selector.title)) : $(this).closest(selector.title), $activeContent = $activeTitle.next($content), isAnimating = $activeContent.hasClass(className.animating), isActive = $activeContent.hasClass(className.active), isOpen = isActive || isAnimating ; if (isOpen) { module.debug('Accordion already open, skipping', $activeContent); return; } module.debug('Opening accordion content', $activeTitle); settings.onOpening.call($activeContent); settings.onChanging.call($activeContent); if (settings.exclusive) { module.closeOthers.call($activeTitle); } $activeTitle .addClass(className.active) ; $activeContent .stop(true, true) .addClass(className.animating) ; if (settings.animateChildren) { if ($.fn.transition !== undefined) { $activeContent .children() .transition({ animation: 'fade in', queue: false, useFailSafe: true, debug: settings.debug, verbose: settings.verbose, silent: settings.silent, duration: settings.duration, skipInlineHidden: true, onComplete: function () { $activeContent.children().removeClass(className.transition); }, }) ; } else { $activeContent .children() .stop(true, true) .animate({ opacity: 1, }, settings.duration, module.resetOpacity); } } $activeContent .slideDown(settings.duration, settings.easing, function () { $activeContent .removeClass(className.animating) .addClass(className.active) ; module.reset.display.call(this); settings.onOpen.call(this); settings.onChange.call(this); }) ; }, close: function (query) { var $activeTitle = query !== undefined ? (typeof query === 'number' ? $title.eq(query) : $(query).closest(selector.title)) : $(this).closest(selector.title), $activeContent = $activeTitle.next($content), isAnimating = $activeContent.hasClass(className.animating), isActive = $activeContent.hasClass(className.active), isOpening = !isActive && isAnimating, isClosing = isActive && isAnimating ; if ((isActive || isOpening) && !isClosing) { module.debug('Closing accordion content', $activeContent); settings.onClosing.call($activeContent); settings.onChanging.call($activeContent); $activeTitle .removeClass(className.active) ; $activeContent .stop(true, true) .addClass(className.animating) ; if (settings.animateChildren) { if ($.fn.transition !== undefined) { $activeContent .children() .transition({ animation: 'fade out', queue: false, useFailSafe: true, debug: settings.debug, verbose: settings.verbose, silent: settings.silent, duration: settings.duration, skipInlineHidden: true, }) ; } else { $activeContent .children() .stop(true, true) .animate({ opacity: 0, }, settings.duration, module.resetOpacity); } } $activeContent .slideUp(settings.duration, settings.easing, function () { $activeContent .removeClass(className.animating) .removeClass(className.active) ; module.reset.display.call(this); settings.onClose.call(this); settings.onChange.call(this); }) ; } }, closeOthers: function (index) { var $activeTitle = index !== undefined ? $title.eq(index) : $(this).closest(selector.title), $parentTitles = $activeTitle.parents(selector.content).prev(selector.title), $activeAccordion = $activeTitle.closest(selector.accordion), activeSelector = selector.title + '.' + className.active + ':visible', activeContent = selector.content + '.' + className.active + ':visible', $openTitles, $nestedTitles, $openContents ; if (settings.closeNested) { $openTitles = $activeAccordion.find(activeSelector).not($parentTitles); $openContents = $openTitles.next($content); } else { $openTitles = $activeAccordion.find(activeSelector).not($parentTitles); $nestedTitles = $activeAccordion.find(activeContent).find(activeSelector).not($parentTitles); $openTitles = $openTitles.not($nestedTitles); $openContents = $openTitles.next($content); } if ($openTitles.length > 0) { module.debug('Exclusive enabled, closing other content', $openTitles); $openTitles .removeClass(className.active) ; $openContents .removeClass(className.animating) .stop(true, true) ; if (settings.animateChildren) { if ($.fn.transition !== undefined) { $openContents .children() .transition({ animation: 'fade out', useFailSafe: true, debug: settings.debug, verbose: settings.verbose, silent: settings.silent, duration: settings.duration, skipInlineHidden: true, }) ; } else { $openContents .children() .stop(true, true) .animate({ opacity: 0, }, settings.duration, module.resetOpacity); } } $openContents .slideUp(settings.duration, settings.easing, function () { $(this).removeClass(className.active); module.reset.display.call(this); }) ; } }, reset: { display: function () { module.verbose('Removing inline display from element', this); var $element = $(this); $element.css('display', ''); if ($element.attr('style') === '') { $element .attr('style', '') .removeAttr('style') ; } }, opacity: function () { module.verbose('Removing inline opacity from element', this); var $element = $(this); $element.css('opacity', ''); if ($element.attr('style') === '') { $element .attr('style', '') .removeAttr('style') ; } }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { module.debug('Changing internal', name, value); if (value !== undefined) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else { module[name] = value; } } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.accordion.settings = { name: 'Accordion', namespace: 'accordion', silent: false, debug: false, verbose: false, performance: true, on: 'click', // event on title that opens accordion observeChanges: true, // whether accordion should automatically refresh on DOM insertion exclusive: true, // whether a single accordion content panel should be open at once collapsible: true, // whether accordion content can be closed closeNested: false, // whether nested content should be closed when a panel is closed animateChildren: true, // whether children opacity should be animated duration: 350, // duration of animation easing: 'easeOutQuad', // easing equation for animation onOpening: function () {}, // callback before open animation onClosing: function () {}, // callback before closing animation onChanging: function () {}, // callback before closing or opening animation onOpen: function () {}, // callback after open animation onClose: function () {}, // callback after closing animation onChange: function () {}, // callback after closing or opening animation error: { method: 'The method you called is not defined', }, className: { active: 'active', animating: 'animating', transition: 'transition', }, selector: { accordion: '.accordion', title: '.title', trigger: '.title', ignore: '.ui.dropdown', content: '.content', }, }; // Adds easing $.extend($.easing, { easeOutQuad: function (x) { return 1 - (1 - x) * (1 - x); }, }); })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/ad.css ================================================ /*! * # Fomantic-UI 2.9.4 - Ad * https://github.com/fomantic/Fomantic-UI/ * * * Copyright 2013 Contributors * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Advertisement *******************************/ .ui.ad { display: block; overflow: hidden; margin: 1em 0; } .ui.ad:first-child { margin: 0; } .ui.ad:last-child { margin: 0; } .ui.ad iframe { margin: 0; padding: 0; border: none; overflow: hidden; } /* -------------- Common --------------- */ /* Leaderboard */ .ui.leaderboard.ad { width: 728px; height: 90px; } /* Medium Rectangle */ .ui[class*="medium rectangle"].ad { width: 300px; height: 250px; } /* Large Rectangle */ .ui[class*="large rectangle"].ad { width: 336px; height: 280px; } /* Half Page */ .ui[class*="half page"].ad { width: 300px; height: 600px; } /* -------------- Square --------------- */ /* Square */ .ui.square.ad { width: 250px; height: 250px; } /* Small Square */ .ui[class*="small square"].ad { width: 200px; height: 200px; } /* -------------- Rectangle --------------- */ /* Small Rectangle */ .ui[class*="small rectangle"].ad { width: 180px; height: 150px; } /* Vertical Rectangle */ .ui[class*="vertical rectangle"].ad { width: 240px; height: 400px; } /* -------------- Button --------------- */ .ui.button.ad { width: 120px; height: 90px; } .ui[class*="square button"].ad { width: 125px; height: 125px; } .ui[class*="small button"].ad { width: 120px; height: 60px; } /* -------------- Skyscrapers --------------- */ /* Skyscraper */ .ui.skyscraper.ad { width: 120px; height: 600px; } /* Wide Skyscraper */ .ui[class*="wide skyscraper"].ad { width: 160px; } /* -------------- Banners --------------- */ /* Banner */ .ui.banner.ad { width: 468px; height: 60px; } /* Vertical Banner */ .ui[class*="vertical banner"].ad { width: 120px; height: 240px; } /* Top Banner */ .ui[class*="top banner"].ad { width: 930px; height: 180px; } /* Half Banner */ .ui[class*="half banner"].ad { width: 234px; height: 60px; } /* -------------- Boards --------------- */ /* Leaderboard */ .ui[class*="large leaderboard"].ad { width: 970px; height: 90px; } /* Billboard */ .ui.billboard.ad { width: 970px; height: 250px; } /* -------------- Panorama --------------- */ /* Panorama */ .ui.panorama.ad { width: 980px; height: 120px; } /* -------------- Netboard --------------- */ /* Netboard */ .ui.netboard.ad { width: 580px; height: 400px; } /* -------------- Mobile --------------- */ /* Large Mobile Banner */ .ui[class*="large mobile banner"].ad { width: 320px; height: 100px; } /* Mobile Leaderboard */ .ui[class*="mobile leaderboard"].ad { width: 320px; height: 50px; } /******************************* Types *******************************/ /* Mobile Sizes */ .ui.mobile.ad { display: none; } @media only screen and (max-width: 767.98px) { .ui.mobile.ad { display: block; } } /******************************* Variations *******************************/ .ui.centered.ad { margin-left: auto; margin-right: auto; } .ui.test.ad { position: relative; background: #545454; } .ui.test.ad::after { position: absolute; top: 50%; left: 50%; width: 100%; text-align: center; transform: translateX(-50%) translateY(-50%); content: "Ad"; color: #fff; font-size: 1em; font-weight: bold; } .ui.mobile.test.ad::after { font-size: 0.85714286em; } .ui.test.ad[data-text]::after { content: attr(data-text); } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/api.js ================================================ /*! * # Fomantic-UI 2.9.4 - API * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isWindow(obj) { return obj !== null && obj === obj.window; } function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.api = function (parameters) { var // use window context if none specified $allModules = isFunction(this) ? $(window) : $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $(context); } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : window; } } return $context; }, returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.api.settings, parameters) : $.extend({}, $.fn.api.settings), // internal aliases regExp = settings.regExp, namespace = settings.namespace, metadata = settings.metadata, selector = settings.selector, error = settings.error, className = settings.className, // define namespaces for modules eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, // element that creates request $module = $(this), $form = $module.closest(selector.form), // context used for state $context = settings.stateContext ? contextCheck(settings.stateContext, window) : $module, // request details ajaxSettings, requestSettings, url, data, requestStartTime, originalData, // standard module element = this, context = $context[0], instance = $module.data(moduleNamespace), module ; module = { initialize: function () { if (!methodInvoked) { originalData = settings.data; module.bind.events(); } module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, instance) ; }, destroy: function () { module.verbose('Destroying previous module for', element); $module .removeData(moduleNamespace) .off(eventNamespace) ; }, bind: { events: function () { var triggerEvent = module.get.event() ; if (triggerEvent) { module.verbose('Attaching API events to element', triggerEvent); $module .on(triggerEvent + eventNamespace, module.event.trigger) ; } else if (settings.on === 'now') { module.debug('Querying API endpoint immediately'); module.query(); } }, }, decode: { json: function (response) { if (response !== undefined && typeof response === 'string') { try { response = JSON.parse(response); } catch (e) { // isn't json string } } return response; }, }, read: { cachedResponse: function (url) { var response ; if (window.Storage === undefined) { module.error(error.noStorage); return; } response = sessionStorage.getItem(url + module.get.normalizedData()); module.debug('Using cached response', url, settings.data, response); response = module.decode.json(response); return response; }, }, write: { cachedResponse: function (url, response) { if (window.Storage === undefined) { module.error(error.noStorage); return; } if ($.isPlainObject(response)) { response = JSON.stringify(response); } sessionStorage.setItem(url + module.get.normalizedData(), response); module.verbose('Storing cached response for url', url, settings.data, response); }, }, query: function () { if (module.is.disabled()) { module.debug('Element is disabled API request aborted'); return; } if (module.is.loading()) { if (settings.interruptRequests) { module.debug('Interrupting previous request'); module.abort(); } else { module.debug('Cancelling request, previous request is still pending'); return; } } // pass element metadata to url (value, text) if (settings.defaultData) { $.extend(true, settings.urlData, module.get.defaultData()); } // Add form content if (settings.serializeForm) { settings.data = module.add.formData(originalData || settings.data); } // call beforesend and get any settings changes requestSettings = module.get.settings(); // check if before send cancelled request if (requestSettings === false) { module.cancelled = true; module.error(error.beforeSend); return; } module.cancelled = false; // get url url = module.get.templatedURL(); if (!url && !module.is.mocked()) { module.error(error.missingURL); return; } // replace variables url = module.add.urlData(url); // missing url parameters if (!url && !module.is.mocked()) { return; } requestSettings.url = settings.base + url; // look for jQuery ajax parameters in settings ajaxSettings = $.extend(true, {}, settings, { type: settings.method || settings.type, data: data, url: settings.base + url, beforeSend: settings.beforeXHR, success: function () {}, failure: function () {}, complete: function () {}, }); module.debug('Querying URL', ajaxSettings.url); module.verbose('Using AJAX settings', ajaxSettings); if (settings.cache === 'local' && module.read.cachedResponse(url)) { module.debug('Response returned from local cache'); module.request = module.create.request(); module.request.resolveWith(context, [module.read.cachedResponse(url)]); return; } if (!settings.throttle) { module.debug('Sending request', data, ajaxSettings.method); module.send.request(); } else { if (!settings.throttleFirstRequest && !module.timer) { module.debug('Sending request', data, ajaxSettings.method); module.send.request(); module.timer = setTimeout(function () {}, settings.throttle); } else { module.debug('Throttling request', settings.throttle); clearTimeout(module.timer); module.timer = setTimeout(function () { if (module.timer) { delete module.timer; } module.debug('Sending throttled request', data, ajaxSettings.method); module.send.request(); }, settings.throttle); } } }, should: { removeError: function () { return settings.hideError === true || (settings.hideError === 'auto' && !module.is.form()); }, }, is: { disabled: function () { return $module.filter(selector.disabled).length > 0; }, expectingJSON: function () { return settings.dataType === 'json' || settings.dataType === 'jsonp'; }, form: function () { return $module.is('form') || $context.is('form'); }, mocked: function () { return settings.mockResponse || settings.mockResponseAsync || settings.response || settings.responseAsync; }, input: function () { return $module.is('input'); }, loading: function () { return module.request ? module.request.state() === 'pending' : false; }, abortedRequest: function (xhr) { if (xhr && xhr.readyState !== undefined && xhr.readyState === 0) { module.verbose('XHR request determined to be aborted'); return true; } module.verbose('XHR request was not aborted'); return false; }, validResponse: function (response) { if (!module.is.expectingJSON() || !isFunction(settings.successTest)) { module.verbose('Response is not JSON, skipping validation', settings.successTest, response); return true; } module.debug('Checking JSON returned success', settings.successTest, response); if (settings.successTest(response)) { module.debug('Response passed success test', response); return true; } module.debug('Response failed success test', response); return false; }, }, was: { cancelled: function () { return module.cancelled || false; }, successful: function () { return module.request && module.request.state() === 'resolved'; }, failure: function () { return module.request && module.request.state() === 'rejected'; }, complete: function () { return module.request && (module.request.state() === 'resolved' || module.request.state() === 'rejected'); }, }, add: { urlData: function (url, urlData) { var requiredVariables, optionalVariables ; if (url) { requiredVariables = url.match(regExp.required); optionalVariables = url.match(regExp.optional); urlData = urlData || settings.urlData; if (requiredVariables) { module.debug('Looking for required URL variables', requiredVariables); $.each(requiredVariables, function (index, templatedString) { var // allow legacy {$var} style variable = templatedString.indexOf('$') !== -1 ? templatedString.slice(2, -1) : templatedString.slice(1, -1), value = $.isPlainObject(urlData) && urlData[variable] !== undefined ? urlData[variable] : ($module.data(variable) !== undefined ? $module.data(variable) : ($context.data(variable) !== undefined // eslint-disable-line unicorn/no-nested-ternary ? $context.data(variable) : urlData[variable])) ; // remove value if (value === undefined) { module.error(error.requiredParameter, variable, url); url = false; return false; } module.verbose('Found required variable', variable, value); value = settings.encodeParameters ? module.get.urlEncodedValue(value) : value; url = url.replace(templatedString, value); }); } if (optionalVariables) { module.debug('Looking for optional URL variables', requiredVariables); $.each(optionalVariables, function (index, templatedString) { var // allow legacy {/$var} style variable = templatedString.indexOf('$') !== -1 ? templatedString.slice(3, -1) : templatedString.slice(2, -1), value = $.isPlainObject(urlData) && urlData[variable] !== undefined ? urlData[variable] : ($module.data(variable) !== undefined ? $module.data(variable) : ($context.data(variable) !== undefined // eslint-disable-line unicorn/no-nested-ternary ? $context.data(variable) : urlData[variable])) ; // optional replacement if (value !== undefined) { module.verbose('Optional variable Found', variable, value); url = url.replace(templatedString, value); } else { module.verbose('Optional variable not found', variable); // remove preceding slash if set url = url.indexOf('/' + templatedString) !== -1 ? url.replace('/' + templatedString, '') : url.replace(templatedString, ''); } }); } } return url; }, formData: function (data) { var formData = {}, hasOtherData, useFormDataApi = settings.serializeForm === 'formdata' ; data = data || originalData || settings.data; hasOtherData = $.isPlainObject(data); if (useFormDataApi) { formData = new FormData($form[0]); settings.processData = settings.processData !== undefined ? settings.processData : false; settings.contentType = settings.contentType !== undefined ? settings.contentType : false; } else { var formArray = $form.serializeArray(), pushes = {}, pushValues = {}, build = function (base, key, value) { base[key] = value; return base; } ; // add files $.each($('input[type="file"]', $form), function (i, tag) { $.each($(tag)[0].files, function (j, file) { formArray.push({ name: tag.name, value: file }); }); }); $.each(formArray, function (i, el) { if (!regExp.validate.test(el.name)) { return; } var isCheckbox = $('[name="' + el.name + '"]', $form).attr('type') === 'checkbox', floatValue = parseFloat(el.value), value = (isCheckbox && el.value === 'on') || el.value === 'true' || (String(floatValue) === el.value ? floatValue : (el.value === 'false' ? false : el.value)), nameKeys = el.name.match(regExp.key) || [], pushKey = el.name.replace(/\[]$/, '') ; if (!(pushKey in pushes)) { pushes[pushKey] = 0; pushValues[pushKey] = value; } else if (Array.isArray(pushValues[pushKey])) { pushValues[pushKey].push(value); } else { pushValues[pushKey] = [pushValues[pushKey], value]; } if (pushKey.indexOf('[]') === -1) { value = pushValues[pushKey]; } while (nameKeys.length > 0) { var k = nameKeys.pop(); if (k === '' && !Array.isArray(value)) { // foo[] value = build([], pushes[pushKey]++, value); } else if (regExp.fixed.test(k)) { // foo[n] value = build([], k, value); } else if (regExp.named.test(k)) { // foo; foo[bar] value = build({}, k, value); } } formData = $.extend(true, formData, value); }); } if (hasOtherData) { module.debug('Extending existing data with form data', data, formData); if (useFormDataApi) { $.each(Object.keys(data), function (i, el) { formData.append(el, data[el]); }); data = formData; } else { data = $.extend(true, {}, data, formData); } } else { module.debug('Adding form data', formData); data = formData; } return data; }, }, send: { request: function () { module.set.loading(); module.request = module.create.request(); if (module.is.mocked()) { module.mockedXHR = module.create.mockedXHR(); } else { module.xhr = module.create.xhr(); } settings.onRequest.call(context, module.request, module.xhr); }, }, event: { trigger: function (event) { module.query(); if (event.type === 'submit' || event.type === 'click') { event.preventDefault(); } }, xhr: { always: function () { // nothing special }, done: function (response, textStatus, xhr) { var context = this, elapsedTime = Date.now() - requestStartTime, timeLeft = settings.loadingDuration - elapsedTime, translatedResponse = isFunction(settings.onResponse) ? (module.is.expectingJSON() && !settings.rawResponse ? settings.onResponse.call(context, $.extend(true, {}, response)) : settings.onResponse.call(context, response)) : false ; timeLeft = timeLeft > 0 ? timeLeft : 0; if (translatedResponse) { module.debug('Modified API response in onResponse callback', settings.onResponse, translatedResponse, response); response = translatedResponse; } if (timeLeft > 0) { module.debug('Response completed early delaying state change by', timeLeft); } setTimeout(function () { if (module.is.validResponse(response)) { module.request.resolveWith(context, [response, xhr]); } else { module.request.rejectWith(context, [xhr, 'invalid']); } }, timeLeft); }, fail: function (xhr, status, httpMessage) { var context = this, elapsedTime = Date.now() - requestStartTime, timeLeft = settings.loadingDuration - elapsedTime ; timeLeft = timeLeft > 0 ? timeLeft : 0; if (timeLeft > 0) { module.debug('Response completed early delaying state change by', timeLeft); } setTimeout(function () { if (module.is.abortedRequest(xhr)) { module.request.rejectWith(context, [xhr, 'aborted', httpMessage]); } else { module.request.rejectWith(context, [xhr, 'error', status, httpMessage]); } }, timeLeft); }, }, request: { done: function (response, xhr) { module.debug('Successful API Response', response); if (settings.cache === 'local' && url) { module.write.cachedResponse(url, response); module.debug('Saving server response locally', module.cache); } settings.onSuccess.call(context, response, $module, xhr); }, complete: function (firstParameter, secondParameter) { var xhr, response ; // have to guess callback parameters based on request success if (module.was.successful()) { response = firstParameter; xhr = secondParameter; } else { xhr = firstParameter; response = module.get.responseFromXHR(xhr); } module.remove.loading(); settings.onComplete.call(context, response, $module, xhr); }, fail: function (xhr, status, httpMessage) { var // pull response from xhr if available response = module.get.responseFromXHR(xhr), errorMessage = module.get.errorFromRequest(response, status, httpMessage) ; if (status === 'aborted') { module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage); settings.onAbort.call(context, status, $module, xhr); return true; } if (status === 'invalid') { module.debug('JSON did not pass success test. A server-side error has most likely occurred', response); } else if (status === 'error') { if (xhr !== undefined) { module.debug('XHR produced a server error', status, httpMessage); // make sure we have an error to display to console if ((xhr.status < 200 || xhr.status >= 300) && httpMessage !== undefined && httpMessage !== '') { module.error(error.statusMessage + httpMessage, ajaxSettings.url); } settings.onError.call(context, errorMessage, $module, xhr); } } if (settings.errorDuration && status !== 'aborted') { module.debug('Adding error state'); module.set.error(); if (module.should.removeError()) { setTimeout(function () { module.remove.error(); }, settings.errorDuration); } } module.debug('API Request failed', errorMessage, xhr); settings.onFailure.call(context, response, $module, xhr); }, }, }, create: { request: function () { // api request promise return $.Deferred() .always(module.event.request.complete) .done(module.event.request.done) .fail(module.event.request.fail) ; }, mockedXHR: function () { var // xhr does not simulate these properties of xhr but must return them textStatus = false, status = false, httpMessage = false, responder = settings.mockResponse || settings.response, asyncResponder = settings.mockResponseAsync || settings.responseAsync, asyncCallback, response, mockedXHR ; mockedXHR = $.Deferred() .always(module.event.xhr.complete) .done(module.event.xhr.done) .fail(module.event.xhr.fail) ; if (responder) { if (isFunction(responder)) { module.debug('Using specified synchronous callback', responder); response = responder.call(context, requestSettings); } else { module.debug('Using settings specified response', responder); response = responder; } // simulating response mockedXHR.resolveWith(context, [response, textStatus, { responseText: response }]); } else if (isFunction(asyncResponder)) { asyncCallback = function (response) { module.debug('Async callback returned response', response); if (response) { mockedXHR.resolveWith(context, [response, textStatus, { responseText: response }]); } else { mockedXHR.rejectWith(context, [{ responseText: response }, status, httpMessage]); } }; module.debug('Using specified async response callback', asyncResponder); asyncResponder.call(context, requestSettings, asyncCallback); } return mockedXHR; }, xhr: function () { var xhr ; // ajax request promise xhr = $.ajax(ajaxSettings) .always(module.event.xhr.always) .done(module.event.xhr.done) .fail(module.event.xhr.fail) ; module.verbose('Created server request', xhr, ajaxSettings); return xhr; }, }, set: { error: function () { module.verbose('Adding error state to element', $context); $context.addClass(className.error); }, loading: function () { module.verbose('Adding loading state to element', $context); $context.addClass(className.loading); requestStartTime = Date.now(); }, }, remove: { error: function () { module.verbose('Removing error state from element', $context); $context.removeClass(className.error); }, loading: function () { module.verbose('Removing loading state from element', $context); $context.removeClass(className.loading); }, }, get: { normalizedData: function () { return typeof settings.data === 'string' ? settings.data : JSON.stringify(settings.data, Object.keys(settings.data).sort()); }, responseFromXHR: function (xhr) { return $.isPlainObject(xhr) ? (module.is.expectingJSON() ? module.decode.json(xhr.responseText) : xhr.responseText) : false; }, errorFromRequest: function (response, status, httpMessage) { return $.isPlainObject(response) && response.error !== undefined ? response.error // use json error message : (settings.error[status] !== undefined // use server error message ? settings.error[status] : httpMessage); }, request: function () { return module.request || false; }, xhr: function () { return module.xhr || false; }, settings: function () { var runSettings ; runSettings = settings.beforeSend.call($module, settings); if (runSettings) { if (runSettings.success !== undefined) { module.debug('Legacy success callback detected', runSettings); module.error(error.legacyParameters, runSettings.success); runSettings.onSuccess = runSettings.success; } if (runSettings.failure !== undefined) { module.debug('Legacy failure callback detected', runSettings); module.error(error.legacyParameters, runSettings.failure); runSettings.onFailure = runSettings.failure; } if (runSettings.complete !== undefined) { module.debug('Legacy complete callback detected', runSettings); module.error(error.legacyParameters, runSettings.complete); runSettings.onComplete = runSettings.complete; } } if (runSettings === undefined) { module.error(error.noReturnedValue); } if (runSettings === false) { return runSettings; } return runSettings !== undefined ? $.extend(true, {}, runSettings) : $.extend(true, {}, settings); }, urlEncodedValue: function (value) { var decodedValue = window.decodeURIComponent(value), encodedValue = window.encodeURIComponent(value), alreadyEncoded = decodedValue !== value ; if (alreadyEncoded) { module.debug('URL value is already encoded, avoiding double encoding', value); return value; } module.verbose('Encoding value using encodeURIComponent', value, encodedValue); return encodedValue; }, defaultData: function () { var data = {} ; if (!isWindow(element)) { if (module.is.input()) { data.value = $module.val(); } else if (!module.is.form()) { data.text = $module.text(); } } return data; }, event: function () { if (isWindow(element) || settings.on === 'now') { module.debug('API called without element, no events attached'); return false; } if (settings.on === 'auto') { if ($module.is('input')) { return element.oninput !== undefined ? 'input' : (element.onpropertychange !== undefined ? 'propertychange' : 'keyup'); } if ($module.is('form')) { return 'submit'; } return 'click'; } return settings.on; }, templatedURL: function (action) { action = action || settings.action || $module.data(metadata.action) || false; url = settings.url || $module.data(metadata.url) || false; if (url) { module.debug('Using specified url', url); return url; } if (action) { module.debug('Looking up url for action', action, settings.api); if (settings.api[action] === undefined && !module.is.mocked()) { module.error(error.missingAction, settings.action, settings.api); return; } url = settings.api[action]; } else if (module.is.form()) { url = $module.attr('action') || $context.attr('action') || false; module.debug('No url or action specified, defaulting to form action', url); } return url; }, }, abort: function () { var xhr = module.get.xhr() ; if (xhr && xhr.state() !== 'resolved') { module.debug('Cancelling API request'); xhr.abort(); } }, // reset state reset: function () { module.remove.error(); module.remove.loading(); }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', // 'Element' : element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.api = $.fn.api; $.api.settings = { name: 'API', namespace: 'api', debug: false, verbose: false, performance: true, // object containing all templates endpoints api: {}, // whether to cache responses cache: true, // whether new requests should abort previous requests interruptRequests: true, // event binding on: 'auto', // context for applying state classes stateContext: false, // duration for loading state loadingDuration: 0, // whether to hide errors after a period of time hideError: 'auto', // duration for error state errorDuration: 2000, // whether parameters should be encoded with encodeURIComponent encodeParameters: true, // API action to use action: false, // templated URL to use url: false, // base URL to apply to all endpoints base: '', // data that will urlData: {}, // whether to add default data to url data defaultData: true, // whether to serialize closest form // use true to convert complex named keys like a[b][1][c][] into a nested object // use 'formdata' for formdata web api serializeForm: false, // how long to wait before request should occur throttle: 0, // whether to throttle first request or only repeated throttleFirstRequest: true, // standard ajax settings method: 'get', data: {}, dataType: 'json', // mock response mockResponse: false, mockResponseAsync: false, // aliases for mock response: false, responseAsync: false, // whether onResponse should work with response value without force converting into an object rawResponse: true, // callbacks before request beforeSend: function (settings) { return settings; }, beforeXHR: function (xhr) {}, onRequest: function (promise, xhr) {}, // after request onResponse: false, // function(response) { }, // response was successful, if JSON passed validation onSuccess: function (response, $module) {}, // request finished without aborting onComplete: function (response, $module) {}, // failed JSON success test onFailure: function (response, $module) {}, // server error onError: function (errorMessage, $module) {}, // request aborted onAbort: function (errorMessage, $module) {}, successTest: false, // errors error: { beforeSend: 'The before send function has aborted the request', error: 'There was an error with your request', exitConditions: 'API Request Aborted. Exit conditions met', JSONParse: 'JSON could not be parsed during error handling', legacyParameters: 'You are using legacy API success callback names', method: 'The method you called is not defined', missingAction: 'API action used but no url was defined', missingURL: 'No URL specified for api event', noReturnedValue: 'The beforeSend callback must return a settings object, beforeSend ignored.', noStorage: 'Caching responses locally requires session storage', parseError: 'There was an error parsing your request', requiredParameter: 'Missing a required URL parameter: ', statusMessage: 'Server gave an error: ', timeout: 'Your request timed out', }, regExp: { required: /{\$*[\da-z]+}/gi, optional: /{\/\$*[\da-z]+}/gi, validate: /^[_a-z][\w-]*(?:\[[\w-]*])*$/i, key: /[\w-]+|(?=\[])/gi, push: /^$/, fixed: /^\d+$/, named: /^[\w-]+$/i, }, className: { loading: 'loading', error: 'error', }, selector: { disabled: '.disabled', form: 'form', }, metadata: { action: 'action', url: 'url', }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/breadcrumb.css ================================================ /*! * # Fomantic-UI 2.9.4 - Breadcrumb * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Breadcrumb *******************************/ .ui.breadcrumb { line-height: 1.4285em; display: inline-block; margin: 0 0; vertical-align: middle; } .ui.breadcrumb:first-child { margin-top: 0; } .ui.breadcrumb:last-child { margin-bottom: 0; } /******************************* Content *******************************/ /* Divider */ .ui.breadcrumb .divider { display: inline-block; opacity: 0.7; margin: 0 0.21428571rem; font-size: 0.92857143em; color: rgba(0, 0, 0, 0.4); vertical-align: baseline; } /* Link */ .ui.breadcrumb a { color: #4183c4; } .ui.breadcrumb a:hover { color: #1e70bf; } /* Icon Divider */ .ui.breadcrumb .icon.divider { font-size: 0.85714286em; vertical-align: baseline; } /* Section */ .ui.breadcrumb a.section { cursor: pointer; } .ui.breadcrumb .section { display: inline-block; margin: 0; padding: 0; } /* Loose Coupling */ .ui.breadcrumb.segment { display: inline-block; padding: 0.78571429em 1em; } /* Inverted */ .ui.inverted.breadcrumb { color: #dcddde; } .ui.inverted.breadcrumb > .active.section { color: #fff; } .ui.inverted.breadcrumb > .divider { color: rgba(255, 255, 255, 0.7); } /******************************* States *******************************/ .ui.breadcrumb .active.section { font-weight: bold; } /******************************* Variations *******************************/ .ui.breadcrumb { font-size: 1rem; } .ui.mini.breadcrumb { font-size: 0.78571429rem; } .ui.tiny.breadcrumb { font-size: 0.85714286rem; } .ui.small.breadcrumb { font-size: 0.92857143rem; } .ui.large.breadcrumb { font-size: 1.14285714rem; } .ui.big.breadcrumb { font-size: 1.28571429rem; } .ui.huge.breadcrumb { font-size: 1.42857143rem; } .ui.massive.breadcrumb { font-size: 1.71428571rem; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/button.css ================================================ /*! * # Fomantic-UI 2.9.4 - Button * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Button *******************************/ .ui.button { cursor: pointer; display: inline-block; min-height: 1em; outline: none; border: none; vertical-align: baseline; background: #e0e1e2 none; color: rgba(0, 0, 0, 0.6); font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; margin: 0 0.25em 0 0; padding: 0.78571429em 1.5em 0.78571429em; text-transform: none; text-shadow: none; font-weight: bold; line-height: 1em; font-style: normal; text-align: center; text-decoration: none; border-radius: 0.28571429rem; box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset; -webkit-user-select: none; -ms-user-select: none; user-select: none; transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, background 0.1s ease; will-change: auto; -webkit-tap-highlight-color: transparent; } /******************************* States *******************************/ /* -------------- Hover --------------- */ .ui.button:hover { background-color: #cacbcd; background-image: none; box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset; color: rgba(0, 0, 0, 0.8); } .ui.button:hover .icon { opacity: 0.85; } /* -------------- Focus --------------- */ .ui.button:focus { background-color: #cacbcd; color: rgba(0, 0, 0, 0.8); background-image: none; box-shadow: ""; } .ui.button:focus .icon { opacity: 0.85; } /* -------------- Down --------------- */ .ui.button:active, .ui.active.button:active { background-color: #babbbc; background-image: ""; color: rgba(0, 0, 0, 0.9); box-shadow: none; } /* -------------- Active --------------- */ .ui.active.button { background-color: #c0c1c2; background-image: none; box-shadow: 0 0 0 1px transparent inset; color: rgba(0, 0, 0, 0.95); } .ui.active.button:hover { background-color: #c0c1c2; background-image: none; color: rgba(0, 0, 0, 0.95); } .ui.active.button:active { background-color: #c0c1c2; background-image: none; } /* -------------- Loading --------------- */ /* Specificity hack */ .ui.ui.ui.ui.ui.ui.loading.button { position: relative; cursor: default; text-shadow: none !important; color: transparent; opacity: 1; pointer-events: auto; transition: all 0s linear, opacity 0.1s ease; } .ui.loading.button::before { position: absolute; content: ""; top: 50%; left: 50%; margin: -0.64285714em 0 0 -0.64285714em; width: 1.28571429em; height: 1.28571429em; border-radius: 500rem; border: 0.2em solid rgba(0, 0, 0, 0.15); } .ui.loading.button::after { position: absolute; content: ""; top: 50%; left: 50%; margin: -0.64285714em 0 0 -0.64285714em; width: 1.28571429em; height: 1.28571429em; border-radius: 500rem; animation: loader 0.6s infinite linear; border: 0.2em solid currentColor; color: #fff; box-shadow: 0 0 0 1px transparent; } .ui.ui.ui.loading.button .label { background-color: transparent; border-color: transparent; color: transparent; } .ui.labeled.icon.loading.button .icon { background-color: transparent; box-shadow: none; } .ui.basic.loading.button:not(.inverted)::before { border-color: rgba(0, 0, 0, 0.1); } .ui.basic.loading.button:not(.inverted)::after { border-color: #767676; } /* ------------------- Disabled -------------------- */ .ui.buttons .disabled.button:not(.basic), .ui.disabled.button, .ui.button:disabled, .ui.disabled.button:hover, .ui.disabled.active.button { cursor: default; opacity: 0.45 !important; background-image: none; box-shadow: none; pointer-events: none !important; } /* Basic Group With Disabled */ .ui.basic.buttons .ui.disabled.button { border-color: rgba(34, 36, 38, 0.5); } /******************************* Types *******************************/ /* ------------------- Animated -------------------- */ .ui.animated.button { position: relative; overflow: hidden; padding-right: 0 !important; vertical-align: middle; z-index: 1; } .ui.animated.button .content { will-change: transform, opacity; } .ui.animated.button .visible.content { position: relative; margin-right: 1.5em; } .ui.animated.button .hidden.content { position: absolute; width: 100%; } /* Horizontal */ .ui.animated.button .visible.content, .ui.animated.button .hidden.content { transition: right 0.3s ease 0s; } .ui.animated.button .visible.content { left: auto; right: 0; } .ui.animated.button .hidden.content { top: 50%; left: auto; right: -100%; margin-top: -0.5em; } .ui.animated.button:focus .visible.content, .ui.animated.button:hover .visible.content { left: auto; right: 200%; } .ui.animated.button:focus .hidden.content, .ui.animated.button:hover .hidden.content { left: auto; right: 0; } /* Vertical */ .ui.vertical.animated.button .visible.content, .ui.vertical.animated.button .hidden.content { transition: top 0.3s ease, transform 0.3s ease; } .ui.vertical.animated.button .visible.content { transform: translateY(0); right: auto; } .ui.vertical.animated.button .hidden.content { top: -50%; left: 0; right: auto; } .ui.vertical.animated.button:focus .visible.content, .ui.vertical.animated.button:hover .visible.content { transform: translateY(200%); right: auto; } .ui.vertical.animated.button:focus .hidden.content, .ui.vertical.animated.button:hover .hidden.content { top: 50%; right: auto; } /* Fade */ .ui.fade.animated.button .visible.content, .ui.fade.animated.button .hidden.content { transition: opacity 0.3s ease, transform 0.3s ease; } .ui.fade.animated.button .visible.content { left: auto; right: auto; opacity: 1; transform: scale(1); } .ui.fade.animated.button .hidden.content { opacity: 0; left: 0; right: auto; transform: scale(1.5); } .ui.fade.animated.button:focus .visible.content, .ui.fade.animated.button:hover .visible.content { left: auto; right: auto; opacity: 0; transform: scale(0.75); } .ui.fade.animated.button:focus .hidden.content, .ui.fade.animated.button:hover .hidden.content { left: 0; right: auto; opacity: 1; transform: scale(1); } /* ------------------- Inverted -------------------- */ .ui.inverted.button { box-shadow: 0 0 0 2px #fff inset; background: transparent none; color: #fff; text-shadow: none !important; } /* Group */ .ui.inverted.buttons .button { margin: 0 0 0 -2px; } .ui.inverted.buttons .button:first-child { margin-left: 0; } .ui.inverted.vertical.buttons .button { margin: 0 0 -2px 0; } .ui.inverted.vertical.buttons .button:first-child { margin-top: 0; } /* States */ /* Hover */ .ui.inverted.button:hover { background: #fff; box-shadow: 0 0 0 2px #fff inset; color: rgba(0, 0, 0, 0.8); } /* Active / Focus */ .ui.inverted.button:focus, .ui.inverted.button.active { background: #fff; box-shadow: 0 0 0 2px #fff inset; color: rgba(0, 0, 0, 0.8); } /* Active Focus */ .ui.inverted.button.active:focus { background: #dcddde; box-shadow: 0 0 0 2px #dcddde inset; color: rgba(0, 0, 0, 0.8); } /* ------------------- Labeled Button -------------------- */ .ui.labeled.button:not(.icon) { display: inline-flex; flex-direction: row; background: none; padding: 0 !important; border: none; box-shadow: none; } .ui.labeled.button > .button { margin: 0; } .ui.labeled.button > .label { display: flex; align-items: center; margin: 0 0 0 -1px !important; font-size: 1em; padding: ""; border-color: rgba(34, 36, 38, 0.15); } /* Tag */ .ui.labeled.button > .tag.label::before { width: 1.85em; height: 1.85em; } /* Right */ .ui.labeled.button:not([class*="left labeled"]) > .button { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ui.labeled.button:not([class*="left labeled"]) > .label { border-top-left-radius: 0; border-bottom-left-radius: 0; } /* Left Side */ .ui[class*="left labeled"].button > .button { border-top-left-radius: 0; border-bottom-left-radius: 0; } .ui[class*="left labeled"].button > .label { border-top-right-radius: 0; border-bottom-right-radius: 0; } /* ------------------- Social -------------------- */ /* Facebook */ .ui.facebook.button { background-color: #3b5998; color: #fff; text-shadow: none; background-image: none; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.facebook.button:hover { background-color: #304d8a; color: #fff; text-shadow: none; } .ui.facebook.button:active { background-color: #2d4373; color: #fff; text-shadow: none; } /* Twitter */ .ui.twitter.button { background-color: #1da1f2; color: #fff; text-shadow: none; background-image: none; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.twitter.button:hover { background-color: #0298f3; color: #fff; text-shadow: none; } .ui.twitter.button:active { background-color: #0c85d0; color: #fff; text-shadow: none; } /* Google Plus */ .ui.google.plus.button { background-color: #dd4b39; color: #fff; text-shadow: none; background-image: none; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.google.plus.button:hover { background-color: #e0321c; color: #fff; text-shadow: none; } .ui.google.plus.button:active { background-color: #c23321; color: #fff; text-shadow: none; } /* Linked In */ .ui.linkedin.button { background-color: #0077b5; color: #fff; text-shadow: none; } .ui.linkedin.button:hover { background-color: #00669c; color: #fff; text-shadow: none; } .ui.linkedin.button:active { background-color: #005582; color: #fff; text-shadow: none; } /* YouTube */ .ui.youtube.button { background-color: #f00; color: #fff; text-shadow: none; background-image: none; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.youtube.button:hover { background-color: #e60000; color: #fff; text-shadow: none; } .ui.youtube.button:active { background-color: #cc0000; color: #fff; text-shadow: none; } /* Instagram */ .ui.instagram.button { background-color: #49769c; color: #fff; text-shadow: none; background-image: none; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.instagram.button:hover { background-color: #3d698e; color: #fff; text-shadow: none; } .ui.instagram.button:active { background-color: #395c79; color: #fff; text-shadow: none; } /* Pinterest */ .ui.pinterest.button { background-color: #bd081c; color: #fff; text-shadow: none; background-image: none; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.pinterest.button:hover { background-color: #ac0013; color: #fff; text-shadow: none; } .ui.pinterest.button:active { background-color: #8c0615; color: #fff; text-shadow: none; } /* VK */ .ui.vk.button { background-color: #45668e; color: #fff; background-image: none; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.vk.button:hover { background-color: #395980; color: #fff; } .ui.vk.button:active { background-color: #344d6c; color: #fff; } /* WhatsApp */ .ui.whatsapp.button { background-color: #25d366; color: #fff; background-image: none; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.whatsapp.button:hover { background-color: #19c55a; color: #fff; } .ui.whatsapp.button:active { background-color: #1da851; color: #fff; } /* Telegram */ .ui.telegram.button { background-color: #08c; color: #fff; background-image: none; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.telegram.button:hover { background-color: #0077b3; color: #fff; } .ui.telegram.button:active { background-color: #006699; color: #fff; } /* -------------- Icon --------------- */ .ui.button > .icon:not(.button) { height: auto; opacity: 0.8; transition: opacity 0.1s ease; color: ""; } .ui.button:not(.icon) > .icon:not(.button):not(.dropdown), .ui.button:not(.icon) > .icons:not(.button):not(.dropdown) { margin: 0 0.42857143em 0 -0.21428571em; vertical-align: baseline; } .ui.button:not(.icon) > .icons:not(.button):not(.dropdown) > .icon { vertical-align: baseline; } .ui.button:not(.icon) > .right.icon:not(.button):not(.dropdown) { margin: 0 -0.21428571em 0 0.42857143em; } /******************************* Variations *******************************/ /* -------------- Stackable --------------- */ /* Tablet Or Below */ @media only screen and (max-width: 767.98px) { .ui.stackable.buttons { flex-direction: column; width: 100%; } .ui.stackable.buttons .button:first-child { border-bottom-left-radius: 0; border-top-right-radius: 0.28571429rem; } .ui.stackable.buttons .button:last-child { border-bottom-left-radius: 0.28571429rem; border-top-right-radius: 0; } .ui.stackable.buttons .button:only-child { border-radius: 0.28571429rem; } } /* ------------------- Floated -------------------- */ .ui[class*="left floated"].buttons, .ui[class*="left floated"].button { float: left; margin-left: 0; margin-right: 0.25em; } .ui[class*="right floated"].buttons, .ui[class*="right floated"].button { float: right; margin-right: 0; margin-left: 0.25em; } /* ------------------- Compact -------------------- */ .ui.compact.buttons .button, .ui.compact.button { padding: 0.58928571em 1.125em 0.58928571em; } .ui.compact.icon.buttons .button, .ui.compact.icon.button { padding: 0.58928571em 0.58928571em 0.58928571em; } .ui.compact.labeled.icon.buttons .button, .ui.compact.labeled.icon.button { padding: 0.58928571em 3.69642857em 0.58928571em; } .ui.compact.labeled.icon.buttons .button > .icon, .ui.compact.labeled.icon.button > .icon { padding: 0.58928571em 0; } /* ------------------- Sizes -------------------- */ .ui.buttons .button, .ui.buttons .or, .ui.button { font-size: 1rem; } .ui.mini.buttons .dropdown, .ui.mini.buttons .dropdown .menu > .item, .ui.mini.buttons .button, .ui.mini.buttons .or, .ui.ui.ui.ui.mini.button { font-size: 0.78571429rem; } .ui.tiny.buttons .dropdown, .ui.tiny.buttons .dropdown .menu > .item, .ui.tiny.buttons .button, .ui.tiny.buttons .or, .ui.ui.ui.ui.tiny.button { font-size: 0.85714286rem; } .ui.small.buttons .dropdown, .ui.small.buttons .dropdown .menu > .item, .ui.small.buttons .button, .ui.small.buttons .or, .ui.ui.ui.ui.small.button { font-size: 0.92857143rem; } .ui.large.buttons .dropdown, .ui.large.buttons .dropdown .menu > .item, .ui.large.buttons .button, .ui.large.buttons .or, .ui.ui.ui.ui.large.button { font-size: 1.14285714rem; } .ui.big.buttons .dropdown, .ui.big.buttons .dropdown .menu > .item, .ui.big.buttons .button, .ui.big.buttons .or, .ui.ui.ui.ui.big.button { font-size: 1.28571429rem; } .ui.huge.buttons .dropdown, .ui.huge.buttons .dropdown .menu > .item, .ui.huge.buttons .button, .ui.huge.buttons .or, .ui.ui.ui.ui.huge.button { font-size: 1.42857143rem; } .ui.massive.buttons .dropdown, .ui.massive.buttons .dropdown .menu > .item, .ui.massive.buttons .button, .ui.massive.buttons .or, .ui.ui.ui.ui.massive.button { font-size: 1.71428571rem; } /* -------------- Icon Only --------------- */ .ui.icon.buttons .button, .ui.icon.button:not(.animated):not(.compact):not(.labeled) { padding: 0.78571429em 0.78571429em 0.78571429em; } .ui.animated.icon.button > .content > .icon, .ui.icon.buttons .button > .icon, .ui.icon.button > .icon { opacity: 0.9; margin: 0 !important; vertical-align: top; } .ui.animated.button > .content > .icon { vertical-align: top; } /* ------------------- Basic -------------------- */ .ui.basic.buttons .button, .ui.basic.button { background: transparent none; color: rgba(0, 0, 0, 0.6); font-weight: normal; border-radius: 0.28571429rem; text-transform: none; text-shadow: none !important; box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15) inset; } .ui.basic.buttons { box-shadow: none; border: 1px solid rgba(34, 36, 38, 0.15); border-radius: 0.28571429rem; border-right: none; } .ui.basic.buttons .button { border-radius: 0; } .ui.basic.buttons .button:hover, .ui.basic.button:hover { background: #fff; color: rgba(0, 0, 0, 0.8); box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.35) inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.basic.buttons .button:focus, .ui.basic.button:focus { background: #fff; color: rgba(0, 0, 0, 0.8); box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.35) inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.basic.buttons .button:active, .ui.basic.button:active { background: #f8f8f8; color: rgba(0, 0, 0, 0.9); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset, 0 1px 4px 0 rgba(34, 36, 38, 0.15) inset; } .ui.basic.buttons .active.button, .ui.basic.active.button { background: rgba(0, 0, 0, 0.05); box-shadow: ""; color: rgba(0, 0, 0, 0.95); } .ui.basic.buttons .active.button:hover, .ui.basic.active.button:hover { background-color: rgba(0, 0, 0, 0.05); } .ui.basic.buttons .button:hover { box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.35) inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.basic.buttons .button:active { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset, 0 1px 4px 0 rgba(34, 36, 38, 0.15) inset; } .ui.basic.buttons .active.button { box-shadow: ""; } /* Standard Basic Inverted */ .ui.basic.inverted.buttons .button, .ui.basic.inverted.button { background-color: transparent; color: #f9fafb; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; } .ui.basic.inverted.buttons .button:hover, .ui.basic.inverted.button:hover { color: #fff; box-shadow: 0 0 0 2px #ffffff inset; } .ui.basic.inverted.buttons .button:focus, .ui.basic.inverted.button:focus { color: #fff; box-shadow: 0 0 0 2px #ffffff inset; } .ui.basic.inverted.buttons .button:active, .ui.basic.inverted.button:active { background-color: rgba(255, 255, 255, 0.08); color: #fff; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.9) inset; } .ui.basic.inverted.buttons .active.button, .ui.basic.inverted.active.button { background-color: rgba(255, 255, 255, 0.08); color: #fff; text-shadow: none; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.7) inset; } .ui.basic.inverted.buttons .active.button:hover, .ui.basic.inverted.active.button:hover { background-color: rgba(255, 255, 255, 0.15); box-shadow: 0 0 0 2px #ffffff inset; } /* Basic Group */ .ui.basic.buttons:not(.inverted) .button:not(.basic) { border-right: 1px solid rgba(34, 36, 38, 0.15); box-shadow: none; } .ui.basic.vertical.buttons .button { border-left: none; border-left-width: 0; border-top: 1px solid rgba(34, 36, 38, 0.15); } .ui.basic.vertical.buttons:not(.spaced):not(.circular) .button:first-child { border-top: none; } /* ------------------- Tertiary -------------------- */ /* Overline Mixin */ .ui.tertiary.button { transition: color 0.1s ease !important; border-radius: 0; margin: 0.28571429em 0.25em 0.28571429em 0 !important; padding: 0.5em 0.5em !important; box-shadow: none; color: rgba(0, 0, 0, 0.6); background: none; } .ui.tertiary.button:hover { box-shadow: inset 0 -0.2em 0 #666666; color: #333333; background: none; } .ui.tertiary.button:focus { box-shadow: inset 0 -0.2em 0 #666666; color: #333333; background: none; } .ui.tertiary.button:active { box-shadow: inset 0 -0.2em 0 #999999; border-radius: 0.28571429rem 0.28571429rem 0 0; color: #666666; background: none; } /* -------------- Labeled Icon --------------- */ .ui.labeled.icon.buttons .button, .ui.labeled.icon.button { position: relative; padding-left: 4.07142857em !important; padding-right: 1.5em !important; } /* Left Labeled */ .ui.labeled.icon.buttons > .button > .icon, .ui.labeled.icon.button > .icon { position: absolute; top: 0; left: 0; height: 100%; line-height: 1; border-radius: 0; border-top-left-radius: inherit; border-bottom-left-radius: inherit; text-align: center; animation: none; padding: 0.78571429em 0; margin: 0; width: 2.57142857em; background-color: rgba(0, 0, 0, 0.05); color: ""; box-shadow: -1px 0 0 0 transparent inset; } /* Right Labeled */ .ui[class*="right labeled"].icon.button { padding-right: 4.07142857em !important; padding-left: 1.5em !important; } .ui[class*="right labeled"].icon.button > .icon { left: auto; right: 0; border-radius: 0; border-top-right-radius: inherit; border-bottom-right-radius: inherit; box-shadow: 1px 0 0 0 transparent inset; } .ui.labeled.icon.buttons > .button > .icon::before, .ui.labeled.icon.button > .icon::before, .ui.labeled.icon.buttons > .button > .icon::after, .ui.labeled.icon.button > .icon::after { display: block; position: relative; width: 100%; top: 0; text-align: center; } .ui.labeled.icon.buttons .button > .icon { border-radius: 0; } .ui.labeled.icon.buttons .button:first-child > .icon { border-top-left-radius: 0.28571429rem; border-bottom-left-radius: 0.28571429rem; } .ui.labeled.icon.buttons .button:last-child > .icon { border-top-right-radius: 0.28571429rem; border-bottom-right-radius: 0.28571429rem; } .ui.vertical.labeled.icon.buttons .button:first-child > .icon { border-radius: 0; border-top-left-radius: 0.28571429rem; } .ui.vertical.labeled.icon.buttons .button:last-child > .icon { border-radius: 0; border-bottom-left-radius: 0.28571429rem; } /* Loading Icon in Labeled Button */ .ui.labeled.icon.button > .loading.icon::before { animation: loader 2s linear infinite; } /* -------------- Toggle --------------- */ /* Toggle (Modifies active state to give affordances) */ .ui.toggle.buttons .active.button, .ui.buttons .button.toggle.active, .ui.button.toggle.active { background-color: #21ba45; box-shadow: none; text-shadow: none; color: #fff; } .ui.button.toggle.active:hover { background-color: #16ab39; text-shadow: none; color: #fff; } /* -------------- Circular --------------- */ .ui.ui.circular.buttons .button, .ui.ui.ui.ui.circular.button { border-radius: 10em; min-width: 2.5em; } .ui.circular.buttons .button > .icon, .ui.circular.button > .icon { width: 1em; vertical-align: baseline; } .ui.circular.buttons:not(.vertical):not(.spaced) .button { margin-right: 0.25em; } .ui.vertical.circular.buttons .button { margin-bottom: 0.25em; } .ui.circular.basic.buttons { border: none; } .ui.circular.basic.buttons .button { border: 1px solid rgba(34, 36, 38, 0.15); } .ui.circular.basic.buttons .button.basic { border: none; } /* ------------------- Or Buttons -------------------- */ .ui.buttons .or { position: relative; width: 0.3em; height: 2.57142857em; z-index: 3; } .ui.buttons .or::before { position: absolute; text-align: center; border-radius: 500rem; content: "or"; top: 50%; left: 50%; background-color: #fff; text-shadow: none; margin-top: -0.89285714em; margin-left: -0.89285714em; width: 1.78571429em; height: 1.78571429em; line-height: 1.78571429em; color: rgba(0, 0, 0, 0.4); font-style: normal; font-weight: bold; box-shadow: 0 0 0 1px transparent inset; } .ui.buttons .or[data-text]::before { content: attr(data-text); } /* Fluid Or */ .ui.fluid.buttons .or { width: 0 !important; } .ui.fluid.buttons .or::after { display: none; } /* ------------------- Attached -------------------- */ /* Singular */ .ui.attached.button { position: relative; display: block; margin: 0; border-radius: 0; box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15); } /* Top / Bottom */ .ui.attached.top.button { border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.attached.bottom.button { border-radius: 0 0 0.28571429rem 0.28571429rem; } /* Left / Right */ .ui.left.attached.button { display: inline-block; border-left: none; text-align: right; padding-right: 0.75em; border-radius: 0.28571429rem 0 0 0.28571429rem; } .ui.right.attached.button { display: inline-block; text-align: left; padding-left: 0.75em; border-radius: 0 0.28571429rem 0.28571429rem 0; } /* Plural */ .ui.attached.buttons { position: relative; display: flex; border-radius: 0; width: auto !important; z-index: auto; margin-left: -1px; margin-right: -1px; } .ui.attached.buttons .button { margin: 0; } .ui.attached.buttons .button:first-child { border-radius: 0; } .ui.attached.buttons .button:last-child { border-radius: 0; } /* Top / Bottom */ .ui[class*="top attached"].buttons { margin-bottom: 0; border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui[class*="top attached"].buttons .button:first-child { border-radius: 0.28571429rem 0 0 0; } .ui[class*="top attached"].buttons .button:last-child { border-radius: 0 0.28571429rem 0 0; } .ui[class*="bottom attached"].buttons { margin-top: -1px; border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui[class*="bottom attached"].buttons .button:first-child { border-radius: 0 0 0 0.28571429rem; } .ui[class*="bottom attached"].buttons .button:last-child { border-radius: 0 0 0.28571429rem 0; } /* Left / Right */ .ui[class*="left attached"].buttons { display: inline-flex; margin-right: 0; margin-left: -1px; border-radius: 0 0.28571429rem 0.28571429rem 0; } .ui[class*="left attached"].buttons .button:first-child { margin-left: -1px; border-radius: 0 0.28571429rem 0 0; } .ui[class*="left attached"].buttons .button:last-child { margin-left: -1px; border-radius: 0 0 0.28571429rem 0; } .ui[class*="right attached"].buttons { display: inline-flex; margin-left: 0; margin-right: -1px; border-radius: 0.28571429rem 0 0 0.28571429rem; } .ui[class*="right attached"].buttons .button:first-child { margin-left: -1px; border-radius: 0.28571429rem 0 0 0; } .ui[class*="right attached"].buttons .button:last-child { margin-left: -1px; border-radius: 0 0 0 0.28571429rem; } /* ------------------- Fluid -------------------- */ .ui.fluid.buttons, .ui.fluid.button { width: 100%; } .ui.fluid.button { display: block; } .ui.two.buttons { width: 100%; } .ui.two.buttons > .button { width: 50%; } .ui.three.buttons { width: 100%; } .ui.three.buttons > .button { width: 33.333%; } .ui.four.buttons { width: 100%; } .ui.four.buttons > .button { width: 25%; } .ui.five.buttons { width: 100%; } .ui.five.buttons > .button { width: 20%; } .ui.six.buttons { width: 100%; } .ui.six.buttons > .button { width: 16.666%; } .ui.seven.buttons { width: 100%; } .ui.seven.buttons > .button { width: 14.285%; } .ui.eight.buttons { width: 100%; } .ui.eight.buttons > .button { width: 12.5%; } .ui.nine.buttons { width: 100%; } .ui.nine.buttons > .button { width: 11.11%; } .ui.ten.buttons { width: 100%; } .ui.ten.buttons > .button { width: 10%; } .ui.eleven.buttons { width: 100%; } .ui.eleven.buttons > .button { width: 9.09%; } .ui.twelve.buttons { width: 100%; } .ui.twelve.buttons > .button { width: 8.3333%; } /* Fluid Vertical Buttons */ .ui.fluid.vertical.buttons, .ui.fluid.vertical.buttons > .button { display: flex; width: auto; justify-content: center; } .ui.two.vertical.buttons > .button { height: 50%; } .ui.three.vertical.buttons > .button { height: 33.333%; } .ui.four.vertical.buttons > .button { height: 25%; } .ui.five.vertical.buttons > .button { height: 20%; } .ui.six.vertical.buttons > .button { height: 16.666%; } .ui.seven.vertical.buttons > .button { height: 14.285%; } .ui.eight.vertical.buttons > .button { height: 12.5%; } .ui.nine.vertical.buttons > .button { height: 11.11%; } .ui.ten.vertical.buttons > .button { height: 10%; } .ui.eleven.vertical.buttons > .button { height: 9.09%; } .ui.twelve.vertical.buttons > .button { height: 8.3333%; } /* ------------------- Colors -------------------- */ .ui.primary.buttons .button, .ui.primary.button { background-color: #2185d0; color: #fff; text-shadow: none; background-image: none; } .ui.primary.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.primary.buttons .button:hover, .ui.primary.button:hover { background-color: #1678c2; color: #fff; text-shadow: none; } .ui.primary.buttons .button:focus, .ui.primary.button:focus { background-color: #0d71bb; color: #fff; text-shadow: none; } .ui.primary.buttons .button:active, .ui.primary.button:active { background-color: #1a69a4; color: #fff; text-shadow: none; } .ui.primary.buttons .active.button, .ui.primary.buttons .active.button:active, .ui.primary.active.button, .ui.primary.button .active.button:active { background-color: #1279c6; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.primary.buttons .button, .ui.basic.primary.button { background: transparent; box-shadow: 0 0 0 1px #2185d0 inset; color: #2185d0; } .ui.basic.primary.buttons .button:hover, .ui.basic.primary.button:hover { background: transparent; box-shadow: 0 0 0 1px #1678c2 inset; color: #1678c2; } .ui.basic.primary.buttons .button:focus, .ui.basic.primary.button:focus { background: transparent; box-shadow: 0 0 0 1px #0d71bb inset; color: #1678c2; } .ui.basic.primary.buttons .active.button, .ui.basic.primary.active.button { background: transparent; box-shadow: 0 0 0 1px #1279c6 inset; color: #1a69a4; } .ui.basic.primary.buttons .button:active, .ui.basic.primary.button:active { box-shadow: 0 0 0 1px #1a69a4 inset; color: #1a69a4; } /* Inverted */ .ui.inverted.primary.buttons .button, .ui.inverted.primary.button { background-color: transparent; box-shadow: 0 0 0 2px #54c8ff inset; color: #54c8ff; } .ui.inverted.primary.buttons .button:hover, .ui.inverted.primary.button:hover, .ui.inverted.primary.buttons .button:focus, .ui.inverted.primary.button:focus, .ui.inverted.primary.buttons .button.active, .ui.inverted.primary.button.active, .ui.inverted.primary.buttons .button:active, .ui.inverted.primary.button:active { box-shadow: none; color: #fff; } .ui.inverted.primary.buttons .button:hover, .ui.inverted.primary.button:hover { background-color: #21b8ff; } .ui.inverted.primary.buttons .button:focus, .ui.inverted.primary.button:focus { background-color: #2bbbff; } .ui.inverted.primary.buttons .active.button, .ui.inverted.primary.active.button { background-color: #3ac0ff; } .ui.inverted.primary.buttons .button:active, .ui.inverted.primary.button:active { background-color: #21b8ff; } /* Inverted Basic */ .ui.inverted.primary.basic.buttons .button, .ui.inverted.primary.buttons .basic.button, .ui.inverted.primary.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.primary.basic.buttons .button:hover, .ui.inverted.primary.buttons .basic.button:hover, .ui.inverted.primary.basic.button:hover { box-shadow: 0 0 0 2px #21b8ff inset; color: #54c8ff; } .ui.inverted.primary.basic.buttons .button:focus, .ui.inverted.primary.basic.buttons .button:focus, .ui.inverted.primary.basic.button:focus { box-shadow: 0 0 0 2px #2bbbff inset; color: #54c8ff; } .ui.inverted.primary.basic.buttons .active.button, .ui.inverted.primary.buttons .basic.active.button, .ui.inverted.primary.basic.active.button { box-shadow: 0 0 0 2px #3ac0ff inset; color: #54c8ff; } .ui.inverted.primary.basic.buttons .button:active, .ui.inverted.primary.buttons .basic.button:active, .ui.inverted.primary.basic.button:active { box-shadow: 0 0 0 2px #21b8ff inset; color: #54c8ff; } /* Tertiary */ .ui.tertiary.primary.buttons .button, .ui.tertiary.primary.buttons .tertiary.button, .ui.tertiary.primary.button { background: transparent; box-shadow: none; color: #2185d0; } .ui.tertiary.primary.buttons .button:hover, .ui.tertiary.primary.buttons button:hover, .ui.tertiary.primary.button:hover { box-shadow: inset 0 -0.2em 0 #2b75ac; color: #2b75ac; } .ui.tertiary.primary.buttons .button:focus, .ui.tertiary.primary.buttons .tertiary.button:focus, .ui.tertiary.primary.button:focus { box-shadow: inset 0 -0.2em 0 #216ea7; color: #216ea7; } .ui.tertiary.primary.buttons .active.button, .ui.tertiary.primary.buttons .tertiary.active.button, .ui.tertiary.primary.active.button, .ui.tertiary.primary.buttons .button:active, .ui.tertiary.primary.buttons .tertiary.button:active, .ui.tertiary.primary.button:active { box-shadow: inset 0 -0.2em 0 #007bd8; color: #1279c6; } .ui.secondary.buttons .button, .ui.secondary.button { background-color: #1b1c1d; color: #fff; text-shadow: none; background-image: none; } .ui.secondary.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.secondary.buttons .button:hover, .ui.secondary.button:hover { background-color: #27292a; color: #fff; text-shadow: none; } .ui.secondary.buttons .button:focus, .ui.secondary.button:focus { background-color: #2e3032; color: #fff; text-shadow: none; } .ui.secondary.buttons .button:active, .ui.secondary.button:active { background-color: #343637; color: #fff; text-shadow: none; } .ui.secondary.buttons .active.button, .ui.secondary.buttons .active.button:active, .ui.secondary.active.button, .ui.secondary.button .active.button:active { background-color: #27292a; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.secondary.buttons .button, .ui.basic.secondary.button { background: transparent; box-shadow: 0 0 0 1px #1b1c1d inset; color: #1b1c1d; } .ui.basic.secondary.buttons .button:hover, .ui.basic.secondary.button:hover { background: transparent; box-shadow: 0 0 0 1px #27292a inset; color: #27292a; } .ui.basic.secondary.buttons .button:focus, .ui.basic.secondary.button:focus { background: transparent; box-shadow: 0 0 0 1px #2e3032 inset; color: #27292a; } .ui.basic.secondary.buttons .active.button, .ui.basic.secondary.active.button { background: transparent; box-shadow: 0 0 0 1px #27292a inset; color: #343637; } .ui.basic.secondary.buttons .button:active, .ui.basic.secondary.button:active { box-shadow: 0 0 0 1px #343637 inset; color: #343637; } /* Inverted */ .ui.inverted.secondary.buttons .button, .ui.inverted.secondary.button { background-color: transparent; box-shadow: 0 0 0 2px #545454 inset; color: #545454; } .ui.inverted.secondary.buttons .button:hover, .ui.inverted.secondary.button:hover, .ui.inverted.secondary.buttons .button:focus, .ui.inverted.secondary.button:focus, .ui.inverted.secondary.buttons .button.active, .ui.inverted.secondary.button.active, .ui.inverted.secondary.buttons .button:active, .ui.inverted.secondary.button:active { box-shadow: none; color: #fff; } .ui.inverted.secondary.buttons .button:hover, .ui.inverted.secondary.button:hover { background-color: #6e6e6e; } .ui.inverted.secondary.buttons .button:focus, .ui.inverted.secondary.button:focus { background-color: #686868; } .ui.inverted.secondary.buttons .active.button, .ui.inverted.secondary.active.button { background-color: #616161; } .ui.inverted.secondary.buttons .button:active, .ui.inverted.secondary.button:active { background-color: #6e6e6e; } /* Inverted Basic */ .ui.inverted.secondary.basic.buttons .button, .ui.inverted.secondary.buttons .basic.button, .ui.inverted.secondary.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.secondary.basic.buttons .button:hover, .ui.inverted.secondary.buttons .basic.button:hover, .ui.inverted.secondary.basic.button:hover { box-shadow: 0 0 0 2px #6e6e6e inset; color: #545454; } .ui.inverted.secondary.basic.buttons .button:focus, .ui.inverted.secondary.basic.buttons .button:focus, .ui.inverted.secondary.basic.button:focus { box-shadow: 0 0 0 2px #686868 inset; color: #545454; } .ui.inverted.secondary.basic.buttons .active.button, .ui.inverted.secondary.buttons .basic.active.button, .ui.inverted.secondary.basic.active.button { box-shadow: 0 0 0 2px #616161 inset; color: #545454; } .ui.inverted.secondary.basic.buttons .button:active, .ui.inverted.secondary.buttons .basic.button:active, .ui.inverted.secondary.basic.button:active { box-shadow: 0 0 0 2px #6e6e6e inset; color: #545454; } /* Tertiary */ .ui.tertiary.secondary.buttons .button, .ui.tertiary.secondary.buttons .tertiary.button, .ui.tertiary.secondary.button { background: transparent; box-shadow: none; color: #1b1c1d; } .ui.tertiary.secondary.buttons .button:hover, .ui.tertiary.secondary.buttons button:hover, .ui.tertiary.secondary.button:hover { box-shadow: inset 0 -0.2em 0 #292929; color: #292929; } .ui.tertiary.secondary.buttons .button:focus, .ui.tertiary.secondary.buttons .tertiary.button:focus, .ui.tertiary.secondary.button:focus { box-shadow: inset 0 -0.2em 0 #303030; color: #303030; } .ui.tertiary.secondary.buttons .active.button, .ui.tertiary.secondary.buttons .tertiary.active.button, .ui.tertiary.secondary.active.button, .ui.tertiary.secondary.buttons .button:active, .ui.tertiary.secondary.buttons .tertiary.button:active, .ui.tertiary.secondary.button:active { box-shadow: inset 0 -0.2em 0 #1f2933; color: #27292a; } .ui.red.buttons .button, .ui.red.button { background-color: #db2828; color: #fff; text-shadow: none; background-image: none; } .ui.red.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.red.buttons .button:hover, .ui.red.button:hover { background-color: #d01919; color: #fff; text-shadow: none; } .ui.red.buttons .button:focus, .ui.red.button:focus { background-color: #ca1010; color: #fff; text-shadow: none; } .ui.red.buttons .button:active, .ui.red.button:active { background-color: #b21e1e; color: #fff; text-shadow: none; } .ui.red.buttons .active.button, .ui.red.buttons .active.button:active, .ui.red.active.button, .ui.red.button .active.button:active { background-color: #d41515; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.red.buttons .button, .ui.basic.red.button { background: transparent; box-shadow: 0 0 0 1px #db2828 inset; color: #db2828; } .ui.basic.red.buttons .button:hover, .ui.basic.red.button:hover { background: transparent; box-shadow: 0 0 0 1px #d01919 inset; color: #d01919; } .ui.basic.red.buttons .button:focus, .ui.basic.red.button:focus { background: transparent; box-shadow: 0 0 0 1px #ca1010 inset; color: #d01919; } .ui.basic.red.buttons .active.button, .ui.basic.red.active.button { background: transparent; box-shadow: 0 0 0 1px #d41515 inset; color: #b21e1e; } .ui.basic.red.buttons .button:active, .ui.basic.red.button:active { box-shadow: 0 0 0 1px #b21e1e inset; color: #b21e1e; } /* Inverted */ .ui.inverted.red.buttons .button, .ui.inverted.red.button { background-color: transparent; box-shadow: 0 0 0 2px #ff695e inset; color: #ff695e; } .ui.inverted.red.buttons .button:hover, .ui.inverted.red.button:hover, .ui.inverted.red.buttons .button:focus, .ui.inverted.red.button:focus, .ui.inverted.red.buttons .button.active, .ui.inverted.red.button.active, .ui.inverted.red.buttons .button:active, .ui.inverted.red.button:active { box-shadow: none; color: #fff; } .ui.inverted.red.buttons .button:hover, .ui.inverted.red.button:hover { background-color: #ff392b; } .ui.inverted.red.buttons .button:focus, .ui.inverted.red.button:focus { background-color: #ff4335; } .ui.inverted.red.buttons .active.button, .ui.inverted.red.active.button { background-color: #ff5144; } .ui.inverted.red.buttons .button:active, .ui.inverted.red.button:active { background-color: #ff392b; } /* Inverted Basic */ .ui.inverted.red.basic.buttons .button, .ui.inverted.red.buttons .basic.button, .ui.inverted.red.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.red.basic.buttons .button:hover, .ui.inverted.red.buttons .basic.button:hover, .ui.inverted.red.basic.button:hover { box-shadow: 0 0 0 2px #ff392b inset; color: #ff695e; } .ui.inverted.red.basic.buttons .button:focus, .ui.inverted.red.basic.buttons .button:focus, .ui.inverted.red.basic.button:focus { box-shadow: 0 0 0 2px #ff4335 inset; color: #ff695e; } .ui.inverted.red.basic.buttons .active.button, .ui.inverted.red.buttons .basic.active.button, .ui.inverted.red.basic.active.button { box-shadow: 0 0 0 2px #ff5144 inset; color: #ff695e; } .ui.inverted.red.basic.buttons .button:active, .ui.inverted.red.buttons .basic.button:active, .ui.inverted.red.basic.button:active { box-shadow: 0 0 0 2px #ff392b inset; color: #ff695e; } /* Tertiary */ .ui.tertiary.red.buttons .button, .ui.tertiary.red.buttons .tertiary.button, .ui.tertiary.red.button { background: transparent; box-shadow: none; color: #db2828; } .ui.tertiary.red.buttons .button:hover, .ui.tertiary.red.buttons button:hover, .ui.tertiary.red.button:hover { box-shadow: inset 0 -0.2em 0 #b93131; color: #b93131; } .ui.tertiary.red.buttons .button:focus, .ui.tertiary.red.buttons .tertiary.button:focus, .ui.tertiary.red.button:focus { box-shadow: inset 0 -0.2em 0 #b52626; color: #b52626; } .ui.tertiary.red.buttons .active.button, .ui.tertiary.red.buttons .tertiary.active.button, .ui.tertiary.red.active.button, .ui.tertiary.red.buttons .button:active, .ui.tertiary.red.buttons .tertiary.button:active, .ui.tertiary.red.button:active { box-shadow: inset 0 -0.2em 0 #ea0000; color: #d41515; } .ui.orange.buttons .button, .ui.orange.button { background-color: #f2711c; color: #fff; text-shadow: none; background-image: none; } .ui.orange.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.orange.buttons .button:hover, .ui.orange.button:hover { background-color: #f26202; color: #fff; text-shadow: none; } .ui.orange.buttons .button:focus, .ui.orange.button:focus { background-color: #e55b00; color: #fff; text-shadow: none; } .ui.orange.buttons .button:active, .ui.orange.button:active { background-color: #cf590c; color: #fff; text-shadow: none; } .ui.orange.buttons .active.button, .ui.orange.buttons .active.button:active, .ui.orange.active.button, .ui.orange.button .active.button:active { background-color: #f56100; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.orange.buttons .button, .ui.basic.orange.button { background: transparent; box-shadow: 0 0 0 1px #f2711c inset; color: #f2711c; } .ui.basic.orange.buttons .button:hover, .ui.basic.orange.button:hover { background: transparent; box-shadow: 0 0 0 1px #f26202 inset; color: #f26202; } .ui.basic.orange.buttons .button:focus, .ui.basic.orange.button:focus { background: transparent; box-shadow: 0 0 0 1px #e55b00 inset; color: #f26202; } .ui.basic.orange.buttons .active.button, .ui.basic.orange.active.button { background: transparent; box-shadow: 0 0 0 1px #f56100 inset; color: #cf590c; } .ui.basic.orange.buttons .button:active, .ui.basic.orange.button:active { box-shadow: 0 0 0 1px #cf590c inset; color: #cf590c; } /* Inverted */ .ui.inverted.orange.buttons .button, .ui.inverted.orange.button { background-color: transparent; box-shadow: 0 0 0 2px #ff851b inset; color: #ff851b; } .ui.inverted.orange.buttons .button:hover, .ui.inverted.orange.button:hover, .ui.inverted.orange.buttons .button:focus, .ui.inverted.orange.button:focus, .ui.inverted.orange.buttons .button.active, .ui.inverted.orange.button.active, .ui.inverted.orange.buttons .button:active, .ui.inverted.orange.button:active { box-shadow: none; color: #fff; } .ui.inverted.orange.buttons .button:hover, .ui.inverted.orange.button:hover { background-color: #e76b00; } .ui.inverted.orange.buttons .button:focus, .ui.inverted.orange.button:focus { background-color: #f17000; } .ui.inverted.orange.buttons .active.button, .ui.inverted.orange.active.button { background-color: #ff7701; } .ui.inverted.orange.buttons .button:active, .ui.inverted.orange.button:active { background-color: #e76b00; } /* Inverted Basic */ .ui.inverted.orange.basic.buttons .button, .ui.inverted.orange.buttons .basic.button, .ui.inverted.orange.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.orange.basic.buttons .button:hover, .ui.inverted.orange.buttons .basic.button:hover, .ui.inverted.orange.basic.button:hover { box-shadow: 0 0 0 2px #e76b00 inset; color: #ff851b; } .ui.inverted.orange.basic.buttons .button:focus, .ui.inverted.orange.basic.buttons .button:focus, .ui.inverted.orange.basic.button:focus { box-shadow: 0 0 0 2px #f17000 inset; color: #ff851b; } .ui.inverted.orange.basic.buttons .active.button, .ui.inverted.orange.buttons .basic.active.button, .ui.inverted.orange.basic.active.button { box-shadow: 0 0 0 2px #ff7701 inset; color: #ff851b; } .ui.inverted.orange.basic.buttons .button:active, .ui.inverted.orange.buttons .basic.button:active, .ui.inverted.orange.basic.button:active { box-shadow: 0 0 0 2px #e76b00 inset; color: #ff851b; } /* Tertiary */ .ui.tertiary.orange.buttons .button, .ui.tertiary.orange.buttons .tertiary.button, .ui.tertiary.orange.button { background: transparent; box-shadow: none; color: #f2711c; } .ui.tertiary.orange.buttons .button:hover, .ui.tertiary.orange.buttons button:hover, .ui.tertiary.orange.button:hover { box-shadow: inset 0 -0.2em 0 #da671b; color: #da671b; } .ui.tertiary.orange.buttons .button:focus, .ui.tertiary.orange.buttons .tertiary.button:focus, .ui.tertiary.orange.button:focus { box-shadow: inset 0 -0.2em 0 #ce6017; color: #ce6017; } .ui.tertiary.orange.buttons .active.button, .ui.tertiary.orange.buttons .tertiary.active.button, .ui.tertiary.orange.active.button, .ui.tertiary.orange.buttons .button:active, .ui.tertiary.orange.buttons .tertiary.button:active, .ui.tertiary.orange.button:active { box-shadow: inset 0 -0.2em 0 #f56100; color: #f56100; } .ui.yellow.buttons .button, .ui.yellow.button { background-color: #fbbd08; color: #fff; text-shadow: none; background-image: none; } .ui.yellow.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.yellow.buttons .button:hover, .ui.yellow.button:hover { background-color: #eaae00; color: #fff; text-shadow: none; } .ui.yellow.buttons .button:focus, .ui.yellow.button:focus { background-color: #daa300; color: #fff; text-shadow: none; } .ui.yellow.buttons .button:active, .ui.yellow.button:active { background-color: #cd9903; color: #fff; text-shadow: none; } .ui.yellow.buttons .active.button, .ui.yellow.buttons .active.button:active, .ui.yellow.active.button, .ui.yellow.button .active.button:active { background-color: #eaae00; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.yellow.buttons .button, .ui.basic.yellow.button { background: transparent; box-shadow: 0 0 0 1px #fbbd08 inset; color: #fbbd08; } .ui.basic.yellow.buttons .button:hover, .ui.basic.yellow.button:hover { background: transparent; box-shadow: 0 0 0 1px #eaae00 inset; color: #eaae00; } .ui.basic.yellow.buttons .button:focus, .ui.basic.yellow.button:focus { background: transparent; box-shadow: 0 0 0 1px #daa300 inset; color: #eaae00; } .ui.basic.yellow.buttons .active.button, .ui.basic.yellow.active.button { background: transparent; box-shadow: 0 0 0 1px #eaae00 inset; color: #cd9903; } .ui.basic.yellow.buttons .button:active, .ui.basic.yellow.button:active { box-shadow: 0 0 0 1px #cd9903 inset; color: #cd9903; } /* Inverted */ .ui.inverted.yellow.buttons .button, .ui.inverted.yellow.button { background-color: transparent; box-shadow: 0 0 0 2px #ffe21f inset; color: #ffe21f; } .ui.inverted.yellow.buttons .button:hover, .ui.inverted.yellow.button:hover, .ui.inverted.yellow.buttons .button:focus, .ui.inverted.yellow.button:focus, .ui.inverted.yellow.buttons .button.active, .ui.inverted.yellow.button.active, .ui.inverted.yellow.buttons .button:active, .ui.inverted.yellow.button:active { box-shadow: none; color: rgba(0, 0, 0, 0.6); } .ui.inverted.yellow.buttons .button:hover, .ui.inverted.yellow.button:hover { background-color: #ebcd00; } .ui.inverted.yellow.buttons .button:focus, .ui.inverted.yellow.button:focus { background-color: #f5d500; } .ui.inverted.yellow.buttons .active.button, .ui.inverted.yellow.active.button { background-color: #ffdf05; } .ui.inverted.yellow.buttons .button:active, .ui.inverted.yellow.button:active { background-color: #ebcd00; } /* Inverted Basic */ .ui.inverted.yellow.basic.buttons .button, .ui.inverted.yellow.buttons .basic.button, .ui.inverted.yellow.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.yellow.basic.buttons .button:hover, .ui.inverted.yellow.buttons .basic.button:hover, .ui.inverted.yellow.basic.button:hover { box-shadow: 0 0 0 2px #ebcd00 inset; color: #ffe21f; } .ui.inverted.yellow.basic.buttons .button:focus, .ui.inverted.yellow.basic.buttons .button:focus, .ui.inverted.yellow.basic.button:focus { box-shadow: 0 0 0 2px #f5d500 inset; color: #ffe21f; } .ui.inverted.yellow.basic.buttons .active.button, .ui.inverted.yellow.buttons .basic.active.button, .ui.inverted.yellow.basic.active.button { box-shadow: 0 0 0 2px #ffdf05 inset; color: #ffe21f; } .ui.inverted.yellow.basic.buttons .button:active, .ui.inverted.yellow.buttons .basic.button:active, .ui.inverted.yellow.basic.button:active { box-shadow: 0 0 0 2px #ebcd00 inset; color: #ffe21f; } /* Tertiary */ .ui.tertiary.yellow.buttons .button, .ui.tertiary.yellow.buttons .tertiary.button, .ui.tertiary.yellow.button { background: transparent; box-shadow: none; color: #fbbd08; } .ui.tertiary.yellow.buttons .button:hover, .ui.tertiary.yellow.buttons button:hover, .ui.tertiary.yellow.button:hover { box-shadow: inset 0 -0.2em 0 #d2a217; color: #d2a217; } .ui.tertiary.yellow.buttons .button:focus, .ui.tertiary.yellow.buttons .tertiary.button:focus, .ui.tertiary.yellow.button:focus { box-shadow: inset 0 -0.2em 0 #c49816; color: #c49816; } .ui.tertiary.yellow.buttons .active.button, .ui.tertiary.yellow.buttons .tertiary.active.button, .ui.tertiary.yellow.active.button, .ui.tertiary.yellow.buttons .button:active, .ui.tertiary.yellow.buttons .tertiary.button:active, .ui.tertiary.yellow.button:active { box-shadow: inset 0 -0.2em 0 #eaae00; color: #eaae00; } .ui.olive.buttons .button, .ui.olive.button { background-color: #b5cc18; color: #fff; text-shadow: none; background-image: none; } .ui.olive.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.olive.buttons .button:hover, .ui.olive.button:hover { background-color: #a7bd0d; color: #fff; text-shadow: none; } .ui.olive.buttons .button:focus, .ui.olive.button:focus { background-color: #a0b605; color: #fff; text-shadow: none; } .ui.olive.buttons .button:active, .ui.olive.button:active { background-color: #8d9e13; color: #fff; text-shadow: none; } .ui.olive.buttons .active.button, .ui.olive.buttons .active.button:active, .ui.olive.active.button, .ui.olive.button .active.button:active { background-color: #aac109; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.olive.buttons .button, .ui.basic.olive.button { background: transparent; box-shadow: 0 0 0 1px #b5cc18 inset; color: #b5cc18; } .ui.basic.olive.buttons .button:hover, .ui.basic.olive.button:hover { background: transparent; box-shadow: 0 0 0 1px #a7bd0d inset; color: #a7bd0d; } .ui.basic.olive.buttons .button:focus, .ui.basic.olive.button:focus { background: transparent; box-shadow: 0 0 0 1px #a0b605 inset; color: #a7bd0d; } .ui.basic.olive.buttons .active.button, .ui.basic.olive.active.button { background: transparent; box-shadow: 0 0 0 1px #aac109 inset; color: #8d9e13; } .ui.basic.olive.buttons .button:active, .ui.basic.olive.button:active { box-shadow: 0 0 0 1px #8d9e13 inset; color: #8d9e13; } /* Inverted */ .ui.inverted.olive.buttons .button, .ui.inverted.olive.button { background-color: transparent; box-shadow: 0 0 0 2px #d9e778 inset; color: #d9e778; } .ui.inverted.olive.buttons .button:hover, .ui.inverted.olive.button:hover, .ui.inverted.olive.buttons .button:focus, .ui.inverted.olive.button:focus, .ui.inverted.olive.buttons .button.active, .ui.inverted.olive.button.active, .ui.inverted.olive.buttons .button:active, .ui.inverted.olive.button:active { box-shadow: none; color: rgba(0, 0, 0, 0.6); } .ui.inverted.olive.buttons .button:hover, .ui.inverted.olive.button:hover { background-color: #d2e745; } .ui.inverted.olive.buttons .button:focus, .ui.inverted.olive.button:focus { background-color: #daef47; } .ui.inverted.olive.buttons .active.button, .ui.inverted.olive.active.button { background-color: #daed59; } .ui.inverted.olive.buttons .button:active, .ui.inverted.olive.button:active { background-color: #cddf4d; } /* Inverted Basic */ .ui.inverted.olive.basic.buttons .button, .ui.inverted.olive.buttons .basic.button, .ui.inverted.olive.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.olive.basic.buttons .button:hover, .ui.inverted.olive.buttons .basic.button:hover, .ui.inverted.olive.basic.button:hover { box-shadow: 0 0 0 2px #d2e745 inset; color: #d9e778; } .ui.inverted.olive.basic.buttons .button:focus, .ui.inverted.olive.basic.buttons .button:focus, .ui.inverted.olive.basic.button:focus { box-shadow: 0 0 0 2px #daef47 inset; color: #d9e778; } .ui.inverted.olive.basic.buttons .active.button, .ui.inverted.olive.buttons .basic.active.button, .ui.inverted.olive.basic.active.button { box-shadow: 0 0 0 2px #daed59 inset; color: #d9e778; } .ui.inverted.olive.basic.buttons .button:active, .ui.inverted.olive.buttons .basic.button:active, .ui.inverted.olive.basic.button:active { box-shadow: 0 0 0 2px #cddf4d inset; color: #d9e778; } /* Tertiary */ .ui.tertiary.olive.buttons .button, .ui.tertiary.olive.buttons .tertiary.button, .ui.tertiary.olive.button { background: transparent; box-shadow: none; color: #b5cc18; } .ui.tertiary.olive.buttons .button:hover, .ui.tertiary.olive.buttons button:hover, .ui.tertiary.olive.button:hover { box-shadow: inset 0 -0.2em 0 #98a922; color: #98a922; } .ui.tertiary.olive.buttons .button:focus, .ui.tertiary.olive.buttons .tertiary.button:focus, .ui.tertiary.olive.button:focus { box-shadow: inset 0 -0.2em 0 #92a418; color: #92a418; } .ui.tertiary.olive.buttons .active.button, .ui.tertiary.olive.buttons .tertiary.active.button, .ui.tertiary.olive.active.button, .ui.tertiary.olive.buttons .button:active, .ui.tertiary.olive.buttons .tertiary.button:active, .ui.tertiary.olive.button:active { box-shadow: inset 0 -0.2em 0 #b1cb00; color: #aac109; } .ui.green.buttons .button, .ui.green.button { background-color: #21ba45; color: #fff; text-shadow: none; background-image: none; } .ui.green.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.green.buttons .button:hover, .ui.green.button:hover { background-color: #16ab39; color: #fff; text-shadow: none; } .ui.green.buttons .button:focus, .ui.green.button:focus { background-color: #0ea432; color: #fff; text-shadow: none; } .ui.green.buttons .button:active, .ui.green.button:active { background-color: #198f35; color: #fff; text-shadow: none; } .ui.green.buttons .active.button, .ui.green.buttons .active.button:active, .ui.green.active.button, .ui.green.button .active.button:active { background-color: #13ae38; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.green.buttons .button, .ui.basic.green.button { background: transparent; box-shadow: 0 0 0 1px #21ba45 inset; color: #21ba45; } .ui.basic.green.buttons .button:hover, .ui.basic.green.button:hover { background: transparent; box-shadow: 0 0 0 1px #16ab39 inset; color: #16ab39; } .ui.basic.green.buttons .button:focus, .ui.basic.green.button:focus { background: transparent; box-shadow: 0 0 0 1px #0ea432 inset; color: #16ab39; } .ui.basic.green.buttons .active.button, .ui.basic.green.active.button { background: transparent; box-shadow: 0 0 0 1px #13ae38 inset; color: #198f35; } .ui.basic.green.buttons .button:active, .ui.basic.green.button:active { box-shadow: 0 0 0 1px #198f35 inset; color: #198f35; } /* Inverted */ .ui.inverted.green.buttons .button, .ui.inverted.green.button { background-color: transparent; box-shadow: 0 0 0 2px #2ecc40 inset; color: #2ecc40; } .ui.inverted.green.buttons .button:hover, .ui.inverted.green.button:hover, .ui.inverted.green.buttons .button:focus, .ui.inverted.green.button:focus, .ui.inverted.green.buttons .button.active, .ui.inverted.green.button.active, .ui.inverted.green.buttons .button:active, .ui.inverted.green.button:active { box-shadow: none; color: #fff; } .ui.inverted.green.buttons .button:hover, .ui.inverted.green.button:hover { background-color: #1ea92e; } .ui.inverted.green.buttons .button:focus, .ui.inverted.green.button:focus { background-color: #19b82b; } .ui.inverted.green.buttons .active.button, .ui.inverted.green.active.button { background-color: #1fc231; } .ui.inverted.green.buttons .button:active, .ui.inverted.green.button:active { background-color: #25a233; } /* Inverted Basic */ .ui.inverted.green.basic.buttons .button, .ui.inverted.green.buttons .basic.button, .ui.inverted.green.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.green.basic.buttons .button:hover, .ui.inverted.green.buttons .basic.button:hover, .ui.inverted.green.basic.button:hover { box-shadow: 0 0 0 2px #1ea92e inset; color: #2ecc40; } .ui.inverted.green.basic.buttons .button:focus, .ui.inverted.green.basic.buttons .button:focus, .ui.inverted.green.basic.button:focus { box-shadow: 0 0 0 2px #19b82b inset; color: #2ecc40; } .ui.inverted.green.basic.buttons .active.button, .ui.inverted.green.buttons .basic.active.button, .ui.inverted.green.basic.active.button { box-shadow: 0 0 0 2px #1fc231 inset; color: #2ecc40; } .ui.inverted.green.basic.buttons .button:active, .ui.inverted.green.buttons .basic.button:active, .ui.inverted.green.basic.button:active { box-shadow: 0 0 0 2px #25a233 inset; color: #2ecc40; } /* Tertiary */ .ui.tertiary.green.buttons .button, .ui.tertiary.green.buttons .tertiary.button, .ui.tertiary.green.button { background: transparent; box-shadow: none; color: #21ba45; } .ui.tertiary.green.buttons .button:hover, .ui.tertiary.green.buttons button:hover, .ui.tertiary.green.button:hover { box-shadow: inset 0 -0.2em 0 #2a9844; color: #2a9844; } .ui.tertiary.green.buttons .button:focus, .ui.tertiary.green.buttons .tertiary.button:focus, .ui.tertiary.green.button:focus { box-shadow: inset 0 -0.2em 0 #20923b; color: #20923b; } .ui.tertiary.green.buttons .active.button, .ui.tertiary.green.buttons .tertiary.active.button, .ui.tertiary.green.active.button, .ui.tertiary.green.buttons .button:active, .ui.tertiary.green.buttons .tertiary.button:active, .ui.tertiary.green.button:active { box-shadow: inset 0 -0.2em 0 #00c22e; color: #13ae38; } .ui.teal.buttons .button, .ui.teal.button { background-color: #00b5ad; color: #fff; text-shadow: none; background-image: none; } .ui.teal.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.teal.buttons .button:hover, .ui.teal.button:hover { background-color: #009c95; color: #fff; text-shadow: none; } .ui.teal.buttons .button:focus, .ui.teal.button:focus { background-color: #008c86; color: #fff; text-shadow: none; } .ui.teal.buttons .button:active, .ui.teal.button:active { background-color: #00827c; color: #fff; text-shadow: none; } .ui.teal.buttons .active.button, .ui.teal.buttons .active.button:active, .ui.teal.active.button, .ui.teal.button .active.button:active { background-color: #009c95; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.teal.buttons .button, .ui.basic.teal.button { background: transparent; box-shadow: 0 0 0 1px #00b5ad inset; color: #00b5ad; } .ui.basic.teal.buttons .button:hover, .ui.basic.teal.button:hover { background: transparent; box-shadow: 0 0 0 1px #009c95 inset; color: #009c95; } .ui.basic.teal.buttons .button:focus, .ui.basic.teal.button:focus { background: transparent; box-shadow: 0 0 0 1px #008c86 inset; color: #009c95; } .ui.basic.teal.buttons .active.button, .ui.basic.teal.active.button { background: transparent; box-shadow: 0 0 0 1px #009c95 inset; color: #00827c; } .ui.basic.teal.buttons .button:active, .ui.basic.teal.button:active { box-shadow: 0 0 0 1px #00827c inset; color: #00827c; } /* Inverted */ .ui.inverted.teal.buttons .button, .ui.inverted.teal.button { background-color: transparent; box-shadow: 0 0 0 2px #6dffff inset; color: #6dffff; } .ui.inverted.teal.buttons .button:hover, .ui.inverted.teal.button:hover, .ui.inverted.teal.buttons .button:focus, .ui.inverted.teal.button:focus, .ui.inverted.teal.buttons .button.active, .ui.inverted.teal.button.active, .ui.inverted.teal.buttons .button:active, .ui.inverted.teal.button:active { box-shadow: none; color: rgba(0, 0, 0, 0.6); } .ui.inverted.teal.buttons .button:hover, .ui.inverted.teal.button:hover { background-color: #3affff; } .ui.inverted.teal.buttons .button:focus, .ui.inverted.teal.button:focus { background-color: #44ffff; } .ui.inverted.teal.buttons .active.button, .ui.inverted.teal.active.button { background-color: #54ffff; } .ui.inverted.teal.buttons .button:active, .ui.inverted.teal.button:active { background-color: #3affff; } /* Inverted Basic */ .ui.inverted.teal.basic.buttons .button, .ui.inverted.teal.buttons .basic.button, .ui.inverted.teal.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.teal.basic.buttons .button:hover, .ui.inverted.teal.buttons .basic.button:hover, .ui.inverted.teal.basic.button:hover { box-shadow: 0 0 0 2px #3affff inset; color: #6dffff; } .ui.inverted.teal.basic.buttons .button:focus, .ui.inverted.teal.basic.buttons .button:focus, .ui.inverted.teal.basic.button:focus { box-shadow: 0 0 0 2px #44ffff inset; color: #6dffff; } .ui.inverted.teal.basic.buttons .active.button, .ui.inverted.teal.buttons .basic.active.button, .ui.inverted.teal.basic.active.button { box-shadow: 0 0 0 2px #54ffff inset; color: #6dffff; } .ui.inverted.teal.basic.buttons .button:active, .ui.inverted.teal.buttons .basic.button:active, .ui.inverted.teal.basic.button:active { box-shadow: 0 0 0 2px #3affff inset; color: #6dffff; } /* Tertiary */ .ui.tertiary.teal.buttons .button, .ui.tertiary.teal.buttons .tertiary.button, .ui.tertiary.teal.button { background: transparent; box-shadow: none; color: #00b5ad; } .ui.tertiary.teal.buttons .button:hover, .ui.tertiary.teal.buttons button:hover, .ui.tertiary.teal.button:hover { box-shadow: inset 0 -0.2em 0 #108c86; color: #108c86; } .ui.tertiary.teal.buttons .button:focus, .ui.tertiary.teal.buttons .tertiary.button:focus, .ui.tertiary.teal.button:focus { box-shadow: inset 0 -0.2em 0 #0e7e79; color: #0e7e79; } .ui.tertiary.teal.buttons .active.button, .ui.tertiary.teal.buttons .tertiary.active.button, .ui.tertiary.teal.active.button, .ui.tertiary.teal.buttons .button:active, .ui.tertiary.teal.buttons .tertiary.button:active, .ui.tertiary.teal.button:active { box-shadow: inset 0 -0.2em 0 #009c95; color: #009c95; } .ui.blue.buttons .button, .ui.blue.button { background-color: #2185d0; color: #fff; text-shadow: none; background-image: none; } .ui.blue.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.blue.buttons .button:hover, .ui.blue.button:hover { background-color: #1678c2; color: #fff; text-shadow: none; } .ui.blue.buttons .button:focus, .ui.blue.button:focus { background-color: #0d71bb; color: #fff; text-shadow: none; } .ui.blue.buttons .button:active, .ui.blue.button:active { background-color: #1a69a4; color: #fff; text-shadow: none; } .ui.blue.buttons .active.button, .ui.blue.buttons .active.button:active, .ui.blue.active.button, .ui.blue.button .active.button:active { background-color: #1279c6; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.blue.buttons .button, .ui.basic.blue.button { background: transparent; box-shadow: 0 0 0 1px #2185d0 inset; color: #2185d0; } .ui.basic.blue.buttons .button:hover, .ui.basic.blue.button:hover { background: transparent; box-shadow: 0 0 0 1px #1678c2 inset; color: #1678c2; } .ui.basic.blue.buttons .button:focus, .ui.basic.blue.button:focus { background: transparent; box-shadow: 0 0 0 1px #0d71bb inset; color: #1678c2; } .ui.basic.blue.buttons .active.button, .ui.basic.blue.active.button { background: transparent; box-shadow: 0 0 0 1px #1279c6 inset; color: #1a69a4; } .ui.basic.blue.buttons .button:active, .ui.basic.blue.button:active { box-shadow: 0 0 0 1px #1a69a4 inset; color: #1a69a4; } /* Inverted */ .ui.inverted.blue.buttons .button, .ui.inverted.blue.button { background-color: transparent; box-shadow: 0 0 0 2px #54c8ff inset; color: #54c8ff; } .ui.inverted.blue.buttons .button:hover, .ui.inverted.blue.button:hover, .ui.inverted.blue.buttons .button:focus, .ui.inverted.blue.button:focus, .ui.inverted.blue.buttons .button.active, .ui.inverted.blue.button.active, .ui.inverted.blue.buttons .button:active, .ui.inverted.blue.button:active { box-shadow: none; color: #fff; } .ui.inverted.blue.buttons .button:hover, .ui.inverted.blue.button:hover { background-color: #21b8ff; } .ui.inverted.blue.buttons .button:focus, .ui.inverted.blue.button:focus { background-color: #2bbbff; } .ui.inverted.blue.buttons .active.button, .ui.inverted.blue.active.button { background-color: #3ac0ff; } .ui.inverted.blue.buttons .button:active, .ui.inverted.blue.button:active { background-color: #21b8ff; } /* Inverted Basic */ .ui.inverted.blue.basic.buttons .button, .ui.inverted.blue.buttons .basic.button, .ui.inverted.blue.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.blue.basic.buttons .button:hover, .ui.inverted.blue.buttons .basic.button:hover, .ui.inverted.blue.basic.button:hover { box-shadow: 0 0 0 2px #21b8ff inset; color: #54c8ff; } .ui.inverted.blue.basic.buttons .button:focus, .ui.inverted.blue.basic.buttons .button:focus, .ui.inverted.blue.basic.button:focus { box-shadow: 0 0 0 2px #2bbbff inset; color: #54c8ff; } .ui.inverted.blue.basic.buttons .active.button, .ui.inverted.blue.buttons .basic.active.button, .ui.inverted.blue.basic.active.button { box-shadow: 0 0 0 2px #3ac0ff inset; color: #54c8ff; } .ui.inverted.blue.basic.buttons .button:active, .ui.inverted.blue.buttons .basic.button:active, .ui.inverted.blue.basic.button:active { box-shadow: 0 0 0 2px #21b8ff inset; color: #54c8ff; } /* Tertiary */ .ui.tertiary.blue.buttons .button, .ui.tertiary.blue.buttons .tertiary.button, .ui.tertiary.blue.button { background: transparent; box-shadow: none; color: #2185d0; } .ui.tertiary.blue.buttons .button:hover, .ui.tertiary.blue.buttons button:hover, .ui.tertiary.blue.button:hover { box-shadow: inset 0 -0.2em 0 #2b75ac; color: #2b75ac; } .ui.tertiary.blue.buttons .button:focus, .ui.tertiary.blue.buttons .tertiary.button:focus, .ui.tertiary.blue.button:focus { box-shadow: inset 0 -0.2em 0 #216ea7; color: #216ea7; } .ui.tertiary.blue.buttons .active.button, .ui.tertiary.blue.buttons .tertiary.active.button, .ui.tertiary.blue.active.button, .ui.tertiary.blue.buttons .button:active, .ui.tertiary.blue.buttons .tertiary.button:active, .ui.tertiary.blue.button:active { box-shadow: inset 0 -0.2em 0 #007bd8; color: #1279c6; } .ui.violet.buttons .button, .ui.violet.button { background-color: #6435c9; color: #fff; text-shadow: none; background-image: none; } .ui.violet.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.violet.buttons .button:hover, .ui.violet.button:hover { background-color: #5829bb; color: #fff; text-shadow: none; } .ui.violet.buttons .button:focus, .ui.violet.button:focus { background-color: #4f20b5; color: #fff; text-shadow: none; } .ui.violet.buttons .button:active, .ui.violet.button:active { background-color: #502aa1; color: #fff; text-shadow: none; } .ui.violet.buttons .active.button, .ui.violet.buttons .active.button:active, .ui.violet.active.button, .ui.violet.button .active.button:active { background-color: #5626bf; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.violet.buttons .button, .ui.basic.violet.button { background: transparent; box-shadow: 0 0 0 1px #6435c9 inset; color: #6435c9; } .ui.basic.violet.buttons .button:hover, .ui.basic.violet.button:hover { background: transparent; box-shadow: 0 0 0 1px #5829bb inset; color: #5829bb; } .ui.basic.violet.buttons .button:focus, .ui.basic.violet.button:focus { background: transparent; box-shadow: 0 0 0 1px #4f20b5 inset; color: #5829bb; } .ui.basic.violet.buttons .active.button, .ui.basic.violet.active.button { background: transparent; box-shadow: 0 0 0 1px #5626bf inset; color: #502aa1; } .ui.basic.violet.buttons .button:active, .ui.basic.violet.button:active { box-shadow: 0 0 0 1px #502aa1 inset; color: #502aa1; } /* Inverted */ .ui.inverted.violet.buttons .button, .ui.inverted.violet.button { background-color: transparent; box-shadow: 0 0 0 2px #a291fb inset; color: #a291fb; } .ui.inverted.violet.buttons .button:hover, .ui.inverted.violet.button:hover, .ui.inverted.violet.buttons .button:focus, .ui.inverted.violet.button:focus, .ui.inverted.violet.buttons .button.active, .ui.inverted.violet.button.active, .ui.inverted.violet.buttons .button:active, .ui.inverted.violet.button:active { box-shadow: none; color: #fff; } .ui.inverted.violet.buttons .button:hover, .ui.inverted.violet.button:hover { background-color: #745aff; } .ui.inverted.violet.buttons .button:focus, .ui.inverted.violet.button:focus { background-color: #7d64ff; } .ui.inverted.violet.buttons .active.button, .ui.inverted.violet.active.button { background-color: #8a73ff; } .ui.inverted.violet.buttons .button:active, .ui.inverted.violet.button:active { background-color: #7860f9; } /* Inverted Basic */ .ui.inverted.violet.basic.buttons .button, .ui.inverted.violet.buttons .basic.button, .ui.inverted.violet.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.violet.basic.buttons .button:hover, .ui.inverted.violet.buttons .basic.button:hover, .ui.inverted.violet.basic.button:hover { box-shadow: 0 0 0 2px #745aff inset; color: #a291fb; } .ui.inverted.violet.basic.buttons .button:focus, .ui.inverted.violet.basic.buttons .button:focus, .ui.inverted.violet.basic.button:focus { box-shadow: 0 0 0 2px #7d64ff inset; color: #a291fb; } .ui.inverted.violet.basic.buttons .active.button, .ui.inverted.violet.buttons .basic.active.button, .ui.inverted.violet.basic.active.button { box-shadow: 0 0 0 2px #8a73ff inset; color: #a291fb; } .ui.inverted.violet.basic.buttons .button:active, .ui.inverted.violet.buttons .basic.button:active, .ui.inverted.violet.basic.button:active { box-shadow: 0 0 0 2px #7860f9 inset; color: #a291fb; } /* Tertiary */ .ui.tertiary.violet.buttons .button, .ui.tertiary.violet.buttons .tertiary.button, .ui.tertiary.violet.button { background: transparent; box-shadow: none; color: #6435c9; } .ui.tertiary.violet.buttons .button:hover, .ui.tertiary.violet.buttons button:hover, .ui.tertiary.violet.button:hover { box-shadow: inset 0 -0.2em 0 #6040a5; color: #6040a5; } .ui.tertiary.violet.buttons .button:focus, .ui.tertiary.violet.buttons .tertiary.button:focus, .ui.tertiary.violet.button:focus { box-shadow: inset 0 -0.2em 0 #5735a0; color: #5735a0; } .ui.tertiary.violet.buttons .active.button, .ui.tertiary.violet.buttons .tertiary.active.button, .ui.tertiary.violet.active.button, .ui.tertiary.violet.buttons .button:active, .ui.tertiary.violet.buttons .tertiary.button:active, .ui.tertiary.violet.button:active { box-shadow: inset 0 -0.2em 0 #4e0fd6; color: #5626bf; } .ui.purple.buttons .button, .ui.purple.button { background-color: #a333c8; color: #fff; text-shadow: none; background-image: none; } .ui.purple.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.purple.buttons .button:hover, .ui.purple.button:hover { background-color: #9627ba; color: #fff; text-shadow: none; } .ui.purple.buttons .button:focus, .ui.purple.button:focus { background-color: #8f1eb4; color: #fff; text-shadow: none; } .ui.purple.buttons .button:active, .ui.purple.button:active { background-color: #82299f; color: #fff; text-shadow: none; } .ui.purple.buttons .active.button, .ui.purple.buttons .active.button:active, .ui.purple.active.button, .ui.purple.button .active.button:active { background-color: #9724be; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.purple.buttons .button, .ui.basic.purple.button { background: transparent; box-shadow: 0 0 0 1px #a333c8 inset; color: #a333c8; } .ui.basic.purple.buttons .button:hover, .ui.basic.purple.button:hover { background: transparent; box-shadow: 0 0 0 1px #9627ba inset; color: #9627ba; } .ui.basic.purple.buttons .button:focus, .ui.basic.purple.button:focus { background: transparent; box-shadow: 0 0 0 1px #8f1eb4 inset; color: #9627ba; } .ui.basic.purple.buttons .active.button, .ui.basic.purple.active.button { background: transparent; box-shadow: 0 0 0 1px #9724be inset; color: #82299f; } .ui.basic.purple.buttons .button:active, .ui.basic.purple.button:active { box-shadow: 0 0 0 1px #82299f inset; color: #82299f; } /* Inverted */ .ui.inverted.purple.buttons .button, .ui.inverted.purple.button { background-color: transparent; box-shadow: 0 0 0 2px #dc73ff inset; color: #dc73ff; } .ui.inverted.purple.buttons .button:hover, .ui.inverted.purple.button:hover, .ui.inverted.purple.buttons .button:focus, .ui.inverted.purple.button:focus, .ui.inverted.purple.buttons .button.active, .ui.inverted.purple.button.active, .ui.inverted.purple.buttons .button:active, .ui.inverted.purple.button:active { box-shadow: none; color: #fff; } .ui.inverted.purple.buttons .button:hover, .ui.inverted.purple.button:hover { background-color: #cf40ff; } .ui.inverted.purple.buttons .button:focus, .ui.inverted.purple.button:focus { background-color: #d24aff; } .ui.inverted.purple.buttons .active.button, .ui.inverted.purple.active.button { background-color: #d65aff; } .ui.inverted.purple.buttons .button:active, .ui.inverted.purple.button:active { background-color: #cf40ff; } /* Inverted Basic */ .ui.inverted.purple.basic.buttons .button, .ui.inverted.purple.buttons .basic.button, .ui.inverted.purple.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.purple.basic.buttons .button:hover, .ui.inverted.purple.buttons .basic.button:hover, .ui.inverted.purple.basic.button:hover { box-shadow: 0 0 0 2px #cf40ff inset; color: #dc73ff; } .ui.inverted.purple.basic.buttons .button:focus, .ui.inverted.purple.basic.buttons .button:focus, .ui.inverted.purple.basic.button:focus { box-shadow: 0 0 0 2px #d24aff inset; color: #dc73ff; } .ui.inverted.purple.basic.buttons .active.button, .ui.inverted.purple.buttons .basic.active.button, .ui.inverted.purple.basic.active.button { box-shadow: 0 0 0 2px #d65aff inset; color: #dc73ff; } .ui.inverted.purple.basic.buttons .button:active, .ui.inverted.purple.buttons .basic.button:active, .ui.inverted.purple.basic.button:active { box-shadow: 0 0 0 2px #cf40ff inset; color: #dc73ff; } /* Tertiary */ .ui.tertiary.purple.buttons .button, .ui.tertiary.purple.buttons .tertiary.button, .ui.tertiary.purple.button { background: transparent; box-shadow: none; color: #a333c8; } .ui.tertiary.purple.buttons .button:hover, .ui.tertiary.purple.buttons button:hover, .ui.tertiary.purple.button:hover { box-shadow: inset 0 -0.2em 0 #8a3ea4; color: #8a3ea4; } .ui.tertiary.purple.buttons .button:focus, .ui.tertiary.purple.buttons .tertiary.button:focus, .ui.tertiary.purple.button:focus { box-shadow: inset 0 -0.2em 0 #84339f; color: #84339f; } .ui.tertiary.purple.buttons .active.button, .ui.tertiary.purple.buttons .tertiary.active.button, .ui.tertiary.purple.active.button, .ui.tertiary.purple.buttons .button:active, .ui.tertiary.purple.buttons .tertiary.button:active, .ui.tertiary.purple.button:active { box-shadow: inset 0 -0.2em 0 #a30dd4; color: #9724be; } .ui.pink.buttons .button, .ui.pink.button { background-color: #e03997; color: #fff; text-shadow: none; background-image: none; } .ui.pink.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.pink.buttons .button:hover, .ui.pink.button:hover { background-color: #e61a8d; color: #fff; text-shadow: none; } .ui.pink.buttons .button:focus, .ui.pink.button:focus { background-color: #e10f85; color: #fff; text-shadow: none; } .ui.pink.buttons .button:active, .ui.pink.button:active { background-color: #c71f7e; color: #fff; text-shadow: none; } .ui.pink.buttons .active.button, .ui.pink.buttons .active.button:active, .ui.pink.active.button, .ui.pink.button .active.button:active { background-color: #ea158d; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.pink.buttons .button, .ui.basic.pink.button { background: transparent; box-shadow: 0 0 0 1px #e03997 inset; color: #e03997; } .ui.basic.pink.buttons .button:hover, .ui.basic.pink.button:hover { background: transparent; box-shadow: 0 0 0 1px #e61a8d inset; color: #e61a8d; } .ui.basic.pink.buttons .button:focus, .ui.basic.pink.button:focus { background: transparent; box-shadow: 0 0 0 1px #e10f85 inset; color: #e61a8d; } .ui.basic.pink.buttons .active.button, .ui.basic.pink.active.button { background: transparent; box-shadow: 0 0 0 1px #ea158d inset; color: #c71f7e; } .ui.basic.pink.buttons .button:active, .ui.basic.pink.button:active { box-shadow: 0 0 0 1px #c71f7e inset; color: #c71f7e; } /* Inverted */ .ui.inverted.pink.buttons .button, .ui.inverted.pink.button { background-color: transparent; box-shadow: 0 0 0 2px #ff8edf inset; color: #ff8edf; } .ui.inverted.pink.buttons .button:hover, .ui.inverted.pink.button:hover, .ui.inverted.pink.buttons .button:focus, .ui.inverted.pink.button:focus, .ui.inverted.pink.buttons .button.active, .ui.inverted.pink.button.active, .ui.inverted.pink.buttons .button:active, .ui.inverted.pink.button:active { box-shadow: none; color: #fff; } .ui.inverted.pink.buttons .button:hover, .ui.inverted.pink.button:hover { background-color: #ff5bd1; } .ui.inverted.pink.buttons .button:focus, .ui.inverted.pink.button:focus { background-color: #ff65d3; } .ui.inverted.pink.buttons .active.button, .ui.inverted.pink.active.button { background-color: #ff74d8; } .ui.inverted.pink.buttons .button:active, .ui.inverted.pink.button:active { background-color: #ff5bd1; } /* Inverted Basic */ .ui.inverted.pink.basic.buttons .button, .ui.inverted.pink.buttons .basic.button, .ui.inverted.pink.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.pink.basic.buttons .button:hover, .ui.inverted.pink.buttons .basic.button:hover, .ui.inverted.pink.basic.button:hover { box-shadow: 0 0 0 2px #ff5bd1 inset; color: #ff8edf; } .ui.inverted.pink.basic.buttons .button:focus, .ui.inverted.pink.basic.buttons .button:focus, .ui.inverted.pink.basic.button:focus { box-shadow: 0 0 0 2px #ff65d3 inset; color: #ff8edf; } .ui.inverted.pink.basic.buttons .active.button, .ui.inverted.pink.buttons .basic.active.button, .ui.inverted.pink.basic.active.button { box-shadow: 0 0 0 2px #ff74d8 inset; color: #ff8edf; } .ui.inverted.pink.basic.buttons .button:active, .ui.inverted.pink.buttons .basic.button:active, .ui.inverted.pink.basic.button:active { box-shadow: 0 0 0 2px #ff5bd1 inset; color: #ff8edf; } /* Tertiary */ .ui.tertiary.pink.buttons .button, .ui.tertiary.pink.buttons .tertiary.button, .ui.tertiary.pink.button { background: transparent; box-shadow: none; color: #e03997; } .ui.tertiary.pink.buttons .button:hover, .ui.tertiary.pink.buttons button:hover, .ui.tertiary.pink.button:hover { box-shadow: inset 0 -0.2em 0 #cc3389; color: #cc3389; } .ui.tertiary.pink.buttons .button:focus, .ui.tertiary.pink.buttons .tertiary.button:focus, .ui.tertiary.pink.button:focus { box-shadow: inset 0 -0.2em 0 #c92782; color: #c92782; } .ui.tertiary.pink.buttons .active.button, .ui.tertiary.pink.buttons .tertiary.active.button, .ui.tertiary.pink.active.button, .ui.tertiary.pink.buttons .button:active, .ui.tertiary.pink.buttons .tertiary.button:active, .ui.tertiary.pink.button:active { box-shadow: inset 0 -0.2em 0 #ff0090; color: #ea158d; } .ui.brown.buttons .button, .ui.brown.button { background-color: #a5673f; color: #fff; text-shadow: none; background-image: none; } .ui.brown.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.brown.buttons .button:hover, .ui.brown.button:hover { background-color: #975b33; color: #fff; text-shadow: none; } .ui.brown.buttons .button:focus, .ui.brown.button:focus { background-color: #90532b; color: #fff; text-shadow: none; } .ui.brown.buttons .button:active, .ui.brown.button:active { background-color: #805031; color: #fff; text-shadow: none; } .ui.brown.buttons .active.button, .ui.brown.buttons .active.button:active, .ui.brown.active.button, .ui.brown.button .active.button:active { background-color: #995a31; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.brown.buttons .button, .ui.basic.brown.button { background: transparent; box-shadow: 0 0 0 1px #a5673f inset; color: #a5673f; } .ui.basic.brown.buttons .button:hover, .ui.basic.brown.button:hover { background: transparent; box-shadow: 0 0 0 1px #975b33 inset; color: #975b33; } .ui.basic.brown.buttons .button:focus, .ui.basic.brown.button:focus { background: transparent; box-shadow: 0 0 0 1px #90532b inset; color: #975b33; } .ui.basic.brown.buttons .active.button, .ui.basic.brown.active.button { background: transparent; box-shadow: 0 0 0 1px #995a31 inset; color: #805031; } .ui.basic.brown.buttons .button:active, .ui.basic.brown.button:active { box-shadow: 0 0 0 1px #805031 inset; color: #805031; } /* Inverted */ .ui.inverted.brown.buttons .button, .ui.inverted.brown.button { background-color: transparent; box-shadow: 0 0 0 2px #d67c1c inset; color: #d67c1c; } .ui.inverted.brown.buttons .button:hover, .ui.inverted.brown.button:hover, .ui.inverted.brown.buttons .button:focus, .ui.inverted.brown.button:focus, .ui.inverted.brown.buttons .button.active, .ui.inverted.brown.button.active, .ui.inverted.brown.buttons .button:active, .ui.inverted.brown.button:active { box-shadow: none; color: #fff; } .ui.inverted.brown.buttons .button:hover, .ui.inverted.brown.button:hover { background-color: #b0620f; } .ui.inverted.brown.buttons .button:focus, .ui.inverted.brown.button:focus { background-color: #c16808; } .ui.inverted.brown.buttons .active.button, .ui.inverted.brown.active.button { background-color: #cc6f0d; } .ui.inverted.brown.buttons .button:active, .ui.inverted.brown.button:active { background-color: #a96216; } /* Inverted Basic */ .ui.inverted.brown.basic.buttons .button, .ui.inverted.brown.buttons .basic.button, .ui.inverted.brown.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.brown.basic.buttons .button:hover, .ui.inverted.brown.buttons .basic.button:hover, .ui.inverted.brown.basic.button:hover { box-shadow: 0 0 0 2px #b0620f inset; color: #d67c1c; } .ui.inverted.brown.basic.buttons .button:focus, .ui.inverted.brown.basic.buttons .button:focus, .ui.inverted.brown.basic.button:focus { box-shadow: 0 0 0 2px #c16808 inset; color: #d67c1c; } .ui.inverted.brown.basic.buttons .active.button, .ui.inverted.brown.buttons .basic.active.button, .ui.inverted.brown.basic.active.button { box-shadow: 0 0 0 2px #cc6f0d inset; color: #d67c1c; } .ui.inverted.brown.basic.buttons .button:active, .ui.inverted.brown.buttons .basic.button:active, .ui.inverted.brown.basic.button:active { box-shadow: 0 0 0 2px #a96216 inset; color: #d67c1c; } /* Tertiary */ .ui.tertiary.brown.buttons .button, .ui.tertiary.brown.buttons .tertiary.button, .ui.tertiary.brown.button { background: transparent; box-shadow: none; color: #a5673f; } .ui.tertiary.brown.buttons .button:hover, .ui.tertiary.brown.buttons button:hover, .ui.tertiary.brown.button:hover { box-shadow: inset 0 -0.2em 0 #835f48; color: #835f48; } .ui.tertiary.brown.buttons .button:focus, .ui.tertiary.brown.buttons .tertiary.button:focus, .ui.tertiary.brown.button:focus { box-shadow: inset 0 -0.2em 0 #7d573e; color: #7d573e; } .ui.tertiary.brown.buttons .active.button, .ui.tertiary.brown.buttons .tertiary.active.button, .ui.tertiary.brown.active.button, .ui.tertiary.brown.buttons .button:active, .ui.tertiary.brown.buttons .tertiary.button:active, .ui.tertiary.brown.button:active { box-shadow: inset 0 -0.2em 0 #ae561d; color: #995a31; } .ui.grey.buttons .button, .ui.grey.button { background-color: #767676; color: #fff; text-shadow: none; background-image: none; } .ui.grey.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.grey.buttons .button:hover, .ui.grey.button:hover { background-color: #838383; color: #fff; text-shadow: none; } .ui.grey.buttons .button:focus, .ui.grey.button:focus { background-color: #8a8a8a; color: #fff; text-shadow: none; } .ui.grey.buttons .button:active, .ui.grey.button:active { background-color: #909090; color: #fff; text-shadow: none; } .ui.grey.buttons .active.button, .ui.grey.buttons .active.button:active, .ui.grey.active.button, .ui.grey.button .active.button:active { background-color: #696969; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.grey.buttons .button, .ui.basic.grey.button { background: transparent; box-shadow: 0 0 0 1px #767676 inset; color: #767676; } .ui.basic.grey.buttons .button:hover, .ui.basic.grey.button:hover { background: transparent; box-shadow: 0 0 0 1px #838383 inset; color: #838383; } .ui.basic.grey.buttons .button:focus, .ui.basic.grey.button:focus { background: transparent; box-shadow: 0 0 0 1px #8a8a8a inset; color: #838383; } .ui.basic.grey.buttons .active.button, .ui.basic.grey.active.button { background: transparent; box-shadow: 0 0 0 1px #696969 inset; color: #909090; } .ui.basic.grey.buttons .button:active, .ui.basic.grey.button:active { box-shadow: 0 0 0 1px #909090 inset; color: #909090; } /* Inverted */ .ui.inverted.grey.buttons .button, .ui.inverted.grey.button { background-color: transparent; box-shadow: 0 0 0 2px #d4d4d5 inset; color: #fff; } .ui.inverted.grey.buttons .button:hover, .ui.inverted.grey.button:hover, .ui.inverted.grey.buttons .button:focus, .ui.inverted.grey.button:focus, .ui.inverted.grey.buttons .button.active, .ui.inverted.grey.button.active, .ui.inverted.grey.buttons .button:active, .ui.inverted.grey.button:active { box-shadow: none; color: rgba(0, 0, 0, 0.6); } .ui.inverted.grey.buttons .button:hover, .ui.inverted.grey.button:hover { background-color: #c2c4c5; } .ui.inverted.grey.buttons .button:focus, .ui.inverted.grey.button:focus { background-color: #c7c9cb; } .ui.inverted.grey.buttons .active.button, .ui.inverted.grey.active.button { background-color: #cfd0d2; } .ui.inverted.grey.buttons .button:active, .ui.inverted.grey.button:active { background-color: #c2c4c5; } /* Inverted Basic */ .ui.inverted.grey.basic.buttons .button, .ui.inverted.grey.buttons .basic.button, .ui.inverted.grey.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.grey.basic.buttons .button:hover, .ui.inverted.grey.buttons .basic.button:hover, .ui.inverted.grey.basic.button:hover { box-shadow: 0 0 0 2px #c2c4c5 inset; color: #fff; } .ui.inverted.grey.basic.buttons .button:focus, .ui.inverted.grey.basic.buttons .button:focus, .ui.inverted.grey.basic.button:focus { box-shadow: 0 0 0 2px #c7c9cb inset; color: #dcddde; } .ui.inverted.grey.basic.buttons .active.button, .ui.inverted.grey.buttons .basic.active.button, .ui.inverted.grey.basic.active.button { box-shadow: 0 0 0 2px #cfd0d2 inset; color: #fff; } .ui.inverted.grey.basic.buttons .button:active, .ui.inverted.grey.buttons .basic.button:active, .ui.inverted.grey.basic.button:active { box-shadow: 0 0 0 2px #c2c4c5 inset; color: #fff; } /* Tertiary */ .ui.tertiary.grey.buttons .button, .ui.tertiary.grey.buttons .tertiary.button, .ui.tertiary.grey.button { background: transparent; box-shadow: none; color: #767676; } .ui.tertiary.grey.buttons .button:hover, .ui.tertiary.grey.buttons button:hover, .ui.tertiary.grey.button:hover { box-shadow: inset 0 -0.2em 0 #909090; color: #909090; } .ui.tertiary.grey.buttons .button:focus, .ui.tertiary.grey.buttons .tertiary.button:focus, .ui.tertiary.grey.button:focus { box-shadow: inset 0 -0.2em 0 #9f9f9f; color: #9f9f9f; } .ui.tertiary.grey.buttons .active.button, .ui.tertiary.grey.buttons .tertiary.active.button, .ui.tertiary.grey.active.button, .ui.tertiary.grey.buttons .button:active, .ui.tertiary.grey.buttons .tertiary.button:active, .ui.tertiary.grey.button:active { box-shadow: inset 0 -0.2em 0 #5d5d5d; color: #696969; } .ui.black.buttons .button, .ui.black.button { background-color: #1b1c1d; color: #fff; text-shadow: none; background-image: none; } .ui.black.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.black.buttons .button:hover, .ui.black.button:hover { background-color: #27292a; color: #fff; text-shadow: none; } .ui.black.buttons .button:focus, .ui.black.button:focus { background-color: #2f3032; color: #fff; text-shadow: none; } .ui.black.buttons .button:active, .ui.black.button:active { background-color: #343637; color: #fff; text-shadow: none; } .ui.black.buttons .active.button, .ui.black.buttons .active.button:active, .ui.black.active.button, .ui.black.button .active.button:active { background-color: #0f0f10; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.black.buttons .button, .ui.basic.black.button { background: transparent; box-shadow: 0 0 0 1px #1b1c1d inset; color: #1b1c1d; } .ui.basic.black.buttons .button:hover, .ui.basic.black.button:hover { background: transparent; box-shadow: 0 0 0 1px #27292a inset; color: #27292a; } .ui.basic.black.buttons .button:focus, .ui.basic.black.button:focus { background: transparent; box-shadow: 0 0 0 1px #2f3032 inset; color: #27292a; } .ui.basic.black.buttons .active.button, .ui.basic.black.active.button { background: transparent; box-shadow: 0 0 0 1px #0f0f10 inset; color: #343637; } .ui.basic.black.buttons .button:active, .ui.basic.black.button:active { box-shadow: 0 0 0 1px #343637 inset; color: #343637; } /* Inverted */ .ui.inverted.black.buttons .button, .ui.inverted.black.button { background-color: transparent; box-shadow: 0 0 0 2px #d4d4d5 inset; color: #fff; } .ui.inverted.black.buttons .button:hover, .ui.inverted.black.button:hover, .ui.inverted.black.buttons .button:focus, .ui.inverted.black.button:focus, .ui.inverted.black.buttons .button.active, .ui.inverted.black.button.active, .ui.inverted.black.buttons .button:active, .ui.inverted.black.button:active { box-shadow: none; color: #fff; } .ui.inverted.black.buttons .button:hover, .ui.inverted.black.button:hover { background-color: #000000; } .ui.inverted.black.buttons .button:focus, .ui.inverted.black.button:focus { background-color: #000000; } .ui.inverted.black.buttons .active.button, .ui.inverted.black.active.button { background-color: #000000; } .ui.inverted.black.buttons .button:active, .ui.inverted.black.button:active { background-color: #000000; } /* Inverted Basic */ .ui.inverted.black.basic.buttons .button, .ui.inverted.black.buttons .basic.button, .ui.inverted.black.basic.button { background-color: transparent; box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5) inset; color: #fff; } .ui.inverted.black.basic.buttons .button:hover, .ui.inverted.black.buttons .basic.button:hover, .ui.inverted.black.basic.button:hover { box-shadow: 0 0 0 2px #000000 inset; color: #fff; } .ui.inverted.black.basic.buttons .button:focus, .ui.inverted.black.basic.buttons .button:focus, .ui.inverted.black.basic.button:focus { box-shadow: 0 0 0 2px #000000 inset; color: #545454; } .ui.inverted.black.basic.buttons .active.button, .ui.inverted.black.buttons .basic.active.button, .ui.inverted.black.basic.active.button { box-shadow: 0 0 0 2px #000000 inset; color: #fff; } .ui.inverted.black.basic.buttons .button:active, .ui.inverted.black.buttons .basic.button:active, .ui.inverted.black.basic.button:active { box-shadow: 0 0 0 2px #000000 inset; color: #fff; } /* Tertiary */ .ui.tertiary.black.buttons .button, .ui.tertiary.black.buttons .tertiary.button, .ui.tertiary.black.button { background: transparent; box-shadow: none; color: #1b1c1d; } .ui.tertiary.black.buttons .button:hover, .ui.tertiary.black.buttons button:hover, .ui.tertiary.black.button:hover { box-shadow: inset 0 -0.2em 0 #8b8f93; color: #8b8f93; } .ui.tertiary.black.buttons .button:focus, .ui.tertiary.black.buttons .tertiary.button:focus, .ui.tertiary.black.button:focus { box-shadow: inset 0 -0.2em 0 #93969a; color: #93969a; } .ui.tertiary.black.buttons .active.button, .ui.tertiary.black.buttons .tertiary.active.button, .ui.tertiary.black.active.button, .ui.tertiary.black.buttons .button:active, .ui.tertiary.black.buttons .tertiary.button:active, .ui.tertiary.black.button:active { box-shadow: inset 0 -0.2em 0 #404245; color: #0f0f10; } /* Standard */ .ui.positive.buttons .button, .ui.positive.button { background-color: #21ba45; color: #fff; text-shadow: none; background-image: none; } .ui.positive.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.positive.buttons .button:hover, .ui.positive.button:hover { background-color: #16ab39; color: #fff; text-shadow: none; } .ui.positive.buttons .button:focus, .ui.positive.button:focus { background-color: #0ea432; color: #fff; text-shadow: none; } .ui.positive.buttons .button:active, .ui.positive.button:active { background-color: #198f35; color: #fff; text-shadow: none; } .ui.positive.buttons .active.button, .ui.positive.buttons .active.button:active, .ui.positive.active.button, .ui.positive.button .active.button:active { background-color: #13ae38; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.positive.buttons .button, .ui.basic.positive.button { background: transparent; box-shadow: 0 0 0 1px #21ba45 inset; color: #21ba45; } .ui.basic.positive.buttons .button:hover, .ui.basic.positive.button:hover { background: transparent; box-shadow: 0 0 0 1px #16ab39 inset; color: #16ab39; } .ui.basic.positive.buttons .button:focus, .ui.basic.positive.button:focus { background: transparent; box-shadow: 0 0 0 1px #0ea432 inset; color: #16ab39; } .ui.basic.positive.buttons .active.button, .ui.basic.positive.active.button { background: transparent; box-shadow: 0 0 0 1px #13ae38 inset; color: #198f35; } .ui.basic.positive.buttons .button:active, .ui.basic.positive.button:active { box-shadow: 0 0 0 1px #198f35 inset; color: #198f35; } .ui.buttons:not(.vertical) > .basic.positive.button:not(:first-child) { margin-left: -1px; } /* Standard */ .ui.negative.buttons .button, .ui.negative.button { background-color: #db2828; color: #fff; text-shadow: none; background-image: none; } .ui.negative.button { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.negative.buttons .button:hover, .ui.negative.button:hover { background-color: #d01919; color: #fff; text-shadow: none; } .ui.negative.buttons .button:focus, .ui.negative.button:focus { background-color: #ca1010; color: #fff; text-shadow: none; } .ui.negative.buttons .button:active, .ui.negative.button:active { background-color: #b21e1e; color: #fff; text-shadow: none; } .ui.negative.buttons .active.button, .ui.negative.buttons .active.button:active, .ui.negative.active.button, .ui.negative.button .active.button:active { background-color: #d41515; color: #fff; text-shadow: none; } /* Basic */ .ui.basic.negative.buttons .button, .ui.basic.negative.button { background: transparent; box-shadow: 0 0 0 1px #db2828 inset; color: #db2828; } .ui.basic.negative.buttons .button:hover, .ui.basic.negative.button:hover { background: transparent; box-shadow: 0 0 0 1px #d01919 inset; color: #d01919; } .ui.basic.negative.buttons .button:focus, .ui.basic.negative.button:focus { background: transparent; box-shadow: 0 0 0 1px #ca1010 inset; color: #d01919; } .ui.basic.negative.buttons .active.button, .ui.basic.negative.active.button { background: transparent; box-shadow: 0 0 0 1px #d41515 inset; color: #b21e1e; } .ui.basic.negative.buttons .button:active, .ui.basic.negative.button:active { box-shadow: 0 0 0 1px #b21e1e inset; color: #b21e1e; } .ui.buttons:not(.vertical) > .basic.negative.button:not(:first-child) { margin-left: -1px; } /******************************* Groups *******************************/ .ui.buttons { display: inline-flex; flex-direction: row; font-size: 0; vertical-align: baseline; margin: 0 0.25em 0 0; } .ui.buttons:not(.basic):not(.inverted) { box-shadow: none; } /* Clearfix */ .ui.buttons::after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } /* Standard Group */ .ui.buttons .button { flex: 1 0 auto; border-radius: 0; margin: 0; } .ui.buttons:not(.basic):not(.inverted) > .button:not(.basic):not(.inverted) { box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset; } .ui.buttons .button:first-child { border-left: none; margin-left: 0; border-top-left-radius: 0.28571429rem; border-bottom-left-radius: 0.28571429rem; } .ui.buttons .button:last-child { border-top-right-radius: 0.28571429rem; border-bottom-right-radius: 0.28571429rem; } /* Vertical Style */ .ui.vertical.buttons { display: inline-flex; flex-direction: column; } .ui.vertical.buttons .button { display: block; float: none; width: 100%; margin: 0; border-radius: 0; } .ui.vertical.buttons .button:not(.basic) { box-shadow: none; } .ui.vertical.buttons .button:first-child { border-top-left-radius: 0.28571429rem; border-top-right-radius: 0.28571429rem; } .ui.vertical.buttons .button:last-child { margin-bottom: 0; border-bottom-left-radius: 0.28571429rem; border-bottom-right-radius: 0.28571429rem; } .ui.vertical.buttons .button:only-child { border-radius: 0.28571429rem; } .ui.vertical.buttons .basic.button:not(:first-child) { border-top: none; } .ui.wrapping.buttons { flex-wrap: wrap; } .ui.wrapping.basic.buttons { border-bottom: none; } .ui.wrapping.basic.buttons .button { border-bottom: 1px solid rgba(34, 36, 38, 0.15); } .ui.wrapping.basic.buttons .button:hover { background: transparent !important; } .ui.compact.wrapping.buttons .button { flex: none; } .ui.wrapped.buttons:not(.spaced) { border-top-right-radius: 0; } .ui.wrapped.buttons:not(.spaced) .button:first-child { border-radius: 0.28571429rem 0 0 0; } .ui.wrapped.buttons:not(.spaced) .button:last-child { border-radius: 0 0 0.28571429rem 0; } .ui.wrapped[class*="top attached"].buttons { border-radius: 0.28571429rem 0 0 0; } .ui.wrapped[class*="top attached"].buttons .button:last-child { border-radius: 0; } .ui.wrapped[class*="bottom attached"].buttons { border-radius: 0 0 0 0.28571429rem; } .ui.wrapped[class*="bottom attached"].buttons .button:first-child { border-radius: 0; } .ui.spaced.buttons .ui.button { margin-bottom: 1em; margin-right: 1em; border-radius: 0.28571429rem; } .ui.spaced.basic.buttons { border: none; } .ui.spaced.basic.buttons .button { border: 1px solid rgba(34, 36, 38, 0.15); } .ui.spaced.basic.buttons .button.basic { border: none; } .ui.spaced.basic.vertical.buttons .button:first-child { border-top: 1px solid rgba(34, 36, 38, 0.15); } .ui.spaced.basic.wrapping.buttons .button:not(.basic) { border-top: 1px solid rgba(34, 36, 38, 0.15); border-right: 1px solid rgba(34, 36, 38, 0.15); } .ui.spaced.basic.wrapping.buttons .button:not(.basic):first-child { border-left: 1px solid rgba(34, 36, 38, 0.15); } .ui.spaced.basic.inverted.buttons .basic.button { margin-bottom: calc(1em + 1px); margin-top: 1px; } .ui.basic.buttons:not(.vertical).inverted .button, .ui.basic.buttons:not(.vertical) .basic.button { margin-left: -1px; border-right: none; } .ui.basic.buttons:not(.vertical):not(.spaced):not(.inverted) .basic.button { margin-top: -1px; border-bottom: none; } .ui.inverted.basic.buttons:not(.spaced) .button, .ui.attached.basic.buttons:not(.wrapping):not(.inverted) .basic.button { margin-bottom: -1px; } .ui.basic.buttons:not(.vertical):not(.attached):not(.spaced):not(.wrapping):not(.inverted) .basic.button { margin-bottom: -1px; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/calendar.css ================================================ /*! * # Fomantic-UI 2.9.4 - Calendar * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Popup *******************************/ .ui.calendar.popup { max-width: none; padding: 0; border: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; } .ui.calendar.popup.inverted::before { background: #2b2b2b; } /******************************* Calendar *******************************/ .ui.calendar .calendar:focus, .ui.calendar.popup:focus { outline: 0; } /******************************* Grid *******************************/ .ui.calendar.popup .ui.grid { display: block; white-space: nowrap; } .ui.calendar.popup .ui.grid > .column { width: auto; } /******************************* Table *******************************/ .ui.calendar .ui.table.year, .ui.calendar .ui.table.month, .ui.calendar .ui.table.minute { min-width: 15em; } .ui.calendar .ui.table.day { min-width: 18em; } .ui.calendar .ui.table.day.andweek { min-width: 22em; } .ui.calendar .ui.table.hour { min-width: 20em; } .ui.calendar .ui.table tr th, .ui.calendar .ui.table tr td { padding: 0.5em; white-space: nowrap; } .ui.calendar .ui.table tr th { border-left: none; } .ui.calendar .ui.table tr th i.icon { margin: 0; } .ui.calendar .ui.table tr:first-child th { position: relative; padding-left: 0; padding-right: 0; } .ui.calendar .ui.table.day tr:first-child th { border: none; } .ui.calendar .ui.table.day tr:nth-child(2) th { padding-top: 0.2em; padding-bottom: 0.3em; } .ui.calendar .ui.table tr td { padding-left: 0.1em; padding-right: 0.1em; } .ui.calendar .ui.table tr .link { cursor: pointer; } .ui.calendar .ui.table tr .prev.link { width: 14.28571429%; position: absolute; left: 0; } .ui.calendar .ui.table tr .next.link { width: 14.28571429%; position: absolute; right: 0; } .ui.ui.calendar .ui.table tr .disabled { pointer-events: auto; cursor: default; color: rgba(40, 40, 40, 0.3); } .ui.calendar .ui.table tr .adjacent:not(.disabled):not(.active) { color: rgba(0, 0, 0, 0.6); background: rgba(0, 0, 0, 0.03); } /* -------------- States --------------- */ .ui.calendar .ui.table tr td.today { font-weight: bold; } .ui.calendar .ui.table tr td.range { background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.95); box-shadow: none; } .ui.calendar:not(.disabled):focus .ui.table tbody tr td.focus, .ui.calendar:not(.disabled).popup.active .ui.table tbody tr td.focus { box-shadow: inset 0 0 0 1px #85b7d9; } .ui.inverted.calendar .ui.table.inverted tr td.range { background: rgba(255, 255, 255, 0.08); color: #ffffff; box-shadow: none; } .ui.inverted.calendar:not(.disabled) .calendar:focus .ui.table.inverted tbody tr td.focus, .ui.inverted.calendar:not(.disabled).popup.active .ui.table.inverted tbody tr td.focus { box-shadow: inset 0 0 0 1px #85b7d9; } .ui.inverted.calendar .ui.ui.ui.inverted.table tr .disabled { color: rgba(225, 225, 225, 0.3); } .ui.inverted.calendar .ui.inverted.table tr .adjacent:not(.disabled):not(.active) { color: rgba(255, 255, 255, 0.8); background: rgba(255, 255, 255, 0.02); } .ui.ui.ui.calendar.popup > .ui.ui.grid { margin: -1rem; } .ui.ui.ui.calendar.popup > .ui.ui.grid > .column:not(:first-child) { padding-left: 0; } .ui.ui.ui.calendar.popup > .ui.ui.grid > .column:not(:first-child) > .ui.table { border-top-left-radius: 0; border-bottom-left-radius: 0; } .ui.ui.ui.calendar.popup > .ui.ui.grid > .column:not(:last-child) { padding-right: 0; } .ui.ui.ui.calendar.popup > .ui.ui.grid > .column:not(:last-child) > .ui.table { border-top-right-radius: 0; border-bottom-right-radius: 0; } /* -------------------- Sizes --------------------- */ .ui.mini.calendar, .ui.mini.calendar .ui.table tr th, .ui.mini.calendar .ui.table tr td { font-size: 0.78571429rem; } .ui.mini.calendar .ui.table.year, .ui.mini.calendar .ui.table.month, .ui.mini.calendar .ui.table.minute { min-width: 11.78571429em; } .ui.mini.calendar .ui.table.day { min-width: 14.14285714em; } .ui.mini.calendar .ui.table.day.andweek { min-width: 17.28571429em; } .ui.mini.calendar .ui.table.hour { min-width: 15.71428571em; } .ui.tiny.calendar, .ui.tiny.calendar .ui.table tr th, .ui.tiny.calendar .ui.table tr td { font-size: 0.85714286rem; } .ui.tiny.calendar .ui.table.year, .ui.tiny.calendar .ui.table.month, .ui.tiny.calendar .ui.table.minute { min-width: 12.85714286em; } .ui.tiny.calendar .ui.table.day { min-width: 15.42857143em; } .ui.tiny.calendar .ui.table.day.andweek { min-width: 18.85714286em; } .ui.tiny.calendar .ui.table.hour { min-width: 17.14285714em; } .ui.small.calendar, .ui.small.calendar .ui.table tr th, .ui.small.calendar .ui.table tr td { font-size: 0.92857143rem; } .ui.small.calendar .ui.table.year, .ui.small.calendar .ui.table.month, .ui.small.calendar .ui.table.minute { min-width: 13.92857143em; } .ui.small.calendar .ui.table.day { min-width: 16.71428571em; } .ui.small.calendar .ui.table.day.andweek { min-width: 20.42857143em; } .ui.small.calendar .ui.table.hour { min-width: 18.57142857em; } .ui.large.calendar, .ui.large.calendar .ui.table tr th, .ui.large.calendar .ui.table tr td { font-size: 1.14285714rem; } .ui.large.calendar .ui.table.year, .ui.large.calendar .ui.table.month, .ui.large.calendar .ui.table.minute { min-width: 17.14285714em; } .ui.large.calendar .ui.table.day { min-width: 20.57142857em; } .ui.large.calendar .ui.table.day.andweek { min-width: 25.14285714em; } .ui.large.calendar .ui.table.hour { min-width: 22.85714286em; } .ui.big.calendar, .ui.big.calendar .ui.table tr th, .ui.big.calendar .ui.table tr td { font-size: 1.28571429rem; } .ui.big.calendar .ui.table.year, .ui.big.calendar .ui.table.month, .ui.big.calendar .ui.table.minute { min-width: 19.28571429em; } .ui.big.calendar .ui.table.day { min-width: 23.14285714em; } .ui.big.calendar .ui.table.day.andweek { min-width: 28.28571429em; } .ui.big.calendar .ui.table.hour { min-width: 25.71428571em; } .ui.huge.calendar, .ui.huge.calendar .ui.table tr th, .ui.huge.calendar .ui.table tr td { font-size: 1.42857143rem; } .ui.huge.calendar .ui.table.year, .ui.huge.calendar .ui.table.month, .ui.huge.calendar .ui.table.minute { min-width: 21.42857143em; } .ui.huge.calendar .ui.table.day { min-width: 25.71428571em; } .ui.huge.calendar .ui.table.day.andweek { min-width: 31.42857143em; } .ui.huge.calendar .ui.table.hour { min-width: 28.57142857em; } .ui.massive.calendar, .ui.massive.calendar .ui.table tr th, .ui.massive.calendar .ui.table tr td { font-size: 1.71428571rem; } .ui.massive.calendar .ui.table.year, .ui.massive.calendar .ui.table.month, .ui.massive.calendar .ui.table.minute { min-width: 25.71428571em; } .ui.massive.calendar .ui.table.day { min-width: 30.85714286em; } .ui.massive.calendar .ui.table.day.andweek { min-width: 37.71428571em; } .ui.massive.calendar .ui.table.hour { min-width: 34.28571429em; } /******************************* States *******************************/ /* -------------------- Disabled --------------------- */ .ui.disabled.calendar { opacity: 0.45; } .ui.disabled.calendar > .input, .ui.disabled.calendar .ui.table tr .link { pointer-events: none; } /******************************* Theme Overrides *******************************/ /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/calendar.js ================================================ /*! * # Fomantic-UI 2.9.4 - Calendar * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.calendar = function (parameters) { var $allModules = $(this), $document = $(document), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), returnedValue, timeGapTable = { 5: { row: 4, column: 3 }, 10: { row: 3, column: 2 }, 15: { row: 2, column: 2 }, 20: { row: 3, column: 1 }, 30: { row: 2, column: 1 }, }, numberText = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight'] ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.calendar.settings, parameters) : $.extend({}, $.fn.calendar.settings), className = settings.className, namespace = settings.namespace, selector = settings.selector, formatter = settings.formatter, parser = settings.parser, metadata = settings.metadata, timeGap = timeGapTable[settings.minTimeGap], error = settings.error, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $input = $module.find(selector.input), $activator = $module.find(selector.activator), element = this, instance = $module.data(moduleNamespace), $container = instance && instance.popupId ? $document.find('#' + instance.popupId) : $module.find(selector.popup), isTouch, isTouchDown = false, isInverted = $module.hasClass(className.inverted), focusDateUsedForRange = false, selectionComplete = false, classObserver, module ; module = { initialize: function () { module.debug('Initializing calendar for', element, $module); isTouch = module.get.isTouch(); module.setup.config(); module.setup.popup(); module.setup.inline(); module.setup.input(); module.setup.date(); module.create.calendar(); module.bind.events(); module.observeChanges(); module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of calendar'); instance = module; $module.data(moduleNamespace, instance); }, destroy: function () { module.verbose('Destroying previous calendar for', element); $module.removeData([ metadata.date, metadata.focusDate, metadata.startDate, metadata.endDate, metadata.minDate, metadata.maxDate, metadata.mode, metadata.monthOffset, moduleNamespace, ]); module.unbind.events(); module.disconnect.classObserver(); }, setup: { config: function () { if (module.get.minDate() !== null) { module.set.minDate($module.data(metadata.minDate)); } if (module.get.maxDate() !== null) { module.set.maxDate($module.data(metadata.maxDate)); } module.setting('type', module.get.type()); module.setting('on', settings.on || 'click'); }, popup: function () { if (settings.inline) { return; } if ($activator.length === 0) { $activator = $module.children().first(); if ($activator.length === 0) { return; } } if ($.fn.popup === undefined) { module.error(error.popup); return; } if ($container.length === 0) { if (settings.context) { module.popupId = namespace + '_popup_' + (Math.random().toString(16) + '000000000').slice(2, 10); $container = $('<div/>', { id: module.popupId }).addClass(className.popup).appendTo($document.find(settings.context)); } else { // prepend the popup element to the activator's parent so that it has less chance of messing with // the styling (eg input action button needs to be the last child to have correct border radius) var $activatorParent = $activator.parent(), domPositionFunction = $activatorParent.closest(selector.append).length > 0 ? 'appendTo' : 'prependTo' ; $container = $('<div/>').addClass(className.popup)[domPositionFunction]($activatorParent); } } $container.addClass(className.calendar); if (isInverted) { $container.addClass(className.inverted); } var onVisible = function () { module.refreshTooltips(); return settings.onVisible.apply($container, arguments); }; var onHidden = function () { module.blur(); return settings.onHidden.apply($container, arguments); }; if ($input.length === 0) { // no input, $container has to handle focus/blur $container.attr('tabindex', '0'); onVisible = function () { module.refreshTooltips(); module.focus(); return settings.onVisible.apply($container, arguments); }; } var onShow = function () { // reset the focus date onShow module.set.focusDate(module.get.date()); module.set.mode(module.get.validatedMode(settings.startMode)); return settings.onShow.apply($container, arguments); }; var on = module.setting('on'); var options = $.extend({}, settings.popupOptions, { popup: $container, movePopup: !settings.context, on: on, hoverable: on === 'hover', closable: on === 'click', onShow: onShow, onVisible: onVisible, onHide: settings.onHide, onHidden: onHidden, }); module.popup(options); }, inline: function () { if ($activator.length > 0 && !settings.inline) { return; } settings.inline = true; $container = $('<div/>').addClass(className.calendar).appendTo($module); if ($input.length === 0) { $container.attr('tabindex', '0'); } }, input: function () { if (settings.touchReadonly && $input.length > 0 && isTouch) { $input.prop('readonly', true); } module.check.disabled(); }, date: function () { var date; if (settings.initialDate) { date = parser.date(settings.initialDate, settings); } else if ($module.data(metadata.date) !== undefined) { date = parser.date($module.data(metadata.date), settings); } else if ($input.length > 0) { date = parser.date($input.val(), settings); } module.set.date(date, settings.formatInput, false); module.set.mode(module.get.mode(), false); }, }, trigger: { change: function () { var inputElement = $input[0] ; if (inputElement) { var events = document.createEvent('HTMLEvents'); module.verbose('Triggering native change event'); events.initEvent('change', true, false); inputElement.dispatchEvent(events); } }, }, create: { calendar: function () { var i, r, c, p, row, cell, pageGrid ; var mode = module.get.mode(), today = new Date(), date = module.get.date(), focusDate = module.get.focusDate(), display = module.helper.dateInRange(focusDate || date || parser.date(settings.initialDate, settings) || today) ; if (!focusDate) { focusDate = display; module.set.focusDate(focusDate, false, false); } var isYear = mode === 'year', isMonth = mode === 'month', isDay = mode === 'day', isHour = mode === 'hour', isMinute = mode === 'minute', isTimeOnly = settings.type === 'time' ; var multiMonth = Math.max(settings.multiMonth, 1); var monthOffset = !isDay ? 0 : module.get.monthOffset(); var minute = display.getMinutes(), hour = display.getHours(), day = display.getDate(), startMonth = display.getMonth() + monthOffset, year = display.getFullYear() ; var columns = isDay ? (settings.showWeekNumbers ? 8 : 7) : (isHour ? 4 : timeGap.column); var rows = isDay || isHour ? 6 : timeGap.row; var pages = isDay ? multiMonth : 1; var container = $container; var tooltipPosition = container.hasClass('left') ? 'right center' : 'left center'; container.empty(); if (pages > 1) { pageGrid = $('<div/>').addClass(className.grid).appendTo(container); } for (p = 0; p < pages; p++) { if (pages > 1) { var pageColumn = $('<div/>').addClass(className.column).appendTo(pageGrid); container = pageColumn; } var month = startMonth + p; var firstMonthDayColumn = (new Date(year, month, 1).getDay() - (settings.firstDayOfWeek % 7) + 7) % 7; if (!settings.constantHeight && isDay) { var requiredCells = new Date(year, month + 1, 0).getDate() + firstMonthDayColumn; rows = Math.ceil(requiredCells / 7); } var yearChange = isYear ? 10 : (isMonth ? 1 : 0), monthChange = isDay ? 1 : 0, dayChange = isHour || isMinute ? 1 : 0, prevNextDay = isHour || isMinute ? day : 1, prevDate = new Date(year - yearChange, month - monthChange, prevNextDay - dayChange, hour), nextDate = new Date(year + yearChange, month + monthChange, prevNextDay + dayChange, hour), prevLast = isYear ? new Date(Math.ceil(year / 10) * 10 - 9, 0, 0) : (isMonth ? new Date(year, 0, 0) : (isDay // eslint-disable-line unicorn/no-nested-ternary ? new Date(year, month, 0) : new Date(year, month, day, -1))), nextFirst = isYear ? new Date(Math.ceil(year / 10) * 10 + 1, 0, 1) : (isMonth ? new Date(year + 1, 0, 1) : (isDay // eslint-disable-line unicorn/no-nested-ternary ? new Date(year, month + 1, 1) : new Date(year, month, day + 1))) ; var tempMode = mode; if (isDay && settings.showWeekNumbers) { tempMode += ' andweek'; } var table = $('<table/>').addClass(className.table).addClass(tempMode).addClass(numberText[columns] + ' column') .appendTo(container); if (isInverted) { table.addClass(className.inverted); } var textColumns = columns; // no header for time-only mode if (!isTimeOnly) { var thead = $('<thead/>').appendTo(table); row = $('<tr/>').appendTo(thead); cell = $('<th/>').attr('colspan', '' + columns).appendTo(row); var headerDate = isYear || isMonth ? new Date(year, 0, 1) : (isDay ? new Date(year, month, 1) : new Date(year, month, day, hour, minute)); var headerText = $('<span/>').addClass(className.link).appendTo(cell); headerText.text(module.helper.dateFormat(formatter[mode + 'Header'], headerDate)); var newMode = isMonth ? (settings.disableYear ? 'day' : 'year') : (isDay ? (settings.disableMonth ? 'year' : 'month') // eslint-disable-line unicorn/no-nested-ternary : 'day'); headerText.data(metadata.mode, newMode); if (p === 0) { var prev = $('<span/>').addClass(className.prev).appendTo(cell); prev.data(metadata.focusDate, prevDate); prev.toggleClass(className.disabledCell, !module.helper.isDateInRange(prevLast, mode)); $('<i/>').addClass(className.prevIcon).appendTo(prev); } if (p === pages - 1) { var next = $('<span/>').addClass(className.next).appendTo(cell); next.data(metadata.focusDate, nextDate); next.toggleClass(className.disabledCell, !module.helper.isDateInRange(nextFirst, mode)); $('<i/>').addClass(className.nextIcon).appendTo(next); } if (isDay) { row = $('<tr/>').appendTo(thead); if (settings.showWeekNumbers) { cell = $('<th/>').appendTo(row); cell.text(settings.text.weekNo); cell.addClass(className.weekCell); textColumns--; } for (i = 0; i < textColumns; i++) { cell = $('<th/>').appendTo(row); cell.text(formatter.dayColumnHeader((i + settings.firstDayOfWeek) % 7, settings)); } } } var tbody = $('<tbody/>').appendTo(table); i = isYear ? Math.ceil(year / 10) * 10 - 9 : (isDay ? 1 - firstMonthDayColumn : 0); for (r = 0; r < rows; r++) { row = $('<tr/>').appendTo(tbody); if (isDay && settings.showWeekNumbers) { cell = $('<th/>').appendTo(row); cell.text(module.get.weekOfYear(year, month, i + 1 - settings.firstDayOfWeek)); cell.addClass(className.weekCell); } for (c = 0; c < textColumns; c++, i++) { var cellDate = isYear ? new Date(i, month, 1, hour, minute) : (isMonth ? new Date(year, i, 1, hour, minute) : (isDay // eslint-disable-line unicorn/no-nested-ternary ? new Date(year, month, i, hour, minute) : (isHour ? new Date(year, month, day, i) : new Date(year, month, day, hour, i * settings.minTimeGap)))); var cellText = isYear ? i : (isMonth ? settings.text.monthsShort[i] : (isDay // eslint-disable-line unicorn/no-nested-ternary ? cellDate.getDate() : module.helper.dateFormat(formatter.cellTime, cellDate))); cell = $('<td/>').addClass(className.cell).appendTo(row); cell.text(cellText); cell.data(metadata.date, cellDate); var adjacent = isDay && cellDate.getMonth() !== ((month + 12) % 12); var disabled = (!settings.selectAdjacentDays && adjacent) || !module.helper.isDateInRange(cellDate, mode) || settings.isDisabled(cellDate, mode) || module.helper.isDisabled(cellDate, mode) || !module.helper.isEnabled(cellDate, mode); var eventDate; if (disabled) { var disabledDate = module.helper.findDayAsObject(cellDate, mode, settings.disabledDates); if (disabledDate !== null && disabledDate[metadata.message]) { cell.attr('data-tooltip', disabledDate[metadata.message]); cell.attr('data-position', disabledDate[metadata.position] || tooltipPosition); if (disabledDate[metadata.inverted] || (isInverted && disabledDate[metadata.inverted] === undefined)) { cell.attr('data-inverted', ''); } if (disabledDate[metadata.variation]) { cell.attr('data-variation', disabledDate[metadata.variation]); } } if (mode === 'hour') { var disabledHour = module.helper.findHourAsObject(cellDate, mode, settings.disabledHours); if (disabledHour !== null && disabledHour[metadata.message]) { cell.attr('data-tooltip', disabledHour[metadata.message]); cell.attr('data-position', disabledHour[metadata.position] || tooltipPosition); if (disabledHour[metadata.inverted] || (isInverted && disabledHour[metadata.inverted] === undefined)) { cell.attr('data-inverted', ''); } if (disabledHour[metadata.variation]) { cell.attr('data-variation', disabledHour[metadata.variation]); } } } } else { eventDate = module.helper.findDayAsObject(cellDate, mode, settings.eventDates); if (eventDate !== null) { cell.addClass(eventDate[metadata.class] || settings.eventClass); if (eventDate[metadata.message]) { cell.attr('data-tooltip', eventDate[metadata.message]); cell.attr('data-position', eventDate[metadata.position] || tooltipPosition); if (eventDate[metadata.inverted] || (isInverted && eventDate[metadata.inverted] === undefined)) { cell.attr('data-inverted', ''); } if (eventDate[metadata.variation]) { cell.attr('data-variation', eventDate[metadata.variation]); } } } } var active = module.helper.dateEqual(cellDate, date, mode); var isToday = module.helper.dateEqual(cellDate, today, mode); cell.toggleClass(className.adjacentCell, adjacent && !eventDate); cell.toggleClass(className.disabledCell, disabled); cell.toggleClass(className.activeCell, active && !(adjacent && disabled)); if (!isHour && !isMinute) { cell.toggleClass(className.todayCell, !adjacent && isToday); } // Allow for external modifications of each cell var cellOptions = { mode: mode, adjacent: adjacent, disabled: disabled, active: active, today: isToday, }; formatter.cell(cell, cellDate, cellOptions); if (module.helper.dateEqual(cellDate, focusDate, mode)) { // ensure that the focus date is exactly equal to the cell date // so that, if selected, the correct value is set module.set.focusDate(cellDate, false, false); } } } if (settings.today) { var todayRow = $('<tr/>').appendTo(tbody); var todayButton = $('<td/>').attr('colspan', '' + columns).addClass(className.today).appendTo(todayRow); todayButton.text(formatter.today(settings)); todayButton.data(metadata.date, today); } module.update.focus(false, table); if (settings.inline) { module.refreshTooltips(); } } }, }, update: { focus: function (updateRange, container) { container = container || $container; var mode = module.get.mode(); var date = module.get.date(); var focusDate = module.get.focusDate(); var startDate = module.get.startDate(); var endDate = module.get.endDate(); var rangeDate = (updateRange ? focusDate : null) || date || (!isTouch ? focusDate : null); container.find('td').each(function () { var $cell = $(this); var cellDate = $cell.data(metadata.date); if (!cellDate) { return; } var disabled = $cell.hasClass(className.disabledCell); var active = $cell.hasClass(className.activeCell); var adjacent = $cell.hasClass(className.adjacentCell); var focused = module.helper.dateEqual(cellDate, focusDate, mode); var inRange = !rangeDate ? false : (!!startDate && module.helper.isDateInRange(cellDate, mode, startDate, rangeDate)) || (!!endDate && module.helper.isDateInRange(cellDate, mode, rangeDate, endDate)); $cell.toggleClass(className.focusCell, focused && (!isTouch || isTouchDown) && (!adjacent || (settings.selectAdjacentDays && adjacent)) && !disabled); if (module.helper.isTodayButton($cell)) { return; } $cell.toggleClass(className.rangeCell, inRange && !active && !disabled); }); }, }, refresh: function () { module.create.calendar(); }, refreshTooltips: function () { var winWidth = $(window).width(); $container.find('td[data-position]').each(function () { var $cell = $(this); var tooltipWidth = window.getComputedStyle($cell[0], '::after').width.replace(/[^\d.]/g, ''); var tooltipPosition = $cell.attr('data-position'); // use a fallback width of 250 (calendar width) for IE/Edge (which return "auto") var calcPosition = (winWidth - $cell.width() - (parseInt(tooltipWidth, 10) || 250)) > $cell.offset().left ? 'right' : 'left'; if (tooltipPosition.indexOf(calcPosition) === -1) { $cell.attr('data-position', tooltipPosition.replace(/(left|right)/, calcPosition)); } }); }, bind: { events: function () { module.debug('Binding events'); $container.on('mousedown' + eventNamespace, module.event.mousedown); $container.on('touchstart' + eventNamespace, module.event.mousedown); $container.on('mouseup' + eventNamespace, module.event.mouseup); $container.on('touchend' + eventNamespace, module.event.mouseup); $container.on('mouseover' + eventNamespace, module.event.mouseover); if ($input.length > 0) { $input.on('input' + eventNamespace, module.event.inputChange); $input.on('focus' + eventNamespace, module.event.inputFocus); $input.on('blur' + eventNamespace, module.event.inputBlur); $input.on('keydown' + eventNamespace, module.event.keydown); } else { $container.on('keydown' + eventNamespace, module.event.keydown); } }, }, unbind: { events: function () { module.debug('Unbinding events'); $container.off(eventNamespace); if ($input.length > 0) { $input.off(eventNamespace); } }, }, event: { mouseover: function (event) { var target = $(event.target); var date = target.data(metadata.date); var mousedown = event.buttons === 1; if (date) { module.set.focusDate(date, false, true, mousedown); } }, mousedown: function (event) { if ($input.length > 0) { // prevent the mousedown on the calendar causing the input to lose focus event.preventDefault(); } isTouchDown = event.type.indexOf('touch') >= 0; var target = $(event.target); var date = target.data(metadata.date); if (date) { module.set.focusDate(date, false, true, true); } }, mouseup: function (event) { // ensure input has focus so that it receives keydown events for calendar navigation module.focus(); event.preventDefault(); event.stopPropagation(); isTouchDown = false; var target = $(event.target); if (target.hasClass('disabled')) { return; } var parent = target.parent(); if (parent.data(metadata.date) || parent.data(metadata.focusDate) || parent.data(metadata.mode)) { // clicked on a child element, switch to parent (used when clicking directly on prev/next <i> icon element) target = parent; } var date = target.data(metadata.date); var focusDate = target.data(metadata.focusDate); var mode = target.data(metadata.mode); if (date && settings.onSelect.call(element, date, module.get.mode()) !== false) { var forceSet = target.hasClass(className.today); module.selectDate(date, forceSet); } else if (focusDate) { module.set.focusDate(focusDate); } else if (mode) { module.set.mode(mode); } }, keydown: function (event) { var keyCode = event.which; if (keyCode === 9) { // tab module.popup('hide'); } if (module.popup('is visible')) { var mode = module.get.mode(); switch (keyCode) { // arrow keys case 37: case 38: case 39: case 40: { var bigIncrement = mode === 'day' ? 7 : (mode === 'hour' ? 4 : (mode === 'minute' ? timeGap.column : 3)); // eslint-disable-line unicorn/no-nested-ternary var increment = keyCode === 37 ? -1 : (keyCode === 38 ? -bigIncrement : (keyCode === 39 ? 1 : bigIncrement)); // eslint-disable-line unicorn/no-nested-ternary increment *= mode === 'minute' ? settings.minTimeGap : 1; var focusDate = module.get.focusDate() || module.get.date() || new Date(); var year = focusDate.getFullYear() + (mode === 'year' ? increment : 0); var month = focusDate.getMonth() + (mode === 'month' ? increment : 0); var day = focusDate.getDate() + (mode === 'day' ? increment : 0); var hour = focusDate.getHours() + (mode === 'hour' ? increment : 0); var minute = focusDate.getMinutes() + (mode === 'minute' ? increment : 0); var newFocusDate = new Date(year, month, day, hour, minute); if (settings.type === 'time') { newFocusDate = module.helper.mergeDateTime(focusDate, newFocusDate); } if (module.helper.isDateInRange(newFocusDate, mode)) { module.set.focusDate(newFocusDate); } break; } // enter key case 13: { var date = module.get.focusDate(); if (date && !settings.isDisabled(date, mode) && !module.helper.isDisabled(date, mode) && module.helper.isEnabled(date, mode)) { if (settings.onSelect.call(element, date, module.get.mode()) !== false) { module.selectDate(date); } } // disable form submission: event.preventDefault(); event.stopPropagation(); break; } // escape key case 27: { module.popup('hide'); event.stopPropagation(); break; } } } if (keyCode === 38 || keyCode === 40) { // arrow-up || arrow-down event.preventDefault(); // don't scroll module.popup('show'); } }, inputChange: function () { var val = $input.val(); var date = parser.date(val, settings); module.set.date(date, false); }, inputFocus: function () { $container.addClass(className.active); }, inputBlur: function () { $container.removeClass(className.active); if (settings.formatInput) { var date = module.get.date(); var text = module.helper.dateFormat(formatter[settings.type], date); $input.val(text); } if (selectionComplete) { module.trigger.change(); selectionComplete = false; } }, class: { mutation: function (mutations) { mutations.forEach(function (mutation) { if (mutation.attributeName === 'class') { module.check.disabled(); } }); }, }, }, observeChanges: function () { if ('MutationObserver' in window) { classObserver = new MutationObserver(module.event.class.mutation); module.debug('Setting up mutation observer', classObserver); module.observe.class(); } }, disconnect: { classObserver: function () { if ($input.length > 0 && classObserver) { classObserver.disconnect(); } }, }, observe: { class: function () { if ($input.length > 0 && classObserver) { classObserver.observe($module[0], { attributes: true, }); } }, }, is: { disabled: function () { return $module.hasClass(className.disabled); }, }, check: { disabled: function () { $input.attr('tabindex', module.is.disabled() ? -1 : 0); }, }, get: { weekOfYear: function (weekYear, weekMonth, weekDay) { // adapted from http://www.merlyn.demon.co.uk/weekcalc.htm var ms1d = 24 * 3600 * 1000, ms7d = 7 * ms1d, DC3 = Date.UTC(weekYear, weekMonth, weekDay + 3) / ms1d, // an absolute day number AWN = Math.floor(DC3 / 7), // an absolute week number Wyr = new Date(AWN * ms7d).getUTCFullYear() ; return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1; }, formattedDate: function (format, date) { return module.helper.dateFormat(format || formatter[settings.type], date || module.get.date()); }, date: function (format) { return module.helper.dateObjectOrFormatted(format, $module.data(metadata.date)); }, inputDate: function () { return $input.val(); }, focusDate: function (format) { return module.helper.dateObjectOrFormatted(format, $module.data(metadata.focusDate)); }, startDate: function (format) { var startModule = module.get.calendarModule(settings.startCalendar); if (startModule) { return startModule.get.date(format); } return module.helper.dateObjectOrFormatted(format, $module.data(metadata.startDate)); }, endDate: function (format) { var endModule = module.get.calendarModule(settings.endCalendar); if (endModule) { return endModule.get.date(format); } return module.helper.dateObjectOrFormatted(format, $module.data(metadata.endDate)); }, minDate: function () { return $module.data(metadata.minDate) || null; }, maxDate: function () { return $module.data(metadata.maxDate) || null; }, monthOffset: function () { return $module.data(metadata.monthOffset) || settings.monthOffset || 0; }, mode: function () { // only returns valid modes for the current settings var mode = $module.data(metadata.mode) || settings.startMode; return module.get.validatedMode(mode); }, validatedMode: function (mode) { var validModes = module.get.validModes(); if ($.inArray(mode, validModes) >= 0) { return mode; } return settings.type === 'time' ? 'hour' : (settings.type === 'month' ? 'month' : (settings.type === 'year' ? 'year' : 'day')); // eslint-disable-line unicorn/no-nested-ternary }, type: function () { return $module.data(metadata.type) || settings.type; }, validModes: function () { var validModes = []; if (settings.type !== 'time') { if (!settings.disableYear || settings.type === 'year') { validModes.push('year'); } if (!(settings.disableMonth || settings.type === 'year') || settings.type === 'month') { validModes.push('month'); } if (settings.type.indexOf('date') >= 0) { validModes.push('day'); } } if (settings.type.indexOf('time') >= 0) { validModes.push('hour'); if (!settings.disableMinute) { validModes.push('minute'); } } return validModes; }, isTouch: function () { try { document.createEvent('TouchEvent'); return true; } catch (e) { return false; } }, calendarModule: function (selector) { if (!selector) { return null; } if (!(selector instanceof $)) { selector = $document.find(selector).first(); } // assume range related calendars are using the same namespace return selector.data(moduleNamespace); }, }, set: { date: function (date, updateInput, fireChange) { updateInput = updateInput !== false; fireChange = fireChange !== false; date = module.helper.sanitiseDate(date); date = module.helper.dateInRange(date); var mode = module.get.mode(); var text = module.helper.dateFormat(formatter[settings.type], date); if (fireChange && settings.onBeforeChange.call(element, date, text, mode) === false) { return false; } module.set.focusDate(date); if (settings.isDisabled(date, mode)) { return false; } var endDate = module.get.endDate(); if (!!endDate && !!date && date > endDate) { // selected date is greater than end date in range, so clear end date module.set.endDate(); } module.set.dataKeyValue(metadata.date, date); if (updateInput && $input.length > 0) { $input.val(text); } if (fireChange) { settings.onChange.call(element, date, text, mode); } }, startDate: function (date, refreshCalendar) { date = module.helper.sanitiseDate(date); var startModule = module.get.calendarModule(settings.startCalendar); if (startModule) { startModule.set.date(date); } module.set.dataKeyValue(metadata.startDate, date, refreshCalendar); }, endDate: function (date, refreshCalendar) { date = module.helper.sanitiseDate(date); var endModule = module.get.calendarModule(settings.endCalendar); if (endModule) { endModule.set.date(date); } module.set.dataKeyValue(metadata.endDate, date, refreshCalendar); }, focusDate: function (date, refreshCalendar, updateFocus, updateRange) { date = module.helper.sanitiseDate(date); date = module.helper.dateInRange(date); var isDay = module.get.mode() === 'day'; var oldFocusDate = module.get.focusDate(); if (isDay && date && oldFocusDate) { var yearDelta = date.getFullYear() - oldFocusDate.getFullYear(); var monthDelta = yearDelta * 12 + date.getMonth() - oldFocusDate.getMonth(); if (monthDelta) { var monthOffset = module.get.monthOffset() - monthDelta; module.set.monthOffset(monthOffset, false); } } var changed = module.set.dataKeyValue(metadata.focusDate, date, !!date && refreshCalendar); updateFocus = (updateFocus !== false && changed && refreshCalendar === false) || focusDateUsedForRange != updateRange; focusDateUsedForRange = updateRange; if (updateFocus) { module.update.focus(updateRange); } }, minDate: function (date) { date = module.helper.sanitiseDate(date); if (settings.maxDate !== null && settings.maxDate <= date) { module.verbose('Unable to set minDate variable bigger that maxDate variable', date, settings.maxDate); } else { module.setting('minDate', date); module.set.dataKeyValue(metadata.minDate, date); } }, maxDate: function (date) { date = module.helper.sanitiseDate(date); if (settings.minDate !== null && settings.minDate >= date) { module.verbose('Unable to set maxDate variable lower that minDate variable', date, settings.minDate); } else { module.setting('maxDate', date); module.set.dataKeyValue(metadata.maxDate, date); } }, monthOffset: function (monthOffset, refreshCalendar) { var multiMonth = Math.max(settings.multiMonth, 1); monthOffset = Math.max(1 - multiMonth, Math.min(0, monthOffset)); module.set.dataKeyValue(metadata.monthOffset, monthOffset, refreshCalendar); }, mode: function (mode, refreshCalendar) { module.set.dataKeyValue(metadata.mode, mode, refreshCalendar); }, dataKeyValue: function (key, value, refreshCalendar) { var oldValue = $module.data(key); var equal = oldValue === value || (oldValue <= value && oldValue >= value); // equality test for dates and string objects if (value) { $module.data(key, value); } else { $module.removeData(key); } refreshCalendar = refreshCalendar !== false && !equal; if (refreshCalendar) { module.refresh(); } return !equal; }, }, selectDate: function (date, forceSet) { module.verbose('New date selection', date); var mode = module.get.mode(); var complete = forceSet || mode === 'minute' || (settings.disableMinute && mode === 'hour') || (settings.type === 'date' && mode === 'day') || (settings.type === 'month' && mode === 'month') || (settings.type === 'year' && mode === 'year'); if (complete) { var canceled = module.set.date(date) === false; if (!canceled) { selectionComplete = true; if (settings.closable) { module.popup('hide'); // if this is a range calendar, focus the container or input. This will open the popup from its event listeners. var endModule = module.get.calendarModule(settings.endCalendar); if (endModule) { endModule.refresh(); if (endModule.setting('on') !== 'focus') { endModule.popup('show'); } endModule.focus(); } } } } else { var newMode = mode === 'year' ? (!settings.disableMonth ? 'month' : 'day') : (mode === 'month' ? 'day' : (mode === 'day' ? 'hour' : 'minute')); // eslint-disable-line unicorn/no-nested-ternary module.set.mode(newMode); if (mode === 'hour' || (mode === 'day' && module.get.date())) { // the user has chosen enough to consider a valid date/time has been chosen module.set.date(date, true, false); } else { module.set.focusDate(date); } } }, changeDate: function (date) { module.set.date(date); }, clear: function () { module.set.date(); }, popup: function () { return $activator.popup.apply($activator, arguments); }, focus: function () { if ($input.length > 0) { $input.trigger('focus'); } else { $container.trigger('focus'); } }, blur: function () { if ($input.length > 0) { $input.trigger('blur'); } else { $container.trigger('blur'); } }, helper: { dateFormat: function (format, date) { if (!(date instanceof Date)) { return ''; } if (typeof format === 'function') { return format.call(module, date, settings); } var D = date.getDate(), M = date.getMonth(), Y = date.getFullYear(), d = date.getDay(), H = date.getHours(), m = date.getMinutes(), s = date.getSeconds(), w = module.get.weekOfYear(Y, M, D + 1 - settings.firstDayOfWeek), h = H % 12 || 12, a = H < 12 ? settings.text.am.toLowerCase() : settings.text.pm.toLowerCase(), tokens = { D: D, DD: ('0' + D).slice(-2), M: M + 1, MM: ('0' + (M + 1)).slice(-2), MMM: settings.text.monthsShort[M], MMMM: settings.text.months[M], Y: Y, YY: String(Y).slice(2), YYYY: Y, d: d, dd: settings.text.dayNamesShort[d].slice(0, 2), ddd: settings.text.dayNamesShort[d], dddd: settings.text.dayNames[d], h: h, hh: ('0' + h).slice(-2), H: H, HH: ('0' + H).slice(-2), m: m, mm: ('0' + m).slice(-2), s: s, ss: ('0' + s).slice(-2), a: a, A: a.toUpperCase(), S: ['th', 'st', 'nd', 'rd'][(D % 10) > 3 ? 0 : ((D % 100) - (D % 10) === 10 ? 0 : D % 10)], w: w, ww: ('0' + w).slice(-2), } ; return format.replace(settings.regExp.token, function (match) { if (match in tokens) { return tokens[match]; } return match.slice(1, -1); }); }, dateObjectOrFormatted: function (format, date) { format = format || ''; date = module.helper.sanitiseDate(date) || null; if (!date) { return null; } if (format === '') { return date; } return module.helper.dateFormat(format, date); }, isDisabled: function (date, mode) { return (mode === 'day' || mode === 'month' || mode === 'year' || mode === 'hour') && (((mode === 'day' && settings.disabledDaysOfWeek.indexOf(date.getDay()) !== -1) || settings.disabledDates.some(function (d) { var blocked = false; if (typeof d === 'string') { d = module.helper.sanitiseDate(d); } if (d instanceof Date) { blocked = module.helper.dateEqual(date, d, mode); } else if (d !== null && typeof d === 'object') { if (d[metadata.year]) { if (typeof d[metadata.year] === 'number') { blocked = date.getFullYear() === d[metadata.year]; } else if (Array.isArray(d[metadata.year])) { blocked = d[metadata.year].indexOf(date.getFullYear()) > -1; } } else if (d[metadata.month]) { if (typeof d[metadata.month] === 'number') { blocked = date.getMonth() === d[metadata.month]; } else if (Array.isArray(d[metadata.month])) { blocked = d[metadata.month].indexOf(date.getMonth()) > -1; } else if (d[metadata.month] instanceof Date) { var sdate = module.helper.sanitiseDate(d[metadata.month]); blocked = (date.getMonth() === sdate.getMonth()) && (date.getFullYear() === sdate.getFullYear()); } } else if (d[metadata.date] && mode === 'day') { if (d[metadata.date] instanceof Date) { blocked = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode); } else if (Array.isArray(d[metadata.date])) { blocked = d[metadata.date].some(function (idate) { return module.helper.dateEqual(date, idate, mode); }); } } } return blocked; })) || (mode === 'hour' && settings.disabledHours.some(function (d) { var blocked = false; if (typeof d === 'string') { d = module.helper.sanitiseDate(d); } if (d instanceof Date) { blocked = module.helper.dateEqual(date, d, mode); } else if (typeof d === 'number') { blocked = date.getHours() === d; } else if (d !== null && typeof d === 'object') { if (d[metadata.date]) { if (d[metadata.date] instanceof Date) { blocked = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date])); } else if (Array.isArray(d[metadata.date])) { blocked = d[metadata.date].some(function (idate) { return module.helper.dateEqual(date, idate, mode); }); } } if (d[metadata.days]) { if (typeof d[metadata.days] === 'number') { blocked = date.getDay() === d[metadata.days]; } else if (Array.isArray(d[metadata.days])) { blocked = d[metadata.days].indexOf(date.getDay()) > -1; } } if (d[metadata.hours]) { if (typeof d[metadata.hours] === 'number') { blocked = blocked && date.getHours() === d[metadata.hours]; } else if (Array.isArray(d[metadata.hours])) { blocked = blocked && d[metadata.hours].indexOf(date.getHours()) > -1; } } } return blocked; }))); }, isEnabled: function (date, mode) { if (mode === 'day') { return settings.enabledDates.length === 0 || settings.enabledDates.some(function (d) { var enabled = false; if (typeof d === 'string') { d = module.helper.sanitiseDate(d); } if (d instanceof Date) { enabled = module.helper.dateEqual(date, d, mode); } else if (d !== null && typeof d === 'object' && d[metadata.date]) { enabled = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode); } return enabled; }); } return true; }, findDayAsObject: function (date, mode, dates) { if (mode === 'day' || mode === 'month' || mode === 'year') { var d; for (var i = 0; i < dates.length; i++) { d = dates[i]; if (typeof d === 'string') { d = module.helper.sanitiseDate(d); } if (d instanceof Date && module.helper.dateEqual(date, d, mode)) { var dateObject = {}; dateObject[metadata.date] = d; return dateObject; } if (d !== null && typeof d === 'object') { if (d[metadata.year]) { if (typeof d[metadata.year] === 'number' && date.getFullYear() === d[metadata.year]) { return d; } if (Array.isArray(d[metadata.year])) { if (d[metadata.year].indexOf(date.getFullYear()) > -1) { return d; } } } else if (d[metadata.month]) { if (typeof d[metadata.month] === 'number' && date.getMonth() === d[metadata.month]) { return d; } if (Array.isArray(d[metadata.month])) { if (d[metadata.month].indexOf(date.getMonth()) > -1) { return d; } } else if (d[metadata.month] instanceof Date) { var sdate = module.helper.sanitiseDate(d[metadata.month]); if ((date.getMonth() === sdate.getMonth()) && (date.getFullYear() === sdate.getFullYear())) { return d; } } } else if (d[metadata.date] && mode === 'day') { if (d[metadata.date] instanceof Date && module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode)) { return d; } if (Array.isArray(d[metadata.date])) { if (d[metadata.date].some(function (idate) { return module.helper.dateEqual(date, idate, mode); })) { return d; } } } } } } return null; }, findHourAsObject: function (date, mode, hours) { if (mode === 'hour') { var d; var hourCheck = function (date, d) { if (d[metadata.hours]) { if (typeof d[metadata.hours] === 'number' && date.getHours() === d[metadata.hours]) { return d; } if (Array.isArray(d[metadata.hours])) { if (d[metadata.hours].indexOf(date.getHours()) > -1) { return d; } } } }; for (var i = 0; i < hours.length; i++) { d = hours[i]; if (typeof d === 'number' && date.getHours() === d) { return null; } if (d !== null && typeof d === 'object') { if (d[metadata.days] && hourCheck(date, d)) { if (typeof d[metadata.days] === 'number' && date.getDay() === d[metadata.days]) { return d; } if (Array.isArray(d[metadata.days])) { if (d[metadata.days].indexOf(date.getDay()) > -1) { return d; } } } else if (d[metadata.date] && hourCheck(date, d)) { if (d[metadata.date] instanceof Date && module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]))) { return d; } if (Array.isArray(d[metadata.date])) { if (d[metadata.date].some(function (idate) { return module.helper.dateEqual(date, idate, mode); })) { return d; } } } else if (hourCheck(date, d)) { return d; } } } } return null; }, sanitiseDate: function (date) { if (!(date instanceof Date)) { date = parser.date('' + date, settings); } if (!date || isNaN(date.getTime())) { return null; } return date; }, dateDiff: function (date1, date2, mode) { if (!mode) { mode = 'day'; } var isTimeOnly = settings.type === 'time'; var isYear = mode === 'year'; var isYearOrMonth = isYear || mode === 'month'; var isMinute = mode === 'minute'; var isHourOrMinute = isMinute || mode === 'hour'; // only care about a minute accuracy of settings.minTimeGap date1 = new Date( isTimeOnly ? 2000 : date1.getFullYear(), isTimeOnly ? 0 : (isYear ? 0 : date1.getMonth()), isTimeOnly ? 1 : (isYearOrMonth ? 1 : date1.getDate()), !isHourOrMinute ? 0 : date1.getHours(), !isMinute ? 0 : settings.minTimeGap * Math.floor(date1.getMinutes() / settings.minTimeGap) ); date2 = new Date( isTimeOnly ? 2000 : date2.getFullYear(), isTimeOnly ? 0 : (isYear ? 0 : date2.getMonth()), isTimeOnly ? 1 : (isYearOrMonth ? 1 : date2.getDate()), !isHourOrMinute ? 0 : date2.getHours(), !isMinute ? 0 : settings.minTimeGap * Math.floor(date2.getMinutes() / settings.minTimeGap) ); return date2.getTime() - date1.getTime(); }, dateEqual: function (date1, date2, mode) { return !!date1 && !!date2 && module.helper.dateDiff(date1, date2, mode) === 0; }, isDateInRange: function (date, mode, minDate, maxDate) { if (!minDate && !maxDate) { var startDate = module.get.startDate(); minDate = startDate && settings.minDate ? new Date(Math.max(startDate, settings.minDate)) : startDate || settings.minDate; maxDate = settings.maxDate; } minDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), minDate.getHours(), settings.minTimeGap * Math.ceil(minDate.getMinutes() / settings.minTimeGap)); return !(!date || (minDate && module.helper.dateDiff(date, minDate, mode) > 0) || (maxDate && module.helper.dateDiff(maxDate, date, mode) > 0)); }, dateInRange: function (date, minDate, maxDate) { if (!minDate && !maxDate) { var startDate = module.get.startDate(); minDate = startDate && settings.minDate ? new Date(Math.max(startDate, settings.minDate)) : startDate || settings.minDate; maxDate = settings.maxDate; } minDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), minDate.getHours(), settings.minTimeGap * Math.ceil(minDate.getMinutes() / settings.minTimeGap)); var isTimeOnly = settings.type === 'time'; return !date ? date : (minDate && module.helper.dateDiff(date, minDate, 'minute') > 0 ? (isTimeOnly ? module.helper.mergeDateTime(date, minDate) : minDate) // eslint-disable-line unicorn/no-nested-ternary : (maxDate && module.helper.dateDiff(maxDate, date, 'minute') > 0 // eslint-disable-line unicorn/no-nested-ternary ? (isTimeOnly ? module.helper.mergeDateTime(date, maxDate) : maxDate) : date)); }, mergeDateTime: function (date, time) { return !date || !time ? time : new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes()); }, isTodayButton: function (element) { return element.text() === settings.text.today; }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.calendar.settings = { name: 'Calendar', namespace: 'calendar', silent: false, debug: false, verbose: false, performance: true, context: false, type: 'datetime', // picker type, can be 'datetime', 'date', 'time', 'month', or 'year' firstDayOfWeek: 0, // day for first day column (0 = Sunday) constantHeight: true, // add rows to shorter months to keep day calendar height consistent (6 rows) today: false, // show a 'today/now' button at the bottom of the calendar closable: true, // close the popup after selecting a date/time monthFirst: true, // month before day when parsing date from text touchReadonly: true, // set input to readonly on touch devices inline: false, // create the calendar inline instead of inside a popup on: null, // when to show the popup (defaults to 'focus' for input, 'click' for others) initialDate: null, // date to display initially when no date is selected (null = now) startMode: false, // display mode to start in, can be 'year', 'month', 'day', 'hour', 'minute' (false = 'day') minDate: null, // minimum date/time that can be selected, dates/times before are disabled maxDate: null, // maximum date/time that can be selected, dates/times after are disabled disableYear: false, // disable year selection mode disableMonth: false, // disable month selection mode disableMinute: false, // disable minute selection mode formatInput: true, // format the input text upon input blur and module creation startCalendar: null, // jquery object or selector for another calendar that represents the start date of a date range endCalendar: null, // jquery object or selector for another calendar that represents the end date of a date range multiMonth: 1, // show multiple months when in 'day' mode monthOffset: 0, // position current month by offset when multimonth > 1 minTimeGap: 5, showWeekNumbers: false, // show Number of Week at the very first column of a dayView disabledHours: [], // specific hour(s) which won't be selectable and contain additional information. disabledDates: [], // specific day(s) which won't be selectable and contain additional information. disabledDaysOfWeek: [], // day(s) which won't be selectable(s) (0 = Sunday) enabledDates: [], // specific day(s) which will be selectable, all other days will be disabled eventDates: [], // specific day(s) which will be shown in a different color and using tooltips centuryBreak: 60, // starting short year until 99 where it will be assumed to belong to the last century currentCentury: 2000, // century to be added to 2-digit years (00 to {centuryBreak}-1) selectAdjacentDays: false, // The calendar can show dates from adjacent month. These adjacent month dates can also be made selectable. // popup options ('popup', 'on', 'hoverable', and show/hide callbacks are overridden) popupOptions: { position: 'bottom left', lastResort: 'bottom left', prefer: 'opposite', observeChanges: false, hideOnScroll: false, }, text: { days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'], dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], today: 'Today', now: 'Now', am: 'AM', pm: 'PM', weekNo: 'Week', }, formatter: { yearHeader: function (date, settings) { var decadeYear = Math.ceil(date.getFullYear() / 10) * 10; return (decadeYear - 9) + ' - ' + (decadeYear + 2); }, monthHeader: 'YYYY', dayHeader: 'MMMM YYYY', hourHeader: 'MMMM D, YYYY', minuteHeader: 'MMMM D, YYYY', dayColumnHeader: function (day, settings) { return settings.text.days[day]; }, datetime: 'MMMM D, YYYY h:mm A', date: 'MMMM D, YYYY', time: 'h:mm A', cellTime: 'h:mm A', month: 'MMMM YYYY', year: 'YYYY', today: function (settings) { return settings.type === 'date' ? settings.text.today : settings.text.now; }, cell: function (cell, date, cellOptions) {}, }, parser: { date: function (text, settings) { if (text instanceof Date) { return text; } if (!text) { return null; } text = String(text).trim().replace(/([./:-])\s+/g, '$1').replace(/\s+([./:-])/g, '$1') .replace(/\s+/g, ' '); if (text.length === 0) { return null; } if (/^\d{4}(?:[./-]\d{1,2}){2}$/.test(text)) { text = text.replace(/[./-]/g, '/') + ' 00:00:00'; } // Reverse date and month in some cases text = settings.monthFirst || !/^\d{1,2}[./-]/.test(text) ? text : text.replace(/[./-]/g, '/').replace(/(\d+)\/(\d+)/, '$2/$1'); var textDate = new Date(text); var numberOnly = text.match(/^\d+$/) !== null; var isShortYear = text.match(/^(?:\d{1,2}[./-]){2}\d{1,2}$/) !== null; if (!isShortYear && !numberOnly && !isNaN(textDate.getDate())) { return textDate; } text = text.toLowerCase(); var i, j, k ; var minute = -1, hour = -1, day = -1, month = -1, year = -1 ; var isAm; var isTimeOnly = settings.type === 'time'; var isDateOnly = settings.type.indexOf('time') < 0; var words = text.split(settings.regExp.dateWords), word ; var numbers = text.split(settings.regExp.dateNumbers), number ; var parts; var monthString; if (!isDateOnly) { // am/pm isAm = $.inArray(settings.text.am.toLowerCase(), words) >= 0 ? true : ($.inArray(settings.text.pm.toLowerCase(), words) >= 0 ? false : undefined); // time with ':' for (i = 0; i < numbers.length; i++) { number = numbers[i]; if (number.indexOf(':') >= 0) { if (hour < 0 || minute < 0) { parts = number.split(':'); for (k = 0; k < Math.min(2, parts.length); k++) { j = parseInt(parts[k], 10); if (isNaN(j)) { j = 0; } if (k === 0) { hour = j % 24; } else { minute = j % 60; } } } numbers.splice(i, 1); } } } if (!isTimeOnly) { // textual month for (i = 0; i < words.length; i++) { word = words[i]; if (word.length <= 0) { continue; } for (j = 0; j < settings.text.months.length; j++) { monthString = settings.text.months[j]; monthString = monthString.slice(0, word.length).toLowerCase(); if (monthString === word) { month = j + 1; break; } } if (month >= 0) { break; } } // year > settings.centuryBreak for (i = 0; i < numbers.length; i++) { j = parseInt(numbers[i], 10); if (isNaN(j)) { continue; } if (j >= settings.centuryBreak && i === numbers.length - 1) { if (j <= 99) { j += settings.currentCentury - 100; } year = j; numbers.splice(i, 1); break; } } // numeric month if (month < 0) { for (i = 0; i < numbers.length; i++) { k = i > 1 || settings.monthFirst ? i : (i === 1 ? 0 : 1); j = parseInt(numbers[k], 10); if (isNaN(j)) { continue; } if (j >= 1 && j <= 12) { month = j; numbers.splice(k, 1); break; } } } // day for (i = 0; i < numbers.length; i++) { j = parseInt(numbers[i], 10); if (isNaN(j)) { continue; } if (j >= 1 && j <= 31) { day = j; numbers.splice(i, 1); break; } } // year <= settings.centuryBreak if (year < 0) { for (i = numbers.length - 1; i >= 0; i--) { j = parseInt(numbers[i], 10); if (isNaN(j)) { continue; } if (j <= 99) { j += settings.currentCentury; } year = j; numbers.splice(i, 1); break; } } } if (!isDateOnly) { // hour if (hour < 0) { for (i = 0; i < numbers.length; i++) { j = parseInt(numbers[i], 10); if (isNaN(j)) { continue; } if (j >= 0 && j <= 23) { hour = j; numbers.splice(i, 1); break; } } } // minute if (minute < 0) { for (i = 0; i < numbers.length; i++) { j = parseInt(numbers[i], 10); if (isNaN(j)) { continue; } if (j >= 0 && j <= 59) { minute = j; numbers.splice(i, 1); break; } } } } if (minute < 0 && hour < 0 && day < 0 && month < 0 && year < 0) { return null; } if (minute < 0) { minute = 0; } if (hour < 0) { hour = 0; } if (day < 0) { day = 1; } if (month < 0) { month = 1; } if (year < 0) { year = new Date().getFullYear(); } if (isAm !== undefined) { if (isAm) { if (hour === 12) { hour = 0; } } else if (hour < 12) { hour += 12; } } var date = new Date(year, month - 1, day, hour, minute); if (date.getMonth() !== month - 1 || date.getFullYear() !== year) { // month or year don't match up, switch to last day of the month date = new Date(year, month, 0, hour, minute); } return isNaN(date.getTime()) ? null : date; }, }, // callback before date is changed, return false to cancel the change onBeforeChange: function (date, text, mode) { return true; }, // callback when date changes onChange: function (date, text, mode) {}, // callback before show animation, return false to prevent show onShow: function () {}, // callback after show animation onVisible: function () {}, // callback before hide animation, return false to prevent hide onHide: function () {}, // callback after hide animation onHidden: function () {}, // callback before item is selected, return false to prevent selection onSelect: function (date, mode) {}, // is the given date disabled? isDisabled: function (date, mode) { return false; }, selector: { popup: '.ui.popup', input: 'input', activator: 'input', append: '.inline.field,.inline.fields', }, regExp: { dateWords: /[^A-Za-z\u00C0-\u024F]+/g, dateNumbers: /[^\d:]+/g, token: /d{1,4}|D{1,2}|M{1,4}|YY(?:YY)?|([Hhmsw])\1?|[ASYa]|"[^"]*"|'[^']*'/g, }, error: { popup: 'UI Popup, a required component is not included in this page', method: 'The method you called is not defined.', }, className: { calendar: 'calendar', active: 'active', popup: 'ui popup', grid: 'ui equal width grid', column: 'column', table: 'ui celled center aligned unstackable table', inverted: 'inverted', prev: 'prev link', next: 'next link', prevIcon: 'chevron left icon', nextIcon: 'chevron right icon', link: 'link', cell: 'link', disabledCell: 'disabled', weekCell: 'disabled', adjacentCell: 'adjacent', activeCell: 'active', rangeCell: 'range', focusCell: 'focus', todayCell: 'today', today: 'today link', disabled: 'disabled', }, metadata: { date: 'date', focusDate: 'focusDate', startDate: 'startDate', endDate: 'endDate', minDate: 'minDate', maxDate: 'maxDate', mode: 'mode', type: 'type', monthOffset: 'monthOffset', message: 'message', class: 'class', inverted: 'inverted', variation: 'variation', position: 'position', month: 'month', year: 'year', hours: 'hours', days: 'days', }, eventClass: 'blue', }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/card.css ================================================ /*! * # Fomantic-UI 2.9.4 - Card * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Standard *******************************/ /* -------------- Card --------------- */ .ui.cards > .card, .ui.card { max-width: 100%; position: relative; display: flex; flex-direction: column; width: 290px; min-height: 0; background: #fff; padding: 0; border: none; border-radius: 0.28571429rem; box-shadow: 0 1px 3px 0 #d4d4d5, 0 0 0 1px #d4d4d5; transition: box-shadow 0.1s ease, transform 0.1s ease; z-index: ""; word-wrap: break-word; } .ui.card { margin: 1em 0; } .ui.cards > .card a, .ui.card a { cursor: pointer; } .ui.card:first-child { margin-top: 0; } .ui.card:last-child { margin-bottom: 0; } /* -------------- Cards --------------- */ .ui.cards { display: flex; margin: -0.875em -0.5em; flex-wrap: wrap; } .ui.cards > .card { display: flex; margin: 0.875em 0.5em; float: none; } /* Clearing */ .ui.cards::after, .ui.card::after { display: block; content: " "; height: 0; clear: both; overflow: hidden; visibility: hidden; } /* Consecutive Card Groups Preserve Row Spacing */ .ui.cards ~ .ui.cards { margin-top: 0.875em; } /* -------------- Rounded Edges --------------- */ .ui.cards > .card > :first-child, .ui.card > :first-child { border-radius: 0.28571429rem 0.28571429rem 0 0 !important; border-top: none !important; } .ui.cards > .card > :last-child, .ui.card > :last-child { border-radius: 0 0 0.28571429rem 0.28571429rem !important; } .ui.cards > .card > :only-child, .ui.card > :only-child { border-radius: 0.28571429rem !important; } /* -------------- Images --------------- */ .ui.cards > .card > .image, .ui.card > .image { position: relative; display: block; flex: 0 0 auto; padding: 0; background: rgba(0, 0, 0, 0.05); } .ui.cards > .card > .image > img, .ui.card > .image > img { display: block; width: 100%; height: auto; border-radius: inherit; } .ui.cards > .card > .image:not(.ui) > img, .ui.card > .image:not(.ui) > img { border: none; } /* -------------- Content --------------- */ .ui.cards > .card > .content, .ui.card > .content { flex-grow: 1; border: none; border-top: 1px solid rgba(34, 36, 38, 0.1); background: none; margin: 0; padding: 1em; box-shadow: none; font-size: 1em; border-radius: 0; } .ui.cards > .card > .content::after, .ui.card > .content::after { display: block; content: " "; height: 0; clear: both; overflow: hidden; visibility: hidden; } .ui.cards > .card > .content > .header, .ui.card > .content > .header { display: block; margin: ""; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; color: rgba(0, 0, 0, 0.85); } /* Default Header Size */ .ui.cards > .card > .content > .header:not(.ui), .ui.card > .content > .header:not(.ui) { font-weight: bold; font-size: 1.28571429em; margin-top: -0.21425em; line-height: 1.28571429em; } .ui.cards > .card > .content > .meta + .description, .ui.cards > .card > .content > .header + .description, .ui.card > .content > .meta + .description, .ui.card > .content > .header + .description { margin-top: 0.5em; } /* ---------------- Floated Content ----------------- */ .ui.cards > .card [class*="left floated"], .ui.card [class*="left floated"] { float: left; } .ui.cards > .card [class*="right floated"], .ui.card [class*="right floated"] { float: right; } /* -------------- Aligned --------------- */ .ui.cards > .card [class*="left aligned"], .ui.card [class*="left aligned"] { text-align: left; } .ui.cards > .card [class*="center aligned"], .ui.card [class*="center aligned"] { text-align: center; } .ui.cards > .card [class*="right aligned"], .ui.card [class*="right aligned"] { text-align: right; } /* -------------- Content Image --------------- */ .ui.cards > .card .content img, .ui.card .content img { display: inline-block; vertical-align: middle; width: ""; } .ui.cards > .card img.avatar, .ui.cards > .card .avatar img, .ui.card img.avatar, .ui.card .avatar img { width: 2em; height: 2em; border-radius: 500rem; } /* -------------- Description --------------- */ .ui.cards > .card > .content > .description, .ui.card > .content > .description { clear: both; color: rgba(0, 0, 0, 0.68); } /* -------------- Paragraph --------------- */ .ui.cards > .card > .content p, .ui.card > .content p { margin: 0 0 0.5em; } .ui.cards > .card > .content p:last-child, .ui.card > .content p:last-child { margin-bottom: 0; } /* -------------- Meta --------------- */ .ui.cards > .card .meta, .ui.card .meta { font-size: 1em; color: rgba(0, 0, 0, 0.4); } .ui.cards > .card .meta *, .ui.card .meta * { margin-right: 0.3em; } .ui.cards > .card .meta :last-child, .ui.card .meta :last-child { margin-right: 0; } .ui.cards > .card .meta [class*="right floated"], .ui.card .meta [class*="right floated"] { margin-right: 0; margin-left: 0.3em; } /* -------------- Links --------------- */ /* Generic */ .ui.cards > .card > .content a:not(.ui), .ui.card > .content a:not(.ui) { color: ""; transition: color 0.1s ease; } .ui.cards > .card > .content a:not(.ui):hover, .ui.card > .content a:not(.ui):hover { color: ""; } /* Header */ .ui.cards > .card > .content > a.header, .ui.card > .content > a.header { color: rgba(0, 0, 0, 0.85); } .ui.cards > .card > .content > a.header:hover, .ui.card > .content > a.header:hover { color: #1e70bf; } /* Meta */ .ui.cards > .card .meta > a:not(.ui), .ui.card .meta > a:not(.ui) { color: rgba(0, 0, 0, 0.4); } .ui.cards > .card .meta > a:not(.ui):hover, .ui.card .meta > a:not(.ui):hover { color: rgba(0, 0, 0, 0.87); } /* -------------- Buttons --------------- */ .ui.cards > .card > .buttons, .ui.card > .buttons, .ui.cards > .card > .button, .ui.card > .button { margin: 0 -1px; width: calc(100% + 2px); } .ui.cards > .card > .buttons:last-child, .ui.card > .buttons:last-child, .ui.cards > .card > .button:last-child, .ui.card > .button:last-child { margin-bottom: -1px; } /* -------------- Basic --------------- */ .ui.cards:not(.raised) > .basic.card:not(.raised), .ui.ui.ui.basic.cards:not(.raised) > .card:not(.raised), .ui.ui.ui.basic.card:not(.raised) { box-shadow: none; } .ui.cards:not(.raised) > .basic.card:not(.raised) > .buttons, .ui.ui.ui.basic.cards:not(.raised) > .card:not(.raised) > .buttons, .ui.ui.ui.basic.card:not(.raised) > .buttons, .ui.cards:not(.raised) > .basic.card:not(.raised) > .button, .ui.ui.ui.basic.cards:not(.raised) > .card:not(.raised) > .button, .ui.ui.ui.basic.card:not(.raised) > .button { margin: 0; width: 100%; } .ui.ui.ui.ui.ui.basic.card:not(.raised):hover, .ui.ui.ui.ui.ui.basic.cards:not(.raised) .card:not(.raised):hover { box-shadow: none; } /* -------------- Dimmer --------------- */ .ui.cards > .card .dimmer, .ui.card .dimmer { background: ""; z-index: 10; } /* -------------- Labels --------------- */ /* -----Star----- */ /* Icon */ .ui.cards > .card > .content .star.icon, .ui.card > .content .star.icon { cursor: pointer; opacity: 0.75; transition: color 0.1s ease; } .ui.cards > .card > .content .star.icon:hover, .ui.card > .content .star.icon:hover { opacity: 1; color: #ffb70a; } .ui.cards > .card > .content .active.star.icon, .ui.card > .content .active.star.icon { color: #ffe623; } /* -----Like----- */ /* Icon */ .ui.cards > .card > .content .like.icon, .ui.card > .content .like.icon { cursor: pointer; opacity: 0.75; transition: color 0.1s ease; } .ui.cards > .card > .content .like.icon:hover, .ui.card > .content .like.icon:hover { opacity: 1; color: #ff2733; } .ui.cards > .card > .content .active.like.icon, .ui.card > .content .active.like.icon { color: #ff2733; } /* ---------------- Extra Content ----------------- */ .ui.cards > .card > .extra, .ui.card > .extra { max-width: 100%; min-height: 0 !important; flex-grow: 0; border-top: 1px solid rgba(0, 0, 0, 0.05) !important; position: static; background: none; width: auto; margin: 0; padding: 0.75em 1em; top: 0; left: 0; color: rgba(0, 0, 0, 0.4); box-shadow: none; transition: color 0.1s ease; } .ui.cards > .card > .extra a:not(.ui), .ui.card > .extra a:not(.ui) { color: rgba(0, 0, 0, 0.4); } .ui.cards > .card > .extra a:not(.ui):hover, .ui.card > .extra a:not(.ui):hover { color: #1e70bf; } /******************************* States *******************************/ /* -------------- Disabled --------------- */ .ui.disabled.card { opacity: 0.45; color: rgba(40, 40, 40, 0.3); pointer-events: none; } /* -------------- Loading --------------- */ .ui.loading.card { position: relative; cursor: default; pointer-events: none; transition: all 0s linear; } .ui.loading.card::before { position: absolute; content: ""; top: 0; left: 0; background: rgba(255, 255, 255, 0.8); width: 100%; height: 100%; border-radius: 0.28571429rem; z-index: 100; } .ui.loading.card::after { position: absolute; content: ""; top: 50%; left: 50%; margin: -1.5em 0 0 -1.5em; width: 3em; height: 3em; animation: loader 0.6s infinite linear; border: 0.2em solid #767676; border-radius: 500rem; box-shadow: 0 0 0 1px transparent; visibility: visible; z-index: 101; } /******************************* Variations *******************************/ /* ------------------- Horizontal -------------------- */ .ui.horizontal.cards > .card, .ui.card.horizontal { flex-flow: row wrap; min-width: 270px; width: 400px; max-width: 100%; } .ui.horizontal.cards > .card > .image, .ui.card.horizontal > .image { border-radius: 0.28571429rem 0 0 0.28571429rem; width: 150px; } .ui.horizontal.cards > .card > .image > img, .ui.card.horizontal > .image > img { background-size: cover; background-repeat: no-repeat; background-position: center; justify-content: center; align-items: center; display: flex; width: 100%; border-radius: 0.28571429rem 0 0 0.28571429rem; } .ui.horizontal.cards > .card > .image:last-child > img, .ui.card.horizontal > .image:last-child > img { border-radius: 0 0.28571429rem 0.28571429rem 0; } .ui.horizontal.cards > .card > .content, .ui.horizontal.card > .content { border-top: none; flex-basis: 1px; } .ui.horizontal.cards > .card > .extra, .ui.horizontal.card > .extra { flex-basis: 100%; } /* ------------------- Raised -------------------- */ .ui.cards > .raised.card, .ui.raised.cards > .card, .ui.raised.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.raised.cards a.card:hover, .ui.link.cards .raised.card:hover, a.ui.raised.card:hover, .ui.link.raised.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 4px 0 rgba(34, 36, 38, 0.15), 0 2px 10px 0 rgba(34, 36, 38, 0.25); } .ui.basic.cards > .raised.card, .ui.basic.raised.cards > .card, .ui.raised.cards > .basic.card, .ui.basic.raised.card { box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.basic.raised.cards a.card:hover, .ui.link.cards .basic.raised.card:hover, .ui.link.basic.cards .raised.card:hover, .ui.link.basic.raised.cards .card:hover, a.ui.basic.raised.card:hover, .ui.link.basic.raised.card:hover { box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.15), 0 2px 10px 0 rgba(34, 36, 38, 0.25); } /* ------------------- Centered -------------------- */ .ui.centered.cards { justify-content: center; } .ui.centered.card { margin-left: auto; margin-right: auto; } /* ------------------- Fluid -------------------- */ .ui.fluid.card { width: 100%; max-width: 9999px; } /* ------------------- Link -------------------- */ .ui.cards a.card, .ui.link.cards .card, a.ui.card, .ui.link.card { transform: none; } .ui.cards a.card:hover, .ui.link.cards .card:not(.icon):hover, a.ui.card:hover, .ui.link.card:hover { cursor: pointer; z-index: 5; background: #fff; border: none; box-shadow: 0 1px 3px 0 #bcbdbd, 0 0 0 1px #d4d4d5; transform: translateY(-3px); } /* ------------------- Colors -------------------- */ .ui.primary.cards > .card, .ui.cards > .primary.card, .ui.primary.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #2185d0, 0 1px 3px 0 #d4d4d5; } .ui.cards a.primary.card:hover, .ui.primary.cards a.card:hover, .ui.link.primary.cards .card:not(.icon):hover, .ui.link.cards .primary.card:not(.icon):hover, a.ui.primary.card:hover, .ui.link.primary.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #1678c2, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.primary.card, .ui.basic.primary.cards > .card, .ui.basic.cards > .primary.card, .ui.basic.primary.card { background: #54c8ff; } .ui.basic.cards a.primary.card:hover, .ui.cards a.basic.primary.card:hover, .ui.basic.primary.cards a.card:hover, .ui.link.cards .basic.primary.card:not(.icon):hover, .ui.link.basic.primary.cards .card:not(.icon):hover, .ui.link.basic.cards .primary.card:not(.icon):hover, a.ui.basic.primary.card:hover, .ui.link.basic.primary.card:hover { background: #21b8ff; } .ui.inverted.primary.cards > .card, .ui.inverted.cards > .primary.card, .ui.inverted.primary.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #54c8ff, 0 0 0 1px #555; } .ui.inverted.cards a.primary.card:hover, .ui.inverted.primary.cards a.card:hover, .ui.link.inverted.primary.cards .card:not(.icon):hover, .ui.link.inverted.cards .primary.card:not(.icon):hover, a.ui.inverted.primary.card:hover, .ui.link.inverted.primary.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #21b8ff, 0 0 0 1px #555; } .ui.inverted.cards > .basic.primary.card, .ui.basic.inverted.primary.cards > .card, .ui.basic.inverted.cards > .primary.card, .ui.basic.inverted.primary.card { background: #2185d0; } .ui.inverted.cards a.basic.primary.card:hover, .ui.basic.inverted.cards a.primary.card:hover, .ui.basic.inverted.primary.cards a.card:hover, .ui.link.inverted.cards .basic.primary.card:not(.icon):hover, .ui.link.basic.inverted.primary.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .primary.card:not(.icon):hover, a.ui.basic.inverted.primary.card:hover, .ui.link.basic.inverted.primary.card:hover { background: #1678c2; } .ui.secondary.cards > .card, .ui.cards > .secondary.card, .ui.secondary.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #1b1c1d, 0 1px 3px 0 #d4d4d5; } .ui.cards a.secondary.card:hover, .ui.secondary.cards a.card:hover, .ui.link.secondary.cards .card:not(.icon):hover, .ui.link.cards .secondary.card:not(.icon):hover, a.ui.secondary.card:hover, .ui.link.secondary.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #27292a, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.secondary.card, .ui.basic.secondary.cards > .card, .ui.basic.cards > .secondary.card, .ui.basic.secondary.card { background: #545454; } .ui.basic.cards a.secondary.card:hover, .ui.cards a.basic.secondary.card:hover, .ui.basic.secondary.cards a.card:hover, .ui.link.cards .basic.secondary.card:not(.icon):hover, .ui.link.basic.secondary.cards .card:not(.icon):hover, .ui.link.basic.cards .secondary.card:not(.icon):hover, a.ui.basic.secondary.card:hover, .ui.link.basic.secondary.card:hover { background: #6e6e6e; } .ui.inverted.secondary.cards > .card, .ui.inverted.cards > .secondary.card, .ui.inverted.secondary.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #545454, 0 0 0 1px #555; } .ui.inverted.cards a.secondary.card:hover, .ui.inverted.secondary.cards a.card:hover, .ui.link.inverted.secondary.cards .card:not(.icon):hover, .ui.link.inverted.cards .secondary.card:not(.icon):hover, a.ui.inverted.secondary.card:hover, .ui.link.inverted.secondary.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #6e6e6e, 0 0 0 1px #555; } .ui.inverted.cards > .basic.secondary.card, .ui.basic.inverted.secondary.cards > .card, .ui.basic.inverted.cards > .secondary.card, .ui.basic.inverted.secondary.card { background: #1b1c1d; } .ui.inverted.cards a.basic.secondary.card:hover, .ui.basic.inverted.cards a.secondary.card:hover, .ui.basic.inverted.secondary.cards a.card:hover, .ui.link.inverted.cards .basic.secondary.card:not(.icon):hover, .ui.link.basic.inverted.secondary.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .secondary.card:not(.icon):hover, a.ui.basic.inverted.secondary.card:hover, .ui.link.basic.inverted.secondary.card:hover { background: #27292a; } .ui.red.cards > .card, .ui.cards > .red.card, .ui.red.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #db2828, 0 1px 3px 0 #d4d4d5; } .ui.cards a.red.card:hover, .ui.red.cards a.card:hover, .ui.link.red.cards .card:not(.icon):hover, .ui.link.cards .red.card:not(.icon):hover, a.ui.red.card:hover, .ui.link.red.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #d01919, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.red.card, .ui.basic.red.cards > .card, .ui.basic.cards > .red.card, .ui.basic.red.card { background: #ff695e; } .ui.basic.cards a.red.card:hover, .ui.cards a.basic.red.card:hover, .ui.basic.red.cards a.card:hover, .ui.link.cards .basic.red.card:not(.icon):hover, .ui.link.basic.red.cards .card:not(.icon):hover, .ui.link.basic.cards .red.card:not(.icon):hover, a.ui.basic.red.card:hover, .ui.link.basic.red.card:hover { background: #ff392b; } .ui.inverted.red.cards > .card, .ui.inverted.cards > .red.card, .ui.inverted.red.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ff695e, 0 0 0 1px #555; } .ui.inverted.cards a.red.card:hover, .ui.inverted.red.cards a.card:hover, .ui.link.inverted.red.cards .card:not(.icon):hover, .ui.link.inverted.cards .red.card:not(.icon):hover, a.ui.inverted.red.card:hover, .ui.link.inverted.red.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ff392b, 0 0 0 1px #555; } .ui.inverted.cards > .basic.red.card, .ui.basic.inverted.red.cards > .card, .ui.basic.inverted.cards > .red.card, .ui.basic.inverted.red.card { background: #db2828; } .ui.inverted.cards a.basic.red.card:hover, .ui.basic.inverted.cards a.red.card:hover, .ui.basic.inverted.red.cards a.card:hover, .ui.link.inverted.cards .basic.red.card:not(.icon):hover, .ui.link.basic.inverted.red.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .red.card:not(.icon):hover, a.ui.basic.inverted.red.card:hover, .ui.link.basic.inverted.red.card:hover { background: #d01919; } .ui.orange.cards > .card, .ui.cards > .orange.card, .ui.orange.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #f2711c, 0 1px 3px 0 #d4d4d5; } .ui.cards a.orange.card:hover, .ui.orange.cards a.card:hover, .ui.link.orange.cards .card:not(.icon):hover, .ui.link.cards .orange.card:not(.icon):hover, a.ui.orange.card:hover, .ui.link.orange.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #f26202, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.orange.card, .ui.basic.orange.cards > .card, .ui.basic.cards > .orange.card, .ui.basic.orange.card { background: #ff851b; } .ui.basic.cards a.orange.card:hover, .ui.cards a.basic.orange.card:hover, .ui.basic.orange.cards a.card:hover, .ui.link.cards .basic.orange.card:not(.icon):hover, .ui.link.basic.orange.cards .card:not(.icon):hover, .ui.link.basic.cards .orange.card:not(.icon):hover, a.ui.basic.orange.card:hover, .ui.link.basic.orange.card:hover { background: #e76b00; } .ui.inverted.orange.cards > .card, .ui.inverted.cards > .orange.card, .ui.inverted.orange.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ff851b, 0 0 0 1px #555; } .ui.inverted.cards a.orange.card:hover, .ui.inverted.orange.cards a.card:hover, .ui.link.inverted.orange.cards .card:not(.icon):hover, .ui.link.inverted.cards .orange.card:not(.icon):hover, a.ui.inverted.orange.card:hover, .ui.link.inverted.orange.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #e76b00, 0 0 0 1px #555; } .ui.inverted.cards > .basic.orange.card, .ui.basic.inverted.orange.cards > .card, .ui.basic.inverted.cards > .orange.card, .ui.basic.inverted.orange.card { background: #f2711c; } .ui.inverted.cards a.basic.orange.card:hover, .ui.basic.inverted.cards a.orange.card:hover, .ui.basic.inverted.orange.cards a.card:hover, .ui.link.inverted.cards .basic.orange.card:not(.icon):hover, .ui.link.basic.inverted.orange.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .orange.card:not(.icon):hover, a.ui.basic.inverted.orange.card:hover, .ui.link.basic.inverted.orange.card:hover { background: #f26202; } .ui.yellow.cards > .card, .ui.cards > .yellow.card, .ui.yellow.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #fbbd08, 0 1px 3px 0 #d4d4d5; } .ui.cards a.yellow.card:hover, .ui.yellow.cards a.card:hover, .ui.link.yellow.cards .card:not(.icon):hover, .ui.link.cards .yellow.card:not(.icon):hover, a.ui.yellow.card:hover, .ui.link.yellow.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #eaae00, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.yellow.card, .ui.basic.yellow.cards > .card, .ui.basic.cards > .yellow.card, .ui.basic.yellow.card { background: #ffe21f; } .ui.basic.cards a.yellow.card:hover, .ui.cards a.basic.yellow.card:hover, .ui.basic.yellow.cards a.card:hover, .ui.link.cards .basic.yellow.card:not(.icon):hover, .ui.link.basic.yellow.cards .card:not(.icon):hover, .ui.link.basic.cards .yellow.card:not(.icon):hover, a.ui.basic.yellow.card:hover, .ui.link.basic.yellow.card:hover { background: #ebcd00; } .ui.inverted.yellow.cards > .card, .ui.inverted.cards > .yellow.card, .ui.inverted.yellow.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ffe21f, 0 0 0 1px #555; } .ui.inverted.cards a.yellow.card:hover, .ui.inverted.yellow.cards a.card:hover, .ui.link.inverted.yellow.cards .card:not(.icon):hover, .ui.link.inverted.cards .yellow.card:not(.icon):hover, a.ui.inverted.yellow.card:hover, .ui.link.inverted.yellow.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ebcd00, 0 0 0 1px #555; } .ui.inverted.cards > .basic.yellow.card, .ui.basic.inverted.yellow.cards > .card, .ui.basic.inverted.cards > .yellow.card, .ui.basic.inverted.yellow.card { background: #fbbd08; } .ui.inverted.cards a.basic.yellow.card:hover, .ui.basic.inverted.cards a.yellow.card:hover, .ui.basic.inverted.yellow.cards a.card:hover, .ui.link.inverted.cards .basic.yellow.card:not(.icon):hover, .ui.link.basic.inverted.yellow.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .yellow.card:not(.icon):hover, a.ui.basic.inverted.yellow.card:hover, .ui.link.basic.inverted.yellow.card:hover { background: #eaae00; } .ui.olive.cards > .card, .ui.cards > .olive.card, .ui.olive.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #b5cc18, 0 1px 3px 0 #d4d4d5; } .ui.cards a.olive.card:hover, .ui.olive.cards a.card:hover, .ui.link.olive.cards .card:not(.icon):hover, .ui.link.cards .olive.card:not(.icon):hover, a.ui.olive.card:hover, .ui.link.olive.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #a7bd0d, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.olive.card, .ui.basic.olive.cards > .card, .ui.basic.cards > .olive.card, .ui.basic.olive.card { background: #d9e778; } .ui.basic.cards a.olive.card:hover, .ui.cards a.basic.olive.card:hover, .ui.basic.olive.cards a.card:hover, .ui.link.cards .basic.olive.card:not(.icon):hover, .ui.link.basic.olive.cards .card:not(.icon):hover, .ui.link.basic.cards .olive.card:not(.icon):hover, a.ui.basic.olive.card:hover, .ui.link.basic.olive.card:hover { background: #d2e745; } .ui.inverted.olive.cards > .card, .ui.inverted.cards > .olive.card, .ui.inverted.olive.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #d9e778, 0 0 0 1px #555; } .ui.inverted.cards a.olive.card:hover, .ui.inverted.olive.cards a.card:hover, .ui.link.inverted.olive.cards .card:not(.icon):hover, .ui.link.inverted.cards .olive.card:not(.icon):hover, a.ui.inverted.olive.card:hover, .ui.link.inverted.olive.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #d2e745, 0 0 0 1px #555; } .ui.inverted.cards > .basic.olive.card, .ui.basic.inverted.olive.cards > .card, .ui.basic.inverted.cards > .olive.card, .ui.basic.inverted.olive.card { background: #b5cc18; } .ui.inverted.cards a.basic.olive.card:hover, .ui.basic.inverted.cards a.olive.card:hover, .ui.basic.inverted.olive.cards a.card:hover, .ui.link.inverted.cards .basic.olive.card:not(.icon):hover, .ui.link.basic.inverted.olive.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .olive.card:not(.icon):hover, a.ui.basic.inverted.olive.card:hover, .ui.link.basic.inverted.olive.card:hover { background: #a7bd0d; } .ui.green.cards > .card, .ui.cards > .green.card, .ui.green.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #21ba45, 0 1px 3px 0 #d4d4d5; } .ui.cards a.green.card:hover, .ui.green.cards a.card:hover, .ui.link.green.cards .card:not(.icon):hover, .ui.link.cards .green.card:not(.icon):hover, a.ui.green.card:hover, .ui.link.green.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #16ab39, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.green.card, .ui.basic.green.cards > .card, .ui.basic.cards > .green.card, .ui.basic.green.card { background: #2ecc40; } .ui.basic.cards a.green.card:hover, .ui.cards a.basic.green.card:hover, .ui.basic.green.cards a.card:hover, .ui.link.cards .basic.green.card:not(.icon):hover, .ui.link.basic.green.cards .card:not(.icon):hover, .ui.link.basic.cards .green.card:not(.icon):hover, a.ui.basic.green.card:hover, .ui.link.basic.green.card:hover { background: #1ea92e; } .ui.inverted.green.cards > .card, .ui.inverted.cards > .green.card, .ui.inverted.green.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #2ecc40, 0 0 0 1px #555; } .ui.inverted.cards a.green.card:hover, .ui.inverted.green.cards a.card:hover, .ui.link.inverted.green.cards .card:not(.icon):hover, .ui.link.inverted.cards .green.card:not(.icon):hover, a.ui.inverted.green.card:hover, .ui.link.inverted.green.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #1ea92e, 0 0 0 1px #555; } .ui.inverted.cards > .basic.green.card, .ui.basic.inverted.green.cards > .card, .ui.basic.inverted.cards > .green.card, .ui.basic.inverted.green.card { background: #21ba45; } .ui.inverted.cards a.basic.green.card:hover, .ui.basic.inverted.cards a.green.card:hover, .ui.basic.inverted.green.cards a.card:hover, .ui.link.inverted.cards .basic.green.card:not(.icon):hover, .ui.link.basic.inverted.green.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .green.card:not(.icon):hover, a.ui.basic.inverted.green.card:hover, .ui.link.basic.inverted.green.card:hover { background: #16ab39; } .ui.teal.cards > .card, .ui.cards > .teal.card, .ui.teal.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #00b5ad, 0 1px 3px 0 #d4d4d5; } .ui.cards a.teal.card:hover, .ui.teal.cards a.card:hover, .ui.link.teal.cards .card:not(.icon):hover, .ui.link.cards .teal.card:not(.icon):hover, a.ui.teal.card:hover, .ui.link.teal.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #009c95, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.teal.card, .ui.basic.teal.cards > .card, .ui.basic.cards > .teal.card, .ui.basic.teal.card { background: #6dffff; } .ui.basic.cards a.teal.card:hover, .ui.cards a.basic.teal.card:hover, .ui.basic.teal.cards a.card:hover, .ui.link.cards .basic.teal.card:not(.icon):hover, .ui.link.basic.teal.cards .card:not(.icon):hover, .ui.link.basic.cards .teal.card:not(.icon):hover, a.ui.basic.teal.card:hover, .ui.link.basic.teal.card:hover { background: #3affff; } .ui.inverted.teal.cards > .card, .ui.inverted.cards > .teal.card, .ui.inverted.teal.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #6dffff, 0 0 0 1px #555; } .ui.inverted.cards a.teal.card:hover, .ui.inverted.teal.cards a.card:hover, .ui.link.inverted.teal.cards .card:not(.icon):hover, .ui.link.inverted.cards .teal.card:not(.icon):hover, a.ui.inverted.teal.card:hover, .ui.link.inverted.teal.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #3affff, 0 0 0 1px #555; } .ui.inverted.cards > .basic.teal.card, .ui.basic.inverted.teal.cards > .card, .ui.basic.inverted.cards > .teal.card, .ui.basic.inverted.teal.card { background: #00b5ad; } .ui.inverted.cards a.basic.teal.card:hover, .ui.basic.inverted.cards a.teal.card:hover, .ui.basic.inverted.teal.cards a.card:hover, .ui.link.inverted.cards .basic.teal.card:not(.icon):hover, .ui.link.basic.inverted.teal.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .teal.card:not(.icon):hover, a.ui.basic.inverted.teal.card:hover, .ui.link.basic.inverted.teal.card:hover { background: #009c95; } .ui.blue.cards > .card, .ui.cards > .blue.card, .ui.blue.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #2185d0, 0 1px 3px 0 #d4d4d5; } .ui.cards a.blue.card:hover, .ui.blue.cards a.card:hover, .ui.link.blue.cards .card:not(.icon):hover, .ui.link.cards .blue.card:not(.icon):hover, a.ui.blue.card:hover, .ui.link.blue.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #1678c2, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.blue.card, .ui.basic.blue.cards > .card, .ui.basic.cards > .blue.card, .ui.basic.blue.card { background: #54c8ff; } .ui.basic.cards a.blue.card:hover, .ui.cards a.basic.blue.card:hover, .ui.basic.blue.cards a.card:hover, .ui.link.cards .basic.blue.card:not(.icon):hover, .ui.link.basic.blue.cards .card:not(.icon):hover, .ui.link.basic.cards .blue.card:not(.icon):hover, a.ui.basic.blue.card:hover, .ui.link.basic.blue.card:hover { background: #21b8ff; } .ui.inverted.blue.cards > .card, .ui.inverted.cards > .blue.card, .ui.inverted.blue.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #54c8ff, 0 0 0 1px #555; } .ui.inverted.cards a.blue.card:hover, .ui.inverted.blue.cards a.card:hover, .ui.link.inverted.blue.cards .card:not(.icon):hover, .ui.link.inverted.cards .blue.card:not(.icon):hover, a.ui.inverted.blue.card:hover, .ui.link.inverted.blue.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #21b8ff, 0 0 0 1px #555; } .ui.inverted.cards > .basic.blue.card, .ui.basic.inverted.blue.cards > .card, .ui.basic.inverted.cards > .blue.card, .ui.basic.inverted.blue.card { background: #2185d0; } .ui.inverted.cards a.basic.blue.card:hover, .ui.basic.inverted.cards a.blue.card:hover, .ui.basic.inverted.blue.cards a.card:hover, .ui.link.inverted.cards .basic.blue.card:not(.icon):hover, .ui.link.basic.inverted.blue.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .blue.card:not(.icon):hover, a.ui.basic.inverted.blue.card:hover, .ui.link.basic.inverted.blue.card:hover { background: #1678c2; } .ui.violet.cards > .card, .ui.cards > .violet.card, .ui.violet.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #6435c9, 0 1px 3px 0 #d4d4d5; } .ui.cards a.violet.card:hover, .ui.violet.cards a.card:hover, .ui.link.violet.cards .card:not(.icon):hover, .ui.link.cards .violet.card:not(.icon):hover, a.ui.violet.card:hover, .ui.link.violet.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #5829bb, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.violet.card, .ui.basic.violet.cards > .card, .ui.basic.cards > .violet.card, .ui.basic.violet.card { background: #a291fb; } .ui.basic.cards a.violet.card:hover, .ui.cards a.basic.violet.card:hover, .ui.basic.violet.cards a.card:hover, .ui.link.cards .basic.violet.card:not(.icon):hover, .ui.link.basic.violet.cards .card:not(.icon):hover, .ui.link.basic.cards .violet.card:not(.icon):hover, a.ui.basic.violet.card:hover, .ui.link.basic.violet.card:hover { background: #745aff; } .ui.inverted.violet.cards > .card, .ui.inverted.cards > .violet.card, .ui.inverted.violet.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #a291fb, 0 0 0 1px #555; } .ui.inverted.cards a.violet.card:hover, .ui.inverted.violet.cards a.card:hover, .ui.link.inverted.violet.cards .card:not(.icon):hover, .ui.link.inverted.cards .violet.card:not(.icon):hover, a.ui.inverted.violet.card:hover, .ui.link.inverted.violet.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #745aff, 0 0 0 1px #555; } .ui.inverted.cards > .basic.violet.card, .ui.basic.inverted.violet.cards > .card, .ui.basic.inverted.cards > .violet.card, .ui.basic.inverted.violet.card { background: #6435c9; } .ui.inverted.cards a.basic.violet.card:hover, .ui.basic.inverted.cards a.violet.card:hover, .ui.basic.inverted.violet.cards a.card:hover, .ui.link.inverted.cards .basic.violet.card:not(.icon):hover, .ui.link.basic.inverted.violet.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .violet.card:not(.icon):hover, a.ui.basic.inverted.violet.card:hover, .ui.link.basic.inverted.violet.card:hover { background: #5829bb; } .ui.purple.cards > .card, .ui.cards > .purple.card, .ui.purple.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #a333c8, 0 1px 3px 0 #d4d4d5; } .ui.cards a.purple.card:hover, .ui.purple.cards a.card:hover, .ui.link.purple.cards .card:not(.icon):hover, .ui.link.cards .purple.card:not(.icon):hover, a.ui.purple.card:hover, .ui.link.purple.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #9627ba, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.purple.card, .ui.basic.purple.cards > .card, .ui.basic.cards > .purple.card, .ui.basic.purple.card { background: #dc73ff; } .ui.basic.cards a.purple.card:hover, .ui.cards a.basic.purple.card:hover, .ui.basic.purple.cards a.card:hover, .ui.link.cards .basic.purple.card:not(.icon):hover, .ui.link.basic.purple.cards .card:not(.icon):hover, .ui.link.basic.cards .purple.card:not(.icon):hover, a.ui.basic.purple.card:hover, .ui.link.basic.purple.card:hover { background: #cf40ff; } .ui.inverted.purple.cards > .card, .ui.inverted.cards > .purple.card, .ui.inverted.purple.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #dc73ff, 0 0 0 1px #555; } .ui.inverted.cards a.purple.card:hover, .ui.inverted.purple.cards a.card:hover, .ui.link.inverted.purple.cards .card:not(.icon):hover, .ui.link.inverted.cards .purple.card:not(.icon):hover, a.ui.inverted.purple.card:hover, .ui.link.inverted.purple.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #cf40ff, 0 0 0 1px #555; } .ui.inverted.cards > .basic.purple.card, .ui.basic.inverted.purple.cards > .card, .ui.basic.inverted.cards > .purple.card, .ui.basic.inverted.purple.card { background: #a333c8; } .ui.inverted.cards a.basic.purple.card:hover, .ui.basic.inverted.cards a.purple.card:hover, .ui.basic.inverted.purple.cards a.card:hover, .ui.link.inverted.cards .basic.purple.card:not(.icon):hover, .ui.link.basic.inverted.purple.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .purple.card:not(.icon):hover, a.ui.basic.inverted.purple.card:hover, .ui.link.basic.inverted.purple.card:hover { background: #9627ba; } .ui.pink.cards > .card, .ui.cards > .pink.card, .ui.pink.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #e03997, 0 1px 3px 0 #d4d4d5; } .ui.cards a.pink.card:hover, .ui.pink.cards a.card:hover, .ui.link.pink.cards .card:not(.icon):hover, .ui.link.cards .pink.card:not(.icon):hover, a.ui.pink.card:hover, .ui.link.pink.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #e61a8d, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.pink.card, .ui.basic.pink.cards > .card, .ui.basic.cards > .pink.card, .ui.basic.pink.card { background: #ff8edf; } .ui.basic.cards a.pink.card:hover, .ui.cards a.basic.pink.card:hover, .ui.basic.pink.cards a.card:hover, .ui.link.cards .basic.pink.card:not(.icon):hover, .ui.link.basic.pink.cards .card:not(.icon):hover, .ui.link.basic.cards .pink.card:not(.icon):hover, a.ui.basic.pink.card:hover, .ui.link.basic.pink.card:hover { background: #ff5bd1; } .ui.inverted.pink.cards > .card, .ui.inverted.cards > .pink.card, .ui.inverted.pink.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ff8edf, 0 0 0 1px #555; } .ui.inverted.cards a.pink.card:hover, .ui.inverted.pink.cards a.card:hover, .ui.link.inverted.pink.cards .card:not(.icon):hover, .ui.link.inverted.cards .pink.card:not(.icon):hover, a.ui.inverted.pink.card:hover, .ui.link.inverted.pink.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #ff5bd1, 0 0 0 1px #555; } .ui.inverted.cards > .basic.pink.card, .ui.basic.inverted.pink.cards > .card, .ui.basic.inverted.cards > .pink.card, .ui.basic.inverted.pink.card { background: #e03997; } .ui.inverted.cards a.basic.pink.card:hover, .ui.basic.inverted.cards a.pink.card:hover, .ui.basic.inverted.pink.cards a.card:hover, .ui.link.inverted.cards .basic.pink.card:not(.icon):hover, .ui.link.basic.inverted.pink.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .pink.card:not(.icon):hover, a.ui.basic.inverted.pink.card:hover, .ui.link.basic.inverted.pink.card:hover { background: #e61a8d; } .ui.brown.cards > .card, .ui.cards > .brown.card, .ui.brown.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #a5673f, 0 1px 3px 0 #d4d4d5; } .ui.cards a.brown.card:hover, .ui.brown.cards a.card:hover, .ui.link.brown.cards .card:not(.icon):hover, .ui.link.cards .brown.card:not(.icon):hover, a.ui.brown.card:hover, .ui.link.brown.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #975b33, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.brown.card, .ui.basic.brown.cards > .card, .ui.basic.cards > .brown.card, .ui.basic.brown.card { background: #d67c1c; } .ui.basic.cards a.brown.card:hover, .ui.cards a.basic.brown.card:hover, .ui.basic.brown.cards a.card:hover, .ui.link.cards .basic.brown.card:not(.icon):hover, .ui.link.basic.brown.cards .card:not(.icon):hover, .ui.link.basic.cards .brown.card:not(.icon):hover, a.ui.basic.brown.card:hover, .ui.link.basic.brown.card:hover { background: #b0620f; } .ui.inverted.brown.cards > .card, .ui.inverted.cards > .brown.card, .ui.inverted.brown.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #d67c1c, 0 0 0 1px #555; } .ui.inverted.cards a.brown.card:hover, .ui.inverted.brown.cards a.card:hover, .ui.link.inverted.brown.cards .card:not(.icon):hover, .ui.link.inverted.cards .brown.card:not(.icon):hover, a.ui.inverted.brown.card:hover, .ui.link.inverted.brown.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #b0620f, 0 0 0 1px #555; } .ui.inverted.cards > .basic.brown.card, .ui.basic.inverted.brown.cards > .card, .ui.basic.inverted.cards > .brown.card, .ui.basic.inverted.brown.card { background: #a5673f; } .ui.inverted.cards a.basic.brown.card:hover, .ui.basic.inverted.cards a.brown.card:hover, .ui.basic.inverted.brown.cards a.card:hover, .ui.link.inverted.cards .basic.brown.card:not(.icon):hover, .ui.link.basic.inverted.brown.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .brown.card:not(.icon):hover, a.ui.basic.inverted.brown.card:hover, .ui.link.basic.inverted.brown.card:hover { background: #975b33; } .ui.grey.cards > .card, .ui.cards > .grey.card, .ui.grey.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #767676, 0 1px 3px 0 #d4d4d5; } .ui.cards a.grey.card:hover, .ui.grey.cards a.card:hover, .ui.link.grey.cards .card:not(.icon):hover, .ui.link.cards .grey.card:not(.icon):hover, a.ui.grey.card:hover, .ui.link.grey.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #838383, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.grey.card, .ui.basic.grey.cards > .card, .ui.basic.cards > .grey.card, .ui.basic.grey.card { background: #dcddde; } .ui.basic.cards a.grey.card:hover, .ui.cards a.basic.grey.card:hover, .ui.basic.grey.cards a.card:hover, .ui.link.cards .basic.grey.card:not(.icon):hover, .ui.link.basic.grey.cards .card:not(.icon):hover, .ui.link.basic.cards .grey.card:not(.icon):hover, a.ui.basic.grey.card:hover, .ui.link.basic.grey.card:hover { background: #c2c4c5; } .ui.inverted.grey.cards > .card, .ui.inverted.cards > .grey.card, .ui.inverted.grey.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #dcddde, 0 0 0 1px #555; } .ui.inverted.cards a.grey.card:hover, .ui.inverted.grey.cards a.card:hover, .ui.link.inverted.grey.cards .card:not(.icon):hover, .ui.link.inverted.cards .grey.card:not(.icon):hover, a.ui.inverted.grey.card:hover, .ui.link.inverted.grey.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #c2c4c5, 0 0 0 1px #555; } .ui.inverted.cards > .basic.grey.card, .ui.basic.inverted.grey.cards > .card, .ui.basic.inverted.cards > .grey.card, .ui.basic.inverted.grey.card { background: #767676; } .ui.inverted.cards a.basic.grey.card:hover, .ui.basic.inverted.cards a.grey.card:hover, .ui.basic.inverted.grey.cards a.card:hover, .ui.link.inverted.cards .basic.grey.card:not(.icon):hover, .ui.link.basic.inverted.grey.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .grey.card:not(.icon):hover, a.ui.basic.inverted.grey.card:hover, .ui.link.basic.inverted.grey.card:hover { background: #838383; } .ui.black.cards > .card, .ui.cards > .black.card, .ui.black.card { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #1b1c1d, 0 1px 3px 0 #d4d4d5; } .ui.cards a.black.card:hover, .ui.black.cards a.card:hover, .ui.link.black.cards .card:not(.icon):hover, .ui.link.cards .black.card:not(.icon):hover, a.ui.black.card:hover, .ui.link.black.card:hover { box-shadow: 0 0 0 1px #d4d4d5, 0 2px 0 0 #27292a, 0 1px 3px 0 #bcbdbd; } .ui.cards > .basic.black.card, .ui.basic.black.cards > .card, .ui.basic.cards > .black.card, .ui.basic.black.card { background: #545454; } .ui.cards > .basic.black.card .header, .ui.basic.black.cards > .card .header, .ui.basic.cards > .black.card .header, .ui.basic.black.card .header, .ui.cards > .basic.black.card .content, .ui.basic.black.cards > .card .content, .ui.basic.cards > .black.card .content, .ui.basic.black.card .content, .ui.cards > .basic.black.card .meta, .ui.basic.black.cards > .card .meta, .ui.basic.cards > .black.card .meta, .ui.basic.black.card .meta, .ui.cards > .basic.black.card .description, .ui.basic.black.cards > .card .description, .ui.basic.cards > .black.card .description, .ui.basic.black.card .description { color: #fff; } .ui.basic.cards a.black.card:hover, .ui.cards a.basic.black.card:hover, .ui.basic.black.cards a.card:hover, .ui.link.cards .basic.black.card:not(.icon):hover, .ui.link.basic.black.cards .card:not(.icon):hover, .ui.link.basic.cards .black.card:not(.icon):hover, a.ui.basic.black.card:hover, .ui.link.basic.black.card:hover { background: #000000; } .ui.inverted.black.cards > .card, .ui.inverted.cards > .black.card, .ui.inverted.black.card { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #545454, 0 0 0 1px #555; } .ui.inverted.cards a.black.card:hover, .ui.inverted.black.cards a.card:hover, .ui.link.inverted.black.cards .card:not(.icon):hover, .ui.link.inverted.cards .black.card:not(.icon):hover, a.ui.inverted.black.card:hover, .ui.link.inverted.black.card:hover { box-shadow: 0 1px 3px 0 #555, 0 2px 0 0 #000000, 0 0 0 1px #555; } .ui.inverted.cards > .basic.black.card, .ui.basic.inverted.black.cards > .card, .ui.basic.inverted.cards > .black.card, .ui.basic.inverted.black.card { background: #1b1c1d; } .ui.inverted.cards a.basic.black.card:hover, .ui.basic.inverted.cards a.black.card:hover, .ui.basic.inverted.black.cards a.card:hover, .ui.link.inverted.cards .basic.black.card:not(.icon):hover, .ui.link.basic.inverted.black.cards .card:not(.icon):hover, .ui.link.basic.inverted.cards .black.card:not(.icon):hover, a.ui.basic.inverted.black.card:hover, .ui.link.basic.inverted.black.card:hover { background: #27292a; } /* -------------- Card Count --------------- */ .ui.one.cards { margin-left: 0; margin-right: 0; } .ui.one.cards > .card { width: 100%; } .ui.two.cards { margin-left: -1em; margin-right: -1em; } .ui.two.cards > .card { width: calc(50% - 2em); margin-left: 1em; margin-right: 1em; } .ui.three.cards { margin-left: -1em; margin-right: -1em; } .ui.three.cards > .card { width: calc(33.33333333333333% - 2em); margin-left: 1em; margin-right: 1em; } .ui.four.cards { margin-left: -0.75em; margin-right: -0.75em; } .ui.four.cards > .card { width: calc(25% - 1.5em); margin-left: 0.75em; margin-right: 0.75em; } .ui.five.cards { margin-left: -0.75em; margin-right: -0.75em; } .ui.five.cards > .card { width: calc(20% - 1.5em); margin-left: 0.75em; margin-right: 0.75em; } .ui.six.cards { margin-left: -0.75em; margin-right: -0.75em; } .ui.six.cards > .card { width: calc(16.666666666666664% - 1.5em); margin-left: 0.75em; margin-right: 0.75em; } .ui.seven.cards { margin-left: -0.5em; margin-right: -0.5em; } .ui.seven.cards > .card { width: calc(14.285714285714285% - 1em); margin-left: 0.5em; margin-right: 0.5em; } .ui.eight.cards { margin-left: -0.5em; margin-right: -0.5em; } .ui.eight.cards > .card { width: calc(12.5% - 1em); margin-left: 0.5em; margin-right: 0.5em; font-size: 11px; } .ui.nine.cards { margin-left: -0.5em; margin-right: -0.5em; } .ui.nine.cards > .card { width: calc(11.11111111111111% - 1em); margin-left: 0.5em; margin-right: 0.5em; font-size: 10px; } .ui.ten.cards { margin-left: -0.5em; margin-right: -0.5em; } .ui.ten.cards > .card { width: calc(10% - 1em); margin-left: 0.5em; margin-right: 0.5em; } /* ------------------- Doubling -------------------- */ /* Mobile Only */ @media only screen and (max-width: 767.98px) { .ui.two.doubling.cards { margin-left: 0; margin-right: 0; } .ui.two.doubling.cards > .card { width: 100%; margin-left: 0; margin-right: 0; } .ui.three.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.three.doubling.cards > .card { width: calc(50% - 2em); margin-left: 1em; margin-right: 1em; } .ui.four.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.four.doubling.cards > .card { width: calc(50% - 2em); margin-left: 1em; margin-right: 1em; } .ui.five.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.five.doubling.cards > .card { width: calc(50% - 2em); margin-left: 1em; margin-right: 1em; } .ui.six.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.six.doubling.cards > .card { width: calc(50% - 2em); margin-left: 1em; margin-right: 1em; } .ui.seven.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.seven.doubling.cards > .card { width: calc(33.33333333333333% - 2em); margin-left: 1em; margin-right: 1em; } .ui.eight.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.eight.doubling.cards > .card { width: calc(33.33333333333333% - 2em); margin-left: 1em; margin-right: 1em; } .ui.nine.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.nine.doubling.cards > .card { width: calc(33.33333333333333% - 2em); margin-left: 1em; margin-right: 1em; } .ui.ten.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.ten.doubling.cards > .card { width: calc(33.33333333333333% - 2em); margin-left: 1em; margin-right: 1em; } } /* Tablet Only */ @media only screen and (min-width: 768px) and (max-width: 991.98px) { .ui.two.doubling.cards { margin-left: 0; margin-right: 0; } .ui.two.doubling.cards > .card { width: 100%; margin-left: 0; margin-right: 0; } .ui.three.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.three.doubling.cards > .card { width: calc(50% - 2em); margin-left: 1em; margin-right: 1em; } .ui.four.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.four.doubling.cards > .card { width: calc(50% - 2em); margin-left: 1em; margin-right: 1em; } .ui.five.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.five.doubling.cards > .card { width: calc(33.33333333333333% - 2em); margin-left: 1em; margin-right: 1em; } .ui.six.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.six.doubling.cards > .card { width: calc(33.33333333333333% - 2em); margin-left: 1em; margin-right: 1em; } .ui.eight.doubling.cards { margin-left: -1em; margin-right: -1em; } .ui.eight.doubling.cards > .card { width: calc(33.33333333333333% - 2em); margin-left: 1em; margin-right: 1em; } .ui.eight.doubling.cards { margin-left: -0.75em; margin-right: -0.75em; } .ui.eight.doubling.cards > .card { width: calc(25% - 1.5em); margin-left: 0.75em; margin-right: 0.75em; } .ui.nine.doubling.cards { margin-left: -0.75em; margin-right: -0.75em; } .ui.nine.doubling.cards > .card { width: calc(25% - 1.5em); margin-left: 0.75em; margin-right: 0.75em; } .ui.ten.doubling.cards { margin-left: -0.75em; margin-right: -0.75em; } .ui.ten.doubling.cards > .card { width: calc(20% - 1.5em); margin-left: 0.75em; margin-right: 0.75em; } } /* ------------------- Stackable -------------------- */ @media only screen and (max-width: 767.98px) { .ui.stackable.cards { display: block !important; } .ui.stackable.cards .card:first-child { margin-top: 0 !important; } .ui.stackable.cards > .card { display: block !important; height: auto !important; margin: 1em 1em; padding: 0 !important; width: calc(100% - 2em) !important; } } /* -------------- Size --------------- */ .ui.cards > .card { font-size: 1em; } .ui.mini.card, .ui.mini.cards .card { font-size: 0.78571429rem; } .ui.tiny.card, .ui.tiny.cards .card { font-size: 0.85714286rem; } .ui.small.card, .ui.small.cards .card { font-size: 0.92857143rem; } .ui.large.card, .ui.large.cards .card { font-size: 1.14285714rem; } .ui.big.card, .ui.big.cards .card { font-size: 1.28571429rem; } .ui.huge.card, .ui.huge.cards .card { font-size: 1.42857143rem; } .ui.massive.card, .ui.massive.cards .card { font-size: 1.71428571rem; } /* ----------------- Inverted ------------------ */ .ui.inverted.cards > .card, .ui.inverted.card { background: #1b1c1d; box-shadow: 0 1px 3px 0 #555, 0 0 0 1px #555; } /* Content */ .ui.inverted.cards > .card > .content, .ui.inverted.card > .content { border-top: 1px solid rgba(255, 255, 255, 0.15); } /* Header */ .ui.inverted.cards > .card > .content > .header, .ui.inverted.card > .content > .header { color: rgba(255, 255, 255, 0.9); } .ui.inverted.cards > .card > .content > a.header, .ui.inverted.card > .content > a.header { color: rgba(255, 255, 255, 0.9); } .ui.inverted.cards > .card > .content > a.header:hover, .ui.inverted.card > .content > a.header:hover { color: #1e70bf; } /* Description */ .ui.inverted.cards > .card > .content > .description, .ui.inverted.card > .content > .description { color: rgba(255, 255, 255, 0.8); } /* Meta */ .ui.inverted.cards > .card .meta, .ui.inverted.card .meta { color: rgba(255, 255, 255, 0.7); } .ui.inverted.cards > .card .meta > a:not(.ui), .ui.inverted.card .meta > a:not(.ui) { color: rgba(255, 255, 255, 0.7); } .ui.inverted.cards > .card .meta > a:not(.ui):hover, .ui.inverted.card .meta > a:not(.ui):hover { color: #ffffff; } /* Extra */ .ui.inverted.cards > .card > .extra, .ui.inverted.card > .extra { border-top: 1px solid rgba(255, 255, 255, 0.15) !important; color: rgba(255, 255, 255, 0.7); } .ui.inverted.cards > .card > .extra a:not(.ui), .ui.inverted.card > .extra a:not(.ui) { color: rgba(255, 255, 255, 0.5); } .ui.inverted.cards > .card > .extra a:not(.ui):hover, .ui.inverted.card > .extra a:not(.ui):hover { color: #1e70bf; } /* Link card(s) */ .ui.inverted.cards a.card:hover, .ui.inverted.link.cards .card:not(.icon):hover, a.inverted.ui.card:hover, .ui.inverted.link.card:hover { background: #1b1c1d; } /* Loading */ .ui.inverted.loading.card { color: #fff; } .ui.inverted.loading.card::before { background: rgba(0, 0, 0, 0.85); } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/checkbox.css ================================================ /*! * # Fomantic-UI 2.9.4 - Checkbox * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Checkbox *******************************/ /* -------------- Content --------------- */ .ui.checkbox { position: relative; display: inline-block; -webkit-backface-visibility: hidden; backface-visibility: hidden; outline: none; vertical-align: baseline; font-style: normal; min-height: 17px; font-size: 1em; line-height: 17px; min-width: 17px; } /* HTML Checkbox */ .ui.checkbox input[type="checkbox"], .ui.checkbox input[type="radio"] { cursor: pointer; position: absolute; top: 0; left: 0; opacity: 0 !important; outline: none; z-index: 3; width: 17px; height: 17px; } .ui.checkbox label { cursor: auto; position: relative; display: block; outline: none; font-size: 1em; } .ui.checkbox:not(.invisible) label { padding-left: 1.85714em; } .ui.checkbox label::before { position: absolute; top: 0; left: 0; width: 17px; height: 17px; content: ""; background: #fff; border-radius: 0.21428571rem; transition: border 0.1s ease, opacity 0.1s ease, transform 0.1s ease, box-shadow 0.1s ease; border: 1px solid #d4d4d5; } /* -------------- Checkmark --------------- */ .ui.checkbox label::after { position: absolute; font-size: 14px; top: 0; left: 0; width: 17px; height: 17px; text-align: center; opacity: 0; color: rgba(0, 0, 0, 0.87); transition: border 0.1s ease, opacity 0.1s ease, transform 0.1s ease, box-shadow 0.1s ease; } .ui.right.aligned.checkbox label { padding-left: 0; padding-right: 1.85714em; } .ui.right.aligned.checkbox label::after, .ui.right.aligned.checkbox label::before { right: 0; left: auto; } /* -------------- Label --------------- */ /* Inside */ .ui.checkbox label, .ui.checkbox + label { color: rgba(0, 0, 0, 0.87); transition: color 0.1s ease; } /* Outside */ .ui.checkbox + label { vertical-align: middle; } /******************************* States *******************************/ /* -------------- Hover --------------- */ .ui.checkbox label:hover::before { background: #fff; border-color: rgba(34, 36, 38, 0.35); } .ui.checkbox:not(.invisible) label:hover, .ui.checkbox:not(.invisible) + label:hover { color: rgba(0, 0, 0, 0.8); } /* -------------- Down --------------- */ .ui.checkbox label:active::before { background: #f9fafb; border-color: rgba(34, 36, 38, 0.35); } .ui.checkbox label:active::after { color: rgba(0, 0, 0, 0.95); } .ui.checkbox:not(.invisible) input:active ~ label { color: rgba(0, 0, 0, 0.95); } /* -------------- Focus --------------- */ .ui.checkbox input:focus ~ label::before { background: #fff; border-color: #96c8da; } .ui.checkbox input:focus ~ label::after { color: rgba(0, 0, 0, 0.95); } .ui.checkbox:not(.invisible) input:focus ~ label { color: rgba(0, 0, 0, 0.95); } /* -------------- Active --------------- */ .ui.checkbox input:checked ~ label::before { background: #fff; border-color: rgba(34, 36, 38, 0.35); } .ui.checkbox input:checked ~ label::after { opacity: 1; color: rgba(0, 0, 0, 0.95); } /* -------------- Indeterminate --------------- */ .ui.checkbox input:not([type="radio"]):indeterminate ~ label::before { background: #fff; border-color: rgba(34, 36, 38, 0.35); } .ui.checkbox input:not([type="radio"]):indeterminate ~ label::after { opacity: 1; color: rgba(0, 0, 0, 0.95); } .ui.indeterminate.toggle.checkbox input:not([type="radio"]):indeterminate ~ label::before { background: rgba(0, 0, 0, 0.15); } .ui.indeterminate.toggle.checkbox input:not([type="radio"]) ~ label::after { left: 1.075rem; } .ui.right.aligned.indeterminate.toggle.checkbox input:not([type="radio"]) ~ label::after { left: auto; right: 1.075rem; } /* -------------- Active Focus --------------- */ .ui.checkbox input:not([type="radio"]):indeterminate:focus ~ label::before, .ui.checkbox input:checked:focus ~ label::before { background: #fff; border-color: #96c8da; } .ui.checkbox input:not([type="radio"]):indeterminate:focus ~ label::after, .ui.checkbox input:checked:focus ~ label::after { color: rgba(0, 0, 0, 0.95); } /* -------------- Read-Only --------------- */ .ui.read-only.checkbox, .ui.read-only.checkbox label { cursor: default; pointer-events: none; } /* -------------- Disabled --------------- */ .ui.disabled.checkbox label, .ui.checkbox input[disabled] ~ label { cursor: default; opacity: 0.5; color: #000000; pointer-events: none; } /* -------------- Hidden --------------- */ /* Initialized checkbox moves input below element to prevent manually triggering */ .ui.checkbox input.hidden { z-index: -1; } /* Selectable Label */ .ui.checkbox input + label[for], .ui.checkbox input.hidden + label { cursor: pointer; -webkit-user-select: none; -ms-user-select: none; user-select: none; } /******************************* Types *******************************/ /* -------------- Radio --------------- */ .ui.radio.checkbox { min-height: 15px; } .ui.radio.checkbox label { padding-left: 1.85714em; } /* Box */ .ui.radio.checkbox label::before { content: ""; transform: none; width: 15px; height: 15px; border-radius: 500rem; top: 1px; left: 0; } /* Bullet */ .ui.radio.checkbox label::after { border: none; content: "" !important; line-height: 15px; top: 1px; left: 0; width: 15px; height: 15px; border-radius: 500rem; transform: scale(0.46666667); background-color: rgba(0, 0, 0, 0.87); } /* Focus */ .ui.radio.checkbox input:focus ~ label::before { background-color: #fff; } .ui.radio.checkbox input:focus ~ label::after { background-color: rgba(0, 0, 0, 0.95); } /* Indeterminate */ .ui.radio.checkbox input:indeterminate ~ label::after { opacity: 0; } /* Active */ .ui.radio.checkbox input:checked ~ label::before { background-color: #fff; } .ui.radio.checkbox input:checked ~ label::after { background-color: rgba(0, 0, 0, 0.95); } /* Active Focus */ .ui.radio.checkbox input:focus:checked ~ label::before { background-color: #fff; } .ui.radio.checkbox input:focus:checked ~ label::after { background-color: rgba(0, 0, 0, 0.95); } /* -------------- Slider --------------- */ .ui.slider.checkbox { min-height: 1.25rem; } /* Input */ .ui.slider.checkbox input { width: 3.5rem; height: 1.25rem; } /* Label */ .ui.slider.checkbox label { padding-left: 4.5rem; line-height: 1rem; color: rgba(0, 0, 0, 0.4); } /* Line */ .ui.slider.checkbox label::before { display: block; position: absolute; content: ""; transform: none; border: none !important; left: 0; z-index: 1; top: 0.4rem; background-color: rgba(0, 0, 0, 0.05); width: 3.5rem; height: 0.21428571rem; border-radius: 500rem; transition: background 0.3s ease; } /* Handle */ .ui.slider.checkbox label::after { background: #fff linear-gradient(transparent, rgba(0, 0, 0, 0.05)); position: absolute; content: "" !important; opacity: 1; z-index: 2; border: none; box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15) inset; width: 1.5rem; height: 1.5rem; top: -0.25rem; left: 0; transform: none; border-radius: 500rem; transition: left 0.3s ease; } /* Focus */ .ui.slider.checkbox input:focus ~ label::before { background-color: rgba(0, 0, 0, 0.15); border: none; } /* Hover */ .ui.slider.checkbox label:hover { color: rgba(0, 0, 0, 0.8); } .ui.slider.checkbox label:hover::before { background: rgba(0, 0, 0, 0.15); } /* Active */ .ui.slider.checkbox input:checked ~ label { color: rgba(0, 0, 0, 0.95); } .ui.slider.checkbox input:checked ~ label::before { background-color: #545454; } .ui.slider.checkbox input:checked ~ label::after { left: 2rem; } /* Active Focus */ .ui.slider.checkbox input:focus:checked ~ label { color: rgba(0, 0, 0, 0.95); } .ui.slider.checkbox input:focus:checked ~ label::before { background-color: #000000; } .ui.right.aligned.slider.checkbox label { padding-left: 0; padding-right: 4.5rem; } .ui.right.aligned.slider.checkbox label::after { left: auto; right: 2rem; transition: right 0.3s ease; } .ui.right.aligned.slider.checkbox input:checked ~ label::after { left: auto; right: 0; } /* -------------- Toggle --------------- */ .ui.toggle.checkbox { min-height: 1.5rem; } /* Input */ .ui.toggle.checkbox input { width: 3.5rem; height: 1.5rem; } /* Label */ .ui.toggle.checkbox label { min-height: 1.5rem; padding-left: 4.5rem; color: rgba(0, 0, 0, 0.87); } .ui.toggle.checkbox label { padding-top: 0.15em; } /* Switch */ .ui.toggle.checkbox label::before { display: block; position: absolute; content: ""; z-index: 1; transform: none; border: none; top: 0; background: rgba(0, 0, 0, 0.05); box-shadow: none; width: 3.5rem; height: 1.5rem; border-radius: 500rem; } /* Handle */ .ui.toggle.checkbox label::after { background: #fff linear-gradient(transparent, rgba(0, 0, 0, 0.05)); position: absolute; content: "" !important; opacity: 1; z-index: 2; border: none; box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15) inset; width: 1.5rem; height: 1.5rem; top: 0; left: 0; border-radius: 500rem; transition: background 0.3s ease, left 0.3s ease; } .ui.toggle.checkbox input ~ label::after { left: -0.05rem; box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15) inset; } /* Focus */ .ui.toggle.checkbox input:focus ~ label::before { background-color: rgba(0, 0, 0, 0.15); border: none; } /* Hover */ .ui.toggle.checkbox label:hover::before { background-color: rgba(0, 0, 0, 0.15); border: none; } /* Active */ .ui.toggle.checkbox input:checked ~ label { color: rgba(0, 0, 0, 0.95); } .ui.toggle.checkbox input:checked ~ label::before { background-color: #2185d0; } .ui.toggle.checkbox input:checked ~ label::after { left: 2.15rem; box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15) inset; } /* Active Focus */ .ui.toggle.checkbox input:focus:checked ~ label { color: rgba(0, 0, 0, 0.95); } .ui.toggle.checkbox input:focus:checked ~ label::before { background-color: #0d71bb; } .ui.right.aligned.toggle.checkbox label { padding-left: 0; padding-right: 4.5rem; } .ui.right.aligned.toggle.checkbox input ~ label::after { left: auto; right: 2.15rem; transition: background 0.3s ease, right 0.3s ease; } .ui.right.aligned.toggle.checkbox input:checked ~ label::after { left: auto; right: -0.05rem; } /******************************* Variations *******************************/ /* -------------- Fitted --------------- */ .ui.ui.fitted.checkbox label { padding-left: 0; } .ui.fitted.toggle.checkbox { width: 3.5rem; } .ui.fitted.slider.checkbox { width: 3.5rem; } /* -------------- Inverted --------------- */ .ui.ui.ui.inverted.checkbox label, .ui.ui.ui.inverted.checkbox + label { color: rgba(255, 255, 255, 0.9); } /* Hover */ .ui.ui.inverted.checkbox label:hover { color: #ffffff; } .ui.inverted.checkbox label:hover::before { border-color: rgba(34, 36, 38, 0.5); } /* Slider Label */ .ui.inverted.slider.checkbox label { color: rgba(255, 255, 255, 0.5); } /* Slider Line */ .ui.ui.inverted.slider.checkbox label::before { background-color: rgba(255, 255, 255, 0.5); } /* Slider Hover */ .ui.ui.inverted.slider.checkbox label:hover::before { background: rgba(255, 255, 255, 0.7); } /* Slider Active */ .ui.ui.inverted.slider.checkbox input:checked ~ label { color: #ffffff; } .ui.ui.inverted.slider.checkbox input:checked ~ label::before { background-color: rgba(255, 255, 255, 0.8); } /* Slider Active Focus */ .ui.ui.inverted.slider.checkbox input:focus:checked ~ label { color: #ffffff; } .ui.ui.inverted.slider.checkbox input:focus:checked ~ label::before { background-color: rgba(255, 255, 255, 0.8); } /* Toggle Switch */ .ui.ui.inverted.toggle.checkbox label::before { background-color: rgba(255, 255, 255, 0.9); } /* Toggle Hover */ .ui.ui.inverted.toggle.checkbox label:hover::before { background: #ffffff; } /* Toggle Active */ .ui.ui.inverted.toggle.checkbox input:checked ~ label { color: #ffffff; } .ui.ui.inverted.toggle.checkbox input:checked ~ label::before { background-color: #2185d0; } /* Toggle Active Focus */ .ui.ui.inverted.toggle.checkbox input:focus:checked ~ label { color: #ffffff; } .ui.ui.inverted.toggle.checkbox input:focus:checked ~ label::before { background-color: #0d71bb; } /* -------------- Invisible --------------- */ .ui.invisible.checkbox:not(.compact) { display: block; } .ui.invisible.checkbox input { left: -99999px; position: absolute; } .ui.invisible.checkbox label::before, .ui.invisible.checkbox label::after { display: none; } .ui.invisible.checkbox label { transition: all 0.1s ease; } .ui.ui.ui.ui.ui.invisible.checkbox input:not(:checked) + label { background: transparent; border-color: transparent; box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15) inset; color: inherit; } .ui.ui.ui.ui.ui.invisible.checkbox input:not(:checked):not(:hover):focus + label:not(.image) { box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.35) inset; } .ui.ui.ui.ui.ui.invisible.checkbox input:not(:checked) + label.image, .basic.ui.ui.ui.ui.ui.invisible.checkbox input:not(:checked) + label { box-shadow: none; } .ui.invisible.checkbox input:not(:checked) + label.image { opacity: 0.5; filter: grayscale(1); } .ui.invisible.checkbox input:not(:checked):not(:hover):focus + label.image { opacity: 0.75; } .ui.invisible.checkbox input:not(:checked)[disabled] + label.image, .disabled.ui.invisible.checkbox input:not(:checked) + label.image { opacity: 0.25; } /* -------------------- Size --------------------- */ .ui.mini.checkbox { font-size: 0.78571429em; } .ui.tiny.checkbox { font-size: 0.85714286em; } .ui.small.checkbox { font-size: 0.92857143em; } .ui.large.checkbox { font-size: 1.14285714em; } .ui.large.form .checkbox:not(.slider):not(.toggle):not(.radio) label::after, .ui.large.checkbox:not(.slider):not(.toggle):not(.radio) label::after, .ui.large.form .checkbox:not(.slider):not(.toggle):not(.radio) label::before, .ui.large.checkbox:not(.slider):not(.toggle):not(.radio) label::before { transform: scale(1.14285714); transform-origin: left; } .ui.large.form .checkbox.radio label::before, .ui.large.checkbox.radio label::before { transform: scale(1.14285714); transform-origin: left; } .ui.large.form .checkbox.radio label::after, .ui.large.checkbox.radio label::after { transform: scale(0.57142857); transform-origin: left; left: 0.33571429em; } .ui.big.checkbox { font-size: 1.28571429em; } .ui.big.form .checkbox:not(.slider):not(.toggle):not(.radio) label::after, .ui.big.checkbox:not(.slider):not(.toggle):not(.radio) label::after, .ui.big.form .checkbox:not(.slider):not(.toggle):not(.radio) label::before, .ui.big.checkbox:not(.slider):not(.toggle):not(.radio) label::before { transform: scale(1.28571429); transform-origin: left; } .ui.big.form .checkbox.radio label::before, .ui.big.checkbox.radio label::before { transform: scale(1.28571429); transform-origin: left; } .ui.big.form .checkbox.radio label::after, .ui.big.checkbox.radio label::after { transform: scale(0.64285714); transform-origin: left; left: 0.37142857em; } .ui.huge.checkbox { font-size: 1.42857143em; } .ui.huge.form .checkbox:not(.slider):not(.toggle):not(.radio) label::after, .ui.huge.checkbox:not(.slider):not(.toggle):not(.radio) label::after, .ui.huge.form .checkbox:not(.slider):not(.toggle):not(.radio) label::before, .ui.huge.checkbox:not(.slider):not(.toggle):not(.radio) label::before { transform: scale(1.42857143); transform-origin: left; } .ui.huge.form .checkbox.radio label::before, .ui.huge.checkbox.radio label::before { transform: scale(1.42857143); transform-origin: left; } .ui.huge.form .checkbox.radio label::after, .ui.huge.checkbox.radio label::after { transform: scale(0.71428571); transform-origin: left; left: 0.40714286em; } .ui.massive.checkbox { font-size: 1.71428571em; } .ui.massive.form .checkbox:not(.slider):not(.toggle):not(.radio) label::after, .ui.massive.checkbox:not(.slider):not(.toggle):not(.radio) label::after, .ui.massive.form .checkbox:not(.slider):not(.toggle):not(.radio) label::before, .ui.massive.checkbox:not(.slider):not(.toggle):not(.radio) label::before { transform: scale(1.71428571); transform-origin: left; } .ui.massive.form .checkbox.radio label::before, .ui.massive.checkbox.radio label::before { transform: scale(1.71428571); transform-origin: left; } .ui.massive.form .checkbox.radio label::after, .ui.massive.checkbox.radio label::after { transform: scale(0.85714286); transform-origin: left; left: 0.47857143em; } /******************************* Theme Overrides *******************************/ @font-face { font-family: Checkbox; src: url("data:application/font-woff;base64,d09GRgABAAAAAAR8AA0AAAAABtwAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAEYAAAABoAAAAcgbCWJ0dERUYAAARIAAAAFwAAABgAJQAAT1MvMgAAAZgAAABAAAAAYA8SBD9jbWFwAAAB9AAAAFMAAAFc71zo6Wdhc3AAAARAAAAACAAAAAgAAAAQZ2x5ZgAAAlwAAADJAAABVHshwGBoZWFkAAABMAAAAC4AAAA2Bj3tWWhoZWEAAAFgAAAAHQAAACQHfQPIaG10eAAAAdgAAAAZAAAAHg56AEVsb2NhAAACSAAAABIAAAASAQoAjG1heHAAAAGAAAAAGAAAACAACgAvbmFtZQAAAygAAADnAAABp5xOC4Fwb3N0AAAEEAAAADAAAABaHRtWW3icY2BkYGBgYmDgqbAVjee3+crAzcIAAhc3XilHppl3M+cBKQ6QWgYGAAHnCVsAAHicY2BkYGA+8P8AAwMLAwgw72ZgZEAF7ABaJgNOAAAAeJxjYGRgYOBg0GUA0QwMTAxoAAAFtQA6eJxjYGYWYpzAwMrAwDST6QwDA0M/hGZ8zWDMyMmAChgF0AQYHBgYXjAxH/h/gMGB+QCIx8CIJKvAwAgAIOcKW3icY2GAAMZQCM0ExCwMDK7MqiAeAAqXAM4AAAB4nN2NwQ2AMAwDL00pHYJH52AQ9n/w6BbFCS9WwJFlO3IUwHl5YAQuJctcOaVdU6TGmGWt7IxJuHXnvmcrnLPR2GWb6NnF4rrwhT5U/o0Hf5EJGAAAAAAAAAgACAAQABgASABsAKoAAHichY09CsJAEIVndiG2gyQ7IASJIbHQyvyIiFhZpBE8iNsIeiVvYOFx7FPbKE6yUcHGgZ23jzd8DxDeowAWCv77Dez0Vd1hAIB+D714NMa0yNdYZrMhum0CfaWnT4bpeSPaEjOd8djIltTBNBlhSGzES3Jqb5oW6UOrE1WBL7/A73lxNBqnK8znZRbNWMgJET8qJhlWF1HV3zvXSceBSifawrTjTLrd0uI3c4lFu4UcYvbh1/KsIaodUayx7Kxr+wb8Y+EFi+YsngAAAHicfc5BSsNAGMXxf9q0agURFy50M3shlOoNikIXddGFa5N0SEvLDKQp2KUH8AxuXXkkz+JL+NYJJPzmffNmAlzxS0L7JJxzYx5wxoN5qPzZnMrv5hGXfJrHyr/NE+74UytJL5Rcdye0Huiue/NQ+aM5lV/NI27ZmsfKv8wTnvhhzgZPyY6CyAfMN77cFVFaaVBxZE9OraWvjvtc6Kn0jN40qDnoVyIBx4yMqWJfH7YxuFk27a2/dLVGxUpbQndYrrVnrazgpO9C1chSb7s3UymGxlU++Dpv/NoVJ7co4zLGkPEPj0VARQB4nGNgYsAPOBgYGJkYmBiZGZgZWRhZGdnYS/MyDYAAShuCaFcLCB9Iw/hGAOPdCuMAAQAB//8AD3icY2BkYGDgAWIBIGYCYhYIDQACOwAmAHicY2BgYGQAgns+by1A9MWNV8phNABQ5wfrAAA=") format("woff"); } /* Checkmark */ .ui.checkbox label::after { font-family: Checkbox; } /* Checked */ .ui.checkbox input:checked ~ label::after { content: "\e800"; } /* Indeterminate */ .ui.checkbox input:indeterminate ~ label::after { font-size: 12px; content: "\e801"; } /* UTF Reference .check::before { content: '\e800'; } .dash::before { content: '\e801'; } .plus::before { content: '\e802'; } */ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/checkbox.js ================================================ /*! * # Fomantic-UI 2.9.4 - Checkbox * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.checkbox = function (parameters) { var $allModules = $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), returnedValue ; $allModules.each(function () { var settings = $.extend(true, {}, $.fn.checkbox.settings, parameters), className = settings.className, namespace = settings.namespace, selector = settings.selector, error = settings.error, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $label = $(this).children(selector.label), $input = $(this).children(selector.input), input = $input[0], initialLoad = false, shortcutPressed = false, instance = $module.data(moduleNamespace), observer, element = this, module ; module = { initialize: function () { module.verbose('Initializing checkbox', settings); module.create.label(); module.bind.events(); module.set.tabbable(); module.hide.input(); module.observeChanges(); module.instantiate(); module.setup(); }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.verbose('Destroying module'); module.unbind.events(); module.show.input(); $module.removeData(moduleNamespace); }, fix: { reference: function () { if ($module.is(selector.input)) { module.debug('Behavior called on <input> adjusting invoked element'); $module = $module.closest(selector.checkbox); module.refresh(); } }, }, setup: function () { module.set.initialLoad(); if (module.is.indeterminate()) { module.debug('Initial value is indeterminate'); module.indeterminate(); } else if (module.is.checked()) { module.debug('Initial value is checked'); module.check(); } else { module.debug('Initial value is unchecked'); module.uncheck(); } module.remove.initialLoad(); }, refresh: function () { $label = $module.children(selector.label); $input = $module.children(selector.input); input = $input[0]; }, hide: { input: function () { module.verbose('Modifying <input> z-index to be unselectable'); $input.addClass(className.hidden); }, }, show: { input: function () { module.verbose('Modifying <input> z-index to be selectable'); $input.removeClass(className.hidden); }, }, observeChanges: function () { if ('MutationObserver' in window) { observer = new MutationObserver(function (mutations) { module.debug('DOM tree modified, updating selector cache'); module.refresh(); }); observer.observe(element, { childList: true, subtree: true, }); module.debug('Setting up mutation observer', observer); } }, attachEvents: function (selector, event) { var $element = $(selector) ; event = isFunction(module[event]) ? module[event] : module.toggle; if ($element.length > 0) { module.debug('Attaching checkbox events to element', selector, event); $element .on('click' + eventNamespace, event) ; } else { module.error(error.notFound); } }, preventDefaultOnInputTarget: function () { if (event !== undefined && event !== null && $(event.target).is(selector.input)) { module.verbose('Preventing default check action after manual check action'); event.preventDefault(); } }, event: { change: function (event) { if (!module.should.ignoreCallbacks()) { settings.onChange.call(input); } }, click: function (event) { var $target = $(event.target) ; if ($target.is(selector.input)) { module.verbose('Using default check action on initialized checkbox'); return; } if ($target.is(selector.link)) { module.debug('Clicking link inside checkbox, skipping toggle'); return; } module.toggle(); $input.trigger('focus'); event.preventDefault(); }, keydown: function (event) { var key = event.which, keyCode = { enter: 13, space: 32, escape: 27, left: 37, up: 38, right: 39, down: 40, } ; var r = module.get.radios().not(selector.disabled), rIndex = r.index($module), rLen = r.length, checkIndex = false ; if (key === keyCode.left || key === keyCode.up) { checkIndex = (rIndex === 0 ? rLen : rIndex) - 1; } else if (key === keyCode.right || key === keyCode.down) { checkIndex = rIndex === rLen - 1 ? 0 : rIndex + 1; } if (!module.should.ignoreCallbacks() && checkIndex !== false) { if (settings.beforeUnchecked.apply(input) === false) { module.verbose('Option not allowed to be unchecked, cancelling key navigation'); return false; } var nextOption = $(r[checkIndex]), nextInput = nextOption.children(selector.input), disallowOption = nextOption.hasClass(className.readOnly) || nextInput.prop('readonly'); if (disallowOption || settings.beforeChecked.apply(nextInput[0]) === false) { module.verbose('Next option should not allow check, cancelling key navigation'); return false; } } shortcutPressed = false; if (key === keyCode.escape) { module.verbose('Escape key pressed blurring field'); $input.trigger('blur'); shortcutPressed = true; event.stopPropagation(); } else if (!module.can.change()) { shortcutPressed = true; } else if (!event.ctrlKey) { if (key === keyCode.space || (key === keyCode.enter && settings.enableEnterKey)) { module.verbose('Enter/space key pressed, toggling checkbox'); module.toggle(); shortcutPressed = true; } else if ($module.is('.toggle, .slider') && !module.is.radio()) { if (key === keyCode.left && module.is.checked()) { module.uncheck(); shortcutPressed = true; } else if (key === keyCode.right && module.is.unchecked()) { module.check(); shortcutPressed = true; } } } }, keyup: function (event) { if (shortcutPressed) { event.preventDefault(); } }, }, check: function () { if (!module.should.allowCheck()) { return; } module.debug('Checking checkbox', $input); module.set.checked(); if (!module.should.ignoreCallbacks()) { settings.onChecked.call(input); module.trigger.change(); } module.preventDefaultOnInputTarget(); }, uncheck: function () { if (!module.should.allowUncheck()) { return; } module.debug('Unchecking checkbox'); module.set.unchecked(); if (!module.should.ignoreCallbacks()) { settings.onUnchecked.call(input); module.trigger.change(); } module.preventDefaultOnInputTarget(); }, indeterminate: function () { if (module.should.allowIndeterminate()) { module.debug('Checkbox is already indeterminate'); return; } module.debug('Making checkbox indeterminate'); module.set.indeterminate(); if (!module.should.ignoreCallbacks()) { settings.onIndeterminate.call(input); module.trigger.change(); } }, determinate: function () { if (module.should.allowDeterminate()) { module.debug('Checkbox is already determinate'); return; } module.debug('Making checkbox determinate'); module.set.determinate(); if (!module.should.ignoreCallbacks()) { settings.onDeterminate.call(input); module.trigger.change(); } }, enable: function () { if (module.is.enabled()) { module.debug('Checkbox is already enabled'); return; } module.debug('Enabling checkbox'); module.set.enabled(); if (!module.should.ignoreCallbacks()) { settings.onEnable.call(input); // preserve legacy callbacks settings.onEnabled.call(input); } }, disable: function () { if (module.is.disabled()) { module.debug('Checkbox is already disabled'); return; } module.debug('Disabling checkbox'); module.set.disabled(); if (!module.should.ignoreCallbacks()) { settings.onDisable.call(input); // preserve legacy callbacks settings.onDisabled.call(input); } }, get: { radios: function () { var name = module.get.name() ; return $('input[name="' + name + '"]').closest(selector.checkbox); }, otherRadios: function () { return module.get.radios().not($module); }, name: function () { return $input.attr('name'); }, }, is: { initialLoad: function () { return initialLoad; }, radio: function () { return $input.hasClass(className.radio) || $input.attr('type') === 'radio'; }, indeterminate: function () { return $input.prop('indeterminate') !== undefined && $input.prop('indeterminate'); }, checked: function () { return $input.prop('checked') !== undefined && $input.prop('checked'); }, disabled: function () { return $input.prop('disabled') !== undefined && $input.prop('disabled'); }, enabled: function () { return !module.is.disabled(); }, determinate: function () { return !module.is.indeterminate(); }, unchecked: function () { return !module.is.checked(); }, }, should: { allowCheck: function () { if (module.is.determinate() && module.is.checked() && !module.is.initialLoad()) { module.debug('Should not allow check, checkbox is already checked'); return false; } if (!module.should.ignoreCallbacks() && settings.beforeChecked.apply(input) === false) { module.debug('Should not allow check, beforeChecked cancelled'); return false; } return true; }, allowUncheck: function () { if (module.is.determinate() && module.is.unchecked() && !module.is.initialLoad()) { module.debug('Should not allow uncheck, checkbox is already unchecked'); return false; } if (!module.should.ignoreCallbacks() && settings.beforeUnchecked.apply(input) === false) { module.debug('Should not allow uncheck, beforeUnchecked cancelled'); return false; } return true; }, allowIndeterminate: function () { if (module.is.indeterminate() && !module.is.initialLoad()) { module.debug('Should not allow indeterminate, checkbox is already indeterminate'); return false; } if (!module.should.ignoreCallbacks() && settings.beforeIndeterminate.apply(input) === false) { module.debug('Should not allow indeterminate, beforeIndeterminate cancelled'); return false; } return true; }, allowDeterminate: function () { if (module.is.determinate() && !module.is.initialLoad()) { module.debug('Should not allow determinate, checkbox is already determinate'); return false; } if (!module.should.ignoreCallbacks() && settings.beforeDeterminate.apply(input) === false) { module.debug('Should not allow determinate, beforeDeterminate cancelled'); return false; } return true; }, ignoreCallbacks: function () { return initialLoad && !settings.fireOnInit; }, }, can: { change: function () { return !($module.hasClass(className.disabled) || $module.hasClass(className.readOnly) || $input.prop('disabled') || $input.prop('readonly')); }, uncheck: function () { return typeof settings.uncheckable === 'boolean' ? settings.uncheckable : !module.is.radio(); }, }, set: { initialLoad: function () { initialLoad = true; }, checked: function () { module.verbose('Setting class to checked'); $module .removeClass(className.indeterminate) .addClass(className.checked) ; if (module.is.radio()) { module.uncheckOthers(); } if (!module.is.indeterminate() && module.is.checked()) { module.debug('Input is already checked, skipping input property change'); return; } module.verbose('Setting state to checked', input); $input .prop('indeterminate', false) .prop('checked', true) ; }, unchecked: function () { module.verbose('Removing checked class'); $module .removeClass(className.indeterminate) .removeClass(className.checked) ; if (!module.is.indeterminate() && module.is.unchecked()) { module.debug('Input is already unchecked'); return; } module.debug('Setting state to unchecked'); $input .prop('indeterminate', false) .prop('checked', false) ; }, indeterminate: function () { module.verbose('Setting class to indeterminate'); $module .addClass(className.indeterminate) ; if (module.is.indeterminate()) { module.debug('Input is already indeterminate, skipping input property change'); return; } module.debug('Setting state to indeterminate'); $input .prop('indeterminate', true) ; }, determinate: function () { module.verbose('Removing indeterminate class'); $module .removeClass(className.indeterminate) ; if (module.is.determinate()) { module.debug('Input is already determinate, skipping input property change'); return; } module.debug('Setting state to determinate'); $input .prop('indeterminate', false) ; }, disabled: function () { module.verbose('Setting class to disabled'); $module .addClass(className.disabled) ; if (module.is.disabled()) { module.debug('Input is already disabled, skipping input property change'); return; } module.debug('Setting state to disabled'); $input .prop('disabled', 'disabled') ; }, enabled: function () { module.verbose('Removing disabled class'); $module.removeClass(className.disabled); if (module.is.enabled()) { module.debug('Input is already enabled, skipping input property change'); return; } module.debug('Setting state to enabled'); $input .prop('disabled', false) ; }, tabbable: function () { module.verbose('Adding tabindex to checkbox'); if ($input.attr('tabindex') === undefined) { $input.attr('tabindex', 0); } }, }, remove: { initialLoad: function () { initialLoad = false; }, }, trigger: { change: function () { var inputElement = $input[0] ; if (inputElement) { var events = document.createEvent('HTMLEvents'); module.verbose('Triggering native change event'); events.initEvent('change', true, false); inputElement.dispatchEvent(events); } }, }, create: { label: function () { if ($input.prevAll(selector.label).length > 0) { $input.prev(selector.label).detach().insertAfter($input); module.debug('Moving existing label', $label); } else if (!module.has.label()) { $label = $('<label>').insertAfter($input); module.debug('Creating label', $label); } }, }, has: { label: function () { return $label.length > 0; }, }, bind: { events: function () { module.verbose('Attaching checkbox events'); $module .on('click' + eventNamespace, module.event.click) .on('change' + eventNamespace, module.event.change) .on('keydown' + eventNamespace, selector.input, module.event.keydown) .on('keyup' + eventNamespace, selector.input, module.event.keyup) ; }, }, unbind: { events: function () { module.debug('Removing events'); $module .off(eventNamespace) ; }, }, uncheckOthers: function () { var $radios = module.get.otherRadios() ; module.debug('Unchecking other radios', $radios); $radios.removeClass(className.checked); }, toggle: function () { if (!module.can.change()) { if (!module.is.radio()) { module.debug('Checkbox is read-only or disabled, ignoring toggle'); } return; } if (module.is.indeterminate() || module.is.unchecked()) { module.debug('Currently unchecked'); module.check(); } else if (module.is.checked() && module.can.uncheck()) { module.debug('Currently checked'); module.uncheck(); } }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.checkbox.settings = { name: 'Checkbox', namespace: 'checkbox', silent: false, debug: false, verbose: false, performance: true, // delegated event context uncheckable: 'auto', fireOnInit: false, enableEnterKey: true, onChange: function () {}, beforeChecked: function () {}, beforeUnchecked: function () {}, beforeDeterminate: function () {}, beforeIndeterminate: function () {}, onChecked: function () {}, onUnchecked: function () {}, onDeterminate: function () {}, onIndeterminate: function () {}, onEnable: function () {}, onDisable: function () {}, // preserve misspelled callbacks (will be removed in 3.0) onEnabled: function () {}, onDisabled: function () {}, className: { checked: 'checked', indeterminate: 'indeterminate', disabled: 'disabled', hidden: 'hidden', radio: 'radio', readOnly: 'read-only', }, error: { method: 'The method you called is not defined', }, selector: { checkbox: '.ui.checkbox', disabled: '.disabled, :has(input[disabled])', label: 'label', input: 'input[type="checkbox"], input[type="radio"]', link: 'a[href]', }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/comment.css ================================================ /*! * # Fomantic-UI 2.9.4 - Comment * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Standard *******************************/ /* -------------- Comments --------------- */ .ui.comments { margin: 1.5em 0; max-width: 650px; } .ui.comments:first-child { margin-top: 0; } .ui.comments:last-child { margin-bottom: 0; } /* -------------- Comment --------------- */ .ui.comments .comment { position: relative; background: none; margin: 0.5em 0 0; padding: 0.5em 0 0; border: none; border-top: none; line-height: 1.2; } .ui.comments .comment:first-child { margin-top: 0; padding-top: 0; } /* -------------------- Nested Comments --------------------- */ .ui.comments .comment > .comments { margin: 0 0 0.5em 0.5em; padding: 1em 0 1em 1em; } .ui.comments .comment > .comments::before { position: absolute; top: 0; left: 0; } .ui.comments .comment > .comments .comment { border: none; border-top: none; background: none; } /* -------------- Avatar --------------- */ .ui.comments .comment .avatar { display: block; width: 2.5em; height: auto; float: left; margin: 0.2em 0 0; } .ui.comments .comment img.avatar, .ui.comments .comment .avatar img { display: block; margin: 0 auto; width: 100%; height: 100%; border-radius: 0.25rem; } /* -------------- Content --------------- */ .ui.comments .comment > .content { display: block; } /* If there is an avatar move content over */ .ui.comments .comment > .avatar ~ .content { margin-left: 3.5em; } /* -------------- Author --------------- */ .ui.comments .comment .author { font-size: 1em; color: rgba(0, 0, 0, 0.87); font-weight: bold; } .ui.comments .comment a.author { cursor: pointer; } .ui.comments .comment a.author:hover { color: #1e70bf; } /* -------------- Metadata --------------- */ .ui.comments .comment .metadata { display: inline-block; margin-left: 0.5em; color: rgba(0, 0, 0, 0.4); font-size: 0.875em; } .ui.comments .comment .metadata > * { display: inline-block; margin: 0 0.5em 0 0; } .ui.comments .comment .metadata > :last-child { margin-right: 0; } /* -------------------- Comment Text --------------------- */ .ui.comments .comment .text { margin: 0.25em 0 0.5em; font-size: 1em; word-wrap: break-word; color: rgba(0, 0, 0, 0.87); line-height: 1.3; } /* -------------------- User Actions --------------------- */ .ui.comments .comment .actions { font-size: 0.875em; } .ui.comments .comment .actions a { cursor: pointer; display: inline-block; margin: 0 0.75em 0 0; color: rgba(0, 0, 0, 0.4); } .ui.comments .comment .actions a:last-child { margin-right: 0; } .ui.comments .comment .actions a.active, .ui.comments .comment .actions a:hover { color: rgba(0, 0, 0, 0.8); } /* -------------------- Reply Form --------------------- */ .ui.comments > .reply.form { margin-top: 1em; } .ui.comments .comment .reply.form { width: 100%; margin-top: 1em; } .ui.comments .reply.form textarea { font-size: 1em; height: 12em; } /******************************* State *******************************/ .ui.collapsed.comments, .ui.comments .collapsed.comments, .ui.comments .collapsed.comment { display: none; } /******************************* Variations *******************************/ /* -------------------- Threaded --------------------- */ .ui.threaded.comments .comment > .comments { margin: -1.5em 0 -1em 1.25em; padding: 3em 0 2em 2.25em; box-shadow: -1px 0 0 rgba(34, 36, 38, 0.15); } /* -------------------- Minimal --------------------- */ .ui.minimal.comments .comment .actions { opacity: 0; position: absolute; top: 0; right: 0; left: auto; transition: opacity 0.2s ease; transition-delay: 0.1s; } .ui.minimal.comments .comment > .content:hover > .actions { opacity: 1; } /* ------------------- Sizes -------------------- */ .ui.comments { font-size: 1rem; } .ui.mini.comments { font-size: 0.78571429rem; } .ui.tiny.comments { font-size: 0.85714286rem; } .ui.small.comments { font-size: 0.92857143rem; } .ui.large.comments { font-size: 1.14285714rem; } .ui.big.comments { font-size: 1.28571429rem; } .ui.huge.comments { font-size: 1.42857143rem; } .ui.massive.comments { font-size: 1.71428571rem; } /* ------------------- Inverted -------------------- */ .ui.inverted.comments .comment { background-color: #1b1c1d; } .ui.inverted.comments .comment .author, .ui.inverted.comments .comment .text { color: rgba(255, 255, 255, 0.9); } .ui.inverted.comments .comment .metadata, .ui.inverted.comments .comment .actions a { color: rgba(255, 255, 255, 0.7); } .ui.inverted.comments .comment a.author:hover, .ui.inverted.comments .comment .actions a.active, .ui.inverted.comments .comment .actions a:hover { color: #ffffff; } .ui.inverted.threaded.comments .comment > .comments { box-shadow: -1px 0 0 #555; } .ui.disabled.comments, .ui.comments .disabled.comment { opacity: 0.45; pointer-events: none; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/container.css ================================================ /*! * # Fomantic-UI 2.9.4 - Container * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Container *******************************/ /* All Sizes */ .ui.container { display: block; max-width: 100%; } /* Mobile */ @media only screen and (max-width: 767.98px) { .ui.ui.ui.container:not(.fluid) { width: auto; margin-left: 1em; margin-right: 1em; } .ui.ui.ui.grid.container { width: auto; } .ui.ui.ui.relaxed.grid.container { width: auto; } .ui.ui.ui.very.relaxed.grid.container { width: auto; } } /* Tablet */ @media only screen and (min-width: 768px) and (max-width: 991.98px) { .ui.ui.ui.container:not(.fluid) { width: 723px; margin-left: auto; margin-right: auto; } .ui.ui.ui.grid.container { width: calc(723px + 2rem); } .ui.ui.ui.relaxed.grid.container { width: calc(723px + 3rem); } .ui.ui.ui.very.relaxed.grid.container { width: calc(723px + 5rem); } } /* Small Monitor */ @media only screen and (min-width: 992px) and (max-width: 1199.98px) { .ui.ui.ui.container:not(.fluid) { width: 933px; margin-left: auto; margin-right: auto; } .ui.ui.ui.grid.container { width: calc(933px + 2rem); } .ui.ui.ui.relaxed.grid.container { width: calc(933px + 3rem); } .ui.ui.ui.very.relaxed.grid.container { width: calc(933px + 5rem); } } /* Large Monitor */ @media only screen and (min-width: 1200px) { .ui.ui.ui.container:not(.fluid) { width: 1127px; margin-left: auto; margin-right: auto; } .ui.ui.ui.grid.container { width: calc(1127px + 2rem); } .ui.ui.ui.relaxed.grid.container { width: calc(1127px + 3rem); } .ui.ui.ui.very.relaxed.grid.container { width: calc(1127px + 5rem); } } /******************************* Types *******************************/ /* Text Container */ .ui.text.container { font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; max-width: 700px; line-height: 1.5; font-size: 1.14285714rem; } /* Wide Container */ @media only screen and (min-width: 768px) and (max-width: 991.98px) { .ui.ui.ui.wide.container { width: 867.6px; } } @media only screen and (min-width: 992px) and (max-width: 1199.98px) { .ui.ui.ui.wide.container { width: 1119.6px; } } @media only screen and (min-width: 1200px) { .ui.ui.ui.wide.container { width: 1352.4px; } } /* Fluid */ .ui.fluid.container { width: 100%; } /******************************* Variations *******************************/ .ui[class*="left aligned"].container { text-align: left; } .ui[class*="center aligned"].container { text-align: center; } .ui[class*="right aligned"].container { text-align: right; } .ui.justified.container { text-align: justify; -webkit-hyphens: auto; -ms-hyphens: auto; hyphens: auto; } /* -------------- Scrolling --------------- */ .ui.scrolling.container { overflow: auto; -ms-scroll-chaining: none; overscroll-behavior: none; } @media only screen and (max-width: 767.98px) { .ui.scrolling.container.short { max-height: 11.25em; } .ui.scrolling.container.short.resizable { height: 11.25em; } .ui.scrolling.container[class*="very short"] { max-height: 7.5em; } .ui.scrolling.container[class*="very short"].resizable { height: 7.5em; } .ui.scrolling.container { max-height: 15em; } .ui.scrolling.container.long { max-height: 30em; } .ui.scrolling.container.long.resizable { height: 30em; } .ui.scrolling.container[class*="very long"] { max-height: 45em; } .ui.scrolling.container[class*="very long"].resizable { height: 45em; } } @media only screen and (min-width: 768px) { .ui.scrolling.container.short { max-height: 13.5em; } .ui.scrolling.container.short.resizable { height: 13.5em; } .ui.scrolling.container[class*="very short"] { max-height: 9em; } .ui.scrolling.container[class*="very short"].resizable { height: 9em; } .ui.scrolling.container { max-height: 18em; } .ui.scrolling.container.resizable { height: 18em; } .ui.scrolling.container.long { max-height: 36em; } .ui.scrolling.container.long.resizable { height: 36em; } .ui.scrolling.container[class*="very long"] { max-height: 54em; } .ui.scrolling.container[class*="very long"].resizable { height: 54em; } } @media only screen and (min-width: 992px) { .ui.scrolling.container.short { max-height: 18em; } .ui.scrolling.container.short.resizable { height: 18em; } .ui.scrolling.container[class*="very short"] { max-height: 12em; } .ui.scrolling.container[class*="very short"].resizable { height: 12em; } .ui.scrolling.container { max-height: 24em; } .ui.scrolling.container.resizable { height: 24em; } .ui.scrolling.container.long { max-height: 48em; } .ui.scrolling.container.long.resizable { height: 48em; } .ui.scrolling.container[class*="very long"] { max-height: 72em; } .ui.scrolling.container[class*="very long"].resizable { height: 72em; } } @media only screen and (min-width: 1920px) { .ui.scrolling.container.short { max-height: 22.5em; } .ui.scrolling.container.short.resizable { height: 22.5em; } .ui.scrolling.container[class*="very short"] { max-height: 15em; } .ui.scrolling.container[class*="very short"].resizable { height: 15em; } .ui.scrolling.container { max-height: 30em; } .ui.scrolling.container.resizable { height: 30em; } .ui.scrolling.container.long { max-height: 60em; } .ui.scrolling.container.long.resizable { height: 60em; } .ui.scrolling.container[class*="very long"] { max-height: 90em; } .ui.scrolling.container[class*="very long"].resizable { height: 90em; } } .ui.resizable.scrolling.container { resize: vertical; max-height: none; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/dimmer.css ================================================ /*! * # Fomantic-UI 2.9.4 - Dimmer * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Dimmer *******************************/ .dimmable:not(body) { position: relative; } .ui.dimmer { display: none; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; vertical-align: middle; padding: 1em; background: rgba(0, 0, 0, 0.85); opacity: 0; line-height: 1; animation-fill-mode: both; animation-duration: 0.5s; transition: all 0.5s linear; flex-direction: column; align-items: center; justify-content: center; -webkit-user-select: none; -ms-user-select: none; user-select: none; will-change: opacity; z-index: 1000; } /* Dimmer Content */ .ui.dimmer > .content { -webkit-user-select: text; -ms-user-select: text; user-select: text; color: #fff; } /* Loose Coupling */ .ui.segment > .ui.dimmer:not(.page) { border-radius: inherit; } /* Scrollbars */ .ui.dimmer:not(.inverted)::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.1); } .ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.25); } .ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:window-inactive { background: rgba(255, 255, 255, 0.15); } .ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.35); } .ui.dimmer:not(.inverted) { /* IE11 */ scrollbar-face-color: #656565; scrollbar-shadow-color: #656565; scrollbar-track-color: #323232; scrollbar-arrow-color: #323232; } @supports (-moz-appearance: none) { .ui.dimmer:not(.inverted) { /* firefox: first color thumb, second track */ scrollbar-color: rgba(255, 255, 255, 0.25) rgba(255, 255, 255, 0.1); } } /******************************* States *******************************/ /* Animating */ .animating.dimmable:not(body), .dimmed.dimmable:not(body) { overflow: hidden; } /* Animating / Active / Visible */ .dimmed.dimmable > .ui.animating.dimmer, .dimmed.dimmable > .ui.visible.dimmer, .ui.active.dimmer { display: flex; opacity: 1; } /* Disabled */ .ui.disabled.dimmer { width: 0 !important; height: 0 !important; } /******************************* Variations *******************************/ /* -------------- Legacy --------------- */ /* Animating / Active / Visible */ .dimmed.dimmable > .ui.animating.legacy.dimmer, .dimmed.dimmable > .ui.visible.legacy.dimmer, .ui.active.legacy.dimmer { display: block; } /* -------------- Alignment --------------- */ .ui[class*="top aligned"].dimmer { justify-content: flex-start; } .ui[class*="bottom aligned"].dimmer { justify-content: flex-end; } /* -------------- Page --------------- */ .ui.page.dimmer { position: fixed; transform-style: ""; perspective: 2000px; transform-origin: center center; } .ui.page.dimmer.modals { -moz-perspective: none; } body.animating.in.dimmable, body.dimmed.dimmable { overflow: hidden; } body.dimmable > .dimmer { position: fixed; } /* -------------- Blurring --------------- */ @supports (not (-webkit-backdrop-filter: none)) and (not ((-webkit-backdrop-filter: none) or (backdrop-filter: none))) { .blurring.dimmable > :not(.dimmer) { filter: initial; transition: 800ms filter ease; } .blurring.dimmed.dimmable > :not(.dimmer):not(.popup) { filter: blur(5px) grayscale(0.7); } } /* Dimmer Color */ .blurring.dimmable > .dimmer { background: rgba(0, 0, 0, 0.6); -webkit-backdrop-filter: blur(5px) grayscale(0.7); backdrop-filter: blur(5px) grayscale(0.7); } .blurring.dimmable > .inverted.dimmer { background: rgba(255, 255, 255, 0.6); } /* -------------- Aligned --------------- */ .ui.dimmer > .top.aligned.content > * { vertical-align: top; } .ui.dimmer > .bottom.aligned.content > * { vertical-align: bottom; } /* -------------- Shades --------------- */ .medium.medium.medium.medium.medium.dimmer { background: rgba(0, 0, 0, 0.65); } .light.light.light.light.light.dimmer { background: rgba(0, 0, 0, 0.45); } .very.very.very.very.light.dimmer { background: rgba(0, 0, 0, 0.25); } /* -------------- Inverted --------------- */ .ui.inverted.dimmer { background: rgba(255, 255, 255, 0.85); } .ui.inverted.dimmer > .content, .ui.inverted.dimmer > .content > * { color: #000; } /* -------------- Inverted Shades --------------- */ .medium.medium.medium.medium.medium.inverted.dimmer { background: rgba(255, 255, 255, 0.65); } .light.light.light.light.light.inverted.dimmer { background: rgba(255, 255, 255, 0.45); } .very.very.very.very.light.inverted.dimmer { background: rgba(255, 255, 255, 0.25); } /* -------------- Simple --------------- */ /* Displays without javascript */ .ui.simple.dimmer { display: block; overflow: hidden; opacity: 0; width: 0; height: 0; z-index: -100; background: rgba(0, 0, 0, 0); } .dimmed.dimmable > .ui.simple.dimmer { overflow: visible; opacity: 1; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.85); z-index: 1; } .ui.simple.inverted.dimmer { background: rgba(255, 255, 255, 0); } .dimmed.dimmable > .ui.simple.inverted.dimmer { background: rgba(255, 255, 255, 0.85); } /* -------------- Partially ---------------- */ .ui[class*="top dimmer"], .ui[class*="center dimmer"], .ui[class*="bottom dimmer"] { height: auto; } .ui[class*="bottom dimmer"] { top: auto; bottom: 0; } .ui[class*="center dimmer"] { top: 50%; transform: translateY(-50%); } .ui.segment > .ui.ui[class*="top dimmer"] { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .ui.segment > .ui.ui[class*="center dimmer"] { border-radius: 0; } .ui.segment > .ui.ui[class*="bottom dimmer"] { border-top-left-radius: 0; border-top-right-radius: 0; } .ui[class*="center dimmer"].transition[class*="fade up"].in { animation-name: fadeInUpCenter; } .ui[class*="center dimmer"].transition[class*="fade down"].in { animation-name: fadeInDownCenter; } .ui[class*="center dimmer"].transition[class*="fade up"].out { animation-name: fadeOutUpCenter; } .ui[class*="center dimmer"].transition[class*="fade down"].out { animation-name: fadeOutDownCenter; } .ui[class*="center dimmer"].bounce.transition { animation-name: bounceCenter; } @keyframes fadeInUpCenter { 0% { opacity: 0; transform: translateY(-40%); } 100% { opacity: 1; transform: translateY(-50%); } } @keyframes fadeInDownCenter { 0% { opacity: 0; transform: translateY(-60%); } 100% { opacity: 1; transform: translateY(-50%); } } @keyframes fadeOutUpCenter { 0% { opacity: 1; transform: translateY(-50%); } 100% { opacity: 0; transform: translateY(-45%); } } @keyframes fadeOutDownCenter { 0% { opacity: 1; transform: translateY(-50%); } 100% { opacity: 0; transform: translateY(-55%); } } @keyframes bounceCenter { 0%, 20%, 50%, 80%, 100% { transform: translateY(-50%); } 40% { transform: translateY(calc(-50% - 30px)); } 60% { transform: translateY(calc(-50% - 15px)); } } /******************************* Theme Overrides *******************************/ /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/dimmer.js ================================================ /*! * # Fomantic-UI 2.9.4 - Dimmer * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.dimmer = function (parameters) { var $allModules = $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.dimmer.settings, parameters) : $.extend({}, $.fn.dimmer.settings), selector = settings.selector, namespace = settings.namespace, className = settings.className, error = settings.error, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, clickEvent = 'ontouchstart' in document.documentElement ? 'touchstart' : 'click', $module = $(this), $dimmer, $dimmable, element = this, instance = $module.data(moduleNamespace), module ; module = { preinitialize: function () { if (module.is.dimmer()) { $dimmable = $module.parent(); $dimmer = $module; } else { $dimmable = $module; if (module.has.dimmer()) { $dimmer = settings.dimmerName ? $dimmable.find(selector.dimmer).filter('.' + settings.dimmerName) : $dimmable.find(selector.dimmer); } else { $dimmer = module.create(); } } }, initialize: function () { module.debug('Initializing dimmer', settings); module.bind.events(); module.set.dimmable(); module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, instance) ; }, destroy: function () { module.verbose('Destroying previous module', $dimmer); module.unbind.events(); module.remove.variation(); $dimmable .off(eventNamespace) ; }, bind: { events: function () { if (settings.on === 'hover') { $dimmable .on('mouseenter' + eventNamespace, module.show) .on('mouseleave' + eventNamespace, module.hide) ; } else if (settings.on === 'click') { $dimmable .on(clickEvent + eventNamespace, module.toggle) ; } if (module.is.page()) { module.debug('Setting as a page dimmer', $dimmable); module.set.pageDimmer(); } if (module.is.closable()) { module.verbose('Adding dimmer close event', $dimmer); $dimmable .on(clickEvent + eventNamespace, selector.dimmer, module.event.click) ; } }, }, unbind: { events: function () { $module .removeData(moduleNamespace) ; $dimmable .off(eventNamespace) ; }, }, event: { click: function (event) { module.verbose('Determining if event occurred on dimmer', event); if ($dimmer.find(event.target).length === 0 || $(event.target).is(selector.content)) { module.hide(); event.stopImmediatePropagation(); } }, }, addContent: function (element) { var $content = $(element) ; module.debug('Add content to dimmer', $content); if ($content.parent()[0] !== $dimmer[0]) { $content.detach().appendTo($dimmer); } }, create: function () { var $element = $(settings.template.dimmer(settings)) ; if (settings.dimmerName) { module.debug('Creating named dimmer', settings.dimmerName); $element.addClass(settings.dimmerName); } $element .appendTo($dimmable) ; return $element; }, show: function (callback) { callback = isFunction(callback) ? callback : function () {}; if ((!module.is.dimmed() || module.is.animating()) && module.is.enabled()) { if (settings.onShow.call(element) === false) { module.verbose('Show callback returned false cancelling dimmer show'); return; } module.debug('Showing dimmer', $dimmer, settings); module.set.variation(); module.animate.show(callback); settings.onChange.call(element); } else { module.debug('Dimmer is already shown or disabled'); } }, hide: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (module.is.dimmed() || module.is.animating()) { if (settings.onHide.call(element) === false) { module.verbose('Hide callback returned false cancelling dimmer hide'); return; } module.debug('Hiding dimmer', $dimmer); module.animate.hide(callback); settings.onChange.call(element); } else { module.debug('Dimmer is not visible'); } }, toggle: function () { module.verbose('Toggling dimmer visibility', $dimmer); if (!module.is.dimmed()) { module.show(); } else { if (module.is.closable()) { module.hide(); } } }, animate: { show: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (settings.useCSS && $.fn.transition !== undefined) { if (settings.useFlex) { module.debug('Using flex dimmer'); module.remove.legacy(); } else { module.debug('Using legacy non-flex dimmer'); module.set.legacy(); } if (settings.opacity !== 'auto') { module.set.opacity(); } $dimmer .transition({ debug: settings.debug, verbose: settings.verbose, silent: settings.silent, displayType: settings.useFlex ? 'flex' : 'block', animation: (settings.transition.showMethod || settings.transition) + ' in', queue: false, duration: module.get.duration(), useFailSafe: true, onStart: function () { module.set.dimmed(); }, onComplete: function () { module.set.active(); settings.onVisible.call($dimmer); callback(); }, }) ; } else { module.verbose('Showing dimmer animation with javascript'); module.set.dimmed(); if (settings.opacity === 'auto') { settings.opacity = 0.8; } $dimmer .stop() .css({ opacity: 0, width: '100%', height: '100%', }) .fadeTo(module.get.duration(), settings.opacity, function () { $dimmer.removeAttr('style'); module.set.active(); settings.onVisible.call($dimmer); callback(); }) ; } }, hide: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (settings.useCSS && $.fn.transition !== undefined) { module.verbose('Hiding dimmer with css'); $dimmer .transition({ debug: settings.debug, verbose: settings.verbose, silent: settings.silent, displayType: settings.useFlex ? 'flex' : 'block', animation: (settings.transition.hideMethod || settings.transition) + ' out', queue: false, duration: module.get.duration(), useFailSafe: true, onComplete: function () { module.remove.dimmed(); module.remove.variation(); module.remove.active(); settings.onHidden.call($dimmer); callback(); }, }) ; } else { module.verbose('Hiding dimmer with javascript'); $dimmer .stop() .fadeOut(module.get.duration(), function () { module.remove.dimmed(); module.remove.active(); $dimmer.removeAttr('style'); settings.onHidden.call($dimmer); callback(); }) ; } }, }, get: { dimmer: function () { return $dimmer; }, duration: function () { if (module.is.active()) { return settings.transition.hideDuration || settings.duration.hide || settings.duration; } return settings.transition.showDuration || settings.duration.show || settings.duration; }, }, has: { dimmer: function () { if (settings.dimmerName) { return $module.find(selector.dimmer).filter('.' + settings.dimmerName).length > 0; } return $module.find(selector.dimmer).length > 0; }, }, is: { active: function () { return $dimmer.hasClass(className.active); }, animating: function () { return $dimmer.is(':animated') || $dimmer.hasClass(className.animating); }, closable: function () { if (settings.closable === 'auto') { return settings.on !== 'hover'; } return settings.closable; }, dimmer: function () { return $module.hasClass(className.dimmer); }, dimmable: function () { return $module.hasClass(className.dimmable); }, dimmed: function () { return $dimmable.hasClass(className.dimmed); }, disabled: function () { return $dimmable.hasClass(className.disabled); }, enabled: function () { return !module.is.disabled(); }, page: function () { return $dimmable.is('body'); }, pageDimmer: function () { return $dimmer.hasClass(className.pageDimmer); }, }, can: { show: function () { return !$dimmer.hasClass(className.disabled); }, }, set: { opacity: function (opacity) { var color = $dimmer.css('background-color'), colorArray = color.split(','), isRGB = colorArray && colorArray.length >= 3 ; opacity = settings.opacity === 0 ? 0 : settings.opacity || opacity; if (isRGB) { colorArray[2] = colorArray[2].replace(')', ''); colorArray[3] = opacity + ')'; color = colorArray.join(','); } else { color = 'rgba(0, 0, 0, ' + opacity + ')'; } module.debug('Setting opacity to', opacity); $dimmer.css('background-color', color); }, legacy: function () { $dimmer.addClass(className.legacy); }, active: function () { $dimmer.addClass(className.active); }, dimmable: function () { $dimmable.addClass(className.dimmable); }, dimmed: function () { $dimmable.addClass(className.dimmed); }, pageDimmer: function () { $dimmer.addClass(className.pageDimmer); }, disabled: function () { $dimmer.addClass(className.disabled); }, variation: function (variation) { variation = variation || settings.variation; if (variation) { $dimmer.addClass(variation); } }, }, remove: { active: function () { $dimmer .removeClass(className.active) ; }, legacy: function () { $dimmer.removeClass(className.legacy); }, dimmed: function () { $dimmable.removeClass(className.dimmed); }, disabled: function () { $dimmer.removeClass(className.disabled); }, variation: function (variation) { variation = variation || settings.variation; if (variation) { $dimmer.removeClass(variation); } }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if ($allModules.length > 1) { title += ' (' + $allModules.length + ')'; } if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; module.preinitialize(); if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.dimmer.settings = { name: 'Dimmer', namespace: 'dimmer', silent: false, debug: false, verbose: false, performance: true, // whether should use flex layout useFlex: true, // name to distinguish between multiple dimmers in context dimmerName: false, // whether to add a variation type variation: false, // whether to bind close events closable: 'auto', // whether to use css animations useCSS: true, // css animation to use transition: 'fade', // event to bind to on: false, // overriding opacity value opacity: 'auto', // transition durations duration: { show: 500, hide: 500, }, // whether the dynamically created dimmer should have a loader displayLoader: false, loaderText: false, loaderVariation: '', onChange: function () {}, onShow: function () {}, onHide: function () {}, onVisible: function () {}, onHidden: function () {}, error: { method: 'The method you called is not defined.', }, className: { active: 'active', animating: 'animating', dimmable: 'dimmable', dimmed: 'dimmed', dimmer: 'dimmer', disabled: 'disabled', hide: 'hide', legacy: 'legacy', pageDimmer: 'page', show: 'show', loader: 'ui loader', }, selector: { dimmer: '> .ui.dimmer', content: '.ui.dimmer > .content, .ui.dimmer > .content > .center', }, template: { dimmer: function (settings) { var d = $('<div/>').addClass('ui dimmer'), l ; if (settings.displayLoader) { l = $('<div/>') .addClass(settings.className.loader) .addClass(settings.loaderVariation) ; if (settings.loaderText) { l.text(settings.loaderText); l.addClass('text'); } d.append(l); } return d; }, }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/divider.css ================================================ /*! * # Fomantic-UI 2.9.4 - Divider * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Divider *******************************/ .ui.divider { margin: 1rem 0; line-height: 1; height: 0; font-weight: bold; text-transform: uppercase; letter-spacing: 0.05em; color: rgba(0, 0, 0, 0.85); -webkit-user-select: none; -ms-user-select: none; user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } /* -------------- Basic --------------- */ .ui.divider:not(.vertical):not(.horizontal) { border-top: 1px solid rgba(34, 36, 38, 0.15); border-bottom: 1px solid rgba(255, 255, 255, 0.1); } /* -------------- Coupling --------------- */ /* Allow divider between each column row */ .ui.grid > .column + .divider:not(.vertical), .ui.grid > .row > .column + .divider:not(.vertical) { left: auto; } /* -------------- Horizontal --------------- */ .ui.horizontal.divider { display: table; white-space: nowrap; height: auto; margin: ""; line-height: 1; text-align: center; } .ui.horizontal.divider::before, .ui.horizontal.divider::after { content: ""; display: table-cell; position: relative; top: 50%; width: 50%; background-repeat: no-repeat; } .ui.horizontal.divider::before { background-position: right 1em top 50%; } .ui.horizontal.divider::after { background-position: left 1em top 50%; } /* -------------- Vertical --------------- */ .ui.vertical.divider { position: absolute; z-index: 2; top: 50%; left: 50%; margin: 0; padding: 0; width: auto; height: 50%; line-height: 0; text-align: center; transform: translateX(-50%); } .ui.vertical.divider::before, .ui.vertical.divider::after { position: absolute; left: 50%; content: ""; z-index: 3; border-left: 1px solid rgba(34, 36, 38, 0.15); border-right: 1px solid rgba(255, 255, 255, 0.1); width: 0; height: calc(100% - 1rem); } .ui.vertical.divider::before { top: -100%; } .ui.vertical.divider::after { top: auto; bottom: 0; } /* Inside grid */ .ui.stackable.grid .ui.vertical.divider, .ui.grid .stackable.row .ui.vertical.divider { flex: 1; } @media only screen and (max-width: 767.98px) { .ui.stackable.grid .column + .ui.vertical.divider, .ui.grid .stackable.row .column + .ui.vertical.divider { margin: 1rem; } .ui.stackable.grid .ui.vertical.divider, .ui.grid .stackable.row .ui.vertical.divider { display: table; white-space: nowrap; height: auto; margin: ""; overflow: hidden; line-height: 1; text-align: center; position: static; top: 0; left: 0; transform: none; } .ui.stackable.grid .ui.vertical.divider::before, .ui.grid .stackable.row .ui.vertical.divider::before, .ui.stackable.grid .ui.vertical.divider::after, .ui.grid .stackable.row .ui.vertical.divider::after { left: 0; border-left: none; border-right: none; content: ""; display: table-cell; position: relative; top: 50%; width: 50%; background-repeat: no-repeat; } .ui.stackable.grid .ui.vertical.divider::before, .ui.grid .stackable.row .ui.vertical.divider::before { background-position: right 1em top 50%; } .ui.stackable.grid .ui.vertical.divider::after, .ui.grid .stackable.row .ui.vertical.divider::after { background-position: left 1em top 50%; } } /* -------------- Icon --------------- */ .ui.divider > .icon { margin: 0; font-size: 1rem; height: 1em; vertical-align: middle; } /* -------------- Header --------------- */ .ui.horizontal.divider[class*="left aligned"]::before { display: none; } .ui.horizontal.divider[class*="left aligned"]::after { width: 100%; } .ui.horizontal.divider[class*="right aligned"]::before { width: 100%; } .ui.horizontal.divider[class*="right aligned"]::after { display: none; } /******************************* Variations *******************************/ /* -------------- Hidden --------------- */ .ui.hidden.divider { border-color: transparent !important; } .ui.hidden.divider::before, .ui.hidden.divider::after { display: none; } /* -------------- Inverted --------------- */ .ui.divider.inverted, .ui.vertical.inverted.divider, .ui.horizontal.inverted.divider { color: #fff; } .ui.divider.inverted, .ui.divider.inverted::after, .ui.divider.inverted::before { border-color: rgba(34, 36, 38, 0.15) rgba(255, 255, 255, 0.15) rgba(255, 255, 255, 0.15) rgba(34, 36, 38, 0.15) !important; } /* -------------- Fitted --------------- */ .ui.fitted.divider { margin: 0; } /* -------------- Clearing --------------- */ .ui.clearing.divider { clear: both; } /* -------------- Section --------------- */ .ui.section.divider { margin-top: 2rem; margin-bottom: 2rem; } /* -------------- Sizes --------------- */ .ui.divider { font-size: 1rem; } .ui.mini.divider { font-size: 0.78571429rem; } .ui.tiny.divider { font-size: 0.85714286rem; } .ui.small.divider { font-size: 0.92857143rem; } .ui.large.divider { font-size: 1.14285714rem; } .ui.big.divider { font-size: 1.28571429rem; } .ui.huge.divider { font-size: 1.42857143rem; } .ui.massive.divider { font-size: 1.71428571rem; } /******************************* Theme Overrides *******************************/ .ui.horizontal.divider::before, .ui.horizontal.divider::after { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC"); } @media only screen and (max-width: 767px) { .ui.stackable.grid .ui.vertical.divider::before, .ui.grid .stackable.row .ui.vertical.divider::before, .ui.stackable.grid .ui.vertical.divider::after, .ui.grid .stackable.row .ui.vertical.divider::after { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC"); } } /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/dropdown.css ================================================ /*! * # Fomantic-UI 2.9.4 - Dropdown * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Dropdown *******************************/ .ui.dropdown { cursor: pointer; position: relative; display: inline-block; outline: none; text-align: left; transition: box-shadow 0.1s ease, width 0.1s ease; -webkit-user-select: none; -ms-user-select: none; user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } /******************************* Content *******************************/ /* -------------- Menu --------------- */ .ui.dropdown .menu { cursor: auto; position: absolute; display: none; outline: none; top: 100%; min-width: max-content; margin: 0; padding: 0; background: #fff; font-size: 1em; text-shadow: none; text-align: left; box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15); border: 1px solid rgba(34, 36, 38, 0.15); border-radius: 0.28571429rem; transition: opacity 0.1s ease; z-index: 11; will-change: transform, opacity; } .ui.dropdown .menu > * { white-space: nowrap; } /* -------------- Hidden Input --------------- */ .ui.dropdown > input:not(.search):first-child, .ui.dropdown > select { display: none !important; } /* -------------- Dropdown Icon --------------- */ .ui.dropdown:not(.labeled) > .dropdown.icon { position: relative; width: auto; min-width: 1em; font-size: 0.85714286em; margin: 0 0 0 1em; } .ui.dropdown .menu > .item .dropdown.icon { width: auto; float: right; margin: 0em 0 0 1em; } .ui.dropdown .menu > .item .dropdown.icon + .text { margin-right: 1em; } /* -------------- Text --------------- */ .ui.dropdown > .text { display: inline-block; transition: none; } /* -------------- Menu Item --------------- */ .ui.dropdown .menu > .item { position: relative; cursor: pointer; display: block; border: none; height: auto; min-height: 2.57142857rem; text-align: left; border-top: none; line-height: 1em; font-size: 1rem; color: rgba(0, 0, 0, 0.87); padding: 0.78571429rem 1.14285714rem; text-transform: none; font-weight: normal; box-shadow: none; -webkit-touch-callout: none; } .ui.dropdown .menu > .item:first-child { border-top-width: 0; } .ui.dropdown .menu > .item.vertical { display: flex; flex-direction: column-reverse; } /* -------------- Floated Content --------------- */ .ui.dropdown > .text > [class*="right floated"], .ui.dropdown .menu .item > [class*="right floated"] { float: right !important; margin-right: 0 !important; margin-left: 1em !important; } .ui.dropdown > .text > [class*="left floated"], .ui.dropdown .menu .item > [class*="left floated"] { float: left !important; margin-left: 0 !important; margin-right: 1em !important; } .ui.dropdown .menu .item > i.icon.floated, .ui.dropdown .menu .item > .flag.floated, .ui.dropdown .menu .item > .image.floated, .ui.dropdown .menu .item > img.floated { margin-top: 0em; } /* -------------- Menu Divider --------------- */ .ui.dropdown .menu > .header { margin: 1rem 0 0.75rem; padding: 0 1.14285714rem; font-weight: bold; text-transform: uppercase; } .ui.dropdown .menu > .header:not(.ui) { color: rgba(0, 0, 0, 0.85); font-size: 0.78571429em; } .ui.dropdown .menu > .divider { border-top: 1px solid rgba(34, 36, 38, 0.1); height: 0; margin: 0.5em 0; } .ui.dropdown .menu > .horizontal.divider { border-top: none; } .ui.ui.ui.dropdown .menu > .input { width: auto; display: flex; margin: 1.14285714rem 0.78571429rem; min-width: 10rem; } .ui.dropdown .menu > .header + .input { margin-top: 0; } .ui.dropdown .menu > .input:not(.transparent) input { padding: 0.5em 1em; } .ui.dropdown .menu > .input:not(.transparent) .button, .ui.dropdown .menu > .input:not(.transparent) i.icon, .ui.dropdown .menu > .input:not(.transparent) .label { padding-top: 0.5em; padding-bottom: 0.5em; } /* ----------------- Item Description ------------------- */ .ui.dropdown > .text > .description, .ui.dropdown .menu > .item > .description { float: right; margin: 0 0 0 1em; color: rgba(0, 0, 0, 0.4); } .ui.dropdown .menu > .item.vertical > .description { margin: 0; } /* ----------------- Item Text ------------------- */ .ui.dropdown .menu > .item.vertical > .text { margin-bottom: 0.25em; } /* ----------------- Message ------------------- */ .ui.dropdown .menu > .message { padding: 0.78571429rem 1.14285714rem; font-weight: normal; } .ui.dropdown .menu > .message:not(.ui) { color: rgba(0, 0, 0, 0.4); } /* -------------- Sub Menu --------------- */ .ui.dropdown .menu .menu { top: 0; left: 100%; right: auto; margin: 0 -0.5em !important; border-radius: 0.28571429rem !important; z-index: 21 !important; } /* Hide Arrow */ .ui.dropdown .menu .menu::after { display: none; } /* -------------- Sub Elements --------------- */ /* Icons / Flags / Labels / Image */ .ui.dropdown > .text > i.icons, .ui.dropdown > .text > i.icon, .ui.dropdown > .text > .label, .ui.dropdown > .text > .flag, .ui.dropdown > .text > img, .ui.dropdown > .text > .image { margin-top: 0em; } .ui.dropdown .menu > .item > i.icons, .ui.dropdown .menu > .item > i.icon, .ui.dropdown .menu > .item > .label, .ui.dropdown .menu > .item > .flag, .ui.dropdown .menu > .item > .image, .ui.dropdown .menu > .item > img { margin-top: 0em; } .ui.dropdown > .text > i.icons, .ui.dropdown > .text > i.icon, .ui.dropdown > .text > .label, .ui.dropdown > .text > .flag, .ui.dropdown > .text > img, .ui.dropdown > .text > .image, .ui.dropdown .menu > .item > i.icons, .ui.dropdown .menu > .item > i.icon, .ui.dropdown .menu > .item > .label, .ui.dropdown .menu > .item > .flag, .ui.dropdown .menu > .item > .image, .ui.dropdown .menu > .item > img { margin-left: 0; float: none; margin-right: 0.78571429rem; } /* -------------- Image --------------- */ .ui.dropdown > .text > img, .ui.dropdown > .text > .image:not(.icon), .ui.dropdown .menu > .item > .image:not(.icon), .ui.dropdown .menu > .item > img { display: inline-block; vertical-align: top; width: auto; margin-top: -0.5em; margin-bottom: -0.5em; max-height: 2em; } /******************************* Coupling *******************************/ /* -------------- Menu --------------- */ /* Remove Menu Item Divider */ .ui.dropdown .ui.menu > .item::before, .ui.menu .ui.dropdown .menu > .item::before { display: none; } /* Prevent Menu Item Border */ .ui.menu .ui.dropdown .menu .active.item { border-left: none; } /* Automatically float dropdown menu right on last menu item */ .ui.menu .right.menu .dropdown:last-child > .menu:not(.left), .ui.menu .right.dropdown.item > .menu:not(.left), .ui.buttons > .ui.dropdown:last-child > .menu:not(.left) { left: auto; right: 0; } /* -------------- Label --------------- */ /* Dropdown Menu */ .ui.label.dropdown .menu { min-width: 100%; } /* -------------- Button --------------- */ /* No Margin On Icon Button */ .ui.dropdown.icon.button > .dropdown.icon { margin: 0; } .ui.dropdown.button .menu { min-width: 100%; } .ui.dropdown.button:not(.pointing):not(.floating).active { border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.dropdown.button:not(.pointing):not(.floating) > .menu { border-radius: 0 0 0.28571429rem 0.28571429rem; } /******************************* Types *******************************/ select.ui.dropdown { height: 38px; padding: 0.5em; border: 1px solid rgba(34, 36, 38, 0.15); visibility: visible; } /* -------------- Selection --------------- */ /* Displays like a select box */ .ui.selection.dropdown { cursor: pointer; word-wrap: break-word; line-height: 1em; white-space: normal; outline: 0; transform: rotateZ(0); min-width: 14em; min-height: 2.71428571em; background: #fff; display: inline-block; padding: 0.78571429em 3.2em 0.78571429em 1em; color: rgba(0, 0, 0, 0.87); box-shadow: none; border: 1px solid rgba(34, 36, 38, 0.15); border-radius: 0.28571429rem; transition: box-shadow 0.1s ease, width 0.1s ease; } .ui.selection.dropdown.visible, .ui.selection.dropdown.active { z-index: 10; } .ui.selection.dropdown > .search.icon, .ui.selection.dropdown > .delete.icon, .ui.selection.dropdown > .dropdown.icon { cursor: pointer; position: absolute; width: auto; height: auto; line-height: 1.21428571em; top: 0.78571429em; right: 1em; z-index: 3; margin: -0.78571429em; padding: 0.91666667em; opacity: 0.5; transition: opacity 0.1s ease; } /* Compact */ .ui.compact.selection.dropdown { min-width: 0; } .ui.compact.selection.dropdown > .menu { width: auto; } .ui.compact.selection.dropdown > .menu:not(.multiline) { width: max-content; } /* Selection Menu */ .ui.selection.dropdown:not(.unlimited) .menu { overflow-x: hidden; overflow-y: auto; -ms-scroll-chaining: none; overscroll-behavior: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; } .ui.selection.dropdown .menu { outline: none; margin: 0 -1px; min-width: calc(100% + 2px); width: calc(100% + 2px); box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15); transition: opacity 0.1s ease; } .ui.selection.dropdown:not(.pointing):not(.floating) > .menu { border-top-width: 0; border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui.selection.dropdown .menu::after, .ui.selection.dropdown .menu::before { display: none; } /* -------------- Message --------------- */ .ui.selection.dropdown .menu > .message { padding: 0.78571429rem 1.14285714rem; } @media only screen and (max-width: 767.98px) { .ui.ui.selection.dropdown.short .menu { max-height: 6.01071429rem; } .ui.ui.selection.dropdown[class*="very short"] .menu { max-height: 4.00714286rem; } .ui.selection.dropdown:not(.unlimited) .menu { max-height: 8.01428571rem; } .ui.ui.selection.dropdown.long .menu { max-height: 16.02857143rem; } .ui.ui.selection.dropdown[class*="very long"] .menu { max-height: 24.04285714rem; } } @media only screen and (min-width: 768px) { .ui.ui.selection.dropdown.short .menu { max-height: 8.01428571rem; } .ui.ui.selection.dropdown[class*="very short"] .menu { max-height: 5.34285714rem; } .ui.selection.dropdown:not(.unlimited) .menu { max-height: 10.68571429rem; } .ui.ui.selection.dropdown.long .menu { max-height: 21.37142857rem; } .ui.ui.selection.dropdown[class*="very long"] .menu { max-height: 32.05714286rem; } } @media only screen and (min-width: 992px) { .ui.ui.selection.dropdown.short .menu { max-height: 12.02142857rem; } .ui.ui.selection.dropdown[class*="very short"] .menu { max-height: 8.01428571rem; } .ui.selection.dropdown:not(.unlimited) .menu { max-height: 16.02857143rem; } .ui.ui.selection.dropdown.long .menu { max-height: 32.05714286rem; } .ui.ui.selection.dropdown[class*="very long"] .menu { max-height: 48.08571429rem; } } @media only screen and (min-width: 1920px) { .ui.ui.selection.dropdown.short .menu { max-height: 16.02857143rem; } .ui.ui.selection.dropdown[class*="very short"] .menu { max-height: 10.68571429rem; } .ui.selection.dropdown:not(.unlimited) .menu { max-height: 21.37142857rem; } .ui.ui.selection.dropdown.long .menu { max-height: 42.74285714rem; } .ui.ui.selection.dropdown[class*="very long"] .menu { max-height: 64.11428571rem; } } /* Menu Item */ .ui.selection.dropdown .menu > .item { border-top: 1px solid #fafafa; padding: 0.78571429rem 1.14285714rem; white-space: normal; word-wrap: normal; } .ui.selection.pointing.dropdown .menu > .item:first-child, .ui.selection.floating.dropdown .menu > .item:first-child { border-top: none; } /* User Item */ .ui.selection.dropdown .menu > .hidden.addition.item { display: none; } /* User addition item */ .ui.dropdown > .menu > .stuck.addition.item:first-child { position: sticky; top: 0; box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15); background: #fff; z-index: 14; } /* Hover */ .ui.selection.dropdown:hover { border-color: rgba(34, 36, 38, 0.35); box-shadow: none; } /* Active */ .ui.selection.simple.dropdown:hover, .ui.selection.active.dropdown { border-color: #96c8da; box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15); } .ui.selection.simple.dropdown:hover .menu, .ui.selection.active.dropdown .menu { border-color: #96c8da; box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15); } /* Focus */ .ui.selection.dropdown:focus { border-color: #96c8da; box-shadow: none; } .ui.selection.dropdown:focus .menu { border-color: #96c8da; box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15); } @supports selector(:has(.f)) { .ui.ui.selection.dropdown:not(.inverted):has(> input:focus) { border-color: #96c8da; box-shadow: none; } .ui.ui.selection.dropdown:not(.inverted):has(> input:focus) > i.icon { opacity: 1; } } .ui.ui.selection.dropdown:focus > i.icon { opacity: 1; } /* Visible */ .ui.selection.visible.dropdown > .text:not(.default) { font-weight: normal; color: rgba(0, 0, 0, 0.8); } /* Visible Hover */ .ui.selection.active.dropdown:hover { border-color: #96c8da; box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15); } .ui.selection.active.dropdown:hover .menu { border-color: #96c8da; box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 0.15); } /* Dropdown Icon */ .ui.active.selection.dropdown > .dropdown.icon, .ui.visible.selection.dropdown > .dropdown.icon { opacity: ""; z-index: 3; } /* Connecting Border */ .ui.active.selection.dropdown:not(.pointing):not(.floating) { border-bottom-left-radius: 0 !important; border-bottom-right-radius: 0 !important; } /* Empty Connecting Border */ .ui.active.empty.selection.dropdown { border-radius: 0.28571429rem !important; box-shadow: none !important; } .ui.active.empty.selection.dropdown .menu { border: none !important; box-shadow: none !important; } /* CSS specific to iOS devices or firefox mobile only */ @supports (-webkit-touch-callout: none) or (-moz-appearance: none) { @media (-moz-touch-enabled), (pointer: coarse) { .ui.dropdown .scrollhint.menu:not(.hidden)::before { animation: scrollhint 2s ease 2; content: ""; z-index: 15; display: block; position: absolute; opacity: 0; right: 0.25em; top: 0; height: 100%; border-right: 0.25em solid; border-left: 0; border-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0)) 1 100%; } .ui.inverted.dropdown .scrollhint.menu:not(.hidden)::before { border-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.75), rgba(255, 255, 255, 0)) 1 100%; } @keyframes scrollhint { 0% { opacity: 1; top: 100%; } 100% { opacity: 0; top: 0; } } } } /* -------------- Searchable --------------- */ /* Search Selection */ .ui.search.dropdown { min-width: ""; } /* Search Dropdown */ .ui.search.dropdown > input.search { background: none transparent !important; border: none !important; box-shadow: none !important; cursor: text; top: 0; left: 1px; width: 100%; outline: none; -webkit-tap-highlight-color: rgba(255, 255, 255, 0); padding: inherit; } /* Text Layering */ .ui.search.dropdown > input.search { position: absolute; z-index: 2; } .ui.search.dropdown > .text { cursor: text; position: relative; left: 1px; z-index: auto; } /* Search Selection */ .ui.search.selection.dropdown > input.search { line-height: 1.21428571em; padding: 0.67857143em 3.2em 0.67857143em 1em; } /* Used to size multi select input to character width */ .ui.search.selection.dropdown > span.sizer { line-height: 1.21428571em; padding: 0.67857143em 3.2em 0.67857143em 1em; display: none; white-space: pre; } /* Active/Visible Search */ .ui.search.dropdown.active > input.search, .ui.search.dropdown.visible > input.search { cursor: auto; } .ui.search.dropdown.active > .text, .ui.search.dropdown.visible > .text { pointer-events: none; } /* Filtered Text */ .ui.active.search.dropdown input.search:focus + .text i.icon, .ui.active.search.dropdown input.search:focus + .text .flag { opacity: 0.45; } .ui.active.search.dropdown input.search:focus + .text { color: rgba(115, 115, 115, 0.87); } .ui.search.dropdown.button > span.sizer { display: none; } /* Search Menu */ .ui.search.dropdown:not(.unlimited) .menu { overflow-x: hidden; overflow-y: auto; -ms-scroll-chaining: none; overscroll-behavior: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; } @media only screen and (max-width: 767.98px) { .ui.search.dropdown:not(.unlimited) .menu { max-height: 8.01428571rem; } } @media only screen and (min-width: 768px) { .ui.search.dropdown:not(.unlimited) .menu { max-height: 10.68571429rem; } } @media only screen and (min-width: 992px) { .ui.search.dropdown:not(.unlimited) .menu { max-height: 16.02857143rem; } } @media only screen and (min-width: 1920px) { .ui.search.dropdown:not(.unlimited) .menu { max-height: 21.37142857rem; } } /* Clearable Selection */ .ui.dropdown > .remove.icon { cursor: pointer; font-size: 0.85714286em; margin: -0.78571429em; padding: 0.91666667em; right: 2em; top: 0.78571429em; position: absolute; opacity: 0.5; z-index: 3; } .ui.selection.dropdown > .remove.icon { right: 3em; } .ui.inline.dropdown > .remove.icon { right: 2.2em; } .ui.clearable.dropdown .text:not(.default), .ui.clearable.dropdown:not(.search) > .ui.label:last-of-type { margin-right: 1.5em; } .ui.dropdown select.noselection ~ .remove.icon, .ui.dropdown input[value=""] ~ .remove.icon, .ui.dropdown input:not([value]):not(.search) ~ .remove.icon, .ui.dropdown.loading > .remove.icon { display: none; } .ui.dropdown:not(.selection) > .remove.icon ~ .dropdown.icon { margin-left: 1.5em; } .ui.dropdown:not(.selection):not(.multiple) > .remove.icon { margin-top: -1.35em; } /* -------------- Multiple --------------- */ /* Multiple Selection */ .ui.ui.multiple.dropdown { padding: 0.22619048em 3.2em 0.22619048em 0.35714286em; } .ui.multiple.dropdown .menu { cursor: auto; } /* Selection Label */ .ui.multiple.dropdown > .label { display: inline-block; white-space: normal; font-size: 1em; padding: 0.35714286em 0.78571429em; margin: 0.14285714rem 0.28571429rem 0.14285714rem 0; box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15) inset; } /* Dropdown Icon */ .ui.multiple.dropdown .dropdown.icon { margin: ""; padding: ""; } /* Text */ .ui.multiple.dropdown > .text { position: static; padding: 0; max-width: 100%; margin: 0.45238095em 0 0.45238095em 0.64285714em; line-height: 1.21428571em; } .ui.multiple.dropdown > .text.default { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ui.multiple.dropdown > .label ~ input.search { margin-left: 0.14285714em !important; } .ui.multiple.dropdown > .label ~ .text { display: none; } .ui.multiple.dropdown > .label:not(.image) > img:not(.centered) { margin-right: 0.78571429rem; } .ui.multiple.dropdown > .label:not(.image) > img.ui:not(.avatar) { margin-bottom: 0.39285714rem; } .ui.multiple.dropdown > .image.label img { margin: -0.35714286em 0.78571429em -0.35714286em -0.78571429em; height: 1.71428571em; } .ui.multiple.dropdown:not(.selection):not(.labeled) > .dropdown.icon { right: -1.5em; } .ui.multiple.dropdown:not(.selection):not(.labeled) > .remove.icon { margin-right: -1.5em; } .ui.multiple.dropdown:not(.selection):not(.labeled):not(.search) > .remove.icon ~ .text.default, .ui.multiple.dropdown:not(.selection):not(.labeled) > .text.default:first-child { overflow: inherit; } /* ----------------- Multiple Search ----------------- */ /* Multiple Search Selection */ .ui.multiple.search.dropdown, .ui.multiple.search.dropdown > input.search { cursor: text; } /* Prompt Text */ .ui.multiple.search.dropdown > .text { display: inline-block; position: absolute; top: 0; left: 0; padding: inherit; margin: 0.45238095em 0 0.45238095em 0.64285714em; line-height: 1.21428571em; } .ui.multiple.search.dropdown > .text.default { z-index: -1; } .ui.multiple.search.dropdown > .label ~ .text { display: none; } /* Search */ .ui.multiple.search.dropdown > input.search { position: static; padding: 0; max-width: 100%; margin: 0.45238095em 0 0.45238095em 0.64285714em; width: 2.2em; line-height: 1.21428571em; } .ui.multiple.search.dropdown.button { min-width: 14em; } .ui.multiple.search.dropdown > span.sizer { display: none; } .ui.multiple.search.dropdown:not(.selection) > .remove.icon + input.search, .ui.multiple.search.dropdown:not(.selection) > input.search:first-child { min-width: 5.05em; } /* -------------- Inline --------------- */ .ui.inline.dropdown { cursor: pointer; display: inline-block; color: inherit; } .ui.inline.dropdown .dropdown.icon { margin: 0 0.21428571em; vertical-align: baseline; } .ui.inline.dropdown > .text { font-weight: bold; } .ui.inline.dropdown .menu { cursor: auto; margin-top: 0.21428571em; border-radius: 0.28571429rem; } /******************************* States *******************************/ /* -------------------- Active ---------------------- */ /* Menu Item Active */ .ui.dropdown .menu .active.item { background: transparent; font-weight: bold; color: rgba(0, 0, 0, 0.95); box-shadow: none; z-index: 12; } /* -------------------- Hover ---------------------- */ /* Menu Item Hover */ .ui.dropdown .menu > .item:hover { background: #f2f2f2; color: rgba(0, 0, 0, 0.95); z-index: 13; } /* -------------------- Default Text ---------------------- */ .ui.dropdown:not(.button) > .default.text, .ui.default.dropdown:not(.button) > .text { color: rgba(191, 191, 191, 0.87); } .ui.dropdown:not(.button) > input:focus ~ .default.text, .ui.default.dropdown:not(.button) > input:focus ~ .text { color: rgba(115, 115, 115, 0.87); } /* -------------------- Loading --------------------- */ .ui.loading.dropdown > i.icon { height: 1em !important; } .ui.loading.selection.dropdown > i.icon { padding: 1.5em 1.28571429em !important; } .ui.loading.dropdown > i.icon::before { position: absolute; content: ""; top: 50%; left: 50%; margin: -0.64285714em 0 0 -0.64285714em; width: 1.28571429em; height: 1.28571429em; border-radius: 500rem; border: 0.2em solid rgba(0, 0, 0, 0.1); } .ui.loading.dropdown > i.icon::after { position: absolute; content: ""; top: 50%; left: 50%; box-shadow: 0 0 0 1px transparent; margin: -0.64285714em 0 0 -0.64285714em; width: 1.28571429em; height: 1.28571429em; animation: loader 0.6s infinite linear; border: 0.2em solid #767676; border-radius: 500rem; } /* Coupling */ .ui.loading.dropdown.button > i.icon::before, .ui.loading.dropdown.button > i.icon::after { display: none; } .ui.loading.dropdown > .text { transition: none; } /* Used To Check Position */ .ui.dropdown .loading.menu { display: block; visibility: hidden; z-index: -1; } .ui.dropdown > .loading.menu { left: 0 !important; right: auto !important; } .ui.dropdown > .menu .loading.menu { left: 100% !important; right: auto !important; } /* -------------------- Keyboard Select ---------------------- */ /* Selected Item */ .ui.dropdown.selected, .ui.dropdown .menu .selected.item { background: #f7f7f7; color: rgba(0, 0, 0, 0.95); } /* -------------------- Search Filtered ---------------------- */ /* Filtered Item */ .ui.dropdown > .filtered.text { visibility: hidden; } .ui.dropdown .filtered.item { display: none !important; } /* -------------------- States ---------------------- */ .ui.dropdown.error, .ui.dropdown.error > .text, .ui.dropdown.error > .default.text { color: #9f3a38; } .ui.selection.dropdown.error { background: #fff6f6; border-color: #e0b4b4; } .ui.selection.dropdown.error:hover { border-color: #e0b4b4; } .ui.multiple.selection.error.dropdown > .label { border-color: #e0b4b4; } .ui.dropdown.error > .menu, .ui.dropdown.error > .menu .menu { border-color: #e0b4b4; } .ui.dropdown.error > .menu > .item { color: #9f3a38; } /* Item Hover */ .ui.dropdown.error > .menu > .item:hover { background-color: #fbe7e7; } /* Item Active */ .ui.dropdown.error > .menu .active.item { background-color: #fdcfcf; } .ui.dropdown.info, .ui.dropdown.info > .text, .ui.dropdown.info > .default.text { color: #276f86; } .ui.selection.dropdown.info { background: #f8ffff; border-color: #a9d5de; } .ui.selection.dropdown.info:hover { border-color: #a9d5de; } .ui.multiple.selection.info.dropdown > .label { border-color: #a9d5de; } .ui.dropdown.info > .menu, .ui.dropdown.info > .menu .menu { border-color: #a9d5de; } .ui.dropdown.info > .menu > .item { color: #276f86; } /* Item Hover */ .ui.dropdown.info > .menu > .item:hover { background-color: #e9f2fb; } /* Item Active */ .ui.dropdown.info > .menu .active.item { background-color: #cef1fd; } .ui.dropdown.success, .ui.dropdown.success > .text, .ui.dropdown.success > .default.text { color: #2c662d; } .ui.selection.dropdown.success { background: #fcfff5; border-color: #a3c293; } .ui.selection.dropdown.success:hover { border-color: #a3c293; } .ui.multiple.selection.success.dropdown > .label { border-color: #a3c293; } .ui.dropdown.success > .menu, .ui.dropdown.success > .menu .menu { border-color: #a3c293; } .ui.dropdown.success > .menu > .item { color: #2c662d; } /* Item Hover */ .ui.dropdown.success > .menu > .item:hover { background-color: #e9fbe9; } /* Item Active */ .ui.dropdown.success > .menu .active.item { background-color: #dafdce; } .ui.dropdown.warning, .ui.dropdown.warning > .text, .ui.dropdown.warning > .default.text { color: #573a08; } .ui.selection.dropdown.warning { background: #fffaf3; border-color: #c9ba9b; } .ui.selection.dropdown.warning:hover { border-color: #c9ba9b; } .ui.multiple.selection.warning.dropdown > .label { border-color: #c9ba9b; } .ui.dropdown.warning > .menu, .ui.dropdown.warning > .menu .menu { border-color: #c9ba9b; } .ui.dropdown.warning > .menu > .item { color: #573a08; } /* Item Hover */ .ui.dropdown.warning > .menu > .item:hover { background-color: #fbfbe9; } /* Item Active */ .ui.dropdown.warning > .menu .active.item { background-color: #fdfdce; } /* -------------------- Clear ---------------------- */ .ui.dropdown > .remove.icon, .ui.dropdown > .clear.dropdown.icon { opacity: 0.5; transition: opacity 0.1s ease; } .ui.dropdown > .remove.icon:hover, .ui.dropdown > .clear.dropdown.icon:hover { opacity: 1; } /* -------------------- Disabled ---------------------- */ /* Disabled */ .ui.disabled.dropdown, .ui.dropdown .menu > .disabled.item { cursor: default; pointer-events: none; opacity: 0.45; } /* -------------------- Read-Only ---------------------- */ .ui.read-only.dropdown { cursor: default; pointer-events: none; } .ui.disabled.dropdown > .remove.icon, .ui.read-only.dropdown > .remove.icon, .ui.disabled.dropdown > .label > .delete.icon, .ui.read-only.dropdown > .label > .delete.icon { display: none; } /******************************* Variations *******************************/ /* -------------- Direction --------------- */ /* Flyout Direction */ .ui.dropdown .menu { left: 0; } /* Default Side (Right) */ .ui.dropdown .right.menu > .menu, .ui.dropdown .menu .right.menu { left: 100% !important; right: auto !important; border-radius: 0.28571429rem !important; } /* Leftward Opening Menu */ .ui.dropdown > .left.menu { left: auto !important; right: 0 !important; } .ui.dropdown > .left.menu .menu, .ui.dropdown .menu .left.menu { left: auto; right: 100%; margin: 0 -0.5em 0 0 !important; border-radius: 0.28571429rem !important; } .ui.dropdown .item .left.dropdown.icon, .ui.dropdown .left.menu .item .dropdown.icon { width: auto; float: left; margin: 0em 0 0 0; } .ui.dropdown .item .left.dropdown.icon, .ui.dropdown .left.menu .item .dropdown.icon { width: auto; float: left; margin: 0em 0 0 0; } .ui.dropdown .item .left.dropdown.icon + .text, .ui.dropdown .left.menu .item .dropdown.icon + .text { margin-left: 1em; margin-right: 0; } /* -------------- Upward --------------- */ /* Upward Main Menu */ .ui.upward.dropdown > .menu { top: auto; bottom: 100%; box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.08); } /* Upward Sub Menu */ .ui.dropdown .upward.menu { top: auto !important; bottom: 0 !important; } /* Active Upward */ .ui.simple.upward.active.dropdown, .ui.simple.upward.dropdown:hover { border-radius: 0 0 0.28571429rem 0.28571429rem; } /* Button */ .ui.upward.dropdown.button:not(.pointing):not(.floating).active { border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui.upward.dropdown.button:not(.pointing):not(.floating) > .menu { border-radius: 0.28571429rem 0.28571429rem 0 0; } /* Selection */ .ui.ui.upward.selection.dropdown:not(.pointing):not(.floating) > .menu { border-top-width: 1px; border-bottom-width: 0; box-shadow: 0 -2px 3px 0 rgba(0, 0, 0, 0.08); border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.upward.selection.dropdown:hover { box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.05); } /* Active Upward */ .ui.active.upward.selection.dropdown:not(.pointing):not(.floating) { border-radius: 0 0 0.28571429rem 0.28571429rem !important; } /* Visible Upward */ .ui.upward.selection.dropdown.visible { box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.08); } .ui.upward.selection.dropdown.visible:not(.pointing):not(.floating) { border-radius: 0 0 0.28571429rem 0.28571429rem !important; } /* Visible Hover Upward */ .ui.upward.active.selection.dropdown:hover { box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.05); } .ui.upward.active.selection.dropdown:hover:not(.pointing):not(.floating) .menu { box-shadow: 0 -2px 3px 0 rgba(0, 0, 0, 0.08); } /* -------------- Scrolling --------------- */ /* Selection Menu */ .ui.scrolling.dropdown .menu, .ui.dropdown .scrolling.menu { overflow-x: hidden; overflow-y: auto; -ms-scroll-chaining: none; overscroll-behavior: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; min-width: 100% !important; width: auto !important; } .ui.dropdown .scrolling.menu { position: static; border: none; box-shadow: none !important; border-radius: 0 0 0.28571429rem 0.28571429rem !important; margin: 0 !important; border-top: 1px solid rgba(34, 36, 38, 0.15); } .ui.ui.ui.scrolling.dropdown .menu .item, .ui.ui.ui.dropdown .scrolling.menu > .item { border-top: none; } .ui.scrolling.dropdown .menu .item:first-child, .ui.dropdown .scrolling.menu .item:first-child { border-top: none; } .ui.dropdown > .animating.menu .scrolling.menu, .ui.dropdown > .visible.menu .scrolling.menu { display: block; } /* Scrollbar in IE */ @media all and (-ms-high-contrast: none) { .ui.scrolling.dropdown .menu, .ui.dropdown .scrolling.menu { min-width: calc(100% - 17px); } } @media only screen and (max-width: 767.98px) { .ui.scrolling.dropdown .menu, .ui.dropdown .scrolling.menu { max-height: 10.28571429rem; } .ui.scrolling.resizable.dropdown .menu, .ui.dropdown .scrolling.resizable.menu { height: 10.28571429rem; } } @media only screen and (min-width: 768px) { .ui.scrolling.dropdown .menu, .ui.dropdown .scrolling.menu { max-height: 15.42857143rem; } .ui.scrolling.resizable.dropdown .menu, .ui.dropdown .scrolling.resizable.menu { height: 15.42857143rem; } } @media only screen and (min-width: 992px) { .ui.scrolling.dropdown .menu, .ui.dropdown .scrolling.menu { max-height: 20.57142857rem; } .ui.scrolling.resizable.dropdown .menu, .ui.dropdown .scrolling.resizable.menu { height: 20.57142857rem; } } @media only screen and (min-width: 1920px) { .ui.scrolling.dropdown .menu, .ui.dropdown .scrolling.menu { max-height: 20.57142857rem; } .ui.scrolling.resizable.dropdown .menu, .ui.dropdown .scrolling.resizable.menu { height: 20.57142857rem; } } .ui.scrolling.resizable.dropdown .menu, .ui.dropdown .scrolling.resizable.menu { resize: vertical; max-height: none; } /* -------------------- Labeled --------------------- */ /* Regular Label on Left */ .ui.labeled.input:not([class*="corner labeled"]) .label:first-child + .dropdown { border-top-left-radius: 0; border-bottom-left-radius: 0; border-left-color: transparent; } /* Regular Label on Right */ .ui[class*="right labeled"].input > .dropdown:not(:last-child) { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; border-right-color: transparent !important; } .ui[class*="right labeled"].input > .dropdown + .label { border-top-left-radius: 0; border-bottom-left-radius: 0; } /* -------------- Columnar --------------- */ .ui.column.dropdown > .menu { flex-wrap: wrap; } .ui.dropdown[class*="two column"] > .menu > .item { width: 50%; } .ui.dropdown[class*="three column"] > .menu > .item { width: 33%; } .ui.dropdown[class*="four column"] > .menu > .item { width: 25%; } .ui.dropdown[class*="five column"] > .menu > .item { width: 20%; } /* -------------- Simple --------------- */ /* Displays without javascript */ .ui.simple.dropdown .menu::before, .ui.simple.dropdown .menu::after { display: none; } .ui.simple.dropdown .menu { position: absolute; /* IE hack to make dropdown icons appear inline */ display: -ms-inline-flexbox !important; display: block; overflow: hidden; top: -9999px; opacity: 0; width: 0; height: 0; transition: opacity 0.1s ease; margin-top: 0 !important; } .ui.simple.dropdown .upward.menu { margin-bottom: 1.5em; } .ui.simple.selection.dropdown .upward.menu { margin-bottom: 2.5em; } .ui.menu:not(.vertical) .ui.simple.dropdown.item .upward.menu { margin-bottom: 2.8em; } .ui.simple.active.dropdown, .ui.simple.dropdown:hover { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .ui.simple.active.dropdown > .menu, .ui.simple.dropdown:hover > .menu { overflow: visible; width: auto; height: auto; top: 100%; opacity: 1; } .ui.simple.dropdown > .menu > .item:active > .menu, .ui.simple.dropdown .menu .item:hover > .menu { overflow: visible; width: auto; height: auto; top: 0 !important; left: 100%; opacity: 1; } .ui.simple.selection.active.dropdown > .menu, .ui.simple.selection.dropdown:hover > .menu, .ui.simple.selection.dropdown > .menu > .item:active > .menu, .ui.simple.selection.dropdown .menu .item:hover > .menu { overflow: auto; -ms-scroll-chaining: none; overscroll-behavior: none; } .ui.simple.dropdown > .menu > .item:active > .left.menu, .ui.simple.dropdown .menu .item:hover > .left.menu, .right.menu .ui.simple.dropdown > .menu > .item:active > .menu:not(.right), .right.menu .ui.simple.dropdown > .menu .item:hover > .menu:not(.right) { left: auto; right: 100%; } .ui.simple.disabled.dropdown:hover .menu { display: none; height: 0; width: 0; overflow: hidden; } /* Visible */ .ui.simple.visible.dropdown > .menu { display: block; } /* Scrolling */ .ui.simple.scrolling.active.dropdown > .menu, .ui.simple.scrolling.dropdown:hover > .menu { overflow-x: hidden; overflow-y: auto; -ms-scroll-chaining: none; overscroll-behavior: none; } /* -------------- Fluid --------------- */ .ui.fluid.dropdown { display: block; width: 100% !important; min-width: 0; } .ui.fluid.dropdown > .dropdown.icon { float: right; } /* -------------- Floating --------------- */ .ui.floating.dropdown > .menu { left: 0; right: auto; box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15) !important; border-radius: 0.28571429rem !important; } .ui:not(.upward).floating.dropdown > .menu { margin-top: 0.5em; } .ui.upward.floating.dropdown:not(.simple) > .menu { margin-bottom: 0.5em; } /* -------------- Pointing --------------- */ .ui.pointing.dropdown > .menu { top: 100%; margin-top: 0.78571429rem; border-radius: 0.28571429rem; } .ui.pointing.dropdown > .menu:not(.hidden)::after { display: block; position: absolute; pointer-events: none; content: ""; visibility: visible; transform: rotate(45deg); width: 0.5em; height: 0.5em; box-shadow: -1px -1px 0 0 rgba(34, 36, 38, 0.15); background: #fff; z-index: 2; } @supports selector(:has(.f)) { .ui.pointing.dropdown:not(.upward) .menu:has(:first-child:hover)::after, .ui.upward.pointing.dropdown .menu:has(:last-child:hover)::after { background: #f2f2f2; } .ui.pointing.dropdown:not(.upward) .menu:has(.selected.item:first-child)::after, .ui.upward.pointing.dropdown .menu:has(.selected.item:last-child)::after { background: #f7f7f7; } } .ui.selection.pointing.dropdown > .menu::after { box-shadow: -1px -1px 0 0 #96c8da; } .ui.pointing.dropdown > .menu:not(.hidden)::after { top: -0.25em; left: 50%; margin: 0 0 0 -0.25em; } /* Top Left Pointing */ .ui.top.left.pointing.dropdown > .menu { top: 100%; bottom: auto; left: 0; right: auto; margin: 1em 0 0; } .ui.top.left.pointing.dropdown > .menu { top: 100%; bottom: auto; left: 0; right: auto; margin: 1em 0 0; } .ui.top.left.pointing.dropdown > .menu::after { top: -0.25em; left: 1em; right: auto; margin: 0; transform: rotate(45deg); } /* Top Right Pointing */ .ui.top.right.pointing.dropdown > .menu { top: 100%; bottom: auto; right: 0; left: auto; margin: 1em 0 0; } .ui.top.pointing.dropdown > .left.menu::after, .ui.top.right.pointing.dropdown > .menu::after { top: -0.25em; left: auto !important; right: 1em !important; margin: 0; transform: rotate(45deg); } /* Left Pointing */ .ui.left.pointing.dropdown > .menu { top: 0; left: 100%; right: auto; margin: 0 0 0 1em; } .ui.left.pointing.dropdown > .menu::after { top: 1em; left: -0.25em; margin: 0; transform: rotate(-45deg); } .ui.left:not(.top):not(.bottom).pointing.dropdown > .left.menu { left: auto !important; right: 100% !important; margin: 0 1em 0 0; } .ui.left:not(.top):not(.bottom).pointing.dropdown > .left.menu::after { top: 1em; left: auto; right: -0.25em; margin: 0; transform: rotate(135deg); } /* Right Pointing */ .ui.right.pointing.dropdown > .menu { top: 0; left: auto; right: 100%; margin: 0 1em 0 0; } .ui.right.pointing.dropdown > .menu::after { top: 1em; left: auto; right: -0.25em; margin: 0; transform: rotate(135deg); } /* Bottom Pointing */ .ui.bottom.pointing.dropdown > .menu { top: auto; bottom: 100%; left: 0; right: auto; margin: 0 0 1em; } .ui.bottom.pointing.dropdown > .menu::after { top: auto; bottom: -0.25em; right: auto; margin: 0; transform: rotate(-135deg); } /* Reverse Sub-Menu Direction */ .ui.bottom.pointing.dropdown > .menu .menu { top: auto !important; bottom: 0 !important; } /* Bottom Left */ .ui.bottom.left.pointing.dropdown > .menu { left: 0; right: auto; } .ui.bottom.left.pointing.dropdown > .menu::after { left: 1em; right: auto; } /* Bottom Right */ .ui.bottom.right.pointing.dropdown > .menu { right: 0; left: auto; } .ui.bottom.right.pointing.dropdown > .menu::after { left: auto; right: 1em; } /* Upward pointing */ .ui.pointing.upward.dropdown .menu, .ui.top.pointing.upward.dropdown .menu { top: auto !important; bottom: 100% !important; margin: 0 0 0.78571429rem; border-radius: 0.28571429rem; } .ui.pointing.upward.dropdown .menu::after, .ui.top.pointing.upward.dropdown .menu::after { top: 100% !important; bottom: auto !important; box-shadow: 1px 1px 0 0 rgba(34, 36, 38, 0.15); margin: -0.25em 0 0; } .ui.selection.pointing.upward.dropdown .menu::after { box-shadow: 1px 1px 0 0 #96c8da; } /* Right Pointing Upward */ .ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu { top: auto !important; bottom: 0 !important; margin: 0 1em 0 0; } .ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu::after { top: auto !important; bottom: 0 !important; margin: 0 0 1em 0; box-shadow: -1px -1px 0 0 rgba(34, 36, 38, 0.15); } /* Left Pointing Upward */ .ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu { top: auto !important; bottom: 0 !important; margin: 0 0 0 1em; } .ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu::after { top: auto !important; bottom: 0 !important; margin: 0 0 1em 0; box-shadow: -1px -1px 0 0 rgba(34, 36, 38, 0.15); } .ui.floating.dropdown .menu .item:first-child, .ui.pointing.dropdown .menu .item:first-child { border-top-left-radius: 0.28571429rem; border-top-right-radius: 0.28571429rem; } .ui.floating.dropdown .menu .item:last-child, .ui.pointing.dropdown .menu .item:last-child { border-bottom-left-radius: 0.28571429rem; border-bottom-right-radius: 0.28571429rem; } /* -------------------- Sizes --------------------- */ .ui.dropdown, .ui.dropdown .menu > .item { font-size: 1rem; } .ui.ui.mini.dropdown, .ui.ui.mini.dropdown .menu > .item { font-size: 0.78571429rem; } .ui.ui.tiny.dropdown, .ui.ui.tiny.dropdown .menu > .item { font-size: 0.85714286rem; } .ui.ui.small.dropdown, .ui.ui.small.dropdown .menu > .item { font-size: 0.92857143rem; } .ui.ui.large.dropdown, .ui.ui.large.dropdown .menu > .item { font-size: 1.14285714rem; } .ui.ui.big.dropdown, .ui.ui.big.dropdown .menu > .item { font-size: 1.28571429rem; } .ui.ui.huge.dropdown, .ui.ui.huge.dropdown .menu > .item { font-size: 1.42857143rem; } .ui.ui.massive.dropdown, .ui.ui.massive.dropdown .menu > .item { font-size: 1.71428571rem; } /* -------------- Inverted --------------- */ /* General rules and basic dropdowns */ .ui.dropdown .inverted.menu, .ui.inverted.dropdown .menu { background: #1b1c1d; box-shadow: none; border: 1px solid rgba(255, 255, 255, 0.15); } .ui.dropdown .inverted.menu > .item, .ui.inverted.dropdown .menu > .item { color: rgba(255, 255, 255, 0.8); } .ui.dropdown .inverted.menu .active.item, .ui.inverted.dropdown .menu .active.item { background: transparent; color: rgba(255, 255, 255, 0.8); box-shadow: none; } .ui.dropdown .inverted.menu > .item:hover, .ui.inverted.dropdown .menu > .item:hover { background: #2d2e2f; color: rgba(255, 255, 255, 0.8); } .ui.inverted.dropdown.selected, .ui.dropdown .inverted.menu .selected.item, .ui.inverted.dropdown .menu .selected.item { background: #3d3e3f; color: rgba(255, 255, 255, 0.8); } .ui.dropdown .inverted.menu > .header, .ui.inverted.dropdown .menu > .header { color: #fff; } .ui.inverted.dropdown > .text > .description, .ui.dropdown .inverted.menu > .item > .description, .ui.inverted.dropdown .menu > .item > .description { color: rgba(255, 255, 255, 0.5); } .ui.dropdown .inverted.menu > .divider, .ui.inverted.dropdown .menu > .divider { border-top: 1px solid rgba(255, 255, 255, 0.15); } .ui.dropdown .inverted.scrolling.menu, .ui.inverted.dropdown .scrolling.menu { border: none; border-top: 1px solid rgba(255, 255, 255, 0.15); } /* Selection */ .ui.inverted.selection.dropdown { border: 1px solid rgba(255, 255, 255, 0.15); background: #1b1c1d; color: rgba(255, 255, 255, 0.8); } .ui.inverted.selection.dropdown:hover { border-color: rgba(255, 255, 255, 0.25); box-shadow: none; } .ui.inverted.selection.dropdown input { color: #fff; } .ui.inverted.selection.visible.dropdown > .text:not(.default) { color: rgba(255, 255, 255, 0.9); } .ui.selection.simple.dropdown:hover .inverted.menu, .ui.inverted.selection.simple.dropdown:hover .menu, .ui.selection.active.dropdown .inverted.menu, .ui.inverted.selection.active.dropdown .menu, .ui.inverted.selection.active.dropdown:hover { border-color: rgba(255, 255, 255, 0.15); } .ui.selection.dropdown .inverted.menu > .item, .ui.inverted.selection.dropdown .menu > .item { border-top: 1px solid #242526; } .ui.inverted.dropdown:not(.button) > .default.text, .ui.inverted.default.dropdown:not(.button) > .text { color: rgba(255, 255, 255, 0.5); } .ui.inverted.dropdown:not(.button) > input:focus ~ .default.text, .ui.inverted.default.dropdown:not(.button) > input:focus ~ .text { color: rgba(255, 255, 255, 0.7); } .ui.inverted.active.search.dropdown input.search:focus + .text i.icon, .ui.inverted.active.search.dropdown input.search:focus + .text .flag { opacity: 0.45; } .ui.inverted.active.search.dropdown input.search:focus + .text { color: rgba(255, 255, 255, 0.7); } .ui.dropdown .inverted.menu > .message:not(.ui), .ui.inverted.dropdown .menu > .message:not(.ui) { color: rgba(255, 255, 255, 0.5); } /* Fixing the border */ .ui.dropdown .inverted.menu > .item:first-child, .ui.inverted.dropdown .menu > .item:first-child { border-top-width: 0; } /* Labels */ .ui.inverted.multiple.dropdown > .label { background-color: rgba(255, 255, 255, 0.7); background-image: none; color: #000000; box-shadow: 0 0 0 1px rgba(255, 255, 255, 0) inset; } .ui.inverted.multiple.dropdown > .label:hover { background-color: rgba(255, 255, 255, 0.9); border-color: rgba(255, 255, 255, 0.9); background-image: none; color: #000000; } .ui.inverted.multiple.dropdown > .label > .close.icon, .ui.inverted.multiple.dropdown > .label > .delete.icon { opacity: 0.6; } .ui.inverted.multiple.dropdown > .label > .close.icon:hover, .ui.inverted.multiple.dropdown > .label > .delete.icon:hover { opacity: 0.8; } /* Selection for form elements */ .ui.inverted.dropdown textarea::selection, .ui.inverted.dropdown input::selection { background-color: rgba(255, 255, 255, 0.25); color: rgba(255, 255, 255, 0.8); } /* Scrollbars */ .ui.dropdown .inverted.menu::-webkit-scrollbar-track, .ui.inverted.dropdown .menu::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.1); } .ui.dropdown .inverted.menu::-webkit-scrollbar-thumb, .ui.inverted.dropdown .menu::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.25); } .ui.dropdown .inverted.menu::-webkit-scrollbar-thumb:window-inactive, .ui.inverted.dropdown .menu::-webkit-scrollbar-thumb:window-inactive { background: rgba(255, 255, 255, 0.15); } .ui.dropdown .inverted.menu::-webkit-scrollbar-thumb:hover, .ui.inverted.dropdown .menu::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.35); } .ui.dropdown .inverted.menu, .ui.inverted.dropdown .menu { /* IE11 */ scrollbar-face-color: #656565; scrollbar-shadow-color: #656565; scrollbar-track-color: #323232; scrollbar-arrow-color: #323232; } @supports (-moz-appearance: none) { .ui.dropdown .inverted.menu, .ui.inverted.dropdown .menu { /* firefox: first color thumb, second track */ scrollbar-color: rgba(255, 255, 255, 0.25) rgba(255, 255, 255, 0.1); } } .ui.pointing.dropdown > .inverted.menu::after, .ui.inverted.pointing.dropdown > .menu::after { background: #1b1c1d; box-shadow: -1px -1px 0 0 rgba(255, 255, 255, 0.15); } .ui.inverted.upward.pointing.dropdown > .menu::after { box-shadow: 1px 1px 0 0 rgba(255, 255, 255, 0.15); } @supports selector(:has(.f)) { .ui.inverted.pointing.dropdown:not(.upward) .menu:has(:first-child:hover)::after, .ui.inverted.upward.pointing.dropdown .menu:has(:last-child:hover)::after { background: #2d2e2f; } .ui.inverted.pointing.dropdown:not(.upward) .menu:has(.selected.item:first-child)::after, .ui.inverted.upward.pointing.dropdown .menu:has(.selected.item:last-child)::after { background: #3d3e3f; } } /******************************* Theme Overrides *******************************/ /* Dropdown Carets */ @font-face { font-family: Dropdown; src: url("data:application/font-woff;base64,d09GRk9UVE8AAASEAAsAAAAABwQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAC5AAAAU8AAAHrSr22AUZGVE0AAARQAAAAHAAAAByNrZ/TR0RFRgAABDQAAAAcAAAAIAAnABhPUy8yAAABYAAAAEIAAABgTadXCGNtYXAAAAKEAAAAVAAAAWQFcOKQaGVhZAAAAQgAAAAyAAAANg+j805oaGVhAAABPAAAABsAAAAkAwcBDWhtdHgAAARsAAAAFgAAAB4EAQASbWF4cAAAAVgAAAAGAAAABgAIUABuYW1lAAABpAAAAN8AAAG2rSbAM3Bvc3QAAALYAAAADAAAACAAAwAAeJxjYGRgYADiKjtG3nh+m68M3EwMIHCBwT0CRN9PyHYCUp6Mqox5QJqDASwNAMNOBrgAAHicY2BkYGB88P8BkFRlYACTjAyogB0AWWsDFgAAAFAAAAgAAHicY2Bm+Mg4gYGVgYHRhzGNgYHBHUp/ZZBkaGFABYwCSJyANNcUBgcGhg+3GB/8fwCUfMCgAFIDV6AAhIwAUbEMSQAAeJx1zTEKwkAUBNBJjIoKIggW2mwvBEVvIAgiNhY2VjEuQUh2YY2FeACPYOltvIH3cZJ8ywQS3p/d+QEwwAce/o8v9tDGUOzTU3GDXokD+ihuooeHuMX8Je5ijC9bXtCRP1T20Kcq+/RE3KAX4oDeipsYIRa3mD/FXSzxLtZeeGyR8bUwHGObWUvsoZHghhQRHEed3NLI1d+vyw/c43DleZErzBFixli768UaNQ9n9d11OedsJdxiyk0RZ40zsxPu/G7K7k66IUvW5CrRRrso12d1uqtNbHfcF+IHrnU+mwB4nGNgYGBmgGAZBkYGEIgD8hjBfBYGJyDNxcDBwASEjAwKH279//v/P1iVwofrYDbj/8dgPkQvGwMPkGRhYAWy2MHCbEDMxIAXMOOXHvIAAINhDt14nGNgZsALAAB9AAR4nE2Pv0rEQBCHZ3J7d4vGqEcOFaKC/zolZ6OWwmElNj6ClYWmyivcblyzE+RaK8EHsPMxBBtrwUdwA1fobpI7ZWBYfux8fD8ExgAR+fVVcpMkt4AeIAzLLSi3sdzxyt1WucqU31I+25iDtcvej1Kzh99V7+a19NoRPC1GAEsRvCxHwCP87MG8I7WgDRwWoAcrEMGmnT3YT+N0kB7G6Vk8PHLr2K0Tt04HB3FjMhUCQIESM7xDhfeYA3dcz5IZdOAcHuAD14MgeAu+zTNTRV5oTUR5obgZdwpVZFqQzEfKTiaE4JNwEralHGUuErnQNjE2oYxUwS0ldBTSxI3L7cOyKo60ib0lezSl1Rw+GXdq1pQiH03SdzKka4ymosLQTMcedSuIlEJUMqNcUi0jdIP5Ysb++leqLtSI/NWSTS0xq0WyYajQXPSVP/cLitO4NgB4nGNgZGBg4AFiAQYJBiYgzQLEIJoRggEFbQBAAAAAAQAAAADeTO04AAAAANAAR1gAAAAA32BrQnicY2BAAEYQVoVghu0MQgwMAAc/ARcAAA==") format("woff"); font-weight: normal; font-style: normal; } .ui.dropdown > .dropdown.icon { font-family: Dropdown; line-height: 1; height: 1em; width: 1.23em; -webkit-backface-visibility: hidden; backface-visibility: hidden; font-weight: normal; font-style: normal; text-align: center; } .ui.dropdown > .dropdown.icon { width: auto; } .ui.dropdown > .dropdown.icon::before { content: "\f0d7"; } /* Sub Menu */ .ui.dropdown .menu .item .dropdown.icon::before { content: "\f0da" /* rtl: "\f0d9" */; } .ui.dropdown .item .left.dropdown.icon::before, .ui.dropdown .left.menu .item .dropdown.icon::before { content: "\f0d9" /*rtl: "\f0da" */; } /* Vertical Menu Dropdown */ .ui.vertical.menu .dropdown.item > .dropdown.icon::before { content: "\f0da" /* rtl: "\f0d9" */; } /* Icons for Reference .dropdown.down.icon { content: "\f0d7"; } .dropdown.up.icon { content: "\f0d8"; } .dropdown.left.icon { content: "\f0d9"; } .dropdown.icon.icon { content: "\f0da"; } */ /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/dropdown.js ================================================ /*! * # Fomantic-UI 2.9.4 - Dropdown * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.dropdown = function (parameters) { var $allModules = $(this), $document = $(document), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $(context); } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : window; } } return $context; }, returnedValue ; $allModules.each(function (elementIndex) { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.dropdown.settings, parameters) : $.extend({}, $.fn.dropdown.settings), className = settings.className, message = settings.message, fields = settings.fields, keys = settings.keys, metadata = settings.metadata, namespace = settings.namespace, regExp = settings.regExp, selector = settings.selector, error = settings.error, templates = settings.templates, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $context = contextCheck(settings.context, window), $text = $module.find(selector.text), $search = $module.find(selector.search), $sizer = $module.find(selector.sizer), $input = $module.find(selector.input), $icon = $module.find(selector.icon), $clear = $module.find(selector.clearIcon), $combo = $module.prev().find(selector.text).length > 0 ? $module.prev().find(selector.text) : $module.prev(), $menu = $module.children(selector.menu), $item = $menu.find(selector.item), $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $(), activated = false, itemActivated = false, internalChange = false, iconClicked = false, element = this, focused = false, instance = $module.data(moduleNamespace), selectActionActive, initialLoad, pageLostFocus, willRefocus, elementNamespace, id, selectObserver, menuObserver, classObserver, module, tempDisableApiCache = false ; module = { initialize: function () { module.debug('Initializing dropdown', settings); if (module.is.alreadySetup()) { module.setup.reference(); } else { if (settings.ignoreDiacritics && !String.prototype.normalize) { settings.ignoreDiacritics = false; module.error(error.noNormalize, element); } module.create.id(); module.setup.layout(); if (settings.values) { module.set.initialLoad(); module.change.values(settings.values); module.remove.initialLoad(); } if (module.get.placeholderText() !== '') { module.set.placeholderText(); } module.refreshData(); module.save.defaults(); module.restore.selected(); module.bind.events(); module.observeChanges(); module.instantiate(); } }, instantiate: function () { module.verbose('Storing instance of dropdown', module); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.verbose('Destroying previous dropdown', $module); module.remove.tabbable(); module.remove.active(); $menu.transition('stop all'); $menu.removeClass(className.visible).addClass(className.hidden); $module .off(eventNamespace) .removeData(moduleNamespace) ; $menu .off(eventNamespace) ; $document .off(elementNamespace) ; module.disconnect.menuObserver(); module.disconnect.selectObserver(); module.disconnect.classObserver(); }, observeChanges: function () { if ('MutationObserver' in window) { selectObserver = new MutationObserver(module.event.select.mutation); menuObserver = new MutationObserver(module.event.menu.mutation); classObserver = new MutationObserver(module.event.class.mutation); module.debug('Setting up mutation observer', selectObserver, menuObserver, classObserver); module.observe.select(); module.observe.menu(); module.observe.class(); } }, disconnect: { menuObserver: function () { if (menuObserver) { menuObserver.disconnect(); } }, selectObserver: function () { if (selectObserver) { selectObserver.disconnect(); } }, classObserver: function () { if (classObserver) { classObserver.disconnect(); } }, }, observe: { select: function () { if (module.has.input() && selectObserver) { selectObserver.observe($module[0], { attributes: true, childList: true, subtree: true, }); } }, menu: function () { if (module.has.menu() && menuObserver) { menuObserver.observe($menu[0], { childList: true, subtree: true, }); } }, class: function () { if (module.has.search() && classObserver) { classObserver.observe($module[0], { attributes: true, }); } }, }, create: { id: function () { id = (Math.random().toString(16) + '000000000').slice(2, 10); elementNamespace = '.' + id; module.verbose('Creating unique id for element', id); }, userChoice: function (values) { var $userChoices, $userChoice, html ; values = values || module.get.userValues(); if (!values) { return false; } values = Array.isArray(values) ? values : [values]; $.each(values, function (index, value) { if (module.get.item(value) === false) { html = settings.templates.addition(module.add.variables(message.addResult, value)); $userChoice = $('<div />') .html(html) .attr('data-' + metadata.value, value) .attr('data-' + metadata.text, value) .addClass(className.addition) .addClass(className.item) ; if (settings.hideAdditions) { $userChoice.addClass(className.hidden); } $userChoices = $userChoices === undefined ? $userChoice : $userChoices.add($userChoice); module.verbose('Creating user choices for value', value, $userChoice); } }); return $userChoices; }, userLabels: function (value) { var userValues = module.get.userValues() ; if (userValues) { module.debug('Adding user labels', userValues); $.each(userValues, function (index, value) { module.verbose('Adding custom user value'); module.add.label(value, value); }); } }, menu: function () { $menu = $('<div />') .addClass(className.menu) .appendTo($module) ; }, sizer: function () { $sizer = $('<span />') .addClass(className.sizer) .insertAfter($search) ; }, }, search: function (query) { query = query !== undefined ? query : module.get.query(); module.verbose('Searching for query', query); if (settings.fireOnInit === false && module.is.initialLoad()) { module.verbose('Skipping callback on initial load', settings.onSearch); } else if (module.has.minCharacters(query) && settings.onSearch.call(element, query) !== false) { module.filter(query); } else { module.hide(null, true); } }, select: { firstUnfiltered: function () { module.verbose('Selecting first non-filtered element'); module.remove.selectedItem(); $item .not(selector.unselectable) .not(selector.addition + selector.hidden) .eq(0) .addClass(className.selected) ; }, nextAvailable: function ($selected) { $selected = $selected.eq(0); var $nextAvailable = $selected.nextAll(selector.item).not(selector.unselectable).eq(0), $prevAvailable = $selected.prevAll(selector.item).not(selector.unselectable).eq(0), hasNext = $nextAvailable.length > 0 ; if (hasNext) { module.verbose('Moving selection to', $nextAvailable); $nextAvailable.addClass(className.selected); } else { module.verbose('Moving selection to', $prevAvailable); $prevAvailable.addClass(className.selected); } }, }, setup: { api: function () { var apiSettings = { debug: settings.debug, urlData: { value: module.get.value(), query: module.get.query(), }, on: false, } ; module.verbose('First request, initializing API'); $module .api(apiSettings) ; }, layout: function () { if ($module.is('select')) { module.setup.select(); module.setup.returnedObject(); } if (!module.has.menu()) { module.create.menu(); } if (module.is.clearable() && !module.has.clearItem()) { module.verbose('Adding clear icon'); $clear = $('<i />') .addClass('remove icon') .insertAfter($icon) ; } if (module.is.search() && !module.has.search()) { module.verbose('Adding search input'); var labelNode = $module.prev('label') ; $search = $('<input />') .addClass(className.search) .prop('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off') ; if (labelNode.length > 0) { if (!labelNode.attr('id')) { labelNode.attr('id', '_' + module.get.id() + '_formLabel'); } $search.attr('aria-labelledby', labelNode.attr('id')); } $search.insertBefore($text); } if (module.is.multiple() && module.is.searchSelection() && !module.has.sizer()) { module.create.sizer(); } if (settings.allowTab) { module.set.tabbable(); } }, select: function () { var selectValues = module.get.selectValues() ; module.debug('Dropdown initialized on a select', selectValues); if ($module.is('select')) { $input = $module; } // see if select is placed correctly already if ($input.parent(selector.dropdown).length > 0) { module.debug('UI dropdown already exists. Creating dropdown menu only'); $module = $input.closest(selector.dropdown); if (!module.has.menu()) { module.create.menu(); } $menu = $module.children(selector.menu); module.setup.menu(selectValues); } else { module.debug('Creating entire dropdown from select'); $module = $('<div />') .attr('class', $input.attr('class')) .addClass(className.selection) .addClass(className.dropdown) .html(templates.dropdown(selectValues, fields, settings.preserveHTML, settings.className)) .insertBefore($input) ; if ($input.hasClass(className.multiple) && $input.prop('multiple') === false) { module.error(error.missingMultiple); $input.prop('multiple', true); } if ($input.is('[multiple]')) { module.set.multiple(); } if ($input.prop('disabled')) { module.debug('Disabling dropdown'); $module.addClass(className.disabled); } if ($input.is('[required]')) { settings.forceSelection = true; } if (!settings.allowTab) { $input.removeAttr('tabindex'); } $input .prop('required', false) .removeAttr('class') .detach() .prependTo($module) ; } module.refresh(); }, menu: function (values) { $menu.html(templates.menu(values, fields, settings.preserveHTML, settings.className)); $item = $menu.find(selector.item); $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $(); }, reference: function () { module.debug('Dropdown behavior was called on select, replacing with closest dropdown'); // replace module reference $module = $module.parent(selector.dropdown); instance = $module.data(moduleNamespace); element = $module[0]; module.refresh(); module.setup.returnedObject(); }, returnedObject: function () { var $firstModules = $allModules.slice(0, elementIndex), $lastModules = $allModules.slice(elementIndex + 1) ; // adjust all modules to use correct reference $allModules = $firstModules.add($module).add($lastModules); }, }, refresh: function () { module.refreshSelectors(); module.refreshData(); }, refreshItems: function () { $item = $menu.find(selector.item); $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $(); }, refreshSelectors: function () { module.verbose('Refreshing selector cache'); $text = $module.find(selector.text); $search = $module.find(selector.search); $input = $module.find(selector.input); $icon = $module.find(selector.icon); $combo = $module.prev().find(selector.text).length > 0 ? $module.prev().find(selector.text) : $module.prev(); $menu = $module.children(selector.menu); $item = $menu.find(selector.item); $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $(); }, refreshData: function () { module.verbose('Refreshing cached metadata'); $item .removeData(metadata.text) .removeData(metadata.value) ; }, clearData: function () { module.verbose('Clearing metadata'); $item .removeData(metadata.text) .removeData(metadata.value) ; $module .removeData(metadata.defaultText) .removeData(metadata.defaultValue) .removeData(metadata.placeholderText) ; }, clearItems: function () { $menu.empty(); module.refreshItems(); }, toggle: function () { module.verbose('Toggling menu visibility'); if (!module.is.active()) { module.show(); } else { module.hide(); } }, show: function (callback, preventFocus) { callback = isFunction(callback) ? callback : function () {}; if ((focused || iconClicked) && module.is.remote() && module.is.noApiCache() && !module.has.maxSelections()) { module.clearItems(); } if (!module.can.show() && module.is.remote()) { module.debug('No API results retrieved, searching before show'); module.queryRemote(module.get.query(), module.show, [callback, preventFocus]); } if (module.can.show() && !module.is.active()) { module.debug('Showing dropdown'); if (module.has.message() && !(module.has.maxSelections() || module.has.allResultsFiltered())) { module.remove.message(); } if (module.is.allFiltered()) { return true; } if (settings.onShow.call(element) !== false) { module.remove.empty(); module.animate.show(function () { module.bind.intent(); if (module.has.search() && !preventFocus) { module.focusSearch(); } module.set.visible(); callback.call(element); }); } } }, hide: function (callback, preventBlur) { callback = isFunction(callback) ? callback : function () {}; if (module.is.active() && !module.is.animatingOutward()) { module.debug('Hiding dropdown'); if (settings.onHide.call(element) !== false) { module.animate.hide(function () { module.remove.visible(); // hiding search focus if (module.is.focusedOnSearch() && preventBlur !== true) { $search.trigger('blur'); } callback.call(element); }); // Hide submenus explicitly. On some browsers (esp. mobile), they will not automatically receive a // mouseleave event var $subMenu = $module.find(selector.menu); if ($subMenu.length > 0) { module.verbose('Hiding sub-menu', $subMenu); $subMenu.each(function () { var $sub = $(this); if (!module.is.animating($sub)) { module.animate.hide(false, $sub); } }); } } } else { module.unbind.intent(); } iconClicked = false; focused = false; }, hideOthers: function () { module.verbose('Finding other dropdowns to hide'); $allModules .not($module) .has(selector.menu + '.' + className.visible) .dropdown('hide') ; }, hideMenu: function () { module.verbose('Hiding menu instantaneously'); module.remove.active(); module.remove.visible(); $menu.transition('destroy').transition('hide'); }, hideSubMenus: function () { var $subMenus = $menu.children(selector.item).find(selector.menu) ; module.verbose('Hiding sub menus', $subMenus); $subMenus.transition('hide'); }, bind: { events: function () { module.bind.keyboardEvents(); module.bind.inputEvents(); module.bind.mouseEvents(); }, keyboardEvents: function () { module.verbose('Binding keyboard events'); $module .on('keydown' + eventNamespace, module.event.keydown) ; if (module.has.search()) { $module .on(module.get.inputEvent() + eventNamespace, selector.search, module.event.input) ; } if (module.is.multiple()) { $document .on('keydown' + elementNamespace, module.event.document.keydown) ; } }, inputEvents: function () { module.verbose('Binding input change events'); $module .on('change' + eventNamespace, selector.input, module.event.change) ; if (module.is.multiple() && module.is.searchSelection()) { $module .on('paste' + eventNamespace, selector.search, module.event.paste) ; } }, mouseEvents: function () { module.verbose('Binding mouse events'); if (module.is.multiple()) { $module .on('click' + eventNamespace, selector.label, module.event.label.click) .on('click' + eventNamespace, selector.remove, module.event.remove.click) ; } if (module.is.searchSelection()) { $module .on('mousedown' + eventNamespace, module.event.mousedown) .on('mouseup' + eventNamespace, module.event.mouseup) .on('mousedown' + eventNamespace, selector.menu, module.event.menu.mousedown) .on('mouseup' + eventNamespace, selector.menu, module.event.menu.mouseup) .on('click' + eventNamespace, selector.icon, module.event.icon.click) .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click) .on('focus' + eventNamespace, selector.search, module.event.search.focus) .on('click' + eventNamespace, selector.search, module.event.search.focus) .on('blur' + eventNamespace, selector.search, module.event.search.blur) .on('click' + eventNamespace, selector.text, module.event.text.focus) ; if (module.is.multiple()) { $module .on('click' + eventNamespace, module.event.click) .on('click' + eventNamespace, module.event.search.focus) ; } } else { if (settings.on === 'click') { $module .on('click' + eventNamespace, selector.icon, module.event.icon.click) .on('click' + eventNamespace, module.event.test.toggle) ; } else if (settings.on === 'hover') { $module .on('mouseenter' + eventNamespace, module.delay.show) .on('mouseleave' + eventNamespace, module.delay.hide) .on('touchstart' + eventNamespace, module.event.test.toggle) .on('touchstart' + eventNamespace, selector.icon, module.event.icon.click) ; } else { $module .on(settings.on + eventNamespace, module.toggle) ; } $module .on('mousedown' + eventNamespace, module.event.mousedown) .on('mouseup' + eventNamespace, module.event.mouseup) .on('focus' + eventNamespace, module.event.focus) .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click) ; if (module.has.menuSearch()) { $module .on('blur' + eventNamespace, selector.search, module.event.search.blur) ; } else { $module .on('blur' + eventNamespace, module.event.blur) ; } } $menu .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter) .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter) .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave) .on('click' + eventNamespace, selector.item, module.event.item.click) ; }, intent: function () { module.verbose('Binding hide intent event to document'); $document .on('click' + elementNamespace, module.event.test.hide) ; }, }, unbind: { intent: function () { module.verbose('Removing hide intent event from document'); $document .off('click' + elementNamespace) ; }, }, filter: function (query) { var searchTerm = query !== undefined ? query : module.get.query(), afterFiltered = function () { if (module.is.multiple()) { module.filterActive(); } if (query || (!query && module.get.activeItem().length === 0)) { module.select.firstUnfiltered(); } if (module.has.allResultsFiltered()) { if (settings.onNoResults.call(element, searchTerm)) { if (settings.allowAdditions) { if (settings.hideAdditions) { module.verbose('User addition with no menu, setting empty style'); module.set.empty(); module.hideMenu(); } } else { module.verbose('All items filtered, showing message', searchTerm); module.add.message(message.noResults); } } else { module.verbose('All items filtered, hiding dropdown', searchTerm); module.set.empty(); module.hideMenu(); } } else { module.remove.empty(); module.remove.message(); } if (settings.allowAdditions) { module.add.userSuggestion(module.escape.htmlEntities(query)); } if (module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() && !module.is.empty()) { module.show(); } } ; if (settings.useLabels && module.has.maxSelections()) { module.show(); return; } if (settings.apiSettings) { if (module.can.useAPI()) { module.queryRemote(searchTerm, function () { if (settings.filterRemoteData) { module.filterItems(searchTerm); } var preSelected = $input.val(); if (!Array.isArray(preSelected)) { preSelected = preSelected && preSelected !== '' ? preSelected.split(settings.delimiter) : []; } if (module.is.multiple()) { $.each(preSelected, function (index, value) { $item.filter('[data-' + metadata.value + '="' + value + '"]') .addClass(className.filtered) ; }); } module.focusSearch(true); afterFiltered(); }); } else { module.error(error.noAPI); } } else { module.filterItems(searchTerm); afterFiltered(); } }, queryRemote: function (query, callback, callbackParameters) { if (!Array.isArray(callbackParameters)) { callbackParameters = [callbackParameters]; } var apiSettings = { errorDuration: false, cache: 'local', throttle: settings.throttle, urlData: { query: query, }, }, apiCallbacks = { onError: function (errorMessage, $module, xhr) { module.add.message(message.serverError); iconClicked = false; focused = false; callback.apply(null, callbackParameters); if (typeof settings.apiSettings.onError === 'function') { settings.apiSettings.onError.call(this, errorMessage, $module, xhr); } }, onFailure: function (response, $module, xhr) { module.add.message(message.serverError); iconClicked = false; focused = false; callback.apply(null, callbackParameters); if (typeof settings.apiSettings.onFailure === 'function') { settings.apiSettings.onFailure.call(this, response, $module, xhr); } }, onSuccess: function (response, $module, xhr) { var values = response[fields.remoteValues] ; if (!Array.isArray(values)) { values = []; } module.remove.message(); var menuConfig = {}; menuConfig[fields.values] = values; module.setup.menu(menuConfig); if (values.length === 0 && !settings.allowAdditions) { module.add.message(message.noResults); } else { var value = module.is.multiple() ? module.get.values() : module.get.value(); if (value !== '') { module.verbose('Value(s) present after click icon, select value(s) in items'); module.set.selected(value, null, true, true); } } iconClicked = false; focused = false; callback.apply(null, callbackParameters); if (typeof settings.apiSettings.onSuccess === 'function') { settings.apiSettings.onSuccess.call(this, response, $module, xhr); } }, } ; if (!$module.api('get request')) { module.setup.api(); } apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings, apiCallbacks, tempDisableApiCache ? { cache: false } : {}); $module .api('setting', apiSettings) .api('query') ; tempDisableApiCache = false; }, filterItems: function (query) { var searchTerm = module.remove.diacritics( query !== undefined ? query : module.get.query() ), results = null, escapedTerm = module.escape.string(searchTerm), regExpIgnore = settings.ignoreSearchCase ? 'i' : '', regExpFlags = regExpIgnore + 'gm', beginsWithRegExp = new RegExp('^' + escapedTerm, regExpFlags) ; module.remove.filteredItem(); // avoid loop if we're matching nothing if (module.has.query()) { results = []; module.verbose('Searching for matching values', searchTerm); $item .each(function () { var $choice = $(this), text, value ; if ($choice.hasClass(className.unfilterable)) { results.push(this); return true; } if (settings.match === 'both' || settings.match === 'text') { text = module.remove.diacritics(String(module.get.choiceText($choice, false))); if (text.search(beginsWithRegExp) !== -1 || (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) || (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) ) { results.push(this); return true; } } if (settings.match === 'both' || settings.match === 'value') { value = module.remove.diacritics(String(module.get.choiceValue($choice, text))); if (value.search(beginsWithRegExp) !== -1 || (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value)) || (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value)) ) { results.push(this); return true; } } }) ; } module.debug('Showing only matched items', searchTerm); if (results) { $item .not(results) .addClass(className.filtered) ; if (settings.highlightMatches && (settings.match === 'both' || settings.match === 'text')) { var querySplit = query.split(''), diacriticReg = settings.ignoreDiacritics ? '[\u0300-\u036F]?' : '', htmlReg = '(?![^<]*>)', markedRegExp = new RegExp(htmlReg + '(' + querySplit.join(diacriticReg + ')(.*?)' + htmlReg + '(') + diacriticReg + ')', regExpIgnore), markedReplacer = function () { var args = [].slice.call(arguments, 1, querySplit.length * 2).map(function (x, i) { return i & 1 ? x : '<mark>' + x + '</mark>'; // eslint-disable-line no-bitwise }); return args.join(''); } ; $.each(results, function (index, result) { var $result = $(result), markedHTML = module.get.choiceText($result, true) ; if (settings.ignoreDiacritics) { markedHTML = markedHTML.normalize('NFD'); } $result.html(markedHTML.replace(markedRegExp, markedReplacer)); }); } } if (!module.has.query()) { $divider .removeClass(className.hidden) ; } else if (settings.hideDividers === true) { $divider .addClass(className.hidden) ; } else if (settings.hideDividers === 'empty') { $divider .removeClass(className.hidden) .filter(function () { // First find the last divider in this divider group // Dividers which are direct siblings are considered a group var $lastDivider = $(this).nextUntil(selector.item); return ($lastDivider.length > 0 ? $lastDivider : $(this)) // Count all non-filtered items until the next divider (or end of the dropdown) .nextUntil(selector.divider) .filter(selector.item + ':not(.' + className.filtered + ')') // Hide divider if no items are found .length === 0; }) .addClass(className.hidden) ; } }, fuzzySearch: function (query, term) { var termLength = term.length, queryLength = query.length ; if (settings.ignoreSearchCase) { query = query.toLowerCase(); term = term.toLowerCase(); } if (queryLength > termLength) { return false; } if (queryLength === termLength) { return query === term; } for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) { var continueSearch = false, queryCharacter = query.charCodeAt(characterIndex) ; while (nextCharacterIndex < termLength) { if (term.charCodeAt(nextCharacterIndex++) === queryCharacter) { continueSearch = true; break; } } if (!continueSearch) { return false; } } return true; }, exactSearch: function (query, term) { query = settings.ignoreSearchCase ? query.toLowerCase() : query; term = settings.ignoreSearchCase ? term.toLowerCase() : term; return term.indexOf(query) > -1; }, filterActive: function () { if (settings.useLabels) { $item.filter('.' + className.active) .addClass(className.filtered) ; } }, focusSearch: function (skipHandler) { if (module.has.search() && !module.is.focusedOnSearch()) { if (skipHandler) { $module.off('focus' + eventNamespace, selector.search); $search.trigger('focus'); $module.on('focus' + eventNamespace, selector.search, module.event.search.focus); } else { $search.trigger('focus'); } } }, blurSearch: function () { if (module.has.search()) { $search.trigger('blur'); } }, forceSelection: function () { var $currentlySelected = $item.not(className.filtered).filter('.' + className.selected).eq(0), $activeItem = $item.not(className.filtered).filter('.' + className.active).eq(0), $selectedItem = $currentlySelected.length > 0 ? $currentlySelected : $activeItem, hasSelected = $selectedItem.length > 0 ; if (settings.allowAdditions || (hasSelected && !module.is.multiple())) { module.debug('Forcing partial selection to selected item', $selectedItem); module.event.item.click.call($selectedItem, {}, true); } else { module.remove.searchTerm(); } }, change: { values: function (values) { if (!settings.allowAdditions) { module.clear(); } module.debug('Creating dropdown with specified values', values); var menuConfig = {}; menuConfig[fields.values] = values; module.setup.menu(menuConfig); $.each(values, function (index, item) { if (item.selected === true) { module.debug('Setting initial selection to', item[fields.value]); module.set.selected(item[fields.value]); if (!module.is.multiple()) { return false; } } }); if (module.has.selectInput()) { module.disconnect.selectObserver(); $input.html(''); $input.append('<option disabled selected value></option>'); $.each(values, function (index, item) { var value = settings.templates.deQuote(item[fields.value]), name = settings.templates.escape( item[fields.name] || '', settings.preserveHTML ) ; $input.append('<option value="' + value + '"' + (item.selected === true ? ' selected' : '') + '>' + name + '</option>'); }); module.observe.select(); } }, }, event: { paste: function (event) { var pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'), tokens = pasteValue.split(settings.delimiter), notFoundTokens = [] ; tokens.forEach(function (value) { if (module.set.selected(module.escape.htmlEntities(value.trim()), null, false, true) === false) { notFoundTokens.push(value.trim()); } }); event.preventDefault(); if (notFoundTokens.length > 0) { var searchEl = $search[0], startPos = searchEl.selectionStart, endPos = searchEl.selectionEnd, orgText = searchEl.value, pasteText = notFoundTokens.join(settings.delimiter), newEndPos = startPos + pasteText.length ; $search.val(orgText.slice(0, startPos) + pasteText + orgText.slice(endPos)); searchEl.selectionStart = newEndPos; searchEl.selectionEnd = newEndPos; module.event.input(event); } }, change: function () { if (!internalChange) { module.debug('Input changed, updating selection'); module.set.selected(); } }, focus: function () { if (settings.showOnFocus && !activated && module.is.hidden() && !pageLostFocus) { focused = true; module.show(); } }, blur: function (event) { pageLostFocus = document.activeElement === this; if (!activated && !pageLostFocus) { module.remove.activeLabel(); module.hide(); } }, mousedown: function () { if (module.is.searchSelection(true)) { // prevent menu hiding on immediate re-focus willRefocus = true; } else { // prevents focus callback from occurring on mousedown activated = true; } }, mouseup: function () { if (module.is.searchSelection(true)) { // prevent menu hiding on immediate re-focus willRefocus = false; } else { activated = false; } }, click: function (event) { var $target = $(event.target) ; // focus search if ($target.is($module)) { if (!module.is.focusedOnSearch()) { module.focusSearch(); } else { module.show(); } } }, search: { focus: function (event) { activated = true; if (module.is.multiple()) { module.remove.activeLabel(); } if (!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin')) && event.type !== 'touchstart') { focused = true; module.search(); } }, blur: function (event) { pageLostFocus = document.activeElement === this; if (module.is.searchSelection(true) && !willRefocus) { if (!itemActivated && !pageLostFocus) { if (settings.forceSelection) { module.forceSelection(); } else if (!settings.allowAdditions && !settings.keepSearchTerm && !module.has.menuSearch()) { module.remove.searchTerm(); } module.hide(); } } willRefocus = false; }, }, clearIcon: { click: function (event) { module.clear(); if (module.is.searchSelection()) { module.remove.searchTerm(); } if (settings.collapseOnClearable) { module.hide(); } event.stopPropagation(); }, }, icon: { click: function (event) { iconClicked = true; if (module.has.search()) { if (!module.is.active()) { if (settings.showOnFocus) { module.focusSearch(); } else { module.toggle(); } } else { module.blurSearch(); } } else { module.toggle(); } event.stopPropagation(); }, }, text: { focus: function (event) { activated = true; module.focusSearch(); }, }, input: function (event) { if (module.is.multiple() || module.is.searchSelection()) { module.set.filtered(); } clearTimeout(module.timer); module.timer = setTimeout(function () { module.search(); }, settings.delay.search); }, label: { click: function (event) { var $label = $(this), $labels = $module.find(selector.label), $activeLabels = $labels.filter('.' + className.active), $nextActive = $label.nextAll('.' + className.active), $prevActive = $label.prevAll('.' + className.active), $range = $nextActive.length > 0 ? $label.nextUntil($nextActive).add($activeLabels).add($label) : $label.prevUntil($prevActive).add($activeLabels).add($label) ; if (event.shiftKey) { $activeLabels.removeClass(className.active); $range.addClass(className.active); } else if (event.ctrlKey) { $label.toggleClass(className.active); } else { $activeLabels.removeClass(className.active); $label.addClass(className.active); } settings.onLabelSelect.apply(this, $labels.filter('.' + className.active)); event.stopPropagation(); }, }, remove: { click: function (event) { var $label = $(this).parent() ; if ($label.hasClass(className.active)) { // remove all selected labels module.remove.activeLabels(); } else { // remove this label only module.remove.activeLabels($label); } event.stopPropagation(); }, }, test: { toggle: function (event) { var toggleBehavior = module.is.multiple() ? module.show : module.toggle ; if (module.is.bubbledLabelClick(event) || module.is.bubbledIconClick(event)) { return; } if (!module.is.multiple() || (module.is.multiple() && !module.is.active())) { focused = true; } if (module.determine.eventOnElement(event, toggleBehavior) && event.type !== 'touchstart') { // do not preventDefault of touchstart; so emulated mouseenter is triggered on first touch and not later // (when selecting an item). The double-showing of the dropdown through both events does not hurt. event.preventDefault(); } }, hide: function (event) { if (module.determine.eventInModule(event, module.hide)) { if (element.id && $(event.target).attr('for') === element.id) { event.preventDefault(); } } }, }, class: { mutation: function (mutations) { mutations.forEach(function (mutation) { if (mutation.attributeName === 'class') { module.check.disabled(); } }); }, }, select: { mutation: function (mutations) { if (module.is.selectMutation(mutations)) { module.debug('<select> modified, recreating menu'); module.disconnect.selectObserver(); module.refresh(); module.setup.select(); module.set.selected(); module.observe.select(); } }, }, menu: { mutation: function (mutations) { var mutation = mutations[0], $addedNode = mutation.addedNodes ? $(mutation.addedNodes[0]) : $(false), $removedNode = mutation.removedNodes ? $(mutation.removedNodes[0]) : $(false), $changedNodes = $addedNode.add($removedNode), isUserAddition = $changedNodes.is(selector.addition) || $changedNodes.closest(selector.addition).length > 0, isMessage = $changedNodes.is(selector.message) || $changedNodes.closest(selector.message).length > 0 ; if (isUserAddition || isMessage) { module.debug('Updating item selector cache'); module.refreshItems(); } else { module.debug('Menu modified, updating selector cache'); module.refresh(); } }, mousedown: function () { itemActivated = true; }, mouseup: function () { itemActivated = false; }, }, item: { mouseenter: function (event) { var $target = $(event.target), $item = $(this), $subMenu = $item.children(selector.menu), $otherMenus = $item.siblings(selector.item).children(selector.menu), hasSubMenu = $subMenu.length > 0, isBubbledEvent = $subMenu.find($target).length > 0 ; if (!isBubbledEvent && hasSubMenu) { clearTimeout(module.itemTimer); module.itemTimer = setTimeout(function () { module.verbose('Showing sub-menu', $subMenu); $.each($otherMenus, function () { module.animate.hide(false, $(this)); }); module.animate.show(false, $subMenu); }, settings.delay.show); event.preventDefault(); } }, mouseleave: function (event) { var $subMenu = $(this).find(selector.menu) ; if ($subMenu.length > 0) { clearTimeout(module.itemTimer); module.itemTimer = setTimeout(function () { module.verbose('Hiding sub-menu', $subMenu); $subMenu.each(function () { module.animate.hide(false, $(this)); }); }, settings.delay.hide); } }, click: function (event, skipRefocus) { var $choice = $(this), $target = event ? $(event.target || '') : $(''), $subMenu = $choice.find(selector.menu), text = module.get.choiceText($choice), value = module.get.choiceValue($choice, text), hasSubMenu = $subMenu.length > 0, isBubbledEvent = $subMenu.find($target).length > 0 ; // prevents IE11 bug where menu receives focus even though `tabindex=-1` if (document.activeElement.tagName.toLowerCase() !== 'input') { $(document.activeElement).trigger('blur'); } if (!isBubbledEvent && (!hasSubMenu || settings.allowCategorySelection)) { if (module.is.searchSelection()) { if (settings.allowAdditions) { module.remove.userAddition(); } if (!settings.keepSearchTerm) { if (module.is.multiple()) { module.remove.filteredItem(); } module.remove.searchTerm(); } if (!module.is.visible() && $target.length > 0) { module.show(); } if (!module.is.focusedOnSearch() && skipRefocus !== true) { module.focusSearch(true); } } if (!settings.useLabels) { module.remove.filteredItem(); module.set.scrollPosition($choice); } module.determine.selectAction.call(this, text, value); } }, }, document: { // label selection should occur even when element has no focus keydown: function (event) { var pressedKey = event.which, isShortcutKey = module.is.inObject(pressedKey, keys) ; if (isShortcutKey) { var $label = $module.find(selector.label), $activeLabel = $label.filter('.' + className.active), activeValue = $activeLabel.data(metadata.value), labelIndex = $label.index($activeLabel), labelCount = $label.length, hasActiveLabel = $activeLabel.length > 0, hasMultipleActive = $activeLabel.length > 1, isFirstLabel = labelIndex === 0, isLastLabel = labelIndex + 1 === labelCount, isSearch = module.is.searchSelection(), isFocusedOnSearch = module.is.focusedOnSearch(), isFocused = module.is.focused(), caretAtStart = isFocusedOnSearch && module.get.caretPosition(false) === 0, isSelectedSearch = caretAtStart && module.get.caretPosition(true) !== 0 ; if (isSearch && !hasActiveLabel && !isFocusedOnSearch) { return; } switch (pressedKey) { case keys.leftArrow: { // activate previous label if ((isFocused || caretAtStart) && !hasActiveLabel) { module.verbose('Selecting previous label'); $label.last().addClass(className.active); } else if (hasActiveLabel) { if (!event.shiftKey) { module.verbose('Selecting previous label'); $label.removeClass(className.active); } else { module.verbose('Adding previous label to selection'); } if (isFirstLabel && !hasMultipleActive) { $activeLabel.addClass(className.active); } else { $activeLabel.prev(selector.siblingLabel) .addClass(className.active) .end() ; } event.preventDefault(); } break; } case keys.rightArrow: { // activate first label if (isFocused && !hasActiveLabel) { $label.first().addClass(className.active); } // activate next label if (hasActiveLabel) { if (!event.shiftKey) { module.verbose('Selecting next label'); $label.removeClass(className.active); } else { module.verbose('Adding next label to selection'); } if (isLastLabel) { if (isSearch) { if (!isFocusedOnSearch) { module.focusSearch(); } else { $label.removeClass(className.active); } } else if (hasMultipleActive) { $activeLabel.next(selector.siblingLabel).addClass(className.active); } else { $activeLabel.addClass(className.active); } } else { $activeLabel.next(selector.siblingLabel).addClass(className.active); } event.preventDefault(); } break; } case keys.deleteKey: case keys.backspace: { if (hasActiveLabel) { module.verbose('Removing active labels'); if (isLastLabel) { if (isSearch && !isFocusedOnSearch) { module.focusSearch(); } } $activeLabel.last().next(selector.siblingLabel).addClass(className.active); module.remove.activeLabels($activeLabel); if (!module.is.visible()) { module.show(); } event.preventDefault(); } else if (caretAtStart && !isSelectedSearch && !hasActiveLabel && pressedKey === keys.backspace) { module.verbose('Removing last label on input backspace'); $activeLabel = $label.last().addClass(className.active); module.remove.activeLabels($activeLabel); if (!module.is.visible()) { module.show(); } } break; } default: { $activeLabel.removeClass(className.active); } } } }, }, keydown: function (event) { var pressedKey = event.which, isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter ; if (isShortcutKey) { var $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0), $activeItem = $menu.children('.' + className.active).eq(0), $selectedItem = $currentlySelected.length > 0 ? $currentlySelected : $activeItem, $visibleItems = $selectedItem.length > 0 ? $selectedItem.siblings(':not(.' + className.filtered + ')').addBack() : $menu.children(':not(.' + className.filtered + ')'), $subMenu = $selectedItem.children(selector.menu), $parentMenu = $selectedItem.closest(selector.menu), inVisibleMenu = $parentMenu.hasClass(className.visible) || $parentMenu.hasClass(className.animating) || $parentMenu.parent(selector.menu).length > 0, hasSubMenu = $subMenu.length > 0, hasSelectedItem = $selectedItem.length > 0, selectedIsSelectable = $selectedItem.not(selector.unselectable).length > 0, delimiterPressed = event.key === settings.delimiter && module.is.multiple(), isAdditionWithoutMenu = settings.allowAdditions && (pressedKey === keys.enter || delimiterPressed), $nextItem, isSubMenuItem ; // allow selection with menu closed if (isAdditionWithoutMenu) { if (selectedIsSelectable && settings.hideAdditions) { module.verbose('Selecting item from keyboard shortcut', $selectedItem); module.event.item.click.call($selectedItem, event); } if (module.is.searchSelection() && !settings.keepSearchTerm) { module.remove.searchTerm(); } if (module.is.multiple()) { event.preventDefault(); } } // visible menu keyboard shortcuts if (module.is.visible()) { // enter (select or open sub-menu) if (pressedKey === keys.enter || delimiterPressed) { if (pressedKey === keys.enter && hasSelectedItem && hasSubMenu && !settings.allowCategorySelection) { module.verbose('Pressed enter on unselectable category, opening sub menu'); pressedKey = keys.rightArrow; } else if (selectedIsSelectable) { module.verbose('Selecting item from keyboard shortcut', $selectedItem); module.event.item.click.call($selectedItem, event); if (module.is.searchSelection()) { if (!settings.keepSearchTerm) { module.remove.searchTerm(); } if (module.is.multiple()) { $search.trigger('focus'); } } } event.preventDefault(); } // sub-menu actions if (hasSelectedItem) { if (pressedKey === keys.leftArrow) { isSubMenuItem = $parentMenu[0] !== $menu[0]; if (isSubMenuItem) { module.verbose('Left key pressed, closing sub-menu'); module.animate.hide(false, $parentMenu); $selectedItem .removeClass(className.selected) ; $parentMenu .closest(selector.item) .addClass(className.selected) ; event.preventDefault(); } } // right arrow (show sub-menu) if (pressedKey === keys.rightArrow) { if (hasSubMenu) { module.verbose('Right key pressed, opening sub-menu'); module.animate.show(false, $subMenu); $selectedItem .removeClass(className.selected) ; $subMenu .find(selector.item).eq(0) .addClass(className.selected) ; event.preventDefault(); } } } // up arrow (traverse menu up) if (pressedKey === keys.upArrow) { $nextItem = hasSelectedItem && inVisibleMenu ? $selectedItem.prevAll(selector.item + ':not(' + selector.unselectable + ')').eq(0) : $item.eq(0); if ($visibleItems.index($nextItem) < 0) { module.verbose('Up key pressed but reached top of current menu'); event.preventDefault(); return; } module.verbose('Up key pressed, changing active item'); $selectedItem .removeClass(className.selected) ; $nextItem .addClass(className.selected) ; module.set.scrollPosition($nextItem); if (settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) { module.set.selectedItem($nextItem); } event.preventDefault(); } // down arrow (traverse menu down) if (pressedKey === keys.downArrow) { $nextItem = hasSelectedItem && inVisibleMenu ? $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0) : $item.eq(0); if ($nextItem.length === 0) { module.verbose('Down key pressed but reached bottom of current menu'); event.preventDefault(); return; } module.verbose('Down key pressed, changing active item'); $item .removeClass(className.selected) ; $nextItem .addClass(className.selected) ; module.set.scrollPosition($nextItem); if (settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) { module.set.selectedItem($nextItem); } event.preventDefault(); } // page down (show next page) if (pressedKey === keys.pageUp) { module.scrollPage('up'); event.preventDefault(); } if (pressedKey === keys.pageDown) { module.scrollPage('down'); event.preventDefault(); } // escape (close menu) if (pressedKey === keys.escape) { module.verbose('Escape key pressed, closing dropdown'); module.hide(); event.stopPropagation(); } } else { // delimiter key if (pressedKey === keys.enter || delimiterPressed) { event.preventDefault(); } // down arrow (open menu) if (pressedKey === keys.downArrow && !module.is.visible()) { module.verbose('Down key pressed, showing dropdown'); module.show(); event.preventDefault(); } } } else { if (!module.has.search()) { module.set.selectedLetter(String.fromCharCode(pressedKey)); } } }, }, trigger: { change: function () { var inputElement = $input[0] ; if (inputElement) { var events = document.createEvent('HTMLEvents'); module.verbose('Triggering native change event'); events.initEvent('change', true, false); inputElement.dispatchEvent(events); } }, }, determine: { selectAction: function (text, value) { selectActionActive = true; module.verbose('Determining action', settings.action); if (isFunction(module.action[settings.action])) { module.verbose('Triggering preset action', settings.action, text, value); module.action[settings.action].call(element, text, value, this); } else if (isFunction(settings.action)) { module.verbose('Triggering user action', settings.action, text, value); settings.action.call(element, text, value, this); } else { module.error(error.action, settings.action); } selectActionActive = false; }, eventInModule: function (event, callback) { var $target = $(event.target), inDocument = $target.closest(document.documentElement).length > 0, inModule = $target.closest($module).length > 0 ; callback = isFunction(callback) ? callback : function () {}; if (inDocument && !inModule) { module.verbose('Triggering event', callback); callback(); return true; } module.verbose('Event occurred in dropdown, canceling callback'); return false; }, eventOnElement: function (event, callback) { var $target = $(event.target), $label = $target.closest(selector.siblingLabel), inVisibleDOM = document.body.contains(event.target), notOnLabel = $module.find($label).length === 0 || !(module.is.multiple() && settings.useLabels), notInMenu = $target.closest($menu).length === 0 ; callback = isFunction(callback) ? callback : function () {}; if (inVisibleDOM && notOnLabel && notInMenu) { module.verbose('Triggering event', callback); callback(); return true; } module.verbose('Event occurred in dropdown menu, canceling callback'); return false; }, }, action: { nothing: function () {}, activate: function (text, value, element) { value = value !== undefined ? value : text; if (module.can.activate($(element))) { module.set.selected(value, $(element), false, settings.keepSearchTerm); if (!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) { module.hideAndClear(); } } }, select: function (text, value, element) { value = value !== undefined ? value : text; if (module.can.activate($(element))) { module.set.value(value, text, $(element)); if (!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) { module.hideAndClear(); } } }, combo: function (text, value, element) { value = value !== undefined ? value : text; module.set.selected(value, $(element)); module.hideAndClear(); }, hide: function (text, value, element) { module.set.value(value, text, $(element)); module.hideAndClear(); }, }, get: { id: function () { return id; }, defaultText: function () { return $module.data(metadata.defaultText); }, defaultValue: function () { return $module.data(metadata.defaultValue); }, placeholderText: function () { if (settings.placeholder !== 'auto' && typeof settings.placeholder === 'string') { return settings.placeholder; } return $module.data(metadata.placeholderText) || ''; }, text: function () { return settings.preserveHTML ? $text.html() : $text.text(); }, query: function () { return String($search.val()).trim(); }, searchWidth: function (value) { value = value !== undefined ? value : $search.val(); $sizer.text(value); // prevent rounding issues return Math.ceil($sizer.width() + (module.is.edge() ? 3 : 1)); }, selectionCount: function () { var values = module.get.values(), count ; count = module.is.multiple() ? (Array.isArray(values) ? values.length : 0) : (module.get.value() !== '' ? 1 : 0); return count; }, transition: function ($subMenu) { return settings.transition === 'auto' ? (module.is.upward($subMenu) ? 'slide up' : 'slide down') : settings.transition; }, userValues: function () { var values = module.get.values(true) ; if (!values) { return false; } values = Array.isArray(values) ? values : [values]; return $.grep(values, function (value) { return module.get.item(value) === false; }); }, uniqueArray: function (array) { return $.grep(array, function (value, index) { return $.inArray(value, array) === index; }); }, caretPosition: function (returnEndPos) { var input = $search[0], range, rangeLength ; if (returnEndPos && 'selectionEnd' in input) { return input.selectionEnd; } if (!returnEndPos && 'selectionStart' in input) { return input.selectionStart; } if (document.selection) { input.focus(); range = document.selection.createRange(); rangeLength = range.text.length; if (returnEndPos) { return rangeLength; } range.moveStart('character', -input.value.length); return range.text.length - rangeLength; } }, value: function () { var value = $input.length > 0 ? $input.val() : $module.data(metadata.value), isEmptyMultiselect = Array.isArray(value) && value.length === 1 && value[0] === '' ; // prevents placeholder element from being selected when multiple return value === undefined || isEmptyMultiselect ? '' : value; }, values: function (raw) { var value = module.get.value() ; if (value === '') { return ''; } return !module.has.selectInput() && module.is.multiple() ? (typeof value === 'string' // delimited string ? (raw ? value : module.escape.htmlEntities(value)).split(settings.delimiter) : '') : value; }, remoteValues: function () { var values = module.get.values(), remoteValues = false ; if (values) { if (typeof values === 'string') { values = [values]; } $.each(values, function (index, value) { var name = module.read.remoteData(value) ; module.verbose('Restoring value from session data', name, value); if (name) { if (!remoteValues) { remoteValues = {}; } remoteValues[value] = name; } }); } return remoteValues; }, choiceText: function ($choice, preserveHTML) { preserveHTML = preserveHTML !== undefined ? preserveHTML : settings.preserveHTML; if ($choice) { if ($choice.find(selector.menu).length > 0) { module.verbose('Retrieving text of element with sub-menu'); $choice = $choice.clone(); $choice.find(selector.menu).remove(); $choice.find(selector.menuIcon).remove(); } return $choice.data(metadata.text) !== undefined ? $choice.data(metadata.text) : (preserveHTML ? $choice.html() && $choice.html().trim() : $choice.text() && $choice.text().trim()); } }, choiceValue: function ($choice, choiceText) { choiceText = choiceText || module.get.choiceText($choice); if (!$choice) { return false; } return $choice.data(metadata.value) !== undefined ? String($choice.data(metadata.value)) : (typeof choiceText === 'string' ? String( settings.ignoreSearchCase ? choiceText.toLowerCase() : choiceText ).trim() : String(choiceText)); }, inputEvent: function () { var input = $search[0] ; if (input) { return input.oninput !== undefined ? 'input' : (input.onpropertychange !== undefined ? 'propertychange' : 'keyup'); } return false; }, selectValues: function () { var select = {}, oldGroup = [], values = [] ; $module .find('option') .each(function () { var $option = $(this), name = $option.html(), disabled = $option.attr('disabled'), value = $option.attr('value') !== undefined ? $option.attr('value') : name, text = $option.data(metadata.text) !== undefined ? $option.data(metadata.text) : name, group = $option.parent('optgroup') ; if (settings.placeholder === 'auto' && value === '') { select.placeholder = name; } else { if (group.length !== oldGroup.length || group[0] !== oldGroup[0]) { values.push({ type: 'header', divider: settings.headerDivider, name: group.attr('label') || '', }); oldGroup = group; } values.push({ name: name, value: value, text: module.escape.htmlEntities(text, true), disabled: disabled, }); } }) ; if (settings.placeholder && settings.placeholder !== 'auto') { module.debug('Setting placeholder value to', settings.placeholder); select.placeholder = settings.placeholder; } if (settings.sortSelect) { if (settings.sortSelect === true) { values.sort(function (a, b) { return a.name.localeCompare(b.name); }); } else if (settings.sortSelect === 'natural') { values.sort(function (a, b) { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); }); } else if (isFunction(settings.sortSelect)) { values.sort(settings.sortSelect); } select[fields.values] = values; module.debug('Retrieved and sorted values from select', select); } else { select[fields.values] = values; module.debug('Retrieved values from select', select); } return select; }, activeItem: function () { return $item.filter('.' + className.active); }, selectedItem: function () { var $selectedItem = $item.not(selector.unselectable).filter('.' + className.selected) ; return $selectedItem.length > 0 ? $selectedItem : $item.eq(0); }, itemWithAdditions: function (value) { var $items = module.get.item(value), $userItems = module.create.userChoice(value), hasUserItems = $userItems && $userItems.length > 0 ; if (hasUserItems) { $items = $items.length > 0 ? $items.add($userItems) : $userItems; } return $items; }, item: function (value, strict) { var $selectedItem = false, shouldSearch, isMultiple ; value = value !== undefined ? value : (module.get.values() !== undefined ? module.get.values() : module.get.text()); isMultiple = module.is.multiple() && Array.isArray(value); shouldSearch = isMultiple ? value.length > 0 : value !== undefined && value !== null; strict = value === '' || value === false || value === true ? true : strict || false; if (shouldSearch) { $item .each(function () { var $choice = $(this), optionText = module.get.choiceText($choice), optionValue = module.get.choiceValue($choice, optionText) ; // safe early exit if (optionValue === null || optionValue === undefined) { return; } if (isMultiple) { if ($.inArray(module.escape.htmlEntities(String(optionValue)), value.map(String).map(module.escape.htmlEntities)) !== -1) { $selectedItem = $selectedItem ? $selectedItem.add($choice) : $choice; } } else if (strict) { module.verbose('Ambiguous dropdown value using strict type check', $choice, value); if (optionValue === value) { $selectedItem = $choice; return true; } } else { if (settings.ignoreCase) { optionValue = optionValue.toLowerCase(); value = value.toLowerCase(); } if (module.escape.htmlEntities(String(optionValue)) === module.escape.htmlEntities(String(value))) { module.verbose('Found select item by value', optionValue, value); $selectedItem = $choice; return true; } } }) ; } return $selectedItem; }, displayType: function () { return $module.hasClass('column') ? 'flex' : settings.displayType; }, }, check: { maxSelections: function (selectionCount) { if (settings.maxSelections) { selectionCount = selectionCount !== undefined ? selectionCount : module.get.selectionCount(); if (selectionCount >= settings.maxSelections) { module.debug('Maximum selection count reached'); if (settings.useLabels) { $item.addClass(className.filtered); module.add.message(message.maxSelections); } return true; } module.verbose('No longer at maximum selection count'); module.remove.message(); module.remove.filteredItem(); if (module.is.searchSelection()) { module.filterItems(); } return false; } return false; }, disabled: function () { $search.attr('tabindex', module.is.disabled() ? -1 : 0); }, }, restore: { defaults: function (preventChangeTrigger) { module.clear(preventChangeTrigger); module.restore.defaultText(); module.restore.defaultValue(); }, defaultText: function () { var defaultText = module.get.defaultText(), placeholderText = module.get.placeholderText ; if (defaultText === placeholderText) { module.debug('Restoring default placeholder text', defaultText); module.set.placeholderText(defaultText); } else { module.debug('Restoring default text', defaultText); module.set.text(defaultText); } }, placeholderText: function () { module.set.placeholderText(); }, defaultValue: function () { var defaultValue = module.get.defaultValue() ; if (defaultValue !== undefined) { module.debug('Restoring default value', defaultValue); if (defaultValue !== '') { module.set.value(defaultValue); module.set.selected(); } else { module.remove.activeItem(); module.remove.selectedItem(); } } }, labels: function () { if (settings.allowAdditions) { if (!settings.useLabels) { module.error(error.labels); settings.useLabels = true; } module.debug('Restoring selected values'); module.create.userLabels(); } module.check.maxSelections(); }, selected: function () { module.restore.values(); if (module.is.multiple()) { module.debug('Restoring previously selected values and labels'); module.restore.labels(); } else { module.debug('Restoring previously selected values'); } }, values: function () { // prevents callbacks from occurring on initial load module.set.initialLoad(); if (settings.apiSettings && settings.saveRemoteData && module.get.remoteValues()) { module.restore.remoteValues(); } else { module.set.selected(); } var value = module.get.value(); if (value && value !== '' && !(Array.isArray(value) && value.length === 0)) { $input.removeClass(className.noselection); } else { $input.addClass(className.noselection); } module.remove.initialLoad(); }, remoteValues: function () { var values = module.get.remoteValues() ; module.debug('Recreating selected from session data', values); if (values) { if (module.is.single()) { $.each(values, function (value, name) { module.set.text(name); }); } else if (settings.useLabels) { $.each(values, function (value, name) { module.add.label(value, name); }); } } }, }, read: { remoteData: function (value) { var name ; if (window.Storage === undefined) { module.error(error.noStorage); return; } name = sessionStorage.getItem(value + elementNamespace); return name !== undefined ? name : false; }, }, save: { defaults: function () { module.save.defaultText(); module.save.placeholderText(); module.save.defaultValue(); }, defaultValue: function () { var value = module.get.value() ; module.verbose('Saving default value as', value); $module.data(metadata.defaultValue, value); }, defaultText: function () { var text = module.get.text() ; module.verbose('Saving default text as', text); $module.data(metadata.defaultText, text); }, placeholderText: function () { var text ; if (settings.placeholder !== false && $text.hasClass(className.placeholder)) { text = module.get.text(); module.verbose('Saving placeholder text as', text); $module.data(metadata.placeholderText, text); } }, remoteData: function (name, value) { if (window.Storage === undefined) { module.error(error.noStorage); return; } module.verbose('Saving remote data to session storage', value, name); sessionStorage.setItem(value + elementNamespace, name); }, }, clear: function (preventChangeTrigger) { if (module.is.multiple() && settings.useLabels) { module.remove.labels($module.find(selector.label), preventChangeTrigger); } else { module.remove.activeItem(); module.remove.selectedItem(); module.remove.filteredItem(); } module.set.placeholderText(); module.clearValue(preventChangeTrigger); }, clearValue: function (preventChangeTrigger) { module.set.value('', null, null, preventChangeTrigger); }, clearCache: function () { module.debug('Clearing API cache once'); tempDisableApiCache = true; }, scrollPage: function (direction, $selectedItem) { var $currentItem = $selectedItem || module.get.selectedItem(), $menu = $currentItem.closest(selector.menu), menuHeight = $menu.outerHeight(), currentScroll = $menu.scrollTop(), itemHeight = $item.eq(0).outerHeight(), itemsPerPage = Math.floor(menuHeight / itemHeight), newScroll = direction === 'up' ? currentScroll - (itemHeight * itemsPerPage) : currentScroll + (itemHeight * itemsPerPage), $selectableItem = $item.not(selector.unselectable), isWithinRange, $nextSelectedItem, elementIndex ; elementIndex = direction === 'up' ? $selectableItem.index($currentItem) - itemsPerPage : $selectableItem.index($currentItem) + itemsPerPage; isWithinRange = direction === 'up' ? elementIndex >= 0 : elementIndex < $selectableItem.length; $nextSelectedItem = isWithinRange ? $selectableItem.eq(elementIndex) : (direction === 'up' ? $selectableItem.first() : $selectableItem.last()); if ($nextSelectedItem.length > 0) { module.debug('Scrolling page', direction, $nextSelectedItem); $currentItem .removeClass(className.selected) ; $nextSelectedItem .addClass(className.selected) ; if (settings.selectOnKeydown && module.is.single() && !$nextSelectedItem.hasClass(className.actionable)) { module.set.selectedItem($nextSelectedItem); } $menu .scrollTop(newScroll) ; } }, set: { filtered: function () { var isMultiple = module.is.multiple(), isSearch = module.is.searchSelection(), isSearchMultiple = isMultiple && isSearch, searchValue = isSearch ? module.get.query() : '', hasSearchValue = typeof searchValue === 'string' && searchValue.length > 0, searchWidth = module.get.searchWidth(), valueIsSet = searchValue !== '' ; if (isMultiple && hasSearchValue) { module.verbose('Adjusting input width', searchWidth); $search.css('width', searchWidth + 'px'); } if (hasSearchValue || (isSearchMultiple && valueIsSet)) { module.verbose('Hiding placeholder text'); $text.addClass(className.filtered); } else if (!isMultiple || (isSearchMultiple && !valueIsSet)) { module.verbose('Showing placeholder text'); $text.removeClass(className.filtered); } }, empty: function () { $module.addClass(className.empty); }, loading: function () { $module.addClass(className.loading); }, placeholderText: function (text) { text = text || module.get.placeholderText(); module.debug('Setting placeholder text', text); module.set.text(text); $text.addClass(className.placeholder); }, tabbable: function () { if (module.is.searchSelection()) { module.debug('Added tabindex to searchable dropdown'); $search .val('') ; module.check.disabled(); $menu .attr('tabindex', -1) ; } else { module.debug('Added tabindex to dropdown'); if ($module.attr('tabindex') === undefined) { $module .attr('tabindex', $input.attr('tabindex') || 0) ; $menu .attr('tabindex', -1) ; } } $input.removeAttr('tabindex'); }, initialLoad: function () { module.verbose('Setting initial load'); initialLoad = true; }, activeItem: function ($item) { if (settings.allowAdditions && $item.filter(selector.addition).length > 0) { $item.addClass(className.filtered); } else { $item.addClass(className.active); } }, partialSearch: function (text) { var length = module.get.query().length ; $search.val(text.slice(0, length)); }, scrollPosition: function ($item, forceScroll) { var edgeTolerance = 5, $menu, hasActive, offset, itemOffset, menuOffset, menuScroll, menuHeight, abovePage, belowPage ; $item = $item || module.get.selectedItem(); $menu = $item.closest(selector.menu); hasActive = $item && $item.length > 0; forceScroll = forceScroll !== undefined ? forceScroll : false; if (module.get.activeItem().length === 0) { forceScroll = false; } if ($item && $menu.length > 0 && hasActive) { itemOffset = $item.position().top; $menu.addClass(className.loading); menuScroll = $menu.scrollTop(); menuOffset = $menu.offset().top; itemOffset = $item.offset().top; offset = menuScroll - menuOffset + itemOffset; if (!forceScroll) { menuHeight = $menu.height(); belowPage = menuScroll + menuHeight < (offset + edgeTolerance); abovePage = (offset - edgeTolerance) < menuScroll; } module.debug('Scrolling to active item', offset); if (forceScroll || abovePage || belowPage) { $menu.scrollTop(offset); } $menu.removeClass(className.loading); } }, text: function (text, isNotPlaceholder) { if (settings.action === 'combo') { module.debug('Changing combo button text', text, $combo); if (settings.preserveHTML) { $combo.html(text); } else { $combo.text(text); } } else if (settings.action === 'activate' || isFunction(settings.action)) { if (text !== module.get.placeholderText() || isNotPlaceholder) { $text.removeClass(className.placeholder); } module.debug('Changing text', text, $text); $text .removeClass(className.filtered) ; if (settings.preserveHTML) { $text.html(text); } else { $text.text(text); } } }, selectedItem: function ($item) { var value = module.get.choiceValue($item), searchText = module.get.choiceText($item, false), text = module.get.choiceText($item) ; module.debug('Setting user selection to item', $item); module.remove.activeItem(); module.set.partialSearch(searchText); module.set.activeItem($item); module.set.selected(value, $item); module.set.text(text); }, selectedLetter: function (letter) { var $selectedItem = $item.filter('.' + className.selected), alreadySelectedLetter = $selectedItem.length > 0 && module.has.firstLetter($selectedItem, letter), $nextValue = false, $nextItem ; // check next of same letter if (alreadySelectedLetter) { $nextItem = $selectedItem.nextAll($item).eq(0); if (module.has.firstLetter($nextItem, letter)) { $nextValue = $nextItem; } } // check all values if (!$nextValue) { $item .each(function () { if (module.has.firstLetter($(this), letter)) { $nextValue = $(this); return false; } }) ; } // set next value if ($nextValue) { module.verbose('Scrolling to next value with letter', letter); module.set.scrollPosition($nextValue); $selectedItem.removeClass(className.selected); $nextValue.addClass(className.selected); if (settings.selectOnKeydown && module.is.single() && (!$nextItem || !$nextItem.hasClass(className.actionable))) { module.set.selectedItem($nextValue); } } }, direction: function ($menu) { if (settings.direction === 'auto') { // reset position, remove upward if it's base menu if (!$menu) { module.remove.upward(); } else if (module.is.upward($menu)) { // we need make sure when make assertion openDownward for $menu, $menu does not have upward class module.remove.upward($menu); } if (module.can.openDownward($menu)) { module.remove.upward($menu); } else { module.set.upward($menu); } if (!module.is.leftward($menu) && !module.can.openRightward($menu)) { module.set.leftward($menu); } } else if (settings.direction === 'upward') { module.set.upward($menu); } }, upward: function ($currentMenu) { var $element = $currentMenu || $module; $element.addClass(className.upward); }, leftward: function ($currentMenu) { var $element = $currentMenu || $menu; $element.addClass(className.leftward); }, value: function (value, text, $selected, preventChangeTrigger) { if (typeof text === 'boolean') { preventChangeTrigger = text; $selected = undefined; text = undefined; } if (value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) { $input.removeClass(className.noselection); } else { $input.addClass(className.noselection); } var escapedValue = module.escape.value(value), hasInput = $input.length > 0, currentValue = module.get.values(), stringValue = value !== undefined ? String(value) : value ; if (hasInput) { if (!settings.allowReselection && stringValue == currentValue) { module.verbose('Skipping value update already same value', value, currentValue); if (!module.is.initialLoad()) { return; } } if (module.is.single() && module.has.selectInput() && module.can.extendSelect()) { module.debug('Adding user option', value); module.add.optionValue(value); } module.debug('Updating input value', escapedValue, currentValue); internalChange = true; $input .val(escapedValue) ; if (settings.fireOnInit === false && module.is.initialLoad()) { module.debug('Input native change event ignored on initial load'); } else if (preventChangeTrigger !== true) { module.trigger.change(); } internalChange = false; } else { module.verbose('Storing value in metadata', escapedValue, $input); if (escapedValue !== currentValue) { $module.data(metadata.value, stringValue); } } if (settings.fireOnInit === false && module.is.initialLoad()) { module.verbose('No callback on initial load', settings.onChange); } else if (preventChangeTrigger !== true) { settings.onChange.call(element, value, text, $selected); } }, active: function () { $module .addClass(className.active) ; }, multiple: function () { $module.addClass(className.multiple); }, visible: function () { $module.addClass(className.visible); }, exactly: function (value, $selectedItem, preventChangeTrigger) { if (typeof $selectedItem === 'boolean') { preventChangeTrigger = $selectedItem; $selectedItem = undefined; } module.debug('Setting selected to exact values'); module.clear(); module.set.selected(value, $selectedItem, preventChangeTrigger); }, selected: function (value, $selectedItem, preventChangeTrigger, keepSearchTerm) { if (typeof $selectedItem === 'boolean') { keepSearchTerm = preventChangeTrigger; preventChangeTrigger = $selectedItem; $selectedItem = undefined; } var isMultiple = module.is.multiple() ; $selectedItem = settings.allowAdditions ? $selectedItem || module.get.itemWithAdditions(value) : $selectedItem || module.get.item(value); if (!$selectedItem && value !== undefined) { return false; } if (isMultiple) { if (!keepSearchTerm) { module.remove.searchWidth(); } if (settings.useLabels) { module.remove.selectedItem(); if (value === undefined) { module.remove.labels($module.find(selector.label), true); } } } else { module.remove.activeItem(); module.remove.selectedItem(); } if (!$selectedItem) { return false; } module.debug('Setting selected menu item to', $selectedItem); // select each item $selectedItem .each(function () { var $selected = $(this), selectedText = module.get.choiceText($selected), selectedValue = module.get.choiceValue($selected, selectedText), isFiltered = $selected.hasClass(className.filtered), isActive = $selected.hasClass(className.active), isActionable = $selected.hasClass(className.actionable), isUserValue = $selected.hasClass(className.addition), shouldAnimate = isMultiple && $selectedItem && $selectedItem.length === 1 ; if (isActionable) { if ((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) { module.save.remoteData(selectedText, selectedValue); } settings.onActionable.call(element, selectedValue, selectedText, $selected); } else if (isMultiple) { if (!isActive || isUserValue) { if (settings.apiSettings && settings.saveRemoteData) { module.save.remoteData(selectedText, selectedValue); } if (settings.useLabels) { module.add.label(selectedValue, selectedText, shouldAnimate); module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger); module.set.activeItem($selected); module.filterActive(); module.select.nextAvailable($selectedItem); } else { module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger); module.set.text(module.add.variables(message.count)); module.set.activeItem($selected); } } else if (!isFiltered && (settings.useLabels || selectActionActive)) { module.debug('Selected active value, removing label'); module.remove.selected(selectedValue); } } else { if (settings.apiSettings && settings.saveRemoteData) { module.save.remoteData(selectedText, selectedValue); } if (!keepSearchTerm && !$selected.hasClass(className.actionable)) { module.set.text(selectedText, true); } module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger); $selected .addClass(className.active) .addClass(className.selected) ; } }) ; if (!keepSearchTerm) { module.remove.searchTerm(); } if (module.is.allFiltered()) { module.set.empty(); module.hideMenu(); } }, }, add: { label: function (value, text, shouldAnimate) { var $next = module.is.searchSelection() ? $search : $text, escapedValue = module.escape.value(value), $label ; if (settings.ignoreCase) { escapedValue = escapedValue.toLowerCase(); } $label = $('<a />') .addClass(className.label) .attr('data-' + metadata.value, escapedValue) .html(templates.label(escapedValue, text, settings.preserveHTML, settings.className)) ; $label = settings.onLabelCreate.call($label, escapedValue, text); if (module.has.label(value)) { module.debug('User selection already exists, skipping', escapedValue); return; } if (settings.label.variation) { $label.addClass(settings.label.variation); } if (shouldAnimate === true && settings.label.transition) { module.debug('Animating in label', $label); $label .addClass(className.hidden) .insertBefore($next) .transition({ animation: settings.label.transition, debug: settings.debug, verbose: settings.verbose, silent: settings.silent, duration: settings.label.duration, }) ; } else { module.debug('Adding selection label', $label); $label .insertBefore($next) ; } }, message: function (message) { var $message = $menu.children(selector.message), html = settings.templates.message(module.add.variables(message)) ; if ($message.length > 0) { $message .html(html) ; } else { $('<div/>') .html(html) .addClass(className.message) .appendTo($menu) ; } }, optionValue: function (value) { var escapedValue = module.escape.value(value), $option = $input.find('option[value="' + module.escape.string(escapedValue) + '"]'), hasOption = $option.length > 0 ; if (hasOption) { return; } // temporarily disconnect observer module.disconnect.selectObserver(); if (module.is.single()) { module.verbose('Removing previous user addition'); $input.find('option.' + className.addition).remove(); } $('<option/>') .prop('value', escapedValue) .addClass(className.addition) .text(value) .appendTo($input) ; module.verbose('Adding user addition as an <option>', value); module.observe.select(); }, userSuggestion: function (value) { var $addition = $menu.children(selector.addition), $existingItem = module.get.item(value), alreadyHasValue = $existingItem && $existingItem.not(selector.addition).length > 0, hasUserSuggestion = $addition.length > 0, html ; if (settings.useLabels && module.has.maxSelections()) { return; } if (value === '' || alreadyHasValue) { $addition.remove(); return; } if (hasUserSuggestion) { $addition .data(metadata.value, value) .data(metadata.text, value) .attr('data-' + metadata.value, value) .attr('data-' + metadata.text, value) .removeClass(className.filtered) ; if (!settings.hideAdditions) { html = settings.templates.addition(module.add.variables(message.addResult, value)); $addition .html(html) ; } module.verbose('Replacing user suggestion with new value', $addition); } else { $addition = module.create.userChoice(value); $addition .prependTo($menu) ; module.verbose('Adding item choice to menu corresponding with user choice addition', $addition); } if (!settings.hideAdditions || module.is.allFiltered()) { $addition .addClass(className.selected) .siblings() .removeClass(className.selected) ; } module.refreshItems(); }, variables: function (message, term) { var hasCount = message.search('{count}') !== -1, hasMaxCount = message.search('{maxCount}') !== -1, hasTerm = message.search('{term}') !== -1, query ; module.verbose('Adding templated variables to message', message); if (hasCount) { message = message.replace('{count}', module.get.selectionCount()); } if (hasMaxCount) { message = message.replace('{maxCount}', settings.maxSelections); } if (hasTerm) { query = term || module.get.query(); message = message.replace('{term}', query); } return message; }, value: function (addedValue, addedText, $selectedItem, preventChangeTrigger) { if (typeof addedText === 'boolean') { preventChangeTrigger = addedText; $selectedItem = undefined; addedText = undefined; } var currentValue = module.get.values(true), newValue ; if (module.has.value(addedValue)) { module.debug('Value already selected'); return; } if (addedValue === '') { module.debug('Cannot select blank values from multiselect'); return; } // extend current array if (Array.isArray(currentValue)) { newValue = $selectedItem && $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]); newValue = module.get.uniqueArray(newValue); } else { newValue = [addedValue]; } // add values if (module.has.selectInput()) { if (module.can.extendSelect()) { module.debug('Adding value to select', addedValue, newValue, $input); module.add.optionValue(addedValue); } } else { newValue = newValue.join(settings.delimiter); module.debug('Setting hidden input to delimited value', newValue, $input); } if (settings.fireOnInit === false && module.is.initialLoad()) { module.verbose('Skipping onadd callback on initial load', settings.onAdd); } else { settings.onAdd.call(element, addedValue, addedText, $selectedItem); } module.set.value(newValue, addedText, $selectedItem, preventChangeTrigger); module.check.maxSelections(); }, }, remove: { active: function () { $module.removeClass(className.active); }, activeLabel: function () { $module.find(selector.label).removeClass(className.active); }, empty: function () { $module.removeClass(className.empty); }, loading: function () { $module.removeClass(className.loading); }, initialLoad: function () { initialLoad = false; }, upward: function ($currentMenu) { var $element = $currentMenu || $module; $element.removeClass(className.upward); }, leftward: function ($currentMenu) { var $element = $currentMenu || $menu; $element.removeClass(className.leftward); }, visible: function () { $module.removeClass(className.visible); }, activeItem: function () { $item.removeClass(className.active); }, filteredItem: function () { if (settings.highlightMatches) { $.each($item, function (index, item) { var $markItem = $(item); $markItem.html($markItem.html().replace(/<\/?mark>/g, '')); }); } if (settings.useLabels && module.has.maxSelections()) { return; } if (settings.useLabels && module.is.multiple()) { $item.not('.' + className.active).removeClass(className.filtered); } else { $item.removeClass(className.filtered); } if (settings.hideDividers) { $divider.removeClass(className.hidden); } module.remove.empty(); }, optionValue: function (value) { var escapedValue = module.escape.value(value), $option = $input.find('option[value="' + module.escape.string(escapedValue) + '"]'), hasOption = $option.length > 0 ; if (!hasOption || !$option.hasClass(className.addition)) { return; } // temporarily disconnect observer module.disconnect.selectObserver(); $option.remove(); module.verbose('Removing user addition as an <option>', escapedValue); module.observe.select(); }, message: function () { $menu.children(selector.message).remove(); }, searchWidth: function () { $search.css('width', ''); }, searchTerm: function () { module.verbose('Cleared search term'); $search.val(''); module.set.filtered(); }, userAddition: function () { $item.filter(selector.addition).remove(); }, selected: function (value, $selectedItem, preventChangeTrigger) { $selectedItem = settings.allowAdditions ? $selectedItem || module.get.itemWithAdditions(value) : $selectedItem || module.get.item(value); if (!$selectedItem) { return false; } $selectedItem .each(function () { var $selected = $(this), selectedText = module.get.choiceText($selected), selectedValue = module.get.choiceValue($selected, selectedText) ; if (module.is.multiple()) { if (settings.useLabels) { module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger); module.remove.label(selectedValue); } else { module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger); if (module.get.selectionCount() === 0) { module.set.placeholderText(); } else { module.set.text(module.add.variables(message.count)); } } } else { module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger); } $selected .removeClass(className.filtered) .removeClass(className.active) ; if (settings.useLabels) { $selected.removeClass(className.selected); } }) ; }, selectedItem: function () { $item.removeClass(className.selected); }, value: function (removedValue, removedText, $removedItem, preventChangeTrigger) { var values = module.get.values(true), newValue ; if (module.has.selectInput()) { module.verbose('Input is <select> removing selected option', removedValue); newValue = module.remove.arrayValue(removedValue, values); module.remove.optionValue(removedValue); } else { module.verbose('Removing from delimited values', removedValue); newValue = module.remove.arrayValue(removedValue, values); newValue = newValue.join(settings.delimiter); } if (settings.fireOnInit === false && module.is.initialLoad()) { module.verbose('No callback on initial load', settings.onRemove); } else { settings.onRemove.call(element, removedValue, removedText, $removedItem); } module.set.value(newValue, removedText, $removedItem, preventChangeTrigger); module.check.maxSelections(); }, arrayValue: function (removedValue, values) { if (!Array.isArray(values)) { values = [values]; } values = $.grep(values, function (value) { return removedValue != value; }); module.verbose('Removed value from delimited string', removedValue, values); return values; }, label: function (value, shouldAnimate) { var escapedValue = module.escape.value(value), $labels = $module.find(selector.label), $removedLabel = $labels.filter('[data-' + metadata.value + '="' + module.escape.string(settings.ignoreCase ? escapedValue.toLowerCase() : escapedValue) + '"]') ; module.verbose('Removing label', $removedLabel); $removedLabel.remove(); }, activeLabels: function ($activeLabels) { $activeLabels = $activeLabels || $module.find(selector.label).filter('.' + className.active); module.verbose('Removing active label selections', $activeLabels); module.remove.labels($activeLabels); }, labels: function ($labels, preventChangeTrigger) { $labels = $labels || $module.find(selector.label); module.verbose('Removing labels', $labels); $labels .each(function () { var $label = $(this), value = $label.data(metadata.value), stringValue = value !== undefined ? String(value) : value, isUserValue = module.is.userValue(stringValue) ; if (settings.onLabelRemove.call($label, value) === false) { module.debug('Label remove callback cancelled removal'); return; } module.remove.message(); if (isUserValue) { module.remove.value(stringValue, stringValue, module.get.item(stringValue), preventChangeTrigger); module.remove.label(stringValue); } else { // selected will also remove label module.remove.selected(stringValue, false, preventChangeTrigger); } }) ; }, tabbable: function () { if (module.is.searchSelection()) { module.debug('Searchable dropdown initialized'); $search .removeAttr('tabindex') ; $menu .removeAttr('tabindex') ; } else { module.debug('Simple selection dropdown initialized'); $module .removeAttr('tabindex') ; $menu .removeAttr('tabindex') ; } }, diacritics: function (text) { return settings.ignoreDiacritics ? text.normalize('NFD').replace(/[\u0300-\u036F]/g, '') : text; }, }, has: { menuSearch: function () { return module.has.search() && $search.closest($menu).length > 0; }, clearItem: function () { return $clear.length > 0; }, search: function () { return $search.length > 0; }, sizer: function () { return $sizer.length > 0; }, selectInput: function () { return $input.is('select'); }, minCharacters: function (searchTerm) { if (settings.minCharacters && !iconClicked) { searchTerm = searchTerm !== undefined ? String(searchTerm) : String(module.get.query()); return searchTerm.length >= settings.minCharacters; } iconClicked = false; return true; }, firstLetter: function ($item, letter) { var text, firstLetter ; if (!$item || $item.length === 0 || typeof letter !== 'string') { return false; } text = module.get.choiceText($item, false); letter = letter.toLowerCase(); firstLetter = String(text).charAt(0).toLowerCase(); return letter == firstLetter; }, input: function () { return $input.length > 0; }, items: function () { return $item.length > 0; }, menu: function () { return $menu.length > 0; }, subMenu: function ($currentMenu) { return ($currentMenu || $menu).find(selector.menu).length > 0; }, message: function () { return $menu.children(selector.message).length > 0; }, label: function (value) { var escapedValue = module.escape.value(value), $labels = $module.find(selector.label) ; if (settings.ignoreCase) { escapedValue = escapedValue.toLowerCase(); } return $labels.filter('[data-' + metadata.value + '="' + module.escape.string(escapedValue) + '"]').length > 0; }, maxSelections: function () { return settings.maxSelections && module.get.selectionCount() >= settings.maxSelections; }, allResultsFiltered: function () { var $normalResults = $item.not(selector.addition) ; return $normalResults.filter(selector.unselectable).length === $normalResults.length; }, userSuggestion: function () { return $menu.children(selector.addition).length > 0; }, query: function () { return module.get.query() !== ''; }, value: function (value) { return settings.ignoreCase ? module.has.valueIgnoringCase(value) : module.has.valueMatchingCase(value); }, valueMatchingCase: function (value) { var values = module.get.values(true), hasValue = Array.isArray(values) ? values && ($.inArray(value, values) !== -1) : values == value ; return !!hasValue; }, valueIgnoringCase: function (value) { var values = module.get.values(true), hasValue = false ; if (!Array.isArray(values)) { values = [values]; } $.each(values, function (index, existingValue) { if (String(value).toLowerCase() === String(existingValue).toLowerCase()) { hasValue = true; return false; } }); return hasValue; }, }, is: { active: function () { return $module.hasClass(className.active); }, animatingInward: function () { return $menu.transition('is inward'); }, animatingOutward: function () { return $menu.transition('is outward'); }, bubbledLabelClick: function (event) { return $(event.target).is('select, input') && $module.closest('label').length > 0; }, bubbledIconClick: function (event) { return $(event.target).closest($icon).length > 0; }, edge: function () { return !!window.chrome && !!window.StyleMedia; }, empty: function () { return $module.hasClass(className.empty); }, chrome: function () { return !!window.chrome && !window.StyleMedia; }, alreadySetup: function () { return $module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0; }, animating: function ($subMenu) { return $subMenu ? $subMenu.transition && $subMenu.transition('is animating') : $menu.transition && $menu.transition('is animating'); }, leftward: function ($subMenu) { var $selectedMenu = $subMenu || $menu; return $selectedMenu.hasClass(className.leftward); }, clearable: function () { var hasClearableClass = $module.hasClass(className.clearable); if (!hasClearableClass && settings.clearable) { $module.addClass(className.clearable); } return hasClearableClass || settings.clearable; }, disabled: function () { return $module.hasClass(className.disabled); }, focused: function () { return document.activeElement === $module[0]; }, focusedOnSearch: function () { return document.activeElement === $search[0]; }, allFiltered: function () { return (module.is.multiple() || module.has.search()) && !(!settings.hideAdditions && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered(); }, hidden: function ($subMenu) { return !module.is.visible($subMenu); }, initialLoad: function () { return initialLoad; }, inObject: function (needle, object) { var found = false ; $.each(object, function (index, property) { if (property == needle) { found = true; return true; } }); return found; }, multiple: function () { return $module.hasClass(className.multiple); }, remote: function () { return settings.apiSettings && module.can.useAPI(); }, noApiCache: function () { return tempDisableApiCache || (settings.apiSettings && !settings.apiSettings.cache); }, single: function () { return !module.is.multiple(); }, selectMutation: function (mutations) { var selectChanged = false ; $.each(mutations, function (index, mutation) { if ($(mutation.target).is('option, optgroup') || $(mutation.addedNodes).is('select') || ($(mutation.target).is('select') && mutation.type !== 'attributes')) { selectChanged = true; return false; } }); return selectChanged; }, search: function () { return $module.hasClass(className.search); }, searchSelection: function (deep) { return module.has.search() && (deep ? $search.parents(selector.dropdown) : $search.parent(selector.dropdown)).length === 1; }, selection: function () { return $module.hasClass(className.selection); }, userValue: function (value) { return $.inArray(value, module.get.userValues()) !== -1; }, upward: function ($menu) { var $element = $menu || $module; return $element.hasClass(className.upward); }, visible: function ($subMenu) { return $subMenu ? $subMenu.hasClass(className.visible) : $menu.hasClass(className.visible); }, verticallyScrollableContext: function () { var overflowY = $context[0] !== window ? $context.css('overflow-y') : false ; return overflowY === 'auto' || overflowY === 'scroll'; }, horizontallyScrollableContext: function () { var overflowX = $context[0] !== window ? $context.css('overflow-X') : false ; return overflowX === 'auto' || overflowX === 'scroll'; }, }, can: { activate: function ($item) { return ( settings.useLabels || !module.has.maxSelections() || (module.has.maxSelections() && $item.hasClass(className.active)) ); }, openDownward: function ($subMenu) { var $currentMenu = $subMenu || $menu, canOpenDownward, onScreen, calculations ; $currentMenu .addClass(className.loading) ; calculations = { context: { offset: $context[0] === window ? { top: 0, left: 0 } : $context.offset(), scrollTop: $context.scrollTop(), height: $context.outerHeight(), }, menu: { offset: $currentMenu.offset(), height: $currentMenu.outerHeight(), }, }; if (module.is.verticallyScrollableContext()) { calculations.menu.offset.top += calculations.context.scrollTop; } if (module.has.subMenu($currentMenu)) { calculations.menu.height += $currentMenu.find(selector.menu).first().outerHeight(); } onScreen = { above: calculations.context.scrollTop <= calculations.menu.offset.top - calculations.context.offset.top - calculations.menu.height, below: (calculations.context.scrollTop + calculations.context.height) >= calculations.menu.offset.top - calculations.context.offset.top + calculations.menu.height, }; if (onScreen.below) { module.verbose('Dropdown can fit in context downward', onScreen); canOpenDownward = true; } else if (!onScreen.below && !onScreen.above) { module.verbose('Dropdown cannot fit in either direction, favoring downward', onScreen); canOpenDownward = true; } else { module.verbose('Dropdown cannot fit below, opening upward', onScreen); canOpenDownward = false; } $currentMenu.removeClass(className.loading); return canOpenDownward; }, openRightward: function ($subMenu) { var $currentMenu = $subMenu || $menu, canOpenRightward = true, isOffscreenRight = false, calculations ; $currentMenu .addClass(className.loading) ; calculations = { context: { offset: $context[0] === window ? { top: 0, left: 0 } : $context.offset(), scrollLeft: $context.scrollLeft(), width: $context.outerWidth(), }, menu: { offset: $currentMenu.offset(), width: $currentMenu.outerWidth(), }, }; if (module.is.horizontallyScrollableContext()) { calculations.menu.offset.left += calculations.context.scrollLeft; } isOffscreenRight = calculations.menu.offset.left - calculations.context.offset.left + calculations.menu.width >= calculations.context.scrollLeft + calculations.context.width; if (isOffscreenRight) { module.verbose('Dropdown cannot fit in context rightward', isOffscreenRight); canOpenRightward = false; } $currentMenu.removeClass(className.loading); return canOpenRightward; }, extendSelect: function () { return settings.allowAdditions || settings.apiSettings; }, show: function () { return !module.is.disabled() && (module.has.items() || module.has.message()); }, useAPI: function () { return $.fn.api !== undefined; }, useElement: function (element) { if ($.fn[element] !== undefined) { return true; } module.error(error.noElement.replace('{element}', element)); return false; }, }, animate: { show: function (callback, $subMenu) { var $currentMenu = $subMenu || $menu, start = $subMenu ? function () {} : function () { module.hideSubMenus(); module.hideOthers(); module.set.active(); }, transition ; callback = isFunction(callback) ? callback : function () {}; module.verbose('Doing menu show animation', $currentMenu); module.set.direction($subMenu); transition = settings.transition.showMethod || module.get.transition($subMenu); if (module.is.selection()) { module.set.scrollPosition(module.get.selectedItem(), true); } if (module.is.hidden($currentMenu) || module.is.animating($currentMenu)) { if (transition === 'none') { start(); $currentMenu.transition({ displayType: module.get.displayType(), }).transition('show'); callback.call(element); } else if (module.can.useElement('transition')) { $currentMenu .transition({ animation: transition + ' in', debug: settings.debug, verbose: settings.verbose, silent: settings.silent, duration: settings.transition.showDuration || settings.duration, queue: true, onStart: start, displayType: module.get.displayType(), onComplete: function () { callback.call(element); }, }) ; } } }, hide: function (callback, $subMenu) { var $currentMenu = $subMenu || $menu, start = $subMenu ? function () {} : function () { module.unbind.intent(); module.remove.active(); }, transition = settings.transition.hideMethod || module.get.transition($subMenu) ; callback = isFunction(callback) ? callback : function () {}; if (module.is.visible($currentMenu) || module.is.animating($currentMenu)) { module.verbose('Doing menu hide animation', $currentMenu); if (transition === 'none') { start(); $currentMenu.transition({ displayType: module.get.displayType(), }).transition('hide'); callback.call(element); } else if ($.fn.transition !== undefined) { $currentMenu .transition({ animation: transition + ' out', duration: settings.transition.hideDuration || settings.duration, debug: settings.debug, verbose: settings.verbose, silent: settings.silent, queue: false, onStart: start, displayType: module.get.displayType(), onComplete: function () { callback.call(element); }, }) ; } else { module.error(error.transition); } } }, }, hideAndClear: function () { module.remove.searchTerm(); if (module.has.maxSelections()) { return; } if (module.has.search()) { module.hide(function () { module.remove.filteredItem(); }); } else { module.hide(); } }, delay: { show: function () { module.verbose('Delaying show event to ensure user intent'); clearTimeout(module.timer); module.timer = setTimeout(function () { module.show(); }, settings.delay.show); }, hide: function () { module.verbose('Delaying hide event to ensure user intent'); clearTimeout(module.timer); module.timer = setTimeout(function () { module.hide(); }, settings.delay.hide); }, }, escape: { value: function (value) { var multipleValues = Array.isArray(value), stringValue = typeof value === 'string', isUnparsable = !stringValue && !multipleValues, hasQuotes = stringValue && value.search(regExp.quote) !== -1, values = [] ; if (isUnparsable || !hasQuotes) { return value; } module.debug('Encoding quote values for use in select', value); if (multipleValues) { $.each(value, function (index, value) { values.push(value.replace(regExp.quote, '"')); }); return values; } return value.replace(regExp.quote, '"'); }, string: function (text) { text = String(text); return text.replace(regExp.escape, '\\$&'); }, htmlEntities: function (string, forceAmpersand) { forceAmpersand = typeof forceAmpersand === 'number' ? false : forceAmpersand; var badChars = /["'<>`]/g, shouldEscape = /["&'<>`]/, escape = { '<': '<', '>': '>', '"': '"', "'": ''', '`': '`', }, escapedChar = function (chr) { return escape[chr]; } ; if (shouldEscape.test(string)) { string = string.replace(forceAmpersand ? /&/g : /&(?![\d#a-z]{1,12};)/gi, '&'); string = string.replace(badChars, escapedChar); } return string; }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : $allModules; }; $.fn.dropdown.settings = { silent: false, debug: false, verbose: false, performance: true, on: 'click', // what event should show menu action on item selection action: 'activate', // action on item selection (nothing, activate, select, combo, hide, function(){}) values: false, // specify values to use for dropdown clearable: false, // whether the value of the dropdown can be cleared apiSettings: false, selectOnKeydown: true, // Whether selection should occur automatically when keyboard shortcuts used minCharacters: 0, // Minimum characters required to trigger API call filterRemoteData: false, // Whether API results should be filtered after being returned for query term saveRemoteData: true, // Whether remote name/value pairs should be stored in sessionStorage to allow remote data to be restored on page refresh throttle: 200, // How long to wait after last user input to search remotely context: window, // Context to use when determining if on screen direction: 'auto', // Whether dropdown should always open in one direction keepOnScreen: true, // Whether dropdown should check whether it is on screen before showing match: 'both', // what to match against with search selection (both, text, or label) fullTextSearch: 'exact', // search anywhere in value (set to 'exact' to require exact matches) highlightMatches: false, // Whether search result should highlight matching strings ignoreDiacritics: false, // match results also if they contain diacritics of the same base character (for example searching for "a" will also match "á" or "â" or "à", etc...) hideDividers: false, // Whether to hide any divider elements (specified in selector.divider) that are sibling to any items when searched (set to true will hide all dividers, set to 'empty' will hide them when they are not followed by a visible item) placeholder: 'auto', // whether to convert blank <select> values to placeholder text preserveHTML: true, // preserve html when selecting value sortSelect: false, // sort selection on init forceSelection: false, // force a choice on blur with search selection allowAdditions: false, // whether multiple select should allow user added values keepSearchTerm: false, // whether the search value should be kept and menu stays filtered on item selection ignoreCase: false, // whether to consider case sensitivity when creating labels ignoreSearchCase: true, // whether to consider case sensitivity when filtering items hideAdditions: true, // whether or not to hide special message prompting a user they can enter a value maxSelections: false, // When set to a number limits the number of selections to this count useLabels: true, // whether multiple select should filter currently active selections from choices delimiter: ',', // when multiselect uses normal <input> the values will be delimited with this character showOnFocus: false, // show menu on focus allowReselection: false, // whether current value should trigger callbacks when reselected allowTab: true, // add tabindex to element allowCategorySelection: false, // allow elements with sub-menus to be selected fireOnInit: false, // Whether callbacks should fire when initializing dropdown values transition: 'auto', // auto transition will slide down or up based on direction duration: 200, // duration of transition displayType: false, // displayType of transition headerDivider: true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup> collapseOnActionable: true, // whether the dropdown should collapse upon selection of an actionable item collapseOnClearable: false, // whether the dropdown should collapse upon clicking the clearable icon // label settings on multi-select label: { transition: 'scale', duration: 200, variation: false, }, // delay before event delay: { hide: 300, show: 200, search: 20, }, /* Callbacks */ onChange: function (value, text, $selected) {}, onAdd: function (value, text, $selected) {}, onRemove: function (value, text, $selected) {}, onActionable: function (value, text, $selected) {}, onSearch: function (searchTerm) {}, onLabelSelect: function ($selectedLabels) {}, onLabelCreate: function (value, text) { return $(this); }, onLabelRemove: function (value) { return true; }, onNoResults: function (searchTerm) { return true; }, onShow: function () {}, onHide: function () {}, /* Component */ name: 'Dropdown', namespace: 'dropdown', message: { addResult: 'Add <b>{term}</b>', count: '{count} selected', maxSelections: 'Max {maxCount} selections', noResults: 'No results found.', serverError: 'There was an error contacting the server', }, error: { action: 'You called a dropdown action that was not defined', alreadySetup: 'Once a select has been initialized behaviors must be called on the created ui dropdown', labels: 'Allowing user additions currently requires the use of labels.', missingMultiple: '<select> requires multiple property to be set to correctly preserve multiple values', method: 'The method you called is not defined.', noAPI: 'The API module is required to load resources remotely', noStorage: 'Saving remote data requires session storage', noElement: 'This module requires ui {element}', noNormalize: '"ignoreDiacritics" setting will be ignored. Browser does not support String().normalize(). You may consider including <https://cdn.jsdelivr.net/npm/unorm@1.4.1/lib/unorm.min.js> as a polyfill.', }, regExp: { escape: /[\s#$()*+,.:=?@[\\\]^{|}-]/g, quote: /"/g, }, metadata: { defaultText: 'defaultText', defaultValue: 'defaultValue', placeholderText: 'placeholder', text: 'text', value: 'value', }, // property names for remote query fields: { remoteValues: 'results', // grouping for api results values: 'values', // grouping for all dropdown values disabled: 'disabled', // whether value should be disabled name: 'name', // displayed dropdown text description: 'description', // displayed dropdown description descriptionVertical: 'descriptionVertical', // whether description should be vertical value: 'value', // actual dropdown value text: 'text', // displayed text when selected data: 'data', // custom data attributes type: 'type', // type of dropdown element image: 'image', // optional image path imageClass: 'imageClass', // optional individual class for image alt: 'alt', // optional alt text for image icon: 'icon', // optional icon name iconClass: 'iconClass', // optional individual class for icon (for example to use flag instead) class: 'class', // optional individual class for item/header divider: 'divider', // optional divider append for group headers actionable: 'actionable', // optional actionable item }, keys: { backspace: 8, deleteKey: 46, enter: 13, escape: 27, pageUp: 33, pageDown: 34, leftArrow: 37, upArrow: 38, rightArrow: 39, downArrow: 40, }, selector: { addition: '.addition', divider: '.divider, .header', dropdown: '.ui.dropdown', hidden: '.hidden', icon: '> .dropdown.icon', input: '> input[type="hidden"], > select', item: '.item', label: '> .label', remove: '> .label > .delete.icon', siblingLabel: '.label', menu: '.menu', message: '.message', menuIcon: '.dropdown.icon', search: 'input.search, .menu > .search > input, .menu input.search', sizer: '> span.sizer', text: '> .text:not(.icon)', unselectable: '.disabled, .filtered', clearIcon: '> .remove.icon', }, className: { active: 'active', addition: 'addition', animating: 'animating', description: 'description', descriptionVertical: 'vertical', disabled: 'disabled', empty: 'empty', dropdown: 'ui dropdown', filtered: 'filtered', hidden: 'hidden transition', icon: 'icon', image: 'image', item: 'item', label: 'ui label', loading: 'loading', menu: 'menu', message: 'message', multiple: 'multiple', placeholder: 'default', sizer: 'sizer', search: 'search', selected: 'selected', selection: 'selection', text: 'text', upward: 'upward', leftward: 'left', visible: 'visible', clearable: 'clearable', noselection: 'noselection', delete: 'delete', header: 'header', divider: 'divider', groupIcon: '', unfilterable: 'unfilterable', actionable: 'actionable', }, }; /* Templates */ $.fn.dropdown.settings.templates = { deQuote: function (string, encode) { return String(string).replace(/"/g, encode ? '"' : ''); }, escape: function (string, preserveHTML) { if (preserveHTML) { return string; } var badChars = /["'<>`]/g, shouldEscape = /["&'<>`]/, escape = { '<': '<', '>': '>', '"': '"', "'": ''', '`': '`', }, escapedChar = function (chr) { return escape[chr]; } ; if (shouldEscape.test(string)) { string = string.replace(/&(?![\d#a-z]{1,12};)/gi, '&'); string = string.replace(badChars, escapedChar); } return string; }, // generates dropdown from select values dropdown: function (select, fields, preserveHTML, className) { var placeholder = select.placeholder || false, html = '', escape = $.fn.dropdown.settings.templates.escape, deQuote = $.fn.dropdown.settings.templates.deQuote ; html += '<i class="dropdown icon"></i>'; html += placeholder ? '<div class="default text">' + escape(placeholder, preserveHTML) + '</div>' : '<div class="text"></div>'; html += '<div class="' + deQuote(className.menu) + '">'; html += $.fn.dropdown.settings.templates.menu(select, fields, preserveHTML, className); html += '</div>'; return html; }, // generates just menu from select menu: function (response, fields, preserveHTML, className) { var values = response[fields.values] || [], html = '', escape = $.fn.dropdown.settings.templates.escape, deQuote = $.fn.dropdown.settings.templates.deQuote ; $.each(values, function (index, option) { var itemType = option[fields.type] || 'item', isMenu = itemType.indexOf('menu') !== -1, maybeData = '', dataObject = option[fields.data] ; if (dataObject) { var dataKey, dataKeyEscaped ; for (dataKey in dataObject) { dataKeyEscaped = String(dataKey).replace(/\W/g, ''); if (Object.prototype.hasOwnProperty.call(dataObject, dataKey) && ['text', 'value'].indexOf(dataKeyEscaped.toLowerCase()) === -1) { maybeData += ' data-' + dataKeyEscaped + '="' + deQuote(String(dataObject[dataKey])) + '"'; } } } if (itemType === 'item' || isMenu) { var maybeText = option[fields.text] ? ' data-text="' + deQuote(option[fields.text], true) + '"' : '', maybeActionable = option[fields.actionable] ? className.actionable + ' ' : '', maybeDisabled = option[fields.disabled] ? className.disabled + ' ' : '', maybeDescriptionVertical = option[fields.descriptionVertical] ? className.descriptionVertical + ' ' : '', hasDescription = escape(option[fields.description] || '', preserveHTML) !== '' ; html += '<div class="' + deQuote(maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] || className.item)) + '" data-value="' + deQuote(option[fields.value], true) + '"' + maybeText + maybeData + '>'; if (isMenu) { html += '<i class="' + (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>'; } if (option[fields.image]) { html += '<img class="' + deQuote(option[fields.imageClass] || className.image) + '" src="' + deQuote(option[fields.image]) + (option[fields.alt] ? '" alt="' + deQuote(option[fields.alt]) : '') + '">'; } if (option[fields.icon]) { html += '<i class="' + deQuote(option[fields.icon] + ' ' + (option[fields.iconClass] || className.icon)) + '"></i>'; } if (hasDescription) { html += '<span class="' + deQuote(className.description) + '">' + escape(option[fields.description] || '', preserveHTML) + '</span>'; html += !isMenu ? '<span class="' + deQuote(className.text) + '">' : ''; } if (isMenu) { html += '<span class="' + deQuote(className.text) + '">'; } html += escape(option[fields.name] || '', preserveHTML); if (isMenu) { html += '</span>'; html += '<div class="' + deQuote(itemType) + '">'; html += $.fn.dropdown.settings.templates.menu(option, fields, preserveHTML, className); html += '</div>'; } else if (hasDescription) { html += '</span>'; } html += '</div>'; } else if (itemType === 'header') { var groupName = escape(option[fields.name] || '', preserveHTML), groupIcon = deQuote(option[fields.icon] || className.groupIcon) ; if (groupName !== '' || groupIcon !== '') { html += '<div class="' + deQuote(option[fields.class] || className.header) + '">'; if (groupIcon !== '') { html += '<i class="' + deQuote(groupIcon + ' ' + (option[fields.iconClass] || className.icon)) + '"></i>'; } html += groupName; html += '</div>'; } if (option[fields.divider]) { html += '<div class="' + deQuote(className.divider) + '"></div>'; } } }); return html; }, // generates label for multiselect label: function (value, text, preserveHTML, className) { var escape = $.fn.dropdown.settings.templates.escape, deQuote = $.fn.dropdown.settings.templates.deQuote ; return escape(text, preserveHTML) + '<i class="' + deQuote(className.delete) + ' icon"></i>'; }, // generates messages like "No results" message: function (message) { return message; }, // generates user addition to selection menu addition: function (choice) { return choice; }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/embed.css ================================================ /*! * # Fomantic-UI 2.9.4 - Embed * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Types *******************************/ .ui.embed { position: relative; max-width: 100%; height: 0; overflow: hidden; background: #dcddde; padding-bottom: 56.25%; } /* ----------------- Embedded Content ------------------ */ .ui.embed iframe, .ui.embed embed, .ui.embed object { position: absolute; border: none; width: 100%; height: 100%; top: 0; left: 0; margin: 0; padding: 0; overflow: hidden; } /* ----------------- Embed ------------------ */ .ui.embed > .embed { display: none; } /* -------------- Placeholder --------------- */ .ui.embed > .placeholder { position: absolute; cursor: pointer; top: 0; left: 0; display: block; width: 100%; height: 100%; background: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); } /* -------------- Icon --------------- */ .ui.embed > i.icon { cursor: pointer; position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 2; } .ui.embed > i.icon::after { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 3; content: ""; background: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); opacity: 0.5; transition: opacity 0.5s ease; } .ui.embed > i.icon::before { position: absolute; top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%); color: #fff; font-size: 6rem; text-shadow: 0 2px 10px rgba(34, 36, 38, 0.2); transition: opacity 0.5s ease, color 0.5s ease; z-index: 10; } /******************************* States *******************************/ /* -------------- Hover --------------- */ .ui.embed i.icon:hover::after { background: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); opacity: 1; } .ui.embed i.icon:hover::before { color: #fff; } /* -------------- Active --------------- */ .ui.active.embed > i.icon, .ui.active.embed > .placeholder { display: none; } .ui.active.embed > .embed { display: block; } /******************************* Variations *******************************/ .ui.square.embed { padding-bottom: 100%; } .ui[class*="4:3"].embed { padding-bottom: 75%; } .ui[class*="16:9"].embed { padding-bottom: 56.25%; } .ui[class*="21:9"].embed { padding-bottom: 42.85714286%; } /******************************* Video Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/embed.js ================================================ /*! * # Fomantic-UI 2.9.4 - Embed * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.embed = function (parameters) { var $allModules = $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.embed.settings, parameters) : $.extend({}, $.fn.embed.settings), selector = settings.selector, className = settings.className, sources = settings.sources, error = settings.error, metadata = settings.metadata, namespace = settings.namespace, templates = settings.templates, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $placeholder = $module.find(selector.placeholder), $icon = $module.find(selector.icon), $embed = $module.find(selector.embed), element = this, instance = $module.data(moduleNamespace), module ; module = { initialize: function () { module.debug('Initializing embed'); module.determine.autoplay(); module.create(); module.bind.events(); module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.verbose('Destroying previous instance of embed'); module.reset(); $module .removeData(moduleNamespace) .off(eventNamespace) ; }, refresh: function () { module.verbose('Refreshing selector cache'); $placeholder = $module.find(selector.placeholder); $icon = $module.find(selector.icon); $embed = $module.find(selector.embed); }, bind: { events: function () { if (module.has.placeholder()) { module.debug('Adding placeholder events'); $module .on('click' + eventNamespace, selector.placeholder, module.createAndShow) .on('click' + eventNamespace, selector.icon, module.createAndShow) ; } }, }, create: function () { var placeholder = module.get.placeholder() ; if (placeholder) { module.createPlaceholder(); } else { module.createAndShow(); } }, createPlaceholder: function (placeholder) { var icon = module.get.icon(), alt = module.get.alt() ; placeholder = placeholder || module.get.placeholder(); $module.html(templates.placeholder(placeholder, icon, alt)); module.debug('Creating placeholder for embed', placeholder, icon, alt); }, createEmbed: function (url) { module.refresh(); url = url || module.get.url(); $embed = $('<div/>') .addClass(className.embed) .html(module.generate.embed(url)) .appendTo($module) ; settings.onCreate.call(element, url); module.debug('Creating embed object', $embed); }, changeEmbed: function (url) { $embed .html(module.generate.embed(url)) ; }, createAndShow: function () { module.createEmbed(); module.show(); }, // sets new embed change: function (source, id, url) { module.debug('Changing video to ', source, id, url); $module .data(metadata.source, source) .data(metadata.id, id) ; if (url) { $module.data(metadata.url, url); } else { $module.removeData(metadata.url); } if (module.has.embed()) { module.changeEmbed(); } else { module.create(); } }, // clears embed reset: function () { module.debug('Clearing embed and showing placeholder'); module.remove.data(); module.remove.active(); module.remove.embed(); module.showPlaceholder(); settings.onReset.call(element); }, // shows current embed show: function () { module.debug('Showing embed'); module.set.active(); settings.onDisplay.call(element); }, hide: function () { module.debug('Hiding embed'); module.showPlaceholder(); }, showPlaceholder: function () { module.debug('Showing placeholder image'); module.remove.active(); settings.onPlaceholderDisplay.call(element); }, get: { id: function () { return settings.id || $module.data(metadata.id); }, placeholder: function () { return settings.placeholder || $module.data(metadata.placeholder); }, alt: function () { return settings.alt || $module.data(metadata.alt); }, icon: function () { return settings.icon || ($module.data(metadata.icon) !== undefined ? $module.data(metadata.icon) : module.determine.icon()); }, source: function (url) { return settings.source || ($module.data(metadata.source) !== undefined ? $module.data(metadata.source) : module.determine.source()); }, type: function () { var source = module.get.source(); return sources[source] !== undefined ? sources[source].type : false; }, url: function () { return settings.url || ($module.data(metadata.url) !== undefined ? $module.data(metadata.url) : module.determine.url()); }, }, determine: { autoplay: function () { if (module.should.autoplay()) { settings.autoplay = true; } }, source: function (url) { var matchedSource = false ; url = url || module.get.url(); if (url) { $.each(sources, function (name, source) { if (url.search(source.domain) !== -1) { matchedSource = name; return false; } }); } return matchedSource; }, icon: function () { var source = module.get.source() ; return sources[source] !== undefined ? sources[source].icon : false; }, url: function () { var id = settings.id || $module.data(metadata.id), source = settings.source || $module.data(metadata.source), url ; url = sources[source] !== undefined ? sources[source].url.replace('{id}', id) : false; if (url) { $module.data(metadata.url, url); } return url; }, }, set: { active: function () { $module.addClass(className.active); }, }, remove: { data: function () { $module .removeData(metadata.id) .removeData(metadata.icon) .removeData(metadata.placeholder) .removeData(metadata.alt) .removeData(metadata.source) .removeData(metadata.url) ; }, active: function () { $module.removeClass(className.active); }, embed: function () { $embed.empty(); }, }, encode: { parameters: function (parameters) { var urlString = [], index ; for (index in parameters) { urlString.push(encodeURIComponent(index) + '=' + encodeURIComponent(parameters[index])); } return urlString.join('&'); }, }, generate: { embed: function (url) { module.debug('Generating embed html'); var source = module.get.source(), html, parameters ; url = module.get.url(url); if (url) { parameters = module.generate.parameters(source); html = templates.iframe(url, parameters); } else { module.error(error.noURL, $module); } return html; }, parameters: function (source, extraParameters) { var parameters = sources[source] && sources[source].parameters !== undefined ? sources[source].parameters(settings) : {} ; extraParameters = extraParameters || settings.parameters; if (extraParameters) { parameters = $.extend({}, parameters, extraParameters); } parameters = settings.onEmbed(parameters); return module.encode.parameters(parameters); }, }, has: { embed: function () { return $embed.length > 0; }, placeholder: function () { return settings.placeholder || $module.data(metadata.placeholder); }, }, should: { autoplay: function () { return settings.autoplay === 'auto' ? settings.placeholder || $module.data(metadata.placeholder) !== undefined : settings.autoplay; }, }, is: { video: function () { return module.get.type() === 'video'; }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if ($allModules.length > 1) { title += ' (' + $allModules.length + ')'; } if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.embed.settings = { name: 'Embed', namespace: 'embed', silent: false, debug: false, verbose: false, performance: true, icon: false, source: false, url: false, id: false, placeholder: false, alt: false, // standard video settings autoplay: 'auto', color: '#444', hd: true, brandedUI: false, // additional parameters to include with the embed parameters: false, onDisplay: function () {}, onPlaceholderDisplay: function () {}, onReset: function () {}, onCreate: function (url) {}, onEmbed: function (parameters) { return parameters; }, metadata: { id: 'id', icon: 'icon', placeholder: 'placeholder', alt: 'alt', source: 'source', url: 'url', }, error: { noURL: 'No URL specified', method: 'The method you called is not defined', }, className: { active: 'active', embed: 'embed', }, selector: { embed: '.embed', placeholder: '.placeholder', icon: '.icon', }, sources: { youtube: { name: 'youtube', type: 'video', icon: 'video play', domain: 'youtube.com', url: '//www.youtube.com/embed/{id}', parameters: function (settings) { return { autohide: !settings.brandedUI, autoplay: settings.autoplay, color: settings.color || undefined, hq: settings.hd, jsapi: settings.api, modestbranding: !settings.brandedUI, }; }, }, vimeo: { name: 'vimeo', type: 'video', icon: 'video play', domain: 'vimeo.com', url: '//player.vimeo.com/video/{id}', parameters: function (settings) { return { api: settings.api, autoplay: settings.autoplay, byline: settings.brandedUI, color: settings.color || undefined, portrait: settings.brandedUI, title: settings.brandedUI, }; }, }, }, templates: { deQuote: function (string, encode) { return String(string).replace(/"/g, encode ? '"' : ''); }, iframe: function (url, parameters) { var src = url, deQuote = $.fn.embed.settings.templates.deQuote ; if (parameters) { src += '?' + parameters; } return '' + '<iframe src="' + deQuote(src) + '"' + ' width="100%" height="100%"' + ' msallowFullScreen allowFullScreen></iframe>'; }, placeholder: function (image, icon, alt) { var html = '', deQuote = $.fn.embed.settings.templates.deQuote ; if (icon) { html += '<i class="' + deQuote(icon) + ' icon"></i>'; } if (image) { html += '<img class="placeholder" src="' + deQuote(image) + (alt ? '" alt="' + deQuote(alt) : '') + '">'; } return html; }, }, // NOT YET IMPLEMENTED api: false, onPause: function () {}, onPlay: function () {}, onStop: function () {}, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/emoji.css ================================================ /*! * # Fomantic-UI 2.9.4 - Emoji * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Emoji *******************************/ em[data-emoji] { opacity: 1; speak: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; } em[data-emoji]::before { content: "\00A0\00A0\00A0\00A0\00A0\00A0\00A0"; display: inline-block; line-height: 1em; background-repeat: no-repeat; background-position: center center; } /******************************* States *******************************/ em[data-emoji].disabled { opacity: 0.45; } /******************************* Variations *******************************/ em[data-emoji].loading::before { animation: loader 2s linear infinite; } /* ------------------- Link -------------------- */ em[data-emoji].link:not(.disabled) { cursor: pointer; } /* rtl:begin:ignore */ em[data-emoji].small { font-size: 1.5em; vertical-align: middle; } em[data-emoji].medium { font-size: 3em; vertical-align: middle; } em[data-emoji].large { font-size: 6em; vertical-align: middle; } em[data-emoji].big { font-size: 7.5em; vertical-align: middle; } em[data-emoji=":interrobang:"]::before, em[data-emoji="interrobang"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2049.svg"); } em[data-emoji=":tm:"]::before, em[data-emoji="tm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2122.svg"); } em[data-emoji=":information_source:"]::before, em[data-emoji="information_source"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2139.svg"); } em[data-emoji=":left_right_arrow:"]::before, em[data-emoji="left_right_arrow"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2194.svg"); } em[data-emoji=":arrow_up_down:"]::before, em[data-emoji="arrow_up_down"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2195.svg"); } em[data-emoji=":arrow_upper_left:"]::before, em[data-emoji="arrow_upper_left"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2196.svg"); } em[data-emoji=":arrow_upper_right:"]::before, em[data-emoji="arrow_upper_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2197.svg"); } em[data-emoji=":arrow_lower_right:"]::before, em[data-emoji="arrow_lower_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2198.svg"); } em[data-emoji=":arrow_lower_left:"]::before, em[data-emoji="arrow_lower_left"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2199.svg"); } em[data-emoji=":keyboard:"]::before, em[data-emoji="keyboard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2328.svg"); } em[data-emoji=":sunny:"]::before, em[data-emoji="sunny"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2600.svg"); } em[data-emoji=":cloud:"]::before, em[data-emoji="cloud"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2601.svg"); } em[data-emoji=":umbrella2:"]::before, em[data-emoji="umbrella2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2602.svg"); } em[data-emoji=":snowman2:"]::before, em[data-emoji="snowman2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2603.svg"); } em[data-emoji=":comet:"]::before, em[data-emoji="comet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2604.svg"); } em[data-emoji=":ballot_box_with_check:"]::before, em[data-emoji="ballot_box_with_check"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2611.svg"); } em[data-emoji=":umbrella:"]::before, em[data-emoji="umbrella"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2614.svg"); } em[data-emoji=":coffee:"]::before, em[data-emoji="coffee"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2615.svg"); } em[data-emoji=":shamrock:"]::before, em[data-emoji="shamrock"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2618.svg"); } em[data-emoji=":skull_crossbones:"]::before, em[data-emoji="skull_crossbones"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2620.svg"); } em[data-emoji=":radioactive:"]::before, em[data-emoji="radioactive"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2622.svg"); } em[data-emoji=":biohazard:"]::before, em[data-emoji="biohazard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2623.svg"); } em[data-emoji=":orthodox_cross:"]::before, em[data-emoji="orthodox_cross"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2626.svg"); } em[data-emoji=":wheel_of_dharma:"]::before, em[data-emoji="wheel_of_dharma"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2638.svg"); } em[data-emoji=":frowning2:"]::before, em[data-emoji="frowning2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2639.svg"); } em[data-emoji=":female_sign:"]::before, em[data-emoji="female_sign"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2640.svg"); } em[data-emoji=":male_sign:"]::before, em[data-emoji="male_sign"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2642.svg"); } em[data-emoji=":aries:"]::before, em[data-emoji="aries"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2648.svg"); } em[data-emoji=":taurus:"]::before, em[data-emoji="taurus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2649.svg"); } em[data-emoji=":sagittarius:"]::before, em[data-emoji="sagittarius"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2650.svg"); } em[data-emoji=":capricorn:"]::before, em[data-emoji="capricorn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2651.svg"); } em[data-emoji=":aquarius:"]::before, em[data-emoji="aquarius"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2652.svg"); } em[data-emoji=":pisces:"]::before, em[data-emoji="pisces"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2653.svg"); } em[data-emoji=":spades:"]::before, em[data-emoji="spades"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2660.svg"); } em[data-emoji=":clubs:"]::before, em[data-emoji="clubs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2663.svg"); } em[data-emoji=":hearts:"]::before, em[data-emoji="hearts"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2665.svg"); } em[data-emoji=":diamonds:"]::before, em[data-emoji="diamonds"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2666.svg"); } em[data-emoji=":hotsprings:"]::before, em[data-emoji="hotsprings"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2668.svg"); } em[data-emoji=":hammer_pick:"]::before, em[data-emoji="hammer_pick"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2692.svg"); } em[data-emoji=":anchor:"]::before, em[data-emoji="anchor"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2693.svg"); } em[data-emoji=":crossed_swords:"]::before, em[data-emoji="crossed_swords"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2694.svg"); } em[data-emoji=":medical_symbol:"]::before, em[data-emoji="medical_symbol"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2695.svg"); } em[data-emoji=":scales:"]::before, em[data-emoji="scales"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2696.svg"); } em[data-emoji=":alembic:"]::before, em[data-emoji="alembic"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2697.svg"); } em[data-emoji=":gear:"]::before, em[data-emoji="gear"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2699.svg"); } em[data-emoji=":scissors:"]::before, em[data-emoji="scissors"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2702.svg"); } em[data-emoji=":white_check_mark:"]::before, em[data-emoji="white_check_mark"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2705.svg"); } em[data-emoji=":airplane:"]::before, em[data-emoji="airplane"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2708.svg"); } em[data-emoji=":envelope:"]::before, em[data-emoji="envelope"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2709.svg"); } em[data-emoji=":black_nib:"]::before, em[data-emoji="black_nib"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2712.svg"); } em[data-emoji=":heavy_check_mark:"]::before, em[data-emoji="heavy_check_mark"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2714.svg"); } em[data-emoji=":heavy_multiplication_x:"]::before, em[data-emoji="heavy_multiplication_x"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2716.svg"); } em[data-emoji=":star_of_david:"]::before, em[data-emoji="star_of_david"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2721.svg"); } em[data-emoji=":sparkles:"]::before, em[data-emoji="sparkles"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2728.svg"); } em[data-emoji=":eight_spoked_asterisk:"]::before, em[data-emoji="eight_spoked_asterisk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2733.svg"); } em[data-emoji=":eight_pointed_black_star:"]::before, em[data-emoji="eight_pointed_black_star"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2734.svg"); } em[data-emoji=":snowflake:"]::before, em[data-emoji="snowflake"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2744.svg"); } em[data-emoji=":sparkle:"]::before, em[data-emoji="sparkle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2747.svg"); } em[data-emoji=":question:"]::before, em[data-emoji="question"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2753.svg"); } em[data-emoji=":grey_question:"]::before, em[data-emoji="grey_question"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2754.svg"); } em[data-emoji=":grey_exclamation:"]::before, em[data-emoji="grey_exclamation"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2755.svg"); } em[data-emoji=":exclamation:"]::before, em[data-emoji="exclamation"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2757.svg"); } em[data-emoji=":heart_exclamation:"]::before, em[data-emoji="heart_exclamation"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2763.svg"); } em[data-emoji=":heart:"]::before, em[data-emoji="heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2764.svg"); } em[data-emoji=":heavy_plus_sign:"]::before, em[data-emoji="heavy_plus_sign"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2795.svg"); } em[data-emoji=":heavy_minus_sign:"]::before, em[data-emoji="heavy_minus_sign"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2796.svg"); } em[data-emoji=":heavy_division_sign:"]::before, em[data-emoji="heavy_division_sign"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2797.svg"); } em[data-emoji=":arrow_heading_up:"]::before, em[data-emoji="arrow_heading_up"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2934.svg"); } em[data-emoji=":arrow_heading_down:"]::before, em[data-emoji="arrow_heading_down"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2935.svg"); } em[data-emoji=":wavy_dash:"]::before, em[data-emoji="wavy_dash"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/3030.svg"); } em[data-emoji=":congratulations:"]::before, em[data-emoji="congratulations"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/3297.svg"); } em[data-emoji=":secret:"]::before, em[data-emoji="secret"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/3299.svg"); } em[data-emoji=":grinning:"]::before, em[data-emoji="grinning"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f600.svg"); } em[data-emoji=":smiley:"]::before, em[data-emoji="smiley"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f603.svg"); } em[data-emoji=":smile:"]::before, em[data-emoji="smile"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f604.svg"); } em[data-emoji=":grin:"]::before, em[data-emoji="grin"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f601.svg"); } em[data-emoji=":laughing:"]::before, em[data-emoji="laughing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f606.svg"); } em[data-emoji=":face_holding_back_tears:"]::before, em[data-emoji="face_holding_back_tears"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f979.svg"); } em[data-emoji=":sweat_smile:"]::before, em[data-emoji="sweat_smile"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f605.svg"); } em[data-emoji=":joy:"]::before, em[data-emoji="joy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f602.svg"); } em[data-emoji=":rofl:"]::before, em[data-emoji="rofl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f923.svg"); } em[data-emoji=":smiling_face_with_tear:"]::before, em[data-emoji="smiling_face_with_tear"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f972.svg"); } em[data-emoji=":relaxed:"]::before, em[data-emoji="relaxed"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/263a.svg"); } em[data-emoji=":blush:"]::before, em[data-emoji="blush"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60a.svg"); } em[data-emoji=":innocent:"]::before, em[data-emoji="innocent"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f607.svg"); } em[data-emoji=":slight_smile:"]::before, em[data-emoji="slight_smile"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f642.svg"); } em[data-emoji=":upside_down:"]::before, em[data-emoji="upside_down"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f643.svg"); } em[data-emoji=":wink:"]::before, em[data-emoji="wink"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f609.svg"); } em[data-emoji=":relieved:"]::before, em[data-emoji="relieved"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60c.svg"); } em[data-emoji=":heart_eyes:"]::before, em[data-emoji="heart_eyes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60d.svg"); } em[data-emoji=":smiling_face_with_3_hearts:"]::before, em[data-emoji="smiling_face_with_3_hearts"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f970.svg"); } em[data-emoji=":kissing_heart:"]::before, em[data-emoji="kissing_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f618.svg"); } em[data-emoji=":kissing:"]::before, em[data-emoji="kissing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f617.svg"); } em[data-emoji=":kissing_smiling_eyes:"]::before, em[data-emoji="kissing_smiling_eyes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f619.svg"); } em[data-emoji=":kissing_closed_eyes:"]::before, em[data-emoji="kissing_closed_eyes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61a.svg"); } em[data-emoji=":yum:"]::before, em[data-emoji="yum"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60b.svg"); } em[data-emoji=":stuck_out_tongue:"]::before, em[data-emoji="stuck_out_tongue"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61b.svg"); } em[data-emoji=":stuck_out_tongue_closed_eyes:"]::before, em[data-emoji="stuck_out_tongue_closed_eyes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61d.svg"); } em[data-emoji=":stuck_out_tongue_winking_eye:"]::before, em[data-emoji="stuck_out_tongue_winking_eye"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61c.svg"); } em[data-emoji=":zany_face:"]::before, em[data-emoji="zany_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92a.svg"); } em[data-emoji=":face_with_raised_eyebrow:"]::before, em[data-emoji="face_with_raised_eyebrow"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f928.svg"); } em[data-emoji=":face_with_monocle:"]::before, em[data-emoji="face_with_monocle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d0.svg"); } em[data-emoji=":nerd:"]::before, em[data-emoji="nerd"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f913.svg"); } em[data-emoji=":sunglasses:"]::before, em[data-emoji="sunglasses"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60e.svg"); } em[data-emoji=":disguised_face:"]::before, em[data-emoji="disguised_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f978.svg"); } em[data-emoji=":star_struck:"]::before, em[data-emoji="star_struck"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f929.svg"); } em[data-emoji=":partying_face:"]::before, em[data-emoji="partying_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f973.svg"); } em[data-emoji=":smirk:"]::before, em[data-emoji="smirk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f60f.svg"); } em[data-emoji=":unamused:"]::before, em[data-emoji="unamused"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f612.svg"); } em[data-emoji=":disappointed:"]::before, em[data-emoji="disappointed"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61e.svg"); } em[data-emoji=":pensive:"]::before, em[data-emoji="pensive"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f614.svg"); } em[data-emoji=":worried:"]::before, em[data-emoji="worried"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f61f.svg"); } em[data-emoji=":confused:"]::before, em[data-emoji="confused"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f615.svg"); } em[data-emoji=":slight_frown:"]::before, em[data-emoji="slight_frown"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f641.svg"); } em[data-emoji=":persevere:"]::before, em[data-emoji="persevere"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f623.svg"); } em[data-emoji=":confounded:"]::before, em[data-emoji="confounded"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f616.svg"); } em[data-emoji=":tired_face:"]::before, em[data-emoji="tired_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62b.svg"); } em[data-emoji=":weary:"]::before, em[data-emoji="weary"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f629.svg"); } em[data-emoji=":pleading_face:"]::before, em[data-emoji="pleading_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97a.svg"); } em[data-emoji=":cry:"]::before, em[data-emoji="cry"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f622.svg"); } em[data-emoji=":sob:"]::before, em[data-emoji="sob"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62d.svg"); } em[data-emoji=":triumph:"]::before, em[data-emoji="triumph"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f624.svg"); } em[data-emoji=":angry:"]::before, em[data-emoji="angry"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f620.svg"); } em[data-emoji=":rage:"]::before, em[data-emoji="rage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f621.svg"); } em[data-emoji=":face_with_symbols_over_mouth:"]::before, em[data-emoji="face_with_symbols_over_mouth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92c.svg"); } em[data-emoji=":exploding_head:"]::before, em[data-emoji="exploding_head"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92f.svg"); } em[data-emoji=":flushed:"]::before, em[data-emoji="flushed"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f633.svg"); } em[data-emoji=":hot_face:"]::before, em[data-emoji="hot_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f975.svg"); } em[data-emoji=":cold_face:"]::before, em[data-emoji="cold_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f976.svg"); } em[data-emoji=":face_in_clouds:"]::before, em[data-emoji="face_in_clouds"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f636-200d-1f32b-fe0f.svg"); } em[data-emoji=":scream:"]::before, em[data-emoji="scream"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f631.svg"); } em[data-emoji=":fearful:"]::before, em[data-emoji="fearful"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f628.svg"); } em[data-emoji=":cold_sweat:"]::before, em[data-emoji="cold_sweat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f630.svg"); } em[data-emoji=":disappointed_relieved:"]::before, em[data-emoji="disappointed_relieved"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f625.svg"); } em[data-emoji=":sweat:"]::before, em[data-emoji="sweat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f613.svg"); } em[data-emoji=":hugging:"]::before, em[data-emoji="hugging"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f917.svg"); } em[data-emoji=":thinking:"]::before, em[data-emoji="thinking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f914.svg"); } em[data-emoji=":face_with_peeking_eye:"]::before, em[data-emoji="face_with_peeking_eye"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae3.svg"); } em[data-emoji=":face_with_hand_over_mouth:"]::before, em[data-emoji="face_with_hand_over_mouth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92d.svg"); } em[data-emoji=":face_with_open_eyes_and_hand_over_mouth:"]::before, em[data-emoji="face_with_open_eyes_and_hand_over_mouth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae2.svg"); } em[data-emoji=":saluting_face:"]::before, em[data-emoji="saluting_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae1.svg"); } em[data-emoji=":shushing_face:"]::before, em[data-emoji="shushing_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92b.svg"); } em[data-emoji=":melting_face:"]::before, em[data-emoji="melting_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae0.svg"); } em[data-emoji=":lying_face:"]::before, em[data-emoji="lying_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f925.svg"); } em[data-emoji=":no_mouth:"]::before, em[data-emoji="no_mouth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f636.svg"); } em[data-emoji=":dotted_line_face:"]::before, em[data-emoji="dotted_line_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae5.svg"); } em[data-emoji=":neutral_face:"]::before, em[data-emoji="neutral_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f610.svg"); } em[data-emoji=":face_with_diagonal_mouth:"]::before, em[data-emoji="face_with_diagonal_mouth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae4.svg"); } em[data-emoji=":expressionless:"]::before, em[data-emoji="expressionless"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f611.svg"); } em[data-emoji=":shaking_face:"]::before, em[data-emoji="shaking_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae8.svg"); } em[data-emoji=":head_shaking_horizontally:"]::before, em[data-emoji="head_shaking_horizontally"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f642-200d-2194-fe0f.svg"); } em[data-emoji=":head_shaking_vertically:"]::before, em[data-emoji="head_shaking_vertically"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f642-200d-2195-fe0f.svg"); } em[data-emoji=":grimacing:"]::before, em[data-emoji="grimacing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62c.svg"); } em[data-emoji=":rolling_eyes:"]::before, em[data-emoji="rolling_eyes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f644.svg"); } em[data-emoji=":hushed:"]::before, em[data-emoji="hushed"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62f.svg"); } em[data-emoji=":frowning:"]::before, em[data-emoji="frowning"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f626.svg"); } em[data-emoji=":anguished:"]::before, em[data-emoji="anguished"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f627.svg"); } em[data-emoji=":open_mouth:"]::before, em[data-emoji="open_mouth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62e.svg"); } em[data-emoji=":astonished:"]::before, em[data-emoji="astonished"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f632.svg"); } em[data-emoji=":yawning_face:"]::before, em[data-emoji="yawning_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f971.svg"); } em[data-emoji=":sleeping:"]::before, em[data-emoji="sleeping"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f634.svg"); } em[data-emoji=":drooling_face:"]::before, em[data-emoji="drooling_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f924.svg"); } em[data-emoji=":sleepy:"]::before, em[data-emoji="sleepy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62a.svg"); } em[data-emoji=":face_exhaling:"]::before, em[data-emoji="face_exhaling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f62e-200d-1f4a8.svg"); } em[data-emoji=":dizzy_face:"]::before, em[data-emoji="dizzy_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f635.svg"); } em[data-emoji=":face_with_spiral_eyes:"]::before, em[data-emoji="face_with_spiral_eyes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f635-200d-1f4ab.svg"); } em[data-emoji=":zipper_mouth:"]::before, em[data-emoji="zipper_mouth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f910.svg"); } em[data-emoji=":woozy_face:"]::before, em[data-emoji="woozy_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f974.svg"); } em[data-emoji=":nauseated_face:"]::before, em[data-emoji="nauseated_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f922.svg"); } em[data-emoji=":face_vomiting:"]::before, em[data-emoji="face_vomiting"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f92e.svg"); } em[data-emoji=":sneezing_face:"]::before, em[data-emoji="sneezing_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f927.svg"); } em[data-emoji=":mask:"]::before, em[data-emoji="mask"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f637.svg"); } em[data-emoji=":thermometer_face:"]::before, em[data-emoji="thermometer_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f912.svg"); } em[data-emoji=":head_bandage:"]::before, em[data-emoji="head_bandage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f915.svg"); } em[data-emoji=":money_mouth:"]::before, em[data-emoji="money_mouth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f911.svg"); } em[data-emoji=":cowboy:"]::before, em[data-emoji="cowboy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f920.svg"); } em[data-emoji=":smiling_imp:"]::before, em[data-emoji="smiling_imp"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f608.svg"); } em[data-emoji=":imp:"]::before, em[data-emoji="imp"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47f.svg"); } em[data-emoji=":japanese_ogre:"]::before, em[data-emoji="japanese_ogre"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f479.svg"); } em[data-emoji=":japanese_goblin:"]::before, em[data-emoji="japanese_goblin"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47a.svg"); } em[data-emoji=":clown:"]::before, em[data-emoji="clown"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f921.svg"); } em[data-emoji=":poop:"]::before, em[data-emoji="poop"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a9.svg"); } em[data-emoji=":ghost:"]::before, em[data-emoji="ghost"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47b.svg"); } em[data-emoji=":skull:"]::before, em[data-emoji="skull"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f480.svg"); } em[data-emoji=":alien:"]::before, em[data-emoji="alien"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47d.svg"); } em[data-emoji=":space_invader:"]::before, em[data-emoji="space_invader"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47e.svg"); } em[data-emoji=":robot:"]::before, em[data-emoji="robot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f916.svg"); } em[data-emoji=":jack_o_lantern:"]::before, em[data-emoji="jack_o_lantern"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f383.svg"); } em[data-emoji=":smiley_cat:"]::before, em[data-emoji="smiley_cat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63a.svg"); } em[data-emoji=":smile_cat:"]::before, em[data-emoji="smile_cat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f638.svg"); } em[data-emoji=":joy_cat:"]::before, em[data-emoji="joy_cat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f639.svg"); } em[data-emoji=":heart_eyes_cat:"]::before, em[data-emoji="heart_eyes_cat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63b.svg"); } em[data-emoji=":smirk_cat:"]::before, em[data-emoji="smirk_cat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63c.svg"); } em[data-emoji=":kissing_cat:"]::before, em[data-emoji="kissing_cat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63d.svg"); } em[data-emoji=":scream_cat:"]::before, em[data-emoji="scream_cat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f640.svg"); } em[data-emoji=":crying_cat_face:"]::before, em[data-emoji="crying_cat_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63f.svg"); } em[data-emoji=":pouting_cat:"]::before, em[data-emoji="pouting_cat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f63e.svg"); } em[data-emoji=":heart_hands:"]::before, em[data-emoji="heart_hands"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6.svg"); } em[data-emoji=":heart_hands_tone1:"]::before, em[data-emoji="heart_hands_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6-1f3fb.svg"); } em[data-emoji=":heart_hands_tone2:"]::before, em[data-emoji="heart_hands_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6-1f3fc.svg"); } em[data-emoji=":heart_hands_tone3:"]::before, em[data-emoji="heart_hands_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6-1f3fd.svg"); } em[data-emoji=":heart_hands_tone4:"]::before, em[data-emoji="heart_hands_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6-1f3fe.svg"); } em[data-emoji=":heart_hands_tone5:"]::before, em[data-emoji="heart_hands_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf6-1f3ff.svg"); } em[data-emoji=":palms_up_together:"]::before, em[data-emoji="palms_up_together"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932.svg"); } em[data-emoji=":palms_up_together_tone1:"]::before, em[data-emoji="palms_up_together_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932-1f3fb.svg"); } em[data-emoji=":palms_up_together_tone2:"]::before, em[data-emoji="palms_up_together_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932-1f3fc.svg"); } em[data-emoji=":palms_up_together_tone3:"]::before, em[data-emoji="palms_up_together_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932-1f3fd.svg"); } em[data-emoji=":palms_up_together_tone4:"]::before, em[data-emoji="palms_up_together_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932-1f3fe.svg"); } em[data-emoji=":palms_up_together_tone5:"]::before, em[data-emoji="palms_up_together_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f932-1f3ff.svg"); } em[data-emoji=":open_hands:"]::before, em[data-emoji="open_hands"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450.svg"); } em[data-emoji=":open_hands_tone1:"]::before, em[data-emoji="open_hands_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450-1f3fb.svg"); } em[data-emoji=":open_hands_tone2:"]::before, em[data-emoji="open_hands_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450-1f3fc.svg"); } em[data-emoji=":open_hands_tone3:"]::before, em[data-emoji="open_hands_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450-1f3fd.svg"); } em[data-emoji=":open_hands_tone4:"]::before, em[data-emoji="open_hands_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450-1f3fe.svg"); } em[data-emoji=":open_hands_tone5:"]::before, em[data-emoji="open_hands_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f450-1f3ff.svg"); } em[data-emoji=":raised_hands:"]::before, em[data-emoji="raised_hands"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c.svg"); } em[data-emoji=":raised_hands_tone1:"]::before, em[data-emoji="raised_hands_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c-1f3fb.svg"); } em[data-emoji=":raised_hands_tone2:"]::before, em[data-emoji="raised_hands_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c-1f3fc.svg"); } em[data-emoji=":raised_hands_tone3:"]::before, em[data-emoji="raised_hands_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c-1f3fd.svg"); } em[data-emoji=":raised_hands_tone4:"]::before, em[data-emoji="raised_hands_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c-1f3fe.svg"); } em[data-emoji=":raised_hands_tone5:"]::before, em[data-emoji="raised_hands_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64c-1f3ff.svg"); } em[data-emoji=":clap:"]::before, em[data-emoji="clap"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f.svg"); } em[data-emoji=":clap_tone1:"]::before, em[data-emoji="clap_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f-1f3fb.svg"); } em[data-emoji=":clap_tone2:"]::before, em[data-emoji="clap_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f-1f3fc.svg"); } em[data-emoji=":clap_tone3:"]::before, em[data-emoji="clap_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f-1f3fd.svg"); } em[data-emoji=":clap_tone4:"]::before, em[data-emoji="clap_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f-1f3fe.svg"); } em[data-emoji=":clap_tone5:"]::before, em[data-emoji="clap_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44f-1f3ff.svg"); } em[data-emoji=":handshake:"]::before, em[data-emoji="handshake"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d.svg"); } em[data-emoji=":handshake_tone1:"]::before, em[data-emoji="handshake_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d-1f3fb.svg"); } em[data-emoji=":handshake_tone1_tone2:"]::before, em[data-emoji="handshake_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fb-200d-1faf2-1f3fc.svg"); } em[data-emoji=":handshake_tone1_tone3:"]::before, em[data-emoji="handshake_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fb-200d-1faf2-1f3fd.svg"); } em[data-emoji=":handshake_tone1_tone4:"]::before, em[data-emoji="handshake_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fb-200d-1faf2-1f3fe.svg"); } em[data-emoji=":handshake_tone1_tone5:"]::before, em[data-emoji="handshake_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fb-200d-1faf2-1f3ff.svg"); } em[data-emoji=":handshake_tone2_tone1:"]::before, em[data-emoji="handshake_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fc-200d-1faf2-1f3fb.svg"); } em[data-emoji=":handshake_tone2:"]::before, em[data-emoji="handshake_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d-1f3fc.svg"); } em[data-emoji=":handshake_tone2_tone3:"]::before, em[data-emoji="handshake_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fc-200d-1faf2-1f3fd.svg"); } em[data-emoji=":handshake_tone2_tone4:"]::before, em[data-emoji="handshake_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fc-200d-1faf2-1f3fe.svg"); } em[data-emoji=":handshake_tone2_tone5:"]::before, em[data-emoji="handshake_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fc-200d-1faf2-1f3ff.svg"); } em[data-emoji=":handshake_tone3_tone1:"]::before, em[data-emoji="handshake_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fd-200d-1faf2-1f3fb.svg"); } em[data-emoji=":handshake_tone3_tone2:"]::before, em[data-emoji="handshake_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fd-200d-1faf2-1f3fc.svg"); } em[data-emoji=":handshake_tone3:"]::before, em[data-emoji="handshake_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d-1f3fd.svg"); } em[data-emoji=":handshake_tone3_tone4:"]::before, em[data-emoji="handshake_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fd-200d-1faf2-1f3fe.svg"); } em[data-emoji=":handshake_tone3_tone5:"]::before, em[data-emoji="handshake_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fd-200d-1faf2-1f3ff.svg"); } em[data-emoji=":handshake_tone4_tone1:"]::before, em[data-emoji="handshake_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fe-200d-1faf2-1f3fb.svg"); } em[data-emoji=":handshake_tone4_tone2:"]::before, em[data-emoji="handshake_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fe-200d-1faf2-1f3fc.svg"); } em[data-emoji=":handshake_tone4_tone3:"]::before, em[data-emoji="handshake_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fe-200d-1faf2-1f3fd.svg"); } em[data-emoji=":handshake_tone4:"]::before, em[data-emoji="handshake_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d-1f3fe.svg"); } em[data-emoji=":handshake_tone4_tone5:"]::before, em[data-emoji="handshake_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fe-200d-1faf2-1f3ff.svg"); } em[data-emoji=":handshake_tone5_tone1:"]::before, em[data-emoji="handshake_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3ff-200d-1faf2-1f3fb.svg"); } em[data-emoji=":handshake_tone5_tone2:"]::before, em[data-emoji="handshake_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3ff-200d-1faf2-1f3fc.svg"); } em[data-emoji=":handshake_tone5_tone3:"]::before, em[data-emoji="handshake_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3ff-200d-1faf2-1f3fd.svg"); } em[data-emoji=":handshake_tone5_tone4:"]::before, em[data-emoji="handshake_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3ff-200d-1faf2-1f3fe.svg"); } em[data-emoji=":handshake_tone5:"]::before, em[data-emoji="handshake_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91d-1f3ff.svg"); } em[data-emoji=":thumbsup:"]::before, em[data-emoji="thumbsup"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d.svg"); } em[data-emoji=":thumbsup_tone1:"]::before, em[data-emoji="thumbsup_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d-1f3fb.svg"); } em[data-emoji=":thumbsup_tone2:"]::before, em[data-emoji="thumbsup_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d-1f3fc.svg"); } em[data-emoji=":thumbsup_tone3:"]::before, em[data-emoji="thumbsup_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d-1f3fd.svg"); } em[data-emoji=":thumbsup_tone4:"]::before, em[data-emoji="thumbsup_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d-1f3fe.svg"); } em[data-emoji=":thumbsup_tone5:"]::before, em[data-emoji="thumbsup_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44d-1f3ff.svg"); } em[data-emoji=":thumbsdown:"]::before, em[data-emoji="thumbsdown"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e.svg"); } em[data-emoji=":thumbsdown_tone1:"]::before, em[data-emoji="thumbsdown_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e-1f3fb.svg"); } em[data-emoji=":thumbsdown_tone2:"]::before, em[data-emoji="thumbsdown_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e-1f3fc.svg"); } em[data-emoji=":thumbsdown_tone3:"]::before, em[data-emoji="thumbsdown_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e-1f3fd.svg"); } em[data-emoji=":thumbsdown_tone4:"]::before, em[data-emoji="thumbsdown_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e-1f3fe.svg"); } em[data-emoji=":thumbsdown_tone5:"]::before, em[data-emoji="thumbsdown_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44e-1f3ff.svg"); } em[data-emoji=":punch:"]::before, em[data-emoji="punch"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a.svg"); } em[data-emoji=":punch_tone1:"]::before, em[data-emoji="punch_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a-1f3fb.svg"); } em[data-emoji=":punch_tone2:"]::before, em[data-emoji="punch_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a-1f3fc.svg"); } em[data-emoji=":punch_tone3:"]::before, em[data-emoji="punch_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a-1f3fd.svg"); } em[data-emoji=":punch_tone4:"]::before, em[data-emoji="punch_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a-1f3fe.svg"); } em[data-emoji=":punch_tone5:"]::before, em[data-emoji="punch_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44a-1f3ff.svg"); } em[data-emoji=":fist:"]::before, em[data-emoji="fist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a.svg"); } em[data-emoji=":fist_tone1:"]::before, em[data-emoji="fist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a-1f3fb.svg"); } em[data-emoji=":fist_tone2:"]::before, em[data-emoji="fist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a-1f3fc.svg"); } em[data-emoji=":fist_tone3:"]::before, em[data-emoji="fist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a-1f3fd.svg"); } em[data-emoji=":fist_tone4:"]::before, em[data-emoji="fist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a-1f3fe.svg"); } em[data-emoji=":fist_tone5:"]::before, em[data-emoji="fist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270a-1f3ff.svg"); } em[data-emoji=":left_facing_fist:"]::before, em[data-emoji="left_facing_fist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b.svg"); } em[data-emoji=":left_facing_fist_tone1:"]::before, em[data-emoji="left_facing_fist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b-1f3fb.svg"); } em[data-emoji=":left_facing_fist_tone2:"]::before, em[data-emoji="left_facing_fist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b-1f3fc.svg"); } em[data-emoji=":left_facing_fist_tone3:"]::before, em[data-emoji="left_facing_fist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b-1f3fd.svg"); } em[data-emoji=":left_facing_fist_tone4:"]::before, em[data-emoji="left_facing_fist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b-1f3fe.svg"); } em[data-emoji=":left_facing_fist_tone5:"]::before, em[data-emoji="left_facing_fist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91b-1f3ff.svg"); } em[data-emoji=":right_facing_fist:"]::before, em[data-emoji="right_facing_fist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c.svg"); } em[data-emoji=":right_facing_fist_tone1:"]::before, em[data-emoji="right_facing_fist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c-1f3fb.svg"); } em[data-emoji=":right_facing_fist_tone2:"]::before, em[data-emoji="right_facing_fist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c-1f3fc.svg"); } em[data-emoji=":right_facing_fist_tone3:"]::before, em[data-emoji="right_facing_fist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c-1f3fd.svg"); } em[data-emoji=":right_facing_fist_tone4:"]::before, em[data-emoji="right_facing_fist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c-1f3fe.svg"); } em[data-emoji=":right_facing_fist_tone5:"]::before, em[data-emoji="right_facing_fist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91c-1f3ff.svg"); } em[data-emoji=":leftwards_pushing_hand:"]::before, em[data-emoji="leftwards_pushing_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7.svg"); } em[data-emoji=":leftwards_pushing_hand_tone1:"]::before, em[data-emoji="leftwards_pushing_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7-1f3fb.svg"); } em[data-emoji=":leftwards_pushing_hand_tone2:"]::before, em[data-emoji="leftwards_pushing_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7-1f3fc.svg"); } em[data-emoji=":leftwards_pushing_hand_tone3:"]::before, em[data-emoji="leftwards_pushing_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7-1f3fd.svg"); } em[data-emoji=":leftwards_pushing_hand_tone4:"]::before, em[data-emoji="leftwards_pushing_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7-1f3fe.svg"); } em[data-emoji=":leftwards_pushing_hand_tone5:"]::before, em[data-emoji="leftwards_pushing_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf7-1f3ff.svg"); } em[data-emoji=":rightwards_pushing_hand:"]::before, em[data-emoji="rightwards_pushing_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8.svg"); } em[data-emoji=":rightwards_pushing_hand_tone1:"]::before, em[data-emoji="rightwards_pushing_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8-1f3fb.svg"); } em[data-emoji=":rightwards_pushing_hand_tone2:"]::before, em[data-emoji="rightwards_pushing_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8-1f3fc.svg"); } em[data-emoji=":rightwards_pushing_hand_tone3:"]::before, em[data-emoji="rightwards_pushing_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8-1f3fd.svg"); } em[data-emoji=":rightwards_pushing_hand_tone4:"]::before, em[data-emoji="rightwards_pushing_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8-1f3fe.svg"); } em[data-emoji=":rightwards_pushing_hand_tone5:"]::before, em[data-emoji="rightwards_pushing_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf8-1f3ff.svg"); } em[data-emoji=":fingers_crossed:"]::before, em[data-emoji="fingers_crossed"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e.svg"); } em[data-emoji=":fingers_crossed_tone1:"]::before, em[data-emoji="fingers_crossed_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e-1f3fb.svg"); } em[data-emoji=":fingers_crossed_tone2:"]::before, em[data-emoji="fingers_crossed_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e-1f3fc.svg"); } em[data-emoji=":fingers_crossed_tone3:"]::before, em[data-emoji="fingers_crossed_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e-1f3fd.svg"); } em[data-emoji=":fingers_crossed_tone4:"]::before, em[data-emoji="fingers_crossed_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e-1f3fe.svg"); } em[data-emoji=":fingers_crossed_tone5:"]::before, em[data-emoji="fingers_crossed_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91e-1f3ff.svg"); } em[data-emoji=":v:"]::before, em[data-emoji="v"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c.svg"); } em[data-emoji=":v_tone1:"]::before, em[data-emoji="v_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c-1f3fb.svg"); } em[data-emoji=":v_tone2:"]::before, em[data-emoji="v_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c-1f3fc.svg"); } em[data-emoji=":v_tone3:"]::before, em[data-emoji="v_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c-1f3fd.svg"); } em[data-emoji=":v_tone4:"]::before, em[data-emoji="v_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c-1f3fe.svg"); } em[data-emoji=":v_tone5:"]::before, em[data-emoji="v_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270c-1f3ff.svg"); } em[data-emoji=":hand_with_index_finger_and_thumb_crossed:"]::before, em[data-emoji="hand_with_index_finger_and_thumb_crossed"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0.svg"); } em[data-emoji=":hand_with_index_finger_and_thumb_crossed_tone1:"]::before, em[data-emoji="hand_with_index_finger_and_thumb_crossed_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0-1f3fb.svg"); } em[data-emoji=":hand_with_index_finger_and_thumb_crossed_tone2:"]::before, em[data-emoji="hand_with_index_finger_and_thumb_crossed_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0-1f3fc.svg"); } em[data-emoji=":hand_with_index_finger_and_thumb_crossed_tone3:"]::before, em[data-emoji="hand_with_index_finger_and_thumb_crossed_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0-1f3fd.svg"); } em[data-emoji=":hand_with_index_finger_and_thumb_crossed_tone4:"]::before, em[data-emoji="hand_with_index_finger_and_thumb_crossed_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0-1f3fe.svg"); } em[data-emoji=":hand_with_index_finger_and_thumb_crossed_tone5:"]::before, em[data-emoji="hand_with_index_finger_and_thumb_crossed_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf0-1f3ff.svg"); } em[data-emoji=":love_you_gesture:"]::before, em[data-emoji="love_you_gesture"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f.svg"); } em[data-emoji=":love_you_gesture_tone1:"]::before, em[data-emoji="love_you_gesture_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f-1f3fb.svg"); } em[data-emoji=":love_you_gesture_tone2:"]::before, em[data-emoji="love_you_gesture_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f-1f3fc.svg"); } em[data-emoji=":love_you_gesture_tone3:"]::before, em[data-emoji="love_you_gesture_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f-1f3fd.svg"); } em[data-emoji=":love_you_gesture_tone4:"]::before, em[data-emoji="love_you_gesture_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f-1f3fe.svg"); } em[data-emoji=":love_you_gesture_tone5:"]::before, em[data-emoji="love_you_gesture_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91f-1f3ff.svg"); } em[data-emoji=":metal:"]::before, em[data-emoji="metal"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918.svg"); } em[data-emoji=":metal_tone1:"]::before, em[data-emoji="metal_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918-1f3fb.svg"); } em[data-emoji=":metal_tone2:"]::before, em[data-emoji="metal_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918-1f3fc.svg"); } em[data-emoji=":metal_tone3:"]::before, em[data-emoji="metal_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918-1f3fd.svg"); } em[data-emoji=":metal_tone4:"]::before, em[data-emoji="metal_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918-1f3fe.svg"); } em[data-emoji=":metal_tone5:"]::before, em[data-emoji="metal_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f918-1f3ff.svg"); } em[data-emoji=":ok_hand:"]::before, em[data-emoji="ok_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c.svg"); } em[data-emoji=":ok_hand_tone1:"]::before, em[data-emoji="ok_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c-1f3fb.svg"); } em[data-emoji=":ok_hand_tone2:"]::before, em[data-emoji="ok_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c-1f3fc.svg"); } em[data-emoji=":ok_hand_tone3:"]::before, em[data-emoji="ok_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c-1f3fd.svg"); } em[data-emoji=":ok_hand_tone4:"]::before, em[data-emoji="ok_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c-1f3fe.svg"); } em[data-emoji=":ok_hand_tone5:"]::before, em[data-emoji="ok_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44c-1f3ff.svg"); } em[data-emoji=":pinched_fingers:"]::before, em[data-emoji="pinched_fingers"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c.svg"); } em[data-emoji=":pinched_fingers_tone2:"]::before, em[data-emoji="pinched_fingers_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c-1f3fc.svg"); } em[data-emoji=":pinched_fingers_tone1:"]::before, em[data-emoji="pinched_fingers_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c-1f3fb.svg"); } em[data-emoji=":pinched_fingers_tone3:"]::before, em[data-emoji="pinched_fingers_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c-1f3fd.svg"); } em[data-emoji=":pinched_fingers_tone4:"]::before, em[data-emoji="pinched_fingers_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c-1f3fe.svg"); } em[data-emoji=":pinched_fingers_tone5:"]::before, em[data-emoji="pinched_fingers_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90c-1f3ff.svg"); } em[data-emoji=":pinching_hand:"]::before, em[data-emoji="pinching_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f.svg"); } em[data-emoji=":pinching_hand_tone1:"]::before, em[data-emoji="pinching_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f-1f3fb.svg"); } em[data-emoji=":pinching_hand_tone2:"]::before, em[data-emoji="pinching_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f-1f3fc.svg"); } em[data-emoji=":pinching_hand_tone3:"]::before, em[data-emoji="pinching_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f-1f3fd.svg"); } em[data-emoji=":pinching_hand_tone4:"]::before, em[data-emoji="pinching_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f-1f3fe.svg"); } em[data-emoji=":pinching_hand_tone5:"]::before, em[data-emoji="pinching_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90f-1f3ff.svg"); } em[data-emoji=":palm_down_hand:"]::before, em[data-emoji="palm_down_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3.svg"); } em[data-emoji=":palm_down_hand_tone1:"]::before, em[data-emoji="palm_down_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3-1f3fb.svg"); } em[data-emoji=":palm_down_hand_tone2:"]::before, em[data-emoji="palm_down_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3-1f3fc.svg"); } em[data-emoji=":palm_down_hand_tone3:"]::before, em[data-emoji="palm_down_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3-1f3fd.svg"); } em[data-emoji=":palm_down_hand_tone4:"]::before, em[data-emoji="palm_down_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3-1f3fe.svg"); } em[data-emoji=":palm_down_hand_tone5:"]::before, em[data-emoji="palm_down_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf3-1f3ff.svg"); } em[data-emoji=":palm_up_hand:"]::before, em[data-emoji="palm_up_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4.svg"); } em[data-emoji=":palm_up_hand_tone1:"]::before, em[data-emoji="palm_up_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4-1f3fb.svg"); } em[data-emoji=":palm_up_hand_tone2:"]::before, em[data-emoji="palm_up_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4-1f3fc.svg"); } em[data-emoji=":palm_up_hand_tone3:"]::before, em[data-emoji="palm_up_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4-1f3fd.svg"); } em[data-emoji=":palm_up_hand_tone4:"]::before, em[data-emoji="palm_up_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4-1f3fe.svg"); } em[data-emoji=":palm_up_hand_tone5:"]::before, em[data-emoji="palm_up_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf4-1f3ff.svg"); } em[data-emoji=":point_left:"]::before, em[data-emoji="point_left"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448.svg"); } em[data-emoji=":point_left_tone1:"]::before, em[data-emoji="point_left_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448-1f3fb.svg"); } em[data-emoji=":point_left_tone2:"]::before, em[data-emoji="point_left_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448-1f3fc.svg"); } em[data-emoji=":point_left_tone3:"]::before, em[data-emoji="point_left_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448-1f3fd.svg"); } em[data-emoji=":point_left_tone4:"]::before, em[data-emoji="point_left_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448-1f3fe.svg"); } em[data-emoji=":point_left_tone5:"]::before, em[data-emoji="point_left_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f448-1f3ff.svg"); } em[data-emoji=":point_right:"]::before, em[data-emoji="point_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449.svg"); } em[data-emoji=":point_right_tone1:"]::before, em[data-emoji="point_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449-1f3fb.svg"); } em[data-emoji=":point_right_tone2:"]::before, em[data-emoji="point_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449-1f3fc.svg"); } em[data-emoji=":point_right_tone3:"]::before, em[data-emoji="point_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449-1f3fd.svg"); } em[data-emoji=":point_right_tone4:"]::before, em[data-emoji="point_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449-1f3fe.svg"); } em[data-emoji=":point_right_tone5:"]::before, em[data-emoji="point_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f449-1f3ff.svg"); } em[data-emoji=":point_up_2:"]::before, em[data-emoji="point_up_2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446.svg"); } em[data-emoji=":point_up_2_tone1:"]::before, em[data-emoji="point_up_2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446-1f3fb.svg"); } em[data-emoji=":point_up_2_tone2:"]::before, em[data-emoji="point_up_2_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446-1f3fc.svg"); } em[data-emoji=":point_up_2_tone3:"]::before, em[data-emoji="point_up_2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446-1f3fd.svg"); } em[data-emoji=":point_up_2_tone4:"]::before, em[data-emoji="point_up_2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446-1f3fe.svg"); } em[data-emoji=":point_up_2_tone5:"]::before, em[data-emoji="point_up_2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f446-1f3ff.svg"); } em[data-emoji=":point_down:"]::before, em[data-emoji="point_down"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447.svg"); } em[data-emoji=":point_down_tone1:"]::before, em[data-emoji="point_down_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447-1f3fb.svg"); } em[data-emoji=":point_down_tone2:"]::before, em[data-emoji="point_down_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447-1f3fc.svg"); } em[data-emoji=":point_down_tone3:"]::before, em[data-emoji="point_down_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447-1f3fd.svg"); } em[data-emoji=":point_down_tone4:"]::before, em[data-emoji="point_down_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447-1f3fe.svg"); } em[data-emoji=":point_down_tone5:"]::before, em[data-emoji="point_down_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f447-1f3ff.svg"); } em[data-emoji=":point_up:"]::before, em[data-emoji="point_up"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d.svg"); } em[data-emoji=":point_up_tone1:"]::before, em[data-emoji="point_up_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d-1f3fb.svg"); } em[data-emoji=":point_up_tone2:"]::before, em[data-emoji="point_up_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d-1f3fc.svg"); } em[data-emoji=":point_up_tone3:"]::before, em[data-emoji="point_up_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d-1f3fd.svg"); } em[data-emoji=":point_up_tone4:"]::before, em[data-emoji="point_up_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d-1f3fe.svg"); } em[data-emoji=":point_up_tone5:"]::before, em[data-emoji="point_up_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/261d-1f3ff.svg"); } em[data-emoji=":raised_hand:"]::before, em[data-emoji="raised_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b.svg"); } em[data-emoji=":raised_hand_tone1:"]::before, em[data-emoji="raised_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b-1f3fb.svg"); } em[data-emoji=":raised_hand_tone2:"]::before, em[data-emoji="raised_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b-1f3fc.svg"); } em[data-emoji=":raised_hand_tone3:"]::before, em[data-emoji="raised_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b-1f3fd.svg"); } em[data-emoji=":raised_hand_tone4:"]::before, em[data-emoji="raised_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b-1f3fe.svg"); } em[data-emoji=":raised_hand_tone5:"]::before, em[data-emoji="raised_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270b-1f3ff.svg"); } em[data-emoji=":raised_back_of_hand:"]::before, em[data-emoji="raised_back_of_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a.svg"); } em[data-emoji=":raised_back_of_hand_tone1:"]::before, em[data-emoji="raised_back_of_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a-1f3fb.svg"); } em[data-emoji=":raised_back_of_hand_tone2:"]::before, em[data-emoji="raised_back_of_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a-1f3fc.svg"); } em[data-emoji=":raised_back_of_hand_tone3:"]::before, em[data-emoji="raised_back_of_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a-1f3fd.svg"); } em[data-emoji=":raised_back_of_hand_tone4:"]::before, em[data-emoji="raised_back_of_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a-1f3fe.svg"); } em[data-emoji=":raised_back_of_hand_tone5:"]::before, em[data-emoji="raised_back_of_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f91a-1f3ff.svg"); } em[data-emoji=":hand_splayed:"]::before, em[data-emoji="hand_splayed"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590.svg"); } em[data-emoji=":hand_splayed_tone1:"]::before, em[data-emoji="hand_splayed_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590-1f3fb.svg"); } em[data-emoji=":hand_splayed_tone2:"]::before, em[data-emoji="hand_splayed_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590-1f3fc.svg"); } em[data-emoji=":hand_splayed_tone3:"]::before, em[data-emoji="hand_splayed_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590-1f3fd.svg"); } em[data-emoji=":hand_splayed_tone4:"]::before, em[data-emoji="hand_splayed_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590-1f3fe.svg"); } em[data-emoji=":hand_splayed_tone5:"]::before, em[data-emoji="hand_splayed_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f590-1f3ff.svg"); } em[data-emoji=":vulcan:"]::before, em[data-emoji="vulcan"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596.svg"); } em[data-emoji=":vulcan_tone1:"]::before, em[data-emoji="vulcan_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596-1f3fb.svg"); } em[data-emoji=":vulcan_tone2:"]::before, em[data-emoji="vulcan_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596-1f3fc.svg"); } em[data-emoji=":vulcan_tone3:"]::before, em[data-emoji="vulcan_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596-1f3fd.svg"); } em[data-emoji=":vulcan_tone4:"]::before, em[data-emoji="vulcan_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596-1f3fe.svg"); } em[data-emoji=":vulcan_tone5:"]::before, em[data-emoji="vulcan_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f596-1f3ff.svg"); } em[data-emoji=":wave:"]::before, em[data-emoji="wave"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b.svg"); } em[data-emoji=":wave_tone1:"]::before, em[data-emoji="wave_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b-1f3fb.svg"); } em[data-emoji=":wave_tone2:"]::before, em[data-emoji="wave_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b-1f3fc.svg"); } em[data-emoji=":wave_tone3:"]::before, em[data-emoji="wave_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b-1f3fd.svg"); } em[data-emoji=":wave_tone4:"]::before, em[data-emoji="wave_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b-1f3fe.svg"); } em[data-emoji=":wave_tone5:"]::before, em[data-emoji="wave_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f44b-1f3ff.svg"); } em[data-emoji=":call_me:"]::before, em[data-emoji="call_me"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919.svg"); } em[data-emoji=":call_me_tone1:"]::before, em[data-emoji="call_me_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919-1f3fb.svg"); } em[data-emoji=":call_me_tone2:"]::before, em[data-emoji="call_me_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919-1f3fc.svg"); } em[data-emoji=":call_me_tone3:"]::before, em[data-emoji="call_me_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919-1f3fd.svg"); } em[data-emoji=":call_me_tone4:"]::before, em[data-emoji="call_me_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919-1f3fe.svg"); } em[data-emoji=":call_me_tone5:"]::before, em[data-emoji="call_me_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f919-1f3ff.svg"); } em[data-emoji=":leftwards_hand:"]::before, em[data-emoji="leftwards_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2.svg"); } em[data-emoji=":leftwards_hand_tone1:"]::before, em[data-emoji="leftwards_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2-1f3fb.svg"); } em[data-emoji=":leftwards_hand_tone2:"]::before, em[data-emoji="leftwards_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2-1f3fc.svg"); } em[data-emoji=":leftwards_hand_tone3:"]::before, em[data-emoji="leftwards_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2-1f3fd.svg"); } em[data-emoji=":leftwards_hand_tone4:"]::before, em[data-emoji="leftwards_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2-1f3fe.svg"); } em[data-emoji=":leftwards_hand_tone5:"]::before, em[data-emoji="leftwards_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf2-1f3ff.svg"); } em[data-emoji=":rightwards_hand:"]::before, em[data-emoji="rightwards_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1.svg"); } em[data-emoji=":rightwards_hand_tone1:"]::before, em[data-emoji="rightwards_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fb.svg"); } em[data-emoji=":rightwards_hand_tone2:"]::before, em[data-emoji="rightwards_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fc.svg"); } em[data-emoji=":rightwards_hand_tone3:"]::before, em[data-emoji="rightwards_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fd.svg"); } em[data-emoji=":rightwards_hand_tone4:"]::before, em[data-emoji="rightwards_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3fe.svg"); } em[data-emoji=":rightwards_hand_tone5:"]::before, em[data-emoji="rightwards_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf1-1f3ff.svg"); } em[data-emoji=":muscle:"]::before, em[data-emoji="muscle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa.svg"); } em[data-emoji=":muscle_tone1:"]::before, em[data-emoji="muscle_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa-1f3fb.svg"); } em[data-emoji=":muscle_tone2:"]::before, em[data-emoji="muscle_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa-1f3fc.svg"); } em[data-emoji=":muscle_tone3:"]::before, em[data-emoji="muscle_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa-1f3fd.svg"); } em[data-emoji=":muscle_tone4:"]::before, em[data-emoji="muscle_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa-1f3fe.svg"); } em[data-emoji=":muscle_tone5:"]::before, em[data-emoji="muscle_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4aa-1f3ff.svg"); } em[data-emoji=":mechanical_arm:"]::before, em[data-emoji="mechanical_arm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9be.svg"); } em[data-emoji=":middle_finger:"]::before, em[data-emoji="middle_finger"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595.svg"); } em[data-emoji=":middle_finger_tone1:"]::before, em[data-emoji="middle_finger_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595-1f3fb.svg"); } em[data-emoji=":middle_finger_tone2:"]::before, em[data-emoji="middle_finger_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595-1f3fc.svg"); } em[data-emoji=":middle_finger_tone3:"]::before, em[data-emoji="middle_finger_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595-1f3fd.svg"); } em[data-emoji=":middle_finger_tone4:"]::before, em[data-emoji="middle_finger_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595-1f3fe.svg"); } em[data-emoji=":middle_finger_tone5:"]::before, em[data-emoji="middle_finger_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f595-1f3ff.svg"); } em[data-emoji=":writing_hand:"]::before, em[data-emoji="writing_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d.svg"); } em[data-emoji=":writing_hand_tone1:"]::before, em[data-emoji="writing_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d-1f3fb.svg"); } em[data-emoji=":writing_hand_tone2:"]::before, em[data-emoji="writing_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d-1f3fc.svg"); } em[data-emoji=":writing_hand_tone3:"]::before, em[data-emoji="writing_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d-1f3fd.svg"); } em[data-emoji=":writing_hand_tone4:"]::before, em[data-emoji="writing_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d-1f3fe.svg"); } em[data-emoji=":writing_hand_tone5:"]::before, em[data-emoji="writing_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270d-1f3ff.svg"); } em[data-emoji=":pray:"]::before, em[data-emoji="pray"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f.svg"); } em[data-emoji=":pray_tone1:"]::before, em[data-emoji="pray_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f-1f3fb.svg"); } em[data-emoji=":pray_tone2:"]::before, em[data-emoji="pray_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f-1f3fc.svg"); } em[data-emoji=":pray_tone3:"]::before, em[data-emoji="pray_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f-1f3fd.svg"); } em[data-emoji=":pray_tone4:"]::before, em[data-emoji="pray_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f-1f3fe.svg"); } em[data-emoji=":pray_tone5:"]::before, em[data-emoji="pray_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64f-1f3ff.svg"); } em[data-emoji=":index_pointing_at_the_viewer:"]::before, em[data-emoji="index_pointing_at_the_viewer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5.svg"); } em[data-emoji=":index_pointing_at_the_viewer_tone1:"]::before, em[data-emoji="index_pointing_at_the_viewer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5-1f3fb.svg"); } em[data-emoji=":index_pointing_at_the_viewer_tone2:"]::before, em[data-emoji="index_pointing_at_the_viewer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5-1f3fc.svg"); } em[data-emoji=":index_pointing_at_the_viewer_tone3:"]::before, em[data-emoji="index_pointing_at_the_viewer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5-1f3fd.svg"); } em[data-emoji=":index_pointing_at_the_viewer_tone4:"]::before, em[data-emoji="index_pointing_at_the_viewer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5-1f3fe.svg"); } em[data-emoji=":index_pointing_at_the_viewer_tone5:"]::before, em[data-emoji="index_pointing_at_the_viewer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faf5-1f3ff.svg"); } em[data-emoji=":foot:"]::before, em[data-emoji="foot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6.svg"); } em[data-emoji=":foot_tone1:"]::before, em[data-emoji="foot_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6-1f3fb.svg"); } em[data-emoji=":foot_tone2:"]::before, em[data-emoji="foot_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6-1f3fc.svg"); } em[data-emoji=":foot_tone3:"]::before, em[data-emoji="foot_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6-1f3fd.svg"); } em[data-emoji=":foot_tone4:"]::before, em[data-emoji="foot_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6-1f3fe.svg"); } em[data-emoji=":foot_tone5:"]::before, em[data-emoji="foot_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b6-1f3ff.svg"); } em[data-emoji=":leg:"]::before, em[data-emoji="leg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5.svg"); } em[data-emoji=":leg_tone1:"]::before, em[data-emoji="leg_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5-1f3fb.svg"); } em[data-emoji=":leg_tone2:"]::before, em[data-emoji="leg_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5-1f3fc.svg"); } em[data-emoji=":leg_tone3:"]::before, em[data-emoji="leg_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5-1f3fd.svg"); } em[data-emoji=":leg_tone4:"]::before, em[data-emoji="leg_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5-1f3fe.svg"); } em[data-emoji=":leg_tone5:"]::before, em[data-emoji="leg_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b5-1f3ff.svg"); } em[data-emoji=":mechanical_leg:"]::before, em[data-emoji="mechanical_leg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bf.svg"); } em[data-emoji=":lipstick:"]::before, em[data-emoji="lipstick"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f484.svg"); } em[data-emoji=":kiss:"]::before, em[data-emoji="kiss"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48b.svg"); } em[data-emoji=":lips:"]::before, em[data-emoji="lips"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f444.svg"); } em[data-emoji=":biting_lip:"]::before, em[data-emoji="biting_lip"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae6.svg"); } em[data-emoji=":tooth:"]::before, em[data-emoji="tooth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b7.svg"); } em[data-emoji=":tongue:"]::before, em[data-emoji="tongue"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f445.svg"); } em[data-emoji=":ear:"]::before, em[data-emoji="ear"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442.svg"); } em[data-emoji=":ear_tone1:"]::before, em[data-emoji="ear_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442-1f3fb.svg"); } em[data-emoji=":ear_tone2:"]::before, em[data-emoji="ear_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442-1f3fc.svg"); } em[data-emoji=":ear_tone3:"]::before, em[data-emoji="ear_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442-1f3fd.svg"); } em[data-emoji=":ear_tone4:"]::before, em[data-emoji="ear_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442-1f3fe.svg"); } em[data-emoji=":ear_tone5:"]::before, em[data-emoji="ear_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f442-1f3ff.svg"); } em[data-emoji=":ear_with_hearing_aid:"]::before, em[data-emoji="ear_with_hearing_aid"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb.svg"); } em[data-emoji=":ear_with_hearing_aid_tone1:"]::before, em[data-emoji="ear_with_hearing_aid_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb-1f3fb.svg"); } em[data-emoji=":ear_with_hearing_aid_tone2:"]::before, em[data-emoji="ear_with_hearing_aid_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb-1f3fc.svg"); } em[data-emoji=":ear_with_hearing_aid_tone3:"]::before, em[data-emoji="ear_with_hearing_aid_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb-1f3fd.svg"); } em[data-emoji=":ear_with_hearing_aid_tone4:"]::before, em[data-emoji="ear_with_hearing_aid_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb-1f3fe.svg"); } em[data-emoji=":ear_with_hearing_aid_tone5:"]::before, em[data-emoji="ear_with_hearing_aid_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bb-1f3ff.svg"); } em[data-emoji=":nose:"]::before, em[data-emoji="nose"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443.svg"); } em[data-emoji=":nose_tone1:"]::before, em[data-emoji="nose_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443-1f3fb.svg"); } em[data-emoji=":nose_tone2:"]::before, em[data-emoji="nose_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443-1f3fc.svg"); } em[data-emoji=":nose_tone3:"]::before, em[data-emoji="nose_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443-1f3fd.svg"); } em[data-emoji=":nose_tone4:"]::before, em[data-emoji="nose_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443-1f3fe.svg"); } em[data-emoji=":nose_tone5:"]::before, em[data-emoji="nose_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f443-1f3ff.svg"); } em[data-emoji=":footprints:"]::before, em[data-emoji="footprints"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f463.svg"); } em[data-emoji=":eye:"]::before, em[data-emoji="eye"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f441.svg"); } em[data-emoji=":eyes:"]::before, em[data-emoji="eyes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f440.svg"); } em[data-emoji=":anatomical_heart:"]::before, em[data-emoji="anatomical_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac0.svg"); } em[data-emoji=":lungs:"]::before, em[data-emoji="lungs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac1.svg"); } em[data-emoji=":brain:"]::before, em[data-emoji="brain"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e0.svg"); } em[data-emoji=":speaking_head:"]::before, em[data-emoji="speaking_head"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5e3.svg"); } em[data-emoji=":bust_in_silhouette:"]::before, em[data-emoji="bust_in_silhouette"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f464.svg"); } em[data-emoji=":busts_in_silhouette:"]::before, em[data-emoji="busts_in_silhouette"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f465.svg"); } em[data-emoji=":people_hugging:"]::before, em[data-emoji="people_hugging"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac2.svg"); } em[data-emoji=":baby:"]::before, em[data-emoji="baby"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476.svg"); } em[data-emoji=":baby_tone1:"]::before, em[data-emoji="baby_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476-1f3fb.svg"); } em[data-emoji=":baby_tone2:"]::before, em[data-emoji="baby_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476-1f3fc.svg"); } em[data-emoji=":baby_tone3:"]::before, em[data-emoji="baby_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476-1f3fd.svg"); } em[data-emoji=":baby_tone4:"]::before, em[data-emoji="baby_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476-1f3fe.svg"); } em[data-emoji=":baby_tone5:"]::before, em[data-emoji="baby_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f476-1f3ff.svg"); } em[data-emoji=":child:"]::before, em[data-emoji="child"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2.svg"); } em[data-emoji=":child_tone1:"]::before, em[data-emoji="child_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2-1f3fb.svg"); } em[data-emoji=":child_tone2:"]::before, em[data-emoji="child_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2-1f3fc.svg"); } em[data-emoji=":child_tone3:"]::before, em[data-emoji="child_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2-1f3fd.svg"); } em[data-emoji=":child_tone4:"]::before, em[data-emoji="child_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2-1f3fe.svg"); } em[data-emoji=":child_tone5:"]::before, em[data-emoji="child_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d2-1f3ff.svg"); } em[data-emoji=":girl:"]::before, em[data-emoji="girl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467.svg"); } em[data-emoji=":girl_tone1:"]::before, em[data-emoji="girl_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467-1f3fb.svg"); } em[data-emoji=":girl_tone2:"]::before, em[data-emoji="girl_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467-1f3fc.svg"); } em[data-emoji=":girl_tone3:"]::before, em[data-emoji="girl_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467-1f3fd.svg"); } em[data-emoji=":girl_tone4:"]::before, em[data-emoji="girl_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467-1f3fe.svg"); } em[data-emoji=":girl_tone5:"]::before, em[data-emoji="girl_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f467-1f3ff.svg"); } em[data-emoji=":boy:"]::before, em[data-emoji="boy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466.svg"); } em[data-emoji=":boy_tone1:"]::before, em[data-emoji="boy_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466-1f3fb.svg"); } em[data-emoji=":boy_tone2:"]::before, em[data-emoji="boy_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466-1f3fc.svg"); } em[data-emoji=":boy_tone3:"]::before, em[data-emoji="boy_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466-1f3fd.svg"); } em[data-emoji=":boy_tone4:"]::before, em[data-emoji="boy_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466-1f3fe.svg"); } em[data-emoji=":boy_tone5:"]::before, em[data-emoji="boy_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f466-1f3ff.svg"); } em[data-emoji=":adult:"]::before, em[data-emoji="adult"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1.svg"); } em[data-emoji=":adult_tone1:"]::before, em[data-emoji="adult_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb.svg"); } em[data-emoji=":adult_tone2:"]::before, em[data-emoji="adult_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc.svg"); } em[data-emoji=":adult_tone3:"]::before, em[data-emoji="adult_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd.svg"); } em[data-emoji=":adult_tone4:"]::before, em[data-emoji="adult_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe.svg"); } em[data-emoji=":adult_tone5:"]::before, em[data-emoji="adult_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff.svg"); } em[data-emoji=":woman:"]::before, em[data-emoji="woman"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469.svg"); } em[data-emoji=":woman_tone1:"]::before, em[data-emoji="woman_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb.svg"); } em[data-emoji=":woman_tone2:"]::before, em[data-emoji="woman_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc.svg"); } em[data-emoji=":woman_tone3:"]::before, em[data-emoji="woman_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd.svg"); } em[data-emoji=":woman_tone4:"]::before, em[data-emoji="woman_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe.svg"); } em[data-emoji=":woman_tone5:"]::before, em[data-emoji="woman_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff.svg"); } em[data-emoji=":man:"]::before, em[data-emoji="man"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468.svg"); } em[data-emoji=":man_tone1:"]::before, em[data-emoji="man_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb.svg"); } em[data-emoji=":man_tone2:"]::before, em[data-emoji="man_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc.svg"); } em[data-emoji=":man_tone3:"]::before, em[data-emoji="man_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd.svg"); } em[data-emoji=":man_tone4:"]::before, em[data-emoji="man_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe.svg"); } em[data-emoji=":man_tone5:"]::before, em[data-emoji="man_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff.svg"); } em[data-emoji=":person_curly_hair:"]::before, em[data-emoji="person_curly_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9b1.svg"); } em[data-emoji=":person_tone1_curly_hair:"]::before, em[data-emoji="person_tone1_curly_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9b1.svg"); } em[data-emoji=":person_tone2_curly_hair:"]::before, em[data-emoji="person_tone2_curly_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9b1.svg"); } em[data-emoji=":person_tone3_curly_hair:"]::before, em[data-emoji="person_tone3_curly_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9b1.svg"); } em[data-emoji=":person_tone4_curly_hair:"]::before, em[data-emoji="person_tone4_curly_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9b1.svg"); } em[data-emoji=":person_tone5_curly_hair:"]::before, em[data-emoji="person_tone5_curly_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9b1.svg"); } em[data-emoji=":woman_curly_haired:"]::before, em[data-emoji="woman_curly_haired"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9b1.svg"); } em[data-emoji=":woman_curly_haired_tone1:"]::before, em[data-emoji="woman_curly_haired_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9b1.svg"); } em[data-emoji=":woman_curly_haired_tone2:"]::before, em[data-emoji="woman_curly_haired_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9b1.svg"); } em[data-emoji=":woman_curly_haired_tone3:"]::before, em[data-emoji="woman_curly_haired_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9b1.svg"); } em[data-emoji=":woman_curly_haired_tone4:"]::before, em[data-emoji="woman_curly_haired_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9b1.svg"); } em[data-emoji=":woman_curly_haired_tone5:"]::before, em[data-emoji="woman_curly_haired_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9b1.svg"); } em[data-emoji=":man_curly_haired:"]::before, em[data-emoji="man_curly_haired"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9b1.svg"); } em[data-emoji=":man_curly_haired_tone1:"]::before, em[data-emoji="man_curly_haired_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9b1.svg"); } em[data-emoji=":man_curly_haired_tone2:"]::before, em[data-emoji="man_curly_haired_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9b1.svg"); } em[data-emoji=":man_curly_haired_tone3:"]::before, em[data-emoji="man_curly_haired_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9b1.svg"); } em[data-emoji=":man_curly_haired_tone4:"]::before, em[data-emoji="man_curly_haired_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9b1.svg"); } em[data-emoji=":man_curly_haired_tone5:"]::before, em[data-emoji="man_curly_haired_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9b1.svg"); } em[data-emoji=":person_red_hair:"]::before, em[data-emoji="person_red_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9b0.svg"); } em[data-emoji=":person_tone1_red_hair:"]::before, em[data-emoji="person_tone1_red_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9b0.svg"); } em[data-emoji=":person_tone2_red_hair:"]::before, em[data-emoji="person_tone2_red_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9b0.svg"); } em[data-emoji=":person_tone3_red_hair:"]::before, em[data-emoji="person_tone3_red_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9b0.svg"); } em[data-emoji=":person_tone4_red_hair:"]::before, em[data-emoji="person_tone4_red_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9b0.svg"); } em[data-emoji=":person_tone5_red_hair:"]::before, em[data-emoji="person_tone5_red_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9b0.svg"); } em[data-emoji=":woman_red_haired:"]::before, em[data-emoji="woman_red_haired"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9b0.svg"); } em[data-emoji=":woman_red_haired_tone1:"]::before, em[data-emoji="woman_red_haired_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9b0.svg"); } em[data-emoji=":woman_red_haired_tone2:"]::before, em[data-emoji="woman_red_haired_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9b0.svg"); } em[data-emoji=":woman_red_haired_tone3:"]::before, em[data-emoji="woman_red_haired_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9b0.svg"); } em[data-emoji=":woman_red_haired_tone4:"]::before, em[data-emoji="woman_red_haired_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9b0.svg"); } em[data-emoji=":woman_red_haired_tone5:"]::before, em[data-emoji="woman_red_haired_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9b0.svg"); } em[data-emoji=":man_red_haired:"]::before, em[data-emoji="man_red_haired"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9b0.svg"); } em[data-emoji=":man_red_haired_tone1:"]::before, em[data-emoji="man_red_haired_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9b0.svg"); } em[data-emoji=":man_red_haired_tone2:"]::before, em[data-emoji="man_red_haired_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9b0.svg"); } em[data-emoji=":man_red_haired_tone3:"]::before, em[data-emoji="man_red_haired_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9b0.svg"); } em[data-emoji=":man_red_haired_tone4:"]::before, em[data-emoji="man_red_haired_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9b0.svg"); } em[data-emoji=":man_red_haired_tone5:"]::before, em[data-emoji="man_red_haired_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9b0.svg"); } em[data-emoji=":blond_haired_person:"]::before, em[data-emoji="blond_haired_person"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471.svg"); } em[data-emoji=":blond_haired_person_tone1:"]::before, em[data-emoji="blond_haired_person_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fb.svg"); } em[data-emoji=":blond_haired_person_tone2:"]::before, em[data-emoji="blond_haired_person_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fc.svg"); } em[data-emoji=":blond_haired_person_tone3:"]::before, em[data-emoji="blond_haired_person_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fd.svg"); } em[data-emoji=":blond_haired_person_tone4:"]::before, em[data-emoji="blond_haired_person_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fe.svg"); } em[data-emoji=":blond_haired_person_tone5:"]::before, em[data-emoji="blond_haired_person_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3ff.svg"); } em[data-emoji=":blond-haired_woman:"]::before, em[data-emoji="blond-haired_woman"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-200d-2640-fe0f.svg"); } em[data-emoji=":blond-haired_woman_tone1:"]::before, em[data-emoji="blond-haired_woman_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":blond-haired_woman_tone2:"]::before, em[data-emoji="blond-haired_woman_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":blond-haired_woman_tone3:"]::before, em[data-emoji="blond-haired_woman_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":blond-haired_woman_tone4:"]::before, em[data-emoji="blond-haired_woman_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":blond-haired_woman_tone5:"]::before, em[data-emoji="blond-haired_woman_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":blond-haired_man:"]::before, em[data-emoji="blond-haired_man"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-200d-2642-fe0f.svg"); } em[data-emoji=":blond-haired_man_tone1:"]::before, em[data-emoji="blond-haired_man_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":blond-haired_man_tone2:"]::before, em[data-emoji="blond-haired_man_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":blond-haired_man_tone3:"]::before, em[data-emoji="blond-haired_man_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":blond-haired_man_tone4:"]::before, em[data-emoji="blond-haired_man_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":blond-haired_man_tone5:"]::before, em[data-emoji="blond-haired_man_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f471-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_white_hair:"]::before, em[data-emoji="person_white_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9b3.svg"); } em[data-emoji=":person_tone1_white_hair:"]::before, em[data-emoji="person_tone1_white_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9b3.svg"); } em[data-emoji=":person_tone2_white_hair:"]::before, em[data-emoji="person_tone2_white_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9b3.svg"); } em[data-emoji=":person_tone3_white_hair:"]::before, em[data-emoji="person_tone3_white_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9b3.svg"); } em[data-emoji=":person_tone4_white_hair:"]::before, em[data-emoji="person_tone4_white_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9b3.svg"); } em[data-emoji=":person_tone5_white_hair:"]::before, em[data-emoji="person_tone5_white_hair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9b3.svg"); } em[data-emoji=":woman_white_haired:"]::before, em[data-emoji="woman_white_haired"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9b3.svg"); } em[data-emoji=":woman_white_haired_tone1:"]::before, em[data-emoji="woman_white_haired_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9b3.svg"); } em[data-emoji=":woman_white_haired_tone2:"]::before, em[data-emoji="woman_white_haired_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9b3.svg"); } em[data-emoji=":woman_white_haired_tone3:"]::before, em[data-emoji="woman_white_haired_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9b3.svg"); } em[data-emoji=":woman_white_haired_tone4:"]::before, em[data-emoji="woman_white_haired_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9b3.svg"); } em[data-emoji=":woman_white_haired_tone5:"]::before, em[data-emoji="woman_white_haired_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9b3.svg"); } em[data-emoji=":man_white_haired:"]::before, em[data-emoji="man_white_haired"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9b3.svg"); } em[data-emoji=":man_white_haired_tone1:"]::before, em[data-emoji="man_white_haired_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9b3.svg"); } em[data-emoji=":man_white_haired_tone2:"]::before, em[data-emoji="man_white_haired_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9b3.svg"); } em[data-emoji=":man_white_haired_tone3:"]::before, em[data-emoji="man_white_haired_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9b3.svg"); } em[data-emoji=":man_white_haired_tone4:"]::before, em[data-emoji="man_white_haired_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9b3.svg"); } em[data-emoji=":man_white_haired_tone5:"]::before, em[data-emoji="man_white_haired_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9b3.svg"); } em[data-emoji=":person_bald:"]::before, em[data-emoji="person_bald"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9b2.svg"); } em[data-emoji=":person_tone1_bald:"]::before, em[data-emoji="person_tone1_bald"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9b2.svg"); } em[data-emoji=":person_tone2_bald:"]::before, em[data-emoji="person_tone2_bald"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9b2.svg"); } em[data-emoji=":person_tone3_bald:"]::before, em[data-emoji="person_tone3_bald"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9b2.svg"); } em[data-emoji=":person_tone4_bald:"]::before, em[data-emoji="person_tone4_bald"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9b2.svg"); } em[data-emoji=":person_tone5_bald:"]::before, em[data-emoji="person_tone5_bald"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9b2.svg"); } em[data-emoji=":woman_bald:"]::before, em[data-emoji="woman_bald"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9b2.svg"); } em[data-emoji=":woman_bald_tone1:"]::before, em[data-emoji="woman_bald_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9b2.svg"); } em[data-emoji=":woman_bald_tone2:"]::before, em[data-emoji="woman_bald_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9b2.svg"); } em[data-emoji=":woman_bald_tone3:"]::before, em[data-emoji="woman_bald_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9b2.svg"); } em[data-emoji=":woman_bald_tone4:"]::before, em[data-emoji="woman_bald_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9b2.svg"); } em[data-emoji=":woman_bald_tone5:"]::before, em[data-emoji="woman_bald_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9b2.svg"); } em[data-emoji=":man_bald:"]::before, em[data-emoji="man_bald"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9b2.svg"); } em[data-emoji=":man_bald_tone1:"]::before, em[data-emoji="man_bald_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9b2.svg"); } em[data-emoji=":man_bald_tone2:"]::before, em[data-emoji="man_bald_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9b2.svg"); } em[data-emoji=":man_bald_tone3:"]::before, em[data-emoji="man_bald_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9b2.svg"); } em[data-emoji=":man_bald_tone4:"]::before, em[data-emoji="man_bald_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9b2.svg"); } em[data-emoji=":man_bald_tone5:"]::before, em[data-emoji="man_bald_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9b2.svg"); } em[data-emoji=":bearded_person:"]::before, em[data-emoji="bearded_person"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4.svg"); } em[data-emoji=":bearded_person_tone1:"]::before, em[data-emoji="bearded_person_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fb.svg"); } em[data-emoji=":bearded_person_tone2:"]::before, em[data-emoji="bearded_person_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fc.svg"); } em[data-emoji=":bearded_person_tone3:"]::before, em[data-emoji="bearded_person_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fd.svg"); } em[data-emoji=":bearded_person_tone4:"]::before, em[data-emoji="bearded_person_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fe.svg"); } em[data-emoji=":bearded_person_tone5:"]::before, em[data-emoji="bearded_person_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3ff.svg"); } em[data-emoji=":woman_beard:"]::before, em[data-emoji="woman_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-200d-2640-fe0f.svg"); } em[data-emoji=":woman_tone1_beard:"]::before, em[data-emoji="woman_tone1_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_tone2_beard:"]::before, em[data-emoji="woman_tone2_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_tone3_beard:"]::before, em[data-emoji="woman_tone3_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_tone4_beard:"]::before, em[data-emoji="woman_tone4_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_tone5_beard:"]::before, em[data-emoji="woman_tone5_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_beard:"]::before, em[data-emoji="man_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-200d-2642-fe0f.svg"); } em[data-emoji=":man_tone1_beard:"]::before, em[data-emoji="man_tone1_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_tone2_beard:"]::before, em[data-emoji="man_tone2_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_tone3_beard:"]::before, em[data-emoji="man_tone3_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_tone4_beard:"]::before, em[data-emoji="man_tone4_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_tone5_beard:"]::before, em[data-emoji="man_tone5_beard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d4-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":older_adult:"]::before, em[data-emoji="older_adult"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3.svg"); } em[data-emoji=":older_adult_tone1:"]::before, em[data-emoji="older_adult_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3-1f3fb.svg"); } em[data-emoji=":older_adult_tone2:"]::before, em[data-emoji="older_adult_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3-1f3fc.svg"); } em[data-emoji=":older_adult_tone3:"]::before, em[data-emoji="older_adult_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3-1f3fd.svg"); } em[data-emoji=":older_adult_tone4:"]::before, em[data-emoji="older_adult_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3-1f3fe.svg"); } em[data-emoji=":older_adult_tone5:"]::before, em[data-emoji="older_adult_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d3-1f3ff.svg"); } em[data-emoji=":older_woman:"]::before, em[data-emoji="older_woman"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475.svg"); } em[data-emoji=":older_woman_tone1:"]::before, em[data-emoji="older_woman_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475-1f3fb.svg"); } em[data-emoji=":older_woman_tone2:"]::before, em[data-emoji="older_woman_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475-1f3fc.svg"); } em[data-emoji=":older_woman_tone3:"]::before, em[data-emoji="older_woman_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475-1f3fd.svg"); } em[data-emoji=":older_woman_tone4:"]::before, em[data-emoji="older_woman_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475-1f3fe.svg"); } em[data-emoji=":older_woman_tone5:"]::before, em[data-emoji="older_woman_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f475-1f3ff.svg"); } em[data-emoji=":older_man:"]::before, em[data-emoji="older_man"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474.svg"); } em[data-emoji=":older_man_tone1:"]::before, em[data-emoji="older_man_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474-1f3fb.svg"); } em[data-emoji=":older_man_tone2:"]::before, em[data-emoji="older_man_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474-1f3fc.svg"); } em[data-emoji=":older_man_tone3:"]::before, em[data-emoji="older_man_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474-1f3fd.svg"); } em[data-emoji=":older_man_tone4:"]::before, em[data-emoji="older_man_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474-1f3fe.svg"); } em[data-emoji=":older_man_tone5:"]::before, em[data-emoji="older_man_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f474-1f3ff.svg"); } em[data-emoji=":man_with_chinese_cap:"]::before, em[data-emoji="man_with_chinese_cap"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472.svg"); } em[data-emoji=":man_with_chinese_cap_tone1:"]::before, em[data-emoji="man_with_chinese_cap_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472-1f3fb.svg"); } em[data-emoji=":man_with_chinese_cap_tone2:"]::before, em[data-emoji="man_with_chinese_cap_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472-1f3fc.svg"); } em[data-emoji=":man_with_chinese_cap_tone3:"]::before, em[data-emoji="man_with_chinese_cap_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472-1f3fd.svg"); } em[data-emoji=":man_with_chinese_cap_tone4:"]::before, em[data-emoji="man_with_chinese_cap_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472-1f3fe.svg"); } em[data-emoji=":man_with_chinese_cap_tone5:"]::before, em[data-emoji="man_with_chinese_cap_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f472-1f3ff.svg"); } em[data-emoji=":person_wearing_turban:"]::before, em[data-emoji="person_wearing_turban"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473.svg"); } em[data-emoji=":person_wearing_turban_tone1:"]::before, em[data-emoji="person_wearing_turban_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fb.svg"); } em[data-emoji=":person_wearing_turban_tone2:"]::before, em[data-emoji="person_wearing_turban_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fc.svg"); } em[data-emoji=":person_wearing_turban_tone3:"]::before, em[data-emoji="person_wearing_turban_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fd.svg"); } em[data-emoji=":person_wearing_turban_tone4:"]::before, em[data-emoji="person_wearing_turban_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fe.svg"); } em[data-emoji=":person_wearing_turban_tone5:"]::before, em[data-emoji="person_wearing_turban_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3ff.svg"); } em[data-emoji=":woman_wearing_turban:"]::before, em[data-emoji="woman_wearing_turban"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-200d-2640-fe0f.svg"); } em[data-emoji=":woman_wearing_turban_tone1:"]::before, em[data-emoji="woman_wearing_turban_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_wearing_turban_tone2:"]::before, em[data-emoji="woman_wearing_turban_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_wearing_turban_tone3:"]::before, em[data-emoji="woman_wearing_turban_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_wearing_turban_tone4:"]::before, em[data-emoji="woman_wearing_turban_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_wearing_turban_tone5:"]::before, em[data-emoji="woman_wearing_turban_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_wearing_turban:"]::before, em[data-emoji="man_wearing_turban"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-200d-2642-fe0f.svg"); } em[data-emoji=":man_wearing_turban_tone1:"]::before, em[data-emoji="man_wearing_turban_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_wearing_turban_tone2:"]::before, em[data-emoji="man_wearing_turban_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_wearing_turban_tone3:"]::before, em[data-emoji="man_wearing_turban_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_wearing_turban_tone4:"]::before, em[data-emoji="man_wearing_turban_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_wearing_turban_tone5:"]::before, em[data-emoji="man_wearing_turban_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f473-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":woman_with_headscarf:"]::before, em[data-emoji="woman_with_headscarf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5.svg"); } em[data-emoji=":woman_with_headscarf_tone1:"]::before, em[data-emoji="woman_with_headscarf_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5-1f3fb.svg"); } em[data-emoji=":woman_with_headscarf_tone2:"]::before, em[data-emoji="woman_with_headscarf_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5-1f3fc.svg"); } em[data-emoji=":woman_with_headscarf_tone3:"]::before, em[data-emoji="woman_with_headscarf_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5-1f3fd.svg"); } em[data-emoji=":woman_with_headscarf_tone4:"]::before, em[data-emoji="woman_with_headscarf_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5-1f3fe.svg"); } em[data-emoji=":woman_with_headscarf_tone5:"]::before, em[data-emoji="woman_with_headscarf_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d5-1f3ff.svg"); } em[data-emoji=":police_officer:"]::before, em[data-emoji="police_officer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e.svg"); } em[data-emoji=":police_officer_tone1:"]::before, em[data-emoji="police_officer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fb.svg"); } em[data-emoji=":police_officer_tone2:"]::before, em[data-emoji="police_officer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fc.svg"); } em[data-emoji=":police_officer_tone3:"]::before, em[data-emoji="police_officer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fd.svg"); } em[data-emoji=":police_officer_tone4:"]::before, em[data-emoji="police_officer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fe.svg"); } em[data-emoji=":police_officer_tone5:"]::before, em[data-emoji="police_officer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3ff.svg"); } em[data-emoji=":woman_police_officer:"]::before, em[data-emoji="woman_police_officer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-200d-2640-fe0f.svg"); } em[data-emoji=":woman_police_officer_tone1:"]::before, em[data-emoji="woman_police_officer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_police_officer_tone2:"]::before, em[data-emoji="woman_police_officer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_police_officer_tone3:"]::before, em[data-emoji="woman_police_officer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_police_officer_tone4:"]::before, em[data-emoji="woman_police_officer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_police_officer_tone5:"]::before, em[data-emoji="woman_police_officer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_police_officer:"]::before, em[data-emoji="man_police_officer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-200d-2642-fe0f.svg"); } em[data-emoji=":man_police_officer_tone1:"]::before, em[data-emoji="man_police_officer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_police_officer_tone2:"]::before, em[data-emoji="man_police_officer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_police_officer_tone3:"]::before, em[data-emoji="man_police_officer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_police_officer_tone4:"]::before, em[data-emoji="man_police_officer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_police_officer_tone5:"]::before, em[data-emoji="man_police_officer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46e-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":construction_worker:"]::before, em[data-emoji="construction_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477.svg"); } em[data-emoji=":construction_worker_tone1:"]::before, em[data-emoji="construction_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fb.svg"); } em[data-emoji=":construction_worker_tone2:"]::before, em[data-emoji="construction_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fc.svg"); } em[data-emoji=":construction_worker_tone3:"]::before, em[data-emoji="construction_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fd.svg"); } em[data-emoji=":construction_worker_tone4:"]::before, em[data-emoji="construction_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fe.svg"); } em[data-emoji=":construction_worker_tone5:"]::before, em[data-emoji="construction_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3ff.svg"); } em[data-emoji=":woman_construction_worker:"]::before, em[data-emoji="woman_construction_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-200d-2640-fe0f.svg"); } em[data-emoji=":woman_construction_worker_tone1:"]::before, em[data-emoji="woman_construction_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_construction_worker_tone2:"]::before, em[data-emoji="woman_construction_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_construction_worker_tone3:"]::before, em[data-emoji="woman_construction_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_construction_worker_tone4:"]::before, em[data-emoji="woman_construction_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_construction_worker_tone5:"]::before, em[data-emoji="woman_construction_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_construction_worker:"]::before, em[data-emoji="man_construction_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-200d-2642-fe0f.svg"); } em[data-emoji=":man_construction_worker_tone1:"]::before, em[data-emoji="man_construction_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_construction_worker_tone2:"]::before, em[data-emoji="man_construction_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_construction_worker_tone3:"]::before, em[data-emoji="man_construction_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_construction_worker_tone4:"]::before, em[data-emoji="man_construction_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_construction_worker_tone5:"]::before, em[data-emoji="man_construction_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f477-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":guard:"]::before, em[data-emoji="guard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482.svg"); } em[data-emoji=":guard_tone1:"]::before, em[data-emoji="guard_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fb.svg"); } em[data-emoji=":guard_tone2:"]::before, em[data-emoji="guard_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fc.svg"); } em[data-emoji=":guard_tone3:"]::before, em[data-emoji="guard_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fd.svg"); } em[data-emoji=":guard_tone4:"]::before, em[data-emoji="guard_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fe.svg"); } em[data-emoji=":guard_tone5:"]::before, em[data-emoji="guard_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3ff.svg"); } em[data-emoji=":woman_guard:"]::before, em[data-emoji="woman_guard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-200d-2640-fe0f.svg"); } em[data-emoji=":woman_guard_tone1:"]::before, em[data-emoji="woman_guard_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_guard_tone2:"]::before, em[data-emoji="woman_guard_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_guard_tone3:"]::before, em[data-emoji="woman_guard_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_guard_tone4:"]::before, em[data-emoji="woman_guard_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_guard_tone5:"]::before, em[data-emoji="woman_guard_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_guard:"]::before, em[data-emoji="man_guard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-200d-2642-fe0f.svg"); } em[data-emoji=":man_guard_tone1:"]::before, em[data-emoji="man_guard_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_guard_tone2:"]::before, em[data-emoji="man_guard_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_guard_tone3:"]::before, em[data-emoji="man_guard_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_guard_tone4:"]::before, em[data-emoji="man_guard_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_guard_tone5:"]::before, em[data-emoji="man_guard_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f482-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":detective:"]::before, em[data-emoji="detective"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575.svg"); } em[data-emoji=":detective_tone1:"]::before, em[data-emoji="detective_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fb.svg"); } em[data-emoji=":detective_tone2:"]::before, em[data-emoji="detective_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fc.svg"); } em[data-emoji=":detective_tone3:"]::before, em[data-emoji="detective_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fd.svg"); } em[data-emoji=":detective_tone4:"]::before, em[data-emoji="detective_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fe.svg"); } em[data-emoji=":detective_tone5:"]::before, em[data-emoji="detective_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3ff.svg"); } em[data-emoji=":woman_detective:"]::before, em[data-emoji="woman_detective"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-fe0f-200d-2640-fe0f.svg"); } em[data-emoji=":woman_detective_tone1:"]::before, em[data-emoji="woman_detective_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_detective_tone2:"]::before, em[data-emoji="woman_detective_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_detective_tone3:"]::before, em[data-emoji="woman_detective_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_detective_tone4:"]::before, em[data-emoji="woman_detective_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_detective_tone5:"]::before, em[data-emoji="woman_detective_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_detective:"]::before, em[data-emoji="man_detective"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-fe0f-200d-2642-fe0f.svg"); } em[data-emoji=":man_detective_tone1:"]::before, em[data-emoji="man_detective_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_detective_tone2:"]::before, em[data-emoji="man_detective_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_detective_tone3:"]::before, em[data-emoji="man_detective_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_detective_tone4:"]::before, em[data-emoji="man_detective_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_detective_tone5:"]::before, em[data-emoji="man_detective_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f575-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":health_worker:"]::before, em[data-emoji="health_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-2695-fe0f.svg"); } em[data-emoji=":health_worker_tone1:"]::before, em[data-emoji="health_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2695-fe0f.svg"); } em[data-emoji=":health_worker_tone2:"]::before, em[data-emoji="health_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2695-fe0f.svg"); } em[data-emoji=":health_worker_tone3:"]::before, em[data-emoji="health_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2695-fe0f.svg"); } em[data-emoji=":health_worker_tone4:"]::before, em[data-emoji="health_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2695-fe0f.svg"); } em[data-emoji=":health_worker_tone5:"]::before, em[data-emoji="health_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2695-fe0f.svg"); } em[data-emoji=":woman_health_worker:"]::before, em[data-emoji="woman_health_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2695-fe0f.svg"); } em[data-emoji=":woman_health_worker_tone1:"]::before, em[data-emoji="woman_health_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2695-fe0f.svg"); } em[data-emoji=":woman_health_worker_tone2:"]::before, em[data-emoji="woman_health_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2695-fe0f.svg"); } em[data-emoji=":woman_health_worker_tone3:"]::before, em[data-emoji="woman_health_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2695-fe0f.svg"); } em[data-emoji=":woman_health_worker_tone4:"]::before, em[data-emoji="woman_health_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2695-fe0f.svg"); } em[data-emoji=":woman_health_worker_tone5:"]::before, em[data-emoji="woman_health_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2695-fe0f.svg"); } em[data-emoji=":man_health_worker:"]::before, em[data-emoji="man_health_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-2695-fe0f.svg"); } em[data-emoji=":man_health_worker_tone1:"]::before, em[data-emoji="man_health_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2695-fe0f.svg"); } em[data-emoji=":man_health_worker_tone2:"]::before, em[data-emoji="man_health_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2695-fe0f.svg"); } em[data-emoji=":man_health_worker_tone3:"]::before, em[data-emoji="man_health_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2695-fe0f.svg"); } em[data-emoji=":man_health_worker_tone4:"]::before, em[data-emoji="man_health_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2695-fe0f.svg"); } em[data-emoji=":man_health_worker_tone5:"]::before, em[data-emoji="man_health_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2695-fe0f.svg"); } em[data-emoji=":farmer:"]::before, em[data-emoji="farmer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f33e.svg"); } em[data-emoji=":farmer_tone1:"]::before, em[data-emoji="farmer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f33e.svg"); } em[data-emoji=":farmer_tone2:"]::before, em[data-emoji="farmer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f33e.svg"); } em[data-emoji=":farmer_tone3:"]::before, em[data-emoji="farmer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f33e.svg"); } em[data-emoji=":farmer_tone4:"]::before, em[data-emoji="farmer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f33e.svg"); } em[data-emoji=":farmer_tone5:"]::before, em[data-emoji="farmer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f33e.svg"); } em[data-emoji=":woman_farmer:"]::before, em[data-emoji="woman_farmer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f33e.svg"); } em[data-emoji=":woman_farmer_tone1:"]::before, em[data-emoji="woman_farmer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f33e.svg"); } em[data-emoji=":woman_farmer_tone2:"]::before, em[data-emoji="woman_farmer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f33e.svg"); } em[data-emoji=":woman_farmer_tone3:"]::before, em[data-emoji="woman_farmer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f33e.svg"); } em[data-emoji=":woman_farmer_tone4:"]::before, em[data-emoji="woman_farmer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f33e.svg"); } em[data-emoji=":woman_farmer_tone5:"]::before, em[data-emoji="woman_farmer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f33e.svg"); } em[data-emoji=":man_farmer:"]::before, em[data-emoji="man_farmer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f33e.svg"); } em[data-emoji=":man_farmer_tone1:"]::before, em[data-emoji="man_farmer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f33e.svg"); } em[data-emoji=":man_farmer_tone2:"]::before, em[data-emoji="man_farmer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f33e.svg"); } em[data-emoji=":man_farmer_tone3:"]::before, em[data-emoji="man_farmer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f33e.svg"); } em[data-emoji=":man_farmer_tone4:"]::before, em[data-emoji="man_farmer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f33e.svg"); } em[data-emoji=":man_farmer_tone5:"]::before, em[data-emoji="man_farmer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f33e.svg"); } em[data-emoji=":cook:"]::before, em[data-emoji="cook"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f373.svg"); } em[data-emoji=":cook_tone1:"]::before, em[data-emoji="cook_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f373.svg"); } em[data-emoji=":cook_tone2:"]::before, em[data-emoji="cook_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f373.svg"); } em[data-emoji=":cook_tone3:"]::before, em[data-emoji="cook_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f373.svg"); } em[data-emoji=":cook_tone4:"]::before, em[data-emoji="cook_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f373.svg"); } em[data-emoji=":cook_tone5:"]::before, em[data-emoji="cook_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f373.svg"); } em[data-emoji=":woman_cook:"]::before, em[data-emoji="woman_cook"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f373.svg"); } em[data-emoji=":woman_cook_tone1:"]::before, em[data-emoji="woman_cook_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f373.svg"); } em[data-emoji=":woman_cook_tone2:"]::before, em[data-emoji="woman_cook_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f373.svg"); } em[data-emoji=":woman_cook_tone3:"]::before, em[data-emoji="woman_cook_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f373.svg"); } em[data-emoji=":woman_cook_tone4:"]::before, em[data-emoji="woman_cook_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f373.svg"); } em[data-emoji=":woman_cook_tone5:"]::before, em[data-emoji="woman_cook_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f373.svg"); } em[data-emoji=":man_cook:"]::before, em[data-emoji="man_cook"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f373.svg"); } em[data-emoji=":man_cook_tone1:"]::before, em[data-emoji="man_cook_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f373.svg"); } em[data-emoji=":man_cook_tone2:"]::before, em[data-emoji="man_cook_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f373.svg"); } em[data-emoji=":man_cook_tone3:"]::before, em[data-emoji="man_cook_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f373.svg"); } em[data-emoji=":man_cook_tone4:"]::before, em[data-emoji="man_cook_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f373.svg"); } em[data-emoji=":man_cook_tone5:"]::before, em[data-emoji="man_cook_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f373.svg"); } em[data-emoji=":student:"]::before, em[data-emoji="student"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f393.svg"); } em[data-emoji=":student_tone1:"]::before, em[data-emoji="student_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f393.svg"); } em[data-emoji=":student_tone2:"]::before, em[data-emoji="student_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f393.svg"); } em[data-emoji=":student_tone3:"]::before, em[data-emoji="student_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f393.svg"); } em[data-emoji=":student_tone4:"]::before, em[data-emoji="student_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f393.svg"); } em[data-emoji=":student_tone5:"]::before, em[data-emoji="student_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f393.svg"); } em[data-emoji=":woman_student:"]::before, em[data-emoji="woman_student"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f393.svg"); } em[data-emoji=":woman_student_tone1:"]::before, em[data-emoji="woman_student_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f393.svg"); } em[data-emoji=":woman_student_tone2:"]::before, em[data-emoji="woman_student_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f393.svg"); } em[data-emoji=":woman_student_tone3:"]::before, em[data-emoji="woman_student_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f393.svg"); } em[data-emoji=":woman_student_tone4:"]::before, em[data-emoji="woman_student_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f393.svg"); } em[data-emoji=":woman_student_tone5:"]::before, em[data-emoji="woman_student_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f393.svg"); } em[data-emoji=":man_student:"]::before, em[data-emoji="man_student"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f393.svg"); } em[data-emoji=":man_student_tone1:"]::before, em[data-emoji="man_student_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f393.svg"); } em[data-emoji=":man_student_tone2:"]::before, em[data-emoji="man_student_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f393.svg"); } em[data-emoji=":man_student_tone3:"]::before, em[data-emoji="man_student_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f393.svg"); } em[data-emoji=":man_student_tone4:"]::before, em[data-emoji="man_student_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f393.svg"); } em[data-emoji=":man_student_tone5:"]::before, em[data-emoji="man_student_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f393.svg"); } em[data-emoji=":singer:"]::before, em[data-emoji="singer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f3a4.svg"); } em[data-emoji=":singer_tone1:"]::before, em[data-emoji="singer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f3a4.svg"); } em[data-emoji=":singer_tone2:"]::before, em[data-emoji="singer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f3a4.svg"); } em[data-emoji=":singer_tone3:"]::before, em[data-emoji="singer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f3a4.svg"); } em[data-emoji=":singer_tone4:"]::before, em[data-emoji="singer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f3a4.svg"); } em[data-emoji=":singer_tone5:"]::before, em[data-emoji="singer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f3a4.svg"); } em[data-emoji=":woman_singer:"]::before, em[data-emoji="woman_singer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f3a4.svg"); } em[data-emoji=":woman_singer_tone1:"]::before, em[data-emoji="woman_singer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f3a4.svg"); } em[data-emoji=":woman_singer_tone2:"]::before, em[data-emoji="woman_singer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f3a4.svg"); } em[data-emoji=":woman_singer_tone3:"]::before, em[data-emoji="woman_singer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f3a4.svg"); } em[data-emoji=":woman_singer_tone4:"]::before, em[data-emoji="woman_singer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f3a4.svg"); } em[data-emoji=":woman_singer_tone5:"]::before, em[data-emoji="woman_singer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f3a4.svg"); } em[data-emoji=":man_singer:"]::before, em[data-emoji="man_singer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f3a4.svg"); } em[data-emoji=":man_singer_tone1:"]::before, em[data-emoji="man_singer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f3a4.svg"); } em[data-emoji=":man_singer_tone2:"]::before, em[data-emoji="man_singer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f3a4.svg"); } em[data-emoji=":man_singer_tone3:"]::before, em[data-emoji="man_singer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f3a4.svg"); } em[data-emoji=":man_singer_tone4:"]::before, em[data-emoji="man_singer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f3a4.svg"); } em[data-emoji=":man_singer_tone5:"]::before, em[data-emoji="man_singer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f3a4.svg"); } em[data-emoji=":teacher:"]::before, em[data-emoji="teacher"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f3eb.svg"); } em[data-emoji=":teacher_tone1:"]::before, em[data-emoji="teacher_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f3eb.svg"); } em[data-emoji=":teacher_tone2:"]::before, em[data-emoji="teacher_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f3eb.svg"); } em[data-emoji=":teacher_tone3:"]::before, em[data-emoji="teacher_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f3eb.svg"); } em[data-emoji=":teacher_tone4:"]::before, em[data-emoji="teacher_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f3eb.svg"); } em[data-emoji=":teacher_tone5:"]::before, em[data-emoji="teacher_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f3eb.svg"); } em[data-emoji=":woman_teacher:"]::before, em[data-emoji="woman_teacher"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f3eb.svg"); } em[data-emoji=":woman_teacher_tone1:"]::before, em[data-emoji="woman_teacher_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f3eb.svg"); } em[data-emoji=":woman_teacher_tone2:"]::before, em[data-emoji="woman_teacher_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f3eb.svg"); } em[data-emoji=":woman_teacher_tone3:"]::before, em[data-emoji="woman_teacher_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f3eb.svg"); } em[data-emoji=":woman_teacher_tone4:"]::before, em[data-emoji="woman_teacher_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f3eb.svg"); } em[data-emoji=":woman_teacher_tone5:"]::before, em[data-emoji="woman_teacher_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f3eb.svg"); } em[data-emoji=":man_teacher:"]::before, em[data-emoji="man_teacher"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f3eb.svg"); } em[data-emoji=":man_teacher_tone1:"]::before, em[data-emoji="man_teacher_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f3eb.svg"); } em[data-emoji=":man_teacher_tone2:"]::before, em[data-emoji="man_teacher_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f3eb.svg"); } em[data-emoji=":man_teacher_tone3:"]::before, em[data-emoji="man_teacher_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f3eb.svg"); } em[data-emoji=":man_teacher_tone4:"]::before, em[data-emoji="man_teacher_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f3eb.svg"); } em[data-emoji=":man_teacher_tone5:"]::before, em[data-emoji="man_teacher_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f3eb.svg"); } em[data-emoji=":factory_worker:"]::before, em[data-emoji="factory_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f3ed.svg"); } em[data-emoji=":factory_worker_tone1:"]::before, em[data-emoji="factory_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f3ed.svg"); } em[data-emoji=":factory_worker_tone2:"]::before, em[data-emoji="factory_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f3ed.svg"); } em[data-emoji=":factory_worker_tone3:"]::before, em[data-emoji="factory_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f3ed.svg"); } em[data-emoji=":factory_worker_tone4:"]::before, em[data-emoji="factory_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f3ed.svg"); } em[data-emoji=":factory_worker_tone5:"]::before, em[data-emoji="factory_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f3ed.svg"); } em[data-emoji=":woman_factory_worker:"]::before, em[data-emoji="woman_factory_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f3ed.svg"); } em[data-emoji=":woman_factory_worker_tone1:"]::before, em[data-emoji="woman_factory_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f3ed.svg"); } em[data-emoji=":woman_factory_worker_tone2:"]::before, em[data-emoji="woman_factory_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f3ed.svg"); } em[data-emoji=":woman_factory_worker_tone3:"]::before, em[data-emoji="woman_factory_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f3ed.svg"); } em[data-emoji=":woman_factory_worker_tone4:"]::before, em[data-emoji="woman_factory_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f3ed.svg"); } em[data-emoji=":woman_factory_worker_tone5:"]::before, em[data-emoji="woman_factory_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f3ed.svg"); } em[data-emoji=":man_factory_worker:"]::before, em[data-emoji="man_factory_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f3ed.svg"); } em[data-emoji=":man_factory_worker_tone1:"]::before, em[data-emoji="man_factory_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f3ed.svg"); } em[data-emoji=":man_factory_worker_tone2:"]::before, em[data-emoji="man_factory_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f3ed.svg"); } em[data-emoji=":man_factory_worker_tone3:"]::before, em[data-emoji="man_factory_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f3ed.svg"); } em[data-emoji=":man_factory_worker_tone4:"]::before, em[data-emoji="man_factory_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f3ed.svg"); } em[data-emoji=":man_factory_worker_tone5:"]::before, em[data-emoji="man_factory_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f3ed.svg"); } em[data-emoji=":technologist:"]::before, em[data-emoji="technologist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f4bb.svg"); } em[data-emoji=":technologist_tone1:"]::before, em[data-emoji="technologist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f4bb.svg"); } em[data-emoji=":technologist_tone2:"]::before, em[data-emoji="technologist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f4bb.svg"); } em[data-emoji=":technologist_tone3:"]::before, em[data-emoji="technologist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f4bb.svg"); } em[data-emoji=":technologist_tone4:"]::before, em[data-emoji="technologist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f4bb.svg"); } em[data-emoji=":technologist_tone5:"]::before, em[data-emoji="technologist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f4bb.svg"); } em[data-emoji=":woman_technologist:"]::before, em[data-emoji="woman_technologist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f4bb.svg"); } em[data-emoji=":woman_technologist_tone1:"]::before, em[data-emoji="woman_technologist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f4bb.svg"); } em[data-emoji=":woman_technologist_tone2:"]::before, em[data-emoji="woman_technologist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f4bb.svg"); } em[data-emoji=":woman_technologist_tone3:"]::before, em[data-emoji="woman_technologist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f4bb.svg"); } em[data-emoji=":woman_technologist_tone4:"]::before, em[data-emoji="woman_technologist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f4bb.svg"); } em[data-emoji=":woman_technologist_tone5:"]::before, em[data-emoji="woman_technologist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f4bb.svg"); } em[data-emoji=":man_technologist:"]::before, em[data-emoji="man_technologist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f4bb.svg"); } em[data-emoji=":man_technologist_tone1:"]::before, em[data-emoji="man_technologist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f4bb.svg"); } em[data-emoji=":man_technologist_tone2:"]::before, em[data-emoji="man_technologist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f4bb.svg"); } em[data-emoji=":man_technologist_tone3:"]::before, em[data-emoji="man_technologist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f4bb.svg"); } em[data-emoji=":man_technologist_tone4:"]::before, em[data-emoji="man_technologist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f4bb.svg"); } em[data-emoji=":man_technologist_tone5:"]::before, em[data-emoji="man_technologist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f4bb.svg"); } em[data-emoji=":office_worker:"]::before, em[data-emoji="office_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f4bc.svg"); } em[data-emoji=":office_worker_tone1:"]::before, em[data-emoji="office_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f4bc.svg"); } em[data-emoji=":office_worker_tone2:"]::before, em[data-emoji="office_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f4bc.svg"); } em[data-emoji=":office_worker_tone3:"]::before, em[data-emoji="office_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f4bc.svg"); } em[data-emoji=":office_worker_tone4:"]::before, em[data-emoji="office_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f4bc.svg"); } em[data-emoji=":office_worker_tone5:"]::before, em[data-emoji="office_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f4bc.svg"); } em[data-emoji=":woman_office_worker:"]::before, em[data-emoji="woman_office_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f4bc.svg"); } em[data-emoji=":woman_office_worker_tone1:"]::before, em[data-emoji="woman_office_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f4bc.svg"); } em[data-emoji=":woman_office_worker_tone2:"]::before, em[data-emoji="woman_office_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f4bc.svg"); } em[data-emoji=":woman_office_worker_tone3:"]::before, em[data-emoji="woman_office_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f4bc.svg"); } em[data-emoji=":woman_office_worker_tone4:"]::before, em[data-emoji="woman_office_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f4bc.svg"); } em[data-emoji=":woman_office_worker_tone5:"]::before, em[data-emoji="woman_office_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f4bc.svg"); } em[data-emoji=":man_office_worker:"]::before, em[data-emoji="man_office_worker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f4bc.svg"); } em[data-emoji=":man_office_worker_tone1:"]::before, em[data-emoji="man_office_worker_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f4bc.svg"); } em[data-emoji=":man_office_worker_tone2:"]::before, em[data-emoji="man_office_worker_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f4bc.svg"); } em[data-emoji=":man_office_worker_tone3:"]::before, em[data-emoji="man_office_worker_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f4bc.svg"); } em[data-emoji=":man_office_worker_tone4:"]::before, em[data-emoji="man_office_worker_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f4bc.svg"); } em[data-emoji=":man_office_worker_tone5:"]::before, em[data-emoji="man_office_worker_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f4bc.svg"); } em[data-emoji=":mechanic:"]::before, em[data-emoji="mechanic"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f527.svg"); } em[data-emoji=":mechanic_tone1:"]::before, em[data-emoji="mechanic_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f527.svg"); } em[data-emoji=":mechanic_tone2:"]::before, em[data-emoji="mechanic_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f527.svg"); } em[data-emoji=":mechanic_tone3:"]::before, em[data-emoji="mechanic_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f527.svg"); } em[data-emoji=":mechanic_tone4:"]::before, em[data-emoji="mechanic_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f527.svg"); } em[data-emoji=":mechanic_tone5:"]::before, em[data-emoji="mechanic_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f527.svg"); } em[data-emoji=":woman_mechanic:"]::before, em[data-emoji="woman_mechanic"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f527.svg"); } em[data-emoji=":woman_mechanic_tone1:"]::before, em[data-emoji="woman_mechanic_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f527.svg"); } em[data-emoji=":woman_mechanic_tone2:"]::before, em[data-emoji="woman_mechanic_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f527.svg"); } em[data-emoji=":woman_mechanic_tone3:"]::before, em[data-emoji="woman_mechanic_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f527.svg"); } em[data-emoji=":woman_mechanic_tone4:"]::before, em[data-emoji="woman_mechanic_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f527.svg"); } em[data-emoji=":woman_mechanic_tone5:"]::before, em[data-emoji="woman_mechanic_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f527.svg"); } em[data-emoji=":man_mechanic:"]::before, em[data-emoji="man_mechanic"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f527.svg"); } em[data-emoji=":man_mechanic_tone1:"]::before, em[data-emoji="man_mechanic_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f527.svg"); } em[data-emoji=":man_mechanic_tone2:"]::before, em[data-emoji="man_mechanic_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f527.svg"); } em[data-emoji=":man_mechanic_tone3:"]::before, em[data-emoji="man_mechanic_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f527.svg"); } em[data-emoji=":man_mechanic_tone4:"]::before, em[data-emoji="man_mechanic_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f527.svg"); } em[data-emoji=":man_mechanic_tone5:"]::before, em[data-emoji="man_mechanic_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f527.svg"); } em[data-emoji=":scientist:"]::before, em[data-emoji="scientist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f52c.svg"); } em[data-emoji=":scientist_tone1:"]::before, em[data-emoji="scientist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f52c.svg"); } em[data-emoji=":scientist_tone2:"]::before, em[data-emoji="scientist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f52c.svg"); } em[data-emoji=":scientist_tone3:"]::before, em[data-emoji="scientist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f52c.svg"); } em[data-emoji=":scientist_tone4:"]::before, em[data-emoji="scientist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f52c.svg"); } em[data-emoji=":scientist_tone5:"]::before, em[data-emoji="scientist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f52c.svg"); } em[data-emoji=":woman_scientist:"]::before, em[data-emoji="woman_scientist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f52c.svg"); } em[data-emoji=":woman_scientist_tone1:"]::before, em[data-emoji="woman_scientist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f52c.svg"); } em[data-emoji=":woman_scientist_tone2:"]::before, em[data-emoji="woman_scientist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f52c.svg"); } em[data-emoji=":woman_scientist_tone3:"]::before, em[data-emoji="woman_scientist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f52c.svg"); } em[data-emoji=":woman_scientist_tone4:"]::before, em[data-emoji="woman_scientist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f52c.svg"); } em[data-emoji=":woman_scientist_tone5:"]::before, em[data-emoji="woman_scientist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f52c.svg"); } em[data-emoji=":man_scientist:"]::before, em[data-emoji="man_scientist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f52c.svg"); } em[data-emoji=":man_scientist_tone1:"]::before, em[data-emoji="man_scientist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f52c.svg"); } em[data-emoji=":man_scientist_tone2:"]::before, em[data-emoji="man_scientist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f52c.svg"); } em[data-emoji=":man_scientist_tone3:"]::before, em[data-emoji="man_scientist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f52c.svg"); } em[data-emoji=":man_scientist_tone4:"]::before, em[data-emoji="man_scientist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f52c.svg"); } em[data-emoji=":man_scientist_tone5:"]::before, em[data-emoji="man_scientist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f52c.svg"); } em[data-emoji=":artist:"]::before, em[data-emoji="artist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f3a8.svg"); } em[data-emoji=":artist_tone1:"]::before, em[data-emoji="artist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f3a8.svg"); } em[data-emoji=":artist_tone2:"]::before, em[data-emoji="artist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f3a8.svg"); } em[data-emoji=":artist_tone3:"]::before, em[data-emoji="artist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f3a8.svg"); } em[data-emoji=":artist_tone4:"]::before, em[data-emoji="artist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f3a8.svg"); } em[data-emoji=":artist_tone5:"]::before, em[data-emoji="artist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f3a8.svg"); } em[data-emoji=":woman_artist:"]::before, em[data-emoji="woman_artist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f3a8.svg"); } em[data-emoji=":woman_artist_tone1:"]::before, em[data-emoji="woman_artist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f3a8.svg"); } em[data-emoji=":woman_artist_tone2:"]::before, em[data-emoji="woman_artist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f3a8.svg"); } em[data-emoji=":woman_artist_tone3:"]::before, em[data-emoji="woman_artist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f3a8.svg"); } em[data-emoji=":woman_artist_tone4:"]::before, em[data-emoji="woman_artist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f3a8.svg"); } em[data-emoji=":woman_artist_tone5:"]::before, em[data-emoji="woman_artist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f3a8.svg"); } em[data-emoji=":man_artist:"]::before, em[data-emoji="man_artist"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f3a8.svg"); } em[data-emoji=":man_artist_tone1:"]::before, em[data-emoji="man_artist_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f3a8.svg"); } em[data-emoji=":man_artist_tone2:"]::before, em[data-emoji="man_artist_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f3a8.svg"); } em[data-emoji=":man_artist_tone3:"]::before, em[data-emoji="man_artist_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f3a8.svg"); } em[data-emoji=":man_artist_tone4:"]::before, em[data-emoji="man_artist_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f3a8.svg"); } em[data-emoji=":man_artist_tone5:"]::before, em[data-emoji="man_artist_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f3a8.svg"); } em[data-emoji=":firefighter:"]::before, em[data-emoji="firefighter"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f692.svg"); } em[data-emoji=":firefighter_tone1:"]::before, em[data-emoji="firefighter_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f692.svg"); } em[data-emoji=":firefighter_tone2:"]::before, em[data-emoji="firefighter_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f692.svg"); } em[data-emoji=":firefighter_tone3:"]::before, em[data-emoji="firefighter_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f692.svg"); } em[data-emoji=":firefighter_tone4:"]::before, em[data-emoji="firefighter_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f692.svg"); } em[data-emoji=":firefighter_tone5:"]::before, em[data-emoji="firefighter_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f692.svg"); } em[data-emoji=":woman_firefighter:"]::before, em[data-emoji="woman_firefighter"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f692.svg"); } em[data-emoji=":woman_firefighter_tone1:"]::before, em[data-emoji="woman_firefighter_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f692.svg"); } em[data-emoji=":woman_firefighter_tone2:"]::before, em[data-emoji="woman_firefighter_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f692.svg"); } em[data-emoji=":woman_firefighter_tone3:"]::before, em[data-emoji="woman_firefighter_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f692.svg"); } em[data-emoji=":woman_firefighter_tone4:"]::before, em[data-emoji="woman_firefighter_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f692.svg"); } em[data-emoji=":woman_firefighter_tone5:"]::before, em[data-emoji="woman_firefighter_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f692.svg"); } em[data-emoji=":man_firefighter:"]::before, em[data-emoji="man_firefighter"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f692.svg"); } em[data-emoji=":man_firefighter_tone1:"]::before, em[data-emoji="man_firefighter_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f692.svg"); } em[data-emoji=":man_firefighter_tone2:"]::before, em[data-emoji="man_firefighter_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f692.svg"); } em[data-emoji=":man_firefighter_tone3:"]::before, em[data-emoji="man_firefighter_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f692.svg"); } em[data-emoji=":man_firefighter_tone4:"]::before, em[data-emoji="man_firefighter_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f692.svg"); } em[data-emoji=":man_firefighter_tone5:"]::before, em[data-emoji="man_firefighter_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f692.svg"); } em[data-emoji=":pilot:"]::before, em[data-emoji="pilot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-2708-fe0f.svg"); } em[data-emoji=":pilot_tone1:"]::before, em[data-emoji="pilot_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2708-fe0f.svg"); } em[data-emoji=":pilot_tone2:"]::before, em[data-emoji="pilot_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2708-fe0f.svg"); } em[data-emoji=":pilot_tone3:"]::before, em[data-emoji="pilot_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2708-fe0f.svg"); } em[data-emoji=":pilot_tone4:"]::before, em[data-emoji="pilot_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2708-fe0f.svg"); } em[data-emoji=":pilot_tone5:"]::before, em[data-emoji="pilot_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2708-fe0f.svg"); } em[data-emoji=":woman_pilot:"]::before, em[data-emoji="woman_pilot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2708-fe0f.svg"); } em[data-emoji=":woman_pilot_tone1:"]::before, em[data-emoji="woman_pilot_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2708-fe0f.svg"); } em[data-emoji=":woman_pilot_tone2:"]::before, em[data-emoji="woman_pilot_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2708-fe0f.svg"); } em[data-emoji=":woman_pilot_tone3:"]::before, em[data-emoji="woman_pilot_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2708-fe0f.svg"); } em[data-emoji=":woman_pilot_tone4:"]::before, em[data-emoji="woman_pilot_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2708-fe0f.svg"); } em[data-emoji=":woman_pilot_tone5:"]::before, em[data-emoji="woman_pilot_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2708-fe0f.svg"); } em[data-emoji=":man_pilot:"]::before, em[data-emoji="man_pilot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-2708-fe0f.svg"); } em[data-emoji=":man_pilot_tone1:"]::before, em[data-emoji="man_pilot_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2708-fe0f.svg"); } em[data-emoji=":man_pilot_tone2:"]::before, em[data-emoji="man_pilot_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2708-fe0f.svg"); } em[data-emoji=":man_pilot_tone3:"]::before, em[data-emoji="man_pilot_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2708-fe0f.svg"); } em[data-emoji=":man_pilot_tone4:"]::before, em[data-emoji="man_pilot_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2708-fe0f.svg"); } em[data-emoji=":man_pilot_tone5:"]::before, em[data-emoji="man_pilot_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2708-fe0f.svg"); } em[data-emoji=":astronaut:"]::before, em[data-emoji="astronaut"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f680.svg"); } em[data-emoji=":astronaut_tone1:"]::before, em[data-emoji="astronaut_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f680.svg"); } em[data-emoji=":astronaut_tone2:"]::before, em[data-emoji="astronaut_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f680.svg"); } em[data-emoji=":astronaut_tone3:"]::before, em[data-emoji="astronaut_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f680.svg"); } em[data-emoji=":astronaut_tone4:"]::before, em[data-emoji="astronaut_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f680.svg"); } em[data-emoji=":astronaut_tone5:"]::before, em[data-emoji="astronaut_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f680.svg"); } em[data-emoji=":woman_astronaut:"]::before, em[data-emoji="woman_astronaut"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f680.svg"); } em[data-emoji=":woman_astronaut_tone1:"]::before, em[data-emoji="woman_astronaut_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f680.svg"); } em[data-emoji=":woman_astronaut_tone2:"]::before, em[data-emoji="woman_astronaut_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f680.svg"); } em[data-emoji=":woman_astronaut_tone3:"]::before, em[data-emoji="woman_astronaut_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f680.svg"); } em[data-emoji=":woman_astronaut_tone4:"]::before, em[data-emoji="woman_astronaut_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f680.svg"); } em[data-emoji=":woman_astronaut_tone5:"]::before, em[data-emoji="woman_astronaut_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f680.svg"); } em[data-emoji=":man_astronaut:"]::before, em[data-emoji="man_astronaut"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f680.svg"); } em[data-emoji=":man_astronaut_tone1:"]::before, em[data-emoji="man_astronaut_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f680.svg"); } em[data-emoji=":man_astronaut_tone2:"]::before, em[data-emoji="man_astronaut_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f680.svg"); } em[data-emoji=":man_astronaut_tone3:"]::before, em[data-emoji="man_astronaut_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f680.svg"); } em[data-emoji=":man_astronaut_tone4:"]::before, em[data-emoji="man_astronaut_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f680.svg"); } em[data-emoji=":man_astronaut_tone5:"]::before, em[data-emoji="man_astronaut_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f680.svg"); } em[data-emoji=":judge:"]::before, em[data-emoji="judge"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-2696-fe0f.svg"); } em[data-emoji=":judge_tone1:"]::before, em[data-emoji="judge_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2696-fe0f.svg"); } em[data-emoji=":judge_tone2:"]::before, em[data-emoji="judge_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2696-fe0f.svg"); } em[data-emoji=":judge_tone3:"]::before, em[data-emoji="judge_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2696-fe0f.svg"); } em[data-emoji=":judge_tone4:"]::before, em[data-emoji="judge_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2696-fe0f.svg"); } em[data-emoji=":judge_tone5:"]::before, em[data-emoji="judge_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2696-fe0f.svg"); } em[data-emoji=":woman_judge:"]::before, em[data-emoji="woman_judge"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2696-fe0f.svg"); } em[data-emoji=":woman_judge_tone1:"]::before, em[data-emoji="woman_judge_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2696-fe0f.svg"); } em[data-emoji=":woman_judge_tone2:"]::before, em[data-emoji="woman_judge_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2696-fe0f.svg"); } em[data-emoji=":woman_judge_tone3:"]::before, em[data-emoji="woman_judge_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2696-fe0f.svg"); } em[data-emoji=":woman_judge_tone4:"]::before, em[data-emoji="woman_judge_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2696-fe0f.svg"); } em[data-emoji=":woman_judge_tone5:"]::before, em[data-emoji="woman_judge_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2696-fe0f.svg"); } em[data-emoji=":man_judge:"]::before, em[data-emoji="man_judge"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-2696-fe0f.svg"); } em[data-emoji=":man_judge_tone1:"]::before, em[data-emoji="man_judge_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2696-fe0f.svg"); } em[data-emoji=":man_judge_tone2:"]::before, em[data-emoji="man_judge_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2696-fe0f.svg"); } em[data-emoji=":man_judge_tone3:"]::before, em[data-emoji="man_judge_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2696-fe0f.svg"); } em[data-emoji=":man_judge_tone4:"]::before, em[data-emoji="man_judge_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2696-fe0f.svg"); } em[data-emoji=":man_judge_tone5:"]::before, em[data-emoji="man_judge_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2696-fe0f.svg"); } em[data-emoji=":person_with_veil:"]::before, em[data-emoji="person_with_veil"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470.svg"); } em[data-emoji=":person_with_veil_tone1:"]::before, em[data-emoji="person_with_veil_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fb.svg"); } em[data-emoji=":person_with_veil_tone2:"]::before, em[data-emoji="person_with_veil_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fc.svg"); } em[data-emoji=":person_with_veil_tone3:"]::before, em[data-emoji="person_with_veil_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fd.svg"); } em[data-emoji=":person_with_veil_tone4:"]::before, em[data-emoji="person_with_veil_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fe.svg"); } em[data-emoji=":person_with_veil_tone5:"]::before, em[data-emoji="person_with_veil_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3ff.svg"); } em[data-emoji=":woman_with_veil:"]::before, em[data-emoji="woman_with_veil"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-200d-2640-fe0f.svg"); } em[data-emoji=":woman_with_veil_tone1:"]::before, em[data-emoji="woman_with_veil_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_with_veil_tone2:"]::before, em[data-emoji="woman_with_veil_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_with_veil_tone3:"]::before, em[data-emoji="woman_with_veil_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_with_veil_tone4:"]::before, em[data-emoji="woman_with_veil_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_with_veil_tone5:"]::before, em[data-emoji="woman_with_veil_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_with_veil:"]::before, em[data-emoji="man_with_veil"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-200d-2642-fe0f.svg"); } em[data-emoji=":man_with_veil_tone1:"]::before, em[data-emoji="man_with_veil_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_with_veil_tone2:"]::before, em[data-emoji="man_with_veil_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_with_veil_tone3:"]::before, em[data-emoji="man_with_veil_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_with_veil_tone4:"]::before, em[data-emoji="man_with_veil_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_with_veil_tone5:"]::before, em[data-emoji="man_with_veil_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f470-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_in_tuxedo:"]::before, em[data-emoji="person_in_tuxedo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935.svg"); } em[data-emoji=":person_in_tuxedo_tone1:"]::before, em[data-emoji="person_in_tuxedo_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fb.svg"); } em[data-emoji=":person_in_tuxedo_tone2:"]::before, em[data-emoji="person_in_tuxedo_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fc.svg"); } em[data-emoji=":person_in_tuxedo_tone3:"]::before, em[data-emoji="person_in_tuxedo_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fd.svg"); } em[data-emoji=":person_in_tuxedo_tone4:"]::before, em[data-emoji="person_in_tuxedo_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fe.svg"); } em[data-emoji=":person_in_tuxedo_tone5:"]::before, em[data-emoji="person_in_tuxedo_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3ff.svg"); } em[data-emoji=":woman_in_tuxedo:"]::before, em[data-emoji="woman_in_tuxedo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_tuxedo_tone1:"]::before, em[data-emoji="woman_in_tuxedo_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_tuxedo_tone2:"]::before, em[data-emoji="woman_in_tuxedo_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_tuxedo_tone3:"]::before, em[data-emoji="woman_in_tuxedo_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_tuxedo_tone4:"]::before, em[data-emoji="woman_in_tuxedo_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_tuxedo_tone5:"]::before, em[data-emoji="woman_in_tuxedo_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_in_tuxedo:"]::before, em[data-emoji="man_in_tuxedo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_tuxedo_tone1:"]::before, em[data-emoji="man_in_tuxedo_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_tuxedo_tone2:"]::before, em[data-emoji="man_in_tuxedo_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_tuxedo_tone3:"]::before, em[data-emoji="man_in_tuxedo_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_tuxedo_tone4:"]::before, em[data-emoji="man_in_tuxedo_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_tuxedo_tone5:"]::before, em[data-emoji="man_in_tuxedo_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f935-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_with_crown:"]::before, em[data-emoji="person_with_crown"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5.svg"); } em[data-emoji=":person_with_crown_tone1:"]::before, em[data-emoji="person_with_crown_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5-1f3fb.svg"); } em[data-emoji=":person_with_crown_tone2:"]::before, em[data-emoji="person_with_crown_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5-1f3fc.svg"); } em[data-emoji=":person_with_crown_tone3:"]::before, em[data-emoji="person_with_crown_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5-1f3fd.svg"); } em[data-emoji=":person_with_crown_tone4:"]::before, em[data-emoji="person_with_crown_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5-1f3fe.svg"); } em[data-emoji=":person_with_crown_tone5:"]::before, em[data-emoji="person_with_crown_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac5-1f3ff.svg"); } em[data-emoji=":princess:"]::before, em[data-emoji="princess"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478.svg"); } em[data-emoji=":princess_tone1:"]::before, em[data-emoji="princess_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478-1f3fb.svg"); } em[data-emoji=":princess_tone2:"]::before, em[data-emoji="princess_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478-1f3fc.svg"); } em[data-emoji=":princess_tone3:"]::before, em[data-emoji="princess_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478-1f3fd.svg"); } em[data-emoji=":princess_tone4:"]::before, em[data-emoji="princess_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478-1f3fe.svg"); } em[data-emoji=":princess_tone5:"]::before, em[data-emoji="princess_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f478-1f3ff.svg"); } em[data-emoji=":prince:"]::before, em[data-emoji="prince"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934.svg"); } em[data-emoji=":prince_tone1:"]::before, em[data-emoji="prince_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934-1f3fb.svg"); } em[data-emoji=":prince_tone2:"]::before, em[data-emoji="prince_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934-1f3fc.svg"); } em[data-emoji=":prince_tone3:"]::before, em[data-emoji="prince_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934-1f3fd.svg"); } em[data-emoji=":prince_tone4:"]::before, em[data-emoji="prince_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934-1f3fe.svg"); } em[data-emoji=":prince_tone5:"]::before, em[data-emoji="prince_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f934-1f3ff.svg"); } em[data-emoji=":superhero:"]::before, em[data-emoji="superhero"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8.svg"); } em[data-emoji=":superhero_tone1:"]::before, em[data-emoji="superhero_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fb.svg"); } em[data-emoji=":superhero_tone2:"]::before, em[data-emoji="superhero_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fc.svg"); } em[data-emoji=":superhero_tone3:"]::before, em[data-emoji="superhero_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fd.svg"); } em[data-emoji=":superhero_tone4:"]::before, em[data-emoji="superhero_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fe.svg"); } em[data-emoji=":superhero_tone5:"]::before, em[data-emoji="superhero_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3ff.svg"); } em[data-emoji=":woman_superhero:"]::before, em[data-emoji="woman_superhero"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-200d-2640-fe0f.svg"); } em[data-emoji=":woman_superhero_tone1:"]::before, em[data-emoji="woman_superhero_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_superhero_tone2:"]::before, em[data-emoji="woman_superhero_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_superhero_tone3:"]::before, em[data-emoji="woman_superhero_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_superhero_tone4:"]::before, em[data-emoji="woman_superhero_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_superhero_tone5:"]::before, em[data-emoji="woman_superhero_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_superhero:"]::before, em[data-emoji="man_superhero"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-200d-2642-fe0f.svg"); } em[data-emoji=":man_superhero_tone1:"]::before, em[data-emoji="man_superhero_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_superhero_tone2:"]::before, em[data-emoji="man_superhero_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_superhero_tone3:"]::before, em[data-emoji="man_superhero_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_superhero_tone4:"]::before, em[data-emoji="man_superhero_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_superhero_tone5:"]::before, em[data-emoji="man_superhero_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b8-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":supervillain:"]::before, em[data-emoji="supervillain"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9.svg"); } em[data-emoji=":supervillain_tone1:"]::before, em[data-emoji="supervillain_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fb.svg"); } em[data-emoji=":supervillain_tone2:"]::before, em[data-emoji="supervillain_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fc.svg"); } em[data-emoji=":supervillain_tone3:"]::before, em[data-emoji="supervillain_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fd.svg"); } em[data-emoji=":supervillain_tone4:"]::before, em[data-emoji="supervillain_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fe.svg"); } em[data-emoji=":supervillain_tone5:"]::before, em[data-emoji="supervillain_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3ff.svg"); } em[data-emoji=":woman_supervillain:"]::before, em[data-emoji="woman_supervillain"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-200d-2640-fe0f.svg"); } em[data-emoji=":woman_supervillain_tone1:"]::before, em[data-emoji="woman_supervillain_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_supervillain_tone2:"]::before, em[data-emoji="woman_supervillain_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_supervillain_tone3:"]::before, em[data-emoji="woman_supervillain_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_supervillain_tone4:"]::before, em[data-emoji="woman_supervillain_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_supervillain_tone5:"]::before, em[data-emoji="woman_supervillain_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_supervillain:"]::before, em[data-emoji="man_supervillain"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-200d-2642-fe0f.svg"); } em[data-emoji=":man_supervillain_tone1:"]::before, em[data-emoji="man_supervillain_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_supervillain_tone2:"]::before, em[data-emoji="man_supervillain_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_supervillain_tone3:"]::before, em[data-emoji="man_supervillain_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_supervillain_tone4:"]::before, em[data-emoji="man_supervillain_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_supervillain_tone5:"]::before, em[data-emoji="man_supervillain_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b9-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":ninja:"]::before, em[data-emoji="ninja"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977.svg"); } em[data-emoji=":ninja_tone1:"]::before, em[data-emoji="ninja_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977-1f3fb.svg"); } em[data-emoji=":ninja_tone2:"]::before, em[data-emoji="ninja_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977-1f3fc.svg"); } em[data-emoji=":ninja_tone3:"]::before, em[data-emoji="ninja_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977-1f3fd.svg"); } em[data-emoji=":ninja_tone4:"]::before, em[data-emoji="ninja_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977-1f3fe.svg"); } em[data-emoji=":ninja_tone5:"]::before, em[data-emoji="ninja_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f977-1f3ff.svg"); } em[data-emoji=":mx_claus:"]::before, em[data-emoji="mx_claus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f384.svg"); } em[data-emoji=":mx_claus_tone1:"]::before, em[data-emoji="mx_claus_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f384.svg"); } em[data-emoji=":mx_claus_tone2:"]::before, em[data-emoji="mx_claus_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f384.svg"); } em[data-emoji=":mx_claus_tone3:"]::before, em[data-emoji="mx_claus_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f384.svg"); } em[data-emoji=":mx_claus_tone4:"]::before, em[data-emoji="mx_claus_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f384.svg"); } em[data-emoji=":mx_claus_tone5:"]::before, em[data-emoji="mx_claus_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f384.svg"); } em[data-emoji=":mrs_claus:"]::before, em[data-emoji="mrs_claus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936.svg"); } em[data-emoji=":mrs_claus_tone1:"]::before, em[data-emoji="mrs_claus_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936-1f3fb.svg"); } em[data-emoji=":mrs_claus_tone2:"]::before, em[data-emoji="mrs_claus_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936-1f3fc.svg"); } em[data-emoji=":mrs_claus_tone3:"]::before, em[data-emoji="mrs_claus_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936-1f3fd.svg"); } em[data-emoji=":mrs_claus_tone4:"]::before, em[data-emoji="mrs_claus_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936-1f3fe.svg"); } em[data-emoji=":mrs_claus_tone5:"]::before, em[data-emoji="mrs_claus_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f936-1f3ff.svg"); } em[data-emoji=":santa:"]::before, em[data-emoji="santa"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385.svg"); } em[data-emoji=":santa_tone1:"]::before, em[data-emoji="santa_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385-1f3fb.svg"); } em[data-emoji=":santa_tone2:"]::before, em[data-emoji="santa_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385-1f3fc.svg"); } em[data-emoji=":santa_tone3:"]::before, em[data-emoji="santa_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385-1f3fd.svg"); } em[data-emoji=":santa_tone4:"]::before, em[data-emoji="santa_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385-1f3fe.svg"); } em[data-emoji=":santa_tone5:"]::before, em[data-emoji="santa_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f385-1f3ff.svg"); } em[data-emoji=":mage:"]::before, em[data-emoji="mage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9.svg"); } em[data-emoji=":mage_tone1:"]::before, em[data-emoji="mage_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fb.svg"); } em[data-emoji=":mage_tone2:"]::before, em[data-emoji="mage_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fc.svg"); } em[data-emoji=":mage_tone3:"]::before, em[data-emoji="mage_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fd.svg"); } em[data-emoji=":mage_tone4:"]::before, em[data-emoji="mage_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fe.svg"); } em[data-emoji=":mage_tone5:"]::before, em[data-emoji="mage_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3ff.svg"); } em[data-emoji=":woman_mage:"]::before, em[data-emoji="woman_mage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-200d-2640-fe0f.svg"); } em[data-emoji=":woman_mage_tone1:"]::before, em[data-emoji="woman_mage_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_mage_tone2:"]::before, em[data-emoji="woman_mage_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_mage_tone3:"]::before, em[data-emoji="woman_mage_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_mage_tone4:"]::before, em[data-emoji="woman_mage_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_mage_tone5:"]::before, em[data-emoji="woman_mage_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_mage:"]::before, em[data-emoji="man_mage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-200d-2642-fe0f.svg"); } em[data-emoji=":man_mage_tone1:"]::before, em[data-emoji="man_mage_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_mage_tone2:"]::before, em[data-emoji="man_mage_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_mage_tone3:"]::before, em[data-emoji="man_mage_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_mage_tone4:"]::before, em[data-emoji="man_mage_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_mage_tone5:"]::before, em[data-emoji="man_mage_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d9-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":elf:"]::before, em[data-emoji="elf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd.svg"); } em[data-emoji=":elf_tone1:"]::before, em[data-emoji="elf_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fb.svg"); } em[data-emoji=":elf_tone2:"]::before, em[data-emoji="elf_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fc.svg"); } em[data-emoji=":elf_tone3:"]::before, em[data-emoji="elf_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fd.svg"); } em[data-emoji=":elf_tone4:"]::before, em[data-emoji="elf_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fe.svg"); } em[data-emoji=":elf_tone5:"]::before, em[data-emoji="elf_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3ff.svg"); } em[data-emoji=":woman_elf:"]::before, em[data-emoji="woman_elf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_elf_tone1:"]::before, em[data-emoji="woman_elf_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_elf_tone2:"]::before, em[data-emoji="woman_elf_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_elf_tone3:"]::before, em[data-emoji="woman_elf_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_elf_tone4:"]::before, em[data-emoji="woman_elf_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_elf_tone5:"]::before, em[data-emoji="woman_elf_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_elf:"]::before, em[data-emoji="man_elf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-200d-2642-fe0f.svg"); } em[data-emoji=":man_elf_tone1:"]::before, em[data-emoji="man_elf_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_elf_tone2:"]::before, em[data-emoji="man_elf_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_elf_tone3:"]::before, em[data-emoji="man_elf_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_elf_tone4:"]::before, em[data-emoji="man_elf_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_elf_tone5:"]::before, em[data-emoji="man_elf_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dd-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":troll:"]::before, em[data-emoji="troll"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cc.svg"); } em[data-emoji=":vampire:"]::before, em[data-emoji="vampire"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db.svg"); } em[data-emoji=":vampire_tone1:"]::before, em[data-emoji="vampire_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fb.svg"); } em[data-emoji=":vampire_tone2:"]::before, em[data-emoji="vampire_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fc.svg"); } em[data-emoji=":vampire_tone3:"]::before, em[data-emoji="vampire_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fd.svg"); } em[data-emoji=":vampire_tone4:"]::before, em[data-emoji="vampire_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fe.svg"); } em[data-emoji=":vampire_tone5:"]::before, em[data-emoji="vampire_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3ff.svg"); } em[data-emoji=":woman_vampire:"]::before, em[data-emoji="woman_vampire"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-200d-2640-fe0f.svg"); } em[data-emoji=":woman_vampire_tone1:"]::before, em[data-emoji="woman_vampire_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_vampire_tone2:"]::before, em[data-emoji="woman_vampire_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_vampire_tone3:"]::before, em[data-emoji="woman_vampire_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_vampire_tone4:"]::before, em[data-emoji="woman_vampire_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_vampire_tone5:"]::before, em[data-emoji="woman_vampire_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_vampire:"]::before, em[data-emoji="man_vampire"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-200d-2642-fe0f.svg"); } em[data-emoji=":man_vampire_tone1:"]::before, em[data-emoji="man_vampire_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_vampire_tone2:"]::before, em[data-emoji="man_vampire_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_vampire_tone3:"]::before, em[data-emoji="man_vampire_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_vampire_tone4:"]::before, em[data-emoji="man_vampire_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_vampire_tone5:"]::before, em[data-emoji="man_vampire_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9db-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":zombie:"]::before, em[data-emoji="zombie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9df.svg"); } em[data-emoji=":woman_zombie:"]::before, em[data-emoji="woman_zombie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9df-200d-2640-fe0f.svg"); } em[data-emoji=":man_zombie:"]::before, em[data-emoji="man_zombie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9df-200d-2642-fe0f.svg"); } em[data-emoji=":genie:"]::before, em[data-emoji="genie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9de.svg"); } em[data-emoji=":woman_genie:"]::before, em[data-emoji="woman_genie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9de-200d-2640-fe0f.svg"); } em[data-emoji=":man_genie:"]::before, em[data-emoji="man_genie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9de-200d-2642-fe0f.svg"); } em[data-emoji=":merperson:"]::before, em[data-emoji="merperson"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc.svg"); } em[data-emoji=":merperson_tone1:"]::before, em[data-emoji="merperson_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fb.svg"); } em[data-emoji=":merperson_tone2:"]::before, em[data-emoji="merperson_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fc.svg"); } em[data-emoji=":merperson_tone3:"]::before, em[data-emoji="merperson_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fd.svg"); } em[data-emoji=":merperson_tone4:"]::before, em[data-emoji="merperson_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fe.svg"); } em[data-emoji=":merperson_tone5:"]::before, em[data-emoji="merperson_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3ff.svg"); } em[data-emoji=":mermaid:"]::before, em[data-emoji="mermaid"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-200d-2640-fe0f.svg"); } em[data-emoji=":mermaid_tone1:"]::before, em[data-emoji="mermaid_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":mermaid_tone2:"]::before, em[data-emoji="mermaid_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":mermaid_tone3:"]::before, em[data-emoji="mermaid_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":mermaid_tone4:"]::before, em[data-emoji="mermaid_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":mermaid_tone5:"]::before, em[data-emoji="mermaid_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":merman:"]::before, em[data-emoji="merman"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-200d-2642-fe0f.svg"); } em[data-emoji=":merman_tone1:"]::before, em[data-emoji="merman_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":merman_tone2:"]::before, em[data-emoji="merman_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":merman_tone3:"]::before, em[data-emoji="merman_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":merman_tone4:"]::before, em[data-emoji="merman_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":merman_tone5:"]::before, em[data-emoji="merman_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9dc-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":fairy:"]::before, em[data-emoji="fairy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da.svg"); } em[data-emoji=":fairy_tone1:"]::before, em[data-emoji="fairy_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fb.svg"); } em[data-emoji=":fairy_tone2:"]::before, em[data-emoji="fairy_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fc.svg"); } em[data-emoji=":fairy_tone3:"]::before, em[data-emoji="fairy_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fd.svg"); } em[data-emoji=":fairy_tone4:"]::before, em[data-emoji="fairy_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fe.svg"); } em[data-emoji=":fairy_tone5:"]::before, em[data-emoji="fairy_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3ff.svg"); } em[data-emoji=":woman_fairy:"]::before, em[data-emoji="woman_fairy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-200d-2640-fe0f.svg"); } em[data-emoji=":woman_fairy_tone1:"]::before, em[data-emoji="woman_fairy_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_fairy_tone2:"]::before, em[data-emoji="woman_fairy_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_fairy_tone3:"]::before, em[data-emoji="woman_fairy_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_fairy_tone4:"]::before, em[data-emoji="woman_fairy_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_fairy_tone5:"]::before, em[data-emoji="woman_fairy_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_fairy:"]::before, em[data-emoji="man_fairy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-200d-2642-fe0f.svg"); } em[data-emoji=":man_fairy_tone1:"]::before, em[data-emoji="man_fairy_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_fairy_tone2:"]::before, em[data-emoji="man_fairy_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_fairy_tone3:"]::before, em[data-emoji="man_fairy_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_fairy_tone4:"]::before, em[data-emoji="man_fairy_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_fairy_tone5:"]::before, em[data-emoji="man_fairy_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9da-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":angel:"]::before, em[data-emoji="angel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c.svg"); } em[data-emoji=":angel_tone1:"]::before, em[data-emoji="angel_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c-1f3fb.svg"); } em[data-emoji=":angel_tone2:"]::before, em[data-emoji="angel_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c-1f3fc.svg"); } em[data-emoji=":angel_tone3:"]::before, em[data-emoji="angel_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c-1f3fd.svg"); } em[data-emoji=":angel_tone4:"]::before, em[data-emoji="angel_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c-1f3fe.svg"); } em[data-emoji=":angel_tone5:"]::before, em[data-emoji="angel_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f47c-1f3ff.svg"); } em[data-emoji=":pregnant_person:"]::before, em[data-emoji="pregnant_person"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4.svg"); } em[data-emoji=":pregnant_person_tone1:"]::before, em[data-emoji="pregnant_person_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4-1f3fb.svg"); } em[data-emoji=":pregnant_person_tone2:"]::before, em[data-emoji="pregnant_person_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4-1f3fc.svg"); } em[data-emoji=":pregnant_person_tone3:"]::before, em[data-emoji="pregnant_person_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4-1f3fd.svg"); } em[data-emoji=":pregnant_person_tone4:"]::before, em[data-emoji="pregnant_person_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4-1f3fe.svg"); } em[data-emoji=":pregnant_person_tone5:"]::before, em[data-emoji="pregnant_person_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac4-1f3ff.svg"); } em[data-emoji=":pregnant_woman:"]::before, em[data-emoji="pregnant_woman"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930.svg"); } em[data-emoji=":pregnant_woman_tone1:"]::before, em[data-emoji="pregnant_woman_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930-1f3fb.svg"); } em[data-emoji=":pregnant_woman_tone2:"]::before, em[data-emoji="pregnant_woman_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930-1f3fc.svg"); } em[data-emoji=":pregnant_woman_tone3:"]::before, em[data-emoji="pregnant_woman_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930-1f3fd.svg"); } em[data-emoji=":pregnant_woman_tone4:"]::before, em[data-emoji="pregnant_woman_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930-1f3fe.svg"); } em[data-emoji=":pregnant_woman_tone5:"]::before, em[data-emoji="pregnant_woman_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f930-1f3ff.svg"); } em[data-emoji=":pregnant_man:"]::before, em[data-emoji="pregnant_man"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3.svg"); } em[data-emoji=":pregnant_man_tone1:"]::before, em[data-emoji="pregnant_man_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3-1f3fb.svg"); } em[data-emoji=":pregnant_man_tone2:"]::before, em[data-emoji="pregnant_man_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3-1f3fc.svg"); } em[data-emoji=":pregnant_man_tone3:"]::before, em[data-emoji="pregnant_man_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3-1f3fd.svg"); } em[data-emoji=":pregnant_man_tone4:"]::before, em[data-emoji="pregnant_man_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3-1f3fe.svg"); } em[data-emoji=":pregnant_man_tone5:"]::before, em[data-emoji="pregnant_man_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fac3-1f3ff.svg"); } em[data-emoji=":breast_feeding:"]::before, em[data-emoji="breast_feeding"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931.svg"); } em[data-emoji=":breast_feeding_tone1:"]::before, em[data-emoji="breast_feeding_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931-1f3fb.svg"); } em[data-emoji=":breast_feeding_tone2:"]::before, em[data-emoji="breast_feeding_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931-1f3fc.svg"); } em[data-emoji=":breast_feeding_tone3:"]::before, em[data-emoji="breast_feeding_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931-1f3fd.svg"); } em[data-emoji=":breast_feeding_tone4:"]::before, em[data-emoji="breast_feeding_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931-1f3fe.svg"); } em[data-emoji=":breast_feeding_tone5:"]::before, em[data-emoji="breast_feeding_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f931-1f3ff.svg"); } em[data-emoji=":person_feeding_baby:"]::before, em[data-emoji="person_feeding_baby"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f37c.svg"); } em[data-emoji=":person_feeding_baby_tone1:"]::before, em[data-emoji="person_feeding_baby_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f37c.svg"); } em[data-emoji=":person_feeding_baby_tone2:"]::before, em[data-emoji="person_feeding_baby_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f37c.svg"); } em[data-emoji=":person_feeding_baby_tone3:"]::before, em[data-emoji="person_feeding_baby_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f37c.svg"); } em[data-emoji=":person_feeding_baby_tone4:"]::before, em[data-emoji="person_feeding_baby_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f37c.svg"); } em[data-emoji=":person_feeding_baby_tone5:"]::before, em[data-emoji="person_feeding_baby_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f37c.svg"); } em[data-emoji=":woman_feeding_baby:"]::before, em[data-emoji="woman_feeding_baby"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f37c.svg"); } em[data-emoji=":woman_feeding_baby_tone1:"]::before, em[data-emoji="woman_feeding_baby_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f37c.svg"); } em[data-emoji=":woman_feeding_baby_tone2:"]::before, em[data-emoji="woman_feeding_baby_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f37c.svg"); } em[data-emoji=":woman_feeding_baby_tone3:"]::before, em[data-emoji="woman_feeding_baby_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f37c.svg"); } em[data-emoji=":woman_feeding_baby_tone4:"]::before, em[data-emoji="woman_feeding_baby_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f37c.svg"); } em[data-emoji=":woman_feeding_baby_tone5:"]::before, em[data-emoji="woman_feeding_baby_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f37c.svg"); } em[data-emoji=":man_feeding_baby:"]::before, em[data-emoji="man_feeding_baby"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f37c.svg"); } em[data-emoji=":man_feeding_baby_tone1:"]::before, em[data-emoji="man_feeding_baby_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f37c.svg"); } em[data-emoji=":man_feeding_baby_tone2:"]::before, em[data-emoji="man_feeding_baby_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f37c.svg"); } em[data-emoji=":man_feeding_baby_tone3:"]::before, em[data-emoji="man_feeding_baby_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f37c.svg"); } em[data-emoji=":man_feeding_baby_tone4:"]::before, em[data-emoji="man_feeding_baby_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f37c.svg"); } em[data-emoji=":man_feeding_baby_tone5:"]::before, em[data-emoji="man_feeding_baby_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f37c.svg"); } em[data-emoji=":person_bowing:"]::before, em[data-emoji="person_bowing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647.svg"); } em[data-emoji=":person_bowing_tone1:"]::before, em[data-emoji="person_bowing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fb.svg"); } em[data-emoji=":person_bowing_tone2:"]::before, em[data-emoji="person_bowing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fc.svg"); } em[data-emoji=":person_bowing_tone3:"]::before, em[data-emoji="person_bowing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fd.svg"); } em[data-emoji=":person_bowing_tone4:"]::before, em[data-emoji="person_bowing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fe.svg"); } em[data-emoji=":person_bowing_tone5:"]::before, em[data-emoji="person_bowing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3ff.svg"); } em[data-emoji=":woman_bowing:"]::before, em[data-emoji="woman_bowing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-200d-2640-fe0f.svg"); } em[data-emoji=":woman_bowing_tone1:"]::before, em[data-emoji="woman_bowing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_bowing_tone2:"]::before, em[data-emoji="woman_bowing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_bowing_tone3:"]::before, em[data-emoji="woman_bowing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_bowing_tone4:"]::before, em[data-emoji="woman_bowing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_bowing_tone5:"]::before, em[data-emoji="woman_bowing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_bowing:"]::before, em[data-emoji="man_bowing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-200d-2642-fe0f.svg"); } em[data-emoji=":man_bowing_tone1:"]::before, em[data-emoji="man_bowing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_bowing_tone2:"]::before, em[data-emoji="man_bowing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_bowing_tone3:"]::before, em[data-emoji="man_bowing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_bowing_tone4:"]::before, em[data-emoji="man_bowing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_bowing_tone5:"]::before, em[data-emoji="man_bowing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f647-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_tipping_hand:"]::before, em[data-emoji="person_tipping_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481.svg"); } em[data-emoji=":person_tipping_hand_tone1:"]::before, em[data-emoji="person_tipping_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fb.svg"); } em[data-emoji=":person_tipping_hand_tone2:"]::before, em[data-emoji="person_tipping_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fc.svg"); } em[data-emoji=":person_tipping_hand_tone3:"]::before, em[data-emoji="person_tipping_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fd.svg"); } em[data-emoji=":person_tipping_hand_tone4:"]::before, em[data-emoji="person_tipping_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fe.svg"); } em[data-emoji=":person_tipping_hand_tone5:"]::before, em[data-emoji="person_tipping_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3ff.svg"); } em[data-emoji=":woman_tipping_hand:"]::before, em[data-emoji="woman_tipping_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-200d-2640-fe0f.svg"); } em[data-emoji=":woman_tipping_hand_tone1:"]::before, em[data-emoji="woman_tipping_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_tipping_hand_tone2:"]::before, em[data-emoji="woman_tipping_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_tipping_hand_tone3:"]::before, em[data-emoji="woman_tipping_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_tipping_hand_tone4:"]::before, em[data-emoji="woman_tipping_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_tipping_hand_tone5:"]::before, em[data-emoji="woman_tipping_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_tipping_hand:"]::before, em[data-emoji="man_tipping_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-200d-2642-fe0f.svg"); } em[data-emoji=":man_tipping_hand_tone1:"]::before, em[data-emoji="man_tipping_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_tipping_hand_tone2:"]::before, em[data-emoji="man_tipping_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_tipping_hand_tone3:"]::before, em[data-emoji="man_tipping_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_tipping_hand_tone4:"]::before, em[data-emoji="man_tipping_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_tipping_hand_tone5:"]::before, em[data-emoji="man_tipping_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f481-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_gesturing_no:"]::before, em[data-emoji="person_gesturing_no"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645.svg"); } em[data-emoji=":person_gesturing_no_tone1:"]::before, em[data-emoji="person_gesturing_no_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fb.svg"); } em[data-emoji=":person_gesturing_no_tone2:"]::before, em[data-emoji="person_gesturing_no_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fc.svg"); } em[data-emoji=":person_gesturing_no_tone3:"]::before, em[data-emoji="person_gesturing_no_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fd.svg"); } em[data-emoji=":person_gesturing_no_tone4:"]::before, em[data-emoji="person_gesturing_no_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fe.svg"); } em[data-emoji=":person_gesturing_no_tone5:"]::before, em[data-emoji="person_gesturing_no_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3ff.svg"); } em[data-emoji=":woman_gesturing_no:"]::before, em[data-emoji="woman_gesturing_no"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-200d-2640-fe0f.svg"); } em[data-emoji=":woman_gesturing_no_tone1:"]::before, em[data-emoji="woman_gesturing_no_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_gesturing_no_tone2:"]::before, em[data-emoji="woman_gesturing_no_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_gesturing_no_tone3:"]::before, em[data-emoji="woman_gesturing_no_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_gesturing_no_tone4:"]::before, em[data-emoji="woman_gesturing_no_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_gesturing_no_tone5:"]::before, em[data-emoji="woman_gesturing_no_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_gesturing_no:"]::before, em[data-emoji="man_gesturing_no"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-200d-2642-fe0f.svg"); } em[data-emoji=":man_gesturing_no_tone1:"]::before, em[data-emoji="man_gesturing_no_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_gesturing_no_tone2:"]::before, em[data-emoji="man_gesturing_no_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_gesturing_no_tone3:"]::before, em[data-emoji="man_gesturing_no_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_gesturing_no_tone4:"]::before, em[data-emoji="man_gesturing_no_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_gesturing_no_tone5:"]::before, em[data-emoji="man_gesturing_no_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f645-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_gesturing_ok:"]::before, em[data-emoji="person_gesturing_ok"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646.svg"); } em[data-emoji=":person_gesturing_ok_tone1:"]::before, em[data-emoji="person_gesturing_ok_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fb.svg"); } em[data-emoji=":person_gesturing_ok_tone2:"]::before, em[data-emoji="person_gesturing_ok_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fc.svg"); } em[data-emoji=":person_gesturing_ok_tone3:"]::before, em[data-emoji="person_gesturing_ok_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fd.svg"); } em[data-emoji=":person_gesturing_ok_tone4:"]::before, em[data-emoji="person_gesturing_ok_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fe.svg"); } em[data-emoji=":person_gesturing_ok_tone5:"]::before, em[data-emoji="person_gesturing_ok_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3ff.svg"); } em[data-emoji=":woman_gesturing_ok:"]::before, em[data-emoji="woman_gesturing_ok"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-200d-2640-fe0f.svg"); } em[data-emoji=":woman_gesturing_ok_tone1:"]::before, em[data-emoji="woman_gesturing_ok_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_gesturing_ok_tone2:"]::before, em[data-emoji="woman_gesturing_ok_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_gesturing_ok_tone3:"]::before, em[data-emoji="woman_gesturing_ok_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_gesturing_ok_tone4:"]::before, em[data-emoji="woman_gesturing_ok_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_gesturing_ok_tone5:"]::before, em[data-emoji="woman_gesturing_ok_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_gesturing_ok:"]::before, em[data-emoji="man_gesturing_ok"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-200d-2642-fe0f.svg"); } em[data-emoji=":man_gesturing_ok_tone1:"]::before, em[data-emoji="man_gesturing_ok_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_gesturing_ok_tone2:"]::before, em[data-emoji="man_gesturing_ok_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_gesturing_ok_tone3:"]::before, em[data-emoji="man_gesturing_ok_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_gesturing_ok_tone4:"]::before, em[data-emoji="man_gesturing_ok_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_gesturing_ok_tone5:"]::before, em[data-emoji="man_gesturing_ok_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f646-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_raising_hand:"]::before, em[data-emoji="person_raising_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b.svg"); } em[data-emoji=":person_raising_hand_tone1:"]::before, em[data-emoji="person_raising_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fb.svg"); } em[data-emoji=":person_raising_hand_tone2:"]::before, em[data-emoji="person_raising_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fc.svg"); } em[data-emoji=":person_raising_hand_tone3:"]::before, em[data-emoji="person_raising_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fd.svg"); } em[data-emoji=":person_raising_hand_tone4:"]::before, em[data-emoji="person_raising_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fe.svg"); } em[data-emoji=":person_raising_hand_tone5:"]::before, em[data-emoji="person_raising_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3ff.svg"); } em[data-emoji=":woman_raising_hand:"]::before, em[data-emoji="woman_raising_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-200d-2640-fe0f.svg"); } em[data-emoji=":woman_raising_hand_tone1:"]::before, em[data-emoji="woman_raising_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_raising_hand_tone2:"]::before, em[data-emoji="woman_raising_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_raising_hand_tone3:"]::before, em[data-emoji="woman_raising_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_raising_hand_tone4:"]::before, em[data-emoji="woman_raising_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_raising_hand_tone5:"]::before, em[data-emoji="woman_raising_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_raising_hand:"]::before, em[data-emoji="man_raising_hand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-200d-2642-fe0f.svg"); } em[data-emoji=":man_raising_hand_tone1:"]::before, em[data-emoji="man_raising_hand_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_raising_hand_tone2:"]::before, em[data-emoji="man_raising_hand_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_raising_hand_tone3:"]::before, em[data-emoji="man_raising_hand_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_raising_hand_tone4:"]::before, em[data-emoji="man_raising_hand_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_raising_hand_tone5:"]::before, em[data-emoji="man_raising_hand_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64b-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":deaf_person:"]::before, em[data-emoji="deaf_person"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf.svg"); } em[data-emoji=":deaf_person_tone1:"]::before, em[data-emoji="deaf_person_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fb.svg"); } em[data-emoji=":deaf_person_tone2:"]::before, em[data-emoji="deaf_person_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fc.svg"); } em[data-emoji=":deaf_person_tone3:"]::before, em[data-emoji="deaf_person_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fd.svg"); } em[data-emoji=":deaf_person_tone4:"]::before, em[data-emoji="deaf_person_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fe.svg"); } em[data-emoji=":deaf_person_tone5:"]::before, em[data-emoji="deaf_person_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3ff.svg"); } em[data-emoji=":deaf_woman:"]::before, em[data-emoji="deaf_woman"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-200d-2640-fe0f.svg"); } em[data-emoji=":deaf_woman_tone1:"]::before, em[data-emoji="deaf_woman_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":deaf_woman_tone2:"]::before, em[data-emoji="deaf_woman_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":deaf_woman_tone3:"]::before, em[data-emoji="deaf_woman_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":deaf_woman_tone4:"]::before, em[data-emoji="deaf_woman_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":deaf_woman_tone5:"]::before, em[data-emoji="deaf_woman_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":deaf_man:"]::before, em[data-emoji="deaf_man"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-200d-2642-fe0f.svg"); } em[data-emoji=":deaf_man_tone1:"]::before, em[data-emoji="deaf_man_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":deaf_man_tone2:"]::before, em[data-emoji="deaf_man_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":deaf_man_tone3:"]::before, em[data-emoji="deaf_man_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":deaf_man_tone4:"]::before, em[data-emoji="deaf_man_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":deaf_man_tone5:"]::before, em[data-emoji="deaf_man_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cf-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_facepalming:"]::before, em[data-emoji="person_facepalming"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926.svg"); } em[data-emoji=":person_facepalming_tone1:"]::before, em[data-emoji="person_facepalming_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fb.svg"); } em[data-emoji=":person_facepalming_tone2:"]::before, em[data-emoji="person_facepalming_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fc.svg"); } em[data-emoji=":person_facepalming_tone3:"]::before, em[data-emoji="person_facepalming_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fd.svg"); } em[data-emoji=":person_facepalming_tone4:"]::before, em[data-emoji="person_facepalming_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fe.svg"); } em[data-emoji=":person_facepalming_tone5:"]::before, em[data-emoji="person_facepalming_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3ff.svg"); } em[data-emoji=":woman_facepalming:"]::before, em[data-emoji="woman_facepalming"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-200d-2640-fe0f.svg"); } em[data-emoji=":woman_facepalming_tone1:"]::before, em[data-emoji="woman_facepalming_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_facepalming_tone2:"]::before, em[data-emoji="woman_facepalming_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_facepalming_tone3:"]::before, em[data-emoji="woman_facepalming_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_facepalming_tone4:"]::before, em[data-emoji="woman_facepalming_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_facepalming_tone5:"]::before, em[data-emoji="woman_facepalming_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_facepalming:"]::before, em[data-emoji="man_facepalming"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-200d-2642-fe0f.svg"); } em[data-emoji=":man_facepalming_tone1:"]::before, em[data-emoji="man_facepalming_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_facepalming_tone2:"]::before, em[data-emoji="man_facepalming_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_facepalming_tone3:"]::before, em[data-emoji="man_facepalming_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_facepalming_tone4:"]::before, em[data-emoji="man_facepalming_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_facepalming_tone5:"]::before, em[data-emoji="man_facepalming_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f926-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_shrugging:"]::before, em[data-emoji="person_shrugging"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937.svg"); } em[data-emoji=":person_shrugging_tone1:"]::before, em[data-emoji="person_shrugging_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fb.svg"); } em[data-emoji=":person_shrugging_tone2:"]::before, em[data-emoji="person_shrugging_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fc.svg"); } em[data-emoji=":person_shrugging_tone3:"]::before, em[data-emoji="person_shrugging_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fd.svg"); } em[data-emoji=":person_shrugging_tone4:"]::before, em[data-emoji="person_shrugging_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fe.svg"); } em[data-emoji=":person_shrugging_tone5:"]::before, em[data-emoji="person_shrugging_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3ff.svg"); } em[data-emoji=":woman_shrugging:"]::before, em[data-emoji="woman_shrugging"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-200d-2640-fe0f.svg"); } em[data-emoji=":woman_shrugging_tone1:"]::before, em[data-emoji="woman_shrugging_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_shrugging_tone2:"]::before, em[data-emoji="woman_shrugging_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_shrugging_tone3:"]::before, em[data-emoji="woman_shrugging_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_shrugging_tone4:"]::before, em[data-emoji="woman_shrugging_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_shrugging_tone5:"]::before, em[data-emoji="woman_shrugging_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_shrugging:"]::before, em[data-emoji="man_shrugging"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-200d-2642-fe0f.svg"); } em[data-emoji=":man_shrugging_tone1:"]::before, em[data-emoji="man_shrugging_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_shrugging_tone2:"]::before, em[data-emoji="man_shrugging_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_shrugging_tone3:"]::before, em[data-emoji="man_shrugging_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_shrugging_tone4:"]::before, em[data-emoji="man_shrugging_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_shrugging_tone5:"]::before, em[data-emoji="man_shrugging_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f937-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_pouting:"]::before, em[data-emoji="person_pouting"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e.svg"); } em[data-emoji=":person_pouting_tone1:"]::before, em[data-emoji="person_pouting_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fb.svg"); } em[data-emoji=":person_pouting_tone2:"]::before, em[data-emoji="person_pouting_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fc.svg"); } em[data-emoji=":person_pouting_tone3:"]::before, em[data-emoji="person_pouting_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fd.svg"); } em[data-emoji=":person_pouting_tone4:"]::before, em[data-emoji="person_pouting_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fe.svg"); } em[data-emoji=":person_pouting_tone5:"]::before, em[data-emoji="person_pouting_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3ff.svg"); } em[data-emoji=":woman_pouting:"]::before, em[data-emoji="woman_pouting"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-200d-2640-fe0f.svg"); } em[data-emoji=":woman_pouting_tone1:"]::before, em[data-emoji="woman_pouting_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_pouting_tone2:"]::before, em[data-emoji="woman_pouting_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_pouting_tone3:"]::before, em[data-emoji="woman_pouting_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_pouting_tone4:"]::before, em[data-emoji="woman_pouting_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_pouting_tone5:"]::before, em[data-emoji="woman_pouting_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_pouting:"]::before, em[data-emoji="man_pouting"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-200d-2642-fe0f.svg"); } em[data-emoji=":man_pouting_tone1:"]::before, em[data-emoji="man_pouting_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_pouting_tone2:"]::before, em[data-emoji="man_pouting_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_pouting_tone3:"]::before, em[data-emoji="man_pouting_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_pouting_tone4:"]::before, em[data-emoji="man_pouting_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_pouting_tone5:"]::before, em[data-emoji="man_pouting_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64e-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_frowning:"]::before, em[data-emoji="person_frowning"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d.svg"); } em[data-emoji=":person_frowning_tone1:"]::before, em[data-emoji="person_frowning_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fb.svg"); } em[data-emoji=":person_frowning_tone2:"]::before, em[data-emoji="person_frowning_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fc.svg"); } em[data-emoji=":person_frowning_tone3:"]::before, em[data-emoji="person_frowning_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fd.svg"); } em[data-emoji=":person_frowning_tone4:"]::before, em[data-emoji="person_frowning_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fe.svg"); } em[data-emoji=":person_frowning_tone5:"]::before, em[data-emoji="person_frowning_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3ff.svg"); } em[data-emoji=":woman_frowning:"]::before, em[data-emoji="woman_frowning"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-200d-2640-fe0f.svg"); } em[data-emoji=":woman_frowning_tone1:"]::before, em[data-emoji="woman_frowning_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_frowning_tone2:"]::before, em[data-emoji="woman_frowning_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_frowning_tone3:"]::before, em[data-emoji="woman_frowning_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_frowning_tone4:"]::before, em[data-emoji="woman_frowning_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_frowning_tone5:"]::before, em[data-emoji="woman_frowning_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_frowning:"]::before, em[data-emoji="man_frowning"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-200d-2642-fe0f.svg"); } em[data-emoji=":man_frowning_tone1:"]::before, em[data-emoji="man_frowning_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_frowning_tone2:"]::before, em[data-emoji="man_frowning_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_frowning_tone3:"]::before, em[data-emoji="man_frowning_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_frowning_tone4:"]::before, em[data-emoji="man_frowning_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_frowning_tone5:"]::before, em[data-emoji="man_frowning_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64d-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_getting_haircut:"]::before, em[data-emoji="person_getting_haircut"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487.svg"); } em[data-emoji=":person_getting_haircut_tone1:"]::before, em[data-emoji="person_getting_haircut_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fb.svg"); } em[data-emoji=":person_getting_haircut_tone2:"]::before, em[data-emoji="person_getting_haircut_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fc.svg"); } em[data-emoji=":person_getting_haircut_tone3:"]::before, em[data-emoji="person_getting_haircut_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fd.svg"); } em[data-emoji=":person_getting_haircut_tone4:"]::before, em[data-emoji="person_getting_haircut_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fe.svg"); } em[data-emoji=":person_getting_haircut_tone5:"]::before, em[data-emoji="person_getting_haircut_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3ff.svg"); } em[data-emoji=":woman_getting_haircut:"]::before, em[data-emoji="woman_getting_haircut"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-200d-2640-fe0f.svg"); } em[data-emoji=":woman_getting_haircut_tone1:"]::before, em[data-emoji="woman_getting_haircut_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_getting_haircut_tone2:"]::before, em[data-emoji="woman_getting_haircut_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_getting_haircut_tone3:"]::before, em[data-emoji="woman_getting_haircut_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_getting_haircut_tone4:"]::before, em[data-emoji="woman_getting_haircut_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_getting_haircut_tone5:"]::before, em[data-emoji="woman_getting_haircut_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_getting_haircut:"]::before, em[data-emoji="man_getting_haircut"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-200d-2642-fe0f.svg"); } em[data-emoji=":man_getting_haircut_tone1:"]::before, em[data-emoji="man_getting_haircut_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_getting_haircut_tone2:"]::before, em[data-emoji="man_getting_haircut_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_getting_haircut_tone3:"]::before, em[data-emoji="man_getting_haircut_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_getting_haircut_tone4:"]::before, em[data-emoji="man_getting_haircut_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_getting_haircut_tone5:"]::before, em[data-emoji="man_getting_haircut_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f487-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_getting_massage:"]::before, em[data-emoji="person_getting_massage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486.svg"); } em[data-emoji=":person_getting_massage_tone1:"]::before, em[data-emoji="person_getting_massage_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fb.svg"); } em[data-emoji=":person_getting_massage_tone2:"]::before, em[data-emoji="person_getting_massage_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fc.svg"); } em[data-emoji=":person_getting_massage_tone3:"]::before, em[data-emoji="person_getting_massage_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fd.svg"); } em[data-emoji=":person_getting_massage_tone4:"]::before, em[data-emoji="person_getting_massage_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fe.svg"); } em[data-emoji=":person_getting_massage_tone5:"]::before, em[data-emoji="person_getting_massage_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3ff.svg"); } em[data-emoji=":woman_getting_face_massage:"]::before, em[data-emoji="woman_getting_face_massage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-200d-2640-fe0f.svg"); } em[data-emoji=":woman_getting_face_massage_tone1:"]::before, em[data-emoji="woman_getting_face_massage_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_getting_face_massage_tone2:"]::before, em[data-emoji="woman_getting_face_massage_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_getting_face_massage_tone3:"]::before, em[data-emoji="woman_getting_face_massage_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_getting_face_massage_tone4:"]::before, em[data-emoji="woman_getting_face_massage_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_getting_face_massage_tone5:"]::before, em[data-emoji="woman_getting_face_massage_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_getting_face_massage:"]::before, em[data-emoji="man_getting_face_massage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-200d-2642-fe0f.svg"); } em[data-emoji=":man_getting_face_massage_tone1:"]::before, em[data-emoji="man_getting_face_massage_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_getting_face_massage_tone2:"]::before, em[data-emoji="man_getting_face_massage_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_getting_face_massage_tone3:"]::before, em[data-emoji="man_getting_face_massage_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_getting_face_massage_tone4:"]::before, em[data-emoji="man_getting_face_massage_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_getting_face_massage_tone5:"]::before, em[data-emoji="man_getting_face_massage_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f486-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_in_steamy_room:"]::before, em[data-emoji="person_in_steamy_room"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6.svg"); } em[data-emoji=":person_in_steamy_room_tone1:"]::before, em[data-emoji="person_in_steamy_room_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fb.svg"); } em[data-emoji=":person_in_steamy_room_tone2:"]::before, em[data-emoji="person_in_steamy_room_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fc.svg"); } em[data-emoji=":person_in_steamy_room_tone3:"]::before, em[data-emoji="person_in_steamy_room_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fd.svg"); } em[data-emoji=":person_in_steamy_room_tone4:"]::before, em[data-emoji="person_in_steamy_room_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fe.svg"); } em[data-emoji=":person_in_steamy_room_tone5:"]::before, em[data-emoji="person_in_steamy_room_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3ff.svg"); } em[data-emoji=":woman_in_steamy_room:"]::before, em[data-emoji="woman_in_steamy_room"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_steamy_room_tone1:"]::before, em[data-emoji="woman_in_steamy_room_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_steamy_room_tone2:"]::before, em[data-emoji="woman_in_steamy_room_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_steamy_room_tone3:"]::before, em[data-emoji="woman_in_steamy_room_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_steamy_room_tone4:"]::before, em[data-emoji="woman_in_steamy_room_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_steamy_room_tone5:"]::before, em[data-emoji="woman_in_steamy_room_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_in_steamy_room:"]::before, em[data-emoji="man_in_steamy_room"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_steamy_room_tone1:"]::before, em[data-emoji="man_in_steamy_room_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_steamy_room_tone2:"]::before, em[data-emoji="man_in_steamy_room_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_steamy_room_tone3:"]::before, em[data-emoji="man_in_steamy_room_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_steamy_room_tone4:"]::before, em[data-emoji="man_in_steamy_room_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_steamy_room_tone5:"]::before, em[data-emoji="man_in_steamy_room_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d6-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":nail_care:"]::before, em[data-emoji="nail_care"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485.svg"); } em[data-emoji=":nail_care_tone1:"]::before, em[data-emoji="nail_care_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485-1f3fb.svg"); } em[data-emoji=":nail_care_tone2:"]::before, em[data-emoji="nail_care_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485-1f3fc.svg"); } em[data-emoji=":nail_care_tone3:"]::before, em[data-emoji="nail_care_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485-1f3fd.svg"); } em[data-emoji=":nail_care_tone4:"]::before, em[data-emoji="nail_care_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485-1f3fe.svg"); } em[data-emoji=":nail_care_tone5:"]::before, em[data-emoji="nail_care_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f485-1f3ff.svg"); } em[data-emoji=":selfie:"]::before, em[data-emoji="selfie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933.svg"); } em[data-emoji=":selfie_tone1:"]::before, em[data-emoji="selfie_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933-1f3fb.svg"); } em[data-emoji=":selfie_tone2:"]::before, em[data-emoji="selfie_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933-1f3fc.svg"); } em[data-emoji=":selfie_tone3:"]::before, em[data-emoji="selfie_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933-1f3fd.svg"); } em[data-emoji=":selfie_tone4:"]::before, em[data-emoji="selfie_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933-1f3fe.svg"); } em[data-emoji=":selfie_tone5:"]::before, em[data-emoji="selfie_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f933-1f3ff.svg"); } em[data-emoji=":dancer:"]::before, em[data-emoji="dancer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483.svg"); } em[data-emoji=":dancer_tone1:"]::before, em[data-emoji="dancer_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483-1f3fb.svg"); } em[data-emoji=":dancer_tone2:"]::before, em[data-emoji="dancer_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483-1f3fc.svg"); } em[data-emoji=":dancer_tone3:"]::before, em[data-emoji="dancer_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483-1f3fd.svg"); } em[data-emoji=":dancer_tone4:"]::before, em[data-emoji="dancer_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483-1f3fe.svg"); } em[data-emoji=":dancer_tone5:"]::before, em[data-emoji="dancer_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f483-1f3ff.svg"); } em[data-emoji=":man_dancing:"]::before, em[data-emoji="man_dancing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a.svg"); } em[data-emoji=":man_dancing_tone1:"]::before, em[data-emoji="man_dancing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a-1f3fb.svg"); } em[data-emoji=":man_dancing_tone2:"]::before, em[data-emoji="man_dancing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a-1f3fc.svg"); } em[data-emoji=":man_dancing_tone3:"]::before, em[data-emoji="man_dancing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a-1f3fd.svg"); } em[data-emoji=":man_dancing_tone5:"]::before, em[data-emoji="man_dancing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a-1f3ff.svg"); } em[data-emoji=":man_dancing_tone4:"]::before, em[data-emoji="man_dancing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f57a-1f3fe.svg"); } em[data-emoji=":people_with_bunny_ears_partying:"]::before, em[data-emoji="people_with_bunny_ears_partying"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46f.svg"); } em[data-emoji=":women_with_bunny_ears_partying:"]::before, em[data-emoji="women_with_bunny_ears_partying"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46f-200d-2640-fe0f.svg"); } em[data-emoji=":men_with_bunny_ears_partying:"]::before, em[data-emoji="men_with_bunny_ears_partying"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46f-200d-2642-fe0f.svg"); } em[data-emoji=":levitate:"]::before, em[data-emoji="levitate"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574.svg"); } em[data-emoji=":levitate_tone1:"]::before, em[data-emoji="levitate_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574-1f3fb.svg"); } em[data-emoji=":levitate_tone2:"]::before, em[data-emoji="levitate_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574-1f3fc.svg"); } em[data-emoji=":levitate_tone3:"]::before, em[data-emoji="levitate_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574-1f3fd.svg"); } em[data-emoji=":levitate_tone4:"]::before, em[data-emoji="levitate_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574-1f3fe.svg"); } em[data-emoji=":levitate_tone5:"]::before, em[data-emoji="levitate_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f574-1f3ff.svg"); } em[data-emoji=":person_in_manual_wheelchair:"]::before, em[data-emoji="person_in_manual_wheelchair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9bd.svg"); } em[data-emoji=":person_in_manual_wheelchair_tone1:"]::before, em[data-emoji="person_in_manual_wheelchair_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9bd.svg"); } em[data-emoji=":person_in_manual_wheelchair_tone2:"]::before, em[data-emoji="person_in_manual_wheelchair_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9bd.svg"); } em[data-emoji=":person_in_manual_wheelchair_tone3:"]::before, em[data-emoji="person_in_manual_wheelchair_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9bd.svg"); } em[data-emoji=":person_in_manual_wheelchair_tone4:"]::before, em[data-emoji="person_in_manual_wheelchair_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9bd.svg"); } em[data-emoji=":person_in_manual_wheelchair_tone5:"]::before, em[data-emoji="person_in_manual_wheelchair_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9bd.svg"); } em[data-emoji=":woman_in_manual_wheelchair:"]::before, em[data-emoji="woman_in_manual_wheelchair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9bd.svg"); } em[data-emoji=":woman_in_manual_wheelchair_tone1:"]::before, em[data-emoji="woman_in_manual_wheelchair_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9bd.svg"); } em[data-emoji=":woman_in_manual_wheelchair_tone2:"]::before, em[data-emoji="woman_in_manual_wheelchair_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9bd.svg"); } em[data-emoji=":woman_in_manual_wheelchair_tone3:"]::before, em[data-emoji="woman_in_manual_wheelchair_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9bd.svg"); } em[data-emoji=":woman_in_manual_wheelchair_tone4:"]::before, em[data-emoji="woman_in_manual_wheelchair_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9bd.svg"); } em[data-emoji=":woman_in_manual_wheelchair_tone5:"]::before, em[data-emoji="woman_in_manual_wheelchair_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9bd.svg"); } em[data-emoji=":man_in_manual_wheelchair:"]::before, em[data-emoji="man_in_manual_wheelchair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9bd.svg"); } em[data-emoji=":man_in_manual_wheelchair_tone1:"]::before, em[data-emoji="man_in_manual_wheelchair_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9bd.svg"); } em[data-emoji=":man_in_manual_wheelchair_tone2:"]::before, em[data-emoji="man_in_manual_wheelchair_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9bd.svg"); } em[data-emoji=":man_in_manual_wheelchair_tone3:"]::before, em[data-emoji="man_in_manual_wheelchair_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9bd.svg"); } em[data-emoji=":man_in_manual_wheelchair_tone4:"]::before, em[data-emoji="man_in_manual_wheelchair_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9bd.svg"); } em[data-emoji=":man_in_manual_wheelchair_tone5:"]::before, em[data-emoji="man_in_manual_wheelchair_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9bd.svg"); } em[data-emoji=":person_in_manual_wheelchair_facing_right:"]::before, em[data-emoji="person_in_manual_wheelchair_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_manual_wheelchair_facing_right_tone1:"]::before, em[data-emoji="person_in_manual_wheelchair_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_manual_wheelchair_facing_right_tone2:"]::before, em[data-emoji="person_in_manual_wheelchair_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_manual_wheelchair_facing_right_tone3:"]::before, em[data-emoji="person_in_manual_wheelchair_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_manual_wheelchair_facing_right_tone4:"]::before, em[data-emoji="person_in_manual_wheelchair_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_manual_wheelchair_facing_right_tone5:"]::before, em[data-emoji="person_in_manual_wheelchair_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_manual_wheelchair_facing_right:"]::before, em[data-emoji="man_in_manual_wheelchair_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_manual_wheelchair_facing_right_tone2:"]::before, em[data-emoji="man_in_manual_wheelchair_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_manual_wheelchair_facing_right_tone1:"]::before, em[data-emoji="man_in_manual_wheelchair_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_manual_wheelchair_facing_right_tone3:"]::before, em[data-emoji="man_in_manual_wheelchair_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_manual_wheelchair_facing_right_tone4:"]::before, em[data-emoji="man_in_manual_wheelchair_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_manual_wheelchair_facing_right_tone5:"]::before, em[data-emoji="man_in_manual_wheelchair_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_manual_wheelchair_facing_right:"]::before, em[data-emoji="woman_in_manual_wheelchair_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_manual_wheelchair_facing_right_tone1:"]::before, em[data-emoji="woman_in_manual_wheelchair_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_manual_wheelchair_facing_right_tone2:"]::before, em[data-emoji="woman_in_manual_wheelchair_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_manual_wheelchair_facing_right_tone3:"]::before, em[data-emoji="woman_in_manual_wheelchair_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_manual_wheelchair_facing_right_tone4:"]::before, em[data-emoji="woman_in_manual_wheelchair_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_manual_wheelchair_facing_right_tone5:"]::before, em[data-emoji="woman_in_manual_wheelchair_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9bd-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_motorized_wheelchair:"]::before, em[data-emoji="person_in_motorized_wheelchair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9bc.svg"); } em[data-emoji=":person_in_motorized_wheelchair_tone1:"]::before, em[data-emoji="person_in_motorized_wheelchair_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9bc.svg"); } em[data-emoji=":person_in_motorized_wheelchair_tone2:"]::before, em[data-emoji="person_in_motorized_wheelchair_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9bc.svg"); } em[data-emoji=":person_in_motorized_wheelchair_tone3:"]::before, em[data-emoji="person_in_motorized_wheelchair_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9bc.svg"); } em[data-emoji=":person_in_motorized_wheelchair_tone4:"]::before, em[data-emoji="person_in_motorized_wheelchair_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9bc.svg"); } em[data-emoji=":person_in_motorized_wheelchair_tone5:"]::before, em[data-emoji="person_in_motorized_wheelchair_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9bc.svg"); } em[data-emoji=":woman_in_motorized_wheelchair:"]::before, em[data-emoji="woman_in_motorized_wheelchair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9bc.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_tone1:"]::before, em[data-emoji="woman_in_motorized_wheelchair_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9bc.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_tone2:"]::before, em[data-emoji="woman_in_motorized_wheelchair_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9bc.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_tone3:"]::before, em[data-emoji="woman_in_motorized_wheelchair_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9bc.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_tone4:"]::before, em[data-emoji="woman_in_motorized_wheelchair_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9bc.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_tone5:"]::before, em[data-emoji="woman_in_motorized_wheelchair_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9bc.svg"); } em[data-emoji=":man_in_motorized_wheelchair:"]::before, em[data-emoji="man_in_motorized_wheelchair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9bc.svg"); } em[data-emoji=":man_in_motorized_wheelchair_tone1:"]::before, em[data-emoji="man_in_motorized_wheelchair_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9bc.svg"); } em[data-emoji=":man_in_motorized_wheelchair_tone2:"]::before, em[data-emoji="man_in_motorized_wheelchair_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9bc.svg"); } em[data-emoji=":man_in_motorized_wheelchair_tone3:"]::before, em[data-emoji="man_in_motorized_wheelchair_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9bc.svg"); } em[data-emoji=":man_in_motorized_wheelchair_tone4:"]::before, em[data-emoji="man_in_motorized_wheelchair_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9bc.svg"); } em[data-emoji=":man_in_motorized_wheelchair_tone5:"]::before, em[data-emoji="man_in_motorized_wheelchair_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9bc.svg"); } em[data-emoji=":person_in_motorized_wheelchair_facing_right:"]::before, em[data-emoji="person_in_motorized_wheelchair_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_motorized_wheelchair_facing_right_tone1:"]::before, em[data-emoji="person_in_motorized_wheelchair_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_motorized_wheelchair_facing_right_tone2:"]::before, em[data-emoji="person_in_motorized_wheelchair_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_motorized_wheelchair_facing_right_tone3:"]::before, em[data-emoji="person_in_motorized_wheelchair_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_motorized_wheelchair_facing_right_tone4:"]::before, em[data-emoji="person_in_motorized_wheelchair_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":person_in_motorized_wheelchair_facing_right_tone5:"]::before, em[data-emoji="person_in_motorized_wheelchair_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_motorized_wheelchair_facing_right:"]::before, em[data-emoji="man_in_motorized_wheelchair_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_motorized_wheelchair_facing_right_tone1:"]::before, em[data-emoji="man_in_motorized_wheelchair_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_motorized_wheelchair_facing_right_tone2:"]::before, em[data-emoji="man_in_motorized_wheelchair_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_motorized_wheelchair_facing_right_tone3:"]::before, em[data-emoji="man_in_motorized_wheelchair_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_motorized_wheelchair_facing_right_tone4:"]::before, em[data-emoji="man_in_motorized_wheelchair_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":man_in_motorized_wheelchair_facing_right_tone5:"]::before, em[data-emoji="man_in_motorized_wheelchair_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_facing_right:"]::before, em[data-emoji="woman_in_motorized_wheelchair_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_facing_right_tone1:"]::before, em[data-emoji="woman_in_motorized_wheelchair_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_facing_right_tone2:"]::before, em[data-emoji="woman_in_motorized_wheelchair_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_facing_right_tone3:"]::before, em[data-emoji="woman_in_motorized_wheelchair_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_facing_right_tone4:"]::before, em[data-emoji="woman_in_motorized_wheelchair_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_in_motorized_wheelchair_facing_right_tone5:"]::before, em[data-emoji="woman_in_motorized_wheelchair_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9bc-200d-27a1-fe0f.svg"); } em[data-emoji=":person_walking:"]::before, em[data-emoji="person_walking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6.svg"); } em[data-emoji=":person_walking_tone1:"]::before, em[data-emoji="person_walking_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb.svg"); } em[data-emoji=":person_walking_tone2:"]::before, em[data-emoji="person_walking_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc.svg"); } em[data-emoji=":person_walking_tone3:"]::before, em[data-emoji="person_walking_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd.svg"); } em[data-emoji=":person_walking_tone4:"]::before, em[data-emoji="person_walking_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe.svg"); } em[data-emoji=":person_walking_tone5:"]::before, em[data-emoji="person_walking_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff.svg"); } em[data-emoji=":woman_walking:"]::before, em[data-emoji="woman_walking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-200d-2640-fe0f.svg"); } em[data-emoji=":woman_walking_tone1:"]::before, em[data-emoji="woman_walking_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_walking_tone2:"]::before, em[data-emoji="woman_walking_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_walking_tone3:"]::before, em[data-emoji="woman_walking_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_walking_tone4:"]::before, em[data-emoji="woman_walking_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_walking_tone5:"]::before, em[data-emoji="woman_walking_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_walking:"]::before, em[data-emoji="man_walking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-200d-2642-fe0f.svg"); } em[data-emoji=":man_walking_tone1:"]::before, em[data-emoji="man_walking_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_walking_tone2:"]::before, em[data-emoji="man_walking_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_walking_tone3:"]::before, em[data-emoji="man_walking_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_walking_tone4:"]::before, em[data-emoji="man_walking_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_walking_tone5:"]::before, em[data-emoji="man_walking_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_walking_facing_right:"]::before, em[data-emoji="person_walking_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-200d-27a1-fe0f.svg"); } em[data-emoji=":person_walking_facing_right_tone1:"]::before, em[data-emoji="person_walking_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb-200d-27a1-fe0f.svg"); } em[data-emoji=":person_walking_facing_right_tone2:"]::before, em[data-emoji="person_walking_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc-200d-27a1-fe0f.svg"); } em[data-emoji=":person_walking_facing_right_tone3:"]::before, em[data-emoji="person_walking_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd-200d-27a1-fe0f.svg"); } em[data-emoji=":person_walking_facing_right_tone4:"]::before, em[data-emoji="person_walking_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe-200d-27a1-fe0f.svg"); } em[data-emoji=":person_walking_facing_right_tone5:"]::before, em[data-emoji="person_walking_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_walking_facing_right:"]::before, em[data-emoji="woman_walking_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_walking_facing_right_tone1:"]::before, em[data-emoji="woman_walking_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_walking_facing_right_tone2:"]::before, em[data-emoji="woman_walking_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_walking_facing_right_tone3:"]::before, em[data-emoji="woman_walking_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_walking_facing_right_tone4:"]::before, em[data-emoji="woman_walking_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_walking_facing_right_tone5:"]::before, em[data-emoji="woman_walking_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_walking_facing_right:"]::before, em[data-emoji="man_walking_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_walking_facing_right_tone1:"]::before, em[data-emoji="man_walking_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fb-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_walking_facing_right_tone2:"]::before, em[data-emoji="man_walking_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fc-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_walking_facing_right_tone3:"]::before, em[data-emoji="man_walking_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fd-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_walking_facing_right_tone4:"]::before, em[data-emoji="man_walking_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3fe-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_walking_facing_right_tone5:"]::before, em[data-emoji="man_walking_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b6-1f3ff-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":person_with_probing_cane:"]::before, em[data-emoji="person_with_probing_cane"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9af.svg"); } em[data-emoji=":person_with_probing_cane_tone1:"]::before, em[data-emoji="person_with_probing_cane_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9af.svg"); } em[data-emoji=":person_with_probing_cane_tone2:"]::before, em[data-emoji="person_with_probing_cane_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9af.svg"); } em[data-emoji=":person_with_probing_cane_tone3:"]::before, em[data-emoji="person_with_probing_cane_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9af.svg"); } em[data-emoji=":person_with_probing_cane_tone4:"]::before, em[data-emoji="person_with_probing_cane_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9af.svg"); } em[data-emoji=":person_with_probing_cane_tone5:"]::before, em[data-emoji="person_with_probing_cane_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9af.svg"); } em[data-emoji=":woman_with_probing_cane:"]::before, em[data-emoji="woman_with_probing_cane"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9af.svg"); } em[data-emoji=":woman_with_probing_cane_tone1:"]::before, em[data-emoji="woman_with_probing_cane_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9af.svg"); } em[data-emoji=":woman_with_probing_cane_tone2:"]::before, em[data-emoji="woman_with_probing_cane_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9af.svg"); } em[data-emoji=":woman_with_probing_cane_tone3:"]::before, em[data-emoji="woman_with_probing_cane_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9af.svg"); } em[data-emoji=":woman_with_probing_cane_tone4:"]::before, em[data-emoji="woman_with_probing_cane_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9af.svg"); } em[data-emoji=":woman_with_probing_cane_tone5:"]::before, em[data-emoji="woman_with_probing_cane_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9af.svg"); } em[data-emoji=":man_with_probing_cane:"]::before, em[data-emoji="man_with_probing_cane"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9af.svg"); } em[data-emoji=":man_with_probing_cane_tone1:"]::before, em[data-emoji="man_with_probing_cane_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9af.svg"); } em[data-emoji=":man_with_probing_cane_tone2:"]::before, em[data-emoji="man_with_probing_cane_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9af.svg"); } em[data-emoji=":man_with_probing_cane_tone3:"]::before, em[data-emoji="man_with_probing_cane_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9af.svg"); } em[data-emoji=":man_with_probing_cane_tone4:"]::before, em[data-emoji="man_with_probing_cane_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9af.svg"); } em[data-emoji=":man_with_probing_cane_tone5:"]::before, em[data-emoji="man_with_probing_cane_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9af.svg"); } em[data-emoji=":person_with_white_cane_facing_right:"]::before, em[data-emoji="person_with_white_cane_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":person_with_white_cane_facing_right_tone1:"]::before, em[data-emoji="person_with_white_cane_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":person_with_white_cane_facing_right_tone2:"]::before, em[data-emoji="person_with_white_cane_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":person_with_white_cane_facing_right_tone3:"]::before, em[data-emoji="person_with_white_cane_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":person_with_white_cane_facing_right_tone4:"]::before, em[data-emoji="person_with_white_cane_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":person_with_white_cane_facing_right_tone5:"]::before, em[data-emoji="person_with_white_cane_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":man_with_white_cane_facing_right:"]::before, em[data-emoji="man_with_white_cane_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":man_with_white_cane_facing_right_tone1:"]::before, em[data-emoji="man_with_white_cane_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":man_with_white_cane_facing_right_tone2:"]::before, em[data-emoji="man_with_white_cane_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":man_with_white_cane_facing_right_tone3:"]::before, em[data-emoji="man_with_white_cane_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":man_with_white_cane_facing_right_tone4:"]::before, em[data-emoji="man_with_white_cane_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":man_with_white_cane_facing_right_tone5:"]::before, em[data-emoji="man_with_white_cane_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_with_white_cane_facing_right:"]::before, em[data-emoji="woman_with_white_cane_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_with_white_cane_facing_right_tone1:"]::before, em[data-emoji="woman_with_white_cane_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_with_white_cane_facing_right_tone2:"]::before, em[data-emoji="woman_with_white_cane_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_with_white_cane_facing_right_tone3:"]::before, em[data-emoji="woman_with_white_cane_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_with_white_cane_facing_right_tone4:"]::before, em[data-emoji="woman_with_white_cane_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_with_white_cane_facing_right_tone5:"]::before, em[data-emoji="woman_with_white_cane_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f9af-200d-27a1-fe0f.svg"); } em[data-emoji=":person_kneeling:"]::before, em[data-emoji="person_kneeling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce.svg"); } em[data-emoji=":person_kneeling_tone1:"]::before, em[data-emoji="person_kneeling_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb.svg"); } em[data-emoji=":person_kneeling_tone2:"]::before, em[data-emoji="person_kneeling_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc.svg"); } em[data-emoji=":person_kneeling_tone3:"]::before, em[data-emoji="person_kneeling_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd.svg"); } em[data-emoji=":person_kneeling_tone4:"]::before, em[data-emoji="person_kneeling_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe.svg"); } em[data-emoji=":person_kneeling_tone5:"]::before, em[data-emoji="person_kneeling_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff.svg"); } em[data-emoji=":woman_kneeling:"]::before, em[data-emoji="woman_kneeling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-200d-2640-fe0f.svg"); } em[data-emoji=":woman_kneeling_tone1:"]::before, em[data-emoji="woman_kneeling_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_kneeling_tone2:"]::before, em[data-emoji="woman_kneeling_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_kneeling_tone3:"]::before, em[data-emoji="woman_kneeling_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_kneeling_tone4:"]::before, em[data-emoji="woman_kneeling_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_kneeling_tone5:"]::before, em[data-emoji="woman_kneeling_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_kneeling:"]::before, em[data-emoji="man_kneeling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-200d-2642-fe0f.svg"); } em[data-emoji=":man_kneeling_tone1:"]::before, em[data-emoji="man_kneeling_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_kneeling_tone2:"]::before, em[data-emoji="man_kneeling_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_kneeling_tone3:"]::before, em[data-emoji="man_kneeling_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_kneeling_tone4:"]::before, em[data-emoji="man_kneeling_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_kneeling_tone5:"]::before, em[data-emoji="man_kneeling_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_kneeling_facing_right:"]::before, em[data-emoji="person_kneeling_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-200d-27a1-fe0f.svg"); } em[data-emoji=":person_kneeling_facing_right_tone1:"]::before, em[data-emoji="person_kneeling_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb-200d-27a1-fe0f.svg"); } em[data-emoji=":person_kneeling_facing_right_tone2:"]::before, em[data-emoji="person_kneeling_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc-200d-27a1-fe0f.svg"); } em[data-emoji=":person_kneeling_facing_right_tone3:"]::before, em[data-emoji="person_kneeling_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd-200d-27a1-fe0f.svg"); } em[data-emoji=":person_kneeling_facing_right_tone4:"]::before, em[data-emoji="person_kneeling_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe-200d-27a1-fe0f.svg"); } em[data-emoji=":person_kneeling_facing_right_tone5:"]::before, em[data-emoji="person_kneeling_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_kneeling_facing_right:"]::before, em[data-emoji="woman_kneeling_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_kneeling_facing_right_tone1:"]::before, em[data-emoji="woman_kneeling_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_kneeling_facing_right_tone2:"]::before, em[data-emoji="woman_kneeling_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_kneeling_facing_right_tone3:"]::before, em[data-emoji="woman_kneeling_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_kneeling_facing_right_tone4:"]::before, em[data-emoji="woman_kneeling_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_kneeling_facing_right_tone5:"]::before, em[data-emoji="woman_kneeling_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_kneeling_facing_right:"]::before, em[data-emoji="man_kneeling_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_kneeling_facing_right_tone1:"]::before, em[data-emoji="man_kneeling_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fb-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_kneeling_facing_right_tone2:"]::before, em[data-emoji="man_kneeling_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fc-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_kneeling_facing_right_tone3:"]::before, em[data-emoji="man_kneeling_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fd-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_kneeling_facing_right_tone4:"]::before, em[data-emoji="man_kneeling_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3fe-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_kneeling_facing_right_tone5:"]::before, em[data-emoji="man_kneeling_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ce-1f3ff-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":person_running:"]::before, em[data-emoji="person_running"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3.svg"); } em[data-emoji=":person_running_tone1:"]::before, em[data-emoji="person_running_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb.svg"); } em[data-emoji=":person_running_tone2:"]::before, em[data-emoji="person_running_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc.svg"); } em[data-emoji=":person_running_tone3:"]::before, em[data-emoji="person_running_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd.svg"); } em[data-emoji=":person_running_tone4:"]::before, em[data-emoji="person_running_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe.svg"); } em[data-emoji=":person_running_tone5:"]::before, em[data-emoji="person_running_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff.svg"); } em[data-emoji=":woman_running:"]::before, em[data-emoji="woman_running"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-200d-2640-fe0f.svg"); } em[data-emoji=":woman_running_tone1:"]::before, em[data-emoji="woman_running_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_running_tone2:"]::before, em[data-emoji="woman_running_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_running_tone3:"]::before, em[data-emoji="woman_running_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_running_tone4:"]::before, em[data-emoji="woman_running_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_running_tone5:"]::before, em[data-emoji="woman_running_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_running:"]::before, em[data-emoji="man_running"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-200d-2642-fe0f.svg"); } em[data-emoji=":man_running_tone1:"]::before, em[data-emoji="man_running_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_running_tone2:"]::before, em[data-emoji="man_running_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_running_tone3:"]::before, em[data-emoji="man_running_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_running_tone4:"]::before, em[data-emoji="man_running_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_running_tone5:"]::before, em[data-emoji="man_running_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_running_facing_right:"]::before, em[data-emoji="person_running_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-200d-27a1-fe0f.svg"); } em[data-emoji=":person_running_facing_right_tone1:"]::before, em[data-emoji="person_running_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb-200d-27a1-fe0f.svg"); } em[data-emoji=":person_running_facing_right_tone2:"]::before, em[data-emoji="person_running_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc-200d-27a1-fe0f.svg"); } em[data-emoji=":person_running_facing_right_tone3:"]::before, em[data-emoji="person_running_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd-200d-27a1-fe0f.svg"); } em[data-emoji=":person_running_facing_right_tone4:"]::before, em[data-emoji="person_running_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe-200d-27a1-fe0f.svg"); } em[data-emoji=":person_running_facing_right_tone5:"]::before, em[data-emoji="person_running_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_running_facing_right:"]::before, em[data-emoji="woman_running_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_running_facing_right_tone1:"]::before, em[data-emoji="woman_running_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_running_facing_right_tone2:"]::before, em[data-emoji="woman_running_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_running_facing_right_tone3:"]::before, em[data-emoji="woman_running_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_running_facing_right_tone4:"]::before, em[data-emoji="woman_running_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":woman_running_facing_right_tone5:"]::before, em[data-emoji="woman_running_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff-200d-2640-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_running_facing_right:"]::before, em[data-emoji="man_running_facing_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_running_facing_right_tone1:"]::before, em[data-emoji="man_running_facing_right_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fb-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_running_facing_right_tone2:"]::before, em[data-emoji="man_running_facing_right_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fc-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_running_facing_right_tone3:"]::before, em[data-emoji="man_running_facing_right_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fd-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_running_facing_right_tone4:"]::before, em[data-emoji="man_running_facing_right_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3fe-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":man_running_facing_right_tone5:"]::before, em[data-emoji="man_running_facing_right_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c3-1f3ff-200d-2642-fe0f-200d-27a1-fe0f.svg"); } em[data-emoji=":person_standing:"]::before, em[data-emoji="person_standing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd.svg"); } em[data-emoji=":person_standing_tone1:"]::before, em[data-emoji="person_standing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fb.svg"); } em[data-emoji=":person_standing_tone2:"]::before, em[data-emoji="person_standing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fc.svg"); } em[data-emoji=":person_standing_tone3:"]::before, em[data-emoji="person_standing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fd.svg"); } em[data-emoji=":person_standing_tone4:"]::before, em[data-emoji="person_standing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fe.svg"); } em[data-emoji=":person_standing_tone5:"]::before, em[data-emoji="person_standing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3ff.svg"); } em[data-emoji=":woman_standing:"]::before, em[data-emoji="woman_standing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_standing_tone1:"]::before, em[data-emoji="woman_standing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_standing_tone2:"]::before, em[data-emoji="woman_standing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_standing_tone3:"]::before, em[data-emoji="woman_standing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_standing_tone4:"]::before, em[data-emoji="woman_standing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_standing_tone5:"]::before, em[data-emoji="woman_standing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_standing:"]::before, em[data-emoji="man_standing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-200d-2642-fe0f.svg"); } em[data-emoji=":man_standing_tone1:"]::before, em[data-emoji="man_standing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_standing_tone2:"]::before, em[data-emoji="man_standing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_standing_tone3:"]::before, em[data-emoji="man_standing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_standing_tone4:"]::before, em[data-emoji="man_standing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_standing_tone5:"]::before, em[data-emoji="man_standing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cd-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":people_holding_hands:"]::before, em[data-emoji="people_holding_hands"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f91d-200d-1f9d1.svg"); } em[data-emoji=":people_holding_hands_tone1:"]::before, em[data-emoji="people_holding_hands_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":people_holding_hands_tone1_tone2:"]::before, em[data-emoji="people_holding_hands_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":people_holding_hands_tone1_tone3:"]::before, em[data-emoji="people_holding_hands_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":people_holding_hands_tone1_tone4:"]::before, em[data-emoji="people_holding_hands_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":people_holding_hands_tone1_tone5:"]::before, em[data-emoji="people_holding_hands_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":people_holding_hands_tone2_tone1:"]::before, em[data-emoji="people_holding_hands_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":people_holding_hands_tone2:"]::before, em[data-emoji="people_holding_hands_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":people_holding_hands_tone2_tone3:"]::before, em[data-emoji="people_holding_hands_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":people_holding_hands_tone2_tone4:"]::before, em[data-emoji="people_holding_hands_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":people_holding_hands_tone2_tone5:"]::before, em[data-emoji="people_holding_hands_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":people_holding_hands_tone3_tone1:"]::before, em[data-emoji="people_holding_hands_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":people_holding_hands_tone3_tone2:"]::before, em[data-emoji="people_holding_hands_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":people_holding_hands_tone3:"]::before, em[data-emoji="people_holding_hands_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":people_holding_hands_tone3_tone4:"]::before, em[data-emoji="people_holding_hands_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":people_holding_hands_tone3_tone5:"]::before, em[data-emoji="people_holding_hands_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":people_holding_hands_tone4_tone1:"]::before, em[data-emoji="people_holding_hands_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":people_holding_hands_tone4_tone2:"]::before, em[data-emoji="people_holding_hands_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":people_holding_hands_tone4_tone3:"]::before, em[data-emoji="people_holding_hands_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":people_holding_hands_tone4:"]::before, em[data-emoji="people_holding_hands_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":people_holding_hands_tone4_tone5:"]::before, em[data-emoji="people_holding_hands_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":people_holding_hands_tone5_tone1:"]::before, em[data-emoji="people_holding_hands_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":people_holding_hands_tone5_tone2:"]::before, em[data-emoji="people_holding_hands_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":people_holding_hands_tone5_tone3:"]::before, em[data-emoji="people_holding_hands_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":people_holding_hands_tone5_tone4:"]::before, em[data-emoji="people_holding_hands_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":people_holding_hands_tone5:"]::before, em[data-emoji="people_holding_hands_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":couple:"]::before, em[data-emoji="couple"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone1:"]::before, em[data-emoji="woman_and_man_holding_hands_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b-1f3fb.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone1_tone2:"]::before, em[data-emoji="woman_and_man_holding_hands_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone1_tone3:"]::before, em[data-emoji="woman_and_man_holding_hands_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone1_tone4:"]::before, em[data-emoji="woman_and_man_holding_hands_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone1_tone5:"]::before, em[data-emoji="woman_and_man_holding_hands_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone2_tone1:"]::before, em[data-emoji="woman_and_man_holding_hands_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone2:"]::before, em[data-emoji="woman_and_man_holding_hands_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b-1f3fc.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone2_tone3:"]::before, em[data-emoji="woman_and_man_holding_hands_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone2_tone4:"]::before, em[data-emoji="woman_and_man_holding_hands_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone2_tone5:"]::before, em[data-emoji="woman_and_man_holding_hands_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone3_tone1:"]::before, em[data-emoji="woman_and_man_holding_hands_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone3_tone2:"]::before, em[data-emoji="woman_and_man_holding_hands_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone3:"]::before, em[data-emoji="woman_and_man_holding_hands_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b-1f3fd.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone3_tone4:"]::before, em[data-emoji="woman_and_man_holding_hands_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone3_tone5:"]::before, em[data-emoji="woman_and_man_holding_hands_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone4_tone1:"]::before, em[data-emoji="woman_and_man_holding_hands_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone4_tone2:"]::before, em[data-emoji="woman_and_man_holding_hands_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone4_tone3:"]::before, em[data-emoji="woman_and_man_holding_hands_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone4:"]::before, em[data-emoji="woman_and_man_holding_hands_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b-1f3fe.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone4_tone5:"]::before, em[data-emoji="woman_and_man_holding_hands_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone5_tone1:"]::before, em[data-emoji="woman_and_man_holding_hands_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone5_tone2:"]::before, em[data-emoji="woman_and_man_holding_hands_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone5_tone3:"]::before, em[data-emoji="woman_and_man_holding_hands_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone5_tone4:"]::before, em[data-emoji="woman_and_man_holding_hands_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe.svg"); } em[data-emoji=":woman_and_man_holding_hands_tone5:"]::before, em[data-emoji="woman_and_man_holding_hands_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46b-1f3ff.svg"); } em[data-emoji=":two_women_holding_hands:"]::before, em[data-emoji="two_women_holding_hands"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d.svg"); } em[data-emoji=":women_holding_hands_tone1:"]::before, em[data-emoji="women_holding_hands_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d-1f3fb.svg"); } em[data-emoji=":women_holding_hands_tone1_tone2:"]::before, em[data-emoji="women_holding_hands_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc.svg"); } em[data-emoji=":women_holding_hands_tone1_tone3:"]::before, em[data-emoji="women_holding_hands_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd.svg"); } em[data-emoji=":women_holding_hands_tone1_tone4:"]::before, em[data-emoji="women_holding_hands_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe.svg"); } em[data-emoji=":women_holding_hands_tone1_tone5:"]::before, em[data-emoji="women_holding_hands_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff.svg"); } em[data-emoji=":women_holding_hands_tone2_tone1:"]::before, em[data-emoji="women_holding_hands_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb.svg"); } em[data-emoji=":women_holding_hands_tone2:"]::before, em[data-emoji="women_holding_hands_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d-1f3fc.svg"); } em[data-emoji=":women_holding_hands_tone2_tone3:"]::before, em[data-emoji="women_holding_hands_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd.svg"); } em[data-emoji=":women_holding_hands_tone2_tone4:"]::before, em[data-emoji="women_holding_hands_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe.svg"); } em[data-emoji=":women_holding_hands_tone2_tone5:"]::before, em[data-emoji="women_holding_hands_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff.svg"); } em[data-emoji=":women_holding_hands_tone3_tone1:"]::before, em[data-emoji="women_holding_hands_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb.svg"); } em[data-emoji=":women_holding_hands_tone3_tone2:"]::before, em[data-emoji="women_holding_hands_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc.svg"); } em[data-emoji=":women_holding_hands_tone3:"]::before, em[data-emoji="women_holding_hands_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d-1f3fd.svg"); } em[data-emoji=":women_holding_hands_tone3_tone4:"]::before, em[data-emoji="women_holding_hands_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe.svg"); } em[data-emoji=":women_holding_hands_tone3_tone5:"]::before, em[data-emoji="women_holding_hands_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff.svg"); } em[data-emoji=":women_holding_hands_tone4_tone1:"]::before, em[data-emoji="women_holding_hands_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb.svg"); } em[data-emoji=":women_holding_hands_tone4_tone2:"]::before, em[data-emoji="women_holding_hands_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc.svg"); } em[data-emoji=":women_holding_hands_tone4_tone3:"]::before, em[data-emoji="women_holding_hands_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd.svg"); } em[data-emoji=":women_holding_hands_tone4:"]::before, em[data-emoji="women_holding_hands_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d-1f3fe.svg"); } em[data-emoji=":women_holding_hands_tone4_tone5:"]::before, em[data-emoji="women_holding_hands_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff.svg"); } em[data-emoji=":women_holding_hands_tone5_tone1:"]::before, em[data-emoji="women_holding_hands_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb.svg"); } em[data-emoji=":women_holding_hands_tone5_tone2:"]::before, em[data-emoji="women_holding_hands_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc.svg"); } em[data-emoji=":women_holding_hands_tone5_tone3:"]::before, em[data-emoji="women_holding_hands_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd.svg"); } em[data-emoji=":women_holding_hands_tone5_tone4:"]::before, em[data-emoji="women_holding_hands_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe.svg"); } em[data-emoji=":women_holding_hands_tone5:"]::before, em[data-emoji="women_holding_hands_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46d-1f3ff.svg"); } em[data-emoji=":two_men_holding_hands:"]::before, em[data-emoji="two_men_holding_hands"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c.svg"); } em[data-emoji=":men_holding_hands_tone1:"]::before, em[data-emoji="men_holding_hands_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c-1f3fb.svg"); } em[data-emoji=":men_holding_hands_tone1_tone2:"]::before, em[data-emoji="men_holding_hands_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc.svg"); } em[data-emoji=":men_holding_hands_tone1_tone3:"]::before, em[data-emoji="men_holding_hands_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd.svg"); } em[data-emoji=":men_holding_hands_tone1_tone4:"]::before, em[data-emoji="men_holding_hands_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe.svg"); } em[data-emoji=":men_holding_hands_tone1_tone5:"]::before, em[data-emoji="men_holding_hands_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff.svg"); } em[data-emoji=":men_holding_hands_tone2_tone1:"]::before, em[data-emoji="men_holding_hands_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb.svg"); } em[data-emoji=":men_holding_hands_tone2:"]::before, em[data-emoji="men_holding_hands_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c-1f3fc.svg"); } em[data-emoji=":men_holding_hands_tone2_tone3:"]::before, em[data-emoji="men_holding_hands_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd.svg"); } em[data-emoji=":men_holding_hands_tone2_tone4:"]::before, em[data-emoji="men_holding_hands_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe.svg"); } em[data-emoji=":men_holding_hands_tone2_tone5:"]::before, em[data-emoji="men_holding_hands_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff.svg"); } em[data-emoji=":men_holding_hands_tone3_tone1:"]::before, em[data-emoji="men_holding_hands_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb.svg"); } em[data-emoji=":men_holding_hands_tone3_tone2:"]::before, em[data-emoji="men_holding_hands_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc.svg"); } em[data-emoji=":men_holding_hands_tone3:"]::before, em[data-emoji="men_holding_hands_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c-1f3fd.svg"); } em[data-emoji=":men_holding_hands_tone3_tone4:"]::before, em[data-emoji="men_holding_hands_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe.svg"); } em[data-emoji=":men_holding_hands_tone3_tone5:"]::before, em[data-emoji="men_holding_hands_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff.svg"); } em[data-emoji=":men_holding_hands_tone4_tone1:"]::before, em[data-emoji="men_holding_hands_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb.svg"); } em[data-emoji=":men_holding_hands_tone4_tone2:"]::before, em[data-emoji="men_holding_hands_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc.svg"); } em[data-emoji=":men_holding_hands_tone4_tone3:"]::before, em[data-emoji="men_holding_hands_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd.svg"); } em[data-emoji=":men_holding_hands_tone4:"]::before, em[data-emoji="men_holding_hands_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c-1f3fe.svg"); } em[data-emoji=":men_holding_hands_tone4_tone5:"]::before, em[data-emoji="men_holding_hands_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff.svg"); } em[data-emoji=":men_holding_hands_tone5_tone1:"]::before, em[data-emoji="men_holding_hands_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb.svg"); } em[data-emoji=":men_holding_hands_tone5_tone2:"]::before, em[data-emoji="men_holding_hands_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc.svg"); } em[data-emoji=":men_holding_hands_tone5_tone3:"]::before, em[data-emoji="men_holding_hands_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd.svg"); } em[data-emoji=":men_holding_hands_tone5_tone4:"]::before, em[data-emoji="men_holding_hands_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe.svg"); } em[data-emoji=":men_holding_hands_tone5:"]::before, em[data-emoji="men_holding_hands_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46c-1f3ff.svg"); } em[data-emoji=":couple_with_heart:"]::before, em[data-emoji="couple_with_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491.svg"); } em[data-emoji=":couple_with_heart_tone1:"]::before, em[data-emoji="couple_with_heart_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491-1f3fb.svg"); } em[data-emoji=":couple_with_heart_person_person_tone1_tone2:"]::before, em[data-emoji="couple_with_heart_person_person_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":couple_with_heart_person_person_tone1_tone3:"]::before, em[data-emoji="couple_with_heart_person_person_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":couple_with_heart_person_person_tone1_tone4:"]::before, em[data-emoji="couple_with_heart_person_person_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":couple_with_heart_person_person_tone1_tone5:"]::before, em[data-emoji="couple_with_heart_person_person_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":couple_with_heart_person_person_tone2_tone1:"]::before, em[data-emoji="couple_with_heart_person_person_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":couple_with_heart_tone2:"]::before, em[data-emoji="couple_with_heart_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491-1f3fc.svg"); } em[data-emoji=":couple_with_heart_person_person_tone2_tone3:"]::before, em[data-emoji="couple_with_heart_person_person_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":couple_with_heart_person_person_tone2_tone4:"]::before, em[data-emoji="couple_with_heart_person_person_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":couple_with_heart_person_person_tone2_tone5:"]::before, em[data-emoji="couple_with_heart_person_person_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":couple_with_heart_person_person_tone3_tone1:"]::before, em[data-emoji="couple_with_heart_person_person_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":couple_with_heart_person_person_tone3_tone2:"]::before, em[data-emoji="couple_with_heart_person_person_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":couple_with_heart_tone3:"]::before, em[data-emoji="couple_with_heart_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491-1f3fd.svg"); } em[data-emoji=":couple_with_heart_person_person_tone3_tone4:"]::before, em[data-emoji="couple_with_heart_person_person_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":couple_with_heart_person_person_tone3_tone5:"]::before, em[data-emoji="couple_with_heart_person_person_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":couple_with_heart_person_person_tone4_tone1:"]::before, em[data-emoji="couple_with_heart_person_person_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":couple_with_heart_person_person_tone4_tone2:"]::before, em[data-emoji="couple_with_heart_person_person_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":couple_with_heart_person_person_tone4_tone3:"]::before, em[data-emoji="couple_with_heart_person_person_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":couple_with_heart_tone4:"]::before, em[data-emoji="couple_with_heart_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491-1f3fe.svg"); } em[data-emoji=":couple_with_heart_person_person_tone4_tone5:"]::before, em[data-emoji="couple_with_heart_person_person_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":couple_with_heart_person_person_tone5_tone1:"]::before, em[data-emoji="couple_with_heart_person_person_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":couple_with_heart_person_person_tone5_tone2:"]::before, em[data-emoji="couple_with_heart_person_person_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":couple_with_heart_person_person_tone5_tone3:"]::before, em[data-emoji="couple_with_heart_person_person_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":couple_with_heart_person_person_tone5_tone4:"]::before, em[data-emoji="couple_with_heart_person_person_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":couple_with_heart_tone5:"]::before, em[data-emoji="couple_with_heart_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f491-1f3ff.svg"); } em[data-emoji=":couple_with_heart_woman_man:"]::before, em[data-emoji="couple_with_heart_woman_man"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2764-fe0f-200d-1f468.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone1:"]::before, em[data-emoji="couple_with_heart_woman_man_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone1_tone2:"]::before, em[data-emoji="couple_with_heart_woman_man_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone1_tone3:"]::before, em[data-emoji="couple_with_heart_woman_man_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone1_tone4:"]::before, em[data-emoji="couple_with_heart_woman_man_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone1_tone5:"]::before, em[data-emoji="couple_with_heart_woman_man_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone2_tone1:"]::before, em[data-emoji="couple_with_heart_woman_man_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone2:"]::before, em[data-emoji="couple_with_heart_woman_man_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone2_tone3:"]::before, em[data-emoji="couple_with_heart_woman_man_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone2_tone4:"]::before, em[data-emoji="couple_with_heart_woman_man_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone2_tone5:"]::before, em[data-emoji="couple_with_heart_woman_man_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone3_tone1:"]::before, em[data-emoji="couple_with_heart_woman_man_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone3_tone2:"]::before, em[data-emoji="couple_with_heart_woman_man_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone3:"]::before, em[data-emoji="couple_with_heart_woman_man_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone3_tone4:"]::before, em[data-emoji="couple_with_heart_woman_man_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone3_tone5:"]::before, em[data-emoji="couple_with_heart_woman_man_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone4_tone1:"]::before, em[data-emoji="couple_with_heart_woman_man_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone4_tone2:"]::before, em[data-emoji="couple_with_heart_woman_man_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone4_tone3:"]::before, em[data-emoji="couple_with_heart_woman_man_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone4:"]::before, em[data-emoji="couple_with_heart_woman_man_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone4_tone5:"]::before, em[data-emoji="couple_with_heart_woman_man_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone5_tone1:"]::before, em[data-emoji="couple_with_heart_woman_man_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone5_tone2:"]::before, em[data-emoji="couple_with_heart_woman_man_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone5_tone3:"]::before, em[data-emoji="couple_with_heart_woman_man_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone5_tone4:"]::before, em[data-emoji="couple_with_heart_woman_man_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg"); } em[data-emoji=":couple_with_heart_woman_man_tone5:"]::before, em[data-emoji="couple_with_heart_woman_man_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg"); } em[data-emoji=":couple_ww:"]::before, em[data-emoji="couple_ww"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2764-fe0f-200d-1f469.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone1:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone1_tone2:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone1_tone3:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone1_tone4:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone1_tone5:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone2_tone1:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone2:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone2_tone3:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone2_tone4:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone2_tone5:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone3_tone1:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone3_tone2:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone3:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone3_tone4:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone3_tone5:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone4_tone1:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone4_tone2:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone4_tone3:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone4:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone4_tone5:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone5_tone1:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone5_tone2:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone5_tone3:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone5_tone4:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe.svg"); } em[data-emoji=":couple_with_heart_woman_woman_tone5:"]::before, em[data-emoji="couple_with_heart_woman_woman_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff.svg"); } em[data-emoji=":couple_mm:"]::before, em[data-emoji="couple_mm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-2764-fe0f-200d-1f468.svg"); } em[data-emoji=":couple_with_heart_man_man_tone1:"]::before, em[data-emoji="couple_with_heart_man_man_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg"); } em[data-emoji=":couple_with_heart_man_man_tone1_tone2:"]::before, em[data-emoji="couple_with_heart_man_man_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg"); } em[data-emoji=":couple_with_heart_man_man_tone1_tone3:"]::before, em[data-emoji="couple_with_heart_man_man_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg"); } em[data-emoji=":couple_with_heart_man_man_tone1_tone4:"]::before, em[data-emoji="couple_with_heart_man_man_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg"); } em[data-emoji=":couple_with_heart_man_man_tone1_tone5:"]::before, em[data-emoji="couple_with_heart_man_man_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg"); } em[data-emoji=":couple_with_heart_man_man_tone2_tone1:"]::before, em[data-emoji="couple_with_heart_man_man_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg"); } em[data-emoji=":couple_with_heart_man_man_tone2:"]::before, em[data-emoji="couple_with_heart_man_man_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg"); } em[data-emoji=":couple_with_heart_man_man_tone2_tone3:"]::before, em[data-emoji="couple_with_heart_man_man_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg"); } em[data-emoji=":couple_with_heart_man_man_tone2_tone4:"]::before, em[data-emoji="couple_with_heart_man_man_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg"); } em[data-emoji=":couple_with_heart_man_man_tone2_tone5:"]::before, em[data-emoji="couple_with_heart_man_man_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg"); } em[data-emoji=":couple_with_heart_man_man_tone3_tone1:"]::before, em[data-emoji="couple_with_heart_man_man_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg"); } em[data-emoji=":couple_with_heart_man_man_tone3_tone2:"]::before, em[data-emoji="couple_with_heart_man_man_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg"); } em[data-emoji=":couple_with_heart_man_man_tone3:"]::before, em[data-emoji="couple_with_heart_man_man_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg"); } em[data-emoji=":couple_with_heart_man_man_tone3_tone4:"]::before, em[data-emoji="couple_with_heart_man_man_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg"); } em[data-emoji=":couple_with_heart_man_man_tone3_tone5:"]::before, em[data-emoji="couple_with_heart_man_man_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg"); } em[data-emoji=":couple_with_heart_man_man_tone4_tone1:"]::before, em[data-emoji="couple_with_heart_man_man_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg"); } em[data-emoji=":couple_with_heart_man_man_tone4_tone2:"]::before, em[data-emoji="couple_with_heart_man_man_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg"); } em[data-emoji=":couple_with_heart_man_man_tone4_tone3:"]::before, em[data-emoji="couple_with_heart_man_man_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg"); } em[data-emoji=":couple_with_heart_man_man_tone4:"]::before, em[data-emoji="couple_with_heart_man_man_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg"); } em[data-emoji=":couple_with_heart_man_man_tone4_tone5:"]::before, em[data-emoji="couple_with_heart_man_man_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg"); } em[data-emoji=":couple_with_heart_man_man_tone5_tone1:"]::before, em[data-emoji="couple_with_heart_man_man_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg"); } em[data-emoji=":couple_with_heart_man_man_tone5_tone2:"]::before, em[data-emoji="couple_with_heart_man_man_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg"); } em[data-emoji=":couple_with_heart_man_man_tone5_tone3:"]::before, em[data-emoji="couple_with_heart_man_man_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg"); } em[data-emoji=":couple_with_heart_man_man_tone5_tone4:"]::before, em[data-emoji="couple_with_heart_man_man_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg"); } em[data-emoji=":couple_with_heart_man_man_tone5:"]::before, em[data-emoji="couple_with_heart_man_man_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg"); } em[data-emoji=":couplekiss:"]::before, em[data-emoji="couplekiss"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f.svg"); } em[data-emoji=":kiss_tone1:"]::before, em[data-emoji="kiss_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f-1f3fb.svg"); } em[data-emoji=":kiss_person_person_tone1_tone2:"]::before, em[data-emoji="kiss_person_person_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":kiss_person_person_tone1_tone3:"]::before, em[data-emoji="kiss_person_person_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":kiss_person_person_tone1_tone4:"]::before, em[data-emoji="kiss_person_person_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":kiss_person_person_tone1_tone5:"]::before, em[data-emoji="kiss_person_person_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":kiss_person_person_tone2_tone1:"]::before, em[data-emoji="kiss_person_person_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":kiss_tone2:"]::before, em[data-emoji="kiss_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f-1f3fc.svg"); } em[data-emoji=":kiss_person_person_tone2_tone3:"]::before, em[data-emoji="kiss_person_person_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":kiss_person_person_tone2_tone4:"]::before, em[data-emoji="kiss_person_person_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":kiss_person_person_tone2_tone5:"]::before, em[data-emoji="kiss_person_person_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":kiss_person_person_tone3_tone1:"]::before, em[data-emoji="kiss_person_person_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":kiss_person_person_tone3_tone2:"]::before, em[data-emoji="kiss_person_person_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":kiss_tone3:"]::before, em[data-emoji="kiss_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f-1f3fd.svg"); } em[data-emoji=":kiss_person_person_tone3_tone4:"]::before, em[data-emoji="kiss_person_person_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":kiss_person_person_tone3_tone5:"]::before, em[data-emoji="kiss_person_person_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":kiss_person_person_tone4_tone1:"]::before, em[data-emoji="kiss_person_person_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":kiss_person_person_tone4_tone2:"]::before, em[data-emoji="kiss_person_person_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":kiss_person_person_tone4_tone3:"]::before, em[data-emoji="kiss_person_person_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":kiss_tone4:"]::before, em[data-emoji="kiss_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f-1f3fe.svg"); } em[data-emoji=":kiss_person_person_tone4_tone5:"]::before, em[data-emoji="kiss_person_person_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg"); } em[data-emoji=":kiss_person_person_tone5_tone1:"]::before, em[data-emoji="kiss_person_person_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg"); } em[data-emoji=":kiss_person_person_tone5_tone2:"]::before, em[data-emoji="kiss_person_person_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg"); } em[data-emoji=":kiss_person_person_tone5_tone3:"]::before, em[data-emoji="kiss_person_person_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg"); } em[data-emoji=":kiss_person_person_tone5_tone4:"]::before, em[data-emoji="kiss_person_person_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg"); } em[data-emoji=":kiss_tone5:"]::before, em[data-emoji="kiss_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48f-1f3ff.svg"); } em[data-emoji=":kiss_woman_man:"]::before, em[data-emoji="kiss_woman_man"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg"); } em[data-emoji=":kiss_woman_man_tone1:"]::before, em[data-emoji="kiss_woman_man_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg"); } em[data-emoji=":kiss_woman_man_tone1_tone2:"]::before, em[data-emoji="kiss_woman_man_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg"); } em[data-emoji=":kiss_woman_man_tone1_tone3:"]::before, em[data-emoji="kiss_woman_man_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg"); } em[data-emoji=":kiss_woman_man_tone1_tone4:"]::before, em[data-emoji="kiss_woman_man_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg"); } em[data-emoji=":kiss_woman_man_tone1_tone5:"]::before, em[data-emoji="kiss_woman_man_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg"); } em[data-emoji=":kiss_woman_man_tone2_tone1:"]::before, em[data-emoji="kiss_woman_man_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg"); } em[data-emoji=":kiss_woman_man_tone2:"]::before, em[data-emoji="kiss_woman_man_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg"); } em[data-emoji=":kiss_woman_man_tone2_tone3:"]::before, em[data-emoji="kiss_woman_man_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg"); } em[data-emoji=":kiss_woman_man_tone2_tone4:"]::before, em[data-emoji="kiss_woman_man_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg"); } em[data-emoji=":kiss_woman_man_tone2_tone5:"]::before, em[data-emoji="kiss_woman_man_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg"); } em[data-emoji=":kiss_woman_man_tone3_tone1:"]::before, em[data-emoji="kiss_woman_man_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg"); } em[data-emoji=":kiss_woman_man_tone3_tone2:"]::before, em[data-emoji="kiss_woman_man_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg"); } em[data-emoji=":kiss_woman_man_tone3:"]::before, em[data-emoji="kiss_woman_man_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg"); } em[data-emoji=":kiss_woman_man_tone3_tone4:"]::before, em[data-emoji="kiss_woman_man_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg"); } em[data-emoji=":kiss_woman_man_tone3_tone5:"]::before, em[data-emoji="kiss_woman_man_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg"); } em[data-emoji=":kiss_woman_man_tone4_tone1:"]::before, em[data-emoji="kiss_woman_man_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg"); } em[data-emoji=":kiss_woman_man_tone4_tone2:"]::before, em[data-emoji="kiss_woman_man_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg"); } em[data-emoji=":kiss_woman_man_tone4_tone3:"]::before, em[data-emoji="kiss_woman_man_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg"); } em[data-emoji=":kiss_woman_man_tone4:"]::before, em[data-emoji="kiss_woman_man_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg"); } em[data-emoji=":kiss_woman_man_tone4_tone5:"]::before, em[data-emoji="kiss_woman_man_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg"); } em[data-emoji=":kiss_woman_man_tone5_tone1:"]::before, em[data-emoji="kiss_woman_man_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg"); } em[data-emoji=":kiss_woman_man_tone5_tone2:"]::before, em[data-emoji="kiss_woman_man_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg"); } em[data-emoji=":kiss_woman_man_tone5_tone3:"]::before, em[data-emoji="kiss_woman_man_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg"); } em[data-emoji=":kiss_woman_man_tone5_tone4:"]::before, em[data-emoji="kiss_woman_man_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg"); } em[data-emoji=":kiss_woman_man_tone5:"]::before, em[data-emoji="kiss_woman_man_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg"); } em[data-emoji=":kiss_ww:"]::before, em[data-emoji="kiss_ww"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg"); } em[data-emoji=":kiss_woman_woman_tone1:"]::before, em[data-emoji="kiss_woman_woman_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg"); } em[data-emoji=":kiss_woman_woman_tone1_tone2:"]::before, em[data-emoji="kiss_woman_woman_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg"); } em[data-emoji=":kiss_woman_woman_tone1_tone3:"]::before, em[data-emoji="kiss_woman_woman_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg"); } em[data-emoji=":kiss_woman_woman_tone1_tone4:"]::before, em[data-emoji="kiss_woman_woman_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg"); } em[data-emoji=":kiss_woman_woman_tone1_tone5:"]::before, em[data-emoji="kiss_woman_woman_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg"); } em[data-emoji=":kiss_woman_woman_tone2_tone1:"]::before, em[data-emoji="kiss_woman_woman_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg"); } em[data-emoji=":kiss_woman_woman_tone2:"]::before, em[data-emoji="kiss_woman_woman_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg"); } em[data-emoji=":kiss_woman_woman_tone2_tone3:"]::before, em[data-emoji="kiss_woman_woman_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg"); } em[data-emoji=":kiss_woman_woman_tone2_tone4:"]::before, em[data-emoji="kiss_woman_woman_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg"); } em[data-emoji=":kiss_woman_woman_tone2_tone5:"]::before, em[data-emoji="kiss_woman_woman_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg"); } em[data-emoji=":kiss_woman_woman_tone3_tone1:"]::before, em[data-emoji="kiss_woman_woman_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg"); } em[data-emoji=":kiss_woman_woman_tone3_tone2:"]::before, em[data-emoji="kiss_woman_woman_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg"); } em[data-emoji=":kiss_woman_woman_tone3:"]::before, em[data-emoji="kiss_woman_woman_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg"); } em[data-emoji=":kiss_woman_woman_tone3_tone4:"]::before, em[data-emoji="kiss_woman_woman_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg"); } em[data-emoji=":kiss_woman_woman_tone3_tone5:"]::before, em[data-emoji="kiss_woman_woman_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg"); } em[data-emoji=":kiss_woman_woman_tone4_tone1:"]::before, em[data-emoji="kiss_woman_woman_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg"); } em[data-emoji=":kiss_woman_woman_tone4_tone2:"]::before, em[data-emoji="kiss_woman_woman_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg"); } em[data-emoji=":kiss_woman_woman_tone4_tone3:"]::before, em[data-emoji="kiss_woman_woman_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg"); } em[data-emoji=":kiss_woman_woman_tone4:"]::before, em[data-emoji="kiss_woman_woman_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg"); } em[data-emoji=":kiss_woman_woman_tone4_tone5:"]::before, em[data-emoji="kiss_woman_woman_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg"); } em[data-emoji=":kiss_woman_woman_tone5_tone1:"]::before, em[data-emoji="kiss_woman_woman_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg"); } em[data-emoji=":kiss_woman_woman_tone5_tone2:"]::before, em[data-emoji="kiss_woman_woman_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg"); } em[data-emoji=":kiss_woman_woman_tone5_tone3:"]::before, em[data-emoji="kiss_woman_woman_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg"); } em[data-emoji=":kiss_woman_woman_tone5_tone4:"]::before, em[data-emoji="kiss_woman_woman_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg"); } em[data-emoji=":kiss_woman_woman_tone5:"]::before, em[data-emoji="kiss_woman_woman_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg"); } em[data-emoji=":kiss_mm:"]::before, em[data-emoji="kiss_mm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg"); } em[data-emoji=":kiss_man_man_tone1:"]::before, em[data-emoji="kiss_man_man_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg"); } em[data-emoji=":kiss_man_man_tone1_tone2:"]::before, em[data-emoji="kiss_man_man_tone1_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg"); } em[data-emoji=":kiss_man_man_tone1_tone3:"]::before, em[data-emoji="kiss_man_man_tone1_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg"); } em[data-emoji=":kiss_man_man_tone1_tone4:"]::before, em[data-emoji="kiss_man_man_tone1_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg"); } em[data-emoji=":kiss_man_man_tone1_tone5:"]::before, em[data-emoji="kiss_man_man_tone1_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg"); } em[data-emoji=":kiss_man_man_tone2_tone1:"]::before, em[data-emoji="kiss_man_man_tone2_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg"); } em[data-emoji=":kiss_man_man_tone2:"]::before, em[data-emoji="kiss_man_man_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg"); } em[data-emoji=":kiss_man_man_tone2_tone3:"]::before, em[data-emoji="kiss_man_man_tone2_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg"); } em[data-emoji=":kiss_man_man_tone2_tone4:"]::before, em[data-emoji="kiss_man_man_tone2_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg"); } em[data-emoji=":kiss_man_man_tone2_tone5:"]::before, em[data-emoji="kiss_man_man_tone2_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg"); } em[data-emoji=":kiss_man_man_tone3_tone1:"]::before, em[data-emoji="kiss_man_man_tone3_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg"); } em[data-emoji=":kiss_man_man_tone3_tone2:"]::before, em[data-emoji="kiss_man_man_tone3_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg"); } em[data-emoji=":kiss_man_man_tone3:"]::before, em[data-emoji="kiss_man_man_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg"); } em[data-emoji=":kiss_man_man_tone3_tone4:"]::before, em[data-emoji="kiss_man_man_tone3_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg"); } em[data-emoji=":kiss_man_man_tone3_tone5:"]::before, em[data-emoji="kiss_man_man_tone3_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg"); } em[data-emoji=":kiss_man_man_tone4_tone1:"]::before, em[data-emoji="kiss_man_man_tone4_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg"); } em[data-emoji=":kiss_man_man_tone4_tone2:"]::before, em[data-emoji="kiss_man_man_tone4_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg"); } em[data-emoji=":kiss_man_man_tone4_tone3:"]::before, em[data-emoji="kiss_man_man_tone4_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg"); } em[data-emoji=":kiss_man_man_tone4:"]::before, em[data-emoji="kiss_man_man_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg"); } em[data-emoji=":kiss_man_man_tone4_tone5:"]::before, em[data-emoji="kiss_man_man_tone4_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg"); } em[data-emoji=":kiss_man_man_tone5_tone1:"]::before, em[data-emoji="kiss_man_man_tone5_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg"); } em[data-emoji=":kiss_man_man_tone5_tone2:"]::before, em[data-emoji="kiss_man_man_tone5_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg"); } em[data-emoji=":kiss_man_man_tone5_tone3:"]::before, em[data-emoji="kiss_man_man_tone5_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg"); } em[data-emoji=":kiss_man_man_tone5_tone4:"]::before, em[data-emoji="kiss_man_man_tone5_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg"); } em[data-emoji=":kiss_man_man_tone5:"]::before, em[data-emoji="kiss_man_man_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg"); } em[data-emoji=":family_adult_adult_child_child:"]::before, em[data-emoji="family_adult_adult_child_child"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9d1-200d-1f9d2-200d-1f9d2.svg"); } em[data-emoji=":family_adult_adult_child:"]::before, em[data-emoji="family_adult_adult_child"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9d1-200d-1f9d2.svg"); } em[data-emoji=":family_adult_child_child:"]::before, em[data-emoji="family_adult_child_child"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9d2-200d-1f9d2.svg"); } em[data-emoji=":family_adult_child:"]::before, em[data-emoji="family_adult_child"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d1-200d-1f9d2.svg"); } em[data-emoji=":family:"]::before, em[data-emoji="family"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f46a.svg"); } em[data-emoji=":family_man_woman_boy:"]::before, em[data-emoji="family_man_woman_boy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f469-200d-1f466.svg"); } em[data-emoji=":family_mwg:"]::before, em[data-emoji="family_mwg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f469-200d-1f467.svg"); } em[data-emoji=":family_mwgb:"]::before, em[data-emoji="family_mwgb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f469-200d-1f467-200d-1f466.svg"); } em[data-emoji=":family_mwbb:"]::before, em[data-emoji="family_mwbb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f469-200d-1f466-200d-1f466.svg"); } em[data-emoji=":family_mwgg:"]::before, em[data-emoji="family_mwgg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f469-200d-1f467-200d-1f467.svg"); } em[data-emoji=":family_wwb:"]::before, em[data-emoji="family_wwb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f469-200d-1f466.svg"); } em[data-emoji=":family_wwg:"]::before, em[data-emoji="family_wwg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f469-200d-1f467.svg"); } em[data-emoji=":family_wwgb:"]::before, em[data-emoji="family_wwgb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f469-200d-1f467-200d-1f466.svg"); } em[data-emoji=":family_wwbb:"]::before, em[data-emoji="family_wwbb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f469-200d-1f466-200d-1f466.svg"); } em[data-emoji=":family_wwgg:"]::before, em[data-emoji="family_wwgg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f469-200d-1f467-200d-1f467.svg"); } em[data-emoji=":family_mmb:"]::before, em[data-emoji="family_mmb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f468-200d-1f466.svg"); } em[data-emoji=":family_mmg:"]::before, em[data-emoji="family_mmg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f468-200d-1f467.svg"); } em[data-emoji=":family_mmgb:"]::before, em[data-emoji="family_mmgb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f468-200d-1f467-200d-1f466.svg"); } em[data-emoji=":family_mmbb:"]::before, em[data-emoji="family_mmbb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f468-200d-1f466-200d-1f466.svg"); } em[data-emoji=":family_mmgg:"]::before, em[data-emoji="family_mmgg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f468-200d-1f467-200d-1f467.svg"); } em[data-emoji=":family_woman_boy:"]::before, em[data-emoji="family_woman_boy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f466.svg"); } em[data-emoji=":family_woman_girl:"]::before, em[data-emoji="family_woman_girl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f467.svg"); } em[data-emoji=":family_woman_girl_boy:"]::before, em[data-emoji="family_woman_girl_boy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f467-200d-1f466.svg"); } em[data-emoji=":family_woman_boy_boy:"]::before, em[data-emoji="family_woman_boy_boy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f466-200d-1f466.svg"); } em[data-emoji=":family_woman_girl_girl:"]::before, em[data-emoji="family_woman_girl_girl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f469-200d-1f467-200d-1f467.svg"); } em[data-emoji=":family_man_boy:"]::before, em[data-emoji="family_man_boy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f466.svg"); } em[data-emoji=":family_man_girl:"]::before, em[data-emoji="family_man_girl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f467.svg"); } em[data-emoji=":family_man_girl_boy:"]::before, em[data-emoji="family_man_girl_boy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f467-200d-1f466.svg"); } em[data-emoji=":family_man_boy_boy:"]::before, em[data-emoji="family_man_boy_boy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f466-200d-1f466.svg"); } em[data-emoji=":family_man_girl_girl:"]::before, em[data-emoji="family_man_girl_girl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f468-200d-1f467-200d-1f467.svg"); } em[data-emoji=":knot:"]::before, em[data-emoji="knot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa2.svg"); } em[data-emoji=":yarn:"]::before, em[data-emoji="yarn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f6.svg"); } em[data-emoji=":thread:"]::before, em[data-emoji="thread"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f5.svg"); } em[data-emoji=":sewing_needle:"]::before, em[data-emoji="sewing_needle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa1.svg"); } em[data-emoji=":coat:"]::before, em[data-emoji="coat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e5.svg"); } em[data-emoji=":lab_coat:"]::before, em[data-emoji="lab_coat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97c.svg"); } em[data-emoji=":safety_vest:"]::before, em[data-emoji="safety_vest"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ba.svg"); } em[data-emoji=":womans_clothes:"]::before, em[data-emoji="womans_clothes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45a.svg"); } em[data-emoji=":shirt:"]::before, em[data-emoji="shirt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f455.svg"); } em[data-emoji=":jeans:"]::before, em[data-emoji="jeans"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f456.svg"); } em[data-emoji=":briefs:"]::before, em[data-emoji="briefs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa72.svg"); } em[data-emoji=":shorts:"]::before, em[data-emoji="shorts"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa73.svg"); } em[data-emoji=":necktie:"]::before, em[data-emoji="necktie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f454.svg"); } em[data-emoji=":dress:"]::before, em[data-emoji="dress"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f457.svg"); } em[data-emoji=":bikini:"]::before, em[data-emoji="bikini"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f459.svg"); } em[data-emoji=":one_piece_swimsuit:"]::before, em[data-emoji="one_piece_swimsuit"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa71.svg"); } em[data-emoji=":kimono:"]::before, em[data-emoji="kimono"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f458.svg"); } em[data-emoji=":sari:"]::before, em[data-emoji="sari"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97b.svg"); } em[data-emoji=":thong_sandal:"]::before, em[data-emoji="thong_sandal"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa74.svg"); } em[data-emoji=":womans_flat_shoe:"]::before, em[data-emoji="womans_flat_shoe"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97f.svg"); } em[data-emoji=":high_heel:"]::before, em[data-emoji="high_heel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f460.svg"); } em[data-emoji=":sandal:"]::before, em[data-emoji="sandal"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f461.svg"); } em[data-emoji=":boot:"]::before, em[data-emoji="boot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f462.svg"); } em[data-emoji=":mans_shoe:"]::before, em[data-emoji="mans_shoe"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45e.svg"); } em[data-emoji=":athletic_shoe:"]::before, em[data-emoji="athletic_shoe"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45f.svg"); } em[data-emoji=":hiking_boot:"]::before, em[data-emoji="hiking_boot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97e.svg"); } em[data-emoji=":socks:"]::before, em[data-emoji="socks"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e6.svg"); } em[data-emoji=":gloves:"]::before, em[data-emoji="gloves"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e4.svg"); } em[data-emoji=":scarf:"]::before, em[data-emoji="scarf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e3.svg"); } em[data-emoji=":tophat:"]::before, em[data-emoji="tophat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a9.svg"); } em[data-emoji=":billed_cap:"]::before, em[data-emoji="billed_cap"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e2.svg"); } em[data-emoji=":womans_hat:"]::before, em[data-emoji="womans_hat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f452.svg"); } em[data-emoji=":mortar_board:"]::before, em[data-emoji="mortar_board"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f393.svg"); } em[data-emoji=":helmet_with_cross:"]::before, em[data-emoji="helmet_with_cross"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26d1.svg"); } em[data-emoji=":military_helmet:"]::before, em[data-emoji="military_helmet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa96.svg"); } em[data-emoji=":crown:"]::before, em[data-emoji="crown"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f451.svg"); } em[data-emoji=":ring:"]::before, em[data-emoji="ring"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48d.svg"); } em[data-emoji=":pouch:"]::before, em[data-emoji="pouch"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45d.svg"); } em[data-emoji=":purse:"]::before, em[data-emoji="purse"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45b.svg"); } em[data-emoji=":handbag:"]::before, em[data-emoji="handbag"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f45c.svg"); } em[data-emoji=":briefcase:"]::before, em[data-emoji="briefcase"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4bc.svg"); } em[data-emoji=":school_satchel:"]::before, em[data-emoji="school_satchel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f392.svg"); } em[data-emoji=":luggage:"]::before, em[data-emoji="luggage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f3.svg"); } em[data-emoji=":eyeglasses:"]::before, em[data-emoji="eyeglasses"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f453.svg"); } em[data-emoji=":dark_sunglasses:"]::before, em[data-emoji="dark_sunglasses"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f576.svg"); } em[data-emoji=":goggles:"]::before, em[data-emoji="goggles"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f97d.svg"); } em[data-emoji=":closed_umbrella:"]::before, em[data-emoji="closed_umbrella"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f302.svg"); } em[data-emoji=":curly_haired:"]::before, em[data-emoji="curly_haired"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b1.svg"); } em[data-emoji=":red_haired:"]::before, em[data-emoji="red_haired"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b0.svg"); } em[data-emoji=":white_haired:"]::before, em[data-emoji="white_haired"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b3.svg"); } em[data-emoji=":bald:"]::before, em[data-emoji="bald"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b2.svg"); } em[data-emoji=":dog:"]::before, em[data-emoji="dog"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f436.svg"); } em[data-emoji=":cat:"]::before, em[data-emoji="cat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f431.svg"); } em[data-emoji=":mouse:"]::before, em[data-emoji="mouse"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42d.svg"); } em[data-emoji=":hamster:"]::before, em[data-emoji="hamster"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f439.svg"); } em[data-emoji=":rabbit:"]::before, em[data-emoji="rabbit"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f430.svg"); } em[data-emoji=":fox:"]::before, em[data-emoji="fox"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98a.svg"); } em[data-emoji=":bear:"]::before, em[data-emoji="bear"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43b.svg"); } em[data-emoji=":panda_face:"]::before, em[data-emoji="panda_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43c.svg"); } em[data-emoji=":polar_bear:"]::before, em[data-emoji="polar_bear"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43b-200d-2744-fe0f.svg"); } em[data-emoji=":koala:"]::before, em[data-emoji="koala"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f428.svg"); } em[data-emoji=":tiger:"]::before, em[data-emoji="tiger"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42f.svg"); } em[data-emoji=":lion_face:"]::before, em[data-emoji="lion_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f981.svg"); } em[data-emoji=":cow:"]::before, em[data-emoji="cow"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42e.svg"); } em[data-emoji=":pig:"]::before, em[data-emoji="pig"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f437.svg"); } em[data-emoji=":pig_nose:"]::before, em[data-emoji="pig_nose"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43d.svg"); } em[data-emoji=":frog:"]::before, em[data-emoji="frog"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f438.svg"); } em[data-emoji=":monkey_face:"]::before, em[data-emoji="monkey_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f435.svg"); } em[data-emoji=":see_no_evil:"]::before, em[data-emoji="see_no_evil"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f648.svg"); } em[data-emoji=":hear_no_evil:"]::before, em[data-emoji="hear_no_evil"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f649.svg"); } em[data-emoji=":speak_no_evil:"]::before, em[data-emoji="speak_no_evil"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f64a.svg"); } em[data-emoji=":monkey:"]::before, em[data-emoji="monkey"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f412.svg"); } em[data-emoji=":chicken:"]::before, em[data-emoji="chicken"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f414.svg"); } em[data-emoji=":penguin:"]::before, em[data-emoji="penguin"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f427.svg"); } em[data-emoji=":bird:"]::before, em[data-emoji="bird"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f426.svg"); } em[data-emoji=":baby_chick:"]::before, em[data-emoji="baby_chick"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f424.svg"); } em[data-emoji=":hatching_chick:"]::before, em[data-emoji="hatching_chick"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f423.svg"); } em[data-emoji=":hatched_chick:"]::before, em[data-emoji="hatched_chick"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f425.svg"); } em[data-emoji=":goose:"]::before, em[data-emoji="goose"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fabf.svg"); } em[data-emoji=":duck:"]::before, em[data-emoji="duck"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f986.svg"); } em[data-emoji=":black_bird:"]::before, em[data-emoji="black_bird"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f426-200d-2b1b.svg"); } em[data-emoji=":eagle:"]::before, em[data-emoji="eagle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f985.svg"); } em[data-emoji=":owl:"]::before, em[data-emoji="owl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f989.svg"); } em[data-emoji=":bat:"]::before, em[data-emoji="bat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f987.svg"); } em[data-emoji=":wolf:"]::before, em[data-emoji="wolf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43a.svg"); } em[data-emoji=":boar:"]::before, em[data-emoji="boar"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f417.svg"); } em[data-emoji=":horse:"]::before, em[data-emoji="horse"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f434.svg"); } em[data-emoji=":unicorn:"]::before, em[data-emoji="unicorn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f984.svg"); } em[data-emoji=":moose:"]::before, em[data-emoji="moose"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1face.svg"); } em[data-emoji=":bee:"]::before, em[data-emoji="bee"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41d.svg"); } em[data-emoji=":worm:"]::before, em[data-emoji="worm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab1.svg"); } em[data-emoji=":bug:"]::before, em[data-emoji="bug"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41b.svg"); } em[data-emoji=":butterfly:"]::before, em[data-emoji="butterfly"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98b.svg"); } em[data-emoji=":snail:"]::before, em[data-emoji="snail"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40c.svg"); } em[data-emoji=":lady_beetle:"]::before, em[data-emoji="lady_beetle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41e.svg"); } em[data-emoji=":ant:"]::before, em[data-emoji="ant"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41c.svg"); } em[data-emoji=":fly:"]::before, em[data-emoji="fly"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab0.svg"); } em[data-emoji=":beetle:"]::before, em[data-emoji="beetle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab2.svg"); } em[data-emoji=":cockroach:"]::before, em[data-emoji="cockroach"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab3.svg"); } em[data-emoji=":mosquito:"]::before, em[data-emoji="mosquito"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99f.svg"); } em[data-emoji=":cricket:"]::before, em[data-emoji="cricket"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f997.svg"); } em[data-emoji=":spider:"]::before, em[data-emoji="spider"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f577.svg"); } em[data-emoji=":spider_web:"]::before, em[data-emoji="spider_web"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f578.svg"); } em[data-emoji=":scorpion:"]::before, em[data-emoji="scorpion"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f982.svg"); } em[data-emoji=":turtle:"]::before, em[data-emoji="turtle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f422.svg"); } em[data-emoji=":snake:"]::before, em[data-emoji="snake"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40d.svg"); } em[data-emoji=":lizard:"]::before, em[data-emoji="lizard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98e.svg"); } em[data-emoji=":t_rex:"]::before, em[data-emoji="t_rex"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f996.svg"); } em[data-emoji=":sauropod:"]::before, em[data-emoji="sauropod"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f995.svg"); } em[data-emoji=":octopus:"]::before, em[data-emoji="octopus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f419.svg"); } em[data-emoji=":squid:"]::before, em[data-emoji="squid"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f991.svg"); } em[data-emoji=":jellyfish:"]::before, em[data-emoji="jellyfish"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fabc.svg"); } em[data-emoji=":shrimp:"]::before, em[data-emoji="shrimp"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f990.svg"); } em[data-emoji=":lobster:"]::before, em[data-emoji="lobster"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99e.svg"); } em[data-emoji=":crab:"]::before, em[data-emoji="crab"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f980.svg"); } em[data-emoji=":blowfish:"]::before, em[data-emoji="blowfish"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f421.svg"); } em[data-emoji=":tropical_fish:"]::before, em[data-emoji="tropical_fish"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f420.svg"); } em[data-emoji=":fish:"]::before, em[data-emoji="fish"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41f.svg"); } em[data-emoji=":dolphin:"]::before, em[data-emoji="dolphin"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42c.svg"); } em[data-emoji=":whale:"]::before, em[data-emoji="whale"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f433.svg"); } em[data-emoji=":whale2:"]::before, em[data-emoji="whale2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40b.svg"); } em[data-emoji=":shark:"]::before, em[data-emoji="shark"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f988.svg"); } em[data-emoji=":seal:"]::before, em[data-emoji="seal"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ad.svg"); } em[data-emoji=":crocodile:"]::before, em[data-emoji="crocodile"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40a.svg"); } em[data-emoji=":tiger2:"]::before, em[data-emoji="tiger2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f405.svg"); } em[data-emoji=":leopard:"]::before, em[data-emoji="leopard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f406.svg"); } em[data-emoji=":zebra:"]::before, em[data-emoji="zebra"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f993.svg"); } em[data-emoji=":gorilla:"]::before, em[data-emoji="gorilla"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98d.svg"); } em[data-emoji=":orangutan:"]::before, em[data-emoji="orangutan"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a7.svg"); } em[data-emoji=":mammoth:"]::before, em[data-emoji="mammoth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a3.svg"); } em[data-emoji=":elephant:"]::before, em[data-emoji="elephant"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f418.svg"); } em[data-emoji=":hippopotamus:"]::before, em[data-emoji="hippopotamus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99b.svg"); } em[data-emoji=":rhino:"]::before, em[data-emoji="rhino"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98f.svg"); } em[data-emoji=":dromedary_camel:"]::before, em[data-emoji="dromedary_camel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42a.svg"); } em[data-emoji=":camel:"]::before, em[data-emoji="camel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f42b.svg"); } em[data-emoji=":giraffe:"]::before, em[data-emoji="giraffe"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f992.svg"); } em[data-emoji=":kangaroo:"]::before, em[data-emoji="kangaroo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f998.svg"); } em[data-emoji=":bison:"]::before, em[data-emoji="bison"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ac.svg"); } em[data-emoji=":water_buffalo:"]::before, em[data-emoji="water_buffalo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f403.svg"); } em[data-emoji=":ox:"]::before, em[data-emoji="ox"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f402.svg"); } em[data-emoji=":cow2:"]::before, em[data-emoji="cow2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f404.svg"); } em[data-emoji=":donkey:"]::before, em[data-emoji="donkey"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1facf.svg"); } em[data-emoji=":racehorse:"]::before, em[data-emoji="racehorse"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40e.svg"); } em[data-emoji=":pig2:"]::before, em[data-emoji="pig2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f416.svg"); } em[data-emoji=":ram:"]::before, em[data-emoji="ram"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f40f.svg"); } em[data-emoji=":sheep:"]::before, em[data-emoji="sheep"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f411.svg"); } em[data-emoji=":llama:"]::before, em[data-emoji="llama"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f999.svg"); } em[data-emoji=":goat:"]::before, em[data-emoji="goat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f410.svg"); } em[data-emoji=":deer:"]::before, em[data-emoji="deer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f98c.svg"); } em[data-emoji=":dog2:"]::before, em[data-emoji="dog2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f415.svg"); } em[data-emoji=":poodle:"]::before, em[data-emoji="poodle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f429.svg"); } em[data-emoji=":guide_dog:"]::before, em[data-emoji="guide_dog"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ae.svg"); } em[data-emoji=":service_dog:"]::before, em[data-emoji="service_dog"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f415-200d-1f9ba.svg"); } em[data-emoji=":cat2:"]::before, em[data-emoji="cat2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f408.svg"); } em[data-emoji=":black_cat:"]::before, em[data-emoji="black_cat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f408-200d-2b1b.svg"); } em[data-emoji=":feather:"]::before, em[data-emoji="feather"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab6.svg"); } em[data-emoji=":wing:"]::before, em[data-emoji="wing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fabd.svg"); } em[data-emoji=":rooster:"]::before, em[data-emoji="rooster"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f413.svg"); } em[data-emoji=":turkey:"]::before, em[data-emoji="turkey"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f983.svg"); } em[data-emoji=":dodo:"]::before, em[data-emoji="dodo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a4.svg"); } em[data-emoji=":peacock:"]::before, em[data-emoji="peacock"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99a.svg"); } em[data-emoji=":parrot:"]::before, em[data-emoji="parrot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99c.svg"); } em[data-emoji=":swan:"]::before, em[data-emoji="swan"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a2.svg"); } em[data-emoji=":flamingo:"]::before, em[data-emoji="flamingo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a9.svg"); } em[data-emoji=":dove:"]::before, em[data-emoji="dove"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f54a.svg"); } em[data-emoji=":rabbit2:"]::before, em[data-emoji="rabbit2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f407.svg"); } em[data-emoji=":raccoon:"]::before, em[data-emoji="raccoon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f99d.svg"); } em[data-emoji=":skunk:"]::before, em[data-emoji="skunk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a8.svg"); } em[data-emoji=":badger:"]::before, em[data-emoji="badger"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a1.svg"); } em[data-emoji=":beaver:"]::before, em[data-emoji="beaver"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ab.svg"); } em[data-emoji=":otter:"]::before, em[data-emoji="otter"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a6.svg"); } em[data-emoji=":sloth:"]::before, em[data-emoji="sloth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a5.svg"); } em[data-emoji=":mouse2:"]::before, em[data-emoji="mouse2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f401.svg"); } em[data-emoji=":rat:"]::before, em[data-emoji="rat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f400.svg"); } em[data-emoji=":chipmunk:"]::before, em[data-emoji="chipmunk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43f.svg"); } em[data-emoji=":hedgehog:"]::before, em[data-emoji="hedgehog"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f994.svg"); } em[data-emoji=":feet:"]::before, em[data-emoji="feet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f43e.svg"); } em[data-emoji=":dragon:"]::before, em[data-emoji="dragon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f409.svg"); } em[data-emoji=":dragon_face:"]::before, em[data-emoji="dragon_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f432.svg"); } em[data-emoji=":phoenix:"]::before, em[data-emoji="phoenix"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f426-200d-1f525.svg"); } em[data-emoji=":cactus:"]::before, em[data-emoji="cactus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f335.svg"); } em[data-emoji=":christmas_tree:"]::before, em[data-emoji="christmas_tree"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f384.svg"); } em[data-emoji=":evergreen_tree:"]::before, em[data-emoji="evergreen_tree"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f332.svg"); } em[data-emoji=":deciduous_tree:"]::before, em[data-emoji="deciduous_tree"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f333.svg"); } em[data-emoji=":palm_tree:"]::before, em[data-emoji="palm_tree"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f334.svg"); } em[data-emoji=":wood:"]::before, em[data-emoji="wood"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab5.svg"); } em[data-emoji=":seedling:"]::before, em[data-emoji="seedling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f331.svg"); } em[data-emoji=":herb:"]::before, em[data-emoji="herb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33f.svg"); } em[data-emoji=":four_leaf_clover:"]::before, em[data-emoji="four_leaf_clover"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f340.svg"); } em[data-emoji=":bamboo:"]::before, em[data-emoji="bamboo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38d.svg"); } em[data-emoji=":potted_plant:"]::before, em[data-emoji="potted_plant"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab4.svg"); } em[data-emoji=":tanabata_tree:"]::before, em[data-emoji="tanabata_tree"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38b.svg"); } em[data-emoji=":leaves:"]::before, em[data-emoji="leaves"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f343.svg"); } em[data-emoji=":fallen_leaf:"]::before, em[data-emoji="fallen_leaf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f342.svg"); } em[data-emoji=":maple_leaf:"]::before, em[data-emoji="maple_leaf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f341.svg"); } em[data-emoji=":nest_with_eggs:"]::before, em[data-emoji="nest_with_eggs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faba.svg"); } em[data-emoji=":empty_nest:"]::before, em[data-emoji="empty_nest"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab9.svg"); } em[data-emoji=":mushroom:"]::before, em[data-emoji="mushroom"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f344.svg"); } em[data-emoji=":brown_mushroom:"]::before, em[data-emoji="brown_mushroom"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f344-200d-1f7eb.svg"); } em[data-emoji=":shell:"]::before, em[data-emoji="shell"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f41a.svg"); } em[data-emoji=":coral:"]::before, em[data-emoji="coral"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab8.svg"); } em[data-emoji=":rock:"]::before, em[data-emoji="rock"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa8.svg"); } em[data-emoji=":ear_of_rice:"]::before, em[data-emoji="ear_of_rice"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33e.svg"); } em[data-emoji=":bouquet:"]::before, em[data-emoji="bouquet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f490.svg"); } em[data-emoji=":tulip:"]::before, em[data-emoji="tulip"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f337.svg"); } em[data-emoji=":rose:"]::before, em[data-emoji="rose"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f339.svg"); } em[data-emoji=":wilted_rose:"]::before, em[data-emoji="wilted_rose"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f940.svg"); } em[data-emoji=":hyacinth:"]::before, em[data-emoji="hyacinth"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fabb.svg"); } em[data-emoji=":lotus:"]::before, em[data-emoji="lotus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fab7.svg"); } em[data-emoji=":hibiscus:"]::before, em[data-emoji="hibiscus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33a.svg"); } em[data-emoji=":cherry_blossom:"]::before, em[data-emoji="cherry_blossom"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f338.svg"); } em[data-emoji=":blossom:"]::before, em[data-emoji="blossom"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33c.svg"); } em[data-emoji=":sunflower:"]::before, em[data-emoji="sunflower"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33b.svg"); } em[data-emoji=":sun_with_face:"]::before, em[data-emoji="sun_with_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31e.svg"); } em[data-emoji=":full_moon_with_face:"]::before, em[data-emoji="full_moon_with_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31d.svg"); } em[data-emoji=":first_quarter_moon_with_face:"]::before, em[data-emoji="first_quarter_moon_with_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31b.svg"); } em[data-emoji=":last_quarter_moon_with_face:"]::before, em[data-emoji="last_quarter_moon_with_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31c.svg"); } em[data-emoji=":new_moon_with_face:"]::before, em[data-emoji="new_moon_with_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31a.svg"); } em[data-emoji=":full_moon:"]::before, em[data-emoji="full_moon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f315.svg"); } em[data-emoji=":waning_gibbous_moon:"]::before, em[data-emoji="waning_gibbous_moon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f316.svg"); } em[data-emoji=":last_quarter_moon:"]::before, em[data-emoji="last_quarter_moon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f317.svg"); } em[data-emoji=":waning_crescent_moon:"]::before, em[data-emoji="waning_crescent_moon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f318.svg"); } em[data-emoji=":new_moon:"]::before, em[data-emoji="new_moon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f311.svg"); } em[data-emoji=":waxing_crescent_moon:"]::before, em[data-emoji="waxing_crescent_moon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f312.svg"); } em[data-emoji=":first_quarter_moon:"]::before, em[data-emoji="first_quarter_moon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f313.svg"); } em[data-emoji=":waxing_gibbous_moon:"]::before, em[data-emoji="waxing_gibbous_moon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f314.svg"); } em[data-emoji=":crescent_moon:"]::before, em[data-emoji="crescent_moon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f319.svg"); } em[data-emoji=":earth_americas:"]::before, em[data-emoji="earth_americas"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30e.svg"); } em[data-emoji=":earth_africa:"]::before, em[data-emoji="earth_africa"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30d.svg"); } em[data-emoji=":earth_asia:"]::before, em[data-emoji="earth_asia"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30f.svg"); } em[data-emoji=":ringed_planet:"]::before, em[data-emoji="ringed_planet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa90.svg"); } em[data-emoji=":dizzy:"]::before, em[data-emoji="dizzy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ab.svg"); } em[data-emoji=":star:"]::before, em[data-emoji="star"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b50.svg"); } em[data-emoji=":star2:"]::before, em[data-emoji="star2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f31f.svg"); } em[data-emoji=":zap:"]::before, em[data-emoji="zap"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26a1.svg"); } em[data-emoji=":boom:"]::before, em[data-emoji="boom"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a5.svg"); } em[data-emoji=":fire:"]::before, em[data-emoji="fire"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f525.svg"); } em[data-emoji=":cloud_tornado:"]::before, em[data-emoji="cloud_tornado"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32a.svg"); } em[data-emoji=":rainbow:"]::before, em[data-emoji="rainbow"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f308.svg"); } em[data-emoji=":white_sun_small_cloud:"]::before, em[data-emoji="white_sun_small_cloud"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f324.svg"); } em[data-emoji=":partly_sunny:"]::before, em[data-emoji="partly_sunny"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26c5.svg"); } em[data-emoji=":white_sun_cloud:"]::before, em[data-emoji="white_sun_cloud"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f325.svg"); } em[data-emoji=":white_sun_rain_cloud:"]::before, em[data-emoji="white_sun_rain_cloud"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f326.svg"); } em[data-emoji=":cloud_rain:"]::before, em[data-emoji="cloud_rain"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f327.svg"); } em[data-emoji=":thunder_cloud_rain:"]::before, em[data-emoji="thunder_cloud_rain"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26c8.svg"); } em[data-emoji=":cloud_lightning:"]::before, em[data-emoji="cloud_lightning"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f329.svg"); } em[data-emoji=":cloud_snow:"]::before, em[data-emoji="cloud_snow"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f328.svg"); } em[data-emoji=":snowman:"]::before, em[data-emoji="snowman"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26c4.svg"); } em[data-emoji=":wind_blowing_face:"]::before, em[data-emoji="wind_blowing_face"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32c.svg"); } em[data-emoji=":dash:"]::before, em[data-emoji="dash"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a8.svg"); } em[data-emoji=":droplet:"]::before, em[data-emoji="droplet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a7.svg"); } em[data-emoji=":sweat_drops:"]::before, em[data-emoji="sweat_drops"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a6.svg"); } em[data-emoji=":bubbles:"]::before, em[data-emoji="bubbles"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fae7.svg"); } em[data-emoji=":ocean:"]::before, em[data-emoji="ocean"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30a.svg"); } em[data-emoji=":fog:"]::before, em[data-emoji="fog"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32b.svg"); } em[data-emoji=":green_apple:"]::before, em[data-emoji="green_apple"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34f.svg"); } em[data-emoji=":apple:"]::before, em[data-emoji="apple"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34e.svg"); } em[data-emoji=":pear:"]::before, em[data-emoji="pear"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f350.svg"); } em[data-emoji=":tangerine:"]::before, em[data-emoji="tangerine"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34a.svg"); } em[data-emoji=":lemon:"]::before, em[data-emoji="lemon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34b.svg"); } em[data-emoji=":lime:"]::before, em[data-emoji="lime"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34b-200d-1f7e9.svg"); } em[data-emoji=":banana:"]::before, em[data-emoji="banana"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34c.svg"); } em[data-emoji=":watermelon:"]::before, em[data-emoji="watermelon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f349.svg"); } em[data-emoji=":grapes:"]::before, em[data-emoji="grapes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f347.svg"); } em[data-emoji=":strawberry:"]::before, em[data-emoji="strawberry"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f353.svg"); } em[data-emoji=":blueberries:"]::before, em[data-emoji="blueberries"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad0.svg"); } em[data-emoji=":melon:"]::before, em[data-emoji="melon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f348.svg"); } em[data-emoji=":cherries:"]::before, em[data-emoji="cherries"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f352.svg"); } em[data-emoji=":peach:"]::before, em[data-emoji="peach"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f351.svg"); } em[data-emoji=":mango:"]::before, em[data-emoji="mango"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96d.svg"); } em[data-emoji=":pineapple:"]::before, em[data-emoji="pineapple"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f34d.svg"); } em[data-emoji=":coconut:"]::before, em[data-emoji="coconut"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f965.svg"); } em[data-emoji=":kiwi:"]::before, em[data-emoji="kiwi"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95d.svg"); } em[data-emoji=":tomato:"]::before, em[data-emoji="tomato"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f345.svg"); } em[data-emoji=":eggplant:"]::before, em[data-emoji="eggplant"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f346.svg"); } em[data-emoji=":avocado:"]::before, em[data-emoji="avocado"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f951.svg"); } em[data-emoji=":pea_pod:"]::before, em[data-emoji="pea_pod"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fadb.svg"); } em[data-emoji=":broccoli:"]::before, em[data-emoji="broccoli"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f966.svg"); } em[data-emoji=":leafy_green:"]::before, em[data-emoji="leafy_green"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96c.svg"); } em[data-emoji=":cucumber:"]::before, em[data-emoji="cucumber"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f952.svg"); } em[data-emoji=":hot_pepper:"]::before, em[data-emoji="hot_pepper"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f336.svg"); } em[data-emoji=":bell_pepper:"]::before, em[data-emoji="bell_pepper"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad1.svg"); } em[data-emoji=":corn:"]::before, em[data-emoji="corn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f33d.svg"); } em[data-emoji=":carrot:"]::before, em[data-emoji="carrot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f955.svg"); } em[data-emoji=":olive:"]::before, em[data-emoji="olive"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad2.svg"); } em[data-emoji=":garlic:"]::before, em[data-emoji="garlic"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c4.svg"); } em[data-emoji=":onion:"]::before, em[data-emoji="onion"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c5.svg"); } em[data-emoji=":potato:"]::before, em[data-emoji="potato"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f954.svg"); } em[data-emoji=":sweet_potato:"]::before, em[data-emoji="sweet_potato"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f360.svg"); } em[data-emoji=":ginger_root:"]::before, em[data-emoji="ginger_root"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fada.svg"); } em[data-emoji=":croissant:"]::before, em[data-emoji="croissant"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f950.svg"); } em[data-emoji=":bagel:"]::before, em[data-emoji="bagel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96f.svg"); } em[data-emoji=":bread:"]::before, em[data-emoji="bread"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35e.svg"); } em[data-emoji=":french_bread:"]::before, em[data-emoji="french_bread"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f956.svg"); } em[data-emoji=":pretzel:"]::before, em[data-emoji="pretzel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f968.svg"); } em[data-emoji=":cheese:"]::before, em[data-emoji="cheese"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c0.svg"); } em[data-emoji=":egg:"]::before, em[data-emoji="egg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95a.svg"); } em[data-emoji=":cooking:"]::before, em[data-emoji="cooking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f373.svg"); } em[data-emoji=":butter:"]::before, em[data-emoji="butter"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c8.svg"); } em[data-emoji=":pancakes:"]::before, em[data-emoji="pancakes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95e.svg"); } em[data-emoji=":waffle:"]::before, em[data-emoji="waffle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c7.svg"); } em[data-emoji=":bacon:"]::before, em[data-emoji="bacon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f953.svg"); } em[data-emoji=":cut_of_meat:"]::before, em[data-emoji="cut_of_meat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f969.svg"); } em[data-emoji=":poultry_leg:"]::before, em[data-emoji="poultry_leg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f357.svg"); } em[data-emoji=":meat_on_bone:"]::before, em[data-emoji="meat_on_bone"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f356.svg"); } em[data-emoji=":bone:"]::before, em[data-emoji="bone"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9b4.svg"); } em[data-emoji=":hotdog:"]::before, em[data-emoji="hotdog"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32d.svg"); } em[data-emoji=":hamburger:"]::before, em[data-emoji="hamburger"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f354.svg"); } em[data-emoji=":fries:"]::before, em[data-emoji="fries"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35f.svg"); } em[data-emoji=":pizza:"]::before, em[data-emoji="pizza"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f355.svg"); } em[data-emoji=":flatbread:"]::before, em[data-emoji="flatbread"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad3.svg"); } em[data-emoji=":sandwich:"]::before, em[data-emoji="sandwich"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96a.svg"); } em[data-emoji=":stuffed_flatbread:"]::before, em[data-emoji="stuffed_flatbread"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f959.svg"); } em[data-emoji=":falafel:"]::before, em[data-emoji="falafel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c6.svg"); } em[data-emoji=":taco:"]::before, em[data-emoji="taco"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32e.svg"); } em[data-emoji=":burrito:"]::before, em[data-emoji="burrito"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f32f.svg"); } em[data-emoji=":tamale:"]::before, em[data-emoji="tamale"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad4.svg"); } em[data-emoji=":salad:"]::before, em[data-emoji="salad"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f957.svg"); } em[data-emoji=":shallow_pan_of_food:"]::before, em[data-emoji="shallow_pan_of_food"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f958.svg"); } em[data-emoji=":fondue:"]::before, em[data-emoji="fondue"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad5.svg"); } em[data-emoji=":canned_food:"]::before, em[data-emoji="canned_food"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96b.svg"); } em[data-emoji=":jar:"]::before, em[data-emoji="jar"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad9.svg"); } em[data-emoji=":spaghetti:"]::before, em[data-emoji="spaghetti"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35d.svg"); } em[data-emoji=":ramen:"]::before, em[data-emoji="ramen"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35c.svg"); } em[data-emoji=":stew:"]::before, em[data-emoji="stew"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f372.svg"); } em[data-emoji=":curry:"]::before, em[data-emoji="curry"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35b.svg"); } em[data-emoji=":sushi:"]::before, em[data-emoji="sushi"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f363.svg"); } em[data-emoji=":bento:"]::before, em[data-emoji="bento"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f371.svg"); } em[data-emoji=":dumpling:"]::before, em[data-emoji="dumpling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95f.svg"); } em[data-emoji=":oyster:"]::before, em[data-emoji="oyster"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9aa.svg"); } em[data-emoji=":fried_shrimp:"]::before, em[data-emoji="fried_shrimp"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f364.svg"); } em[data-emoji=":rice_ball:"]::before, em[data-emoji="rice_ball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f359.svg"); } em[data-emoji=":rice:"]::before, em[data-emoji="rice"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f35a.svg"); } em[data-emoji=":rice_cracker:"]::before, em[data-emoji="rice_cracker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f358.svg"); } em[data-emoji=":fish_cake:"]::before, em[data-emoji="fish_cake"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f365.svg"); } em[data-emoji=":fortune_cookie:"]::before, em[data-emoji="fortune_cookie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f960.svg"); } em[data-emoji=":moon_cake:"]::before, em[data-emoji="moon_cake"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f96e.svg"); } em[data-emoji=":oden:"]::before, em[data-emoji="oden"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f362.svg"); } em[data-emoji=":dango:"]::before, em[data-emoji="dango"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f361.svg"); } em[data-emoji=":shaved_ice:"]::before, em[data-emoji="shaved_ice"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f367.svg"); } em[data-emoji=":ice_cream:"]::before, em[data-emoji="ice_cream"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f368.svg"); } em[data-emoji=":icecream:"]::before, em[data-emoji="icecream"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f366.svg"); } em[data-emoji=":pie:"]::before, em[data-emoji="pie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f967.svg"); } em[data-emoji=":cupcake:"]::before, em[data-emoji="cupcake"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c1.svg"); } em[data-emoji=":cake:"]::before, em[data-emoji="cake"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f370.svg"); } em[data-emoji=":birthday:"]::before, em[data-emoji="birthday"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f382.svg"); } em[data-emoji=":custard:"]::before, em[data-emoji="custard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36e.svg"); } em[data-emoji=":lollipop:"]::before, em[data-emoji="lollipop"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36d.svg"); } em[data-emoji=":candy:"]::before, em[data-emoji="candy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36c.svg"); } em[data-emoji=":chocolate_bar:"]::before, em[data-emoji="chocolate_bar"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36b.svg"); } em[data-emoji=":popcorn:"]::before, em[data-emoji="popcorn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37f.svg"); } em[data-emoji=":doughnut:"]::before, em[data-emoji="doughnut"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f369.svg"); } em[data-emoji=":cookie:"]::before, em[data-emoji="cookie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36a.svg"); } em[data-emoji=":chestnut:"]::before, em[data-emoji="chestnut"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f330.svg"); } em[data-emoji=":peanuts:"]::before, em[data-emoji="peanuts"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95c.svg"); } em[data-emoji=":beans:"]::before, em[data-emoji="beans"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad8.svg"); } em[data-emoji=":honey_pot:"]::before, em[data-emoji="honey_pot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f36f.svg"); } em[data-emoji=":milk:"]::before, em[data-emoji="milk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f95b.svg"); } em[data-emoji=":pouring_liquid:"]::before, em[data-emoji="pouring_liquid"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad7.svg"); } em[data-emoji=":baby_bottle:"]::before, em[data-emoji="baby_bottle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37c.svg"); } em[data-emoji=":teapot:"]::before, em[data-emoji="teapot"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fad6.svg"); } em[data-emoji=":tea:"]::before, em[data-emoji="tea"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f375.svg"); } em[data-emoji=":mate:"]::before, em[data-emoji="mate"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c9.svg"); } em[data-emoji=":beverage_box:"]::before, em[data-emoji="beverage_box"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c3.svg"); } em[data-emoji=":cup_with_straw:"]::before, em[data-emoji="cup_with_straw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f964.svg"); } em[data-emoji=":bubble_tea:"]::before, em[data-emoji="bubble_tea"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9cb.svg"); } em[data-emoji=":sake:"]::before, em[data-emoji="sake"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f376.svg"); } em[data-emoji=":beer:"]::before, em[data-emoji="beer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37a.svg"); } em[data-emoji=":beers:"]::before, em[data-emoji="beers"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37b.svg"); } em[data-emoji=":champagne_glass:"]::before, em[data-emoji="champagne_glass"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f942.svg"); } em[data-emoji=":wine_glass:"]::before, em[data-emoji="wine_glass"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f377.svg"); } em[data-emoji=":tumbler_glass:"]::before, em[data-emoji="tumbler_glass"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f943.svg"); } em[data-emoji=":cocktail:"]::before, em[data-emoji="cocktail"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f378.svg"); } em[data-emoji=":tropical_drink:"]::before, em[data-emoji="tropical_drink"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f379.svg"); } em[data-emoji=":champagne:"]::before, em[data-emoji="champagne"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37e.svg"); } em[data-emoji=":ice_cube:"]::before, em[data-emoji="ice_cube"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ca.svg"); } em[data-emoji=":spoon:"]::before, em[data-emoji="spoon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f944.svg"); } em[data-emoji=":fork_and_knife:"]::before, em[data-emoji="fork_and_knife"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f374.svg"); } em[data-emoji=":fork_knife_plate:"]::before, em[data-emoji="fork_knife_plate"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f37d.svg"); } em[data-emoji=":bowl_with_spoon:"]::before, em[data-emoji="bowl_with_spoon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f963.svg"); } em[data-emoji=":takeout_box:"]::before, em[data-emoji="takeout_box"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f961.svg"); } em[data-emoji=":chopsticks:"]::before, em[data-emoji="chopsticks"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f962.svg"); } em[data-emoji=":salt:"]::before, em[data-emoji="salt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9c2.svg"); } em[data-emoji=":soccer:"]::before, em[data-emoji="soccer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26bd.svg"); } em[data-emoji=":basketball:"]::before, em[data-emoji="basketball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c0.svg"); } em[data-emoji=":football:"]::before, em[data-emoji="football"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c8.svg"); } em[data-emoji=":baseball:"]::before, em[data-emoji="baseball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26be.svg"); } em[data-emoji=":softball:"]::before, em[data-emoji="softball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94e.svg"); } em[data-emoji=":tennis:"]::before, em[data-emoji="tennis"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3be.svg"); } em[data-emoji=":volleyball:"]::before, em[data-emoji="volleyball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d0.svg"); } em[data-emoji=":rugby_football:"]::before, em[data-emoji="rugby_football"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c9.svg"); } em[data-emoji=":flying_disc:"]::before, em[data-emoji="flying_disc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94f.svg"); } em[data-emoji=":8ball:"]::before, em[data-emoji="8ball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b1.svg"); } em[data-emoji=":yo_yo:"]::before, em[data-emoji="yo_yo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa80.svg"); } em[data-emoji=":ping_pong:"]::before, em[data-emoji="ping_pong"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d3.svg"); } em[data-emoji=":badminton:"]::before, em[data-emoji="badminton"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f8.svg"); } em[data-emoji=":hockey:"]::before, em[data-emoji="hockey"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d2.svg"); } em[data-emoji=":field_hockey:"]::before, em[data-emoji="field_hockey"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d1.svg"); } em[data-emoji=":lacrosse:"]::before, em[data-emoji="lacrosse"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94d.svg"); } em[data-emoji=":cricket_game:"]::before, em[data-emoji="cricket_game"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cf.svg"); } em[data-emoji=":boomerang:"]::before, em[data-emoji="boomerang"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa83.svg"); } em[data-emoji=":goal:"]::before, em[data-emoji="goal"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f945.svg"); } em[data-emoji=":golf:"]::before, em[data-emoji="golf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f3.svg"); } em[data-emoji=":kite:"]::before, em[data-emoji="kite"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa81.svg"); } em[data-emoji=":playground_slide:"]::before, em[data-emoji="playground_slide"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6dd.svg"); } em[data-emoji=":bow_and_arrow:"]::before, em[data-emoji="bow_and_arrow"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f9.svg"); } em[data-emoji=":fishing_pole_and_fish:"]::before, em[data-emoji="fishing_pole_and_fish"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a3.svg"); } em[data-emoji=":diving_mask:"]::before, em[data-emoji="diving_mask"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93f.svg"); } em[data-emoji=":boxing_glove:"]::before, em[data-emoji="boxing_glove"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94a.svg"); } em[data-emoji=":martial_arts_uniform:"]::before, em[data-emoji="martial_arts_uniform"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94b.svg"); } em[data-emoji=":running_shirt_with_sash:"]::before, em[data-emoji="running_shirt_with_sash"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3bd.svg"); } em[data-emoji=":skateboard:"]::before, em[data-emoji="skateboard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f9.svg"); } em[data-emoji=":roller_skate:"]::before, em[data-emoji="roller_skate"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6fc.svg"); } em[data-emoji=":sled:"]::before, em[data-emoji="sled"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f7.svg"); } em[data-emoji=":ice_skate:"]::before, em[data-emoji="ice_skate"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f8.svg"); } em[data-emoji=":curling_stone:"]::before, em[data-emoji="curling_stone"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f94c.svg"); } em[data-emoji=":ski:"]::before, em[data-emoji="ski"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3bf.svg"); } em[data-emoji=":skier:"]::before, em[data-emoji="skier"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f7.svg"); } em[data-emoji=":snowboarder:"]::before, em[data-emoji="snowboarder"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2.svg"); } em[data-emoji=":snowboarder_tone1:"]::before, em[data-emoji="snowboarder_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2-1f3fb.svg"); } em[data-emoji=":snowboarder_tone2:"]::before, em[data-emoji="snowboarder_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2-1f3fc.svg"); } em[data-emoji=":snowboarder_tone3:"]::before, em[data-emoji="snowboarder_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2-1f3fd.svg"); } em[data-emoji=":snowboarder_tone4:"]::before, em[data-emoji="snowboarder_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2-1f3fe.svg"); } em[data-emoji=":snowboarder_tone5:"]::before, em[data-emoji="snowboarder_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c2-1f3ff.svg"); } em[data-emoji=":parachute:"]::before, em[data-emoji="parachute"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa82.svg"); } em[data-emoji=":person_lifting_weights:"]::before, em[data-emoji="person_lifting_weights"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb.svg"); } em[data-emoji=":person_lifting_weights_tone1:"]::before, em[data-emoji="person_lifting_weights_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fb.svg"); } em[data-emoji=":person_lifting_weights_tone2:"]::before, em[data-emoji="person_lifting_weights_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fc.svg"); } em[data-emoji=":person_lifting_weights_tone3:"]::before, em[data-emoji="person_lifting_weights_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fd.svg"); } em[data-emoji=":person_lifting_weights_tone4:"]::before, em[data-emoji="person_lifting_weights_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fe.svg"); } em[data-emoji=":person_lifting_weights_tone5:"]::before, em[data-emoji="person_lifting_weights_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3ff.svg"); } em[data-emoji=":woman_lifting_weights:"]::before, em[data-emoji="woman_lifting_weights"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-fe0f-200d-2640-fe0f.svg"); } em[data-emoji=":woman_lifting_weights_tone1:"]::before, em[data-emoji="woman_lifting_weights_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_lifting_weights_tone2:"]::before, em[data-emoji="woman_lifting_weights_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_lifting_weights_tone3:"]::before, em[data-emoji="woman_lifting_weights_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_lifting_weights_tone4:"]::before, em[data-emoji="woman_lifting_weights_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_lifting_weights_tone5:"]::before, em[data-emoji="woman_lifting_weights_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_lifting_weights:"]::before, em[data-emoji="man_lifting_weights"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-fe0f-200d-2642-fe0f.svg"); } em[data-emoji=":man_lifting_weights_tone1:"]::before, em[data-emoji="man_lifting_weights_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_lifting_weights_tone2:"]::before, em[data-emoji="man_lifting_weights_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_lifting_weights_tone3:"]::before, em[data-emoji="man_lifting_weights_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_lifting_weights_tone4:"]::before, em[data-emoji="man_lifting_weights_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_lifting_weights_tone5:"]::before, em[data-emoji="man_lifting_weights_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cb-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":people_wrestling:"]::before, em[data-emoji="people_wrestling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93c.svg"); } em[data-emoji=":women_wrestling:"]::before, em[data-emoji="women_wrestling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93c-200d-2640-fe0f.svg"); } em[data-emoji=":men_wrestling:"]::before, em[data-emoji="men_wrestling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93c-200d-2642-fe0f.svg"); } em[data-emoji=":person_doing_cartwheel:"]::before, em[data-emoji="person_doing_cartwheel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938.svg"); } em[data-emoji=":person_doing_cartwheel_tone1:"]::before, em[data-emoji="person_doing_cartwheel_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fb.svg"); } em[data-emoji=":person_doing_cartwheel_tone2:"]::before, em[data-emoji="person_doing_cartwheel_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fc.svg"); } em[data-emoji=":person_doing_cartwheel_tone3:"]::before, em[data-emoji="person_doing_cartwheel_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fd.svg"); } em[data-emoji=":person_doing_cartwheel_tone4:"]::before, em[data-emoji="person_doing_cartwheel_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fe.svg"); } em[data-emoji=":person_doing_cartwheel_tone5:"]::before, em[data-emoji="person_doing_cartwheel_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3ff.svg"); } em[data-emoji=":woman_cartwheeling:"]::before, em[data-emoji="woman_cartwheeling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-200d-2640-fe0f.svg"); } em[data-emoji=":woman_cartwheeling_tone1:"]::before, em[data-emoji="woman_cartwheeling_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_cartwheeling_tone2:"]::before, em[data-emoji="woman_cartwheeling_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_cartwheeling_tone3:"]::before, em[data-emoji="woman_cartwheeling_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_cartwheeling_tone4:"]::before, em[data-emoji="woman_cartwheeling_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_cartwheeling_tone5:"]::before, em[data-emoji="woman_cartwheeling_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_cartwheeling:"]::before, em[data-emoji="man_cartwheeling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-200d-2642-fe0f.svg"); } em[data-emoji=":man_cartwheeling_tone1:"]::before, em[data-emoji="man_cartwheeling_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_cartwheeling_tone2:"]::before, em[data-emoji="man_cartwheeling_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_cartwheeling_tone3:"]::before, em[data-emoji="man_cartwheeling_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_cartwheeling_tone4:"]::before, em[data-emoji="man_cartwheeling_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_cartwheeling_tone5:"]::before, em[data-emoji="man_cartwheeling_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f938-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_bouncing_ball:"]::before, em[data-emoji="person_bouncing_ball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9.svg"); } em[data-emoji=":person_bouncing_ball_tone1:"]::before, em[data-emoji="person_bouncing_ball_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fb.svg"); } em[data-emoji=":person_bouncing_ball_tone2:"]::before, em[data-emoji="person_bouncing_ball_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fc.svg"); } em[data-emoji=":person_bouncing_ball_tone3:"]::before, em[data-emoji="person_bouncing_ball_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fd.svg"); } em[data-emoji=":person_bouncing_ball_tone4:"]::before, em[data-emoji="person_bouncing_ball_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fe.svg"); } em[data-emoji=":person_bouncing_ball_tone5:"]::before, em[data-emoji="person_bouncing_ball_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3ff.svg"); } em[data-emoji=":woman_bouncing_ball:"]::before, em[data-emoji="woman_bouncing_ball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-fe0f-200d-2640-fe0f.svg"); } em[data-emoji=":woman_bouncing_ball_tone1:"]::before, em[data-emoji="woman_bouncing_ball_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_bouncing_ball_tone2:"]::before, em[data-emoji="woman_bouncing_ball_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_bouncing_ball_tone3:"]::before, em[data-emoji="woman_bouncing_ball_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_bouncing_ball_tone4:"]::before, em[data-emoji="woman_bouncing_ball_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_bouncing_ball_tone5:"]::before, em[data-emoji="woman_bouncing_ball_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_bouncing_ball:"]::before, em[data-emoji="man_bouncing_ball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-fe0f-200d-2642-fe0f.svg"); } em[data-emoji=":man_bouncing_ball_tone1:"]::before, em[data-emoji="man_bouncing_ball_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_bouncing_ball_tone2:"]::before, em[data-emoji="man_bouncing_ball_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_bouncing_ball_tone3:"]::before, em[data-emoji="man_bouncing_ball_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_bouncing_ball_tone4:"]::before, em[data-emoji="man_bouncing_ball_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_bouncing_ball_tone5:"]::before, em[data-emoji="man_bouncing_ball_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f9-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_fencing:"]::before, em[data-emoji="person_fencing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93a.svg"); } em[data-emoji=":person_playing_handball:"]::before, em[data-emoji="person_playing_handball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e.svg"); } em[data-emoji=":person_playing_handball_tone1:"]::before, em[data-emoji="person_playing_handball_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fb.svg"); } em[data-emoji=":person_playing_handball_tone2:"]::before, em[data-emoji="person_playing_handball_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fc.svg"); } em[data-emoji=":person_playing_handball_tone3:"]::before, em[data-emoji="person_playing_handball_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fd.svg"); } em[data-emoji=":person_playing_handball_tone4:"]::before, em[data-emoji="person_playing_handball_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fe.svg"); } em[data-emoji=":person_playing_handball_tone5:"]::before, em[data-emoji="person_playing_handball_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3ff.svg"); } em[data-emoji=":woman_playing_handball:"]::before, em[data-emoji="woman_playing_handball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-200d-2640-fe0f.svg"); } em[data-emoji=":woman_playing_handball_tone1:"]::before, em[data-emoji="woman_playing_handball_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_playing_handball_tone2:"]::before, em[data-emoji="woman_playing_handball_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_playing_handball_tone3:"]::before, em[data-emoji="woman_playing_handball_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_playing_handball_tone4:"]::before, em[data-emoji="woman_playing_handball_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_playing_handball_tone5:"]::before, em[data-emoji="woman_playing_handball_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_playing_handball:"]::before, em[data-emoji="man_playing_handball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-200d-2642-fe0f.svg"); } em[data-emoji=":man_playing_handball_tone1:"]::before, em[data-emoji="man_playing_handball_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_playing_handball_tone2:"]::before, em[data-emoji="man_playing_handball_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_playing_handball_tone3:"]::before, em[data-emoji="man_playing_handball_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_playing_handball_tone4:"]::before, em[data-emoji="man_playing_handball_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_playing_handball_tone5:"]::before, em[data-emoji="man_playing_handball_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93e-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_golfing:"]::before, em[data-emoji="person_golfing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc.svg"); } em[data-emoji=":person_golfing_tone1:"]::before, em[data-emoji="person_golfing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fb.svg"); } em[data-emoji=":person_golfing_tone2:"]::before, em[data-emoji="person_golfing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fc.svg"); } em[data-emoji=":person_golfing_tone3:"]::before, em[data-emoji="person_golfing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fd.svg"); } em[data-emoji=":person_golfing_tone4:"]::before, em[data-emoji="person_golfing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fe.svg"); } em[data-emoji=":person_golfing_tone5:"]::before, em[data-emoji="person_golfing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3ff.svg"); } em[data-emoji=":woman_golfing:"]::before, em[data-emoji="woman_golfing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-fe0f-200d-2640-fe0f.svg"); } em[data-emoji=":woman_golfing_tone1:"]::before, em[data-emoji="woman_golfing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_golfing_tone2:"]::before, em[data-emoji="woman_golfing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_golfing_tone3:"]::before, em[data-emoji="woman_golfing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_golfing_tone4:"]::before, em[data-emoji="woman_golfing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_golfing_tone5:"]::before, em[data-emoji="woman_golfing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_golfing:"]::before, em[data-emoji="man_golfing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-fe0f-200d-2642-fe0f.svg"); } em[data-emoji=":man_golfing_tone1:"]::before, em[data-emoji="man_golfing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_golfing_tone2:"]::before, em[data-emoji="man_golfing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_golfing_tone3:"]::before, em[data-emoji="man_golfing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_golfing_tone4:"]::before, em[data-emoji="man_golfing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_golfing_tone5:"]::before, em[data-emoji="man_golfing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cc-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":horse_racing:"]::before, em[data-emoji="horse_racing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7.svg"); } em[data-emoji=":horse_racing_tone1:"]::before, em[data-emoji="horse_racing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7-1f3fb.svg"); } em[data-emoji=":horse_racing_tone2:"]::before, em[data-emoji="horse_racing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7-1f3fc.svg"); } em[data-emoji=":horse_racing_tone3:"]::before, em[data-emoji="horse_racing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7-1f3fd.svg"); } em[data-emoji=":horse_racing_tone4:"]::before, em[data-emoji="horse_racing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7-1f3fe.svg"); } em[data-emoji=":horse_racing_tone5:"]::before, em[data-emoji="horse_racing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c7-1f3ff.svg"); } em[data-emoji=":person_in_lotus_position:"]::before, em[data-emoji="person_in_lotus_position"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8.svg"); } em[data-emoji=":person_in_lotus_position_tone1:"]::before, em[data-emoji="person_in_lotus_position_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fb.svg"); } em[data-emoji=":person_in_lotus_position_tone2:"]::before, em[data-emoji="person_in_lotus_position_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fc.svg"); } em[data-emoji=":person_in_lotus_position_tone3:"]::before, em[data-emoji="person_in_lotus_position_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fd.svg"); } em[data-emoji=":person_in_lotus_position_tone4:"]::before, em[data-emoji="person_in_lotus_position_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fe.svg"); } em[data-emoji=":person_in_lotus_position_tone5:"]::before, em[data-emoji="person_in_lotus_position_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3ff.svg"); } em[data-emoji=":woman_in_lotus_position:"]::before, em[data-emoji="woman_in_lotus_position"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_lotus_position_tone1:"]::before, em[data-emoji="woman_in_lotus_position_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_lotus_position_tone2:"]::before, em[data-emoji="woman_in_lotus_position_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_lotus_position_tone3:"]::before, em[data-emoji="woman_in_lotus_position_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_lotus_position_tone4:"]::before, em[data-emoji="woman_in_lotus_position_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_in_lotus_position_tone5:"]::before, em[data-emoji="woman_in_lotus_position_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_in_lotus_position:"]::before, em[data-emoji="man_in_lotus_position"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_lotus_position_tone1:"]::before, em[data-emoji="man_in_lotus_position_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_lotus_position_tone2:"]::before, em[data-emoji="man_in_lotus_position_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_lotus_position_tone3:"]::before, em[data-emoji="man_in_lotus_position_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_lotus_position_tone4:"]::before, em[data-emoji="man_in_lotus_position_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_in_lotus_position_tone5:"]::before, em[data-emoji="man_in_lotus_position_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d8-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_surfing:"]::before, em[data-emoji="person_surfing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4.svg"); } em[data-emoji=":person_surfing_tone1:"]::before, em[data-emoji="person_surfing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fb.svg"); } em[data-emoji=":person_surfing_tone2:"]::before, em[data-emoji="person_surfing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fc.svg"); } em[data-emoji=":person_surfing_tone3:"]::before, em[data-emoji="person_surfing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fd.svg"); } em[data-emoji=":person_surfing_tone4:"]::before, em[data-emoji="person_surfing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fe.svg"); } em[data-emoji=":person_surfing_tone5:"]::before, em[data-emoji="person_surfing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3ff.svg"); } em[data-emoji=":woman_surfing:"]::before, em[data-emoji="woman_surfing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-200d-2640-fe0f.svg"); } em[data-emoji=":woman_surfing_tone1:"]::before, em[data-emoji="woman_surfing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_surfing_tone2:"]::before, em[data-emoji="woman_surfing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_surfing_tone3:"]::before, em[data-emoji="woman_surfing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_surfing_tone4:"]::before, em[data-emoji="woman_surfing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_surfing_tone5:"]::before, em[data-emoji="woman_surfing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_surfing:"]::before, em[data-emoji="man_surfing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-200d-2642-fe0f.svg"); } em[data-emoji=":man_surfing_tone1:"]::before, em[data-emoji="man_surfing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_surfing_tone2:"]::before, em[data-emoji="man_surfing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_surfing_tone3:"]::before, em[data-emoji="man_surfing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_surfing_tone4:"]::before, em[data-emoji="man_surfing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_surfing_tone5:"]::before, em[data-emoji="man_surfing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c4-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_swimming:"]::before, em[data-emoji="person_swimming"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca.svg"); } em[data-emoji=":person_swimming_tone1:"]::before, em[data-emoji="person_swimming_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fb.svg"); } em[data-emoji=":person_swimming_tone2:"]::before, em[data-emoji="person_swimming_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fc.svg"); } em[data-emoji=":person_swimming_tone3:"]::before, em[data-emoji="person_swimming_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fd.svg"); } em[data-emoji=":person_swimming_tone4:"]::before, em[data-emoji="person_swimming_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fe.svg"); } em[data-emoji=":person_swimming_tone5:"]::before, em[data-emoji="person_swimming_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3ff.svg"); } em[data-emoji=":woman_swimming:"]::before, em[data-emoji="woman_swimming"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-200d-2640-fe0f.svg"); } em[data-emoji=":woman_swimming_tone1:"]::before, em[data-emoji="woman_swimming_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_swimming_tone2:"]::before, em[data-emoji="woman_swimming_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_swimming_tone3:"]::before, em[data-emoji="woman_swimming_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_swimming_tone4:"]::before, em[data-emoji="woman_swimming_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_swimming_tone5:"]::before, em[data-emoji="woman_swimming_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_swimming:"]::before, em[data-emoji="man_swimming"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-200d-2642-fe0f.svg"); } em[data-emoji=":man_swimming_tone1:"]::before, em[data-emoji="man_swimming_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_swimming_tone2:"]::before, em[data-emoji="man_swimming_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_swimming_tone3:"]::before, em[data-emoji="man_swimming_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_swimming_tone4:"]::before, em[data-emoji="man_swimming_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_swimming_tone5:"]::before, em[data-emoji="man_swimming_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ca-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_playing_water_polo:"]::before, em[data-emoji="person_playing_water_polo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d.svg"); } em[data-emoji=":person_playing_water_polo_tone1:"]::before, em[data-emoji="person_playing_water_polo_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fb.svg"); } em[data-emoji=":person_playing_water_polo_tone2:"]::before, em[data-emoji="person_playing_water_polo_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fc.svg"); } em[data-emoji=":person_playing_water_polo_tone3:"]::before, em[data-emoji="person_playing_water_polo_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fd.svg"); } em[data-emoji=":person_playing_water_polo_tone4:"]::before, em[data-emoji="person_playing_water_polo_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fe.svg"); } em[data-emoji=":person_playing_water_polo_tone5:"]::before, em[data-emoji="person_playing_water_polo_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3ff.svg"); } em[data-emoji=":woman_playing_water_polo:"]::before, em[data-emoji="woman_playing_water_polo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-200d-2640-fe0f.svg"); } em[data-emoji=":woman_playing_water_polo_tone1:"]::before, em[data-emoji="woman_playing_water_polo_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_playing_water_polo_tone2:"]::before, em[data-emoji="woman_playing_water_polo_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_playing_water_polo_tone3:"]::before, em[data-emoji="woman_playing_water_polo_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_playing_water_polo_tone4:"]::before, em[data-emoji="woman_playing_water_polo_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_playing_water_polo_tone5:"]::before, em[data-emoji="woman_playing_water_polo_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_playing_water_polo:"]::before, em[data-emoji="man_playing_water_polo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-200d-2642-fe0f.svg"); } em[data-emoji=":man_playing_water_polo_tone1:"]::before, em[data-emoji="man_playing_water_polo_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_playing_water_polo_tone2:"]::before, em[data-emoji="man_playing_water_polo_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_playing_water_polo_tone3:"]::before, em[data-emoji="man_playing_water_polo_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_playing_water_polo_tone4:"]::before, em[data-emoji="man_playing_water_polo_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_playing_water_polo_tone5:"]::before, em[data-emoji="man_playing_water_polo_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f93d-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_rowing_boat:"]::before, em[data-emoji="person_rowing_boat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3.svg"); } em[data-emoji=":person_rowing_boat_tone1:"]::before, em[data-emoji="person_rowing_boat_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fb.svg"); } em[data-emoji=":person_rowing_boat_tone2:"]::before, em[data-emoji="person_rowing_boat_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fc.svg"); } em[data-emoji=":person_rowing_boat_tone3:"]::before, em[data-emoji="person_rowing_boat_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fd.svg"); } em[data-emoji=":person_rowing_boat_tone4:"]::before, em[data-emoji="person_rowing_boat_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fe.svg"); } em[data-emoji=":person_rowing_boat_tone5:"]::before, em[data-emoji="person_rowing_boat_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3ff.svg"); } em[data-emoji=":woman_rowing_boat:"]::before, em[data-emoji="woman_rowing_boat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-200d-2640-fe0f.svg"); } em[data-emoji=":woman_rowing_boat_tone1:"]::before, em[data-emoji="woman_rowing_boat_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_rowing_boat_tone2:"]::before, em[data-emoji="woman_rowing_boat_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_rowing_boat_tone3:"]::before, em[data-emoji="woman_rowing_boat_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_rowing_boat_tone4:"]::before, em[data-emoji="woman_rowing_boat_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_rowing_boat_tone5:"]::before, em[data-emoji="woman_rowing_boat_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_rowing_boat:"]::before, em[data-emoji="man_rowing_boat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-200d-2642-fe0f.svg"); } em[data-emoji=":man_rowing_boat_tone1:"]::before, em[data-emoji="man_rowing_boat_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_rowing_boat_tone2:"]::before, em[data-emoji="man_rowing_boat_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_rowing_boat_tone3:"]::before, em[data-emoji="man_rowing_boat_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_rowing_boat_tone4:"]::before, em[data-emoji="man_rowing_boat_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_rowing_boat_tone5:"]::before, em[data-emoji="man_rowing_boat_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a3-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_climbing:"]::before, em[data-emoji="person_climbing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7.svg"); } em[data-emoji=":person_climbing_tone1:"]::before, em[data-emoji="person_climbing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fb.svg"); } em[data-emoji=":person_climbing_tone2:"]::before, em[data-emoji="person_climbing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fc.svg"); } em[data-emoji=":person_climbing_tone3:"]::before, em[data-emoji="person_climbing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fd.svg"); } em[data-emoji=":person_climbing_tone4:"]::before, em[data-emoji="person_climbing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fe.svg"); } em[data-emoji=":person_climbing_tone5:"]::before, em[data-emoji="person_climbing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3ff.svg"); } em[data-emoji=":woman_climbing:"]::before, em[data-emoji="woman_climbing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-200d-2640-fe0f.svg"); } em[data-emoji=":woman_climbing_tone1:"]::before, em[data-emoji="woman_climbing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_climbing_tone2:"]::before, em[data-emoji="woman_climbing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_climbing_tone3:"]::before, em[data-emoji="woman_climbing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_climbing_tone4:"]::before, em[data-emoji="woman_climbing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_climbing_tone5:"]::before, em[data-emoji="woman_climbing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_climbing:"]::before, em[data-emoji="man_climbing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-200d-2642-fe0f.svg"); } em[data-emoji=":man_climbing_tone1:"]::before, em[data-emoji="man_climbing_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_climbing_tone2:"]::before, em[data-emoji="man_climbing_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_climbing_tone3:"]::before, em[data-emoji="man_climbing_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_climbing_tone4:"]::before, em[data-emoji="man_climbing_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_climbing_tone5:"]::before, em[data-emoji="man_climbing_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9d7-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_mountain_biking:"]::before, em[data-emoji="person_mountain_biking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5.svg"); } em[data-emoji=":person_mountain_biking_tone1:"]::before, em[data-emoji="person_mountain_biking_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fb.svg"); } em[data-emoji=":person_mountain_biking_tone2:"]::before, em[data-emoji="person_mountain_biking_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fc.svg"); } em[data-emoji=":person_mountain_biking_tone3:"]::before, em[data-emoji="person_mountain_biking_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fd.svg"); } em[data-emoji=":person_mountain_biking_tone4:"]::before, em[data-emoji="person_mountain_biking_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fe.svg"); } em[data-emoji=":person_mountain_biking_tone5:"]::before, em[data-emoji="person_mountain_biking_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3ff.svg"); } em[data-emoji=":woman_mountain_biking:"]::before, em[data-emoji="woman_mountain_biking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-200d-2640-fe0f.svg"); } em[data-emoji=":woman_mountain_biking_tone1:"]::before, em[data-emoji="woman_mountain_biking_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_mountain_biking_tone2:"]::before, em[data-emoji="woman_mountain_biking_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_mountain_biking_tone3:"]::before, em[data-emoji="woman_mountain_biking_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_mountain_biking_tone4:"]::before, em[data-emoji="woman_mountain_biking_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_mountain_biking_tone5:"]::before, em[data-emoji="woman_mountain_biking_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_mountain_biking:"]::before, em[data-emoji="man_mountain_biking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-200d-2642-fe0f.svg"); } em[data-emoji=":man_mountain_biking_tone1:"]::before, em[data-emoji="man_mountain_biking_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_mountain_biking_tone2:"]::before, em[data-emoji="man_mountain_biking_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_mountain_biking_tone3:"]::before, em[data-emoji="man_mountain_biking_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_mountain_biking_tone4:"]::before, em[data-emoji="man_mountain_biking_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_mountain_biking_tone5:"]::before, em[data-emoji="man_mountain_biking_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b5-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":person_biking:"]::before, em[data-emoji="person_biking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4.svg"); } em[data-emoji=":person_biking_tone1:"]::before, em[data-emoji="person_biking_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fb.svg"); } em[data-emoji=":person_biking_tone2:"]::before, em[data-emoji="person_biking_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fc.svg"); } em[data-emoji=":person_biking_tone3:"]::before, em[data-emoji="person_biking_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fd.svg"); } em[data-emoji=":person_biking_tone4:"]::before, em[data-emoji="person_biking_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fe.svg"); } em[data-emoji=":person_biking_tone5:"]::before, em[data-emoji="person_biking_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3ff.svg"); } em[data-emoji=":woman_biking:"]::before, em[data-emoji="woman_biking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-200d-2640-fe0f.svg"); } em[data-emoji=":woman_biking_tone1:"]::before, em[data-emoji="woman_biking_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_biking_tone2:"]::before, em[data-emoji="woman_biking_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_biking_tone3:"]::before, em[data-emoji="woman_biking_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_biking_tone4:"]::before, em[data-emoji="woman_biking_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_biking_tone5:"]::before, em[data-emoji="woman_biking_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_biking:"]::before, em[data-emoji="man_biking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-200d-2642-fe0f.svg"); } em[data-emoji=":man_biking_tone1:"]::before, em[data-emoji="man_biking_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_biking_tone2:"]::before, em[data-emoji="man_biking_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_biking_tone3:"]::before, em[data-emoji="man_biking_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_biking_tone4:"]::before, em[data-emoji="man_biking_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_biking_tone5:"]::before, em[data-emoji="man_biking_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b4-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":trophy:"]::before, em[data-emoji="trophy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c6.svg"); } em[data-emoji=":first_place:"]::before, em[data-emoji="first_place"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f947.svg"); } em[data-emoji=":second_place:"]::before, em[data-emoji="second_place"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f948.svg"); } em[data-emoji=":third_place:"]::before, em[data-emoji="third_place"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f949.svg"); } em[data-emoji=":medal:"]::before, em[data-emoji="medal"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c5.svg"); } em[data-emoji=":military_medal:"]::before, em[data-emoji="military_medal"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f396.svg"); } em[data-emoji=":rosette:"]::before, em[data-emoji="rosette"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f5.svg"); } em[data-emoji=":reminder_ribbon:"]::before, em[data-emoji="reminder_ribbon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f397.svg"); } em[data-emoji=":ticket:"]::before, em[data-emoji="ticket"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ab.svg"); } em[data-emoji=":tickets:"]::before, em[data-emoji="tickets"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f39f.svg"); } em[data-emoji=":circus_tent:"]::before, em[data-emoji="circus_tent"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3aa.svg"); } em[data-emoji=":person_juggling:"]::before, em[data-emoji="person_juggling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939.svg"); } em[data-emoji=":person_juggling_tone1:"]::before, em[data-emoji="person_juggling_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fb.svg"); } em[data-emoji=":person_juggling_tone2:"]::before, em[data-emoji="person_juggling_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fc.svg"); } em[data-emoji=":person_juggling_tone3:"]::before, em[data-emoji="person_juggling_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fd.svg"); } em[data-emoji=":person_juggling_tone4:"]::before, em[data-emoji="person_juggling_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fe.svg"); } em[data-emoji=":person_juggling_tone5:"]::before, em[data-emoji="person_juggling_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3ff.svg"); } em[data-emoji=":woman_juggling:"]::before, em[data-emoji="woman_juggling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-200d-2640-fe0f.svg"); } em[data-emoji=":woman_juggling_tone1:"]::before, em[data-emoji="woman_juggling_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fb-200d-2640-fe0f.svg"); } em[data-emoji=":woman_juggling_tone2:"]::before, em[data-emoji="woman_juggling_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fc-200d-2640-fe0f.svg"); } em[data-emoji=":woman_juggling_tone3:"]::before, em[data-emoji="woman_juggling_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fd-200d-2640-fe0f.svg"); } em[data-emoji=":woman_juggling_tone4:"]::before, em[data-emoji="woman_juggling_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fe-200d-2640-fe0f.svg"); } em[data-emoji=":woman_juggling_tone5:"]::before, em[data-emoji="woman_juggling_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3ff-200d-2640-fe0f.svg"); } em[data-emoji=":man_juggling:"]::before, em[data-emoji="man_juggling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-200d-2642-fe0f.svg"); } em[data-emoji=":man_juggling_tone1:"]::before, em[data-emoji="man_juggling_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fb-200d-2642-fe0f.svg"); } em[data-emoji=":man_juggling_tone2:"]::before, em[data-emoji="man_juggling_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fc-200d-2642-fe0f.svg"); } em[data-emoji=":man_juggling_tone3:"]::before, em[data-emoji="man_juggling_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fd-200d-2642-fe0f.svg"); } em[data-emoji=":man_juggling_tone4:"]::before, em[data-emoji="man_juggling_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3fe-200d-2642-fe0f.svg"); } em[data-emoji=":man_juggling_tone5:"]::before, em[data-emoji="man_juggling_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f939-1f3ff-200d-2642-fe0f.svg"); } em[data-emoji=":performing_arts:"]::before, em[data-emoji="performing_arts"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ad.svg"); } em[data-emoji=":ballet_shoes:"]::before, em[data-emoji="ballet_shoes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa70.svg"); } em[data-emoji=":art:"]::before, em[data-emoji="art"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a8.svg"); } em[data-emoji=":clapper:"]::before, em[data-emoji="clapper"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ac.svg"); } em[data-emoji=":microphone:"]::before, em[data-emoji="microphone"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a4.svg"); } em[data-emoji=":headphones:"]::before, em[data-emoji="headphones"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a7.svg"); } em[data-emoji=":musical_score:"]::before, em[data-emoji="musical_score"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3bc.svg"); } em[data-emoji=":musical_keyboard:"]::before, em[data-emoji="musical_keyboard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b9.svg"); } em[data-emoji=":maracas:"]::before, em[data-emoji="maracas"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa87.svg"); } em[data-emoji=":drum:"]::before, em[data-emoji="drum"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f941.svg"); } em[data-emoji=":long_drum:"]::before, em[data-emoji="long_drum"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa98.svg"); } em[data-emoji=":saxophone:"]::before, em[data-emoji="saxophone"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b7.svg"); } em[data-emoji=":trumpet:"]::before, em[data-emoji="trumpet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ba.svg"); } em[data-emoji=":accordion:"]::before, em[data-emoji="accordion"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa97.svg"); } em[data-emoji=":guitar:"]::before, em[data-emoji="guitar"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b8.svg"); } em[data-emoji=":banjo:"]::before, em[data-emoji="banjo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa95.svg"); } em[data-emoji=":violin:"]::before, em[data-emoji="violin"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3bb.svg"); } em[data-emoji=":flute:"]::before, em[data-emoji="flute"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa88.svg"); } em[data-emoji=":game_die:"]::before, em[data-emoji="game_die"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b2.svg"); } em[data-emoji=":chess_pawn:"]::before, em[data-emoji="chess_pawn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/265f.svg"); } em[data-emoji=":dart:"]::before, em[data-emoji="dart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3af.svg"); } em[data-emoji=":bowling:"]::before, em[data-emoji="bowling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b3.svg"); } em[data-emoji=":video_game:"]::before, em[data-emoji="video_game"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ae.svg"); } em[data-emoji=":slot_machine:"]::before, em[data-emoji="slot_machine"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b0.svg"); } em[data-emoji=":jigsaw:"]::before, em[data-emoji="jigsaw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e9.svg"); } em[data-emoji=":red_car:"]::before, em[data-emoji="red_car"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f697.svg"); } em[data-emoji=":taxi:"]::before, em[data-emoji="taxi"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f695.svg"); } em[data-emoji=":blue_car:"]::before, em[data-emoji="blue_car"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f699.svg"); } em[data-emoji=":pickup_truck:"]::before, em[data-emoji="pickup_truck"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6fb.svg"); } em[data-emoji=":minibus:"]::before, em[data-emoji="minibus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f690.svg"); } em[data-emoji=":bus:"]::before, em[data-emoji="bus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68c.svg"); } em[data-emoji=":trolleybus:"]::before, em[data-emoji="trolleybus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68e.svg"); } em[data-emoji=":race_car:"]::before, em[data-emoji="race_car"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ce.svg"); } em[data-emoji=":police_car:"]::before, em[data-emoji="police_car"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f693.svg"); } em[data-emoji=":ambulance:"]::before, em[data-emoji="ambulance"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f691.svg"); } em[data-emoji=":fire_engine:"]::before, em[data-emoji="fire_engine"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f692.svg"); } em[data-emoji=":truck:"]::before, em[data-emoji="truck"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69a.svg"); } em[data-emoji=":articulated_lorry:"]::before, em[data-emoji="articulated_lorry"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69b.svg"); } em[data-emoji=":tractor:"]::before, em[data-emoji="tractor"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69c.svg"); } em[data-emoji=":probing_cane:"]::before, em[data-emoji="probing_cane"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9af.svg"); } em[data-emoji=":manual_wheelchair:"]::before, em[data-emoji="manual_wheelchair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bd.svg"); } em[data-emoji=":motorized_wheelchair:"]::before, em[data-emoji="motorized_wheelchair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9bc.svg"); } em[data-emoji=":crutch:"]::before, em[data-emoji="crutch"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa7c.svg"); } em[data-emoji=":scooter:"]::before, em[data-emoji="scooter"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f4.svg"); } em[data-emoji=":bike:"]::before, em[data-emoji="bike"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b2.svg"); } em[data-emoji=":motor_scooter:"]::before, em[data-emoji="motor_scooter"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f5.svg"); } em[data-emoji=":motorcycle:"]::before, em[data-emoji="motorcycle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3cd.svg"); } em[data-emoji=":auto_rickshaw:"]::before, em[data-emoji="auto_rickshaw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6fa.svg"); } em[data-emoji=":wheel:"]::before, em[data-emoji="wheel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6de.svg"); } em[data-emoji=":rotating_light:"]::before, em[data-emoji="rotating_light"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a8.svg"); } em[data-emoji=":oncoming_police_car:"]::before, em[data-emoji="oncoming_police_car"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f694.svg"); } em[data-emoji=":oncoming_bus:"]::before, em[data-emoji="oncoming_bus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68d.svg"); } em[data-emoji=":oncoming_automobile:"]::before, em[data-emoji="oncoming_automobile"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f698.svg"); } em[data-emoji=":oncoming_taxi:"]::before, em[data-emoji="oncoming_taxi"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f696.svg"); } em[data-emoji=":aerial_tramway:"]::before, em[data-emoji="aerial_tramway"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a1.svg"); } em[data-emoji=":mountain_cableway:"]::before, em[data-emoji="mountain_cableway"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a0.svg"); } em[data-emoji=":suspension_railway:"]::before, em[data-emoji="suspension_railway"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69f.svg"); } em[data-emoji=":railway_car:"]::before, em[data-emoji="railway_car"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f683.svg"); } em[data-emoji=":train:"]::before, em[data-emoji="train"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68b.svg"); } em[data-emoji=":mountain_railway:"]::before, em[data-emoji="mountain_railway"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69e.svg"); } em[data-emoji=":monorail:"]::before, em[data-emoji="monorail"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f69d.svg"); } em[data-emoji=":bullettrain_side:"]::before, em[data-emoji="bullettrain_side"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f684.svg"); } em[data-emoji=":bullettrain_front:"]::before, em[data-emoji="bullettrain_front"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f685.svg"); } em[data-emoji=":light_rail:"]::before, em[data-emoji="light_rail"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f688.svg"); } em[data-emoji=":steam_locomotive:"]::before, em[data-emoji="steam_locomotive"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f682.svg"); } em[data-emoji=":train2:"]::before, em[data-emoji="train2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f686.svg"); } em[data-emoji=":metro:"]::before, em[data-emoji="metro"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f687.svg"); } em[data-emoji=":tram:"]::before, em[data-emoji="tram"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68a.svg"); } em[data-emoji=":station:"]::before, em[data-emoji="station"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f689.svg"); } em[data-emoji=":airplane_departure:"]::before, em[data-emoji="airplane_departure"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6eb.svg"); } em[data-emoji=":airplane_arriving:"]::before, em[data-emoji="airplane_arriving"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ec.svg"); } em[data-emoji=":airplane_small:"]::before, em[data-emoji="airplane_small"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e9.svg"); } em[data-emoji=":seat:"]::before, em[data-emoji="seat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ba.svg"); } em[data-emoji=":satellite_orbital:"]::before, em[data-emoji="satellite_orbital"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f0.svg"); } em[data-emoji=":rocket:"]::before, em[data-emoji="rocket"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f680.svg"); } em[data-emoji=":flying_saucer:"]::before, em[data-emoji="flying_saucer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f8.svg"); } em[data-emoji=":helicopter:"]::before, em[data-emoji="helicopter"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f681.svg"); } em[data-emoji=":canoe:"]::before, em[data-emoji="canoe"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f6.svg"); } em[data-emoji=":sailboat:"]::before, em[data-emoji="sailboat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f5.svg"); } em[data-emoji=":speedboat:"]::before, em[data-emoji="speedboat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a4.svg"); } em[data-emoji=":motorboat:"]::before, em[data-emoji="motorboat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e5.svg"); } em[data-emoji=":cruise_ship:"]::before, em[data-emoji="cruise_ship"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6f3.svg"); } em[data-emoji=":ferry:"]::before, em[data-emoji="ferry"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f4.svg"); } em[data-emoji=":ship:"]::before, em[data-emoji="ship"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a2.svg"); } em[data-emoji=":ring_buoy:"]::before, em[data-emoji="ring_buoy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6df.svg"); } em[data-emoji=":hook:"]::before, em[data-emoji="hook"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9d.svg"); } em[data-emoji=":fuelpump:"]::before, em[data-emoji="fuelpump"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26fd.svg"); } em[data-emoji=":construction:"]::before, em[data-emoji="construction"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a7.svg"); } em[data-emoji=":vertical_traffic_light:"]::before, em[data-emoji="vertical_traffic_light"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a6.svg"); } em[data-emoji=":traffic_light:"]::before, em[data-emoji="traffic_light"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a5.svg"); } em[data-emoji=":busstop:"]::before, em[data-emoji="busstop"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f68f.svg"); } em[data-emoji=":map:"]::before, em[data-emoji="map"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5fa.svg"); } em[data-emoji=":moyai:"]::before, em[data-emoji="moyai"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5ff.svg"); } em[data-emoji=":statue_of_liberty:"]::before, em[data-emoji="statue_of_liberty"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5fd.svg"); } em[data-emoji=":tokyo_tower:"]::before, em[data-emoji="tokyo_tower"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5fc.svg"); } em[data-emoji=":european_castle:"]::before, em[data-emoji="european_castle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f0.svg"); } em[data-emoji=":japanese_castle:"]::before, em[data-emoji="japanese_castle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ef.svg"); } em[data-emoji=":stadium:"]::before, em[data-emoji="stadium"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3df.svg"); } em[data-emoji=":ferris_wheel:"]::before, em[data-emoji="ferris_wheel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a1.svg"); } em[data-emoji=":roller_coaster:"]::before, em[data-emoji="roller_coaster"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a2.svg"); } em[data-emoji=":carousel_horse:"]::before, em[data-emoji="carousel_horse"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a0.svg"); } em[data-emoji=":fountain:"]::before, em[data-emoji="fountain"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f2.svg"); } em[data-emoji=":beach_umbrella:"]::before, em[data-emoji="beach_umbrella"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f1.svg"); } em[data-emoji=":beach:"]::before, em[data-emoji="beach"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d6.svg"); } em[data-emoji=":island:"]::before, em[data-emoji="island"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3dd.svg"); } em[data-emoji=":desert:"]::before, em[data-emoji="desert"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3dc.svg"); } em[data-emoji=":volcano:"]::before, em[data-emoji="volcano"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30b.svg"); } em[data-emoji=":mountain:"]::before, em[data-emoji="mountain"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26f0.svg"); } em[data-emoji=":mountain_snow:"]::before, em[data-emoji="mountain_snow"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d4.svg"); } em[data-emoji=":mount_fuji:"]::before, em[data-emoji="mount_fuji"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5fb.svg"); } em[data-emoji=":camping:"]::before, em[data-emoji="camping"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d5.svg"); } em[data-emoji=":tent:"]::before, em[data-emoji="tent"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26fa.svg"); } em[data-emoji=":house:"]::before, em[data-emoji="house"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e0.svg"); } em[data-emoji=":house_with_garden:"]::before, em[data-emoji="house_with_garden"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e1.svg"); } em[data-emoji=":homes:"]::before, em[data-emoji="homes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d8.svg"); } em[data-emoji=":house_abandoned:"]::before, em[data-emoji="house_abandoned"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3da.svg"); } em[data-emoji=":hut:"]::before, em[data-emoji="hut"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d6.svg"); } em[data-emoji=":construction_site:"]::before, em[data-emoji="construction_site"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d7.svg"); } em[data-emoji=":factory:"]::before, em[data-emoji="factory"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ed.svg"); } em[data-emoji=":office:"]::before, em[data-emoji="office"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e2.svg"); } em[data-emoji=":department_store:"]::before, em[data-emoji="department_store"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ec.svg"); } em[data-emoji=":post_office:"]::before, em[data-emoji="post_office"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e3.svg"); } em[data-emoji=":european_post_office:"]::before, em[data-emoji="european_post_office"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e4.svg"); } em[data-emoji=":hospital:"]::before, em[data-emoji="hospital"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e5.svg"); } em[data-emoji=":bank:"]::before, em[data-emoji="bank"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e6.svg"); } em[data-emoji=":hotel:"]::before, em[data-emoji="hotel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e8.svg"); } em[data-emoji=":convenience_store:"]::before, em[data-emoji="convenience_store"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ea.svg"); } em[data-emoji=":school:"]::before, em[data-emoji="school"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3eb.svg"); } em[data-emoji=":love_hotel:"]::before, em[data-emoji="love_hotel"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e9.svg"); } em[data-emoji=":wedding:"]::before, em[data-emoji="wedding"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f492.svg"); } em[data-emoji=":classical_building:"]::before, em[data-emoji="classical_building"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3db.svg"); } em[data-emoji=":church:"]::before, em[data-emoji="church"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26ea.svg"); } em[data-emoji=":mosque:"]::before, em[data-emoji="mosque"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f54c.svg"); } em[data-emoji=":synagogue:"]::before, em[data-emoji="synagogue"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f54d.svg"); } em[data-emoji=":hindu_temple:"]::before, em[data-emoji="hindu_temple"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d5.svg"); } em[data-emoji=":kaaba:"]::before, em[data-emoji="kaaba"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f54b.svg"); } em[data-emoji=":shinto_shrine:"]::before, em[data-emoji="shinto_shrine"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26e9.svg"); } em[data-emoji=":railway_track:"]::before, em[data-emoji="railway_track"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e4.svg"); } em[data-emoji=":motorway:"]::before, em[data-emoji="motorway"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e3.svg"); } em[data-emoji=":japan:"]::before, em[data-emoji="japan"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5fe.svg"); } em[data-emoji=":rice_scene:"]::before, em[data-emoji="rice_scene"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f391.svg"); } em[data-emoji=":park:"]::before, em[data-emoji="park"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3de.svg"); } em[data-emoji=":sunrise:"]::before, em[data-emoji="sunrise"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f305.svg"); } em[data-emoji=":sunrise_over_mountains:"]::before, em[data-emoji="sunrise_over_mountains"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f304.svg"); } em[data-emoji=":stars:"]::before, em[data-emoji="stars"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f320.svg"); } em[data-emoji=":sparkler:"]::before, em[data-emoji="sparkler"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f387.svg"); } em[data-emoji=":fireworks:"]::before, em[data-emoji="fireworks"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f386.svg"); } em[data-emoji=":city_sunset:"]::before, em[data-emoji="city_sunset"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f307.svg"); } em[data-emoji=":city_dusk:"]::before, em[data-emoji="city_dusk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f306.svg"); } em[data-emoji=":cityscape:"]::before, em[data-emoji="cityscape"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3d9.svg"); } em[data-emoji=":night_with_stars:"]::before, em[data-emoji="night_with_stars"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f303.svg"); } em[data-emoji=":milky_way:"]::before, em[data-emoji="milky_way"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f30c.svg"); } em[data-emoji=":bridge_at_night:"]::before, em[data-emoji="bridge_at_night"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f309.svg"); } em[data-emoji=":foggy:"]::before, em[data-emoji="foggy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f301.svg"); } em[data-emoji=":watch:"]::before, em[data-emoji="watch"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/231a.svg"); } em[data-emoji=":mobile_phone:"]::before, em[data-emoji="mobile_phone"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f1.svg"); } em[data-emoji=":calling:"]::before, em[data-emoji="calling"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f2.svg"); } em[data-emoji=":computer:"]::before, em[data-emoji="computer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4bb.svg"); } em[data-emoji=":desktop:"]::before, em[data-emoji="desktop"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5a5.svg"); } em[data-emoji=":printer:"]::before, em[data-emoji="printer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5a8.svg"); } em[data-emoji=":mouse_three_button:"]::before, em[data-emoji="mouse_three_button"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5b1.svg"); } em[data-emoji=":trackball:"]::before, em[data-emoji="trackball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5b2.svg"); } em[data-emoji=":joystick:"]::before, em[data-emoji="joystick"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f579.svg"); } em[data-emoji=":compression:"]::before, em[data-emoji="compression"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5dc.svg"); } em[data-emoji=":minidisc:"]::before, em[data-emoji="minidisc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4bd.svg"); } em[data-emoji=":floppy_disk:"]::before, em[data-emoji="floppy_disk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4be.svg"); } em[data-emoji=":cd:"]::before, em[data-emoji="cd"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4bf.svg"); } em[data-emoji=":dvd:"]::before, em[data-emoji="dvd"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c0.svg"); } em[data-emoji=":vhs:"]::before, em[data-emoji="vhs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4fc.svg"); } em[data-emoji=":camera:"]::before, em[data-emoji="camera"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f7.svg"); } em[data-emoji=":camera_with_flash:"]::before, em[data-emoji="camera_with_flash"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f8.svg"); } em[data-emoji=":video_camera:"]::before, em[data-emoji="video_camera"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f9.svg"); } em[data-emoji=":movie_camera:"]::before, em[data-emoji="movie_camera"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a5.svg"); } em[data-emoji=":projector:"]::before, em[data-emoji="projector"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4fd.svg"); } em[data-emoji=":film_frames:"]::before, em[data-emoji="film_frames"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f39e.svg"); } em[data-emoji=":telephone_receiver:"]::before, em[data-emoji="telephone_receiver"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4de.svg"); } em[data-emoji=":telephone:"]::before, em[data-emoji="telephone"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/260e.svg"); } em[data-emoji=":pager:"]::before, em[data-emoji="pager"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4df.svg"); } em[data-emoji=":fax:"]::before, em[data-emoji="fax"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e0.svg"); } em[data-emoji=":tv:"]::before, em[data-emoji="tv"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4fa.svg"); } em[data-emoji=":radio:"]::before, em[data-emoji="radio"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4fb.svg"); } em[data-emoji=":microphone2:"]::before, em[data-emoji="microphone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f399.svg"); } em[data-emoji=":level_slider:"]::before, em[data-emoji="level_slider"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f39a.svg"); } em[data-emoji=":control_knobs:"]::before, em[data-emoji="control_knobs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f39b.svg"); } em[data-emoji=":compass:"]::before, em[data-emoji="compass"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ed.svg"); } em[data-emoji=":stopwatch:"]::before, em[data-emoji="stopwatch"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f1.svg"); } em[data-emoji=":timer:"]::before, em[data-emoji="timer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f2.svg"); } em[data-emoji=":alarm_clock:"]::before, em[data-emoji="alarm_clock"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f0.svg"); } em[data-emoji=":clock:"]::before, em[data-emoji="clock"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f570.svg"); } em[data-emoji=":hourglass:"]::before, em[data-emoji="hourglass"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/231b.svg"); } em[data-emoji=":hourglass_flowing_sand:"]::before, em[data-emoji="hourglass_flowing_sand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f3.svg"); } em[data-emoji=":satellite:"]::before, em[data-emoji="satellite"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e1.svg"); } em[data-emoji=":battery:"]::before, em[data-emoji="battery"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50b.svg"); } em[data-emoji=":low_battery:"]::before, em[data-emoji="low_battery"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faab.svg"); } em[data-emoji=":electric_plug:"]::before, em[data-emoji="electric_plug"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50c.svg"); } em[data-emoji=":bulb:"]::before, em[data-emoji="bulb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a1.svg"); } em[data-emoji=":flashlight:"]::before, em[data-emoji="flashlight"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f526.svg"); } em[data-emoji=":candle:"]::before, em[data-emoji="candle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f56f.svg"); } em[data-emoji=":diya_lamp:"]::before, em[data-emoji="diya_lamp"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa94.svg"); } em[data-emoji=":fire_extinguisher:"]::before, em[data-emoji="fire_extinguisher"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ef.svg"); } em[data-emoji=":oil:"]::before, em[data-emoji="oil"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e2.svg"); } em[data-emoji=":money_with_wings:"]::before, em[data-emoji="money_with_wings"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b8.svg"); } em[data-emoji=":dollar:"]::before, em[data-emoji="dollar"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b5.svg"); } em[data-emoji=":yen:"]::before, em[data-emoji="yen"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b4.svg"); } em[data-emoji=":euro:"]::before, em[data-emoji="euro"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b6.svg"); } em[data-emoji=":pound:"]::before, em[data-emoji="pound"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b7.svg"); } em[data-emoji=":coin:"]::before, em[data-emoji="coin"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa99.svg"); } em[data-emoji=":moneybag:"]::before, em[data-emoji="moneybag"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b0.svg"); } em[data-emoji=":credit_card:"]::before, em[data-emoji="credit_card"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b3.svg"); } em[data-emoji=":identification_card:"]::before, em[data-emoji="identification_card"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faaa.svg"); } em[data-emoji=":gem:"]::before, em[data-emoji="gem"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48e.svg"); } em[data-emoji=":ladder:"]::before, em[data-emoji="ladder"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9c.svg"); } em[data-emoji=":toolbox:"]::before, em[data-emoji="toolbox"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f0.svg"); } em[data-emoji=":screwdriver:"]::before, em[data-emoji="screwdriver"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9b.svg"); } em[data-emoji=":wrench:"]::before, em[data-emoji="wrench"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f527.svg"); } em[data-emoji=":hammer:"]::before, em[data-emoji="hammer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f528.svg"); } em[data-emoji=":tools:"]::before, em[data-emoji="tools"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e0.svg"); } em[data-emoji=":pick:"]::before, em[data-emoji="pick"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26cf.svg"); } em[data-emoji=":carpentry_saw:"]::before, em[data-emoji="carpentry_saw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9a.svg"); } em[data-emoji=":nut_and_bolt:"]::before, em[data-emoji="nut_and_bolt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f529.svg"); } em[data-emoji=":mouse_trap:"]::before, em[data-emoji="mouse_trap"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa4.svg"); } em[data-emoji=":bricks:"]::before, em[data-emoji="bricks"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f1.svg"); } em[data-emoji=":chains:"]::before, em[data-emoji="chains"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26d3.svg"); } em[data-emoji=":link:"]::before, em[data-emoji="link"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f517.svg"); } em[data-emoji=":broken_chain:"]::before, em[data-emoji="broken_chain"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26d3-fe0f-200d-1f4a5.svg"); } em[data-emoji=":magnet:"]::before, em[data-emoji="magnet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f2.svg"); } em[data-emoji=":gun:"]::before, em[data-emoji="gun"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52b.svg"); } em[data-emoji=":bomb:"]::before, em[data-emoji="bomb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a3.svg"); } em[data-emoji=":firecracker:"]::before, em[data-emoji="firecracker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e8.svg"); } em[data-emoji=":axe:"]::before, em[data-emoji="axe"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa93.svg"); } em[data-emoji=":knife:"]::before, em[data-emoji="knife"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52a.svg"); } em[data-emoji=":dagger:"]::before, em[data-emoji="dagger"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5e1.svg"); } em[data-emoji=":shield:"]::before, em[data-emoji="shield"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6e1.svg"); } em[data-emoji=":smoking:"]::before, em[data-emoji="smoking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ac.svg"); } em[data-emoji=":coffin:"]::before, em[data-emoji="coffin"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26b0.svg"); } em[data-emoji=":headstone:"]::before, em[data-emoji="headstone"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa6.svg"); } em[data-emoji=":urn:"]::before, em[data-emoji="urn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26b1.svg"); } em[data-emoji=":amphora:"]::before, em[data-emoji="amphora"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3fa.svg"); } em[data-emoji=":crystal_ball:"]::before, em[data-emoji="crystal_ball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52e.svg"); } em[data-emoji=":prayer_beads:"]::before, em[data-emoji="prayer_beads"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ff.svg"); } em[data-emoji=":nazar_amulet:"]::before, em[data-emoji="nazar_amulet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ff.svg"); } em[data-emoji=":hamsa:"]::before, em[data-emoji="hamsa"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faac.svg"); } em[data-emoji=":barber:"]::before, em[data-emoji="barber"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f488.svg"); } em[data-emoji=":telescope:"]::before, em[data-emoji="telescope"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52d.svg"); } em[data-emoji=":microscope:"]::before, em[data-emoji="microscope"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52c.svg"); } em[data-emoji=":hole:"]::before, em[data-emoji="hole"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f573.svg"); } em[data-emoji=":x_ray:"]::before, em[data-emoji="x_ray"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa7b.svg"); } em[data-emoji=":adhesive_bandage:"]::before, em[data-emoji="adhesive_bandage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa79.svg"); } em[data-emoji=":stethoscope:"]::before, em[data-emoji="stethoscope"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa7a.svg"); } em[data-emoji=":pill:"]::before, em[data-emoji="pill"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48a.svg"); } em[data-emoji=":syringe:"]::before, em[data-emoji="syringe"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f489.svg"); } em[data-emoji=":drop_of_blood:"]::before, em[data-emoji="drop_of_blood"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa78.svg"); } em[data-emoji=":dna:"]::before, em[data-emoji="dna"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ec.svg"); } em[data-emoji=":microbe:"]::before, em[data-emoji="microbe"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9a0.svg"); } em[data-emoji=":petri_dish:"]::before, em[data-emoji="petri_dish"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9eb.svg"); } em[data-emoji=":test_tube:"]::before, em[data-emoji="test_tube"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ea.svg"); } em[data-emoji=":thermometer:"]::before, em[data-emoji="thermometer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f321.svg"); } em[data-emoji=":broom:"]::before, em[data-emoji="broom"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f9.svg"); } em[data-emoji=":plunger:"]::before, em[data-emoji="plunger"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa0.svg"); } em[data-emoji=":basket:"]::before, em[data-emoji="basket"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9fa.svg"); } em[data-emoji=":roll_of_paper:"]::before, em[data-emoji="roll_of_paper"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9fb.svg"); } em[data-emoji=":toilet:"]::before, em[data-emoji="toilet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6bd.svg"); } em[data-emoji=":potable_water:"]::before, em[data-emoji="potable_water"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b0.svg"); } em[data-emoji=":shower:"]::before, em[data-emoji="shower"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6bf.svg"); } em[data-emoji=":bathtub:"]::before, em[data-emoji="bathtub"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c1.svg"); } em[data-emoji=":bath:"]::before, em[data-emoji="bath"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0.svg"); } em[data-emoji=":bath_tone1:"]::before, em[data-emoji="bath_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0-1f3fb.svg"); } em[data-emoji=":bath_tone2:"]::before, em[data-emoji="bath_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0-1f3fc.svg"); } em[data-emoji=":bath_tone3:"]::before, em[data-emoji="bath_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0-1f3fd.svg"); } em[data-emoji=":bath_tone4:"]::before, em[data-emoji="bath_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0-1f3fe.svg"); } em[data-emoji=":bath_tone5:"]::before, em[data-emoji="bath_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c0-1f3ff.svg"); } em[data-emoji=":soap:"]::before, em[data-emoji="soap"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9fc.svg"); } em[data-emoji=":toothbrush:"]::before, em[data-emoji="toothbrush"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa5.svg"); } em[data-emoji=":razor:"]::before, em[data-emoji="razor"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa92.svg"); } em[data-emoji=":hair_pick:"]::before, em[data-emoji="hair_pick"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faae.svg"); } em[data-emoji=":sponge:"]::before, em[data-emoji="sponge"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9fd.svg"); } em[data-emoji=":bucket:"]::before, em[data-emoji="bucket"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa3.svg"); } em[data-emoji=":squeeze_bottle:"]::before, em[data-emoji="squeeze_bottle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f4.svg"); } em[data-emoji=":bellhop:"]::before, em[data-emoji="bellhop"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ce.svg"); } em[data-emoji=":key:"]::before, em[data-emoji="key"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f511.svg"); } em[data-emoji=":key2:"]::before, em[data-emoji="key2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5dd.svg"); } em[data-emoji=":door:"]::before, em[data-emoji="door"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6aa.svg"); } em[data-emoji=":chair:"]::before, em[data-emoji="chair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa91.svg"); } em[data-emoji=":couch:"]::before, em[data-emoji="couch"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cb.svg"); } em[data-emoji=":bed:"]::before, em[data-emoji="bed"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cf.svg"); } em[data-emoji=":sleeping_accommodation:"]::before, em[data-emoji="sleeping_accommodation"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc.svg"); } em[data-emoji=":person_in_bed_tone1:"]::before, em[data-emoji="person_in_bed_tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc-1f3fb.svg"); } em[data-emoji=":person_in_bed_tone2:"]::before, em[data-emoji="person_in_bed_tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc-1f3fc.svg"); } em[data-emoji=":person_in_bed_tone3:"]::before, em[data-emoji="person_in_bed_tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc-1f3fd.svg"); } em[data-emoji=":person_in_bed_tone4:"]::before, em[data-emoji="person_in_bed_tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc-1f3fe.svg"); } em[data-emoji=":person_in_bed_tone5:"]::before, em[data-emoji="person_in_bed_tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cc-1f3ff.svg"); } em[data-emoji=":teddy_bear:"]::before, em[data-emoji="teddy_bear"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f8.svg"); } em[data-emoji=":nesting_dolls:"]::before, em[data-emoji="nesting_dolls"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa86.svg"); } em[data-emoji=":frame_photo:"]::before, em[data-emoji="frame_photo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5bc.svg"); } em[data-emoji=":mirror:"]::before, em[data-emoji="mirror"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9e.svg"); } em[data-emoji=":window:"]::before, em[data-emoji="window"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa9f.svg"); } em[data-emoji=":shopping_bags:"]::before, em[data-emoji="shopping_bags"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6cd.svg"); } em[data-emoji=":shopping_cart:"]::before, em[data-emoji="shopping_cart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d2.svg"); } em[data-emoji=":gift:"]::before, em[data-emoji="gift"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f381.svg"); } em[data-emoji=":balloon:"]::before, em[data-emoji="balloon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f388.svg"); } em[data-emoji=":flags:"]::before, em[data-emoji="flags"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38f.svg"); } em[data-emoji=":ribbon:"]::before, em[data-emoji="ribbon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f380.svg"); } em[data-emoji=":magic_wand:"]::before, em[data-emoji="magic_wand"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa84.svg"); } em[data-emoji=":pinata:"]::before, em[data-emoji="pinata"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa85.svg"); } em[data-emoji=":confetti_ball:"]::before, em[data-emoji="confetti_ball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38a.svg"); } em[data-emoji=":tada:"]::before, em[data-emoji="tada"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f389.svg"); } em[data-emoji=":dolls:"]::before, em[data-emoji="dolls"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38e.svg"); } em[data-emoji=":folding_hand_fan:"]::before, em[data-emoji="folding_hand_fan"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faad.svg"); } em[data-emoji=":izakaya_lantern:"]::before, em[data-emoji="izakaya_lantern"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ee.svg"); } em[data-emoji=":wind_chime:"]::before, em[data-emoji="wind_chime"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f390.svg"); } em[data-emoji=":mirror_ball:"]::before, em[data-emoji="mirror_ball"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa9.svg"); } em[data-emoji=":red_envelope:"]::before, em[data-emoji="red_envelope"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e7.svg"); } em[data-emoji=":envelope_with_arrow:"]::before, em[data-emoji="envelope_with_arrow"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e9.svg"); } em[data-emoji=":incoming_envelope:"]::before, em[data-emoji="incoming_envelope"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e8.svg"); } em[data-emoji=":e-mail:"]::before, em[data-emoji="e-mail"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e7.svg"); } em[data-emoji=":love_letter:"]::before, em[data-emoji="love_letter"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f48c.svg"); } em[data-emoji=":inbox_tray:"]::before, em[data-emoji="inbox_tray"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e5.svg"); } em[data-emoji=":outbox_tray:"]::before, em[data-emoji="outbox_tray"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e4.svg"); } em[data-emoji=":package:"]::before, em[data-emoji="package"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e6.svg"); } em[data-emoji=":label:"]::before, em[data-emoji="label"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f7.svg"); } em[data-emoji=":placard:"]::before, em[data-emoji="placard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faa7.svg"); } em[data-emoji=":mailbox_closed:"]::before, em[data-emoji="mailbox_closed"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ea.svg"); } em[data-emoji=":mailbox:"]::before, em[data-emoji="mailbox"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4eb.svg"); } em[data-emoji=":mailbox_with_mail:"]::before, em[data-emoji="mailbox_with_mail"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ec.svg"); } em[data-emoji=":mailbox_with_no_mail:"]::before, em[data-emoji="mailbox_with_no_mail"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ed.svg"); } em[data-emoji=":postbox:"]::before, em[data-emoji="postbox"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ee.svg"); } em[data-emoji=":postal_horn:"]::before, em[data-emoji="postal_horn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ef.svg"); } em[data-emoji=":scroll:"]::before, em[data-emoji="scroll"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4dc.svg"); } em[data-emoji=":page_with_curl:"]::before, em[data-emoji="page_with_curl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c3.svg"); } em[data-emoji=":page_facing_up:"]::before, em[data-emoji="page_facing_up"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c4.svg"); } em[data-emoji=":bookmark_tabs:"]::before, em[data-emoji="bookmark_tabs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d1.svg"); } em[data-emoji=":receipt:"]::before, em[data-emoji="receipt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9fe.svg"); } em[data-emoji=":bar_chart:"]::before, em[data-emoji="bar_chart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ca.svg"); } em[data-emoji=":chart_with_upwards_trend:"]::before, em[data-emoji="chart_with_upwards_trend"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c8.svg"); } em[data-emoji=":chart_with_downwards_trend:"]::before, em[data-emoji="chart_with_downwards_trend"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c9.svg"); } em[data-emoji=":notepad_spiral:"]::before, em[data-emoji="notepad_spiral"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5d2.svg"); } em[data-emoji=":calendar_spiral:"]::before, em[data-emoji="calendar_spiral"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5d3.svg"); } em[data-emoji=":calendar:"]::before, em[data-emoji="calendar"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c6.svg"); } em[data-emoji=":date:"]::before, em[data-emoji="date"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c5.svg"); } em[data-emoji=":wastebasket:"]::before, em[data-emoji="wastebasket"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5d1.svg"); } em[data-emoji=":card_index:"]::before, em[data-emoji="card_index"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c7.svg"); } em[data-emoji=":card_box:"]::before, em[data-emoji="card_box"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5c3.svg"); } em[data-emoji=":ballot_box:"]::before, em[data-emoji="ballot_box"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5f3.svg"); } em[data-emoji=":file_cabinet:"]::before, em[data-emoji="file_cabinet"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5c4.svg"); } em[data-emoji=":clipboard:"]::before, em[data-emoji="clipboard"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4cb.svg"); } em[data-emoji=":file_folder:"]::before, em[data-emoji="file_folder"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c1.svg"); } em[data-emoji=":open_file_folder:"]::before, em[data-emoji="open_file_folder"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4c2.svg"); } em[data-emoji=":dividers:"]::before, em[data-emoji="dividers"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5c2.svg"); } em[data-emoji=":newspaper2:"]::before, em[data-emoji="newspaper2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5de.svg"); } em[data-emoji=":newspaper:"]::before, em[data-emoji="newspaper"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f0.svg"); } em[data-emoji=":notebook:"]::before, em[data-emoji="notebook"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d3.svg"); } em[data-emoji=":notebook_with_decorative_cover:"]::before, em[data-emoji="notebook_with_decorative_cover"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d4.svg"); } em[data-emoji=":ledger:"]::before, em[data-emoji="ledger"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d2.svg"); } em[data-emoji=":closed_book:"]::before, em[data-emoji="closed_book"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d5.svg"); } em[data-emoji=":green_book:"]::before, em[data-emoji="green_book"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d7.svg"); } em[data-emoji=":blue_book:"]::before, em[data-emoji="blue_book"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d8.svg"); } em[data-emoji=":orange_book:"]::before, em[data-emoji="orange_book"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d9.svg"); } em[data-emoji=":books:"]::before, em[data-emoji="books"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4da.svg"); } em[data-emoji=":book:"]::before, em[data-emoji="book"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d6.svg"); } em[data-emoji=":bookmark:"]::before, em[data-emoji="bookmark"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f516.svg"); } em[data-emoji=":safety_pin:"]::before, em[data-emoji="safety_pin"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9f7.svg"); } em[data-emoji=":paperclip:"]::before, em[data-emoji="paperclip"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ce.svg"); } em[data-emoji=":paperclips:"]::before, em[data-emoji="paperclips"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f587.svg"); } em[data-emoji=":triangular_ruler:"]::before, em[data-emoji="triangular_ruler"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4d0.svg"); } em[data-emoji=":straight_ruler:"]::before, em[data-emoji="straight_ruler"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4cf.svg"); } em[data-emoji=":abacus:"]::before, em[data-emoji="abacus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9ee.svg"); } em[data-emoji=":pushpin:"]::before, em[data-emoji="pushpin"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4cc.svg"); } em[data-emoji=":round_pushpin:"]::before, em[data-emoji="round_pushpin"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4cd.svg"); } em[data-emoji=":pen_ballpoint:"]::before, em[data-emoji="pen_ballpoint"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f58a.svg"); } em[data-emoji=":pen_fountain:"]::before, em[data-emoji="pen_fountain"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f58b.svg"); } em[data-emoji=":paintbrush:"]::before, em[data-emoji="paintbrush"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f58c.svg"); } em[data-emoji=":crayon:"]::before, em[data-emoji="crayon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f58d.svg"); } em[data-emoji=":pencil:"]::before, em[data-emoji="pencil"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4dd.svg"); } em[data-emoji=":pencil2:"]::before, em[data-emoji="pencil2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/270f.svg"); } em[data-emoji=":mag:"]::before, em[data-emoji="mag"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50d.svg"); } em[data-emoji=":mag_right:"]::before, em[data-emoji="mag_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50e.svg"); } em[data-emoji=":lock_with_ink_pen:"]::before, em[data-emoji="lock_with_ink_pen"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50f.svg"); } em[data-emoji=":closed_lock_with_key:"]::before, em[data-emoji="closed_lock_with_key"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f510.svg"); } em[data-emoji=":lock:"]::before, em[data-emoji="lock"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f512.svg"); } em[data-emoji=":unlock:"]::before, em[data-emoji="unlock"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f513.svg"); } em[data-emoji=":pink_heart:"]::before, em[data-emoji="pink_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa77.svg"); } em[data-emoji=":orange_heart:"]::before, em[data-emoji="orange_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e1.svg"); } em[data-emoji=":yellow_heart:"]::before, em[data-emoji="yellow_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49b.svg"); } em[data-emoji=":green_heart:"]::before, em[data-emoji="green_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49a.svg"); } em[data-emoji=":light_blue_heart:"]::before, em[data-emoji="light_blue_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa75.svg"); } em[data-emoji=":blue_heart:"]::before, em[data-emoji="blue_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f499.svg"); } em[data-emoji=":purple_heart:"]::before, em[data-emoji="purple_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49c.svg"); } em[data-emoji=":black_heart:"]::before, em[data-emoji="black_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5a4.svg"); } em[data-emoji=":grey_heart:"]::before, em[data-emoji="grey_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1fa76.svg"); } em[data-emoji=":white_heart:"]::before, em[data-emoji="white_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90d.svg"); } em[data-emoji=":brown_heart:"]::before, em[data-emoji="brown_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f90e.svg"); } em[data-emoji=":broken_heart:"]::before, em[data-emoji="broken_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f494.svg"); } em[data-emoji=":two_hearts:"]::before, em[data-emoji="two_hearts"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f495.svg"); } em[data-emoji=":revolving_hearts:"]::before, em[data-emoji="revolving_hearts"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49e.svg"); } em[data-emoji=":heartbeat:"]::before, em[data-emoji="heartbeat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f493.svg"); } em[data-emoji=":heartpulse:"]::before, em[data-emoji="heartpulse"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f497.svg"); } em[data-emoji=":sparkling_heart:"]::before, em[data-emoji="sparkling_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f496.svg"); } em[data-emoji=":cupid:"]::before, em[data-emoji="cupid"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f498.svg"); } em[data-emoji=":gift_heart:"]::before, em[data-emoji="gift_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49d.svg"); } em[data-emoji=":mending_heart:"]::before, em[data-emoji="mending_heart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2764-fe0f-200d-1fa79.svg"); } em[data-emoji=":heart_on_fire:"]::before, em[data-emoji="heart_on_fire"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2764-fe0f-200d-1f525.svg"); } em[data-emoji=":heart_decoration:"]::before, em[data-emoji="heart_decoration"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f49f.svg"); } em[data-emoji=":peace:"]::before, em[data-emoji="peace"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/262e.svg"); } em[data-emoji=":cross:"]::before, em[data-emoji="cross"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/271d.svg"); } em[data-emoji=":star_and_crescent:"]::before, em[data-emoji="star_and_crescent"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/262a.svg"); } em[data-emoji=":om_symbol:"]::before, em[data-emoji="om_symbol"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f549.svg"); } em[data-emoji=":khanda:"]::before, em[data-emoji="khanda"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1faaf.svg"); } em[data-emoji=":six_pointed_star:"]::before, em[data-emoji="six_pointed_star"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f52f.svg"); } em[data-emoji=":menorah:"]::before, em[data-emoji="menorah"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f54e.svg"); } em[data-emoji=":yin_yang:"]::before, em[data-emoji="yin_yang"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/262f.svg"); } em[data-emoji=":place_of_worship:"]::before, em[data-emoji="place_of_worship"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d0.svg"); } em[data-emoji=":ophiuchus:"]::before, em[data-emoji="ophiuchus"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26ce.svg"); } em[data-emoji=":gemini:"]::before, em[data-emoji="gemini"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264a.svg"); } em[data-emoji=":cancer:"]::before, em[data-emoji="cancer"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264b.svg"); } em[data-emoji=":leo:"]::before, em[data-emoji="leo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264c.svg"); } em[data-emoji=":virgo:"]::before, em[data-emoji="virgo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264d.svg"); } em[data-emoji=":libra:"]::before, em[data-emoji="libra"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264e.svg"); } em[data-emoji=":scorpius:"]::before, em[data-emoji="scorpius"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/264f.svg"); } em[data-emoji=":id:"]::before, em[data-emoji="id"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f194.svg"); } em[data-emoji=":atom:"]::before, em[data-emoji="atom"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/269b.svg"); } em[data-emoji=":accept:"]::before, em[data-emoji="accept"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f251.svg"); } em[data-emoji=":mobile_phone_off:"]::before, em[data-emoji="mobile_phone_off"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f4.svg"); } em[data-emoji=":vibration_mode:"]::before, em[data-emoji="vibration_mode"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f3.svg"); } em[data-emoji=":u6709:"]::before, em[data-emoji="u6709"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f236.svg"); } em[data-emoji=":u7121:"]::before, em[data-emoji="u7121"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f21a.svg"); } em[data-emoji=":u7533:"]::before, em[data-emoji="u7533"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f238.svg"); } em[data-emoji=":u55b6:"]::before, em[data-emoji="u55b6"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f23a.svg"); } em[data-emoji=":u6708:"]::before, em[data-emoji="u6708"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f237.svg"); } em[data-emoji=":vs:"]::before, em[data-emoji="vs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f19a.svg"); } em[data-emoji=":white_flower:"]::before, em[data-emoji="white_flower"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ae.svg"); } em[data-emoji=":ideograph_advantage:"]::before, em[data-emoji="ideograph_advantage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f250.svg"); } em[data-emoji=":u5408:"]::before, em[data-emoji="u5408"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f234.svg"); } em[data-emoji=":u6e80:"]::before, em[data-emoji="u6e80"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f235.svg"); } em[data-emoji=":u5272:"]::before, em[data-emoji="u5272"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f239.svg"); } em[data-emoji=":u7981:"]::before, em[data-emoji="u7981"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f232.svg"); } em[data-emoji=":a:"]::before, em[data-emoji="a"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f170.svg"); } em[data-emoji=":b:"]::before, em[data-emoji="b"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f171.svg"); } em[data-emoji=":ab:"]::before, em[data-emoji="ab"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f18e.svg"); } em[data-emoji=":cl:"]::before, em[data-emoji="cl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f191.svg"); } em[data-emoji=":o2:"]::before, em[data-emoji="o2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f17e.svg"); } em[data-emoji=":sos:"]::before, em[data-emoji="sos"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f198.svg"); } em[data-emoji=":x:"]::before, em[data-emoji="x"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/274c.svg"); } em[data-emoji=":o:"]::before, em[data-emoji="o"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b55.svg"); } em[data-emoji=":octagonal_sign:"]::before, em[data-emoji="octagonal_sign"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d1.svg"); } em[data-emoji=":no_entry:"]::before, em[data-emoji="no_entry"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26d4.svg"); } em[data-emoji=":name_badge:"]::before, em[data-emoji="name_badge"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4db.svg"); } em[data-emoji=":no_entry_sign:"]::before, em[data-emoji="no_entry_sign"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ab.svg"); } em[data-emoji=":100:"]::before, em[data-emoji="100"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4af.svg"); } em[data-emoji=":anger:"]::before, em[data-emoji="anger"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a2.svg"); } em[data-emoji=":no_pedestrians:"]::before, em[data-emoji="no_pedestrians"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b7.svg"); } em[data-emoji=":do_not_litter:"]::before, em[data-emoji="do_not_litter"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6af.svg"); } em[data-emoji=":no_bicycles:"]::before, em[data-emoji="no_bicycles"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b3.svg"); } em[data-emoji=":non-potable_water:"]::before, em[data-emoji="non-potable_water"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b1.svg"); } em[data-emoji=":underage:"]::before, em[data-emoji="underage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51e.svg"); } em[data-emoji=":no_mobile_phones:"]::before, em[data-emoji="no_mobile_phones"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f5.svg"); } em[data-emoji=":no_smoking:"]::before, em[data-emoji="no_smoking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ad.svg"); } em[data-emoji=":bangbang:"]::before, em[data-emoji="bangbang"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/203c.svg"); } em[data-emoji=":low_brightness:"]::before, em[data-emoji="low_brightness"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f505.svg"); } em[data-emoji=":high_brightness:"]::before, em[data-emoji="high_brightness"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f506.svg"); } em[data-emoji=":part_alternation_mark:"]::before, em[data-emoji="part_alternation_mark"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/303d.svg"); } em[data-emoji=":warning:"]::before, em[data-emoji="warning"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26a0.svg"); } em[data-emoji=":children_crossing:"]::before, em[data-emoji="children_crossing"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b8.svg"); } em[data-emoji=":trident:"]::before, em[data-emoji="trident"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f531.svg"); } em[data-emoji=":fleur-de-lis:"]::before, em[data-emoji="fleur-de-lis"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/269c.svg"); } em[data-emoji=":beginner:"]::before, em[data-emoji="beginner"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f530.svg"); } em[data-emoji=":recycle:"]::before, em[data-emoji="recycle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/267b.svg"); } em[data-emoji=":u6307:"]::before, em[data-emoji="u6307"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f22f.svg"); } em[data-emoji=":chart:"]::before, em[data-emoji="chart"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b9.svg"); } em[data-emoji=":negative_squared_cross_mark:"]::before, em[data-emoji="negative_squared_cross_mark"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/274e.svg"); } em[data-emoji=":globe_with_meridians:"]::before, em[data-emoji="globe_with_meridians"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f310.svg"); } em[data-emoji=":diamond_shape_with_a_dot_inside:"]::before, em[data-emoji="diamond_shape_with_a_dot_inside"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a0.svg"); } em[data-emoji=":m:"]::before, em[data-emoji="m"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/24c2.svg"); } em[data-emoji=":cyclone:"]::before, em[data-emoji="cyclone"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f300.svg"); } em[data-emoji=":zzz:"]::before, em[data-emoji="zzz"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4a4.svg"); } em[data-emoji=":atm:"]::before, em[data-emoji="atm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3e7.svg"); } em[data-emoji=":wc:"]::before, em[data-emoji="wc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6be.svg"); } em[data-emoji=":wheelchair:"]::before, em[data-emoji="wheelchair"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/267f.svg"); } em[data-emoji=":parking:"]::before, em[data-emoji="parking"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f17f.svg"); } em[data-emoji=":elevator:"]::before, em[data-emoji="elevator"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6d7.svg"); } em[data-emoji=":u7a7a:"]::before, em[data-emoji="u7a7a"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f233.svg"); } em[data-emoji=":sa:"]::before, em[data-emoji="sa"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f202.svg"); } em[data-emoji=":passport_control:"]::before, em[data-emoji="passport_control"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c2.svg"); } em[data-emoji=":customs:"]::before, em[data-emoji="customs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c3.svg"); } em[data-emoji=":baggage_claim:"]::before, em[data-emoji="baggage_claim"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c4.svg"); } em[data-emoji=":left_luggage:"]::before, em[data-emoji="left_luggage"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6c5.svg"); } em[data-emoji=":wireless:"]::before, em[data-emoji="wireless"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6dc.svg"); } em[data-emoji=":mens:"]::before, em[data-emoji="mens"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6b9.svg"); } em[data-emoji=":womens:"]::before, em[data-emoji="womens"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ba.svg"); } em[data-emoji=":baby_symbol:"]::before, em[data-emoji="baby_symbol"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6bc.svg"); } em[data-emoji=":restroom:"]::before, em[data-emoji="restroom"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6bb.svg"); } em[data-emoji=":put_litter_in_its_place:"]::before, em[data-emoji="put_litter_in_its_place"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6ae.svg"); } em[data-emoji=":cinema:"]::before, em[data-emoji="cinema"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3a6.svg"); } em[data-emoji=":signal_strength:"]::before, em[data-emoji="signal_strength"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4f6.svg"); } em[data-emoji=":koko:"]::before, em[data-emoji="koko"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f201.svg"); } em[data-emoji=":symbols:"]::before, em[data-emoji="symbols"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f523.svg"); } em[data-emoji=":abc:"]::before, em[data-emoji="abc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f524.svg"); } em[data-emoji=":abcd:"]::before, em[data-emoji="abcd"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f521.svg"); } em[data-emoji=":capital_abcd:"]::before, em[data-emoji="capital_abcd"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f520.svg"); } em[data-emoji=":ng:"]::before, em[data-emoji="ng"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f196.svg"); } em[data-emoji=":ok:"]::before, em[data-emoji="ok"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f197.svg"); } em[data-emoji=":up:"]::before, em[data-emoji="up"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f199.svg"); } em[data-emoji=":cool:"]::before, em[data-emoji="cool"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f192.svg"); } em[data-emoji=":new:"]::before, em[data-emoji="new"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f195.svg"); } em[data-emoji=":free:"]::before, em[data-emoji="free"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f193.svg"); } em[data-emoji=":zero:"]::before, em[data-emoji="zero"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/30-20e3.svg"); } em[data-emoji=":one:"]::before, em[data-emoji="one"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/31-20e3.svg"); } em[data-emoji=":two:"]::before, em[data-emoji="two"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/32-20e3.svg"); } em[data-emoji=":three:"]::before, em[data-emoji="three"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/33-20e3.svg"); } em[data-emoji=":four:"]::before, em[data-emoji="four"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/34-20e3.svg"); } em[data-emoji=":five:"]::before, em[data-emoji="five"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/35-20e3.svg"); } em[data-emoji=":six:"]::before, em[data-emoji="six"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/36-20e3.svg"); } em[data-emoji=":seven:"]::before, em[data-emoji="seven"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/37-20e3.svg"); } em[data-emoji=":eight:"]::before, em[data-emoji="eight"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/38-20e3.svg"); } em[data-emoji=":nine:"]::before, em[data-emoji="nine"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/39-20e3.svg"); } em[data-emoji=":keycap_ten:"]::before, em[data-emoji="keycap_ten"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51f.svg"); } em[data-emoji=":1234:"]::before, em[data-emoji="1234"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f522.svg"); } em[data-emoji=":hash:"]::before, em[data-emoji="hash"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23-20e3.svg"); } em[data-emoji=":asterisk:"]::before, em[data-emoji="asterisk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2a-20e3.svg"); } em[data-emoji=":eject:"]::before, em[data-emoji="eject"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23cf.svg"); } em[data-emoji=":arrow_forward:"]::before, em[data-emoji="arrow_forward"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25b6.svg"); } em[data-emoji=":pause_button:"]::before, em[data-emoji="pause_button"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f8.svg"); } em[data-emoji=":play_pause:"]::before, em[data-emoji="play_pause"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23ef.svg"); } em[data-emoji=":stop_button:"]::before, em[data-emoji="stop_button"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23f9.svg"); } em[data-emoji=":record_button:"]::before, em[data-emoji="record_button"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23fa.svg"); } em[data-emoji=":track_next:"]::before, em[data-emoji="track_next"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23ed.svg"); } em[data-emoji=":track_previous:"]::before, em[data-emoji="track_previous"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23ee.svg"); } em[data-emoji=":fast_forward:"]::before, em[data-emoji="fast_forward"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23e9.svg"); } em[data-emoji=":rewind:"]::before, em[data-emoji="rewind"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23ea.svg"); } em[data-emoji=":arrow_double_up:"]::before, em[data-emoji="arrow_double_up"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23eb.svg"); } em[data-emoji=":arrow_double_down:"]::before, em[data-emoji="arrow_double_down"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/23ec.svg"); } em[data-emoji=":arrow_backward:"]::before, em[data-emoji="arrow_backward"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25c0.svg"); } em[data-emoji=":arrow_up_small:"]::before, em[data-emoji="arrow_up_small"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f53c.svg"); } em[data-emoji=":arrow_down_small:"]::before, em[data-emoji="arrow_down_small"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f53d.svg"); } em[data-emoji=":arrow_right:"]::before, em[data-emoji="arrow_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/27a1.svg"); } em[data-emoji=":arrow_left:"]::before, em[data-emoji="arrow_left"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b05.svg"); } em[data-emoji=":arrow_up:"]::before, em[data-emoji="arrow_up"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b06.svg"); } em[data-emoji=":arrow_down:"]::before, em[data-emoji="arrow_down"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b07.svg"); } em[data-emoji=":arrow_right_hook:"]::before, em[data-emoji="arrow_right_hook"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/21aa.svg"); } em[data-emoji=":leftwards_arrow_with_hook:"]::before, em[data-emoji="leftwards_arrow_with_hook"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/21a9.svg"); } em[data-emoji=":twisted_rightwards_arrows:"]::before, em[data-emoji="twisted_rightwards_arrows"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f500.svg"); } em[data-emoji=":repeat:"]::before, em[data-emoji="repeat"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f501.svg"); } em[data-emoji=":repeat_one:"]::before, em[data-emoji="repeat_one"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f502.svg"); } em[data-emoji=":arrows_counterclockwise:"]::before, em[data-emoji="arrows_counterclockwise"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f504.svg"); } em[data-emoji=":arrows_clockwise:"]::before, em[data-emoji="arrows_clockwise"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f503.svg"); } em[data-emoji=":musical_note:"]::before, em[data-emoji="musical_note"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b5.svg"); } em[data-emoji=":notes:"]::before, em[data-emoji="notes"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b6.svg"); } em[data-emoji=":heavy_equals_sign:"]::before, em[data-emoji="heavy_equals_sign"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7f0.svg"); } em[data-emoji=":infinity:"]::before, em[data-emoji="infinity"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/267e.svg"); } em[data-emoji=":heavy_dollar_sign:"]::before, em[data-emoji="heavy_dollar_sign"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b2.svg"); } em[data-emoji=":currency_exchange:"]::before, em[data-emoji="currency_exchange"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4b1.svg"); } em[data-emoji=":copyright:"]::before, em[data-emoji="copyright"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/a9.svg"); } em[data-emoji=":registered:"]::before, em[data-emoji="registered"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/ae.svg"); } em[data-emoji=":curly_loop:"]::before, em[data-emoji="curly_loop"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/27b0.svg"); } em[data-emoji=":loop:"]::before, em[data-emoji="loop"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/27bf.svg"); } em[data-emoji=":end:"]::before, em[data-emoji="end"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51a.svg"); } em[data-emoji=":back:"]::before, em[data-emoji="back"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f519.svg"); } em[data-emoji=":on:"]::before, em[data-emoji="on"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51b.svg"); } em[data-emoji=":top:"]::before, em[data-emoji="top"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51d.svg"); } em[data-emoji=":soon:"]::before, em[data-emoji="soon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f51c.svg"); } em[data-emoji=":radio_button:"]::before, em[data-emoji="radio_button"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f518.svg"); } em[data-emoji=":white_circle:"]::before, em[data-emoji="white_circle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26aa.svg"); } em[data-emoji=":black_circle:"]::before, em[data-emoji="black_circle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26ab.svg"); } em[data-emoji=":red_circle:"]::before, em[data-emoji="red_circle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f534.svg"); } em[data-emoji=":blue_circle:"]::before, em[data-emoji="blue_circle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f535.svg"); } em[data-emoji=":brown_circle:"]::before, em[data-emoji="brown_circle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e4.svg"); } em[data-emoji=":purple_circle:"]::before, em[data-emoji="purple_circle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e3.svg"); } em[data-emoji=":green_circle:"]::before, em[data-emoji="green_circle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e2.svg"); } em[data-emoji=":yellow_circle:"]::before, em[data-emoji="yellow_circle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e1.svg"); } em[data-emoji=":orange_circle:"]::before, em[data-emoji="orange_circle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e0.svg"); } em[data-emoji=":small_red_triangle:"]::before, em[data-emoji="small_red_triangle"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f53a.svg"); } em[data-emoji=":small_red_triangle_down:"]::before, em[data-emoji="small_red_triangle_down"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f53b.svg"); } em[data-emoji=":small_orange_diamond:"]::before, em[data-emoji="small_orange_diamond"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f538.svg"); } em[data-emoji=":small_blue_diamond:"]::before, em[data-emoji="small_blue_diamond"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f539.svg"); } em[data-emoji=":large_orange_diamond:"]::before, em[data-emoji="large_orange_diamond"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f536.svg"); } em[data-emoji=":large_blue_diamond:"]::before, em[data-emoji="large_blue_diamond"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f537.svg"); } em[data-emoji=":white_square_button:"]::before, em[data-emoji="white_square_button"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f533.svg"); } em[data-emoji=":black_square_button:"]::before, em[data-emoji="black_square_button"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f532.svg"); } em[data-emoji=":black_small_square:"]::before, em[data-emoji="black_small_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25aa.svg"); } em[data-emoji=":white_small_square:"]::before, em[data-emoji="white_small_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25ab.svg"); } em[data-emoji=":black_medium_small_square:"]::before, em[data-emoji="black_medium_small_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25fe.svg"); } em[data-emoji=":white_medium_small_square:"]::before, em[data-emoji="white_medium_small_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25fd.svg"); } em[data-emoji=":black_medium_square:"]::before, em[data-emoji="black_medium_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25fc.svg"); } em[data-emoji=":white_medium_square:"]::before, em[data-emoji="white_medium_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/25fb.svg"); } em[data-emoji=":black_large_square:"]::before, em[data-emoji="black_large_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b1b.svg"); } em[data-emoji=":white_large_square:"]::before, em[data-emoji="white_large_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/2b1c.svg"); } em[data-emoji=":orange_square:"]::before, em[data-emoji="orange_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e7.svg"); } em[data-emoji=":blue_square:"]::before, em[data-emoji="blue_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e6.svg"); } em[data-emoji=":red_square:"]::before, em[data-emoji="red_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e5.svg"); } em[data-emoji=":brown_square:"]::before, em[data-emoji="brown_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7eb.svg"); } em[data-emoji=":purple_square:"]::before, em[data-emoji="purple_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7ea.svg"); } em[data-emoji=":green_square:"]::before, em[data-emoji="green_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e9.svg"); } em[data-emoji=":yellow_square:"]::before, em[data-emoji="yellow_square"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f7e8.svg"); } em[data-emoji=":speaker:"]::before, em[data-emoji="speaker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f508.svg"); } em[data-emoji=":mute:"]::before, em[data-emoji="mute"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f507.svg"); } em[data-emoji=":sound:"]::before, em[data-emoji="sound"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f509.svg"); } em[data-emoji=":loud_sound:"]::before, em[data-emoji="loud_sound"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f50a.svg"); } em[data-emoji=":bell:"]::before, em[data-emoji="bell"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f514.svg"); } em[data-emoji=":no_bell:"]::before, em[data-emoji="no_bell"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f515.svg"); } em[data-emoji=":mega:"]::before, em[data-emoji="mega"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e3.svg"); } em[data-emoji=":loudspeaker:"]::before, em[data-emoji="loudspeaker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4e2.svg"); } em[data-emoji=":speech_left:"]::before, em[data-emoji="speech_left"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5e8.svg"); } em[data-emoji=":eye_in_speech_bubble:"]::before, em[data-emoji="eye_in_speech_bubble"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f441-200d-1f5e8.svg"); } em[data-emoji=":speech_balloon:"]::before, em[data-emoji="speech_balloon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ac.svg"); } em[data-emoji=":thought_balloon:"]::before, em[data-emoji="thought_balloon"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f4ad.svg"); } em[data-emoji=":anger_right:"]::before, em[data-emoji="anger_right"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f5ef.svg"); } em[data-emoji=":black_joker:"]::before, em[data-emoji="black_joker"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f0cf.svg"); } em[data-emoji=":flower_playing_cards:"]::before, em[data-emoji="flower_playing_cards"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3b4.svg"); } em[data-emoji=":mahjong:"]::before, em[data-emoji="mahjong"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f004.svg"); } em[data-emoji=":clock1:"]::before, em[data-emoji="clock1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f550.svg"); } em[data-emoji=":clock2:"]::before, em[data-emoji="clock2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f551.svg"); } em[data-emoji=":clock3:"]::before, em[data-emoji="clock3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f552.svg"); } em[data-emoji=":clock4:"]::before, em[data-emoji="clock4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f553.svg"); } em[data-emoji=":clock5:"]::before, em[data-emoji="clock5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f554.svg"); } em[data-emoji=":clock6:"]::before, em[data-emoji="clock6"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f555.svg"); } em[data-emoji=":clock7:"]::before, em[data-emoji="clock7"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f556.svg"); } em[data-emoji=":clock8:"]::before, em[data-emoji="clock8"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f557.svg"); } em[data-emoji=":clock9:"]::before, em[data-emoji="clock9"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f558.svg"); } em[data-emoji=":clock10:"]::before, em[data-emoji="clock10"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f559.svg"); } em[data-emoji=":clock11:"]::before, em[data-emoji="clock11"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55a.svg"); } em[data-emoji=":clock12:"]::before, em[data-emoji="clock12"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55b.svg"); } em[data-emoji=":clock130:"]::before, em[data-emoji="clock130"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55c.svg"); } em[data-emoji=":clock230:"]::before, em[data-emoji="clock230"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55d.svg"); } em[data-emoji=":clock330:"]::before, em[data-emoji="clock330"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55e.svg"); } em[data-emoji=":clock430:"]::before, em[data-emoji="clock430"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f55f.svg"); } em[data-emoji=":clock530:"]::before, em[data-emoji="clock530"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f560.svg"); } em[data-emoji=":clock630:"]::before, em[data-emoji="clock630"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f561.svg"); } em[data-emoji=":clock730:"]::before, em[data-emoji="clock730"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f562.svg"); } em[data-emoji=":clock830:"]::before, em[data-emoji="clock830"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f563.svg"); } em[data-emoji=":clock930:"]::before, em[data-emoji="clock930"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f564.svg"); } em[data-emoji=":clock1030:"]::before, em[data-emoji="clock1030"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f565.svg"); } em[data-emoji=":clock1130:"]::before, em[data-emoji="clock1130"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f566.svg"); } em[data-emoji=":clock1230:"]::before, em[data-emoji="clock1230"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f567.svg"); } em[data-emoji=":transgender_symbol:"]::before, em[data-emoji="transgender_symbol"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/26a7.svg"); } em[data-emoji=":flag_white:"]::before, em[data-emoji="flag_white"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f3.svg"); } em[data-emoji=":flag_black:"]::before, em[data-emoji="flag_black"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4.svg"); } em[data-emoji=":pirate_flag:"]::before, em[data-emoji="pirate_flag"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-200d-2620-fe0f.svg"); } em[data-emoji=":checkered_flag:"]::before, em[data-emoji="checkered_flag"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3c1.svg"); } em[data-emoji=":triangular_flag_on_post:"]::before, em[data-emoji="triangular_flag_on_post"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f6a9.svg"); } em[data-emoji=":rainbow_flag:"]::before, em[data-emoji="rainbow_flag"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f3-fe0f-200d-1f308.svg"); } em[data-emoji=":transgender_flag:"]::before, em[data-emoji="transgender_flag"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f3-fe0f-200d-26a7-fe0f.svg"); } em[data-emoji=":united_nations:"]::before, em[data-emoji="united_nations"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f3.svg"); } em[data-emoji=":flag_af:"]::before, em[data-emoji="flag_af"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1eb.svg"); } em[data-emoji=":flag_ax:"]::before, em[data-emoji="flag_ax"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fd.svg"); } em[data-emoji=":flag_al:"]::before, em[data-emoji="flag_al"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f1.svg"); } em[data-emoji=":flag_dz:"]::before, em[data-emoji="flag_dz"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ff.svg"); } em[data-emoji=":flag_as:"]::before, em[data-emoji="flag_as"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f8.svg"); } em[data-emoji=":flag_ad:"]::before, em[data-emoji="flag_ad"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1e9.svg"); } em[data-emoji=":flag_ao:"]::before, em[data-emoji="flag_ao"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f4.svg"); } em[data-emoji=":flag_ai:"]::before, em[data-emoji="flag_ai"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ee.svg"); } em[data-emoji=":flag_aq:"]::before, em[data-emoji="flag_aq"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f6.svg"); } em[data-emoji=":flag_ag:"]::before, em[data-emoji="flag_ag"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ec.svg"); } em[data-emoji=":flag_ar:"]::before, em[data-emoji="flag_ar"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f7.svg"); } em[data-emoji=":flag_am:"]::before, em[data-emoji="flag_am"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f2.svg"); } em[data-emoji=":flag_aw:"]::before, em[data-emoji="flag_aw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fc.svg"); } em[data-emoji=":flag_au:"]::before, em[data-emoji="flag_au"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fa.svg"); } em[data-emoji=":flag_at:"]::before, em[data-emoji="flag_at"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f9.svg"); } em[data-emoji=":flag_az:"]::before, em[data-emoji="flag_az"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ff.svg"); } em[data-emoji=":flag_bs:"]::before, em[data-emoji="flag_bs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f8.svg"); } em[data-emoji=":flag_bh:"]::before, em[data-emoji="flag_bh"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ed.svg"); } em[data-emoji=":flag_bd:"]::before, em[data-emoji="flag_bd"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e9.svg"); } em[data-emoji=":flag_bb:"]::before, em[data-emoji="flag_bb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e7.svg"); } em[data-emoji=":flag_by:"]::before, em[data-emoji="flag_by"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fe.svg"); } em[data-emoji=":flag_be:"]::before, em[data-emoji="flag_be"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ea.svg"); } em[data-emoji=":flag_bz:"]::before, em[data-emoji="flag_bz"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ff.svg"); } em[data-emoji=":flag_bj:"]::before, em[data-emoji="flag_bj"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ef.svg"); } em[data-emoji=":flag_bm:"]::before, em[data-emoji="flag_bm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f2.svg"); } em[data-emoji=":flag_bt:"]::before, em[data-emoji="flag_bt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f9.svg"); } em[data-emoji=":flag_bo:"]::before, em[data-emoji="flag_bo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f4.svg"); } em[data-emoji=":flag_ba:"]::before, em[data-emoji="flag_ba"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e6.svg"); } em[data-emoji=":flag_bw:"]::before, em[data-emoji="flag_bw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fc.svg"); } em[data-emoji=":flag_br:"]::before, em[data-emoji="flag_br"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f7.svg"); } em[data-emoji=":flag_io:"]::before, em[data-emoji="flag_io"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f4.svg"); } em[data-emoji=":flag_vg:"]::before, em[data-emoji="flag_vg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ec.svg"); } em[data-emoji=":flag_bn:"]::before, em[data-emoji="flag_bn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f3.svg"); } em[data-emoji=":flag_bg:"]::before, em[data-emoji="flag_bg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ec.svg"); } em[data-emoji=":flag_bf:"]::before, em[data-emoji="flag_bf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1eb.svg"); } em[data-emoji=":flag_bi:"]::before, em[data-emoji="flag_bi"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ee.svg"); } em[data-emoji=":flag_kh:"]::before, em[data-emoji="flag_kh"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ed.svg"); } em[data-emoji=":flag_cm:"]::before, em[data-emoji="flag_cm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f2.svg"); } em[data-emoji=":flag_ca:"]::before, em[data-emoji="flag_ca"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e6.svg"); } em[data-emoji=":flag_ic:"]::before, em[data-emoji="flag_ic"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1e8.svg"); } em[data-emoji=":flag_cv:"]::before, em[data-emoji="flag_cv"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fb.svg"); } em[data-emoji=":flag_bq:"]::before, em[data-emoji="flag_bq"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f6.svg"); } em[data-emoji=":flag_ky:"]::before, em[data-emoji="flag_ky"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1fe.svg"); } em[data-emoji=":flag_cf:"]::before, em[data-emoji="flag_cf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1eb.svg"); } em[data-emoji=":flag_td:"]::before, em[data-emoji="flag_td"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e9.svg"); } em[data-emoji=":flag_cl:"]::before, em[data-emoji="flag_cl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f1.svg"); } em[data-emoji=":flag_cn:"]::before, em[data-emoji="flag_cn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f3.svg"); } em[data-emoji=":flag_cx:"]::before, em[data-emoji="flag_cx"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fd.svg"); } em[data-emoji=":flag_cc:"]::before, em[data-emoji="flag_cc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e8.svg"); } em[data-emoji=":flag_co:"]::before, em[data-emoji="flag_co"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f4.svg"); } em[data-emoji=":flag_km:"]::before, em[data-emoji="flag_km"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f2.svg"); } em[data-emoji=":flag_cg:"]::before, em[data-emoji="flag_cg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ec.svg"); } em[data-emoji=":flag_cd:"]::before, em[data-emoji="flag_cd"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e9.svg"); } em[data-emoji=":flag_ck:"]::before, em[data-emoji="flag_ck"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f0.svg"); } em[data-emoji=":flag_cr:"]::before, em[data-emoji="flag_cr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f7.svg"); } em[data-emoji=":flag_ci:"]::before, em[data-emoji="flag_ci"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ee.svg"); } em[data-emoji=":flag_hr:"]::before, em[data-emoji="flag_hr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f7.svg"); } em[data-emoji=":flag_cu:"]::before, em[data-emoji="flag_cu"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fa.svg"); } em[data-emoji=":flag_cw:"]::before, em[data-emoji="flag_cw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fc.svg"); } em[data-emoji=":flag_cy:"]::before, em[data-emoji="flag_cy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fe.svg"); } em[data-emoji=":flag_cz:"]::before, em[data-emoji="flag_cz"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ff.svg"); } em[data-emoji=":flag_dk:"]::before, em[data-emoji="flag_dk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f0.svg"); } em[data-emoji=":flag_dj:"]::before, em[data-emoji="flag_dj"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ef.svg"); } em[data-emoji=":flag_dm:"]::before, em[data-emoji="flag_dm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f2.svg"); } em[data-emoji=":flag_do:"]::before, em[data-emoji="flag_do"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f4.svg"); } em[data-emoji=":flag_ec:"]::before, em[data-emoji="flag_ec"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1e8.svg"); } em[data-emoji=":flag_eg:"]::before, em[data-emoji="flag_eg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ec.svg"); } em[data-emoji=":flag_sv:"]::before, em[data-emoji="flag_sv"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fb.svg"); } em[data-emoji=":flag_gq:"]::before, em[data-emoji="flag_gq"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f6.svg"); } em[data-emoji=":flag_er:"]::before, em[data-emoji="flag_er"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f7.svg"); } em[data-emoji=":flag_ee:"]::before, em[data-emoji="flag_ee"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ea.svg"); } em[data-emoji=":flag_et:"]::before, em[data-emoji="flag_et"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f9.svg"); } em[data-emoji=":flag_eu:"]::before, em[data-emoji="flag_eu"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1fa.svg"); } em[data-emoji=":flag_fk:"]::before, em[data-emoji="flag_fk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f0.svg"); } em[data-emoji=":flag_fo:"]::before, em[data-emoji="flag_fo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f4.svg"); } em[data-emoji=":flag_fj:"]::before, em[data-emoji="flag_fj"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1ef.svg"); } em[data-emoji=":flag_fi:"]::before, em[data-emoji="flag_fi"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1ee.svg"); } em[data-emoji=":flag_fr:"]::before, em[data-emoji="flag_fr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f7.svg"); } em[data-emoji=":flag_gf:"]::before, em[data-emoji="flag_gf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1eb.svg"); } em[data-emoji=":flag_pf:"]::before, em[data-emoji="flag_pf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1eb.svg"); } em[data-emoji=":flag_tf:"]::before, em[data-emoji="flag_tf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1eb.svg"); } em[data-emoji=":flag_ga:"]::before, em[data-emoji="flag_ga"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e6.svg"); } em[data-emoji=":flag_gm:"]::before, em[data-emoji="flag_gm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f2.svg"); } em[data-emoji=":flag_ge:"]::before, em[data-emoji="flag_ge"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ea.svg"); } em[data-emoji=":flag_de:"]::before, em[data-emoji="flag_de"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ea.svg"); } em[data-emoji=":flag_gh:"]::before, em[data-emoji="flag_gh"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ed.svg"); } em[data-emoji=":flag_gi:"]::before, em[data-emoji="flag_gi"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ee.svg"); } em[data-emoji=":flag_gr:"]::before, em[data-emoji="flag_gr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f7.svg"); } em[data-emoji=":flag_gl:"]::before, em[data-emoji="flag_gl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f1.svg"); } em[data-emoji=":flag_gd:"]::before, em[data-emoji="flag_gd"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e9.svg"); } em[data-emoji=":flag_gp:"]::before, em[data-emoji="flag_gp"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f5.svg"); } em[data-emoji=":flag_gu:"]::before, em[data-emoji="flag_gu"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fa.svg"); } em[data-emoji=":flag_gt:"]::before, em[data-emoji="flag_gt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f9.svg"); } em[data-emoji=":flag_gg:"]::before, em[data-emoji="flag_gg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ec.svg"); } em[data-emoji=":flag_gn:"]::before, em[data-emoji="flag_gn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f3.svg"); } em[data-emoji=":flag_gw:"]::before, em[data-emoji="flag_gw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fc.svg"); } em[data-emoji=":flag_gy:"]::before, em[data-emoji="flag_gy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fe.svg"); } em[data-emoji=":flag_ht:"]::before, em[data-emoji="flag_ht"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f9.svg"); } em[data-emoji=":flag_hn:"]::before, em[data-emoji="flag_hn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f3.svg"); } em[data-emoji=":flag_hk:"]::before, em[data-emoji="flag_hk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f0.svg"); } em[data-emoji=":flag_hu:"]::before, em[data-emoji="flag_hu"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1fa.svg"); } em[data-emoji=":flag_is:"]::before, em[data-emoji="flag_is"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f8.svg"); } em[data-emoji=":flag_in:"]::before, em[data-emoji="flag_in"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f3.svg"); } em[data-emoji=":flag_id:"]::before, em[data-emoji="flag_id"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1e9.svg"); } em[data-emoji=":flag_ir:"]::before, em[data-emoji="flag_ir"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f7.svg"); } em[data-emoji=":flag_iq:"]::before, em[data-emoji="flag_iq"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f6.svg"); } em[data-emoji=":flag_ie:"]::before, em[data-emoji="flag_ie"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1ea.svg"); } em[data-emoji=":flag_im:"]::before, em[data-emoji="flag_im"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f2.svg"); } em[data-emoji=":flag_il:"]::before, em[data-emoji="flag_il"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f1.svg"); } em[data-emoji=":flag_it:"]::before, em[data-emoji="flag_it"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f9.svg"); } em[data-emoji=":flag_jm:"]::before, em[data-emoji="flag_jm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f2.svg"); } em[data-emoji=":flag_jp:"]::before, em[data-emoji="flag_jp"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f5.svg"); } em[data-emoji=":crossed_flags:"]::before, em[data-emoji="crossed_flags"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f38c.svg"); } em[data-emoji=":flag_je:"]::before, em[data-emoji="flag_je"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1ea.svg"); } em[data-emoji=":flag_jo:"]::before, em[data-emoji="flag_jo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f4.svg"); } em[data-emoji=":flag_kz:"]::before, em[data-emoji="flag_kz"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ff.svg"); } em[data-emoji=":flag_ke:"]::before, em[data-emoji="flag_ke"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ea.svg"); } em[data-emoji=":flag_ki:"]::before, em[data-emoji="flag_ki"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ee.svg"); } em[data-emoji=":flag_xk:"]::before, em[data-emoji="flag_xk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fd-1f1f0.svg"); } em[data-emoji=":flag_kw:"]::before, em[data-emoji="flag_kw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1fc.svg"); } em[data-emoji=":flag_kg:"]::before, em[data-emoji="flag_kg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ec.svg"); } em[data-emoji=":flag_la:"]::before, em[data-emoji="flag_la"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e6.svg"); } em[data-emoji=":flag_lv:"]::before, em[data-emoji="flag_lv"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fb.svg"); } em[data-emoji=":flag_lb:"]::before, em[data-emoji="flag_lb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e7.svg"); } em[data-emoji=":flag_ls:"]::before, em[data-emoji="flag_ls"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f8.svg"); } em[data-emoji=":flag_lr:"]::before, em[data-emoji="flag_lr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f7.svg"); } em[data-emoji=":flag_ly:"]::before, em[data-emoji="flag_ly"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fe.svg"); } em[data-emoji=":flag_li:"]::before, em[data-emoji="flag_li"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1ee.svg"); } em[data-emoji=":flag_lt:"]::before, em[data-emoji="flag_lt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f9.svg"); } em[data-emoji=":flag_lu:"]::before, em[data-emoji="flag_lu"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fa.svg"); } em[data-emoji=":flag_mo:"]::before, em[data-emoji="flag_mo"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f4.svg"); } em[data-emoji=":flag_mk:"]::before, em[data-emoji="flag_mk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f0.svg"); } em[data-emoji=":flag_mg:"]::before, em[data-emoji="flag_mg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ec.svg"); } em[data-emoji=":flag_mw:"]::before, em[data-emoji="flag_mw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fc.svg"); } em[data-emoji=":flag_my:"]::before, em[data-emoji="flag_my"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fe.svg"); } em[data-emoji=":flag_mv:"]::before, em[data-emoji="flag_mv"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fb.svg"); } em[data-emoji=":flag_ml:"]::before, em[data-emoji="flag_ml"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f1.svg"); } em[data-emoji=":flag_mt:"]::before, em[data-emoji="flag_mt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f9.svg"); } em[data-emoji=":flag_mh:"]::before, em[data-emoji="flag_mh"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ed.svg"); } em[data-emoji=":flag_mq:"]::before, em[data-emoji="flag_mq"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f6.svg"); } em[data-emoji=":flag_mr:"]::before, em[data-emoji="flag_mr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f7.svg"); } em[data-emoji=":flag_mu:"]::before, em[data-emoji="flag_mu"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fa.svg"); } em[data-emoji=":flag_yt:"]::before, em[data-emoji="flag_yt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fe-1f1f9.svg"); } em[data-emoji=":flag_mx:"]::before, em[data-emoji="flag_mx"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fd.svg"); } em[data-emoji=":flag_fm:"]::before, em[data-emoji="flag_fm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f2.svg"); } em[data-emoji=":flag_md:"]::before, em[data-emoji="flag_md"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e9.svg"); } em[data-emoji=":flag_mc:"]::before, em[data-emoji="flag_mc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e8.svg"); } em[data-emoji=":flag_mn:"]::before, em[data-emoji="flag_mn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f3.svg"); } em[data-emoji=":flag_me:"]::before, em[data-emoji="flag_me"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ea.svg"); } em[data-emoji=":flag_ms:"]::before, em[data-emoji="flag_ms"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f8.svg"); } em[data-emoji=":flag_ma:"]::before, em[data-emoji="flag_ma"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e6.svg"); } em[data-emoji=":flag_mz:"]::before, em[data-emoji="flag_mz"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ff.svg"); } em[data-emoji=":flag_mm:"]::before, em[data-emoji="flag_mm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f2.svg"); } em[data-emoji=":flag_na:"]::before, em[data-emoji="flag_na"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1e6.svg"); } em[data-emoji=":flag_nr:"]::before, em[data-emoji="flag_nr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f7.svg"); } em[data-emoji=":flag_np:"]::before, em[data-emoji="flag_np"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f5.svg"); } em[data-emoji=":flag_nl:"]::before, em[data-emoji="flag_nl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f1.svg"); } em[data-emoji=":flag_nc:"]::before, em[data-emoji="flag_nc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1e8.svg"); } em[data-emoji=":flag_nz:"]::before, em[data-emoji="flag_nz"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ff.svg"); } em[data-emoji=":flag_ni:"]::before, em[data-emoji="flag_ni"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ee.svg"); } em[data-emoji=":flag_ne:"]::before, em[data-emoji="flag_ne"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ea.svg"); } em[data-emoji=":flag_ng:"]::before, em[data-emoji="flag_ng"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ec.svg"); } em[data-emoji=":flag_nu:"]::before, em[data-emoji="flag_nu"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1fa.svg"); } em[data-emoji=":flag_nf:"]::before, em[data-emoji="flag_nf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1eb.svg"); } em[data-emoji=":flag_kp:"]::before, em[data-emoji="flag_kp"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f5.svg"); } em[data-emoji=":flag_mp:"]::before, em[data-emoji="flag_mp"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f5.svg"); } em[data-emoji=":flag_no:"]::before, em[data-emoji="flag_no"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f4.svg"); } em[data-emoji=":flag_om:"]::before, em[data-emoji="flag_om"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f4-1f1f2.svg"); } em[data-emoji=":flag_pk:"]::before, em[data-emoji="flag_pk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f0.svg"); } em[data-emoji=":flag_pw:"]::before, em[data-emoji="flag_pw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1fc.svg"); } em[data-emoji=":flag_ps:"]::before, em[data-emoji="flag_ps"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f8.svg"); } em[data-emoji=":flag_pa:"]::before, em[data-emoji="flag_pa"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1e6.svg"); } em[data-emoji=":flag_pg:"]::before, em[data-emoji="flag_pg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ec.svg"); } em[data-emoji=":flag_py:"]::before, em[data-emoji="flag_py"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1fe.svg"); } em[data-emoji=":flag_pe:"]::before, em[data-emoji="flag_pe"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ea.svg"); } em[data-emoji=":flag_ph:"]::before, em[data-emoji="flag_ph"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ed.svg"); } em[data-emoji=":flag_pn:"]::before, em[data-emoji="flag_pn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f3.svg"); } em[data-emoji=":flag_pl:"]::before, em[data-emoji="flag_pl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f1.svg"); } em[data-emoji=":flag_pt:"]::before, em[data-emoji="flag_pt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f9.svg"); } em[data-emoji=":flag_pr:"]::before, em[data-emoji="flag_pr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f7.svg"); } em[data-emoji=":flag_qa:"]::before, em[data-emoji="flag_qa"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f6-1f1e6.svg"); } em[data-emoji=":flag_re:"]::before, em[data-emoji="flag_re"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1ea.svg"); } em[data-emoji=":flag_ro:"]::before, em[data-emoji="flag_ro"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1f4.svg"); } em[data-emoji=":flag_ru:"]::before, em[data-emoji="flag_ru"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1fa.svg"); } em[data-emoji=":flag_rw:"]::before, em[data-emoji="flag_rw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1fc.svg"); } em[data-emoji=":flag_ws:"]::before, em[data-emoji="flag_ws"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fc-1f1f8.svg"); } em[data-emoji=":flag_sm:"]::before, em[data-emoji="flag_sm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f2.svg"); } em[data-emoji=":flag_st:"]::before, em[data-emoji="flag_st"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f9.svg"); } em[data-emoji=":flag_sa:"]::before, em[data-emoji="flag_sa"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e6.svg"); } em[data-emoji=":flag_sn:"]::before, em[data-emoji="flag_sn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f3.svg"); } em[data-emoji=":flag_rs:"]::before, em[data-emoji="flag_rs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1f8.svg"); } em[data-emoji=":flag_sc:"]::before, em[data-emoji="flag_sc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e8.svg"); } em[data-emoji=":flag_sl:"]::before, em[data-emoji="flag_sl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f1.svg"); } em[data-emoji=":flag_sg:"]::before, em[data-emoji="flag_sg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ec.svg"); } em[data-emoji=":flag_sx:"]::before, em[data-emoji="flag_sx"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fd.svg"); } em[data-emoji=":flag_sk:"]::before, em[data-emoji="flag_sk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f0.svg"); } em[data-emoji=":flag_si:"]::before, em[data-emoji="flag_si"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ee.svg"); } em[data-emoji=":flag_gs:"]::before, em[data-emoji="flag_gs"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f8.svg"); } em[data-emoji=":flag_sb:"]::before, em[data-emoji="flag_sb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e7.svg"); } em[data-emoji=":flag_so:"]::before, em[data-emoji="flag_so"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f4.svg"); } em[data-emoji=":flag_za:"]::before, em[data-emoji="flag_za"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1e6.svg"); } em[data-emoji=":flag_kr:"]::before, em[data-emoji="flag_kr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f7.svg"); } em[data-emoji=":flag_ss:"]::before, em[data-emoji="flag_ss"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f8.svg"); } em[data-emoji=":flag_es:"]::before, em[data-emoji="flag_es"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f8.svg"); } em[data-emoji=":flag_lk:"]::before, em[data-emoji="flag_lk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f0.svg"); } em[data-emoji=":flag_bl:"]::before, em[data-emoji="flag_bl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f1.svg"); } em[data-emoji=":flag_sh:"]::before, em[data-emoji="flag_sh"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ed.svg"); } em[data-emoji=":flag_kn:"]::before, em[data-emoji="flag_kn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f3.svg"); } em[data-emoji=":flag_lc:"]::before, em[data-emoji="flag_lc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e8.svg"); } em[data-emoji=":flag_pm:"]::before, em[data-emoji="flag_pm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f2.svg"); } em[data-emoji=":flag_vc:"]::before, em[data-emoji="flag_vc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1e8.svg"); } em[data-emoji=":flag_sd:"]::before, em[data-emoji="flag_sd"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e9.svg"); } em[data-emoji=":flag_sr:"]::before, em[data-emoji="flag_sr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f7.svg"); } em[data-emoji=":flag_sz:"]::before, em[data-emoji="flag_sz"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ff.svg"); } em[data-emoji=":flag_se:"]::before, em[data-emoji="flag_se"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ea.svg"); } em[data-emoji=":flag_ch:"]::before, em[data-emoji="flag_ch"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ed.svg"); } em[data-emoji=":flag_sy:"]::before, em[data-emoji="flag_sy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fe.svg"); } em[data-emoji=":flag_tw:"]::before, em[data-emoji="flag_tw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1fc.svg"); } em[data-emoji=":flag_tj:"]::before, em[data-emoji="flag_tj"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ef.svg"); } em[data-emoji=":flag_tz:"]::before, em[data-emoji="flag_tz"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ff.svg"); } em[data-emoji=":flag_th:"]::before, em[data-emoji="flag_th"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ed.svg"); } em[data-emoji=":flag_tl:"]::before, em[data-emoji="flag_tl"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f1.svg"); } em[data-emoji=":flag_tg:"]::before, em[data-emoji="flag_tg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ec.svg"); } em[data-emoji=":flag_tk:"]::before, em[data-emoji="flag_tk"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f0.svg"); } em[data-emoji=":flag_to:"]::before, em[data-emoji="flag_to"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f4.svg"); } em[data-emoji=":flag_tt:"]::before, em[data-emoji="flag_tt"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f9.svg"); } em[data-emoji=":flag_tn:"]::before, em[data-emoji="flag_tn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f3.svg"); } em[data-emoji=":flag_tr:"]::before, em[data-emoji="flag_tr"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f7.svg"); } em[data-emoji=":flag_tm:"]::before, em[data-emoji="flag_tm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f2.svg"); } em[data-emoji=":flag_tc:"]::before, em[data-emoji="flag_tc"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e8.svg"); } em[data-emoji=":flag_vi:"]::before, em[data-emoji="flag_vi"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ee.svg"); } em[data-emoji=":flag_tv:"]::before, em[data-emoji="flag_tv"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1fb.svg"); } em[data-emoji=":flag_ug:"]::before, em[data-emoji="flag_ug"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1ec.svg"); } em[data-emoji=":flag_ua:"]::before, em[data-emoji="flag_ua"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1e6.svg"); } em[data-emoji=":flag_ae:"]::before, em[data-emoji="flag_ae"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ea.svg"); } em[data-emoji=":flag_gb:"]::before, em[data-emoji="flag_gb"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e7.svg"); } em[data-emoji=":england:"]::before, em[data-emoji="england"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg"); } em[data-emoji=":scotland:"]::before, em[data-emoji="scotland"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg"); } em[data-emoji=":wales:"]::before, em[data-emoji="wales"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg"); } em[data-emoji=":flag_us:"]::before, em[data-emoji="flag_us"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f8.svg"); } em[data-emoji=":flag_uy:"]::before, em[data-emoji="flag_uy"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1fe.svg"); } em[data-emoji=":flag_uz:"]::before, em[data-emoji="flag_uz"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1ff.svg"); } em[data-emoji=":flag_vu:"]::before, em[data-emoji="flag_vu"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1fa.svg"); } em[data-emoji=":flag_va:"]::before, em[data-emoji="flag_va"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1e6.svg"); } em[data-emoji=":flag_ve:"]::before, em[data-emoji="flag_ve"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ea.svg"); } em[data-emoji=":flag_vn:"]::before, em[data-emoji="flag_vn"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1f3.svg"); } em[data-emoji=":flag_wf:"]::before, em[data-emoji="flag_wf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fc-1f1eb.svg"); } em[data-emoji=":flag_eh:"]::before, em[data-emoji="flag_eh"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ed.svg"); } em[data-emoji=":flag_ye:"]::before, em[data-emoji="flag_ye"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fe-1f1ea.svg"); } em[data-emoji=":flag_zm:"]::before, em[data-emoji="flag_zm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1f2.svg"); } em[data-emoji=":flag_zw:"]::before, em[data-emoji="flag_zw"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1fc.svg"); } em[data-emoji=":flag_ac:"]::before, em[data-emoji="flag_ac"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1e8.svg"); } em[data-emoji=":flag_bv:"]::before, em[data-emoji="flag_bv"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fb.svg"); } em[data-emoji=":flag_cp:"]::before, em[data-emoji="flag_cp"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f5.svg"); } em[data-emoji=":flag_ea:"]::before, em[data-emoji="flag_ea"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1e6.svg"); } em[data-emoji=":flag_dg:"]::before, em[data-emoji="flag_dg"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ec.svg"); } em[data-emoji=":flag_hm:"]::before, em[data-emoji="flag_hm"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f2.svg"); } em[data-emoji=":flag_mf:"]::before, em[data-emoji="flag_mf"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1eb.svg"); } em[data-emoji=":flag_sj:"]::before, em[data-emoji="flag_sj"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ef.svg"); } em[data-emoji=":flag_ta:"]::before, em[data-emoji="flag_ta"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e6.svg"); } em[data-emoji=":flag_um:"]::before, em[data-emoji="flag_um"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f2.svg"); } em[data-emoji=":tone1:"]::before, em[data-emoji="tone1"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3fb.svg"); } em[data-emoji=":tone2:"]::before, em[data-emoji="tone2"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3fc.svg"); } em[data-emoji=":tone3:"]::before, em[data-emoji="tone3"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3fd.svg"); } em[data-emoji=":tone4:"]::before, em[data-emoji="tone4"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3fe.svg"); } em[data-emoji=":tone5:"]::before, em[data-emoji="tone5"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3ff.svg"); } em[data-emoji=":regional_indicator_z:"]::before, em[data-emoji="regional_indicator_z"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff.svg"); } em[data-emoji=":regional_indicator_y:"]::before, em[data-emoji="regional_indicator_y"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fe.svg"); } em[data-emoji=":regional_indicator_x:"]::before, em[data-emoji="regional_indicator_x"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fd.svg"); } em[data-emoji=":regional_indicator_w:"]::before, em[data-emoji="regional_indicator_w"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fc.svg"); } em[data-emoji=":regional_indicator_v:"]::before, em[data-emoji="regional_indicator_v"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb.svg"); } em[data-emoji=":regional_indicator_u:"]::before, em[data-emoji="regional_indicator_u"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa.svg"); } em[data-emoji=":regional_indicator_t:"]::before, em[data-emoji="regional_indicator_t"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9.svg"); } em[data-emoji=":regional_indicator_s:"]::before, em[data-emoji="regional_indicator_s"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8.svg"); } em[data-emoji=":regional_indicator_r:"]::before, em[data-emoji="regional_indicator_r"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7.svg"); } em[data-emoji=":regional_indicator_q:"]::before, em[data-emoji="regional_indicator_q"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f6.svg"); } em[data-emoji=":regional_indicator_p:"]::before, em[data-emoji="regional_indicator_p"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5.svg"); } em[data-emoji=":regional_indicator_o:"]::before, em[data-emoji="regional_indicator_o"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f4.svg"); } em[data-emoji=":regional_indicator_n:"]::before, em[data-emoji="regional_indicator_n"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3.svg"); } em[data-emoji=":regional_indicator_m:"]::before, em[data-emoji="regional_indicator_m"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2.svg"); } em[data-emoji=":regional_indicator_l:"]::before, em[data-emoji="regional_indicator_l"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1.svg"); } em[data-emoji=":regional_indicator_k:"]::before, em[data-emoji="regional_indicator_k"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0.svg"); } em[data-emoji=":regional_indicator_j:"]::before, em[data-emoji="regional_indicator_j"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef.svg"); } em[data-emoji=":regional_indicator_i:"]::before, em[data-emoji="regional_indicator_i"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee.svg"); } em[data-emoji=":regional_indicator_h:"]::before, em[data-emoji="regional_indicator_h"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed.svg"); } em[data-emoji=":regional_indicator_g:"]::before, em[data-emoji="regional_indicator_g"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec.svg"); } em[data-emoji=":regional_indicator_f:"]::before, em[data-emoji="regional_indicator_f"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb.svg"); } em[data-emoji=":regional_indicator_e:"]::before, em[data-emoji="regional_indicator_e"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea.svg"); } em[data-emoji=":regional_indicator_d:"]::before, em[data-emoji="regional_indicator_d"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9.svg"); } em[data-emoji=":regional_indicator_c:"]::before, em[data-emoji="regional_indicator_c"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8.svg"); } em[data-emoji=":regional_indicator_b:"]::before, em[data-emoji="regional_indicator_b"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7.svg"); } em[data-emoji=":regional_indicator_a:"]::before, em[data-emoji="regional_indicator_a"]::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6.svg"); } /* rtl:end:ignore */ /******************************* Emojis *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/feed.css ================================================ /*! * # Fomantic-UI 2.9.4 - Feed * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Activity Feed *******************************/ .ui.feed { margin: 1em 0; } .ui.feed:first-child { margin-top: 0; } .ui.feed:last-child { margin-bottom: 0; } /******************************* Content *******************************/ /* Event */ .ui.feed > .event { display: flex; flex-direction: row; width: 100%; padding: 0.21428571rem 0; margin: 0; background: none; } .ui.feed > .event:not(:first-child) { border-top: none; } .ui.feed:not(.connected) > .event:first-child { padding-top: 0; } .ui.feed > .event:last-child { padding-bottom: 0; } /* Event Label */ .ui.feed > .event > .label { display: block; flex: 0 0 auto; width: 2.5em; height: auto; align-self: stretch; text-align: left; } .ui.feed > .event > .label .icon { opacity: 1; font-size: 1.5em; width: 100%; padding: 0.25em; background: none; border: none; border-radius: 0; color: rgba(0, 0, 0, 0.6); } .ui.feed > .event > .label img { width: 100%; height: auto; border-radius: 500rem; } .ui.feed > .event > .label > .text { display: block; text-align: center; margin-top: 0.5em; } .ui.feed > .event > .label > .text.ui { margin-top: 0.65em; } .ui.feed > .event > .label > .text.multiline { margin-top: 0; } .ui.feed > .event > .label > .text.multiline.ui { margin-top: 0.3em; } .ui.feed > .event > .label > .ui.label { margin-top: 0.4em; position: relative; z-index: 1; } .ui.feed > .event > .label + .content { margin: 0.5em 0 0.35714286em 1.14285714em; } /* -------------- Content --------------- */ /* Content */ .ui.feed > .event > .content { display: block; flex: 1 1 auto; align-self: stretch; text-align: left; word-wrap: break-word; } .ui.feed > .event:last-child > .content { padding-bottom: 0; } /* Link */ .ui.feed > .event > .content a { cursor: pointer; } /* -------------- Date --------------- */ .ui.feed > .event > .content .date { margin: -0.5rem 0 0; padding: 0; color: rgba(0, 0, 0, 0.4); font-weight: normal; font-size: 1em; font-style: normal; } /* -------------- Summary --------------- */ .ui.feed > .event > .content .summary { margin: 0; font-size: 1em; font-weight: bold; color: rgba(0, 0, 0, 0.87); } /* Summary Image */ .ui.feed > .event > .content .summary img { display: inline-block; width: auto; height: 10em; margin: -0.25em 0.25em 0 0; border-radius: 0.25em; vertical-align: middle; } /* -------------- Inline Date --------------- */ /* Date inside Summary */ .ui.feed > .event > .content .summary > .date { display: inline-block; font-weight: normal; font-size: 0.85714286em; font-style: normal; margin: 0 0 0 0.5em; padding: 0; color: rgba(0, 0, 0, 0.4); } .ui.feed > .event > .content .summary > .date:not(.floated) { float: none; } /* -------------- User --------------- */ .ui.feed > .event > .content .user { display: inline-block; font-weight: bold; margin-right: 0; vertical-align: baseline; } .ui.feed > .event > .content .user img { margin: -0.25em 0.25em 0 0; width: auto; height: 10em; vertical-align: middle; } /* -------------- Extra Summary --------------- */ .ui.feed > .event > .content .extra { margin: 0.5em 0 0; background: none; padding: 0; color: rgba(0, 0, 0, 0.87); } /* Images */ .ui.feed > .event > .content .extra.images img { display: inline-block; margin: 0 0.25em 0 0; width: 6em; } /* Text */ .ui.feed > .event > .content .extra.text { padding: 0; border-left: none; font-size: 1em; max-width: 500px; line-height: 1.4285em; } /* -------------- Meta --------------- */ .ui.feed > .event > .content .meta { display: inline-block; font-size: 0.85714286em; margin: 0.5em 0 0; background: none; border: none; border-radius: 0; box-shadow: none; padding: 0; color: rgba(0, 0, 0, 0.6); } .ui.feed > .event > .content .meta > * { position: relative; margin-left: 0.75em; } .ui.feed > .event > .content .meta > *::after { content: ""; color: rgba(0, 0, 0, 0.2); top: 0; left: -1em; opacity: 1; position: absolute; vertical-align: top; } .ui.feed > .event > .content .meta .like { color: ""; transition: 0.2s color ease; } .ui.feed > .event > .content .meta .like:hover i.icon { color: #ff2733; } .ui.feed > .event > .content .meta .active.like i.icon { color: #ef404a; } /* First element */ .ui.feed > .event > .content .meta > :first-child { margin-left: 0; } .ui.feed > .event > .content .meta > :first-child::after { display: none; } /* Action */ .ui.feed > .event > .content .meta a, .ui.feed > .event > .content .meta > i.icon { cursor: pointer; opacity: 1; color: rgba(0, 0, 0, 0.5); transition: color 0.1s ease; } .ui.feed > .event > .content .meta a:hover, .ui.feed > .event > .content .meta a:hover i.icon, .ui.feed > .event > .content .meta > i.icon:hover { color: rgba(0, 0, 0, 0.95); } /******************************* Variations *******************************/ /* rtl:rename */ .ui.feed .right.floated { float: right; } .ui.connected.feed > .event { position: relative; } .ui.connected.feed > .event:not(:last-child)::before { border-left: 2px solid rgba(34, 36, 38, 0.15); content: ""; left: 1.2em; position: absolute; top: 2.1em; height: calc(100% - 1.5em); } .ui.connected.feed > .event > .label { position: relative; } .ui.inverted.connected.feed > .event::before { border-left-color: rgba(255, 255, 255, 0.1); } .ui.divided.feed > .event:not(:first-child) { border-top: 1px solid rgba(34, 36, 38, 0.15); } .ui.inverted.divided.feed > .event { border-top-color: rgba(255, 255, 255, 0.1); } .ui.ui.feed > .event > .label[data-text]::before { content: attr(data-text); } .ui.feed > .event > .label[data-text]::before, .ui.ordered.feed > .event > .label::before { text-align: center; line-height: 1; height: 2.5em; background: #bbbbbb; color: #fff; border-radius: 50%; padding-top: 0.6em; position: relative; display: block; margin-bottom: 0.3em; border: 2px solid transparent; } .ui.ordered.feed { counter-reset: ordered; } .ui.ordered.feed > .event > .label::before { counter-increment: ordered; content: counter(ordered); } .ui.ordered.basic.feed > .event > .label::before, .ui.ordered.feed > .event > .basic.label::before { border-color: #bbbbbb; color: inherit; background: transparent; } .ui.ordered.connected.feed > .event::before { top: 2.7em; height: calc(100% - 2.5em); } /* workaround until all browsers support :has() */ .ui.connected.labeled.feed > .event::before, .ui.connected.feed > .labeled.event::before { top: 4.85em; height: calc(100% - 4.6499999999999995em); } @supports selector(:has(.f)) { .ui.connected.feed > .event:has(> .label[data-text] > *)::before, .ui.ordered.connected.feed > .event:has(> .label > *)::before { top: 4.85em; height: calc(100% - 4.6499999999999995em); } } .ui.feed { font-size: 1rem; } .ui.mini.feed { font-size: 0.78571429rem; } .ui.tiny.feed { font-size: 0.85714286rem; } .ui.small.feed { font-size: 0.92857143rem; } .ui.large.feed { font-size: 1.14285714rem; } .ui.big.feed { font-size: 1.28571429rem; } .ui.huge.feed { font-size: 1.42857143rem; } .ui.massive.feed { font-size: 1.71428571rem; } /* ------------------ Inverted ------------------- */ .ui.inverted.feed > .event { background: #1b1c1d; } .ui.inverted.feed > .event > .label i.icon { color: rgba(255, 255, 255, 0.7); } .ui.inverted.feed > .event > .label .text:not(.ui) { color: #fff; } .ui.inverted.feed > .event > .content .date, .ui.inverted.feed > .event > .content .meta .like { color: rgba(255, 255, 255, 0.7); } .ui.inverted.feed > .event > .content .summary, .ui.inverted.feed > .event > .content .extra.text { color: rgba(255, 255, 255, 0.9); } .ui.inverted.feed > .event > .content .meta .like:hover { color: #ffffff; } .ui.inverted.feed > .event > .content .meta .active.like i.icon { color: rgba(255, 255, 255, 0.7); } /* Action */ .ui.inverted.feed > .event > .content .meta a, .ui.inverted.feed > .event > .content .meta > i.icon { color: rgba(255, 255, 255, 0.7); } .ui.inverted.feed > .event > .content .meta a:hover, .ui.inverted.feed > .event > .content .meta a:hover i.icon, .ui.inverted.feed > .event > .content .meta > i.icon:hover { color: #ffffff; } /* -------------- Colors --------------- */ .ui.ui.feed > .event > .primary.label::before, .ui.primary.feed > .event > .label::before { background: #2185d0; } .ui.primary.connected.feed > .event::before, .ui.connected.feed > .primary.event::before { border-color: #2185d0; } .ui.inverted.primary.connected.feed > .event::before, .ui.connected.feed > .inverted.primary.event::before { border-color: #54c8ff; } .ui.ui.feed > .event > .primary.basic.label::before, .ui.primary.basic.feed > .event > .label::before { color: #2185d0; } .ui.feed > .event > .inverted.primary.label::before, .ui.inverted.primary.feed > .event > .label::before { background: #54c8ff; } .ui.feed > .event > .inverted.primary.basic.label::before, .ui.inverted.primary.basic.feed > .event > .label::before { color: #54c8ff; } .ui.ui.feed > .event > .secondary.label::before, .ui.secondary.feed > .event > .label::before { background: #1b1c1d; } .ui.secondary.connected.feed > .event::before, .ui.connected.feed > .secondary.event::before { border-color: #1b1c1d; } .ui.inverted.secondary.connected.feed > .event::before, .ui.connected.feed > .inverted.secondary.event::before { border-color: #545454; } .ui.ui.feed > .event > .secondary.basic.label::before, .ui.secondary.basic.feed > .event > .label::before { color: #1b1c1d; } .ui.feed > .event > .inverted.secondary.label::before, .ui.inverted.secondary.feed > .event > .label::before { background: #545454; } .ui.feed > .event > .inverted.secondary.basic.label::before, .ui.inverted.secondary.basic.feed > .event > .label::before { color: #545454; } .ui.ui.feed > .event > .red.label::before, .ui.red.feed > .event > .label::before { background: #db2828; } .ui.red.connected.feed > .event::before, .ui.connected.feed > .red.event::before { border-color: #db2828; } .ui.inverted.red.connected.feed > .event::before, .ui.connected.feed > .inverted.red.event::before { border-color: #ff695e; } .ui.ui.feed > .event > .red.basic.label::before, .ui.red.basic.feed > .event > .label::before { color: #db2828; } .ui.feed > .event > .inverted.red.label::before, .ui.inverted.red.feed > .event > .label::before { background: #ff695e; } .ui.feed > .event > .inverted.red.basic.label::before, .ui.inverted.red.basic.feed > .event > .label::before { color: #ff695e; } .ui.ui.feed > .event > .orange.label::before, .ui.orange.feed > .event > .label::before { background: #f2711c; } .ui.orange.connected.feed > .event::before, .ui.connected.feed > .orange.event::before { border-color: #f2711c; } .ui.inverted.orange.connected.feed > .event::before, .ui.connected.feed > .inverted.orange.event::before { border-color: #ff851b; } .ui.ui.feed > .event > .orange.basic.label::before, .ui.orange.basic.feed > .event > .label::before { color: #f2711c; } .ui.feed > .event > .inverted.orange.label::before, .ui.inverted.orange.feed > .event > .label::before { background: #ff851b; } .ui.feed > .event > .inverted.orange.basic.label::before, .ui.inverted.orange.basic.feed > .event > .label::before { color: #ff851b; } .ui.ui.feed > .event > .yellow.label::before, .ui.yellow.feed > .event > .label::before { background: #fbbd08; } .ui.yellow.connected.feed > .event::before, .ui.connected.feed > .yellow.event::before { border-color: #fbbd08; } .ui.inverted.yellow.connected.feed > .event::before, .ui.connected.feed > .inverted.yellow.event::before { border-color: #ffe21f; } .ui.ui.feed > .event > .yellow.basic.label::before, .ui.yellow.basic.feed > .event > .label::before { color: #fbbd08; } .ui.feed > .event > .inverted.yellow.label::before, .ui.inverted.yellow.feed > .event > .label::before { background: #ffe21f; } .ui.feed > .event > .inverted.yellow.basic.label::before, .ui.inverted.yellow.basic.feed > .event > .label::before { color: #ffe21f; } .ui.ui.feed > .event > .olive.label::before, .ui.olive.feed > .event > .label::before { background: #b5cc18; } .ui.olive.connected.feed > .event::before, .ui.connected.feed > .olive.event::before { border-color: #b5cc18; } .ui.inverted.olive.connected.feed > .event::before, .ui.connected.feed > .inverted.olive.event::before { border-color: #d9e778; } .ui.ui.feed > .event > .olive.basic.label::before, .ui.olive.basic.feed > .event > .label::before { color: #b5cc18; } .ui.feed > .event > .inverted.olive.label::before, .ui.inverted.olive.feed > .event > .label::before { background: #d9e778; } .ui.feed > .event > .inverted.olive.basic.label::before, .ui.inverted.olive.basic.feed > .event > .label::before { color: #d9e778; } .ui.ui.feed > .event > .green.label::before, .ui.green.feed > .event > .label::before { background: #21ba45; } .ui.green.connected.feed > .event::before, .ui.connected.feed > .green.event::before { border-color: #21ba45; } .ui.inverted.green.connected.feed > .event::before, .ui.connected.feed > .inverted.green.event::before { border-color: #2ecc40; } .ui.ui.feed > .event > .green.basic.label::before, .ui.green.basic.feed > .event > .label::before { color: #21ba45; } .ui.feed > .event > .inverted.green.label::before, .ui.inverted.green.feed > .event > .label::before { background: #2ecc40; } .ui.feed > .event > .inverted.green.basic.label::before, .ui.inverted.green.basic.feed > .event > .label::before { color: #2ecc40; } .ui.ui.feed > .event > .teal.label::before, .ui.teal.feed > .event > .label::before { background: #00b5ad; } .ui.teal.connected.feed > .event::before, .ui.connected.feed > .teal.event::before { border-color: #00b5ad; } .ui.inverted.teal.connected.feed > .event::before, .ui.connected.feed > .inverted.teal.event::before { border-color: #6dffff; } .ui.ui.feed > .event > .teal.basic.label::before, .ui.teal.basic.feed > .event > .label::before { color: #00b5ad; } .ui.feed > .event > .inverted.teal.label::before, .ui.inverted.teal.feed > .event > .label::before { background: #6dffff; } .ui.feed > .event > .inverted.teal.basic.label::before, .ui.inverted.teal.basic.feed > .event > .label::before { color: #6dffff; } .ui.ui.feed > .event > .blue.label::before, .ui.blue.feed > .event > .label::before { background: #2185d0; } .ui.blue.connected.feed > .event::before, .ui.connected.feed > .blue.event::before { border-color: #2185d0; } .ui.inverted.blue.connected.feed > .event::before, .ui.connected.feed > .inverted.blue.event::before { border-color: #54c8ff; } .ui.ui.feed > .event > .blue.basic.label::before, .ui.blue.basic.feed > .event > .label::before { color: #2185d0; } .ui.feed > .event > .inverted.blue.label::before, .ui.inverted.blue.feed > .event > .label::before { background: #54c8ff; } .ui.feed > .event > .inverted.blue.basic.label::before, .ui.inverted.blue.basic.feed > .event > .label::before { color: #54c8ff; } .ui.ui.feed > .event > .violet.label::before, .ui.violet.feed > .event > .label::before { background: #6435c9; } .ui.violet.connected.feed > .event::before, .ui.connected.feed > .violet.event::before { border-color: #6435c9; } .ui.inverted.violet.connected.feed > .event::before, .ui.connected.feed > .inverted.violet.event::before { border-color: #a291fb; } .ui.ui.feed > .event > .violet.basic.label::before, .ui.violet.basic.feed > .event > .label::before { color: #6435c9; } .ui.feed > .event > .inverted.violet.label::before, .ui.inverted.violet.feed > .event > .label::before { background: #a291fb; } .ui.feed > .event > .inverted.violet.basic.label::before, .ui.inverted.violet.basic.feed > .event > .label::before { color: #a291fb; } .ui.ui.feed > .event > .purple.label::before, .ui.purple.feed > .event > .label::before { background: #a333c8; } .ui.purple.connected.feed > .event::before, .ui.connected.feed > .purple.event::before { border-color: #a333c8; } .ui.inverted.purple.connected.feed > .event::before, .ui.connected.feed > .inverted.purple.event::before { border-color: #dc73ff; } .ui.ui.feed > .event > .purple.basic.label::before, .ui.purple.basic.feed > .event > .label::before { color: #a333c8; } .ui.feed > .event > .inverted.purple.label::before, .ui.inverted.purple.feed > .event > .label::before { background: #dc73ff; } .ui.feed > .event > .inverted.purple.basic.label::before, .ui.inverted.purple.basic.feed > .event > .label::before { color: #dc73ff; } .ui.ui.feed > .event > .pink.label::before, .ui.pink.feed > .event > .label::before { background: #e03997; } .ui.pink.connected.feed > .event::before, .ui.connected.feed > .pink.event::before { border-color: #e03997; } .ui.inverted.pink.connected.feed > .event::before, .ui.connected.feed > .inverted.pink.event::before { border-color: #ff8edf; } .ui.ui.feed > .event > .pink.basic.label::before, .ui.pink.basic.feed > .event > .label::before { color: #e03997; } .ui.feed > .event > .inverted.pink.label::before, .ui.inverted.pink.feed > .event > .label::before { background: #ff8edf; } .ui.feed > .event > .inverted.pink.basic.label::before, .ui.inverted.pink.basic.feed > .event > .label::before { color: #ff8edf; } .ui.ui.feed > .event > .brown.label::before, .ui.brown.feed > .event > .label::before { background: #a5673f; } .ui.brown.connected.feed > .event::before, .ui.connected.feed > .brown.event::before { border-color: #a5673f; } .ui.inverted.brown.connected.feed > .event::before, .ui.connected.feed > .inverted.brown.event::before { border-color: #d67c1c; } .ui.ui.feed > .event > .brown.basic.label::before, .ui.brown.basic.feed > .event > .label::before { color: #a5673f; } .ui.feed > .event > .inverted.brown.label::before, .ui.inverted.brown.feed > .event > .label::before { background: #d67c1c; } .ui.feed > .event > .inverted.brown.basic.label::before, .ui.inverted.brown.basic.feed > .event > .label::before { color: #d67c1c; } .ui.ui.feed > .event > .grey.label::before, .ui.grey.feed > .event > .label::before { background: #767676; } .ui.grey.connected.feed > .event::before, .ui.connected.feed > .grey.event::before { border-color: #767676; } .ui.inverted.grey.connected.feed > .event::before, .ui.connected.feed > .inverted.grey.event::before { border-color: #dcddde; } .ui.ui.feed > .event > .grey.basic.label::before, .ui.grey.basic.feed > .event > .label::before { color: #767676; } .ui.feed > .event > .inverted.grey.label::before, .ui.inverted.grey.feed > .event > .label::before { background: #dcddde; } .ui.feed > .event > .inverted.grey.basic.label::before, .ui.inverted.grey.basic.feed > .event > .label::before { color: #dcddde; } .ui.ui.feed > .event > .black.label::before, .ui.black.feed > .event > .label::before { background: #1b1c1d; } .ui.black.connected.feed > .event::before, .ui.connected.feed > .black.event::before { border-color: #1b1c1d; } .ui.inverted.black.connected.feed > .event::before, .ui.connected.feed > .inverted.black.event::before { border-color: #545454; } .ui.ui.feed > .event > .black.basic.label::before, .ui.black.basic.feed > .event > .label::before { color: #1b1c1d; } .ui.feed > .event > .inverted.black.label::before, .ui.inverted.black.feed > .event > .label::before { background: #545454; } .ui.feed > .event > .inverted.black.basic.label::before, .ui.inverted.black.basic.feed > .event > .label::before { color: #545454; } .ui.ui.feed > .event > .basic.label::before, .ui.ui.ui.basic.feed > .event > .label::before { background: transparent; border-color: currentColor; } .ui.disabled.feed, .ui.feed .disabled.event { opacity: 0.45; pointer-events: none; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/flag.css ================================================ /*! * # Fomantic-UI 2.9.4 - Flag * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Flag *******************************/ i.flag:not(.icon) { speak: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; } i.flag:not(.icon)::before { content: "\00A0\00A0\00A0\00A0\00A0\00A0\00A0"; display: inline-block; line-height: 1em; background-repeat: no-repeat; background-position: center center; } i.flag.small { font-size: 1.5em; vertical-align: middle; } i.flag.medium { font-size: 3em; vertical-align: middle; } i.flag.large { font-size: 6em; vertical-align: middle; } i.flag.big { font-size: 7.5em; vertical-align: middle; } i.flag.huge { font-size: 9em; vertical-align: middle; } i.flag.massive { font-size: 12em; vertical-align: middle; } /* rtl:begin:ignore */ i.flag.transgender::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f3-fe0f-200d-26a7-fe0f.svg"); } i.flag.rainbow::before, i.flag.pride::before, i.flag.lgbt::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f3-fe0f-200d-1f308.svg"); } i.flag.pirate::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-200d-2620-fe0f.svg"); } i.flag.af::before, i.flag.afghanistan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1eb.svg"); } i.flag.ax::before, i.flag.aland.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fd.svg"); } i.flag.al::before, i.flag.albania::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f1.svg"); } i.flag.dz::before, i.flag.algeria::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ff.svg"); } i.flag.as::before, i.flag.american.samoa::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f8.svg"); } i.flag.ad::before, i.flag.andorra::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1e9.svg"); } i.flag.ao::before, i.flag.angola::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f4.svg"); } i.flag.ai::before, i.flag.anguilla::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ee.svg"); } i.flag.aq::before, i.flag.antarctica::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f6.svg"); } i.flag.ag::before, i.flag.antigua.and.barbuda::before, i.flag.antigua::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ec.svg"); } i.flag.ar::before, i.flag.argentina::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f7.svg"); } i.flag.am::before, i.flag.armenia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f2.svg"); } i.flag.aw::before, i.flag.aruba::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fc.svg"); } i.flag.au::before, i.flag.australia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1fa.svg"); } i.flag.at::before, i.flag.austria::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1f9.svg"); } i.flag.az::before, i.flag.azerbaijan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ff.svg"); } i.flag.bs::before, i.flag.bahamas::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f8.svg"); } i.flag.bh::before, i.flag.bahrain::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ed.svg"); } i.flag.bd::before, i.flag.bangladesh::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e9.svg"); } i.flag.bb::before, i.flag.barbados::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e7.svg"); } i.flag.by::before, i.flag.belarus::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fe.svg"); } i.flag.be::before, i.flag.belgium::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ea.svg"); } i.flag.bz::before, i.flag.belize::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ff.svg"); } i.flag.bj::before, i.flag.benin::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ef.svg"); } i.flag.bm::before, i.flag.bermuda::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f2.svg"); } i.flag.bt::before, i.flag.bhutan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f9.svg"); } i.flag.bo::before, i.flag.bolivia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f4.svg"); } i.flag.ba::before, i.flag.bosnia.and.herzegovina::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1e6.svg"); } i.flag.bw::before, i.flag.botswana::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fc.svg"); } i.flag.br::before, i.flag.brazil::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f7.svg"); } i.flag.io::before, i.flag.british.indian.ocean.territory::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f4.svg"); } i.flag.vg::before, i.flag.british.virgin.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ec.svg"); } i.flag.bn::before, i.flag.brunei::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f3.svg"); } i.flag.bg::before, i.flag.bulgaria::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ec.svg"); } i.flag.bf::before, i.flag.burkina.faso::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1eb.svg"); } i.flag.bi::before, i.flag.burundi::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1ee.svg"); } i.flag.kh::before, i.flag.cambodia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ed.svg"); } i.flag.cm::before, i.flag.cameroon::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f2.svg"); } i.flag.ca::before, i.flag.canada::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e6.svg"); } i.flag.ic::before, i.flag.canary.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1e8.svg"); } i.flag.cv::before, i.flag.cape.verde::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fb.svg"); } i.flag.bq::before, i.flag.caribbean.netherlands::before, i.flag.an::before, i.flag.netherlands.antilles::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f6.svg"); } i.flag.ky::before, i.flag.cayman.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1fe.svg"); } i.flag.cf::before, i.flag.central.african.republic::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1eb.svg"); } i.flag.td::before, i.flag.chad::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e9.svg"); } i.flag.cl::before, i.flag.chile::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f1.svg"); } i.flag.cn::before, i.flag.china::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f3.svg"); } i.flag.cx::before, i.flag.christmas.island::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fd.svg"); } i.flag.cc::before, i.flag.cocos.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e8.svg"); } i.flag.co::before, i.flag.colombia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f4.svg"); } i.flag.km::before, i.flag.comoros::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f2.svg"); } i.flag.cg::before, i.flag.congo.brazzaville::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ec.svg"); } i.flag.cd::before, i.flag.congo.kinshasa::before, i.flag.congo::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1e9.svg"); } i.flag.ck::before, i.flag.cook.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f0.svg"); } i.flag.cr::before, i.flag.costa.rica::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f7.svg"); } i.flag.ci::before, i.flag.côte.d’ivoire::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ee.svg"); } i.flag.hr::before, i.flag.croatia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f7.svg"); } i.flag.cu::before, i.flag.cuba::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fa.svg"); } i.flag.cw::before, i.flag.curacao::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fc.svg"); } i.flag.cy::before, i.flag.cyprus::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1fe.svg"); } i.flag.cz::before, i.flag.czechia::before, i.flag.czech.republic::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ff.svg"); } i.flag.dk::before, i.flag.denmark::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f0.svg"); } i.flag.dj::before, i.flag.djibouti::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ef.svg"); } i.flag.dm::before, i.flag.dominica::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f2.svg"); } i.flag.do::before, i.flag.dominican.republic::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1f4.svg"); } i.flag.ec::before, i.flag.ecuador::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1e8.svg"); } i.flag.eg::before, i.flag.egypt::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ec.svg"); } i.flag.sv::before, i.flag.el.salvador::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fb.svg"); } i.flag.gq::before, i.flag.equatorial.guinea::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f6.svg"); } i.flag.er::before, i.flag.eritrea::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f7.svg"); } i.flag.ee::before, i.flag.estonia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ea.svg"); } i.flag.et::before, i.flag.ethiopia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f9.svg"); } i.flag.eu::before, i.flag.european.union::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1fa.svg"); } i.flag.fk::before, i.flag.falkland.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f0.svg"); } i.flag.fo::before, i.flag.faroe.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f4.svg"); } i.flag.fj::before, i.flag.fiji::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1ef.svg"); } i.flag.fi::before, i.flag.finland::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1ee.svg"); } i.flag.fr::before, i.flag.france::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f7.svg"); } i.flag.gf::before, i.flag.french.guiana::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1eb.svg"); } i.flag.pf::before, i.flag.french.polynesia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1eb.svg"); } i.flag.tf::before, i.flag.french.southern.territories::before, i.flag.french.territories::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1eb.svg"); } i.flag.ga::before, i.flag.gabon::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e6.svg"); } i.flag.gm::before, i.flag.gambia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f2.svg"); } i.flag.ge::before, i.flag.georgia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ea.svg"); } i.flag.de::before, i.flag.germany::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ea.svg"); } i.flag.gh::before, i.flag.ghana::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ed.svg"); } i.flag.gi::before, i.flag.gibraltar::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ee.svg"); } i.flag.gr::before, i.flag.greece::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f7.svg"); } i.flag.gl::before, i.flag.greenland::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f1.svg"); } i.flag.gd::before, i.flag.grenada::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e9.svg"); } i.flag.gp::before, i.flag.guadeloupe::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f5.svg"); } i.flag.gu::before, i.flag.guam::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fa.svg"); } i.flag.gt::before, i.flag.guatemala::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f9.svg"); } i.flag.gg::before, i.flag.guernsey::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1ec.svg"); } i.flag.gn::before, i.flag.guinea::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f3.svg"); } i.flag.gw::before, i.flag.guinea-bissau::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fc.svg"); } i.flag.gy::before, i.flag.guyana::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1fe.svg"); } i.flag.ht::before, i.flag.haiti::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f9.svg"); } i.flag.hn::before, i.flag.honduras::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f3.svg"); } i.flag.hk::before, i.flag.hong.kong.sar.china::before, i.flag.hong.kong::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f0.svg"); } i.flag.hu::before, i.flag.hungary::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1fa.svg"); } i.flag.is::before, i.flag.iceland::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f8.svg"); } i.flag.in::before, i.flag.india::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f3.svg"); } i.flag.id::before, i.flag.indonesia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1e9.svg"); } i.flag.ir::before, i.flag.iran::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f7.svg"); } i.flag.iq::before, i.flag.iraq::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f6.svg"); } i.flag.ie::before, i.flag.ireland::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1ea.svg"); } i.flag.im::before, i.flag.isle.of.man::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f2.svg"); } i.flag.il::before, i.flag.israel::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f1.svg"); } i.flag.it::before, i.flag.italy::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ee-1f1f9.svg"); } i.flag.jm::before, i.flag.jamaica::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f2.svg"); } i.flag.jp::before, i.flag.japan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f5.svg"); } i.flag.je::before, i.flag.jersey::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1ea.svg"); } i.flag.jo::before, i.flag.jordan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ef-1f1f4.svg"); } i.flag.kz::before, i.flag.kazakhstan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ff.svg"); } i.flag.ke::before, i.flag.kenya::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ea.svg"); } i.flag.ki::before, i.flag.kiribati::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ee.svg"); } i.flag.xk::before, i.flag.kosovo::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fd-1f1f0.svg"); } i.flag.kw::before, i.flag.kuwait::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1fc.svg"); } i.flag.kg::before, i.flag.kyrgyzstan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1ec.svg"); } i.flag.la::before, i.flag.laos::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e6.svg"); } i.flag.lv::before, i.flag.latvia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fb.svg"); } i.flag.lb::before, i.flag.lebanon::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e7.svg"); } i.flag.ls::before, i.flag.lesotho::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f8.svg"); } i.flag.lr::before, i.flag.liberia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f7.svg"); } i.flag.ly::before, i.flag.libya::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fe.svg"); } i.flag.li::before, i.flag.liechtenstein::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1ee.svg"); } i.flag.lt::before, i.flag.lithuania::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f9.svg"); } i.flag.lu::before, i.flag.luxembourg::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1fa.svg"); } i.flag.mo::before, i.flag.macao.sar.china::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f4.svg"); } i.flag.mk::before, i.flag.republic.of.north.macedonia::before, i.flag.north.macedonia::before, i.flag.macedonia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f0.svg"); } i.flag.mg::before, i.flag.madagascar::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ec.svg"); } i.flag.mw::before, i.flag.malawi::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fc.svg"); } i.flag.my::before, i.flag.malaysia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fe.svg"); } i.flag.mv::before, i.flag.maldives::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fb.svg"); } i.flag.ml::before, i.flag.mali::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f1.svg"); } i.flag.mt::before, i.flag.malta::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f9.svg"); } i.flag.mh::before, i.flag.marshall.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ed.svg"); } i.flag.mq::before, i.flag.martinique::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f6.svg"); } i.flag.mr::before, i.flag.mauritania::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f7.svg"); } i.flag.mu::before, i.flag.mauritius::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fa.svg"); } i.flag.yt::before, i.flag.mayotte::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fe-1f1f9.svg"); } i.flag.mx::before, i.flag.mexico::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1fd.svg"); } i.flag.fm::before, i.flag.micronesia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1eb-1f1f2.svg"); } i.flag.md::before, i.flag.moldova::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e9.svg"); } i.flag.mc::before, i.flag.monaco::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e8.svg"); } i.flag.mn::before, i.flag.mongolia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f3.svg"); } i.flag.me::before, i.flag.montenegro::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ea.svg"); } i.flag.ms::before, i.flag.montserrat::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f8.svg"); } i.flag.ma::before, i.flag.morocco::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1e6.svg"); } i.flag.mz::before, i.flag.mozambique::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1ff.svg"); } i.flag.mm::before, i.flag.myanmar::before, i.flag.burma::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f2.svg"); } i.flag.na::before, i.flag.namibia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1e6.svg"); } i.flag.nr::before, i.flag.nauru::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f7.svg"); } i.flag.np::before, i.flag.nepal::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f5.svg"); } i.flag.nl::before, i.flag.netherlands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f1.svg"); } i.flag.nc::before, i.flag.new.caledonia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1e8.svg"); } i.flag.nz::before, i.flag.new.zealand::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ff.svg"); } i.flag.ni::before, i.flag.nicaragua::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ee.svg"); } i.flag.ne::before, i.flag.niger::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ea.svg"); } i.flag.ng::before, i.flag.nigeria::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1ec.svg"); } i.flag.nu::before, i.flag.niue::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1fa.svg"); } i.flag.nf::before, i.flag.norfolk.island::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1eb.svg"); } i.flag.kp::before, i.flag.north.korea::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f5.svg"); } i.flag.mp::before, i.flag.northern.mariana.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1f5.svg"); } i.flag.no::before, i.flag.norway::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f3-1f1f4.svg"); } i.flag.om::before, i.flag.oman::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f4-1f1f2.svg"); } i.flag.pk::before, i.flag.pakistan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f0.svg"); } i.flag.pw::before, i.flag.palau::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1fc.svg"); } i.flag.ps::before, i.flag.palestinian.territories::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f8.svg"); } i.flag.pa::before, i.flag.panama::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1e6.svg"); } i.flag.pg::before, i.flag.papua.new.guinea::before, i.flag.new.guinea::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ec.svg"); } i.flag.py::before, i.flag.paraguay::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1fe.svg"); } i.flag.pe::before, i.flag.peru::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ea.svg"); } i.flag.ph::before, i.flag.philippines::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1ed.svg"); } i.flag.pn::before, i.flag.pitcairn.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f3.svg"); } i.flag.pl::before, i.flag.poland::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f1.svg"); } i.flag.pt::before, i.flag.portugal::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f9.svg"); } i.flag.pr::before, i.flag.puerto.rico::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f7.svg"); } i.flag.qa::before, i.flag.qatar::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f6-1f1e6.svg"); } i.flag.re::before, i.flag.réunion::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1ea.svg"); } i.flag.ro::before, i.flag.romania::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1f4.svg"); } i.flag.ru::before, i.flag.russia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1fa.svg"); } i.flag.rw::before, i.flag.rwanda::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1fc.svg"); } i.flag.ws::before, i.flag.samoa::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fc-1f1f8.svg"); } i.flag.sm::before, i.flag.san.marino::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f2.svg"); } i.flag.st::before, i.flag.sao.tome.and.principe::before, i.flag.samo.tome::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f9.svg"); } i.flag.sa::before, i.flag.saudi.arabia::before, i.flag.saudiarabia::before, i.flag.saudi::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e6.svg"); } i.flag.sn::before, i.flag.senegal::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f3.svg"); } i.flag.rs::before, i.flag.serbia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f7-1f1f8.svg"); } i.flag.sc::before, i.flag.seychelles::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e8.svg"); } i.flag.sl::before, i.flag.sierra.leone::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f1.svg"); } i.flag.sg::before, i.flag.singapore::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ec.svg"); } i.flag.sx::before, i.flag.sint.maarten::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fd.svg"); } i.flag.sk::before, i.flag.slovakia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f0.svg"); } i.flag.si::before, i.flag.slovenia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ee.svg"); } i.flag.gs::before, i.flag.south.georgia.and.south.sandwich.islands::before, i.flag.sandwich.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1f8.svg"); } i.flag.sb::before, i.flag.solomon.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e7.svg"); } i.flag.so::before, i.flag.somalia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f4.svg"); } i.flag.za::before, i.flag.south.africa::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1e6.svg"); } i.flag.kr::before, i.flag.south.korea::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f7.svg"); } i.flag.ss::before, i.flag.south.sudan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f8.svg"); } i.flag.es::before, i.flag.spain::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1f8.svg"); } i.flag.lk::before, i.flag.sri.lanka::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1f0.svg"); } i.flag.bl::before, i.flag.st.barthelemy::before, i.flag.saint.barth::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1f1.svg"); } i.flag.sh::before, i.flag.st.helena::before, i.flag.saint.helena::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ed.svg"); } i.flag.kn::before, i.flag.st.kitts.and.nevis::before, i.flag.saint.kitts.and.navis::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f0-1f1f3.svg"); } i.flag.lc::before, i.flag.st.lucia::before, i.flag.saint.lucia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f1-1f1e8.svg"); } i.flag.pm::before, i.flag.st.pierre.and.miquelon::before, i.flag.saint.pierre::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f5-1f1f2.svg"); } i.flag.vc::before, i.flag.st.vincent.and.grenadines::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1e8.svg"); } i.flag.sd::before, i.flag.sudan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1e9.svg"); } i.flag.sr::before, i.flag.suriname::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1f7.svg"); } i.flag.sz::before, i.flag.eswatini::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ff.svg"); } i.flag.se::before, i.flag.sweden::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ea.svg"); } i.flag.ch::before, i.flag.switzerland::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1ed.svg"); } i.flag.sy::before, i.flag.syria::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1fe.svg"); } i.flag.tw::before, i.flag.taiwan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1fc.svg"); } i.flag.tj::before, i.flag.tajikistan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ef.svg"); } i.flag.tz::before, i.flag.tanzania::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ff.svg"); } i.flag.th::before, i.flag.thailand::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ed.svg"); } i.flag.tl::before, i.flag.timor-leste::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f1.svg"); } i.flag.tg::before, i.flag.togo::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1ec.svg"); } i.flag.tk::before, i.flag.tokelau::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f0.svg"); } i.flag.to::before, i.flag.tonga::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f4.svg"); } i.flag.tt::before, i.flag.trinidad.and.tobago::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f9.svg"); } i.flag.tn::before, i.flag.tunisia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f3.svg"); } i.flag.tr::before, i.flag.turkey::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f7.svg"); } i.flag.tm::before, i.flag.turkmenistan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1f2.svg"); } i.flag.tc::before, i.flag.turks.and.caicos.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e8.svg"); } i.flag.vi::before, i.flag.us.virgin.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ee.svg"); } i.flag.tv::before, i.flag.tuvalu::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1fb.svg"); } i.flag.ug::before, i.flag.uganda::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1ec.svg"); } i.flag.ua::before, i.flag.ukraine::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1e6.svg"); } i.flag.ae::before, i.flag.united.arab.emirates::before, i.flag.uae::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1ea.svg"); } i.flag.gb::before, i.flag.united.kingdom::before, i.flag.uk::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ec-1f1e7.svg"); } i.flag.gb.eng::before, i.flag.england::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg"); } i.flag.gb.sct::before, i.flag.scotland::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg"); } i.flag.gb.wls::before, i.flag.wales::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg"); } i.flag.us::before, i.flag.united.states::before, i.flag.america::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f8.svg"); } i.flag.uy::before, i.flag.uruguay::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1fe.svg"); } i.flag.uz::before, i.flag.uzbekistan::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1ff.svg"); } i.flag.vu::before, i.flag.vanuatu::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1fa.svg"); } i.flag.va::before, i.flag.vatican.city::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1e6.svg"); } i.flag.ve::before, i.flag.venezuela::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1ea.svg"); } i.flag.vn::before, i.flag.vietnam::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fb-1f1f3.svg"); } i.flag.wf::before, i.flag.wallis.and.futuna::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fc-1f1eb.svg"); } i.flag.eh::before, i.flag.western.sahara::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1ed.svg"); } i.flag.ye::before, i.flag.yemen::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fe-1f1ea.svg"); } i.flag.zm::before, i.flag.zambia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1f2.svg"); } i.flag.zw::before, i.flag.zimbabwe::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ff-1f1fc.svg"); } i.flag.ac::before, i.flag.ascension.island::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e6-1f1e8.svg"); } i.flag.bv::before, i.flag.bouvet.island::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e7-1f1fb.svg"); } i.flag.cp::before, i.flag.clipperton.island::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e8-1f1f5.svg"); } i.flag.ea::before, i.flag.ceuta.and.melilla::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ea-1f1e6.svg"); } i.flag.dg::before, i.flag.diego.garcia::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1e9-1f1ec.svg"); } i.flag.hm::before, i.flag.heard.and.mcdonald.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1ed-1f1f2.svg"); } i.flag.mf::before, i.flag.st.martin::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f2-1f1eb.svg"); } i.flag.sj::before, i.flag.svalbard.and.jan.mayen::before, i.flag.svalbard::before, i.flag.jan.mayen::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f8-1f1ef.svg"); } i.flag.ta::before, i.flag.tristan.da.cunha::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1f9-1f1e6.svg"); } i.flag.um::before, i.flag.us.outlying.islands::before, i.flag.minor.islands::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f2.svg"); } i.flag.un::before, i.flag.united.nations::before, i.flag.united.nations::before { background-image: url("https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f1fa-1f1f3.svg"); } /* rtl:end:ignore */ /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/flyout.css ================================================ /*! * # Fomantic-UI 2.9.4 - Flyout * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Flyout *******************************/ /* Flyout Menu */ .ui.flyout { position: fixed; top: 0; left: 0; -webkit-backface-visibility: hidden; backface-visibility: hidden; transition: none; will-change: transform; transform: translate3d(0, 0, 0); visibility: hidden; height: 100%; max-height: 100%; max-width: 100%; border-radius: 0; margin: 0; overflow-y: hidden; z-index: 102; background: #fff; outline: none; } /* GPU Layers for Child Elements */ .ui.flyout > * { -webkit-backface-visibility: hidden; backface-visibility: hidden; } /* -------------- Close --------------- */ .ui.flyout > .close { cursor: pointer; position: absolute; top: 1.25rem; right: 1.5rem; z-index: 1; opacity: 0.8; font-size: 1.25em; color: rgba(0, 0, 0, 0.85); width: 2.25rem; height: 2.25rem; padding: 0; margin: 0 0 0 0.25rem; text-align: right; } .ui.flyout > .close:focus, .ui.flyout > .close:hover { opacity: 1; outline: none; } /* -------------- Header --------------- */ .ui.flyout > .header { display: block; background: #fff; margin: 0; padding: 1.25rem 1.5rem; box-shadow: none; color: rgba(0, 0, 0, 0.85); border-bottom: 1px solid rgba(34, 36, 38, 0.15); } /* -------------- Content --------------- */ .ui.flyout > .content { display: block; width: 100%; font-size: 1em; line-height: 1.4; padding: 1.5rem; background: #fff; } .ui.flyout > .content.scrolling { overflow: auto; -ms-scroll-chaining: none; overscroll-behavior: none; } .ui.flyout.left > .content, .ui.flyout.right > .content { min-height: calc(100vh - 4.7rem); } .ui.flyout.left > .header + .content, .ui.flyout.right > .header + .content { min-height: calc(100vh - 9.1rem); } .ui.flyout.left > .scrolling.content, .ui.flyout.right > .scrolling.content { max-height: calc(100vh - 4.7rem); } .ui.flyout.left > .header + .scrolling.content, .ui.flyout.right > .header + .scrolling.content { max-height: calc(100vh - 9.1rem); } .ui.flyout.top > .scrolling.content, .ui.flyout.bottom > .scrolling.content { max-height: calc(80vh - 9.1rem); } /* -------------- Actions --------------- */ .ui.flyout > .actions { background: #f9fafb; padding: 1rem; border-top: 1px solid rgba(34, 36, 38, 0.15); text-align: right; } .ui.flyout .actions > .button:not(.fluid) { margin-left: 0.75em; } .ui.ui.flyout > .basic.actions { border-top: none; } .ui.flyout > .left.actions { text-align: left; } .ui.flyout > .left.actions > .button:not(.fluid) { margin-left: 0.5em; margin-right: 0.5em; } .ui.flyout > .centered, .ui.flyout > .center.aligned { text-align: center; } .ui.flyout > .centered.actions > .button:not(.fluid), .ui.flyout > .center.aligned.actions > .button:not(.fluid) { margin-left: 0.5em; margin-right: 0.5em; } .ui.ui.flyout > .basic.header, .ui.ui.flyout > .basic.actions { background-color: transparent; } .ui.flyout > .basic.header { border-bottom: none; } /* -------------- Direction --------------- */ .ui.left.flyout { right: auto; left: 0; transform: translate3d(-100%, 0, 0); } .ui.right.flyout { right: 0; left: auto; transform: translate3d(100%, 0, 0); } .ui.top.flyout, .ui.bottom.flyout { width: 100%; height: auto; } .ui.top.flyout { top: 0; bottom: auto; transform: translate3d(0, -100%, 0); } .ui.bottom.flyout { top: auto; bottom: 0; transform: translate3d(0, 100%, 0); } /* -------------- Pushable --------------- */ .pushable.pushable.pushable { height: 100%; overflow-x: hidden; padding: 0; } .pushable.pushable.pushable.locked { overflow-y: hidden; background: inherit; } /* Whole Page */ body.pushable { background: #545454; } body.pushable.dimmed { background: inherit; } /* Page Context */ .pushable:not(body) { transform: translate3d(0, 0, 0); overflow-y: hidden; } .pushable:not(body) > .ui.flyout, .pushable:not(body) > .fixed, .pushable:not(body) > .pusher::after { position: absolute; } /* -------------- Fixed --------------- */ .pushable > .fixed { position: fixed; -webkit-backface-visibility: hidden; backface-visibility: hidden; transition: transform 500ms ease; will-change: transform; z-index: 101; } /* -------------- Page --------------- */ .pushable > .pusher { position: relative; -webkit-backface-visibility: hidden; backface-visibility: hidden; min-height: 100%; transition: transform 500ms ease; z-index: 2; /* Pusher should inherit background from context */ background: inherit; } .pushable > .pusher:not(.overflowing) { overflow: hidden; } body.pushable > .pusher { background: #fff; } /* -------------- Dimmer --------------- */ .pushable > .pusher::after { position: fixed; top: 0; right: 0; content: ""; background: rgba(0, 0, 0, 0.4); overflow: hidden; opacity: 0; transition: all 500ms; will-change: opacity; z-index: 1000; } /* -------------- Coupling --------------- */ .ui.flyout.menu .item { border-radius: 0 !important; } /******************************* States *******************************/ /* -------------- Dimmed --------------- */ .pushable > .pusher.dimmed::after { width: 100% !important; height: 100% !important; opacity: 1 !important; } .pushable > .pusher.dimmed.blurring:not(.closing)::after { background: rgba(0, 0, 0, 0.6); -webkit-backdrop-filter: blur(5px) grayscale(0.7); backdrop-filter: blur(5px) grayscale(0.7); } .pushable > .pusher.closing.dimmed::after { opacity: 0 !important; } /* -------------- Animating --------------- */ .ui.animating.flyout { visibility: visible; } /* -------------- Visible --------------- */ .ui.visible.flyout { visibility: visible; transform: translate3d(0, 0, 0); } /* Shadow Direction */ .ui.left.visible.flyout, .ui.right.visible.flyout { box-shadow: 0 0 20px rgba(34, 36, 38, 0.15); } .ui.top.visible.flyout, .ui.bottom.visible.flyout { box-shadow: 0 0 20px rgba(34, 36, 38, 0.15); } /* Visible On Load */ .ui.visible.left.flyout ~ .fixed, .ui.visible.left.flyout ~ .pusher { transform: translate3d(400px, 0, 0); } .ui.visible.right.flyout ~ .fixed, .ui.visible.right.flyout ~ .pusher { transform: translate3d(-400px, 0, 0); } .ui.visible.top.flyout ~ .fixed, .ui.visible.top.flyout ~ .pusher { transform: translate3d(0, 36px, 0); } .ui.visible.bottom.flyout ~ .fixed, .ui.visible.bottom.flyout ~ .pusher { transform: translate3d(0, -36px, 0); } /* opposite sides visible forces content overlay */ .ui.visible.left.flyout ~ .ui.visible.right.flyout ~ .fixed, .ui.visible.left.flyout ~ .ui.visible.right.flyout ~ .pusher, .ui.visible.right.flyout ~ .ui.visible.left.flyout ~ .fixed, .ui.visible.right.flyout ~ .ui.visible.left.flyout ~ .pusher { transform: translate3d(0, 0, 0); } /* -------------- Inverted --------------- */ .ui.flyout.inverted { background: #000; } .ui.flyout.inverted > .close { color: #fff; } .ui.flyout.inverted > .header, .ui.flyout.inverted > .content { background: #000; color: #fff; } .ui.flyout.inverted > .actions { background: #191a1b; border-top: 1px solid rgba(34, 36, 38, 0.85); color: #fff; } /******************************* Variations *******************************/ /* -------------- Width --------------- */ /* Left / Right */ .ui.left.flyout, .ui.right.flyout { width: 400px; } .ui.thin.left.flyout, .ui.thin.right.flyout { width: 200px; } .ui[class*="very thin"].left.flyout, .ui[class*="very thin"].right.flyout { width: 120px; } .ui.wide.left.flyout, .ui.wide.right.flyout { width: 600px; } .ui[class*="very wide"].left.flyout, .ui[class*="very wide"].right.flyout { width: 800px; } /* Left Visible */ .ui.visible.thin.left.flyout ~ .fixed, .ui.visible.thin.left.flyout ~ .pusher { transform: translate3d(200px, 0, 0); } .ui.visible[class*="very thin"].left.flyout ~ .fixed, .ui.visible[class*="very thin"].left.flyout ~ .pusher { transform: translate3d(120px, 0, 0); } .ui.visible.wide.left.flyout ~ .fixed, .ui.visible.wide.left.flyout ~ .pusher { transform: translate3d(600px, 0, 0); } .ui.visible[class*="very wide"].left.flyout ~ .fixed, .ui.visible[class*="very wide"].left.flyout ~ .pusher { transform: translate3d(800px, 0, 0); } /* Right Visible */ .ui.visible.thin.right.flyout ~ .fixed, .ui.visible.thin.right.flyout ~ .pusher { transform: translate3d(-200px, 0, 0); } .ui.visible[class*="very thin"].right.flyout ~ .fixed, .ui.visible[class*="very thin"].right.flyout ~ .pusher { transform: translate3d(-120px, 0, 0); } .ui.visible.wide.right.flyout ~ .fixed, .ui.visible.wide.right.flyout ~ .pusher { transform: translate3d(-600px, 0, 0); } .ui.visible[class*="very wide"].right.flyout ~ .fixed, .ui.visible[class*="very wide"].right.flyout ~ .pusher { transform: translate3d(-800px, 0, 0); } /* Fullscreen */ .ui.fullscreen.flyout { width: 100%; } /* ------------------- Column Width -------------------- */ /* Sizing Combinations */ .ui[class*="one wide"].flyout:not(.fullscreen) { width: 6.25%; } .ui[class*="two wide"].flyout:not(.fullscreen) { width: 12.5%; } .ui[class*="three wide"].flyout:not(.fullscreen) { width: 18.75%; } .ui[class*="four wide"].flyout:not(.fullscreen) { width: 25%; } .ui[class*="five wide"].flyout:not(.fullscreen) { width: 31.25%; } .ui[class*="six wide"].flyout:not(.fullscreen) { width: 37.5%; } .ui[class*="seven wide"].flyout:not(.fullscreen) { width: 43.75%; } .ui[class*="eight wide"].flyout:not(.fullscreen) { width: 50%; } .ui[class*="nine wide"].flyout:not(.fullscreen) { width: 56.25%; } .ui[class*="ten wide"].flyout:not(.fullscreen) { width: 62.5%; } .ui[class*="eleven wide"].flyout:not(.fullscreen) { width: 68.75%; } .ui[class*="twelve wide"].flyout:not(.fullscreen) { width: 75%; } .ui[class*="thirteen wide"].flyout:not(.fullscreen) { width: 81.25%; } .ui[class*="fourteen wide"].flyout:not(.fullscreen) { width: 87.5%; } .ui[class*="fifteen wide"].flyout:not(.fullscreen) { width: 93.75%; } .ui[class*="sixteen wide"].flyout:not(.fullscreen) { width: 100%; } /******************************* Animations *******************************/ /* -------------- Overlay --------------- */ /* Set-up */ .ui.overlay.flyout { z-index: 102; } /* Initial */ .ui.left.overlay.flyout { transform: translate3d(-100%, 0, 0); } .ui.right.overlay.flyout { transform: translate3d(100%, 0, 0); } .ui.top.overlay.flyout { transform: translate3d(0, -100%, 0); } .ui.bottom.overlay.flyout { transform: translate3d(0, 100%, 0); } /* Animation */ .animating.ui.overlay.flyout, .ui.visible.overlay.flyout { transition: transform 500ms ease; } /* End - flyout */ .ui.visible.overlay.flyout { transform: translate3d(0, 0, 0); } /* End - Pusher */ .ui.visible.overlay.flyout ~ .fixed, .ui.visible.overlay.flyout ~ .pusher { transform: none !important; } /******************************* Theme Overrides *******************************/ /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/flyout.js ================================================ /*! * # Fomantic-UI 2.9.4 - Flyout * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.flyout = function (parameters) { var $allModules = $(this), $window = $(window), $document = $(document), $html = $('html'), $head = $('head'), $body = $('body'), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $body; } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : $body; } } return $context; }, returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.flyout.settings, parameters) : $.extend({}, $.fn.flyout.settings), selector = settings.selector, className = settings.className, namespace = settings.namespace, fields = settings.fields, regExp = settings.regExp, error = settings.error, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $context = contextCheck(settings.context, window), $closeIcon = $module.find(selector.close), $inputs, $focusedElement, $flyouts = $module.children(selector.flyout), $pusher = $context.children(selector.pusher), $style, isFlyoutComponent = $module.hasClass('flyout'), element = this, instance = isFlyoutComponent ? $module.data(moduleNamespace) : undefined, ignoreRepeatedEvents = false, isBody = $context[0] === $body[0], initialBodyMargin = '', tempBodyMargin = '', hadScrollbar = false, windowRefocused = false, elementNamespace, id, observer, observeAttributes = false, currentScroll, module ; module = { initialize: function () { module.debug('Initializing flyout', parameters); module.create.id(); if (!isFlyoutComponent) { module.create.flyout(); if (!isFunction(settings.onHidden)) { settings.onHidden = function () { module.destroy(); $module.remove(); }; } if (!settings.autoShow) { settings.autoShow = true; } } $module.addClass(settings.class); if (settings.title !== '') { $module.find(selector.header).html(module.helpers.escape(settings.title, settings.preserveHTML)).addClass(settings.classTitle); } if (settings.content !== '') { $module.find(selector.content).html(module.helpers.escape(settings.content, settings.preserveHTML)).addClass(settings.classContent); } if (module.has.configActions()) { var $actions = $module.find(selector.actions).addClass(settings.classActions); if ($actions.length === 0) { $actions = $('<div/>', { class: className.actions + ' ' + (settings.classActions || '') }).appendTo($module); } else { $actions.empty(); } settings.actions.forEach(function (el) { var icon = el[fields.icon] ? '<i ' + (el[fields.text] ? 'aria-hidden="true"' : '') + ' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '', text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML), cls = module.helpers.deQuote(el[fields.class] || ''), click = el[fields.click] && isFunction(el[fields.click]) ? el[fields.click] : function () {} ; $actions.append($('<button/>', { html: icon + text, 'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g, ''), class: className.button + ' ' + cls, on: { click: function () { if (click.call(element, $module) === false) { return; } module.hide(); }, }, })); }); } // avoids locking rendering if initialized in onReady if (settings.delaySetup) { requestAnimationFrame(module.setup.layout); } else { module.setup.layout(); } requestAnimationFrame(function () { module.setup.cache(); }); if (module.get.direction() === 'left' || module.get.direction() === 'right') { module.setup.heights(); module.bind.resize(); } module.bind.events(); module.observeChanges(); module.instantiate(); if (settings.autoShow) { module.show(); } }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, instance) ; }, create: { flyout: function () { module.verbose('Programmaticaly create flyout', $context); $module = $('<div/>', { class: className.flyout, role: 'dialog', 'aria-modal': settings.dimPage }); if (settings.closeIcon) { $closeIcon = $('<i/>', { class: className.close, role: 'button', tabindex: 0, 'aria-label': settings.text.close, }); $module.append($closeIcon); } if (settings.title !== '') { var titleId = '_' + module.get.id() + 'title'; $module.attr('aria-labelledby', titleId); $('<div/>', { class: className.header, id: titleId }).appendTo($module); } if (settings.content !== '') { var descId = '_' + module.get.id() + 'desc'; $module.attr('aria-describedby', descId); $('<div/>', { class: className.content, id: descId }).appendTo($module); } if (module.has.configActions()) { $('<div/>', { class: className.actions }).appendTo($module); } $module.prependTo($context); element = $module[0]; }, id: function () { id = (Math.random().toString(16) + '000000000').slice(2, 10); elementNamespace = '.' + id; module.verbose('Creating unique id for element', id); }, }, destroy: function () { if (observer) { observer.disconnect(); } module.verbose('Destroying previous module for', $module); $module .off(eventNamespace) .removeData(moduleNamespace) ; $closeIcon.off(elementNamespace); if ($inputs) { $inputs.off(elementNamespace); } // bound by uuid $context.off(elementNamespace); $window.off(elementNamespace); $document.off(elementNamespace); }, event: { keyboard: function (event) { var keyCode = event.which ; if (keyCode === settings.keys.escape) { if (settings.closable) { module.debug('Escape key pressed hiding flyout'); module.hide(); } else { module.debug('Escape key pressed, but closable is set to false'); } event.preventDefault(); } }, resize: function () { module.setup.heights(); }, focus: function () { windowRefocused = true; }, click: function (event) { if (windowRefocused && document.activeElement !== event.target && module.is.visible() && settings.autofocus && settings.dimPage && $(document.activeElement).closest(selector.flyout).length === 0) { requestAnimationFrame(module.set.autofocus); } windowRefocused = false; }, clickaway: function (event) { if (settings.closable) { var clickedInPusher = $pusher.find(event.target).length > 0 || $pusher.is(event.target), clickedContext = $context.is(event.target) ; if (clickedInPusher) { module.verbose('User clicked on dimmed page'); module.hide(); } if (clickedContext) { module.verbose('User clicked on dimmable context (scaled out page)'); module.hide(); } } }, close: function (event) { module.hide(); }, closeKeyUp: function (event) { var keyCode = event.which ; if (keyCode === settings.keys.enter || keyCode === settings.keys.space) { module.hide(); } }, inputKeyDown: { first: function (event) { var keyCode = event.which ; if (keyCode === settings.keys.tab && event.shiftKey) { $inputs.last().trigger('focus'); event.preventDefault(); } }, last: function (event) { var keyCode = event.which ; if (keyCode === settings.keys.tab && !event.shiftKey) { $inputs.first().trigger('focus'); event.preventDefault(); } }, }, approve: function (event) { if (ignoreRepeatedEvents || settings.onApprove.call(module.element, $(this)) === false) { module.verbose('Approve callback returned false cancelling close'); return; } ignoreRepeatedEvents = true; module.hide(function () { ignoreRepeatedEvents = false; }); }, deny: function (event) { if (ignoreRepeatedEvents || settings.onDeny.call(module.element, $(this)) === false) { module.verbose('Deny callback returned false cancelling close'); return; } ignoreRepeatedEvents = true; module.hide(function () { ignoreRepeatedEvents = false; }); }, touch: function (event) { // event.stopPropagation(); }, containScroll: function (event) { if (element.scrollTop <= 0) { element.scrollTop = 1; } if ((element.scrollTop + element.offsetHeight) >= element.scrollHeight) { element.scrollTop = element.scrollHeight - element.offsetHeight - 1; } }, scroll: function (event) { if ($(event.target).closest(selector.flyout).length === 0) { event.preventDefault(); } }, }, bind: { resize: function () { module.verbose('Adding resize event to window', $window); $window.on('resize' + elementNamespace, module.event.resize); }, events: function () { module.verbose('Attaching events'); $module .on('click' + eventNamespace, selector.close, module.event.close) .on('click' + eventNamespace, selector.approve, module.event.approve) .on('click' + eventNamespace, selector.deny, module.event.deny) ; $closeIcon .on('keyup' + elementNamespace, module.event.closeKeyUp) ; $window .on('focus' + elementNamespace, module.event.focus) ; $context .on('click' + elementNamespace, module.event.click) ; }, clickaway: function () { module.verbose('Adding clickaway events to context', $context); $context .on('click' + elementNamespace, module.event.clickaway) .on('touchend' + elementNamespace, module.event.clickaway) ; }, scrollLock: function () { if (settings.scrollLock) { module.debug('Disabling page scroll'); hadScrollbar = module.has.scrollbar(); if (hadScrollbar) { module.save.bodyMargin(); module.set.bodyMargin(); } $context.addClass(className.locked); } module.verbose('Adding events to contain flyout scroll'); $document .on('touchmove' + elementNamespace, module.event.touch) ; $module .on('scroll' + eventNamespace, module.event.containScroll) ; }, }, unbind: { clickaway: function () { module.verbose('Removing clickaway events from context', $context); $context.off(elementNamespace); }, scrollLock: function () { module.verbose('Removing scroll lock from page'); if (hadScrollbar) { module.restore.bodyMargin(); } $context.removeClass(className.locked); $document.off(elementNamespace); $module.off('scroll' + eventNamespace); }, }, add: { inlineCSS: function () { var width = module.cache.width || $module.outerWidth(), height = module.cache.height || $module.outerHeight(), isRTL = module.is.rtl(), direction = module.get.direction(), distance = { left: width, right: -width, top: height, bottom: -height, }, style ; if (isRTL) { module.verbose('RTL detected, flipping widths'); distance.left = -width; distance.right = width; } style = '<style>'; if (direction === 'left' || direction === 'right') { module.debug('Adding CSS rules for animation distance', width); style += '' + ' .ui.visible.' + direction + '.flyout ~ .fixed,' + ' .ui.visible.' + direction + '.flyout ~ .pusher {' + ' transform: translate3d(' + distance[direction] + 'px, 0, 0);' + ' }'; } else if (direction === 'top' || direction === 'bottom') { style += '' + ' .ui.visible.' + direction + '.flyout ~ .fixed,' + ' .ui.visible.' + direction + '.flyout ~ .pusher {' + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);' + ' }'; } /* IE is only browser not to create context with transforms */ /* https://www.w3.org/Bugs/Public/show_bug.cgi?id=16328 */ if (module.is.ie()) { if (direction === 'left' || direction === 'right') { module.debug('Adding CSS rules for animation distance', width); style += '' + ' body.pushable > .ui.visible.' + direction + '.flyout ~ .pusher::after {' + ' transform: translate3d(' + distance[direction] + 'px, 0, 0);' + ' }'; } else if (direction === 'top' || direction === 'bottom') { style += '' + ' body.pushable > .ui.visible.' + direction + '.flyout ~ .pusher::after {' + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);' + ' }'; } /* opposite sides visible forces content overlay */ style += '' + ' body.pushable > .ui.visible.left.flyout ~ .ui.visible.right.flyout ~ .pusher::after,' + ' body.pushable > .ui.visible.right.flyout ~ .ui.visible.left.flyout ~ .pusher::after {' + ' transform: translate3d(0, 0, 0);' + ' }'; } style += '</style>'; $style = $(style) .appendTo($head) ; module.debug('Adding sizing css to head', $style); }, keyboardShortcuts: function () { module.verbose('Adding keyboard shortcuts'); $document .on('keydown' + eventNamespace, module.event.keyboard) ; }, }, observeChanges: function () { if ('MutationObserver' in window) { observer = new MutationObserver(function (mutations) { var collectNodes = function (parent) { var nodes = []; for (var c = 0, cl = parent.length; c < cl; c++) { Array.prototype.push.apply(nodes, collectNodes(parent[c].childNodes)); nodes.push(parent[c]); } return nodes; }, shouldRefreshInputs = false, ignoreAutofocus = true ; mutations.every(function (mutation) { if (mutation.type === 'attributes') { if (observeAttributes && (mutation.attributeName === 'disabled' || $(mutation.target).find(':input').addBack(':input').filter(':visible').length > 0)) { shouldRefreshInputs = true; } } else { // mutationobserver only provides the parent nodes // so let's collect all childs as well to find nested inputs var $addedInputs = $(collectNodes(mutation.addedNodes)).filter('a[href], [tabindex], :input:enabled').filter(':visible'), $removedInputs = $(collectNodes(mutation.removedNodes)).filter('a[href], [tabindex], :input'); if ($addedInputs.length > 0 || $removedInputs.length > 0) { shouldRefreshInputs = true; if ($addedInputs.filter(':input').length > 0 || $removedInputs.filter(':input').length > 0) { ignoreAutofocus = false; } } } return !shouldRefreshInputs; }); if (shouldRefreshInputs) { module.refreshInputs(ignoreAutofocus); } }); observer.observe(element, { attributeFilter: ['class', 'disabled'], attributes: true, childList: true, subtree: true, }); module.debug('Setting up mutation observer', observer); } }, refresh: function () { module.verbose('Refreshing selector cache'); $context = contextCheck(settings.context, window); module.refreshFlyouts(); $pusher = $context.children(selector.pusher); module.clear.cache(); }, refreshFlyouts: function () { module.verbose('Refreshing other flyouts'); $flyouts = $context.children(selector.flyout); }, refreshInputs: function (ignoreAutofocus) { if ($inputs) { $inputs .off('keydown' + elementNamespace) ; } if (!settings.dimPage) { return; } $inputs = $module.find('a[href], [tabindex], :input:enabled').filter(':visible').filter(function () { return $(this).closest('.disabled').length === 0; }); if ($inputs.filter(':input').length === 0) { $inputs = $module.add($inputs); $module.attr('tabindex', -1); } else { $module.removeAttr('tabindex'); } $inputs.first() .on('keydown' + elementNamespace, module.event.inputKeyDown.first) ; $inputs.last() .on('keydown' + elementNamespace, module.event.inputKeyDown.last) ; if (!ignoreAutofocus && settings.autofocus && $inputs.filter(':focus').length === 0) { module.set.autofocus(); } }, setup: { cache: function () { module.cache = { width: $module.outerWidth(), height: $module.outerHeight(), }; }, layout: function () { if ($context.children(selector.pusher).length === 0) { module.debug('Adding wrapper element for flyout'); module.error(error.pusher); $pusher = $('<div class="pusher" />'); $context .children() .not(selector.omitted) .not($flyouts) .wrapAll($pusher) ; module.refresh(); } if ($module.nextAll(selector.pusher).length === 0 || $module.nextAll(selector.pusher)[0] !== $pusher[0]) { module.debug('Moved flyout to correct parent element'); module.error(error.movedFlyout, element); $module.detach().prependTo($context); module.refresh(); } if (module.is.mobile()) { $module.addClass(className.fullscreen); } module.clear.cache(); module.set.pushable(); module.set.direction(); }, heights: function () { module.debug('Setting up heights', $module); var $header = $module.children(selector.header), $content = $module.children(selector.content), $actions = $module.children(selector.actions), newContentHeight = ($context.height() || 0) - ($header.outerHeight() || 0) - ($actions.outerHeight() || 0) ; if (newContentHeight > 0) { $content.css('min-height', String(newContentHeight) + 'px'); } }, }, attachEvents: function (selector, event) { var $toggle = $(selector) ; event = isFunction(module[event]) ? module[event] : module.toggle; if ($toggle.length > 0) { module.debug('Attaching flyout events to element', selector, event); $toggle .on('click' + eventNamespace, event) ; } else { module.error(error.notFound, selector); } }, show: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (module.is.hidden()) { if (settings.onShow.call(element) === false) { module.verbose('Show callback returned false cancelling show'); return; } module.refresh(); if (module.othersActive()) { module.debug('Other flyouts currently visible'); if (settings.exclusive) { module.hideOthers(); } else { ignoreRepeatedEvents = false; } } module.set.dimmerStyles(); module.set.observeAttributes(false); module.pushPage(function () { callback.call(element); settings.onVisible.call(element); if (settings.keyboardShortcuts) { module.add.keyboardShortcuts(); } module.save.focus(); module.refreshInputs(); requestAnimationFrame(module.set.observeAttributes); }); settings.onChange.call(element); } else { module.debug('Flyout is already visible'); } }, hide: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (settings.onHide.call(element, $(this)) === false) { module.verbose('Hide callback returned false cancelling hide'); ignoreRepeatedEvents = false; return false; } if (module.is.visible() || module.is.animating()) { module.debug('Hiding flyout', callback); module.refreshFlyouts(); module.set.observeAttributes(false); module.pullPage(function () { callback.call(element); if (isFunction(settings.onHidden)) { settings.onHidden.call(element); } module.restore.focus(); }); settings.onChange.call(element); } }, othersAnimating: function () { return $flyouts.not($module).filter('.' + className.animating).length > 0; }, othersVisible: function () { return $flyouts.not($module).filter('.' + className.visible).length > 0; }, othersActive: function () { return module.othersVisible() || module.othersAnimating(); }, hideOthers: function (callback) { var $otherFlyouts = $flyouts.not($module).filter('.' + className.visible), flyoutCount = $otherFlyouts.length, callbackCount = 0 ; callback = callback || function () {}; $otherFlyouts .flyout('hide', function () { callbackCount++; if (callbackCount === flyoutCount) { callback(); } }) ; }, toggle: function () { module.verbose('Determining toggled direction'); if (module.is.hidden()) { module.show(); } else { module.hide(); } }, pushPage: function (callback) { var animate, dim, transitionEnd ; callback = isFunction(callback) ? callback : function () {}; module.set.overlay(); if (settings.returnScroll) { currentScroll = (isBody ? $window : $context).scrollTop(); } module.bind.scrollLock(); animate = function () { module.bind.clickaway(); module.add.inlineCSS(); module.set.animating(); module.set.visible(); }; dim = function () { module.set.dimmed(); }; transitionEnd = function (event) { if (event.target === $module[0]) { $module.off('transitionend' + elementNamespace, transitionEnd); module.remove.animating(); callback.call(element); } }; $module.off('transitionend' + elementNamespace); $module.on('transitionend' + elementNamespace, transitionEnd); requestAnimationFrame(animate); if (settings.dimPage && !module.othersVisible()) { requestAnimationFrame(dim); } }, pullPage: function (callback) { var animate, transitionEnd ; callback = isFunction(callback) ? callback : function () {}; module.verbose('Removing context push state', module.get.direction()); module.unbind.clickaway(); if (!module.othersActive()) { module.unbind.scrollLock(); if (settings.keyboardShortcuts) { module.remove.keyboardShortcuts(); } } animate = function () { module.set.overlay(); module.set.animating(); if (settings.dimPage && !module.othersVisible()) { module.set.closing(); } module.remove.visible(); }; transitionEnd = function (event) { if (event.target === $module[0]) { $module.off('transitionend' + elementNamespace, transitionEnd); module.remove.animating(); module.remove.closing(); module.remove.overlay(); module.remove.inlineCSS(); if (settings.returnScroll) { module.scrollBack(); } if (settings.dimPage && !module.othersVisible()) { $pusher.removeClass(className.dimmed); } callback.call(element); } }; $module.off('transitionend' + elementNamespace); $module.on('transitionend' + elementNamespace, transitionEnd); requestAnimationFrame(animate); }, scrollToTop: function () { module.verbose('Scrolling to top of page to avoid animation issues'); $module.scrollTop(0); (isBody ? $window : $context)[0].scrollTo(0, 0); }, scrollBack: function () { module.verbose('Scrolling back to original page position'); (isBody ? $window : $context)[0].scrollTo(0, currentScroll); }, clear: { cache: function () { module.verbose('Clearing cached dimensions'); module.cache = {}; }, }, set: { observeAttributes: function (state) { observeAttributes = state !== false; }, autofocus: function () { var $autofocus = $inputs.filter('[autofocus]'), $rawInputs = $inputs.filter(':input'), $input = ($autofocus.length > 0 ? $autofocus : ($rawInputs.length > 0 ? $rawInputs : $module) ).first() ; $input.trigger('focus'); }, dimmerStyles: function () { if (settings.blurring) { $pusher.addClass(className.blurring); } else { $pusher.removeClass(className.blurring); } }, bodyMargin: function () { var position = module.can.leftBodyScrollbar() ? 'left' : 'right'; $context.css((isBody ? 'margin-' : 'padding-') + position, tempBodyMargin + 'px'); $context.find(selector.bodyFixed.replace('right', position)).each(function () { var el = $(this), attribute = el.css('position') === 'fixed' ? 'padding-' + position : position ; el.css(attribute, 'calc(' + el.css(attribute) + ' + ' + tempBodyMargin + 'px)'); }); }, // container pushed: function () { $context.addClass(className.pushed); }, pushable: function () { $context.addClass(className.pushable); }, // pusher dimmed: function () { $pusher.addClass(className.dimmed); }, // flyout active: function () { $module.addClass(className.active); }, animating: function () { $module.addClass(className.animating); }, closing: function () { $pusher.addClass(className.closing); }, direction: function (direction) { direction = direction || module.get.direction(); $module.addClass(className[direction]); }, visible: function () { $module.addClass(className.visible); }, overlay: function () { $module.addClass(className.overlay); }, }, remove: { inlineCSS: function () { module.debug('Removing inline css styles', $style); if ($style && $style.length > 0) { $style.remove(); } }, keyboardShortcuts: function () { module.verbose('Removing keyboard shortcuts'); $document .off('keydown' + eventNamespace) ; }, // context pushed: function () { $context.removeClass(className.pushed); }, pushable: function () { $context.removeClass(className.pushable); }, // flyout active: function () { $module.removeClass(className.active); }, animating: function () { $module.removeClass(className.animating); }, closing: function () { $pusher.removeClass(className.closing); }, direction: function (direction) { direction = direction || module.get.direction(); $module.removeClass(className[direction]); }, visible: function () { $module.removeClass(className.visible); }, overlay: function () { $module.removeClass(className.overlay); }, }, get: { direction: function () { if ($module.hasClass(className.top)) { return className.top; } if ($module.hasClass(className.right)) { return className.right; } if ($module.hasClass(className.bottom)) { return className.bottom; } return className.left; }, id: function () { return id; }, element: function () { return $module; }, settings: function () { return settings; }, }, can: { leftBodyScrollbar: function () { if (module.cache.leftBodyScrollbar === undefined) { module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie()); } return module.cache.leftBodyScrollbar; }, }, save: { focus: function () { var $activeElement = $(document.activeElement), inCurrentFlyout = $activeElement.closest($module).length > 0 ; if (!inCurrentFlyout) { $focusedElement = $(document.activeElement).trigger('blur'); } }, bodyMargin: function () { initialBodyMargin = $context.css((isBody ? 'margin-' : 'padding-') + (module.can.leftBodyScrollbar() ? 'left' : 'right')); var bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\d.]/g, ''), 10), bodyScrollbarWidth = isBody ? window.innerWidth - document.documentElement.clientWidth : $context[0].offsetWidth - $context[0].clientWidth ; tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth; }, }, is: { safari: function () { if (module.cache.isSafari === undefined) { module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession; } return module.cache.isSafari; }, edge: function () { if (module.cache.isEdge === undefined) { module.cache.isEdge = !!window.setImmediate && !module.is.ie(); } return module.cache.isEdge; }, firefox: function () { if (module.cache.isFirefox === undefined) { module.cache.isFirefox = !!window.InstallTrigger; } return module.cache.isFirefox; }, iframe: function () { return !(self === top); }, ie: function () { if (module.cache.isIE === undefined) { var isIE11 = !window.ActiveXObject && 'ActiveXObject' in window, isIE = 'ActiveXObject' in window ; module.cache.isIE = isIE11 || isIE; } return module.cache.isIE; }, mobile: function () { var userAgent = navigator.userAgent, isMobile = userAgent.match(regExp.mobile) ; if (isMobile) { module.verbose('Browser was found to be mobile', userAgent); return true; } module.verbose('Browser is not mobile, using regular transition', userAgent); return false; }, hidden: function () { return !module.is.visible(); }, visible: function () { return $module.hasClass(className.visible); }, animating: function () { return $context.hasClass(className.animating); }, rtl: function () { if (module.cache.isRTL === undefined) { module.cache.isRTL = $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl' || $body.attr('dir') === 'rtl' || $body.css('direction') === 'rtl' || $context.attr('dir') === 'rtl' || $context.css('direction') === 'rtl'; } return module.cache.isRTL; }, }, has: { configActions: function () { return Array.isArray(settings.actions) && settings.actions.length > 0; }, scrollbar: function () { return isBody || $context.css('overflow-y') !== 'hidden'; }, }, restore: { focus: function () { if ($focusedElement && $focusedElement.length > 0 && settings.restoreFocus) { $focusedElement.trigger('focus'); } }, bodyMargin: function () { var position = module.can.leftBodyScrollbar() ? 'left' : 'right'; $context.css((isBody ? 'margin-' : 'padding-') + position, initialBodyMargin); $context.find(selector.bodyFixed.replace('right', position)).each(function () { var el = $(this), attribute = el.css('position') === 'fixed' ? 'padding-' + position : position ; el.css(attribute, ''); }); }, }, helpers: { deQuote: function (string) { return String(string).replace(/"/g, ''); }, escape: function (string, preserveHTML) { if (preserveHTML) { return string; } var badChars = /["'<>`]/g, shouldEscape = /["&'<>`]/, escape = { '<': '<', '>': '>', '"': '"', "'": ''', '`': '`', }, escapedChar = function (chr) { return escape[chr]; } ; if (shouldEscape.test(string)) { string = string.replace(/&(?![\d#a-z]{1,12};)/gi, '&'); return string.replace(badChars, escapedChar); } return string; }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = element || context; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { if (isFunction(settings.templates[query])) { settings.autoShow = true; settings.className.flyout = settings.className.template; settings = $.extend(true, {}, settings, settings.templates[query].apply(module, queryArguments)); // reassign shortcuts className = settings.className; namespace = settings.namespace; fields = settings.fields; error = settings.error; } module.initialize(); } if (!isFunction(settings.templates[query])) { module.invoke(query); } } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); returnedValue = $module; } }); return returnedValue !== undefined ? returnedValue : this; }; $.flyout = $.fn.flyout; $.fn.flyout.settings = { name: 'Flyout', namespace: 'flyout', silent: false, debug: false, verbose: false, performance: true, context: 'body', exclusive: false, closable: true, autofocus: true, restoreFocus: true, dimPage: true, scrollLock: false, returnScroll: false, delaySetup: false, autoShow: false, keyboardShortcuts: true, // dynamic content title: '', content: '', class: '', classTitle: '', classContent: '', classActions: '', closeIcon: false, actions: false, preserveHTML: true, fields: { class: 'class', text: 'text', icon: 'icon', click: 'click', }, onChange: function () {}, onShow: function () {}, onHide: function () { return true; }, onHidden: false, onVisible: function () {}, onApprove: function () {}, onDeny: function () {}, keys: { space: 32, enter: 13, escape: 27, tab: 9, }, className: { flyout: 'ui flyout', close: 'close icon', header: 'ui header', content: 'content', actions: 'actions', active: 'active', animating: 'animating', blurring: 'blurring', closing: 'closing', dimmed: 'dimmed', locked: 'locked', pushable: 'pushable', pushed: 'pushed', right: 'right', top: 'top', left: 'left', bottom: 'bottom', visible: 'visible', overlay: 'overlay', fullscreen: 'fullscreen', template: 'ui flyout', button: 'ui button', ok: 'positive', cancel: 'negative', prompt: 'ui fluid input', }, selector: { bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.right.flyout, > .ui.fixed.nag, > .ui.fixed.nag > .close', fixed: '.fixed', omitted: 'script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed', pusher: '.pusher', flyout: '.ui.flyout', header: '.ui.header', content: '.content', actions: '.actions', close: '.close', approve: '.actions .positive, .actions .approve, .actions .ok', deny: '.actions .negative, .actions .deny, .actions .cancel', }, regExp: { mobile: /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/g, }, error: { method: 'The method you called is not defined.', pusher: 'Had to add pusher element. For optimal performance make sure body content is inside a pusher element', movedFlyout: 'Had to move flyout. For optimal performance make sure flyout and pusher are direct children of your body tag', notFound: 'There were no elements that matched the specified selector', }, text: { ok: 'Ok', cancel: 'Cancel', close: 'Close', }, }; $.fn.flyout.settings.templates = { getArguments: function (args) { var queryArguments = [].slice.call(args); if ($.isPlainObject(queryArguments[0])) { return $.extend({ handler: function () {}, content: '', title: '', }, queryArguments[0]); } if (!isFunction(queryArguments[queryArguments.length - 1])) { queryArguments.push(function () {}); } return { handler: queryArguments.pop(), content: queryArguments.pop() || '', title: queryArguments.pop() || '', }; }, alert: function () { var settings = this.get.settings(), args = settings.templates.getArguments(arguments) ; return { title: args.title, content: args.content, actions: [{ text: settings.text.ok, class: settings.className.ok, click: args.handler, }], }; }, confirm: function () { var settings = this.get.settings(), args = settings.templates.getArguments(arguments) ; return { title: args.title, content: args.content, actions: [{ text: settings.text.ok, class: settings.className.ok, click: function () { args.handler(true); }, }, { text: settings.text.cancel, class: settings.className.cancel, click: function () { args.handler(false); }, }], }; }, prompt: function () { var $this = this, settings = this.get.settings(), args = settings.templates.getArguments(arguments), input = $($.parseHTML(args.content)).filter('.ui.input') ; if (input.length === 0) { args.content += '<p><div class="' + settings.className.prompt + '"><input placeholder="' + this.helpers.deQuote(args.placeholder || '') + '" type="text" value="' + this.helpers.deQuote(args.defaultValue || '') + '"></div></p>'; } return { title: args.title, content: args.content, actions: [{ text: settings.text.ok, class: settings.className.ok, click: function () { var settings = $this.get.settings(), inputField = $this.get.element().find(settings.selector.prompt)[0] ; args.handler($(inputField).val()); }, }, { text: settings.text.cancel, class: settings.className.cancel, click: function () { args.handler(null); }, }], }; }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/form.css ================================================ /*! * # Fomantic-UI 2.9.4 - Form * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Elements *******************************/ /* -------------------- Form --------------------- */ .ui.form { position: relative; max-width: 100%; } /* -------------------- Content --------------------- */ .ui.form > p { margin: 1em 0; } /* -------------------- Field --------------------- */ .ui.form .field { clear: both; margin: 0 0 1em; } .ui.form .fields .fields, .ui.form .field:last-child, .ui.form .fields:last-child .field { margin-bottom: 0; } .ui.form .fields .field { clear: both; margin: 0; } /* -------------------- Labels --------------------- */ .ui.form .field > label { display: block; margin: 0 0 0.28571429rem 0; font-size: 0.92857143em; font-weight: bold; text-transform: none; } .ui.form:not(.inverted) .field > label:not(.button) { color: rgba(0, 0, 0, 0.87); } /* -------------------- Standard Inputs --------------------- */ .ui.form textarea, .ui.form input:not([type]), .ui.form input[type="color"], .ui.form input[type="date"], .ui.form input[type="datetime-local"], .ui.form input[type="email"], .ui.form input[type="month"], .ui.form input[type="number"], .ui.form input[type="password"], .ui.form input[type="search"], .ui.form input[type="tel"], .ui.form input[type="time"], .ui.form input[type="text"], .ui.form input[type="file"], .ui.form input[type="url"], .ui.form input[type="week"] { width: 100%; vertical-align: top; } /* Set max height on unusual input */ .ui.form ::-webkit-datetime-edit, .ui.form ::-webkit-inner-spin-button { height: 1.21428571em; } .ui.form input:not([type]), .ui.form input[type="color"], .ui.form input[type="date"], .ui.form input[type="datetime-local"], .ui.form input[type="email"], .ui.form input[type="month"], .ui.form input[type="number"], .ui.form input[type="password"], .ui.form input[type="search"], .ui.form input[type="tel"], .ui.form input[type="time"], .ui.form input[type="text"], .ui.form input[type="file"], .ui.form input[type="url"], .ui.form input[type="week"] { font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; margin: 0; outline: none; -webkit-appearance: none; -webkit-tap-highlight-color: rgba(255, 255, 255, 0); line-height: 1.21428571em; padding: 0.67857143em 1em; font-size: 1em; background: #fff; border: 1px solid rgba(34, 36, 38, 0.15); color: rgba(0, 0, 0, 0.87); border-radius: 0.28571429rem; box-shadow: 0 0 0 0 transparent inset; transition: color 0.1s ease, border-color 0.1s ease; } .ui.form input[type="color"] { padding: initial; } .ui.form input::-webkit-calendar-picker-indicator { padding: 0; opacity: 0.5; -webkit-transition: opacity 0.3s ease; transition: opacity 0.3s ease; cursor: pointer; } /* Text Area */ .ui.input textarea, .ui.form textarea { margin: 0; -webkit-appearance: none; -webkit-tap-highlight-color: rgba(255, 255, 255, 0); padding: 0.78571429em 1em; background: #fff; border: 1px solid rgba(34, 36, 38, 0.15); outline: none; color: rgba(0, 0, 0, 0.87); border-radius: 0.28571429rem; box-shadow: 0 0 0 0 transparent inset; transition: color 0.1s ease, border-color 0.1s ease; font-size: 1em; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; line-height: 1.2857; resize: vertical; min-height: 2.99992857em; } .ui.input > textarea { flex: 1 1 auto; max-width: 100%; } .ui.form textarea:not([rows]) { height: 12em; min-height: 8em; max-height: 24em; } .ui.form textarea, .ui.form input[type="checkbox"] { vertical-align: top; } /* -------------------- Checkbox margin --------------------- */ .ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) label + .ui.ui.checkbox { margin-top: 0.7em; } .ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.checkbox { margin-top: 2.41428571em; } .ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.toggle.checkbox { margin-top: 2.21428571em; } .ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.slider.checkbox { margin-top: 2.61428571em; } .ui.ui.form .field .fields .field:not(:only-child) .ui.checkbox { margin-top: 0.6em; } .ui.ui.form .field .fields .field:not(:only-child) .ui.toggle.checkbox { margin-top: 0.5em; } .ui.ui.form .field .fields .field:not(:only-child) .ui.slider.checkbox { margin-top: 0.7em; } /* -------------------- Transparent --------------------- */ .ui.form .field .transparent.input:not(.icon) input, .ui.form .field input.transparent, .ui.form .field textarea.transparent { padding: 0.67857143em 1em; } .ui.form .field input.transparent, .ui.form .field textarea.transparent { border-color: transparent !important; background-color: transparent !important; box-shadow: none !important; } /* -------------------------- Input w/ attached Button --------------------------- */ .ui.form input.attached { width: auto; } /* -------------------- Basic Select --------------------- */ .ui.form select { display: block; height: auto; width: 100%; background: #fff; border: 1px solid rgba(34, 36, 38, 0.15); border-radius: 0.28571429rem; box-shadow: 0 0 0 0 transparent inset; padding: 0.62em 1em; color: rgba(0, 0, 0, 0.87); transition: color 0.1s ease, border-color 0.1s ease; } /* -------------------- Dropdown --------------------- */ /* Block */ .ui.form .field > .selection.dropdown:not(.compact) { min-width: auto; width: 100%; } .ui.form .field > .selection.dropdown > .dropdown.icon { float: right; } /* Inline */ .ui.form .inline.fields .field > .selection.dropdown, .ui.form .inline.field > .selection.dropdown { width: auto; } .ui.form .inline.fields .field > .selection.dropdown > .dropdown.icon, .ui.form .inline.field > .selection.dropdown > .dropdown.icon { float: none; } /* -------------------- UI Input --------------------- */ /* Block */ .ui.form .field .ui.input, .ui.form .fields .field .ui.input, .ui.form .wide.field .ui.input { width: 100%; } /* Inline */ .ui.form .inline.fields .field:not(.wide) .ui.input, .ui.form .inline.field:not(.wide) .ui.input { width: auto; vertical-align: middle; } /* Auto Input */ .ui.form .fields .field .ui.input input, .ui.form .fields .field .ui.input textarea, .ui.form .field .ui.input input, .ui.form .field .ui.input textarea { width: 100%; } /* Full Width Input */ .ui.form .ten.fields .ui.input input, .ui.form .nine.fields .ui.input input, .ui.form .eight.fields .ui.input input, .ui.form .seven.fields .ui.input input, .ui.form .six.fields .ui.input input, .ui.form .five.fields .ui.input input, .ui.form .four.fields .ui.input input, .ui.form .three.fields .ui.input input, .ui.form .two.fields .ui.input input, .ui.form .wide.field .ui.input input { flex: 1 0 auto; width: 0; } /* -------------------- Types of Messages --------------------- */ .ui.form .error.message, .ui.form .error.message:empty { display: none; } .ui.form .info.message, .ui.form .info.message:empty { display: none; } .ui.form .success.message, .ui.form .success.message:empty { display: none; } .ui.form .warning.message, .ui.form .warning.message:empty { display: none; } /* Assumptions */ .ui.form .message:first-child { margin-top: 0; } /* -------------------- Validation Prompt --------------------- */ .ui.form .field .prompt.label { white-space: normal; background: #fff !important; border: 1px solid #e0b4b4 !important; color: #9f3a38 !important; } .ui.form .field .prompt.label li::before { color: #9f3a38; } .ui.form .inline.fields .field .prompt, .ui.form .inline.field .prompt { vertical-align: top; margin: -0.25em 0 -0.5em 0.5em; } .ui.form .inline.fields .field .prompt::before, .ui.form .inline.field .prompt::before { border-width: 0 0 1px 1px; bottom: auto; right: auto; top: 50%; left: 0; } /******************************* States *******************************/ /* -------------------- Autofilled --------------------- */ .ui.form .field.field input:-webkit-autofill { box-shadow: 0 0 0 100px #fffff0 inset !important; border-color: #e5dfa1 !important; } /* Focus */ .ui.form .field.field input:-webkit-autofill:focus { box-shadow: 0 0 0 100px #fffff0 inset !important; border-color: #d5c315 !important; } /* -------------------- Placeholder --------------------- */ /* browsers require these rules separate */ .ui.form :-ms-input-placeholder { color: rgba(191, 191, 191, 0.87); } .ui.form ::-ms-input-placeholder { color: rgba(191, 191, 191, 0.87); } .ui.form ::placeholder { color: rgba(191, 191, 191, 0.87); } .ui.form :-ms-input-placeholder { color: rgba(191, 191, 191, 0.87) !important; } .ui.form :focus:-ms-input-placeholder { color: rgba(115, 115, 115, 0.87); } .ui.form :focus::-ms-input-placeholder { color: rgba(115, 115, 115, 0.87); } .ui.form :focus::placeholder { color: rgba(115, 115, 115, 0.87); } .ui.form :focus:-ms-input-placeholder { color: rgba(115, 115, 115, 0.87) !important; } /* -------------------- Focus --------------------- */ .ui.form input:not([type]):focus, .ui.form input[type="color"]:focus, .ui.form input[type="date"]:focus, .ui.form input[type="datetime-local"]:focus, .ui.form input[type="email"]:focus, .ui.form input[type="month"]:focus, .ui.form input[type="number"]:focus, .ui.form input[type="password"]:focus, .ui.form input[type="search"]:focus, .ui.form input[type="tel"]:focus, .ui.form input[type="time"]:focus, .ui.form input[type="text"]:focus, .ui.form input[type="file"]:focus, .ui.form input[type="url"]:focus, .ui.form input[type="week"]:focus { color: rgba(0, 0, 0, 0.95); border-color: #85b7d9; border-radius: 0.28571429rem; background: #fff; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.35) inset; } .ui.form .ui.action.input:not([class*="left action"]) input:not([type]):focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="color"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="date"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="datetime-local"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="email"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="month"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="number"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="password"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="search"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="tel"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="time"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="text"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="file"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="url"]:focus, .ui.form .ui.action.input:not([class*="left action"]) input[type="week"]:focus, .ui.form .ui.action.input:not([class*="left action"]) textarea:focus { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ui.form .ui[class*="left action"].input input:not([type]), .ui.form .ui[class*="left action"].input input[type="color"], .ui.form .ui[class*="left action"].input input[type="date"], .ui.form .ui[class*="left action"].input input[type="datetime-local"], .ui.form .ui[class*="left action"].input input[type="email"], .ui.form .ui[class*="left action"].input input[type="month"], .ui.form .ui[class*="left action"].input input[type="number"], .ui.form .ui[class*="left action"].input input[type="password"], .ui.form .ui[class*="left action"].input input[type="search"], .ui.form .ui[class*="left action"].input input[type="tel"], .ui.form .ui[class*="left action"].input input[type="time"], .ui.form .ui[class*="left action"].input input[type="text"], .ui.form .ui[class*="left action"].input input[type="file"], .ui.form .ui[class*="left action"].input input[type="url"], .ui.form .ui[class*="left action"].input input[type="week"], .ui.form .ui[class*="left action"].input textarea { border-bottom-left-radius: 0; border-top-left-radius: 0; } .ui.form textarea:focus { color: rgba(0, 0, 0, 0.95); border-color: #85b7d9; border-radius: 0.28571429rem; background: #fff; box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.35) inset; -webkit-appearance: none; } /* Focus */ .ui.form input:focus::-webkit-calendar-picker-indicator { opacity: 1; } /* -------------------- States --------------------- */ /* On Form */ .ui.form.error .error.message:not(:empty) { display: block; } .ui.form.error .compact.error.message:not(:empty) { display: inline-block; } .ui.form.error .icon.error.message:not(:empty) { display: flex; } /* On Field(s) */ .ui.form .fields.error .error.message:not(:empty), .ui.form .field.error .error.message:not(:empty) { display: block; } .ui.form .fields.error .compact.error.message:not(:empty), .ui.form .field.error .compact.error.message:not(:empty) { display: inline-block; } .ui.form .fields.error .icon.error.message:not(:empty), .ui.form .field.error .icon.error.message:not(:empty) { display: flex; } .ui.ui.form .fields.error .field label, .ui.ui.form .fields.error .field .ui.label:not(.corner), .ui.ui.form .field.error label, .ui.ui.form .field.error .ui.label:not(.corner), .ui.ui.form .fields.error .field .input, .ui.ui.form .field.error .input { color: #9f3a38; } @supports selector(:has(.f)) { .ui.form .fields:has(.error) > label { color: #9f3a38; } } .ui.form .fields.error .field .ui.label, .ui.form .field.error .ui.label { background-color: #ecd1d1; } .ui.form .fields.error .field .corner.label, .ui.form .field.error .corner.label { border-color: #9f3a38; color: #fff; } .ui.form .fields.error .field textarea, .ui.form .fields.error .field select, .ui.form .fields.error .field input:not([type]), .ui.form .fields.error .field input[type="color"], .ui.form .fields.error .field input[type="date"], .ui.form .fields.error .field input[type="datetime-local"], .ui.form .fields.error .field input[type="email"], .ui.form .fields.error .field input[type="month"], .ui.form .fields.error .field input[type="number"], .ui.form .fields.error .field input[type="password"], .ui.form .fields.error .field input[type="search"], .ui.form .fields.error .field input[type="tel"], .ui.form .fields.error .field input[type="time"], .ui.form .fields.error .field input[type="text"], .ui.form .fields.error .field input[type="file"], .ui.form .fields.error .field input[type="url"], .ui.form .fields.error .field input[type="week"], .ui.form .field.error textarea, .ui.form .field.error select, .ui.form .field.error input:not([type]), .ui.form .field.error input[type="color"], .ui.form .field.error input[type="date"], .ui.form .field.error input[type="datetime-local"], .ui.form .field.error input[type="email"], .ui.form .field.error input[type="month"], .ui.form .field.error input[type="number"], .ui.form .field.error input[type="password"], .ui.form .field.error input[type="search"], .ui.form .field.error input[type="tel"], .ui.form .field.error input[type="time"], .ui.form .field.error input[type="text"], .ui.form .field.error input[type="file"], .ui.form .field.error input[type="url"], .ui.form .field.error input[type="week"] { color: #9f3a38; background: #fff6f6; border-color: #e0b4b4; border-radius: ""; box-shadow: none; } .ui.form:not(.initial) .field input:invalid { color: #9f3a38; background: #fff6f6; border-color: #e0b4b4; border-radius: ""; box-shadow: none; } .ui.form .field.error textarea:focus, .ui.form .field.error select:focus, .ui.form .field.error input:not([type]):focus, .ui.form .field.error input[type="color"]:focus, .ui.form .field.error input[type="date"]:focus, .ui.form .field.error input[type="datetime-local"]:focus, .ui.form .field.error input[type="email"]:focus, .ui.form .field.error input[type="month"]:focus, .ui.form .field.error input[type="number"]:focus, .ui.form .field.error input[type="password"]:focus, .ui.form .field.error input[type="search"]:focus, .ui.form .field.error input[type="tel"]:focus, .ui.form .field.error input[type="time"]:focus, .ui.form .field.error input[type="text"]:focus, .ui.form .field.error input[type="file"]:focus, .ui.form .field.error input[type="url"]:focus, .ui.form .field.error input[type="week"]:focus { background: #fff6f6; border-color: #e0b4b4; color: #9f3a38; box-shadow: none; } .ui.form .field.error > textarea:hover:not(:focus), .ui.form .field.error > input:hover:not(:focus) { border-color: #e0b4b4; } /* Preserve Native Select Stylings */ .ui.form .field.error select { -webkit-appearance: menulist-button; } /*------------------ Input State --------------------*/ /* Transparent */ .ui.form .field.error .transparent.input input, .ui.form .field.error .transparent.input textarea, .ui.form .field.error input.transparent, .ui.form .field.error textarea.transparent { background-color: #fff6f6 !important; color: #9f3a38 !important; } /* Autofilled */ .ui.form .error.error input:-webkit-autofill { box-shadow: 0 0 0 100px #fffaf0 inset !important; border-color: #e0b4b4 !important; } /* Placeholder */ .ui.form .error :-ms-input-placeholder { color: #e7bdbc; } .ui.form .error ::-ms-input-placeholder { color: #e7bdbc; } .ui.form .error .ui.dropdown > .default.text, .ui.form .error ::placeholder { color: #e7bdbc; } .ui.form .error :-ms-input-placeholder { color: #e7bdbc !important; } .ui.form .error :focus:-ms-input-placeholder { color: #da9796; } .ui.form .error :focus::-ms-input-placeholder { color: #da9796; } .ui.form .error .ui.dropdown > input:focus ~ .default.text, .ui.form .error :focus::placeholder { color: #da9796; } .ui.form .error :focus:-ms-input-placeholder { color: #da9796 !important; } /*------------------ Dropdown State --------------------*/ .ui.form .fields.error .field .ui.dropdown, .ui.form .fields.error .field .ui.dropdown .item, .ui.form .field.error .ui.dropdown, .ui.form .field.error .ui.dropdown > .text, .ui.form .field.error .ui.dropdown .item { background: #fff6f6; color: #9f3a38; } .ui.form .fields.error .field .ui.dropdown, .ui.form .field.error .ui.dropdown { border-color: #e0b4b4 !important; } .ui.form .fields.error .field .ui.dropdown:hover, .ui.form .field.error .ui.dropdown:hover { border-color: #e0b4b4 !important; } .ui.form .fields.error .field .ui.dropdown:hover .menu, .ui.form .field.error .ui.dropdown:hover .menu { border-color: #e0b4b4; } .ui.form .fields.error .field .ui.multiple.selection.dropdown > .label, .ui.form .field.error .ui.multiple.selection.dropdown > .label { background-color: #eacbcb; color: #9f3a38; } /* Hover */ .ui.form .fields.error .field .ui.dropdown .menu .item:hover, .ui.form .field.error .ui.dropdown .menu .item:hover { background-color: #fbe7e7; } /* Selected */ .ui.form .fields.error .field .ui.dropdown .menu .selected.item, .ui.form .field.error .ui.dropdown .menu .selected.item { background-color: #fbe7e7; } /* Active */ .ui.form .fields.error .field .ui.dropdown .menu .active.item, .ui.form .field.error .ui.dropdown .menu .active.item { background-color: #fdcfcf !important; } /*-------------------- Checkbox State ---------------------*/ .ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label, .ui.form .field.error .checkbox:not(.toggle):not(.slider) label { color: #9f3a38; } .ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label::before, .ui.form .field.error .checkbox:not(.toggle):not(.slider) label::before { background: #fff6f6; border-color: #e0b4b4; } .ui.form .fields.error .field .checkbox label::after, .ui.form .field.error .checkbox label::after { color: #9f3a38; } .ui.inverted.form .fields.error .field label, .ui.inverted.form .error.field label { color: #ecd1d1; } @supports selector(:has(.f)) { .ui.inverted.form .fields:has(.error) > label { color: #ecd1d1; } } /* On Form */ .ui.form.info .info.message:not(:empty) { display: block; } .ui.form.info .compact.info.message:not(:empty) { display: inline-block; } .ui.form.info .icon.info.message:not(:empty) { display: flex; } /* On Field(s) */ .ui.form .fields.info .info.message:not(:empty), .ui.form .field.info .info.message:not(:empty) { display: block; } .ui.form .fields.info .compact.info.message:not(:empty), .ui.form .field.info .compact.info.message:not(:empty) { display: inline-block; } .ui.form .fields.info .icon.info.message:not(:empty), .ui.form .field.info .icon.info.message:not(:empty) { display: flex; } .ui.ui.form .fields.info .field label, .ui.ui.form .fields.info .field .ui.label:not(.corner), .ui.ui.form .field.info label, .ui.ui.form .field.info .ui.label:not(.corner), .ui.ui.form .fields.info .field .input, .ui.ui.form .field.info .input { color: #276f86; } @supports selector(:has(.f)) { .ui.form .fields:has(.info) > label { color: #276f86; } } .ui.form .fields.info .field .ui.label, .ui.form .field.info .ui.label { background-color: #c6e3e9; } .ui.form .fields.info .field .corner.label, .ui.form .field.info .corner.label { border-color: #276f86; color: #fff; } .ui.form .fields.info .field textarea, .ui.form .fields.info .field select, .ui.form .fields.info .field input:not([type]), .ui.form .fields.info .field input[type="color"], .ui.form .fields.info .field input[type="date"], .ui.form .fields.info .field input[type="datetime-local"], .ui.form .fields.info .field input[type="email"], .ui.form .fields.info .field input[type="month"], .ui.form .fields.info .field input[type="number"], .ui.form .fields.info .field input[type="password"], .ui.form .fields.info .field input[type="search"], .ui.form .fields.info .field input[type="tel"], .ui.form .fields.info .field input[type="time"], .ui.form .fields.info .field input[type="text"], .ui.form .fields.info .field input[type="file"], .ui.form .fields.info .field input[type="url"], .ui.form .fields.info .field input[type="week"], .ui.form .field.info textarea, .ui.form .field.info select, .ui.form .field.info input:not([type]), .ui.form .field.info input[type="color"], .ui.form .field.info input[type="date"], .ui.form .field.info input[type="datetime-local"], .ui.form .field.info input[type="email"], .ui.form .field.info input[type="month"], .ui.form .field.info input[type="number"], .ui.form .field.info input[type="password"], .ui.form .field.info input[type="search"], .ui.form .field.info input[type="tel"], .ui.form .field.info input[type="time"], .ui.form .field.info input[type="text"], .ui.form .field.info input[type="file"], .ui.form .field.info input[type="url"], .ui.form .field.info input[type="week"] { color: #276f86; background: #f8ffff; border-color: #a9d5de; border-radius: ""; box-shadow: none; } .ui.form .field.info textarea:focus, .ui.form .field.info select:focus, .ui.form .field.info input:not([type]):focus, .ui.form .field.info input[type="color"]:focus, .ui.form .field.info input[type="date"]:focus, .ui.form .field.info input[type="datetime-local"]:focus, .ui.form .field.info input[type="email"]:focus, .ui.form .field.info input[type="month"]:focus, .ui.form .field.info input[type="number"]:focus, .ui.form .field.info input[type="password"]:focus, .ui.form .field.info input[type="search"]:focus, .ui.form .field.info input[type="tel"]:focus, .ui.form .field.info input[type="time"]:focus, .ui.form .field.info input[type="text"]:focus, .ui.form .field.info input[type="file"]:focus, .ui.form .field.info input[type="url"]:focus, .ui.form .field.info input[type="week"]:focus { background: #f8ffff; border-color: #a9d5de; color: #276f86; box-shadow: none; } .ui.form .field.info > textarea:hover:not(:focus), .ui.form .field.info > input:hover:not(:focus) { border-color: #a9d5de; } /* Preserve Native Select Stylings */ .ui.form .field.info select { -webkit-appearance: menulist-button; } /*------------------ Input State --------------------*/ /* Transparent */ .ui.form .field.info .transparent.input input, .ui.form .field.info .transparent.input textarea, .ui.form .field.info input.transparent, .ui.form .field.info textarea.transparent { background-color: #f8ffff !important; color: #276f86 !important; } /* Autofilled */ .ui.form .info.info input:-webkit-autofill { box-shadow: 0 0 0 100px #f0faff inset !important; border-color: #b3e0e0 !important; } /* Placeholder */ .ui.form .info :-ms-input-placeholder { color: #98cfe1; } .ui.form .info ::-ms-input-placeholder { color: #98cfe1; } .ui.form .info .ui.dropdown > .default.text, .ui.form .info ::placeholder { color: #98cfe1; } .ui.form .info :-ms-input-placeholder { color: #98cfe1 !important; } .ui.form .info :focus:-ms-input-placeholder { color: #70bdd6; } .ui.form .info :focus::-ms-input-placeholder { color: #70bdd6; } .ui.form .info .ui.dropdown > input:focus ~ .default.text, .ui.form .info :focus::placeholder { color: #70bdd6; } .ui.form .info :focus:-ms-input-placeholder { color: #70bdd6 !important; } /*------------------ Dropdown State --------------------*/ .ui.form .fields.info .field .ui.dropdown, .ui.form .fields.info .field .ui.dropdown .item, .ui.form .field.info .ui.dropdown, .ui.form .field.info .ui.dropdown > .text, .ui.form .field.info .ui.dropdown .item { background: #f8ffff; color: #276f86; } .ui.form .fields.info .field .ui.dropdown, .ui.form .field.info .ui.dropdown { border-color: #a9d5de !important; } .ui.form .fields.info .field .ui.dropdown:hover, .ui.form .field.info .ui.dropdown:hover { border-color: #a9d5de !important; } .ui.form .fields.info .field .ui.dropdown:hover .menu, .ui.form .field.info .ui.dropdown:hover .menu { border-color: #a9d5de; } .ui.form .fields.info .field .ui.multiple.selection.dropdown > .label, .ui.form .field.info .ui.multiple.selection.dropdown > .label { background-color: #cce3ea; color: #276f86; } /* Hover */ .ui.form .fields.info .field .ui.dropdown .menu .item:hover, .ui.form .field.info .ui.dropdown .menu .item:hover { background-color: #e9f2fb; } /* Selected */ .ui.form .fields.info .field .ui.dropdown .menu .selected.item, .ui.form .field.info .ui.dropdown .menu .selected.item { background-color: #e9f2fb; } /* Active */ .ui.form .fields.info .field .ui.dropdown .menu .active.item, .ui.form .field.info .ui.dropdown .menu .active.item { background-color: #cef1fd !important; } /*-------------------- Checkbox State ---------------------*/ .ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) label, .ui.form .field.info .checkbox:not(.toggle):not(.slider) label { color: #276f86; } .ui.form .fields.info .field .checkbox:not(.toggle):not(.slider) label::before, .ui.form .field.info .checkbox:not(.toggle):not(.slider) label::before { background: #f8ffff; border-color: #a9d5de; } .ui.form .fields.info .field .checkbox label::after, .ui.form .field.info .checkbox label::after { color: #276f86; } .ui.inverted.form .fields.info .field label, .ui.inverted.form .info.field label { color: #c6e3e9; } @supports selector(:has(.f)) { .ui.inverted.form .fields:has(.info) > label { color: #c6e3e9; } } /* On Form */ .ui.form.success .success.message:not(:empty) { display: block; } .ui.form.success .compact.success.message:not(:empty) { display: inline-block; } .ui.form.success .icon.success.message:not(:empty) { display: flex; } /* On Field(s) */ .ui.form .fields.success .success.message:not(:empty), .ui.form .field.success .success.message:not(:empty) { display: block; } .ui.form .fields.success .compact.success.message:not(:empty), .ui.form .field.success .compact.success.message:not(:empty) { display: inline-block; } .ui.form .fields.success .icon.success.message:not(:empty), .ui.form .field.success .icon.success.message:not(:empty) { display: flex; } .ui.ui.form .fields.success .field label, .ui.ui.form .fields.success .field .ui.label:not(.corner), .ui.ui.form .field.success label, .ui.ui.form .field.success .ui.label:not(.corner), .ui.ui.form .fields.success .field .input, .ui.ui.form .field.success .input { color: #2c662d; } @supports selector(:has(.f)) { .ui.form .fields:has(.success) > label { color: #2c662d; } } .ui.form .fields.success .field .ui.label, .ui.form .field.success .ui.label { background-color: #b9d1ad; } .ui.form .fields.success .field .corner.label, .ui.form .field.success .corner.label { border-color: #2c662d; color: #fff; } .ui.form .fields.success .field textarea, .ui.form .fields.success .field select, .ui.form .fields.success .field input:not([type]), .ui.form .fields.success .field input[type="color"], .ui.form .fields.success .field input[type="date"], .ui.form .fields.success .field input[type="datetime-local"], .ui.form .fields.success .field input[type="email"], .ui.form .fields.success .field input[type="month"], .ui.form .fields.success .field input[type="number"], .ui.form .fields.success .field input[type="password"], .ui.form .fields.success .field input[type="search"], .ui.form .fields.success .field input[type="tel"], .ui.form .fields.success .field input[type="time"], .ui.form .fields.success .field input[type="text"], .ui.form .fields.success .field input[type="file"], .ui.form .fields.success .field input[type="url"], .ui.form .fields.success .field input[type="week"], .ui.form .field.success textarea, .ui.form .field.success select, .ui.form .field.success input:not([type]), .ui.form .field.success input[type="color"], .ui.form .field.success input[type="date"], .ui.form .field.success input[type="datetime-local"], .ui.form .field.success input[type="email"], .ui.form .field.success input[type="month"], .ui.form .field.success input[type="number"], .ui.form .field.success input[type="password"], .ui.form .field.success input[type="search"], .ui.form .field.success input[type="tel"], .ui.form .field.success input[type="time"], .ui.form .field.success input[type="text"], .ui.form .field.success input[type="file"], .ui.form .field.success input[type="url"], .ui.form .field.success input[type="week"] { color: #2c662d; background: #fcfff5; border-color: #a3c293; border-radius: ""; box-shadow: none; } .ui.form .field.success textarea:focus, .ui.form .field.success select:focus, .ui.form .field.success input:not([type]):focus, .ui.form .field.success input[type="color"]:focus, .ui.form .field.success input[type="date"]:focus, .ui.form .field.success input[type="datetime-local"]:focus, .ui.form .field.success input[type="email"]:focus, .ui.form .field.success input[type="month"]:focus, .ui.form .field.success input[type="number"]:focus, .ui.form .field.success input[type="password"]:focus, .ui.form .field.success input[type="search"]:focus, .ui.form .field.success input[type="tel"]:focus, .ui.form .field.success input[type="time"]:focus, .ui.form .field.success input[type="text"]:focus, .ui.form .field.success input[type="file"]:focus, .ui.form .field.success input[type="url"]:focus, .ui.form .field.success input[type="week"]:focus { background: #fcfff5; border-color: #a3c293; color: #2c662d; box-shadow: none; } .ui.form .field.success > textarea:hover:not(:focus), .ui.form .field.success > input:hover:not(:focus) { border-color: #a3c293; } /* Preserve Native Select Stylings */ .ui.form .field.success select { -webkit-appearance: menulist-button; } /*------------------ Input State --------------------*/ /* Transparent */ .ui.form .field.success .transparent.input input, .ui.form .field.success .transparent.input textarea, .ui.form .field.success input.transparent, .ui.form .field.success textarea.transparent { background-color: #fcfff5 !important; color: #2c662d !important; } /* Autofilled */ .ui.form .success.success input:-webkit-autofill { box-shadow: 0 0 0 100px #f0fff0 inset !important; border-color: #bee0b3 !important; } /* Placeholder */ .ui.form .success :-ms-input-placeholder { color: #8fcf90; } .ui.form .success ::-ms-input-placeholder { color: #8fcf90; } .ui.form .success .ui.dropdown > .default.text, .ui.form .success ::placeholder { color: #8fcf90; } .ui.form .success :-ms-input-placeholder { color: #8fcf90 !important; } .ui.form .success :focus:-ms-input-placeholder { color: #6cbf6d; } .ui.form .success :focus::-ms-input-placeholder { color: #6cbf6d; } .ui.form .success .ui.dropdown > input:focus ~ .default.text, .ui.form .success :focus::placeholder { color: #6cbf6d; } .ui.form .success :focus:-ms-input-placeholder { color: #6cbf6d !important; } /*------------------ Dropdown State --------------------*/ .ui.form .fields.success .field .ui.dropdown, .ui.form .fields.success .field .ui.dropdown .item, .ui.form .field.success .ui.dropdown, .ui.form .field.success .ui.dropdown > .text, .ui.form .field.success .ui.dropdown .item { background: #fcfff5; color: #2c662d; } .ui.form .fields.success .field .ui.dropdown, .ui.form .field.success .ui.dropdown { border-color: #a3c293 !important; } .ui.form .fields.success .field .ui.dropdown:hover, .ui.form .field.success .ui.dropdown:hover { border-color: #a3c293 !important; } .ui.form .fields.success .field .ui.dropdown:hover .menu, .ui.form .field.success .ui.dropdown:hover .menu { border-color: #a3c293; } .ui.form .fields.success .field .ui.multiple.selection.dropdown > .label, .ui.form .field.success .ui.multiple.selection.dropdown > .label { background-color: #cceacc; color: #2c662d; } /* Hover */ .ui.form .fields.success .field .ui.dropdown .menu .item:hover, .ui.form .field.success .ui.dropdown .menu .item:hover { background-color: #e9fbe9; } /* Selected */ .ui.form .fields.success .field .ui.dropdown .menu .selected.item, .ui.form .field.success .ui.dropdown .menu .selected.item { background-color: #e9fbe9; } /* Active */ .ui.form .fields.success .field .ui.dropdown .menu .active.item, .ui.form .field.success .ui.dropdown .menu .active.item { background-color: #dafdce !important; } /*-------------------- Checkbox State ---------------------*/ .ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) label, .ui.form .field.success .checkbox:not(.toggle):not(.slider) label { color: #2c662d; } .ui.form .fields.success .field .checkbox:not(.toggle):not(.slider) label::before, .ui.form .field.success .checkbox:not(.toggle):not(.slider) label::before { background: #fcfff5; border-color: #a3c293; } .ui.form .fields.success .field .checkbox label::after, .ui.form .field.success .checkbox label::after { color: #2c662d; } .ui.inverted.form .fields.success .field label, .ui.inverted.form .success.field label { color: #b9d1ad; } @supports selector(:has(.f)) { .ui.inverted.form .fields:has(.success) > label { color: #b9d1ad; } } /* On Form */ .ui.form.warning .warning.message:not(:empty) { display: block; } .ui.form.warning .compact.warning.message:not(:empty) { display: inline-block; } .ui.form.warning .icon.warning.message:not(:empty) { display: flex; } /* On Field(s) */ .ui.form .fields.warning .warning.message:not(:empty), .ui.form .field.warning .warning.message:not(:empty) { display: block; } .ui.form .fields.warning .compact.warning.message:not(:empty), .ui.form .field.warning .compact.warning.message:not(:empty) { display: inline-block; } .ui.form .fields.warning .icon.warning.message:not(:empty), .ui.form .field.warning .icon.warning.message:not(:empty) { display: flex; } .ui.ui.form .fields.warning .field label, .ui.ui.form .fields.warning .field .ui.label:not(.corner), .ui.ui.form .field.warning label, .ui.ui.form .field.warning .ui.label:not(.corner), .ui.ui.form .fields.warning .field .input, .ui.ui.form .field.warning .input { color: #573a08; } @supports selector(:has(.f)) { .ui.form .fields:has(.warning) > label { color: #573a08; } } .ui.form .fields.warning .field .ui.label, .ui.form .field.warning .ui.label { background-color: #d7ccb5; } .ui.form .fields.warning .field .corner.label, .ui.form .field.warning .corner.label { border-color: #573a08; color: #fff; } .ui.form .fields.warning .field textarea, .ui.form .fields.warning .field select, .ui.form .fields.warning .field input:not([type]), .ui.form .fields.warning .field input[type="color"], .ui.form .fields.warning .field input[type="date"], .ui.form .fields.warning .field input[type="datetime-local"], .ui.form .fields.warning .field input[type="email"], .ui.form .fields.warning .field input[type="month"], .ui.form .fields.warning .field input[type="number"], .ui.form .fields.warning .field input[type="password"], .ui.form .fields.warning .field input[type="search"], .ui.form .fields.warning .field input[type="tel"], .ui.form .fields.warning .field input[type="time"], .ui.form .fields.warning .field input[type="text"], .ui.form .fields.warning .field input[type="file"], .ui.form .fields.warning .field input[type="url"], .ui.form .fields.warning .field input[type="week"], .ui.form .field.warning textarea, .ui.form .field.warning select, .ui.form .field.warning input:not([type]), .ui.form .field.warning input[type="color"], .ui.form .field.warning input[type="date"], .ui.form .field.warning input[type="datetime-local"], .ui.form .field.warning input[type="email"], .ui.form .field.warning input[type="month"], .ui.form .field.warning input[type="number"], .ui.form .field.warning input[type="password"], .ui.form .field.warning input[type="search"], .ui.form .field.warning input[type="tel"], .ui.form .field.warning input[type="time"], .ui.form .field.warning input[type="text"], .ui.form .field.warning input[type="file"], .ui.form .field.warning input[type="url"], .ui.form .field.warning input[type="week"] { color: #573a08; background: #fffaf3; border-color: #c9ba9b; border-radius: ""; box-shadow: none; } .ui.form .field.warning textarea:focus, .ui.form .field.warning select:focus, .ui.form .field.warning input:not([type]):focus, .ui.form .field.warning input[type="color"]:focus, .ui.form .field.warning input[type="date"]:focus, .ui.form .field.warning input[type="datetime-local"]:focus, .ui.form .field.warning input[type="email"]:focus, .ui.form .field.warning input[type="month"]:focus, .ui.form .field.warning input[type="number"]:focus, .ui.form .field.warning input[type="password"]:focus, .ui.form .field.warning input[type="search"]:focus, .ui.form .field.warning input[type="tel"]:focus, .ui.form .field.warning input[type="time"]:focus, .ui.form .field.warning input[type="text"]:focus, .ui.form .field.warning input[type="file"]:focus, .ui.form .field.warning input[type="url"]:focus, .ui.form .field.warning input[type="week"]:focus { background: #fffaf3; border-color: #c9ba9b; color: #573a08; box-shadow: none; } .ui.form .field.warning > textarea:hover:not(:focus), .ui.form .field.warning > input:hover:not(:focus) { border-color: #c9ba9b; } /* Preserve Native Select Stylings */ .ui.form .field.warning select { -webkit-appearance: menulist-button; } /*------------------ Input State --------------------*/ /* Transparent */ .ui.form .field.warning .transparent.input input, .ui.form .field.warning .transparent.input textarea, .ui.form .field.warning input.transparent, .ui.form .field.warning textarea.transparent { background-color: #fffaf3 !important; color: #573a08 !important; } /* Autofilled */ .ui.form .warning.warning input:-webkit-autofill { box-shadow: 0 0 0 100px #ffffe0 inset !important; border-color: #e0e0b3 !important; } /* Placeholder */ .ui.form .warning :-ms-input-placeholder { color: #edad3e; } .ui.form .warning ::-ms-input-placeholder { color: #edad3e; } .ui.form .warning .ui.dropdown > .default.text, .ui.form .warning ::placeholder { color: #edad3e; } .ui.form .warning :-ms-input-placeholder { color: #edad3e !important; } .ui.form .warning :focus:-ms-input-placeholder { color: #e39715; } .ui.form .warning :focus::-ms-input-placeholder { color: #e39715; } .ui.form .warning .ui.dropdown > input:focus ~ .default.text, .ui.form .warning :focus::placeholder { color: #e39715; } .ui.form .warning :focus:-ms-input-placeholder { color: #e39715 !important; } /*------------------ Dropdown State --------------------*/ .ui.form .fields.warning .field .ui.dropdown, .ui.form .fields.warning .field .ui.dropdown .item, .ui.form .field.warning .ui.dropdown, .ui.form .field.warning .ui.dropdown > .text, .ui.form .field.warning .ui.dropdown .item { background: #fffaf3; color: #573a08; } .ui.form .fields.warning .field .ui.dropdown, .ui.form .field.warning .ui.dropdown { border-color: #c9ba9b !important; } .ui.form .fields.warning .field .ui.dropdown:hover, .ui.form .field.warning .ui.dropdown:hover { border-color: #c9ba9b !important; } .ui.form .fields.warning .field .ui.dropdown:hover .menu, .ui.form .field.warning .ui.dropdown:hover .menu { border-color: #c9ba9b; } .ui.form .fields.warning .field .ui.multiple.selection.dropdown > .label, .ui.form .field.warning .ui.multiple.selection.dropdown > .label { background-color: #eaeacc; color: #573a08; } /* Hover */ .ui.form .fields.warning .field .ui.dropdown .menu .item:hover, .ui.form .field.warning .ui.dropdown .menu .item:hover { background-color: #fbfbe9; } /* Selected */ .ui.form .fields.warning .field .ui.dropdown .menu .selected.item, .ui.form .field.warning .ui.dropdown .menu .selected.item { background-color: #fbfbe9; } /* Active */ .ui.form .fields.warning .field .ui.dropdown .menu .active.item, .ui.form .field.warning .ui.dropdown .menu .active.item { background-color: #fdfdce !important; } /*-------------------- Checkbox State ---------------------*/ .ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) label, .ui.form .field.warning .checkbox:not(.toggle):not(.slider) label { color: #573a08; } .ui.form .fields.warning .field .checkbox:not(.toggle):not(.slider) label::before, .ui.form .field.warning .checkbox:not(.toggle):not(.slider) label::before { background: #fffaf3; border-color: #c9ba9b; } .ui.form .fields.warning .field .checkbox label::after, .ui.form .field.warning .checkbox label::after { color: #573a08; } .ui.inverted.form .fields.warning .field label, .ui.inverted.form .warning.field label { color: #d7ccb5; } @supports selector(:has(.f)) { .ui.inverted.form .fields:has(.warning) > label { color: #d7ccb5; } } /* -------------------- Disabled --------------------- */ .ui.form .disabled.fields .field, .ui.form .disabled.field, .ui.form .field :disabled { pointer-events: none; opacity: 0.45; } .ui.form .field.disabled > label, .ui.form .fields.disabled > label { opacity: 0.45; } .ui.form .field.disabled :disabled { opacity: 1; } /* -------------- Loading --------------- */ .ui.loading.form { position: relative; cursor: default; pointer-events: none; } .ui.loading.form::before { position: absolute; content: ""; top: 0; left: 0; background: rgba(255, 255, 255, 0.8); width: 100%; height: 100%; z-index: 100; } .ui.loading.form.segments::before { border-radius: 0.28571429rem; } .ui.loading.form::after { position: absolute; content: ""; top: 50%; left: 50%; margin: -1.5em 0 0 -1.5em; width: 3em; height: 3em; animation: loader 0.6s infinite linear; border: 0.2em solid #767676; border-radius: 500rem; box-shadow: 0 0 0 1px transparent; visibility: visible; z-index: 101; } /******************************* Element Types *******************************/ /* -------------------- Required Field --------------------- */ .ui.form .required.fields:not(.grouped):not(.inline) > .field > label::after, .ui.form .required.fields.inline > label::after, .ui.form .required.fields.grouped > label::after, .ui.form .required.field > label::after, .ui.form .required.fields:not(.grouped):not(.inline) > .field > .checkbox::after, .ui.form .required.field > .checkbox::after, .ui.form label.required::after { margin: -0.2em 0 0 0.2em; content: "*"; color: #db2828; } .ui.form .required.fields:not(.grouped):not(.inline) > .field > label::after, .ui.form .required.fields.inline > label::after, .ui.form .required.fields.grouped > label::after, .ui.form .required.field > label::after, .ui.form label.required::after { display: inline-block; vertical-align: top; } .ui.form .required.fields:not(.grouped):not(.inline) > .field > .checkbox::after, .ui.form .required.field > .checkbox::after { position: absolute; top: 0; left: 100%; } .ui.ui.ui.ui.form .fields:not(.required) > label:empty::after, .ui.ui.ui.ui.form .fields:not(.grouped):not(.inline) > .field:not(.required) > label:empty::after { content: " "; display: inline-block; } .ui.ui.ui.ui.form .inline.fields .field:not(.required) > label:empty { display: none; } /******************************* Variations *******************************/ /* -------------------- Inverted Colors --------------------- */ .ui.inverted.form label, .ui.form .inverted.segment label, .ui.form .inverted.segment .ui.checkbox label, .ui.inverted.form .ui.checkbox label, .ui.inverted.form .grouped.fields > label, .ui.inverted.form .inline.fields > label, .ui.inverted.form .inline.fields .field > label, .ui.inverted.form .inline.fields .field > p, .ui.inverted.form .inline.field > label, .ui.inverted.form .inline.field > p { color: rgba(255, 255, 255, 0.9); } .ui.inverted.loading.form { color: #fff; } .ui.inverted.loading.form::before { background: rgba(0, 0, 0, 0.85); } /* Inverted Field */ .ui.inverted.form input:not([type]), .ui.inverted.form input[type="color"], .ui.inverted.form input[type="date"], .ui.inverted.form input[type="datetime-local"], .ui.inverted.form input[type="email"], .ui.inverted.form input[type="month"], .ui.inverted.form input[type="number"], .ui.inverted.form input[type="password"], .ui.inverted.form input[type="search"], .ui.inverted.form input[type="tel"], .ui.inverted.form input[type="time"], .ui.inverted.form input[type="text"], .ui.inverted.form input[type="file"], .ui.inverted.form input[type="url"], .ui.inverted.form input[type="week"] { background: #fff; border-color: rgba(255, 255, 255, 0.1); color: rgba(0, 0, 0, 0.87); box-shadow: none; } /* -------------------- Field Groups --------------------- */ /* Grouped Vertically */ .ui.form .grouped.fields { display: block; margin: 0 0 1em; } .ui.form .grouped.fields:last-child { margin-bottom: 0; } .ui.form .grouped.fields > label { margin: 0 0 0.28571429rem 0; color: rgba(0, 0, 0, 0.87); font-size: 0.92857143em; font-weight: bold; text-transform: none; } .ui.form .grouped.fields .field, .ui.form .grouped.inline.fields .field { display: block; margin: 0.5em 0; padding: 0; } .ui.form .grouped.inline.fields .ui.checkbox { margin-bottom: 0.4em; } /* -------------------- Fields --------------------- */ /* Split fields */ .ui.form .fields { display: flex; flex-direction: row; margin: 0 -0.5em 1em; } .ui.form .fields > .field { flex: 0 1 auto; padding-left: 0.5em; padding-right: 0.5em; } .ui.form .fields > .field:first-child { border-left: none; box-shadow: none; } /* Other Combinations */ .ui.form .two.fields > .fields, .ui.form .two.fields > .field { width: 50%; } .ui.form .three.fields > .fields, .ui.form .three.fields > .field { width: 33.33333333%; } .ui.form .four.fields > .fields, .ui.form .four.fields > .field { width: 25%; } .ui.form .five.fields > .fields, .ui.form .five.fields > .field { width: 20%; } .ui.form .six.fields > .fields, .ui.form .six.fields > .field { width: 16.66666667%; } .ui.form .seven.fields > .fields, .ui.form .seven.fields > .field { width: 14.28571429%; } .ui.form .eight.fields > .fields, .ui.form .eight.fields > .field { width: 12.5%; } .ui.form .nine.fields > .fields, .ui.form .nine.fields > .field { width: 11.11111111%; } .ui.form .ten.fields > .fields, .ui.form .ten.fields > .field { width: 10%; } /* Swap to full width on mobile */ @media only screen and (max-width: 767.98px) { .ui.form .fields { flex-wrap: wrap; margin-bottom: 0; } .ui.form:not(.unstackable) .fields:not(.unstackable) > .fields, .ui.form:not(.unstackable) .fields:not(.unstackable) > .field { width: 100%; margin: 0 0 1em; } } /* Sizing Combinations */ .ui.form .fields .wide.field { width: 6.25%; padding-left: 0.5em; padding-right: 0.5em; } .ui.form .one.wide.field { width: 6.25%; } .ui.form .two.wide.field { width: 12.5%; } .ui.form .three.wide.field { width: 18.75%; } .ui.form .four.wide.field { width: 25%; } .ui.form .five.wide.field { width: 31.25%; } .ui.form .six.wide.field { width: 37.5%; } .ui.form .seven.wide.field { width: 43.75%; } .ui.form .eight.wide.field { width: 50%; } .ui.form .nine.wide.field { width: 56.25%; } .ui.form .ten.wide.field { width: 62.5%; } .ui.form .eleven.wide.field { width: 68.75%; } .ui.form .twelve.wide.field { width: 75%; } .ui.form .thirteen.wide.field { width: 81.25%; } .ui.form .fourteen.wide.field { width: 87.5%; } .ui.form .fifteen.wide.field { width: 93.75%; } .ui.form .sixteen.wide.field { width: 100%; } /* -------------------- Equal Width --------------------- */ .ui[class*="equal width"].form .fields > .field, .ui.form [class*="equal width"].fields > .field { width: 100%; flex: 1 1 auto; } /* -------------------- Inline Fields --------------------- */ .ui.form .inline.fields { margin: 0 0 1em; align-items: center; } .ui.form .inline.fields .field { margin: 0; padding: 0 1em 0 0; } /* Inline Label */ .ui.form .inline.fields > label, .ui.form .inline.fields .field > label, .ui.form .inline.fields .field > p, .ui.form .inline.field > label, .ui.form .inline.field > p { display: inline-block; width: auto; margin-top: 0; margin-bottom: 0; vertical-align: baseline; font-size: 0.92857143em; font-weight: bold; color: rgba(0, 0, 0, 0.87); text-transform: none; } /* Grouped Inline Label */ .ui.form .inline.fields > label { margin: 0.03571em 1em 0 0; } /* Inline Input */ .ui.form .inline.fields .field > input, .ui.form .inline.fields .field > select, .ui.form .inline.field > input, .ui.form .inline.field > select { display: inline-block; width: auto; margin-top: 0; margin-bottom: 0; vertical-align: middle; font-size: 1em; } .ui.form .inline.fields .field .calendar:not(.popup), .ui.form .inline.field .calendar:not(.popup) { display: inline-block; } .ui.form .inline.fields .field .calendar:not(.popup) > .input > input, .ui.form .inline.field .calendar:not(.popup) > .input > input { width: 13.11em; } /* Label */ .ui.form .inline.fields .field > :first-child, .ui.form .inline.field > :first-child { margin: 0 0.85714286em 0 0; } .ui.form .inline.fields .field > :only-child, .ui.form .inline.field > :only-child { margin: 0; } /* Wide */ .ui.form .inline.fields .wide.field { display: flex; align-items: center; } .ui.form .inline.fields .wide.field > input, .ui.form .inline.fields .wide.field > select { width: 100%; } /* -------------------- Sizes --------------------- */ .ui.form, .ui.form .field .dropdown, .ui.form .field .dropdown .menu > .item { font-size: 1rem; } .ui.mini.form, .ui.mini.form .field .dropdown, .ui.mini.form .field .dropdown .menu > .item { font-size: 0.78571429rem; } .ui.tiny.form, .ui.tiny.form .field .dropdown, .ui.tiny.form .field .dropdown .menu > .item { font-size: 0.85714286rem; } .ui.small.form, .ui.small.form .field .dropdown, .ui.small.form .field .dropdown .menu > .item { font-size: 0.92857143rem; } .ui.large.form, .ui.large.form .field .dropdown, .ui.large.form .field .dropdown .menu > .item { font-size: 1.14285714rem; } .ui.big.form, .ui.big.form .field .dropdown, .ui.big.form .field .dropdown .menu > .item { font-size: 1.28571429rem; } .ui.huge.form, .ui.huge.form .field .dropdown, .ui.huge.form .field .dropdown .menu > .item { font-size: 1.42857143rem; } .ui.massive.form, .ui.massive.form .field .dropdown, .ui.massive.form .field .dropdown .menu > .item { font-size: 1.71428571rem; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/form.js ================================================ /*! * # Fomantic-UI 2.9.4 - Form Validation * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.form = function (parameters) { var $allModules = $(this), $window = $(window), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), returnedValue ; $allModules.each(function () { var $module = $(this), element = this, formErrors = [], formErrorsTracker = {}, keyHeldDown = false, // set at run-time $field, $group, $message, $prompt, $submit, $clear, $reset, settings, validation, metadata, selector, className, regExp, error, namespace, moduleNamespace, eventNamespace, attachEventsSelector, attachEventsAction, submitting = false, dirty = false, history = ['clean', 'clean'], instance, module ; module = { initialize: function () { // settings grabbed at run time module.get.settings(); $module.addClass(className.initial); if (methodInvoked) { if (instance === undefined) { module.instantiate(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); module.refresh(); } module.verbose('Initializing form validation', $module, settings); module.bindEvents(); module.set.defaults(); if (settings.autoCheckRequired) { module.set.autoCheck(); } module.instantiate(); } }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.verbose('Destroying previous module', instance); module.removeEvents(); $module .removeData(moduleNamespace) ; }, refresh: function () { module.verbose('Refreshing selector cache'); $field = $module.find(selector.field); $group = $module.find(selector.group); $message = $module.find(selector.message); $prompt = $module.find(selector.prompt); $submit = $module.find(selector.submit); $clear = $module.find(selector.clear); $reset = $module.find(selector.reset); }, refreshEvents: function () { module.removeEvents(); module.bindEvents(); }, submit: function (event) { module.verbose('Submitting form', $module); submitting = true; $module.trigger('submit'); if (event) { event.preventDefault(); } }, attachEvents: function (selector, action) { if (!action) { action = 'submit'; } $(selector).on('click' + eventNamespace, function (event) { module[action](); event.preventDefault(); }); attachEventsSelector = selector; attachEventsAction = action; }, bindEvents: function () { module.verbose('Attaching form events'); $module .on('submit' + eventNamespace, module.validate.form) .on('blur' + eventNamespace, selector.field, module.event.field.blur) .on('click' + eventNamespace, selector.submit, module.submit) .on('click' + eventNamespace, selector.reset, module.reset) .on('click' + eventNamespace, selector.clear, module.clear) ; $field.on('invalid' + eventNamespace, module.event.field.invalid); if (settings.keyboardShortcuts) { $module.on('keydown' + eventNamespace, selector.field, module.event.field.keydown); } $field.each(function (index, el) { var $input = $(el), type = $input.prop('type'), inputEvent = module.get.changeEvent(type, $input) ; $input.on(inputEvent + eventNamespace, module.event.field.change); }); // Dirty events if (settings.preventLeaving) { $window.on('beforeunload' + eventNamespace, module.event.beforeUnload); } $field.on('change' + eventNamespace + ' click' + eventNamespace + ' keyup' + eventNamespace + ' keydown' + eventNamespace + ' blur' + eventNamespace, function (e) { module.determine.isDirty(); }); $module.on('dirty' + eventNamespace, function (e) { settings.onDirty.call(); }); $module.on('clean' + eventNamespace, function (e) { settings.onClean.call(); }); if (attachEventsSelector) { module.attachEvents(attachEventsSelector, attachEventsAction); } }, clear: function () { $field.each(function (index, el) { var $field = $(el), $element = $field.parent(), $fieldGroup = $field.closest($group), $prompt = $fieldGroup.find(selector.prompt), $calendar = $field.closest(selector.uiCalendar), defaultValue = $field.data(metadata.defaultValue) || '', isCheckbox = $field.is(selector.checkbox), isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'), isCalendar = $calendar.length > 0 && module.can.useElement('calendar'), isErrored = $fieldGroup.hasClass(className.error) ; if (isErrored) { module.verbose('Resetting error on field', $fieldGroup); $fieldGroup.removeClass(className.error); $prompt.remove(); } if (isDropdown) { module.verbose('Resetting dropdown value', $element, defaultValue); $element.dropdown('clear', true); } else if (isCheckbox) { $field.prop('checked', false); } else if (isCalendar) { $calendar.calendar('clear'); } else { module.verbose('Resetting field value', $field, defaultValue); $field.val(''); } }); module.remove.states(); }, reset: function () { $field.each(function (index, el) { var $field = $(el), $element = $field.parent(), $fieldGroup = $field.closest($group), $calendar = $field.closest(selector.uiCalendar), $prompt = $fieldGroup.find(selector.prompt), defaultValue = $field.data(metadata.defaultValue), isCheckbox = $field.is(selector.checkbox), isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'), isCalendar = $calendar.length > 0 && module.can.useElement('calendar'), isFile = $field.is(selector.file), isErrored = $fieldGroup.hasClass(className.error) ; if (defaultValue === undefined) { return; } if (isErrored) { module.verbose('Resetting error on field', $fieldGroup); $fieldGroup.removeClass(className.error); $prompt.remove(); } if (isDropdown) { module.verbose('Resetting dropdown value', $element, defaultValue); $element.dropdown('restore defaults', true); } else if (isCheckbox) { module.verbose('Resetting checkbox value', $field, defaultValue); $field.prop('checked', defaultValue); } else if (isCalendar) { $calendar.calendar('set date', defaultValue); } else { module.verbose('Resetting field value', $field, defaultValue); $field.val(isFile ? '' : defaultValue); } }); module.remove.states(); }, determine: { isValid: function () { var allValid = true ; $field.each(function (index, el) { var $el = $(el), validation = module.get.validation($el) || {}, identifier = module.get.identifier(validation, $el) ; if (!module.validate.field(validation, identifier, true)) { allValid = false; } }); return allValid; }, isDirty: function (e) { var formIsDirty = false; $field.each(function (index, el) { var $el = $(el), isCheckbox = $el.filter(selector.checkbox).length > 0, isDirty ; isDirty = isCheckbox ? module.is.checkboxDirty($el) : module.is.fieldDirty($el); $el.data(settings.metadata.isDirty, isDirty); formIsDirty = formIsDirty || isDirty; }); if (formIsDirty) { module.set.dirty(); } else { module.set.clean(); } }, }, is: { bracketedRule: function (rule) { return rule.type && rule.type.match(settings.regExp.bracket); }, // duck type rule test shorthandRules: function (rules) { return typeof rules === 'string' || Array.isArray(rules); }, empty: function ($field) { if (!$field || $field.length === 0) { return true; } if ($field.is(selector.checkbox)) { return !$field.is(':checked'); } return module.is.blank($field); }, blank: function ($field) { return String($field.val()).trim() === ''; }, valid: function (field, showErrors) { var allValid = true ; if (field) { module.verbose('Checking if field is valid', field); return module.validate.field(validation[field], field, !!showErrors); } module.verbose('Checking if form is valid'); $.each(validation, function (fieldName, field) { if (!module.is.valid(fieldName, showErrors)) { allValid = false; } }); return allValid; }, dirty: function () { return dirty; }, clean: function () { return !dirty; }, fieldDirty: function ($el) { var initialValue = $el.data(metadata.defaultValue); // Explicitly check for undefined/null here as value may be `false`, so ($el.data(dataInitialValue) || '') would not work if (initialValue === undefined || initialValue === null) { initialValue = ''; } else if (Array.isArray(initialValue)) { initialValue = initialValue.toString(); } var currentValue = $el.val(); if (currentValue === undefined || currentValue === null) { currentValue = ''; } else if (Array.isArray(currentValue)) { // multiple select values are returned as arrays which are never equal, so do string conversion first currentValue = currentValue.toString(); } // Boolean values can be encoded as "true/false" or "True/False" depending on underlying frameworks so we need a case insensitive comparison var boolRegex = /^(true|false)$/i; var isBoolValue = boolRegex.test(initialValue) && boolRegex.test(currentValue); if (isBoolValue) { var regex = new RegExp('^' + initialValue + '$', 'i'); return !regex.test(currentValue); } return currentValue !== initialValue; }, checkboxDirty: function ($el) { var initialValue = $el.data(metadata.defaultValue); var currentValue = $el.is(':checked'); return initialValue !== currentValue; }, justDirty: function () { return history[0] === 'dirty'; }, justClean: function () { return history[0] === 'clean'; }, }, removeEvents: function () { $module.off(eventNamespace); $field.off(eventNamespace); $submit.off(eventNamespace); if (settings.preventLeaving) { $window.off(eventNamespace); } if (attachEventsSelector) { $(attachEventsSelector).off(eventNamespace); attachEventsSelector = undefined; } }, event: { field: { keydown: function (event) { var $field = $(this), key = event.which, isInput = $field.is(selector.input), isCheckbox = $field.is(selector.checkbox), isInDropdown = $field.closest(selector.uiDropdown).length > 0, keyCode = { enter: 13, escape: 27, } ; if (key === keyCode.escape) { module.verbose('Escape key pressed blurring field'); $field[0] .blur() ; } if (!event.ctrlKey && key === keyCode.enter && isInput && !isInDropdown && !isCheckbox) { if (!keyHeldDown) { $field.one('keyup' + eventNamespace, module.event.field.keyup); module.submit(event); module.debug('Enter pressed on input submitting form'); } keyHeldDown = true; } }, keyup: function () { keyHeldDown = false; }, invalid: function (event) { event.preventDefault(); }, blur: function (event) { var $field = $(this), validationRules = module.get.validation($field) || {}, identifier = module.get.identifier(validationRules, $field) ; if (settings.on === 'blur' || (!$module.hasClass(className.initial) && settings.revalidate)) { module.debug('Revalidating field', $field, validationRules); module.validate.field(validationRules, identifier); if (!settings.inline) { module.validate.form(false, true); } } }, change: function (event) { var $field = $(this), validationRules = module.get.validation($field) || {}, identifier = module.get.identifier(validationRules, $field) ; if (settings.on === 'change' || (!$module.hasClass(className.initial) && settings.revalidate)) { clearTimeout(module.timer); module.timer = setTimeout(function () { module.debug('Revalidating field', $field, validationRules); module.validate.field(validationRules, identifier); if (!settings.inline) { module.validate.form(false, true); } }, settings.delay); } }, }, beforeUnload: function (event) { if (module.is.dirty() && !submitting) { event = event || window.event; // For modern browsers if (event) { event.returnValue = settings.text.leavingMessage; } // For olders... return settings.text.leavingMessage; } }, }, get: { ancillaryValue: function (rule) { if (!rule.type || (!rule.value && !module.is.bracketedRule(rule))) { return false; } return rule.value !== undefined ? rule.value : rule.type.match(settings.regExp.bracket)[1] + ''; }, ruleName: function (rule) { if (module.is.bracketedRule(rule)) { return rule.type.replace(rule.type.match(settings.regExp.bracket)[0], ''); } return rule.type; }, changeEvent: function (type, $input) { return ['file', 'checkbox', 'radio', 'hidden'].indexOf(type) >= 0 || $input.is('select') ? 'change' : 'input'; }, fieldsFromShorthand: function (fields) { var fullFields = {} ; $.each(fields, function (name, rules) { if (!Array.isArray(rules) && typeof rules === 'object') { fullFields[name] = rules; } else { if (typeof rules === 'string') { rules = [rules]; } fullFields[name] = { rules: [], }; $.each(rules, function (index, rule) { fullFields[name].rules.push({ type: rule }); }); } $.each(fullFields[name].rules, function (index, rule) { var ruleName = module.get.ruleName(rule); if (ruleName === 'empty') { module.warn('*** DEPRECATED *** : Rule "empty" for field "' + name + '" will be removed in a future version. -> Use "notEmpty" rule instead.'); } }); }); return fullFields; }, identifier: function (validation, $el) { return validation.identifier || $el.attr('id') || $el.attr('name') || $el.data(metadata.validate); }, prompt: function (rule, field) { var ruleName = module.get.ruleName(rule), ancillary = module.get.ancillaryValue(rule), $field = module.get.field(field.identifier), value = $field.val(), promptCheck = rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule, prompt = String(isFunction(promptCheck) ? promptCheck.call($field[0], value) : promptCheck), requiresValue = prompt.search('{value}') !== -1, requiresName = prompt.search('{name}') !== -1, parts, suffixPrompt ; if (ancillary && ['integer', 'decimal', 'number', 'size'].indexOf(ruleName) >= 0 && ancillary.indexOf('..') >= 0) { parts = ancillary.split('..', 2); if (!rule.prompt && ruleName !== 'size') { suffixPrompt = parts[0] === '' ? settings.prompt.maxValue.replace(/{ruleValue}/g, '{max}') : (parts[1] === '' ? settings.prompt.minValue.replace(/{ruleValue}/g, '{min}') : settings.prompt.range); prompt += suffixPrompt.replace(/{name}/g, ' ' + settings.text.and); } prompt = prompt.replace(/{min}/g, parts[0]); prompt = prompt.replace(/{max}/g, parts[1]); } if (ancillary && ['match', 'different'].indexOf(ruleName) >= 0) { prompt = prompt.replace(/{ruleValue}/g, module.get.fieldLabel(ancillary, true)); } if (requiresValue) { prompt = prompt.replace(/{value}/g, $field.val()); } if (requiresName) { prompt = prompt.replace(/{name}/g, module.get.fieldLabel($field)); } prompt = prompt.replace(/{identifier}/g, field.identifier); prompt = prompt.replace(/{ruleValue}/g, ancillary); if (!rule.prompt) { module.verbose('Using default validation prompt for type', prompt, ruleName); } return prompt; }, settings: function () { if ($.isPlainObject(parameters)) { settings = $.extend(true, {}, $.fn.form.settings, parameters); if (settings.fields) { settings.fields = module.get.fieldsFromShorthand(settings.fields); } validation = $.extend(true, {}, $.fn.form.settings.defaults, settings.fields); module.verbose('Extending settings', validation, settings); } else { settings = $.extend(true, {}, $.fn.form.settings); validation = $.extend(true, {}, $.fn.form.settings.defaults); module.verbose('Using default form validation', validation, settings); } // shorthand namespace = settings.namespace; metadata = settings.metadata; selector = settings.selector; className = settings.className; regExp = settings.regExp; error = settings.error; moduleNamespace = 'module-' + namespace; eventNamespace = '.' + namespace; // grab instance instance = $module.data(moduleNamespace); // refresh selector cache (instance || module).refresh(); }, field: function (identifier, strict, ignoreMissing) { module.verbose('Finding field with identifier', identifier); identifier = module.escape.string(identifier); var t; t = $field.filter('#' + identifier); if (t.length > 0) { return t; } t = $field.filter('[name="' + identifier + '"]'); if (t.length > 0) { return t; } t = $field.filter('[name="' + identifier + '[]"]'); if (t.length > 0) { return t; } t = $field.filter('[data-' + metadata.validate + '="' + identifier + '"]'); if (t.length > 0) { return t; } if (!ignoreMissing) { module.error(error.noField.replace('{identifier}', identifier)); } return strict ? $() : $('<input/>'); }, fields: function (fields, strict) { var $fields = $() ; $.each(fields, function (index, name) { $fields = $fields.add(module.get.field(name, strict)); }); return $fields; }, fieldLabel: function (identifier, useIdAsFallback) { var $field = typeof identifier === 'string' ? module.get.field(identifier) : identifier, $label = $field.closest(selector.group).find('label:not(:empty)').eq(0) ; return $label.length === 1 ? $label.text() : $field.prop('placeholder') || (useIdAsFallback ? identifier : settings.text.unspecifiedField); }, validation: function ($field) { var fieldValidation, identifier ; if (!validation) { return false; } $.each(validation, function (fieldName, field) { identifier = field.identifier || fieldName; $.each(module.get.field(identifier), function (index, groupField) { if (groupField == $field[0]) { field.identifier = identifier; fieldValidation = field; return false; } }); }); return fieldValidation || false; }, value: function (field, strict) { var fields = [], results, resultKeys ; fields.push(field); results = module.get.values.call(element, fields, strict); resultKeys = Object.keys(results); return resultKeys.length > 0 ? results[resultKeys[0]] : undefined; }, values: function (fields, strict) { var $fields = Array.isArray(fields) && fields.length > 0 ? module.get.fields(fields, strict) : $field, values = {} ; $fields.each(function (index, field) { var $field = $(field), $calendar = $field.closest(selector.uiCalendar), name = $field.prop('name') || $field.prop('id'), value = $field.val(), isCheckbox = $field.is(selector.checkbox), isRadio = $field.is(selector.radio), isMultiple = name.indexOf('[]') !== -1, isCalendar = $calendar.length > 0 && module.can.useElement('calendar'), isChecked = isCheckbox ? $field.is(':checked') : false ; if (name) { if (isMultiple) { name = name.replace('[]', ''); if (!values[name]) { values[name] = []; } if (isCheckbox) { if (isChecked) { values[name].push(value || true); } else { values[name].push(false); } } else { values[name].push(value); } } else { if (isRadio) { if (values[name] === undefined || values[name] === false) { values[name] = isChecked ? value || true : false; } } else if (isCheckbox) { values[name] = isChecked ? value || true : false; } else if (isCalendar) { var date = $calendar.calendar('get date'); if (date !== null) { switch (settings.dateHandling) { case 'date': { values[name] = date; break; } case 'input': { values[name] = $calendar.calendar('get input date'); break; } case 'formatter': { var type = $calendar.calendar('setting', 'type'); switch (type) { case 'date': { values[name] = settings.formatter.date(date); break; } case 'datetime': { values[name] = settings.formatter.datetime(date); break; } case 'time': { values[name] = settings.formatter.time(date); break; } case 'month': { values[name] = settings.formatter.month(date); break; } case 'year': { values[name] = settings.formatter.year(date); break; } default: { module.debug('Wrong calendar mode', $calendar, type); values[name] = ''; } } break; } } } else { values[name] = ''; } } else { values[name] = value; } } } }); return values; }, dirtyFields: function () { return $field.filter(function (index, e) { return $(e).data(metadata.isDirty); }); }, }, has: { field: function (identifier, ignoreMissing) { module.verbose('Checking for existence of a field with identifier', identifier); return module.get.field(identifier, true, ignoreMissing).length > 0; }, }, can: { useElement: function (element) { if ($.fn[element] !== undefined) { return true; } module.error(error.noElement.replace('{element}', element)); return false; }, }, escape: { string: function (text) { text = String(text); return text.replace(regExp.escape, '\\$&'); }, }, checkErrors: function (errors, internal) { if (!errors || errors.length === 0) { if (!internal) { module.error(settings.error.noErrorMessage); } return false; } if (!internal) { errors = typeof errors === 'string' ? [errors] : errors; } return errors; }, add: { // alias rule: function (name, rules) { module.add.field(name, rules); }, field: function (name, rules) { // Validation should have at least a standard format if (validation[name] === undefined || validation[name].rules === undefined) { validation[name] = { rules: [], }; } var newValidation = { rules: [], } ; if (module.is.shorthandRules(rules)) { rules = Array.isArray(rules) ? rules : [rules]; $.each(rules, function (_index, rule) { newValidation.rules.push({ type: rule }); }); } else { newValidation.rules = rules.rules; } // For each new rule, check if there's not already one with the same type $.each(newValidation.rules, function (_index, rule) { if ($.grep(validation[name].rules, function (item) { return item.type === rule.type; }).length === 0) { validation[name].rules.push(rule); } }); module.debug('Adding rules', newValidation.rules, validation); module.refreshEvents(); }, fields: function (fields) { validation = $.extend(true, {}, validation, module.get.fieldsFromShorthand(fields)); module.refreshEvents(); }, prompt: function (identifier, errors, internal) { errors = module.checkErrors(errors); if (errors === false) { return; } var $field = module.get.field(identifier), $fieldGroup = $field.closest($group), $prompt = $fieldGroup.children(selector.prompt), promptExists = $prompt.length > 0, canTransition = settings.transition && module.can.useElement('transition') ; module.verbose('Adding field error state', identifier); if (!internal) { $fieldGroup .addClass(className.error) ; } if (settings.inline) { if (promptExists) { if (canTransition) { if ($prompt.transition('is animating')) { $prompt.transition('stop all'); } } else if ($prompt.is(':animated')) { $prompt.stop(true, true); } $prompt = $fieldGroup.children(selector.prompt); promptExists = $prompt.length > 0; } if (!promptExists) { $prompt = $('<div/>').addClass(className.label); if (!canTransition) { $prompt.css('display', 'none'); } $prompt .appendTo($fieldGroup.filter('.' + className.error)) ; } $prompt .html(settings.templates.prompt(errors)) ; if (!promptExists) { if (canTransition) { module.verbose('Displaying error with css transition', settings.transition); $prompt.transition(settings.transition + ' in', settings.duration); } else { module.verbose('Displaying error with fallback javascript animation'); $prompt .fadeIn(settings.duration) ; } } } else { module.verbose('Inline errors are disabled, no inline error added', identifier); } }, errors: function (errors) { errors = module.checkErrors(errors); if (errors === false) { return; } module.debug('Adding form error messages', errors); module.set.error(); var customErrors = [], tempErrors ; if ($.isPlainObject(errors)) { $.each(Object.keys(errors), function (i, id) { if (module.checkErrors(errors[id], true) !== false) { if (settings.inline) { module.add.prompt(id, errors[id]); } else { tempErrors = module.checkErrors(errors[id]); if (tempErrors !== false) { $.each(tempErrors, function (index, tempError) { customErrors.push(settings.prompt.addErrors .replace(/{name}/g, module.get.fieldLabel(id)) .replace(/{error}/g, tempError)); }); } } } }); } else { customErrors = errors; } if (customErrors.length > 0) { $message .html(settings.templates.error(customErrors)) ; } }, }, remove: { errors: function () { module.debug('Removing form error messages'); $message.empty(); }, states: function () { $module.removeClass(className.error).removeClass(className.success).addClass(className.initial); if (!settings.inline) { module.remove.errors(); } module.determine.isDirty(); }, rule: function (field, rule) { var rules = Array.isArray(rule) ? rule : [rule] ; if (validation[field] === undefined || !Array.isArray(validation[field].rules)) { return; } if (rule === undefined) { module.debug('Removed all rules'); if (module.has.field(field, true)) { validation[field].rules = []; } else { delete validation[field]; } return; } $.each(validation[field].rules, function (index, rule) { if (rule && rules.indexOf(rule.type) !== -1) { module.debug('Removed rule', rule.type); validation[field].rules.splice(index, 1); } }); }, field: function (field) { var fields = Array.isArray(field) ? field : [field] ; $.each(fields, function (index, field) { module.remove.rule(field); }); module.refreshEvents(); }, // alias rules: function (field, rules) { if (Array.isArray(field)) { $.each(field, function (index, field) { module.remove.rule(field, rules); }); } else { module.remove.rule(field, rules); } }, fields: function (fields) { module.remove.field(fields); }, prompt: function (identifier) { var $field = module.get.field(identifier), $fieldGroup = $field.closest($group), $prompt = $fieldGroup.children(selector.prompt) ; $fieldGroup .removeClass(className.error) ; if (settings.inline && $prompt.is(':visible')) { module.verbose('Removing prompt for field', identifier); if (settings.transition && module.can.useElement('transition')) { $prompt.transition(settings.transition + ' out', settings.duration, function () { $prompt.remove(); }); } else { $prompt .fadeOut(settings.duration, function () { $prompt.remove(); }) ; } } }, }, set: { success: function () { $module .removeClass(className.error) .addClass(className.success) ; }, defaults: function () { $field.each(function (index, el) { var $el = $(el), $parent = $el.parent(), isCheckbox = $el.filter(selector.checkbox).length > 0, isDropdown = ($parent.is(selector.uiDropdown) || $el.is(selector.uiDropdown)) && module.can.useElement('dropdown'), $calendar = $el.closest(selector.uiCalendar), isCalendar = $calendar.length > 0 && module.can.useElement('calendar'), value = isCheckbox ? $el.is(':checked') : $el.val() ; if (isDropdown) { if ($parent.is(selector.uiDropdown)) { $parent.dropdown('save defaults'); } else { $el.dropdown('save defaults'); } } else if (isCalendar) { $calendar.calendar('refresh'); } $el.data(metadata.defaultValue, value); $el.data(metadata.isDirty, false); }); }, error: function () { $module .removeClass(className.success) .addClass(className.error) ; }, value: function (field, value) { var fields = {} ; fields[field] = value; return module.set.values.call(element, fields); }, values: function (fields) { if ($.isEmptyObject(fields)) { return; } $.each(fields, function (key, value) { var $field = module.get.field(key), $element = $field.parent(), $calendar = $field.closest(selector.uiCalendar), isFile = $field.is(selector.file), isMultiple = Array.isArray(value), isCheckbox = $element.is(selector.uiCheckbox) && module.can.useElement('checkbox'), isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'), isRadio = $field.is(selector.radio) && isCheckbox, isCalendar = $calendar.length > 0 && module.can.useElement('calendar'), fieldExists = $field.length > 0, $multipleField ; if (fieldExists) { if (isMultiple && isCheckbox) { module.verbose('Selecting multiple', value, $field); $element.checkbox('uncheck'); $.each(value, function (index, value) { $multipleField = $field.filter('[value="' + value + '"]'); $element = $multipleField.parent(); if ($multipleField.length > 0) { $element.checkbox('check'); } }); } else if (isRadio) { module.verbose('Selecting radio value', value, $field); $field.filter('[value="' + value + '"]') .parent(selector.uiCheckbox) .checkbox('check') ; } else if (isCheckbox) { module.verbose('Setting checkbox value', value, $element); if (value === true || value === 1 || value === 'on') { $element.checkbox('check'); } else { $element.checkbox('uncheck'); } if (typeof value === 'string') { $field.val(value); } } else if (isDropdown) { module.verbose('Setting dropdown value', value, $element); $element.dropdown('set selected', value); } else if (isCalendar) { $calendar.calendar('set date', value); } else { module.verbose('Setting field value', value, $field); $field.val(isFile ? '' : value); } } }); }, dirty: function () { module.verbose('Setting state dirty'); dirty = true; history[0] = history[1]; history[1] = 'dirty'; if (module.is.justClean()) { $module.trigger('dirty'); } }, clean: function () { module.verbose('Setting state clean'); dirty = false; history[0] = history[1]; history[1] = 'clean'; if (module.is.justDirty()) { $module.trigger('clean'); } }, asClean: function () { module.set.defaults(); module.set.clean(); }, asDirty: function () { module.set.defaults(); module.set.dirty(); }, autoCheck: function () { module.debug('Enabling auto check on required fields'); if (validation) { $.each(validation, function (fieldName) { if (!module.has.field(fieldName, true)) { module.verbose('Field not found, removing from validation', fieldName); module.remove.field(fieldName); } }); } $field.each(function (_index, el) { var $el = $(el), $elGroup = $el.closest($group), isCheckbox = $el.filter(selector.checkbox).length > 0, isRequired = $el.prop('required') || $elGroup.hasClass(className.required) || $elGroup.parent().hasClass(className.required), isDisabled = $el.is(':disabled') || $elGroup.hasClass(className.disabled) || $elGroup.parent().hasClass(className.disabled), validation = module.get.validation($el), hasNotEmptyRule = validation ? $.grep(validation.rules, function (rule) { return ['notEmpty', 'checked', 'empty'].indexOf(rule.type) >= 0; }).length > 0 : false, identifier = module.get.identifier(validation, $el) ; if (isRequired && !isDisabled && !hasNotEmptyRule && identifier !== undefined) { if (isCheckbox) { module.verbose("Adding 'checked' rule on field", identifier); module.add.rule(identifier, 'checked'); } else { module.verbose("Adding 'notEmpty' rule on field", identifier); module.add.rule(identifier, 'notEmpty'); } } }); }, optional: function (identifier, bool) { bool = bool !== false; $.each(validation, function (fieldName, field) { if (identifier === fieldName || identifier === field.identifier) { field.optional = bool; } }); }, }, validate: { form: function (event, ignoreCallbacks) { var values = module.get.values(); // input keydown event will fire submit repeatedly by browser default if (keyHeldDown) { return false; } $module.removeClass(className.initial); // reset errors formErrors = []; formErrorsTracker = {}; if (module.determine.isValid()) { module.debug('Form has no validation errors, submitting'); module.set.success(); if (!settings.inline) { module.remove.errors(); } if (ignoreCallbacks !== true) { return settings.onSuccess.call(element, event, values); } } else { module.debug('Form has errors'); submitting = false; module.set.error(); if (!settings.inline) { module.add.errors(formErrors); } // prevent ajax submit if (event && $module.data('moduleApi') !== undefined) { event.stopImmediatePropagation(); } if (settings.errorFocus && ignoreCallbacks !== true) { var $focusElement, hasTabIndex = true ; if (typeof settings.errorFocus === 'string') { $focusElement = $(document).find(settings.errorFocus); hasTabIndex = $focusElement.is('[tabindex]'); // to be able to focus/scroll into non input elements we need a tabindex if (!hasTabIndex) { $focusElement.attr('tabindex', -1); } } else { $focusElement = $group.filter('.' + className.error).first().find(selector.field); } $focusElement.trigger('focus'); // only remove tabindex if it was dynamically created above if (!hasTabIndex) { $focusElement.removeAttr('tabindex'); } } if (ignoreCallbacks !== true) { return settings.onFailure.call(element, formErrors, values); } } }, // takes a validation object and returns whether field passes validation field: function (field, fieldName, showErrors) { showErrors = showErrors !== undefined ? showErrors : true; if (typeof field === 'string') { module.verbose('Validating field', field); fieldName = field; field = validation[field]; } if (!field) { module.debug('Unable to find field validation. Skipping', fieldName); return true; } var identifier = field.identifier || fieldName, $field = module.get.field(identifier), $fieldGroup = $field.closest($group), $dependsField = field.depends ? module.get.field(field.depends) : false, fieldValid = true, fieldErrors = [], isDisabled = $field.filter(':not(:disabled)').length === 0 || $fieldGroup.hasClass(className.disabled) || $fieldGroup.parent().hasClass(className.disabled), validationMessage = $field[0].validationMessage, noNativeValidation = field.noNativeValidation || settings.noNativeValidation || $field.filter('[formnovalidate],[novalidate]').length > 0 || $module.filter('[novalidate]').length > 0, errorLimit ; if (!field.identifier) { module.debug('Using field name as identifier', identifier); field.identifier = identifier; } if (validationMessage && !noNativeValidation && !isDisabled) { module.debug('Field is natively invalid', identifier); fieldErrors.push(validationMessage); fieldValid = false; if (showErrors) { $fieldGroup.addClass(className.error); } } else if (showErrors) { $fieldGroup.removeClass(className.error); } if (isDisabled) { module.debug('Field is disabled. Skipping', identifier); } else if (field.optional && module.is.blank($field)) { module.debug('Field is optional and blank. Skipping', identifier); } else if (field.depends && module.is.empty($dependsField)) { module.debug('Field depends on another value that is not present or empty. Skipping', $dependsField); } else if (field.rules !== undefined) { errorLimit = field.errorLimit || settings.errorLimit; $.each(field.rules, function (index, rule) { if (module.has.field(identifier) && (!errorLimit || fieldErrors.length < errorLimit)) { var invalidFields = module.validate.rule(field, rule, true) || []; if (invalidFields.length > 0) { module.debug('Field is invalid', identifier, rule.type); var fieldError = module.get.prompt(rule, field); if (!settings.inline) { if ( // Always allow the first error prompt for new field identifiers (!(identifier in formErrorsTracker) // Also allow multiple error prompts per field identifier but make sure each prompt is unique || formErrorsTracker[identifier].indexOf(fieldError) === -1) // Limit the number of unique error prompts for every field identifier if specified && (!errorLimit || (formErrorsTracker[identifier] || []).length < errorLimit) ) { fieldErrors.push(fieldError); (formErrorsTracker[identifier] = formErrorsTracker[identifier] || []).push(fieldError); } } else { fieldErrors.push(fieldError); } fieldValid = false; if (showErrors) { $(invalidFields).closest($group).addClass(className.error); } } } }); } if (fieldValid) { if (showErrors) { module.remove.prompt(identifier); settings.onValid.call($field); } } else { if (showErrors && fieldErrors.length > 0) { formErrors = formErrors.concat(fieldErrors); module.add.prompt(identifier, fieldErrors, true); settings.onInvalid.call($field, fieldErrors); } return false; } return true; }, // takes validation rule and returns whether field passes rule rule: function (field, rule, internal) { var $field = module.get.field(field.identifier), ancillary = module.get.ancillaryValue(rule), ruleName = module.get.ruleName(rule), ruleFunction = settings.rules[ruleName], invalidFields = [], isCheckbox = $field.is(selector.checkbox), isValid = function (field) { var value = isCheckbox ? $(field).filter(':checked').val() : $(field).val(); // cast to string avoiding encoding special values value = value === undefined || value === '' || value === null ? '' : ((settings.shouldTrim && rule.shouldTrim !== false) || rule.shouldTrim ? String(value + '').trim() : String(value + '')); return ruleFunction.call(field, value, ancillary, module); } ; if (!isFunction(ruleFunction)) { module.error(error.noRule, ruleName); return; } if (isCheckbox) { if (!isValid($field)) { invalidFields = $field; } } else { $.each($field, function (index, field) { if (!isValid(field)) { invalidFields.push(field); } }); } return internal ? invalidFields : invalidFields.length === 0; }, }, setting: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { settings[name] = value; } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, warn: function () { if (!settings.silent) { module.warn = Function.prototype.bind.call(console.warn, console, settings.name + ':'); module.warn.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if ($allModules.length > 1) { title += ' (' + $allModules.length + ')'; } if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; module.initialize(); }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.form.settings = { name: 'Form', namespace: 'form', silent: false, debug: false, verbose: false, performance: true, fields: false, keyboardShortcuts: true, on: 'submit', inline: false, delay: 200, revalidate: true, shouldTrim: true, transition: 'scale', duration: 200, autoCheckRequired: false, preventLeaving: false, errorFocus: true, dateHandling: 'date', // 'date', 'input', 'formatter' errorLimit: 0, noNativeValidation: false, onValid: function () {}, onInvalid: function () {}, onSuccess: function () { return true; }, onFailure: function () { return false; }, onDirty: function () {}, onClean: function () {}, metadata: { defaultValue: 'default', validate: 'validate', isDirty: 'isDirty', }, regExp: { htmlID: /^[A-Za-z][\w.:-]*$/g, bracket: /\[(.*)]/i, decimal: /^\d+\.?\d*$/, email: /^[\w!#$%&'*+./=?^`{|}~-]+@[\da-z]([\da-z-]*[\da-z])?(\.[\da-z]([\da-z-]*[\da-z])?)*$/i, escape: /[$()*+,./:=?@[\\\]^{|}-]/g, flags: /^\/(.*)\/(.*)?/, integer: /^-?\d+$/, number: /^-?\d*(\.\d+)?$/, url: /(https?:\/\/(?:www\.|(?!www))[^\s.]+\.\S{2,}|www\.\S+\.\S{2,})/i, }, text: { and: 'and', unspecifiedRule: 'Please enter a valid value', unspecifiedField: 'This field', leavingMessage: 'There are unsaved changes on this page which will be discarded if you continue.', }, prompt: { range: '{name} must be in a range from {min} to {max}', maxValue: '{name} must have a maximum value of {ruleValue}', minValue: '{name} must have a minimum value of {ruleValue}', empty: '{name} must have a value', notEmpty: '{name} must have a value', checked: '{name} must be checked', email: '{name} must be a valid e-mail', url: '{name} must be a valid url', regExp: '{name} is not formatted correctly', integer: '{name} must be an integer', decimal: '{name} must be a decimal number', number: '{name} must be set to a number', is: '{name} must be "{ruleValue}"', isExactly: '{name} must be exactly "{ruleValue}"', not: '{name} cannot be set to "{ruleValue}"', notExactly: '{name} cannot be set to exactly "{ruleValue}"', contains: '{name} must contain "{ruleValue}"', containsExactly: '{name} must contain exactly "{ruleValue}"', doesntContain: '{name} cannot contain "{ruleValue}"', doesntContainExactly: '{name} cannot contain exactly "{ruleValue}"', minLength: '{name} must be at least {ruleValue} characters', exactLength: '{name} must be exactly {ruleValue} characters', maxLength: '{name} cannot be longer than {ruleValue} characters', size: '{name} must have a length between {min} and {max} characters', match: '{name} must match {ruleValue} field', different: '{name} must have a different value than {ruleValue} field', creditCard: '{name} must be a valid credit card number', minCount: '{name} must have at least {ruleValue} choices', exactCount: '{name} must have exactly {ruleValue} choices', maxCount: '{name} must have {ruleValue} or less choices', addErrors: '{name}: {error}', }, selector: { checkbox: 'input[type="checkbox"], input[type="radio"]', clear: '.clear', field: 'input:not(.search):not([type="reset"]):not([type="button"]):not([type="submit"]), textarea, select', file: 'input[type="file"]', group: '.field', input: 'input', message: '.error.message', prompt: '.prompt.label', radio: 'input[type="radio"]', reset: '.reset:not([type="reset"])', submit: '.submit:not([type="submit"])', uiCheckbox: '.ui.checkbox', uiDropdown: '.ui.dropdown', uiCalendar: '.ui.calendar', }, className: { initial: 'initial', error: 'error', label: 'ui basic red pointing prompt label', pressed: 'down', success: 'success', required: 'required', disabled: 'disabled', }, error: { method: 'The method you called is not defined.', noRule: 'There is no rule matching the one you specified', noField: 'Field identifier {identifier} not found', noElement: 'This module requires ui {element}', noErrorMessage: 'No error message provided', }, templates: { // template that produces error message error: function (errors) { var html = '<ul class="list">' ; $.each(errors, function (index, value) { html += '<li>' + value + '</li>'; }); html += '</ul>'; return html; }, // template that produces label content prompt: function (errors) { if (errors.length === 1) { return errors[0]; } var html = '<ul class="ui list">' ; $.each(errors, function (index, value) { html += '<li>' + value + '</li>'; }); html += '</ul>'; return html; }, }, formatter: { date: function (date) { return Intl.DateTimeFormat('en-GB').format(date); }, datetime: function (date) { return Intl.DateTimeFormat('en-GB', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', }).format(date); }, time: function (date) { return Intl.DateTimeFormat('en-GB', { hour: '2-digit', minute: '2-digit', second: '2-digit', }).format(date); }, month: function (date) { return Intl.DateTimeFormat('en-GB', { month: '2-digit', year: 'numeric', }).format(date); }, year: function (date) { return Intl.DateTimeFormat('en-GB', { year: 'numeric', }).format(date); }, }, rules: { // is not empty or blank string notEmpty: function (value) { return !(value === undefined || value === '' || (Array.isArray(value) && value.length === 0)); }, /* Deprecated */ empty: function (value) { return $.fn.form.settings.rules.notEmpty(value); }, // checkbox checked checked: function () { return $(this).filter(':checked').length > 0; }, // is most likely an email email: function (value) { return $.fn.form.settings.regExp.email.test(value); }, // value is most likely url url: function (value) { return $.fn.form.settings.regExp.url.test(value); }, // matches specified regExp regExp: function (value, regExp) { if (regExp instanceof RegExp) { return value.match(regExp); } var regExpParts = regExp.match($.fn.form.settings.regExp.flags), flags ; // regular expression specified as /baz/gi (flags) if (regExpParts) { regExp = regExpParts.length >= 2 ? regExpParts[1] : regExp; flags = regExpParts.length >= 3 ? regExpParts[2] : ''; } return value.match(new RegExp(regExp, flags)); }, minValue: function (value, range) { return $.fn.form.settings.rules.range(value, range + '..', 'number'); }, maxValue: function (value, range) { return $.fn.form.settings.rules.range(value, '..' + range, 'number'); }, // is valid integer or matches range integer: function (value, range) { return $.fn.form.settings.rules.range(value, range, 'integer'); }, range: function (value, range, regExp, testLength) { if (typeof regExp === 'string') { regExp = $.fn.form.settings.regExp[regExp]; } if (!(regExp instanceof RegExp)) { regExp = $.fn.form.settings.regExp.integer; } var min, max, parts ; if (!range || ['', '..'].indexOf(range) !== -1) { // do nothing } else if (range.indexOf('..') === -1) { if (regExp.test(range)) { min = range - 0; max = min; } } else { parts = range.split('..', 2); if (regExp.test(parts[0])) { min = parts[0] - 0; } if (regExp.test(parts[1])) { max = parts[1] - 0; } } if (testLength) { value = value.length; } return ( regExp.test(value) && (min === undefined || value >= min) && (max === undefined || value <= max) ); }, // is valid number (with decimal) decimal: function (value, range) { return $.fn.form.settings.rules.range(value, range, 'decimal'); }, // is valid number number: function (value, range) { return $.fn.form.settings.rules.range(value, range, 'number'); }, // is value (case insensitive) is: function (value, text) { text = typeof text === 'string' ? text.toLowerCase() : text; value = typeof value === 'string' ? value.toLowerCase() : value; return value == text; }, // is value isExactly: function (value, text) { return value == text; }, // value is not another value (case insensitive) not: function (value, notValue) { value = typeof value === 'string' ? value.toLowerCase() : value; notValue = typeof notValue === 'string' ? notValue.toLowerCase() : notValue; return value != notValue; }, // value is not another value (case sensitive) notExactly: function (value, notValue) { return value != notValue; }, // value contains text (insensitive) contains: function (value, text) { // escape regex characters text = text.replace($.fn.form.settings.regExp.escape, '\\$&'); return value.search(new RegExp(text, 'i')) !== -1; }, // value contains text (case sensitive) containsExactly: function (value, text) { // escape regex characters text = text.replace($.fn.form.settings.regExp.escape, '\\$&'); return value.search(new RegExp(text)) !== -1; }, // value contains text (insensitive) doesntContain: function (value, text) { // escape regex characters text = text.replace($.fn.form.settings.regExp.escape, '\\$&'); return value.search(new RegExp(text, 'i')) === -1; }, // value contains text (case sensitive) doesntContainExactly: function (value, text) { // escape regex characters text = text.replace($.fn.form.settings.regExp.escape, '\\$&'); return value.search(new RegExp(text)) === -1; }, // is at least string length minLength: function (value, minLength) { return $.fn.form.settings.rules.range(value, minLength + '..', 'integer', true); }, // is exactly length exactLength: function (value, requiredLength) { return $.fn.form.settings.rules.range(value, requiredLength + '..' + requiredLength, 'integer', true); }, // is less than length maxLength: function (value, maxLength) { return $.fn.form.settings.rules.range(value, '..' + maxLength, 'integer', true); }, size: function (value, range) { return $.fn.form.settings.rules.range(value, range, 'integer', true); }, // matches another field match: function (value, identifier, module) { var matchingValue = module.get.value(identifier, true); return matchingValue !== undefined ? value.toString() === matchingValue.toString() : false; }, // different than another field different: function (value, identifier, module) { var matchingValue = module.get.value(identifier, true); return matchingValue !== undefined ? value.toString() !== matchingValue.toString() : false; }, creditCard: function (cardNumber, cardTypes) { var cards = { visa: { pattern: /^4/, length: [16], }, amex: { pattern: /^3[47]/, length: [15], }, mastercard: { pattern: /^5[1-5]/, length: [16], }, discover: { pattern: /^(6011|622(12[6-9]|1[3-9]\d|[2-8]\d{2}|9[01]\d|92[0-5]|64[4-9])|65)/, length: [16], }, unionPay: { pattern: /^(62|88)/, length: [16, 17, 18, 19], }, jcb: { pattern: /^35(2[89]|[3-8]\d)/, length: [16], }, maestro: { pattern: /^(5018|5020|5038|6304|6759|676[1-3])/, length: [12, 13, 14, 15, 16, 17, 18, 19], }, dinersClub: { pattern: /^(30[0-5]|^36)/, length: [14], }, laser: { pattern: /^(6304|670[69]|6771)/, length: [16, 17, 18, 19], }, visaElectron: { pattern: /^(4026|417500|4508|4844|491(3|7))/, length: [16], }, }, valid = {}, validCard = false, requiredTypes = typeof cardTypes === 'string' ? cardTypes.split(',') : false, unionPay, validation ; if (typeof cardNumber !== 'string' || cardNumber.length === 0) { return; } // allow dashes and spaces in card cardNumber = cardNumber.replace(/[\s-]/g, ''); // verify card types if (requiredTypes) { $.each(requiredTypes, function (index, type) { // verify each card type validation = cards[type]; if (validation) { valid = { length: $.inArray(cardNumber.length, validation.length) !== -1, pattern: cardNumber.search(validation.pattern) !== -1, }; if (valid.length > 0 && valid.pattern) { validCard = true; } } }); if (!validCard) { return false; } } // skip luhn for UnionPay unionPay = { number: $.inArray(cardNumber.length, cards.unionPay.length) !== -1, pattern: cardNumber.search(cards.unionPay.pattern) !== -1, }; if (unionPay.number && unionPay.pattern) { return true; } // verify luhn, adapted from <https://gist.github.com/2134376> var length = cardNumber.length, multiple = 0, producedValue = [ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 2, 4, 6, 8, 1, 3, 5, 7, 9], ], sum = 0 ; while (length--) { sum += producedValue[multiple][parseInt(cardNumber.charAt(length), 10)]; multiple ^= 1; // eslint-disable-line no-bitwise } return sum % 10 === 0 && sum > 0; }, minCount: function (value, minCount) { minCount = Number(minCount); if (minCount === 0) { return true; } if (minCount === 1) { return value !== ''; } return value.split(',').length >= minCount; }, exactCount: function (value, exactCount) { exactCount = Number(exactCount); if (exactCount === 0) { return value === ''; } if (exactCount === 1) { return value !== '' && value.search(',') === -1; } return value.split(',').length === exactCount; }, maxCount: function (value, maxCount) { maxCount = Number(maxCount); if (maxCount === 0) { return false; } if (maxCount === 1) { return value.search(',') === -1; } return value.split(',').length <= maxCount; }, }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/grid.css ================================================ /*! * # Fomantic-UI 2.9.4 - Grid * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Standard *******************************/ .ui.grid { display: flex; flex-flow: row wrap; align-items: stretch; padding: 0; } /* ---------------------- Remove Gutters ----------------------- */ .ui.grid { margin: -1rem -1rem; } .ui.relaxed.grid { margin-left: -1.5rem; margin-right: -1.5rem; } .ui[class*="very relaxed"].grid { margin-left: -2.5rem; margin-right: -2.5rem; } /* Preserve Rows Spacing on Consecutive Grids */ .ui.grid + .grid { margin-top: 1rem; } /* ------------------- Columns -------------------- */ /* Standard 16 column */ .ui.grid > .column:not(.row), .ui.grid > .row > .column { position: relative; display: inline-block; width: 6.25%; padding-left: 1rem; padding-right: 1rem; vertical-align: top; } .ui.grid > * { padding-left: 1rem; padding-right: 1rem; } /* ------------------- Rows -------------------- */ .ui.grid > .row { position: relative; display: flex; flex-flow: row wrap; justify-content: inherit; align-items: stretch; width: 100% !important; padding: 0; padding-top: 1rem; padding-bottom: 1rem; } /* ------------------- Columns -------------------- */ /* Vertical padding when no rows */ .ui.grid > .column:not(.row) { padding-top: 1rem; padding-bottom: 1rem; } .ui.grid > .row > .column { margin-top: 0; margin-bottom: 0; } /* ------------------- Content -------------------- */ .ui.grid > .row > img, .ui.grid > .row > .column > img { max-width: 100%; } /* ------------------- Loose Coupling -------------------- */ /* Collapse Margin on Consecutive Grid */ .ui.grid > .ui.grid:first-child { margin-top: 0; } .ui.grid > .ui.grid:last-child { margin-bottom: 0; } /* Segment inside Aligned Grid */ .ui.grid .aligned.row > .column > .segment:not(.compact):not(.attached), .ui.aligned.grid .column > .segment:not(.compact):not(.attached) { width: 100%; } /* Align Dividers with Gutter */ .ui.grid .row + .ui.divider { flex-grow: 1; margin: 1rem 1rem; } .ui.grid .column + .ui.vertical.divider { height: calc(50% - 1rem); } /* Remove Border on Last Horizontal Segment */ .ui.grid > .row > .column:last-child > .horizontal.segment, .ui.grid > .column:last-child > .horizontal.segment { box-shadow: none; } /******************************* Variations *******************************/ /* ----------------------- Page Grid ------------------------- */ @media only screen and (max-width: 767.98px) { .ui.page.grid { width: auto; padding-left: 0; padding-right: 0; margin-left: 0; margin-right: 0; } } @media only screen and (min-width: 768px) and (max-width: 991.98px) { .ui.page.grid { width: auto; margin-left: 0; margin-right: 0; padding-left: 2em; padding-right: 2em; } } @media only screen and (min-width: 992px) and (max-width: 1199.98px) { .ui.page.grid { width: auto; margin-left: 0; margin-right: 0; padding-left: 3%; padding-right: 3%; } } @media only screen and (min-width: 1200px) and (max-width: 1919.98px) { .ui.page.grid { width: auto; margin-left: 0; margin-right: 0; padding-left: 15%; padding-right: 15%; } } @media only screen and (min-width: 1920px) { .ui.page.grid { width: auto; margin-left: 0; margin-right: 0; padding-left: 23%; padding-right: 23%; } } /* ------------------- Column Count -------------------- */ /* Assume full width with one column */ .ui.grid > .column:only-child, .ui.grid > .row > .column:only-child { width: 100%; } /* Grid Based */ .ui[class*="one column"].grid > .row > .column, .ui[class*="one column"].grid > .column:not(.row) { width: 100%; } .ui[class*="two column"].grid > .row > .column, .ui[class*="two column"].grid > .column:not(.row) { width: 50%; } .ui[class*="three column"].grid > .row > .column, .ui[class*="three column"].grid > .column:not(.row) { width: 33.33333333%; } .ui[class*="four column"].grid > .row > .column, .ui[class*="four column"].grid > .column:not(.row) { width: 25%; } .ui[class*="five column"].grid > .row > .column, .ui[class*="five column"].grid > .column:not(.row) { width: 20%; } .ui[class*="six column"].grid > .row > .column, .ui[class*="six column"].grid > .column:not(.row) { width: 16.66666667%; } .ui[class*="seven column"].grid > .row > .column, .ui[class*="seven column"].grid > .column:not(.row) { width: 14.28571429%; } .ui[class*="eight column"].grid > .row > .column, .ui[class*="eight column"].grid > .column:not(.row) { width: 12.5%; } .ui[class*="nine column"].grid > .row > .column, .ui[class*="nine column"].grid > .column:not(.row) { width: 11.11111111%; } .ui[class*="ten column"].grid > .row > .column, .ui[class*="ten column"].grid > .column:not(.row) { width: 10%; } .ui[class*="eleven column"].grid > .row > .column, .ui[class*="eleven column"].grid > .column:not(.row) { width: 9.09090909%; } .ui[class*="twelve column"].grid > .row > .column, .ui[class*="twelve column"].grid > .column:not(.row) { width: 8.33333333%; } .ui[class*="thirteen column"].grid > .row > .column, .ui[class*="thirteen column"].grid > .column:not(.row) { width: 7.69230769%; } .ui[class*="fourteen column"].grid > .row > .column, .ui[class*="fourteen column"].grid > .column:not(.row) { width: 7.14285714%; } .ui[class*="fifteen column"].grid > .row > .column, .ui[class*="fifteen column"].grid > .column:not(.row) { width: 6.66666667%; } .ui[class*="sixteen column"].grid > .row > .column, .ui[class*="sixteen column"].grid > .column:not(.row) { width: 6.25%; } /* Row Based Overrides */ .ui.grid > [class*="one column"].row > .column { width: 100% !important; } .ui.grid > [class*="two column"].row > .column { width: 50% !important; } .ui.grid > [class*="three column"].row > .column { width: 33.33333333% !important; } .ui.grid > [class*="four column"].row > .column { width: 25% !important; } .ui.grid > [class*="five column"].row > .column { width: 20% !important; } .ui.grid > [class*="six column"].row > .column { width: 16.66666667% !important; } .ui.grid > [class*="seven column"].row > .column { width: 14.28571429% !important; } .ui.grid > [class*="eight column"].row > .column { width: 12.5% !important; } .ui.grid > [class*="nine column"].row > .column { width: 11.11111111% !important; } .ui.grid > [class*="ten column"].row > .column { width: 10% !important; } .ui.grid > [class*="eleven column"].row > .column { width: 9.09090909% !important; } .ui.grid > [class*="twelve column"].row > .column { width: 8.33333333% !important; } .ui.grid > [class*="thirteen column"].row > .column { width: 7.69230769% !important; } .ui.grid > [class*="fourteen column"].row > .column { width: 7.14285714% !important; } .ui.grid > [class*="fifteen column"].row > .column { width: 6.66666667% !important; } .ui.grid > [class*="sixteen column"].row > .column { width: 6.25% !important; } /* Celled Page */ .ui.celled.page.grid { box-shadow: none; } /* ------------------- Column Width -------------------- */ /* Sizing Combinations */ .ui.grid > .row > [class*="one wide"].column, .ui.grid > .column.row > [class*="one wide"].column, .ui.grid > [class*="one wide"].column, .ui.column.grid > [class*="one wide"].column { width: 6.25% !important; } .ui.grid > .row > [class*="two wide"].column, .ui.grid > .column.row > [class*="two wide"].column, .ui.grid > [class*="two wide"].column, .ui.column.grid > [class*="two wide"].column { width: 12.5% !important; } .ui.grid > .row > [class*="three wide"].column, .ui.grid > .column.row > [class*="three wide"].column, .ui.grid > [class*="three wide"].column, .ui.column.grid > [class*="three wide"].column { width: 18.75% !important; } .ui.grid > .row > [class*="four wide"].column, .ui.grid > .column.row > [class*="four wide"].column, .ui.grid > [class*="four wide"].column, .ui.column.grid > [class*="four wide"].column { width: 25% !important; } .ui.grid > .row > [class*="five wide"].column, .ui.grid > .column.row > [class*="five wide"].column, .ui.grid > [class*="five wide"].column, .ui.column.grid > [class*="five wide"].column { width: 31.25% !important; } .ui.grid > .row > [class*="six wide"].column, .ui.grid > .column.row > [class*="six wide"].column, .ui.grid > [class*="six wide"].column, .ui.column.grid > [class*="six wide"].column { width: 37.5% !important; } .ui.grid > .row > [class*="seven wide"].column, .ui.grid > .column.row > [class*="seven wide"].column, .ui.grid > [class*="seven wide"].column, .ui.column.grid > [class*="seven wide"].column { width: 43.75% !important; } .ui.grid > .row > [class*="eight wide"].column, .ui.grid > .column.row > [class*="eight wide"].column, .ui.grid > [class*="eight wide"].column, .ui.column.grid > [class*="eight wide"].column { width: 50% !important; } .ui.grid > .row > [class*="nine wide"].column, .ui.grid > .column.row > [class*="nine wide"].column, .ui.grid > [class*="nine wide"].column, .ui.column.grid > [class*="nine wide"].column { width: 56.25% !important; } .ui.grid > .row > [class*="ten wide"].column, .ui.grid > .column.row > [class*="ten wide"].column, .ui.grid > [class*="ten wide"].column, .ui.column.grid > [class*="ten wide"].column { width: 62.5% !important; } .ui.grid > .row > [class*="eleven wide"].column, .ui.grid > .column.row > [class*="eleven wide"].column, .ui.grid > [class*="eleven wide"].column, .ui.column.grid > [class*="eleven wide"].column { width: 68.75% !important; } .ui.grid > .row > [class*="twelve wide"].column, .ui.grid > .column.row > [class*="twelve wide"].column, .ui.grid > [class*="twelve wide"].column, .ui.column.grid > [class*="twelve wide"].column { width: 75% !important; } .ui.grid > .row > [class*="thirteen wide"].column, .ui.grid > .column.row > [class*="thirteen wide"].column, .ui.grid > [class*="thirteen wide"].column, .ui.column.grid > [class*="thirteen wide"].column { width: 81.25% !important; } .ui.grid > .row > [class*="fourteen wide"].column, .ui.grid > .column.row > [class*="fourteen wide"].column, .ui.grid > [class*="fourteen wide"].column, .ui.column.grid > [class*="fourteen wide"].column { width: 87.5% !important; } .ui.grid > .row > [class*="fifteen wide"].column, .ui.grid > .column.row > [class*="fifteen wide"].column, .ui.grid > [class*="fifteen wide"].column, .ui.column.grid > [class*="fifteen wide"].column { width: 93.75% !important; } .ui.grid > .row > [class*="sixteen wide"].column, .ui.grid > .column.row > [class*="sixteen wide"].column, .ui.grid > [class*="sixteen wide"].column, .ui.column.grid > [class*="sixteen wide"].column { width: 100% !important; } /* ---------------------- Width per Device ----------------------- */ /* Mobile Sizing Combinations */ @media only screen and (min-width: 320px) and (max-width: 767.98px) { .ui.grid > .row > [class*="one wide mobile"].column, .ui.grid > .column.row > [class*="one wide mobile"].column, .ui.grid > [class*="one wide mobile"].column, .ui.column.grid > [class*="one wide mobile"].column { width: 6.25% !important; } .ui.grid > .row > [class*="two wide mobile"].column, .ui.grid > .column.row > [class*="two wide mobile"].column, .ui.grid > [class*="two wide mobile"].column, .ui.column.grid > [class*="two wide mobile"].column { width: 12.5% !important; } .ui.grid > .row > [class*="three wide mobile"].column, .ui.grid > .column.row > [class*="three wide mobile"].column, .ui.grid > [class*="three wide mobile"].column, .ui.column.grid > [class*="three wide mobile"].column { width: 18.75% !important; } .ui.grid > .row > [class*="four wide mobile"].column, .ui.grid > .column.row > [class*="four wide mobile"].column, .ui.grid > [class*="four wide mobile"].column, .ui.column.grid > [class*="four wide mobile"].column { width: 25% !important; } .ui.grid > .row > [class*="five wide mobile"].column, .ui.grid > .column.row > [class*="five wide mobile"].column, .ui.grid > [class*="five wide mobile"].column, .ui.column.grid > [class*="five wide mobile"].column { width: 31.25% !important; } .ui.grid > .row > [class*="six wide mobile"].column, .ui.grid > .column.row > [class*="six wide mobile"].column, .ui.grid > [class*="six wide mobile"].column, .ui.column.grid > [class*="six wide mobile"].column { width: 37.5% !important; } .ui.grid > .row > [class*="seven wide mobile"].column, .ui.grid > .column.row > [class*="seven wide mobile"].column, .ui.grid > [class*="seven wide mobile"].column, .ui.column.grid > [class*="seven wide mobile"].column { width: 43.75% !important; } .ui.grid > .row > [class*="eight wide mobile"].column, .ui.grid > .column.row > [class*="eight wide mobile"].column, .ui.grid > [class*="eight wide mobile"].column, .ui.column.grid > [class*="eight wide mobile"].column { width: 50% !important; } .ui.grid > .row > [class*="nine wide mobile"].column, .ui.grid > .column.row > [class*="nine wide mobile"].column, .ui.grid > [class*="nine wide mobile"].column, .ui.column.grid > [class*="nine wide mobile"].column { width: 56.25% !important; } .ui.grid > .row > [class*="ten wide mobile"].column, .ui.grid > .column.row > [class*="ten wide mobile"].column, .ui.grid > [class*="ten wide mobile"].column, .ui.column.grid > [class*="ten wide mobile"].column { width: 62.5% !important; } .ui.grid > .row > [class*="eleven wide mobile"].column, .ui.grid > .column.row > [class*="eleven wide mobile"].column, .ui.grid > [class*="eleven wide mobile"].column, .ui.column.grid > [class*="eleven wide mobile"].column { width: 68.75% !important; } .ui.grid > .row > [class*="twelve wide mobile"].column, .ui.grid > .column.row > [class*="twelve wide mobile"].column, .ui.grid > [class*="twelve wide mobile"].column, .ui.column.grid > [class*="twelve wide mobile"].column { width: 75% !important; } .ui.grid > .row > [class*="thirteen wide mobile"].column, .ui.grid > .column.row > [class*="thirteen wide mobile"].column, .ui.grid > [class*="thirteen wide mobile"].column, .ui.column.grid > [class*="thirteen wide mobile"].column { width: 81.25% !important; } .ui.grid > .row > [class*="fourteen wide mobile"].column, .ui.grid > .column.row > [class*="fourteen wide mobile"].column, .ui.grid > [class*="fourteen wide mobile"].column, .ui.column.grid > [class*="fourteen wide mobile"].column { width: 87.5% !important; } .ui.grid > .row > [class*="fifteen wide mobile"].column, .ui.grid > .column.row > [class*="fifteen wide mobile"].column, .ui.grid > [class*="fifteen wide mobile"].column, .ui.column.grid > [class*="fifteen wide mobile"].column { width: 93.75% !important; } .ui.grid > .row > [class*="sixteen wide mobile"].column, .ui.grid > .column.row > [class*="sixteen wide mobile"].column, .ui.grid > [class*="sixteen wide mobile"].column, .ui.column.grid > [class*="sixteen wide mobile"].column { width: 100% !important; } } /* Tablet Sizing Combinations */ @media only screen and (min-width: 768px) and (max-width: 991.98px) { .ui.grid > .row > [class*="one wide tablet"].column, .ui.grid > .column.row > [class*="one wide tablet"].column, .ui.grid > [class*="one wide tablet"].column, .ui.column.grid > [class*="one wide tablet"].column { width: 6.25% !important; } .ui.grid > .row > [class*="two wide tablet"].column, .ui.grid > .column.row > [class*="two wide tablet"].column, .ui.grid > [class*="two wide tablet"].column, .ui.column.grid > [class*="two wide tablet"].column { width: 12.5% !important; } .ui.grid > .row > [class*="three wide tablet"].column, .ui.grid > .column.row > [class*="three wide tablet"].column, .ui.grid > [class*="three wide tablet"].column, .ui.column.grid > [class*="three wide tablet"].column { width: 18.75% !important; } .ui.grid > .row > [class*="four wide tablet"].column, .ui.grid > .column.row > [class*="four wide tablet"].column, .ui.grid > [class*="four wide tablet"].column, .ui.column.grid > [class*="four wide tablet"].column { width: 25% !important; } .ui.grid > .row > [class*="five wide tablet"].column, .ui.grid > .column.row > [class*="five wide tablet"].column, .ui.grid > [class*="five wide tablet"].column, .ui.column.grid > [class*="five wide tablet"].column { width: 31.25% !important; } .ui.grid > .row > [class*="six wide tablet"].column, .ui.grid > .column.row > [class*="six wide tablet"].column, .ui.grid > [class*="six wide tablet"].column, .ui.column.grid > [class*="six wide tablet"].column { width: 37.5% !important; } .ui.grid > .row > [class*="seven wide tablet"].column, .ui.grid > .column.row > [class*="seven wide tablet"].column, .ui.grid > [class*="seven wide tablet"].column, .ui.column.grid > [class*="seven wide tablet"].column { width: 43.75% !important; } .ui.grid > .row > [class*="eight wide tablet"].column, .ui.grid > .column.row > [class*="eight wide tablet"].column, .ui.grid > [class*="eight wide tablet"].column, .ui.column.grid > [class*="eight wide tablet"].column { width: 50% !important; } .ui.grid > .row > [class*="nine wide tablet"].column, .ui.grid > .column.row > [class*="nine wide tablet"].column, .ui.grid > [class*="nine wide tablet"].column, .ui.column.grid > [class*="nine wide tablet"].column { width: 56.25% !important; } .ui.grid > .row > [class*="ten wide tablet"].column, .ui.grid > .column.row > [class*="ten wide tablet"].column, .ui.grid > [class*="ten wide tablet"].column, .ui.column.grid > [class*="ten wide tablet"].column { width: 62.5% !important; } .ui.grid > .row > [class*="eleven wide tablet"].column, .ui.grid > .column.row > [class*="eleven wide tablet"].column, .ui.grid > [class*="eleven wide tablet"].column, .ui.column.grid > [class*="eleven wide tablet"].column { width: 68.75% !important; } .ui.grid > .row > [class*="twelve wide tablet"].column, .ui.grid > .column.row > [class*="twelve wide tablet"].column, .ui.grid > [class*="twelve wide tablet"].column, .ui.column.grid > [class*="twelve wide tablet"].column { width: 75% !important; } .ui.grid > .row > [class*="thirteen wide tablet"].column, .ui.grid > .column.row > [class*="thirteen wide tablet"].column, .ui.grid > [class*="thirteen wide tablet"].column, .ui.column.grid > [class*="thirteen wide tablet"].column { width: 81.25% !important; } .ui.grid > .row > [class*="fourteen wide tablet"].column, .ui.grid > .column.row > [class*="fourteen wide tablet"].column, .ui.grid > [class*="fourteen wide tablet"].column, .ui.column.grid > [class*="fourteen wide tablet"].column { width: 87.5% !important; } .ui.grid > .row > [class*="fifteen wide tablet"].column, .ui.grid > .column.row > [class*="fifteen wide tablet"].column, .ui.grid > [class*="fifteen wide tablet"].column, .ui.column.grid > [class*="fifteen wide tablet"].column { width: 93.75% !important; } .ui.grid > .row > [class*="sixteen wide tablet"].column, .ui.grid > .column.row > [class*="sixteen wide tablet"].column, .ui.grid > [class*="sixteen wide tablet"].column, .ui.column.grid > [class*="sixteen wide tablet"].column { width: 100% !important; } } /* Computer/Desktop Sizing Combinations */ @media only screen and (min-width: 992px) { .ui.grid > .row > [class*="one wide computer"].column, .ui.grid > .column.row > [class*="one wide computer"].column, .ui.grid > [class*="one wide computer"].column, .ui.column.grid > [class*="one wide computer"].column { width: 6.25% !important; } .ui.grid > .row > [class*="two wide computer"].column, .ui.grid > .column.row > [class*="two wide computer"].column, .ui.grid > [class*="two wide computer"].column, .ui.column.grid > [class*="two wide computer"].column { width: 12.5% !important; } .ui.grid > .row > [class*="three wide computer"].column, .ui.grid > .column.row > [class*="three wide computer"].column, .ui.grid > [class*="three wide computer"].column, .ui.column.grid > [class*="three wide computer"].column { width: 18.75% !important; } .ui.grid > .row > [class*="four wide computer"].column, .ui.grid > .column.row > [class*="four wide computer"].column, .ui.grid > [class*="four wide computer"].column, .ui.column.grid > [class*="four wide computer"].column { width: 25% !important; } .ui.grid > .row > [class*="five wide computer"].column, .ui.grid > .column.row > [class*="five wide computer"].column, .ui.grid > [class*="five wide computer"].column, .ui.column.grid > [class*="five wide computer"].column { width: 31.25% !important; } .ui.grid > .row > [class*="six wide computer"].column, .ui.grid > .column.row > [class*="six wide computer"].column, .ui.grid > [class*="six wide computer"].column, .ui.column.grid > [class*="six wide computer"].column { width: 37.5% !important; } .ui.grid > .row > [class*="seven wide computer"].column, .ui.grid > .column.row > [class*="seven wide computer"].column, .ui.grid > [class*="seven wide computer"].column, .ui.column.grid > [class*="seven wide computer"].column { width: 43.75% !important; } .ui.grid > .row > [class*="eight wide computer"].column, .ui.grid > .column.row > [class*="eight wide computer"].column, .ui.grid > [class*="eight wide computer"].column, .ui.column.grid > [class*="eight wide computer"].column { width: 50% !important; } .ui.grid > .row > [class*="nine wide computer"].column, .ui.grid > .column.row > [class*="nine wide computer"].column, .ui.grid > [class*="nine wide computer"].column, .ui.column.grid > [class*="nine wide computer"].column { width: 56.25% !important; } .ui.grid > .row > [class*="ten wide computer"].column, .ui.grid > .column.row > [class*="ten wide computer"].column, .ui.grid > [class*="ten wide computer"].column, .ui.column.grid > [class*="ten wide computer"].column { width: 62.5% !important; } .ui.grid > .row > [class*="eleven wide computer"].column, .ui.grid > .column.row > [class*="eleven wide computer"].column, .ui.grid > [class*="eleven wide computer"].column, .ui.column.grid > [class*="eleven wide computer"].column { width: 68.75% !important; } .ui.grid > .row > [class*="twelve wide computer"].column, .ui.grid > .column.row > [class*="twelve wide computer"].column, .ui.grid > [class*="twelve wide computer"].column, .ui.column.grid > [class*="twelve wide computer"].column { width: 75% !important; } .ui.grid > .row > [class*="thirteen wide computer"].column, .ui.grid > .column.row > [class*="thirteen wide computer"].column, .ui.grid > [class*="thirteen wide computer"].column, .ui.column.grid > [class*="thirteen wide computer"].column { width: 81.25% !important; } .ui.grid > .row > [class*="fourteen wide computer"].column, .ui.grid > .column.row > [class*="fourteen wide computer"].column, .ui.grid > [class*="fourteen wide computer"].column, .ui.column.grid > [class*="fourteen wide computer"].column { width: 87.5% !important; } .ui.grid > .row > [class*="fifteen wide computer"].column, .ui.grid > .column.row > [class*="fifteen wide computer"].column, .ui.grid > [class*="fifteen wide computer"].column, .ui.column.grid > [class*="fifteen wide computer"].column { width: 93.75% !important; } .ui.grid > .row > [class*="sixteen wide computer"].column, .ui.grid > .column.row > [class*="sixteen wide computer"].column, .ui.grid > [class*="sixteen wide computer"].column, .ui.column.grid > [class*="sixteen wide computer"].column { width: 100% !important; } } /* Large Monitor Sizing Combinations */ @media only screen and (min-width: 1200px) and (max-width: 1919.98px) { .ui.grid > .row > [class*="one wide large screen"].column, .ui.grid > .column.row > [class*="one wide large screen"].column, .ui.grid > [class*="one wide large screen"].column, .ui.column.grid > [class*="one wide large screen"].column { width: 6.25% !important; } .ui.grid > .row > [class*="two wide large screen"].column, .ui.grid > .column.row > [class*="two wide large screen"].column, .ui.grid > [class*="two wide large screen"].column, .ui.column.grid > [class*="two wide large screen"].column { width: 12.5% !important; } .ui.grid > .row > [class*="three wide large screen"].column, .ui.grid > .column.row > [class*="three wide large screen"].column, .ui.grid > [class*="three wide large screen"].column, .ui.column.grid > [class*="three wide large screen"].column { width: 18.75% !important; } .ui.grid > .row > [class*="four wide large screen"].column, .ui.grid > .column.row > [class*="four wide large screen"].column, .ui.grid > [class*="four wide large screen"].column, .ui.column.grid > [class*="four wide large screen"].column { width: 25% !important; } .ui.grid > .row > [class*="five wide large screen"].column, .ui.grid > .column.row > [class*="five wide large screen"].column, .ui.grid > [class*="five wide large screen"].column, .ui.column.grid > [class*="five wide large screen"].column { width: 31.25% !important; } .ui.grid > .row > [class*="six wide large screen"].column, .ui.grid > .column.row > [class*="six wide large screen"].column, .ui.grid > [class*="six wide large screen"].column, .ui.column.grid > [class*="six wide large screen"].column { width: 37.5% !important; } .ui.grid > .row > [class*="seven wide large screen"].column, .ui.grid > .column.row > [class*="seven wide large screen"].column, .ui.grid > [class*="seven wide large screen"].column, .ui.column.grid > [class*="seven wide large screen"].column { width: 43.75% !important; } .ui.grid > .row > [class*="eight wide large screen"].column, .ui.grid > .column.row > [class*="eight wide large screen"].column, .ui.grid > [class*="eight wide large screen"].column, .ui.column.grid > [class*="eight wide large screen"].column { width: 50% !important; } .ui.grid > .row > [class*="nine wide large screen"].column, .ui.grid > .column.row > [class*="nine wide large screen"].column, .ui.grid > [class*="nine wide large screen"].column, .ui.column.grid > [class*="nine wide large screen"].column { width: 56.25% !important; } .ui.grid > .row > [class*="ten wide large screen"].column, .ui.grid > .column.row > [class*="ten wide large screen"].column, .ui.grid > [class*="ten wide large screen"].column, .ui.column.grid > [class*="ten wide large screen"].column { width: 62.5% !important; } .ui.grid > .row > [class*="eleven wide large screen"].column, .ui.grid > .column.row > [class*="eleven wide large screen"].column, .ui.grid > [class*="eleven wide large screen"].column, .ui.column.grid > [class*="eleven wide large screen"].column { width: 68.75% !important; } .ui.grid > .row > [class*="twelve wide large screen"].column, .ui.grid > .column.row > [class*="twelve wide large screen"].column, .ui.grid > [class*="twelve wide large screen"].column, .ui.column.grid > [class*="twelve wide large screen"].column { width: 75% !important; } .ui.grid > .row > [class*="thirteen wide large screen"].column, .ui.grid > .column.row > [class*="thirteen wide large screen"].column, .ui.grid > [class*="thirteen wide large screen"].column, .ui.column.grid > [class*="thirteen wide large screen"].column { width: 81.25% !important; } .ui.grid > .row > [class*="fourteen wide large screen"].column, .ui.grid > .column.row > [class*="fourteen wide large screen"].column, .ui.grid > [class*="fourteen wide large screen"].column, .ui.column.grid > [class*="fourteen wide large screen"].column { width: 87.5% !important; } .ui.grid > .row > [class*="fifteen wide large screen"].column, .ui.grid > .column.row > [class*="fifteen wide large screen"].column, .ui.grid > [class*="fifteen wide large screen"].column, .ui.column.grid > [class*="fifteen wide large screen"].column { width: 93.75% !important; } .ui.grid > .row > [class*="sixteen wide large screen"].column, .ui.grid > .column.row > [class*="sixteen wide large screen"].column, .ui.grid > [class*="sixteen wide large screen"].column, .ui.column.grid > [class*="sixteen wide large screen"].column { width: 100% !important; } } /* Widescreen Sizing Combinations */ @media only screen and (min-width: 1920px) { .ui.grid > .row > [class*="one wide widescreen"].column, .ui.grid > .column.row > [class*="one wide widescreen"].column, .ui.grid > [class*="one wide widescreen"].column, .ui.column.grid > [class*="one wide widescreen"].column { width: 6.25% !important; } .ui.grid > .row > [class*="two wide widescreen"].column, .ui.grid > .column.row > [class*="two wide widescreen"].column, .ui.grid > [class*="two wide widescreen"].column, .ui.column.grid > [class*="two wide widescreen"].column { width: 12.5% !important; } .ui.grid > .row > [class*="three wide widescreen"].column, .ui.grid > .column.row > [class*="three wide widescreen"].column, .ui.grid > [class*="three wide widescreen"].column, .ui.column.grid > [class*="three wide widescreen"].column { width: 18.75% !important; } .ui.grid > .row > [class*="four wide widescreen"].column, .ui.grid > .column.row > [class*="four wide widescreen"].column, .ui.grid > [class*="four wide widescreen"].column, .ui.column.grid > [class*="four wide widescreen"].column { width: 25% !important; } .ui.grid > .row > [class*="five wide widescreen"].column, .ui.grid > .column.row > [class*="five wide widescreen"].column, .ui.grid > [class*="five wide widescreen"].column, .ui.column.grid > [class*="five wide widescreen"].column { width: 31.25% !important; } .ui.grid > .row > [class*="six wide widescreen"].column, .ui.grid > .column.row > [class*="six wide widescreen"].column, .ui.grid > [class*="six wide widescreen"].column, .ui.column.grid > [class*="six wide widescreen"].column { width: 37.5% !important; } .ui.grid > .row > [class*="seven wide widescreen"].column, .ui.grid > .column.row > [class*="seven wide widescreen"].column, .ui.grid > [class*="seven wide widescreen"].column, .ui.column.grid > [class*="seven wide widescreen"].column { width: 43.75% !important; } .ui.grid > .row > [class*="eight wide widescreen"].column, .ui.grid > .column.row > [class*="eight wide widescreen"].column, .ui.grid > [class*="eight wide widescreen"].column, .ui.column.grid > [class*="eight wide widescreen"].column { width: 50% !important; } .ui.grid > .row > [class*="nine wide widescreen"].column, .ui.grid > .column.row > [class*="nine wide widescreen"].column, .ui.grid > [class*="nine wide widescreen"].column, .ui.column.grid > [class*="nine wide widescreen"].column { width: 56.25% !important; } .ui.grid > .row > [class*="ten wide widescreen"].column, .ui.grid > .column.row > [class*="ten wide widescreen"].column, .ui.grid > [class*="ten wide widescreen"].column, .ui.column.grid > [class*="ten wide widescreen"].column { width: 62.5% !important; } .ui.grid > .row > [class*="eleven wide widescreen"].column, .ui.grid > .column.row > [class*="eleven wide widescreen"].column, .ui.grid > [class*="eleven wide widescreen"].column, .ui.column.grid > [class*="eleven wide widescreen"].column { width: 68.75% !important; } .ui.grid > .row > [class*="twelve wide widescreen"].column, .ui.grid > .column.row > [class*="twelve wide widescreen"].column, .ui.grid > [class*="twelve wide widescreen"].column, .ui.column.grid > [class*="twelve wide widescreen"].column { width: 75% !important; } .ui.grid > .row > [class*="thirteen wide widescreen"].column, .ui.grid > .column.row > [class*="thirteen wide widescreen"].column, .ui.grid > [class*="thirteen wide widescreen"].column, .ui.column.grid > [class*="thirteen wide widescreen"].column { width: 81.25% !important; } .ui.grid > .row > [class*="fourteen wide widescreen"].column, .ui.grid > .column.row > [class*="fourteen wide widescreen"].column, .ui.grid > [class*="fourteen wide widescreen"].column, .ui.column.grid > [class*="fourteen wide widescreen"].column { width: 87.5% !important; } .ui.grid > .row > [class*="fifteen wide widescreen"].column, .ui.grid > .column.row > [class*="fifteen wide widescreen"].column, .ui.grid > [class*="fifteen wide widescreen"].column, .ui.column.grid > [class*="fifteen wide widescreen"].column { width: 93.75% !important; } .ui.grid > .row > [class*="sixteen wide widescreen"].column, .ui.grid > .column.row > [class*="sixteen wide widescreen"].column, .ui.grid > [class*="sixteen wide widescreen"].column, .ui.column.grid > [class*="sixteen wide widescreen"].column { width: 100% !important; } } /* ---------------------- Centered ----------------------- */ .ui.centered.grid, .ui.centered.grid > .row, .ui.grid > .centered.row { text-align: center; justify-content: center; } .ui.centered.grid > .column:not(.aligned):not(.justified):not(.row), .ui.centered.grid > .row > .column:not(.aligned):not(.justified), .ui.grid .centered.row > .column:not(.aligned):not(.justified) { text-align: left; } .ui.grid > .centered.column, .ui.grid > .row > .centered.column { display: block; margin-left: auto; margin-right: auto; } /* ---------------------- Relaxed ----------------------- */ .ui.relaxed.grid > .column:not(.row), .ui.relaxed.grid > .row > .column, .ui.grid > .relaxed.row > .column { padding-left: 1.5rem; padding-right: 1.5rem; } .ui[class*="very relaxed"].grid > .column:not(.row), .ui[class*="very relaxed"].grid > .row > .column, .ui.grid > [class*="very relaxed"].row > .column { padding-left: 2.5rem; padding-right: 2.5rem; } /* Coupling with UI Divider */ .ui.relaxed.grid .row + .ui.divider, .ui.grid .relaxed.row + .ui.divider { margin-left: 1.5rem; margin-right: 1.5rem; } .ui[class*="very relaxed"].grid .row + .ui.divider, .ui.grid [class*="very relaxed"].row + .ui.divider { margin-left: 2.5rem; margin-right: 2.5rem; } /* ---------------------- Padded ----------------------- */ .ui.padded.grid:not(.vertically):not(.horizontally) { margin: 0; } [class*="horizontally padded"].ui.grid { margin-left: 0; margin-right: 0; } [class*="vertically padded"].ui.grid { margin-top: 0; margin-bottom: 0; } /* ---------------------- "Floated" ----------------------- */ .ui.grid [class*="left floated"].column { margin-right: auto; } .ui.grid [class*="right floated"].column { margin-left: auto; } /* ---------------------- Divided ----------------------- */ .ui.divided.grid:not([class*="vertically divided"]) > .column:not(.row), .ui.divided.grid:not([class*="vertically divided"]) > .row > .column { box-shadow: -1px 0 0 0 rgba(34, 36, 38, 0.15); } /* Swap from padding to margin on columns to have dividers align */ .ui[class*="vertically divided"].grid > .column:not(.row), .ui[class*="vertically divided"].grid > .row > .column { margin-top: 1rem; margin-bottom: 1rem; padding-top: 0; padding-bottom: 0; } .ui[class*="vertically divided"].grid > .row { margin-top: 0; margin-bottom: 0; } /* No divider on first column on row */ .ui.divided.grid:not([class*="vertically divided"]) > .column:first-child, .ui.divided.grid:not([class*="vertically divided"]) > .row > .column:first-child { box-shadow: none; } /* No space on top of first row */ .ui[class*="vertically divided"].grid > .row:first-child > .column { margin-top: 0; } /* Divided Row */ .ui.grid > .divided.row > .column { box-shadow: -1px 0 0 0 rgba(34, 36, 38, 0.15); } .ui.grid > .divided.row > .column:first-child { box-shadow: none; } /* Vertically Divided */ .ui[class*="vertically divided"].grid > .row { position: relative; } .ui[class*="vertically divided"].grid > .row::before { position: absolute; content: ""; top: 0; left: 0; width: calc(100% - 2rem); height: 1px; margin: 0 1rem; box-shadow: 0 -1px 0 0 rgba(34, 36, 38, 0.15); } /* Padded Horizontally Divided */ [class*="horizontally padded"].ui.divided.grid, .ui.padded.divided.grid:not(.vertically):not(.horizontally) { width: 100%; } /* First Row Vertically Divided */ .ui[class*="vertically divided"].grid > .row:first-child::before { box-shadow: none; } /* Inverted Divided */ .ui.inverted.divided.grid:not([class*="vertically divided"]) > .column:not(.row), .ui.inverted.divided.grid:not([class*="vertically divided"]) > .row > .column { box-shadow: -1px 0 0 0 rgba(255, 255, 255, 0.1); } .ui.inverted.divided.grid:not([class*="vertically divided"]) > .column:not(.row):first-child, .ui.inverted.divided.grid:not([class*="vertically divided"]) > .row > .column:first-child { box-shadow: none; } .ui.inverted[class*="vertically divided"].grid > .row::before { box-shadow: 0 -1px 0 0 rgba(255, 255, 255, 0.1); } /* Relaxed */ .ui.relaxed[class*="vertically divided"].grid > .row::before { margin-left: 1.5rem; margin-right: 1.5rem; width: calc(100% - 3rem); } .ui[class*="very relaxed"][class*="vertically divided"].grid > .row::before { margin-left: 2.5rem; margin-right: 2.5rem; width: calc(100% - 5rem); } /* ---------------------- Celled ----------------------- */ .ui.celled.grid { width: 100%; margin: 1em 0; box-shadow: 0 0 0 1px #d4d4d5; } .ui.celled.grid > .row { width: 100% !important; margin: 0; padding: 0; box-shadow: 0 -1px 0 0 #d4d4d5; } .ui.celled.grid > .column:not(.row), .ui.celled.grid > .row > .column { box-shadow: -1px 0 0 0 #d4d4d5; } .ui.celled.grid > .column:first-child, .ui.celled.grid > .row > .column:first-child { box-shadow: none; } .ui.celled.grid > .column:not(.row), .ui.celled.grid > .row > .column { padding: 1em; } .ui.relaxed.celled.grid > .column:not(.row), .ui.relaxed.celled.grid > .row > .column { padding: 1.5em; } .ui[class*="very relaxed"].celled.grid > .column:not(.row), .ui[class*="very relaxed"].celled.grid > .row > .column { padding: 2em; } /* Internally Celled */ .ui[class*="internally celled"].grid { box-shadow: none; margin: 0; } .ui[class*="internally celled"].grid > .row:first-child { box-shadow: none; } .ui[class*="internally celled"].grid > .row > .column:first-child { box-shadow: none; } /* ---------------------- Vertically Aligned ----------------------- */ /* Top Aligned */ .ui[class*="top aligned"].grid > .column:not(.row), .ui[class*="top aligned"].grid > .row > .column, .ui.grid > [class*="top aligned"].row > .column, .ui.grid > [class*="top aligned"].column:not(.row), .ui.grid > .row > [class*="top aligned"].column { flex-direction: column; vertical-align: top; align-self: flex-start !important; } /* Middle Aligned */ .ui[class*="middle aligned"].grid > .column:not(.row), .ui[class*="middle aligned"].grid > .row > .column, .ui.grid > [class*="middle aligned"].row > .column, .ui.grid > [class*="middle aligned"].column:not(.row), .ui.grid > .row > [class*="middle aligned"].column { flex-direction: column; vertical-align: middle; align-self: center !important; } /* Bottom Aligned */ .ui[class*="bottom aligned"].grid > .column:not(.row), .ui[class*="bottom aligned"].grid > .row > .column, .ui.grid > [class*="bottom aligned"].row > .column, .ui.grid > [class*="bottom aligned"].column:not(.row), .ui.grid > .row > [class*="bottom aligned"].column { flex-direction: column; vertical-align: bottom; align-self: flex-end !important; } /* Stretched */ .ui.stretched.grid > .row > .column, .ui.stretched.grid > .column, .ui.grid > .stretched.row > .column, .ui.grid > .stretched.column:not(.row), .ui.grid > .row > .stretched.column { display: inline-flex !important; align-self: stretch; flex-direction: column; } .ui.stretched.grid > .row > .column > *, .ui.stretched.grid > .column > *, .ui.grid > .stretched.row > .column > *, .ui.grid > .stretched.column:not(.row) > *, .ui.grid > .row > .stretched.column > * { flex-grow: 1; } /* ---------------------- Horizontally Centered ----------------------- */ /* Left Aligned */ .ui[class*="left aligned"].grid > .column, .ui[class*="left aligned"].grid > .row > .column, .ui.grid > [class*="left aligned"].row > .column, .ui.ui.grid > [class*="left aligned"].column, .ui.ui.grid > .row > [class*="left aligned"].column { text-align: left; align-self: inherit; } /* Center Aligned */ .ui[class*="center aligned"].grid > .column, .ui[class*="center aligned"].grid > .row > .column, .ui.grid > [class*="center aligned"].row > .column, .ui.ui.grid > [class*="center aligned"].column, .ui.ui.grid > .row > [class*="center aligned"].column { text-align: center; align-self: inherit; } .ui[class*="center aligned"].grid { justify-content: center; } /* Right Aligned */ .ui[class*="right aligned"].grid > .column, .ui[class*="right aligned"].grid > .row > .column, .ui.grid > [class*="right aligned"].row > .column, .ui.ui.grid > [class*="right aligned"].column, .ui.ui.grid > .row > [class*="right aligned"].column { text-align: right; align-self: inherit; } /* Justified */ .ui.justified.grid > .column, .ui.justified.grid > .row > .column, .ui.grid > .justified.row > .column, .ui.ui.grid > .justified.column, .ui.ui.grid > .row > .justified.column { text-align: justify; -webkit-hyphens: auto; -ms-hyphens: auto; hyphens: auto; } /* ---------------------- Colored ----------------------- */ .ui.grid > .primary.row, .ui.grid > .primary.column, .ui.grid > .row > .primary.column { background-color: #2185d0; color: #fff; } .ui.grid > .secondary.row, .ui.grid > .secondary.column, .ui.grid > .row > .secondary.column { background-color: #1b1c1d; color: #fff; } .ui.grid > .red.row, .ui.grid > .red.column, .ui.grid > .row > .red.column { background-color: #db2828; color: #fff; } .ui.grid > .orange.row, .ui.grid > .orange.column, .ui.grid > .row > .orange.column { background-color: #f2711c; color: #fff; } .ui.grid > .yellow.row, .ui.grid > .yellow.column, .ui.grid > .row > .yellow.column { background-color: #fbbd08; color: #fff; } .ui.grid > .olive.row, .ui.grid > .olive.column, .ui.grid > .row > .olive.column { background-color: #b5cc18; color: #fff; } .ui.grid > .green.row, .ui.grid > .green.column, .ui.grid > .row > .green.column { background-color: #21ba45; color: #fff; } .ui.grid > .teal.row, .ui.grid > .teal.column, .ui.grid > .row > .teal.column { background-color: #00b5ad; color: #fff; } .ui.grid > .blue.row, .ui.grid > .blue.column, .ui.grid > .row > .blue.column { background-color: #2185d0; color: #fff; } .ui.grid > .violet.row, .ui.grid > .violet.column, .ui.grid > .row > .violet.column { background-color: #6435c9; color: #fff; } .ui.grid > .purple.row, .ui.grid > .purple.column, .ui.grid > .row > .purple.column { background-color: #a333c8; color: #fff; } .ui.grid > .pink.row, .ui.grid > .pink.column, .ui.grid > .row > .pink.column { background-color: #e03997; color: #fff; } .ui.grid > .brown.row, .ui.grid > .brown.column, .ui.grid > .row > .brown.column { background-color: #a5673f; color: #fff; } .ui.grid > .grey.row, .ui.grid > .grey.column, .ui.grid > .row > .grey.column { background-color: #767676; color: #fff; } .ui.grid > .black.row, .ui.grid > .black.column, .ui.grid > .row > .black.column { background-color: #1b1c1d; color: #fff; } /* ---------------------- Equal Width ----------------------- */ .ui[class*="equal width"].grid > .column:not(.row), .ui[class*="equal width"].grid > .row > .column, .ui.grid > [class*="equal width"].row > .column { display: inline-block; flex-grow: 1; } .ui[class*="equal width"].grid > .wide.column, .ui[class*="equal width"].grid > .row > .wide.column, .ui.grid > [class*="equal width"].row > .wide.column { flex-grow: 0; } /* ---------------------- Reverse ----------------------- */ /* Mobile */ @media only screen and (max-width: 767.98px) { .ui[class*="mobile reversed"].grid, .ui[class*="mobile reversed"].grid > .row, .ui.grid > [class*="mobile reversed"].row { flex-direction: row-reverse; } .ui[class*="mobile vertically reversed"].grid, .ui.stackable[class*="mobile reversed"] { flex-direction: column-reverse; } /* Divided Reversed */ .ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"]) > .column:first-child, .ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"]) > .row > .column:first-child { box-shadow: -1px 0 0 0 rgba(34, 36, 38, 0.15); } .ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"]) > .column:last-child, .ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"]) > .row > .column:last-child { box-shadow: none; } /* Vertically Divided Reversed */ .ui.grid[class*="vertically divided"][class*="mobile vertically reversed"] > .row:first-child::before { box-shadow: 0 -1px 0 0 rgba(34, 36, 38, 0.15); } .ui.grid[class*="vertically divided"][class*="mobile vertically reversed"] > .row:last-child::before { box-shadow: none; } /* Celled Reversed */ .ui[class*="mobile reversed"].celled.grid > .row > .column:first-child { box-shadow: -1px 0 0 0 #d4d4d5; } .ui[class*="mobile reversed"].celled.grid > .row > .column:last-child { box-shadow: none; } } /* Tablet */ @media only screen and (min-width: 768px) and (max-width: 991.98px) { .ui[class*="tablet reversed"].grid, .ui[class*="tablet reversed"].grid > .row, .ui.grid > [class*="tablet reversed"].row { flex-direction: row-reverse; } .ui[class*="tablet vertically reversed"].grid { flex-direction: column-reverse; } /* Divided Reversed */ .ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"]) > .column:first-child, .ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"]) > .row > .column:first-child { box-shadow: -1px 0 0 0 rgba(34, 36, 38, 0.15); } .ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"]) > .column:last-child, .ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"]) > .row > .column:last-child { box-shadow: none; } /* Vertically Divided Reversed */ .ui.grid[class*="vertically divided"][class*="tablet vertically reversed"] > .row:first-child::before { box-shadow: 0 -1px 0 0 rgba(34, 36, 38, 0.15); } .ui.grid[class*="vertically divided"][class*="tablet vertically reversed"] > .row:last-child::before { box-shadow: none; } /* Celled Reversed */ .ui[class*="tablet reversed"].celled.grid > .row > .column:first-child { box-shadow: -1px 0 0 0 #d4d4d5; } .ui[class*="tablet reversed"].celled.grid > .row > .column:last-child { box-shadow: none; } } /* Computer */ @media only screen and (min-width: 992px) { .ui[class*="computer reversed"].grid, .ui[class*="computer reversed"].grid > .row, .ui.grid > [class*="computer reversed"].row { flex-direction: row-reverse; } .ui[class*="computer vertically reversed"].grid { flex-direction: column-reverse; } /* Divided Reversed */ .ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"]) > .column:first-child, .ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"]) > .row > .column:first-child { box-shadow: -1px 0 0 0 rgba(34, 36, 38, 0.15); } .ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"]) > .column:last-child, .ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"]) > .row > .column:last-child { box-shadow: none; } /* Vertically Divided Reversed */ .ui.grid[class*="vertically divided"][class*="computer vertically reversed"] > .row:first-child::before { box-shadow: 0 -1px 0 0 rgba(34, 36, 38, 0.15); } .ui.grid[class*="vertically divided"][class*="computer vertically reversed"] > .row:last-child::before { box-shadow: none; } /* Celled Reversed */ .ui[class*="computer reversed"].celled.grid > .row > .column:first-child { box-shadow: -1px 0 0 0 #d4d4d5; } .ui[class*="computer reversed"].celled.grid > .row > .column:last-child { box-shadow: none; } } /* ------------------- Doubling -------------------- */ /* Tablet Only */ @media only screen and (min-width: 768px) and (max-width: 991.98px) { .ui.doubling.grid { width: auto; } .ui.grid > .doubling.row, .ui.doubling.grid > .row { margin: 0 !important; padding: 0 !important; } .ui.grid > .doubling.row > .column, .ui.doubling.grid > .row > .column { padding-top: 1rem !important; padding-bottom: 1rem !important; box-shadow: none !important; margin: 0; } .ui.grid:not(.stretched) > .doubling.row:not(.stretched) > .column:not(.stretched), .ui.doubling.grid:not(.stretched) > .row:not(.stretched) > .column:not(.stretched) { display: inline-block !important; } .ui[class*="two column"].doubling.grid > .row > .column, .ui[class*="two column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="two column"].doubling.row > .column { width: 100% !important; } .ui[class*="three column"].doubling.grid > .row > .column, .ui[class*="three column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="three column"].doubling.row > .column { width: 50% !important; } .ui[class*="four column"].doubling.grid > .row > .column, .ui[class*="four column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="four column"].doubling.row > .column { width: 50% !important; } .ui[class*="five column"].doubling.grid > .row > .column, .ui[class*="five column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="five column"].doubling.row > .column { width: 33.33333333% !important; } .ui[class*="six column"].doubling.grid > .row > .column, .ui[class*="six column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="six column"].doubling.row > .column { width: 33.33333333% !important; } .ui[class*="seven column"].doubling.grid > .row > .column, .ui[class*="seven column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="seven column"].doubling.row > .column { width: 33.33333333% !important; } .ui[class*="eight column"].doubling.grid > .row > .column, .ui[class*="eight column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="eight column"].doubling.row > .column { width: 25% !important; } .ui[class*="nine column"].doubling.grid > .row > .column, .ui[class*="nine column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="nine column"].doubling.row > .column { width: 25% !important; } .ui[class*="ten column"].doubling.grid > .row > .column, .ui[class*="ten column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="ten column"].doubling.row > .column { width: 20% !important; } .ui[class*="eleven column"].doubling.grid > .row > .column, .ui[class*="eleven column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="eleven column"].doubling.row > .column { width: 20% !important; } .ui[class*="twelve column"].doubling.grid > .row > .column, .ui[class*="twelve column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="twelve column"].doubling.row > .column { width: 16.66666667% !important; } .ui[class*="thirteen column"].doubling.grid > .row > .column, .ui[class*="thirteen column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="thirteen column"].doubling.row > .column { width: 16.66666667% !important; } .ui[class*="fourteen column"].doubling.grid > .row > .column, .ui[class*="fourteen column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="fourteen column"].doubling.row > .column { width: 14.28571429% !important; } .ui[class*="fifteen column"].doubling.grid > .row > .column, .ui[class*="fifteen column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="fifteen column"].doubling.row > .column { width: 14.28571429% !important; } .ui[class*="sixteen column"].doubling.grid > .row > .column, .ui[class*="sixteen column"].doubling.grid > .column:not(.row), .ui.ui.grid > [class*="sixteen column"].doubling.row > .column { width: 12.5% !important; } } /* Mobile Only */ @media only screen and (max-width: 767.98px) { .ui.grid > .doubling.row, .ui.doubling.grid > .row { margin: 0 !important; padding: 0 !important; } .ui.grid > .doubling.row > .column, .ui.doubling.grid > .row > .column { padding-top: 1rem !important; padding-bottom: 1rem !important; margin: 0 !important; box-shadow: none !important; } .ui[class*="two column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="two column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="two column"].doubling:not(.stackable).row > .column { width: 100% !important; } .ui[class*="three column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="three column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="three column"].doubling:not(.stackable).row > .column { width: 50% !important; } .ui[class*="four column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="four column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="four column"].doubling:not(.stackable).row > .column { width: 50% !important; } .ui[class*="five column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="five column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="five column"].doubling:not(.stackable).row > .column { width: 50% !important; } .ui[class*="six column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="six column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="six column"].doubling:not(.stackable).row > .column { width: 50% !important; } .ui[class*="seven column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="seven column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="seven column"].doubling:not(.stackable).row > .column { width: 50% !important; } .ui[class*="eight column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="eight column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="eight column"].doubling:not(.stackable).row > .column { width: 50% !important; } .ui[class*="nine column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="nine column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="nine column"].doubling:not(.stackable).row > .column { width: 33.33333333% !important; } .ui[class*="ten column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="ten column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="ten column"].doubling:not(.stackable).row > .column { width: 33.33333333% !important; } .ui[class*="eleven column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="eleven column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="eleven column"].doubling:not(.stackable).row > .column { width: 33.33333333% !important; } .ui[class*="twelve column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="twelve column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="twelve column"].doubling:not(.stackable).row > .column { width: 33.33333333% !important; } .ui[class*="thirteen column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="thirteen column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="thirteen column"].doubling:not(.stackable).row > .column { width: 33.33333333% !important; } .ui[class*="fourteen column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="fourteen column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="fourteen column"].doubling:not(.stackable).row > .column { width: 25% !important; } .ui[class*="fifteen column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="fifteen column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="fifteen column"].doubling:not(.stackable).row > .column { width: 25% !important; } .ui[class*="sixteen column"].doubling:not(.stackable).grid > .row > .column, .ui[class*="sixteen column"].doubling:not(.stackable).grid > .column:not(.row), .ui.ui.grid > [class*="sixteen column"].doubling:not(.stackable).row > .column { width: 25% !important; } } /* ------------------- Stackable -------------------- */ @media only screen and (max-width: 767.98px) { body > .ui.stackable.grid, .ui:not(.segment):not(.grid) .ui.stackable.grid { width: auto; margin-left: 0; margin-right: 0; } .ui.stackable.grid > .row > .wide.column, .ui.stackable.grid > .wide.column, .ui.stackable.grid > .column.grid > .column, .ui.stackable.grid > .column.row > .column, .ui.stackable.grid > .row > .column, .ui.stackable.grid > .column:not(.row), .ui.grid > .stackable.stackable.stackable.row > .column { width: 100% !important; margin: 0 !important; box-shadow: none !important; padding: 1rem 1rem; } .ui.stackable.grid:not(.vertically) > .row { margin: 0; padding: 0; } /* Coupling */ .ui.container > .ui.stackable.grid > .column, .ui.container > .ui.stackable.grid > .row > .column { padding-left: 0 !important; padding-right: 0 !important; } /* Don't pad inside segment or nested grid */ .ui.grid .ui.stackable.grid, .ui.segment:not(.vertical) .ui.stackable.page.grid { margin-left: -1rem; margin-right: -1rem; } /* Divided Stackable */ .ui.stackable.divided.grid > .row:first-child > .column:first-child, .ui.stackable.celled.grid > .row:first-child > .column:first-child, .ui.stackable.divided.grid > .column:not(.row):first-child, .ui.stackable.celled.grid > .column:not(.row):first-child { border-top: none !important; } .ui.ui.inverted.stackable.celled.grid > .column:not(.row), .ui.ui.inverted.stackable.divided.grid > .column:not(.row), .ui.ui.inverted.stackable.celled.grid > .row > .column, .ui.ui.inverted.stackable.divided.grid > .row > .column { border-top: 1px solid rgba(255, 255, 255, 0.1); } .ui.stackable.celled.grid > .column:not(.row), .ui.stackable.divided:not(.vertically).grid > .column:not(.row), .ui.stackable.celled.grid > .row > .column, .ui.stackable.divided:not(.vertically).grid > .row > .column { border-top: 1px solid rgba(34, 36, 38, 0.15); box-shadow: none !important; padding-top: 2rem !important; padding-bottom: 2rem !important; } .ui.stackable.celled.grid > .row { box-shadow: none !important; } .ui.stackable.divided:not(.vertically).grid > .column:not(.row), .ui.stackable.divided:not(.vertically).grid > .row > .column { padding-left: 0 !important; padding-right: 0 !important; } } /* ---------------------- Only (Device) ----------------------- */ /* These include arbitrary class repetitions for forced specificity */ /* Mobile Only Hide */ @media only screen and (max-width: 767.98px) { .ui.ui.ui[class*="tablet only"].grid:not(.mobile), .ui.ui.ui.grid > [class*="tablet only"].row:not(.mobile), .ui.ui.ui.grid > [class*="tablet only"].column:not(.mobile), .ui.ui.ui.grid > .row > [class*="tablet only"].column:not(.mobile) { display: none !important; } .ui.ui.ui[class*="computer only"].grid:not(.mobile), .ui.ui.ui.grid > [class*="computer only"].row:not(.mobile), .ui.ui.ui.grid > [class*="computer only"].column:not(.mobile), .ui.ui.ui.grid > .row > [class*="computer only"].column:not(.mobile) { display: none !important; } .ui.ui.ui[class*="large screen only"].grid:not(.mobile), .ui.ui.ui.grid > [class*="large screen only"].row:not(.mobile), .ui.ui.ui.grid > [class*="large screen only"].column:not(.mobile), .ui.ui.ui.grid > .row > [class*="large screen only"].column:not(.mobile) { display: none !important; } .ui.ui.ui[class*="widescreen only"].grid:not(.mobile), .ui.ui.ui.grid > [class*="widescreen only"].row:not(.mobile), .ui.ui.ui.grid > [class*="widescreen only"].column:not(.mobile), .ui.ui.ui.grid > .row > [class*="widescreen only"].column:not(.mobile) { display: none !important; } } /* Tablet Only Hide */ @media only screen and (min-width: 768px) and (max-width: 991.98px) { .ui.ui.ui[class*="mobile only"].grid:not(.tablet), .ui.ui.ui.grid > [class*="mobile only"].row:not(.tablet), .ui.ui.ui.grid > [class*="mobile only"].column:not(.tablet), .ui.ui.ui.grid > .row > [class*="mobile only"].column:not(.tablet) { display: none !important; } .ui.ui.ui[class*="computer only"].grid:not(.tablet), .ui.ui.ui.grid > [class*="computer only"].row:not(.tablet), .ui.ui.ui.grid > [class*="computer only"].column:not(.tablet), .ui.ui.ui.grid > .row > [class*="computer only"].column:not(.tablet) { display: none !important; } .ui.ui.ui[class*="large screen only"].grid:not(.mobile), .ui.ui.ui.grid > [class*="large screen only"].row:not(.mobile), .ui.ui.ui.grid > [class*="large screen only"].column:not(.mobile), .ui.ui.ui.grid > .row > [class*="large screen only"].column:not(.mobile) { display: none !important; } .ui.ui.ui[class*="widescreen only"].grid:not(.mobile), .ui.ui.ui.grid > [class*="widescreen only"].row:not(.mobile), .ui.ui.ui.grid > [class*="widescreen only"].column:not(.mobile), .ui.ui.ui.grid > .row > [class*="widescreen only"].column:not(.mobile) { display: none !important; } } /* Computer Only Hide */ @media only screen and (min-width: 992px) and (max-width: 1199.98px) { .ui.ui.ui[class*="mobile only"].grid:not(.computer), .ui.ui.ui.grid > [class*="mobile only"].row:not(.computer), .ui.ui.ui.grid > [class*="mobile only"].column:not(.computer), .ui.ui.ui.grid > .row > [class*="mobile only"].column:not(.computer) { display: none !important; } .ui.ui.ui[class*="tablet only"].grid:not(.computer), .ui.ui.ui.grid > [class*="tablet only"].row:not(.computer), .ui.ui.ui.grid > [class*="tablet only"].column:not(.computer), .ui.ui.ui.grid > .row > [class*="tablet only"].column:not(.computer) { display: none !important; } .ui.ui.ui[class*="large screen only"].grid:not(.mobile), .ui.ui.ui.grid > [class*="large screen only"].row:not(.mobile), .ui.ui.ui.grid > [class*="large screen only"].column:not(.mobile), .ui.ui.ui.grid > .row > [class*="large screen only"].column:not(.mobile) { display: none !important; } .ui.ui.ui[class*="widescreen only"].grid:not(.mobile), .ui.ui.ui.grid > [class*="widescreen only"].row:not(.mobile), .ui.ui.ui.grid > [class*="widescreen only"].column:not(.mobile), .ui.ui.ui.grid > .row > [class*="widescreen only"].column:not(.mobile) { display: none !important; } } /* Large Screen Only Hide */ @media only screen and (min-width: 1200px) and (max-width: 1919.98px) { .ui.ui.ui[class*="mobile only"].grid:not(.computer), .ui.ui.ui.grid > [class*="mobile only"].row:not(.computer), .ui.ui.ui.grid > [class*="mobile only"].column:not(.computer), .ui.ui.ui.grid > .row > [class*="mobile only"].column:not(.computer) { display: none !important; } .ui.ui.ui[class*="tablet only"].grid:not(.computer), .ui.ui.ui.grid > [class*="tablet only"].row:not(.computer), .ui.ui.ui.grid > [class*="tablet only"].column:not(.computer), .ui.ui.ui.grid > .row > [class*="tablet only"].column:not(.computer) { display: none !important; } .ui.ui.ui[class*="widescreen only"].grid:not(.mobile), .ui.ui.ui.grid > [class*="widescreen only"].row:not(.mobile), .ui.ui.ui.grid > [class*="widescreen only"].column:not(.mobile), .ui.ui.ui.grid > .row > [class*="widescreen only"].column:not(.mobile) { display: none !important; } } /* Widescreen Only Hide */ @media only screen and (min-width: 1920px) { .ui.ui.ui[class*="mobile only"].grid:not(.computer), .ui.ui.ui.grid > [class*="mobile only"].row:not(.computer), .ui.ui.ui.grid > [class*="mobile only"].column:not(.computer), .ui.ui.ui.grid > .row > [class*="mobile only"].column:not(.computer) { display: none !important; } .ui.ui.ui[class*="tablet only"].grid:not(.computer), .ui.ui.ui.grid > [class*="tablet only"].row:not(.computer), .ui.ui.ui.grid > [class*="tablet only"].column:not(.computer), .ui.ui.ui.grid > .row > [class*="tablet only"].column:not(.computer) { display: none !important; } } /* ----------------- Compact ----------------- */ .ui.ui.ui.compact.grid { margin: -0.5rem; } .ui.ui.ui.compact.grid > .column:not(.row), .ui.ui.ui.compact.grid > .row > .column { padding-left: 0.5rem; padding-right: 0.5rem; } .ui.ui.ui.compact.grid > * { padding-left: 0.5rem; padding-right: 0.5rem; } /* Row */ .ui.ui.ui.compact.grid > .row { padding: 0.5rem 0; } /* Columns */ .ui.ui.ui.compact.grid > .column:not(.row) { padding-top: 0.5rem; padding-bottom: 0.5rem; } /* Relaxed + Celled */ .ui.compact.relaxed.celled.grid > .column:not(.row), .ui.compact.relaxed.celled.grid > .row > .column { padding: 0.75em; } .ui.compact[class*="very relaxed"].celled.grid > .column:not(.row), .ui.compact[class*="very relaxed"].celled.grid > .row > .column { padding: 1em; } /* ----------------- Very compact ----------------- */ .ui.ui.ui[class*="very compact"].grid { margin: -0.25rem; } .ui.ui.ui[class*="very compact"].grid > .column:not(.row), .ui.ui.ui[class*="very compact"].grid > .row > .column { padding-left: 0.25rem; padding-right: 0.25rem; } .ui.ui.ui[class*="very compact"].grid > * { padding-left: 0.25rem; padding-right: 0.25rem; } /* Row */ .ui.ui.ui[class*="very compact"].grid > .row { padding: 0.25rem 0; } /* Columns */ .ui.ui.ui[class*="very compact"].grid > .column:not(.row) { padding-top: 0.25rem; padding-bottom: 0.25rem; } /* Relaxed + Celled */ .ui[class*="very compact"].relaxed.celled.grid > .column:not(.row), .ui[class*="very compact"].relaxed.celled.grid > .row > .column { padding: 0.375em; } .ui[class*="very compact"][class*="very relaxed"].celled.grid > .column:not(.row), .ui[class*="very compact"][class*="very relaxed"].celled.grid > .row > .column { padding: 0.5em; } .ui.grid .left.attached.column { padding-right: 0; } .ui.grid .right.attached.column { padding-left: 0; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/header.css ================================================ /*! * # Fomantic-UI 2.9.4 - Header * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Header *******************************/ /* Standard */ .ui.header { border: none; margin: calc(2rem - 0.1428571428571429em) 0 1rem; padding: 0 0; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-weight: bold; line-height: 1.28571429em; text-transform: none; color: rgba(0, 0, 0, 0.87); } .ui.header:first-child { margin-top: -0.14285714em; } .ui.header:last-child { margin-bottom: 0; } /* -------------- Sub Header --------------- */ .ui.header .sub.header { display: block; font-weight: normal; padding: 0; margin: 0; font-size: 1rem; line-height: 1.2em; color: rgba(0, 0, 0, 0.6); } /* -------------- Icon --------------- */ .ui.header > .icons, .ui.header > i.icon { display: table-cell; opacity: 1; font-size: 1.5em; padding-top: 0; vertical-align: middle; } /* With Text Node */ .ui.header:not(.icon) > .icons:only-child, .ui.header:not(.icon) > i.icon:only-child { display: inline-block; padding: 0; margin-right: 0.75rem; } /* ------------------- Image -------------------- */ .ui.header > .image:not(.icon), .ui.header > img { display: inline-block; margin-top: 0.14285714em; width: 2.5em; height: auto; vertical-align: middle; } .ui.header > .image:not(.icon):only-child, .ui.header > img:only-child { margin-right: 0.75rem; } /* -------------- Content --------------- */ .ui.header .content { display: inline-block; vertical-align: top; } /* After Image */ .ui.header > img + .content, .ui.header > .image + .content { padding-left: 0.75rem; vertical-align: middle; } /* After Icon */ .ui.header:not(.icon):not(.centered):not(.aligned) > .icons + .content, .ui.header:not(.icon):not(.centered):not(.aligned) > i.icon + .content { padding-left: 0.75rem; display: table-cell; vertical-align: middle; } /* -------------- Loose Coupling --------------- */ .ui.header .ui.label { font-size: ""; margin-left: 0.5rem; vertical-align: middle; } /* Positioning */ .ui.header + p { margin-top: 0; } /******************************* Types *******************************/ /* -------------- Page --------------- */ h1.ui.header { font-size: 2rem; } h1.ui.header .sub.header { font-size: 1.14285714rem; } h2.ui.header { font-size: 1.71428571rem; } h2.ui.header .sub.header { font-size: 1.14285714rem; } h3.ui.header { font-size: 1.28571429rem; } h3.ui.header .sub.header { font-size: 1rem; } h4.ui.header { font-size: 1.07142857rem; } h4.ui.header .sub.header { font-size: 1rem; } h5.ui.header { font-size: 1rem; } h5.ui.header .sub.header { font-size: 0.92857143rem; } h6.ui.header { font-size: 0.85714286rem; } h6.ui.header .sub.header { font-size: 0.92857143rem; } /* -------------- Content Heading --------------- */ .ui.mini.header { font-size: 0.85714286em; } .ui.mini.header .sub.header { font-size: 0.92857143rem; } .ui.mini.sub.header { font-size: 0.78571429em; } .ui.tiny.header { font-size: 1em; } .ui.tiny.header .sub.header { font-size: 0.92857143rem; } .ui.tiny.sub.header { font-size: 0.78571429em; } .ui.small.header { font-size: 1.07142857em; } .ui.small.header .sub.header { font-size: 1rem; } .ui.small.sub.header { font-size: 0.78571429em; } .ui.large.header { font-size: 1.71428571em; } .ui.large.header .sub.header { font-size: 1.14285714rem; } .ui.large.sub.header { font-size: 0.92857143em; } .ui.big.header { font-size: 1.85714286em; } .ui.big.header .sub.header { font-size: 1.14285714rem; } .ui.big.sub.header { font-size: 1em; } .ui.huge.header { font-size: 2em; min-height: 1em; } .ui.huge.header .sub.header { font-size: 1.14285714rem; } .ui.huge.sub.header { font-size: 1em; } .ui.massive.header { font-size: 2.28571429em; min-height: 1em; } .ui.massive.header .sub.header { font-size: 1.42857143rem; } .ui.massive.sub.header { font-size: 1.14285714em; } /* -------------- Sub Heading --------------- */ .ui.sub.header { padding: 0; margin-bottom: 0.14285714rem; font-weight: bold; font-size: 0.85714286em; text-transform: uppercase; color: ""; } /* ------------------- Icon -------------------- */ .ui.icon.header { display: inline-block; text-align: center; margin: 2rem 0 1rem; } .ui.icon.header::after { content: ""; display: block; height: 0; clear: both; visibility: hidden; } .ui.icon.header:first-child { margin-top: 0; } .ui.icon.header > .image.icon, .ui.icon.header > .icons, .ui.icon.header > i.icon { float: none; display: block; width: auto; height: auto; line-height: 1; padding: 0; font-size: 3em; margin: 0 auto 0.5rem; opacity: 1; } .ui.icon.header .corner.icon { font-size: calc(3em * 0.45); } .ui.icon.header .content { display: block; padding: 0; } .ui.icon.header > i.circular { font-size: 2em; } .ui.icon.header > i.square { font-size: 2em; } .ui.block.icon.header > .image.icon, .ui.block.icon.header > .icons, .ui.block.icon.header > i.icon { margin-bottom: 0; } .ui.icon.header.aligned { margin-left: auto; margin-right: auto; display: block; } /******************************* States *******************************/ .ui.disabled.header { opacity: 0.45; } /******************************* Variations *******************************/ /* ------------------- Inverted -------------------- */ .ui.inverted.header { color: #fff; } .ui.inverted.header .sub.header { color: rgba(255, 255, 255, 0.8); } .ui.inverted.attached.header { background: #1b1c1d; box-shadow: none; border-color: transparent; } .ui.inverted.block.header { background: #545454 linear-gradient(transparent, rgba(0, 0, 0, 0.05)); box-shadow: none; border-bottom: none; } /* ------------------- Colors -------------------- */ .ui.primary.header { color: #2185d0; } a.ui.primary.header:hover { color: #1678c2; } .ui.primary.dividing.header { border-bottom: 2px solid #2185d0; } .ui.inverted.primary.header.header.header { color: #54c8ff; } a.ui.inverted.primary.header.header.header:hover { color: #21b8ff; } .ui.inverted.primary.dividing.header { border-bottom: 2px solid #54c8ff; } .ui.secondary.header { color: #1b1c1d; } a.ui.secondary.header:hover { color: #27292a; } .ui.secondary.dividing.header { border-bottom: 2px solid #1b1c1d; } .ui.inverted.secondary.header.header.header { color: #545454; } a.ui.inverted.secondary.header.header.header:hover { color: #6e6e6e; } .ui.inverted.secondary.dividing.header { border-bottom: 2px solid #545454; } .ui.red.header { color: #db2828; } a.ui.red.header:hover { color: #d01919; } .ui.red.dividing.header { border-bottom: 2px solid #db2828; } .ui.inverted.red.header.header.header { color: #ff695e; } a.ui.inverted.red.header.header.header:hover { color: #ff392b; } .ui.inverted.red.dividing.header { border-bottom: 2px solid #ff695e; } .ui.orange.header { color: #f2711c; } a.ui.orange.header:hover { color: #f26202; } .ui.orange.dividing.header { border-bottom: 2px solid #f2711c; } .ui.inverted.orange.header.header.header { color: #ff851b; } a.ui.inverted.orange.header.header.header:hover { color: #e76b00; } .ui.inverted.orange.dividing.header { border-bottom: 2px solid #ff851b; } .ui.yellow.header { color: #fbbd08; } a.ui.yellow.header:hover { color: #eaae00; } .ui.yellow.dividing.header { border-bottom: 2px solid #fbbd08; } .ui.inverted.yellow.header.header.header { color: #ffe21f; } a.ui.inverted.yellow.header.header.header:hover { color: #ebcd00; } .ui.inverted.yellow.dividing.header { border-bottom: 2px solid #ffe21f; } .ui.olive.header { color: #b5cc18; } a.ui.olive.header:hover { color: #a7bd0d; } .ui.olive.dividing.header { border-bottom: 2px solid #b5cc18; } .ui.inverted.olive.header.header.header { color: #d9e778; } a.ui.inverted.olive.header.header.header:hover { color: #d2e745; } .ui.inverted.olive.dividing.header { border-bottom: 2px solid #d9e778; } .ui.green.header { color: #21ba45; } a.ui.green.header:hover { color: #16ab39; } .ui.green.dividing.header { border-bottom: 2px solid #21ba45; } .ui.inverted.green.header.header.header { color: #2ecc40; } a.ui.inverted.green.header.header.header:hover { color: #1ea92e; } .ui.inverted.green.dividing.header { border-bottom: 2px solid #2ecc40; } .ui.teal.header { color: #00b5ad; } a.ui.teal.header:hover { color: #009c95; } .ui.teal.dividing.header { border-bottom: 2px solid #00b5ad; } .ui.inverted.teal.header.header.header { color: #6dffff; } a.ui.inverted.teal.header.header.header:hover { color: #3affff; } .ui.inverted.teal.dividing.header { border-bottom: 2px solid #6dffff; } .ui.blue.header { color: #2185d0; } a.ui.blue.header:hover { color: #1678c2; } .ui.blue.dividing.header { border-bottom: 2px solid #2185d0; } .ui.inverted.blue.header.header.header { color: #54c8ff; } a.ui.inverted.blue.header.header.header:hover { color: #21b8ff; } .ui.inverted.blue.dividing.header { border-bottom: 2px solid #54c8ff; } .ui.violet.header { color: #6435c9; } a.ui.violet.header:hover { color: #5829bb; } .ui.violet.dividing.header { border-bottom: 2px solid #6435c9; } .ui.inverted.violet.header.header.header { color: #a291fb; } a.ui.inverted.violet.header.header.header:hover { color: #745aff; } .ui.inverted.violet.dividing.header { border-bottom: 2px solid #a291fb; } .ui.purple.header { color: #a333c8; } a.ui.purple.header:hover { color: #9627ba; } .ui.purple.dividing.header { border-bottom: 2px solid #a333c8; } .ui.inverted.purple.header.header.header { color: #dc73ff; } a.ui.inverted.purple.header.header.header:hover { color: #cf40ff; } .ui.inverted.purple.dividing.header { border-bottom: 2px solid #dc73ff; } .ui.pink.header { color: #e03997; } a.ui.pink.header:hover { color: #e61a8d; } .ui.pink.dividing.header { border-bottom: 2px solid #e03997; } .ui.inverted.pink.header.header.header { color: #ff8edf; } a.ui.inverted.pink.header.header.header:hover { color: #ff5bd1; } .ui.inverted.pink.dividing.header { border-bottom: 2px solid #ff8edf; } .ui.brown.header { color: #a5673f; } a.ui.brown.header:hover { color: #975b33; } .ui.brown.dividing.header { border-bottom: 2px solid #a5673f; } .ui.inverted.brown.header.header.header { color: #d67c1c; } a.ui.inverted.brown.header.header.header:hover { color: #b0620f; } .ui.inverted.brown.dividing.header { border-bottom: 2px solid #d67c1c; } .ui.grey.header { color: #767676; } a.ui.grey.header:hover { color: #838383; } .ui.grey.dividing.header { border-bottom: 2px solid #767676; } .ui.inverted.grey.header.header.header { color: #dcddde; } a.ui.inverted.grey.header.header.header:hover { color: #c2c4c5; } .ui.inverted.grey.dividing.header { border-bottom: 2px solid #dcddde; } .ui.black.header { color: #1b1c1d; } a.ui.black.header:hover { color: #27292a; } .ui.black.dividing.header { border-bottom: 2px solid #1b1c1d; } .ui.inverted.black.header.header.header { color: #545454; } a.ui.inverted.black.header.header.header:hover { color: #000000; } .ui.inverted.black.dividing.header { border-bottom: 2px solid #545454; } /* ------------------- Aligned -------------------- */ .ui.left.aligned.header { text-align: left; } .ui.right.aligned.header { text-align: right; } .ui.centered.header, .ui.center.aligned.header { text-align: center; } .ui.justified.header { text-align: justify; } .ui.justified.header::after { display: inline-block; content: ""; width: 100%; } /* ------------------- Floated -------------------- */ .ui.floated.header, .ui[class*="left floated"].header { float: left; margin-top: 0; margin-right: 0.5em; } .ui[class*="right floated"].header { float: right; margin-top: 0; margin-left: 0.5em; } /* ------------------- Fitted -------------------- */ .ui.fitted.header { padding: 0; } /* ------------------- Dividing -------------------- */ .ui.dividing.header { padding-bottom: 0.21428571rem; border-bottom: 1px solid rgba(34, 36, 38, 0.15); } .ui.dividing.header .sub.header { padding-bottom: 0.21428571rem; } .ui.dividing.header i.icon { margin-bottom: 0; } .ui.inverted.dividing.header { border-bottom-color: rgba(255, 255, 255, 0.1); } /* ------------------- Block -------------------- */ .ui.block.header { background: #f3f4f5; padding: 0.78571429rem 1rem; box-shadow: none; border: 1px solid #d4d4d5; border-radius: 0.28571429rem; } .ui.block.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) { font-size: 1rem; } .ui.mini.block.header { font-size: 0.78571429rem; } .ui.tiny.block.header { font-size: 0.85714286rem; } .ui.small.block.header { font-size: 0.92857143rem; } .ui.large.block.header { font-size: 1.14285714rem; } .ui.big.block.header { font-size: 1.28571429rem; } .ui.huge.block.header { font-size: 1.42857143rem; } .ui.massive.block.header { font-size: 1.71428571rem; } /* ------------------- Attached -------------------- */ .ui.attached.header { background: #fff; padding: 0.78571429rem 1rem; margin: 0 -1px; box-shadow: none; border: 1px solid #d4d4d5; border-radius: 0; } .ui.attached.block.header { background: #f3f4f5; } .ui.attached:not(.top).header { border-top: none; } .ui.top.attached.header { border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.bottom.attached.header { border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui.seamless.attached:not(.bottom).header { border-bottom: none; } /* Attached Sizes */ .ui.attached.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) { font-size: 1em; } .ui.mini.attached.header { font-size: 0.78571429em; } .ui.tiny.attached.header { font-size: 0.85714286em; } .ui.small.attached.header { font-size: 0.92857143em; } .ui.large.attached.header { font-size: 1.14285714em; } .ui.big.attached.header { font-size: 1.28571429em; } .ui.huge.attached.header { font-size: 1.42857143em; } .ui.massive.attached.header { font-size: 1.71428571em; } /* ------------------- Sizing -------------------- */ .ui.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) { font-size: 1.28571429em; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/icon.css ================================================ /*! * # Fomantic-UI 2.9.4 - Icon * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Icon *******************************/ @font-face { font-family: "icons"; src: url("./../themes/default/assets/fonts/icons.woff2") format("woff2") , url("./../themes/default/assets/fonts/icons.woff") format("woff"); font-style: normal; font-weight: normal; font-display: block; font-variant: normal; text-decoration: inherit; text-transform: none; } @font-face { font-family: "outline-icons"; src: url("./../themes/default/assets/fonts/outline-icons.woff2") format("woff2") , url("./../themes/default/assets/fonts/outline-icons.woff") format("woff"); font-style: normal; font-weight: normal; font-display: block; font-variant: normal; text-decoration: inherit; text-transform: none; } @font-face { font-family: "brand-icons"; src: url("./../themes/default/assets/fonts/brand-icons.woff2") format("woff2") , url("./../themes/default/assets/fonts/brand-icons.woff") format("woff"); font-style: normal; font-weight: normal; font-display: block; font-variant: normal; text-decoration: inherit; text-transform: none; } i.icon { display: inline-block; opacity: 1; margin: 0 0.25rem 0 0; width: 1.18em; height: 1em; font-family: "icons"; font-style: normal; font-weight: normal; text-decoration: inherit; text-align: center; speak: none; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; -webkit-backface-visibility: hidden; backface-visibility: hidden; } i.icon::before { background: none; } /******************************* Types *******************************/ /* -------------- Loading --------------- */ i.loading.icon { height: 1em; line-height: 1; } i.loading.icon, i.loading.icons { animation: loader 2s linear infinite; } /******************************* States *******************************/ i.icon:hover, i.icons:hover, i.icon:active, i.icons:active, i.emphasized.icon:not(.disabled), i.emphasized.icons:not(.disabled) { opacity: 1; } i.disabled.icon, i.disabled.icons { opacity: 0.45; cursor: default; pointer-events: none; } /******************************* Variations *******************************/ /* ------------------- Fitted -------------------- */ i.fitted.icons, i.fitted.icon { width: auto; margin: 0 !important; } /* ------------------- Link -------------------- */ i.link.icon:not(.disabled), i.link.icons:not(.disabled) { cursor: pointer; opacity: 0.8; transition: opacity 0.1s ease; } i.link.icon:hover, i.link.icons:hover { opacity: 1; } /* ------------------- Circular -------------------- */ i.circular.icon { border-radius: 500em !important; line-height: 1 !important; padding: 0.5em 0 !important; box-shadow: 0 0 0 0.1em rgba(0, 0, 0, 0.1) inset; width: 2em !important; height: 2em !important; } i.circular.icon.colored { box-shadow: 0 0 0 0.1em currentColor inset; } i.circular.inverted.icon { border: none; box-shadow: none; } /* ------------------- Flipped -------------------- */ i.flipped.icon, i.horizontally.flipped.icon { transform: scale(-1, 1); } i.vertically.flipped.icon { transform: scale(1, -1); } .icons i.flipped.icon:not(.corner):not(:first-child), .icons i.horizontally.flipped.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) scale(-1, 1); } .icons i.vertically.flipped.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) scale(1, -1); } /* ------------------- Rotated -------------------- */ i.rotated.icon, i.right.rotated.icon, i.clockwise.rotated.icon { transform: rotate(90deg); } i.left.rotated.icon, i.counterclockwise.rotated.icon { transform: rotate(-90deg); } i.halfway.rotated.icon { transform: rotate(180deg); } .icons i.rotated.rotated.icon:not(.corner):not(:first-child), .icons i.right.rotated.icon:not(.corner):not(:first-child), .icons i.clockwise.rotated.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) rotate(90deg); } .icons i.left.rotated.icon:not(.corner):not(:first-child), .icons i.counterclockwise.rotated.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) rotate(-90deg); } .icons i.halfway.rotated.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) rotate(180deg); } /* -------------------------- Flipped & Rotated --------------------------- */ i.rotated.flipped.icon, i.right.rotated.flipped.icon, i.clockwise.rotated.flipped.icon { transform: scale(-1, 1) rotate(90deg); } i.left.rotated.flipped.icon, i.counterclockwise.rotated.flipped.icon { transform: scale(-1, 1) rotate(-90deg); } i.halfway.rotated.flipped.icon { transform: scale(-1, 1) rotate(180deg); } i.rotated.vertically.flipped.icon, i.right.rotated.vertically.flipped.icon, i.clockwise.rotated.vertically.flipped.icon { transform: scale(1, -1) rotate(90deg); } i.left.rotated.vertically.flipped.icon, i.counterclockwise.rotated.vertically.flipped.icon { transform: scale(1, -1) rotate(-90deg); } i.halfway.rotated.vertically.flipped.icon { transform: scale(1, -1) rotate(180deg); } .icons i.rotated.flipped.icon:not(.corner):not(:first-child), .icons i.right.rotated.flipped.icon:not(.corner):not(:first-child), .icons i.clockwise.rotated.flipped.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) scale(-1, 1) rotate(90deg); } .icons i.left.rotated.flipped.icon:not(.corner):not(:first-child), .icons i.counterclockwise.rotated.flipped.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) scale(-1, 1) rotate(-90deg); } .icons i.halfway.rotated.flipped.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) scale(-1, 1) rotate(180deg); } .icons i.rotated.vertically.flipped.icon:not(.corner):not(:first-child), .icons i.right.rotated.vertically.flipped.icon:not(.corner):not(:first-child), .icons i.clockwise.rotated.vertically.flipped.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) scale(1, -1) rotate(90deg); } .icons i.left.rotated.vertically.flipped.icon:not(.corner):not(:first-child), .icons i.counterclockwise.rotated.vertically.flipped.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) scale(1, -1) rotate(-90deg); } .icons i.halfway.rotated.vertically.flipped.icon:not(.corner):not(:first-child) { transform: translateX(-50%) translateY(-50%) scale(1, -1) rotate(180deg); } /* ------------------- Bordered -------------------- */ i.bordered.icon { line-height: 1; vertical-align: baseline; width: 2em; height: 2em; padding: 0.5em 0 !important; box-shadow: 0 0 0 0.1em rgba(0, 0, 0, 0.1) inset; } i.bordered.icon.colored { box-shadow: 0 0 0 0.1em currentColor inset; } i.bordered.inverted.icon { border: none; box-shadow: none; } /* ------------------- Inverted -------------------- */ /* Inverted Shapes */ i.inverted.bordered.icon, i.inverted.circular.icon { background-color: #1b1c1d; color: #fff; } i.inverted.icon { color: #fff; } /* ------------------- Colors -------------------- */ i.primary.icon.icon.icon.icon.icon.icon { color: #2185d0; } i.inverted.primary.icon.icon.icon.icon.icon.icon { color: #54c8ff; } i.inverted.bordered.primary.icon.icon.icon.icon.icon.icon, i.inverted.circular.primary.icon.icon.icon.icon.icon.icon, i.inverted.bordered.primary.icons, i.inverted.circular.primary.icons { background-color: #2185d0; color: #fff; } i.secondary.icon.icon.icon.icon.icon.icon { color: #1b1c1d; } i.inverted.secondary.icon.icon.icon.icon.icon.icon { color: #545454; } i.inverted.bordered.secondary.icon.icon.icon.icon.icon.icon, i.inverted.circular.secondary.icon.icon.icon.icon.icon.icon, i.inverted.bordered.secondary.icons, i.inverted.circular.secondary.icons { background-color: #1b1c1d; color: #fff; } i.red.icon.icon.icon.icon.icon.icon { color: #db2828; } i.inverted.red.icon.icon.icon.icon.icon.icon { color: #ff695e; } i.inverted.bordered.red.icon.icon.icon.icon.icon.icon, i.inverted.circular.red.icon.icon.icon.icon.icon.icon, i.inverted.bordered.red.icons, i.inverted.circular.red.icons { background-color: #db2828; color: #fff; } i.orange.icon.icon.icon.icon.icon.icon { color: #f2711c; } i.inverted.orange.icon.icon.icon.icon.icon.icon { color: #ff851b; } i.inverted.bordered.orange.icon.icon.icon.icon.icon.icon, i.inverted.circular.orange.icon.icon.icon.icon.icon.icon, i.inverted.bordered.orange.icons, i.inverted.circular.orange.icons { background-color: #f2711c; color: #fff; } i.yellow.icon.icon.icon.icon.icon.icon { color: #fbbd08; } i.inverted.yellow.icon.icon.icon.icon.icon.icon { color: #ffe21f; } i.inverted.bordered.yellow.icon.icon.icon.icon.icon.icon, i.inverted.circular.yellow.icon.icon.icon.icon.icon.icon, i.inverted.bordered.yellow.icons, i.inverted.circular.yellow.icons { background-color: #fbbd08; color: #fff; } i.olive.icon.icon.icon.icon.icon.icon { color: #b5cc18; } i.inverted.olive.icon.icon.icon.icon.icon.icon { color: #d9e778; } i.inverted.bordered.olive.icon.icon.icon.icon.icon.icon, i.inverted.circular.olive.icon.icon.icon.icon.icon.icon, i.inverted.bordered.olive.icons, i.inverted.circular.olive.icons { background-color: #b5cc18; color: #fff; } i.green.icon.icon.icon.icon.icon.icon { color: #21ba45; } i.inverted.green.icon.icon.icon.icon.icon.icon { color: #2ecc40; } i.inverted.bordered.green.icon.icon.icon.icon.icon.icon, i.inverted.circular.green.icon.icon.icon.icon.icon.icon, i.inverted.bordered.green.icons, i.inverted.circular.green.icons { background-color: #21ba45; color: #fff; } i.teal.icon.icon.icon.icon.icon.icon { color: #00b5ad; } i.inverted.teal.icon.icon.icon.icon.icon.icon { color: #6dffff; } i.inverted.bordered.teal.icon.icon.icon.icon.icon.icon, i.inverted.circular.teal.icon.icon.icon.icon.icon.icon, i.inverted.bordered.teal.icons, i.inverted.circular.teal.icons { background-color: #00b5ad; color: #fff; } i.blue.icon.icon.icon.icon.icon.icon { color: #2185d0; } i.inverted.blue.icon.icon.icon.icon.icon.icon { color: #54c8ff; } i.inverted.bordered.blue.icon.icon.icon.icon.icon.icon, i.inverted.circular.blue.icon.icon.icon.icon.icon.icon, i.inverted.bordered.blue.icons, i.inverted.circular.blue.icons { background-color: #2185d0; color: #fff; } i.violet.icon.icon.icon.icon.icon.icon { color: #6435c9; } i.inverted.violet.icon.icon.icon.icon.icon.icon { color: #a291fb; } i.inverted.bordered.violet.icon.icon.icon.icon.icon.icon, i.inverted.circular.violet.icon.icon.icon.icon.icon.icon, i.inverted.bordered.violet.icons, i.inverted.circular.violet.icons { background-color: #6435c9; color: #fff; } i.purple.icon.icon.icon.icon.icon.icon { color: #a333c8; } i.inverted.purple.icon.icon.icon.icon.icon.icon { color: #dc73ff; } i.inverted.bordered.purple.icon.icon.icon.icon.icon.icon, i.inverted.circular.purple.icon.icon.icon.icon.icon.icon, i.inverted.bordered.purple.icons, i.inverted.circular.purple.icons { background-color: #a333c8; color: #fff; } i.pink.icon.icon.icon.icon.icon.icon { color: #e03997; } i.inverted.pink.icon.icon.icon.icon.icon.icon { color: #ff8edf; } i.inverted.bordered.pink.icon.icon.icon.icon.icon.icon, i.inverted.circular.pink.icon.icon.icon.icon.icon.icon, i.inverted.bordered.pink.icons, i.inverted.circular.pink.icons { background-color: #e03997; color: #fff; } i.brown.icon.icon.icon.icon.icon.icon { color: #a5673f; } i.inverted.brown.icon.icon.icon.icon.icon.icon { color: #d67c1c; } i.inverted.bordered.brown.icon.icon.icon.icon.icon.icon, i.inverted.circular.brown.icon.icon.icon.icon.icon.icon, i.inverted.bordered.brown.icons, i.inverted.circular.brown.icons { background-color: #a5673f; color: #fff; } i.grey.icon.icon.icon.icon.icon.icon { color: #767676; } i.inverted.grey.icon.icon.icon.icon.icon.icon { color: #dcddde; } i.inverted.bordered.grey.icon.icon.icon.icon.icon.icon, i.inverted.circular.grey.icon.icon.icon.icon.icon.icon, i.inverted.bordered.grey.icons, i.inverted.circular.grey.icons { background-color: #767676; color: #fff; } i.black.icon.icon.icon.icon.icon.icon { color: #1b1c1d; } i.inverted.black.icon.icon.icon.icon.icon.icon { color: #545454; } i.inverted.bordered.black.icon.icon.icon.icon.icon.icon, i.inverted.circular.black.icon.icon.icon.icon.icon.icon, i.inverted.bordered.black.icons, i.inverted.circular.black.icons { background-color: #1b1c1d; color: #fff; } /* ------------------- Sizes -------------------- */ i.icon, i.icons { font-size: 1em; line-height: 1; font-style: normal; } i.mini.mini.mini.icon, i.mini.mini.mini.icons { font-size: 0.4em; vertical-align: middle; } i.tiny.tiny.tiny.icon, i.tiny.tiny.tiny.icons { font-size: 0.5em; vertical-align: middle; } i.small.small.small.icon, i.small.small.small.icons { font-size: 0.75em; vertical-align: middle; } i.large.large.large.icon, i.large.large.large.icons { font-size: 1.5em; vertical-align: middle; } i.big.big.big.icon, i.big.big.big.icons { font-size: 2em; vertical-align: middle; } i.huge.huge.huge.icon, i.huge.huge.huge.icons { font-size: 4em; vertical-align: middle; } i.massive.massive.massive.icon, i.massive.massive.massive.icons { font-size: 8em; vertical-align: middle; } /******************************* Groups *******************************/ i.icons { display: inline-block; position: relative; line-height: 1; min-width: 1.18em; min-height: 1em; margin: 0 0.25rem 0 0; text-align: center; } i.icons .icon { position: absolute; top: 50%; left: 50%; margin: 0; } i.icons .icon:not(.corner):not(.rotated):not(.flipped) { transform: translateX(-50%) translateY(-50%); } i.icons .icon:first-child { position: static; width: auto; height: auto; vertical-align: top; } i.icons:not(.bordered):not(.circular) .icon:first-child:not(.rotated):not(.flipped) { transform: none; } /* Corner Icon */ i.icons .corner.icon { top: auto; left: auto; right: 0; bottom: 0; font-size: 0.45em; text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff; } i.icons .corner.icon:not(.rotated):not(.flipped) { transform: none; } i.icons .icon.corner[class*="top right"] { top: 0; left: auto; right: 0; bottom: auto; } i.icons .icon.corner[class*="top left"] { top: 0; left: 0; right: auto; bottom: auto; } i.icons .icon.corner[class*="bottom left"] { top: auto; left: 0; right: auto; bottom: 0; } i.icons .icon.corner[class*="bottom right"] { top: auto; left: auto; right: 0; bottom: 0; } i.icons .inverted.corner.icon { text-shadow: -1px -1px 0 #1b1c1d, 1px -1px 0 #1b1c1d, -1px 1px 0 #1b1c1d, 1px 1px 0 #1b1c1d; } /************************************************* Bordered/circular with corner or group icons *************************************************/ i.bordered.icons, i.circular.icons { width: 2em; height: 2em; box-shadow: 0 0 0 0.1em rgba(0, 0, 0, 0.1) inset; vertical-align: middle; } i.bordered.icons.colored, i.circular.icons.colored { box-shadow: 0 0 0 0.1em currentColor inset; } i.circular.icons { border-radius: 500em; } i.bordered.icons i.icon:first-child, i.circular.icons i.icon:first-child { position: absolute; transform: translateX(-50%) translateY(-50%); } /* Inverted Icon */ i.bordered.inverted.icons, i.circular.inverted.icons { border: none; box-shadow: none; background-color: #1b1c1d; color: #fff; } /* Corner Icon */ i.bordered.icons .icon.corner, i.circular.icons .icon.corner, i.bordered.icons .icon.corner[class*="bottom right"], i.circular.icons .icon.corner[class*="bottom right"] { top: auto; left: auto; right: 1.15em; bottom: 1.15em; } i.bordered.icons .icon.corner[class*="top right"], i.circular.icons .icon.corner[class*="top right"] { top: 1.15em; left: auto; right: 1.15em; bottom: auto; } i.bordered.icons .icon.corner[class*="top left"], i.circular.icons .icon.corner[class*="top left"] { top: 1.15em; left: 1.15em; right: auto; bottom: auto; } i.bordered.icons .icon.corner[class*="bottom left"], i.circular.icons .icon.corner[class*="bottom left"] { top: auto; left: 1.15em; right: auto; bottom: 1.15em; } /* Deprecated *In/Out Naming Conflict) */ i.icon.linkedin.in::before { content: "\f0e1"; } i.icon.zoom.in::before { content: "\f00e"; } i.icon.zoom.out::before { content: "\f010"; } i.icon.sign.in::before { content: "\f2f6"; } i.icon.in.cart::before { content: "\f218"; } i.icon.log.out::before { content: "\f2f5"; } i.icon.sign.out::before { content: "\f2f5"; } i.icon.sign.in.alternate::before { content: "\f2f6"; } i.icon.sign.out.alternate::before { content: "\f2f5"; } /******************************* Solid Icons *******************************/ /* Icons */ i.icon.ad::before { content: "\f641"; } i.icon.address.book::before { content: "\f2b9"; } i.icon.address.card::before { content: "\f2bb"; } i.icon.adjust::before { content: "\f042"; } i.icon.air.freshener::before { content: "\f5d0"; } i.icon.align.center::before { content: "\f037"; } i.icon.align.justify::before { content: "\f039"; } i.icon.align.left::before { content: "\f036"; } i.icon.align.right::before { content: "\f038"; } i.icon.allergies::before { content: "\f461"; } i.icon.ambulance::before { content: "\f0f9"; } i.icon.american.sign.language.interpreting::before { content: "\f2a3"; } i.icon.anchor::before { content: "\f13d"; } i.icon.angle.double.down::before { content: "\f103"; } i.icon.angle.double.left::before { content: "\f100"; } i.icon.angle.double.right::before { content: "\f101"; } i.icon.angle.double.up::before { content: "\f102"; } i.icon.angle.left::before { content: "\f104"; } i.icon.angle.right::before { content: "\f105"; } i.icon.angle.up::before { content: "\f106"; } i.icon.angle.down::before { content: "\f107"; } i.icon.angry::before { content: "\f556"; } i.icon.ankh::before { content: "\f644"; } i.icon.archive::before { content: "\f187"; } i.icon.archway::before { content: "\f557"; } i.icon.arrow.alternate.circle.down::before { content: "\f358"; } i.icon.arrow.alternate.circle.left::before { content: "\f359"; } i.icon.arrow.alternate.circle.right::before { content: "\f35a"; } i.icon.arrow.alternate.circle.up::before { content: "\f35b"; } i.icon.arrow.circle.down::before { content: "\f0ab"; } i.icon.arrow.circle.left::before { content: "\f0a8"; } i.icon.arrow.circle.right::before { content: "\f0a9"; } i.icon.arrow.circle.up::before { content: "\f0aa"; } i.icon.arrow.down::before { content: "\f063"; } i.icon.arrow.left::before { content: "\f060"; } i.icon.arrow.right::before { content: "\f061"; } i.icon.arrow.up::before { content: "\f062"; } i.icon.arrows.alternate::before { content: "\f0b2"; } i.icon.arrows.alternate.horizontal::before { content: "\f337"; } i.icon.arrows.alternate.vertical::before { content: "\f338"; } i.icon.assistive.listening.systems::before { content: "\f2a2"; } i.icon.asterisk::before { content: "\f069"; } i.icon.at::before { content: "\f1fa"; } i.icon.atlas::before { content: "\f558"; } i.icon.atom::before { content: "\f5d2"; } i.icon.audio.description::before { content: "\f29e"; } i.icon.award::before { content: "\f559"; } i.icon.baby::before { content: "\f77c"; } i.icon.baby.carriage::before { content: "\f77d"; } i.icon.backspace::before { content: "\f55a"; } i.icon.backward::before { content: "\f04a"; } i.icon.bacon::before { content: "\f7e5"; } i.icon.bacteria::before { content: "\e059"; } i.icon.bacterium::before { content: "\e05a"; } i.icon.bahai::before { content: "\f666"; } i.icon.balance.scale::before { content: "\f24e"; } i.icon.balance.scale.left::before { content: "\f515"; } i.icon.balance.scale.right::before { content: "\f516"; } i.icon.ban::before { content: "\f05e"; } i.icon.band.aid::before { content: "\f462"; } i.icon.barcode::before { content: "\f02a"; } i.icon.bars::before { content: "\f0c9"; } i.icon.baseball.ball::before { content: "\f433"; } i.icon.basketball.ball::before { content: "\f434"; } i.icon.bath::before { content: "\f2cd"; } i.icon.battery.empty::before { content: "\f244"; } i.icon.battery.full::before { content: "\f240"; } i.icon.battery.half::before { content: "\f242"; } i.icon.battery.quarter::before { content: "\f243"; } i.icon.battery.three.quarters::before { content: "\f241"; } i.icon.bed::before { content: "\f236"; } i.icon.beer::before { content: "\f0fc"; } i.icon.bell::before { content: "\f0f3"; } i.icon.bell.slash::before { content: "\f1f6"; } i.icon.bezier.curve::before { content: "\f55b"; } i.icon.bible::before { content: "\f647"; } i.icon.bicycle::before { content: "\f206"; } i.icon.biking::before { content: "\f84a"; } i.icon.binoculars::before { content: "\f1e5"; } i.icon.biohazard::before { content: "\f780"; } i.icon.birthday.cake::before { content: "\f1fd"; } i.icon.blender::before { content: "\f517"; } i.icon.blender.phone::before { content: "\f6b6"; } i.icon.blind::before { content: "\f29d"; } i.icon.blog::before { content: "\f781"; } i.icon.bold::before { content: "\f032"; } i.icon.bolt::before { content: "\f0e7"; } i.icon.bomb::before { content: "\f1e2"; } i.icon.bone::before { content: "\f5d7"; } i.icon.bong::before { content: "\f55c"; } i.icon.book::before { content: "\f02d"; } i.icon.book.dead::before { content: "\f6b7"; } i.icon.book.medical::before { content: "\f7e6"; } i.icon.book.open::before { content: "\f518"; } i.icon.book.reader::before { content: "\f5da"; } i.icon.bookmark::before { content: "\f02e"; } i.icon.border.all::before { content: "\f84c"; } i.icon.border.none::before { content: "\f850"; } i.icon.border.style::before { content: "\f853"; } i.icon.bowling.ball::before { content: "\f436"; } i.icon.box::before { content: "\f466"; } i.icon.box.open::before { content: "\f49e"; } i.icon.box.tissue::before { content: "\e05b"; } i.icon.boxes::before { content: "\f468"; } i.icon.braille::before { content: "\f2a1"; } i.icon.brain::before { content: "\f5dc"; } i.icon.bread.slice::before { content: "\f7ec"; } i.icon.briefcase::before { content: "\f0b1"; } i.icon.briefcase.medical::before { content: "\f469"; } i.icon.broadcast.tower::before { content: "\f519"; } i.icon.broom::before { content: "\f51a"; } i.icon.brush::before { content: "\f55d"; } i.icon.bug::before { content: "\f188"; } i.icon.building::before { content: "\f1ad"; } i.icon.bullhorn::before { content: "\f0a1"; } i.icon.bullseye::before { content: "\f140"; } i.icon.burn::before { content: "\f46a"; } i.icon.bus::before { content: "\f207"; } i.icon.bus.alternate::before { content: "\f55e"; } i.icon.business.time::before { content: "\f64a"; } i.icon.calculator::before { content: "\f1ec"; } i.icon.calendar::before { content: "\f133"; } i.icon.calendar.alternate::before { content: "\f073"; } i.icon.calendar.check::before { content: "\f274"; } i.icon.calendar.day::before { content: "\f783"; } i.icon.calendar.minus::before { content: "\f272"; } i.icon.calendar.plus::before { content: "\f271"; } i.icon.calendar.times::before { content: "\f273"; } i.icon.calendar.week::before { content: "\f784"; } i.icon.camera::before { content: "\f030"; } i.icon.camera.retro::before { content: "\f083"; } i.icon.campground::before { content: "\f6bb"; } i.icon.candy.cane::before { content: "\f786"; } i.icon.cannabis::before { content: "\f55f"; } i.icon.capsules::before { content: "\f46b"; } i.icon.car::before { content: "\f1b9"; } i.icon.car.alternate::before { content: "\f5de"; } i.icon.car.battery::before { content: "\f5df"; } i.icon.car.crash::before { content: "\f5e1"; } i.icon.car.side::before { content: "\f5e4"; } i.icon.caravan::before { content: "\f8ff"; } i.icon.caret.down::before { content: "\f0d7"; } i.icon.caret.left::before { content: "\f0d9"; } i.icon.caret.right::before { content: "\f0da"; } i.icon.caret.square.down::before { content: "\f150"; } i.icon.caret.square.left::before { content: "\f191"; } i.icon.caret.square.right::before { content: "\f152"; } i.icon.caret.square.up::before { content: "\f151"; } i.icon.caret.up::before { content: "\f0d8"; } i.icon.carrot::before { content: "\f787"; } i.icon.cart.arrow.down::before { content: "\f218"; } i.icon.cart.plus::before { content: "\f217"; } i.icon.cash.register::before { content: "\f788"; } i.icon.cat::before { content: "\f6be"; } i.icon.certificate::before { content: "\f0a3"; } i.icon.chair::before { content: "\f6c0"; } i.icon.chalkboard::before { content: "\f51b"; } i.icon.chalkboard.teacher::before { content: "\f51c"; } i.icon.charging.station::before { content: "\f5e7"; } i.icon.chart.area::before { content: "\f1fe"; } i.icon.chart.bar::before { content: "\f080"; } i.icon.chart.pie::before { content: "\f200"; } i.icon.chartline::before { content: "\f201"; } i.icon.check::before { content: "\f00c"; } i.icon.check.circle::before { content: "\f058"; } i.icon.check.double::before { content: "\f560"; } i.icon.check.square::before { content: "\f14a"; } i.icon.cheese::before { content: "\f7ef"; } i.icon.chess::before { content: "\f439"; } i.icon.chess.bishop::before { content: "\f43a"; } i.icon.chess.board::before { content: "\f43c"; } i.icon.chess.king::before { content: "\f43f"; } i.icon.chess.knight::before { content: "\f441"; } i.icon.chess.pawn::before { content: "\f443"; } i.icon.chess.queen::before { content: "\f445"; } i.icon.chess.rook::before { content: "\f447"; } i.icon.chevron.circle.down::before { content: "\f13a"; } i.icon.chevron.circle.left::before { content: "\f137"; } i.icon.chevron.circle.right::before { content: "\f138"; } i.icon.chevron.circle.up::before { content: "\f139"; } i.icon.chevron.down::before { content: "\f078"; } i.icon.chevron.left::before { content: "\f053"; } i.icon.chevron.right::before { content: "\f054"; } i.icon.chevron.up::before { content: "\f077"; } i.icon.child::before { content: "\f1ae"; } i.icon.church::before { content: "\f51d"; } i.icon.circle::before { content: "\f111"; } i.icon.circle.notch::before { content: "\f1ce"; } i.icon.city::before { content: "\f64f"; } i.icon.clinic.medical::before { content: "\f7f2"; } i.icon.clipboard::before { content: "\f328"; } i.icon.clipboard.check::before { content: "\f46c"; } i.icon.clipboard.list::before { content: "\f46d"; } i.icon.clock::before { content: "\f017"; } i.icon.clone::before { content: "\f24d"; } i.icon.closed.captioning::before { content: "\f20a"; } i.icon.cloud::before { content: "\f0c2"; } i.icon.cloud.download.alternate::before { content: "\f381"; } i.icon.cloud.meatball::before { content: "\f73b"; } i.icon.cloud.moon::before { content: "\f6c3"; } i.icon.cloud.moon.rain::before { content: "\f73c"; } i.icon.cloud.rain::before { content: "\f73d"; } i.icon.cloud.showers.heavy::before { content: "\f740"; } i.icon.cloud.sun::before { content: "\f6c4"; } i.icon.cloud.sun.rain::before { content: "\f743"; } i.icon.cloud.upload.alternate::before { content: "\f382"; } i.icon.cocktail::before { content: "\f561"; } i.icon.code::before { content: "\f121"; } i.icon.code.branch::before { content: "\f126"; } i.icon.coffee::before { content: "\f0f4"; } i.icon.cog::before { content: "\f013"; } i.icon.cogs::before { content: "\f085"; } i.icon.coins::before { content: "\f51e"; } i.icon.columns::before { content: "\f0db"; } i.icon.comment::before { content: "\f075"; } i.icon.comment.alternate::before { content: "\f27a"; } i.icon.comment.dollar::before { content: "\f651"; } i.icon.comment.dots::before { content: "\f4ad"; } i.icon.comment.medical::before { content: "\f7f5"; } i.icon.comment.slash::before { content: "\f4b3"; } i.icon.comments::before { content: "\f086"; } i.icon.comments.dollar::before { content: "\f653"; } i.icon.compact.disc::before { content: "\f51f"; } i.icon.compass::before { content: "\f14e"; } i.icon.compress::before { content: "\f066"; } i.icon.compress.alternate::before { content: "\f422"; } i.icon.compress.arrows.alternate::before { content: "\f78c"; } i.icon.concierge.bell::before { content: "\f562"; } i.icon.cookie::before { content: "\f563"; } i.icon.cookie.bite::before { content: "\f564"; } i.icon.copy::before { content: "\f0c5"; } i.icon.copyright::before { content: "\f1f9"; } i.icon.couch::before { content: "\f4b8"; } i.icon.credit.card::before { content: "\f09d"; } i.icon.crop::before { content: "\f125"; } i.icon.crop.alternate::before { content: "\f565"; } i.icon.cross::before { content: "\f654"; } i.icon.crosshairs::before { content: "\f05b"; } i.icon.crow::before { content: "\f520"; } i.icon.crown::before { content: "\f521"; } i.icon.crutch::before { content: "\f7f7"; } i.icon.cube::before { content: "\f1b2"; } i.icon.cubes::before { content: "\f1b3"; } i.icon.cut::before { content: "\f0c4"; } i.icon.database::before { content: "\f1c0"; } i.icon.deaf::before { content: "\f2a4"; } i.icon.democrat::before { content: "\f747"; } i.icon.desktop::before { content: "\f108"; } i.icon.dharmachakra::before { content: "\f655"; } i.icon.diagnoses::before { content: "\f470"; } i.icon.dice::before { content: "\f522"; } i.icon.dice.d20::before { content: "\f6cf"; } i.icon.dice.d6::before { content: "\f6d1"; } i.icon.dice.five::before { content: "\f523"; } i.icon.dice.four::before { content: "\f524"; } i.icon.dice.one::before { content: "\f525"; } i.icon.dice.six::before { content: "\f526"; } i.icon.dice.three::before { content: "\f527"; } i.icon.dice.two::before { content: "\f528"; } i.icon.digital.tachograph::before { content: "\f566"; } i.icon.directions::before { content: "\f5eb"; } i.icon.disease::before { content: "\f7fa"; } i.icon.divide::before { content: "\f529"; } i.icon.dizzy::before { content: "\f567"; } i.icon.dna::before { content: "\f471"; } i.icon.dog::before { content: "\f6d3"; } i.icon.dollar.sign::before { content: "\f155"; } i.icon.dolly::before { content: "\f472"; } i.icon.dolly.flatbed::before { content: "\f474"; } i.icon.donate::before { content: "\f4b9"; } i.icon.door.closed::before { content: "\f52a"; } i.icon.door.open::before { content: "\f52b"; } i.icon.dot.circle::before { content: "\f192"; } i.icon.dove::before { content: "\f4ba"; } i.icon.download::before { content: "\f019"; } i.icon.drafting.compass::before { content: "\f568"; } i.icon.dragon::before { content: "\f6d5"; } i.icon.draw.polygon::before { content: "\f5ee"; } i.icon.drum::before { content: "\f569"; } i.icon.drum.steelpan::before { content: "\f56a"; } i.icon.drumstick.bite::before { content: "\f6d7"; } i.icon.dumbbell::before { content: "\f44b"; } i.icon.dumpster::before { content: "\f793"; } i.icon.dumpster.fire::before { content: "\f794"; } i.icon.dungeon::before { content: "\f6d9"; } i.icon.edit::before { content: "\f044"; } i.icon.egg::before { content: "\f7fb"; } i.icon.eject::before { content: "\f052"; } i.icon.ellipsis.horizontal::before { content: "\f141"; } i.icon.ellipsis.vertical::before { content: "\f142"; } i.icon.envelope::before { content: "\f0e0"; } i.icon.envelope.open::before { content: "\f2b6"; } i.icon.envelope.open.text::before { content: "\f658"; } i.icon.envelope.square::before { content: "\f199"; } i.icon.equals::before { content: "\f52c"; } i.icon.eraser::before { content: "\f12d"; } i.icon.ethernet::before { content: "\f796"; } i.icon.euro.sign::before { content: "\f153"; } i.icon.exchange.alternate::before { content: "\f362"; } i.icon.exclamation::before { content: "\f12a"; } i.icon.exclamation.circle::before { content: "\f06a"; } i.icon.exclamation.triangle::before { content: "\f071"; } i.icon.expand::before { content: "\f065"; } i.icon.expand.alternate::before { content: "\f424"; } i.icon.expand.arrows.alternate::before { content: "\f31e"; } i.icon.external.alternate::before { content: "\f35d"; } i.icon.external.link.square.alternate::before { content: "\f360"; } i.icon.eye::before { content: "\f06e"; } i.icon.eye.dropper::before { content: "\f1fb"; } i.icon.eye.slash::before { content: "\f070"; } i.icon.fan::before { content: "\f863"; } i.icon.fast.backward::before { content: "\f049"; } i.icon.fast.forward::before { content: "\f050"; } i.icon.faucet::before { content: "\e005"; } i.icon.fax::before { content: "\f1ac"; } i.icon.feather::before { content: "\f52d"; } i.icon.feather.alternate::before { content: "\f56b"; } i.icon.female::before { content: "\f182"; } i.icon.fighter.jet::before { content: "\f0fb"; } i.icon.file::before { content: "\f15b"; } i.icon.file.alternate::before { content: "\f15c"; } i.icon.file.archive::before { content: "\f1c6"; } i.icon.file.audio::before { content: "\f1c7"; } i.icon.file.code::before { content: "\f1c9"; } i.icon.file.contract::before { content: "\f56c"; } i.icon.file.csv::before { content: "\f6dd"; } i.icon.file.download::before { content: "\f56d"; } i.icon.file.excel::before { content: "\f1c3"; } i.icon.file.export::before { content: "\f56e"; } i.icon.file.image::before { content: "\f1c5"; } i.icon.file.import::before { content: "\f56f"; } i.icon.file.invoice::before { content: "\f570"; } i.icon.file.invoice.dollar::before { content: "\f571"; } i.icon.file.medical::before { content: "\f477"; } i.icon.file.medical.alternate::before { content: "\f478"; } i.icon.file.pdf::before { content: "\f1c1"; } i.icon.file.powerpoint::before { content: "\f1c4"; } i.icon.file.prescription::before { content: "\f572"; } i.icon.file.signature::before { content: "\f573"; } i.icon.file.upload::before { content: "\f574"; } i.icon.file.video::before { content: "\f1c8"; } i.icon.file.word::before { content: "\f1c2"; } i.icon.fill::before { content: "\f575"; } i.icon.fill.drip::before { content: "\f576"; } i.icon.film::before { content: "\f008"; } i.icon.filter::before { content: "\f0b0"; } i.icon.fingerprint::before { content: "\f577"; } i.icon.fire::before { content: "\f06d"; } i.icon.fire.alternate::before { content: "\f7e4"; } i.icon.fire.extinguisher::before { content: "\f134"; } i.icon.first.aid::before { content: "\f479"; } i.icon.fish::before { content: "\f578"; } i.icon.fist.raised::before { content: "\f6de"; } i.icon.flag::before { content: "\f024"; } i.icon.flag.checkered::before { content: "\f11e"; } i.icon.flag.usa::before { content: "\f74d"; } i.icon.flask::before { content: "\f0c3"; } i.icon.flushed::before { content: "\f579"; } i.icon.folder::before { content: "\f07b"; } i.icon.folder.minus::before { content: "\f65d"; } i.icon.folder.open::before { content: "\f07c"; } i.icon.folder.plus::before { content: "\f65e"; } i.icon.font::before { content: "\f031"; } i.icon.football.ball::before { content: "\f44e"; } i.icon.forward::before { content: "\f04e"; } i.icon.frog::before { content: "\f52e"; } i.icon.frown::before { content: "\f119"; } i.icon.frown.open::before { content: "\f57a"; } i.icon.fruit-apple::before { content: "\f5d1"; } i.icon.funnel.dollar::before { content: "\f662"; } i.icon.futbol::before { content: "\f1e3"; } i.icon.gamepad::before { content: "\f11b"; } i.icon.gas.pump::before { content: "\f52f"; } i.icon.gavel::before { content: "\f0e3"; } i.icon.gem::before { content: "\f3a5"; } i.icon.genderless::before { content: "\f22d"; } i.icon.ghost::before { content: "\f6e2"; } i.icon.gift::before { content: "\f06b"; } i.icon.gifts::before { content: "\f79c"; } i.icon.glass.cheers::before { content: "\f79f"; } i.icon.glass.martini::before { content: "\f000"; } i.icon.glass.martini.alternate::before { content: "\f57b"; } i.icon.glass.whiskey::before { content: "\f7a0"; } i.icon.glasses::before { content: "\f530"; } i.icon.globe::before { content: "\f0ac"; } i.icon.globe.africa::before { content: "\f57c"; } i.icon.globe.americas::before { content: "\f57d"; } i.icon.globe.asia::before { content: "\f57e"; } i.icon.globe.europe::before { content: "\f7a2"; } i.icon.golf.ball::before { content: "\f450"; } i.icon.gopuram::before { content: "\f664"; } i.icon.graduation.cap::before { content: "\f19d"; } i.icon.greater.than::before { content: "\f531"; } i.icon.greater.than.equal::before { content: "\f532"; } i.icon.grimace::before { content: "\f57f"; } i.icon.grin::before { content: "\f580"; } i.icon.grin.alternate::before { content: "\f581"; } i.icon.grin.beam::before { content: "\f582"; } i.icon.grin.beam.sweat::before { content: "\f583"; } i.icon.grin.hearts::before { content: "\f584"; } i.icon.grin.squint::before { content: "\f585"; } i.icon.grin.squint.tears::before { content: "\f586"; } i.icon.grin.stars::before { content: "\f587"; } i.icon.grin.tears::before { content: "\f588"; } i.icon.grin.tongue::before { content: "\f589"; } i.icon.grin.tongue.squint::before { content: "\f58a"; } i.icon.grin.tongue.wink::before { content: "\f58b"; } i.icon.grin.wink::before { content: "\f58c"; } i.icon.grip.horizontal::before { content: "\f58d"; } i.icon.grip.lines::before { content: "\f7a4"; } i.icon.grip.lines.vertical::before { content: "\f7a5"; } i.icon.grip.vertical::before { content: "\f58e"; } i.icon.guitar::before { content: "\f7a6"; } i.icon.h.square::before { content: "\f0fd"; } i.icon.hamburger::before { content: "\f805"; } i.icon.hammer::before { content: "\f6e3"; } i.icon.hamsa::before { content: "\f665"; } i.icon.hand.holding::before { content: "\f4bd"; } i.icon.hand.holding.heart::before { content: "\f4be"; } i.icon.hand.holding.medical::before { content: "\e05c"; } i.icon.hand.holding.usd::before { content: "\f4c0"; } i.icon.hand.holding.water::before { content: "\f4c1"; } i.icon.hand.lizard::before { content: "\f258"; } i.icon.hand.middle.finger::before { content: "\f806"; } i.icon.hand.paper::before { content: "\f256"; } i.icon.hand.peace::before { content: "\f25b"; } i.icon.hand.point.down::before { content: "\f0a7"; } i.icon.hand.point.left::before { content: "\f0a5"; } i.icon.hand.point.right::before { content: "\f0a4"; } i.icon.hand.point.up::before { content: "\f0a6"; } i.icon.hand.pointer::before { content: "\f25a"; } i.icon.hand.rock::before { content: "\f255"; } i.icon.hand.scissors::before { content: "\f257"; } i.icon.hand.sparkles::before { content: "\e05d"; } i.icon.hand.spock::before { content: "\f259"; } i.icon.hands::before { content: "\f4c2"; } i.icon.hands.helping::before { content: "\f4c4"; } i.icon.hands.wash::before { content: "\e05e"; } i.icon.handshake::before { content: "\f2b5"; } i.icon.handshake.alternate.slash::before { content: "\e05f"; } i.icon.handshake.slash::before { content: "\e060"; } i.icon.hanukiah::before { content: "\f6e6"; } i.icon.hard.hat::before { content: "\f807"; } i.icon.hashtag::before { content: "\f292"; } i.icon.hat.cowboy::before { content: "\f8c0"; } i.icon.hat.cowboy.side::before { content: "\f8c1"; } i.icon.hat.wizard::before { content: "\f6e8"; } i.icon.hdd::before { content: "\f0a0"; } i.icon.head.side.cough::before { content: "\e061"; } i.icon.head.side.cough.slash::before { content: "\e062"; } i.icon.head.side.mask::before { content: "\e063"; } i.icon.head.side.virus::before { content: "\e064"; } i.icon.heading::before { content: "\f1dc"; } i.icon.headphones::before { content: "\f025"; } i.icon.headphones.alternate::before { content: "\f58f"; } i.icon.headset::before { content: "\f590"; } i.icon.heart::before { content: "\f004"; } i.icon.heart.broken::before { content: "\f7a9"; } i.icon.heartbeat::before { content: "\f21e"; } i.icon.helicopter::before { content: "\f533"; } i.icon.highlighter::before { content: "\f591"; } i.icon.hiking::before { content: "\f6ec"; } i.icon.hippo::before { content: "\f6ed"; } i.icon.history::before { content: "\f1da"; } i.icon.hockey.puck::before { content: "\f453"; } i.icon.holly.berry::before { content: "\f7aa"; } i.icon.home::before { content: "\f015"; } i.icon.horse::before { content: "\f6f0"; } i.icon.horse.head::before { content: "\f7ab"; } i.icon.hospital::before { content: "\f0f8"; } i.icon.hospital.alternate::before { content: "\f47d"; } i.icon.hospital.symbol::before { content: "\f47e"; } i.icon.hospital.user::before { content: "\f80d"; } i.icon.hot.tub::before { content: "\f593"; } i.icon.hotdog::before { content: "\f80f"; } i.icon.hotel::before { content: "\f594"; } i.icon.hourglass::before { content: "\f254"; } i.icon.hourglass.end::before { content: "\f253"; } i.icon.hourglass.half::before { content: "\f252"; } i.icon.hourglass.start::before { content: "\f251"; } i.icon.house.damage::before { content: "\f6f1"; } i.icon.house.user::before { content: "\e065"; } i.icon.hryvnia::before { content: "\f6f2"; } i.icon.i.cursor::before { content: "\f246"; } i.icon.ice.cream::before { content: "\f810"; } i.icon.icicles::before { content: "\f7ad"; } i.icon.icons::before { content: "\f86d"; } i.icon.id.badge::before { content: "\f2c1"; } i.icon.id.card::before { content: "\f2c2"; } i.icon.id.card.alternate::before { content: "\f47f"; } i.icon.igloo::before { content: "\f7ae"; } i.icon.image::before { content: "\f03e"; } i.icon.images::before { content: "\f302"; } i.icon.inbox::before { content: "\f01c"; } i.icon.indent::before { content: "\f03c"; } i.icon.industry::before { content: "\f275"; } i.icon.infinity::before { content: "\f534"; } i.icon.info::before { content: "\f129"; } i.icon.info.circle::before { content: "\f05a"; } i.icon.italic::before { content: "\f033"; } i.icon.jedi::before { content: "\f669"; } i.icon.joint::before { content: "\f595"; } i.icon.journal.whills::before { content: "\f66a"; } i.icon.kaaba::before { content: "\f66b"; } i.icon.key::before { content: "\f084"; } i.icon.keyboard::before { content: "\f11c"; } i.icon.khanda::before { content: "\f66d"; } i.icon.kiss::before { content: "\f596"; } i.icon.kiss.beam::before { content: "\f597"; } i.icon.kiss.wink.heart::before { content: "\f598"; } i.icon.kiwi.bird::before { content: "\f535"; } i.icon.landmark::before { content: "\f66f"; } i.icon.language::before { content: "\f1ab"; } i.icon.laptop::before { content: "\f109"; } i.icon.laptop.code::before { content: "\f5fc"; } i.icon.laptop.house::before { content: "\e066"; } i.icon.laptop.medical::before { content: "\f812"; } i.icon.laugh::before { content: "\f599"; } i.icon.laugh.beam::before { content: "\f59a"; } i.icon.laugh.squint::before { content: "\f59b"; } i.icon.laugh.wink::before { content: "\f59c"; } i.icon.layer.group::before { content: "\f5fd"; } i.icon.leaf::before { content: "\f06c"; } i.icon.lemon::before { content: "\f094"; } i.icon.less.than::before { content: "\f536"; } i.icon.less.than.equal::before { content: "\f537"; } i.icon.level.down.alternate::before { content: "\f3be"; } i.icon.level.up.alternate::before { content: "\f3bf"; } i.icon.life.ring::before { content: "\f1cd"; } i.icon.lightbulb::before { content: "\f0eb"; } i.icon.linkify::before { content: "\f0c1"; } i.icon.lira.sign::before { content: "\f195"; } i.icon.list::before { content: "\f03a"; } i.icon.list.alternate::before { content: "\f022"; } i.icon.list.ol::before { content: "\f0cb"; } i.icon.list.ul::before { content: "\f0ca"; } i.icon.location.arrow::before { content: "\f124"; } i.icon.lock::before { content: "\f023"; } i.icon.lock.open::before { content: "\f3c1"; } i.icon.long.arrow.alternate.down::before { content: "\f309"; } i.icon.long.arrow.alternate.left::before { content: "\f30a"; } i.icon.long.arrow.alternate.right::before { content: "\f30b"; } i.icon.long.arrow.alternate.up::before { content: "\f30c"; } i.icon.low.vision::before { content: "\f2a8"; } i.icon.luggage.cart::before { content: "\f59d"; } i.icon.lungs::before { content: "\f604"; } i.icon.lungs.virus::before { content: "\e067"; } i.icon.magic::before { content: "\f0d0"; } i.icon.magnet::before { content: "\f076"; } i.icon.mail.bulk::before { content: "\f674"; } i.icon.male::before { content: "\f183"; } i.icon.map::before { content: "\f279"; } i.icon.map.marked::before { content: "\f59f"; } i.icon.map.marked.alternate::before { content: "\f5a0"; } i.icon.map.marker::before { content: "\f041"; } i.icon.map.marker.alternate::before { content: "\f3c5"; } i.icon.map.pin::before { content: "\f276"; } i.icon.map.signs::before { content: "\f277"; } i.icon.marker::before { content: "\f5a1"; } i.icon.mars::before { content: "\f222"; } i.icon.mars.double::before { content: "\f227"; } i.icon.mars.stroke::before { content: "\f229"; } i.icon.mars.stroke.horizontal::before { content: "\f22b"; } i.icon.mars.stroke.vertical::before { content: "\f22a"; } i.icon.mask::before { content: "\f6fa"; } i.icon.medal::before { content: "\f5a2"; } i.icon.medkit::before { content: "\f0fa"; } i.icon.meh::before { content: "\f11a"; } i.icon.meh.blank::before { content: "\f5a4"; } i.icon.meh.rolling.eyes::before { content: "\f5a5"; } i.icon.memory::before { content: "\f538"; } i.icon.menorah::before { content: "\f676"; } i.icon.mercury::before { content: "\f223"; } i.icon.meteor::before { content: "\f753"; } i.icon.microchip::before { content: "\f2db"; } i.icon.microphone::before { content: "\f130"; } i.icon.microphone.alternate::before { content: "\f3c9"; } i.icon.microphone.alternate.slash::before { content: "\f539"; } i.icon.microphone.slash::before { content: "\f131"; } i.icon.microscope::before { content: "\f610"; } i.icon.minus::before { content: "\f068"; } i.icon.minus.circle::before { content: "\f056"; } i.icon.minus.square::before { content: "\f146"; } i.icon.mitten::before { content: "\f7b5"; } i.icon.mobile::before { content: "\f10b"; } i.icon.mobile.alternate::before { content: "\f3cd"; } i.icon.money.bill::before { content: "\f0d6"; } i.icon.money.bill.alternate::before { content: "\f3d1"; } i.icon.money.bill.wave::before { content: "\f53a"; } i.icon.money.bill.wave.alternate::before { content: "\f53b"; } i.icon.money.check::before { content: "\f53c"; } i.icon.money.check.alternate::before { content: "\f53d"; } i.icon.monument::before { content: "\f5a6"; } i.icon.moon::before { content: "\f186"; } i.icon.mortar.pestle::before { content: "\f5a7"; } i.icon.mosque::before { content: "\f678"; } i.icon.motorcycle::before { content: "\f21c"; } i.icon.mountain::before { content: "\f6fc"; } i.icon.mouse::before { content: "\f8cc"; } i.icon.mouse.pointer::before { content: "\f245"; } i.icon.mug.hot::before { content: "\f7b6"; } i.icon.music::before { content: "\f001"; } i.icon.network.wired::before { content: "\f6ff"; } i.icon.neuter::before { content: "\f22c"; } i.icon.newspaper::before { content: "\f1ea"; } i.icon.not.equal::before { content: "\f53e"; } i.icon.notes.medical::before { content: "\f481"; } i.icon.object.group::before { content: "\f247"; } i.icon.object.ungroup::before { content: "\f248"; } i.icon.oil.can::before { content: "\f613"; } i.icon.om::before { content: "\f679"; } i.icon.otter::before { content: "\f700"; } i.icon.outdent::before { content: "\f03b"; } i.icon.pager::before { content: "\f815"; } i.icon.paint.brush::before { content: "\f1fc"; } i.icon.paint.roller::before { content: "\f5aa"; } i.icon.palette::before { content: "\f53f"; } i.icon.pallet::before { content: "\f482"; } i.icon.paper.plane::before { content: "\f1d8"; } i.icon.paperclip::before { content: "\f0c6"; } i.icon.parachute.box::before { content: "\f4cd"; } i.icon.paragraph::before { content: "\f1dd"; } i.icon.parking::before { content: "\f540"; } i.icon.passport::before { content: "\f5ab"; } i.icon.pastafarianism::before { content: "\f67b"; } i.icon.paste::before { content: "\f0ea"; } i.icon.pause::before { content: "\f04c"; } i.icon.pause.circle::before { content: "\f28b"; } i.icon.paw::before { content: "\f1b0"; } i.icon.peace::before { content: "\f67c"; } i.icon.pen::before { content: "\f304"; } i.icon.pen.alternate::before { content: "\f305"; } i.icon.pen.fancy::before { content: "\f5ac"; } i.icon.pen.nib::before { content: "\f5ad"; } i.icon.pen.square::before { content: "\f14b"; } i.icon.pencil.alternate::before { content: "\f303"; } i.icon.pencil.ruler::before { content: "\f5ae"; } i.icon.people.arrows::before { content: "\e068"; } i.icon.people.carry::before { content: "\f4ce"; } i.icon.pepper.hot::before { content: "\f816"; } i.icon.percent::before { content: "\f295"; } i.icon.percentage::before { content: "\f541"; } i.icon.person.booth::before { content: "\f756"; } i.icon.phone::before { content: "\f095"; } i.icon.phone.alternate::before { content: "\f879"; } i.icon.phone.slash::before { content: "\f3dd"; } i.icon.phone.square::before { content: "\f098"; } i.icon.phone.square.alternate::before { content: "\f87b"; } i.icon.phone.volume::before { content: "\f2a0"; } i.icon.photo.video::before { content: "\f87c"; } i.icon.piggy.bank::before { content: "\f4d3"; } i.icon.pills::before { content: "\f484"; } i.icon.pizza.slice::before { content: "\f818"; } i.icon.place.of.worship::before { content: "\f67f"; } i.icon.plane::before { content: "\f072"; } i.icon.plane.arrival::before { content: "\f5af"; } i.icon.plane.departure::before { content: "\f5b0"; } i.icon.plane.slash::before { content: "\e069"; } i.icon.play::before { content: "\f04b"; } i.icon.play.circle::before { content: "\f144"; } i.icon.plug::before { content: "\f1e6"; } i.icon.plus::before { content: "\f067"; } i.icon.plus.circle::before { content: "\f055"; } i.icon.plus.square::before { content: "\f0fe"; } i.icon.podcast::before { content: "\f2ce"; } i.icon.poll::before { content: "\f681"; } i.icon.poll.horizontal::before { content: "\f682"; } i.icon.poo::before { content: "\f2fe"; } i.icon.poo.storm::before { content: "\f75a"; } i.icon.poop::before { content: "\f619"; } i.icon.portrait::before { content: "\f3e0"; } i.icon.pound.sign::before { content: "\f154"; } i.icon.power.off::before { content: "\f011"; } i.icon.pray::before { content: "\f683"; } i.icon.praying.hands::before { content: "\f684"; } i.icon.prescription::before { content: "\f5b1"; } i.icon.prescription.bottle::before { content: "\f485"; } i.icon.prescription.bottle.alternate::before { content: "\f486"; } i.icon.print::before { content: "\f02f"; } i.icon.procedures::before { content: "\f487"; } i.icon.project.diagram::before { content: "\f542"; } i.icon.pump.medical::before { content: "\e06a"; } i.icon.pump.soap::before { content: "\e06b"; } i.icon.puzzle.piece::before { content: "\f12e"; } i.icon.qrcode::before { content: "\f029"; } i.icon.question::before { content: "\f128"; } i.icon.question.circle::before { content: "\f059"; } i.icon.quidditch::before { content: "\f458"; } i.icon.quote.left::before { content: "\f10d"; } i.icon.quote.right::before { content: "\f10e"; } i.icon.quran::before { content: "\f687"; } i.icon.radiation::before { content: "\f7b9"; } i.icon.radiation.alternate::before { content: "\f7ba"; } i.icon.rainbow::before { content: "\f75b"; } i.icon.random::before { content: "\f074"; } i.icon.receipt::before { content: "\f543"; } i.icon.record.vinyl::before { content: "\f8d9"; } i.icon.recycle::before { content: "\f1b8"; } i.icon.redo::before { content: "\f01e"; } i.icon.redo.alternate::before { content: "\f2f9"; } i.icon.registered::before { content: "\f25d"; } i.icon.remove.format::before { content: "\f87d"; } i.icon.reply::before { content: "\f3e5"; } i.icon.reply.all::before { content: "\f122"; } i.icon.republican::before { content: "\f75e"; } i.icon.restroom::before { content: "\f7bd"; } i.icon.retweet::before { content: "\f079"; } i.icon.ribbon::before { content: "\f4d6"; } i.icon.ring::before { content: "\f70b"; } i.icon.road::before { content: "\f018"; } i.icon.robot::before { content: "\f544"; } i.icon.rocket::before { content: "\f135"; } i.icon.route::before { content: "\f4d7"; } i.icon.rss::before { content: "\f09e"; } i.icon.rss.square::before { content: "\f143"; } i.icon.ruble.sign::before { content: "\f158"; } i.icon.ruler::before { content: "\f545"; } i.icon.ruler.combined::before { content: "\f546"; } i.icon.ruler.horizontal::before { content: "\f547"; } i.icon.ruler.vertical::before { content: "\f548"; } i.icon.running::before { content: "\f70c"; } i.icon.rupee.sign::before { content: "\f156"; } i.icon.sad.cry::before { content: "\f5b3"; } i.icon.sad.tear::before { content: "\f5b4"; } i.icon.satellite::before { content: "\f7bf"; } i.icon.satellite.dish::before { content: "\f7c0"; } i.icon.save::before { content: "\f0c7"; } i.icon.school::before { content: "\f549"; } i.icon.screwdriver::before { content: "\f54a"; } i.icon.scroll::before { content: "\f70e"; } i.icon.sd.card::before { content: "\f7c2"; } i.icon.search::before { content: "\f002"; } i.icon.search.dollar::before { content: "\f688"; } i.icon.search.location::before { content: "\f689"; } i.icon.search.minus::before { content: "\f010"; } i.icon.search.plus::before { content: "\f00e"; } i.icon.seedling::before { content: "\f4d8"; } i.icon.server::before { content: "\f233"; } i.icon.shapes::before { content: "\f61f"; } i.icon.share::before { content: "\f064"; } i.icon.share.alternate::before { content: "\f1e0"; } i.icon.share.alternate.square::before { content: "\f1e1"; } i.icon.share.square::before { content: "\f14d"; } i.icon.shekel.sign::before { content: "\f20b"; } i.icon.shield.alternate::before { content: "\f3ed"; } i.icon.shield.virus::before { content: "\e06c"; } i.icon.ship::before { content: "\f21a"; } i.icon.shipping.fast::before { content: "\f48b"; } i.icon.shoe.prints::before { content: "\f54b"; } i.icon.shopping.bag::before { content: "\f290"; } i.icon.shopping.basket::before { content: "\f291"; } i.icon.shopping.cart::before { content: "\f07a"; } i.icon.shower::before { content: "\f2cc"; } i.icon.shuttle.van::before { content: "\f5b6"; } i.icon.sign::before { content: "\f4d9"; } i.icon.sign.language::before { content: "\f2a7"; } i.icon.signal::before { content: "\f012"; } i.icon.signature::before { content: "\f5b7"; } i.icon.sim.card::before { content: "\f7c4"; } i.icon.sink::before { content: "\e06d"; } i.icon.sitemap::before { content: "\f0e8"; } i.icon.skating::before { content: "\f7c5"; } i.icon.skiing::before { content: "\f7c9"; } i.icon.skiing.nordic::before { content: "\f7ca"; } i.icon.skull::before { content: "\f54c"; } i.icon.skull.crossbones::before { content: "\f714"; } i.icon.slash::before { content: "\f715"; } i.icon.sleigh::before { content: "\f7cc"; } i.icon.sliders.horizontal::before { content: "\f1de"; } i.icon.smile::before { content: "\f118"; } i.icon.smile.beam::before { content: "\f5b8"; } i.icon.smile.wink::before { content: "\f4da"; } i.icon.smog::before { content: "\f75f"; } i.icon.smoking::before { content: "\f48d"; } i.icon.smoking.ban::before { content: "\f54d"; } i.icon.sms::before { content: "\f7cd"; } i.icon.snowboarding::before { content: "\f7ce"; } i.icon.snowflake::before { content: "\f2dc"; } i.icon.snowman::before { content: "\f7d0"; } i.icon.snowplow::before { content: "\f7d2"; } i.icon.soap::before { content: "\e06e"; } i.icon.socks::before { content: "\f696"; } i.icon.solar.panel::before { content: "\f5ba"; } i.icon.sort::before { content: "\f0dc"; } i.icon.sort.alphabet.down::before { content: "\f15d"; } i.icon.sort.alphabet.down.alternate::before { content: "\f881"; } i.icon.sort.alphabet.up::before { content: "\f15e"; } i.icon.sort.alphabet.up.alternate::before { content: "\f882"; } i.icon.sort.amount.down::before { content: "\f160"; } i.icon.sort.amount.down.alternate::before { content: "\f884"; } i.icon.sort.amount.up::before { content: "\f161"; } i.icon.sort.amount.up.alternate::before { content: "\f885"; } i.icon.sort.down::before { content: "\f0dd"; } i.icon.sort.numeric.down::before { content: "\f162"; } i.icon.sort.numeric.down.alternate::before { content: "\f886"; } i.icon.sort.numeric.up::before { content: "\f163"; } i.icon.sort.numeric.up.alternate::before { content: "\f887"; } i.icon.sort.up::before { content: "\f0de"; } i.icon.spa::before { content: "\f5bb"; } i.icon.space.shuttle::before { content: "\f197"; } i.icon.spell.check::before { content: "\f891"; } i.icon.spider::before { content: "\f717"; } i.icon.spinner::before { content: "\f110"; } i.icon.splotch::before { content: "\f5bc"; } i.icon.spray.can::before { content: "\f5bd"; } i.icon.square::before { content: "\f0c8"; } i.icon.square.full::before { content: "\f45c"; } i.icon.square.root.alternate::before { content: "\f698"; } i.icon.stamp::before { content: "\f5bf"; } i.icon.star::before { content: "\f005"; } i.icon.star.and.crescent::before { content: "\f699"; } i.icon.star.half::before { content: "\f089"; } i.icon.star.half.alternate::before { content: "\f5c0"; } i.icon.star.of.david::before { content: "\f69a"; } i.icon.star.of.life::before { content: "\f621"; } i.icon.step.backward::before { content: "\f048"; } i.icon.step.forward::before { content: "\f051"; } i.icon.stethoscope::before { content: "\f0f1"; } i.icon.sticky.note::before { content: "\f249"; } i.icon.stop::before { content: "\f04d"; } i.icon.stop.circle::before { content: "\f28d"; } i.icon.stopwatch::before { content: "\f2f2"; } i.icon.stopwatch.twenty::before { content: "\e06f"; } i.icon.store::before { content: "\f54e"; } i.icon.store.alternate::before { content: "\f54f"; } i.icon.store.alternate.slash::before { content: "\e070"; } i.icon.store.slash::before { content: "\e071"; } i.icon.stream::before { content: "\f550"; } i.icon.street.view::before { content: "\f21d"; } i.icon.strikethrough::before { content: "\f0cc"; } i.icon.stroopwafel::before { content: "\f551"; } i.icon.subscript::before { content: "\f12c"; } i.icon.subway::before { content: "\f239"; } i.icon.suitcase::before { content: "\f0f2"; } i.icon.suitcase.rolling::before { content: "\f5c1"; } i.icon.sun::before { content: "\f185"; } i.icon.superscript::before { content: "\f12b"; } i.icon.surprise::before { content: "\f5c2"; } i.icon.swatchbook::before { content: "\f5c3"; } i.icon.swimmer::before { content: "\f5c4"; } i.icon.swimming.pool::before { content: "\f5c5"; } i.icon.synagogue::before { content: "\f69b"; } i.icon.sync::before { content: "\f021"; } i.icon.sync.alternate::before { content: "\f2f1"; } i.icon.syringe::before { content: "\f48e"; } i.icon.table::before { content: "\f0ce"; } i.icon.table.tennis::before { content: "\f45d"; } i.icon.tablet::before { content: "\f10a"; } i.icon.tablet.alternate::before { content: "\f3fa"; } i.icon.tablets::before { content: "\f490"; } i.icon.tachometer.alternate::before { content: "\f3fd"; } i.icon.tag::before { content: "\f02b"; } i.icon.tags::before { content: "\f02c"; } i.icon.tape::before { content: "\f4db"; } i.icon.tasks::before { content: "\f0ae"; } i.icon.taxi::before { content: "\f1ba"; } i.icon.teeth::before { content: "\f62e"; } i.icon.teeth.open::before { content: "\f62f"; } i.icon.temperature.high::before { content: "\f769"; } i.icon.temperature.low::before { content: "\f76b"; } i.icon.tenge::before { content: "\f7d7"; } i.icon.terminal::before { content: "\f120"; } i.icon.text.height::before { content: "\f034"; } i.icon.text.width::before { content: "\f035"; } i.icon.th::before { content: "\f00a"; } i.icon.th.large::before { content: "\f009"; } i.icon.th.list::before { content: "\f00b"; } i.icon.theater.masks::before { content: "\f630"; } i.icon.thermometer::before { content: "\f491"; } i.icon.thermometer.empty::before { content: "\f2cb"; } i.icon.thermometer.full::before { content: "\f2c7"; } i.icon.thermometer.half::before { content: "\f2c9"; } i.icon.thermometer.quarter::before { content: "\f2ca"; } i.icon.thermometer.three.quarters::before { content: "\f2c8"; } i.icon.thumbs.down::before { content: "\f165"; } i.icon.thumbs.up::before { content: "\f164"; } i.icon.thumbtack::before { content: "\f08d"; } i.icon.ticket.alternate::before { content: "\f3ff"; } i.icon.times::before { content: "\f00d"; } i.icon.times.circle::before { content: "\f057"; } i.icon.tint::before { content: "\f043"; } i.icon.tint.slash::before { content: "\f5c7"; } i.icon.tired::before { content: "\f5c8"; } i.icon.toggle.off::before { content: "\f204"; } i.icon.toggle.on::before { content: "\f205"; } i.icon.toilet::before { content: "\f7d8"; } i.icon.toilet.paper::before { content: "\f71e"; } i.icon.toilet.paper.slash::before { content: "\e072"; } i.icon.toolbox::before { content: "\f552"; } i.icon.tools::before { content: "\f7d9"; } i.icon.tooth::before { content: "\f5c9"; } i.icon.torah::before { content: "\f6a0"; } i.icon.torii.gate::before { content: "\f6a1"; } i.icon.tractor::before { content: "\f722"; } i.icon.trademark::before { content: "\f25c"; } i.icon.traffic.light::before { content: "\f637"; } i.icon.trailer::before { content: "\e041"; } i.icon.train::before { content: "\f238"; } i.icon.tram::before { content: "\f7da"; } i.icon.transgender::before { content: "\f224"; } i.icon.transgender.alternate::before { content: "\f225"; } i.icon.trash::before { content: "\f1f8"; } i.icon.trash.alternate::before { content: "\f2ed"; } i.icon.trash.restore::before { content: "\f829"; } i.icon.trash.restore.alternate::before { content: "\f82a"; } i.icon.tree::before { content: "\f1bb"; } i.icon.trophy::before { content: "\f091"; } i.icon.truck::before { content: "\f0d1"; } i.icon.truck.monster::before { content: "\f63b"; } i.icon.truck.moving::before { content: "\f4df"; } i.icon.truck.packing::before { content: "\f4de"; } i.icon.truck.pickup::before { content: "\f63c"; } i.icon.tshirt::before { content: "\f553"; } i.icon.tty::before { content: "\f1e4"; } i.icon.tv::before { content: "\f26c"; } i.icon.umbrella::before { content: "\f0e9"; } i.icon.umbrella.beach::before { content: "\f5ca"; } i.icon.underline::before { content: "\f0cd"; } i.icon.undo::before { content: "\f0e2"; } i.icon.undo.alternate::before { content: "\f2ea"; } i.icon.universal.access::before { content: "\f29a"; } i.icon.university::before { content: "\f19c"; } i.icon.unlink::before { content: "\f127"; } i.icon.unlock::before { content: "\f09c"; } i.icon.unlock.alternate::before { content: "\f13e"; } i.icon.upload::before { content: "\f093"; } i.icon.user::before { content: "\f007"; } i.icon.user.alternate::before { content: "\f406"; } i.icon.user.alternate.slash::before { content: "\f4fa"; } i.icon.user.astronaut::before { content: "\f4fb"; } i.icon.user.check::before { content: "\f4fc"; } i.icon.user.circle::before { content: "\f2bd"; } i.icon.user.clock::before { content: "\f4fd"; } i.icon.user.cog::before { content: "\f4fe"; } i.icon.user.edit::before { content: "\f4ff"; } i.icon.user.friends::before { content: "\f500"; } i.icon.user.graduate::before { content: "\f501"; } i.icon.user.injured::before { content: "\f728"; } i.icon.user.lock::before { content: "\f502"; } i.icon.user.md::before { content: "\f0f0"; } i.icon.user.minus::before { content: "\f503"; } i.icon.user.ninja::before { content: "\f504"; } i.icon.user.nurse::before { content: "\f82f"; } i.icon.user.plus::before { content: "\f234"; } i.icon.user.secret::before { content: "\f21b"; } i.icon.user.shield::before { content: "\f505"; } i.icon.user.slash::before { content: "\f506"; } i.icon.user.tag::before { content: "\f507"; } i.icon.user.tie::before { content: "\f508"; } i.icon.user.times::before { content: "\f235"; } i.icon.users::before { content: "\f0c0"; } i.icon.users.cog::before { content: "\f509"; } i.icon.users.slash::before { content: "\e073"; } i.icon.utensil.spoon::before { content: "\f2e5"; } i.icon.utensils::before { content: "\f2e7"; } i.icon.vector.square::before { content: "\f5cb"; } i.icon.venus::before { content: "\f221"; } i.icon.venus.double::before { content: "\f226"; } i.icon.venus.mars::before { content: "\f228"; } i.icon.vest::before { content: "\e085"; } i.icon.vest.patches::before { content: "\e086"; } i.icon.vial::before { content: "\f492"; } i.icon.vials::before { content: "\f493"; } i.icon.video::before { content: "\f03d"; } i.icon.video.slash::before { content: "\f4e2"; } i.icon.vihara::before { content: "\f6a7"; } i.icon.virus::before { content: "\e074"; } i.icon.virus.slash::before { content: "\e075"; } i.icon.viruses::before { content: "\e076"; } i.icon.voicemail::before { content: "\f897"; } i.icon.volleyball.ball::before { content: "\f45f"; } i.icon.volume.down::before { content: "\f027"; } i.icon.volume.mute::before { content: "\f6a9"; } i.icon.volume.off::before { content: "\f026"; } i.icon.volume.up::before { content: "\f028"; } i.icon.vote.yea::before { content: "\f772"; } i.icon.vr.cardboard::before { content: "\f729"; } i.icon.walking::before { content: "\f554"; } i.icon.wallet::before { content: "\f555"; } i.icon.warehouse::before { content: "\f494"; } i.icon.water::before { content: "\f773"; } i.icon.wave.square::before { content: "\f83e"; } i.icon.weight::before { content: "\f496"; } i.icon.weight.hanging::before { content: "\f5cd"; } i.icon.wheelchair::before { content: "\f193"; } i.icon.wifi::before { content: "\f1eb"; } i.icon.wind::before { content: "\f72e"; } i.icon.window.close::before { content: "\f410"; } i.icon.window.maximize::before { content: "\f2d0"; } i.icon.window.minimize::before { content: "\f2d1"; } i.icon.window.restore::before { content: "\f2d2"; } i.icon.wine.bottle::before { content: "\f72f"; } i.icon.wine.glass::before { content: "\f4e3"; } i.icon.wine.glass.alternate::before { content: "\f5ce"; } i.icon.won.sign::before { content: "\f159"; } i.icon.wrench::before { content: "\f0ad"; } i.icon.x.ray::before { content: "\f497"; } i.icon.yen.sign::before { content: "\f157"; } i.icon.yin.yang::before { content: "\f6ad"; } /* Aliases */ i.icon.add::before { content: "\f067"; } i.icon.add.circle::before { content: "\f055"; } i.icon.add.square::before { content: "\f0fe"; } i.icon.add.to.calendar::before { content: "\f271"; } i.icon.add.to.cart::before { content: "\f217"; } i.icon.add.user::before { content: "\f234"; } i.icon.alarm::before { content: "\f0f3"; } i.icon.alarm.mute::before { content: "\f1f6"; } i.icon.ald::before { content: "\f2a2"; } i.icon.als::before { content: "\f2a2"; } i.icon.announcement::before { content: "\f0a1"; } i.icon.area.chart::before { content: "\f1fe"; } i.icon.area.graph::before { content: "\f1fe"; } i.icon.arrow.down.cart::before { content: "\f218"; } i.icon.asexual::before { content: "\f22d"; } i.icon.asl::before { content: "\f2a3"; } i.icon.asl.interpreting::before { content: "\f2a3"; } i.icon.assistive.listening.devices::before { content: "\f2a2"; } i.icon.attach::before { content: "\f0c6"; } i.icon.attention::before { content: "\f06a"; } i.icon.balance::before { content: "\f24e"; } i.icon.bar::before { content: "\f0fc"; } i.icon.bathtub::before { content: "\f2cd"; } i.icon.battery.four::before { content: "\f240"; } i.icon.battery.high::before { content: "\f241"; } i.icon.battery.low::before { content: "\f243"; } i.icon.battery.medium::before { content: "\f242"; } i.icon.battery.one::before { content: "\f243"; } i.icon.battery.three::before { content: "\f241"; } i.icon.battery.two::before { content: "\f242"; } i.icon.battery.zero::before { content: "\f244"; } i.icon.birthday::before { content: "\f1fd"; } i.icon.block.layout::before { content: "\f009"; } i.icon.broken.chain::before { content: "\f127"; } i.icon.browser::before { content: "\f022"; } i.icon.call::before { content: "\f095"; } i.icon.call.square::before { content: "\f098"; } i.icon.cancel::before { content: "\f00d"; } i.icon.cart::before { content: "\f07a"; } i.icon.cc::before { content: "\f20a"; } i.icon.chain::before { content: "\f0c1"; } i.icon.chat::before { content: "\f075"; } i.icon.checked.calendar::before { content: "\f274"; } i.icon.checkmark::before { content: "\f00c"; } i.icon.checkmark.box::before { content: "\f14a"; } i.icon.chess.rock::before { content: "\f447"; } i.icon.circle.notched::before { content: "\f1ce"; } i.icon.circle.thin::before { content: "\f111"; } i.icon.close::before { content: "\f00d"; } i.icon.cloud.download::before { content: "\f381"; } i.icon.cloud.upload::before { content: "\f382"; } i.icon.cny::before { content: "\f157"; } i.icon.cocktail::before { content: "\f000"; } i.icon.commenting::before { content: "\f27a"; } i.icon.compose::before { content: "\f303"; } i.icon.computer::before { content: "\f108"; } i.icon.configure::before { content: "\f0ad"; } i.icon.content::before { content: "\f0c9"; } i.icon.conversation::before { content: "\f086"; } i.icon.credit.card.alternative::before { content: "\f09d"; } i.icon.currency::before { content: "\f3d1"; } i.icon.dashboard::before { content: "\f3fd"; } i.icon.deafness::before { content: "\f2a4"; } i.icon.delete::before { content: "\f00d"; } i.icon.delete.calendar::before { content: "\f273"; } i.icon.detective::before { content: "\f21b"; } i.icon.diamond::before { content: "\f3a5"; } i.icon.discussions::before { content: "\f086"; } i.icon.disk::before { content: "\f0a0"; } i.icon.doctor::before { content: "\f0f0"; } i.icon.dollar::before { content: "\f155"; } i.icon.dont::before { content: "\f05e"; } i.icon.drivers.license::before { content: "\f2c2"; } i.icon.dropdown::before { content: "\f0d7"; } i.icon.emergency::before { content: "\f0f9"; } i.icon.erase::before { content: "\f12d"; } i.icon.eur::before { content: "\f153"; } i.icon.euro::before { content: "\f153"; } i.icon.exchange::before { content: "\f362"; } i.icon.external::before { content: "\f35d"; } i.icon.external.share::before { content: "\f14d"; } i.icon.external.square::before { content: "\f360"; } i.icon.eyedropper::before { content: "\f1fb"; } i.icon.factory::before { content: "\f275"; } i.icon.favorite::before { content: "\f005"; } i.icon.feed::before { content: "\f09e"; } i.icon.female.homosexual::before { content: "\f226"; } i.icon.file.text::before { content: "\f15c"; } i.icon.find::before { content: "\f1e5"; } i.icon.first.aid::before { content: "\f0fa"; } i.icon.food::before { content: "\f2e7"; } i.icon.fork::before { content: "\f126"; } i.icon.game::before { content: "\f11b"; } i.icon.gay::before { content: "\f227"; } i.icon.gbp::before { content: "\f154"; } i.icon.grab::before { content: "\f255"; } i.icon.graduation::before { content: "\f19d"; } i.icon.grid.layout::before { content: "\f00a"; } i.icon.group::before { content: "\f0c0"; } i.icon.h::before { content: "\f0fd"; } i.icon.hamburger::before { content: "\f0c9"; } i.icon.hand.victory::before { content: "\f25b"; } i.icon.handicap::before { content: "\f193"; } i.icon.hard.of.hearing::before { content: "\f2a4"; } i.icon.header::before { content: "\f1dc"; } i.icon.heart.empty::before { content: "\f004"; } i.icon.help::before { content: "\f128"; } i.icon.help.circle::before { content: "\f059"; } i.icon.heterosexual::before { content: "\f228"; } i.icon.hide::before { content: "\f070"; } i.icon.hotel::before { content: "\f236"; } i.icon.hourglass.four::before { content: "\f254"; } i.icon.hourglass.full::before { content: "\f254"; } i.icon.hourglass.one::before { content: "\f251"; } i.icon.hourglass.three::before { content: "\f253"; } i.icon.hourglass.two::before { content: "\f252"; } i.icon.hourglass.zero::before { content: "\f253"; } i.icon.idea::before { content: "\f0eb"; } i.icon.ils::before { content: "\f20b"; } i.icon.inr::before { content: "\f156"; } i.icon.intergender::before { content: "\f224"; } i.icon.intersex::before { content: "\f224"; } i.icon.jpy::before { content: "\f157"; } i.icon.krw::before { content: "\f159"; } i.icon.lab::before { content: "\f0c3"; } i.icon.law::before { content: "\f24e"; } i.icon.legal::before { content: "\f0e3"; } i.icon.lesbian::before { content: "\f226"; } i.icon.level.down::before { content: "\f3be"; } i.icon.level.up::before { content: "\f3bf"; } i.icon.lightning::before { content: "\f0e7"; } i.icon.like::before { content: "\f004"; } i.icon.linegraph::before { content: "\f201"; } i.icon.linkify::before { content: "\f0c1"; } i.icon.lira::before { content: "\f195"; } i.icon.list.layout::before { content: "\f00b"; } i.icon.magnify::before { content: "\f00e"; } i.icon.mail::before { content: "\f0e0"; } i.icon.mail.forward::before { content: "\f064"; } i.icon.mail.square::before { content: "\f199"; } i.icon.male.homosexual::before { content: "\f227"; } i.icon.man::before { content: "\f222"; } i.icon.marker::before { content: "\f041"; } i.icon.mars.alternate::before { content: "\f229"; } i.icon.mars.horizontal::before { content: "\f22b"; } i.icon.mars.vertical::before { content: "\f22a"; } i.icon.meanpath::before { content: "\f0c8"; } i.icon.military::before { content: "\f0fb"; } i.icon.money::before { content: "\f3d1"; } i.icon.move::before { content: "\f0b2"; } i.icon.mute::before { content: "\f131"; } i.icon.non.binary.transgender::before { content: "\f223"; } i.icon.numbered.list::before { content: "\f0cb"; } i.icon.options::before { content: "\f1de"; } i.icon.ordered.list::before { content: "\f0cb"; } i.icon.other.gender::before { content: "\f229"; } i.icon.other.gender.horizontal::before { content: "\f22b"; } i.icon.other.gender.vertical::before { content: "\f22a"; } i.icon.payment::before { content: "\f09d"; } i.icon.pencil::before { content: "\f303"; } i.icon.pencil.square::before { content: "\f14b"; } i.icon.photo::before { content: "\f030"; } i.icon.picture::before { content: "\f03e"; } i.icon.pie.chart::before { content: "\f200"; } i.icon.pie.graph::before { content: "\f200"; } i.icon.pin::before { content: "\f08d"; } i.icon.plus.cart::before { content: "\f217"; } i.icon.point::before { content: "\f041"; } i.icon.pointing.down::before { content: "\f0a7"; } i.icon.pointing.left::before { content: "\f0a5"; } i.icon.pointing.right::before { content: "\f0a4"; } i.icon.pointing.up::before { content: "\f0a6"; } i.icon.pound::before { content: "\f154"; } i.icon.power::before { content: "\f011"; } i.icon.power.cord::before { content: "\f1e6"; } i.icon.privacy::before { content: "\f084"; } i.icon.protect::before { content: "\f023"; } i.icon.puzzle::before { content: "\f12e"; } i.icon.r.circle::before { content: "\f25d"; } i.icon.radio::before { content: "\f192"; } i.icon.rain::before { content: "\f0e9"; } i.icon.record::before { content: "\f03d"; } i.icon.refresh::before { content: "\f021"; } i.icon.remove::before { content: "\f00d"; } i.icon.remove.bookmark::before { content: "\f02e"; } i.icon.remove.circle::before { content: "\f057"; } i.icon.remove.from.calendar::before { content: "\f272"; } i.icon.remove.user::before { content: "\f235"; } i.icon.repeat::before { content: "\f01e"; } i.icon.resize.horizontal::before { content: "\f337"; } i.icon.resize.vertical::before { content: "\f338"; } i.icon.rmb::before { content: "\f157"; } i.icon.rouble::before { content: "\f158"; } i.icon.rub::before { content: "\f158"; } i.icon.ruble::before { content: "\f158"; } i.icon.rupee::before { content: "\f156"; } i.icon.s15::before { content: "\f2cd"; } i.icon.selected.radio::before { content: "\f192"; } i.icon.send::before { content: "\f1d8"; } i.icon.setting::before { content: "\f013"; } i.icon.settings::before { content: "\f085"; } i.icon.shekel::before { content: "\f20b"; } i.icon.sheqel::before { content: "\f20b"; } i.icon.shield::before { content: "\f3ed"; } i.icon.shipping::before { content: "\f0d1"; } i.icon.shop::before { content: "\f07a"; } i.icon.shuffle::before { content: "\f074"; } i.icon.shutdown::before { content: "\f011"; } i.icon.sidebar::before { content: "\f0c9"; } i.icon.signing::before { content: "\f2a7"; } i.icon.signup::before { content: "\f044"; } i.icon.sliders::before { content: "\f1de"; } i.icon.soccer::before { content: "\f1e3"; } i.icon.sort.alphabet.ascending::before { content: "\f15d"; } i.icon.sort.alphabet.descending::before { content: "\f15e"; } i.icon.sort.ascending::before { content: "\f0de"; } i.icon.sort.content.ascending::before { content: "\f160"; } i.icon.sort.content.descending::before { content: "\f161"; } i.icon.sort.descending::before { content: "\f0dd"; } i.icon.sort.numeric.ascending::before { content: "\f162"; } i.icon.sort.numeric.descending::before { content: "\f163"; } i.icon.sound::before { content: "\f025"; } i.icon.spoon::before { content: "\f2e5"; } i.icon.spy::before { content: "\f21b"; } i.icon.star.empty::before { content: "\f005"; } i.icon.star.half.empty::before { content: "\f089"; } i.icon.star.half.full::before { content: "\f089"; } i.icon.student::before { content: "\f19d"; } i.icon.talk::before { content: "\f27a"; } i.icon.target::before { content: "\f140"; } i.icon.teletype::before { content: "\f1e4"; } i.icon.television::before { content: "\f26c"; } i.icon.text.cursor::before { content: "\f246"; } i.icon.text.telephone::before { content: "\f1e4"; } i.icon.theme::before { content: "\f043"; } i.icon.thermometer::before { content: "\f2c7"; } i.icon.thumb.tack::before { content: "\f08d"; } i.icon.ticket::before { content: "\f3ff"; } i.icon.time::before { content: "\f017"; } i.icon.times.rectangle::before { content: "\f410"; } i.icon.tm::before { content: "\f25c"; } i.icon.toggle.down::before { content: "\f150"; } i.icon.toggle.left::before { content: "\f191"; } i.icon.toggle.right::before { content: "\f152"; } i.icon.toggle.up::before { content: "\f151"; } i.icon.translate::before { content: "\f1ab"; } i.icon.travel::before { content: "\f0b1"; } i.icon.treatment::before { content: "\f0f1"; } i.icon.triangle.down::before { content: "\f0d7"; } i.icon.triangle.left::before { content: "\f0d9"; } i.icon.triangle.right::before { content: "\f0da"; } i.icon.triangle.up::before { content: "\f0d8"; } i.icon.try::before { content: "\f195"; } i.icon.unhide::before { content: "\f06e"; } i.icon.unlinkify::before { content: "\f127"; } i.icon.unmute::before { content: "\f130"; } i.icon.unordered.list::before { content: "\f0ca"; } i.icon.usd::before { content: "\f155"; } i.icon.user.cancel::before { content: "\f235"; } i.icon.user.close::before { content: "\f235"; } i.icon.user.delete::before { content: "\f235"; } i.icon.user.doctor::before { content: "\f0f0"; } i.icon.user.x::before { content: "\f235"; } i.icon.vcard::before { content: "\f2bb"; } i.icon.video.camera::before { content: "\f03d"; } i.icon.video.play::before { content: "\f144"; } i.icon.volume.control.phone::before { content: "\f2a0"; } i.icon.wait::before { content: "\f017"; } i.icon.warning::before { content: "\f12a"; } i.icon.warning.circle::before { content: "\f06a"; } i.icon.warning.sign::before { content: "\f071"; } i.icon.wi.fi::before { content: "\f1eb"; } i.icon.winner::before { content: "\f091"; } i.icon.wizard::before { content: "\f0d0"; } i.icon.woman::before { content: "\f221"; } i.icon.won::before { content: "\f159"; } i.icon.world::before { content: "\f0ac"; } i.icon.write::before { content: "\f303"; } i.icon.write.square::before { content: "\f14b"; } i.icon.x::before { content: "\f00d"; } i.icon.yen::before { content: "\f157"; } i.icon.zip::before { content: "\f187"; } i.icon.zoom::before { content: "\f00e"; } /******************************* Outline Icons *******************************/ i.icon.outline { font-family: "outline-icons"; } /* Icons */ i.icon.address.book.outline::before { content: "\f2b9"; } i.icon.address.card.outline::before { content: "\f2bb"; } i.icon.angry.outline::before { content: "\f556"; } i.icon.arrow.alternate.circle.down.outline::before { content: "\f358"; } i.icon.arrow.alternate.circle.left.outline::before { content: "\f359"; } i.icon.arrow.alternate.circle.right.outline::before { content: "\f35a"; } i.icon.arrow.alternate.circle.up.outline::before { content: "\f35b"; } i.icon.bell.outline::before { content: "\f0f3"; } i.icon.bell.slash.outline::before { content: "\f1f6"; } i.icon.bookmark.outline::before { content: "\f02e"; } i.icon.building.outline::before { content: "\f1ad"; } i.icon.calendar.alternate.outline::before { content: "\f073"; } i.icon.calendar.check.outline::before { content: "\f274"; } i.icon.calendar.minus.outline::before { content: "\f272"; } i.icon.calendar.outline::before { content: "\f133"; } i.icon.calendar.plus.outline::before { content: "\f271"; } i.icon.calendar.times.outline::before { content: "\f273"; } i.icon.caret.square.down.outline::before { content: "\f150"; } i.icon.caret.square.left.outline::before { content: "\f191"; } i.icon.caret.square.right.outline::before { content: "\f152"; } i.icon.caret.square.up.outline::before { content: "\f151"; } i.icon.chart.bar.outline::before { content: "\f080"; } i.icon.check.circle.outline::before { content: "\f058"; } i.icon.check.square.outline::before { content: "\f14a"; } i.icon.circle.outline::before { content: "\f111"; } i.icon.clipboard.outline::before { content: "\f328"; } i.icon.clock.outline::before { content: "\f017"; } i.icon.clone.outline::before { content: "\f24d"; } i.icon.closed.captioning.outline::before { content: "\f20a"; } i.icon.comment.alternate.outline::before { content: "\f27a"; } i.icon.comment.dots.outline::before { content: "\f4ad"; } i.icon.comment.outline::before { content: "\f075"; } i.icon.comments.outline::before { content: "\f086"; } i.icon.compass.outline::before { content: "\f14e"; } i.icon.copy.outline::before { content: "\f0c5"; } i.icon.copyright.outline::before { content: "\f1f9"; } i.icon.credit.card.outline::before { content: "\f09d"; } i.icon.dizzy.outline::before { content: "\f567"; } i.icon.dot.circle.outline::before { content: "\f192"; } i.icon.edit.outline::before { content: "\f044"; } i.icon.envelope.open.outline::before { content: "\f2b6"; } i.icon.envelope.outline::before { content: "\f0e0"; } i.icon.eye.outline::before { content: "\f06e"; } i.icon.eye.slash.outline::before { content: "\f070"; } i.icon.file.alternate.outline::before { content: "\f15c"; } i.icon.file.archive.outline::before { content: "\f1c6"; } i.icon.file.audio.outline::before { content: "\f1c7"; } i.icon.file.code.outline::before { content: "\f1c9"; } i.icon.file.excel.outline::before { content: "\f1c3"; } i.icon.file.image.outline::before { content: "\f1c5"; } i.icon.file.outline::before { content: "\f15b"; } i.icon.file.pdf.outline::before { content: "\f1c1"; } i.icon.file.powerpoint.outline::before { content: "\f1c4"; } i.icon.file.video.outline::before { content: "\f1c8"; } i.icon.file.word.outline::before { content: "\f1c2"; } i.icon.flag.outline::before { content: "\f024"; } i.icon.flushed.outline::before { content: "\f579"; } i.icon.folder.open.outline::before { content: "\f07c"; } i.icon.folder.outline::before { content: "\f07b"; } i.icon.frown.open.outline::before { content: "\f57a"; } i.icon.frown.outline::before { content: "\f119"; } i.icon.futbol.outline::before { content: "\f1e3"; } i.icon.gem.outline::before { content: "\f3a5"; } i.icon.grimace.outline::before { content: "\f57f"; } i.icon.grin.alternate.outline::before { content: "\f581"; } i.icon.grin.beam.outline::before { content: "\f582"; } i.icon.grin.beam.sweat.outline::before { content: "\f583"; } i.icon.grin.hearts.outline::before { content: "\f584"; } i.icon.grin.outline::before { content: "\f580"; } i.icon.grin.squint.outline::before { content: "\f585"; } i.icon.grin.squint.tears.outline::before { content: "\f586"; } i.icon.grin.stars.outline::before { content: "\f587"; } i.icon.grin.tears.outline::before { content: "\f588"; } i.icon.grin.tongue.outline::before { content: "\f589"; } i.icon.grin.tongue.squint.outline::before { content: "\f58a"; } i.icon.grin.tongue.wink.outline::before { content: "\f58b"; } i.icon.grin.wink.outline::before { content: "\f58c"; } i.icon.hand.lizard.outline::before { content: "\f258"; } i.icon.hand.paper.outline::before { content: "\f256"; } i.icon.hand.peace.outline::before { content: "\f25b"; } i.icon.hand.point.down.outline::before { content: "\f0a7"; } i.icon.hand.point.left.outline::before { content: "\f0a5"; } i.icon.hand.point.right.outline::before { content: "\f0a4"; } i.icon.hand.point.up.outline::before { content: "\f0a6"; } i.icon.hand.pointer.outline::before { content: "\f25a"; } i.icon.hand.rock.outline::before { content: "\f255"; } i.icon.hand.scissors.outline::before { content: "\f257"; } i.icon.hand.spock.outline::before { content: "\f259"; } i.icon.handshake.outline::before { content: "\f2b5"; } i.icon.hdd.outline::before { content: "\f0a0"; } i.icon.heart.outline::before { content: "\f004"; } i.icon.hospital.outline::before { content: "\f0f8"; } i.icon.hourglass.outline::before { content: "\f254"; } i.icon.id.badge.outline::before { content: "\f2c1"; } i.icon.id.card.outline::before { content: "\f2c2"; } i.icon.image.outline::before { content: "\f03e"; } i.icon.images.outline::before { content: "\f302"; } i.icon.keyboard.outline::before { content: "\f11c"; } i.icon.kiss.beam.outline::before { content: "\f597"; } i.icon.kiss.outline::before { content: "\f596"; } i.icon.kiss.wink.heart.outline::before { content: "\f598"; } i.icon.laugh.beam.outline::before { content: "\f59a"; } i.icon.laugh.outline::before { content: "\f599"; } i.icon.laugh.squint.outline::before { content: "\f59b"; } i.icon.laugh.wink.outline::before { content: "\f59c"; } i.icon.lemon.outline::before { content: "\f094"; } i.icon.life.ring.outline::before { content: "\f1cd"; } i.icon.lightbulb.outline::before { content: "\f0eb"; } i.icon.list.alternate.outline::before { content: "\f022"; } i.icon.map.outline::before { content: "\f279"; } i.icon.meh.blank.outline::before { content: "\f5a4"; } i.icon.meh.outline::before { content: "\f11a"; } i.icon.meh.rolling.eyes.outline::before { content: "\f5a5"; } i.icon.minus.square.outline::before { content: "\f146"; } i.icon.money.bill.alternate.outline::before { content: "\f3d1"; } i.icon.moon.outline::before { content: "\f186"; } i.icon.newspaper.outline::before { content: "\f1ea"; } i.icon.object.group.outline::before { content: "\f247"; } i.icon.object.ungroup.outline::before { content: "\f248"; } i.icon.paper.plane.outline::before { content: "\f1d8"; } i.icon.pause.circle.outline::before { content: "\f28b"; } i.icon.play.circle.outline::before { content: "\f144"; } i.icon.plus.square.outline::before { content: "\f0fe"; } i.icon.question.circle.outline::before { content: "\f059"; } i.icon.registered.outline::before { content: "\f25d"; } i.icon.sad.cry.outline::before { content: "\f5b3"; } i.icon.sad.tear.outline::before { content: "\f5b4"; } i.icon.save.outline::before { content: "\f0c7"; } i.icon.share.square.outline::before { content: "\f14d"; } i.icon.smile.beam.outline::before { content: "\f5b8"; } i.icon.smile.outline::before { content: "\f118"; } i.icon.smile.wink.outline::before { content: "\f4da"; } i.icon.snowflake.outline::before { content: "\f2dc"; } i.icon.square.outline::before { content: "\f0c8"; } i.icon.star.half.outline::before { content: "\f089"; } i.icon.star.outline::before { content: "\f005"; } i.icon.sticky.note.outline::before { content: "\f249"; } i.icon.stop.circle.outline::before { content: "\f28d"; } i.icon.sun.outline::before { content: "\f185"; } i.icon.surprise.outline::before { content: "\f5c2"; } i.icon.thumbs.down.outline::before { content: "\f165"; } i.icon.thumbs.up.outline::before { content: "\f164"; } i.icon.times.circle.outline::before { content: "\f057"; } i.icon.tired.outline::before { content: "\f5c8"; } i.icon.trash.alternate.outline::before { content: "\f2ed"; } i.icon.user.circle.outline::before { content: "\f2bd"; } i.icon.user.outline::before { content: "\f007"; } i.icon.window.close.outline::before { content: "\f410"; } i.icon.window.maximize.outline::before { content: "\f2d0"; } i.icon.window.minimize.outline::before { content: "\f2d1"; } i.icon.window.restore.outline::before { content: "\f2d2"; } /* Aliases */ /******************************* Brand Icons *******************************/ /* Icons */ i.icon.\35 00px::before { content: "\f26e"; font-family: "brand-icons"; } i.icon.accessible::before { content: "\f368"; font-family: "brand-icons"; } i.icon.accusoft::before { content: "\f369"; font-family: "brand-icons"; } i.icon.acquisitions.incorporated::before { content: "\f6af"; font-family: "brand-icons"; } i.icon.adn::before { content: "\f170"; font-family: "brand-icons"; } i.icon.adversal::before { content: "\f36a"; font-family: "brand-icons"; } i.icon.affiliatetheme::before { content: "\f36b"; font-family: "brand-icons"; } i.icon.airbnb::before { content: "\f834"; font-family: "brand-icons"; } i.icon.algolia::before { content: "\f36c"; font-family: "brand-icons"; } i.icon.alipay::before { content: "\f642"; font-family: "brand-icons"; } i.icon.amazon::before { content: "\f270"; font-family: "brand-icons"; } i.icon.amazon.pay::before { content: "\f42c"; font-family: "brand-icons"; } i.icon.amilia::before { content: "\f36d"; font-family: "brand-icons"; } i.icon.android::before { content: "\f17b"; font-family: "brand-icons"; } i.icon.angellist::before { content: "\f209"; font-family: "brand-icons"; } i.icon.angrycreative::before { content: "\f36e"; font-family: "brand-icons"; } i.icon.angular::before { content: "\f420"; font-family: "brand-icons"; } i.icon.app.store::before { content: "\f36f"; font-family: "brand-icons"; } i.icon.app.store.ios::before { content: "\f370"; font-family: "brand-icons"; } i.icon.apper::before { content: "\f371"; font-family: "brand-icons"; } i.icon.apple::before { content: "\f179"; font-family: "brand-icons"; } i.icon.apple.pay::before { content: "\f415"; font-family: "brand-icons"; } i.icon.artstation::before { content: "\f77a"; font-family: "brand-icons"; } i.icon.asymmetrik::before { content: "\f372"; font-family: "brand-icons"; } i.icon.atlassian::before { content: "\f77b"; font-family: "brand-icons"; } i.icon.audible::before { content: "\f373"; font-family: "brand-icons"; } i.icon.autoprefixer::before { content: "\f41c"; font-family: "brand-icons"; } i.icon.avianex::before { content: "\f374"; font-family: "brand-icons"; } i.icon.aviato::before { content: "\f421"; font-family: "brand-icons"; } i.icon.aws::before { content: "\f375"; font-family: "brand-icons"; } i.icon.bandcamp::before { content: "\f2d5"; font-family: "brand-icons"; } i.icon.battle.net::before { content: "\f835"; font-family: "brand-icons"; } i.icon.behance::before { content: "\f1b4"; font-family: "brand-icons"; } i.icon.behance.square::before { content: "\f1b5"; font-family: "brand-icons"; } i.icon.bimobject::before { content: "\f378"; font-family: "brand-icons"; } i.icon.bitbucket::before { content: "\f171"; font-family: "brand-icons"; } i.icon.bitcoin::before { content: "\f379"; font-family: "brand-icons"; } i.icon.bity::before { content: "\f37a"; font-family: "brand-icons"; } i.icon.black.tie::before { content: "\f27e"; font-family: "brand-icons"; } i.icon.blackberry::before { content: "\f37b"; font-family: "brand-icons"; } i.icon.blogger::before { content: "\f37c"; font-family: "brand-icons"; } i.icon.blogger.b::before { content: "\f37d"; font-family: "brand-icons"; } i.icon.bluetooth::before { content: "\f293"; font-family: "brand-icons"; } i.icon.bluetooth.b::before { content: "\f294"; font-family: "brand-icons"; } i.icon.bootstrap::before { content: "\f836"; font-family: "brand-icons"; } i.icon.btc::before { content: "\f15a"; font-family: "brand-icons"; } i.icon.buffer::before { content: "\f837"; font-family: "brand-icons"; } i.icon.buromobelexperte::before { content: "\f37f"; font-family: "brand-icons"; } i.icon.buy.n.large::before { content: "\f8a6"; font-family: "brand-icons"; } i.icon.buysellads::before { content: "\f20d"; font-family: "brand-icons"; } i.icon.canadian.maple.leaf::before { content: "\f785"; font-family: "brand-icons"; } i.icon.cc.amazon.pay::before { content: "\f42d"; font-family: "brand-icons"; } i.icon.cc.amex::before { content: "\f1f3"; font-family: "brand-icons"; } i.icon.cc.apple.pay::before { content: "\f416"; font-family: "brand-icons"; } i.icon.cc.diners.club::before { content: "\f24c"; font-family: "brand-icons"; } i.icon.cc.discover::before { content: "\f1f2"; font-family: "brand-icons"; } i.icon.cc.jcb::before { content: "\f24b"; font-family: "brand-icons"; } i.icon.cc.mastercard::before { content: "\f1f1"; font-family: "brand-icons"; } i.icon.cc.paypal::before { content: "\f1f4"; font-family: "brand-icons"; } i.icon.cc.stripe::before { content: "\f1f5"; font-family: "brand-icons"; } i.icon.cc.visa::before { content: "\f1f0"; font-family: "brand-icons"; } i.icon.centercode::before { content: "\f380"; font-family: "brand-icons"; } i.icon.centos::before { content: "\f789"; font-family: "brand-icons"; } i.icon.chrome::before { content: "\f268"; font-family: "brand-icons"; } i.icon.chromecast::before { content: "\f838"; font-family: "brand-icons"; } i.icon.cloudflare::before { content: "\e07d"; font-family: "brand-icons"; } i.icon.cloudscale::before { content: "\f383"; font-family: "brand-icons"; } i.icon.cloudsmith::before { content: "\f384"; font-family: "brand-icons"; } i.icon.cloudversify::before { content: "\f385"; font-family: "brand-icons"; } i.icon.codepen::before { content: "\f1cb"; font-family: "brand-icons"; } i.icon.codiepie::before { content: "\f284"; font-family: "brand-icons"; } i.icon.confluence::before { content: "\f78d"; font-family: "brand-icons"; } i.icon.connectdevelop::before { content: "\f20e"; font-family: "brand-icons"; } i.icon.contao::before { content: "\f26d"; font-family: "brand-icons"; } i.icon.cotton.bureau::before { content: "\f89e"; font-family: "brand-icons"; } i.icon.cpanel::before { content: "\f388"; font-family: "brand-icons"; } i.icon.creative.commons::before { content: "\f25e"; font-family: "brand-icons"; } i.icon.creative.commons.by::before { content: "\f4e7"; font-family: "brand-icons"; } i.icon.creative.commons.nc::before { content: "\f4e8"; font-family: "brand-icons"; } i.icon.creative.commons.nc.eu::before { content: "\f4e9"; font-family: "brand-icons"; } i.icon.creative.commons.nc.jp::before { content: "\f4ea"; font-family: "brand-icons"; } i.icon.creative.commons.nd::before { content: "\f4eb"; font-family: "brand-icons"; } i.icon.creative.commons.pd::before { content: "\f4ec"; font-family: "brand-icons"; } i.icon.creative.commons.pd.alternate::before { content: "\f4ed"; font-family: "brand-icons"; } i.icon.creative.commons.remix::before { content: "\f4ee"; font-family: "brand-icons"; } i.icon.creative.commons.sa::before { content: "\f4ef"; font-family: "brand-icons"; } i.icon.creative.commons.sampling::before { content: "\f4f0"; font-family: "brand-icons"; } i.icon.creative.commons.sampling.plus::before { content: "\f4f1"; font-family: "brand-icons"; } i.icon.creative.commons.share::before { content: "\f4f2"; font-family: "brand-icons"; } i.icon.creative.commons.zero::before { content: "\f4f3"; font-family: "brand-icons"; } i.icon.critical.role::before { content: "\f6c9"; font-family: "brand-icons"; } i.icon.css3::before { content: "\f13c"; font-family: "brand-icons"; } i.icon.css3.alternate::before { content: "\f38b"; font-family: "brand-icons"; } i.icon.cuttlefish::before { content: "\f38c"; font-family: "brand-icons"; } i.icon.d.and.d::before { content: "\f38d"; font-family: "brand-icons"; } i.icon.d.and.d.beyond::before { content: "\f6ca"; font-family: "brand-icons"; } i.icon.dailymotion::before { content: "\e052"; font-family: "brand-icons"; } i.icon.dashcube::before { content: "\f210"; font-family: "brand-icons"; } i.icon.deezer::before { content: "\e077"; font-family: "brand-icons"; } i.icon.delicious::before { content: "\f1a5"; font-family: "brand-icons"; } i.icon.deploydog::before { content: "\f38e"; font-family: "brand-icons"; } i.icon.deskpro::before { content: "\f38f"; font-family: "brand-icons"; } i.icon.dev::before { content: "\f6cc"; font-family: "brand-icons"; } i.icon.deviantart::before { content: "\f1bd"; font-family: "brand-icons"; } i.icon.dhl::before { content: "\f790"; font-family: "brand-icons"; } i.icon.diaspora::before { content: "\f791"; font-family: "brand-icons"; } i.icon.digg::before { content: "\f1a6"; font-family: "brand-icons"; } i.icon.digital.ocean::before { content: "\f391"; font-family: "brand-icons"; } i.icon.discord::before { content: "\f392"; font-family: "brand-icons"; } i.icon.discourse::before { content: "\f393"; font-family: "brand-icons"; } i.icon.dochub::before { content: "\f394"; font-family: "brand-icons"; } i.icon.docker::before { content: "\f395"; font-family: "brand-icons"; } i.icon.draft2digital::before { content: "\f396"; font-family: "brand-icons"; } i.icon.dribbble::before { content: "\f17d"; font-family: "brand-icons"; } i.icon.dribbble.square::before { content: "\f397"; font-family: "brand-icons"; } i.icon.dropbox::before { content: "\f16b"; font-family: "brand-icons"; } i.icon.drupal::before { content: "\f1a9"; font-family: "brand-icons"; } i.icon.dyalog::before { content: "\f399"; font-family: "brand-icons"; } i.icon.earlybirds::before { content: "\f39a"; font-family: "brand-icons"; } i.icon.ebay::before { content: "\f4f4"; font-family: "brand-icons"; } i.icon.edge::before { content: "\f282"; font-family: "brand-icons"; } i.icon.edge.legacy::before { content: "\e078"; font-family: "brand-icons"; } i.icon.elementor::before { content: "\f430"; font-family: "brand-icons"; } i.icon.ello::before { content: "\f5f1"; font-family: "brand-icons"; } i.icon.ember::before { content: "\f423"; font-family: "brand-icons"; } i.icon.empire::before { content: "\f1d1"; font-family: "brand-icons"; } i.icon.envira::before { content: "\f299"; font-family: "brand-icons"; } i.icon.erlang::before { content: "\f39d"; font-family: "brand-icons"; } i.icon.ethereum::before { content: "\f42e"; font-family: "brand-icons"; } i.icon.etsy::before { content: "\f2d7"; font-family: "brand-icons"; } i.icon.evernote::before { content: "\f839"; font-family: "brand-icons"; } i.icon.expeditedssl::before { content: "\f23e"; font-family: "brand-icons"; } i.icon.facebook::before { content: "\f09a"; font-family: "brand-icons"; } i.icon.facebook.f::before { content: "\f39e"; font-family: "brand-icons"; } i.icon.facebook.messenger::before { content: "\f39f"; font-family: "brand-icons"; } i.icon.facebook.square::before { content: "\f082"; font-family: "brand-icons"; } i.icon.fantasy.flight.games::before { content: "\f6dc"; font-family: "brand-icons"; } i.icon.fedex::before { content: "\f797"; font-family: "brand-icons"; } i.icon.fedora::before { content: "\f798"; font-family: "brand-icons"; } i.icon.figma::before { content: "\f799"; font-family: "brand-icons"; } i.icon.firefox::before { content: "\f269"; font-family: "brand-icons"; } i.icon.firefox.browser::before { content: "\e007"; font-family: "brand-icons"; } i.icon.first.order::before { content: "\f2b0"; font-family: "brand-icons"; } i.icon.first.order.alternate::before { content: "\f50a"; font-family: "brand-icons"; } i.icon.firstdraft::before { content: "\f3a1"; font-family: "brand-icons"; } i.icon.flickr::before { content: "\f16e"; font-family: "brand-icons"; } i.icon.flipboard::before { content: "\f44d"; font-family: "brand-icons"; } i.icon.fly::before { content: "\f417"; font-family: "brand-icons"; } i.icon.font.awesome::before { content: "\f2b4"; font-family: "brand-icons"; } i.icon.font.awesome.alternate::before { content: "\f35c"; font-family: "brand-icons"; } i.icon.font.awesome.flag::before { content: "\f425"; font-family: "brand-icons"; } i.icon.fonticons::before { content: "\f280"; font-family: "brand-icons"; } i.icon.fonticons.fi::before { content: "\f3a2"; font-family: "brand-icons"; } i.icon.fort.awesome::before { content: "\f286"; font-family: "brand-icons"; } i.icon.fort.awesome.alternate::before { content: "\f3a3"; font-family: "brand-icons"; } i.icon.forumbee::before { content: "\f211"; font-family: "brand-icons"; } i.icon.foursquare::before { content: "\f180"; font-family: "brand-icons"; } i.icon.free.code.camp::before { content: "\f2c5"; font-family: "brand-icons"; } i.icon.freebsd::before { content: "\f3a4"; font-family: "brand-icons"; } i.icon.fulcrum::before { content: "\f50b"; font-family: "brand-icons"; } i.icon.galactic.republic::before { content: "\f50c"; font-family: "brand-icons"; } i.icon.galactic.senate::before { content: "\f50d"; font-family: "brand-icons"; } i.icon.get.pocket::before { content: "\f265"; font-family: "brand-icons"; } i.icon.gg::before { content: "\f260"; font-family: "brand-icons"; } i.icon.gg.circle::before { content: "\f261"; font-family: "brand-icons"; } i.icon.git::before { content: "\f1d3"; font-family: "brand-icons"; } i.icon.git.alternate::before { content: "\f841"; font-family: "brand-icons"; } i.icon.git.square::before { content: "\f1d2"; font-family: "brand-icons"; } i.icon.github::before { content: "\f09b"; font-family: "brand-icons"; } i.icon.github.alternate::before { content: "\f113"; font-family: "brand-icons"; } i.icon.github.square::before { content: "\f092"; font-family: "brand-icons"; } i.icon.gitkraken::before { content: "\f3a6"; font-family: "brand-icons"; } i.icon.gitlab::before { content: "\f296"; font-family: "brand-icons"; } i.icon.gitter::before { content: "\f426"; font-family: "brand-icons"; } i.icon.glide::before { content: "\f2a5"; font-family: "brand-icons"; } i.icon.glide.g::before { content: "\f2a6"; font-family: "brand-icons"; } i.icon.gofore::before { content: "\f3a7"; font-family: "brand-icons"; } i.icon.goodreads::before { content: "\f3a8"; font-family: "brand-icons"; } i.icon.goodreads.g::before { content: "\f3a9"; font-family: "brand-icons"; } i.icon.google::before { content: "\f1a0"; font-family: "brand-icons"; } i.icon.google.drive::before { content: "\f3aa"; font-family: "brand-icons"; } i.icon.google.pay::before { content: "\e079"; font-family: "brand-icons"; } i.icon.google.play::before { content: "\f3ab"; font-family: "brand-icons"; } i.icon.google.plus::before { content: "\f2b3"; font-family: "brand-icons"; } i.icon.google.plus.g::before { content: "\f0d5"; font-family: "brand-icons"; } i.icon.google.plus.square::before { content: "\f0d4"; font-family: "brand-icons"; } i.icon.google.wallet::before { content: "\f1ee"; font-family: "brand-icons"; } i.icon.gratipay::before { content: "\f184"; font-family: "brand-icons"; } i.icon.grav::before { content: "\f2d6"; font-family: "brand-icons"; } i.icon.gripfire::before { content: "\f3ac"; font-family: "brand-icons"; } i.icon.grunt::before { content: "\f3ad"; font-family: "brand-icons"; } i.icon.guilded::before { content: "\e07e"; font-family: "brand-icons"; } i.icon.gulp::before { content: "\f3ae"; font-family: "brand-icons"; } i.icon.hacker.news::before { content: "\f1d4"; font-family: "brand-icons"; } i.icon.hacker.news.square::before { content: "\f3af"; font-family: "brand-icons"; } i.icon.hackerrank::before { content: "\f5f7"; font-family: "brand-icons"; } i.icon.hips::before { content: "\f452"; font-family: "brand-icons"; } i.icon.hire.a.helper::before { content: "\f3b0"; font-family: "brand-icons"; } i.icon.hive::before { content: "\e07f"; font-family: "brand-icons"; } i.icon.hooli::before { content: "\f427"; font-family: "brand-icons"; } i.icon.hornbill::before { content: "\f592"; font-family: "brand-icons"; } i.icon.hotjar::before { content: "\f3b1"; font-family: "brand-icons"; } i.icon.houzz::before { content: "\f27c"; font-family: "brand-icons"; } i.icon.html5::before { content: "\f13b"; font-family: "brand-icons"; } i.icon.hubspot::before { content: "\f3b2"; font-family: "brand-icons"; } i.icon.ideal::before { content: "\e013"; font-family: "brand-icons"; } i.icon.imdb::before { content: "\f2d8"; font-family: "brand-icons"; } i.icon.innosoft::before { content: "\e080"; font-family: "brand-icons"; } i.icon.instagram::before { content: "\f16d"; font-family: "brand-icons"; } i.icon.instagram.square::before { content: "\e055"; font-family: "brand-icons"; } i.icon.instalod::before { content: "\e081"; font-family: "brand-icons"; } i.icon.intercom::before { content: "\f7af"; font-family: "brand-icons"; } i.icon.internet.explorer::before { content: "\f26b"; font-family: "brand-icons"; } i.icon.invision::before { content: "\f7b0"; font-family: "brand-icons"; } i.icon.ioxhost::before { content: "\f208"; font-family: "brand-icons"; } i.icon.itch.io::before { content: "\f83a"; font-family: "brand-icons"; } i.icon.itunes::before { content: "\f3b4"; font-family: "brand-icons"; } i.icon.itunes.note::before { content: "\f3b5"; font-family: "brand-icons"; } i.icon.java::before { content: "\f4e4"; font-family: "brand-icons"; } i.icon.jedi.order::before { content: "\f50e"; font-family: "brand-icons"; } i.icon.jenkins::before { content: "\f3b6"; font-family: "brand-icons"; } i.icon.jira::before { content: "\f7b1"; font-family: "brand-icons"; } i.icon.joget::before { content: "\f3b7"; font-family: "brand-icons"; } i.icon.joomla::before { content: "\f1aa"; font-family: "brand-icons"; } i.icon.js::before { content: "\f3b8"; font-family: "brand-icons"; } i.icon.js.square::before { content: "\f3b9"; font-family: "brand-icons"; } i.icon.jsfiddle::before { content: "\f1cc"; font-family: "brand-icons"; } i.icon.kaggle::before { content: "\f5fa"; font-family: "brand-icons"; } i.icon.keybase::before { content: "\f4f5"; font-family: "brand-icons"; } i.icon.keycdn::before { content: "\f3ba"; font-family: "brand-icons"; } i.icon.kickstarter::before { content: "\f3bb"; font-family: "brand-icons"; } i.icon.kickstarter.k::before { content: "\f3bc"; font-family: "brand-icons"; } i.icon.korvue::before { content: "\f42f"; font-family: "brand-icons"; } i.icon.laravel::before { content: "\f3bd"; font-family: "brand-icons"; } i.icon.lastfm::before { content: "\f202"; font-family: "brand-icons"; } i.icon.lastfm.square::before { content: "\f203"; font-family: "brand-icons"; } i.icon.leanpub::before { content: "\f212"; font-family: "brand-icons"; } i.icon.lesscss::before { content: "\f41d"; font-family: "brand-icons"; } i.icon.linechat::before { content: "\f3c0"; font-family: "brand-icons"; } i.icon.linkedin::before { content: "\f08c"; font-family: "brand-icons"; } i.icon.linode::before { content: "\f2b8"; font-family: "brand-icons"; } i.icon.linux::before { content: "\f17c"; font-family: "brand-icons"; } i.icon.lyft::before { content: "\f3c3"; font-family: "brand-icons"; } i.icon.magento::before { content: "\f3c4"; font-family: "brand-icons"; } i.icon.mailchimp::before { content: "\f59e"; font-family: "brand-icons"; } i.icon.mandalorian::before { content: "\f50f"; font-family: "brand-icons"; } i.icon.markdown::before { content: "\f60f"; font-family: "brand-icons"; } i.icon.mastodon::before { content: "\f4f6"; font-family: "brand-icons"; } i.icon.maxcdn::before { content: "\f136"; font-family: "brand-icons"; } i.icon.mdb::before { content: "\f8ca"; font-family: "brand-icons"; } i.icon.medapps::before { content: "\f3c6"; font-family: "brand-icons"; } i.icon.medium::before { content: "\f23a"; font-family: "brand-icons"; } i.icon.medium.m::before { content: "\f3c7"; font-family: "brand-icons"; } i.icon.medrt::before { content: "\f3c8"; font-family: "brand-icons"; } i.icon.meetup::before { content: "\f2e0"; font-family: "brand-icons"; } i.icon.megaport::before { content: "\f5a3"; font-family: "brand-icons"; } i.icon.mendeley::before { content: "\f7b3"; font-family: "brand-icons"; } i.icon.microblog::before { content: "\e01a"; font-family: "brand-icons"; } i.icon.microsoft::before { content: "\f3ca"; font-family: "brand-icons"; } i.icon.mix::before { content: "\f3cb"; font-family: "brand-icons"; } i.icon.mixcloud::before { content: "\f289"; font-family: "brand-icons"; } i.icon.mixer::before { content: "\e056"; font-family: "brand-icons"; } i.icon.mizuni::before { content: "\f3cc"; font-family: "brand-icons"; } i.icon.modx::before { content: "\f285"; font-family: "brand-icons"; } i.icon.monero::before { content: "\f3d0"; font-family: "brand-icons"; } i.icon.napster::before { content: "\f3d2"; font-family: "brand-icons"; } i.icon.neos::before { content: "\f612"; font-family: "brand-icons"; } i.icon.nimblr::before { content: "\f5a8"; font-family: "brand-icons"; } i.icon.node::before { content: "\f419"; font-family: "brand-icons"; } i.icon.node.js::before { content: "\f3d3"; font-family: "brand-icons"; } i.icon.npm::before { content: "\f3d4"; font-family: "brand-icons"; } i.icon.ns8::before { content: "\f3d5"; font-family: "brand-icons"; } i.icon.nutritionix::before { content: "\f3d6"; font-family: "brand-icons"; } i.icon.octopus.deploy::before { content: "\e082"; font-family: "brand-icons"; } i.icon.odnoklassniki::before { content: "\f263"; font-family: "brand-icons"; } i.icon.odnoklassniki.square::before { content: "\f264"; font-family: "brand-icons"; } i.icon.old.republic::before { content: "\f510"; font-family: "brand-icons"; } i.icon.opencart::before { content: "\f23d"; font-family: "brand-icons"; } i.icon.openid::before { content: "\f19b"; font-family: "brand-icons"; } i.icon.opera::before { content: "\f26a"; font-family: "brand-icons"; } i.icon.optin.monster::before { content: "\f23c"; font-family: "brand-icons"; } i.icon.orcid::before { content: "\f8d2"; font-family: "brand-icons"; } i.icon.osi::before { content: "\f41a"; font-family: "brand-icons"; } i.icon.page4::before { content: "\f3d7"; font-family: "brand-icons"; } i.icon.pagelines::before { content: "\f18c"; font-family: "brand-icons"; } i.icon.palfed::before { content: "\f3d8"; font-family: "brand-icons"; } i.icon.patreon::before { content: "\f3d9"; font-family: "brand-icons"; } i.icon.paypal::before { content: "\f1ed"; font-family: "brand-icons"; } i.icon.penny.arcade::before { content: "\f704"; font-family: "brand-icons"; } i.icon.perbyte::before { content: "\e083"; font-family: "brand-icons"; } i.icon.periscope::before { content: "\f3da"; font-family: "brand-icons"; } i.icon.phabricator::before { content: "\f3db"; font-family: "brand-icons"; } i.icon.phoenix.framework::before { content: "\f3dc"; font-family: "brand-icons"; } i.icon.phoenix.squadron::before { content: "\f511"; font-family: "brand-icons"; } i.icon.php::before { content: "\f457"; font-family: "brand-icons"; } i.icon.pied.piper::before { content: "\f2ae"; font-family: "brand-icons"; } i.icon.pied.piper.alternate::before { content: "\f1a8"; font-family: "brand-icons"; } i.icon.pied.piper.hat::before { content: "\f4e5"; font-family: "brand-icons"; } i.icon.pied.piper.pp::before { content: "\f1a7"; font-family: "brand-icons"; } i.icon.pied.piper.square::before { content: "\e01e"; font-family: "brand-icons"; } i.icon.pinterest::before { content: "\f0d2"; font-family: "brand-icons"; } i.icon.pinterest.p::before { content: "\f231"; font-family: "brand-icons"; } i.icon.pinterest.square::before { content: "\f0d3"; font-family: "brand-icons"; } i.icon.playstation::before { content: "\f3df"; font-family: "brand-icons"; } i.icon.product.hunt::before { content: "\f288"; font-family: "brand-icons"; } i.icon.pushed::before { content: "\f3e1"; font-family: "brand-icons"; } i.icon.python::before { content: "\f3e2"; font-family: "brand-icons"; } i.icon.qq::before { content: "\f1d6"; font-family: "brand-icons"; } i.icon.quinscape::before { content: "\f459"; font-family: "brand-icons"; } i.icon.quora::before { content: "\f2c4"; font-family: "brand-icons"; } i.icon.r.project::before { content: "\f4f7"; font-family: "brand-icons"; } i.icon.raspberry.pi::before { content: "\f7bb"; font-family: "brand-icons"; } i.icon.ravelry::before { content: "\f2d9"; font-family: "brand-icons"; } i.icon.react::before { content: "\f41b"; font-family: "brand-icons"; } i.icon.reacteurope::before { content: "\f75d"; font-family: "brand-icons"; } i.icon.readme::before { content: "\f4d5"; font-family: "brand-icons"; } i.icon.rebel::before { content: "\f1d0"; font-family: "brand-icons"; } i.icon.reddit::before { content: "\f1a1"; font-family: "brand-icons"; } i.icon.reddit.alien::before { content: "\f281"; font-family: "brand-icons"; } i.icon.reddit.square::before { content: "\f1a2"; font-family: "brand-icons"; } i.icon.redhat::before { content: "\f7bc"; font-family: "brand-icons"; } i.icon.redriver::before { content: "\f3e3"; font-family: "brand-icons"; } i.icon.redyeti::before { content: "\f69d"; font-family: "brand-icons"; } i.icon.renren::before { content: "\f18b"; font-family: "brand-icons"; } i.icon.replyd::before { content: "\f3e6"; font-family: "brand-icons"; } i.icon.researchgate::before { content: "\f4f8"; font-family: "brand-icons"; } i.icon.resolving::before { content: "\f3e7"; font-family: "brand-icons"; } i.icon.rev::before { content: "\f5b2"; font-family: "brand-icons"; } i.icon.rocketchat::before { content: "\f3e8"; font-family: "brand-icons"; } i.icon.rockrms::before { content: "\f3e9"; font-family: "brand-icons"; } i.icon.rust::before { content: "\e07a"; font-family: "brand-icons"; } i.icon.safari::before { content: "\f267"; font-family: "brand-icons"; } i.icon.salesforce::before { content: "\f83b"; font-family: "brand-icons"; } i.icon.sass::before { content: "\f41e"; font-family: "brand-icons"; } i.icon.schlix::before { content: "\f3ea"; font-family: "brand-icons"; } i.icon.scribd::before { content: "\f28a"; font-family: "brand-icons"; } i.icon.searchengin::before { content: "\f3eb"; font-family: "brand-icons"; } i.icon.sellcast::before { content: "\f2da"; font-family: "brand-icons"; } i.icon.sellsy::before { content: "\f213"; font-family: "brand-icons"; } i.icon.servicestack::before { content: "\f3ec"; font-family: "brand-icons"; } i.icon.shirtsinbulk::before { content: "\f214"; font-family: "brand-icons"; } i.icon.shopify::before { content: "\e057"; font-family: "brand-icons"; } i.icon.shopware::before { content: "\f5b5"; font-family: "brand-icons"; } i.icon.simplybuilt::before { content: "\f215"; font-family: "brand-icons"; } i.icon.sistrix::before { content: "\f3ee"; font-family: "brand-icons"; } i.icon.sith::before { content: "\f512"; font-family: "brand-icons"; } i.icon.sketch::before { content: "\f7c6"; font-family: "brand-icons"; } i.icon.skyatlas::before { content: "\f216"; font-family: "brand-icons"; } i.icon.skype::before { content: "\f17e"; font-family: "brand-icons"; } i.icon.slack::before { content: "\f198"; font-family: "brand-icons"; } i.icon.slack.hash::before { content: "\f3ef"; font-family: "brand-icons"; } i.icon.slideshare::before { content: "\f1e7"; font-family: "brand-icons"; } i.icon.snapchat::before { content: "\f2ab"; font-family: "brand-icons"; } i.icon.snapchat.ghost::before { content: "\f2ac"; font-family: "brand-icons"; } i.icon.snapchat.square::before { content: "\f2ad"; font-family: "brand-icons"; } i.icon.soundcloud::before { content: "\f1be"; font-family: "brand-icons"; } i.icon.sourcetree::before { content: "\f7d3"; font-family: "brand-icons"; } i.icon.speakap::before { content: "\f3f3"; font-family: "brand-icons"; } i.icon.speaker.deck::before { content: "\f83c"; font-family: "brand-icons"; } i.icon.spotify::before { content: "\f1bc"; font-family: "brand-icons"; } i.icon.squarespace::before { content: "\f5be"; font-family: "brand-icons"; } i.icon.stack.exchange::before { content: "\f18d"; font-family: "brand-icons"; } i.icon.stack.overflow::before { content: "\f16c"; font-family: "brand-icons"; } i.icon.stackpath::before { content: "\f842"; font-family: "brand-icons"; } i.icon.staylinked::before { content: "\f3f5"; font-family: "brand-icons"; } i.icon.steam::before { content: "\f1b6"; font-family: "brand-icons"; } i.icon.steam.square::before { content: "\f1b7"; font-family: "brand-icons"; } i.icon.steam.symbol::before { content: "\f3f6"; font-family: "brand-icons"; } i.icon.sticker.mule::before { content: "\f3f7"; font-family: "brand-icons"; } i.icon.strava::before { content: "\f428"; font-family: "brand-icons"; } i.icon.stripe::before { content: "\f429"; font-family: "brand-icons"; } i.icon.stripe.s::before { content: "\f42a"; font-family: "brand-icons"; } i.icon.studiovinari::before { content: "\f3f8"; font-family: "brand-icons"; } i.icon.stumbleupon::before { content: "\f1a4"; font-family: "brand-icons"; } i.icon.stumbleupon.circle::before { content: "\f1a3"; font-family: "brand-icons"; } i.icon.superpowers::before { content: "\f2dd"; font-family: "brand-icons"; } i.icon.supple::before { content: "\f3f9"; font-family: "brand-icons"; } i.icon.suse::before { content: "\f7d6"; font-family: "brand-icons"; } i.icon.swift::before { content: "\f8e1"; font-family: "brand-icons"; } i.icon.symfony::before { content: "\f83d"; font-family: "brand-icons"; } i.icon.teamspeak::before { content: "\f4f9"; font-family: "brand-icons"; } i.icon.telegram::before { content: "\f2c6"; font-family: "brand-icons"; } i.icon.telegram.plane::before { content: "\f3fe"; font-family: "brand-icons"; } i.icon.tencent.weibo::before { content: "\f1d5"; font-family: "brand-icons"; } i.icon.themeco::before { content: "\f5c6"; font-family: "brand-icons"; } i.icon.themeisle::before { content: "\f2b2"; font-family: "brand-icons"; } i.icon.think.peaks::before { content: "\f731"; font-family: "brand-icons"; } i.icon.tiktok::before { content: "\e07b"; font-family: "brand-icons"; } i.icon.trade.federation::before { content: "\f513"; font-family: "brand-icons"; } i.icon.trello::before { content: "\f181"; font-family: "brand-icons"; } i.icon.tumblr::before { content: "\f173"; font-family: "brand-icons"; } i.icon.tumblr.square::before { content: "\f174"; font-family: "brand-icons"; } i.icon.twitch::before { content: "\f1e8"; font-family: "brand-icons"; } i.icon.twitter::before { content: "\f099"; font-family: "brand-icons"; } i.icon.twitter.square::before { content: "\f081"; font-family: "brand-icons"; } i.icon.typo3::before { content: "\f42b"; font-family: "brand-icons"; } i.icon.uber::before { content: "\f402"; font-family: "brand-icons"; } i.icon.ubuntu::before { content: "\f7df"; font-family: "brand-icons"; } i.icon.uikit::before { content: "\f403"; font-family: "brand-icons"; } i.icon.umbraco::before { content: "\f8e8"; font-family: "brand-icons"; } i.icon.uncharted::before { content: "\e084"; font-family: "brand-icons"; } i.icon.uniregistry::before { content: "\f404"; font-family: "brand-icons"; } i.icon.unity::before { content: "\e049"; font-family: "brand-icons"; } i.icon.unsplash::before { content: "\e07c"; font-family: "brand-icons"; } i.icon.untappd::before { content: "\f405"; font-family: "brand-icons"; } i.icon.ups::before { content: "\f7e0"; font-family: "brand-icons"; } i.icon.usb::before { content: "\f287"; font-family: "brand-icons"; } i.icon.usps::before { content: "\f7e1"; font-family: "brand-icons"; } i.icon.ussunnah::before { content: "\f407"; font-family: "brand-icons"; } i.icon.vaadin::before { content: "\f408"; font-family: "brand-icons"; } i.icon.viacoin::before { content: "\f237"; font-family: "brand-icons"; } i.icon.viadeo::before { content: "\f2a9"; font-family: "brand-icons"; } i.icon.viadeo.square::before { content: "\f2aa"; font-family: "brand-icons"; } i.icon.viber::before { content: "\f409"; font-family: "brand-icons"; } i.icon.vimeo::before { content: "\f40a"; font-family: "brand-icons"; } i.icon.vimeo.square::before { content: "\f194"; font-family: "brand-icons"; } i.icon.vimeo.v::before { content: "\f27d"; font-family: "brand-icons"; } i.icon.vine::before { content: "\f1ca"; font-family: "brand-icons"; } i.icon.vk::before { content: "\f189"; font-family: "brand-icons"; } i.icon.vnv::before { content: "\f40b"; font-family: "brand-icons"; } i.icon.vuejs::before { content: "\f41f"; font-family: "brand-icons"; } i.icon.watchman.monitoring::before { content: "\e087"; font-family: "brand-icons"; } i.icon.waze::before { content: "\f83f"; font-family: "brand-icons"; } i.icon.weebly::before { content: "\f5cc"; font-family: "brand-icons"; } i.icon.weibo::before { content: "\f18a"; font-family: "brand-icons"; } i.icon.weixin::before { content: "\f1d7"; font-family: "brand-icons"; } i.icon.whatsapp::before { content: "\f232"; font-family: "brand-icons"; } i.icon.whatsapp.square::before { content: "\f40c"; font-family: "brand-icons"; } i.icon.whmcs::before { content: "\f40d"; font-family: "brand-icons"; } i.icon.wikipedia.w::before { content: "\f266"; font-family: "brand-icons"; } i.icon.windows::before { content: "\f17a"; font-family: "brand-icons"; } i.icon.wix::before { content: "\f5cf"; font-family: "brand-icons"; } i.icon.wizards.of.the.coast::before { content: "\f730"; font-family: "brand-icons"; } i.icon.wodu::before { content: "\e088"; font-family: "brand-icons"; } i.icon.wolf.pack.battalion::before { content: "\f514"; font-family: "brand-icons"; } i.icon.wordpress::before { content: "\f19a"; font-family: "brand-icons"; } i.icon.wordpress.simple::before { content: "\f411"; font-family: "brand-icons"; } i.icon.wpbeginner::before { content: "\f297"; font-family: "brand-icons"; } i.icon.wpexplorer::before { content: "\f2de"; font-family: "brand-icons"; } i.icon.wpforms::before { content: "\f298"; font-family: "brand-icons"; } i.icon.wpressr::before { content: "\f3e4"; font-family: "brand-icons"; } i.icon.xbox::before { content: "\f412"; font-family: "brand-icons"; } i.icon.xing::before { content: "\f168"; font-family: "brand-icons"; } i.icon.xing.square::before { content: "\f169"; font-family: "brand-icons"; } i.icon.y.combinator::before { content: "\f23b"; font-family: "brand-icons"; } i.icon.yahoo::before { content: "\f19e"; font-family: "brand-icons"; } i.icon.yammer::before { content: "\f840"; font-family: "brand-icons"; } i.icon.yandex::before { content: "\f413"; font-family: "brand-icons"; } i.icon.yandex.international::before { content: "\f414"; font-family: "brand-icons"; } i.icon.yarn::before { content: "\f7e3"; font-family: "brand-icons"; } i.icon.yelp::before { content: "\f1e9"; font-family: "brand-icons"; } i.icon.yoast::before { content: "\f2b1"; font-family: "brand-icons"; } i.icon.youtube::before { content: "\f167"; font-family: "brand-icons"; } i.icon.youtube.square::before { content: "\f431"; font-family: "brand-icons"; } i.icon.zhihu::before { content: "\f63f"; font-family: "brand-icons"; } /* Aliases */ i.icon.american.express::before { content: "\f1f3"; font-family: "brand-icons"; } i.icon.american.express.card::before { content: "\f1f3"; font-family: "brand-icons"; } i.icon.amex::before { content: "\f1f3"; font-family: "brand-icons"; } i.icon.bitbucket.square::before { content: "\f171"; font-family: "brand-icons"; } i.icon.bluetooth.alternative::before { content: "\f294"; font-family: "brand-icons"; } i.icon.credit.card.amazon.pay::before { content: "\f42d"; font-family: "brand-icons"; } i.icon.credit.card.american.express::before { content: "\f1f3"; font-family: "brand-icons"; } i.icon.credit.card.diners.club::before { content: "\f24c"; font-family: "brand-icons"; } i.icon.credit.card.discover::before { content: "\f1f2"; font-family: "brand-icons"; } i.icon.credit.card.jcb::before { content: "\f24b"; font-family: "brand-icons"; } i.icon.credit.card.mastercard::before { content: "\f1f1"; font-family: "brand-icons"; } i.icon.credit.card.paypal::before { content: "\f1f4"; font-family: "brand-icons"; } i.icon.credit.card.stripe::before { content: "\f1f5"; font-family: "brand-icons"; } i.icon.credit.card.visa::before { content: "\f1f0"; font-family: "brand-icons"; } i.icon.diners.club::before { content: "\f24c"; font-family: "brand-icons"; } i.icon.diners.club.card::before { content: "\f24c"; font-family: "brand-icons"; } i.icon.discover::before { content: "\f1f2"; font-family: "brand-icons"; } i.icon.discover.card::before { content: "\f1f2"; font-family: "brand-icons"; } i.icon.disk.outline::before { content: "\f369"; font-family: "brand-icons"; } i.icon.dribble::before { content: "\f17d"; font-family: "brand-icons"; } i.icon.eercast::before { content: "\f2da"; font-family: "brand-icons"; } i.icon.envira.gallery::before { content: "\f299"; font-family: "brand-icons"; } i.icon.fa::before { content: "\f2b4"; font-family: "brand-icons"; } i.icon.facebook.official::before { content: "\f082"; font-family: "brand-icons"; } i.icon.five.hundred.pixels::before { content: "\f26e"; font-family: "brand-icons"; } i.icon.gittip::before { content: "\f184"; font-family: "brand-icons"; } i.icon.google.plus.circle::before { content: "\f2b3"; font-family: "brand-icons"; } i.icon.google.plus.official::before { content: "\f2b3"; font-family: "brand-icons"; } i.icon.japan.credit.bureau::before { content: "\f24b"; font-family: "brand-icons"; } i.icon.japan.credit.bureau.card::before { content: "\f24b"; font-family: "brand-icons"; } i.icon.jcb::before { content: "\f24b"; font-family: "brand-icons"; } i.icon.linkedin.square::before { content: "\f08c"; font-family: "brand-icons"; } i.icon.mastercard::before { content: "\f1f1"; font-family: "brand-icons"; } i.icon.mastercard.card::before { content: "\f1f1"; font-family: "brand-icons"; } i.icon.microsoft.edge::before { content: "\f282"; font-family: "brand-icons"; } i.icon.ms.edge::before { content: "\f282"; font-family: "brand-icons"; } i.icon.new.pied.piper::before { content: "\f2ae"; font-family: "brand-icons"; } i.icon.optinmonster::before { content: "\f23c"; font-family: "brand-icons"; } i.icon.paypal.card::before { content: "\f1f4"; font-family: "brand-icons"; } i.icon.pied.piper.hat::before { content: "\f2ae"; font-family: "brand-icons"; } i.icon.pocket::before { content: "\f265"; font-family: "brand-icons"; } i.icon.stripe.card::before { content: "\f1f5"; font-family: "brand-icons"; } i.icon.theme.isle::before { content: "\f2b2"; font-family: "brand-icons"; } i.icon.visa::before { content: "\f1f0"; font-family: "brand-icons"; } i.icon.visa.card::before { content: "\f1f0"; font-family: "brand-icons"; } i.icon.wechat::before { content: "\f1d7"; font-family: "brand-icons"; } i.icon.wikipedia::before { content: "\f266"; font-family: "brand-icons"; } i.icon.wordpress.beginner::before { content: "\f297"; font-family: "brand-icons"; } i.icon.wordpress.forms::before { content: "\f298"; font-family: "brand-icons"; } i.icon.yc::before { content: "\f23b"; font-family: "brand-icons"; } i.icon.ycombinator::before { content: "\f23b"; font-family: "brand-icons"; } i.icon.youtube.play::before { content: "\f167"; font-family: "brand-icons"; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/image.css ================================================ /*! * # Fomantic-UI 2.9.4 - Image * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Image *******************************/ .ui.image { position: relative; display: inline-block; vertical-align: middle; max-width: 100%; background-color: transparent; } img.ui.image { display: block; } .ui.image svg, .ui.image img { display: block; max-width: 100%; height: auto; } /******************************* States *******************************/ .ui.hidden.images, .ui.ui.hidden.image { display: none; } .ui.hidden.transition.images, .ui.hidden.transition.image { display: block; visibility: hidden; } .ui.images > .hidden.transition { display: inline-block; visibility: hidden; } .ui.disabled.images, .ui.disabled.image { cursor: default; opacity: 0.45; } /******************************* Variations *******************************/ /* -------------- Inline --------------- */ .ui.inline.image, .ui.inline.image svg, .ui.inline.image img { display: inline-block; } /* ------------------ Vertical Aligned ------------------- */ .ui.top.aligned.image, .ui.top.aligned.image svg, .ui.top.aligned.image img { display: inline-block; vertical-align: top; } .ui.middle.aligned.image, .ui.middle.aligned.image svg, .ui.middle.aligned.image img { display: inline-block; vertical-align: middle; } .ui.bottom.aligned.image, .ui.bottom.aligned.image svg, .ui.bottom.aligned.image img { display: inline-block; vertical-align: bottom; } .ui.top.aligned.images .image, .ui.images .ui.top.aligned.image { align-self: flex-start; } .ui.middle.aligned.images .image, .ui.images .ui.middle.aligned.image { align-self: center; } .ui.bottom.aligned.images .image, .ui.images .ui.bottom.aligned.image { align-self: flex-end; } /* -------------- Rounded --------------- */ .ui.rounded.images .image, .ui.rounded.image, .ui.rounded.images .image > *, .ui.rounded.image > * { border-radius: 0.3125em; } /* -------------- Bordered --------------- */ .ui.bordered.images .image, .ui.bordered.images img, .ui.bordered.images svg, .ui.bordered.image img, .ui.bordered.image svg, img.ui.bordered.image { border: 1px solid rgba(0, 0, 0, 0.1); } /* -------------- Circular --------------- */ .ui.circular.images, .ui.circular.image { overflow: hidden; } .ui.circular.images .image, .ui.circular.image, .ui.circular.images .image > *, .ui.circular.image > * { border-radius: 500rem; } /* -------------- Fluid --------------- */ .ui.fluid.images, .ui.fluid.image, .ui.fluid.images img, .ui.fluid.images svg, .ui.fluid.image svg, .ui.fluid.image img { display: block; width: 100%; height: auto; } /* -------------- Avatar --------------- */ .ui.avatar.images .image, .ui.avatar.images img, .ui.avatar.images svg, .ui.avatar.image img, .ui.avatar.image svg, .ui.avatar.image { margin-right: 0.25em; display: inline-block; width: 2em; height: 2em; border-radius: 500rem; } /* ------------------- Spaced -------------------- */ .ui.spaced.image { display: inline-block !important; margin-left: 0.5em; margin-right: 0.5em; } .ui[class*="left spaced"].image { margin-left: 0.5em; margin-right: 0; } .ui[class*="right spaced"].image { margin-left: 0; margin-right: 0.5em; } /* ------------------- Floated -------------------- */ .ui.floated.image, .ui.floated.images { float: left; margin-right: 1em; margin-bottom: 1em; } .ui.right.floated.images, .ui.right.floated.image { float: right; margin-right: 0; margin-bottom: 1em; margin-left: 1em; } .ui.floated.images:last-child, .ui.floated.image:last-child { margin-bottom: 0; } .ui.centered.image { display: block; margin-left: auto; margin-right: auto; } .ui.centered.images { display: flex; flex-flow: row wrap; align-items: stretch; justify-content: center; } /* -------------- Sizes --------------- */ .ui.medium.images .image, .ui.medium.images img, .ui.medium.images svg, .ui.medium.image { width: 300px; height: auto; font-size: 1rem; } .ui.mini.images .image, .ui.mini.images img, .ui.mini.images svg, .ui.mini.image { width: 35px; height: auto; font-size: 0.78571429rem; } .ui.tiny.images .image, .ui.tiny.images img, .ui.tiny.images svg, .ui.tiny.image { width: 80px; height: auto; font-size: 0.85714286rem; } .ui.small.images .image, .ui.small.images img, .ui.small.images svg, .ui.small.image { width: 150px; height: auto; font-size: 0.92857143rem; } .ui.large.images .image, .ui.large.images img, .ui.large.images svg, .ui.large.image { width: 450px; height: auto; font-size: 1.14285714rem; } .ui.big.images .image, .ui.big.images img, .ui.big.images svg, .ui.big.image { width: 600px; height: auto; font-size: 1.28571429rem; } .ui.huge.images .image, .ui.huge.images img, .ui.huge.images svg, .ui.huge.image { width: 800px; height: auto; font-size: 1.42857143rem; } .ui.massive.images .image, .ui.massive.images img, .ui.massive.images svg, .ui.massive.image { width: 960px; height: auto; font-size: 1.71428571rem; } /******************************* Groups *******************************/ .ui.images { font-size: 0; margin: 0 -0.25rem; } .ui.images .image, .ui.images > img, .ui.images > svg { display: inline-block; margin: 0 0.25rem 0.5rem; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/input.css ================================================ /*! * # Fomantic-UI 2.9.4 - Input * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Standard *******************************/ /* -------------------- Inputs --------------------- */ .ui.input { position: relative; font-weight: normal; font-style: normal; display: inline-flex; color: rgba(0, 0, 0, 0.87); } .ui.input > input { margin: 0; max-width: 100%; flex: 1 1 auto; outline: none; -webkit-tap-highlight-color: rgba(255, 255, 255, 0); text-align: left; line-height: 1.21428571em; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; background: #fff; border: 1px solid rgba(34, 36, 38, 0.15); color: rgba(0, 0, 0, 0.87); border-radius: 0.28571429rem; transition: box-shadow 0.1s ease, border-color 0.1s ease; box-shadow: none; } .ui.input > input:not([type="color"]) { padding: 0.67857143em 1em; } .ui.input > input::-webkit-calendar-picker-indicator { padding: 0; opacity: 0.5; -webkit-transition: opacity 0.3s ease; transition: opacity 0.3s ease; cursor: pointer; } /* -------------------- Placeholder --------------------- */ /* browsers require these rules separate */ .ui.input > input:-ms-input-placeholder { color: rgba(191, 191, 191, 0.87); } .ui.input > input::-ms-input-placeholder { color: rgba(191, 191, 191, 0.87); } .ui.input > input::placeholder { color: rgba(191, 191, 191, 0.87); } .ui.input > input::-moz-placeholder { opacity: 1; } .ui.input > input:-ms-input-placeholder { color: rgba(191, 191, 191, 0.87); } /******************************* States *******************************/ /* -------------------- Disabled --------------------- */ .ui.disabled.input, .ui.input:not(.disabled) input[disabled] { opacity: 0.45; } .ui.disabled.input > input, .ui.input:not(.disabled) input[disabled] { pointer-events: none; } /* -------------------- Active --------------------- */ .ui.input > input:active, .ui.input.down input { border-color: rgba(0, 0, 0, 0.3); background: #fafafa; color: rgba(0, 0, 0, 0.87); box-shadow: none; } .ui.form .field > textarea:hover:not(:focus), .ui.input > textarea:hover:not(:focus), .ui.form .field > input:hover:not(:focus), .ui.input > input:hover:not(:focus) { border-color: rgba(34, 36, 38, 0.35); } /* -------------------- Loading --------------------- */ .ui.ui.loading.input > i.icon::before { position: absolute; content: ""; top: 50%; left: 50%; margin: -0.64285714em 0 0 -0.64285714em; width: 1.28571429em; height: 1.28571429em; border-radius: 500rem; border: 0.2em solid rgba(0, 0, 0, 0.1); } .ui.ui.loading.input > i.icon::after { position: absolute; content: ""; top: 50%; left: 50%; margin: -0.64285714em 0 0 -0.64285714em; width: 1.28571429em; height: 1.28571429em; animation: loader 0.6s infinite linear; border: 0.2em solid #767676; border-radius: 500rem; box-shadow: 0 0 0 1px transparent; } /* -------------------- Focus --------------------- */ .ui.input.focus > input, .ui.input > input:focus { border-color: #85b7d9; background: #fff; color: rgba(0, 0, 0, 0.8); box-shadow: none; } .ui.input.focus > input:-ms-input-placeholder, .ui.input > input:focus:-ms-input-placeholder { color: rgba(115, 115, 115, 0.87); } .ui.input.focus > input::-ms-input-placeholder, .ui.input > input:focus::-ms-input-placeholder { color: rgba(115, 115, 115, 0.87); } .ui.input.focus > input::placeholder, .ui.input > input:focus::placeholder { color: rgba(115, 115, 115, 0.87); } .ui.input.focus > input:-ms-input-placeholder, .ui.input > input:focus:-ms-input-placeholder { color: rgba(115, 115, 115, 0.87); } /* -------------------- States --------------------- */ .ui.input.error > input { background-color: #fff6f6; border-color: #e0b4b4; color: #9f3a38; box-shadow: none; } /* Placeholder */ .ui.input.error > input:-ms-input-placeholder { color: #e7bdbc; } .ui.input.error > input::-ms-input-placeholder { color: #e7bdbc; } .ui.input.error > input::placeholder { color: #e7bdbc; } .ui.input.error > input:-ms-input-placeholder { color: #e7bdbc !important; } /* Focused Placeholder */ .ui.input.error > input:focus:-ms-input-placeholder { color: #da9796; } .ui.input.error > input:focus::-ms-input-placeholder { color: #da9796; } .ui.input.error > input:focus::placeholder { color: #da9796; } .ui.input.error > input:focus:-ms-input-placeholder { color: #da9796 !important; } .ui.input.info > input { background-color: #f8ffff; border-color: #a9d5de; color: #276f86; box-shadow: none; } /* Placeholder */ .ui.input.info > input:-ms-input-placeholder { color: #98cfe1; } .ui.input.info > input::-ms-input-placeholder { color: #98cfe1; } .ui.input.info > input::placeholder { color: #98cfe1; } .ui.input.info > input:-ms-input-placeholder { color: #98cfe1 !important; } /* Focused Placeholder */ .ui.input.info > input:focus:-ms-input-placeholder { color: #70bdd6; } .ui.input.info > input:focus::-ms-input-placeholder { color: #70bdd6; } .ui.input.info > input:focus::placeholder { color: #70bdd6; } .ui.input.info > input:focus:-ms-input-placeholder { color: #70bdd6 !important; } .ui.input.success > input { background-color: #fcfff5; border-color: #a3c293; color: #2c662d; box-shadow: none; } /* Placeholder */ .ui.input.success > input:-ms-input-placeholder { color: #8fcf90; } .ui.input.success > input::-ms-input-placeholder { color: #8fcf90; } .ui.input.success > input::placeholder { color: #8fcf90; } .ui.input.success > input:-ms-input-placeholder { color: #8fcf90 !important; } /* Focused Placeholder */ .ui.input.success > input:focus:-ms-input-placeholder { color: #6cbf6d; } .ui.input.success > input:focus::-ms-input-placeholder { color: #6cbf6d; } .ui.input.success > input:focus::placeholder { color: #6cbf6d; } .ui.input.success > input:focus:-ms-input-placeholder { color: #6cbf6d !important; } .ui.input.warning > input { background-color: #fffaf3; border-color: #c9ba9b; color: #573a08; box-shadow: none; } /* Placeholder */ .ui.input.warning > input:-ms-input-placeholder { color: #edad3e; } .ui.input.warning > input::-ms-input-placeholder { color: #edad3e; } .ui.input.warning > input::placeholder { color: #edad3e; } .ui.input.warning > input:-ms-input-placeholder { color: #edad3e !important; } /* Focused Placeholder */ .ui.input.warning > input:focus:-ms-input-placeholder { color: #e39715; } .ui.input.warning > input:focus::-ms-input-placeholder { color: #e39715; } .ui.input.warning > input:focus::placeholder { color: #e39715; } .ui.input.warning > input:focus:-ms-input-placeholder { color: #e39715 !important; } /******************************* Variations *******************************/ /* -------------------- Transparent --------------------- */ .ui.transparent.input > textarea, .ui.transparent.input > input { border-color: transparent !important; background-color: transparent !important; padding: 0; box-shadow: none !important; border-radius: 0 !important; } .field .ui.transparent.input > textarea { padding: 0.67857143em 1em; } /* Transparent Icon */ :not(.field) > .ui.transparent.icon.input > i.icon { width: 1.1em; } :not(.field) > .ui.ui.ui.transparent.icon.input > input { padding-left: 0; padding-right: 2em; } :not(.field) > .ui.ui.ui.transparent[class*="left icon"].input > input { padding-left: 2em; padding-right: 0; } /* Transparent Inverted */ .ui.transparent.inverted.input { color: #fff; } .ui.ui.transparent.inverted.input > textarea, .ui.ui.transparent.inverted.input > input { color: inherit; } .ui.transparent.inverted.input > input:-ms-input-placeholder { color: rgba(255, 255, 255, 0.5); } .ui.transparent.inverted.input > input::-ms-input-placeholder { color: rgba(255, 255, 255, 0.5); } .ui.transparent.inverted.input > input::placeholder { color: rgba(255, 255, 255, 0.5); } .ui.transparent.inverted.input > input:-ms-input-placeholder { color: rgba(255, 255, 255, 0.5); } /* -------------------- Icon --------------------- */ .ui.icon.input > i.icon { cursor: default; position: absolute; line-height: 1; text-align: center; top: 0; right: 0; margin: 0; height: 100%; width: 2.67142857em; opacity: 0.5; border-radius: 0 0.28571429rem 0.28571429rem 0; transition: opacity 0.3s ease; } .ui.icon.input > i.icon:not(.link) { pointer-events: none; } .ui.ui.ui.ui.icon.input:not(.corner) > textarea, .ui.ui.ui.ui.icon.input:not(.corner) > input { padding-right: 2.67142857em; } .ui.icon.input > i.icon::before, .ui.icon.input > i.icon::after { left: 0; position: absolute; text-align: center; top: 50%; width: 100%; margin-top: -0.5em; } .ui.icon.input > i.link.icon { cursor: pointer; } .ui.icon.input > i.circular.icon { top: 0.35em; right: 0.5em; } /* Left Icon Input */ .ui[class*="left icon"].input > i.icon { right: auto; left: 1px; border-radius: 0.28571429rem 0 0 0.28571429rem; } .ui[class*="left icon"].input > i.circular.icon { right: auto; left: 0.5em; } .ui.ui.ui.ui[class*="left icon"]:not([class*="left corner"]).input > textarea, .ui.ui.ui.ui[class*="left icon"]:not([class*="left corner"]).input > input { padding-left: 2.67142857em; } .ui.ui.ui.ui[class*="left icon"]:not(.corner).input > textarea, .ui.ui.ui.ui[class*="left icon"]:not(.corner).input > input { padding-right: 1em; } /* Focus */ .ui.input > input:focus::-webkit-calendar-picker-indicator, .ui.icon.input > textarea:focus ~ i.icon, .ui.icon.input > input:focus ~ i.icon { opacity: 1; } /* -------------------- Labeled --------------------- */ /* Adjacent Label */ .ui.labeled.input > .label { flex: 0 0 auto; margin: 0; font-size: 1em; } .ui.labeled.input > .label:not(.corner) { padding-top: 0.78571429em; padding-bottom: 0.78571429em; } /* Regular Label on Left */ .ui.labeled.input:not([class*="corner labeled"]) .label:first-child { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ui.labeled.input:not([class*="corner labeled"]) .label:first-child + input { border-top-left-radius: 0; border-bottom-left-radius: 0; border-left-color: transparent; } .ui.labeled.input:not([class*="corner labeled"]) .label:first-child + input:focus { border-left-color: #85b7d9; } /* Regular Label on Right */ .ui[class*="right labeled"].input > input { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; border-right-color: transparent !important; } .ui[class*="right labeled"].input > input + .label { border-top-left-radius: 0; border-bottom-left-radius: 0; } .ui[class*="right labeled"].input > input:focus { border-right-color: #85b7d9 !important; } /* Corner Label */ .ui.labeled.input .corner.label { top: 1px; right: 1px; font-size: 0.64285714em; border-radius: 0 0.28571429rem 0 0; } /* Spacing with corner label */ .ui[class*="corner labeled"]:not([class*="left corner labeled"]).input > .ui.dropdown, .ui[class*="corner labeled"]:not([class*="left corner labeled"]).input > textarea, .ui[class*="corner labeled"]:not([class*="left corner labeled"]).input > input { padding-right: 2.5em; } .ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"]) > .ui.dropdown, .ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"]) > textarea, .ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"]) > input { padding-right: 3.25em; } .ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"]) > i.icon { margin-right: 1.25em; } /* Left Labeled */ .ui[class*="left icon"].input > .ui.dropdown:first-child, .ui[class*="left icon"].input > i.icon + .ui.dropdown, .ui[class*="left corner labeled"].input > .ui.dropdown, .ui[class*="left corner labeled"].input > textarea, .ui[class*="left corner labeled"].input > input { padding-left: 2.5em; } .ui[class*="corner labeled"]:not([class*="left corner labeled"])[class*="left icon"].input > .ui.dropdown, .ui[class*="corner labeled"]:not([class*="left corner labeled"])[class*="left icon"].input > textarea, .ui[class*="corner labeled"]:not([class*="left corner labeled"])[class*="left icon"].input > input { padding-right: 3.25em; } .ui.ui[class*="left corner labeled"][class*="left icon"].input > .ui.dropdown, .ui.ui[class*="left corner labeled"][class*="left icon"].input > textarea, .ui.ui[class*="left corner labeled"][class*="left icon"].input > input { padding-left: 4em; } .ui[class*="left corner labeled"].icon.input > i.icon { margin-left: 1.25em; } .ui[class*="left corner labeled"].icon:not([class*="left icon"]).input > input { padding-right: 2.5em; } .ui[class*="corner labeled"]:not([class*="left corner labeled"]).icon:not([class*="left icon"]).input > input { padding-right: 5em; } .ui[class*="left icon"].input > .ui.dropdown > .search, .ui[class*="left corner labeled"].input > .ui.dropdown > .search { padding-left: 2.5em; } .ui[class*="left icon"].input > .ui.dropdown > .menu, .ui[class*="left corner labeled"].input > .ui.dropdown > .menu { padding-left: 1.25em; } .ui[class*="left icon"].input > .ui.dropdown > .menu > .item, .ui[class*="left corner labeled"].input > .ui.dropdown > .menu > .item { padding-left: 2.5em; margin-left: -1.25em; } .ui[class*="left corner labeled"][class*="left icon"].input > .ui.dropdown > .search { padding-left: 4em; } .ui[class*="left corner labeled"][class*="left icon"].input > .ui.dropdown > .menu > .item { padding-left: 4em; } .ui.icon.input:not([class*="left icon"]) > .ui.dropdown > .search, .ui[class*="corner labeled"]:not([class*="left corner labeled"]).input > .ui.dropdown > .search { padding-right: 5.75em; } .ui.icon.input:not([class*="left icon"]) > .ui.dropdown > .remove.icon, .ui[class*="corner labeled"]:not([class*="left corner labeled"]).input > .ui.dropdown > .remove.icon, .ui.icon.input:not([class*="left icon"]) > .ui.dropdown > .dropdown.icon, .ui[class*="corner labeled"]:not([class*="left corner labeled"]).input > .ui.dropdown > .dropdown.icon { padding-right: 2.5em; } @supports selector(:has(.f)) { .ui.icon.input:not([class*="left icon"]) > .ui.dropdown > .dropdown.icon { padding-right: initial; } .ui.icon.input:not([class*="left icon"]):not(:has(.ui.dropdown ~ input)) > .ui.dropdown > .dropdown.icon { padding-right: 2.5em; } } .ui.ui[class*="corner labeled"]:not([class*="left corner labeled"]).icon:not([class*="left icon"]).input > .ui.dropdown > .search { padding-right: 7.25em; } .ui.ui[class*="corner labeled"]:not([class*="left corner labeled"]).icon:not([class*="left icon"]).input > .ui.dropdown > .remove.icon, .ui.ui[class*="corner labeled"]:not([class*="left corner labeled"]).icon:not([class*="left icon"]).input > .ui.dropdown > .dropdown.icon { padding-right: 4em; } .ui.icon.input > .ui.visible.dropdown ~ i.icon, .ui.icon.input > .ui.active.dropdown ~ i.icon, .ui[class*="corner labeled"].input > .ui.visible.dropdown ~ .ui.corner.label, .ui[class*="corner labeled"].input > .ui.active.dropdown ~ .ui.corner.label { z-index: 10; } .ui.icon.input > textarea ~ i.icon { height: 3em; } :not(.field) > .ui.transparent.icon.input > textarea ~ i.icon { height: 1.3em; } /* Corner Label Position */ .ui.input > .ui.corner.label { top: 1px; right: 1px; } .ui.input > .ui.left.corner.label { right: auto; left: 1px; } /* Labeled and action input states */ .ui.form .field.error > .ui.action.input > .ui.button, .ui.form .field.error > .ui.labeled.input:not([class*="corner labeled"]) > .ui.label, .ui.action.input.error > .ui.button, .ui.labeled.input.error:not([class*="corner labeled"]) > .ui.label { border-top: 1px solid #e0b4b4; border-bottom: 1px solid #e0b4b4; } .ui.form .field.error > .ui[class*="left action"].input > .ui.button, .ui.form .field.error > .ui.labeled.input:not(.right):not([class*="corner labeled"]) > .ui.label, .ui[class*="left action"].input.error > .ui.button, .ui.labeled.input.error:not(.right):not([class*="corner labeled"]) > .ui.label { border-left: 1px solid #e0b4b4; } .ui.form .field.error > .ui.action.input:not([class*="left action"]) > input + .ui.button, .ui.form .field.error > .ui.right.labeled.input:not([class*="corner labeled"]) > input + .ui.label, .ui.action.input.error:not([class*="left action"]) > input + .ui.button, .ui.right.labeled.input.error:not([class*="corner labeled"]) > input + .ui.label, .ui.form .field.error > .ui.action.input:not([class*="left action"]) > textarea + .ui.button, .ui.form .field.error > .ui.right.labeled.input:not([class*="corner labeled"]) > textarea + .ui.label, .ui.action.input.error:not([class*="left action"]) > textarea + .ui.button, .ui.right.labeled.input.error:not([class*="corner labeled"]) > textarea + .ui.label { border-right: 1px solid #e0b4b4; } .ui.form .field.error > .ui.right.labeled.input:not([class*="corner labeled"]) > .ui.label:first-child, .ui.right.labeled.input.error:not([class*="corner labeled"]) > .ui.label:first-child { border-left: 1px solid #e0b4b4; } .ui.form .field.info > .ui.action.input > .ui.button, .ui.form .field.info > .ui.labeled.input:not([class*="corner labeled"]) > .ui.label, .ui.action.input.info > .ui.button, .ui.labeled.input.info:not([class*="corner labeled"]) > .ui.label { border-top: 1px solid #a9d5de; border-bottom: 1px solid #a9d5de; } .ui.form .field.info > .ui[class*="left action"].input > .ui.button, .ui.form .field.info > .ui.labeled.input:not(.right):not([class*="corner labeled"]) > .ui.label, .ui[class*="left action"].input.info > .ui.button, .ui.labeled.input.info:not(.right):not([class*="corner labeled"]) > .ui.label { border-left: 1px solid #a9d5de; } .ui.form .field.info > .ui.action.input:not([class*="left action"]) > input + .ui.button, .ui.form .field.info > .ui.right.labeled.input:not([class*="corner labeled"]) > input + .ui.label, .ui.action.input.info:not([class*="left action"]) > input + .ui.button, .ui.right.labeled.input.info:not([class*="corner labeled"]) > input + .ui.label, .ui.form .field.info > .ui.action.input:not([class*="left action"]) > textarea + .ui.button, .ui.form .field.info > .ui.right.labeled.input:not([class*="corner labeled"]) > textarea + .ui.label, .ui.action.input.info:not([class*="left action"]) > textarea + .ui.button, .ui.right.labeled.input.info:not([class*="corner labeled"]) > textarea + .ui.label { border-right: 1px solid #a9d5de; } .ui.form .field.info > .ui.right.labeled.input:not([class*="corner labeled"]) > .ui.label:first-child, .ui.right.labeled.input.info:not([class*="corner labeled"]) > .ui.label:first-child { border-left: 1px solid #a9d5de; } .ui.form .field.success > .ui.action.input > .ui.button, .ui.form .field.success > .ui.labeled.input:not([class*="corner labeled"]) > .ui.label, .ui.action.input.success > .ui.button, .ui.labeled.input.success:not([class*="corner labeled"]) > .ui.label { border-top: 1px solid #a3c293; border-bottom: 1px solid #a3c293; } .ui.form .field.success > .ui[class*="left action"].input > .ui.button, .ui.form .field.success > .ui.labeled.input:not(.right):not([class*="corner labeled"]) > .ui.label, .ui[class*="left action"].input.success > .ui.button, .ui.labeled.input.success:not(.right):not([class*="corner labeled"]) > .ui.label { border-left: 1px solid #a3c293; } .ui.form .field.success > .ui.action.input:not([class*="left action"]) > input + .ui.button, .ui.form .field.success > .ui.right.labeled.input:not([class*="corner labeled"]) > input + .ui.label, .ui.action.input.success:not([class*="left action"]) > input + .ui.button, .ui.right.labeled.input.success:not([class*="corner labeled"]) > input + .ui.label, .ui.form .field.success > .ui.action.input:not([class*="left action"]) > textarea + .ui.button, .ui.form .field.success > .ui.right.labeled.input:not([class*="corner labeled"]) > textarea + .ui.label, .ui.action.input.success:not([class*="left action"]) > textarea + .ui.button, .ui.right.labeled.input.success:not([class*="corner labeled"]) > textarea + .ui.label { border-right: 1px solid #a3c293; } .ui.form .field.success > .ui.right.labeled.input:not([class*="corner labeled"]) > .ui.label:first-child, .ui.right.labeled.input.success:not([class*="corner labeled"]) > .ui.label:first-child { border-left: 1px solid #a3c293; } .ui.form .field.warning > .ui.action.input > .ui.button, .ui.form .field.warning > .ui.labeled.input:not([class*="corner labeled"]) > .ui.label, .ui.action.input.warning > .ui.button, .ui.labeled.input.warning:not([class*="corner labeled"]) > .ui.label { border-top: 1px solid #c9ba9b; border-bottom: 1px solid #c9ba9b; } .ui.form .field.warning > .ui[class*="left action"].input > .ui.button, .ui.form .field.warning > .ui.labeled.input:not(.right):not([class*="corner labeled"]) > .ui.label, .ui[class*="left action"].input.warning > .ui.button, .ui.labeled.input.warning:not(.right):not([class*="corner labeled"]) > .ui.label { border-left: 1px solid #c9ba9b; } .ui.form .field.warning > .ui.action.input:not([class*="left action"]) > input + .ui.button, .ui.form .field.warning > .ui.right.labeled.input:not([class*="corner labeled"]) > input + .ui.label, .ui.action.input.warning:not([class*="left action"]) > input + .ui.button, .ui.right.labeled.input.warning:not([class*="corner labeled"]) > input + .ui.label, .ui.form .field.warning > .ui.action.input:not([class*="left action"]) > textarea + .ui.button, .ui.form .field.warning > .ui.right.labeled.input:not([class*="corner labeled"]) > textarea + .ui.label, .ui.action.input.warning:not([class*="left action"]) > textarea + .ui.button, .ui.right.labeled.input.warning:not([class*="corner labeled"]) > textarea + .ui.label { border-right: 1px solid #c9ba9b; } .ui.form .field.warning > .ui.right.labeled.input:not([class*="corner labeled"]) > .ui.label:first-child, .ui.right.labeled.input.warning:not([class*="corner labeled"]) > .ui.label:first-child { border-left: 1px solid #c9ba9b; } /* -------------------- Action --------------------- */ .ui.action.input > .button, .ui.action.input > .buttons { display: flex; align-items: center; flex: 0 0 auto; } .ui.action.input > .button, .ui.action.input > .buttons > .button { padding-top: 0.78571429em; padding-bottom: 0.78571429em; margin: 0; } /* Input when ui Left */ .ui[class*="left action"].input > input, .ui[class*="left action"].input > textarea { border-top-left-radius: 0; border-bottom-left-radius: 0; border-left-color: transparent; } /* Input when ui Right */ .ui.action.input:not([class*="left action"]) > input, .ui.action.input:not([class*="left action"]) > textarea { border-top-right-radius: 0; border-bottom-right-radius: 0; border-right-color: transparent; } /* Button and Dropdown */ .ui.action.input > .dropdown:first-child, .ui.action.input > .button:first-child, .ui.action.input > .buttons:first-child > .button { border-radius: 0.28571429rem 0 0 0.28571429rem; } .ui.action.input > .dropdown:not(:first-child), .ui.action.input > .button:not(:first-child), .ui.action.input > .buttons:not(:first-child) > .button { border-radius: 0; } .ui.action.input > .dropdown:last-child, .ui.action.input > .button:last-child, .ui.action.input > .buttons:last-child > .button { border-radius: 0 0.28571429rem 0.28571429rem 0; } /* Input Focus */ .ui.action.input:not([class*="left action"]) > input:focus, .ui.action.input:not([class*="left action"]) > textarea:focus { border-right-color: #85b7d9; } .ui.ui[class*="left action"].input > input:focus, .ui.ui[class*="left action"].input > textarea:focus { border-left-color: #85b7d9; } /* -------------------- Inverted --------------------- */ /* Standard */ .ui.inverted.input > input { border: none; } /* -------------------- Fluid --------------------- */ .ui.fluid.input { display: flex; } .ui.fluid.input > input { width: 0 !important; } /* -------------------- File --------------------- */ /* width hack for chrome/edge */ .ui.file.input { width: 100%; } .ui.file.input input[type="file"] { width: 0; } .ui.form .field > input[type="file"], .ui.file.input:not(.action) input[type="file"] { padding: 0; } .ui.action.file.input input[type="file"]::-webkit-file-upload-button { display: none; } .ui.form .field input[type="file"]::-webkit-file-upload-button, .ui.file.input input[type="file"]::-webkit-file-upload-button { border: none; cursor: pointer; padding: 0.67857143em 1em; margin-right: 1em; background: #e0e1e2; font-weight: bold; color: rgba(0, 0, 0, 0.6); } .ui.form .field input[type="file"]::-webkit-file-upload-button:hover, .ui.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #cacbcd; color: rgba(0, 0, 0, 0.6); } .ui.action.file.input input[type="file"]::-ms-browse { display: none; } .ui.form .field input[type="file"]::-ms-browse, .ui.file.input input[type="file"]::-ms-browse { border: none; cursor: pointer; padding: 0.67857143em 1em; margin: 0; background: #e0e1e2; font-weight: bold; color: rgba(0, 0, 0, 0.6); } .ui.form .field input[type="file"]::-ms-browse:hover, .ui.file.input input[type="file"]::-ms-browse:hover { background: #cacbcd; color: rgba(0, 0, 0, 0.6); } /* IE needs additional styling for input field :S */ @media all and (-ms-high-contrast: none) { .ui.file.input > input[type="file"], input[type="file"].ui.file.input { padding: 0 !important; } } .ui.action.file.input input[type="file"]::-webkit-file-upload-button { display: none; } .ui.action.file.input input[type="file"]::file-selector-button { display: none; } .ui.form .field input[type="file"]::-webkit-file-upload-button, .ui.file.input input[type="file"]::-webkit-file-upload-button { border: none; cursor: pointer; padding: 0.67857143em 1em; margin-right: 1em; background: #e0e1e2; font-weight: bold; color: rgba(0, 0, 0, 0.6); } .ui.form .field input[type="file"]::file-selector-button, .ui.file.input input[type="file"]::file-selector-button { border: none; cursor: pointer; padding: 0.67857143em 1em; margin-right: 1em; background: #e0e1e2; font-weight: bold; color: rgba(0, 0, 0, 0.6); } .ui.form .field input[type="file"]::-webkit-file-upload-button:hover, .ui.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #cacbcd; color: rgba(0, 0, 0, 0.6); } .ui.form .field input[type="file"]::file-selector-button:hover, .ui.file.input input[type="file"]::file-selector-button:hover { background: #cacbcd; color: rgba(0, 0, 0, 0.6); } input[type="file"].ui.invisible.file.input, .ui.invisible.file.input input[type="file"] { left: -99999px; position: absolute; } input[type="file"].ui.file.input:focus + label.ui.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.button:not(.basic):not(.tertiary) { background: #cacbcd; color: rgba(0, 0, 0, 0.8); } input[type="file"].ui.file.input:focus + label.ui.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.button:not(.basic):not(.tertiary).inverted { background: #fff; } /* this is related to existing buttons, so the button color variable is used here! */ input[type="file"].ui.file.input:focus + label.ui.primary.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.primary.button:not(.basic):not(.tertiary) { background-color: #1678c2; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.primary.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.primary.button:not(.basic):not(.tertiary).inverted { background-color: #21b8ff; } input[type="file"].ui.file.input:focus + label.ui.secondary.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.secondary.button:not(.basic):not(.tertiary) { background-color: #27292a; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.secondary.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.secondary.button:not(.basic):not(.tertiary).inverted { background-color: #6e6e6e; } input[type="file"].ui.file.input:focus + label.ui.red.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.red.button:not(.basic):not(.tertiary) { background-color: #d01919; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.red.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.red.button:not(.basic):not(.tertiary).inverted { background-color: #ff392b; } input[type="file"].ui.file.input:focus + label.ui.orange.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.orange.button:not(.basic):not(.tertiary) { background-color: #f26202; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.orange.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.orange.button:not(.basic):not(.tertiary).inverted { background-color: #e76b00; } input[type="file"].ui.file.input:focus + label.ui.yellow.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.yellow.button:not(.basic):not(.tertiary) { background-color: #eaae00; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.yellow.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.yellow.button:not(.basic):not(.tertiary).inverted { background-color: #ebcd00; } input[type="file"].ui.file.input:focus + label.ui.olive.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.olive.button:not(.basic):not(.tertiary) { background-color: #a7bd0d; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.olive.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.olive.button:not(.basic):not(.tertiary).inverted { background-color: #d2e745; } input[type="file"].ui.file.input:focus + label.ui.green.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.green.button:not(.basic):not(.tertiary) { background-color: #16ab39; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.green.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.green.button:not(.basic):not(.tertiary).inverted { background-color: #1ea92e; } input[type="file"].ui.file.input:focus + label.ui.teal.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.teal.button:not(.basic):not(.tertiary) { background-color: #009c95; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.teal.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.teal.button:not(.basic):not(.tertiary).inverted { background-color: #3affff; } input[type="file"].ui.file.input:focus + label.ui.blue.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.blue.button:not(.basic):not(.tertiary) { background-color: #1678c2; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.blue.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.blue.button:not(.basic):not(.tertiary).inverted { background-color: #21b8ff; } input[type="file"].ui.file.input:focus + label.ui.violet.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.violet.button:not(.basic):not(.tertiary) { background-color: #5829bb; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.violet.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.violet.button:not(.basic):not(.tertiary).inverted { background-color: #745aff; } input[type="file"].ui.file.input:focus + label.ui.purple.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.purple.button:not(.basic):not(.tertiary) { background-color: #9627ba; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.purple.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.purple.button:not(.basic):not(.tertiary).inverted { background-color: #cf40ff; } input[type="file"].ui.file.input:focus + label.ui.pink.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.pink.button:not(.basic):not(.tertiary) { background-color: #e61a8d; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.pink.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.pink.button:not(.basic):not(.tertiary).inverted { background-color: #ff5bd1; } input[type="file"].ui.file.input:focus + label.ui.brown.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.brown.button:not(.basic):not(.tertiary) { background-color: #975b33; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.brown.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.brown.button:not(.basic):not(.tertiary).inverted { background-color: #b0620f; } input[type="file"].ui.file.input:focus + label.ui.grey.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.grey.button:not(.basic):not(.tertiary) { background-color: #838383; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.grey.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.grey.button:not(.basic):not(.tertiary).inverted { background-color: #c2c4c5; } input[type="file"].ui.file.input:focus + label.ui.black.button:not(.basic):not(.tertiary), .ui.file.input input[type="file"]:focus + label.ui.black.button:not(.basic):not(.tertiary) { background-color: #27292a; color: #fff; } input[type="file"].ui.file.input:focus + label.ui.black.button:not(.basic):not(.tertiary).inverted, .ui.file.input input[type="file"]:focus + label.ui.black.button:not(.basic):not(.tertiary).inverted { background-color: #000000; } input[type="file"].ui.primary.file.input::-webkit-file-upload-button, .ui.primary.file.input input[type="file"]::-webkit-file-upload-button { background: #2185d0; color: #fff; } input[type="file"].ui.primary.file.input::-webkit-file-upload-button:hover, .ui.primary.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #1678c2; } input[type="file"].ui.primary.file.input::-ms-browse, .ui.primary.file.input input[type="file"]::-ms-browse { background: #2185d0; color: #fff; } input[type="file"].ui.primary.file.input::-ms-browse:hover, .ui.primary.file.input input[type="file"]::-ms-browse:hover { background: #1678c2; } input[type="file"].ui.primary.file.input::-webkit-file-upload-button, .ui.primary.file.input input[type="file"]::-webkit-file-upload-button { background: #2185d0; color: #fff; } input[type="file"].ui.primary.file.input::file-selector-button, .ui.primary.file.input input[type="file"]::file-selector-button { background: #2185d0; color: #fff; } input[type="file"].ui.primary.file.input::-webkit-file-upload-button:hover, .ui.primary.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #1678c2; } input[type="file"].ui.primary.file.input::file-selector-button:hover, .ui.primary.file.input input[type="file"]::file-selector-button:hover { background: #1678c2; } input[type="file"].ui.secondary.file.input::-webkit-file-upload-button, .ui.secondary.file.input input[type="file"]::-webkit-file-upload-button { background: #1b1c1d; color: #fff; } input[type="file"].ui.secondary.file.input::-webkit-file-upload-button:hover, .ui.secondary.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #27292a; } input[type="file"].ui.secondary.file.input::-ms-browse, .ui.secondary.file.input input[type="file"]::-ms-browse { background: #1b1c1d; color: #fff; } input[type="file"].ui.secondary.file.input::-ms-browse:hover, .ui.secondary.file.input input[type="file"]::-ms-browse:hover { background: #27292a; } input[type="file"].ui.secondary.file.input::-webkit-file-upload-button, .ui.secondary.file.input input[type="file"]::-webkit-file-upload-button { background: #1b1c1d; color: #fff; } input[type="file"].ui.secondary.file.input::file-selector-button, .ui.secondary.file.input input[type="file"]::file-selector-button { background: #1b1c1d; color: #fff; } input[type="file"].ui.secondary.file.input::-webkit-file-upload-button:hover, .ui.secondary.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #27292a; } input[type="file"].ui.secondary.file.input::file-selector-button:hover, .ui.secondary.file.input input[type="file"]::file-selector-button:hover { background: #27292a; } input[type="file"].ui.red.file.input::-webkit-file-upload-button, .ui.red.file.input input[type="file"]::-webkit-file-upload-button { background: #db2828; color: #fff; } input[type="file"].ui.red.file.input::-webkit-file-upload-button:hover, .ui.red.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #d01919; } input[type="file"].ui.red.file.input::-ms-browse, .ui.red.file.input input[type="file"]::-ms-browse { background: #db2828; color: #fff; } input[type="file"].ui.red.file.input::-ms-browse:hover, .ui.red.file.input input[type="file"]::-ms-browse:hover { background: #d01919; } input[type="file"].ui.red.file.input::-webkit-file-upload-button, .ui.red.file.input input[type="file"]::-webkit-file-upload-button { background: #db2828; color: #fff; } input[type="file"].ui.red.file.input::file-selector-button, .ui.red.file.input input[type="file"]::file-selector-button { background: #db2828; color: #fff; } input[type="file"].ui.red.file.input::-webkit-file-upload-button:hover, .ui.red.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #d01919; } input[type="file"].ui.red.file.input::file-selector-button:hover, .ui.red.file.input input[type="file"]::file-selector-button:hover { background: #d01919; } input[type="file"].ui.orange.file.input::-webkit-file-upload-button, .ui.orange.file.input input[type="file"]::-webkit-file-upload-button { background: #f2711c; color: #fff; } input[type="file"].ui.orange.file.input::-webkit-file-upload-button:hover, .ui.orange.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #f26202; } input[type="file"].ui.orange.file.input::-ms-browse, .ui.orange.file.input input[type="file"]::-ms-browse { background: #f2711c; color: #fff; } input[type="file"].ui.orange.file.input::-ms-browse:hover, .ui.orange.file.input input[type="file"]::-ms-browse:hover { background: #f26202; } input[type="file"].ui.orange.file.input::-webkit-file-upload-button, .ui.orange.file.input input[type="file"]::-webkit-file-upload-button { background: #f2711c; color: #fff; } input[type="file"].ui.orange.file.input::file-selector-button, .ui.orange.file.input input[type="file"]::file-selector-button { background: #f2711c; color: #fff; } input[type="file"].ui.orange.file.input::-webkit-file-upload-button:hover, .ui.orange.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #f26202; } input[type="file"].ui.orange.file.input::file-selector-button:hover, .ui.orange.file.input input[type="file"]::file-selector-button:hover { background: #f26202; } input[type="file"].ui.yellow.file.input::-webkit-file-upload-button, .ui.yellow.file.input input[type="file"]::-webkit-file-upload-button { background: #fbbd08; color: #fff; } input[type="file"].ui.yellow.file.input::-webkit-file-upload-button:hover, .ui.yellow.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #eaae00; } input[type="file"].ui.yellow.file.input::-ms-browse, .ui.yellow.file.input input[type="file"]::-ms-browse { background: #fbbd08; color: #fff; } input[type="file"].ui.yellow.file.input::-ms-browse:hover, .ui.yellow.file.input input[type="file"]::-ms-browse:hover { background: #eaae00; } input[type="file"].ui.yellow.file.input::-webkit-file-upload-button, .ui.yellow.file.input input[type="file"]::-webkit-file-upload-button { background: #fbbd08; color: #fff; } input[type="file"].ui.yellow.file.input::file-selector-button, .ui.yellow.file.input input[type="file"]::file-selector-button { background: #fbbd08; color: #fff; } input[type="file"].ui.yellow.file.input::-webkit-file-upload-button:hover, .ui.yellow.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #eaae00; } input[type="file"].ui.yellow.file.input::file-selector-button:hover, .ui.yellow.file.input input[type="file"]::file-selector-button:hover { background: #eaae00; } input[type="file"].ui.olive.file.input::-webkit-file-upload-button, .ui.olive.file.input input[type="file"]::-webkit-file-upload-button { background: #b5cc18; color: #fff; } input[type="file"].ui.olive.file.input::-webkit-file-upload-button:hover, .ui.olive.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #a7bd0d; } input[type="file"].ui.olive.file.input::-ms-browse, .ui.olive.file.input input[type="file"]::-ms-browse { background: #b5cc18; color: #fff; } input[type="file"].ui.olive.file.input::-ms-browse:hover, .ui.olive.file.input input[type="file"]::-ms-browse:hover { background: #a7bd0d; } input[type="file"].ui.olive.file.input::-webkit-file-upload-button, .ui.olive.file.input input[type="file"]::-webkit-file-upload-button { background: #b5cc18; color: #fff; } input[type="file"].ui.olive.file.input::file-selector-button, .ui.olive.file.input input[type="file"]::file-selector-button { background: #b5cc18; color: #fff; } input[type="file"].ui.olive.file.input::-webkit-file-upload-button:hover, .ui.olive.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #a7bd0d; } input[type="file"].ui.olive.file.input::file-selector-button:hover, .ui.olive.file.input input[type="file"]::file-selector-button:hover { background: #a7bd0d; } input[type="file"].ui.green.file.input::-webkit-file-upload-button, .ui.green.file.input input[type="file"]::-webkit-file-upload-button { background: #21ba45; color: #fff; } input[type="file"].ui.green.file.input::-webkit-file-upload-button:hover, .ui.green.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #16ab39; } input[type="file"].ui.green.file.input::-ms-browse, .ui.green.file.input input[type="file"]::-ms-browse { background: #21ba45; color: #fff; } input[type="file"].ui.green.file.input::-ms-browse:hover, .ui.green.file.input input[type="file"]::-ms-browse:hover { background: #16ab39; } input[type="file"].ui.green.file.input::-webkit-file-upload-button, .ui.green.file.input input[type="file"]::-webkit-file-upload-button { background: #21ba45; color: #fff; } input[type="file"].ui.green.file.input::file-selector-button, .ui.green.file.input input[type="file"]::file-selector-button { background: #21ba45; color: #fff; } input[type="file"].ui.green.file.input::-webkit-file-upload-button:hover, .ui.green.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #16ab39; } input[type="file"].ui.green.file.input::file-selector-button:hover, .ui.green.file.input input[type="file"]::file-selector-button:hover { background: #16ab39; } input[type="file"].ui.teal.file.input::-webkit-file-upload-button, .ui.teal.file.input input[type="file"]::-webkit-file-upload-button { background: #00b5ad; color: #fff; } input[type="file"].ui.teal.file.input::-webkit-file-upload-button:hover, .ui.teal.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #009c95; } input[type="file"].ui.teal.file.input::-ms-browse, .ui.teal.file.input input[type="file"]::-ms-browse { background: #00b5ad; color: #fff; } input[type="file"].ui.teal.file.input::-ms-browse:hover, .ui.teal.file.input input[type="file"]::-ms-browse:hover { background: #009c95; } input[type="file"].ui.teal.file.input::-webkit-file-upload-button, .ui.teal.file.input input[type="file"]::-webkit-file-upload-button { background: #00b5ad; color: #fff; } input[type="file"].ui.teal.file.input::file-selector-button, .ui.teal.file.input input[type="file"]::file-selector-button { background: #00b5ad; color: #fff; } input[type="file"].ui.teal.file.input::-webkit-file-upload-button:hover, .ui.teal.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #009c95; } input[type="file"].ui.teal.file.input::file-selector-button:hover, .ui.teal.file.input input[type="file"]::file-selector-button:hover { background: #009c95; } input[type="file"].ui.blue.file.input::-webkit-file-upload-button, .ui.blue.file.input input[type="file"]::-webkit-file-upload-button { background: #2185d0; color: #fff; } input[type="file"].ui.blue.file.input::-webkit-file-upload-button:hover, .ui.blue.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #1678c2; } input[type="file"].ui.blue.file.input::-ms-browse, .ui.blue.file.input input[type="file"]::-ms-browse { background: #2185d0; color: #fff; } input[type="file"].ui.blue.file.input::-ms-browse:hover, .ui.blue.file.input input[type="file"]::-ms-browse:hover { background: #1678c2; } input[type="file"].ui.blue.file.input::-webkit-file-upload-button, .ui.blue.file.input input[type="file"]::-webkit-file-upload-button { background: #2185d0; color: #fff; } input[type="file"].ui.blue.file.input::file-selector-button, .ui.blue.file.input input[type="file"]::file-selector-button { background: #2185d0; color: #fff; } input[type="file"].ui.blue.file.input::-webkit-file-upload-button:hover, .ui.blue.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #1678c2; } input[type="file"].ui.blue.file.input::file-selector-button:hover, .ui.blue.file.input input[type="file"]::file-selector-button:hover { background: #1678c2; } input[type="file"].ui.violet.file.input::-webkit-file-upload-button, .ui.violet.file.input input[type="file"]::-webkit-file-upload-button { background: #6435c9; color: #fff; } input[type="file"].ui.violet.file.input::-webkit-file-upload-button:hover, .ui.violet.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #5829bb; } input[type="file"].ui.violet.file.input::-ms-browse, .ui.violet.file.input input[type="file"]::-ms-browse { background: #6435c9; color: #fff; } input[type="file"].ui.violet.file.input::-ms-browse:hover, .ui.violet.file.input input[type="file"]::-ms-browse:hover { background: #5829bb; } input[type="file"].ui.violet.file.input::-webkit-file-upload-button, .ui.violet.file.input input[type="file"]::-webkit-file-upload-button { background: #6435c9; color: #fff; } input[type="file"].ui.violet.file.input::file-selector-button, .ui.violet.file.input input[type="file"]::file-selector-button { background: #6435c9; color: #fff; } input[type="file"].ui.violet.file.input::-webkit-file-upload-button:hover, .ui.violet.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #5829bb; } input[type="file"].ui.violet.file.input::file-selector-button:hover, .ui.violet.file.input input[type="file"]::file-selector-button:hover { background: #5829bb; } input[type="file"].ui.purple.file.input::-webkit-file-upload-button, .ui.purple.file.input input[type="file"]::-webkit-file-upload-button { background: #a333c8; color: #fff; } input[type="file"].ui.purple.file.input::-webkit-file-upload-button:hover, .ui.purple.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #9627ba; } input[type="file"].ui.purple.file.input::-ms-browse, .ui.purple.file.input input[type="file"]::-ms-browse { background: #a333c8; color: #fff; } input[type="file"].ui.purple.file.input::-ms-browse:hover, .ui.purple.file.input input[type="file"]::-ms-browse:hover { background: #9627ba; } input[type="file"].ui.purple.file.input::-webkit-file-upload-button, .ui.purple.file.input input[type="file"]::-webkit-file-upload-button { background: #a333c8; color: #fff; } input[type="file"].ui.purple.file.input::file-selector-button, .ui.purple.file.input input[type="file"]::file-selector-button { background: #a333c8; color: #fff; } input[type="file"].ui.purple.file.input::-webkit-file-upload-button:hover, .ui.purple.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #9627ba; } input[type="file"].ui.purple.file.input::file-selector-button:hover, .ui.purple.file.input input[type="file"]::file-selector-button:hover { background: #9627ba; } input[type="file"].ui.pink.file.input::-webkit-file-upload-button, .ui.pink.file.input input[type="file"]::-webkit-file-upload-button { background: #e03997; color: #fff; } input[type="file"].ui.pink.file.input::-webkit-file-upload-button:hover, .ui.pink.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #e61a8d; } input[type="file"].ui.pink.file.input::-ms-browse, .ui.pink.file.input input[type="file"]::-ms-browse { background: #e03997; color: #fff; } input[type="file"].ui.pink.file.input::-ms-browse:hover, .ui.pink.file.input input[type="file"]::-ms-browse:hover { background: #e61a8d; } input[type="file"].ui.pink.file.input::-webkit-file-upload-button, .ui.pink.file.input input[type="file"]::-webkit-file-upload-button { background: #e03997; color: #fff; } input[type="file"].ui.pink.file.input::file-selector-button, .ui.pink.file.input input[type="file"]::file-selector-button { background: #e03997; color: #fff; } input[type="file"].ui.pink.file.input::-webkit-file-upload-button:hover, .ui.pink.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #e61a8d; } input[type="file"].ui.pink.file.input::file-selector-button:hover, .ui.pink.file.input input[type="file"]::file-selector-button:hover { background: #e61a8d; } input[type="file"].ui.brown.file.input::-webkit-file-upload-button, .ui.brown.file.input input[type="file"]::-webkit-file-upload-button { background: #a5673f; color: #fff; } input[type="file"].ui.brown.file.input::-webkit-file-upload-button:hover, .ui.brown.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #975b33; } input[type="file"].ui.brown.file.input::-ms-browse, .ui.brown.file.input input[type="file"]::-ms-browse { background: #a5673f; color: #fff; } input[type="file"].ui.brown.file.input::-ms-browse:hover, .ui.brown.file.input input[type="file"]::-ms-browse:hover { background: #975b33; } input[type="file"].ui.brown.file.input::-webkit-file-upload-button, .ui.brown.file.input input[type="file"]::-webkit-file-upload-button { background: #a5673f; color: #fff; } input[type="file"].ui.brown.file.input::file-selector-button, .ui.brown.file.input input[type="file"]::file-selector-button { background: #a5673f; color: #fff; } input[type="file"].ui.brown.file.input::-webkit-file-upload-button:hover, .ui.brown.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #975b33; } input[type="file"].ui.brown.file.input::file-selector-button:hover, .ui.brown.file.input input[type="file"]::file-selector-button:hover { background: #975b33; } input[type="file"].ui.grey.file.input::-webkit-file-upload-button, .ui.grey.file.input input[type="file"]::-webkit-file-upload-button { background: #767676; color: #fff; } input[type="file"].ui.grey.file.input::-webkit-file-upload-button:hover, .ui.grey.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #838383; } input[type="file"].ui.grey.file.input::-ms-browse, .ui.grey.file.input input[type="file"]::-ms-browse { background: #767676; color: #fff; } input[type="file"].ui.grey.file.input::-ms-browse:hover, .ui.grey.file.input input[type="file"]::-ms-browse:hover { background: #838383; } input[type="file"].ui.grey.file.input::-webkit-file-upload-button, .ui.grey.file.input input[type="file"]::-webkit-file-upload-button { background: #767676; color: #fff; } input[type="file"].ui.grey.file.input::file-selector-button, .ui.grey.file.input input[type="file"]::file-selector-button { background: #767676; color: #fff; } input[type="file"].ui.grey.file.input::-webkit-file-upload-button:hover, .ui.grey.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #838383; } input[type="file"].ui.grey.file.input::file-selector-button:hover, .ui.grey.file.input input[type="file"]::file-selector-button:hover { background: #838383; } input[type="file"].ui.black.file.input::-webkit-file-upload-button, .ui.black.file.input input[type="file"]::-webkit-file-upload-button { background: #1b1c1d; color: #fff; } input[type="file"].ui.black.file.input::-webkit-file-upload-button:hover, .ui.black.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #27292a; } input[type="file"].ui.black.file.input::-ms-browse, .ui.black.file.input input[type="file"]::-ms-browse { background: #1b1c1d; color: #fff; } input[type="file"].ui.black.file.input::-ms-browse:hover, .ui.black.file.input input[type="file"]::-ms-browse:hover { background: #27292a; } input[type="file"].ui.black.file.input::-webkit-file-upload-button, .ui.black.file.input input[type="file"]::-webkit-file-upload-button { background: #1b1c1d; color: #fff; } input[type="file"].ui.black.file.input::file-selector-button, .ui.black.file.input input[type="file"]::file-selector-button { background: #1b1c1d; color: #fff; } input[type="file"].ui.black.file.input::-webkit-file-upload-button:hover, .ui.black.file.input input[type="file"]::-webkit-file-upload-button:hover { background: #27292a; } input[type="file"].ui.black.file.input::file-selector-button:hover, .ui.black.file.input input[type="file"]::file-selector-button:hover { background: #27292a; } /* -------------------- Size --------------------- */ .ui.input { font-size: 1em; } .ui.mini.input { font-size: 0.78571429em; } .ui.tiny.input { font-size: 0.85714286em; } .ui.small.input { font-size: 0.92857143em; } .ui.large.input { font-size: 1.14285714em; } .ui.big.input { font-size: 1.28571429em; } .ui.huge.input { font-size: 1.42857143em; } .ui.massive.input { font-size: 1.71428571em; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/item.css ================================================ /*! * # Fomantic-UI 2.9.4 - Item * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Standard *******************************/ /* -------------- Item --------------- */ .ui.items > .item { display: flex; margin: 1em 0; width: 100%; min-height: 0; background: transparent; padding: 0; border: none; border-radius: 0; box-shadow: none; transition: box-shadow 0.1s ease; z-index: ""; } .ui.items > .item a { cursor: pointer; } /* -------------- Items --------------- */ .ui.items { margin: 1.5em 0; } .ui.items:first-child { margin-top: 0 !important; } .ui.items:last-child { margin-bottom: 0 !important; } /* -------------- Item --------------- */ .ui.items > .item::after { display: block; content: " "; height: 0; clear: both; overflow: hidden; visibility: hidden; } .ui.items > .item:first-child { margin-top: 0; } .ui.items > .item:last-child { margin-bottom: 0; } /* -------------- Images --------------- */ .ui.items > .item > .image { position: relative; flex: 0 0 auto; display: block; float: none; margin: 0; padding: 0; max-height: ""; align-self: start; } .ui.items > .item > .image > img { display: block; width: 100%; height: auto; border-radius: 0.125rem; border: none; } .ui.items > .item > .image:only-child > img { border-radius: 0; } /* -------------- Content --------------- */ .ui.items > .item > .content { display: block; flex: 1 1 auto; background: none; color: rgba(0, 0, 0, 0.87); margin: 0; padding: 0; box-shadow: none; font-size: 1em; border: none; border-radius: 0; } .ui.items > .item > .content::after { display: block; content: " "; height: 0; clear: both; overflow: hidden; visibility: hidden; } .ui.items > .item > .image + .content { min-width: 0; width: auto; display: block; margin-left: 0; align-self: start; padding-left: 1.5em; } .ui.items > .item > .content > .header { display: inline-block; margin: -0.21425em 0 0; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-weight: bold; color: rgba(0, 0, 0, 0.85); } /* Default Header Size */ .ui.items > .item > .content > .header:not(.ui) { font-size: 1.28571429em; } /* -------------- Floated --------------- */ .ui.items > .item [class*="left floated"] { float: left; } .ui.items > .item [class*="right floated"] { float: right; } /* -------------- Content Image --------------- */ .ui.items > .item .content img { align-self: center; width: ""; } .ui.items > .item img.avatar, .ui.items > .item .avatar img { width: ""; height: ""; border-radius: 500rem; } /* -------------- Description --------------- */ .ui.items > .item > .content > .description { margin-top: 0.6em; max-width: none; font-size: 1em; line-height: 1.4285em; color: rgba(0, 0, 0, 0.87); } /* -------------- Paragraph --------------- */ .ui.items > .item > .content p { margin: 0 0 0.5em; } .ui.items > .item > .content p:last-child { margin-bottom: 0; } /* -------------- Meta --------------- */ .ui.items > .item .meta { margin: 0.5em 0 0.5em; font-size: 1em; line-height: 1em; color: rgba(0, 0, 0, 0.6); } .ui.items > .item .meta * { margin-right: 0.3em; } .ui.items > .item .meta :last-child { margin-right: 0; } .ui.items > .item .meta [class*="right floated"] { margin-right: 0; margin-left: 0.3em; } /* -------------- Links --------------- */ /* Generic */ .ui.items > .item > .content a:not(.ui) { color: ""; transition: color 0.1s ease; } .ui.items > .item > .content a:not(.ui):hover { color: ""; } /* Header */ .ui.items > .item > .content > a.header { color: rgba(0, 0, 0, 0.85); } .ui.items > .item > .content > a.header:hover { color: #1e70bf; } /* Meta */ .ui.items > .item .meta > a:not(.ui) { color: rgba(0, 0, 0, 0.4); } .ui.items > .item .meta > a:not(.ui):hover { color: rgba(0, 0, 0, 0.87); } /* -------------- Labels --------------- */ /* -----Star----- */ /* Icon */ .ui.items > .item > .content .favorite.icon { cursor: pointer; opacity: 0.75; transition: color 0.1s ease; } .ui.items > .item > .content .favorite.icon:hover { opacity: 1; color: #ffb70a; } .ui.items > .item > .content .active.favorite.icon { color: #ffe623; } /* -----Like----- */ /* Icon */ .ui.items > .item > .content .like.icon { cursor: pointer; opacity: 0.75; transition: color 0.1s ease; } .ui.items > .item > .content .like.icon:hover { opacity: 1; color: #ff2733; } .ui.items > .item > .content .active.like.icon { color: #ff2733; } /* ---------------- Extra Content ----------------- */ .ui.items > .item .extra { display: block; position: relative; background: none; margin: 0.5rem 0 0; width: 100%; padding: 0; top: 0; left: 0; color: rgba(0, 0, 0, 0.4); box-shadow: none; transition: color 0.1s ease; border-top: none; } .ui.items > .item .extra > * { margin: 0.25rem 0.5rem 0.25rem 0; } .ui.items > .item .extra > [class*="right floated"] { margin: 0.25rem 0 0.25rem 0.5rem; } .ui.items > .item .extra::after { display: block; content: " "; height: 0; clear: both; overflow: hidden; visibility: hidden; } /******************************* Responsive *******************************/ /* Default Image Width */ .ui.items > .item > .image:not(.ui) { width: 175px; } /* Tablet Only */ @media only screen and (min-width: 768px) and (max-width: 991.98px) { .ui.items > .item { margin: 1em 0; } .ui.items > .item > .image:not(.ui) { width: 150px; } .ui.items > .item > .image + .content { display: block; padding: 0 0 0 1em; } } /* Mobile Only */ @media only screen and (max-width: 767.98px) { .ui.items:not(.unstackable) > .item { flex-direction: column; margin: 2em 0; } .ui.items:not(.unstackable) > .item > .image { display: block; margin-left: auto; margin-right: auto; } .ui.items:not(.unstackable) > .item > .image, .ui.items:not(.unstackable) > .item > .image > img { max-width: 100% !important; width: auto !important; max-height: 250px !important; } .ui.items:not(.unstackable) > .item > .image + .content { display: block; padding: 1.5em 0 0; } } /******************************* Variations *******************************/ /* ------------------- Aligned -------------------- */ .ui.items > .item > .image + [class*="top aligned"].content { align-self: flex-start; } .ui.items > .item > .image + [class*="middle aligned"].content { align-self: center; } .ui.items > .item > .image + [class*="bottom aligned"].content { align-self: flex-end; } /* -------------- Relaxed --------------- */ .ui.relaxed.items > .item { margin: 1.5em 0; } .ui[class*="very relaxed"].items > .item { margin: 2em 0; } /* ------------------- Divided -------------------- */ .ui.divided.items > .item { border-top: 1px solid rgba(34, 36, 38, 0.15); margin: 0; padding: 1em 0; } .ui.divided.items > .item:first-child { border-top: none; margin-top: 0 !important; padding-top: 0 !important; } .ui.divided.items > .item:last-child { margin-bottom: 0 !important; padding-bottom: 0 !important; } /* Relaxed Divided */ .ui.relaxed.divided.items > .item { margin: 0; padding: 1.5em 0; } .ui[class*="very relaxed"].divided.items > .item { margin: 0; padding: 2em 0; } /* ------------------- Link -------------------- */ .ui.items a.item:hover, .ui.link.items > .item:hover { cursor: pointer; } .ui.items a.item:hover .content .header, .ui.link.items > .item:hover .content .header { color: #1e70bf; } /* -------------- Size --------------- */ .ui.items > .item { font-size: 1em; } .ui.mini.items > .item { font-size: 0.78571429em; } .ui.tiny.items > .item { font-size: 0.85714286em; } .ui.small.items > .item { font-size: 0.92857143em; } .ui.large.items > .item { font-size: 1.14285714em; } .ui.big.items > .item { font-size: 1.28571429em; } .ui.huge.items > .item { font-size: 1.42857143em; } .ui.massive.items > .item { font-size: 1.71428571em; } /* --------------- Unstackable ---------------- */ @media only screen and (max-width: 767.98px) { .ui.unstackable.items > .item > .image, .ui.unstackable.items > .item > .image > img { width: 125px !important; } } /* -------------- Inverted --------------- */ .ui.inverted.items > .item { background: transparent; } .ui.inverted.items > .item > .content { background: none; color: rgba(255, 255, 255, 0.9); } .ui.inverted.items > .item .extra { background: none; } .ui.inverted.items > .item > .content > .header { color: rgba(255, 255, 255, 0.9); } .ui.inverted.items > .item > .content > .description { color: rgba(255, 255, 255, 0.9); } .ui.inverted.items > .item .meta { color: rgba(255, 255, 255, 0.8); } .ui.inverted.items > .item > .content a:not(.ui) { color: #57a4ef; } .ui.inverted.items > .item > .content a:not(.ui):hover { color: #4183c4; } .ui.inverted.items > .item > .content > a.header { color: rgba(255, 255, 255, 0.9); } .ui.inverted.items > .item > .content > a.header:hover { color: #ffffff; } .ui.inverted.items > .item .meta > a:not(.ui) { color: rgba(255, 255, 255, 0.7); } .ui.inverted.items > .item .meta > a:not(.ui):hover { color: rgba(255, 255, 255, 0.9); } .ui.inverted.items > .item > .content .favorite.icon:hover { color: #ffc63d; } .ui.inverted.items > .item > .content .active.favorite.icon { color: #ffec56; } .ui.inverted.items > .item > .content .like.icon:hover { color: #ff5a63; } .ui.inverted.items > .item > .content .active.like.icon { color: #ff5a63; } .ui.inverted.items > .item .extra { color: rgba(255, 255, 255, 0.7); } .ui.inverted.items a.item:hover .content .header, .ui.inverted.link.items > .item:hover .content .header { color: #ffffff; } .ui.inverted.divided.items > .item { border-top: 1px solid rgba(255, 255, 255, 0.1); } .ui.inverted.divided.items > .item:first-child { border-top: none; } .ui.disabled.items, .ui.items > .disabled.item { opacity: 0.45; pointer-events: none; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/label.css ================================================ /*! * # Fomantic-UI 2.9.4 - Label * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Label *******************************/ .ui.label { display: inline-block; line-height: 1; vertical-align: baseline; margin: 0 0.14285714em; background-color: #e8e8e8; background-image: none; padding: 0.5833em 0.833em; color: rgba(0, 0, 0, 0.6); text-transform: none; font-weight: bold; border: 0 solid transparent; border-radius: 0.28571429rem; transition: background 0.1s ease; } .ui.label:first-child { margin-left: 0; } .ui.label:last-child { margin-right: 0; } /* Link */ a.ui.label { cursor: pointer; } /* Inside Link */ .ui.label > a { cursor: pointer; color: inherit; opacity: 0.5; transition: 0.1s opacity ease; } .ui.label > a:hover { opacity: 1; } /* Image */ .ui.label > img { width: auto !important; vertical-align: middle; height: 2.1666em; } /* Icon */ .ui.ui[class*="left icon"].label > .icon, .ui.label > .icon { width: auto; margin: 0 0.75em 0 0; } /* Detail */ .ui.label > .detail { display: inline-block; vertical-align: top; font-weight: bold; margin-left: 1em; opacity: 0.8; } .ui.label > .detail .icon { margin: 0 0.25em 0 0; } /* Removable label */ .ui.label > .close.icon, .ui.label > .delete.icon { cursor: pointer; font-size: 0.92857143em; opacity: 0.5; transition: background 0.1s ease; } .ui.label > .close.icon:hover, .ui.label > .delete.icon:hover { opacity: 1; } /* Backward compatible positioning */ .ui.label[class*="left icon"] > .close.icon, .ui.label[class*="left icon"] > .delete.icon { margin: 0 0.5em 0 0; } .ui.label[class*="left icon"] > .close.icon.right, .ui.label[class*="left icon"] > .delete.icon.right { margin: 0 0 0 0.5em; } .ui.label:not(.icon) > .close.icon, .ui.label:not(.icon) > .delete.icon { margin: 0 0 0 0.5em; } /* Label for only an icon */ .ui.icon.label > .icon { margin: 0 auto; } /* Right Side Icon */ .ui[class*="right icon"].label > .icon { margin: 0 0 0 0.75em; } /* ------------------- Group -------------------- */ .ui.labels > .label { margin: 0 0.5em 0.5em 0; } /* ------------------- Coupling -------------------- */ .ui.header > .ui.label { margin-top: -0.29165em; } /* Remove border radius on attached segment */ .ui.attached.segment > .ui.top.left.attached.label, .ui.bottom.attached.segment > .ui.top.left.attached.label { border-top-left-radius: 0; } .ui.attached.segment > .ui.top.right.attached.label, .ui.bottom.attached.segment > .ui.top.right.attached.label { border-top-right-radius: 0; } .ui.top.attached.segment > .ui.bottom.left.attached.label { border-bottom-left-radius: 0; } .ui.top.attached.segment > .ui.bottom.right.attached.label { border-bottom-right-radius: 0; } /* Padding on next content after a label */ .ui.top.attached.label ~ .ui.bottom.attached.label + :not(.attached), .ui.top.attached.label + :not(.attached) { margin-top: 2rem !important; } .ui.bottom.attached.label ~ :last-child:not(.attached) { margin-top: 0; margin-bottom: 2rem !important; } .ui.segment:not(.basic) > .ui.top.attached.label { margin-top: -1px; } .ui.segment:not(.basic) > .ui.bottom.attached.label { margin-bottom: -1px; } .ui.segment:not(.basic) > .ui.attached.label:not(.right) { margin-left: -1px; } .ui.segment:not(.basic) > .ui.right.attached.label { margin-right: -1px; } .ui.segment:not(.basic) > .ui.attached.label:not(.left):not(.right) { width: calc(100% + 2px); } /******************************* Types *******************************/ .ui.image.labels .label, .ui.image.label { width: auto; margin-top: 0; margin-bottom: 0; max-width: 9999px; vertical-align: baseline; text-transform: none; background: #e8e8e8; padding: 0.5833em 0.833em 0.5833em 0.5em; border-radius: 0.28571429rem; box-shadow: none; } .ui.image.labels .label.attached:not(.basic), .ui.image.label.attached:not(.basic) { padding: 0.5833em 0.833em 0.5833em 0.5em; } .ui.labels .image.label, .ui.image.labels .label { margin-bottom: 0.5em; } .ui.image.label img { display: inline-block; vertical-align: top; height: 2.1666em; margin: -0.5833em 0.5em -0.5833em -0.5em; border-radius: 0.28571429rem 0 0 0.28571429rem; } .ui.image.label .detail { background: rgba(0, 0, 0, 0.1); margin: -0.5833em -0.833em -0.5833em 0.5em; padding: 0.5833em 0.833em; border-radius: 0 0.28571429rem 0.28571429rem 0; } .ui.bottom.attached.image.label:not(.right) > img, .ui.top.right.attached.image.label > img { border-top-left-radius: 0; } .ui.top.attached.image.label:not(.right) > img, .ui.bottom.right.attached.image.label > img { border-bottom-left-radius: 0; } /* ------------------- Tag -------------------- */ .ui.tag.labels .label, .ui.tag.label { margin-left: 1em; position: relative; padding-left: 1.5em; padding-right: 1.5em; border-radius: 0 0.28571429rem 0.28571429rem 0; transition: none; } .ui.tag.labels .label::before, .ui.tag.label::before { position: absolute; transform: translateY(-50%) translateX(50%) rotate(-45deg); top: 50%; right: 100%; content: ""; background-color: inherit; background-image: none; width: 1.56em; height: 1.56em; transition: none; } .ui.tag.labels .label::after, .ui.tag.label::after { position: absolute; content: ""; top: 50%; left: -0.25em; margin-top: -0.25em; background-color: #fff; width: 0.5em; height: 0.5em; box-shadow: 0 -1px 1px 0 rgba(0, 0, 0, 0.3); border-radius: 500rem; } .ui.basic.tag.labels .label::before, .ui.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; right: calc(100% + 1px); } .ui.basic.tag.labels .label::after, .ui.basic.tag.label::after { box-shadow: 0 -1px 3px 0 rgba(0, 0, 0, 0.8); } /* ------------------- Corner Label -------------------- */ .ui.corner.label { position: absolute; top: 0; right: 0; margin: 0; padding: 0; text-align: center; border-color: #e8e8e8; width: 4em; height: 4em; z-index: 1; transition: border-color 0.1s ease; } /* Icon Label */ .ui.corner.label { background-color: transparent !important; } .ui.corner.label::after { position: absolute; content: ""; right: 0; top: 0; z-index: -1; width: 0; height: 0; background-color: transparent; border-top: 0 solid transparent; border-right: 4em solid transparent; border-bottom: 4em solid transparent; border-left: 0 solid transparent; border-right-color: inherit; transition: border-color 0.1s ease; } .ui.corner.label .icon { cursor: inherit; position: absolute; top: 0.64285714em; left: auto; right: 0.57142857em; font-size: 1.14285714em; margin: 0; } /* Left Corner */ .ui.left.corner.label, .ui.left.corner.label::after { right: auto; left: 0; } .ui.left.corner.label::after { border-top: 4em solid transparent; border-right: 4em solid transparent; border-bottom: 0 solid transparent; border-left: 0 solid transparent; border-top-color: inherit; } .ui.left.corner.label .icon { left: 0.57142857em; right: auto; } /* Segment */ .ui.segment > .ui.corner.label { top: -1px; right: -1px; } .ui.segment > .ui.left.corner.label { right: auto; left: -1px; } /* ------------------- Ribbon -------------------- */ .ui.ribbon.label { position: relative; margin: 0; min-width: max-content; border-radius: 0 0.28571429rem 0.28571429rem 0; border-color: rgba(0, 0, 0, 0.15); } .ui.ribbon.label::after { position: absolute; content: ""; top: 100%; left: 0; background-color: transparent; border-style: solid; border-width: 0 1.2em 1.2em 0; border-color: transparent; border-right-color: inherit; width: 0; height: 0; } /* Positioning */ .ui.ribbon.label { left: calc(-1rem - 1.2em); margin-right: -1.2em; padding-left: calc(1rem + 1.2em); padding-right: 1.2em; } .ui[class*="right ribbon"].label { left: calc(100% + 1rem + 1.2em); padding-left: 1.2em; padding-right: calc(1rem + 1.2em); } .ui.basic.ribbon.label { padding-top: calc(0.5833em - 1px); padding-bottom: calc(0.5833em - 1px); } .ui.basic.ribbon.label:not([class*="right ribbon"]) { padding-left: calc(1rem + 1.2em - 1px); padding-right: calc(1.2em - 1px); } .ui.basic[class*="right ribbon"].label { padding-left: calc(1.2em - 1px); padding-right: calc(1rem + 1.2em - 1px); } .ui.basic.ribbon.label::after { top: calc(100% + 1px); } .ui.basic.ribbon.label:not([class*="right ribbon"])::after { left: -1px; } .ui.basic[class*="right ribbon"].label::after { right: -1px; } /* Right Ribbon */ .ui[class*="right ribbon"].label { text-align: left; transform: translateX(-100%); border-radius: 0.28571429rem 0 0 0.28571429rem; } .ui[class*="right ribbon"].label::after { left: auto; right: 0; border-style: solid; border-width: 1.2em 1.2em 0 0; border-color: transparent; border-top-color: inherit; } .ui.ui.center.ribbon.label { top: calc(50% - 1em); z-index: 1; } .ui.bottom.ribbon.label::after { bottom: 100%; top: auto; border-width: 1.2em 1.2em 0 0; } .ui.bottom[class*="right ribbon"].label::after { border-width: 1.2em 0 0 1.2em; border-color: transparent; border-left-color: inherit; } /* Inside Image */ .ui.image > .ribbon.label, .ui.card .image > .ribbon.label { position: absolute; top: 1rem; } .ui.card .image > .ui.ribbon.label, .ui.image > .ui.ribbon.label { left: calc(0.05rem - 1.2em); } .ui.card .image > .ui[class*="right ribbon"].label, .ui.image > .ui[class*="right ribbon"].label { left: calc(100% + -0.05rem + 1.2em); padding-left: 0.833em; } .ui.card .image > .ui.bottom.ribbon.label, .ui.image > .ui.bottom.ribbon.label { bottom: 1rem; top: auto; } /* Inside Table */ .ui.table td > .ui.ribbon.label { left: calc(-1em - 1.2em); } .ui.table td > .ui[class*="right ribbon"].label { left: calc(100% + 1em + 1.2em); padding-left: 0.833em; } /* ------------------- Attached -------------------- */ .ui[class*="top attached"].label, .ui.attached.label { width: 100%; position: absolute; margin: 0; top: 0; left: 0; padding: 0.75em 1em; border-radius: 0.21428571rem 0.21428571rem 0 0; } .ui[class*="bottom attached"].label { top: auto; bottom: 0; border-radius: 0 0 0.21428571rem 0.21428571rem; } .ui[class*="top left attached"].label { width: auto; margin-top: 0; border-radius: 0.21428571rem 0 0.28571429rem 0; } .ui[class*="top right attached"].label { width: auto; left: auto; right: 0; border-radius: 0 0.21428571rem 0 0.28571429rem; } .ui[class*="bottom left attached"].label { width: auto; top: auto; bottom: 0; border-radius: 0 0.28571429rem 0 0.21428571rem; } .ui[class*="bottom right attached"].label { top: auto; bottom: 0; left: auto; right: 0; width: auto; border-radius: 0.28571429rem 0 0.21428571rem 0; } /******************************* States *******************************/ /* ------------------- Disabled -------------------- */ .ui.disabled.labels .label, .ui.label.disabled { opacity: 0.45; pointer-events: none; } /* ------------------- Hover -------------------- */ .ui.labels a.label:hover, a.ui.label:hover { background-color: #e0e0e0; border-color: #e0e0e0; background-image: none; color: rgba(0, 0, 0, 0.8); } .ui.labels a.label:hover::before, a.ui.label:hover::before { color: rgba(0, 0, 0, 0.8); } /* ------------------- Active -------------------- */ .ui.active.label { background-color: #d0d0d0; border-color: #d0d0d0; background-image: none; color: rgba(0, 0, 0, 0.95); } .ui.active.label::before { background-color: #d0d0d0; background-image: none; color: rgba(0, 0, 0, 0.95); } /* ------------------- Active Hover -------------------- */ .ui.labels a.active.label:hover, a.ui.active.label:hover { background-color: #c8c8c8; border-color: #c8c8c8; background-image: none; color: rgba(0, 0, 0, 0.95); } .ui.labels a.active.label:hover::before, a.ui.active.label:hover::before { background-color: #c8c8c8; background-image: none; color: rgba(0, 0, 0, 0.95); } /* ------------------- Visible -------------------- */ .ui.labels.visible .label, .ui.label.visible:not(.dropdown) { display: inline-block !important; } /* ------------------- Hidden -------------------- */ .ui.labels.hidden .label, .ui.label.hidden { display: none !important; } /******************************* Variations *******************************/ /* ------------------- Basic -------------------- */ .ui.basic.labels .label, .ui.basic.label { background: none #fff; border: 1px solid rgba(34, 36, 38, 0.15); color: rgba(0, 0, 0, 0.87); box-shadow: none; padding-top: calc(0.5833em - 1px); padding-bottom: calc(0.5833em - 1px); padding-right: calc(0.833em - 1px); } .ui.basic.labels:not(.tag):not(.image):not(.ribbon) .label, .ui.basic.label:not(.tag):not(.image):not(.ribbon) { padding-left: calc(0.833em - 1px); } .ui.basic.image.label { padding-left: calc(0.5em - 1px); } /* Link */ .ui.basic.labels a.label:hover, a.ui.basic.label:hover { text-decoration: none; background: none #fff; color: #1e70bf; box-shadow: none; } /* Pointing */ .ui.basic.pointing.label::before { border-color: inherit; } /* ------------------- Fluid -------------------- */ .ui.label.fluid, .ui.fluid.labels > .label { width: 100%; box-sizing: border-box; } .ui.centered.labels .label, .ui.centered.label { text-align: center; } /* ------------------- Inverted -------------------- */ .ui.inverted.labels .label, .ui.inverted.label { color: rgba(255, 255, 255, 0.9); background-color: #b5b5b5; } .ui.inverted.corner.label { border-color: #b5b5b5; } .ui.inverted.corner.label:hover { border-color: #e8e8e8; transition: none; } .ui.inverted.basic.labels .label, .ui.inverted.basic.label, .ui.inverted.basic.label:hover { border-color: rgba(255, 255, 255, 0.5); background: #1b1c1d; } .ui.inverted.basic.label:hover { color: #4183c4; } /* ------------------- Colors -------------------- */ .ui.primary.labels .label, .ui.ui.ui.primary.label { background-color: #2185d0; border-color: #2185d0; color: rgba(255, 255, 255, 0.9); } /* Link */ .ui.primary.labels a.label:hover, a.ui.ui.ui.primary.label:hover { background-color: #1678c2; border-color: #1678c2; color: #fff; } /* Ribbon */ .ui.ui.ui.primary.ribbon.label { border-color: #1a69a4; } /* Basic */ .ui.basic.labels .primary.label, .ui.ui.ui.basic.primary.label { background: none #fff; border-color: #2185d0; color: #2185d0; } .ui.basic.labels a.primary.label:hover, a.ui.ui.ui.basic.primary.label:hover { background: none #fff; border-color: #1678c2; color: #1678c2; } /* Inverted */ .ui.inverted.labels .primary.label, .ui.ui.ui.inverted.primary.label { background-color: #54c8ff; border-color: #54c8ff; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.primary.label:hover, a.ui.ui.ui.inverted.primary.label:hover { background-color: #21b8ff; border-color: #21b8ff; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.primary.ribbon.label { border-color: #21b8ff; } /* Inverted Basic */ .ui.inverted.basic.labels .primary.label, .ui.ui.ui.inverted.basic.primary.label { background-color: #1b1c1d; border-color: #54c8ff; color: #54c8ff; } .ui.inverted.basic.labels a.primary.label:hover, a.ui.ui.ui.inverted.basic.primary.label:hover { border-color: #21b8ff; background-color: #1b1c1d; color: #21b8ff; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .primary.label, .ui.ui.ui.inverted.primary.basic.tag.label { border: 1px solid #54c8ff; } .ui.inverted.basic.tag.labels .primary.label::before, .ui.ui.ui.inverted.primary.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.secondary.labels .label, .ui.ui.ui.secondary.label { background-color: #1b1c1d; border-color: #1b1c1d; color: rgba(255, 255, 255, 0.9); } /* Link */ .ui.secondary.labels a.label:hover, a.ui.ui.ui.secondary.label:hover { background-color: #27292a; border-color: #27292a; color: #fff; } /* Ribbon */ .ui.ui.ui.secondary.ribbon.label { border-color: #020203; } /* Basic */ .ui.basic.labels .secondary.label, .ui.ui.ui.basic.secondary.label { background: none #fff; border-color: #1b1c1d; color: #1b1c1d; } .ui.basic.labels a.secondary.label:hover, a.ui.ui.ui.basic.secondary.label:hover { background: none #fff; border-color: #27292a; color: #27292a; } /* Inverted */ .ui.inverted.labels .secondary.label, .ui.ui.ui.inverted.secondary.label { background-color: #545454; border-color: #545454; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.secondary.label:hover, a.ui.ui.ui.inverted.secondary.label:hover { background-color: #6e6e6e; border-color: #6e6e6e; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.secondary.ribbon.label { border-color: #3b3b3b; } /* Inverted Basic */ .ui.inverted.basic.labels .secondary.label, .ui.ui.ui.inverted.basic.secondary.label { background-color: #1b1c1d; border-color: #545454; color: #545454; } .ui.inverted.basic.labels a.secondary.label:hover, a.ui.ui.ui.inverted.basic.secondary.label:hover { border-color: #6e6e6e; background-color: #1b1c1d; color: #6e6e6e; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .secondary.label, .ui.ui.ui.inverted.secondary.basic.tag.label { border: 1px solid #545454; } .ui.inverted.basic.tag.labels .secondary.label::before, .ui.ui.ui.inverted.secondary.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.red.labels .label, .ui.ui.ui.red.label { background-color: #db2828; border-color: #db2828; color: #fff; } /* Link */ .ui.red.labels a.label:hover, a.ui.ui.ui.red.label:hover { background-color: #d01919; border-color: #d01919; color: #fff; } /* Ribbon */ .ui.ui.ui.red.ribbon.label { border-color: #b21e1e; } /* Basic */ .ui.basic.labels .red.label, .ui.ui.ui.basic.red.label { background: none #fff; border-color: #db2828; color: #db2828; } .ui.basic.labels a.red.label:hover, a.ui.ui.ui.basic.red.label:hover { background: none #fff; border-color: #d01919; color: #d01919; } /* Inverted */ .ui.inverted.labels .red.label, .ui.ui.ui.inverted.red.label { background-color: #ff695e; border-color: #ff695e; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.red.label:hover, a.ui.ui.ui.inverted.red.label:hover { background-color: #ff392b; border-color: #ff392b; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.red.ribbon.label { border-color: #ff392b; } /* Inverted Basic */ .ui.inverted.basic.labels .red.label, .ui.ui.ui.inverted.basic.red.label { background-color: #1b1c1d; border-color: #ff695e; color: #ff695e; } .ui.inverted.basic.labels a.red.label:hover, a.ui.ui.ui.inverted.basic.red.label:hover { border-color: #ff392b; background-color: #1b1c1d; color: #ff392b; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .red.label, .ui.ui.ui.inverted.red.basic.tag.label { border: 1px solid #ff695e; } .ui.inverted.basic.tag.labels .red.label::before, .ui.ui.ui.inverted.red.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.orange.labels .label, .ui.ui.ui.orange.label { background-color: #f2711c; border-color: #f2711c; color: #fff; } /* Link */ .ui.orange.labels a.label:hover, a.ui.ui.ui.orange.label:hover { background-color: #f26202; border-color: #f26202; color: #fff; } /* Ribbon */ .ui.ui.ui.orange.ribbon.label { border-color: #cf590c; } /* Basic */ .ui.basic.labels .orange.label, .ui.ui.ui.basic.orange.label { background: none #fff; border-color: #f2711c; color: #f2711c; } .ui.basic.labels a.orange.label:hover, a.ui.ui.ui.basic.orange.label:hover { background: none #fff; border-color: #f26202; color: #f26202; } /* Inverted */ .ui.inverted.labels .orange.label, .ui.ui.ui.inverted.orange.label { background-color: #ff851b; border-color: #ff851b; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.orange.label:hover, a.ui.ui.ui.inverted.orange.label:hover { background-color: #e76b00; border-color: #e76b00; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.orange.ribbon.label { border-color: #e76b00; } /* Inverted Basic */ .ui.inverted.basic.labels .orange.label, .ui.ui.ui.inverted.basic.orange.label { background-color: #1b1c1d; border-color: #ff851b; color: #ff851b; } .ui.inverted.basic.labels a.orange.label:hover, a.ui.ui.ui.inverted.basic.orange.label:hover { border-color: #e76b00; background-color: #1b1c1d; color: #e76b00; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .orange.label, .ui.ui.ui.inverted.orange.basic.tag.label { border: 1px solid #ff851b; } .ui.inverted.basic.tag.labels .orange.label::before, .ui.ui.ui.inverted.orange.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.yellow.labels .label, .ui.ui.ui.yellow.label { background-color: #fbbd08; border-color: #fbbd08; color: #fff; } /* Link */ .ui.yellow.labels a.label:hover, a.ui.ui.ui.yellow.label:hover { background-color: #eaae00; border-color: #eaae00; color: #fff; } /* Ribbon */ .ui.ui.ui.yellow.ribbon.label { border-color: #cd9903; } /* Basic */ .ui.basic.labels .yellow.label, .ui.ui.ui.basic.yellow.label { background: none #fff; border-color: #fbbd08; color: #fbbd08; } .ui.basic.labels a.yellow.label:hover, a.ui.ui.ui.basic.yellow.label:hover { background: none #fff; border-color: #eaae00; color: #eaae00; } /* Inverted */ .ui.inverted.labels .yellow.label, .ui.ui.ui.inverted.yellow.label { background-color: #ffe21f; border-color: #ffe21f; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.yellow.label:hover, a.ui.ui.ui.inverted.yellow.label:hover { background-color: #ebcd00; border-color: #ebcd00; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.yellow.ribbon.label { border-color: #ebcd00; } /* Inverted Basic */ .ui.inverted.basic.labels .yellow.label, .ui.ui.ui.inverted.basic.yellow.label { background-color: #1b1c1d; border-color: #ffe21f; color: #ffe21f; } .ui.inverted.basic.labels a.yellow.label:hover, a.ui.ui.ui.inverted.basic.yellow.label:hover { border-color: #ebcd00; background-color: #1b1c1d; color: #ebcd00; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .yellow.label, .ui.ui.ui.inverted.yellow.basic.tag.label { border: 1px solid #ffe21f; } .ui.inverted.basic.tag.labels .yellow.label::before, .ui.ui.ui.inverted.yellow.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.olive.labels .label, .ui.ui.ui.olive.label { background-color: #b5cc18; border-color: #b5cc18; color: #fff; } /* Link */ .ui.olive.labels a.label:hover, a.ui.ui.ui.olive.label:hover { background-color: #a7bd0d; border-color: #a7bd0d; color: #fff; } /* Ribbon */ .ui.ui.ui.olive.ribbon.label { border-color: #8d9e13; } /* Basic */ .ui.basic.labels .olive.label, .ui.ui.ui.basic.olive.label { background: none #fff; border-color: #b5cc18; color: #b5cc18; } .ui.basic.labels a.olive.label:hover, a.ui.ui.ui.basic.olive.label:hover { background: none #fff; border-color: #a7bd0d; color: #a7bd0d; } /* Inverted */ .ui.inverted.labels .olive.label, .ui.ui.ui.inverted.olive.label { background-color: #d9e778; border-color: #d9e778; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.olive.label:hover, a.ui.ui.ui.inverted.olive.label:hover { background-color: #d2e745; border-color: #d2e745; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.olive.ribbon.label { border-color: #cddf4d; } /* Inverted Basic */ .ui.inverted.basic.labels .olive.label, .ui.ui.ui.inverted.basic.olive.label { background-color: #1b1c1d; border-color: #d9e778; color: #d9e778; } .ui.inverted.basic.labels a.olive.label:hover, a.ui.ui.ui.inverted.basic.olive.label:hover { border-color: #d2e745; background-color: #1b1c1d; color: #d2e745; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .olive.label, .ui.ui.ui.inverted.olive.basic.tag.label { border: 1px solid #d9e778; } .ui.inverted.basic.tag.labels .olive.label::before, .ui.ui.ui.inverted.olive.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.green.labels .label, .ui.ui.ui.green.label { background-color: #21ba45; border-color: #21ba45; color: #fff; } /* Link */ .ui.green.labels a.label:hover, a.ui.ui.ui.green.label:hover { background-color: #16ab39; border-color: #16ab39; color: #fff; } /* Ribbon */ .ui.ui.ui.green.ribbon.label { border-color: #198f35; } /* Basic */ .ui.basic.labels .green.label, .ui.ui.ui.basic.green.label { background: none #fff; border-color: #21ba45; color: #21ba45; } .ui.basic.labels a.green.label:hover, a.ui.ui.ui.basic.green.label:hover { background: none #fff; border-color: #16ab39; color: #16ab39; } /* Inverted */ .ui.inverted.labels .green.label, .ui.ui.ui.inverted.green.label { background-color: #2ecc40; border-color: #2ecc40; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.green.label:hover, a.ui.ui.ui.inverted.green.label:hover { background-color: #1ea92e; border-color: #1ea92e; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.green.ribbon.label { border-color: #25a233; } /* Inverted Basic */ .ui.inverted.basic.labels .green.label, .ui.ui.ui.inverted.basic.green.label { background-color: #1b1c1d; border-color: #2ecc40; color: #2ecc40; } .ui.inverted.basic.labels a.green.label:hover, a.ui.ui.ui.inverted.basic.green.label:hover { border-color: #1ea92e; background-color: #1b1c1d; color: #1ea92e; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .green.label, .ui.ui.ui.inverted.green.basic.tag.label { border: 1px solid #2ecc40; } .ui.inverted.basic.tag.labels .green.label::before, .ui.ui.ui.inverted.green.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.teal.labels .label, .ui.ui.ui.teal.label { background-color: #00b5ad; border-color: #00b5ad; color: #fff; } /* Link */ .ui.teal.labels a.label:hover, a.ui.ui.ui.teal.label:hover { background-color: #009c95; border-color: #009c95; color: #fff; } /* Ribbon */ .ui.ui.ui.teal.ribbon.label { border-color: #00827c; } /* Basic */ .ui.basic.labels .teal.label, .ui.ui.ui.basic.teal.label { background: none #fff; border-color: #00b5ad; color: #00b5ad; } .ui.basic.labels a.teal.label:hover, a.ui.ui.ui.basic.teal.label:hover { background: none #fff; border-color: #009c95; color: #009c95; } /* Inverted */ .ui.inverted.labels .teal.label, .ui.ui.ui.inverted.teal.label { background-color: #6dffff; border-color: #6dffff; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.teal.label:hover, a.ui.ui.ui.inverted.teal.label:hover { background-color: #3affff; border-color: #3affff; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.teal.ribbon.label { border-color: #3affff; } /* Inverted Basic */ .ui.inverted.basic.labels .teal.label, .ui.ui.ui.inverted.basic.teal.label { background-color: #1b1c1d; border-color: #6dffff; color: #6dffff; } .ui.inverted.basic.labels a.teal.label:hover, a.ui.ui.ui.inverted.basic.teal.label:hover { border-color: #3affff; background-color: #1b1c1d; color: #3affff; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .teal.label, .ui.ui.ui.inverted.teal.basic.tag.label { border: 1px solid #6dffff; } .ui.inverted.basic.tag.labels .teal.label::before, .ui.ui.ui.inverted.teal.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.blue.labels .label, .ui.ui.ui.blue.label { background-color: #2185d0; border-color: #2185d0; color: #fff; } /* Link */ .ui.blue.labels a.label:hover, a.ui.ui.ui.blue.label:hover { background-color: #1678c2; border-color: #1678c2; color: #fff; } /* Ribbon */ .ui.ui.ui.blue.ribbon.label { border-color: #1a69a4; } /* Basic */ .ui.basic.labels .blue.label, .ui.ui.ui.basic.blue.label { background: none #fff; border-color: #2185d0; color: #2185d0; } .ui.basic.labels a.blue.label:hover, a.ui.ui.ui.basic.blue.label:hover { background: none #fff; border-color: #1678c2; color: #1678c2; } /* Inverted */ .ui.inverted.labels .blue.label, .ui.ui.ui.inverted.blue.label { background-color: #54c8ff; border-color: #54c8ff; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.blue.label:hover, a.ui.ui.ui.inverted.blue.label:hover { background-color: #21b8ff; border-color: #21b8ff; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.blue.ribbon.label { border-color: #21b8ff; } /* Inverted Basic */ .ui.inverted.basic.labels .blue.label, .ui.ui.ui.inverted.basic.blue.label { background-color: #1b1c1d; border-color: #54c8ff; color: #54c8ff; } .ui.inverted.basic.labels a.blue.label:hover, a.ui.ui.ui.inverted.basic.blue.label:hover { border-color: #21b8ff; background-color: #1b1c1d; color: #21b8ff; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .blue.label, .ui.ui.ui.inverted.blue.basic.tag.label { border: 1px solid #54c8ff; } .ui.inverted.basic.tag.labels .blue.label::before, .ui.ui.ui.inverted.blue.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.violet.labels .label, .ui.ui.ui.violet.label { background-color: #6435c9; border-color: #6435c9; color: #fff; } /* Link */ .ui.violet.labels a.label:hover, a.ui.ui.ui.violet.label:hover { background-color: #5829bb; border-color: #5829bb; color: #fff; } /* Ribbon */ .ui.ui.ui.violet.ribbon.label { border-color: #502aa1; } /* Basic */ .ui.basic.labels .violet.label, .ui.ui.ui.basic.violet.label { background: none #fff; border-color: #6435c9; color: #6435c9; } .ui.basic.labels a.violet.label:hover, a.ui.ui.ui.basic.violet.label:hover { background: none #fff; border-color: #5829bb; color: #5829bb; } /* Inverted */ .ui.inverted.labels .violet.label, .ui.ui.ui.inverted.violet.label { background-color: #a291fb; border-color: #a291fb; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.violet.label:hover, a.ui.ui.ui.inverted.violet.label:hover { background-color: #745aff; border-color: #745aff; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.violet.ribbon.label { border-color: #7860f9; } /* Inverted Basic */ .ui.inverted.basic.labels .violet.label, .ui.ui.ui.inverted.basic.violet.label { background-color: #1b1c1d; border-color: #a291fb; color: #a291fb; } .ui.inverted.basic.labels a.violet.label:hover, a.ui.ui.ui.inverted.basic.violet.label:hover { border-color: #745aff; background-color: #1b1c1d; color: #745aff; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .violet.label, .ui.ui.ui.inverted.violet.basic.tag.label { border: 1px solid #a291fb; } .ui.inverted.basic.tag.labels .violet.label::before, .ui.ui.ui.inverted.violet.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.purple.labels .label, .ui.ui.ui.purple.label { background-color: #a333c8; border-color: #a333c8; color: #fff; } /* Link */ .ui.purple.labels a.label:hover, a.ui.ui.ui.purple.label:hover { background-color: #9627ba; border-color: #9627ba; color: #fff; } /* Ribbon */ .ui.ui.ui.purple.ribbon.label { border-color: #82299f; } /* Basic */ .ui.basic.labels .purple.label, .ui.ui.ui.basic.purple.label { background: none #fff; border-color: #a333c8; color: #a333c8; } .ui.basic.labels a.purple.label:hover, a.ui.ui.ui.basic.purple.label:hover { background: none #fff; border-color: #9627ba; color: #9627ba; } /* Inverted */ .ui.inverted.labels .purple.label, .ui.ui.ui.inverted.purple.label { background-color: #dc73ff; border-color: #dc73ff; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.purple.label:hover, a.ui.ui.ui.inverted.purple.label:hover { background-color: #cf40ff; border-color: #cf40ff; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.purple.ribbon.label { border-color: #cf40ff; } /* Inverted Basic */ .ui.inverted.basic.labels .purple.label, .ui.ui.ui.inverted.basic.purple.label { background-color: #1b1c1d; border-color: #dc73ff; color: #dc73ff; } .ui.inverted.basic.labels a.purple.label:hover, a.ui.ui.ui.inverted.basic.purple.label:hover { border-color: #cf40ff; background-color: #1b1c1d; color: #cf40ff; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .purple.label, .ui.ui.ui.inverted.purple.basic.tag.label { border: 1px solid #dc73ff; } .ui.inverted.basic.tag.labels .purple.label::before, .ui.ui.ui.inverted.purple.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.pink.labels .label, .ui.ui.ui.pink.label { background-color: #e03997; border-color: #e03997; color: #fff; } /* Link */ .ui.pink.labels a.label:hover, a.ui.ui.ui.pink.label:hover { background-color: #e61a8d; border-color: #e61a8d; color: #fff; } /* Ribbon */ .ui.ui.ui.pink.ribbon.label { border-color: #c71f7e; } /* Basic */ .ui.basic.labels .pink.label, .ui.ui.ui.basic.pink.label { background: none #fff; border-color: #e03997; color: #e03997; } .ui.basic.labels a.pink.label:hover, a.ui.ui.ui.basic.pink.label:hover { background: none #fff; border-color: #e61a8d; color: #e61a8d; } /* Inverted */ .ui.inverted.labels .pink.label, .ui.ui.ui.inverted.pink.label { background-color: #ff8edf; border-color: #ff8edf; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.pink.label:hover, a.ui.ui.ui.inverted.pink.label:hover { background-color: #ff5bd1; border-color: #ff5bd1; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.pink.ribbon.label { border-color: #ff5bd1; } /* Inverted Basic */ .ui.inverted.basic.labels .pink.label, .ui.ui.ui.inverted.basic.pink.label { background-color: #1b1c1d; border-color: #ff8edf; color: #ff8edf; } .ui.inverted.basic.labels a.pink.label:hover, a.ui.ui.ui.inverted.basic.pink.label:hover { border-color: #ff5bd1; background-color: #1b1c1d; color: #ff5bd1; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .pink.label, .ui.ui.ui.inverted.pink.basic.tag.label { border: 1px solid #ff8edf; } .ui.inverted.basic.tag.labels .pink.label::before, .ui.ui.ui.inverted.pink.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.brown.labels .label, .ui.ui.ui.brown.label { background-color: #a5673f; border-color: #a5673f; color: #fff; } /* Link */ .ui.brown.labels a.label:hover, a.ui.ui.ui.brown.label:hover { background-color: #975b33; border-color: #975b33; color: #fff; } /* Ribbon */ .ui.ui.ui.brown.ribbon.label { border-color: #805031; } /* Basic */ .ui.basic.labels .brown.label, .ui.ui.ui.basic.brown.label { background: none #fff; border-color: #a5673f; color: #a5673f; } .ui.basic.labels a.brown.label:hover, a.ui.ui.ui.basic.brown.label:hover { background: none #fff; border-color: #975b33; color: #975b33; } /* Inverted */ .ui.inverted.labels .brown.label, .ui.ui.ui.inverted.brown.label { background-color: #d67c1c; border-color: #d67c1c; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.brown.label:hover, a.ui.ui.ui.inverted.brown.label:hover { background-color: #b0620f; border-color: #b0620f; color: #1b1c1d; } /* Inverted Ribbon */ .ui.ui.ui.inverted.brown.ribbon.label { border-color: #a96216; } /* Inverted Basic */ .ui.inverted.basic.labels .brown.label, .ui.ui.ui.inverted.basic.brown.label { background-color: #1b1c1d; border-color: #d67c1c; color: #d67c1c; } .ui.inverted.basic.labels a.brown.label:hover, a.ui.ui.ui.inverted.basic.brown.label:hover { border-color: #b0620f; background-color: #1b1c1d; color: #b0620f; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .brown.label, .ui.ui.ui.inverted.brown.basic.tag.label { border: 1px solid #d67c1c; } .ui.inverted.basic.tag.labels .brown.label::before, .ui.ui.ui.inverted.brown.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.grey.labels .label, .ui.ui.ui.grey.label { background-color: #767676; border-color: #767676; color: #fff; } /* Link */ .ui.grey.labels a.label:hover, a.ui.ui.ui.grey.label:hover { background-color: #838383; border-color: #838383; color: #fff; } /* Ribbon */ .ui.ui.ui.grey.ribbon.label { border-color: #5d5d5d; } /* Basic */ .ui.basic.labels .grey.label, .ui.ui.ui.basic.grey.label { background: none #fff; border-color: #767676; color: #767676; } .ui.basic.labels a.grey.label:hover, a.ui.ui.ui.basic.grey.label:hover { background: none #fff; border-color: #838383; color: #838383; } /* Inverted */ .ui.inverted.labels .grey.label, .ui.ui.ui.inverted.grey.label { background-color: #dcddde; border-color: #dcddde; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.grey.label:hover, a.ui.ui.ui.inverted.grey.label:hover { background-color: #c2c4c5; border-color: #c2c4c5; color: #fff; } /* Inverted Ribbon */ .ui.ui.ui.inverted.grey.ribbon.label { border-color: #e9eaea; } /* Inverted Basic */ .ui.inverted.basic.labels .grey.label, .ui.ui.ui.inverted.basic.grey.label { background-color: #1b1c1d; border-color: #dcddde; color: rgba(255, 255, 255, 0.9); } .ui.inverted.basic.labels a.grey.label:hover, a.ui.ui.ui.inverted.basic.grey.label:hover { border-color: #c2c4c5; background-color: #1b1c1d; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .grey.label, .ui.ui.ui.inverted.grey.basic.tag.label { border: 1px solid #dcddde; } .ui.inverted.basic.tag.labels .grey.label::before, .ui.ui.ui.inverted.grey.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } .ui.black.labels .label, .ui.ui.ui.black.label { background-color: #1b1c1d; border-color: #1b1c1d; color: #fff; } /* Link */ .ui.black.labels a.label:hover, a.ui.ui.ui.black.label:hover { background-color: #27292a; border-color: #27292a; color: #fff; } /* Ribbon */ .ui.ui.ui.black.ribbon.label { border-color: #020203; } /* Basic */ .ui.basic.labels .black.label, .ui.ui.ui.basic.black.label { background: none #fff; border-color: #1b1c1d; color: #1b1c1d; } .ui.basic.labels a.black.label:hover, a.ui.ui.ui.basic.black.label:hover { background: none #fff; border-color: #27292a; color: #27292a; } /* Inverted */ .ui.inverted.labels .black.label, .ui.ui.ui.inverted.black.label { background-color: #545454; border-color: #545454; color: #1b1c1d; } /* Inverted Link */ .ui.inverted.labels a.black.label:hover, a.ui.ui.ui.inverted.black.label:hover { background-color: #000000; border-color: #000000; color: #fff; } /* Inverted Ribbon */ .ui.ui.ui.inverted.black.ribbon.label { border-color: #616161; } /* Inverted Basic */ .ui.inverted.basic.labels .black.label, .ui.ui.ui.inverted.basic.black.label { background-color: #1b1c1d; border-color: #545454; color: rgba(255, 255, 255, 0.9); } .ui.inverted.basic.labels a.black.label:hover, a.ui.ui.ui.inverted.basic.black.label:hover { border-color: #000000; background-color: #1b1c1d; } /* Inverted Basic Tags */ .ui.inverted.basic.tag.labels .black.label, .ui.ui.ui.inverted.black.basic.tag.label { border: 1px solid #545454; } .ui.inverted.basic.tag.labels .black.label::before, .ui.ui.ui.inverted.black.basic.tag.label::before { border-color: inherit; border-width: 1px 0 0 1px; border-style: inherit; background-color: #1b1c1d; right: calc(100% + 1px); } /* ------------------- Horizontal -------------------- */ .ui.horizontal.labels .label, .ui.horizontal.label { margin: 0 0.5em 0 0; padding: 0.4em 0.833em; min-width: 3em; text-align: center; } /* ------------------- Circular -------------------- */ .ui.circular.labels .label, .ui.circular.label { min-width: 2em; min-height: 2em; padding: 0.5em !important; line-height: 1em; text-align: center; border-radius: 500rem; } .ui.empty.circular.labels .label, .ui.empty.circular.label { min-width: 0; min-height: 0; overflow: hidden; width: 0.5em; height: 0.5em; vertical-align: baseline; } /* ------------------- Pointing -------------------- */ .ui.pointing.label { position: relative; } .ui.attached.pointing.label { position: absolute; } .ui.pointing.label::before { background-color: inherit; background-image: inherit; border-width: 0; border-style: solid; border-color: inherit; } /* Arrow */ .ui.pointing.label::before { position: absolute; content: ""; transform: rotate(45deg); background-image: none; z-index: 2; width: 0.6666em; height: 0.6666em; transition: none; } /* --- Above --- */ .ui.pointing.label, .ui[class*="pointing above"].label { margin-top: 1em; } .ui.pointing.label::before, .ui[class*="pointing above"].label::before { border-width: 1px 0 0 1px; transform: translateX(-50%) translateY(-50%) rotate(45deg); top: 0; left: 50%; } /* --- Below --- */ .ui[class*="bottom pointing"].label, .ui[class*="pointing below"].label { margin-top: 0; margin-bottom: 1em; } .ui[class*="bottom pointing"].label::before, .ui[class*="pointing below"].label::before { border-width: 0 1px 1px 0; right: auto; transform: translateX(-50%) translateY(-50%) rotate(45deg); top: 100%; left: 50%; } /* --- Left --- */ .ui[class*="left pointing"].label { margin-top: 0; margin-left: 0.6666em; } .ui[class*="left pointing"].label::before { border-width: 0 0 1px 1px; transform: translateX(-50%) translateY(-50%) rotate(45deg); bottom: auto; right: auto; top: 50%; left: 0; } /* --- Right --- */ .ui[class*="right pointing"].label { margin-top: 0; margin-right: 0.6666em; } .ui[class*="right pointing"].label::before { border-width: 1px 1px 0 0; transform: translateX(50%) translateY(-50%) rotate(45deg); top: 50%; right: 0; bottom: auto; left: auto; } /* Basic Pointing */ /* --- Above --- */ .ui.basic.pointing.label::before, .ui.basic[class*="pointing above"].label::before { margin-top: -1px; } /* --- Below --- */ .ui.basic[class*="bottom pointing"].label::before, .ui.basic[class*="pointing below"].label::before { bottom: auto; top: 100%; margin-top: 1px; } /* --- Left --- */ .ui.basic[class*="left pointing"].label::before { top: 50%; left: -1px; } /* --- Right --- */ .ui.basic[class*="right pointing"].label::before { top: 50%; right: -1px; } /* ------------------ Floating Label ------------------- */ .ui.floating.label { position: absolute; z-index: 100; top: -1em; right: 0; white-space: nowrap; transform: translateX(50%); } .ui.right.aligned.floating.label { transform: translateX(1.2em); } .ui.left.floating.label { left: 0; right: auto; transform: translateX(-50%); } .ui.left.aligned.floating.label { transform: translateX(-1.2em); } .ui.bottom.floating.label { top: auto; bottom: -1em; } /* ------------------- Sizes -------------------- */ .ui.labels .label, .ui.label { font-size: 0.85714286rem; } .ui.mini.labels .label, .ui.mini.label { font-size: 0.64285714rem; } .ui.tiny.labels .label, .ui.tiny.label { font-size: 0.71428571rem; } .ui.small.labels .label, .ui.small.label { font-size: 0.78571429rem; } .ui.large.labels .label, .ui.large.label { font-size: 1rem; } .ui.big.labels .label, .ui.big.label { font-size: 1.28571429rem; } .ui.huge.labels .label, .ui.huge.label { font-size: 1.42857143rem; } .ui.massive.labels .label, .ui.massive.label { font-size: 1.71428571rem; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/list.css ================================================ /*! * # Fomantic-UI 2.9.4 - List * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* List *******************************/ ul.ui.list, ol.ui.list, .ui.list { list-style-type: none; margin: 1em 0; padding: 0 0; } ul.ui.list:first-child, ol.ui.list:first-child, .ui.list:first-child { margin-top: 0; padding-top: 0; } ul.ui.list:last-child, ol.ui.list:last-child, .ui.list:last-child { margin-bottom: 0; padding-bottom: 0; } /******************************* Content *******************************/ /* List Item */ ul.ui.list li, ol.ui.list li, .ui.list > .item, .ui.list .list > .item { display: list-item; table-layout: fixed; list-style-type: none; list-style-position: outside; padding: 0.21428571em 0; line-height: 1.14285714em; } ul.ui.list > li:first-child::after, ol.ui.list > li:first-child::after, .ui.list > .list > .item::after, .ui.list > .item::after { content: ""; display: block; height: 0; clear: both; visibility: hidden; } ul.ui.list li:first-child, ol.ui.list li:first-child, .ui.list .list > .item:first-child, .ui.list > .item:first-child { padding-top: 0; } ul.ui.list li:last-child, ol.ui.list li:last-child, .ui.list .list > .item:last-child, .ui.list > .item:last-child { padding-bottom: 0; } /* Child List */ ul.ui.list ul, ol.ui.list ol, .ui.list .list:not(.icon) { clear: both; margin: 0; padding: 0.75em 0 0.25em 0.5em; } /* Child Item */ ul.ui.list ul li, ol.ui.list ol li, .ui.list .list > .item { padding: 0.14285714em 0; line-height: inherit; } /* Icon */ .ui.list .list > .item > i.icon, .ui.list > .item > i.icon { display: table-cell; min-width: 1.55em; margin: 0; padding-top: 0; transition: color 0.1s ease; } .ui.list .list > .item > i.icon:not(.loading), .ui.list > .item > i.icon:not(.loading) { padding-right: 0.28571429em; vertical-align: top; } .ui.list .list > .item > i.icon:only-child, .ui.list > .item > i.icon:only-child { display: inline-block; min-width: auto; vertical-align: top; } /* Image */ .ui.list .list > .item > .image, .ui.list > .item > .image { display: table-cell; background-color: transparent; margin: 0; vertical-align: top; } .ui.list .list > .item > .image:not(:only-child):not(img), .ui.list > .item > .image:not(:only-child):not(img) { padding-right: 0.5em; } .ui.list .list > .item > .image img, .ui.list > .item > .image img { vertical-align: top; } .ui.list .list > .item > img.image, .ui.list .list > .item > .image:only-child, .ui.list > .item > img.image, .ui.list > .item > .image:only-child { display: inline-block; } /* Content */ .ui.list .list > .item > .content, .ui.list > .item > .content { line-height: 1.14285714em; color: rgba(0, 0, 0, 0.87); } .ui.list .list > .item > .image + .content, .ui.list .list > .item > i.icon + .content, .ui.list > .item > .image + .content, .ui.list > .item > i.icon + .content { display: table-cell; width: 100%; padding: 0 0 0 0.5em; vertical-align: top; } .ui.list .list > .item > i.loading.icon + .content, .ui.list > .item > i.loading.icon + .content { padding-left: calc(0.2857142857142857em + 0.5em); } .ui.list .list > .item > img.image + .content, .ui.list > .item > img.image + .content { display: inline-block; width: auto; } .ui.list .list > .item > .content > .list, .ui.list > .item > .content > .list { margin-left: 0; padding-left: 0; } /* Header */ .ui.list .list > .item .header, .ui.list > .item .header { display: block; margin: 0; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-weight: bold; color: rgba(0, 0, 0, 0.87); } /* Description */ .ui.list .list > .item .description, .ui.list > .item .description { display: block; color: rgba(0, 0, 0, 0.7); } /* Child Link */ .ui.list > .item a, .ui.list .list > .item a { cursor: pointer; } /* Linking Item */ .ui.list .list > a.item, .ui.list > a.item { cursor: pointer; color: #4183c4; } .ui.list .list > a.item:hover, .ui.list > a.item:hover { color: #1e70bf; } /* Linked Item Icons */ .ui.list .list > a.item > i.icons, .ui.list > a.item > i.icons, .ui.list .list > a.item > i.icon, .ui.list > a.item > i.icon { color: rgba(0, 0, 0, 0.4); } /* Header Link */ .ui.list .list > .item a.header, .ui.list > .item a.header { cursor: pointer; color: #4183c4 !important; } .ui.list .list > .item > a.header:hover, .ui.list > .item > a.header:hover { color: #1e70bf !important; } /* Floated Content */ .ui[class*="left floated"].list { float: left; } .ui[class*="right floated"].list { float: right; } .ui.list .list > .item [class*="left floated"], .ui.list > .item [class*="left floated"] { float: left; margin: 0 1em 0 0; } .ui.list .list > .item [class*="right floated"], .ui.list > .item [class*="right floated"] { float: right; margin: 0 0 0 1em; } /******************************* Coupling *******************************/ .ui.menu .ui.list > .item, .ui.menu .ui.list .list > .item { display: list-item; table-layout: fixed; background-color: transparent; list-style-type: none; list-style-position: outside; padding: 0.21428571em 0; line-height: 1.14285714em; } .ui.menu .ui.list .list > .item::before, .ui.menu .ui.list > .item::before { border: none; background: none; } .ui.menu .ui.list .list > .item:first-child, .ui.menu .ui.list > .item:first-child { padding-top: 0; } .ui.menu .ui.list .list > .item:last-child, .ui.menu .ui.list > .item:last-child { padding-bottom: 0; } /******************************* Types *******************************/ /* ------------------- Horizontal -------------------- */ .ui.horizontal.list { display: inline-block; font-size: 0; } .ui.horizontal.list > .item { display: inline-block; margin-right: 1em; font-size: 1rem; } .ui.horizontal.list:not(.celled) > .item:last-child { margin-right: 0; padding-right: 0; } .ui.horizontal.list .list:not(.icon) { padding-left: 0; padding-bottom: 0; } .ui.horizontal.list > .item > .image, .ui.horizontal.list .list > .item > .image, .ui.horizontal.list > .item > i.icon, .ui.horizontal.list .list > .item > i.icon, .ui.horizontal.list > .item > .content, .ui.horizontal.list .list > .item > .content { vertical-align: middle; } /* Padding on all elements */ .ui.horizontal.list > .item:first-child, .ui.horizontal.list > .item:last-child { padding-top: 0.21428571em; padding-bottom: 0.21428571em; } /* Horizontal List */ .ui.horizontal.list > .item > i.icon, .ui.horizontal.list .item > i.icons > i.icon { margin: 0; padding: 0 0.25em 0 0; } .ui.horizontal.list > .item > .image + .content, .ui.horizontal.list > .item > i.icon, .ui.horizontal.list > .item > i.icon + .content { float: none; display: inline-block; width: auto; } .ui.horizontal.list > .item > .image { display: inline-block; } /******************************* States *******************************/ /* ------------------- Disabled -------------------- */ .ui.list .list > .disabled.item, .ui.list > .disabled.item { pointer-events: none; color: rgba(40, 40, 40, 0.3) !important; } .ui.inverted.list .list > .disabled.item, .ui.inverted.list > .disabled.item { color: rgba(225, 225, 225, 0.3) !important; } /* ------------------- Hover -------------------- */ .ui.list .list > a.item:hover > .icons, .ui.list > a.item:hover > .icons, .ui.list .list > a.item:hover > i.icon, .ui.list > a.item:hover > i.icon { color: rgba(0, 0, 0, 0.87); } /******************************* Variations *******************************/ /* ------------------- Inverted -------------------- */ .ui.inverted.list .list > a.item > i.icon, .ui.inverted.list > a.item > i.icon { color: rgba(255, 255, 255, 0.7); } .ui.inverted.list .list > .item .header, .ui.inverted.list > .item .header { color: rgba(255, 255, 255, 0.9); } .ui.inverted.list .list > .item .description, .ui.inverted.list > .item .description { color: rgba(255, 255, 255, 0.7); } .ui.inverted.list .list > .item > .content, .ui.inverted.list > .item > .content { color: rgba(255, 255, 255, 0.7); } /* Item Link */ .ui.inverted.list .list > a.item, .ui.inverted.list > a.item { cursor: pointer; color: rgba(255, 255, 255, 0.9); } .ui.inverted.list .list > a.item:hover, .ui.inverted.list > a.item:hover { color: #1e70bf; } /* Linking Content */ .ui.inverted.list .item a:not(.ui) { color: rgba(255, 255, 255, 0.9) !important; } .ui.inverted.list .item a:not(.ui):hover { color: #1e70bf !important; } /* ------------------- Aligned -------------------- */ .ui.list[class*="top aligned"] .image, .ui.list[class*="top aligned"] .content, .ui.list [class*="top aligned"] { vertical-align: top !important; } .ui.list[class*="middle aligned"] .image, .ui.list[class*="middle aligned"] .content, .ui.list [class*="middle aligned"] { vertical-align: middle !important; } .ui.list[class*="bottom aligned"] .image, .ui.list[class*="bottom aligned"] .content, .ui.list [class*="bottom aligned"] { vertical-align: bottom !important; } /* ------------------- Link -------------------- */ .ui.link.list .item, .ui.link.list a.item, .ui.link.list .item a:not(.ui) { color: rgba(0, 0, 0, 0.4); transition: 0.1s color ease; } .ui.ui.link.list a.item:hover, .ui.ui.link.list .item a:not(.ui):hover { color: rgba(0, 0, 0, 0.8); } .ui.ui.link.list a.item:active, .ui.ui.link.list .item a:not(.ui):active { color: rgba(0, 0, 0, 0.9); } .ui.ui.link.list .active.item, .ui.ui.link.list .active.item a:not(.ui) { color: rgba(0, 0, 0, 0.95); } /* Inverted */ .ui.inverted.link.list .item, .ui.inverted.link.list a.item, .ui.inverted.link.list .item a:not(.ui) { color: rgba(255, 255, 255, 0.5); } .ui.ui.inverted.link.list a.item:hover, .ui.ui.inverted.link.list .item a:not(.ui):hover { color: #ffffff; } .ui.ui.inverted.link.list a.item:active, .ui.ui.inverted.link.list .item a:not(.ui):active { color: #ffffff; } .ui.ui.inverted.link.list a.active.item, .ui.ui.inverted.link.list .active.item a:not(.ui) { color: #ffffff; } /* ------------------- Selection -------------------- */ .ui.selection.list .list > .item, .ui.selection.list > .item { cursor: pointer; background: transparent; padding: 0.5em 0.5em; margin: 0; color: rgba(0, 0, 0, 0.4); border-radius: 0.5em; transition: 0.1s color ease, 0.1s padding-left ease, 0.1s background-color ease; } .ui.selection.list .list > .item:last-child, .ui.selection.list > .item:last-child { margin-bottom: 0; } .ui.selection.list .list > .item:hover, .ui.selection.list > .item:hover { background: rgba(0, 0, 0, 0.03); color: rgba(0, 0, 0, 0.8); } .ui.selection.list .list > .item:active, .ui.selection.list > .item:active { background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.9); } .ui.selection.list .list > .item.active, .ui.selection.list > .item.active { background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.95); } /* Inverted */ .ui.inverted.selection.list > .item { background: transparent; color: rgba(255, 255, 255, 0.5); } .ui.inverted.selection.list > .item:hover { background: rgba(255, 255, 255, 0.02); color: #ffffff; } .ui.inverted.selection.list > .item:active { background: rgba(255, 255, 255, 0.08); color: #ffffff; } .ui.inverted.selection.list > .item.active { background: rgba(255, 255, 255, 0.08); color: #ffffff; } /* Celled / Divided Selection List */ .ui.celled.selection.list .list > .item, .ui.divided.selection.list .list > .item, .ui.celled.selection.list > .item, .ui.divided.selection.list > .item { border-radius: 0; } /* ------------------- Animated -------------------- */ .ui.animated.list > .item { transition: 0.25s color ease 0.1s, 0.25s padding-left ease 0.1s, 0.25s background-color ease 0.1s; } .ui.animated.list:not(.horizontal) > .item:hover { padding-left: 1em; } /* ------------------- Fitted -------------------- */ .ui.fitted.list:not(.selection) .list > .item, .ui.fitted.list:not(.selection) > .item { padding-left: 0; padding-right: 0; } .ui.fitted.selection.list .list > .item, .ui.fitted.selection.list > .item { margin-left: -0.5em; margin-right: -0.5em; } /* ------------------- Bulleted -------------------- */ ul.ui.list, .ui.bulleted.list { margin-left: 1.25rem; } ul.ui.list li, .ui.bulleted.list .list > .item, .ui.bulleted.list > .item { position: relative; } ul.ui.list li::before, .ui.bulleted.list .list > .item::before, .ui.bulleted.list > .item::before { -webkit-user-select: none; -ms-user-select: none; user-select: none; pointer-events: none; position: absolute; top: auto; left: auto; font-weight: normal; margin-left: -1.25rem; content: "\2022"; opacity: 1; color: inherit; vertical-align: top; } ul.ui.list li::before, .ui.bulleted.list .list > a.item::before, .ui.bulleted.list > a.item::before { color: rgba(0, 0, 0, 0.87); } ul.ui.list ul, .ui.bulleted.list .list:not(.icon) { padding-left: 1.25rem; } /* Horizontal Bulleted */ ul.ui.horizontal.bulleted.list, .ui.horizontal.bulleted.list { margin-left: 0; } ul.ui.horizontal.bulleted.list li, .ui.horizontal.bulleted.list > .item { margin-left: 1.75rem; } ul.ui.horizontal.bulleted.list li:first-child, .ui.horizontal.bulleted.list > .item:first-child { margin-left: 0; } ul.ui.horizontal.bulleted.list li::before, .ui.horizontal.bulleted.list > .item::before { color: rgba(0, 0, 0, 0.87); } ul.ui.horizontal.bulleted.list li:first-child::before, .ui.horizontal.bulleted.list > .item:first-child::before { display: none; } /* ------------------- Ordered -------------------- */ ol.ui.list, .ui.ordered.list, .ui.ordered.list .list:not(.icon), ol.ui.list ol { counter-reset: ordered; margin-left: 1.25rem; list-style-type: none; } ol.ui.list li, .ui.ordered.list .list > .item, .ui.ordered.list > .item { list-style-type: none; position: relative; } ol.ui.list li::before, .ui.ordered.list .list > .item::before, .ui.ordered.list > .item::before { position: absolute; top: auto; left: auto; -webkit-user-select: none; -ms-user-select: none; user-select: none; pointer-events: none; margin-left: -1.25rem; counter-increment: ordered; content: counters(ordered, ".") " "; text-align: right; color: rgba(0, 0, 0, 0.87); vertical-align: middle; opacity: 0.8; } ol.ui.inverted.list li::before, .ui.ordered.inverted.list .list > .item::before, .ui.ordered.inverted.list > .item::before { color: rgba(255, 255, 255, 0.7); } /* Value */ .ui.ordered.list .list > .item[data-value]::before, .ui.ordered.list > .item[data-value]::before { content: attr(data-value); } ol.ui.list li[value]::before { content: attr(value); } /* Child Lists */ ol.ui.list ol, .ui.ordered.list .list:not(.icon) { margin-left: 1em; } ol.ui.list ol li::before, .ui.ordered.list .list > .item::before { margin-left: -2em; } /* Horizontal Ordered */ ol.ui.horizontal.list, .ui.ordered.horizontal.list { margin-left: 0; } ol.ui.horizontal.list li::before, .ui.ordered.horizontal.list .list > .item::before, .ui.ordered.horizontal.list > .item::before { position: static; margin: 0 0.5em 0 0; } /* Suffixed Ordered */ ol.ui.suffixed.list li::before, .ui.suffixed.ordered.list .list > .item::before, .ui.suffixed.ordered.list > .item::before { content: counters(ordered, ".") "."; } /* ------------------- Divided -------------------- */ .ui.divided.list > .item { border-top: 1px solid rgba(34, 36, 38, 0.15); } .ui.divided.list .list > .item { border-top: none; } .ui.divided.list .item .list > .item { border-top: none; } .ui.divided.list .list > .item:first-child, .ui.divided.list > .item:first-child { border-top: none; } /* Sub Menu */ .ui.divided.list:not(.horizontal) .list > .item:first-child { border-top-width: 1px; } /* Divided bulleted */ .ui.divided.bulleted.list:not(.horizontal), .ui.divided.bulleted.list .list:not(.icon) { margin-left: 0; padding-left: 0; } .ui.divided.bulleted.list > .item:not(.horizontal) { padding-left: 1.25rem; } /* Divided Ordered */ .ui.divided.ordered.list { margin-left: 0; } .ui.divided.ordered.list .list > .item, .ui.divided.ordered.list > .item { padding-left: 1.25rem; } .ui.divided.ordered.list .item .list:not(.icon) { margin-left: 0; margin-right: 0; padding-bottom: 0.21428571em; } .ui.divided.ordered.list .item .list > .item { padding-left: 1em; } /* Divided Selection */ .ui.divided.selection.list .list > .item, .ui.divided.selection.list > .item { margin: 0; border-radius: 0; } /* Divided horizontal */ .ui.divided.horizontal.list { margin-left: 0; } .ui.divided.horizontal.list > .item { padding-left: 0.5em; } .ui.divided.horizontal.list > .item:not(:last-child) { padding-right: 0.5em; } .ui.divided.horizontal.list > .item { border-top: none; border-right: 1px solid rgba(34, 36, 38, 0.15); margin: 0; line-height: 0.6; } .ui.horizontal.divided.list > .item:last-child { border-right: none; } /* Inverted */ .ui.divided.inverted.list > .item, .ui.divided.inverted.list > .list, .ui.divided.inverted.horizontal.list > .item { border-color: rgba(255, 255, 255, 0.1); } /* ------------------- Celled -------------------- */ .ui.celled.list > .item, .ui.celled.list > .list { border-top: 1px solid rgba(34, 36, 38, 0.15); padding-left: 0.5em; padding-right: 0.5em; } .ui.celled.list > .item:last-child { border-bottom: 1px solid rgba(34, 36, 38, 0.15); } /* Padding on all elements */ .ui.celled.list > .item:first-child, .ui.celled.list > .item:last-child { padding-top: 0.21428571em; padding-bottom: 0.21428571em; } /* Sub Menu */ .ui.celled.list .item .list > .item { border-width: 0; } .ui.celled.list .list > .item:first-child { border-top-width: 0; } /* Celled Bulleted */ .ui.celled.bulleted.list { margin-left: 0; } .ui.celled.bulleted.list .list > .item, .ui.celled.bulleted.list > .item { padding-left: 1.25rem; } .ui.celled.bulleted.list .item .list:not(.icon) { margin-left: -1.25rem; margin-right: -1.25rem; padding-bottom: 0.21428571em; } /* Celled Ordered */ .ui.celled.ordered.list { margin-left: 0; } .ui.celled.ordered.list .list > .item, .ui.celled.ordered.list > .item { padding-left: 1.25rem; } .ui.celled.ordered.list .item .list:not(.icon) { margin-left: 0; margin-right: 0; padding-bottom: 0.21428571em; } .ui.celled.ordered.list .list > .item { padding-left: 1em; } /* Celled Horizontal */ .ui.horizontal.celled.list { margin-left: 0; } .ui.horizontal.celled.list .list > .item, .ui.horizontal.celled.list > .item { border-top: none; border-left: 1px solid rgba(34, 36, 38, 0.15); margin: 0; padding-left: 0.5em; padding-right: 0.5em; line-height: 0.6; } .ui.horizontal.celled.list .list > .item:last-child, .ui.horizontal.celled.list > .item:last-child { border-bottom: none; border-right: 1px solid rgba(34, 36, 38, 0.15); } /* Inverted */ .ui.celled.inverted.list > .item, .ui.celled.inverted.list > .list { border-color: rgba(255, 255, 255, 0.1); } .ui.celled.inverted.horizontal.list .list > .item, .ui.celled.inverted.horizontal.list > .item { border-color: rgba(255, 255, 255, 0.1); } /* ------------------- Relaxed -------------------- */ .ui.relaxed.list:not(.horizontal) > .item:not(:first-child) { padding-top: 0.42857143em; } .ui.relaxed.list:not(.horizontal) > .item:not(:last-child) { padding-bottom: 0.42857143em; } .ui.horizontal.relaxed.list .list > .item:not(:first-child), .ui.horizontal.relaxed.list > .item:not(:first-child) { padding-left: 1rem; } .ui.horizontal.relaxed.list .list > .item:not(:last-child), .ui.horizontal.relaxed.list > .item:not(:last-child) { padding-right: 1rem; } /* Very Relaxed */ .ui[class*="very relaxed"].list:not(.horizontal) > .item:not(:first-child) { padding-top: 0.85714286em; } .ui[class*="very relaxed"].list:not(.horizontal) > .item:not(:last-child) { padding-bottom: 0.85714286em; } .ui.horizontal[class*="very relaxed"].list .list > .item:not(:first-child), .ui.horizontal[class*="very relaxed"].list > .item:not(:first-child) { padding-left: 1.5rem; } .ui.horizontal[class*="very relaxed"].list .list > .item:not(:last-child), .ui.horizontal[class*="very relaxed"].list > .item:not(:last-child) { padding-right: 1.5rem; } /* ------------------- Sizes -------------------- */ .ui.list { font-size: 1em; } .ui.mini.list { font-size: 0.78571429em; } .ui.mini.horizontal.list .list > .item, .ui.mini.horizontal.list > .item { font-size: 0.78571429rem; } .ui.tiny.list { font-size: 0.85714286em; } .ui.tiny.horizontal.list .list > .item, .ui.tiny.horizontal.list > .item { font-size: 0.85714286rem; } .ui.small.list { font-size: 0.92857143em; } .ui.small.horizontal.list .list > .item, .ui.small.horizontal.list > .item { font-size: 0.92857143rem; } .ui.large.list { font-size: 1.14285714em; } .ui.large.horizontal.list .list > .item, .ui.large.horizontal.list > .item { font-size: 1.14285714rem; } .ui.big.list { font-size: 1.28571429em; } .ui.big.horizontal.list .list > .item, .ui.big.horizontal.list > .item { font-size: 1.28571429rem; } .ui.huge.list { font-size: 1.42857143em; } .ui.huge.horizontal.list .list > .item, .ui.huge.horizontal.list > .item { font-size: 1.42857143rem; } .ui.massive.list { font-size: 1.71428571em; } .ui.massive.horizontal.list .list > .item, .ui.massive.horizontal.list > .item { font-size: 1.71428571rem; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/loader.css ================================================ /*! * # Fomantic-UI 2.9.4 - Loader * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Loader *******************************/ /* Standard Size */ .ui.loader { display: none; position: absolute; top: 50%; left: 50%; margin: 0; text-align: center; z-index: 1000; transform: translateX(-50%) translateY(-50%); } /* Static Shape */ .ui.loader::before { position: absolute; content: ""; top: 0; left: 50%; width: 100%; height: 100%; border-radius: 500rem; border: 0.2em solid rgba(0, 0, 0, 0.1); } /* Active Shape */ .ui.loader::after { position: absolute; content: ""; top: 0; left: 50%; width: 100%; height: 100%; animation: loader 0.6s infinite linear; border: 0.2em solid #767676; border-radius: 500rem; box-shadow: 0 0 0 1px transparent; } /* Speeds */ .ui.ui.fast.loading::after, .ui.ui.fast.loading .input > i.icon::after, .ui.ui.fast.loading > i.icon::after, .ui.fast.loader::after { animation-duration: 0.3s; } .ui.ui.slow.loading::after, .ui.ui.slow.loading .input > i.icon::after, .ui.ui.slow.loading > i.icon::after, .ui.slow.loader::after { animation-duration: 0.9s; } /* Active Animation */ @keyframes loader { 100% { transform: rotate(360deg); } } /* ------------------- Coupling -------------------- */ /* Show inside active dimmer */ .ui.dimmer > .loader { display: block; } /* Black Dimmer */ .ui.dimmer > .ui.loader { color: rgba(255, 255, 255, 0.9); } .ui.dimmer > .ui.loader:not(.elastic)::before { border-color: rgba(255, 255, 255, 0.15); } /* White Dimmer (Inverted) */ .ui.inverted.dimmer > .ui.loader { color: rgba(0, 0, 0, 0.87); } .ui.inverted.dimmer > .ui.loader:not(.elastic)::before { border-color: rgba(0, 0, 0, 0.1); } /******************************* Types *******************************/ /* ------------------- Text -------------------- */ .ui.ui.ui.ui.text.loader { width: auto; height: auto; text-align: center; font-style: normal; } /******************************* States *******************************/ .ui.indeterminate.loader::after { animation-direction: reverse; animation-duration: 1.2s; } .ui.loader.active, .ui.loader.visible { display: block; } .ui.loader.disabled, .ui.loader.hidden { display: none; } /******************************* Variations *******************************/ /* ------------------- Sizes -------------------- */ .ui.loader { width: 2.28571429rem; height: 2.28571429rem; font-size: 1em; } .ui.loader::before, .ui.loader::after { width: 2.28571429rem; height: 2.28571429rem; margin: 0 0 0 -1.14285714rem; } .ui.text.loader { min-width: 2.28571429rem; padding-top: 3.07142857rem; } .ui.mini.loader { width: 1rem; height: 1rem; font-size: 0.78571429em; } .ui.mini.loader::before, .ui.mini.loader::after { width: 1rem; height: 1rem; margin: 0 0 0 -0.5rem; } .ui.mini.text.loader { min-width: 1rem; padding-top: 1.78571429rem; } .ui.tiny.loader { width: 1.14285714rem; height: 1.14285714rem; font-size: 0.85714286em; } .ui.tiny.loader::before, .ui.tiny.loader::after { width: 1.14285714rem; height: 1.14285714rem; margin: 0 0 0 -0.57142857rem; } .ui.tiny.text.loader { min-width: 1.14285714rem; padding-top: 1.92857143rem; } .ui.small.loader { width: 1.71428571rem; height: 1.71428571rem; font-size: 0.92857143em; } .ui.small.loader::before, .ui.small.loader::after { width: 1.71428571rem; height: 1.71428571rem; margin: 0 0 0 -0.85714286rem; } .ui.small.text.loader { min-width: 1.71428571rem; padding-top: 2.5rem; } .ui.large.loader { width: 3.42857143rem; height: 3.42857143rem; font-size: 1.14285714em; } .ui.large.loader::before, .ui.large.loader::after { width: 3.42857143rem; height: 3.42857143rem; margin: 0 0 0 -1.71428571rem; } .ui.large.text.loader { min-width: 3.42857143rem; padding-top: 4.21428571rem; } .ui.big.loader { width: 3.71428571rem; height: 3.71428571rem; font-size: 1.28571429em; } .ui.big.loader::before, .ui.big.loader::after { width: 3.71428571rem; height: 3.71428571rem; margin: 0 0 0 -1.85714286rem; } .ui.big.text.loader { min-width: 3.71428571rem; padding-top: 4.5rem; } .ui.huge.loader { width: 4.14285714rem; height: 4.14285714rem; font-size: 1.42857143em; } .ui.huge.loader::before, .ui.huge.loader::after { width: 4.14285714rem; height: 4.14285714rem; margin: 0 0 0 -2.07142857rem; } .ui.huge.text.loader { min-width: 4.14285714rem; padding-top: 4.92857143rem; } .ui.massive.loader { width: 4.57142857rem; height: 4.57142857rem; font-size: 1.71428571em; } .ui.massive.loader::before, .ui.massive.loader::after { width: 4.57142857rem; height: 4.57142857rem; margin: 0 0 0 -2.28571429rem; } .ui.massive.text.loader { min-width: 4.57142857rem; padding-top: 5.35714286rem; } /* ------------------- Colors -------------------- */ .ui.ui.primary.elastic.loader::before, .ui.primary.basic.elastic.loading.button::before, .ui.primary.basic.elastic.loading.button::after, .ui.ui.ui.primary.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.primary.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.primary.elastic.loading > i.icon::before, .ui.ui.ui.ui.primary.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.primary.loading .input > i.icon::after, .ui.ui.ui.ui.primary.loading > i.icon::after, .ui.ui.ui.primary.loader::after { color: #2185d0; } .ui.inverted.primary.elastic.loader::before, .ui.ui.ui.inverted.primary.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.primary.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.primary.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.primary.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.primary.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.primary.loading > i.icon::after, .ui.ui.ui.inverted.primary.loader::after { color: #54c8ff; } .ui.ui.secondary.elastic.loader::before, .ui.secondary.basic.elastic.loading.button::before, .ui.secondary.basic.elastic.loading.button::after, .ui.ui.ui.secondary.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.secondary.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.secondary.elastic.loading > i.icon::before, .ui.ui.ui.ui.secondary.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.secondary.loading .input > i.icon::after, .ui.ui.ui.ui.secondary.loading > i.icon::after, .ui.ui.ui.secondary.loader::after { color: #1b1c1d; } .ui.inverted.secondary.elastic.loader::before, .ui.ui.ui.inverted.secondary.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.secondary.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.secondary.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.secondary.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.secondary.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.secondary.loading > i.icon::after, .ui.ui.ui.inverted.secondary.loader::after { color: #545454; } .ui.ui.red.elastic.loader::before, .ui.red.basic.elastic.loading.button::before, .ui.red.basic.elastic.loading.button::after, .ui.ui.ui.red.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.red.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.red.elastic.loading > i.icon::before, .ui.ui.ui.ui.red.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.red.loading .input > i.icon::after, .ui.ui.ui.ui.red.loading > i.icon::after, .ui.ui.ui.red.loader::after { color: #db2828; } .ui.inverted.red.elastic.loader::before, .ui.ui.ui.inverted.red.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.red.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.red.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.red.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.red.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.red.loading > i.icon::after, .ui.ui.ui.inverted.red.loader::after { color: #ff695e; } .ui.ui.orange.elastic.loader::before, .ui.orange.basic.elastic.loading.button::before, .ui.orange.basic.elastic.loading.button::after, .ui.ui.ui.orange.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.orange.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.orange.elastic.loading > i.icon::before, .ui.ui.ui.ui.orange.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.orange.loading .input > i.icon::after, .ui.ui.ui.ui.orange.loading > i.icon::after, .ui.ui.ui.orange.loader::after { color: #f2711c; } .ui.inverted.orange.elastic.loader::before, .ui.ui.ui.inverted.orange.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.orange.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.orange.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.orange.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.orange.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.orange.loading > i.icon::after, .ui.ui.ui.inverted.orange.loader::after { color: #ff851b; } .ui.ui.yellow.elastic.loader::before, .ui.yellow.basic.elastic.loading.button::before, .ui.yellow.basic.elastic.loading.button::after, .ui.ui.ui.yellow.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.yellow.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.yellow.elastic.loading > i.icon::before, .ui.ui.ui.ui.yellow.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.yellow.loading .input > i.icon::after, .ui.ui.ui.ui.yellow.loading > i.icon::after, .ui.ui.ui.yellow.loader::after { color: #fbbd08; } .ui.inverted.yellow.elastic.loader::before, .ui.ui.ui.inverted.yellow.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.yellow.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.yellow.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.yellow.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.yellow.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.yellow.loading > i.icon::after, .ui.ui.ui.inverted.yellow.loader::after { color: #ffe21f; } .ui.ui.olive.elastic.loader::before, .ui.olive.basic.elastic.loading.button::before, .ui.olive.basic.elastic.loading.button::after, .ui.ui.ui.olive.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.olive.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.olive.elastic.loading > i.icon::before, .ui.ui.ui.ui.olive.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.olive.loading .input > i.icon::after, .ui.ui.ui.ui.olive.loading > i.icon::after, .ui.ui.ui.olive.loader::after { color: #b5cc18; } .ui.inverted.olive.elastic.loader::before, .ui.ui.ui.inverted.olive.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.olive.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.olive.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.olive.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.olive.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.olive.loading > i.icon::after, .ui.ui.ui.inverted.olive.loader::after { color: #d9e778; } .ui.ui.green.elastic.loader::before, .ui.green.basic.elastic.loading.button::before, .ui.green.basic.elastic.loading.button::after, .ui.ui.ui.green.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.green.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.green.elastic.loading > i.icon::before, .ui.ui.ui.ui.green.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.green.loading .input > i.icon::after, .ui.ui.ui.ui.green.loading > i.icon::after, .ui.ui.ui.green.loader::after { color: #21ba45; } .ui.inverted.green.elastic.loader::before, .ui.ui.ui.inverted.green.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.green.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.green.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.green.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.green.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.green.loading > i.icon::after, .ui.ui.ui.inverted.green.loader::after { color: #2ecc40; } .ui.ui.teal.elastic.loader::before, .ui.teal.basic.elastic.loading.button::before, .ui.teal.basic.elastic.loading.button::after, .ui.ui.ui.teal.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.teal.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.teal.elastic.loading > i.icon::before, .ui.ui.ui.ui.teal.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.teal.loading .input > i.icon::after, .ui.ui.ui.ui.teal.loading > i.icon::after, .ui.ui.ui.teal.loader::after { color: #00b5ad; } .ui.inverted.teal.elastic.loader::before, .ui.ui.ui.inverted.teal.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.teal.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.teal.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.teal.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.teal.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.teal.loading > i.icon::after, .ui.ui.ui.inverted.teal.loader::after { color: #6dffff; } .ui.ui.blue.elastic.loader::before, .ui.blue.basic.elastic.loading.button::before, .ui.blue.basic.elastic.loading.button::after, .ui.ui.ui.blue.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.blue.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.blue.elastic.loading > i.icon::before, .ui.ui.ui.ui.blue.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.blue.loading .input > i.icon::after, .ui.ui.ui.ui.blue.loading > i.icon::after, .ui.ui.ui.blue.loader::after { color: #2185d0; } .ui.inverted.blue.elastic.loader::before, .ui.ui.ui.inverted.blue.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.blue.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.blue.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.blue.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.blue.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.blue.loading > i.icon::after, .ui.ui.ui.inverted.blue.loader::after { color: #54c8ff; } .ui.ui.violet.elastic.loader::before, .ui.violet.basic.elastic.loading.button::before, .ui.violet.basic.elastic.loading.button::after, .ui.ui.ui.violet.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.violet.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.violet.elastic.loading > i.icon::before, .ui.ui.ui.ui.violet.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.violet.loading .input > i.icon::after, .ui.ui.ui.ui.violet.loading > i.icon::after, .ui.ui.ui.violet.loader::after { color: #6435c9; } .ui.inverted.violet.elastic.loader::before, .ui.ui.ui.inverted.violet.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.violet.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.violet.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.violet.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.violet.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.violet.loading > i.icon::after, .ui.ui.ui.inverted.violet.loader::after { color: #a291fb; } .ui.ui.purple.elastic.loader::before, .ui.purple.basic.elastic.loading.button::before, .ui.purple.basic.elastic.loading.button::after, .ui.ui.ui.purple.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.purple.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.purple.elastic.loading > i.icon::before, .ui.ui.ui.ui.purple.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.purple.loading .input > i.icon::after, .ui.ui.ui.ui.purple.loading > i.icon::after, .ui.ui.ui.purple.loader::after { color: #a333c8; } .ui.inverted.purple.elastic.loader::before, .ui.ui.ui.inverted.purple.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.purple.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.purple.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.purple.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.purple.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.purple.loading > i.icon::after, .ui.ui.ui.inverted.purple.loader::after { color: #dc73ff; } .ui.ui.pink.elastic.loader::before, .ui.pink.basic.elastic.loading.button::before, .ui.pink.basic.elastic.loading.button::after, .ui.ui.ui.pink.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.pink.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.pink.elastic.loading > i.icon::before, .ui.ui.ui.ui.pink.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.pink.loading .input > i.icon::after, .ui.ui.ui.ui.pink.loading > i.icon::after, .ui.ui.ui.pink.loader::after { color: #e03997; } .ui.inverted.pink.elastic.loader::before, .ui.ui.ui.inverted.pink.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.pink.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.pink.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.pink.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.pink.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.pink.loading > i.icon::after, .ui.ui.ui.inverted.pink.loader::after { color: #ff8edf; } .ui.ui.brown.elastic.loader::before, .ui.brown.basic.elastic.loading.button::before, .ui.brown.basic.elastic.loading.button::after, .ui.ui.ui.brown.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.brown.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.brown.elastic.loading > i.icon::before, .ui.ui.ui.ui.brown.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.brown.loading .input > i.icon::after, .ui.ui.ui.ui.brown.loading > i.icon::after, .ui.ui.ui.brown.loader::after { color: #a5673f; } .ui.inverted.brown.elastic.loader::before, .ui.ui.ui.inverted.brown.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.brown.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.brown.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.brown.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.brown.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.brown.loading > i.icon::after, .ui.ui.ui.inverted.brown.loader::after { color: #d67c1c; } .ui.ui.grey.elastic.loader::before, .ui.grey.basic.elastic.loading.button::before, .ui.grey.basic.elastic.loading.button::after, .ui.ui.ui.grey.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.grey.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.grey.elastic.loading > i.icon::before, .ui.ui.ui.ui.grey.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.grey.loading .input > i.icon::after, .ui.ui.ui.ui.grey.loading > i.icon::after, .ui.ui.ui.grey.loader::after { color: #767676; } .ui.inverted.grey.elastic.loader::before, .ui.ui.ui.inverted.grey.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.grey.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.grey.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.grey.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.grey.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.grey.loading > i.icon::after, .ui.ui.ui.inverted.grey.loader::after { color: #dcddde; } .ui.ui.black.elastic.loader::before, .ui.black.basic.elastic.loading.button::before, .ui.black.basic.elastic.loading.button::after, .ui.ui.ui.black.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.black.elastic.loading .input > i.icon::before, .ui.ui.ui.ui.black.elastic.loading > i.icon::before, .ui.ui.ui.ui.black.loading:not(.usual):not(.button)::after, .ui.ui.ui.ui.black.loading .input > i.icon::after, .ui.ui.ui.ui.black.loading > i.icon::after, .ui.ui.ui.black.loader::after { color: #1b1c1d; } .ui.inverted.black.elastic.loader::before, .ui.ui.ui.inverted.black.elastic.loading:not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.inverted.black.elastic.loading .input > i.icon::before, .ui.ui.ui.inverted.black.elastic.loading > i.icon::before, .ui.ui.ui.ui.inverted.black.loading:not(.usual)::after, .ui.ui.ui.ui.inverted.black.loading .input > i.icon::after, .ui.ui.ui.ui.inverted.black.loading > i.icon::after, .ui.ui.ui.inverted.black.loader::after { color: #545454; } .ui.ui.elastic.loader::before, .ui.ui.ui.elastic.loading::before, .ui.ui.ui.elastic.loading .input > i.icon::before, .ui.ui.ui.elastic.loading > i.icon::before, .ui.ui.ui.ui.loading:not(.usual)::after, .ui.ui.ui.ui.loading .input > i.icon::after, .ui.ui.ui.ui.loading > i.icon::after, .ui.ui.ui.loader::after { border-color: currentColor; } .ui.ui.ui.ui.elastic.loading.button:not(.inverted):not(.basic)::before { color: #fff; } .ui.elastic.basic.loading.button::before, .ui.elastic.basic.loading.button::after { color: #767676; } .ui.ui.ui.ui.double.loading.button::after { border-bottom-color: currentColor; } /* ------------------- Inline -------------------- */ .ui.inline.loader { position: relative; vertical-align: middle; margin: 0; left: 0; top: 0; transform: none; } .ui.inline.loader.active, .ui.inline.loader.visible { display: inline-block; } /* Centered Inline */ .ui.centered.inline.loader.active, .ui.centered.inline.loader.visible { display: block; margin-left: auto; margin-right: auto; } .ui.ui.ui.ui.ui.ui.loading::after, .ui.ui.ui.ui.ui.ui.loading .input > i.icon::after, .ui.ui.ui.ui.ui.ui.loading > i.icon::after, .ui.ui.ui.ui.ui.loader::after { border-left-color: transparent; border-right-color: transparent; } .ui.ui.ui.ui.ui.ui.ui.loading:not(.double)::after, .ui.ui.ui.ui.ui.ui.ui.loading:not(.double) .input > i.icon::after, .ui.ui.ui.ui.ui.ui.ui.loading:not(.double) > i.icon::after, .ui.ui.ui.ui.ui.ui.loader:not(.double)::after { border-bottom-color: transparent; } .ui.ui.ui.ui.ui.ui.loading.card::after, .ui.ui.ui.ui.ui.ui.loading.segments::after, .ui.ui.ui.ui.ui.ui.loading.segment::after, .ui.ui.ui.ui.ui.ui.loading.form::after { border-left-color: rgba(0, 0, 0, 0.1); border-right-color: rgba(0, 0, 0, 0.1); } .ui.ui.ui.ui.ui.ui.loading.card:not(.double)::after, .ui.ui.ui.ui.ui.ui.loading.segments:not(.double)::after, .ui.ui.ui.ui.ui.ui.loading.segment:not(.double)::after, .ui.ui.ui.ui.ui.ui.loading.form:not(.double)::after { border-bottom-color: rgba(0, 0, 0, 0.1); } /* ------------------- Elastic -------------------- */ .ui.dimmer > .ui.elastic.loader { color: #fff; } .ui.inverted.dimmer > .ui.elastic.loader { color: #767676; } .ui.ui.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::after, .ui.ui.elastic.loading .input > i.icon::after, .ui.ui.elastic.loading > i.icon::after, .ui.ui.elastic.loader::after { animation: loader 1s infinite cubic-bezier(0.27, 1.05, 0.92, 0.61); animation-delay: 0.3s; } .ui.ui.ui.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.elastic.loading .input > i.icon::before, .ui.ui.ui.elastic.loading > i.icon::before, .ui.ui.elastic.loader::before { animation: elastic-loader 1s infinite cubic-bezier(0.27, 1.05, 0.92, 0.61); -moz-animation: currentcolor-elastic-loader 1s infinite cubic-bezier(0.27, 1.05, 0.92, 0.61); border-right-color: transparent; } .ui.elastic.inline.loader:empty { animation: loader 8s infinite linear; } .ui.ui.slow.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::after, .ui.ui.slow.elastic.loading .input > i.icon::after, .ui.ui.slow.elastic.loading > i.icon::after, .ui.ui.slow.elastic.loader::after { animation-duration: 1.5s; animation-delay: 0.45s; } .ui.ui.ui.slow.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.slow.elastic.loading .input > i.icon::before, .ui.ui.ui.slow.elastic.loading > i.icon::before, .ui.ui.slow.elastic.loader::before { animation-duration: 1.5s; } .ui.ui.fast.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::after, .ui.ui.fast.elastic.loading .input > i.icon::after, .ui.ui.fast.elastic.loading > i.icon::after, .ui.ui.fast.elastic.loader::after { animation-duration: 0.66s; animation-delay: 0.2s; } .ui.ui.ui.fast.elastic.loading:not(.form):not(.segment):not(.segments):not(.card)::before, .ui.ui.ui.fast.elastic.loading .input > i.icon::before, .ui.ui.ui.fast.elastic.loading > i.icon::before, .ui.ui.fast.elastic.loader::before { animation-duration: 0.66s; } @keyframes elastic-loader { 0%, 1% { border-left-color: transparent; border-bottom-color: transparent; } 1.1%, 50% { border-left-color: inherit; } 10%, 35.1% { border-bottom-color: transparent; } 10.1%, 35% { border-bottom-color: inherit; } 50.1% { border-left-color: transparent; } 100% { border-left-color: transparent; border-bottom-color: transparent; transform: rotate(360deg); } } @keyframes currentcolor-elastic-loader { 0%, 1% { border-left-color: transparent; border-bottom-color: transparent; } 1.1%, 50% { border-left-color: currentColor; } 10%, 35.1% { border-bottom-color: transparent; } 10.1%, 35% { border-bottom-color: currentColor; } 50.1% { border-left-color: transparent; } 100% { border-left-color: transparent; border-bottom-color: transparent; transform: rotate(360deg); } } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/menu.css ================================================ /*! * # Fomantic-UI 2.9.4 - Menu * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Standard *******************************/ /* -------------- Menu --------------- */ .ui.menu { display: flex; margin: 1rem 0; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; background: #fff; font-weight: normal; border: 1px solid rgba(34, 36, 38, 0.15); box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15); border-radius: 0.28571429rem; min-height: 2.85714286em; } .ui.menu::after { content: ""; display: block; height: 0; clear: both; visibility: hidden; } .ui.menu:first-child { margin-top: 0; } .ui.menu:last-child { margin-bottom: 0; } /* -------------- Sub-Menu --------------- */ .ui.menu .menu { margin: 0; } .ui.menu:not(.vertical) > .menu { display: flex; } /* -------------- Item --------------- */ .ui.menu:not(.vertical) .item { display: flex; align-items: center; } .ui.menu .item { position: relative; vertical-align: middle; line-height: 1; text-decoration: none; -webkit-tap-highlight-color: transparent; flex: 0 0 auto; -webkit-user-select: none; -ms-user-select: none; user-select: none; background: none; padding: 0.92857143em 1.14285714em; text-transform: none; color: rgba(0, 0, 0, 0.87); font-weight: normal; transition: background 0.1s ease, box-shadow 0.1s ease, color 0.1s ease; } .ui.menu > .item:first-child { border-radius: 0.28571429rem 0 0 0.28571429rem; } /* Border */ .ui.menu .item::before { position: absolute; content: ""; top: 0; right: 0; height: 100%; width: 1px; background: rgba(34, 36, 38, 0.1); } /* -------------- Text Content --------------- */ .ui.menu .text.item > *, .ui.menu .item > a:not(.ui), .ui.menu .item > p:only-child { -webkit-user-select: text; -ms-user-select: text; user-select: text; line-height: 1.3; } .ui.menu .item > p:first-child { margin-top: 0; } .ui.menu .item > p:last-child { margin-bottom: 0; } /* -------------- Icons --------------- */ .ui.menu .item > i.icon { opacity: 0.9; float: none; margin: 0 0.35714286em 0 0; } /* -------------- Button --------------- */ .ui.menu:not(.vertical) .item > .button { position: relative; top: 0; margin: -0.5em 0; padding-bottom: 0.78571429em; padding-top: 0.78571429em; font-size: 1em; } /* ---------------- Grid / Container ----------------- */ .ui.menu > .grid, .ui.menu > .container { display: flex; align-items: inherit; flex-direction: inherit; } /* -------------- Inputs --------------- */ .ui.menu .item > .input { width: 100%; } .ui.menu:not(.vertical) .item > .input { position: relative; top: 0; margin: -0.5em 0; } .ui.menu .item > .input input { font-size: 1em; padding-top: 0.57142857em; padding-bottom: 0.57142857em; } /* -------------- Header --------------- */ .ui.menu .header.item, .ui.vertical.menu .header.item { margin: 0; background: ""; text-transform: normal; font-weight: bold; } .ui.vertical.menu .item > .header:not(.ui) { margin: 0 0 0.5em; font-size: 1em; font-weight: bold; } /* -------------- Dropdowns --------------- */ /* Dropdown Icon */ .ui.menu .item > i.dropdown.icon { padding: 0; float: right; margin: 0 0 0 1em; } /* Menu */ .ui.menu .dropdown.item .menu { min-width: calc(100% - 1px); border-radius: 0 0 0.28571429rem 0.28571429rem; background: #fff; margin: 0 0 0; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.08); } .ui.menu .dropdown.item:not(.column) .menu { flex-direction: column; } /* Menu Items */ .ui.menu .ui.dropdown .menu > .item { margin: 0; text-align: left; font-size: 1em !important; padding: 0.78571429em 1.14285714em !important; background: transparent !important; color: rgba(0, 0, 0, 0.87) !important; text-transform: none !important; font-weight: normal !important; box-shadow: none !important; transition: none !important; } .ui.menu .ui.dropdown .menu > .item:hover { background: rgba(0, 0, 0, 0.05) !important; color: rgba(0, 0, 0, 0.95) !important; } .ui.menu .ui.dropdown .menu > .selected.item { background: rgba(0, 0, 0, 0.05) !important; color: rgba(0, 0, 0, 0.95) !important; } .ui.menu .ui.dropdown .menu > .active.item { background: rgba(0, 0, 0, 0.03) !important; font-weight: bold !important; color: rgba(0, 0, 0, 0.95) !important; } .ui.menu .ui.dropdown.item .menu .item:not(.filtered) { display: block; } .ui.menu .ui.dropdown .menu > .item > .icons, .ui.menu .ui.dropdown .menu > .item > i.icon:not(.dropdown) { display: inline-block; font-size: 1em !important; float: none; margin: 0 0.75em 0 0 !important; } /* Secondary */ .ui.secondary.menu .dropdown.item > .menu, .ui.text.menu .dropdown.item > .menu { border-radius: 0.28571429rem; margin-top: 0.35714286em; } /* Pointing */ .ui.menu .pointing.dropdown.item .menu { margin-top: 0.75em; } /* Inverted */ .ui.inverted.menu .search.dropdown.item > .search, .ui.inverted.menu .search.dropdown.item > .text { color: rgba(255, 255, 255, 0.9); } /* Vertical */ .ui.vertical.menu .dropdown.item > i.icon { float: right; content: "\f0da"; margin-left: 1em; } .ui.vertical.menu .dropdown.item .menu { left: 100%; /* IE needs 0, all others support max-content to show dropdown icon inline, so keep both settings! */ min-width: 0; min-width: max-content; margin: 0 0 0 0; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.08); border-radius: 0 0.28571429rem 0.28571429rem 0.28571429rem; } .ui.vertical.menu .dropdown.item.upward .menu { bottom: 0; } .ui.vertical.menu .dropdown.item:not(.upward) .menu { top: 0; } .ui.vertical.menu .active.dropdown.item { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ui.vertical.menu .dropdown.active.item { box-shadow: none; } /* Evenly Divided */ .ui.item.menu .dropdown .menu .item { width: 100%; } /* -------------- Labels --------------- */ .ui.menu .item > .label:not(.floating) { margin-left: 1em; padding: 0.3em 0.78571429em; } .ui.vertical.menu .item > .label { margin-top: -0.15em; margin-bottom: -0.15em; padding: 0.3em 0.78571429em; } .ui.menu .item > .floating.label { padding: 0.3em 0.78571429em; } .ui.menu .item > .label { background: #999; color: #fff; } .ui.menu .item > .image.label img { margin: -0.2833em 0.8em -0.2833em -0.8em; height: 1.5666em; } /* -------------- Images --------------- */ .ui.menu .item > img:not(.ui) { display: inline-block; vertical-align: middle; margin: -0.3em 0; width: 2.5em; } .ui.vertical.menu .item > img:not(.ui):only-child { display: block; max-width: 100%; width: auto; } /******************************* Coupling *******************************/ /* -------------- List --------------- */ /* Menu divider shouldn't apply */ .ui.menu .list .item::before { background: none !important; } /* -------------- Sidebar --------------- */ /* Show vertical dividers below last */ .ui.vertical.sidebar.menu > .item:first-child::before { display: block !important; } .ui.vertical.sidebar.menu > .item::before { top: auto; bottom: 0; } /* -------------- Container --------------- */ @media only screen and (max-width: 767.98px) { .ui.menu > .ui.container { width: 100% !important; margin-left: 0 !important; margin-right: 0 !important; } } @media only screen and (min-width: 768px) { .ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) > .container > .item:not(.right):not(.borderless):first-child { border-left: 1px solid rgba(34, 36, 38, 0.1); } .ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) > .container > .right.item:not(.borderless):last-child, .ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) > .container > .right.menu > .item:not(.borderless):last-child { border-right: 1px solid rgba(34, 36, 38, 0.1); } } /******************************* States *******************************/ /* -------------- Hover --------------- */ .ui.link.menu .item:hover, .ui.menu .dropdown.item:hover, .ui.menu .link.item:hover, .ui.menu a.item:hover { cursor: pointer; background: rgba(0, 0, 0, 0.03); color: rgba(0, 0, 0, 0.95); } /* -------------- Pressed --------------- */ .ui.link.menu .item:active, .ui.menu .link.item:active, .ui.menu a.item:active { background: rgba(0, 0, 0, 0.03); color: rgba(0, 0, 0, 0.95); } /* -------------- Active --------------- */ .ui.menu .active.item { background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.95); font-weight: normal; box-shadow: none; } .ui.menu .active.item > i.icon { opacity: 1; } /* -------------- Active Hover --------------- */ .ui.menu .active.item:hover, .ui.vertical.menu .active.item:hover { background-color: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.95); } /* -------------- Disabled --------------- */ .ui.ui.menu .item.disabled { cursor: default; background-color: transparent; color: rgba(40, 40, 40, 0.3); pointer-events: none; } /******************************* Types *******************************/ /* ------------------ Floated Menu / Item ------------------- */ /* Left Floated */ .ui.menu:not(.vertical) .left.item, .ui.menu:not(.vertical) .left.menu { display: flex; margin-right: auto !important; } /* Right Floated */ .ui.menu:not(.vertical) .right.item, .ui.menu:not(.vertical) .right.menu { display: flex; margin-left: auto !important; } .ui.menu:not(.vertical) :not(.dropdown) > .left.menu, .ui.menu:not(.vertical) :not(.dropdown) > .right.menu { display: inherit; } /* Center */ .ui.menu:not(.vertical) .center.item, .ui.menu:not(.vertical) .center.menu { display: flex; margin-left: auto !important; margin-right: auto !important; } /* Swapped Borders */ .ui.menu .right.item::before, .ui.menu .right.menu > .item::before { right: auto; left: 0; } /* Remove Outer Borders */ .ui.menu .center.item:last-child::before, .ui.menu .center.menu > .item:last-child::before { display: none; } /* -------------- Vertical --------------- */ .ui.vertical.menu { display: block; flex-direction: column; background: #fff; box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15); } /* --- Item --- */ .ui.vertical.menu .item { display: block; background: none; border-top: none; border-right: none; } .ui.vertical.menu > .item:first-child { border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.vertical.menu > .item:last-child { border-radius: 0 0 0.28571429rem 0.28571429rem; } /* --- Label --- */ .ui.vertical.menu .item > .label { float: right; text-align: center; } /* --- Icon --- */ .ui.vertical.menu .item > i.icon, .ui.vertical.menu .item > i.icons { width: 1.18em; float: right; margin: 0 0 0 0.5em; } .ui.vertical.menu .item > .label + i.icon { float: none; margin: 0 0.5em 0 0; } /* --- Border --- */ .ui.vertical.menu .item::before { position: absolute; content: ""; top: 0; left: 0; width: 100%; height: 1px; background: rgba(34, 36, 38, 0.1); } .ui.vertical.menu .item:first-child::before { display: none !important; } /* --- Sub Menu --- */ .ui.vertical.menu .item > .menu { margin: 0.5em -1.14285714em 0; } .ui.vertical.menu .menu .item { background: none; padding: 0.5em 1.33333333em; font-size: 0.85714286em; color: rgba(0, 0, 0, 0.5); } .ui.vertical.menu .item .menu a.item:hover, .ui.vertical.menu .item .menu .link.item:hover { color: rgba(0, 0, 0, 0.85); } .ui.vertical.menu .menu .item::before { display: none; } /* Vertical Active */ .ui.vertical.menu .active.item { background: rgba(0, 0, 0, 0.05); border-radius: 0; box-shadow: none; } .ui.vertical.menu > .active.item:first-child { border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.vertical.menu > .active.item:last-child { border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui.vertical.menu > .active.item:only-child { border-radius: 0.28571429rem; } .ui.vertical.menu .active.item .menu .active.item { border-left: none; } .ui.vertical.menu .item .menu .active.item { background-color: transparent; font-weight: bold; color: rgba(0, 0, 0, 0.95); } /* -------------- Tabular --------------- */ .ui.tabular.menu { border-radius: 0; box-shadow: none !important; border: none; background: none transparent; border-bottom: 1px solid #d4d4d5; } .ui.tabular.fluid.menu { width: calc(100% + 2px) !important; } .ui.tabular.menu .item { background: transparent; border-bottom: none; border-left: 1px solid transparent; border-right: 1px solid transparent; border-top: 2px solid transparent; padding: 0.92857143em 1.42857143em; color: rgba(0, 0, 0, 0.87); } .ui.tabular.menu .item::before { display: none; } /* Hover */ .ui.tabular.menu .item:hover { background-color: transparent; color: rgba(0, 0, 0, 0.8); } /* Active */ .ui.tabular.menu .active.item { background: none #fff; color: rgba(0, 0, 0, 0.95); border-top-width: 1px; border-color: #d4d4d5; font-weight: bold; margin-bottom: -1px; box-shadow: none; border-radius: 0.28571429rem 0.28571429rem 0 0 !important; } .ui.tabular.menu .active.item:hover { cursor: default; } /* Coupling with segment for attachment */ .ui.tabular.menu ~ .attached:not(.top).segment { border-top: none; margin-left: 0; margin-top: 0; margin-right: 0; width: 100%; } .top.attached.segment + .ui.bottom.tabular.menu { position: relative; width: calc(100% + 2px); left: -1px; } /* Bottom Vertical Tabular */ .ui.bottom.tabular.menu { background: none transparent; border-radius: 0; box-shadow: none !important; border-bottom: none; border-top: 1px solid #d4d4d5; } .ui.bottom.tabular.menu .item { background: none; border-left: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; border-top: none; } .ui.bottom.tabular.menu .active.item { background: none #fff; color: rgba(0, 0, 0, 0.95); border-color: #d4d4d5; margin: -1px 0 0 0; border-radius: 0 0 0.28571429rem 0.28571429rem !important; } /* Vertical Tabular (Left) */ .ui.vertical.tabular.menu { background: none transparent; border-radius: 0; box-shadow: none !important; border-bottom: none; border-right: 1px solid #d4d4d5; } .ui.vertical.tabular.menu .item { background: none; border-left: 1px solid transparent; border-bottom: 1px solid transparent; border-top: 1px solid transparent; border-right: none; } .ui.vertical.tabular.menu .active.item { background: none #fff; color: rgba(0, 0, 0, 0.95); border-color: #d4d4d5; margin: 0 -1px 0 0; border-radius: 0.28571429rem 0 0 0.28571429rem !important; } /* Vertical Right Tabular */ .ui.vertical.right.tabular.menu { background: none transparent; border-radius: 0; box-shadow: none !important; border-bottom: none; border-right: none; border-left: 1px solid #d4d4d5; } .ui.vertical.right.tabular.menu .item { background: none; border-right: 1px solid transparent; border-bottom: 1px solid transparent; border-top: 1px solid transparent; border-left: none; } .ui.vertical.right.tabular.menu .active.item { background: none #fff; color: rgba(0, 0, 0, 0.95); border-color: #d4d4d5; margin: 0 0 0 -1px; border-radius: 0 0.28571429rem 0.28571429rem 0 !important; } /* Dropdown */ .ui.tabular.menu .active.dropdown.item { margin-bottom: 0; border-left: 1px solid transparent; border-right: 1px solid transparent; border-top: 2px solid transparent; border-bottom: none; } .ui.inverted.tabular.menu .active.item, .ui.inverted.tabular.menu .active.item:hover { background: none #1b1c1d; border-color: #555; } .ui.inverted.tabular.menu .item:not(.active):hover { color: #ffffff; background: transparent; cursor: pointer; } /* -------------- Pagination --------------- */ .ui.pagination.menu { margin: 0; display: inline-flex; vertical-align: middle; } .ui.pagination.menu .item:last-child { border-radius: 0 0.28571429rem 0.28571429rem 0; } .ui.compact.menu .item:last-child { border-radius: 0 0.28571429rem 0.28571429rem 0; } .ui.pagination.menu:not(.wrapping) .item:last-child::before { display: none; } .ui.pagination.menu .item { min-width: 3em; text-align: center; } .ui.pagination.menu .icon.item i.icon { vertical-align: top; } /* Active */ .ui.pagination.menu .active.item { border-top: none; padding-top: 0.92857143em; background-color: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.95); box-shadow: none; } /* -------------- Secondary --------------- */ .ui.secondary.menu { background: none; margin-left: -0.35714286em; margin-right: -0.35714286em; border-radius: 0; border: none; box-shadow: none; } /* Item */ .ui.secondary.menu .item { align-self: center; box-shadow: none; border: none; padding: 0.78571429em 0.92857143em; margin: 0 0.35714286em; background: none; transition: color 0.1s ease; border-radius: 0.28571429rem; } /* No Divider */ .ui.secondary.menu .item::before { display: none !important; } /* Header */ .ui.secondary.menu .header.item { border-radius: 0; border-right: none; background: none transparent; } /* Image */ .ui.secondary.menu .item > img:not(.ui) { margin: 0; } /* Hover */ .ui.secondary.menu .dropdown.item:hover, .ui.secondary.menu .link.item:hover, .ui.secondary.menu a.item:hover { background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.95); } /* Active */ .ui.secondary.menu .active.item { box-shadow: none; background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.95); border-radius: 0.28571429rem; } /* Active Hover */ .ui.secondary.menu .active.item:hover { box-shadow: none; background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.95); } /* Inverted */ .ui.secondary.inverted.menu .link.item:not(.disabled), .ui.secondary.inverted.menu a.item:not(.disabled) { color: rgba(255, 255, 255, 0.7); } .ui.secondary.inverted.menu .dropdown.item:hover, .ui.secondary.inverted.menu .link.item:hover, .ui.secondary.inverted.menu a.item:hover { background: rgba(255, 255, 255, 0.08); color: #ffffff; } .ui.secondary.inverted.menu .active.item { background: rgba(255, 255, 255, 0.15); color: #ffffff; } /* Fix item margins */ .ui.secondary.item.menu { margin-left: 0; margin-right: 0; } .ui.secondary.item.menu .item:last-child { margin-right: 0; } .ui.secondary.attached.menu { box-shadow: none; } /* --------------------- Secondary Vertical ----------------------- */ /* Sub Menu */ .ui.vertical.secondary.menu .item:not(.dropdown) > .menu { margin: 0 -0.92857143em; } .ui.vertical.secondary.menu .item:not(.dropdown) > .menu > .item { margin: 0; padding: 0.5em 1.33333333em; } .ui.secondary.vertical.menu > .item { border: none; margin: 0 0 0.35714286em; border-radius: 0.28571429rem !important; } .ui.secondary.vertical.menu > .header.item { border-radius: 0; } /* Sub Menu */ .ui.vertical.secondary.menu .item > .menu .item { background-color: transparent; } /* Inverted */ .ui.secondary.inverted.menu { background-color: transparent; } /* --------------------- Secondary Pointing ----------------------- */ .ui.secondary.pointing.menu { margin-left: 0; margin-right: 0; border-bottom: 2px solid rgba(34, 36, 38, 0.15); } .ui.secondary.pointing.menu .item { border-bottom: 2px solid transparent; border-radius: 0; align-self: flex-end; margin: 0 0 -2px; padding: 0.85714286em 1.14285714em; transition: color 0.1s ease; } .ui.secondary.pointing.menu .ui.dropdown .menu .item { border-bottom-width: 0; } .ui.secondary.pointing.menu .item > .label:not(.floating) { margin-top: -0.3em; margin-bottom: -0.3em; } .ui.secondary.pointing.menu .item > .circular.label { margin-top: -0.5em; margin-bottom: -0.5em; } /* Item Types */ .ui.secondary.pointing.menu .header.item { color: rgba(0, 0, 0, 0.85) !important; } .ui.secondary.pointing.menu .text.item { box-shadow: none !important; } .ui.secondary.pointing.menu .item::after { display: none; } /* Hover */ .ui.secondary.pointing.menu .dropdown.item:hover, .ui.secondary.pointing.menu .link.item:hover, .ui.secondary.pointing.menu a.item:hover { background-color: transparent; color: rgba(0, 0, 0, 0.87); } /* Pressed */ .ui.secondary.pointing.menu .dropdown.item:active, .ui.secondary.pointing.menu .link.item:active, .ui.secondary.pointing.menu a.item:active { background-color: transparent; border-color: rgba(34, 36, 38, 0.15); } /* Active */ .ui.secondary.pointing.menu .active.item { background-color: transparent; box-shadow: none; border-color: currentColor; font-weight: bold; color: rgba(0, 0, 0, 0.95); } /* Active Hover */ .ui.secondary.pointing.menu .active.item:hover { border-color: currentColor; color: rgba(0, 0, 0, 0.95); } /* Active Dropdown */ .ui.secondary.pointing.menu .active.dropdown.item { border-color: transparent; } /* Vertical Pointing */ .ui.secondary.vertical.pointing.menu { border-bottom-width: 0; border-right: 2px solid rgba(34, 36, 38, 0.15); } .ui.secondary.vertical.pointing.menu .item { border-bottom: none; border-right: 2px solid transparent; border-radius: 0 !important; margin: 0 -2px 0 0; } /* Vertical Active */ .ui.secondary.vertical.pointing.menu .active.item { border-color: currentColor; } /* Inverted */ .ui.secondary.inverted.pointing.menu { border-color: rgba(255, 255, 255, 0.1); } .ui.secondary.inverted.pointing.menu .item:not(.disabled) { color: rgba(255, 255, 255, 0.9); } .ui.secondary.inverted.pointing.menu .header.item { color: #fff !important; } /* Hover */ .ui.secondary.inverted.pointing.menu .link.item:hover, .ui.secondary.inverted.pointing.menu a.item:hover { color: #ffffff; } /* Active */ .ui.ui.secondary.inverted.pointing.menu .active.item { border-color: #fff; color: #ffffff; background-color: transparent; } /* -------------- Text Menu --------------- */ .ui.text.menu { background: none transparent; border-radius: 0; box-shadow: none; border: none; margin: 1em -0.5em; } .ui.text.menu .item { border-radius: 0; box-shadow: none; align-self: center; margin: 0; padding: 0.35714286em 0.5em; font-weight: normal; color: rgba(0, 0, 0, 0.6); transition: opacity 0.1s ease; } /* Border */ .ui.text.menu .item::before, .ui.text.menu .menu .item::before { display: none !important; } /* Header */ .ui.text.menu .header.item { background-color: transparent; opacity: 1; color: rgba(0, 0, 0, 0.85); font-size: 0.92857143em; text-transform: uppercase; font-weight: bold; } /* Image */ .ui.text.menu .item > img:not(.ui) { margin: 0; } /* --- fluid text --- */ .ui.text.item.menu .item { margin: 0; } /* --- vertical text --- */ .ui.vertical.text.menu { margin: 1em 0; } .ui.vertical.text.menu:first-child { margin-top: 0; } .ui.vertical.text.menu:last-child { margin-bottom: 0; } .ui.vertical.text.menu .item { margin: 0.57142857em 0; padding-left: 0; padding-right: 0; } .ui.vertical.text.menu .item > i.icon { float: none; margin: 0 0.35714286em 0 0; } .ui.vertical.text.menu .header.item { margin: 0.57142857em 0 0.71428571em; } /* Vertical Sub Menu */ .ui.vertical.text.menu .item:not(.dropdown) > .menu { margin: 0; } .ui.vertical.text.menu .item:not(.dropdown) > .menu > .item { margin: 0; padding: 0.5em 0; } /* --- hover --- */ .ui.text.menu .item:hover { opacity: 1; background-color: transparent; } /* --- active --- */ .ui.text.menu .active.item { background-color: transparent; border: none; box-shadow: none; font-weight: normal; color: rgba(0, 0, 0, 0.95); } /* --- active hover --- */ .ui.text.menu .active.item:hover { background-color: transparent; } /* Disable Bariations */ .ui.text.pointing.menu .active.item::after { box-shadow: none; } .ui.text.attached.menu { box-shadow: none; } /* Inverted */ .ui.inverted.text.menu, .ui.inverted.text.menu .item, .ui.inverted.text.menu .item:hover, .ui.inverted.text.menu .active.item { background-color: transparent; } /* Fluid */ .ui.fluid.text.menu { margin-left: 0; margin-right: 0; } /* -------------- Icon Only --------------- */ /* Vertical Menu */ .ui.vertical.icon.menu { display: inline-block; width: auto; } /* Item */ .ui.icon.menu .item { height: auto; text-align: center; color: #1b1c1d; } /* Icon */ .ui.icon.menu .item > i.icon:not(.dropdown) { margin: 0; opacity: 1; } /* Icon Glyph */ .ui.icon.menu i.icon::before { opacity: 1; } /* (x) Item Icon */ .ui.menu .icon.item > i.icon { width: auto; margin: 0 auto; } /* Vertical Icon */ .ui.vertical.icon.menu .item > i.icon:not(.dropdown) { display: block; opacity: 1; margin: 0 auto; float: none; } /* Inverted */ .ui.inverted.icon.menu .item { color: #fff; } /* -------------- Labeled Icon --------------- */ /* Menu */ .ui.labeled.icon.menu { text-align: center; } /* Item */ .ui.labeled.icon.menu .item { min-width: 6em; flex-direction: column; } /* Icon */ .ui.labeled.icon.menu > .right.menu > .item > i.icon:not(.dropdown), .ui.labeled.icon.menu > .item > i.icon:not(.dropdown) { height: 1em; display: block; font-size: 1.71428571em !important; margin: 0 auto 0.5rem !important; } /* Fluid */ .ui.fluid.labeled.icon.menu > .item { min-width: 0; } /******************************* Variations *******************************/ /* -------------- Stackable --------------- */ @media only screen and (max-width: 767.98px) { .ui.stackable.menu { flex-direction: column; } .ui.stackable.menu.pointing .active.item::after { display: none; } .ui.stackable.menu .item { width: 100% !important; } .ui.stackable.menu .item::before { position: absolute; content: ""; top: auto; bottom: 0; left: 0; width: 100%; height: 1px; background: rgba(34, 36, 38, 0.1); } .ui.stackable.menu .left.menu, .ui.stackable.menu .left.item { margin-right: 0 !important; } .ui.stackable.menu .right.menu, .ui.stackable.menu .right.item { margin-left: 0 !important; } .ui.stackable.menu .center.menu, .ui.stackable.menu .center.item { margin-left: 0 !important; margin-right: 0 !important; } .ui.stackable.menu .right.menu, .ui.stackable.menu .center.menu, .ui.stackable.menu .left.menu { flex-direction: column; } } /* -------------- Colors --------------- */ .ui.ui.ui.menu .primary.active.item, .ui.ui.primary.menu .active.item:hover, .ui.ui.primary.menu .active.item { color: #2185d0; } .ui.ui.ui.menu .red.active.item, .ui.ui.red.menu .active.item:hover, .ui.ui.red.menu .active.item { color: #db2828; } .ui.ui.ui.menu .orange.active.item, .ui.ui.orange.menu .active.item:hover, .ui.ui.orange.menu .active.item { color: #f2711c; } .ui.ui.ui.menu .yellow.active.item, .ui.ui.yellow.menu .active.item:hover, .ui.ui.yellow.menu .active.item { color: #fbbd08; } .ui.ui.ui.menu .olive.active.item, .ui.ui.olive.menu .active.item:hover, .ui.ui.olive.menu .active.item { color: #b5cc18; } .ui.ui.ui.menu .green.active.item, .ui.ui.green.menu .active.item:hover, .ui.ui.green.menu .active.item { color: #21ba45; } .ui.ui.ui.menu .teal.active.item, .ui.ui.teal.menu .active.item:hover, .ui.ui.teal.menu .active.item { color: #00b5ad; } .ui.ui.ui.menu .blue.active.item, .ui.ui.blue.menu .active.item:hover, .ui.ui.blue.menu .active.item { color: #2185d0; } .ui.ui.ui.menu .violet.active.item, .ui.ui.violet.menu .active.item:hover, .ui.ui.violet.menu .active.item { color: #6435c9; } .ui.ui.ui.menu .purple.active.item, .ui.ui.purple.menu .active.item:hover, .ui.ui.purple.menu .active.item { color: #a333c8; } .ui.ui.ui.menu .pink.active.item, .ui.ui.pink.menu .active.item:hover, .ui.ui.pink.menu .active.item { color: #e03997; } .ui.ui.ui.menu .brown.active.item, .ui.ui.brown.menu .active.item:hover, .ui.ui.brown.menu .active.item { color: #a5673f; } .ui.ui.ui.menu .grey.active.item, .ui.ui.grey.menu .active.item:hover, .ui.ui.grey.menu .active.item { color: #767676; } .ui.ui.ui.menu .black.active.item, .ui.ui.black.menu .active.item:hover, .ui.ui.black.menu .active.item { color: #1b1c1d; } /* -------------- Inverted --------------- */ .ui.inverted.menu { border: 0 solid transparent; background: #1b1c1d; box-shadow: none; } /* Menu Item */ .ui.inverted.menu .item, .ui.inverted.menu .item > a:not(.ui) { background: transparent; color: rgba(255, 255, 255, 0.9); } .ui.inverted.menu .item.menu { background: transparent; } /* --- Border --- */ .ui.inverted.menu .item::before { background: rgba(255, 255, 255, 0.08); } .ui.vertical.inverted.menu .item::before { background: rgba(255, 255, 255, 0.08); } /* Sub Menu */ .ui.vertical.inverted.menu .menu .item, .ui.vertical.inverted.menu .menu .item a:not(.ui) { color: rgba(255, 255, 255, 0.5); } /* Header */ .ui.inverted.menu .header.item { margin: 0; background: transparent; box-shadow: none; } /* Disabled */ .ui.ui.inverted.menu .item.disabled { color: rgba(225, 225, 225, 0.3); } /* --- Hover --- */ .ui.link.inverted.menu .item:hover, .ui.inverted.menu .dropdown.item:hover, .ui.inverted.menu .link.item:hover, .ui.inverted.menu a.item:hover { background: rgba(255, 255, 255, 0.08); color: #ffffff; } .ui.vertical.inverted.menu .item .menu a.item:hover, .ui.vertical.inverted.menu .item .menu .link.item:hover { background: transparent; color: #ffffff; } /* --- Pressed --- */ .ui.inverted.menu a.item:active, .ui.inverted.menu .link.item:active { background: rgba(255, 255, 255, 0.08); color: #ffffff; } /* --- Active --- */ .ui.inverted.menu .active.item { background: #3d3e3f; color: #ffffff !important; } .ui.inverted.vertical.menu .item .menu .active.item { background: transparent; color: #fff; } .ui.inverted.pointing.menu .active.item::after { background: #3d3e3f; margin: 0 !important; box-shadow: none !important; border: none !important; } /* --- Active Hover --- */ .ui.inverted.menu .active.item:hover { background: #3d3e3f; color: #fff !important; } .ui.inverted.pointing.menu .active.item:hover::after { background: #3d3e3f; } /* -------------- Floated --------------- */ .ui.floated.menu { float: left; margin: 0 0.5rem 0 0; } .ui.floated.menu .item:last-child::before { display: none; } .ui.right.floated.menu { float: right; margin: 0 0 0 0.5rem; } .ui.center.aligned.menu:not(.fluid), .ui.centered.menu:not(.fluid) { display: inline-flex; transform: translateX(-50%); margin-left: 50%; } .ui.center.aligned.menu .item, .ui.centered.menu .item { flex: 1 0 auto; justify-content: center; } /* -------------- Inverted --------------- */ .ui.ui.ui.inverted.menu .primary.active.item, .ui.ui.inverted.primary.menu { background-color: #2185d0; } .ui.inverted.primary.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.primary.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.primary.menu .active.item { background-color: #1678c2; } .ui.ui.ui.inverted.menu .red.active.item, .ui.ui.inverted.red.menu { background-color: #db2828; } .ui.inverted.red.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.red.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.red.menu .active.item { background-color: #d01919; } .ui.ui.ui.inverted.menu .orange.active.item, .ui.ui.inverted.orange.menu { background-color: #f2711c; } .ui.inverted.orange.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.orange.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.orange.menu .active.item { background-color: #f26202; } .ui.ui.ui.inverted.menu .yellow.active.item, .ui.ui.inverted.yellow.menu { background-color: #fbbd08; } .ui.inverted.yellow.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.yellow.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.yellow.menu .active.item { background-color: #eaae00; } .ui.ui.ui.inverted.menu .olive.active.item, .ui.ui.inverted.olive.menu { background-color: #b5cc18; } .ui.inverted.olive.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.olive.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.olive.menu .active.item { background-color: #a7bd0d; } .ui.ui.ui.inverted.menu .green.active.item, .ui.ui.inverted.green.menu { background-color: #21ba45; } .ui.inverted.green.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.green.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.green.menu .active.item { background-color: #16ab39; } .ui.ui.ui.inverted.menu .teal.active.item, .ui.ui.inverted.teal.menu { background-color: #00b5ad; } .ui.inverted.teal.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.teal.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.teal.menu .active.item { background-color: #009c95; } .ui.ui.ui.inverted.menu .blue.active.item, .ui.ui.inverted.blue.menu { background-color: #2185d0; } .ui.inverted.blue.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.blue.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.blue.menu .active.item { background-color: #1678c2; } .ui.ui.ui.inverted.menu .violet.active.item, .ui.ui.inverted.violet.menu { background-color: #6435c9; } .ui.inverted.violet.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.violet.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.violet.menu .active.item { background-color: #5829bb; } .ui.ui.ui.inverted.menu .purple.active.item, .ui.ui.inverted.purple.menu { background-color: #a333c8; } .ui.inverted.purple.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.purple.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.purple.menu .active.item { background-color: #9627ba; } .ui.ui.ui.inverted.menu .pink.active.item, .ui.ui.inverted.pink.menu { background-color: #e03997; } .ui.inverted.pink.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.pink.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.pink.menu .active.item { background-color: #e61a8d; } .ui.ui.ui.inverted.menu .brown.active.item, .ui.ui.inverted.brown.menu { background-color: #a5673f; } .ui.inverted.brown.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.brown.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.brown.menu .active.item { background-color: #975b33; } .ui.ui.ui.inverted.menu .grey.active.item, .ui.ui.inverted.grey.menu { background-color: #767676; } .ui.inverted.grey.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.grey.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.grey.menu .active.item { background-color: #838383; } .ui.ui.ui.inverted.menu .black.active.item, .ui.ui.inverted.black.menu { background-color: #1b1c1d; } .ui.inverted.black.menu .item::before { background-color: rgba(34, 36, 38, 0.1); } .ui.ui.inverted.black.menu .active.item { background-color: rgba(0, 0, 0, 0.1); } .ui.inverted.pointing.black.menu .active.item { background-color: #27292a; } .ui.ui.ui.inverted.pointing.menu .active.item::after { background-color: inherit; } /* -------------- Fitted --------------- */ .ui.fitted.menu .item, .ui.fitted.menu .item .menu .item, .ui.menu .fitted.item { padding: 0; } .ui.horizontally.fitted.menu .item, .ui.horizontally.fitted.menu .item .menu .item, .ui.menu .horizontally.fitted.item { padding-top: 0.92857143em; padding-bottom: 0.92857143em; } .ui.vertically.fitted.menu .item, .ui.vertically.fitted.menu .item .menu .item, .ui.menu .vertically.fitted.item { padding-left: 1.14285714em; padding-right: 1.14285714em; } /* -------------- Borderless --------------- */ .ui.borderless.menu .item::before, .ui.borderless.menu .item .menu .item::before, .ui.menu .borderless.item::before { background: none !important; } /* ------------------- Compact -------------------- */ .ui.compact.menu { display: inline-flex; margin: 0; vertical-align: middle; } .ui.compact.vertical.menu { /* IE hack to make dropdown icons appear inline */ display: -ms-inline-flexbox !important; display: inline-block; } .ui.compact.menu:not(.secondary) .item:last-child { border-radius: 0 0.28571429rem 0.28571429rem 0; } .ui.compact.menu .item:last-child::before { display: none; } .ui.compact.vertical.menu { width: auto !important; } .ui.compact.vertical.menu .item:last-child::before { display: block; } /* ------------------- Fluid -------------------- */ .ui.menu.fluid, .ui.vertical.menu.fluid { width: 100% !important; } /* ------------------- Evenly Sized -------------------- */ .ui[class*="equal width"].menu > .item { flex: 1; } .ui[class*="equal width"].menu > .item, .ui.item.menu, .ui.item.menu .item { width: 100%; padding-left: 0 !important; padding-right: 0 !important; margin-left: 0 !important; margin-right: 0 !important; text-align: center; justify-content: center; } .ui.attached[class*="equal width"].menu:not(.tabular), .ui.attached.item.menu:not(.tabular) { margin: 0 -1px !important; } .ui[class*="equal width"].menu > .item:last-child::before, .ui.item.menu .item:last-child::before { display: none; } .ui.menu.two.item .item { width: 50%; } .ui.menu.three.item .item { width: 33.333%; } .ui.menu.four.item .item { width: 25%; } .ui.menu.five.item .item { width: 20%; } .ui.menu.six.item .item { width: 16.666%; } .ui.menu.seven.item .item { width: 14.285%; } .ui.menu.eight.item .item { width: 12.5%; } .ui.menu.nine.item .item { width: 11.11%; } .ui.menu.ten.item .item { width: 10%; } .ui.menu.eleven.item .item { width: 9.09%; } .ui.menu.twelve.item .item { width: 8.333%; } /* -------------- Fixed --------------- */ .ui.menu.fixed { position: fixed; z-index: 101; margin: 0; width: 100%; } .ui.menu.fixed, .ui.menu.fixed .item:first-child, .ui.menu.fixed .item:last-child { border-radius: 0 !important; } .ui.fixed.menu, .ui[class*="top fixed"].menu { top: 0; left: 0; right: auto; bottom: auto; } .ui[class*="top fixed"].menu { border-top: none; border-left: none; border-right: none; } .ui[class*="right fixed"].menu { border-top: none; border-bottom: none; border-right: none; top: 0; right: 0; left: auto; bottom: auto; width: auto; height: 100%; } .ui[class*="bottom fixed"].menu { border-bottom: none; border-left: none; border-right: none; bottom: 0; left: 0; top: auto; right: auto; } .ui[class*="left fixed"].menu { border-top: none; border-bottom: none; border-left: none; top: 0; left: 0; right: auto; bottom: auto; width: auto; height: 100%; } /* Coupling with Grid */ .ui.fixed.menu + .ui.grid { padding-top: 2.75rem; } /* ------------------- Pointing -------------------- */ .ui.pointing.menu .item::after { visibility: hidden; position: absolute; content: ""; top: 100%; left: 50%; transform: translateX(-50%) translateY(-50%) rotate(45deg); background: none; margin: 0.5px 0 0; width: 0.57142857em; height: 0.57142857em; border: none; border-bottom: 1px solid #d4d4d5; border-right: 1px solid #d4d4d5; z-index: 2; transition: background 0.1s ease; } .ui.vertical.pointing.menu .item::after { position: absolute; top: 50%; right: 0; bottom: auto; left: auto; transform: translateX(50%) translateY(-50%) rotate(45deg); margin: 0 -0.5px 0 0; border: none; border-top: 1px solid #d4d4d5; border-right: 1px solid #d4d4d5; } .ui.pointing.menu .ui.dropdown .menu .item::after, .ui.vertical.pointing.menu .ui.dropdown .menu .item::after { display: none; } /* Active */ .ui.pointing.menu .active.item::after { visibility: visible; } .ui.pointing.menu .active.dropdown.item::after { visibility: hidden; } /* Don't double up pointers */ .ui.pointing.menu .dropdown.active.item::after, .ui.pointing.menu .active.item .menu .active.item::after { display: none; } /* Colors */ .ui.pointing.menu .active.item:hover::after { background-color: #f2f2f2; } .ui.pointing.menu .active.item::after { background-color: #f2f2f2; } .ui.pointing.menu .active.item:hover::after { background-color: #f2f2f2; } .ui.vertical.pointing.menu .active.item:hover::after { background-color: #f2f2f2; } .ui.vertical.pointing.menu .active.item::after { background-color: #f2f2f2; } .ui.vertical.pointing.menu .menu .active.item::after { background-color: #fff; } @media only screen and (max-width: 767.98px) { .ui.stackable.grid .ui.fluid.vertical.pointing.menu .active.item::after { display: none; } } .ui.inverted.pointing.menu .primary.active.item::after { background-color: #2185d0; } .ui.inverted.pointing.menu .secondary.active.item::after { background-color: #1b1c1d; } .ui.inverted.pointing.menu .red.active.item::after { background-color: #db2828; } .ui.inverted.pointing.menu .orange.active.item::after { background-color: #f2711c; } .ui.inverted.pointing.menu .yellow.active.item::after { background-color: #fbbd08; } .ui.inverted.pointing.menu .olive.active.item::after { background-color: #b5cc18; } .ui.inverted.pointing.menu .green.active.item::after { background-color: #21ba45; } .ui.inverted.pointing.menu .teal.active.item::after { background-color: #00b5ad; } .ui.inverted.pointing.menu .blue.active.item::after { background-color: #2185d0; } .ui.inverted.pointing.menu .violet.active.item::after { background-color: #6435c9; } .ui.inverted.pointing.menu .purple.active.item::after { background-color: #a333c8; } .ui.inverted.pointing.menu .pink.active.item::after { background-color: #e03997; } .ui.inverted.pointing.menu .brown.active.item::after { background-color: #a5673f; } .ui.inverted.pointing.menu .grey.active.item::after { background-color: #767676; } .ui.inverted.pointing.menu .black.active.item::after { background-color: #1b1c1d; } /* -------------- Attached --------------- */ /* Middle */ .ui.attached.menu { top: 0; bottom: 0; border-radius: 0; margin: 0 -1px; width: calc(100% + 2px); max-width: calc(100% + 2px); box-shadow: none; } .ui.attached + .ui.attached.menu:not(.top) { border-top: none; } /* Top */ .ui[class*="top attached"].menu { bottom: 0; margin-bottom: 0; top: 0; margin-top: 1rem; border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.menu[class*="top attached"]:first-child { margin-top: 0; } /* Bottom */ .ui[class*="bottom attached"].menu { bottom: 0; margin-top: 0; top: 0; margin-bottom: 1rem; box-shadow: none; border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui[class*="bottom attached"].menu:last-child { margin-bottom: 0; } /* Attached Menu Item */ .ui.top.attached.menu > .item:first-child { border-radius: 0.28571429rem 0 0 0; } .ui.bottom.attached.menu > .item:first-child { border-radius: 0 0 0 0.28571429rem; } /* Tabular Attached */ .ui.attached.menu:not(.tabular):not(.text) { border: 1px solid #d4d4d5; } .ui.attached.inverted.menu { border: none; } .ui[class*="top attached"].inverted.tabular.menu { border-bottom: 1px solid #555; } .ui.attached.tabular.menu { margin-left: 0; margin-right: 0; width: 100%; } .ui.wrapping.menu { flex-wrap: wrap; } .ui.wrapping.menu .item::before { right: auto; left: 0; } .ui.wrapping.menu .item:first-child::before { display: none; } .ui.wrapping.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) .item:last-of-type, .ui.wrapping.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) .item:last-child { border-right: 1px solid rgba(34, 36, 38, 0.1); } .ui.wrapped.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) .item:first-child { border-bottom-left-radius: 0; } .ui.wrapped.menu:not(.secondary):not(.text):not(.tabular):not(.borderless) .item:last-child { border-top-right-radius: 0; } /* -------------- Sizes --------------- */ .ui.menu { font-size: 1rem; } .ui.vertical.menu { width: 15rem; } .ui.mini.menu, .ui.mini.menu .dropdown, .ui.mini.menu .dropdown .menu > .item { font-size: 0.78571429rem; } .ui.mini.vertical.menu:not(.icon) { width: 9rem; } .ui.tiny.menu, .ui.tiny.menu .dropdown, .ui.tiny.menu .dropdown .menu > .item { font-size: 0.85714286rem; } .ui.tiny.vertical.menu:not(.icon) { width: 11rem; } .ui.small.menu, .ui.small.menu .dropdown, .ui.small.menu .dropdown .menu > .item { font-size: 0.92857143rem; } .ui.small.vertical.menu:not(.icon) { width: 13rem; } .ui.large.menu, .ui.large.menu .dropdown, .ui.large.menu .dropdown .menu > .item { font-size: 1.07142857rem; } .ui.large.vertical.menu:not(.icon) { width: 18rem; } .ui.big.menu, .ui.big.menu .dropdown, .ui.big.menu .dropdown .menu > .item { font-size: 1.14285714rem; } .ui.big.vertical.menu:not(.icon) { width: 20rem; } .ui.huge.menu, .ui.huge.menu .dropdown, .ui.huge.menu .dropdown .menu > .item { font-size: 1.21428571rem; } .ui.huge.vertical.menu:not(.icon) { width: 22rem; } .ui.massive.menu, .ui.massive.menu .dropdown, .ui.massive.menu .dropdown .menu > .item { font-size: 1.28571429rem; } .ui.massive.vertical.menu:not(.icon) { width: 25rem; } /* ------------------- Inverted dropdowns -------------------- */ .ui.menu .ui.inverted.inverted.dropdown.item .menu { background: #1b1c1d; box-shadow: none; } .ui.menu .ui.inverted.dropdown .menu > .item { color: rgba(255, 255, 255, 0.8) !important; } .ui.menu .ui.inverted.dropdown .menu > .active.item { background: transparent !important; color: rgba(255, 255, 255, 0.8) !important; } .ui.menu .ui.inverted.dropdown .menu > .item:hover { background: rgba(255, 255, 255, 0.08) !important; color: rgba(255, 255, 255, 0.8) !important; } .ui.menu .ui.inverted.dropdown .menu > .selected.item { background: rgba(255, 255, 255, 0.15) !important; color: rgba(255, 255, 255, 0.8) !important; } /* Vertical */ .ui.vertical.menu .inverted.dropdown.item .menu { box-shadow: none; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/message.css ================================================ /*! * # Fomantic-UI 2.9.4 - Message * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Message *******************************/ .ui.message { position: relative; min-height: 1em; margin: 1em 0; background: #f8f8f9; padding: 1em 1.5em; line-height: 1.4285em; color: rgba(0, 0, 0, 0.87); transition: opacity 0.1s ease, color 0.1s ease, background 0.1s ease, box-shadow 0.1s ease; border-radius: 0.28571429rem; box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.22) inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.message:first-child { margin-top: 0; } .ui.message:last-child { margin-bottom: 0; } /* -------------- Content --------------- */ /* Header */ .ui.message .header { display: block; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-weight: bold; margin: -0.14285714em 0 0 0; } /* Default font size */ .ui.message .header:not(.ui) { font-size: 1.14285714em; } /* Paragraph */ .ui.message p { opacity: 0.85; margin: 0.75em 0; } .ui.message p:first-child { margin-top: 0; } .ui.message p:last-child { margin-bottom: 0; } .ui.message .header + p { margin-top: 0.25em; } /* List */ .ui.message .list:not(.ui) { text-align: left; padding: 0; opacity: 0.85; list-style-position: inside; margin: 0.5em 0 0; } .ui.message .list:not(.ui):first-child { margin-top: 0; } .ui.message .list:not(.ui):last-child { margin-bottom: 0; } .ui.message .list:not(.ui) li { position: relative; list-style-type: none; margin: 0 0 0.3em 1em; padding: 0; } .ui.message .list:not(.ui) li::before { position: absolute; content: "•"; left: -1em; height: 100%; vertical-align: baseline; } .ui.message .list:not(.ui) li:last-child { margin-bottom: 0; } /* Icon */ .ui.icon.message > .icons, .ui.icon.message > i.icon { margin-right: 0.6em; } .ui.icon.message > .icons:last-child, .ui.icon.message > i.icon:last-child { margin: 0 0 0 0.6em; } /* Close Icon */ .ui.message > .close.icon { cursor: pointer; position: absolute; margin: 0; top: 0.78575em; right: 0.5em; opacity: 0.7; transition: opacity 0.1s ease; } .ui.message > .close.icon:hover { opacity: 1; } /* First / Last Element */ .ui.message > :first-child { margin-top: 0; } .ui.message > :last-child { margin-bottom: 0; } /******************************* Coupling *******************************/ .ui.dropdown .menu > .message { margin: 0 -1px; } /******************************* States *******************************/ /* -------------- Visible --------------- */ .ui.visible.visible.visible.visible.message { display: block; } .ui.icon.visible.visible.visible.visible.message { display: flex; } /* -------------- Hidden --------------- */ .ui.hidden.hidden.hidden.hidden.message { display: none; } /******************************* Variations *******************************/ .ui.centered.message, .ui.center.aligned.message { text-align: center; justify-content: center; } .ui.centered.message > .content, .ui.center.aligned.message > .content { flex: 0 0 auto; } .ui.right.aligned.message { text-align: right; } /* -------------- Compact --------------- */ .ui.compact.message { display: inline-block; max-width: 100%; } .ui.compact.icon.message { display: inline-flex; width: auto; } /* -------------- Attached --------------- */ .ui.attached.message { margin-bottom: -1px; border-radius: 0.28571429rem 0.28571429rem 0 0; box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15) inset; margin-left: -1px; margin-right: -1px; } .ui.attached + .ui.attached.message:not(.top):not(.bottom) { margin-top: -1px; border-radius: 0; } .ui.bottom.attached.message { margin-top: -1px; border-radius: 0 0 0.28571429rem 0.28571429rem; box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.15) inset, 0 1px 2px 0 rgba(34, 36, 38, 0.15); } .ui.bottom.attached.message:not(:last-child) { margin-bottom: 1em; } .ui.attached.icon.message { width: auto; } /* -------------- Icon --------------- */ .ui.icon.message { display: flex; width: 100%; align-items: center; } .ui.icon.message > .icons, .ui.icon.message > i.icon:not(.close) { display: block; flex: 0 0 auto; width: auto; line-height: 1; vertical-align: middle; font-size: 3em; opacity: 0.8; } .ui.icon.message > .content { display: block; flex: 1 1 auto; vertical-align: middle; } .ui.icon.message > .icons + .content, .ui.icon.message > i.icon:not(.close) + .content { padding-left: 0; } .ui.icon.message > i.circular { width: 1em; } /* -------------- Floating --------------- */ .ui.floating.message { box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.22) inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } /* -------------- Colors --------------- */ /* -------------- Types --------------- */ /* Colors */ .ui.positive.message { background-color: #fcfff5; color: #2c662d; } .ui.positive.message, .ui.attached.positive.message { box-shadow: 0 0 0 1px #a3c293 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.positive.message { box-shadow: 0 0 0 1px #a3c293 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.positive.message .header { color: #1a531b; } .ui.inverted.positive.message, .ui.inverted.positive.message .header { color: #a3c293; } .ui.negative.message { background-color: #fff6f6; color: #9f3a38; } .ui.negative.message, .ui.attached.negative.message { box-shadow: 0 0 0 1px #e0b4b4 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.negative.message { box-shadow: 0 0 0 1px #e0b4b4 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.negative.message .header { color: #912d2b; } .ui.inverted.negative.message, .ui.inverted.negative.message .header { color: #e0b4b4; } .ui.error.message { background-color: #fff6f6; color: #9f3a38; } .ui.error.message, .ui.attached.error.message { box-shadow: 0 0 0 1px #e0b4b4 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.error.message { box-shadow: 0 0 0 1px #e0b4b4 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.error.message .header { color: #912d2b; } .ui.inverted.error.message, .ui.inverted.error.message .header { color: #ecd1d1; } .ui.info.message { background-color: #f8ffff; color: #276f86; } .ui.info.message, .ui.attached.info.message { box-shadow: 0 0 0 1px #a9d5de inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.info.message { box-shadow: 0 0 0 1px #a9d5de inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.info.message .header { color: #0e566c; } .ui.inverted.info.message, .ui.inverted.info.message .header { color: #c6e3e9; } .ui.success.message { background-color: #fcfff5; color: #2c662d; } .ui.success.message, .ui.attached.success.message { box-shadow: 0 0 0 1px #a3c293 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.success.message { box-shadow: 0 0 0 1px #a3c293 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.success.message .header { color: #1a531b; } .ui.inverted.success.message, .ui.inverted.success.message .header { color: #b9d1ad; } .ui.warning.message { background-color: #fffaf3; color: #573a08; } .ui.warning.message, .ui.attached.warning.message { box-shadow: 0 0 0 1px #c9ba9b inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.warning.message { box-shadow: 0 0 0 1px #c9ba9b inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.warning.message .header { color: #794b02; } .ui.inverted.warning.message, .ui.inverted.warning.message .header { color: #d7ccb5; } .ui.primary.message { background-color: #dff0ff; color: rgba(255, 255, 255, 0.9); } .ui.primary.message, .ui.attached.primary.message { box-shadow: 0 0 0 1px #2185d0 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.primary.message { box-shadow: 0 0 0 1px #2185d0 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.primary.message .header { color: rgba(242, 242, 242, 0.9); } .ui.secondary.message { background-color: #f4f4f4; color: rgba(255, 255, 255, 0.9); } .ui.secondary.message, .ui.attached.secondary.message { box-shadow: 0 0 0 1px #1b1c1d inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.secondary.message { box-shadow: 0 0 0 1px #1b1c1d inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.secondary.message .header { color: rgba(242, 242, 242, 0.9); } .ui.red.message { background-color: #ffe8e6; color: #db2828; } .ui.red.message, .ui.attached.red.message { box-shadow: 0 0 0 1px #db2828 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.red.message { box-shadow: 0 0 0 1px #db2828 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.red.message .header { color: #c82121; } .ui.orange.message { background-color: #ffedde; color: #f2711c; } .ui.orange.message, .ui.attached.orange.message { box-shadow: 0 0 0 1px #f2711c inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.orange.message { box-shadow: 0 0 0 1px #f2711c inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.orange.message .header { color: #e7640d; } .ui.yellow.message { background-color: #fff8db; color: #b58105; } .ui.yellow.message, .ui.attached.yellow.message { box-shadow: 0 0 0 1px #b58105 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.yellow.message { box-shadow: 0 0 0 1px #b58105 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.yellow.message .header { color: #9c6f04; } .ui.olive.message { background-color: #fbfdef; color: #8abc1e; } .ui.olive.message, .ui.attached.olive.message { box-shadow: 0 0 0 1px #8abc1e inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.olive.message { box-shadow: 0 0 0 1px #8abc1e inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.olive.message .header { color: #7aa61a; } .ui.green.message { background-color: #e5f9e7; color: #1ebc30; } .ui.green.message, .ui.attached.green.message { box-shadow: 0 0 0 1px #1ebc30 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.green.message { box-shadow: 0 0 0 1px #1ebc30 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.green.message .header { color: #1aa62a; } .ui.teal.message { background-color: #e1f7f7; color: #10a3a3; } .ui.teal.message, .ui.attached.teal.message { box-shadow: 0 0 0 1px #10a3a3 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.teal.message { box-shadow: 0 0 0 1px #10a3a3 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.teal.message .header { color: #0e8c8c; } .ui.blue.message { background-color: #dff0ff; color: #2185d0; } .ui.blue.message, .ui.attached.blue.message { box-shadow: 0 0 0 1px #2185d0 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.blue.message { box-shadow: 0 0 0 1px #2185d0 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.blue.message .header { color: #1e77ba; } .ui.violet.message { background-color: #eae7ff; color: #6435c9; } .ui.violet.message, .ui.attached.violet.message { box-shadow: 0 0 0 1px #6435c9 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.violet.message { box-shadow: 0 0 0 1px #6435c9 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.violet.message .header { color: #5a30b5; } .ui.purple.message { background-color: #f6e7ff; color: #a333c8; } .ui.purple.message, .ui.attached.purple.message { box-shadow: 0 0 0 1px #a333c8 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.purple.message { box-shadow: 0 0 0 1px #a333c8 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.purple.message .header { color: #922eb4; } .ui.pink.message { background-color: #ffe3fb; color: #e03997; } .ui.pink.message, .ui.attached.pink.message { box-shadow: 0 0 0 1px #e03997 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.pink.message { box-shadow: 0 0 0 1px #e03997 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.pink.message .header { color: #dd238b; } .ui.brown.message { background-color: #f1e2d3; color: #a5673f; } .ui.brown.message, .ui.attached.brown.message { box-shadow: 0 0 0 1px #a5673f inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.brown.message { box-shadow: 0 0 0 1px #a5673f inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.brown.message .header { color: #935b38; } .ui.grey.message { background-color: #f4f4f4; color: #767676; } .ui.grey.message, .ui.attached.grey.message { box-shadow: 0 0 0 1px #767676 inset, 0 0 0 0 rgba(0, 0, 0, 0); } .ui.floating.grey.message { box-shadow: 0 0 0 1px #767676 inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.grey.message .header { color: #696969; } .ui.black.message { background-color: #1b1c1d; color: rgba(255, 255, 255, 0.9); } .ui.black.message .header { color: rgba(255, 255, 255, 0.9); } .ui.inverted.message { background-color: #1b1c1d; color: rgba(255, 255, 255, 0.9); } /* -------------- Sizes --------------- */ .ui.message { font-size: 1em; } .ui.mini.message { font-size: 0.78571429em; } .ui.tiny.message { font-size: 0.85714286em; } .ui.small.message { font-size: 0.92857143em; } .ui.large.message { font-size: 1.14285714em; } .ui.big.message { font-size: 1.28571429em; } .ui.huge.message { font-size: 1.42857143em; } .ui.massive.message { font-size: 1.71428571em; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/modal.css ================================================ /*! * # Fomantic-UI 2.9.4 - Modal * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Modal *******************************/ .ui.modal { position: absolute; display: none; z-index: 1001; text-align: left; background: #fff; border: none; box-shadow: 1px 3px 3px 0 rgba(0, 0, 0, 0.2), 1px 3px 15px 2px rgba(0, 0, 0, 0.2); transform-origin: 50% 25%; flex: 0 0 auto; border-radius: 0.28571429rem; -webkit-user-select: text; -ms-user-select: text; user-select: text; will-change: top, left, margin, transform, opacity; outline: none; } .ui.modal > :first-child:not(.close):not(.dimmer), .ui.modal > i.icon:first-child + *, .ui.modal > .dimmer:first-child + *:not(.close), .ui.modal > .dimmer:first-child + i.icon + * { border-top-left-radius: 0.28571429rem; border-top-right-radius: 0.28571429rem; } .ui.modal > :last-child { border-bottom-left-radius: 0.28571429rem; border-bottom-right-radius: 0.28571429rem; } .ui.modal > .ui.dimmer { border-radius: inherit; } /******************************* Content *******************************/ /* -------------- Close --------------- */ .ui.modal > .close { cursor: pointer; position: absolute; top: -2.5rem; right: -2.5rem; z-index: 1; opacity: 0.8; font-size: 1.25em; color: #fff; width: 2.25rem; height: 2.25rem; padding: 0.625rem 0 0 0; } .ui.modal > .close:focus, .ui.modal > .close:hover { opacity: 1; outline: none; } /* -------------- Header --------------- */ .ui.modal > .header { display: block; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; background: #fff; margin: 0; padding: 1.25rem 1.5rem; box-shadow: none; color: rgba(0, 0, 0, 0.85); border-bottom: 1px solid rgba(34, 36, 38, 0.15); } .ui.modal > .header:not(.ui) { font-size: 1.42857143rem; line-height: 1.28571429em; font-weight: bold; } /* -------------- Content --------------- */ .ui.modal > .content { display: block; width: 100%; font-size: 1em; line-height: 1.4; padding: 1.5rem; background: #fff; } .ui.modal > .image.content { display: flex; flex-direction: row; } /* Image */ .ui.modal > .content > .image { display: block; flex: 0 1 auto; width: ""; align-self: start; max-width: 100%; } .ui.modal > [class*="top aligned"] { align-self: start; } .ui.modal > [class*="middle aligned"] { align-self: center; } .ui.modal > [class*="stretched"] { align-self: stretch; } /* Description */ .ui.modal > .content > .description { display: block; flex: 1 0 auto; min-width: 0; align-self: start; } .ui.modal > .content > i.icon + .description, .ui.modal > .content > .image + .description { flex: 0 1 auto; min-width: ""; width: auto; padding-left: 2em; } /* rtl:ignore */ .ui.modal > .content > .image > i.icon { margin: 0; opacity: 1; width: auto; line-height: 1; font-size: 8rem; } /* -------------- Actions --------------- */ .ui.modal > .actions { background: #f9fafb; padding: 1rem; border-top: 1px solid rgba(34, 36, 38, 0.15); text-align: right; } .ui.modal .actions > .button:not(.fluid) { margin-left: 0.75em; } .ui.ui.modal > .basic.actions, .ui.basic.modal > .actions { border-top: none; } .ui.modal > .left.actions { text-align: left; } .ui.modal > .left.actions > .button:not(.fluid) { margin-left: 0.5em; margin-right: 0.5em; } .ui.modal > .centered, .ui.modal > .center.aligned { text-align: center; } .ui.modal > .centered.actions > .button:not(.fluid), .ui.modal > .center.aligned.actions > .button:not(.fluid) { margin-left: 0.5em; margin-right: 0.5em; } /* ------------------- Responsive -------------------- */ /* Modal Width */ @media only screen and (max-width: 767.98px) { .ui.modal:not(.fullscreen) { width: 95%; margin: 0; } } @media only screen and (min-width: 768px) { .ui.modal:not(.fullscreen) { width: 88%; margin: 0; } } @media only screen and (min-width: 992px) { .ui.modal:not(.fullscreen) { width: 850px; margin: 0; } .ui.modal:not(.fullscreen) > .active.dimmer + .close:not(.inside) { pointer-events: none; opacity: 0.1; } .ui.dimmer > .ui.modal:not(.fullscreen) > .close:not(.inside) { text-shadow: -1px -1px 2px rgba(0, 0, 0, 0.3), 1px -1px 2px rgba(0, 0, 0, 0.3), -1px 2px 2px rgba(0, 0, 0, 0.3), 1px 2px 2px rgba(0, 0, 0, 0.3); } .ui.inverted.dimmer > .ui.modal:not(.fullscreen) > .close:not(.inside) { text-shadow: -1px -1px 2px rgba(255, 255, 255, 0.3), 1px -1px 2px rgba(255, 255, 255, 0.3), -1px 2px 2px rgba(255, 255, 255, 0.3), 1px 2px 2px rgba(255, 255, 255, 0.3); } } @media only screen and (min-width: 1200px) { .ui.modal:not(.fullscreen) { width: 900px; margin: 0; } } @media only screen and (min-width: 1920px) { .ui.modal:not(.fullscreen) { width: 950px; margin: 0; } } /* Tablet and Mobile */ @media only screen and (max-width: 991.98px) { .ui.modal > .close + .header { padding-right: 2.25rem; } .ui.modal > .close { top: 1.0535rem; right: 1rem; color: rgba(0, 0, 0, 0.87); } } /* Mobile */ @media only screen and (max-width: 767.98px) { .ui.modal > .header { padding: 0.75rem 1rem; } .ui.modal > .close + .header { padding-right: 2.25rem; } .ui.overlay.fullscreen.modal > .content.content.content { min-height: calc(100vh - 8.1rem); } .ui.overlay.fullscreen.modal > .scrolling.content.content.content { max-height: calc(100vh - 8.1rem); } .ui.modal > .content { display: block; padding: 1rem !important; } .ui.modal > .close { top: 0.5rem !important; right: 0.5rem !important; } /* rtl:ignore */ .ui.modal .image.content { flex-direction: column; } .ui.modal > .content > .image { display: block; max-width: 100%; margin: 0 auto !important; text-align: center; padding: 0 0 1rem !important; } .ui.modal > .content > .image > i.icon { font-size: 5rem; text-align: center; } /* rtl:ignore */ .ui.modal > .content > .description { display: block; width: 100% !important; margin: 0 !important; padding: 1rem 0 !important; box-shadow: none; } /* Let Buttons Stack */ .ui.modal > .actions { padding: 1rem 1rem 0rem !important; } .ui.modal .actions > .buttons, .ui.modal .actions > .button { margin-bottom: 1rem; } } /* -------------- Coupling --------------- */ .ui.inverted.dimmer > .ui.modal { box-shadow: 1px 3px 10px 2px rgba(0, 0, 0, 0.2); } /******************************* Types *******************************/ .ui.basic.modal { background-color: transparent; border: none; border-radius: 0; box-shadow: none !important; color: #fff; } .ui.ui.modal > .basic.header, .ui.ui.modal > .basic.actions, .ui.basic.modal > .header, .ui.basic.modal > .content, .ui.basic.modal > .actions { background-color: transparent; } .ui.modal > .basic.header { border-bottom: none; } .ui.basic.modal > .header { color: #fff; border-bottom: none; } .ui.basic.modal > .close { top: 1rem; right: 1.5rem; color: #fff; } .ui.inverted.dimmer > .basic.modal { color: rgba(0, 0, 0, 0.87); } .ui.inverted.dimmer > .ui.basic.modal > .header { color: rgba(0, 0, 0, 0.85); } /* Resort to margin positioning if legacy */ .ui.legacy.legacy.modal, .ui.legacy.legacy.page.dimmer > .ui.modal { left: 50% !important; } .ui.legacy.legacy.modal:not(.aligned), .ui.legacy.legacy.page.dimmer > .ui.modal:not(.aligned) { top: 50%; } .ui.legacy.legacy.page.dimmer > .ui.scrolling.modal:not(.aligned), .ui.page.dimmer > .ui.scrolling.legacy.legacy.modal:not(.aligned), .ui.top.aligned.legacy.legacy.page.dimmer > .ui.modal:not(.aligned), .ui.top.aligned.dimmer > .ui.legacy.legacy.modal:not(.aligned) { top: auto; } .ui.legacy.overlay.fullscreen.modal { margin-top: -2rem !important; } /******************************* States *******************************/ .ui.loading.modal { display: block; visibility: hidden; z-index: -1; } .ui.active.modal { display: block; } /******************************* Variations *******************************/ /* -------------- Aligned --------------- */ .modals.dimmer .ui.top.aligned.modal { top: 5vh; } .modals.dimmer .ui.bottom.aligned.modal { bottom: 5vh; } @media only screen and (max-width: 767.98px) { .modals.dimmer .ui.top.aligned.modal { top: 1rem; } .modals.dimmer .ui.bottom.aligned.modal { bottom: 1rem; } } /* -------------- Scrolling --------------- */ /* Scrolling Dimmer */ .scrolling.dimmable.dimmed { overflow: hidden; } .scrolling.dimmable > .dimmer { justify-content: center; position: fixed; } .scrolling.dimmable:not(body) > .dimmer { position: absolute; } .scrolling.dimmable.dimmed > .dimmer { overflow: auto; -ms-scroll-chaining: none; overscroll-behavior: none; } .modals.dimmer .ui.scrolling.modal.fullscreen { top: 0; } .modals.dimmer .ui.scrolling.modal:not(.fullscreen) { margin: 2rem auto; top: 1em; } /* Fix for Firefox, Edge, IE11 */ .modals.dimmer .ui.scrolling.modal:not([class*="overlay fullscreen"])::after { content: "\00A0"; position: absolute; height: 2rem; } /* Undetached Scrolling */ .scrolling.undetached.dimmable.dimmed { overflow: auto; -ms-scroll-chaining: none; overscroll-behavior: none; } .scrolling.undetached.dimmable.dimmed > .dimmer { overflow: hidden; } .scrolling.undetached.dimmable .ui.scrolling.modal:not(.fullscreen) { position: absolute; left: 50%; } /* Scrolling Content */ .ui.modal > .scrolling.content { max-height: calc(80vh - 10rem); overflow: auto; -ms-scroll-chaining: none; overscroll-behavior: none; } .ui.modal > .resizable.scrolling.content { resize: vertical; max-height: none; } .ui.overlay.fullscreen.modal > .content { min-height: calc(100vh - 9.1rem); } .ui.overlay.fullscreen.modal > .scrolling.content { max-height: calc(100vh - 9.1rem); } /* -------------- Full Screen --------------- */ .ui.fullscreen.modal { width: 95%; left: 2.5%; margin: 1em auto; } .ui.overlay.fullscreen.modal { width: 100%; left: 0; margin: 0 auto; top: 0; border-radius: 0; } .ui.modal > .close.inside + .header:not(.centered):not(.center):not(.icon), .ui.fullscreen.modal > .close + .header:not(.centered):not(.center):not(.icon) { padding-right: 2.25rem; } .ui.modal > .close.inside, .ui.fullscreen.modal > .close { top: 1.0535rem; right: 1rem; color: rgba(0, 0, 0, 0.87); } .ui.basic.fullscreen.modal > .close { color: #fff; } /* -------------- Size --------------- */ .ui.modal { font-size: 1rem; } .ui.mini.modal > .header:not(.ui) { font-size: 1.3em; } @media only screen and (max-width: 767.98px) { .ui.mini.modal { width: 95%; margin: 0; } } @media only screen and (min-width: 768px) { .ui.mini.modal { width: 35.2%; margin: 0; } } @media only screen and (min-width: 992px) { .ui.mini.modal { width: 340px; margin: 0; } } @media only screen and (min-width: 1200px) { .ui.mini.modal { width: 360px; margin: 0; } } @media only screen and (min-width: 1920px) { .ui.mini.modal { width: 380px; margin: 0; } } .ui.tiny.modal > .header:not(.ui) { font-size: 1.3em; } @media only screen and (max-width: 767.98px) { .ui.tiny.modal { width: 95%; margin: 0; } } @media only screen and (min-width: 768px) { .ui.tiny.modal { width: 52.8%; margin: 0; } } @media only screen and (min-width: 992px) { .ui.tiny.modal { width: 510px; margin: 0; } } @media only screen and (min-width: 1200px) { .ui.tiny.modal { width: 540px; margin: 0; } } @media only screen and (min-width: 1920px) { .ui.tiny.modal { width: 570px; margin: 0; } } .ui.small.modal > .header:not(.ui) { font-size: 1.3em; } @media only screen and (max-width: 767.98px) { .ui.small.modal { width: 95%; margin: 0; } } @media only screen and (min-width: 768px) { .ui.small.modal { width: 70.4%; margin: 0; } } @media only screen and (min-width: 992px) { .ui.small.modal { width: 680px; margin: 0; } } @media only screen and (min-width: 1200px) { .ui.small.modal { width: 720px; margin: 0; } } @media only screen and (min-width: 1920px) { .ui.small.modal { width: 760px; margin: 0; } } .ui.large.modal > .header:not(.ui) { font-size: 1.6em; } @media only screen and (max-width: 767.98px) { .ui.large.modal { width: 95%; margin: 0; } } @media only screen and (min-width: 768px) { .ui.large.modal { width: 88%; margin: 0; } } @media only screen and (min-width: 992px) { .ui.large.modal { width: 1020px; margin: 0; } } @media only screen and (min-width: 1200px) { .ui.large.modal { width: 1080px; margin: 0; } } @media only screen and (min-width: 1920px) { .ui.large.modal { width: 1140px; margin: 0; } } .ui.big.modal > .header:not(.ui) { font-size: 1.6em; } @media only screen and (max-width: 767.98px) { .ui.big.modal { width: 95%; margin: 0; } } @media only screen and (min-width: 768px) { .ui.big.modal { width: 88%; margin: 0; } } @media only screen and (min-width: 992px) { .ui.big.modal { width: 1190px; margin: 0; } } @media only screen and (min-width: 1200px) { .ui.big.modal { width: 1260px; margin: 0; } } @media only screen and (min-width: 1920px) { .ui.big.modal { width: 1330px; margin: 0; } } .ui.huge.modal > .header:not(.ui) { font-size: 1.6em; } @media only screen and (max-width: 767.98px) { .ui.huge.modal { width: 95%; margin: 0; } } @media only screen and (min-width: 768px) { .ui.huge.modal { width: 88%; margin: 0; } } @media only screen and (min-width: 992px) { .ui.huge.modal { width: 1360px; margin: 0; } } @media only screen and (min-width: 1200px) { .ui.huge.modal { width: 1440px; margin: 0; } } @media only screen and (min-width: 1920px) { .ui.huge.modal { width: 1520px; margin: 0; } } .ui.massive.modal > .header:not(.ui) { font-size: 1.8em; } @media only screen and (max-width: 767.98px) { .ui.massive.modal { width: 95%; margin: 0; } } @media only screen and (min-width: 768px) { .ui.massive.modal { width: 88%; margin: 0; } } @media only screen and (min-width: 992px) { .ui.massive.modal { width: 1530px; margin: 0; } } @media only screen and (min-width: 1200px) { .ui.massive.modal { width: 1620px; margin: 0; } } @media only screen and (min-width: 1920px) { .ui.massive.modal { width: 1710px; margin: 0; } } /***************************** Inverted *******************************/ .ui.inverted.modal { background: #000; } .ui.inverted.modal > .header, .ui.inverted.modal > .content { background: #000; color: #fff; } .ui.inverted.modal > .actions { background: #191a1b; border-top: 1px solid rgba(34, 36, 38, 0.85); color: #fff; } .ui.inverted.dimmer > .modal > .close { color: rgba(0, 0, 0, 0.85); } @media only screen and (max-width: 991.98px) { .ui.dimmer .inverted.modal > .close { color: #fff; } } .ui.inverted.modal > .close.inside, .ui.inverted.fullscreen.modal > .close { color: #fff; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/modal.js ================================================ /*! * # Fomantic-UI 2.9.4 - Modal * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.modal = function (parameters) { var $allModules = $(this), $window = $(window), $document = $(document), $body = $('body'), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $body; } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : $body; } } return $context; }, returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.modal.settings, parameters) : $.extend({}, $.fn.modal.settings), selector = settings.selector, className = settings.className, namespace = settings.namespace, fields = settings.fields, error = settings.error, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $context = contextCheck(settings.context, window), isBody = $context[0] === $body[0], $closeIcon = $module.find(selector.closeIcon), $inputs, $allModals, $otherModals, $focusedElement, $dimmable, $dimmer, isModalComponent = $module.hasClass('modal'), element = this, instance = isModalComponent ? $module.data(moduleNamespace) : undefined, ignoreRepeatedEvents = false, initialMouseDownInModal, initialMouseDownInScrollbar, initialBodyMargin = '', tempBodyMargin = '', keepScrollingClass = false, hadScrollbar = false, windowRefocused = false, elementEventNamespace, id, observer, observeAttributes = false, module ; module = { initialize: function () { module.create.id(); if (!isModalComponent) { module.create.modal(); if (!isFunction(settings.onHidden)) { settings.onHidden = function () { module.destroy(); $module.remove(); }; } } $module.addClass(settings.class); if (settings.title !== '') { $module.find(selector.title).html(module.helpers.escape(settings.title, settings.preserveHTML)).addClass(settings.classTitle); } if (settings.content !== '') { $module.find(selector.content).html(module.helpers.escape(settings.content, settings.preserveHTML)).addClass(settings.classContent); } if (module.has.configActions()) { var $actions = $module.find(selector.actions).addClass(settings.classActions); if ($actions.length === 0) { $actions = $('<div/>', { class: className.actions + ' ' + (settings.classActions || '') }).appendTo($module); } else { $actions.empty(); } settings.actions.forEach(function (el) { var icon = el[fields.icon] ? '<i ' + (el[fields.text] ? 'aria-hidden="true"' : '') + ' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '', text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML), cls = module.helpers.deQuote(el[fields.class] || ''), click = el[fields.click] && isFunction(el[fields.click]) ? el[fields.click] : function () {} ; $actions.append($('<button/>', { html: icon + text, 'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g, ''), class: className.button + ' ' + cls, on: { click: function () { var button = $(this); if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) { return; } module.hide(); }, }, })); }); } module.cache = {}; module.verbose('Initializing dimmer', $context); module.create.dimmer(); if (settings.allowMultiple) { module.create.innerDimmer(); } if (!settings.centered) { $module.addClass('top aligned'); } module.refreshModals(); module.bind.events(); module.observeChanges(); module.instantiate(); if (settings.autoShow) { module.show(); } }, instantiate: function () { module.verbose('Storing instance of modal'); instance = module; $module .data(moduleNamespace, instance) ; }, create: { modal: function () { $module = $('<div/>', { class: className.modal, role: 'dialog', 'aria-modal': true }); if (settings.closeIcon) { $closeIcon = $('<i/>', { class: className.close, role: 'button', tabindex: 0, 'aria-label': settings.text.close, }); $module.append($closeIcon); } if (settings.title !== '') { var titleId = '_' + module.get.id() + 'title'; $module.attr('aria-labelledby', titleId); $('<div/>', { class: className.title, id: titleId }).appendTo($module); } if (settings.content !== '') { var descId = '_' + module.get.id() + 'desc'; $module.attr('aria-describedby', descId); $('<div/>', { class: className.content, id: descId }).appendTo($module); } if (module.has.configActions()) { $('<div/>', { class: className.actions }).appendTo($module); } $context.append($module); element = $module[0]; }, dimmer: function () { var defaultSettings = { debug: settings.debug, dimmerName: 'modals', }, dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings) ; if ($.fn.dimmer === undefined) { module.error(error.dimmer); return; } module.debug('Creating dimmer'); $dimmable = $context.dimmer(dimmerSettings); keepScrollingClass = module.is.scrolling(); if (settings.detachable) { module.verbose('Modal is detachable, moving content into dimmer'); $dimmable.dimmer('add content', $module); } else { module.set.undetached(); } $dimmer = $dimmable.dimmer('get dimmer'); }, id: function () { id = (Math.random().toString(16) + '000000000').slice(2, 10); elementEventNamespace = '.' + id; module.verbose('Creating unique id for element', id); }, innerDimmer: function () { if ($module.find(selector.dimmer).length === 0) { $('<div/>', { class: className.innerDimmer }).prependTo($module); } }, }, destroy: function () { if (observer) { observer.disconnect(); } module.verbose('Destroying previous modal'); $module .removeData(moduleNamespace) .off(eventNamespace) ; $window.off(elementEventNamespace); $context.off(elementEventNamespace); $dimmer.off(elementEventNamespace); $closeIcon.off(elementEventNamespace); if ($inputs) { $inputs.off(elementEventNamespace); } $context.dimmer('destroy'); }, observeChanges: function () { if ('MutationObserver' in window) { observer = new MutationObserver(function (mutations) { var collectNodes = function (parent) { var nodes = []; for (var c = 0, cl = parent.length; c < cl; c++) { Array.prototype.push.apply(nodes, collectNodes(parent[c].childNodes)); nodes.push(parent[c]); } return nodes; }, shouldRefresh = false, shouldRefreshInputs = false, ignoreAutofocus = true ; mutations.every(function (mutation) { if (mutation.type === 'attributes') { if (observeAttributes && (mutation.attributeName === 'disabled' || $(mutation.target).find(':input').addBack(':input').filter(':visible').length > 0)) { shouldRefreshInputs = true; } } else { shouldRefresh = true; // mutationobserver only provides the parent nodes // so let's collect all childs as well to find nested inputs var $addedInputs = $(collectNodes(mutation.addedNodes)).filter('a[href], [tabindex], :input:enabled').filter(':visible'), $removedInputs = $(collectNodes(mutation.removedNodes)).filter('a[href], [tabindex], :input'); if ($addedInputs.length > 0 || $removedInputs.length > 0) { shouldRefreshInputs = true; if ($addedInputs.filter(':input').length > 0 || $removedInputs.filter(':input').length > 0) { ignoreAutofocus = false; } } } return !shouldRefreshInputs; }); if (shouldRefresh && settings.observeChanges) { module.debug('DOM tree modified, refreshing'); module.refresh(); } if (shouldRefreshInputs) { module.refreshInputs(ignoreAutofocus); } }); observer.observe(element, { attributeFilter: ['class', 'disabled'], attributes: true, childList: true, subtree: true, }); module.debug('Setting up mutation observer', observer); } }, refresh: function () { module.remove.scrolling(); module.cacheSizes(); if (!module.can.useFlex()) { module.set.modalOffset(); } module.set.screenHeight(); module.set.type(); }, refreshModals: function () { $otherModals = $module.siblings(selector.modal); $allModals = $otherModals.add($module); }, refreshInputs: function (ignoreAutofocus) { if ($inputs) { $inputs .off('keydown' + elementEventNamespace) ; } $inputs = $module.find('a[href], [tabindex], :input:enabled').filter(':visible').filter(function () { return $(this).closest('.disabled').length === 0; }); if ($inputs.filter(':input').length === 0) { $inputs = $module.add($inputs); $module.attr('tabindex', -1); } else { $module.removeAttr('tabindex'); } $inputs.first() .on('keydown' + elementEventNamespace, module.event.inputKeyDown.first) ; $inputs.last() .on('keydown' + elementEventNamespace, module.event.inputKeyDown.last) ; if (!ignoreAutofocus && settings.autofocus && $inputs.filter(':focus').length === 0) { module.set.autofocus(); } }, attachEvents: function (selector, event) { var $toggle = $(selector) ; event = isFunction(module[event]) ? module[event] : module.toggle; if ($toggle.length > 0) { module.debug('Attaching modal events to element', selector, event); $toggle .off(eventNamespace) .on('click' + eventNamespace, event) ; } else { module.error(error.notFound, selector); } }, bind: { events: function () { module.verbose('Attaching events'); $module .on('click' + eventNamespace, selector.close, module.event.close) .on('click' + eventNamespace, selector.approve, module.event.approve) .on('click' + eventNamespace, selector.deny, module.event.deny) ; $closeIcon .on('keyup' + elementEventNamespace, module.event.closeKeyUp) ; $window .on('resize' + elementEventNamespace, module.event.resize) .on('focus' + elementEventNamespace, module.event.focus) ; $context .on('click' + elementEventNamespace, module.event.click) ; }, scrollLock: function () { // touch events default to passive, due to changes in chrome to optimize mobile perf $dimmable[0].addEventListener('touchmove', module.event.preventScroll, { passive: false }); }, }, unbind: { scrollLock: function () { $dimmable[0].removeEventListener('touchmove', module.event.preventScroll, { passive: false }); }, }, get: { id: function () { return id; }, element: function () { return $module; }, settings: function () { return settings; }, }, event: { approve: function () { if (ignoreRepeatedEvents || settings.onApprove.call(element, $(this)) === false) { module.verbose('Approve callback returned false cancelling hide'); return; } ignoreRepeatedEvents = true; module.hide(function () { ignoreRepeatedEvents = false; }); }, preventScroll: function (event) { if (event.target.className.indexOf('dimmer') !== -1) { event.preventDefault(); } }, deny: function () { if (ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) { module.verbose('Deny callback returned false cancelling hide'); return; } ignoreRepeatedEvents = true; module.hide(function () { ignoreRepeatedEvents = false; }); }, close: function () { module.hide(); }, closeKeyUp: function (event) { var keyCode = event.which ; if ((keyCode === settings.keys.enter || keyCode === settings.keys.space) && $module.hasClass(className.front)) { module.hide(); } }, inputKeyDown: { first: function (event) { var keyCode = event.which ; if (keyCode === settings.keys.tab && event.shiftKey) { $inputs.last().trigger('focus'); event.preventDefault(); } }, last: function (event) { var keyCode = event.which ; if (keyCode === settings.keys.tab && !event.shiftKey) { $inputs.first().trigger('focus'); event.preventDefault(); } }, }, mousedown: function (event) { var $target = $(event.target), isRtl = module.is.rtl() ; initialMouseDownInModal = $target.closest(selector.modal).length > 0; if (initialMouseDownInModal) { module.verbose('Mouse down event registered inside the modal'); } initialMouseDownInScrollbar = module.is.scrolling() && ((!isRtl && $window.outerWidth() - settings.scrollbarWidth <= event.clientX) || (isRtl && settings.scrollbarWidth >= event.clientX)); if (initialMouseDownInScrollbar) { module.verbose('Mouse down event registered inside the scrollbar'); } }, mouseup: function (event) { if (!settings.closable) { module.verbose('Dimmer clicked but closable setting is disabled'); return; } if (initialMouseDownInModal) { module.debug('Dimmer clicked but mouse down was initially registered inside the modal'); return; } if (initialMouseDownInScrollbar) { module.debug('Dimmer clicked but mouse down was initially registered inside the scrollbar'); return; } var $target = $(event.target), isInModal = $target.closest(selector.modal).length > 0, isInDOM = $.contains(document.documentElement, event.target) ; if (!isInModal && isInDOM && module.is.active() && $module.hasClass(className.front)) { module.debug('Dimmer clicked, hiding all modals'); if (settings.allowMultiple) { if (!module.hideAll()) { return; } } else if (!module.hide()) { return; } module.remove.clickaway(); } }, debounce: function (method, delay) { clearTimeout(module.timer); module.timer = setTimeout(function () { method(); }, delay); }, keyboard: function (event) { var keyCode = event.which ; if (keyCode === settings.keys.escape) { if (settings.closable) { module.debug('Escape key pressed hiding modal'); if ($module.hasClass(className.front)) { module.hide(); } } else { module.debug('Escape key pressed, but closable is set to false'); } event.preventDefault(); } }, resize: function () { if ($dimmable.dimmer('is active') && (module.is.animating() || module.is.active())) { requestAnimationFrame(module.refresh); } }, focus: function () { windowRefocused = true; }, click: function (event) { if (windowRefocused && document.activeElement !== event.target && $dimmable.dimmer('is active') && module.is.active() && settings.autofocus && $(document.activeElement).closest(selector.modal).length === 0) { requestAnimationFrame(module.set.autofocus); } windowRefocused = false; }, }, toggle: function () { if (module.is.active() || module.is.animating()) { module.hide(); } else { module.show(); } }, show: function (callback) { callback = isFunction(callback) ? callback : function () {}; module.refreshModals(); module.set.dimmerSettings(); module.set.dimmerStyles(); module.showModal(callback); }, hide: function (callback) { callback = isFunction(callback) ? callback : function () {}; module.refreshModals(); return module.hideModal(callback); }, showModal: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (module.is.animating() || !module.is.active()) { if (settings.onShow.call(element) === false) { module.verbose('Show callback returned false cancelling show'); return; } hadScrollbar = module.has.scrollbar(); module.showDimmer(); module.cacheSizes(); if (hadScrollbar) { module.set.bodyMargin(); } if (module.can.useFlex()) { module.remove.legacy(); } else { module.set.legacy(); module.set.modalOffset(); module.debug('Using non-flex legacy modal positioning.'); } module.set.screenHeight(); module.set.type(); module.set.clickaway(); if (!settings.allowMultiple && module.others.active()) { module.hideOthers(module.showModal); } else { ignoreRepeatedEvents = false; if (settings.allowMultiple) { if (module.others.active()) { $otherModals.filter('.' + className.active).find(selector.dimmer).removeClass('out').addClass('transition fade in active'); } if (settings.detachable) { $module.detach().appendTo($dimmer); } } if (settings.transition && $.fn.transition !== undefined) { module.debug('Showing modal with css animations'); module.set.observeAttributes(false); $module .transition({ debug: settings.debug, verbose: settings.verbose, silent: settings.silent, animation: (settings.transition.showMethod || settings.transition) + ' in', queue: settings.queue, duration: settings.transition.showDuration || settings.duration, useFailSafe: true, onComplete: function () { settings.onVisible.apply(element); if (settings.keyboardShortcuts) { module.add.keyboardShortcuts(); } module.save.focus(); module.set.active(); module.refreshInputs(); requestAnimationFrame(module.set.observeAttributes); callback(); }, }) ; } else { module.error(error.noTransition); } } } else { module.debug('Modal is already visible'); } }, hideModal: function (callback, keepDimmed, hideOthersToo) { var $previousModal = $otherModals.filter('.' + className.active).last() ; callback = isFunction(callback) ? callback : function () {}; if (settings.onHide.call(element, $(this)) === false) { module.verbose('Hide callback returned false cancelling hide'); ignoreRepeatedEvents = false; return false; } if (module.is.animating() || module.is.active()) { module.debug('Hiding modal'); if (settings.transition && $.fn.transition !== undefined) { module.remove.active(); module.set.observeAttributes(false); $module .transition({ debug: settings.debug, verbose: settings.verbose, silent: settings.silent, animation: (settings.transition.hideMethod || settings.transition) + ' out', queue: settings.queue, duration: settings.transition.hideDuration || settings.duration, useFailSafe: true, onStart: function () { if (!module.others.active() && !module.others.animating() && !keepDimmed) { module.hideDimmer(); } else if (settings.allowMultiple) { (hideOthersToo ? $allModals : $previousModal).find(selector.dimmer).removeClass('in').addClass('out'); } if (settings.keyboardShortcuts && !module.others.active()) { module.remove.keyboardShortcuts(); } }, onComplete: function () { module.unbind.scrollLock(); module.remove.active(); if (settings.allowMultiple) { $previousModal.addClass(className.front); $module.removeClass(className.front); (hideOthersToo ? $allModals : $previousModal).find(selector.dimmer).removeClass('active'); } if (isFunction(settings.onHidden)) { settings.onHidden.call(element); } module.remove.dimmerStyles(); module.restore.focus(); callback(); }, }) ; } else { module.error(error.noTransition); } } }, showDimmer: function () { if ($dimmable.dimmer('is animating') || !$dimmable.dimmer('is active')) { if (hadScrollbar) { if (!isBody) { $dimmer.css('top', $dimmable.scrollTop()); } module.save.bodyMargin(); } module.debug('Showing dimmer'); $dimmable.dimmer('show'); } else { module.debug('Dimmer already visible'); } }, hideDimmer: function () { if ($dimmable.dimmer('is animating') || $dimmable.dimmer('is active')) { module.unbind.scrollLock(); $dimmable.dimmer('hide', function () { if (hadScrollbar) { module.restore.bodyMargin(); } module.remove.clickaway(); module.remove.screenHeight(); }); } else { module.debug('Dimmer is not visible cannot hide'); } }, hideAll: function (callback) { var $visibleModals = $allModals.filter('.' + className.active + ', .' + className.animating) ; callback = isFunction(callback) ? callback : function () {}; if ($visibleModals.length > 0) { module.debug('Hiding all visible modals'); var hideOk = true; // check in reverse order trying to hide most top displayed modal first $($visibleModals.get().reverse()).each(function (index, element) { if (hideOk) { hideOk = $(element).modal('hide modal', callback, false, true); } }); if (hideOk) { module.hideDimmer(); } return hideOk; } }, hideOthers: function (callback) { var $visibleModals = $otherModals.filter('.' + className.active + ', .' + className.animating) ; callback = isFunction(callback) ? callback : function () {}; if ($visibleModals.length > 0) { module.debug('Hiding other modals', $otherModals); $visibleModals .modal('hide modal', callback, true) ; } }, others: { active: function () { return $otherModals.filter('.' + className.active).length > 0; }, animating: function () { return $otherModals.filter('.' + className.animating).length > 0; }, }, add: { keyboardShortcuts: function () { module.verbose('Adding keyboard shortcuts'); $document .on('keydown' + eventNamespace, module.event.keyboard) ; }, }, save: { focus: function () { var $activeElement = $(document.activeElement), inCurrentModal = $activeElement.closest($module).length > 0 ; if (!inCurrentModal) { $focusedElement = $(document.activeElement).trigger('blur'); } }, bodyMargin: function () { initialBodyMargin = $context.css((isBody ? 'margin-' : 'padding-') + (module.can.leftBodyScrollbar() ? 'left' : 'right')); var bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\d.]/g, ''), 10), bodyScrollbarWidth = isBody ? window.innerWidth - document.documentElement.clientWidth : $context[0].offsetWidth - $context[0].clientWidth ; tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth; }, }, restore: { focus: function () { if ($focusedElement && $focusedElement.length > 0 && settings.restoreFocus) { $focusedElement.trigger('focus'); } }, bodyMargin: function () { var position = module.can.leftBodyScrollbar() ? 'left' : 'right'; $context.css((isBody ? 'margin-' : 'padding-') + position, initialBodyMargin); $context.find(selector.bodyFixed.replace('right', position)).each(function () { var el = $(this), attribute = el.css('position') === 'fixed' ? 'padding-' + position : position ; el.css(attribute, ''); }); }, }, remove: { active: function () { $module.removeClass(className.active); }, legacy: function () { $module.removeClass(className.legacy); }, clickaway: function () { if (!settings.detachable) { $module .off('mousedown' + elementEventNamespace) ; } $dimmer .off('mousedown' + elementEventNamespace) ; $dimmer .off('mouseup' + elementEventNamespace) ; }, dimmerStyles: function () { $dimmer.removeClass(className.inverted); $dimmable.removeClass(className.blurring); }, bodyStyle: function () { if ($context.attr('style') === '') { module.verbose('Removing style attribute'); $context.removeAttr('style'); } }, screenHeight: function () { module.debug('Removing page height'); $context .css('height', '') ; module.remove.bodyStyle(); }, keyboardShortcuts: function () { module.verbose('Removing keyboard shortcuts'); $document .off('keydown' + eventNamespace) ; }, scrolling: function () { if (!keepScrollingClass) { $dimmable.removeClass(className.scrolling); } $module.removeClass(className.scrolling); }, }, cacheSizes: function () { $module.addClass(className.loading); var scrollHeight = $module.prop('scrollHeight'), modalWidth = $module.outerWidth(), modalHeight = $module.outerHeight() ; if (module.cache.pageHeight === undefined || modalHeight !== 0) { $.extend(module.cache, { pageHeight: $document.outerHeight(), width: modalWidth, height: modalHeight + settings.offset, scrollHeight: scrollHeight + settings.offset, contextHeight: isBody ? $window.height() : $dimmable.height(), }); module.cache.topOffset = -(module.cache.height / 2); } $module.removeClass(className.loading); module.debug('Caching modal and container sizes', module.cache); }, helpers: { deQuote: function (string) { return String(string).replace(/"/g, ''); }, escape: function (string, preserveHTML) { if (preserveHTML) { return string; } var badChars = /["'<>`]/g, shouldEscape = /["&'<>`]/, escape = { '<': '<', '>': '>', '"': '"', "'": ''', '`': '`', }, escapedChar = function (chr) { return escape[chr]; } ; if (shouldEscape.test(string)) { string = string.replace(/&(?![\d#a-z]{1,12};)/gi, '&'); return string.replace(badChars, escapedChar); } return string; }, }, can: { leftBodyScrollbar: function () { if (module.cache.leftBodyScrollbar === undefined) { module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie()); } return module.cache.leftBodyScrollbar; }, useFlex: function () { if (settings.useFlex === 'auto') { return settings.detachable && !module.is.ie(); } if (settings.useFlex && module.is.ie()) { module.debug('useFlex true is not supported in IE'); } else if (settings.useFlex && !settings.detachable) { module.debug('useFlex true in combination with detachable false is not supported'); } return settings.useFlex; }, fit: function () { var contextHeight = module.cache.contextHeight, verticalCenter = module.cache.contextHeight / 2, topOffset = module.cache.topOffset, scrollHeight = module.cache.scrollHeight, height = module.cache.height, paddingHeight = settings.padding, startPosition = verticalCenter + topOffset ; return scrollHeight > height ? startPosition + scrollHeight + paddingHeight < contextHeight : height + (paddingHeight * 2) < contextHeight; }, }, has: { configActions: function () { return Array.isArray(settings.actions) && settings.actions.length > 0; }, scrollbar: function () { return isBody || $context.css('overflow-y') !== 'hidden'; }, }, is: { active: function () { return $module.hasClass(className.active); }, ie: function () { if (module.cache.isIE === undefined) { var isIE11 = !window.ActiveXObject && 'ActiveXObject' in window, isIE = 'ActiveXObject' in window ; module.cache.isIE = isIE11 || isIE; } return module.cache.isIE; }, animating: function () { return $module.transition('is animating'); }, scrolling: function () { return $dimmable.hasClass(className.scrolling); }, modernBrowser: function () { // appName for IE11 reports 'Netscape' can no longer use return !(window.ActiveXObject || 'ActiveXObject' in window); }, rtl: function () { if (module.cache.isRTL === undefined) { module.cache.isRTL = $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl' || $body.attr('dir') === 'rtl' || $body.css('direction') === 'rtl' || $context.attr('dir') === 'rtl' || $context.css('direction') === 'rtl'; } return module.cache.isRTL; }, safari: function () { if (module.cache.isSafari === undefined) { module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession; } return module.cache.isSafari; }, edge: function () { if (module.cache.isEdge === undefined) { module.cache.isEdge = !!window.setImmediate && !module.is.ie(); } return module.cache.isEdge; }, firefox: function () { if (module.cache.isFirefox === undefined) { module.cache.isFirefox = !!window.InstallTrigger; } return module.cache.isFirefox; }, iframe: function () { return !(self === top); }, }, set: { observeAttributes: function (state) { observeAttributes = state !== false; }, autofocus: function () { var $autofocus = $inputs.filter('[autofocus]'), $rawInputs = $inputs.filter(':input'), $input = ($autofocus.length > 0 ? $autofocus : ($rawInputs.length > 0 ? $rawInputs : $module) ).first() ; $input.trigger('focus'); }, bodyMargin: function () { var position = module.can.leftBodyScrollbar() ? 'left' : 'right'; if (settings.detachable || module.can.fit()) { $context.css((isBody ? 'margin-' : 'padding-') + position, tempBodyMargin + 'px'); } $context.find(selector.bodyFixed.replace('right', position)).each(function () { var el = $(this), attribute = el.css('position') === 'fixed' ? 'padding-' + position : position ; el.css(attribute, 'calc(' + el.css(attribute) + ' + ' + tempBodyMargin + 'px)'); }); }, clickaway: function () { if (!settings.detachable) { $module .on('mousedown' + elementEventNamespace, module.event.mousedown) ; } $dimmer .on('mousedown' + elementEventNamespace, module.event.mousedown) ; $dimmer .on('mouseup' + elementEventNamespace, module.event.mouseup) ; }, dimmerSettings: function () { if ($.fn.dimmer === undefined) { module.error(error.dimmer); return; } var defaultSettings = { debug: settings.debug, dimmerName: 'modals', closable: 'auto', useFlex: module.can.useFlex(), duration: { show: settings.transition.showDuration || settings.duration, hide: settings.transition.hideDuration || settings.duration, }, }, dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings) ; if (settings.inverted) { dimmerSettings.variation = dimmerSettings.variation !== undefined ? dimmerSettings.variation + ' inverted' : 'inverted'; } $context.dimmer('setting', dimmerSettings); }, dimmerStyles: function () { if (settings.inverted) { $dimmer.addClass(className.inverted); } else { $dimmer.removeClass(className.inverted); } if (settings.blurring) { $dimmable.addClass(className.blurring); } else { $dimmable.removeClass(className.blurring); } }, modalOffset: function () { if (!settings.detachable) { var canFit = module.can.fit(); $module .css({ top: !$module.hasClass('aligned') && canFit ? $document.scrollTop() + (module.cache.contextHeight - module.cache.height) / 2 : (!canFit || $module.hasClass('top') ? $document.scrollTop() + settings.padding : $document.scrollTop() + (module.cache.contextHeight - module.cache.height - settings.padding)), marginLeft: -(module.cache.width / 2), }) ; } else { $module .css({ marginTop: !$module.hasClass('aligned') && module.can.fit() ? -(module.cache.height / 2) : settings.padding / 2, marginLeft: -(module.cache.width / 2), }) ; } module.verbose('Setting modal offset for legacy mode'); }, screenHeight: function () { if (module.can.fit()) { $context.css('height', ''); } else if (!$module.hasClass('bottom')) { module.debug('Modal is taller than page content, resizing page height'); $context .css('height', module.cache.height + (settings.padding * 2) + 'px') ; } }, active: function () { $module.addClass(className.active + ' ' + className.front); $otherModals.filter('.' + className.active).removeClass(className.front); }, scrolling: function () { $dimmable.addClass(className.scrolling); $module.addClass(className.scrolling); module.unbind.scrollLock(); }, legacy: function () { $module.addClass(className.legacy); }, type: function () { if (module.can.fit()) { module.verbose('Modal fits on screen'); if (!module.others.active() && !module.others.animating()) { module.remove.scrolling(); module.bind.scrollLock(); } } else if (!$module.hasClass('bottom')) { module.verbose('Modal cannot fit on screen setting to scrolling'); module.set.scrolling(); } else { module.verbose('Bottom aligned modal not fitting on screen is unsupported for scrolling'); } }, undetached: function () { $dimmable.addClass(className.undetached); }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { if (isFunction(settings.templates[query])) { settings.autoShow = true; settings.className.modal = settings.className.template; settings = $.extend(true, {}, settings, settings.templates[query].apply(module, queryArguments)); // reassign shortcuts className = settings.className; namespace = settings.namespace; fields = settings.fields; error = settings.error; } module.initialize(); } if (!isFunction(settings.templates[query])) { module.invoke(query); } } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); returnedValue = $module; } }); return returnedValue !== undefined ? returnedValue : this; }; $.modal = $.fn.modal; $.fn.modal.settings = { name: 'Modal', namespace: 'modal', useFlex: 'auto', offset: 0, silent: false, debug: false, verbose: false, performance: true, observeChanges: false, allowMultiple: false, detachable: true, closable: true, autofocus: true, restoreFocus: true, autoShow: false, inverted: false, blurring: false, centered: true, dimmerSettings: { closable: false, useCSS: true, }, // whether to use keyboard shortcuts keyboardShortcuts: true, context: 'body', queue: false, duration: 500, transition: 'scale', // padding with edge of page padding: 50, scrollbarWidth: 10, // dynamic content title: '', content: '', class: '', classTitle: '', classContent: '', classActions: '', closeIcon: false, actions: false, preserveHTML: true, fields: { class: 'class', text: 'text', icon: 'icon', click: 'click', }, // called before show animation onShow: function () {}, // called after show animation onVisible: function () {}, // called before hide animation onHide: function () { return true; }, // called after hide animation onHidden: false, // called after approve selector match onApprove: function () { return true; }, // called after deny selector match onDeny: function () { return true; }, keys: { space: 32, enter: 13, escape: 27, tab: 9, }, selector: { title: '> .header', content: '> .content', actions: '> .actions', close: '> .close', closeIcon: '> .close', approve: '.actions .positive, .actions .approve, .actions .ok', deny: '.actions .negative, .actions .deny, .actions .cancel', modal: '.ui.modal', dimmer: '> .ui.dimmer', bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.fixed.nag, > .ui.fixed.nag > .close', prompt: '.ui.input > input', }, error: { dimmer: 'UI Dimmer, a required component is not included in this page', method: 'The method you called is not defined.', notFound: 'The element you specified could not be found', }, className: { active: 'active', animating: 'animating', blurring: 'blurring', inverted: 'inverted', legacy: 'legacy', loading: 'loading', scrolling: 'scrolling', undetached: 'undetached', front: 'front', close: 'close icon', button: 'ui button', modal: 'ui modal', title: 'header', content: 'content', actions: 'actions', template: 'ui tiny modal', ok: 'positive', cancel: 'negative', prompt: 'ui fluid input', innerDimmer: 'ui inverted dimmer', }, text: { ok: 'Ok', cancel: 'Cancel', close: 'Close', }, }; $.fn.modal.settings.templates = { getArguments: function (args) { var queryArguments = [].slice.call(args); if ($.isPlainObject(queryArguments[0])) { return $.extend({ handler: function () {}, content: '', title: '', }, queryArguments[0]); } if (!isFunction(queryArguments[queryArguments.length - 1])) { queryArguments.push(function () {}); } return { handler: queryArguments.pop(), content: queryArguments.pop() || '', title: queryArguments.pop() || '', }; }, alert: function () { var settings = this.get.settings(), args = settings.templates.getArguments(arguments), approveFn = args.handler ; return { title: args.title, content: args.content, onApprove: approveFn, actions: [{ text: settings.text.ok, class: settings.className.ok, click: approveFn, }], }; }, confirm: function () { var settings = this.get.settings(), args = settings.templates.getArguments(arguments), approveFn = function () { args.handler(true); }, denyFn = function () { args.handler(false); } ; return { title: args.title, content: args.content, onApprove: approveFn, onDeny: denyFn, actions: [{ text: settings.text.ok, class: settings.className.ok, click: approveFn, }, { text: settings.text.cancel, class: settings.className.cancel, click: denyFn, }], }; }, prompt: function () { var $this = this, settings = this.get.settings(), args = settings.templates.getArguments(arguments), input = $($.parseHTML(args.content)).filter('.ui.input'), approveFn = function () { var settings = $this.get.settings(), inputField = $this.get.element().find(settings.selector.prompt)[0] ; args.handler($(inputField).val()); }, denyFn = function () { args.handler(null); } ; if (input.length === 0) { args.content += '<p><div class="' + this.helpers.deQuote(settings.className.prompt) + '"><input placeholder="' + this.helpers.deQuote(args.placeholder || '') + '" type="text" value="' + this.helpers.deQuote(args.defaultValue || '') + '"></div></p>'; } return { title: args.title, content: args.content, onApprove: approveFn, onDeny: denyFn, actions: [{ text: settings.text.ok, class: settings.className.ok, click: approveFn, }, { text: settings.text.cancel, class: settings.className.cancel, click: denyFn, }], }; }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/nag.css ================================================ /*! * # Fomantic-UI 2.9.4 - Nag * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Nag *******************************/ .ui.nag { display: none; opacity: 0.95; position: relative; top: 0; left: 0; z-index: 999; min-height: 0; width: 100%; margin: 0; padding: 0.75em 1em; background: #909090; box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2); font-size: 1rem; text-align: center; color: rgba(0, 0, 0, 0.87); border-radius: 0 0 0.28571429rem 0.28571429rem; transition: 0.2s background ease; } a.ui.nag { cursor: pointer; } .ui.nag > .title { display: inline-block; margin: 0 0.5em; color: #fff; } .ui.nag > .close.icon { cursor: pointer; opacity: 0.4; position: absolute; top: 50%; right: 1em; font-size: 1em; margin: -0.5em 0 0; color: #fff; transition: opacity 0.2s ease; } .ui.nag:not(.overlay):not(.fixed) { border-radius: 0.28571429rem; } /******************************* States *******************************/ /* Hover */ .ui.nag:hover { background: #909090; opacity: 1; } .ui.nag > .close:hover { opacity: 1; } /******************************* Variations *******************************/ /* -------------- Static --------------- */ .ui.overlay.nags, .ui.overlay.nag { position: absolute; } /* -------------- Fixed --------------- */ .ui.fixed.nags, .ui.fixed.nag { position: fixed; } /* -------------- Bottom --------------- */ .ui.bottom.nags, .ui.bottom.nag { border-radius: 0.28571429rem 0.28571429rem 0 0; top: auto; bottom: 0; } /* -------------- Inverted --------------- */ .ui.inverted.nags .nag, .ui.inverted.nag { background-color: #f3f4f5; color: rgba(0, 0, 0, 0.85); } .ui.inverted.nags .nag > .close, .ui.inverted.nag > .close { color: rgba(0, 0, 0, 0.6); } .ui.inverted.nags .nag > .title, .ui.inverted.nag > .title { color: rgba(0, 0, 0, 0.6); } /* ------------------- Sizes -------------------- */ .ui.mini.nag, .ui.mini.nags .nag { font-size: 0.78571429rem; } .ui.tiny.nag, .ui.tiny.nags .nag { font-size: 0.85714286rem; } .ui.small.nag, .ui.small.nags .nag { font-size: 0.92857143rem; } .ui.large.nag, .ui.large.nags .nag { font-size: 1.14285714rem; } .ui.big.nag, .ui.big.nags .nag { font-size: 1.28571429rem; } .ui.huge.nag, .ui.huge.nags .nag { font-size: 1.42857143rem; line-height: 1; } .ui.massive.nag, .ui.massive.nags .nag { font-size: 1.71428571rem; line-height: 1; } /* -------------- Colors -------------- */ .ui.primary.nag { background-color: #2185d0; } .ui.inverted.primary.nag { background-color: #54c8ff; } .ui.secondary.nag { background-color: #1b1c1d; } .ui.inverted.secondary.nag { background-color: #545454; } .ui.red.nag { background-color: #db2828; } .ui.inverted.red.nag { background-color: #ff695e; } .ui.orange.nag { background-color: #f2711c; } .ui.inverted.orange.nag { background-color: #ff851b; } .ui.yellow.nag { background-color: #fbbd08; } .ui.inverted.yellow.nag { background-color: #ffe21f; } .ui.olive.nag { background-color: #b5cc18; } .ui.inverted.olive.nag { background-color: #d9e778; } .ui.green.nag { background-color: #21ba45; } .ui.inverted.green.nag { background-color: #2ecc40; } .ui.teal.nag { background-color: #00b5ad; } .ui.inverted.teal.nag { background-color: #6dffff; } .ui.blue.nag { background-color: #2185d0; } .ui.inverted.blue.nag { background-color: #54c8ff; } .ui.violet.nag { background-color: #6435c9; } .ui.inverted.violet.nag { background-color: #a291fb; } .ui.purple.nag { background-color: #a333c8; } .ui.inverted.purple.nag { background-color: #dc73ff; } .ui.pink.nag { background-color: #e03997; } .ui.inverted.pink.nag { background-color: #ff8edf; } .ui.brown.nag { background-color: #a5673f; } .ui.inverted.brown.nag { background-color: #d67c1c; } .ui.grey.nag { background-color: #767676; } .ui.inverted.grey.nag { background-color: #dcddde; } .ui.black.nag { background-color: #1b1c1d; color: rgba(255, 255, 255, 0.9); } .ui.inverted.black.nag { background-color: #545454; } .ui.inverted.black.nag .title { color: #fff; } /******************************* Groups *******************************/ .ui.nags { top: 0; left: 0; width: 100%; } .ui.ui.nags .nag { border-radius: 0; } .ui.nags:not(.bottom) .nag:last-child { border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui.bottom.nags .nag:first-child { border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.nags:not(.fixed):not(.overlay) .nag:first-child { border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.nags:not(.fixed):not(.overlay) .nag:only-child { border-radius: 0.28571429rem; } /******************************* Theme Overrides *******************************/ /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/nag.js ================================================ /*! * # Fomantic-UI 2.9.4 - Nag * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.nag = function (parameters) { var $allModules = $(this), $body = $('body'), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $(context); } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : $body; } } return $context; }, returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.nag.settings, parameters) : $.extend({}, $.fn.nag.settings), selector = settings.selector, error = settings.error, namespace = settings.namespace, eventNamespace = '.' + namespace, moduleNamespace = namespace + '-module', $module = $(this), $context = settings.context ? contextCheck(settings.context, window) : $body, element = this, instance = $module.data(moduleNamespace), storage, module ; module = { initialize: function () { module.verbose('Initializing element'); if (typeof settings.value !== 'string') { settings.value = JSON.stringify(settings.value); } storage = module.get.storage(); $module .on('click' + eventNamespace, selector.close, module.dismiss) .data(moduleNamespace, module) ; if (settings.detachable && $module.parent()[0] !== $context[0]) { $module .detach() .prependTo($context) ; } if (settings.displayTime > 0) { setTimeout(function () { module.hide(); }, settings.displayTime); } module.show(); }, destroy: function () { module.verbose('Destroying instance'); $module .removeData(moduleNamespace) .off(eventNamespace) ; }, show: function () { if (module.should.show() && !$module.is(':visible')) { if (settings.onShow.call(element) === false) { module.debug('onShow callback returned false, cancelling nag animation'); return false; } module.debug('Showing nag', settings.animation.show); if (settings.animation.show === 'fade') { $module .fadeIn(settings.duration, settings.easing, settings.onVisible) ; } else { $module .slideDown(settings.duration, settings.easing, settings.onVisible) ; } } }, hide: function () { if (settings.onHide.call(element) === false) { module.debug('onHide callback returned false, cancelling nag animation'); return false; } module.debug('Hiding nag', settings.animation.hide); if (settings.animation.hide === 'fade') { $module .fadeOut(settings.duration, settings.easing, settings.onHidden) ; } else { $module .slideUp(settings.duration, settings.easing, settings.onHidden) ; } }, dismiss: function (event) { if (module.hide() !== false && settings.storageMethod) { module.debug('Dismissing nag', settings.storageMethod, settings.key, settings.value, settings.expires); module.storage.set(settings.key, settings.value); } if (event) { event.stopImmediatePropagation(); event.preventDefault(); } }, should: { show: function () { if (settings.persist) { module.debug('Persistent nag is set, can show nag'); return true; } if (module.storage.get(settings.key) != settings.value.toString()) { module.debug('Stored value is not set, can show nag', module.storage.get(settings.key)); return true; } module.debug('Stored value is set, cannot show nag', module.storage.get(settings.key)); return false; }, }, get: { expirationDate: function (expires) { if (typeof expires === 'number') { expires = new Date(Date.now() + expires * 864e5); } if (expires instanceof Date && expires.getTime()) { return expires.toUTCString(); } module.error(error.expiresFormat); }, storage: function () { if (settings.storageMethod === 'localstorage' && window.localStorage !== undefined) { module.debug('Using local storage'); return window.localStorage; } if (settings.storageMethod === 'sessionstorage' && window.sessionStorage !== undefined) { module.debug('Using session storage'); return window.sessionStorage; } if ('cookie' in document) { module.debug('Using cookie'); return { setItem: function (key, value, options) { // RFC6265 compliant encoding key = encodeURIComponent(key) .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent) .replace(/[()]/g, escape) ; value = encodeURIComponent(value) .replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[B-D])/g, decodeURIComponent) ; var cookieOptions = ''; for (var option in options) { if (Object.prototype.hasOwnProperty.call(options, option)) { cookieOptions += '; ' + option; if (typeof options[option] === 'string') { cookieOptions += '=' + options[option].split(';')[0]; } } } document.cookie = key + '=' + value + cookieOptions; }, getItem: function (key) { var cookies = document.cookie.split('; '); for (var i = 0, il = cookies.length; i < il; i++) { var parts = cookies[i].split('='), foundKey = parts[0].replace(/(%[\da-f]{2})+/gi, decodeURIComponent) ; if (key === foundKey) { return parts[1] || ''; } } }, removeItem: function (key, options) { storage.setItem(key, '', options); }, }; } module.error(error.noStorage); }, storageOptions: function () { var options = {} ; if (settings.expires) { options.expires = module.get.expirationDate(settings.expires); } if (settings.domain) { options.domain = settings.domain; } if (settings.path) { options.path = settings.path; } if (settings.secure) { options.secure = settings.secure; } if (settings.samesite) { options.samesite = settings.samesite; } return options; }, }, clear: function () { module.storage.remove(settings.key); }, storage: { set: function (key, value) { var options = module.get.storageOptions() ; if (storage === window.localStorage && options.expires) { module.debug('Storing expiration value in localStorage', key, options.expires); storage.setItem(key + settings.expirationKey, options.expires); } module.debug('Value stored', key, value); try { storage.setItem(key, value, options); } catch (e) { module.error(error.setItem, e); } }, get: function (key) { var storedValue ; storedValue = storage.getItem(key); if (storage === window.localStorage) { var expiration = storage.getItem(key + settings.expirationKey); if (expiration !== null && expiration !== undefined && new Date(expiration) < new Date()) { module.debug('Value in localStorage has expired. Deleting key', key); module.storage.remove(key); storedValue = null; } } if (storedValue === 'undefined' || storedValue === 'null' || storedValue === undefined || storedValue === null) { storedValue = undefined; } return storedValue; }, remove: function (key) { var options = module.get.storageOptions() ; options.expires = module.get.expirationDate(-1); if (storage === window.localStorage) { storage.removeItem(key + settings.expirationKey); } storage.removeItem(key, options); }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.nag.settings = { name: 'Nag', silent: false, debug: false, verbose: false, performance: true, namespace: 'Nag', // allows cookie to be overridden persist: false, // set to zero to require manually dismissal, otherwise hides on its own displayTime: 0, animation: { show: 'slide', hide: 'slide', }, context: false, detachable: false, expires: 30, // cookie storage only options domain: false, path: '/', secure: false, samesite: false, // type of storage to use storageMethod: 'cookie', // value to store in dismissed localstorage/cookie key: 'nag', value: 'dismiss', // Key suffix to support expiration in localstorage expirationKey: 'ExpirationDate', error: { noStorage: 'Unsupported storage method', method: 'The method you called is not defined.', setItem: 'Unexpected error while setting value', expiresFormat: '"expires" must be a number of days or a Date Object', }, className: { bottom: 'bottom', fixed: 'fixed', }, selector: { close: '> .close.icon', }, duration: 500, easing: 'easeOutQuad', // callback before show animation, return false to prevent show onShow: function () {}, // called after show animation onVisible: function () {}, // callback before hide animation, return false to prevent hide onHide: function () {}, // callback after hide animation onHidden: function () {}, }; // Adds easing $.extend($.easing, { easeOutQuad: function (x) { return 1 - (1 - x) * (1 - x); }, }); })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/placeholder.css ================================================ /*! * # Fomantic-UI 2.9.4 - Placeholder * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /* ------------------- Content -------------------- */ .ui.placeholder { position: static; overflow: hidden; animation: placeholderShimmer 2s linear; animation-iteration-count: infinite; background-color: #fff; background-image: linear-gradient(to right, rgba(0, 0, 0, 0.08) 0, rgba(0, 0, 0, 0.15) 15%, rgba(0, 0, 0, 0.08) 30%); background-size: 1200px 100%; max-width: 30rem; } @keyframes placeholderShimmer { 0% { background-position: -1200px 0; } 100% { background-position: 1200px 0; } } .ui.placeholder + .ui.placeholder { margin-top: 2rem; } .ui.placeholder + .ui.placeholder { animation-delay: 0.15s; } .ui.placeholder + .ui.placeholder + .ui.placeholder { animation-delay: 0.3s; } .ui.placeholder + .ui.placeholder + .ui.placeholder + .ui.placeholder { animation-delay: 0.45s; } .ui.placeholder + .ui.placeholder + .ui.placeholder + .ui.placeholder + .ui.placeholder { animation-delay: 0.6s; } .ui.placeholder, .ui.placeholder > ::before, .ui.placeholder .image.header::after, .ui.placeholder .line, .ui.placeholder .line::after { background-color: #fff; } .ui.placeholder.hidden { display: none; } /* Image */ .ui.placeholder .image:not(.header):not(.ui):not(.icon) { height: 100px; } .ui.placeholder .square.image:not(.header) { height: 0; overflow: hidden; /* 1/1 aspect ratio */ padding-top: 100%; } .ui.placeholder .rectangular.image:not(.header) { height: 0; overflow: hidden; /* 4/3 aspect ratio */ padding-top: 75%; } /* Lines */ .ui.placeholder .line { position: relative; height: 0.85714286em; } .ui.placeholder .line::before, .ui.placeholder .line::after { top: 100%; position: absolute; content: ""; background-color: inherit; } .ui.placeholder .line::before { left: 0; } .ui.placeholder .line::after { right: 0; } /* Any Lines */ .ui.placeholder .line { margin-bottom: 0.5em; } .ui.placeholder .line::before, .ui.placeholder .line::after { height: 0.5em; } .ui.placeholder .line:not(:first-child) { margin-top: 0.5em; } /* Line Outdent */ .ui.placeholder .line:nth-child(1)::after { width: 0; } .ui.placeholder .line:nth-child(2)::after { width: 50%; } .ui.placeholder .line:nth-child(3)::after { width: 10%; } .ui.placeholder .line:nth-child(4)::after { width: 35%; } .ui.placeholder .line:nth-child(5)::after { width: 65%; } /* Header Image + 2 Lines */ .ui.placeholder .header { position: relative; overflow: hidden; } /* Header Line 1 & 2 */ .ui.placeholder .header .line { margin-bottom: 0.64285714em; } .ui.placeholder .header .line::before, .ui.placeholder .header .line::after { height: 0.64285714em; } .ui.placeholder .header .line:not(:first-child) { margin-top: 0.64285714em; } .ui.placeholder .header .line::after { width: 20%; } .ui.placeholder .header .line:nth-child(2)::after { width: 60%; } /* Image Header */ .ui.placeholder .image.header .line { margin-left: 3em; } .ui.placeholder .image.header .line::before { width: 0.71428571rem; } .ui.placeholder .image.header::after { display: block; height: 0.85714286em; content: ""; margin-left: 3em; } /* Spacing */ .ui.placeholder .image .line:first-child, .ui.placeholder .paragraph .line:first-child, .ui.placeholder .header .line:first-child { height: 0.01px; } .ui.placeholder .image:not(:first-child)::before, .ui.placeholder .paragraph:not(:first-child)::before, .ui.placeholder .header:not(:first-child)::before { height: 1.42857143em; content: ""; display: block; } /* Inverted Content Loader */ .ui.inverted.placeholder { background-image: linear-gradient(to right, rgba(255, 255, 255, 0.08) 0, rgba(255, 255, 255, 0.14) 15%, rgba(255, 255, 255, 0.08) 30%); } .ui.inverted.placeholder, .ui.inverted.placeholder > ::before, .ui.inverted.placeholder .image.header::after, .ui.inverted.placeholder .line, .ui.inverted.placeholder .line::after { background-color: #1b1c1d; } /******************************* Variations *******************************/ /* ------------------- Sizes -------------------- */ .ui.placeholder .full.line.line.line::after { width: 0; } .ui.placeholder .very.long.line.line.line::after { width: 10%; } .ui.placeholder .long.line.line.line::after { width: 35%; } .ui.placeholder .medium.line.line.line::after { width: 50%; } .ui.placeholder .short.line.line.line::after { width: 65%; } .ui.placeholder .very.short.line.line.line::after { width: 80%; } /* ------------------- Fluid -------------------- */ .ui.fluid.placeholder { max-width: none; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/popup.css ================================================ /*! * # Fomantic-UI 2.9.4 - Popup * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Popup *******************************/ .ui.popup { display: none; position: absolute; top: 0; right: 0; /* Fixes content being squished when inline (moz only) */ min-width: min-content; z-index: 1900; border: 1px solid #d4d4d5; line-height: 1.4285em; max-width: 250px; background: #fff; padding: 0.833em 1em; font-weight: normal; font-style: normal; color: rgba(0, 0, 0, 0.87); border-radius: 0.28571429rem; box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.popup > .header { padding: 0; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 1.14285714em; line-height: 1.2; font-weight: bold; } .ui.popup > .header + .content { padding-top: 0.5em; } .ui.popup::before { position: absolute; content: ""; width: 0.71428571em; height: 0.71428571em; background: #fff; transform: rotate(45deg); z-index: 1901; box-shadow: 1px 1px 0 0 #bababc; } /******************************* Types *******************************/ /* -------------- Tooltip --------------- */ /* Content */ [data-tooltip] { position: relative; } /* Arrow */ [data-tooltip]::before { pointer-events: none; position: absolute; content: ""; font-size: 1rem; width: 0.71428571em; height: 0.71428571em; background: #fff; z-index: 1901; box-shadow: 1px 1px 0 0 #bababc; } /* Popup */ [data-tooltip]::after { pointer-events: none; content: attr(data-tooltip); position: absolute; text-transform: none; text-align: left; text-shadow: none; white-space: nowrap; font-size: 1rem; border: 1px solid #d4d4d5; line-height: 1.4285em; max-width: none; background: #fff; padding: 0.833em 1em; font-weight: normal; font-style: normal; color: rgba(0, 0, 0, 0.87); border-radius: 0.28571429rem; box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); z-index: 1900; } /* Animation */ [data-tooltip]::before, [data-tooltip]::after { pointer-events: none; opacity: 0; transition: transform 0.2s ease, opacity 0.2s ease; } [data-tooltip]::after, [data-tooltip]:hover::before { transition-delay: 0.04s; } [data-tooltip]::before, [data-tooltip]:hover::after { transition-delay: 0s; } [data-tooltip]::before { transform: rotate(45deg) scale(0.8); transform-origin: center top; } [data-tooltip]::after { transform-origin: center bottom; } [data-tooltip][data-variation~="visible"]::before, [data-tooltip][data-variation~="visible"]::after, [data-tooltip]:hover::before, [data-tooltip]:hover::after { pointer-events: auto; opacity: 1; } [data-tooltip]:hover::before { transform: rotate(45deg) scale(1); } /* Animation Position */ [data-tooltip]:not([data-position])::after, [data-tooltip][data-position="top center"]::after, [data-tooltip][data-position="bottom center"]::after { transform: translateX(-50%) scale(0.8); } [data-tooltip]:not([data-position]):hover::after, [data-tooltip][data-position="top center"]:hover::after, [data-tooltip][data-position="bottom center"]:hover::after { transform: translateX(-50%) scale(1); } [data-tooltip][data-position="left center"]::after, [data-tooltip][data-position="right center"]::after { transform: translateY(-50%) scale(0.8); } [data-tooltip][data-position="left center"]:hover::after, [data-tooltip][data-position="right center"]:hover::after { transform: translateY(-50%) scale(1); -moz-transform: translateY(-50%) scale(1.0001) !important; } [data-tooltip][data-position="top left"]::after, [data-tooltip][data-position="top right"]::after, [data-tooltip][data-position="bottom left"]::after, [data-tooltip][data-position="bottom right"]::after { transform: scale(0.8); } [data-tooltip][data-position="top left"]:hover::after, [data-tooltip][data-position="top right"]:hover::after, [data-tooltip][data-position="bottom left"]:hover::after, [data-tooltip][data-position="bottom right"]:hover::after { transform: scale(1); } [data-tooltip][data-variation~="fixed"]::after { white-space: normal; width: 250px; } [data-tooltip][data-variation*="wide fixed"]::after { width: 350px; } [data-tooltip][data-variation*="very wide fixed"]::after { width: 550px; } @media only screen and (max-width: 767.98px) { [data-tooltip][data-variation~="fixed"]::after { width: 250px; } } /* -------------- Inverted --------------- */ /* Arrow */ [data-tooltip][data-inverted]::before { box-shadow: none; } /* Arrow Position */ [data-tooltip]:not([data-position])[data-inverted]::before { background: #1b1c1d; } /* Popup */ [data-tooltip][data-inverted]::after { background: #1b1c1d; color: #fff; border: none; box-shadow: none; } /* -------------- Position --------------- */ [data-position~="top"][data-tooltip]::before { background: #fff; } /* Top Center (default) */ [data-tooltip]:not([data-position])::after, [data-position="top center"][data-tooltip]::after { top: auto; right: auto; left: 50%; bottom: 100%; margin-bottom: 0.5em; } [data-tooltip]:not([data-position])::before, [data-position="top center"][data-tooltip]::before { top: auto; right: auto; bottom: 100%; left: 50%; background: #fff; margin-left: -0.07142857rem; margin-bottom: 0.14285714rem; } /* Top Left */ [data-position="top left"][data-tooltip]::after { top: auto; right: auto; left: 0; bottom: 100%; margin-bottom: 0.5em; } [data-position="top left"][data-tooltip]::before { top: auto; right: auto; bottom: 100%; left: 1em; margin-left: -0.07142857rem; margin-bottom: 0.14285714rem; } /* Top Right */ [data-position="top right"][data-tooltip]::after { top: auto; left: auto; right: 0; bottom: 100%; margin-bottom: 0.5em; } [data-position="top right"][data-tooltip]::before { top: auto; left: auto; bottom: 100%; right: 1em; margin-left: -0.07142857rem; margin-bottom: 0.14285714rem; } [data-position~="bottom"][data-tooltip]::before { background: #fff; box-shadow: -1px -1px 0 0 #bababc; } /* Bottom Center */ [data-position="bottom center"][data-tooltip]::after { bottom: auto; right: auto; left: 50%; top: 100%; margin-top: 0.5em; } [data-position="bottom center"][data-tooltip]::before { bottom: auto; right: auto; top: 100%; left: 50%; margin-left: -0.07142857rem; margin-top: 0.30714286em; } /* Bottom Left */ [data-position="bottom left"][data-tooltip]::after { left: 0; top: 100%; margin-top: 0.5em; } [data-position="bottom left"][data-tooltip]::before { bottom: auto; right: auto; top: 100%; left: 1em; margin-left: -0.07142857rem; margin-top: 0.14285714rem; } /* Bottom Right */ [data-position="bottom right"][data-tooltip]::after { right: 0; top: 100%; margin-top: 0.5em; } [data-position="bottom right"][data-tooltip]::before { bottom: auto; left: auto; top: 100%; right: 1em; margin-left: -0.14285714rem; margin-top: 0.07142857rem; } /* Left Center */ [data-position="left center"][data-tooltip]::after { right: 100%; top: 50%; margin-right: 0.5em; } [data-position="left center"][data-tooltip]::before { right: 100%; top: 50%; margin-top: -0.14285714rem; margin-right: -0.07142857rem; background: #fff; box-shadow: 1px -1px 0 0 #bababc; } /* Right Center */ [data-position="right center"][data-tooltip]::after { left: 100%; top: 50%; margin-left: 0.5em; } [data-position="right center"][data-tooltip]::before { left: 100%; top: 50%; margin-top: -0.07142857rem; margin-left: 0.14285714rem; background: #fff; box-shadow: -1px 1px 0 0 #bababc; } /* Inverted Arrow Color */ [data-inverted][data-position~="bottom"][data-tooltip]::before { background: #1b1c1d; box-shadow: -1px -1px 0 0 #bababc; } [data-inverted][data-position="left center"][data-tooltip]::before { background: #1b1c1d; box-shadow: 1px -1px 0 0 #bababc; } [data-inverted][data-position="right center"][data-tooltip]::before { background: #1b1c1d; box-shadow: -1px 1px 0 0 #bababc; } [data-inverted][data-position~="top"][data-tooltip]::before { background: #1b1c1d; } [data-position~="bottom"][data-tooltip]::before { transform-origin: center bottom; } [data-position~="bottom"][data-tooltip]::after { transform-origin: center top; } [data-position="bottom center"][data-tooltip]::before { transform-origin: center top; } [data-position="left center"][data-tooltip]::before { transform-origin: top center; } [data-position="left center"][data-tooltip]::after { transform-origin: right center; } [data-position="right center"][data-tooltip]::before { transform-origin: right center; } [data-position="right center"][data-tooltip]::after { transform-origin: left center; } [data-position="top left"][data-tooltip]::after { transform-origin: bottom left; } [data-position="top right"][data-tooltip]::after { transform-origin: bottom right; } [data-position="bottom left"][data-tooltip]::after { transform-origin: top left; } [data-position="bottom right"][data-tooltip]::after { transform-origin: top right; } /* -------------- Basic --------------- */ [data-tooltip][data-variation~="basic"]::before { display: none; } [data-tooltip][data-variation~="multiline"]::after { white-space: pre-line; } /* -------------- Spacing --------------- */ .ui.popup { margin: 0; } /* Extending from Top */ .ui.top.popup { margin: 0 0 0.71428571em; } .ui.top.left.popup { transform-origin: left bottom; } .ui.top.center.popup { transform-origin: center bottom; } .ui.top.right.popup { transform-origin: right bottom; } /* Extending from Vertical Center */ .ui.left.center.popup { margin: 0 0.71428571em 0 0; transform-origin: right 50%; } .ui.right.center.popup { margin: 0 0 0 0.71428571em; transform-origin: left 50%; } /* Extending from Bottom */ .ui.bottom.popup { margin: 0.71428571em 0 0; } .ui.bottom.left.popup { transform-origin: left top; } .ui.bottom.center.popup { transform-origin: center top; } .ui.bottom.right.popup { transform-origin: right top; } /* -------------- Pointer --------------- */ /* --- Below --- */ .ui.bottom.center.popup::before { margin-left: -0.30714286em; top: -0.30714286em; left: 50%; right: auto; bottom: auto; box-shadow: -1px -1px 0 0 #bababc; } .ui.bottom.left.popup { margin-left: 0; } /* rtl:rename */ .ui.bottom.left.popup::before { top: -0.30714286em; left: 1em; right: auto; bottom: auto; margin-left: 0; box-shadow: -1px -1px 0 0 #bababc; } .ui.bottom.right.popup { margin-right: 0; } /* rtl:rename */ .ui.bottom.right.popup::before { top: -0.30714286em; right: 1em; bottom: auto; left: auto; margin-left: 0; box-shadow: -1px -1px 0 0 #bababc; } /* --- Above --- */ .ui.top.center.popup::before { top: auto; right: auto; bottom: -0.30714286em; left: 50%; margin-left: -0.30714286em; } .ui.top.left.popup { margin-left: 0; } /* rtl:rename */ .ui.top.left.popup::before { bottom: -0.30714286em; left: 1em; top: auto; right: auto; margin-left: 0; } .ui.top.right.popup { margin-right: 0; } /* rtl:rename */ .ui.top.right.popup::before { bottom: -0.30714286em; right: 1em; top: auto; left: auto; margin-left: 0; } /* --- Left Center --- */ /* rtl:rename */ .ui.left.center.popup::before { top: 50%; right: -0.30714286em; bottom: auto; left: auto; margin-top: -0.30714286em; box-shadow: 1px -1px 0 0 #bababc; } /* --- Right Center --- */ /* rtl:rename */ .ui.right.center.popup::before { top: 50%; left: -0.30714286em; bottom: auto; right: auto; margin-top: -0.30714286em; box-shadow: -1px 1px 0 0 #bababc; } .ui.right.center.popup::before, .ui.left.center.popup::before { background: #fff; } /* Arrow Color By Location */ .ui.bottom.popup::before { background: #fff; } .ui.top.popup::before { background: #fff; } /* Inverted Arrow Color */ .ui.inverted.bottom.popup::before { background: #1b1c1d; } .ui.inverted.right.center.popup::before, .ui.inverted.left.center.popup::before { background: #1b1c1d; } .ui.inverted.top.popup::before { background: #1b1c1d; } /******************************* Coupling *******************************/ /* Immediate Nested Grid */ .ui.ui.ui.popup > .ui.grid:not(.padded) { width: calc(100% + 1.75rem); margin: -0.7rem -0.875rem; } /******************************* States *******************************/ .ui.loading.popup { cursor: default; pointer-events: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; } .ui.loading.popup * { opacity: 0.3; } .ui.loading.popup::after { position: absolute; content: ""; top: 50%; left: 50%; margin: -1em 0 0 -1em; width: 2em; height: 2em; animation: loader 0.6s infinite linear; border: 0.2em solid #767676; border-radius: 500rem; box-shadow: 0 0 0 1px transparent; visibility: visible; z-index: 101; } .ui.invisible.popup { display: block; visibility: hidden !important; z-index: -1; } .ui.animating.popup, .ui.visible.popup { display: block; } .ui.visible.popup { transform: translateZ(0); -webkit-backface-visibility: hidden; backface-visibility: hidden; } /******************************* Variations *******************************/ /* -------------- Basic --------------- */ .ui.basic.popup::before { display: none; } .ui.fixed.popup { width: 250px; } /* -------------- Wide --------------- */ .ui.wide.popup { max-width: 350px; } .ui.wide.popup.fixed { width: 350px; } .ui[class*="very wide"].popup { max-width: 550px; } .ui[class*="very wide"].popup.fixed { width: 550px; } @media only screen and (max-width: 767.98px) { .ui.wide.popup, .ui[class*="very wide"].popup { max-width: 250px; } .ui.wide.popup.fixed, .ui[class*="very wide"].popup.fixed { width: 250px; } } /* -------------- Fluid --------------- */ .ui.fluid.popup { width: 100%; max-width: none; } /* -------------- Colors --------------- */ /* Inverted colors */ .ui.inverted.popup { background: #1b1c1d; color: #fff; border: none; box-shadow: none; } .ui.inverted.popup .header { background: none; color: #fff; } .ui.inverted.popup::before { background-color: #1b1c1d; box-shadow: none; } .ui.ui.ui.primary.popup::before, .ui.primary.popup, [data-tooltip][data-variation~="primary"]::after, [data-tooltip][data-variation~="primary"]::before { background: #2185d0; color: #fff; border: none; } .ui.ui.ui.primary.loading.popup::before, .ui.primary.loading.popup { background: #9bcbef; } .ui.ui.ui.primary.popup::before, [data-tooltip][data-variation~="primary"]::before { box-shadow: none; } .ui.ui.ui.inverted.primary.popup::before, .ui.inverted.primary.popup, [data-tooltip][data-inverted][data-variation~="primary"]::after, [data-tooltip][data-inverted][data-variation~="primary"]::before { background: #54c8ff; color: #1b1c1d; } .ui.ui.ui.inverted.primary.loading.popup::before, .ui.inverted.primary.loading.popup { background: #007eba; } .ui.ui.ui.secondary.popup::before, .ui.secondary.popup, [data-tooltip][data-variation~="secondary"]::after, [data-tooltip][data-variation~="secondary"]::before { background: #1b1c1d; color: #fff; border: none; } .ui.ui.ui.secondary.loading.popup::before, .ui.secondary.loading.popup { background: #65696c; } .ui.ui.ui.secondary.popup::before, [data-tooltip][data-variation~="secondary"]::before { box-shadow: none; } .ui.ui.ui.inverted.secondary.popup::before, .ui.inverted.secondary.popup, [data-tooltip][data-inverted][data-variation~="secondary"]::after, [data-tooltip][data-inverted][data-variation~="secondary"]::before { background: #545454; color: #1b1c1d; } .ui.ui.ui.inverted.secondary.loading.popup::before, .ui.inverted.secondary.loading.popup { background: #080808; } .ui.ui.ui.red.popup::before, .ui.red.popup, [data-tooltip][data-variation~="red"]::after, [data-tooltip][data-variation~="red"]::before { background: #db2828; color: #fff; border: none; } .ui.ui.ui.red.loading.popup::before, .ui.red.loading.popup { background: #f1abab; } .ui.ui.ui.red.popup::before, [data-tooltip][data-variation~="red"]::before { box-shadow: none; } .ui.ui.ui.inverted.red.popup::before, .ui.inverted.red.popup, [data-tooltip][data-inverted][data-variation~="red"]::after, [data-tooltip][data-inverted][data-variation~="red"]::before { background: #ff695e; color: #1b1c1d; } .ui.ui.ui.inverted.red.loading.popup::before, .ui.inverted.red.loading.popup { background: #c40d00; } .ui.ui.ui.orange.popup::before, .ui.orange.popup, [data-tooltip][data-variation~="orange"]::after, [data-tooltip][data-variation~="orange"]::before { background: #f2711c; color: #fff; border: none; } .ui.ui.ui.orange.loading.popup::before, .ui.orange.loading.popup { background: #faccad; } .ui.ui.ui.orange.popup::before, [data-tooltip][data-variation~="orange"]::before { box-shadow: none; } .ui.ui.ui.inverted.orange.popup::before, .ui.inverted.orange.popup, [data-tooltip][data-inverted][data-variation~="orange"]::after, [data-tooltip][data-inverted][data-variation~="orange"]::before { background: #ff851b; color: #1b1c1d; } .ui.ui.ui.inverted.orange.loading.popup::before, .ui.inverted.orange.loading.popup { background: #813c00; } .ui.ui.ui.yellow.popup::before, .ui.yellow.popup, [data-tooltip][data-variation~="yellow"]::after, [data-tooltip][data-variation~="yellow"]::before { background: #fbbd08; color: #fff; border: none; } .ui.ui.ui.yellow.loading.popup::before, .ui.yellow.loading.popup { background: #fde59f; } .ui.ui.ui.yellow.popup::before, [data-tooltip][data-variation~="yellow"]::before { box-shadow: none; } .ui.ui.ui.inverted.yellow.popup::before, .ui.inverted.yellow.popup, [data-tooltip][data-inverted][data-variation~="yellow"]::after, [data-tooltip][data-inverted][data-variation~="yellow"]::before { background: #ffe21f; color: #1b1c1d; } .ui.ui.ui.inverted.yellow.loading.popup::before, .ui.inverted.yellow.loading.popup { background: #857400; } .ui.ui.ui.olive.popup::before, .ui.olive.popup, [data-tooltip][data-variation~="olive"]::after, [data-tooltip][data-variation~="olive"]::before { background: #b5cc18; color: #fff; border: none; } .ui.ui.ui.olive.loading.popup::before, .ui.olive.loading.popup { background: #e4f18c; } .ui.ui.ui.olive.popup::before, [data-tooltip][data-variation~="olive"]::before { box-shadow: none; } .ui.ui.ui.inverted.olive.popup::before, .ui.inverted.olive.popup, [data-tooltip][data-inverted][data-variation~="olive"]::after, [data-tooltip][data-inverted][data-variation~="olive"]::before { background: #d9e778; color: #1b1c1d; } .ui.ui.ui.inverted.olive.loading.popup::before, .ui.inverted.olive.loading.popup { background: #97a81e; } .ui.ui.ui.green.popup::before, .ui.green.popup, [data-tooltip][data-variation~="green"]::after, [data-tooltip][data-variation~="green"]::before { background: #21ba45; color: #fff; border: none; } .ui.ui.ui.green.loading.popup::before, .ui.green.loading.popup { background: #8aeaa0; } .ui.ui.ui.green.popup::before, [data-tooltip][data-variation~="green"]::before { box-shadow: none; } .ui.ui.ui.inverted.green.popup::before, .ui.inverted.green.popup, [data-tooltip][data-inverted][data-variation~="green"]::after, [data-tooltip][data-inverted][data-variation~="green"]::before { background: #2ecc40; color: #1b1c1d; } .ui.ui.ui.inverted.green.loading.popup::before, .ui.inverted.green.loading.popup { background: #124f19; } .ui.ui.ui.teal.popup::before, .ui.teal.popup, [data-tooltip][data-variation~="teal"]::after, [data-tooltip][data-variation~="teal"]::before { background: #00b5ad; color: #fff; border: none; } .ui.ui.ui.teal.loading.popup::before, .ui.teal.loading.popup { background: #4ffff7; } .ui.ui.ui.teal.popup::before, [data-tooltip][data-variation~="teal"]::before { box-shadow: none; } .ui.ui.ui.inverted.teal.popup::before, .ui.inverted.teal.popup, [data-tooltip][data-inverted][data-variation~="teal"]::after, [data-tooltip][data-inverted][data-variation~="teal"]::before { background: #6dffff; color: #1b1c1d; } .ui.ui.ui.inverted.teal.loading.popup::before, .ui.inverted.teal.loading.popup { background: #00d3d3; } .ui.ui.ui.blue.popup::before, .ui.blue.popup, [data-tooltip][data-variation~="blue"]::after, [data-tooltip][data-variation~="blue"]::before { background: #2185d0; color: #fff; border: none; } .ui.ui.ui.blue.loading.popup::before, .ui.blue.loading.popup { background: #9bcbef; } .ui.ui.ui.blue.popup::before, [data-tooltip][data-variation~="blue"]::before { box-shadow: none; } .ui.ui.ui.inverted.blue.popup::before, .ui.inverted.blue.popup, [data-tooltip][data-inverted][data-variation~="blue"]::after, [data-tooltip][data-inverted][data-variation~="blue"]::before { background: #54c8ff; color: #1b1c1d; } .ui.ui.ui.inverted.blue.loading.popup::before, .ui.inverted.blue.loading.popup { background: #007eba; } .ui.ui.ui.violet.popup::before, .ui.violet.popup, [data-tooltip][data-variation~="violet"]::after, [data-tooltip][data-variation~="violet"]::before { background: #6435c9; color: #fff; border: none; } .ui.ui.ui.violet.loading.popup::before, .ui.violet.loading.popup { background: #c1adea; } .ui.ui.ui.violet.popup::before, [data-tooltip][data-variation~="violet"]::before { box-shadow: none; } .ui.ui.ui.inverted.violet.popup::before, .ui.inverted.violet.popup, [data-tooltip][data-inverted][data-variation~="violet"]::after, [data-tooltip][data-inverted][data-variation~="violet"]::before { background: #a291fb; color: #1b1c1d; } .ui.ui.ui.inverted.violet.loading.popup::before, .ui.inverted.violet.loading.popup { background: #2d09ea; } .ui.ui.ui.purple.popup::before, .ui.purple.popup, [data-tooltip][data-variation~="purple"]::after, [data-tooltip][data-variation~="purple"]::before { background: #a333c8; color: #fff; border: none; } .ui.ui.ui.purple.loading.popup::before, .ui.purple.loading.popup { background: #daabe9; } .ui.ui.ui.purple.popup::before, [data-tooltip][data-variation~="purple"]::before { box-shadow: none; } .ui.ui.ui.inverted.purple.popup::before, .ui.inverted.purple.popup, [data-tooltip][data-inverted][data-variation~="purple"]::after, [data-tooltip][data-inverted][data-variation~="purple"]::before { background: #dc73ff; color: #1b1c1d; } .ui.ui.ui.inverted.purple.loading.popup::before, .ui.inverted.purple.loading.popup { background: #a300d9; } .ui.ui.ui.pink.popup::before, .ui.pink.popup, [data-tooltip][data-variation~="pink"]::after, [data-tooltip][data-variation~="pink"]::before { background: #e03997; color: #fff; border: none; } .ui.ui.ui.pink.loading.popup::before, .ui.pink.loading.popup { background: #f5bddc; } .ui.ui.ui.pink.popup::before, [data-tooltip][data-variation~="pink"]::before { box-shadow: none; } .ui.ui.ui.inverted.pink.popup::before, .ui.inverted.pink.popup, [data-tooltip][data-inverted][data-variation~="pink"]::after, [data-tooltip][data-inverted][data-variation~="pink"]::before { background: #ff8edf; color: #1b1c1d; } .ui.ui.ui.inverted.pink.loading.popup::before, .ui.inverted.pink.loading.popup { background: #f400af; } .ui.ui.ui.brown.popup::before, .ui.brown.popup, [data-tooltip][data-variation~="brown"]::after, [data-tooltip][data-variation~="brown"]::before { background: #a5673f; color: #fff; border: none; } .ui.ui.ui.brown.loading.popup::before, .ui.brown.loading.popup { background: #dbb8a2; } .ui.ui.ui.brown.popup::before, [data-tooltip][data-variation~="brown"]::before { box-shadow: none; } .ui.ui.ui.inverted.brown.popup::before, .ui.inverted.brown.popup, [data-tooltip][data-inverted][data-variation~="brown"]::after, [data-tooltip][data-inverted][data-variation~="brown"]::before { background: #d67c1c; color: #1b1c1d; } .ui.ui.ui.inverted.brown.loading.popup::before, .ui.inverted.brown.loading.popup { background: #4f2e0a; } .ui.ui.ui.grey.popup::before, .ui.grey.popup, [data-tooltip][data-variation~="grey"]::after, [data-tooltip][data-variation~="grey"]::before { background: #767676; color: #fff; border: none; } .ui.ui.ui.grey.loading.popup::before, .ui.grey.loading.popup { background: #c3c3c3; } .ui.ui.ui.grey.popup::before, [data-tooltip][data-variation~="grey"]::before { box-shadow: none; } .ui.ui.ui.inverted.grey.popup::before, .ui.inverted.grey.popup, [data-tooltip][data-inverted][data-variation~="grey"]::after, [data-tooltip][data-inverted][data-variation~="grey"]::before { background: #dcddde; color: #1b1c1d; } .ui.ui.ui.inverted.grey.loading.popup::before, .ui.inverted.grey.loading.popup { background: #8d9194; } .ui.ui.ui.black.popup::before, .ui.black.popup, [data-tooltip][data-variation~="black"]::after, [data-tooltip][data-variation~="black"]::before { background: #1b1c1d; color: #fff; border: none; } .ui.ui.ui.black.loading.popup::before, .ui.black.loading.popup { background: #65696c; } .ui.ui.ui.black.popup::before, [data-tooltip][data-variation~="black"]::before { box-shadow: none; } .ui.ui.ui.inverted.black.popup::before, .ui.inverted.black.popup, [data-tooltip][data-inverted][data-variation~="black"]::after, [data-tooltip][data-inverted][data-variation~="black"]::before { background: #545454; color: #1b1c1d; } .ui.ui.ui.inverted.black.loading.popup::before, .ui.inverted.black.loading.popup { background: #080808; } /* -------------- Flowing --------------- */ .ui.flowing.popup { max-width: none; } /* -------------- Sizes --------------- */ .ui.popup { font-size: 1rem; } .ui.mini.popup { font-size: 0.78571429rem; } [data-tooltip][data-variation~="mini"]::before, [data-tooltip][data-variation~="mini"]::after { font-size: 0.78571429rem; } .ui.tiny.popup { font-size: 0.85714286rem; } [data-tooltip][data-variation~="tiny"]::before, [data-tooltip][data-variation~="tiny"]::after { font-size: 0.85714286rem; } .ui.small.popup { font-size: 0.92857143rem; } [data-tooltip][data-variation~="small"]::before, [data-tooltip][data-variation~="small"]::after { font-size: 0.92857143rem; } .ui.large.popup { font-size: 1.14285714rem; } [data-tooltip][data-variation~="large"]::before, [data-tooltip][data-variation~="large"]::after { font-size: 1.14285714rem; } .ui.big.popup { font-size: 1.28571429rem; } [data-tooltip][data-variation~="big"]::before, [data-tooltip][data-variation~="big"]::after { font-size: 1.28571429rem; } .ui.huge.popup { font-size: 1.42857143rem; } [data-tooltip][data-variation~="huge"]::before, [data-tooltip][data-variation~="huge"]::after { font-size: 1.42857143rem; } .ui.massive.popup { font-size: 1.71428571rem; } [data-tooltip][data-variation~="massive"]::before, [data-tooltip][data-variation~="massive"]::after { font-size: 1.71428571rem; } /******************************* Theme Overrides *******************************/ /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/popup.js ================================================ /*! * # Fomantic-UI 2.9.4 - Popup * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.popup = function (parameters) { var $allModules = $(this), $document = $(document), $window = $(window), $body = $('body'), clickEvent = 'ontouchstart' in document.documentElement ? 'touchstart' : 'click', time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $(context); } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : $body; } } return $context; }, returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.popup.settings, parameters) : $.extend({}, $.fn.popup.settings), selector = settings.selector, className = settings.className, error = settings.error, metadata = settings.metadata, namespace = settings.namespace, eventNamespace = '.' + settings.namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $context = contextCheck(settings.context, window), $scrollContext = contextCheck(settings.scrollContext, window), $boundary = contextCheck(settings.boundary, window), $target = settings.target ? contextCheck(settings.target, window) : $module, $popup, $offsetParent, searchDepth = 0, triedPositions = false, openedWithTouch = false, element = this, instance = $module.data(moduleNamespace), documentObserver, elementNamespace, id, module ; module = { // binds events initialize: function () { module.debug('Initializing', $module); module.createID(); module.bind.events(); if (!module.exists() && settings.preserve) { module.create(); } if (settings.observeChanges) { module.observeChanges(); } module.instantiate(); }, instantiate: function () { module.verbose('Storing instance', module); instance = module; $module .data(moduleNamespace, instance) ; }, observeChanges: function () { if ('MutationObserver' in window) { documentObserver = new MutationObserver(module.event.documentChanged); documentObserver.observe(document, { childList: true, subtree: true, }); module.debug('Setting up mutation observer', documentObserver); } }, refresh: function () { if (settings.popup) { $popup = $document.find(settings.popup).eq(0); } else { if (settings.inline) { $popup = $target.nextAll(selector.popup).eq(0); settings.popup = $popup; } } if (settings.popup) { module.set.invisible(); $offsetParent = module.get.offsetParent(); module.remove.invisible(); if (settings.movePopup && module.has.popup() && module.get.offsetParent($popup)[0] !== $offsetParent[0]) { module.debug('Moving popup to the same offset parent as target'); $popup .detach() .appendTo($offsetParent) ; } } else { $offsetParent = settings.inline ? module.get.offsetParent($target) : (module.has.popup() ? module.get.offsetParent($popup) : $body); } if ($offsetParent.is('html') && $offsetParent[0] !== $body[0]) { module.debug('Setting page as offset parent'); $offsetParent = $body; } if (module.get.variation()) { module.set.variation(); } }, reposition: function () { module.refresh(); module.set.position(); }, destroy: function () { module.debug('Destroying previous module'); if (documentObserver) { documentObserver.disconnect(); } // remove element only if was created dynamically if ($popup && !settings.preserve) { module.removePopup(); } // clear all timeouts clearTimeout(module.hideTimer); clearTimeout(module.showTimer); // remove events module.unbind.close(); module.unbind.events(); $module .removeData(moduleNamespace) ; }, event: { start: function (event) { var delay = $.isPlainObject(settings.delay) ? settings.delay.show : settings.delay ; clearTimeout(module.hideTimer); if (!openedWithTouch || (openedWithTouch && settings.addTouchEvents)) { module.showTimer = setTimeout(function () { module.show(); }, delay); } }, end: function () { var delay = $.isPlainObject(settings.delay) ? settings.delay.hide : settings.delay ; clearTimeout(module.showTimer); module.hideTimer = setTimeout(function () { module.hide(); }, delay); }, touchstart: function (event) { openedWithTouch = true; if (settings.addTouchEvents) { module.show(); } }, resize: function () { if (module.is.visible()) { module.set.position(); } }, documentChanged: function (mutations) { [].forEach.call(mutations, function (mutation) { if (mutation.removedNodes) { [].forEach.call(mutation.removedNodes, function (node) { if (node === element || $(node).find(element).length > 0) { module.debug('Element removed from DOM, tearing down events'); module.destroy(); } }); } }); }, hideGracefully: function (event) { var $target = $(event.target), isInDOM = $.contains(document.documentElement, event.target), inPopup = $target.closest(selector.popup).length > 0 ; // don't close on clicks inside popup if (event && !inPopup && isInDOM) { module.debug('Click occurred outside popup hiding popup'); module.hide(); } else { module.debug('Click was inside popup, keeping popup open'); } }, }, // generates popup html from metadata create: function () { var targetSibling = $target.next(selector.popup), contentFallback = !settings.popup && targetSibling.length === 0 ? $module.attr('title') : false, html = module.get.html(), title = module.get.title(), content = module.get.content(contentFallback) ; if (html || content || title) { module.debug('Creating pop-up html'); if (!html) { html = settings.templates.popup({ title: title, content: content, }); } $popup = $('<div/>') .addClass(className.popup) .data(metadata.activator, $module) .html(html) ; if (settings.inline) { module.verbose('Inserting popup element inline', $popup); $popup .insertAfter($module) ; } else { module.verbose('Appending popup element to body', $popup); $popup .appendTo($context) ; } module.refresh(); module.set.variation(); if (settings.hoverable) { module.bind.popup(); } settings.onCreate.call($popup, element); } else if (settings.popup) { $document.find(settings.popup).data(metadata.activator, $module); module.verbose('Used popup specified in settings'); module.refresh(); if (settings.hoverable) { module.bind.popup(); } } else if (targetSibling.length > 0) { module.verbose('Pre-existing popup found'); settings.inline = true; settings.popup = targetSibling.data(metadata.activator, $module); module.refresh(); if (settings.hoverable) { module.bind.popup(); } } else { module.debug('No content specified skipping display', element); } }, createID: function () { id = (Math.random().toString(16) + '000000000').slice(2, 10); elementNamespace = '.' + id; module.verbose('Creating unique id for element', id); }, // determines popup state toggle: function () { module.debug('Toggling pop-up'); if (module.is.hidden()) { module.debug('Popup is hidden, showing pop-up'); module.unbind.close(); module.show(); } else { module.debug('Popup is visible, hiding pop-up'); module.hide(); } }, show: function (callback) { callback = callback || function () {}; module.debug('Showing pop-up', settings.transition); if (module.is.hidden() && !(module.is.active() && module.is.dropdown())) { if (!module.exists()) { module.create(); } if (settings.onShow.call($popup, element) === false) { module.debug('onShow callback returned false, cancelling popup animation'); return; } if (!settings.preserve && !settings.popup) { module.refresh(); } if ($popup && module.set.position()) { module.save.conditions(); if (settings.exclusive) { module.hideAll(); } module.animate.show(callback); } } }, hide: function (callback) { callback = callback || function () {}; if (module.is.visible() || module.is.animating()) { if (settings.onHide.call($popup, element) === false) { module.debug('onHide callback returned false, cancelling popup animation'); return; } module.remove.visible(); module.unbind.close(); module.restore.conditions(); module.animate.hide(callback); } }, hideAll: function () { $document.find(selector.popup) .filter('.' + className.popupVisible) .each(function () { $(this) .data(metadata.activator) .popup('hide') ; }) ; }, exists: function () { if (!$popup) { return false; } if (settings.inline || settings.popup) { return module.has.popup(); } return $popup.closest($context).length > 0; }, removePopup: function () { if (module.has.popup() && !settings.popup) { module.debug('Removing popup', $popup); $popup.remove(); $popup = undefined; settings.onRemove.call($popup, element); } }, save: { conditions: function () { module.cache = { title: $module.attr('title'), }; if (module.cache.title) { $module.removeAttr('title'); } module.verbose('Saving original attributes', module.cache.title); }, }, restore: { conditions: function () { if (module.cache && module.cache.title) { $module.attr('title', module.cache.title); module.verbose('Restoring original attributes', module.cache.title); } return true; }, }, supports: { svg: function () { return typeof SVGGraphicsElement !== 'undefined'; }, }, animate: { show: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (settings.transition && module.can.useElement('transition')) { module.set.visible(); $popup .transition({ animation: (settings.transition.showMethod || settings.transition) + ' in', queue: false, debug: settings.debug, verbose: settings.verbose, silent: settings.silent, duration: settings.transition.showDuration || settings.duration, onComplete: function () { module.bind.close(); callback.call($popup, element); settings.onVisible.call($popup, element); }, }) ; } }, hide: function (callback) { callback = isFunction(callback) ? callback : function () {}; module.debug('Hiding pop-up'); if (settings.transition && $.fn.transition !== undefined) { $popup .transition({ animation: (settings.transition.hideMethod || settings.transition) + ' out', queue: false, duration: settings.transition.hideDuration || settings.duration, debug: settings.debug, verbose: settings.verbose, silent: settings.silent, onComplete: function () { module.reset(); callback.call($popup, element); settings.onHidden.call($popup, element); }, }) ; } else { module.error(error.noTransition); } }, }, change: { content: function (html) { $popup.html(html); }, }, get: { html: function () { $module.removeData(metadata.html); return $module.data(metadata.html) || settings.html; }, title: function () { $module.removeData(metadata.title); return $module.data(metadata.title) || settings.title; }, content: function (fallback) { $module.removeData(metadata.content); return $module.data(metadata.content) || settings.content || fallback; }, variation: function () { $module.removeData(metadata.variation); return $module.data(metadata.variation) || settings.variation; }, popup: function () { return $popup; }, popupOffset: function () { return $popup.offset(); }, calculations: function () { var $popupOffsetParent = module.get.offsetParent($popup), targetElement = $target[0], isWindowEl = $boundary[0] === window, targetOffset = $target.offset(), parentOffset = settings.inline || (settings.popup && settings.movePopup) ? $target.offsetParent().offset() : { top: 0, left: 0 }, screenPosition = isWindowEl ? { top: 0, left: 0 } : $boundary.offset(), calculations = {}, scroll = isWindowEl ? { top: $window.scrollTop(), left: $window.scrollLeft() } : { top: 0, left: 0 }, screen ; calculations = { // element which is launching popup target: { element: $target[0], width: $target.outerWidth(), height: $target.outerHeight(), top: targetOffset.top - parentOffset.top, left: targetOffset.left - parentOffset.left, margin: {}, }, // popup itself popup: { width: $popup.outerWidth(), height: $popup.outerHeight(), }, // offset container (or 3d context) parent: { width: $offsetParent.outerWidth(), height: $offsetParent.outerHeight(), }, // screen boundaries screen: { top: screenPosition.top, left: screenPosition.left, scroll: { top: scroll.top, left: scroll.left, }, width: $boundary.width(), height: $boundary.height(), }, }; // if popup offset context is not same as target, then adjust calculations if ($popupOffsetParent[0] !== $offsetParent[0]) { var popupOffset = $popupOffsetParent.offset() ; calculations.target.top -= popupOffset.top; calculations.target.left -= popupOffset.left; calculations.parent.width = $popupOffsetParent.outerWidth(); calculations.parent.height = $popupOffsetParent.outerHeight(); } // add in container calcs if fluid if (settings.setFluidWidth && module.is.fluid()) { calculations.container = { width: $popup.parent().outerWidth(), }; calculations.popup.width = calculations.container.width; } // add in margins if inline calculations.target.margin.top = settings.inline ? parseInt(window.getComputedStyle(targetElement).getPropertyValue('margin-top'), 10) : 0; calculations.target.margin.left = settings.inline ? (module.is.rtl() ? parseInt(window.getComputedStyle(targetElement).getPropertyValue('margin-right'), 10) : parseInt(window.getComputedStyle(targetElement).getPropertyValue('margin-left'), 10)) : 0; // calculate screen boundaries screen = calculations.screen; calculations.boundary = { top: screen.top + screen.scroll.top, bottom: screen.top + screen.scroll.top + screen.height, left: screen.left + screen.scroll.left, right: screen.left + screen.scroll.left + screen.width, }; return calculations; }, id: function () { return id; }, startEvent: function () { if (settings.on === 'hover') { return 'mouseenter'; } if (settings.on === 'focus') { return 'focus'; } return false; }, scrollEvent: function () { return 'scroll'; }, endEvent: function () { if (settings.on === 'hover') { return 'mouseleave'; } if (settings.on === 'focus') { return 'blur'; } return false; }, distanceFromBoundary: function (offset, calculations) { var distanceFromBoundary = {}, popup, boundary ; calculations = calculations || module.get.calculations(); // shorthand popup = calculations.popup; boundary = calculations.boundary; if (offset) { distanceFromBoundary = { top: offset.top - boundary.top, left: offset.left - boundary.left, right: boundary.right - (offset.left + popup.width), bottom: boundary.bottom - (offset.top + popup.height), }; module.verbose('Distance from boundaries determined', offset, distanceFromBoundary); } return distanceFromBoundary; }, offsetParent: function ($element) { var element = $element !== undefined ? $element[0] : $target[0], parentNode = element.parentNode, $node = $(parentNode) ; if (parentNode) { var is2D = $node.css('transform') === 'none', isStatic = $node.css('position') === 'static', isBody = $node.is('body') ; while (parentNode && !isBody && isStatic && is2D) { parentNode = parentNode.parentNode; $node = $(parentNode); is2D = $node.css('transform') === 'none'; isStatic = $node.css('position') === 'static'; isBody = $node.is('body'); } } return $node && $node.length > 0 ? $node : $(); }, positions: function () { return { 'top left': false, 'top center': false, 'top right': false, 'bottom left': false, 'bottom center': false, 'bottom right': false, 'left center': false, 'right center': false, }; }, nextPosition: function (position) { var positions = position.split(' '), verticalPosition = positions[0], horizontalPosition = positions[1], opposite = { top: 'bottom', bottom: 'top', left: 'right', right: 'left', }, adjacent = { left: 'center', center: 'right', right: 'left', }, backup = { 'top left': 'top center', 'top center': 'top right', 'top right': 'right center', 'right center': 'bottom right', 'bottom right': 'bottom center', 'bottom center': 'bottom left', 'bottom left': 'left center', 'left center': 'top left', }, adjacentsAvailable = verticalPosition === 'top' || verticalPosition === 'bottom', oppositeTried = false, adjacentTried = false, nextPosition = false ; if (!triedPositions) { module.verbose('All available positions available'); triedPositions = module.get.positions(); } module.debug('Recording last position tried', position); triedPositions[position] = true; if (settings.prefer === 'opposite') { nextPosition = [opposite[verticalPosition], horizontalPosition]; nextPosition = nextPosition.join(' '); oppositeTried = triedPositions[nextPosition] === true; module.debug('Trying opposite strategy', nextPosition); } if ((settings.prefer === 'adjacent') && adjacentsAvailable) { nextPosition = [verticalPosition, adjacent[horizontalPosition]]; nextPosition = nextPosition.join(' '); adjacentTried = triedPositions[nextPosition] === true; module.debug('Trying adjacent strategy', nextPosition); } if (adjacentTried || oppositeTried) { module.debug('Using backup position', nextPosition); nextPosition = backup[position]; } return nextPosition; }, }, set: { position: function (position, calculations) { // exit conditions if ($target.length === 0 || $popup.length === 0) { module.error(error.notFound); return; } var offset, distanceAway, target, popup, parent, positioning, popupOffset, distanceFromBoundary ; calculations = calculations || module.get.calculations(); position = position || $module.data(metadata.position) || settings.position; offset = $module.data(metadata.offset) || settings.offset; distanceAway = settings.distanceAway; // shorthand target = calculations.target; popup = calculations.popup; parent = calculations.parent; if (module.should.centerArrow(calculations)) { module.verbose('Adjusting offset to center arrow on small target element'); if (position === 'top left' || position === 'bottom left') { offset += target.width / 2; offset -= settings.arrowPixelsFromEdge; } if (position === 'top right' || position === 'bottom right') { offset -= target.width / 2; offset += settings.arrowPixelsFromEdge; } } if (target.width === 0 && target.height === 0 && !module.is.svg(target.element)) { module.debug('Popup target is hidden, no action taken'); return false; } if (settings.inline) { module.debug('Adding margin to calculation', target.margin); if (position === 'left center' || position === 'right center') { offset += target.margin.top; distanceAway += -target.margin.left; } else if (position === 'top left' || position === 'top center' || position === 'top right') { offset += target.margin.left; distanceAway -= target.margin.top; } else { offset += target.margin.left; distanceAway += target.margin.top; } } module.debug('Determining popup position from calculations', position, calculations); if (module.is.rtl()) { position = position.replace(/left|right/g, function (match) { return match === 'left' ? 'right' : 'left'; }); module.debug('RTL: Popup position updated', position); } // if last attempt use specified last resort position if (searchDepth === settings.maxSearchDepth && typeof settings.lastResort === 'string') { position = settings.lastResort; } switch (position) { case 'top left': { positioning = { top: 'auto', bottom: parent.height - target.top + distanceAway, left: target.left + offset, right: 'auto', }; break; } case 'top center': { positioning = { bottom: parent.height - target.top + distanceAway, left: target.left + (target.width / 2) - (popup.width / 2) + offset, top: 'auto', right: 'auto', }; break; } case 'top right': { positioning = { bottom: parent.height - target.top + distanceAway, right: parent.width - target.left - target.width - offset, top: 'auto', left: 'auto', }; break; } case 'left center': { positioning = { top: target.top + (target.height / 2) - (popup.height / 2) + offset, right: parent.width - target.left + distanceAway, left: 'auto', bottom: 'auto', }; break; } case 'right center': { positioning = { top: target.top + (target.height / 2) - (popup.height / 2) + offset, left: target.left + target.width + distanceAway, bottom: 'auto', right: 'auto', }; break; } case 'bottom left': { positioning = { top: target.top + target.height + distanceAway, left: target.left + offset, bottom: 'auto', right: 'auto', }; break; } case 'bottom center': { positioning = { top: target.top + target.height + distanceAway, left: target.left + (target.width / 2) - (popup.width / 2) + offset, bottom: 'auto', right: 'auto', }; break; } case 'bottom right': { positioning = { top: target.top + target.height + distanceAway, right: parent.width - target.left - target.width - offset, left: 'auto', bottom: 'auto', }; break; } } if (positioning === undefined) { module.error(error.invalidPosition, position); } module.debug('Calculated popup positioning values', positioning); // tentatively place on stage $popup .css(positioning) .removeClass(className.position) .addClass(position) ; module.set.invisible(); popupOffset = module.get.popupOffset(); // see if any boundaries are surpassed with this tentative position distanceFromBoundary = module.get.distanceFromBoundary(popupOffset, calculations); if (!settings.forcePosition && module.is.offstage(distanceFromBoundary, position)) { module.debug('Position is outside viewport', position); if (searchDepth < settings.maxSearchDepth) { searchDepth++; position = module.get.nextPosition(position); module.debug('Trying new position', position); return $popup ? module.set.position(position, calculations) : false; } if (settings.lastResort) { module.debug('No position found, showing with last position'); } else { module.debug('Popup could not find a position to display', $popup); module.error(error.cannotPlace, element); module.remove.attempts(); module.remove.invisible(); module.reset(); settings.onUnplaceable.call($popup, element); return false; } } module.debug('Position is on stage', position); module.remove.attempts(); module.remove.invisible(); if (settings.setFluidWidth && module.is.fluid()) { module.set.fluidWidth(calculations); } return true; }, fluidWidth: function (calculations) { calculations = calculations || module.get.calculations(); module.debug('Automatically setting element width to parent width', calculations.parent.width); $popup.css('width', calculations.container.width); }, loading: function () { $popup.addClass(className.loading); }, invisible: function () { $popup.addClass(className.invisible); }, variation: function (variation) { variation = variation || module.get.variation(); if (variation && module.has.popup()) { module.verbose('Adding variation to popup', variation); $popup.addClass(variation); } }, visible: function () { $module.addClass(className.visible); }, }, remove: { loading: function () { $popup.removeClass(className.loading); }, invisible: function () { $popup.removeClass(className.invisible); }, variation: function (variation) { variation = variation || module.get.variation(); if (variation) { module.verbose('Removing variation', variation); $popup.removeClass(variation); } }, visible: function () { $module.removeClass(className.visible); }, attempts: function () { module.verbose('Resetting all searched positions'); searchDepth = 0; triedPositions = false; }, }, bind: { events: function () { module.debug('Binding popup events to module'); if (settings.on === 'click') { $module .on(clickEvent + eventNamespace, module.toggle) ; } if (settings.on === 'hover') { $module .on('touchstart' + eventNamespace, module.event.touchstart) ; } if (module.get.startEvent()) { $module .on(module.get.startEvent() + eventNamespace, module.event.start) .on(module.get.endEvent() + eventNamespace, module.event.end) ; } if (settings.target) { module.debug('Target set to element', $target); } $window.on('resize' + elementNamespace, module.event.resize); }, popup: function () { module.verbose('Allowing hover events on popup to prevent closing'); if ($popup && module.has.popup()) { $popup .on('mouseenter' + eventNamespace, module.event.start) .on('mouseleave' + eventNamespace, module.event.end) ; } }, close: function () { if (settings.hideOnScroll === true || (settings.hideOnScroll === 'auto' && settings.on !== 'click')) { module.bind.closeOnScroll(); } if (module.is.closable()) { module.bind.clickaway(); } else if (settings.on === 'hover' && openedWithTouch) { module.bind.touchClose(); } }, closeOnScroll: function () { module.verbose('Binding scroll close event to document'); $scrollContext .one(module.get.scrollEvent() + elementNamespace, module.event.hideGracefully) ; }, touchClose: function () { module.verbose('Binding popup touchclose event to document'); $document .on('touchstart' + elementNamespace, function (event) { module.verbose('Touched away from popup'); module.event.hideGracefully.call(element, event); }) ; }, clickaway: function () { module.verbose('Binding popup close event to document'); $document .on(clickEvent + elementNamespace, function (event) { module.verbose('Clicked away from popup'); module.event.hideGracefully.call(element, event); }) ; }, }, unbind: { events: function () { $window .off(elementNamespace) ; $module .off(eventNamespace) ; }, close: function () { $document .off(elementNamespace) ; $scrollContext .off(elementNamespace) ; }, }, can: { useElement: function (element) { if ($.fn[element] !== undefined) { return true; } module.error(error.noElement.replace('{element}', element)); return false; }, }, has: { popup: function () { return $popup && $popup.length > 0; }, }, should: { centerArrow: function (calculations) { return !module.is.basic() && calculations.target.width <= (settings.arrowPixelsFromEdge * 2); }, }, is: { closable: function () { if (settings.closable === 'auto') { return settings.on !== 'hover'; } return settings.closable; }, offstage: function (distanceFromBoundary, position) { var offstage = [] ; // return boundaries that have been surpassed $.each(distanceFromBoundary, function (direction, distance) { if (distance < -settings.jitter) { module.debug('Position exceeds allowable distance from edge', direction, distance, position); offstage.push(direction); } }); return offstage.length > 0; }, svg: function (element) { return module.supports.svg() && (element instanceof SVGGraphicsElement); }, basic: function () { return $module.hasClass(className.basic); }, active: function () { return $module.hasClass(className.active); }, animating: function () { return $popup !== undefined && $popup.hasClass(className.animating); }, fluid: function () { return $popup !== undefined && $popup.hasClass(className.fluid); }, visible: function () { return $popup !== undefined && $popup.hasClass(className.popupVisible); }, dropdown: function () { return $module.hasClass(className.dropdown); }, hidden: function () { return !module.is.visible(); }, rtl: function () { return $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl' || $body.attr('dir') === 'rtl' || $body.css('direction') === 'rtl' || $context.attr('dir') === 'rtl' || $context.css('direction') === 'rtl'; }, }, reset: function () { module.remove.visible(); if (settings.preserve) { if ($.fn.transition !== undefined) { $popup .transition('remove transition') ; } } else { module.removePopup(); } }, setting: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { settings[name] = value; } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.popup.settings = { name: 'Popup', // module settings silent: false, debug: false, verbose: false, performance: true, namespace: 'popup', // whether it should use dom mutation observers observeChanges: true, // callback only when element added to dom onCreate: function () {}, // callback before element removed from dom onRemove: function () {}, // callback before show animation onShow: function () {}, // callback after show animation onVisible: function () {}, // callback before hide animation onHide: function () {}, // callback when popup cannot be positioned in visible screen onUnplaceable: function () {}, // callback after hide animation onHidden: function () {}, // when to show popup on: 'hover', // element to use to determine if popup is out of boundary boundary: window, // whether to add touchstart events when using hover addTouchEvents: true, // default position relative to element position: 'top left', // if given position should be used regardless if popup fits forcePosition: false, // name of variation to use variation: '', // whether popup should be moved to context movePopup: true, // element which popup should be relative to target: false, // jq selector or element that should be used as popup popup: false, // popup should remain inline next to activator inline: false, // popup should be removed from page on hide preserve: false, // popup should not close when being hovered on hoverable: false, // explicitly set content content: false, // explicitly set html html: false, // explicitly set title title: false, // whether automatically close on clickaway when on click closable: true, // automatically hide on scroll hideOnScroll: 'auto', // hide other popups on show exclusive: false, // context to attach popups context: 'body', // context for binding scroll events scrollContext: window, // position to prefer when calculating new position prefer: 'opposite', // specify position to appear even if it doesn't fit lastResort: false, // number of pixels from edge of popup to pointing arrow center (used from centering) arrowPixelsFromEdge: 20, // delay used to prevent accidental refiring of animations due to user error delay: { show: 50, hide: 70, }, // whether fluid variation should assign width explicitly setFluidWidth: true, // transition settings duration: 200, transition: 'scale', // distance away from activating element in px distanceAway: 0, // number of pixels an element is allowed to be "offstage" for a position to be chosen (allows for rounding) jitter: 2, // offset on aligning axis from calculated position offset: 0, // maximum times to look for a position before failing (9 positions total) maxSearchDepth: 15, error: { invalidPosition: 'The position you specified is not a valid position', cannotPlace: 'Popup does not fit within the boundaries of the viewport', method: 'The method you called is not defined.', noElement: 'This module requires ui {element}', notFound: 'The target or popup you specified does not exist on the page', }, metadata: { activator: 'activator', content: 'content', html: 'html', offset: 'offset', position: 'position', title: 'title', variation: 'variation', }, className: { active: 'active', basic: 'basic', animating: 'animating', dropdown: 'dropdown', invisible: 'invisible', fluid: 'fluid', loading: 'loading', popup: 'ui popup', position: 'top left center bottom right', visible: 'visible', popupVisible: 'visible', }, selector: { popup: '.ui.popup', }, templates: { escape: function (string) { var badChars = /["'<>`]/g, shouldEscape = /["&'<>`]/, escape = { '<': '<', '>': '>', '"': '"', "'": ''', '`': '`', }, escapedChar = function (chr) { return escape[chr]; } ; if (shouldEscape.test(string)) { string = string.replace(/&(?![\d#a-z]{1,12};)/gi, '&'); return string.replace(badChars, escapedChar); } return string; }, popup: function (text) { var html = '', escape = $.fn.popup.settings.templates.escape ; if (text !== undefined) { if (text.title) { text.title = escape(text.title); html += '<div class="header">' + text.title + '</div>'; } if (text.content) { text.content = escape(text.content); html += '<div class="content">' + text.content + '</div>'; } } return html; }, }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/progress.css ================================================ /*! * # Fomantic-UI 2.9.4 - Progress * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Progress *******************************/ .ui.progress { position: relative; display: flex; max-width: 100%; border: none; margin: 1em 0 2.5em; box-shadow: none; background: rgba(0, 0, 0, 0.1); padding: 0; border-radius: 0.28571429rem; } .ui.basic.progress { background: transparent; border: none; box-shadow: none; } .ui.progress:first-child { margin: 0 0 2.5em; } .ui.progress:last-child { margin: 0 0 1.5em; } /******************************* Content *******************************/ /* Activity Bar */ .ui.progress .bar { display: block; line-height: 1; position: relative; width: 0; background: #888; border-radius: 0.28571429rem; transition: width 0.1s ease, background-color 0.1s ease; overflow: hidden; } .ui.progress .bar:not(:empty) { min-width: 2.5em; } .ui.ui.ui.progress:not([data-percent]):not(.indeterminate) .bar:not(:empty), .ui.ui.ui.progress[data-percent="0"]:not(.indeterminate) .bar:not(:empty) { background: transparent; } .ui.progress[data-percent="0"] .bar .progress { color: rgba(0, 0, 0, 0.87); } .ui.inverted.progress[data-percent="0"] .bar .progress { color: rgba(255, 255, 255, 0.9); } /* Percent Complete */ .ui.progress .bar > .progress { white-space: nowrap; position: absolute; width: auto; font-size: 0.92857143em; top: 50%; right: 0.5em; left: auto; bottom: auto; color: rgba(255, 255, 255, 0.7); text-shadow: none; margin-top: -0.5em; font-weight: bold; text-align: left; } .ui.right.aligned.progress { justify-content: flex-end; } .ui.right.aligned.progress .bar > .progress { left: 0.5em; right: auto; } /* Label */ .ui.progress > .label { position: absolute; width: 100%; font-size: 1em; top: 100%; right: auto; left: 0; bottom: auto; color: rgba(0, 0, 0, 0.87); font-weight: bold; text-shadow: none; margin-top: 0.2em; text-align: center; transition: color 0.4s ease; } /******************************* Types *******************************/ /* Indicating */ .ui.indicating.progress[data-percent^="1"] .bar, .ui.indicating.progress[data-percent^="2"] .bar { background-color: #d95c5c; } .ui.indicating.progress[data-percent^="3"] .bar { background-color: #efbc72; } .ui.indicating.progress[data-percent^="4"] .bar, .ui.indicating.progress[data-percent^="5"] .bar { background-color: #e6bb48; } .ui.indicating.progress[data-percent^="6"] .bar { background-color: #ddc928; } .ui.indicating.progress[data-percent^="7"] .bar, .ui.indicating.progress[data-percent^="8"] .bar { background-color: #b4d95c; } .ui.indicating.progress[data-percent^="9"] .bar, .ui.indicating.progress[data-percent^="100"] .bar { background-color: #66da81; } /* Indicating Label */ .ui.indicating.progress[data-percent^="1"] .label, .ui.indicating.progress[data-percent^="2"] .label { color: rgba(0, 0, 0, 0.87); } .ui.indicating.progress[data-percent^="3"] .label { color: rgba(0, 0, 0, 0.87); } .ui.indicating.progress[data-percent^="4"] .label, .ui.indicating.progress[data-percent^="5"] .label { color: rgba(0, 0, 0, 0.87); } .ui.indicating.progress[data-percent^="6"] .label { color: rgba(0, 0, 0, 0.87); } .ui.indicating.progress[data-percent^="7"] .label, .ui.indicating.progress[data-percent^="8"] .label { color: rgba(0, 0, 0, 0.87); } .ui.indicating.progress[data-percent^="9"] .label, .ui.indicating.progress[data-percent^="100"] .label { color: rgba(0, 0, 0, 0.87); } /* Inverted Indicating Label */ .ui.inverted.indicating.progress[data-percent^="1"] .label, .ui.inverted.indicating.progress[data-percent^="2"] .label { color: rgba(255, 255, 255, 0.9); } .ui.inverted.indicating.progress[data-percent^="3"] .label { color: rgba(255, 255, 255, 0.9); } .ui.inverted.indicating.progress[data-percent^="4"] .label, .ui.inverted.indicating.progress[data-percent^="5"] .label { color: rgba(255, 255, 255, 0.9); } .ui.inverted.indicating.progress[data-percent^="6"] .label { color: rgba(255, 255, 255, 0.9); } .ui.inverted.indicating.progress[data-percent^="7"] .label, .ui.inverted.indicating.progress[data-percent^="8"] .label { color: rgba(255, 255, 255, 0.9); } .ui.inverted.indicating.progress[data-percent^="9"] .label, .ui.inverted.indicating.progress[data-percent^="100"] .label { color: rgba(255, 255, 255, 0.9); } /* Single Digits */ .ui.indicating.progress[data-percent="1"] .bar, .ui.indicating.progress[data-percent^="1."] .bar, .ui.indicating.progress[data-percent="2"] .bar, .ui.indicating.progress[data-percent^="2."] .bar, .ui.indicating.progress[data-percent="3"] .bar, .ui.indicating.progress[data-percent^="3."] .bar, .ui.indicating.progress[data-percent="4"] .bar, .ui.indicating.progress[data-percent^="4."] .bar, .ui.indicating.progress[data-percent="5"] .bar, .ui.indicating.progress[data-percent^="5."] .bar, .ui.indicating.progress[data-percent="6"] .bar, .ui.indicating.progress[data-percent^="6."] .bar, .ui.indicating.progress[data-percent="7"] .bar, .ui.indicating.progress[data-percent^="7."] .bar, .ui.indicating.progress[data-percent="8"] .bar, .ui.indicating.progress[data-percent^="8."] .bar, .ui.indicating.progress[data-percent="9"] .bar, .ui.indicating.progress[data-percent^="9."] .bar { background-color: #d95c5c; } .ui.indicating.progress[data-percent="0"] .label, .ui.indicating.progress[data-percent^="0."] .label, .ui.indicating.progress[data-percent="1"] .label, .ui.indicating.progress[data-percent^="1."] .label, .ui.indicating.progress[data-percent="2"] .label, .ui.indicating.progress[data-percent^="2."] .label, .ui.indicating.progress[data-percent="3"] .label, .ui.indicating.progress[data-percent^="3."] .label, .ui.indicating.progress[data-percent="4"] .label, .ui.indicating.progress[data-percent^="4."] .label, .ui.indicating.progress[data-percent="5"] .label, .ui.indicating.progress[data-percent^="5."] .label, .ui.indicating.progress[data-percent="6"] .label, .ui.indicating.progress[data-percent^="6."] .label, .ui.indicating.progress[data-percent="7"] .label, .ui.indicating.progress[data-percent^="7."] .label, .ui.indicating.progress[data-percent="8"] .label, .ui.indicating.progress[data-percent^="8."] .label, .ui.indicating.progress[data-percent="9"] .label, .ui.indicating.progress[data-percent^="9."] .label { color: rgba(0, 0, 0, 0.87); } .ui.inverted.indicating.progress[data-percent="0"] .label, .ui.inverted.indicating.progress[data-percent^="0."] .label, .ui.inverted.indicating.progress[data-percent="1"] .label, .ui.inverted.indicating.progress[data-percent^="1."] .label, .ui.inverted.indicating.progress[data-percent="2"] .label, .ui.inverted.indicating.progress[data-percent^="2."] .label, .ui.inverted.indicating.progress[data-percent="3"] .label, .ui.inverted.indicating.progress[data-percent^="3."] .label, .ui.inverted.indicating.progress[data-percent="4"] .label, .ui.inverted.indicating.progress[data-percent^="4."] .label, .ui.inverted.indicating.progress[data-percent="5"] .label, .ui.inverted.indicating.progress[data-percent^="5."] .label, .ui.inverted.indicating.progress[data-percent="6"] .label, .ui.inverted.indicating.progress[data-percent^="6."] .label, .ui.inverted.indicating.progress[data-percent="7"] .label, .ui.inverted.indicating.progress[data-percent^="7."] .label, .ui.inverted.indicating.progress[data-percent="8"] .label, .ui.inverted.indicating.progress[data-percent^="8."] .label, .ui.inverted.indicating.progress[data-percent="9"] .label, .ui.inverted.indicating.progress[data-percent^="9."] .label { color: rgba(255, 255, 255, 0.9); } /* Indicating Success */ .ui.ui.indicating.progress.success .label { color: #1a531b; } /******************************* States *******************************/ /* -------------- Success --------------- */ .ui.ui.progress.success .bar { background-color: #21ba45; } .ui.ui.progress.success .bar, .ui.ui.progress.success .bar::after { animation: none; } .ui.progress.success > .label { color: #1a531b; } /* -------------- Warning --------------- */ .ui.ui.progress.warning .bar { background-color: #f2c037; } .ui.ui.progress.warning .bar, .ui.ui.progress.warning .bar::after { animation: none; } .ui.progress.warning > .label { color: #794b02; } /* -------------- Error --------------- */ .ui.ui.progress.error .bar { background-color: #db2828; } .ui.ui.progress.error .bar, .ui.ui.progress.error .bar::after { animation: none; } .ui.progress.error > .label { color: #912d2b; } /* -------------- Active --------------- */ .ui.active.progress .bar { position: relative; } .ui.active.progress .bar:not(:empty) { min-width: 2.5em; } .ui.active.progress .bar::after { content: ""; opacity: 0; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: #fff; border-radius: 0.28571429rem; animation: progress-active 2s ease infinite; transform-origin: left; } .ui.active.right.aligned.progress .bar::after { transform-origin: right; } @keyframes progress-active { 0% { opacity: 0.3; transform: scale(0, 1); } 100% { opacity: 0; transform: scale(1); } } /* -------------- Disabled --------------- */ .ui.disabled.progress { opacity: 0.35; } .ui.ui.disabled.progress .bar, .ui.ui.disabled.progress .bar::after { animation: none; } /******************************* Variations *******************************/ /* -------------- Inverted --------------- */ .ui.inverted.progress:not(.basic) { background: rgba(255, 255, 255, 0.08); border: none; } .ui.inverted.progress .bar { background: #888; } .ui.inverted.progress .bar > .progress { color: #1b1c1d; } .ui.inverted.progress > .label { color: #fff; } .ui.inverted.progress.success > .label { color: #21ba45; } .ui.inverted.progress.warning > .label { color: #f2c037; } .ui.inverted.progress.error > .label { color: #db2828; } /* -------------- Attached --------------- */ /* bottom attached */ .ui.progress.attached { background: transparent; position: relative; border: none; margin: 0; } .ui.progress.attached, .ui.progress.attached .bar { height: 0.2rem; padding: 0; overflow: hidden; border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui.progress.attached .bar { border-radius: 0; } /* top attached */ .ui.progress.top.attached, .ui.progress.top.attached .bar { top: 0; border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.progress.top.attached .bar { border-radius: 0; } /* Coupling */ .ui.segment > .ui.attached.progress, .ui.card > .ui.attached.progress { position: absolute; top: auto; left: 0; bottom: 100%; width: 100%; } .ui.segment > .ui.bottom.attached.progress, .ui.card > .ui.bottom.attached.progress { top: 100%; bottom: auto; } /* -------------- Colors --------------- */ .ui.indeterminate.primary.progress .bar::before, .ui.primary.progress .bar, .ui.progress .primary.bar { background-color: #2185d0; } .ui.inverted.indeterminate.primary.progress .bar::before, .ui.primary.inverted.progress .bar, .ui.inverted.progress .primary.bar { background-color: #54c8ff; } .ui.indeterminate.secondary.progress .bar::before, .ui.secondary.progress .bar, .ui.progress .secondary.bar { background-color: #1b1c1d; } .ui.inverted.indeterminate.secondary.progress .bar::before, .ui.secondary.inverted.progress .bar, .ui.inverted.progress .secondary.bar { background-color: #545454; } .ui.indeterminate.red.progress .bar::before, .ui.red.progress .bar, .ui.progress .red.bar { background-color: #db2828; } .ui.inverted.indeterminate.red.progress .bar::before, .ui.red.inverted.progress .bar, .ui.inverted.progress .red.bar { background-color: #ff695e; } .ui.indeterminate.orange.progress .bar::before, .ui.orange.progress .bar, .ui.progress .orange.bar { background-color: #f2711c; } .ui.inverted.indeterminate.orange.progress .bar::before, .ui.orange.inverted.progress .bar, .ui.inverted.progress .orange.bar { background-color: #ff851b; } .ui.indeterminate.yellow.progress .bar::before, .ui.yellow.progress .bar, .ui.progress .yellow.bar { background-color: #fbbd08; } .ui.inverted.indeterminate.yellow.progress .bar::before, .ui.yellow.inverted.progress .bar, .ui.inverted.progress .yellow.bar { background-color: #ffe21f; } .ui.indeterminate.olive.progress .bar::before, .ui.olive.progress .bar, .ui.progress .olive.bar { background-color: #b5cc18; } .ui.inverted.indeterminate.olive.progress .bar::before, .ui.olive.inverted.progress .bar, .ui.inverted.progress .olive.bar { background-color: #d9e778; } .ui.indeterminate.green.progress .bar::before, .ui.green.progress .bar, .ui.progress .green.bar { background-color: #21ba45; } .ui.inverted.indeterminate.green.progress .bar::before, .ui.green.inverted.progress .bar, .ui.inverted.progress .green.bar { background-color: #2ecc40; } .ui.indeterminate.teal.progress .bar::before, .ui.teal.progress .bar, .ui.progress .teal.bar { background-color: #00b5ad; } .ui.inverted.indeterminate.teal.progress .bar::before, .ui.teal.inverted.progress .bar, .ui.inverted.progress .teal.bar { background-color: #6dffff; } .ui.indeterminate.blue.progress .bar::before, .ui.blue.progress .bar, .ui.progress .blue.bar { background-color: #2185d0; } .ui.inverted.indeterminate.blue.progress .bar::before, .ui.blue.inverted.progress .bar, .ui.inverted.progress .blue.bar { background-color: #54c8ff; } .ui.indeterminate.violet.progress .bar::before, .ui.violet.progress .bar, .ui.progress .violet.bar { background-color: #6435c9; } .ui.inverted.indeterminate.violet.progress .bar::before, .ui.violet.inverted.progress .bar, .ui.inverted.progress .violet.bar { background-color: #a291fb; } .ui.indeterminate.purple.progress .bar::before, .ui.purple.progress .bar, .ui.progress .purple.bar { background-color: #a333c8; } .ui.inverted.indeterminate.purple.progress .bar::before, .ui.purple.inverted.progress .bar, .ui.inverted.progress .purple.bar { background-color: #dc73ff; } .ui.indeterminate.pink.progress .bar::before, .ui.pink.progress .bar, .ui.progress .pink.bar { background-color: #e03997; } .ui.inverted.indeterminate.pink.progress .bar::before, .ui.pink.inverted.progress .bar, .ui.inverted.progress .pink.bar { background-color: #ff8edf; } .ui.indeterminate.brown.progress .bar::before, .ui.brown.progress .bar, .ui.progress .brown.bar { background-color: #a5673f; } .ui.inverted.indeterminate.brown.progress .bar::before, .ui.brown.inverted.progress .bar, .ui.inverted.progress .brown.bar { background-color: #d67c1c; } .ui.indeterminate.grey.progress .bar::before, .ui.grey.progress .bar, .ui.progress .grey.bar { background-color: #767676; } .ui.inverted.indeterminate.grey.progress .bar::before, .ui.grey.inverted.progress .bar, .ui.inverted.progress .grey.bar { background-color: #dcddde; } .ui.indeterminate.black.progress .bar::before, .ui.black.progress .bar, .ui.progress .black.bar { background-color: #1b1c1d; } .ui.inverted.indeterminate.black.progress .bar::before, .ui.black.inverted.progress .bar, .ui.inverted.progress .black.bar { background-color: #545454; } /* -------------- Sizes --------------- */ .ui.progress { font-size: 1rem; } .ui.progress .bar { height: 1.75em; } .ui.mini.progress { font-size: 0.78571429rem; } .ui.mini.progress .bar { height: 0.3em; } .ui.tiny.progress { font-size: 0.85714286rem; } .ui.tiny.progress .bar { height: 0.5em; } .ui.small.progress { font-size: 0.92857143rem; } .ui.small.progress .bar { height: 1em; } .ui.large.progress { font-size: 1.14285714rem; } .ui.large.progress .bar { height: 2.5em; } .ui.big.progress { font-size: 1.28571429rem; } .ui.big.progress .bar { height: 3.5em; } .ui.huge.progress { font-size: 1.42857143rem; } .ui.huge.progress .bar { height: 4em; } .ui.massive.progress { font-size: 1.71428571rem; } .ui.massive.progress .bar { height: 5em; } /* --------------- Indeterminate ---------------- */ .ui.indeterminate.progress .bar { width: 100%; } .ui.indeterminate.progress .bar .progress, .ui.progress .bar .centered.progress { text-align: center; position: relative; right: 0; } .ui.indeterminate.progress .bar::before { content: ""; position: absolute; top: 0; bottom: 0; border-radius: 0.28571429rem; animation: progress-pulsating 2s ease infinite; transform-origin: center; width: 100%; } .ui.slow.indeterminate.progress .bar::before { animation-duration: 4s; } .ui.fast.indeterminate.progress .bar::before { animation-duration: 1s; } .ui.swinging.indeterminate.progress .bar::before { transform-origin: left; animation-name: progress-swinging; } .ui.sliding.indeterminate.progress .bar::before { transform-origin: left; animation-name: progress-sliding; } .ui.filling.indeterminate.progress .bar::before { animation-name: progress-filling; } .ui.indeterminate.progress:not(.sliding):not(.filling):not(.swinging) .bar::before { background: #fff; } .ui.sliding.indeterminate.progress .bar, .ui.swinging.indeterminate.progress .bar, .ui.filling.indeterminate.progress .bar { background: rgba(0, 0, 0, 0.1); } .ui.sliding.indeterminate.progress .bar .progress, .ui.swinging.indeterminate.progress .bar .progress { color: #1b1c1d; } .ui.inverted.sliding.indeterminate.progress .bar, .ui.inverted.swinging.indeterminate.progress .bar, .ui.inverted.filling.indeterminate.progress .bar { background: rgba(255, 255, 255, 0.08); } .ui.inverted.sliding.indeterminate.progress .bar .progress, .ui.inverted.swinging.indeterminate.progress .bar .progress { color: rgba(255, 255, 255, 0.7); } @keyframes progress-swinging { 0%, 100% { width: 10%; left: -25%; } 25%, 65% { width: 70%; } 50% { width: 10%; left: 100%; } } @keyframes progress-sliding { 0% { width: 10%; left: -25%; } 50% { width: 70%; } 100% { width: 10%; left: 100%; } } @keyframes progress-filling { 0% { transform: scale(0, 1); } 80% { transform: scale(1); opacity: 1; } 100% { opacity: 0; } } @keyframes progress-pulsating { 0% { transform: scale(0, 1); opacity: 0.7; } 100% { transform: scale(1); opacity: 0; } } /******************************* Progress *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/progress.js ================================================ /*! * # Fomantic-UI 2.9.4 - Progress * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.progress = function (parameters) { var $allModules = $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.progress.settings, parameters) : $.extend({}, $.fn.progress.settings), className = settings.className, metadata = settings.metadata, namespace = settings.namespace, selector = settings.selector, error = settings.error, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $bars = $(this).find(selector.bar), $progresses = $(this).find(selector.progress), $label = $(this).find(selector.label), element = this, instance = $module.data(moduleNamespace), animating = false, module ; module = { helper: { sum: function (nums) { return Array.isArray(nums) ? nums.reduce(function (left, right) { return left + Number(right); }, 0) : 0; }, /** * Derive precision for multiple progress with total and values. * * This helper dervices a precision that is sufficiently large to show minimum value of multiple progress. * * Example1 * - total: 1122 * - values: [325, 111, 74, 612] * - min ratio: 74/1122 = 0.0659... * - required precision: 100 * * Example2 * - total: 10541 * - values: [3235, 1111, 74, 6121] * - min ratio: 74/10541 = 0.0070... * - required precision: 1000 * * @param min A minimum value within multiple values * @param total A total amount of multiple values * @returns {number} A precision. Could be 1, 10, 100, ... 1e+10. */ derivePrecision: function (min, total) { var precisionPower = 0; var precision = 1; var ratio = min / total; while (precisionPower < 10) { ratio *= precision; if (ratio > 1) { break; } precision = Math.pow(10, precisionPower++); } return precision; }, forceArray: function (element) { return Array.isArray(element) ? element : (!isNaN(element) ? [element] : (typeof element === 'string' ? element.split(',') : [])); // eslint-disable-line unicorn/no-nested-ternary }, }, initialize: function () { module.set.duration(); module.debug(element); module.read.metadata(); module.read.settings(); module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of progress', module); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.verbose('Destroying previous progress for', $module); clearInterval(instance.interval); module.remove.state(); $module.removeData(moduleNamespace); instance = undefined; }, reset: function () { module.remove.nextValue(); module.update.progress(0); }, complete: function (keepState) { if (module.percent === undefined || module.percent < 100) { module.remove.progressPoll(); if (keepState !== true) { module.set.percent(100); } } }, read: { metadata: function () { var data = { percent: module.helper.forceArray($module.data(metadata.percent)), total: $module.data(metadata.total), value: module.helper.forceArray($module.data(metadata.value)), } ; if (data.total !== undefined) { module.debug('Total value set from metadata', data.total); module.set.total(data.total); } if (data.value.length > 0) { module.debug('Current value set from metadata', data.value); module.set.value(data.value); module.set.progress(data.value); } if (data.percent.length > 0) { module.debug('Current percent value set from metadata', data.percent); module.set.percent(data.percent); } }, settings: function () { if (settings.total !== false) { module.debug('Current total set in settings', settings.total); module.set.total(settings.total); } if (settings.value !== false) { module.debug('Current value set in settings', settings.value); module.set.value(settings.value); module.set.progress(module.value); } if (settings.percent !== false) { module.debug('Current percent set in settings', settings.percent); module.set.percent(settings.percent); } }, }, bind: { transitionEnd: function (callback) { $bars .one('transitionend' + eventNamespace, function (event) { clearTimeout(module.failSafeTimer); callback.call(this, event); }) ; module.failSafeTimer = setTimeout(function () { $bars.triggerHandler('transitionend'); }, settings.duration + settings.failSafeDelay); module.verbose('Adding fail safe timer', module.timer); }, }, increment: function (incrementValue) { var startValue, newValue ; if (module.has.total()) { startValue = module.get.value(); incrementValue = incrementValue || 1; } else { startValue = module.get.percent(); incrementValue = incrementValue || module.get.randomValue(); } newValue = startValue + incrementValue; module.debug('Incrementing percentage by', startValue, newValue, incrementValue); newValue = module.get.normalizedValue(newValue); module.set.progress(newValue); }, decrement: function (decrementValue) { var total = module.get.total(), startValue, newValue ; if (total) { startValue = module.get.value(); decrementValue = decrementValue || 1; newValue = startValue - decrementValue; module.debug('Decrementing value by', decrementValue, startValue); } else { startValue = module.get.percent(); decrementValue = decrementValue || module.get.randomValue(); newValue = startValue - decrementValue; module.debug('Decrementing percentage by', decrementValue, startValue); } newValue = module.get.normalizedValue(newValue); module.set.progress(newValue); }, has: { progressPoll: function () { return module.progressPoll; }, total: function () { return module.get.total() !== false; }, }, get: { text: function (templateText, index) { if (!index) { index = 0; } var value = module.get.value(index), total = module.get.total(), percent = animating ? module.get.displayPercent(index) : module.get.percent(index), left = total !== false ? Math.max(0, total - value) : 100 - percent ; templateText = templateText || ''; templateText = templateText .replace('{value}', value) .replace('{total}', total || 0) .replace('{left}', left) .replace('{percent}', percent) .replace('{bar}', settings.text.bars[index] || '') ; module.verbose('Adding variables to progress bar text', templateText); return templateText; }, normalizedValue: function (value) { if (value < 0) { module.debug('Value cannot decrement below 0'); return 0; } if (module.has.total()) { if (value > module.total) { module.debug('Value cannot increment above total', module.total); return module.total; } } else if (value > 100) { module.debug('Value cannot increment above 100 percent'); return 100; } return value; }, updateInterval: function () { if (settings.updateInterval === 'auto') { return settings.duration; } return settings.updateInterval; }, randomValue: function () { module.debug('Generating random increment percentage'); return Math.floor((Math.random() * settings.random.max) + settings.random.min); }, numericValue: function (value) { return typeof value === 'string' ? (value.replace(/[^\d.]/g, '') !== '' ? +value.replace(/[^\d.]/g, '') : false) : value; }, // gets current displayed percentage (if animating values this is the intermediary value) displayPercent: function (index) { var $bar = $($bars[index]), barWidth = $bar.width(), totalWidth = $module.width(), minDisplay = parseInt($bar.css('min-width'), 10), displayPercent = barWidth > minDisplay ? (barWidth / totalWidth) * 100 : module.percent ; return settings.precision > 0 ? Math.round(displayPercent * (10 * settings.precision)) / (10 * settings.precision) : Math.round(displayPercent); }, percent: function (index) { return (module.percent && module.percent[index || 0]) || 0; }, value: function (index) { return module.nextValue || (module.value && module.value[index || 0]) || 0; }, total: function () { return module.total !== undefined ? module.total : false; }, }, create: { progressPoll: function () { module.progressPoll = setTimeout(function () { module.update.toNextValue(); module.remove.progressPoll(); }, module.get.updateInterval()); }, }, is: { complete: function () { return module.is.success() || module.is.warning() || module.is.error(); }, success: function () { return $module.hasClass(className.success); }, warning: function () { return $module.hasClass(className.warning); }, error: function () { return $module.hasClass(className.error); }, active: function () { return $module.hasClass(className.active); }, visible: function () { return $module.is(':visible'); }, }, remove: { progressPoll: function () { module.verbose('Removing progress poll timer'); if (module.progressPoll) { clearTimeout(module.progressPoll); delete module.progressPoll; } }, nextValue: function () { module.verbose('Removing progress value stored for next update'); delete module.nextValue; }, state: function () { module.verbose('Removing stored state'); delete module.total; delete module.percent; delete module.value; }, active: function () { module.verbose('Removing active state'); $module.removeClass(className.active); }, success: function () { module.verbose('Removing success state'); $module.removeClass(className.success); }, warning: function () { module.verbose('Removing warning state'); $module.removeClass(className.warning); }, error: function () { module.verbose('Removing error state'); $module.removeClass(className.error); }, }, set: { barWidth: function (values) { module.debug('set bar width with ', values); values = module.helper.forceArray(values); var firstNonZeroIndex = -1; var lastNonZeroIndex = -1; var valuesSum = module.helper.sum(values); var barCounts = $bars.length; var isMultiple = barCounts > 1; var percents = values.map(function (value, index) { var allZero = index === barCounts - 1 && valuesSum === 0; var $bar = $($bars[index]); if (value === 0 && isMultiple && !allZero) { $bar.css('display', 'none'); } else { if (isMultiple && allZero) { $bar.css('background', 'transparent'); } if (firstNonZeroIndex === -1) { firstNonZeroIndex = index; } lastNonZeroIndex = index; $bar.css({ display: 'block', width: value + '%', }); } return parseFloat(value); }); values.forEach(function (_, index) { var $bar = $($bars[index]); $bar.css({ borderTopLeftRadius: index === firstNonZeroIndex ? '' : '0', borderBottomLeftRadius: index === firstNonZeroIndex ? '' : '0', borderTopRightRadius: index === lastNonZeroIndex ? '' : '0', borderBottomRightRadius: index === lastNonZeroIndex ? '' : '0', }); }); $module .attr('data-percent', percents) ; }, duration: function (duration) { duration = duration || settings.duration; duration = typeof duration === 'number' ? duration + 'ms' : duration; module.verbose('Setting progress bar transition duration', duration); $bars .css({ 'transition-duration': duration, }) ; }, percent: function (percents) { percents = module.helper.forceArray(percents).map(function (percent) { percent = typeof percent === 'string' ? +percent.replace('%', '') : percent; return settings.limitValues ? Math.max(0, Math.min(100, percent)) : percent; }); var hasTotal = module.has.total(); var totalPercent = module.helper.sum(percents); var isMultipleValues = percents.length > 1 && hasTotal; var sumTotal = module.helper.sum(module.helper.forceArray(module.value)); if (isMultipleValues && sumTotal > module.total) { // Sum values instead of pecents to avoid precision issues when summing floats module.error(error.sumExceedsTotal, sumTotal, module.total); } else if (!isMultipleValues && totalPercent > 100) { // Sum before rounding since sum of rounded may have error though sum of actual is fine module.error(error.tooHigh, totalPercent); } else if (totalPercent < 0) { module.error(error.tooLow, totalPercent); } else { var autoPrecision = settings.precision > 0 ? settings.precision : (isMultipleValues ? module.helper.derivePrecision(Math.min.apply(null, module.value), module.total) : 0); // round display percentage var roundedPercents = percents.map(function (percent) { return autoPrecision > 0 ? Math.round(percent * (10 * autoPrecision)) / (10 * autoPrecision) : Math.round(percent) ; }); module.percent = roundedPercents; if (hasTotal) { module.value = percents.map(function (percent) { return autoPrecision > 0 ? Math.round((percent / 100) * module.total * (10 * autoPrecision)) / (10 * autoPrecision) : Math.round((percent / 100) * module.total * 10) / 10; }); } module.set.barWidth(percents); module.set.labelInterval(); } settings.onChange.call(element, percents, module.value, module.total); }, labelInterval: function () { var animationCallback = function () { module.verbose('Bar finished animating, removing continuous label updates'); clearInterval(module.interval); animating = false; module.set.labels(); } ; clearInterval(module.interval); module.bind.transitionEnd(animationCallback); animating = true; module.interval = setInterval(function () { var isInDOM = $.contains(document.documentElement, element) ; if (!isInDOM) { clearInterval(module.interval); animating = false; } module.set.labels(); }, settings.framerate); }, labels: function () { module.verbose('Setting both bar progress and outer label text'); module.set.barLabel(); module.set.state(); }, label: function (text) { if (text) { text = module.get.text(text); module.verbose('Setting label to text', text); $label.text(text); } }, state: function (percent) { percent = percent !== undefined ? percent : module.helper.sum(module.percent); if (percent === 100) { if (settings.autoSuccess && $bars.length === 1 && !(module.is.warning() || module.is.error() || module.is.success())) { module.set.success(); module.debug('Automatically triggering success at 100%'); } else { module.verbose('Reached 100% removing active state'); module.remove.active(); module.remove.progressPoll(); } } else if (percent > 0) { module.verbose('Adjusting active progress bar label', percent); module.set.active(); } else { module.remove.active(); module.remove.warning(); module.remove.error(); module.remove.success(); module.set.label(settings.text.active); } }, barLabel: function (text) { $progresses.each(function (index, element) { var $progress = $(element); if (text !== undefined) { $progress.text(module.get.text(text, index)); } else if (settings.label === 'ratio' && module.has.total()) { module.verbose('Adding ratio to bar label'); $progress.text(module.get.text(settings.text.ratio, index)); } else if (settings.label === 'percent') { module.verbose('Adding percentage to bar label'); $progress.text(module.get.text(settings.text.percent, index)); } }); }, active: function (text) { text = text || settings.text.active; module.debug('Setting active state'); if (settings.showActivity && !module.is.active()) { $module.addClass(className.active); } module.remove.warning(); module.remove.error(); module.remove.success(); text = settings.onLabelUpdate('active', text, module.value, module.total); if (text) { module.set.label(text); } module.bind.transitionEnd(function () { settings.onActive.call(element, module.value, module.total); }); }, success: function (text, keepState) { text = text || settings.text.success || settings.text.active; module.debug('Setting success state'); $module.addClass(className.success); module.remove.active(); module.remove.warning(); module.remove.error(); module.complete(keepState); if (settings.text.success) { text = settings.onLabelUpdate('success', text, module.value, module.total); module.set.label(text); } else { text = settings.onLabelUpdate('active', text, module.value, module.total); module.set.label(text); } module.bind.transitionEnd(function () { settings.onSuccess.call(element, module.total); }); }, warning: function (text, keepState) { text = text || settings.text.warning; module.debug('Setting warning state'); $module.addClass(className.warning); module.remove.active(); module.remove.success(); module.remove.error(); module.complete(keepState); text = settings.onLabelUpdate('warning', text, module.value, module.total); if (text) { module.set.label(text); } module.bind.transitionEnd(function () { settings.onWarning.call(element, module.value, module.total); }); }, error: function (text, keepState) { text = text || settings.text.error; module.debug('Setting error state'); $module.addClass(className.error); module.remove.active(); module.remove.success(); module.remove.warning(); module.complete(keepState); text = settings.onLabelUpdate('error', text, module.value, module.total); if (text) { module.set.label(text); } module.bind.transitionEnd(function () { settings.onError.call(element, module.value, module.total); }); }, total: function (totalValue) { module.total = totalValue; }, value: function (value) { module.value = module.helper.forceArray(value); }, progress: function (value) { if (!module.has.progressPoll()) { module.debug('First update in progress update interval, immediately updating', value); module.update.progress(value); module.create.progressPoll(); } else { module.debug('Updated within interval, setting next update to use new value', value); module.set.nextValue(value); } }, nextValue: function (value) { module.nextValue = value; }, }, update: { toNextValue: function () { var nextValue = module.nextValue ; if (nextValue) { module.debug('Update interval complete using last updated value', nextValue); module.update.progress(nextValue); module.remove.nextValue(); } }, progress: function (values) { var hasTotal = module.has.total(); if (hasTotal) { module.set.value(values); } var percentCompletes = module.helper.forceArray(values).map(function (value) { var percentComplete ; value = module.get.numericValue(value); if (value === false) { module.error(error.nonNumeric, value); } value = module.get.normalizedValue(value); if (hasTotal) { percentComplete = module.total > 0 ? (value / module.total) * 100 : 100; module.debug('Calculating percent complete from total', percentComplete); } else { percentComplete = value; module.debug('Setting value to exact percentage value', percentComplete); } return percentComplete; }); module.set.percent(percentCompletes); }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.progress.settings = { name: 'Progress', namespace: 'progress', silent: false, debug: false, verbose: false, performance: true, random: { min: 2, max: 5, }, duration: 300, updateInterval: 'auto', autoSuccess: true, showActivity: true, limitValues: true, label: 'percent', precision: 0, framerate: 1000 / 30, /// 30 fps percent: false, total: false, value: false, // delay in ms for fail safe animation callback failSafeDelay: 100, onLabelUpdate: function (state, text, value, total) { return text; }, onChange: function (percent, value, total) {}, onSuccess: function (total) {}, onActive: function (value, total) {}, onError: function (value, total) {}, onWarning: function (value, total) {}, error: { method: 'The method you called is not defined.', nonNumeric: 'Progress value is non numeric', tooHigh: 'Value specified is above 100%', tooLow: 'Value specified is below 0%', sumExceedsTotal: 'Sum of multiple values exceed total', }, regExp: { variable: /{\$*[\da-z]+}/gi, }, metadata: { percent: 'percent', total: 'total', value: 'value', }, selector: { bar: '> .bar', label: '> .label', progress: '.bar > .progress', }, text: { active: false, error: false, success: false, warning: false, percent: '{percent}%', ratio: '{value} of {total}', bars: [''], }, className: { active: 'active', error: 'error', success: 'success', warning: 'warning', }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/rail.css ================================================ /*! * # Fomantic-UI 2.9.4 - Rail * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Rails *******************************/ .ui.rail { position: absolute; top: 0; width: 300px; height: 100%; } .ui.left.rail { left: auto; right: 100%; padding: 0 2rem 0 0; margin: 0 2rem 0 0; } .ui.right.rail { left: 100%; right: auto; padding: 0 0 0 2rem; margin: 0 0 0 2rem; } /******************************* Variations *******************************/ /* -------------- Internal --------------- */ .ui.left.internal.rail { left: 0; right: auto; padding: 0 0 0 2rem; margin: 0 0 0 2rem; } .ui.right.internal.rail { left: auto; right: 0; padding: 0 2rem 0 0; margin: 0 2rem 0 0; } /* -------------- Dividing --------------- */ .ui.dividing.rail { width: 302.5px; } .ui.left.dividing.rail { padding: 0 2.5rem 0 0; margin: 0 2.5rem 0 0; border-right: 1px solid rgba(34, 36, 38, 0.15); } .ui.right.dividing.rail { border-left: 1px solid rgba(34, 36, 38, 0.15); padding: 0 0 0 2.5rem; margin: 0 0 0 2.5rem; } /* -------------- Distance --------------- */ .ui.close.rail { width: calc(300px + 1em); } .ui.close.left.rail { padding: 0 1em 0 0; margin: 0 1em 0 0; } .ui.close.right.rail { padding: 0 0 0 1em; margin: 0 0 0 1em; } .ui.very.close.rail { width: calc(300px + 0.5em); } .ui.very.close.left.rail { padding: 0 0.5em 0 0; margin: 0 0.5em 0 0; } .ui.very.close.right.rail { padding: 0 0 0 0.5em; margin: 0 0 0 0.5em; } /* -------------- Attached --------------- */ .ui.attached.left.rail, .ui.attached.right.rail { padding: 0; margin: 0; } /* -------------- Sizing --------------- */ .ui.rail { font-size: 1rem; } .ui.mini.rail { font-size: 0.78571429rem; } .ui.tiny.rail { font-size: 0.85714286rem; } .ui.small.rail { font-size: 0.92857143rem; } .ui.large.rail { font-size: 1.14285714rem; } .ui.big.rail { font-size: 1.28571429rem; } .ui.huge.rail { font-size: 1.42857143rem; } .ui.massive.rail { font-size: 1.71428571rem; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/rating.css ================================================ /*! * # Fomantic-UI 2.9.4 - Rating * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Rating *******************************/ .ui.rating { display: inline-flex; white-space: nowrap; vertical-align: baseline; } .ui.rating:last-child { margin-right: 0; } /* Icon */ .ui.rating .icon { padding: 0; margin: 0; text-align: center; font-weight: normal; font-style: normal; flex: 1 0 auto; cursor: pointer; width: 1.25em; height: auto; transition: opacity 0.1s ease, background 0.1s ease, text-shadow 0.1s ease, color 0.1s ease; line-height: 1; -webkit-backface-visibility: hidden; backface-visibility: hidden; } /******************************* Types *******************************/ /* ------------------- Standard -------------------- */ /* Inactive Icon */ .ui.rating .icon { background: transparent; color: rgba(0, 0, 0, 0.15); } /* Active Icon */ .ui.rating .active.icon { background: transparent; color: rgba(0, 0, 0, 0.85); } /* Partially Active Icon */ .ui.rating .icon.partial.active { background: linear-gradient(to right, rgba(0, 0, 0, 0.85) 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); } /* central override for colors */ .ui.ui.ui.rating .icon.partial.active { -webkit-background-clip: text; background-clip: text; color: transparent; text-shadow: none; } /* Selected Icon */ .ui.rating .icon.selected, .ui.rating .icon.selected.active, .ui.rating .icon.selected.partial.active { background: transparent; color: rgba(0, 0, 0, 0.87); background-clip: unset; } /* -------------- Colors -------------- */ .ui.primary.rating .active.icon { color: #54c8ff; text-shadow: 0 -1px 0 #2185d0, -1px 0 0 #2185d0, 0 1px 0 #2185d0, 1px 0 0 #2185d0; } .ui.primary.rating .icon.selected, .ui.primary.rating .icon.selected.active, .ui.primary.rating .icon.selected.partial.active { background: inherit; color: #21b8ff; text-shadow: 0 -1px 0 #1678c2, -1px 0 0 #1678c2, 0 1px 0 #1678c2, 1px 0 0 #1678c2; -webkit-text-stroke: unset; background-clip: unset; } .ui.primary.rating .icon.partial.active { background: linear-gradient(to right, #54c8ff 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #2185d0 0.78px; } .ui.secondary.rating .active.icon { color: #545454; text-shadow: 0 -1px 0 #1b1c1d, -1px 0 0 #1b1c1d, 0 1px 0 #1b1c1d, 1px 0 0 #1b1c1d; } .ui.secondary.rating .icon.selected, .ui.secondary.rating .icon.selected.active, .ui.secondary.rating .icon.selected.partial.active { background: inherit; color: #6e6e6e; text-shadow: 0 -1px 0 #27292a, -1px 0 0 #27292a, 0 1px 0 #27292a, 1px 0 0 #27292a; -webkit-text-stroke: unset; background-clip: unset; } .ui.secondary.rating .icon.partial.active { background: linear-gradient(to right, #545454 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #1b1c1d 0.78px; } .ui.red.rating .active.icon { color: #ff695e; text-shadow: 0 -1px 0 #db2828, -1px 0 0 #db2828, 0 1px 0 #db2828, 1px 0 0 #db2828; } .ui.red.rating .icon.selected, .ui.red.rating .icon.selected.active, .ui.red.rating .icon.selected.partial.active { background: inherit; color: #ff392b; text-shadow: 0 -1px 0 #d01919, -1px 0 0 #d01919, 0 1px 0 #d01919, 1px 0 0 #d01919; -webkit-text-stroke: unset; background-clip: unset; } .ui.red.rating .icon.partial.active { background: linear-gradient(to right, #ff695e 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #db2828 0.78px; } .ui.orange.rating .active.icon { color: #ff851b; text-shadow: 0 -1px 0 #f2711c, -1px 0 0 #f2711c, 0 1px 0 #f2711c, 1px 0 0 #f2711c; } .ui.orange.rating .icon.selected, .ui.orange.rating .icon.selected.active, .ui.orange.rating .icon.selected.partial.active { background: inherit; color: #e76b00; text-shadow: 0 -1px 0 #f26202, -1px 0 0 #f26202, 0 1px 0 #f26202, 1px 0 0 #f26202; -webkit-text-stroke: unset; background-clip: unset; } .ui.orange.rating .icon.partial.active { background: linear-gradient(to right, #ff851b 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #f2711c 0.78px; } .ui.yellow.rating .active.icon { color: #ffe21f; text-shadow: 0 -1px 0 #fbbd08, -1px 0 0 #fbbd08, 0 1px 0 #fbbd08, 1px 0 0 #fbbd08; } .ui.yellow.rating .icon.selected, .ui.yellow.rating .icon.selected.active, .ui.yellow.rating .icon.selected.partial.active { background: inherit; color: #ebcd00; text-shadow: 0 -1px 0 #eaae00, -1px 0 0 #eaae00, 0 1px 0 #eaae00, 1px 0 0 #eaae00; -webkit-text-stroke: unset; background-clip: unset; } .ui.yellow.rating .icon.partial.active { background: linear-gradient(to right, #ffe21f 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #fbbd08 0.78px; } .ui.olive.rating .active.icon { color: #d9e778; text-shadow: 0 -1px 0 #b5cc18, -1px 0 0 #b5cc18, 0 1px 0 #b5cc18, 1px 0 0 #b5cc18; } .ui.olive.rating .icon.selected, .ui.olive.rating .icon.selected.active, .ui.olive.rating .icon.selected.partial.active { background: inherit; color: #d2e745; text-shadow: 0 -1px 0 #a7bd0d, -1px 0 0 #a7bd0d, 0 1px 0 #a7bd0d, 1px 0 0 #a7bd0d; -webkit-text-stroke: unset; background-clip: unset; } .ui.olive.rating .icon.partial.active { background: linear-gradient(to right, #d9e778 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #b5cc18 0.78px; } .ui.green.rating .active.icon { color: #2ecc40; text-shadow: 0 -1px 0 #21ba45, -1px 0 0 #21ba45, 0 1px 0 #21ba45, 1px 0 0 #21ba45; } .ui.green.rating .icon.selected, .ui.green.rating .icon.selected.active, .ui.green.rating .icon.selected.partial.active { background: inherit; color: #1ea92e; text-shadow: 0 -1px 0 #16ab39, -1px 0 0 #16ab39, 0 1px 0 #16ab39, 1px 0 0 #16ab39; -webkit-text-stroke: unset; background-clip: unset; } .ui.green.rating .icon.partial.active { background: linear-gradient(to right, #2ecc40 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #21ba45 0.78px; } .ui.teal.rating .active.icon { color: #6dffff; text-shadow: 0 -1px 0 #00b5ad, -1px 0 0 #00b5ad, 0 1px 0 #00b5ad, 1px 0 0 #00b5ad; } .ui.teal.rating .icon.selected, .ui.teal.rating .icon.selected.active, .ui.teal.rating .icon.selected.partial.active { background: inherit; color: #3affff; text-shadow: 0 -1px 0 #009c95, -1px 0 0 #009c95, 0 1px 0 #009c95, 1px 0 0 #009c95; -webkit-text-stroke: unset; background-clip: unset; } .ui.teal.rating .icon.partial.active { background: linear-gradient(to right, #6dffff 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #00b5ad 0.78px; } .ui.blue.rating .active.icon { color: #54c8ff; text-shadow: 0 -1px 0 #2185d0, -1px 0 0 #2185d0, 0 1px 0 #2185d0, 1px 0 0 #2185d0; } .ui.blue.rating .icon.selected, .ui.blue.rating .icon.selected.active, .ui.blue.rating .icon.selected.partial.active { background: inherit; color: #21b8ff; text-shadow: 0 -1px 0 #1678c2, -1px 0 0 #1678c2, 0 1px 0 #1678c2, 1px 0 0 #1678c2; -webkit-text-stroke: unset; background-clip: unset; } .ui.blue.rating .icon.partial.active { background: linear-gradient(to right, #54c8ff 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #2185d0 0.78px; } .ui.violet.rating .active.icon { color: #a291fb; text-shadow: 0 -1px 0 #6435c9, -1px 0 0 #6435c9, 0 1px 0 #6435c9, 1px 0 0 #6435c9; } .ui.violet.rating .icon.selected, .ui.violet.rating .icon.selected.active, .ui.violet.rating .icon.selected.partial.active { background: inherit; color: #745aff; text-shadow: 0 -1px 0 #5829bb, -1px 0 0 #5829bb, 0 1px 0 #5829bb, 1px 0 0 #5829bb; -webkit-text-stroke: unset; background-clip: unset; } .ui.violet.rating .icon.partial.active { background: linear-gradient(to right, #a291fb 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #6435c9 0.78px; } .ui.purple.rating .active.icon { color: #dc73ff; text-shadow: 0 -1px 0 #a333c8, -1px 0 0 #a333c8, 0 1px 0 #a333c8, 1px 0 0 #a333c8; } .ui.purple.rating .icon.selected, .ui.purple.rating .icon.selected.active, .ui.purple.rating .icon.selected.partial.active { background: inherit; color: #cf40ff; text-shadow: 0 -1px 0 #9627ba, -1px 0 0 #9627ba, 0 1px 0 #9627ba, 1px 0 0 #9627ba; -webkit-text-stroke: unset; background-clip: unset; } .ui.purple.rating .icon.partial.active { background: linear-gradient(to right, #dc73ff 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #a333c8 0.78px; } .ui.pink.rating .active.icon { color: #ff8edf; text-shadow: 0 -1px 0 #e03997, -1px 0 0 #e03997, 0 1px 0 #e03997, 1px 0 0 #e03997; } .ui.pink.rating .icon.selected, .ui.pink.rating .icon.selected.active, .ui.pink.rating .icon.selected.partial.active { background: inherit; color: #ff5bd1; text-shadow: 0 -1px 0 #e61a8d, -1px 0 0 #e61a8d, 0 1px 0 #e61a8d, 1px 0 0 #e61a8d; -webkit-text-stroke: unset; background-clip: unset; } .ui.pink.rating .icon.partial.active { background: linear-gradient(to right, #ff8edf 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #e03997 0.78px; } .ui.brown.rating .active.icon { color: #d67c1c; text-shadow: 0 -1px 0 #a5673f, -1px 0 0 #a5673f, 0 1px 0 #a5673f, 1px 0 0 #a5673f; } .ui.brown.rating .icon.selected, .ui.brown.rating .icon.selected.active, .ui.brown.rating .icon.selected.partial.active { background: inherit; color: #b0620f; text-shadow: 0 -1px 0 #975b33, -1px 0 0 #975b33, 0 1px 0 #975b33, 1px 0 0 #975b33; -webkit-text-stroke: unset; background-clip: unset; } .ui.brown.rating .icon.partial.active { background: linear-gradient(to right, #d67c1c 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #a5673f 0.78px; } .ui.grey.rating .active.icon { color: #dcddde; text-shadow: 0 -1px 0 #767676, -1px 0 0 #767676, 0 1px 0 #767676, 1px 0 0 #767676; } .ui.grey.rating .icon.selected, .ui.grey.rating .icon.selected.active, .ui.grey.rating .icon.selected.partial.active { background: inherit; color: #c2c4c5; text-shadow: 0 -1px 0 #838383, -1px 0 0 #838383, 0 1px 0 #838383, 1px 0 0 #838383; -webkit-text-stroke: unset; background-clip: unset; } .ui.grey.rating .icon.partial.active { background: linear-gradient(to right, #dcddde 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #767676 0.78px; } .ui.black.rating .active.icon { color: #545454; text-shadow: 0 -1px 0 #1b1c1d, -1px 0 0 #1b1c1d, 0 1px 0 #1b1c1d, 1px 0 0 #1b1c1d; } .ui.black.rating .icon.selected, .ui.black.rating .icon.selected.active, .ui.black.rating .icon.selected.partial.active { background: inherit; color: #000000; text-shadow: 0 -1px 0 #27292a, -1px 0 0 #27292a, 0 1px 0 #27292a, 1px 0 0 #27292a; -webkit-text-stroke: unset; background-clip: unset; } .ui.black.rating .icon.partial.active { background: linear-gradient(to right, #545454 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%); -webkit-text-stroke: #1b1c1d 0.78px; } /******************************* States *******************************/ /* ------------------- Disabled -------------------- */ /* disabled rating */ .ui.disabled.rating .icon { cursor: default; pointer-events: none; } /* ------------------- User Interactive -------------------- */ /* Selected Rating */ .ui.rating.selected .active.icon { opacity: 1; } .ui.rating.selected .icon.selected, .ui.rating .icon.selected { opacity: 1; } /******************************* Variations *******************************/ .ui.rating { font-size: 1rem; } .ui.mini.rating { font-size: 0.78571429rem; } .ui.tiny.rating { font-size: 0.85714286rem; } .ui.small.rating { font-size: 0.92857143rem; } .ui.large.rating { font-size: 1.14285714rem; } .ui.big.rating { font-size: 1.28571429rem; } .ui.huge.rating { font-size: 1.42857143rem; } .ui.massive.rating { font-size: 2rem; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/rating.js ================================================ /*! * # Fomantic-UI 2.9.4 - Rating * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.rating = function (parameters) { var $allModules = $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.rating.settings, parameters) : $.extend({}, $.fn.rating.settings), namespace = settings.namespace, className = settings.className, error = settings.error, metadata = settings.metadata, selector = settings.selector, cssVars = settings.cssVars, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, element = this, instance = $(this).data(moduleNamespace), $module = $(this), $icon = $module.find(selector.icon), initialLoad, module ; module = { initialize: function () { module.verbose('Initializing rating module', settings); if ($icon.length === 0) { module.setup.layout(); } if (settings.interactive && !module.is.disabled()) { module.enable(); } else { module.disable(); } module.set.initialLoad(); module.set.rating(module.get.initialRating()); module.remove.initialLoad(); module.instantiate(); }, instantiate: function () { module.verbose('Instantiating module', settings); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.verbose('Destroying previous instance', instance); module.remove.events(); $module .removeData(moduleNamespace) ; }, refresh: function () { $icon = $module.find(selector.icon); }, setup: { layout: function () { var maxRating = module.get.maxRating(), icon = module.get.icon(), html = $.fn.rating.settings.templates.icon(maxRating, icon) ; module.debug('Generating icon html dynamically'); $module .html(html) ; module.refresh(); }, }, event: { mouseenter: function () { var $activeIcon = $(this) ; $activeIcon .nextAll() .removeClass(className.selected) ; $module .addClass(className.selected) ; $activeIcon .addClass(className.selected) .prevAll() .addClass(className.selected) ; }, mouseleave: function () { $module .removeClass(className.selected) ; $icon .removeClass(className.selected) ; }, click: function () { var $activeIcon = $(this), currentRating = module.get.rating(), rating = $icon.index($activeIcon) + 1, canClear = settings.clearable === 'auto' ? $icon.length === 1 : settings.clearable ; if (canClear && currentRating === rating) { module.clearRating(); } else { module.set.rating(rating); } }, }, clearRating: function () { module.debug('Clearing current rating'); module.set.rating(0); }, bind: { events: function () { module.verbose('Binding events'); $module .on('mouseenter' + eventNamespace, selector.icon, module.event.mouseenter) .on('mouseleave' + eventNamespace, selector.icon, module.event.mouseleave) .on('click' + eventNamespace, selector.icon, module.event.click) ; }, }, remove: { events: function () { module.verbose('Removing events'); $module .off(eventNamespace) ; }, initialLoad: function () { initialLoad = false; }, }, enable: function () { module.debug('Setting rating to interactive mode'); module.bind.events(); $module .removeClass(className.disabled) ; }, disable: function () { module.debug('Setting rating to read-only mode'); module.remove.events(); $module .addClass(className.disabled) ; }, is: { initialLoad: function () { return initialLoad; }, disabled: function () { return $module.hasClass(className.disabled); }, }, get: { icon: function () { var icon = $module.data(metadata.icon); if (icon) { $module.removeData(metadata.icon); } return icon || settings.icon; }, initialRating: function () { if ($module.data(metadata.rating) !== undefined) { $module.removeData(metadata.rating); return $module.data(metadata.rating); } return settings.initialRating; }, maxRating: function () { if ($module.data(metadata.maxRating) !== undefined) { $module.removeData(metadata.maxRating); return $module.data(metadata.maxRating); } return settings.maxRating; }, rating: function () { var currentRating = $icon.filter('.' + className.active).length ; module.verbose('Current rating retrieved', currentRating); return currentRating; }, }, set: { rating: function (rating) { var ratingIndex = Math.floor( rating - 1 >= 0 ? rating - 1 : 0 ), $activeIcon = $icon.eq(ratingIndex), $partialActiveIcon = rating <= 1 ? $activeIcon : $activeIcon.next(), filledPercentage = (rating % 1) * 100 ; $module .removeClass(className.selected) ; $icon .removeClass(className.selected) .removeClass(className.active) .removeClass(className.partiallyActive) ; if (rating > 0) { module.verbose('Setting current rating to', rating); $activeIcon .prevAll() .addBack() .addClass(className.active) ; if ($activeIcon.next() && rating % 1 !== 0) { $partialActiveIcon .addClass(className.partiallyActive) .addClass(className.active) ; $partialActiveIcon .css(cssVars.filledCustomPropName, filledPercentage + '%') ; if ($partialActiveIcon.css('backgroundColor') === 'transparent') { $partialActiveIcon .removeClass(className.partiallyActive) .removeClass(className.active) ; } } } if (!module.is.initialLoad()) { settings.onRate.call(element, rating); } }, initialLoad: function () { initialLoad = true; }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if ($allModules.length > 1) { title += ' (' + $allModules.length + ')'; } if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.rating.settings = { name: 'Rating', namespace: 'rating', icon: 'star', silent: false, debug: false, verbose: false, performance: true, initialRating: 0, interactive: true, maxRating: 4, clearable: 'auto', fireOnInit: false, onRate: function (rating) {}, error: { method: 'The method you called is not defined', }, metadata: { rating: 'rating', maxRating: 'maxRating', icon: 'icon', }, className: { active: 'active', disabled: 'disabled', selected: 'selected', loading: 'loading', partiallyActive: 'partial', }, cssVars: { filledCustomPropName: '--full', }, selector: { icon: '.icon', }, templates: { deQuote: function (string, encode) { return String(string).replace(/"/g, encode ? '"' : ''); }, icon: function (maxRating, iconClass) { var icon = 1, html = '', deQuote = $.fn.rating.settings.templates.deQuote ; while (icon <= maxRating) { html += '<i class="' + deQuote(iconClass) + ' icon"></i>'; icon++; } return html; }, }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/reset.css ================================================ /*! * # Fomantic-UI 2.9.4 - Reset * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Reset *******************************/ /* Border-Box */ *, *::before, *::after { box-sizing: inherit; } html { box-sizing: border-box; } /* iPad Input Shadows */ input[type="text"], input[type="email"], input[type="search"], input[type="password"] { -webkit-appearance: none; -moz-appearance: none; /* mobile firefox too! */ } /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ /* Document ========================================================================== */ /** * 1. Correct the line height in all browsers. * 2. Prevent adjustments of font size after orientation changes in iOS. */ html { line-height: 1.15; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ } /* Sections ========================================================================== */ /** * Remove the margin in all browsers. */ body { margin: 0; } /** * Render the `main` element consistently in IE. */ main { display: block; } /** * Correct the font size and margin on `h1` elements within `section` and * `article` contexts in Chrome, Firefox, and Safari. */ h1 { font-size: 2em; margin: 0.67em 0; } /* Grouping content ========================================================================== */ /** * 1. Add the correct box sizing in Firefox. * 2. Show the overflow in Edge and IE. */ hr { box-sizing: content-box; /* 1 */ height: 0; /* 1 */ overflow: visible; /* 2 */ } /** * 1. Correct the inheritance and scaling of font size in all browsers. * 2. Correct the odd `em` font sizing in all browsers. */ pre { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ } /* Text-level semantics ========================================================================== */ /** * Remove the gray background on active links in IE 10. */ a { background-color: transparent; } /** * 1. Remove the bottom border in Chrome 57- * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. */ abbr[title] { border-bottom: none; /* 1 */ text-decoration: underline; /* 2 */ -webkit-text-decoration: underline dotted; text-decoration: underline dotted; /* 2 */ } /** * Add the correct font weight in Chrome, Edge, and Safari. */ b, strong { font-weight: bolder; } /** * 1. Correct the inheritance and scaling of font size in all browsers. * 2. Correct the odd `em` font sizing in all browsers. */ code, kbd, samp { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ } /** * Add the correct font size in all browsers. */ small { font-size: 80%; } /** * Prevent `sub` and `sup` elements from affecting the line height in * all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sub { bottom: -0.25em; } sup { top: -0.5em; } /* Embedded content ========================================================================== */ /** * Remove the border on images inside links in IE 10. */ img { border-style: none; } /* Forms ========================================================================== */ /** * 1. Change the font styles in all browsers. * 2. Remove the margin in Firefox and Safari. */ button, input, optgroup, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 1 */ line-height: 1.15; /* 1 */ margin: 0; /* 2 */ } /** * Show the overflow in IE. * 1. Show the overflow in Edge. */ button, input { overflow: visible; /* 1 */ } /** * Remove the inheritance of text transform in Edge, Firefox, and IE. * 1. Remove the inheritance of text transform in Firefox. */ button, select { text-transform: none; /* 1 */ } /** * Correct the inability to style clickable types in iOS and Safari. */ button, [type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; } /** * Remove the inner border and padding in Firefox. */ button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { border-style: none; padding: 0; } /** * Restore the focus styles unset by the previous rule. */ button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; } /** * Correct the padding in Firefox. */ fieldset { padding: 0.35em 0.75em 0.625em; } /** * 1. Correct the text wrapping in Edge and IE. * 2. Correct the color inheritance from `fieldset` elements in IE. * 3. Remove the padding so developers are not caught out when they zero out * `fieldset` elements in all browsers. */ legend { box-sizing: border-box; /* 1 */ color: inherit; /* 2 */ display: table; /* 1 */ max-width: 100%; /* 1 */ padding: 0; /* 3 */ white-space: normal; /* 1 */ } /** * Add the correct vertical alignment in Chrome, Firefox, and Opera. */ progress { vertical-align: baseline; } /** * Remove the default vertical scrollbar in IE 10+. */ textarea { overflow: auto; } /** * 1. Add the correct box sizing in IE 10. * 2. Remove the padding in IE 10. */ [type="checkbox"], [type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } /** * Correct the cursor style of increment and decrement buttons in Chrome. */ [type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { height: auto; } /** * 1. Correct the odd appearance in Chrome and Safari. * 2. Correct the outline style in Safari. */ [type="search"] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ } /** * Remove the inner padding in Chrome and Safari on macOS. */ [type="search"]::-webkit-search-decoration { -webkit-appearance: none; } /** * 1. Correct the inability to style clickable types in iOS and Safari. * 2. Change font properties to `inherit` in Safari. */ ::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ } /* Interactive ========================================================================== */ /* * Add the correct display in Edge, IE 10+, and Firefox. */ details { display: block; } /* * Add the correct display in all browsers. */ summary { display: list-item; } /* Misc ========================================================================== */ /** * Add the correct display in IE 10+. */ template { display: none; } /** * Add the correct display in IE 10. */ [hidden] { display: none; } /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/reveal.css ================================================ /*! * # Fomantic-UI 2.9.4 - Reveal * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Reveal *******************************/ .ui.reveal { display: inherit; position: relative !important; font-size: 0; } .ui.reveal > .visible.content { position: absolute !important; top: 0 !important; left: 0 !important; z-index: 3 !important; transition: all 0.5s ease 0.1s; } .ui.reveal > .hidden.content { position: relative !important; z-index: 2 !important; } /* Make sure hovered element is on top of other reveal */ .ui.active.reveal .visible.content, .ui.reveal:hover .visible.content { z-index: 4 !important; } /******************************* Types *******************************/ /* -------------- Slide --------------- */ .ui.slide.reveal { position: relative !important; overflow: hidden !important; white-space: nowrap; } .ui.slide.reveal > .content { display: block; width: 100%; white-space: normal; float: left; margin: 0; transition: transform 0.5s ease 0.1s; } .ui.slide.reveal > .visible.content { position: relative !important; } .ui.slide.reveal > .hidden.content { position: absolute !important; left: 0 !important; width: 100% !important; transform: translateX(100%) !important; } .ui.slide.active.reveal > .visible.content, .ui.slide.reveal:hover > .visible.content { transform: translateX(-100%) !important; } .ui.slide.active.reveal > .hidden.content, .ui.slide.reveal:hover > .hidden.content { transform: translateX(0) !important; } .ui.slide.right.reveal > .visible.content { transform: translateX(0) !important; } .ui.slide.right.reveal > .hidden.content { transform: translateX(-100%) !important; } .ui.slide.right.active.reveal > .visible.content, .ui.slide.right.reveal:hover > .visible.content { transform: translateX(100%) !important; } .ui.slide.right.active.reveal > .hidden.content, .ui.slide.right.reveal:hover > .hidden.content { transform: translateX(0) !important; } .ui.slide.up.reveal > .hidden.content { transform: translateY(100%) !important; } .ui.slide.up.active.reveal > .visible.content, .ui.slide.up.reveal:hover > .visible.content { transform: translateY(-100%) !important; } .ui.slide.up.active.reveal > .hidden.content, .ui.slide.up.reveal:hover > .hidden.content { transform: translateY(0) !important; } .ui.slide.down.reveal > .hidden.content { transform: translateY(-100%) !important; } .ui.slide.down.active.reveal > .visible.content, .ui.slide.down.reveal:hover > .visible.content { transform: translateY(100%) !important; } .ui.slide.down.active.reveal > .hidden.content, .ui.slide.down.reveal:hover > .hidden.content { transform: translateY(0) !important; } /* -------------- Fade --------------- */ .ui.fade.reveal > .visible.content { opacity: 1; } .ui.fade.active.reveal > .visible.content, .ui.fade.reveal:hover > .visible.content { opacity: 0; } /* -------------- Move --------------- */ .ui.move.reveal { position: relative !important; overflow: hidden !important; white-space: nowrap; } .ui.move.reveal > .content { display: block; float: left; white-space: normal; margin: 0; transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1) 0.1s; } .ui.move.reveal > .visible.content { position: relative !important; } .ui.move.reveal > .hidden.content { position: absolute !important; left: 0 !important; width: 100% !important; } .ui.move.active.reveal > .visible.content, .ui.move.reveal:hover > .visible.content { transform: translateX(-100%) !important; } .ui.move.right.active.reveal > .visible.content, .ui.move.right.reveal:hover > .visible.content { transform: translateX(100%) !important; } .ui.move.up.active.reveal > .visible.content, .ui.move.up.reveal:hover > .visible.content { transform: translateY(-100%) !important; } .ui.move.down.active.reveal > .visible.content, .ui.move.down.reveal:hover > .visible.content { transform: translateY(100%) !important; } /* -------------- Rotate --------------- */ .ui.rotate.reveal > .visible.content { transition-duration: 0.5s; transform: rotate(0); } .ui.rotate.reveal > .visible.content, .ui.rotate.right.reveal > .visible.content { transform-origin: bottom right; } .ui.rotate.active.reveal > .visible.content, .ui.rotate.reveal:hover > .visible.content, .ui.rotate.right.active.reveal > .visible.content, .ui.rotate.right.reveal:hover > .visible.content { transform: rotate(110deg); } .ui.rotate.left.reveal > .visible.content { transform-origin: bottom left; } .ui.rotate.left.active.reveal > .visible.content, .ui.rotate.left.reveal:hover > .visible.content { transform: rotate(-110deg); } /******************************* States *******************************/ .ui.disabled.reveal:hover > .visible.visible.content { position: static !important; display: block !important; opacity: 1 !important; top: 0 !important; left: 0 !important; right: auto !important; bottom: auto !important; transform: none !important; } .ui.disabled.reveal:hover > .hidden.hidden.content { display: none !important; } /******************************* Coupling *******************************/ .ui.reveal > .ui.ribbon.label { z-index: 5; } /******************************* Variations *******************************/ /* -------------- Visible --------------- */ .ui.visible.reveal { overflow: visible; } /* -------------- Instant --------------- */ .ui.instant.reveal > .content { transition-delay: 0s !important; } /* -------------- Sizing --------------- */ .ui.reveal > .content { font-size: 1rem; } .ui.mini.reveal > .content { font-size: 0.78571429rem; } .ui.tiny.reveal > .content { font-size: 0.85714286rem; } .ui.small.reveal > .content { font-size: 0.92857143rem; } .ui.large.reveal > .content { font-size: 1.14285714rem; } .ui.big.reveal > .content { font-size: 1.28571429rem; } .ui.huge.reveal > .content { font-size: 1.42857143rem; } .ui.massive.reveal > .content { font-size: 1.71428571rem; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/search.css ================================================ /*! * # Fomantic-UI 2.9.4 - Search * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Search *******************************/ .ui.search { position: relative; } .ui.search > .prompt { margin: 0; outline: none; -webkit-appearance: none; -webkit-tap-highlight-color: rgba(255, 255, 255, 0); text-shadow: none; font-style: normal; font-weight: normal; line-height: 1.21428571em; padding: 0.67857143em 1em; font-size: 1em; background: #fff; border: 1px solid rgba(34, 36, 38, 0.15); color: rgba(0, 0, 0, 0.87); box-shadow: 0 0 0 0 transparent inset; transition: background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, border-color 0.1s ease; } .ui.search .prompt { border-radius: 500rem; } /* -------------- Icon --------------- */ .ui.search .prompt ~ .search.icon { cursor: pointer; } /* -------------- Results --------------- */ .ui.search > .results { display: none; position: absolute; top: 100%; left: 0; transform-origin: center top; white-space: normal; text-align: left; text-transform: none; background: #fff; margin-top: 0.5em; width: 18em; border-radius: 0.28571429rem; box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); border: 1px solid #d4d4d5; z-index: 998; } .ui.search > .results > :first-child { border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.search > .results > :last-child { border-radius: 0 0 0.28571429rem 0.28571429rem; } /* -------------- Result --------------- */ .ui.search > .results .result { cursor: pointer; display: block; overflow: hidden; font-size: 1em; padding: 0.85714286em 1.14285714em; color: rgba(0, 0, 0, 0.87); line-height: 1.33; border-bottom: 1px solid rgba(34, 36, 38, 0.1); } .ui.search > .results .result:last-child { border-bottom: none !important; } /* Image */ .ui.search > .results .result .image { float: right; overflow: hidden; background: none; width: 5em; height: 3em; border-radius: 0.25em; } .ui.search > .results .result .image img { display: block; width: auto; height: 100%; } /* -------------- Info --------------- */ .ui.search > .results .result .image + .content { margin: 0 6em 0 0; } .ui.search > .results .result .title { margin: -0.14285714em 0 0; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-weight: bold; font-size: 1em; color: rgba(0, 0, 0, 0.85); } .ui.search > .results .result .description { margin-top: 0; font-size: 0.92857143em; color: rgba(0, 0, 0, 0.4); } .ui.search > .results .result .price { float: right; color: #21ba45; } /* -------------- Message --------------- */ .ui.search > .results > .message { padding: 1em 1em; } .ui.search > .results > .message .header { font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 1rem; font-weight: bold; color: rgba(0, 0, 0, 0.87); } .ui.search > .results > .message .description { margin-top: 0.25rem; font-size: 1em; color: rgba(0, 0, 0, 0.87); } /* View All Results */ .ui.search > .results > .action { display: block; border-top: none; background: #f3f4f5; padding: 0.92857143em 1em; color: rgba(0, 0, 0, 0.87); font-weight: bold; text-align: center; } /******************************* States *******************************/ /* -------------------- Focus --------------------- */ .ui.search > .prompt:focus { border-color: rgba(34, 36, 38, 0.35); background: #fff; color: rgba(0, 0, 0, 0.95); } /* -------------------- Loading --------------------- */ .ui.loading.search .input > i.icon::before { position: absolute; content: ""; top: 50%; left: 50%; margin: -0.64285714em 0 0 -0.64285714em; width: 1.28571429em; height: 1.28571429em; border-radius: 500rem; border: 0.2em solid rgba(0, 0, 0, 0.1); } .ui.loading.search .input > i.icon::after { position: absolute; content: ""; top: 50%; left: 50%; margin: -0.64285714em 0 0 -0.64285714em; width: 1.28571429em; height: 1.28571429em; animation: loader 0.6s infinite linear; border: 0.2em solid #767676; border-radius: 500rem; box-shadow: 0 0 0 1px transparent; } /* -------------- Hover --------------- */ .ui.search > .results .result:hover, .ui.category.search > .results .category .result:hover { background: #f9fafb; } .ui.search .action:hover:not(div) { background: #e0e0e0; } /* -------------- Active --------------- */ .ui.category.search > .results .category.active { background: #f3f4f5; } .ui.category.search > .results .category.active > .name { color: rgba(0, 0, 0, 0.87); } .ui.search > .results .result.active, .ui.category.search > .results .category .result.active { position: relative; border-left-color: rgba(34, 36, 38, 0.1); background: #f3f4f5; box-shadow: none; } .ui.search > .results .result.active .title { color: rgba(0, 0, 0, 0.85); } .ui.search > .results .result.active .description { color: rgba(0, 0, 0, 0.85); } /* -------------------- Disabled ---------------------- */ /* Disabled */ .ui.disabled.search { cursor: default; pointer-events: none; opacity: 0.45; } /******************************* Types *******************************/ /* -------------- Clear Icon --------------- */ .ui.search > .icon.input > .remove.icon { pointer-events: all; transition: opacity 0.1s ease; cursor: pointer; opacity: 0.6; } .ui.search > .icon.input > .remove.icon:hover { opacity: 1; } .ui.search > .icon.input:not([class*="left icon"]) > .icon ~ .remove.icon { right: 1.85714em; } .ui.search input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; cursor: pointer; -webkit-transition: opacity 0.1s ease; transition: opacity 0.1s ease; opacity: 0.6; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 352 512'%3E%3Cpath d='M242.7 256l100.1-100.1c12.3-12.3 12.3-32.2 0-44.5l-22.2-22.2c-12.3-12.3-32.2-12.3-44.5 0L176 189.3 75.9 89.2c-12.3-12.3-32.2-12.3-44.5 0L9.2 111.5c-12.3 12.3-12.3 32.2 0 44.5L109.3 256 9.2 356.1c-12.3 12.3-12.3 32.2 0 44.5l22.2 22.2c12.3 12.3 32.2 12.3 44.5 0L176 322.7l100.1 100.1c12.3 12.3 32.2 12.3 44.5 0l22.2-22.2c12.3-12.3 12.3-32.2 0-44.5L242.7 256z'/%3E%3C/svg%3E") no-repeat; height: 1em; width: 1em; } .ui.search input[type="search"]::-webkit-search-cancel-button:hover { opacity: 1; } .ui.loading.search input[type="search"]::-webkit-search-cancel-button { display: none; } .ui.search > .icon.input > input:-ms-input-placeholder ~ .remove.icon { display: none; } .ui.search > .icon.input > input:placeholder-shown ~ .remove.icon, .ui.search.loading > .icon.input > .remove.icon { display: none; } .ui.search > .icon.input > input:-ms-input-placeholder ~ .remove.icon { display: none; } /* -------------- Category --------------- */ .ui.category.search .results { width: 28em; } .ui.category.search .results.animating, .ui.category.search .results.visible { display: table; } /* Category */ .ui.category.search > .results .category { display: table-row; background: #f3f4f5; box-shadow: none; transition: background 0.1s ease, border-color 0.1s ease; } /* Last Category */ .ui.category.search > .results .category:last-child { border-bottom: none; } /* First / Last */ .ui.category.search > .results .category:first-child .name + .result { border-radius: 0 0.28571429rem 0 0; } .ui.category.search > .results .category:last-child .result:last-child { border-radius: 0 0 0.28571429rem 0; } /* Category Result Name */ .ui.category.search > .results .category > .name { display: table-cell; text-overflow: ellipsis; width: 100px; white-space: nowrap; background: transparent; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 1em; padding: 0.4em 1em; font-weight: bold; color: rgba(0, 0, 0, 0.4); border-bottom: 1px solid rgba(34, 36, 38, 0.1); } /* Category Result */ .ui.category.search > .results .category .results { display: table-cell; background: #fff; border-left: 1px solid rgba(34, 36, 38, 0.15); border-bottom: 1px solid rgba(34, 36, 38, 0.1); } .ui.category.search > .results .category .result { border-bottom: 1px solid rgba(34, 36, 38, 0.1); transition: background 0.1s ease, border-color 0.1s ease; padding: 0.85714286em 1.14285714em; } .ui.horizontal.category.search > .results .category, .ui.horizontal.category.search > .results .category > .name, .ui.horizontal.category.search > .results .category > .results { display: block; } .ui.horizontal.category.search > .results .category > .results { width: 100%; border-left: 0; } /******************************* Variations *******************************/ /* ------------------- Scrolling -------------------- */ .ui.scrolling.search > .results, .ui.search.long > .results, .ui.search.short > .results { overflow-x: hidden; overflow-y: auto; -ms-scroll-chaining: none; overscroll-behavior: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; } @media only screen and (max-width: 767.98px) { .ui.scrolling.search > .results { max-height: 12.17714286em; } .resizable.ui.scrolling.search > .results { height: 12.17714286em; } } @media only screen and (min-width: 768px) { .ui.scrolling.search > .results { max-height: 18.26571429em; } .resizable.ui.scrolling.search > .results { height: 18.26571429em; } } @media only screen and (min-width: 992px) { .ui.scrolling.search > .results { max-height: 24.35428571em; } .resizable.ui.scrolling.search > .results { height: 24.35428571em; } } @media only screen and (min-width: 1920px) { .ui.scrolling.search > .results { max-height: 36.53142857em; } .resizable.ui.scrolling.search > .results { height: 36.53142857em; } } .ui.scrolling.resizable.search > .results { resize: vertical; max-height: none; } @media only screen and (max-width: 767.98px) { .ui.search.short > .results { max-height: 12.17714286em; } .ui.search[class*="very short"] > .results { max-height: 9.13285714em; } .ui.search.long > .results { max-height: 24.35428571em; } .ui.search[class*="very long"] > .results { max-height: 36.53142857em; } } @media only screen and (min-width: 768px) { .ui.search.short > .results { max-height: 18.26571429em; } .ui.search[class*="very short"] > .results { max-height: 13.69928571em; } .ui.search.long > .results { max-height: 36.53142857em; } .ui.search[class*="very long"] > .results { max-height: 54.79714286em; } } @media only screen and (min-width: 992px) { .ui.search.short > .results { max-height: 24.35428571em; } .ui.search[class*="very short"] > .results { max-height: 18.26571429em; } .ui.search.long > .results { max-height: 48.70857143em; } .ui.search[class*="very long"] > .results { max-height: 73.06285714em; } } @media only screen and (min-width: 1920px) { .ui.search.short > .results { max-height: 36.53142857em; } .ui.search[class*="very short"] > .results { max-height: 27.39857143em; } .ui.search.long > .results { max-height: 73.06285714em; } .ui.search[class*="very long"] > .results { max-height: 109.59428571em; } } /* ------------------- Left / Right -------------------- */ .ui[class*="left aligned"].search > .results { right: auto; left: 0; } .ui[class*="right aligned"].search > .results { right: 0; left: auto; } /* -------------- Fluid --------------- */ .ui.fluid.search .results { width: 100%; } /* -------------- Sizes --------------- */ .ui.search { font-size: 1em; } .ui.mini.search { font-size: 0.78571429em; } .ui.tiny.search { font-size: 0.85714286em; } .ui.small.search { font-size: 0.92857143em; } .ui.large.search { font-size: 1.14285714em; } .ui.big.search { font-size: 1.28571429em; } .ui.huge.search { font-size: 1.42857143em; } .ui.massive.search { font-size: 1.71428571em; } /* -------------- Mobile --------------- */ @media only screen and (max-width: 767.98px) { .ui.search .results { max-width: calc(100vw - 2rem); } } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/search.js ================================================ /*! * # Fomantic-UI 2.9.4 - Search * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.search = function (parameters) { var $allModules = $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.search.settings, parameters) : $.extend({}, $.fn.search.settings), className = settings.className, metadata = settings.metadata, regExp = settings.regExp, fields = settings.fields, selector = settings.selector, error = settings.error, namespace = settings.namespace, eventNamespace = '.' + namespace, moduleNamespace = namespace + '-module', $module = $(this), $prompt = $module.find(selector.prompt), $searchButton = $module.find(selector.searchButton), $results = $module.find(selector.results), $result = $module.find(selector.result), $category = $module.find(selector.category), element = this, instance = $module.data(moduleNamespace), disabledBubbled = false, resultsDismissed = false, module ; module = { initialize: function () { module.verbose('Initializing module'); module.get.settings(); module.determine.searchFields(); module.bind.events(); module.set.type(); module.create.results(); module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.verbose('Destroying instance'); $module .off(eventNamespace) .removeData(moduleNamespace) ; }, refresh: function () { module.debug('Refreshing selector cache'); $prompt = $module.find(selector.prompt); $searchButton = $module.find(selector.searchButton); $category = $module.find(selector.category); $results = $module.find(selector.results); $result = $module.find(selector.result); }, refreshResults: function () { $results = $module.find(selector.results); $result = $module.find(selector.result); }, bind: { events: function () { module.verbose('Binding events to search'); if (settings.automatic) { $module .on(module.get.inputEvent() + eventNamespace, selector.prompt, module.event.input) ; $prompt .attr('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off') ; } $module // prompt .on('focus' + eventNamespace, selector.prompt, module.event.focus) .on('blur' + eventNamespace, selector.prompt, module.event.blur) .on('keydown' + eventNamespace, selector.prompt, module.handleKeyboard) // search button .on('click' + eventNamespace, selector.searchButton, module.query) // results .on('mousedown' + eventNamespace, selector.results, module.event.result.mousedown) .on('mouseup' + eventNamespace, selector.results, module.event.result.mouseup) .on('click' + eventNamespace, selector.result, module.event.result.click) .on('click' + eventNamespace, selector.remove, module.event.remove.click) ; }, }, determine: { searchFields: function () { // this makes sure $.extend does not add specified search fields to default fields // this is the only setting which should not extend defaults if (parameters && parameters.searchFields !== undefined) { settings.searchFields = Array.isArray(parameters.searchFields) ? parameters.searchFields : [parameters.searchFields] ; } }, }, event: { input: function () { if (settings.searchDelay) { clearTimeout(module.timer); module.timer = setTimeout(function () { if (module.is.focused()) { module.query(); } }, settings.searchDelay); } else { module.query(); } }, focus: function () { module.set.focus(); if (settings.searchOnFocus && module.has.minimumCharacters()) { module.query(function () { if (module.can.show()) { module.showResults(); } }); } }, blur: function (event) { var pageLostFocus = document.activeElement === this, callback = function () { module.cancel.query(); module.remove.focus(); module.timer = setTimeout(function () { module.hideResults(); }, settings.hideDelay); } ; if (pageLostFocus) { return; } resultsDismissed = false; if (module.resultsClicked) { module.debug('Determining if user action caused search to close'); $module .one('click.close' + eventNamespace, selector.results, function (event) { if (module.is.inMessage(event) || disabledBubbled) { $prompt.trigger('focus'); return; } disabledBubbled = false; if (!module.is.animating() && !module.is.hidden()) { callback(); } }) ; } else { module.debug('Input blurred without user action, closing results'); callback(); } }, remove: { click: function () { module.clear.value(); $prompt.trigger('focus'); }, }, result: { mousedown: function () { module.resultsClicked = true; }, mouseup: function () { module.resultsClicked = false; }, click: function (event) { module.debug('Search result selected'); var $result = $(this), $title = $result.find(selector.title).eq(0), $link = $result.is('a[href]') ? $result : $result.find('a[href]').eq(0), href = $link.attr('href') || false, target = $link.attr('target') || false, // title is used for result lookup value = $title.length > 0 ? $title.text() : false, results = module.get.results(), result = $result.data(metadata.result) || module.get.result(value, results) ; var oldValue = module.get.value(); if (isFunction(settings.onSelect)) { if (settings.onSelect.call(element, result, results) === false) { module.debug('Custom onSelect callback cancelled default select action'); disabledBubbled = true; return; } } module.hideResults(); if (value && module.get.value() === oldValue) { module.set.value(value); } if (href) { event.preventDefault(); module.verbose('Opening search link found in result', $link); if (target === '_blank' || event.ctrlKey) { window.open(href); } else { window.location.href = href; } } }, }, }, ensureVisible: function ($el) { var elTop, elBottom, resultsScrollTop, resultsHeight ; if ($el.length === 0) { return; } elTop = $el.position().top; elBottom = elTop + $el.outerHeight(true); resultsScrollTop = $results.scrollTop(); resultsHeight = $results.height(); if (elTop < 0) { $results.scrollTop(resultsScrollTop + elTop); } else if (resultsHeight < elBottom) { $results.scrollTop(resultsScrollTop + (elBottom - resultsHeight)); } }, handleKeyboard: function (event) { var // force selector refresh $result = $module.find(selector.result), $category = $module.find(selector.category), $activeResult = $result.filter('.' + className.active), currentIndex = $result.index($activeResult), resultSize = $result.length, hasActiveResult = $activeResult.length > 0, keyCode = event.which, keys = { backspace: 8, enter: 13, escape: 27, upArrow: 38, downArrow: 40, }, newIndex ; // search shortcuts if (keyCode === keys.escape) { if (!module.is.visible()) { module.verbose('Escape key pressed, blurring search field'); $prompt.trigger('blur'); } else { module.hideResults(); } event.stopPropagation(); resultsDismissed = true; } if (module.is.visible()) { if (keyCode === keys.enter) { module.verbose('Enter key pressed, selecting active result'); if ($result.filter('.' + className.active).length > 0) { module.event.result.click.call($result.filter('.' + className.active), event); event.preventDefault(); return false; } } else if (keyCode === keys.upArrow && hasActiveResult) { module.verbose('Up key pressed, changing active result'); newIndex = currentIndex - 1 < 0 ? currentIndex : currentIndex - 1; $category .removeClass(className.active) ; $result .removeClass(className.active) .eq(newIndex) .addClass(className.active) .closest($category) .addClass(className.active) ; module.ensureVisible($result.eq(newIndex)); event.preventDefault(); } else if (keyCode === keys.downArrow) { module.verbose('Down key pressed, changing active result'); newIndex = currentIndex + 1 >= resultSize ? currentIndex : currentIndex + 1; $category .removeClass(className.active) ; $result .removeClass(className.active) .eq(newIndex) .addClass(className.active) .closest($category) .addClass(className.active) ; module.ensureVisible($result.eq(newIndex)); event.preventDefault(); } } else { // query shortcuts if (keyCode === keys.enter) { module.verbose('Enter key pressed, executing query'); module.query(); module.set.buttonPressed(); $prompt.one('keyup', module.remove.buttonFocus); } } }, setup: { api: function (searchTerm, callback) { var apiSettings = { debug: settings.debug, on: false, cache: settings.cache, action: 'search', urlData: { query: searchTerm, }, }, apiCallbacks = { onSuccess: function (response, $module, xhr) { module.parse.response.call(element, response, searchTerm); callback(); if (settings.apiSettings && typeof settings.apiSettings.onSuccess === 'function') { settings.apiSettings.onSuccess.call(this, response, $module, xhr); } }, onFailure: function (response, $module, xhr) { module.displayMessage(error.serverError); callback(); if (settings.apiSettings && typeof settings.apiSettings.onFailure === 'function') { settings.apiSettings.onFailure.call(this, response, $module, xhr); } }, onAbort: function (status, $module, xhr) { if (settings.apiSettings && typeof settings.apiSettings.onAbort === 'function') { settings.apiSettings.onAbort.call(this, status, $module, xhr); } }, onError: function (errorMessage, $module, xhr) { module.error(); if (settings.apiSettings && typeof settings.apiSettings.onError === 'function') { settings.apiSettings.onError.call(this, errorMessage, $module, xhr); } }, } ; $.extend(true, apiSettings, settings.apiSettings, apiCallbacks); module.verbose('Setting up API request', apiSettings); $module.api(apiSettings); }, }, can: { useAPI: function () { return $.fn.api !== undefined; }, show: function () { return module.is.focused() && !module.is.visible() && !module.is.empty(); }, transition: function () { return settings.transition && $.fn.transition !== undefined; }, }, is: { animating: function () { return $results.hasClass(className.animating); }, chrome: function () { return !!window.chrome && !window.StyleMedia; }, hidden: function () { return $results.hasClass(className.hidden); }, inMessage: function (event) { if (!event.target) { return; } var $target = $(event.target), isInDOM = $.contains(document.documentElement, event.target) ; return isInDOM && $target.closest(selector.message).length > 0; }, empty: function () { return $results.html() === ''; }, visible: function () { return $results.filter(':visible').length > 0; }, focused: function () { return $prompt.filter(':focus').length > 0; }, }, get: { settings: function () { if ($.isPlainObject(parameters) && parameters.searchFullText) { settings.fullTextSearch = parameters.searchFullText; module.error(settings.error.oldSearchSyntax, element); } if (settings.ignoreDiacritics && !String.prototype.normalize) { settings.ignoreDiacritics = false; module.error(error.noNormalize, element); } }, inputEvent: function () { var prompt = $prompt[0], inputEvent = prompt !== undefined && prompt.oninput !== undefined ? 'input' : (prompt !== undefined && prompt.onpropertychange !== undefined ? 'propertychange' : 'keyup') ; return inputEvent; }, value: function () { return $prompt.val(); }, results: function () { return $module.data(metadata.results); }, result: function (value, results) { var result = false ; value = value !== undefined ? value : module.get.value(); results = results !== undefined ? results : module.get.results(); if (settings.type === 'category') { module.debug('Finding result that matches', value); $.each(results, function (index, category) { if (Array.isArray(category.results)) { result = module.search.object(value, category.results)[0]; // don't continue searching if a result is found if (result) { return false; } } }); } else { module.debug('Finding result in results object', value); result = module.search.object(value, results)[0]; } return result || false; }, }, select: { firstResult: function () { module.verbose('Selecting first result'); $result.first().addClass(className.active); }, }, set: { focus: function () { $module.addClass(className.focus); }, loading: function () { $module.addClass(className.loading); }, value: function (value) { module.verbose('Setting search input value', value); $prompt .val(value) ; }, type: function (type) { type = type || settings.type; if (className[type]) { $module.addClass(className[type]); } }, buttonPressed: function () { $searchButton.addClass(className.pressed); }, }, remove: { loading: function () { $module.removeClass(className.loading); }, focus: function () { $module.removeClass(className.focus); }, buttonPressed: function () { $searchButton.removeClass(className.pressed); }, diacritics: function (text) { return settings.ignoreDiacritics ? text.normalize('NFD').replace(/[\u0300-\u036F]/g, '') : text; }, }, query: function (callback) { callback = isFunction(callback) ? callback : function () {}; var searchTerm = module.get.value(), cache = module.read.cache(searchTerm) ; callback = callback || function () {}; if (module.has.minimumCharacters()) { if (cache) { module.debug('Reading result from cache', searchTerm); module.save.results(cache.results); settings.onResults.call(element, cache.results, true); module.addResults(cache.html); module.inject.id(cache.results); callback(); } else { module.debug('Querying for', searchTerm); if ($.isPlainObject(settings.source) || Array.isArray(settings.source)) { module.search.local(searchTerm); callback(); } else if (module.can.useAPI()) { module.search.remote(searchTerm, callback); } else { module.error(error.source); callback(); } } settings.onSearchQuery.call(element, searchTerm); } else { module.hideResults(); } }, search: { local: function (searchTerm) { var results = module.search.object(searchTerm, settings.source), searchHTML ; module.set.loading(); module.save.results(results); module.debug('Returned full local search results', results); if (settings.maxResults > 0) { module.debug('Using specified max results', results); results = results.slice(0, settings.maxResults); } if (settings.type === 'category') { results = module.create.categoryResults(results); } searchHTML = module.generateResults({ results: results, }); module.remove.loading(); module.addResults(searchHTML); module.inject.id(results); module.write.cache(searchTerm, { html: searchHTML, results: results, }); }, remote: function (searchTerm, callback) { callback = isFunction(callback) ? callback : function () {}; if ($module.api('is loading')) { $module.api('abort'); } module.setup.api(searchTerm, callback); $module .api('query') ; }, object: function (searchTerm, source, searchFields) { searchTerm = module.remove.diacritics(String(searchTerm)); var results = [], exactResults = [], fuzzyResults = [], searchExp = searchTerm.replace(regExp.escape, '\\$&'), matchRegExp = new RegExp(regExp.beginsWith + searchExp, settings.ignoreSearchCase ? 'i' : ''), // avoid duplicates when pushing results addResult = function (array, result) { var notResult = $.inArray(result, results) === -1, notFuzzyResult = $.inArray(result, fuzzyResults) === -1, notExactResults = $.inArray(result, exactResults) === -1 ; if (notResult && notFuzzyResult && notExactResults) { array.push(result); } } ; source = source || settings.source; searchFields = searchFields !== undefined ? searchFields : settings.searchFields; // search fields should be array to loop correctly if (!Array.isArray(searchFields)) { searchFields = [searchFields]; } // exit conditions if no source if (source === undefined || source === false) { module.error(error.source); return []; } // iterate through search fields looking for matches var lastSearchFieldIndex = searchFields.length - 1; $.each(source, function (label, content) { var concatenatedContent = []; $.each(searchFields, function (index, field) { var fieldExists = typeof content[field] === 'string' || typeof content[field] === 'number' ; if (fieldExists) { var text; text = typeof content[field] === 'string' ? module.remove.diacritics(content[field]) : content[field].toString(); text = $('<div/>', { html: text }).text().trim(); if (settings.fullTextSearch === 'all') { concatenatedContent.push(text); if (index < lastSearchFieldIndex) { return true; } text = concatenatedContent.join(' '); } if (settings.fullTextSearch !== 'all' && text.search(matchRegExp) !== -1) { // content starts with value (first in results) addResult(results, content); } else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) { addResult(exactResults, content); } else if (settings.fullTextSearch === 'some' && module.wordSearch(searchTerm, text)) { addResult(exactResults, content); } else if (settings.fullTextSearch === 'all' && module.wordSearch(searchTerm, text, true)) { addResult(exactResults, content); } else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) { // content fuzzy matches (last in results) addResult(fuzzyResults, content); } } }); }); $.merge(exactResults, fuzzyResults); $.merge(results, exactResults); return results; }, }, exactSearch: function (query, term) { if (settings.ignoreSearchCase) { query = query.toLowerCase(); term = term.toLowerCase(); } return term.indexOf(query) > -1; }, wordSearch: function (query, term, matchAll) { var allWords = query.split(/\s+/), w, wL = allWords.length, found = false ; for (w = 0; w < wL; w++) { found = module.exactSearch(allWords[w], term); if ((!found && matchAll) || (found && !matchAll)) { break; } } return found; }, fuzzySearch: function (query, term) { var termLength = term.length, queryLength = query.length ; if (typeof query !== 'string') { return false; } if (settings.ignoreSearchCase) { query = query.toLowerCase(); term = term.toLowerCase(); } if (queryLength > termLength) { return false; } if (queryLength === termLength) { return query === term; } for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) { var continueSearch = false, queryCharacter = query.charCodeAt(characterIndex) ; while (nextCharacterIndex < termLength) { if (term.charCodeAt(nextCharacterIndex++) === queryCharacter) { continueSearch = true; break; } } if (!continueSearch) { return false; } } return true; }, parse: { response: function (response, searchTerm) { if (Array.isArray(response)) { var o = {}; o[fields.results] = response; response = o; } var searchHTML = module.generateResults(response) ; module.verbose('Parsing server response', response); if (response !== undefined) { if (searchTerm !== undefined && response[fields.results] !== undefined) { module.addResults(searchHTML); module.inject.id(response[fields.results]); module.write.cache(searchTerm, { html: searchHTML, results: response[fields.results], }); module.save.results(response[fields.results]); } } }, }, cancel: { query: function () { if (module.can.useAPI()) { $module.api('abort'); } }, }, has: { minimumCharacters: function () { var searchTerm = module.get.value(), numCharacters = searchTerm.length ; return numCharacters >= settings.minCharacters; }, results: function () { if ($results.length === 0) { return false; } var html = $results.html() ; return html !== ''; }, }, clear: { cache: function (value) { var cache = $module.data(metadata.cache) ; if (!value) { module.debug('Clearing cache', value); $module.removeData(metadata.cache); } else if (value && cache && cache[value]) { module.debug('Removing value from cache', value); delete cache[value]; $module.data(metadata.cache, cache); } }, value: function () { module.set.value(''); }, }, read: { cache: function (name) { var cache = $module.data(metadata.cache) ; if (settings.cache) { module.verbose('Checking cache for generated html for query', name); return (typeof cache === 'object') && (cache[name] !== undefined) ? cache[name] : false; } return false; }, }, create: { categoryResults: function (results) { var categoryResults = {} ; $.each(results, function (index, result) { if (!result.category) { return; } if (categoryResults[result.category] === undefined) { module.verbose('Creating new category of results', result.category); categoryResults[result.category] = { name: result.category, results: [result], }; } else { categoryResults[result.category].results.push(result); } }); return categoryResults; }, id: function (resultIndex, categoryIndex) { var resultID = resultIndex + 1, // not zero indexed letterID, id ; if (categoryIndex !== undefined) { // start char code for "A" letterID = String.fromCharCode(97 + categoryIndex); id = letterID + resultID; module.verbose('Creating category result id', id); } else { id = resultID; module.verbose('Creating result id', id); } return id; }, results: function () { if ($results.length === 0) { $results = $('<div />') .addClass(className.results) .appendTo($module) ; } }, }, inject: { result: function (result, resultIndex, categoryIndex) { module.verbose('Injecting result into results'); var $selectedResult = categoryIndex !== undefined ? $results .children().eq(categoryIndex) .children(selector.results) .first() .children(selector.result) .eq(resultIndex) : $results .children(selector.result).eq(resultIndex) ; module.verbose('Injecting results metadata', $selectedResult); $selectedResult .data(metadata.result, result) ; }, id: function (results) { module.debug('Injecting unique ids into results'); var // since results may be object, we must use counters categoryIndex = 0, resultIndex = 0 ; if (settings.type === 'category') { // iterate through each category result $.each(results, function (index, category) { if (category.results.length > 0) { resultIndex = 0; $.each(category.results, function (index, result) { if (result.id === undefined) { result.id = module.create.id(resultIndex, categoryIndex); } module.inject.result(result, resultIndex, categoryIndex); resultIndex++; }); categoryIndex++; } }); } else { // top level $.each(results, function (index, result) { if (result.id === undefined) { result.id = module.create.id(resultIndex); } module.inject.result(result, resultIndex); resultIndex++; }); } return results; }, }, save: { results: function (results) { module.verbose('Saving current search results to metadata', results); $module.data(metadata.results, results); }, }, write: { cache: function (name, value) { var cache = $module.data(metadata.cache) !== undefined ? $module.data(metadata.cache) : {} ; if (settings.cache) { module.verbose('Writing generated html to cache', name, value); cache[name] = value; $module .data(metadata.cache, cache) ; } }, }, addResults: function (html) { if (isFunction(settings.onResultsAdd)) { if (settings.onResultsAdd.call($results, html) === false) { module.debug('onResultsAdd callback cancelled default action'); return false; } } if (html) { $results .html(html) ; module.refreshResults(); if (settings.selectFirstResult) { module.select.firstResult(); } module.showResults(); } else { module.hideResults(function () { $results.empty(); }); } }, showResults: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (resultsDismissed) { return; } if (!module.is.visible() && module.has.results()) { if (module.can.transition()) { module.debug('Showing results with css animations'); $results .transition({ animation: settings.transition + ' in', debug: settings.debug, verbose: settings.verbose, silent: settings.silent, duration: settings.duration, onShow: function () { var $firstResult = $module.find(selector.result).eq(0); module.ensureVisible($firstResult); }, onComplete: function () { callback(); }, queue: true, }) ; } else { module.debug('Showing results with javascript'); $results .stop() .fadeIn(settings.duration, settings.easing) ; } settings.onResultsOpen.call($results); } }, hideResults: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (module.is.visible()) { if (module.can.transition()) { module.debug('Hiding results with css animations'); $results .transition({ animation: settings.transition + ' out', debug: settings.debug, verbose: settings.verbose, silent: settings.silent, duration: settings.duration, onComplete: function () { callback(); }, queue: true, }) ; } else { module.debug('Hiding results with javascript'); $results .stop() .fadeOut(settings.duration, settings.easing) ; } settings.onResultsClose.call($results); } }, generateResults: function (response) { module.debug('Generating html from response', response); var template = settings.templates[settings.type], isProperObject = $.isPlainObject(response[fields.results]) && !$.isEmptyObject(response[fields.results]), isProperArray = Array.isArray(response[fields.results]) && response[fields.results].length > 0, html = '' ; if (isProperObject || isProperArray) { if (settings.maxResults > 0) { if (isProperObject) { if (settings.type === 'standard') { module.error(error.maxResults); } } else { response[fields.results] = response[fields.results].slice(0, settings.maxResults); } } if (settings.highlightMatches) { var results = response[fields.results], regExpIgnore = settings.ignoreSearchCase ? 'i' : '', querySplit = module.get.value().split(''), diacriticReg = settings.ignoreDiacritics ? '[\u0300-\u036F]?' : '', htmlReg = '(?![^<]*>)', markedRegExp = new RegExp(htmlReg + '(' + querySplit.join(diacriticReg + ')(.*?)' + htmlReg + '(') + diacriticReg + ')', regExpIgnore), markedReplacer = function () { var args = [].slice.call(arguments, 1, querySplit.length * 2).map(function (x, i) { return i & 1 ? x : '<mark>' + x + '</mark>'; // eslint-disable-line no-bitwise }); return args.join(''); } ; $.each(results, function (label, content) { $.each(settings.searchFields, function (index, field) { var fieldExists = typeof content[field] === 'string' || typeof content[field] === 'number' ; if (fieldExists) { var markedHTML = typeof content[field] === 'string' ? content[field] : content[field].toString(); if (settings.ignoreDiacritics) { markedHTML = markedHTML.normalize('NFD'); } markedHTML = markedHTML.replace(/<\/?mark>/g, ''); response[fields.results][label][field] = markedHTML.replace(markedRegExp, markedReplacer); } }); }); } if (isFunction(template)) { html = template(response, fields, settings.preserveHTML); } else { module.error(error.noTemplate, false); } } else if (settings.showNoResults) { html = module.displayMessage(error.noResults, 'empty', error.noResultsHeader); } settings.onResults.call(element, response); return html; }, displayMessage: function (text, type, header) { type = type || 'standard'; module.debug('Displaying message', text, type, header); module.addResults(settings.templates.message(text, type, header)); return settings.templates.message(text, type, header); }, setting: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { settings[name] = value; } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if ($allModules.length > 1) { title += ' (' + $allModules.length + ')'; } if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.search.settings = { name: 'Search', namespace: 'search', silent: false, debug: false, verbose: false, performance: true, // template to use (specified in settings.templates) type: 'standard', // minimum characters required to search minCharacters: 1, // whether to select first result after searching automatically selectFirstResult: false, // API config apiSettings: false, // object to search source: false, // Whether search should query current term on focus searchOnFocus: true, // fields to search searchFields: [ 'id', 'title', 'description', ], // field to display in standard results template displayField: '', // search anywhere in value (set to 'exact' to require exact matches fullTextSearch: 'exact', // Whether search result should highlight matching strings highlightMatches: false, // match results also if they contain diacritics of the same base character (for example searching for "a" will also match "á" or "â" or "à", etc...) ignoreDiacritics: false, // whether to consider case sensitivity on local searching ignoreSearchCase: true, // whether to add events to prompt automatically automatic: true, // delay before hiding menu after blur hideDelay: 0, // delay before searching searchDelay: 200, // maximum results returned from search maxResults: 7, // whether to store lookups in local cache cache: true, // whether no results errors should be shown showNoResults: true, // preserve possible html of resultset values preserveHTML: true, // transition settings transition: 'scale', duration: 200, easing: 'easeOutExpo', // callbacks onSelect: false, onResultsAdd: false, onSearchQuery: function (query) {}, onResults: function (response, fromCache) {}, onResultsOpen: function () {}, onResultsClose: function () {}, className: { animating: 'animating', active: 'active', category: 'category', empty: 'empty', focus: 'focus', hidden: 'hidden', loading: 'loading', results: 'results', pressed: 'down', }, error: { source: 'Cannot search. No source used, and Fomantic API module was not included', noResultsHeader: 'No Results', noResults: 'Your search returned no results', noTemplate: 'A valid template name was not specified.', oldSearchSyntax: 'searchFullText setting has been renamed fullTextSearch for consistency, please adjust your settings.', serverError: 'There was an issue querying the server.', maxResults: 'Results must be an array to use maxResults setting', method: 'The method you called is not defined.', noNormalize: '"ignoreDiacritics" setting will be ignored. Browser does not support String().normalize(). You may consider including <https://cdn.jsdelivr.net/npm/unorm@1.4.1/lib/unorm.min.js> as a polyfill.', }, metadata: { cache: 'cache', results: 'results', result: 'result', }, regExp: { escape: /[$()*+./?[\\\]^{|}-]/g, beginsWith: '(?:\\s|^)', }, // maps api response attributes to internal representation fields: { categories: 'results', // array of categories (category view) categoryName: 'name', // name of category (category view) categoryResults: 'results', // array of results (category view) description: 'description', // result description image: 'image', // result image alt: 'alt', // result alt text for image price: 'price', // result price results: 'results', // array of results (standard) title: 'title', // result title url: 'url', // result url action: 'action', // "view more" object name actionText: 'text', // "view more" text actionURL: 'url', // "view more" url }, selector: { prompt: '.prompt', remove: '> .icon.input > .remove.icon', searchButton: '.search.button', results: '.results', message: '.results > .message', category: '.category', result: '.result', title: '.title, .name', }, templates: { escape: function (string, preserveHTML) { if (preserveHTML) { return string; } var badChars = /["'<>`]/g, shouldEscape = /["&'<>`]/, escape = { '<': '<', '>': '>', '"': '"', "'": ''', '`': '`', }, escapedChar = function (chr) { return escape[chr]; }; if (shouldEscape.test(string)) { string = string.replace(/&(?![\d#a-z]{1,12};)/gi, '&'); string = string.replace(badChars, escapedChar); // FUI controlled HTML is still allowed string = string.replace(/<(\/)*mark>/g, '<$1mark>'); } return string; }, message: function (message, type, header) { var html = '' ; if (message !== undefined && type !== undefined) { html += '' + '<div class="message ' + type + '">'; if (header) { html += '' + '<div class="header">' + header + '</div>'; } html += ' <div class="description">' + message + '</div>'; html += '</div>'; } return html; }, category: function (response, fields, preserveHTML) { var html = '', escape = $.fn.search.settings.templates.escape ; if (response[fields.categoryResults] !== undefined) { // each category $.each(response[fields.categoryResults], function (index, category) { if (category[fields.results] !== undefined && category.results.length > 0) { html += '<div class="category">'; if (category[fields.categoryName] !== undefined) { html += '<div class="name">' + escape(category[fields.categoryName], preserveHTML) + '</div>'; } // each item inside category html += '<div class="results">'; $.each(category.results, function (index, result) { html += result[fields.url] ? '<a class="result" href="' + result[fields.url].replace(/"/g, '') + '">' : '<a class="result">'; if (result[fields.image] !== undefined) { html += '' + '<div class="image">' + ' <img src="' + result[fields.image].replace(/"/g, '') + (result[fields.alt] ? '" alt="' + result[fields.alt].replace(/"/g, '') : '') + '">' + '</div>'; } html += '<div class="content">'; if (result[fields.price] !== undefined) { html += '<div class="price">' + escape(result[fields.price], preserveHTML) + '</div>'; } if (result[fields.title] !== undefined) { html += '<div class="title">' + escape(result[fields.title], preserveHTML) + '</div>'; } if (result[fields.description] !== undefined) { html += '<div class="description">' + escape(result[fields.description], preserveHTML) + '</div>'; } html += '' + '</div>'; html += '</a>'; }); html += '</div>'; html += '' + '</div>'; } }); if (response[fields.action]) { html += fields.actionURL === false ? '' + '<div class="action">' + escape(response[fields.action][fields.actionText], preserveHTML) + '</div>' : '' + '<a href="' + response[fields.action][fields.actionURL].replace(/"/g, '') + '" class="action">' + escape(response[fields.action][fields.actionText], preserveHTML) + '</a>'; } return html; } return false; }, standard: function (response, fields, preserveHTML) { var html = '', escape = $.fn.search.settings.templates.escape ; if (response[fields.results] !== undefined) { // each result $.each(response[fields.results], function (index, result) { html += result[fields.url] ? '<a class="result" href="' + result[fields.url].replace(/"/g, '') + '">' : '<a class="result">'; if (result[fields.image] !== undefined) { html += '' + '<div class="image">' + ' <img src="' + result[fields.image].replace(/"/g, '') + (result[fields.alt] ? '" alt="' + result[fields.alt].replace(/"/g, '') : '') + '">' + '</div>'; } html += '<div class="content">'; if (result[fields.price] !== undefined) { html += '<div class="price">' + escape(result[fields.price], preserveHTML) + '</div>'; } if (result[fields.title] !== undefined) { html += '<div class="title">' + escape(result[fields.title], preserveHTML) + '</div>'; } if (result[fields.description] !== undefined) { html += '<div class="description">' + escape(result[fields.description], preserveHTML) + '</div>'; } html += '' + '</div>'; html += '</a>'; }); if (response[fields.action]) { html += fields.actionURL === false ? '' + '<div class="action">' + escape(response[fields.action][fields.actionText], preserveHTML) + '</div>' : '' + '<a href="' + response[fields.action][fields.actionURL].replace(/"/g, '') + '" class="action">' + escape(response[fields.action][fields.actionText], preserveHTML) + '</a>'; } return html; } return false; }, }, }; $.extend($.easing, { easeOutExpo: function (x) { return x === 1 ? 1 : 1 - Math.pow(2, -10 * x); }, }); })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/segment.css ================================================ /*! * # Fomantic-UI 2.9.4 - Segment * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Segment *******************************/ .ui.segment { position: relative; background: #fff; box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15); margin: 1rem 0; padding: 1em 1em; border-radius: 0.28571429rem; border: 1px solid rgba(34, 36, 38, 0.15); } .ui.segment:first-child { margin-top: 0; } .ui.segment:last-child { margin-bottom: 0; } /* Vertical */ .ui.vertical.segment { margin: 0; padding-left: 0; padding-right: 0; background: none transparent; border-radius: 0; box-shadow: none; border: none; border-top: 1px solid rgba(34, 36, 38, 0.15); } .ui.vertical.segment:first-child { border-top: none; } /* ------------------- Loose Coupling -------------------- */ /* Header */ .ui.inverted.segments .segment > .ui.header .sub.header, .ui.inverted.segments .segment > .ui.header, .ui.inverted.segment > .ui.header .sub.header, .ui.inverted.segment > .ui.header { color: #fff; } /* Label */ .ui[class*="bottom attached"].segment > [class*="top attached"].label { border-top-left-radius: 0; border-top-right-radius: 0; } .ui[class*="top attached"].segment > [class*="bottom attached"].label { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .ui.attached.segment:not(.top):not(.bottom) > [class*="top attached"].label { border-top-left-radius: 0; border-top-right-radius: 0; } .ui.attached.segment:not(.top):not(.bottom) > [class*="bottom attached"].label { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } /* Grid */ .ui.page.grid.segment, .ui.grid > .row > .ui.segment.column, .ui.grid > .ui.segment.column { padding-top: 2em; padding-bottom: 2em; } .ui.grid.segment { margin: 1rem 0; border-radius: 0.28571429rem; } /* Table */ .ui.basic.table.segment { background: #fff; border: 1px solid rgba(34, 36, 38, 0.15); box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15); } .ui[class*="very basic"].table.segment { padding: 1em 1em; } /* Tab */ .ui.segment.tab:last-child { margin-bottom: 1rem; } /******************************* Types *******************************/ /* ------------------- Placeholder -------------------- */ .ui.placeholder.segment { display: flex; flex-direction: column; justify-content: center; align-items: stretch; max-width: initial; animation: none; overflow: visible; padding: 1em 1em; min-height: 18rem; background: #f9fafb; border-color: rgba(34, 36, 38, 0.15); box-shadow: 0 2px 25px 0 rgba(34, 36, 38, 0.05) inset; } .ui.placeholder.segment.tab { display: none; } .ui.placeholder.segment.tab.active { display: flex; } .ui.placeholder.segment .button, .ui.placeholder.segment textarea { display: block; } .ui.placeholder.segment .field, .ui.placeholder.segment textarea, .ui.placeholder.segment > .ui.input, .ui.placeholder.segment .button { max-width: 15rem; margin-left: auto; margin-right: auto; } .ui.placeholder.segment .column .button, .ui.placeholder.segment .column .field, .ui.placeholder.segment .column textarea, .ui.placeholder.segment .column > .ui.input { max-width: 15rem; margin-left: auto; margin-right: auto; } .ui.placeholder.segment > .inline { align-self: center; } .ui.placeholder.segment > .inline > .button { display: inline-block; width: auto; margin: 0 0.35714286rem 0 0; } .ui.placeholder.segment > .inline > .button:last-child { margin-right: 0; } /* ------------------- Piled -------------------- */ .ui.piled.segments, .ui.piled.segment { margin: 3em 0; box-shadow: ""; z-index: auto; background-color: #fff; border: 1px solid rgba(34, 36, 38, 0.15); color: rgba(0, 0, 0, 0.87); } .ui.piled.segment:first-child { margin-top: 0; } .ui.piled.segment:last-child { margin-bottom: 0; } .ui.piled.segments::after, .ui.piled.segments::before, .ui.piled.segment::after, .ui.piled.segment::before { background-color: inherit; visibility: visible; content: ""; display: block; height: 100%; left: 0; position: absolute; width: 100%; border: inherit; box-shadow: ""; } .ui.inverted.piled.segment { background-color: #1b1c1d; border: 1px solid #555; color: rgba(255, 255, 255, 0.9); } .ui.piled.segments::before, .ui.piled.segment::before { transform: rotate(-1.2deg); top: 0; z-index: -2; } .ui.piled.segments::after, .ui.piled.segment::after { transform: rotate(1.2deg); top: 0; z-index: -1; } /* Piled Attached */ .ui[class*="top attached"].piled.segment { margin-top: 3em; margin-bottom: 0; } .ui.piled.segment[class*="top attached"]:first-child { margin-top: 0; } .ui.piled.segment[class*="bottom attached"] { margin-top: 0; margin-bottom: 3em; } .ui.piled.segment[class*="bottom attached"]:last-child { margin-bottom: 0; } @supports selector(:has(.f)) { *:has(> .ui.piled.segment) { z-index: 0; position: relative; } } /* ------------------- Stacked -------------------- */ .ui.stacked.segment { padding-bottom: 1.4em; } .ui.stacked.segments::before, .ui.stacked.segments::after, .ui.stacked.segment::before, .ui.stacked.segment::after { content: ""; position: absolute; bottom: -3px; left: 0; border-top: 1px solid rgba(34, 36, 38, 0.15); background: rgba(0, 0, 0, 0.03); width: 100%; height: 6px; visibility: visible; } .ui.stacked.segments::before, .ui.stacked.segment::before { display: none; } /* Add additional page */ .ui.tall.stacked.segments::before, .ui.tall.stacked.segment::before { display: block; bottom: 0; } /* Inverted */ .ui.stacked.inverted.segments, .ui.stacked.inverted.segment { border: 1px solid rgba(225, 225, 225, 0.5); } .ui.stacked.inverted.segments::before, .ui.stacked.inverted.segment::before, .ui.stacked.inverted.segments::after, .ui.stacked.inverted.segment::after { background-color: rgba(0, 0, 0, 0.03); border-top: 1px solid rgba(225, 225, 225, 0.5); } /* ------------------- Padded -------------------- */ .ui.padded.segment { padding: 1.5em; } .ui[class*="very padded"].segment { padding: 3em; } /* Padded vertical */ .ui.padded.segment.vertical.segment, .ui[class*="very padded"].vertical.segment { padding-left: 0; padding-right: 0; } /* ------------------- Compact -------------------- */ .ui.compact.segment { display: table; } /* Compact Group */ .ui.compact.segments { display: inline-flex; } .ui.compact.segments .segment, .ui.segments .compact.segment { display: block; flex: 0 1 auto; } /* ------------------- Circular -------------------- */ .ui.circular.segment { display: table-cell; padding: 2em; text-align: center; vertical-align: middle; border-radius: 500em; } /* ------------------- Raised -------------------- */ .ui.ui.raised.segments, .ui.ui.raised.segment { box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.ui.inverted.raised.segments, .ui.ui.inverted.raised.segment { box-shadow: 0 2px 4px 0 rgba(225, 225, 225, 0.1), 0 2px 10px 0 rgba(225, 225, 225, 0.5); } /******************************* Groups *******************************/ /* Group */ .ui.segments { flex-direction: column; position: relative; margin: 1rem 0; border: 1px solid rgba(34, 36, 38, 0.15); box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15); border-radius: 0.28571429rem; } .ui.segments:first-child { margin-top: 0; } .ui.segments:last-child { margin-bottom: 0; } /* Nested Segment */ .ui.segments > .segment { top: 0; bottom: 0; border-radius: 0; margin: 0; width: auto; box-shadow: none; border: none; border-top: 1px solid rgba(34, 36, 38, 0.15); } .ui.segments:not(.horizontal) > .segment:first-child { top: 0; bottom: 0; border-top: none; margin-top: 0; margin-bottom: 0; border-radius: 0.28571429rem 0.28571429rem 0 0; } /* Bottom */ .ui.segments:not(.horizontal) > .segment:last-child { top: 0; bottom: 0; margin-top: 0; margin-bottom: 0; box-shadow: 0 2px 1px -1px rgba(34, 36, 38, 0.15); border-radius: 0 0 0.28571429rem 0.28571429rem; } /* Only */ .ui.segments:not(.horizontal) > .segment:only-child { border-radius: 0.28571429rem; } /* Nested Group */ .ui.segments > .ui.segments { border-top: 1px solid rgba(34, 36, 38, 0.15); margin: 1rem; } .ui.segments > .segments:first-child { border-top: none; } .ui.segments > .segment + .segments:not(.horizontal) { margin-top: 0; } /* Horizontal Group */ .ui.horizontal.segments { display: flex; flex-direction: row; background-color: transparent; padding: 0; box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15); margin: 1rem 0; border-radius: 0.28571429rem; border: 1px solid rgba(34, 36, 38, 0.15); } .ui.wrapping.horizontal.segments, .ui.stackable.horizontal.segments { flex-wrap: wrap; } /* Nested Horizontal Group */ .ui.segments > .horizontal.segments { margin: 0; background-color: transparent; border-radius: 0; border: none; box-shadow: none; border-top: 1px solid rgba(34, 36, 38, 0.15); } /* Horizontal Segment */ .ui.horizontal.segments:not(.compact) > .segment:not(.compact) { flex: 1 1 auto; -ms-flex: 1 1 0; } .ui.horizontal.segments > .segment { margin: 0; min-width: 0; border-radius: 0; border: none; box-shadow: none; border-left: 1px solid rgba(34, 36, 38, 0.15); } /* Border Fixes */ .ui.segments > .horizontal.segments:first-child { border-top: none; } .ui.horizontal.segments:not(.stackable):not(.wrapping) > .segment:first-child { border-left: none; } .ui.horizontal.segments > .segment:first-child { border-radius: 0.28571429rem 0 0 0.28571429rem; } .ui.horizontal.segments > .segment:last-child { border-radius: 0 0.28571429rem 0.28571429rem 0; } /* Equal Width */ .ui[class*="equal width"].horizontal.segments > .segment { width: 100%; } /******************************* States *******************************/ /* -------------- Disabled --------------- */ .ui.disabled.segments, .ui.disabled.segment { opacity: 0.45; color: rgba(40, 40, 40, 0.3); pointer-events: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; } /* -------------- Loading --------------- */ .ui.loading.segments, .ui.loading.segment { position: relative; cursor: default; pointer-events: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; transition: all 0s linear; min-height: 4.5em; } .ui.loading.segments::before, .ui.loading.segment::before { position: absolute; content: ""; top: 0; left: 0; background: rgba(255, 255, 255, 0.8); width: 100%; height: 100%; border-radius: 0.28571429rem; z-index: 100; } .ui.loading.segments::after, .ui.loading.segment::after { position: absolute; content: ""; top: 50%; left: 50%; margin: -1.5em 0 0 -1.5em; width: 3em; height: 3em; animation: loader 0.6s infinite linear; border: 0.2em solid #767676; border-radius: 500rem; box-shadow: 0 0 0 1px transparent; visibility: visible; z-index: 101; } /******************************* Variations *******************************/ /* ------------------- Basic -------------------- */ .ui.basic.segment, .ui.segments .ui.basic.segment, .ui.basic.segments { background: none transparent; box-shadow: none; border: none; border-radius: 0; } /* ------------------- Clearing -------------------- */ .ui.clearing.segment::after { content: ""; display: block; clear: both; } /* ------------------- Colors -------------------- */ .ui.ui.ui.ui.ui.red.segment:not(.inverted) { border-top: 2px solid #db2828; } .ui.ui.ui.ui.ui.inverted.red.segment { background-color: #db2828; color: #fff; } .ui.ui.inverted.red.segment:not(.piled) { border-color: #db2828; } .ui.ui.ui.ui.ui.orange.segment:not(.inverted) { border-top: 2px solid #f2711c; } .ui.ui.ui.ui.ui.inverted.orange.segment { background-color: #f2711c; color: #fff; } .ui.ui.inverted.orange.segment:not(.piled) { border-color: #f2711c; } .ui.ui.ui.ui.ui.yellow.segment:not(.inverted) { border-top: 2px solid #fbbd08; } .ui.ui.ui.ui.ui.inverted.yellow.segment { background-color: #fbbd08; color: #fff; } .ui.ui.inverted.yellow.segment:not(.piled) { border-color: #fbbd08; } .ui.ui.ui.ui.ui.olive.segment:not(.inverted) { border-top: 2px solid #b5cc18; } .ui.ui.ui.ui.ui.inverted.olive.segment { background-color: #b5cc18; color: #fff; } .ui.ui.inverted.olive.segment:not(.piled) { border-color: #b5cc18; } .ui.ui.ui.ui.ui.green.segment:not(.inverted) { border-top: 2px solid #21ba45; } .ui.ui.ui.ui.ui.inverted.green.segment { background-color: #21ba45; color: #fff; } .ui.ui.inverted.green.segment:not(.piled) { border-color: #21ba45; } .ui.ui.ui.ui.ui.teal.segment:not(.inverted) { border-top: 2px solid #00b5ad; } .ui.ui.ui.ui.ui.inverted.teal.segment { background-color: #00b5ad; color: #fff; } .ui.ui.inverted.teal.segment:not(.piled) { border-color: #00b5ad; } .ui.ui.ui.ui.ui.blue.segment:not(.inverted) { border-top: 2px solid #2185d0; } .ui.ui.ui.ui.ui.inverted.blue.segment { background-color: #2185d0; color: #fff; } .ui.ui.inverted.blue.segment:not(.piled) { border-color: #2185d0; } .ui.ui.ui.ui.ui.violet.segment:not(.inverted) { border-top: 2px solid #6435c9; } .ui.ui.ui.ui.ui.inverted.violet.segment { background-color: #6435c9; color: #fff; } .ui.ui.inverted.violet.segment:not(.piled) { border-color: #6435c9; } .ui.ui.ui.ui.ui.purple.segment:not(.inverted) { border-top: 2px solid #a333c8; } .ui.ui.ui.ui.ui.inverted.purple.segment { background-color: #a333c8; color: #fff; } .ui.ui.inverted.purple.segment:not(.piled) { border-color: #a333c8; } .ui.ui.ui.ui.ui.pink.segment:not(.inverted) { border-top: 2px solid #e03997; } .ui.ui.ui.ui.ui.inverted.pink.segment { background-color: #e03997; color: #fff; } .ui.ui.inverted.pink.segment:not(.piled) { border-color: #e03997; } .ui.ui.ui.ui.ui.brown.segment:not(.inverted) { border-top: 2px solid #a5673f; } .ui.ui.ui.ui.ui.inverted.brown.segment { background-color: #a5673f; color: #fff; } .ui.ui.inverted.brown.segment:not(.piled) { border-color: #a5673f; } .ui.ui.ui.ui.ui.grey.segment:not(.inverted) { border-top: 2px solid #767676; } .ui.ui.ui.ui.ui.inverted.grey.segment { background-color: #767676; color: #fff; } .ui.ui.inverted.grey.segment:not(.piled) { border-color: #767676; } .ui.ui.ui.ui.ui.black.segment:not(.inverted) { border-top: 2px solid #1b1c1d; } .ui.ui.ui.ui.ui.inverted.black.segment { background-color: #1b1c1d; color: #fff; } .ui.ui.inverted.black.segment:not(.piled) { border-color: #1b1c1d; } /* ------------------- Aligned -------------------- */ .ui[class*="left aligned"].segment { text-align: left; } .ui[class*="right aligned"].segment { text-align: right; } .ui[class*="center aligned"].segment { text-align: center; } /* ------------------- Floated -------------------- */ .ui.floated.segment, .ui[class*="left floated"].segment { float: left; margin-right: 1em; } .ui[class*="right floated"].segment { float: right; margin-left: 1em; } /* ------------------- Inverted -------------------- */ .ui.inverted.segments, .ui.inverted.segments .segment, .ui.inverted.segment { border: none; box-shadow: none; } .ui.inverted.segments .segment, .ui.inverted.segment, .ui.primary.inverted.segment { background: #1b1c1d; color: rgba(255, 255, 255, 0.9); } /* Nested */ .ui.inverted.segment .segment { color: rgba(0, 0, 0, 0.87); } .ui.inverted.segment .inverted.segment { color: rgba(255, 255, 255, 0.9); } /* Attached */ .ui.ui.inverted.attached.segment { border-color: #555; } /* Loading */ .ui.inverted.loading.segments, .ui.inverted.loading.segment { color: #fff; } .ui.inverted.loading.segments::before, .ui.inverted.loading.segment::before { background: rgba(0, 0, 0, 0.85); } /* ------------------- Emphasis -------------------- */ /* Secondary */ .ui.secondary.segment { background: #f3f4f5; color: rgba(0, 0, 0, 0.6); } .ui.secondary.inverted.segment { background: #4c4f52 linear-gradient(rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.2) 100%); color: rgba(255, 255, 255, 0.8); } /* Tertiary */ .ui.tertiary.segment { background: #dcddde; color: rgba(0, 0, 0, 0.6); } .ui.tertiary.inverted.segment { background: #717579 linear-gradient(rgba(255, 255, 255, 0.35) 0, rgba(255, 255, 255, 0.35) 100%); color: rgba(255, 255, 255, 0.8); } /* ------------------- Attached -------------------- */ /* Middle */ .ui.attached.segment { top: 0; bottom: 0; border-radius: 0; margin: 0 -1px; width: calc(100% + 2px); max-width: calc(100% + 2px); box-shadow: none; } .ui.attached.segment:not(.basic) { border: 1px solid #d4d4d5; } .ui.attached:not(.message):not(.text) + .ui.attached.segment:not(.top):not([class*="left attached"]):not([class*="right attached"]) { border-top: none; } /* Top */ .ui.segment[class*="top attached"] { bottom: 0; margin-bottom: 0; top: 0; margin-top: 1rem; border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.segment[class*="top attached"]:first-child { margin-top: 0; } .ui.tab.segment[class*="top attached"]:first-child { margin-top: 1rem; } /* Bottom */ .ui.segment[class*="bottom attached"] { bottom: 0; margin-top: 0; top: 0; margin-bottom: 1rem; box-shadow: 0 2px 1px -1px rgba(34, 36, 38, 0.15); border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui.segment[class*="bottom attached"]:last-child { margin-bottom: 0; } .ui.tab.segment[class*="bottom attached"]:last-child { margin-bottom: 1rem; } .ui[class*="left attached"].segment { margin-right: 0; } .ui[class*="right attached"].segment { margin-left: 0; } .ui.seamless.attached.segment:not(.top):not(.bottom):not([class*="right attached"]):not([class*="left attached"]) { border-top: none; border-bottom: none; } .ui.seamless.attached.segment.top { border-bottom: none; } .ui.seamless.attached.segment.bottom { border-top: none; } .ui.seamless.attached.segment[class*="left attached"] { border-right: none; } .ui.seamless.attached.segment[class*="right attached"] { border-left: none; } /* -------------- Fitted --------------- */ .ui.fitted.segment:not(.horizontally) { padding-top: 0; padding-bottom: 0; } .ui.fitted.segment:not(.vertically) { padding-left: 0; padding-right: 0; } /* -------------- Scrolling --------------- */ .ui.scrolling.segment { overflow: auto; -ms-scroll-chaining: none; overscroll-behavior: none; } @media only screen and (max-width: 767.98px) { .ui.scrolling.segment.short { max-height: 11.25em; } .ui.scrolling.segment.short.resizable { height: 11.25em; } .ui.scrolling.segment[class*="very short"] { max-height: 7.5em; } .ui.scrolling.segment[class*="very short"].resizable { height: 7.5em; } .ui.scrolling.segment { max-height: 15em; } .ui.scrolling.segment.resizable { height: 15em; } .ui.scrolling.segment.long { max-height: 30em; } .ui.scrolling.segment.long.resizable { height: 30em; } .ui.scrolling.segment[class*="very long"] { max-height: 45em; } .ui.scrolling.segment[class*="very long"].resizable { height: 45em; } } @media only screen and (min-width: 768px) { .ui.scrolling.segment.short { max-height: 13.5em; } .ui.scrolling.segment.short.resizable { height: 13.5em; } .ui.scrolling.segment[class*="very short"] { max-height: 9em; } .ui.scrolling.segment[class*="very short"].resizable { height: 9em; } .ui.scrolling.segment { max-height: 18em; } .ui.scrolling.segment.resizable { height: 18em; } .ui.scrolling.segment.long { max-height: 36em; } .ui.scrolling.segment.long.resizable { height: 36em; } .ui.scrolling.segment[class*="very long"] { max-height: 54em; } .ui.scrolling.segment[class*="very long"].resizable { height: 54em; } } @media only screen and (min-width: 992px) { .ui.scrolling.segment.short { max-height: 18em; } .ui.scrolling.segment.short.resizable { height: 18em; } .ui.scrolling.segment[class*="very short"] { max-height: 12em; } .ui.scrolling.segment[class*="very short"].resizable { height: 12em; } .ui.scrolling.segment { max-height: 24em; } .ui.scrolling.segment.resizable { height: 24em; } .ui.scrolling.segment.long { max-height: 48em; } .ui.scrolling.segment.long.resizable { height: 48em; } .ui.scrolling.segment[class*="very long"] { max-height: 72em; } .ui.scrolling.segment[class*="very long"].resizable { height: 72em; } } @media only screen and (min-width: 1920px) { .ui.scrolling.segment.short { max-height: 22.5em; } .ui.scrolling.segment.short.resizable { height: 22.5em; } .ui.scrolling.segment[class*="very short"] { max-height: 15em; } .ui.scrolling.segment[class*="very short"].resizable { height: 15em; } .ui.scrolling.segment { max-height: 30em; } .ui.scrolling.segment.resizable { height: 30em; } .ui.scrolling.segment.long { max-height: 60em; } .ui.scrolling.segment.long.resizable { height: 60em; } .ui.scrolling.segment[class*="very long"] { max-height: 90em; } .ui.scrolling.segment[class*="very long"].resizable { height: 90em; } } .ui.resizable.scrolling.segment { resize: vertical; max-height: none; } /* ------------------- Size -------------------- */ .ui.segments .segment, .ui.segment { font-size: 1rem; } .ui.mini.segments .segment, .ui.mini.segment { font-size: 0.78571429rem; } .ui.tiny.segments .segment, .ui.tiny.segment { font-size: 0.85714286rem; } .ui.small.segments .segment, .ui.small.segment { font-size: 0.92857143rem; } .ui.large.segments .segment, .ui.large.segment { font-size: 1.14285714rem; } .ui.big.segments .segment, .ui.big.segment { font-size: 1.28571429rem; } .ui.huge.segments .segment, .ui.huge.segment { font-size: 1.42857143rem; } .ui.massive.segments .segment, .ui.massive.segment { font-size: 1.71428571rem; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/shape.css ================================================ /*! * # Fomantic-UI 2.9.4 - Shape * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Shape *******************************/ .ui.shape { position: relative; vertical-align: top; display: inline-block; perspective: 2000px; transition: transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out; } .ui.shape .side, .ui.shape .sides { transform-style: preserve-3d; } .ui.shape .side { display: none; opacity: 1; width: 100%; margin: 0 !important; -webkit-backface-visibility: hidden; backface-visibility: hidden; } .ui.shape .side * { -webkit-backface-visibility: visible !important; backface-visibility: visible !important; } /******************************* Types *******************************/ .ui.cube.shape .side { min-width: 15em; height: 15em; padding: 2em; background-color: #e6e6e6; color: rgba(0, 0, 0, 0.87); box-shadow: 0 0 2px rgba(0, 0, 0, 0.3); } .ui.cube.shape .side > .content { width: 100%; height: 100%; display: table; text-align: center; -webkit-user-select: text; -ms-user-select: text; user-select: text; } .ui.cube.shape .side > .content > div { display: table-cell; vertical-align: middle; font-size: 2em; } /******************************* Variations *******************************/ .ui.text.shape.animating .sides { position: static; } .ui.text.shape .side { white-space: nowrap; } .ui.text.shape .side > * { white-space: normal; } /******************************* States *******************************/ /* -------------- Loading --------------- */ .ui.loading.shape { position: absolute; top: -9999px; left: -9999px; } /* -------------- Animating --------------- */ .ui.shape .animating.side { position: absolute; top: 0; left: 0; display: block; z-index: 100; } .ui.shape .hidden.side { opacity: 0.6; } /* -------------- CSS --------------- */ .ui.shape.animating .sides { position: absolute; transition: transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out; } .ui.shape.animating .side { transition: opacity 0.6s ease-in-out; } .ui.shape .animating.side *, .ui.shape.animating .side * { transition: none; } /* -------------- Active --------------- */ .ui.shape .active.side { display: block; } /******************************* Theme Overrides *******************************/ /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/shape.js ================================================ /*! * # Fomantic-UI 2.9.4 - Shape * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.shape = function (parameters) { var $allModules = $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.shape.settings, parameters) : $.extend({}, $.fn.shape.settings), // internal aliases namespace = settings.namespace, selector = settings.selector, error = settings.error, className = settings.className, // define namespaces for modules eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, // selector cache $module = $(this), $sides = $module.find('>' + selector.sides), $side = $sides.find('>' + selector.side), // private variables nextIndex = false, $activeSide, $nextSide, // standard module element = this, instance = $module.data(moduleNamespace), module ; module = { initialize: function () { module.verbose('Initializing module for', element); module.set.defaultSide(); module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, instance) ; }, destroy: function () { module.verbose('Destroying previous module for', element); $module .removeData(moduleNamespace) .off(eventNamespace) ; }, refresh: function () { module.verbose('Refreshing selector cache for', element); $module = $(element); $sides = $(this).find(selector.sides); $side = $(this).find(selector.side); }, repaint: function () { module.verbose('Forcing repaint event'); var shape = $sides[0] || document.createElement('div'), fakeAssignment = shape.offsetWidth ; }, animate: function (propertyObject, callback) { module.verbose('Animating box with properties', propertyObject); callback = callback || function (event) { module.verbose('Executing animation callback'); if (event !== undefined) { event.stopPropagation(); } module.reset(); module.set.active(); }; settings.onBeforeChange.call($nextSide[0]); module.verbose('Starting CSS animation'); $module .addClass(className.animating) ; $sides .css(propertyObject) .one('transitionend', callback) ; module.set.duration(settings.duration); requestAnimationFrame(function () { $module .addClass(className.animating) ; $activeSide .addClass(className.hidden) ; }); }, queue: function (method) { module.debug('Queueing animation of', method); $sides .one('transitionend', function () { module.debug('Executing queued animation'); setTimeout(function () { $module.shape(method); }, 0); }) ; }, reset: function () { module.verbose('Animating states reset'); $module .removeClass(className.animating) .attr('style', '') .removeAttr('style') ; // removeAttr style does not consistently work in safari $sides .attr('style', '') .removeAttr('style') ; $side .attr('style', '') .removeAttr('style') .removeClass(className.hidden) ; $nextSide .removeClass(className.animating) .attr('style', '') .removeAttr('style') ; }, is: { complete: function () { return $side.filter('.' + className.active)[0] === $nextSide[0]; }, animating: function () { return $module.hasClass(className.animating); }, hidden: function () { return $module.closest(':hidden').length > 0; }, }, set: { defaultSide: function () { $activeSide = $side.filter('.' + className.active); $nextSide = $activeSide.next(selector.side).length > 0 ? $activeSide.next(selector.side) : $side.first(); nextIndex = false; module.verbose('Active side set to', $activeSide); module.verbose('Next side set to', $nextSide); }, duration: function (duration) { duration = duration || settings.duration; duration = typeof duration === 'number' ? duration + 'ms' : duration; module.verbose('Setting animation duration', duration); if (settings.duration || settings.duration === 0) { $sides.add($side) .css({ 'transition-duration': duration, }) ; } }, currentStageSize: function () { var $activeSide = $side.filter('.' + className.active), width = $activeSide.outerWidth(true), height = $activeSide.outerHeight(true) ; $module .css({ width: width, height: height, }) ; }, stageSize: function () { var $clone = $module.clone().addClass(className.loading), $side = $clone.find('>' + selector.sides + '>' + selector.side), $activeSide = $side.filter('.' + className.active), $nextSide = nextIndex ? $side.eq(nextIndex) : ($activeSide.next(selector.side).length > 0 ? $activeSide.next(selector.side) : $side.first()), newWidth = settings.width === 'next' ? $nextSide.outerWidth(true) : (settings.width === 'initial' ? $module.width() : settings.width), newHeight = settings.height === 'next' ? $nextSide.outerHeight(true) : (settings.height === 'initial' ? $module.height() : settings.height) ; $activeSide.removeClass(className.active); $nextSide.addClass(className.active); $clone.insertAfter($module); $clone.remove(); if (settings.width !== 'auto') { $module.css('width', newWidth + settings.jitter); module.verbose('Specifying width during animation', newWidth); } if (settings.height !== 'auto') { $module.css('height', newHeight + settings.jitter); module.verbose('Specifying height during animation', newHeight); } }, nextSide: function (selector) { nextIndex = selector; $nextSide = $side.filter(selector); nextIndex = $side.index($nextSide); if ($nextSide.length === 0) { module.set.defaultSide(); module.error(error.side); } module.verbose('Next side manually set to', $nextSide); }, active: function () { module.verbose('Setting new side to active', $nextSide); $side .removeClass(className.active) ; $nextSide .addClass(className.active) ; settings.onChange.call($nextSide[0]); module.set.defaultSide(); }, }, flip: { to: function (type, stage) { if (module.is.hidden()) { module.debug('Module not visible', $nextSide); return; } if (module.is.complete() && !module.is.animating() && !settings.allowRepeats) { module.debug('Side already visible', $nextSide); return; } var transform = module.get.transform[type]() ; if (!module.is.animating()) { module.debug('Flipping ' + type, $nextSide); module.set.stageSize(); module.stage[stage](); module.animate(transform); } else { module.queue('flip ' + type); } }, up: function () { module.flip.to('up', 'above'); }, down: function () { module.flip.to('down', 'below'); }, left: function () { module.flip.to('left', 'left'); }, right: function () { module.flip.to('right', 'right'); }, over: function () { module.flip.to('over', 'behind'); }, back: function () { module.flip.to('back', 'behind'); }, }, get: { transform: { up: function () { var translateZ = $activeSide.outerHeight(true) / 2, translateY = $nextSide.outerHeight(true) - translateZ ; return { transform: 'translateY(' + translateY + 'px) translateZ(-' + translateZ + 'px) rotateX(-90deg)', }; }, down: function () { var translate = { z: $activeSide.outerHeight(true) / 2, } ; return { transform: 'translateY(-' + translate.z + 'px) translateZ(-' + translate.z + 'px) rotateX(90deg)', }; }, left: function () { var translateZ = $activeSide.outerWidth(true) / 2, translateX = $nextSide.outerWidth(true) - translateZ ; return { transform: 'translateX(' + translateX + 'px) translateZ(-' + translateZ + 'px) rotateY(90deg)', }; }, right: function () { var translate = { z: $activeSide.outerWidth(true) / 2, } ; return { transform: 'translateX(-' + translate.z + 'px) translateZ(-' + translate.z + 'px) rotateY(-90deg)', }; }, over: function () { var translate = { x: -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2), } ; return { transform: 'translateX(' + translate.x + 'px) rotateY(180deg)', }; }, back: function () { var translate = { x: -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2), } ; return { transform: 'translateX(' + translate.x + 'px) rotateY(-180deg)', }; }, }, nextSide: function () { return $activeSide.next(selector.side).length > 0 ? $activeSide.next(selector.side) : $side.first(); }, }, stage: { above: function () { var box = { origin: ($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2, depth: { active: $nextSide.outerHeight(true) / 2, next: $activeSide.outerHeight(true) / 2, }, } ; module.verbose('Setting the initial animation position as above', $nextSide, box); $activeSide .css({ transform: 'rotateX(0deg)', }) ; $nextSide .addClass(className.animating) .css({ top: box.origin + 'px', transform: 'rotateX(90deg) translateZ(' + box.depth.next + 'px) translateY(-' + box.depth.active + 'px)', }) ; }, below: function () { var box = { origin: ($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2, depth: { active: $nextSide.outerHeight(true) / 2, next: $activeSide.outerHeight(true) / 2, }, } ; module.verbose('Setting the initial animation position as below', $nextSide, box); $activeSide .css({ transform: 'rotateX(0deg)', }) ; $nextSide .addClass(className.animating) .css({ top: box.origin + 'px', transform: 'rotateX(-90deg) translateZ(' + box.depth.next + 'px) translateY(' + box.depth.active + 'px)', }) ; }, left: function () { var height = { active: $activeSide.outerWidth(true), next: $nextSide.outerWidth(true), }, box = { origin: (height.active - height.next) / 2, depth: { active: height.next / 2, next: height.active / 2, }, } ; module.verbose('Setting the initial animation position as left', $nextSide, box); $activeSide .css({ transform: 'rotateY(0deg)', }) ; $nextSide .addClass(className.animating) .css({ left: box.origin + 'px', transform: 'rotateY(-90deg) translateZ(' + box.depth.next + 'px) translateX(-' + box.depth.active + 'px)', }) ; }, right: function () { var height = { active: $activeSide.outerWidth(true), next: $nextSide.outerWidth(true), }, box = { origin: (height.active - height.next) / 2, depth: { active: height.next / 2, next: height.active / 2, }, } ; module.verbose('Setting the initial animation position as right', $nextSide, box); $activeSide .css({ transform: 'rotateY(0deg)', }) ; $nextSide .addClass(className.animating) .css({ left: box.origin + 'px', transform: 'rotateY(90deg) translateZ(' + box.depth.next + 'px) translateX(' + box.depth.active + 'px)', }) ; }, behind: function () { var height = { active: $activeSide.outerWidth(true), next: $nextSide.outerWidth(true), }, box = { origin: (height.active - height.next) / 2, depth: { active: height.next / 2, next: height.active / 2, }, } ; module.verbose('Setting the initial animation position as behind', $nextSide, box); $activeSide .css({ transform: 'rotateY(0deg)', }) ; $nextSide .addClass(className.animating) .css({ left: box.origin + 'px', transform: 'rotateY(-180deg)', }) ; }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if ($allModules.length > 1) { title += ' (' + $allModules.length + ')'; } if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } var $inputs = $module.find('input'); if ($inputs.length > 0) { $inputs.trigger('blur'); setTimeout(function () { module.invoke(query); }, 150); } else { module.invoke(query); } } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.shape.settings = { // module info name: 'Shape', // hide all debug content silent: false, // debug content outputted to console debug: false, // verbose debug output verbose: false, // fudge factor in pixels when swapping from 2d to 3d (can be useful to correct rounding errors) jitter: 0, // performance data output performance: true, // event namespace namespace: 'shape', // width during animation, can be set to 'auto', initial', 'next' or pixel amount width: 'initial', // height during animation, can be set to 'auto', 'initial', 'next' or pixel amount height: 'initial', // callback occurs on side change onBeforeChange: function () {}, onChange: function () {}, // allow animation to same side allowRepeats: false, // animation duration duration: false, // possible errors error: { side: 'You tried to switch to a side that does not exist.', method: 'The method you called is not defined', }, // classnames used className: { animating: 'animating', hidden: 'hidden', loading: 'loading', active: 'active', }, // selectors used selector: { sides: '.sides', side: '.side', }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/sidebar.css ================================================ /*! * # Fomantic-UI 2.9.4 - Sidebar * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Sidebar *******************************/ /* Sidebar Menu */ .ui.sidebar { position: fixed; top: 0; left: 0; -webkit-backface-visibility: hidden; backface-visibility: hidden; transition: none; will-change: transform; transform: translate3d(0, 0, 0); visibility: hidden; height: 100% !important; max-height: 100%; border-radius: 0 !important; margin: 0 !important; overflow-y: auto !important; -ms-scroll-chaining: none; overscroll-behavior: none; z-index: 102; } /* GPU Layers for Child Elements */ .ui.sidebar > * { -webkit-backface-visibility: hidden; backface-visibility: hidden; } /* -------------- Direction --------------- */ .ui.left.sidebar { right: auto; left: 0; transform: translate3d(-100%, 0, 0); } .ui.right.sidebar { right: 0 !important; left: auto !important; transform: translate3d(100%, 0, 0); } .ui.top.sidebar, .ui.bottom.sidebar { width: 100% !important; height: auto !important; } .ui.top.sidebar { top: 0 !important; bottom: auto !important; transform: translate3d(0, -100%, 0); } .ui.bottom.sidebar { top: auto !important; bottom: 0 !important; transform: translate3d(0, 100%, 0); } /* -------------- Pushable --------------- */ .pushable.pushable.pushable { height: 100%; overflow-x: hidden; padding: 0; } .pushable.pushable.pushable.locked { overflow-y: hidden; background: inherit; } /* Whole Page */ body.pushable { background: #545454; } body.pushable.dimmed { background: inherit; } /* Page Context */ .pushable:not(body) { transform: translate3d(0, 0, 0); overflow-y: hidden; } .pushable:not(body) > .ui.sidebar, .pushable:not(body) > .fixed, .pushable:not(body) > .pusher::after { position: absolute; } /* -------------- Fixed --------------- */ .pushable > .fixed { position: fixed; -webkit-backface-visibility: hidden; backface-visibility: hidden; transition: transform 500ms ease; will-change: transform; z-index: 101; } /* -------------- Page --------------- */ .pushable > .pusher { position: relative; -webkit-backface-visibility: hidden; backface-visibility: hidden; min-height: 100%; transition: transform 500ms ease; z-index: 2; /* Pusher should inherit background from context */ background: inherit; } .pushable > .pusher:not(.overflowing) { overflow: hidden; } body.pushable > .pusher { background: #fff; } /* -------------- Dimmer --------------- */ .pushable > .pusher::after { position: fixed; top: 0; right: 0; content: ""; background: rgba(0, 0, 0, 0.4); overflow: hidden; opacity: 0; transition: all 500ms; will-change: opacity; z-index: 1000; } /* -------------- Coupling --------------- */ .ui.sidebar.menu .item { border-radius: 0 !important; } /******************************* States *******************************/ /* -------------- Dimmed --------------- */ .pushable > .pusher.dimmed::after { width: 100% !important; height: 100% !important; opacity: 1 !important; } .pushable > .pusher.dimmed.blurring:not(.closing)::after { background: rgba(0, 0, 0, 0.6); -webkit-backdrop-filter: blur(5px) grayscale(0.7); backdrop-filter: blur(5px) grayscale(0.7); } .pushable > .pusher.closing.dimmed::after { opacity: 0 !important; } /* -------------- Animating --------------- */ .ui.animating.sidebar { visibility: visible; } /* -------------- Visible --------------- */ .ui.visible.sidebar { visibility: visible; transform: translate3d(0, 0, 0); } /* Shadow Direction */ .ui.left.visible.sidebar, .ui.right.visible.sidebar { box-shadow: 0 0 20px rgba(34, 36, 38, 0.15); } .ui.top.visible.sidebar, .ui.bottom.visible.sidebar { box-shadow: 0 0 20px rgba(34, 36, 38, 0.15); } /* Visible On Load */ .ui.visible.left.sidebar ~ .fixed, .ui.visible.left.sidebar ~ .pusher { transform: translate3d(260px, 0, 0); } .ui.visible.right.sidebar ~ .fixed, .ui.visible.right.sidebar ~ .pusher { transform: translate3d(-260px, 0, 0); } .ui.visible.top.sidebar ~ .fixed, .ui.visible.top.sidebar ~ .pusher { transform: translate3d(0, 36px, 0); } .ui.visible.bottom.sidebar ~ .fixed, .ui.visible.bottom.sidebar ~ .pusher { transform: translate3d(0, -36px, 0); } /* opposite sides visible forces content overlay */ .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .fixed, .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher, .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .fixed, .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher { transform: translate3d(0, 0, 0); } /* -------------- iOS --------------- */ /******************************* Variations *******************************/ /* -------------- Width --------------- */ /* Left / Right */ .ui.thin.left.sidebar, .ui.thin.right.sidebar { width: 150px; } .ui[class*="very thin"].left.sidebar, .ui[class*="very thin"].right.sidebar { width: 60px; } .ui.left.sidebar, .ui.right.sidebar { width: 260px; } .ui.wide.left.sidebar, .ui.wide.right.sidebar { width: 350px; } .ui[class*="very wide"].left.sidebar, .ui[class*="very wide"].right.sidebar { width: 475px; } /* Left Visible */ .ui.visible.thin.left.sidebar ~ .fixed, .ui.visible.thin.left.sidebar ~ .pusher { transform: translate3d(150px, 0, 0); } .ui.visible[class*="very thin"].left.sidebar ~ .fixed, .ui.visible[class*="very thin"].left.sidebar ~ .pusher { transform: translate3d(60px, 0, 0); } .ui.visible.wide.left.sidebar ~ .fixed, .ui.visible.wide.left.sidebar ~ .pusher { transform: translate3d(350px, 0, 0); } .ui.visible[class*="very wide"].left.sidebar ~ .fixed, .ui.visible[class*="very wide"].left.sidebar ~ .pusher { transform: translate3d(475px, 0, 0); } /* Right Visible */ .ui.visible.thin.right.sidebar ~ .fixed, .ui.visible.thin.right.sidebar ~ .pusher { transform: translate3d(-150px, 0, 0); } .ui.visible[class*="very thin"].right.sidebar ~ .fixed, .ui.visible[class*="very thin"].right.sidebar ~ .pusher { transform: translate3d(-60px, 0, 0); } .ui.visible.wide.right.sidebar ~ .fixed, .ui.visible.wide.right.sidebar ~ .pusher { transform: translate3d(-350px, 0, 0); } .ui.visible[class*="very wide"].right.sidebar ~ .fixed, .ui.visible[class*="very wide"].right.sidebar ~ .pusher { transform: translate3d(-475px, 0, 0); } /******************************* Animations *******************************/ /* -------------- Overlay --------------- */ /* Set-up */ .ui.overlay.sidebar { z-index: 102; } /* Initial */ .ui.left.overlay.sidebar { transform: translate3d(-100%, 0, 0); } .ui.right.overlay.sidebar { transform: translate3d(100%, 0, 0); } .ui.top.overlay.sidebar { transform: translate3d(0, -100%, 0); } .ui.bottom.overlay.sidebar { transform: translate3d(0, 100%, 0); } /* Animation */ .animating.ui.overlay.sidebar, .ui.visible.overlay.sidebar { transition: transform 500ms ease; } /* End - Sidebar */ .ui.visible.left.overlay.sidebar { transform: translate3d(0, 0, 0); } .ui.visible.right.overlay.sidebar { transform: translate3d(0, 0, 0); } .ui.visible.top.overlay.sidebar { transform: translate3d(0, 0, 0); } .ui.visible.bottom.overlay.sidebar { transform: translate3d(0, 0, 0); } /* End - Pusher */ .ui.visible.overlay.sidebar ~ .fixed, .ui.visible.overlay.sidebar ~ .pusher { transform: none !important; } /* -------------- Push --------------- */ /* Initial */ .ui.push.sidebar { transition: transform 500ms ease; z-index: 102; } /* Sidebar - Initial */ .ui.left.push.sidebar { transform: translate3d(-100%, 0, 0); } .ui.right.push.sidebar { transform: translate3d(100%, 0, 0); } .ui.top.push.sidebar { transform: translate3d(0, -100%, 0); } .ui.bottom.push.sidebar { transform: translate3d(0, 100%, 0); } /* End */ .ui.visible.push.sidebar { transform: translate3d(0, 0, 0); } /* -------------- Uncover --------------- */ /* Initial */ .ui.uncover.sidebar { transform: translate3d(0, 0, 0); z-index: 1; } /* End */ .ui.visible.uncover.sidebar { transform: translate3d(0, 0, 0); transition: transform 500ms ease; } /* -------------- Slide Along --------------- */ /* Initial */ .ui.slide.along.sidebar { z-index: 1; } /* Sidebar - Initial */ .ui.left.slide.along.sidebar { transform: translate3d(-50%, 0, 0); } .ui.right.slide.along.sidebar { transform: translate3d(50%, 0, 0); } .ui.top.slide.along.sidebar { transform: translate3d(0, -50%, 0); } .ui.bottom.slide.along.sidebar { transform: translate3d(0, 50%, 0); } /* Animation */ .ui.animating.slide.along.sidebar { transition: transform 500ms ease; } /* End */ .ui.visible.slide.along.sidebar { transform: translate3d(0, 0, 0); } /* -------------- Slide Out --------------- */ /* Initial */ .ui.slide.out.sidebar { z-index: 1; } /* Sidebar - Initial */ .ui.left.slide.out.sidebar { transform: translate3d(50%, 0, 0); } .ui.right.slide.out.sidebar { transform: translate3d(-50%, 0, 0); } .ui.top.slide.out.sidebar { transform: translate3d(0, 50%, 0); } .ui.bottom.slide.out.sidebar { transform: translate3d(0, -50%, 0); } /* Animation */ .ui.animating.slide.out.sidebar { transition: transform 500ms ease; } /* End */ .ui.visible.slide.out.sidebar { transform: translate3d(0, 0, 0); } /* -------------- Scale Down --------------- */ /* Initial */ .ui.scale.down.sidebar { transition: transform 500ms ease; z-index: 102; } .ui.left.scale.down.sidebar { transform: translate3d(-100%, 0, 0); } .ui.right.scale.down.sidebar { transform: translate3d(100%, 0, 0); } .ui.top.scale.down.sidebar { transform: translate3d(0, -100%, 0); } .ui.bottom.scale.down.sidebar { transform: translate3d(0, 100%, 0); } /* Pusher - Initial */ .ui.scale.down.left.sidebar ~ .pusher { transform-origin: 75% 50%; } .ui.scale.down.right.sidebar ~ .pusher { transform-origin: 25% 50%; } .ui.scale.down.top.sidebar ~ .pusher { transform-origin: 50% 75%; } .ui.scale.down.bottom.sidebar ~ .pusher { transform-origin: 50% 25%; } /* Animation */ .ui.animating.scale.down > .visible.ui.sidebar { transition: transform 500ms ease; } .ui.visible.scale.down.sidebar ~ .pusher, .ui.animating.scale.down.sidebar ~ .pusher { display: block !important; width: 100%; height: 100%; overflow: hidden !important; } /* End */ .ui.visible.scale.down.sidebar { transform: translate3d(0, 0, 0); } .ui.visible.scale.down.sidebar ~ .pusher { transform: scale(0.75); } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/sidebar.js ================================================ /*! * # Fomantic-UI 2.9.4 - Sidebar * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.sidebar = function (parameters) { var $allModules = $(this), $window = $(window), $document = $(document), $body = $('body'), $html = $('html'), $head = $('head'), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $body; } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : $body; } } return $context; }, returnedValue; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.sidebar.settings, parameters) : $.extend({}, $.fn.sidebar.settings), selector = settings.selector, className = settings.className, namespace = settings.namespace, regExp = settings.regExp, error = settings.error, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $context = contextCheck(settings.context, window), isBody = $context[0] === $body[0], $sidebars = $module.children(selector.sidebar), $fixed = $context.children(selector.fixed), $pusher = $context.children(selector.pusher), $style, element = this, instance = $module.data(moduleNamespace), elementNamespace, id, currentScroll, initialBodyMargin = '', tempBodyMargin = '', hadScrollbar = false, module ; module = { initialize: function () { module.debug('Initializing sidebar', parameters); module.create.id(); // avoids locking rendering if initialized in onReady if (settings.delaySetup) { requestAnimationFrame(module.setup.layout); } else { module.setup.layout(); } requestAnimationFrame(function () { module.setup.cache(); }); module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, module) ; }, create: { id: function () { id = (Math.random().toString(16) + '000000000').slice(2, 10); elementNamespace = '.' + id; module.verbose('Creating unique id for element', id); }, }, destroy: function () { module.verbose('Destroying previous module for', $module); $module .off(eventNamespace) .removeData(moduleNamespace) ; // bound by uuid $context.off(elementNamespace); $window.off(elementNamespace); $document.off(elementNamespace); }, event: { clickaway: function (event) { if (settings.closable) { var clickedInPusher = $pusher.find(event.target).length > 0 || $pusher.is(event.target), clickedContext = $context.is(event.target) ; if (clickedInPusher) { module.verbose('User clicked on dimmed page'); module.hide(); } if (clickedContext) { module.verbose('User clicked on dimmable context (scaled out page)'); module.hide(); } } }, touch: function (event) { // event.stopPropagation(); }, containScroll: function (event) { if (element.scrollTop <= 0) { element.scrollTop = 1; } if ((element.scrollTop + element.offsetHeight) >= element.scrollHeight) { element.scrollTop = element.scrollHeight - element.offsetHeight - 1; } }, scroll: function (event) { if ($(event.target).closest(selector.sidebar).length === 0) { event.preventDefault(); } }, }, bind: { clickaway: function () { module.verbose('Adding clickaway events to context', $context); $context .on('click' + elementNamespace, module.event.clickaway) .on('touchend' + elementNamespace, module.event.clickaway) ; }, scrollLock: function () { if (settings.scrollLock) { module.debug('Disabling page scroll'); hadScrollbar = module.has.scrollbar(); if (hadScrollbar) { module.save.bodyMargin(); module.set.bodyMargin(); } $context.addClass(className.locked); } module.verbose('Adding events to contain sidebar scroll'); $document .on('touchmove' + elementNamespace, module.event.touch) ; $module .on('scroll' + eventNamespace, module.event.containScroll) ; }, }, unbind: { clickaway: function () { module.verbose('Removing clickaway events from context', $context); $context.off(elementNamespace); }, scrollLock: function () { module.verbose('Removing scroll lock from page'); if (hadScrollbar) { module.restore.bodyMargin(); } $context.removeClass(className.locked); $document.off(elementNamespace); $module.off('scroll' + eventNamespace); }, }, add: { inlineCSS: function () { var width = module.cache.width || $module.outerWidth(), height = module.cache.height || $module.outerHeight(), isRTL = module.is.rtl(), direction = module.get.direction(), distance = { left: width, right: -width, top: height, bottom: -height, }, style ; if (isRTL) { module.verbose('RTL detected, flipping widths'); distance.left = -width; distance.right = width; } style = '<style>'; if (direction === 'left' || direction === 'right') { module.debug('Adding CSS rules for animation distance', width); style += '' + ' .ui.visible.' + direction + '.sidebar ~ .fixed,' + ' .ui.visible.' + direction + '.sidebar ~ .pusher {' + ' transform: translate3d(' + distance[direction] + 'px, 0, 0);' + ' }'; } else if (direction === 'top' || direction === 'bottom') { style += '' + ' .ui.visible.' + direction + '.sidebar ~ .fixed,' + ' .ui.visible.' + direction + '.sidebar ~ .pusher {' + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);' + ' }'; } /* IE is only browser not to create context with transforms */ /* https://www.w3.org/Bugs/Public/show_bug.cgi?id=16328 */ if (module.is.ie()) { if (direction === 'left' || direction === 'right') { module.debug('Adding CSS rules for animation distance', width); style += '' + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher::after {' + ' transform: translate3d(' + distance[direction] + 'px, 0, 0);' + ' }'; } else if (direction === 'top' || direction === 'bottom') { style += '' + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher::after {' + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);' + ' }'; } /* opposite sides visible forces content overlay */ style += '' + ' body.pushable > .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher::after,' + ' body.pushable > .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher::after {' + ' transform: translate3d(0, 0, 0);' + ' }'; } style += '</style>'; $style = $(style) .appendTo($head) ; module.debug('Adding sizing css to head', $style); }, }, refresh: function () { module.verbose('Refreshing selector cache'); $context = contextCheck(settings.context, window); module.refreshSidebars(); $pusher = $context.children(selector.pusher); $fixed = $context.children(selector.fixed); module.clear.cache(); }, refreshSidebars: function () { module.verbose('Refreshing other sidebars'); $sidebars = $context.children(selector.sidebar); }, repaint: function () { module.verbose('Forcing repaint event'); element.style.display = 'none'; var ignored = element.offsetHeight; element.scrollTop = element.scrollTop; // eslint-disable-line no-self-assign element.style.display = ''; }, setup: { cache: function () { module.cache = { width: $module.outerWidth(), height: $module.outerHeight(), }; }, layout: function () { if ($context.children(selector.pusher).length === 0) { module.debug('Adding wrapper element for sidebar'); module.error(error.pusher); $pusher = $('<div class="pusher" />'); $context .children() .not(selector.omitted) .not($sidebars) .wrapAll($pusher) ; module.refresh(); } if ($module.nextAll(selector.pusher).length === 0 || $module.nextAll(selector.pusher)[0] !== $pusher[0]) { module.debug('Moved sidebar to correct parent element'); module.error(error.movedSidebar, element); $module.detach().prependTo($context); module.refresh(); } module.clear.cache(); module.set.pushable(); module.set.direction(); }, }, attachEvents: function (selector, event) { var $toggle = $(selector) ; event = isFunction(module[event]) ? module[event] : module.toggle; if ($toggle.length > 0) { module.debug('Attaching sidebar events to element', selector, event); $toggle .on('click' + eventNamespace, event) ; } else { module.error(error.notFound, selector); } }, can: { leftBodyScrollbar: function () { if (module.cache.leftBodyScrollbar === undefined) { module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie()); } return module.cache.leftBodyScrollbar; }, }, save: { bodyMargin: function () { initialBodyMargin = $context.css((isBody ? 'margin-' : 'padding-') + (module.can.leftBodyScrollbar() ? 'left' : 'right')); var bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\d.]/g, ''), 10), bodyScrollbarWidth = isBody ? window.innerWidth - document.documentElement.clientWidth : $context[0].offsetWidth - $context[0].clientWidth ; tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth; }, }, show: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (module.is.hidden()) { if (settings.onShow.call(element) === false) { module.verbose('Show callback returned false cancelling show'); return; } if (settings.overlay) { module.error(error.overlay); settings.transition = 'overlay'; } module.refresh(); if (module.othersActive()) { module.debug('Other sidebars currently visible'); if (settings.exclusive) { // if not overlay queue animation after hide if (settings.transition !== 'overlay') { module.hideOthers(module.show); return; } module.hideOthers(); } else { settings.transition = 'overlay'; } } module.set.dimmerStyles(); module.pushPage(function () { callback.call(element); settings.onVisible.call(element); }); settings.onChange.call(element); } else { module.debug('Sidebar is already visible'); } }, hide: function (callback) { callback = isFunction(callback) ? callback : function () {}; if ((module.is.visible() || module.is.animating()) && settings.onHide.call(element) !== false) { module.debug('Hiding sidebar', callback); module.refreshSidebars(); module.pullPage(function () { callback.call(element); settings.onHidden.call(element); }); settings.onChange.call(element); } }, othersAnimating: function () { return $sidebars.not($module).filter('.' + className.animating).length > 0; }, othersVisible: function () { return $sidebars.not($module).filter('.' + className.visible).length > 0; }, othersActive: function () { return module.othersVisible() || module.othersAnimating(); }, hideOthers: function (callback) { var $otherSidebars = $sidebars.not($module).filter('.' + className.visible), sidebarCount = $otherSidebars.length, callbackCount = 0 ; callback = callback || function () {}; $otherSidebars .sidebar('hide', function () { callbackCount++; if (callbackCount === sidebarCount) { callback(); } }) ; }, toggle: function () { module.verbose('Determining toggled direction'); if (module.is.hidden()) { module.show(); } else { module.hide(); } }, pushPage: function (callback) { var transition = module.get.transition(), $transition = transition === 'overlay' || module.othersActive() ? $module : $pusher, animate, dim, transitionEnd ; callback = isFunction(callback) ? callback : function () {}; if (settings.returnScroll) { currentScroll = (isBody ? $window : $context).scrollTop(); } if (settings.transition === 'scale down') { module.scrollToTop(); } module.bind.scrollLock(); module.set.transition(transition); module.repaint(); animate = function () { module.bind.clickaway(); module.add.inlineCSS(); module.set.animating(); module.set.visible(); }; dim = function () { module.set.dimmed(); }; transitionEnd = function (event) { if (event.target === $transition[0]) { $transition.off('transitionend' + elementNamespace, transitionEnd); module.remove.animating(); callback.call(element); } }; $transition.off('transitionend' + elementNamespace); $transition.on('transitionend' + elementNamespace, transitionEnd); requestAnimationFrame(animate); if (settings.dimPage && !module.othersVisible()) { requestAnimationFrame(dim); } }, pullPage: function (callback) { var transition = module.get.transition(), $transition = transition === 'overlay' || module.othersActive() ? $module : $pusher, animate, transitionEnd ; callback = isFunction(callback) ? callback : function () {}; module.verbose('Removing context push state', module.get.direction()); module.unbind.clickaway(); module.unbind.scrollLock(); animate = function () { module.set.transition(transition); module.set.animating(); if (settings.dimPage && !module.othersVisible()) { module.set.closing(); } module.remove.visible(); }; transitionEnd = function (event) { if (event.target === $transition[0]) { $transition.off('transitionend' + elementNamespace, transitionEnd); module.remove.animating(); module.remove.closing(); module.remove.transition(); module.remove.inlineCSS(); if (transition === 'scale down' || settings.returnScroll) { module.scrollBack(); } if (settings.dimPage && !module.othersVisible()) { $pusher.removeClass(className.dimmed); } callback.call(element); } }; $transition.off('transitionend' + elementNamespace); $transition.on('transitionend' + elementNamespace, transitionEnd); requestAnimationFrame(animate); }, scrollToTop: function () { module.verbose('Scrolling to top of page to avoid animation issues'); $module.scrollTop(0); (isBody ? $window : $context)[0].scrollTo(0, 0); }, scrollBack: function () { module.verbose('Scrolling back to original page position'); (isBody ? $window : $context)[0].scrollTo(0, currentScroll); }, clear: { cache: function () { module.verbose('Clearing cached dimensions'); module.cache = {}; }, }, set: { bodyMargin: function () { var position = module.can.leftBodyScrollbar() ? 'left' : 'right'; $context.css((isBody ? 'margin-' : 'padding-') + position, tempBodyMargin + 'px'); $context.find(selector.bodyFixed.replace('right', position)).each(function () { var el = $(this), attribute = el.css('position') === 'fixed' ? 'padding-' + position : position ; el.css(attribute, 'calc(' + el.css(attribute) + ' + ' + tempBodyMargin + 'px)'); }); }, dimmerStyles: function () { if (settings.blurring) { $pusher.addClass(className.blurring); } else { $pusher.removeClass(className.blurring); } }, // container pushed: function () { $context.addClass(className.pushed); }, pushable: function () { $context.addClass(className.pushable); }, // pusher dimmed: function () { $pusher.addClass(className.dimmed); }, // sidebar active: function () { $module.addClass(className.active); }, animating: function () { $module.addClass(className.animating); }, closing: function () { $pusher.addClass(className.closing); }, transition: function (transition) { transition = transition || module.get.transition(); $module.addClass(transition); }, direction: function (direction) { direction = direction || module.get.direction(); $module.addClass(className[direction]); }, visible: function () { $module.addClass(className.visible); }, overlay: function () { $module.addClass(className.overlay); }, }, remove: { inlineCSS: function () { module.debug('Removing inline css styles', $style); if ($style && $style.length > 0) { $style.remove(); } }, // context pushed: function () { $context.removeClass(className.pushed); }, pushable: function () { $context.removeClass(className.pushable); }, // sidebar active: function () { $module.removeClass(className.active); }, animating: function () { $module.removeClass(className.animating); }, closing: function () { $pusher.removeClass(className.closing); }, transition: function (transition) { transition = transition || module.get.transition(); $module.removeClass(transition); }, direction: function (direction) { direction = direction || module.get.direction(); $module.removeClass(className[direction]); }, visible: function () { $module.removeClass(className.visible); }, overlay: function () { $module.removeClass(className.overlay); }, }, restore: { bodyMargin: function () { var position = module.can.leftBodyScrollbar() ? 'left' : 'right'; $context.css((isBody ? 'margin-' : 'padding-') + position, initialBodyMargin); $context.find(selector.bodyFixed.replace('right', position)).each(function () { var el = $(this), attribute = el.css('position') === 'fixed' ? 'padding-' + position : position ; el.css(attribute, ''); }); }, }, get: { direction: function () { if ($module.hasClass(className.top)) { return className.top; } if ($module.hasClass(className.right)) { return className.right; } if ($module.hasClass(className.bottom)) { return className.bottom; } return className.left; }, transition: function () { var direction = module.get.direction(), transition ; transition = module.is.mobile() ? (settings.mobileTransition === 'auto' ? settings.defaultTransition.mobile[direction] : settings.mobileTransition) : (settings.transition === 'auto' ? settings.defaultTransition.computer[direction] : settings.transition); module.verbose('Determined transition', transition); return transition; }, }, has: { scrollbar: function () { return isBody || $context.css('overflow-y') !== 'hidden'; }, }, is: { safari: function () { if (module.cache.isSafari === undefined) { module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession; } return module.cache.isSafari; }, edge: function () { if (module.cache.isEdge === undefined) { module.cache.isEdge = !!window.setImmediate && !module.is.ie(); } return module.cache.isEdge; }, firefox: function () { if (module.cache.isFirefox === undefined) { module.cache.isFirefox = !!window.InstallTrigger; } return module.cache.isFirefox; }, iframe: function () { return !(self === top); }, ie: function () { if (module.cache.isIE === undefined) { var isIE11 = !window.ActiveXObject && 'ActiveXObject' in window, isIE = 'ActiveXObject' in window ; module.cache.isIE = isIE11 || isIE; } return module.cache.isIE; }, mobile: function () { var userAgent = navigator.userAgent, isMobile = userAgent.match(regExp.mobile) ; if (isMobile) { module.verbose('Browser was found to be mobile', userAgent); return true; } module.verbose('Browser is not mobile, using regular transition', userAgent); return false; }, hidden: function () { return !module.is.visible(); }, visible: function () { return $module.hasClass(className.visible); }, // alias open: function () { return module.is.visible(); }, closed: function () { return module.is.hidden(); }, vertical: function () { return $module.hasClass(className.top); }, animating: function () { return $context.hasClass(className.animating); }, rtl: function () { if (module.cache.isRTL === undefined) { module.cache.isRTL = $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl' || $body.attr('dir') === 'rtl' || $body.css('direction') === 'rtl' || $context.attr('dir') === 'rtl' || $context.css('direction') === 'rtl'; } return module.cache.isRTL; }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { module.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.sidebar.settings = { name: 'Sidebar', namespace: 'sidebar', silent: false, debug: false, verbose: false, performance: true, transition: 'auto', mobileTransition: 'auto', defaultTransition: { computer: { left: 'uncover', right: 'uncover', top: 'overlay', bottom: 'overlay', }, mobile: { left: 'uncover', right: 'uncover', top: 'overlay', bottom: 'overlay', }, }, context: 'body', exclusive: false, closable: true, dimPage: true, scrollLock: false, returnScroll: false, delaySetup: false, onChange: function () {}, onShow: function () {}, onHide: function () {}, onHidden: function () {}, onVisible: function () {}, className: { active: 'active', animating: 'animating', blurring: 'blurring', closing: 'closing', dimmed: 'dimmed', locked: 'locked', pushable: 'pushable', pushed: 'pushed', right: 'right', top: 'top', left: 'left', bottom: 'bottom', visible: 'visible', }, selector: { bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.fixed.nag, > .ui.fixed.nag > .close', fixed: '.fixed', omitted: 'script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed', pusher: '.pusher', sidebar: '.ui.sidebar', }, regExp: { mobile: /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/g, }, error: { method: 'The method you called is not defined.', pusher: 'Had to add pusher element. For optimal performance make sure body content is inside a pusher element', movedSidebar: 'Had to move sidebar. For optimal performance make sure sidebar and pusher are direct children of your body tag', overlay: 'The overlay setting is no longer supported, use animation: overlay', notFound: 'There were no elements that matched the specified selector', }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/site.css ================================================ /*! * # Fomantic-UI 2.9.4 - Site * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Page *******************************/ @font-face { font-family: "Lato"; src: url("./../themes/default/assets/fonts/LatoLatin-Regular.woff2") format("woff2") , url("./../themes/default/assets/fonts/LatoLatin-Regular.woff") format("woff"); font-style: normal; font-weight: normal; font-display: swap; text-rendering: optimizeLegibility; unicode-range: U+0000, U+000D, U+0020-007E, U+00A0-017F, U+0192, U+0218-021B, U+0237, U+02C6-02C7, U+02C9, U+02D8-02DD, U+0394, U+03A9, U+03BC, U+03C0, U+1E80-1E85, U+2010, U+2013-2014, U+2018-201A, U+201C-201E, U+2020-2022, U+2026, U+2030, U+2039-203A, U+2044, U+20A3-20A4, U+20A7, U+20AC, U+2113, U+2122, U+2126, U+212E, U+2202, U+2206, U+220F, U+2211-2212, U+2215, U+2219-221A, U+221E, U+222B, U+2248, U+2260, U+2264-2265, U+25CA, U+F8FF, U+FB00-FB04; } @font-face { font-family: "Lato"; src: url("./../themes/default/assets/fonts/LatoLatin-Bold.woff2") format("woff2") , url("./../themes/default/assets/fonts/LatoLatin-Bold.woff") format("woff"); font-style: normal; font-weight: bold; font-display: swap; text-rendering: optimizeLegibility; unicode-range: U+0000, U+000D, U+0020-007E, U+00A0-017F, U+0192, U+0218-021B, U+0237, U+02C6-02C7, U+02C9, U+02D8-02DD, U+0394, U+03A9, U+03BC, U+03C0, U+1E80-1E85, U+2010, U+2013-2014, U+2018-201A, U+201C-201E, U+2020-2022, U+2026, U+2030, U+2039-203A, U+2044, U+20A3-20A4, U+20A7, U+20AC, U+2113, U+2122, U+2126, U+212E, U+2202, U+2206, U+220F, U+2211-2212, U+2215, U+2219-221A, U+221E, U+222B, U+2248, U+2260, U+2264-2265, U+25CA, U+F8FF, U+FB00-FB04; } @font-face { font-family: "Lato"; src: url("./../themes/default/assets/fonts/LatoLatin-Italic.woff2") format("woff2") , url("./../themes/default/assets/fonts/LatoLatin-Italic.woff") format("woff"); font-style: italic; font-weight: normal; font-display: swap; text-rendering: optimizeLegibility; unicode-range: U+0000, U+000D, U+0020-007E, U+00A0-017F, U+0192, U+0218-021B, U+0237, U+02C6-02C7, U+02C9, U+02D8-02DD, U+0394, U+03A9, U+03BC, U+03C0, U+1E80-1E85, U+2010, U+2013-2014, U+2018-201A, U+201C-201E, U+2020-2022, U+2026, U+2030, U+2039-203A, U+2044, U+20A3-20A4, U+20A7, U+20AC, U+2113, U+2122, U+2126, U+212E, U+2202, U+2206, U+220F, U+2211-2212, U+2215, U+2219-221A, U+221E, U+222B, U+2248, U+2260, U+2264-2265, U+25CA, U+F8FF, U+FB00-FB04; } @font-face { font-family: "Lato"; src: url("./../themes/default/assets/fonts/LatoLatin-BoldItalic.woff2") format("woff2") , url("./../themes/default/assets/fonts/LatoLatin-BoldItalic.woff") format("woff"); font-style: italic; font-weight: bold; font-display: swap; text-rendering: optimizeLegibility; unicode-range: U+0000, U+000D, U+0020-007E, U+00A0-017F, U+0192, U+0218-021B, U+0237, U+02C6-02C7, U+02C9, U+02D8-02DD, U+0394, U+03A9, U+03BC, U+03C0, U+1E80-1E85, U+2010, U+2013-2014, U+2018-201A, U+201C-201E, U+2020-2022, U+2026, U+2030, U+2039-203A, U+2044, U+20A3-20A4, U+20A7, U+20AC, U+2113, U+2122, U+2126, U+212E, U+2202, U+2206, U+220F, U+2211-2212, U+2215, U+2219-221A, U+221E, U+222B, U+2248, U+2260, U+2264-2265, U+25CA, U+F8FF, U+FB00-FB04; } @font-face { font-family: "Lato"; src: url("./../themes/default/assets/fonts/Lato-Regular.woff2") format("woff2") , url("./../themes/default/assets/fonts/Lato-Regular.woff") format("woff"); font-style: normal; font-weight: normal; font-display: swap; text-rendering: optimizeLegibility; unicode-range: U+0180-0191, U+0193-0217, U+021C-0236, U+0238-02C5, U+02C8, U+02CA-02D7, U+02DE-036F, U+0374-0375, U+037A-037E, U+0384-038A, U+038C, U+038E-0393, U+0395-03A1, U+03A3-03A8, U+03AA-03BB, U+03BD-03BF, U+03C1-03CE, U+03D0-0486, U+0488-0513, U+1D00-1DCA, U+1DFE-1E7F, U+1E86-1E9B, U+1E9E, U+1EA0-1EF9, U+1F00-1F15, U+1F18-1F1D, U+1F20-1F45, U+1F48-1F4D, U+1F50-1F57, U+1F59, U+1F5B, U+1F5D, U+1F5F-1F7D, U+1F80-1FB4, U+1FB6-1FC4, U+1FC6-1FD3, U+1FD6-1FDB, U+1FDD-1FEF, U+1FF2-1FF4, U+1FF6-1FFE, U+2000-200F, U+2012, U+2015-2017, U+201B, U+201F, U+202F, U+2034, U+203C-203E, U+205E-205F, U+2070-2071, U+2074-2094, U+20A0-20A2, U+20A5-20A6, U+20A8-20AB, U+20AD-20B5, U+20B8-20BA, U+20DD, U+2105, U+2116-2117, U+2120, U+2132, U+214D-214E, U+2153-215F, U+2183-2184, U+2190-2199, U+21A8, U+221F, U+2229, U+2261, U+2302, U+2310, U+2320-2321, U+2460-2473, U+24EA-24F4, U+24FF-2500, U+2502, U+250C, U+2510, U+2514, U+2518, U+2C60-2C6C, U+2C74-2C77; } @font-face { font-family: "Lato"; src: url("./../themes/default/assets/fonts/Lato-Bold.woff2") format("woff2") , url("./../themes/default/assets/fonts/Lato-Bold.woff") format("woff"); font-style: normal; font-weight: bold; font-display: swap; text-rendering: optimizeLegibility; unicode-range: U+0180-0191, U+0193-0217, U+021C-0236, U+0238-02C5, U+02C8, U+02CA-02D7, U+02DE-036F, U+0374-0375, U+037A-037E, U+0384-038A, U+038C, U+038E-0393, U+0395-03A1, U+03A3-03A8, U+03AA-03BB, U+03BD-03BF, U+03C1-03CE, U+03D0-0486, U+0488-0513, U+1D00-1DCA, U+1DFE-1E7F, U+1E86-1E9B, U+1E9E, U+1EA0-1EF9, U+1F00-1F15, U+1F18-1F1D, U+1F20-1F45, U+1F48-1F4D, U+1F50-1F57, U+1F59, U+1F5B, U+1F5D, U+1F5F-1F7D, U+1F80-1FB4, U+1FB6-1FC4, U+1FC6-1FD3, U+1FD6-1FDB, U+1FDD-1FEF, U+1FF2-1FF4, U+1FF6-1FFE, U+2000-200F, U+2012, U+2015-2017, U+201B, U+201F, U+202F, U+2034, U+203C-203E, U+205E-205F, U+2070-2071, U+2074-2094, U+20A0-20A2, U+20A5-20A6, U+20A8-20AB, U+20AD-20B5, U+20B8-20BA, U+20DD, U+2105, U+2116-2117, U+2120, U+2132, U+214D-214E, U+2153-215F, U+2183-2184, U+2190-2199, U+21A8, U+221F, U+2229, U+2261, U+2302, U+2310, U+2320-2321, U+2460-2473, U+24EA-24F4, U+24FF-2500, U+2502, U+250C, U+2510, U+2514, U+2518, U+2C60-2C6C, U+2C74-2C77; } @font-face { font-family: "Lato"; src: url("./../themes/default/assets/fonts/Lato-Italic.woff2") format("woff2") , url("./../themes/default/assets/fonts/Lato-Italic.woff") format("woff"); font-style: italic; font-weight: normal; font-display: swap; text-rendering: optimizeLegibility; unicode-range: U+0180-0191, U+0193-0217, U+021C-0236, U+0238-02C5, U+02C8, U+02CA-02D7, U+02DE-036F, U+0374-0375, U+037A-037E, U+0384-038A, U+038C, U+038E-0393, U+0395-03A1, U+03A3-03A8, U+03AA-03BB, U+03BD-03BF, U+03C1-03CE, U+03D0-0486, U+0488-0513, U+1D00-1DCA, U+1DFE-1E7F, U+1E86-1E9B, U+1E9E, U+1EA0-1EF9, U+1F00-1F15, U+1F18-1F1D, U+1F20-1F45, U+1F48-1F4D, U+1F50-1F57, U+1F59, U+1F5B, U+1F5D, U+1F5F-1F7D, U+1F80-1FB4, U+1FB6-1FC4, U+1FC6-1FD3, U+1FD6-1FDB, U+1FDD-1FEF, U+1FF2-1FF4, U+1FF6-1FFE, U+2000-200F, U+2012, U+2015-2017, U+201B, U+201F, U+202F, U+2034, U+203C-203E, U+205E-205F, U+2070-2071, U+2074-2094, U+20A0-20A2, U+20A5-20A6, U+20A8-20AB, U+20AD-20B5, U+20B8-20BA, U+20DD, U+2105, U+2116-2117, U+2120, U+2132, U+214D-214E, U+2153-215F, U+2183-2184, U+2190-2199, U+21A8, U+221F, U+2229, U+2261, U+2302, U+2310, U+2320-2321, U+2460-2473, U+24EA-24F4, U+24FF-2500, U+2502, U+250C, U+2510, U+2514, U+2518, U+2C60-2C6C, U+2C74-2C77; } @font-face { font-family: "Lato"; src: url("./../themes/default/assets/fonts/Lato-BoldItalic.woff2") format("woff2") , url("./../themes/default/assets/fonts/Lato-BoldItalic.woff") format("woff"); font-style: italic; font-weight: bold; font-display: swap; text-rendering: optimizeLegibility; unicode-range: U+0180-0191, U+0193-0217, U+021C-0236, U+0238-02C5, U+02C8, U+02CA-02D7, U+02DE-036F, U+0374-0375, U+037A-037E, U+0384-038A, U+038C, U+038E-0393, U+0395-03A1, U+03A3-03A8, U+03AA-03BB, U+03BD-03BF, U+03C1-03CE, U+03D0-0486, U+0488-0513, U+1D00-1DCA, U+1DFE-1E7F, U+1E86-1E9B, U+1E9E, U+1EA0-1EF9, U+1F00-1F15, U+1F18-1F1D, U+1F20-1F45, U+1F48-1F4D, U+1F50-1F57, U+1F59, U+1F5B, U+1F5D, U+1F5F-1F7D, U+1F80-1FB4, U+1FB6-1FC4, U+1FC6-1FD3, U+1FD6-1FDB, U+1FDD-1FEF, U+1FF2-1FF4, U+1FF6-1FFE, U+2000-200F, U+2012, U+2015-2017, U+201B, U+201F, U+202F, U+2034, U+203C-203E, U+205E-205F, U+2070-2071, U+2074-2094, U+20A0-20A2, U+20A5-20A6, U+20A8-20AB, U+20AD-20B5, U+20B8-20BA, U+20DD, U+2105, U+2116-2117, U+2120, U+2132, U+214D-214E, U+2153-215F, U+2183-2184, U+2190-2199, U+21A8, U+221F, U+2229, U+2261, U+2302, U+2310, U+2320-2321, U+2460-2473, U+24EA-24F4, U+24FF-2500, U+2502, U+250C, U+2510, U+2514, U+2518, U+2C60-2C6C, U+2C74-2C77; } html, body { height: 100%; } html { font-size: 14px; } body { margin: 0; padding: 0; overflow-x: hidden; min-width: 320px; background: #fff; font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 14px; line-height: 1.4285em; color: rgba(0, 0, 0, 0.87); } /******************************* Headers *******************************/ h1, h2, h3, h4, h5 { font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; line-height: 1.28571429em; margin: calc(2rem - 0.1428571428571429em) 0 1rem; font-weight: bold; padding: 0; } h1 { min-height: 1rem; font-size: 2rem; } h2 { font-size: 1.71428571rem; } h3 { font-size: 1.28571429rem; } h4 { font-size: 1.07142857rem; } h5 { font-size: 1rem; } h1:first-child, h2:first-child, h3:first-child, h4:first-child, h5:first-child { margin-top: 0; } h1:last-child, h2:last-child, h3:last-child, h4:last-child, h5:last-child { margin-bottom: 0; } /******************************* Text *******************************/ p { margin: 0 0 1em; line-height: 1.4285em; } p:first-child { margin-top: 0; } p:last-child { margin-bottom: 0; } /* ------------------- Links -------------------- */ a { color: #4183c4; text-decoration: none; } a:hover { color: #1e70bf; text-decoration: none; } /******************************* Scrollbars *******************************/ /* Force Simple Scrollbars */ body ::-webkit-scrollbar { -webkit-appearance: none; width: 10px; height: 10px; } body ::-webkit-scrollbar-track { background: rgba(0, 0, 0, 0.1); border-radius: 0; } body ::-webkit-scrollbar-thumb { cursor: pointer; border-radius: 5px; background: rgba(0, 0, 0, 0.25); -webkit-transition: color 0.2s ease; transition: color 0.2s ease; } body ::-webkit-scrollbar-thumb:window-inactive { background: rgba(0, 0, 0, 0.15); } body ::-webkit-scrollbar-thumb:hover { background: rgba(128, 135, 139, 0.8); } body .ui { /* IE11 */ scrollbar-face-color: #bfbfbf; scrollbar-shadow-color: #bfbfbf; scrollbar-track-color: #e6e6e6; scrollbar-arrow-color: #e6e6e6; } @supports (-moz-appearance: none) { body .ui { /* firefox: first color thumb, second track */ scrollbar-color: rgba(0, 0, 0, 0.25) rgba(0, 0, 0, 0.1); scrollbar-width: thin; } } /* Inverted UI */ body .ui.inverted:not(.dimmer)::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.1); } body .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.25); } body .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb:window-inactive { background: rgba(255, 255, 255, 0.15); } body .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.35); } body .ui.inverted:not(.dimmer) { /* IE11 */ scrollbar-face-color: #656565; scrollbar-shadow-color: #656565; scrollbar-track-color: #323232; scrollbar-arrow-color: #323232; } @supports (-moz-appearance: none) { body .ui.inverted:not(.dimmer) { /* firefox: first color thumb, second track */ scrollbar-color: rgba(255, 255, 255, 0.25) rgba(255, 255, 255, 0.1); } } /******************************* Highlighting *******************************/ /* Site */ ::selection { background-color: #cce2ff; color: rgba(0, 0, 0, 0.87); } /* Form */ textarea::selection, input::selection { background-color: rgba(100, 100, 100, 0.4); color: rgba(0, 0, 0, 0.87); } /******************************* Global Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/site.js ================================================ /*! * # Fomantic-UI 2.9.4 - Site * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.site = function (parameters) { var time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.site.settings, parameters) : $.extend({}, $.site.settings), namespace = settings.namespace, error = settings.error, moduleNamespace = 'module-' + namespace, $document = $(document), $module = $document, element = this, instance = $module.data(moduleNamespace), module, returnedValue ; module = { initialize: function () { module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of site', module); instance = module; $module .data(moduleNamespace, module) ; }, normalize: function () { // keep the function for backward compatibility // eslint-disable-next-line no-useless-return return; }, fix: { consoleClear: function () { module.debug('Disabling programmatic console clearing'); window.console.clear = function () {}; }, }, moduleExists: function (name) { return $.fn[name] !== undefined && $.fn[name].settings !== undefined; }, enabled: { modules: function (modules) { var enabledModules = [] ; modules = modules || settings.modules; $.each(modules, function (index, name) { if (module.moduleExists(name)) { enabledModules.push(name); } }); return enabledModules; }, }, disabled: { modules: function (modules) { var disabledModules = [] ; modules = modules || settings.modules; $.each(modules, function (index, name) { if (!module.moduleExists(name)) { disabledModules.push(name); } }); return disabledModules; }, }, change: { setting: function (setting, value, modules, modifyExisting) { modules = typeof modules === 'string' ? (modules === 'all' ? settings.modules : [modules]) : modules || settings.modules; modifyExisting = modifyExisting !== undefined ? modifyExisting : true; $.each(modules, function (index, name) { var namespace = module.moduleExists(name) ? $.fn[name].settings.namespace || false : true, $existingModules ; if (module.moduleExists(name)) { module.verbose('Changing default setting', setting, value, name); $.fn[name].settings[setting] = value; if (modifyExisting && namespace) { $existingModules = $(':data(module-' + namespace + ')'); if ($existingModules.length > 0) { module.verbose('Modifying existing settings', $existingModules); $existingModules[name]('setting', setting, value); } } } }); }, settings: function (newSettings, modules, modifyExisting) { modules = typeof modules === 'string' ? [modules] : modules || settings.modules; modifyExisting = modifyExisting !== undefined ? modifyExisting : true; $.each(modules, function (index, name) { var $existingModules ; if (module.moduleExists(name)) { module.verbose('Changing default setting', newSettings, name); $.extend(true, $.fn[name].settings, newSettings); if (modifyExisting && namespace) { $existingModules = $(':data(module-' + namespace + ')'); if ($existingModules.length > 0) { module.verbose('Modifying existing settings', $existingModules); $existingModules[name]('setting', newSettings); } } } }); }, }, enable: { console: function () { module.console(true); }, debug: function (modules, modifyExisting) { modules = modules || settings.modules; module.debug('Enabling debug for modules', modules); module.change.setting('debug', true, modules, modifyExisting); }, verbose: function (modules, modifyExisting) { modules = modules || settings.modules; module.debug('Enabling verbose debug for modules', modules); module.change.setting('verbose', true, modules, modifyExisting); }, }, disable: { console: function () { module.console(false); }, debug: function (modules, modifyExisting) { modules = modules || settings.modules; module.debug('Disabling debug for modules', modules); module.change.setting('debug', false, modules, modifyExisting); }, verbose: function (modules, modifyExisting) { modules = modules || settings.modules; module.debug('Disabling verbose debug for modules', modules); module.change.setting('verbose', false, modules, modifyExisting); }, }, console: function (enable) { if (enable) { if (instance.cache.console === undefined) { module.error(error.console); return; } module.debug('Restoring console function'); window.console = instance.cache.console; } else { module.debug('Disabling console function'); instance.cache.console = window.console; window.console = { clear: function () {}, error: function () {}, group: function () {}, groupCollapsed: function () {}, groupEnd: function () {}, info: function () {}, log: function () {}, table: function () {}, warn: function () {}, }; } }, destroy: function () { module.verbose('Destroying previous site for', $module); $module .removeData(moduleNamespace) ; }, cache: {}, setting: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { settings[name] = value; } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Element: element, Name: message[0], Arguments: [].slice.call(message, 1) || '', 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { module.destroy(); } module.initialize(); } return returnedValue !== undefined ? returnedValue : this; }; $.site = $.fn.site; $.site.settings = { name: 'Site', namespace: 'site', error: { console: 'Console cannot be restored, most likely it was overwritten outside of module', method: 'The method you called is not defined.', }, debug: false, verbose: false, performance: true, modules: [ 'accordion', 'api', 'calendar', 'checkbox', 'dimmer', 'dropdown', 'embed', 'flyout', 'form', 'modal', 'nag', 'popup', 'progress', 'rating', 'search', 'shape', 'sidebar', 'slider', 'state', 'sticky', 'tab', 'toast', 'transition', 'visibility', ], siteNamespace: 'site', namespaceStub: { cache: {}, config: {}, sections: {}, section: {}, utilities: {}, }, }; // allows for selection of elements with data attributes $.extend($.expr.pseudos, { data: $.expr.createPseudo(function (dataName) { return function (elem) { return !!$.data(elem, dataName); }; }), }); })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/slider.css ================================================ /*! * # Fomantic-UI 2.9.4 - Slider * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ .ui.slider:not(.vertical):not(.checkbox) { width: 100%; padding: 1em 0.5em; } .ui.slider:not(.checkbox) { position: relative; } .ui.slider:not(.checkbox):focus { outline: 0; } .ui.slider .inner { position: relative; z-index: 2; } .ui.slider:not(.vertical) .inner { height: 1.5em; } .ui.slider .inner:hover { cursor: auto; } .ui.slider .inner .track { position: absolute; border-radius: 4px; background-color: rgba(0, 0, 0, 0.05); } .ui.slider:not(.vertical) .inner .track { width: 100%; height: 0.4em; top: 0.55em; left: 0; } .ui.slider .inner .track-fill { position: absolute; border-radius: 4px; background-color: #1b1c1d; } .ui.slider:not(.vertical) .inner .track-fill { height: 0.4em; top: 0.55em; left: 0; } .ui.slider .inner .thumb { position: absolute; left: 0; top: 0; height: 1.5em; width: 1.5em; background: #fff linear-gradient(transparent, rgba(0, 0, 0, 0.05)); border-radius: 100%; box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), 0 0 0 1px rgba(34, 36, 38, 0.15) inset; transition: background 0.3s ease; } .ui.slider:not(.disabled) .inner .thumb:hover { cursor: pointer; background: #f2f2f2 linear-gradient(transparent, rgba(0, 0, 0, 0.05)); } .ui.slider:not(.disabled):focus .inner .thumb { background: #f2f2f2 linear-gradient(transparent, rgba(0, 0, 0, 0.05)); } /******************************* States *******************************/ /* -------------- Disabled --------------- */ .ui.disabled.slider:not(.checkbox) { opacity: 0.5; } .ui.disabled.slider .inner:hover { cursor: auto; } .ui.disabled.slider .inner .track-fill { background: #ccc; } /* -------------- Reversed --------------- */ .ui.reversed.slider .inner .track-fill { left: auto; right: 0; } .ui.reversed.slider:not(.vertical) .inner .thumb { left: auto; right: 0; } .ui.reversed.vertical.slider .inner .thumb { left: 0.03em; } .ui.labeled.reversed.slider > .labels .label { transform: translate(-100%, -100%); } /******************************* Variations *******************************/ /* -------------- Vertical --------------- */ .ui.vertical.slider { height: 100%; width: 1.5em; padding: 0.5em 1em; } .ui.vertical.slider .inner { height: 100%; } .ui.vertical.slider .inner .track { height: 100%; width: 0.4em; left: 0.55em; top: 0; } .ui.vertical.slider .inner .track-fill { width: 0.4em; left: 0.55em; top: 0; } /* Vertical Reversed */ .ui.vertical.reversed.slider .inner .thumb { top: auto; bottom: 0; } .ui.vertical.reversed.slider .inner .track-fill { top: auto; bottom: 0; } /* -------------- Labeled --------------- */ .ui.labeled.slider > .labels { height: 1.5em; width: auto; margin: 0; padding: 0; position: absolute; top: 50%; left: 0; right: 0; } .ui.labeled.slider:not(.vertical) > .labels { transform: translateY(-50%); } .ui.labeled.slider > .labels .label { display: inline-flex; position: absolute; transform: translate(-50%, -100%); white-space: nowrap; } .ui.labeled.slider > .labels .label:not(.ui) { padding: 0.2em 0; } .ui.bottom.aligned.labeled.slider > .labels .label { bottom: 0; transform: translate(-50%, 100%); } .ui.labeled.ticked.slider > .labels .label::after { content: " "; height: 1.5em; width: 1px; background: #ccc; position: absolute; top: 100%; left: 50%; } .ui.bottom.aligned.labeled.ticked.slider > .labels .label::after { top: auto; bottom: 100%; } .ui.labeled.slider.bottom.aligned .labels .ui.label { margin-bottom: -0.5em; } .ui.labeled.ticked.slider.bottom.aligned .labels .ui.label::after { margin-bottom: 0.5em; } .ui.labeled.ticked.slider > .labels .halftick.label::after { height: 0.75em; } .ui.inverted.labeled.ticked.slider > .labels .label::after { background: #333; } .ui.labeled.slider:not(.vertical):not(.bottom) .labels .ui.label { margin-top: -0.5em; } .ui.labeled.ticked.slider:not(.vertical):not(.bottom) .labels .ui.label::after { margin-top: 0.5em; } .ui.labeled.ticked.slider:not(.vertical) > .labels .ui.label::after { height: 2em; } /* Vertical Labels */ .ui.labeled.vertical.slider > .labels { width: 1.5em; height: auto; left: 50%; top: 0; bottom: 0; transform: translateX(-50%); } .ui.labeled.vertical.slider > .labels .label { transform: translate(-100%, -50%); } .ui.labeled.vertical.slider > .labels .label::after { width: 1.5em; height: 1px; left: 100%; top: 50%; } .ui.labeled.vertical.slider > .labels .halftick.label::after { width: 0.75em; height: 1px; } .ui.labeled.vertical.slider:not(.right) > .labels .halftick.label::after { margin-left: 0.6em; } /* Vertical Reversed Labels */ .ui.labeled.vertical.reversed.slider > .labels .label { transform: translate(-100%, 50%); } .ui.labeled.ticked.vertical.slider:not(.right) > .labels .ui.label::after { margin-left: 0.3em; } .ui.labeled.vertical.right.aligned.slider > .labels { transform: translateX(50%); left: calc(100% + 0.6em); } .ui.labeled.vertical.right.aligned.slider > .labels .label { transform: translate(100%, -50%); right: 100%; } .ui.labeled.vertical.right.aligned.slider > .labels .label::after { right: 100%; left: auto; } .ui.labeled.vertical.right.aligned.slider > .labels .halftick.label::after { margin-right: 0.6em; } .ui.labeled.vertical.reversed.right.aligned.slider > .labels .label { transform: translate(100%, 50%); } .ui.labeled.ticked.vertical.right.aligned.slider > .labels .ui.label::after { margin-right: 0.3em; } /* -------------- Hover --------------- */ .ui.hover.slider .inner .thumb { opacity: 0; transition: opacity 0.2s linear; } .ui.hover.slider:not(.disabled):hover .inner .thumb, .ui.hover.slider:not(.disabled):focus .inner .thumb { opacity: 1; } /* -------------- Inverted --------------- */ .ui.inverted.slider .inner .track-fill { background-color: #545454; } .ui.inverted.slider .inner .track { background-color: rgba(255, 255, 255, 0.08); } .ui.labeled.slider > .active.labels .label { transition: all 0.2s ease; } .ui.labeled.ticked.slider > .active.labels .active.label::after { background: #1b1c1d; } .ui.inverted.labeled.ticked.slider > .active.labels .active.label::after { background: #545454; } .ui.labeled.ticked.slider > .active.labels .active.label::after, .ui.labeled.slider > .active.labels .label:not(.active) { opacity: 0.6; } /* -------------- Colors --------------- */ /* Standard */ .ui.primary.slider .inner .track-fill { background-color: #2185d0; } .ui.primary.inverted.slider .inner .track-fill { background-color: #54c8ff; } /* Basic */ .ui.primary.slider.basic .inner .thumb { background-color: #2185d0; } .ui.primary.slider.basic .inner .thumb:hover, .ui.primary.slider.basic:focus .inner .thumb { background-color: #1678c2; } /* Basic Inverted */ .ui.primary.inverted.slider.basic .inner .thumb { background-color: #54c8ff; } .ui.primary.inverted.slider.basic .inner .thumb:hover, .ui.primary.inverted.slider.basic:focus .inner .thumb { background-color: #21b8ff; } .ui.primary.labeled.ticked.slider > .active.labels .active.label::after { background-color: #2185d0; } .ui.primary.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #54c8ff; } /* Standard */ .ui.secondary.slider .inner .track-fill { background-color: #1b1c1d; } .ui.secondary.inverted.slider .inner .track-fill { background-color: #545454; } /* Basic */ .ui.secondary.slider.basic .inner .thumb { background-color: #1b1c1d; } .ui.secondary.slider.basic .inner .thumb:hover, .ui.secondary.slider.basic:focus .inner .thumb { background-color: #27292a; } /* Basic Inverted */ .ui.secondary.inverted.slider.basic .inner .thumb { background-color: #545454; } .ui.secondary.inverted.slider.basic .inner .thumb:hover, .ui.secondary.inverted.slider.basic:focus .inner .thumb { background-color: #6e6e6e; } .ui.secondary.labeled.ticked.slider > .active.labels .active.label::after { background-color: #1b1c1d; } .ui.secondary.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #545454; } /* Standard */ .ui.red.slider .inner .track-fill { background-color: #db2828; } .ui.red.inverted.slider .inner .track-fill { background-color: #ff695e; } /* Basic */ .ui.red.slider.basic .inner .thumb { background-color: #db2828; } .ui.red.slider.basic .inner .thumb:hover, .ui.red.slider.basic:focus .inner .thumb { background-color: #d01919; } /* Basic Inverted */ .ui.red.inverted.slider.basic .inner .thumb { background-color: #ff695e; } .ui.red.inverted.slider.basic .inner .thumb:hover, .ui.red.inverted.slider.basic:focus .inner .thumb { background-color: #ff392b; } .ui.red.labeled.ticked.slider > .active.labels .active.label::after { background-color: #db2828; } .ui.red.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #ff695e; } /* Standard */ .ui.orange.slider .inner .track-fill { background-color: #f2711c; } .ui.orange.inverted.slider .inner .track-fill { background-color: #ff851b; } /* Basic */ .ui.orange.slider.basic .inner .thumb { background-color: #f2711c; } .ui.orange.slider.basic .inner .thumb:hover, .ui.orange.slider.basic:focus .inner .thumb { background-color: #f26202; } /* Basic Inverted */ .ui.orange.inverted.slider.basic .inner .thumb { background-color: #ff851b; } .ui.orange.inverted.slider.basic .inner .thumb:hover, .ui.orange.inverted.slider.basic:focus .inner .thumb { background-color: #e76b00; } .ui.orange.labeled.ticked.slider > .active.labels .active.label::after { background-color: #f2711c; } .ui.orange.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #ff851b; } /* Standard */ .ui.yellow.slider .inner .track-fill { background-color: #fbbd08; } .ui.yellow.inverted.slider .inner .track-fill { background-color: #ffe21f; } /* Basic */ .ui.yellow.slider.basic .inner .thumb { background-color: #fbbd08; } .ui.yellow.slider.basic .inner .thumb:hover, .ui.yellow.slider.basic:focus .inner .thumb { background-color: #eaae00; } /* Basic Inverted */ .ui.yellow.inverted.slider.basic .inner .thumb { background-color: #ffe21f; } .ui.yellow.inverted.slider.basic .inner .thumb:hover, .ui.yellow.inverted.slider.basic:focus .inner .thumb { background-color: #ebcd00; } .ui.yellow.labeled.ticked.slider > .active.labels .active.label::after { background-color: #fbbd08; } .ui.yellow.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #ffe21f; } /* Standard */ .ui.olive.slider .inner .track-fill { background-color: #b5cc18; } .ui.olive.inverted.slider .inner .track-fill { background-color: #d9e778; } /* Basic */ .ui.olive.slider.basic .inner .thumb { background-color: #b5cc18; } .ui.olive.slider.basic .inner .thumb:hover, .ui.olive.slider.basic:focus .inner .thumb { background-color: #a7bd0d; } /* Basic Inverted */ .ui.olive.inverted.slider.basic .inner .thumb { background-color: #d9e778; } .ui.olive.inverted.slider.basic .inner .thumb:hover, .ui.olive.inverted.slider.basic:focus .inner .thumb { background-color: #d2e745; } .ui.olive.labeled.ticked.slider > .active.labels .active.label::after { background-color: #b5cc18; } .ui.olive.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #d9e778; } /* Standard */ .ui.green.slider .inner .track-fill { background-color: #21ba45; } .ui.green.inverted.slider .inner .track-fill { background-color: #2ecc40; } /* Basic */ .ui.green.slider.basic .inner .thumb { background-color: #21ba45; } .ui.green.slider.basic .inner .thumb:hover, .ui.green.slider.basic:focus .inner .thumb { background-color: #16ab39; } /* Basic Inverted */ .ui.green.inverted.slider.basic .inner .thumb { background-color: #2ecc40; } .ui.green.inverted.slider.basic .inner .thumb:hover, .ui.green.inverted.slider.basic:focus .inner .thumb { background-color: #1ea92e; } .ui.green.labeled.ticked.slider > .active.labels .active.label::after { background-color: #21ba45; } .ui.green.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #2ecc40; } /* Standard */ .ui.teal.slider .inner .track-fill { background-color: #00b5ad; } .ui.teal.inverted.slider .inner .track-fill { background-color: #6dffff; } /* Basic */ .ui.teal.slider.basic .inner .thumb { background-color: #00b5ad; } .ui.teal.slider.basic .inner .thumb:hover, .ui.teal.slider.basic:focus .inner .thumb { background-color: #009c95; } /* Basic Inverted */ .ui.teal.inverted.slider.basic .inner .thumb { background-color: #6dffff; } .ui.teal.inverted.slider.basic .inner .thumb:hover, .ui.teal.inverted.slider.basic:focus .inner .thumb { background-color: #3affff; } .ui.teal.labeled.ticked.slider > .active.labels .active.label::after { background-color: #00b5ad; } .ui.teal.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #6dffff; } /* Standard */ .ui.blue.slider .inner .track-fill { background-color: #2185d0; } .ui.blue.inverted.slider .inner .track-fill { background-color: #54c8ff; } /* Basic */ .ui.blue.slider.basic .inner .thumb { background-color: #2185d0; } .ui.blue.slider.basic .inner .thumb:hover, .ui.blue.slider.basic:focus .inner .thumb { background-color: #1678c2; } /* Basic Inverted */ .ui.blue.inverted.slider.basic .inner .thumb { background-color: #54c8ff; } .ui.blue.inverted.slider.basic .inner .thumb:hover, .ui.blue.inverted.slider.basic:focus .inner .thumb { background-color: #21b8ff; } .ui.blue.labeled.ticked.slider > .active.labels .active.label::after { background-color: #2185d0; } .ui.blue.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #54c8ff; } /* Standard */ .ui.violet.slider .inner .track-fill { background-color: #6435c9; } .ui.violet.inverted.slider .inner .track-fill { background-color: #a291fb; } /* Basic */ .ui.violet.slider.basic .inner .thumb { background-color: #6435c9; } .ui.violet.slider.basic .inner .thumb:hover, .ui.violet.slider.basic:focus .inner .thumb { background-color: #5829bb; } /* Basic Inverted */ .ui.violet.inverted.slider.basic .inner .thumb { background-color: #a291fb; } .ui.violet.inverted.slider.basic .inner .thumb:hover, .ui.violet.inverted.slider.basic:focus .inner .thumb { background-color: #745aff; } .ui.violet.labeled.ticked.slider > .active.labels .active.label::after { background-color: #6435c9; } .ui.violet.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #a291fb; } /* Standard */ .ui.purple.slider .inner .track-fill { background-color: #a333c8; } .ui.purple.inverted.slider .inner .track-fill { background-color: #dc73ff; } /* Basic */ .ui.purple.slider.basic .inner .thumb { background-color: #a333c8; } .ui.purple.slider.basic .inner .thumb:hover, .ui.purple.slider.basic:focus .inner .thumb { background-color: #9627ba; } /* Basic Inverted */ .ui.purple.inverted.slider.basic .inner .thumb { background-color: #dc73ff; } .ui.purple.inverted.slider.basic .inner .thumb:hover, .ui.purple.inverted.slider.basic:focus .inner .thumb { background-color: #cf40ff; } .ui.purple.labeled.ticked.slider > .active.labels .active.label::after { background-color: #a333c8; } .ui.purple.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #dc73ff; } /* Standard */ .ui.pink.slider .inner .track-fill { background-color: #e03997; } .ui.pink.inverted.slider .inner .track-fill { background-color: #ff8edf; } /* Basic */ .ui.pink.slider.basic .inner .thumb { background-color: #e03997; } .ui.pink.slider.basic .inner .thumb:hover, .ui.pink.slider.basic:focus .inner .thumb { background-color: #e61a8d; } /* Basic Inverted */ .ui.pink.inverted.slider.basic .inner .thumb { background-color: #ff8edf; } .ui.pink.inverted.slider.basic .inner .thumb:hover, .ui.pink.inverted.slider.basic:focus .inner .thumb { background-color: #ff5bd1; } .ui.pink.labeled.ticked.slider > .active.labels .active.label::after { background-color: #e03997; } .ui.pink.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #ff8edf; } /* Standard */ .ui.brown.slider .inner .track-fill { background-color: #a5673f; } .ui.brown.inverted.slider .inner .track-fill { background-color: #d67c1c; } /* Basic */ .ui.brown.slider.basic .inner .thumb { background-color: #a5673f; } .ui.brown.slider.basic .inner .thumb:hover, .ui.brown.slider.basic:focus .inner .thumb { background-color: #975b33; } /* Basic Inverted */ .ui.brown.inverted.slider.basic .inner .thumb { background-color: #d67c1c; } .ui.brown.inverted.slider.basic .inner .thumb:hover, .ui.brown.inverted.slider.basic:focus .inner .thumb { background-color: #b0620f; } .ui.brown.labeled.ticked.slider > .active.labels .active.label::after { background-color: #a5673f; } .ui.brown.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #d67c1c; } /* Standard */ .ui.grey.slider .inner .track-fill { background-color: #767676; } .ui.grey.inverted.slider .inner .track-fill { background-color: #dcddde; } /* Basic */ .ui.grey.slider.basic .inner .thumb { background-color: #767676; } .ui.grey.slider.basic .inner .thumb:hover, .ui.grey.slider.basic:focus .inner .thumb { background-color: #838383; } /* Basic Inverted */ .ui.grey.inverted.slider.basic .inner .thumb { background-color: #dcddde; } .ui.grey.inverted.slider.basic .inner .thumb:hover, .ui.grey.inverted.slider.basic:focus .inner .thumb { background-color: #c2c4c5; } .ui.grey.labeled.ticked.slider > .active.labels .active.label::after { background-color: #767676; } .ui.grey.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #dcddde; } /* Standard */ .ui.black.slider .inner .track-fill { background-color: #1b1c1d; } .ui.black.inverted.slider .inner .track-fill { background-color: #545454; } /* Basic */ .ui.black.slider.basic .inner .thumb { background-color: #1b1c1d; } .ui.black.slider.basic .inner .thumb:hover, .ui.black.slider.basic:focus .inner .thumb { background-color: #27292a; } /* Basic Inverted */ .ui.black.inverted.slider.basic .inner .thumb { background-color: #545454; } .ui.black.inverted.slider.basic .inner .thumb:hover, .ui.black.inverted.slider.basic:focus .inner .thumb { background-color: #000000; } .ui.black.labeled.ticked.slider > .active.labels .active.label::after { background-color: #1b1c1d; } .ui.black.inverted.labeled.ticked.slider > .active.labels .active.label::after { background-color: #545454; } /* -------------- Basic --------------- */ /* Standard */ .ui.slider.basic .inner .thumb { background-color: #1b1c1d; } .ui.slider.basic .inner .thumb:hover, .ui.slider.basic:focus .inner .thumb { background-color: #27292a; } /* -------------- Basic Inverted --------------- */ /* Standard */ .ui.inverted.slider.basic .inner .thumb { background-color: #545454; } .ui.inverted.slider.basic .inner .thumb:hover, .ui.inverted.slider.basic:focus .inner .thumb { background-color: #000000; } /* -------------- Sizing --------------- */ .ui.slider.small .inner .thumb { height: 1em; width: 1em; } .ui.slider.small:not(.vertical) .inner { height: 1em; } .ui.slider.small:not(.vertical) .inner .track, .ui.slider.small:not(.vertical) .inner .track-fill { height: 0.3em; top: 0.35em; } .ui.small.labeled.slider:not(.vertical) > .labels, .ui.small.labeled.slider:not(.vertical) > .labels .label::after { height: 1em; } .ui.small.labeled.slider:not(.vertical) > .labels .halftick.label::after { height: 0.5em; } /* Small Vertical */ .ui.slider.small.vertical .inner { width: 1em; } .ui.slider.small.vertical .inner .track, .ui.slider.small.vertical .inner .track-fill { width: 0.3em; left: 0.35em; } .ui.small.labeled.vertical.slider > .labels, .ui.small.labeled.vertical.slider > .labels .label::after { width: 1em; } .ui.small.labeled.vertical.slider > .labels .halftick.label::after { width: 0.5em; } .ui.slider.large .inner .thumb { height: 2em; width: 2em; } .ui.slider.large:not(.vertical) .inner { height: 2em; } .ui.slider.large:not(.vertical) .inner .track, .ui.slider.large:not(.vertical) .inner .track-fill { height: 0.5em; top: 0.75em; } .ui.large.labeled.slider:not(.vertical) > .labels, .ui.large.labeled.slider:not(.vertical) > .labels .label::after { height: 2em; } .ui.large.labeled.slider:not(.vertical) > .labels .halftick.label::after { height: 1em; } /* Small Vertical */ .ui.slider.large.vertical .inner { width: 2em; } .ui.slider.large.vertical .inner .track, .ui.slider.large.vertical .inner .track-fill { width: 0.5em; left: 0.75em; } .ui.large.labeled.vertical.slider > .labels, .ui.large.labeled.vertical.slider > .labels .label::after { width: 2em; } .ui.large.labeled.vertical.slider > .labels .halftick.label::after { width: 1em; } .ui.slider.big .inner .thumb { height: 2.5em; width: 2.5em; } .ui.slider.big:not(.vertical) .inner { height: 2.5em; } .ui.slider.big:not(.vertical) .inner .track, .ui.slider.big:not(.vertical) .inner .track-fill { height: 0.6em; top: 0.95em; } .ui.big.labeled.slider:not(.vertical) > .labels, .ui.big.labeled.slider:not(.vertical) > .labels .label::after { height: 2.5em; } .ui.big.labeled.slider:not(.vertical) > .labels .halftick.label::after { height: 1.25em; } /* Small Vertical */ .ui.slider.big.vertical .inner { width: 2.5em; } .ui.slider.big.vertical .inner .track, .ui.slider.big.vertical .inner .track-fill { width: 0.6em; left: 0.95em; } .ui.big.labeled.vertical.slider > .labels, .ui.big.labeled.vertical.slider > .labels .label::after { width: 2.5em; } .ui.big.labeled.vertical.slider > .labels .halftick.label::after { width: 1.25em; } /******************************* Slider Overrides *******************************/ /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/slider.js ================================================ /*! * # Fomantic-UI 2.9.4 - Slider * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.slider = function (parameters) { var $allModules = $(this), $document = $(document), $window = $(window), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), SINGLE_STEP = 1, BIG_STEP = 2, NO_STEP = 0, SINGLE_BACKSTEP = -1, BIG_BACKSTEP = -2, // Used to manage document bound events. // Use this so that we can distinguish between which document events are bound to which range. currentRange = 0, returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.slider.settings, parameters) : $.extend({}, $.fn.slider.settings), className = settings.className, metadata = settings.metadata, namespace = settings.namespace, error = settings.error, keys = settings.keys, interpretLabel = settings.interpretLabel, isHover = false, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $currThumb, touchIdentifier, $thumb, $secondThumb, $track, $trackFill, $labels, element = this, instance = $module.data(moduleNamespace), documentEventID, value, position, secondPos, offset, gapRatio = 1, previousValue, initialPosition, initialLoad, module ; module = { initialize: function () { module.debug('Initializing slider', settings); initialLoad = true; currentRange += 1; documentEventID = currentRange; module.setup.layout(); module.setup.labels(); module.bind.events(); module.read.metadata(); module.read.settings(); initialLoad = false; module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of slider', module); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.verbose('Destroying previous slider for', $module); clearInterval(instance.interval); module.unbind.events(); module.unbind.slidingEvents(); delete module.cache; $module.removeData(moduleNamespace); instance = undefined; }, setup: { layout: function () { if ($module.attr('tabindex') === undefined) { $module.attr('tabindex', 0); } if ($module.find('.inner').length === 0) { $module.append('<div class="inner">' + '<div class="track"></div>' + '<div class="track-fill"></div>' + '<div class="thumb"></div>' + '</div>'); } module.clear.cache(); $thumb = $module.find('.thumb:not(.second)'); if (settings.showThumbTooltip) { $thumb .attr('data-position', settings.tooltipConfig.position) .attr('data-variation', settings.tooltipConfig.variation) ; } $currThumb = $thumb; if (module.is.range()) { if ($module.find('.thumb.second').length === 0) { $module.find('.inner').append('<div class="thumb second"></div>'); } $secondThumb = $module.find('.thumb.second'); if (settings.showThumbTooltip) { $secondThumb .attr('data-position', settings.tooltipConfig.position) .attr('data-variation', settings.tooltipConfig.variation) ; } } $track = $module.find('.track'); $trackFill = $module.find('.track-fill'); offset = $thumb.width() / 2; }, labels: function () { if (module.is.labeled()) { $labels = $module.find('.labels:not(.auto)'); if ($labels.length > 0) { module.setup.customLabel(); } else { module.setup.autoLabel(); } if (settings.highlightRange) { $labels.addClass(className.active); } if (settings.showLabelTicks) { $module.addClass(className.ticked); } else if ($module.hasClass(className.ticked)) { settings.showLabelTicks = 'always'; } } }, customLabel: function () { var $children = $labels.find('.label'), numChildren = $children.length, min = module.get.min(), max = module.get.max(), ratio ; $children.each(function (index) { var $child = $(this), attrValue = $child.attr('data-value') ; if (attrValue) { attrValue = attrValue > max ? max : (attrValue < min ? min : attrValue); ratio = (attrValue - min) / (max - min); } else { ratio = (index + 1) / (numChildren + 1); } module.update.labelPosition(ratio, $(this)); }); }, autoLabel: function () { $labels = $module.find('.labels'); if ($labels.length > 0) { $labels.empty(); } else { $labels = $module.append('<ul class="auto labels"></ul>').find('.labels'); } var step = module.get.step(), precision = module.get.precision(), len = module.get.numLabels(), ignoreLabels = len - (settings.autoAdjustLabels !== 'fixed' ? 0 : module.get.max().toString().length + 4) ; for (var i = 0; i <= len; i++) { var stepValue = Math.round(((i * (step === 0 ? 1 : step)) + module.get.min()) * precision) / precision, labelText = module.get.label(i, stepValue), showLabel = settings.restrictedLabels.length === 0 || settings.restrictedLabels.indexOf(labelText) >= 0, $label = labelText !== '' && (showLabel || settings.showLabelTicks === 'always') ? ((!(i % module.get.gapRatio()) && i < ignoreLabels) || i === len ? $('<li/>', { class: className.label, 'data-value': stepValue, html: showLabel ? labelText : '' }) : $('<li/>', { class: 'halftick label', 'data-value': stepValue })) : null, ratio = i / len ; if ($label) { module.update.labelPosition(ratio, $label); $labels.append($label); } } }, }, bind: { events: function () { module.bind.globalKeyboardEvents(); module.bind.keyboardEvents(); module.bind.mouseEvents(); if (settings.autoAdjustLabels) { module.bind.windowEvents(); } }, keyboardEvents: function () { module.verbose('Binding keyboard events'); $module.on('keydown' + eventNamespace, module.event.keydown); }, globalKeyboardEvents: function () { $document.on('keydown' + eventNamespace + documentEventID, module.event.activateFocus); }, mouseEvents: function () { module.verbose('Binding mouse and touch events'); $module.find('.track, .thumb, .inner').on('mousedown' + eventNamespace, function (event) { event.stopImmediatePropagation(); event.preventDefault(); module.event.down(event); }); $module.on('mousedown' + eventNamespace, module.event.down); $module.on('mouseenter' + eventNamespace, function (event) { isHover = true; }); $module.on('mouseleave' + eventNamespace, function (event) { isHover = false; }); // All touch events are invoked on the element where the touch *started*. Thus, we can bind them all // on the thumb(s) and don't need to worry about interference with other components, i.e. no dynamic binding // and unbinding required. $module.find('.thumb') .on('touchstart' + eventNamespace, module.event.touchDown) .on('touchmove' + eventNamespace, module.event.move) .on('touchend' + eventNamespace, module.event.up) .on('touchcancel' + eventNamespace, module.event.touchCancel) ; }, slidingEvents: function () { // these don't need the identifier because we only ever want one of them to be registered with document module.verbose('Binding page wide events while handle is being draged'); $document.on('mousemove' + eventNamespace, module.event.move); $document.on('mouseup' + eventNamespace, module.event.up); }, windowEvents: function () { $window.on('resize' + eventNamespace, module.event.resize); }, }, unbind: { events: function () { $module.find('.track, .thumb, .inner').off('mousedown' + eventNamespace); $module.off('mousedown' + eventNamespace); $module.off('mouseenter' + eventNamespace); $module.off('mouseleave' + eventNamespace); $module.find('.thumb') .off('touchstart' + eventNamespace) .off('touchmove' + eventNamespace) .off('touchend' + eventNamespace) .off('touchcancel' + eventNamespace) ; $module.off('keydown' + eventNamespace); $module.off('focusout' + eventNamespace); $document.off('keydown' + eventNamespace + documentEventID, module.event.activateFocus); $window.off('resize' + eventNamespace); }, slidingEvents: function () { $document.off('mousemove' + eventNamespace); $document.off('mouseup' + eventNamespace); }, }, event: { down: function (event) { event.preventDefault(); if (module.is.range()) { var eventPos = module.determine.eventPos(event), newPos = module.determine.pos(eventPos) ; // Special handling if range mode and both thumbs have the same value if (settings.preventCrossover && module.is.range() && module.thumbVal === module.secondThumbVal) { initialPosition = newPos; $currThumb = undefined; } else { $currThumb = module.determine.closestThumb(newPos); } if (previousValue === undefined) { previousValue = module.get.currentThumbValue(); } } else if (previousValue === undefined) { previousValue = module.get.value(); } if (!module.is.disabled()) { module.bind.slidingEvents(); } }, touchDown: function (event) { event.preventDefault(); // disable mouse emulation and touch-scrolling event.stopImmediatePropagation(); if (touchIdentifier !== undefined) { // ignore multiple touches on the same slider -- // we cannot handle changing both thumbs at once due to shared state return; } $currThumb = $(event.target); var touchEvent = event.touches ? event : event.originalEvent; touchIdentifier = touchEvent.targetTouches[0].identifier; if (previousValue === undefined) { previousValue = module.get.currentThumbValue(); } }, move: function (event) { if (event.type === 'mousemove') { event.preventDefault(); // prevent text selection etc. } if (module.is.disabled()) { // touch events are always bound, so we need to prevent touch-sliding on disabled sliders here return; } var value = module.determine.valueFromEvent(event); if (event.type === 'mousemove' && $currThumb === undefined) { var eventPos = module.determine.eventPos(event), newPos = module.determine.pos(eventPos) ; $currThumb = initialPosition > newPos ? $thumb : $secondThumb; } if (module.is.range() && (settings.minRange || settings.maxRange)) { var currentRangeDiff = module.get.currentRangeDiff(value), isSecondThumb = $currThumb.hasClass('second') ; if ((settings.minRange && currentRangeDiff < settings.minRange) || (settings.maxRange && currentRangeDiff > settings.maxRange) || (settings.preventCrossover && !isSecondThumb && value > module.secondThumbVal) || (settings.preventCrossover && isSecondThumb && value < module.thumbVal) ) { return; } } if (module.get.step() === 0 || module.is.smooth()) { var thumbVal = module.thumbVal, secondThumbVal = module.secondThumbVal, thumbSmoothVal = module.determine.smoothValueFromEvent(event) ; if (!$currThumb.hasClass('second')) { if (settings.preventCrossover && module.is.range()) { value = Math.min(secondThumbVal, value); thumbSmoothVal = Math.min(secondThumbVal, thumbSmoothVal); } thumbVal = value; } else { if (settings.preventCrossover && module.is.range()) { value = Math.max(thumbVal, value); thumbSmoothVal = Math.max(thumbVal, thumbSmoothVal); } secondThumbVal = value; } value = Math.abs(thumbVal - (secondThumbVal || 0)); module.update.position(thumbSmoothVal); settings.onMove.call(element, value, thumbVal, secondThumbVal); } else { module.update.value(value, function (value, thumbVal, secondThumbVal) { settings.onMove.call(element, value, thumbVal, secondThumbVal); }); } }, up: function (event) { event.preventDefault(); if (module.is.disabled()) { // touch events are always bound, so we need to prevent touch-sliding on disabled sliders here return; } var value = module.determine.valueFromEvent(event); if (module.is.range() && (settings.minRange || settings.maxRange)) { if ($currThumb === undefined) { $currThumb = value <= module.get.currentThumbValue() ? $thumb : $secondThumb; } var currentRangeDiff = module.get.currentRangeDiff(value); if (settings.minRange && currentRangeDiff < settings.minRange) { value = module.get.edgeValue(value, settings.minRange); } else if (settings.maxRange && currentRangeDiff > settings.maxRange) { value = module.get.edgeValue(value, settings.maxRange); } } module.set.value(value); module.unbind.slidingEvents(); touchIdentifier = undefined; if (previousValue !== undefined) { previousValue = undefined; } }, touchCancel: function (event) { event.preventDefault(); touchIdentifier = undefined; if (previousValue !== undefined) { module.update.value(previousValue); previousValue = undefined; } }, keydown: function (event, first) { if (module.is.disabled()) { return; } if (settings.preventCrossover && module.is.range() && module.thumbVal === module.secondThumbVal) { $currThumb = undefined; } if (module.is.focused()) { $document.trigger(event); } if (first || module.is.focused()) { var step = module.determine.keyMovement(event); if (step !== NO_STEP) { event.preventDefault(); switch (step) { case SINGLE_STEP: { module.takeStep(); break; } case BIG_STEP: { module.takeStep(module.get.multiplier()); break; } case SINGLE_BACKSTEP: { module.backStep(); break; } case BIG_BACKSTEP: { module.backStep(module.get.multiplier()); break; } } } } }, activateFocus: function (event) { if (!module.is.disabled() && !module.is.focused() && module.is.hover() && module.determine.keyMovement(event) !== NO_STEP) { event.preventDefault(); module.event.keydown(event, true); $module.trigger('focus'); } }, resize: function (_event) { // To avoid a useless performance cost, we only call the label refresh when its necessary if (gapRatio !== module.get.gapRatio()) { module.resync(); gapRatio = module.get.gapRatio(); } }, }, clear: { cache: function () { module.cache = {}; }, }, resync: function () { module.verbose('Resyncing thumb position based on value'); module.setup.labels(); if (module.is.range()) { module.update.position(module.secondThumbVal, $secondThumb); } module.update.position(module.thumbVal, $thumb); }, takeStep: function (multiplier) { if (!multiplier) { multiplier = 1; } var step = module.get.step(), currValue = module.get.currentThumbValue() ; module.verbose('Taking a step'); if (step > 0) { module.set.value(currValue + step * multiplier); } else if (step === 0) { var precision = module.get.precision(), newValue = currValue + (multiplier / precision) ; module.set.value(Math.round(newValue * precision) / precision); } }, backStep: function (multiplier) { if (!multiplier) { multiplier = 1; } var step = module.get.step(), currValue = module.get.currentThumbValue() ; module.verbose('Going back a step'); if (step > 0) { module.set.value(currValue - step * multiplier); } else if (step === 0) { var precision = module.get.precision(), newValue = currValue - (multiplier / precision) ; module.set.value(Math.round(newValue * precision) / precision); } }, is: { prime: function (n) { if (module.cache['prime' + n] === undefined) { var p = true; for (var i = 2, s = Math.sqrt(n); i <= s; i++) { if (n % i === 0) { p = false; break; } } if (p) { p = n > 1; } module.cache['prime' + n] = p; } return module.cache['prime' + n]; }, range: function () { var isRange = $module.hasClass(className.range); if (!isRange && (settings.minRange || settings.maxRange)) { $module.addClass(className.range); isRange = true; } return isRange; }, hover: function () { return isHover; }, focused: function () { return $module.is(':focus'); }, disabled: function () { return $module.hasClass(className.disabled); }, labeled: function () { var isLabeled = $module.hasClass(className.labeled); if (!isLabeled && (settings.restrictedLabels.length > 0 || settings.showLabelTicks !== false)) { $module.addClass(className.labeled); isLabeled = true; } return isLabeled; }, reversed: function () { return $module.hasClass(className.reversed); }, vertical: function () { return $module.hasClass(className.vertical); }, smooth: function () { return settings.smooth || $module.hasClass(className.smooth); }, }, get: { currentRangeDiff: function (value) { var currentRangeDiff; if ($currThumb.hasClass('second')) { currentRangeDiff = module.thumbVal < value ? value - module.thumbVal : module.thumbVal - value; } else { currentRangeDiff = module.secondThumbVal > value ? module.secondThumbVal - value : value - module.secondThumbVal; } return currentRangeDiff; }, edgeValue: function (value, edgeValue) { if ($currThumb.hasClass('second')) { value = module.thumbVal < value ? module.thumbVal + edgeValue : module.thumbVal - edgeValue; } else { value = module.secondThumbVal < value ? module.secondThumbVal + edgeValue : module.secondThumbVal - edgeValue; } return value; }, trackOffset: function () { if (module.is.vertical()) { return $track.offset().top; } return $track.offset().left; }, trackLength: function () { if (module.is.vertical()) { return $track.height(); } return $track.width(); }, trackLeft: function () { if (module.is.vertical()) { return $track.position().top; } return $track.position().left; }, trackStartPos: function () { return module.is.reversed() ? module.get.trackLeft() + module.get.trackLength() : module.get.trackLeft(); }, trackEndPos: function () { return module.is.reversed() ? module.get.trackLeft() : module.get.trackLeft() + module.get.trackLength(); }, trackStartMargin: function () { var margin; if (module.is.vertical()) { margin = module.is.reversed() ? $module.css('padding-bottom') : $module.css('padding-top'); } else { margin = module.is.reversed() ? $module.css('padding-right') : $module.css('padding-left'); } return margin || '0px'; }, trackEndMargin: function () { var margin; if (module.is.vertical()) { margin = module.is.reversed() ? $module.css('padding-top') : $module.css('padding-bottom'); } else { margin = module.is.reversed() ? $module.css('padding-left') : $module.css('padding-right'); } return margin || '0px'; }, precision: function () { if (module.cache.precision === undefined) { var decimalPlaces, step = module.get.step() ; if (step !== 0) { var split = String(step).split('.'); decimalPlaces = split.length === 2 ? split[1].length : 0; } else { decimalPlaces = settings.decimalPlaces; } var precision = Math.pow(10, decimalPlaces); module.debug('Precision determined', precision); module.cache.precision = precision; } return module.cache.precision; }, min: function () { return settings.min; }, max: function () { if (module.cache.max === undefined) { var step = module.get.step(), min = module.get.min(), precision = module.get.precision(), quotient = step === 0 ? 0 : Math.floor(Math.round(((settings.max - min) / step) * precision) / precision), remainder = step === 0 ? 0 : (settings.max - min) % step ; if (remainder > 0) { module.debug('Max value not divisible by given step. Increasing max value.', settings.max, step); } module.cache.max = remainder === 0 ? settings.max : min + quotient * step; } return module.cache.max; }, step: function () { return settings.step; }, numLabels: function () { if (module.cache.numLabels === undefined) { var step = module.get.step(), precision = module.get.precision(), value = Math.round(((module.get.max() - module.get.min()) / (step === 0 ? 1 : step)) * precision) / precision; module.debug('Determined that there should be ' + value + ' labels'); module.cache.numLabels = value; } return module.cache.numLabels; }, labelType: function () { return settings.labelType; }, label: function (value, stepValue) { if (isFunction(interpretLabel)) { return interpretLabel(value, stepValue, module); } switch (settings.labelType) { case settings.labelTypes.number: { return stepValue; } case settings.labelTypes.letter: { if (value < 0 || module.get.precision() > 1) { module.error(error.invalidLetterNumber, value); return value; } var letterLabel = '', letters = Array.isArray(settings.letters) ? settings.letters : String(settings.letters).split(''), lettersLen = letters.length ; while (stepValue >= 0) { letterLabel = letters[stepValue % lettersLen] + letterLabel; stepValue = Math.floor(stepValue / lettersLen) - 1; } return letterLabel; } default: { return value; } } }, value: function () { return value; }, settings: function () { return settings; }, currentThumbValue: function () { return $currThumb !== undefined && $currThumb.hasClass('second') ? module.secondThumbVal : module.thumbVal; }, thumbValue: function (which) { switch (which) { case 'second': { if (module.is.range()) { return module.secondThumbVal; } module.error(error.notrange); break; } default: { return module.thumbVal; } } }, multiplier: function () { return settings.pageMultiplier; }, thumbPosition: function (which) { switch (which) { case 'second': { if (module.is.range()) { return secondPos; } module.error(error.notrange); break; } default: { return position; } } }, gapRatio: function () { var gapRatio = 1; if (settings.autoAdjustLabels) { var numLabels = module.get.numLabels(), primePlus = module.is.prime(numLabels) ? 1 : 0, trackLength = module.get.trackLength(), gapCounter = 1 ; // While the distance between two labels is too short, // we divide the number of labels at each iteration // and apply only if the modulo of the operation is an odd number. if (trackLength > 0) { while ((trackLength / numLabels) * gapCounter < settings.labelDistance) { if (!((numLabels + primePlus) % gapCounter) || settings.autoAdjustLabels === 'fixed') { gapRatio = gapCounter; } gapCounter += 1; } } } return gapRatio; }, }, determine: { pos: function (pagePos) { return module.is.reversed() ? module.get.trackStartPos() - pagePos + module.get.trackOffset() : pagePos - module.get.trackOffset() - module.get.trackStartPos(); }, closestThumb: function (eventPos) { var thumbPos = parseFloat(module.determine.thumbPos($thumb)), thumbDelta = Math.abs(eventPos - thumbPos), secondThumbPos = parseFloat(module.determine.thumbPos($secondThumb)), secondThumbDelta = Math.abs(eventPos - secondThumbPos) ; if (thumbDelta === secondThumbDelta && module.get.thumbValue() === module.get.min()) { return $secondThumb; } return thumbDelta <= secondThumbDelta ? $thumb : $secondThumb; }, closestThumbPos: function (eventPos) { var thumbPos = parseFloat(module.determine.thumbPos($thumb)), thumbDelta = Math.abs(eventPos - thumbPos), secondThumbPos = parseFloat(module.determine.thumbPos($secondThumb)), secondThumbDelta = Math.abs(eventPos - secondThumbPos) ; return thumbDelta <= secondThumbDelta ? thumbPos : secondThumbPos; }, thumbPos: function ($element) { return module.is.vertical() ? (module.is.reversed() ? $element.css('bottom') : $element.css('top')) : (module.is.reversed() ? $element.css('right') : $element.css('left')) ; }, positionFromValue: function (val) { var min = module.get.min(), max = module.get.max(), value = val > max ? max : (val < min ? min : val), trackLength = module.get.trackLength(), ratio = (value - min) / (max - min), position = Math.round(ratio * trackLength) ; module.verbose('Determined position: ' + position + ' from value: ' + value); return position; }, positionFromRatio: function (ratio) { var trackLength = module.get.trackLength(), step = module.get.step(), position = Math.round(ratio * trackLength), adjustedPos = step === 0 ? position : Math.round(position / step) * step ; module.verbose('Determined position: ' + position + ' from ratio: ' + ratio); return adjustedPos; }, valueFromEvent: function (event) { var eventPos = module.determine.eventPos(event), newPos = module.determine.pos(eventPos), value ; if (eventPos < module.get.trackOffset()) { value = module.is.reversed() ? module.get.max() : module.get.min(); } else if (eventPos > module.get.trackOffset() + module.get.trackLength()) { value = module.is.reversed() ? module.get.min() : module.get.max(); } else { value = module.determine.value(newPos); } return value; }, smoothValueFromEvent: function (event) { var min = module.get.min(), max = module.get.max(), trackLength = module.get.trackLength(), eventPos = module.determine.eventPos(event), newPos = eventPos - module.get.trackOffset(), ratio, value ; newPos = newPos < 0 ? 0 : (newPos > trackLength ? trackLength : newPos); ratio = newPos / trackLength; if (module.is.reversed()) { ratio = 1 - ratio; } value = ratio * (max - min) + min; return value; }, eventPos: function (event) { if (event.type === 'touchmove' || event.type === 'touchend') { var touchEvent = event.touches ? event : event.originalEvent, touch = touchEvent.changedTouches[0]; // fall back to first touch if correct touch not found for (var i = 0; i < touchEvent.touches.length; i++) { if (touchEvent.touches[i].identifier === touchIdentifier) { touch = touchEvent.touches[i]; break; } } var touchY = touch.pageY, touchX = touch.pageX ; return module.is.vertical() ? touchY : touchX; } var clickY = event.pageY || event.originalEvent.pageY, clickX = event.pageX || event.originalEvent.pageX ; return module.is.vertical() ? clickY : clickX; }, value: function (position) { var precision = module.get.precision(), startPos = module.is.reversed() ? module.get.trackEndPos() : module.get.trackStartPos(), endPos = module.is.reversed() ? module.get.trackStartPos() : module.get.trackEndPos(), ratio = (position - startPos) / (endPos - startPos), range = module.get.max() - module.get.min(), step = module.get.step(), value = ratio * range, difference = step === 0 ? value : Math.round(value / step) * step ; module.verbose('Determined value based upon position: ' + position + ' as: ' + value); if (value !== difference) { module.verbose('Rounding value to closest step: ' + difference); } // Use precision to avoid ugly Javascript floating point rounding issues // (like 35 * .01 = 0.35000000000000003) module.verbose('Cutting off additional decimal places'); return Math.round((difference + module.get.min()) * precision) / precision; }, keyMovement: function (event) { var key = event.which, downArrow = module.is.vertical() ? (module.is.reversed() ? keys.downArrow : keys.upArrow) : keys.downArrow, upArrow = module.is.vertical() ? (module.is.reversed() ? keys.upArrow : keys.downArrow) : keys.upArrow, leftArrow = !module.is.vertical() ? (module.is.reversed() ? keys.rightArrow : keys.leftArrow) : keys.leftArrow, rightArrow = !module.is.vertical() ? (module.is.reversed() ? keys.leftArrow : keys.rightArrow) : keys.rightArrow ; if (key === downArrow || key === leftArrow) { return SINGLE_BACKSTEP; } if (key === upArrow || key === rightArrow) { return SINGLE_STEP; } if (key === keys.pageDown) { return BIG_BACKSTEP; } if (key === keys.pageUp) { return BIG_STEP; } return NO_STEP; }, }, handleNewValuePosition: function (val) { var min = module.get.min(), max = module.get.max(), newPos ; if (val <= min) { val = min; } else if (val >= max) { val = max; } newPos = module.determine.positionFromValue(val); return newPos; }, set: { active: function (thumbVal, secondThumbVal) { if (settings.highlightRange) { if (secondThumbVal < thumbVal) { var tempVal = secondThumbVal; secondThumbVal = thumbVal; thumbVal = tempVal; } var $children = $labels.find('.label'); $children.each(function (index) { var $child = $(this), attrValue = $child.attr('data-value') ; if (attrValue) { attrValue = parseInt(attrValue, 10); if (attrValue >= thumbVal && attrValue <= secondThumbVal) { $child.addClass(className.active); } else { $child.removeClass(className.active); } } }); } }, value: function (newValue, fireChange) { fireChange = fireChange !== false; var toReset = previousValue === undefined; previousValue = previousValue === undefined ? module.get.value() : previousValue; module.update.value(newValue, function (value, thumbVal, secondThumbVal) { if ((!initialLoad || settings.fireOnInit) && fireChange) { if (newValue !== previousValue) { settings.onChange.call(element, value, thumbVal, secondThumbVal); } settings.onMove.call(element, value, thumbVal, secondThumbVal); } if (toReset) { previousValue = undefined; } }); }, rangeValue: function (first, second, fireChange) { fireChange = fireChange !== false; if (module.is.range()) { var min = module.get.min(), max = module.get.max(), toReset = previousValue === undefined ; previousValue = previousValue === undefined ? module.get.value() : previousValue; if (first <= min) { first = min; } else if (first >= max) { first = max; } if (second <= min) { second = min; } else if (second >= max) { second = max; } module.thumbVal = first; module.secondThumbVal = second; value = Math.abs(module.thumbVal - module.secondThumbVal); module.update.position(module.thumbVal, $thumb); module.update.position(module.secondThumbVal, $secondThumb); if ((!initialLoad || settings.fireOnInit) && fireChange) { if (value !== previousValue) { settings.onChange.call(element, value, module.thumbVal, module.secondThumbVal); } settings.onMove.call(element, value, module.thumbVal, module.secondThumbVal); } if (toReset) { previousValue = undefined; } } else { module.error(error.notrange); } }, position: function (position, which) { var thumbVal = module.determine.value(position); if (which === 'second') { module.secondThumbVal = thumbVal; module.update.position(thumbVal, $secondThumb); } else { module.thumbVal = thumbVal; module.update.position(thumbVal, $thumb); } value = Math.abs(module.thumbVal - (module.secondThumbVal || 0)); module.set.value(value); }, }, update: { value: function (newValue, callback) { var min = module.get.min(), max = module.get.max() ; if (newValue <= min) { newValue = min; } else if (newValue >= max) { newValue = max; } if (!module.is.range()) { value = newValue; module.thumbVal = value; } else { if ($currThumb === undefined) { $currThumb = newValue <= module.get.currentThumbValue() ? $thumb : $secondThumb; } if (!$currThumb.hasClass('second')) { if (settings.preventCrossover && module.is.range()) { newValue = Math.min(module.secondThumbVal - (settings.minRange || 0), newValue); } module.thumbVal = newValue; } else { if (settings.preventCrossover && module.is.range()) { newValue = Math.max(module.thumbVal + (settings.minRange || 0), newValue); } module.secondThumbVal = newValue; } value = Math.abs(module.thumbVal - module.secondThumbVal); } module.update.position(newValue); module.debug('Setting slider value to ' + value); if (typeof callback === 'function') { callback(value, module.thumbVal, module.secondThumbVal); } }, position: function (newValue, $element) { var newPos = module.handleNewValuePosition(newValue), $targetThumb = $element || $currThumb, thumbVal = module.thumbVal || module.get.min(), secondThumbVal = module.secondThumbVal || module.get.min() ; if (settings.showThumbTooltip) { var precision = module.get.precision(); $targetThumb.attr('data-tooltip', Math.round(newValue * precision) / precision); } if (module.is.range()) { if (!$targetThumb.hasClass('second')) { position = newPos; thumbVal = newValue; } else { secondPos = newPos; secondThumbVal = newValue; } } else { position = newPos; thumbVal = newValue; } module.set.active(thumbVal, secondThumbVal); var trackPosValue, thumbPosValue, min = module.get.min(), max = module.get.max(), thumbPosPercent = 100 * ((newValue - min) / (max - min)), trackStartPosPercent = 100 * ((Math.min(thumbVal, secondThumbVal) - min) / (max - min)), trackEndPosPercent = 100 * (1 - (Math.max(thumbVal, secondThumbVal) - min) / (max - min)) ; if (module.is.vertical()) { if (module.is.reversed()) { thumbPosValue = { bottom: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', top: 'auto' }; trackPosValue = { bottom: trackStartPosPercent + '%', top: trackEndPosPercent + '%' }; } else { thumbPosValue = { top: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', bottom: 'auto' }; trackPosValue = { top: trackStartPosPercent + '%', bottom: trackEndPosPercent + '%' }; } } else { if (module.is.reversed()) { thumbPosValue = { right: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', left: 'auto' }; trackPosValue = { right: trackStartPosPercent + '%', left: trackEndPosPercent + '%' }; } else { thumbPosValue = { left: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', right: 'auto' }; trackPosValue = { left: trackStartPosPercent + '%', right: trackEndPosPercent + '%' }; } } $targetThumb.css(thumbPosValue); $trackFill.css(trackPosValue); module.debug('Setting slider position to ' + newPos); }, labelPosition: function (ratio, $label) { var startMargin = module.get.trackStartMargin(), endMargin = module.get.trackEndMargin(), posDir = module.is.vertical() ? (module.is.reversed() ? 'bottom' : 'top') : (module.is.reversed() ? 'right' : 'left'), startMarginMod = module.is.reversed() && !module.is.vertical() ? ' - ' : ' + ' ; var position = '(100% - ' + startMargin + ' - ' + endMargin + ') * ' + ratio; $label.css(posDir, 'calc(' + position + startMarginMod + startMargin + ')'); }, }, goto: { max: function () { module.set.value(module.get.max()); }, min: function () { module.set.value(module.get.min()); }, }, read: { metadata: function () { var data = { thumbVal: $module.data(metadata.thumbVal), secondThumbVal: $module.data(metadata.secondThumbVal), } ; if (data.thumbVal) { if (module.is.range() && data.secondThumbVal) { module.debug('Current value set from metadata', data.thumbVal, data.secondThumbVal); module.set.rangeValue(data.thumbVal, data.secondThumbVal); } else { module.debug('Current value set from metadata', data.thumbVal); module.set.value(data.thumbVal); } } }, settings: function () { if (settings.start !== false) { if (module.is.range()) { var rangeDiff = settings.end - settings.start; if (rangeDiff < 0 || (settings.minRange && rangeDiff < settings.minRange) || (settings.maxRange && rangeDiff > settings.maxRange) || (settings.minRange && settings.maxRange && settings.minRange > settings.maxRange) ) { module.error(error.invalidRanges, settings.start, settings.end, settings.minRange, settings.maxRange); } module.debug('Start position set from settings', settings.start, settings.end); module.set.rangeValue(settings.start, settings.end); } else { module.debug('Start position set from settings', settings.start); module.set.value(settings.start); } } }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } module.clear.cache(); }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.slider.settings = { silent: false, debug: false, verbose: false, performance: true, name: 'Slider', namespace: 'slider', error: { method: 'The method you called is not defined.', notrange: 'This slider is not a range slider', invalidRanges: 'Invalid range settings (start/end/minRange/maxRange)', invalidLetterNumber: 'Negative values or decimal places for labelType: "letter" are not supported', }, metadata: { thumbVal: 'thumbVal', secondThumbVal: 'secondThumbVal', }, min: 0, max: 20, step: 1, start: 0, end: 20, minRange: false, maxRange: false, labelType: 'number', showLabelTicks: false, smooth: false, autoAdjustLabels: true, labelDistance: 100, preventCrossover: true, fireOnInit: false, interpretLabel: false, letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', // the decimal place to round to if step is undefined decimalPlaces: 2, // page up/down multiplier. How many more times the steps to take on page up/down press pageMultiplier: 2, selector: {}, className: { reversed: 'reversed', disabled: 'disabled', labeled: 'labeled', ticked: 'ticked', vertical: 'vertical', range: 'range', smooth: 'smooth', label: 'label', active: 'active', }, keys: { pageUp: 33, pageDown: 34, leftArrow: 37, upArrow: 38, rightArrow: 39, downArrow: 40, }, restrictedLabels: [], highlightRange: false, showThumbTooltip: false, tooltipConfig: { position: 'top center', variation: 'tiny black', }, labelTypes: { number: 'number', letter: 'letter', }, onChange: function (value, thumbVal, secondThumbVal) {}, onMove: function (value, thumbVal, secondThumbVal) {}, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/state.js ================================================ /*! * # Fomantic-UI 2.9.4 - State * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.state = function (parameters) { var $allModules = $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $(context); } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : window; } } return $context; }, returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.state.settings, parameters) : $.extend({}, $.fn.state.settings), error = settings.error, metadata = settings.metadata, className = settings.className, namespace = settings.namespace, states = settings.states, text = settings.text, eventNamespace = '.' + namespace, moduleNamespace = namespace + '-module', $module = $(this), $context = settings.context ? contextCheck(settings.context, window) : $module, element = this, instance = $module.data(moduleNamespace), module ; module = { initialize: function () { module.verbose('Initializing module'); // allow module to guess desired state based on element if (settings.automatic) { module.add.defaults(); } // bind events with delegated events $context .on('mouseenter' + eventNamespace, module.change.text) .on('mouseleave' + eventNamespace, module.reset.text) .on('click' + eventNamespace, module.toggle.state) ; module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.verbose('Destroying previous module', instance); $context .off(eventNamespace) ; $module .removeData(metadata.storedText) .removeData(moduleNamespace) ; }, refresh: function () { module.verbose('Refreshing selector cache'); $module = $(element); }, add: { defaults: function () { var userStates = parameters && $.isPlainObject(parameters.states) ? parameters.states : {} ; $.each(settings.defaults, function (type, typeStates) { if (module.is[type] !== undefined && module.is[type]()) { module.verbose('Adding default states', type, element); $.extend(settings.states, typeStates, userStates); } }); }, }, is: { active: function () { return $module.hasClass(className.active); }, loading: function () { return $module.hasClass(className.loading); }, inactive: function () { return !$module.hasClass(className.active); }, state: function (state) { if (className[state] === undefined) { return false; } return $module.hasClass(className[state]); }, enabled: function () { return !$module.is(settings.filter.active); }, disabled: function () { return $module.is(settings.filter.active); }, textEnabled: function () { return !$module.is(settings.filter.text); }, // definitions for automatic type detection button: function () { return $module.is('.button:not(a, .submit)'); }, input: function () { return $module.is('input'); }, progress: function () { return $module.is('.ui.progress'); }, }, allow: function (state) { module.debug('Now allowing state', state); states[state] = true; }, disallow: function (state) { module.debug('No longer allowing', state); states[state] = false; }, allows: function (state) { return states[state] || false; }, enable: function () { $module.removeClass(className.disabled); }, disable: function () { $module.addClass(className.disabled); }, setState: function (state) { if (module.allows(state)) { $module.addClass(className[state]); } }, removeState: function (state) { if (module.allows(state)) { $module.removeClass(className[state]); } }, toggle: { state: function () { var apiRequest, requestCancelled ; if (module.allows('active') && module.is.enabled()) { module.refresh(); if ($.fn.api !== undefined) { apiRequest = $module.api('get request'); requestCancelled = $module.api('was cancelled'); if (requestCancelled) { module.debug('API Request cancelled by beforesend'); settings.activateTest = function () { return false; }; settings.deactivateTest = function () { return false; }; } else if (apiRequest) { module.listenTo(apiRequest); return; } } module.change.state(); } }, }, listenTo: function (apiRequest) { module.debug('API request detected, waiting for state signal', apiRequest); if (apiRequest) { if (text.loading) { module.update.text(text.loading); } $.when(apiRequest) .then(function () { if (apiRequest.state() === 'resolved') { module.debug('API request succeeded'); settings.activateTest = function () { return true; }; settings.deactivateTest = function () { return true; }; } else { module.debug('API request failed'); settings.activateTest = function () { return false; }; settings.deactivateTest = function () { return false; }; } module.change.state(); }) ; } }, // checks whether active/inactive state can be given change: { state: function () { module.debug('Determining state change direction'); // inactive to active change if (module.is.inactive()) { module.activate(); } else { module.deactivate(); } if (settings.sync) { module.sync(); } settings.onChange.call(element); }, text: function () { if (module.is.textEnabled()) { if (module.is.disabled()) { module.verbose('Changing text to disabled text', text.hover); module.update.text(text.disabled); } else if (module.is.active()) { if (text.hover) { module.verbose('Changing text to hover text', text.hover); module.update.text(text.hover); } else if (text.deactivate) { module.verbose('Changing text to deactivating text', text.deactivate); module.update.text(text.deactivate); } } else { if (text.hover) { module.verbose('Changing text to hover text', text.hover); module.update.text(text.hover); } else if (text.activate) { module.verbose('Changing text to activating text', text.activate); module.update.text(text.activate); } } } }, }, activate: function () { if (settings.activateTest.call(element)) { module.debug('Setting state to active'); $module .addClass(className.active) ; module.update.text(text.active); settings.onActivate.call(element); } }, deactivate: function () { if (settings.deactivateTest.call(element)) { module.debug('Setting state to inactive'); $module .removeClass(className.active) ; module.update.text(text.inactive); settings.onDeactivate.call(element); } }, sync: function () { module.verbose('Syncing other buttons to current state'); if (module.is.active()) { $allModules .not($module) .state('activate') ; } else { $allModules .not($module) .state('deactivate') ; } }, get: { text: function () { return settings.selector.text ? $module.find(settings.selector.text).text() : $module.html(); }, textFor: function (state) { return text[state] || false; }, }, flash: { text: function (text, duration, callback) { var previousText = module.get.text(); module.debug('Flashing text message', text, duration); text = text || settings.text.flash; duration = duration || settings.flashDuration; callback = callback || function () {}; module.update.text(text); setTimeout(function () { module.update.text(previousText); callback.call(element); }, duration); }, }, reset: { // on mouseout sets text to previous value text: function () { var activeText = text.active || $module.data(metadata.storedText), inactiveText = text.inactive || $module.data(metadata.storedText) ; if (module.is.textEnabled()) { if (module.is.active() && activeText) { module.verbose('Resetting active text', activeText); module.update.text(activeText); } else if (inactiveText) { module.verbose('Resetting inactive text', activeText); module.update.text(inactiveText); } } }, }, update: { text: function (text) { var currentText = module.get.text(); if (text && text !== currentText) { module.debug('Updating text', text); if (settings.selector.text) { $module .data(metadata.storedText, text) .find(settings.selector.text) .text(text) ; } else { $module .data(metadata.storedText, text) .html(text) ; } } else { module.debug('Text is already set, ignoring update', text); } }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.state.settings = { // module info name: 'State', // debug output debug: false, // verbose debug output verbose: false, // namespace for events namespace: 'state', // debug data includes performance performance: true, // callback occurs on state change onActivate: function () {}, onDeactivate: function () {}, onChange: function () {}, // state test functions activateTest: function () { return true; }, deactivateTest: function () { return true; }, // whether to automatically map default states automatic: true, // activate / deactivate changes all elements instantiated at same time sync: false, // default flash text duration, used for temporarily changing text of an element flashDuration: 1000, // selector filter filter: { text: '.loading, .disabled', active: '.disabled', }, context: false, // error error: { method: 'The method you called is not defined.', }, // metadata metadata: { promise: 'promise', storedText: 'stored-text', }, // change class on state className: { active: 'active', disabled: 'disabled', error: 'error', loading: 'loading', success: 'success', warning: 'warning', }, selector: { // selector for text node text: false, }, defaults: { input: { disabled: true, loading: true, active: true, }, button: { disabled: true, loading: true, active: true, }, progress: { active: true, success: true, warning: true, error: true, }, }, states: { active: true, disabled: true, error: true, loading: true, success: true, warning: true, }, text: { disabled: false, flash: false, hover: false, active: false, inactive: false, activate: false, deactivate: false, }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/statistic.css ================================================ /*! * # Fomantic-UI 2.9.4 - Statistic * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Statistic *******************************/ /* Standalone */ .ui.statistic { display: inline-flex; flex-direction: column; margin: 1em 0; max-width: none; } .ui.statistic + .ui.statistic { margin: 0 0 0 1.5em; } .ui.statistic:first-child { margin-top: 0; } .ui.statistic:last-child { margin-bottom: 0; } /******************************* Group *******************************/ /* Grouped */ .ui.statistics { display: flex; align-items: flex-start; flex-wrap: wrap; } .ui.statistics > .statistic { display: inline-flex; flex: 0 1 auto; flex-direction: column; margin: 0 1.5em 1em; max-width: none; } .ui.statistics { display: flex; margin: 1em -1.5em -1em; } /* Clearing */ .ui.statistics::after { display: block; content: " "; height: 0; clear: both; overflow: hidden; visibility: hidden; } .ui.statistics:first-child { margin-top: 0; } /******************************* Content *******************************/ /* -------------- Value --------------- */ .ui.statistics .statistic > .value, .ui.statistic > .value { font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 4rem; font-weight: normal; line-height: 1em; color: #1b1c1d; text-transform: uppercase; text-align: center; } /* -------------- Label --------------- */ .ui.statistics .statistic > .label, .ui.statistic > .label { font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 1em; font-weight: bold; color: rgba(0, 0, 0, 0.87); text-transform: uppercase; text-align: center; } /* Top Label */ .ui.statistics .statistic > .label ~ .value, .ui.statistic > .label ~ .value { margin-top: 0; } /* Bottom Label */ .ui.statistics .statistic > .value ~ .label, .ui.statistic > .value ~ .label { margin-top: 0; } /******************************* Types *******************************/ /* -------------- Icon Value --------------- */ .ui.statistics .statistic > .value > i.icon, .ui.statistic > .value > i.icon { opacity: 1; width: auto; margin: 0; } /* -------------- Text Value --------------- */ .ui.statistics .statistic > .text.value, .ui.statistic > .text.value { line-height: 1em; min-height: 2em; font-weight: bold; text-align: center; } .ui.statistics .statistic > .text.value + .label, .ui.statistic > .text.value + .label { text-align: center; } /* -------------- Image Value --------------- */ .ui.statistics .statistic > .value img, .ui.statistic > .value img { max-height: 3rem; vertical-align: baseline; } /******************************* Variations *******************************/ /* -------------- Count --------------- */ .ui.ten.statistics { margin: 0 0 -1em; } .ui.ten.statistics .statistic { min-width: 10%; margin: 0 0 1em; } .ui.nine.statistics { margin: 0 0 -1em; } .ui.nine.statistics .statistic { min-width: 11.11111111%; margin: 0 0 1em; } .ui.eight.statistics { margin: 0 0 -1em; } .ui.eight.statistics .statistic { min-width: 12.5%; margin: 0 0 1em; } .ui.seven.statistics { margin: 0 0 -1em; } .ui.seven.statistics .statistic { min-width: 14.28571429%; margin: 0 0 1em; } .ui.six.statistics { margin: 0 0 -1em; } .ui.six.statistics .statistic { min-width: 16.66666667%; margin: 0 0 1em; } .ui.five.statistics { margin: 0 0 -1em; } .ui.five.statistics .statistic { min-width: 20%; margin: 0 0 1em; } .ui.four.statistics { margin: 0 0 -1em; } .ui.four.statistics .statistic { min-width: 25%; margin: 0 0 1em; } .ui.three.statistics { margin: 0 0 -1em; } .ui.three.statistics .statistic { min-width: 33.33333333%; margin: 0 0 1em; } .ui.two.statistics { margin: 0 0 -1em; } .ui.two.statistics .statistic { min-width: 50%; margin: 0 0 1em; } .ui.one.statistics { margin: 0 0 -1em; } .ui.one.statistics .statistic { min-width: 100%; margin: 0 0 1em; } .ui.fluid.statistic { width: 100%; } /* -------------- Horizontal --------------- */ .ui.horizontal.statistic { flex-direction: row; align-items: center; } .ui.horizontal.statistics { flex-direction: column; margin: 0; max-width: none; } .ui.horizontal.statistics .statistic { flex-direction: row; align-items: center; max-width: none; margin: 1em 0; } .ui.horizontal.statistic > .text.value, .ui.horizontal.statistics > .statistic > .text.value { min-height: 0 !important; } .ui.horizontal.statistics .statistic > .value > i.icon, .ui.horizontal.statistic > .value > i.icon { width: 1.18em; } .ui.horizontal.statistics .statistic > .value, .ui.horizontal.statistic > .value { display: inline-block; vertical-align: middle; } .ui.horizontal.statistics .statistic > .label, .ui.horizontal.statistic > .label { display: inline-block; vertical-align: middle; margin: 0 0 0 0.75em; } /* -------------- Inverted --------------- */ .ui.inverted.statistics .statistic > .value, .ui.inverted.statistic .value { color: #fff; } .ui.inverted.statistics .statistic > .label, .ui.inverted.statistic .label { color: rgba(255, 255, 255, 0.9); } /* -------------- Colors --------------- */ .ui.primary.statistics .statistic > .value, .ui.statistics .primary.statistic > .value, .ui.primary.statistic > .value { color: #2185d0; } .ui.inverted.primary.statistics .statistic > .value, .ui.statistics .inverted.primary.statistic > .value, .ui.inverted.primary.statistic > .value { color: #54c8ff; } .ui.secondary.statistics .statistic > .value, .ui.statistics .secondary.statistic > .value, .ui.secondary.statistic > .value { color: #1b1c1d; } .ui.inverted.secondary.statistics .statistic > .value, .ui.statistics .inverted.secondary.statistic > .value, .ui.inverted.secondary.statistic > .value { color: #545454; } .ui.red.statistics .statistic > .value, .ui.statistics .red.statistic > .value, .ui.red.statistic > .value { color: #db2828; } .ui.inverted.red.statistics .statistic > .value, .ui.statistics .inverted.red.statistic > .value, .ui.inverted.red.statistic > .value { color: #ff695e; } .ui.orange.statistics .statistic > .value, .ui.statistics .orange.statistic > .value, .ui.orange.statistic > .value { color: #f2711c; } .ui.inverted.orange.statistics .statistic > .value, .ui.statistics .inverted.orange.statistic > .value, .ui.inverted.orange.statistic > .value { color: #ff851b; } .ui.yellow.statistics .statistic > .value, .ui.statistics .yellow.statistic > .value, .ui.yellow.statistic > .value { color: #fbbd08; } .ui.inverted.yellow.statistics .statistic > .value, .ui.statistics .inverted.yellow.statistic > .value, .ui.inverted.yellow.statistic > .value { color: #ffe21f; } .ui.olive.statistics .statistic > .value, .ui.statistics .olive.statistic > .value, .ui.olive.statistic > .value { color: #b5cc18; } .ui.inverted.olive.statistics .statistic > .value, .ui.statistics .inverted.olive.statistic > .value, .ui.inverted.olive.statistic > .value { color: #d9e778; } .ui.green.statistics .statistic > .value, .ui.statistics .green.statistic > .value, .ui.green.statistic > .value { color: #21ba45; } .ui.inverted.green.statistics .statistic > .value, .ui.statistics .inverted.green.statistic > .value, .ui.inverted.green.statistic > .value { color: #2ecc40; } .ui.teal.statistics .statistic > .value, .ui.statistics .teal.statistic > .value, .ui.teal.statistic > .value { color: #00b5ad; } .ui.inverted.teal.statistics .statistic > .value, .ui.statistics .inverted.teal.statistic > .value, .ui.inverted.teal.statistic > .value { color: #6dffff; } .ui.blue.statistics .statistic > .value, .ui.statistics .blue.statistic > .value, .ui.blue.statistic > .value { color: #2185d0; } .ui.inverted.blue.statistics .statistic > .value, .ui.statistics .inverted.blue.statistic > .value, .ui.inverted.blue.statistic > .value { color: #54c8ff; } .ui.violet.statistics .statistic > .value, .ui.statistics .violet.statistic > .value, .ui.violet.statistic > .value { color: #6435c9; } .ui.inverted.violet.statistics .statistic > .value, .ui.statistics .inverted.violet.statistic > .value, .ui.inverted.violet.statistic > .value { color: #a291fb; } .ui.purple.statistics .statistic > .value, .ui.statistics .purple.statistic > .value, .ui.purple.statistic > .value { color: #a333c8; } .ui.inverted.purple.statistics .statistic > .value, .ui.statistics .inverted.purple.statistic > .value, .ui.inverted.purple.statistic > .value { color: #dc73ff; } .ui.pink.statistics .statistic > .value, .ui.statistics .pink.statistic > .value, .ui.pink.statistic > .value { color: #e03997; } .ui.inverted.pink.statistics .statistic > .value, .ui.statistics .inverted.pink.statistic > .value, .ui.inverted.pink.statistic > .value { color: #ff8edf; } .ui.brown.statistics .statistic > .value, .ui.statistics .brown.statistic > .value, .ui.brown.statistic > .value { color: #a5673f; } .ui.inverted.brown.statistics .statistic > .value, .ui.statistics .inverted.brown.statistic > .value, .ui.inverted.brown.statistic > .value { color: #d67c1c; } .ui.grey.statistics .statistic > .value, .ui.statistics .grey.statistic > .value, .ui.grey.statistic > .value { color: #767676; } .ui.inverted.grey.statistics .statistic > .value, .ui.statistics .inverted.grey.statistic > .value, .ui.inverted.grey.statistic > .value { color: #dcddde; } .ui.black.statistics .statistic > .value, .ui.statistics .black.statistic > .value, .ui.black.statistic > .value { color: #1b1c1d; } .ui.inverted.black.statistics .statistic > .value, .ui.statistics .inverted.black.statistic > .value, .ui.inverted.black.statistic > .value { color: #545454; } /* -------------- Floated --------------- */ .ui[class*="left floated"].statistic { float: left; margin: 0 2em 1em 0; } .ui[class*="right floated"].statistic { float: right; margin: 0 0 1em 2em; } .ui.floated.statistic:last-child { margin-bottom: 0; } /* -------------- Stackable --------------- */ @media only screen and (max-width: 767.98px) { .ui.stackable.statistics { width: auto; margin-left: 0 !important; margin-right: 0 !important; } .ui.stackable.statistics > .statistic { width: 100% !important; margin: 0 !important; padding: 1rem 1rem !important; } } /* -------------- Sizes --------------- */ /* Medium */ .ui.statistics .statistic > .value, .ui.statistic > .value { font-size: 4rem; } .ui.horizontal.statistics .statistic > .value, .ui.horizontal.statistic > .value { font-size: 3rem; } .ui.statistics .statistic > .text.value, .ui.statistic > .text.value { font-size: 2rem; } .ui.mini.statistics .statistic > .value, .ui.mini.statistic > .value { font-size: 1.5rem; } .ui.mini.horizontal.statistics .statistic > .value, .ui.mini.horizontal.statistic > .value { font-size: 1.5rem; } .ui.mini.statistics .statistic > .text.value, .ui.mini.statistic > .text.value { font-size: 1rem; } .ui.tiny.statistics .statistic > .value, .ui.tiny.statistic > .value { font-size: 2rem; } .ui.tiny.horizontal.statistics .statistic > .value, .ui.tiny.horizontal.statistic > .value { font-size: 2rem; } .ui.tiny.statistics .statistic > .text.value, .ui.tiny.statistic > .text.value { font-size: 1rem; } .ui.small.statistics .statistic > .value, .ui.small.statistic > .value { font-size: 3rem; } .ui.small.horizontal.statistics .statistic > .value, .ui.small.horizontal.statistic > .value { font-size: 2rem; } .ui.small.statistics .statistic > .text.value, .ui.small.statistic > .text.value { font-size: 1rem; } .ui.large.statistics .statistic > .value, .ui.large.statistic > .value { font-size: 5rem; } .ui.large.horizontal.statistics .statistic > .value, .ui.large.horizontal.statistic > .value { font-size: 4rem; } .ui.large.statistics .statistic > .text.value, .ui.large.statistic > .text.value { font-size: 2.5rem; } .ui.big.statistics .statistic > .value, .ui.big.statistic > .value { font-size: 5.5rem; } .ui.big.horizontal.statistics .statistic > .value, .ui.big.horizontal.statistic > .value { font-size: 4.5rem; } .ui.big.statistics .statistic > .text.value, .ui.big.statistic > .text.value { font-size: 2.5rem; } .ui.huge.statistics .statistic > .value, .ui.huge.statistic > .value { font-size: 6rem; } .ui.huge.horizontal.statistics .statistic > .value, .ui.huge.horizontal.statistic > .value { font-size: 5rem; } .ui.huge.statistics .statistic > .text.value, .ui.huge.statistic > .text.value { font-size: 2.5rem; } .ui.massive.statistics .statistic > .value, .ui.massive.statistic > .value { font-size: 7rem; } .ui.massive.horizontal.statistics .statistic > .value, .ui.massive.horizontal.statistic > .value { font-size: 6rem; } .ui.massive.statistics .statistic > .text.value, .ui.massive.statistic > .text.value { font-size: 3rem; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/step.css ================================================ /*! * # Fomantic-UI 2.9.4 - Step * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Plural *******************************/ .ui.steps:not(.circular) { display: inline-flex; flex-direction: row; align-items: stretch; margin: 1em 0; background: ""; box-shadow: none; line-height: 1.14285714em; border-radius: 0.28571429rem; border: 1px solid rgba(34, 36, 38, 0.15); } .ui.steps:not(.unstackable) { flex-wrap: wrap; } /* First Steps */ .ui.steps:first-child { margin-top: 0; } /* Last Steps */ .ui.steps:last-child { margin-bottom: 0; } /******************************* Singular *******************************/ .ui.steps:not(.circular) .step { position: relative; display: flex; flex: 1 0 auto; flex-flow: row wrap; vertical-align: middle; align-items: center; justify-content: center; margin: 0 0; padding: 1.14285714em 2em; background: #fff; color: rgba(0, 0, 0, 0.87); box-shadow: none; border-radius: 0; border: none; border-right: 1px solid rgba(34, 36, 38, 0.15); transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, box-shadow 0.1s ease; } /* Arrow */ .ui.steps:not(.circular) .step::after { display: none; position: absolute; z-index: 2; content: ""; top: 50%; right: 0; background-color: #fff; width: 1.14285714em; height: 1.14285714em; border-style: solid; border-color: rgba(34, 36, 38, 0.15); border-width: 0 1px 1px 0; transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, box-shadow 0.1s ease; transform: translateY(-50%) translateX(50%) rotate(-45deg); } /* First Step */ .ui.steps:not(.circular) .step:first-child { padding-left: 2em; border-radius: 0.28571429rem 0 0 0.28571429rem; } /* Last Step */ .ui.steps:not(.circular) .step:last-child { border-radius: 0 0.28571429rem 0.28571429rem 0; border-right: none; margin-right: 0; } /* Only Step */ .ui.steps:not(.circular) .step:only-child { border-radius: 0.28571429rem; } /******************************* Content *******************************/ /* Title */ .ui.steps .step .title { font-family: "Lato", system-ui, -apple-system, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 1.14285714em; font-weight: bold; line-height: 1.14285714em; } .ui.steps .step > .title { width: 100%; } /* Description */ .ui.steps .step .description { font-weight: normal; font-size: 0.92857143em; color: rgba(0, 0, 0, 0.87); line-height: 1.14285714em; } .ui.steps .step > .description { width: 100%; } .ui.steps .step .title ~ .description { margin-top: 0.25em; } /* Icon */ .ui.steps .step > i.icon { line-height: 1; font-size: 2.5em; margin: 0 1rem 0 0; } .ui.steps .step > i.icon, .ui.steps .step > i.icon ~ .content { display: block; flex: 0 1 auto; align-self: center; } /* Horizontal Icon */ .ui.steps:not(.vertical) .step > i.icon { width: auto; } /* Link */ .ui.steps .link.step, .ui.steps a.step { cursor: pointer; } /******************************* Types *******************************/ .ui.circular.steps { border: 0; border-radius: 0; box-shadow: none; } .ui.circular.steps:not(.vertical) { background: transparent; border: 0; border-radius: 0; box-shadow: none; position: relative; display: flex; padding: 1em 0; margin: 1em 0; } .ui.circular.steps:not(.vertical) .step { background: rgba(34, 36, 38, 0.15); cursor: default; height: 2px; display: flex; flex-wrap: wrap; align-items: center; flex: 1; position: relative; margin-left: 2.2em; } .ui.circular.steps:not(.vertical) .step::before { left: -2.2em; } .ui.circular.steps:not(.vertical) .step::after { left: calc((-2.2em + 0.95em) - 0.3em); } .ui.circular.steps:not(.vertical) .step.completed { background: #21ba45; } .ui.circular.steps:not(.vertical) .step.completed::after { left: calc(-2.2em + ((2.2em / 2) / 2) + (2px / 2)); } .ui.circular.steps:not(.vertical) .step:last-child { flex: 0; } .ui.circular.steps:not(.vertical) .step .content { margin-top: -1.5em; padding: 0 0.5em; } .ui.circular.steps:not(.vertical) .step .content.center.aligned { margin-top: -0.65em; } .ui.circular.steps:not(.vertical) .step .content.center.aligned .title { padding: 0 0.5em; margin-left: -0.5em; background: #fff; } .ui.circular.steps:not(.vertical) .step .content.bottom.aligned { margin-top: 0.5em; } .ui.circular.steps:not(.vertical) .step .content:not(.aligned) .title + .description { margin-top: 0.5em; } .ui.circular.steps:not(.vertical) a.step::before, .ui.circular.steps:not(.vertical) a.step::after, .ui.circular.steps:not(.vertical) a.step .content, .ui.circular.steps:not(.vertical) .step.link .content, .ui.circular.steps:not(.vertical) .step.link::before, .ui.circular.steps:not(.vertical) .step.link::after { cursor: pointer; } .ui.circular.steps .step { color: inherit; } .ui.circular.steps .step::before { content: ""; border-radius: 50%; border: 2px solid rgba(34, 36, 38, 0.15); height: 2.2em; width: 2.2em; line-height: 2.2em; position: absolute; } .ui.circular.steps .step::after { content: ""; display: block; position: absolute; border-radius: 50%; background: rgba(34, 36, 38, 0.15); height: 0.95em; width: 0.95em; } .ui.circular.steps .step.active::before { border-color: #21ba45; } .ui.circular.steps .step.active::after { background: #21ba45; } .ui.circular.steps .step.active .title { color: #21ba45; } .ui.circular.steps .step.completed::before { background: #21ba45; border-color: #21ba45; } .ui.circular.steps .step.completed::after { background: transparent; content: "\e800"; font-family: Step; color: #fff; height: auto; line-height: 1em; } @supports selector(:has(.f)) { .ui.circular.steps:not(.vertical) .step:last-child:has(.content) { flex: 1; } .ui.circular.steps:not(.vertical) .step:last-child:has(.center.aligned.content) { background: none; } } /* -------------- Ordered --------------- */ .ui.ordered.steps { counter-reset: ordered; } .ui.ordered.steps .step::before { text-align: center; content: counter(ordered); align-self: center; counter-increment: ordered; font-family: inherit; font-weight: bold; } .ui.ordered.steps:not(.circular) .step::before { display: block; position: static; font-size: 2.5em; margin-right: 1rem; } .ui.circular.ordered.steps .step::before { line-height: calc(2.2em - 2px); } .ui.circular.ordered.steps .step.completed::before { content: ""; } .ui.circular.ordered.steps .step::after { background: transparent; } .ui.circular.ordered.steps .step.active::before { color: #21ba45; } .ui.ordered.steps .step > * { display: block; align-self: center; } /* -------------- Vertical --------------- */ .ui.vertical.steps:not(.circular) { display: inline-flex; flex-direction: column; overflow: visible; } .ui.vertical.steps:not(.circular) .step { justify-content: flex-start; border-radius: 0; padding: 1.14285714em 2em; border-right: none; border-bottom: 1px solid rgba(34, 36, 38, 0.15); } .ui.vertical.steps:not(.circular) .step:first-child { padding: 1.14285714em 2em; border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.vertical.steps:not(.circular) .step:last-child { border-bottom: none; border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui.vertical.steps:not(.circular) .step:only-child { border-radius: 0.28571429rem; } /* Arrow */ .ui.vertical.steps:not(.circular) .step::after { top: 50%; right: 0; border-width: 0 1px 1px 0; display: none; } .ui.right.vertical.steps:not(.circular) .step::after { border-width: 1px 0 0 1px; left: 0; right: 100%; transform: translateY(-50%) translateX(-50%) rotate(-45deg); } .ui.vertical.steps:not(.circular) .active.step::after { display: block; } .ui.vertical.steps:not(.circular) .step:last-child::after { display: none; } .ui.vertical.steps:not(.circular) .active.step:last-child::after { display: block; } /* Circular Step */ .ui.circular.vertical.steps { display: inline-flex; flex-flow: column wrap; align-items: flex-start; } .ui.circular.vertical.steps .step { position: relative; width: 100%; } .ui.circular.vertical.steps .step::before { left: 0; top: 0; } .ui.circular.vertical.steps .step::after { left: calc((2.2em / (2.2 * 2)) + 2px); top: calc((2.2em / (2.2 * 2)) + 2px); } .ui.circular.vertical.steps .step .content { padding-left: 3.5em; } .ui.circular.vertical.steps .step:not(:last-child) { padding-bottom: 3em; } .ui.circular.vertical.steps .step:not(:last-child) .content::before { content: ""; position: absolute; border-left: 2px solid rgba(34, 36, 38, 0.15); top: 2.2em; bottom: 0; left: calc(2.2em / 2); } .ui.circular.vertical.steps .step.completed .content::before { border-color: #21ba45; } .ui.circular.vertical.steps .step.completed::before { background: #21ba45; border-color: #21ba45; } .ui.circular.vertical.steps .step.completed::after { top: calc((2.2em / (2.2 * 2)) + (2px - (2px / 2))); } /* --------------- Responsive ---------------- */ /* Mobile (Default) */ @media only screen and (max-width: 767.98px) { .ui.steps:not(.unstackable):not(.circular) { display: inline-flex; overflow: visible; flex-direction: column; } .ui.steps:not(.unstackable):not(.circular) .step { width: 100% !important; flex-direction: column; border-radius: 0; padding: 1.14285714em 2em; border-right: none; border-bottom: 1px solid rgba(34, 36, 38, 0.15); } .ui.steps:not(.unstackable):not(.circular) .step:first-child { padding: 1.14285714em 2em; border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.steps:not(.unstackable):not(.circular) .step:last-child { border-radius: 0 0 0.28571429rem 0.28571429rem; border-bottom: none; } /* Arrow */ .ui.steps:not(.unstackable):not(.circular) .step::after { top: unset; bottom: -1.14285714em; right: 50%; transform: translateY(-50%) translateX(50%) rotate(45deg); } .ui.vertical.steps:not(.circular) .active.step:last-child::after { display: none; } /* Content */ .ui.steps:not(.unstackable):not(.circular) .step .content { text-align: center; } /* Icon */ .ui.steps:not(.unstackable):not(.circular) .step > i.icon, .ui.ordered.steps:not(.unstackable):not(.circular) .step::before { margin: 0 0 1rem 0; } } /******************************* States *******************************/ /* Link Hover */ .ui.steps:not(.circular) .link.step:hover::after, .ui.steps:not(.circular) .link.step:hover, .ui.steps:not(.circular) a.step:hover::after, .ui.steps:not(.circular) a.step:hover { background: #f9fafb; color: rgba(0, 0, 0, 0.8); } /* Link Down */ .ui.steps:not(.circular) .link.step:active::after, .ui.steps:not(.circular) .link.step:active, .ui.steps:not(.circular) a.step:active::after, .ui.steps:not(.circular) a.step:active { background: #f3f4f5; color: rgba(0, 0, 0, 0.9); } /* Active */ .ui.steps:not(.circular) .step.active { cursor: auto; background: #f3f4f5; } .ui.steps:not(.circular) .step.active::after { background: #f3f4f5; } .ui.steps:not(.circular) .step.active .title { color: #4183c4; } .ui.ordered.steps .step.active::before, .ui.steps .active.step i.icon { color: rgba(0, 0, 0, 0.85); } /* Active Arrow */ .ui.steps:not(.circular) .step::after { display: block; } .ui.steps:not(.circular) .active.step::after { display: block; } .ui.steps:not(.circular) .step:last-child::after { display: none; } .ui.steps:not(.circular) .active.step:last-child::after { display: none; } /* Active Hover */ .ui.steps:not(.circular) .link.active.step:hover::after, .ui.steps:not(.circular) .link.active.step:hover, .ui.steps:not(.circular) a.active.step:hover::after, .ui.steps:not(.circular) a.active.step:hover { cursor: pointer; background: #dcddde; color: rgba(0, 0, 0, 0.87); } /* Completed */ .ui.steps .step.completed > i.icon::before, .ui.ordered.steps .step.completed::before { color: #21ba45; } /* Disabled */ .ui.steps:not(.circular) .disabled.step { cursor: auto; background: #fff; pointer-events: none; } .ui.steps:not(.circular) .disabled.step, .ui.steps:not(.circular) .disabled.step .title, .ui.steps:not(.circular) .disabled.step .description { color: rgba(40, 40, 40, 0.3); } .ui.steps:not(.circular) .disabled.step::after { background: #fff; } .ui.circular.steps .disabled.step { cursor: auto; opacity: 0.5; pointer-events: none; } .ui.circular.steps .disabled.step::before, .ui.circular.steps .disabled.step::after { cursor: auto; } /******************************* Variations *******************************/ /* -------------- Stackable --------------- */ /* Tablet Or Below */ @media only screen and (max-width: 991.98px) { .ui[class*="tablet stackable"].steps:not(.circular) { display: inline-flex; overflow: visible; flex-direction: column; } /* Steps */ .ui[class*="tablet stackable"].steps:not(.circular) .step { flex-direction: column; border-radius: 0; padding: 1.14285714em 2em; border-right: none; border-bottom: 1px solid rgba(34, 36, 38, 0.15); } .ui[class*="tablet stackable"].steps:not(.circular) .step:first-child { padding: 1.14285714em 2em; border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui[class*="tablet stackable"].steps:not(.circular) .step:last-child { border-radius: 0 0 0.28571429rem 0.28571429rem; border-bottom: none; } /* Arrow */ .ui[class*="tablet stackable"].steps:not(.circular) .step::after { top: unset; bottom: -1.14285714em; right: 50%; transform: translateY(-50%) translateX(50%) rotate(45deg); } /* Content */ .ui[class*="tablet stackable"].steps:not(.circular) .step .content { text-align: center; } /* Icon */ .ui[class*="tablet stackable"].steps .step > i.icon, .ui[class*="tablet stackable"].ordered.steps .step::before { margin: 0 0 1rem 0; } } /* -------------- Fluid --------------- */ /* Fluid */ .ui.fluid.steps { display: flex; width: 100%; } /* -------------- Attached --------------- */ /* Top */ .ui.attached.steps:not(.circular) { width: calc(100% + 2px) !important; margin: 0 -1px 0; max-width: calc(100% + 2px); border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.attached.steps:not(.circular) .step:first-child { border-radius: 0.28571429rem 0 0 0; } .ui.attached.steps:not(.circular) .step:last-child { border-radius: 0 0.28571429rem 0 0; } /* Bottom */ .ui.bottom.attached.steps:not(.circular) { margin: 0 -1px 0; border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui.bottom.attached.steps:not(.circular) .step:first-child { border-radius: 0 0 0 0.28571429rem; } .ui.bottom.attached.steps:not(.circular) .step:last-child { border-radius: 0 0 0.28571429rem 0; } /* ------------------- Evenly Divided -------------------- */ .ui.one.steps, .ui.two.steps, .ui.three.steps, .ui.four.steps, .ui.five.steps, .ui.six.steps, .ui.seven.steps, .ui.eight.steps { width: 100%; } .ui.one.steps > .step, .ui.two.steps > .step, .ui.three.steps > .step, .ui.four.steps > .step, .ui.five.steps > .step, .ui.six.steps > .step, .ui.seven.steps > .step, .ui.eight.steps > .step { flex-wrap: nowrap; } .ui.one.steps > .step { width: 100%; } .ui.two.steps > .step { width: 50%; } .ui.three.steps > .step { width: 33.333%; } .ui.four.steps > .step { width: 25%; } .ui.five.steps > .step { width: 20%; } .ui.six.steps > .step { width: 16.666%; } .ui.seven.steps > .step { width: 14.285%; } .ui.eight.steps > .step { width: 12.5%; } /* ------------------- Sizes -------------------- */ .ui.steps .step, .ui.step { font-size: 1rem; } .ui.mini.steps .step, .ui.mini.step { font-size: 0.78571429rem; } .ui.mini.circular.steps:not(.vertical) { margin: 0.78571429rem 0; padding: 0.78571429rem 0; } .ui.tiny.steps .step, .ui.tiny.step { font-size: 0.85714286rem; } .ui.tiny.circular.steps:not(.vertical) { margin: 0.85714286rem 0; padding: 0.85714286rem 0; } .ui.small.steps .step, .ui.small.step { font-size: 0.92857143rem; } .ui.small.circular.steps:not(.vertical) { margin: 0.92857143rem 0; padding: 0.92857143rem 0; } .ui.large.steps .step, .ui.large.step { font-size: 1.14285714rem; } .ui.large.circular.steps:not(.vertical) { margin: 1.14285714rem 0; padding: 1.14285714rem 0; } .ui.big.steps .step, .ui.big.step { font-size: 1.28571429rem; } .ui.big.circular.steps:not(.vertical) { margin: 1.28571429rem 0; padding: 1.28571429rem 0; } .ui.huge.steps .step, .ui.huge.step { font-size: 1.42857143rem; } .ui.huge.circular.steps:not(.vertical) { margin: 1.42857143rem 0; padding: 1.42857143rem 0; } .ui.massive.steps .step, .ui.massive.step { font-size: 1.71428571rem; } .ui.massive.circular.steps:not(.vertical) { margin: 1.71428571rem 0; padding: 1.71428571rem 0; } /* -------------- Inverted --------------- */ .ui.inverted.steps:not(.circular) { border: 1px solid #555; } .ui.inverted.steps:not(.circular) .step { color: rgba(255, 255, 255, 0.9); background: #1b1c1d; border-color: #555; } .ui.inverted.steps:not(.circular) .step::after { background-color: #1b1c1d; border-color: #555; } .ui.inverted.steps .step .description { color: rgba(255, 255, 255, 0.9); } /* Active */ .ui.inverted.steps:not(.circular) .step.active, .ui.inverted.steps:not(.circular) .step.active::after { background: #333; } .ui.inverted.ordered.steps:not(.circular) .step.active::before, .ui.inverted.steps:not(.circular) .active.step i.icon { color: #ffffff; } /* Disabled */ .ui.inverted.steps:not(.circular) .disabled.step, .ui.inverted.steps:not(.circular) .disabled.step::after { background: #222; } .ui.inverted.steps:not(.circular) .disabled.step, .ui.inverted.steps:not(.circular) .disabled.step .title, .ui.inverted.steps:not(.circular) .disabled.step .description { color: rgba(225, 225, 225, 0.3); } /* Link Hover */ .ui.inverted.steps:not(.circular) .link.step:hover::after, .ui.inverted.steps:not(.circular) .link.step:hover, .ui.inverted.steps:not(.circular) a.step:hover::after, .ui.inverted.steps:not(.circular) a.step:hover { background: #3f3f3f; color: #ffffff; } /* Link Down */ .ui.inverted.steps:not(.circular) .link.step:active::after, .ui.inverted.steps:not(.circular) .link.step:active, .ui.inverted.steps:not(.circular) a.step:active::after, .ui.inverted.steps:not(.circular) a.step:active { background: #444; color: #ffffff; } /* Circular Step */ .ui.inverted.circular.steps .step .content { color: rgba(255, 255, 255, 0.9); } .ui.inverted.circular.steps:not(.vertical) .step:not(.completed) { background: rgba(255, 255, 255, 0.9); } .ui.inverted.circular.steps:not(.vertical) .step:not(.active):not(.completed)::before { border-color: rgba(255, 255, 255, 0.9); } .ui.inverted.circular.steps:not(.vertical) .step .center.aligned.content .title { background: #1b1c1d; } .ui.inverted.circular.steps:not(.ordered) .step:not(.active):not(.completed)::after { background: rgba(255, 255, 255, 0.9); } .ui.inverted.circular.steps.vertical .step:not(.active):not(.completed)::before { border-color: rgba(255, 255, 255, 0.9); } .ui.inverted.circular.steps.vertical .step:not(.completed) .content::before { background: rgba(255, 255, 255, 0.9); } .ui.ui.circular.steps .step.primary::before { border-color: #2185d0; } .ui.ui.circular.steps .step.primary::after { background: #2185d0; } .ui.ui.primary.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.primary.active::before { border-color: #2185d0; } .ui.ui.primary.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.primary.active::after { background: #2185d0; } .ui.ui.primary.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.primary.completed::before { background: #2185d0; border-color: #2185d0; } .ui.ui.primary.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.primary.completed { background: #2185d0; } .ui.ui.circular.steps:not(.vertical) .step.primary { background: #2185d0; } .ui.ui.primary.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.primary.active .content .title { color: #2185d0; } .ui.ui.vertical.circular.steps .step.completed.primary .content::before { border-color: #2185d0; } .ui.ui.primary.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.primary.completed .content::before { border-color: #2185d0; } .ui.ui.primary.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.primary::after { background: transparent; } .ui.ui.primary.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.primary.active::before { color: #2185d0; } .ui.ui.circular.steps .step.secondary::before { border-color: #1b1c1d; } .ui.ui.circular.steps .step.secondary::after { background: #1b1c1d; } .ui.ui.secondary.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.secondary.active::before { border-color: #1b1c1d; } .ui.ui.secondary.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.secondary.active::after { background: #1b1c1d; } .ui.ui.secondary.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.secondary.completed::before { background: #1b1c1d; border-color: #1b1c1d; } .ui.ui.secondary.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.secondary.completed { background: #1b1c1d; } .ui.ui.circular.steps:not(.vertical) .step.secondary { background: #1b1c1d; } .ui.ui.secondary.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.secondary.active .content .title { color: #1b1c1d; } .ui.ui.vertical.circular.steps .step.completed.secondary .content::before { border-color: #1b1c1d; } .ui.ui.secondary.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.secondary.completed .content::before { border-color: #1b1c1d; } .ui.ui.secondary.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.secondary::after { background: transparent; } .ui.ui.secondary.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.secondary.active::before { color: #1b1c1d; } .ui.ui.circular.steps .step.red::before { border-color: #db2828; } .ui.ui.circular.steps .step.red::after { background: #db2828; } .ui.ui.red.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.red.active::before { border-color: #db2828; } .ui.ui.red.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.red.active::after { background: #db2828; } .ui.ui.red.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.red.completed::before { background: #db2828; border-color: #db2828; } .ui.ui.red.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.red.completed { background: #db2828; } .ui.ui.circular.steps:not(.vertical) .step.red { background: #db2828; } .ui.ui.red.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.red.active .content .title { color: #db2828; } .ui.ui.vertical.circular.steps .step.completed.red .content::before { border-color: #db2828; } .ui.ui.red.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.red.completed .content::before { border-color: #db2828; } .ui.ui.red.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.red::after { background: transparent; } .ui.ui.red.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.red.active::before { color: #db2828; } .ui.ui.circular.steps .step.orange::before { border-color: #f2711c; } .ui.ui.circular.steps .step.orange::after { background: #f2711c; } .ui.ui.orange.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.orange.active::before { border-color: #f2711c; } .ui.ui.orange.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.orange.active::after { background: #f2711c; } .ui.ui.orange.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.orange.completed::before { background: #f2711c; border-color: #f2711c; } .ui.ui.orange.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.orange.completed { background: #f2711c; } .ui.ui.circular.steps:not(.vertical) .step.orange { background: #f2711c; } .ui.ui.orange.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.orange.active .content .title { color: #f2711c; } .ui.ui.vertical.circular.steps .step.completed.orange .content::before { border-color: #f2711c; } .ui.ui.orange.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.orange.completed .content::before { border-color: #f2711c; } .ui.ui.orange.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.orange::after { background: transparent; } .ui.ui.orange.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.orange.active::before { color: #f2711c; } .ui.ui.circular.steps .step.yellow::before { border-color: #fbbd08; } .ui.ui.circular.steps .step.yellow::after { background: #fbbd08; } .ui.ui.yellow.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.yellow.active::before { border-color: #fbbd08; } .ui.ui.yellow.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.yellow.active::after { background: #fbbd08; } .ui.ui.yellow.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.yellow.completed::before { background: #fbbd08; border-color: #fbbd08; } .ui.ui.yellow.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.yellow.completed { background: #fbbd08; } .ui.ui.circular.steps:not(.vertical) .step.yellow { background: #fbbd08; } .ui.ui.yellow.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.yellow.active .content .title { color: #fbbd08; } .ui.ui.vertical.circular.steps .step.completed.yellow .content::before { border-color: #fbbd08; } .ui.ui.yellow.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.yellow.completed .content::before { border-color: #fbbd08; } .ui.ui.yellow.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.yellow::after { background: transparent; } .ui.ui.yellow.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.yellow.active::before { color: #fbbd08; } .ui.ui.circular.steps .step.olive::before { border-color: #b5cc18; } .ui.ui.circular.steps .step.olive::after { background: #b5cc18; } .ui.ui.olive.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.olive.active::before { border-color: #b5cc18; } .ui.ui.olive.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.olive.active::after { background: #b5cc18; } .ui.ui.olive.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.olive.completed::before { background: #b5cc18; border-color: #b5cc18; } .ui.ui.olive.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.olive.completed { background: #b5cc18; } .ui.ui.circular.steps:not(.vertical) .step.olive { background: #b5cc18; } .ui.ui.olive.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.olive.active .content .title { color: #b5cc18; } .ui.ui.vertical.circular.steps .step.completed.olive .content::before { border-color: #b5cc18; } .ui.ui.olive.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.olive.completed .content::before { border-color: #b5cc18; } .ui.ui.olive.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.olive::after { background: transparent; } .ui.ui.olive.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.olive.active::before { color: #b5cc18; } .ui.ui.circular.steps .step.green::before { border-color: #21ba45; } .ui.ui.circular.steps .step.green::after { background: #21ba45; } .ui.ui.green.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.green.active::before { border-color: #21ba45; } .ui.ui.green.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.green.active::after { background: #21ba45; } .ui.ui.green.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.green.completed::before { background: #21ba45; border-color: #21ba45; } .ui.ui.green.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.green.completed { background: #21ba45; } .ui.ui.circular.steps:not(.vertical) .step.green { background: #21ba45; } .ui.ui.green.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.green.active .content .title { color: #21ba45; } .ui.ui.vertical.circular.steps .step.completed.green .content::before { border-color: #21ba45; } .ui.ui.green.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.green.completed .content::before { border-color: #21ba45; } .ui.ui.green.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.green::after { background: transparent; } .ui.ui.green.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.green.active::before { color: #21ba45; } .ui.ui.circular.steps .step.teal::before { border-color: #00b5ad; } .ui.ui.circular.steps .step.teal::after { background: #00b5ad; } .ui.ui.teal.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.teal.active::before { border-color: #00b5ad; } .ui.ui.teal.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.teal.active::after { background: #00b5ad; } .ui.ui.teal.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.teal.completed::before { background: #00b5ad; border-color: #00b5ad; } .ui.ui.teal.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.teal.completed { background: #00b5ad; } .ui.ui.circular.steps:not(.vertical) .step.teal { background: #00b5ad; } .ui.ui.teal.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.teal.active .content .title { color: #00b5ad; } .ui.ui.vertical.circular.steps .step.completed.teal .content::before { border-color: #00b5ad; } .ui.ui.teal.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.teal.completed .content::before { border-color: #00b5ad; } .ui.ui.teal.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.teal::after { background: transparent; } .ui.ui.teal.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.teal.active::before { color: #00b5ad; } .ui.ui.circular.steps .step.blue::before { border-color: #2185d0; } .ui.ui.circular.steps .step.blue::after { background: #2185d0; } .ui.ui.blue.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.blue.active::before { border-color: #2185d0; } .ui.ui.blue.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.blue.active::after { background: #2185d0; } .ui.ui.blue.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.blue.completed::before { background: #2185d0; border-color: #2185d0; } .ui.ui.blue.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.blue.completed { background: #2185d0; } .ui.ui.circular.steps:not(.vertical) .step.blue { background: #2185d0; } .ui.ui.blue.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.blue.active .content .title { color: #2185d0; } .ui.ui.vertical.circular.steps .step.completed.blue .content::before { border-color: #2185d0; } .ui.ui.blue.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.blue.completed .content::before { border-color: #2185d0; } .ui.ui.blue.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.blue::after { background: transparent; } .ui.ui.blue.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.blue.active::before { color: #2185d0; } .ui.ui.circular.steps .step.violet::before { border-color: #6435c9; } .ui.ui.circular.steps .step.violet::after { background: #6435c9; } .ui.ui.violet.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.violet.active::before { border-color: #6435c9; } .ui.ui.violet.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.violet.active::after { background: #6435c9; } .ui.ui.violet.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.violet.completed::before { background: #6435c9; border-color: #6435c9; } .ui.ui.violet.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.violet.completed { background: #6435c9; } .ui.ui.circular.steps:not(.vertical) .step.violet { background: #6435c9; } .ui.ui.violet.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.violet.active .content .title { color: #6435c9; } .ui.ui.vertical.circular.steps .step.completed.violet .content::before { border-color: #6435c9; } .ui.ui.violet.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.violet.completed .content::before { border-color: #6435c9; } .ui.ui.violet.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.violet::after { background: transparent; } .ui.ui.violet.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.violet.active::before { color: #6435c9; } .ui.ui.circular.steps .step.purple::before { border-color: #a333c8; } .ui.ui.circular.steps .step.purple::after { background: #a333c8; } .ui.ui.purple.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.purple.active::before { border-color: #a333c8; } .ui.ui.purple.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.purple.active::after { background: #a333c8; } .ui.ui.purple.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.purple.completed::before { background: #a333c8; border-color: #a333c8; } .ui.ui.purple.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.purple.completed { background: #a333c8; } .ui.ui.circular.steps:not(.vertical) .step.purple { background: #a333c8; } .ui.ui.purple.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.purple.active .content .title { color: #a333c8; } .ui.ui.vertical.circular.steps .step.completed.purple .content::before { border-color: #a333c8; } .ui.ui.purple.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.purple.completed .content::before { border-color: #a333c8; } .ui.ui.purple.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.purple::after { background: transparent; } .ui.ui.purple.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.purple.active::before { color: #a333c8; } .ui.ui.circular.steps .step.pink::before { border-color: #e03997; } .ui.ui.circular.steps .step.pink::after { background: #e03997; } .ui.ui.pink.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.pink.active::before { border-color: #e03997; } .ui.ui.pink.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.pink.active::after { background: #e03997; } .ui.ui.pink.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.pink.completed::before { background: #e03997; border-color: #e03997; } .ui.ui.pink.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.pink.completed { background: #e03997; } .ui.ui.circular.steps:not(.vertical) .step.pink { background: #e03997; } .ui.ui.pink.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.pink.active .content .title { color: #e03997; } .ui.ui.vertical.circular.steps .step.completed.pink .content::before { border-color: #e03997; } .ui.ui.pink.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.pink.completed .content::before { border-color: #e03997; } .ui.ui.pink.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.pink::after { background: transparent; } .ui.ui.pink.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.pink.active::before { color: #e03997; } .ui.ui.circular.steps .step.brown::before { border-color: #a5673f; } .ui.ui.circular.steps .step.brown::after { background: #a5673f; } .ui.ui.brown.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.brown.active::before { border-color: #a5673f; } .ui.ui.brown.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.brown.active::after { background: #a5673f; } .ui.ui.brown.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.brown.completed::before { background: #a5673f; border-color: #a5673f; } .ui.ui.brown.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.brown.completed { background: #a5673f; } .ui.ui.circular.steps:not(.vertical) .step.brown { background: #a5673f; } .ui.ui.brown.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.brown.active .content .title { color: #a5673f; } .ui.ui.vertical.circular.steps .step.completed.brown .content::before { border-color: #a5673f; } .ui.ui.brown.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.brown.completed .content::before { border-color: #a5673f; } .ui.ui.brown.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.brown::after { background: transparent; } .ui.ui.brown.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.brown.active::before { color: #a5673f; } .ui.ui.circular.steps .step.grey::before { border-color: #767676; } .ui.ui.circular.steps .step.grey::after { background: #767676; } .ui.ui.grey.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.grey.active::before { border-color: #767676; } .ui.ui.grey.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.grey.active::after { background: #767676; } .ui.ui.grey.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.grey.completed::before { background: #767676; border-color: #767676; } .ui.ui.grey.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.grey.completed { background: #767676; } .ui.ui.circular.steps:not(.vertical) .step.grey { background: #767676; } .ui.ui.grey.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.grey.active .content .title { color: #767676; } .ui.ui.vertical.circular.steps .step.completed.grey .content::before { border-color: #767676; } .ui.ui.grey.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.grey.completed .content::before { border-color: #767676; } .ui.ui.grey.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.grey::after { background: transparent; } .ui.ui.grey.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.grey.active::before { color: #767676; } .ui.ui.circular.steps .step.black::before { border-color: #1b1c1d; } .ui.ui.circular.steps .step.black::after { background: #1b1c1d; } .ui.ui.black.circular.steps .step.active::before, .ui.ui.ui.circular.steps .step.black.active::before { border-color: #1b1c1d; } .ui.ui.black.circular.steps .step.active::after, .ui.ui.ui.circular.steps .step.black.active::after { background: #1b1c1d; } .ui.ui.black.circular.steps .step.completed::before, .ui.ui.ui.circular.steps .step.black.completed::before { background: #1b1c1d; border-color: #1b1c1d; } .ui.ui.black.circular.steps:not(.vertical) .step.completed, .ui.ui.ui.circular.steps:not(.vertical) .step.black.completed { background: #1b1c1d; } .ui.ui.circular.steps:not(.vertical) .step.black { background: #1b1c1d; } .ui.ui.black.circular.steps .step.active .content .title, .ui.ui.ui.circular.steps .step.black.active .content .title { color: #1b1c1d; } .ui.ui.vertical.circular.steps .step.completed.black .content::before { border-color: #1b1c1d; } .ui.ui.black.vertical.circular.steps .step.completed .content::before, .ui.ui.vertical.circular.steps .step.black.completed .content::before { border-color: #1b1c1d; } .ui.ui.black.circular.ordered.steps .step::after, .ui.ui.circular.ordered.steps .step.black::after { background: transparent; } .ui.ui.black.circular.ordered.steps .step.active::before, .ui.ui.circular.ordered.steps .step.black.active::before { color: #1b1c1d; } /******************************* Theme Overrides *******************************/ @font-face { font-family: Step; src: url("data:application/font-woff;base64,d09GRgABAAAAAAqgABAAAAAAEXwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAKhAAAABwAAAAcjOLzxEdERUYAAApoAAAAHAAAACAAJwAYT1MvMgAAAeQAAABEAAAAVj4wSUZjbWFwAAACPAAAAEYAAAFO0BkDx2N2dCAAAAfYAAAAFAAAABwGSf+UZnBnbQAAAoQAAAT5AAAJkYoKeDtnYXNwAAAKYAAAAAgAAAAIAAAAEGdseWYAAAf4AAAAuAAAALj5yjT+aGVhZAAAAWwAAAA1AAAANhGASlVoaGVhAAABpAAAACAAAAAkB3wDa2htdHgAAAIoAAAAFAAAABQMwgBDbG9jYQAAB+wAAAAMAAAADAA4AFxtYXhwAAABxAAAACAAAAAgAKgAR25hbWUAAAiwAAABgQAAAuggq9iKcG9zdAAACjQAAAAqAAAAPa7AQJpwcmVwAAAHgAAAAFYAAABWkqGa/3icY2BkYGAAYin+m+nx/DZfGeRZGEDgvOmMXhB9PyH33/+//9cz72KWA3I5GJhAogBAsAyTAAAAeJxjYGRgYE77n8YQw8Lw/+///8y7GIAiKIAVAKglBu0AAQAAAAUAFgABAAAAAAACAAYAEwBuAAAALQAcAAAAAHicY2BkPs84gYGVgYOpk+ksAwNDP4RmfMNgxMjBwMDEwMrMgBUEpLmmMDi8YHjByJz2P40hhlmOIRAozAiSAwAYDgv0BAAAAAAAAAABVAAABAAARgNt//14nN2MwQ3AIAwDzxQxBSMwCPtPwRbUCf10BSwlJ0u2gYdzHRGadkpfGWYzRYGlvSOwOMxUzba/Gt+A6XQ0fhLX6wWAUwawAAB4nJ1V2XbTVhSVPGRwEjpkoKAO19w4UOvKhCkYMGkqxXYhHRwIrQQdpAx05J3HPutrjkK7Vh/5tO59PSS0dK22LJbPvkdbZ9g650YcIyp9Gohr1KGSlwOprD2WSvdJXNd1L4+VDAZxXbYST0mbqJ0kSmrd7FAu8VjrKlknWCfj5SBWT1WeZ6AM4hQeZUlEG0QbqZcmSeKJ4yeJFmcQHyVJICWjEKfSyFBCNRrEUtWhTOnQq9cTcdNAykajHnVYVPdDxSfHNafUrANGKlc5whXr1Ua+G6cDL3uQxDrBs62HMR54rH6UKpCKkenIP3ZKTpSGgVRx1KFW4ugwk1/3kUwqzUCmjGJFpe6BuN39dNsWMT10Or4uSpVGqrq5ziia7dHxqIMoD9nG6aTc0Nn28OUZU1SrXXGz7UBmDVxKyWx0n0QAHSZS4+kBTjWcAqkZ9UfF2efPARLJXJSqPFUyh3oDmTM7e3Ex7W4nq7JwpJ8HMm92duOdh0OnV4d/0foXTOHMR4/iYn4+QvpQan4iTiSlRljM8qeGH3FXIEK5MYgLF8rgU4Q5dEXa2WZd47Ux9obP+UqpYT0J2uij+H4K/U4kKxxnUaP1SJzNY9d1rdxnUEu1uxc7Mq9DlSLu7wsLrjPnhGGeFgtVX5753gU0/waIZ/xA3jSFS/uWKUq0b5uiTLtoigrtElSlXTbFFO2KKaZpz5pihvYdU8zSnjMy4//L3OeR+xze8ZCb9l3kpn0PuWnfR27aD5CbViE3bR25aS8gN61GbtpVozp2BBoGaRdSFUHQNLL6YdxWm/VA1ow0fGlg8i5iyPrqREedtbXKH8V/deILB3Jpoqe7Iheb4i6v2xY+PN3uq4+aRt2w1fjGkfIwHkZ6HJrQWfnN4b/tTd0umu4yqjLoARVMCsAAZe1AAtM62wmk9Zqn+PIHYFyGeM5KQ7VUnzuGpu/leV/3sTnxvsftxi63XHd5CVnWDXJj9vDfUmSq6x/lLa1UJ0esKyePVWsYQyq8KLq+kpR7tLUbvyipsvJelNbK55OQmz2DG0Jbtu5hsCNMacolHl5TpSg91FKOskMsbynKPOCUiwtahsS4DnUPamvE6aF6GBsLIYahtL0QcEgpXRXftMp38R6ra9jo+MUV4el6chIRn+Iq+1HwVNdG/egO2rxm3TKDKVWqp/uMT7Gv2/ZRWWmkjrMXt1QH1zTrGjkV00/ka+B0bzho3QM9VHw0QSNVNcfoxihjNJY15d8EdDFWfsNo1WL7PdxPnaRVrLlLmOybE/fgtLv9Kvu1nFtG1v3XBr1t5IqfIzG/LQr8Owdit2QN1DuTgRgLyFnQGMYWJncYroNtxG32Pyan/9+GhUVyVzsau3nqw9WTUSV32fK4y012WdejNkfVThr7CI0tDzfm2OFyLLbEYEG2/sH/Me4Bd2lRAuDQyGWYiNp0oZ7q4eoeq7FtOFcSAXbNseN0AHoALkHfHLvW8wmA9dwj5y7AfXIIdsgh+JQcgs/IuQXwOTkEX5BDMCCHYJecOwAPyCF4SA7BHjkEj8jZBPiSHIKvyCGIySFIyLkN8JgcgifkEHxNDsE3Rq5OZP6WB9kA+s6im0CpnRoc2jhkRq5N2Ps8WPaBRWQfWkTqkZHrE+pTHiz1e4tI/cEiUn80cmNC/YkHS/3ZIlJ/sYjUZ8aXmSMprw6e844O/gSX6q1eAAAAS7gAyFJYsQEBjlm5CAAIAGMgsAEjRLADI3CyBCgJRVJEsgoCByqxBgFEsSQBiFFYsECIWLEGA0SxJgGIUVi4BACIWLEGAURZWVlZuAH/hbAEjbEFAEQAAHicY2BAA0YMRszc/zeCMAAQtAPhAAAAAAAAAAAAOABcAAEARgABA7oCqAAVABxAGQ8BAAEBQgACAQJqAAEAAWoAAABhFBcUAxIrARQHAQYiJwEmND8BNjIfAQE2Mh8BFgO6D/4UEC0Q/uMPD04QLRGoAXYQLhBODwIjFxD+FA8PAR0QLRFOEBCpAXgQEE4QAAAB//3/rwN0Ax4ADAASQA8AAQEKQwAAAAsARBUTAhErARQOASIuAj4BMh4BA251y+3NcQZ9wPq/gQFmeMh3d8nvyXd3yQAAAHicfZHLSsNAFIb/6UVrCyIKrg8IYhHSC7pxVSlUcOmi+7SmSUqaCZOp0NfxGdz6CLpz69atK9f+SUfBgk3I5Dv/ucyZMwAO8Q6F9XOJxLFCA0+OK9jFi+Mq9Q/HNTRUxXEdLXXieIf6teMmztWj4xaO1BcrqNoerXlZrWCFAzw6rmAfz46r1N8c18ifjus4Vi3HOzhQHcdNjNWt4xZO1SuG0MiwgkGMEBEsBGdU2/z30UUPF6QJI4SR66gYKXzOQbgumRGVnpz2gN+MVko1YERC9jDlugCGOluZOIysnA3b0u/2LmSyEk0pTv1E/KWNtMllIDOd2iBJtDfVTNushx83cEcxZAsJGzE0g3CZ+GZryhbXmGJxjLgMER7d4wAwDkwe61R6Xndr+g3FtCzhlwH3v3PL8cA2+1QtCxQTMuVEBKONcsK7KHxzKlPqHssGaWB8G9wXw8ofwr61M5kZvZCR21oyo+fB1DI4KvfIcIUO339vIrI2u+p0/sz5GyLHh70AAAB4nGNgYoAALgbsgBWIGRmYGJkYmTmTM1KTs3MTi7LZkjOLknNSATkPBkYAAAABAAH//wAPeJxjYGRgYOABYgEGCQYmIM0CxCCaEYIBBW0AQAAAAAEAAAAA3kztOAAAAADPNZiNAAAAAN9gbf4=") format("woff"); } .ui.steps .step.completed > .icon::before, .ui.ordered.steps .step.completed::before { font-family: Step; content: "\e800"; /* '' */ } /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/sticky.css ================================================ /*! * # Fomantic-UI 2.9.4 - Sticky * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Sticky *******************************/ .ui.sticky { position: static; transition: none; z-index: 800; } /******************************* States *******************************/ /* Bound */ .ui.sticky.bound { position: absolute; left: auto; right: auto; } /* Fixed */ .ui.sticky.fixed { position: fixed; left: auto; right: auto; } /* Bound/Fixed Position */ .ui.sticky.bound.top, .ui.sticky.fixed.top { top: 0; bottom: auto; } .ui.sticky.bound.bottom, .ui.sticky.fixed.bottom { top: auto; bottom: 0; } /******************************* Types *******************************/ .ui.native.sticky { position: sticky; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/sticky.js ================================================ /*! * # Fomantic-UI 2.9.4 - Sticky * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.sticky = function (parameters) { var $allModules = $(this), $document = $(document), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $(context); } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : window; } } return $context; }, returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.sticky.settings, parameters) : $.extend({}, $.fn.sticky.settings), className = settings.className, namespace = settings.namespace, error = settings.error, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $module = $(this), $window = $(window), $scroll = contextCheck(settings.scrollContext, window), $container, $context, instance = $module.data(moduleNamespace), element = this, documentObserver, observer, module ; module = { initialize: function () { module.determineContainer(); module.determineContext(); module.verbose('Initializing sticky', settings, $container); module.save.positions(); module.checkErrors(); module.bind.events(); if (settings.observeChanges) { module.observeChanges(); } module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.verbose('Destroying previous instance'); module.reset(); if (documentObserver) { documentObserver.disconnect(); } if (observer) { observer.disconnect(); } $window .off('load' + eventNamespace, module.event.load) .off('resize' + eventNamespace, module.event.resize) ; $scroll .off('scrollchange' + eventNamespace, module.event.scrollchange) ; $module.removeData(moduleNamespace); }, observeChanges: function () { if ('MutationObserver' in window) { documentObserver = new MutationObserver(module.event.documentChanged); observer = new MutationObserver(module.event.changed); documentObserver.observe(document, { childList: true, subtree: true, }); observer.observe(element, { childList: true, subtree: true, }); observer.observe($context[0], { childList: true, subtree: true, }); module.debug('Setting up mutation observer', observer); } }, determineContainer: function () { $container = settings.container ? contextCheck(settings.container, window) : $module.offsetParent(); }, determineContext: function () { $context = settings.context ? contextCheck(settings.context, window) : $container; if ($context.length === 0) { module.error(error.invalidContext, settings.context, $module); } }, checkErrors: function () { if (module.is.hidden()) { module.error(error.visible, $module); } if (module.cache.element.height > module.cache.context.height) { module.reset(); module.error(error.elementSize, $module); } }, bind: { events: function () { $window .on('load' + eventNamespace, module.event.load) .on('resize' + eventNamespace, module.event.resize) ; // pub/sub pattern $scroll .off('scroll' + eventNamespace) .on('scroll' + eventNamespace, module.event.scroll) .on('scrollchange' + eventNamespace, module.event.scrollchange) ; }, }, event: { changed: function (mutations) { clearTimeout(module.timer); module.timer = setTimeout(function () { module.verbose('DOM tree modified, updating sticky menu', mutations); module.refresh(); }, 100); }, documentChanged: function (mutations) { [].forEach.call(mutations, function (mutation) { if (mutation.removedNodes) { [].forEach.call(mutation.removedNodes, function (node) { if (node === element || $(node).find(element).length > 0) { module.debug('Element removed from DOM, tearing down events'); module.destroy(); } }); } }); }, load: function () { module.verbose('Page contents finished loading'); requestAnimationFrame(module.refresh); }, resize: function () { module.verbose('Window resized'); requestAnimationFrame(module.refresh); }, scroll: function () { requestAnimationFrame(function () { $scroll.triggerHandler('scrollchange' + eventNamespace, $scroll.scrollTop()); }); }, scrollchange: function (event, scrollPosition) { module.stick(scrollPosition); settings.onScroll.call(element); }, }, refresh: function (hardRefresh) { module.reset(); if (!settings.context) { module.determineContext(); } if (hardRefresh) { module.determineContainer(); } module.save.positions(); module.stick(); settings.onReposition.call(element); }, supports: { sticky: function () { var $element = $('<div/>') ; $element.addClass(className.supported); return $element.css('position').match('sticky'); }, }, save: { lastScroll: function (scroll) { module.lastScroll = scroll; }, elementScroll: function (scroll) { module.elementScroll = scroll; }, positions: function () { var scrollContext = { height: $scroll.height(), }, element = { margin: { top: parseInt($module.css('margin-top'), 10), bottom: parseInt($module.css('margin-bottom'), 10), }, offset: $module.offset(), width: $module.outerWidth(), height: $module.outerHeight(), }, context = { offset: $context.offset(), height: $context.outerHeight(), } ; if (!module.is.standardScroll()) { module.debug('Non-standard scroll. Removing scroll offset from element offset'); scrollContext.top = $scroll.scrollTop(); scrollContext.left = $scroll.scrollLeft(); element.offset.top += scrollContext.top; context.offset.top += scrollContext.top; element.offset.left += scrollContext.left; context.offset.left += scrollContext.left; } module.cache = { fits: (element.height + settings.offset) <= scrollContext.height, sameHeight: element.height === context.height, scrollContext: { height: scrollContext.height, }, element: { margin: element.margin, top: element.offset.top - element.margin.top, left: element.offset.left, width: element.width, height: element.height, bottom: element.offset.top + element.height, }, context: { top: context.offset.top, height: context.height, bottom: context.offset.top + context.height, }, }; module.set.containerSize(); module.stick(); module.debug('Caching element positions', module.cache); }, }, get: { direction: function (scroll) { var direction = 'down' ; scroll = scroll || $scroll.scrollTop(); if (module.lastScroll && module.lastScroll > scroll) { direction = 'up'; } return direction; }, scrollChange: function (scroll) { scroll = scroll || $scroll.scrollTop(); return module.lastScroll ? scroll - module.lastScroll : 0; }, currentElementScroll: function () { if (module.elementScroll) { return module.elementScroll; } return module.is.top() ? Math.abs(parseInt($module.css('top'), 10)) || 0 : Math.abs(parseInt($module.css('bottom'), 10)) || 0; }, elementScroll: function (scroll) { scroll = scroll || $scroll.scrollTop(); var element = module.cache.element, scrollContext = module.cache.scrollContext, delta = module.get.scrollChange(scroll), maxScroll = element.height - scrollContext.height + settings.offset, elementScroll = module.get.currentElementScroll(), possibleScroll = elementScroll + delta ; if (module.cache.fits || possibleScroll < 0) { elementScroll = 0; } else if (possibleScroll > maxScroll) { elementScroll = maxScroll; } else { elementScroll = possibleScroll; } return elementScroll; }, }, remove: { lastScroll: function () { delete module.lastScroll; }, elementScroll: function () { delete module.elementScroll; }, minimumSize: function () { $container .css('min-height', '') ; }, offset: function () { $module.css('margin-top', ''); }, }, set: { offset: function () { module.verbose('Setting offset on element', settings.offset); $module .css('margin-top', settings.offset) ; }, containerSize: function () { var tagName = $container[0].tagName ; if (tagName === 'HTML' || tagName === 'body') { module.determineContainer(); } else { var tallestHeight = Math.max(module.cache.context.height, module.cache.element.height); if (tallestHeight - $container.outerHeight() > settings.jitter) { module.debug('Context is taller than container. Specifying exact height for container', module.cache.context.height); $container.css({ height: tallestHeight, }); } else { $container.css({ height: '', }); } if (Math.abs($container.outerHeight() - module.cache.context.height) > settings.jitter) { module.debug('Context has padding, specifying exact height for container', module.cache.context.height); $container.css({ height: module.cache.context.height, }); } } }, minimumSize: function () { var element = module.cache.element ; $container .css('min-height', element.height) ; }, scroll: function (scroll) { module.debug('Setting scroll on element', scroll); if (module.elementScroll === scroll) { return; } if (module.is.top()) { $module .css('bottom', '') .css('top', -scroll + 'px') ; } if (module.is.bottom()) { $module .css('top', '') .css('bottom', scroll + 'px') ; } }, size: function () { if (module.cache.element.height !== 0 && module.cache.element.width !== 0) { element.style.setProperty('width', module.cache.element.width + 'px', 'important'); element.style.setProperty('height', module.cache.element.height + 'px', 'important'); } }, }, is: { standardScroll: function () { return $scroll[0] === window; }, top: function () { return $module.hasClass(className.top); }, bottom: function () { return $module.hasClass(className.bottom); }, initialPosition: function () { return !module.is.fixed() && !module.is.bound(); }, hidden: function () { return !$module.is(':visible'); }, bound: function () { return $module.hasClass(className.bound); }, fixed: function () { return $module.hasClass(className.fixed); }, }, stick: function (scrollPosition) { var cachedPosition = scrollPosition || $scroll.scrollTop(), cache = module.cache, fits = cache.fits, sameHeight = cache.sameHeight, element = cache.element, scrollContext = cache.scrollContext, context = cache.context, offset = module.is.bottom() && settings.pushing ? settings.bottomOffset : settings.offset, scroll = { top: cachedPosition + offset, bottom: cachedPosition + offset + scrollContext.height, }, elementScroll = fits ? 0 : module.get.elementScroll(scroll.top), // shorthand doesntFit = !fits, elementVisible = element.height !== 0 ; if (elementVisible && !sameHeight) { if (module.is.initialPosition()) { if (scroll.top >= context.bottom) { module.debug('Initial element position is bottom of container'); module.bindBottom(); } else if (scroll.top > element.top) { if ((element.height + scroll.top - elementScroll) >= context.bottom && element.height < context.height) { module.debug('Initial element position is bottom of container'); module.bindBottom(); } else { module.debug('Initial element position is fixed'); module.fixTop(); } } } else if (module.is.fixed()) { if (module.is.top()) { if (scroll.top <= element.top) { module.debug('Fixed element reached top of container'); module.setInitialPosition(); } else if ((element.height + scroll.top - elementScroll) >= context.bottom) { module.debug('Fixed element reached bottom of container'); module.bindBottom(); } else if (doesntFit) { // scroll element if larger than screen module.set.scroll(elementScroll); module.save.lastScroll(scroll.top); module.save.elementScroll(elementScroll); } } else if (module.is.bottom()) { if ((scroll.bottom - element.height) <= element.top) { // top edge module.debug('Bottom fixed rail has reached top of container'); module.setInitialPosition(); } else if (scroll.bottom >= context.bottom) { // bottom edge module.debug('Bottom fixed rail has reached bottom of container'); module.bindBottom(); } else if (doesntFit) { // scroll element if larger than screen module.set.scroll(elementScroll); module.save.lastScroll(scroll.top); module.save.elementScroll(elementScroll); } } } else if (module.is.bottom()) { if (scroll.top <= element.top) { module.debug('Jumped from bottom fixed to top fixed, most likely used home/end button'); module.setInitialPosition(); } else { if (settings.pushing) { if (module.is.bound() && scroll.bottom <= context.bottom) { module.debug('Fixing bottom attached element to bottom of browser.'); module.fixBottom(); } } else { if (module.is.bound() && (scroll.top <= context.bottom - element.height)) { module.debug('Fixing bottom attached element to top of browser.'); module.fixTop(); } } } } } }, bindTop: function () { module.debug('Binding element to top of parent container'); module.remove.offset(); if (settings.setSize) { module.set.size(); } $module .css({ left: '', top: '', marginBottom: '', }) .removeClass(className.fixed) .removeClass(className.bottom) .addClass(className.bound) .addClass(className.top) ; settings.onTop.call(element); settings.onUnstick.call(element); }, bindBottom: function () { module.debug('Binding element to bottom of parent container'); module.remove.offset(); if (settings.setSize) { module.set.size(); } $module .css({ left: '', top: '', }) .removeClass(className.fixed) .removeClass(className.top) .addClass(className.bound) .addClass(className.bottom) ; settings.onBottom.call(element); settings.onUnstick.call(element); }, setInitialPosition: function () { module.debug('Returning to initial position'); module.unfix(); module.unbind(); }, fixTop: function () { module.debug('Fixing element to top of page'); if (settings.setSize) { module.set.size(); } module.set.minimumSize(); module.set.offset(); $module .css({ left: module.cache.element.left, bottom: '', marginBottom: '', }) .removeClass(className.bound) .removeClass(className.bottom) .addClass(className.fixed) .addClass(className.top) ; settings.onStick.call(element); }, fixBottom: function () { module.debug('Sticking element to bottom of page'); if (settings.setSize) { module.set.size(); } module.set.minimumSize(); module.set.offset(); $module .css({ left: module.cache.element.left, bottom: '', marginBottom: '', }) .removeClass(className.bound) .removeClass(className.top) .addClass(className.fixed) .addClass(className.bottom) ; settings.onStick.call(element); }, unbind: function () { if (module.is.bound()) { module.debug('Removing container bound position on element'); module.remove.offset(); $module .removeClass(className.bound) .removeClass(className.top) .removeClass(className.bottom) ; } }, unfix: function () { if (module.is.fixed()) { module.debug('Removing fixed position on element'); module.remove.minimumSize(); module.remove.offset(); $module .removeClass(className.fixed) .removeClass(className.top) .removeClass(className.bottom) ; settings.onUnstick.call(element); } }, reset: function () { module.debug('Resetting elements position'); module.unbind(); module.unfix(); module.resetCSS(); module.remove.offset(); module.remove.lastScroll(); }, resetCSS: function () { $module .css({ width: '', height: '', }) ; $container .css({ height: '', }) ; }, setting: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { settings[name] = value; } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 0); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.sticky.settings = { name: 'Sticky', namespace: 'sticky', silent: false, debug: false, verbose: true, performance: true, // whether to stick in the opposite direction on scroll up pushing: false, context: false, container: false, // Context to watch scroll events scrollContext: window, // Offset to adjust scroll offset: 0, // Offset to adjust scroll when attached to bottom of screen bottomOffset: 0, // will only set container height if difference between context and container is larger than this number jitter: 5, // set width of sticky element when it is fixed to page (used to make sure 100% width is maintained if no fixed size set) setSize: true, // Whether to automatically observe changes with Mutation Observers observeChanges: false, // Called when position is recalculated onReposition: function () {}, // Called on each scroll onScroll: function () {}, // Called when element is stuck to viewport onStick: function () {}, // Called when element is unstuck from viewport onUnstick: function () {}, // Called when element reaches top of context onTop: function () {}, // Called when element reaches bottom of context onBottom: function () {}, error: { visible: 'Element is hidden, you must call refresh after element becomes visible. Use silent setting to suppress this warning in production.', method: 'The method you called is not defined.', invalidContext: 'Context specified does not exist', elementSize: 'Sticky element is larger than its container, cannot create sticky.', }, className: { bound: 'bound', fixed: 'fixed', supported: 'native', top: 'top', bottom: 'bottom', }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/tab.css ================================================ /*! * # Fomantic-UI 2.9.4 - Tab * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* UI Tabs *******************************/ .ui.tab { display: none; } /******************************* States *******************************/ /* -------------------- Active --------------------- */ .ui.tab.active, .ui.tab.open { display: block; } /* -------------------- Loading --------------------- */ .ui.tab.loading { position: relative; overflow: hidden; display: block; min-height: 250px; } .ui.tab.loading * { position: relative !important; left: -10000px !important; } .ui.tab.loading::before, .ui.tab.loading.segment::before { position: absolute; content: ""; top: 50%; left: 50%; margin: -1.25em 0 0 -1.25em; width: 2.5em; height: 2.5em; border-radius: 500rem; border: 0.2em solid rgba(0, 0, 0, 0.1); } .ui.tab.loading::after, .ui.tab.loading.segment::after { position: absolute; content: ""; top: 50%; left: 50%; margin: -1.25em 0 0 -1.25em; width: 2.5em; height: 2.5em; animation: loader 0.6s infinite linear; border: 0.2em solid #767676; border-radius: 500rem; box-shadow: 0 0 0 1px transparent; } /******************************* Tab Overrides *******************************/ /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/tab.js ================================================ /*! * # Fomantic-UI 2.9.4 - Tab * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isWindow(obj) { return obj !== null && obj === obj.window; } function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.tab = function (parameters) { var // use window context if none specified $allModules = isFunction(this) ? $(window) : $(this), $document = $(document), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $(context); } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : window; } } return $context; }, initializedHistory = false, returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.tab.settings, parameters) : $.extend({}, $.fn.tab.settings), className = settings.className, metadata = settings.metadata, selector = settings.selector, error = settings.error, regExp = settings.regExp, eventNamespace = '.' + settings.namespace, moduleNamespace = 'module-' + settings.namespace, $module = $(this), $context, $tabs, cache = {}, firstLoad = true, recursionDepth = 0, element = this, instance = $module.data(moduleNamespace), activeTabPath, parameterArray, module, historyEvent ; module = { initialize: function () { module.debug('Initializing tab menu item', $module); module.determineTabs(); module.debug('Determining tabs', settings.context, $tabs); // set up automatic routing if (settings.auto) { module.set.auto(); } module.bind.events(); if (settings.history && !initializedHistory) { settings.history = module.initializeHistory(); initializedHistory = true; } var activeTab = module.determine.activeTab(); if (settings.autoTabActivation && instance === undefined && activeTab === null) { activeTab = settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation; module.debug('No active tab detected, setting tab active', activeTab); module.changeTab(activeTab); } if (activeTab !== null && settings.history && settings.historyType === 'state') { var autoUpdate = $.address.autoUpdate(); $.address.autoUpdate(false); $.address.value(activeTab); $.address.autoUpdate(autoUpdate); } module.instantiate(); }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, module) ; }, destroy: function () { module.debug('Destroying tabs', $module); $module .removeData(moduleNamespace) .off(eventNamespace) ; }, bind: { events: function () { // if using $.tab don't add events if (!isWindow(element)) { module.debug('Attaching tab activation events to element', $module); $module .on('click' + eventNamespace, module.event.click) ; } }, }, determineTabs: function () { var $reference ; // determine tab context if (settings.context === 'parent') { if ($module.closest(selector.ui).length > 0) { $reference = $module.closest(selector.ui); module.verbose('Using closest UI element as parent', $reference); } else { $reference = $module; } $context = $reference.parent(); module.verbose('Determined parent element for creating context', $context); } else if (settings.context) { $context = contextCheck(settings.context, window); module.verbose('Using selector for tab context', settings.context, $context); } else { $context = $('body'); } // find tabs if (settings.childrenOnly) { $tabs = $context.children(selector.tabs); module.debug('Searching tab context children for tabs', $context, $tabs); } else { $tabs = $context.find(selector.tabs); module.debug('Searching tab context for tabs', $context, $tabs); } }, initializeHistory: function () { module.debug('Initializing page state'); if ($.address === undefined) { module.error(error.state); return false; } if (settings.historyType === 'state') { module.debug('Using HTML5 to manage state'); if (settings.path !== false) { $.address .history(true) .state(settings.path) ; $(window).trigger('popstate'); } else { module.error(error.path); return false; } } $.address .bind('change', module.event.history.change) ; return true; }, event: { click: function (event) { var tabPath = $(this).data(metadata.tab) ; if (tabPath !== undefined) { if (settings.history) { module.verbose('Updating page state', event); $.address.value(tabPath); } else { module.verbose('Changing tab', event); module.changeTab(tabPath); } event.preventDefault(); } else { module.debug('No tab specified'); } }, history: { change: function (event) { var tabPath = event.pathNames.join('/') || module.get.initialPath(), pageTitle = settings.templates.determineTitle(tabPath) || false ; module.performance.display(); module.debug('History change event', tabPath, event); historyEvent = event; if (tabPath !== undefined) { module.changeTab(tabPath); } if (pageTitle) { $.address.title(pageTitle); } }, }, }, refresh: function () { if (activeTabPath) { module.debug('Refreshing tab', activeTabPath); module.changeTab(activeTabPath); } }, cache: { read: function (cacheKey) { return cacheKey !== undefined ? cache[cacheKey] : false; }, add: function (cacheKey, content) { cacheKey = cacheKey || activeTabPath; module.debug('Adding cached content for', cacheKey); cache[cacheKey] = content; }, remove: function (cacheKey) { cacheKey = cacheKey || activeTabPath; module.debug('Removing cached content for', cacheKey); delete cache[cacheKey]; }, }, escape: { string: function (text) { text = String(text); return text.replace(regExp.escape, '\\$&'); }, }, set: { auto: function () { var url = typeof settings.path === 'string' ? settings.path.replace(/\/$/, '') + '/{$tab}' : '/{$tab}' ; module.verbose('Setting up automatic tab retrieval from server', url); if ($.isPlainObject(settings.apiSettings)) { settings.apiSettings.url = url; } else { settings.apiSettings = { url: url, }; } }, loading: function (tabPath) { var $tab = module.get.tabElement(tabPath), isLoading = $tab.hasClass(className.loading) ; if (!isLoading) { module.verbose('Setting loading state for', $tab); $tab .addClass(className.loading) .siblings($tabs) .removeClass(className.active + ' ' + className.loading) ; if ($tab.length > 0) { settings.onRequest.call($tab[0], tabPath); } } }, state: function (state) { $.address.value(state); }, }, changeTab: function (tabPath) { var pushStateAvailable = window.history && window.history.pushState, shouldIgnoreLoad = pushStateAvailable && settings.ignoreFirstLoad && firstLoad, remoteContent = settings.auto || $.isPlainObject(settings.apiSettings), // only add default path if not remote content pathArray = remoteContent && !shouldIgnoreLoad ? module.utilities.pathToArray(tabPath) : module.get.defaultPathArray(tabPath) ; tabPath = module.utilities.arrayToPath(pathArray); $.each(pathArray, function (index, tab) { var currentPathArray = pathArray.slice(0, index + 1), currentPath = module.utilities.arrayToPath(currentPathArray), isTab = module.is.tab(currentPath), isLastIndex = index + 1 === pathArray.length, $tab = module.get.tabElement(currentPath), $anchor, nextPathArray, nextPath, isLastTab ; module.verbose('Looking for tab', tab); if (isTab) { module.verbose('Tab was found', tab); // scope up activeTabPath = currentPath; parameterArray = module.utilities.filterArray(pathArray, currentPathArray); if (isLastIndex) { isLastTab = true; } else { nextPathArray = pathArray.slice(0, index + 2); nextPath = module.utilities.arrayToPath(nextPathArray); isLastTab = !module.is.tab(nextPath); if (isLastTab) { module.verbose('Tab parameters found', nextPathArray); } } if (settings.onBeforeChange.call(element, currentPath) === false) { module.debug('onBeforeChange returned false, cancelling tab change', $tab); return false; } if (isLastTab && remoteContent) { if (!shouldIgnoreLoad) { module.activate.navigation(currentPath); module.fetch.content(currentPath, tabPath); } else { module.debug('Ignoring remote content on first tab load', currentPath); firstLoad = false; module.cache.add(tabPath, $tab.html()); module.activate.all(currentPath); settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent); settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent); } return false; } module.debug('Opened local tab', currentPath); module.activate.all(currentPath); if (!module.cache.read(currentPath)) { module.cache.add(currentPath, true); module.debug('First time tab loaded calling tab init'); settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent); } settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent); } else if (tabPath.search('/') === -1 && tabPath !== '') { // look for in page anchor tabPath = module.escape.string(tabPath); $anchor = $('#' + tabPath + ', a[name="' + tabPath + '"]'); currentPath = $anchor.closest('[data-tab]').data(metadata.tab); $tab = module.get.tabElement(currentPath); // if anchor exists use parent tab if ($anchor && $anchor.length > 0 && currentPath) { module.debug('Anchor link used, opening parent tab', $tab, $anchor); if (settings.onBeforeChange.call(element, currentPath) === false) { module.debug('onBeforeChange returned false, cancelling tab change', $tab); return false; } if (!$tab.hasClass(className.active)) { setTimeout(function () { module.scrollTo($anchor); }, 0); } module.activate.all(currentPath); if (!module.cache.read(currentPath)) { module.cache.add(currentPath, true); module.debug('First time tab loaded calling tab init'); settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent); } settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent); return false; } } else { module.error(error.missingTab, $module, $context, currentPath); return false; } }); }, scrollTo: function ($element) { var scrollOffset = $element && $element.length > 0 ? $element.offset().top : false ; if (scrollOffset !== false) { module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element); $document.scrollTop(scrollOffset); } }, update: { content: function (tabPath, html, evaluateScripts) { var $tab = module.get.tabElement(tabPath), tab = $tab[0] ; evaluateScripts = evaluateScripts !== undefined ? evaluateScripts : settings.evaluateScripts; if (typeof settings.cacheType === 'string' && settings.cacheType.toLowerCase() === 'dom' && typeof html !== 'string') { $tab .empty() .append($(html).clone(true)) ; } else { if (evaluateScripts) { module.debug('Updating HTML and evaluating inline scripts', tabPath, html); $tab.html(html); } else { module.debug('Updating HTML', tabPath, html); tab.innerHTML = html; } } }, }, fetch: { content: function (tabPath, fullTabPath) { var $tab = module.get.tabElement(tabPath), apiSettings = { dataType: 'html', encodeParameters: false, on: 'now', cache: settings.alwaysRefresh, headers: { 'X-Remote': true, }, onSuccess: function (response) { if (settings.cacheType === 'response') { module.cache.add(fullTabPath, response); } module.update.content(tabPath, response); if (tabPath == activeTabPath) { module.debug('Content loaded', tabPath); module.activate.tab(tabPath); } else { module.debug('Content loaded in background', tabPath); } settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent); settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent); if (settings.loadOnce) { module.cache.add(fullTabPath, true); } else if (typeof settings.cacheType === 'string' && settings.cacheType.toLowerCase() === 'dom' && $tab.children().length > 0) { setTimeout(function () { var $clone = $tab.children().clone(true) ; $clone = $clone.not('script'); module.cache.add(fullTabPath, $clone); }, 0); } else { module.cache.add(fullTabPath, $tab.html()); } }, urlData: { tab: fullTabPath, }, }, request = $tab.api('get request') || false, existingRequest = request && request.state() === 'pending', requestSettings, cachedContent ; fullTabPath = fullTabPath || tabPath; cachedContent = module.cache.read(fullTabPath); if (settings.cache && cachedContent) { module.activate.tab(tabPath); module.debug('Adding cached content', fullTabPath); if (!settings.loadOnce) { if (settings.evaluateScripts === 'once') { module.update.content(tabPath, cachedContent, false); } else { module.update.content(tabPath, cachedContent); } } settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent); } else if (existingRequest) { module.set.loading(tabPath); module.debug('Content is already loading', fullTabPath); } else if ($.api !== undefined) { requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings); module.debug('Retrieving remote content', fullTabPath, requestSettings); module.set.loading(tabPath); $tab.api(requestSettings); } else { module.error(error.api); } }, }, activate: { all: function (tabPath) { module.activate.tab(tabPath); module.activate.navigation(tabPath); }, tab: function (tabPath) { var $tab = module.get.tabElement(tabPath), $deactiveTabs = settings.deactivate === 'siblings' ? $tab.siblings($tabs) : $tabs.not($tab), isActive = $tab.hasClass(className.active) ; module.verbose('Showing tab content for', $tab); if (!isActive) { $tab .addClass(className.active) ; $deactiveTabs .removeClass(className.active + ' ' + className.loading) ; if ($tab.length > 0) { settings.onVisible.call($tab[0], tabPath); } } }, navigation: function (tabPath) { var $navigation = module.get.navElement(tabPath), $deactiveNavigation = settings.deactivate === 'siblings' ? $navigation.siblings($allModules) : $allModules.not($navigation), isActive = $navigation.hasClass(className.active) ; module.verbose('Activating tab navigation for', $navigation, tabPath); if (!isActive) { $navigation .addClass(className.active) ; $deactiveNavigation .removeClass(className.active + ' ' + className.loading) ; } }, }, deactivate: { all: function () { module.deactivate.navigation(); module.deactivate.tabs(); }, navigation: function () { $allModules .removeClass(className.active) ; }, tabs: function () { $tabs .removeClass(className.active + ' ' + className.loading) ; }, }, is: { tab: function (tabName) { return tabName !== undefined ? module.get.tabElement(tabName).length > 0 : false; }, }, get: { initialPath: function () { return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab); }, path: function () { return $.address.value(); }, // adds default tabs to tab path defaultPathArray: function (tabPath) { return module.utilities.pathToArray(module.get.defaultPath(tabPath)); }, defaultPath: function (tabPath) { var $defaultNav = $allModules.filter('[data-' + metadata.tab + '^="' + module.escape.string(tabPath) + '/"]').eq(0), defaultTab = $defaultNav.data(metadata.tab) || false ; if (defaultTab) { module.debug('Found default tab', defaultTab); if (recursionDepth < settings.maxDepth) { recursionDepth++; return module.get.defaultPath(defaultTab); } module.error(error.recursion); } else { module.debug('No default tabs found for', tabPath, $tabs); } recursionDepth = 0; return tabPath; }, navElement: function (tabPath) { tabPath = tabPath || activeTabPath; return $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]'); }, tabElement: function (tabPath) { var $fullPathTab, $simplePathTab, tabPathArray, lastTab ; tabPath = tabPath || activeTabPath; tabPathArray = module.utilities.pathToArray(tabPath); lastTab = module.utilities.last(tabPathArray); $fullPathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]'); $simplePathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(lastTab) + '"]'); return $fullPathTab.length > 0 ? $fullPathTab : $simplePathTab; }, tab: function () { return activeTabPath; }, }, determine: { activeTab: function () { var activeTab = null; $tabs.each(function (_index, tab) { var $tab = $(tab); if ($tab.hasClass(className.active)) { var tabPath = $(this).data(metadata.tab), $anchor = $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]') ; if ($anchor.hasClass(className.active)) { activeTab = tabPath; } } }); return activeTab; }, }, utilities: { filterArray: function (keepArray, removeArray) { return $.grep(keepArray, function (keepValue) { return $.inArray(keepValue, removeArray) === -1; }); }, last: function (array) { return Array.isArray(array) ? array[array.length - 1] : false; }, pathToArray: function (pathName) { if (pathName === undefined) { pathName = activeTabPath; } return typeof pathName === 'string' ? pathName.split('/') : [pathName]; }, arrayToPath: function (pathArray) { return Array.isArray(pathArray) ? pathArray.join('/') : false; }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; // shortcut for tabbed content with no defined navigation $.tab = function () { $(window).tab.apply(this, arguments); }; $.fn.tab.settings = { name: 'Tab', namespace: 'tab', silent: false, debug: false, verbose: false, performance: true, auto: false, // uses pjax style endpoints fetching content from same url with remote-content headers history: false, // use browser history historyType: 'hash', // #/ or html5 state path: false, // base path of url context: false, // specify a context that tabs must appear inside childrenOnly: false, // use only tabs that are children of context maxDepth: 25, // max depth a tab can be nested deactivate: 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together alwaysRefresh: false, // load tab content new every tab click cache: true, // cache the content requests to pull locally loadOnce: false, // Whether tab data should only be loaded once when using remote content cacheType: 'response', // Whether to cache exact response, or to html cache contents after scripts execute ignoreFirstLoad: false, // don't load remote content on first load apiSettings: false, // settings for api call evaluateScripts: 'once', // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content autoTabActivation: true, // whether a non existing active tab will auto activate the first available tab onFirstLoad: function (tabPath, parameterArray, historyEvent) {}, // called first time loaded onLoad: function (tabPath, parameterArray, historyEvent) {}, // called on every load onVisible: function (tabPath, parameterArray, historyEvent) {}, // called every time tab visible onRequest: function (tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content onBeforeChange: function (tabPath) {}, // called before a tab is about to be changed. Returning false will cancel the tab change templates: { determineTitle: function (tabArray) {}, // returns page title for path }, error: { api: 'You attempted to load content without API module', method: 'The method you called is not defined', missingTab: 'Activated tab cannot be found. Tabs are case-sensitive.', noContent: 'The tab you specified is missing a content url.', path: 'History enabled, but no path was specified', recursion: 'Max recursive depth reached', state: 'History requires Asual\'s Address library <https://github.com/asual/jquery-address>', }, regExp: { escape: /[\s#$()*+,.:=?@[\\\]^{|}-]/g, }, metadata: { tab: 'tab', loaded: 'loaded', promise: 'promise', }, className: { loading: 'loading', active: 'active', }, selector: { tabs: '.ui.tab', ui: '.ui', }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/table.css ================================================ /*! * # Fomantic-UI 2.9.4 - Table * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Table *******************************/ /* Prototype */ .ui.table { width: 100%; background: #fff; margin: 1em 0; border: 1px solid rgba(34, 36, 38, 0.15); box-shadow: none; border-radius: 0.28571429rem; text-align: left; vertical-align: middle; color: rgba(0, 0, 0, 0.87); border-collapse: separate; border-spacing: 0; } .ui.table:first-child { margin-top: 0; } .ui.table:last-child { margin-bottom: 0; } .ui.table > thead, .ui.table > tbody { text-align: inherit; vertical-align: inherit; } /******************************* Parts *******************************/ /* Table Content */ .ui.table th, .ui.table td { transition: background 0.1s ease, color 0.1s ease; } /* Rowspan helper class */ .ui.table th.rowspanned, .ui.table td.rowspanned { display: none; } /* Headers */ .ui.table > thead { box-shadow: none; } .ui.table > thead > tr > th { cursor: auto; background: #f9fafb; text-align: inherit; color: rgba(0, 0, 0, 0.87); padding: 0.92857143em 0.78571429em; vertical-align: inherit; font-style: none; font-weight: bold; text-transform: none; border-bottom: 1px solid rgba(34, 36, 38, 0.1); border-left: none; } .ui.table > thead > tr > th:first-child { border-left: none; } .ui.table > thead > tr:first-child > th:first-child { border-radius: 0.28571429rem 0 0 0; } .ui.table > thead > tr:first-child > th:last-child { border-radius: 0 0.28571429rem 0 0; } .ui.table > thead > tr:first-child > th:only-child { border-radius: 0.28571429rem 0.28571429rem 0 0; } /* Footer */ .ui.table > tfoot { box-shadow: none; } .ui.table > tfoot > tr > th, .ui.table > tfoot > tr > td { cursor: auto; border-top: 1px solid rgba(34, 36, 38, 0.15); background: #f9fafb; text-align: inherit; color: rgba(0, 0, 0, 0.87); padding: 0.78571429em 0.78571429em; vertical-align: inherit; font-style: normal; font-weight: normal; text-transform: none; } .ui.table > tfoot > tr > th:first-child, .ui.table > tfoot > tr > td:first-child { border-left: none; } .ui.table > tfoot > tr:last-child > th:first-child, .ui.table > tfoot > tr:last-child > td:first-child { border-radius: 0 0 0 0.28571429rem; } .ui.table > tfoot > tr:last-child > th:last-child, .ui.table > tfoot > tr:last-child > td:last-child { border-radius: 0 0 0.28571429rem 0; } .ui.table > tfoot > tr:last-child > th:only-child, .ui.table > tfoot > tr:last-child > td:only-child { border-radius: 0 0 0.28571429rem 0.28571429rem; } /* Table Row */ .ui.table > tr > td, .ui.table > tbody > tr > td { border-top: 1px solid rgba(34, 36, 38, 0.1); } .ui.table > tr:first-child > td, .ui.table > tbody > tr:first-child > td { border-top: none; } /* Repeated tbody */ .ui.table > tbody + tbody tr:first-child > td { border-top: 1px solid rgba(34, 36, 38, 0.1); } /* Table Cells */ .ui.table > tbody > tr > td, .ui.table > tr > td { padding: 0.78571429em 0.78571429em; text-align: inherit; } /* Icons */ .ui.table > i.icon { vertical-align: baseline; } .ui.table > i.icon:only-child { margin: 0; } /* Table Segment */ .ui.table.segment { padding: 0; } .ui.table.segment::after { display: none; } .ui.table.segment.stacked::after { display: block; } /* Responsive */ @media only screen and (max-width: 767.98px) { .ui.table:not(.unstackable) { width: 100%; padding: 0; } .ui.table:not(.unstackable) > thead, .ui.table:not(.unstackable) > thead > tr, .ui.table:not(.unstackable) > tfoot, .ui.table:not(.unstackable) > tfoot > tr, .ui.table:not(.unstackable) > tbody, .ui.table:not(.unstackable) > tr, .ui.table:not(.unstackable) > tbody > tr, .ui.table:not(.unstackable) > tr > th:not(.rowspanned), .ui.table:not(.unstackable) > thead > tr > th:not(.rowspanned), .ui.table:not(.unstackable) > tbody > tr > th:not(.rowspanned), .ui.table:not(.unstackable) > tfoot > tr > th:not(.rowspanned), .ui.table:not(.unstackable) > tr > td:not(.rowspanned), .ui.table:not(.unstackable) > tbody > tr > td:not(.rowspanned), .ui.table:not(.unstackable) > tfoot > tr > td:not(.rowspanned) { display: block !important; width: auto !important; } .ui.table:not(.unstackable) > thead { display: block; } .ui.table:not(.unstackable) > tfoot { display: block; } .ui.ui.ui.ui.table:not(.unstackable) > tr, .ui.ui.ui.ui.table:not(.unstackable) > thead > tr, .ui.ui.ui.ui.table:not(.unstackable) > tbody > tr, .ui.ui.ui.ui.table:not(.unstackable) > tfoot > tr { padding-top: 1em; padding-bottom: 1em; box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset; } .ui.ui.ui.ui.table:not(.unstackable) > tr > th, .ui.ui.ui.ui.table:not(.unstackable) > thead > tr > th, .ui.ui.ui.ui.table:not(.unstackable) > tbody > tr > th, .ui.ui.ui.ui.table:not(.unstackable) > tfoot > tr > th, .ui.ui.ui.ui.table:not(.unstackable) > tr > td, .ui.ui.ui.ui.table:not(.unstackable) > tbody > tr > td, .ui.ui.ui.ui.table:not(.unstackable) > tfoot > tr > td { background: none; border: none; padding: 0.25em 0.75em; box-shadow: none; } .ui.table:not(.unstackable) > tr > th:first-child, .ui.table:not(.unstackable) > thead > tr > th:first-child, .ui.table:not(.unstackable) > tbody > tr > th:first-child, .ui.table:not(.unstackable) > tfoot > tr > th:first-child, .ui.table:not(.unstackable) > tr > td:first-child, .ui.table:not(.unstackable) > tbody > tr > td:first-child, .ui.table:not(.unstackable) > tfoot > tr > td:first-child { font-weight: bold; } /* Definition Table */ .ui.definition.table:not(.unstackable) > thead > tr > th:first-child { box-shadow: none !important; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="primary marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185d0 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="primary marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185d0 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="primary marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54c8ff inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="primary marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54c8ff inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="secondary marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1b1c1d inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="secondary marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1b1c1d inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="secondary marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="secondary marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="red marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #db2828 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="red marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #db2828 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="red marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff695e inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="red marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff695e inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="orange marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #f2711c inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="orange marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #f2711c inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="orange marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff851b inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="orange marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff851b inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="yellow marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #fbbd08 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="yellow marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #fbbd08 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="yellow marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ffe21f inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="yellow marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ffe21f inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="olive marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #b5cc18 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="olive marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #b5cc18 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="olive marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #d9e778 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="olive marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #d9e778 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="green marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #21ba45 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="green marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #21ba45 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="green marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2ecc40 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="green marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2ecc40 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="teal marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #00b5ad inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="teal marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #00b5ad inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="teal marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6dffff inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="teal marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6dffff inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="blue marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185d0 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="blue marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185d0 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="blue marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54c8ff inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="blue marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54c8ff inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="violet marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6435c9 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="violet marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6435c9 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="violet marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a291fb inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="violet marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a291fb inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="purple marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a333c8 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="purple marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a333c8 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="purple marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #dc73ff inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="purple marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #dc73ff inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="pink marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #e03997 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="pink marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #e03997 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="pink marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff8edf inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="pink marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff8edf inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="brown marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a5673f inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="brown marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a5673f inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="brown marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #d67c1c inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="brown marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #d67c1c inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="grey marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #767676 inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="grey marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #767676 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="grey marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #dcddde inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="grey marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #dcddde inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="black marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1b1c1d inset; } .ui.ui.ui.ui.table:not(.unstackable) tr[class*="black marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1b1c1d inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="black marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset; } .ui.ui.ui.ui.inverted.table:not(.unstackable) tr[class*="black marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset; } .ui.scrolling.table.short > tbody { max-height: 6.74983929em; } .resizable.ui.scrolling.table.short > tbody { height: 6.74983929em; } .ui.scrolling.table[class*="very short"] > tbody { max-height: 4.49989286em; } .resizable.ui.scrolling.table[class*="very short"] > tbody { height: 4.49989286em; } .ui.scrolling.table > tbody { max-height: 8.99978571em; } .resizable.ui.scrolling.table > tbody { height: 8.99978571em; } .ui.scrolling.table.long > tbody { max-height: 17.99957143em; } .resizable.ui.scrolling.table.long > tbody { height: 17.99957143em; } .ui.scrolling.table[class*="very long"] > tbody { max-height: 26.99935714em; } .resizable.ui.scrolling.table[class*="very long"] > tbody { height: 26.99935714em; } .ui.overflowing.table.short { max-height: 11.24973214em; } .ui.overflowing.table[class*="very short"] { max-height: 7.49982143em; } .ui.overflowing.table { max-height: 14.99964286em; } .ui.overflowing.table.long { max-height: 29.99928571em; } .ui.overflowing.table[class*="very long"] { max-height: 44.99892857em; } } /* -------------- Scrolling --------------- */ @media only screen and (min-width: 768px) { .ui.scrolling.table.short > tbody { max-height: 8.99978571em; } .resizable.ui.scrolling.table.short > tbody { height: 8.99978571em; } .ui.scrolling.table[class*="very short"] > tbody { max-height: 5.99985714em; } .resizable.ui.scrolling.table[class*="very short"] > tbody { height: 5.99985714em; } .ui.scrolling.table > tbody { max-height: 11.99971429em; } .resizable.ui.scrolling.table > tbody { height: 11.99971429em; } .ui.scrolling.table.long > tbody { max-height: 23.99942857em; } .resizable.ui.scrolling.table.long > tbody { height: 23.99942857em; } .ui.scrolling.table[class*="very long"] > tbody { max-height: 35.99914286em; } .resizable.ui.scrolling.table[class*="very long"] > tbody { height: 35.99914286em; } } @media only screen and (min-width: 992px) { .ui.scrolling.table.short > tbody { max-height: 13.49967857em; } .resizable.ui.scrolling.table.short > tbody { height: 13.49967857em; } .ui.scrolling.table[class*="very short"] > tbody { max-height: 8.99978571em; } .resizable.ui.scrolling.table[class*="very short"] > tbody { height: 8.99978571em; } .ui.scrolling.table > tbody { max-height: 17.99957143em; } .resizable.ui.scrolling.table > tbody { height: 17.99957143em; } .ui.scrolling.table.long > tbody { max-height: 35.99914286em; } .resizable.ui.scrolling.table.long > tbody { height: 35.99914286em; } .ui.scrolling.table[class*="very long"] > tbody { max-height: 53.99871429em; } .resizable.ui.scrolling.table[class*="very long"] > tbody { height: 53.99871429em; } } @media only screen and (min-width: 1920px) { .ui.scrolling.table.short > tbody { max-height: 17.99957143em; } .resizable.ui.scrolling.table.short > tbody { height: 17.99957143em; } .ui.scrolling.table[class*="very short"] > tbody { max-height: 11.99971429em; } .resizable.ui.scrolling.table[class*="very short"] > tbody { height: 11.99971429em; } .ui.scrolling.table > tbody { max-height: 23.99942857em; } .resizable.ui.scrolling.table > tbody { height: 23.99942857em; } .ui.scrolling.table.long > tbody { max-height: 47.99885714em; } .resizable.ui.scrolling.table.long > tbody { height: 47.99885714em; } .ui.scrolling.table[class*="very long"] > tbody { max-height: 71.99828571em; } .resizable.ui.scrolling.table[class*="very long"] > tbody { height: 71.99828571em; } } .ui.scrolling.table > thead, .ui.scrolling.table > tfoot, .ui.scrolling.table > tbody { display: block; overflow-y: scroll; -ms-scroll-chaining: none; overscroll-behavior: none; } .ui.scrolling.table > thead > tr, .ui.scrolling.table > tfoot > tr, .ui.scrolling.table > tbody > tr { display: table; table-layout: fixed; width: 100%; } @supports (-moz-appearance: none) { .ui.scrolling.table > thead, .ui.scrolling.table > tfoot, .ui.scrolling.table > tbody { scrollbar-width: thin; } } /* Camouflage scrollbars, we need them only to gain the same width as tbody */ .ui.scrolling.table > thead { background: #f9fafb; color: #f9fafb; border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.scrolling.table > tfoot { background: #f9fafb; color: #f9fafb; border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui.inverted.scrolling.table > thead { background: rgba(0, 0, 0, 0.15); color: rgba(0, 0, 0, 0.15); } .ui.inverted.scrolling.table > tfoot { background: rgba(0, 0, 0, 0.15); color: rgba(0, 0, 0, 0.15); } .ui.scrolling.table > thead::-webkit-scrollbar-track, .ui.scrolling.table > tfoot::-webkit-scrollbar-track { background: inherit; border-radius: 0.28571429rem; } @supports (-moz-appearance: none) { .ui.scrolling.table > thead, .ui.scrolling.table > tfoot { scrollbar-color: currentColor currentColor; } } /* IE scrollbar color needs hex values */ @media all and (-ms-high-contrast: none) { .ui.scrolling.table > thead, .ui.scrolling.table > tfoot { scrollbar-face-color: currentColor; scrollbar-shadow-color: currentColor; scrollbar-track-color: currentColor; scrollbar-arrow-color: currentColor; } .ui.scrolling.table > thead { color: #f9fafb; } .ui.scrolling.table > tfoot { color: #f9fafb; } .ui.inverted.scrolling.table > thead { color: #252525; } .ui.inverted.scrolling.table > tfoot { color: #252525; } } .ui.inverted.scrolling.table > tbody::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.1); } .ui.inverted.scrolling.table > tbody::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.25); } .ui.inverted.scrolling.table > tbody::-webkit-scrollbar-thumb:window-inactive { background: rgba(255, 255, 255, 0.15); } .ui.inverted.scrolling.table > tbody::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.35); } .ui.inverted.scrolling.table > tbody { /* IE11 */ scrollbar-face-color: #656565; scrollbar-shadow-color: #656565; scrollbar-track-color: #323232; scrollbar-arrow-color: #323232; } @supports (-moz-appearance: none) { .ui.inverted.scrolling.table > tbody { /* firefox: first color thumb, second track */ scrollbar-color: rgba(255, 255, 255, 0.25) rgba(255, 255, 255, 0.1); } } .ui.resizable.scrolling.table > tbody { resize: vertical; max-height: none; } /* -------------- Overflowing --------------- */ .ui.overflowing.table { display: block; overflow: auto; -ms-scroll-chaining: none; overscroll-behavior: none; } @media only screen and (min-width: 768px) { .ui.overflowing.table.short { max-height: 13.49967857em; } .ui.overflowing.table[class*="very short"] { max-height: 8.99978571em; } .ui.overflowing.table { max-height: 17.99957143em; } .ui.overflowing.table.long { max-height: 35.99914286em; } .ui.overflowing.table[class*="very long"] { max-height: 53.99871429em; } } @media only screen and (min-width: 992px) { .ui.overflowing.table.short { max-height: 17.99957143em; } .ui.overflowing.table[class*="very short"] { max-height: 11.99971429em; } .ui.overflowing.table { max-height: 23.99942857em; } .ui.overflowing.table.long { max-height: 47.99885714em; } .ui.overflowing.table[class*="very long"] { max-height: 71.99828571em; } } @media only screen and (min-width: 1920px) { .ui.overflowing.table.short { max-height: 22.49946429em; } .ui.overflowing.table[class*="very short"] { max-height: 14.99964286em; } .ui.overflowing.table { max-height: 29.99928571em; } .ui.overflowing.table.long { max-height: 59.99857143em; } .ui.overflowing.table[class*="very long"] { max-height: 89.99785714em; } } /******************************* Coupling *******************************/ /* UI Image */ .ui.table .collapsing .image, .ui.table .collapsing .image img { max-width: none; } /******************************* Types *******************************/ /* -------------- Complex --------------- */ .ui.structured.table { border-collapse: collapse; } .ui.structured.table > thead > tr > th { border-left: none; border-right: none; } .ui.structured.sortable.table > thead > tr > th { border-left: 1px solid rgba(34, 36, 38, 0.15); border-right: 1px solid rgba(34, 36, 38, 0.15); } .ui.structured.basic.table > tr > th, .ui.structured.basic.table > thead > tr > th, .ui.structured.basic.table > tbody > tr > th, .ui.structured.basic.table > tfoot > tr > th { border-left: none; border-right: none; } .ui.structured.celled.table > tr > th, .ui.structured.celled.table > thead > tr > th, .ui.structured.celled.table > tbody > tr > th, .ui.structured.celled.table > tfoot > tr > th, .ui.structured.celled.table > tr > td, .ui.structured.celled.table > tbody > tr > td, .ui.structured.celled.table > tfoot > tr > td { border-left: 1px solid rgba(34, 36, 38, 0.1); border-right: 1px solid rgba(34, 36, 38, 0.1); } /* -------------- Definition --------------- */ .ui.definition.table > thead:not(.full-width) > tr > th:first-child { pointer-events: none; background: #fff; font-weight: normal; color: rgba(0, 0, 0, 0.4); box-shadow: -0.1em -0.2em 0 0.1em #fff; -moz-transform: scale(1); } .ui.definition.table > thead:not(.full-width) > tr > th:first-child:not(:empty) { pointer-events: auto; } .ui.definition.table > tfoot:not(.full-width) > tr > th:first-child { pointer-events: none; background: #fff; font-weight: normal; color: rgba(0, 0, 0, 0.4); box-shadow: -0.1em 0.2em 0 0.1em #fff; -moz-transform: scale(1); } /* Highlight Defining Column */ .ui.definition.table > tr > td:first-child:not(.ignored), .ui.definition.table > tbody > tr > td:first-child:not(.ignored), .ui.definition.table > tfoot > tr > td:first-child:not(.ignored), .ui.definition.table tr td.definition { background: rgba(0, 0, 0, 0.03); font-weight: bold; color: rgba(0, 0, 0, 0.95); text-transform: ""; box-shadow: ""; text-align: ""; font-size: 1em; padding-left: ""; padding-right: ""; } /* Fix 2nd Column */ .ui.definition.table > thead:not(.full-width) > tr > th:nth-child(2) { border-left: 1px solid rgba(34, 36, 38, 0.15); } .ui.definition.table > tfoot:not(.full-width) > tr > th:nth-child(2), .ui.definition.table > tfoot:not(.full-width) > tr > td:nth-child(2) { border-left: 1px solid rgba(34, 36, 38, 0.15); } .ui.definition.table > tr > td:nth-child(2), .ui.definition.table > tbody > tr > td:nth-child(2) { border-left: 1px solid rgba(34, 36, 38, 0.15); } /******************************* States *******************************/ /* -------------- Positive --------------- */ .ui.ui.ui.ui.table tr.positive, .ui.ui.table td.positive { box-shadow: 0 0 0 #a3c293 inset; background: #fcfff5; color: #2c662d; } .ui.ui.ui.ui.inverted.table tr.positive, .ui.ui.inverted.table td.positive { background: #a3c293; color: #2c662d; } /* -------------- Negative --------------- */ .ui.ui.ui.ui.table tr.negative, .ui.ui.table td.negative { box-shadow: 0 0 0 #e0b4b4 inset; background: #fff6f6; color: #9f3a38; } .ui.ui.ui.ui.inverted.table tr.negative, .ui.ui.inverted.table td.negative { background: #e0b4b4; color: #9f3a38; } /* -------------- Error --------------- */ .ui.ui.ui.ui.table tr.error, .ui.ui.table td.error { box-shadow: 0 0 0 #e0b4b4 inset; background: #fff6f6; color: #9f3a38; } .ui.ui.ui.ui.inverted.table tr.error, .ui.ui.inverted.table td.error { background: #e0b4b4; color: #9f3a38; } /* -------------- Warning --------------- */ .ui.ui.ui.ui.table tr.warning, .ui.ui.table td.warning { box-shadow: 0 0 0 #c9ba9b inset; background: #fffaf3; color: #573a08; } .ui.ui.ui.ui.inverted.table tr.warning, .ui.ui.inverted.table td.warning { background: #eec97e; color: #573a08; } /* -------------- Active --------------- */ .ui.ui.ui.ui.table tr.active, .ui.ui.table td.active { box-shadow: 0 0 0 rgba(0, 0, 0, 0.87) inset; background: #e0e0e0; color: rgba(0, 0, 0, 0.87); } .ui.ui.ui.ui.inverted.table tr.active, .ui.ui.inverted.table td.active { background: #a0a0a0; color: rgba(0, 0, 0, 0.87); } /* -------------- Disabled --------------- */ .ui.ui.ui.table tr.disabled td, .ui.ui.ui.table tr td.disabled, .ui.table tr.disabled:hover, .ui.table tr:hover td.disabled { pointer-events: none; color: rgba(40, 40, 40, 0.3); } /******************************* Variations *******************************/ /* -------------- Stackable --------------- */ @media only screen and (max-width: 991.98px) { .ui[class*="tablet stackable"].table, .ui[class*="tablet stackable"].table > thead, .ui[class*="tablet stackable"].table > thead > tr, .ui[class*="tablet stackable"].table > tfoot, .ui[class*="tablet stackable"].table > tfoot > tr, .ui[class*="tablet stackable"].table > tbody, .ui[class*="tablet stackable"].table > tbody > tr, .ui[class*="tablet stackable"].table > tr, .ui[class*="tablet stackable"].table > thead > tr > th:not(.rowspanned), .ui[class*="tablet stackable"].table > tbody > tr > th:not(.rowspanned), .ui[class*="tablet stackable"].table > tfoot > tr > th:not(.rowspanned), .ui[class*="tablet stackable"].table > tr > th:not(.rowspanned), .ui[class*="tablet stackable"].table > tbody > tr > td:not(.rowspanned), .ui[class*="tablet stackable"].table > tfoot > tr > td:not(.rowspanned), .ui[class*="tablet stackable"].table > tr > td:not(.rowspanned) { display: block !important; width: 100% !important; } .ui[class*="tablet stackable"].table { padding: 0; } .ui[class*="tablet stackable"].table > thead { display: block; } .ui[class*="tablet stackable"].table > tfoot { display: block; } .ui.ui.ui.ui[class*="tablet stackable"].table > thead > tr, .ui.ui.ui.ui[class*="tablet stackable"].table > tbody > tr, .ui.ui.ui.ui[class*="tablet stackable"].table > tfoot > tr, .ui.ui.ui.ui[class*="tablet stackable"].table > tr { padding-top: 1em; padding-bottom: 1em; box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset; } .ui[class*="tablet stackable"].table > thead > tr > th, .ui[class*="tablet stackable"].table > tbody > tr > th, .ui[class*="tablet stackable"].table > tfoot > tr > th, .ui[class*="tablet stackable"].table > tr > th, .ui[class*="tablet stackable"].table > tbody > tr > td, .ui[class*="tablet stackable"].table > tfoot > tr > td, .ui[class*="tablet stackable"].table > tr > td { background: none; border: none !important; padding: 0.25em 0.75em; box-shadow: none; } /* Definition Table */ .ui.definition[class*="tablet stackable"].table > thead > tr > th:first-child { box-shadow: none !important; } } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="primary marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185d0 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="primary marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185d0 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="primary marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54c8ff inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="primary marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54c8ff inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="secondary marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1b1c1d inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="secondary marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1b1c1d inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="secondary marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="secondary marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="red marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #db2828 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="red marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #db2828 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="red marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff695e inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="red marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff695e inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="orange marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #f2711c inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="orange marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #f2711c inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="orange marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff851b inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="orange marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff851b inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="yellow marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #fbbd08 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="yellow marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #fbbd08 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="yellow marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ffe21f inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="yellow marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ffe21f inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="olive marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #b5cc18 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="olive marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #b5cc18 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="olive marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #d9e778 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="olive marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #d9e778 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="green marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #21ba45 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="green marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #21ba45 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="green marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2ecc40 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="green marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2ecc40 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="teal marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #00b5ad inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="teal marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #00b5ad inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="teal marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6dffff inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="teal marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6dffff inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="blue marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185d0 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="blue marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185d0 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="blue marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54c8ff inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="blue marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54c8ff inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="violet marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6435c9 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="violet marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6435c9 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="violet marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a291fb inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="violet marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a291fb inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="purple marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a333c8 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="purple marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a333c8 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="purple marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #dc73ff inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="purple marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #dc73ff inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="pink marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #e03997 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="pink marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #e03997 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="pink marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #ff8edf inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="pink marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #ff8edf inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="brown marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #a5673f inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="brown marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #a5673f inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="brown marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #d67c1c inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="brown marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #d67c1c inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="grey marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #767676 inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="grey marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #767676 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="grey marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #dcddde inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="grey marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #dcddde inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="black marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1b1c1d inset; } .ui.ui.ui.ui[class*="tablet stackable"].table tr[class*="black marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1b1c1d inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="black marked"].left { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset; } .ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr[class*="black marked"].right { box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset; } /* -------------- Text Alignment --------------- */ .ui.table[class*="left aligned"], .ui.table [class*="left aligned"] { text-align: left; } .ui.table[class*="center aligned"], .ui.table [class*="center aligned"] { text-align: center; } .ui.table[class*="right aligned"], .ui.table [class*="right aligned"] { text-align: right; } /* ------------------ Vertical Alignment ------------------ */ .ui.table[class*="top aligned"], .ui.table [class*="top aligned"] { vertical-align: top; } .ui.table[class*="middle aligned"], .ui.table [class*="middle aligned"] { vertical-align: middle; } .ui.table[class*="bottom aligned"], .ui.table [class*="bottom aligned"] { vertical-align: bottom; } /* -------------- Collapsing --------------- */ .ui.table th.collapsing, .ui.table td.collapsing { width: 1px; white-space: nowrap; } /* -------------- Fixed --------------- */ .ui.fixed.table { table-layout: fixed; } .ui.fixed.table th, .ui.fixed.table td { overflow: hidden; text-overflow: ellipsis; } /* -------------- Selectable --------------- */ .ui.ui.selectable.table > tbody > tr:hover, .ui.table tbody tr td.selectable:hover { background: rgba(0, 0, 0, 0.05); color: rgba(0, 0, 0, 0.95); } .ui.ui.selectable.inverted.table > tbody > tr:hover, .ui.inverted.table tbody tr td.selectable:hover { background: rgba(255, 255, 255, 0.08); color: #ffffff; } /* Selectable Cell Link */ .ui.table tbody tr td.selectable { padding: 0; } .ui.table tbody tr td.selectable > a:not(.ui) { display: block; color: inherit; } .ui.table:not(.compact) tbody tr td.selectable > a:not(.ui) { padding: 0.78571429em 0.78571429em; } .ui.table > tr > td.selectable, .ui.table > tbody > tr > td.selectable, .ui.selectable.table > tbody > tr, .ui.selectable.table > tr { cursor: pointer; } /* Other States */ .ui.ui.selectable.table tr.error:hover, .ui.table tr td.selectable.error:hover, .ui.selectable.table tr:hover td.error { background: #ffe7e7; color: #943634; } .ui.ui.selectable.table tr.warning:hover, .ui.table tr td.selectable.warning:hover, .ui.selectable.table tr:hover td.warning { background: #fff4e4; color: #493107; } .ui.ui.selectable.table tr.active:hover, .ui.table tr td.selectable.active:hover, .ui.selectable.table tr:hover td.active { background: #e0e0e0; color: rgba(0, 0, 0, 0.87); } .ui.ui.selectable.table tr.positive:hover, .ui.table tr td.selectable.positive:hover, .ui.selectable.table tr:hover td.positive { background: #f7ffe6; color: #275b28; } .ui.ui.selectable.table tr.negative:hover, .ui.table tr td.selectable.negative:hover, .ui.selectable.table tr:hover td.negative { background: #ffe7e7; color: #943634; } /* ------------------- Attached -------------------- */ /* Middle */ .ui.attached.table { top: 0; bottom: 0; border-radius: 0; margin: 0 -1px; width: calc(100% + 2px); max-width: calc(100% + 2px); box-shadow: none; border: 1px solid #d4d4d5; } .ui.attached + .ui.attached.table:not(.top) { border-top: none; } /* Top */ .ui[class*="top attached"].table { bottom: 0; margin-bottom: 0; top: 0; margin-top: 1em; border-radius: 0.28571429rem 0.28571429rem 0 0; } .ui.table[class*="top attached"]:first-child { margin-top: 0; } /* Bottom */ .ui[class*="bottom attached"].table { bottom: 0; margin-top: 0; top: 0; margin-bottom: 1em; box-shadow: none; border-radius: 0 0 0.28571429rem 0.28571429rem; } .ui[class*="bottom attached"].table:last-child { margin-bottom: 0; } /* -------------- Striped --------------- */ /* Table Striping */ .ui.striped.table > tr:nth-child(2n), .ui.striped.table > tbody > tr:nth-child(2n) { background-color: rgba(0, 0, 50, 0.02); } /* Stripes */ .ui.inverted.striped.table > tr:nth-child(2n), .ui.inverted.striped.table > tbody > tr:nth-child(2n) { background-color: rgba(255, 255, 255, 0.05); } /* Allow striped active hover */ .ui.striped.selectable.selectable.selectable.table tbody tr.active:hover { background: #efefef; color: rgba(0, 0, 0, 0.95); } /* -------------- Single Line --------------- */ .ui.table[class*="single line"], .ui.table [class*="single line"] { white-space: nowrap; } /* ------------------- Colors -------------------- */ .ui.primary.table { border-top: 0.2em solid #2185d0; } .ui.inverted.primary.table { background: #2185d0; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.primary, .ui.scrolling.table > tfoot.primary { background: #ddf4ff; color: #ddf4ff; } .ui.scrolling.table > thead.primary > tr > th, .ui.scrolling.table > tfoot.primary > tr > th, .ui.scrolling.table > thead.primary > tr > td, .ui.scrolling.table > tfoot.primary > tr > td { background: inherit; color: rgba(255, 255, 255, 0.9); } .ui.inverted.scrolling.table > thead.primary, .ui.inverted.scrolling.table > tfoot.primary { background: #2185d0; color: #2185d0; } .ui.inverted.scrolling.table > thead.primary > tr > th, .ui.inverted.scrolling.table > tfoot.primary > tr > th, .ui.inverted.scrolling.table > thead.primary > tr > td, .ui.inverted.scrolling.table > tfoot.primary > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="primary colored"], .ui.ui.table th[class*="primary colored"], .ui.ui.table td[class*="primary colored"], .ui.ui.ui.ui.table tr.primary:not(.marked), .ui.ui.table th.primary:not(.marked), .ui.ui.table td.primary:not(.marked) { background: #ddf4ff; color: rgba(255, 255, 255, 0.9); } .ui.table > thead > tr[class*="primary colored"] > th, .ui.table > tfoot > tr[class*="primary colored"] > th, .ui.table > tfoot > tr[class*="primary colored"] > td, .ui.table > thead > tr.primary:not(.marked) > th, .ui.table > tfoot > tr.primary:not(.marked) > th, .ui.table > tfoot > tr.primary:not(.marked) > td { background: inherit; color: rgba(255, 255, 255, 0.9); } .ui.ui.ui.ui.inverted.table tr[class*="primary colored"], .ui.ui.inverted.table th[class*="primary colored"], .ui.ui.inverted.table td[class*="primary colored"], .ui.ui.ui.ui.inverted.table tr.primary:not(.marked), .ui.ui.inverted.table th.primary:not(.marked), .ui.ui.inverted.table td.primary:not(.marked) { background: #2185d0; color: #fff; } .ui.inverted.table > thead > tr[class*="primary colored"] > th, .ui.inverted.table > tfoot > tr[class*="primary colored"] > th, .ui.inverted.table > tfoot > tr[class*="primary colored"] > td, .ui.inverted.table > thead > tr.primary:not(.marked) > th, .ui.inverted.table > tfoot > tr.primary:not(.marked) > th, .ui.inverted.table > tfoot > tr.primary:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="primary colored"]:hover, .ui.table tr td.selectable[class*="primary colored"]:hover, .ui.selectable.table tr:hover td[class*="primary colored"], .ui.ui.selectable.table tr.primary:not(.marked):hover, .ui.table tr td.selectable.primary:not(.marked):hover, .ui.selectable.table tr:hover td.primary:not(.marked) { background: #d3f1ff; color: rgba(255, 255, 255, 0.9); } .ui.ui.inverted.selectable.table tr[class*="primary colored"]:hover, .ui.inverted.table tr td.selectable[class*="primary colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="primary colored"], .ui.ui.inverted.selectable.table tr.primary:not(.marked):hover, .ui.inverted.table tr td.selectable.primary:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.primary:not(.marked) { background: #21b8ff; color: #fff; } .ui.table td[class*="primary marked"].left, .ui.table tr[class*="primary marked"].left { box-shadow: 0.2em 0 0 0 #2185d0 inset; } .ui.table td[class*="primary marked"].right, .ui.table tr[class*="primary marked"].right { box-shadow: -0.2em 0 0 0 #2185d0 inset; } .ui.inverted.table td[class*="primary marked"].left, .ui.inverted.table tr[class*="primary marked"].left { box-shadow: 0.2em 0 0 0 #54c8ff inset; } .ui.inverted.table td[class*="primary marked"].right, .ui.inverted.table tr[class*="primary marked"].right { box-shadow: -0.2em 0 0 0 #54c8ff inset; } .ui.secondary.table { border-top: 0.2em solid #1b1c1d; } .ui.inverted.secondary.table { background: #1b1c1d; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.secondary, .ui.scrolling.table > tfoot.secondary { background: #dddddd; color: #dddddd; } .ui.scrolling.table > thead.secondary > tr > th, .ui.scrolling.table > tfoot.secondary > tr > th, .ui.scrolling.table > thead.secondary > tr > td, .ui.scrolling.table > tfoot.secondary > tr > td { background: inherit; color: rgba(255, 255, 255, 0.9); } .ui.inverted.scrolling.table > thead.secondary, .ui.inverted.scrolling.table > tfoot.secondary { background: #1b1c1d; color: #1b1c1d; } .ui.inverted.scrolling.table > thead.secondary > tr > th, .ui.inverted.scrolling.table > tfoot.secondary > tr > th, .ui.inverted.scrolling.table > thead.secondary > tr > td, .ui.inverted.scrolling.table > tfoot.secondary > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="secondary colored"], .ui.ui.table th[class*="secondary colored"], .ui.ui.table td[class*="secondary colored"], .ui.ui.ui.ui.table tr.secondary:not(.marked), .ui.ui.table th.secondary:not(.marked), .ui.ui.table td.secondary:not(.marked) { background: #dddddd; color: rgba(255, 255, 255, 0.9); } .ui.table > thead > tr[class*="secondary colored"] > th, .ui.table > tfoot > tr[class*="secondary colored"] > th, .ui.table > tfoot > tr[class*="secondary colored"] > td, .ui.table > thead > tr.secondary:not(.marked) > th, .ui.table > tfoot > tr.secondary:not(.marked) > th, .ui.table > tfoot > tr.secondary:not(.marked) > td { background: inherit; color: rgba(255, 255, 255, 0.9); } .ui.ui.ui.ui.inverted.table tr[class*="secondary colored"], .ui.ui.inverted.table th[class*="secondary colored"], .ui.ui.inverted.table td[class*="secondary colored"], .ui.ui.ui.ui.inverted.table tr.secondary:not(.marked), .ui.ui.inverted.table th.secondary:not(.marked), .ui.ui.inverted.table td.secondary:not(.marked) { background: #1b1c1d; color: #fff; } .ui.inverted.table > thead > tr[class*="secondary colored"] > th, .ui.inverted.table > tfoot > tr[class*="secondary colored"] > th, .ui.inverted.table > tfoot > tr[class*="secondary colored"] > td, .ui.inverted.table > thead > tr.secondary:not(.marked) > th, .ui.inverted.table > tfoot > tr.secondary:not(.marked) > th, .ui.inverted.table > tfoot > tr.secondary:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="secondary colored"]:hover, .ui.table tr td.selectable[class*="secondary colored"]:hover, .ui.selectable.table tr:hover td[class*="secondary colored"], .ui.ui.selectable.table tr.secondary:not(.marked):hover, .ui.table tr td.selectable.secondary:not(.marked):hover, .ui.selectable.table tr:hover td.secondary:not(.marked) { background: #e2e2e2; color: rgba(255, 255, 255, 0.9); } .ui.ui.inverted.selectable.table tr[class*="secondary colored"]:hover, .ui.inverted.table tr td.selectable[class*="secondary colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="secondary colored"], .ui.ui.inverted.selectable.table tr.secondary:not(.marked):hover, .ui.inverted.table tr td.selectable.secondary:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.secondary:not(.marked) { background: #6e6e6e; color: #fff; } .ui.table td[class*="secondary marked"].left, .ui.table tr[class*="secondary marked"].left { box-shadow: 0.2em 0 0 0 #1b1c1d inset; } .ui.table td[class*="secondary marked"].right, .ui.table tr[class*="secondary marked"].right { box-shadow: -0.2em 0 0 0 #1b1c1d inset; } .ui.inverted.table td[class*="secondary marked"].left, .ui.inverted.table tr[class*="secondary marked"].left { box-shadow: 0.2em 0 0 0 #545454 inset; } .ui.inverted.table td[class*="secondary marked"].right, .ui.inverted.table tr[class*="secondary marked"].right { box-shadow: -0.2em 0 0 0 #545454 inset; } .ui.red.table { border-top: 0.2em solid #db2828; } .ui.inverted.red.table { background: #db2828; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.red, .ui.scrolling.table > tfoot.red { background: #ffe1df; color: #ffe1df; } .ui.scrolling.table > thead.red > tr > th, .ui.scrolling.table > tfoot.red > tr > th, .ui.scrolling.table > thead.red > tr > td, .ui.scrolling.table > tfoot.red > tr > td { background: inherit; color: #db2828; } .ui.inverted.scrolling.table > thead.red, .ui.inverted.scrolling.table > tfoot.red { background: #db2828; color: #db2828; } .ui.inverted.scrolling.table > thead.red > tr > th, .ui.inverted.scrolling.table > tfoot.red > tr > th, .ui.inverted.scrolling.table > thead.red > tr > td, .ui.inverted.scrolling.table > tfoot.red > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="red colored"], .ui.ui.table th[class*="red colored"], .ui.ui.table td[class*="red colored"], .ui.ui.ui.ui.table tr.red:not(.marked), .ui.ui.table th.red:not(.marked), .ui.ui.table td.red:not(.marked) { background: #ffe1df; color: #db2828; } .ui.table > thead > tr[class*="red colored"] > th, .ui.table > tfoot > tr[class*="red colored"] > th, .ui.table > tfoot > tr[class*="red colored"] > td, .ui.table > thead > tr.red:not(.marked) > th, .ui.table > tfoot > tr.red:not(.marked) > th, .ui.table > tfoot > tr.red:not(.marked) > td { background: inherit; color: #db2828; } .ui.ui.ui.ui.inverted.table tr[class*="red colored"], .ui.ui.inverted.table th[class*="red colored"], .ui.ui.inverted.table td[class*="red colored"], .ui.ui.ui.ui.inverted.table tr.red:not(.marked), .ui.ui.inverted.table th.red:not(.marked), .ui.ui.inverted.table td.red:not(.marked) { background: #db2828; color: #fff; } .ui.inverted.table > thead > tr[class*="red colored"] > th, .ui.inverted.table > tfoot > tr[class*="red colored"] > th, .ui.inverted.table > tfoot > tr[class*="red colored"] > td, .ui.inverted.table > thead > tr.red:not(.marked) > th, .ui.inverted.table > tfoot > tr.red:not(.marked) > th, .ui.inverted.table > tfoot > tr.red:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="red colored"]:hover, .ui.table tr td.selectable[class*="red colored"]:hover, .ui.selectable.table tr:hover td[class*="red colored"], .ui.ui.selectable.table tr.red:not(.marked):hover, .ui.table tr td.selectable.red:not(.marked):hover, .ui.selectable.table tr:hover td.red:not(.marked) { background: #ffd7d5; color: #db2828; } .ui.ui.inverted.selectable.table tr[class*="red colored"]:hover, .ui.inverted.table tr td.selectable[class*="red colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="red colored"], .ui.ui.inverted.selectable.table tr.red:not(.marked):hover, .ui.inverted.table tr td.selectable.red:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.red:not(.marked) { background: #ff392b; color: #fff; } .ui.table td[class*="red marked"].left, .ui.table tr[class*="red marked"].left { box-shadow: 0.2em 0 0 0 #db2828 inset; } .ui.table td[class*="red marked"].right, .ui.table tr[class*="red marked"].right { box-shadow: -0.2em 0 0 0 #db2828 inset; } .ui.inverted.table td[class*="red marked"].left, .ui.inverted.table tr[class*="red marked"].left { box-shadow: 0.2em 0 0 0 #ff695e inset; } .ui.inverted.table td[class*="red marked"].right, .ui.inverted.table tr[class*="red marked"].right { box-shadow: -0.2em 0 0 0 #ff695e inset; } .ui.orange.table { border-top: 0.2em solid #f2711c; } .ui.inverted.orange.table { background: #f2711c; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.orange, .ui.scrolling.table > tfoot.orange { background: #ffe7d1; color: #ffe7d1; } .ui.scrolling.table > thead.orange > tr > th, .ui.scrolling.table > tfoot.orange > tr > th, .ui.scrolling.table > thead.orange > tr > td, .ui.scrolling.table > tfoot.orange > tr > td { background: inherit; color: #f2711c; } .ui.inverted.scrolling.table > thead.orange, .ui.inverted.scrolling.table > tfoot.orange { background: #f2711c; color: #f2711c; } .ui.inverted.scrolling.table > thead.orange > tr > th, .ui.inverted.scrolling.table > tfoot.orange > tr > th, .ui.inverted.scrolling.table > thead.orange > tr > td, .ui.inverted.scrolling.table > tfoot.orange > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="orange colored"], .ui.ui.table th[class*="orange colored"], .ui.ui.table td[class*="orange colored"], .ui.ui.ui.ui.table tr.orange:not(.marked), .ui.ui.table th.orange:not(.marked), .ui.ui.table td.orange:not(.marked) { background: #ffe7d1; color: #f2711c; } .ui.table > thead > tr[class*="orange colored"] > th, .ui.table > tfoot > tr[class*="orange colored"] > th, .ui.table > tfoot > tr[class*="orange colored"] > td, .ui.table > thead > tr.orange:not(.marked) > th, .ui.table > tfoot > tr.orange:not(.marked) > th, .ui.table > tfoot > tr.orange:not(.marked) > td { background: inherit; color: #f2711c; } .ui.ui.ui.ui.inverted.table tr[class*="orange colored"], .ui.ui.inverted.table th[class*="orange colored"], .ui.ui.inverted.table td[class*="orange colored"], .ui.ui.ui.ui.inverted.table tr.orange:not(.marked), .ui.ui.inverted.table th.orange:not(.marked), .ui.ui.inverted.table td.orange:not(.marked) { background: #f2711c; color: #fff; } .ui.inverted.table > thead > tr[class*="orange colored"] > th, .ui.inverted.table > tfoot > tr[class*="orange colored"] > th, .ui.inverted.table > tfoot > tr[class*="orange colored"] > td, .ui.inverted.table > thead > tr.orange:not(.marked) > th, .ui.inverted.table > tfoot > tr.orange:not(.marked) > th, .ui.inverted.table > tfoot > tr.orange:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="orange colored"]:hover, .ui.table tr td.selectable[class*="orange colored"]:hover, .ui.selectable.table tr:hover td[class*="orange colored"], .ui.ui.selectable.table tr.orange:not(.marked):hover, .ui.table tr td.selectable.orange:not(.marked):hover, .ui.selectable.table tr:hover td.orange:not(.marked) { background: #fae1cc; color: #f2711c; } .ui.ui.inverted.selectable.table tr[class*="orange colored"]:hover, .ui.inverted.table tr td.selectable[class*="orange colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="orange colored"], .ui.ui.inverted.selectable.table tr.orange:not(.marked):hover, .ui.inverted.table tr td.selectable.orange:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.orange:not(.marked) { background: #e76b00; color: #fff; } .ui.table td[class*="orange marked"].left, .ui.table tr[class*="orange marked"].left { box-shadow: 0.2em 0 0 0 #f2711c inset; } .ui.table td[class*="orange marked"].right, .ui.table tr[class*="orange marked"].right { box-shadow: -0.2em 0 0 0 #f2711c inset; } .ui.inverted.table td[class*="orange marked"].left, .ui.inverted.table tr[class*="orange marked"].left { box-shadow: 0.2em 0 0 0 #ff851b inset; } .ui.inverted.table td[class*="orange marked"].right, .ui.inverted.table tr[class*="orange marked"].right { box-shadow: -0.2em 0 0 0 #ff851b inset; } .ui.yellow.table { border-top: 0.2em solid #fbbd08; } .ui.inverted.yellow.table { background: #fbbd08; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.yellow, .ui.scrolling.table > tfoot.yellow { background: #fff9d2; color: #fff9d2; } .ui.scrolling.table > thead.yellow > tr > th, .ui.scrolling.table > tfoot.yellow > tr > th, .ui.scrolling.table > thead.yellow > tr > td, .ui.scrolling.table > tfoot.yellow > tr > td { background: inherit; color: #b58105; } .ui.inverted.scrolling.table > thead.yellow, .ui.inverted.scrolling.table > tfoot.yellow { background: #fbbd08; color: #fbbd08; } .ui.inverted.scrolling.table > thead.yellow > tr > th, .ui.inverted.scrolling.table > tfoot.yellow > tr > th, .ui.inverted.scrolling.table > thead.yellow > tr > td, .ui.inverted.scrolling.table > tfoot.yellow > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="yellow colored"], .ui.ui.table th[class*="yellow colored"], .ui.ui.table td[class*="yellow colored"], .ui.ui.ui.ui.table tr.yellow:not(.marked), .ui.ui.table th.yellow:not(.marked), .ui.ui.table td.yellow:not(.marked) { background: #fff9d2; color: #b58105; } .ui.table > thead > tr[class*="yellow colored"] > th, .ui.table > tfoot > tr[class*="yellow colored"] > th, .ui.table > tfoot > tr[class*="yellow colored"] > td, .ui.table > thead > tr.yellow:not(.marked) > th, .ui.table > tfoot > tr.yellow:not(.marked) > th, .ui.table > tfoot > tr.yellow:not(.marked) > td { background: inherit; color: #b58105; } .ui.ui.ui.ui.inverted.table tr[class*="yellow colored"], .ui.ui.inverted.table th[class*="yellow colored"], .ui.ui.inverted.table td[class*="yellow colored"], .ui.ui.ui.ui.inverted.table tr.yellow:not(.marked), .ui.ui.inverted.table th.yellow:not(.marked), .ui.ui.inverted.table td.yellow:not(.marked) { background: #fbbd08; color: #fff; } .ui.inverted.table > thead > tr[class*="yellow colored"] > th, .ui.inverted.table > tfoot > tr[class*="yellow colored"] > th, .ui.inverted.table > tfoot > tr[class*="yellow colored"] > td, .ui.inverted.table > thead > tr.yellow:not(.marked) > th, .ui.inverted.table > tfoot > tr.yellow:not(.marked) > th, .ui.inverted.table > tfoot > tr.yellow:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="yellow colored"]:hover, .ui.table tr td.selectable[class*="yellow colored"]:hover, .ui.selectable.table tr:hover td[class*="yellow colored"], .ui.ui.selectable.table tr.yellow:not(.marked):hover, .ui.table tr td.selectable.yellow:not(.marked):hover, .ui.selectable.table tr:hover td.yellow:not(.marked) { background: #fbf5cc; color: #b58105; } .ui.ui.inverted.selectable.table tr[class*="yellow colored"]:hover, .ui.inverted.table tr td.selectable[class*="yellow colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="yellow colored"], .ui.ui.inverted.selectable.table tr.yellow:not(.marked):hover, .ui.inverted.table tr td.selectable.yellow:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.yellow:not(.marked) { background: #ebcd00; color: #fff; } .ui.table td[class*="yellow marked"].left, .ui.table tr[class*="yellow marked"].left { box-shadow: 0.2em 0 0 0 #fbbd08 inset; } .ui.table td[class*="yellow marked"].right, .ui.table tr[class*="yellow marked"].right { box-shadow: -0.2em 0 0 0 #fbbd08 inset; } .ui.inverted.table td[class*="yellow marked"].left, .ui.inverted.table tr[class*="yellow marked"].left { box-shadow: 0.2em 0 0 0 #ffe21f inset; } .ui.inverted.table td[class*="yellow marked"].right, .ui.inverted.table tr[class*="yellow marked"].right { box-shadow: -0.2em 0 0 0 #ffe21f inset; } .ui.olive.table { border-top: 0.2em solid #b5cc18; } .ui.inverted.olive.table { background: #b5cc18; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.olive, .ui.scrolling.table > tfoot.olive { background: #f7fae4; color: #f7fae4; } .ui.scrolling.table > thead.olive > tr > th, .ui.scrolling.table > tfoot.olive > tr > th, .ui.scrolling.table > thead.olive > tr > td, .ui.scrolling.table > tfoot.olive > tr > td { background: inherit; color: #8abc1e; } .ui.inverted.scrolling.table > thead.olive, .ui.inverted.scrolling.table > tfoot.olive { background: #b5cc18; color: #b5cc18; } .ui.inverted.scrolling.table > thead.olive > tr > th, .ui.inverted.scrolling.table > tfoot.olive > tr > th, .ui.inverted.scrolling.table > thead.olive > tr > td, .ui.inverted.scrolling.table > tfoot.olive > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="olive colored"], .ui.ui.table th[class*="olive colored"], .ui.ui.table td[class*="olive colored"], .ui.ui.ui.ui.table tr.olive:not(.marked), .ui.ui.table th.olive:not(.marked), .ui.ui.table td.olive:not(.marked) { background: #f7fae4; color: #8abc1e; } .ui.table > thead > tr[class*="olive colored"] > th, .ui.table > tfoot > tr[class*="olive colored"] > th, .ui.table > tfoot > tr[class*="olive colored"] > td, .ui.table > thead > tr.olive:not(.marked) > th, .ui.table > tfoot > tr.olive:not(.marked) > th, .ui.table > tfoot > tr.olive:not(.marked) > td { background: inherit; color: #8abc1e; } .ui.ui.ui.ui.inverted.table tr[class*="olive colored"], .ui.ui.inverted.table th[class*="olive colored"], .ui.ui.inverted.table td[class*="olive colored"], .ui.ui.ui.ui.inverted.table tr.olive:not(.marked), .ui.ui.inverted.table th.olive:not(.marked), .ui.ui.inverted.table td.olive:not(.marked) { background: #b5cc18; color: #fff; } .ui.inverted.table > thead > tr[class*="olive colored"] > th, .ui.inverted.table > tfoot > tr[class*="olive colored"] > th, .ui.inverted.table > tfoot > tr[class*="olive colored"] > td, .ui.inverted.table > thead > tr.olive:not(.marked) > th, .ui.inverted.table > tfoot > tr.olive:not(.marked) > th, .ui.inverted.table > tfoot > tr.olive:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="olive colored"]:hover, .ui.table tr td.selectable[class*="olive colored"]:hover, .ui.selectable.table tr:hover td[class*="olive colored"], .ui.ui.selectable.table tr.olive:not(.marked):hover, .ui.table tr td.selectable.olive:not(.marked):hover, .ui.selectable.table tr:hover td.olive:not(.marked) { background: #f6fada; color: #8abc1e; } .ui.ui.inverted.selectable.table tr[class*="olive colored"]:hover, .ui.inverted.table tr td.selectable[class*="olive colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="olive colored"], .ui.ui.inverted.selectable.table tr.olive:not(.marked):hover, .ui.inverted.table tr td.selectable.olive:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.olive:not(.marked) { background: #d2e745; color: #fff; } .ui.table td[class*="olive marked"].left, .ui.table tr[class*="olive marked"].left { box-shadow: 0.2em 0 0 0 #b5cc18 inset; } .ui.table td[class*="olive marked"].right, .ui.table tr[class*="olive marked"].right { box-shadow: -0.2em 0 0 0 #b5cc18 inset; } .ui.inverted.table td[class*="olive marked"].left, .ui.inverted.table tr[class*="olive marked"].left { box-shadow: 0.2em 0 0 0 #d9e778 inset; } .ui.inverted.table td[class*="olive marked"].right, .ui.inverted.table tr[class*="olive marked"].right { box-shadow: -0.2em 0 0 0 #d9e778 inset; } .ui.green.table { border-top: 0.2em solid #21ba45; } .ui.inverted.green.table { background: #21ba45; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.green, .ui.scrolling.table > tfoot.green { background: #d5f5d9; color: #d5f5d9; } .ui.scrolling.table > thead.green > tr > th, .ui.scrolling.table > tfoot.green > tr > th, .ui.scrolling.table > thead.green > tr > td, .ui.scrolling.table > tfoot.green > tr > td { background: inherit; color: #1ebc30; } .ui.inverted.scrolling.table > thead.green, .ui.inverted.scrolling.table > tfoot.green { background: #21ba45; color: #21ba45; } .ui.inverted.scrolling.table > thead.green > tr > th, .ui.inverted.scrolling.table > tfoot.green > tr > th, .ui.inverted.scrolling.table > thead.green > tr > td, .ui.inverted.scrolling.table > tfoot.green > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="green colored"], .ui.ui.table th[class*="green colored"], .ui.ui.table td[class*="green colored"], .ui.ui.ui.ui.table tr.green:not(.marked), .ui.ui.table th.green:not(.marked), .ui.ui.table td.green:not(.marked) { background: #d5f5d9; color: #1ebc30; } .ui.table > thead > tr[class*="green colored"] > th, .ui.table > tfoot > tr[class*="green colored"] > th, .ui.table > tfoot > tr[class*="green colored"] > td, .ui.table > thead > tr.green:not(.marked) > th, .ui.table > tfoot > tr.green:not(.marked) > th, .ui.table > tfoot > tr.green:not(.marked) > td { background: inherit; color: #1ebc30; } .ui.ui.ui.ui.inverted.table tr[class*="green colored"], .ui.ui.inverted.table th[class*="green colored"], .ui.ui.inverted.table td[class*="green colored"], .ui.ui.ui.ui.inverted.table tr.green:not(.marked), .ui.ui.inverted.table th.green:not(.marked), .ui.ui.inverted.table td.green:not(.marked) { background: #21ba45; color: #fff; } .ui.inverted.table > thead > tr[class*="green colored"] > th, .ui.inverted.table > tfoot > tr[class*="green colored"] > th, .ui.inverted.table > tfoot > tr[class*="green colored"] > td, .ui.inverted.table > thead > tr.green:not(.marked) > th, .ui.inverted.table > tfoot > tr.green:not(.marked) > th, .ui.inverted.table > tfoot > tr.green:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="green colored"]:hover, .ui.table tr td.selectable[class*="green colored"]:hover, .ui.selectable.table tr:hover td[class*="green colored"], .ui.ui.selectable.table tr.green:not(.marked):hover, .ui.table tr td.selectable.green:not(.marked):hover, .ui.selectable.table tr:hover td.green:not(.marked) { background: #d2eed5; color: #1ebc30; } .ui.ui.inverted.selectable.table tr[class*="green colored"]:hover, .ui.inverted.table tr td.selectable[class*="green colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="green colored"], .ui.ui.inverted.selectable.table tr.green:not(.marked):hover, .ui.inverted.table tr td.selectable.green:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.green:not(.marked) { background: #1ea92e; color: #fff; } .ui.table td[class*="green marked"].left, .ui.table tr[class*="green marked"].left { box-shadow: 0.2em 0 0 0 #21ba45 inset; } .ui.table td[class*="green marked"].right, .ui.table tr[class*="green marked"].right { box-shadow: -0.2em 0 0 0 #21ba45 inset; } .ui.inverted.table td[class*="green marked"].left, .ui.inverted.table tr[class*="green marked"].left { box-shadow: 0.2em 0 0 0 #2ecc40 inset; } .ui.inverted.table td[class*="green marked"].right, .ui.inverted.table tr[class*="green marked"].right { box-shadow: -0.2em 0 0 0 #2ecc40 inset; } .ui.teal.table { border-top: 0.2em solid #00b5ad; } .ui.inverted.teal.table { background: #00b5ad; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.teal, .ui.scrolling.table > tfoot.teal { background: #e2ffff; color: #e2ffff; } .ui.scrolling.table > thead.teal > tr > th, .ui.scrolling.table > tfoot.teal > tr > th, .ui.scrolling.table > thead.teal > tr > td, .ui.scrolling.table > tfoot.teal > tr > td { background: inherit; color: #10a3a3; } .ui.inverted.scrolling.table > thead.teal, .ui.inverted.scrolling.table > tfoot.teal { background: #00b5ad; color: #00b5ad; } .ui.inverted.scrolling.table > thead.teal > tr > th, .ui.inverted.scrolling.table > tfoot.teal > tr > th, .ui.inverted.scrolling.table > thead.teal > tr > td, .ui.inverted.scrolling.table > tfoot.teal > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="teal colored"], .ui.ui.table th[class*="teal colored"], .ui.ui.table td[class*="teal colored"], .ui.ui.ui.ui.table tr.teal:not(.marked), .ui.ui.table th.teal:not(.marked), .ui.ui.table td.teal:not(.marked) { background: #e2ffff; color: #10a3a3; } .ui.table > thead > tr[class*="teal colored"] > th, .ui.table > tfoot > tr[class*="teal colored"] > th, .ui.table > tfoot > tr[class*="teal colored"] > td, .ui.table > thead > tr.teal:not(.marked) > th, .ui.table > tfoot > tr.teal:not(.marked) > th, .ui.table > tfoot > tr.teal:not(.marked) > td { background: inherit; color: #10a3a3; } .ui.ui.ui.ui.inverted.table tr[class*="teal colored"], .ui.ui.inverted.table th[class*="teal colored"], .ui.ui.inverted.table td[class*="teal colored"], .ui.ui.ui.ui.inverted.table tr.teal:not(.marked), .ui.ui.inverted.table th.teal:not(.marked), .ui.ui.inverted.table td.teal:not(.marked) { background: #00b5ad; color: #fff; } .ui.inverted.table > thead > tr[class*="teal colored"] > th, .ui.inverted.table > tfoot > tr[class*="teal colored"] > th, .ui.inverted.table > tfoot > tr[class*="teal colored"] > td, .ui.inverted.table > thead > tr.teal:not(.marked) > th, .ui.inverted.table > tfoot > tr.teal:not(.marked) > th, .ui.inverted.table > tfoot > tr.teal:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="teal colored"]:hover, .ui.table tr td.selectable[class*="teal colored"]:hover, .ui.selectable.table tr:hover td[class*="teal colored"], .ui.ui.selectable.table tr.teal:not(.marked):hover, .ui.table tr td.selectable.teal:not(.marked):hover, .ui.selectable.table tr:hover td.teal:not(.marked) { background: #d8ffff; color: #10a3a3; } .ui.ui.inverted.selectable.table tr[class*="teal colored"]:hover, .ui.inverted.table tr td.selectable[class*="teal colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="teal colored"], .ui.ui.inverted.selectable.table tr.teal:not(.marked):hover, .ui.inverted.table tr td.selectable.teal:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.teal:not(.marked) { background: #3affff; color: #fff; } .ui.table td[class*="teal marked"].left, .ui.table tr[class*="teal marked"].left { box-shadow: 0.2em 0 0 0 #00b5ad inset; } .ui.table td[class*="teal marked"].right, .ui.table tr[class*="teal marked"].right { box-shadow: -0.2em 0 0 0 #00b5ad inset; } .ui.inverted.table td[class*="teal marked"].left, .ui.inverted.table tr[class*="teal marked"].left { box-shadow: 0.2em 0 0 0 #6dffff inset; } .ui.inverted.table td[class*="teal marked"].right, .ui.inverted.table tr[class*="teal marked"].right { box-shadow: -0.2em 0 0 0 #6dffff inset; } .ui.blue.table { border-top: 0.2em solid #2185d0; } .ui.inverted.blue.table { background: #2185d0; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.blue, .ui.scrolling.table > tfoot.blue { background: #ddf4ff; color: #ddf4ff; } .ui.scrolling.table > thead.blue > tr > th, .ui.scrolling.table > tfoot.blue > tr > th, .ui.scrolling.table > thead.blue > tr > td, .ui.scrolling.table > tfoot.blue > tr > td { background: inherit; color: #2185d0; } .ui.inverted.scrolling.table > thead.blue, .ui.inverted.scrolling.table > tfoot.blue { background: #2185d0; color: #2185d0; } .ui.inverted.scrolling.table > thead.blue > tr > th, .ui.inverted.scrolling.table > tfoot.blue > tr > th, .ui.inverted.scrolling.table > thead.blue > tr > td, .ui.inverted.scrolling.table > tfoot.blue > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="blue colored"], .ui.ui.table th[class*="blue colored"], .ui.ui.table td[class*="blue colored"], .ui.ui.ui.ui.table tr.blue:not(.marked), .ui.ui.table th.blue:not(.marked), .ui.ui.table td.blue:not(.marked) { background: #ddf4ff; color: #2185d0; } .ui.table > thead > tr[class*="blue colored"] > th, .ui.table > tfoot > tr[class*="blue colored"] > th, .ui.table > tfoot > tr[class*="blue colored"] > td, .ui.table > thead > tr.blue:not(.marked) > th, .ui.table > tfoot > tr.blue:not(.marked) > th, .ui.table > tfoot > tr.blue:not(.marked) > td { background: inherit; color: #2185d0; } .ui.ui.ui.ui.inverted.table tr[class*="blue colored"], .ui.ui.inverted.table th[class*="blue colored"], .ui.ui.inverted.table td[class*="blue colored"], .ui.ui.ui.ui.inverted.table tr.blue:not(.marked), .ui.ui.inverted.table th.blue:not(.marked), .ui.ui.inverted.table td.blue:not(.marked) { background: #2185d0; color: #fff; } .ui.inverted.table > thead > tr[class*="blue colored"] > th, .ui.inverted.table > tfoot > tr[class*="blue colored"] > th, .ui.inverted.table > tfoot > tr[class*="blue colored"] > td, .ui.inverted.table > thead > tr.blue:not(.marked) > th, .ui.inverted.table > tfoot > tr.blue:not(.marked) > th, .ui.inverted.table > tfoot > tr.blue:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="blue colored"]:hover, .ui.table tr td.selectable[class*="blue colored"]:hover, .ui.selectable.table tr:hover td[class*="blue colored"], .ui.ui.selectable.table tr.blue:not(.marked):hover, .ui.table tr td.selectable.blue:not(.marked):hover, .ui.selectable.table tr:hover td.blue:not(.marked) { background: #d3f1ff; color: #2185d0; } .ui.ui.inverted.selectable.table tr[class*="blue colored"]:hover, .ui.inverted.table tr td.selectable[class*="blue colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="blue colored"], .ui.ui.inverted.selectable.table tr.blue:not(.marked):hover, .ui.inverted.table tr td.selectable.blue:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.blue:not(.marked) { background: #21b8ff; color: #fff; } .ui.table td[class*="blue marked"].left, .ui.table tr[class*="blue marked"].left { box-shadow: 0.2em 0 0 0 #2185d0 inset; } .ui.table td[class*="blue marked"].right, .ui.table tr[class*="blue marked"].right { box-shadow: -0.2em 0 0 0 #2185d0 inset; } .ui.inverted.table td[class*="blue marked"].left, .ui.inverted.table tr[class*="blue marked"].left { box-shadow: 0.2em 0 0 0 #54c8ff inset; } .ui.inverted.table td[class*="blue marked"].right, .ui.inverted.table tr[class*="blue marked"].right { box-shadow: -0.2em 0 0 0 #54c8ff inset; } .ui.violet.table { border-top: 0.2em solid #6435c9; } .ui.inverted.violet.table { background: #6435c9; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.violet, .ui.scrolling.table > tfoot.violet { background: #ece9fe; color: #ece9fe; } .ui.scrolling.table > thead.violet > tr > th, .ui.scrolling.table > tfoot.violet > tr > th, .ui.scrolling.table > thead.violet > tr > td, .ui.scrolling.table > tfoot.violet > tr > td { background: inherit; color: #6435c9; } .ui.inverted.scrolling.table > thead.violet, .ui.inverted.scrolling.table > tfoot.violet { background: #6435c9; color: #6435c9; } .ui.inverted.scrolling.table > thead.violet > tr > th, .ui.inverted.scrolling.table > tfoot.violet > tr > th, .ui.inverted.scrolling.table > thead.violet > tr > td, .ui.inverted.scrolling.table > tfoot.violet > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="violet colored"], .ui.ui.table th[class*="violet colored"], .ui.ui.table td[class*="violet colored"], .ui.ui.ui.ui.table tr.violet:not(.marked), .ui.ui.table th.violet:not(.marked), .ui.ui.table td.violet:not(.marked) { background: #ece9fe; color: #6435c9; } .ui.table > thead > tr[class*="violet colored"] > th, .ui.table > tfoot > tr[class*="violet colored"] > th, .ui.table > tfoot > tr[class*="violet colored"] > td, .ui.table > thead > tr.violet:not(.marked) > th, .ui.table > tfoot > tr.violet:not(.marked) > th, .ui.table > tfoot > tr.violet:not(.marked) > td { background: inherit; color: #6435c9; } .ui.ui.ui.ui.inverted.table tr[class*="violet colored"], .ui.ui.inverted.table th[class*="violet colored"], .ui.ui.inverted.table td[class*="violet colored"], .ui.ui.ui.ui.inverted.table tr.violet:not(.marked), .ui.ui.inverted.table th.violet:not(.marked), .ui.ui.inverted.table td.violet:not(.marked) { background: #6435c9; color: #fff; } .ui.inverted.table > thead > tr[class*="violet colored"] > th, .ui.inverted.table > tfoot > tr[class*="violet colored"] > th, .ui.inverted.table > tfoot > tr[class*="violet colored"] > td, .ui.inverted.table > thead > tr.violet:not(.marked) > th, .ui.inverted.table > tfoot > tr.violet:not(.marked) > th, .ui.inverted.table > tfoot > tr.violet:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="violet colored"]:hover, .ui.table tr td.selectable[class*="violet colored"]:hover, .ui.selectable.table tr:hover td[class*="violet colored"], .ui.ui.selectable.table tr.violet:not(.marked):hover, .ui.table tr td.selectable.violet:not(.marked):hover, .ui.selectable.table tr:hover td.violet:not(.marked) { background: #e3deff; color: #6435c9; } .ui.ui.inverted.selectable.table tr[class*="violet colored"]:hover, .ui.inverted.table tr td.selectable[class*="violet colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="violet colored"], .ui.ui.inverted.selectable.table tr.violet:not(.marked):hover, .ui.inverted.table tr td.selectable.violet:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.violet:not(.marked) { background: #745aff; color: #fff; } .ui.table td[class*="violet marked"].left, .ui.table tr[class*="violet marked"].left { box-shadow: 0.2em 0 0 0 #6435c9 inset; } .ui.table td[class*="violet marked"].right, .ui.table tr[class*="violet marked"].right { box-shadow: -0.2em 0 0 0 #6435c9 inset; } .ui.inverted.table td[class*="violet marked"].left, .ui.inverted.table tr[class*="violet marked"].left { box-shadow: 0.2em 0 0 0 #a291fb inset; } .ui.inverted.table td[class*="violet marked"].right, .ui.inverted.table tr[class*="violet marked"].right { box-shadow: -0.2em 0 0 0 #a291fb inset; } .ui.purple.table { border-top: 0.2em solid #a333c8; } .ui.inverted.purple.table { background: #a333c8; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.purple, .ui.scrolling.table > tfoot.purple { background: #f8e3ff; color: #f8e3ff; } .ui.scrolling.table > thead.purple > tr > th, .ui.scrolling.table > tfoot.purple > tr > th, .ui.scrolling.table > thead.purple > tr > td, .ui.scrolling.table > tfoot.purple > tr > td { background: inherit; color: #a333c8; } .ui.inverted.scrolling.table > thead.purple, .ui.inverted.scrolling.table > tfoot.purple { background: #a333c8; color: #a333c8; } .ui.inverted.scrolling.table > thead.purple > tr > th, .ui.inverted.scrolling.table > tfoot.purple > tr > th, .ui.inverted.scrolling.table > thead.purple > tr > td, .ui.inverted.scrolling.table > tfoot.purple > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="purple colored"], .ui.ui.table th[class*="purple colored"], .ui.ui.table td[class*="purple colored"], .ui.ui.ui.ui.table tr.purple:not(.marked), .ui.ui.table th.purple:not(.marked), .ui.ui.table td.purple:not(.marked) { background: #f8e3ff; color: #a333c8; } .ui.table > thead > tr[class*="purple colored"] > th, .ui.table > tfoot > tr[class*="purple colored"] > th, .ui.table > tfoot > tr[class*="purple colored"] > td, .ui.table > thead > tr.purple:not(.marked) > th, .ui.table > tfoot > tr.purple:not(.marked) > th, .ui.table > tfoot > tr.purple:not(.marked) > td { background: inherit; color: #a333c8; } .ui.ui.ui.ui.inverted.table tr[class*="purple colored"], .ui.ui.inverted.table th[class*="purple colored"], .ui.ui.inverted.table td[class*="purple colored"], .ui.ui.ui.ui.inverted.table tr.purple:not(.marked), .ui.ui.inverted.table th.purple:not(.marked), .ui.ui.inverted.table td.purple:not(.marked) { background: #a333c8; color: #fff; } .ui.inverted.table > thead > tr[class*="purple colored"] > th, .ui.inverted.table > tfoot > tr[class*="purple colored"] > th, .ui.inverted.table > tfoot > tr[class*="purple colored"] > td, .ui.inverted.table > thead > tr.purple:not(.marked) > th, .ui.inverted.table > tfoot > tr.purple:not(.marked) > th, .ui.inverted.table > tfoot > tr.purple:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="purple colored"]:hover, .ui.table tr td.selectable[class*="purple colored"]:hover, .ui.selectable.table tr:hover td[class*="purple colored"], .ui.ui.selectable.table tr.purple:not(.marked):hover, .ui.table tr td.selectable.purple:not(.marked):hover, .ui.selectable.table tr:hover td.purple:not(.marked) { background: #f5d9ff; color: #a333c8; } .ui.ui.inverted.selectable.table tr[class*="purple colored"]:hover, .ui.inverted.table tr td.selectable[class*="purple colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="purple colored"], .ui.ui.inverted.selectable.table tr.purple:not(.marked):hover, .ui.inverted.table tr td.selectable.purple:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.purple:not(.marked) { background: #cf40ff; color: #fff; } .ui.table td[class*="purple marked"].left, .ui.table tr[class*="purple marked"].left { box-shadow: 0.2em 0 0 0 #a333c8 inset; } .ui.table td[class*="purple marked"].right, .ui.table tr[class*="purple marked"].right { box-shadow: -0.2em 0 0 0 #a333c8 inset; } .ui.inverted.table td[class*="purple marked"].left, .ui.inverted.table tr[class*="purple marked"].left { box-shadow: 0.2em 0 0 0 #dc73ff inset; } .ui.inverted.table td[class*="purple marked"].right, .ui.inverted.table tr[class*="purple marked"].right { box-shadow: -0.2em 0 0 0 #dc73ff inset; } .ui.pink.table { border-top: 0.2em solid #e03997; } .ui.inverted.pink.table { background: #e03997; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.pink, .ui.scrolling.table > tfoot.pink { background: #ffe8f9; color: #ffe8f9; } .ui.scrolling.table > thead.pink > tr > th, .ui.scrolling.table > tfoot.pink > tr > th, .ui.scrolling.table > thead.pink > tr > td, .ui.scrolling.table > tfoot.pink > tr > td { background: inherit; color: #e03997; } .ui.inverted.scrolling.table > thead.pink, .ui.inverted.scrolling.table > tfoot.pink { background: #e03997; color: #e03997; } .ui.inverted.scrolling.table > thead.pink > tr > th, .ui.inverted.scrolling.table > tfoot.pink > tr > th, .ui.inverted.scrolling.table > thead.pink > tr > td, .ui.inverted.scrolling.table > tfoot.pink > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="pink colored"], .ui.ui.table th[class*="pink colored"], .ui.ui.table td[class*="pink colored"], .ui.ui.ui.ui.table tr.pink:not(.marked), .ui.ui.table th.pink:not(.marked), .ui.ui.table td.pink:not(.marked) { background: #ffe8f9; color: #e03997; } .ui.table > thead > tr[class*="pink colored"] > th, .ui.table > tfoot > tr[class*="pink colored"] > th, .ui.table > tfoot > tr[class*="pink colored"] > td, .ui.table > thead > tr.pink:not(.marked) > th, .ui.table > tfoot > tr.pink:not(.marked) > th, .ui.table > tfoot > tr.pink:not(.marked) > td { background: inherit; color: #e03997; } .ui.ui.ui.ui.inverted.table tr[class*="pink colored"], .ui.ui.inverted.table th[class*="pink colored"], .ui.ui.inverted.table td[class*="pink colored"], .ui.ui.ui.ui.inverted.table tr.pink:not(.marked), .ui.ui.inverted.table th.pink:not(.marked), .ui.ui.inverted.table td.pink:not(.marked) { background: #e03997; color: #fff; } .ui.inverted.table > thead > tr[class*="pink colored"] > th, .ui.inverted.table > tfoot > tr[class*="pink colored"] > th, .ui.inverted.table > tfoot > tr[class*="pink colored"] > td, .ui.inverted.table > thead > tr.pink:not(.marked) > th, .ui.inverted.table > tfoot > tr.pink:not(.marked) > th, .ui.inverted.table > tfoot > tr.pink:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="pink colored"]:hover, .ui.table tr td.selectable[class*="pink colored"]:hover, .ui.selectable.table tr:hover td[class*="pink colored"], .ui.ui.selectable.table tr.pink:not(.marked):hover, .ui.table tr td.selectable.pink:not(.marked):hover, .ui.selectable.table tr:hover td.pink:not(.marked) { background: #ffdef6; color: #e03997; } .ui.ui.inverted.selectable.table tr[class*="pink colored"]:hover, .ui.inverted.table tr td.selectable[class*="pink colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="pink colored"], .ui.ui.inverted.selectable.table tr.pink:not(.marked):hover, .ui.inverted.table tr td.selectable.pink:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.pink:not(.marked) { background: #ff5bd1; color: #fff; } .ui.table td[class*="pink marked"].left, .ui.table tr[class*="pink marked"].left { box-shadow: 0.2em 0 0 0 #e03997 inset; } .ui.table td[class*="pink marked"].right, .ui.table tr[class*="pink marked"].right { box-shadow: -0.2em 0 0 0 #e03997 inset; } .ui.inverted.table td[class*="pink marked"].left, .ui.inverted.table tr[class*="pink marked"].left { box-shadow: 0.2em 0 0 0 #ff8edf inset; } .ui.inverted.table td[class*="pink marked"].right, .ui.inverted.table tr[class*="pink marked"].right { box-shadow: -0.2em 0 0 0 #ff8edf inset; } .ui.brown.table { border-top: 0.2em solid #a5673f; } .ui.inverted.brown.table { background: #a5673f; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.brown, .ui.scrolling.table > tfoot.brown { background: #f7e5d2; color: #f7e5d2; } .ui.scrolling.table > thead.brown > tr > th, .ui.scrolling.table > tfoot.brown > tr > th, .ui.scrolling.table > thead.brown > tr > td, .ui.scrolling.table > tfoot.brown > tr > td { background: inherit; color: #a5673f; } .ui.inverted.scrolling.table > thead.brown, .ui.inverted.scrolling.table > tfoot.brown { background: #a5673f; color: #a5673f; } .ui.inverted.scrolling.table > thead.brown > tr > th, .ui.inverted.scrolling.table > tfoot.brown > tr > th, .ui.inverted.scrolling.table > thead.brown > tr > td, .ui.inverted.scrolling.table > tfoot.brown > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="brown colored"], .ui.ui.table th[class*="brown colored"], .ui.ui.table td[class*="brown colored"], .ui.ui.ui.ui.table tr.brown:not(.marked), .ui.ui.table th.brown:not(.marked), .ui.ui.table td.brown:not(.marked) { background: #f7e5d2; color: #a5673f; } .ui.table > thead > tr[class*="brown colored"] > th, .ui.table > tfoot > tr[class*="brown colored"] > th, .ui.table > tfoot > tr[class*="brown colored"] > td, .ui.table > thead > tr.brown:not(.marked) > th, .ui.table > tfoot > tr.brown:not(.marked) > th, .ui.table > tfoot > tr.brown:not(.marked) > td { background: inherit; color: #a5673f; } .ui.ui.ui.ui.inverted.table tr[class*="brown colored"], .ui.ui.inverted.table th[class*="brown colored"], .ui.ui.inverted.table td[class*="brown colored"], .ui.ui.ui.ui.inverted.table tr.brown:not(.marked), .ui.ui.inverted.table th.brown:not(.marked), .ui.ui.inverted.table td.brown:not(.marked) { background: #a5673f; color: #fff; } .ui.inverted.table > thead > tr[class*="brown colored"] > th, .ui.inverted.table > tfoot > tr[class*="brown colored"] > th, .ui.inverted.table > tfoot > tr[class*="brown colored"] > td, .ui.inverted.table > thead > tr.brown:not(.marked) > th, .ui.inverted.table > tfoot > tr.brown:not(.marked) > th, .ui.inverted.table > tfoot > tr.brown:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="brown colored"]:hover, .ui.table tr td.selectable[class*="brown colored"]:hover, .ui.selectable.table tr:hover td[class*="brown colored"], .ui.ui.selectable.table tr.brown:not(.marked):hover, .ui.table tr td.selectable.brown:not(.marked):hover, .ui.selectable.table tr:hover td.brown:not(.marked) { background: #efe0cf; color: #a5673f; } .ui.ui.inverted.selectable.table tr[class*="brown colored"]:hover, .ui.inverted.table tr td.selectable[class*="brown colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="brown colored"], .ui.ui.inverted.selectable.table tr.brown:not(.marked):hover, .ui.inverted.table tr td.selectable.brown:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.brown:not(.marked) { background: #b0620f; color: #fff; } .ui.table td[class*="brown marked"].left, .ui.table tr[class*="brown marked"].left { box-shadow: 0.2em 0 0 0 #a5673f inset; } .ui.table td[class*="brown marked"].right, .ui.table tr[class*="brown marked"].right { box-shadow: -0.2em 0 0 0 #a5673f inset; } .ui.inverted.table td[class*="brown marked"].left, .ui.inverted.table tr[class*="brown marked"].left { box-shadow: 0.2em 0 0 0 #d67c1c inset; } .ui.inverted.table td[class*="brown marked"].right, .ui.inverted.table tr[class*="brown marked"].right { box-shadow: -0.2em 0 0 0 #d67c1c inset; } .ui.grey.table { border-top: 0.2em solid #767676; } .ui.inverted.grey.table { background: #767676; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.grey, .ui.scrolling.table > tfoot.grey { background: #dcddde; color: #dcddde; } .ui.scrolling.table > thead.grey > tr > th, .ui.scrolling.table > tfoot.grey > tr > th, .ui.scrolling.table > thead.grey > tr > td, .ui.scrolling.table > tfoot.grey > tr > td { background: inherit; color: #767676; } .ui.inverted.scrolling.table > thead.grey, .ui.inverted.scrolling.table > tfoot.grey { background: #767676; color: #767676; } .ui.inverted.scrolling.table > thead.grey > tr > th, .ui.inverted.scrolling.table > tfoot.grey > tr > th, .ui.inverted.scrolling.table > thead.grey > tr > td, .ui.inverted.scrolling.table > tfoot.grey > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="grey colored"], .ui.ui.table th[class*="grey colored"], .ui.ui.table td[class*="grey colored"], .ui.ui.ui.ui.table tr.grey:not(.marked), .ui.ui.table th.grey:not(.marked), .ui.ui.table td.grey:not(.marked) { background: #dcddde; color: #767676; } .ui.table > thead > tr[class*="grey colored"] > th, .ui.table > tfoot > tr[class*="grey colored"] > th, .ui.table > tfoot > tr[class*="grey colored"] > td, .ui.table > thead > tr.grey:not(.marked) > th, .ui.table > tfoot > tr.grey:not(.marked) > th, .ui.table > tfoot > tr.grey:not(.marked) > td { background: inherit; color: #767676; } .ui.ui.ui.ui.inverted.table tr[class*="grey colored"], .ui.ui.inverted.table th[class*="grey colored"], .ui.ui.inverted.table td[class*="grey colored"], .ui.ui.ui.ui.inverted.table tr.grey:not(.marked), .ui.ui.inverted.table th.grey:not(.marked), .ui.ui.inverted.table td.grey:not(.marked) { background: #767676; color: #fff; } .ui.inverted.table > thead > tr[class*="grey colored"] > th, .ui.inverted.table > tfoot > tr[class*="grey colored"] > th, .ui.inverted.table > tfoot > tr[class*="grey colored"] > td, .ui.inverted.table > thead > tr.grey:not(.marked) > th, .ui.inverted.table > tfoot > tr.grey:not(.marked) > th, .ui.inverted.table > tfoot > tr.grey:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="grey colored"]:hover, .ui.table tr td.selectable[class*="grey colored"]:hover, .ui.selectable.table tr:hover td[class*="grey colored"], .ui.ui.selectable.table tr.grey:not(.marked):hover, .ui.table tr td.selectable.grey:not(.marked):hover, .ui.selectable.table tr:hover td.grey:not(.marked) { background: #c2c4c5; color: #767676; } .ui.ui.inverted.selectable.table tr[class*="grey colored"]:hover, .ui.inverted.table tr td.selectable[class*="grey colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="grey colored"], .ui.ui.inverted.selectable.table tr.grey:not(.marked):hover, .ui.inverted.table tr td.selectable.grey:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.grey:not(.marked) { background: #c2c4c5; color: #fff; } .ui.table td[class*="grey marked"].left, .ui.table tr[class*="grey marked"].left { box-shadow: 0.2em 0 0 0 #767676 inset; } .ui.table td[class*="grey marked"].right, .ui.table tr[class*="grey marked"].right { box-shadow: -0.2em 0 0 0 #767676 inset; } .ui.inverted.table td[class*="grey marked"].left, .ui.inverted.table tr[class*="grey marked"].left { box-shadow: 0.2em 0 0 0 #dcddde inset; } .ui.inverted.table td[class*="grey marked"].right, .ui.inverted.table tr[class*="grey marked"].right { box-shadow: -0.2em 0 0 0 #dcddde inset; } .ui.black.table { border-top: 0.2em solid #1b1c1d; } .ui.inverted.black.table { background: #1b1c1d; color: #fff; } /* Same color for background and color to camouflage the scrollbar */ .ui.scrolling.table > thead.black, .ui.scrolling.table > tfoot.black { background: #545454; color: #545454; } .ui.scrolling.table > thead.black > tr > th, .ui.scrolling.table > tfoot.black > tr > th, .ui.scrolling.table > thead.black > tr > td, .ui.scrolling.table > tfoot.black > tr > td { background: inherit; color: #fff; } .ui.inverted.scrolling.table > thead.black, .ui.inverted.scrolling.table > tfoot.black { background: #1b1c1d; color: #1b1c1d; } .ui.inverted.scrolling.table > thead.black > tr > th, .ui.inverted.scrolling.table > tfoot.black > tr > th, .ui.inverted.scrolling.table > thead.black > tr > td, .ui.inverted.scrolling.table > tfoot.black > tr > td { background: inherit; color: #fff; } .ui.ui.ui.ui.table tr[class*="black colored"], .ui.ui.table th[class*="black colored"], .ui.ui.table td[class*="black colored"], .ui.ui.ui.ui.table tr.black:not(.marked), .ui.ui.table th.black:not(.marked), .ui.ui.table td.black:not(.marked) { background: #545454; color: #fff; } .ui.table > thead > tr[class*="black colored"] > th, .ui.table > tfoot > tr[class*="black colored"] > th, .ui.table > tfoot > tr[class*="black colored"] > td, .ui.table > thead > tr.black:not(.marked) > th, .ui.table > tfoot > tr.black:not(.marked) > th, .ui.table > tfoot > tr.black:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.ui.ui.inverted.table tr[class*="black colored"], .ui.ui.inverted.table th[class*="black colored"], .ui.ui.inverted.table td[class*="black colored"], .ui.ui.ui.ui.inverted.table tr.black:not(.marked), .ui.ui.inverted.table th.black:not(.marked), .ui.ui.inverted.table td.black:not(.marked) { background: #1b1c1d; color: #fff; } .ui.inverted.table > thead > tr[class*="black colored"] > th, .ui.inverted.table > tfoot > tr[class*="black colored"] > th, .ui.inverted.table > tfoot > tr[class*="black colored"] > td, .ui.inverted.table > thead > tr.black:not(.marked) > th, .ui.inverted.table > tfoot > tr.black:not(.marked) > th, .ui.inverted.table > tfoot > tr.black:not(.marked) > td { background: inherit; color: #fff; } .ui.ui.selectable.table tr[class*="black colored"]:hover, .ui.table tr td.selectable[class*="black colored"]:hover, .ui.selectable.table tr:hover td[class*="black colored"], .ui.ui.selectable.table tr.black:not(.marked):hover, .ui.table tr td.selectable.black:not(.marked):hover, .ui.selectable.table tr:hover td.black:not(.marked) { background: #000000; color: #fff; } .ui.ui.inverted.selectable.table tr[class*="black colored"]:hover, .ui.inverted.table tr td.selectable[class*="black colored"]:hover, .ui.inverted.selectable.table tr:hover td[class*="black colored"], .ui.ui.inverted.selectable.table tr.black:not(.marked):hover, .ui.inverted.table tr td.selectable.black:not(.marked):hover, .ui.inverted.selectable.table tr:hover td.black:not(.marked) { background: #000000; color: #1b1c1d; } .ui.table td[class*="black marked"].left, .ui.table tr[class*="black marked"].left { box-shadow: 0.2em 0 0 0 #1b1c1d inset; } .ui.table td[class*="black marked"].right, .ui.table tr[class*="black marked"].right { box-shadow: -0.2em 0 0 0 #1b1c1d inset; } .ui.inverted.table td[class*="black marked"].left, .ui.inverted.table tr[class*="black marked"].left { box-shadow: 0.2em 0 0 0 #545454 inset; } .ui.inverted.table td[class*="black marked"].right, .ui.inverted.table tr[class*="black marked"].right { box-shadow: -0.2em 0 0 0 #545454 inset; } /* -------------- Column Count --------------- */ /* Grid Based */ .ui.one.column.table td { width: 100%; } .ui.two.column.table td { width: 50%; } .ui.three.column.table td { width: 33.33333333%; } .ui.four.column.table td { width: 25%; } .ui.five.column.table td { width: 20%; } .ui.six.column.table td { width: 16.66666667%; } .ui.seven.column.table td { width: 14.28571429%; } .ui.eight.column.table td { width: 12.5%; } .ui.nine.column.table td { width: 11.11111111%; } .ui.ten.column.table td { width: 10%; } .ui.eleven.column.table td { width: 9.09090909%; } .ui.twelve.column.table td { width: 8.33333333%; } .ui.thirteen.column.table td { width: 7.69230769%; } .ui.fourteen.column.table td { width: 7.14285714%; } .ui.fifteen.column.table td { width: 6.66666667%; } .ui.sixteen.column.table td { width: 6.25%; } /* Column Width */ .ui.table th.one.wide, .ui.table td.one.wide { width: 6.25%; } .ui.table th.two.wide, .ui.table td.two.wide { width: 12.5%; } .ui.table th.three.wide, .ui.table td.three.wide { width: 18.75%; } .ui.table th.four.wide, .ui.table td.four.wide { width: 25%; } .ui.table th.five.wide, .ui.table td.five.wide { width: 31.25%; } .ui.table th.six.wide, .ui.table td.six.wide { width: 37.5%; } .ui.table th.seven.wide, .ui.table td.seven.wide { width: 43.75%; } .ui.table th.eight.wide, .ui.table td.eight.wide { width: 50%; } .ui.table th.nine.wide, .ui.table td.nine.wide { width: 56.25%; } .ui.table th.ten.wide, .ui.table td.ten.wide { width: 62.5%; } .ui.table th.eleven.wide, .ui.table td.eleven.wide { width: 68.75%; } .ui.table th.twelve.wide, .ui.table td.twelve.wide { width: 75%; } .ui.table th.thirteen.wide, .ui.table td.thirteen.wide { width: 81.25%; } .ui.table th.fourteen.wide, .ui.table td.fourteen.wide { width: 87.5%; } .ui.table th.fifteen.wide, .ui.table td.fifteen.wide { width: 93.75%; } .ui.table th.sixteen.wide, .ui.table td.sixteen.wide { width: 100%; } /* -------------- Sortable --------------- */ .ui.sortable.table > thead > tr > th { cursor: pointer; white-space: nowrap; color: rgba(0, 0, 0, 0.87); } .ui.celled.sortable.table > thead > tr > th:not(:first-child) { border-left: 1px solid rgba(34, 36, 38, 0.15); } .ui.sortable.table thead th.sorted, .ui.sortable.table thead th.sorted:hover { -webkit-user-select: none; -ms-user-select: none; user-select: none; } .ui.sortable.table > thead > tr > th::after { display: none; font-style: normal; font-weight: normal; text-decoration: inherit; content: ""; height: 1em; width: auto; opacity: 0.8; margin: 0 0 0 0.5em; font-family: "Icons"; } .ui.sortable.table thead th.ascending::after { content: "\f0d8"; } .ui.sortable.table thead th.descending::after { content: "\f0d7"; } /* Hover */ .ui.sortable.table th.disabled:hover { cursor: auto; color: rgba(40, 40, 40, 0.3); } .ui.sortable.table > thead > tr > th:hover { color: rgba(0, 0, 0, 0.8); } .ui.sortable.table:not(.basic) > thead > tr > th:hover { background: rgba(0, 0, 0, 0.05); } /* Sorted */ .ui.sortable.table thead th.sorted { color: rgba(0, 0, 0, 0.95); } .ui.sortable.table:not(.basic) thead th.sorted { background: rgba(0, 0, 0, 0.05); } .ui.sortable.table thead th.sorted::after { display: inline-block; } /* Sorted Hover */ .ui.sortable.table thead th.sorted:hover { color: rgba(0, 0, 0, 0.95); } .ui.sortable.table:not(.basic) thead th.sorted:hover { background: rgba(0, 0, 0, 0.05); } /* Inverted */ .ui.inverted.sortable.table thead th.sorted { color: #ffffff; } .ui.inverted.sortable.table:not(.basic) thead th.sorted { background: rgba(255, 255, 255, 0.15) linear-gradient(transparent, rgba(0, 0, 0, 0.05)); } .ui.inverted.sortable.table > thead > tr > th:hover { color: #ffffff; } .ui.inverted.sortable.table:not(.basic) > thead > tr > th:hover { background: rgba(255, 255, 255, 0.08) linear-gradient(transparent, rgba(0, 0, 0, 0.05)); } .ui.inverted.sortable.table:not(.basic) > thead > tr > th { border-left-color: transparent; border-right-color: transparent; } /* -------------- Inverted --------------- */ /* Text Color */ .ui.inverted.table { background: #333; color: rgba(255, 255, 255, 0.9); border: none; } .ui.ui.inverted.table > thead > tr > th, .ui.ui.inverted.table > tbody > tr > th, .ui.ui.inverted.table > tr > th { background-color: rgba(0, 0, 0, 0.15); border-color: rgba(255, 255, 255, 0.1); color: rgba(255, 255, 255, 0.9); } .ui.ui.inverted.table > tfoot > tr > th, .ui.ui.inverted.table > tfoot > tr > td { background-color: rgba(0, 0, 0, 0.15); border-color: rgba(255, 255, 255, 0.1); color: rgba(255, 255, 255, 0.9); } .ui.inverted.table > tbody > tr > td, .ui.inverted.table > tfoot > tr > td, .ui.inverted.table > tr > td { border-color: rgba(255, 255, 255, 0.1); } .ui.ui.ui.inverted.table tr.disabled td, .ui.ui.ui.inverted.table tr td.disabled, .ui.inverted.table tr.disabled:hover td, .ui.inverted.table tr:hover td.disabled { pointer-events: none; color: rgba(225, 225, 225, 0.3); } .ui.ui.ui.inverted.table tr td.disabled:not([class="disabled"]), .ui.inverted.table tr.disabled:not([class="disabled"]) td, .ui.inverted.table tr.disabled td[class]:not(.disabled), .ui.inverted.table tr:hover td.disabled:not([class="disabled"]) { color: rgba(40, 40, 40, 0.3); } /* Definition */ .ui.inverted.definition.table > tfoot:not(.full-width) > tr > th:first-child, .ui.inverted.definition.table > thead:not(.full-width) > tr > th:first-child { background: #fff; } .ui.inverted.definition.table > tbody > tr > td:first-child, .ui.inverted.definition.table > tfoot > tr > td:first-child, .ui.inverted.definition.table > tr > td:first-child { background: rgba(255, 255, 255, 0.02); color: #ffffff; } /* -------------- Collapsing --------------- */ .ui.collapsing.table { width: auto; } /* -------------- Basic --------------- */ .ui.basic.table { background: transparent; border: 1px solid rgba(34, 36, 38, 0.15); box-shadow: none; } .ui.basic.table > thead, .ui.basic.table > tfoot { box-shadow: none; } .ui.basic.table > thead > tr > th, .ui.basic.table > tbody > tr > th, .ui.basic.table > tfoot > tr > th, .ui.basic.table > tr > th { background: transparent; border-left: none; } .ui.basic.table > tbody > tr { border-bottom: 1px solid rgba(0, 0, 0, 0.1); } .ui.basic.table > tbody > tr > td, .ui.basic.table > tfoot > tr > td, .ui.basic.table > tr > td { background: transparent; } .ui.basic.striped.table > tbody > tr:nth-child(2n) { background-color: rgba(0, 0, 0, 0.05); } /* Very Basic */ .ui[class*="very basic"].table { border: none; } .ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > th, .ui[class*="very basic"].table:not(.sortable):not(.striped) > thead > tr > th, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > th, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tfoot > tr > th, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > td, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > td { padding: ""; } .ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > th:first-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > thead > tr > th:first-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > th:first-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tfoot > tr > th:first-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > td:first-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > td:first-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tfoot > tr > td:first-child { padding-left: 0; } .ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > th:last-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > thead > tr > th:last-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > th:last-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tfoot > tr > th:last-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > td:last-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > td:last-child, .ui[class*="very basic"].table:not(.sortable):not(.striped) > tfoot > tr > td:last-child { padding-right: 0; } .ui[class*="very basic"].table:not(.sortable):not(.striped) > thead > tr:first-child > th { padding-top: 0; } /* -------------- Celled --------------- */ .ui.celled.table > tr > th, .ui.celled.table > thead > tr > th, .ui.celled.table > tbody > tr > th, .ui.celled.table > tfoot > tr > th, .ui.celled.table > tr > td, .ui.celled.table > tbody > tr > td, .ui.celled.table > tfoot > tr > td { border-left: 1px solid rgba(34, 36, 38, 0.1); } .ui.inverted.celled.table > tbody > tr > td, .ui.inverted.celled.table > tr > td { border-left: 1px solid rgba(255, 255, 255, 0.1); } .ui.celled.table > tr > th:first-child, .ui.celled.table > thead > tr > th:first-child, .ui.celled.table > tbody > tr > th:first-child, .ui.celled.table > tfoot > tr > th:first-child, .ui.celled.table > tr > td:first-child, .ui.celled.table > tbody > tr > td:first-child, .ui.celled.table > tfoot > tr > td:first-child { border-left: none; } /* -------------- Padded --------------- */ .ui.padded.table > tr > th, .ui.padded.table > thead > tr > th, .ui.padded.table > tbody > tr > th, .ui.padded.table > tfoot > tr > th { padding-left: 1em; padding-right: 1em; } .ui.padded.table > tr > th, .ui.padded.table > thead > tr > th, .ui.padded.table > tbody > tr > th, .ui.padded.table > tfoot > tr > th, .ui.padded.table > tr > td, .ui.padded.table > tbody > tr > td, .ui.padded.table > tfoot > tr > td { padding: 1em 1em; } /* Very */ .ui[class*="very padded"].table > tr > th, .ui[class*="very padded"].table > thead > tr > th, .ui[class*="very padded"].table > tbody > tr > th, .ui[class*="very padded"].table > tfoot > tr > th { padding-left: 1.5em; padding-right: 1.5em; } .ui[class*="very padded"].table > tr > td, .ui[class*="very padded"].table > tbody > tr > td, .ui[class*="very padded"].table > tfoot > tr > td { padding: 1.5em 1.5em; } /* -------------- Compact --------------- */ .ui.compact.table > tr > th, .ui.compact.table > thead > tr > th, .ui.compact.table > tbody > tr > th, .ui.compact.table > tfoot > tr > th { padding-left: 0.7em; padding-right: 0.7em; } .ui.compact.table > tr > td, .ui.compact.table > tbody > tr > td, .ui.compact.table > tfoot > tr > td { padding: 0.5em 0.7em; } /* Very */ .ui[class*="very compact"].table > tr > th, .ui[class*="very compact"].table > thead > tr > th, .ui[class*="very compact"].table > tbody > tr > th, .ui[class*="very compact"].table > tfoot > tr > th { padding-left: 0.6em; padding-right: 0.6em; } .ui[class*="very compact"].table > tr > td, .ui[class*="very compact"].table > tbody > tr > td, .ui[class*="very compact"].table > tfoot > tr > td { padding: 0.4em 0.6em; } /* -------------- Stuck --------------- */ .ui.stuck.table:not(.inverted) { background: #fff; } .ui.stuck.table:not(.inverted) > thead > tr { background: #f9fafb; } .ui.stuck.table:not(.inverted) > tbody > tr { background: #fff; } .ui.stuck.table:not(.inverted) > tfoot > tr { background: #f9fafb; } .ui.stuck.table:not(.inverted).basic > thead > tr, .ui.stuck.table:not(.inverted).basic > tfoot > tr { background: #fff; } .ui.inverted.stuck.table > thead > tr { background: #252525; } .ui.inverted.stuck.table > tbody > tr { background: #333; } .ui.inverted.stuck.table > tfoot > tr { background: #252525; } .ui.inverted.stuck.table.basic > thead > tr, .ui.inverted.stuck.table.basic > tfoot > tr { background: #333; } .ui.head.stuck.table > thead, .ui.foot.stuck.table > tfoot { position: sticky; z-index: 800; } .ui.head.stuck.table { border-top: 0; } .ui.head.stuck.table > thead { top: 0; bottom: auto; } .ui.head.stuck.table > thead > tr:first-child > th { border-top: 1px solid rgba(34, 36, 38, 0.1); } .ui.head.stuck.table.inverted > thead > tr:first-child > th { border-top: 1px solid rgba(255, 255, 255, 0.1); } .ui.foot.stuck.table { border-bottom: 0; } .ui.foot.stuck.table > tfoot { top: auto; bottom: 0; } .ui.foot.stuck.table > tfoot > tr:last-child > td, .ui.foot.stuck.table > tfoot > tr:last-child > th { border-bottom: 1px solid rgba(34, 36, 38, 0.1); } .ui.foot.stuck.table.inverted > tfoot > tr:first-child > td, .ui.foot.stuck.table.inverted > tfoot > tr:first-child > th { border-top: 1px solid rgba(255, 255, 255, 0.1); } .ui.first.stuck.table { border-left: 0; } .ui.first.stuck.table th:first-child, .ui.first.stuck.table td:first-child { position: sticky; left: 0; border-left: 1px solid rgba(34, 36, 38, 0.1); background: inherit; } .ui.first.stuck.table.inverted th:first-child, .ui.first.stuck.table.inverted td:first-child { border-left: 1px solid rgba(255, 255, 255, 0.1); } .ui.last.stuck.table { border-right: 0; } .ui.last.stuck.table th:last-child, .ui.last.stuck.table td:last-child { position: sticky; right: 0; border-right: 1px solid rgba(34, 36, 38, 0.1); background: inherit; } .ui.last.stuck.table.inverted th:last-child, .ui.last.stuck.table.inverted td:last-child { border-right: 1px solid rgba(255, 255, 255, 0.1); } .ui.celled.first.stuck.table th:first-child, .ui.celled.first.stuck.table td:first-child { border-right: 1px solid rgba(34, 36, 38, 0.1); } .ui.celled.last.stuck.table th:last-child, .ui.celled.last.stuck.table td:last-child { border-left: 1px solid rgba(34, 36, 38, 0.1); } .ui.inverted.celled.first.stuck.table th:first-child, .ui.inverted.celled.first.stuck.table td:first-child { border-right: 1px solid rgba(255, 255, 255, 0.1); } .ui.inverted.celled.last.stuck.table th:last-child, .ui.inverted.celled.last.stuck.table td:last-child { border-left: 1px solid rgba(255, 255, 255, 0.1); } /* -------------- Sizes --------------- */ /* Standard */ .ui.table { font-size: 1em; } .ui.mini.table { font-size: 0.78571429rem; } .ui.tiny.table { font-size: 0.85714286rem; } .ui.small.table { font-size: 0.9em; } .ui.large.table { font-size: 1.1em; } .ui.big.table { font-size: 1.28571429rem; } .ui.huge.table { font-size: 1.42857143rem; } .ui.massive.table { font-size: 1.71428571rem; } /******************************* Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/text.css ================================================ /*! * # Fomantic-UI 2.9.4 - Text * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Text *******************************/ span.ui.text { line-height: 1; } span.ui.primary.text { color: #2185d0; } span.ui.inverted.primary.text { color: #54c8ff; } span.ui.secondary.text { color: #1b1c1d; } span.ui.inverted.secondary.text { color: #545454; } span.ui.red.text { color: #db2828; } span.ui.inverted.red.text { color: #ff695e; } span.ui.orange.text { color: #f2711c; } span.ui.inverted.orange.text { color: #ff851b; } span.ui.yellow.text { color: #fbbd08; } span.ui.inverted.yellow.text { color: #ffe21f; } span.ui.olive.text { color: #b5cc18; } span.ui.inverted.olive.text { color: #d9e778; } span.ui.green.text { color: #21ba45; } span.ui.inverted.green.text { color: #2ecc40; } span.ui.teal.text { color: #00b5ad; } span.ui.inverted.teal.text { color: #6dffff; } span.ui.blue.text { color: #2185d0; } span.ui.inverted.blue.text { color: #54c8ff; } span.ui.violet.text { color: #6435c9; } span.ui.inverted.violet.text { color: #a291fb; } span.ui.purple.text { color: #a333c8; } span.ui.inverted.purple.text { color: #dc73ff; } span.ui.pink.text { color: #e03997; } span.ui.inverted.pink.text { color: #ff8edf; } span.ui.brown.text { color: #a5673f; } span.ui.inverted.brown.text { color: #d67c1c; } span.ui.grey.text { color: #767676; } span.ui.inverted.grey.text { color: #dcddde; } span.ui.black.text { color: #1b1c1d; } span.ui.inverted.black.text { color: #545454; } span.ui.error.text { color: #db2828; } span.ui.info.text { color: #31ccec; } span.ui.success.text { color: #21ba45; } span.ui.warning.text { color: #f2c037; } span.ui.disabled.text { opacity: 0.45; } /* Sizes */ span.ui.medium.text { font-size: 1em; } span.ui.mini.text { font-size: 0.4em; } span.ui.tiny.text { font-size: 0.5em; } span.ui.small.text { font-size: 0.75em; } span.ui.large.text { font-size: 1.5em; } span.ui.big.text { font-size: 2em; } span.ui.huge.text { font-size: 4em; } span.ui.massive.text { font-size: 8em; } /******************************* Theme Overrides *******************************/ /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/toast.css ================================================ /*! * # Fomantic-UI 2.9.4 - Toast * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Toast container *******************************/ .ui.toast-container { position: fixed; z-index: 9999; } .ui.toast-container.absolute { position: absolute; } .ui.toast-container.ui.attached { width: 100%; left: 0; } .ui.toast-container.ui.attached .vertical.attached { border-radius: 0; } .ui.toast-container.ui.attached.ui.ui .attached.actions .button { border-radius: 0; } .ui.toast-container.ui.attached .toast-box { margin: 0; width: 100%; border-radius: 0; } .ui.toast-container.ui.attached .toast-box > .ui.toast, .ui.toast-container.ui.attached .toast-box > .ui.message { margin-left: 0; } .ui.toast-container.ui.attached .toast-box.floating, .ui.toast-container.ui.attached .toast-box.hoverfloating:hover { border: none; } .ui.toast-container.ui.attached .toast-box > .vertical > .content { flex: 1; } .ui.toast-container.ui.attached .toast-box > * { width: 100%; border-radius: 0; } .ui.toast-container.ui.attached .toast-box > * > .vertical:not(.actions) { flex: 1; } .ui.toast-container.ui.attached .toast-box > .attached.actions { margin-right: 1px; } .ui.toast-container.ui.attached.top { top: 0; } .ui.toast-container.ui.attached.bottom { bottom: 0; } .ui.toast-container.top.right { top: 0.85714286em; right: 0.85714286em; margin-left: 0.85714286em; } .ui.toast-container.top.left { top: 0.85714286em; left: 0.85714286em; margin-right: 0.85714286em; } .ui.toast-container.top.center { left: 50%; transform: translate(-50%, 0); top: 0.85714286em; } .ui.toast-container.bottom.right { bottom: 0.85714286em; right: 0.85714286em; margin-left: 0.85714286em; } .ui.toast-container.bottom.left { bottom: 0.85714286em; left: 0.85714286em; margin-right: 0.85714286em; } .ui.toast-container.bottom.center { left: 50%; transform: translate(-50%, 0); bottom: 0.85714286em; } .ui.toast-container.centered { transform: translate(-50%, -50%); top: 50%; left: 50%; } .ui.toast-container .visible.toast-box, .ui.toast-container .animating.toast-box, .ui.toast-container .toast-box { display: table !important; } .ui.toast-container.horizontal { display: flex; flex-direction: row; } .ui.toast-container.horizontal .toast-box { margin-right: 0.5em; } .ui.toast-container .toast-box { margin-bottom: 0.5em; border-radius: 0.28571429rem; cursor: default; will-change: transform, opacity; } .ui.toast-container .toast-box:hover { opacity: 1; } .ui.toast-container .toast-box:not(.unclickable):hover { cursor: pointer; } .ui.toast-container .toast-box.floating, .ui.toast-container .toast-box.hoverfloating:hover { box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); border: 1px solid rgba(34, 36, 38, 0.12); } .ui.toast-container .toast-box.inverted.floating, .ui.toast-container .toast-box.inverted.hoverfloating:hover { box-shadow: 0 2px 4px 0 rgba(225, 225, 225, 0.1), 0 2px 10px 0 rgba(225, 225, 225, 0.5); border: 1px solid rgba(225, 225, 225, 0.5); } .ui.toast-container .toast-box.compact, .ui.toast-container .toast-box > .compact { width: 350px; } .ui.toast-container .toast-box > .ui.toast, .ui.toast-container .toast-box > .ui.message { margin: 0 -1px -0.01em; position: relative; } .ui.toast-container .toast-box > .attached.progress { z-index: 1; } .ui.toast-container .toast-box > .attached.progress.bottom { margin: -0.2em -1px -0.01em; } .ui.toast-container .toast-box > .attached.progress.top { margin: -0.01em -1px -0.2em; } .ui.toast-container .toast-box > .attached.progress .bar { min-width: 0; } .ui.toast-container .toast-box > .attached.progress.info .bar.bar.bar { background: #12a1bf; } .ui.toast-container .toast-box > .attached.progress.warning .bar.bar.bar { background: #cf9b0d; } .ui.toast-container .toast-box > .attached.progress.success .bar.bar.bar { background: #15792d; } .ui.toast-container .toast-box > .attached.progress.error .bar.bar.bar { background: #9c1a1a; } .ui.toast-container .toast-box > .attached.progress.neutral .bar.bar.bar { background: #d9d9d9; } .ui.toast-container .toast-box > .ui.message > .close.icon { top: 0.3em; right: 0.3em; } .ui.toast-container .toast-box > .ui.message > .actions:last-child { margin-bottom: -1em; } .ui.toast-container .toast-box > .ui.message.icon { align-items: inherit; } .ui.toast-container .toast-box > .ui.message.icon > :not(.icon):not(.actions) { padding-left: 5rem; } .ui.toast-container .toast-box > .ui.message.icon > i.icon:not(.close) { display: inline-block; position: absolute; width: 4rem; top: 50%; transform: translateY(-50%); } .ui.toast-container .toast-box > .ui.message.icon:not(.vertical).actions > i.icon:not(.close) { top: calc(50% - 1.2em); transform: none; } .ui.toast-container .toast-box > .ui.message.icon:not(.vertical).icon.icon.icon { display: block; } .ui.toast-container .toast-box .ui.toast > .close.icon { cursor: pointer; margin: 0; opacity: 0.7; transition: opacity 0.1s ease; } .ui.toast-container .toast-box .ui.toast > .close.icon:hover { opacity: 1; } .ui.toast-container .toast-box .ui.toast.vertical > .close.icon { margin-top: -0.3em; margin-right: -0.3em; } .ui.toast-container .toast-box .ui.toast:not(.vertical) > .close.icon { position: absolute; top: 0.3em; } .ui.toast-container .toast-box .ui.toast:not(.vertical) > .close.icon:not(.left) { right: 0.3em; } .ui.toast-container .toast-box .ui.toast:not(.vertical) > .close.icon.left { margin-left: -0.3em; } .ui.toast-container .toast-box .ui.card { margin: 0; } .ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom { border-top-left-radius: 0; border-top-right-radius: 0; } .ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom.horizontal > .image > img { border-top-left-radius: 0; } .ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom.horizontal > .image:last-child > img { border-top-right-radius: 0; } .ui.toast-container .toast-box .ui.card.attached:not(.vertical).top { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .ui.toast-container .toast-box .ui.card.attached:not(.vertical).top.horizontal > .image > img { border-bottom-left-radius: 0; } .ui.toast-container .toast-box .ui.card.attached:not(.vertical).top.horizontal > .image:last-child > img { border-bottom-right-radius: 0; } .ui.toast-container .toast-box .ui.card.horizontal.actions > .image > img { border-bottom-left-radius: 0; } .ui.toast-container .toast-box .ui.card.horizontal.actions > .image:last-child > img { border-bottom-right-radius: 0; } .ui.toast-container .toast-box .progressing { animation-iteration-count: 1; animation-timing-function: linear; } .ui.toast-container .toast-box .progressing.up { animation-name: progressUp; } .ui.toast-container .toast-box .progressing.down { animation-name: progressDown; } .ui.toast-container .toast-box .progressing.wait { animation-name: progressWait; } .ui.toast-container .toast-box:hover .pausable.progressing { animation-play-state: paused; } .ui.toast-container .toast-box .ui.toast:not(.vertical) { display: block; } .ui.toast-container .toast-box :not(.comment):not(.card) .actions { margin: 0.5em -1em -1em -1em; } .ui.toast-container .toast-box :not(.comment) .actions { padding: 0.5em 0.5em 0.75em 0.5em; text-align: right; } .ui.toast-container .toast-box :not(.comment) .actions.attached:not(.vertical) { margin-right: 1px; } .ui.toast-container .toast-box :not(.comment) .actions:not(.basic):not(.attached) { background: rgba(255, 255, 255, 0.25); border-top: 1px solid rgba(0, 0, 0, 0.2); } .ui.toast-container .toast-box :not(.comment) .actions.left { text-align: left; } .ui.toast-container .toast-box .vertical.actions > .button, .ui.toast-container .toast-box > .vertical > .vertical.vertical, .ui.toast-container .toast-box > .vertical.vertical.vertical { display: flex; } .ui.toast-container .toast-box :not(.comment) .vertical.actions { flex-direction: column; } .ui.toast-container .toast-box :not(.comment) .vertical.actions > .button { justify-content: center; } .ui.toast-container .toast-box :not(.comment) .vertical.actions.attached > .button { align-items: center; } .ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached) { border-top: 0; margin-top: -0.75em; margin-bottom: -0.75em; margin-left: 1em; justify-content: space-around; } .ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached):not(.basic) { border-left: 1px solid rgba(0, 0, 0, 0.2); } .ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached) > .button:not(:last-child) { margin-bottom: 0.3em; } .ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached).top { justify-content: flex-start; } .ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached).bottom { justify-content: flex-end; } .ui.vertical.attached:not(.left).card > .image > img { border-top-right-radius: 0; } .ui.vertical.attached:not(.left).card.horizontal > .image:last-child > img { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ui.vertical.attached:not(.left).card, .ui.vertical.attached:not(.left).toast { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ui.vertical.attached:not(.left).actions { border-top-right-radius: 0.28571429rem; border-bottom-right-radius: 0.28571429rem; } .ui.vertical.attached:not(.left).actions .button:first-child, .ui.vertical.attached:not(.left).actions .button:last-child { border-top-left-radius: 0; border-bottom-left-radius: 0; } .ui.vertical.attached:not(.left).message { border-top-right-radius: 0; border-bottom-left-radius: 0.28571429rem; } .ui.vertical.attached.left.card > .image > img { border-top-left-radius: 0; } .ui.vertical.attached.left.card.horizontal > .image > img { border-top-left-radius: 0; border-bottom-left-radius: 0; } .ui.vertical.attached.left.card, .ui.vertical.attached.left.toast { border-top-left-radius: 0; border-bottom-left-radius: 0; } .ui.vertical.attached.left.actions { border-top-left-radius: 0.28571429rem; border-bottom-left-radius: 0.28571429rem; } .ui.vertical.attached.left.actions .button:first-child, .ui.vertical.attached.left.actions .button:last-child { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ui.vertical.attached.left.message.message.message { border-top-right-radius: 0.28571429rem; border-bottom-right-radius: 0.28571429rem; } .ui.attached:not(.vertical):not(.top).actions { border-bottom-left-radius: 0.28571429rem; border-bottom-right-radius: 0.28571429rem; } .ui.attached:not(.vertical):not(.top).actions .button:first-child { border-bottom-left-radius: 0.28571429rem; } .ui.attached:not(.vertical):not(.top).actions .button:last-child { border-bottom-right-radius: 0.28571429rem; } .ui.attached:not(.vertical).top.actions { border-top-left-radius: 0.28571429rem; border-top-right-radius: 0.28571429rem; } .ui.attached:not(.vertical).top.actions .button:first-child { border-top-left-radius: 0.28571429rem; } .ui.attached:not(.vertical).top.actions .button:last-child { border-top-right-radius: 0.28571429rem; } /******************************* Toast *******************************/ .ui.toast { display: none; border-radius: 0.28571429rem; padding: 0.78571429em 1em; margin: 0 -1px -0.01em; color: rgba(0, 0, 0, 0.87); background-color: #fff; } .ui.toast > .content > .header { font-weight: bold; color: inherit; margin: 0; } .ui.toast.info { background-color: #31ccec; color: rgba(255, 255, 255, 0.9); } .ui.toast.warning { background-color: #f2c037; color: rgba(255, 255, 255, 0.9); } .ui.toast.success { background-color: #21ba45; color: rgba(255, 255, 255, 0.9); } .ui.toast.error { background-color: #db2828; color: rgba(255, 255, 255, 0.9); } .ui.toast.neutral { background-color: #fff; color: rgba(0, 0, 0, 0.87); } .ui.toast > i.icon:not(.close) { font-size: 1.5em; } .ui.toast:not(.vertical):not(.centered):not(.center) > i.icon:not(.close) { position: absolute; } .ui.toast:not(.vertical):not(.centered):not(.center) > .ui.image { position: absolute; } .ui.toast:not(.vertical) > i.icon:not(.close) + .content { padding-left: 3em; } .ui.toast:not(.vertical) > .close.icon + .content { padding-left: 1.5em; } .ui.toast:not(.vertical) > .ui.image.avatar + .content { padding-left: 3em; min-height: 2em; } .ui.toast:not(.vertical) > .ui.image.mini + .content { padding-left: 3.4em; min-height: 35px; } .ui.toast:not(.vertical) > .ui.image.tiny + .content { padding-left: 7em; min-height: 80px; } .ui.toast:not(.vertical) > .ui.image.small + .content { padding-left: 12em; min-height: 150px; } .ui.toast:not(.vertical):not(.centered):not(.center) > .centered.image, .ui.toast:not(.vertical):not(.centered):not(.center) > .centered.icon { transform: translateY(-50%); top: 50%; } .ui.toast:not(.vertical).actions > .centered.image { top: calc(50% - 2em); } .ui.toast:not(.vertical).actions > .centered.icon { top: calc(50% - 1.2em); } .ui.toast.vertical > .content { flex-grow: 1; } .ui.toast.vertical.attached { flex-grow: 1; } .ui.toast.vertical > .close.icon + .content { padding-left: 1em; } .ui.toast.vertical > .ui.image + .content, .ui.toast.vertical > i.icon:not(.close) + .content { padding-left: 1em; } .ui.toast.vertical > .ui.image { align-self: flex-start; flex-shrink: 0; /* IE11 fix */ } .ui.toast.vertical > .centered.image, .ui.toast.vertical > .centered.icon { align-self: center; } .ui.toast.attached.bottom { border-top-left-radius: 0; border-top-right-radius: 0; } .ui.toast.attached.top { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .ui.toast.ui.ui.ui.image { padding: 0; } .ui.toast.ui.ui.ui.image > .content { padding-top: 0.78571429em; padding-bottom: 0.78571429em; padding-right: 1em; } .ui.toast.ui.ui.ui.image > .actions { margin: 0; } .ui.toast.ui.ui.ui.image > .ui.image { border-top-left-radius: 0.28571429rem; border-bottom-left-radius: 0.28571429rem; } .ui.toast.ui.ui.ui.image > .ui.image.mini { min-width: calc(0.7857142857142857em + 35px); } .ui.toast.ui.ui.ui.image > .ui.image.mini + .content { min-height: calc(0.7857142857142857em + 35px); padding-left: 4.4em; } .ui.hoverfloating.message:hover { box-shadow: 0 0 0 1px inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15); } .ui.center.toast-container .toast-box, .ui.right.toast-container .toast-box { margin-left: auto; } .ui.center.toast-container .toast-box { margin-right: auto; } .ui.ui.toast-container .toast-box .centered.toast, .ui.ui.toast-container .toast-box .center.aligned.toast { text-align: center; display: flex; justify-content: center; } .ui.ui.toast-container .toast-box .centered.toast > .content, .ui.ui.toast-container .toast-box .center.aligned.toast > .content, .ui.ui.toast-container .toast-box .centered.toast > .ui.image, .ui.ui.toast-container .toast-box .center.aligned.toast > .ui.image, .ui.ui.toast-container .toast-box .centered.toast > i.icon:not(.close), .ui.ui.toast-container .toast-box .center.aligned.toast > i.icon:not(.close) { align-self: center; } .ui.toast-container .toast-box .toast .centered.content, .ui.toast-container .toast-box .toast .center.aligned.content { text-align: center; } .ui.toast-container .toast-box .centered.actions, .ui.toast-container .toast-box .center.aligned.actions { text-align: center; } .ui.toast-container .toast-box .centered.actions:not(.attached) > .button:not(.fluid), .ui.toast-container .toast-box .center.aligned.actions:not(.attached) > .button:not(.fluid) { margin-left: 0.25em; margin-right: 0.25em; } /* -------------- Colors -------------- */ .ui.primary.toast { background-color: #2185d0; color: rgba(255, 255, 255, 0.9); } .ui.inverted.primary.toast, .ui.toast-container .toast-box > .inverted.primary.attached.progress .bar { background-color: #54c8ff; color: rgba(0, 0, 0, 0.87); } .ui.secondary.toast { background-color: #1b1c1d; color: rgba(255, 255, 255, 0.9); } .ui.inverted.secondary.toast, .ui.toast-container .toast-box > .inverted.secondary.attached.progress .bar { background-color: #545454; color: rgba(0, 0, 0, 0.87); } .ui.red.toast { background-color: #db2828; color: rgba(255, 255, 255, 0.9); } .ui.inverted.red.toast, .ui.toast-container .toast-box > .inverted.red.attached.progress .bar { background-color: #ff695e; color: rgba(0, 0, 0, 0.87); } .ui.orange.toast { background-color: #f2711c; color: rgba(255, 255, 255, 0.9); } .ui.inverted.orange.toast, .ui.toast-container .toast-box > .inverted.orange.attached.progress .bar { background-color: #ff851b; color: rgba(0, 0, 0, 0.87); } .ui.yellow.toast { background-color: #fbbd08; color: rgba(255, 255, 255, 0.9); } .ui.inverted.yellow.toast, .ui.toast-container .toast-box > .inverted.yellow.attached.progress .bar { background-color: #ffe21f; color: rgba(0, 0, 0, 0.87); } .ui.olive.toast { background-color: #b5cc18; color: rgba(255, 255, 255, 0.9); } .ui.inverted.olive.toast, .ui.toast-container .toast-box > .inverted.olive.attached.progress .bar { background-color: #d9e778; color: rgba(0, 0, 0, 0.87); } .ui.green.toast { background-color: #21ba45; color: rgba(255, 255, 255, 0.9); } .ui.inverted.green.toast, .ui.toast-container .toast-box > .inverted.green.attached.progress .bar { background-color: #2ecc40; color: rgba(0, 0, 0, 0.87); } .ui.teal.toast { background-color: #00b5ad; color: rgba(255, 255, 255, 0.9); } .ui.inverted.teal.toast, .ui.toast-container .toast-box > .inverted.teal.attached.progress .bar { background-color: #6dffff; color: rgba(0, 0, 0, 0.87); } .ui.blue.toast { background-color: #2185d0; color: rgba(255, 255, 255, 0.9); } .ui.inverted.blue.toast, .ui.toast-container .toast-box > .inverted.blue.attached.progress .bar { background-color: #54c8ff; color: rgba(0, 0, 0, 0.87); } .ui.violet.toast { background-color: #6435c9; color: rgba(255, 255, 255, 0.9); } .ui.inverted.violet.toast, .ui.toast-container .toast-box > .inverted.violet.attached.progress .bar { background-color: #a291fb; color: rgba(0, 0, 0, 0.87); } .ui.purple.toast { background-color: #a333c8; color: rgba(255, 255, 255, 0.9); } .ui.inverted.purple.toast, .ui.toast-container .toast-box > .inverted.purple.attached.progress .bar { background-color: #dc73ff; color: rgba(0, 0, 0, 0.87); } .ui.pink.toast { background-color: #e03997; color: rgba(255, 255, 255, 0.9); } .ui.inverted.pink.toast, .ui.toast-container .toast-box > .inverted.pink.attached.progress .bar { background-color: #ff8edf; color: rgba(0, 0, 0, 0.87); } .ui.brown.toast { background-color: #a5673f; color: rgba(255, 255, 255, 0.9); } .ui.inverted.brown.toast, .ui.toast-container .toast-box > .inverted.brown.attached.progress .bar { background-color: #d67c1c; color: rgba(0, 0, 0, 0.87); } .ui.grey.toast { background-color: #767676; color: rgba(255, 255, 255, 0.9); } .ui.inverted.grey.toast, .ui.toast-container .toast-box > .inverted.grey.attached.progress .bar { background-color: #dcddde; color: rgba(0, 0, 0, 0.87); } .ui.black.toast { background-color: #1b1c1d; color: rgba(255, 255, 255, 0.9); } .ui.inverted.black.toast, .ui.toast-container .toast-box > .inverted.black.attached.progress .bar { background-color: #545454; color: rgba(0, 0, 0, 0.87); } .ui.inverted.toast { color: rgba(255, 255, 255, 0.9); background-color: #1b1c1d; } @media only screen and (max-width: 420px) { .ui.toast-container .toast-box.toast-box, .ui.toast-container .toast-box > .compact, .ui.toast-container .toast-box > .vertical > *, .ui.toast-container .toast-box > * { width: auto; max-width: 100%; } .ui.toast-container .toast-box > *:not(.vertical) { min-width: 280px; } .ui.toast-container .toast-box > .ui.card.horizontal, .ui.toast-container .toast-box > .vertical > .ui.horizontal.card { min-width: initial; } } /* --------------- Progress Bar ---------------- */ @keyframes progressDown { 0% { width: 100%; } 100% { width: 0; } } @keyframes progressUp { 0% { width: 0; } 100% { width: 100%; } } @keyframes progressWait { 0% { opacity: 1; } 100% { opacity: 0; } } /******************************* Theme Overrides *******************************/ /******************************* User Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/toast.js ================================================ /*! * # Fomantic-UI 2.9.4 - Toast * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.toast = function (parameters) { var $allModules = $(this), $body = $('body'), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $(context); } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : $body; } } return $context; }, returnedValue ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.toast.settings, parameters) : $.extend({}, $.fn.toast.settings), className = settings.className, selector = settings.selector, error = settings.error, namespace = settings.namespace, fields = settings.fields, eventNamespace = '.' + namespace, moduleNamespace = namespace + '-module', $module = $(this), $toastBox, $toast, $actions, $progress, $progressBar, $animationObject, $close, $context = settings.context ? contextCheck(settings.context, window) : $body, isToastComponent = $module.hasClass('toast') || $module.hasClass('message') || $module.hasClass('card'), element = this, instance = isToastComponent ? $module.data(moduleNamespace) : undefined, id, module ; module = { initialize: function () { module.verbose('Initializing element'); module.create.id(); if (!module.has.container()) { module.create.container(); } if (isToastComponent || settings.message !== '' || settings.title !== '' || module.get.iconClass() !== '' || settings.showImage || module.has.configActions()) { if (typeof settings.showProgress !== 'string' || [className.top, className.bottom].indexOf(settings.showProgress) === -1) { settings.showProgress = false; } module.create.toast(); if (settings.closeOnClick && (settings.closeIcon || $($toast).find(selector.input).length > 0 || module.has.configActions())) { settings.closeOnClick = false; } if (!settings.closeOnClick) { $toastBox.addClass(className.unclickable); } module.bind.events(); } module.instantiate(); if ($toastBox) { module.show(); } }, instantiate: function () { module.verbose('Storing instance of toast'); instance = module; $module .data(moduleNamespace, instance) ; }, destroy: function () { if ($toastBox) { module.debug('Removing toast', $toastBox); module.unbind.events(); settings.onRemove.call($toastBox, element); $toastBox.remove(); $toastBox = undefined; $toast = undefined; $animationObject = undefined; $progress = undefined; $progressBar = undefined; $close = undefined; } $module .removeData(moduleNamespace) ; }, show: function (callback) { if (settings.onShow.call($toastBox, element) === false) { module.debug('onShow callback returned false, cancelling toast animation'); return; } callback = callback || function () {}; module.debug('Showing toast'); module.animate.show(callback); }, close: function (callback) { if (settings.onHide.call($toastBox, element) === false) { module.debug('onHide callback returned false, cancelling toast animation'); return; } callback = callback || function () {}; module.debug('Closing toast'); module.remove.visible(); module.unbind.events(); module.animate.close(callback); }, create: { container: function () { module.verbose('Creating container'); $context.append($('<div/>', { class: settings.position + ' ' + className.container + ' ' + (settings.horizontal ? className.horizontal : '') + ' ' + (settings.context && settings.context !== 'body' ? className.absolute : ''), })); }, id: function () { id = (Math.random().toString(16) + '000000000').slice(2, 10); module.verbose('Creating unique id for element', id); }, toast: function () { $toastBox = $('<div/>', { class: className.box }); var iconClass = module.get.iconClass(); if (!isToastComponent) { module.verbose('Creating toast'); $toast = $('<div/>', { role: 'alert' }); var $content = $('<div/>', { class: className.content }); if (iconClass !== '') { $toast.append($('<i/>', { class: iconClass + ' ' + className.icon })); } if (settings.showImage) { $toast.append($('<img>', { class: className.image + ' ' + settings.classImage, src: settings.showImage, alt: settings.alt || '', })); } if (settings.title !== '') { var titleId = '_' + module.get.id() + 'title'; $toast.attr('aria-labelledby', titleId); $content.append($('<div/>', { class: className.title, id: titleId, html: module.helpers.escape(settings.title, settings.preserveHTML), })); } var descId = '_' + module.get.id() + 'desc'; $toast.attr('aria-describedby', descId); $content.append($('<div/>', { class: className.message, id: descId, html: module.helpers.escape(settings.message, settings.preserveHTML), })); $toast .addClass(settings.class + ' ' + className.toast) .append($content) ; $toast.css('opacity', String(settings.opacity)); if (settings.closeIcon) { $close = $('<i/>', { class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : ''), role: 'button', tabindex: 0, 'aria-label': settings.text.close, }); if ($close.hasClass(className.left)) { $toast.prepend($close); } else { $toast.append($close); } } } else { $toast = settings.cloneModule ? $module.clone().removeAttr('id') : $module; $close = $toast.find('> i' + module.helpers.toClass(className.close)); settings.closeIcon = $close.length > 0; if (iconClass !== '') { $toast.find(selector.icon).attr('class', iconClass + ' ' + className.icon); } if (settings.showImage) { $toast.find(selector.image).attr('src', settings.showImage).attr('alt', settings.alt || ''); } if (settings.title !== '') { $toast.find(selector.title).html(module.helpers.escape(settings.title, settings.preserveHTML)); } if (settings.message !== '') { $toast.find(selector.message).html(module.helpers.escape(settings.message, settings.preserveHTML)); } } if ($toast.hasClass(className.compact)) { settings.compact = true; } if ($toast.hasClass('card')) { settings.compact = false; } $actions = $toast.find('.actions'); if (module.has.configActions()) { if ($actions.length === 0) { $actions = $('<div/>', { class: className.actions + ' ' + (settings.classActions || '') }).appendTo($toast); } if ($toast.hasClass('card') && !$actions.hasClass(className.attached)) { $actions.addClass(className.extraContent); if ($actions.hasClass(className.vertical)) { $actions.removeClass(className.vertical); module.error(error.verticalCard); } } settings.actions.forEach(function (el) { var icon = el[fields.icon] ? '<i ' + (el[fields.text] ? 'aria-hidden="true"' : '') + ' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '', text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML), cls = module.helpers.deQuote(el[fields.class] || ''), click = el[fields.click] && isFunction(el[fields.click]) ? el[fields.click] : function () {} ; $actions.append($('<button/>', { html: icon + text, 'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g, ''), class: className.button + ' ' + cls, on: { click: function () { var $button = $(this); if ($button.is(selector.approve) || $button.is(selector.deny) || click.call(element, $module) === false) { return; } module.close(); }, }, })); }); } if ($actions && $actions.hasClass(className.vertical)) { $toast.addClass(className.vertical); } if ($actions.length > 0 && !$actions.hasClass(className.attached)) { if ($actions && (!$actions.hasClass(className.basic) || $actions.hasClass(className.left))) { $toast.addClass(className.actions); } } if (settings.displayTime === 'auto') { settings.displayTime = Math.max(settings.minDisplayTime, ($toast.text().split(' ').length / settings.wordsPerMinute) * 60000); } $toastBox.append($toast); if ($actions.length > 0 && $actions.hasClass(className.attached)) { $actions.addClass(className.buttons); $actions.detach(); $toast.addClass(className.attached); if (!$actions.hasClass(className.vertical)) { if ($actions.hasClass(className.top)) { $toastBox.prepend($actions); $toast.addClass(className.bottom); } else { $toastBox.append($actions); $toast.addClass(className.top); } } else { $toast.wrap( $('<div/>', { class: className.vertical + ' ' + className.attached + ' ' + (settings.compact ? className.compact : ''), }) ); if ($actions.hasClass(className.left)) { $toast.addClass(className.left).parent().addClass(className.left).prepend($actions); } else { $toast.parent().append($actions); } } } if ($module !== $toast) { $module = $toast; element = $toast[0]; } if (settings.displayTime > 0) { var progressingClass = className.progressing + ' ' + (settings.pauseOnHover ? className.pausable : ''); if (settings.showProgress) { $progress = $('<div/>', { class: className.progress + ' ' + (settings.classProgress || settings.class), 'data-percent': '', }); if (!settings.classProgress) { if ($toast.hasClass('toast') && !$toast.hasClass(className.inverted)) { $progress.addClass(className.inverted); } else { $progress.removeClass(className.inverted); } } $progressBar = $('<div/>', { class: 'bar ' + (settings.progressUp ? 'up ' : 'down ') + progressingClass }); $progress .addClass(settings.showProgress) .append($progressBar) ; if ($progress.hasClass(className.top)) { $toastBox.prepend($progress); } else { $toastBox.append($progress); } $progressBar.css('animation-duration', settings.displayTime / 1000 + 's'); } $animationObject = $('<span/>', { class: 'wait ' + progressingClass }); $animationObject.css('animation-duration', settings.displayTime / 1000 + 's'); $animationObject.appendTo($toast); } if (settings.compact) { $toastBox.addClass(className.compact); $toast.addClass(className.compact); if ($progress) { $progress.addClass(className.compact); } } if (settings.newestOnTop) { $toastBox.prependTo(module.get.container()); } else { $toastBox.appendTo(module.get.container()); } }, }, bind: { events: function () { module.debug('Binding events to toast'); if (settings.closeIcon) { $close.on('click' + eventNamespace, module.event.close); } $toast.on('click' + eventNamespace, module.event.click); if ($animationObject) { $animationObject.on('animationend' + eventNamespace, module.event.close); } $toastBox .on('click' + eventNamespace, selector.approve, module.event.approve) .on('click' + eventNamespace, selector.deny, module.event.deny) ; }, }, unbind: { events: function () { module.debug('Unbinding events to toast'); if (settings.closeIcon) { $close.off('click' + eventNamespace); } $toast.off('click' + eventNamespace); if ($animationObject) { $animationObject.off('animationend' + eventNamespace); } $toastBox .off('click' + eventNamespace) ; }, }, animate: { show: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (settings.transition && module.can.useElement('transition')) { module.set.visible(); $toastBox .transition({ animation: settings.transition.showMethod + ' in', queue: false, debug: settings.debug, verbose: settings.verbose, silent: settings.silent, duration: settings.transition.showDuration, onComplete: function () { callback.call($toastBox, element); settings.onVisible.call($toastBox, element); }, }) ; } }, close: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (settings.transition && $.fn.transition !== undefined) { $toastBox .transition({ animation: settings.transition.hideMethod + ' out', queue: false, duration: settings.transition.hideDuration, debug: settings.debug, verbose: settings.verbose, silent: settings.silent, interval: 50, onBeforeHide: function (callback) { callback = isFunction(callback) ? callback : function () {}; if (settings.transition.closeEasing !== '') { if ($toastBox) { $toastBox.css('opacity', '0'); $toastBox.wrap('<div/>').parent().hide(settings.transition.closeDuration, settings.transition.closeEasing, function () { if ($toastBox) { $toastBox.parent().remove(); callback.call($toastBox); } }); } } else { callback.call($toastBox); } }, onComplete: function () { callback.call($toastBox, element); settings.onHidden.call($toastBox, element); module.destroy(); }, }) ; } else { module.error(error.noTransition); } }, pause: function () { $animationObject.css('animationPlayState', 'paused'); if ($progressBar) { $progressBar.css('animationPlayState', 'paused'); } }, continue: function () { $animationObject.css('animationPlayState', 'running'); if ($progressBar) { $progressBar.css('animationPlayState', 'running'); } }, }, has: { container: function () { module.verbose('Determining if there is already a container'); return module.get.containers().length > 0; }, toast: function () { return !!module.get.toast(); }, toasts: function () { return module.get.toasts().length > 0; }, configActions: function () { return Array.isArray(settings.actions) && settings.actions.length > 0; }, }, get: { id: function () { return id; }, containers: function () { return $context.children(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : ':not(' + module.helpers.toClass(className.horizontal) + ')') + (settings.context && settings.context !== 'body' ? module.helpers.toClass(className.absolute) : ':not(' + module.helpers.toClass(className.absolute) + ')')); }, container: function () { return module.get.containers()[0]; }, toastBox: function () { return $toastBox || null; }, toast: function () { return $toast || null; }, toasts: function () { return $(module.get.container()).find(selector.box); }, iconClass: function () { return typeof settings.showIcon === 'string' ? settings.showIcon : (settings.showIcon && settings.icons[settings.class] ? settings.icons[settings.class] : ''); }, remainingTime: function () { return $animationObject ? $animationObject.css('opacity') * settings.displayTime : 0; }, }, set: { visible: function () { $toast.addClass(className.visible); }, }, remove: { visible: function () { $toast.removeClass(className.visible); }, }, event: { close: function () { module.close(); }, click: function (event) { if ($(event.target).closest(selector.clickable).length === 0) { if (settings.onClick.call($toastBox, element) === false || !settings.closeOnClick) { module.verbose('Click callback returned false or close denied by setting cancelling close'); return; } module.close(); } }, approve: function () { if (settings.onApprove.call(element, $module) === false) { module.verbose('Approve callback returned false cancelling close'); return; } module.close(); }, deny: function () { if (settings.onDeny.call(element, $module) === false) { module.verbose('Deny callback returned false cancelling close'); return; } module.close(); }, }, helpers: { toClass: function (selector) { var classes = selector.trim().split(/\s+/), result = '' ; classes.forEach(function (element) { result += '.' + element; }); return result; }, deQuote: function (string) { return String(string).replace(/"/g, ''); }, escape: function (string, preserveHTML) { if (preserveHTML) { return string; } var badChars = /["'<>`]/g, shouldEscape = /["&'<>`]/, escape = { '<': '<', '>': '>', '"': '"', "'": ''', '`': '`', }, escapedChar = function (chr) { return escape[chr]; } ; if (shouldEscape.test(string)) { string = string.replace(/&(?![\d#a-z]{1,12};)/gi, '&'); return string.replace(badChars, escapedChar); } return string; }, }, can: { useElement: function (element) { if ($.fn[element] !== undefined) { return true; } module.error(error.noElement.replace('{element}', element)); return false; }, }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); returnedValue = $module; } }); return returnedValue !== undefined ? returnedValue : this; }; $.toast = $.fn.toast; $.fn.toast.settings = { name: 'Toast', namespace: 'toast', silent: false, debug: false, verbose: false, performance: true, context: 'body', position: 'top right', horizontal: false, class: 'neutral', classProgress: false, classActions: false, classImage: 'mini', title: '', message: '', displayTime: 3000, // set to zero to require manually dismissal, otherwise hides on its own minDisplayTime: 1000, // minimum displaytime in case displayTime is set to 'auto' wordsPerMinute: 120, showIcon: false, newestOnTop: false, showProgress: false, pauseOnHover: true, progressUp: false, // if true, the bar will start at 0% and increase to 100% opacity: 1, compact: true, closeIcon: false, closeOnClick: true, cloneModule: true, actions: false, preserveHTML: true, showImage: false, alt: false, // transition settings transition: { showMethod: 'scale', showDuration: 500, hideMethod: 'scale', hideDuration: 500, closeEasing: 'easeOutCubic', // Set to empty string to stack the closed toast area immediately (old behaviour) closeDuration: 500, }, error: { method: 'The method you called is not defined.', noElement: 'This module requires ui {element}', verticalCard: 'Vertical but not attached actions are not supported for card layout', }, className: { container: 'ui toast-container', absolute: 'absolute', box: 'floating toast-box', progress: 'ui attached active progress', toast: 'ui toast', icon: 'centered icon', visible: 'visible', content: 'content', title: 'ui header', message: 'message', actions: 'actions', extraContent: 'extra content', button: 'ui button', buttons: 'ui buttons', close: 'close icon', image: 'ui image', vertical: 'vertical', horizontal: 'horizontal', attached: 'attached', inverted: 'inverted', compact: 'compact', pausable: 'pausable', progressing: 'progressing', top: 'top', bottom: 'bottom', left: 'left', basic: 'basic', unclickable: 'unclickable', }, text: { close: 'Close', }, icons: { info: 'info', success: 'checkmark', warning: 'warning', error: 'times', }, selector: { container: '.ui.toast-container', box: '.toast-box', toast: '.ui.toast', title: '.header', message: '.message:not(.ui)', image: '> img.image, > .image > img', icon: '> i.icon', input: 'input:not([type="hidden"]), textarea, select, button, .ui.button, ui.dropdown', clickable: 'a, details, .ui.accordion', approve: '.actions .positive, .actions .approve, .actions .ok', deny: '.actions .negative, .actions .deny, .actions .cancel', }, fields: { class: 'class', text: 'text', icon: 'icon', click: 'click', }, // callbacks onShow: function () {}, onVisible: function () {}, onClick: function () {}, onHide: function () {}, onHidden: function () {}, onRemove: function () {}, onApprove: function () {}, onDeny: function () {}, }; $.extend($.easing, { easeOutBounce: function (x) { var n1 = 7.5625, d1 = 2.75 ; if (x < 1 / d1) { return n1 * x * x; } if (x < 2 / d1) { x -= 1.5 / d1; return n1 * x * x + 0.75; } if (x < 2.5 / d1) { x -= 2.25 / d1; return n1 * x * x + 0.9375; } x -= 2.625 / d1; return n1 * x * x + 0.984375; }, easeOutCubic: function (t) { return --t * t * t + 1; }, }); })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/transition.css ================================================ /*! * # Fomantic-UI 2.9.4 - Transition * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ /******************************* Transitions *******************************/ .transition { animation-iteration-count: 1; animation-duration: 300ms; animation-timing-function: ease; animation-fill-mode: both; } /******************************* States *******************************/ /* Animating */ .animating.transition { -webkit-backface-visibility: hidden; backface-visibility: hidden; visibility: visible !important; } /* Loading */ .loading.transition { position: absolute; top: -99999px; left: -99999px; } /* Hidden */ .hidden.transition { display: none; visibility: hidden; } /* Visible */ .visible.transition { display: block !important; visibility: visible !important; /* backface-visibility: @backfaceVisibility; transform: @use3DAcceleration; */ } /* Disabled */ .disabled.transition { animation-play-state: paused; } /******************************* Variations *******************************/ .looping.transition { animation-iteration-count: infinite; } /* Pulsating */ .pulsating.transition { animation-name: pulsating; animation-duration: 2000ms; box-shadow: 0 0 0 0 rgba(128, 128, 128, 0.5); } .inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.7); } @keyframes pulsating { 100% { box-shadow: 0 0 0 0.8rem rgba(255, 255, 255, 0); } } .primary.pulsating.transition { box-shadow: 0 0 0 0 rgba(33, 133, 208, 0.5); } .primary.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(84, 200, 255, 0.7); } .secondary.pulsating.transition { box-shadow: 0 0 0 0 rgba(27, 28, 29, 0.5); } .secondary.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(84, 84, 84, 0.7); } .red.pulsating.transition { box-shadow: 0 0 0 0 rgba(219, 40, 40, 0.5); } .red.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(255, 105, 94, 0.7); } .orange.pulsating.transition { box-shadow: 0 0 0 0 rgba(242, 113, 28, 0.5); } .orange.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(255, 133, 27, 0.7); } .yellow.pulsating.transition { box-shadow: 0 0 0 0 rgba(251, 189, 8, 0.5); } .yellow.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(255, 226, 31, 0.7); } .olive.pulsating.transition { box-shadow: 0 0 0 0 rgba(181, 204, 24, 0.5); } .olive.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(217, 231, 120, 0.7); } .green.pulsating.transition { box-shadow: 0 0 0 0 rgba(33, 186, 69, 0.5); } .green.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(46, 204, 64, 0.7); } .teal.pulsating.transition { box-shadow: 0 0 0 0 rgba(0, 181, 173, 0.5); } .teal.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(109, 255, 255, 0.7); } .blue.pulsating.transition { box-shadow: 0 0 0 0 rgba(33, 133, 208, 0.5); } .blue.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(84, 200, 255, 0.7); } .violet.pulsating.transition { box-shadow: 0 0 0 0 rgba(100, 53, 201, 0.5); } .violet.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(162, 145, 251, 0.7); } .purple.pulsating.transition { box-shadow: 0 0 0 0 rgba(163, 51, 200, 0.5); } .purple.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(220, 115, 255, 0.7); } .pink.pulsating.transition { box-shadow: 0 0 0 0 rgba(224, 57, 151, 0.5); } .pink.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(255, 142, 223, 0.7); } .brown.pulsating.transition { box-shadow: 0 0 0 0 rgba(165, 103, 63, 0.5); } .brown.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(214, 124, 28, 0.7); } .grey.pulsating.transition { box-shadow: 0 0 0 0 rgba(118, 118, 118, 0.5); } .grey.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(220, 221, 222, 0.7); } .black.pulsating.transition { box-shadow: 0 0 0 0 rgba(27, 28, 29, 0.5); } .black.inverted.pulsating.transition { box-shadow: 0 0 0 0 rgba(84, 84, 84, 0.7); } /******************************* Transitions *******************************/ /* Some transitions adapted from Animate CSS https://github.com/daneden/animate.css Additional transitions adapted from Glide by Nick Pettit - https://github.com/nickpettit/glide */ /* -------------- Browse --------------- */ .transition.browse { animation-duration: 500ms; } .transition.browse.in { animation-name: browseIn; } .transition.browse.out, .transition.browse.left.out { animation-name: browseOutLeft; } .transition.browse.right.out { animation-name: browseOutRight; } /* In */ @keyframes browseIn { 0% { transform: scale(0.8) translateZ(0); z-index: -1; } 10% { transform: scale(0.8) translateZ(0); z-index: -1; opacity: 0.7; } 80% { transform: scale(1.05) translateZ(0); opacity: 1; z-index: 999; } 100% { transform: scale(1) translateZ(0); z-index: 999; } } /* Out */ @keyframes browseOutLeft { 0% { z-index: 999; transform: translateX(0) rotateY(0) rotateX(0); } 50% { z-index: -1; transform: translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px); } 80% { opacity: 1; } 100% { z-index: -1; transform: translateX(0) rotateY(0) rotateX(0) translateZ(-10px); opacity: 0; } } @keyframes browseOutRight { 0% { z-index: 999; transform: translateX(0) rotateY(0) rotateX(0); } 50% { z-index: 1; transform: translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px); } 80% { opacity: 1; } 100% { z-index: 1; transform: translateX(0) rotateY(0) rotateX(0) translateZ(-10px); opacity: 0; } } /* -------------- Drop --------------- */ .drop.transition { transform-origin: top center; animation-duration: 400ms; animation-timing-function: cubic-bezier(0.34, 1.61, 0.7, 1); } .drop.transition.in { animation-name: dropIn; } .drop.transition.out { animation-name: dropOut; } /* Drop */ @keyframes dropIn { 0% { opacity: 0; transform: scale(0); } 100% { opacity: 1; transform: scale(1); } } @keyframes dropOut { 0% { opacity: 1; transform: scale(1); } 100% { opacity: 0; transform: scale(0); } } /* -------------- Fade --------------- */ .transition.fade.in { animation-name: fadeIn; } .transition[class*="fade up"].in { animation-name: fadeInUp; } .transition[class*="fade down"].in { animation-name: fadeInDown; } .transition[class*="fade left"].in { animation-name: fadeInLeft; } .transition[class*="fade right"].in { animation-name: fadeInRight; } .transition.fade.out { animation-name: fadeOut; } .transition[class*="fade up"].out { animation-name: fadeOutUp; } .transition[class*="fade down"].out { animation-name: fadeOutDown; } .transition[class*="fade left"].out { animation-name: fadeOutLeft; } .transition[class*="fade right"].out { animation-name: fadeOutRight; } /* In */ @keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes fadeInUp { 0% { opacity: 0; transform: translateY(10%); } 100% { opacity: 1; transform: translateY(0); } } @keyframes fadeInDown { 0% { opacity: 0; transform: translateY(-10%); } 100% { opacity: 1; transform: translateY(0); } } @keyframes fadeInLeft { 0% { opacity: 0; transform: translateX(10%); } 100% { opacity: 1; transform: translateX(0); } } @keyframes fadeInRight { 0% { opacity: 0; transform: translateX(-10%); } 100% { opacity: 1; transform: translateX(0); } } /* Out */ @keyframes fadeOut { 0% { opacity: 1; } 100% { opacity: 0; } } @keyframes fadeOutUp { 0% { opacity: 1; transform: translateY(0); } 100% { opacity: 0; transform: translateY(5%); } } @keyframes fadeOutDown { 0% { opacity: 1; transform: translateY(0); } 100% { opacity: 0; transform: translateY(-5%); } } @keyframes fadeOutLeft { 0% { opacity: 1; transform: translateX(0); } 100% { opacity: 0; transform: translateX(5%); } } @keyframes fadeOutRight { 0% { opacity: 1; transform: translateX(0); } 100% { opacity: 0; transform: translateX(-5%); } } /* -------------- Flips --------------- */ .flip.transition.in, .flip.transition.out { animation-duration: 600ms; } .horizontal.flip.transition.in { animation-name: horizontalFlipIn; } .horizontal.flip.transition.out { animation-name: horizontalFlipOut; } .vertical.flip.transition.in { animation-name: verticalFlipIn; } .vertical.flip.transition.out { animation-name: verticalFlipOut; } /* In */ @keyframes horizontalFlipIn { 0% { transform: perspective(2000px) rotateY(-90deg); opacity: 0; } 100% { transform: perspective(2000px) rotateY(0); opacity: 1; } } @keyframes verticalFlipIn { 0% { transform: perspective(2000px) rotateX(-90deg); opacity: 0; } 100% { transform: perspective(2000px) rotateX(0); opacity: 1; } } /* Out */ @keyframes horizontalFlipOut { 0% { transform: perspective(2000px) rotateY(0); opacity: 1; } 100% { transform: perspective(2000px) rotateY(90deg); opacity: 0; } } @keyframes verticalFlipOut { 0% { transform: perspective(2000px) rotateX(0); opacity: 1; } 100% { transform: perspective(2000px) rotateX(-90deg); opacity: 0; } } /* -------------- Scale --------------- */ .scale.transition.in { animation-name: scaleIn; } .scale.transition.out { animation-name: scaleOut; } @keyframes scaleIn { 0% { opacity: 0; transform: scale(0.8); } 100% { opacity: 1; transform: scale(1); } } /* Out */ @keyframes scaleOut { 0% { opacity: 1; transform: scale(1); } 100% { opacity: 0; transform: scale(0.9); } } /* -------------- Fly --------------- */ /* Inward */ .transition.fly { animation-duration: 0.6s; transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); } .transition.fly.in { animation-name: flyIn; } .transition[class*="fly up"].in { animation-name: flyInUp; } .transition[class*="fly down"].in { animation-name: flyInDown; } .transition[class*="fly left"].in { animation-name: flyInLeft; } .transition[class*="fly right"].in { animation-name: flyInRight; } /* Outward */ .transition.fly.out { animation-name: flyOut; } .transition[class*="fly up"].out { animation-name: flyOutUp; } .transition[class*="fly down"].out { animation-name: flyOutDown; } .transition[class*="fly left"].out { animation-name: flyOutLeft; } .transition[class*="fly right"].out { animation-name: flyOutRight; } /* In */ @keyframes flyIn { 0% { opacity: 0; transform: scale3d(0.3, 0.3, 0.3); } 20% { transform: scale3d(1.1, 1.1, 1.1); } 40% { transform: scale3d(0.9, 0.9, 0.9); } 60% { opacity: 1; transform: scale3d(1.03, 1.03, 1.03); } 80% { transform: scale3d(0.97, 0.97, 0.97); } 100% { opacity: 1; transform: scale3d(1, 1, 1); } } @keyframes flyInUp { 0% { opacity: 0; transform: translate3d(0, 1500px, 0); } 60% { opacity: 1; transform: translate3d(0, -20px, 0); } 75% { transform: translate3d(0, 10px, 0); } 90% { transform: translate3d(0, -5px, 0); } 100% { transform: translate3d(0, 0, 0); } } @keyframes flyInDown { 0% { opacity: 0; transform: translate3d(0, -1500px, 0); } 60% { opacity: 1; transform: translate3d(0, 25px, 0); } 75% { transform: translate3d(0, -10px, 0); } 90% { transform: translate3d(0, 5px, 0); } 100% { transform: none; } } @keyframes flyInLeft { 0% { opacity: 0; transform: translate3d(1500px, 0, 0); } 60% { opacity: 1; transform: translate3d(-25px, 0, 0); } 75% { transform: translate3d(10px, 0, 0); } 90% { transform: translate3d(-5px, 0, 0); } 100% { transform: none; } } @keyframes flyInRight { 0% { opacity: 0; transform: translate3d(-1500px, 0, 0); } 60% { opacity: 1; transform: translate3d(25px, 0, 0); } 75% { transform: translate3d(-10px, 0, 0); } 90% { transform: translate3d(5px, 0, 0); } 100% { transform: none; } } /* Out */ @keyframes flyOut { 20% { transform: scale3d(0.9, 0.9, 0.9); } 50%, 55% { opacity: 1; transform: scale3d(1.1, 1.1, 1.1); } 100% { opacity: 0; transform: scale3d(0.3, 0.3, 0.3); } } @keyframes flyOutUp { 20% { transform: translate3d(0, 10px, 0); } 40%, 45% { opacity: 1; transform: translate3d(0, -20px, 0); } 100% { opacity: 0; transform: translate3d(0, 2000px, 0); } } @keyframes flyOutDown { 20% { transform: translate3d(0, -10px, 0); } 40%, 45% { opacity: 1; transform: translate3d(0, 20px, 0); } 100% { opacity: 0; transform: translate3d(0, -2000px, 0); } } @keyframes flyOutRight { 20% { opacity: 1; transform: translate3d(20px, 0, 0); } 100% { opacity: 0; transform: translate3d(-2000px, 0, 0); } } @keyframes flyOutLeft { 20% { opacity: 1; transform: translate3d(-20px, 0, 0); } 100% { opacity: 0; transform: translate3d(2000px, 0, 0); } } /* -------------- Slide --------------- */ .transition.slide.in, .transition[class*="slide down"].in { animation-name: slideInY; transform-origin: top center; } .transition[class*="slide up"].in { animation-name: slideInY; transform-origin: bottom center; } .transition[class*="slide left"].in { animation-name: slideInX; transform-origin: right center; } .transition[class*="slide right"].in { animation-name: slideInX; transform-origin: left center; } .transition.slide.out, .transition[class*="slide down"].out { animation-name: slideOutY; transform-origin: top center; } .transition[class*="slide up"].out { animation-name: slideOutY; transform-origin: bottom center; } .transition[class*="slide left"].out { animation-name: slideOutX; transform-origin: right center; } .transition[class*="slide right"].out { animation-name: slideOutX; transform-origin: left center; } /* In */ @keyframes slideInY { 0% { opacity: 0; transform: scaleY(0); } 100% { opacity: 1; transform: scaleY(1); } } @keyframes slideInX { 0% { opacity: 0; transform: scaleX(0); } 100% { opacity: 1; transform: scaleX(1); } } /* Out */ @keyframes slideOutY { 0% { opacity: 1; transform: scaleY(1); } 100% { opacity: 0; transform: scaleY(0); } } @keyframes slideOutX { 0% { opacity: 1; transform: scaleX(1); } 100% { opacity: 0; transform: scaleX(0); } } /* -------------- Swing --------------- */ .transition.swing { animation-duration: 800ms; } .transition[class*="swing down"].in { animation-name: swingInX; transform-origin: top center; } .transition[class*="swing up"].in { animation-name: swingInX; transform-origin: bottom center; } .transition[class*="swing left"].in { animation-name: swingInY; transform-origin: right center; } .transition[class*="swing right"].in { animation-name: swingInY; transform-origin: left center; } .transition.swing.out, .transition[class*="swing down"].out { animation-name: swingOutX; transform-origin: top center; } .transition[class*="swing up"].out { animation-name: swingOutX; transform-origin: bottom center; } .transition[class*="swing left"].out { animation-name: swingOutY; transform-origin: right center; } .transition[class*="swing right"].out { animation-name: swingOutY; transform-origin: left center; } /* In */ @keyframes swingInX { 0% { transform: perspective(1000px) rotateX(90deg); opacity: 0; } 40% { transform: perspective(1000px) rotateX(-30deg); opacity: 1; } 60% { transform: perspective(1000px) rotateX(15deg); } 80% { transform: perspective(1000px) rotateX(-7.5deg); } 100% { transform: perspective(1000px) rotateX(0); } } @keyframes swingInY { 0% { transform: perspective(1000px) rotateY(-90deg); opacity: 0; } 40% { transform: perspective(1000px) rotateY(30deg); opacity: 1; } 60% { transform: perspective(1000px) rotateY(-17.5deg); } 80% { transform: perspective(1000px) rotateY(7.5deg); } 100% { transform: perspective(1000px) rotateY(0); } } /* Out */ @keyframes swingOutX { 0% { transform: perspective(1000px) rotateX(0); } 40% { transform: perspective(1000px) rotateX(-7.5deg); } 60% { transform: perspective(1000px) rotateX(17.5deg); } 80% { transform: perspective(1000px) rotateX(-30deg); opacity: 1; } 100% { transform: perspective(1000px) rotateX(90deg); opacity: 0; } } @keyframes swingOutY { 0% { transform: perspective(1000px) rotateY(0); } 40% { transform: perspective(1000px) rotateY(7.5deg); } 60% { transform: perspective(1000px) rotateY(-10deg); } 80% { transform: perspective(1000px) rotateY(30deg); opacity: 1; } 100% { transform: perspective(1000px) rotateY(-90deg); opacity: 0; } } /* -------------- Zoom --------------- */ .transition.zoom.in { animation-name: zoomIn; } .transition.zoom.out { animation-name: zoomOut; } @keyframes zoomIn { 0% { opacity: 1; transform: scale(0); } 100% { opacity: 1; transform: scale(1); } } @keyframes zoomOut { 0% { opacity: 1; transform: scale(1); } 100% { opacity: 1; transform: scale(0); } } /******************************* Static Animations *******************************/ /* -------------- Emphasis --------------- */ .flash.transition { animation-duration: 750ms; animation-name: flash; } .shake.transition { animation-duration: 750ms; animation-name: shake; } .bounce.transition { animation-duration: 750ms; animation-name: bounce; } .tada.transition { animation-duration: 750ms; animation-name: tada; } .pulse.transition { animation-duration: 500ms; animation-name: pulse; } .jiggle.transition { animation-duration: 750ms; animation-name: jiggle; } .transition.glow { animation-duration: 2000ms; animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1); } .transition.glow { animation-name: glow; } /* Flash */ @keyframes flash { 0%, 50%, 100% { opacity: 1; } 25%, 75% { opacity: 0; } } /* Shake */ @keyframes shake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); } 20%, 40%, 60%, 80% { transform: translateX(10px); } } /* Bounce */ @keyframes bounce { 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } 40% { transform: translateY(-30px); } 60% { transform: translateY(-15px); } } /* Tada */ @keyframes tada { 0% { transform: scale(1); } 10%, 20% { transform: scale(0.9) rotate(-3deg); } 30%, 50%, 70%, 90% { transform: scale(1.1) rotate(3deg); } 40%, 60%, 80% { transform: scale(1.1) rotate(-3deg); } 100% { transform: scale(1) rotate(0); } } /* Pulse */ @keyframes pulse { 0% { transform: scale(1); opacity: 1; } 50% { transform: scale(0.9); opacity: 0.7; } 100% { transform: scale(1); opacity: 1; } } /* Jiggle */ @keyframes jiggle { 0% { transform: scale3d(1, 1, 1); } 30% { transform: scale3d(1.25, 0.75, 1); } 40% { transform: scale3d(0.75, 1.25, 1); } 50% { transform: scale3d(1.15, 0.85, 1); } 65% { transform: scale3d(0.95, 1.05, 1); } 75% { transform: scale3d(1.05, 0.95, 1); } 100% { transform: scale3d(1, 1, 1); } } /* Glow */ @keyframes glow { 0% { background-color: #fcfcfd; } 30% { background-color: #fff6cd; } 100% { background-color: #fcfcfd; } } /******************************* Site Overrides *******************************/ ================================================ FILE: assets/vendors/fomantic-ui/components/transition.js ================================================ /*! * # Fomantic-UI 2.9.4 - Transition * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.transition = function () { var $allModules = $(this), time = Date.now(), performance = [], moduleArguments = arguments, query = moduleArguments[0], queryArguments = [].slice.call(arguments, 1), methodInvoked = typeof query === 'string', returnedValue ; $allModules.each(function (index) { var $module = $(this), element = this, // set at run time settings, instance, error, className, metadata, moduleNamespace, eventNamespace, module ; module = { initialize: function () { // get full settings settings = module.get.settings.apply(element, moduleArguments); // shorthand className = settings.className; error = settings.error; metadata = settings.metadata; // define namespace eventNamespace = '.' + settings.namespace; moduleNamespace = 'module-' + settings.namespace; instance = $module.data(moduleNamespace) || module; if (methodInvoked) { methodInvoked = module.invoke(query); } // method not invoked, lets run an animation if (methodInvoked === false) { module.verbose('Converted arguments into settings object', settings); if (settings.interval) { module.delay(settings.interval); } else { module.animate(); } module.instantiate(); } }, instantiate: function () { module.verbose('Storing instance of module', module); instance = module; $module .data(moduleNamespace, instance) ; }, destroy: function () { module.verbose('Destroying previous module for', element); $module .removeData(moduleNamespace) ; }, refresh: function () { module.verbose('Refreshing display type on next animation'); delete module.displayType; }, forceRepaint: function () { module.verbose('Forcing element repaint'); var $parentElement = $module.parent(), $nextElement = $module.next() ; if ($nextElement.length === 0) { $module.detach().appendTo($parentElement); } else { $module.detach().insertBefore($nextElement); } }, repaint: function () { module.verbose('Repainting element'); var fakeAssignment = element.offsetWidth ; }, delay: function (interval) { var direction = module.get.animationDirection(), shouldReverse, delay ; if (!direction) { direction = module.can.transition() ? module.get.direction() : 'static'; } interval = interval !== undefined ? interval : settings.interval; shouldReverse = settings.reverse === 'auto' && direction === className.outward; delay = shouldReverse || settings.reverse === true ? ($allModules.length - index) * interval : index * interval; module.debug('Delaying animation by', delay); setTimeout(function () { module.animate(); }, delay); }, animate: function (overrideSettings) { settings = overrideSettings || settings; module.debug('Preparing animation', settings.animation); if (module.is.animating()) { if (settings.queue) { if (!settings.allowRepeats && module.has.direction() && module.is.occurring() && module.queuing !== true) { module.debug('Animation is currently occurring, preventing queueing same animation', settings.animation); } else { module.queue(settings.animation); } return false; } if (!settings.allowRepeats && module.is.occurring()) { module.debug('Animation is already occurring, will not execute repeated animation', settings.animation); return false; } module.debug('New animation started, completing previous early', settings.animation); instance.complete(); } if (module.can.animate()) { module.set.animating(settings.animation); } else { module.error(error.noAnimation, settings.animation, element); } }, reset: function () { module.debug('Resetting animation to beginning conditions'); module.remove.animationCallbacks(); module.restore.conditions(); module.remove.animating(); }, queue: function (animation) { module.debug('Queueing animation of', animation); module.queuing = true; $module .one('animationend.queue' + eventNamespace, function () { module.queuing = false; module.repaint(); module.animate.apply(this, settings); }) ; }, complete: function (event) { if (event && event.target === element) { event.stopPropagation(); } module.debug('Animation complete', settings.animation); module.remove.completeCallback(); module.remove.failSafe(); if (!module.is.looping()) { if (module.is.outward()) { module.verbose('Animation is outward, hiding element'); module.restore.conditions(); module.hide(); } else if (module.is.inward()) { module.verbose('Animation is inward, showing element'); module.restore.conditions(); module.show(); } else { module.verbose('Static animation completed'); module.restore.conditions(); settings.onComplete.call(element); } } }, force: { visible: function () { var style = $module.attr('style'), userStyle = module.get.userStyle(style), displayType = module.get.displayType(), overrideStyle = userStyle + 'display: ' + displayType + ' !important;', inlineDisplay = $module[0].style.display, mustStayHidden = !displayType || (inlineDisplay === 'none' && settings.skipInlineHidden) || $module[0].tagName.match(/(script|link|style)/i) ; if (mustStayHidden) { module.remove.transition(); return false; } module.verbose('Overriding default display to show element', displayType); $module .attr('style', overrideStyle) ; return true; }, hidden: function () { var style = $module.attr('style'), currentDisplay = $module.css('display'), emptyStyle = style === undefined || style === '' ; if (currentDisplay !== 'none' && !module.is.hidden()) { module.verbose('Overriding default display to hide element'); $module .css('display', 'none') ; } else if (emptyStyle) { $module .removeAttr('style') ; } }, }, has: { direction: function (animation) { var hasDirection = false ; animation = animation || settings.animation; if (typeof animation === 'string') { animation = animation.split(' '); $.each(animation, function (index, word) { if (word === className.inward || word === className.outward) { hasDirection = true; } }); } return hasDirection; }, inlineDisplay: function () { var style = $module.attr('style') || '' ; return Array.isArray(style.match(/display.*?;/, '')); }, }, set: { animating: function (animation) { // remove previous callbacks module.remove.completeCallback(); // determine exact animation animation = animation || settings.animation; var animationClass = module.get.animationClass(animation); // save animation class in cache to restore class names module.save.animation(animationClass); if (module.force.visible()) { module.remove.hidden(); module.remove.direction(); module.start.animation(animationClass); } }, duration: function (animationName, duration) { duration = duration || settings.duration; duration = typeof duration === 'number' ? duration + 'ms' : duration; if (duration || duration === 0) { module.verbose('Setting animation duration', duration); $module .css({ 'animation-duration': duration, }) ; } }, direction: function (direction) { direction = direction || module.get.direction(); if (direction === className.inward) { module.set.inward(); } else { module.set.outward(); } }, looping: function () { module.debug('Transition set to loop'); $module .addClass(className.looping) ; }, hidden: function () { $module .addClass(className.transition) .addClass(className.hidden) ; }, inward: function () { module.debug('Setting direction to inward'); $module .removeClass(className.outward) .addClass(className.inward) ; }, outward: function () { module.debug('Setting direction to outward'); $module .removeClass(className.inward) .addClass(className.outward) ; }, visible: function () { $module .addClass(className.transition) .addClass(className.visible) ; }, }, start: { animation: function (animationClass) { animationClass = animationClass || module.get.animationClass(); module.debug('Starting tween', animationClass); $module .addClass(animationClass) .one('animationend.complete' + eventNamespace, module.complete) ; if (settings.useFailSafe) { module.add.failSafe(); } module.set.duration(settings.duration); settings.onStart.call(element); }, }, save: { animation: function (animation) { if (!module.cache) { module.cache = {}; } module.cache.animation = animation; }, displayType: function (displayType) { if (displayType !== 'none') { $module.data(metadata.displayType, displayType); } }, transitionExists: function (animation, exists) { $.fn.transition.exists[animation] = exists; module.verbose('Saving existence of transition', animation, exists); }, }, restore: { conditions: function () { var animation = module.get.currentAnimation() ; if (animation) { $module .removeClass(animation) ; module.verbose('Removing animation class', module.cache); } module.remove.duration(); }, }, add: { failSafe: function () { var duration = module.get.duration() ; module.timer = setTimeout(function () { $module.triggerHandler('animationend'); }, duration + settings.failSafeDelay); module.verbose('Adding fail safe timer', module.timer); }, }, remove: { animating: function () { $module.removeClass(className.animating); }, animationCallbacks: function () { module.remove.queueCallback(); module.remove.completeCallback(); }, queueCallback: function () { $module.off('.queue' + eventNamespace); }, completeCallback: function () { $module.off('.complete' + eventNamespace); }, display: function () { $module.css('display', ''); }, direction: function () { $module .removeClass(className.inward) .removeClass(className.outward) ; }, duration: function () { $module .css('animation-duration', '') ; }, failSafe: function () { module.verbose('Removing fail safe timer', module.timer); if (module.timer) { clearTimeout(module.timer); } }, hidden: function () { $module.removeClass(className.hidden); }, visible: function () { $module.removeClass(className.visible); }, looping: function () { module.debug('Transitions are no longer looping'); if (module.is.looping()) { module.reset(); $module .removeClass(className.looping) ; } }, transition: function () { $module .removeClass(className.transition) .removeClass(className.visible) .removeClass(className.hidden) ; }, }, get: { settings: function (animation, duration, onComplete) { if (typeof animation === 'object') { // single settings object return $.extend(true, {}, $.fn.transition.settings, animation); } if (typeof onComplete === 'function') { // all arguments provided return $.extend({}, $.fn.transition.settings, { animation: animation, onComplete: onComplete, duration: duration, }); } if (typeof duration === 'string' || typeof duration === 'number') { // only duration provided return $.extend({}, $.fn.transition.settings, { animation: animation, duration: duration, }); } if (typeof duration === 'object') { // duration is actually settings object return $.extend({}, $.fn.transition.settings, duration, { animation: animation, }); } if (typeof duration === 'function') { // duration is actually callback return $.extend({}, $.fn.transition.settings, { animation: animation, onComplete: duration, }); } // only animation provided return $.extend({}, $.fn.transition.settings, { animation: animation, }); }, animationClass: function (animation) { var animationClass = animation || settings.animation, directionClass = module.can.transition() && !module.has.direction() ? module.get.direction() + ' ' : '' ; return className.animating + ' ' + className.transition + ' ' + directionClass + animationClass; }, currentAnimation: function () { return module.cache && module.cache.animation !== undefined ? module.cache.animation : false; }, currentDirection: function () { return module.is.inward() ? className.inward : className.outward; }, direction: function () { return module.is.hidden() || !module.is.visible() ? className.inward : className.outward; }, animationDirection: function (animation) { var direction ; animation = animation || settings.animation; if (typeof animation === 'string') { animation = animation.split(' '); // search animation name for out/in class $.each(animation, function (index, word) { if (word === className.inward) { direction = className.inward; } else if (word === className.outward) { direction = className.outward; } }); } // return found direction if (direction) { return direction; } return false; }, duration: function (duration) { duration = duration || settings.duration; if (duration === false) { duration = $module.css('animation-duration') || 0; } return typeof duration === 'string' ? (duration.indexOf('ms') > -1 ? parseFloat(duration) : parseFloat(duration) * 1000) : duration; }, displayType: function (shouldDetermine) { shouldDetermine = shouldDetermine !== undefined ? shouldDetermine : true; if (settings.displayType) { return settings.displayType; } if (shouldDetermine && $module.data(metadata.displayType) === undefined) { var currentDisplay = $module.css('display'); if (currentDisplay === '' || currentDisplay === 'none') { // create fake element to determine display state module.can.transition(true); } else { module.save.displayType(currentDisplay); } } return $module.data(metadata.displayType); }, userStyle: function (style) { style = style || $module.attr('style') || ''; return style.replace(/display.*?;/, ''); }, transitionExists: function (animation) { return $.fn.transition.exists[animation]; }, }, can: { transition: function (forced) { var animation = settings.animation, transitionExists = module.get.transitionExists(animation), displayType = module.get.displayType(false), elementClass, tagName, $clone, currentAnimation, inAnimation, directionExists ; if (transitionExists === undefined || forced) { module.verbose('Determining whether animation exists'); elementClass = $module.attr('class'); tagName = $module.prop('tagName'); $clone = $('<' + tagName + ' />').addClass(elementClass).insertAfter($module); currentAnimation = $clone .addClass(animation) .removeClass(className.inward) .removeClass(className.outward) .addClass(className.animating) .addClass(className.transition) .css('animationName') ; $clone.detach().insertAfter($module); inAnimation = $clone .addClass(className.inward) .css('animationName') ; if (!displayType) { $clone.detach().insertAfter($module); displayType = $clone .attr('class', elementClass) .removeAttr('style') .removeClass(className.hidden) .removeClass(className.visible) .show() .css('display') ; module.verbose('Determining final display state', displayType); module.save.displayType(displayType); } $clone.remove(); if (currentAnimation !== inAnimation) { module.debug('Direction exists for animation', animation); directionExists = true; } else if (currentAnimation === 'none' || !currentAnimation) { module.debug('No animation defined in css', animation); return; } else { module.debug('Static animation found', animation, displayType); directionExists = false; } module.save.transitionExists(animation, directionExists); } return transitionExists !== undefined ? transitionExists : directionExists; }, animate: function () { // can transition does not return a value if animation does not exist return module.can.transition() !== undefined; }, }, is: { animating: function () { return $module.hasClass(className.animating); }, inward: function () { return $module.hasClass(className.inward); }, outward: function () { return $module.hasClass(className.outward); }, looping: function () { return $module.hasClass(className.looping); }, occurring: function (animation) { animation = animation || settings.animation; animation = '.' + animation.replace(' ', '.'); return $module.filter(animation).length > 0; }, visible: function () { return $module.is(':visible'); }, hidden: function () { return $module.css('visibility') === 'hidden'; }, supported: function () { // keep method for backward compatibility until 2.10.0 return true; }, }, hide: function () { if (settings.onHide.call(element) === false) { module.verbose('Hide callback returned false cancelling hide'); return false; } module.verbose('Hiding element'); if (module.is.animating()) { module.reset(); } element.blur(); // IE will trigger focus change if element is not blurred before hiding module.remove.display(); module.remove.visible(); settings.onBeforeHide.call(element, module.hideNow); }, hideNow: function () { module.set.hidden(); module.force.hidden(); settings.onHidden.call(element); settings.onComplete.call(element); }, show: function (display) { if (module.force.visible() && settings.onShow.call(element) !== false) { module.verbose('Showing element', display); module.remove.hidden(); settings.onBeforeShow.call(element, module.showNow); } }, showNow: function () { module.set.visible(); settings.onVisible.call(element); settings.onComplete.call(element); }, toggle: function () { if (module.is.visible()) { module.hide(); } else { module.show(); } }, stop: function () { module.debug('Stopping current animation'); $module.triggerHandler('animationend'); }, stopAll: function () { module.debug('Stopping all animation'); module.remove.queueCallback(); $module.triggerHandler('animationend'); }, clear: { queue: function () { module.debug('Clearing animation queue'); module.remove.queueCallback(); }, }, enable: function () { module.verbose('Starting animation'); $module.removeClass(className.disabled); }, disable: function () { module.debug('Stopping animation'); $module.addClass(className.disabled); }, setting: function (name, value) { module.debug('Changing setting', name, value); if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { if ($.isPlainObject(settings[name])) { $.extend(true, settings[name], value); } else { settings[name] = value; } } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if ($allModules.length > 1) { title += ' (' + $allModules.length + ')'; } if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, // modified for transition to return invoke success invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found !== undefined ? found : false; }, }; module.initialize(); }); return returnedValue !== undefined ? returnedValue : this; }; // Records if CSS transition is available $.fn.transition.exists = {}; $.fn.transition.settings = { // module info name: 'Transition', // hide all output from this component regardless of other settings silent: false, // debug content outputted to console debug: false, // verbose debug output verbose: false, // performance data output performance: true, // event namespace namespace: 'transition', // delay between animations in group interval: 0, // whether group animations should be reversed reverse: 'auto', // animation callback event onStart: function () {}, onComplete: function () {}, onShow: function () {}, onBeforeShow: function (callback) { callback.call(this); }, onVisible: function () {}, onHide: function () {}, onHidden: function () {}, onBeforeHide: function (callback) { callback.call(this); }, // whether timeout should be used to ensure callback fires in cases animationend does not useFailSafe: true, // delay in ms for fail safe failSafeDelay: 100, // whether EXACT animation can occur twice in a row allowRepeats: false, // Override final display type on visible displayType: false, // animation duration animation: 'fade', duration: false, // new animations will occur after previous ones queue: true, // whether initially inline hidden objects should be skipped for transition skipInlineHidden: false, metadata: { displayType: 'display', }, className: { animating: 'animating', disabled: 'disabled', hidden: 'hidden', inward: 'in', loading: 'loading', looping: 'looping', outward: 'out', transition: 'transition', visible: 'visible', }, // possible errors error: { noAnimation: 'Element is no longer attached to DOM. Unable to animate. Use silent setting to suppress this warning in production.', }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/components/visibility.js ================================================ /*! * # Fomantic-UI 2.9.4 - Visibility * https://github.com/fomantic/Fomantic-UI/ * * * Released under the MIT license * https://opensource.org/licenses/MIT * */ (function ($, window, document) { 'use strict'; function isFunction(obj) { return typeof obj === 'function' && typeof obj.nodeType !== 'number'; } window = window !== undefined && window.Math === Math ? window : globalThis; $.fn.visibility = function (parameters) { var $allModules = $(this), time = Date.now(), performance = [], query = arguments[0], methodInvoked = typeof query === 'string', queryArguments = [].slice.call(arguments, 1), contextCheck = function (context, win) { var $context; if ([window, document].indexOf(context) >= 0) { $context = $(context); } else { $context = $(win.document).find(context); if ($context.length === 0) { $context = win.frameElement ? contextCheck(context, win.parent) : window; } } return $context; }, returnedValue, moduleCount = $allModules.length, loadedCount = 0 ; $allModules.each(function () { var settings = $.isPlainObject(parameters) ? $.extend(true, {}, $.fn.visibility.settings, parameters) : $.extend({}, $.fn.visibility.settings), className = settings.className, namespace = settings.namespace, error = settings.error, metadata = settings.metadata, eventNamespace = '.' + namespace, moduleNamespace = 'module-' + namespace, $window = $(window), $module = $(this), $context = contextCheck(settings.context, window), $placeholder, instance = $module.data(moduleNamespace), element = this, disabled = false, contextObserver, observer, module ; module = { initialize: function () { module.debug('Initializing', settings); module.setup.cache(); if (module.should.trackChanges()) { if (settings.type === 'image') { module.setup.image(); } if (settings.type === 'fixed') { module.setup.fixed(); } if (settings.observeChanges) { module.observeChanges(); } module.bind.events(); } module.save.position(); if (!module.is.visible()) { module.error(error.visible, $module); } if (settings.initialCheck) { module.checkVisibility(); } module.instantiate(); }, instantiate: function () { module.debug('Storing instance', module); $module .data(moduleNamespace, module) ; instance = module; }, destroy: function () { module.verbose('Destroying previous module'); if (observer) { observer.disconnect(); } if (contextObserver) { contextObserver.disconnect(); } $window .off('load' + eventNamespace, module.event.load) .off('resize' + eventNamespace, module.event.resize) ; $context .off('scroll' + eventNamespace, module.event.scroll) .off('scrollchange' + eventNamespace, module.event.scrollchange) ; if (settings.type === 'fixed') { module.resetFixed(); module.remove.placeholder(); } $module .off(eventNamespace) .removeData(moduleNamespace) ; }, observeChanges: function () { if ('MutationObserver' in window) { contextObserver = new MutationObserver(module.event.contextChanged); observer = new MutationObserver(module.event.changed); contextObserver.observe(document, { childList: true, subtree: true, }); observer.observe(element, { childList: true, subtree: true, }); module.debug('Setting up mutation observer', observer); } }, bind: { events: function () { module.verbose('Binding visibility events to scroll and resize'); if (settings.refreshOnLoad) { $window .on('load' + eventNamespace, module.event.load) ; } $window .on('resize' + eventNamespace, module.event.resize) ; // pub/sub pattern $context .off('scroll' + eventNamespace) .on('scroll' + eventNamespace, module.event.scroll) .on('scrollchange' + eventNamespace, module.event.scrollchange) ; }, }, event: { changed: function (mutations) { module.verbose('DOM tree modified, updating visibility calculations'); module.timer = setTimeout(function () { module.verbose('DOM tree modified, updating sticky menu'); module.refresh(); }, 100); }, contextChanged: function (mutations) { [].forEach.call(mutations, function (mutation) { if (mutation.removedNodes) { [].forEach.call(mutation.removedNodes, function (node) { if (node === element || $(node).find(element).length > 0) { module.debug('Element removed from DOM, tearing down events'); module.destroy(); } }); } }); }, resize: function () { module.debug('Window resized'); if (settings.refreshOnResize) { requestAnimationFrame(module.refresh); } }, load: function () { module.debug('Page finished loading'); requestAnimationFrame(module.refresh); }, // publishes scrollchange event on one scroll scroll: function () { if (settings.throttle) { clearTimeout(module.timer); module.timer = setTimeout(function () { $context.triggerHandler('scrollchange' + eventNamespace, [$context.scrollTop()]); }, settings.throttle); } else { requestAnimationFrame(function () { $context.triggerHandler('scrollchange' + eventNamespace, [$context.scrollTop()]); }); } }, // subscribes to scrollchange scrollchange: function (event, scrollPosition) { module.checkVisibility(scrollPosition); }, }, precache: function (images, callback) { if (!Array.isArray(images)) { images = [images]; } var imagesLength = images.length, loadedCounter = 0, cache = [], cacheImage = document.createElement('img'), handleLoad = function () { loadedCounter++; if (loadedCounter >= images.length) { if (isFunction(callback)) { callback(); } } } ; while (imagesLength--) { cacheImage = document.createElement('img'); cacheImage.addEventListener('load', handleLoad); cacheImage.addEventListener('error', handleLoad); cacheImage.src = images[imagesLength]; cache.push(cacheImage); } }, enableCallbacks: function () { module.debug('Allowing callbacks to occur'); disabled = false; }, disableCallbacks: function () { module.debug('Disabling all callbacks temporarily'); disabled = true; }, should: { trackChanges: function () { if (methodInvoked) { module.debug('One time query, no need to bind events'); return false; } module.debug('Callbacks being attached'); return true; }, }, setup: { cache: function () { module.cache = { occurred: {}, screen: {}, element: {}, }; }, image: function () { var src = $module.data(metadata.src) ; if (src) { module.verbose('Lazy loading image', src); settings.once = true; settings.observeChanges = false; // show when top visible settings.onOnScreen = function () { module.debug('Image on screen', element); module.precache(src, function () { module.set.image(src, function () { loadedCount++; if (loadedCount === moduleCount) { settings.onAllLoaded.call(this); } settings.onLoad.call(this); }); }); }; } }, fixed: function () { module.debug('Setting up fixed'); settings.once = false; settings.observeChanges = false; settings.initialCheck = true; settings.refreshOnLoad = true; if (!parameters.transition) { settings.transition = false; } module.create.placeholder(); module.debug('Added placeholder', $placeholder); settings.onTopPassed = function () { module.debug('Element passed, adding fixed position', $module); module.show.placeholder(); module.set.fixed(); if (settings.transition) { if ($.fn.transition !== undefined) { $module.transition(settings.transition, settings.duration); } } }; settings.onTopPassedReverse = function () { module.debug('Element returned to position, removing fixed', $module); module.hide.placeholder(); module.remove.fixed(); }; }, }, create: { placeholder: function () { module.verbose('Creating fixed position placeholder'); $placeholder = $module .clone(false) .css('display', 'none') .addClass(className.placeholder) .insertAfter($module) ; }, }, show: { placeholder: function () { module.verbose('Showing placeholder'); $placeholder .css('display', 'block') .css('visibility', 'hidden') ; }, }, hide: { placeholder: function () { module.verbose('Hiding placeholder'); $placeholder .css('display', 'none') .css('visibility', '') ; }, }, set: { fixed: function () { module.verbose('Setting element to fixed position'); $module .addClass(className.fixed) .css({ position: 'fixed', top: settings.offset + 'px', left: 'auto', zIndex: settings.zIndex, }) ; settings.onFixed.call(element); }, image: function (src, callback) { $module .attr('src', src) ; if (settings.transition) { if ($.fn.transition !== undefined) { if ($module.hasClass(className.visible)) { module.debug('Transition already occurred on this image, skipping animation'); return; } $module.transition(settings.transition, settings.duration, callback); } else { $module.fadeIn(settings.duration, callback); } } else { $module.show(); } }, }, is: { onScreen: function () { var calculations = module.get.elementCalculations() ; return calculations.onScreen; }, offScreen: function () { var calculations = module.get.elementCalculations() ; return calculations.offScreen; }, visible: function () { if (module.cache && module.cache.element) { return !(module.cache.element.width === 0 && module.cache.element.offset.top === 0); } return false; }, verticallyScrollableContext: function () { var overflowY = $context[0] !== window ? $context.css('overflow-y') : false ; return overflowY === 'auto' || overflowY === 'scroll'; }, horizontallyScrollableContext: function () { var overflowX = $context[0] !== window ? $context.css('overflow-x') : false ; return overflowX === 'auto' || overflowX === 'scroll'; }, }, refresh: function () { module.debug('Refreshing constants (width/height)'); if (settings.type === 'fixed') { module.resetFixed(); } module.reset(); module.save.position(); if (settings.checkOnRefresh) { module.checkVisibility(); } settings.onRefresh.call(element); }, resetFixed: function () { module.remove.fixed(); module.remove.occurred(); }, reset: function () { module.verbose('Resetting all cached values'); if ($.isPlainObject(module.cache)) { module.cache.screen = {}; module.cache.element = {}; } }, checkVisibility: function (scroll) { module.verbose('Checking visibility of element', module.cache.element); if (!disabled && module.is.visible()) { // save scroll position module.save.scroll(scroll); // update calculations derived from scroll module.save.calculations(); // percentage module.passed(); // reverse (must be first) module.passingReverse(); module.topVisibleReverse(); module.bottomVisibleReverse(); module.topPassedReverse(); module.bottomPassedReverse(); // one time module.onScreen(); module.offScreen(); module.passing(); module.topVisible(); module.bottomVisible(); module.topPassed(); module.bottomPassed(); // on update callback if (settings.onUpdate) { settings.onUpdate.call(element, module.get.elementCalculations()); } } }, passed: function (amount, newCallback) { var calculations = module.get.elementCalculations() ; // assign callback if (amount && newCallback) { settings.onPassed[amount] = newCallback; } else if (amount !== undefined) { return module.get.pixelsPassed(amount) > calculations.pixelsPassed; } else if (calculations.passing) { $.each(settings.onPassed, function (amount, callback) { if (calculations.bottomVisible || calculations.pixelsPassed > module.get.pixelsPassed(amount)) { module.execute(callback, amount); } else if (!settings.once) { module.remove.occurred(callback); } }); } }, onScreen: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onOnScreen, callbackName = 'onScreen' ; if (newCallback) { module.debug('Adding callback for onScreen', newCallback); settings.onOnScreen = newCallback; } if (calculations.onScreen) { module.execute(callback, callbackName); } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback !== undefined) { return calculations.onOnScreen; } }, offScreen: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onOffScreen, callbackName = 'offScreen' ; if (newCallback) { module.debug('Adding callback for offScreen', newCallback); settings.onOffScreen = newCallback; } if (calculations.offScreen) { module.execute(callback, callbackName); } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback !== undefined) { return calculations.onOffScreen; } }, passing: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onPassing, callbackName = 'passing' ; if (newCallback) { module.debug('Adding callback for passing', newCallback); settings.onPassing = newCallback; } if (calculations.passing) { module.execute(callback, callbackName); } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback !== undefined) { return calculations.passing; } }, topVisible: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onTopVisible, callbackName = 'topVisible' ; if (newCallback) { module.debug('Adding callback for top visible', newCallback); settings.onTopVisible = newCallback; } if (calculations.topVisible) { module.execute(callback, callbackName); } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback === undefined) { return calculations.topVisible; } }, bottomVisible: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onBottomVisible, callbackName = 'bottomVisible' ; if (newCallback) { module.debug('Adding callback for bottom visible', newCallback); settings.onBottomVisible = newCallback; } if (calculations.bottomVisible) { module.execute(callback, callbackName); } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback === undefined) { return calculations.bottomVisible; } }, topPassed: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onTopPassed, callbackName = 'topPassed' ; if (newCallback) { module.debug('Adding callback for top passed', newCallback); settings.onTopPassed = newCallback; } if (calculations.topPassed) { module.execute(callback, callbackName); } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback === undefined) { return calculations.topPassed; } }, bottomPassed: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onBottomPassed, callbackName = 'bottomPassed' ; if (newCallback) { module.debug('Adding callback for bottom passed', newCallback); settings.onBottomPassed = newCallback; } if (calculations.bottomPassed) { module.execute(callback, callbackName); } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback === undefined) { return calculations.bottomPassed; } }, passingReverse: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onPassingReverse, callbackName = 'passingReverse' ; if (newCallback) { module.debug('Adding callback for passing reverse', newCallback); settings.onPassingReverse = newCallback; } if (!calculations.passing) { if (module.get.occurred('passing')) { module.execute(callback, callbackName); } } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback !== undefined) { return !calculations.passing; } }, topVisibleReverse: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onTopVisibleReverse, callbackName = 'topVisibleReverse' ; if (newCallback) { module.debug('Adding callback for top visible reverse', newCallback); settings.onTopVisibleReverse = newCallback; } if (!calculations.topVisible) { if (module.get.occurred('topVisible')) { module.execute(callback, callbackName); } } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback === undefined) { return !calculations.topVisible; } }, bottomVisibleReverse: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onBottomVisibleReverse, callbackName = 'bottomVisibleReverse' ; if (newCallback) { module.debug('Adding callback for bottom visible reverse', newCallback); settings.onBottomVisibleReverse = newCallback; } if (!calculations.bottomVisible) { if (module.get.occurred('bottomVisible')) { module.execute(callback, callbackName); } } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback === undefined) { return !calculations.bottomVisible; } }, topPassedReverse: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onTopPassedReverse, callbackName = 'topPassedReverse' ; if (newCallback) { module.debug('Adding callback for top passed reverse', newCallback); settings.onTopPassedReverse = newCallback; } if (!calculations.topPassed) { if (module.get.occurred('topPassed')) { module.execute(callback, callbackName); } } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback === undefined) { return !calculations.onTopPassed; } }, bottomPassedReverse: function (newCallback) { var calculations = module.get.elementCalculations(), callback = newCallback || settings.onBottomPassedReverse, callbackName = 'bottomPassedReverse' ; if (newCallback) { module.debug('Adding callback for bottom passed reverse', newCallback); settings.onBottomPassedReverse = newCallback; } if (!calculations.bottomPassed) { if (module.get.occurred('bottomPassed')) { module.execute(callback, callbackName); } } else if (!settings.once) { module.remove.occurred(callbackName); } if (newCallback === undefined) { return !calculations.bottomPassed; } }, execute: function (callback, callbackName) { var calculations = module.get.elementCalculations(), screen = module.get.screenCalculations() ; callback = callback || false; if (callback) { if (settings.continuous) { module.debug('Callback being called continuously', callbackName, calculations); callback.call(element, calculations, screen); } else if (!module.get.occurred(callbackName)) { module.debug('Conditions met', callbackName, calculations); callback.call(element, calculations, screen); } } module.save.occurred(callbackName); }, remove: { fixed: function () { module.debug('Removing fixed position'); $module .removeClass(className.fixed) .css({ position: '', top: '', left: '', zIndex: '', }) ; settings.onUnfixed.call(element); }, placeholder: function () { module.debug('Removing placeholder content'); if ($placeholder) { $placeholder.remove(); } }, occurred: function (callback) { if (callback) { var occurred = module.cache.occurred ; if (occurred[callback] !== undefined && occurred[callback] === true) { module.debug('Callback can now be called again', callback); module.cache.occurred[callback] = false; } } else { module.cache.occurred = {}; } }, }, save: { calculations: function () { module.verbose('Saving all calculations necessary to determine positioning'); module.save.direction(); module.save.screenCalculations(); module.save.elementCalculations(); }, occurred: function (callback) { if (callback) { if (module.cache.occurred[callback] === undefined || (module.cache.occurred[callback] !== true)) { module.verbose('Saving callback occurred', callback); module.cache.occurred[callback] = true; } } }, scroll: function (scrollPosition) { scrollPosition = scrollPosition + settings.offset || $context.scrollTop() + settings.offset; module.cache.scroll = scrollPosition; }, direction: function () { var scroll = module.get.scroll(), lastScroll = module.get.lastScroll(), direction ; if (scroll > lastScroll && lastScroll) { direction = 'down'; } else if (scroll < lastScroll && lastScroll) { direction = 'up'; } else { direction = 'static'; } module.cache.direction = direction; return module.cache.direction; }, elementPosition: function () { var element = module.cache.element, screen = module.get.screenSize() ; module.verbose('Saving element position'); // (quicker than $.extend) element.fits = element.height < screen.height; element.offset = $module.offset(); element.width = $module.outerWidth(); element.height = $module.outerHeight(); // compensate for scroll in context if (module.is.verticallyScrollableContext()) { element.offset.top += $context.scrollTop() - $context.offset().top; } if (module.is.horizontallyScrollableContext()) { element.offset.left += $context.scrollLeft() - $context.offset().left; } // store module.cache.element = element; return element; }, elementCalculations: function () { var screen = module.get.screenCalculations(), element = module.get.elementPosition() ; // offset if (settings.includeMargin) { element.margin = {}; element.margin.top = parseInt($module.css('margin-top'), 10); element.margin.bottom = parseInt($module.css('margin-bottom'), 10); element.top = element.offset.top - element.margin.top; element.bottom = element.offset.top + element.height + element.margin.bottom; } else { element.top = element.offset.top; element.bottom = element.offset.top + element.height; } // visibility element.topPassed = screen.top >= element.top; element.bottomPassed = screen.top >= element.bottom; element.topVisible = (screen.bottom >= element.top) && !element.topPassed; element.bottomVisible = (screen.bottom >= element.bottom) && !element.bottomPassed; element.pixelsPassed = 0; element.percentagePassed = 0; // meta calculations element.onScreen = (element.topVisible || element.passing) && !element.bottomPassed; element.passing = element.topPassed && !element.bottomPassed; element.offScreen = !element.onScreen; // passing calculations if (element.passing) { element.pixelsPassed = screen.top - element.top; element.percentagePassed = (screen.top - element.top) / element.height; } module.cache.element = element; module.verbose('Updated element calculations', element); return element; }, screenCalculations: function () { var scroll = module.get.scroll() ; module.save.direction(); module.cache.screen.top = scroll; module.cache.screen.bottom = scroll + module.cache.screen.height; return module.cache.screen; }, screenSize: function () { module.verbose('Saving window position'); module.cache.screen = { height: $context.height(), }; }, position: function () { module.save.screenSize(); module.save.elementPosition(); }, }, get: { pixelsPassed: function (amount) { var element = module.get.elementCalculations() ; if (amount.search('%') > -1) { return element.height * (parseInt(amount, 10) / 100); } return parseInt(amount, 10); }, occurred: function (callback) { return module.cache.occurred !== undefined ? module.cache.occurred[callback] || false : false; }, direction: function () { if (module.cache.direction === undefined) { module.save.direction(); } return module.cache.direction; }, elementPosition: function () { if (module.cache.element === undefined) { module.save.elementPosition(); } return module.cache.element; }, elementCalculations: function () { if (module.cache.element === undefined) { module.save.elementCalculations(); } return module.cache.element; }, screenCalculations: function () { if (module.cache.screen === undefined) { module.save.screenCalculations(); } return module.cache.screen; }, screenSize: function () { if (module.cache.screen === undefined) { module.save.screenSize(); } return module.cache.screen; }, scroll: function () { if (module.cache.scroll === undefined) { module.save.scroll(); } return module.cache.scroll; }, lastScroll: function () { if (module.cache.screen === undefined) { module.debug('First scroll event, no last scroll could be found'); return false; } return module.cache.screen.top; }, }, setting: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, settings, name); } else if (value !== undefined) { settings[name] = value; } else { return settings[name]; } }, internal: function (name, value) { if ($.isPlainObject(name)) { $.extend(true, module, name); } else if (value !== undefined) { module[name] = value; } else { return module[name]; } }, debug: function () { if (!settings.silent && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.debug.apply(console, arguments); } } }, verbose: function () { if (!settings.silent && settings.verbose && settings.debug) { if (settings.performance) { module.performance.log(arguments); } else { module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); module.verbose.apply(console, arguments); } } }, error: function () { if (!settings.silent) { module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); module.error.apply(console, arguments); } }, performance: { log: function (message) { var currentTime, executionTime, previousTime ; if (settings.performance) { currentTime = Date.now(); previousTime = time || currentTime; executionTime = currentTime - previousTime; time = currentTime; performance.push({ Name: message[0], Arguments: [].slice.call(message, 1) || '', Element: element, 'Execution Time': executionTime, }); } clearTimeout(module.performance.timer); module.performance.timer = setTimeout(function () { module.performance.display(); }, 500); }, display: function () { var title = settings.name + ':', totalTime = 0 ; time = false; clearTimeout(module.performance.timer); $.each(performance, function (index, data) { totalTime += data['Execution Time']; }); title += ' ' + totalTime + 'ms'; if (performance.length > 0) { console.groupCollapsed(title); if (console.table) { console.table(performance); } else { $.each(performance, function (index, data) { console.log(data.Name + ': ' + data['Execution Time'] + 'ms'); }); } console.groupEnd(); } performance = []; }, }, invoke: function (query, passedArguments, context) { var object = instance, maxDepth, found, response ; passedArguments = passedArguments || queryArguments; context = context || element; if (typeof query === 'string' && object !== undefined) { query = query.split(/[ .]/); maxDepth = query.length - 1; $.each(query, function (depth, value) { var camelCaseValue = depth !== maxDepth ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) : query ; if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) { object = object[camelCaseValue]; } else if (object[camelCaseValue] !== undefined) { found = object[camelCaseValue]; return false; } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) { object = object[value]; } else if (object[value] !== undefined) { found = object[value]; return false; } else { module.error(error.method, query); return false; } }); } if (isFunction(found)) { response = found.apply(context, passedArguments); } else if (found !== undefined) { response = found; } if (Array.isArray(returnedValue)) { returnedValue.push(response); } else if (returnedValue !== undefined) { returnedValue = [returnedValue, response]; } else if (response !== undefined) { returnedValue = response; } return found; }, }; if (methodInvoked) { if (instance === undefined) { module.initialize(); } instance.save.scroll(); instance.save.calculations(); module.invoke(query); } else { if (instance !== undefined) { instance.invoke('destroy'); } module.initialize(); } }); return returnedValue !== undefined ? returnedValue : this; }; $.fn.visibility.settings = { name: 'Visibility', namespace: 'visibility', debug: false, verbose: false, performance: true, // whether to use mutation observers to follow changes observeChanges: true, // check position immediately on init initialCheck: true, // whether to refresh calculations after all page images load refreshOnLoad: true, // whether to refresh calculations after page resize event refreshOnResize: true, // should call callbacks on refresh event (resize, etc) checkOnRefresh: true, // callback should only occur one time once: true, // callback should fire continuously when evaluates to true continuous: false, // offset to use with scroll top offset: 0, // whether to include margin in elements position includeMargin: false, // scroll context for visibility checks context: window, // visibility check delay in ms (defaults to animationFrame) throttle: false, // special visibility type (image, fixed) type: false, // z-index to use with visibility 'fixed' zIndex: '10', // image only animation settings transition: 'fade in', duration: 1000, // array of callbacks for percentage onPassed: {}, // standard callbacks onOnScreen: false, onOffScreen: false, onPassing: false, onTopVisible: false, onBottomVisible: false, onTopPassed: false, onBottomPassed: false, // reverse callbacks onPassingReverse: false, onTopVisibleReverse: false, onBottomVisibleReverse: false, onTopPassedReverse: false, onBottomPassedReverse: false, // special callbacks for image onLoad: function () {}, onAllLoaded: function () {}, // special callbacks for fixed position onFixed: function () {}, onUnfixed: function () {}, // utility callbacks onUpdate: false, // disabled by default for performance onRefresh: function () {}, metadata: { src: 'src', }, className: { fixed: 'fixed', placeholder: 'constraint', visible: 'visible', }, error: { method: 'The method you called is not defined.', visible: 'Element is hidden, you must call refresh after element becomes visible', }, }; })(jQuery, window, document); ================================================ FILE: assets/vendors/fomantic-ui/themes/basic/assets/fonts/LICENSE.txt ================================================ This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. ================================================ FILE: assets/vendors/fomantic-ui/themes/default/assets/fonts/LICENSE_Lato.txt ================================================ Copyright (c) 2010-2015, Łukasz Dziedzic (dziedzic@typoland.com), with Reserved Font Name Lato. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. ================================================ FILE: assets/vendors/fomantic-ui/themes/default/assets/fonts/LICENSE_icons.txt ================================================ Fonticons, Inc. (https://fontawesome.com) -------------------------------------------------------------------------------- Font Awesome Free License Font Awesome Free is free, open source, and GPL friendly. You can use it for commercial projects, open source projects, or really almost whatever you want. Full Font Awesome Free license: https://fontawesome.com/license/free. -------------------------------------------------------------------------------- # Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) The Font Awesome Free download is licensed under a Creative Commons Attribution 4.0 International License and applies to all icons packaged as SVG and JS file types. -------------------------------------------------------------------------------- # Fonts: SIL OFL 1.1 License In the Font Awesome Free download, the SIL OFL license applies to all icons packaged as web and desktop font files. Copyright (c) 2023 Fonticons, Inc. (https://fontawesome.com) with Reserved Font Name: "Font Awesome". This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting — in part or in whole — any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. -------------------------------------------------------------------------------- # Code: MIT License (https://opensource.org/licenses/MIT) In the Font Awesome Free download, the MIT license applies to all non-font and non-icon files. Copyright 2023 Fonticons, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- # Attribution Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font Awesome Free files already contain embedded comments with sufficient attribution, so you shouldn't need to do anything additional when using these files normally. We've kept attribution comments terse, so we ask that you do not actively work to remove them from files, especially code. They're a great way for folks to learn about Font Awesome. -------------------------------------------------------------------------------- # Brand Icons All brand icons are trademarks of their respective owners. The use of these trademarks does not indicate endorsement of the trademark holder by Font Awesome, nor vice versa. **Please do not use brand logos for any purpose except to represent the company, product, or service to which they refer.** ================================================ FILE: assets/vendors/fomantic-ui/themes/github/assets/fonts/LICENSE.txt ================================================ (c) 2012-2015 GitHub with Reserved Font Name Opticons. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. ================================================ FILE: assets/vendors/fomantic-ui/themes/material/assets/fonts/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: assets/vendors/friendcircle/amrParse.js ================================================ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BenzAMRRecorder = factory()); })(this, (function () { function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; var recorder_build = {exports: {}}; (function (module, exports) { (function (global, factory) { module.exports = factory() ; }(commonjsGlobal, (function () { var recorderWorker = function () { var recLength = 0, recBuffersL = [], recBuffersR = [], sampleRate; self.onmessage = function (e) { switch (e.data.command) { case 'init': init(e.data.config); break; case 'record': record(e.data.buffer); break; case 'exportWAV': exportWAV(e.data.type); break; case 'getBuffer': getBuffer(); break; case 'clear': clear(); break; } }; function init(config) { sampleRate = config.sampleRate; } function record(inputBuffer) { recBuffersL.push(inputBuffer[0]); recBuffersR.push(inputBuffer[1]); recLength += inputBuffer[0].length; } function exportWAV(type) { var bufferL = mergeBuffers(recBuffersL, recLength); var bufferR = mergeBuffers(recBuffersR, recLength); var interleaved = interleave(bufferL, bufferR); var dataview = encodeWAV(interleaved); var audioBlob = new Blob([dataview], {type: type}); self.postMessage({ type: 'blob', data: audioBlob }); } function getBuffer() { var buffers = []; buffers.push(mergeBuffers(recBuffersL, recLength)); buffers.push(mergeBuffers(recBuffersR, recLength)); self.postMessage({ type: 'buffer', data: buffers }); } function clear() { recLength = 0; recBuffersL = []; recBuffersR = []; } function mergeBuffers(recBuffers, recLength) { var result = new Float32Array(recLength); var offset = 0; for (var i = 0; i < recBuffers.length; i++) { result.set(recBuffers[i], offset); offset += recBuffers[i].length; } return result; } function interleave(inputL, inputR) { var length = inputL.length + inputR.length; var result = new Float32Array(length); var index = 0, inputIndex = 0; while (index < length) { result[index++] = inputL[inputIndex]; result[index++] = inputR[inputIndex]; inputIndex++; } return result; } function floatTo16BitPCM(output, offset, input) { for (var i = 0; i < input.length; i++, offset += 2) { var s = Math.max(-1, Math.min(1, input[i])); output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); } } function writeString(view, offset, string) { for (var i = 0; i < string.length; i++) { view.setUint8(offset + i, string.charCodeAt(i)); } } function encodeWAV(samples) { var buffer = new ArrayBuffer(44 + samples.length * 2); var view = new DataView(buffer); /* RIFF identifier */ writeString(view, 0, 'RIFF'); /* RIFF chunk length */ view.setUint32(4, 36 + samples.length * 2, true); /* RIFF type */ writeString(view, 8, 'WAVE'); /* format chunk identifier */ writeString(view, 12, 'fmt '); /* format chunk length */ view.setUint32(16, 16, true); /* sample format (raw) */ view.setUint16(20, 1, true); /* channel count */ view.setUint16(22, 2, true); /* sample rate */ view.setUint32(24, sampleRate, true); /* byte rate (sample rate * block align) */ view.setUint32(28, sampleRate * 4, true); /* block align (channel count * bytes per sample) */ view.setUint16(32, 4, true); /* bits per sample */ view.setUint16(34, 16, true); /* data chunk identifier */ writeString(view, 36, 'data'); /* data chunk length */ view.setUint32(40, samples.length * 2, true); floatTo16BitPCM(view, 44, samples); return view; } }; var recorderWorkerStr = recorderWorker.toString() .replace(/^\s*function.*?\(\)\s*{/, '') .replace(/}\s*$/, ''); // var WORKER_PATH = './recorderWorker.js'; var Recorder = function(source, cfg){ var config = cfg || {}; var bufferLen = config.bufferLen || 4096; this.context = source.context; this.node = (this.context.createScriptProcessor || this.context.createJavaScriptNode).call(this.context, bufferLen, 2, 2); var worker = new Worker((window.URL || window.webkitURL).createObjectURL(new Blob([recorderWorkerStr], {type:"text/javascript"}))); worker.onmessage = function(e){ if (e.data.type === 'blob') { currCallbackWithBlob(e.data.data); } else { currCallbackWithBuffer(e.data.data); } }; worker.postMessage({ command: 'init', config: { sampleRate: this.context.sampleRate } }); var recording = false, currCallbackWithBuffer, currCallbackWithBlob; this.node.onaudioprocess = function(e){ if (!recording) return; worker.postMessage({ command: 'record', buffer: [ e.inputBuffer.getChannelData(0), e.inputBuffer.getChannelData(1) ] }); }; this.configure = function(cfg){ for (var prop in cfg){ if (cfg.hasOwnProperty(prop)){ config[prop] = cfg[prop]; } } }; this.record = function(){ recording = true; }; this.stop = function(){ recording = false; }; this.clear = function(){ worker.postMessage({ command: 'clear' }); }; this.getBuffer = function(cb) { currCallbackWithBuffer = cb || config.callback; worker.postMessage({ command: 'getBuffer' }); }; this.exportWAV = function(cb, type){ currCallbackWithBlob = cb || config.callback; type = type || config.type || 'audio/wav'; if (!currCallbackWithBlob) throw new Error('Callback not set'); worker.postMessage({ command: 'exportWAV', type: type }); }; this.release = function() { this.stop(); this.clear(); this.configure = this.record = this.stop = this.clear = this.getBuffer = this.exportWAV = function () {}; source.disconnect(this.node); this.node.onaudioprocess = null; this.node.disconnect(); worker.terminate(); }; source.connect(this.node); this.node.connect(this.context.destination); //this should not be necessary }; Recorder.forceDownload = function(blob, filename){ var url = (window.URL || window.webkitURL).createObjectURL(blob); var link = window.document.createElement('a'); link.href = url; link.download = filename || 'output.wav'; var click = document.createEvent("Event"); click.initEvent("click", true, true); link.dispatchEvent(click); }; var recorder = Recorder; return recorder; }))); } (recorder_build)); var Recorder = recorder_build.exports; var AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext; var ctx = null; var isSupport = true; if (!AudioContext) { isSupport = false; console.warn('Web Audio API is Unsupported.'); } var RecorderControl = /*#__PURE__*/ function () { function RecorderControl() { _classCallCheck(this, RecorderControl); this._recorderStream = null; this._recorderStreamSourceNode = null; this._recorder = null; this._isRecording = false; this._curSourceNode = null; } _createClass(RecorderControl, [{ key: "playPcm", value: function playPcm(samples, sampleRate, onEnded, startPos) { if (!ctx || ctx.state === 'closed') { ctx = new AudioContext(); } if (ctx.state === 'interrupted' || ctx.state === 'suspended') { ctx.resume(); } sampleRate = sampleRate || 8000; this.stopPcm(); var _samples = startPos && startPos > 0.001 ? // 根据开始位置(秒数)截取播放采样 samples.slice(sampleRate * startPos) : samples; if (!_samples.length) { return onEnded(); } var buffer, channelBuffer; this._curSourceNode = ctx['createBufferSource'](); try { buffer = ctx['createBuffer'](1, _samples.length, sampleRate); } catch (e) { // iOS 不支持 22050 以下的采样率,于是先提升采样率,然后用慢速播放 if (sampleRate < 11025) { /*buffer = ctx['createBuffer'](1, _samples.length * 3, sampleRate * 3); _samples = this._increaseSampleRate(_samples, 3);*/ buffer = ctx['createBuffer'](1, _samples.length, sampleRate * 4); this._curSourceNode['playbackRate'].value = 0.25; } else { /*buffer = ctx['createBuffer'](1, _samples.length * 2, sampleRate * 2); _samples = this._increaseSampleRate(_samples, 2);*/ buffer = ctx['createBuffer'](1, _samples.length, sampleRate * 2); this._curSourceNode['playbackRate'].value = 0.5; } } if (buffer['copyToChannel']) { buffer['copyToChannel'](_samples, 0, 0); } else { channelBuffer = buffer['getChannelData'](0); channelBuffer.set(_samples); } this._curSourceNode['buffer'] = buffer; this._curSourceNode['loop'] = false; this._curSourceNode['connect'](ctx['destination']); this._curSourceNode.onended = onEnded; this._curSourceNode.start(); } }, { key: "stopPcm", value: function stopPcm() { if (this._curSourceNode) { this._curSourceNode.stop(); this._curSourceNode = null; } } }, { key: "stopPcmSilently", value: function stopPcmSilently() { this._curSourceNode.onended = null; this.stopPcm(); } }, { key: "initRecorder", value: function initRecorder() { var _this = this; return new Promise(function (resolve, reject) { var s = function s(stream) { _this._recorderStream = stream; _this._recorderStreamSourceNode = ctx.createMediaStreamSource(stream); _this._recorder = new Recorder(_this._recorderStreamSourceNode); _this._isRecording = false; resolve(); }; var j = function j(e) { reject(e); }; if (!_this._recorder) { if (window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia) { window.navigator.mediaDevices.getUserMedia({ audio: true }).then(s).catch(j); } else if (window.navigator.getUserMedia) { window.navigator.getUserMedia({ audio: true }, s, j); } else { j(); } } else { resolve(); } }); } }, { key: "isRecording", value: function isRecording() { return this._recorder && this._isRecording; } }, { key: "startRecord", value: function startRecord() { if (this._recorder) { this._recorder.clear(); this._recorder.record(); this._isRecording = true; } } }, { key: "stopRecord", value: function stopRecord() { if (this._recorder) { this._recorder.stop(); this._isRecording = false; } } }, { key: "generateRecordSamples", value: function generateRecordSamples() { var _this2 = this; return new Promise(function (resolve) { if (_this2._recorder) { _this2._recorder.getBuffer(function (buffers) { resolve(buffers[0]); }); } }); } }, { key: "releaseRecord", value: function releaseRecord() { if (this._recorderStream && this._recorderStream.getTracks) { this._recorderStream.getTracks().forEach(function (track) { track.stop(); }); this._recorderStream = null; } if (this._recorder) { this._recorder.release(); this._recorder = null; } } }], [{ key: "isPlaySupported", value: function isPlaySupported() { return isSupport; } }, { key: "isRecordSupported", value: function isRecordSupported() { return !!(window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia || window.navigator.getUserMedia); } }, { key: "getCtxSampleRate", value: function getCtxSampleRate() { return ctx && ctx.sampleRate || 0; } }, { key: "getCtxTime", value: function getCtxTime() { return ctx && ctx.currentTime || 0; } }, { key: "decodeAudioArrayBufferByContext", value: function decodeAudioArrayBufferByContext(array) { return new Promise(function (resolve, reject) { ctx['decodeAudioData'](array, function (audioBuf) { // 把多声道音频 mix 成单声道 var numberOfChannels = audioBuf.numberOfChannels; var dest = new Float32Array(audioBuf.length); switch (numberOfChannels) { default: case 1: { dest = audioBuf.getChannelData(0); break; } case 2: { var left = audioBuf.getChannelData(0); var right = audioBuf.getChannelData(1); for (var i = 0, l = dest.length; i < l; i++) { dest[i] = .5 * (left[i] + right[i]); } break; } case 4: { var _left = audioBuf.getChannelData(0); var _right = audioBuf.getChannelData(1); var sLeft = audioBuf.getChannelData(2); var sRight = audioBuf.getChannelData(3); for (var _i = 0, _l = dest.length; _i < _l; _i++) { dest[_i] = .25 * (_left[_i] + _right[_i] + sLeft[_i] + sRight[_i]); } break; } case 6: { var _left2 = audioBuf.getChannelData(0); var _right2 = audioBuf.getChannelData(1); var center = audioBuf.getChannelData(2); var _sLeft = audioBuf.getChannelData(4); var _sRight = audioBuf.getChannelData(5); for (var _i2 = 0, _l2 = dest.length; _i2 < _l2; _i2++) { dest[_i2] = 0.7071 * (_left2[_i2] + _right2[_i2]) + center[_i2] + 0.5 * (_sLeft[_i2] + _sRight[_i2]); } break; } } resolve(dest); }, reject); }); } /* static _increaseSampleRate(samples, multiple) { let sampleLen = samples.length; let newSamples = new Float32Array(sampleLen * multiple); for (let i = 0; i < sampleLen; i ++) { for (let j = 0; j < multiple; j ++) { newSamples[i * multiple + j] = samples[i]; } } return newSamples; }; */ }]); return RecorderControl; }(); var amrnb = function() { var AMR = (function () { var AMR = { toWAV: (function (amr) { var decoded = this._decode(amr); if (!decoded) { return null } var raw = new Uint8Array(decoded.buffer, decoded.byteOffset, decoded.byteLength); var out = new Uint8Array(raw.length + this.WAV_HEADER_SIZE); var offset = 0; var write_int16 = (function (value) { var a = new Uint8Array(2); (new Int16Array(a.buffer))[0] = value; out.set(a, offset); offset += 2; }); var write_int32 = (function (value) { var a = new Uint8Array(4); (new Int32Array(a.buffer))[0] = value; out.set(a, offset); offset += 4; }); var write_string = (function (value) { var d = (new TextEncoder("utf-8")).encode(value); out.set(d, offset); offset += d.length; }); write_string("RIFF"); write_int32(4 + 8 + 16 + 8 + raw.length); write_string("WAVEfmt "); write_int32(16); var bits_per_sample = 16; var sample_rate = 8e3; var channels = 1; var bytes_per_frame = bits_per_sample / 8 * channels; var bytes_per_sec = bytes_per_frame * sample_rate; write_int16(1); write_int16(1); write_int32(sample_rate); write_int32(bytes_per_sec); write_int16(bytes_per_frame); write_int16(bits_per_sample); write_string("data"); write_int32(raw.length); out.set(raw, offset); return out }), decode: (function (amr) { var raw = this._decode(amr); if (!raw) { return null } var out = new Float32Array(raw.length); for (var i = 0; i < out.length; i++) { out[i] = raw[i] / 32768; } return out }), _decode: (function (amr) { if (String.fromCharCode.apply(null, amr.subarray(0, this.AMR_HEADER.length)) !== this.AMR_HEADER) { return null } var decoder = this.Decoder_Interface_init(); if (!decoder) { return null } var out = new Int16Array(Math.floor(amr.length / 6 * this.PCM_BUFFER_COUNT)); var buf = Module._malloc(this.AMR_BUFFER_COUNT); var decodeInBuffer = new Uint8Array(Module.HEAPU8.buffer, buf, this.AMR_BUFFER_COUNT); buf = Module._malloc(this.PCM_BUFFER_COUNT * 2); var decodeOutBuffer = new Int16Array(Module.HEAPU8.buffer, buf, this.PCM_BUFFER_COUNT); var inOffset = 6; var outOffset = 0; while (inOffset + 1 < amr.length && outOffset + 1 < out.length) { var size = this.SIZES[amr[inOffset] >> 3 & 15]; if (inOffset + size + 1 > amr.length) { break } decodeInBuffer.set(amr.subarray(inOffset, inOffset + size + 1)); this.Decoder_Interface_Decode(decoder, decodeInBuffer.byteOffset, decodeOutBuffer.byteOffset, 0); if (outOffset + this.PCM_BUFFER_COUNT > out.length) { var newOut = new Int16Array(out.length * 2); newOut.set(out.subarray(0, outOffset)); out = newOut; } out.set(decodeOutBuffer, outOffset); outOffset += this.PCM_BUFFER_COUNT; inOffset += size + 1; } Module._free(decodeInBuffer.byteOffset); Module._free(decodeOutBuffer.byteOffset); this.Decoder_Interface_exit(decoder); return out.subarray(0, outOffset) }), encode: (function (pcm, pcmSampleRate, mode) { if (pcmSampleRate < 8e3) { console.error("pcmSampleRate should not be less than 8000."); return null } if (typeof mode === "undefined") { mode = this.Mode.MR795; } var encoder = this.Encoder_Interface_init(); if (!encoder) { return null } var buf = Module._malloc(this.PCM_BUFFER_COUNT * 2); var encodeInBuffer = new Int16Array(Module.HEAPU8.buffer, buf, this.PCM_BUFFER_COUNT); buf = Module._malloc(this.AMR_BUFFER_COUNT); var encodeOutBuffer = new Uint8Array(Module.HEAPU8.buffer, buf, this.AMR_BUFFER_COUNT); var ratio = pcmSampleRate / 8e3; var inLength = Math.floor(pcm.length / ratio); var inData = new Int16Array(inLength); for (var i = 0; i < inLength; i++) { inData[i] = pcm[Math.floor(i * ratio)] * (32768 - 1); } var blockSize = this.SIZES[mode] + 1; var out = new Uint8Array(Math.ceil(inLength / this.PCM_BUFFER_COUNT * blockSize) + this.AMR_HEADER.length); out.set((new TextEncoder("utf-8")).encode(this.AMR_HEADER)); var inOffset = 0; var outOffset = this.AMR_HEADER.length; while (inOffset + this.PCM_BUFFER_COUNT < inData.length && outOffset + blockSize < out.length) { encodeInBuffer.set(inData.subarray(inOffset, inOffset + this.PCM_BUFFER_COUNT)); var n = this.Encoder_Interface_Encode(encoder, mode, encodeInBuffer.byteOffset, encodeOutBuffer.byteOffset, 0); if (n != blockSize) { console.error([n, blockSize]); break } out.set(encodeOutBuffer.subarray(0, n), outOffset); inOffset += this.PCM_BUFFER_COUNT; outOffset += n; } Module._free(encodeInBuffer.byteOffset); Module._free(encodeOutBuffer.byteOffset); this.Encoder_Interface_exit(encoder); return out.subarray(0, outOffset) }), Decoder_Interface_init: (function () { console.warn("Decoder_Interface_init not initialized."); return 0 }), Decoder_Interface_exit: (function (state) { console.warn("Decoder_Interface_exit not initialized."); }), Decoder_Interface_Decode: (function (state, inBuffer, outBuffer, bfi) { console.warn("Decoder_Interface_Decode not initialized."); }), Encoder_Interface_init: (function (dtx) { console.warn("Encoder_Interface_init not initialized."); return 0 }), Encoder_Interface_exit: (function (state) { console.warn("Encoder_Interface_exit not initialized."); }), Encoder_Interface_Encode: (function (state, mode, speech, out, forceSpeech) { console.warn("Encoder_Interface_Encode not initialized."); }), Mode: {MR475: 0, MR515: 1, MR59: 2, MR67: 3, MR74: 4, MR795: 5, MR102: 6, MR122: 7, MRDTX: 8}, SIZES: [12, 13, 15, 17, 19, 20, 26, 31, 5, 6, 5, 5, 0, 0, 0, 0], AMR_BUFFER_COUNT: 32, PCM_BUFFER_COUNT: 160, AMR_HEADER: "#!AMR\n", WAV_HEADER_SIZE: 44 }; var Module = { canvas: {}, print: (function (text) { console.log(text); }), _main: (function () { AMR.Decoder_Interface_init = Module._Decoder_Interface_init; AMR.Decoder_Interface_exit = Module._Decoder_Interface_exit; AMR.Decoder_Interface_Decode = Module._Decoder_Interface_Decode; AMR.Encoder_Interface_init = Module._Encoder_Interface_init; AMR.Encoder_Interface_exit = Module._Encoder_Interface_exit; AMR.Encoder_Interface_Encode = Module._Encoder_Interface_Encode; return 0 }) }; var Module; if (!Module) Module = (typeof Module !== "undefined" ? Module : null) || {}; var moduleOverrides = {}; for (var key in Module) { if (Module.hasOwnProperty(key)) { moduleOverrides[key] = Module[key]; } } var ENVIRONMENT_IS_WEB = typeof window === "object"; var ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; var ENVIRONMENT_IS_NODE = false;/*typeof process === "object" && typeof require === "function" && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;*/ var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; if (ENVIRONMENT_IS_SHELL) { if (!Module["print"]) Module["print"] = print; if (typeof printErr != "undefined") Module["printErr"] = printErr; if (typeof read != "undefined") { Module["read"] = read; } else { Module["read"] = function read() { throw "no read() available (jsc?)" }; } Module["readBinary"] = function readBinary(f) { if (typeof readbuffer === "function") { return new Uint8Array(readbuffer(f)) } var data = read(f, "binary"); assert(typeof data === "object"); return data }; if (typeof scriptArgs != "undefined") { Module["arguments"] = scriptArgs; } else if (typeof arguments != "undefined") { Module["arguments"] = arguments; } } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { Module["read"] = function read(url) { var xhr = new XMLHttpRequest; xhr.open("GET", url, false); xhr.send(null); return xhr.responseText }; if (typeof arguments != "undefined") { Module["arguments"] = arguments; } if (typeof console !== "undefined") { if (!Module["print"]) Module["print"] = function print(x) { console.log(x); }; if (!Module["printErr"]) Module["printErr"] = function printErr(x) { console.log(x); }; } else { var TRY_USE_DUMP = false; if (!Module["print"]) Module["print"] = TRY_USE_DUMP && typeof dump !== "undefined" ? (function (x) { dump(x); }) : (function (x) { }); } if (ENVIRONMENT_IS_WORKER) { Module["load"] = importScripts; } if (typeof Module["setWindowTitle"] === "undefined") { Module["setWindowTitle"] = (function (title) { document.title = title; }); } } else { throw "Unknown runtime environment. Where are we?" } function globalEval(x) { eval.call(null, x); } if (!Module["load"] && Module["read"]) { Module["load"] = function load(f) { globalEval(Module["read"](f)); }; } if (!Module["print"]) { Module["print"] = (function () { }); } if (!Module["printErr"]) { Module["printErr"] = Module["print"]; } if (!Module["arguments"]) { Module["arguments"] = []; } if (!Module["thisProgram"]) { Module["thisProgram"] = "./this.program"; } Module.print = Module["print"]; Module.printErr = Module["printErr"]; Module["preRun"] = []; Module["postRun"] = []; for (var key in moduleOverrides) { if (moduleOverrides.hasOwnProperty(key)) { Module[key] = moduleOverrides[key]; } } var Runtime = { setTempRet0: (function (value) { tempRet0 = value; }), getTempRet0: (function () { return tempRet0 }), stackSave: (function () { return STACKTOP }), stackRestore: (function (stackTop) { STACKTOP = stackTop; }), getNativeTypeSize: (function (type) { switch (type) { case"i1": case"i8": return 1; case"i16": return 2; case"i32": return 4; case"i64": return 8; case"float": return 4; case"double": return 8; default: { if (type[type.length - 1] === "*") { return Runtime.QUANTUM_SIZE } else if (type[0] === "i") { var bits = parseInt(type.substr(1)); assert(bits % 8 === 0); return bits / 8 } else { return 0 } } } }), getNativeFieldSize: (function (type) { return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE) }), STACK_ALIGN: 16, prepVararg: (function (ptr, type) { if (type === "double" || type === "i64") { if (ptr & 7) { assert((ptr & 7) === 4); ptr += 4; } } else { assert((ptr & 3) === 0); } return ptr }), getAlignSize: (function (type, size, vararg) { if (!vararg && (type == "i64" || type == "double")) return 8; if (!type) return Math.min(size, 8); return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE) }), dynCall: (function (sig, ptr, args) { if (args && args.length) { if (!args.splice) args = Array.prototype.slice.call(args); args.splice(0, 0, ptr); return Module["dynCall_" + sig].apply(null, args) } else { return Module["dynCall_" + sig].call(null, ptr) } }), functionPointers: [], addFunction: (function (func) { for (var i = 0; i < Runtime.functionPointers.length; i++) { if (!Runtime.functionPointers[i]) { Runtime.functionPointers[i] = func; return 2 * (1 + i) } } throw "Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS." }), removeFunction: (function (index) { Runtime.functionPointers[(index - 2) / 2] = null; }), warnOnce: (function (text) { if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {}; if (!Runtime.warnOnce.shown[text]) { Runtime.warnOnce.shown[text] = 1; Module.printErr(text); } }), funcWrappers: {}, getFuncWrapper: (function (func, sig) { assert(sig); if (!Runtime.funcWrappers[sig]) { Runtime.funcWrappers[sig] = {}; } var sigCache = Runtime.funcWrappers[sig]; if (!sigCache[func]) { sigCache[func] = function dynCall_wrapper() { return Runtime.dynCall(sig, func, arguments) }; } return sigCache[func] }), getCompilerSetting: (function (name) { throw "You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work" }), stackAlloc: (function (size) { var ret = STACKTOP; STACKTOP = STACKTOP + size | 0; STACKTOP = STACKTOP + 15 & -16; return ret }), staticAlloc: (function (size) { var ret = STATICTOP; STATICTOP = STATICTOP + size | 0; STATICTOP = STATICTOP + 15 & -16; return ret }), dynamicAlloc: (function (size) { var ret = DYNAMICTOP; DYNAMICTOP = DYNAMICTOP + size | 0; DYNAMICTOP = DYNAMICTOP + 15 & -16; if (DYNAMICTOP >= TOTAL_MEMORY) { var success = enlargeMemory(); if (!success) { DYNAMICTOP = ret; return 0 } } return ret }), alignMemory: (function (size, quantum) { var ret = size = Math.ceil(size / (quantum ? quantum : 16)) * (quantum ? quantum : 16); return ret }), makeBigInt: (function (low, high, unsigned) { var ret = unsigned ? +(low >>> 0) + +(high >>> 0) * +4294967296 : +(low >>> 0) + +(high | 0) * +4294967296; return ret }), GLOBAL_BASE: 8, QUANTUM_SIZE: 4, __dummy__: 0 }; Module["Runtime"] = Runtime; var ABORT = false; var tempDouble; var tempI64; var tempRet0; function assert(condition, text) { if (!condition) { abort("Assertion failed: " + text); } } function getCFunc(ident) { var func = Module["_" + ident]; if (!func) { try { func = [eval][0]("_" + ident); } catch (e) { } } assert(func, "Cannot call unknown function " + ident + " (perhaps LLVM optimizations or closure removed it?)"); return func } var cwrap, ccall; ((function () { var JSfuncs = { "stackSave": (function () { Runtime.stackSave(); }), "stackRestore": (function () { Runtime.stackRestore(); }), "arrayToC": (function (arr) { var ret = Runtime.stackAlloc(arr.length); writeArrayToMemory(arr, ret); return ret }), "stringToC": (function (str) { var ret = 0; if (str !== null && str !== undefined && str !== 0) { ret = Runtime.stackAlloc((str.length << 2) + 1); writeStringToMemory(str, ret); } return ret }) }; var toC = {"string": JSfuncs["stringToC"], "array": JSfuncs["arrayToC"]}; ccall = function ccallFunc(ident, returnType, argTypes, args, opts) { var func = getCFunc(ident); var cArgs = []; var stack = 0; if (args) { for (var i = 0; i < args.length; i++) { var converter = toC[argTypes[i]]; if (converter) { if (stack === 0) stack = Runtime.stackSave(); cArgs[i] = converter(args[i]); } else { cArgs[i] = args[i]; } } } var ret = func.apply(null, cArgs); if (returnType === "string") ret = Pointer_stringify(ret); if (stack !== 0) { if (opts && opts.async) { EmterpreterAsync.asyncFinalizers.push((function () { Runtime.stackRestore(stack); })); return } Runtime.stackRestore(stack); } return ret }; var sourceRegex = /^function\s\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/; function parseJSFunc(jsfunc) { // Match the body and the return value of a javascript function source var parsed = jsfunc.toString().match(sourceRegex); if (!parsed) { return {}; } parsed = parsed.slice(1); return {arguments: parsed[0], body: parsed[1], returnValue: parsed[2]} } var JSsource = {}; for (var fun in JSfuncs) { if (JSfuncs.hasOwnProperty(fun)) { JSsource[fun] = parseJSFunc(JSfuncs[fun]); } } cwrap = function cwrap(ident, returnType, argTypes) { argTypes = argTypes || []; var cfunc = getCFunc(ident); var numericArgs = argTypes.every((function (type) { return type === "number" })); var numericRet = returnType !== "string"; if (numericRet && numericArgs) { return cfunc } var argNames = argTypes.map((function (x, i) { return "$" + i })); var funcstr = "(function(" + argNames.join(",") + ") {"; var nargs = argTypes.length; if (!numericArgs) { funcstr += "var stack = " + JSsource["stackSave"].body + ";"; for (var i = 0; i < nargs; i++) { var arg = argNames[i], type = argTypes[i]; if (type === "number") continue; var convertCode = JSsource[type + "ToC"]; funcstr += "var " + convertCode.arguments + " = " + arg + ";"; funcstr += convertCode.body + ";"; funcstr += arg + "=" + convertCode.returnValue + ";"; } } var cfuncname = parseJSFunc((function () { return cfunc })).returnValue; funcstr += "var ret = " + cfuncname + "(" + argNames.join(",") + ");"; if (!numericRet) { var strgfy = parseJSFunc((function () { return Pointer_stringify })).returnValue; funcstr += "ret = " + strgfy + "(ret);"; } if (!numericArgs) { funcstr += JSsource["stackRestore"].body.replace("()", "(stack)") + ";"; } funcstr += "return ret})"; return [eval][0](funcstr) }; }))(); Module["ccall"] = ccall; Module["cwrap"] = cwrap; function setValue(ptr, value, type, noSafe) { type = type || "i8"; if (type.charAt(type.length - 1) === "*") type = "i32"; switch (type) { case"i1": HEAP8[ptr >> 0] = value; break; case"i8": HEAP8[ptr >> 0] = value; break; case"i16": HEAP16[ptr >> 1] = value; break; case"i32": HEAP32[ptr >> 2] = value; break; case"i64": tempI64 = [value >>> 0, (tempDouble = value, +Math_abs(tempDouble) >= +1 ? tempDouble > +0 ? (Math_min(+Math_floor(tempDouble / +4294967296), +4294967295) | 0) >>> 0 : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / +4294967296) >>> 0 : 0)], HEAP32[ptr >> 2] = tempI64[0], HEAP32[ptr + 4 >> 2] = tempI64[1]; break; case"float": HEAPF32[ptr >> 2] = value; break; case"double": HEAPF64[ptr >> 3] = value; break; default: abort("invalid type for setValue: " + type); } } Module["setValue"] = setValue; function getValue(ptr, type, noSafe) { type = type || "i8"; if (type.charAt(type.length - 1) === "*") type = "i32"; switch (type) { case"i1": return HEAP8[ptr >> 0]; case"i8": return HEAP8[ptr >> 0]; case"i16": return HEAP16[ptr >> 1]; case"i32": return HEAP32[ptr >> 2]; case"i64": return HEAP32[ptr >> 2]; case"float": return HEAPF32[ptr >> 2]; case"double": return HEAPF64[ptr >> 3]; default: abort("invalid type for setValue: " + type); } return null } Module["getValue"] = getValue; var ALLOC_NORMAL = 0; var ALLOC_STACK = 1; var ALLOC_STATIC = 2; var ALLOC_DYNAMIC = 3; var ALLOC_NONE = 4; Module["ALLOC_NORMAL"] = ALLOC_NORMAL; Module["ALLOC_STACK"] = ALLOC_STACK; Module["ALLOC_STATIC"] = ALLOC_STATIC; Module["ALLOC_DYNAMIC"] = ALLOC_DYNAMIC; Module["ALLOC_NONE"] = ALLOC_NONE; function allocate(slab, types, allocator, ptr) { var zeroinit, size; if (typeof slab === "number") { zeroinit = true; size = slab; } else { zeroinit = false; size = slab.length; } var singleType = typeof types === "string" ? types : null; var ret; if (allocator == ALLOC_NONE) { ret = ptr; } else { ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length)); } if (zeroinit) { var ptr = ret, stop; assert((ret & 3) == 0); stop = ret + (size & ~3); for (; ptr < stop; ptr += 4) { HEAP32[ptr >> 2] = 0; } stop = ret + size; while (ptr < stop) { HEAP8[ptr++ >> 0] = 0; } return ret } if (singleType === "i8") { if (slab.subarray || slab.slice) { HEAPU8.set(slab, ret); } else { HEAPU8.set(new Uint8Array(slab), ret); } return ret } var i = 0, type, typeSize, previousType; while (i < size) { var curr = slab[i]; if (typeof curr === "function") { curr = Runtime.getFunctionIndex(curr); } type = singleType || types[i]; if (type === 0) { i++; continue } if (type == "i64") type = "i32"; setValue(ret + i, curr, type); if (previousType !== type) { typeSize = Runtime.getNativeTypeSize(type); previousType = type; } i += typeSize; } return ret } Module["allocate"] = allocate; function getMemory(size) { if (!staticSealed) return Runtime.staticAlloc(size); if (typeof _sbrk !== "undefined" && !_sbrk.called || !runtimeInitialized) return Runtime.dynamicAlloc(size); return _malloc(size) } Module["getMemory"] = getMemory; function Pointer_stringify(ptr, length) { if (length === 0 || !ptr) return ""; var hasUtf = 0; var t; var i = 0; while (1) { t = HEAPU8[ptr + i >> 0]; hasUtf |= t; if (t == 0 && !length) break; i++; if (length && i == length) break } if (!length) length = i; var ret = ""; if (hasUtf < 128) { var MAX_CHUNK = 1024; var curr; while (length > 0) { curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK))); ret = ret ? ret + curr : curr; ptr += MAX_CHUNK; length -= MAX_CHUNK; } return ret } return Module["UTF8ToString"](ptr) } Module["Pointer_stringify"] = Pointer_stringify; function AsciiToString(ptr) { var str = ""; while (1) { var ch = HEAP8[ptr++ >> 0]; if (!ch) return str; str += String.fromCharCode(ch); } } Module["AsciiToString"] = AsciiToString; function stringToAscii(str, outPtr) { return writeAsciiToMemory(str, outPtr, false) } Module["stringToAscii"] = stringToAscii; function UTF8ArrayToString(u8Array, idx) { var u0, u1, u2, u3, u4, u5; var str = ""; while (1) { u0 = u8Array[idx++]; if (!u0) return str; if (!(u0 & 128)) { str += String.fromCharCode(u0); continue } u1 = u8Array[idx++] & 63; if ((u0 & 224) == 192) { str += String.fromCharCode((u0 & 31) << 6 | u1); continue } u2 = u8Array[idx++] & 63; if ((u0 & 240) == 224) { u0 = (u0 & 15) << 12 | u1 << 6 | u2; } else { u3 = u8Array[idx++] & 63; if ((u0 & 248) == 240) { u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | u3; } else { u4 = u8Array[idx++] & 63; if ((u0 & 252) == 248) { u0 = (u0 & 3) << 24 | u1 << 18 | u2 << 12 | u3 << 6 | u4; } else { u5 = u8Array[idx++] & 63; u0 = (u0 & 1) << 30 | u1 << 24 | u2 << 18 | u3 << 12 | u4 << 6 | u5; } } } if (u0 < 65536) { str += String.fromCharCode(u0); } else { var ch = u0 - 65536; str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); } } } Module["UTF8ArrayToString"] = UTF8ArrayToString; function UTF8ToString(ptr) { return UTF8ArrayToString(HEAPU8, ptr) } Module["UTF8ToString"] = UTF8ToString; function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) { if (!(maxBytesToWrite > 0)) return 0; var startIdx = outIdx; var endIdx = outIdx + maxBytesToWrite - 1; for (var i = 0; i < str.length; ++i) { var u = str.charCodeAt(i); if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; if (u <= 127) { if (outIdx >= endIdx) break; outU8Array[outIdx++] = u; } else if (u <= 2047) { if (outIdx + 1 >= endIdx) break; outU8Array[outIdx++] = 192 | u >> 6; outU8Array[outIdx++] = 128 | u & 63; } else if (u <= 65535) { if (outIdx + 2 >= endIdx) break; outU8Array[outIdx++] = 224 | u >> 12; outU8Array[outIdx++] = 128 | u >> 6 & 63; outU8Array[outIdx++] = 128 | u & 63; } else if (u <= 2097151) { if (outIdx + 3 >= endIdx) break; outU8Array[outIdx++] = 240 | u >> 18; outU8Array[outIdx++] = 128 | u >> 12 & 63; outU8Array[outIdx++] = 128 | u >> 6 & 63; outU8Array[outIdx++] = 128 | u & 63; } else if (u <= 67108863) { if (outIdx + 4 >= endIdx) break; outU8Array[outIdx++] = 248 | u >> 24; outU8Array[outIdx++] = 128 | u >> 18 & 63; outU8Array[outIdx++] = 128 | u >> 12 & 63; outU8Array[outIdx++] = 128 | u >> 6 & 63; outU8Array[outIdx++] = 128 | u & 63; } else { if (outIdx + 5 >= endIdx) break; outU8Array[outIdx++] = 252 | u >> 30; outU8Array[outIdx++] = 128 | u >> 24 & 63; outU8Array[outIdx++] = 128 | u >> 18 & 63; outU8Array[outIdx++] = 128 | u >> 12 & 63; outU8Array[outIdx++] = 128 | u >> 6 & 63; outU8Array[outIdx++] = 128 | u & 63; } } outU8Array[outIdx] = 0; return outIdx - startIdx } Module["stringToUTF8Array"] = stringToUTF8Array; function stringToUTF8(str, outPtr, maxBytesToWrite) { return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite) } Module["stringToUTF8"] = stringToUTF8; function lengthBytesUTF8(str) { var len = 0; for (var i = 0; i < str.length; ++i) { var u = str.charCodeAt(i); if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; if (u <= 127) { ++len; } else if (u <= 2047) { len += 2; } else if (u <= 65535) { len += 3; } else if (u <= 2097151) { len += 4; } else if (u <= 67108863) { len += 5; } else { len += 6; } } return len } Module["lengthBytesUTF8"] = lengthBytesUTF8; function UTF16ToString(ptr) { var i = 0; var str = ""; while (1) { var codeUnit = HEAP16[ptr + i * 2 >> 1]; if (codeUnit == 0) return str; ++i; str += String.fromCharCode(codeUnit); } } Module["UTF16ToString"] = UTF16ToString; function stringToUTF16(str, outPtr, maxBytesToWrite) { if (maxBytesToWrite === undefined) { maxBytesToWrite = 2147483647; } if (maxBytesToWrite < 2) return 0; maxBytesToWrite -= 2; var startPtr = outPtr; var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length; for (var i = 0; i < numCharsToWrite; ++i) { var codeUnit = str.charCodeAt(i); HEAP16[outPtr >> 1] = codeUnit; outPtr += 2; } HEAP16[outPtr >> 1] = 0; return outPtr - startPtr } Module["stringToUTF16"] = stringToUTF16; function lengthBytesUTF16(str) { return str.length * 2 } Module["lengthBytesUTF16"] = lengthBytesUTF16; function UTF32ToString(ptr) { var i = 0; var str = ""; while (1) { var utf32 = HEAP32[ptr + i * 4 >> 2]; if (utf32 == 0) return str; ++i; if (utf32 >= 65536) { var ch = utf32 - 65536; str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); } else { str += String.fromCharCode(utf32); } } } Module["UTF32ToString"] = UTF32ToString; function stringToUTF32(str, outPtr, maxBytesToWrite) { if (maxBytesToWrite === undefined) { maxBytesToWrite = 2147483647; } if (maxBytesToWrite < 4) return 0; var startPtr = outPtr; var endPtr = startPtr + maxBytesToWrite - 4; for (var i = 0; i < str.length; ++i) { var codeUnit = str.charCodeAt(i); if (codeUnit >= 55296 && codeUnit <= 57343) { var trailSurrogate = str.charCodeAt(++i); codeUnit = 65536 + ((codeUnit & 1023) << 10) | trailSurrogate & 1023; } HEAP32[outPtr >> 2] = codeUnit; outPtr += 4; if (outPtr + 4 > endPtr) break } HEAP32[outPtr >> 2] = 0; return outPtr - startPtr } Module["stringToUTF32"] = stringToUTF32; function lengthBytesUTF32(str) { var len = 0; for (var i = 0; i < str.length; ++i) { var codeUnit = str.charCodeAt(i); if (codeUnit >= 55296 && codeUnit <= 57343) ++i; len += 4; } return len } Module["lengthBytesUTF32"] = lengthBytesUTF32; function demangle(func) { var hasLibcxxabi = !!Module["___cxa_demangle"]; if (hasLibcxxabi) { try { var buf = _malloc(func.length); writeStringToMemory(func.substr(1), buf); var status = _malloc(4); var ret = Module["___cxa_demangle"](buf, 0, 0, status); if (getValue(status, "i32") === 0 && ret) { return Pointer_stringify(ret) } } catch (e) { } finally { if (buf) _free(buf); if (status) _free(status); if (ret) _free(ret); } } var i = 3; var basicTypes = { "v": "void", "b": "bool", "c": "char", "s": "short", "i": "int", "l": "long", "f": "float", "d": "double", "w": "wchar_t", "a": "signed char", "h": "unsigned char", "t": "unsigned short", "j": "unsigned int", "m": "unsigned long", "x": "long long", "y": "unsigned long long", "z": "..." }; var subs = []; var first = true; function parseNested() { i++; if (func[i] === "K") i++; var parts = []; while (func[i] !== "E") { if (func[i] === "S") { i++; var next = func.indexOf("_", i); var num = func.substring(i, next) || 0; parts.push(subs[num] || "?"); i = next + 1; continue } if (func[i] === "C") { parts.push(parts[parts.length - 1]); i += 2; continue } var size = parseInt(func.substr(i)); var pre = size.toString().length; if (!size || !pre) { i--; break } var curr = func.substr(i + pre, size); parts.push(curr); subs.push(curr); i += pre + size; } i++; return parts } function parse(rawList, limit, allowVoid) { limit = limit || Infinity; var ret = "", list = []; function flushList() { return "(" + list.join(", ") + ")" } var name; if (func[i] === "N") { name = parseNested().join("::"); limit--; if (limit === 0) return rawList ? [name] : name } else { if (func[i] === "K" || first && func[i] === "L") i++; var size = parseInt(func.substr(i)); if (size) { var pre = size.toString().length; name = func.substr(i + pre, size); i += pre + size; } } first = false; if (func[i] === "I") { i++; var iList = parse(true); var iRet = parse(true, 1, true); ret += iRet[0] + " " + name + "<" + iList.join(", ") + ">"; } else { ret = name; } paramLoop:while (i < func.length && limit-- > 0) { var c = func[i++]; if (c in basicTypes) { list.push(basicTypes[c]); } else { switch (c) { case"P": list.push(parse(true, 1, true)[0] + "*"); break; case"R": list.push(parse(true, 1, true)[0] + "&"); break; case"L": { i++; var end = func.indexOf("E", i); var size = end - i; list.push(func.substr(i, size)); i += size + 2; break } case"A": { var size = parseInt(func.substr(i)); i += size.toString().length; if (func[i] !== "_") throw "?"; i++; list.push(parse(true, 1, true)[0] + " [" + size + "]"); break } case"E": break paramLoop; default: ret += "?" + c; break paramLoop } } } if (!allowVoid && list.length === 1 && list[0] === "void") list = []; if (rawList) { if (ret) { list.push(ret + "?"); } return list } else { return ret + flushList() } } var parsed = func; try { if (func == "Object._main" || func == "_main") { return "main()" } if (typeof func === "number") func = Pointer_stringify(func); if (func[0] !== "_") return func; if (func[1] !== "_") return func; if (func[2] !== "Z") return func; switch (func[3]) { case"n": return "operator new()"; case"d": return "operator delete()" } parsed = parse(); } catch (e) { parsed += "?"; } if (parsed.indexOf("?") >= 0 && !hasLibcxxabi) { Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"); } return parsed } function demangleAll(text) { return text.replace(/__Z[\w\d_]+/g, (function (x) { var y = demangle(x); return x === y ? x : x + " [" + y + "]" })) } function jsStackTrace() { var err = new Error; if (!err.stack) { try { throw new Error(0) } catch (e) { err = e; } if (!err.stack) { return "(no stack trace available)" } } return err.stack.toString() } function stackTrace() { return demangleAll(jsStackTrace()) } Module["stackTrace"] = stackTrace; var PAGE_SIZE = 4096; function alignMemoryPage(x) { if (x % 4096 > 0) { x += 4096 - x % 4096; } return x } var HEAP; var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; var DYNAMIC_BASE = 0, DYNAMICTOP = 0; function enlargeMemory() { abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value " + TOTAL_MEMORY + ", (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs."); } var TOTAL_STACK = Module["TOTAL_STACK"] || 65536; var TOTAL_MEMORY = Module["TOTAL_MEMORY"] || 524288; var totalMemory = 64 * 1024; while (totalMemory < TOTAL_MEMORY || totalMemory < 2 * TOTAL_STACK) { if (totalMemory < 16 * 1024 * 1024) { totalMemory *= 2; } else { totalMemory += 16 * 1024 * 1024; } } if (totalMemory !== TOTAL_MEMORY) { Module.printErr("increasing TOTAL_MEMORY to " + totalMemory + " to be compliant with the asm.js spec (and given that TOTAL_STACK=" + TOTAL_STACK + ")"); TOTAL_MEMORY = totalMemory; } assert(typeof Int32Array !== "undefined" && typeof Float64Array !== "undefined" && !!(new Int32Array(1))["subarray"] && !!(new Int32Array(1))["set"], "JS engine does not provide full typed array support"); var buffer; buffer = new ArrayBuffer(TOTAL_MEMORY); HEAP8 = new Int8Array(buffer); HEAP16 = new Int16Array(buffer); HEAP32 = new Int32Array(buffer); HEAPU8 = new Uint8Array(buffer); HEAPU16 = new Uint16Array(buffer); HEAPU32 = new Uint32Array(buffer); HEAPF32 = new Float32Array(buffer); HEAPF64 = new Float64Array(buffer); HEAP32[0] = 255; assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, "Typed arrays 2 must be run on a little-endian system"); Module["HEAP"] = HEAP; Module["buffer"] = buffer; Module["HEAP8"] = HEAP8; Module["HEAP16"] = HEAP16; Module["HEAP32"] = HEAP32; Module["HEAPU8"] = HEAPU8; Module["HEAPU16"] = HEAPU16; Module["HEAPU32"] = HEAPU32; Module["HEAPF32"] = HEAPF32; Module["HEAPF64"] = HEAPF64; function callRuntimeCallbacks(callbacks) { while (callbacks.length > 0) { var callback = callbacks.shift(); if (typeof callback == "function") { callback(); continue } var func = callback.func; if (typeof func === "number") { if (callback.arg === undefined) { Runtime.dynCall("v", func); } else { Runtime.dynCall("vi", func, [callback.arg]); } } else { func(callback.arg === undefined ? null : callback.arg); } } } var __ATPRERUN__ = []; var __ATINIT__ = []; var __ATMAIN__ = []; var __ATEXIT__ = []; var __ATPOSTRUN__ = []; var runtimeInitialized = false; function preRun() { if (Module["preRun"]) { if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; while (Module["preRun"].length) { addOnPreRun(Module["preRun"].shift()); } } callRuntimeCallbacks(__ATPRERUN__); } function ensureInitRuntime() { if (runtimeInitialized) return; runtimeInitialized = true; callRuntimeCallbacks(__ATINIT__); } function preMain() { callRuntimeCallbacks(__ATMAIN__); } function exitRuntime() { callRuntimeCallbacks(__ATEXIT__); } function postRun() { if (Module["postRun"]) { if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; while (Module["postRun"].length) { addOnPostRun(Module["postRun"].shift()); } } callRuntimeCallbacks(__ATPOSTRUN__); } function addOnPreRun(cb) { __ATPRERUN__.unshift(cb); } Module["addOnPreRun"] = addOnPreRun; function addOnInit(cb) { __ATINIT__.unshift(cb); } Module["addOnInit"] = addOnInit; function addOnPreMain(cb) { __ATMAIN__.unshift(cb); } Module["addOnPreMain"] = addOnPreMain; function addOnExit(cb) { __ATEXIT__.unshift(cb); } Module["addOnExit"] = addOnExit; function addOnPostRun(cb) { __ATPOSTRUN__.unshift(cb); } Module["addOnPostRun"] = addOnPostRun; function intArrayFromString(stringy, dontAddNull, length) { var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1; var u8array = new Array(len); var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); if (dontAddNull) u8array.length = numBytesWritten; return u8array } Module["intArrayFromString"] = intArrayFromString; function intArrayToString(array) { var ret = []; for (var i = 0; i < array.length; i++) { var chr = array[i]; if (chr > 255) { chr &= 255; } ret.push(String.fromCharCode(chr)); } return ret.join("") } Module["intArrayToString"] = intArrayToString; function writeStringToMemory(string, buffer, dontAddNull) { var array = intArrayFromString(string, dontAddNull); var i = 0; while (i < array.length) { var chr = array[i]; HEAP8[buffer + i >> 0] = chr; i = i + 1; } } Module["writeStringToMemory"] = writeStringToMemory; function writeArrayToMemory(array, buffer) { for (var i = 0; i < array.length; i++) { HEAP8[buffer++ >> 0] = array[i]; } } Module["writeArrayToMemory"] = writeArrayToMemory; function writeAsciiToMemory(str, buffer, dontAddNull) { for (var i = 0; i < str.length; ++i) { HEAP8[buffer++ >> 0] = str.charCodeAt(i); } if (!dontAddNull) HEAP8[buffer >> 0] = 0; } Module["writeAsciiToMemory"] = writeAsciiToMemory; if (!Math["imul"] || Math["imul"](4294967295, 5) !== -5) Math["imul"] = function imul(a, b) { var ah = a >>> 16; var al = a & 65535; var bh = b >>> 16; var bl = b & 65535; return al * bl + (ah * bl + al * bh << 16) | 0 }; Math.imul = Math["imul"]; if (!Math["clz32"]) Math["clz32"] = (function (x) { x = x >>> 0; for (var i = 0; i < 32; i++) { if (x & 1 << 31 - i) return i } return 32 }); Math.clz32 = Math["clz32"]; var Math_abs = Math.abs; var Math_ceil = Math.ceil; var Math_floor = Math.floor; var Math_min = Math.min; var runDependencies = 0; var dependenciesFulfilled = null; function addRunDependency(id) { runDependencies++; if (Module["monitorRunDependencies"]) { Module["monitorRunDependencies"](runDependencies); } } Module["addRunDependency"] = addRunDependency; function removeRunDependency(id) { runDependencies--; if (Module["monitorRunDependencies"]) { Module["monitorRunDependencies"](runDependencies); } if (runDependencies == 0) { if (dependenciesFulfilled) { var callback = dependenciesFulfilled; dependenciesFulfilled = null; callback(); } } } Module["removeRunDependency"] = removeRunDependency; Module["preloadedImages"] = {}; Module["preloadedAudios"] = {}; STATIC_BASE = 8; STATICTOP = STATIC_BASE + 31776; __ATINIT__.push(); allocate([154, 14, 0, 0, 188, 14, 0, 0, 226, 14, 0, 0, 8, 15, 0, 0, 46, 15, 0, 0, 84, 15, 0, 0, 130, 15, 0, 0, 208, 15, 0, 0, 66, 16, 0, 0, 108, 16, 0, 0, 42, 17, 0, 0, 248, 17, 0, 0, 228, 18, 0, 0, 240, 19, 0, 0, 24, 21, 0, 0, 86, 22, 0, 0, 238, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 15, 0, 17, 0, 19, 0, 20, 0, 26, 0, 31, 0, 5, 0, 6, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 252, 146, 252, 36, 253, 182, 253, 72, 254, 218, 254, 108, 255, 0, 0, 0, 0, 32, 78, 32, 78, 32, 78, 32, 78, 32, 78, 80, 70, 0, 64, 0, 32, 0, 0, 0, 0, 255, 127, 112, 125, 112, 125, 112, 125, 112, 125, 112, 125, 153, 89, 255, 127, 112, 125, 112, 125, 102, 102, 102, 38, 153, 25, 153, 25, 154, 89, 185, 62, 232, 43, 188, 30, 132, 21, 16, 15, 139, 10, 97, 7, 42, 5, 157, 3, 0, 96, 0, 72, 0, 54, 128, 40, 96, 30, 200, 22, 22, 17, 209, 12, 157, 9, 54, 7, 102, 70, 184, 38, 75, 21, 182, 11, 113, 6, 139, 3, 243, 1, 18, 1, 151, 0, 83, 0, 154, 89, 185, 62, 232, 43, 188, 30, 132, 21, 16, 15, 139, 10, 97, 7, 42, 5, 157, 3, 44, 3, 128, 0, 30, 2, 140, 0, 57, 11, 111, 4, 218, 8, 74, 13, 19, 8, 51, 2, 133, 49, 135, 2, 36, 16, 6, 7, 225, 21, 165, 20, 9, 30, 118, 1, 151, 14, 185, 1, 160, 42, 78, 10, 31, 46, 190, 9, 10, 80, 29, 3, 98, 20, 163, 2, 68, 26, 162, 32, 162, 20, 160, 6, 208, 5, 172, 1, 250, 22, 196, 1, 212, 20, 232, 15, 255, 13, 244, 4, 165, 9, 133, 3, 22, 62, 237, 3, 134, 58, 199, 12, 91, 40, 250, 18, 51, 14, 229, 7, 36, 10, 67, 3, 72, 48, 28, 19, 174, 47, 168, 6, 120, 52, 68, 6, 158, 35, 37, 9, 128, 15, 2, 6, 103, 21, 208, 38, 211, 14, 161, 1, 79, 5, 158, 1, 56, 14, 33, 6, 59, 31, 213, 13, 141, 44, 133, 2, 104, 33, 123, 2, 216, 15, 97, 5, 224, 64, 236, 23, 156, 44, 188, 2, 215, 7, 95, 2, 127, 48, 42, 6, 111, 43, 46, 18, 112, 53, 172, 6, 214, 46, 205, 4, 60, 31, 129, 28, 175, 51, 83, 22, 124, 9, 135, 4, 25, 8, 149, 7, 74, 24, 233, 23, 218, 13, 12, 7, 221, 34, 10, 7, 231, 33, 44, 6, 111, 54, 248, 13, 1, 52, 93, 24, 254, 23, 106, 4, 106, 23, 198, 6, 61, 55, 54, 18, 7, 44, 249, 12, 194, 47, 15, 6, 107, 54, 199, 11, 217, 19, 224, 40, 228, 36, 50, 26, 153, 6, 171, 2, 156, 5, 26, 5, 44, 28, 93, 15, 242, 15, 153, 10, 113, 30, 192, 2, 222, 58, 34, 3, 155, 24, 92, 20, 241, 16, 237, 20, 20, 26, 29, 2, 174, 23, 114, 2, 83, 53, 116, 14, 234, 44, 104, 9, 28, 63, 204, 2, 145, 47, 239, 2, 129, 31, 225, 44, 170, 24, 208, 8, 114, 17, 240, 1, 125, 28, 11, 2, 229, 39, 249, 14, 202, 32, 221, 11, 211, 32, 198, 3, 148, 55, 88, 7, 255, 33, 33, 21, 11, 64, 255, 18, 252, 28, 187, 7, 201, 23, 206, 4, 155, 36, 46, 17, 222, 56, 35, 13, 247, 52, 57, 11, 107, 51, 185, 5, 158, 21, 142, 6, 82, 51, 179, 57, 170, 28, 88, 2, 38, 5, 36, 2, 156, 16, 211, 13, 60, 39, 60, 9, 91, 41, 110, 2, 32, 51, 157, 2, 46, 55, 198, 13, 175, 19, 56, 38, 234, 59, 107, 2, 43, 12, 78, 2, 58, 64, 197, 11, 182, 60, 72, 16, 177, 60, 75, 6, 45, 60, 204, 4, 151, 62, 83, 36, 110, 29, 112, 19, 198, 7, 189, 4, 183, 44, 133, 4, 224, 48, 143, 21, 3, 37, 84, 10, 36, 30, 242, 7, 224, 51, 191, 8, 139, 62, 229, 19, 130, 31, 105, 26, 99, 39, 133, 5, 138, 19, 43, 9, 235, 48, 87, 23, 22, 59, 83, 11, 88, 71, 241, 8, 211, 61, 223, 9, 137, 63, 14, 40, 59, 57, 55, 44, 5, 7, 81, 1, 43, 12, 141, 1, 182, 13, 112, 11, 240, 17, 110, 10, 95, 29, 116, 2, 151, 44, 144, 2, 58, 23, 131, 9, 144, 25, 199, 28, 46, 32, 61, 3, 160, 15, 95, 3, 48, 39, 188, 9, 185, 62, 223, 13, 28, 71, 30, 4, 215, 23, 174, 5, 252, 22, 220, 30, 64, 73, 140, 13, 72, 7, 32, 2, 238, 35, 171, 2, 103, 45, 64, 16, 242, 17, 108, 6, 86, 12, 133, 4, 81, 62, 0, 10, 61, 48, 149, 14, 12, 68, 140, 20, 218, 23, 212, 7, 101, 11, 206, 6, 83, 64, 137, 20, 147, 65, 144, 6, 53, 67, 223, 6, 165, 18, 159, 12, 218, 28, 147, 23, 6, 56, 28, 39, 195, 15, 186, 1, 98, 16, 202, 1, 254, 35, 194, 8, 3, 29, 121, 16, 60, 50, 33, 3, 178, 43, 57, 3, 104, 49, 36, 8, 156, 50, 154, 25, 33, 37, 228, 3, 229, 25, 217, 3, 41, 41, 198, 9, 185, 59, 142, 19, 58, 49, 7, 8, 124, 60, 117, 6, 66, 63, 9, 27, 151, 55, 158, 22, 66, 10, 60, 3, 239, 21, 150, 6, 95, 53, 146, 22, 84, 14, 18, 6, 49, 44, 73, 10, 42, 38, 179, 5, 179, 54, 125, 18, 25, 62, 147, 24, 134, 24, 78, 7, 230, 30, 237, 8, 82, 66, 219, 17, 192, 64, 9, 15, 144, 59, 7, 9, 151, 62, 172, 12, 123, 56, 144, 69, 71, 46, 203, 10, 189, 7, 127, 5, 120, 5, 108, 3, 239, 16, 219, 13, 39, 17, 114, 16, 29, 21, 168, 2, 53, 68, 13, 3, 101, 25, 254, 19, 155, 31, 253, 29, 187, 28, 26, 3, 141, 32, 158, 4, 193, 58, 88, 12, 80, 58, 223, 11, 197, 79, 112, 3, 209, 56, 84, 3, 49, 48, 116, 57, 248, 26, 128, 7, 129, 16, 165, 3, 26, 32, 63, 4, 163, 41, 244, 15, 98, 39, 181, 17, 175, 10, 72, 3, 177, 80, 57, 4, 71, 65, 78, 23, 1, 62, 226, 17, 119, 42, 14, 10, 189, 14, 142, 4, 183, 56, 204, 15, 219, 80, 67, 10, 115, 59, 174, 10, 170, 59, 138, 8, 113, 24, 154, 12, 69, 51, 24, 76, 28, 28, 162, 3, 158, 9, 82, 6, 163, 17, 20, 12, 28, 54, 181, 16, 220, 40, 65, 3, 187, 67, 42, 3, 251, 65, 241, 8, 186, 60, 25, 32, 35, 53, 148, 6, 125, 12, 42, 7, 76, 62, 4, 11, 196, 61, 207, 20, 110, 66, 134, 9, 148, 65, 46, 5, 55, 61, 220, 31, 206, 45, 108, 33, 178, 14, 5, 8, 91, 37, 37, 5, 249, 52, 134, 26, 195, 47, 144, 7, 244, 31, 222, 13, 231, 51, 242, 6, 171, 63, 199, 25, 163, 63, 78, 30, 73, 33, 247, 9, 57, 28, 85, 10, 93, 71, 65, 29, 245, 65, 200, 8, 218, 69, 68, 11, 113, 67, 0, 13, 201, 36, 194, 78, 34, 43, 128, 32, 6, 5, 108, 2, 151, 5, 71, 2, 105, 23, 241, 8, 138, 15, 42, 14, 24, 20, 240, 2, 97, 52, 62, 3, 177, 21, 44, 11, 244, 45, 20, 23, 241, 41, 48, 2, 70, 21, 52, 2, 9, 52, 192, 11, 170, 46, 99, 14, 175, 77, 30, 3, 97, 38, 216, 2, 95, 53, 44, 34, 223, 28, 237, 11, 211, 9, 10, 3, 162, 23, 65, 3, 69, 25, 210, 19, 113, 32, 159, 9, 253, 23, 73, 7, 204, 59, 238, 4, 72, 56, 195, 17, 95, 53, 163, 17, 65, 12, 167, 11, 175, 9, 235, 4, 240, 58, 39, 18, 22, 60, 47, 10, 156, 56, 88, 9, 174, 48, 233, 9, 115, 29, 133, 11, 109, 50, 28, 47, 92, 21, 172, 2, 69, 12, 210, 2, 217, 19, 250, 4, 188, 49, 104, 16, 198, 59, 169, 2, 139, 30, 80, 2, 134, 25, 229, 7, 94, 64, 33, 34, 52, 52, 114, 3, 21, 21, 131, 3, 64, 57, 130, 8, 149, 57, 131, 16, 190, 55, 18, 5, 105, 54, 237, 7, 117, 60, 58, 29, 199, 61, 220, 17, 217, 9, 221, 7, 198, 19, 12, 7, 39, 20, 182, 25, 218, 27, 13, 14, 168, 42, 75, 6, 209, 45, 172, 6, 7, 66, 127, 13, 140, 63, 240, 25, 90, 36, 239, 3, 153, 36, 58, 8, 238, 74, 173, 19, 153, 48, 173, 16, 47, 62, 52, 5, 253, 59, 184, 13, 122, 46, 61, 55, 229, 62, 198, 26, 218, 7, 225, 2, 195, 14, 93, 3, 190, 44, 64, 11, 236, 13, 212, 13, 97, 35, 217, 4, 103, 48, 128, 3, 98, 33, 21, 18, 41, 45, 144, 22, 193, 31, 77, 2, 26, 32, 76, 2, 40, 73, 171, 14, 173, 50, 77, 12, 113, 61, 246, 2, 250, 64, 242, 2, 118, 59, 130, 43, 255, 61, 160, 8, 65, 18, 98, 2, 234, 39, 166, 2, 153, 59, 50, 16, 97, 22, 255, 12, 185, 32, 134, 6, 150, 77, 17, 9, 90, 60, 135, 21, 230, 54, 105, 21, 96, 22, 72, 11, 156, 29, 66, 5, 48, 56, 205, 20, 108, 63, 110, 15, 14, 59, 160, 14, 202, 59, 155, 5, 5, 57, 230, 15, 13, 48, 80, 61, 193, 29, 163, 6, 122, 8, 116, 3, 107, 17, 215, 17, 174, 70, 234, 12, 198, 49, 47, 3, 78, 58, 139, 3, 168, 58, 185, 16, 158, 60, 176, 32, 74, 70, 63, 4, 54, 9, 97, 3, 153, 63, 203, 14, 63, 61, 244, 17, 228, 63, 254, 5, 200, 64, 162, 8, 193, 65, 225, 37, 57, 62, 161, 17, 205, 12, 61, 4, 171, 37, 139, 8, 197, 46, 180, 23, 239, 35, 110, 17, 251, 34, 93, 6, 49, 40, 246, 11, 97, 64, 35, 20, 106, 60, 154, 27, 110, 53, 239, 9, 153, 20, 229, 8, 106, 65, 69, 24, 15, 65, 80, 13, 80, 79, 35, 13, 0, 73, 193, 7, 92, 55, 67, 50, 50, 59, 87, 61, 121, 17, 252, 3, 145, 6, 118, 3, 215, 16, 205, 16, 248, 34, 73, 14, 5, 23, 123, 4, 127, 45, 172, 5, 14, 62, 179, 8, 230, 17, 244, 25, 17, 27, 181, 4, 76, 24, 31, 3, 127, 48, 81, 13, 96, 62, 37, 15, 147, 77, 61, 8, 217, 37, 93, 8, 150, 57, 126, 34, 144, 56, 39, 10, 25, 7, 214, 4, 91, 30, 45, 3, 135, 74, 58, 17, 178, 21, 16, 8, 103, 14, 28, 11, 27, 68, 208, 8, 57, 65, 134, 17, 71, 63, 12, 21, 92, 31, 203, 10, 77, 13, 71, 8, 18, 68, 101, 21, 130, 53, 226, 10, 167, 77, 160, 10, 138, 35, 40, 15, 252, 70, 225, 18, 184, 67, 175, 47, 252, 19, 228, 3, 71, 19, 220, 3, 160, 38, 9, 12, 126, 23, 251, 20, 9, 62, 131, 6, 213, 32, 159, 4, 239, 58, 62, 9, 65, 77, 90, 27, 187, 46, 26, 6, 111, 28, 104, 4, 219, 65, 252, 5, 146, 61, 5, 21, 116, 57, 17, 8, 137, 78, 107, 8, 6, 67, 53, 32, 247, 69, 174, 24, 91, 21, 224, 5, 4, 16, 14, 10, 13, 68, 154, 26, 41, 22, 72, 11, 252, 64, 54, 13, 15, 35, 39, 7, 191, 78, 129, 18, 94, 76, 126, 28, 2, 26, 221, 10, 208, 44, 249, 12, 197, 75, 190, 19, 190, 73, 114, 18, 55, 64, 69, 9, 206, 79, 34, 17, 89, 44, 158, 103, 73, 45, 252, 11, 50, 11, 30, 6, 244, 19, 46, 4, 142, 37, 51, 19, 75, 19, 208, 13, 117, 29, 110, 3, 237, 80, 83, 3, 26, 27, 43, 17, 159, 65, 53, 30, 153, 39, 251, 3, 117, 38, 196, 3, 134, 60, 115, 15, 99, 60, 102, 13, 175, 73, 214, 3, 152, 78, 195, 3, 236, 65, 87, 50, 254, 55, 104, 16, 199, 25, 196, 4, 6, 36, 46, 3, 46, 66, 14, 20, 29, 22, 34, 19, 112, 21, 6, 7, 34, 79, 122, 15, 109, 66, 34, 24, 9, 70, 41, 23, 149, 36, 92, 13, 50, 29, 179, 7, 81, 76, 57, 20, 59, 74, 190, 11, 70, 64, 204, 14, 198, 62, 63, 9, 216, 33, 183, 10, 229, 36, 246, 102, 104, 42, 7, 5, 227, 13, 241, 3, 230, 21, 38, 14, 253, 75, 136, 21, 165, 48, 29, 3, 154, 80, 143, 3, 67, 60, 250, 11, 141, 66, 35, 40, 195, 73, 73, 10, 73, 15, 244, 4, 63, 76, 43, 13, 132, 70, 110, 20, 91, 75, 142, 6, 52, 76, 100, 12, 152, 70, 2, 42, 241, 64, 189, 26, 62, 12, 250, 8, 117, 42, 133, 9, 220, 60, 1, 27, 53, 49, 53, 13, 108, 43, 225, 12, 122, 65, 120, 9, 165, 73, 59, 26, 19, 67, 159, 38, 199, 49, 45, 10, 233, 34, 68, 12, 89, 74, 84, 30, 171, 71, 40, 15, 251, 79, 98, 14, 146, 76, 52, 13, 244, 50, 173, 75, 30, 41, 84, 90, 1, 0, 3, 0, 0, 0, 1, 0, 2, 0, 4, 0, 82, 120, 26, 113, 81, 106, 240, 99, 241, 93, 78, 88, 2, 83, 7, 78, 89, 73, 242, 68, 51, 115, 174, 103, 80, 93, 251, 83, 149, 75, 6, 68, 56, 61, 25, 55, 150, 49, 161, 44, 205, 76, 21, 46, 166, 27, 151, 16, 244, 9, 249, 5, 149, 3, 38, 2, 74, 1, 198, 0, 249, 79, 26, 80, 59, 80, 92, 80, 125, 80, 164, 80, 197, 80, 236, 80, 13, 81, 52, 81, 85, 81, 124, 81, 157, 81, 196, 81, 236, 81, 19, 82, 58, 82, 97, 82, 137, 82, 176, 82, 215, 82, 255, 82, 38, 83, 84, 83, 123, 83, 169, 83, 208, 83, 254, 83, 38, 84, 84, 84, 129, 84, 175, 84, 221, 84, 11, 85, 57, 85, 103, 85, 149, 85, 201, 85, 247, 85, 43, 86, 89, 86, 142, 86, 194, 86, 247, 86, 43, 87, 95, 87, 148, 87, 200, 87, 3, 88, 56, 88, 115, 88, 174, 88, 233, 88, 36, 89, 95, 89, 154, 89, 219, 89, 22, 90, 88, 90, 153, 90, 212, 90, 28, 91, 94, 91, 159, 91, 231, 91, 48, 92, 113, 92, 192, 92, 8, 93, 80, 93, 159, 93, 237, 93, 60, 94, 138, 94, 224, 94, 46, 95, 131, 95, 217, 95, 52, 96, 138, 96, 229, 96, 72, 97, 163, 97, 6, 98, 104, 98, 209, 98, 51, 99, 156, 99, 11, 100, 123, 100, 234, 100, 96, 101, 214, 101, 76, 102, 201, 102, 76, 103, 207, 103, 82, 104, 220, 104, 108, 105, 252, 105, 147, 106, 48, 107, 205, 107, 113, 108, 27, 109, 204, 109, 125, 110, 59, 111, 249, 111, 197, 112, 150, 113, 111, 114, 84, 115, 64, 116, 50, 117, 50, 118, 63, 119, 88, 120, 225, 122, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 225, 122, 88, 120, 63, 119, 50, 118, 50, 117, 64, 116, 84, 115, 111, 114, 150, 113, 197, 112, 249, 111, 59, 111, 125, 110, 204, 109, 27, 109, 113, 108, 205, 107, 48, 107, 147, 106, 252, 105, 108, 105, 220, 104, 82, 104, 207, 103, 76, 103, 201, 102, 76, 102, 214, 101, 96, 101, 234, 100, 123, 100, 11, 100, 156, 99, 51, 99, 209, 98, 104, 98, 6, 98, 163, 97, 72, 97, 229, 96, 138, 96, 52, 96, 217, 95, 131, 95, 46, 95, 224, 94, 138, 94, 60, 94, 237, 93, 159, 93, 80, 93, 8, 93, 192, 92, 113, 92, 48, 92, 231, 91, 159, 91, 94, 91, 28, 91, 212, 90, 153, 90, 88, 90, 22, 90, 219, 89, 154, 89, 95, 89, 36, 89, 233, 88, 174, 88, 115, 88, 56, 88, 3, 88, 200, 87, 148, 87, 95, 87, 43, 87, 247, 86, 194, 86, 142, 86, 89, 86, 43, 86, 247, 85, 201, 85, 149, 85, 103, 85, 57, 85, 11, 85, 221, 84, 175, 84, 129, 84, 84, 84, 38, 84, 254, 83, 208, 83, 169, 83, 123, 83, 84, 83, 38, 83, 255, 82, 215, 82, 176, 82, 137, 82, 97, 82, 58, 82, 19, 82, 236, 81, 196, 81, 157, 81, 124, 81, 85, 81, 52, 81, 13, 81, 236, 80, 197, 80, 164, 80, 125, 80, 92, 80, 59, 80, 26, 80, 249, 79, 210, 79, 177, 79, 145, 79, 112, 79, 13, 0, 14, 0, 16, 0, 18, 0, 20, 0, 21, 0, 27, 0, 32, 0, 6, 0, 7, 0, 6, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 13, 0, 14, 0, 16, 0, 18, 0, 19, 0, 21, 0, 26, 0, 31, 0, 6, 0, 6, 0, 6, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 79, 115, 156, 110, 74, 97, 126, 77, 72, 54, 9, 31, 195, 10, 153, 251, 125, 242, 48, 239, 127, 240, 173, 244, 231, 249, 176, 254, 22, 2, 202, 3, 255, 3, 55, 3, 4, 2, 220, 0, 0, 0, 125, 255, 62, 255, 41, 255, 0, 0, 216, 127, 107, 127, 182, 126, 187, 125, 123, 124, 248, 122, 53, 121, 53, 119, 250, 116, 137, 114, 128, 46, 128, 67, 0, 120, 0, 101, 128, 94, 64, 113, 64, 95, 192, 28, 64, 76, 192, 57, 84, 0, 1, 0, 254, 255, 2, 0, 5, 0, 10, 0, 5, 0, 9, 0, 20, 0, 84, 0, 1, 0, 254, 255, 2, 0, 5, 0, 10, 0, 5, 0, 9, 0, 20, 0, 84, 0, 1, 0, 254, 255, 2, 0, 3, 0, 6, 0, 5, 0, 9, 0, 20, 0, 84, 0, 1, 0, 254, 255, 2, 0, 3, 0, 6, 0, 5, 0, 9, 0, 20, 0, 84, 0, 1, 0, 254, 255, 2, 0, 3, 0, 6, 0, 5, 0, 9, 0, 20, 0, 84, 0, 1, 0, 254, 255, 2, 0, 3, 0, 6, 0, 10, 0, 19, 0, 20, 0, 84, 0, 1, 0, 254, 255, 2, 0, 3, 0, 6, 0, 5, 0, 9, 0, 20, 0, 94, 0, 0, 0, 253, 255, 3, 0, 3, 0, 6, 0, 5, 0, 9, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 19, 0, 19, 0, 19, 0, 19, 0, 23, 0, 39, 0, 57, 0, 5, 0, 8, 0, 8, 0, 7, 0, 8, 0, 7, 0, 2, 0, 8, 0, 4, 0, 7, 0, 2, 0, 4, 0, 7, 0, 2, 0, 8, 0, 4, 0, 7, 0, 2, 0, 8, 0, 8, 0, 7, 0, 8, 0, 7, 0, 2, 0, 6, 0, 4, 0, 7, 0, 2, 0, 6, 0, 4, 0, 7, 0, 2, 0, 6, 0, 4, 0, 7, 0, 2, 0, 6, 0, 8, 0, 9, 0, 9, 0, 8, 0, 9, 0, 2, 0, 6, 0, 4, 0, 9, 0, 2, 0, 6, 0, 8, 0, 9, 0, 2, 0, 6, 0, 4, 0, 9, 0, 2, 0, 6, 0, 8, 0, 9, 0, 9, 0, 8, 0, 11, 0, 3, 0, 7, 0, 4, 0, 11, 0, 3, 0, 7, 0, 8, 0, 11, 0, 3, 0, 7, 0, 4, 0, 11, 0, 3, 0, 7, 0, 8, 0, 9, 0, 9, 0, 8, 0, 13, 0, 4, 0, 7, 0, 5, 0, 13, 0, 4, 0, 7, 0, 8, 0, 13, 0, 4, 0, 7, 0, 5, 0, 13, 0, 4, 0, 7, 0, 9, 0, 9, 0, 9, 0, 8, 0, 13, 0, 4, 0, 4, 0, 5, 0, 6, 0, 13, 0, 4, 0, 4, 0, 5, 0, 8, 0, 13, 0, 4, 0, 4, 0, 5, 0, 6, 0, 13, 0, 4, 0, 4, 0, 5, 0, 8, 0, 9, 0, 9, 0, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 10, 0, 10, 0, 7, 0, 7, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 10, 0, 10, 0, 7, 0, 7, 0, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 10, 0, 10, 0, 7, 0, 7, 0, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 10, 0, 10, 0, 7, 0, 7, 0, 7, 0, 8, 0, 9, 0, 8, 0, 6, 0, 9, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 5, 0, 6, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 5, 0, 9, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 5, 0, 6, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 5, 0, 3, 0, 8, 0, 9, 0, 9, 0, 6, 0, 95, 0, 103, 0, 118, 0, 134, 0, 148, 0, 159, 0, 204, 0, 244, 0, 39, 0, 43, 0, 38, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 23, 0, 24, 0, 25, 0, 26, 0, 27, 0, 28, 0, 48, 0, 49, 0, 61, 0, 62, 0, 82, 0, 83, 0, 47, 0, 46, 0, 45, 0, 44, 0, 81, 0, 80, 0, 79, 0, 78, 0, 17, 0, 18, 0, 20, 0, 22, 0, 77, 0, 76, 0, 75, 0, 74, 0, 29, 0, 30, 0, 43, 0, 42, 0, 41, 0, 40, 0, 38, 0, 39, 0, 16, 0, 19, 0, 21, 0, 50, 0, 51, 0, 59, 0, 60, 0, 63, 0, 64, 0, 72, 0, 73, 0, 84, 0, 85, 0, 93, 0, 94, 0, 32, 0, 33, 0, 35, 0, 36, 0, 53, 0, 54, 0, 56, 0, 57, 0, 66, 0, 67, 0, 69, 0, 70, 0, 87, 0, 88, 0, 90, 0, 91, 0, 34, 0, 55, 0, 68, 0, 89, 0, 37, 0, 58, 0, 71, 0, 92, 0, 31, 0, 52, 0, 65, 0, 86, 0, 7, 0, 6, 0, 5, 0, 4, 0, 3, 0, 2, 0, 1, 0, 0, 0, 15, 0, 14, 0, 13, 0, 12, 0, 11, 0, 10, 0, 9, 0, 8, 0, 23, 0, 24, 0, 25, 0, 26, 0, 27, 0, 46, 0, 65, 0, 84, 0, 45, 0, 44, 0, 43, 0, 64, 0, 63, 0, 62, 0, 83, 0, 82, 0, 81, 0, 102, 0, 101, 0, 100, 0, 42, 0, 61, 0, 80, 0, 99, 0, 28, 0, 47, 0, 66, 0, 85, 0, 18, 0, 41, 0, 60, 0, 79, 0, 98, 0, 29, 0, 48, 0, 67, 0, 17, 0, 20, 0, 22, 0, 40, 0, 59, 0, 78, 0, 97, 0, 21, 0, 30, 0, 49, 0, 68, 0, 86, 0, 19, 0, 16, 0, 87, 0, 39, 0, 38, 0, 58, 0, 57, 0, 77, 0, 35, 0, 54, 0, 73, 0, 92, 0, 76, 0, 96, 0, 95, 0, 36, 0, 55, 0, 74, 0, 93, 0, 32, 0, 51, 0, 33, 0, 52, 0, 70, 0, 71, 0, 89, 0, 90, 0, 31, 0, 50, 0, 69, 0, 88, 0, 37, 0, 56, 0, 75, 0, 94, 0, 34, 0, 53, 0, 72, 0, 91, 0, 0, 0, 1, 0, 4, 0, 5, 0, 3, 0, 6, 0, 7, 0, 2, 0, 13, 0, 15, 0, 8, 0, 9, 0, 11, 0, 12, 0, 14, 0, 10, 0, 16, 0, 28, 0, 74, 0, 29, 0, 75, 0, 27, 0, 73, 0, 26, 0, 72, 0, 30, 0, 76, 0, 51, 0, 97, 0, 50, 0, 71, 0, 96, 0, 117, 0, 31, 0, 77, 0, 52, 0, 98, 0, 49, 0, 70, 0, 95, 0, 116, 0, 53, 0, 99, 0, 32, 0, 78, 0, 33, 0, 79, 0, 48, 0, 69, 0, 94, 0, 115, 0, 47, 0, 68, 0, 93, 0, 114, 0, 46, 0, 67, 0, 92, 0, 113, 0, 19, 0, 21, 0, 23, 0, 22, 0, 18, 0, 17, 0, 20, 0, 24, 0, 111, 0, 43, 0, 89, 0, 110, 0, 64, 0, 65, 0, 44, 0, 90, 0, 25, 0, 45, 0, 66, 0, 91, 0, 112, 0, 54, 0, 100, 0, 40, 0, 61, 0, 86, 0, 107, 0, 39, 0, 60, 0, 85, 0, 106, 0, 36, 0, 57, 0, 82, 0, 103, 0, 35, 0, 56, 0, 81, 0, 102, 0, 34, 0, 55, 0, 80, 0, 101, 0, 42, 0, 63, 0, 88, 0, 109, 0, 41, 0, 62, 0, 87, 0, 108, 0, 38, 0, 59, 0, 84, 0, 105, 0, 37, 0, 58, 0, 83, 0, 104, 0, 0, 0, 1, 0, 4, 0, 3, 0, 5, 0, 6, 0, 13, 0, 7, 0, 2, 0, 8, 0, 9, 0, 11, 0, 15, 0, 12, 0, 14, 0, 10, 0, 28, 0, 82, 0, 29, 0, 83, 0, 27, 0, 81, 0, 26, 0, 80, 0, 30, 0, 84, 0, 16, 0, 55, 0, 109, 0, 56, 0, 110, 0, 31, 0, 85, 0, 57, 0, 111, 0, 48, 0, 73, 0, 102, 0, 127, 0, 32, 0, 86, 0, 51, 0, 76, 0, 105, 0, 130, 0, 52, 0, 77, 0, 106, 0, 131, 0, 58, 0, 112, 0, 33, 0, 87, 0, 19, 0, 23, 0, 53, 0, 78, 0, 107, 0, 132, 0, 21, 0, 22, 0, 18, 0, 17, 0, 20, 0, 24, 0, 25, 0, 50, 0, 75, 0, 104, 0, 129, 0, 47, 0, 72, 0, 101, 0, 126, 0, 54, 0, 79, 0, 108, 0, 133, 0, 46, 0, 71, 0, 100, 0, 125, 0, 128, 0, 103, 0, 74, 0, 49, 0, 45, 0, 70, 0, 99, 0, 124, 0, 42, 0, 67, 0, 96, 0, 121, 0, 39, 0, 64, 0, 93, 0, 118, 0, 38, 0, 63, 0, 92, 0, 117, 0, 35, 0, 60, 0, 89, 0, 114, 0, 34, 0, 59, 0, 88, 0, 113, 0, 44, 0, 69, 0, 98, 0, 123, 0, 43, 0, 68, 0, 97, 0, 122, 0, 41, 0, 66, 0, 95, 0, 120, 0, 40, 0, 65, 0, 94, 0, 119, 0, 37, 0, 62, 0, 91, 0, 116, 0, 36, 0, 61, 0, 90, 0, 115, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 16, 0, 26, 0, 87, 0, 27, 0, 88, 0, 28, 0, 89, 0, 29, 0, 90, 0, 30, 0, 91, 0, 51, 0, 80, 0, 112, 0, 141, 0, 52, 0, 81, 0, 113, 0, 142, 0, 54, 0, 83, 0, 115, 0, 144, 0, 55, 0, 84, 0, 116, 0, 145, 0, 58, 0, 119, 0, 59, 0, 120, 0, 21, 0, 22, 0, 23, 0, 17, 0, 18, 0, 19, 0, 31, 0, 60, 0, 92, 0, 121, 0, 56, 0, 85, 0, 117, 0, 146, 0, 20, 0, 24, 0, 25, 0, 50, 0, 79, 0, 111, 0, 140, 0, 57, 0, 86, 0, 118, 0, 147, 0, 49, 0, 78, 0, 110, 0, 139, 0, 48, 0, 77, 0, 53, 0, 82, 0, 114, 0, 143, 0, 109, 0, 138, 0, 47, 0, 76, 0, 108, 0, 137, 0, 32, 0, 33, 0, 61, 0, 62, 0, 93, 0, 94, 0, 122, 0, 123, 0, 41, 0, 42, 0, 43, 0, 44, 0, 45, 0, 46, 0, 70, 0, 71, 0, 72, 0, 73, 0, 74, 0, 75, 0, 102, 0, 103, 0, 104, 0, 105, 0, 106, 0, 107, 0, 131, 0, 132, 0, 133, 0, 134, 0, 135, 0, 136, 0, 34, 0, 63, 0, 95, 0, 124, 0, 35, 0, 64, 0, 96, 0, 125, 0, 36, 0, 65, 0, 97, 0, 126, 0, 37, 0, 66, 0, 98, 0, 127, 0, 38, 0, 67, 0, 99, 0, 128, 0, 39, 0, 68, 0, 100, 0, 129, 0, 40, 0, 69, 0, 101, 0, 130, 0, 8, 0, 7, 0, 6, 0, 5, 0, 4, 0, 3, 0, 2, 0, 14, 0, 16, 0, 9, 0, 10, 0, 12, 0, 13, 0, 15, 0, 11, 0, 17, 0, 20, 0, 22, 0, 24, 0, 23, 0, 19, 0, 18, 0, 21, 0, 56, 0, 88, 0, 122, 0, 154, 0, 57, 0, 89, 0, 123, 0, 155, 0, 58, 0, 90, 0, 124, 0, 156, 0, 52, 0, 84, 0, 118, 0, 150, 0, 53, 0, 85, 0, 119, 0, 151, 0, 27, 0, 93, 0, 28, 0, 94, 0, 29, 0, 95, 0, 30, 0, 96, 0, 31, 0, 97, 0, 61, 0, 127, 0, 62, 0, 128, 0, 63, 0, 129, 0, 59, 0, 91, 0, 125, 0, 157, 0, 32, 0, 98, 0, 64, 0, 130, 0, 1, 0, 0, 0, 25, 0, 26, 0, 33, 0, 99, 0, 34, 0, 100, 0, 65, 0, 131, 0, 66, 0, 132, 0, 54, 0, 86, 0, 120, 0, 152, 0, 60, 0, 92, 0, 126, 0, 158, 0, 55, 0, 87, 0, 121, 0, 153, 0, 117, 0, 116, 0, 115, 0, 46, 0, 78, 0, 112, 0, 144, 0, 43, 0, 75, 0, 109, 0, 141, 0, 40, 0, 72, 0, 106, 0, 138, 0, 36, 0, 68, 0, 102, 0, 134, 0, 114, 0, 149, 0, 148, 0, 147, 0, 146, 0, 83, 0, 82, 0, 81, 0, 80, 0, 51, 0, 50, 0, 49, 0, 48, 0, 47, 0, 45, 0, 44, 0, 42, 0, 39, 0, 35, 0, 79, 0, 77, 0, 76, 0, 74, 0, 71, 0, 67, 0, 113, 0, 111, 0, 110, 0, 108, 0, 105, 0, 101, 0, 145, 0, 143, 0, 142, 0, 140, 0, 137, 0, 133, 0, 41, 0, 73, 0, 107, 0, 139, 0, 37, 0, 69, 0, 103, 0, 135, 0, 38, 0, 70, 0, 104, 0, 136, 0, 7, 0, 6, 0, 5, 0, 4, 0, 3, 0, 2, 0, 1, 0, 0, 0, 16, 0, 15, 0, 14, 0, 13, 0, 12, 0, 11, 0, 10, 0, 9, 0, 8, 0, 26, 0, 27, 0, 28, 0, 29, 0, 30, 0, 31, 0, 115, 0, 116, 0, 117, 0, 118, 0, 119, 0, 120, 0, 72, 0, 73, 0, 161, 0, 162, 0, 65, 0, 68, 0, 69, 0, 108, 0, 111, 0, 112, 0, 154, 0, 157, 0, 158, 0, 197, 0, 200, 0, 201, 0, 32, 0, 33, 0, 121, 0, 122, 0, 74, 0, 75, 0, 163, 0, 164, 0, 66, 0, 109, 0, 155, 0, 198, 0, 19, 0, 23, 0, 21, 0, 22, 0, 18, 0, 17, 0, 20, 0, 24, 0, 25, 0, 37, 0, 36, 0, 35, 0, 34, 0, 80, 0, 79, 0, 78, 0, 77, 0, 126, 0, 125, 0, 124, 0, 123, 0, 169, 0, 168, 0, 167, 0, 166, 0, 70, 0, 67, 0, 71, 0, 113, 0, 110, 0, 114, 0, 159, 0, 156, 0, 160, 0, 202, 0, 199, 0, 203, 0, 76, 0, 165, 0, 81, 0, 82, 0, 92, 0, 91, 0, 93, 0, 83, 0, 95, 0, 85, 0, 84, 0, 94, 0, 101, 0, 102, 0, 96, 0, 104, 0, 86, 0, 103, 0, 87, 0, 97, 0, 127, 0, 128, 0, 138, 0, 137, 0, 139, 0, 129, 0, 141, 0, 131, 0, 130, 0, 140, 0, 147, 0, 148, 0, 142, 0, 150, 0, 132, 0, 149, 0, 133, 0, 143, 0, 170, 0, 171, 0, 181, 0, 180, 0, 182, 0, 172, 0, 184, 0, 174, 0, 173, 0, 183, 0, 190, 0, 191, 0, 185, 0, 193, 0, 175, 0, 192, 0, 176, 0, 186, 0, 38, 0, 39, 0, 49, 0, 48, 0, 50, 0, 40, 0, 52, 0, 42, 0, 41, 0, 51, 0, 58, 0, 59, 0, 53, 0, 61, 0, 43, 0, 60, 0, 44, 0, 54, 0, 194, 0, 179, 0, 189, 0, 196, 0, 177, 0, 195, 0, 178, 0, 187, 0, 188, 0, 151, 0, 136, 0, 146, 0, 153, 0, 134, 0, 152, 0, 135, 0, 144, 0, 145, 0, 105, 0, 90, 0, 100, 0, 107, 0, 88, 0, 106, 0, 89, 0, 98, 0, 99, 0, 62, 0, 47, 0, 57, 0, 64, 0, 45, 0, 63, 0, 46, 0, 55, 0, 56, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 23, 0, 15, 0, 16, 0, 17, 0, 18, 0, 19, 0, 20, 0, 21, 0, 22, 0, 24, 0, 25, 0, 26, 0, 27, 0, 28, 0, 38, 0, 141, 0, 39, 0, 142, 0, 40, 0, 143, 0, 41, 0, 144, 0, 42, 0, 145, 0, 43, 0, 146, 0, 44, 0, 147, 0, 45, 0, 148, 0, 46, 0, 149, 0, 47, 0, 97, 0, 150, 0, 200, 0, 48, 0, 98, 0, 151, 0, 201, 0, 49, 0, 99, 0, 152, 0, 202, 0, 86, 0, 136, 0, 189, 0, 239, 0, 87, 0, 137, 0, 190, 0, 240, 0, 88, 0, 138, 0, 191, 0, 241, 0, 91, 0, 194, 0, 92, 0, 195, 0, 93, 0, 196, 0, 94, 0, 197, 0, 95, 0, 198, 0, 29, 0, 30, 0, 31, 0, 32, 0, 33, 0, 34, 0, 35, 0, 50, 0, 100, 0, 153, 0, 203, 0, 89, 0, 139, 0, 192, 0, 242, 0, 51, 0, 101, 0, 154, 0, 204, 0, 55, 0, 105, 0, 158, 0, 208, 0, 90, 0, 140, 0, 193, 0, 243, 0, 59, 0, 109, 0, 162, 0, 212, 0, 63, 0, 113, 0, 166, 0, 216, 0, 67, 0, 117, 0, 170, 0, 220, 0, 36, 0, 37, 0, 54, 0, 53, 0, 52, 0, 58, 0, 57, 0, 56, 0, 62, 0, 61, 0, 60, 0, 66, 0, 65, 0, 64, 0, 70, 0, 69, 0, 68, 0, 104, 0, 103, 0, 102, 0, 108, 0, 107, 0, 106, 0, 112, 0, 111, 0, 110, 0, 116, 0, 115, 0, 114, 0, 120, 0, 119, 0, 118, 0, 157, 0, 156, 0, 155, 0, 161, 0, 160, 0, 159, 0, 165, 0, 164, 0, 163, 0, 169, 0, 168, 0, 167, 0, 173, 0, 172, 0, 171, 0, 207, 0, 206, 0, 205, 0, 211, 0, 210, 0, 209, 0, 215, 0, 214, 0, 213, 0, 219, 0, 218, 0, 217, 0, 223, 0, 222, 0, 221, 0, 73, 0, 72, 0, 71, 0, 76, 0, 75, 0, 74, 0, 79, 0, 78, 0, 77, 0, 82, 0, 81, 0, 80, 0, 85, 0, 84, 0, 83, 0, 123, 0, 122, 0, 121, 0, 126, 0, 125, 0, 124, 0, 129, 0, 128, 0, 127, 0, 132, 0, 131, 0, 130, 0, 135, 0, 134, 0, 133, 0, 176, 0, 175, 0, 174, 0, 179, 0, 178, 0, 177, 0, 182, 0, 181, 0, 180, 0, 185, 0, 184, 0, 183, 0, 188, 0, 187, 0, 186, 0, 226, 0, 225, 0, 224, 0, 229, 0, 228, 0, 227, 0, 232, 0, 231, 0, 230, 0, 235, 0, 234, 0, 233, 0, 238, 0, 237, 0, 236, 0, 96, 0, 199, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 1, 0, 3, 0, 2, 0, 4, 0, 1, 0, 4, 0, 1, 0, 4, 0, 0, 0, 205, 12, 156, 25, 0, 32, 102, 38, 205, 44, 0, 48, 51, 51, 102, 54, 154, 57, 205, 60, 0, 64, 51, 67, 102, 70, 154, 73, 205, 76, 159, 0, 64, 241, 53, 167, 206, 0, 190, 242, 52, 176, 12, 1, 67, 244, 88, 185, 93, 1, 201, 245, 133, 194, 163, 1, 215, 246, 223, 200, 226, 1, 166, 247, 189, 205, 42, 2, 116, 248, 147, 210, 125, 2, 66, 249, 109, 215, 221, 2, 18, 250, 77, 220, 74, 3, 222, 250, 30, 225, 201, 3, 174, 251, 0, 230, 90, 4, 124, 252, 216, 234, 1, 5, 74, 253, 179, 239, 193, 5, 25, 254, 141, 244, 158, 6, 231, 254, 104, 249, 156, 7, 181, 255, 67, 254, 193, 8, 133, 0, 33, 3, 17, 10, 83, 1, 252, 7, 147, 11, 33, 2, 213, 12, 80, 13, 240, 2, 178, 17, 79, 15, 190, 3, 140, 22, 155, 17, 141, 4, 104, 27, 63, 20, 91, 5, 67, 32, 72, 23, 41, 6, 29, 37, 199, 26, 248, 6, 249, 41, 203, 30, 199, 7, 212, 46, 105, 35, 149, 8, 175, 51, 185, 40, 100, 9, 138, 56, 222, 48, 113, 10, 224, 62, 135, 63, 244, 11, 253, 71, 150, 82, 120, 13, 27, 81, 93, 107, 252, 14, 57, 90, 93, 107, 252, 14, 57, 90, 0, 0, 1, 0, 3, 0, 2, 0, 6, 0, 4, 0, 5, 0, 7, 0, 0, 0, 1, 0, 3, 0, 2, 0, 5, 0, 6, 0, 4, 0, 7, 0, 248, 127, 211, 127, 76, 127, 108, 126, 51, 125, 163, 123, 188, 121, 127, 119, 239, 116, 12, 114, 217, 110, 89, 107, 141, 103, 121, 99, 31, 95, 130, 90, 166, 85, 141, 80, 60, 75, 182, 69, 0, 64, 28, 58, 15, 52, 223, 45, 141, 39, 32, 33, 156, 26, 6, 20, 97, 13, 178, 6, 0, 0, 78, 249, 159, 242, 250, 235, 100, 229, 224, 222, 115, 216, 33, 210, 241, 203, 228, 197, 0, 192, 74, 186, 196, 180, 115, 175, 90, 170, 126, 165, 225, 160, 135, 156, 115, 152, 167, 148, 39, 145, 244, 141, 17, 139, 129, 136, 68, 134, 93, 132, 205, 130, 148, 129, 180, 128, 45, 128, 8, 128, 255, 127, 46, 124, 174, 120, 118, 117, 125, 114, 186, 111, 41, 109, 194, 106, 131, 104, 102, 102, 105, 100, 137, 98, 194, 96, 19, 95, 122, 93, 245, 91, 130, 90, 33, 89, 207, 87, 139, 86, 85, 85, 44, 84, 15, 83, 252, 81, 244, 80, 246, 79, 1, 79, 20, 78, 48, 77, 83, 76, 126, 75, 175, 74, 231, 73, 37, 73, 104, 72, 178, 71, 0, 71, 84, 70, 173, 69, 10, 69, 107, 68, 209, 67, 59, 67, 168, 66, 25, 66, 142, 65, 6, 65, 130, 64, 0, 64, 0, 0, 175, 5, 50, 11, 140, 16, 192, 21, 207, 26, 188, 31, 136, 36, 53, 41, 196, 45, 55, 50, 143, 54, 206, 58, 245, 62, 4, 67, 252, 70, 223, 74, 174, 78, 105, 82, 17, 86, 167, 89, 44, 93, 159, 96, 3, 100, 87, 103, 155, 106, 209, 109, 250, 112, 20, 116, 33, 119, 34, 122, 23, 125, 255, 127, 255, 127, 217, 127, 98, 127, 157, 126, 138, 125, 42, 124, 125, 122, 133, 120, 66, 118, 182, 115, 227, 112, 202, 109, 110, 106, 208, 102, 242, 98, 215, 94, 130, 90, 246, 85, 52, 81, 64, 76, 29, 71, 206, 65, 87, 60, 186, 54, 252, 48, 31, 43, 40, 37, 26, 31, 249, 24, 200, 18, 140, 12, 72, 6, 0, 0, 184, 249, 116, 243, 56, 237, 7, 231, 230, 224, 216, 218, 225, 212, 4, 207, 70, 201, 169, 195, 50, 190, 227, 184, 192, 179, 204, 174, 10, 170, 126, 165, 41, 161, 14, 157, 48, 153, 146, 149, 54, 146, 29, 143, 74, 140, 190, 137, 123, 135, 131, 133, 214, 131, 118, 130, 99, 129, 158, 128, 39, 128, 0, 128, 249, 150, 148, 221, 53, 235, 27, 241, 93, 244, 116, 246, 223, 247, 237, 248, 184, 249, 86, 250, 214, 250, 61, 251, 148, 251, 221, 251, 26, 252, 78, 252, 123, 252, 163, 252, 197, 252, 227, 252, 252, 252, 18, 253, 38, 253, 55, 253, 69, 253, 81, 253, 91, 253, 100, 253, 106, 253, 111, 253, 114, 253, 116, 253, 116, 253, 114, 253, 111, 253, 106, 253, 100, 253, 91, 253, 81, 253, 69, 253, 55, 253, 38, 253, 18, 253, 252, 252, 227, 252, 197, 252, 163, 252, 123, 252, 78, 252, 26, 252, 221, 251, 148, 251, 61, 251, 214, 250, 86, 250, 184, 249, 237, 248, 223, 247, 116, 246, 93, 244, 27, 241, 53, 235, 148, 221, 249, 150, 48, 117, 144, 101, 8, 82, 152, 58, 64, 31, 0, 0, 192, 224, 104, 197, 248, 173, 112, 154, 153, 104, 33, 3, 201, 9, 85, 253, 154, 250, 70, 2, 92, 2, 6, 251, 183, 13, 250, 232, 182, 17, 13, 254, 108, 248, 195, 11, 62, 236, 238, 21, 58, 248, 219, 251, 77, 250, 90, 17, 68, 253, 41, 235, 1, 18, 196, 1, 179, 253, 232, 242, 137, 11, 243, 4, 68, 251, 226, 245, 195, 6, 86, 14, 133, 238, 49, 252, 39, 17, 23, 246, 181, 3, 173, 250, 45, 252, 102, 22, 66, 118, 247, 14, 60, 240, 156, 11, 232, 251, 22, 252, 173, 9, 29, 244, 255, 10, 73, 247, 217, 6, 181, 249, 178, 6, 17, 249, 7, 6, 16, 252, 173, 1, 87, 255, 216, 1, 16, 251, 128, 8, 110, 245, 219, 9, 171, 249, 88, 1, 58, 3, 7, 250, 188, 6, 135, 249, 165, 6, 241, 247, 84, 10, 12, 244, 81, 11, 70, 248, 45, 2, 12, 3, 167, 250, 74, 3, 143, 2, 98, 57, 254, 44, 244, 4, 55, 245, 217, 233, 90, 29, 221, 255, 9, 245, 32, 244, 215, 18, 136, 11, 24, 223, 201, 14, 175, 5, 131, 8, 67, 222, 115, 31, 201, 247, 82, 250, 9, 3, 84, 4, 175, 246, 206, 8, 149, 254, 94, 253, 201, 247, 158, 23, 207, 233, 48, 4, 51, 12, 62, 236, 192, 20, 231, 246, 112, 241, 12, 27, 207, 240, 163, 2, 17, 249, 29, 0, 161, 39, 66, 118, 247, 14, 60, 240, 156, 11, 232, 251, 22, 252, 173, 9, 29, 244, 255, 10, 73, 247, 217, 6, 181, 249, 178, 6, 17, 249, 7, 6, 16, 252, 173, 1, 87, 255, 216, 1, 16, 251, 128, 8, 110, 245, 219, 9, 171, 249, 88, 1, 58, 3, 7, 250, 188, 6, 135, 249, 165, 6, 241, 247, 84, 10, 12, 244, 81, 11, 70, 248, 45, 2, 12, 3, 167, 250, 74, 3, 143, 2, 0, 64, 103, 65, 213, 66, 76, 68, 203, 69, 82, 71, 226, 72, 122, 74, 28, 76, 199, 77, 123, 79, 56, 81, 255, 82, 209, 84, 172, 86, 146, 88, 130, 90, 126, 92, 132, 94, 150, 96, 180, 98, 221, 100, 18, 103, 84, 105, 162, 107, 254, 109, 102, 112, 221, 114, 96, 117, 242, 119, 147, 122, 66, 125, 255, 127, 3, 115, 186, 110, 119, 98, 225, 79, 109, 57, 245, 33, 71, 12, 184, 250, 206, 238, 23, 233, 38, 233, 191, 237, 33, 245, 96, 253, 187, 4, 232, 9, 58, 12, 175, 11, 211, 8, 146, 4, 0, 0, 23, 252, 140, 249, 180, 248, 126, 249, 133, 251, 48, 254, 218, 0, 244, 2, 36, 4, 75, 4, 136, 3, 38, 2, 135, 0, 11, 255, 254, 253, 134, 253, 166, 253, 61, 254, 25, 255, 0, 0, 191, 0, 52, 1, 84, 1, 40, 1, 198, 0, 78, 0, 220, 255, 136, 255, 93, 255, 91, 255, 124, 255, 177, 255, 237, 255, 34, 0, 73, 0, 91, 0, 89, 0, 70, 0, 38, 0, 0, 0, 254, 254, 194, 254, 73, 254, 134, 253, 112, 253, 251, 252, 57, 253, 10, 254, 244, 254, 63, 255, 254, 255, 125, 0, 122, 0, 217, 255, 247, 255, 105, 0, 129, 0, 27, 1, 116, 1, 63, 2, 235, 254, 188, 254, 59, 255, 25, 254, 67, 254, 150, 254, 220, 254, 229, 255, 177, 0, 31, 2, 86, 1, 5, 2, 4, 2, 130, 0, 27, 0, 152, 255, 136, 255, 116, 255, 182, 255, 200, 255, 204, 253, 81, 252, 16, 250, 59, 252, 210, 252, 242, 253, 190, 254, 254, 255, 159, 0, 145, 2, 200, 254, 228, 254, 126, 254, 171, 253, 19, 254, 242, 253, 94, 254, 27, 255, 105, 0, 193, 1, 211, 253, 154, 252, 205, 251, 105, 252, 74, 252, 16, 253, 59, 253, 196, 254, 62, 0, 230, 1, 198, 254, 65, 255, 53, 255, 182, 254, 96, 255, 153, 255, 205, 255, 131, 0, 82, 1, 3, 2, 10, 6, 224, 8, 194, 14, 112, 21, 60, 27, 190, 32, 63, 39, 221, 43, 222, 49, 146, 53, 84, 37, 17, 42, 27, 49, 236, 51, 45, 56, 131, 45, 92, 41, 39, 38, 145, 33, 84, 25, 6, 0, 82, 0, 125, 255, 154, 0, 200, 255, 33, 253, 183, 0, 191, 255, 247, 254, 9, 0, 46, 255, 151, 254, 113, 0, 206, 2, 25, 7, 242, 3, 190, 4, 37, 6, 89, 3, 53, 5, 228, 8, 59, 3, 32, 6, 141, 7, 205, 2, 197, 7, 158, 8, 70, 3, 148, 4, 31, 7, 209, 2, 232, 3, 106, 8, 30, 1, 220, 1, 229, 5, 9, 255, 237, 253, 230, 0, 147, 0, 174, 255, 57, 2, 26, 0, 79, 255, 80, 252, 229, 255, 239, 254, 180, 2, 92, 255, 248, 254, 73, 255, 224, 0, 22, 3, 15, 4, 131, 3, 178, 3, 89, 2, 229, 1, 3, 3, 126, 4, 12, 2, 165, 2, 135, 3, 116, 255, 119, 1, 10, 3, 154, 1, 164, 2, 173, 1, 45, 1, 18, 2, 241, 3, 207, 2, 134, 2, 38, 0, 226, 0, 111, 1, 40, 0, 145, 0, 211, 255, 7, 254, 34, 1, 121, 0, 135, 255, 46, 1, 127, 0, 166, 0, 132, 255, 129, 254, 68, 252, 154, 254, 57, 254, 47, 252, 203, 2, 110, 3, 126, 3, 210, 3, 155, 3, 211, 0, 221, 1, 16, 1, 64, 0, 188, 0, 178, 255, 17, 0, 113, 255, 191, 255, 38, 0, 131, 2, 74, 2, 109, 2, 122, 255, 86, 254, 117, 253, 91, 1, 33, 2, 4, 11, 164, 4, 166, 10, 138, 9, 142, 0, 176, 255, 199, 6, 27, 1, 130, 0, 205, 1, 250, 254, 113, 254, 135, 251, 101, 254, 155, 0, 174, 1, 73, 1, 119, 1, 11, 3, 53, 0, 30, 255, 117, 255, 127, 255, 20, 255, 146, 6, 29, 1, 232, 2, 47, 5, 226, 2, 185, 2, 128, 6, 56, 1, 153, 1, 10, 1, 69, 1, 208, 2, 135, 0, 1, 0, 221, 0, 197, 1, 8, 0, 203, 0, 145, 0, 43, 1, 128, 2, 248, 2, 29, 0, 212, 1, 126, 2, 103, 0, 173, 1, 123, 1, 164, 1, 186, 3, 164, 3, 46, 5, 186, 4, 234, 4, 192, 2, 244, 3, 128, 4, 90, 255, 68, 254, 246, 254, 196, 254, 126, 255, 136, 254, 191, 0, 127, 4, 112, 7, 16, 255, 225, 253, 20, 251, 144, 255, 12, 1, 183, 4, 70, 0, 38, 4, 47, 6, 22, 1, 80, 5, 38, 6, 254, 254, 240, 254, 0, 253, 19, 0, 51, 2, 192, 8, 253, 255, 247, 254, 135, 0, 217, 254, 177, 253, 124, 254, 140, 0, 98, 1, 50, 255, 252, 254, 8, 254, 229, 252, 79, 254, 50, 253, 217, 250, 109, 0, 75, 1, 194, 3, 83, 254, 169, 255, 140, 2, 216, 254, 170, 1, 251, 3, 17, 255, 7, 3, 83, 3, 233, 1, 54, 5, 49, 4, 178, 254, 180, 254, 25, 0, 31, 2, 182, 4, 15, 7, 70, 1, 61, 0, 215, 2, 66, 2, 81, 3, 125, 5, 48, 255, 235, 254, 73, 1, 104, 255, 64, 0, 157, 2, 78, 254, 90, 253, 41, 253, 58, 254, 185, 255, 251, 0, 93, 2, 224, 1, 254, 0, 30, 254, 11, 0, 228, 3, 223, 254, 139, 1, 230, 1, 210, 2, 25, 4, 160, 5, 226, 255, 196, 254, 238, 252, 150, 255, 141, 255, 149, 253, 93, 3, 194, 5, 132, 5, 31, 4, 86, 5, 160, 4, 44, 3, 213, 4, 157, 3, 42, 0, 5, 255, 192, 253, 86, 1, 141, 0, 58, 254, 88, 255, 176, 255, 79, 5, 170, 254, 112, 253, 29, 249, 100, 0, 53, 3, 213, 2, 222, 3, 235, 2, 32, 3, 76, 1, 184, 1, 56, 2, 151, 2, 123, 1, 84, 3, 112, 0, 165, 0, 143, 254, 85, 2, 142, 3, 26, 1, 248, 255, 66, 3, 1, 5, 160, 254, 60, 2, 183, 2, 206, 1, 198, 8, 14, 7, 89, 1, 190, 0, 94, 5, 160, 1, 147, 3, 118, 8, 168, 0, 174, 255, 24, 1, 252, 253, 66, 254, 72, 3, 47, 0, 21, 2, 44, 0, 150, 254, 57, 253, 137, 251, 22, 0, 193, 0, 192, 5, 171, 255, 233, 0, 21, 7, 194, 255, 67, 2, 224, 5, 38, 2, 176, 3, 213, 6, 211, 2, 138, 2, 124, 4, 204, 3, 116, 3, 115, 5, 87, 254, 131, 2, 0, 0, 232, 3, 184, 3, 74, 4, 249, 0, 166, 5, 160, 2, 178, 254, 169, 255, 124, 8, 214, 253, 90, 7, 112, 10, 140, 0, 34, 7, 61, 7, 152, 3, 213, 6, 30, 10, 52, 4, 141, 7, 246, 7, 119, 255, 69, 254, 237, 249, 245, 4, 150, 4, 212, 1, 19, 254, 134, 255, 241, 5, 61, 254, 9, 4, 190, 4, 226, 1, 159, 6, 94, 4, 47, 3, 137, 2, 128, 1, 66, 254, 76, 253, 107, 0, 193, 254, 163, 253, 138, 255, 49, 255, 7, 254, 13, 2, 44, 254, 244, 255, 176, 10, 75, 0, 142, 7, 25, 5, 112, 3, 54, 9, 219, 8, 5, 5, 39, 6, 212, 7, 208, 255, 208, 254, 94, 251, 77, 254, 51, 254, 5, 255, 146, 254, 108, 254, 221, 253, 223, 254, 163, 253, 171, 253, 230, 253, 214, 252, 91, 255, 136, 255, 3, 0, 100, 1, 127, 2, 217, 4, 222, 5, 96, 0, 177, 0, 238, 2, 77, 254, 183, 253, 106, 251, 156, 254, 109, 0, 177, 255, 27, 254, 32, 1, 213, 7, 9, 0, 92, 4, 219, 2, 112, 3, 86, 8, 178, 3, 247, 254, 49, 6, 41, 4, 133, 4, 186, 4, 75, 3, 14, 254, 100, 253, 175, 1, 118, 1, 65, 1, 27, 255, 160, 5, 53, 8, 101, 5, 193, 1, 205, 1, 131, 4, 151, 255, 39, 0, 128, 254, 249, 254, 111, 1, 182, 0, 141, 254, 108, 253, 5, 3, 68, 255, 127, 4, 203, 3, 53, 5, 96, 6, 155, 5, 6, 3, 243, 4, 197, 4, 30, 254, 192, 252, 47, 250, 19, 255, 46, 255, 92, 3, 122, 3, 79, 6, 40, 4, 216, 1, 38, 4, 168, 4, 185, 0, 53, 4, 221, 3, 200, 253, 32, 252, 88, 249, 63, 254, 122, 252, 5, 248, 114, 255, 135, 254, 54, 254, 46, 255, 214, 253, 251, 251, 245, 255, 109, 4, 217, 8, 183, 254, 93, 253, 131, 252, 6, 255, 145, 2, 163, 4, 7, 2, 230, 5, 243, 6, 8, 2, 27, 2, 123, 5, 15, 2, 141, 5, 22, 5, 205, 253, 153, 252, 32, 251, 109, 255, 49, 254, 111, 3, 180, 255, 30, 9, 24, 11, 51, 2, 13, 10, 81, 9, 120, 2, 134, 7, 104, 11, 207, 2, 231, 7, 48, 7, 223, 253, 45, 253, 84, 4, 129, 0, 131, 255, 116, 3, 137, 5, 96, 6, 157, 3, 162, 255, 30, 6, 215, 6, 171, 254, 253, 5, 15, 6, 79, 2, 139, 1, 238, 254, 180, 255, 213, 3, 15, 11, 153, 0, 169, 11, 52, 7, 8, 4, 5, 10, 189, 10, 228, 5, 16, 11, 87, 7, 23, 3, 175, 4, 26, 2, 66, 255, 59, 254, 209, 5, 234, 254, 220, 253, 134, 4, 11, 255, 149, 7, 252, 7, 0, 4, 24, 6, 114, 6, 0, 2, 253, 0, 210, 1, 194, 255, 189, 254, 127, 4, 39, 254, 136, 254, 251, 1, 79, 254, 100, 5, 114, 8, 131, 3, 151, 7, 165, 5, 134, 0, 192, 2, 184, 1, 204, 1, 13, 2, 228, 255, 62, 254, 23, 1, 58, 5, 0, 0, 203, 3, 252, 0, 67, 254, 141, 253, 33, 252, 164, 254, 166, 253, 112, 250, 142, 1, 200, 2, 120, 6, 149, 255, 58, 1, 78, 255, 93, 0, 178, 8, 190, 8, 6, 2, 81, 3, 144, 2, 50, 254, 57, 253, 65, 254, 174, 0, 222, 255, 167, 4, 137, 255, 42, 0, 237, 3, 140, 254, 18, 1, 246, 2, 12, 4, 48, 9, 46, 7, 163, 2, 188, 6, 218, 5, 174, 1, 6, 5, 85, 8, 127, 255, 73, 254, 0, 0, 139, 254, 32, 3, 96, 8, 6, 0, 51, 6, 174, 9, 222, 1, 84, 2, 80, 8, 84, 254, 32, 253, 225, 5, 129, 1, 178, 0, 212, 3, 139, 0, 193, 1, 201, 4, 242, 253, 182, 252, 42, 252, 145, 0, 18, 6, 218, 4, 111, 2, 168, 5, 144, 2, 93, 1, 248, 3, 202, 5, 31, 0, 232, 254, 159, 1, 196, 254, 212, 2, 105, 6, 104, 1, 34, 4, 44, 2, 76, 254, 154, 254, 177, 4, 157, 254, 99, 4, 147, 7, 145, 1, 48, 6, 200, 8, 241, 253, 12, 252, 99, 1, 233, 0, 238, 0, 185, 8, 218, 253, 127, 252, 129, 253, 147, 254, 11, 254, 165, 7, 133, 1, 68, 7, 85, 6, 162, 0, 108, 4, 240, 4, 19, 255, 150, 4, 110, 5, 128, 253, 101, 254, 116, 0, 28, 255, 158, 6, 250, 8, 103, 6, 138, 8, 219, 8, 50, 2, 249, 4, 98, 10, 67, 1, 82, 1, 238, 6, 66, 2, 83, 4, 84, 3, 22, 0, 82, 2, 166, 3, 113, 255, 206, 2, 190, 1, 50, 0, 71, 0, 247, 255, 174, 254, 70, 253, 129, 250, 102, 0, 118, 255, 204, 252, 202, 254, 43, 254, 133, 251, 158, 1, 67, 0, 245, 254, 36, 4, 46, 3, 161, 5, 12, 6, 80, 5, 248, 4, 218, 6, 103, 7, 125, 6, 227, 7, 85, 8, 28, 7, 16, 7, 14, 9, 53, 7, 132, 2, 163, 255, 198, 1, 90, 3, 73, 1, 120, 255, 233, 1, 254, 254, 128, 255, 58, 255, 23, 253, 215, 255, 204, 255, 247, 254, 39, 252, 90, 1, 137, 0, 223, 1, 51, 249, 20, 253, 84, 253, 117, 251, 67, 249, 145, 254, 129, 252, 135, 251, 240, 252, 24, 254, 78, 252, 56, 252, 171, 255, 122, 254, 43, 253, 215, 0, 172, 254, 85, 255, 252, 3, 148, 3, 177, 7, 52, 2, 179, 0, 234, 2, 150, 2, 209, 3, 198, 6, 119, 3, 110, 2, 146, 3, 171, 3, 88, 3, 141, 4, 53, 1, 176, 2, 35, 3, 149, 3, 161, 0, 58, 2, 118, 0, 236, 255, 229, 254, 208, 252, 214, 255, 204, 0, 52, 251, 187, 254, 50, 254, 61, 252, 54, 255, 113, 255, 36, 252, 28, 254, 151, 254, 66, 253, 46, 252, 35, 254, 210, 254, 234, 252, 92, 251, 156, 255, 238, 252, 192, 251, 226, 251, 77, 252, 108, 249, 54, 255, 181, 252, 242, 252, 241, 251, 158, 250, 123, 252, 144, 253, 146, 255, 171, 255, 100, 1, 213, 0, 246, 255, 19, 254, 108, 1, 6, 3, 169, 1, 54, 3, 223, 1, 173, 255, 45, 2, 8, 2, 32, 252, 232, 249, 196, 253, 165, 253, 27, 253, 230, 255, 10, 254, 130, 253, 121, 252, 209, 0, 50, 1, 147, 0, 196, 254, 175, 253, 172, 253, 171, 255, 45, 255, 31, 255, 106, 252, 239, 253, 117, 0, 233, 0, 73, 254, 30, 253, 77, 4, 239, 2, 121, 2, 177, 5, 180, 6, 231, 5, 229, 6, 177, 5, 142, 3, 98, 4, 132, 4, 81, 3, 74, 5, 100, 3, 214, 1, 153, 252, 130, 251, 252, 248, 153, 252, 163, 252, 32, 252, 138, 255, 155, 0, 212, 0, 229, 251, 175, 252, 162, 253, 163, 251, 199, 248, 66, 245, 5, 252, 109, 250, 179, 248, 114, 1, 72, 255, 98, 254, 191, 3, 237, 1, 104, 0, 190, 3, 15, 4, 31, 2, 154, 0, 141, 2, 201, 0, 225, 4, 251, 1, 150, 0, 151, 2, 247, 1, 230, 0, 111, 2, 9, 3, 163, 2, 147, 2, 88, 0, 146, 255, 75, 3, 244, 0, 224, 0, 126, 1, 29, 2, 46, 1, 212, 2, 177, 1, 154, 2, 142, 4, 222, 2, 85, 1, 118, 255, 20, 0, 115, 254, 97, 251, 88, 254, 210, 255, 191, 254, 160, 254, 132, 255, 53, 5, 253, 3, 56, 4, 6, 1, 110, 1, 211, 2, 154, 3, 27, 1, 217, 253, 31, 0, 132, 253, 157, 253, 79, 253, 71, 253, 97, 254, 72, 252, 245, 252, 55, 255, 207, 250, 170, 253, 153, 254, 71, 252, 251, 250, 166, 0, 237, 1, 49, 1, 221, 0, 78, 3, 191, 2], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE); allocate([98, 2, 72, 3, 168, 3, 6, 3, 45, 253, 212, 250, 19, 251, 155, 254, 255, 251, 148, 250, 184, 251, 160, 250, 147, 254, 120, 250, 167, 248, 160, 253, 250, 248, 65, 249, 94, 253, 223, 253, 107, 251, 65, 253, 166, 2, 18, 3, 148, 0, 133, 255, 184, 2, 8, 5, 132, 2, 94, 1, 246, 255, 158, 1, 102, 2, 15, 0, 137, 0, 88, 1, 45, 255, 210, 252, 24, 250, 205, 252, 121, 254, 94, 252, 180, 253, 47, 0, 177, 253, 126, 252, 115, 252, 183, 251, 93, 255, 8, 251, 113, 251, 99, 255, 72, 250, 11, 250, 123, 254, 6, 251, 92, 251, 144, 253, 159, 2, 213, 0, 198, 1, 124, 0, 238, 254, 243, 253, 39, 253, 16, 254, 104, 255, 192, 250, 122, 0, 135, 0, 167, 244, 179, 253, 118, 254, 64, 249, 185, 1, 206, 255, 196, 5, 136, 3, 19, 3, 60, 1, 236, 0, 72, 254, 165, 254, 217, 0, 157, 1, 113, 252, 107, 252, 121, 0, 57, 254, 92, 252, 202, 0, 164, 255, 47, 254, 137, 254, 232, 1, 134, 1, 218, 1, 108, 3, 217, 2, 60, 1, 233, 248, 224, 250, 99, 253, 87, 0, 194, 3, 176, 1, 51, 2, 7, 255, 222, 251, 250, 0, 29, 1, 81, 4, 117, 4, 171, 1, 184, 2, 242, 251, 128, 249, 210, 249, 76, 252, 90, 1, 160, 0, 203, 254, 240, 254, 166, 252, 158, 2, 112, 2, 226, 4, 80, 252, 104, 254, 102, 253, 162, 253, 192, 254, 128, 254, 20, 254, 230, 0, 65, 0, 78, 1, 206, 255, 240, 255, 240, 255, 78, 253, 139, 250, 255, 6, 180, 6, 119, 5, 174, 9, 15, 8, 124, 5, 221, 4, 191, 5, 146, 5, 130, 254, 243, 251, 254, 255, 173, 0, 114, 254, 121, 4, 211, 5, 232, 7, 9, 7, 4, 3, 250, 4, 226, 5, 149, 5, 199, 6, 209, 7, 55, 4, 194, 4, 249, 4, 126, 251, 197, 248, 207, 250, 216, 252, 147, 251, 184, 251, 61, 254, 247, 251, 70, 249, 65, 0, 66, 2, 172, 255, 60, 250, 126, 246, 14, 249, 3, 253, 170, 250, 18, 254, 38, 255, 174, 253, 93, 252, 81, 1, 20, 255, 50, 2, 53, 9, 102, 10, 146, 7, 209, 5, 252, 4, 106, 3, 189, 0, 102, 1, 118, 1, 17, 250, 23, 247, 214, 246, 57, 252, 9, 251, 209, 247, 140, 253, 92, 251, 250, 249, 125, 6, 19, 4, 34, 2, 53, 2, 37, 4, 220, 2, 192, 255, 188, 252, 78, 254, 76, 254, 160, 255, 203, 0, 54, 4, 192, 4, 100, 6, 139, 3, 254, 5, 218, 3, 70, 1, 197, 3, 77, 3, 142, 0, 172, 255, 197, 0, 214, 1, 75, 9, 34, 6, 109, 4, 214, 1, 190, 4, 139, 1, 96, 5, 176, 4, 101, 4, 18, 4, 92, 1, 225, 253, 46, 251, 136, 254, 41, 255, 75, 255, 225, 1, 101, 248, 171, 249, 46, 255, 18, 253, 95, 251, 134, 1, 29, 0, 113, 254, 27, 0, 52, 3, 212, 4, 243, 2, 183, 2, 211, 3, 153, 1, 82, 255, 173, 4, 11, 4, 144, 3, 76, 5, 54, 7, 32, 252, 99, 250, 228, 1, 51, 250, 92, 249, 208, 0, 100, 254, 180, 4, 152, 5, 241, 254, 128, 3, 120, 4, 96, 254, 241, 6, 154, 5, 96, 249, 172, 245, 52, 255, 3, 249, 241, 249, 9, 4, 136, 249, 233, 249, 23, 5, 27, 251, 203, 249, 57, 4, 99, 253, 185, 251, 190, 255, 86, 253, 64, 1, 167, 254, 147, 2, 49, 1, 45, 4, 244, 250, 220, 252, 237, 255, 157, 249, 245, 250, 29, 0, 109, 249, 15, 254, 71, 0, 225, 254, 249, 255, 156, 255, 18, 254, 62, 252, 19, 255, 84, 3, 89, 7, 204, 6, 63, 251, 149, 250, 227, 0, 108, 253, 46, 1, 117, 1, 96, 0, 63, 4, 233, 4, 206, 251, 123, 249, 160, 0, 229, 1, 28, 8, 6, 7, 90, 252, 36, 255, 40, 2, 172, 253, 156, 253, 237, 0, 80, 1, 184, 6, 111, 3, 131, 2, 117, 2, 178, 1, 243, 4, 10, 2, 97, 6, 15, 0, 244, 0, 71, 254, 195, 5, 205, 2, 184, 0, 27, 7, 54, 6, 173, 6, 220, 3, 5, 1, 169, 3, 45, 8, 41, 9, 240, 5, 91, 8, 66, 7, 70, 6, 191, 253, 189, 253, 77, 251, 68, 252, 135, 0, 24, 254, 48, 254, 51, 0, 174, 254, 139, 253, 164, 254, 45, 253, 122, 4, 25, 8, 162, 5, 144, 8, 186, 5, 143, 3, 92, 250, 220, 249, 26, 247, 120, 5, 198, 2, 17, 5, 55, 5, 121, 2, 160, 3, 154, 5, 146, 8, 34, 10, 118, 9, 156, 8, 89, 7, 214, 3, 194, 8, 62, 7, 124, 1, 24, 3, 121, 4, 193, 255, 229, 253, 158, 1, 4, 255, 60, 252, 198, 254, 19, 251, 85, 253, 244, 252, 193, 252, 242, 253, 19, 252, 126, 249, 145, 251, 88, 254, 181, 249, 60, 254, 213, 254, 244, 4, 24, 4, 130, 2, 123, 4, 85, 3, 88, 3, 93, 253, 176, 254, 139, 0, 220, 8, 63, 5, 138, 5, 29, 0, 0, 3, 29, 3, 56, 251, 167, 1, 52, 2, 218, 250, 198, 251, 245, 0, 234, 250, 212, 252, 61, 2, 238, 250, 175, 249, 134, 2, 56, 252, 66, 3, 211, 2, 225, 3, 116, 6, 235, 7, 65, 255, 207, 252, 176, 1, 150, 2, 60, 0, 198, 0, 114, 2, 229, 3, 50, 5, 112, 6, 171, 7, 9, 5, 195, 249, 163, 255, 211, 255, 192, 251, 37, 0, 172, 255, 117, 6, 47, 10, 33, 9, 41, 4, 248, 7, 73, 9, 115, 4, 22, 9, 70, 8, 91, 3, 101, 1, 230, 5, 152, 2, 203, 4, 75, 4, 223, 1, 80, 5, 144, 3, 105, 7, 218, 6, 227, 7, 144, 4, 117, 7, 248, 6, 143, 1, 34, 0, 0, 1, 175, 253, 208, 254, 227, 251, 35, 2, 158, 6, 127, 5, 135, 2, 157, 255, 171, 254, 212, 5, 111, 6, 166, 4, 38, 0, 124, 253, 44, 255, 139, 1, 78, 3, 222, 0, 64, 253, 3, 253, 52, 253, 44, 253, 84, 248, 12, 245, 106, 255, 35, 1, 174, 255, 209, 4, 179, 5, 239, 3, 116, 255, 101, 255, 153, 0, 183, 1, 41, 1, 32, 6, 7, 250, 102, 254, 132, 253, 0, 6, 199, 1, 19, 255, 208, 250, 117, 255, 252, 254, 19, 2, 42, 2, 100, 3, 13, 1, 240, 4, 94, 2, 23, 255, 115, 3, 207, 1, 230, 2, 88, 2, 136, 255, 183, 255, 165, 1, 212, 0, 73, 254, 198, 255, 36, 3, 250, 250, 39, 251, 216, 2, 38, 1, 22, 254, 50, 0, 177, 253, 119, 252, 26, 251, 42, 0, 81, 253, 147, 0, 231, 255, 17, 1, 84, 2, 201, 254, 189, 4, 89, 2, 14, 253, 81, 3, 72, 2, 173, 1, 95, 2, 75, 2, 166, 253, 90, 255, 205, 1, 228, 252, 201, 252, 9, 3, 100, 5, 142, 3, 219, 6, 119, 0, 137, 5, 204, 3, 37, 255, 144, 252, 196, 249, 231, 251, 14, 252, 182, 1, 55, 253, 157, 250, 78, 0, 0, 0, 65, 254, 101, 251, 144, 251, 217, 250, 219, 249, 200, 8, 231, 6, 29, 5, 178, 3, 47, 6, 152, 5, 126, 4, 226, 1, 180, 1, 43, 254, 172, 251, 106, 2, 65, 254, 58, 252, 64, 4, 28, 251, 21, 250, 142, 255, 176, 251, 40, 248, 189, 253, 210, 0, 101, 2, 241, 1, 73, 248, 99, 250, 130, 2, 11, 251, 168, 252, 243, 3, 146, 249, 95, 251, 39, 4, 237, 249, 96, 253, 180, 4, 100, 249, 166, 251, 111, 2, 45, 252, 210, 250, 3, 251, 27, 2, 109, 255, 126, 3, 182, 250, 127, 252, 78, 254, 120, 3, 219, 1, 172, 1, 153, 0, 128, 254, 82, 1, 44, 250, 1, 254, 103, 1, 50, 252, 165, 251, 42, 254, 105, 0, 218, 253, 165, 2, 87, 252, 135, 251, 109, 3, 124, 1, 252, 254, 210, 0, 149, 6, 156, 3, 232, 4, 239, 6, 166, 4, 71, 4, 139, 5, 119, 2, 21, 2, 115, 2, 43, 1, 165, 254, 101, 254, 234, 253, 135, 2, 118, 253, 29, 0, 173, 253, 134, 254, 169, 250, 27, 6, 122, 5, 97, 4, 185, 5, 65, 4, 130, 5, 136, 2, 208, 247, 190, 251, 250, 255, 55, 1, 62, 255, 155, 252, 129, 253, 193, 252, 160, 1, 118, 251, 56, 251, 69, 5, 33, 251, 83, 252, 21, 7, 111, 247, 61, 248, 197, 1, 149, 253, 169, 250, 68, 252, 186, 249, 76, 248, 29, 250, 105, 251, 223, 251, 176, 251, 135, 254, 89, 2, 201, 0, 84, 7, 57, 3, 118, 1, 82, 254, 213, 250, 29, 0, 139, 250, 31, 251, 205, 250, 17, 252, 32, 250, 192, 3, 135, 250, 39, 248, 197, 0, 157, 250, 99, 248, 20, 255, 203, 251, 123, 0, 166, 1, 103, 2, 245, 4, 34, 2, 206, 254, 246, 5, 136, 3, 170, 4, 252, 6, 153, 4, 142, 253, 140, 252, 10, 250, 199, 0, 254, 2, 224, 5, 215, 251, 94, 3, 197, 0, 246, 251, 19, 249, 137, 252, 224, 252, 145, 0, 87, 2, 146, 251, 249, 253, 114, 2, 75, 251, 122, 248, 244, 1, 114, 252, 239, 251, 141, 250, 60, 250, 225, 249, 55, 252, 245, 253, 74, 3, 34, 0, 2, 7, 134, 2, 94, 3, 73, 251, 160, 248, 22, 252, 178, 255, 247, 255, 96, 253, 20, 4, 247, 2, 80, 0, 168, 253, 115, 4, 251, 3, 57, 0, 208, 7, 142, 5, 191, 252, 134, 5, 97, 4, 78, 251, 94, 6, 236, 4, 51, 254, 140, 5, 220, 4, 1, 6, 207, 3, 253, 0, 229, 254, 68, 1, 153, 254, 87, 2, 61, 255, 106, 0, 76, 2, 62, 0, 181, 253, 11, 253, 133, 2, 205, 0, 51, 0, 177, 4, 246, 2, 71, 251, 161, 2, 122, 254, 144, 253, 45, 6, 173, 3, 105, 255, 255, 3, 223, 2, 4, 11, 21, 5, 178, 2, 210, 254, 12, 2, 157, 255, 124, 252, 204, 249, 91, 251, 60, 4, 251, 0, 238, 0, 222, 7, 0, 7, 242, 3, 221, 4, 97, 6, 205, 6, 53, 251, 252, 249, 72, 251, 147, 253, 200, 1, 147, 255, 40, 0, 191, 255, 20, 3, 219, 252, 69, 253, 186, 250, 185, 253, 136, 3, 64, 3, 223, 252, 20, 2, 82, 2, 180, 7, 128, 5, 71, 5, 103, 251, 168, 248, 190, 247, 251, 252, 56, 2, 180, 3, 9, 252, 55, 4, 236, 4, 169, 251, 226, 1, 126, 255, 242, 6, 20, 4, 12, 3, 45, 250, 245, 0, 144, 3, 196, 254, 139, 251, 107, 252, 232, 253, 94, 250, 214, 246, 239, 252, 246, 249, 60, 248, 45, 248, 1, 1, 141, 3, 199, 248, 135, 253, 71, 251, 254, 249, 130, 248, 226, 251, 70, 6, 191, 8, 40, 6, 201, 253, 36, 250, 248, 249, 1, 251, 195, 0, 89, 5, 207, 252, 37, 1, 195, 4, 243, 253, 118, 2, 173, 4, 94, 249, 135, 246, 208, 248, 209, 254, 219, 2, 235, 2, 111, 251, 5, 255, 13, 1, 74, 252, 181, 255, 148, 6, 98, 251, 59, 254, 237, 3, 193, 249, 73, 2, 122, 1, 229, 247, 197, 253, 85, 254, 239, 253, 121, 251, 109, 251, 229, 254, 51, 255, 204, 253, 228, 252, 222, 4, 205, 2, 229, 8, 159, 3, 27, 2, 58, 254, 47, 2, 184, 1, 51, 253, 180, 5, 79, 6, 250, 251, 28, 4, 74, 6, 111, 251, 118, 255, 79, 3, 226, 0, 39, 0, 156, 253, 29, 251, 150, 255, 39, 253, 117, 253, 200, 3, 22, 5, 54, 253, 132, 253, 191, 6, 97, 1, 45, 4, 154, 1, 226, 252, 100, 255, 75, 4, 194, 253, 150, 3, 190, 1, 226, 250, 244, 3, 210, 1, 128, 5, 55, 6, 253, 2, 149, 5, 100, 5, 221, 6, 157, 7, 164, 7, 74, 9, 42, 6, 255, 7, 100, 8, 148, 3, 98, 0, 249, 255, 101, 7, 138, 5, 93, 8, 92, 1, 125, 5, 43, 6, 152, 0, 110, 4, 9, 7, 245, 254, 154, 0, 115, 5, 114, 251, 213, 1, 30, 4, 138, 251, 107, 254, 207, 251, 195, 250, 40, 247, 211, 249, 148, 254, 101, 3, 170, 6, 118, 251, 37, 2, 14, 6, 55, 251, 116, 248, 126, 249, 51, 250, 71, 248, 249, 247, 65, 249, 118, 252, 158, 255, 151, 248, 233, 0, 212, 5, 124, 3, 108, 0, 181, 254, 64, 249, 110, 251, 92, 249, 220, 251, 188, 7, 254, 6, 210, 251, 51, 249, 139, 248, 245, 255, 3, 6, 37, 5, 192, 249, 94, 0, 241, 1, 165, 1, 187, 1, 59, 255, 214, 249, 163, 254, 30, 252, 169, 253, 229, 253, 116, 4, 59, 252, 117, 250, 127, 255, 195, 250, 175, 0, 65, 254, 137, 254, 31, 5, 7, 8, 141, 254, 118, 253, 205, 254, 207, 251, 93, 2, 109, 1, 247, 247, 143, 255, 174, 1, 140, 2, 146, 3, 199, 3, 12, 252, 206, 249, 237, 246, 225, 5, 224, 4, 47, 2, 6, 1, 26, 254, 111, 254, 65, 249, 62, 5, 10, 6, 50, 0, 56, 0, 176, 1, 182, 254, 119, 0, 164, 253, 19, 250, 200, 251, 214, 252, 178, 3, 103, 4, 31, 4, 136, 250, 89, 249, 80, 249, 10, 251, 64, 253, 219, 250, 39, 3, 29, 7, 119, 4, 200, 10, 70, 6, 123, 8, 96, 4, 153, 1, 106, 255, 109, 255, 148, 1, 191, 3, 135, 9, 119, 7, 141, 8, 118, 252, 115, 255, 158, 252, 120, 252, 114, 255, 54, 254, 211, 253, 60, 253, 113, 249, 194, 252, 105, 250, 209, 249, 206, 248, 190, 250, 194, 251, 188, 249, 240, 254, 147, 3, 84, 251, 4, 3, 32, 4, 130, 253, 46, 251, 151, 248, 12, 254, 175, 255, 202, 252, 247, 250, 179, 249, 33, 253, 139, 255, 17, 3, 168, 0, 190, 251, 109, 4, 154, 3, 184, 251, 22, 253, 104, 5, 31, 1, 221, 253, 217, 251, 160, 250, 103, 247, 76, 251, 128, 247, 222, 249, 35, 249, 25, 250, 63, 247, 253, 252, 55, 249, 75, 4, 62, 3, 204, 249, 212, 2, 219, 4, 250, 249, 181, 2, 37, 3, 102, 249, 16, 255, 129, 6, 92, 249, 252, 255, 100, 253, 101, 8, 48, 3, 18, 4, 206, 252, 207, 248, 22, 0, 4, 253, 5, 254, 193, 1, 129, 251, 151, 253, 33, 1, 181, 252, 196, 249, 16, 255, 242, 1, 22, 255, 111, 253, 16, 253, 224, 1, 142, 6, 193, 254, 31, 254, 193, 0, 213, 252, 171, 0, 137, 255, 176, 247, 54, 255, 176, 252, 181, 6, 116, 4, 164, 6, 67, 0, 239, 255, 66, 0, 244, 255, 102, 249, 187, 253, 152, 255, 240, 254, 204, 251, 94, 251, 203, 248, 136, 254, 140, 251, 98, 252, 92, 254, 198, 255, 253, 254, 112, 253, 146, 251, 215, 253, 252, 6, 203, 4, 199, 1, 129, 0, 206, 1, 185, 1, 16, 255, 240, 253, 72, 3, 2, 2, 130, 0, 181, 255, 90, 4, 111, 2, 153, 0, 216, 0, 44, 4, 52, 2, 250, 255, 236, 254, 95, 4, 215, 2, 190, 0, 188, 255, 192, 2, 50, 1, 119, 0, 248, 254, 73, 1, 61, 0, 156, 255, 156, 0, 108, 1, 123, 0, 183, 0, 48, 255, 85, 255, 133, 255, 220, 0, 191, 255, 206, 254, 194, 255, 146, 1, 17, 0, 108, 253, 86, 252, 246, 254, 0, 0, 129, 1, 235, 0, 20, 1, 29, 1, 64, 1, 12, 1, 176, 254, 56, 255, 44, 253, 17, 0, 172, 255, 125, 1, 224, 253, 173, 1, 238, 1, 7, 2, 139, 255, 32, 1, 48, 1, 73, 1, 131, 2, 157, 0, 189, 2, 252, 1, 176, 4, 113, 2, 28, 3, 96, 2, 230, 3, 165, 1, 236, 1, 120, 2, 180, 4, 12, 3, 190, 1, 132, 0, 233, 4, 76, 3, 35, 2, 193, 1, 61, 3, 146, 2, 29, 2, 214, 1, 108, 4, 234, 4, 150, 3, 127, 2, 35, 2, 51, 0, 167, 1, 23, 1, 9, 0, 136, 1, 83, 0, 94, 0, 30, 2, 31, 2, 229, 0, 109, 255, 58, 255, 129, 0, 194, 0, 71, 255, 161, 252, 215, 250, 210, 254, 30, 0, 171, 253, 139, 253, 237, 255, 114, 0, 124, 252, 199, 251, 210, 1, 97, 1, 53, 250, 219, 249, 15, 0, 113, 255, 84, 249, 245, 247, 17, 253, 196, 0, 172, 248, 237, 247, 126, 253, 254, 254, 225, 246, 66, 250, 62, 254, 204, 253, 184, 253, 70, 255, 152, 252, 98, 254, 243, 248, 36, 252, 155, 251, 226, 250, 42, 253, 151, 251, 28, 0, 169, 0, 241, 251, 160, 252, 50, 253, 10, 255, 228, 1, 36, 0, 23, 255, 207, 255, 9, 1, 67, 0, 33, 1, 211, 1, 178, 0, 31, 2, 42, 3, 28, 2, 84, 0, 26, 1, 160, 2, 191, 2, 49, 252, 247, 252, 129, 0, 31, 1, 86, 252, 29, 255, 187, 3, 83, 2, 175, 249, 223, 254, 68, 3, 137, 2, 201, 248, 41, 255, 82, 4, 206, 2, 14, 248, 195, 251, 138, 2, 184, 1, 203, 247, 239, 253, 139, 3, 63, 2, 37, 248, 176, 254, 158, 2, 204, 0, 171, 246, 76, 253, 104, 1, 137, 0, 148, 247, 100, 247, 247, 255, 24, 1, 246, 254, 119, 0, 39, 0, 193, 0, 78, 0, 197, 255, 136, 255, 226, 0, 49, 252, 166, 252, 243, 252, 185, 251, 149, 253, 99, 254, 61, 254, 182, 252, 64, 251, 215, 250, 211, 252, 141, 252, 160, 250, 177, 249, 118, 254, 84, 254, 31, 253, 167, 251, 219, 253, 234, 252, 144, 252, 49, 252, 57, 252, 126, 253, 39, 252, 138, 252, 7, 251, 175, 250, 39, 254, 220, 252, 135, 250, 129, 250, 160, 0, 247, 254, 105, 252, 237, 254, 8, 255, 6, 255, 50, 253, 132, 254, 97, 0, 153, 255, 137, 254, 27, 255, 97, 254, 63, 255, 121, 255, 213, 253, 116, 2, 105, 1, 119, 0, 216, 0, 67, 2, 108, 1, 135, 1, 209, 0, 122, 2, 10, 2, 102, 255, 108, 255, 14, 2, 133, 1, 170, 0, 33, 0, 105, 0, 11, 1, 64, 0, 124, 1, 33, 250, 24, 252, 226, 255, 143, 254, 210, 251, 58, 0, 135, 2, 223, 0, 16, 250, 221, 254, 109, 2, 51, 1, 5, 250, 156, 0, 250, 2, 148, 1, 19, 248, 141, 0, 222, 2, 243, 1, 199, 248, 118, 253, 50, 1, 0, 2, 69, 255, 152, 255, 197, 255, 182, 1, 134, 0, 26, 255, 156, 0, 70, 255, 195, 255, 252, 254, 240, 255, 10, 0, 199, 253, 253, 255, 91, 254, 215, 254, 67, 249, 247, 253, 166, 254, 178, 0, 174, 250, 197, 255, 212, 255, 157, 0, 158, 247, 51, 254, 42, 254, 163, 254, 134, 247, 255, 255, 143, 254, 135, 255, 213, 249, 139, 254, 124, 252, 9, 252, 163, 251, 177, 253, 155, 253, 240, 252, 207, 253, 122, 0, 181, 255, 63, 254, 252, 255, 85, 255, 133, 255, 140, 254, 192, 0, 168, 0, 180, 255, 124, 255, 252, 0, 149, 255, 84, 1, 210, 0, 136, 1, 253, 1, 16, 1, 181, 0, 147, 255, 145, 0, 218, 0, 119, 0, 96, 254, 249, 254, 229, 1, 9, 1, 75, 255, 248, 255, 226, 254, 226, 0, 12, 255, 38, 255, 69, 0, 222, 254, 98, 255, 191, 0, 255, 255, 192, 255, 176, 253, 166, 255, 213, 0, 160, 255, 255, 0, 179, 1, 178, 0, 176, 255, 143, 254, 238, 255, 223, 255, 176, 255, 214, 255, 159, 1, 140, 0, 34, 255, 119, 4, 139, 2, 137, 2, 73, 1, 255, 2, 44, 2, 249, 0, 235, 0, 180, 3, 157, 1, 186, 1, 23, 1, 141, 0, 83, 1, 100, 1, 45, 2, 42, 254, 86, 255, 99, 0, 237, 0, 199, 253, 224, 252, 96, 1, 53, 2, 26, 1, 217, 1, 214, 1, 76, 1, 57, 255, 78, 253, 252, 250, 107, 252, 63, 255, 86, 254, 224, 252, 158, 251, 230, 255, 141, 254, 22, 254, 63, 255, 125, 2, 83, 2, 7, 2, 74, 1, 152, 1, 141, 255, 79, 0, 12, 0, 221, 1, 87, 0, 153, 255, 136, 254, 102, 253, 165, 254, 235, 254, 221, 254, 2, 254, 31, 254, 169, 0, 41, 1, 195, 252, 30, 253, 51, 255, 85, 255, 192, 254, 228, 253, 72, 1, 27, 1, 165, 252, 66, 252, 186, 1, 254, 255, 44, 2, 174, 2, 130, 0, 56, 0, 103, 5, 244, 3, 243, 2, 171, 1, 100, 2, 229, 2, 116, 2, 41, 2, 173, 254, 228, 252, 134, 0, 21, 1, 135, 253, 195, 251, 254, 255, 10, 255, 144, 252, 245, 251, 185, 249, 216, 251, 30, 252, 38, 254, 142, 251, 24, 254, 98, 254, 229, 252, 73, 0, 50, 255, 248, 255, 117, 255, 183, 1, 204, 0, 80, 255, 190, 253, 23, 0, 131, 0, 243, 254, 11, 253, 65, 255, 245, 0, 147, 255, 174, 254, 112, 0, 60, 1, 120, 0, 106, 254, 138, 255, 99, 2, 76, 255, 70, 255, 123, 253, 115, 0, 83, 255, 34, 0, 250, 253, 23, 254, 105, 255, 61, 0, 185, 253, 180, 252, 220, 0, 118, 255, 87, 253, 4, 252, 135, 1, 239, 255, 170, 253, 191, 254, 157, 0, 217, 254, 129, 0, 155, 0, 98, 252, 149, 252, 37, 252, 29, 1, 241, 0, 173, 255, 131, 255, 131, 255, 108, 2, 85, 2, 176, 1, 92, 0, 137, 1, 78, 0, 153, 1, 61, 0, 119, 254, 29, 253, 99, 254, 20, 253, 83, 0, 54, 0, 105, 1, 27, 0, 196, 251, 130, 0, 175, 254, 74, 253, 227, 249, 41, 1, 62, 1, 237, 255, 175, 248, 36, 0, 51, 0, 195, 254, 237, 246, 10, 255, 231, 0, 172, 255, 254, 246, 241, 252, 40, 0, 77, 255, 71, 247, 94, 252, 38, 254, 50, 254, 14, 253, 170, 255, 224, 254, 142, 253, 149, 246, 57, 254, 193, 255, 171, 0, 181, 251, 186, 251, 230, 255, 113, 255, 87, 251, 57, 254, 106, 254, 131, 254, 163, 253, 46, 255, 160, 255, 205, 255, 188, 253, 36, 254, 236, 254, 241, 255, 85, 251, 134, 253, 77, 251, 143, 252, 134, 254, 35, 255, 99, 253, 72, 252, 82, 2, 178, 0, 109, 254, 92, 253, 251, 2, 71, 1, 89, 2, 34, 1, 172, 0, 44, 1, 203, 0, 157, 0, 200, 255, 176, 254, 100, 1, 24, 0, 28, 255, 216, 254, 253, 254, 227, 255, 70, 255, 7, 1, 160, 1, 14, 0, 159, 254, 117, 1, 244, 255, 40, 255, 1, 1, 96, 0, 174, 0, 57, 0, 10, 250, 152, 253, 70, 252, 13, 254, 15, 254, 104, 255, 179, 254, 125, 0, 105, 0, 200, 0, 179, 0, 159, 255, 181, 254, 32, 255, 253, 2, 185, 2, 248, 2, 0, 1, 45, 1, 59, 0, 199, 1, 171, 255, 204, 0, 32, 1, 254, 253, 240, 0, 251, 0, 147, 255, 0, 1, 161, 1, 222, 255, 99, 254, 101, 0, 174, 1, 128, 1, 156, 0, 225, 255, 246, 255, 206, 0, 170, 1, 77, 2, 145, 0, 143, 0, 71, 0, 40, 3, 138, 3, 77, 1, 93, 1, 218, 3, 170, 3, 77, 2, 75, 1, 20, 5, 56, 3, 187, 0, 253, 1, 38, 4, 141, 2, 123, 1, 210, 1, 182, 5, 169, 3, 145, 1, 18, 1, 19, 3, 93, 3, 9, 1, 2, 0, 97, 2, 41, 2, 28, 0, 49, 1, 158, 3, 84, 1, 106, 0, 130, 1, 241, 0, 245, 254, 109, 255, 225, 0, 78, 255, 234, 253, 91, 1, 246, 1, 125, 253, 131, 254, 141, 1, 30, 0, 117, 253, 35, 253, 77, 254, 142, 1, 105, 254, 42, 253, 28, 254, 8, 255, 235, 252, 110, 252, 74, 254, 36, 254, 14, 254, 122, 254, 75, 0, 217, 254, 60, 252, 178, 253, 162, 253, 150, 0, 135, 255, 207, 255, 101, 255, 178, 255, 167, 3, 38, 2, 133, 1, 38, 0, 191, 254, 127, 0, 168, 1, 59, 1, 227, 254, 143, 255, 27, 1, 3, 1, 146, 2, 203, 0, 66, 1, 230, 1, 135, 3, 249, 1, 236, 2, 161, 1, 99, 2, 167, 1, 43, 2, 0, 2, 239, 0, 173, 255, 190, 253, 237, 255, 173, 254, 37, 253, 93, 1, 13, 0, 90, 252, 137, 250, 142, 255, 152, 254, 107, 0, 180, 2, 182, 0, 90, 0, 37, 251, 254, 249, 241, 249, 43, 253, 200, 253, 121, 252, 173, 250, 243, 253, 251, 253, 171, 252, 163, 252, 20, 252, 88, 255, 78, 253, 189, 252, 63, 0, 119, 255, 212, 253, 221, 253, 144, 0, 226, 254, 207, 252, 229, 1, 63, 1, 109, 255, 104, 254, 14, 2, 246, 0, 165, 254, 78, 254, 41, 1, 228, 255, 222, 254, 41, 254, 170, 251, 251, 250, 52, 254, 153, 254, 36, 252, 230, 252, 67, 5, 19, 5, 178, 2, 11, 2, 192, 4, 44, 4, 70, 4, 245, 2, 57, 3, 116, 4, 240, 2, 238, 1, 228, 4, 85, 5, 171, 4, 130, 3, 9, 2, 29, 4, 20, 2, 176, 1, 178, 254, 40, 255, 199, 254, 249, 254, 96, 255, 52, 0, 40, 254, 101, 255, 127, 0, 136, 0, 132, 254, 44, 0, 83, 3, 154, 1, 94, 255, 23, 254, 123, 0, 1, 255, 228, 252, 101, 253, 66, 4, 149, 3, 21, 3, 237, 1, 117, 5, 173, 4, 46, 2, 202, 0, 205, 255, 138, 255, 170, 254, 67, 253, 83, 0, 108, 0, 214, 255, 71, 254, 61, 0, 95, 0, 31, 1, 0, 1, 229, 255, 89, 0, 12, 2, 19, 2, 95, 1, 227, 0, 80, 2, 33, 2, 185, 2, 155, 0, 92, 255, 51, 1, 126, 2, 18, 1, 23, 254, 206, 255, 242, 2, 240, 0, 90, 255, 132, 255, 140, 255, 189, 253, 68, 251, 193, 255, 190, 0, 217, 254, 240, 251, 240, 250, 147, 0, 136, 254, 79, 255, 143, 255, 73, 3, 217, 4, 27, 4, 156, 2, 2, 0, 37, 1, 39, 2, 48, 1, 184, 251, 71, 252, 8, 255, 120, 1, 18, 253, 59, 252, 87, 0, 4, 2, 237, 254, 252, 253, 177, 2, 135, 1, 133, 254, 125, 253, 108, 3, 82, 2, 122, 254, 11, 252, 123, 253, 61, 2, 149, 255, 200, 253, 79, 253, 198, 252, 255, 251, 229, 255, 184, 254, 53, 255, 93, 3, 237, 2, 36, 2, 233, 0, 132, 249, 237, 251, 195, 1, 108, 0, 108, 253, 148, 253, 174, 1, 236, 0, 21, 0, 116, 254, 122, 251, 137, 253, 92, 5, 18, 5, 199, 3, 65, 2, 101, 4, 101, 4, 77, 2, 198, 1, 189, 254, 159, 252, 45, 254, 153, 0, 44, 254, 69, 253, 220, 252, 3, 254, 120, 254, 50, 253, 52, 255, 221, 255, 165, 253, 187, 251, 201, 253, 94, 255, 7, 254, 20, 252, 154, 255, 94, 1, 219, 0, 224, 0, 167, 1, 252, 0, 139, 1, 79, 2, 96, 2, 107, 1, 22, 253, 160, 255, 117, 1, 172, 0, 171, 0, 39, 1, 202, 2, 83, 1, 233, 0, 77, 0, 107, 0, 21, 1, 157, 0, 153, 0, 13, 254, 156, 254, 11, 6, 49, 4, 64, 2, 238, 1, 220, 254, 173, 254, 8, 254, 176, 253, 121, 252, 184, 255, 149, 253, 31, 254, 198, 249, 163, 251, 201, 253, 2, 255, 231, 252, 5, 254, 204, 253, 221, 254, 20, 254, 236, 253, 246, 1, 48, 2, 130, 254, 171, 1, 88, 2, 230, 0, 29, 255, 221, 1, 251, 0, 75, 0, 29, 1, 74, 3, 45, 3, 220, 1, 226, 250, 203, 250, 186, 0, 121, 1, 181, 253, 107, 252, 131, 2, 125, 1, 94, 251, 215, 253, 155, 1, 82, 0, 153, 251, 204, 252, 82, 255, 228, 253, 164, 253, 119, 0, 31, 2, 205, 0, 132, 254, 145, 2, 141, 3, 55, 2, 112, 0, 214, 254, 138, 254, 114, 0, 167, 252, 5, 255, 56, 0, 159, 0, 145, 1, 89, 1, 222, 255, 116, 255, 145, 255, 161, 253, 41, 0, 102, 2, 99, 1, 142, 255, 179, 255, 218, 1, 66, 2, 56, 0, 170, 5, 156, 3, 74, 4, 140, 5, 229, 2, 144, 1, 246, 0, 22, 0, 76, 2, 57, 1, 135, 255, 71, 1, 63, 3, 216, 1, 142, 251, 160, 253, 88, 3, 40, 2, 39, 251, 208, 251, 126, 2, 88, 2, 154, 254, 254, 0, 179, 254, 209, 254, 122, 253, 227, 2, 102, 1, 74, 0, 202, 4, 135, 6, 197, 4, 81, 3, 193, 8, 88, 6, 215, 3, 124, 2, 49, 7, 197, 5, 237, 2, 128, 1, 94, 1, 7, 1, 87, 0, 128, 0, 146, 248, 83, 252, 112, 255, 192, 255, 58, 249, 1, 255, 32, 1, 225, 255, 172, 245, 42, 251, 110, 1, 235, 0, 149, 249, 188, 251, 192, 250, 208, 254, 227, 253, 205, 251, 164, 251, 123, 0, 102, 251, 4, 255, 208, 252, 76, 255, 8, 252, 21, 2, 53, 2, 233, 0, 25, 254, 82, 254, 68, 255, 78, 1, 99, 3, 212, 4, 22, 2, 171, 0, 202, 249, 185, 249, 123, 2, 118, 2, 108, 247, 54, 1, 156, 3, 156, 1, 202, 246, 184, 254, 188, 3, 17, 2, 177, 245, 135, 254, 118, 2, 22, 1, 214, 245, 61, 1, 31, 3, 43, 1, 154, 246, 133, 0, 84, 1, 31, 0, 148, 247, 68, 250, 131, 0, 125, 0, 96, 251, 22, 254, 117, 255, 46, 0, 24, 253, 191, 1, 123, 3, 52, 2, 67, 0, 61, 254, 134, 2, 92, 2, 215, 253, 83, 254, 148, 252, 140, 1, 162, 0, 190, 255, 25, 5, 147, 3, 223, 1, 67, 2, 64, 4, 26, 3, 194, 1, 22, 1, 54, 2, 68, 1, 223, 251, 102, 255, 148, 0, 79, 255, 15, 246, 168, 0, 46, 4, 80, 2, 209, 246, 214, 255, 51, 3, 89, 1, 216, 246, 61, 253, 209, 2, 250, 0, 129, 247, 39, 250, 203, 254, 122, 0, 178, 255, 183, 255, 120, 0, 173, 0, 252, 255, 6, 1, 249, 254, 251, 254, 81, 254, 192, 255, 107, 254, 36, 253, 207, 245, 116, 0, 173, 255, 63, 255, 11, 250, 80, 252, 35, 254, 43, 253, 4, 254, 51, 1, 170, 0, 172, 0, 64, 3, 161, 1, 64, 3, 174, 2, 31, 255, 177, 0, 126, 3, 50, 3, 30, 254, 123, 254, 255, 4, 15, 4, 129, 254, 201, 0, 162, 254, 40, 0, 218, 2, 123, 2, 226, 0, 14, 2, 247, 1, 206, 1, 82, 1, 142, 1, 23, 2, 202, 2, 40, 0, 230, 254, 202, 5, 191, 5, 61, 4, 219, 2, 25, 6, 48, 4, 141, 3, 181, 2, 139, 5, 2, 5, 121, 3, 111, 3, 129, 4, 216, 2, 162, 4, 72, 3, 30, 255, 106, 4, 181, 3, 177, 2, 18, 254, 38, 252, 236, 249, 128, 255, 200, 253, 47, 253, 55, 253, 230, 255, 61, 1, 12, 2, 70, 0, 135, 0, 107, 254, 159, 252, 26, 249, 116, 253, 82, 255, 223, 252, 117, 3, 5, 3, 103, 255, 165, 255, 75, 4, 239, 2, 6, 254, 131, 251, 85, 3, 134, 2, 241, 0, 14, 3, 7, 2, 27, 2, 61, 7, 164, 6, 77, 4, 172, 2, 31, 251, 50, 250, 48, 254, 188, 0, 131, 252, 127, 250, 224, 250, 171, 254, 121, 255, 182, 1, 81, 255, 18, 0, 87, 4, 208, 3, 63, 1, 208, 0, 106, 250, 24, 249, 83, 0, 202, 1, 238, 253, 24, 252, 51, 1, 129, 0, 184, 252, 241, 255, 227, 255, 156, 254, 113, 252, 100, 252, 133, 251, 14, 255, 137, 255, 240, 253, 127, 0, 123, 255, 7, 253, 3, 253, 190, 0, 173, 255, 197, 254, 127, 3, 10, 2, 231, 0, 34, 255, 102, 0, 193, 255, 84, 254, 60, 1, 187, 2, 123, 1, 70, 0, 25, 0, 204, 2, 58, 1, 148, 255, 251, 1, 106, 3, 54, 2, 238, 0, 108, 0, 173, 3, 7, 2, 195, 0, 169, 1, 196, 255, 85, 254, 1, 1, 139, 0, 153, 255, 138, 253, 190, 1, 78, 1, 114, 1, 156, 1, 48, 0, 84, 255, 78, 253, 229, 254, 45, 2, 187, 0, 226, 254, 158, 0, 227, 1, 140, 0, 14, 1, 168, 254, 137, 253, 156, 3, 67, 2, 140, 255, 132, 0, 142, 0, 210, 1, 188, 255, 192, 255, 230, 0, 111, 255, 210, 254, 226, 253, 221, 252, 112, 252, 250, 3, 225, 2, 251, 252, 247, 3, 118, 2, 41, 1, 220, 245, 95, 0, 189, 1, 80, 1, 182, 247, 235, 1, 254, 1, 191, 0, 27, 251, 161, 0, 254, 255, 188, 254, 86, 250, 135, 253, 56, 253, 151, 255, 182, 252, 2, 255, 101, 254, 100, 0, 128, 253, 222, 254, 242, 3, 251, 2, 118, 253, 57, 1, 145, 4, 218, 2, 140, 0, 249, 1, 6, 4, 254, 2, 4, 3, 31, 1, 43, 4, 55, 3, 239, 1, 237, 2, 49, 1, 67, 1, 92, 255, 206, 1, 78, 0, 143, 1, 170, 254, 150, 252, 69, 0, 85, 2, 240, 255, 108, 2, 109, 2, 81, 1, 118, 255, 68, 254, 247, 254, 218, 0, 84, 0, 62, 254, 185, 3, 154, 2, 34, 255, 221, 252, 29, 2, 92, 2, 103, 252, 160, 250, 244, 0, 116, 0, 183, 252, 45, 253, 118, 2, 76, 2, 140, 0, 151, 2, 38, 1, 112, 1, 167, 3, 22, 4, 113, 3, 247, 2, 210, 6, 184, 5, 148, 3, 116, 2, 180, 1, 195, 3, 25, 1, 1, 0, 137, 255, 74, 0, 30, 2, 213, 0, 1, 0, 201, 253, 45, 1, 241, 0, 4, 1, 179, 1, 222, 0, 140, 1, 168, 3, 189, 3, 84, 4, 191, 2, 254, 1, 250, 1, 40, 3, 222, 1, 89, 2, 182, 2, 192, 3, 108, 2, 204, 3, 229, 2, 212, 3, 88, 2, 66, 3, 205, 2, 255, 2, 172, 2, 131, 2, 204, 3, 167, 3, 126, 2, 245, 1, 149, 2, 208, 2, 83, 3, 151, 255, 136, 253, 209, 254, 139, 255, 83, 254, 130, 0, 21, 3, 186, 1, 246, 253, 68, 255, 192, 2, 117, 1, 9, 253, 42, 0, 46, 3, 11, 2, 237, 253, 143, 251, 117, 1, 66, 2, 86, 253, 77, 251, 57, 254, 29, 1, 117, 251, 215, 249, 182, 251, 44, 0, 81, 0, 174, 255, 200, 2, 107, 1, 221, 1, 246, 0, 186, 3, 110, 2, 68, 6, 86, 6, 253, 4, 123, 3, 129, 5, 91, 3, 156, 3, 124, 3, 6, 3, 17, 4, 179, 3, 118, 4, 40, 0, 222, 253, 181, 255, 32, 1, 152, 253, 150, 255, 71, 253, 230, 255, 87, 255, 96, 255, 133, 252, 29, 253, 233, 254, 128, 254, 251, 251, 162, 254, 245, 6, 28, 5, 22, 4, 48, 3, 44, 6, 253, 5, 192, 5, 154, 4, 225, 5, 52, 4, 192, 4, 131, 3, 122, 3, 136, 3, 52, 2, 142, 2, 152, 3, 180, 2, 253, 3, 88, 3, 19, 254, 132, 0, 177, 0, 249, 1, 71, 0, 195, 0, 228, 255, 97, 0, 200, 1, 95, 1, 92, 255, 88, 0, 183, 1, 22, 1, 216, 255, 94, 1, 115, 5, 181, 3, 234, 0, 161, 255, 219, 252, 40, 254, 38, 0, 93, 255, 111, 1, 158, 255, 233, 1, 11, 2, 1, 4, 154, 4, 188, 4, 138, 3, 63, 1, 34, 5, 46, 3, 205, 1, 133, 255, 225, 253, 220, 252, 191, 1, 20, 253, 188, 254, 127, 252, 153, 251, 31, 253, 11, 254, 235, 252, 55, 253, 203, 2, 9, 3, 215, 4, 154, 3, 157, 7, 147, 7, 88, 5, 97, 3, 218, 2, 112, 3, 246, 2, 132, 1, 153, 252, 198, 1, 17, 0, 5, 255, 131, 254, 214, 252, 209, 249, 239, 0, 247, 253, 58, 252, 232, 252, 3, 1, 134, 252, 178, 250, 254, 252, 183, 255, 166, 0, 93, 1, 44, 255, 67, 1, 184, 252, 211, 254, 217, 1, 179, 1, 89, 253, 48, 254, 216, 2, 95, 1, 100, 255, 57, 255, 155, 2, 176, 1, 29, 0, 4, 255, 159, 1, 224, 1, 37, 253, 133, 254, 145, 0, 47, 2, 240, 253, 137, 253, 122, 251, 97, 255, 189, 1, 17, 1, 123, 0, 127, 2, 117, 1, 130, 255, 32, 3, 56, 2, 84, 0, 94, 255, 208, 2, 200, 2, 194, 252, 232, 253, 71, 255, 222, 0, 152, 1, 196, 1, 245, 1, 3, 3, 127, 252, 181, 250, 189, 255, 186, 1, 232, 252, 130, 250, 54, 2, 90, 2, 167, 0, 186, 254, 253, 1, 74, 1, 161, 255, 142, 253, 38, 253, 168, 254, 132, 6, 193, 4, 11, 3, 199, 1, 36, 5, 60, 3, 72, 2, 207, 2, 148, 1, 225, 255, 245, 3, 21, 3, 89, 0, 107, 0, 123, 3, 37, 2, 103, 3, 45, 6, 149, 3, 159, 2, 98, 3, 199, 5, 9, 5, 86, 3, 135, 1, 44, 4, 98, 4, 44, 3, 78, 0, 206, 253, 89, 1, 51, 2, 173, 1, 153, 255, 161, 1, 19, 3, 134, 255, 75, 254, 155, 1, 20, 3, 111, 252, 95, 254, 90, 2, 242, 2, 30, 255, 240, 255, 151, 0, 248, 2, 68, 253, 118, 0, 152, 255, 242, 255, 152, 251, 48, 0, 28, 1, 137, 1, 122, 254, 93, 254, 129, 253, 140, 255, 114, 252, 50, 1, 60, 1, 243, 255, 183, 4, 216, 3, 53, 3, 157, 2, 85, 251, 75, 253, 140, 0, 43, 255, 140, 252, 96, 254, 57, 255, 210, 253, 152, 253, 245, 0, 108, 254, 104, 253, 6, 1, 56, 0, 151, 253, 44, 253, 171, 255, 21, 254, 192, 254, 112, 253, 198, 253, 193, 252, 127, 255, 240, 253, 30, 250, 193, 255, 145, 254, 127, 254, 154, 254, 191, 254, 4, 0, 51, 0, 146, 254, 42, 255, 63, 1, 255, 1, 146, 0, 159, 2, 239, 255, 221, 254, 146, 255, 208, 1, 117, 255, 16, 254, 54, 255, 220, 0, 200, 254, 137, 253, 108, 253, 183, 255, 113, 253, 204, 252, 106, 253, 115, 253, 248, 250, 167, 252, 82, 254, 71, 252, 65, 252, 248, 254, 207, 255, 44, 254, 184, 255, 131, 254, 162, 254, 205, 253, 63, 255, 105, 254, 55, 0, 104, 254, 221, 252, 11, 0, 203, 254, 137, 2, 188, 0, 58, 255, 0, 254, 205, 1, 177, 255, 54, 254, 218, 250, 249, 254, 122, 255, 245, 253, 135, 249, 77, 254, 17, 254, 3, 253, 57, 0, 165, 254, 98, 254, 178, 1, 139, 251, 14, 255, 104, 253, 167, 252, 34, 0, 188, 255, 61, 253, 174, 254, 163, 1, 163, 0, 226, 255, 250, 254, 57, 254, 235, 252, 106, 250, 47, 253, 238, 3, 152, 2, 13, 1, 25, 0, 107, 2, 4, 1, 183, 0, 96, 0, 56, 252, 178, 250, 124, 254, 135, 0, 75, 253, 67, 3, 200, 1, 154, 0, 81, 4, 191, 2, 57, 2, 107, 1, 89, 6, 46, 5, 217, 3, 236, 2, 36, 255, 219, 0, 76, 0, 48, 255, 81, 250, 130, 249, 49, 0, 149, 0, 60, 252, 84, 255, 16, 253, 176, 254, 113, 2, 209, 0, 6, 255, 190, 255, 7, 252, 186, 252, 254, 255, 61, 1, 136, 247, 51, 250, 118, 255, 123, 0, 172, 248, 205, 247, 247, 253, 85, 0, 57, 252, 146, 254, 73, 253, 143, 252, 103, 252, 13, 252, 5, 253, 75, 252, 132, 255, 0, 255, 160, 254, 108, 253, 178, 0, 207, 1, 98, 1, 48, 1, 48, 249, 177, 253, 230, 254, 79, 0, 55, 247, 175, 0, 99, 3, 243, 1, 118, 255, 76, 255, 75, 255, 235, 255, 13, 247, 39, 251, 52, 254, 248, 253, 253, 252, 195, 1, 246, 255, 204, 254, 15, 1, 191, 255, 4, 0, 214, 0, 233, 254, 77, 254, 213, 255, 164, 254, 98, 253, 35, 0, 191, 255, 45, 255, 38, 3, 23, 2, 85, 0, 41, 1, 57, 0, 239, 0, 210, 2, 237, 1, 225, 0, 149, 2, 72, 3, 35, 2, 228, 253, 136, 254, 14, 0, 93, 1, 213, 1, 209, 2, 75, 1, 162, 0, 224, 253, 16, 253, 194, 255, 246, 255, 142, 1, 168, 255, 212, 2, 189, 2, 237, 255, 235, 253, 162, 255, 89, 2, 136, 0, 185, 255, 87, 253, 21, 253, 90, 255, 168, 254, 5, 1, 206, 255, 161, 0, 204, 255, 229, 1, 81, 1, 117, 249, 50, 0, 190, 0, 163, 255, 22, 247, 25, 255, 62, 255, 174, 255, 161, 255, 173, 253, 102, 255, 128, 0, 126, 3, 245, 1, 76, 2, 201, 1, 167, 254, 206, 0, 122, 0, 110, 0, 137, 253, 29, 255, 199, 253, 3, 0, 152, 1, 239, 0, 141, 1, 226, 0, 59, 255, 254, 255, 128, 0, 235, 1, 1, 5, 136, 3, 36, 1, 215, 0, 26, 2, 50, 1, 3, 1, 253, 1, 91, 253, 233, 251, 13, 0, 65, 1, 89, 253, 180, 253, 154, 254, 44, 255, 210, 253, 243, 0, 134, 2, 223, 1, 230, 1, 86, 1, 122, 2, 20, 2, 107, 0, 34, 3, 75, 1, 136, 0, 144, 255, 114, 254, 249, 251, 226, 254, 186, 254, 63, 253, 32, 1, 16, 1, 19, 5, 120, 4, 154, 4, 92, 3, 89, 254, 121, 0, 127, 254, 108, 255, 217, 254, 210, 254, 190, 252, 205, 252, 16, 0, 232, 255, 55, 255, 36, 254, 43, 2, 91, 0, 11, 255, 38, 1, 218, 255, 133, 254, 62, 252, 59, 251, 89, 251, 18, 250, 239, 254, 117, 254, 122, 254, 11, 252, 123, 253, 61, 2, 205, 248, 250, 251, 249, 1, 212, 1, 232, 2, 179, 3, 97, 2, 237, 1, 79, 253, 108, 251, 140, 253, 121, 255, 254, 251, 195, 0, 155, 1, 196, 0, 46, 6, 123, 4, 63, 2, 81, 1, 41, 251, 247, 252, 120, 253, 114, 255, 83, 2, 57, 3, 199, 3, 223, 2, 74, 251, 54, 252, 175, 255, 170, 254, 23, 253, 13, 0, 184, 255, 119, 1, 198, 1, 19, 0, 127, 5, 153, 3, 145, 249, 84, 255, 93, 3, 50, 2, 160, 3, 1, 6, 39, 4, 228, 2, 88, 246, 72, 252, 8, 1, 82, 0, 10, 254, 59, 252, 202, 250, 123, 0, 99, 3, 212, 4, 22, 2, 171, 0, 240, 246, 52, 254, 12, 3, 107, 1, 90, 251, 151, 253, 252, 0, 195, 255, 82, 255, 34, 0, 243, 3, 20, 3, 227, 246, 247, 0, 167, 1, 153, 0, 240, 255, 157, 254, 6, 1, 193, 1, 216, 249, 207, 251, 224, 253, 141, 254, 153, 253, 207, 254, 27, 4, 37, 3, 175, 2, 16, 2, 6, 0, 74, 255, 167, 3, 107, 3, 234, 3, 41, 3, 199, 0, 1, 1, 126, 0, 76, 0, 184, 253, 142, 251, 87, 2, 44, 2, 175, 251, 145, 250, 201, 249, 249, 253, 47, 252, 211, 250, 108, 0, 91, 1, 46, 253, 49, 252, 109, 1, 101, 0, 111, 255, 169, 2, 249, 0, 103, 255, 0, 0, 178, 254, 198, 253, 159, 0, 156, 1, 29, 1, 176, 254, 151, 253, 71, 252, 58, 252, 119, 3, 177, 2, 29, 251, 84, 0, 71, 255, 114, 254, 176, 253, 177, 1, 20, 4, 141, 2, 85, 0, 73, 1, 216, 255, 105, 1, 79, 254, 63, 253, 210, 1, 62, 2, 102, 255, 142, 2, 80, 2, 34, 1, 89, 255, 72, 0, 93, 1, 175, 0, 162, 2, 41, 1, 209, 3, 208, 2, 211, 4, 180, 4, 245, 2, 232, 1, 112, 254, 243, 254, 26, 2, 116, 1, 186, 250, 149, 250, 86, 251, 165, 255, 238, 4, 108, 3, 7, 3, 188, 2, 169, 253, 218, 255, 82, 254, 46, 253, 184, 7, 94, 6, 223, 3, 96, 2, 111, 0, 20, 1, 30, 255, 160, 255, 77, 252, 124, 254, 245, 255, 249, 255, 209, 254, 237, 253, 185, 252, 82, 1, 198, 6, 174, 6, 125, 5, 245, 3, 252, 253, 169, 252, 123, 253, 210, 0, 80, 253, 96, 254, 1, 2, 230, 0, 202, 252, 131, 253, 134, 251, 192, 254, 72, 252, 110, 253, 74, 253, 183, 0, 142, 255, 145, 253, 50, 3, 162, 2, 65, 255, 52, 255, 219, 2, 123, 2, 51, 0, 197, 4, 115, 3, 64, 2, 70, 252, 81, 254, 58, 3, 86, 2, 170, 254, 13, 253, 124, 252, 105, 254, 154, 251, 158, 254, 50, 255, 0, 254, 221, 253, 214, 252, 155, 254, 148, 253, 66, 0, 3, 2, 183, 255, 102, 254, 152, 252, 79, 252, 92, 250, 53, 251, 191, 0, 239, 255, 224, 253, 25, 255, 252, 249, 224, 253, 123, 252, 138, 252, 134, 252, 242, 249, 19, 246, 205, 252, 54, 252, 175, 0, 198, 252, 46, 251, 6, 253, 169, 253, 234, 255, 122, 2, 213, 252, 37, 252, 122, 252, 189, 254, 203, 0, 26, 0, 129, 254, 21, 255, 243, 252, 113, 254, 238, 4, 138, 3, 92, 252, 137, 250, 156, 250, 144, 253, 93, 0, 87, 0, 98, 254, 229, 253, 77, 253, 37, 0, 121, 2, 254, 1, 125, 254, 36, 254, 206, 250, 143, 1, 66, 0, 7, 1, 105, 254, 207, 255, 177, 254, 95, 254, 17, 4, 73, 7, 245, 252, 191, 251, 96, 250, 22, 253, 166, 252, 64, 3, 187, 253, 9, 253, 141, 254, 95, 253, 6, 254, 40, 8, 208, 253, 134, 253, 101, 251, 15, 1, 241, 0, 14, 0, 74, 254, 12, 255, 115, 254, 207, 1, 178, 4, 23, 4, 162, 253, 227, 252, 98, 250, 205, 255, 189, 254, 225, 1, 32, 255, 184, 253, 241, 253, 238, 1, 113, 3, 170, 2, 79, 254, 206, 254, 22, 252, 42, 2, 147, 2, 222, 0, 171, 0, 96, 255, 159, 254, 169, 2, 6, 7, 29, 6, 172, 252, 99, 251, 97, 249, 176, 254, 102, 253, 114, 0, 187, 253, 12, 253, 24, 253, 61, 255, 119, 1, 241, 1, 47, 254, 220, 252, 182, 251, 154, 0, 26, 1, 125, 255, 206, 255, 65, 255, 49, 253, 67, 1, 220, 2, 6, 6, 46, 253, 205, 252, 132, 250, 105, 0, 6, 255, 185, 0, 78, 255, 10, 254, 26, 253, 65, 1, 254, 1, 87, 4, 189, 254, 201, 253, 58, 252, 127, 0, 228, 1, 82, 1, 96, 255, 52, 0, 174, 254, 220, 2, 87, 5, 18, 6, 142, 253, 222, 252, 96, 249, 226, 254, 182, 253, 164, 2, 73, 253, 169, 254, 142, 254, 22, 254, 39, 1, 101, 7, 138, 253, 194, 253, 10, 252, 176, 255, 133, 2, 187, 255, 250, 255, 194, 254, 148, 254, 14, 3, 170, 5, 14, 4, 199, 254, 35, 253, 141, 250, 120, 0, 60, 0, 221, 1, 248, 254, 183, 253, 133, 255, 199, 2, 221, 4, 121, 2, 165, 255, 157, 254, 8, 252, 3, 3, 246, 2, 5, 1, 253, 0, 81, 0, 38, 254, 162, 3, 167, 8, 184, 6, 216, 252, 181, 251, 123, 248, 208, 253, 242, 252, 169, 0, 220, 252, 206, 251, 68, 255, 142, 253, 201, 255, 125, 5, 74, 253, 52, 253, 86, 251, 108, 253, 98, 1, 73, 1, 254, 253, 201, 255, 225, 253, 110, 1, 9, 4, 158, 4, 110, 253, 65, 252, 179, 250, 201, 255, 72, 255, 93, 0, 163, 253, 226, 254, 106, 253, 148, 1, 193, 1, 59, 3, 226, 254, 162, 254, 17, 251, 116, 2, 50, 1, 227, 0, 240, 255, 147, 0, 145, 253, 186, 0, 155, 3, 98, 8, 94, 253, 134, 252, 186, 249, 69, 254, 28, 255, 83, 1, 143, 254, 234, 252, 103, 254, 231, 0, 86, 0, 189, 5, 64, 254, 187, 253, 219, 251, 82, 2, 194, 1, 79, 255, 132, 255, 86, 255, 65, 254, 159, 2, 135, 4, 124, 5, 36, 254, 101, 253, 25, 250, 179, 255, 118, 255, 204, 2, 79, 255, 140, 254, 131, 254, 195, 1, 166, 3, 147, 3, 6, 255, 80, 254, 202, 252, 16, 1, 60, 3, 190, 1, 26, 0, 19, 0, 225, 255, 186, 2, 156, 6, 120, 8, 122, 253, 47, 252, 124, 248, 77, 255, 39, 254, 12, 1, 133, 254, 23, 253, 77, 253, 11, 0, 127, 0, 9, 4, 24, 254, 107, 252, 199, 252, 61, 0, 67, 1, 135, 0, 147, 0, 111, 255, 82, 253, 173, 2, 18, 3, 146, 6, 6, 254, 176, 252, 239, 250, 35, 0, 90, 0, 222, 0, 233, 255, 166, 254, 98, 253, 199, 1, 79, 2, 7, 5, 53, 255, 175, 253, 194, 251, 140, 2, 96, 1, 181, 1, 39, 0, 63, 0, 55, 254, 73, 3, 241, 4, 57, 8, 248, 253, 142, 252, 208, 249, 184, 254, 57, 253, 141, 5, 172, 253, 170, 254, 186, 255, 209, 0, 173, 0, 136, 7, 89, 254, 170, 253, 103, 252, 165, 1, 93, 2, 218, 255, 254, 255, 11, 255, 129, 255, 128, 3, 177, 7, 111, 4, 133, 254, 250, 253, 213, 249, 173, 0, 118, 0, 241, 2, 201, 255, 131, 254, 204, 255, 217, 3, 253, 3, 241, 2, 254, 255, 221, 254, 133, 252, 241, 2, 224, 3, 167, 1, 8, 1, 131, 0, 60, 255, 127, 3, 226, 8, 239, 9, 133, 253, 192, 251, 61, 246, 239, 253, 42, 252, 14, 2, 4, 253, 194, 252, 220, 253, 76, 254, 60, 1, 87, 2, 93, 253, 84, 252, 22, 253, 199, 255, 236, 0, 245, 255, 55, 255, 175, 255, 226, 252, 16, 0, 77, 3, 22, 6, 31, 253, 39, 252, 68, 251, 44, 254, 17, 0, 34, 1, 233, 254, 184, 253, 68, 253, 183, 0, 54, 3, 193, 2, 247, 254, 20, 254, 93, 251, 165, 1, 152, 0, 212, 1, 122, 254, 166, 0, 244, 254, 39, 0, 14, 6, 76, 7, 133, 253, 58, 252, 221, 249, 59, 254, 20, 254, 142, 3, 228, 254, 253, 251, 181, 255, 75, 255, 123, 255, 60, 7, 67, 254, 144, 253, 106, 251, 164, 1, 111, 1, 207, 255, 123, 254, 44, 255, 87, 255, 195, 2, 49, 4, 184, 4, 229, 253, 58, 253, 87, 250, 83, 0, 93, 255, 228, 1, 20, 255, 225, 253, 157, 254, 82, 1, 151, 4, 46, 3, 10, 255, 203, 254, 66, 252, 94, 2, 248, 2, 60, 0, 166, 0, 248, 255, 93, 255, 206, 254, 57, 7, 3, 10, 21, 253, 255, 251, 9, 249, 93, 254, 66, 254, 209, 0, 50, 253, 202, 253, 234, 253, 6, 254, 181, 2, 89, 3, 49, 254, 71, 253, 198, 251, 69, 1, 175, 1, 50, 255, 241, 255, 248, 255, 5, 253, 33, 2, 151, 3, 238, 5, 157, 253, 241, 252, 223, 250, 0, 1, 201, 255, 208, 0, 91, 255, 164, 254, 106, 253, 65, 1, 168, 2, 162, 3, 186, 254, 83, 254, 73, 252, 228, 1, 190, 1, 58, 2, 59, 255, 72, 0, 183, 255, 141, 3, 175, 5, 205, 6, 205, 253, 31, 253, 74, 248, 132, 255, 96, 254, 206, 2, 34, 254, 108, 254, 198, 254, 240, 255, 190, 1, 100, 6, 217, 253, 231, 253, 18, 253, 198, 255, 126, 2, 214, 0, 55, 0, 71, 255, 241, 254, 124, 4, 21, 5, 188, 4, 29, 254, 97, 253, 16, 251, 117, 0, 29, 1, 31, 2, 52, 255, 121, 254, 145, 255, 1, 2, 2, 6, 86, 3, 142, 255, 66, 255, 46, 252, 109, 3, 83, 2, 208, 1, 4, 1, 4, 1, 201, 254, 236, 2, 235, 8, 168, 8, 251, 253, 79, 252, 133, 247, 186, 254, 60, 253, 122, 1, 212, 252, 77, 253, 24, 255, 208, 253, 175, 2, 129, 5, 36, 253, 78, 253, 188, 252, 153, 254, 133, 2, 130, 1, 247, 254, 62, 0, 90, 253, 145, 0, 108, 6, 184, 4, 213, 253, 36, 252, 47, 251, 178, 255, 14, 0, 114, 0, 185, 254, 154, 254, 23, 254, 136, 1, 165, 2, 185, 2, 55, 255, 20, 255, 140, 251, 181, 2, 193, 1, 178, 0, 13, 255, 0, 1, 79, 254, 99, 2, 105, 5, 152, 9, 156, 253, 123, 252, 72, 250, 205, 254, 239, 255, 243, 1, 197, 254, 101, 253, 2, 255, 0, 1, 172, 1, 183, 5, 26, 254, 90, 254, 224, 251, 143, 2, 114, 1, 18, 0, 154, 255, 71, 255, 236, 254, 243, 2, 42, 6, 55, 5, 24, 254, 165, 253, 118, 250, 182, 0, 163, 255, 102, 3, 183, 255, 54, 254, 164, 254, 67, 3, 94, 3, 189, 3, 230, 254, 179, 254, 22, 253, 35, 2, 71, 3, 172, 1, 17, 1, 167, 255, 13, 0, 172, 3, 172, 6, 16, 10, 94, 254, 196, 251, 34, 249, 212, 255, 154, 254, 3, 1, 15, 254, 125, 253, 208, 253, 99, 0, 45, 2, 193, 3, 91, 254, 2, 253, 107, 252, 39, 1, 70, 1, 184, 0, 175, 0, 15, 0, 142, 253, 20, 2, 110, 3, 189, 7, 69, 254, 0, 253, 5, 251, 221, 0, 156, 0, 12, 1, 39, 0, 149, 254, 7, 254, 183, 2, 4, 3, 116, 4, 94, 255, 53, 254, 112, 252, 197, 2, 188, 1, 146, 2, 25, 0, 47, 1, 200, 254, 244, 4, 130, 5, 179, 6, 215, 254, 2, 253, 212, 248, 249, 254, 148, 255, 46, 4, 106, 254, 243, 255, 127, 255, 57, 0, 182, 1, 174, 10, 138, 254, 25, 254, 189, 252, 48, 1, 184, 2, 164, 0, 104, 0, 21, 255, 5, 0, 75, 6, 108, 7, 119, 5, 27, 255, 186, 253, 211, 250, 149, 1, 192, 0, 49, 3, 169, 255, 74, 254, 111, 0, 4, 4, 175, 4, 225, 3, 68, 0, 81, 255, 90, 252, 9, 4, 93, 4, 195, 1, 222, 1, 200, 0, 8, 255, 79, 8, 136, 10, 250, 7, 189, 252, 213, 250, 173, 247, 225, 252, 76, 253, 210, 1, 212, 252, 248, 251, 43, 254, 146, 253, 32, 1, 152, 3, 67, 253, 183, 252, 210, 251, 101, 254, 0, 2, 8, 0, 122, 254, 165, 255, 24, 253, 226, 255, 19, 4, 137, 4, 202, 252, 132, 251, 124, 251, 218, 254, 210, 255, 110, 0, 101, 254, 138, 254, 90, 253, 214, 0, 19, 2, 156, 2, 106, 254, 92, 254, 86, 251, 231, 1, 232, 0, 47, 1, 194, 254, 91, 0, 40, 254, 123, 0, 208, 4, 141, 9, 46, 253, 72, 252, 41, 250, 30, 253, 93, 253, 52, 5, 225, 253, 162, 253, 45, 255, 161, 255, 158, 255, 228, 5, 219, 253, 254, 253, 87, 251, 217, 1, 211, 0, 73, 0, 224, 254, 144, 255, 123, 254, 25, 2, 52, 5, 234, 4, 201, 253, 13, 253, 247, 249, 71, 0, 229, 254, 120, 2, 86, 255, 31, 254, 19, 254, 169, 2, 234, 3, 49, 3, 156, 254, 181, 254, 147, 252, 163, 1, 194, 2, 90, 1, 241, 0, 222, 255, 186, 254, 121, 1, 158, 7, 91, 7, 41, 253, 205, 251, 167, 249, 23, 255, 225, 253, 116, 0, 244, 253, 218, 252, 183, 253, 183, 255, 222, 1, 217, 2, 224, 254, 99, 252, 137, 251, 173, 0, 191, 1, 204, 255, 68, 0, 27, 255, 162, 253, 193, 1, 17, 2, 5, 7, 177, 253, 149, 252, 173, 250, 183, 0, 112, 255, 68, 1, 153, 255, 60, 254, 102, 253, 111, 2, 232, 1, 152, 4, 18, 255, 1, 254, 20, 252, 70, 1, 40, 2, 202, 1, 136, 0, 108, 0, 193, 254, 114, 2, 63, 5, 91, 7, 22, 254, 122, 253, 62, 249, 70, 255, 63, 254, 216, 3, 30, 253, 180, 255, 86, 255, 218, 253, 243, 2, 0, 10, 16, 254, 2, 254, 77, 252, 210, 0, 182, 2, 204, 255, 84, 0, 190, 254, 57, 255, 66, 4, 89, 6, 200, 4, 136, 254, 165, 253, 140, 250, 87, 1, 74, 0, 120, 2, 81, 255, 10, 254, 224, 255, 204, 3, 52, 5, 222, 2, 52, 0, 217, 254, 167, 251, 41, 4, 150, 3, 160, 0, 137, 1, 107, 0, 115, 254, 190, 4, 89, 10, 205, 6, 136, 253, 79, 251, 157, 248, 49, 253, 235, 254, 97, 1, 117, 253, 144, 252, 134, 255, 45, 255, 209, 0, 58, 5, 206, 253, 54, 253, 221, 251, 48, 255, 132, 1, 159, 0, 192, 254, 195, 255, 217, 253, 37, 1, 68, 4, 163, 5, 120, 253, 159, 252, 27, 251, 207, 255, 113, 255, 49, 1, 111, 254, 29, 255, 183, 253, 49, 2, 20, 2, 159, 3, 139, 255, 69, 254, 92, 251, 251, 1, 180, 1, 36, 1, 177, 255, 233, 0, 54, 254, 159, 2, 1, 4, 92, 9, 135, 253, 182, 252, 11, 250, 204, 254, 226, 254, 128, 2, 139, 254, 147, 253, 105, 254, 162, 1, 253, 0, 25, 5, 197, 254, 187, 253, 143, 251, 60, 2, 173, 2, 231, 254, 61, 0, 188, 255, 141, 254, 223, 3, 77, 4, 218, 5, 19, 254, 85, 253, 174, 250, 209, 255, 164, 0, 192, 2, 0, 255, 198, 254, 244, 254, 119, 2, 181, 3, 28, 4, 138, 255, 164, 254, 191, 252, 68, 0, 156, 4, 56, 2, 152, 0, 117, 0, 34, 0, 89, 4, 110, 7, 191, 8, 167, 253, 65, 252, 86, 249, 113, 255, 23, 254, 224, 1, 180, 254, 113, 253, 194, 253, 54, 0, 97, 1, 168, 4, 50, 254, 116, 253, 228, 252, 150, 0, 37, 2, 112, 0, 195, 0, 145, 255, 253, 253, 167, 2, 84, 4, 111, 6, 210, 253, 19, 253, 63, 251, 247, 255, 16, 1, 85, 1, 203, 255, 247, 254, 233, 253, 233, 1, 75, 3, 18, 5, 136, 255, 30, 254, 248, 251, 120, 2, 31, 2, 152, 1, 179, 0, 50, 1, 242, 253, 100, 4, 184, 5, 196, 8, 95, 254, 238, 252, 230, 249, 32, 255, 128, 254, 84, 5, 135, 254, 53, 254, 231, 255, 129, 1, 233, 1, 126, 8, 180, 254, 117, 253, 195, 252, 32, 2, 41, 2, 61, 0, 22, 0, 143, 255, 167, 255, 104, 4, 189, 6, 244, 5, 40, 255, 139, 254, 139, 249, 161, 0, 60, 1, 140, 3, 91, 255, 34, 255, 189, 255, 82, 5, 151, 4, 21, 3, 73, 0, 4, 255, 1, 253, 226, 2, 164, 3, 104, 2, 106, 1, 246, 0, 130, 255, 19, 3, 94, 10, 211, 11, 77, 253, 174, 251, 114, 247, 203, 253, 180, 253, 12, 2, 178, 253, 45, 252, 22, 254, 249, 254, 141, 1, 214, 3, 191, 253, 187, 252, 79, 252, 234, 255, 179, 1, 207, 255, 66, 255, 138, 255, 139, 253, 168, 255, 216, 4, 233, 5, 132, 253, 229, 251, 5, 252, 221, 254, 189, 0, 3, 1, 255, 254, 42, 254, 139, 253, 145, 0, 177, 3, 126, 3, 186, 254, 148, 254, 186, 251, 31, 2, 4, 1, 118, 2, 54, 255, 189, 0, 47, 255, 101, 1, 99, 5, 43, 8, 199, 253, 205, 251, 87, 250, 54, 253, 17, 255, 151, 3, 92, 254, 63, 253, 172, 255, 147, 255, 142, 255, 103, 9, 99, 254, 239, 253, 103, 251, 226, 1, 112, 1, 131, 0, 70, 255, 184, 255, 125, 255, 93, 3, 231, 4, 196, 4, 157, 253, 110, 253, 195, 250, 227, 0, 135, 255, 119, 2, 80, 255, 23, 254, 38, 255, 233, 2, 151, 4, 189, 3, 191, 254, 108, 255, 88, 252, 159, 2, 198, 3, 216, 0, 84, 1, 253, 255, 113, 255, 213, 1, 56, 7, 133, 9, 39, 253, 63, 252, 109, 249, 43, 255, 2, 255, 65, 1, 1, 254, 74, 254, 247, 253, 130, 255, 213, 2, 135, 3, 172, 254, 83, 253, 248, 251, 60, 1, 224, 1, 20, 0, 23, 0, 167, 255, 217, 253, 97, 1, 27, 4, 253, 6, 224, 253, 11, 253, 172, 250, 42, 1, 231, 255, 180, 1, 156, 255, 120, 254, 249, 253, 211, 1, 242, 2, 54, 4, 46, 255, 114, 254, 202, 251, 108, 2, 146, 2, 118, 2], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE + 10240); allocate([33, 0, 147, 0, 78, 255, 153, 3, 151, 6, 129, 7, 187, 254, 240, 253, 70, 248, 2, 0, 227, 254, 142, 3, 141, 254, 22, 254, 26, 255, 0, 0, 85, 2, 218, 7, 16, 254, 117, 254, 190, 252, 37, 0, 177, 3, 245, 0, 181, 0, 96, 255, 112, 255, 201, 5, 93, 5, 77, 5, 157, 254, 167, 253, 10, 251, 42, 1, 66, 1, 160, 2, 63, 255, 176, 254, 77, 0, 65, 4, 253, 5, 154, 3, 177, 0, 217, 255, 155, 251, 228, 3, 13, 3, 24, 2, 200, 1, 110, 1, 80, 254, 135, 5, 136, 9, 231, 8, 46, 254, 10, 253, 235, 246, 209, 254, 3, 254, 131, 1, 41, 253, 211, 253, 66, 0, 111, 255, 131, 2, 224, 4, 224, 253, 92, 253, 108, 252, 31, 255, 94, 3, 76, 2, 104, 255, 40, 0, 235, 253, 167, 1, 143, 5, 22, 6, 196, 253, 181, 252, 135, 251, 128, 255, 85, 0, 205, 1, 18, 255, 255, 254, 184, 253, 93, 2, 236, 2, 93, 3, 24, 0, 54, 255, 127, 250, 29, 3, 231, 1, 47, 1, 75, 255, 108, 1, 74, 255, 104, 2, 98, 5, 126, 11, 18, 254, 172, 252, 95, 250, 220, 254, 61, 0, 44, 3, 172, 255, 45, 253, 74, 255, 43, 2, 20, 2, 226, 5, 147, 254, 19, 254, 223, 251, 54, 3, 76, 2, 11, 0, 242, 255, 238, 255, 26, 255, 233, 3, 121, 5, 171, 5, 38, 254, 199, 253, 244, 250, 46, 1, 62, 0, 38, 4, 186, 255, 136, 254, 34, 255, 214, 3, 206, 3, 125, 4, 60, 255, 22, 255, 229, 252, 223, 1, 74, 4, 243, 1, 106, 1, 58, 0, 70, 0, 123, 4, 21, 8, 41, 11, 25, 254, 146, 252, 224, 248, 73, 0, 224, 254, 92, 1, 154, 254, 12, 254, 4, 254, 199, 0, 209, 2, 218, 4, 178, 255, 71, 253, 229, 252, 105, 1, 24, 2, 196, 0, 118, 1, 110, 0, 33, 253, 79, 3, 27, 4, 104, 7, 146, 254, 55, 253, 98, 251, 59, 1, 64, 1, 173, 1, 72, 0, 41, 255, 62, 254, 247, 2, 118, 3, 83, 5, 226, 255, 84, 254, 190, 252, 93, 3, 115, 2, 28, 3, 118, 0, 212, 1, 233, 254, 75, 5, 91, 7, 101, 7, 68, 255, 126, 253, 180, 249, 63, 0, 81, 255, 174, 4, 94, 254, 45, 255, 51, 0, 158, 1, 75, 2, 41, 10, 22, 255, 211, 253, 166, 252, 168, 1, 121, 3, 222, 0, 136, 0, 155, 255, 83, 0, 133, 5, 230, 8, 103, 5, 172, 255, 67, 254, 147, 250, 158, 1, 57, 1, 21, 4, 29, 0, 169, 254, 65, 0, 16, 6, 111, 6, 212, 3, 183, 0, 165, 255, 195, 252, 249, 4, 133, 5, 104, 1, 41, 2, 16, 1, 149, 255, 51, 6, 77, 12, 43, 10, 104, 5, 29, 8, 92, 13, 244, 19, 86, 26, 186, 31, 135, 38, 84, 43, 170, 49, 133, 53, 61, 254, 215, 251, 239, 253, 231, 250, 62, 254, 12, 253, 15, 254, 161, 252, 128, 254, 149, 253, 99, 254, 99, 253, 195, 254, 230, 253, 181, 254, 212, 253, 98, 254, 4, 254, 88, 254, 134, 254, 238, 254, 188, 254, 78, 254, 154, 253, 30, 255, 12, 254, 24, 255, 254, 253, 249, 254, 135, 254, 214, 254, 102, 254, 105, 255, 58, 253, 82, 255, 206, 252, 107, 255, 100, 254, 100, 255, 83, 254, 224, 254, 50, 254, 70, 255, 53, 255, 86, 255, 210, 254, 65, 255, 191, 254, 125, 255, 109, 255, 215, 254, 117, 254, 28, 255, 42, 255, 11, 255, 64, 255, 189, 255, 196, 254, 185, 255, 185, 254, 152, 255, 51, 255, 162, 255, 73, 255, 113, 255, 218, 255, 63, 255, 161, 255, 16, 0, 180, 255, 132, 255, 8, 255, 23, 0, 19, 255, 24, 0, 12, 255, 18, 0, 120, 255, 44, 0, 145, 255, 223, 255, 232, 255, 231, 255, 0, 0, 149, 0, 19, 0, 23, 0, 113, 255, 158, 0, 87, 255, 174, 0, 75, 255, 133, 0, 201, 255, 165, 0, 230, 255, 111, 0, 84, 0, 98, 0, 75, 0, 87, 0, 183, 0, 141, 255, 245, 255, 248, 255, 130, 0, 11, 0, 170, 0, 254, 0, 77, 0, 205, 0, 17, 0, 183, 0, 112, 0, 6, 1, 194, 0, 202, 0, 31, 1, 95, 0, 189, 0, 214, 255, 151, 255, 234, 0, 179, 0, 39, 0, 186, 0, 163, 0, 89, 1, 76, 1, 199, 0, 43, 1, 161, 0, 202, 255, 29, 1, 178, 255, 25, 1, 123, 255, 141, 0, 74, 255, 111, 0, 249, 0, 85, 1, 15, 1, 108, 1, 93, 0, 147, 1, 75, 0, 135, 1, 92, 0, 254, 1, 118, 255, 220, 0, 71, 255, 227, 255, 222, 255, 105, 1, 141, 255, 64, 1, 3, 0, 42, 2, 99, 0, 30, 1, 218, 0, 79, 2, 11, 255, 150, 1, 244, 254, 197, 1, 0, 0, 68, 2, 25, 0, 94, 2, 19, 1, 20, 2, 148, 0, 194, 1, 183, 255, 227, 2, 227, 254, 6, 2, 224, 254, 94, 0, 53, 255, 162, 2, 116, 255, 182, 255, 205, 0, 202, 2, 142, 255, 43, 1, 176, 0, 155, 3, 182, 0, 45, 2, 240, 0, 193, 2, 240, 255, 1, 2, 229, 1, 81, 2, 37, 1, 128, 1, 195, 1, 105, 2, 218, 255, 50, 0, 51, 2, 17, 2, 47, 1, 209, 0, 203, 1, 107, 1, 177, 1, 196, 1, 194, 1, 198, 1, 111, 1, 94, 2, 221, 1, 229, 2, 176, 1, 97, 1, 112, 1, 11, 1, 105, 1, 204, 2, 17, 1, 71, 2, 197, 1, 166, 0, 254, 1, 172, 0, 201, 0, 117, 2, 18, 1, 191, 0, 56, 2, 127, 2, 46, 1, 42, 1, 122, 2, 131, 1, 131, 2, 94, 1, 75, 2, 48, 2, 100, 2, 53, 2, 88, 2, 20, 3, 231, 1, 160, 2, 0, 2, 247, 3, 65, 1, 77, 1, 101, 1, 86, 3, 131, 255, 157, 1, 218, 1, 200, 2, 17, 0, 105, 255, 52, 2, 29, 1, 14, 1, 15, 255, 203, 3, 121, 3, 233, 1, 220, 0, 254, 1, 128, 3, 37, 2, 156, 3, 71, 1, 57, 3, 34, 1, 143, 3, 28, 2, 84, 4, 158, 0, 37, 3, 199, 0, 189, 3, 255, 1, 218, 2, 100, 0, 106, 3, 13, 0, 23, 3, 179, 1, 120, 2, 164, 2, 204, 3, 249, 0, 132, 3, 211, 1, 194, 4, 13, 3, 50, 4, 73, 2, 17, 3, 233, 255, 157, 2, 11, 1, 19, 4, 107, 2, 60, 4, 103, 2, 121, 4, 110, 2, 137, 3, 148, 3, 25, 4, 80, 0, 75, 1, 72, 2, 51, 4, 89, 0, 127, 2, 220, 3, 193, 3, 2, 3, 208, 2, 30, 3, 187, 2, 236, 1, 191, 1, 131, 3, 115, 2, 15, 1, 164, 4, 213, 2, 53, 5, 87, 0, 91, 2, 64, 3, 67, 6, 104, 2, 103, 4, 122, 3, 225, 5, 232, 3, 132, 4, 98, 3, 241, 3, 227, 3, 59, 3, 125, 4, 90, 3, 49, 3, 170, 5, 5, 3, 40, 5, 244, 1, 109, 5, 56, 1, 129, 4, 236, 255, 60, 4, 64, 0, 3, 5, 2, 0, 148, 4, 143, 1, 77, 7, 2, 2, 170, 6, 246, 1, 100, 6, 118, 3, 242, 5, 160, 1, 88, 2, 107, 4, 70, 5, 251, 4, 110, 5, 121, 3, 3, 7, 146, 3, 230, 6, 227, 0, 159, 4, 226, 4, 34, 7, 249, 1, 62, 7, 151, 3, 49, 9, 57, 255, 175, 1, 152, 0, 199, 6, 43, 255, 228, 255, 136, 1, 54, 5, 103, 255, 204, 255, 210, 3, 127, 4, 189, 254, 112, 254, 45, 3, 167, 6, 120, 255, 84, 0, 169, 5, 223, 7, 181, 254, 113, 255, 119, 255, 168, 4, 0, 255, 22, 2, 99, 255, 7, 4, 205, 254, 73, 254, 30, 2, 219, 2, 183, 254, 92, 254, 159, 255, 104, 2, 150, 254, 88, 255, 190, 254, 110, 1, 9, 255, 146, 255, 45, 255, 89, 0, 60, 255, 203, 254, 20, 0, 59, 0, 148, 254, 49, 254, 226, 254, 89, 0, 176, 254, 175, 0, 80, 254, 141, 0, 133, 254, 66, 255, 78, 254, 60, 255, 177, 255, 150, 0, 234, 254, 29, 255, 232, 254, 166, 0, 213, 253, 90, 254, 101, 255, 29, 2, 146, 254, 54, 0, 227, 255, 173, 255, 211, 254, 250, 252, 186, 0, 116, 2, 115, 254, 248, 254, 242, 0, 37, 1, 59, 255, 183, 253, 124, 0, 154, 1, 53, 0, 123, 255, 10, 0, 84, 1, 198, 253, 215, 251, 65, 0, 66, 254, 68, 0, 19, 254, 127, 1, 169, 3, 155, 254, 57, 253, 153, 254, 6, 255, 91, 253, 212, 251, 36, 1, 230, 255, 107, 1, 6, 0, 95, 2, 33, 5, 129, 255, 246, 255, 233, 5, 94, 7, 201, 2, 204, 3, 189, 5, 133, 8, 163, 5, 224, 7, 161, 249, 192, 249, 252, 248, 14, 247, 253, 251, 22, 249, 180, 251, 23, 248, 3, 251, 148, 250, 169, 250, 2, 250, 77, 252, 75, 250, 52, 252, 12, 250, 25, 252, 58, 251, 4, 252, 108, 251, 209, 252, 37, 252, 32, 252, 165, 250, 64, 251, 18, 252, 247, 250, 186, 251, 24, 253, 12, 251, 13, 253, 243, 250, 162, 252, 101, 252, 119, 252, 40, 252, 90, 253, 229, 251, 83, 253, 230, 251, 193, 251, 39, 252, 218, 251, 89, 253, 35, 252, 127, 253, 153, 251, 48, 252, 6, 253, 114, 253, 134, 252, 218, 252, 191, 252, 189, 251, 62, 253, 139, 253, 147, 253, 218, 252, 128, 253, 212, 252, 249, 252, 134, 253, 245, 252, 225, 253, 28, 252, 203, 253, 205, 251, 188, 253, 222, 253, 157, 253, 196, 253, 149, 253, 8, 253, 222, 254, 145, 252, 242, 253, 201, 252, 50, 254, 229, 252, 3, 255, 215, 253, 97, 254, 179, 253, 73, 254, 235, 253, 172, 254, 76, 253, 89, 252, 7, 254, 252, 252, 66, 253, 149, 251, 249, 254, 206, 254, 53, 252, 29, 254, 67, 254, 182, 255, 213, 253, 220, 253, 154, 253, 127, 255, 75, 253, 22, 255, 116, 254, 10, 255, 37, 254, 6, 255, 247, 254, 108, 254, 136, 254, 254, 253, 95, 254, 2, 254, 212, 254, 199, 254, 178, 254, 104, 253, 49, 254, 210, 252, 126, 254, 64, 253, 175, 254, 153, 253, 22, 255, 55, 255, 23, 255, 17, 255, 89, 255, 201, 253, 53, 255, 149, 253, 109, 255, 97, 254, 141, 255, 160, 254, 90, 255, 18, 253, 85, 255, 7, 253, 242, 254, 145, 252, 248, 254, 121, 252, 145, 254, 24, 253, 43, 0, 37, 254, 14, 0, 115, 253, 43, 0, 98, 253, 11, 0, 64, 254, 197, 255, 247, 253, 130, 255, 137, 255, 101, 255, 155, 253, 214, 255, 161, 252, 229, 255, 93, 252, 136, 0, 29, 254, 183, 0, 44, 254, 55, 0, 214, 254, 55, 0, 208, 254, 57, 1, 159, 253, 57, 1, 48, 253, 66, 1, 89, 255, 100, 0, 227, 253, 253, 255, 137, 255, 145, 255, 69, 255, 233, 0, 20, 255, 4, 1, 22, 255, 26, 0, 91, 255, 134, 0, 211, 255, 216, 255, 219, 253, 104, 1, 53, 255, 122, 1, 124, 254, 194, 1, 129, 254, 19, 1, 20, 0, 182, 0, 153, 255, 246, 0, 145, 255, 175, 1, 37, 0, 206, 1, 110, 255, 231, 1, 99, 255, 228, 254, 197, 255, 247, 1, 72, 255, 24, 0, 53, 0, 253, 255, 54, 0, 122, 0, 3, 1, 77, 1, 66, 0, 228, 1, 104, 0, 180, 1, 68, 0, 195, 0, 116, 0, 190, 0, 206, 0, 13, 1, 247, 255, 226, 1, 96, 1, 126, 1, 29, 1, 143, 1, 21, 1, 196, 1, 0, 1, 69, 0, 186, 0, 13, 0, 41, 1, 243, 255, 3, 1, 161, 255, 30, 0, 56, 0, 138, 1, 196, 0, 169, 1, 205, 0, 200, 1, 25, 1, 65, 2, 15, 0, 191, 0, 119, 1, 34, 1, 151, 1, 64, 2, 200, 255, 227, 0, 32, 2, 149, 1, 0, 0, 37, 2, 164, 255, 16, 2, 27, 255, 95, 1, 11, 255, 82, 1, 150, 254, 179, 1, 167, 0, 15, 2, 181, 255, 46, 1, 91, 0, 56, 3, 129, 0, 87, 2, 240, 1, 167, 2, 186, 0, 237, 2, 153, 0, 225, 2, 231, 254, 88, 2, 164, 254, 103, 2, 20, 255, 1, 3, 41, 0, 113, 3, 38, 0, 122, 3, 36, 255, 73, 3, 155, 254, 115, 3, 119, 254, 135, 3, 134, 253, 218, 1, 68, 254, 82, 3, 81, 255, 166, 2, 19, 254, 242, 0, 249, 253, 17, 3, 54, 253, 70, 2, 227, 253, 110, 1, 225, 253, 178, 1, 171, 253, 244, 1, 3, 253, 222, 0, 66, 253, 149, 3, 25, 253, 194, 3, 155, 252, 245, 1, 125, 252, 36, 2, 133, 254, 200, 0, 77, 254, 157, 0, 205, 252, 214, 0, 163, 252, 157, 0, 154, 253, 40, 0, 136, 253, 94, 0, 141, 252, 202, 255, 27, 253, 4, 2, 11, 254, 42, 1, 154, 253, 85, 255, 154, 252, 95, 255, 159, 252, 233, 255, 206, 252, 93, 0, 9, 252, 245, 254, 106, 253, 153, 254, 219, 253, 2, 0, 70, 254, 135, 255, 135, 254, 0, 0, 29, 255, 33, 0, 98, 254, 130, 255, 127, 255, 212, 0, 90, 252, 34, 0, 198, 251, 230, 254, 161, 251, 244, 254, 58, 253, 199, 252, 92, 254, 65, 255, 204, 251, 96, 252, 107, 252, 163, 255, 140, 253, 154, 254, 97, 0, 7, 0, 50, 255, 119, 254, 155, 255, 24, 0, 53, 255, 38, 0, 88, 255, 83, 0, 169, 253, 89, 254, 233, 254, 170, 1, 68, 253, 118, 0, 181, 255, 206, 0, 43, 252, 95, 253, 88, 253, 161, 1, 145, 254, 37, 0, 233, 254, 218, 1, 127, 255, 194, 254, 63, 1, 40, 1, 142, 253, 217, 255, 87, 1, 90, 2, 72, 253, 217, 255, 209, 254, 172, 3, 104, 0, 233, 0, 132, 254, 137, 0, 220, 255, 13, 1, 181, 255, 42, 255, 120, 0, 43, 0, 239, 253, 35, 254, 203, 1, 164, 0, 54, 255, 27, 255, 207, 255, 89, 255, 97, 2, 24, 3, 98, 0, 36, 255, 147, 3, 148, 0, 37, 1, 27, 1, 101, 3, 91, 0, 63, 2, 138, 1, 70, 1, 178, 255, 205, 2, 67, 0, 109, 1, 189, 254, 104, 2, 220, 255, 219, 2, 27, 0, 107, 2, 238, 0, 120, 2, 17, 1, 192, 1, 99, 0, 33, 3, 220, 1, 101, 3, 17, 1, 173, 2, 64, 0, 21, 3, 72, 0, 253, 3, 217, 0, 25, 3, 203, 1, 222, 2, 104, 1, 134, 2, 224, 1, 104, 1, 66, 1, 173, 1, 208, 1, 126, 2, 174, 1, 244, 2, 107, 1, 232, 3, 148, 1, 171, 2, 16, 2, 90, 2, 103, 2, 143, 2, 157, 1, 178, 3, 175, 2, 169, 3, 90, 2, 136, 3, 92, 2, 43, 2, 225, 2, 18, 3, 150, 2, 211, 1, 142, 2, 106, 1, 77, 2, 161, 3, 198, 2, 242, 1, 222, 1, 159, 1, 164, 1, 181, 2, 115, 3, 45, 3, 171, 2, 13, 3, 157, 3, 145, 3, 171, 3, 214, 2, 220, 2, 235, 1, 85, 3, 19, 2, 180, 3, 222, 2, 195, 3, 59, 1, 40, 3, 249, 2, 243, 2, 120, 4, 248, 2, 143, 2, 52, 4, 58, 3, 33, 4, 67, 4, 70, 3, 235, 3, 40, 3, 23, 4, 109, 4, 147, 2, 77, 4, 224, 3, 26, 4, 50, 4, 51, 4, 203, 3, 182, 2, 202, 4, 30, 4, 59, 2, 73, 3, 116, 3, 124, 5, 99, 5, 72, 4, 56, 4, 93, 3, 207, 4, 223, 2, 4, 5, 248, 2, 248, 4, 223, 3, 87, 5, 29, 4, 233, 4, 188, 2, 26, 4, 22, 2, 220, 3, 197, 1, 240, 4, 87, 2, 116, 4, 167, 2, 85, 6, 47, 3, 104, 5, 9, 2, 37, 5, 137, 1, 28, 6, 37, 3, 168, 5, 174, 2, 44, 4, 136, 2, 107, 3, 51, 1, 59, 4, 105, 1, 23, 4, 61, 1, 137, 5, 196, 3, 163, 2, 59, 2, 128, 4, 79, 0, 90, 4, 209, 255, 250, 5, 55, 1, 185, 6, 58, 1, 142, 4, 177, 2, 2, 2, 162, 255, 93, 1, 26, 1, 132, 5, 72, 1, 1, 4, 231, 1, 191, 255, 57, 0, 37, 3, 202, 3, 36, 0, 62, 0, 1, 3, 249, 254, 23, 3, 166, 254, 125, 2, 187, 2, 119, 255, 108, 2, 22, 2, 29, 2, 33, 253, 194, 0, 199, 2, 44, 1, 244, 254, 161, 252, 158, 3, 1, 3, 60, 253, 84, 254, 250, 1, 174, 0, 132, 252, 138, 253, 179, 1, 35, 2, 101, 250, 254, 254, 109, 2, 215, 1, 6, 252, 168, 250, 119, 254, 9, 2, 104, 252, 82, 253, 231, 255, 20, 0, 42, 252, 124, 251, 84, 1, 9, 0, 234, 249, 145, 251, 160, 254, 48, 0, 213, 249, 110, 254, 137, 252, 6, 0, 124, 251, 136, 252, 220, 253, 160, 254, 149, 249, 112, 251, 97, 255, 98, 2, 24, 248, 61, 252, 31, 255, 193, 0, 136, 249, 88, 248, 11, 255, 19, 254, 60, 252, 112, 249, 88, 252, 133, 253, 237, 250, 48, 249, 148, 250, 164, 253, 252, 249, 189, 252, 139, 250, 121, 255, 204, 249, 222, 254, 122, 249, 56, 253, 37, 248, 160, 249, 129, 249, 229, 255, 46, 247, 213, 252, 123, 251, 184, 0, 15, 251, 189, 0, 169, 250, 74, 2, 37, 248, 201, 0, 234, 252, 200, 2, 70, 251, 3, 0, 247, 251, 40, 3, 29, 251, 62, 3, 145, 255, 123, 2, 156, 249, 191, 1, 49, 254, 75, 252, 67, 254, 96, 252, 8, 254, 118, 251, 11, 254, 69, 251, 144, 0, 161, 254, 140, 254, 228, 251, 229, 254, 221, 251, 233, 254, 157, 251, 193, 253, 98, 250, 181, 253, 178, 249, 89, 252, 40, 252, 229, 0, 178, 2, 103, 252, 49, 253, 109, 254, 82, 5, 83, 253, 47, 254, 106, 3, 141, 1, 3, 254, 210, 255, 61, 1, 54, 5, 27, 254, 200, 1, 45, 3, 183, 1, 101, 254, 83, 1, 130, 3, 43, 4, 87, 254, 46, 0, 161, 5, 241, 1, 115, 252, 224, 252, 185, 5, 22, 4, 2, 255, 191, 254, 150, 5, 141, 4, 68, 0, 94, 1, 10, 4, 154, 2, 114, 1, 11, 0, 31, 5, 22, 3, 143, 0, 232, 0, 17, 4, 26, 6, 142, 255, 151, 2, 80, 6, 54, 4, 198, 1, 67, 2, 251, 4, 16, 4, 180, 255, 141, 3, 240, 2, 43, 4, 153, 0, 0, 2, 92, 1, 190, 4, 102, 2, 129, 1, 51, 7, 40, 3, 13, 1, 10, 4, 203, 0, 62, 4, 140, 2, 249, 3, 247, 6, 106, 4, 173, 1, 47, 5, 131, 1, 104, 5, 207, 255, 159, 4, 184, 255, 191, 4, 96, 254, 233, 3, 32, 2, 213, 6, 160, 254, 199, 4, 10, 254, 175, 4, 179, 253, 57, 2, 29, 255, 94, 6, 114, 255, 42, 6, 26, 255, 179, 6, 54, 253, 8, 5, 186, 252, 118, 5, 107, 4, 77, 5, 48, 255, 208, 4, 181, 1, 197, 3, 95, 252, 50, 3, 43, 3, 130, 5, 91, 3, 227, 5, 164, 0, 188, 4, 107, 5, 1, 7, 228, 1, 82, 7, 200, 1, 15, 8, 228, 3, 146, 4, 46, 5, 122, 5, 36, 5, 80, 5, 111, 4, 238, 4, 210, 4, 82, 6, 81, 5, 232, 6, 141, 5, 203, 4, 48, 6, 67, 5, 86, 3, 160, 2, 149, 6, 30, 6, 115, 4, 246, 4, 224, 7, 33, 7, 237, 6, 45, 6, 252, 5, 180, 5, 207, 5, 178, 3, 123, 6, 253, 3, 208, 6, 188, 4, 112, 5, 209, 3, 236, 6, 137, 4, 34, 7, 140, 4, 182, 6, 149, 5, 181, 7, 55, 6, 161, 4, 96, 3, 84, 8, 37, 4, 7, 7, 46, 3, 46, 7, 245, 2, 56, 8, 35, 5, 6, 8, 234, 4, 65, 8, 147, 3, 27, 9, 162, 3, 187, 5, 123, 4, 30, 10, 159, 5, 197, 8, 208, 6, 42, 8, 84, 6, 54, 9, 174, 5, 106, 10, 226, 5, 84, 7, 45, 7, 22, 8, 183, 7, 203, 6, 41, 6, 170, 2, 9, 5, 48, 6, 253, 7, 174, 5, 50, 8, 194, 9, 212, 7, 151, 10, 18, 8, 214, 2, 52, 6, 196, 10, 32, 9, 228, 0, 79, 3, 152, 9, 123, 6, 36, 0, 45, 1, 150, 7, 165, 7, 66, 254, 160, 255, 106, 8, 116, 5, 253, 5, 77, 4, 14, 0, 96, 2, 101, 252, 36, 253, 103, 5, 190, 7, 65, 5, 184, 3, 88, 253, 65, 1, 1, 5, 244, 4, 198, 249, 109, 1, 173, 3, 178, 3, 55, 249, 202, 252, 70, 9, 227, 10, 29, 7, 228, 10, 236, 248, 29, 247, 169, 248, 23, 246, 152, 249, 200, 248, 97, 249, 44, 248, 60, 251, 136, 248, 59, 251, 198, 247, 233, 249, 204, 249, 219, 249, 236, 249, 85, 251, 177, 249, 56, 251, 65, 249, 177, 250, 129, 251, 176, 249, 100, 248, 6, 251, 145, 250, 231, 250, 133, 250, 185, 249, 101, 251, 116, 249, 225, 250, 93, 250, 58, 250, 169, 250, 126, 252, 24, 251, 221, 251, 205, 250, 146, 251, 42, 252, 147, 251, 131, 251, 32, 250, 200, 251, 228, 250, 4, 252, 97, 251, 44, 252, 50, 250, 57, 252, 41, 250, 36, 252, 102, 252, 233, 251, 203, 251, 186, 252, 101, 251, 166, 252, 58, 251, 149, 251, 239, 251, 216, 251, 1, 253, 152, 252, 123, 251, 67, 253, 144, 252, 62, 253, 118, 252, 250, 252, 8, 252, 190, 253, 200, 251, 223, 252, 58, 250, 177, 253, 169, 251, 176, 253, 134, 251, 55, 253, 148, 250, 128, 253, 160, 250, 171, 253, 221, 251, 96, 254, 121, 252, 82, 253, 192, 252, 107, 253, 60, 253, 68, 254, 156, 252, 22, 254, 103, 252, 138, 254, 248, 252, 149, 253, 110, 251, 183, 253, 219, 253, 255, 252, 229, 252, 77, 254, 109, 253, 238, 253, 27, 253, 14, 254, 187, 252, 155, 254, 171, 253, 233, 254, 153, 252, 13, 255, 137, 252, 230, 254, 103, 253, 232, 254, 101, 253, 91, 255, 208, 253, 118, 254, 121, 252, 150, 254, 102, 254, 64, 254, 185, 253, 103, 254, 194, 253, 199, 254, 155, 254, 131, 253, 220, 253, 198, 253, 76, 254, 128, 252, 8, 254, 130, 254, 11, 253, 198, 255, 31, 254, 91, 255, 150, 253, 65, 255, 138, 254, 22, 255, 130, 254, 34, 255, 85, 253, 231, 255, 32, 254, 94, 254, 153, 254, 38, 253, 159, 254, 188, 254, 99, 255, 80, 254, 190, 254, 118, 254, 209, 254, 228, 254, 152, 255, 167, 253, 223, 254, 212, 253, 60, 255, 180, 253, 106, 255, 109, 253, 160, 253, 39, 254, 232, 255, 188, 255, 64, 254, 38, 254, 248, 255, 6, 254, 211, 255, 20, 253, 72, 255, 180, 252, 4, 255, 123, 252, 165, 255, 184, 253, 159, 255, 116, 253, 138, 0, 4, 253, 125, 255, 90, 253, 244, 255, 98, 253, 165, 0, 253, 254, 253, 255, 184, 252, 149, 255, 115, 252, 37, 0, 32, 252, 44, 0, 170, 252, 97, 254, 185, 252, 13, 0, 23, 252, 241, 254, 254, 251, 203, 254, 226, 252, 34, 254, 192, 252, 24, 254, 81, 252, 168, 0, 168, 251, 125, 254, 95, 251, 155, 255, 97, 251, 216, 255, 83, 252, 196, 254, 250, 251, 254, 252, 236, 251, 143, 253, 199, 251, 230, 253, 56, 251, 213, 254, 224, 250, 76, 254, 83, 251, 105, 253, 113, 251, 95, 255, 64, 251, 78, 253, 43, 251, 193, 252, 104, 250, 48, 253, 133, 250, 19, 254, 126, 252, 28, 253, 102, 252, 223, 252, 178, 251, 110, 254, 213, 249, 60, 252, 219, 251, 130, 253, 11, 251, 98, 250, 37, 250, 90, 252, 34, 250, 129, 252, 194, 249, 204, 253, 69, 249, 51, 253, 162, 253, 171, 253, 114, 251, 195, 251, 167, 250, 44, 254, 102, 248, 43, 250, 210, 248, 71, 252, 116, 248, 93, 252, 37, 250, 68, 255, 157, 249, 91, 254, 79, 250, 174, 254, 88, 250, 234, 255, 106, 248, 90, 254, 42, 248, 7, 255, 16, 254, 142, 255, 138, 248, 13, 253, 247, 250, 174, 0, 85, 250, 147, 255, 30, 254, 255, 254, 59, 251, 4, 254, 175, 249, 151, 0, 98, 249, 208, 0, 114, 253, 107, 0, 141, 249, 29, 0, 139, 251, 23, 1, 65, 251, 50, 1, 52, 251, 6, 254, 38, 253, 81, 255, 44, 251, 155, 255, 55, 252, 39, 2, 154, 252, 22, 1, 201, 252, 59, 1, 205, 253, 120, 1, 229, 251, 228, 0, 5, 254, 24, 1, 169, 253, 25, 1, 10, 253, 253, 0, 207, 254, 123, 1, 13, 253, 122, 255, 157, 253, 148, 2, 200, 252, 24, 2, 207, 252, 134, 2, 99, 254, 49, 0, 171, 254, 177, 0, 59, 254, 14, 2, 30, 254, 77, 2, 185, 255, 83, 1, 111, 253, 8, 1, 12, 255, 39, 1, 19, 255, 59, 1, 125, 254, 57, 2, 6, 254, 247, 255, 135, 254, 14, 0, 96, 255, 149, 2, 40, 255, 40, 0, 204, 254, 210, 255, 95, 0, 214, 0, 14, 255, 167, 0, 170, 255, 192, 0, 200, 255, 27, 0, 180, 255, 31, 0, 36, 0, 53, 1, 150, 255, 74, 255, 143, 255, 74, 0, 71, 254, 234, 255, 23, 0, 139, 0, 81, 0, 245, 255, 44, 0, 15, 0, 169, 255, 119, 255, 138, 255, 49, 255, 98, 255, 198, 255, 16, 1, 164, 255, 100, 255, 71, 254, 8, 0, 120, 255, 128, 0, 35, 255, 101, 0, 38, 255, 40, 0, 59, 255, 180, 255, 56, 254, 9, 0, 67, 254, 33, 0, 89, 254, 226, 0, 60, 0, 73, 0, 34, 255, 156, 0, 113, 254, 24, 1, 194, 254, 245, 0, 171, 254, 166, 0, 13, 254, 83, 1, 66, 255, 71, 1, 37, 255, 69, 1, 119, 255, 167, 255, 172, 253, 100, 0, 141, 253, 144, 0, 91, 253, 231, 1, 28, 0, 252, 0, 121, 254, 214, 0, 215, 255, 26, 1, 228, 255, 99, 0, 226, 254, 75, 1, 49, 0, 203, 1, 124, 254, 53, 2, 143, 254, 180, 1, 28, 0, 80, 1, 247, 255, 141, 1, 89, 255, 106, 2, 34, 0, 84, 2, 239, 255, 49, 2, 116, 255, 43, 1, 79, 0, 10, 2, 125, 0, 203, 0, 2, 0, 244, 0, 32, 1, 255, 0, 211, 0, 175, 0, 82, 0, 84, 2, 187, 0, 5, 2, 108, 0, 125, 1, 255, 0, 109, 1, 41, 1, 241, 1, 96, 1, 71, 1, 174, 255, 25, 0, 210, 0, 115, 1, 245, 0, 5, 1, 3, 0, 33, 2, 193, 1, 140, 0, 38, 1, 44, 0, 39, 1, 212, 0, 91, 1, 244, 0, 238, 1, 75, 1, 16, 2, 201, 0, 51, 1, 93, 1, 155, 1, 101, 2, 28, 1, 102, 2, 157, 1, 208, 1, 66, 1, 112, 2, 141, 1, 97, 0, 200, 0, 96, 255, 128, 1, 149, 0, 106, 1, 239, 1, 13, 2, 13, 1, 73, 2, 33, 0, 235, 1, 135, 255, 177, 1, 171, 1, 99, 2, 242, 1, 4, 2, 171, 0, 187, 1, 241, 1, 154, 2, 184, 1, 19, 1, 54, 2, 63, 2, 146, 0, 127, 2, 155, 0, 158, 2, 223, 255, 173, 0, 212, 0, 184, 2, 90, 255, 89, 2, 65, 255, 183, 2, 23, 254, 247, 1, 175, 0, 230, 2, 214, 0, 220, 1, 116, 1, 59, 4, 66, 2, 18, 2, 74, 2, 9, 3, 169, 1, 106, 3, 59, 1, 73, 3, 118, 1, 80, 3, 91, 255, 53, 2, 35, 0, 223, 3, 217, 255, 38, 4, 73, 1, 200, 2, 18, 3, 72, 3, 133, 2, 27, 3, 149, 2, 164, 2, 59, 2, 150, 3, 120, 2, 55, 4, 161, 2, 49, 3, 62, 1, 132, 1, 106, 3, 244, 3, 52, 2, 80, 3, 112, 3, 108, 2, 45, 2, 223, 1, 159, 2, 197, 1, 180, 2, 212, 1, 72, 3, 130, 2, 76, 3, 133, 2, 250, 1, 172, 1, 129, 3, 55, 2, 69, 3, 131, 1, 194, 3, 243, 1, 179, 2, 49, 2, 171, 3, 158, 3, 15, 3, 40, 1, 22, 3, 12, 1, 4, 4, 18, 2, 106, 3, 73, 1, 36, 2, 143, 0, 163, 2, 35, 1, 247, 1, 66, 0, 17, 4, 103, 1, 18, 3, 97, 0, 37, 3, 33, 0, 69, 3, 214, 1, 255, 1, 49, 0, 68, 4, 71, 1, 150, 4, 67, 1, 3, 0, 242, 0, 104, 3, 218, 1, 177, 2, 173, 1, 49, 5, 166, 2, 18, 4, 108, 2, 85, 4, 152, 2, 65, 1, 193, 0, 121, 3, 182, 3, 129, 4, 106, 3, 125, 3, 123, 2, 109, 3, 94, 3, 180, 3, 145, 3, 13, 5, 153, 2, 40, 5, 127, 2, 229, 3, 25, 3, 122, 5, 6, 4, 152, 4, 244, 3, 86, 4, 191, 3, 130, 5, 157, 3, 123, 5, 147, 3, 31, 2, 94, 3, 92, 4, 198, 4, 67, 3, 166, 4, 67, 3, 166, 4, 191, 3, 124, 4, 123, 4, 96, 5, 20, 5, 169, 4, 135, 5, 207, 4, 55, 5, 61, 5, 234, 2, 68, 4, 175, 6, 3, 5, 109, 5, 49, 4, 54, 5, 30, 6, 129, 4, 195, 5, 109, 6, 113, 4, 33, 7, 196, 4, 32, 4, 102, 5, 241, 5, 194, 6, 96, 6, 9, 6, 84, 6, 6, 6, 87, 3, 60, 6, 97, 3, 131, 6, 181, 2, 117, 3, 180, 6, 239, 5, 143, 4, 16, 5, 161, 8, 224, 6, 160, 7, 213, 5, 228, 7, 202, 5, 254, 5, 74, 7, 158, 6, 216, 7, 30, 6, 236, 2, 225, 6, 57, 3, 38, 1, 112, 5, 60, 4, 10, 8, 109, 2, 35, 5, 109, 1, 7, 5, 198, 0, 4, 4, 232, 1, 128, 5, 249, 0, 147, 1, 246, 3, 25, 6, 68, 1, 107, 1, 109, 6, 20, 4, 193, 0, 111, 1, 242, 7, 67, 7, 5, 255, 67, 2, 238, 2, 226, 3, 13, 255, 30, 0, 45, 5, 111, 3, 228, 255, 87, 255, 112, 2, 149, 3, 59, 254, 159, 0, 186, 0, 90, 5, 154, 253, 6, 0, 25, 2, 136, 1, 162, 255, 221, 254, 13, 3, 229, 0, 128, 255, 214, 254, 245, 0, 235, 1, 67, 253, 120, 253, 204, 3, 21, 3, 11, 254, 128, 253, 178, 0, 255, 0, 147, 254, 122, 254, 1, 255, 61, 1, 66, 252, 218, 254, 65, 255, 228, 0, 249, 252, 65, 254, 157, 0, 19, 255, 111, 253, 48, 253, 105, 254, 92, 0, 139, 255, 157, 253, 78, 1, 26, 255, 89, 253, 196, 251, 112, 255, 195, 254, 123, 252, 163, 252, 30, 253, 152, 254, 171, 255, 41, 253, 166, 255, 237, 252, 100, 0, 234, 255, 121, 254, 249, 254, 200, 255, 183, 255, 175, 254, 14, 253, 5, 0, 67, 255, 62, 253, 144, 253, 89, 0, 168, 254, 121, 255, 167, 251, 159, 254, 19, 255, 84, 253, 145, 251, 237, 254, 178, 251, 243, 254, 77, 251, 152, 0, 145, 0, 46, 253, 48, 251, 49, 0, 80, 0, 32, 251, 248, 252, 8, 255, 135, 1, 36, 253, 221, 253, 213, 1, 218, 0, 1, 255, 160, 252, 69, 0, 110, 1, 90, 255, 27, 254, 80, 253, 191, 0, 68, 251, 84, 251, 86, 255, 87, 255, 228, 250, 161, 249, 65, 1, 214, 1, 117, 250, 37, 251, 192, 255, 16, 1, 175, 250, 8, 255, 236, 1, 53, 2, 47, 253, 159, 253, 195, 0, 229, 1, 195, 253, 123, 255, 171, 1, 202, 0, 85, 255, 138, 255, 199, 0, 63, 2, 2, 0, 225, 255, 182, 2, 243, 2, 170, 250, 217, 255, 40, 2, 45, 2, 23, 254, 15, 1, 168, 2, 25, 2, 13, 0, 59, 254, 87, 3, 186, 3, 123, 255, 204, 255, 175, 255, 226, 2, 111, 251, 125, 2, 31, 4, 35, 4, 161, 255, 164, 2, 235, 4, 57, 4, 233, 1, 49, 1, 63, 254, 186, 3, 234, 253, 228, 3, 55, 252, 98, 3, 222, 251, 35, 4, 242, 250, 106, 2, 120, 250, 105, 2, 54, 254, 86, 5, 97, 255, 29, 7, 250, 252, 240, 253, 242, 255, 86, 4, 78, 251, 123, 252, 252, 252, 177, 1, 24, 251, 25, 251, 13, 252, 210, 254, 166, 253, 183, 253, 9, 253, 174, 249, 8, 253, 243, 249, 184, 252, 127, 248, 208, 252, 229, 253, 23, 249, 69, 247, 29, 255, 220, 255, 14, 248, 217, 248, 197, 247, 154, 251, 89, 246, 232, 248, 66, 250, 252, 0, 115, 245, 97, 254, 197, 253, 45, 254, 229, 5, 18, 6, 132, 8, 183, 7, 22, 9, 228, 7, 191, 248, 111, 249, 191, 248, 37, 249, 248, 247, 130, 251, 170, 247, 138, 249, 173, 249, 181, 251, 88, 249, 149, 251, 191, 250, 184, 249, 177, 250, 154, 249, 198, 250, 243, 250, 211, 250, 15, 251, 128, 249, 143, 249, 49, 250, 173, 252, 190, 250, 216, 248, 123, 250, 116, 247, 254, 250, 87, 253, 7, 249, 143, 249, 58, 252, 198, 251, 97, 251, 116, 249, 226, 251, 207, 251, 138, 251, 122, 251, 73, 251, 24, 253, 6, 251, 27, 252, 90, 252, 153, 250, 97, 252, 120, 250, 14, 252, 231, 250, 241, 252, 69, 252, 231, 251, 124, 252, 31, 252, 207, 252, 31, 253, 201, 252, 52, 252, 91, 251, 30, 253, 186, 251, 30, 253, 126, 251, 240, 252, 223, 252, 214, 252, 238, 252, 132, 252, 248, 253, 24, 252, 206, 252, 124, 253, 59, 252, 191, 253, 142, 252, 227, 253, 74, 253, 97, 253, 107, 252, 173, 253, 126, 253, 122, 253, 153, 253, 68, 252, 147, 253, 99, 252, 253, 253, 41, 253, 29, 254, 209, 252, 27, 254, 184, 252, 190, 253, 72, 254, 55, 253, 190, 253, 187, 254, 111, 253, 98, 253, 126, 254, 198, 253, 71, 254, 102, 253, 254, 253, 237, 252, 120, 254, 239, 253, 246, 253, 59, 254, 25, 254, 89, 254, 152, 253, 183, 253, 151, 253, 99, 255, 106, 253, 244, 254, 88, 253, 164, 254, 190, 254, 189, 254, 136, 253, 68, 254, 208, 254, 82, 254, 180, 254, 54, 254, 235, 254, 44, 254, 109, 253, 231, 252, 193, 254, 132, 253, 29, 255, 214, 253, 139, 254, 165, 254, 178, 254, 46, 255, 56, 254, 64, 255, 238, 253, 14, 255, 40, 255, 58, 255, 146, 254, 142, 254, 174, 254, 95, 255, 103, 254, 20, 253, 149, 255, 132, 254, 218, 254, 125, 253, 33, 255, 103, 253, 22, 255, 27, 253, 115, 255, 16, 254, 126, 255, 2, 254, 117, 255, 185, 254, 84, 255, 207, 254, 206, 254, 188, 253, 92, 255, 249, 254, 250, 254, 84, 255, 189, 255, 110, 254, 31, 0, 146, 254, 246, 255, 76, 254, 170, 255, 241, 253, 71, 0, 135, 254, 234, 255, 159, 253, 244, 255, 90, 253, 189, 255, 193, 254, 63, 0, 65, 255, 35, 0, 75, 255, 217, 255, 14, 255, 126, 0, 89, 255, 116, 255, 224, 253, 155, 0, 215, 254, 174, 0, 215, 254, 38, 0, 248, 255, 117, 0, 132, 254, 197, 0, 60, 254, 240, 0, 246, 253, 223, 0, 153, 255, 110, 0, 69, 255, 87, 0, 101, 255, 169, 0, 209, 255, 157, 0, 26, 0, 173, 255, 156, 255, 128, 0, 80, 0, 209, 0, 194, 255, 6, 0, 7, 0, 22, 0, 5, 0, 62, 1, 236, 255, 248, 0, 211, 255, 56, 255, 193, 255, 156, 0, 187, 255, 250, 0, 73, 255, 113, 1, 130, 255, 143, 255, 180, 255, 114, 255, 134, 255, 192, 255, 2, 255, 225, 255, 35, 0, 79, 255, 185, 255, 249, 255, 171, 0, 93, 0, 27, 0, 108, 0, 212, 0, 182, 254, 47, 255, 133, 255, 186, 255, 233, 254, 95, 0, 160, 255, 20, 0, 68, 255, 195, 255, 198, 254, 87, 0, 212, 254, 178, 255, 158, 254, 122, 255, 11, 0, 122, 0, 116, 255, 122, 0, 237, 254, 152, 0, 219, 254, 140, 0, 174, 255, 138, 0, 191, 254, 145, 255, 32, 254, 100, 255, 153, 254, 76, 0, 2, 255, 216, 255, 133, 253, 160, 255, 246, 253, 79, 0, 5, 254, 8, 0, 244, 254, 47, 1, 229, 253, 68, 0, 66, 254, 61, 0, 246, 253, 50, 1, 111, 0, 189, 0, 77, 254, 122, 0, 133, 254, 166, 0, 197, 253, 114, 254, 136, 253, 182, 255, 21, 253, 161, 255, 57, 254, 194, 0, 72, 252, 83, 0, 226, 252, 192, 0, 13, 253, 192, 0, 243, 252, 94, 255, 149, 253, 234, 0, 105, 253, 215, 254, 24, 254, 147, 255, 60, 252, 124, 255, 186, 252, 188, 255, 181, 252, 58, 0, 168, 251, 170, 255, 219, 252, 213, 254, 80, 252, 3, 255, 246, 252, 206, 255, 59, 252, 219, 253, 160, 254, 158, 255, 32, 252, 169, 254, 163, 251, 197, 254, 163, 251, 205, 254, 125, 251, 138, 254, 131, 253, 26, 255, 114, 251, 213, 255, 237, 250, 156, 255, 99, 252, 119, 254, 6, 251, 168, 253, 79, 253, 126, 255, 57, 250, 200, 254, 215, 250, 2, 255, 72, 250, 70, 254, 244, 250, 155, 253, 19, 251, 9, 254, 35, 250, 144, 254, 214, 250, 26, 0, 104, 250, 190, 255, 49, 249, 95, 255, 148, 249, 45, 254, 32, 249, 220, 253, 143, 250, 200, 253, 236, 249, 153, 252, 41, 250, 246, 251, 149, 250, 197, 253, 131, 248, 240, 253, 9, 249, 133, 255, 151, 248, 25, 255, 250, 247, 189, 254, 252, 247, 118, 252, 72, 248, 201, 253, 131, 248, 148, 253, 1, 248, 35, 252, 203, 251, 142, 254, 17, 248, 64, 253, 205, 246, 19, 253, 76, 245, 191, 251, 139, 248, 159, 0, 36, 248, 248, 0, 142, 253, 133, 255, 221, 246, 62, 252, 99, 253, 104, 254, 157, 250, 106, 251, 60, 254, 148, 254, 236, 251, 33, 253, 124, 255, 183, 0, 172, 249, 16, 253, 221, 253, 205, 254, 247, 252, 19, 251, 158, 255, 41, 0, 144, 252, 189, 251, 255, 254, 97, 0, 190, 249, 215, 248, 31, 0, 230, 255, 124, 253, 207, 253, 76, 255, 222, 253, 127, 254, 185, 251, 102, 254, 222, 252, 98, 254, 197, 252, 55, 254, 54, 252, 22, 254, 171, 251, 41, 255, 108, 252, 112, 255, 87, 252, 19, 254, 11, 251, 251, 253, 29, 250, 181, 0, 101, 0, 180, 254, 135, 252, 188, 252, 87, 252, 209, 253, 83, 254, 139, 253, 221, 253, 73, 255, 175, 254, 223, 253, 174, 255, 6, 255, 226, 254, 5, 0, 124, 255, 164, 254, 4, 255, 219, 254, 40, 254, 98, 255, 100, 0, 227, 255, 197, 0, 20, 255, 88, 254, 163, 252, 43, 255, 116, 255, 249, 255, 85, 254, 69, 254, 187, 0, 159, 255, 84, 253, 32, 253, 219, 254, 2, 1, 144, 254, 104, 255, 106, 255, 136, 1, 159, 253, 175, 0, 114, 255, 43, 1, 118, 255, 152, 0, 137, 255, 73, 1, 26, 254, 204, 255, 37, 1, 198, 0, 73, 255, 117, 0, 175, 0, 75, 1, 198, 255, 238, 254, 231, 0, 44, 1, 224, 254, 74, 1, 207, 254, 116, 1, 145, 255, 153, 1, 247, 255, 167, 1, 83, 0, 0, 1, 67, 0, 111, 1, 237, 255, 248, 0, 91, 0, 113, 0, 221, 255, 150, 1, 65, 255, 154, 0, 238, 0, 40, 1, 5, 0, 197, 0, 141, 0, 221, 0, 57, 1, 198, 0, 211, 0, 165, 1, 244, 0, 78, 1, 88, 0, 170, 1, 13, 255, 198, 1, 202, 0, 40, 2, 251, 255, 147, 1, 35, 1, 185, 0, 219, 0, 45, 1, 251, 0, 138, 0, 128, 0, 69, 0, 197, 0, 32, 1, 116, 255, 195, 255, 188, 0, 105, 1, 197, 0, 86, 2, 186, 1, 17, 1, 34, 1, 143, 0, 216, 1, 226, 1, 157, 0, 114, 1, 159, 1, 65, 1, 116, 1, 129, 1, 146, 1, 40, 2, 155, 0, 24, 0, 38, 2, 7, 1, 245, 255, 21, 0, 104, 1, 227, 0, 147, 0, 2, 255, 168, 1, 97, 0, 110, 1, 243, 255, 119, 1, 141, 0, 193, 1, 232, 0, 140, 1, 251, 1, 218, 1, 16, 1, 189, 2, 68, 1, 106, 1, 209, 255, 75, 2, 148, 0, 31, 2, 69, 0, 144, 1, 205, 255, 49, 2, 59, 0, 220, 0, 246, 255, 96, 1, 147, 0, 206, 0, 211, 0, 141, 2, 185, 0, 51, 2, 41, 1, 53, 2, 28, 1, 82, 2, 121, 0, 254, 2, 192, 0, 142, 1, 118, 0, 130, 2, 178, 1, 233, 0, 8, 1, 225, 1, 211, 1, 129, 0, 91, 255, 187, 2, 239, 0, 90, 0, 26, 0, 86, 1, 218, 1, 201, 255, 27, 0, 132, 1, 94, 0, 84, 255, 0, 0, 213, 2, 123, 1, 196, 255, 81, 1, 114, 1, 209, 1, 95, 0, 63, 1, 38, 3, 83, 2, 78, 0, 4, 1, 241, 1, 83, 3, 210, 0, 48, 2, 202, 1, 62, 2, 48, 254, 202, 0, 241, 1, 113, 2, 54, 255, 152, 0, 48, 0, 200, 2, 236, 255, 54, 2, 100, 0, 203, 2, 199, 1, 212, 1, 155, 1, 93, 2, 63, 1, 134, 2, 195, 0, 103, 2, 145, 1, 26, 2, 168, 2, 227, 2, 201, 0, 155, 2, 178, 1, 186, 3, 198, 1, 169, 1, 134, 2, 235, 1, 94, 2, 169, 2, 160, 1, 252, 1, 241, 1, 54, 3, 170, 1, 47, 3, 148, 2, 135, 2, 116, 2, 204, 2, 185, 2, 210, 1, 106, 2, 201, 1, 173, 2, 204, 1, 109, 1, 53, 1, 209, 2, 55, 2, 68, 3, 89, 2, 97, 2, 44, 1, 57, 3, 203, 1, 175, 3, 175, 2, 169, 2, 21, 2, 147, 3, 86, 2, 79, 2, 243, 0, 108, 3, 195, 1, 106, 3, 164, 1, 18, 3, 61, 1, 220, 2, 220, 0, 154, 3, 61, 1, 84, 4, 111, 1, 19, 2, 210, 1, 4, 4, 137, 2, 29, 4, 103, 2, 10, 4, 41, 2, 61, 3, 90, 2, 253, 3, 31, 3, 159, 3, 35, 3, 110, 3, 251, 2, 31, 3, 240, 1, 93, 5, 5, 3, 73, 2, 2, 3, 35, 3, 162, 3, 75, 4, 25, 3, 198, 4, 94, 3, 185, 4, 127, 3, 1, 4, 215, 2, 4, 3, 77, 3, 148, 4, 91, 4, 99, 3, 253, 3, 62, 3, 245, 3, 73, 3, 142, 3, 250, 1, 191, 2, 215, 4, 53, 4, 108, 2, 51, 3, 172, 4, 59, 4, 131, 4, 57, 4, 118, 4, 139, 3, 11, 6, 97, 4, 29, 5, 136, 2, 63, 5, 100, 2, 204, 5, 220, 3, 199, 5, 169, 3, 217, 3, 48, 5, 187, 3, 61, 5, 173, 1, 142, 3, 73, 3, 58, 5, 52, 2, 155, 4, 156, 1, 132, 4, 147, 5, 40, 5, 154, 5, 50, 5, 128, 2, 248, 2, 190, 6, 130, 5, 190, 0, 43, 2, 49, 4, 237, 3, 170, 1, 1, 1, 71, 3, 212, 3, 235, 0, 231, 0, 240, 5, 143, 4, 109, 0, 37, 1, 246, 3, 33, 6, 49, 1, 142, 0, 124, 4, 27, 2, 221, 254, 148, 255, 189, 4, 204, 3, 22, 0, 40, 255, 155, 2, 60, 3, 30, 254, 182, 1, 197, 1, 151, 5, 187, 253, 90, 254, 21, 3, 131, 1, 154, 254, 58, 254, 174, 0, 12, 3, 220, 255, 140, 254, 134, 1, 122, 255, 139, 253, 160, 0, 206, 254, 239, 2, 22, 251, 181, 254, 177, 0, 10, 2, 8, 255, 62, 2, 5, 255, 127, 2, 237, 253, 151, 1, 172, 253, 138, 1, 93, 254, 21, 3, 151, 253, 33, 3, 38, 252, 143, 1, 167, 252, 215, 2, 249, 255, 6, 2, 65, 253, 54, 1, 137, 251, 232, 255, 22, 252, 31, 1, 64, 252, 107, 1, 237, 250, 56, 1, 2, 250, 245, 0, 235, 249, 49, 1, 28, 0, 153, 0, 165, 252, 81, 255, 223, 255, 76, 1, 138, 250, 102, 255, 212, 0, 154, 1, 175, 253, 59, 255, 188, 251, 64, 253, 120, 252, 191, 255, 26, 1, 111, 1, 106, 252, 82, 253, 89, 1, 93, 0, 254, 254, 155, 254, 184, 2, 132, 2, 75, 253, 228, 255, 192, 1, 237, 1, 239, 254, 193, 0, 15, 2, 34, 2, 13, 255, 255, 253, 128, 1, 120, 255, 17, 1, 159, 254, 0, 2, 114, 255, 25, 2, 58, 255, 173, 3, 238, 2, 83, 0, 248, 0, 66, 2, 93, 3, 200, 255, 80, 2, 74, 3, 44, 0, 124, 3, 24, 0, 33, 0, 122, 3, 240, 255, 214, 3, 63, 3, 118, 5, 255, 5, 106, 7, 180, 6, 96, 5, 156, 7, 185, 5, 22, 252, 95, 252, 184, 251, 77, 251, 127, 253, 93, 252, 164, 253, 63, 252, 245, 252, 95, 253, 189, 252, 236, 252, 96, 254, 104, 253, 54, 254, 2, 253, 116, 253, 247, 253, 106, 253, 17, 254, 1, 252, 3, 254, 1, 252, 84, 254, 68, 254, 216, 253, 144, 254, 63, 254, 33, 254, 45, 255, 226, 251, 121, 252, 196, 254, 7, 255, 199, 253, 177, 253, 199, 253, 237, 254, 227, 253, 65, 255, 52, 253, 68, 255, 182, 252, 248, 254, 179, 254, 8, 255, 194, 254, 28, 255, 237, 254, 1, 0, 201, 253, 28, 255, 141, 255, 35, 255, 18, 255, 138, 254, 59, 255, 5, 254, 34, 255, 189, 253, 254, 254, 80, 254, 195, 255, 12, 255, 167, 254, 2, 0, 174, 254, 39, 0, 41, 255, 87, 255, 198, 255, 0, 0, 200, 255, 250, 255, 53, 255, 125, 255, 1, 0, 70, 255, 251, 255, 45, 255, 6, 0, 132, 254, 11, 0, 94, 254, 140, 255, 131, 0, 122, 255, 113, 0, 89, 0, 252, 255, 71, 0, 254, 255, 237, 255, 64, 255, 6, 1, 24, 0, 189, 0, 151, 0, 123, 255, 147, 255, 186, 0, 103, 255, 166, 0, 37, 255, 37, 0, 139, 0, 193, 0, 171, 0, 81, 1, 124, 0, 158, 0, 195, 255, 141, 0, 226, 0, 243, 255, 190, 0, 231, 0, 34, 0, 98, 1, 109, 0, 60, 1, 201, 0, 244, 0, 164, 0, 74, 1, 171, 255, 134, 1, 172, 255, 254, 0, 71, 1, 1, 1, 79, 1, 235, 1, 147, 0, 220, 1, 105, 0, 54, 0, 77, 0, 181, 1, 114, 1, 165, 1, 58, 1, 193, 1, 86, 1, 73, 1, 126, 0, 161, 2, 36, 1, 59, 2, 132, 1, 243, 0, 193, 0, 141, 2, 64, 1, 109, 2, 24, 1, 194, 0, 124, 1, 5, 2, 69, 2, 45, 0, 67, 1, 111, 0, 166, 1, 233, 1, 139, 1, 222, 2, 22, 2, 110, 2, 34, 2, 230, 1, 246, 1, 62, 1, 60, 2, 189, 0, 38, 2, 129, 1, 166, 1, 99, 255, 153, 0, 131, 255, 126, 1, 59, 255, 130, 1, 249, 254, 78, 1, 228, 0, 185, 2, 68, 255, 1, 0, 51, 0, 41, 1, 5, 254, 213, 0, 136, 254, 141, 1, 232, 255, 255, 0, 221, 253, 89, 0, 10, 254, 162, 255, 131, 1, 179, 0, 148, 253, 68, 0, 84, 253, 112, 0, 126, 253, 162, 254, 252, 254, 172, 0, 74, 254, 188, 254, 8, 1, 136, 2, 60, 252, 252, 255, 159, 251, 7, 0, 122, 255, 134, 0, 147, 251, 206, 254, 143, 0, 96, 0, 92, 254, 15, 254, 59, 251, 162, 254, 9, 250, 83, 253, 95, 255, 72, 0, 105, 3, 179, 2, 220, 2, 27, 1, 153, 3, 97, 1, 78, 1, 219, 1, 71, 4, 53, 3, 96, 3, 12, 2, 75, 3, 241, 1, 202, 2, 199, 2, 20, 3, 238, 2, 52, 4, 202, 2, 180, 4, 241, 2, 65, 2, 150, 2, 124, 245, 170, 192, 38, 3, 44, 7, 95, 251, 33, 228, 37, 12, 28, 4, 40, 248, 202, 208, 85, 16, 107, 5, 192, 249, 99, 218, 69, 9, 145, 5, 232, 249, 78, 219, 176, 12, 193, 7, 210, 251, 214, 230, 35, 7, 16, 9, 184, 252, 64, 236, 173, 3, 242, 12, 199, 254, 163, 248, 47, 9, 161, 11, 41, 254, 234, 244, 32, 14, 116, 9, 247, 252, 183, 237, 123, 13, 24, 12, 98, 254, 70, 246, 139, 11, 205, 16, 72, 0, 178, 1, 56, 7, 148, 17, 139, 0, 68, 3, 44, 15, 40, 21, 157, 1, 180, 9, 163, 4, 42, 28, 67, 3, 166, 19, 11, 12, 40, 35, 139, 4, 90, 27, 216, 28, 115, 3, 37, 247, 177, 202, 74, 23, 226, 5, 58, 250, 60, 221, 35, 20, 86, 8, 61, 252, 88, 233, 8, 31, 217, 7, 228, 251, 65, 231, 107, 25, 202, 8, 139, 252, 49, 235, 246, 29, 192, 10, 180, 253, 47, 242, 64, 23, 200, 11, 60, 254, 92, 245, 34, 19, 180, 14, 131, 255, 17, 253, 77, 27, 4, 14, 60, 255, 103, 251, 238, 31, 138, 15, 213, 255, 252, 254, 176, 23, 52, 17, 107, 0, 133, 2, 29, 30, 223, 19, 64, 1, 136, 7, 147, 21, 133, 23, 57, 2, 98, 13, 89, 30, 214, 27, 50, 3, 62, 19, 172, 23, 2, 31, 209, 3, 253, 22, 218, 21, 223, 44, 243, 5, 212, 35, 85, 41, 76, 5, 159, 249, 153, 217, 89, 35, 61, 6, 145, 250, 68, 223, 66, 38, 243, 7, 247, 251, 180, 231, 242, 34, 111, 9, 244, 252, 164, 237, 56, 40, 24, 10, 87, 253, 253, 239, 191, 36, 174, 10, 171, 253, 245, 241, 252, 33, 146, 12, 156, 254, 160, 247, 29, 38, 67, 13, 235, 254, 123, 249, 193, 39, 52, 15, 181, 255, 58, 254, 210, 35, 176, 17, 148, 0, 123, 3, 168, 39, 140, 19, 40, 1, 245, 6, 154, 35, 103, 22, 241, 1, 177, 11, 4, 41, 122, 24, 116, 2, 198, 14, 126, 39, 207, 29, 151, 3, 158, 21, 140, 34, 23, 34, 93, 4, 72, 26, 252, 34, 208, 48, 112, 6, 193, 38, 124, 50, 208, 3, 185, 247, 47, 206, 171, 44, 219, 6, 28, 251, 141, 226, 106, 47, 24, 9, 189, 252, 96, 236, 124, 44, 64, 9, 214, 252, 248, 236, 204, 41, 248, 11, 83, 254, 236, 245, 44, 48, 45, 11, 238, 253, 136, 243, 202, 45, 255, 12, 205, 254, 200, 248, 6, 44, 116, 14, 106, 255, 120, 252, 109, 42, 61, 17, 110, 0, 151, 2, 50, 47, 181, 17, 150, 0, 134, 3, 19, 44, 85, 20, 98, 1, 84, 8, 184, 46, 161, 24, 125, 2, 253, 14, 159, 43, 110, 29, 132, 3, 44, 21, 96, 47, 137, 32, 25, 4, 168, 24, 217, 42, 25, 42, 149, 5, 156, 33, 60, 40, 224, 67, 87, 8, 53, 50, 75, 54, 145, 6, 220, 250, 15, 225, 36, 49, 253, 7, 254, 251, 221, 231, 209, 51, 135, 9, 2, 253, 254, 237, 209, 54, 173, 11, 47, 254, 14, 245, 140, 52, 26, 12, 99, 254, 78, 246, 108, 48, 74, 14, 89, 255, 18, 252, 198, 52, 196, 14, 137, 255, 55, 253, 80, 50, 176, 16, 62, 0, 118, 1, 221, 52, 253, 18, 253, 0, 243, 5, 123, 49, 81, 21, 168, 1, 248, 9, 30, 54, 218, 23, 78, 2, 223, 13, 231, 50, 83, 25, 166, 2, 244, 15, 245, 52, 41, 30, 169, 3, 7, 22, 157, 50, 95, 36, 189, 4, 136, 28, 146, 53, 31, 45, 252, 5, 5, 36, 47, 49, 102, 59, 146, 7, 147, 45, 9, 59, 4, 6, 91, 250, 4, 222, 224, 58, 29, 9, 192, 252, 113, 236, 191, 56, 207, 9, 45, 253, 0, 239, 100, 57, 127, 12, 147, 254, 107, 247, 22, 60, 232, 13, 49, 255, 33, 251, 53, 55, 120, 15, 206, 255, 212, 254, 254, 58, 140, 16, 50, 0, 42, 1, 252, 55, 216, 18, 242, 0, 174, 5, 254, 57, 75, 21, 166, 1, 238, 9, 202, 59, 195, 23, 72, 2, 190, 13, 249, 55, 232, 26, 0, 3, 15, 18, 212, 58, 9, 30, 162, 3, 226, 21, 70, 56, 210, 36, 207, 4, 245, 28, 27, 60, 13, 38, 0, 5, 26, 30, 232, 57, 191, 55, 52, 7, 94, 43, 32, 53, 107, 97, 109, 10, 195, 62, 12, 64, 177, 7, 198, 251, 139, 230, 177, 65, 16, 11, 223, 253, 45, 243, 97, 61, 27, 11, 229, 253, 80, 243, 232, 62, 8, 13, 209, 254, 223, 248, 0, 64, 123, 15, 207, 255, 218, 254, 44, 66, 227, 17, 165, 0, 224, 3, 95, 61, 247, 17, 171, 0, 6, 4, 94, 63, 72, 21, 165, 1, 233, 9, 192, 65, 238, 24, 143, 2, 105, 15, 129, 61, 229, 27, 53, 3, 80, 19, 198, 63, 45, 29, 120, 3, 223, 20, 227, 64, 176, 33, 76, 4, 222, 25, 132, 66, 178, 40, 99, 5, 111, 32, 33, 62, 41, 46, 29, 6, 207, 36, 238, 65, 98, 57, 95, 7, 96, 44, 131, 64, 134, 81, 102, 9, 147, 56, 222, 70, 35, 8, 25, 252, 131, 232, 201, 75, 106, 12, 137, 254, 47, 247, 100, 68, 98, 13, 248, 254, 203, 249, 86, 78, 187, 15, 231, 255, 105, 255, 149, 70, 153, 16, 54, 0, 70, 1, 8, 74, 202, 19, 58, 1, 98, 7, 47, 69, 26, 21, 153, 1, 157, 9, 123, 77, 48, 24, 98, 2, 92, 14, 30, 70, 102, 27, 27, 3, 176, 18, 70, 83, 197, 30, 198, 3, 184, 22, 246, 69, 73, 36, 186, 4, 115, 28, 200, 74, 74, 36, 186, 4, 116, 28, 37, 80, 117, 44, 230, 5, 129, 35, 155, 70, 149, 56, 74, 7, 226, 43, 31, 78, 218, 69, 129, 8, 52, 51, 154, 73, 252, 127, 0, 12, 62, 72, 61, 42, 81, 112, 63, 11, 181, 67, 0, 80, 225, 10, 198, 253, 153, 242, 153, 73, 194, 25, 191, 2, 139, 16, 81, 24, 245, 28, 108, 3, 156, 20, 51, 67, 204, 40, 103, 5, 133, 32, 122, 84, 245, 4, 61, 249, 74, 215, 143, 82, 71, 17, 113, 0, 171, 2, 40, 44, 20, 6, 106, 250, 95, 222, 61, 74, 20, 50, 150, 6, 164, 39, 215, 67, 194, 9, 37, 253, 210, 238, 194, 69, 225, 18, 244, 0, 192, 5, 10, 39, 194, 9, 37, 253, 210, 238, 122, 68, 184, 30, 196, 3, 170, 22, 174, 55, 92, 7, 133, 251, 5, 229, 20, 62, 81, 12, 125, 254, 233, 246, 61, 26, 10, 7, 67, 251, 121, 227, 10, 71, 225, 78, 53, 9, 109, 55, 102, 70, 215, 11, 67, 254, 138, 245, 71, 65, 225, 22, 16, 2, 109, 12, 143, 34, 174, 15, 226, 255, 76, 255, 20, 62, 10, 35, 134, 4, 60, 27, 102, 70, 112, 5, 198, 249, 129, 218, 71, 65, 0, 16, 0, 0, 0, 0, 0, 32, 143, 2, 108, 245, 79, 192, 133, 59, 102, 54, 16, 7, 132, 42, 174, 55, 40, 12, 106, 254, 116, 246, 10, 55, 61, 18, 193, 0, 141, 4, 30, 21, 143, 10, 154, 253, 143, 241, 122, 52, 153, 25, 182, 2, 84, 16, 163, 48, 133, 3, 67, 247, 100, 203, 163, 48, 102, 10, 131, 253, 7, 241, 184, 14, 143, 2, 108, 245, 79, 192, 153, 57, 215, 91, 22, 10, 183, 60, 225, 74, 153, 9, 13, 253, 62, 238, 184, 78, 215, 19, 62, 1, 121, 7, 225, 26, 0, 16, 0, 0, 0, 0, 0, 80, 112, 33, 65, 4, 156, 25, 204, 76, 225, 2, 26, 246, 105, 196, 61, 74, 163, 16, 58, 0, 91, 1, 184, 30, 40, 8, 29, 252, 151, 232, 204, 44, 0, 48, 87, 6, 43, 38, 20, 62, 194, 5, 26, 250, 126, 220, 112, 61, 20, 18, 180, 0, 62, 4, 215, 35, 153, 5, 240, 249, 131, 219, 184, 62, 92, 27, 25, 3, 164, 18, 235, 57, 225, 2, 26, 246, 105, 196, 225, 58, 204, 8, 140, 252, 55, 235, 215, 19, 204, 4, 12, 249, 38, 214, 215, 51, 174, 67, 83, 8, 27, 50, 163, 64, 30, 9, 193, 252, 118, 236, 225, 58, 184, 22, 6, 2, 46, 12, 92, 15, 102, 14, 100, 255, 86, 252, 174, 55, 153, 33, 72, 4, 198, 25, 235, 65, 10, 3, 106, 246, 74, 198, 225, 58, 225, 14, 149, 255, 122, 253, 174, 23, 102, 2, 12, 245, 17, 190, 122, 36, 40, 36, 180, 4, 83, 28, 215, 51, 225, 6, 33, 251, 172, 226, 215, 51, 194, 13, 33, 255, 193, 250, 153, 9, 174, 7, 196, 251, 127, 230, 204, 44, 153, 21, 187, 1, 108, 10, 245, 40, 225, 2, 26, 246, 105, 196, 112, 45, 122, 12, 145, 254, 92, 247, 194, 5, 10, 3, 106, 246, 74, 198, 0, 64, 248, 65, 226, 67, 190, 69, 142, 71, 82, 73, 12, 75, 188, 76, 98, 78, 0, 80, 150, 81, 35, 83, 170, 84, 42, 86, 163, 87, 22, 89, 130, 90, 234, 91, 76, 93, 168, 94, 0, 96, 83, 97, 161, 98, 236, 99, 49, 101, 115, 102, 177, 103, 235, 104, 34, 106, 85, 107, 132, 108, 177, 109, 218, 110, 0, 112, 35, 113, 67, 114, 97, 115, 123, 116, 147, 117, 169, 118, 188, 119, 204, 120, 218, 121, 230, 122, 239, 123, 247, 124, 252, 125, 255, 126, 255, 127, 255, 127, 61, 10, 63, 10, 69, 10, 78, 10, 91, 10, 108, 10, 129, 10, 153, 10, 181, 10, 212, 10, 248, 10, 31, 11, 74, 11, 120, 11, 170, 11, 224, 11, 25, 12, 86, 12, 151, 12, 219, 12, 35, 13, 110, 13, 189, 13, 15, 14, 101, 14, 190, 14, 27, 15, 123, 15, 223, 15, 70, 16, 176, 16, 30, 17, 143, 17, 3, 18, 123, 18, 245, 18, 115, 19, 244, 19, 120, 20, 0, 21, 138, 21, 23, 22, 168, 22, 59, 23, 209, 23, 106, 24, 6, 25, 165, 25, 70, 26, 234, 26, 145, 27, 59, 28, 231, 28, 149, 29, 70, 30, 250, 30, 176, 31, 104, 32, 35, 33, 224, 33, 159, 34, 97, 35, 36, 36, 234, 36, 178, 37, 124, 38, 71, 39, 21, 40, 228, 40, 181, 41, 136, 42, 93, 43, 51, 44, 11, 45, 228, 45, 191, 46, 155, 47, 121, 48, 88, 49, 56, 50, 26, 51, 252, 51, 224, 52, 196, 53, 170, 54, 145, 55, 120, 56, 96, 57, 73, 58, 51, 59, 29, 60, 8, 61, 243, 61, 223, 62, 203, 63, 184, 64, 165, 65, 146, 66, 127, 67, 108, 68, 90, 69, 71, 70, 52, 71, 33, 72, 14, 73, 251, 73, 231, 74, 211, 75, 191, 76, 170, 77, 149, 78, 126, 79, 104, 80, 80, 81, 56, 82, 31, 83, 5, 84, 234, 84, 207, 85, 178, 86, 148, 87, 116, 88, 84, 89, 50, 90, 15, 91, 235, 91, 197, 92, 157, 93, 117, 94, 74, 95, 30, 96, 240, 96, 192, 97, 143, 98, 91, 99, 38, 100, 239, 100, 181, 101, 122, 102, 60, 103, 253, 103, 187, 104, 119, 105, 48, 106, 232, 106, 156, 107, 79, 108, 255, 108, 172, 109, 87, 110, 255, 110, 165, 111, 71, 112, 231, 112, 133, 113, 31, 114, 183, 114, 75, 115, 221, 115, 108, 116, 248, 116, 129, 117, 6, 118, 137, 118, 8, 119, 133, 119, 254, 119, 116, 120, 230, 120, 86, 121, 194, 121, 42, 122, 144, 122, 242, 122, 80, 123, 171, 123, 3, 124, 87, 124, 167, 124, 244, 124, 62, 125, 132, 125, 198, 125, 5, 126, 64, 126, 120, 126, 172, 126, 220, 126, 9, 127, 49, 127, 87, 127, 120, 127, 150, 127, 176, 127, 199, 127, 217, 127, 232, 127, 243, 127, 251, 127, 255, 127, 255, 127, 229, 127, 153, 127, 25, 127, 103, 126, 129, 125], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE + 20480); allocate([106, 124, 33, 123, 167, 121, 252, 119, 34, 118, 24, 116, 223, 113, 122, 111, 231, 108, 41, 106, 65, 103, 47, 100, 245, 96, 149, 93, 15, 90, 101, 86, 153, 82, 171, 78, 158, 74, 116, 70, 45, 66, 204, 61, 82, 57, 193, 52, 27, 48, 98, 43, 151, 38, 189, 33, 213, 28, 226, 23, 230, 18, 226, 13, 216, 8, 203, 3, 61, 10, 64, 10, 73, 10, 88, 10, 108, 10, 135, 10, 167, 10, 205, 10, 249, 10, 43, 11, 99, 11, 160, 11, 227, 11, 44, 12, 122, 12, 207, 12, 40, 13, 136, 13, 237, 13, 87, 14, 199, 14, 60, 15, 183, 15, 55, 16, 189, 16, 71, 17, 215, 17, 108, 18, 6, 19, 165, 19, 73, 20, 242, 20, 159, 21, 82, 22, 9, 23, 196, 23, 133, 24, 73, 25, 18, 26, 224, 26, 177, 27, 135, 28, 97, 29, 62, 30, 32, 31, 5, 32, 238, 32, 219, 33, 203, 34, 191, 35, 182, 36, 176, 37, 174, 38, 174, 39, 177, 40, 184, 41, 193, 42, 204, 43, 218, 44, 235, 45, 254, 46, 19, 48, 42, 49, 67, 50, 94, 51, 123, 52, 154, 53, 186, 54, 219, 55, 254, 56, 34, 58, 71, 59, 109, 60, 148, 61, 188, 62, 228, 63, 13, 65, 54, 66, 96, 67, 138, 68, 180, 69, 221, 70, 7, 72, 48, 73, 89, 74, 130, 75, 169, 76, 208, 77, 246, 78, 27, 80, 63, 81, 98, 82, 132, 83, 164, 84, 194, 85, 223, 86, 250, 87, 19, 89, 43, 90, 64, 91, 83, 92, 99, 93, 113, 94, 125, 95, 134, 96, 140, 97, 143, 98, 144, 99, 141, 100, 135, 101, 126, 102, 114, 103, 98, 104, 79, 105, 56, 106, 30, 107, 255, 107, 221, 108, 183, 109, 140, 110, 94, 111, 43, 112, 244, 112, 185, 113, 121, 114, 53, 115, 236, 115, 158, 116, 76, 117, 245, 117, 153, 118, 55, 119, 209, 119, 102, 120, 246, 120, 129, 121, 6, 122, 134, 122, 1, 123, 118, 123, 230, 123, 81, 124, 182, 124, 21, 125, 111, 125, 195, 125, 17, 126, 90, 126, 157, 126, 219, 126, 18, 127, 68, 127, 112, 127, 150, 127, 183, 127, 209, 127, 230, 127, 244, 127, 253, 127, 255, 127, 255, 127, 244, 127, 208, 127, 149, 127, 66, 127, 215, 126, 85, 126, 188, 125, 12, 125, 69, 124, 104, 123, 117, 122, 108, 121, 78, 120, 28, 119, 213, 117, 122, 116, 13, 115, 140, 113, 250, 111, 87, 110, 162, 108, 222, 106, 11, 105, 40, 103, 57, 101, 60, 99, 51, 97, 30, 95, 255, 92, 215, 90, 165, 88, 108, 86, 44, 84, 229, 81, 154, 79, 74, 77, 247, 74, 161, 72, 74, 70, 243, 67, 156, 65, 71, 63, 244, 60, 164, 58, 88, 56, 18, 54, 209, 51, 152, 49, 103, 47, 62, 45, 31, 43, 11, 41, 2, 39, 5, 37, 21, 35, 51, 33, 95, 31, 155, 29, 231, 27, 67, 26, 177, 24, 49, 23, 195, 21, 105, 20, 34, 19, 239, 17, 209, 16, 201, 15, 214, 14, 249, 13, 50, 13, 130, 12, 232, 11, 102, 11, 252, 10, 169, 10, 109, 10, 73, 10, 61, 10, 61, 10, 63, 10, 67, 10, 74, 10, 84, 10, 96, 10, 111, 10, 129, 10, 150, 10, 174, 10, 200, 10, 229, 10, 5, 11, 39, 11, 77, 11, 117, 11, 159, 11, 205, 11, 253, 11, 48, 12, 101, 12, 157, 12, 216, 12, 22, 13, 86, 13, 153, 13, 222, 13, 38, 14, 113, 14, 190, 14, 13, 15, 96, 15, 181, 15, 12, 16, 102, 16, 194, 16, 33, 17, 130, 17, 230, 17, 76, 18, 180, 18, 31, 19, 140, 19, 252, 19, 110, 20, 226, 20, 88, 21, 209, 21, 76, 22, 201, 22, 72, 23, 202, 23, 77, 24, 211, 24, 91, 25, 229, 25, 113, 26, 254, 26, 142, 27, 32, 28, 180, 28, 74, 29, 225, 29, 123, 30, 22, 31, 179, 31, 82, 32, 242, 32, 149, 33, 57, 34, 222, 34, 133, 35, 46, 36, 216, 36, 132, 37, 50, 38, 224, 38, 145, 39, 66, 40, 245, 40, 169, 41, 95, 42, 22, 43, 206, 43, 135, 44, 66, 45, 253, 45, 186, 46, 120, 47, 54, 48, 246, 48, 183, 49, 120, 50, 59, 51, 254, 51, 194, 52, 135, 53, 77, 54, 19, 55, 218, 55, 161, 56, 106, 57, 50, 58, 252, 58, 197, 59, 144, 60, 90, 61, 37, 62, 240, 62, 188, 63, 136, 64, 84, 65, 32, 66, 236, 66, 185, 67, 133, 68, 82, 69, 30, 70, 235, 70, 183, 71, 132, 72, 80, 73, 28, 74, 231, 74, 179, 75, 126, 76, 73, 77, 19, 78, 221, 78, 166, 79, 111, 80, 56, 81, 0, 82, 199, 82, 142, 83, 84, 84, 25, 85, 221, 85, 161, 86, 100, 87, 38, 88, 231, 88, 167, 89, 103, 90, 37, 91, 226, 91, 158, 92, 89, 93, 19, 94, 204, 94, 131, 95, 57, 96, 238, 96, 162, 97, 84, 98, 5, 99, 181, 99, 99, 100, 15, 101, 186, 101, 100, 102, 12, 103, 178, 103, 87, 104, 250, 104, 155, 105, 59, 106, 217, 106, 117, 107, 16, 108, 168, 108, 63, 109, 211, 109, 102, 110, 247, 110, 134, 111, 19, 112, 158, 112, 39, 113, 174, 113, 50, 114, 181, 114, 53, 115, 179, 115, 47, 116, 169, 116, 33, 117, 150, 117, 9, 118, 122, 118, 232, 118, 84, 119, 190, 119, 37, 120, 138, 120, 236, 120, 76, 121, 170, 121, 5, 122, 94, 122, 180, 122, 7, 123, 88, 123, 167, 123, 242, 123, 60, 124, 130, 124, 198, 124, 8, 125, 71, 125, 131, 125, 188, 125, 243, 125, 39, 126, 89, 126, 136, 126, 180, 126, 221, 126, 4, 127, 40, 127, 73, 127, 103, 127, 131, 127, 156, 127, 178, 127, 197, 127, 214, 127, 228, 127, 239, 127, 247, 127, 253, 127, 255, 127, 255, 127, 97, 125, 160, 117, 15, 105, 48, 88, 181, 67, 116, 44, 98, 19, 68, 101, 99, 111, 100, 101, 114, 0, 101, 110, 99, 111, 100, 101, 114, 0], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE + 30720); var tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8); assert(tempDoublePtr % 8 == 0); function _sbrk(bytes) { var self = _sbrk; if (!self.called) { DYNAMICTOP = alignMemoryPage(DYNAMICTOP); self.called = true; assert(Runtime.dynamicAlloc); self.alloc = Runtime.dynamicAlloc; Runtime.dynamicAlloc = (function () { abort("cannot dynamically allocate, sbrk now has control"); }); } var ret = DYNAMICTOP; if (bytes != 0) { var success = self.alloc(bytes); if (!success) return -1 >>> 0 } return ret } function ___setErrNo(value) { if (Module["___errno_location"]) HEAP32[Module["___errno_location"]() >> 2] = value; return value } var ERRNO_CODES = { EPERM: 1, ENOENT: 2, ESRCH: 3, EINTR: 4, EIO: 5, ENXIO: 6, E2BIG: 7, ENOEXEC: 8, EBADF: 9, ECHILD: 10, EAGAIN: 11, EWOULDBLOCK: 11, ENOMEM: 12, EACCES: 13, EFAULT: 14, ENOTBLK: 15, EBUSY: 16, EEXIST: 17, EXDEV: 18, ENODEV: 19, ENOTDIR: 20, EISDIR: 21, EINVAL: 22, ENFILE: 23, EMFILE: 24, ENOTTY: 25, ETXTBSY: 26, EFBIG: 27, ENOSPC: 28, ESPIPE: 29, EROFS: 30, EMLINK: 31, EPIPE: 32, EDOM: 33, ERANGE: 34, ENOMSG: 42, EIDRM: 43, ECHRNG: 44, EL2NSYNC: 45, EL3HLT: 46, EL3RST: 47, ELNRNG: 48, EUNATCH: 49, ENOCSI: 50, EL2HLT: 51, EDEADLK: 35, ENOLCK: 37, EBADE: 52, EBADR: 53, EXFULL: 54, ENOANO: 55, EBADRQC: 56, EBADSLT: 57, EDEADLOCK: 35, EBFONT: 59, ENOSTR: 60, ENODATA: 61, ETIME: 62, ENOSR: 63, ENONET: 64, ENOPKG: 65, EREMOTE: 66, ENOLINK: 67, EADV: 68, ESRMNT: 69, ECOMM: 70, EPROTO: 71, EMULTIHOP: 72, EDOTDOT: 73, EBADMSG: 74, ENOTUNIQ: 76, EBADFD: 77, EREMCHG: 78, ELIBACC: 79, ELIBBAD: 80, ELIBSCN: 81, ELIBMAX: 82, ELIBEXEC: 83, ENOSYS: 38, ENOTEMPTY: 39, ENAMETOOLONG: 36, ELOOP: 40, EOPNOTSUPP: 95, EPFNOSUPPORT: 96, ECONNRESET: 104, ENOBUFS: 105, EAFNOSUPPORT: 97, EPROTOTYPE: 91, ENOTSOCK: 88, ENOPROTOOPT: 92, ESHUTDOWN: 108, ECONNREFUSED: 111, EADDRINUSE: 98, ECONNABORTED: 103, ENETUNREACH: 101, ENETDOWN: 100, ETIMEDOUT: 110, EHOSTDOWN: 112, EHOSTUNREACH: 113, EINPROGRESS: 115, EALREADY: 114, EDESTADDRREQ: 89, EMSGSIZE: 90, EPROTONOSUPPORT: 93, ESOCKTNOSUPPORT: 94, EADDRNOTAVAIL: 99, ENETRESET: 102, EISCONN: 106, ENOTCONN: 107, ETOOMANYREFS: 109, EUSERS: 87, EDQUOT: 122, ESTALE: 116, ENOTSUP: 95, ENOMEDIUM: 123, EILSEQ: 84, EOVERFLOW: 75, ECANCELED: 125, ENOTRECOVERABLE: 131, EOWNERDEAD: 130, ESTRPIPE: 86 }; function _sysconf(name) { switch (name) { case 30: return PAGE_SIZE; case 85: return totalMemory / PAGE_SIZE; case 132: case 133: case 12: case 137: case 138: case 15: case 235: case 16: case 17: case 18: case 19: case 20: case 149: case 13: case 10: case 236: case 153: case 9: case 21: case 22: case 159: case 154: case 14: case 77: case 78: case 139: case 80: case 81: case 82: case 68: case 67: case 164: case 11: case 29: case 47: case 48: case 95: case 52: case 51: case 46: return 200809; case 79: return 0; case 27: case 246: case 127: case 128: case 23: case 24: case 160: case 161: case 181: case 182: case 242: case 183: case 184: case 243: case 244: case 245: case 165: case 178: case 179: case 49: case 50: case 168: case 169: case 175: case 170: case 171: case 172: case 97: case 76: case 32: case 173: case 35: return -1; case 176: case 177: case 7: case 155: case 8: case 157: case 125: case 126: case 92: case 93: case 129: case 130: case 131: case 94: case 91: return 1; case 74: case 60: case 69: case 70: case 4: return 1024; case 31: case 42: case 72: return 32; case 87: case 26: case 33: return 2147483647; case 34: case 1: return 47839; case 38: case 36: return 99; case 43: case 37: return 2048; case 0: return 2097152; case 3: return 65536; case 28: return 32768; case 44: return 32767; case 75: return 16384; case 39: return 1e3; case 89: return 700; case 71: return 256; case 40: return 255; case 2: return 100; case 180: return 64; case 25: return 20; case 5: return 16; case 6: return 6; case 73: return 4; case 84: { if (typeof navigator === "object") return navigator["hardwareConcurrency"] || 1; return 1 } } ___setErrNo(ERRNO_CODES.EINVAL); return -1 } function _emscripten_memcpy_big(dest, src, num) { HEAPU8.set(HEAPU8.subarray(src, src + num), dest); return dest } Module["_memcpy"] = _memcpy; Module["_memmove"] = _memmove; Module["_memset"] = _memset; function _abort() { Module["abort"](); } var ERRNO_MESSAGES = { 0: "Success", 1: "Not super-user", 2: "No such file or directory", 3: "No such process", 4: "Interrupted system call", 5: "I/O error", 6: "No such device or address", 7: "Arg list too long", 8: "Exec format error", 9: "Bad file number", 10: "No children", 11: "No more processes", 12: "Not enough core", 13: "Permission denied", 14: "Bad address", 15: "Block device required", 16: "Mount device busy", 17: "File exists", 18: "Cross-device link", 19: "No such device", 20: "Not a directory", 21: "Is a directory", 22: "Invalid argument", 23: "Too many open files in system", 24: "Too many open files", 25: "Not a typewriter", 26: "Text file busy", 27: "File too large", 28: "No space left on device", 29: "Illegal seek", 30: "Read only file system", 31: "Too many links", 32: "Broken pipe", 33: "Math arg out of domain of func", 34: "Math result not representable", 35: "File locking deadlock error", 36: "File or path name too long", 37: "No record locks available", 38: "Function not implemented", 39: "Directory not empty", 40: "Too many symbolic links", 42: "No message of desired type", 43: "Identifier removed", 44: "Channel number out of range", 45: "Level 2 not synchronized", 46: "Level 3 halted", 47: "Level 3 reset", 48: "Link number out of range", 49: "Protocol driver not attached", 50: "No CSI structure available", 51: "Level 2 halted", 52: "Invalid exchange", 53: "Invalid request descriptor", 54: "Exchange full", 55: "No anode", 56: "Invalid request code", 57: "Invalid slot", 59: "Bad font file fmt", 60: "Device not a stream", 61: "No data (for no delay io)", 62: "Timer expired", 63: "Out of streams resources", 64: "Machine is not on the network", 65: "Package not installed", 66: "The object is remote", 67: "The link has been severed", 68: "Advertise error", 69: "Srmount error", 70: "Communication error on send", 71: "Protocol error", 72: "Multihop attempted", 73: "Cross mount point (not really error)", 74: "Trying to read unreadable message", 75: "Value too large for defined data type", 76: "Given log. name not unique", 77: "f.d. invalid for this operation", 78: "Remote address changed", 79: "Can access a needed shared lib", 80: "Accessing a corrupted shared lib", 81: ".lib section in a.out corrupted", 82: "Attempting to link in too many libs", 83: "Attempting to exec a shared library", 84: "Illegal byte sequence", 86: "Streams pipe error", 87: "Too many users", 88: "Socket operation on non-socket", 89: "Destination address required", 90: "Message too long", 91: "Protocol wrong type for socket", 92: "Protocol not available", 93: "Unknown protocol", 94: "Socket type not supported", 95: "Not supported", 96: "Protocol family not supported", 97: "Address family not supported by protocol family", 98: "Address already in use", 99: "Address not available", 100: "Network interface is not configured", 101: "Network is unreachable", 102: "Connection reset by network", 103: "Connection aborted", 104: "Connection reset by peer", 105: "No buffer space available", 106: "Socket is already connected", 107: "Socket is not connected", 108: "Can't send after socket shutdown", 109: "Too many references", 110: "Connection timed out", 111: "Connection refused", 112: "Host is down", 113: "Host is unreachable", 114: "Socket already connected", 115: "Connection already in progress", 116: "Stale file handle", 122: "Quota exceeded", 123: "No medium (in tape drive)", 125: "Operation canceled", 130: "Previous owner died", 131: "State not recoverable" }; var TTY = { ttys: [], init: (function () { }), shutdown: (function () { }), register: (function (dev, ops) { TTY.ttys[dev] = {input: [], output: [], ops: ops}; FS.registerDevice(dev, TTY.stream_ops); }), stream_ops: { open: (function (stream) { var tty = TTY.ttys[stream.node.rdev]; if (!tty) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV) } stream.tty = tty; stream.seekable = false; }), close: (function (stream) { stream.tty.ops.flush(stream.tty); }), flush: (function (stream) { stream.tty.ops.flush(stream.tty); }), read: (function (stream, buffer, offset, length, pos) { if (!stream.tty || !stream.tty.ops.get_char) { throw new FS.ErrnoError(ERRNO_CODES.ENXIO) } var bytesRead = 0; for (var i = 0; i < length; i++) { var result; try { result = stream.tty.ops.get_char(stream.tty); } catch (e) { throw new FS.ErrnoError(ERRNO_CODES.EIO) } if (result === undefined && bytesRead === 0) { throw new FS.ErrnoError(ERRNO_CODES.EAGAIN) } if (result === null || result === undefined) break; bytesRead++; buffer[offset + i] = result; } if (bytesRead) { stream.node.timestamp = Date.now(); } return bytesRead }), write: (function (stream, buffer, offset, length, pos) { if (!stream.tty || !stream.tty.ops.put_char) { throw new FS.ErrnoError(ERRNO_CODES.ENXIO) } for (var i = 0; i < length; i++) { try { stream.tty.ops.put_char(stream.tty, buffer[offset + i]); } catch (e) { throw new FS.ErrnoError(ERRNO_CODES.EIO) } } if (length) { stream.node.timestamp = Date.now(); } return i }) }, default_tty_ops: { get_char: (function (tty) { if (!tty.input.length) { var result = null; if (typeof window != "undefined" && typeof window.prompt == "function") { result = window.prompt("Input: "); if (result !== null) { result += "\n"; } } else if (typeof readline == "function") { result = readline(); if (result !== null) { result += "\n"; } } if (!result) { return null } tty.input = intArrayFromString(result, true); } return tty.input.shift() }), put_char: (function (tty, val) { if (val === null || val === 10) { Module["print"](UTF8ArrayToString(tty.output, 0)); tty.output = []; } else { if (val != 0) tty.output.push(val); } }), flush: (function (tty) { if (tty.output && tty.output.length > 0) { Module["print"](UTF8ArrayToString(tty.output, 0)); tty.output = []; } }) }, default_tty1_ops: { put_char: (function (tty, val) { if (val === null || val === 10) { Module["printErr"](UTF8ArrayToString(tty.output, 0)); tty.output = []; } else { if (val != 0) tty.output.push(val); } }), flush: (function (tty) { if (tty.output && tty.output.length > 0) { Module["printErr"](UTF8ArrayToString(tty.output, 0)); tty.output = []; } }) } }; var MEMFS = { ops_table: null, mount: (function (mount) { return MEMFS.createNode(null, "/", 16384 | 511, 0) }), createNode: (function (parent, name, mode, dev) { if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) } if (!MEMFS.ops_table) { MEMFS.ops_table = { dir: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, lookup: MEMFS.node_ops.lookup, mknod: MEMFS.node_ops.mknod, rename: MEMFS.node_ops.rename, unlink: MEMFS.node_ops.unlink, rmdir: MEMFS.node_ops.rmdir, readdir: MEMFS.node_ops.readdir, symlink: MEMFS.node_ops.symlink }, stream: {llseek: MEMFS.stream_ops.llseek} }, file: { node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr}, stream: { llseek: MEMFS.stream_ops.llseek, read: MEMFS.stream_ops.read, write: MEMFS.stream_ops.write, allocate: MEMFS.stream_ops.allocate, mmap: MEMFS.stream_ops.mmap, msync: MEMFS.stream_ops.msync } }, link: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, readlink: MEMFS.node_ops.readlink }, stream: {} }, chrdev: { node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr}, stream: FS.chrdev_stream_ops } }; } var node = FS.createNode(parent, name, mode, dev); if (FS.isDir(node.mode)) { node.node_ops = MEMFS.ops_table.dir.node; node.stream_ops = MEMFS.ops_table.dir.stream; node.contents = {}; } else if (FS.isFile(node.mode)) { node.node_ops = MEMFS.ops_table.file.node; node.stream_ops = MEMFS.ops_table.file.stream; node.usedBytes = 0; node.contents = null; } else if (FS.isLink(node.mode)) { node.node_ops = MEMFS.ops_table.link.node; node.stream_ops = MEMFS.ops_table.link.stream; } else if (FS.isChrdev(node.mode)) { node.node_ops = MEMFS.ops_table.chrdev.node; node.stream_ops = MEMFS.ops_table.chrdev.stream; } node.timestamp = Date.now(); if (parent) { parent.contents[name] = node; } return node }), getFileDataAsRegularArray: (function (node) { if (node.contents && node.contents.subarray) { var arr = []; for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]); return arr } return node.contents }), getFileDataAsTypedArray: (function (node) { if (!node.contents) return new Uint8Array; if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); return new Uint8Array(node.contents) }), expandFileStorage: (function (node, newCapacity) { if (node.contents && node.contents.subarray && newCapacity > node.contents.length) { node.contents = MEMFS.getFileDataAsRegularArray(node); node.usedBytes = node.contents.length; } if (!node.contents || node.contents.subarray) { var prevCapacity = node.contents ? node.contents.buffer.byteLength : 0; if (prevCapacity >= newCapacity) return; var CAPACITY_DOUBLING_MAX = 1024 * 1024; newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) | 0); if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); var oldContents = node.contents; node.contents = new Uint8Array(newCapacity); if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); return } if (!node.contents && newCapacity > 0) node.contents = []; while (node.contents.length < newCapacity) node.contents.push(0); }), resizeFileStorage: (function (node, newSize) { if (node.usedBytes == newSize) return; if (newSize == 0) { node.contents = null; node.usedBytes = 0; return } if (!node.contents || node.contents.subarray) { var oldContents = node.contents; node.contents = new Uint8Array(new ArrayBuffer(newSize)); if (oldContents) { node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); } node.usedBytes = newSize; return } if (!node.contents) node.contents = []; if (node.contents.length > newSize) node.contents.length = newSize; else while (node.contents.length < newSize) node.contents.push(0); node.usedBytes = newSize; }), node_ops: { getattr: (function (node) { var attr = {}; attr.dev = FS.isChrdev(node.mode) ? node.id : 1; attr.ino = node.id; attr.mode = node.mode; attr.nlink = 1; attr.uid = 0; attr.gid = 0; attr.rdev = node.rdev; if (FS.isDir(node.mode)) { attr.size = 4096; } else if (FS.isFile(node.mode)) { attr.size = node.usedBytes; } else if (FS.isLink(node.mode)) { attr.size = node.link.length; } else { attr.size = 0; } attr.atime = new Date(node.timestamp); attr.mtime = new Date(node.timestamp); attr.ctime = new Date(node.timestamp); attr.blksize = 4096; attr.blocks = Math.ceil(attr.size / attr.blksize); return attr }), setattr: (function (node, attr) { if (attr.mode !== undefined) { node.mode = attr.mode; } if (attr.timestamp !== undefined) { node.timestamp = attr.timestamp; } if (attr.size !== undefined) { MEMFS.resizeFileStorage(node, attr.size); } }), lookup: (function (parent, name) { throw FS.genericErrors[ERRNO_CODES.ENOENT] }), mknod: (function (parent, name, mode, dev) { return MEMFS.createNode(parent, name, mode, dev) }), rename: (function (old_node, new_dir, new_name) { if (FS.isDir(old_node.mode)) { var new_node; try { new_node = FS.lookupNode(new_dir, new_name); } catch (e) { } if (new_node) { for (var i in new_node.contents) { throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY) } } } delete old_node.parent.contents[old_node.name]; old_node.name = new_name; new_dir.contents[new_name] = old_node; old_node.parent = new_dir; }), unlink: (function (parent, name) { delete parent.contents[name]; }), rmdir: (function (parent, name) { var node = FS.lookupNode(parent, name); for (var i in node.contents) { throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY) } delete parent.contents[name]; }), readdir: (function (node) { var entries = [".", ".."]; for (var key in node.contents) { if (!node.contents.hasOwnProperty(key)) { continue } entries.push(key); } return entries }), symlink: (function (parent, newname, oldpath) { var node = MEMFS.createNode(parent, newname, 511 | 40960, 0); node.link = oldpath; return node }), readlink: (function (node) { if (!FS.isLink(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } return node.link }) }, stream_ops: { read: (function (stream, buffer, offset, length, position) { var contents = stream.node.contents; if (position >= stream.node.usedBytes) return 0; var size = Math.min(stream.node.usedBytes - position, length); assert(size >= 0); if (size > 8 && contents.subarray) { buffer.set(contents.subarray(position, position + size), offset); } else { for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; } return size }), write: (function (stream, buffer, offset, length, position, canOwn) { if (!length) return 0; var node = stream.node; node.timestamp = Date.now(); if (buffer.subarray && (!node.contents || node.contents.subarray)) { if (canOwn) { node.contents = buffer.subarray(offset, offset + length); node.usedBytes = length; return length } else if (node.usedBytes === 0 && position === 0) { node.contents = new Uint8Array(buffer.subarray(offset, offset + length)); node.usedBytes = length; return length } else if (position + length <= node.usedBytes) { node.contents.set(buffer.subarray(offset, offset + length), position); return length } } MEMFS.expandFileStorage(node, position + length); if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); else { for (var i = 0; i < length; i++) { node.contents[position + i] = buffer[offset + i]; } } node.usedBytes = Math.max(node.usedBytes, position + length); return length }), llseek: (function (stream, offset, whence) { var position = offset; if (whence === 1) { position += stream.position; } else if (whence === 2) { if (FS.isFile(stream.node.mode)) { position += stream.node.usedBytes; } } if (position < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } return position }), allocate: (function (stream, offset, length) { MEMFS.expandFileStorage(stream.node, offset + length); stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); }), mmap: (function (stream, buffer, offset, length, position, prot, flags) { if (!FS.isFile(stream.node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV) } var ptr; var allocated; var contents = stream.node.contents; if (!(flags & 2) && (contents.buffer === buffer || contents.buffer === buffer.buffer)) { allocated = false; ptr = contents.byteOffset; } else { if (position > 0 || position + length < stream.node.usedBytes) { if (contents.subarray) { contents = contents.subarray(position, position + length); } else { contents = Array.prototype.slice.call(contents, position, position + length); } } allocated = true; ptr = _malloc(length); if (!ptr) { throw new FS.ErrnoError(ERRNO_CODES.ENOMEM) } buffer.set(contents, ptr); } return {ptr: ptr, allocated: allocated} }), msync: (function (stream, buffer, offset, length, mmapFlags) { if (!FS.isFile(stream.node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV) } if (mmapFlags & 2) { return 0 } MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); return 0 }) } }; var IDBFS = { dbs: {}, indexedDB: (function () { if (typeof indexedDB !== "undefined") return indexedDB; var ret = null; if (typeof window === "object") ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; assert(ret, "IDBFS used, but indexedDB not supported"); return ret }), DB_VERSION: 21, DB_STORE_NAME: "FILE_DATA", mount: (function (mount) { return MEMFS.mount.apply(null, arguments) }), syncfs: (function (mount, populate, callback) { IDBFS.getLocalSet(mount, (function (err, local) { if (err) return callback(err); IDBFS.getRemoteSet(mount, (function (err, remote) { if (err) return callback(err); var src = populate ? remote : local; var dst = populate ? local : remote; IDBFS.reconcile(src, dst, callback); })); })); }), getDB: (function (name, callback) { var db = IDBFS.dbs[name]; if (db) { return callback(null, db) } var req; try { req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION); } catch (e) { return callback(e) } req.onupgradeneeded = (function (e) { var db = e.target.result; var transaction = e.target.transaction; var fileStore; if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) { fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME); } else { fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME); } if (!fileStore.indexNames.contains("timestamp")) { fileStore.createIndex("timestamp", "timestamp", {unique: false}); } }); req.onsuccess = (function () { db = req.result; IDBFS.dbs[name] = db; callback(null, db); }); req.onerror = (function (e) { callback(this.error); e.preventDefault(); }); }), getLocalSet: (function (mount, callback) { var entries = {}; function isRealDir(p) { return p !== "." && p !== ".." } function toAbsolute(root) { return (function (p) { return PATH.join2(root, p) }) } var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint)); while (check.length) { var path = check.pop(); var stat; try { stat = FS.stat(path); } catch (e) { return callback(e) } if (FS.isDir(stat.mode)) { check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path))); } entries[path] = {timestamp: stat.mtime}; } return callback(null, {type: "local", entries: entries}) }), getRemoteSet: (function (mount, callback) { var entries = {}; IDBFS.getDB(mount.mountpoint, (function (err, db) { if (err) return callback(err); var transaction = db.transaction([IDBFS.DB_STORE_NAME], "readonly"); transaction.onerror = (function (e) { callback(this.error); e.preventDefault(); }); var store = transaction.objectStore(IDBFS.DB_STORE_NAME); var index = store.index("timestamp"); index.openKeyCursor().onsuccess = (function (event) { var cursor = event.target.result; if (!cursor) { return callback(null, {type: "remote", db: db, entries: entries}) } entries[cursor.primaryKey] = {timestamp: cursor.key}; cursor.continue(); }); })); }), loadLocalEntry: (function (path, callback) { var stat, node; try { var lookup = FS.lookupPath(path); node = lookup.node; stat = FS.stat(path); } catch (e) { return callback(e) } if (FS.isDir(stat.mode)) { return callback(null, {timestamp: stat.mtime, mode: stat.mode}) } else if (FS.isFile(stat.mode)) { node.contents = MEMFS.getFileDataAsTypedArray(node); return callback(null, {timestamp: stat.mtime, mode: stat.mode, contents: node.contents}) } else { return callback(new Error("node type not supported")) } }), storeLocalEntry: (function (path, entry, callback) { try { if (FS.isDir(entry.mode)) { FS.mkdir(path, entry.mode); } else if (FS.isFile(entry.mode)) { FS.writeFile(path, entry.contents, {encoding: "binary", canOwn: true}); } else { return callback(new Error("node type not supported")) } FS.chmod(path, entry.mode); FS.utime(path, entry.timestamp, entry.timestamp); } catch (e) { return callback(e) } callback(null); }), removeLocalEntry: (function (path, callback) { try { var lookup = FS.lookupPath(path); var stat = FS.stat(path); if (FS.isDir(stat.mode)) { FS.rmdir(path); } else if (FS.isFile(stat.mode)) { FS.unlink(path); } } catch (e) { return callback(e) } callback(null); }), loadRemoteEntry: (function (store, path, callback) { var req = store.get(path); req.onsuccess = (function (event) { callback(null, event.target.result); }); req.onerror = (function (e) { callback(this.error); e.preventDefault(); }); }), storeRemoteEntry: (function (store, path, entry, callback) { var req = store.put(entry, path); req.onsuccess = (function () { callback(null); }); req.onerror = (function (e) { callback(this.error); e.preventDefault(); }); }), removeRemoteEntry: (function (store, path, callback) { var req = store.delete(path); req.onsuccess = (function () { callback(null); }); req.onerror = (function (e) { callback(this.error); e.preventDefault(); }); }), reconcile: (function (src, dst, callback) { var total = 0; var create = []; Object.keys(src.entries).forEach((function (key) { var e = src.entries[key]; var e2 = dst.entries[key]; if (!e2 || e.timestamp > e2.timestamp) { create.push(key); total++; } })); var remove = []; Object.keys(dst.entries).forEach((function (key) { dst.entries[key]; var e2 = src.entries[key]; if (!e2) { remove.push(key); total++; } })); if (!total) { return callback(null) } var completed = 0; var db = src.type === "remote" ? src.db : dst.db; var transaction = db.transaction([IDBFS.DB_STORE_NAME], "readwrite"); var store = transaction.objectStore(IDBFS.DB_STORE_NAME); function done(err) { if (err) { if (!done.errored) { done.errored = true; return callback(err) } return } if (++completed >= total) { return callback(null) } } transaction.onerror = (function (e) { done(this.error); e.preventDefault(); }); create.sort().forEach((function (path) { if (dst.type === "local") { IDBFS.loadRemoteEntry(store, path, (function (err, entry) { if (err) return done(err); IDBFS.storeLocalEntry(path, entry, done); })); } else { IDBFS.loadLocalEntry(path, (function (err, entry) { if (err) return done(err); IDBFS.storeRemoteEntry(store, path, entry, done); })); } })); remove.sort().reverse().forEach((function (path) { if (dst.type === "local") { IDBFS.removeLocalEntry(path, done); } else { IDBFS.removeRemoteEntry(store, path, done); } })); }) }; var WORKERFS = { DIR_MODE: 16895, FILE_MODE: 33279, reader: null, mount: (function (mount) { assert(ENVIRONMENT_IS_WORKER); if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync; var root = WORKERFS.createNode(null, "/", WORKERFS.DIR_MODE, 0); var createdParents = {}; function ensureParent(path) { var parts = path.split("/"); var parent = root; for (var i = 0; i < parts.length - 1; i++) { var curr = parts.slice(0, i + 1).join("/"); if (!createdParents[curr]) { createdParents[curr] = WORKERFS.createNode(parent, curr, WORKERFS.DIR_MODE, 0); } parent = createdParents[curr]; } return parent } function base(path) { var parts = path.split("/"); return parts[parts.length - 1] } Array.prototype.forEach.call(mount.opts["files"] || [], (function (file) { WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate); })); (mount.opts["blobs"] || []).forEach((function (obj) { WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]); })); (mount.opts["packages"] || []).forEach((function (pack) { pack["metadata"].files.forEach((function (file) { var name = file.filename.substr(1); WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack["blob"].slice(file.start, file.end)); })); })); return root }), createNode: (function (parent, name, mode, dev, contents, mtime) { var node = FS.createNode(parent, name, mode); node.mode = mode; node.node_ops = WORKERFS.node_ops; node.stream_ops = WORKERFS.stream_ops; node.timestamp = (mtime || new Date).getTime(); assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE); if (mode === WORKERFS.FILE_MODE) { node.size = contents.size; node.contents = contents; } else { node.size = 4096; node.contents = {}; } if (parent) { parent.contents[name] = node; } return node }), node_ops: { getattr: (function (node) { return { dev: 1, ino: undefined, mode: node.mode, nlink: 1, uid: 0, gid: 0, rdev: undefined, size: node.size, atime: new Date(node.timestamp), mtime: new Date(node.timestamp), ctime: new Date(node.timestamp), blksize: 4096, blocks: Math.ceil(node.size / 4096) } }), setattr: (function (node, attr) { if (attr.mode !== undefined) { node.mode = attr.mode; } if (attr.timestamp !== undefined) { node.timestamp = attr.timestamp; } }), lookup: (function (parent, name) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT) }), mknod: (function (parent, name, mode, dev) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) }), rename: (function (oldNode, newDir, newName) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) }), unlink: (function (parent, name) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) }), rmdir: (function (parent, name) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) }), readdir: (function (node) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) }), symlink: (function (parent, newName, oldPath) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) }), readlink: (function (node) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) }) }, stream_ops: { read: (function (stream, buffer, offset, length, position) { if (position >= stream.node.size) return 0; var chunk = stream.node.contents.slice(position, position + length); var ab = WORKERFS.reader.readAsArrayBuffer(chunk); buffer.set(new Uint8Array(ab), offset); return chunk.size }), write: (function (stream, buffer, offset, length, position) { throw new FS.ErrnoError(ERRNO_CODES.EIO) }), llseek: (function (stream, offset, whence) { var position = offset; if (whence === 1) { position += stream.position; } else if (whence === 2) { if (FS.isFile(stream.node.mode)) { position += stream.node.size; } } if (position < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } return position }) } }; allocate(1, "i32*", ALLOC_STATIC); allocate(1, "i32*", ALLOC_STATIC); allocate(1, "i32*", ALLOC_STATIC); var FS = { root: null, mounts: [], devices: [null], streams: [], nextInode: 1, nameTable: null, currentPath: "/", initialized: false, ignorePermissions: true, trackingDelegate: {}, tracking: {openFlags: {READ: 1, WRITE: 2}}, ErrnoError: null, genericErrors: {}, filesystems: null, handleFSError: (function (e) { if (!(e instanceof FS.ErrnoError)) throw e + " : " + stackTrace(); return ___setErrNo(e.errno) }), lookupPath: (function (path, opts) { path = PATH.resolve(FS.cwd(), path); opts = opts || {}; if (!path) return {path: "", node: null}; var defaults = {follow_mount: true, recurse_count: 0}; for (var key in defaults) { if (opts[key] === undefined) { opts[key] = defaults[key]; } } if (opts.recurse_count > 8) { throw new FS.ErrnoError(ERRNO_CODES.ELOOP) } var parts = PATH.normalizeArray(path.split("/").filter((function (p) { return !!p })), false); var current = FS.root; var current_path = "/"; for (var i = 0; i < parts.length; i++) { var islast = i === parts.length - 1; if (islast && opts.parent) { break } current = FS.lookupNode(current, parts[i]); current_path = PATH.join2(current_path, parts[i]); if (FS.isMountpoint(current)) { if (!islast || islast && opts.follow_mount) { current = current.mounted.root; } } if (!islast || opts.follow) { var count = 0; while (FS.isLink(current.mode)) { var link = FS.readlink(current_path); current_path = PATH.resolve(PATH.dirname(current_path), link); var lookup = FS.lookupPath(current_path, {recurse_count: opts.recurse_count}); current = lookup.node; if (count++ > 40) { throw new FS.ErrnoError(ERRNO_CODES.ELOOP) } } } } return {path: current_path, node: current} }), getPath: (function (node) { var path; while (true) { if (FS.isRoot(node)) { var mount = node.mount.mountpoint; if (!path) return mount; return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path } path = path ? node.name + "/" + path : node.name; node = node.parent; } }), hashName: (function (parentid, name) { var hash = 0; for (var i = 0; i < name.length; i++) { hash = (hash << 5) - hash + name.charCodeAt(i) | 0; } return (parentid + hash >>> 0) % FS.nameTable.length }), hashAddNode: (function (node) { var hash = FS.hashName(node.parent.id, node.name); node.name_next = FS.nameTable[hash]; FS.nameTable[hash] = node; }), hashRemoveNode: (function (node) { var hash = FS.hashName(node.parent.id, node.name); if (FS.nameTable[hash] === node) { FS.nameTable[hash] = node.name_next; } else { var current = FS.nameTable[hash]; while (current) { if (current.name_next === node) { current.name_next = node.name_next; break } current = current.name_next; } } }), lookupNode: (function (parent, name) { var err = FS.mayLookup(parent); if (err) { throw new FS.ErrnoError(err, parent) } var hash = FS.hashName(parent.id, name); for (var node = FS.nameTable[hash]; node; node = node.name_next) { var nodeName = node.name; if (node.parent.id === parent.id && nodeName === name) { return node } } return FS.lookup(parent, name) }), createNode: (function (parent, name, mode, rdev) { if (!FS.FSNode) { FS.FSNode = (function (parent, name, mode, rdev) { if (!parent) { parent = this; } this.parent = parent; this.mount = parent.mount; this.mounted = null; this.id = FS.nextInode++; this.name = name; this.mode = mode; this.node_ops = {}; this.stream_ops = {}; this.rdev = rdev; }); FS.FSNode.prototype = {}; var readMode = 292 | 73; var writeMode = 146; Object.defineProperties(FS.FSNode.prototype, { read: { get: (function () { return (this.mode & readMode) === readMode }), set: (function (val) { val ? this.mode |= readMode : this.mode &= ~readMode; }) }, write: { get: (function () { return (this.mode & writeMode) === writeMode }), set: (function (val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }) }, isFolder: { get: (function () { return FS.isDir(this.mode) }) }, isDevice: { get: (function () { return FS.isChrdev(this.mode) }) } }); } var node = new FS.FSNode(parent, name, mode, rdev); FS.hashAddNode(node); return node }), destroyNode: (function (node) { FS.hashRemoveNode(node); }), isRoot: (function (node) { return node === node.parent }), isMountpoint: (function (node) { return !!node.mounted }), isFile: (function (mode) { return (mode & 61440) === 32768 }), isDir: (function (mode) { return (mode & 61440) === 16384 }), isLink: (function (mode) { return (mode & 61440) === 40960 }), isChrdev: (function (mode) { return (mode & 61440) === 8192 }), isBlkdev: (function (mode) { return (mode & 61440) === 24576 }), isFIFO: (function (mode) { return (mode & 61440) === 4096 }), isSocket: (function (mode) { return (mode & 49152) === 49152 }), flagModes: { "r": 0, "rs": 1052672, "r+": 2, "w": 577, "wx": 705, "xw": 705, "w+": 578, "wx+": 706, "xw+": 706, "a": 1089, "ax": 1217, "xa": 1217, "a+": 1090, "ax+": 1218, "xa+": 1218 }, modeStringToFlags: (function (str) { var flags = FS.flagModes[str]; if (typeof flags === "undefined") { throw new Error("Unknown file open mode: " + str) } return flags }), flagsToPermissionString: (function (flag) { var perms = ["r", "w", "rw"][flag & 3]; if (flag & 512) { perms += "w"; } return perms }), nodePermissions: (function (node, perms) { if (FS.ignorePermissions) { return 0 } if (perms.indexOf("r") !== -1 && !(node.mode & 292)) { return ERRNO_CODES.EACCES } else if (perms.indexOf("w") !== -1 && !(node.mode & 146)) { return ERRNO_CODES.EACCES } else if (perms.indexOf("x") !== -1 && !(node.mode & 73)) { return ERRNO_CODES.EACCES } return 0 }), mayLookup: (function (dir) { var err = FS.nodePermissions(dir, "x"); if (err) return err; if (!dir.node_ops.lookup) return ERRNO_CODES.EACCES; return 0 }), mayCreate: (function (dir, name) { try { var node = FS.lookupNode(dir, name); return ERRNO_CODES.EEXIST } catch (e) { } return FS.nodePermissions(dir, "wx") }), mayDelete: (function (dir, name, isdir) { var node; try { node = FS.lookupNode(dir, name); } catch (e) { return e.errno } var err = FS.nodePermissions(dir, "wx"); if (err) { return err } if (isdir) { if (!FS.isDir(node.mode)) { return ERRNO_CODES.ENOTDIR } if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { return ERRNO_CODES.EBUSY } } else { if (FS.isDir(node.mode)) { return ERRNO_CODES.EISDIR } } return 0 }), mayOpen: (function (node, flags) { if (!node) { return ERRNO_CODES.ENOENT } if (FS.isLink(node.mode)) { return ERRNO_CODES.ELOOP } else if (FS.isDir(node.mode)) { if ((flags & 2097155) !== 0 || flags & 512) { return ERRNO_CODES.EISDIR } } return FS.nodePermissions(node, FS.flagsToPermissionString(flags)) }), MAX_OPEN_FDS: 4096, nextfd: (function (fd_start, fd_end) { fd_start = fd_start || 0; fd_end = fd_end || FS.MAX_OPEN_FDS; for (var fd = fd_start; fd <= fd_end; fd++) { if (!FS.streams[fd]) { return fd } } throw new FS.ErrnoError(ERRNO_CODES.EMFILE) }), getStream: (function (fd) { return FS.streams[fd] }), createStream: (function (stream, fd_start, fd_end) { if (!FS.FSStream) { FS.FSStream = (function () { }); FS.FSStream.prototype = {}; Object.defineProperties(FS.FSStream.prototype, { object: { get: (function () { return this.node }), set: (function (val) { this.node = val; }) }, isRead: { get: (function () { return (this.flags & 2097155) !== 1 }) }, isWrite: { get: (function () { return (this.flags & 2097155) !== 0 }) }, isAppend: { get: (function () { return this.flags & 1024 }) } }); } var newStream = new FS.FSStream; for (var p in stream) { newStream[p] = stream[p]; } stream = newStream; var fd = FS.nextfd(fd_start, fd_end); stream.fd = fd; FS.streams[fd] = stream; return stream }), closeStream: (function (fd) { FS.streams[fd] = null; }), chrdev_stream_ops: { open: (function (stream) { var device = FS.getDevice(stream.node.rdev); stream.stream_ops = device.stream_ops; if (stream.stream_ops.open) { stream.stream_ops.open(stream); } }), llseek: (function () { throw new FS.ErrnoError(ERRNO_CODES.ESPIPE) }) }, major: (function (dev) { return dev >> 8 }), minor: (function (dev) { return dev & 255 }), makedev: (function (ma, mi) { return ma << 8 | mi }), registerDevice: (function (dev, ops) { FS.devices[dev] = {stream_ops: ops}; }), getDevice: (function (dev) { return FS.devices[dev] }), getMounts: (function (mount) { var mounts = []; var check = [mount]; while (check.length) { var m = check.pop(); mounts.push(m); check.push.apply(check, m.mounts); } return mounts }), syncfs: (function (populate, callback) { if (typeof populate === "function") { callback = populate; populate = false; } var mounts = FS.getMounts(FS.root.mount); var completed = 0; function done(err) { if (err) { if (!done.errored) { done.errored = true; return callback(err) } return } if (++completed >= mounts.length) { callback(null); } } mounts.forEach((function (mount) { if (!mount.type.syncfs) { return done(null) } mount.type.syncfs(mount, populate, done); })); }), mount: (function (type, opts, mountpoint) { var root = mountpoint === "/"; var pseudo = !mountpoint; var node; if (root && FS.root) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY) } else if (!root && !pseudo) { var lookup = FS.lookupPath(mountpoint, {follow_mount: false}); mountpoint = lookup.path; node = lookup.node; if (FS.isMountpoint(node)) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY) } if (!FS.isDir(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR) } } var mount = {type: type, opts: opts, mountpoint: mountpoint, mounts: []}; var mountRoot = type.mount(mount); mountRoot.mount = mount; mount.root = mountRoot; if (root) { FS.root = mountRoot; } else if (node) { node.mounted = mount; if (node.mount) { node.mount.mounts.push(mount); } } return mountRoot }), unmount: (function (mountpoint) { var lookup = FS.lookupPath(mountpoint, {follow_mount: false}); if (!FS.isMountpoint(lookup.node)) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } var node = lookup.node; var mount = node.mounted; var mounts = FS.getMounts(mount); Object.keys(FS.nameTable).forEach((function (hash) { var current = FS.nameTable[hash]; while (current) { var next = current.name_next; if (mounts.indexOf(current.mount) !== -1) { FS.destroyNode(current); } current = next; } })); node.mounted = null; var idx = node.mount.mounts.indexOf(mount); assert(idx !== -1); node.mount.mounts.splice(idx, 1); }), lookup: (function (parent, name) { return parent.node_ops.lookup(parent, name) }), mknod: (function (path, mode, dev) { var lookup = FS.lookupPath(path, {parent: true}); var parent = lookup.node; var name = PATH.basename(path); if (!name || name === "." || name === "..") { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } var err = FS.mayCreate(parent, name); if (err) { throw new FS.ErrnoError(err) } if (!parent.node_ops.mknod) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) } return parent.node_ops.mknod(parent, name, mode, dev) }), create: (function (path, mode) { mode = mode !== undefined ? mode : 438; mode &= 4095; mode |= 32768; return FS.mknod(path, mode, 0) }), mkdir: (function (path, mode) { mode = mode !== undefined ? mode : 511; mode &= 511 | 512; mode |= 16384; return FS.mknod(path, mode, 0) }), mkdev: (function (path, mode, dev) { if (typeof dev === "undefined") { dev = mode; mode = 438; } mode |= 8192; return FS.mknod(path, mode, dev) }), symlink: (function (oldpath, newpath) { if (!PATH.resolve(oldpath)) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT) } var lookup = FS.lookupPath(newpath, {parent: true}); var parent = lookup.node; if (!parent) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT) } var newname = PATH.basename(newpath); var err = FS.mayCreate(parent, newname); if (err) { throw new FS.ErrnoError(err) } if (!parent.node_ops.symlink) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) } return parent.node_ops.symlink(parent, newname, oldpath) }), rename: (function (old_path, new_path) { var old_dirname = PATH.dirname(old_path); var new_dirname = PATH.dirname(new_path); var old_name = PATH.basename(old_path); var new_name = PATH.basename(new_path); var lookup, old_dir, new_dir; try { lookup = FS.lookupPath(old_path, {parent: true}); old_dir = lookup.node; lookup = FS.lookupPath(new_path, {parent: true}); new_dir = lookup.node; } catch (e) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY) } if (!old_dir || !new_dir) throw new FS.ErrnoError(ERRNO_CODES.ENOENT); if (old_dir.mount !== new_dir.mount) { throw new FS.ErrnoError(ERRNO_CODES.EXDEV) } var old_node = FS.lookupNode(old_dir, old_name); var relative = PATH.relative(old_path, new_dirname); if (relative.charAt(0) !== ".") { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } relative = PATH.relative(new_path, old_dirname); if (relative.charAt(0) !== ".") { throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY) } var new_node; try { new_node = FS.lookupNode(new_dir, new_name); } catch (e) { } if (old_node === new_node) { return } var isdir = FS.isDir(old_node.mode); var err = FS.mayDelete(old_dir, old_name, isdir); if (err) { throw new FS.ErrnoError(err) } err = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name); if (err) { throw new FS.ErrnoError(err) } if (!old_dir.node_ops.rename) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) } if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY) } if (new_dir !== old_dir) { err = FS.nodePermissions(old_dir, "w"); if (err) { throw new FS.ErrnoError(err) } } try { if (FS.trackingDelegate["willMovePath"]) { FS.trackingDelegate["willMovePath"](old_path, new_path); } } catch (e) { console.log("FS.trackingDelegate['willMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message); } FS.hashRemoveNode(old_node); try { old_dir.node_ops.rename(old_node, new_dir, new_name); } catch (e) { throw e } finally { FS.hashAddNode(old_node); } try { if (FS.trackingDelegate["onMovePath"]) FS.trackingDelegate["onMovePath"](old_path, new_path); } catch (e) { console.log("FS.trackingDelegate['onMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message); } }), rmdir: (function (path) { var lookup = FS.lookupPath(path, {parent: true}); var parent = lookup.node; var name = PATH.basename(path); var node = FS.lookupNode(parent, name); var err = FS.mayDelete(parent, name, true); if (err) { throw new FS.ErrnoError(err) } if (!parent.node_ops.rmdir) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) } if (FS.isMountpoint(node)) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY) } try { if (FS.trackingDelegate["willDeletePath"]) { FS.trackingDelegate["willDeletePath"](path); } } catch (e) { console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message); } parent.node_ops.rmdir(parent, name); FS.destroyNode(node); try { if (FS.trackingDelegate["onDeletePath"]) FS.trackingDelegate["onDeletePath"](path); } catch (e) { console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message); } }), readdir: (function (path) { var lookup = FS.lookupPath(path, {follow: true}); var node = lookup.node; if (!node.node_ops.readdir) { throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR) } return node.node_ops.readdir(node) }), unlink: (function (path) { var lookup = FS.lookupPath(path, {parent: true}); var parent = lookup.node; var name = PATH.basename(path); var node = FS.lookupNode(parent, name); var err = FS.mayDelete(parent, name, false); if (err) { if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM; throw new FS.ErrnoError(err) } if (!parent.node_ops.unlink) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) } if (FS.isMountpoint(node)) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY) } try { if (FS.trackingDelegate["willDeletePath"]) { FS.trackingDelegate["willDeletePath"](path); } } catch (e) { console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message); } parent.node_ops.unlink(parent, name); FS.destroyNode(node); try { if (FS.trackingDelegate["onDeletePath"]) FS.trackingDelegate["onDeletePath"](path); } catch (e) { console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message); } }), readlink: (function (path) { var lookup = FS.lookupPath(path); var link = lookup.node; if (!link) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT) } if (!link.node_ops.readlink) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)) }), stat: (function (path, dontFollow) { var lookup = FS.lookupPath(path, {follow: !dontFollow}); var node = lookup.node; if (!node) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT) } if (!node.node_ops.getattr) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) } return node.node_ops.getattr(node) }), lstat: (function (path) { return FS.stat(path, true) }), chmod: (function (path, mode, dontFollow) { var node; if (typeof path === "string") { var lookup = FS.lookupPath(path, {follow: !dontFollow}); node = lookup.node; } else { node = path; } if (!node.node_ops.setattr) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) } node.node_ops.setattr(node, {mode: mode & 4095 | node.mode & ~4095, timestamp: Date.now()}); }), lchmod: (function (path, mode) { FS.chmod(path, mode, true); }), fchmod: (function (fd, mode) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(ERRNO_CODES.EBADF) } FS.chmod(stream.node, mode); }), chown: (function (path, uid, gid, dontFollow) { var node; if (typeof path === "string") { var lookup = FS.lookupPath(path, {follow: !dontFollow}); node = lookup.node; } else { node = path; } if (!node.node_ops.setattr) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) } node.node_ops.setattr(node, {timestamp: Date.now()}); }), lchown: (function (path, uid, gid) { FS.chown(path, uid, gid, true); }), fchown: (function (fd, uid, gid) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(ERRNO_CODES.EBADF) } FS.chown(stream.node, uid, gid); }), truncate: (function (path, len) { if (len < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } var node; if (typeof path === "string") { var lookup = FS.lookupPath(path, {follow: true}); node = lookup.node; } else { node = path; } if (!node.node_ops.setattr) { throw new FS.ErrnoError(ERRNO_CODES.EPERM) } if (FS.isDir(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.EISDIR) } if (!FS.isFile(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } var err = FS.nodePermissions(node, "w"); if (err) { throw new FS.ErrnoError(err) } node.node_ops.setattr(node, {size: len, timestamp: Date.now()}); }), ftruncate: (function (fd, len) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(ERRNO_CODES.EBADF) } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } FS.truncate(stream.node, len); }), utime: (function (path, atime, mtime) { var lookup = FS.lookupPath(path, {follow: true}); var node = lookup.node; node.node_ops.setattr(node, {timestamp: Math.max(atime, mtime)}); }), open: (function (path, flags, mode, fd_start, fd_end) { if (path === "") { throw new FS.ErrnoError(ERRNO_CODES.ENOENT) } flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags; mode = typeof mode === "undefined" ? 438 : mode; if (flags & 64) { mode = mode & 4095 | 32768; } else { mode = 0; } var node; if (typeof path === "object") { node = path; } else { path = PATH.normalize(path); try { var lookup = FS.lookupPath(path, {follow: !(flags & 131072)}); node = lookup.node; } catch (e) { } } var created = false; if (flags & 64) { if (node) { if (flags & 128) { throw new FS.ErrnoError(ERRNO_CODES.EEXIST) } } else { node = FS.mknod(path, mode, 0); created = true; } } if (!node) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT) } if (FS.isChrdev(node.mode)) { flags &= ~512; } if (flags & 65536 && !FS.isDir(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR) } if (!created) { var err = FS.mayOpen(node, flags); if (err) { throw new FS.ErrnoError(err) } } if (flags & 512) { FS.truncate(node, 0); } flags &= ~(128 | 512); var stream = FS.createStream({ node: node, path: FS.getPath(node), flags: flags, seekable: true, position: 0, stream_ops: node.stream_ops, ungotten: [], error: false }, fd_start, fd_end); if (stream.stream_ops.open) { stream.stream_ops.open(stream); } if (Module["logReadFiles"] && !(flags & 1)) { if (!FS.readFiles) FS.readFiles = {}; if (!(path in FS.readFiles)) { FS.readFiles[path] = 1; Module["printErr"]("read file: " + path); } } try { if (FS.trackingDelegate["onOpenFile"]) { var trackingFlags = 0; if ((flags & 2097155) !== 1) { trackingFlags |= FS.tracking.openFlags.READ; } if ((flags & 2097155) !== 0) { trackingFlags |= FS.tracking.openFlags.WRITE; } FS.trackingDelegate["onOpenFile"](path, trackingFlags); } } catch (e) { console.log("FS.trackingDelegate['onOpenFile']('" + path + "', flags) threw an exception: " + e.message); } return stream }), close: (function (stream) { if (stream.getdents) stream.getdents = null; try { if (stream.stream_ops.close) { stream.stream_ops.close(stream); } } catch (e) { throw e } finally { FS.closeStream(stream.fd); } }), llseek: (function (stream, offset, whence) { if (!stream.seekable || !stream.stream_ops.llseek) { throw new FS.ErrnoError(ERRNO_CODES.ESPIPE) } stream.position = stream.stream_ops.llseek(stream, offset, whence); stream.ungotten = []; return stream.position }), read: (function (stream, buffer, offset, length, position) { if (length < 0 || position < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } if ((stream.flags & 2097155) === 1) { throw new FS.ErrnoError(ERRNO_CODES.EBADF) } if (FS.isDir(stream.node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.EISDIR) } if (!stream.stream_ops.read) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } var seeking = true; if (typeof position === "undefined") { position = stream.position; seeking = false; } else if (!stream.seekable) { throw new FS.ErrnoError(ERRNO_CODES.ESPIPE) } var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); if (!seeking) stream.position += bytesRead; return bytesRead }), write: (function (stream, buffer, offset, length, position, canOwn) { if (length < 0 || position < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(ERRNO_CODES.EBADF) } if (FS.isDir(stream.node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.EISDIR) } if (!stream.stream_ops.write) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } if (stream.flags & 1024) { FS.llseek(stream, 0, 2); } var seeking = true; if (typeof position === "undefined") { position = stream.position; seeking = false; } else if (!stream.seekable) { throw new FS.ErrnoError(ERRNO_CODES.ESPIPE) } var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); if (!seeking) stream.position += bytesWritten; try { if (stream.path && FS.trackingDelegate["onWriteToFile"]) FS.trackingDelegate["onWriteToFile"](stream.path); } catch (e) { console.log("FS.trackingDelegate['onWriteToFile']('" + path + "') threw an exception: " + e.message); } return bytesWritten }), allocate: (function (stream, offset, length) { if (offset < 0 || length <= 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL) } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(ERRNO_CODES.EBADF) } if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV) } if (!stream.stream_ops.allocate) { throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP) } stream.stream_ops.allocate(stream, offset, length); }), mmap: (function (stream, buffer, offset, length, position, prot, flags) { if ((stream.flags & 2097155) === 1) { throw new FS.ErrnoError(ERRNO_CODES.EACCES) } if (!stream.stream_ops.mmap) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV) } return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags) }), msync: (function (stream, buffer, offset, length, mmapFlags) { if (!stream || !stream.stream_ops.msync) { return 0 } return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags) }), munmap: (function (stream) { return 0 }), ioctl: (function (stream, cmd, arg) { if (!stream.stream_ops.ioctl) { throw new FS.ErrnoError(ERRNO_CODES.ENOTTY) } return stream.stream_ops.ioctl(stream, cmd, arg) }), readFile: (function (path, opts) { opts = opts || {}; opts.flags = opts.flags || "r"; opts.encoding = opts.encoding || "binary"; if (opts.encoding !== "utf8" && opts.encoding !== "binary") { throw new Error('Invalid encoding type "' + opts.encoding + '"') } var ret; var stream = FS.open(path, opts.flags); var stat = FS.stat(path); var length = stat.size; var buf = new Uint8Array(length); FS.read(stream, buf, 0, length, 0); if (opts.encoding === "utf8") { ret = UTF8ArrayToString(buf, 0); } else if (opts.encoding === "binary") { ret = buf; } FS.close(stream); return ret }), writeFile: (function (path, data, opts) { opts = opts || {}; opts.flags = opts.flags || "w"; opts.encoding = opts.encoding || "utf8"; if (opts.encoding !== "utf8" && opts.encoding !== "binary") { throw new Error('Invalid encoding type "' + opts.encoding + '"') } var stream = FS.open(path, opts.flags, opts.mode); if (opts.encoding === "utf8") { var buf = new Uint8Array(lengthBytesUTF8(data) + 1); var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); FS.write(stream, buf, 0, actualNumBytes, 0, opts.canOwn); } else if (opts.encoding === "binary") { FS.write(stream, data, 0, data.length, 0, opts.canOwn); } FS.close(stream); }), cwd: (function () { return FS.currentPath }), chdir: (function (path) { var lookup = FS.lookupPath(path, {follow: true}); if (!FS.isDir(lookup.node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR) } var err = FS.nodePermissions(lookup.node, "x"); if (err) { throw new FS.ErrnoError(err) } FS.currentPath = lookup.path; }), createDefaultDirectories: (function () { FS.mkdir("/tmp"); FS.mkdir("/home"); FS.mkdir("/home/web_user"); }), createDefaultDevices: (function () { FS.mkdir("/dev"); FS.registerDevice(FS.makedev(1, 3), { read: (function () { return 0 }), write: (function (stream, buffer, offset, length, pos) { return length }) }); FS.mkdev("/dev/null", FS.makedev(1, 3)); TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); FS.mkdev("/dev/tty", FS.makedev(5, 0)); FS.mkdev("/dev/tty1", FS.makedev(6, 0)); var random_device; if (typeof crypto !== "undefined") { var randomBuffer = new Uint8Array(1); random_device = (function () { crypto.getRandomValues(randomBuffer); return randomBuffer[0] }); } else { random_device = (function () { return Math.random() * 256 | 0 }); } FS.createDevice("/dev", "random", random_device); FS.createDevice("/dev", "urandom", random_device); FS.mkdir("/dev/shm"); FS.mkdir("/dev/shm/tmp"); }), createSpecialDirectories: (function () { FS.mkdir("/proc"); FS.mkdir("/proc/self"); FS.mkdir("/proc/self/fd"); FS.mount({ mount: (function () { var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73); node.node_ops = { lookup: (function (parent, name) { var fd = +name; var stream = FS.getStream(fd); if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); var ret = { parent: null, mount: {mountpoint: "fake"}, node_ops: { readlink: (function () { return stream.path }) } }; ret.parent = ret; return ret }) }; return node }) }, {}, "/proc/self/fd"); }), createStandardStreams: (function () { if (Module["stdin"]) { FS.createDevice("/dev", "stdin", Module["stdin"]); } else { FS.symlink("/dev/tty", "/dev/stdin"); } if (Module["stdout"]) { FS.createDevice("/dev", "stdout", null, Module["stdout"]); } else { FS.symlink("/dev/tty", "/dev/stdout"); } if (Module["stderr"]) { FS.createDevice("/dev", "stderr", null, Module["stderr"]); } else { FS.symlink("/dev/tty1", "/dev/stderr"); } var stdin = FS.open("/dev/stdin", "r"); assert(stdin.fd === 0, "invalid handle for stdin (" + stdin.fd + ")"); var stdout = FS.open("/dev/stdout", "w"); assert(stdout.fd === 1, "invalid handle for stdout (" + stdout.fd + ")"); var stderr = FS.open("/dev/stderr", "w"); assert(stderr.fd === 2, "invalid handle for stderr (" + stderr.fd + ")"); }), ensureErrnoError: (function () { if (FS.ErrnoError) return; FS.ErrnoError = function ErrnoError(errno, node) { this.node = node; this.setErrno = (function (errno) { this.errno = errno; for (var key in ERRNO_CODES) { if (ERRNO_CODES[key] === errno) { this.code = key; break } } }); this.setErrno(errno); this.message = ERRNO_MESSAGES[errno]; }; FS.ErrnoError.prototype = new Error; FS.ErrnoError.prototype.constructor = FS.ErrnoError; [ERRNO_CODES.ENOENT].forEach((function (code) { FS.genericErrors[code] = new FS.ErrnoError(code); FS.genericErrors[code].stack = "<generic error, no stack>"; })); }), staticInit: (function () { FS.ensureErrnoError(); FS.nameTable = new Array(4096); FS.mount(MEMFS, {}, "/"); FS.createDefaultDirectories(); FS.createDefaultDevices(); FS.createSpecialDirectories(); FS.filesystems = {"MEMFS": MEMFS, "IDBFS": IDBFS, "NODEFS": {}, "WORKERFS": WORKERFS}; }), init: (function (input, output, error) { assert(!FS.init.initialized, "FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)"); FS.init.initialized = true; FS.ensureErrnoError(); Module["stdin"] = input || Module["stdin"]; Module["stdout"] = output || Module["stdout"]; Module["stderr"] = error || Module["stderr"]; FS.createStandardStreams(); }), quit: (function () { FS.init.initialized = false; var fflush = Module["_fflush"]; if (fflush) fflush(0); for (var i = 0; i < FS.streams.length; i++) { var stream = FS.streams[i]; if (!stream) { continue } FS.close(stream); } }), getMode: (function (canRead, canWrite) { var mode = 0; if (canRead) mode |= 292 | 73; if (canWrite) mode |= 146; return mode }), joinPath: (function (parts, forceRelative) { var path = PATH.join.apply(null, parts); if (forceRelative && path[0] == "/") path = path.substr(1); return path }), absolutePath: (function (relative, base) { return PATH.resolve(base, relative) }), standardizePath: (function (path) { return PATH.normalize(path) }), findObject: (function (path, dontResolveLastLink) { var ret = FS.analyzePath(path, dontResolveLastLink); if (ret.exists) { return ret.object } else { ___setErrNo(ret.error); return null } }), analyzePath: (function (path, dontResolveLastLink) { try { var lookup = FS.lookupPath(path, {follow: !dontResolveLastLink}); path = lookup.path; } catch (e) { } var ret = { isRoot: false, exists: false, error: 0, name: null, path: null, object: null, parentExists: false, parentPath: null, parentObject: null }; try { var lookup = FS.lookupPath(path, {parent: true}); ret.parentExists = true; ret.parentPath = lookup.path; ret.parentObject = lookup.node; ret.name = PATH.basename(path); lookup = FS.lookupPath(path, {follow: !dontResolveLastLink}); ret.exists = true; ret.path = lookup.path; ret.object = lookup.node; ret.name = lookup.node.name; ret.isRoot = lookup.path === "/"; } catch (e) { ret.error = e.errno; } return ret }), createFolder: (function (parent, name, canRead, canWrite) { var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name); var mode = FS.getMode(canRead, canWrite); return FS.mkdir(path, mode) }), createPath: (function (parent, path, canRead, canWrite) { parent = typeof parent === "string" ? parent : FS.getPath(parent); var parts = path.split("/").reverse(); while (parts.length) { var part = parts.pop(); if (!part) continue; var current = PATH.join2(parent, part); try { FS.mkdir(current); } catch (e) { } parent = current; } return current }), createFile: (function (parent, name, properties, canRead, canWrite) { var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name); var mode = FS.getMode(canRead, canWrite); return FS.create(path, mode) }), createDataFile: (function (parent, name, data, canRead, canWrite, canOwn) { var path = name ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) : parent; var mode = FS.getMode(canRead, canWrite); var node = FS.create(path, mode); if (data) { if (typeof data === "string") { var arr = new Array(data.length); for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); data = arr; } FS.chmod(node, mode | 146); var stream = FS.open(node, "w"); FS.write(stream, data, 0, data.length, 0, canOwn); FS.close(stream); FS.chmod(node, mode); } return node }), createDevice: (function (parent, name, input, output) { var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name); var mode = FS.getMode(!!input, !!output); if (!FS.createDevice.major) FS.createDevice.major = 64; var dev = FS.makedev(FS.createDevice.major++, 0); FS.registerDevice(dev, { open: (function (stream) { stream.seekable = false; }), close: (function (stream) { if (output && output.buffer && output.buffer.length) { output(10); } }), read: (function (stream, buffer, offset, length, pos) { var bytesRead = 0; for (var i = 0; i < length; i++) { var result; try { result = input(); } catch (e) { throw new FS.ErrnoError(ERRNO_CODES.EIO) } if (result === undefined && bytesRead === 0) { throw new FS.ErrnoError(ERRNO_CODES.EAGAIN) } if (result === null || result === undefined) break; bytesRead++; buffer[offset + i] = result; } if (bytesRead) { stream.node.timestamp = Date.now(); } return bytesRead }), write: (function (stream, buffer, offset, length, pos) { for (var i = 0; i < length; i++) { try { output(buffer[offset + i]); } catch (e) { throw new FS.ErrnoError(ERRNO_CODES.EIO) } } if (length) { stream.node.timestamp = Date.now(); } return i }) }); return FS.mkdev(path, mode, dev) }), createLink: (function (parent, name, target, canRead, canWrite) { var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name); return FS.symlink(target, path) }), forceLoadFile: (function (obj) { if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; var success = true; if (typeof XMLHttpRequest !== "undefined") { throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.") } else if (Module["read"]) { try { obj.contents = intArrayFromString(Module["read"](obj.url), true); obj.usedBytes = obj.contents.length; } catch (e) { success = false; } } else { throw new Error("Cannot load without read() or XMLHttpRequest.") } if (!success) ___setErrNo(ERRNO_CODES.EIO); return success }), createLazyFile: (function (parent, name, url, canRead, canWrite) { function LazyUint8Array() { this.lengthKnown = false; this.chunks = []; } LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) { if (idx > this.length - 1 || idx < 0) { return undefined } var chunkOffset = idx % this.chunkSize; var chunkNum = idx / this.chunkSize | 0; return this.getter(chunkNum)[chunkOffset] }; LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { this.getter = getter; }; LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { var xhr = new XMLHttpRequest; xhr.open("HEAD", url, false); xhr.send(null); if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); var datalength = Number(xhr.getResponseHeader("Content-length")); var header; var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; var chunkSize = 1024 * 1024; if (!hasByteServing) chunkSize = datalength; var doXHR = (function (from, to) { if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); if (to > datalength - 1) throw new Error("only " + datalength + " bytes available! programmer error!"); var xhr = new XMLHttpRequest; xhr.open("GET", url, false); if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); if (typeof Uint8Array != "undefined") xhr.responseType = "arraybuffer"; if (xhr.overrideMimeType) { xhr.overrideMimeType("text/plain; charset=x-user-defined"); } xhr.send(null); if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); if (xhr.response !== undefined) { return new Uint8Array(xhr.response || []) } else { return intArrayFromString(xhr.responseText || "", true) } }); var lazyArray = this; lazyArray.setDataGetter((function (chunkNum) { var start = chunkNum * chunkSize; var end = (chunkNum + 1) * chunkSize - 1; end = Math.min(end, datalength - 1); if (typeof lazyArray.chunks[chunkNum] === "undefined") { lazyArray.chunks[chunkNum] = doXHR(start, end); } if (typeof lazyArray.chunks[chunkNum] === "undefined") throw new Error("doXHR failed!"); return lazyArray.chunks[chunkNum] })); this._length = datalength; this._chunkSize = chunkSize; this.lengthKnown = true; }; if (typeof XMLHttpRequest !== "undefined") { if (!ENVIRONMENT_IS_WORKER) throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc"; var lazyArray = new LazyUint8Array; Object.defineProperty(lazyArray, "length", { get: (function () { if (!this.lengthKnown) { this.cacheLength(); } return this._length }) }); Object.defineProperty(lazyArray, "chunkSize", { get: (function () { if (!this.lengthKnown) { this.cacheLength(); } return this._chunkSize }) }); var properties = {isDevice: false, contents: lazyArray}; } else { var properties = {isDevice: false, url: url}; } var node = FS.createFile(parent, name, properties, canRead, canWrite); if (properties.contents) { node.contents = properties.contents; } else if (properties.url) { node.contents = null; node.url = properties.url; } Object.defineProperty(node, "usedBytes", { get: (function () { return this.contents.length }) }); var stream_ops = {}; var keys = Object.keys(node.stream_ops); keys.forEach((function (key) { var fn = node.stream_ops[key]; stream_ops[key] = function forceLoadLazyFile() { if (!FS.forceLoadFile(node)) { throw new FS.ErrnoError(ERRNO_CODES.EIO) } return fn.apply(null, arguments) }; })); stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { if (!FS.forceLoadFile(node)) { throw new FS.ErrnoError(ERRNO_CODES.EIO) } var contents = stream.node.contents; if (position >= contents.length) return 0; var size = Math.min(contents.length - position, length); assert(size >= 0); if (contents.slice) { for (var i = 0; i < size; i++) { buffer[offset + i] = contents[position + i]; } } else { for (var i = 0; i < size; i++) { buffer[offset + i] = contents.get(position + i); } } return size }; node.stream_ops = stream_ops; return node }), createPreloadedFile: (function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { Browser.init(); var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent; function processData(byteArray) { function finish(byteArray) { if (preFinish) preFinish(); if (!dontCreateFile) { FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); } if (onload) onload(); removeRunDependency(); } var handled = false; Module["preloadPlugins"].forEach((function (plugin) { if (handled) return; if (plugin["canHandle"](fullname)) { plugin["handle"](byteArray, fullname, finish, (function () { if (onerror) onerror(); removeRunDependency(); })); handled = true; } })); if (!handled) finish(byteArray); } addRunDependency(); if (typeof url == "string") { Browser.asyncLoad(url, (function (byteArray) { processData(byteArray); }), onerror); } else { processData(url); } }), indexedDB: (function () { return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB }), DB_NAME: (function () { return "EM_FS_" + window.location.pathname }), DB_VERSION: 20, DB_STORE_NAME: "FILE_DATA", saveFilesToDB: (function (paths, onload, onerror) { onload = onload || (function () { }); onerror = onerror || (function () { }); var indexedDB = FS.indexedDB(); try { var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); } catch (e) { return onerror(e) } openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { console.log("creating db"); var db = openRequest.result; db.createObjectStore(FS.DB_STORE_NAME); }; openRequest.onsuccess = function openRequest_onsuccess() { var db = openRequest.result; var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite"); var files = transaction.objectStore(FS.DB_STORE_NAME); var ok = 0, fail = 0, total = paths.length; function finish() { if (fail == 0) onload(); else onerror(); } paths.forEach((function (path) { var putRequest = files.put(FS.analyzePath(path).object.contents, path); putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish(); }; putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish(); }; })); transaction.onerror = onerror; }; openRequest.onerror = onerror; }), loadFilesFromDB: (function (paths, onload, onerror) { onload = onload || (function () { }); onerror = onerror || (function () { }); var indexedDB = FS.indexedDB(); try { var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); } catch (e) { return onerror(e) } openRequest.onupgradeneeded = onerror; openRequest.onsuccess = function openRequest_onsuccess() { var db = openRequest.result; try { var transaction = db.transaction([FS.DB_STORE_NAME], "readonly"); } catch (e) { onerror(e); return } var files = transaction.objectStore(FS.DB_STORE_NAME); var ok = 0, fail = 0, total = paths.length; function finish() { if (fail == 0) onload(); else onerror(); } paths.forEach((function (path) { var getRequest = files.get(path); getRequest.onsuccess = function getRequest_onsuccess() { if (FS.analyzePath(path).exists) { FS.unlink(path); } FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); ok++; if (ok + fail == total) finish(); }; getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish(); }; })); transaction.onerror = onerror; }; openRequest.onerror = onerror; }) }; var PATH = { splitPath: (function (filename) { var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; return splitPathRe.exec(filename).slice(1) }), normalizeArray: (function (parts, allowAboveRoot) { var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === ".") { parts.splice(i, 1); } else if (last === "..") { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } if (allowAboveRoot) { for (; up--; up) { parts.unshift(".."); } } return parts }), normalize: (function (path) { var isAbsolute = path.charAt(0) === "/", trailingSlash = path.substr(-1) === "/"; path = PATH.normalizeArray(path.split("/").filter((function (p) { return !!p })), !isAbsolute).join("/"); if (!path && !isAbsolute) { path = "."; } if (path && trailingSlash) { path += "/"; } return (isAbsolute ? "/" : "") + path }), dirname: (function (path) { var result = PATH.splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { return "." } if (dir) { dir = dir.substr(0, dir.length - 1); } return root + dir }), basename: (function (path) { if (path === "/") return "/"; var lastSlash = path.lastIndexOf("/"); if (lastSlash === -1) return path; return path.substr(lastSlash + 1) }), extname: (function (path) { return PATH.splitPath(path)[3] }), join: (function () { var paths = Array.prototype.slice.call(arguments, 0); return PATH.normalize(paths.join("/")) }), join2: (function (l, r) { return PATH.normalize(l + "/" + r) }), resolve: (function () { var resolvedPath = "", resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = i >= 0 ? arguments[i] : FS.cwd(); if (typeof path !== "string") { throw new TypeError("Arguments to path.resolve must be strings") } else if (!path) { return "" } resolvedPath = path + "/" + resolvedPath; resolvedAbsolute = path.charAt(0) === "/"; } resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter((function (p) { return !!p })), !resolvedAbsolute).join("/"); return (resolvedAbsolute ? "/" : "") + resolvedPath || "." }), relative: (function (from, to) { from = PATH.resolve(from).substr(1); to = PATH.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== "") break } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== "") break } if (start > end) return []; return arr.slice(start, end - start + 1) } var fromParts = trim(from.split("/")); var toParts = trim(to.split("/")); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push(".."); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join("/") }) }; function _emscripten_set_main_loop_timing(mode, value) { Browser.mainLoop.timingMode = mode; Browser.mainLoop.timingValue = value; if (!Browser.mainLoop.func) { return 1 } if (mode == 0) { Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setTimeout() { setTimeout(Browser.mainLoop.runner, value); }; Browser.mainLoop.method = "timeout"; } else if (mode == 1) { Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_rAF() { Browser.requestAnimationFrame(Browser.mainLoop.runner); }; Browser.mainLoop.method = "rAF"; } else if (mode == 2) { if (!window["setImmediate"]) { var setImmediates = []; var emscriptenMainLoopMessageId = "__emcc"; function Browser_setImmediate_messageHandler(event) { if (event.source === window && event.data === emscriptenMainLoopMessageId) { event.stopPropagation(); setImmediates.shift()(); } } window.addEventListener("message", Browser_setImmediate_messageHandler, true); window["setImmediate"] = function Browser_emulated_setImmediate(func) { setImmediates.push(func); window.postMessage(emscriptenMainLoopMessageId, "*"); }; } Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setImmediate() { window["setImmediate"](Browser.mainLoop.runner); }; Browser.mainLoop.method = "immediate"; } return 0 } function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop, arg, noSetTiming) { Module["noExitRuntime"] = true; assert(!Browser.mainLoop.func, "emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."); Browser.mainLoop.func = func; Browser.mainLoop.arg = arg; var thisMainLoopId = Browser.mainLoop.currentlyRunningMainloop; Browser.mainLoop.runner = function Browser_mainLoop_runner() { if (ABORT) return; if (Browser.mainLoop.queue.length > 0) { var start = Date.now(); var blocker = Browser.mainLoop.queue.shift(); blocker.func(blocker.arg); if (Browser.mainLoop.remainingBlockers) { var remaining = Browser.mainLoop.remainingBlockers; var next = remaining % 1 == 0 ? remaining - 1 : Math.floor(remaining); if (blocker.counted) { Browser.mainLoop.remainingBlockers = next; } else { next = next + .5; Browser.mainLoop.remainingBlockers = (8 * remaining + next) / 9; } } console.log('main loop blocker "' + blocker.name + '" took ' + (Date.now() - start) + " ms"); Browser.mainLoop.updateStatus(); setTimeout(Browser.mainLoop.runner, 0); return } if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return; Browser.mainLoop.currentFrameNumber = Browser.mainLoop.currentFrameNumber + 1 | 0; if (Browser.mainLoop.timingMode == 1 && Browser.mainLoop.timingValue > 1 && Browser.mainLoop.currentFrameNumber % Browser.mainLoop.timingValue != 0) { Browser.mainLoop.scheduler(); return } if (Browser.mainLoop.method === "timeout" && Module.ctx) { Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"); Browser.mainLoop.method = ""; } Browser.mainLoop.runIter((function () { if (typeof arg !== "undefined") { Runtime.dynCall("vi", func, [arg]); } else { Runtime.dynCall("v", func); } })); if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return; if (typeof SDL === "object" && SDL.audio && SDL.audio.queueNewAudioData) SDL.audio.queueNewAudioData(); Browser.mainLoop.scheduler(); }; if (!noSetTiming) { if (fps && fps > 0) _emscripten_set_main_loop_timing(0, 1e3 / fps); else _emscripten_set_main_loop_timing(1, 1); Browser.mainLoop.scheduler(); } if (simulateInfiniteLoop) { throw "SimulateInfiniteLoop" } } var Browser = { mainLoop: { scheduler: null, method: "", currentlyRunningMainloop: 0, func: null, arg: 0, timingMode: 0, timingValue: 0, currentFrameNumber: 0, queue: [], pause: (function () { Browser.mainLoop.scheduler = null; Browser.mainLoop.currentlyRunningMainloop++; }), resume: (function () { Browser.mainLoop.currentlyRunningMainloop++; var timingMode = Browser.mainLoop.timingMode; var timingValue = Browser.mainLoop.timingValue; var func = Browser.mainLoop.func; Browser.mainLoop.func = null; _emscripten_set_main_loop(func, 0, false, Browser.mainLoop.arg, true); _emscripten_set_main_loop_timing(timingMode, timingValue); Browser.mainLoop.scheduler(); }), updateStatus: (function () { if (Module["setStatus"]) { var message = Module["statusMessage"] || "Please wait..."; var remaining = Browser.mainLoop.remainingBlockers; var expected = Browser.mainLoop.expectedBlockers; if (remaining) { if (remaining < expected) { Module["setStatus"](message + " (" + (expected - remaining) + "/" + expected + ")"); } else { Module["setStatus"](message); } } else { Module["setStatus"](""); } } }), runIter: (function (func) { if (ABORT) return; if (Module["preMainLoop"]) { var preRet = Module["preMainLoop"](); if (preRet === false) { return } } try { func(); } catch (e) { if (e instanceof ExitStatus) { return } else { if (e && typeof e === "object" && e.stack) Module.printErr("exception thrown: " + [e, e.stack]); throw e } } if (Module["postMainLoop"]) Module["postMainLoop"](); }) }, isFullScreen: false, pointerLock: false, moduleContextCreatedCallbacks: [], workers: [], init: (function () { if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; if (Browser.initted) return; Browser.initted = true; try { new Blob; Browser.hasBlobConstructor = true; } catch (e) { Browser.hasBlobConstructor = false; console.log("warning: no blob constructor, cannot create blobs with mimetypes"); } Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : !Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null; Browser.URLObject = typeof window != "undefined" ? window.URL ? window.URL : window.webkitURL : undefined; if (!Module.noImageDecoding && typeof Browser.URLObject === "undefined") { console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."); Module.noImageDecoding = true; } var imagePlugin = {}; imagePlugin["canHandle"] = function imagePlugin_canHandle(name) { return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name) }; imagePlugin["handle"] = function imagePlugin_handle(byteArray, name, onload, onerror) { var b = null; if (Browser.hasBlobConstructor) { try { b = new Blob([byteArray], {type: Browser.getMimetype(name)}); if (b.size !== byteArray.length) { b = new Blob([(new Uint8Array(byteArray)).buffer], {type: Browser.getMimetype(name)}); } } catch (e) { Runtime.warnOnce("Blob constructor present but fails: " + e + "; falling back to blob builder"); } } if (!b) { var bb = new Browser.BlobBuilder; bb.append((new Uint8Array(byteArray)).buffer); b = bb.getBlob(); } var url = Browser.URLObject.createObjectURL(b); var img = new Image; img.onload = function img_onload() { assert(img.complete, "Image " + name + " could not be decoded"); var canvas = document.createElement("canvas"); canvas.width = img.width; canvas.height = img.height; var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0); Module["preloadedImages"][name] = canvas; Browser.URLObject.revokeObjectURL(url); if (onload) onload(byteArray); }; img.onerror = function img_onerror(event) { console.log("Image " + url + " could not be decoded"); if (onerror) onerror(); }; img.src = url; }; Module["preloadPlugins"].push(imagePlugin); var audioPlugin = {}; audioPlugin["canHandle"] = function audioPlugin_canHandle(name) { return !Module.noAudioDecoding && name.substr(-4) in {".ogg": 1, ".wav": 1, ".mp3": 1} }; audioPlugin["handle"] = function audioPlugin_handle(byteArray, name, onload, onerror) { var done = false; function finish(audio) { if (done) return; done = true; Module["preloadedAudios"][name] = audio; if (onload) onload(byteArray); } function fail() { if (done) return; done = true; Module["preloadedAudios"][name] = new Audio; if (onerror) onerror(); } if (Browser.hasBlobConstructor) { try { var b = new Blob([byteArray], {type: Browser.getMimetype(name)}); } catch (e) { return fail() } var url = Browser.URLObject.createObjectURL(b); var audio = new Audio; audio.addEventListener("canplaythrough", (function () { finish(audio); }), false); audio.onerror = function audio_onerror(event) { if (done) return; console.log("warning: browser could not fully decode audio " + name + ", trying slower base64 approach"); function encode64(data) { var BASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var PAD = "="; var ret = ""; var leftchar = 0; var leftbits = 0; for (var i = 0; i < data.length; i++) { leftchar = leftchar << 8 | data[i]; leftbits += 8; while (leftbits >= 6) { var curr = leftchar >> leftbits - 6 & 63; leftbits -= 6; ret += BASE[curr]; } } if (leftbits == 2) { ret += BASE[(leftchar & 3) << 4]; ret += PAD + PAD; } else if (leftbits == 4) { ret += BASE[(leftchar & 15) << 2]; ret += PAD; } return ret } audio.src = "data:audio/x-" + name.substr(-3) + ";base64," + encode64(byteArray); finish(audio); }; audio.src = url; Browser.safeSetTimeout((function () { finish(audio); }), 1e4); } else { return fail() } }; Module["preloadPlugins"].push(audioPlugin); var canvas = Module["canvas"]; function pointerLockChange() { Browser.pointerLock = document["pointerLockElement"] === canvas || document["mozPointerLockElement"] === canvas || document["webkitPointerLockElement"] === canvas || document["msPointerLockElement"] === canvas; } if (canvas) { canvas.requestPointerLock = canvas["requestPointerLock"] || canvas["mozRequestPointerLock"] || canvas["webkitRequestPointerLock"] || canvas["msRequestPointerLock"] || (function () { }); canvas.exitPointerLock = document["exitPointerLock"] || document["mozExitPointerLock"] || document["webkitExitPointerLock"] || document["msExitPointerLock"] || (function () { }); canvas.exitPointerLock = canvas.exitPointerLock.bind(document); document.addEventListener("pointerlockchange", pointerLockChange, false); document.addEventListener("mozpointerlockchange", pointerLockChange, false); document.addEventListener("webkitpointerlockchange", pointerLockChange, false); document.addEventListener("mspointerlockchange", pointerLockChange, false); if (Module["elementPointerLock"]) { canvas.addEventListener("click", (function (ev) { if (!Browser.pointerLock && canvas.requestPointerLock) { canvas.requestPointerLock(); ev.preventDefault(); } }), false); } } }), createContext: (function (canvas, useWebGL, setInModule, webGLContextAttributes) { if (useWebGL && Module.ctx && canvas == Module.canvas) return Module.ctx; var ctx; var contextHandle; if (useWebGL) { var contextAttributes = {antialias: false, alpha: false}; if (webGLContextAttributes) { for (var attribute in webGLContextAttributes) { contextAttributes[attribute] = webGLContextAttributes[attribute]; } } contextHandle = GL.createContext(canvas, contextAttributes); if (contextHandle) { ctx = GL.getContext(contextHandle).GLctx; } canvas.style.backgroundColor = "black"; } else { ctx = canvas.getContext("2d"); } if (!ctx) return null; if (setInModule) { if (!useWebGL) assert(typeof GLctx === "undefined", "cannot set in module if GLctx is used, but we are a non-GL context that would replace it"); Module.ctx = ctx; if (useWebGL) GL.makeContextCurrent(contextHandle); Module.useWebGL = useWebGL; Browser.moduleContextCreatedCallbacks.forEach((function (callback) { callback(); })); Browser.init(); } return ctx }), destroyContext: (function (canvas, useWebGL, setInModule) { }), fullScreenHandlersInstalled: false, lockPointer: undefined, resizeCanvas: undefined, requestFullScreen: (function (lockPointer, resizeCanvas, vrDevice) { Browser.lockPointer = lockPointer; Browser.resizeCanvas = resizeCanvas; Browser.vrDevice = vrDevice; if (typeof Browser.lockPointer === "undefined") Browser.lockPointer = true; if (typeof Browser.resizeCanvas === "undefined") Browser.resizeCanvas = false; if (typeof Browser.vrDevice === "undefined") Browser.vrDevice = null; var canvas = Module["canvas"]; function fullScreenChange() { Browser.isFullScreen = false; var canvasContainer = canvas.parentNode; if ((document["webkitFullScreenElement"] || document["webkitFullscreenElement"] || document["mozFullScreenElement"] || document["mozFullscreenElement"] || document["fullScreenElement"] || document["fullscreenElement"] || document["msFullScreenElement"] || document["msFullscreenElement"] || document["webkitCurrentFullScreenElement"]) === canvasContainer) { canvas.cancelFullScreen = document["cancelFullScreen"] || document["mozCancelFullScreen"] || document["webkitCancelFullScreen"] || document["msExitFullscreen"] || document["exitFullscreen"] || (function () { }); canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document); if (Browser.lockPointer) canvas.requestPointerLock(); Browser.isFullScreen = true; if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize(); } else { canvasContainer.parentNode.insertBefore(canvas, canvasContainer); canvasContainer.parentNode.removeChild(canvasContainer); if (Browser.resizeCanvas) Browser.setWindowedCanvasSize(); } if (Module["onFullScreen"]) Module["onFullScreen"](Browser.isFullScreen); Browser.updateCanvasDimensions(canvas); } if (!Browser.fullScreenHandlersInstalled) { Browser.fullScreenHandlersInstalled = true; document.addEventListener("fullscreenchange", fullScreenChange, false); document.addEventListener("mozfullscreenchange", fullScreenChange, false); document.addEventListener("webkitfullscreenchange", fullScreenChange, false); document.addEventListener("MSFullscreenChange", fullScreenChange, false); } var canvasContainer = document.createElement("div"); canvas.parentNode.insertBefore(canvasContainer, canvas); canvasContainer.appendChild(canvas); canvasContainer.requestFullScreen = canvasContainer["requestFullScreen"] || canvasContainer["mozRequestFullScreen"] || canvasContainer["msRequestFullscreen"] || (canvasContainer["webkitRequestFullScreen"] ? (function () { canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]); }) : null); if (vrDevice) { canvasContainer.requestFullScreen({vrDisplay: vrDevice}); } else { canvasContainer.requestFullScreen(); } }), nextRAF: 0, fakeRequestAnimationFrame: (function (func) { var now = Date.now(); if (Browser.nextRAF === 0) { Browser.nextRAF = now + 1e3 / 60; } else { while (now + 2 >= Browser.nextRAF) { Browser.nextRAF += 1e3 / 60; } } var delay = Math.max(Browser.nextRAF - now, 0); setTimeout(func, delay); }), requestAnimationFrame: function requestAnimationFrame(func) { if (typeof window === "undefined") { Browser.fakeRequestAnimationFrame(func); } else { if (!window.requestAnimationFrame) { window.requestAnimationFrame = window["requestAnimationFrame"] || window["mozRequestAnimationFrame"] || window["webkitRequestAnimationFrame"] || window["msRequestAnimationFrame"] || window["oRequestAnimationFrame"] || Browser.fakeRequestAnimationFrame; } window.requestAnimationFrame(func); } }, safeCallback: (function (func) { return (function () { if (!ABORT) return func.apply(null, arguments) }) }), allowAsyncCallbacks: true, queuedAsyncCallbacks: [], pauseAsyncCallbacks: (function () { Browser.allowAsyncCallbacks = false; }), resumeAsyncCallbacks: (function () { Browser.allowAsyncCallbacks = true; if (Browser.queuedAsyncCallbacks.length > 0) { var callbacks = Browser.queuedAsyncCallbacks; Browser.queuedAsyncCallbacks = []; callbacks.forEach((function (func) { func(); })); } }), safeRequestAnimationFrame: (function (func) { return Browser.requestAnimationFrame((function () { if (ABORT) return; if (Browser.allowAsyncCallbacks) { func(); } else { Browser.queuedAsyncCallbacks.push(func); } })) }), safeSetTimeout: (function (func, timeout) { Module["noExitRuntime"] = true; return setTimeout((function () { if (ABORT) return; if (Browser.allowAsyncCallbacks) { func(); } else { Browser.queuedAsyncCallbacks.push(func); } }), timeout) }), safeSetInterval: (function (func, timeout) { Module["noExitRuntime"] = true; return setInterval((function () { if (ABORT) return; if (Browser.allowAsyncCallbacks) { func(); } }), timeout) }), getMimetype: (function (name) { return { "jpg": "image/jpeg", "jpeg": "image/jpeg", "png": "image/png", "bmp": "image/bmp", "ogg": "audio/ogg", "wav": "audio/wav", "mp3": "audio/mpeg" }[name.substr(name.lastIndexOf(".") + 1)] }), getUserMedia: (function (func) { if (!window.getUserMedia) { window.getUserMedia = navigator["getUserMedia"] || navigator["mozGetUserMedia"]; } window.getUserMedia(func); }), getMovementX: (function (event) { return event["movementX"] || event["mozMovementX"] || event["webkitMovementX"] || 0 }), getMovementY: (function (event) { return event["movementY"] || event["mozMovementY"] || event["webkitMovementY"] || 0 }), getMouseWheelDelta: (function (event) { var delta = 0; switch (event.type) { case"DOMMouseScroll": delta = event.detail; break; case"mousewheel": delta = event.wheelDelta; break; case"wheel": delta = event["deltaY"]; break; default: throw "unrecognized mouse wheel event: " + event.type } return delta }), mouseX: 0, mouseY: 0, mouseMovementX: 0, mouseMovementY: 0, touches: {}, lastTouches: {}, calculateMouseEvent: (function (event) { if (Browser.pointerLock) { if (event.type != "mousemove" && "mozMovementX" in event) { Browser.mouseMovementX = Browser.mouseMovementY = 0; } else { Browser.mouseMovementX = Browser.getMovementX(event); Browser.mouseMovementY = Browser.getMovementY(event); } if (typeof SDL != "undefined") { Browser.mouseX = SDL.mouseX + Browser.mouseMovementX; Browser.mouseY = SDL.mouseY + Browser.mouseMovementY; } else { Browser.mouseX += Browser.mouseMovementX; Browser.mouseY += Browser.mouseMovementY; } } else { var rect = Module["canvas"].getBoundingClientRect(); var cw = Module["canvas"].width; var ch = Module["canvas"].height; var scrollX = typeof window.scrollX !== "undefined" ? window.scrollX : window.pageXOffset; var scrollY = typeof window.scrollY !== "undefined" ? window.scrollY : window.pageYOffset; if (event.type === "touchstart" || event.type === "touchend" || event.type === "touchmove") { var touch = event.touch; if (touch === undefined) { return } var adjustedX = touch.pageX - (scrollX + rect.left); var adjustedY = touch.pageY - (scrollY + rect.top); adjustedX = adjustedX * (cw / rect.width); adjustedY = adjustedY * (ch / rect.height); var coords = {x: adjustedX, y: adjustedY}; if (event.type === "touchstart") { Browser.lastTouches[touch.identifier] = coords; Browser.touches[touch.identifier] = coords; } else if (event.type === "touchend" || event.type === "touchmove") { var last = Browser.touches[touch.identifier]; if (!last) last = coords; Browser.lastTouches[touch.identifier] = last; Browser.touches[touch.identifier] = coords; } return } var x = event.pageX - (scrollX + rect.left); var y = event.pageY - (scrollY + rect.top); x = x * (cw / rect.width); y = y * (ch / rect.height); Browser.mouseMovementX = x - Browser.mouseX; Browser.mouseMovementY = y - Browser.mouseY; Browser.mouseX = x; Browser.mouseY = y; } }), xhrLoad: (function (url, onload, onerror) { var xhr = new XMLHttpRequest; xhr.open("GET", url, true); xhr.responseType = "arraybuffer"; xhr.onload = function xhr_onload() { if (xhr.status == 200 || xhr.status == 0 && xhr.response) { onload(xhr.response); } else { onerror(); } }; xhr.onerror = onerror; xhr.send(null); }), asyncLoad: (function (url, onload, onerror, noRunDep) { Browser.xhrLoad(url, (function (arrayBuffer) { assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); onload(new Uint8Array(arrayBuffer)); if (!noRunDep) removeRunDependency(); }), (function (event) { if (onerror) { onerror(); } else { throw 'Loading data file "' + url + '" failed.' } })); if (!noRunDep) addRunDependency(); }), resizeListeners: [], updateResizeListeners: (function () { var canvas = Module["canvas"]; Browser.resizeListeners.forEach((function (listener) { listener(canvas.width, canvas.height); })); }), setCanvasSize: (function (width, height, noUpdates) { var canvas = Module["canvas"]; Browser.updateCanvasDimensions(canvas, width, height); if (!noUpdates) Browser.updateResizeListeners(); }), windowedWidth: 0, windowedHeight: 0, setFullScreenCanvasSize: (function () { if (typeof SDL != "undefined") { var flags = HEAPU32[SDL.screen + Runtime.QUANTUM_SIZE * 0 >> 2]; flags = flags | 8388608; HEAP32[SDL.screen + Runtime.QUANTUM_SIZE * 0 >> 2] = flags; } Browser.updateResizeListeners(); }), setWindowedCanvasSize: (function () { if (typeof SDL != "undefined") { var flags = HEAPU32[SDL.screen + Runtime.QUANTUM_SIZE * 0 >> 2]; flags = flags & ~8388608; HEAP32[SDL.screen + Runtime.QUANTUM_SIZE * 0 >> 2] = flags; } Browser.updateResizeListeners(); }), updateCanvasDimensions: (function (canvas, wNative, hNative) { if (wNative && hNative) { canvas.widthNative = wNative; canvas.heightNative = hNative; } else { wNative = canvas.widthNative; hNative = canvas.heightNative; } var w = wNative; var h = hNative; if (Module["forcedAspectRatio"] && Module["forcedAspectRatio"] > 0) { if (w / h < Module["forcedAspectRatio"]) { w = Math.round(h * Module["forcedAspectRatio"]); } else { h = Math.round(w / Module["forcedAspectRatio"]); } } if ((document["webkitFullScreenElement"] || document["webkitFullscreenElement"] || document["mozFullScreenElement"] || document["mozFullscreenElement"] || document["fullScreenElement"] || document["fullscreenElement"] || document["msFullScreenElement"] || document["msFullscreenElement"] || document["webkitCurrentFullScreenElement"]) === canvas.parentNode && typeof screen != "undefined") { var factor = Math.min(screen.width / w, screen.height / h); w = Math.round(w * factor); h = Math.round(h * factor); } if (Browser.resizeCanvas) { if (canvas.width != w) canvas.width = w; if (canvas.height != h) canvas.height = h; if (typeof canvas.style != "undefined") { canvas.style.removeProperty("width"); canvas.style.removeProperty("height"); } } else { if (canvas.width != wNative) canvas.width = wNative; if (canvas.height != hNative) canvas.height = hNative; if (typeof canvas.style != "undefined") { if (w != wNative || h != hNative) { canvas.style.setProperty("width", w + "px", "important"); canvas.style.setProperty("height", h + "px", "important"); } else { canvas.style.removeProperty("width"); canvas.style.removeProperty("height"); } } } }), wgetRequests: {}, nextWgetRequestHandle: 0, getNextWgetRequestHandle: (function () { var handle = Browser.nextWgetRequestHandle; Browser.nextWgetRequestHandle++; return handle }) }; function _time(ptr) { var ret = Date.now() / 1e3 | 0; if (ptr) { HEAP32[ptr >> 2] = ret; } return ret } function _pthread_self() { return 0 } Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas, vrDevice) { Browser.requestFullScreen(lockPointer, resizeCanvas, vrDevice); }; Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func); }; Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates); }; Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause(); }; Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume(); }; Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia(); }; Module["createContext"] = function Module_createContext(canvas, useWebGL, setInModule, webGLContextAttributes) { return Browser.createContext(canvas, useWebGL, setInModule, webGLContextAttributes) }; FS.staticInit(); __ATINIT__.unshift((function () { if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); })); __ATMAIN__.push((function () { FS.ignorePermissions = false; })); __ATEXIT__.push((function () { FS.quit(); })); Module["FS_createFolder"] = FS.createFolder; Module["FS_createPath"] = FS.createPath; Module["FS_createDataFile"] = FS.createDataFile; Module["FS_createPreloadedFile"] = FS.createPreloadedFile; Module["FS_createLazyFile"] = FS.createLazyFile; Module["FS_createLink"] = FS.createLink; Module["FS_createDevice"] = FS.createDevice; Module["FS_unlink"] = FS.unlink; __ATINIT__.unshift((function () { })); __ATEXIT__.push((function () { })); STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP); staticSealed = true; STACK_MAX = STACK_BASE + TOTAL_STACK; DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX); assert(DYNAMIC_BASE < TOTAL_MEMORY, "TOTAL_MEMORY not big enough for stack"); Module.asmGlobalArg = { "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array": Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array, "NaN": NaN, "Infinity": Infinity }; Module.asmLibraryArg = { "abort": abort, "assert": assert, "_sysconf": _sysconf, "_pthread_self": _pthread_self, "_abort": _abort, "___setErrNo": ___setErrNo, "_sbrk": _sbrk, "_time": _time, "_emscripten_set_main_loop_timing": _emscripten_set_main_loop_timing, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_emscripten_set_main_loop": _emscripten_set_main_loop, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT };// EMSCRIPTEN_START_ASM var asm = (function (global, env, buffer) { "use asm"; var a = new global.Int8Array(buffer); var b = new global.Int16Array(buffer); var c = new global.Int32Array(buffer); var d = new global.Uint8Array(buffer); var e = new global.Uint16Array(buffer); var f = new global.Uint32Array(buffer); var g = new global.Float32Array(buffer); var h = new global.Float64Array(buffer); var i = env.STACKTOP | 0; var j = env.STACK_MAX | 0; var k = env.tempDoublePtr | 0; var l = env.ABORT | 0; var m = 0; var n = 0; var o = 0; var p = 0; var q = global.NaN, r = global.Infinity; var s = 0, t = 0, u = 0, v = 0, w = 0.0, x = 0, y = 0, z = 0, A = 0.0; var B = 0; var C = 0; var D = 0; var E = 0; var F = 0; var G = 0; var H = 0; var I = 0; var J = 0; var K = 0; var L = global.Math.floor; var M = global.Math.abs; var N = global.Math.sqrt; var O = global.Math.pow; var P = global.Math.cos; var Q = global.Math.sin; var R = global.Math.tan; var S = global.Math.acos; var T = global.Math.asin; var U = global.Math.atan; var V = global.Math.atan2; var W = global.Math.exp; var X = global.Math.log; var Y = global.Math.ceil; var Z = global.Math.imul; var _ = global.Math.min; var $ = global.Math.clz32; var aa = env.abort; var ba = env.assert; var ca = env._sysconf; var da = env._pthread_self; var ea = env._abort; var fa = env.___setErrNo; var ga = env._sbrk; var ha = env._time; var ia = env._emscripten_set_main_loop_timing; var ja = env._emscripten_memcpy_big; var ka = env._emscripten_set_main_loop; var la = 0.0; // EMSCRIPTEN_START_FUNCS function ma(a) { a = a | 0; var b = 0; b = i; i = i + a | 0; i = i + 15 & -16; return b | 0 } function na() { return i | 0 } function oa(a) { a = a | 0; i = a; } function pa(a, b) { a = a | 0; b = b | 0; i = a; j = b; } function qa(a, b) { a = a | 0; b = b | 0; if (!m) { m = a; n = b; } } function ra(b) { b = b | 0; a[k >> 0] = a[b >> 0]; a[k + 1 >> 0] = a[b + 1 >> 0]; a[k + 2 >> 0] = a[b + 2 >> 0]; a[k + 3 >> 0] = a[b + 3 >> 0]; } function sa(b) { b = b | 0; a[k >> 0] = a[b >> 0]; a[k + 1 >> 0] = a[b + 1 >> 0]; a[k + 2 >> 0] = a[b + 2 >> 0]; a[k + 3 >> 0] = a[b + 3 >> 0]; a[k + 4 >> 0] = a[b + 4 >> 0]; a[k + 5 >> 0] = a[b + 5 >> 0]; a[k + 6 >> 0] = a[b + 6 >> 0]; a[k + 7 >> 0] = a[b + 7 >> 0]; } function ta(a) { a = a | 0; B = a; } function ua() { return B | 0 } function va() { var a = 0, b = 0; b = i; i = i + 16 | 0; a = b; c[a >> 2] = 0; Db(a, 31756) | 0; i = b; return c[a >> 2] | 0 } function wa(a) { a = a | 0; var b = 0, d = 0; b = i; i = i + 16 | 0; d = b; c[d >> 2] = a; Eb(d); i = b; return } function xa(a, b, c, e) { a = a | 0; b = b | 0; c = c | 0; e = e | 0; Ea(a, (e | 0) == 0 ? (d[b >> 0] | 0) >>> 3 & 15 : 15, b + 1 | 0, c, 2) | 0; return } function ya(a) { a = a | 0; var b = 0; b = Je(8) | 0; Hb(b, b + 4 | 0, a) | 0; return b | 0 } function za(a) { a = a | 0; Ib(a, a + 4 | 0); Ke(a); return } function Aa(b, e, f, g, h) { b = b | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; var j = 0; h = i; i = i + 16 | 0; j = h; c[j >> 2] = e; f = (Jb(c[b >> 2] | 0, c[b + 4 >> 2] | 0, e, f, g, j, 3) | 0) << 16 >> 16; a[g >> 0] = d[g >> 0] | 0 | 4; i = h; return f | 0 } function Ba(a) { a = a | 0; if (!a) a = -1; else { b[a >> 1] = 4096; a = 0; } return a | 0 } function Ca(a, d, e, f, g, h) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0; m = c[h >> 2] | 0; q = g << 16 >> 16 > 0; if (q) { i = 0; j = 0; do { l = b[e + (i << 1) >> 1] | 0; l = Z(l, l) | 0; if ((l | 0) != 1073741824) { k = (l << 1) + j | 0; if ((l ^ j | 0) > 0 & (k ^ j | 0) < 0) { c[h >> 2] = 1; j = (j >>> 31) + 2147483647 | 0; } else j = k; } else { c[h >> 2] = 1; j = 2147483647; } i = i + 1 | 0; } while ((i & 65535) << 16 >> 16 != g << 16 >> 16); if ((j | 0) == 2147483647) { c[h >> 2] = m; l = 0; k = 0; do { j = b[e + (l << 1) >> 1] >> 2; j = Z(j, j) | 0; if ((j | 0) != 1073741824) { i = (j << 1) + k | 0; if ((j ^ k | 0) > 0 & (i ^ k | 0) < 0) { c[h >> 2] = 1; k = (k >>> 31) + 2147483647 | 0; } else k = i; } else { c[h >> 2] = 1; k = 2147483647; } l = l + 1 | 0; } while ((l & 65535) << 16 >> 16 != g << 16 >> 16) } else p = 8; } else { j = 0; p = 8; } if ((p | 0) == 8) k = j >> 4; if (!k) { b[a >> 1] = 0; return } o = ((pe(k) | 0) & 65535) + 65535 | 0; j = o << 16 >> 16; if ((o & 65535) << 16 >> 16 > 0) { i = k << j; if ((i >> j | 0) == (k | 0)) k = i; else k = k >> 31 ^ 2147483647; } else { j = 0 - j << 16; if ((j | 0) < 2031616) k = k >> (j >> 16); else k = 0; } n = Ce(k, h) | 0; i = c[h >> 2] | 0; if (q) { j = 0; k = 0; do { m = b[d + (j << 1) >> 1] | 0; m = Z(m, m) | 0; if ((m | 0) != 1073741824) { l = (m << 1) + k | 0; if ((m ^ k | 0) > 0 & (l ^ k | 0) < 0) { c[h >> 2] = 1; k = (k >>> 31) + 2147483647 | 0; } else k = l; } else { c[h >> 2] = 1; k = 2147483647; } j = j + 1 | 0; } while ((j & 65535) << 16 >> 16 != g << 16 >> 16); if ((k | 0) == 2147483647) { c[h >> 2] = i; m = 0; k = 0; do { l = b[d + (m << 1) >> 1] >> 2; l = Z(l, l) | 0; if ((l | 0) != 1073741824) { j = (l << 1) + k | 0; if ((l ^ k | 0) > 0 & (j ^ k | 0) < 0) { c[h >> 2] = 1; k = (k >>> 31) + 2147483647 | 0; } else k = j; } else { c[h >> 2] = 1; k = 2147483647; } m = m + 1 | 0; } while ((m & 65535) << 16 >> 16 != g << 16 >> 16) } else p = 29; } else { k = 0; p = 29; } if ((p | 0) == 29) k = k >> 4; if (!k) l = 0; else { j = (pe(k) | 0) << 16 >> 16; i = o - j | 0; l = i & 65535; k = (Td(n, Ce(k << j, h) | 0) | 0) << 16 >> 16; j = k << 7; i = i << 16 >> 16; if (l << 16 >> 16 > 0) i = l << 16 >> 16 < 31 ? j >> i : 0; else { p = 0 - i << 16 >> 16; i = j << p; i = (i >> p | 0) == (j | 0) ? i : k >> 24 ^ 2147483647; } l = (Z(((ce(i, h) | 0) << 9) + 32768 >> 16, 32767 - (f & 65535) << 16 >> 16) | 0) >>> 15 << 16 >> 16; } i = b[a >> 1] | 0; if (q) { k = f << 16 >> 16; j = 0; while (1) { f = ((Z(i << 16 >> 16, k) | 0) >>> 15 & 65535) + l | 0; i = f & 65535; b[e >> 1] = (Z(b[e >> 1] | 0, f << 16 >> 16) | 0) >>> 12; j = j + 1 << 16 >> 16; if (j << 16 >> 16 >= g << 16 >> 16) break; else e = e + 2 | 0; } } b[a >> 1] = i; return } function Da(a, d, e, f) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; var g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0; i = c[f >> 2] | 0; g = e << 16 >> 16 > 0; if (g) { j = 0; h = 0; do { l = b[d + (j << 1) >> 1] | 0; l = Z(l, l) | 0; if ((l | 0) != 1073741824) { k = (l << 1) + h | 0; if ((l ^ h | 0) > 0 & (k ^ h | 0) < 0) { c[f >> 2] = 1; h = (h >>> 31) + 2147483647 | 0; } else h = k; } else { c[f >> 2] = 1; h = 2147483647; } j = j + 1 | 0; } while ((j & 65535) << 16 >> 16 != e << 16 >> 16); if ((h | 0) == 2147483647) { c[f >> 2] = i; l = 0; i = 0; do { k = b[d + (l << 1) >> 1] >> 2; k = Z(k, k) | 0; if ((k | 0) != 1073741824) { j = (k << 1) + i | 0; if ((k ^ i | 0) > 0 & (j ^ i | 0) < 0) { c[f >> 2] = 1; i = (i >>> 31) + 2147483647 | 0; } else i = j; } else { c[f >> 2] = 1; i = 2147483647; } l = l + 1 | 0; } while ((l & 65535) << 16 >> 16 != e << 16 >> 16) } else o = 8; } else { h = 0; o = 8; } if ((o | 0) == 8) i = h >> 4; if (!i) return; n = ((pe(i) | 0) & 65535) + 65535 | 0; k = n << 16 >> 16; if ((n & 65535) << 16 >> 16 > 0) { j = i << k; if ((j >> k | 0) == (i | 0)) i = j; else i = i >> 31 ^ 2147483647; } else { k = 0 - k << 16; if ((k | 0) < 2031616) i = i >> (k >> 16); else i = 0; } m = Ce(i, f) | 0; i = c[f >> 2] | 0; if (g) { j = 0; h = 0; do { l = b[a + (j << 1) >> 1] | 0; l = Z(l, l) | 0; if ((l | 0) != 1073741824) { k = (l << 1) + h | 0; if ((l ^ h | 0) > 0 & (k ^ h | 0) < 0) { c[f >> 2] = 1; h = (h >>> 31) + 2147483647 | 0; } else h = k; } else { c[f >> 2] = 1; h = 2147483647; } j = j + 1 | 0; } while ((j & 65535) << 16 >> 16 != e << 16 >> 16); if ((h | 0) == 2147483647) { c[f >> 2] = i; i = 0; j = 0; do { l = b[a + (i << 1) >> 1] >> 2; l = Z(l, l) | 0; if ((l | 0) != 1073741824) { k = (l << 1) + j | 0; if ((l ^ j | 0) > 0 & (k ^ j | 0) < 0) { c[f >> 2] = 1; j = (j >>> 31) + 2147483647 | 0; } else j = k; } else { c[f >> 2] = 1; j = 2147483647; } i = i + 1 | 0; } while ((i & 65535) << 16 >> 16 != e << 16 >> 16) } else o = 28; } else { h = 0; o = 28; } if ((o | 0) == 28) j = h >> 4; if (!j) g = 0; else { l = pe(j) | 0; k = l << 16 >> 16; if (l << 16 >> 16 > 0) { i = j << k; if ((i >> k | 0) == (j | 0)) j = i; else j = j >> 31 ^ 2147483647; } else { k = 0 - k << 16; if ((k | 0) < 2031616) j = j >> (k >> 16); else j = 0; } i = n - (l & 65535) | 0; k = i & 65535; h = (Td(m, Ce(j, f) | 0) | 0) << 16 >> 16; g = h << 7; i = i << 16 >> 16; if (k << 16 >> 16 > 0) g = k << 16 >> 16 < 31 ? g >> i : 0; else { n = 0 - i << 16 >> 16; a = g << n; g = (a >> n | 0) == (g | 0) ? a : h >> 24 ^ 2147483647; } g = ce(g, f) | 0; if ((g | 0) > 4194303) g = 2147483647; else g = (g | 0) < -4194304 ? -2147483648 : g << 9; g = Ce(g, f) | 0; } h = (e & 65535) + 65535 & 65535; if (h << 16 >> 16 <= -1) return; l = g << 16 >> 16; k = e + -1 << 16 >> 16 << 16 >> 16; while (1) { i = d + (k << 1) | 0; g = Z(b[i >> 1] | 0, l) | 0; do if ((g | 0) != 1073741824) { j = g << 1; if ((j | 0) <= 268435455) if ((j | 0) < -268435456) { b[i >> 1] = -32768; break } else { b[i >> 1] = g >>> 12; break } else o = 52; } else { c[f >> 2] = 1; o = 52; } while (0); if ((o | 0) == 52) { o = 0; b[i >> 1] = 32767; } h = h + -1 << 16 >> 16; if (h << 16 >> 16 <= -1) break; else k = k + -1 | 0; } return } function Ea(a, d, e, f, g) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; var h = 0, j = 0, k = 0, l = 0; l = i; i = i + 496 | 0; k = l; j = (g | 0) == 2; do if (!(j & 1 | (g | 0) == 4)) { if (g) { a = -1; i = l; return a | 0 } j = b[e >> 1] | 0; d = e + 490 | 0; g = e + 2 | 0; h = 0; while (1) { b[k + (h << 1) >> 1] = b[g >> 1] | 0; h = h + 1 | 0; if ((h | 0) == 244) break; else g = g + 2 | 0; } h = j << 16 >> 16; if (j << 16 >> 16 == 7) { g = 492; d = c[a + 1760 >> 2] | 0; break } else { g = 492; d = b[d >> 1] | 0; break } } else { h = a + 1168 | 0; if (j) { Gb(d, e, k, h); h = 604; } else { pb(d, e, k, h); h = 3436; } g = b[h + (d << 1) >> 1] | 0; do if (d >>> 0 >= 8) { if ((d | 0) == 8) { d = b[k + 76 >> 1] << 2 | (b[k + 74 >> 1] << 1 | b[k + 72 >> 1]); h = (b[k + 70 >> 1] | 0) == 0 ? 4 : 5; break } if (d >>> 0 < 15) { a = -1; i = l; return a | 0 } else { d = c[a + 1760 >> 2] | 0; h = 7; break } } else h = 0; while (0); if (g << 16 >> 16 == -1) { a = -1; i = l; return a | 0 } } while (0); Fb(a, d, k, h, f); c[a + 1760 >> 2] = d; a = g; i = l; return a | 0 } function Fa(a, d, f) { a = a | 0; d = d | 0; f = f | 0; var g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0; t = i; i = i + 48 | 0; r = t + 20 | 0; s = t; h = r; g = h + 20 | 0; do { b[h >> 1] = b[a >> 1] | 0; h = h + 2 | 0; a = a + 2 | 0; } while ((h | 0) < (g | 0)); a = b[r + 18 >> 1] | 0; q = (a & 65535) - ((a & 65535) >>> 15 & 65535) | 0; a:do if (((q << 16 >> 31 ^ q) & 65535) << 16 >> 16 <= 4095) { g = 9; q = 9; while (1) { a = a << 16 >> 16; a = (a << 19 >> 19 | 0) == (a | 0) ? a << 3 : a >>> 15 ^ 32767; p = d + (g << 1) | 0; b[p >> 1] = a; a = a << 16 >> 16; a = Z(a, a) | 0; if ((a | 0) == 1073741824) { c[f >> 2] = 1; h = 2147483647; } else h = a << 1; a = 2147483647 - h | 0; if ((a & h | 0) < 0) { c[f >> 2] = 1; a = 2147483647; } n = pe(a) | 0; o = 15 - (n & 65535) & 65535; j = n << 16 >> 16; if (n << 16 >> 16 > 0) { h = a << j; if ((h >> j | 0) != (a | 0)) h = a >> 31 ^ 2147483647; } else { h = 0 - j << 16; if ((h | 0) < 2031616) h = a >> (h >> 16); else h = 0; } h = Td(16384, Ce(h, f) | 0) | 0; do if (q << 16 >> 16 > 0) { n = g + -1 | 0; k = h << 16 >> 16; l = q << 16 >> 16; m = 0; while (1) { g = e[r + (m << 1) >> 1] | 0; a = g << 16; j = Z(b[r + (n - m << 1) >> 1] | 0, b[p >> 1] | 0) | 0; if ((j | 0) == 1073741824) { c[f >> 2] = 1; h = 2147483647; } else h = j << 1; j = a - h | 0; if (((j ^ a) & (h ^ a) | 0) < 0) { c[f >> 2] = 1; j = (g >>> 15) + 2147483647 | 0; } j = Z((Ce(j, f) | 0) << 16 >> 16, k) | 0; if ((j | 0) == 1073741824) { c[f >> 2] = 1; j = 2147483647; } else j = j << 1; j = ge(j, o, f) | 0; h = j - (j >>> 31) | 0; if ((h >> 31 ^ h | 0) > 32767) { j = 24; break } b[s + (m << 1) >> 1] = j; m = m + 1 | 0; if ((l | 0) <= (m | 0)) { j = 26; break } } if ((j | 0) == 24) { j = 0; h = d; g = h + 20 | 0; do { b[h >> 1] = 0; h = h + 2 | 0; } while ((h | 0) < (g | 0)); a = 10; } else if ((j | 0) == 26) { j = 0; if (q << 16 >> 16 > 0) a = q; else { j = 28; break } } h = a + -1 << 16 >> 16; Oe(r | 0, s | 0, ((h & 65535) << 1) + 2 | 0) | 0; g = h << 16 >> 16; } else j = 28; while (0); if ((j | 0) == 28) { a = q + -1 << 16 >> 16; if (a << 16 >> 16 > -1) { g = a << 16 >> 16; h = 32767; } else break } a = b[r + (g << 1) >> 1] | 0; q = (a & 65535) - ((a & 65535) >>> 15 & 65535) | 0; if (((q << 16 >> 31 ^ q) & 65535) << 16 >> 16 > 4095) break a; else q = h; } i = t; return } while (0); h = d; g = h + 20 | 0; do { b[h >> 1] = 0; h = h + 2 | 0; } while ((h | 0) < (g | 0)); i = t; return } function Ga(a, b) { a = a | 0; b = b | 0; var d = 0, e = 0, f = 0, g = 0, h = 0; if (b << 16 >> 16 <= 0) { a = 0; return a | 0 } e = c[a >> 2] | 0; f = 0; d = 0; do { h = e & 1; d = h | d << 1 & 131070; g = e >> 1; e = (h | 0) == (e >>> 28 & 1 | 0) ? g : g | 1073741824; f = f + 1 << 16 >> 16; } while (f << 16 >> 16 < b << 16 >> 16); c[a >> 2] = e; h = d & 65535; return h | 0 } function Ha(a, d, e) { a = a | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, i = 0, j = 0, k = 0; g = d; f = g + 80 | 0; do { b[g >> 1] = 0; g = g + 2 | 0; } while ((g | 0) < (f | 0)); f = 0; g = c[a >> 2] | 0; do { k = g & 1; j = g >> 1; j = (k | 0) == (g >>> 28 & 1 | 0) ? j : j | 1073741824; h = j & 1; i = j >> 1; c[a >> 2] = (h | 0) == (j >>> 28 & 1 | 0) ? i : i | 1073741824; h = Rd((Z(k << 1 | h, 1310720) | 0) >>> 17 & 65535, f, e) | 0; k = c[a >> 2] | 0; i = k & 1; j = k >> 1; g = (i | 0) == (k >>> 28 & 1 | 0) ? j : j | 1073741824; c[a >> 2] = g; b[d + (h << 16 >> 16 << 1) >> 1] = ((i & 65535) << 13 & 65535) + -4096 << 16 >> 16; f = f + 1 << 16 >> 16; } while (f << 16 >> 16 < 10); return } function Ia(a, d, f, g, h, i) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; var j = 0, k = 0; j = b[a >> 1] | 0; if ((j * 31821 | 0) == 1073741824) { c[i >> 2] = 1; k = 1073741823; } else k = j * 63642 >> 1; j = k + 13849 | 0; if ((k | 0) > -1 & (j ^ k | 0) < 0) { c[i >> 2] = 1; j = (k >>> 31) + 2147483647 | 0; } b[a >> 1] = j; if (d << 16 >> 16 <= 0) return; k = 0; j = h + ((j & 127) << 1) | 0; while (1) { b[g + (k << 1) >> 1] = (-65536 << b[f + (k << 1) >> 1] >>> 16 ^ 65535) & e[j >> 1]; k = k + 1 | 0; if ((k & 65535) << 16 >> 16 == d << 16 >> 16) break; else j = j + 2 | 0; } return } function Ja(a) { a = a | 0; var c = 0; if (!a) { c = -1; return c | 0 } c = a + 122 | 0; do { b[a >> 1] = 0; a = a + 2 | 0; } while ((a | 0) < (c | 0)); c = 0; return c | 0 } function Ka(a, d, f, g, h) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0; k = 159; j = 0; while (1) { m = b[f + (k << 1) >> 1] | 0; m = Z(m, m) | 0; m = (m | 0) == 1073741824 ? 2147483647 : m << 1; i = m + j | 0; if ((m ^ j | 0) > -1 & (i ^ j | 0) < 0) { c[h >> 2] = 1; j = (j >>> 31) + 2147483647 | 0; } else j = i; if ((k | 0) > 0) k = k + -1 | 0; else { k = j; break } } h = k >>> 14 & 65535; j = 32767; i = 59; while (1) { m = b[a + (i << 1) >> 1] | 0; j = m << 16 >> 16 < j << 16 >> 16 ? m : j; if ((i | 0) > 0) i = i + -1 | 0; else break } m = (k | 0) > 536870911 ? 32767 : h; h = j << 16 >> 16; i = h << 20 >> 16; k = j << 16 >> 16 > 0 ? 32767 : -32768; f = 55; j = b[a >> 1] | 0; while (1) { l = b[a + (f << 1) >> 1] | 0; j = j << 16 >> 16 < l << 16 >> 16 ? l : j; if ((f | 0) > 1) f = f + -1 | 0; else break } f = b[a + 80 >> 1] | 0; l = b[a + 82 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 84 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 86 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 88 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 90 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 92 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 94 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 96 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 98 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 100 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 102 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 104 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 106 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 108 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 110 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 112 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 114 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = b[a + 116 >> 1] | 0; f = f << 16 >> 16 < l << 16 >> 16 ? l : f; l = a + 118 | 0; o = b[l >> 1] | 0; do if ((m + -21 & 65535) < 17557 & j << 16 >> 16 > 20 ? ((m << 16 >> 16 | 0) < (((h << 4 | 0) == (i | 0) ? i : k) | 0) ? 1 : (f << 16 >> 16 < o << 16 >> 16 ? o : f) << 16 >> 16 < 1953) : 0) { j = a + 120 | 0; i = b[j >> 1] | 0; if (i << 16 >> 16 > 29) { b[j >> 1] = 30; f = j; k = 1; break } else { k = (i & 65535) + 1 & 65535; b[j >> 1] = k; f = j; k = k << 16 >> 16 > 1 & 1; break } } else n = 14; while (0); if ((n | 0) == 14) { f = a + 120 | 0; b[f >> 1] = 0; k = 0; } j = 0; do { o = j; j = j + 1 | 0; b[a + (o << 1) >> 1] = b[a + (j << 1) >> 1] | 0; } while ((j | 0) != 59); b[l >> 1] = m; j = b[f >> 1] | 0; j = j << 16 >> 16 > 15 ? 16383 : j << 16 >> 16 > 8 ? 15565 : 13926; i = Zd(d + 8 | 0, 5) | 0; if ((b[f >> 1] | 0) > 20) { if (((Zd(d, 9) | 0) << 16 >> 16 | 0) > (j | 0)) n = 20; } else if ((i << 16 >> 16 | 0) > (j | 0)) n = 20; if ((n | 0) == 20) { b[g >> 1] = 0; return k | 0 } i = (e[g >> 1] | 0) + 1 & 65535; if (i << 16 >> 16 > 10) { b[g >> 1] = 10; return k | 0 } else { b[g >> 1] = i; return k | 0 } return 0 } function La(a) { a = a | 0; var c = 0; if (!a) { c = -1; return c | 0 } c = a + 18 | 0; do { b[a >> 1] = 0; a = a + 2 | 0; } while ((a | 0) < (c | 0)); c = 0; return c | 0 } function Ma(a, d, f, g, h, i, j, k, l, m, n, o) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; var p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0; y = a + 2 | 0; b[a >> 1] = b[y >> 1] | 0; z = a + 4 | 0; b[y >> 1] = b[z >> 1] | 0; A = a + 6 | 0; b[z >> 1] = b[A >> 1] | 0; B = a + 8 | 0; b[A >> 1] = b[B >> 1] | 0; C = a + 10 | 0; b[B >> 1] = b[C >> 1] | 0; D = a + 12 | 0; b[C >> 1] = b[D >> 1] | 0; b[D >> 1] = f; t = 0; x = 0; do { p = h + (x << 1) | 0; r = Ge(b[p >> 1] | 0, b[g + (x << 1) >> 1] | 0, o) | 0; r = (r & 65535) - ((r & 65535) >>> 15 & 65535) | 0; r = r << 16 >> 31 ^ r; w = ((qe(r & 65535) | 0) & 65535) + 65535 | 0; q = w << 16 >> 16; if ((w & 65535) << 16 >> 16 < 0) { s = 0 - q << 16; if ((s | 0) < 983040) u = r << 16 >> 16 >> (s >> 16) & 65535; else u = 0; } else { s = r << 16 >> 16; r = s << q; if ((r << 16 >> 16 >> q | 0) == (s | 0)) u = r & 65535; else u = (s >>> 15 ^ 32767) & 65535; } v = qe(b[p >> 1] | 0) | 0; r = b[p >> 1] | 0; q = v << 16 >> 16; if (v << 16 >> 16 < 0) { s = 0 - q << 16; if ((s | 0) < 983040) s = r << 16 >> 16 >> (s >> 16) & 65535; else s = 0; } else { s = r << 16 >> 16; r = s << q; if ((r << 16 >> 16 >> q | 0) == (s | 0)) s = r & 65535; else s = (s >>> 15 ^ 32767) & 65535; } q = Td(u, s) | 0; s = (w & 65535) + 2 - (v & 65535) | 0; r = s & 65535; do if (s & 32768) { if (r << 16 >> 16 != -32768) { w = 0 - s | 0; s = w << 16 >> 16; if ((w & 65535) << 16 >> 16 < 0) { s = 0 - s << 16; if ((s | 0) >= 983040) { s = 0; break } s = q << 16 >> 16 >> (s >> 16) & 65535; break } } else s = 32767; r = q << 16 >> 16; q = r << s; if ((q << 16 >> 16 >> s | 0) == (r | 0)) s = q & 65535; else s = (r >>> 15 ^ 32767) & 65535; } else s = De(q, r, o) | 0; while (0); t = Rd(t, s, o) | 0; x = x + 1 | 0; } while ((x | 0) != 10); s = t & 65535; r = t << 16 >> 16 > 5325; t = a + 14 | 0; if (r) { h = (e[t >> 1] | 0) + 1 & 65535; b[t >> 1] = h; if (h << 16 >> 16 > 10) b[a + 16 >> 1] = 0; } else b[t >> 1] = 0; switch (d | 0) { case 0: case 1: case 2: case 3: case 6: break; default: { D = a + 16 | 0; o = f; f = b[D >> 1] | 0; f = f & 65535; f = f + 1 | 0; f = f & 65535; b[D >> 1] = f; return o | 0 } } u = (j | i) << 16 >> 16 == 0; v = m << 16 >> 16 == 0; w = d >>> 0 < 3; t = s + (w & ((v | (u & (k << 16 >> 16 == 0 | l << 16 >> 16 == 0) | n << 16 >> 16 < 2)) ^ 1) ? 61030 : 62259) & 65535; t = t << 16 >> 16 > 0 ? t : 0; if (t << 16 >> 16 <= 2048) { t = t << 16 >> 16; if ((t << 18 >> 18 | 0) == (t | 0)) l = t << 2; else l = t >>> 15 ^ 32767; } else l = 8192; k = a + 16 | 0; n = r | (b[k >> 1] | 0) < 40; t = b[z >> 1] | 0; if ((t * 6554 | 0) == 1073741824) { c[o >> 2] = 1; r = 2147483647; } else r = t * 13108 | 0; t = b[A >> 1] | 0; s = t * 6554 | 0; if ((s | 0) != 1073741824) { t = (t * 13108 | 0) + r | 0; if ((s ^ r | 0) > 0 & (t ^ r | 0) < 0) { c[o >> 2] = 1; t = (r >>> 31) + 2147483647 | 0; } } else { c[o >> 2] = 1; t = 2147483647; } s = b[B >> 1] | 0; r = s * 6554 | 0; if ((r | 0) != 1073741824) { s = (s * 13108 | 0) + t | 0; if ((r ^ t | 0) > 0 & (s ^ t | 0) < 0) { c[o >> 2] = 1; s = (t >>> 31) + 2147483647 | 0; } } else { c[o >> 2] = 1; s = 2147483647; } t = b[C >> 1] | 0; r = t * 6554 | 0; if ((r | 0) != 1073741824) { t = (t * 13108 | 0) + s | 0; if ((r ^ s | 0) > 0 & (t ^ s | 0) < 0) { c[o >> 2] = 1; r = (s >>> 31) + 2147483647 | 0; } else r = t; } else { c[o >> 2] = 1; r = 2147483647; } t = b[D >> 1] | 0; s = t * 6554 | 0; if ((s | 0) != 1073741824) { t = (t * 13108 | 0) + r | 0; if ((s ^ r | 0) > 0 & (t ^ r | 0) < 0) { c[o >> 2] = 1; t = (r >>> 31) + 2147483647 | 0; } } else { c[o >> 2] = 1; t = 2147483647; } r = Ce(t, o) | 0; if (w & ((u | v) ^ 1)) { t = b[a >> 1] | 0; if ((t * 4681 | 0) == 1073741824) { c[o >> 2] = 1; r = 2147483647; } else r = t * 9362 | 0; t = b[y >> 1] | 0; s = t * 4681 | 0; if ((s | 0) != 1073741824) { t = (t * 9362 | 0) + r | 0; if ((s ^ r | 0) > 0 & (t ^ r | 0) < 0) { c[o >> 2] = 1; r = (r >>> 31) + 2147483647 | 0; } else r = t; } else { c[o >> 2] = 1; r = 2147483647; } t = b[z >> 1] | 0; s = t * 4681 | 0; if ((s | 0) != 1073741824) { t = (t * 9362 | 0) + r | 0; if ((s ^ r | 0) > 0 & (t ^ r | 0) < 0) { c[o >> 2] = 1; r = (r >>> 31) + 2147483647 | 0; } else r = t; } else { c[o >> 2] = 1; r = 2147483647; } t = b[A >> 1] | 0; s = t * 4681 | 0; if ((s | 0) != 1073741824) { t = (t * 9362 | 0) + r | 0; if ((s ^ r | 0) > 0 & (t ^ r | 0) < 0) { c[o >> 2] = 1; t = (r >>> 31) + 2147483647 | 0; } } else { c[o >> 2] = 1; t = 2147483647; } s = b[B >> 1] | 0; r = s * 4681 | 0; if ((r | 0) != 1073741824) { s = (s * 9362 | 0) + t | 0; if ((r ^ t | 0) > 0 & (s ^ t | 0) < 0) { c[o >> 2] = 1; t = (t >>> 31) + 2147483647 | 0; } else t = s; } else { c[o >> 2] = 1; t = 2147483647; } s = b[C >> 1] | 0; r = s * 4681 | 0; if ((r | 0) != 1073741824) { s = (s * 9362 | 0) + t | 0; if ((r ^ t | 0) > 0 & (s ^ t | 0) < 0) { c[o >> 2] = 1; s = (t >>> 31) + 2147483647 | 0; } } else { c[o >> 2] = 1; s = 2147483647; } r = b[D >> 1] | 0; p = r * 4681 | 0; if ((p | 0) != 1073741824) { q = (r * 9362 | 0) + s | 0; if ((p ^ s | 0) > 0 & (q ^ s | 0) < 0) { c[o >> 2] = 1; q = (s >>> 31) + 2147483647 | 0; } } else { c[o >> 2] = 1; q = 2147483647; } r = Ce(q, o) | 0; } t = n ? 8192 : l << 16 >> 16; p = Z(t, f << 16 >> 16) | 0; if ((p | 0) == 1073741824) { c[o >> 2] = 1; s = 2147483647; } else s = p << 1; r = r << 16 >> 16; q = r << 13; if ((q | 0) != 1073741824) { p = s + (r << 14) | 0; if ((s ^ q | 0) > 0 & (p ^ s | 0) < 0) { c[o >> 2] = 1; s = (s >>> 31) + 2147483647 | 0; } else s = p; } else { c[o >> 2] = 1; s = 2147483647; } p = Z(r, t) | 0; if ((p | 0) == 1073741824) { c[o >> 2] = 1; q = 2147483647; } else q = p << 1; p = s - q | 0; if (((p ^ s) & (q ^ s) | 0) < 0) { c[o >> 2] = 1; p = (s >>> 31) + 2147483647 | 0; } D = p << 2; f = k; o = Ce((D >> 2 | 0) == (p | 0) ? D : p >> 31 ^ 2147483647, o) | 0; D = b[f >> 1] | 0; D = D & 65535; D = D + 1 | 0; D = D & 65535; b[f >> 1] = D; return o | 0 } function Na(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var f = 0, g = 0, h = 0, i = 0; f = c; g = f + 80 | 0; do { b[f >> 1] = 0; f = f + 2 | 0; } while ((f | 0) < (g | 0)); f = 0; do { i = b[a + (f << 1) >> 1] | 0; g = ((i & 8) << 10 & 65535 ^ 8192) + -4096 << 16 >> 16; h = f << 16; i = ((b[d + ((i & 7) << 1) >> 1] | 0) * 327680 | 0) + h >> 16; b[c + (i << 1) >> 1] = g; h = ((b[d + ((e[a + (f + 5 << 1) >> 1] & 7) << 1) >> 1] | 0) * 327680 | 0) + h >> 16; if ((h | 0) < (i | 0)) g = 0 - (g & 65535) & 65535; i = c + (h << 1) | 0; b[i >> 1] = (e[i >> 1] | 0) + (g & 65535); f = f + 1 | 0; } while ((f | 0) != 5); return } function Oa(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var e = 0, f = 0, g = 0; f = c << 16 >> 16; e = (f << 1 & 2 | 1) + ((f >>> 1 & 7) * 5 | 0) | 0; c = f >>> 4 & 3; c = ((f >>> 6 & 7) * 5 | 0) + ((c | 0) == 3 ? 4 : c) | 0; f = d; g = f + 80 | 0; do { b[f >> 1] = 0; f = f + 2 | 0; } while ((f | 0) < (g | 0)); a = a << 16 >> 16; b[d + (e << 1) >> 1] = (0 - (a & 1) & 16383) + 57344; b[d + (c << 1) >> 1] = (0 - (a >>> 1 & 1) & 16383) + 57344; return } function Pa(a, c, d, f, g, h) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; var i = 0, j = 0; h = d << 16 >> 16; j = h >>> 3; a = a << 16 >> 16; a = ((a << 17 >> 17 | 0) == (a | 0) ? a << 1 : a >>> 15 ^ 32767) + (j & 8) << 16; j = (e[f + (a + 65536 >> 16 << 1) >> 1] | 0) + ((j & 7) * 5 | 0) | 0; d = c << 16 >> 16; i = (0 - (d & 1) & 16383) + 57344 & 65535; a = g + ((e[f + (a >> 16 << 1) >> 1] | 0) + ((h & 7) * 5 | 0) << 16 >> 16 << 1) | 0; c = g; h = c + 80 | 0; do { b[c >> 1] = 0; c = c + 2 | 0; } while ((c | 0) < (h | 0)); b[a >> 1] = i; b[g + (j << 16 >> 16 << 1) >> 1] = (0 - (d >>> 1 & 1) & 16383) + 57344; return } function Qa(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var e = 0, f = 0, g = 0, h = 0; c = c << 16 >> 16; e = (c & 7) * 5 | 0; f = (c >>> 2 & 2 | 1) + ((c >>> 4 & 7) * 5 | 0) | 0; c = (c >>> 6 & 2) + 2 + ((c >>> 8 & 7) * 5 | 0) | 0; g = d; h = g + 80 | 0; do { b[g >> 1] = 0; g = g + 2 | 0; } while ((g | 0) < (h | 0)); a = a << 16 >> 16; b[d + (e << 1) >> 1] = (0 - (a & 1) & 16383) + 57344; b[d + (f << 1) >> 1] = (0 - (a >>> 1 & 1) & 16383) + 57344; b[d + (c << 1) >> 1] = (0 - (a >>> 2 & 1) & 16383) + 57344; return } function Ra(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, i = 0; c = c << 16 >> 16; h = b[d + ((c & 7) << 1) >> 1] | 0; i = b[d + ((c >>> 3 & 7) << 1) >> 1] | 0; g = b[d + ((c >>> 6 & 7) << 1) >> 1] | 0; d = (c >>> 9 & 1) + 3 + ((b[d + ((c >>> 10 & 7) << 1) >> 1] | 0) * 5 | 0) | 0; c = e; f = c + 80 | 0; do { b[c >> 1] = 0; c = c + 2 | 0; } while ((c | 0) < (f | 0)); a = a << 16 >> 16; b[e + (h * 327680 >> 16 << 1) >> 1] = (0 - (a & 1) & 16383) + 57344; b[e + ((i * 327680 | 0) + 65536 >> 16 << 1) >> 1] = (0 - (a >>> 1 & 1) & 16383) + 57344; b[e + ((g * 327680 | 0) + 131072 >> 16 << 1) >> 1] = (0 - (a >>> 2 & 1) & 16383) + 57344; b[e + (d << 16 >> 16 << 1) >> 1] = (0 - (a >>> 3 & 1) & 16383) + 57344; return } function Sa(a, d, f) { a = a | 0; d = d | 0; f = f | 0; var g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0; q = i; i = i + 32 | 0; p = q + 16 | 0; o = q; j = d; h = j + 80 | 0; do { b[j >> 1] = 0; j = j + 2 | 0; } while ((j | 0) < (h | 0)); h = b[a >> 1] | 0; b[p >> 1] = h; b[p + 2 >> 1] = b[a + 2 >> 1] | 0; b[p + 4 >> 1] = b[a + 4 >> 1] | 0; b[p + 6 >> 1] = b[a + 6 >> 1] | 0; m = b[a + 8 >> 1] | 0; Ta(m >>> 3 & 65535, m & 7, 0, 4, 1, o, f); m = b[a + 10 >> 1] | 0; Ta(m >>> 3 & 65535, m & 7, 2, 6, 5, o, f); m = b[a + 12 >> 1] | 0; g = m >> 2; do if ((g * 25 | 0) != 1073741824) { j = (Z(g, 1638400) | 0) + 786432 >> 21; g = j * 6554 >> 15; if ((g | 0) > 32767) { c[f >> 2] = 1; k = 1; l = 1; a = 163835; n = 6; break } a = (g << 16 >> 16) * 5 | 0; k = g & 1; if ((a | 0) == 1073741824) { c[f >> 2] = 1; l = 0; a = 65535; } else { l = 0; n = 6; } } else { c[f >> 2] = 1; k = 0; g = 0; l = 0; j = 0; a = 0; n = 6; } while (0); if ((n | 0) == 6) a = a & 65535; n = j - a | 0; k = k << 16 >> 16 == 0 ? n : 4 - n | 0; n = k << 16 >> 16; b[o + 6 >> 1] = Rd(((k << 17 >> 17 | 0) == (n | 0) ? k << 1 : n >>> 15 ^ 32767) & 65535, m & 1, f) | 0; if (l) { c[f >> 2] = 1; g = 32767; } n = g << 16 >> 16; b[o + 14 >> 1] = ((g << 17 >> 17 | 0) == (n | 0) ? g << 1 : n >>> 15 ^ 32767) + (m >>> 1 & 1); g = 0; while (1) { h = h << 16 >> 16 == 0 ? 8191 : -8191; n = (b[o + (g << 1) >> 1] << 2) + g << 16; j = n >> 16; if ((n | 0) < 2621440) b[d + (j << 1) >> 1] = h; k = (b[o + (g + 4 << 1) >> 1] << 2) + g << 16; a = k >> 16; if ((a | 0) < (j | 0)) h = 0 - (h & 65535) & 65535; if ((k | 0) < 2621440) { n = d + (a << 1) | 0; b[n >> 1] = (e[n >> 1] | 0) + (h & 65535); } g = g + 1 | 0; if ((g | 0) == 4) break; h = b[p + (g << 1) >> 1] | 0; } i = q; return } function Ta(a, d, e, f, g, h, i) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; var j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0; k = a << 16 >> 16 > 124 ? 124 : a; a = (k << 16 >> 16) * 1311 >> 15; p = (a | 0) > 32767; if (!p) { j = a << 16 >> 16; if ((j * 25 | 0) == 1073741824) { c[i >> 2] = 1; j = 1073741823; } else o = 4; } else { c[i >> 2] = 1; j = 32767; o = 4; } if ((o | 0) == 4) j = (j * 50 | 0) >>> 1; m = (k & 65535) - j | 0; j = (m << 16 >> 16) * 6554 >> 15; n = (j | 0) > 32767; if (!n) { k = j << 16 >> 16; if ((k * 5 | 0) == 1073741824) { c[i >> 2] = 1; l = 1073741823; } else o = 9; } else { c[i >> 2] = 1; k = 32767; o = 9; } if ((o | 0) == 9) l = (k * 10 | 0) >>> 1; m = m - l | 0; o = m << 16 >> 16; k = d << 16 >> 16; l = k >> 2; k = k - (l << 2) | 0; b[h + (e << 16 >> 16 << 1) >> 1] = ((m << 17 >> 17 | 0) == (o | 0) ? m << 1 : o >>> 15 ^ 32767) + (k & 1); if (n) { c[i >> 2] = 1; j = 32767; } e = j << 16 >> 16; b[h + (f << 16 >> 16 << 1) >> 1] = ((j << 17 >> 17 | 0) == (e | 0) ? j << 1 : e >>> 15 ^ 32767) + (k << 16 >> 17); if (p) { c[i >> 2] = 1; a = 32767; } f = a << 16 >> 16; b[h + (g << 16 >> 16 << 1) >> 1] = Rd(l & 65535, ((a << 17 >> 17 | 0) == (f | 0) ? a << 1 : f >>> 15 ^ 32767) & 65535, i) | 0; return } function Ua(a) { a = a | 0; var d = 0, e = 0, f = 0, g = 0; if (!a) { g = -1; return g | 0 } Yd(a + 1168 | 0); b[a + 460 >> 1] = 40; c[a + 1164 >> 2] = 0; d = a + 646 | 0; e = a + 1216 | 0; f = a + 462 | 0; g = f + 22 | 0; do { b[f >> 1] = 0; f = f + 2 | 0; } while ((f | 0) < (g | 0)); db(d, c[e >> 2] | 0) | 0; mb(a + 686 | 0) | 0; ib(a + 700 | 0) | 0; La(a + 608 | 0) | 0; rb(a + 626 | 0, c[e >> 2] | 0) | 0; Ja(a + 484 | 0) | 0; tb(a + 730 | 0) | 0; eb(a + 748 | 0) | 0; Ud(a + 714 | 0) | 0; Va(a, 0) | 0; g = 0; return g | 0 } function Va(a, d) { a = a | 0; d = d | 0; var e = 0, f = 0; if (!a) { a = -1; return a | 0 } c[a + 388 >> 2] = a + 308; Qe(a | 0, 0, 308) | 0; d = (d | 0) != 8; if (d) { e = a + 412 | 0; f = e + 20 | 0; do { b[e >> 1] = 0; e = e + 2 | 0; } while ((e | 0) < (f | 0)); b[a + 392 >> 1] = 3e4; b[a + 394 >> 1] = 26e3; b[a + 396 >> 1] = 21e3; b[a + 398 >> 1] = 15e3; b[a + 400 >> 1] = 8e3; b[a + 402 >> 1] = 0; b[a + 404 >> 1] = -8e3; b[a + 406 >> 1] = -15e3; b[a + 408 >> 1] = -21e3; b[a + 410 >> 1] = -26e3; } b[a + 432 >> 1] = 0; b[a + 434 >> 1] = 40; c[a + 1164 >> 2] = 0; b[a + 436 >> 1] = 0; b[a + 438 >> 1] = 0; b[a + 440 >> 1] = 0; b[a + 460 >> 1] = 40; b[a + 462 >> 1] = 0; b[a + 464 >> 1] = 0; if (d) { e = a + 442 | 0; f = e + 18 | 0; do { b[e >> 1] = 0; e = e + 2 | 0; } while ((e | 0) < (f | 0)); e = a + 466 | 0; f = e + 18 | 0; do { b[e >> 1] = 0; e = e + 2 | 0; } while ((e | 0) < (f | 0)); La(a + 608 | 0) | 0; f = a + 1216 | 0; rb(a + 626 | 0, c[f >> 2] | 0) | 0; db(a + 646 | 0, c[f >> 2] | 0) | 0; mb(a + 686 | 0) | 0; ib(a + 700 | 0) | 0; Ud(a + 714 | 0) | 0; } else { e = a + 466 | 0; f = e + 18 | 0; do { b[e >> 1] = 0; e = e + 2 | 0; } while ((e | 0) < (f | 0)); La(a + 608 | 0) | 0; db(a + 646 | 0, c[a + 1216 >> 2] | 0) | 0; mb(a + 686 | 0) | 0; ib(a + 700 | 0) | 0; } Ja(a + 484 | 0) | 0; b[a + 606 >> 1] = 21845; tb(a + 730 | 0) | 0; if (!d) { a = 0; return a | 0 } eb(a + 748 | 0) | 0; a = 0; return a | 0 } function Wa(d, f, g, h, j, k) { d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; var l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0, O = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0, V = 0, W = 0, X = 0, Y = 0, _ = 0, $ = 0, aa = 0, ba = 0, ca = 0, da = 0, ea = 0, fa = 0, ga = 0, ha = 0, ia = 0, ja = 0, ka = 0, la = 0, ma = 0, na = 0, oa = 0, pa = 0, qa = 0, ra = 0, sa = 0, ta = 0, ua = 0, va = 0, wa = 0, xa = 0, ya = 0, za = 0, Aa = 0, Ba = 0, Ca = 0, Ea = 0, Fa = 0, Ga = 0, Ha = 0, Ja = 0, La = 0, Ta = 0, Ua = 0, Wa = 0, bb = 0, db = 0, eb = 0, ib = 0, mb = 0, pb = 0, rb = 0, tb = 0, xb = 0, yb = 0, zb = 0, Ab = 0, Bb = 0; Bb = i; i = i + 336 | 0; r = Bb + 236 | 0; q = Bb + 216 | 0; zb = Bb + 112 | 0; yb = Bb + 12 | 0; mb = Bb + 256 | 0; rb = Bb + 136 | 0; pb = Bb + 32 | 0; eb = Bb + 8 | 0; ib = Bb + 6 | 0; xb = Bb + 4 | 0; tb = Bb + 2 | 0; Ab = Bb; Ta = d + 1164 | 0; Ua = d + 748 | 0; Wa = hb(Ua, h, Ta) | 0; if (Wa) { Va(d, 8) | 0; fb(Ua, d + 412 | 0, d + 646 | 0, d + 714 | 0, d + 608 | 0, Wa, f, g, d + 1168 | 0, j, k, Ta); Ab = d + 666 | 0; me(Ab, d + 392 | 0, 10, Ta); sb(d + 626 | 0, Ab, Ta); Ab = d + 1156 | 0; c[Ab >> 2] = Wa; i = Bb; return } switch (h | 0) { case 1: { l = 1; x = 6; break } case 2: case 7: { Ia(d + 606 | 0, b[(c[d + 1256 >> 2] | 0) + (f << 1) >> 1] | 0, c[(c[d + 1260 >> 2] | 0) + (f << 2) >> 2] | 0, g, c[d + 1276 >> 2] | 0, Ta); x = 9; break } case 3: { x = 9; break } default: { l = 0; x = 6; } } do if ((x | 0) == 6) { h = d + 440 | 0; if ((b[h >> 1] | 0) == 6) { b[h >> 1] = 5; Ja = 0; La = 0; break } else { b[h >> 1] = 0; Ja = 0; La = 0; break } } else if ((x | 0) == 9) { h = d + 440 | 0; Ja = (e[h >> 1] | 0) + 1 & 65535; b[h >> 1] = Ja << 16 >> 16 > 6 ? 6 : Ja; Ja = 1; La = 1; l = 0; } while (0); Ea = d + 1156 | 0; switch (c[Ea >> 2] | 0) { case 1: { b[h >> 1] = 5; b[d + 436 >> 1] = 0; break } case 2: { b[h >> 1] = 5; b[d + 436 >> 1] = 1; break } default: { } } n = d + 646 | 0; Fa = d + 666 | 0; m = zb; o = Fa; p = m + 20 | 0; do { a[m >> 0] = a[o >> 0] | 0; m = m + 1 | 0; o = o + 1 | 0; } while ((m | 0) < (p | 0)); Ga = (f | 0) != 7; Ha = d + 1168 | 0; if (Ga) { ab(n, f, La, g, Ha, r, Ta); m = d + 392 | 0; ae(m, r, k, Ta); g = g + 6 | 0; } else { cb(n, La, g, Ha, q, r, Ta); m = d + 392 | 0; _d(m, q, r, k, Ta); g = g + 10 | 0; } o = r; p = m + 20 | 0; do { b[m >> 1] = b[o >> 1] | 0; m = m + 2 | 0; o = o + 2 | 0; } while ((m | 0) < (p | 0)); Ca = f >>> 0 > 1; B = f >>> 0 < 4 & 1; Ba = (f | 0) == 5; Aa = Ba ? 10 : 5; Ba = Ba ? 19 : 9; E = d + 434 | 0; F = 143 - Ba & 65535; G = d + 460 | 0; H = d + 462 | 0; I = d + 464 | 0; C = f >>> 0 > 2; J = d + 388 | 0; K = (f | 0) == 0; L = f >>> 0 < 2; M = d + 1244 | 0; N = d + 432 | 0; O = f >>> 0 < 6; P = d + 1168 | 0; Q = (f | 0) == 6; R = La << 16 >> 16 == 0; S = d + 714 | 0; T = d + 686 | 0; U = d + 436 | 0; V = d + 700 | 0; W = (f | 0) == 7; X = d + 482 | 0; Y = f >>> 0 < 3; _ = d + 608 | 0; $ = d + 626 | 0; aa = d + 438 | 0; ba = f >>> 0 < 7; ca = d + 730 | 0; D = Ja ^ 1; da = l << 16 >> 16 != 0; za = da ? La ^ 1 : 0; ea = d + 442 | 0; fa = d + 458 | 0; ga = d + 412 | 0; ha = d + 80 | 0; ia = d + 1236 | 0; ja = d + 1240 | 0; ka = d + 468 | 0; la = d + 466 | 0; ma = d + 470 | 0; na = d + 472 | 0; oa = d + 474 | 0; pa = d + 476 | 0; qa = d + 478 | 0; ra = d + 480 | 0; sa = d + 444 | 0; ta = d + 446 | 0; ua = d + 448 | 0; va = d + 450 | 0; wa = d + 452 | 0; xa = d + 454 | 0; ya = d + 456 | 0; y = 0; z = 0; s = 0; t = 0; A = -1; while (1) { A = (A << 16 >> 16) + 1 | 0; p = A & 65535; z = 1 - (z << 16 >> 16) | 0; v = z & 65535; q = Ca & s << 16 >> 16 == 80 ? 0 : s; u = g + 2 | 0; r = b[g >> 1] | 0; a:do if (Ga) { w = b[E >> 1] | 0; m = (w & 65535) - Aa & 65535; m = m << 16 >> 16 < 20 ? 20 : m; o = (m & 65535) + Ba & 65535; n = o << 16 >> 16 > 143; Ya(r, n ? F : m, n ? 143 : o, q, w, eb, ib, B, Ta); q = b[eb >> 1] | 0; b[G >> 1] = q; if (Ja) { r = b[E >> 1] | 0; if (r << 16 >> 16 < 143) { r = (r & 65535) + 1 & 65535; b[E >> 1] = r; } b[eb >> 1] = r; b[ib >> 1] = 0; if ((b[H >> 1] | 0) != 0 ? !(C | (b[I >> 1] | 0) < 5) : 0) { b[eb >> 1] = q; r = q; q = 0; } else q = 0; } else { r = q; q = b[ib >> 1] | 0; } se(c[J >> 2] | 0, r, q, 40, 1, Ta); if (L) { q = g + 6 | 0; Pa(p, b[g + 4 >> 1] | 0, b[u >> 1] | 0, c[M >> 2] | 0, mb, Ta); g = b[N >> 1] | 0; w = g << 16 >> 16; r = w << 1; if ((r | 0) == (w << 17 >> 16 | 0)) { o = K; break } o = K; r = g << 16 >> 16 > 0 ? 32767 : -32768; break } switch (f | 0) { case 2: { q = g + 6 | 0; Oa(b[g + 4 >> 1] | 0, b[u >> 1] | 0, mb); g = b[N >> 1] | 0; w = g << 16 >> 16; r = w << 1; if ((r | 0) == (w << 17 >> 16 | 0)) { o = K; break a } o = K; r = g << 16 >> 16 > 0 ? 32767 : -32768; break a } case 3: { q = g + 6 | 0; Qa(b[g + 4 >> 1] | 0, b[u >> 1] | 0, mb); g = b[N >> 1] | 0; w = g << 16 >> 16; r = w << 1; if ((r | 0) == (w << 17 >> 16 | 0)) { o = K; break a } o = K; r = g << 16 >> 16 > 0 ? 32767 : -32768; break a } default: { if (O) { q = g + 6 | 0; Ra(b[g + 4 >> 1] | 0, b[u >> 1] | 0, c[P >> 2] | 0, mb); g = b[N >> 1] | 0; w = g << 16 >> 16; r = w << 1; if ((r | 0) == (w << 17 >> 16 | 0)) { o = K; break a } o = K; r = g << 16 >> 16 > 0 ? 32767 : -32768; break a } if (!Q) { o = K; x = 44; break a } Sa(u, mb, Ta); r = g + 16 | 0; g = b[N >> 1] | 0; w = g << 16 >> 16; p = w << 1; if ((p | 0) == (w << 17 >> 16 | 0)) { q = r; o = K; r = p; break a } q = r; o = K; r = g << 16 >> 16 > 0 ? 32767 : -32768; break a } } } else { Za(r, 18, 143, q, eb, ib, Ta); if (R ? q << 16 >> 16 == 0 | r << 16 >> 16 < 61 : 0) { r = b[eb >> 1] | 0; q = b[ib >> 1] | 0; } else { b[G >> 1] = b[eb >> 1] | 0; r = b[E >> 1] | 0; b[eb >> 1] = r; b[ib >> 1] = 0; q = 0; } se(c[J >> 2] | 0, r, q, 40, 0, Ta); o = 0; x = 44; } while (0); if ((x | 0) == 44) { x = 0; if (Ja) lb(T, b[h >> 1] | 0, xb, Ta); else b[xb >> 1] = $a(f, b[u >> 1] | 0, c[ja >> 2] | 0) | 0; nb(T, La, b[U >> 1] | 0, xb, Ta); Na(g + 4 | 0, mb, c[P >> 2] | 0); r = g + 24 | 0; g = b[xb >> 1] | 0; w = g << 16 >> 16; p = w << 1; if ((p | 0) == (w << 17 >> 16 | 0)) { q = r; r = p; } else { q = r; r = g << 16 >> 16 > 0 ? 32767 : -32768; } } g = b[eb >> 1] | 0; b:do if (g << 16 >> 16 < 40) { m = r << 16 >> 16; n = g; r = g << 16 >> 16; while (1) { p = mb + (r << 1) | 0; g = (Z(b[mb + (r - (n << 16 >> 16) << 1) >> 1] | 0, m) | 0) >> 15; if ((g | 0) > 32767) { c[Ta >> 2] = 1; g = 32767; } w = g & 65535; b[Ab >> 1] = w; b[p >> 1] = Rd(b[p >> 1] | 0, w, Ta) | 0; r = r + 1 | 0; if ((r & 65535) << 16 >> 16 == 40) break b; n = b[eb >> 1] | 0; } } while (0); c:do if (o) { o = (z & 65535 | 0) == 0; if (o) { g = q; p = t; } else { g = q + 2 | 0; p = b[q >> 1] | 0; } if (R) Xa(S, f, p, mb, v, xb, tb, Ha, Ta); else { lb(T, b[h >> 1] | 0, xb, Ta); jb(V, S, b[h >> 1] | 0, tb, Ta); } nb(T, La, b[U >> 1] | 0, xb, Ta); kb(V, La, b[U >> 1] | 0, tb, Ta); q = b[xb >> 1] | 0; r = q << 16 >> 16 > 13017 ? 13017 : q; if (o) x = 80; else w = p; } else { g = q + 2 | 0; r = b[q >> 1] | 0; switch (f | 0) { case 1: case 2: case 3: case 4: case 6: { if (R) Xa(S, f, r, mb, v, xb, tb, Ha, Ta); else { lb(T, b[h >> 1] | 0, xb, Ta); jb(V, S, b[h >> 1] | 0, tb, Ta); } nb(T, La, b[U >> 1] | 0, xb, Ta); kb(V, La, b[U >> 1] | 0, tb, Ta); q = b[xb >> 1] | 0; r = q << 16 >> 16 > 13017 ? 13017 : q; if (!Q) { p = t; x = 80; break c } if ((b[E >> 1] | 0) <= 45) { p = t; x = 80; break c } p = t; r = r << 16 >> 16 >>> 2 & 65535; x = 80; break c } case 5: { if (Ja) lb(T, b[h >> 1] | 0, xb, Ta); else b[xb >> 1] = $a(5, r, c[ja >> 2] | 0) | 0; nb(T, La, b[U >> 1] | 0, xb, Ta); if (R) _a(S, 5, b[g >> 1] | 0, mb, c[ia >> 2] | 0, tb, Ta); else jb(V, S, b[h >> 1] | 0, tb, Ta); kb(V, La, b[U >> 1] | 0, tb, Ta); r = b[xb >> 1] | 0; g = q + 4 | 0; q = r; p = t; r = r << 16 >> 16 > 13017 ? 13017 : r; x = 80; break c } default: { if (R) _a(S, f, r, mb, c[ia >> 2] | 0, tb, Ta); else jb(V, S, b[h >> 1] | 0, tb, Ta); kb(V, La, b[U >> 1] | 0, tb, Ta); r = b[xb >> 1] | 0; q = r; p = t; x = 80; break c } } } while (0); if ((x | 0) == 80) { x = 0; b[N >> 1] = q << 16 >> 16 > 13017 ? 13017 : q; w = p; } r = r << 16 >> 16; r = (r << 17 >> 17 | 0) == (r | 0) ? r << 1 : r >>> 15 ^ 32767; v = (r & 65535) << 16 >> 16 > 16384; d:do if (v) { u = r << 16 >> 16; if (W) q = 0; else { q = 0; while (1) { r = (Z(b[(c[J >> 2] | 0) + (q << 1) >> 1] | 0, u) | 0) >> 15; if ((r | 0) > 32767) { c[Ta >> 2] = 1; r = 32767; } b[Ab >> 1] = r; r = Z(b[xb >> 1] | 0, r << 16 >> 16) | 0; if ((r | 0) == 1073741824) { c[Ta >> 2] = 1; r = 2147483647; } else r = r << 1; b[rb + (q << 1) >> 1] = Ce(r, Ta) | 0; q = q + 1 | 0; if ((q | 0) == 40) break d } } do { r = (Z(b[(c[J >> 2] | 0) + (q << 1) >> 1] | 0, u) | 0) >> 15; if ((r | 0) > 32767) { c[Ta >> 2] = 1; r = 32767; } b[Ab >> 1] = r; r = Z(b[xb >> 1] | 0, r << 16 >> 16) | 0; if ((r | 0) != 1073741824) { r = r << 1; if ((r | 0) < 0) r = ~((r ^ -2) >> 1); else x = 88; } else { c[Ta >> 2] = 1; r = 2147483647; x = 88; } if ((x | 0) == 88) { x = 0; r = r >> 1; } b[rb + (q << 1) >> 1] = Ce(r, Ta) | 0; q = q + 1 | 0; } while ((q | 0) != 40) } while (0); if (R) { b[la >> 1] = b[ka >> 1] | 0; b[ka >> 1] = b[ma >> 1] | 0; b[ma >> 1] = b[na >> 1] | 0; b[na >> 1] = b[oa >> 1] | 0; b[oa >> 1] = b[pa >> 1] | 0; b[pa >> 1] = b[qa >> 1] | 0; b[qa >> 1] = b[ra >> 1] | 0; b[ra >> 1] = b[X >> 1] | 0; b[X >> 1] = b[xb >> 1] | 0; } if ((Ja | (b[U >> 1] | 0) != 0 ? Y & (b[H >> 1] | 0) != 0 : 0) ? (bb = b[xb >> 1] | 0, bb << 16 >> 16 > 12288) : 0) { x = (((bb << 16 >> 16) + 118784 | 0) >>> 1) + 12288 & 65535; b[xb >> 1] = x << 16 >> 16 > 14745 ? 14745 : x; } qb(zb, Fa, s, yb, Ta); r = Ma(_, f, b[tb >> 1] | 0, yb, $, La, b[U >> 1] | 0, l, b[aa >> 1] | 0, b[H >> 1] | 0, b[I >> 1] | 0, Ta) | 0; switch (f | 0) { case 0: case 1: case 2: case 3: case 6: { p = b[xb >> 1] | 0; u = 1; break } default: { r = b[tb >> 1] | 0; p = b[xb >> 1] | 0; if (ba) u = 1; else { q = p << 16 >> 16; if (p << 16 >> 16 < 0) q = ~((q ^ -2) >> 1); else q = q >>> 1; p = q & 65535; u = 2; } } } m = p << 16 >> 16; s = u & 65535; q = c[J >> 2] | 0; t = 0; do { q = q + (t << 1) | 0; b[pb + (t << 1) >> 1] = b[q >> 1] | 0; q = Z(b[q >> 1] | 0, m) | 0; if ((q | 0) == 1073741824) { c[Ta >> 2] = 1; n = 2147483647; } else n = q << 1; o = Z(b[tb >> 1] | 0, b[mb + (t << 1) >> 1] | 0) | 0; if ((o | 0) != 1073741824) { q = (o << 1) + n | 0; if ((o ^ n | 0) > 0 & (q ^ n | 0) < 0) { c[Ta >> 2] = 1; q = (n >>> 31) + 2147483647 | 0; } } else { c[Ta >> 2] = 1; q = 2147483647; } x = q << s; x = Ce((x >> s | 0) == (q | 0) ? x : q >> 31 ^ 2147483647, Ta) | 0; q = c[J >> 2] | 0; b[q + (t << 1) >> 1] = x; t = t + 1 | 0; } while ((t | 0) != 40); vb(ca); if ((Y ? (b[I >> 1] | 0) > 3 : 0) ? !((b[H >> 1] | 0) == 0 | D) : 0) ub(ca); wb(ca, f, pb, r, b[xb >> 1] | 0, mb, p, u, Ha, Ta); r = 0; o = 0; do { q = b[pb + (o << 1) >> 1] | 0; q = Z(q, q) | 0; if ((q | 0) != 1073741824) { p = (q << 1) + r | 0; if ((q ^ r | 0) > 0 & (p ^ r | 0) < 0) { c[Ta >> 2] = 1; r = (r >>> 31) + 2147483647 | 0; } else r = p; } else { c[Ta >> 2] = 1; r = 2147483647; } o = o + 1 | 0; } while ((o | 0) != 40); if ((r | 0) < 0) r = ~((r ^ -2) >> 1); else r = r >> 1; r = Fe(r, Ab, Ta) | 0; p = ((b[Ab >> 1] | 0) >>> 1) + 15 | 0; q = p & 65535; p = p << 16 >> 16; if (q << 16 >> 16 > 0) if (q << 16 >> 16 < 31) { r = r >> p; x = 135; } else { r = 0; x = 137; } else { u = 0 - p << 16 >> 16; x = r << u; r = (x >> u | 0) == (r | 0) ? x : r >> 31 ^ 2147483647; x = 135; } if ((x | 0) == 135) { x = 0; if ((r | 0) < 0) r = ~((r ^ -4) >> 2); else x = 137; } if ((x | 0) == 137) { x = 0; r = r >>> 2; } r = r & 65535; do if (Y ? (db = b[I >> 1] | 0, db << 16 >> 16 > 5) : 0) if (b[H >> 1] | 0) if ((b[h >> 1] | 0) < 4) { if (da) { if (!(Ja | (b[aa >> 1] | 0) != 0)) x = 145; } else if (!Ja) x = 145; if ((x | 0) == 145 ? (0, (b[U >> 1] | 0) == 0) : 0) { x = 147; break } ob(pb, r, ea, db, b[U >> 1] | 0, za, Ta) | 0; x = 147; } else x = 147; else x = 151; else x = 147; while (0); do if ((x | 0) == 147) { x = 0; if (b[H >> 1] | 0) { if (!Ja ? (b[U >> 1] | 0) == 0 : 0) { x = 151; break } if ((b[h >> 1] | 0) >= 4) x = 151; } else x = 151; } while (0); if ((x | 0) == 151) { x = 0; b[ea >> 1] = b[sa >> 1] | 0; b[sa >> 1] = b[ta >> 1] | 0; b[ta >> 1] = b[ua >> 1] | 0; b[ua >> 1] = b[va >> 1] | 0; b[va >> 1] = b[wa >> 1] | 0; b[wa >> 1] = b[xa >> 1] | 0; b[xa >> 1] = b[ya >> 1] | 0; b[ya >> 1] = b[fa >> 1] | 0; b[fa >> 1] = r; } if (v) { r = 0; do { v = rb + (r << 1) | 0; b[v >> 1] = Rd(b[v >> 1] | 0, b[pb + (r << 1) >> 1] | 0, Ta) | 0; r = r + 1 | 0; } while ((r | 0) != 40); Da(pb, rb, 40, Ta); c[Ta >> 2] = 0; He(k, rb, j + (y << 1) | 0, 40, ga, 0); } else { c[Ta >> 2] = 0; He(k, pb, j + (y << 1) | 0, 40, ga, 0); } if (!(c[Ta >> 2] | 0)) Pe(ga | 0, j + (y + 30 << 1) | 0, 20) | 0; else { p = 193; while (1) { q = d + (p << 1) | 0; v = b[q >> 1] | 0; r = v << 16 >> 16; if (v << 16 >> 16 < 0) r = ~((r ^ -4) >> 2); else r = r >>> 2; b[q >> 1] = r; if ((p | 0) > 0) p = p + -1 | 0; else { p = 39; break } } while (1) { q = pb + (p << 1) | 0; v = b[q >> 1] | 0; r = v << 16 >> 16; if (v << 16 >> 16 < 0) r = ~((r ^ -4) >> 2); else r = r >>> 2; b[q >> 1] = r; if ((p | 0) > 0) p = p + -1 | 0; else break } He(k, pb, j + (y << 1) | 0, 40, ga, 1); } Pe(d | 0, ha | 0, 308) | 0; b[E >> 1] = b[eb >> 1] | 0; r = y + 40 | 0; s = r & 65535; if (s << 16 >> 16 >= 160) break; else { y = r << 16 >> 16; k = k + 22 | 0; t = w; } } b[H >> 1] = Ka(d + 484 | 0, d + 466 | 0, j, I, Ta) | 0; gb(Ua, Fa, j, Ta); b[U >> 1] = La; b[aa >> 1] = l; sb(d + 626 | 0, Fa, Ta); Ab = Ea; c[Ab >> 2] = Wa; i = Bb; return } function Xa(a, d, f, g, h, j, k, l, m) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; var n = 0, o = 0, p = 0, q = 0, r = 0; r = i; i = i + 16 | 0; p = r + 2 | 0; q = r; f = f << 16 >> 16; f = (f << 18 >> 18 | 0) == (f | 0) ? f << 2 : f >>> 15 ^ 32767; switch (d | 0) { case 3: case 4: case 6: { o = f << 16 >> 16; f = c[l + 84 >> 2] | 0; b[j >> 1] = b[f + (o << 1) >> 1] | 0; l = b[f + (o + 1 << 1) >> 1] | 0; n = b[f + (o + 3 << 1) >> 1] | 0; j = b[f + (o + 2 << 1) >> 1] | 0; break } case 0: { l = (f & 65535) + (h << 16 >> 16 << 1 ^ 2) | 0; l = (l & 65535) << 16 >> 16 > 1022 ? 1022 : l << 16 >> 16; b[j >> 1] = b[782 + (l << 1) >> 1] | 0; j = b[782 + (l + 1 << 1) >> 1] | 0; de(j << 16 >> 16, q, p, m); b[q >> 1] = (e[q >> 1] | 0) + 65524; l = Ee(b[p >> 1] | 0, 5, m) | 0; o = b[q >> 1] | 0; o = Rd(l, ((o << 26 >> 26 | 0) == (o | 0) ? o << 10 : o >>> 15 ^ 32767) & 65535, m) | 0; l = b[p >> 1] | 0; f = b[q >> 1] | 0; if ((f * 24660 | 0) == 1073741824) { c[m >> 2] = 1; h = 2147483647; } else h = f * 49320 | 0; n = (l << 16 >> 16) * 24660 >> 15; f = h + (n << 1) | 0; if ((h ^ n | 0) > 0 & (f ^ h | 0) < 0) { c[m >> 2] = 1; f = (h >>> 31) + 2147483647 | 0; } n = f << 13; l = j; n = Ce((n >> 13 | 0) == (f | 0) ? n : f >> 31 ^ 2147483647, m) | 0; j = o; break } default: { o = f << 16 >> 16; f = c[l + 80 >> 2] | 0; b[j >> 1] = b[f + (o << 1) >> 1] | 0; l = b[f + (o + 1 << 1) >> 1] | 0; n = b[f + (o + 3 << 1) >> 1] | 0; j = b[f + (o + 2 << 1) >> 1] | 0; } } Vd(a, d, g, q, p, 0, 0, m); h = Z((re(14, b[p >> 1] | 0, m) | 0) << 16 >> 16, l << 16 >> 16) | 0; if ((h | 0) == 1073741824) { c[m >> 2] = 1; f = 2147483647; } else f = h << 1; l = 10 - (e[q >> 1] | 0) | 0; h = l & 65535; l = l << 16 >> 16; if (h << 16 >> 16 > 0) { q = h << 16 >> 16 < 31 ? f >> l : 0; q = q >>> 16; q = q & 65535; b[k >> 1] = q; Wd(a, j, n); i = r; return } else { m = 0 - l << 16 >> 16; q = f << m; q = (q >> m | 0) == (f | 0) ? q : f >> 31 ^ 2147483647; q = q >>> 16; q = q & 65535; b[k >> 1] = q; Wd(a, j, n); i = r; return } } function Ya(a, d, e, f, g, h, i, j, k) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; j = j | 0; k = k | 0; if (!(f << 16 >> 16)) { j = a << 16 >> 16; if (a << 16 >> 16 >= 197) { b[h >> 1] = j + 65424; b[i >> 1] = 0; return } g = ((j << 16) + 131072 >> 16) * 10923 >> 15; if ((g | 0) > 32767) { c[k >> 2] = 1; g = 32767; } a = (g & 65535) + 19 | 0; b[h >> 1] = a; b[i >> 1] = j + 58 - ((a * 196608 | 0) >>> 16); return } if (!(j << 16 >> 16)) { k = a << 16 >> 16 << 16; a = ((k + 131072 >> 16) * 21846 | 0) + -65536 >> 16; b[h >> 1] = a + (d & 65535); b[i >> 1] = ((k + -131072 | 0) >>> 16) - ((a * 196608 | 0) >>> 16); return } if ((Ge(g, d, k) | 0) << 16 >> 16 > 5) g = (d & 65535) + 5 & 65535; j = e << 16 >> 16; j = (j - (g & 65535) & 65535) << 16 >> 16 > 4 ? j + 65532 & 65535 : g; g = a << 16 >> 16; if (a << 16 >> 16 < 4) { b[h >> 1] = ((((j & 65535) << 16) + -327680 | 0) >>> 16) + g; b[i >> 1] = 0; return } g = g << 16; if (a << 16 >> 16 < 12) { k = (((g + -327680 >> 16) * 10923 | 0) >>> 15 << 16) + -65536 | 0; a = k >> 16; b[h >> 1] = (j & 65535) + a; b[i >> 1] = ((g + -589824 | 0) >>> 16) - (k >>> 15) - a; return } else { b[h >> 1] = ((g + -786432 + ((j & 65535) << 16) | 0) >>> 16) + 1; b[i >> 1] = 0; return } } function Za(a, c, d, f, g, h, i) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; if (f << 16 >> 16) { i = (e[g >> 1] | 0) + 65531 | 0; i = (i << 16 >> 16 | 0) < (c << 16 >> 16 | 0) ? c : i & 65535; d = d << 16 >> 16; c = a << 16 >> 16 << 16; a = ((c + 327680 >> 16) * 10924 | 0) + -65536 >> 16; b[g >> 1] = (((((i & 65535) << 16) + 589824 >> 16 | 0) > (d | 0) ? d + 65527 & 65535 : i) & 65535) + a; b[h >> 1] = ((c + -196608 | 0) >>> 16) - ((a * 393216 | 0) >>> 16); return } f = a << 16 >> 16; if (a << 16 >> 16 < 463) { a = ((((f << 16) + 327680 >> 16) * 10924 | 0) >>> 16) + 17 | 0; b[g >> 1] = a; b[h >> 1] = f + 105 - ((a * 393216 | 0) >>> 16); return } else { b[g >> 1] = f + 65168; b[h >> 1] = 0; return } } function _a(a, d, e, f, g, h, j) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; var k = 0, l = 0, m = 0, n = 0; n = i; i = i + 16 | 0; l = n + 6 | 0; k = n + 4 | 0; Vd(a, d, f, l, k, n + 2 | 0, n, j); m = (e & 31) * 3 | 0; f = g + (m << 1) | 0; if (!((Ge(d & 65535, 7, j) | 0) << 16 >> 16)) { l = re(b[l >> 1] | 0, b[k >> 1] | 0, j) | 0; k = l << 16 >> 16; k = (Z(((l << 20 >> 20 | 0) == (k | 0) ? l << 4 : k >>> 15 ^ 32767) << 16 >> 16, b[f >> 1] | 0) | 0) >> 15; if ((k | 0) > 32767) { c[j >> 2] = 1; k = 32767; } f = k << 16; e = f >> 16; if ((k << 17 >> 17 | 0) == (e | 0)) k = f >> 15; else k = e >>> 15 ^ 32767; } else { e = re(14, b[k >> 1] | 0, j) | 0; e = Z(e << 16 >> 16, b[f >> 1] | 0) | 0; if ((e | 0) == 1073741824) { c[j >> 2] = 1; f = 2147483647; } else f = e << 1; e = Ge(9, b[l >> 1] | 0, j) | 0; k = e << 16 >> 16; if (e << 16 >> 16 > 0) k = e << 16 >> 16 < 31 ? f >> k : 0; else { j = 0 - k << 16 >> 16; k = f << j; k = (k >> j | 0) == (f | 0) ? k : f >> 31 ^ 2147483647; } k = k >>> 16; } b[h >> 1] = k; Wd(a, b[g + (m + 1 << 1) >> 1] | 0, b[g + (m + 2 << 1) >> 1] | 0); i = n; return } function $a(a, c, d) { a = a | 0; c = c | 0; d = d | 0; c = b[d + (c << 16 >> 16 << 1) >> 1] | 0; if ((a | 0) != 7) { a = c; return a | 0 } a = c & 65532; return a | 0 } function ab(d, e, f, g, h, j, k) { d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; var l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0; v = i; i = i + 48 | 0; r = v + 20 | 0; u = v; t = c[h + 44 >> 2] | 0; s = c[h + 64 >> 2] | 0; l = c[h + 4 >> 2] | 0; q = c[h + 12 >> 2] | 0; n = c[h + 20 >> 2] | 0; m = c[h + 56 >> 2] | 0; if (!(f << 16 >> 16)) { o = e >>> 0 < 2; if (o) { f = 765; p = 508; n = c[h + 52 >> 2] | 0; } else { h = (e | 0) == 5; f = h ? 1533 : 765; p = 2044; l = h ? m : l; } m = b[g >> 1] | 0; f = ((m * 196608 >> 16 | 0) > (f & 65535 | 0) ? f : m * 3 & 65535) << 16 >> 16; m = b[l + (f << 1) >> 1] | 0; b[r >> 1] = m; b[r + 2 >> 1] = b[l + (f + 1 << 1) >> 1] | 0; b[r + 4 >> 1] = b[l + (f + 2 << 1) >> 1] | 0; f = b[g + 2 >> 1] | 0; if (o) f = f << 16 >> 16 << 1 & 65535; o = (f << 16 >> 16) * 196608 | 0; o = (o | 0) > 100466688 ? 1533 : o >> 16; b[r + 6 >> 1] = b[q + (o << 1) >> 1] | 0; b[r + 8 >> 1] = b[q + (o + 1 << 1) >> 1] | 0; b[r + 10 >> 1] = b[q + (o + 2 << 1) >> 1] | 0; g = b[g + 4 >> 1] | 0; g = ((g << 18 >> 16 | 0) > (p & 65535 | 0) ? p : g << 2 & 65535) << 16 >> 16; b[r + 12 >> 1] = b[n + (g << 1) >> 1] | 0; b[r + 14 >> 1] = b[n + ((g | 1) << 1) >> 1] | 0; b[r + 16 >> 1] = b[n + ((g | 2) << 1) >> 1] | 0; b[r + 18 >> 1] = b[n + ((g | 3) << 1) >> 1] | 0; if ((e | 0) == 8) { f = 0; while (1) { s = d + (f << 1) | 0; b[u + (f << 1) >> 1] = Rd(m, Rd(b[t + (f << 1) >> 1] | 0, b[s >> 1] | 0, k) | 0, k) | 0; b[s >> 1] = m; f = f + 1 | 0; if ((f | 0) == 10) break; m = b[r + (f << 1) >> 1] | 0; } Ae(u, 205, 10, k); l = d + 20 | 0; m = u; f = l + 20 | 0; do { a[l >> 0] = a[m >> 0] | 0; l = l + 1 | 0; m = m + 1 | 0; } while ((l | 0) < (f | 0)); me(u, j, 10, k); i = v; return } else l = 0; do { m = d + (l << 1) | 0; f = (Z(b[s + (l << 1) >> 1] | 0, b[m >> 1] | 0) | 0) >> 15; if ((f | 0) > 32767) { c[k >> 2] = 1; f = 32767; } g = Rd(b[t + (l << 1) >> 1] | 0, f & 65535, k) | 0; e = b[r + (l << 1) >> 1] | 0; b[u + (l << 1) >> 1] = Rd(e, g, k) | 0; b[m >> 1] = e; l = l + 1 | 0; } while ((l | 0) != 10); Ae(u, 205, 10, k); l = d + 20 | 0; m = u; f = l + 20 | 0; do { a[l >> 0] = a[m >> 0] | 0; l = l + 1 | 0; m = m + 1 | 0; } while ((l | 0) < (f | 0)); me(u, j, 10, k); i = v; return } else { l = 0; do { f = (b[d + 20 + (l << 1) >> 1] | 0) * 29491 >> 15; if ((f | 0) > 32767) { c[k >> 2] = 1; f = 32767; } m = (b[t + (l << 1) >> 1] | 0) * 3277 >> 15; if ((m | 0) > 32767) { c[k >> 2] = 1; m = 32767; } b[u + (l << 1) >> 1] = Rd(m & 65535, f & 65535, k) | 0; l = l + 1 | 0; } while ((l | 0) != 10); if ((e | 0) == 8) { l = 0; do { s = d + (l << 1) | 0; r = Rd(b[t + (l << 1) >> 1] | 0, b[s >> 1] | 0, k) | 0; b[s >> 1] = Ge(b[u + (l << 1) >> 1] | 0, r, k) | 0; l = l + 1 | 0; } while ((l | 0) != 10); Ae(u, 205, 10, k); l = d + 20 | 0; m = u; f = l + 20 | 0; do { a[l >> 0] = a[m >> 0] | 0; l = l + 1 | 0; m = m + 1 | 0; } while ((l | 0) < (f | 0)); me(u, j, 10, k); i = v; return } else l = 0; do { m = d + (l << 1) | 0; f = (Z(b[s + (l << 1) >> 1] | 0, b[m >> 1] | 0) | 0) >> 15; if ((f | 0) > 32767) { c[k >> 2] = 1; f = 32767; } r = Rd(b[t + (l << 1) >> 1] | 0, f & 65535, k) | 0; b[m >> 1] = Ge(b[u + (l << 1) >> 1] | 0, r, k) | 0; l = l + 1 | 0; } while ((l | 0) != 10); Ae(u, 205, 10, k); l = d + 20 | 0; m = u; f = l + 20 | 0; do { a[l >> 0] = a[m >> 0] | 0; l = l + 1 | 0; m = m + 1 | 0; } while ((l | 0) < (f | 0)); me(u, j, 10, k); i = v; return } } function bb(a, b, c) { a = a | 0; b = b | 0; c = c | 0; Pe(a | 0, c + ((b << 16 >> 16) * 10 << 1) | 0, 20) | 0; return } function cb(d, e, f, g, h, j, k) { d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; var l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0; v = i; i = i + 80 | 0; q = v + 60 | 0; r = v + 40 | 0; t = v + 20 | 0; u = v; s = c[g + 48 >> 2] | 0; n = c[g + 24 >> 2] | 0; o = c[g + 28 >> 2] | 0; p = c[g + 32 >> 2] | 0; if (e << 16 >> 16) { l = 0; do { q = s + (l << 1) | 0; f = Rd(((b[q >> 1] | 0) * 1639 | 0) >>> 15 & 65535, ((b[d + 20 + (l << 1) >> 1] | 0) * 31128 | 0) >>> 15 & 65535, k) | 0; b[t + (l << 1) >> 1] = f; b[u + (l << 1) >> 1] = f; r = d + (l << 1) | 0; b[r >> 1] = Ge(f, Rd(b[q >> 1] | 0, ((b[r >> 1] | 0) * 21299 | 0) >>> 15 & 65535, k) | 0, k) | 0; l = l + 1 | 0; } while ((l | 0) != 10); Ae(t, 205, 10, k); Ae(u, 205, 10, k); l = d + 20 | 0; g = u; e = l + 20 | 0; do { a[l >> 0] = a[g >> 0] | 0; l = l + 1 | 0; g = g + 1 | 0; } while ((l | 0) < (e | 0)); me(t, h, 10, k); me(u, j, 10, k); i = v; return } e = c[g + 16 >> 2] | 0; g = c[g + 8 >> 2] | 0; m = b[f >> 1] | 0; m = ((m << 18 >> 18 | 0) == (m | 0) ? m << 2 : m >>> 15 ^ 32767) << 16 >> 16; b[q >> 1] = b[g + (m << 1) >> 1] | 0; b[q + 2 >> 1] = b[g + (m + 1 << 1) >> 1] | 0; b[r >> 1] = b[g + (m + 2 << 1) >> 1] | 0; b[r + 2 >> 1] = b[g + (m + 3 << 1) >> 1] | 0; m = b[f + 2 >> 1] | 0; m = ((m << 18 >> 18 | 0) == (m | 0) ? m << 2 : m >>> 15 ^ 32767) << 16 >> 16; b[q + 4 >> 1] = b[e + (m << 1) >> 1] | 0; b[q + 6 >> 1] = b[e + (m + 1 << 1) >> 1] | 0; b[r + 4 >> 1] = b[e + (m + 2 << 1) >> 1] | 0; b[r + 6 >> 1] = b[e + (m + 3 << 1) >> 1] | 0; m = b[f + 4 >> 1] | 0; g = m << 16 >> 16; if (m << 16 >> 16 < 0) e = ~((g ^ -2) >> 1); else e = g >>> 1; m = e << 16 >> 16; m = ((e << 18 >> 18 | 0) == (m | 0) ? e << 2 : m >>> 15 ^ 32767) << 16 >> 16; l = n + (m + 1 << 1) | 0; e = b[n + (m << 1) >> 1] | 0; if (!(g & 1)) { b[q + 8 >> 1] = e; b[q + 10 >> 1] = b[l >> 1] | 0; b[r + 8 >> 1] = b[n + (m + 2 << 1) >> 1] | 0; b[r + 10 >> 1] = b[n + (m + 3 << 1) >> 1] | 0; } else { if (e << 16 >> 16 == -32768) e = 32767; else e = 0 - (e & 65535) & 65535; b[q + 8 >> 1] = e; e = b[l >> 1] | 0; if (e << 16 >> 16 == -32768) e = 32767; else e = 0 - (e & 65535) & 65535; b[q + 10 >> 1] = e; e = b[n + (m + 2 << 1) >> 1] | 0; if (e << 16 >> 16 == -32768) e = 32767; else e = 0 - (e & 65535) & 65535; b[r + 8 >> 1] = e; e = b[n + (m + 3 << 1) >> 1] | 0; if (e << 16 >> 16 == -32768) e = 32767; else e = 0 - (e & 65535) & 65535; b[r + 10 >> 1] = e; } l = b[f + 6 >> 1] | 0; l = ((l << 18 >> 18 | 0) == (l | 0) ? l << 2 : l >>> 15 ^ 32767) << 16 >> 16; b[q + 12 >> 1] = b[o + (l << 1) >> 1] | 0; b[q + 14 >> 1] = b[o + (l + 1 << 1) >> 1] | 0; b[r + 12 >> 1] = b[o + (l + 2 << 1) >> 1] | 0; b[r + 14 >> 1] = b[o + (l + 3 << 1) >> 1] | 0; l = b[f + 8 >> 1] | 0; l = ((l << 18 >> 18 | 0) == (l | 0) ? l << 2 : l >>> 15 ^ 32767) << 16 >> 16; b[q + 16 >> 1] = b[p + (l << 1) >> 1] | 0; b[q + 18 >> 1] = b[p + (l + 1 << 1) >> 1] | 0; b[r + 16 >> 1] = b[p + (l + 2 << 1) >> 1] | 0; b[r + 18 >> 1] = b[p + (l + 3 << 1) >> 1] | 0; l = 0; do { g = d + (l << 1) | 0; e = (b[g >> 1] | 0) * 21299 >> 15; if ((e | 0) > 32767) { c[k >> 2] = 1; e = 32767; } p = Rd(b[s + (l << 1) >> 1] | 0, e & 65535, k) | 0; b[t + (l << 1) >> 1] = Rd(b[q + (l << 1) >> 1] | 0, p, k) | 0; f = b[r + (l << 1) >> 1] | 0; b[u + (l << 1) >> 1] = Rd(f, p, k) | 0; b[g >> 1] = f; l = l + 1 | 0; } while ((l | 0) != 10); Ae(t, 205, 10, k); Ae(u, 205, 10, k); l = d + 20 | 0; g = u; e = l + 20 | 0; do { a[l >> 0] = a[g >> 0] | 0; l = l + 1 | 0; g = g + 1 | 0; } while ((l | 0) < (e | 0)); me(t, h, 10, k); me(u, j, 10, k); i = v; return } function db(a, c) { a = a | 0; c = c | 0; var d = 0, e = 0; if (!a) { e = -1; return e | 0 } d = a; e = d + 20 | 0; do { b[d >> 1] = 0; d = d + 2 | 0; } while ((d | 0) < (e | 0)); Pe(a + 20 | 0, c | 0, 20) | 0; e = 0; return e | 0 } function eb(d) { d = d | 0; var e = 0, f = 0, g = 0, h = 0, i = 0; if (!d) { i = -1; return i | 0 } b[d >> 1] = 0; b[d + 2 >> 1] = 8192; e = d + 4 | 0; b[e >> 1] = 3500; b[d + 6 >> 1] = 3500; c[d + 8 >> 2] = 1887529304; b[d + 12 >> 1] = 3e4; b[d + 14 >> 1] = 26e3; b[d + 16 >> 1] = 21e3; b[d + 18 >> 1] = 15e3; b[d + 20 >> 1] = 8e3; b[d + 22 >> 1] = 0; b[d + 24 >> 1] = -8e3; b[d + 26 >> 1] = -15e3; b[d + 28 >> 1] = -21e3; b[d + 30 >> 1] = -26e3; b[d + 32 >> 1] = 3e4; b[d + 34 >> 1] = 26e3; b[d + 36 >> 1] = 21e3; b[d + 38 >> 1] = 15e3; b[d + 40 >> 1] = 8e3; b[d + 42 >> 1] = 0; b[d + 44 >> 1] = -8e3; b[d + 46 >> 1] = -15e3; b[d + 48 >> 1] = -21e3; b[d + 50 >> 1] = -26e3; b[d + 212 >> 1] = 0; b[d + 374 >> 1] = 0; b[d + 392 >> 1] = 0; f = d + 52 | 0; b[f >> 1] = 1384; b[d + 54 >> 1] = 2077; b[d + 56 >> 1] = 3420; b[d + 58 >> 1] = 5108; b[d + 60 >> 1] = 6742; b[d + 62 >> 1] = 8122; b[d + 64 >> 1] = 9863; b[d + 66 >> 1] = 11092; b[d + 68 >> 1] = 12714; b[d + 70 >> 1] = 13701; g = d + 72 | 0; h = f; i = g + 20 | 0; do { a[g >> 0] = a[h >> 0] | 0; g = g + 1 | 0; h = h + 1 | 0; } while ((g | 0) < (i | 0)); g = d + 92 | 0; h = f; i = g + 20 | 0; do { a[g >> 0] = a[h >> 0] | 0; g = g + 1 | 0; h = h + 1 | 0; } while ((g | 0) < (i | 0)); g = d + 112 | 0; h = f; i = g + 20 | 0; do { a[g >> 0] = a[h >> 0] | 0; g = g + 1 | 0; h = h + 1 | 0; } while ((g | 0) < (i | 0)); g = d + 132 | 0; h = f; i = g + 20 | 0; do { a[g >> 0] = a[h >> 0] | 0; g = g + 1 | 0; h = h + 1 | 0; } while ((g | 0) < (i | 0)); g = d + 152 | 0; h = f; i = g + 20 | 0; do { a[g >> 0] = a[h >> 0] | 0; g = g + 1 | 0; h = h + 1 | 0; } while ((g | 0) < (i | 0)); g = d + 172 | 0; h = f; i = g + 20 | 0; do { a[g >> 0] = a[h >> 0] | 0; g = g + 1 | 0; h = h + 1 | 0; } while ((g | 0) < (i | 0)); g = d + 192 | 0; h = f; i = g + 20 | 0; do { a[g >> 0] = a[h >> 0] | 0; g = g + 1 | 0; h = h + 1 | 0; } while ((g | 0) < (i | 0)); Qe(d + 214 | 0, 0, 160) | 0; b[d + 376 >> 1] = 3500; b[d + 378 >> 1] = 3500; i = b[e >> 1] | 0; b[d + 380 >> 1] = i; b[d + 382 >> 1] = i; b[d + 384 >> 1] = i; b[d + 386 >> 1] = i; b[d + 388 >> 1] = i; b[d + 390 >> 1] = i; b[d + 394 >> 1] = 0; b[d + 396 >> 1] = 7; b[d + 398 >> 1] = 32767; b[d + 400 >> 1] = 0; b[d + 402 >> 1] = 0; b[d + 404 >> 1] = 0; c[d + 408 >> 2] = 1; b[d + 412 >> 1] = 0; i = 0; return i | 0 } function fb(d, f, g, h, j, k, l, m, n, o, p, q) { d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; p = p | 0; q = q | 0; var r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0, O = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0, V = 0, W = 0, X = 0, Y = 0, _ = 0; _ = i; i = i + 304 | 0; Q = _ + 192 | 0; N = _ + 168 | 0; S = _ + 148 | 0; W = _ + 216 | 0; T = _ + 146 | 0; U = _ + 144 | 0; O = _ + 124 | 0; P = _ + 104 | 0; R = _ + 84 | 0; V = _ + 60 | 0; L = _ + 40 | 0; K = _; Y = d + 404 | 0; X = d + 400 | 0; if ((b[Y >> 1] | 0) != 0 ? (b[X >> 1] | 0) != 0 : 0) { J = d + 394 | 0; b[J >> 1] = b[636 + (l << 1) >> 1] | 0; z = b[d + 212 >> 1] | 0; y = z + 10 | 0; Pe(d + 52 + (((y & 65535 | 0) == 80 ? 0 : y << 16 >> 16) << 1) | 0, d + 52 + (z << 1) | 0, 20) | 0; z = b[d + 392 >> 1] | 0; y = z + 1 | 0; b[d + 376 + (((y & 65535 | 0) == 8 ? 0 : y << 16 >> 16) << 1) >> 1] = b[d + 376 + (z << 1) >> 1] | 0; y = d + 4 | 0; b[y >> 1] = 0; z = K + 36 | 0; A = K + 32 | 0; B = K + 28 | 0; C = K + 24 | 0; D = K + 20 | 0; E = K + 16 | 0; F = K + 12 | 0; G = K + 8 | 0; H = K + 4 | 0; I = d + 52 | 0; t = K; M = t + 40 | 0; do { c[t >> 2] = 0; t = t + 4 | 0; } while ((t | 0) < (M | 0)); s = 0; r = 7; while (1) { M = b[d + 376 + (r << 1) >> 1] | 0; x = M << 16 >> 16; if (M << 16 >> 16 < 0) x = ~((x ^ -8) >> 3); else x = x >>> 3; s = Rd(s, x & 65535, q) | 0; b[y >> 1] = s; v = r * 10 | 0; t = 9; while (1) { u = K + (t << 2) | 0; w = c[u >> 2] | 0; M = b[d + 52 + (t + v << 1) >> 1] | 0; x = M + w | 0; if ((M ^ w | 0) > -1 & (x ^ w | 0) < 0) { c[q >> 2] = 1; x = (w >>> 31) + 2147483647 | 0; } c[u >> 2] = x; if ((t | 0) > 0) t = t + -1 | 0; else break } if ((r | 0) <= 0) break; else r = r + -1 | 0; } b[L + 18 >> 1] = (c[z >> 2] | 0) >>> 3; b[L + 16 >> 1] = (c[A >> 2] | 0) >>> 3; b[L + 14 >> 1] = (c[B >> 2] | 0) >>> 3; b[L + 12 >> 1] = (c[C >> 2] | 0) >>> 3; b[L + 10 >> 1] = (c[D >> 2] | 0) >>> 3; b[L + 8 >> 1] = (c[E >> 2] | 0) >>> 3; b[L + 6 >> 1] = (c[F >> 2] | 0) >>> 3; b[L + 4 >> 1] = (c[G >> 2] | 0) >>> 3; b[L + 2 >> 1] = (c[H >> 2] | 0) >>> 3; b[L >> 1] = (c[K >> 2] | 0) >>> 3; me(L, d + 12 | 0, 10, q); b[y >> 1] = Ge(b[y >> 1] | 0, b[J >> 1] | 0, q) | 0; Oe(d + 214 | 0, I | 0, 160) | 0; L = 9; while (1) { M = b[d + 214 + (L + 70 << 1) >> 1] | 0; u = M << 16 >> 16; K = b[d + 214 + (L + 60 << 1) >> 1] | 0; t = (K << 16 >> 16) + u | 0; if ((K ^ M) << 16 >> 16 > -1 & (t ^ u | 0) < 0) { c[q >> 2] = 1; t = (u >>> 31) + 2147483647 | 0; } M = b[d + 214 + (L + 50 << 1) >> 1] | 0; u = M + t | 0; if ((M ^ t | 0) > -1 & (u ^ t | 0) < 0) { c[q >> 2] = 1; u = (t >>> 31) + 2147483647 | 0; } M = b[d + 214 + (L + 40 << 1) >> 1] | 0; t = M + u | 0; if ((M ^ u | 0) > -1 & (t ^ u | 0) < 0) { c[q >> 2] = 1; t = (u >>> 31) + 2147483647 | 0; } M = b[d + 214 + (L + 30 << 1) >> 1] | 0; u = M + t | 0; if ((M ^ t | 0) > -1 & (u ^ t | 0) < 0) { c[q >> 2] = 1; u = (t >>> 31) + 2147483647 | 0; } M = b[d + 214 + (L + 20 << 1) >> 1] | 0; t = M + u | 0; if ((M ^ u | 0) > -1 & (t ^ u | 0) < 0) { c[q >> 2] = 1; t = (u >>> 31) + 2147483647 | 0; } M = b[d + 214 + (L + 10 << 1) >> 1] | 0; u = M + t | 0; if ((M ^ t | 0) > -1 & (u ^ t | 0) < 0) { c[q >> 2] = 1; t = (t >>> 31) + 2147483647 | 0; } else t = u; M = b[d + 214 + (L << 1) >> 1] | 0; u = M + t | 0; if ((M ^ t | 0) > -1 & (u ^ t | 0) < 0) { c[q >> 2] = 1; u = (t >>> 31) + 2147483647 | 0; } if ((u | 0) < 0) u = ~((u ^ -8) >> 3); else u = u >>> 3; x = u & 65535; v = b[654 + (L << 1) >> 1] | 0; w = 7; while (1) { r = d + 214 + ((w * 10 | 0) + L << 1) | 0; u = Ge(b[r >> 1] | 0, x, q) | 0; b[r >> 1] = u; u = (Z(v, u << 16 >> 16) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[r >> 1] = u; s = (u & 65535) - (u >>> 15 & 1) | 0; s = s << 16 >> 31 ^ s; t = s & 65535; if (t << 16 >> 16 > 655) t = (((s << 16 >> 16) + 261489 | 0) >>> 2) + 655 & 65535; t = t << 16 >> 16 > 1310 ? 1310 : t; if (!(u & 32768)) u = t; else u = 0 - (t & 65535) & 65535; b[r >> 1] = u; if ((w | 0) > 0) w = w + -1 | 0; else break } if ((L | 0) > 0) L = L + -1 | 0; else break } } if (b[X >> 1] | 0) { x = d + 32 | 0; w = d + 12 | 0; t = x; v = w; M = t + 20 | 0; do { a[t >> 0] = a[v >> 0] | 0; t = t + 1 | 0; v = v + 1 | 0; } while ((t | 0) < (M | 0)); v = d + 4 | 0; s = b[v >> 1] | 0; r = d + 6 | 0; b[r >> 1] = s; do if (b[d + 402 >> 1] | 0) { t = b[d >> 1] | 0; b[d >> 1] = 0; t = t << 16 >> 16 < 32 ? t : 32; M = t << 16 >> 16; u = M << 10; if ((u | 0) != (M << 26 >> 16 | 0)) { c[q >> 2] = 1; u = t << 16 >> 16 > 0 ? 32767 : -32768; } if (t << 16 >> 16 > 1) u = Td(1024, u & 65535) | 0; else u = 16384; b[d + 2 >> 1] = u; bb(g, b[m >> 1] | 0, c[n + 60 >> 2] | 0); ab(g, 8, 0, m + 2 | 0, n, w, q); t = g; M = t + 20 | 0; do { a[t >> 0] = 0; t = t + 1 | 0; } while ((t | 0) < (M | 0)); s = b[m + 8 >> 1] | 0; s = s << 16 >> 16 == 0 ? -32768 : ((s + 64 & 65535) > 127 ? (s << 16 >> 16 > 0 ? 32767 : 32768) : s << 16 >> 16 << 9) + 60416 & 65535; b[v >> 1] = s; if ((b[d + 412 >> 1] | 0) != 0 ? (c[d + 408 >> 2] | 0) != 0 : 0) break; t = x; v = w; M = t + 20 | 0; do { a[t >> 0] = a[v >> 0] | 0; t = t + 1 | 0; v = v + 1 | 0; } while ((t | 0) < (M | 0)); b[r >> 1] = s; } while (0); t = s << 16 >> 16; if (s << 16 >> 16 < 0) t = ~((t ^ -2) >> 1); else t = t >>> 1; t = t + 56536 | 0; u = t << 16; if ((u | 0) > 0) t = 0; else t = (u | 0) < -946077696 ? -14436 : t & 65535; b[h >> 1] = t; b[h + 2 >> 1] = t; b[h + 4 >> 1] = t; b[h + 6 >> 1] = t; m = ((t << 16 >> 16) * 5443 | 0) >>> 15 & 65535; b[h + 8 >> 1] = m; b[h + 10 >> 1] = m; b[h + 12 >> 1] = m; b[h + 14 >> 1] = m; } t = ((b[636 + (l << 1) >> 1] | 0) * 104864 | 0) >>> 15 << 16; if ((t | 0) < 0) t = ~((t >> 16 ^ -32) >> 5); else t = t >> 21; l = d + 394 | 0; b[l >> 1] = Rd(((b[l >> 1] | 0) * 29491 | 0) >>> 15 & 65535, t & 65535, q) | 0; h = (e[d >> 1] << 16) + 65536 | 0; t = h >> 16; n = d + 2 | 0; t = (Z(((h << 10 >> 26 | 0) == (t | 0) ? h >>> 6 : t >>> 15 ^ 32767) << 16 >> 16, b[n >> 1] | 0) | 0) >> 15; if ((t | 0) > 32767) { c[q >> 2] = 1; t = 32767; } s = t & 65535; if (s << 16 >> 16 <= 1024) if (s << 16 >> 16 < -2048) w = -32768; else w = t << 4 & 65535; else w = 16384; m = d + 4 | 0; x = w << 16 >> 16; u = Z(b[m >> 1] | 0, x) | 0; if ((u | 0) == 1073741824) { c[q >> 2] = 1; L = 2147483647; } else L = u << 1; u = (Z(b[d + 30 >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } y = u & 65535; b[Q + 18 >> 1] = y; u = (Z(b[d + 28 >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[Q + 16 >> 1] = u; u = (Z(b[d + 26 >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[Q + 14 >> 1] = u; u = (Z(b[d + 24 >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[Q + 12 >> 1] = u; u = (Z(b[d + 22 >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[Q + 10 >> 1] = u; u = (Z(b[d + 20 >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[Q + 8 >> 1] = u; u = (Z(b[d + 18 >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[Q + 6 >> 1] = u; u = (Z(b[d + 16 >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[Q + 4 >> 1] = u; u = (Z(b[d + 14 >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[Q + 2 >> 1] = u; u = (Z(b[d + 12 >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[Q >> 1] = u; h = d + 6 | 0; x = 16384 - (w & 65535) << 16 >> 16; u = Z(b[h >> 1] | 0, x) | 0; if ((u | 0) != 1073741824) { t = (u << 1) + L | 0; if ((u ^ L | 0) > 0 & (t ^ L | 0) < 0) { c[q >> 2] = 1; K = (L >>> 31) + 2147483647 | 0; } else K = t; } else { c[q >> 2] = 1; K = 2147483647; } t = y; v = 9; while (1) { s = Q + (v << 1) | 0; u = (Z(b[d + 32 + (v << 1) >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } t = Rd(t, u & 65535, q) | 0; b[s >> 1] = t; M = t << 16 >> 16; u = M << 1; if ((u | 0) != (M << 17 >> 16 | 0)) { c[q >> 2] = 1; u = t << 16 >> 16 > 0 ? 32767 : -32768; } b[s >> 1] = u; u = v + -1 | 0; if ((v | 0) <= 0) break; t = b[Q + (u << 1) >> 1] | 0; v = u; } L = d + 374 | 0; u = ((e[L >> 1] << 16) + -161021952 >> 16) * 9830 >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } u = 4096 - (u & 65535) | 0; t = u << 16; if ((t | 0) > 268369920) x = 32767; else x = (t | 0) < 0 ? 0 : u << 19 >> 16; J = d + 8 | 0; u = Ga(J, 3) | 0; ne(Q, O, 10, q); t = P; v = O; M = t + 20 | 0; do { b[t >> 1] = b[v >> 1] | 0; t = t + 2 | 0; v = v + 2 | 0; } while ((t | 0) < (M | 0)); t = (u << 16 >> 16) * 10 | 0; v = 9; while (1) { s = P + (v << 1) | 0; r = b[s >> 1] | 0; u = (Z(b[d + 214 + (v + t << 1) >> 1] | 0, x) | 0) >> 15; if ((u | 0) > 32767) { c[q >> 2] = 1; u = 32767; } b[s >> 1] = Rd(r, u & 65535, q) | 0; if ((v | 0) > 0) v = v + -1 | 0; else break } Ae(O, 205, 10, q); Ae(P, 205, 10, q); t = g + 20 | 0; v = O; M = t + 20 | 0; do { a[t >> 0] = a[v >> 0] | 0; t = t + 1 | 0; v = v + 1 | 0; } while ((t | 0) < (M | 0)); me(O, Q, 10, q); me(P, R, 10, q); he(Q, N, q); he(R, V, q); t = p; v = N; M = t + 22 | 0; do { a[t >> 0] = a[v >> 0] | 0; t = t + 1 | 0; v = v + 1 | 0; } while ((t | 0) < (M | 0)); t = p + 22 | 0; v = N; M = t + 22 | 0; do { a[t >> 0] = a[v >> 0] | 0; t = t + 1 | 0; v = v + 1 | 0; } while ((t | 0) < (M | 0)); t = p + 44 | 0; v = N; M = t + 22 | 0; do { a[t >> 0] = a[v >> 0] | 0; t = t + 1 | 0; v = v + 1 | 0; } while ((t | 0) < (M | 0)); t = p + 66 | 0; v = N; M = t + 22 | 0; do { a[t >> 0] = a[v >> 0] | 0; t = t + 1 | 0; v = v + 1 | 0; } while ((t | 0) < (M | 0)); Fa(N + 2 | 0, S, q); u = 0; t = 32767; do { s = b[S + (u << 1) >> 1] | 0; s = Z(s, s) | 0; if (s >>> 0 < 1073741824) s = 32767 - (s >>> 15) | 0; else { c[q >> 2] = 1; s = 0; } t = (Z(s << 16 >> 16, t << 16 >> 16) | 0) >> 15; if ((t | 0) > 32767) { c[q >> 2] = 1; t = 32767; } u = u + 1 | 0; } while ((u | 0) != 10); de(t << 16 >> 16, T, U, q); t = (e[T >> 1] << 16) + -983040 | 0; s = t >> 16; s = De(Ge(0, Rd(((t << 12 >> 28 | 0) == (s | 0) ? t >>> 4 : s >>> 15 ^ 32767) & 65535, De(b[U >> 1] | 0, 3, q) | 0, q) | 0, q) | 0, 1, q) | 0; t = (b[L >> 1] | 0) * 29491 >> 15; if ((t | 0) > 32767) { c[q >> 2] = 1; t = 32767; } u = s << 16 >> 16; s = u * 3277 >> 15; if ((s | 0) > 32767) { c[q >> 2] = 1; s = 32767; } b[L >> 1] = Rd(t & 65535, s & 65535, q) | 0; s = K >> 10; r = s + 262144 | 0; if ((s | 0) > -1 & (r ^ s | 0) < 0) { c[q >> 2] = 1; r = (s >>> 31) + 2147483647 | 0; } U = u << 4; s = r - U | 0; if (((s ^ r) & (r ^ U) | 0) < 0) { c[q >> 2] = 1; r = (r >>> 31) + 2147483647 | 0; } else r = s; U = b[l >> 1] << 5; s = U + r | 0; if ((U ^ r | 0) > -1 & (s ^ r | 0) < 0) { c[q >> 2] = 1; s = (r >>> 31) + 2147483647 | 0; } u = (re(s >>> 16 & 65535, s >>> 1 & 32767, q) | 0) << 16 >> 16; Ha(J, W, q); r = 39; while (1) { t = W + (r << 1) | 0; s = (Z(b[t >> 1] | 0, u) | 0) >> 15; if ((s | 0) > 32767) { c[q >> 2] = 1; s = 32767; } b[t >> 1] = s; if ((r | 0) > 0) r = r + -1 | 0; else break } He(V, W, o, 40, f, 1); Ha(J, W, q); r = 39; while (1) { t = W + (r << 1) | 0; s = (Z(b[t >> 1] | 0, u) | 0) >> 15; if ((s | 0) > 32767) { c[q >> 2] = 1; s = 32767; } b[t >> 1] = s; if ((r | 0) > 0) r = r + -1 | 0; else break } He(V, W, o + 80 | 0, 40, f, 1); Ha(J, W, q); r = 39; while (1) { t = W + (r << 1) | 0; s = (Z(b[t >> 1] | 0, u) | 0) >> 15; if ((s | 0) > 32767) { c[q >> 2] = 1; s = 32767; } b[t >> 1] = s; if ((r | 0) > 0) r = r + -1 | 0; else break } He(V, W, o + 160 | 0, 40, f, 1); Ha(J, W, q); t = 39; while (1) { r = W + (t << 1) | 0; s = (Z(b[r >> 1] | 0, u) | 0) >> 15; if ((s | 0) > 32767) { c[q >> 2] = 1; s = 32767; } b[r >> 1] = s; if ((t | 0) > 0) t = t + -1 | 0; else break } He(V, W, o + 240 | 0, 40, f, 1); b[j + 14 >> 1] = 20; b[j + 16 >> 1] = 0; if ((k | 0) == 2) { s = b[d >> 1] | 0; s = s << 16 >> 16 > 32 ? 32 : s << 16 >> 16 < 1 ? 8 : s; o = s << 16 >> 16; r = o << 10; if ((r | 0) != (o << 26 >> 16 | 0)) { c[q >> 2] = 1; r = s << 16 >> 16 > 0 ? 32767 : -32768; } b[n >> 1] = Td(1024, r & 65535) | 0; b[d >> 1] = 0; t = d + 32 | 0; v = d + 12 | 0; M = t + 20 | 0; do { a[t >> 0] = a[v >> 0] | 0; t = t + 1 | 0; v = v + 1 | 0; } while ((t | 0) < (M | 0)); q = b[m >> 1] | 0; b[h >> 1] = q; b[m >> 1] = (q & 65535) + 65280; } if (!(b[X >> 1] | 0)) { i = _; return } do if (!(b[d + 402 >> 1] | 0)) { if (b[Y >> 1] | 0) break; i = _; return } while (0); b[d >> 1] = 0; b[d + 412 >> 1] = 1; i = _; return } function gb(a, d, f, g) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; var h = 0, j = 0, k = 0, l = 0, m = 0, n = 0; m = i; i = i + 16 | 0; k = m + 2 | 0; l = m; b[l >> 1] = 0; j = a + 212 | 0; h = (e[j >> 1] | 0) + 10 | 0; h = (h & 65535 | 0) == 80 ? 0 : h & 65535; b[j >> 1] = h; Pe(a + 52 + (h << 16 >> 16 << 1) | 0, d | 0, 20) | 0; h = 0; j = 159; while (1) { n = b[f + (j << 1) >> 1] | 0; n = Z(n, n) | 0; n = (n | 0) == 1073741824 ? 2147483647 : n << 1; d = n + h | 0; if ((n ^ h | 0) > -1 & (d ^ h | 0) < 0) { c[g >> 2] = 1; h = (h >>> 31) + 2147483647 | 0; } else h = d; if ((j | 0) > 0) j = j + -1 | 0; else break } de(h, k, l, g); h = b[k >> 1] | 0; n = h << 16 >> 16; d = n << 10; if ((d | 0) != (n << 26 >> 16 | 0)) { c[g >> 2] = 1; d = h << 16 >> 16 > 0 ? 32767 : -32768; } b[k >> 1] = d; n = b[l >> 1] | 0; h = n << 16 >> 16; if (n << 16 >> 16 < 0) h = ~((h ^ -32) >> 5); else h = h >>> 5; l = a + 392 | 0; n = (e[l >> 1] | 0) + 1 | 0; n = (n & 65535 | 0) == 8 ? 0 : n & 65535; b[l >> 1] = n; b[a + 376 + (n << 16 >> 16 << 1) >> 1] = h + 57015 + d; i = m; return } function hb(a, d, f) { a = a | 0; d = d | 0; f = f | 0; var g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0; l = (d | 0) == 4; m = (d | 0) == 5; n = (d | 0) == 6; g = c[a + 408 >> 2] | 0; a:do if ((d + -4 | 0) >>> 0 < 3) k = 4; else { if ((g + -1 | 0) >>> 0 < 2) switch (d | 0) { case 2: case 3: case 7: { k = 4; break a } default: { } } b[a >> 1] = 0; j = 0; } while (0); if ((k | 0) == 4) { b:do if ((g | 0) == 2) { switch (d | 0) { case 2: case 4: case 6: case 7: break; default: { h = 1; break b } } h = 2; } else h = 1; while (0); j = (e[a >> 1] | 0) + 1 & 65535; b[a >> 1] = j; j = (d | 0) != 5 & j << 16 >> 16 > 50 ? 2 : h; } i = a + 398 | 0; if (m & (b[a + 412 >> 1] | 0) == 0) { b[i >> 1] = 0; h = 0; } else h = b[i >> 1] | 0; h = Rd(h, 1, f) | 0; b[i >> 1] = h; f = a + 404 | 0; b[f >> 1] = 0; c:do switch (d | 0) { case 2: case 4: case 5: case 6: case 7: { if (!((d | 0) == 7 & (j | 0) == 0)) { if (h << 16 >> 16 > 30) { b[f >> 1] = 1; b[i >> 1] = 0; b[a + 396 >> 1] = 0; break c } h = a + 396 | 0; g = b[h >> 1] | 0; if (!(g << 16 >> 16)) { b[i >> 1] = 0; break c } else { b[h >> 1] = (g & 65535) + 65535; break c } } else k = 14; break } default: k = 14; } while (0); if ((k | 0) == 14) b[a + 396 >> 1] = 7; if (!j) return j | 0; h = a + 400 | 0; b[h >> 1] = 0; g = a + 402 | 0; b[g >> 1] = 0; if (l) { b[h >> 1] = 1; return j | 0 } if (m) { b[h >> 1] = 1; b[g >> 1] = 1; return j | 0 } if (!n) return j | 0; b[h >> 1] = 1; b[f >> 1] = 0; return j | 0 } function ib(a) { a = a | 0; if (!a) { a = -1; return a | 0 } b[a >> 1] = 1; b[a + 2 >> 1] = 1; b[a + 4 >> 1] = 1; b[a + 6 >> 1] = 1; b[a + 8 >> 1] = 1; b[a + 10 >> 1] = 0; b[a + 12 >> 1] = 1; a = 0; return a | 0 } function jb(a, d, e, f, g) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; var h = 0, j = 0, k = 0, l = 0; l = i; i = i + 16 | 0; k = l + 2 | 0; j = l; h = Zd(a, 5) | 0; a = a + 10 | 0; if ((Ge(h, b[a >> 1] | 0, g) | 0) << 16 >> 16 > 0) h = b[a >> 1] | 0; h = (Z(b[674 + (e << 16 >> 16 << 1) >> 1] | 0, h << 16 >> 16) | 0) >> 15; if ((h | 0) > 32767) { c[g >> 2] = 1; h = 32767; } b[f >> 1] = h; Xd(d, k, j, g); Wd(d, b[k >> 1] | 0, b[j >> 1] | 0); i = l; return } function kb(a, c, d, e, f) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; if (!(c << 16 >> 16)) { if (d << 16 >> 16) { c = a + 12 | 0; if ((Ge(b[e >> 1] | 0, b[c >> 1] | 0, f) | 0) << 16 >> 16 > 0) b[e >> 1] = b[c >> 1] | 0; } else c = a + 12 | 0; b[c >> 1] = b[e >> 1] | 0; } b[a + 10 >> 1] = b[e >> 1] | 0; f = a + 2 | 0; b[a >> 1] = b[f >> 1] | 0; d = a + 4 | 0; b[f >> 1] = b[d >> 1] | 0; f = a + 6 | 0; b[d >> 1] = b[f >> 1] | 0; a = a + 8 | 0; b[f >> 1] = b[a >> 1] | 0; b[a >> 1] = b[e >> 1] | 0; return } function lb(a, d, e, f) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; var g = 0; g = Zd(a, 5) | 0; a = a + 10 | 0; if ((Ge(g, b[a >> 1] | 0, f) | 0) << 16 >> 16 > 0) g = b[a >> 1] | 0; g = (Z(b[688 + (d << 16 >> 16 << 1) >> 1] | 0, g << 16 >> 16) | 0) >> 15; if ((g | 0) <= 32767) { f = g; f = f & 65535; b[e >> 1] = f; return } c[f >> 2] = 1; f = 32767; f = f & 65535; b[e >> 1] = f; return } function mb(a) { a = a | 0; if (!a) { a = -1; return a | 0 } b[a >> 1] = 1640; b[a + 2 >> 1] = 1640; b[a + 4 >> 1] = 1640; b[a + 6 >> 1] = 1640; b[a + 8 >> 1] = 1640; b[a + 10 >> 1] = 0; b[a + 12 >> 1] = 16384; a = 0; return a | 0 } function nb(a, c, d, e, f) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; if (!(c << 16 >> 16)) { if (d << 16 >> 16) { c = a + 12 | 0; if ((Ge(b[e >> 1] | 0, b[c >> 1] | 0, f) | 0) << 16 >> 16 > 0) b[e >> 1] = b[c >> 1] | 0; } else c = a + 12 | 0; b[c >> 1] = b[e >> 1] | 0; } e = b[e >> 1] | 0; c = a + 10 | 0; b[c >> 1] = e; if ((Ge(e, 16384, f) | 0) << 16 >> 16 > 0) { b[c >> 1] = 16384; c = 16384; } else c = b[c >> 1] | 0; f = a + 2 | 0; b[a >> 1] = b[f >> 1] | 0; e = a + 4 | 0; b[f >> 1] = b[e >> 1] | 0; f = a + 6 | 0; b[e >> 1] = b[f >> 1] | 0; a = a + 8 | 0; b[f >> 1] = b[a >> 1] | 0; b[a >> 1] = c; return } function ob(a, d, e, f, g, h, i) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; var j = 0, k = 0, l = 0; k = Zd(e, 9) | 0; l = b[e + 16 >> 1] | 0; j = l << 16 >> 16; e = (j + (b[e + 14 >> 1] | 0) | 0) >>> 1; e = (j | 0) < (e << 16 >> 16 | 0) ? l : e & 65535; if (!(d << 16 >> 16 > 5 ? k << 16 >> 16 > d << 16 >> 16 : 0)) return 0; j = e << 16 >> 16; j = ((j << 18 >> 18 | 0) == (j | 0) ? j << 2 : j >>> 15 ^ 32767) & 65535; if (!(f << 16 >> 16 > 6 & g << 16 >> 16 == 0)) j = Ge(j, e, i) | 0; k = k << 16 >> 16 > j << 16 >> 16 ? j : k; l = qe(d) | 0; j = l << 16 >> 16; if (l << 16 >> 16 < 0) { e = 0 - j << 16; if ((e | 0) < 983040) j = d << 16 >> 16 >> (e >> 16) & 65535; else j = 0; } else { e = d << 16 >> 16; g = e << j; if ((g << 16 >> 16 >> j | 0) == (e | 0)) j = g & 65535; else j = (e >>> 15 ^ 32767) & 65535; } f = Z((Td(16383, j) | 0) << 16 >> 16, k << 16 >> 16) | 0; if ((f | 0) == 1073741824) { c[i >> 2] = 1; g = 2147483647; } else g = f << 1; f = Ge(20, l, i) | 0; j = f << 16 >> 16; if (f << 16 >> 16 > 0) f = f << 16 >> 16 < 31 ? g >> j : 0; else { d = 0 - j << 16 >> 16; f = g << d; f = (f >> d | 0) == (g | 0) ? f : g >> 31 ^ 2147483647; } f = (f | 0) > 32767 ? 32767 : f & 65535; f = h << 16 >> 16 != 0 & f << 16 >> 16 > 3072 ? 3072 : f << 16 >> 16; e = 0; do { g = a + (e << 1) | 0; j = Z(b[g >> 1] | 0, f) | 0; if ((j | 0) == 1073741824) { c[i >> 2] = 1; j = 2147483647; } else j = j << 1; b[g >> 1] = j >>> 11; e = e + 1 | 0; } while ((e | 0) != 40); return 0 } function pb(a, e, f, g) { a = a | 0; e = e | 0; f = f | 0; g = g | 0; var h = 0, i = 0, j = 0, k = 0; h = c[g + 104 >> 2] | 0; i = c[g + 96 >> 2] | 0; if (a >>> 0 >= 8) { b[f >> 1] = (d[e >> 0] | 0) >>> 4 & 1; b[f + 2 >> 1] = (d[e >> 0] | 0) >>> 5 & 1; b[f + 4 >> 1] = (d[e >> 0] | 0) >>> 6 & 1; b[f + 6 >> 1] = (d[e >> 0] | 0) >>> 7 & 255; h = h + (a << 1) | 0; if ((b[h >> 1] | 0) > 1) { a = 1; g = 1; i = 4; } else return; while (1) { j = e + a | 0; a = i | 1; b[f + (i << 16 >> 16 << 1) >> 1] = d[j >> 0] & 1; b[f + (a << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 1 & 1; k = i | 3; b[f + (a + 1 << 16 >> 16 << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 2 & 1; b[f + (k << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 3 & 1; b[f + (k + 1 << 16 >> 16 << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 4 & 1; b[f + (k + 2 << 16 >> 16 << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 5 & 1; b[f + (k + 3 << 16 >> 16 << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 6 & 1; b[f + (k + 4 << 16 >> 16 << 16 >> 16 << 1) >> 1] = (d[j >> 0] | 0) >>> 7 & 255; g = g + 1 << 16 >> 16; if (g << 16 >> 16 < (b[h >> 1] | 0)) { a = g << 16 >> 16; i = i + 8 << 16 >> 16; } else break } return } k = c[(c[g + 100 >> 2] | 0) + (a << 2) >> 2] | 0; b[f + (b[k >> 1] << 1) >> 1] = (d[e >> 0] | 0) >>> 4 & 1; b[f + (b[k + 2 >> 1] << 1) >> 1] = (d[e >> 0] | 0) >>> 5 & 1; b[f + (b[k + 4 >> 1] << 1) >> 1] = (d[e >> 0] | 0) >>> 6 & 1; b[f + (b[k + 6 >> 1] << 1) >> 1] = (d[e >> 0] | 0) >>> 7 & 255; j = h + (a << 1) | 0; if ((b[j >> 1] | 0) <= 1) return; g = i + (a << 1) | 0; h = 1; a = 1; i = 4; while (1) { h = e + h | 0; i = i << 16 >> 16; if ((i | 0) < (b[g >> 1] | 0)) { b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = d[h >> 0] & 1; i = i + 1 | 0; if ((i | 0) < (b[g >> 1] | 0)) { b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 1 & 1; i = i + 1 | 0; if ((i | 0) < (b[g >> 1] | 0)) { b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 2 & 1; i = i + 1 | 0; if ((i | 0) < (b[g >> 1] | 0)) { b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 3 & 1; i = i + 1 | 0; if ((i | 0) < (b[g >> 1] | 0)) { b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 4 & 1; i = i + 1 | 0; if ((i | 0) < (b[g >> 1] | 0)) { b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 5 & 1; i = i + 1 | 0; if ((i | 0) < (b[g >> 1] | 0)) { b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 6 & 1; i = i + 1 | 0; if ((i | 0) < (b[g >> 1] | 0)) { b[f + (b[k + (i << 1) >> 1] << 1) >> 1] = (d[h >> 0] | 0) >>> 7 & 1; i = i + 1 | 0; } } } } } } } } a = a + 1 << 16 >> 16; if (a << 16 >> 16 < (b[j >> 1] | 0)) h = a << 16 >> 16; else break } return } function qb(a, c, d, e, f) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; var g = 0, h = 0, i = 0, j = 0; switch (d << 16 >> 16) { case 0: { j = 9; while (1) { i = b[a + (j << 1) >> 1] | 0; d = i << 16 >> 16; if (i << 16 >> 16 < 0) d = ~((d ^ -4) >> 2); else d = d >>> 2; h = b[c + (j << 1) >> 1] | 0; g = h << 16 >> 16; if (h << 16 >> 16 < 0) h = ~((g ^ -4) >> 2); else h = g >>> 2; b[e + (j << 1) >> 1] = Rd((i & 65535) - d & 65535, h & 65535, f) | 0; if ((j | 0) > 0) j = j + -1 | 0; else break } return } case 40: { h = 9; while (1) { f = b[a + (h << 1) >> 1] | 0; d = f << 16 >> 16; if (f << 16 >> 16 < 0) g = ~((d ^ -2) >> 1); else g = d >>> 1; f = b[c + (h << 1) >> 1] | 0; d = f << 16 >> 16; if (f << 16 >> 16 < 0) d = ~((d ^ -2) >> 1); else d = d >>> 1; b[e + (h << 1) >> 1] = d + g; if ((h | 0) > 0) h = h + -1 | 0; else break } return } case 80: { j = 9; while (1) { i = b[a + (j << 1) >> 1] | 0; d = i << 16 >> 16; if (i << 16 >> 16 < 0) i = ~((d ^ -4) >> 2); else i = d >>> 2; d = b[c + (j << 1) >> 1] | 0; g = d << 16 >> 16; if (d << 16 >> 16 < 0) h = ~((g ^ -4) >> 2); else h = g >>> 2; b[e + (j << 1) >> 1] = Rd(i & 65535, (d & 65535) - h & 65535, f) | 0; if ((j | 0) > 0) j = j + -1 | 0; else break } return } case 120: { b[e + 18 >> 1] = b[c + 18 >> 1] | 0; b[e + 16 >> 1] = b[c + 16 >> 1] | 0; b[e + 14 >> 1] = b[c + 14 >> 1] | 0; b[e + 12 >> 1] = b[c + 12 >> 1] | 0; b[e + 10 >> 1] = b[c + 10 >> 1] | 0; b[e + 8 >> 1] = b[c + 8 >> 1] | 0; b[e + 6 >> 1] = b[c + 6 >> 1] | 0; b[e + 4 >> 1] = b[c + 4 >> 1] | 0; b[e + 2 >> 1] = b[c + 2 >> 1] | 0; b[e >> 1] = b[c >> 1] | 0; return } default: return } } function rb(a, b) { a = a | 0; b = b | 0; if (!a) { a = -1; return a | 0 } Pe(a | 0, b | 0, 20) | 0; a = 0; return a | 0 } function sb(a, d, e) { a = a | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0; l = 0; do { k = a + (l << 1) | 0; f = b[k >> 1] | 0; i = f & 65535; j = i << 16; f = f << 16 >> 16; if ((f * 5243 | 0) == 1073741824) { c[e >> 2] = 1; h = 2147483647; } else h = f * 10486 | 0; g = j - h | 0; if (((g ^ j) & (h ^ j) | 0) < 0) { c[e >> 2] = 1; h = (i >>> 15) + 2147483647 | 0; } else h = g; f = b[d + (l << 1) >> 1] | 0; g = f * 5243 | 0; if ((g | 0) != 1073741824) { f = (f * 10486 | 0) + h | 0; if ((g ^ h | 0) > 0 & (f ^ h | 0) < 0) { c[e >> 2] = 1; f = (h >>> 31) + 2147483647 | 0; } } else { c[e >> 2] = 1; f = 2147483647; } b[k >> 1] = Ce(f, e) | 0; l = l + 1 | 0; } while ((l | 0) != 10); return } function tb(a) { a = a | 0; var c = 0; if (!a) { c = -1; return c | 0 } c = a + 18 | 0; do { b[a >> 1] = 0; a = a + 2 | 0; } while ((a | 0) < (c | 0)); c = 0; return c | 0 } function ub(a) { a = a | 0; b[a + 14 >> 1] = 1; return } function vb(a) { a = a | 0; b[a + 14 >> 1] = 0; return } function wb(a, d, e, f, g, h, j, k, l, m) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; var n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0; C = i; i = i + 160 | 0; z = C + 80 | 0; A = C; v = c[l + 120 >> 2] | 0; w = c[l + 124 >> 2] | 0; x = c[l + 128 >> 2] | 0; u = c[l + 132 >> 2] | 0; o = a + 6 | 0; t = a + 8 | 0; b[t >> 1] = b[o >> 1] | 0; r = a + 4 | 0; b[o >> 1] = b[r >> 1] | 0; s = a + 2 | 0; b[r >> 1] = b[s >> 1] | 0; b[s >> 1] = b[a >> 1] | 0; b[a >> 1] = g; l = g << 16 >> 16 < 14746 ? g << 16 >> 16 > 9830 & 1 : 2; n = a + 12 | 0; g = b[n >> 1] | 0; p = g << 15; do if ((p | 0) <= 536870911) if ((p | 0) < -536870912) { c[m >> 2] = 1; g = -2147483648; break } else { g = g << 17; break } else { c[m >> 2] = 1; g = 2147483647; } while (0); y = f << 16 >> 16; q = a + 16 | 0; if ((Ce(g, m) | 0) << 16 >> 16 >= f << 16 >> 16) { p = b[q >> 1] | 0; if (p << 16 >> 16 > 0) { p = (p & 65535) + 65535 & 65535; b[q >> 1] = p; } if (!(p << 16 >> 16)) { g = (b[a >> 1] | 0) < 9830; g = (b[s >> 1] | 0) < 9830 ? (g ? 2 : 1) : g & 1; if ((b[r >> 1] | 0) < 9830) g = (g & 65535) + 1 & 65535; if ((b[o >> 1] | 0) < 9830) g = (g & 65535) + 1 & 65535; if ((b[t >> 1] | 0) < 9830) g = (g & 65535) + 1 & 65535; p = 0; l = g << 16 >> 16 > 2 ? 0 : l; } } else { b[q >> 1] = 2; p = 2; } s = l << 16 >> 16; t = a + 10 | 0; s = (p << 16 >> 16 == 0 ? (s | 0) > ((b[t >> 1] | 0) + 1 | 0) : 0) ? s + 65535 & 65535 : l; a = (b[a + 14 >> 1] | 0) == 1 ? 0 : f << 16 >> 16 < 10 ? 2 : s << 16 >> 16 < 2 & p << 16 >> 16 > 0 ? (s & 65535) + 1 & 65535 : s; b[t >> 1] = a; b[n >> 1] = f; switch (d | 0) { case 4: case 6: case 7: break; default: if (a << 16 >> 16 < 2) { p = 0; l = 0; o = h; n = z; while (1) { if (!(b[o >> 1] | 0)) g = 0; else { l = l << 16 >> 16; b[A + (l << 1) >> 1] = p; g = b[o >> 1] | 0; l = l + 1 & 65535; } b[n >> 1] = g; b[o >> 1] = 0; p = p + 1 << 16 >> 16; if (p << 16 >> 16 >= 40) { t = l; break } else { o = o + 2 | 0; n = n + 2 | 0; } } s = a << 16 >> 16 == 0; s = (d | 0) == 5 ? (s ? v : w) : s ? x : u; if (t << 16 >> 16 > 0) { r = 0; do { q = b[A + (r << 1) >> 1] | 0; l = q << 16 >> 16; a = b[z + (l << 1) >> 1] | 0; if (q << 16 >> 16 < 40) { p = a << 16 >> 16; o = 39 - q & 65535; n = q; l = h + (l << 1) | 0; g = s; while (1) { d = (Z(b[g >> 1] | 0, p) | 0) >>> 15 & 65535; b[l >> 1] = Rd(b[l >> 1] | 0, d, m) | 0; n = n + 1 << 16 >> 16; if (n << 16 >> 16 >= 40) break; else { l = l + 2 | 0; g = g + 2 | 0; } } if (q << 16 >> 16 > 0) { l = s + (o + 1 << 1) | 0; B = 36; } } else { l = s; B = 36; } if ((B | 0) == 36) { B = 0; g = a << 16 >> 16; p = 0; o = h; while (1) { d = (Z(b[l >> 1] | 0, g) | 0) >>> 15 & 65535; b[o >> 1] = Rd(b[o >> 1] | 0, d, m) | 0; p = p + 1 << 16 >> 16; if (p << 16 >> 16 >= q << 16 >> 16) break; else { o = o + 2 | 0; l = l + 2 | 0; } } } r = r + 1 | 0; } while ((r & 65535) << 16 >> 16 != t << 16 >> 16) } } } r = j << 16 >> 16; s = y << 1; g = k << 16 >> 16; n = 0 - g << 16; l = n >> 16; if (k << 16 >> 16 > 0) { p = 0; o = e; while (1) { a = Z(b[e + (p << 1) >> 1] | 0, r) | 0; if ((a | 0) == 1073741824) { c[m >> 2] = 1; n = 2147483647; } else n = a << 1; k = Z(s, b[h >> 1] | 0) | 0; a = k + n | 0; if ((k ^ n | 0) > -1 & (a ^ n | 0) < 0) { c[m >> 2] = 1; a = (n >>> 31) + 2147483647 | 0; } k = a << g; b[o >> 1] = Ce((k >> g | 0) == (a | 0) ? k : a >> 31 ^ 2147483647, m) | 0; p = p + 1 | 0; if ((p | 0) == 40) break; else { h = h + 2 | 0; o = o + 2 | 0; } } i = C; return } if ((n | 0) < 2031616) { p = 0; o = e; while (1) { a = Z(b[e + (p << 1) >> 1] | 0, r) | 0; if ((a | 0) == 1073741824) { c[m >> 2] = 1; n = 2147483647; } else n = a << 1; k = Z(s, b[h >> 1] | 0) | 0; a = k + n | 0; if ((k ^ n | 0) > -1 & (a ^ n | 0) < 0) { c[m >> 2] = 1; a = (n >>> 31) + 2147483647 | 0; } b[o >> 1] = Ce(a >> l, m) | 0; p = p + 1 | 0; if ((p | 0) == 40) break; else { h = h + 2 | 0; o = o + 2 | 0; } } i = C; return } else { o = 0; n = e; while (1) { a = Z(b[e + (o << 1) >> 1] | 0, r) | 0; if ((a | 0) == 1073741824) { c[m >> 2] = 1; a = 2147483647; } else a = a << 1; k = Z(s, b[h >> 1] | 0) | 0; if ((k ^ a | 0) > -1 & (k + a ^ a | 0) < 0) c[m >> 2] = 1; b[n >> 1] = Ce(0, m) | 0; o = o + 1 | 0; if ((o | 0) == 40) break; else { h = h + 2 | 0; n = n + 2 | 0; } } i = C; return } } function xb(a) { a = a | 0; if (!a) { a = -1; return a | 0 } ;b[a >> 1] = 0; b[a + 2 >> 1] = 0; b[a + 4 >> 1] = 0; b[a + 6 >> 1] = 0; b[a + 8 >> 1] = 0; b[a + 10 >> 1] = 0; a = 0; return a | 0 } function yb(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0; if (d << 16 >> 16 <= 0) return; f = a + 10 | 0; j = a + 8 | 0; l = a + 4 | 0; m = a + 6 | 0; n = a + 2 | 0; g = b[l >> 1] | 0; h = b[m >> 1] | 0; i = b[a >> 1] | 0; k = b[n >> 1] | 0; o = 0; while (1) { p = b[f >> 1] | 0; q = b[j >> 1] | 0; b[f >> 1] = q; r = b[c >> 1] | 0; b[j >> 1] = r; p = ((r << 16 >> 16) * 7699 | 0) + ((Z(i << 16 >> 16, -7667) | 0) + (((g << 16 >> 16) * 15836 | 0) + ((h << 16 >> 16) * 15836 >> 15)) + ((Z(k << 16 >> 16, -7667) | 0) >> 15)) + (Z(q << 16 >> 16, -15398) | 0) + ((p << 16 >> 16) * 7699 | 0) | 0; q = p << 3; p = (q >> 3 | 0) == (p | 0) ? q : p >> 31 ^ 2147483647; q = p << 1; b[c >> 1] = Ce((q >> 1 | 0) == (p | 0) ? q : p >> 31 ^ 2147483647, e) | 0; i = b[l >> 1] | 0; b[a >> 1] = i; k = b[m >> 1] | 0; b[n >> 1] = k; g = p >>> 16 & 65535; b[l >> 1] = g; h = (p >>> 1) - (p >> 16 << 15) & 65535; b[m >> 1] = h; o = o + 1 << 16 >> 16; if (o << 16 >> 16 >= d << 16 >> 16) break; else c = c + 2 | 0; } return } function zb(a) { a = a | 0; if (!a) a = -1; else { b[a >> 1] = 0; a = 0; } return a | 0 } function Ab(a, d, e, f, g) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; var h = 0, i = 0, j = 0, k = 0; j = f << 16 >> 16; h = d + (j + -1 << 1) | 0; j = j + -2 | 0; k = b[h >> 1] | 0; if (f << 16 >> 16 < 2) f = e << 16 >> 16; else { f = e << 16 >> 16; i = 0; d = d + (j << 1) | 0; while (1) { e = (Z(b[d >> 1] | 0, f) | 0) >> 15; if ((e | 0) > 32767) { c[g >> 2] = 1; e = 32767; } b[h >> 1] = Ge(b[h >> 1] | 0, e & 65535, g) | 0; h = h + -2 | 0; i = i + 1 << 16 >> 16; if ((i << 16 >> 16 | 0) > (j | 0)) break; else d = d + -2 | 0; } } f = (Z(b[a >> 1] | 0, f) | 0) >> 15; if ((f | 0) <= 32767) { j = f; j = j & 65535; i = b[h >> 1] | 0; g = Ge(i, j, g) | 0; b[h >> 1] = g; b[a >> 1] = k; return } c[g >> 2] = 1; j = 32767; j = j & 65535; i = b[h >> 1] | 0; g = Ge(i, j, g) | 0; b[h >> 1] = g; b[a >> 1] = k; return } function Bb(a) { a = a | 0; var c = 0, d = 0, e = 0; if (!a) { e = -1; return e | 0 } Qe(a + 104 | 0, 0, 340) | 0; c = a + 102 | 0; d = a; e = d + 100 | 0; do { b[d >> 1] = 0; d = d + 2 | 0; } while ((d | 0) < (e | 0)); Ba(c) | 0; zb(a + 100 | 0) | 0; e = 0; return e | 0 } function Cb(d, e, f, g, h) { d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; var j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0; w = i; i = i + 96 | 0; s = w + 22 | 0; t = w; u = w + 44 | 0; Pe(d + 124 | 0, f | 0, 320) | 0; o = u + 22 | 0; p = d + 100 | 0; q = d + 80 | 0; r = d + 102 | 0; if ((e & -2 | 0) == 6) { n = 0; while (1) { Ie(g, 702, s); Ie(g, 722, t); m = d + 104 + (n + 10 << 1) | 0; Be(s, m, d, 40); k = u; j = s; e = k + 22 | 0; do { b[k >> 1] = b[j >> 1] | 0; k = k + 2 | 0; j = j + 2 | 0; } while ((k | 0) < (e | 0)); k = o; e = k + 22 | 0; do { b[k >> 1] = 0; k = k + 2 | 0; } while ((k | 0) < (e | 0)); He(t, u, u, 22, o, 0); e = 0; k = 21; do { j = b[u + (k << 16 >> 16 << 1) >> 1] | 0; j = Z(j, j) | 0; if ((j | 0) == 1073741824) { v = 7; break } l = j << 1; j = l + e | 0; if ((l ^ e | 0) > -1 & (j ^ e | 0) < 0) { c[h >> 2] = 1; e = (e >>> 31) + 2147483647 | 0; } else e = j; k = k + -1 << 16 >> 16; } while (k << 16 >> 16 > -1); if ((v | 0) == 7) { v = 0; c[h >> 2] = 1; } l = e >>> 16 & 65535; j = 20; e = 0; k = 20; while (1) { j = Z(b[u + (j + 1 << 1) >> 1] | 0, b[u + (j << 1) >> 1] | 0) | 0; if ((j | 0) == 1073741824) { v = 13; break } x = j << 1; j = x + e | 0; if ((x ^ e | 0) > -1 & (j ^ e | 0) < 0) { c[h >> 2] = 1; e = (e >>> 31) + 2147483647 | 0; } else e = j; j = (k & 65535) + -1 << 16 >> 16; if (j << 16 >> 16 > -1) { j = j << 16 >> 16; k = k + -1 | 0; } else break } if ((v | 0) == 13) { v = 0; c[h >> 2] = 1; } e = e >> 16; if ((e | 0) < 1) e = 0; else e = Td((e * 26214 | 0) >>> 15 & 65535, l) | 0; Ab(p, d, e, 40, h); e = f + (n << 1) | 0; He(t, d, e, 40, q, 1); Ca(r, m, e, 29491, 40, h); e = (n << 16) + 2621440 | 0; if ((e | 0) < 10485760) { n = e >> 16; g = g + 22 | 0; } else break } k = d + 104 | 0; j = d + 424 | 0; e = k + 20 | 0; do { a[k >> 0] = a[j >> 0] | 0; k = k + 1 | 0; j = j + 1 | 0; } while ((k | 0) < (e | 0)); i = w; return } else { n = 0; while (1) { Ie(g, 742, s); Ie(g, 762, t); m = d + 104 + (n + 10 << 1) | 0; Be(s, m, d, 40); k = u; j = s; e = k + 22 | 0; do { b[k >> 1] = b[j >> 1] | 0; k = k + 2 | 0; j = j + 2 | 0; } while ((k | 0) < (e | 0)); k = o; e = k + 22 | 0; do { b[k >> 1] = 0; k = k + 2 | 0; } while ((k | 0) < (e | 0)); He(t, u, u, 22, o, 0); e = 0; k = 21; do { j = b[u + (k << 16 >> 16 << 1) >> 1] | 0; j = Z(j, j) | 0; if ((j | 0) == 1073741824) { v = 22; break } x = j << 1; j = x + e | 0; if ((x ^ e | 0) > -1 & (j ^ e | 0) < 0) { c[h >> 2] = 1; e = (e >>> 31) + 2147483647 | 0; } else e = j; k = k + -1 << 16 >> 16; } while (k << 16 >> 16 > -1); if ((v | 0) == 22) { v = 0; c[h >> 2] = 1; } l = e >>> 16 & 65535; j = 20; e = 0; k = 20; while (1) { j = Z(b[u + (j + 1 << 1) >> 1] | 0, b[u + (j << 1) >> 1] | 0) | 0; if ((j | 0) == 1073741824) { v = 28; break } x = j << 1; j = x + e | 0; if ((x ^ e | 0) > -1 & (j ^ e | 0) < 0) { c[h >> 2] = 1; e = (e >>> 31) + 2147483647 | 0; } else e = j; j = (k & 65535) + -1 << 16 >> 16; if (j << 16 >> 16 > -1) { j = j << 16 >> 16; k = k + -1 | 0; } else break } if ((v | 0) == 28) { v = 0; c[h >> 2] = 1; } e = e >> 16; if ((e | 0) < 1) e = 0; else e = Td((e * 26214 | 0) >>> 15 & 65535, l) | 0; Ab(p, d, e, 40, h); e = f + (n << 1) | 0; He(t, d, e, 40, q, 1); Ca(r, m, e, 29491, 40, h); e = (n << 16) + 2621440 | 0; if ((e | 0) < 10485760) { n = e >> 16; g = g + 22 | 0; } else break } k = d + 104 | 0; j = d + 424 | 0; e = k + 20 | 0; do { a[k >> 0] = a[j >> 0] | 0; k = k + 1 | 0; j = j + 1 | 0; } while ((k | 0) < (e | 0)); i = w; return } } function Db(a, b) { a = a | 0; b = b | 0; var d = 0, e = 0; if (!a) { a = -1; return a | 0 } c[a >> 2] = 0; d = Je(1764) | 0; if (!d) { a = -1; return a | 0 } if ((Ua(d) | 0) << 16 >> 16 == 0 ? (e = d + 1748 | 0, (xb(e) | 0) << 16 >> 16 == 0) : 0) { Va(d, 0) | 0; Bb(d + 1304 | 0) | 0; xb(e) | 0; c[d + 1760 >> 2] = 0; c[a >> 2] = d; a = 0; return a | 0 } b = c[d >> 2] | 0; if (!b) { a = -1; return a | 0 } Ke(b); c[d >> 2] = 0; a = -1; return a | 0 } function Eb(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function Fb(a, d, f, g, h) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; var j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0; v = i; i = i + 208 | 0; u = v + 88 | 0; t = v; s = a + 1164 | 0; j = c[a + 1256 >> 2] | 0; if ((g + -5 | 0) >>> 0 < 2) { r = j + 16 | 0; if ((b[r >> 1] | 0) > 0) { q = c[(c[a + 1260 >> 2] | 0) + 32 >> 2] | 0; p = 0; j = 0; while (1) { o = q + (p << 1) | 0; m = b[o >> 1] | 0; if (m << 16 >> 16 > 0) { l = f; n = 0; k = 0; while (1) { k = e[l >> 1] | k << 1 & 131070; n = n + 1 << 16 >> 16; if (n << 16 >> 16 >= m << 16 >> 16) break; else l = l + 2 | 0; } k = k & 65535; } else k = 0; b[u + (p << 1) >> 1] = k; j = j + 1 << 16 >> 16; if (j << 16 >> 16 < (b[r >> 1] | 0)) { f = f + (b[o >> 1] << 1) | 0; p = j << 16 >> 16; } else break } } } else { q = j + (d << 1) | 0; if ((b[q >> 1] | 0) > 0) { r = c[(c[a + 1260 >> 2] | 0) + (d << 2) >> 2] | 0; o = 0; j = 0; while (1) { p = r + (o << 1) | 0; m = b[p >> 1] | 0; if (m << 16 >> 16 > 0) { l = f; n = 0; k = 0; while (1) { k = e[l >> 1] | k << 1 & 131070; n = n + 1 << 16 >> 16; if (n << 16 >> 16 >= m << 16 >> 16) break; else l = l + 2 | 0; } k = k & 65535; } else k = 0; b[u + (o << 1) >> 1] = k; j = j + 1 << 16 >> 16; if (j << 16 >> 16 < (b[q >> 1] | 0)) { f = f + (b[p >> 1] << 1) | 0; o = j << 16 >> 16; } else break } } } Wa(a, d, u, g, h, t); Cb(a + 1304 | 0, d, h, t, s); yb(a + 1748 | 0, h, 160, s); j = 0; do { a = h + (j << 1) | 0; b[a >> 1] = e[a >> 1] & 65528; j = j + 1 | 0; } while ((j | 0) != 160); i = v; return } function Gb(a, f, g, h) { a = a | 0; f = f | 0; g = g | 0; h = h | 0; var i = 0, j = 0, k = 0; j = c[h + 100 >> 2] | 0; k = (e[(c[h + 96 >> 2] | 0) + (a << 1) >> 1] | 0) + 65535 | 0; h = k & 65535; i = h << 16 >> 16 > -1; if (a >>> 0 < 8) { if (!i) return; j = c[j + (a << 2) >> 2] | 0; i = k << 16 >> 16; while (1) { b[g + (b[j + (i << 1) >> 1] << 1) >> 1] = (d[f + (i >> 3) >> 0] | 0) >>> (i & 7 ^ 7) & 1; h = h + -1 << 16 >> 16; if (h << 16 >> 16 > -1) i = h << 16 >> 16; else break } return } else { if (!i) return; i = k << 16 >> 16; while (1) { b[g + (i << 1) >> 1] = (d[f + (i >> 3) >> 0] | 0) >>> (i & 7 ^ 7) & 1; h = h + -1 << 16 >> 16; if (h << 16 >> 16 > -1) i = h << 16 >> 16; else break } return } } function Hb(a, b, c) { a = a | 0; b = b | 0; c = c | 0; a = vd(a, c, 31764) | 0; return ((sd(b) | 0 | a) << 16 >> 16 != 0) << 31 >> 31 | 0 } function Ib(a, b) { a = a | 0; b = b | 0; wd(a); td(b); return } function Jb(d, f, g, h, j, k, l) { d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; var m = 0, n = 0, o = 0, p = 0, q = 0; q = i; i = i + 512 | 0; m = q + 8 | 0; n = q + 4 | 0; o = q; c[o >> 2] = 0; p = l << 16 >> 16 == 3; if (!((l & 65535) < 2 | p & 1)) { if (l << 16 >> 16 != 2) { j = -1; i = q; return j | 0 } xd(d, g, h, m + 2 | 0, o); d = c[o >> 2] | 0; c[k >> 2] = d; ud(f, d, n); f = c[n >> 2] | 0; b[m >> 1] = f; b[m + 490 >> 1] = (f | 0) == 3 ? -1 : g & 65535; a[j >> 0] = f; f = 1; do { m = m + 1 | 0; a[j + f >> 0] = a[m >> 0] | 0; f = f + 1 | 0; } while ((f | 0) != 492); m = 492; i = q; return m | 0 } xd(d, g, h, m, o); ud(f, c[o >> 2] | 0, n); h = c[n >> 2] | 0; if ((h | 0) != 3) { f = c[o >> 2] | 0; c[k >> 2] = f; if ((f | 0) == 8) { switch (h | 0) { case 1: { b[m + 70 >> 1] = 0; break } case 2: { o = m + 70 | 0; b[o >> 1] = e[o >> 1] | 0 | 1; break } default: { } } b[m + 72 >> 1] = g & 1; b[m + 74 >> 1] = g >>> 1 & 1; b[m + 76 >> 1] = g >>> 2 & 1; f = 8; } } else { c[k >> 2] = 15; f = 15; } if (p) { tc(f, m, j, (c[d + 4 >> 2] | 0) + 2392 | 0); j = b[3404 + (c[k >> 2] << 16 >> 16 << 1) >> 1] | 0; i = q; return j | 0 } switch (l << 16 >> 16) { case 0: { sc(f, m, j, (c[d + 4 >> 2] | 0) + 2392 | 0); j = b[3404 + (c[k >> 2] << 16 >> 16 << 1) >> 1] | 0; i = q; return j | 0 } case 1: { rc(f, m, j, (c[d + 4 >> 2] | 0) + 2392 | 0); j = b[3436 + (c[k >> 2] << 16 >> 16 << 1) >> 1] | 0; i = q; return j | 0 } default: { j = -1; i = q; return j | 0 } } return 0 } function Kb(a, c, d, e, f, g) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; var h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0; y = i; i = i + 480 | 0; x = y; g = 240; l = f; k = a; j = x; h = 0; while (1) { w = ((Z(b[l >> 1] | 0, b[k >> 1] | 0) | 0) + 16384 | 0) >>> 15; b[j >> 1] = w; w = w << 16; h = (Z(w >> 15, w >> 16) | 0) + h | 0; if ((h | 0) < 0) { m = 4; break } g = g + -1 | 0; if (!((g & 65535) << 16 >> 16)) { g = 0; break } else { l = l + 2 | 0; k = k + 2 | 0; j = j + 2 | 0; } } if ((m | 0) == 4) { h = g & 65535; j = 240 - g | 0; if (!(h << 16 >> 16)) g = 0; else { l = h; k = f + (j << 1) | 0; g = a + (j << 1) | 0; h = x + (j << 1) | 0; while (1) { b[h >> 1] = ((Z(b[k >> 1] | 0, b[g >> 1] | 0) | 0) + 16384 | 0) >>> 15; l = l + -1 << 16 >> 16; if (!(l << 16 >> 16)) { g = 0; break } else { k = k + 2 | 0; g = g + 2 | 0; h = h + 2 | 0; } } } do { k = g & 65535; g = 120; j = x; h = 0; while (1) { w = (b[j >> 1] | 0) >>> 2; u = j + 2 | 0; b[j >> 1] = w; w = w << 16 >> 16; w = Z(w, w) | 0; v = (b[u >> 1] | 0) >>> 2; b[u >> 1] = v; v = v << 16 >> 16; h = ((Z(v, v) | 0) + w << 1) + h | 0; g = g + -1 << 16 >> 16; if (!(g << 16 >> 16)) break; else j = j + 4 | 0; } g = k + 4 | 0; } while ((h | 0) < 1) } w = h + 1 | 0; v = (pe(w) | 0) << 16 >> 16; w = w << v; b[d >> 1] = w >>> 16; b[e >> 1] = (w >>> 1) - (w >> 16 << 15); w = x + 478 | 0; l = c << 16 >> 16; if (c << 16 >> 16 <= 0) { x = v - g | 0; x = x & 65535; i = y; return x | 0 } r = x + 476 | 0; s = v + 1 | 0; t = 239 - l | 0; u = x + (236 - l << 1) | 0; c = l; d = d + (l << 1) | 0; e = e + (l << 1) | 0; while (1) { m = Z((t >>> 1) + 65535 & 65535, -2) | 0; k = x + (m + 236 << 1) | 0; m = u + (m << 1) | 0; f = 240 - c | 0; q = f + -1 | 0; j = x + (q << 1) | 0; a = q >>> 1 & 65535; f = x + (f + -2 << 1) | 0; l = Z(b[w >> 1] | 0, b[j >> 1] | 0) | 0; if (!(a << 16 >> 16)) { m = f; k = r; } else { p = r; o = w; while (1) { h = j + -4 | 0; n = o + -4 | 0; l = (Z(b[p >> 1] | 0, b[f >> 1] | 0) | 0) + l | 0; a = a + -1 << 16 >> 16; l = (Z(b[n >> 1] | 0, b[h >> 1] | 0) | 0) + l | 0; if (!(a << 16 >> 16)) break; else { f = j + -6 | 0; p = o + -6 | 0; j = h; o = n; } } } if (q & 1) l = (Z(b[k >> 1] | 0, b[m >> 1] | 0) | 0) + l | 0; q = l << s; b[d >> 1] = q >>> 16; b[e >> 1] = (q >>> 1) - (q >> 16 << 15); if ((c & 65535) + -1 << 16 >> 16 << 16 >> 16 > 0) { t = t + 1 | 0; u = u + 2 | 0; c = c + -1 | 0; d = d + -2 | 0; e = e + -2 | 0; } else break } x = v - g | 0; x = x & 65535; i = y; return x | 0 } function Lb(a, c, d, f, g, h, j, k) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; var l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0; E = i; i = i + 3440 | 0; D = E + 3420 | 0; z = E + 3400 | 0; A = E + 3224 | 0; C = E; x = E + 3320 | 0; B = E + 3240 | 0; y = E + 24 | 0; hc(d, a, x, 2, k); rd(x, c, B, A, 5, z, 5, k); fc(d, B, y, k); pd(10, 5, 5, x, y, z, A, C, k); c = f; k = c + 80 | 0; do { b[c >> 1] = 0; c = c + 2 | 0; } while ((c | 0) < (k | 0)); b[h >> 1] = 65535; b[h + 2 >> 1] = 65535; b[h + 4 >> 1] = 65535; b[h + 6 >> 1] = 65535; b[h + 8 >> 1] = 65535; p = 0; q = C; r = D; do { a = b[q >> 1] | 0; q = q + 2 | 0; l = (a * 6554 | 0) >>> 15; m = l << 16 >> 16; c = f + (a << 1) | 0; k = b[c >> 1] | 0; if ((b[B + (a << 1) >> 1] | 0) > 0) { b[c >> 1] = k + 4096; b[r >> 1] = 8192; n = l; } else { b[c >> 1] = k + 61440; b[r >> 1] = -8192; n = m + 8 | 0; } r = r + 2 | 0; o = n & 65535; c = a - (l << 2) - m << 16 >> 16; l = h + (c << 1) | 0; k = b[l >> 1] | 0; a = k << 16 >> 16; do if (k << 16 >> 16 >= 0) { m = n << 16 >> 16; if (!((m ^ a) & 8)) { c = h + (c + 5 << 1) | 0; if ((a | 0) > (m | 0)) { b[c >> 1] = k; b[l >> 1] = o; break } else { b[c >> 1] = o; break } } else { c = h + (c + 5 << 1) | 0; if ((a & 7) >>> 0 > (m & 7) >>> 0) { b[c >> 1] = o; break } else { b[c >> 1] = k; b[l >> 1] = o; break } } } else b[l >> 1] = o; while (0); p = p + 1 << 16 >> 16; } while (p << 16 >> 16 < 10); r = D + 2 | 0; p = D + 4 | 0; n = D + 6 | 0; m = D + 8 | 0; l = D + 10 | 0; c = D + 12 | 0; k = D + 14 | 0; a = D + 16 | 0; s = D + 18 | 0; t = 40; u = d + (0 - (b[C >> 1] | 0) << 1) | 0; v = d + (0 - (b[C + 2 >> 1] | 0) << 1) | 0; w = d + (0 - (b[C + 4 >> 1] | 0) << 1) | 0; x = d + (0 - (b[C + 6 >> 1] | 0) << 1) | 0; y = d + (0 - (b[C + 8 >> 1] | 0) << 1) | 0; z = d + (0 - (b[C + 10 >> 1] | 0) << 1) | 0; A = d + (0 - (b[C + 12 >> 1] | 0) << 1) | 0; B = d + (0 - (b[C + 14 >> 1] | 0) << 1) | 0; f = d + (0 - (b[C + 16 >> 1] | 0) << 1) | 0; q = d + (0 - (b[C + 18 >> 1] | 0) << 1) | 0; o = g; while (1) { K = (Z(b[D >> 1] | 0, b[u >> 1] | 0) | 0) >> 7; J = (Z(b[r >> 1] | 0, b[v >> 1] | 0) | 0) >> 7; I = (Z(b[p >> 1] | 0, b[w >> 1] | 0) | 0) >> 7; H = (Z(b[n >> 1] | 0, b[x >> 1] | 0) | 0) >> 7; G = (Z(b[m >> 1] | 0, b[y >> 1] | 0) | 0) >> 7; F = (Z(b[l >> 1] | 0, b[z >> 1] | 0) | 0) >> 7; C = (Z(b[c >> 1] | 0, b[A >> 1] | 0) | 0) >> 7; d = (Z(b[k >> 1] | 0, b[B >> 1] | 0) | 0) >>> 7; g = (Z(b[a >> 1] | 0, b[f >> 1] | 0) | 0) >>> 7; b[o >> 1] = (K + 128 + J + I + H + G + F + C + d + g + ((Z(b[s >> 1] | 0, b[q >> 1] | 0) | 0) >>> 7) | 0) >>> 8; t = t + -1 << 16 >> 16; if (!(t << 16 >> 16)) break; else { u = u + 2 | 0; v = v + 2 | 0; w = w + 2 | 0; x = x + 2 | 0; y = y + 2 | 0; z = z + 2 | 0; A = A + 2 | 0; B = B + 2 | 0; f = f + 2 | 0; q = q + 2 | 0; o = o + 2 | 0; } } c = 0; do { k = h + (c << 1) | 0; a = b[k >> 1] | 0; if ((c | 0) < 5) a = (e[j + ((a & 7) << 1) >> 1] | a & 8) & 65535; else a = b[j + ((a & 7) << 1) >> 1] | 0; b[k >> 1] = a; c = c + 1 | 0; } while ((c | 0) != 10); i = E; return } function Mb(a, d, e, f, g, h, j, k) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; var l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0; N = i; i = i + 3456 | 0; I = N + 3448 | 0; G = N + 3360 | 0; E = N + 3368 | 0; p = N + 3280 | 0; H = N + 3200 | 0; F = N; K = (f & 65535) << 17; M = e << 16 >> 16; J = e << 16 >> 16 < 40; if (J) { f = K >> 16; e = M; do { m = (Z(b[d + (e - M << 1) >> 1] | 0, f) | 0) >> 15; if ((m | 0) > 32767) { c[k >> 2] = 1; m = 32767; } D = d + (e << 1) | 0; b[D >> 1] = Rd(b[D >> 1] | 0, m & 65535, k) | 0; e = e + 1 | 0; } while ((e & 65535) << 16 >> 16 != 40) } hc(d, a, E, 1, k); qd(E, H, p, 8); fc(d, H, F, k); D = G + 2 | 0; b[G >> 1] = 0; b[D >> 1] = 1; a = 1; m = 0; o = 1; p = 0; n = -1; do { B = b[2830 + (p << 1) >> 1] | 0; C = B << 16 >> 16; A = 0; do { y = b[2834 + (A << 1) >> 1] | 0; z = y << 16 >> 16; x = a; v = C; u = o; w = B; t = n; while (1) { l = b[E + (v << 1) >> 1] | 0; r = b[F + (v * 80 | 0) + (v << 1) >> 1] | 0; e = z; o = 1; s = y; a = y; n = -1; while (1) { f = Rd(l, b[E + (e << 1) >> 1] | 0, k) | 0; f = f << 16 >> 16; f = (Z(f, f) | 0) >>> 15; q = (b[F + (v * 80 | 0) + (e << 1) >> 1] << 15) + 32768 + ((b[F + (e * 80 | 0) + (e << 1) >> 1] | 0) + r << 14) | 0; if (((Z(f << 16 >> 16, o << 16 >> 16) | 0) - (Z(q >> 16, n << 16 >> 16) | 0) << 1 | 0) > 0) { o = q >>> 16 & 65535; a = s; n = f & 65535; } q = e + 5 | 0; s = q & 65535; if (s << 16 >> 16 >= 40) break; else e = q << 16 >> 16; } if (((Z(n << 16 >> 16, u << 16 >> 16) | 0) - (Z(o << 16 >> 16, t << 16 >> 16) | 0) << 1 | 0) > 0) { b[G >> 1] = w; b[D >> 1] = a; m = w; } else { a = x; o = u; n = t; } q = v + 5 | 0; w = q & 65535; if (w << 16 >> 16 >= 40) break; else { x = a; v = q << 16 >> 16; u = o; t = n; } } A = A + 1 | 0; } while ((A | 0) != 4); p = p + 1 | 0; } while ((p | 0) != 2); r = a; s = m; f = g; e = f + 80 | 0; do { b[f >> 1] = 0; f = f + 2 | 0; } while ((f | 0) < (e | 0)); o = s; e = 0; q = 0; f = 0; while (1) { m = o << 16 >> 16; l = b[H + (m << 1) >> 1] | 0; a = (m * 6554 | 0) >>> 15; o = a << 16; p = o >> 15; n = m - (p + (a << 3) << 16 >> 17) | 0; switch (n << 16 >> 16 | 0) { case 0: { p = o >> 10; a = 1; break } case 1: { if (!((e & 65535) << 16 >> 16)) a = 0; else { p = a << 22 >> 16 | 16; a = 1; } break } case 2: { p = a << 22 >> 16 | 32; a = 1; break } case 3: { p = a << 17 >> 16 | 1; a = 0; break } case 4: { p = a << 22 >> 16 | 48; a = 1; break } default: { p = a; a = n & 65535; } } p = p & 65535; n = g + (m << 1) | 0; if (l << 16 >> 16 > 0) { b[n >> 1] = 8191; b[I + (e << 1) >> 1] = 32767; m = a << 16 >> 16; if (a << 16 >> 16 < 0) { m = 0 - m << 16; if ((m | 0) < 983040) m = 1 >>> (m >> 16) & 65535; else m = 0; } else { F = 1 << m; m = (F << 16 >> 16 >> m | 0) == 1 ? F & 65535 : 32767; } f = Rd(f, m, k) | 0; } else { b[n >> 1] = -8192; b[I + (e << 1) >> 1] = -32768; } m = Rd(q, p, k) | 0; e = e + 1 | 0; if ((e | 0) == 2) { q = m; break } o = b[G + (e << 1) >> 1] | 0; q = m; } b[j >> 1] = f; p = I + 2 | 0; o = b[I >> 1] | 0; a = 0; n = d + (0 - (s << 16 >> 16) << 1) | 0; m = d + (0 - (r << 16 >> 16) << 1) | 0; do { f = Z(b[n >> 1] | 0, o) | 0; n = n + 2 | 0; if ((f | 0) != 1073741824 ? (L = f << 1, !((f | 0) > 0 & (L | 0) < 0)) : 0) l = L; else { c[k >> 2] = 1; l = 2147483647; } e = Z(b[p >> 1] | 0, b[m >> 1] | 0) | 0; m = m + 2 | 0; if ((e | 0) != 1073741824) { f = (e << 1) + l | 0; if ((e ^ l | 0) > 0 & (f ^ l | 0) < 0) { c[k >> 2] = 1; f = (l >>> 31) + 2147483647 | 0; } } else { c[k >> 2] = 1; f = 2147483647; } b[h + (a << 1) >> 1] = Ce(f, k) | 0; a = a + 1 | 0; } while ((a | 0) != 40); if (!J) { i = N; return q | 0 } e = K >> 16; f = M; do { l = (Z(b[g + (f - M << 1) >> 1] | 0, e) | 0) >> 15; if ((l | 0) > 32767) { c[k >> 2] = 1; l = 32767; } h = g + (f << 1) | 0; b[h >> 1] = Rd(b[h >> 1] | 0, l & 65535, k) | 0; f = f + 1 | 0; } while ((f & 65535) << 16 >> 16 != 40); i = N; return q | 0 } function Nb(a, d, e, f, g, h, j, k, l, m) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; var n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0; x = i; i = i + 3456 | 0; r = x + 3360 | 0; s = x + 3368 | 0; t = x + 3280 | 0; u = x + 3200 | 0; v = x; w = g << 16 >> 16; p = w << 1; if ((p | 0) == (w << 17 >> 16 | 0)) q = p; else { c[m >> 2] = 1; q = g << 16 >> 16 > 0 ? 32767 : -32768; } w = f << 16 >> 16; n = f << 16 >> 16 < 40; if (n) { g = q << 16 >> 16; o = w; do { f = e + (o << 1) | 0; p = (Z(b[e + (o - w << 1) >> 1] | 0, g) | 0) >> 15; if ((p | 0) > 32767) { c[m >> 2] = 1; p = 32767; } b[f >> 1] = Rd(b[f >> 1] | 0, p & 65535, m) | 0; o = o + 1 | 0; } while ((o & 65535) << 16 >> 16 != 40) } hc(e, d, s, 1, m); qd(s, u, t, 8); fc(e, u, v, m); Ob(a, s, v, l, r); p = Pb(a, r, u, h, e, j, k, m) | 0; if (!n) { i = x; return p | 0 } o = q << 16 >> 16; g = w; do { f = h + (g << 1) | 0; n = (Z(b[h + (g - w << 1) >> 1] | 0, o) | 0) >> 15; if ((n | 0) > 32767) { c[m >> 2] = 1; n = 32767; } b[f >> 1] = Rd(b[f >> 1] | 0, n & 65535, m) | 0; g = g + 1 | 0; } while ((g & 65535) << 16 >> 16 != 40); i = x; return p | 0 } function Ob(a, c, d, f, g) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; g = g | 0; var h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0; x = g + 2 | 0; b[g >> 1] = 0; b[x >> 1] = 1; v = a << 16 >> 16 << 1; h = 1; w = 0; a = -1; do { u = (w << 3) + v << 16 >> 16; k = b[f + (u << 1) >> 1] | 0; u = b[f + ((u | 1) << 1) >> 1] | 0; i = k << 16 >> 16; a:do if (k << 16 >> 16 < 40) { t = u << 16 >> 16; if (u << 16 >> 16 < 40) s = h; else while (1) { if ((a << 16 >> 16 | 0) < (0 - (h << 16 >> 16) | 0)) { b[g >> 1] = k; b[x >> 1] = u; j = 1; a = -1; } else j = h; h = i + 5 | 0; k = h & 65535; if (k << 16 >> 16 >= 40) { h = j; break a } else { i = h << 16 >> 16; h = j; } } while (1) { q = b[d + (i * 80 | 0) + (i << 1) >> 1] | 0; p = e[c + (i << 1) >> 1] | 0; o = t; h = 1; r = u; j = u; l = -1; while (1) { n = (e[c + (o << 1) >> 1] | 0) + p << 16 >> 16; n = (Z(n, n) | 0) >>> 15; m = (b[d + (i * 80 | 0) + (o << 1) >> 1] << 15) + 32768 + ((b[d + (o * 80 | 0) + (o << 1) >> 1] | 0) + q << 14) | 0; if (((Z(n << 16 >> 16, h << 16 >> 16) | 0) - (Z(m >> 16, l << 16 >> 16) | 0) << 1 | 0) > 0) { h = m >>> 16 & 65535; j = r; l = n & 65535; } m = o + 5 | 0; r = m & 65535; if (r << 16 >> 16 >= 40) break; else o = m << 16 >> 16; } if (((Z(l << 16 >> 16, s << 16 >> 16) | 0) - (Z(h << 16 >> 16, a << 16 >> 16) | 0) << 1 | 0) > 0) { b[g >> 1] = k; b[x >> 1] = j; a = l; } else h = s; i = i + 5 | 0; k = i & 65535; if (k << 16 >> 16 >= 40) break; else { i = i << 16 >> 16; s = h; } } } while (0); w = w + 1 | 0; } while ((w | 0) != 2); return } function Pb(a, d, e, f, g, h, i, j) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; j = j | 0; var k = 0, l = 0, m = 0, n = 0, o = 0, p = 0; k = f; l = k + 80 | 0; do { b[k >> 1] = 0; k = k + 2 | 0; } while ((k | 0) < (l | 0)); k = b[d >> 1] | 0; o = (k * 6554 | 0) >>> 15; l = o << 16 >> 16; n = (748250 >>> ((k + (Z(l, -5) | 0) << 16 >> 16) + ((a << 16 >> 16) * 5 | 0) | 0) & 1 | 0) == 0; m = (b[e + (k << 1) >> 1] | 0) > 0; p = m ? 32767 : -32768; b[f + (k << 1) >> 1] = m ? 8191 : -8192; k = d + 2 | 0; a = b[k >> 1] | 0; f = f + (a << 1) | 0; if ((b[e + (a << 1) >> 1] | 0) > 0) { b[f >> 1] = 8191; e = 32767; f = (m & 1 | 2) & 65535; } else { b[f >> 1] = -8192; e = -32768; f = m & 1; } o = ((a * 6554 | 0) >>> 15 << 3) + (n ? o : l + 64 | 0) & 65535; b[i >> 1] = f; n = 0; m = g + (0 - (b[d >> 1] | 0) << 1) | 0; f = g + (0 - (b[k >> 1] | 0) << 1) | 0; do { k = Z(p, b[m >> 1] | 0) | 0; m = m + 2 | 0; if ((k | 0) == 1073741824) { c[j >> 2] = 1; a = 2147483647; } else a = k << 1; l = Z(e, b[f >> 1] | 0) | 0; f = f + 2 | 0; if ((l | 0) != 1073741824) { k = (l << 1) + a | 0; if ((l ^ a | 0) > 0 & (k ^ a | 0) < 0) { c[j >> 2] = 1; k = (a >>> 31) + 2147483647 | 0; } } else { c[j >> 2] = 1; k = 2147483647; } b[h + (n << 1) >> 1] = Ce(k, j) | 0; n = n + 1 | 0; } while ((n | 0) != 40); return o | 0 } function Qb(a, d, f, g, h, j, k, l) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; var m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0, O = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0; U = i; i = i + 3440 | 0; M = U + 3360 | 0; N = U + 3280 | 0; P = U + 3200 | 0; O = U; R = (g & 65535) << 17; T = f << 16 >> 16; Q = f << 16 >> 16 < 40; if (Q) { f = R >> 16; m = T; do { g = (Z(b[d + (m - T << 1) >> 1] | 0, f) | 0) >> 15; if ((g | 0) > 32767) { c[l >> 2] = 1; g = 32767; } L = d + (m << 1) | 0; b[L >> 1] = Rd(b[L >> 1] | 0, g & 65535, l) | 0; m = m + 1 | 0; } while ((m & 65535) << 16 >> 16 != 40) } hc(d, a, M, 1, l); qd(M, P, N, 6); fc(d, P, O, l); L = 1; n = 2; o = 1; g = 0; m = 1; a = -1; p = 1; while (1) { K = 2; s = 2; while (1) { H = 0; I = 0; J = p; G = s; while (1) { if (I << 16 >> 16 < 40) { C = J << 16 >> 16; D = J << 16 >> 16 < 40; E = G << 16 >> 16; F = G << 16 >> 16 < 40; A = I << 16 >> 16; B = I; while (1) { if ((b[N + (A << 1) >> 1] | 0) > -1) { x = b[O + (A * 80 | 0) + (A << 1) >> 1] | 0; if (D) { y = e[M + (A << 1) >> 1] | 0; w = C; r = 1; z = J; f = J; s = 0; q = -1; while (1) { u = (e[M + (w << 1) >> 1] | 0) + y | 0; v = u << 16 >> 16; v = (Z(v, v) | 0) >>> 15; t = (b[O + (A * 80 | 0) + (w << 1) >> 1] << 15) + 32768 + ((b[O + (w * 80 | 0) + (w << 1) >> 1] | 0) + x << 14) | 0; if (((Z(v << 16 >> 16, r << 16 >> 16) | 0) - (Z(t >> 16, q << 16 >> 16) | 0) << 1 | 0) > 0) { r = t >>> 16 & 65535; f = z; s = u & 65535; q = v & 65535; } t = w + 5 | 0; z = t & 65535; if (z << 16 >> 16 >= 40) break; else w = t << 16 >> 16; } } else { r = 1; f = J; s = 0; } if (F) { y = s & 65535; z = f << 16 >> 16; w = (r << 16 >> 16 << 14) + 32768 | 0; v = E; s = 1; x = G; q = G; r = -1; while (1) { u = (e[M + (v << 1) >> 1] | 0) + y << 16 >> 16; u = (Z(u, u) | 0) >>> 15; t = w + (b[O + (v * 80 | 0) + (v << 1) >> 1] << 12) + ((b[O + (A * 80 | 0) + (v << 1) >> 1] | 0) + (b[O + (z * 80 | 0) + (v << 1) >> 1] | 0) << 13) | 0; if (((Z(u << 16 >> 16, s << 16 >> 16) | 0) - (Z(t >> 16, r << 16 >> 16) | 0) << 1 | 0) > 0) { s = t >>> 16 & 65535; q = x; r = u & 65535; } t = v + 5 | 0; x = t & 65535; if (x << 16 >> 16 >= 40) { w = s; v = r; break } else v = t << 16 >> 16; } } else { w = 1; q = G; v = -1; } s = Z(v << 16 >> 16, m << 16 >> 16) | 0; if ((s | 0) == 1073741824) { c[l >> 2] = 1; t = 2147483647; } else t = s << 1; s = Z(w << 16 >> 16, a << 16 >> 16) | 0; if ((s | 0) == 1073741824) { c[l >> 2] = 1; r = 2147483647; } else r = s << 1; s = t - r | 0; if (((s ^ t) & (r ^ t) | 0) < 0) { c[l >> 2] = 1; s = (t >>> 31) + 2147483647 | 0; } z = (s | 0) > 0; n = z ? q : n; o = z ? f : o; g = z ? B : g; m = z ? w : m; a = z ? v : a; } s = A + 5 | 0; B = s & 65535; if (B << 16 >> 16 >= 40) break; else A = s << 16 >> 16; } } H = H + 1 << 16 >> 16; if (H << 16 >> 16 >= 3) break; else { F = G; G = J; J = I; I = F; } } f = K + 2 | 0; s = f & 65535; if (s << 16 >> 16 >= 5) break; else K = f & 65535; } f = L + 2 | 0; p = f & 65535; if (p << 16 >> 16 < 4) L = f & 65535; else { s = n; n = o; break } } f = h; m = f + 80 | 0; do { b[f >> 1] = 0; f = f + 2 | 0; } while ((f | 0) < (m | 0)); v = g << 16 >> 16; a = b[P + (v << 1) >> 1] | 0; g = (v * 6554 | 0) >>> 15; f = g << 16; m = v - (((f >> 16) * 327680 | 0) >>> 16) | 0; switch (m << 16 >> 16 | 0) { case 1: { g = f >> 12; break } case 2: { g = f >> 8; m = 2; break } case 3: { g = g << 20 >> 16 | 8; m = 1; break } case 4: { g = g << 24 >> 16 | 128; m = 2; break } default: { } } f = h + (v << 1) | 0; if (a << 16 >> 16 > 0) { b[f >> 1] = 8191; z = 32767; o = 65536 << (m << 16 >> 16) >>> 16 & 65535; } else { b[f >> 1] = -8192; z = -32768; o = 0; } t = n << 16 >> 16; n = b[P + (t << 1) >> 1] | 0; f = (t * 6554 | 0) >>> 15; m = f << 16; a = t - (((m >> 16) * 327680 | 0) >>> 16) | 0; switch (a << 16 >> 16 | 0) { case 1: { f = m >> 12; break } case 2: { f = m >> 8; a = 2; break } case 3: { f = f << 20 >> 16 | 8; a = 1; break } case 4: { f = f << 24 >> 16 | 128; a = 2; break } default: { } } m = h + (t << 1) | 0; if (n << 16 >> 16 > 0) { b[m >> 1] = 8191; u = 32767; o = (65536 << (a << 16 >> 16) >>> 16) + (o & 65535) & 65535; } else { b[m >> 1] = -8192; u = -32768; } p = f + g | 0; r = s << 16 >> 16; n = b[P + (r << 1) >> 1] | 0; g = (r * 6554 | 0) >>> 15; f = g << 16; m = r - (((f >> 16) * 327680 | 0) >>> 16) | 0; switch (m << 16 >> 16 | 0) { case 1: { f = f >> 12; break } case 2: { f = f >> 8; m = 2; break } case 3: { f = g << 20 >> 16 | 8; m = 1; break } case 4: { f = g << 24 >> 16 | 128; m = 2; break } default: f = g; } g = h + (r << 1) | 0; if (n << 16 >> 16 > 0) { b[g >> 1] = 8191; s = 32767; g = (65536 << (m << 16 >> 16) >>> 16) + (o & 65535) & 65535; } else { b[g >> 1] = -8192; s = -32768; g = o; } q = p + f | 0; b[k >> 1] = g; o = 0; p = d + (0 - v << 1) | 0; a = d + (0 - t << 1) | 0; n = d + (0 - r << 1) | 0; do { g = Z(b[p >> 1] | 0, z) | 0; p = p + 2 | 0; if ((g | 0) != 1073741824 ? (S = g << 1, !((g | 0) > 0 & (S | 0) < 0)) : 0) m = S; else { c[l >> 2] = 1; m = 2147483647; } g = Z(b[a >> 1] | 0, u) | 0; a = a + 2 | 0; if ((g | 0) != 1073741824) { f = (g << 1) + m | 0; if ((g ^ m | 0) > 0 & (f ^ m | 0) < 0) { c[l >> 2] = 1; f = (m >>> 31) + 2147483647 | 0; } } else { c[l >> 2] = 1; f = 2147483647; } m = Z(b[n >> 1] | 0, s) | 0; n = n + 2 | 0; if ((m | 0) != 1073741824) { g = (m << 1) + f | 0; if ((m ^ f | 0) > 0 & (g ^ f | 0) < 0) { c[l >> 2] = 1; g = (f >>> 31) + 2147483647 | 0; } } else { c[l >> 2] = 1; g = 2147483647; } b[j + (o << 1) >> 1] = Ce(g, l) | 0; o = o + 1 | 0; } while ((o | 0) != 40); g = q & 65535; if (!Q) { i = U; return g | 0 } m = R >> 16; f = T; do { a = (Z(b[h + (f - T << 1) >> 1] | 0, m) | 0) >> 15; if ((a | 0) > 32767) { c[l >> 2] = 1; a = 32767; } j = h + (f << 1) | 0; b[j >> 1] = Rd(b[j >> 1] | 0, a & 65535, l) | 0; f = f + 1 | 0; } while ((f & 65535) << 16 >> 16 != 40); i = U; return g | 0 } function Rb(a, d, f, g, h, j, k, l, m) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; var n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0, O = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0, V = 0, W = 0, X = 0, Y = 0, _ = 0, $ = 0, aa = 0, ba = 0, ca = 0, da = 0; da = i; i = i + 3456 | 0; _ = da + 3448 | 0; X = da + 3360 | 0; U = da + 3368 | 0; V = da + 3280 | 0; Y = da + 3200 | 0; W = da; aa = (g & 65535) << 17; ca = f << 16 >> 16; $ = f << 16 >> 16 < 40; if ($) { f = aa >> 16; n = ca; do { g = (Z(b[d + (n - ca << 1) >> 1] | 0, f) | 0) >> 15; if ((g | 0) > 32767) { c[m >> 2] = 1; g = 32767; } T = d + (n << 1) | 0; b[T >> 1] = Rd(b[T >> 1] | 0, g & 65535, m) | 0; n = n + 1 | 0; } while ((n & 65535) << 16 >> 16 != 40) } hc(d, a, U, 1, m); qd(U, Y, V, 4); fc(d, Y, W, m); R = X + 2 | 0; b[X >> 1] = 0; S = X + 4 | 0; b[R >> 1] = 1; T = X + 6 | 0; b[S >> 1] = 2; b[T >> 1] = 3; r = 3; p = 2; o = 1; g = 0; f = 1; n = -1; q = 3; do { M = 0; N = 0; O = q; P = 1; Q = 2; while (1) { if (N << 16 >> 16 < 40) { G = P << 16 >> 16; H = P << 16 >> 16 < 40; I = Q << 16 >> 16; J = Q << 16 >> 16 < 40; K = O << 16 >> 16; L = O << 16 >> 16 < 40; F = N << 16 >> 16; E = p; C = o; B = f; D = N; while (1) { if ((b[V + (F << 1) >> 1] | 0) > -1) { t = b[W + (F * 80 | 0) + (F << 1) >> 1] | 0; if (H) { s = e[U + (F << 1) >> 1] | 0; u = G; z = 1; p = P; o = P; x = 0; y = -1; while (1) { w = (e[U + (u << 1) >> 1] | 0) + s | 0; v = w << 16 >> 16; v = (Z(v, v) | 0) >>> 15; A = (b[W + (F * 80 | 0) + (u << 1) >> 1] << 15) + 32768 + ((b[W + (u * 80 | 0) + (u << 1) >> 1] | 0) + t << 14) | 0; if (((Z(v << 16 >> 16, z << 16 >> 16) | 0) - (Z(A >> 16, y << 16 >> 16) | 0) << 1 | 0) > 0) { z = A >>> 16 & 65535; o = p; x = w & 65535; y = v & 65535; } A = u + 5 | 0; p = A & 65535; if (p << 16 >> 16 >= 40) break; else u = A << 16 >> 16; } } else { z = 1; o = P; x = 0; } if (J) { f = x & 65535; a = o << 16 >> 16; t = (z << 16 >> 16 << 14) + 32768 | 0; u = I; A = 1; s = Q; p = Q; y = 0; x = -1; while (1) { w = (e[U + (u << 1) >> 1] | 0) + f | 0; v = w << 16 >> 16; v = (Z(v, v) | 0) >>> 15; z = t + (b[W + (u * 80 | 0) + (u << 1) >> 1] << 12) + ((b[W + (F * 80 | 0) + (u << 1) >> 1] | 0) + (b[W + (a * 80 | 0) + (u << 1) >> 1] | 0) << 13) | 0; if (((Z(v << 16 >> 16, A << 16 >> 16) | 0) - (Z(z >> 16, x << 16 >> 16) | 0) << 1 | 0) > 0) { A = z >>> 16 & 65535; p = s; y = w & 65535; x = v & 65535; } z = u + 5 | 0; s = z & 65535; if (s << 16 >> 16 >= 40) break; else u = z << 16 >> 16; } } else { A = 1; p = Q; y = 0; } if (L) { t = y & 65535; s = p << 16 >> 16; a = o << 16 >> 16; v = (A & 65535) << 16 | 32768; w = K; f = 1; u = O; z = O; A = -1; while (1) { x = (e[U + (w << 1) >> 1] | 0) + t << 16 >> 16; x = (Z(x, x) | 0) >>> 15; y = (b[W + (w * 80 | 0) + (w << 1) >> 1] << 12) + v + ((b[W + (a * 80 | 0) + (w << 1) >> 1] | 0) + (b[W + (s * 80 | 0) + (w << 1) >> 1] | 0) + (b[W + (F * 80 | 0) + (w << 1) >> 1] | 0) << 13) | 0; if (((Z(x << 16 >> 16, f << 16 >> 16) | 0) - (Z(y >> 16, A << 16 >> 16) | 0) << 1 | 0) > 0) { f = y >>> 16 & 65535; z = u; A = x & 65535; } y = w + 5 | 0; u = y & 65535; if (u << 16 >> 16 >= 40) break; else w = y << 16 >> 16; } } else { f = 1; z = O; A = -1; } if (((Z(A << 16 >> 16, B << 16 >> 16) | 0) - (Z(f << 16 >> 16, n << 16 >> 16) | 0) << 1 | 0) > 0) { b[X >> 1] = D; b[R >> 1] = o; b[S >> 1] = p; b[T >> 1] = z; r = z; g = D; n = A; } else { p = E; o = C; f = B; } } else { p = E; o = C; f = B; } w = F + 5 | 0; D = w & 65535; if (D << 16 >> 16 >= 40) break; else { F = w << 16 >> 16; E = p; C = o; B = f; } } } M = M + 1 << 16 >> 16; if (M << 16 >> 16 >= 4) break; else { K = Q; L = O; Q = P; P = N; O = K; N = L; } } q = q + 1 << 16 >> 16; } while (q << 16 >> 16 < 5); A = r; z = p; y = o; x = g; g = h; f = g + 80 | 0; do { b[g >> 1] = 0; g = g + 2 | 0; } while ((g | 0) < (f | 0)); a = x; f = 0; n = 0; g = 0; while (1) { p = a << 16 >> 16; q = b[Y + (p << 1) >> 1] | 0; a = p * 13108 >> 16; o = p - ((a * 327680 | 0) >>> 16) | 0; a = b[l + (a << 1) >> 1] | 0; switch (o << 16 >> 16 | 0) { case 1: { r = a << 16 >> 16 << 3 & 65535; break } case 2: { r = a << 16 >> 16 << 6 & 65535; break } case 3: { r = a << 16 >> 16 << 10 & 65535; break } case 4: { r = ((a & 65535) << 10 | 512) & 65535; o = 3; break } default: r = a; } a = h + (p << 1) | 0; if (q << 16 >> 16 > 0) { b[a >> 1] = 8191; a = 32767; g = (65536 << (o << 16 >> 16) >>> 16) + (g & 65535) & 65535; } else { b[a >> 1] = -8192; a = -32768; } b[_ + (f << 1) >> 1] = a; n = (r & 65535) + (n & 65535) | 0; f = f + 1 | 0; if ((f | 0) == 4) { w = n; break } a = b[X + (f << 1) >> 1] | 0; } b[k >> 1] = g; t = _ + 2 | 0; u = _ + 4 | 0; v = _ + 6 | 0; a = b[_ >> 1] | 0; s = 0; o = d + (0 - (x << 16 >> 16) << 1) | 0; p = d + (0 - (y << 16 >> 16) << 1) | 0; q = d + (0 - (z << 16 >> 16) << 1) | 0; r = d + (0 - (A << 16 >> 16) << 1) | 0; do { g = Z(b[o >> 1] | 0, a) | 0; o = o + 2 | 0; if ((g | 0) != 1073741824 ? (ba = g << 1, !((g | 0) > 0 & (ba | 0) < 0)) : 0) n = ba; else { c[m >> 2] = 1; n = 2147483647; } g = Z(b[t >> 1] | 0, b[p >> 1] | 0) | 0; p = p + 2 | 0; if ((g | 0) != 1073741824) { f = (g << 1) + n | 0; if ((g ^ n | 0) > 0 & (f ^ n | 0) < 0) { c[m >> 2] = 1; f = (n >>> 31) + 2147483647 | 0; } } else { c[m >> 2] = 1; f = 2147483647; } g = Z(b[u >> 1] | 0, b[q >> 1] | 0) | 0; q = q + 2 | 0; if ((g | 0) != 1073741824) { n = (g << 1) + f | 0; if ((g ^ f | 0) > 0 & (n ^ f | 0) < 0) { c[m >> 2] = 1; n = (f >>> 31) + 2147483647 | 0; } } else { c[m >> 2] = 1; n = 2147483647; } f = Z(b[v >> 1] | 0, b[r >> 1] | 0) | 0; r = r + 2 | 0; if ((f | 0) != 1073741824) { g = (f << 1) + n | 0; if ((f ^ n | 0) > 0 & (g ^ n | 0) < 0) { c[m >> 2] = 1; g = (n >>> 31) + 2147483647 | 0; } } else { c[m >> 2] = 1; g = 2147483647; } b[j + (s << 1) >> 1] = Ce(g, m) | 0; s = s + 1 | 0; } while ((s | 0) != 40); g = w & 65535; if (((ca << 16) + -2621440 | 0) > -1 | $ ^ 1) { i = da; return g | 0 } n = aa >> 16; f = ca; do { a = (Z(b[h + (f - ca << 1) >> 1] | 0, n) | 0) >> 15; if ((a | 0) > 32767) { c[m >> 2] = 1; a = 32767; } j = h + (f << 1) | 0; b[j >> 1] = Rd(b[j >> 1] | 0, a & 65535, m) | 0; f = f + 1 | 0; } while ((f & 65535) << 16 >> 16 != 40); i = da; return g | 0 } function Sb(a, d, f, g, h, j, k) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; var l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0; L = i; i = i + 3440 | 0; t = L + 3424 | 0; G = L + 3408 | 0; H = L + 3240 | 0; u = L + 3224 | 0; E = L + 3328 | 0; s = L + 3248 | 0; F = L + 24 | 0; K = L + 16 | 0; J = L; gc(f, a, E, 2, 4, 4, k); rd(E, d, s, H, 4, G, 4, k); fc(f, s, F, k); pd(8, 4, 4, E, F, G, H, u, k); d = g; a = d + 80 | 0; do { b[d >> 1] = 0; d = d + 2 | 0; } while ((d | 0) < (a | 0)); b[J >> 1] = -1; b[K >> 1] = -1; C = J + 2 | 0; b[C >> 1] = -1; D = K + 2 | 0; b[D >> 1] = -1; E = J + 4 | 0; b[E >> 1] = -1; F = K + 4 | 0; b[F >> 1] = -1; H = J + 6 | 0; b[H >> 1] = -1; G = K + 6 | 0; b[G >> 1] = -1; q = 0; do { o = b[u + (q << 1) >> 1] | 0; d = o >>> 2; m = d & 65535; a = o & 3; n = (b[s + (o << 1) >> 1] | 0) > 0; o = g + (o << 1) | 0; r = n & 1 ^ 1; b[o >> 1] = (e[o >> 1] | 0) + (n ? 8191 : 57345); b[t + (q << 1) >> 1] = n ? 32767 : -32768; n = J + (a << 1) | 0; o = b[n >> 1] | 0; do if (o << 16 >> 16 >= 0) { p = K + (a << 1) | 0; l = (o << 16 >> 16 | 0) <= (d << 16 >> 16 | 0); d = J + ((a | 4) << 1) | 0; if ((r & 65535 | 0) == (e[p >> 1] & 1 | 0)) if (l) { b[d >> 1] = m; break } else { b[d >> 1] = o; b[n >> 1] = m; b[p >> 1] = r; break } else if (l) { b[d >> 1] = o; b[n >> 1] = m; b[p >> 1] = r; break } else { b[d >> 1] = m; break } } else { b[n >> 1] = m; b[K + (a << 1) >> 1] = r; } while (0); q = q + 1 | 0; } while ((q | 0) != 8); v = t + 2 | 0; w = t + 4 | 0; x = t + 6 | 0; y = t + 8 | 0; z = t + 10 | 0; A = t + 12 | 0; B = t + 14 | 0; t = b[t >> 1] | 0; q = 0; p = f + (0 - (b[u >> 1] | 0) << 1) | 0; o = f + (0 - (b[u + 2 >> 1] | 0) << 1) | 0; n = f + (0 - (b[u + 4 >> 1] | 0) << 1) | 0; m = f + (0 - (b[u + 6 >> 1] | 0) << 1) | 0; d = f + (0 - (b[u + 8 >> 1] | 0) << 1) | 0; a = f + (0 - (b[u + 10 >> 1] | 0) << 1) | 0; l = f + (0 - (b[u + 12 >> 1] | 0) << 1) | 0; f = f + (0 - (b[u + 14 >> 1] | 0) << 1) | 0; do { r = Z(b[p >> 1] | 0, t) | 0; p = p + 2 | 0; if ((r | 0) != 1073741824 ? (I = r << 1, !((r | 0) > 0 & (I | 0) < 0)) : 0) r = I; else { c[k >> 2] = 1; r = 2147483647; } s = Z(b[v >> 1] | 0, b[o >> 1] | 0) | 0; o = o + 2 | 0; if ((s | 0) != 1073741824) { g = (s << 1) + r | 0; if ((s ^ r | 0) > 0 & (g ^ r | 0) < 0) { c[k >> 2] = 1; r = (r >>> 31) + 2147483647 | 0; } else r = g; } else { c[k >> 2] = 1; r = 2147483647; } s = Z(b[w >> 1] | 0, b[n >> 1] | 0) | 0; n = n + 2 | 0; if ((s | 0) != 1073741824) { g = (s << 1) + r | 0; if ((s ^ r | 0) > 0 & (g ^ r | 0) < 0) { c[k >> 2] = 1; g = (r >>> 31) + 2147483647 | 0; } } else { c[k >> 2] = 1; g = 2147483647; } s = Z(b[x >> 1] | 0, b[m >> 1] | 0) | 0; m = m + 2 | 0; if ((s | 0) != 1073741824) { r = (s << 1) + g | 0; if ((s ^ g | 0) > 0 & (r ^ g | 0) < 0) { c[k >> 2] = 1; r = (g >>> 31) + 2147483647 | 0; } } else { c[k >> 2] = 1; r = 2147483647; } s = Z(b[y >> 1] | 0, b[d >> 1] | 0) | 0; d = d + 2 | 0; if ((s | 0) != 1073741824) { g = (s << 1) + r | 0; if ((s ^ r | 0) > 0 & (g ^ r | 0) < 0) { c[k >> 2] = 1; g = (r >>> 31) + 2147483647 | 0; } } else { c[k >> 2] = 1; g = 2147483647; } s = Z(b[z >> 1] | 0, b[a >> 1] | 0) | 0; a = a + 2 | 0; if ((s | 0) != 1073741824) { r = (s << 1) + g | 0; if ((s ^ g | 0) > 0 & (r ^ g | 0) < 0) { c[k >> 2] = 1; r = (g >>> 31) + 2147483647 | 0; } } else { c[k >> 2] = 1; r = 2147483647; } s = Z(b[A >> 1] | 0, b[l >> 1] | 0) | 0; l = l + 2 | 0; if ((s | 0) != 1073741824) { g = (s << 1) + r | 0; if ((s ^ r | 0) > 0 & (g ^ r | 0) < 0) { c[k >> 2] = 1; g = (r >>> 31) + 2147483647 | 0; } } else { c[k >> 2] = 1; g = 2147483647; } s = Z(b[B >> 1] | 0, b[f >> 1] | 0) | 0; f = f + 2 | 0; if ((s | 0) != 1073741824) { r = (s << 1) + g | 0; if ((s ^ g | 0) > 0 & (r ^ g | 0) < 0) { c[k >> 2] = 1; r = (g >>> 31) + 2147483647 | 0; } } else { c[k >> 2] = 1; r = 2147483647; } b[h + (q << 1) >> 1] = Ce(r, k) | 0; q = q + 1 | 0; } while ((q | 0) != 40); b[j >> 1] = b[K >> 1] | 0; b[j + 2 >> 1] = b[D >> 1] | 0; b[j + 4 >> 1] = b[F >> 1] | 0; b[j + 6 >> 1] = b[G >> 1] | 0; a = b[J >> 1] | 0; d = b[J + 8 >> 1] | 0; l = b[C >> 1] | 0; b[j + 8 >> 1] = d << 1 & 2 | a & 1 | l << 2 & 4 | (((d >> 1) * 327680 | 0) + (a >>> 1 << 16) + (Z(l >> 1, 1638400) | 0) | 0) >>> 13 & 65528; l = b[E >> 1] | 0; a = b[J + 12 >> 1] | 0; d = b[J + 10 >> 1] | 0; b[j + 10 >> 1] = a << 1 & 2 | l & 1 | d << 2 & 4 | (((a >> 1) * 327680 | 0) + (l >>> 1 << 16) + (Z(d >> 1, 1638400) | 0) | 0) >>> 13 & 65528; d = b[J + 14 >> 1] | 0; l = b[H >> 1] | 0; a = l << 16 >> 16 >>> 1; if (!(d & 2)) { h = a; k = d << 16 >> 16; K = k >> 1; K = K * 327680 | 0; h = h << 16; K = h + K | 0; K = K << 5; K = K >> 16; K = K | 12; K = K * 2622 | 0; K = K >>> 16; h = l & 65535; h = h & 1; k = k << 17; k = k & 131072; K = K << 18; k = K | k; k = k >>> 16; h = k | h; h = h & 65535; j = j + 12 | 0; b[j >> 1] = h; i = L; return } h = 4 - (a << 16 >> 16) | 0; k = d << 16 >> 16; K = k >> 1; K = K * 327680 | 0; h = h << 16; K = h + K | 0; K = K << 5; K = K >> 16; K = K | 12; K = K * 2622 | 0; K = K >>> 16; h = l & 65535; h = h & 1; k = k << 17; k = k & 131072; K = K << 18; k = K | k; k = k >>> 16; h = k | h; h = h & 65535; j = j + 12 | 0; b[j >> 1] = h; i = L; return } function Tb(a, d, e, f, g) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; var h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0; r = e << 16 >> 16; h = 0 - r | 0; e = g + (h << 2) | 0; g = ((r - (f << 16 >> 16) | 0) >>> 2) + 1 & 65535; if (g << 16 >> 16 <= 0) return; r = d << 16 >> 16 >>> 1 & 65535; if (!(r << 16 >> 16)) { while (1) { c[e >> 2] = 0; c[e + 4 >> 2] = 0; c[e + 8 >> 2] = 0; c[e + 12 >> 2] = 0; if (g << 16 >> 16 > 1) { e = e + 16 | 0; g = g + -1 << 16 >> 16; } else break } return } q = a + (h << 1) | 0; while (1) { l = q + 4 | 0; n = b[l >> 1] | 0; j = b[q >> 1] | 0; m = n; k = r; o = a; p = q; q = q + 8 | 0; i = 0; h = 0; f = 0; d = 0; while (1) { t = b[o >> 1] | 0; s = (Z(j << 16 >> 16, t) | 0) + i | 0; i = b[p + 2 >> 1] | 0; h = (Z(i, t) | 0) + h | 0; j = (Z(m << 16 >> 16, t) | 0) + f | 0; f = b[p + 6 >> 1] | 0; m = (Z(f, t) | 0) + d | 0; d = b[o + 2 >> 1] | 0; i = s + (Z(d, i) | 0) | 0; h = h + (Z(n << 16 >> 16, d) | 0) | 0; l = l + 4 | 0; f = j + (Z(d, f) | 0) | 0; j = b[l >> 1] | 0; d = m + (Z(j << 16 >> 16, d) | 0) | 0; k = k + -1 << 16 >> 16; if (!(k << 16 >> 16)) break; t = n; m = j; n = b[p + 8 >> 1] | 0; o = o + 4 | 0; p = p + 4 | 0; j = t; } c[e >> 2] = i << 1; c[e + 4 >> 2] = h << 1; c[e + 8 >> 2] = f << 1; c[e + 12 >> 2] = d << 1; if (g << 16 >> 16 <= 1) break; else { e = e + 16 | 0; g = g + -1 << 16 >> 16; } } return } function Ub(a, d, f, g, h, j, k, l, m) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; var n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0; y = i; i = i + 16 | 0; w = y + 2 | 0; x = y; do if (h << 16 >> 16 > 0) { s = g << 16 >> 16; u = 0; p = 0; g = 0; o = 0; t = 0; while (1) { n = b[a + (u << 1) >> 1] | 0; q = n << 16 >> 16; p = (Z(q, q) | 0) + p | 0; q = b[d + (u << 1) >> 1] | 0; g = (Z(q, q) | 0) + g | 0; o = (Z(b[f + (u << 1) >> 1] | 0, q) | 0) + o | 0; q = Z(q, s) | 0; if ((q | 0) == 1073741824) { c[m >> 2] = 1; r = 2147483647; } else r = q << 1; q = r << 1; q = (Ge(n, Ce((q >> 1 | 0) == (r | 0) ? q : r >> 31 ^ 2147483647, m) | 0, m) | 0) << 16 >> 16; q = Z(q, q) | 0; if ((q | 0) != 1073741824) { n = (q << 1) + t | 0; if ((q ^ t | 0) > 0 & (n ^ t | 0) < 0) { c[m >> 2] = 1; n = (t >>> 31) + 2147483647 | 0; } } else { c[m >> 2] = 1; n = 2147483647; } u = u + 1 | 0; if ((u & 65535) << 16 >> 16 == h << 16 >> 16) { t = n; break } else t = n; } p = p << 1; g = g << 1; o = o << 1; if ((p | 0) >= 0) { if ((p | 0) < 400) { n = t; v = 14; break } } else { c[m >> 2] = 1; p = 2147483647; } r = pe(p) | 0; q = r << 16 >> 16; if (r << 16 >> 16 > 0) { n = p << q; if ((n >> q | 0) != (p | 0)) n = p >> 31 ^ 2147483647; } else { n = 0 - q << 16; if ((n | 0) < 2031616) n = p >> (n >> 16); else n = 0; } b[j >> 1] = n >>> 16; p = g; s = o; n = t; g = 15 - (r & 65535) & 65535; } else { g = 0; o = 0; n = 0; v = 14; } while (0); if ((v | 0) == 14) { b[j >> 1] = 0; p = g; s = o; g = -15; } b[k >> 1] = g; if ((p | 0) < 0) { c[m >> 2] = 1; p = 2147483647; } q = pe(p) | 0; o = q << 16 >> 16; if (q << 16 >> 16 > 0) { g = p << o; if ((g >> o | 0) != (p | 0)) g = p >> 31 ^ 2147483647; } else { g = 0 - o << 16; if ((g | 0) < 2031616) g = p >> (g >> 16); else g = 0; } b[j + 2 >> 1] = g >>> 16; b[k + 2 >> 1] = 15 - (q & 65535); p = pe(s) | 0; o = p << 16 >> 16; if (p << 16 >> 16 > 0) { g = s << o; if ((g >> o | 0) != (s | 0)) g = s >> 31 ^ 2147483647; } else { g = 0 - o << 16; if ((g | 0) < 2031616) g = s >> (g >> 16); else g = 0; } b[j + 4 >> 1] = g >>> 16; b[k + 4 >> 1] = 2 - (p & 65535); p = pe(n) | 0; g = p << 16 >> 16; if (p << 16 >> 16 > 0) { o = n << g; if ((o >> g | 0) != (n | 0)) o = n >> 31 ^ 2147483647; } else { g = 0 - g << 16; if ((g | 0) < 2031616) o = n >> (g >> 16); else o = 0; } g = o >>> 16 & 65535; n = 15 - (p & 65535) & 65535; b[j + 6 >> 1] = g; b[k + 6 >> 1] = n; if ((o >> 16 | 0) <= 0) { m = 0; b[l >> 1] = m; i = y; return } o = b[j >> 1] | 0; if (!(o << 16 >> 16)) { m = 0; b[l >> 1] = m; i = y; return } g = Td(De(o, 1, m) | 0, g) | 0; g = (g & 65535) << 16; o = ((Ge(n, b[k >> 1] | 0, m) | 0) & 65535) + 3 | 0; n = o & 65535; o = o << 16 >> 16; if (n << 16 >> 16 > 0) n = n << 16 >> 16 < 31 ? g >> o : 0; else { k = 0 - o << 16 >> 16; n = g << k; n = (n >> k | 0) == (g | 0) ? n : g >> 31 ^ 2147483647; } de(n, w, x, m); x = Ic((e[w >> 1] | 0) + 65509 & 65535, b[x >> 1] | 0, m) | 0; w = x << 13; m = Ce((w >> 13 | 0) == (x | 0) ? w : x >> 31 ^ 2147483647, m) | 0; b[l >> 1] = m; i = y; return } function Vb(a, d, f, g, h, j, k, l, m, n, o) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; var p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0; y = i; i = i + 80 | 0; v = y; b[k >> 1] = b[j >> 1] | 0; b[l >> 1] = b[j + 2 >> 1] | 0; r = b[j + 4 >> 1] | 0; if (r << 16 >> 16 == -32768) r = 32767; else r = 0 - (r & 65535) & 65535; b[k + 2 >> 1] = r; b[l + 2 >> 1] = (e[j + 6 >> 1] | 0) + 1; switch (a | 0) { case 0: case 5: { u = 0; q = 0; p = 0; t = 0; break } default: { u = 0; q = 1; p = 1; t = 1; } } while (1) { s = (b[h + (u << 1) >> 1] | 0) >>> 3; b[v + (u << 1) >> 1] = s; s = s << 16 >> 16; r = Z(s, s) | 0; if ((r | 0) != 1073741824) { j = (r << 1) + q | 0; if ((r ^ q | 0) > 0 & (j ^ q | 0) < 0) { c[o >> 2] = 1; q = (q >>> 31) + 2147483647 | 0; } else q = j; } else { c[o >> 2] = 1; q = 2147483647; } r = Z(b[d + (u << 1) >> 1] | 0, s) | 0; if ((r | 0) != 1073741824) { j = (r << 1) + p | 0; if ((r ^ p | 0) > 0 & (j ^ p | 0) < 0) { c[o >> 2] = 1; p = (p >>> 31) + 2147483647 | 0; } else p = j; } else { c[o >> 2] = 1; p = 2147483647; } r = Z(b[g + (u << 1) >> 1] | 0, s) | 0; if ((r | 0) != 1073741824) { j = (r << 1) + t | 0; if ((r ^ t | 0) > 0 & (j ^ t | 0) < 0) { c[o >> 2] = 1; j = (t >>> 31) + 2147483647 | 0; } } else { c[o >> 2] = 1; j = 2147483647; } u = u + 1 | 0; if ((u | 0) == 40) { g = j; s = p; break } else t = j; } p = pe(q) | 0; j = p << 16 >> 16; if (p << 16 >> 16 > 0) { r = q << j; if ((r >> j | 0) != (q | 0)) r = q >> 31 ^ 2147483647; } else { r = 0 - j << 16; if ((r | 0) < 2031616) r = q >> (r >> 16); else r = 0; } h = k + 4 | 0; b[h >> 1] = r >>> 16; d = l + 4 | 0; b[d >> 1] = -3 - (p & 65535); q = pe(s) | 0; j = q << 16 >> 16; if (q << 16 >> 16 > 0) { r = s << j; if ((r >> j | 0) != (s | 0)) r = s >> 31 ^ 2147483647; } else { r = 0 - j << 16; if ((r | 0) < 2031616) r = s >> (r >> 16); else r = 0; } j = r >>> 16; b[k + 6 >> 1] = (j | 0) == 32768 ? 32767 : 0 - j & 65535; b[l + 6 >> 1] = 7 - (q & 65535); q = pe(g) | 0; j = q << 16 >> 16; if (q << 16 >> 16 > 0) { r = g << j; if ((r >> j | 0) != (g | 0)) r = g >> 31 ^ 2147483647; } else { r = 0 - j << 16; if ((r | 0) < 2031616) r = g >> (r >> 16); else r = 0; } b[k + 8 >> 1] = r >>> 16; b[l + 8 >> 1] = 7 - (q & 65535); switch (a | 0) { case 0: case 5: { r = 0; p = 0; break } default: { i = y; return } } do { p = (Z(b[v + (r << 1) >> 1] | 0, b[f + (r << 1) >> 1] | 0) | 0) + p | 0; r = r + 1 | 0; } while ((r | 0) != 40); j = p << 1; r = pe(j) | 0; q = r << 16 >> 16; if (r << 16 >> 16 > 0) { p = j << q; if ((p >> q | 0) == (j | 0)) { w = p; x = 40; } else { w = j >> 31 ^ 2147483647; x = 40; } } else { p = 0 - q << 16; if ((p | 0) < 2031616) { w = j >> (p >> 16); x = 40; } } if ((x | 0) == 40 ? (w >> 16 | 0) >= 1 : 0) { o = De(w >>> 16 & 65535, 1, o) | 0; b[m >> 1] = Td(o, b[h >> 1] | 0) | 0; b[n >> 1] = 65528 - (r & 65535) - (e[d >> 1] | 0); i = y; return } b[m >> 1] = 0; b[n >> 1] = 0; i = y; return } function Wb(a, d, e, f) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; var g = 0, h = 0, i = 0; h = 0; g = 0; do { i = b[a + (h << 1) >> 1] | 0; g = (Z(i, i) | 0) + g | 0; h = h + 1 | 0; } while ((h | 0) != 40); if ((g | 0) < 0) { c[f >> 2] = 1; g = 2147483647; } f = pe(g) | 0; a = f << 16 >> 16; if (f << 16 >> 16 > 0) { h = g << a; if ((h >> a | 0) == (g | 0)) g = h; else g = g >> 31 ^ 2147483647; } else { a = 0 - a << 16; if ((a | 0) < 2031616) g = g >> (a >> 16); else g = 0; } b[e >> 1] = g >>> 16; b[d >> 1] = 16 - (f & 65535); return } function Xb(a, d, e, f, g, h, j, k, l, m, n, o, p) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; p = p | 0; var q = 0, r = 0, s = 0, t = 0; r = i; i = i + 16 | 0; q = r; if (m >>> 0 < 2) { j = Nb(n, a, d, e, f, j, k, q, c[o + 76 >> 2] | 0, p) | 0; p = c[l >> 2] | 0; b[p >> 1] = j; j = b[q >> 1] | 0; c[l >> 2] = p + 4; b[p + 2 >> 1] = j; i = r; return } switch (m | 0) { case 2: { j = Mb(a, d, e, f, j, k, q, p) | 0; p = c[l >> 2] | 0; b[p >> 1] = j; j = b[q >> 1] | 0; c[l >> 2] = p + 4; b[p + 2 >> 1] = j; i = r; return } case 3: { j = Qb(a, d, e, f, j, k, q, p) | 0; p = c[l >> 2] | 0; b[p >> 1] = j; j = b[q >> 1] | 0; c[l >> 2] = p + 4; b[p + 2 >> 1] = j; i = r; return } default: { if ((m & -2 | 0) == 4) { j = Rb(a, d, e, f, j, k, q, c[o + 36 >> 2] | 0, p) | 0; p = c[l >> 2] | 0; b[p >> 1] = j; j = b[q >> 1] | 0; c[l >> 2] = p + 4; b[p + 2 >> 1] = j; i = r; return } if ((m | 0) != 6) { n = g << 16 >> 16; n = (n << 17 >> 17 | 0) == (n | 0) ? n << 1 : n >>> 15 ^ 32767; g = e << 16 >> 16 < 40; if (!g) { Lb(a, h, d, j, k, c[l >> 2] | 0, c[o + 36 >> 2] | 0, p); c[l >> 2] = (c[l >> 2] | 0) + 20; i = r; return } q = e << 16 >> 16; m = n << 16 >> 16; f = q; do { t = (Z(b[d + (f - q << 1) >> 1] | 0, m) | 0) >>> 15 & 65535; s = d + (f << 1) | 0; b[s >> 1] = Rd(b[s >> 1] | 0, t, p) | 0; f = f + 1 | 0; } while ((f & 65535) << 16 >> 16 != 40); Lb(a, h, d, j, k, c[l >> 2] | 0, c[o + 36 >> 2] | 0, p); c[l >> 2] = (c[l >> 2] | 0) + 20; if (!g) { i = r; return } g = e << 16 >> 16; m = n << 16 >> 16; q = g; do { f = (Z(b[j + (q - g << 1) >> 1] | 0, m) | 0) >> 15; if ((f | 0) > 32767) { c[p >> 2] = 1; f = 32767; } t = j + (q << 1) | 0; b[t >> 1] = Rd(b[t >> 1] | 0, f & 65535, p) | 0; q = q + 1 | 0; } while ((q & 65535) << 16 >> 16 != 40); i = r; return } o = f << 16 >> 16; o = (o << 17 >> 17 | 0) == (o | 0) ? o << 1 : o >>> 15 ^ 32767; n = e << 16 >> 16 < 40; if (!n) { Sb(a, h, d, j, k, c[l >> 2] | 0, p); c[l >> 2] = (c[l >> 2] | 0) + 14; i = r; return } q = e << 16 >> 16; m = o << 16 >> 16; f = q; do { g = (Z(b[d + (f - q << 1) >> 1] | 0, m) | 0) >> 15; if ((g | 0) > 32767) { c[p >> 2] = 1; g = 32767; } t = d + (f << 1) | 0; b[t >> 1] = Rd(b[t >> 1] | 0, g & 65535, p) | 0; f = f + 1 | 0; } while ((f & 65535) << 16 >> 16 != 40); Sb(a, h, d, j, k, c[l >> 2] | 0, p); c[l >> 2] = (c[l >> 2] | 0) + 14; if (!n) { i = r; return } g = e << 16 >> 16; m = o << 16 >> 16; q = g; do { f = (Z(b[j + (q - g << 1) >> 1] | 0, m) | 0) >> 15; if ((f | 0) > 32767) { c[p >> 2] = 1; f = 32767; } t = j + (q << 1) | 0; b[t >> 1] = Rd(b[t >> 1] | 0, f & 65535, p) | 0; q = q + 1 | 0; } while ((q & 65535) << 16 >> 16 != 40); i = r; return } } } function Yb(a) { a = a | 0; var b = 0; if (!a) { a = -1; return a | 0 } c[a >> 2] = 0; b = Je(4) | 0; if (!b) { a = -1; return a | 0 } if (!((Uc(b) | 0) << 16 >> 16)) { Vc(c[b >> 2] | 0) | 0; c[a >> 2] = b; a = 0; return a | 0 } else { Wc(b); Ke(b); a = -1; return a | 0 } return 0 } function Zb(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Wc(b); Ke(c[a >> 2] | 0); c[a >> 2] = 0; return } function _b(a) { a = a | 0; if (!a) { a = -1; return a | 0 } Vc(c[a >> 2] | 0) | 0; a = 0; return a | 0 } function $b(a, d, f, g, h, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; p = p | 0; q = q | 0; r = r | 0; s = s | 0; t = t | 0; u = u | 0; v = v | 0; w = w | 0; x = x | 0; var y = 0, z = 0, A = 0, B = 0; z = i; i = i + 16 | 0; B = z + 2 | 0; A = z; b[q >> 1] = Xc(c[a >> 2] | 0, f, h, k, m, j, 40, g, r, A, B, x) | 0; a = b[B >> 1] | 0; g = c[u >> 2] | 0; c[u >> 2] = g + 2; b[g >> 1] = a; se(k, b[q >> 1] | 0, b[r >> 1] | 0, 40, b[A >> 1] | 0, x); ec(k, j, p, 40); b[s >> 1] = Dc(f, m, p, t, 40, x) | 0; b[v >> 1] = 32767; if (n << 16 >> 16 != 0 ? (y = b[s >> 1] | 0, y << 16 >> 16 > 15565) : 0) y = Ed(d, y, x) | 0; else y = 0; if (f >>> 0 < 2) { B = b[s >> 1] | 0; b[s >> 1] = B << 16 >> 16 > 13926 ? 13926 : B; if (y << 16 >> 16) b[v >> 1] = 15565; } else { if (y << 16 >> 16) { b[v >> 1] = 15565; b[s >> 1] = 15565; } if ((f | 0) == 7) { A = nd(7, b[v >> 1] | 0, s, 0, 0, w, x) | 0; B = c[u >> 2] | 0; c[u >> 2] = B + 2; b[B >> 1] = A; } } q = b[s >> 1] | 0; y = 0; while (1) { A = Z(b[p >> 1] | 0, q) | 0; b[o >> 1] = (e[m >> 1] | 0) - (A >>> 14); A = (Z(b[k >> 1] | 0, q) | 0) >>> 14; B = l + (y << 1) | 0; b[B >> 1] = (e[B >> 1] | 0) - A; y = y + 1 | 0; if ((y | 0) == 40) break; else { k = k + 2 | 0; m = m + 2 | 0; o = o + 2 | 0; p = p + 2 | 0; } } i = z; return } function ac(a, b) { a = a | 0; b = b | 0; var d = 0, e = 0, f = 0, g = 0; g = i; i = i + 16 | 0; f = g; if (!a) { a = -1; i = g; return a | 0 } c[a >> 2] = 0; d = Je(2532) | 0; c[f >> 2] = d; if (!d) { a = -1; i = g; return a | 0 } Yd(d + 2392 | 0); c[d + 2188 >> 2] = 0; c[(c[f >> 2] | 0) + 2192 >> 2] = 0; c[(c[f >> 2] | 0) + 2196 >> 2] = 0; c[(c[f >> 2] | 0) + 2200 >> 2] = 0; c[(c[f >> 2] | 0) + 2204 >> 2] = 0; c[(c[f >> 2] | 0) + 2208 >> 2] = 0; c[(c[f >> 2] | 0) + 2212 >> 2] = 0; c[(c[f >> 2] | 0) + 2220 >> 2] = 0; e = c[f >> 2] | 0; c[e + 2216 >> 2] = b; c[e + 2528 >> 2] = 0; d = e; if ((((((((Yb(e + 2196 | 0) | 0) << 16 >> 16 == 0 ? (ie(e + 2192 | 0) | 0) << 16 >> 16 == 0 : 0) ? (yc(e + 2200 | 0) | 0) << 16 >> 16 == 0 : 0) ? (_c(e + 2204 | 0) | 0) << 16 >> 16 == 0 : 0) ? (Ad(e + 2208 | 0) | 0) << 16 >> 16 == 0 : 0) ? (Gd(e + 2212 | 0) | 0) << 16 >> 16 == 0 : 0) ? (jc(e + 2220 | 0, c[e + 2432 >> 2] | 0) | 0) << 16 >> 16 == 0 : 0) ? (Pc(e + 2188 | 0) | 0) << 16 >> 16 == 0 : 0) { cc(e) | 0; c[a >> 2] = d; a = 0; i = g; return a | 0 } bc(f); a = -1; i = g; return a | 0 } function bc(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Qc(b + 2188 | 0); ke((c[a >> 2] | 0) + 2192 | 0); zc((c[a >> 2] | 0) + 2200 | 0); Zb((c[a >> 2] | 0) + 2196 | 0); ad((c[a >> 2] | 0) + 2204 | 0); Cd((c[a >> 2] | 0) + 2208 | 0); Id((c[a >> 2] | 0) + 2212 | 0); lc((c[a >> 2] | 0) + 2220 | 0); Ke(c[a >> 2] | 0); c[a >> 2] = 0; return } function cc(a) { a = a | 0; var d = 0, e = 0, f = 0, g = 0; if (!a) { g = -1; return g | 0 } c[a + 652 >> 2] = a + 320; c[a + 640 >> 2] = a + 240; c[a + 644 >> 2] = a + 160; c[a + 648 >> 2] = a + 80; c[a + 1264 >> 2] = a + 942; c[a + 1912 >> 2] = a + 1590; f = a + 1938 | 0; c[a + 2020 >> 2] = f; c[a + 2384 >> 2] = a + 2304; d = a + 2028 | 0; c[a + 2024 >> 2] = a + 2108; c[a + 2528 >> 2] = 0; Qe(a | 0, 0, 640) | 0; Qe(a + 1282 | 0, 0, 308) | 0; Qe(a + 656 | 0, 0, 286) | 0; e = a + 2224 | 0; g = f + 80 | 0; do { b[f >> 1] = 0; f = f + 2 | 0; } while ((f | 0) < (g | 0)); f = d; g = f + 80 | 0; do { b[f >> 1] = 0; f = f + 2 | 0; } while ((f | 0) < (g | 0)); d = a + 1268 | 0; f = e; g = f + 80 | 0; do { b[f >> 1] = 0; f = f + 2 | 0; } while ((f | 0) < (g | 0)); b[d >> 1] = 40; b[a + 1270 >> 1] = 40; b[a + 1272 >> 1] = 40; b[a + 1274 >> 1] = 40; b[a + 1276 >> 1] = 40; Rc(c[a + 2188 >> 2] | 0) | 0; je(c[a + 2192 >> 2] | 0) | 0; _b(c[a + 2196 >> 2] | 0) | 0; Ac(c[a + 2200 >> 2] | 0) | 0; $c(c[a + 2204 >> 2] | 0) | 0; Bd(c[a + 2208 >> 2] | 0) | 0; Hd(c[a + 2212 >> 2] | 0) | 0; kc(c[a + 2220 >> 2] | 0, c[a + 2432 >> 2] | 0) | 0; b[a + 2388 >> 1] = 0; g = 0; return g | 0 } function dc(a, d, e, f, g, h) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; var j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0, O = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0, V = 0, W = 0, X = 0, Y = 0, Z = 0, _ = 0, $ = 0, aa = 0, ba = 0, ca = 0, da = 0, ea = 0, fa = 0, ga = 0, ha = 0, ia = 0, ja = 0, ka = 0, la = 0, ma = 0, na = 0, oa = 0, pa = 0, qa = 0; qa = i; i = i + 1184 | 0; T = qa; n = qa + 1096 | 0; o = qa + 1008 | 0; l = qa + 904 | 0; ka = qa + 928 | 0; la = qa + 824 | 0; X = qa + 744 | 0; na = qa + 664 | 0; oa = qa + 584 | 0; Z = qa + 328 | 0; ha = qa + 504 | 0; ia = qa + 424 | 0; ma = qa + 344 | 0; pa = qa + 248 | 0; Y = qa + 168 | 0; da = qa + 88 | 0; fa = qa + 68 | 0; ga = qa + 48 | 0; ea = qa + 28 | 0; ja = qa + 24 | 0; ba = qa + 22 | 0; $ = qa + 20 | 0; W = qa + 16 | 0; U = qa + 12 | 0; V = qa + 10 | 0; aa = qa + 8 | 0; _ = qa + 6 | 0; ca = qa + 4 | 0; c[T >> 2] = f; S = a + 2528 | 0; j = a + 652 | 0; Oe(c[j >> 2] | 0, e | 0, 320) | 0; c[g >> 2] = d; m = a + 2216 | 0; if (!(c[m >> 2] | 0)) { e = a + 2220 | 0; f = 0; } else { f = Nd(c[a + 2212 >> 2] | 0, c[j >> 2] | 0, S) | 0; R = a + 2220 | 0; e = R; f = oc(c[R >> 2] | 0, f, g, S) | 0; } R = a + 2392 | 0; Sc(c[a + 2188 >> 2] | 0, d, c[a + 644 >> 2] | 0, c[a + 648 >> 2] | 0, n, R, S); k = a + 2192 | 0; le(c[k >> 2] | 0, d, c[g >> 2] | 0, n, o, l, T, S); nc(c[e >> 2] | 0, l, c[j >> 2] | 0, S); if ((c[g >> 2] | 0) == 8) { mc(c[e >> 2] | 0, f, c[(c[k >> 2] | 0) + 40 >> 2] | 0, (c[a + 2200 >> 2] | 0) + 32 | 0, T, S); Qe(a + 1282 | 0, 0, 308) | 0; j = a + 2244 | 0; q = j + 20 | 0; do { b[j >> 1] = 0; j = j + 2 | 0; } while ((j | 0) < (q | 0)); j = a + 2284 | 0; q = j + 20 | 0; do { b[j >> 1] = 0; j = j + 2 | 0; } while ((j | 0) < (q | 0)); j = c[a + 2020 >> 2] | 0; q = j + 80 | 0; do { b[j >> 1] = 0; j = j + 2 | 0; } while ((j | 0) < (q | 0)); j = a + 2028 | 0; q = j + 80 | 0; do { b[j >> 1] = 0; j = j + 2 | 0; } while ((j | 0) < (q | 0)); je(c[k >> 2] | 0) | 0; j = c[k >> 2] | 0; e = l; q = j + 20 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)); j = (c[k >> 2] | 0) + 20 | 0; e = l; q = j + 20 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)); _b(c[a + 2196 >> 2] | 0) | 0; b[a + 2388 >> 1] = 0; Q = 0; } else Q = Dd(c[a + 2208 >> 2] | 0, c[k >> 2] | 0, S) | 0; N = a + 640 | 0; k = a + 2264 | 0; j = a + 1264 | 0; e = a + 2204 | 0; f = a + 2212 | 0; O = a + 1268 | 0; P = a + 1278 | 0; cd(d, 2842, 2862, 2882, n, 0, c[N >> 2] | 0, k, c[j >> 2] | 0, S); if (d >>> 0 > 1) { Tc(c[e >> 2] | 0, c[f >> 2] | 0, d, c[j >> 2] | 0, W, O, P, 0, c[m >> 2] | 0, S); cd(d, 2842, 2862, 2882, n, 80, c[N >> 2] | 0, k, c[j >> 2] | 0, S); Tc(c[e >> 2] | 0, c[f >> 2] | 0, d, (c[j >> 2] | 0) + 160 | 0, W + 2 | 0, O, P, 1, c[m >> 2] | 0, S); } else { cd(d, 2842, 2862, 2882, n, 80, c[N >> 2] | 0, k, c[j >> 2] | 0, S); Tc(c[e >> 2] | 0, c[f >> 2] | 0, d, c[j >> 2] | 0, W, O, P, 1, c[m >> 2] | 0, S); b[W + 2 >> 1] = b[W >> 1] | 0; } if (c[m >> 2] | 0) Md(c[f >> 2] | 0, W, S); if ((c[g >> 2] | 0) == 8) { oa = a + 656 | 0; pa = a + 976 | 0; Oe(oa | 0, pa | 0, 286) | 0; pa = a + 320 | 0; Oe(a | 0, pa | 0, 320) | 0; i = qa; return 0 } z = a + 2224 | 0; A = a + 2244 | 0; B = a + 2284 | 0; C = a + 2388 | 0; D = a + 2020 | 0; E = a + 1916 | 0; F = a + 1912 | 0; G = a + 2024 | 0; H = a + 2384 | 0; I = a + 2196 | 0; J = a + 2208 | 0; K = a + 2464 | 0; L = a + 2200 | 0; M = a + 2224 | 0; w = a + 2244 | 0; x = a + 1270 | 0; y = a + 1280 | 0; v = 0; m = 0; l = 0; s = 0; t = 0; k = 0; u = -1; while (1) { p = u; u = u + 1 << 16 >> 16; s = 1 - (s << 16 >> 16) | 0; f = s & 65535; r = (s & 65535 | 0) != 0; e = c[g >> 2] | 0; j = (e | 0) == 0; do if (r) if (j) { j = fa; e = z; q = j + 20 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)); j = ga; e = A; q = j + 20 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)); j = ea; e = B; q = j + 20 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)); b[ja >> 1] = b[C >> 1] | 0; d = (c[N >> 2] | 0) + (v << 1) | 0; j = 20; break } else { d = (c[N >> 2] | 0) + (v << 1) | 0; j = 19; break } else { d = (c[N >> 2] | 0) + (v << 1) | 0; if (j) j = 20; else j = 19; } while (0); if ((j | 0) == 19) yd(e, 2842, 2862, 2882, n, o, d, B, w, c[D >> 2] | 0, E, (c[F >> 2] | 0) + (v << 1) | 0, c[G >> 2] | 0, ka, ha, c[H >> 2] | 0); else if ((j | 0) == 20 ? (0, yd(0, 2842, 2862, 2882, n, o, d, B, ga, c[D >> 2] | 0, E, (c[F >> 2] | 0) + (v << 1) | 0, c[G >> 2] | 0, ka, ha, c[H >> 2] | 0), r) : 0) { j = da; e = c[G >> 2] | 0; q = j + 80 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)) } j = ia; e = ha; q = j + 80 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)); $b(c[I >> 2] | 0, c[J >> 2] | 0, c[g >> 2] | 0, t, W, c[G >> 2] | 0, (c[F >> 2] | 0) + (v << 1) | 0, ia, ka, Q, la, na, U, V, aa, Z, T, ca, c[K >> 2] | 0, S); switch (p << 16 >> 16) { case -1: { if ((b[P >> 1] | 0) > 0) b[x >> 1] = b[U >> 1] | 0; break } case 2: { if ((b[y >> 1] | 0) > 0) b[O >> 1] = b[U >> 1] | 0; break } default: { } } Xb(la, c[G >> 2] | 0, b[U >> 1] | 0, b[C >> 1] | 0, b[aa >> 1] | 0, ia, X, oa, T, c[g >> 2] | 0, u, R, S); Bc(c[L >> 2] | 0, c[g >> 2] | 0, ha, (c[F >> 2] | 0) + (v << 1) | 0, X, ka, la, na, oa, Z, f, b[ca >> 1] | 0, ba, $, aa, _, T, R, S); Fd(c[J >> 2] | 0, b[aa >> 1] | 0, S); d = c[g >> 2] | 0; do if (!d) if (r) { j = ma; e = ka; q = j + 80 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)); j = pa; e = oa; q = j + 80 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)); j = Y; e = X; q = j + 80 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)); l = b[U >> 1] | 0; m = b[V >> 1] | 0; zd(c[N >> 2] | 0, 0, t, b[aa >> 1] | 0, b[_ >> 1] | 0, o, h, ka, X, na, oa, fa, B, ga, c[F >> 2] | 0, C, S); b[C >> 1] = b[ja >> 1] | 0; k = t; break } else { j = B; e = ea; q = j + 20 | 0; do { b[j >> 1] = b[e >> 1] | 0; j = j + 2 | 0; e = e + 2 | 0; } while ((j | 0) < (q | 0)); r = k << 16 >> 16; se((c[F >> 2] | 0) + (r << 1) | 0, l, m, 40, 1, S); ec((c[F >> 2] | 0) + (r << 1) | 0, da, na, 40); zd(c[N >> 2] | 0, c[g >> 2] | 0, k, b[ba >> 1] | 0, b[$ >> 1] | 0, o + -22 | 0, h, ma, Y, na, pa, M, B, w, c[F >> 2] | 0, ja, S); yd(c[g >> 2] | 0, 2842, 2862, 2882, n, o, (c[N >> 2] | 0) + (v << 1) | 0, B, w, c[D >> 2] | 0, E, (c[F >> 2] | 0) + (v << 1) | 0, c[G >> 2] | 0, ka, ha, c[H >> 2] | 0); se((c[F >> 2] | 0) + (v << 1) | 0, b[U >> 1] | 0, b[V >> 1] | 0, 40, 1, S); ec((c[F >> 2] | 0) + (v << 1) | 0, c[G >> 2] | 0, na, 40); zd(c[N >> 2] | 0, c[g >> 2] | 0, t, b[aa >> 1] | 0, b[_ >> 1] | 0, o, h, ka, X, na, oa, M, B, w, c[F >> 2] | 0, C, S); break } else zd(c[N >> 2] | 0, d, t, b[aa >> 1] | 0, b[_ >> 1] | 0, o, h, ka, X, na, oa, M, B, w, c[F >> 2] | 0, C, S); while (0); d = v + 40 | 0; t = d & 65535; if (t << 16 >> 16 >= 160) break; else { v = d << 16 >> 16; n = n + 22 | 0; o = o + 22 | 0; } } Oe(a + 1282 | 0, a + 1602 | 0, 308) | 0; oa = a + 656 | 0; pa = a + 976 | 0; Oe(oa | 0, pa | 0, 286) | 0; pa = a + 320 | 0; Oe(a | 0, pa | 0, 320) | 0; i = qa; return 0 } function ec(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0; o = e << 16 >> 16; if (e << 16 >> 16 > 1) n = 1; else return; while (1) { f = b[a >> 1] | 0; i = c + (n + -1 << 1) | 0; e = Z(b[c + (n << 1) >> 1] | 0, f) | 0; k = b[i >> 1] | 0; f = Z(k << 16 >> 16, f) | 0; h = (n + 131071 | 0) >>> 1; j = h & 65535; g = b[a + 2 >> 1] | 0; if (!(j << 16 >> 16)) { c = i; h = k; } else { l = (h << 1) + 131070 & 131070; m = n - l | 0; h = a; do { q = (Z(k << 16 >> 16, g) | 0) + e | 0; p = h; h = h + 4 | 0; e = b[i + -2 >> 1] | 0; g = (Z(e, g) | 0) + f | 0; f = b[h >> 1] | 0; i = i + -4 | 0; e = q + (Z(f, e) | 0) | 0; k = b[i >> 1] | 0; f = g + (Z(k << 16 >> 16, f) | 0) | 0; j = j + -1 << 16 >> 16; g = b[p + 6 >> 1] | 0; } while (j << 16 >> 16 != 0); h = c + (m + -3 << 1) | 0; a = a + (l + 2 << 1) | 0; c = h; h = b[h >> 1] | 0; } e = (Z(h << 16 >> 16, g) | 0) + e | 0; b[d >> 1] = f >>> 12; b[d + 2 >> 1] = e >>> 12; e = (n << 16) + 131072 >> 16; if ((e | 0) < (o | 0)) { d = d + 4 | 0; a = a + (1 - n << 1) | 0; n = e; } else break } return } function fc(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0; z = i; i = i + 80 | 0; y = z; h = 20; g = a; f = 1; while (1) { x = b[g >> 1] | 0; x = (Z(x, x) | 0) + f | 0; f = b[g + 2 >> 1] | 0; f = x + (Z(f, f) | 0) | 0; h = h + -1 << 16 >> 16; if (!(h << 16 >> 16)) break; else g = g + 4 | 0; } f = f << 1; if ((f | 0) < 0) { g = 20; f = a; e = y; while (1) { b[e >> 1] = (b[f >> 1] | 0) >>> 1; b[e + 2 >> 1] = (b[f + 2 >> 1] | 0) >>> 1; g = g + -1 << 16 >> 16; if (!(g << 16 >> 16)) { x = y; break } else { f = f + 4 | 0; e = e + 4 | 0; } } } else { f = ce(f >> 1, e) | 0; if ((f | 0) < 16777215) f = ((f >> 9) * 32440 | 0) >>> 15 << 16 >> 16; else f = 32440; h = 20; g = a; e = y; while (1) { b[e >> 1] = ((Z(b[g >> 1] | 0, f) | 0) + 32 | 0) >>> 6; b[e + 2 >> 1] = ((Z(b[g + 2 >> 1] | 0, f) | 0) + 32 | 0) >>> 6; h = h + -1 << 16 >> 16; if (!(h << 16 >> 16)) { x = y; break } else { g = g + 4 | 0; e = e + 4 | 0; } } } h = 20; g = x; e = d + 3198 | 0; f = 0; while (1) { w = b[g >> 1] | 0; w = (Z(w, w) | 0) + f | 0; b[e >> 1] = (w + 16384 | 0) >>> 15; v = b[g + 2 >> 1] | 0; f = (Z(v, v) | 0) + w | 0; b[e + -82 >> 1] = (f + 16384 | 0) >>> 15; h = h + -1 << 16 >> 16; if (!(h << 16 >> 16)) break; else { g = g + 4 | 0; e = e + -164 | 0; } } w = c + 78 | 0; v = 1; while (1) { f = 39 - v | 0; a = d + 3120 + (f << 1) | 0; e = d + (f * 80 | 0) + 78 | 0; f = c + (f << 1) | 0; k = y + (v << 1) | 0; g = 65575 - v | 0; j = g & 65535; h = b[x >> 1] | 0; if (!(j << 16 >> 16)) { j = w; g = 0; } else { r = g + 65535 & 65535; t = r * 41 | 0; u = (Z(v, -40) | 0) - t | 0; s = 0 - v | 0; t = s - t | 0; s = s - r | 0; q = v + r | 0; p = b[k >> 1] | 0; n = x; o = w; l = d + ((38 - v | 0) * 80 | 0) + 78 | 0; g = 0; m = 0; while (1) { k = k + 2 | 0; g = (Z(p << 16 >> 16, h) | 0) + g | 0; n = n + 2 | 0; p = b[k >> 1] | 0; m = (Z(p << 16 >> 16, h) | 0) + m | 0; B = f; f = f + -2 | 0; h = b[f >> 1] | 0; A = b[o >> 1] << 1; B = (Z((Z(A, b[B >> 1] | 0) | 0) >> 16, (g << 1) + 32768 >> 16) | 0) >>> 15 & 65535; b[e >> 1] = B; b[a >> 1] = B; h = (Z((Z(A, h) | 0) >> 16, (m << 1) + 32768 >> 16) | 0) >>> 15 & 65535; b[a + -2 >> 1] = h; b[l >> 1] = h; j = j + -1 << 16 >> 16; h = b[n >> 1] | 0; if (!(j << 16 >> 16)) break; else { o = o + -2 | 0; a = a + -82 | 0; e = e + -82 | 0; l = l + -82 | 0; } } k = y + (q + 1 << 1) | 0; j = c + (38 - r << 1) | 0; f = c + (s + 38 << 1) | 0; a = d + 3040 + (t + 38 << 1) | 0; e = d + 3040 + (u + 38 << 1) | 0; } B = (Z(b[k >> 1] | 0, h) | 0) + g | 0; B = (Z((B << 1) + 32768 >> 16, (Z(b[j >> 1] << 1, b[f >> 1] | 0) | 0) >> 16) | 0) >>> 15 & 65535; b[a >> 1] = B; b[e >> 1] = B; e = (v << 16) + 131072 | 0; if ((e | 0) < 2621440) v = e >> 16; else break } i = z; return } function gc(a, d, e, f, g, h, j) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; var k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0; r = i; i = i + 160 | 0; q = r; if (g << 16 >> 16 > 0) { o = h & 65535; p = 0; k = 5; do { if ((p | 0) < 40) { n = p; m = p & 65535; h = 0; while (1) { if (m << 16 >> 16 < 40) { m = m << 16 >> 16; l = 0; do { l = (Z(b[a + (m - n << 1) >> 1] | 0, b[d + (m << 1) >> 1] | 0) | 0) + l | 0; m = m + 1 | 0; } while ((m & 65535) << 16 >> 16 != 40) } else l = 0; l = l << 1; c[q + (n << 2) >> 2] = l; l = Gc(l) | 0; h = (l | 0) > (h | 0) ? l : h; l = n + o | 0; m = l & 65535; if (m << 16 >> 16 >= 40) break; else n = l << 16 >> 16; } } else h = 0; k = (h >> 1) + k | 0; p = p + 1 | 0; } while ((p & 65535) << 16 >> 16 != g << 16 >> 16) } else k = 5; f = ((pe(k) | 0) & 65535) - (f & 65535) | 0; h = f << 16 >> 16; l = 0 - h << 16; k = (l | 0) < 2031616; l = l >> 16; if ((f & 65535) << 16 >> 16 > 0) if (k) { k = 0; do { f = c[q + (k << 2) >> 2] | 0; d = f << h; b[e + (k << 1) >> 1] = Ce((d >> h | 0) == (f | 0) ? d : f >> 31 ^ 2147483647, j) | 0; k = k + 1 | 0; } while ((k | 0) != 40); i = r; return } else { k = 0; do { f = c[q + (k << 2) >> 2] | 0; d = f << h; b[e + (k << 1) >> 1] = Ce((d >> h | 0) == (f | 0) ? d : f >> 31 ^ 2147483647, j) | 0; k = k + 1 | 0; } while ((k | 0) != 40); i = r; return } else if (k) { k = 0; do { b[e + (k << 1) >> 1] = Ce(c[q + (k << 2) >> 2] >> l, j) | 0; k = k + 1 | 0; } while ((k | 0) != 40); i = r; return } else { k = 0; do { b[e + (k << 1) >> 1] = Ce(0, j) | 0; k = k + 1 | 0; } while ((k | 0) != 40); i = r; return } } function hc(a, d, e, f, g) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; var h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0; z = i; i = i + 160 | 0; y = z; v = a + 2 | 0; w = b[a >> 1] | 0; x = 0; g = 5; do { u = x; k = 0; while (1) { n = d + (u << 1) | 0; t = 40 - u | 0; h = (t + 131071 | 0) >>> 1 & 65535; l = d + (u + 1 << 1) | 0; j = Z(b[n >> 1] << 1, w) | 0; if (!(h << 16 >> 16)) h = v; else { s = 131111 - u + 131070 & 131070; r = u + s | 0; q = v; p = a; o = n; while (1) { m = o + 4 | 0; n = p + 4 | 0; j = (Z(b[l >> 1] << 1, b[q >> 1] | 0) | 0) + j | 0; h = h + -1 << 16 >> 16; j = (Z(b[m >> 1] << 1, b[n >> 1] | 0) | 0) + j | 0; if (!(h << 16 >> 16)) break; else { l = o + 6 | 0; q = p + 6 | 0; p = n; o = m; } } l = d + (r + 3 << 1) | 0; h = a + (s + 3 << 1) | 0; } if (!(t & 1)) j = (Z(b[l >> 1] << 1, b[h >> 1] | 0) | 0) + j | 0; c[y + (u << 2) >> 2] = j; j = (j | 0) < 0 ? 0 - j | 0 : j; k = (j | 0) > (k | 0) ? j : k; j = u + 5 | 0; if ((j & 65535) << 16 >> 16 < 40) u = j << 16 >> 16; else break } g = (k >> 1) + g | 0; x = x + 1 | 0; } while ((x | 0) != 5); f = ((pe(g) | 0) & 65535) - (f & 65535) | 0; j = f << 16 >> 16; g = 0 - j << 16; k = g >> 16; if ((f & 65535) << 16 >> 16 > 0) { h = 20; g = y; while (1) { y = c[g >> 2] | 0; f = y << j; b[e >> 1] = (((f >> j | 0) == (y | 0) ? f : y >> 31 ^ 2147483647) + 32768 | 0) >>> 16; y = c[g + 4 >> 2] | 0; f = y << j; b[e + 2 >> 1] = (((f >> j | 0) == (y | 0) ? f : y >> 31 ^ 2147483647) + 32768 | 0) >>> 16; h = h + -1 << 16 >> 16; if (!(h << 16 >> 16)) break; else { e = e + 4 | 0; g = g + 8 | 0; } } i = z; return } if ((g | 0) < 2031616) { h = 20; g = y; while (1) { b[e >> 1] = ((c[g >> 2] >> k) + 32768 | 0) >>> 16; b[e + 2 >> 1] = ((c[g + 4 >> 2] >> k) + 32768 | 0) >>> 16; h = h + -1 << 16 >> 16; if (!(h << 16 >> 16)) break; else { e = e + 4 | 0; g = g + 8 | 0; } } i = z; return } else { b[e >> 1] = 0; y = e + 4 | 0; b[e + 2 >> 1] = 0; b[y >> 1] = 0; f = y + 4 | 0; b[y + 2 >> 1] = 0; b[f >> 1] = 0; y = f + 4 | 0; b[f + 2 >> 1] = 0; b[y >> 1] = 0; f = y + 4 | 0; b[y + 2 >> 1] = 0; b[f >> 1] = 0; y = f + 4 | 0; b[f + 2 >> 1] = 0; b[y >> 1] = 0; f = y + 4 | 0; b[y + 2 >> 1] = 0; b[f >> 1] = 0; y = f + 4 | 0; b[f + 2 >> 1] = 0; b[y >> 1] = 0; f = y + 4 | 0; b[y + 2 >> 1] = 0; b[f >> 1] = 0; y = f + 4 | 0; b[f + 2 >> 1] = 0; b[y >> 1] = 0; f = y + 4 | 0; b[y + 2 >> 1] = 0; b[f >> 1] = 0; y = f + 4 | 0; b[f + 2 >> 1] = 0; b[y >> 1] = 0; f = y + 4 | 0; b[y + 2 >> 1] = 0; b[f >> 1] = 0; y = f + 4 | 0; b[f + 2 >> 1] = 0; b[y >> 1] = 0; f = y + 4 | 0; b[y + 2 >> 1] = 0; b[f >> 1] = 0; y = f + 4 | 0; b[f + 2 >> 1] = 0; b[y >> 1] = 0; f = y + 4 | 0; b[y + 2 >> 1] = 0; b[f >> 1] = 0; y = f + 4 | 0; b[f + 2 >> 1] = 0; b[y >> 1] = 0; f = y + 4 | 0; b[y + 2 >> 1] = 0; b[f >> 1] = 0; y = f + 4 | 0; b[f + 2 >> 1] = 0; b[y >> 1] = 0; b[y + 2 >> 1] = 0; i = z; return } } function ic(a, b, d, e) { a = a | 0; b = b | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0; h = (Td(16383, b) | 0) << 16 >> 16; b = Z(h, b << 16 >> 16) | 0; if ((b | 0) == 1073741824) { c[e >> 2] = 1; f = 2147483647; } else f = b << 1; g = (Z(h, d << 16 >> 16) | 0) >> 15; b = f + (g << 1) | 0; if ((f ^ g | 0) > 0 & (b ^ f | 0) < 0) { c[e >> 2] = 1; b = (f >>> 31) + 2147483647 | 0; } f = 2147483647 - b | 0; d = f >> 16; b = Z(d, h) | 0; if ((b | 0) == 1073741824) { c[e >> 2] = 1; g = 2147483647; } else g = b << 1; h = (Z((f >>> 1) - (d << 15) << 16 >> 16, h) | 0) >> 15; b = g + (h << 1) | 0; if ((g ^ h | 0) > 0 & (b ^ g | 0) < 0) { c[e >> 2] = 1; b = (g >>> 31) + 2147483647 | 0; } g = b >> 16; h = a >> 16; d = Z(g, h) | 0; d = (d | 0) == 1073741824 ? 2147483647 : d << 1; f = (Z((b >>> 1) - (g << 15) << 16 >> 16, h) | 0) >> 15; e = (f << 1) + d | 0; e = (f ^ d | 0) > 0 & (e ^ d | 0) < 0 ? (d >>> 31) + 2147483647 | 0 : e; h = (Z(g, (a >>> 1) - (h << 15) << 16 >> 16) | 0) >> 15; a = e + (h << 1) | 0; a = (e ^ h | 0) > 0 & (a ^ e | 0) < 0 ? (e >>> 31) + 2147483647 | 0 : a; e = a << 2; return ((e >> 2 | 0) == (a | 0) ? e : a >> 31 ^ 2147483647) | 0 } function jc(a, d) { a = a | 0; d = d | 0; var e = 0, f = 0, g = 0, h = 0; if (!a) { h = -1; return h | 0 } c[a >> 2] = 0; e = Je(192) | 0; if (!e) { h = -1; return h | 0 } f = e + 176 | 0; b[f >> 1] = 0; b[f + 2 >> 1] = 0; b[f + 4 >> 1] = 0; b[f + 6 >> 1] = 0; b[f + 8 >> 1] = 0; b[f + 10 >> 1] = 0; f = e; g = d; h = f + 20 | 0; do { b[f >> 1] = b[g >> 1] | 0; f = f + 2 | 0; g = g + 2 | 0; } while ((f | 0) < (h | 0)); f = e + 20 | 0; g = d; h = f + 20 | 0; do { b[f >> 1] = b[g >> 1] | 0; f = f + 2 | 0; g = g + 2 | 0; } while ((f | 0) < (h | 0)); f = e + 40 | 0; g = d; h = f + 20 | 0; do { b[f >> 1] = b[g >> 1] | 0; f = f + 2 | 0; g = g + 2 | 0; } while ((f | 0) < (h | 0)); f = e + 60 | 0; g = d; h = f + 20 | 0; do { b[f >> 1] = b[g >> 1] | 0; f = f + 2 | 0; g = g + 2 | 0; } while ((f | 0) < (h | 0)); f = e + 80 | 0; g = d; h = f + 20 | 0; do { b[f >> 1] = b[g >> 1] | 0; f = f + 2 | 0; g = g + 2 | 0; } while ((f | 0) < (h | 0)); f = e + 100 | 0; g = d; h = f + 20 | 0; do { b[f >> 1] = b[g >> 1] | 0; f = f + 2 | 0; g = g + 2 | 0; } while ((f | 0) < (h | 0)); f = e + 120 | 0; g = d; h = f + 20 | 0; do { b[f >> 1] = b[g >> 1] | 0; f = f + 2 | 0; g = g + 2 | 0; } while ((f | 0) < (h | 0)); f = e + 140 | 0; g = d; h = f + 20 | 0; do { b[f >> 1] = b[g >> 1] | 0; f = f + 2 | 0; g = g + 2 | 0; } while ((f | 0) < (h | 0)); f = e + 160 | 0; h = f + 20 | 0; do { b[f >> 1] = 0; f = f + 2 | 0; } while ((f | 0) < (h | 0)); b[e + 188 >> 1] = 7; b[e + 190 >> 1] = 32767; c[a >> 2] = e; h = 0; return h | 0 } function kc(a, c) { a = a | 0; c = c | 0; var d = 0, e = 0, f = 0; if (!a) { f = -1; return f | 0 } d = a + 176 | 0; b[d >> 1] = 0; b[d + 2 >> 1] = 0; b[d + 4 >> 1] = 0; b[d + 6 >> 1] = 0; b[d + 8 >> 1] = 0; b[d + 10 >> 1] = 0; d = a; e = c; f = d + 20 | 0; do { b[d >> 1] = b[e >> 1] | 0; d = d + 2 | 0; e = e + 2 | 0; } while ((d | 0) < (f | 0)); d = a + 20 | 0; e = c; f = d + 20 | 0; do { b[d >> 1] = b[e >> 1] | 0; d = d + 2 | 0; e = e + 2 | 0; } while ((d | 0) < (f | 0)); d = a + 40 | 0; e = c; f = d + 20 | 0; do { b[d >> 1] = b[e >> 1] | 0; d = d + 2 | 0; e = e + 2 | 0; } while ((d | 0) < (f | 0)); d = a + 60 | 0; e = c; f = d + 20 | 0; do { b[d >> 1] = b[e >> 1] | 0; d = d + 2 | 0; e = e + 2 | 0; } while ((d | 0) < (f | 0)); d = a + 80 | 0; e = c; f = d + 20 | 0; do { b[d >> 1] = b[e >> 1] | 0; d = d + 2 | 0; e = e + 2 | 0; } while ((d | 0) < (f | 0)); d = a + 100 | 0; e = c; f = d + 20 | 0; do { b[d >> 1] = b[e >> 1] | 0; d = d + 2 | 0; e = e + 2 | 0; } while ((d | 0) < (f | 0)); d = a + 120 | 0; e = c; f = d + 20 | 0; do { b[d >> 1] = b[e >> 1] | 0; d = d + 2 | 0; e = e + 2 | 0; } while ((d | 0) < (f | 0)); d = a + 140 | 0; e = c; f = d + 20 | 0; do { b[d >> 1] = b[e >> 1] | 0; d = d + 2 | 0; e = e + 2 | 0; } while ((d | 0) < (f | 0)); d = a + 160 | 0; f = d + 20 | 0; do { b[d >> 1] = 0; d = d + 2 | 0; } while ((d | 0) < (f | 0)); b[a + 188 >> 1] = 7; b[a + 190 >> 1] = 32767; f = 1; return f | 0 } function lc(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function mc(a, d, e, f, g, h) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; var j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0; C = i; i = i + 112 | 0; z = C + 80 | 0; A = C + 60 | 0; B = C + 40 | 0; y = C; if (d << 16 >> 16 == 0 ? (j = a + 178 | 0, (b[j >> 1] | 0) != 0) : 0) { B = a + 180 | 0; h = a + 182 | 0; e = j; B = b[B >> 1] | 0; f = c[g >> 2] | 0; A = f + 2 | 0; b[f >> 1] = B; h = b[h >> 1] | 0; B = f + 4 | 0; b[A >> 1] = h; A = a + 184 | 0; A = b[A >> 1] | 0; h = f + 6 | 0; b[B >> 1] = A; B = a + 186 | 0; B = b[B >> 1] | 0; a = f + 8 | 0; b[h >> 1] = B; e = b[e >> 1] | 0; f = f + 10 | 0; c[g >> 2] = f; b[a >> 1] = e; i = C; return } s = y + 36 | 0; t = y + 32 | 0; u = y + 28 | 0; v = y + 24 | 0; w = y + 20 | 0; x = y + 16 | 0; p = y + 12 | 0; q = y + 8 | 0; r = y + 4 | 0; d = y; j = d + 40 | 0; do { c[d >> 2] = 0; d = d + 4 | 0; } while ((d | 0) < (j | 0)); o = 7; d = 0; while (1) { n = b[a + 160 + (o << 1) >> 1] | 0; j = n << 16 >> 16; if (n << 16 >> 16 < 0) j = ~((j ^ -4) >> 2); else j = j >>> 2; d = Rd(d, j & 65535, h) | 0; l = o * 10 | 0; n = 9; while (1) { m = y + (n << 2) | 0; k = c[m >> 2] | 0; D = b[a + (n + l << 1) >> 1] | 0; j = D + k | 0; if ((D ^ k | 0) > -1 & (j ^ k | 0) < 0) { c[h >> 2] = 1; j = (k >>> 31) + 2147483647 | 0; } c[m >> 2] = j; if ((n | 0) > 0) n = n + -1 | 0; else break } if ((o | 0) > 0) o = o + -1 | 0; else break } j = d << 16 >> 16; if (d << 16 >> 16 < 0) j = ~((j ^ -2) >> 1); else j = j >>> 1; b[A + 18 >> 1] = (c[s >> 2] | 0) >>> 3; b[A + 16 >> 1] = (c[t >> 2] | 0) >>> 3; b[A + 14 >> 1] = (c[u >> 2] | 0) >>> 3; b[A + 12 >> 1] = (c[v >> 2] | 0) >>> 3; b[A + 10 >> 1] = (c[w >> 2] | 0) >>> 3; b[A + 8 >> 1] = (c[x >> 2] | 0) >>> 3; b[A + 6 >> 1] = (c[p >> 2] | 0) >>> 3; b[A + 4 >> 1] = (c[q >> 2] | 0) >>> 3; b[A + 2 >> 1] = (c[r >> 2] | 0) >>> 3; b[A >> 1] = (c[y >> 2] | 0) >>> 3; d = a + 178 | 0; j = (((j << 16) + 167772160 | 0) >>> 16) + 128 | 0; b[d >> 1] = j; j = j << 16; if ((j | 0) < 0) j = ~((j >> 16 ^ -256) >> 8); else j = j >> 24; b[d >> 1] = j; if ((j | 0) <= 63) { if ((j | 0) < 0) { b[d >> 1] = 0; j = 0; } } else { b[d >> 1] = 63; j = 63; } D = Ge(j << 8 & 65535, 11560, h) | 0; D = D << 16 >> 16 > 0 ? 0 : D << 16 >> 16 < -14436 ? -14436 : D; b[f >> 1] = D; b[f + 2 >> 1] = D; b[f + 4 >> 1] = D; b[f + 6 >> 1] = D; D = ((D << 16 >> 16) * 5443 | 0) >>> 15 & 65535; b[f + 8 >> 1] = D; b[f + 10 >> 1] = D; b[f + 12 >> 1] = D; b[f + 14 >> 1] = D; ne(A, z, 10, h); Ae(z, 205, 10, h); me(z, A, 10, h); f = a + 182 | 0; D = a + 180 | 0; te(e, 8, A, B, f, D, h); h = f; f = d; D = b[D >> 1] | 0; e = c[g >> 2] | 0; B = e + 2 | 0; b[e >> 1] = D; h = b[h >> 1] | 0; D = e + 4 | 0; b[B >> 1] = h; B = a + 184 | 0; B = b[B >> 1] | 0; h = e + 6 | 0; b[D >> 1] = B; a = a + 186 | 0; a = b[a >> 1] | 0; D = e + 8 | 0; b[h >> 1] = a; a = b[f >> 1] | 0; e = e + 10 | 0; c[g >> 2] = e; b[D >> 1] = a; i = C; return } function nc(a, d, f, g) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; var h = 0, j = 0, k = 0, l = 0, m = 0, n = 0; n = i; i = i + 16 | 0; k = n + 2 | 0; m = n; l = a + 176 | 0; j = (e[l >> 1] | 0) + 1 | 0; j = (j & 65535 | 0) == 8 ? 0 : j & 65535; b[l >> 1] = j; j = a + ((j << 16 >> 16) * 10 << 1) | 0; h = j + 20 | 0; do { b[j >> 1] = b[d >> 1] | 0; j = j + 2 | 0; d = d + 2 | 0; } while ((j | 0) < (h | 0)); d = 0; h = 160; while (1) { j = b[f >> 1] | 0; d = (Z(j << 1, j) | 0) + d | 0; if ((d | 0) < 0) { d = 2147483647; break } h = h + -1 << 16 >> 16; if (!(h << 16 >> 16)) break; else f = f + 2 | 0; } de(d, k, m, g); d = b[k >> 1] | 0; k = d << 16 >> 16; f = k << 10; if ((f | 0) != (k << 26 >> 16 | 0)) { c[g >> 2] = 1; f = d << 16 >> 16 > 0 ? 32767 : -32768; } b[a + 160 + (b[l >> 1] << 1) >> 1] = (((b[m >> 1] | 0) >>> 5) + f << 16) + -558432256 >> 17; i = n; return } function oc(a, d, e, f) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; var g = 0, h = 0, i = 0; h = a + 190 | 0; i = Rd(b[h >> 1] | 0, 1, f) | 0; b[h >> 1] = i; g = a + 188 | 0; do if (!(d << 16 >> 16)) { a = b[g >> 1] | 0; if (!(a << 16 >> 16)) { b[h >> 1] = 0; c[e >> 2] = 8; a = 1; break } h = (a & 65535) + 65535 & 65535; b[g >> 1] = h; if ((Rd(i, h, f) | 0) << 16 >> 16 < 30) { c[e >> 2] = 8; a = 0; } else a = 0; } else { b[g >> 1] = 7; a = 0; } while (0); return a | 0 } function pc(a, b, c, d, e, f, g, h) { a = a | 0; b = b | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; if (!(f << 16 >> 16)) { f = a << 16 >> 16; if (((f << 16) + -5570560 | 0) < 65536) { b = (f * 3 | 0) + -58 + (b << 16 >> 16) | 0; b = b & 65535; return b | 0 } else { b = f + 112 | 0; b = b & 65535; return b | 0 } } if (!(g << 16 >> 16)) { h = (a & 65535) - (d & 65535) << 16; b = (b << 16 >> 16) + 2 + (h >> 15) + (h >> 16) | 0; b = b & 65535; return b | 0 } d = d << 16 >> 16; d = (((c & 65535) - d << 16) + -327680 | 0) > 0 ? d + 5 & 65535 : c; e = e << 16 >> 16; c = a << 16 >> 16; d = (((e - (d & 65535) << 16) + -262144 | 0) > 0 ? e + 65532 & 65535 : d) << 16 >> 16; e = d * 196608 | 0; a = e + -393216 >> 16; f = ((b & 65535) << 16) + (c * 196608 | 0) >> 16; if (!(a - f & 32768)) { b = c + 5 - d | 0; b = b & 65535; return b | 0 } if ((e + 196608 >> 16 | 0) > (f | 0)) { b = f + 3 - a | 0; b = b & 65535; return b | 0 } else { b = c + 11 - d | 0; b = b & 65535; return b | 0 } return 0 } function qc(a, b, c, d, e) { a = a | 0; b = b | 0; c = c | 0; d = d | 0; e = e | 0; e = a << 16 >> 16; do if (!(d << 16 >> 16)) if (a << 16 >> 16 < 95) { e = ((e * 393216 | 0) + -6881280 >> 16) + (b << 16 >> 16) | 0; break } else { e = e + 368 | 0; break } else e = ((((e - (c & 65535) | 0) * 393216 | 0) + 196608 | 0) >>> 16) + (b & 65535) | 0; while (0); return e & 65535 | 0 } function rc(d, f, g, h) { d = d | 0; f = f | 0; g = g | 0; h = h | 0; var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0; i = c[h + 96 >> 2] | 0; if (d >>> 0 < 8) { m = (c[h + 100 >> 2] | 0) + (d << 2) | 0; l = c[m >> 2] | 0; a[g >> 0] = b[f + (b[l >> 1] << 1) >> 1] << 4 | d | b[f + (b[l + 2 >> 1] << 1) >> 1] << 5 | b[f + (b[l + 4 >> 1] << 1) >> 1] << 6 | b[f + (b[l + 6 >> 1] << 1) >> 1] << 7; l = i + (d << 1) | 0; h = b[l >> 1] | 0; if ((h + -7 | 0) > 4) { i = 4; k = 4; d = 1; while (1) { n = b[f + (b[(c[m >> 2] | 0) + (i << 1) >> 1] << 1) >> 1] | 0; h = g + (d << 16 >> 16) | 0; a[h >> 0] = n; n = e[f + (b[(c[m >> 2] | 0) + ((k | 1) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 1 | n & 65535; a[h >> 0] = n; n = e[f + (b[(c[m >> 2] | 0) + ((k | 2) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 2 | n; a[h >> 0] = n; n = e[f + (b[(c[m >> 2] | 0) + ((k | 3) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 3 | n; a[h >> 0] = n; n = e[f + (b[(c[m >> 2] | 0) + (k + 4 << 16 >> 16 << 16 >> 16 << 1) >> 1] << 1) >> 1] << 4 | n; a[h >> 0] = n; n = e[f + (b[(c[m >> 2] | 0) + (k + 5 << 16 >> 16 << 16 >> 16 << 1) >> 1] << 1) >> 1] << 5 | n; a[h >> 0] = n; n = e[f + (b[(c[m >> 2] | 0) + (k + 6 << 16 >> 16 << 16 >> 16 << 1) >> 1] << 1) >> 1] << 6 | n; a[h >> 0] = n; j = k + 8 << 16 >> 16; d = d + 1 << 16 >> 16; a[h >> 0] = e[f + (b[(c[m >> 2] | 0) + (k + 7 << 16 >> 16 << 16 >> 16 << 1) >> 1] << 1) >> 1] << 7 | n; i = j << 16 >> 16; h = b[l >> 1] | 0; if ((i | 0) >= (h + -7 | 0)) break; else k = j; } } else { j = 4; d = 1; } l = h + 4 & 7; if (!l) return; i = g + (d << 16 >> 16) | 0; a[i >> 0] = 0; h = 0; k = 0; d = 0; while (1) { k = (e[f + (b[(c[m >> 2] | 0) + (j << 16 >> 16 << 1) >> 1] << 1) >> 1] & 255) << h | k & 255; a[i >> 0] = k; d = d + 1 << 16 >> 16; h = d << 16 >> 16; if ((h | 0) >= (l | 0)) break; else j = j + 1 << 16 >> 16; } return } if ((d | 0) == 15) { a[g >> 0] = 15; return } a[g >> 0] = b[f >> 1] << 4 | d | b[f + 2 >> 1] << 5 | b[f + 4 >> 1] << 6 | b[f + 6 >> 1] << 7; h = i + (d << 1) | 0; d = b[h >> 1] | 0; i = ((d & 65535) << 16) + 262144 >> 16; m = i & -8; k = (m + 524281 | 0) >>> 3 & 65535; if (k << 16 >> 16 > 0) { i = ((i & -8) + 524281 | 0) >>> 3; l = ((i << 3) + 524280 & 524280) + 12 | 0; j = 1; d = f + 8 | 0; while (1) { a[g + (j << 16 >> 16) >> 0] = e[d + 2 >> 1] << 1 | e[d >> 1] | e[d + 4 >> 1] << 2 | e[d + 6 >> 1] << 3 | e[d + 8 >> 1] << 4 | e[d + 10 >> 1] << 5 | e[d + 12 >> 1] << 6 | e[d + 14 >> 1] << 7; if (k << 16 >> 16 > 1) { k = k + -1 << 16 >> 16; j = j + 1 << 16 >> 16; d = d + 16 | 0; } else break } d = b[h >> 1] | 0; j = (i << 16) + 65536 >> 16; } else { l = 4; j = 1; } d = (0 - m | 4) + (d & 65535) << 16; k = d >> 16; if (!k) return; j = g + j | 0; a[j >> 0] = 0; if ((d | 0) > 0) { d = 0; i = 0; h = 0; } else return; do { i = i & 255 | b[f + (l + d << 1) >> 1] << d; a[j >> 0] = i; h = h + 1 << 16 >> 16; d = h << 16 >> 16; } while ((d | 0) < (k | 0)); return } function sc(d, f, g, h) { d = d | 0; f = f | 0; g = g | 0; h = h | 0; var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0; o = c[h + 100 >> 2] | 0; n = c[h + 96 >> 2] | 0; a[g >> 0] = d & 15; n = n + (d << 1) | 0; i = b[n >> 1] | 0; if (d >>> 0 >= 8) { l = ((i & 65535) << 16) + -458752 | 0; if ((l | 0) > 0) { m = 1; k = f; while (1) { f = k + 16 | 0; h = m + 1 << 16 >> 16; a[g + (m << 16 >> 16) >> 0] = e[k + 14 >> 1] | e[k + 12 >> 1] << 1 | ((e[k + 2 >> 1] << 6 | e[k >> 1] << 7 | e[k + 4 >> 1] << 5 | e[k + 6 >> 1] << 4) & 240 | e[k + 8 >> 1] << 3 | e[k + 10 >> 1] << 2) & 252; l = l + -524288 & -65536; if ((l | 0) <= 0) break; else { m = h; k = f; } } i = b[n >> 1] | 0; } else h = 1; m = i & 7; i = g + (h << 16 >> 16) | 0; a[i >> 0] = 0; if (!m) return; else { j = 0; k = 0; l = 0; h = f; } while (1) { k = k & 255 | b[h >> 1] << 7 - j; a[i >> 0] = k; l = l + 1 << 16 >> 16; j = l << 16 >> 16; if ((j | 0) >= (m | 0)) break; else h = h + 2 | 0; } return } k = i << 16 >> 16; if (i << 16 >> 16 > 7) { i = o + (d << 2) | 0; h = 0; m = 0; j = 1; while (1) { p = e[f + (b[(c[i >> 2] | 0) + (h << 1) >> 1] << 1) >> 1] << 7; k = g + (j << 16 >> 16) | 0; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 1) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 6 | p; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 2) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 5 | p; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 3) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 4 | p; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 4) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 3 | p & 240; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 5) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 2 | p; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 6) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 1 | p; a[k >> 0] = p; l = m + 8 << 16 >> 16; j = j + 1 << 16 >> 16; a[k >> 0] = p & 254 | e[f + (b[(c[i >> 2] | 0) + ((m | 7) << 16 >> 16 << 1) >> 1] << 1) >> 1]; h = l << 16 >> 16; k = b[n >> 1] | 0; if ((h | 0) >= (k + -7 | 0)) break; else m = l; } } else { l = 0; j = 1; } n = k & 7; m = g + (j << 16 >> 16) | 0; a[m >> 0] = 0; if (!n) return; j = o + (d << 2) | 0; i = 0; h = 0; k = 0; while (1) { h = (e[f + (b[(c[j >> 2] | 0) + (l << 16 >> 16 << 1) >> 1] << 1) >> 1] & 255) << 7 - i | h & 255; a[m >> 0] = h; k = k + 1 << 16 >> 16; i = k << 16 >> 16; if ((i | 0) >= (n | 0)) break; else l = l + 1 << 16 >> 16; } return } function tc(d, f, g, h) { d = d | 0; f = f | 0; g = g | 0; h = h | 0; var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0; o = c[h + 100 >> 2] | 0; n = c[h + 96 >> 2] | 0; a[g >> 0] = d << 3; n = n + (d << 1) | 0; i = b[n >> 1] | 0; if (d >>> 0 >= 8) { l = ((i & 65535) << 16) + -458752 | 0; if ((l | 0) > 0) { m = 1; k = f; while (1) { f = k + 16 | 0; h = m + 1 << 16 >> 16; a[g + (m << 16 >> 16) >> 0] = e[k + 14 >> 1] | e[k + 12 >> 1] << 1 | ((e[k + 2 >> 1] << 6 | e[k >> 1] << 7 | e[k + 4 >> 1] << 5 | e[k + 6 >> 1] << 4) & 240 | e[k + 8 >> 1] << 3 | e[k + 10 >> 1] << 2) & 252; l = l + -524288 & -65536; if ((l | 0) <= 0) break; else { m = h; k = f; } } i = b[n >> 1] | 0; } else h = 1; m = i & 7; i = g + (h << 16 >> 16) | 0; a[i >> 0] = 0; if (!m) return; else { j = 0; k = 0; l = 0; h = f; } while (1) { k = k & 255 | b[h >> 1] << 7 - j; a[i >> 0] = k; l = l + 1 << 16 >> 16; j = l << 16 >> 16; if ((j | 0) >= (m | 0)) break; else h = h + 2 | 0; } return } k = i << 16 >> 16; if (i << 16 >> 16 > 7) { i = o + (d << 2) | 0; h = 0; m = 0; j = 1; while (1) { p = e[f + (b[(c[i >> 2] | 0) + (h << 1) >> 1] << 1) >> 1] << 7; k = g + (j << 16 >> 16) | 0; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 1) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 6 | p; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 2) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 5 | p; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 3) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 4 | p; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 4) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 3 | p & 240; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 5) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 2 | p; a[k >> 0] = p; p = e[f + (b[(c[i >> 2] | 0) + ((m | 6) << 16 >> 16 << 1) >> 1] << 1) >> 1] << 1 | p; a[k >> 0] = p; l = m + 8 << 16 >> 16; j = j + 1 << 16 >> 16; a[k >> 0] = p & 254 | e[f + (b[(c[i >> 2] | 0) + ((m | 7) << 16 >> 16 << 1) >> 1] << 1) >> 1]; h = l << 16 >> 16; k = b[n >> 1] | 0; if ((h | 0) >= (k + -7 | 0)) break; else m = l; } } else { l = 0; j = 1; } n = k & 7; m = g + (j << 16 >> 16) | 0; a[m >> 0] = 0; if (!n) return; j = o + (d << 2) | 0; i = 0; h = 0; k = 0; while (1) { h = (e[f + (b[(c[j >> 2] | 0) + (l << 16 >> 16 << 1) >> 1] << 1) >> 1] & 255) << 7 - i | h & 255; a[m >> 0] = h; k = k + 1 << 16 >> 16; i = k << 16 >> 16; if ((i | 0) >= (n | 0)) break; else l = l + 1 << 16 >> 16; } return } function uc(a) { a = a | 0; var d = 0; if (!a) { a = -1; return a | 0 } c[a >> 2] = 0; d = Je(16) | 0; if (!d) { a = -1; return a | 0 } ;b[d >> 1] = 0; b[d + 2 >> 1] = 0; b[d + 4 >> 1] = 0; b[d + 6 >> 1] = 0; b[d + 8 >> 1] = 0; b[d + 10 >> 1] = 0; b[d + 12 >> 1] = 0; b[d + 14 >> 1] = 0; c[a >> 2] = d; a = 0; return a | 0 } function vc(a) { a = a | 0; if (!a) { a = -1; return a | 0 } ;b[a >> 1] = 0; b[a + 2 >> 1] = 0; b[a + 4 >> 1] = 0; b[a + 6 >> 1] = 0; b[a + 8 >> 1] = 0; b[a + 10 >> 1] = 0; b[a + 12 >> 1] = 0; b[a + 14 >> 1] = 0; a = 0; return a | 0 } function wc(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function xc(a, d, e, f, g) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; var h = 0, i = 0, j = 0, k = 0, l = 0; j = d << 16 >> 16 < 2722 ? 0 : d << 16 >> 16 < 5444 ? 1 : 2; i = Ee(e, 1, g) | 0; l = a + 4 | 0; if (!(e << 16 >> 16 > 200 ? i << 16 >> 16 > (b[l >> 1] | 0) : 0)) { i = b[a >> 1] | 0; if (i << 16 >> 16) { h = i + -1 << 16 >> 16; b[a >> 1] = h; h = h << 16 >> 16 != 0; k = 5; } } else { b[a >> 1] = 8; h = 1; k = 5; } if ((k | 0) == 5) if ((j & 65535) < 2 & h) j = (j & 65535) + 1 & 65535; k = a + 6 | 0; b[k >> 1] = d; h = Zd(k, 5) | 0; if (!(j << 16 >> 16 != 0 | h << 16 >> 16 > 5443)) if (h << 16 >> 16 < 0) h = 16384; else { h = h << 16 >> 16; h = (((h << 18 >> 18 | 0) == (h | 0) ? h << 2 : h >>> 15 ^ 32767) << 16 >> 16) * 24660 >> 15; if ((h | 0) > 32767) { c[g >> 2] = 1; h = 32767; } h = 16384 - h & 65535; } else h = 0; i = a + 2 | 0; if (!(b[i >> 1] | 0)) h = De(h, 1, g) | 0; b[f >> 1] = h; b[i >> 1] = h; b[l >> 1] = e; f = a + 12 | 0; b[a + 14 >> 1] = b[f >> 1] | 0; e = a + 10 | 0; b[f >> 1] = b[e >> 1] | 0; a = a + 8 | 0; b[e >> 1] = b[a >> 1] | 0; b[a >> 1] = b[k >> 1] | 0; return } function yc(a) { a = a | 0; var d = 0, e = 0, f = 0, g = 0, h = 0, i = 0; if (!a) { a = -1; return a | 0 } c[a >> 2] = 0; d = Je(68) | 0; f = d; if (!d) { a = -1; return a | 0 } c[d + 28 >> 2] = 0; g = d + 64 | 0; c[g >> 2] = 0; h = d + 32 | 0; if (((Ud(h) | 0) << 16 >> 16 == 0 ? (i = d + 48 | 0, (Ud(i) | 0) << 16 >> 16 == 0) : 0) ? (uc(g) | 0) << 16 >> 16 == 0 : 0) { e = d + 32 | 0; do { b[d >> 1] = 0; d = d + 2 | 0; } while ((d | 0) < (e | 0)); Ud(h) | 0; Ud(i) | 0; vc(c[g >> 2] | 0) | 0; c[a >> 2] = f; a = 0; return a | 0 } wc(g); Ke(d); a = -1; return a | 0 } function zc(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; wc(b + 64 | 0); Ke(c[a >> 2] | 0); c[a >> 2] = 0; return } function Ac(a) { a = a | 0; var d = 0, e = 0, f = 0; if (!a) { f = -1; return f | 0 } d = a + 32 | 0; e = a; f = e + 32 | 0; do { b[e >> 1] = 0; e = e + 2 | 0; } while ((e | 0) < (f | 0)); Ud(d) | 0; Ud(a + 48 | 0) | 0; vc(c[a + 64 >> 2] | 0) | 0; f = 0; return f | 0 } function Bc(a, d, f, g, h, j, k, l, m, n, o, p, q, r, s, t, u, v, w) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; p = p | 0; q = q | 0; r = r | 0; s = s | 0; t = t | 0; u = u | 0; v = v | 0; w = w | 0; var x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0; H = i; i = i + 48 | 0; y = H + 34 | 0; A = H + 32 | 0; C = H + 30 | 0; B = H + 28 | 0; z = H + 18 | 0; x = H + 8 | 0; D = H + 6 | 0; E = H + 4 | 0; F = H + 2 | 0; G = H; if (d) { o = a + 32 | 0; Vd(o, d, h, y, A, D, E, w); do if ((d | 0) != 7) { Vb(d, j, k, l, m, n, z, x, G, F, w); if ((d | 0) == 5) { ld(c[a + 64 >> 2] | 0, f, g, h, z, x, b[D >> 1] | 0, b[E >> 1] | 0, b[y >> 1] | 0, b[A >> 1] | 0, 40, b[G >> 1] | 0, b[F >> 1] | 0, p, s, t, C, B, u, v, w); break } else { a = od(d, b[y >> 1] | 0, b[A >> 1] | 0, z, x, p, s, t, C, B, v, w) | 0; j = c[u >> 2] | 0; c[u >> 2] = j + 2; b[j >> 1] = a; break } } else { b[t >> 1] = Cc(k, m, w) | 0; a = md(7, b[y >> 1] | 0, b[A >> 1] | 0, t, C, B, c[v + 68 >> 2] | 0, w) | 0; j = c[u >> 2] | 0; c[u >> 2] = j + 2; b[j >> 1] = a; } while (0); Wd(o, b[C >> 1] | 0, b[B >> 1] | 0); i = H; return } if (!(o << 16 >> 16)) { Vd(a + 48 | 0, 0, h, y, A, D, E, w); Vb(0, j, k, l, m, n, z, x, G, F, w); Wb(j, D, E, w); j = jd(a + 32 | 0, b[a >> 1] | 0, b[a + 2 >> 1] | 0, a + 8 | 0, a + 18 | 0, b[a + 4 >> 1] | 0, b[a + 6 >> 1] | 0, h, b[y >> 1] | 0, b[A >> 1] | 0, x, z, b[D >> 1] | 0, b[E >> 1] | 0, p, q, r, s, t, w) | 0; b[c[a + 28 >> 2] >> 1] = j; i = H; return } o = c[u >> 2] | 0; c[u >> 2] = o + 2; c[a + 28 >> 2] = o; o = a + 48 | 0; f = a + 32 | 0; q = f; q = e[q >> 1] | e[q + 2 >> 1] << 16; f = f + 4 | 0; f = e[f >> 1] | e[f + 2 >> 1] << 16; u = o; r = u; b[r >> 1] = q; b[r + 2 >> 1] = q >>> 16; u = u + 4 | 0; b[u >> 1] = f; b[u + 2 >> 1] = f >>> 16; u = a + 40 | 0; f = u; f = e[f >> 1] | e[f + 2 >> 1] << 16; u = u + 4 | 0; u = e[u >> 1] | e[u + 2 >> 1] << 16; r = a + 56 | 0; q = r; b[q >> 1] = f; b[q + 2 >> 1] = f >>> 16; r = r + 4 | 0; b[r >> 1] = u; b[r + 2 >> 1] = u >>> 16; r = a + 2 | 0; Vd(o, 0, h, a, r, D, E, w); Vb(0, j, k, l, m, n, a + 18 | 0, a + 8 | 0, G, F, w); l = (e[F >> 1] | 0) + 1 | 0; u = b[G >> 1] | 0; q = l << 16 >> 16; if ((l & 65535) << 16 >> 16 < 0) { v = 0 - q << 16; if ((v | 0) < 983040) v = u << 16 >> 16 >> (v >> 16) & 65535; else v = 0; } else { u = u << 16 >> 16; v = u << q; if ((v << 16 >> 16 >> q | 0) == (u | 0)) v = v & 65535; else v = (u >>> 15 ^ 32767) & 65535; } b[t >> 1] = v; Wb(j, a + 4 | 0, a + 6 | 0, w); id(o, b[a >> 1] | 0, b[r >> 1] | 0, b[F >> 1] | 0, b[G >> 1] | 0, w); i = H; return } function Cc(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var e = 0, f = 0, g = 0; f = 10; d = a; e = c; a = 0; while (1) { a = (Z(b[e >> 1] >> 1, b[d >> 1] | 0) | 0) + a | 0; a = a + (Z(b[e + 2 >> 1] >> 1, b[d + 2 >> 1] | 0) | 0) | 0; a = a + (Z(b[e + 4 >> 1] >> 1, b[d + 4 >> 1] | 0) | 0) | 0; a = a + (Z(b[e + 6 >> 1] >> 1, b[d + 6 >> 1] | 0) | 0) | 0; f = f + -1 << 16 >> 16; if (!(f << 16 >> 16)) break; else { d = d + 8 | 0; e = e + 8 | 0; } } d = a << 1; f = pe(d | 1) | 0; g = f << 16 >> 16; d = (f << 16 >> 16 < 17 ? d >> 17 - g : d << g + -17) & 65535; if (d << 16 >> 16 < 1) { c = 0; return c | 0 } else { f = 20; e = c; a = 0; } while (1) { c = b[e >> 1] >> 1; c = ((Z(c, c) | 0) >>> 2) + a | 0; a = b[e + 2 >> 1] >> 1; a = c + ((Z(a, a) | 0) >>> 2) | 0; f = f + -1 << 16 >> 16; if (!(f << 16 >> 16)) break; else e = e + 4 | 0; } a = a << 3; f = pe(a) | 0; c = f << 16 >> 16; d = Td(d, (f << 16 >> 16 < 16 ? a >> 16 - c : a << c + -16) & 65535) | 0; c = (g << 16) + 327680 - (c << 16) | 0; a = c >> 16; if ((c | 0) > 65536) a = d << 16 >> 16 >> a + -1; else a = d << 16 >> 16 << 1 - a; c = a & 65535; return c | 0 } function Dc(a, d, e, f, g, h) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0; c[h >> 2] = 0; m = g << 16 >> 16; k = m >>> 2 & 65535; o = k << 16 >> 16 == 0; if (o) j = 0; else { l = k; i = e; j = 0; while (1) { p = b[i >> 1] | 0; p = (Z(p, p) | 0) + j | 0; j = b[i + 2 >> 1] | 0; j = p + (Z(j, j) | 0) | 0; p = b[i + 4 >> 1] | 0; p = j + (Z(p, p) | 0) | 0; j = b[i + 6 >> 1] | 0; j = p + (Z(j, j) | 0) | 0; l = l + -1 << 16 >> 16; if (!(l << 16 >> 16)) break; else i = i + 8 | 0; } } if (!((j >>> 31 ^ 1) & (j | 0) < 1073741824)) { j = m >>> 1 & 65535; if (!(j << 16 >> 16)) j = 1; else { i = j; l = e; j = 0; while (1) { p = b[l >> 1] >> 2; p = (Z(p, p) | 0) + j | 0; j = b[l + 2 >> 1] >> 2; j = p + (Z(j, j) | 0) | 0; i = i + -1 << 16 >> 16; if (!(i << 16 >> 16)) break; else l = l + 4 | 0; } j = j << 1 | 1; } p = (pe(j) | 0) << 16 >> 16; n = p + 65532 & 65535; p = Ce(j << p, h) | 0; } else { m = j << 1 | 1; p = pe(m) | 0; n = p; p = Ce(m << (p << 16 >> 16), h) | 0; } c[h >> 2] = 0; do if (!(g << 16 >> 16)) { j = 1; q = 14; } else { m = g; l = d; j = e; g = 0; while (1) { r = Z(b[j >> 1] | 0, b[l >> 1] | 0) | 0; i = r + g | 0; if ((r ^ g | 0) > 0 & (i ^ g | 0) < 0) break; m = m + -1 << 16 >> 16; if (!(m << 16 >> 16)) { q = 13; break } else { l = l + 2 | 0; j = j + 2 | 0; g = i; } } if ((q | 0) == 13) { j = i << 1 | 1; q = 14; break } c[h >> 2] = 1; if (o) j = 1; else { j = d; i = 0; while (1) { i = (Z(b[e >> 1] >> 2, b[j >> 1] | 0) | 0) + i | 0; i = i + (Z(b[e + 2 >> 1] >> 2, b[j + 2 >> 1] | 0) | 0) | 0; i = i + (Z(b[e + 4 >> 1] >> 2, b[j + 4 >> 1] | 0) | 0) | 0; i = i + (Z(b[e + 6 >> 1] >> 2, b[j + 6 >> 1] | 0) | 0) | 0; k = k + -1 << 16 >> 16; if (!(k << 16 >> 16)) break; else { j = j + 8 | 0; e = e + 8 | 0; } } j = i << 1 | 1; } e = (pe(j) | 0) << 16 >> 16; i = e + 65532 & 65535; e = Ce(j << e, h) | 0; } while (0); if ((q | 0) == 14) { e = pe(j) | 0; i = e; e = Ce(j << (e << 16 >> 16), h) | 0; } b[f >> 1] = p; j = n << 16 >> 16; b[f + 2 >> 1] = 15 - j; b[f + 4 >> 1] = e; i = i << 16 >> 16; b[f + 6 >> 1] = 15 - i; if (e << 16 >> 16 < 4) { r = 0; return r | 0 } i = De(Td(e << 16 >> 16 >>> 1 & 65535, p) | 0, i - j & 65535, h) | 0; i = i << 16 >> 16 > 19661 ? 19661 : i; if ((a | 0) != 7) { r = i; return r | 0 } r = i & 65532; return r | 0 } function Ec(a, d, e, f, g, h, i) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; var j = 0, k = 0, l = 0, m = 0, n = 0, o = 0; k = (f & 65535) + 65535 & 65535; if (k << 16 >> 16 > g << 16 >> 16) { n = f + -1 << 16 >> 16 << 16 >> 16; f = -2147483648; while (1) { l = c[a + (0 - n << 2) >> 2] | 0; j = l << 1; l = (j >> 1 | 0) == (l | 0) ? j : l >> 31 ^ 2147483647; j = c[a + (~n << 2) >> 2] | 0; m = l - j | 0; if (((m ^ l) & (l ^ j) | 0) < 0) { c[i >> 2] = 1; m = (l >>> 31) + 2147483647 | 0; } l = c[a + (1 - n << 2) >> 2] | 0; j = m - l | 0; if (((j ^ m) & (l ^ m) | 0) < 0) { c[i >> 2] = 1; j = (m >>> 31) + 2147483647 | 0; } m = Gc(j) | 0; f = (m | 0) < (f | 0) ? f : m; k = k + -1 << 16 >> 16; if (k << 16 >> 16 <= g << 16 >> 16) { g = f; break } else n = n + -1 | 0; } } else g = -2147483648; a = e << 16 >> 16 > 0; if (a) { f = 0; j = d; k = 0; while (1) { m = b[j >> 1] | 0; m = Z(m, m) | 0; if ((m | 0) != 1073741824) { l = (m << 1) + k | 0; if ((m ^ k | 0) > 0 & (l ^ k | 0) < 0) { c[i >> 2] = 1; k = (k >>> 31) + 2147483647 | 0; } else k = l; } else { c[i >> 2] = 1; k = 2147483647; } f = f + 1 << 16 >> 16; if (f << 16 >> 16 >= e << 16 >> 16) break; else j = j + 2 | 0; } if (a) { a = 0; n = d; f = d + -2 | 0; j = 0; while (1) { m = Z(b[f >> 1] | 0, b[n >> 1] | 0) | 0; if ((m | 0) != 1073741824) { l = (m << 1) + j | 0; if ((m ^ j | 0) > 0 & (l ^ j | 0) < 0) { c[i >> 2] = 1; j = (j >>> 31) + 2147483647 | 0; } else j = l; } else { c[i >> 2] = 1; j = 2147483647; } a = a + 1 << 16 >> 16; if (a << 16 >> 16 >= e << 16 >> 16) break; else { n = n + 2 | 0; f = f + 2 | 0; } } } else j = 0; } else { k = 0; j = 0; } f = k << 1; f = (f >> 1 | 0) == (k | 0) ? f : k >> 31 ^ 2147483647; e = j << 1; e = (e >> 1 | 0) == (j | 0) ? e : j >> 31 ^ 2147483647; k = f - e | 0; if (((k ^ f) & (e ^ f) | 0) < 0) { c[i >> 2] = 1; k = (f >>> 31) + 2147483647 | 0; } a = Gc(k) | 0; n = ((pe(g) | 0) & 65535) + 65535 | 0; k = n << 16 >> 16; if ((n & 65535) << 16 >> 16 > 0) { f = g << k; if ((f >> k | 0) != (g | 0)) f = g >> 31 ^ 2147483647; } else { k = 0 - k << 16; if ((k | 0) < 2031616) f = g >> (k >> 16); else f = 0; } m = pe(a) | 0; j = m << 16 >> 16; if (m << 16 >> 16 > 0) { k = a << j; if ((k >> j | 0) == (a | 0)) o = 33; else { k = a >> 31 ^ 2147483647; o = 33; } } else { k = 0 - j << 16; if ((k | 0) < 2031616) { k = a >> (k >> 16); o = 33; } else l = 0; } if ((o | 0) == 33) if (k >>> 0 > 65535) l = Td(f >>> 16 & 65535, k >>> 16 & 65535) | 0; else l = 0; k = m & 65535; o = (n & 65535) - k | 0; f = o & 65535; if (!(o & 32768)) { i = De(l, f, i) | 0; b[h >> 1] = i; return 0 } if (f << 16 >> 16 != -32768) { i = k - n | 0; j = i << 16 >> 16; if ((i & 65535) << 16 >> 16 < 0) { j = 0 - j << 16; if ((j | 0) >= 983040) { i = 0; b[h >> 1] = i; return 0 } i = l << 16 >> 16 >> (j >> 16) & 65535; b[h >> 1] = i; return 0 } } else j = 32767; f = l << 16 >> 16; k = f << j; if ((k << 16 >> 16 >> j | 0) == (f | 0)) { i = k & 65535; b[h >> 1] = i; return 0 } i = (f >>> 15 ^ 32767) & 65535; b[h >> 1] = i; return 0 } function Fc(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; if (d << 16 >> 16) c = c << 16 >> 16 << 1 & 65535; if (c << 16 >> 16 < 0) { a = a + -2 | 0; c = (c & 65535) + 6 & 65535; } d = c << 16 >> 16; e = 6 - d << 16 >> 16; c = (Z(b[3468 + (d << 1) >> 1] | 0, b[a >> 1] | 0) | 0) + 16384 | 0; c = c + (Z(b[3468 + (e << 1) >> 1] | 0, b[a + 2 >> 1] | 0) | 0) | 0; c = c + (Z(b[3468 + (d + 6 << 1) >> 1] | 0, b[a + -2 >> 1] | 0) | 0) | 0; c = c + (Z(b[3468 + (e + 6 << 1) >> 1] | 0, b[a + 4 >> 1] | 0) | 0) | 0; c = (Z(b[3468 + (d + 12 << 1) >> 1] | 0, b[a + -4 >> 1] | 0) | 0) + c | 0; c = c + (Z(b[3468 + (e + 12 << 1) >> 1] | 0, b[a + 6 >> 1] | 0) | 0) | 0; d = c + (Z(b[3468 + (d + 18 << 1) >> 1] | 0, b[a + -6 >> 1] | 0) | 0) | 0; return (d + (Z(b[3468 + (e + 18 << 1) >> 1] | 0, b[a + 8 >> 1] | 0) | 0) | 0) >>> 15 & 65535 | 0 } function Gc(a) { a = a | 0; a = a - (a >>> 31) | 0; return a >> 31 ^ a | 0 } function Hc(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, i = 0, j = 0; if (!(a << 16 >> 16)) return; else { f = 3518; g = 3538; e = d; } while (1) { e = e + 2 | 0; c = c + 2 | 0; j = b[c >> 1] | 0; i = b[f >> 1] | 0; d = Z(i, j) | 0; d = (d | 0) == 1073741824 ? 2147483647 : d << 1; j = (Z(b[g >> 1] | 0, j) | 0) >> 15; h = (j << 1) + d | 0; h = (d ^ j | 0) > 0 & (h ^ d | 0) < 0 ? (d >>> 31) + 2147483647 | 0 : h; i = (Z(i, b[e >> 1] | 0) | 0) >> 15; d = h + (i << 1) | 0; d = (h ^ i | 0) > 0 & (d ^ h | 0) < 0 ? (h >>> 31) + 2147483647 | 0 : d; b[c >> 1] = d >>> 16; b[e >> 1] = (d >>> 1) - (d >> 16 << 15); a = a + -1 << 16 >> 16; if (!(a << 16 >> 16)) break; else { f = f + 2 | 0; g = g + 2 | 0; } } return } function Ic(a, b, d) { a = a | 0; b = b | 0; d = d | 0; var e = 0, f = 0; e = a & 65535; f = e << 16; b = b << 16 >> 16; a = (b << 1) + f | 0; if (!((b ^ f | 0) > 0 & (a ^ f | 0) < 0)) { f = a; return f | 0 } c[d >> 2] = 1; f = (e >>> 15) + 2147483647 | 0; return f | 0 } function Jc(a) { a = a | 0; var d = 0, e = 0, f = 0; if (!a) { f = -1; return f | 0 } c[a >> 2] = 0; d = Je(22) | 0; if (!d) { f = -1; return f | 0 } b[d >> 1] = 4096; e = d + 2 | 0; f = e + 20 | 0; do { b[e >> 1] = 0; e = e + 2 | 0; } while ((e | 0) < (f | 0)); c[a >> 2] = d; f = 0; return f | 0 } function Kc(a) { a = a | 0; var c = 0; if (!a) { c = -1; return c | 0 } b[a >> 1] = 4096; a = a + 2 | 0; c = a + 20 | 0; do { b[a >> 1] = 0; a = a + 2 | 0; } while ((a | 0) < (c | 0)); c = 0; return c | 0 } function Lc(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function Mc(a, c, d, f, g, h) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; var j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0; K = i; i = i + 96 | 0; I = K + 66 | 0; J = K + 44 | 0; H = K + 22 | 0; k = K; D = c + 2 | 0; G = d + 2 | 0; F = (b[G >> 1] << 1) + (e[D >> 1] << 16) | 0; j = Gc(F) | 0; j = ic(j, b[c >> 1] | 0, b[d >> 1] | 0, h) | 0; if ((F | 0) > 0) j = Oc(j) | 0; B = j >> 16; b[g >> 1] = Ce(j, h) | 0; v = j >> 20; E = I + 2 | 0; b[E >> 1] = v; F = J + 2 | 0; b[F >> 1] = (j >>> 5) - (v << 15); v = Z(B, B) | 0; v = (v | 0) == 1073741824 ? 2147483647 : v << 1; B = (Z((j >>> 1) - (B << 15) << 16 >> 16, B) | 0) >> 15; C = B << 1; A = C + v | 0; A = (B ^ v | 0) > 0 & (A ^ v | 0) < 0 ? (v >>> 31) + 2147483647 | 0 : A; C = A + C | 0; C = 2147483647 - (Gc((A ^ B | 0) > 0 & (C ^ A | 0) < 0 ? (A >>> 31) + 2147483647 | 0 : C) | 0) | 0; A = C >> 16; B = b[c >> 1] | 0; v = Z(A, B) | 0; v = (v | 0) == 1073741824 ? 2147483647 : v << 1; B = (Z((C >>> 1) - (A << 15) << 16 >> 16, B) | 0) >> 15; C = (B << 1) + v | 0; C = (B ^ v | 0) > 0 & (C ^ v | 0) < 0 ? (v >>> 31) + 2147483647 | 0 : C; A = (Z(b[d >> 1] | 0, A) | 0) >> 15; v = C + (A << 1) | 0; v = (C ^ A | 0) > 0 & (v ^ C | 0) < 0 ? (C >>> 31) + 2147483647 | 0 : v; C = pe(v) | 0; v = v << (C << 16 >> 16); A = H + 2 | 0; B = k + 2 | 0; l = v; v = (v >>> 1) - (v >> 16 << 15) | 0; w = k + 4 | 0; x = H + 4 | 0; y = 2; z = 2; while (1) { u = l >>> 16; j = u & 65535; r = v & 65535; s = z + -1 | 0; n = I + (s << 1) | 0; t = J + (s << 1) | 0; q = 1; p = n; o = t; m = D; k = G; l = 0; while (1) { L = b[m >> 1] | 0; M = ((Z(b[o >> 1] | 0, L) | 0) >> 15) + l | 0; l = b[p >> 1] | 0; l = M + (Z(l, L) | 0) + ((Z(l, b[k >> 1] | 0) | 0) >> 15) | 0; q = q + 1 << 16 >> 16; if ((q << 16 >> 16 | 0) >= (z | 0)) break; else { p = p + -2 | 0; o = o + -2 | 0; m = m + 2 | 0; k = k + 2 | 0; } } M = (e[c + (z << 1) >> 1] << 16) + (l << 5) + (b[d + (z << 1) >> 1] << 1) | 0; l = ic(Gc(M) | 0, j, r, h) | 0; if ((M | 0) > 0) l = Oc(l) | 0; k = C << 16 >> 16; if (C << 16 >> 16 > 0) { j = l << k; if ((j >> k | 0) != (l | 0)) j = l >> 31 ^ 2147483647; } else { k = 0 - k << 16; if ((k | 0) < 2031616) j = l >> (k >> 16); else j = 0; } q = j >> 16; if ((z | 0) < 5) b[g + (s << 1) >> 1] = (j + 32768 | 0) >>> 16; M = (j >>> 16) - (j >>> 31) | 0; if (((M << 16 >> 31 ^ M) & 65535) << 16 >> 16 > 32750) { j = 16; break } o = (j >>> 1) - (q << 15) << 16 >> 16; p = 1; l = t; k = A; m = B; while (1) { L = (Z(b[l >> 1] | 0, q) | 0) >> 15; t = b[n >> 1] | 0; M = (Z(t, o) | 0) >> 15; t = Z(t, q) | 0; M = t + L + (b[J + (p << 1) >> 1] | 0) + (b[I + (p << 1) >> 1] << 15) + M | 0; b[k >> 1] = M >>> 15; b[m >> 1] = M & 32767; p = p + 1 | 0; if ((p & 65535) << 16 >> 16 == y << 16 >> 16) break; else { n = n + -2 | 0; l = l + -2 | 0; k = k + 2 | 0; m = m + 2 | 0; } } b[x >> 1] = j >> 20; b[w >> 1] = (j >>> 5) - (b[H + (z << 1) >> 1] << 15); L = Z(q, q) | 0; L = (L | 0) == 1073741824 ? 2147483647 : L << 1; j = (Z(o, q) | 0) >> 15; M = j << 1; k = M + L | 0; k = (j ^ L | 0) > 0 & (k ^ L | 0) < 0 ? (L >>> 31) + 2147483647 | 0 : k; M = k + M | 0; M = 2147483647 - (Gc((k ^ j | 0) > 0 & (M ^ k | 0) < 0 ? (k >>> 31) + 2147483647 | 0 : M) | 0) | 0; k = M >> 16; j = u << 16 >> 16; j = ((Z(k, v << 16 >> 16) | 0) >> 15) + (Z(k, j) | 0) + ((Z((M >>> 1) - (k << 15) << 16 >> 16, j) | 0) >> 15) << 1; k = (pe(j) | 0) << 16 >> 16; j = j << k; M = z << 1; Oe(E | 0, A | 0, M | 0) | 0; Oe(F | 0, B | 0, M | 0) | 0; z = z + 1 | 0; if ((z | 0) >= 11) { j = 20; break } else { C = k + (C & 65535) & 65535; l = j; v = (j >> 1) - (j >> 16 << 15) | 0; w = w + 2 | 0; x = x + 2 | 0; y = y + 1 << 16 >> 16; } } if ((j | 0) == 16) { j = f + 22 | 0; do { b[f >> 1] = b[a >> 1] | 0; f = f + 2 | 0; a = a + 2 | 0; } while ((f | 0) < (j | 0)); M = g; L = M; b[L >> 1] = 0; b[L + 2 >> 1] = 0 >>> 16; M = M + 4 | 0; b[M >> 1] = 0; b[M + 2 >> 1] = 0 >>> 16; i = K; return 0 } else if ((j | 0) == 20) { b[f >> 1] = 4096; M = ((b[F >> 1] | 0) + 8192 + (b[E >> 1] << 15) | 0) >>> 14 & 65535; b[f + 2 >> 1] = M; b[a + 2 >> 1] = M; M = ((b[J + 4 >> 1] | 0) + 8192 + (b[I + 4 >> 1] << 15) | 0) >>> 14 & 65535; b[f + 4 >> 1] = M; b[a + 4 >> 1] = M; M = ((b[J + 6 >> 1] | 0) + 8192 + (b[I + 6 >> 1] << 15) | 0) >>> 14 & 65535; b[f + 6 >> 1] = M; b[a + 6 >> 1] = M; M = ((b[J + 8 >> 1] | 0) + 8192 + (b[I + 8 >> 1] << 15) | 0) >>> 14 & 65535; b[f + 8 >> 1] = M; b[a + 8 >> 1] = M; M = ((b[J + 10 >> 1] | 0) + 8192 + (b[I + 10 >> 1] << 15) | 0) >>> 14 & 65535; b[f + 10 >> 1] = M; b[a + 10 >> 1] = M; M = ((b[J + 12 >> 1] | 0) + 8192 + (b[I + 12 >> 1] << 15) | 0) >>> 14 & 65535; b[f + 12 >> 1] = M; b[a + 12 >> 1] = M; M = ((b[J + 14 >> 1] | 0) + 8192 + (b[I + 14 >> 1] << 15) | 0) >>> 14 & 65535; b[f + 14 >> 1] = M; b[a + 14 >> 1] = M; M = ((b[J + 16 >> 1] | 0) + 8192 + (b[I + 16 >> 1] << 15) | 0) >>> 14 & 65535; b[f + 16 >> 1] = M; b[a + 16 >> 1] = M; M = ((b[J + 18 >> 1] | 0) + 8192 + (b[I + 18 >> 1] << 15) | 0) >>> 14 & 65535; b[f + 18 >> 1] = M; b[a + 18 >> 1] = M; M = ((b[J + 20 >> 1] | 0) + 8192 + (b[I + 20 >> 1] << 15) | 0) >>> 14 & 65535; b[f + 20 >> 1] = M; b[a + 20 >> 1] = M; i = K; return 0 } return 0 } function Nc(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; e = a >> 16; b[c >> 1] = e; b[d >> 1] = (a >>> 1) - (e << 15); return } function Oc(a) { a = a | 0; return ((a | 0) == -2147483648 ? 2147483647 : 0 - a | 0) | 0 } function Pc(a) { a = a | 0; var b = 0; if (!a) { a = -1; return a | 0 } c[a >> 2] = 0; b = Je(4) | 0; if (!b) { a = -1; return a | 0 } c[b >> 2] = 0; if (!((Jc(b) | 0) << 16 >> 16)) { Kc(c[b >> 2] | 0) | 0; c[a >> 2] = b; a = 0; return a | 0 } else { Lc(b); Ke(b); a = -1; return a | 0 } return 0 } function Qc(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Lc(b); Ke(c[a >> 2] | 0); c[a >> 2] = 0; return } function Rc(a) { a = a | 0; if (!a) { a = -1; return a | 0 } Kc(c[a >> 2] | 0) | 0; a = 0; return a | 0 } function Sc(a, b, d, e, f, g, h) { a = a | 0; b = b | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; var j = 0, k = 0, l = 0, m = 0; m = i; i = i + 64 | 0; l = m + 48 | 0; k = m + 22 | 0; j = m; if ((b | 0) == 7) { d = c[g + 116 >> 2] | 0; Kb(e, 10, j, k, c[g + 112 >> 2] | 0, h) | 0; Hc(10, j, k, h); Mc(c[a >> 2] | 0, j, k, f + 22 | 0, l, h) | 0; Kb(e, 10, j, k, d, h) | 0; Hc(10, j, k, h); Mc(c[a >> 2] | 0, j, k, f + 66 | 0, l, h) | 0; i = m; return } else { Kb(d, 10, j, k, c[g + 108 >> 2] | 0, h) | 0; Hc(10, j, k, h); Mc(c[a >> 2] | 0, j, k, f + 66 | 0, l, h) | 0; i = m; return } } function Tc(a, c, d, e, f, g, h, i, j, k) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; j = j | 0; k = k | 0; if ((d | 0) == 6) { b[f >> 1] = bd(a, c, e, 20, 143, 80, g, h, i, j, k) | 0; return } b[h >> 1] = 0; b[h + 2 >> 1] = 0; if (d >>> 0 < 2) { b[f >> 1] = Yc(c, d, e, 20, 143, 160, i, j, k) | 0; return } if (d >>> 0 < 6) { b[f >> 1] = Yc(c, d, e, 20, 143, 80, i, j, k) | 0; return } else { b[f >> 1] = Yc(c, d, e, 18, 143, 80, i, j, k) | 0; return } } function Uc(a) { a = a | 0; var d = 0; if ((a | 0) != 0 ? (c[a >> 2] = 0, d = Je(2) | 0, (d | 0) != 0) : 0) { b[d >> 1] = 0; c[a >> 2] = d; d = 0; } else d = -1; return d | 0 } function Vc(a) { a = a | 0; if (!a) a = -1; else { b[a >> 1] = 0; a = 0; } return a | 0 } function Wc(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function Xc(a, c, d, f, g, h, j, k, l, m, n, o) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; var p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0, O = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0; U = i; i = i + 240 | 0; u = U + 160 | 0; v = U + 80 | 0; O = U; N = b[3558 + (c * 18 | 0) >> 1] | 0; T = b[3558 + (c * 18 | 0) + 2 >> 1] | 0; p = b[3558 + (c * 18 | 0) + 4 >> 1] | 0; P = b[3558 + (c * 18 | 0) + 6 >> 1] | 0; s = b[3558 + (c * 18 | 0) + 12 >> 1] | 0; r = b[3558 + (c * 18 | 0) + 14 >> 1] | 0; q = b[3558 + (c * 18 | 0) + 16 >> 1] | 0; a:do switch (k << 16 >> 16) { case 0: case 80: if (c >>> 0 < 2 & k << 16 >> 16 == 80) { Q = (e[a >> 1] | 0) - (s & 65535) | 0; Q = (Q << 16 >> 16 | 0) < (q << 16 >> 16 | 0) ? q : Q & 65535; M = r << 16 >> 16; R = (Q & 65535) + M & 65535; S = R << 16 >> 16 > 143; Q = S ? 143 - M & 65535 : Q; R = S ? 143 : R; S = 1; break a } else { Q = (e[d + ((k << 16 >> 16 != 0 & 1) << 1) >> 1] | 0) - (e[3558 + (c * 18 | 0) + 8 >> 1] | 0) | 0; Q = (Q << 16 >> 16 | 0) < (q << 16 >> 16 | 0) ? q : Q & 65535; M = b[3558 + (c * 18 | 0) + 10 >> 1] | 0; R = (Q & 65535) + M & 65535; S = R << 16 >> 16 > 143; Q = S ? 143 - M & 65535 : Q; R = S ? 143 : R; S = 0; break a } default: { Q = (e[a >> 1] | 0) - (s & 65535) | 0; Q = (Q << 16 >> 16 | 0) < (q << 16 >> 16 | 0) ? q : Q & 65535; M = r << 16 >> 16; R = (Q & 65535) + M & 65535; S = R << 16 >> 16 > 143; Q = S ? 143 - M & 65535 : Q; R = S ? 143 : R; S = 1; } } while (0); L = Q & 65535; k = L + 65532 | 0; t = k & 65535; K = (R & 65535) + 4 & 65535; M = k << 16 >> 16; k = 0 - (k & 65535) | 0; s = k & 65535; ec(f + (k << 16 >> 16 << 1) | 0, h, u, j); k = j << 16 >> 16; B = k >>> 1 & 65535; w = B << 16 >> 16 == 0; if (w) j = 1; else { j = B; q = u; d = v; r = 0; while (1) { J = b[q >> 1] | 0; b[d >> 1] = J >>> 2; J = (Z(J, J) | 0) + r | 0; r = b[q + 2 >> 1] | 0; b[d + 2 >> 1] = r >>> 2; r = J + (Z(r, r) | 0) | 0; j = j + -1 << 16 >> 16; if (!(j << 16 >> 16)) break; else { q = q + 4 | 0; d = d + 4 | 0; } } j = (r | 0) < 33554433; } J = j ? 0 : 2; A = j ? u : v; x = j ? u : v; b:do if (t << 16 >> 16 <= K << 16 >> 16) { y = k + -1 | 0; G = A + (y << 1) | 0; H = h + (y << 1) | 0; I = A + (k + -2 << 1) | 0; D = y >>> 1; E = D & 65535; z = E << 16 >> 16 == 0; F = j ? 12 : 14; D = (D << 1) + 131070 & 131070; d = k + -3 - D | 0; C = A + (d << 1) | 0; D = A + (k + -4 - D << 1) | 0; h = h + (d << 1) | 0; if (!w) { w = M; while (1) { v = B; u = x; q = g; r = 0; j = 0; while (1) { v = v + -1 << 16 >> 16; k = b[u >> 1] | 0; r = (Z(k, b[q >> 1] | 0) | 0) + r | 0; k = (Z(k, k) | 0) + j | 0; j = b[u + 2 >> 1] | 0; r = r + (Z(j, b[q + 2 >> 1] | 0) | 0) | 0; j = k + (Z(j, j) | 0) | 0; if (!(v << 16 >> 16)) break; else { u = u + 4 | 0; q = q + 4 | 0; } } u = ce(j << 1, o) | 0; j = u >> 16; q = r << 1 >> 16; v = Z(j, q) | 0; v = (v | 0) == 1073741824 ? 2147483647 : v << 1; q = (Z((u >>> 1) - (j << 15) << 16 >> 16, q) | 0) >> 15; u = (q << 1) + v | 0; u = (q ^ v | 0) > 0 & (u ^ v | 0) < 0 ? (v >>> 31) + 2147483647 | 0 : u; j = (Z(j, r & 32767) | 0) >> 15; v = u + (j << 1) | 0; b[O + (w - M << 1) >> 1] = (u ^ j | 0) > 0 & (v ^ u | 0) < 0 ? (u >>> 31) + 65535 | 0 : v; if (t << 16 >> 16 != K << 16 >> 16) { s = s + -1 << 16 >> 16; v = b[f + (s << 16 >> 16 << 1) >> 1] | 0; if (z) { u = y; j = I; r = H; q = G; } else { u = E; j = I; r = H; q = G; while (1) { w = (Z(b[r >> 1] | 0, v) | 0) >> F; b[q >> 1] = w + (e[j >> 1] | 0); w = (Z(b[r + -2 >> 1] | 0, v) | 0) >> F; b[q + -2 >> 1] = w + (e[j + -2 >> 1] | 0); u = u + -1 << 16 >> 16; if (!(u << 16 >> 16)) { u = d; j = D; r = h; q = C; break } else { j = j + -4 | 0; r = r + -4 | 0; q = q + -4 | 0; } } } w = (Z(b[r >> 1] | 0, v) | 0) >> F; b[q >> 1] = w + (e[j >> 1] | 0); b[A + (u + -1 << 1) >> 1] = v >> J; } t = t + 1 << 16 >> 16; if (t << 16 >> 16 > K << 16 >> 16) break b; else w = t << 16 >> 16; } } if (z) { j = A + (k + -2 << 1) | 0; r = M; while (1) { ce(0, o) | 0; b[O + (r - M << 1) >> 1] = 0; if (t << 16 >> 16 != K << 16 >> 16) { s = s + -1 << 16 >> 16; g = b[f + (s << 16 >> 16 << 1) >> 1] | 0; E = (Z(b[H >> 1] | 0, g) | 0) >> F; b[G >> 1] = E + (e[I >> 1] | 0); b[j >> 1] = g >> J; } t = t + 1 << 16 >> 16; if (t << 16 >> 16 > K << 16 >> 16) break b; else r = t << 16 >> 16; } } u = A + (d + -1 << 1) | 0; j = M; while (1) { ce(0, o) | 0; b[O + (j - M << 1) >> 1] = 0; if (t << 16 >> 16 != K << 16 >> 16) { s = s + -1 << 16 >> 16; j = b[f + (s << 16 >> 16 << 1) >> 1] | 0; r = E; q = I; d = H; k = G; while (1) { g = (Z(b[d >> 1] | 0, j) | 0) >> F; b[k >> 1] = g + (e[q >> 1] | 0); g = (Z(b[d + -2 >> 1] | 0, j) | 0) >> F; b[k + -2 >> 1] = g + (e[q + -2 >> 1] | 0); r = r + -1 << 16 >> 16; if (!(r << 16 >> 16)) break; else { q = q + -4 | 0; d = d + -4 | 0; k = k + -4 | 0; } } g = (Z(b[h >> 1] | 0, j) | 0) >> F; b[C >> 1] = g + (e[D >> 1] | 0); b[u >> 1] = j >> J; } t = t + 1 << 16 >> 16; if (t << 16 >> 16 > K << 16 >> 16) break; else j = t << 16 >> 16; } } while (0); t = Q << 16 >> 16; d = L + 1 & 65535; if (d << 16 >> 16 > R << 16 >> 16) h = Q; else { s = Q; k = b[O + (t - M << 1) >> 1] | 0; while (1) { r = b[O + ((d << 16 >> 16) - M << 1) >> 1] | 0; q = r << 16 >> 16 < k << 16 >> 16; s = q ? s : d; d = d + 1 << 16 >> 16; if (d << 16 >> 16 > R << 16 >> 16) { h = s; break } else k = q ? k : r; } } c:do if (!(S << 16 >> 16 == 0 ? h << 16 >> 16 > N << 16 >> 16 : 0)) { if (!(c >>> 0 < 4 & S << 16 >> 16 != 0)) { s = O + ((h << 16 >> 16) - M << 1) | 0; r = Fc(s, p, T, o) | 0; d = (p & 65535) + 1 & 65535; if (d << 16 >> 16 <= P << 16 >> 16) while (1) { q = Fc(s, d, T, o) | 0; k = q << 16 >> 16 > r << 16 >> 16; p = k ? d : p; d = d + 1 << 16 >> 16; if (d << 16 >> 16 > P << 16 >> 16) break; else r = k ? q : r; } if ((c + -7 | 0) >>> 0 < 2) { P = p << 16 >> 16 == -3; d = (P << 31 >> 31) + h << 16 >> 16; p = P ? 3 : p; break } switch (p << 16 >> 16) { case -2: { d = h + -1 << 16 >> 16; p = 1; break c } case 2: { d = h + 1 << 16 >> 16; p = -1; break c } default: { d = h; break c } } } N = b[a >> 1] | 0; N = ((N << 16 >> 16) - t | 0) > 5 ? t + 5 & 65535 : N; k = R << 16 >> 16; N = (k - (N << 16 >> 16) | 0) > 4 ? k + 65532 & 65535 : N; k = h << 16 >> 16; d = N << 16 >> 16; if ((k | 0) == (d + -1 | 0) ? 1 : h << 16 >> 16 == N << 16 >> 16) { s = O + (k - M << 1) | 0; k = Fc(s, p, T, o) | 0; d = (p & 65535) + 1 & 65535; if (d << 16 >> 16 <= P << 16 >> 16) while (1) { r = Fc(s, d, T, o) | 0; q = r << 16 >> 16 > k << 16 >> 16; p = q ? d : p; d = d + 1 << 16 >> 16; if (d << 16 >> 16 > P << 16 >> 16) break; else k = q ? r : k; } if ((c + -7 | 0) >>> 0 < 2) { P = p << 16 >> 16 == -3; d = (P << 31 >> 31) + h << 16 >> 16; p = P ? 3 : p; break } switch (p << 16 >> 16) { case -2: { d = h + -1 << 16 >> 16; p = 1; break c } case 2: { d = h + 1 << 16 >> 16; p = -1; break c } default: { d = h; break c } } } if ((k | 0) == (d + -2 | 0)) { d = O + (k - M << 1) | 0; k = Fc(d, 0, T, o) | 0; if ((c | 0) != 8) { p = 0; s = 1; while (1) { r = Fc(d, s, T, o) | 0; q = r << 16 >> 16 > k << 16 >> 16; p = q ? s : p; s = s + 1 << 16 >> 16; if (s << 16 >> 16 > P << 16 >> 16) break; else k = q ? r : k; } if ((c + -7 | 0) >>> 0 >= 2) switch (p << 16 >> 16) { case -2: { d = h + -1 << 16 >> 16; p = 1; break c } case 2: { d = h + 1 << 16 >> 16; p = -1; break c } default: { d = h; break c } } } else p = 0; P = p << 16 >> 16 == -3; d = (P << 31 >> 31) + h << 16 >> 16; p = P ? 3 : p; break } if ((k | 0) == (d + 1 | 0)) { s = O + (k - M << 1) | 0; d = Fc(s, p, T, o) | 0; k = (p & 65535) + 1 & 65535; if (k << 16 >> 16 <= 0) while (1) { q = Fc(s, k, T, o) | 0; r = q << 16 >> 16 > d << 16 >> 16; p = r ? k : p; k = k + 1 << 16 >> 16; if (k << 16 >> 16 > 0) break; else d = r ? q : d; } if ((c + -7 | 0) >>> 0 < 2) { P = p << 16 >> 16 == -3; d = (P << 31 >> 31) + h << 16 >> 16; p = P ? 3 : p; break } switch (p << 16 >> 16) { case -2: { d = h + -1 << 16 >> 16; p = 1; break c } case 2: { d = h + 1 << 16 >> 16; p = -1; break c } default: { d = h; break c } } } else { d = h; p = 0; } } else { d = h; p = 0; } while (0); if ((c + -7 | 0) >>> 0 > 1) { P = a; a = pc(d, p, b[a >> 1] | 0, Q, R, S, c >>> 0 < 4 & 1, o) | 0; b[n >> 1] = a; b[P >> 1] = d; b[m >> 1] = T; b[l >> 1] = p; i = U; return d | 0 } else { o = qc(d, p, Q, S, o) | 0; b[n >> 1] = o; b[a >> 1] = d; b[m >> 1] = T; b[l >> 1] = p; i = U; return d | 0 } return 0 } function Yc(a, d, e, f, g, h, j, k, l) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; var m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0; D = i; i = i + 1200 | 0; B = D + 1188 | 0; A = D + 580 | 0; C = D + 578 | 0; z = D + 576 | 0; v = D; x = D + 582 | 0; y = (k | 0) != 0; do if (y) if (d >>> 0 < 2) { Ld(a, 1, l); break } else { Ld(a, 0, l); break } while (0); w = g << 16 >> 16; o = 0 - w | 0; n = e + (o << 1) | 0; o = o & 65535; s = h << 16 >> 16; do if (o << 16 >> 16 < h << 16 >> 16) { r = o; q = n; o = 0; while (1) { t = b[q >> 1] | 0; o = (Z(t << 1, t) | 0) + o | 0; if ((o | 0) < 0) break; r = r + 1 << 16 >> 16; if (r << 16 >> 16 >= h << 16 >> 16) { u = 14; break } else q = q + 2 | 0; } if ((u | 0) == 14) { if ((o | 0) < 1048576) { u = 15; break } Oe(x | 0, n | 0, s + w << 1 | 0) | 0; t = 0; break } m = s + w | 0; p = m >>> 1; r = p & 65535; if (!(r << 16 >> 16)) o = x; else { t = ((p << 1) + 131070 & 131070) + 2 | 0; s = t - w | 0; q = x; while (1) { b[q >> 1] = (b[n >> 1] | 0) >>> 3; b[q + 2 >> 1] = (b[n + 2 >> 1] | 0) >>> 3; r = r + -1 << 16 >> 16; if (!(r << 16 >> 16)) break; else { n = n + 4 | 0; q = q + 4 | 0; } } n = e + (s << 1) | 0; o = x + (t << 1) | 0; } if (!(m & 1)) t = 3; else { b[o >> 1] = (b[n >> 1] | 0) >>> 3; t = 3; } } else u = 15; while (0); if ((u | 0) == 15) { t = s + w | 0; o = t >>> 1; p = o & 65535; if (!(p << 16 >> 16)) o = x; else { s = ((o << 1) + 131070 & 131070) + 2 | 0; q = s - w | 0; r = x; while (1) { b[r >> 1] = b[n >> 1] << 3; b[r + 2 >> 1] = b[n + 2 >> 1] << 3; p = p + -1 << 16 >> 16; if (!(p << 16 >> 16)) break; else { n = n + 4 | 0; r = r + 4 | 0; } } n = e + (q << 1) | 0; o = x + (s << 1) | 0; } if (!(t & 1)) t = -3; else { b[o >> 1] = b[n >> 1] << 3; t = -3; } } s = v + (w << 2) | 0; q = x + (w << 1) | 0; Tb(q, h, g, f, s); m = (d | 0) == 7 & 1; o = f << 16 >> 16; n = o << 2; if ((n | 0) != (o << 18 >> 16 | 0)) { c[l >> 2] = 1; n = f << 16 >> 16 > 0 ? 32767 : -32768; } r = Zc(a, s, q, t, m, h, g, n & 65535, B, k, l) | 0; o = o << 1; p = Zc(a, s, q, t, m, h, n + 65535 & 65535, o & 65535, A, k, l) | 0; o = Zc(a, s, q, t, m, h, o + 65535 & 65535, f, C, k, l) | 0; if (j << 16 >> 16 == 1 & y) { Ec(s, q, h, g, f, z, l) | 0; Jd(a, b[z >> 1] | 0); } n = b[B >> 1] | 0; m = b[A >> 1] | 0; if (((n << 16 >> 16) * 55706 >> 16 | 0) >= (m << 16 >> 16 | 0)) { A = n; B = r; A = A << 16 >> 16; A = A * 55706 | 0; A = A >> 16; C = b[C >> 1] | 0; C = C << 16 >> 16; C = (A | 0) < (C | 0); C = C ? o : B; i = D; return C | 0 } b[B >> 1] = m; A = m; B = p; A = A << 16 >> 16; A = A * 55706 | 0; A = A >> 16; C = b[C >> 1] | 0; C = C << 16 >> 16; C = (A | 0) < (C | 0); C = C ? o : B; i = D; return C | 0 } function Zc(a, d, e, f, g, h, i, j, k, l, m) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; var n = 0, o = 0, p = 0, q = 0, r = 0; if (i << 16 >> 16 < j << 16 >> 16) { j = -2147483648; p = i; } else { p = i; n = -2147483648; o = d + (0 - (i << 16 >> 16) << 2) | 0; d = i; while (1) { i = c[o >> 2] | 0; r = (i | 0) < (n | 0); d = r ? d : p; n = r ? n : i; p = p + -1 << 16 >> 16; if (p << 16 >> 16 < j << 16 >> 16) { j = n; p = d; break } else o = o + 4 | 0; } } d = h << 16 >> 16 >>> 2 & 65535; if (!(d << 16 >> 16)) d = 0; else { n = d; i = e + (0 - (p << 16 >> 16) << 1) | 0; d = 0; while (1) { r = b[i >> 1] | 0; r = (Z(r, r) | 0) + d | 0; d = b[i + 2 >> 1] | 0; d = r + (Z(d, d) | 0) | 0; r = b[i + 4 >> 1] | 0; r = d + (Z(r, r) | 0) | 0; d = b[i + 6 >> 1] | 0; d = r + (Z(d, d) | 0) | 0; n = n + -1 << 16 >> 16; if (!(n << 16 >> 16)) break; else i = i + 8 | 0; } d = d << 1; } if (l) Kd(a, j, d, m); d = ce(d, m) | 0; i = g << 16 >> 16 != 0; if (i) d = (d | 0) > 1073741823 ? 2147483647 : d << 1; g = j >> 16; a = d >> 16; m = Z(a, g) | 0; m = (m | 0) == 1073741824 ? 2147483647 : m << 1; d = (Z((d >>> 1) - (a << 15) << 16 >> 16, g) | 0) >> 15; r = (d << 1) + m | 0; r = (d ^ m | 0) > 0 & (r ^ m | 0) < 0 ? (m >>> 31) + 2147483647 | 0 : r; g = (Z(a, (j >>> 1) - (g << 15) << 16 >> 16) | 0) >> 15; d = r + (g << 1) | 0; d = (r ^ g | 0) > 0 & (d ^ r | 0) < 0 ? (r >>> 31) + 2147483647 | 0 : d; if (!i) { b[k >> 1] = d; return p | 0 } i = f << 16 >> 16; if (f << 16 >> 16 > 0) if (f << 16 >> 16 < 31) { i = d >> i; q = 16; } else i = 0; else { q = 0 - i << 16 >> 16; i = d << q; i = (i >> q | 0) == (d | 0) ? i : d >> 31 ^ 2147483647; q = 16; } if ((q | 0) == 16) { if ((i | 0) > 65535) { b[k >> 1] = 32767; return p | 0 } if ((i | 0) < -65536) { b[k >> 1] = -32768; return p | 0 } } b[k >> 1] = i >>> 1; return p | 0 } function _c(a) { a = a | 0; var d = 0; if (!a) { a = -1; return a | 0 } c[a >> 2] = 0; d = Je(6) | 0; if (!d) { a = -1; return a | 0 } b[d >> 1] = 40; b[d + 2 >> 1] = 0; b[d + 4 >> 1] = 0; c[a >> 2] = d; a = 0; return a | 0 } function $c(a) { a = a | 0; if (!a) { a = -1; return a | 0 } b[a >> 1] = 40; b[a + 2 >> 1] = 0; b[a + 4 >> 1] = 0; a = 0; return a | 0 } function ad(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function bd(a, d, e, f, g, h, j, k, l, m, n) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; var o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0; F = i; i = i + 1200 | 0; w = F + 1186 | 0; x = F + 1184 | 0; E = F + 1182 | 0; v = F; z = F + 576 | 0; y = g << 16 >> 16; D = z + (y << 1) | 0; o = (0 - y & 65535) << 16 >> 16 < h << 16 >> 16; if (o) { s = 0 - g << 16 >> 16 << 16 >> 16; p = 0; do { r = b[e + (s << 1) >> 1] | 0; r = Z(r, r) | 0; if ((r | 0) != 1073741824) { q = (r << 1) + p | 0; if ((r ^ p | 0) > 0 & (q ^ p | 0) < 0) { c[n >> 2] = 1; p = (p >>> 31) + 2147483647 | 0; } else p = q; } else { c[n >> 2] = 1; p = 2147483647; } s = s + 1 | 0; } while ((s & 65535) << 16 >> 16 != h << 16 >> 16) } else p = 0; if ((2147483646 - p & p | 0) >= 0) if ((p | 0) == 2147483647) { if (o) { p = 0 - g << 16 >> 16 << 16 >> 16; do { b[z + (p + y << 1) >> 1] = De(b[e + (p << 1) >> 1] | 0, 3, n) | 0; p = p + 1 | 0; } while ((p & 65535) << 16 >> 16 != h << 16 >> 16) } } else t = 14; else { c[n >> 2] = 1; t = 14; } do if ((t | 0) == 14) { if ((1048575 - p & p | 0) < 0) { c[n >> 2] = 1; p = (p >>> 31) + 2147483647 | 0; } else p = p + -1048576 | 0; if ((p | 0) >= 0) { if (!o) break; C = 0 - g << 16 >> 16 << 16 >> 16; Oe(z + (y + C << 1) | 0, e + (C << 1) | 0, (((h + g << 16 >> 16) + -1 & 65535) << 1) + 2 | 0) | 0; break } if (o) { p = 0 - g << 16 >> 16 << 16 >> 16; do { C = b[e + (p << 1) >> 1] | 0; b[z + (p + y << 1) >> 1] = (C << 19 >> 19 | 0) == (C | 0) ? C << 3 : C >>> 15 ^ 32767; p = p + 1 | 0; } while ((p & 65535) << 16 >> 16 != h << 16 >> 16) } } while (0); B = v + (y << 2) | 0; Tb(D, h, g, f, B); s = b[a >> 1] | 0; C = a + 4 | 0; A = k + (l << 16 >> 16 << 1) | 0; a:do if (g << 16 >> 16 < f << 16 >> 16) u = g; else { if ((b[C >> 1] | 0) <= 0) { e = g; k = -2147483648; r = g; t = 3402; while (1) { Nc(c[v + (y - (e << 16 >> 16) << 2) >> 2] | 0, w, x, n); q = b[x >> 1] | 0; p = b[t >> 1] | 0; s = Z(p, b[w >> 1] | 0) | 0; if ((s | 0) == 1073741824) { c[n >> 2] = 1; o = 2147483647; } else o = s << 1; u = (Z(p, q << 16 >> 16) | 0) >> 15; s = o + (u << 1) | 0; if ((o ^ u | 0) > 0 & (s ^ o | 0) < 0) { c[n >> 2] = 1; s = (o >>> 31) + 2147483647 | 0; } q = (s | 0) < (k | 0); r = q ? r : e; e = e + -1 << 16 >> 16; if (e << 16 >> 16 < f << 16 >> 16) { u = r; break a } else { k = q ? k : s; t = t + -2 | 0; } } } k = g; o = -2147483648; r = g; u = 2902 + (y + 123 - (s << 16 >> 16) << 1) | 0; e = 3402; while (1) { Nc(c[v + (y - (k << 16 >> 16) << 2) >> 2] | 0, w, x, n); t = b[x >> 1] | 0; q = b[e >> 1] | 0; s = Z(q, b[w >> 1] | 0) | 0; if ((s | 0) == 1073741824) { c[n >> 2] = 1; p = 2147483647; } else p = s << 1; t = (Z(q, t << 16 >> 16) | 0) >> 15; s = p + (t << 1) | 0; if ((p ^ t | 0) > 0 & (s ^ p | 0) < 0) { c[n >> 2] = 1; s = (p >>> 31) + 2147483647 | 0; } Nc(s, w, x, n); t = b[x >> 1] | 0; q = b[u >> 1] | 0; s = Z(q, b[w >> 1] | 0) | 0; if ((s | 0) == 1073741824) { c[n >> 2] = 1; p = 2147483647; } else p = s << 1; t = (Z(q, t << 16 >> 16) | 0) >> 15; s = p + (t << 1) | 0; if ((p ^ t | 0) > 0 & (s ^ p | 0) < 0) { c[n >> 2] = 1; s = (p >>> 31) + 2147483647 | 0; } q = (s | 0) < (o | 0); r = q ? r : k; k = k + -1 << 16 >> 16; if (k << 16 >> 16 < f << 16 >> 16) { u = r; break } else { o = q ? o : s; u = u + -2 | 0; e = e + -2 | 0; } } } while (0); if (h << 16 >> 16 > 0) { k = 0; e = D; t = z + (y - (u << 16 >> 16) << 1) | 0; r = 0; p = 0; while (1) { s = b[t >> 1] | 0; q = Z(s, b[e >> 1] | 0) | 0; if ((q | 0) != 1073741824) { o = (q << 1) + r | 0; if ((q ^ r | 0) > 0 & (o ^ r | 0) < 0) { c[n >> 2] = 1; r = (r >>> 31) + 2147483647 | 0; } else r = o; } else { c[n >> 2] = 1; r = 2147483647; } o = Z(s, s) | 0; if ((o | 0) != 1073741824) { q = (o << 1) + p | 0; if ((o ^ p | 0) > 0 & (q ^ p | 0) < 0) { c[n >> 2] = 1; p = (p >>> 31) + 2147483647 | 0; } else p = q; } else { c[n >> 2] = 1; p = 2147483647; } k = k + 1 << 16 >> 16; if (k << 16 >> 16 >= h << 16 >> 16) break; else { e = e + 2 | 0; t = t + 2 | 0; } } } else { r = 0; p = 0; } q = (m | 0) == 0; if (!q) { Ld(d, 0, n); Kd(d, r, p, n); } o = (Ce(p, n) | 0) << 16 >> 16; if ((o * 13107 | 0) == 1073741824) { c[n >> 2] = 1; p = 2147483647; } else p = o * 26214 | 0; o = r - p | 0; if (((o ^ r) & (p ^ r) | 0) < 0) { c[n >> 2] = 1; o = (r >>> 31) + 2147483647 | 0; } m = Ce(o, n) | 0; b[A >> 1] = m; if (m << 16 >> 16 > 0) { o = j + 6 | 0; b[j + 8 >> 1] = b[o >> 1] | 0; m = j + 4 | 0; b[o >> 1] = b[m >> 1] | 0; o = j + 2 | 0; b[m >> 1] = b[o >> 1] | 0; b[o >> 1] = b[j >> 1] | 0; b[j >> 1] = u; b[a >> 1] = Zd(j, 5) | 0; b[a + 2 >> 1] = 32767; o = 32767; } else { b[a >> 1] = u; a = a + 2 | 0; o = ((b[a >> 1] | 0) * 29491 | 0) >>> 15 & 65535; b[a >> 1] = o; } b[C >> 1] = ((Ge(o, 9830, n) | 0) & 65535) >>> 15 ^ 1; if (q) { i = F; return u | 0 } if ((Ge(l, 1, n) | 0) << 16 >> 16) { i = F; return u | 0 } Ec(B, D, h, g, f, E, n) | 0; Jd(d, b[E >> 1] | 0); i = F; return u | 0 } function cd(a, b, c, d, e, f, g, h, j, k) { a = a | 0; b = b | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; var l = 0, m = 0; k = i; i = i + 48 | 0; m = k + 22 | 0; l = k; b = a >>> 0 < 6 ? b : c; c = f << 16 >> 16 > 0 ? 22 : 0; a = e + (c << 1) | 0; Ie(a, b, m); Ie(a, d, l); a = f << 16 >> 16; f = j + (a << 1) | 0; Be(m, g + (a << 1) | 0, f, 40); He(l, f, f, 40, h, 1); c = e + (((c << 16) + 720896 | 0) >>> 16 << 1) | 0; Ie(c, b, m); Ie(c, d, l); a = (a << 16) + 2621440 >> 16; j = j + (a << 1) | 0; Be(m, g + (a << 1) | 0, j, 40); He(l, j, j, 40, h, 1); i = k; return } function dd(a) { a = a | 0; var d = 0; if (!a) { a = -1; return a | 0 } c[a >> 2] = 0; d = Je(12) | 0; if (!d) { a = -1; return a | 0 } ;b[d >> 1] = 0; b[d + 2 >> 1] = 0; b[d + 4 >> 1] = 0; b[d + 6 >> 1] = 0; b[d + 8 >> 1] = 0; b[d + 10 >> 1] = 0; c[a >> 2] = d; a = 0; return a | 0 } function ed(a) { a = a | 0; if (!a) { a = -1; return a | 0 } ;b[a >> 1] = 0; b[a + 2 >> 1] = 0; b[a + 4 >> 1] = 0; b[a + 6 >> 1] = 0; b[a + 8 >> 1] = 0; b[a + 10 >> 1] = 0; a = 0; return a | 0 } function fd(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function gd(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var e = 0, f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0; m = a + 10 | 0; f = b[m >> 1] | 0; n = a + 8 | 0; e = b[n >> 1] | 0; if (!(d << 16 >> 16)) { a = e; l = f; b[m >> 1] = l; b[n >> 1] = a; return } i = a + 4 | 0; j = a + 6 | 0; k = a + 2 | 0; h = b[j >> 1] | 0; l = b[i >> 1] | 0; g = d; d = f; while (1) { o = (Z(b[a >> 1] | 0, -3733) | 0) + (((l << 16 >> 16) * 7807 | 0) + ((h << 16 >> 16) * 7807 >> 15)) | 0; b[a >> 1] = l; o = o + ((Z(b[k >> 1] | 0, -3733) | 0) >> 15) | 0; b[k >> 1] = h; o = ((d << 16 >> 16) * 1899 | 0) + o + (Z(e << 16 >> 16, -3798) | 0) | 0; d = b[c >> 1] | 0; o = o + ((d << 16 >> 16) * 1899 | 0) | 0; b[c >> 1] = (o + 2048 | 0) >>> 12; f = o >>> 12; l = f & 65535; b[i >> 1] = l; h = (o << 3) - (f << 15) & 65535; b[j >> 1] = h; g = g + -1 << 16 >> 16; if (!(g << 16 >> 16)) break; else { o = e; c = c + 2 | 0; e = d; d = o; } } b[m >> 1] = e; b[n >> 1] = d; return } function hd(a, d, e, f) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; var g = 0, h = 0, i = 0, j = 0; g = b[(c[f + 88 >> 2] | 0) + (a << 1) >> 1] | 0; if (!(g << 16 >> 16)) return; j = e; i = c[(c[f + 92 >> 2] | 0) + (a << 2) >> 2] | 0; while (1) { e = b[i >> 1] | 0; if (!(e << 16 >> 16)) e = 0; else { a = b[d >> 1] | 0; h = e; f = j + ((e << 16 >> 16) + -1 << 1) | 0; while (1) { e = a << 16 >> 16; b[f >> 1] = e & 1; h = h + -1 << 16 >> 16; if (!(h << 16 >> 16)) break; else { a = e >>> 1 & 65535; f = f + -2 | 0; } } e = b[i >> 1] | 0; } d = d + 2 | 0; g = g + -1 << 16 >> 16; if (!(g << 16 >> 16)) break; else { j = j + (e << 16 >> 16 << 1) | 0; i = i + 2 | 0; } } return } function id(a, d, f, g, h, j) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; var k = 0, l = 0, m = 0, n = 0, o = 0; o = i; i = i + 16 | 0; m = o + 2 | 0; n = o; k = h << 16 >> 16; if (h << 16 >> 16 < 1) { j = -5443; n = -32768; Wd(a, n, j); i = o; return } l = re(14, f, j) | 0; if ((k | 0) < (l << 16 >> 16 | 0)) f = g; else { f = (g & 65535) + 1 & 65535; h = k >>> 1 & 65535; } g = Td(h, l & 65535) | 0; b[n >> 1] = g; de(g << 16 >> 16, m, n, j); b[m >> 1] = ((((f & 65535) - (d & 65535) << 16) + -65536 | 0) >>> 16) + (e[m >> 1] | 0); g = Ee(b[n >> 1] | 0, 5, j) | 0; k = b[m >> 1] | 0; g = ((k & 65535) << 10) + (g & 65535) & 65535; if (g << 16 >> 16 > 18284) { j = 3037; n = 18284; Wd(a, n, j); i = o; return } h = b[n >> 1] | 0; k = k << 16 >> 16; if ((k * 24660 | 0) == 1073741824) { c[j >> 2] = 1; f = 2147483647; } else f = k * 49320 | 0; n = (h << 16 >> 16) * 24660 >> 15; k = f + (n << 1) | 0; if ((f ^ n | 0) > 0 & (k ^ f | 0) < 0) { c[j >> 2] = 1; k = (f >>> 31) + 2147483647 | 0; } n = k << 13; j = Ce((n >> 13 | 0) == (k | 0) ? n : k >> 31 ^ 2147483647, j) | 0; n = g; Wd(a, n, j); i = o; return } function jd(a, d, f, g, h, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; p = p | 0; q = q | 0; r = r | 0; s = s | 0; t = t | 0; u = u | 0; v = v | 0; w = w | 0; x = x | 0; var y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0, O = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0, V = 0, W = 0, X = 0, Y = 0, _ = 0, $ = 0, aa = 0, ba = 0, ca = 0, da = 0, ea = 0, fa = 0, ga = 0, ha = 0; ha = i; i = i + 80 | 0; da = ha + 66 | 0; ea = ha + 64 | 0; fa = ha + 62 | 0; ga = ha + 60 | 0; O = ha + 40 | 0; P = ha + 20 | 0; M = ha; b[da >> 1] = d; b[ea >> 1] = m; b[fa >> 1] = n; L = re(14, f, x) | 0; ca = L & 65535; b[ga >> 1] = ca; N = re(14, n, x) | 0; K = (e[g >> 1] | 0) + 65523 | 0; b[M >> 1] = K; E = (e[g + 2 >> 1] | 0) + 65522 | 0; F = M + 2 | 0; b[F >> 1] = E; G = ((d & 65535) << 16) + -720896 | 0; B = G >> 16; G = (G >>> 15) + 15 + (e[g + 4 >> 1] | 0) | 0; H = M + 4 | 0; b[H >> 1] = G; I = (e[g + 6 >> 1] | 0) + B | 0; J = M + 6 | 0; b[J >> 1] = I; B = B + 1 + (e[g + 8 >> 1] | 0) | 0; C = M + 8 | 0; b[C >> 1] = B; y = (e[o >> 1] | 0) + 65523 & 65535; b[M + 10 >> 1] = y; D = (e[o + 2 >> 1] | 0) + 65522 & 65535; b[M + 12 >> 1] = D; z = ((m & 65535) << 16) + -720896 | 0; g = z >> 16; z = (z >>> 15) + 15 + (e[o + 4 >> 1] | 0) & 65535; b[M + 14 >> 1] = z; A = (e[o + 6 >> 1] | 0) + g & 65535; b[M + 16 >> 1] = A; g = g + 1 + (e[o + 8 >> 1] | 0) & 65535; b[M + 18 >> 1] = g; aa = (j & 65535) - (q & 65535) << 16; m = aa >> 16; if ((aa | 0) > 0) { n = k; f = r << 16 >> 16 >> m & 65535; } else { n = k << 16 >> 16 >> 0 - m & 65535; f = r; } if ((Ee(f, 1, x) | 0) << 16 >> 16 > n << 16 >> 16) f = 1; else f = (((n << 16 >> 16) + 3 >> 2 | 0) > (f << 16 >> 16 | 0)) << 31 >> 31; o = K + f & 65535; b[M >> 1] = o; aa = E + f & 65535; b[F >> 1] = aa; $ = G + f & 65535; b[H >> 1] = $; _ = I + f & 65535; b[J >> 1] = _; Y = B + f & 65535; b[C >> 1] = Y; m = g << 16 >> 16 > o << 16 >> 16 ? g : o; m = A << 16 >> 16 > m << 16 >> 16 ? A : m; m = z << 16 >> 16 > m << 16 >> 16 ? z : m; m = D << 16 >> 16 > m << 16 >> 16 ? D : m; m = y << 16 >> 16 > m << 16 >> 16 ? y : m; m = Y << 16 >> 16 > m << 16 >> 16 ? Y : m; m = _ << 16 >> 16 > m << 16 >> 16 ? _ : m; m = $ << 16 >> 16 > m << 16 >> 16 ? $ : m; m = (aa << 16 >> 16 > m << 16 >> 16 ? aa : m) + 1 & 65535; g = 0; while (1) { f = m - (o & 65535) | 0; o = f & 65535; n = e[h >> 1] << 16; f = f << 16 >> 16; if (o << 16 >> 16 > 0) o = o << 16 >> 16 < 31 ? n >> f : 0; else { aa = 0 - f << 16 >> 16; o = n << aa; o = (o >> aa | 0) == (n | 0) ? o : n >> 31 ^ 2147483647; } aa = o >> 16; b[O + (g << 1) >> 1] = aa; b[P + (g << 1) >> 1] = (o >>> 1) - (aa << 15); g = g + 1 | 0; if ((g | 0) == 5) { f = 5; n = p; break } o = b[M + (g << 1) >> 1] | 0; h = h + 2 | 0; } while (1) { g = m - (y & 65535) | 0; y = g & 65535; o = e[n >> 1] << 16; g = g << 16 >> 16; if (y << 16 >> 16 > 0) o = y << 16 >> 16 < 31 ? o >> g : 0; else { $ = 0 - g << 16 >> 16; aa = o << $; o = (aa >> $ | 0) == (o | 0) ? aa : o >> 31 ^ 2147483647; } aa = o >> 16; b[O + (f << 1) >> 1] = aa; b[P + (f << 1) >> 1] = (o >>> 1) - (aa << 15); o = f + 1 | 0; if ((o & 65535) << 16 >> 16 == 10) break; y = b[M + (o << 1) >> 1] | 0; f = o; n = n + 2 | 0; } Q = L << 16 >> 16; R = b[O >> 1] | 0; S = b[P >> 1] | 0; T = b[O + 2 >> 1] | 0; U = b[P + 2 >> 1] | 0; V = b[O + 4 >> 1] | 0; W = b[P + 4 >> 1] | 0; X = b[O + 6 >> 1] | 0; Y = b[P + 6 >> 1] | 0; _ = b[O + 8 >> 1] | 0; $ = b[P + 8 >> 1] | 0; aa = s & 65535; q = N << 16 >> 16; j = b[O + 10 >> 1] | 0; A = b[P + 10 >> 1] | 0; z = b[O + 12 >> 1] | 0; h = b[P + 12 >> 1] | 0; f = b[O + 14 >> 1] | 0; n = b[P + 14 >> 1] | 0; g = b[O + 16 >> 1] | 0; y = b[P + 16 >> 1] | 0; B = b[O + 18 >> 1] | 0; P = b[P + 18 >> 1] | 0; m = 2147483647; O = 0; o = 0; C = 782; do { M = b[C >> 1] | 0; I = (Z(Q, b[C + 2 >> 1] | 0) | 0) >>> 15 << 16; p = I >> 16; G = M << 1; K = (Z(G, M) | 0) >> 16; r = Z(K, R) | 0; if ((r | 0) == 1073741824) { c[x >> 2] = 1; J = 2147483647; } else J = r << 1; N = (Z(S, K) | 0) >> 15; r = J + (N << 1) | 0; if ((J ^ N | 0) > 0 & (r ^ J | 0) < 0) { c[x >> 2] = 1; r = (J >>> 31) + 2147483647 | 0; } K = Z(T, M) | 0; if ((K | 0) == 1073741824) { c[x >> 2] = 1; J = 2147483647; } else J = K << 1; N = (Z(U, M) | 0) >> 15; K = J + (N << 1) | 0; if ((J ^ N | 0) > 0 & (K ^ J | 0) < 0) { c[x >> 2] = 1; K = (J >>> 31) + 2147483647 | 0; } I = (Z(I >> 15, p) | 0) >> 16; J = Z(V, I) | 0; if ((J | 0) == 1073741824) { c[x >> 2] = 1; H = 2147483647; } else H = J << 1; N = (Z(W, I) | 0) >> 15; J = H + (N << 1) | 0; if ((H ^ N | 0) > 0 & (J ^ H | 0) < 0) { c[x >> 2] = 1; J = (H >>> 31) + 2147483647 | 0; } I = Z(X, p) | 0; if ((I | 0) == 1073741824) { c[x >> 2] = 1; H = 2147483647; } else H = I << 1; N = (Z(Y, p) | 0) >> 15; I = H + (N << 1) | 0; if ((H ^ N | 0) > 0 & (I ^ H | 0) < 0) { c[x >> 2] = 1; N = (H >>> 31) + 2147483647 | 0; } else N = I; H = (Z(G, p) | 0) >> 16; I = Z(_, H) | 0; if ((I | 0) == 1073741824) { c[x >> 2] = 1; G = 2147483647; } else G = I << 1; L = (Z($, H) | 0) >> 15; I = G + (L << 1) | 0; if ((G ^ L | 0) > 0 & (I ^ G | 0) < 0) { c[x >> 2] = 1; I = (G >>> 31) + 2147483647 | 0; } H = b[C + 4 >> 1] | 0; G = b[C + 6 >> 1] | 0; C = C + 8 | 0; if ((M - aa & 65535) << 16 >> 16 < 1 ? (ba = H << 16 >> 16, H << 16 >> 16 <= s << 16 >> 16) : 0) { E = (Z(G << 16 >> 16, q) | 0) >>> 15 << 16; M = E >> 16; D = ba << 1; G = (Z(D, ba) | 0) >> 16; H = Z(j, G) | 0; if ((H | 0) == 1073741824) { c[x >> 2] = 1; F = 2147483647; } else F = H << 1; L = (Z(A, G) | 0) >> 15; H = F + (L << 1) | 0; if ((F ^ L | 0) > 0 & (H ^ F | 0) < 0) { c[x >> 2] = 1; H = (F >>> 31) + 2147483647 | 0; } G = Z(z, ba) | 0; if ((G | 0) == 1073741824) { c[x >> 2] = 1; F = 2147483647; } else F = G << 1; L = (Z(h, ba) | 0) >> 15; G = F + (L << 1) | 0; if ((F ^ L | 0) > 0 & (G ^ F | 0) < 0) { c[x >> 2] = 1; L = (F >>> 31) + 2147483647 | 0; } else L = G; F = (Z(E >> 15, M) | 0) >> 16; G = Z(f, F) | 0; if ((G | 0) == 1073741824) { c[x >> 2] = 1; E = 2147483647; } else E = G << 1; p = (Z(n, F) | 0) >> 15; G = E + (p << 1) | 0; if ((E ^ p | 0) > 0 & (G ^ E | 0) < 0) { c[x >> 2] = 1; p = (E >>> 31) + 2147483647 | 0; } else p = G; G = Z(g, M) | 0; if ((G | 0) == 1073741824) { c[x >> 2] = 1; F = 2147483647; } else F = G << 1; E = (Z(y, M) | 0) >> 15; G = F + (E << 1) | 0; if ((F ^ E | 0) > 0 & (G ^ F | 0) < 0) { c[x >> 2] = 1; k = (F >>> 31) + 2147483647 | 0; } else k = G; F = (Z(D, M) | 0) >> 16; G = Z(B, F) | 0; if ((G | 0) == 1073741824) { c[x >> 2] = 1; E = 2147483647; } else E = G << 1; M = (Z(P, F) | 0) >> 15; G = E + (M << 1) | 0; if ((E ^ M | 0) > 0 & (G ^ E | 0) < 0) { c[x >> 2] = 1; G = (E >>> 31) + 2147483647 | 0; } M = K + r + J + N + I + H + L + p + k + G | 0; N = (M | 0) < (m | 0); m = N ? M : m; o = N ? O : o; } O = O + 1 << 16 >> 16; } while (O << 16 >> 16 < 256); s = (o & 65535) << 18 >> 16; kd(a, 782 + (s << 1) | 0, ca, d, t, u, x); Vd(a, 0, l, ea, fa, da, ga, x); l = (re(14, b[fa >> 1] | 0, x) | 0) & 65535; kd(a, 782 + ((s | 2) << 1) | 0, l, b[ea >> 1] | 0, v, w, x); i = ha; return o | 0 } function kd(a, d, f, g, h, j, k) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; var l = 0, m = 0, n = 0, o = 0; o = i; i = i + 16 | 0; m = o + 2 | 0; n = o; b[h >> 1] = b[d >> 1] | 0; l = b[d + 2 >> 1] | 0; f = Z(f << 16 >> 16 << 1, l) | 0; h = 10 - (g & 65535) | 0; d = h & 65535; h = h << 16 >> 16; if (d << 16 >> 16 > 0) d = d << 16 >> 16 < 31 ? f >> h : 0; else { h = 0 - h << 16 >> 16; d = f << h; d = (d >> h | 0) == (f | 0) ? d : f >> 31 ^ 2147483647; } b[j >> 1] = d >>> 16; de(l, m, n, k); b[m >> 1] = (e[m >> 1] | 0) + 65524; h = Ee(b[n >> 1] | 0, 5, k) | 0; g = b[m >> 1] | 0; h = ((g & 65535) << 10) + (h & 65535) & 65535; f = b[n >> 1] | 0; g = g << 16 >> 16; if ((g * 24660 | 0) == 1073741824) { c[k >> 2] = 1; d = 2147483647; } else d = g * 49320 | 0; n = (f << 16 >> 16) * 24660 >> 15; g = d + (n << 1) | 0; if (!((d ^ n | 0) > 0 & (g ^ d | 0) < 0)) { k = g; k = k << 13; k = k + 32768 | 0; k = k >>> 16; k = k & 65535; Wd(a, h, k); i = o; return } c[k >> 2] = 1; k = (d >>> 31) + 2147483647 | 0; k = k << 13; k = k + 32768 | 0; k = k >>> 16; k = k & 65535; Wd(a, h, k); i = o; return } function ld(a, d, f, g, h, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; p = p | 0; q = q | 0; r = r | 0; s = s | 0; t = t | 0; u = u | 0; v = v | 0; w = w | 0; x = x | 0; y = y | 0; var z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0, O = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0, V = 0, W = 0, X = 0, Y = 0, _ = 0, $ = 0, aa = 0, ba = 0, ca = 0, da = 0, ea = 0, fa = 0, ga = 0, ha = 0, ia = 0, ja = 0, ka = 0, la = 0; la = i; i = i + 80 | 0; ia = la + 72 | 0; ja = la + 70 | 0; ka = la + 68 | 0; ga = la + 66 | 0; ha = la + 56 | 0; _ = la + 24 | 0; Y = la + 12 | 0; W = la + 48 | 0; X = la + 40 | 0; R = la + 34 | 0; T = la + 22 | 0; P = la + 6 | 0; Q = la; nd(5, r, s, P, Q, c[x + 72 >> 2] | 0, y) | 0; B = re(14, n, y) | 0; S = x + 68 | 0; O = c[S >> 2] | 0; V = m << 16 >> 16; U = V + 65526 | 0; r = (e[j >> 1] | 0) + 65523 & 65535; b[ha >> 1] = r; x = (e[j + 2 >> 1] | 0) + 65522 & 65535; b[ha + 2 >> 1] = x; da = U << 16 >> 16; ea = ((U << 17 >> 17 | 0) == (da | 0) ? U << 1 : da >>> 15 ^ 32767) + 15 + (e[j + 4 >> 1] | 0) & 65535; b[ha + 4 >> 1] = ea; fa = (e[j + 6 >> 1] | 0) + da & 65535; b[ha + 6 >> 1] = fa; j = da + 1 + (e[j + 8 >> 1] | 0) & 65535; b[ha + 8 >> 1] = j; x = x << 16 >> 16 > r << 16 >> 16 ? x : r; x = ea << 16 >> 16 > x << 16 >> 16 ? ea : x; x = fa << 16 >> 16 > x << 16 >> 16 ? fa : x; x = (Rd(j << 16 >> 16 > x << 16 >> 16 ? j : x, 1, y) | 0) & 65535; j = r; r = 0; while (1) { n = x - (j & 65535) | 0; j = n & 65535; A = e[h + (r << 1) >> 1] << 16; n = n << 16 >> 16; if (j << 16 >> 16 > 0) n = j << 16 >> 16 < 31 ? A >> n : 0; else { fa = 0 - n << 16 >> 16; n = A << fa; n = (n >> fa | 0) == (A | 0) ? n : A >> 31 ^ 2147483647; } Nc(n, _ + (r << 1) | 0, Y + (r << 1) | 0, y); n = r + 1 | 0; if ((n | 0) == 5) break; j = b[ha + (n << 1) >> 1] | 0; r = n; } M = _ + 2 | 0; N = Y + 2 | 0; fa = B << 16 >> 16; $ = _ + 4 | 0; aa = Y + 4 | 0; ba = _ + 6 | 0; ca = Y + 6 | 0; da = _ + 8 | 0; ea = Y + 8 | 0; E = 0; j = 2147483647; h = 0; n = 0; while (1) { L = b[P + (h << 1) >> 1] | 0; B = Z(L, L) | 0; if (B >>> 0 > 1073741823) { c[y >> 2] = 1; B = 32767; } else B = B >>> 15; x = b[Y >> 1] | 0; A = B << 16 >> 16; B = Z(A, b[_ >> 1] | 0) | 0; if ((B | 0) == 1073741824) { c[y >> 2] = 1; r = 2147483647; } else r = B << 1; K = (Z(x << 16 >> 16, A) | 0) >> 15; B = r + (K << 1) | 0; if ((r ^ K | 0) > 0 & (B ^ r | 0) < 0) { c[y >> 2] = 1; B = (r >>> 31) + 2147483647 | 0; } x = b[N >> 1] | 0; A = Z(b[M >> 1] | 0, L) | 0; if ((A | 0) != 1073741824) { r = (A << 1) + B | 0; if ((A ^ B | 0) > 0 & (r ^ B | 0) < 0) { c[y >> 2] = 1; r = (B >>> 31) + 2147483647 | 0; } } else { c[y >> 2] = 1; r = 2147483647; } B = (Z(x << 16 >> 16, L) | 0) >> 15; if ((B | 0) > 32767) { c[y >> 2] = 1; B = 32767; } K = B << 16; B = (K >> 15) + r | 0; if ((K >> 16 ^ r | 0) > 0 & (B ^ r | 0) < 0) { c[y >> 2] = 1; K = (r >>> 31) + 2147483647 | 0; } else K = B; I = (K >>> 31) + 2147483647 | 0; J = h & 65535; B = E; G = 0; H = O; do { A = (Z(b[H >> 1] | 0, fa) | 0) >> 15; H = H + 6 | 0; if ((A | 0) > 32767) { c[y >> 2] = 1; A = 32767; } F = A << 16 >> 16; A = Z(F, F) | 0; if ((A | 0) == 1073741824) { c[y >> 2] = 1; D = 2147483647; } else D = A << 1; Nc(D, ia, ja, y); A = Z(F, L) | 0; if ((A | 0) == 1073741824) { c[y >> 2] = 1; D = 2147483647; } else D = A << 1; Nc(D, ka, ga, y); r = b[aa >> 1] | 0; C = b[ja >> 1] | 0; A = b[$ >> 1] | 0; x = b[ia >> 1] | 0; E = Z(x, A) | 0; if ((E | 0) != 1073741824) { D = (E << 1) + K | 0; if ((E ^ K | 0) > 0 & (D ^ K | 0) < 0) { c[y >> 2] = 1; D = I; } } else { c[y >> 2] = 1; D = 2147483647; } E = (Z(C << 16 >> 16, A) | 0) >> 15; if ((E | 0) > 32767) { c[y >> 2] = 1; E = 32767; } C = E << 16; E = (C >> 15) + D | 0; if ((C >> 16 ^ D | 0) > 0 & (E ^ D | 0) < 0) { c[y >> 2] = 1; E = (D >>> 31) + 2147483647 | 0; } D = (Z(x, r << 16 >> 16) | 0) >> 15; if ((D | 0) > 32767) { c[y >> 2] = 1; D = 32767; } C = D << 16; D = (C >> 15) + E | 0; if ((C >> 16 ^ E | 0) > 0 & (D ^ E | 0) < 0) { c[y >> 2] = 1; D = (E >>> 31) + 2147483647 | 0; } A = b[ca >> 1] | 0; E = Z(b[ba >> 1] | 0, F) | 0; if ((E | 0) != 1073741824) { C = (E << 1) + D | 0; if ((E ^ D | 0) > 0 & (C ^ D | 0) < 0) { c[y >> 2] = 1; C = (D >>> 31) + 2147483647 | 0; } } else { c[y >> 2] = 1; C = 2147483647; } A = (Z(A << 16 >> 16, F) | 0) >> 15; if ((A | 0) > 32767) { c[y >> 2] = 1; A = 32767; } F = A << 16; A = (F >> 15) + C | 0; if ((F >> 16 ^ C | 0) > 0 & (A ^ C | 0) < 0) { c[y >> 2] = 1; A = (C >>> 31) + 2147483647 | 0; } x = b[ea >> 1] | 0; C = b[ga >> 1] | 0; r = b[da >> 1] | 0; z = b[ka >> 1] | 0; E = Z(z, r) | 0; do if ((E | 0) == 1073741824) { c[y >> 2] = 1; E = 2147483647; } else { D = (E << 1) + A | 0; if (!((E ^ A | 0) > 0 & (D ^ A | 0) < 0)) { E = D; break } c[y >> 2] = 1; E = (A >>> 31) + 2147483647 | 0; } while (0); D = (Z(C << 16 >> 16, r) | 0) >> 15; if ((D | 0) > 32767) { c[y >> 2] = 1; D = 32767; } F = D << 16; D = (F >> 15) + E | 0; if ((F >> 16 ^ E | 0) > 0 & (D ^ E | 0) < 0) { c[y >> 2] = 1; D = (E >>> 31) + 2147483647 | 0; } A = (Z(z, x << 16 >> 16) | 0) >> 15; if ((A | 0) > 32767) { c[y >> 2] = 1; A = 32767; } F = A << 16; A = (F >> 15) + D | 0; if ((F >> 16 ^ D | 0) > 0 & (A ^ D | 0) < 0) { c[y >> 2] = 1; A = (D >>> 31) + 2147483647 | 0; } F = (A | 0) < (j | 0); B = F ? G : B; n = F ? J : n; j = F ? A : j; G = G + 1 << 16 >> 16; } while (G << 16 >> 16 < 32); h = h + 1 | 0; if ((h | 0) == 3) { A = B; h = n; break } else E = B; } N = (A << 16 >> 16) * 3 | 0; j = b[O + (N << 1) >> 1] | 0; b[u >> 1] = b[O + (N + 1 << 1) >> 1] | 0; b[v >> 1] = b[O + (N + 2 << 1) >> 1] | 0; j = Z(j << 16 >> 16, fa) | 0; if ((j | 0) == 1073741824) { c[y >> 2] = 1; B = 2147483647; } else B = j << 1; N = 9 - V | 0; O = N & 65535; N = N << 16 >> 16; M = O << 16 >> 16 > 0; if (M) B = O << 16 >> 16 < 31 ? B >> N : 0; else { K = 0 - N << 16 >> 16; L = B << K; B = (L >> K | 0) == (B | 0) ? L : B >> 31 ^ 2147483647; } b[t >> 1] = B >>> 16; L = h << 16 >> 16; P = b[P + (L << 1) >> 1] | 0; b[s >> 1] = P; Q = b[Q + (L << 1) >> 1] | 0; Ub(d, f, g, P, o, W, X, R, y); xc(a, b[R >> 1] | 0, b[t >> 1] | 0, T, y); if (!((b[W >> 1] | 0) != 0 & (b[T >> 1] | 0) > 0)) { y = A; u = c[w >> 2] | 0; t = u + 2 | 0; b[u >> 1] = Q; u = u + 4 | 0; c[w >> 2] = u; b[t >> 1] = y; i = la; return } F = W + 6 | 0; b[F >> 1] = l; D = X + 6 | 0; b[D >> 1] = k; m = ((Ge(q, m, y) | 0) & 65535) + 10 | 0; x = m << 16 >> 16; if ((m & 65535) << 16 >> 16 < 0) { n = 0 - x << 16; if ((n | 0) < 983040) p = p << 16 >> 16 >> (n >> 16) & 65535; else p = 0; } else { n = p << 16 >> 16; r = n << x; if ((r << 16 >> 16 >> x | 0) == (n | 0)) p = r & 65535; else p = (n >>> 15 ^ 32767) & 65535; } j = b[s >> 1] | 0; B = b[T >> 1] | 0; S = c[S >> 2] | 0; r = b[t >> 1] | 0; T = 10 - V | 0; x = T << 16 >> 16; if ((T & 65535) << 16 >> 16 < 0) { n = 0 - x << 16; if ((n | 0) < 983040) l = r << 16 >> 16 >> (n >> 16) & 65535; else l = 0; } else { n = r << 16 >> 16; r = n << x; if ((r << 16 >> 16 >> x | 0) == (n | 0)) l = r & 65535; else l = (n >>> 15 ^ 32767) & 65535; } h = j << 16 >> 16; n = Z(h, h) | 0; if (n >>> 0 > 1073741823) { c[y >> 2] = 1; j = 32767; } else j = n >>> 15; A = Rd(32767 - (B & 65535) & 65535, 1, y) | 0; B = B << 16 >> 16; n = Z(b[W + 2 >> 1] | 0, B) | 0; if ((n | 0) == 1073741824) { c[y >> 2] = 1; n = 2147483647; } else n = n << 1; T = n << 1; n = Z(((T >> 1 | 0) == (n | 0) ? T : n >> 31 ^ 2147418112) >> 16, j << 16 >> 16) | 0; if ((n | 0) == 1073741824) { c[y >> 2] = 1; E = 2147483647; } else E = n << 1; C = (e[X + 2 >> 1] | 0) + 65521 | 0; x = C & 65535; n = Z(b[W + 4 >> 1] | 0, B) | 0; if ((n | 0) == 1073741824) { c[y >> 2] = 1; j = 2147483647; } else j = n << 1; n = j << 1; n = (Z(((n >> 1 | 0) == (j | 0) ? n : j >> 31 ^ 2147418112) >> 16, h) | 0) >> 15; if ((n | 0) > 32767) { c[y >> 2] = 1; n = 32767; } b[$ >> 1] = n; j = U & 65535; b[ia >> 1] = j; j = Rd(b[X + 4 >> 1] | 0, j, y) | 0; n = Z(b[F >> 1] | 0, B) | 0; if ((n | 0) == 1073741824) { c[y >> 2] = 1; n = 2147483647; } else n = n << 1; z = n << 1; b[ba >> 1] = ((z >> 1 | 0) == (n | 0) ? z : n >> 31 ^ 2147418112) >>> 16; z = ((V << 17 >> 17 | 0) == (V | 0) ? V << 1 : V >>> 15 ^ 32767) + 65529 & 65535; b[ia >> 1] = z; z = Rd(b[D >> 1] | 0, z, y) | 0; n = (Z(b[F >> 1] | 0, A << 16 >> 16) | 0) >> 15; if ((n | 0) > 32767) { c[y >> 2] = 1; n = 32767; } b[da >> 1] = n; A = Rd(z, 1, y) | 0; r = Z(b[W >> 1] | 0, B) | 0; if ((r | 0) == 1073741824) { c[y >> 2] = 1; n = 2147483647; } else n = r << 1; D = Fe(n, ia, y) | 0; h = (e[ia >> 1] | 0) + 47 | 0; b[ia >> 1] = h; h = (e[X >> 1] | 0) - (h & 65535) | 0; B = h + 31 & 65535; B = x << 16 >> 16 > B << 16 >> 16 ? x : B; B = j << 16 >> 16 > B << 16 >> 16 ? j : B; B = z << 16 >> 16 > B << 16 >> 16 ? z : B; B = (A << 16 >> 16 > B << 16 >> 16 ? A : B) << 16 >> 16; r = B - (C & 65535) | 0; n = r & 65535; r = r << 16 >> 16; if (n << 16 >> 16 > 0) K = n << 16 >> 16 < 31 ? E >> r : 0; else { X = 0 - r << 16 >> 16; K = E << X; K = (K >> X | 0) == (E | 0) ? K : E >> 31 ^ 2147483647; } x = B - (j & 65535) | 0; n = x & 65535; r = e[$ >> 1] << 16; x = x << 16 >> 16; if (n << 16 >> 16 > 0) r = n << 16 >> 16 < 31 ? r >> x : 0; else { W = 0 - x << 16 >> 16; X = r << W; r = (X >> W | 0) == (r | 0) ? X : r >> 31 ^ 2147483647; } Nc(r, $, aa, y); z = B - (z & 65535) | 0; r = z & 65535; x = e[ba >> 1] << 16; z = z << 16 >> 16; if (r << 16 >> 16 > 0) r = r << 16 >> 16 < 31 ? x >> z : 0; else { X = 0 - z << 16 >> 16; r = x << X; r = (r >> X | 0) == (x | 0) ? r : x >> 31 ^ 2147483647; } Nc(r, ba, ca, y); z = B - (A & 65535) | 0; r = z & 65535; x = e[da >> 1] << 16; z = z << 16 >> 16; if (r << 16 >> 16 > 0) r = r << 16 >> 16 < 31 ? x >> z : 0; else { X = 0 - z << 16 >> 16; r = x << X; r = (r >> X | 0) == (x | 0) ? r : x >> 31 ^ 2147483647; } Nc(r, da, ea, y); z = B + 65505 | 0; b[ia >> 1] = z; z = z - (h & 65535) | 0; r = De(z & 65535, 1, y) | 0; x = r << 16 >> 16; if (r << 16 >> 16 > 0) x = r << 16 >> 16 < 31 ? D >> x : 0; else { X = 0 - x << 16 >> 16; x = D << X; x = (x >> X | 0) == (D | 0) ? x : D >> 31 ^ 2147483647; } do if (!(z & 1)) E = x; else { Nc(x, _, Y, y); r = b[Y >> 1] | 0; x = b[_ >> 1] | 0; if ((x * 23170 | 0) == 1073741824) { c[y >> 2] = 1; z = 2147483647; } else z = x * 46340 | 0; _ = (r << 16 >> 16) * 23170 >> 15; x = z + (_ << 1) | 0; if (!((z ^ _ | 0) > 0 & (x ^ z | 0) < 0)) { E = x; break } c[y >> 2] = 1; E = (z >>> 31) + 2147483647 | 0; } while (0); F = (K >>> 31) + 2147483647 | 0; D = 2147483647; C = 0; x = 0; G = S; while (1) { r = (Z(b[G >> 1] | 0, fa) | 0) >> 15; G = G + 6 | 0; if ((r | 0) > 32767) { c[y >> 2] = 1; r = 32767; } z = r & 65535; if (z << 16 >> 16 >= l << 16 >> 16) break; j = r << 16 >> 16; r = Z(j, j) | 0; if ((r | 0) == 1073741824) { c[y >> 2] = 1; n = 2147483647; } else n = r << 1; Nc(n, ja, ka, y); r = (Ge(z, p, y) | 0) << 16 >> 16; r = Z(r, r) | 0; if ((r | 0) == 1073741824) { c[y >> 2] = 1; r = 2147483647; } else r = r << 1; Nc(r, ga, ha, y); z = b[aa >> 1] | 0; n = Z(b[$ >> 1] | 0, j) | 0; do if ((n | 0) == 1073741824) { c[y >> 2] = 1; n = 2147483647; } else { r = (n << 1) + K | 0; if (!((n ^ K | 0) > 0 & (r ^ K | 0) < 0)) { n = r; break } c[y >> 2] = 1; n = F; } while (0); r = (Z(z << 16 >> 16, j) | 0) >> 15; if ((r | 0) > 32767) { c[y >> 2] = 1; r = 32767; } _ = r << 16; r = (_ >> 15) + n | 0; if ((_ >> 16 ^ n | 0) > 0 & (r ^ n | 0) < 0) { c[y >> 2] = 1; r = (n >>> 31) + 2147483647 | 0; } h = b[ca >> 1] | 0; A = b[ka >> 1] | 0; j = b[ba >> 1] | 0; B = b[ja >> 1] | 0; n = Z(B, j) | 0; do if ((n | 0) == 1073741824) { c[y >> 2] = 1; z = 2147483647; } else { z = (n << 1) + r | 0; if (!((n ^ r | 0) > 0 & (z ^ r | 0) < 0)) break; c[y >> 2] = 1; z = (r >>> 31) + 2147483647 | 0; } while (0); n = (Z(A << 16 >> 16, j) | 0) >> 15; if ((n | 0) > 32767) { c[y >> 2] = 1; n = 32767; } _ = n << 16; n = (_ >> 15) + z | 0; if ((_ >> 16 ^ z | 0) > 0 & (n ^ z | 0) < 0) { c[y >> 2] = 1; n = (z >>> 31) + 2147483647 | 0; } r = (Z(B, h << 16 >> 16) | 0) >> 15; if ((r | 0) > 32767) { c[y >> 2] = 1; r = 32767; } _ = r << 16; r = (_ >> 15) + n | 0; if ((_ >> 16 ^ n | 0) > 0 & (r ^ n | 0) < 0) { c[y >> 2] = 1; r = (n >>> 31) + 2147483647 | 0; } r = Fe(r, ia, y) | 0; z = De(b[ia >> 1] | 0, 1, y) | 0; n = z << 16 >> 16; if (z << 16 >> 16 > 0) z = z << 16 >> 16 < 31 ? r >> n : 0; else { _ = 0 - n << 16 >> 16; z = r << _; z = (z >> _ | 0) == (r | 0) ? z : r >> 31 ^ 2147483647; } r = z - E | 0; if (((r ^ z) & (z ^ E) | 0) < 0) { c[y >> 2] = 1; r = (z >>> 31) + 2147483647 | 0; } r = (Ce(r, y) | 0) << 16 >> 16; r = Z(r, r) | 0; if ((r | 0) == 1073741824) { c[y >> 2] = 1; z = 2147483647; } else z = r << 1; B = b[ea >> 1] | 0; j = b[ha >> 1] | 0; A = b[da >> 1] | 0; h = b[ga >> 1] | 0; n = Z(h, A) | 0; do if ((n | 0) == 1073741824) { c[y >> 2] = 1; r = 2147483647; } else { r = (n << 1) + z | 0; if (!((n ^ z | 0) > 0 & (r ^ z | 0) < 0)) break; c[y >> 2] = 1; r = (z >>> 31) + 2147483647 | 0; } while (0); n = (Z(j << 16 >> 16, A) | 0) >> 15; if ((n | 0) > 32767) { c[y >> 2] = 1; n = 32767; } _ = n << 16; n = (_ >> 15) + r | 0; if ((_ >> 16 ^ r | 0) > 0 & (n ^ r | 0) < 0) { c[y >> 2] = 1; n = (r >>> 31) + 2147483647 | 0; } r = (Z(h, B << 16 >> 16) | 0) >> 15; if ((r | 0) > 32767) { c[y >> 2] = 1; r = 32767; } _ = r << 16; r = (_ >> 15) + n | 0; if ((_ >> 16 ^ n | 0) > 0 & (r ^ n | 0) < 0) { c[y >> 2] = 1; r = (n >>> 31) + 2147483647 | 0; } n = (r | 0) < (D | 0); x = n ? C : x; C = C + 1 << 16 >> 16; if (C << 16 >> 16 >= 32) break; else D = n ? r : D; } ka = (x << 16 >> 16) * 3 | 0; z = b[S + (ka << 1) >> 1] | 0; b[u >> 1] = b[S + (ka + 1 << 1) >> 1] | 0; b[v >> 1] = b[S + (ka + 2 << 1) >> 1] | 0; z = Z(z << 16 >> 16, fa) | 0; if ((z | 0) == 1073741824) { c[y >> 2] = 1; z = 2147483647; } else z = z << 1; if (M) z = O << 16 >> 16 < 31 ? z >> N : 0; else { u = 0 - N << 16 >> 16; y = z << u; z = (y >> u | 0) == (z | 0) ? y : z >> 31 ^ 2147483647; } b[t >> 1] = z >>> 16; y = x; u = c[w >> 2] | 0; t = u + 2 | 0; b[u >> 1] = Q; u = u + 4 | 0; c[w >> 2] = u; b[t >> 1] = y; i = la; return } function md(a, c, d, e, f, g, h, i) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; var j = 0, k = 0, l = 0, m = 0, n = 0; n = (a | 0) == 7; j = b[e >> 1] | 0; if (n) { j = j << 16 >> 16 >>> 1 & 65535; m = re(c, d, i) | 0; c = m << 16; a = c >> 16; if ((m << 20 >> 20 | 0) == (a | 0)) a = c >> 12; else a = a >>> 15 ^ 32767; } else { m = re(c, d, i) | 0; c = m << 16; a = c >> 16; if ((m << 21 >> 21 | 0) == (a | 0)) a = c >> 11; else a = a >>> 15 ^ 32767; } m = a << 16 >> 16; i = j << 16 >> 16; c = i - ((Z(m, b[h >> 1] | 0) | 0) >>> 15 & 65535) | 0; c = ((c & 32768 | 0) != 0 ? 0 - c | 0 : c) & 65535; k = 1; a = 0; l = h; while (1) { l = l + 6 | 0; j = i - ((Z(b[l >> 1] | 0, m) | 0) >>> 15 & 65535) | 0; d = j << 16; j = (d | 0) < 0 ? 0 - (d >> 16) | 0 : j; d = (j << 16 >> 16 | 0) < (c << 16 >> 16 | 0); a = d ? k : a; k = k + 1 << 16 >> 16; if (k << 16 >> 16 >= 32) break; else c = d ? j & 65535 : c; } l = (a << 16 >> 16) * 196608 >> 16; b[e >> 1] = (Z(b[h + (l << 1) >> 1] | 0, m) | 0) >>> 15 << (n & 1); b[f >> 1] = b[h + (l + 1 << 1) >> 1] | 0; b[g >> 1] = b[h + (l + 2 << 1) >> 1] | 0; return a | 0 } function nd(a, c, d, e, f, g, h) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; var i = 0, j = 0, k = 0, l = 0, m = 0, n = 0; i = Ge(b[d >> 1] | 0, b[g >> 1] | 0, h) | 0; i = (i & 65535) - ((i & 65535) >>> 15 & 65535) | 0; i = (i << 16 >> 31 ^ i) & 65535; k = 0; l = 1; while (1) { j = b[g + (l << 1) >> 1] | 0; if (j << 16 >> 16 > c << 16 >> 16) j = i; else { j = Ge(b[d >> 1] | 0, j, h) | 0; j = (j & 65535) - ((j & 65535) >>> 15 & 65535) | 0; j = (j << 16 >> 31 ^ j) & 65535; n = j << 16 >> 16 < i << 16 >> 16; j = n ? j : i; k = n ? l & 65535 : k; } l = l + 1 | 0; if ((l | 0) == 16) break; else i = j; } if ((a | 0) != 5) { i = b[g + (k << 16 >> 16 << 1) >> 1] | 0; if ((a | 0) == 7) { b[d >> 1] = i & 65532; return k | 0 } else { b[d >> 1] = i; return k | 0 } } j = k << 16 >> 16; switch (k << 16 >> 16) { case 0: { i = 0; break } case 15: { m = 8; break } default: if ((b[g + (j + 1 << 1) >> 1] | 0) > c << 16 >> 16) m = 8; else i = j + 65535 & 65535; } if ((m | 0) == 8) i = j + 65534 & 65535; b[f >> 1] = i; n = i << 16 >> 16; b[e >> 1] = b[g + (n << 1) >> 1] | 0; n = n + 1 | 0; b[f + 2 >> 1] = n; n = n << 16 >> 16; b[e + 2 >> 1] = b[g + (n << 1) >> 1] | 0; n = n + 1 | 0; b[f + 4 >> 1] = n; b[e + 4 >> 1] = b[g + (n << 16 >> 16 << 1) >> 1] | 0; b[d >> 1] = b[g + (j << 1) >> 1] | 0; return k | 0 } function od(a, d, f, g, h, j, k, l, m, n, o, p) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; p = p | 0; var q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0; K = i; i = i + 32 | 0; s = K + 20 | 0; t = K + 10 | 0; r = K; switch (a | 0) { case 3: case 4: case 6: { o = o + 84 | 0; J = 128; break } default: { o = o + 80 | 0; J = 64; } } I = c[o >> 2] | 0; q = re(14, f, p) | 0; H = d << 16 >> 16; G = H + 65525 | 0; a = (e[h >> 1] | 0) + 65523 & 65535; b[r >> 1] = a; d = (e[h + 2 >> 1] | 0) + 65522 & 65535; b[r + 2 >> 1] = d; F = G << 16 >> 16; F = Rd(b[h + 4 >> 1] | 0, ((G << 17 >> 17 | 0) == (F | 0) ? G << 1 : F >>> 15 ^ 32767) + 15 & 65535, p) | 0; b[r + 4 >> 1] = F; G = Rd(b[h + 6 >> 1] | 0, G & 65535, p) | 0; b[r + 6 >> 1] = G; h = Rd(b[h + 8 >> 1] | 0, H + 65526 & 65535, p) | 0; b[r + 8 >> 1] = h; d = d << 16 >> 16 > a << 16 >> 16 ? d : a; d = F << 16 >> 16 > d << 16 >> 16 ? F : d; d = G << 16 >> 16 > d << 16 >> 16 ? G : d; d = (h << 16 >> 16 > d << 16 >> 16 ? h : d) + 1 & 65535; h = 0; while (1) { f = d - (a & 65535) | 0; o = f & 65535; a = e[g + (h << 1) >> 1] << 16; f = f << 16 >> 16; if (o << 16 >> 16 > 0) o = o << 16 >> 16 < 31 ? a >> f : 0; else { G = 0 - f << 16 >> 16; o = a << G; o = (o >> G | 0) == (a | 0) ? o : a >> 31 ^ 2147483647; } Nc(o, s + (h << 1) | 0, t + (h << 1) | 0, p); o = h + 1 | 0; if ((o | 0) == 5) break; a = b[r + (o << 1) >> 1] | 0; h = o; } G = q << 16 >> 16; y = b[s >> 1] | 0; z = b[t >> 1] | 0; A = b[s + 2 >> 1] | 0; B = b[t + 2 >> 1] | 0; C = b[s + 4 >> 1] | 0; D = b[t + 4 >> 1] | 0; E = b[s + 6 >> 1] | 0; F = b[t + 6 >> 1] | 0; x = b[s + 8 >> 1] | 0; u = b[t + 8 >> 1] | 0; d = 2147483647; v = 0; o = 0; w = I; while (1) { h = b[w >> 1] | 0; if (h << 16 >> 16 > j << 16 >> 16) q = d; else { q = (Z(b[w + 2 >> 1] | 0, G) | 0) >> 15; if ((q | 0) > 32767) { c[p >> 2] = 1; q = 32767; } t = h << 16 >> 16; h = Z(t, t) | 0; if (h >>> 0 > 1073741823) { c[p >> 2] = 1; r = 32767; } else r = h >>> 15; f = q << 16 >> 16; q = Z(f, f) | 0; if (q >>> 0 > 1073741823) { c[p >> 2] = 1; s = 32767; } else s = q >>> 15; g = (Z(f, t) | 0) >> 15; if ((g | 0) > 32767) { c[p >> 2] = 1; g = 32767; } q = r << 16 >> 16; r = Z(y, q) | 0; if ((r | 0) == 1073741824) { c[p >> 2] = 1; h = 2147483647; } else h = r << 1; q = (Z(z, q) | 0) >> 15; r = h + (q << 1) | 0; if ((h ^ q | 0) > 0 & (r ^ h | 0) < 0) { c[p >> 2] = 1; r = (h >>> 31) + 2147483647 | 0; } q = Z(A, t) | 0; if ((q | 0) == 1073741824) { c[p >> 2] = 1; h = 2147483647; } else h = q << 1; t = (Z(B, t) | 0) >> 15; q = h + (t << 1) | 0; if ((h ^ t | 0) > 0 & (q ^ h | 0) < 0) { c[p >> 2] = 1; q = (h >>> 31) + 2147483647 | 0; } h = q + r | 0; if ((q ^ r | 0) > -1 & (h ^ r | 0) < 0) { c[p >> 2] = 1; h = (r >>> 31) + 2147483647 | 0; } q = s << 16 >> 16; r = Z(C, q) | 0; if ((r | 0) == 1073741824) { c[p >> 2] = 1; a = 2147483647; } else a = r << 1; t = (Z(D, q) | 0) >> 15; r = a + (t << 1) | 0; if ((a ^ t | 0) > 0 & (r ^ a | 0) < 0) { c[p >> 2] = 1; r = (a >>> 31) + 2147483647 | 0; } q = r + h | 0; if ((r ^ h | 0) > -1 & (q ^ h | 0) < 0) { c[p >> 2] = 1; a = (h >>> 31) + 2147483647 | 0; } else a = q; q = Z(E, f) | 0; if ((q | 0) == 1073741824) { c[p >> 2] = 1; r = 2147483647; } else r = q << 1; t = (Z(F, f) | 0) >> 15; q = r + (t << 1) | 0; if ((r ^ t | 0) > 0 & (q ^ r | 0) < 0) { c[p >> 2] = 1; q = (r >>> 31) + 2147483647 | 0; } h = q + a | 0; if ((q ^ a | 0) > -1 & (h ^ a | 0) < 0) { c[p >> 2] = 1; r = (a >>> 31) + 2147483647 | 0; } else r = h; h = g << 16 >> 16; q = Z(x, h) | 0; if ((q | 0) == 1073741824) { c[p >> 2] = 1; a = 2147483647; } else a = q << 1; t = (Z(u, h) | 0) >> 15; q = a + (t << 1) | 0; if ((a ^ t | 0) > 0 & (q ^ a | 0) < 0) { c[p >> 2] = 1; h = (a >>> 31) + 2147483647 | 0; } else h = q; q = h + r | 0; if ((h ^ r | 0) > -1 & (q ^ r | 0) < 0) { c[p >> 2] = 1; q = (r >>> 31) + 2147483647 | 0; } t = (q | 0) < (d | 0); q = t ? q : d; o = t ? v : o; } w = w + 8 | 0; v = v + 1 << 16 >> 16; if ((v << 16 >> 16 | 0) >= (J | 0)) break; else d = q; } j = o << 16 >> 16; j = ((j << 18 >> 18 | 0) == (j | 0) ? j << 2 : j >>> 15 ^ 32767) << 16 >> 16; b[k >> 1] = b[I + (j << 1) >> 1] | 0; d = b[I + (j + 1 << 1) >> 1] | 0; b[m >> 1] = b[I + (j + 2 << 1) >> 1] | 0; b[n >> 1] = b[I + (j + 3 << 1) >> 1] | 0; d = Z(d << 16 >> 16, G) | 0; if ((d | 0) == 1073741824) { c[p >> 2] = 1; a = 2147483647; } else a = d << 1; f = 10 - H | 0; d = f & 65535; f = f << 16 >> 16; if (d << 16 >> 16 > 0) { p = d << 16 >> 16 < 31 ? a >> f : 0; p = p >>> 16; p = p & 65535; b[l >> 1] = p; i = K; return o | 0 } else { m = 0 - f << 16 >> 16; p = a << m; p = (p >> m | 0) == (a | 0) ? p : a >> 31 ^ 2147483647; p = p >>> 16; p = p & 65535; b[l >> 1] = p; i = K; return o | 0 } return 0 } function pd(a, c, d, f, g, h, j, k, l) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; var m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0, O = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0, V = 0, W = 0, X = 0, Y = 0, _ = 0, $ = 0, aa = 0, ba = 0, ca = 0, da = 0, ea = 0, fa = 0, ga = 0, ha = 0, ia = 0, ja = 0, ka = 0, la = 0, ma = 0, na = 0, oa = 0, pa = 0, qa = 0, ra = 0, sa = 0, ta = 0, ua = 0, va = 0, wa = 0; wa = i; i = i + 160 | 0; va = wa; n = a << 16 >> 16; ta = a << 16 >> 16 == 10; ua = b[j + (b[h >> 1] << 1) >> 1] | 0; if (a << 16 >> 16 > 0) { l = 0; m = k; while (1) { b[m >> 1] = l; l = l + 1 << 16 >> 16; if (l << 16 >> 16 >= a << 16 >> 16) break; else m = m + 2 | 0; } } if (d << 16 >> 16 <= 1) { i = wa; return } ra = h + 2 | 0; sa = ua << 16 >> 16; oa = f + (sa << 1) | 0; pa = g + (sa * 80 | 0) + (sa << 1) | 0; qa = h + 6 | 0; X = c & 65535; Y = h + 4 | 0; _ = h + 10 | 0; $ = h + 8 | 0; aa = h + 14 | 0; ba = h + 12 | 0; ca = h + 18 | 0; da = h + 16 | 0; ea = k + 2 | 0; fa = k + 4 | 0; ga = k + 6 | 0; ha = k + 8 | 0; ia = k + 10 | 0; ja = k + 12 | 0; ka = k + 14 | 0; la = k + 16 | 0; ma = k + 18 | 0; na = a << 16 >> 16 > 2; V = h + (n + -1 << 1) | 0; T = 1; W = 1; N = 0; O = 0; U = -1; while (1) { S = b[j + (b[ra >> 1] << 1) >> 1] | 0; R = S << 16 >> 16; c = (e[f + (R << 1) >> 1] | 0) + (e[oa >> 1] | 0) | 0; m = (b[g + (sa * 80 | 0) + (R << 1) >> 1] << 13) + 32768 + ((b[g + (R * 80 | 0) + (R << 1) >> 1] | 0) + (b[pa >> 1] | 0) << 12) | 0; n = b[qa >> 1] | 0; if (n << 16 >> 16 < 40) { n = n << 16 >> 16; o = va; while (1) { P = (b[g + (n * 80 | 0) + (n << 1) >> 1] | 0) >>> 1; M = b[g + (n * 80 | 0) + (sa << 1) >> 1] | 0; Q = b[g + (n * 80 | 0) + (R << 1) >> 1] | 0; b[o >> 1] = c + (e[f + (n << 1) >> 1] | 0); b[o + 2 >> 1] = (M + 2 + P + Q | 0) >>> 2; n = n + X | 0; if ((n & 65535) << 16 >> 16 < 40) { n = n << 16 >> 16; o = o + 4 | 0; } else break } B = b[qa >> 1] | 0; } else B = n; c = b[Y >> 1] | 0; A = m >> 12; n = c << 16 >> 16; a:do if (c << 16 >> 16 < 40) { z = B << 16 >> 16; if (B << 16 >> 16 < 40) { o = 1; q = c; s = B; r = 0; p = -1; } else while (1) { n = n + X | 0; if ((n & 65535) << 16 >> 16 < 40) n = n << 16 >> 16; else { o = 1; Q = c; P = B; n = 0; break a } } while (1) { y = ((b[g + (n * 80 | 0) + (n << 1) >> 1] | 0) + A >> 1) + (b[g + (n * 80 | 0) + (sa << 1) >> 1] | 0) + (b[g + (n * 80 | 0) + (R << 1) >> 1] | 0) | 0; x = e[f + (n << 1) >> 1] | 0; v = z; w = B; u = va; t = r; while (1) { m = (e[u >> 1] | 0) + x | 0; l = m << 16 >> 16; l = (Z(l, l) | 0) >>> 15; r = (y + (b[g + (n * 80 | 0) + (v << 1) >> 1] | 0) >> 2) + (b[u + 2 >> 1] | 0) >> 1; if ((Z(l << 16 >> 16, o << 16 >> 16) | 0) > (Z(r, p << 16 >> 16) | 0)) { o = r & 65535; q = c; s = w; r = m & 65535; p = l & 65535; } else r = t; m = v + X | 0; w = m & 65535; if (w << 16 >> 16 >= 40) break; else { v = m << 16 >> 16; u = u + 4 | 0; t = r; } } n = n + X | 0; c = n & 65535; if (c << 16 >> 16 < 40) n = n << 16 >> 16; else { Q = q; P = s; n = r; break } } } else { o = 1; Q = c; P = B; n = 0; } while (0); q = o << 16 >> 16 << 15; o = b[_ >> 1] | 0; if (o << 16 >> 16 < 40) { m = Q << 16 >> 16; l = P << 16 >> 16; c = n & 65535; o = o << 16 >> 16; n = va; while (1) { J = b[g + (o * 80 | 0) + (o << 1) >> 1] >> 1; I = b[g + (o * 80 | 0) + (sa << 1) >> 1] | 0; K = b[g + (o * 80 | 0) + (R << 1) >> 1] | 0; L = b[g + (o * 80 | 0) + (m << 1) >> 1] | 0; M = b[g + (o * 80 | 0) + (l << 1) >> 1] | 0; b[n >> 1] = (e[f + (o << 1) >> 1] | 0) + c; b[n + 2 >> 1] = (I + 2 + J + K + L + M | 0) >>> 2; o = o + X | 0; if ((o & 65535) << 16 >> 16 < 40) { o = o << 16 >> 16; n = n + 4 | 0; } else break } J = b[_ >> 1] | 0; } else J = o; p = b[$ >> 1] | 0; o = p << 16 >> 16; b:do if (p << 16 >> 16 < 40) { C = Q << 16 >> 16; D = P << 16 >> 16; E = J << 16 >> 16; B = q + 32768 | 0; if (J << 16 >> 16 < 40) { r = 1; q = p; c = J; s = p; n = 0; p = -1; } else while (1) { o = o + X | 0; if ((o & 65535) << 16 >> 16 < 40) o = o << 16 >> 16; else { o = 1; M = p; L = J; n = 0; break b } } while (1) { l = e[f + (o << 1) >> 1] | 0; A = (b[g + (o * 80 | 0) + (R << 1) >> 1] | 0) + (b[g + (o * 80 | 0) + (sa << 1) >> 1] | 0) + (b[g + (o * 80 | 0) + (C << 1) >> 1] | 0) + (b[g + (o * 80 | 0) + (D << 1) >> 1] | 0) | 0; z = B + (b[g + (o * 80 | 0) + (o << 1) >> 1] << 11) | 0; x = E; v = J; y = va; while (1) { t = (e[y >> 1] | 0) + l | 0; m = z + (b[y + 2 >> 1] << 14) + (A + (b[g + (o * 80 | 0) + (x << 1) >> 1] | 0) << 12) | 0; u = t << 16 >> 16; u = (Z(u, u) | 0) >>> 15; if ((Z(u << 16 >> 16, r << 16 >> 16) | 0) > (Z(m >> 16, p << 16 >> 16) | 0)) { r = m >>> 16 & 65535; w = s; c = v; n = t & 65535; p = u & 65535; } else w = q; q = x + X | 0; v = q & 65535; if (v << 16 >> 16 >= 40) { q = w; break } else { x = q << 16 >> 16; q = w; y = y + 4 | 0; } } o = o + X | 0; s = o & 65535; if (s << 16 >> 16 < 40) o = o << 16 >> 16; else { o = r; M = q; L = c; break } } } else { o = 1; M = p; L = J; n = 0; } while (0); r = o << 16 >> 16 << 15; o = b[aa >> 1] | 0; if (o << 16 >> 16 < 40) { m = Q << 16 >> 16; l = P << 16 >> 16; p = M << 16 >> 16; q = L << 16 >> 16; c = n & 65535; o = o << 16 >> 16; n = va; while (1) { F = b[g + (o * 80 | 0) + (o << 1) >> 1] >> 1; E = b[g + (sa * 80 | 0) + (o << 1) >> 1] | 0; G = b[g + (R * 80 | 0) + (o << 1) >> 1] | 0; H = b[g + (m * 80 | 0) + (o << 1) >> 1] | 0; I = b[g + (l * 80 | 0) + (o << 1) >> 1] | 0; J = b[g + (p * 80 | 0) + (o << 1) >> 1] | 0; K = b[g + (q * 80 | 0) + (o << 1) >> 1] | 0; b[n >> 1] = (e[f + (o << 1) >> 1] | 0) + c; b[n + 2 >> 1] = (E + 4 + F + G + H + I + J + K | 0) >>> 3; o = o + X | 0; if ((o & 65535) << 16 >> 16 < 40) { o = o << 16 >> 16; n = n + 4 | 0; } else break } c = b[aa >> 1] | 0; } else c = o; s = b[ba >> 1] | 0; if (s << 16 >> 16 < 40) { J = Q << 16 >> 16; F = P << 16 >> 16; E = M << 16 >> 16; D = L << 16 >> 16; C = c << 16 >> 16; B = c << 16 >> 16 < 40; G = r + 32768 | 0; I = s << 16 >> 16; l = 1; w = s; v = c; H = s; q = 0; o = -1; while (1) { if (B) { r = e[f + (I << 1) >> 1] | 0; n = (b[g + (I * 80 | 0) + (R << 1) >> 1] | 0) + (b[g + (I * 80 | 0) + (sa << 1) >> 1] | 0) + (b[g + (I * 80 | 0) + (J << 1) >> 1] | 0) + (b[g + (I * 80 | 0) + (F << 1) >> 1] | 0) + (b[g + (I * 80 | 0) + (E << 1) >> 1] | 0) + (b[g + (I * 80 | 0) + (D << 1) >> 1] | 0) | 0; p = G + (b[g + (I * 80 | 0) + (I << 1) >> 1] << 10) | 0; u = C; s = c; z = v; A = va; while (1) { y = (e[A >> 1] | 0) + r | 0; v = p + (b[A + 2 >> 1] << 14) + (n + (b[g + (I * 80 | 0) + (u << 1) >> 1] | 0) << 11) | 0; x = y << 16 >> 16; x = (Z(x, x) | 0) >>> 15; if ((Z(x << 16 >> 16, l << 16 >> 16) | 0) > (Z(v >> 16, o << 16 >> 16) | 0)) { l = v >>> 16 & 65535; w = H; v = s; q = y & 65535; o = x & 65535; } else v = z; t = u + X | 0; s = t & 65535; if (s << 16 >> 16 >= 40) break; else { u = t << 16 >> 16; z = v; A = A + 4 | 0; } } } s = I + X | 0; H = s & 65535; if (H << 16 >> 16 >= 40) { K = v; break } else I = s << 16 >> 16; } } else { l = 1; w = s; K = c; q = 0; o = -1; } if (ta) { u = l << 16 >> 16 << 15; o = b[ca >> 1] | 0; if (o << 16 >> 16 < 40) { n = Q << 16 >> 16; c = P << 16 >> 16; m = M << 16 >> 16; l = L << 16 >> 16; r = w << 16 >> 16; s = K << 16 >> 16; p = q & 65535; o = o << 16 >> 16; q = va; while (1) { E = b[g + (o * 80 | 0) + (o << 1) >> 1] >> 1; D = b[g + (sa * 80 | 0) + (o << 1) >> 1] | 0; F = b[g + (R * 80 | 0) + (o << 1) >> 1] | 0; G = b[g + (n * 80 | 0) + (o << 1) >> 1] | 0; H = b[g + (c * 80 | 0) + (o << 1) >> 1] | 0; I = b[g + (m * 80 | 0) + (o << 1) >> 1] | 0; J = b[g + (l * 80 | 0) + (o << 1) >> 1] | 0; N = b[g + (r * 80 | 0) + (o << 1) >> 1] | 0; O = b[g + (s * 80 | 0) + (o << 1) >> 1] | 0; b[q >> 1] = (e[f + (o << 1) >> 1] | 0) + p; b[q + 2 >> 1] = (D + 4 + E + F + G + H + I + J + N + O | 0) >>> 3; o = o + X | 0; if ((o & 65535) << 16 >> 16 < 40) { o = o << 16 >> 16; q = q + 4 | 0; } else break } J = b[ca >> 1] | 0; } else J = o; r = b[da >> 1] | 0; if (r << 16 >> 16 < 40) { E = Q << 16 >> 16; D = P << 16 >> 16; C = M << 16 >> 16; m = L << 16 >> 16; F = w << 16 >> 16; G = K << 16 >> 16; H = J << 16 >> 16; I = J << 16 >> 16 < 40; B = u + 32768 | 0; n = r << 16 >> 16; l = 1; s = r; q = J; c = r; o = -1; while (1) { if (I) { u = e[f + (n << 1) >> 1] | 0; p = (b[g + (R * 80 | 0) + (n << 1) >> 1] | 0) + (b[g + (sa * 80 | 0) + (n << 1) >> 1] | 0) + (b[g + (E * 80 | 0) + (n << 1) >> 1] | 0) + (b[g + (D * 80 | 0) + (n << 1) >> 1] | 0) + (b[g + (C * 80 | 0) + (n << 1) >> 1] | 0) + (b[g + (m * 80 | 0) + (n << 1) >> 1] | 0) + (b[g + (F * 80 | 0) + (n << 1) >> 1] | 0) + (b[g + (G * 80 | 0) + (n << 1) >> 1] | 0) | 0; r = B + (b[g + (n * 80 | 0) + (n << 1) >> 1] << 9) | 0; A = H; x = J; z = va; while (1) { y = (e[z >> 1] | 0) + u << 16 >> 16; y = (Z(y, y) | 0) >>> 15; v = r + (b[z + 2 >> 1] << 13) + (p + (b[g + (n * 80 | 0) + (A << 1) >> 1] | 0) << 10) | 0; if ((Z(y << 16 >> 16, l << 16 >> 16) | 0) > (Z(v >> 16, o << 16 >> 16) | 0)) { l = v >>> 16 & 65535; s = c; q = x; o = y & 65535; } t = A + X | 0; x = t & 65535; if (x << 16 >> 16 >= 40) break; else { A = t << 16 >> 16; z = z + 4 | 0; } } } r = n + X | 0; c = r & 65535; if (c << 16 >> 16 >= 40) break; else n = r << 16 >> 16; } } else { l = 1; s = r; q = J; o = -1; } } else { s = N; q = O; } if ((Z(o << 16 >> 16, T << 16 >> 16) | 0) > (Z(l << 16 >> 16, U << 16 >> 16) | 0)) { b[k >> 1] = ua; b[ea >> 1] = S; b[fa >> 1] = Q; b[ga >> 1] = P; b[ha >> 1] = M; b[ia >> 1] = L; b[ja >> 1] = w; b[ka >> 1] = K; if (ta) { b[la >> 1] = s; b[ma >> 1] = q; } } else { l = T; o = U; } n = b[ra >> 1] | 0; if (na) { c = 1; m = 2; while (1) { b[h + (c << 1) >> 1] = b[h + (m << 1) >> 1] | 0; m = m + 1 | 0; if ((m & 65535) << 16 >> 16 == a << 16 >> 16) break; else c = c + 1 | 0; } } b[V >> 1] = n; W = W + 1 << 16 >> 16; if (W << 16 >> 16 >= d << 16 >> 16) break; else { T = l; N = s; O = q; U = o; } } i = wa; return } function qd(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, i = 0, j = 0, k = 0; i = 39; while (1) { h = a + (i << 1) | 0; g = b[h >> 1] | 0; f = c + (i << 1) | 0; if (g << 16 >> 16 > -1) b[f >> 1] = 32767; else { b[f >> 1] = -32767; if (g << 16 >> 16 == -32768) g = 32767; else g = 0 - (g & 65535) & 65535; b[h >> 1] = g; } b[d + (i << 1) >> 1] = g; if ((i | 0) > 0) i = i + -1 | 0; else break } k = 8 - (e << 16 >> 16) | 0; if ((k | 0) > 0) { j = 0; f = 0; } else return; do { e = 0; a = 0; h = 32767; while (1) { c = b[d + (e << 1) >> 1] | 0; i = c << 16 >> 16 > -1 ? c << 16 >> 16 < h << 16 >> 16 : 0; f = i ? a : f; g = e + 5 | 0; a = g & 65535; if (a << 16 >> 16 >= 40) break; else { e = g << 16 >> 16; h = i ? c : h; } } b[d + (f << 16 >> 16 << 1) >> 1] = -1; j = j + 1 << 16 >> 16; } while ((j << 16 >> 16 | 0) < (k | 0)); j = 0; do { c = 1; a = 1; g = 32767; while (1) { e = b[d + (c << 1) >> 1] | 0; i = e << 16 >> 16 > -1 ? e << 16 >> 16 < g << 16 >> 16 : 0; f = i ? a : f; h = c + 5 | 0; a = h & 65535; if (a << 16 >> 16 >= 40) break; else { c = h << 16 >> 16; g = i ? e : g; } } b[d + (f << 16 >> 16 << 1) >> 1] = -1; j = j + 1 << 16 >> 16; } while ((j << 16 >> 16 | 0) < (k | 0)); j = 0; do { c = 2; a = 2; g = 32767; while (1) { e = b[d + (c << 1) >> 1] | 0; i = e << 16 >> 16 > -1 ? e << 16 >> 16 < g << 16 >> 16 : 0; f = i ? a : f; h = c + 5 | 0; a = h & 65535; if (a << 16 >> 16 >= 40) break; else { c = h << 16 >> 16; g = i ? e : g; } } b[d + (f << 16 >> 16 << 1) >> 1] = -1; j = j + 1 << 16 >> 16; } while ((j << 16 >> 16 | 0) < (k | 0)); j = 0; while (1) { c = 3; a = 3; g = 32767; while (1) { e = b[d + (c << 1) >> 1] | 0; i = e << 16 >> 16 > -1 ? e << 16 >> 16 < g << 16 >> 16 : 0; f = i ? a : f; h = c + 5 | 0; a = h & 65535; if (a << 16 >> 16 >= 40) { g = f; break } else { c = h << 16 >> 16; g = i ? e : g; } } b[d + (g << 16 >> 16 << 1) >> 1] = -1; j = j + 1 << 16 >> 16; if ((j << 16 >> 16 | 0) >= (k | 0)) { f = 0; break } else f = g; } do { c = 4; a = 4; j = 32767; while (1) { e = b[d + (c << 1) >> 1] | 0; i = e << 16 >> 16 > -1 ? e << 16 >> 16 < j << 16 >> 16 : 0; g = i ? a : g; h = c + 5 | 0; a = h & 65535; if (a << 16 >> 16 >= 40) break; else { c = h << 16 >> 16; j = i ? e : j; } } b[d + (g << 16 >> 16 << 1) >> 1] = -1; f = f + 1 << 16 >> 16; } while ((f << 16 >> 16 | 0) < (k | 0)); return } function rd(a, d, e, f, g, h, j, k) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; var l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0; y = i; i = i + 80 | 0; x = y; p = 40; q = d; r = a; m = 256; n = 256; while (1) { l = b[q >> 1] | 0; q = q + 2 | 0; l = Z(l, l) | 0; if ((l | 0) != 1073741824) { o = (l << 1) + m | 0; if ((l ^ m | 0) > 0 & (o ^ m | 0) < 0) { c[k >> 2] = 1; m = (m >>> 31) + 2147483647 | 0; } else m = o; } else { c[k >> 2] = 1; m = 2147483647; } w = b[r >> 1] | 0; n = (Z(w << 1, w) | 0) + n | 0; p = p + -1 << 16 >> 16; if (!(p << 16 >> 16)) break; else r = r + 2 | 0; } w = ce(m, k) | 0; u = w << 5; w = ((u >> 5 | 0) == (w | 0) ? u : w >> 31 ^ 2147418112) >> 16; u = (ce(n, k) | 0) << 5 >> 16; v = 39; s = d + 78 | 0; t = x + 78 | 0; l = e + 78 | 0; while (1) { r = Z(b[s >> 1] | 0, w) | 0; s = s + -2 | 0; q = r << 1; d = a + (v << 1) | 0; m = b[d >> 1] | 0; p = Z(m << 16 >> 16, u) | 0; if ((p | 0) != 1073741824) { o = (p << 1) + q | 0; if ((p ^ q | 0) > 0 & (o ^ q | 0) < 0) { c[k >> 2] = 1; o = (r >>> 30 & 1) + 2147483647 | 0; } } else { c[k >> 2] = 1; o = 2147483647; } n = o << 10; n = Ce((n >> 10 | 0) == (o | 0) ? n : o >> 31 ^ 2147483647, k) | 0; if (n << 16 >> 16 > -1) b[l >> 1] = 32767; else { b[l >> 1] = -32767; if (n << 16 >> 16 == -32768) n = 32767; else n = 0 - (n & 65535) & 65535; if (m << 16 >> 16 == -32768) o = 32767; else o = 0 - (m & 65535) & 65535; b[d >> 1] = o; } l = l + -2 | 0; b[t >> 1] = n; if ((v | 0) <= 0) break; else { v = v + -1 | 0; t = t + -2 | 0; } } d = g << 16 >> 16; if (g << 16 >> 16 <= 0) { b[h + (d << 1) >> 1] = b[h >> 1] | 0; i = y; return } r = j & 65535; q = 0; p = -1; l = 0; while (1) { if ((q | 0) < 40) { n = q; o = q & 65535; m = -1; while (1) { k = b[x + (n << 1) >> 1] | 0; j = k << 16 >> 16 > m << 16 >> 16; m = j ? k : m; l = j ? o : l; n = n + r | 0; o = n & 65535; if (o << 16 >> 16 >= 40) break; else n = n << 16 >> 16; } } else m = -1; b[f + (q << 1) >> 1] = l; if (m << 16 >> 16 > p << 16 >> 16) b[h >> 1] = q; else m = p; q = q + 1 | 0; if ((q & 65535) << 16 >> 16 == g << 16 >> 16) break; else p = m; } l = b[h >> 1] | 0; b[h + (d << 1) >> 1] = l; if (g << 16 >> 16 > 1) m = 1; else { i = y; return } do { f = l + 1 << 16 >> 16; l = f << 16 >> 16 >= g << 16 >> 16 ? 0 : f; b[h + (m << 1) >> 1] = l; b[h + (m + d << 1) >> 1] = l; m = m + 1 | 0; } while ((m & 65535) << 16 >> 16 != g << 16 >> 16); i = y; return } function sd(a) { a = a | 0; var d = 0; if (!a) { a = -1; return a | 0 } c[a >> 2] = 0; d = Je(12) | 0; if (!d) { a = -1; return a | 0 } b[d >> 1] = 8; c[a >> 2] = d; b[d + 2 >> 1] = 3; b[d + 4 >> 1] = 0; c[d + 8 >> 2] = 0; a = 0; return a | 0 } function td(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function ud(a, d, e) { a = a | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0; do if ((d | 0) == 8) { f = a + 2 | 0; g = (b[f >> 1] | 0) + -1 << 16 >> 16; b[f >> 1] = g; d = a + 8 | 0; if (!(c[d >> 2] | 0)) { c[e >> 2] = 1; b[f >> 1] = 3; break } h = a + 4 | 0; if (g << 16 >> 16 > 2 & (b[h >> 1] | 0) > 0) { c[e >> 2] = 2; b[h >> 1] = (b[h >> 1] | 0) + -1 << 16 >> 16; break } if (!(g << 16 >> 16)) { c[e >> 2] = 2; b[f >> 1] = b[a >> 1] | 0; break } else { c[e >> 2] = 3; break } } else { b[a + 2 >> 1] = b[a >> 1] | 0; c[e >> 2] = 0; d = a + 8 | 0; } while (0); c[d >> 2] = c[e >> 2]; return } function vd(a, b, d) { a = a | 0; b = b | 0; d = d | 0; var e = 0, f = 0, g = 0; if (!a) { a = -1; return a | 0 } c[a >> 2] = 0; d = Je(12) | 0; e = d; if (!d) { a = -1; return a | 0 } c[d >> 2] = 0; f = d + 4 | 0; c[f >> 2] = 0; g = d + 8 | 0; c[g >> 2] = b; if ((dd(d) | 0) << 16 >> 16 == 0 ? (ac(f, c[g >> 2] | 0) | 0) << 16 >> 16 == 0 : 0) { ed(c[d >> 2] | 0) | 0; cc(c[f >> 2] | 0) | 0; c[a >> 2] = e; a = 0; return a | 0 } fd(d); bc(f); Ke(d); a = -1; return a | 0 } function wd(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; fd(b); bc((c[a >> 2] | 0) + 4 | 0); Ke(c[a >> 2] | 0); c[a >> 2] = 0; return } function xd(a, d, f, g, h) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; var j = 0, k = 0, l = 0, m = 0, n = 0; m = i; i = i + 448 | 0; k = m + 320 | 0; l = m; Qe(g | 0, 0, 488) | 0; j = 0; do { n = f + (j << 1) | 0; b[n >> 1] = (e[n >> 1] | 0) & 65528; j = j + 1 | 0; } while ((j | 0) != 160); gd(c[a >> 2] | 0, f, 160); n = a + 4 | 0; dc(c[n >> 2] | 0, d, f, k, h, l) | 0; hd(c[h >> 2] | 0, k, g, (c[n >> 2] | 0) + 2392 | 0); i = m; return } function yd(a, c, d, e, f, g, h, j, k, l, m, n, o, p, q, r) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; p = p | 0; q = q | 0; r = r | 0; var s = 0, t = 0, u = 0; u = i; i = i + 48 | 0; s = u + 22 | 0; t = u; Ie(f, (a & -2 | 0) == 6 ? d : c, s); Ie(f, e, t); d = m; c = s; f = d + 22 | 0; do { b[d >> 1] = b[c >> 1] | 0; d = d + 2 | 0; c = c + 2 | 0; } while ((d | 0) < (f | 0)); He(g, m, o, 40, l, 0); He(t, o, o, 40, l, 0); Be(g, h, q, 40); d = n; c = q; f = d + 80 | 0; do { b[d >> 1] = b[c >> 1] | 0; d = d + 2 | 0; c = c + 2 | 0; } while ((d | 0) < (f | 0)); He(g, n, r, 40, j, 0); Be(s, r, p, 40); He(t, p, p, 40, k, 0); i = u; return } function zd(a, c, d, f, g, h, i, j, k, l, m, n, o, p, q, r, s) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; j = j | 0; k = k | 0; l = l | 0; m = m | 0; n = n | 0; o = o | 0; p = p | 0; q = q | 0; r = r | 0; s = s | 0; var t = 0, u = 0, v = 0, w = 0, x = 0; if ((c | 0) == 7) { v = 11; c = f << 16 >> 16 >>> 1 & 65535; t = 2; } else { v = 13; c = f; t = 1; } b[r >> 1] = f << 16 >> 16 < 13017 ? f : 13017; u = d << 16 >> 16; q = q + (u << 1) | 0; r = c << 16 >> 16; g = g << 16 >> 16; d = 20; c = k; s = q; while (1) { k = s + 2 | 0; x = Z(b[s >> 1] | 0, r) | 0; w = Z(b[k >> 1] | 0, r) | 0; x = (Z(b[c >> 1] | 0, g) | 0) + x << 1; w = (Z(b[c + 2 >> 1] | 0, g) | 0) + w << 1 << t; b[s >> 1] = ((x << t) + 32768 | 0) >>> 16; b[k >> 1] = (w + 32768 | 0) >>> 16; d = d + -1 << 16 >> 16; if (!(d << 16 >> 16)) break; else { c = c + 4 | 0; s = s + 4 | 0; } } c = f << 16 >> 16; He(h, q, i + (u << 1) | 0, 40, n, 1); d = 30; s = 0; while (1) { w = d + u | 0; b[o + (s << 1) >> 1] = (e[a + (w << 1) >> 1] | 0) - (e[i + (w << 1) >> 1] | 0); w = Z(b[l + (d << 1) >> 1] | 0, c) | 0; x = (Z(b[m + (d << 1) >> 1] | 0, g) | 0) >> v; b[p + (s << 1) >> 1] = (e[j + (d << 1) >> 1] | 0) - (w >>> 14) - x; s = s + 1 | 0; if ((s | 0) == 10) break; else d = d + 1 | 0; } return } function Ad(a) { a = a | 0; var d = 0; if (!a) { a = -1; return a | 0 } c[a >> 2] = 0; d = Je(16) | 0; if (!d) { a = -1; return a | 0 } ;b[d >> 1] = 0; b[d + 2 >> 1] = 0; b[d + 4 >> 1] = 0; b[d + 6 >> 1] = 0; b[d + 8 >> 1] = 0; b[d + 10 >> 1] = 0; b[d + 12 >> 1] = 0; b[d + 14 >> 1] = 0; c[a >> 2] = d; a = 0; return a | 0 } function Bd(a) { a = a | 0; if (!a) { a = -1; return a | 0 } ;b[a >> 1] = 0; b[a + 2 >> 1] = 0; b[a + 4 >> 1] = 0; b[a + 6 >> 1] = 0; b[a + 8 >> 1] = 0; b[a + 10 >> 1] = 0; b[a + 12 >> 1] = 0; b[a + 14 >> 1] = 0; a = 0; return a | 0 } function Cd(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function Dd(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var f = 0, g = 0, h = 0, i = 0; f = e[c + 6 >> 1] | 0; d = e[c + 8 >> 1] | 0; g = f - d | 0; g = (g & 65535 | 0) != 32767 ? g & 65535 : 32767; h = e[c + 10 >> 1] | 0; d = d - h | 0; g = (d << 16 >> 16 | 0) < (g << 16 >> 16 | 0) ? d & 65535 : g; d = e[c + 12 >> 1] | 0; h = h - d | 0; g = (h << 16 >> 16 | 0) < (g << 16 >> 16 | 0) ? h & 65535 : g; h = e[c + 14 >> 1] | 0; d = d - h | 0; g = (d << 16 >> 16 | 0) < (g << 16 >> 16 | 0) ? d & 65535 : g; h = h - (e[c + 16 >> 1] | 0) | 0; d = b[c + 2 >> 1] | 0; i = e[c + 4 >> 1] | 0; c = (d & 65535) - i | 0; c = (c & 65535 | 0) != 32767 ? c & 65535 : 32767; f = i - f | 0; if (((h << 16 >> 16 | 0) < (g << 16 >> 16 | 0) ? h & 65535 : g) << 16 >> 16 < 1500 ? 1 : (((f << 16 >> 16 | 0) < (c << 16 >> 16 | 0) ? f & 65535 : c) << 16 >> 16 | 0) < ((d << 16 >> 16 > 32e3 ? 600 : d << 16 >> 16 > 30500 ? 800 : 1100) | 0)) { h = (b[a >> 1] | 0) + 1 << 16 >> 16; i = h << 16 >> 16 > 11; b[a >> 1] = i ? 12 : h; return i & 1 | 0 } else { b[a >> 1] = 0; return 0 } return 0 } function Ed(a, c, d) { a = a | 0; c = c | 0; d = d | 0; c = De(c, 3, d) | 0; c = Rd(c, b[a + 2 >> 1] | 0, d) | 0; c = Rd(c, b[a + 4 >> 1] | 0, d) | 0; c = Rd(c, b[a + 6 >> 1] | 0, d) | 0; c = Rd(c, b[a + 8 >> 1] | 0, d) | 0; c = Rd(c, b[a + 10 >> 1] | 0, d) | 0; c = Rd(c, b[a + 12 >> 1] | 0, d) | 0; return (Rd(c, b[a + 14 >> 1] | 0, d) | 0) << 16 >> 16 > 15565 | 0 } function Fd(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var e = 0; d = a + 4 | 0; b[a + 2 >> 1] = b[d >> 1] | 0; e = a + 6 | 0; b[d >> 1] = b[e >> 1] | 0; d = a + 8 | 0; b[e >> 1] = b[d >> 1] | 0; e = a + 10 | 0; b[d >> 1] = b[e >> 1] | 0; d = a + 12 | 0; b[e >> 1] = b[d >> 1] | 0; a = a + 14 | 0; b[d >> 1] = b[a >> 1] | 0; b[a >> 1] = c << 16 >> 16 >>> 3; return } function Gd(a) { a = a | 0; var d = 0, e = 0, f = 0; if (!a) { f = -1; return f | 0 } c[a >> 2] = 0; d = Je(128) | 0; if (!d) { f = -1; return f | 0 } e = d + 72 | 0; f = e + 46 | 0; do { b[e >> 1] = 0; e = e + 2 | 0; } while ((e | 0) < (f | 0)); b[d >> 1] = 150; b[d + 36 >> 1] = 150; b[d + 18 >> 1] = 150; b[d + 54 >> 1] = 0; b[d + 2 >> 1] = 150; b[d + 38 >> 1] = 150; b[d + 20 >> 1] = 150; b[d + 56 >> 1] = 0; b[d + 4 >> 1] = 150; b[d + 40 >> 1] = 150; b[d + 22 >> 1] = 150; b[d + 58 >> 1] = 0; b[d + 6 >> 1] = 150; b[d + 42 >> 1] = 150; b[d + 24 >> 1] = 150; b[d + 60 >> 1] = 0; b[d + 8 >> 1] = 150; b[d + 44 >> 1] = 150; b[d + 26 >> 1] = 150; b[d + 62 >> 1] = 0; b[d + 10 >> 1] = 150; b[d + 46 >> 1] = 150; b[d + 28 >> 1] = 150; b[d + 64 >> 1] = 0; b[d + 12 >> 1] = 150; b[d + 48 >> 1] = 150; b[d + 30 >> 1] = 150; b[d + 66 >> 1] = 0; b[d + 14 >> 1] = 150; b[d + 50 >> 1] = 150; b[d + 32 >> 1] = 150; b[d + 68 >> 1] = 0; b[d + 16 >> 1] = 150; b[d + 52 >> 1] = 150; b[d + 34 >> 1] = 150; b[d + 70 >> 1] = 0; b[d + 118 >> 1] = 13106; b[d + 120 >> 1] = 0; b[d + 122 >> 1] = 0; b[d + 124 >> 1] = 0; b[d + 126 >> 1] = 13106; c[a >> 2] = d; f = 0; return f | 0 } function Hd(a) { a = a | 0; var c = 0, d = 0; if (!a) { d = -1; return d | 0 } c = a + 72 | 0; d = c + 46 | 0; do { b[c >> 1] = 0; c = c + 2 | 0; } while ((c | 0) < (d | 0)); b[a >> 1] = 150; b[a + 36 >> 1] = 150; b[a + 18 >> 1] = 150; b[a + 54 >> 1] = 0; b[a + 2 >> 1] = 150; b[a + 38 >> 1] = 150; b[a + 20 >> 1] = 150; b[a + 56 >> 1] = 0; b[a + 4 >> 1] = 150; b[a + 40 >> 1] = 150; b[a + 22 >> 1] = 150; b[a + 58 >> 1] = 0; b[a + 6 >> 1] = 150; b[a + 42 >> 1] = 150; b[a + 24 >> 1] = 150; b[a + 60 >> 1] = 0; b[a + 8 >> 1] = 150; b[a + 44 >> 1] = 150; b[a + 26 >> 1] = 150; b[a + 62 >> 1] = 0; b[a + 10 >> 1] = 150; b[a + 46 >> 1] = 150; b[a + 28 >> 1] = 150; b[a + 64 >> 1] = 0; b[a + 12 >> 1] = 150; b[a + 48 >> 1] = 150; b[a + 30 >> 1] = 150; b[a + 66 >> 1] = 0; b[a + 14 >> 1] = 150; b[a + 50 >> 1] = 150; b[a + 32 >> 1] = 150; b[a + 68 >> 1] = 0; b[a + 16 >> 1] = 150; b[a + 52 >> 1] = 150; b[a + 34 >> 1] = 150; b[a + 70 >> 1] = 0; b[a + 118 >> 1] = 13106; b[a + 120 >> 1] = 0; b[a + 122 >> 1] = 0; b[a + 124 >> 1] = 0; b[a + 126 >> 1] = 13106; d = 0; return d | 0 } function Id(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function Jd(a, c) { a = a | 0; c = c | 0; b[a + 118 >> 1] = c; return } function Kd(a, d, f, g) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; var h = 0; f = Ce(f, g) | 0; if (f << 16 >> 16 <= 0) return; f = f << 16 >> 16; if ((f * 21298 | 0) == 1073741824) { c[g >> 2] = 1; h = 2147483647; } else h = f * 42596 | 0; f = d - h | 0; if (((f ^ d) & (h ^ d) | 0) < 0) { c[g >> 2] = 1; f = (d >>> 31) + 2147483647 | 0; } if ((f | 0) <= 0) return; a = a + 104 | 0; b[a >> 1] = e[a >> 1] | 0 | 16384; return } function Ld(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var e = 0; a = a + 104 | 0; e = De(b[a >> 1] | 0, 1, d) | 0; b[a >> 1] = e; if (!(c << 16 >> 16)) return; b[a >> 1] = (De(e, 1, d) | 0) & 65535 | 8192; return } function Md(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var f = 0, g = 0, h = 0; g = a + 112 | 0; f = Ge(b[g >> 1] | 0, b[c >> 1] | 0, d) | 0; f = (f & 65535) - ((f & 65535) >>> 15 & 65535) | 0; f = ((f << 16 >> 31 ^ f) & 65535) << 16 >> 16 < 4; h = b[c >> 1] | 0; b[g >> 1] = h; c = c + 2 | 0; h = Ge(h, b[c >> 1] | 0, d) | 0; h = (h & 65535) - ((h & 65535) >>> 15 & 65535) | 0; f = ((h << 16 >> 31 ^ h) & 65535) << 16 >> 16 < 4 ? (f ? 2 : 1) : f & 1; b[g >> 1] = b[c >> 1] | 0; g = a + 102 | 0; b[g >> 1] = De(b[g >> 1] | 0, 1, d) | 0; c = a + 110 | 0; if ((Rd(b[c >> 1] | 0, f, d) | 0) << 16 >> 16 <= 3) { b[c >> 1] = f; return } b[g >> 1] = e[g >> 1] | 0 | 16384; b[c >> 1] = f; return } function Nd(a, d, f) { a = a | 0; d = d | 0; f = f | 0; var g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0; D = i; i = i + 352 | 0; n = D + 24 | 0; B = D; k = 0; h = 0; do { g = b[d + (k + -40 << 1) >> 1] | 0; g = Z(g, g) | 0; if ((g | 0) != 1073741824) { j = (g << 1) + h | 0; if ((g ^ h | 0) > 0 & (j ^ h | 0) < 0) { c[f >> 2] = 1; h = (h >>> 31) + 2147483647 | 0; } else h = j; } else { c[f >> 2] = 1; h = 2147483647; } k = k + 1 | 0; } while ((k | 0) != 160); o = h; if ((343039 - o & o | 0) < 0) { c[f >> 2] = 1; h = (o >>> 31) + 2147483647 | 0; } else h = o + -343040 | 0; if ((h | 0) < 0) { A = a + 102 | 0; b[A >> 1] = e[A >> 1] & 16383; } m = o + -15e3 | 0; p = (14999 - o & o | 0) < 0; if (p) { c[f >> 2] = 1; j = (o >>> 31) + 2147483647 | 0; } else j = m; if ((j | 0) < 0) { A = a + 108 | 0; b[A >> 1] = e[A >> 1] & 16383; } g = a + 72 | 0; l = a + 74 | 0; j = b[g >> 1] | 0; k = b[l >> 1] | 0; h = 0; do { A = h << 2; y = Ge((b[d + (A << 1) >> 1] | 0) >>> 2 & 65535, ((j << 16 >> 16) * 21955 | 0) >>> 15 & 65535, f) | 0; v = ((y << 16 >> 16) * 21955 | 0) >>> 15 & 65535; u = Rd(j, v, f) | 0; x = A | 1; z = Ge((b[d + (x << 1) >> 1] | 0) >>> 2 & 65535, ((k << 16 >> 16) * 6390 | 0) >>> 15 & 65535, f) | 0; w = ((z << 16 >> 16) * 6390 | 0) >>> 15 & 65535; j = Rd(k, w, f) | 0; b[n + (A << 1) >> 1] = Rd(u, j, f) | 0; b[n + (x << 1) >> 1] = Ge(u, j, f) | 0; x = A | 2; j = Ge((b[d + (x << 1) >> 1] | 0) >>> 2 & 65535, v, f) | 0; y = Rd(y, ((j << 16 >> 16) * 21955 | 0) >>> 15 & 65535, f) | 0; A = A | 3; k = Ge((b[d + (A << 1) >> 1] | 0) >>> 2 & 65535, w, f) | 0; z = Rd(z, ((k << 16 >> 16) * 6390 | 0) >>> 15 & 65535, f) | 0; b[n + (x << 1) >> 1] = Rd(y, z, f) | 0; b[n + (A << 1) >> 1] = Ge(y, z, f) | 0; h = h + 1 | 0; } while ((h | 0) != 40); b[g >> 1] = j; b[l >> 1] = k; k = a + 76 | 0; j = a + 80 | 0; h = 0; do { A = h << 2; Od(n + (A << 1) | 0, n + ((A | 2) << 1) | 0, k, f); Od(n + ((A | 1) << 1) | 0, n + ((A | 3) << 1) | 0, j, f); h = h + 1 | 0; } while ((h | 0) != 40); k = a + 84 | 0; j = a + 86 | 0; h = a + 92 | 0; g = 0; do { A = g << 3; Pd(n + (A << 1) | 0, n + ((A | 4) << 1) | 0, k, f); Pd(n + ((A | 2) << 1) | 0, n + ((A | 6) << 1) | 0, j, f); Pd(n + ((A | 3) << 1) | 0, n + ((A | 7) << 1) | 0, h, f); g = g + 1 | 0; } while ((g | 0) != 20); k = a + 88 | 0; j = a + 90 | 0; h = 0; do { A = h << 4; Pd(n + (A << 1) | 0, n + ((A | 8) << 1) | 0, k, f); Pd(n + ((A | 4) << 1) | 0, n + ((A | 12) << 1) | 0, j, f); h = h + 1 | 0; } while ((h | 0) != 10); t = Qd(n, a + 70 | 0, 32, 40, 4, 1, 15, f) | 0; b[B + 16 >> 1] = t; u = Qd(n, a + 68 | 0, 16, 20, 8, 7, 16, f) | 0; b[B + 14 >> 1] = u; v = Qd(n, a + 66 | 0, 16, 20, 8, 3, 16, f) | 0; b[B + 12 >> 1] = v; w = Qd(n, a + 64 | 0, 16, 20, 8, 2, 16, f) | 0; b[B + 10 >> 1] = w; x = Qd(n, a + 62 | 0, 16, 20, 8, 6, 16, f) | 0; b[B + 8 >> 1] = x; y = Qd(n, a + 60 | 0, 8, 10, 16, 4, 16, f) | 0; b[B + 6 >> 1] = y; z = Qd(n, a + 58 | 0, 8, 10, 16, 12, 16, f) | 0; b[B + 4 >> 1] = z; A = Qd(n, a + 56 | 0, 8, 10, 16, 8, 16, f) | 0; b[B + 2 >> 1] = A; s = Qd(n, a + 54 | 0, 8, 10, 16, 0, 16, f) | 0; b[B >> 1] = s; k = 0; g = 0; do { j = a + (g << 1) | 0; d = qe(b[j >> 1] | 0) | 0; j = b[j >> 1] | 0; h = d << 16 >> 16; if (d << 16 >> 16 < 0) { l = 0 - h << 16; if ((l | 0) < 983040) l = j << 16 >> 16 >> (l >> 16) & 65535; else l = 0; } else { l = j << 16 >> 16; j = l << h; if ((j << 16 >> 16 >> h | 0) == (l | 0)) l = j & 65535; else l = (l >>> 15 ^ 32767) & 65535; } j = Td(De(b[B + (g << 1) >> 1] | 0, 1, f) | 0, l) | 0; r = Ge(d, 5, f) | 0; h = r << 16 >> 16; if (r << 16 >> 16 < 0) { l = 0 - h << 16; if ((l | 0) < 983040) l = j << 16 >> 16 >> (l >> 16); else l = 0; } else { j = j << 16 >> 16; l = j << h; if ((l << 16 >> 16 >> h | 0) != (j | 0)) l = j >>> 15 ^ 32767; } l = l << 16 >> 16; l = Z(l, l) | 0; if ((l | 0) != 1073741824) { j = (l << 1) + k | 0; if ((l ^ k | 0) > 0 & (j ^ k | 0) < 0) { c[f >> 2] = 1; k = (k >>> 31) + 2147483647 | 0; } else k = j; } else { c[f >> 2] = 1; k = 2147483647; } g = g + 1 | 0; } while ((g | 0) != 9); r = k << 6; k = (((r >> 6 | 0) == (k | 0) ? r : k >> 31 ^ 2147418112) >> 16) * 3641 >> 15; if ((k | 0) > 32767) { c[f >> 2] = 1; k = 32767; } r = b[a >> 1] | 0; l = r << 16 >> 16; q = b[a + 2 >> 1] | 0; j = (q << 16 >> 16) + l | 0; if ((q ^ r) << 16 >> 16 > -1 & (j ^ l | 0) < 0) { c[f >> 2] = 1; j = (l >>> 31) + 2147483647 | 0; } r = b[a + 4 >> 1] | 0; l = r + j | 0; if ((r ^ j | 0) > -1 & (l ^ j | 0) < 0) { c[f >> 2] = 1; l = (j >>> 31) + 2147483647 | 0; } r = b[a + 6 >> 1] | 0; j = r + l | 0; if ((r ^ l | 0) > -1 & (j ^ l | 0) < 0) { c[f >> 2] = 1; j = (l >>> 31) + 2147483647 | 0; } r = b[a + 8 >> 1] | 0; l = r + j | 0; if ((r ^ j | 0) > -1 & (l ^ j | 0) < 0) { c[f >> 2] = 1; l = (j >>> 31) + 2147483647 | 0; } r = b[a + 10 >> 1] | 0; j = r + l | 0; if ((r ^ l | 0) > -1 & (j ^ l | 0) < 0) { c[f >> 2] = 1; j = (l >>> 31) + 2147483647 | 0; } r = b[a + 12 >> 1] | 0; l = r + j | 0; if ((r ^ j | 0) > -1 & (l ^ j | 0) < 0) { c[f >> 2] = 1; l = (j >>> 31) + 2147483647 | 0; } r = b[a + 14 >> 1] | 0; j = r + l | 0; if ((r ^ l | 0) > -1 & (j ^ l | 0) < 0) { c[f >> 2] = 1; j = (l >>> 31) + 2147483647 | 0; } r = b[a + 16 >> 1] | 0; l = r + j | 0; if ((r ^ j | 0) > -1 & (l ^ j | 0) < 0) { c[f >> 2] = 1; l = (j >>> 31) + 2147483647 | 0; } q = l << 13; q = ((q >> 13 | 0) == (l | 0) ? q : l >> 31 ^ 2147418112) >>> 16 & 65535; l = (Z((Ge(q, 0, f) | 0) << 16 >> 16, -2808) | 0) >> 15; if ((l | 0) > 32767) { c[f >> 2] = 1; l = 32767; } n = Rd(l & 65535, 1260, f) | 0; r = a + 100 | 0; l = De(b[r >> 1] | 0, 1, f) | 0; if ((k << 16 >> 16 | 0) > ((n << 16 >> 16 < 720 ? 720 : n << 16 >> 16) | 0)) l = (l & 65535 | 16384) & 65535; b[r >> 1] = l; if (p) { c[f >> 2] = 1; m = (o >>> 31) + 2147483647 | 0; } h = b[a + 118 >> 1] | 0; p = a + 126 | 0; l = b[p >> 1] | 0; g = l << 16 >> 16 < 19660; g = h << 16 >> 16 < l << 16 >> 16 ? (g ? 2621 : 6553) : g ? 2621 : 655; d = l & 65535; k = d << 16; l = Z(g, l << 16 >> 16) | 0; if ((l | 0) == 1073741824) { c[f >> 2] = 1; l = 2147483647; } else l = l << 1; j = k - l | 0; if (((j ^ k) & (l ^ k) | 0) < 0) { c[f >> 2] = 1; j = (d >>> 15) + 2147483647 | 0; } k = Z(g, h << 16 >> 16) | 0; do if ((k | 0) == 1073741824) { c[f >> 2] = 1; l = 2147483647; } else { l = j + (k << 1) | 0; if (!((j ^ k | 0) > 0 & (l ^ j | 0) < 0)) break; c[f >> 2] = 1; l = (j >>> 31) + 2147483647 | 0; } while (0); d = Ce(l, f) | 0; o = (m | 0) > -1; b[p >> 1] = o ? (d << 16 >> 16 < 13106 ? 13106 : d) : 13106; d = a + 106 | 0; b[d >> 1] = De(b[d >> 1] | 0, 1, f) | 0; j = a + 108 | 0; l = De(b[j >> 1] | 0, 1, f) | 0; b[j >> 1] = l; k = b[p >> 1] | 0; a:do if (o) { do if (k << 16 >> 16 > 19660) b[d >> 1] = e[d >> 1] | 16384; else { if (k << 16 >> 16 > 16383) break; k = a + 116 | 0; l = 0; break a } while (0); b[j >> 1] = l & 65535 | 16384; C = 62; } else C = 62; while (0); do if ((C | 0) == 62) { l = a + 116 | 0; if (k << 16 >> 16 <= 22936) { k = l; l = 0; break } k = l; l = Rd(b[l >> 1] | 0, 1, f) | 0; } while (0); b[k >> 1] = l; if ((b[d >> 1] & 32640) != 32640) { n = (b[j >> 1] & 32767) == 32767; b[a + 122 >> 1] = n & 1; if (n) C = 67; } else { b[a + 122 >> 1] = 1; C = 67; } do if ((C | 0) == 67) { k = a + 98 | 0; if ((b[k >> 1] | 0) >= 5) break; b[k >> 1] = 5; } while (0); n = a + 102 | 0; do if ((b[n >> 1] & 24576) == 24576) C = 71; else { if ((b[a + 104 >> 1] & 31744) == 31744) { C = 71; break } if (!(b[r >> 1] & 32640)) { b[a + 98 >> 1] = 20; j = 32767; break } else { j = s; k = 0; l = 0; } while (1) { g = b[a + 18 + (k << 1) >> 1] | 0; h = j << 16 >> 16 > g << 16 >> 16; m = h ? j : g; j = h ? g : j; m = m << 16 >> 16 < 184 ? 184 : m; j = j << 16 >> 16 < 184 ? 184 : j; g = qe(j) | 0; h = g << 16 >> 16; do if (g << 16 >> 16 < 0) { d = 0 - h << 16; if ((d | 0) >= 983040) { d = 0; break } d = j << 16 >> 16 >> (d >> 16) & 65535; } else { d = j << 16 >> 16; j = d << h; if ((j << 16 >> 16 >> h | 0) == (d | 0)) { d = j & 65535; break } d = (d >>> 15 ^ 32767) & 65535; } while (0); m = Td(De(m, 1, f) | 0, d) | 0; l = Rd(l, De(m, Ge(8, g, f) | 0, f) | 0, f) | 0; k = k + 1 | 0; if ((k | 0) == 9) break; j = b[B + (k << 1) >> 1] | 0; } if (l << 16 >> 16 > 1e3) { b[a + 98 >> 1] = 20; j = 32767; break } j = b[r >> 1] | 0; k = a + 98 | 0; l = b[k >> 1] | 0; do if (!(j & 16384)) C = 86; else { if (!(l << 16 >> 16)) { l = j; break } l = Ge(l, 1, f) | 0; b[k >> 1] = l; C = 86; } while (0); if ((C | 0) == 86) { if (l << 16 >> 16 == 20) { j = 32767; break } l = b[r >> 1] | 0; } j = (l & 16384) == 0 ? 16383 : 3276; } while (0); if ((C | 0) == 71) { b[a + 98 >> 1] = 20; j = 32767; } k = s; l = 0; while (1) { m = a + 18 + (l << 1) | 0; d = oe(j, Ge(k, b[m >> 1] | 0, f) | 0, f) | 0; b[m >> 1] = Rd(b[m >> 1] | 0, d, f) | 0; l = l + 1 | 0; if ((l | 0) == 9) break; k = b[B + (l << 1) >> 1] | 0; } do if (!(b[r >> 1] & 30720)) { if (b[n >> 1] & 30720) { C = 95; break } if (!(b[a + 114 >> 1] | 0)) { h = 2097; g = 1638; d = 2; } else C = 95; } else C = 95; while (0); do if ((C | 0) == 95) { if ((b[a + 98 >> 1] | 0) == 0 ? (b[a + 114 >> 1] | 0) == 0 : 0) { h = 1867; g = 491; d = 2; break } h = 1638; g = 0; d = 0; } while (0); j = 0; do { k = a + (j << 1) | 0; l = Ge(b[a + 36 + (j << 1) >> 1] | 0, b[k >> 1] | 0, f) | 0; if (l << 16 >> 16 < 0) { l = oe(h, l, f) | 0; l = Rd(-2, Rd(b[k >> 1] | 0, l, f) | 0, f) | 0; l = l << 16 >> 16 < 40 ? 40 : l; } else { l = oe(g, l, f) | 0; l = Rd(d, Rd(b[k >> 1] | 0, l, f) | 0, f) | 0; l = l << 16 >> 16 > 16e3 ? 16e3 : l; } b[k >> 1] = l; j = j + 1 | 0; } while ((j | 0) != 9); b[a + 36 >> 1] = s; b[a + 38 >> 1] = A; b[a + 40 >> 1] = z; b[a + 42 >> 1] = y; b[a + 44 >> 1] = x; b[a + 46 >> 1] = w; b[a + 48 >> 1] = v; b[a + 50 >> 1] = u; b[a + 52 >> 1] = t; k = q << 16 >> 16 > 100; j = k ? 7 : 4; k = k ? 4 : 5; if (!o) { b[a + 94 >> 1] = 0; b[a + 96 >> 1] = 0; b[a + 114 >> 1] = 0; b[a + 116 >> 1] = 0; f = 0; a = a + 120 | 0; b[a >> 1] = f; i = D; return f | 0 } h = a + 114 | 0; g = b[h >> 1] | 0; do if ((b[a + 116 >> 1] | 0) <= 100) { if (g << 16 >> 16) break; g = b[r >> 1] | 0; do if (!(g & 16368)) { if ((b[p >> 1] | 0) > 21298) g = 1; else break; a = a + 120 | 0; b[a >> 1] = g; i = D; return g | 0 } while (0); h = a + 94 | 0; if (!(g & 16384)) { b[h >> 1] = 0; g = a + 96 | 0; h = b[g >> 1] | 0; if (h << 16 >> 16 <= 0) { f = 0; a = a + 120 | 0; b[a >> 1] = f; i = D; return f | 0 } b[g >> 1] = Ge(h, 1, f) | 0; f = 1; a = a + 120 | 0; b[a >> 1] = f; i = D; return f | 0 } else { f = Rd(b[h >> 1] | 0, 1, f) | 0; b[h >> 1] = f; if ((f << 16 >> 16 | 0) < (k | 0)) { f = 1; a = a + 120 | 0; b[a >> 1] = f; i = D; return f | 0 } b[a + 96 >> 1] = j; f = 1; a = a + 120 | 0; b[a >> 1] = f; i = D; return f | 0 } } else { if (g << 16 >> 16 >= 250) break; b[h >> 1] = 250; g = 250; } while (0); b[a + 94 >> 1] = 4; b[h >> 1] = Ge(g, 1, f) | 0; f = 1; a = a + 120 | 0; b[a >> 1] = f; i = D; return f | 0 } function Od(a, d, e, f) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; var g = 0, h = 0, i = 0; g = (b[e >> 1] | 0) * 21955 >> 15; if ((g | 0) > 32767) { c[f >> 2] = 1; g = 32767; } h = Ge(b[a >> 1] | 0, g & 65535, f) | 0; g = (h << 16 >> 16) * 21955 >> 15; if ((g | 0) > 32767) { c[f >> 2] = 1; g = 32767; } i = Rd(b[e >> 1] | 0, g & 65535, f) | 0; b[e >> 1] = h; e = e + 2 | 0; g = (b[e >> 1] | 0) * 6390 >> 15; if ((g | 0) > 32767) { c[f >> 2] = 1; g = 32767; } h = Ge(b[d >> 1] | 0, g & 65535, f) | 0; g = (h << 16 >> 16) * 6390 >> 15; if ((g | 0) > 32767) { c[f >> 2] = 1; g = 32767; } g = Rd(b[e >> 1] | 0, g & 65535, f) | 0; b[e >> 1] = h; b[a >> 1] = De(Rd(i, g, f) | 0, 1, f) | 0; b[d >> 1] = De(Ge(i, g, f) | 0, 1, f) | 0; return } function Pd(a, d, e, f) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; var g = 0, h = 0; g = (b[e >> 1] | 0) * 13363 >> 15; if ((g | 0) > 32767) { c[f >> 2] = 1; g = 32767; } h = Ge(b[d >> 1] | 0, g & 65535, f) | 0; g = (h << 16 >> 16) * 13363 >> 15; if ((g | 0) > 32767) { c[f >> 2] = 1; g = 32767; } g = Rd(b[e >> 1] | 0, g & 65535, f) | 0; b[e >> 1] = h; b[d >> 1] = De(Ge(b[a >> 1] | 0, g, f) | 0, 1, f) | 0; b[a >> 1] = De(Rd(b[a >> 1] | 0, g, f) | 0, 1, f) | 0; return } function Qd(a, d, e, f, g, h, i, j) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; j = j | 0; var k = 0, l = 0, m = 0, n = 0, o = 0, p = 0; if (e << 16 >> 16 < f << 16 >> 16) { n = g << 16 >> 16; k = h << 16 >> 16; o = e << 16 >> 16; l = 0; do { p = b[a + ((Z(o, n) | 0) + k << 1) >> 1] | 0; p = (p & 65535) - ((p & 65535) >>> 15 & 65535) | 0; p = (p << 16 >> 31 ^ p) << 16; m = (p >> 15) + l | 0; if ((p >> 16 ^ l | 0) > 0 & (m ^ l | 0) < 0) { c[j >> 2] = 1; l = (l >>> 31) + 2147483647 | 0; } else l = m; o = o + 1 | 0; } while ((o & 65535) << 16 >> 16 != f << 16 >> 16); o = l; } else o = 0; l = b[d >> 1] | 0; p = Ge(16, i, j) | 0; k = p << 16 >> 16; if (p << 16 >> 16 > 0) { f = l << k; if ((f >> k | 0) != (l | 0)) f = l >> 31 ^ 2147483647; } else { k = 0 - k << 16; if ((k | 0) < 2031616) f = l >> (k >> 16); else f = 0; } k = f + o | 0; if ((f ^ o | 0) > -1 & (k ^ o | 0) < 0) { c[j >> 2] = 1; k = (o >>> 31) + 2147483647 | 0; } p = i << 16 >> 16; i = i << 16 >> 16 > 0; if (i) { f = o << p; if ((f >> p | 0) != (o | 0)) f = o >> 31 ^ 2147483647; } else { f = 0 - p << 16; if ((f | 0) < 2031616) f = o >> (f >> 16); else f = 0; } b[d >> 1] = f >>> 16; if (e << 16 >> 16 > 0) { n = g << 16 >> 16; l = h << 16 >> 16; m = 0; do { h = b[a + ((Z(m, n) | 0) + l << 1) >> 1] | 0; h = (h & 65535) - ((h & 65535) >>> 15 & 65535) | 0; h = (h << 16 >> 31 ^ h) << 16; f = (h >> 15) + k | 0; if ((h >> 16 ^ k | 0) > 0 & (f ^ k | 0) < 0) { c[j >> 2] = 1; k = (k >>> 31) + 2147483647 | 0; } else k = f; m = m + 1 | 0; } while ((m & 65535) << 16 >> 16 != e << 16 >> 16) } if (i) { f = k << p; if ((f >> p | 0) == (k | 0)) { j = f; j = j >>> 16; j = j & 65535; return j | 0 } j = k >> 31 ^ 2147483647; j = j >>> 16; j = j & 65535; return j | 0 } else { f = 0 - p << 16; if ((f | 0) >= 2031616) { j = 0; j = j >>> 16; j = j & 65535; return j | 0 } j = k >> (f >> 16); j = j >>> 16; j = j & 65535; return j | 0 } return 0 } function Rd(a, b, d) { a = a | 0; b = b | 0; d = d | 0; a = (b << 16 >> 16) + (a << 16 >> 16) | 0; if ((a | 0) <= 32767) { if ((a | 0) < -32768) { c[d >> 2] = 1; a = -32768; } } else { c[d >> 2] = 1; a = 32767; } return a & 65535 | 0 } function Sd(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0; y = i; i = i + 32 | 0; w = y + 12 | 0; x = y; b[w >> 1] = 1024; b[x >> 1] = 1024; k = b[a + 2 >> 1] | 0; h = b[a + 20 >> 1] | 0; e = ((h + k | 0) >>> 2) + 64512 | 0; b[w + 2 >> 1] = e; h = ((k - h | 0) >>> 2) + 1024 | 0; b[x + 2 >> 1] = h; k = b[a + 4 >> 1] | 0; f = b[a + 18 >> 1] | 0; e = ((f + k | 0) >>> 2) - e | 0; b[w + 4 >> 1] = e; h = ((k - f | 0) >>> 2) + h | 0; b[x + 4 >> 1] = h; f = b[a + 6 >> 1] | 0; k = b[a + 16 >> 1] | 0; e = ((k + f | 0) >>> 2) - e | 0; b[w + 6 >> 1] = e; h = ((f - k | 0) >>> 2) + h | 0; b[x + 6 >> 1] = h; k = b[a + 8 >> 1] | 0; f = b[a + 14 >> 1] | 0; e = ((f + k | 0) >>> 2) - e | 0; b[w + 8 >> 1] = e; h = ((k - f | 0) >>> 2) + h | 0; b[x + 8 >> 1] = h; f = b[a + 10 >> 1] | 0; k = b[a + 12 >> 1] | 0; e = ((k + f | 0) >>> 2) - e | 0; b[w + 10 >> 1] = e; b[x + 10 >> 1] = ((f - k | 0) >>> 2) + h; h = b[3454] | 0; k = h << 16 >> 16; a = b[w + 2 >> 1] | 0; f = (a << 16 >> 16 << 14) + (k << 10) | 0; s = f & -65536; f = (f >>> 1) - (f >> 16 << 15) << 16; v = (((Z(f >> 16, k) | 0) >> 15) + (Z(s >> 16, k) | 0) << 2) + -16777216 | 0; v = (b[w + 4 >> 1] << 14) + v | 0; j = v >> 16; v = (v >>> 1) - (j << 15) << 16; s = (((Z(v >> 16, k) | 0) >> 15) + (Z(j, k) | 0) << 2) - ((f >> 15) + s) | 0; s = (b[w + 6 >> 1] << 14) + s | 0; f = s >> 16; s = (s >>> 1) - (f << 15) << 16; j = (((Z(s >> 16, k) | 0) >> 15) + (Z(f, k) | 0) << 2) - ((v >> 15) + (j << 16)) | 0; j = (b[w + 8 >> 1] << 14) + j | 0; v = j >> 16; f = (e << 16 >> 3) + ((((Z((j >>> 1) - (v << 15) << 16 >> 16, k) | 0) >> 15) + (Z(v, k) | 0) << 1) - ((s >> 15) + (f << 16))) | 0; s = w + 4 | 0; k = w; v = 0; j = 0; e = 0; r = w + 10 | 0; f = (f + 33554432 | 0) >>> 0 < 67108863 ? f >>> 10 & 65535 : (f | 0) > 33554431 ? 32767 : -32768; a:while (1) { t = a << 16 >> 16 << 14; q = k + 6 | 0; p = k + 8 | 0; o = j << 16 >> 16; while (1) { if ((o | 0) >= 60) break a; k = (o & 65535) + 1 << 16 >> 16; l = b[6908 + (k << 16 >> 16 << 1) >> 1] | 0; u = l << 16 >> 16; j = t + (u << 10) | 0; g = j & -65536; j = (j >>> 1) - (j >> 16 << 15) << 16; m = (((Z(j >> 16, u) | 0) >> 15) + (Z(g >> 16, u) | 0) << 2) + -16777216 | 0; n = b[s >> 1] | 0; m = (n << 16 >> 16 << 14) + m | 0; B = m >> 16; m = (m >>> 1) - (B << 15) << 16; g = (((Z(m >> 16, u) | 0) >> 15) + (Z(B, u) | 0) << 2) - ((j >> 15) + g) | 0; j = b[q >> 1] | 0; g = (j << 16 >> 16 << 14) + g | 0; a = g >> 16; g = (g >>> 1) - (a << 15) << 16; B = (((Z(g >> 16, u) | 0) >> 15) + (Z(a, u) | 0) << 2) - ((m >> 15) + (B << 16)) | 0; m = b[p >> 1] | 0; B = (m << 16 >> 16 << 14) + B | 0; A = B >> 16; a = (((Z((B >>> 1) - (A << 15) << 16 >> 16, u) | 0) >> 15) + (Z(A, u) | 0) << 1) - ((g >> 15) + (a << 16)) | 0; g = b[r >> 1] | 0; a = (g << 16 >> 16 << 13) + a | 0; a = (a + 33554432 | 0) >>> 0 < 67108863 ? a >>> 10 & 65535 : (a | 0) > 33554431 ? 32767 : -32768; if ((Z(a << 16 >> 16, f << 16 >> 16) | 0) < 1) { u = k; k = n; break } else { o = o + 1 | 0; h = l; f = a; } } s = g << 16 >> 16 << 13; r = k << 16 >> 16 << 14; n = j << 16 >> 16 << 14; p = m << 16 >> 16 << 14; g = l << 16 >> 16; o = 4; while (1) { A = (h << 16 >> 16 >>> 1) + (g >>> 1) | 0; g = A << 16; q = g >> 16; g = t + (g >> 6) | 0; B = g & -65536; g = (g >>> 1) - (g >> 16 << 15) << 16; m = r + ((((Z(g >> 16, q) | 0) >> 15) + (Z(B >> 16, q) | 0) << 2) + -16777216) | 0; k = m >> 16; m = (m >>> 1) - (k << 15) << 16; B = n + ((((Z(m >> 16, q) | 0) >> 15) + (Z(k, q) | 0) << 2) - ((g >> 15) + B)) | 0; g = B >> 16; B = (B >>> 1) - (g << 15) << 16; k = p + ((((Z(B >> 16, q) | 0) >> 15) + (Z(g, q) | 0) << 2) - ((m >> 15) + (k << 16))) | 0; m = k >> 16; A = A & 65535; g = s + ((((Z((k >>> 1) - (m << 15) << 16 >> 16, q) | 0) >> 15) + (Z(m, q) | 0) << 1) - ((B >> 15) + (g << 16))) | 0; g = (g + 33554432 | 0) >>> 0 < 67108863 ? g >>> 10 & 65535 : (g | 0) > 33554431 ? 32767 : -32768; B = (Z(g << 16 >> 16, a << 16 >> 16) | 0) < 1; q = B ? l : A; a = B ? a : g; h = B ? A : h; f = B ? g : f; o = o + -1 << 16 >> 16; g = q << 16 >> 16; if (!(o << 16 >> 16)) { l = g; j = h; h = q; break } else l = q; } k = e << 16 >> 16; g = a << 16 >> 16; a = (f & 65535) - g | 0; f = a << 16; if (f) { B = (a & 65535) - (a >>> 15 & 1) | 0; B = B << 16 >> 31 ^ B; a = (qe(B & 65535) | 0) << 16 >> 16; a = (Z((Td(16383, B << 16 >> 16 << a & 65535) | 0) << 16 >> 16, (j & 65535) - l << 16 >> 16) | 0) >> 19 - a; if ((f | 0) < 0) a = 0 - (a << 16 >> 16) | 0; h = l - ((Z(a << 16 >> 16, g) | 0) >>> 10) & 65535; } b[c + (k << 1) >> 1] = h; f = v << 16 >> 16 == 0 ? x : w; A = h << 16 >> 16; a = b[f + 2 >> 1] | 0; g = (a << 16 >> 16 << 14) + (A << 10) | 0; B = g & -65536; g = (g >>> 1) - (g >> 16 << 15) << 16; t = (((Z(g >> 16, A) | 0) >> 15) + (Z(B >> 16, A) | 0) << 2) + -16777216 | 0; t = (b[f + 4 >> 1] << 14) + t | 0; s = t >> 16; t = (t >>> 1) - (s << 15) << 16; B = (((Z(t >> 16, A) | 0) >> 15) + (Z(s, A) | 0) << 2) - ((g >> 15) + B) | 0; B = (b[f + 6 >> 1] << 14) + B | 0; g = B >> 16; B = (B >>> 1) - (g << 15) << 16; s = (((Z(B >> 16, A) | 0) >> 15) + (Z(g, A) | 0) << 2) - ((t >> 15) + (s << 16)) | 0; s = (b[f + 8 >> 1] << 14) + s | 0; t = s >> 16; e = e + 1 << 16 >> 16; g = (((Z((s >>> 1) - (t << 15) << 16 >> 16, A) | 0) >> 15) + (Z(t, A) | 0) << 1) - ((B >> 15) + (g << 16)) | 0; g = (b[f + 10 >> 1] << 13) + g | 0; if (e << 16 >> 16 < 10) { s = f + 4 | 0; k = f; v = v ^ 1; j = u; r = f + 10 | 0; f = (g + 33554432 | 0) >>> 0 < 67108863 ? g >>> 10 & 65535 : (g | 0) > 33554431 ? 32767 : -32768; } else { z = 13; break } } if ((z | 0) == 13) { i = y; return } b[c >> 1] = b[d >> 1] | 0; b[c + 2 >> 1] = b[d + 2 >> 1] | 0; b[c + 4 >> 1] = b[d + 4 >> 1] | 0; b[c + 6 >> 1] = b[d + 6 >> 1] | 0; b[c + 8 >> 1] = b[d + 8 >> 1] | 0; b[c + 10 >> 1] = b[d + 10 >> 1] | 0; b[c + 12 >> 1] = b[d + 12 >> 1] | 0; b[c + 14 >> 1] = b[d + 14 >> 1] | 0; b[c + 16 >> 1] = b[d + 16 >> 1] | 0; b[c + 18 >> 1] = b[d + 18 >> 1] | 0; i = y; return } function Td(a, b) { a = a | 0; b = b | 0; var c = 0, d = 0, e = 0, f = 0, g = 0, h = 0; e = b << 16 >> 16; if (a << 16 >> 16 < 1 ? 1 : a << 16 >> 16 > b << 16 >> 16) { e = 0; return e | 0 } if (a << 16 >> 16 == b << 16 >> 16) { e = 32767; return e | 0 } d = e << 1; c = e << 2; f = a << 16 >> 16 << 3; a = (f | 0) < (c | 0); f = f - (a ? 0 : c) | 0; a = a ? 0 : 4; g = (f | 0) < (d | 0); f = f - (g ? 0 : d) | 0; b = (f | 0) < (e | 0); a = (b & 1 | (g ? a : a | 2)) << 3 ^ 8; b = f - (b ? 0 : e) << 3; if ((b | 0) >= (c | 0)) { b = b - c | 0; a = a & 65528 | 4; } f = (b | 0) < (d | 0); g = b - (f ? 0 : d) | 0; b = (g | 0) < (e | 0); a = (b & 1 ^ 1 | (f ? a : a | 2)) << 16 >> 13; b = g - (b ? 0 : e) << 3; if ((b | 0) >= (c | 0)) { b = b - c | 0; a = a & 65528 | 4; } f = (b | 0) < (d | 0); g = b - (f ? 0 : d) | 0; b = (g | 0) < (e | 0); a = (b & 1 ^ 1 | (f ? a : a | 2)) << 16 >> 13; b = g - (b ? 0 : e) << 3; if ((b | 0) >= (c | 0)) { b = b - c | 0; a = a & 65528 | 4; } h = (b | 0) < (d | 0); f = b - (h ? 0 : d) | 0; g = (f | 0) < (e | 0); b = (g & 1 ^ 1 | (h ? a : a | 2)) << 16 >> 13; a = f - (g ? 0 : e) << 3; if ((a | 0) >= (c | 0)) { a = a - c | 0; b = b & 65528 | 4; } h = (a | 0) < (d | 0); h = ((a - (h ? 0 : d) | 0) >= (e | 0) | (h ? b : b | 2)) & 65535; return h | 0 } function Ud(a) { a = a | 0; if (!a) { a = -1; return a | 0 } b[a >> 1] = -14336; b[a + 8 >> 1] = -2381; b[a + 2 >> 1] = -14336; b[a + 10 >> 1] = -2381; b[a + 4 >> 1] = -14336; b[a + 12 >> 1] = -2381; b[a + 6 >> 1] = -14336; b[a + 14 >> 1] = -2381; a = 0; return a | 0 } function Vd(a, d, f, g, h, j, k, l) { a = a | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; l = l | 0; var m = 0, n = 0, o = 0, p = 0, q = 0, r = 0; r = i; i = i + 16 | 0; p = r + 2 | 0; q = r; m = 0; n = 10; while (1) { o = b[f >> 1] | 0; o = ((Z(o, o) | 0) >>> 3) + m | 0; m = b[f + 2 >> 1] | 0; m = o + ((Z(m, m) | 0) >>> 3) | 0; o = b[f + 4 >> 1] | 0; o = m + ((Z(o, o) | 0) >>> 3) | 0; m = b[f + 6 >> 1] | 0; m = o + ((Z(m, m) | 0) >>> 3) | 0; n = n + -1 << 16 >> 16; if (!(n << 16 >> 16)) break; else f = f + 8 | 0; } n = m << 4; n = (n | 0) < 0 ? 2147483647 : n; if ((d | 0) == 7) { de(((Ce(n, l) | 0) << 16 >> 16) * 52428 | 0, p, q, l); o = e[p >> 1] << 16; n = b[q >> 1] << 1; d = b[a + 8 >> 1] | 0; m = (d << 16 >> 16) * 88 | 0; if (d << 16 >> 16 > -1 & (m | 0) < -783741) { c[l >> 2] = 1; f = 2147483647; } else f = m + 783741 | 0; d = (b[a + 10 >> 1] | 0) * 74 | 0; m = d + f | 0; if ((d ^ f | 0) > -1 & (m ^ f | 0) < 0) { c[l >> 2] = 1; f = (f >>> 31) + 2147483647 | 0; } else f = m; d = (b[a + 12 >> 1] | 0) * 44 | 0; m = d + f | 0; if ((d ^ f | 0) > -1 & (m ^ f | 0) < 0) { c[l >> 2] = 1; f = (f >>> 31) + 2147483647 | 0; } else f = m; a = (b[a + 14 >> 1] | 0) * 24 | 0; m = a + f | 0; if ((a ^ f | 0) > -1 & (m ^ f | 0) < 0) { c[l >> 2] = 1; m = (f >>> 31) + 2147483647 | 0; } a = o + -1966080 + n | 0; f = m - a | 0; if (((f ^ m) & (m ^ a) | 0) < 0) { c[l >> 2] = 1; f = (m >>> 31) + 2147483647 | 0; } l = f >> 17; b[g >> 1] = l; l = (f >> 2) - (l << 15) | 0; l = l & 65535; b[h >> 1] = l; i = r; return } o = pe(n) | 0; m = o << 16 >> 16; if (o << 16 >> 16 > 0) { f = n << m; if ((f >> m | 0) == (n | 0)) n = f; else n = n >> 31 ^ 2147483647; } else { m = 0 - m << 16; if ((m | 0) < 2031616) n = n >> (m >> 16); else n = 0; } ee(n, o, p, q); p = Z(b[p >> 1] | 0, -49320) | 0; m = (Z(b[q >> 1] | 0, -24660) | 0) >> 15; m = (m & 65536 | 0) == 0 ? m : m | -65536; q = m << 1; f = q + p | 0; if ((q ^ p | 0) > -1 & (f ^ q | 0) < 0) { c[l >> 2] = 1; f = (m >>> 30 & 1) + 2147483647 | 0; } switch (d | 0) { case 6: { m = f + 2134784 | 0; if ((f | 0) > -1 & (m ^ f | 0) < 0) { c[l >> 2] = 1; m = (f >>> 31) + 2147483647 | 0; } break } case 5: { b[k >> 1] = n >>> 16; b[j >> 1] = -11 - (o & 65535); m = f + 2183936 | 0; if ((f | 0) > -1 & (m ^ f | 0) < 0) { c[l >> 2] = 1; m = (f >>> 31) + 2147483647 | 0; } break } case 4: { m = f + 2085632 | 0; if ((f | 0) > -1 & (m ^ f | 0) < 0) { c[l >> 2] = 1; m = (f >>> 31) + 2147483647 | 0; } break } case 3: { m = f + 2065152 | 0; if ((f | 0) > -1 & (m ^ f | 0) < 0) { c[l >> 2] = 1; m = (f >>> 31) + 2147483647 | 0; } break } default: { m = f + 2134784 | 0; if ((f | 0) > -1 & (m ^ f | 0) < 0) { c[l >> 2] = 1; m = (f >>> 31) + 2147483647 | 0; } } } do if ((m | 0) <= 2097151) if ((m | 0) < -2097152) { c[l >> 2] = 1; f = -2147483648; break } else { f = m << 10; break } else { c[l >> 2] = 1; f = 2147483647; } while (0); k = (b[a >> 1] | 0) * 11142 | 0; m = k + f | 0; if ((k ^ f | 0) > -1 & (m ^ f | 0) < 0) { c[l >> 2] = 1; m = (f >>> 31) + 2147483647 | 0; } k = (b[a + 2 >> 1] | 0) * 9502 | 0; f = k + m | 0; if ((k ^ m | 0) > -1 & (f ^ m | 0) < 0) { c[l >> 2] = 1; f = (m >>> 31) + 2147483647 | 0; } k = (b[a + 4 >> 1] | 0) * 5570 | 0; m = k + f | 0; if ((k ^ f | 0) > -1 & (m ^ f | 0) < 0) { c[l >> 2] = 1; m = (f >>> 31) + 2147483647 | 0; } a = (b[a + 6 >> 1] | 0) * 3112 | 0; f = a + m | 0; if ((a ^ m | 0) > -1 & (f ^ m | 0) < 0) { c[l >> 2] = 1; f = (m >>> 31) + 2147483647 | 0; } f = Z(f >> 16, (d | 0) == 4 ? 10878 : 10886) | 0; if ((f | 0) < 0) f = ~((f ^ -256) >> 8); else f = f >> 8; b[g >> 1] = f >>> 16; if ((f | 0) < 0) m = ~((f ^ -2) >> 1); else m = f >> 1; g = f >> 16 << 15; f = m - g | 0; if (((f ^ m) & (g ^ m) | 0) >= 0) { l = f; l = l & 65535; b[h >> 1] = l; i = r; return } c[l >> 2] = 1; l = (m >>> 31) + 2147483647 | 0; l = l & 65535; b[h >> 1] = l; i = r; return } function Wd(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var e = 0, f = 0, g = 0; f = a + 4 | 0; b[a + 6 >> 1] = b[f >> 1] | 0; g = a + 12 | 0; b[a + 14 >> 1] = b[g >> 1] | 0; e = a + 2 | 0; b[f >> 1] = b[e >> 1] | 0; f = a + 10 | 0; b[g >> 1] = b[f >> 1] | 0; b[e >> 1] = b[a >> 1] | 0; e = a + 8 | 0; b[f >> 1] = b[e >> 1] | 0; b[e >> 1] = c; b[a >> 1] = d; return } function Xd(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0; g = Rd(0, b[a + 8 >> 1] | 0, e) | 0; g = Rd(g, b[a + 10 >> 1] | 0, e) | 0; g = Rd(g, b[a + 12 >> 1] | 0, e) | 0; g = Rd(g, b[a + 14 >> 1] | 0, e) | 0; f = g << 16 >> 16 >> 2; f = (g << 16 >> 16 < 0 ? f | 49152 : f) & 65535; b[c >> 1] = f << 16 >> 16 < -2381 ? -2381 : f; c = Rd(0, b[a >> 1] | 0, e) | 0; c = Rd(c, b[a + 2 >> 1] | 0, e) | 0; c = Rd(c, b[a + 4 >> 1] | 0, e) | 0; e = Rd(c, b[a + 6 >> 1] | 0, e) | 0; a = e << 16 >> 16 >> 2; a = (e << 16 >> 16 < 0 ? a | 49152 : a) & 65535; b[d >> 1] = a << 16 >> 16 < -14336 ? -14336 : a; return } function Yd(a) { a = a | 0; c[a >> 2] = 6892; c[a + 4 >> 2] = 8180; c[a + 8 >> 2] = 21e3; c[a + 12 >> 2] = 9716; c[a + 16 >> 2] = 22024; c[a + 20 >> 2] = 12788; c[a + 24 >> 2] = 24072; c[a + 28 >> 2] = 26120; c[a + 32 >> 2] = 28168; c[a + 36 >> 2] = 6876; c[a + 40 >> 2] = 7452; c[a + 44 >> 2] = 8140; c[a + 48 >> 2] = 20980; c[a + 52 >> 2] = 16884; c[a + 56 >> 2] = 17908; c[a + 60 >> 2] = 7980; c[a + 64 >> 2] = 8160; c[a + 68 >> 2] = 6678; c[a + 72 >> 2] = 6646; c[a + 76 >> 2] = 6614; c[a + 80 >> 2] = 29704; c[a + 84 >> 2] = 28680; c[a + 88 >> 2] = 3720; c[a + 92 >> 2] = 8; c[a + 96 >> 2] = 4172; c[a + 100 >> 2] = 44; c[a + 104 >> 2] = 3436; c[a + 108 >> 2] = 30316; c[a + 112 >> 2] = 30796; c[a + 116 >> 2] = 31276; c[a + 120 >> 2] = 7472; c[a + 124 >> 2] = 7552; c[a + 128 >> 2] = 7632; c[a + 132 >> 2] = 7712; return } function Zd(a, c) { a = a | 0; c = c | 0; var d = 0, e = 0, f = 0, g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0; n = i; i = i + 48 | 0; l = n + 18 | 0; m = n; k = c << 16 >> 16; Oe(m | 0, a | 0, k << 1 | 0) | 0; if (c << 16 >> 16 > 0) { d = 0; e = 0; } else { m = k >> 1; m = l + (m << 1) | 0; m = b[m >> 1] | 0; m = m << 16 >> 16; m = a + (m << 1) | 0; m = b[m >> 1] | 0; i = n; return m | 0 } do { j = 0; h = -32767; while (1) { f = b[m + (j << 1) >> 1] | 0; g = f << 16 >> 16 < h << 16 >> 16; e = g ? e : j & 65535; j = j + 1 | 0; if ((j & 65535) << 16 >> 16 == c << 16 >> 16) break; else h = g ? h : f; } b[m + (e << 16 >> 16 << 1) >> 1] = -32768; b[l + (d << 1) >> 1] = e; d = d + 1 | 0; } while ((d & 65535) << 16 >> 16 != c << 16 >> 16); m = k >> 1; m = l + (m << 1) | 0; m = b[m >> 1] | 0; m = m << 16 >> 16; m = a + (m << 1) | 0; m = b[m >> 1] | 0; i = n; return m | 0 } function _d(a, c, d, e, f) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; var g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0; g = i; i = i + 32 | 0; h = g; A = c + 2 | 0; z = h + 2 | 0; b[h >> 1] = ((b[c >> 1] | 0) >>> 1) + ((b[a >> 1] | 0) >>> 1); y = c + 4 | 0; x = h + 4 | 0; b[z >> 1] = ((b[A >> 1] | 0) >>> 1) + ((b[a + 2 >> 1] | 0) >>> 1); w = c + 6 | 0; v = h + 6 | 0; b[x >> 1] = ((b[y >> 1] | 0) >>> 1) + ((b[a + 4 >> 1] | 0) >>> 1); u = c + 8 | 0; t = h + 8 | 0; b[v >> 1] = ((b[w >> 1] | 0) >>> 1) + ((b[a + 6 >> 1] | 0) >>> 1); s = c + 10 | 0; r = h + 10 | 0; b[t >> 1] = ((b[u >> 1] | 0) >>> 1) + ((b[a + 8 >> 1] | 0) >>> 1); q = c + 12 | 0; p = h + 12 | 0; b[r >> 1] = ((b[s >> 1] | 0) >>> 1) + ((b[a + 10 >> 1] | 0) >>> 1); o = c + 14 | 0; n = h + 14 | 0; b[p >> 1] = ((b[q >> 1] | 0) >>> 1) + ((b[a + 12 >> 1] | 0) >>> 1); m = c + 16 | 0; l = h + 16 | 0; b[n >> 1] = ((b[o >> 1] | 0) >>> 1) + ((b[a + 14 >> 1] | 0) >>> 1); k = c + 18 | 0; j = h + 18 | 0; b[l >> 1] = ((b[m >> 1] | 0) >>> 1) + ((b[a + 16 >> 1] | 0) >>> 1); b[j >> 1] = ((b[k >> 1] | 0) >>> 1) + ((b[a + 18 >> 1] | 0) >>> 1); he(h, e, f); he(c, e + 22 | 0, f); b[h >> 1] = ((b[d >> 1] | 0) >>> 1) + ((b[c >> 1] | 0) >>> 1); b[z >> 1] = ((b[d + 2 >> 1] | 0) >>> 1) + ((b[A >> 1] | 0) >>> 1); b[x >> 1] = ((b[d + 4 >> 1] | 0) >>> 1) + ((b[y >> 1] | 0) >>> 1); b[v >> 1] = ((b[d + 6 >> 1] | 0) >>> 1) + ((b[w >> 1] | 0) >>> 1); b[t >> 1] = ((b[d + 8 >> 1] | 0) >>> 1) + ((b[u >> 1] | 0) >>> 1); b[r >> 1] = ((b[d + 10 >> 1] | 0) >>> 1) + ((b[s >> 1] | 0) >>> 1); b[p >> 1] = ((b[d + 12 >> 1] | 0) >>> 1) + ((b[q >> 1] | 0) >>> 1); b[n >> 1] = ((b[d + 14 >> 1] | 0) >>> 1) + ((b[o >> 1] | 0) >>> 1); b[l >> 1] = ((b[d + 16 >> 1] | 0) >>> 1) + ((b[m >> 1] | 0) >>> 1); b[j >> 1] = ((b[d + 18 >> 1] | 0) >>> 1) + ((b[k >> 1] | 0) >>> 1); he(h, e + 44 | 0, f); he(d, e + 66 | 0, f); i = g; return } function $d(a, c, d, e, f) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; var g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0; g = i; i = i + 32 | 0; h = g; A = c + 2 | 0; z = h + 2 | 0; b[h >> 1] = ((b[c >> 1] | 0) >>> 1) + ((b[a >> 1] | 0) >>> 1); y = c + 4 | 0; x = h + 4 | 0; b[z >> 1] = ((b[A >> 1] | 0) >>> 1) + ((b[a + 2 >> 1] | 0) >>> 1); w = c + 6 | 0; v = h + 6 | 0; b[x >> 1] = ((b[y >> 1] | 0) >>> 1) + ((b[a + 4 >> 1] | 0) >>> 1); u = c + 8 | 0; t = h + 8 | 0; b[v >> 1] = ((b[w >> 1] | 0) >>> 1) + ((b[a + 6 >> 1] | 0) >>> 1); s = c + 10 | 0; r = h + 10 | 0; b[t >> 1] = ((b[u >> 1] | 0) >>> 1) + ((b[a + 8 >> 1] | 0) >>> 1); q = c + 12 | 0; p = h + 12 | 0; b[r >> 1] = ((b[s >> 1] | 0) >>> 1) + ((b[a + 10 >> 1] | 0) >>> 1); o = c + 14 | 0; n = h + 14 | 0; b[p >> 1] = ((b[q >> 1] | 0) >>> 1) + ((b[a + 12 >> 1] | 0) >>> 1); m = c + 16 | 0; l = h + 16 | 0; b[n >> 1] = ((b[o >> 1] | 0) >>> 1) + ((b[a + 14 >> 1] | 0) >>> 1); k = c + 18 | 0; j = h + 18 | 0; b[l >> 1] = ((b[m >> 1] | 0) >>> 1) + ((b[a + 16 >> 1] | 0) >>> 1); b[j >> 1] = ((b[k >> 1] | 0) >>> 1) + ((b[a + 18 >> 1] | 0) >>> 1); he(h, e, f); b[h >> 1] = ((b[d >> 1] | 0) >>> 1) + ((b[c >> 1] | 0) >>> 1); b[z >> 1] = ((b[d + 2 >> 1] | 0) >>> 1) + ((b[A >> 1] | 0) >>> 1); b[x >> 1] = ((b[d + 4 >> 1] | 0) >>> 1) + ((b[y >> 1] | 0) >>> 1); b[v >> 1] = ((b[d + 6 >> 1] | 0) >>> 1) + ((b[w >> 1] | 0) >>> 1); b[t >> 1] = ((b[d + 8 >> 1] | 0) >>> 1) + ((b[u >> 1] | 0) >>> 1); b[r >> 1] = ((b[d + 10 >> 1] | 0) >>> 1) + ((b[s >> 1] | 0) >>> 1); b[p >> 1] = ((b[d + 12 >> 1] | 0) >>> 1) + ((b[q >> 1] | 0) >>> 1); b[n >> 1] = ((b[d + 14 >> 1] | 0) >>> 1) + ((b[o >> 1] | 0) >>> 1); b[l >> 1] = ((b[d + 16 >> 1] | 0) >>> 1) + ((b[m >> 1] | 0) >>> 1); b[j >> 1] = ((b[d + 18 >> 1] | 0) >>> 1) + ((b[k >> 1] | 0) >>> 1); he(h, e + 44 | 0, f); i = g; return } function ae(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0; f = i; i = i + 32 | 0; g = f; H = b[a >> 1] | 0; b[g >> 1] = H - (H >>> 2) + ((b[c >> 1] | 0) >>> 2); H = a + 2 | 0; E = b[H >> 1] | 0; I = c + 2 | 0; G = g + 2 | 0; b[G >> 1] = E - (E >>> 2) + ((b[I >> 1] | 0) >>> 2); E = a + 4 | 0; B = b[E >> 1] | 0; F = c + 4 | 0; D = g + 4 | 0; b[D >> 1] = B - (B >>> 2) + ((b[F >> 1] | 0) >>> 2); B = a + 6 | 0; y = b[B >> 1] | 0; C = c + 6 | 0; A = g + 6 | 0; b[A >> 1] = y - (y >>> 2) + ((b[C >> 1] | 0) >>> 2); y = a + 8 | 0; v = b[y >> 1] | 0; z = c + 8 | 0; x = g + 8 | 0; b[x >> 1] = v - (v >>> 2) + ((b[z >> 1] | 0) >>> 2); v = a + 10 | 0; s = b[v >> 1] | 0; w = c + 10 | 0; u = g + 10 | 0; b[u >> 1] = s - (s >>> 2) + ((b[w >> 1] | 0) >>> 2); s = a + 12 | 0; p = b[s >> 1] | 0; t = c + 12 | 0; r = g + 12 | 0; b[r >> 1] = p - (p >>> 2) + ((b[t >> 1] | 0) >>> 2); p = a + 14 | 0; m = b[p >> 1] | 0; q = c + 14 | 0; o = g + 14 | 0; b[o >> 1] = m - (m >>> 2) + ((b[q >> 1] | 0) >>> 2); m = a + 16 | 0; j = b[m >> 1] | 0; n = c + 16 | 0; l = g + 16 | 0; b[l >> 1] = j - (j >>> 2) + ((b[n >> 1] | 0) >>> 2); j = a + 18 | 0; J = b[j >> 1] | 0; k = c + 18 | 0; h = g + 18 | 0; b[h >> 1] = J - (J >>> 2) + ((b[k >> 1] | 0) >>> 2); he(g, d, e); b[g >> 1] = ((b[a >> 1] | 0) >>> 1) + ((b[c >> 1] | 0) >>> 1); b[G >> 1] = ((b[H >> 1] | 0) >>> 1) + ((b[I >> 1] | 0) >>> 1); b[D >> 1] = ((b[E >> 1] | 0) >>> 1) + ((b[F >> 1] | 0) >>> 1); b[A >> 1] = ((b[B >> 1] | 0) >>> 1) + ((b[C >> 1] | 0) >>> 1); b[x >> 1] = ((b[y >> 1] | 0) >>> 1) + ((b[z >> 1] | 0) >>> 1); b[u >> 1] = ((b[v >> 1] | 0) >>> 1) + ((b[w >> 1] | 0) >>> 1); b[r >> 1] = ((b[s >> 1] | 0) >>> 1) + ((b[t >> 1] | 0) >>> 1); b[o >> 1] = ((b[p >> 1] | 0) >>> 1) + ((b[q >> 1] | 0) >>> 1); b[l >> 1] = ((b[m >> 1] | 0) >>> 1) + ((b[n >> 1] | 0) >>> 1); b[h >> 1] = ((b[j >> 1] | 0) >>> 1) + ((b[k >> 1] | 0) >>> 1); he(g, d + 22 | 0, e); J = b[c >> 1] | 0; b[g >> 1] = J - (J >>> 2) + ((b[a >> 1] | 0) >>> 2); a = b[I >> 1] | 0; b[G >> 1] = a - (a >>> 2) + ((b[H >> 1] | 0) >>> 2); a = b[F >> 1] | 0; b[D >> 1] = a - (a >>> 2) + ((b[E >> 1] | 0) >>> 2); a = b[C >> 1] | 0; b[A >> 1] = a - (a >>> 2) + ((b[B >> 1] | 0) >>> 2); a = b[z >> 1] | 0; b[x >> 1] = a - (a >>> 2) + ((b[y >> 1] | 0) >>> 2); a = b[w >> 1] | 0; b[u >> 1] = a - (a >>> 2) + ((b[v >> 1] | 0) >>> 2); a = b[t >> 1] | 0; b[r >> 1] = a - (a >>> 2) + ((b[s >> 1] | 0) >>> 2); a = b[q >> 1] | 0; b[o >> 1] = a - (a >>> 2) + ((b[p >> 1] | 0) >>> 2); a = b[n >> 1] | 0; b[l >> 1] = a - (a >>> 2) + ((b[m >> 1] | 0) >>> 2); a = b[k >> 1] | 0; b[h >> 1] = a - (a >>> 2) + ((b[j >> 1] | 0) >>> 2); he(g, d + 44 | 0, e); he(c, d + 66 | 0, e); i = f; return } function be(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0; f = i; i = i + 32 | 0; g = f; H = b[a >> 1] | 0; b[g >> 1] = H - (H >>> 2) + ((b[c >> 1] | 0) >>> 2); H = a + 2 | 0; E = b[H >> 1] | 0; I = c + 2 | 0; G = g + 2 | 0; b[G >> 1] = E - (E >>> 2) + ((b[I >> 1] | 0) >>> 2); E = a + 4 | 0; B = b[E >> 1] | 0; F = c + 4 | 0; D = g + 4 | 0; b[D >> 1] = B - (B >>> 2) + ((b[F >> 1] | 0) >>> 2); B = a + 6 | 0; y = b[B >> 1] | 0; C = c + 6 | 0; A = g + 6 | 0; b[A >> 1] = y - (y >>> 2) + ((b[C >> 1] | 0) >>> 2); y = a + 8 | 0; v = b[y >> 1] | 0; z = c + 8 | 0; x = g + 8 | 0; b[x >> 1] = v - (v >>> 2) + ((b[z >> 1] | 0) >>> 2); v = a + 10 | 0; s = b[v >> 1] | 0; w = c + 10 | 0; u = g + 10 | 0; b[u >> 1] = s - (s >>> 2) + ((b[w >> 1] | 0) >>> 2); s = a + 12 | 0; p = b[s >> 1] | 0; t = c + 12 | 0; r = g + 12 | 0; b[r >> 1] = p - (p >>> 2) + ((b[t >> 1] | 0) >>> 2); p = a + 14 | 0; m = b[p >> 1] | 0; q = c + 14 | 0; o = g + 14 | 0; b[o >> 1] = m - (m >>> 2) + ((b[q >> 1] | 0) >>> 2); m = a + 16 | 0; j = b[m >> 1] | 0; n = c + 16 | 0; l = g + 16 | 0; b[l >> 1] = j - (j >>> 2) + ((b[n >> 1] | 0) >>> 2); j = a + 18 | 0; J = b[j >> 1] | 0; k = c + 18 | 0; h = g + 18 | 0; b[h >> 1] = J - (J >>> 2) + ((b[k >> 1] | 0) >>> 2); he(g, d, e); b[g >> 1] = ((b[a >> 1] | 0) >>> 1) + ((b[c >> 1] | 0) >>> 1); b[G >> 1] = ((b[H >> 1] | 0) >>> 1) + ((b[I >> 1] | 0) >>> 1); b[D >> 1] = ((b[E >> 1] | 0) >>> 1) + ((b[F >> 1] | 0) >>> 1); b[A >> 1] = ((b[B >> 1] | 0) >>> 1) + ((b[C >> 1] | 0) >>> 1); b[x >> 1] = ((b[y >> 1] | 0) >>> 1) + ((b[z >> 1] | 0) >>> 1); b[u >> 1] = ((b[v >> 1] | 0) >>> 1) + ((b[w >> 1] | 0) >>> 1); b[r >> 1] = ((b[s >> 1] | 0) >>> 1) + ((b[t >> 1] | 0) >>> 1); b[o >> 1] = ((b[p >> 1] | 0) >>> 1) + ((b[q >> 1] | 0) >>> 1); b[l >> 1] = ((b[m >> 1] | 0) >>> 1) + ((b[n >> 1] | 0) >>> 1); b[h >> 1] = ((b[j >> 1] | 0) >>> 1) + ((b[k >> 1] | 0) >>> 1); he(g, d + 22 | 0, e); c = b[c >> 1] | 0; b[g >> 1] = c - (c >>> 2) + ((b[a >> 1] | 0) >>> 2); a = b[I >> 1] | 0; b[G >> 1] = a - (a >>> 2) + ((b[H >> 1] | 0) >>> 2); a = b[F >> 1] | 0; b[D >> 1] = a - (a >>> 2) + ((b[E >> 1] | 0) >>> 2); a = b[C >> 1] | 0; b[A >> 1] = a - (a >>> 2) + ((b[B >> 1] | 0) >>> 2); a = b[z >> 1] | 0; b[x >> 1] = a - (a >>> 2) + ((b[y >> 1] | 0) >>> 2); a = b[w >> 1] | 0; b[u >> 1] = a - (a >>> 2) + ((b[v >> 1] | 0) >>> 2); a = b[t >> 1] | 0; b[r >> 1] = a - (a >>> 2) + ((b[s >> 1] | 0) >>> 2); a = b[q >> 1] | 0; b[o >> 1] = a - (a >>> 2) + ((b[p >> 1] | 0) >>> 2); a = b[n >> 1] | 0; b[l >> 1] = a - (a >>> 2) + ((b[m >> 1] | 0) >>> 2); a = b[k >> 1] | 0; b[h >> 1] = a - (a >>> 2) + ((b[j >> 1] | 0) >>> 2); he(g, d + 44 | 0, e); i = f; return } function ce(a, c) { a = a | 0; c = c | 0; var d = 0, f = 0; if ((a | 0) < 1) { c = 1073741823; return c | 0 } d = (pe(a) | 0) << 16 >> 16; c = 30 - d | 0; a = a << d >> (c & 1 ^ 1); d = (a >> 25 << 16) + -1048576 >> 16; f = b[7030 + (d << 1) >> 1] | 0; c = (f << 16) - (Z(f - (e[7030 + (d + 1 << 1) >> 1] | 0) << 16 >> 15, a >>> 10 & 32767) | 0) >> (c << 16 >> 17) + 1; return c | 0 } function de(a, b, c, d) { a = a | 0; b = b | 0; c = c | 0; d = d | 0; d = pe(a) | 0; ee(a << (d << 16 >> 16), d, b, c); return } function ee(a, c, d, f) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; if ((a | 0) < 1) { b[d >> 1] = 0; d = 0; b[f >> 1] = d; return } else { b[d >> 1] = 30 - (c & 65535); d = (a >> 25 << 16) + -2097152 >> 16; c = b[7128 + (d << 1) >> 1] | 0; d = ((c << 16) - (Z(a >>> 9 & 65534, c - (e[7128 + (d + 1 << 1) >> 1] | 0) << 16 >> 16) | 0) | 0) >>> 16 & 65535; b[f >> 1] = d; return } } function fe(a, c, d) { a = a | 0; c = c | 0; d = d | 0; var f = 0, g = 0; f = a + 2 | 0; d = b[f >> 1] | 0; b[c >> 1] = d; g = a + 4 | 0; b[c + 2 >> 1] = (e[g >> 1] | 0) - (e[a >> 1] | 0); b[c + 4 >> 1] = (e[a + 6 >> 1] | 0) - (e[f >> 1] | 0); f = a + 8 | 0; b[c + 6 >> 1] = (e[f >> 1] | 0) - (e[g >> 1] | 0); b[c + 8 >> 1] = (e[a + 10 >> 1] | 0) - (e[a + 6 >> 1] | 0); g = a + 12 | 0; b[c + 10 >> 1] = (e[g >> 1] | 0) - (e[f >> 1] | 0); b[c + 12 >> 1] = (e[a + 14 >> 1] | 0) - (e[a + 10 >> 1] | 0); b[c + 14 >> 1] = (e[a + 16 >> 1] | 0) - (e[g >> 1] | 0); b[c + 16 >> 1] = (e[a + 18 >> 1] | 0) - (e[a + 14 >> 1] | 0); b[c + 18 >> 1] = 16384 - (e[a + 16 >> 1] | 0); a = 10; g = c; while (1) { d = d << 16 >> 16; c = (d << 16) + -120782848 | 0; if ((c | 0) > 0) c = 1843 - ((c >> 16) * 12484 >> 16) | 0; else c = 3427 - ((d * 56320 | 0) >>> 16) | 0; f = g + 2 | 0; b[g >> 1] = c << 3; a = a + -1 << 16 >> 16; if (!(a << 16 >> 16)) break; d = b[f >> 1] | 0; g = f; } return } function ge(a, b, c) { a = a | 0; b = b | 0; c = c | 0; c = b << 16 >> 16; if (b << 16 >> 16 > 31) { b = 0; return b | 0 } if (b << 16 >> 16 > 0) return ((1 << c + -1 & a | 0) != 0 & 1) + (b << 16 >> 16 < 31 ? a >> c : 0) | 0; c = 0 - c << 16 >> 16; b = a << c; b = (b >> c | 0) == (a | 0) ? b : a >> 31 ^ 2147483647; return b | 0 } function he(a, d, e) { a = a | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0; s = i; i = i + 48 | 0; q = s + 24 | 0; r = s; o = q + 4 | 0; c[q >> 2] = 16777216; f = 0 - (b[a >> 1] | 0) | 0; p = q + 8 | 0; c[o >> 2] = f << 10; g = b[a + 4 >> 1] | 0; l = f >> 6; c[p >> 2] = 33554432 - (((Z((f << 9) - (l << 15) << 16 >> 16, g) | 0) >> 15) + (Z(l, g) | 0) << 2); l = q + 4 | 0; g = (c[l >> 2] | 0) - (g << 10) | 0; c[l >> 2] = g; l = q + 12 | 0; f = q + 4 | 0; c[l >> 2] = g; e = b[a + 8 >> 1] | 0; h = g; m = 1; while (1) { k = l + -4 | 0; j = c[k >> 2] | 0; n = j >> 16; c[l >> 2] = h + g - (((Z((j >>> 1) - (n << 15) << 16 >> 16, e) | 0) >> 15) + (Z(n, e) | 0) << 2); if ((m | 0) == 2) break; h = c[l + -12 >> 2] | 0; l = k; g = j; m = m + 1 | 0; } c[f >> 2] = (c[f >> 2] | 0) - (e << 10); e = q + 16 | 0; f = c[q + 8 >> 2] | 0; c[e >> 2] = f; k = b[a + 12 >> 1] | 0; g = f; l = 1; while (1) { j = e + -4 | 0; h = c[j >> 2] | 0; n = h >> 16; c[e >> 2] = g + f - (((Z((h >>> 1) - (n << 15) << 16 >> 16, k) | 0) >> 15) + (Z(n, k) | 0) << 2); if ((l | 0) == 3) break; g = c[e + -12 >> 2] | 0; e = j; f = h; l = l + 1 | 0; } e = q + 4 | 0; c[e >> 2] = (c[e >> 2] | 0) - (k << 10); e = q + 20 | 0; g = c[q + 12 >> 2] | 0; c[e >> 2] = g; f = b[a + 16 >> 1] | 0; h = g; l = 1; while (1) { k = e + -4 | 0; j = c[k >> 2] | 0; n = j >> 16; c[e >> 2] = h + g - (((Z((j >>> 1) - (n << 15) << 16 >> 16, f) | 0) >> 15) + (Z(n, f) | 0) << 2); if ((l | 0) == 4) break; h = c[e + -12 >> 2] | 0; e = k; g = j; l = l + 1 | 0; } l = q + 4 | 0; c[l >> 2] = (c[l >> 2] | 0) - (f << 10); c[r >> 2] = 16777216; l = 0 - (b[a + 2 >> 1] | 0) | 0; n = r + 8 | 0; c[r + 4 >> 2] = l << 10; f = b[a + 6 >> 1] | 0; m = l >> 6; c[n >> 2] = 33554432 - (((Z((l << 9) - (m << 15) << 16 >> 16, f) | 0) >> 15) + (Z(m, f) | 0) << 2); m = r + 4 | 0; f = (c[m >> 2] | 0) - (f << 10) | 0; c[m >> 2] = f; m = r + 12 | 0; l = r + 4 | 0; c[m >> 2] = f; k = b[a + 10 >> 1] | 0; g = f; e = 1; while (1) { j = m + -4 | 0; h = c[j >> 2] | 0; t = h >> 16; c[m >> 2] = g + f - (((Z((h >>> 1) - (t << 15) << 16 >> 16, k) | 0) >> 15) + (Z(t, k) | 0) << 2); if ((e | 0) == 2) break; g = c[m + -12 >> 2] | 0; m = j; f = h; e = e + 1 | 0; } c[l >> 2] = (c[l >> 2] | 0) - (k << 10); l = r + 16 | 0; f = c[r + 8 >> 2] | 0; c[l >> 2] = f; k = b[a + 14 >> 1] | 0; g = f; e = 1; while (1) { j = l + -4 | 0; h = c[j >> 2] | 0; t = h >> 16; c[l >> 2] = g + f - (((Z((h >>> 1) - (t << 15) << 16 >> 16, k) | 0) >> 15) + (Z(t, k) | 0) << 2); if ((e | 0) == 3) break; g = c[l + -12 >> 2] | 0; l = j; f = h; e = e + 1 | 0; } e = r + 4 | 0; c[e >> 2] = (c[e >> 2] | 0) - (k << 10); e = r + 20 | 0; k = c[r + 12 >> 2] | 0; c[e >> 2] = k; f = b[a + 18 >> 1] | 0; j = k; l = 1; while (1) { g = e + -4 | 0; h = c[g >> 2] | 0; t = h >> 16; c[e >> 2] = j + k - (((Z((h >>> 1) - (t << 15) << 16 >> 16, f) | 0) >> 15) + (Z(t, f) | 0) << 2); if ((l | 0) == 4) break; j = c[e + -12 >> 2] | 0; e = g; k = h; l = l + 1 | 0; } j = (c[r + 4 >> 2] | 0) - (f << 10) | 0; m = q + 20 | 0; k = r + 20 | 0; l = c[q + 16 >> 2] | 0; a = (c[m >> 2] | 0) + l | 0; c[m >> 2] = a; m = c[r + 16 >> 2] | 0; t = (c[k >> 2] | 0) - m | 0; c[k >> 2] = t; k = c[q + 12 >> 2] | 0; l = l + k | 0; c[q + 16 >> 2] = l; h = c[r + 12 >> 2] | 0; m = m - h | 0; c[r + 16 >> 2] = m; f = c[p >> 2] | 0; k = k + f | 0; c[q + 12 >> 2] = k; g = c[n >> 2] | 0; p = h - g | 0; c[r + 12 >> 2] = p; h = c[o >> 2] | 0; n = f + h | 0; c[q + 8 >> 2] = n; o = g - j | 0; c[r + 8 >> 2] = o; q = h + (c[q >> 2] | 0) | 0; r = j - (c[r >> 2] | 0) | 0; b[d >> 1] = 4096; q = q + 4096 | 0; b[d + 2 >> 1] = (q + r | 0) >>> 13; b[d + 20 >> 1] = (q - r | 0) >>> 13; r = n + 4096 | 0; b[d + 4 >> 1] = (r + o | 0) >>> 13; b[d + 18 >> 1] = (r - o | 0) >>> 13; r = k + 4096 | 0; b[d + 6 >> 1] = (r + p | 0) >>> 13; b[d + 16 >> 1] = (r - p | 0) >>> 13; r = l + 4096 | 0; b[d + 8 >> 1] = (r + m | 0) >>> 13; b[d + 14 >> 1] = (r - m | 0) >>> 13; r = a + 4096 | 0; b[d + 10 >> 1] = (r + t | 0) >>> 13; b[d + 12 >> 1] = (r - t | 0) >>> 13; i = s; return } function ie(a) { a = a | 0; var d = 0, e = 0, f = 0, g = 0, h = 0; if (!a) { h = -1; return h | 0 } c[a >> 2] = 0; d = Je(44) | 0; if (!d) { h = -1; return h | 0 } e = d + 40 | 0; if ((xe(e) | 0) << 16 >> 16) { h = -1; return h | 0 } f = d; g = 7452; h = f + 20 | 0; do { b[f >> 1] = b[g >> 1] | 0; f = f + 2 | 0; g = g + 2 | 0; } while ((f | 0) < (h | 0)); f = d + 20 | 0; g = 7452; h = f + 20 | 0; do { b[f >> 1] = b[g >> 1] | 0; f = f + 2 | 0; g = g + 2 | 0; } while ((f | 0) < (h | 0)); ye(c[e >> 2] | 0) | 0; c[a >> 2] = d; h = 0; return h | 0 } function je(a) { a = a | 0; var d = 0, e = 0, f = 0; if (!a) { f = -1; return f | 0 } d = a; e = 7452; f = d + 20 | 0; do { b[d >> 1] = b[e >> 1] | 0; d = d + 2 | 0; e = e + 2 | 0; } while ((d | 0) < (f | 0)); d = a + 20 | 0; e = 7452; f = d + 20 | 0; do { b[d >> 1] = b[e >> 1] | 0; d = d + 2 | 0; e = e + 2 | 0; } while ((d | 0) < (f | 0)); ye(c[a + 40 >> 2] | 0) | 0; f = 0; return f | 0 } function ke(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; ze(b + 40 | 0); Ke(c[a >> 2] | 0); c[a >> 2] = 0; return } function le(a, d, e, f, g, h, j, k) { a = a | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; k = k | 0; var l = 0, m = 0, n = 0, o = 0, p = 0; p = i; i = i + 64 | 0; o = p + 44 | 0; l = p + 24 | 0; m = p + 4 | 0; n = p; if ((d | 0) == 7) { Sd(f + 22 | 0, l, a, k); Sd(f + 66 | 0, h, l, k); $d(a, l, h, f, k); if ((e | 0) == 8) f = 6; else { ve(c[a + 40 >> 2] | 0, l, h, m, o, c[j >> 2] | 0, k); _d(a + 20 | 0, m, o, g, k); g = (c[j >> 2] | 0) + 10 | 0; f = 7; } } else { Sd(f + 66 | 0, h, a, k); be(a, h, f, k); if ((e | 0) == 8) f = 6; else { te(c[a + 40 >> 2] | 0, d, h, o, c[j >> 2] | 0, n, k); ae(a + 20 | 0, o, g, k); g = (c[j >> 2] | 0) + 6 | 0; f = 7; } } if ((f | 0) == 6) { f = a; g = f + 20 | 0; do { b[f >> 1] = b[h >> 1] | 0; f = f + 2 | 0; h = h + 2 | 0; } while ((f | 0) < (g | 0)); i = p; return } else if ((f | 0) == 7) { c[j >> 2] = g; f = a; g = f + 20 | 0; do { b[f >> 1] = b[h >> 1] | 0; f = f + 2 | 0; h = h + 2 | 0; } while ((f | 0) < (g | 0)); f = a + 20 | 0; h = o; g = f + 20 | 0; do { b[f >> 1] = b[h >> 1] | 0; f = f + 2 | 0; h = h + 2 | 0; } while ((f | 0) < (g | 0)); i = p; return } } function me(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0; if (d << 16 >> 16 > 0) e = 0; else return; do { g = b[a + (e << 1) >> 1] | 0; h = g >> 8; f = b[7194 + (h << 1) >> 1] | 0; b[c + (e << 1) >> 1] = ((Z((b[7194 + (h + 1 << 1) >> 1] | 0) - f | 0, g & 255) | 0) >>> 8) + f; e = e + 1 | 0; } while ((e & 65535) << 16 >> 16 != d << 16 >> 16); return } function ne(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0; e = (d << 16 >> 16) + -1 | 0; d = e & 65535; if (d << 16 >> 16 <= -1) return; f = 63; h = c + (e << 1) | 0; g = a + (e << 1) | 0; while (1) { a = b[g >> 1] | 0; c = f; while (1) { e = c << 16 >> 16; f = b[7194 + (e << 1) >> 1] | 0; if (a << 16 >> 16 > f << 16 >> 16) c = c + -1 << 16 >> 16; else break } b[h >> 1] = (((Z(b[7324 + (e << 1) >> 1] | 0, (a << 16 >> 16) - (f << 16 >> 16) | 0) | 0) + 2048 | 0) >>> 12) + (e << 8); d = d + -1 << 16 >> 16; if (d << 16 >> 16 > -1) { f = c; h = h + -2 | 0; g = g + -2 | 0; } else break } return } function oe(a, b, d) { a = a | 0; b = b | 0; d = d | 0; a = (Z(b << 16 >> 16, a << 16 >> 16) | 0) + 16384 >> 15; a = a | 0 - (a & 65536); if ((a | 0) <= 32767) { if ((a | 0) < -32768) { c[d >> 2] = 1; a = -32768; } } else { c[d >> 2] = 1; a = 32767; } return a & 65535 | 0 } function pe(a) { a = a | 0; var b = 0; a:do if ((a | 0) != 0 ? (b = a - (a >>> 31) | 0, b = b >> 31 ^ b, (b & 1073741824 | 0) == 0) : 0) { a = b; b = 0; while (1) { if (a & 536870912) { a = 7; break } if (a & 268435456) { a = 8; break } if (a & 134217728) { a = 9; break } b = b + 4 << 16 >> 16; a = a << 4; if (a & 1073741824) break a } if ((a | 0) == 7) { b = b | 1; break } else if ((a | 0) == 8) { b = b | 2; break } else if ((a | 0) == 9) { b = b | 3; break } } else b = 0; while (0); return b | 0 } function qe(a) { a = a | 0; var b = 0, c = 0; if (!(a << 16 >> 16)) { c = 0; return c | 0 } b = (a & 65535) - ((a & 65535) >>> 15 & 65535) | 0; b = (b << 16 >> 31 ^ b) << 16; a = b >> 16; if (!(a & 16384)) { c = b; b = 0; } else { c = 0; return c | 0 } while (1) { if (a & 8192) { a = b; c = 7; break } if (a & 4096) { a = b; c = 8; break } if (a & 2048) { a = b; c = 9; break } b = b + 4 << 16 >> 16; c = c << 4; a = c >> 16; if (a & 16384) { a = b; c = 10; break } } if ((c | 0) == 7) { c = a | 1; return c | 0 } else if ((c | 0) == 8) { c = a | 2; return c | 0 } else if ((c | 0) == 9) { c = a | 3; return c | 0 } else if ((c | 0) == 10) return a | 0; return 0 } function re(a, d, f) { a = a | 0; d = d | 0; f = f | 0; var g = 0, h = 0, i = 0; d = d << 16 >> 16; if ((d & 134217727 | 0) == 33554432) { c[f >> 2] = 1; d = 2147483647; } else d = d << 6; g = d >>> 16 & 31; i = b[7792 + (g << 1) >> 1] | 0; h = i << 16; d = Z(i - (e[7792 + (g + 1 << 1) >> 1] | 0) << 16 >> 16, d >>> 1 & 32767) | 0; if ((d | 0) == 1073741824) { c[f >> 2] = 1; g = 2147483647; } else g = d << 1; d = h - g | 0; if (((d ^ h) & (g ^ h) | 0) >= 0) { i = d; a = a & 65535; a = 30 - a | 0; a = a & 65535; f = ge(i, a, f) | 0; return f | 0 } c[f >> 2] = 1; i = (i >>> 15 & 1) + 2147483647 | 0; a = a & 65535; a = 30 - a | 0; a = a & 65535; f = ge(i, a, f) | 0; return f | 0 } function se(a, c, d, e, f, g) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; var h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0; o = i; i = i + 48 | 0; n = o; m = 0 - (d & 65535) | 0; m = f << 16 >> 16 == 0 ? m : m << 1 & 131070; d = m & 65535; m = (d << 16 >> 16 < 0 ? m + 6 | 0 : m) << 16 >> 16; g = 6 - m | 0; b[n >> 1] = b[7858 + (m << 1) >> 1] | 0; b[n + 2 >> 1] = b[7858 + (g << 1) >> 1] | 0; b[n + 4 >> 1] = b[7858 + (m + 6 << 1) >> 1] | 0; b[n + 6 >> 1] = b[7858 + (g + 6 << 1) >> 1] | 0; b[n + 8 >> 1] = b[7858 + (m + 12 << 1) >> 1] | 0; b[n + 10 >> 1] = b[7858 + (g + 12 << 1) >> 1] | 0; b[n + 12 >> 1] = b[7858 + (m + 18 << 1) >> 1] | 0; b[n + 14 >> 1] = b[7858 + (g + 18 << 1) >> 1] | 0; b[n + 16 >> 1] = b[7858 + (m + 24 << 1) >> 1] | 0; b[n + 18 >> 1] = b[7858 + (g + 24 << 1) >> 1] | 0; b[n + 20 >> 1] = b[7858 + (m + 30 << 1) >> 1] | 0; b[n + 22 >> 1] = b[7858 + (g + 30 << 1) >> 1] | 0; b[n + 24 >> 1] = b[7858 + (m + 36 << 1) >> 1] | 0; b[n + 26 >> 1] = b[7858 + (g + 36 << 1) >> 1] | 0; b[n + 28 >> 1] = b[7858 + (m + 42 << 1) >> 1] | 0; b[n + 30 >> 1] = b[7858 + (g + 42 << 1) >> 1] | 0; b[n + 32 >> 1] = b[7858 + (m + 48 << 1) >> 1] | 0; b[n + 34 >> 1] = b[7858 + (g + 48 << 1) >> 1] | 0; b[n + 36 >> 1] = b[7858 + (m + 54 << 1) >> 1] | 0; b[n + 38 >> 1] = b[7858 + (g + 54 << 1) >> 1] | 0; g = e << 16 >> 16 >>> 1 & 65535; if (!(g << 16 >> 16)) { i = o; return } m = a + ((d << 16 >> 16 >> 15 << 16 >> 16) - (c << 16 >> 16) << 1) | 0; while (1) { l = m + 2 | 0; h = b[l >> 1] | 0; c = h; e = m; j = 5; k = n; f = 16384; d = 16384; while (1) { q = b[k >> 1] | 0; r = (Z(q, c << 16 >> 16) | 0) + d | 0; p = b[l + -2 >> 1] | 0; d = (Z(p, q) | 0) + f | 0; q = e; e = e + 4 | 0; s = b[k + 2 >> 1] | 0; d = d + (Z(s, h << 16 >> 16) | 0) | 0; f = b[e >> 1] | 0; s = r + (Z(f, s) | 0) | 0; l = l + -4 | 0; r = b[k + 4 >> 1] | 0; p = s + (Z(r, p) | 0) | 0; c = b[l >> 1] | 0; r = d + (Z(c << 16 >> 16, r) | 0) | 0; d = b[k + 6 >> 1] | 0; f = r + (Z(d, f) | 0) | 0; h = b[q + 6 >> 1] | 0; d = p + (Z(h << 16 >> 16, d) | 0) | 0; if (j << 16 >> 16 <= 1) break; else { j = j + -1 << 16 >> 16; k = k + 8 | 0; } } b[a >> 1] = f >>> 15; b[a + 2 >> 1] = d >>> 15; g = g + -1 << 16 >> 16; if (!(g << 16 >> 16)) break; else { m = m + 4 | 0; a = a + 4 | 0; } } i = o; return } function te(a, c, d, f, g, h, j) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; var k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0; C = i; i = i + 144 | 0; t = C + 120 | 0; y = C + 100 | 0; A = C + 80 | 0; B = C + 60 | 0; z = C + 40 | 0; q = C + 20 | 0; r = C; ne(d, t, 10, j); fe(t, y, j); if ((c | 0) == 8) { b[h >> 1] = 0; l = 2147483647; s = 0; while (1) { n = s * 10 | 0; d = 0; m = 0; do { x = (e[7980 + (m + n << 1) >> 1] | 0) + (e[8140 + (m << 1) >> 1] | 0) | 0; b[r + (m << 1) >> 1] = x; x = (e[t + (m << 1) >> 1] | 0) - (x & 65535) | 0; b[q + (m << 1) >> 1] = x; x = x << 16; d = (Z(x >> 15, x >> 16) | 0) + d | 0; m = m + 1 | 0; } while ((m | 0) != 10); if ((d | 0) < (l | 0)) { u = B; p = q; o = u + 20 | 0; do { b[u >> 1] = b[p >> 1] | 0; u = u + 2 | 0; p = p + 2 | 0; } while ((u | 0) < (o | 0)); u = A; p = r; o = u + 20 | 0; do { b[u >> 1] = b[p >> 1] | 0; u = u + 2 | 0; p = p + 2 | 0; } while ((u | 0) < (o | 0)); u = a; p = 7980 + (n << 1) | 0; o = u + 20 | 0; do { b[u >> 1] = b[p >> 1] | 0; u = u + 2 | 0; p = p + 2 | 0; } while ((u | 0) < (o | 0)); b[h >> 1] = s; } else d = l; s = s + 1 | 0; if ((s | 0) == 8) break; else l = d; } } else { d = 0; do { x = Z(b[8160 + (d << 1) >> 1] | 0, b[a + (d << 1) >> 1] | 0) | 0; x = (x >>> 15) + (e[8140 + (d << 1) >> 1] | 0) | 0; b[A + (d << 1) >> 1] = x; b[B + (d << 1) >> 1] = (e[t + (d << 1) >> 1] | 0) - x; d = d + 1 | 0; } while ((d | 0) != 10) } do if (c >>> 0 >= 2) { x = B + 2 | 0; w = B + 4 | 0; v = e[B >> 1] | 0; u = b[y >> 1] << 1; t = e[x >> 1] | 0; q = b[y + 2 >> 1] << 1; p = e[w >> 1] | 0; o = b[y + 4 >> 1] << 1; if ((c | 0) == 5) { r = 2147483647; h = 0; d = 0; s = 17908; while (1) { m = (Z(v - (e[s >> 1] | 0) << 16 >> 16, u) | 0) >> 16; m = Z(m, m) | 0; n = (Z(t - (e[s + 2 >> 1] | 0) << 16 >> 16, q) | 0) >> 16; m = (Z(n, n) | 0) + m | 0; n = (Z(p - (e[s + 4 >> 1] | 0) << 16 >> 16, o) | 0) >> 16; n = m + (Z(n, n) | 0) | 0; m = (n | 0) < (r | 0); d = m ? h : d; h = h + 1 << 16 >> 16; if (h << 16 >> 16 >= 512) break; else { r = m ? n : r; s = s + 6 | 0; } } n = (d << 16 >> 16) * 3 | 0; b[B >> 1] = b[17908 + (n << 1) >> 1] | 0; b[x >> 1] = b[17908 + (n + 1 << 1) >> 1] | 0; b[w >> 1] = b[17908 + (n + 2 << 1) >> 1] | 0; b[g >> 1] = d; n = B + 6 | 0; m = B + 8 | 0; v = B + 10 | 0; s = e[n >> 1] | 0; h = b[y + 6 >> 1] << 1; r = e[m >> 1] | 0; q = b[y + 8 >> 1] << 1; p = e[v >> 1] | 0; o = b[y + 10 >> 1] << 1; k = 2147483647; t = 0; d = 0; u = 9716; while (1) { l = (Z(h, s - (e[u >> 1] | 0) << 16 >> 16) | 0) >> 16; l = Z(l, l) | 0; c = (Z(q, r - (e[u + 2 >> 1] | 0) << 16 >> 16) | 0) >> 16; l = (Z(c, c) | 0) + l | 0; c = (Z(o, p - (e[u + 4 >> 1] | 0) << 16 >> 16) | 0) >> 16; c = l + (Z(c, c) | 0) | 0; l = (c | 0) < (k | 0); d = l ? t : d; t = t + 1 << 16 >> 16; if (t << 16 >> 16 >= 512) break; else { k = l ? c : k; u = u + 6 | 0; } } k = (d << 16 >> 16) * 3 | 0; b[n >> 1] = b[9716 + (k << 1) >> 1] | 0; b[m >> 1] = b[9716 + (k + 1 << 1) >> 1] | 0; b[v >> 1] = b[9716 + (k + 2 << 1) >> 1] | 0; b[g + 2 >> 1] = d; k = B + 12 | 0; b[g + 4 >> 1] = ue(k, 12788, y + 12 | 0, 512) | 0; t = x; s = w; d = v; l = B; break } else { r = 2147483647; h = 0; d = 0; s = 8180; while (1) { m = (Z(v - (e[s >> 1] | 0) << 16 >> 16, u) | 0) >> 16; m = Z(m, m) | 0; n = (Z(t - (e[s + 2 >> 1] | 0) << 16 >> 16, q) | 0) >> 16; m = (Z(n, n) | 0) + m | 0; n = (Z(p - (e[s + 4 >> 1] | 0) << 16 >> 16, o) | 0) >> 16; n = m + (Z(n, n) | 0) | 0; m = (n | 0) < (r | 0); d = m ? h : d; h = h + 1 << 16 >> 16; if (h << 16 >> 16 >= 256) break; else { r = m ? n : r; s = s + 6 | 0; } } n = (d << 16 >> 16) * 3 | 0; b[B >> 1] = b[8180 + (n << 1) >> 1] | 0; b[x >> 1] = b[8180 + (n + 1 << 1) >> 1] | 0; b[w >> 1] = b[8180 + (n + 2 << 1) >> 1] | 0; b[g >> 1] = d; n = B + 6 | 0; m = B + 8 | 0; v = B + 10 | 0; s = e[n >> 1] | 0; h = b[y + 6 >> 1] << 1; r = e[m >> 1] | 0; q = b[y + 8 >> 1] << 1; p = e[v >> 1] | 0; o = b[y + 10 >> 1] << 1; k = 2147483647; t = 0; d = 0; u = 9716; while (1) { l = (Z(h, s - (e[u >> 1] | 0) << 16 >> 16) | 0) >> 16; l = Z(l, l) | 0; c = (Z(q, r - (e[u + 2 >> 1] | 0) << 16 >> 16) | 0) >> 16; l = (Z(c, c) | 0) + l | 0; c = (Z(o, p - (e[u + 4 >> 1] | 0) << 16 >> 16) | 0) >> 16; c = l + (Z(c, c) | 0) | 0; l = (c | 0) < (k | 0); d = l ? t : d; t = t + 1 << 16 >> 16; if (t << 16 >> 16 >= 512) break; else { k = l ? c : k; u = u + 6 | 0; } } k = (d << 16 >> 16) * 3 | 0; b[n >> 1] = b[9716 + (k << 1) >> 1] | 0; b[m >> 1] = b[9716 + (k + 1 << 1) >> 1] | 0; b[v >> 1] = b[9716 + (k + 2 << 1) >> 1] | 0; b[g + 2 >> 1] = d; k = B + 12 | 0; b[g + 4 >> 1] = ue(k, 12788, y + 12 | 0, 512) | 0; t = x; s = w; d = v; l = B; break } } else { w = B + 2 | 0; x = B + 4 | 0; n = e[B >> 1] | 0; m = b[y >> 1] << 1; l = e[w >> 1] | 0; k = b[y + 2 >> 1] << 1; c = e[x >> 1] | 0; o = b[y + 4 >> 1] << 1; r = 2147483647; h = 0; d = 0; s = 8180; while (1) { q = (Z(m, n - (e[s >> 1] | 0) << 16 >> 16) | 0) >> 16; q = Z(q, q) | 0; p = (Z(k, l - (e[s + 2 >> 1] | 0) << 16 >> 16) | 0) >> 16; q = (Z(p, p) | 0) + q | 0; p = (Z(o, c - (e[s + 4 >> 1] | 0) << 16 >> 16) | 0) >> 16; p = q + (Z(p, p) | 0) | 0; q = (p | 0) < (r | 0); d = q ? h : d; h = h + 1 << 16 >> 16; if (h << 16 >> 16 >= 256) break; else { r = q ? p : r; s = s + 6 | 0; } } n = (d << 16 >> 16) * 3 | 0; b[B >> 1] = b[8180 + (n << 1) >> 1] | 0; b[w >> 1] = b[8180 + (n + 1 << 1) >> 1] | 0; b[x >> 1] = b[8180 + (n + 2 << 1) >> 1] | 0; b[g >> 1] = d; n = B + 6 | 0; m = B + 8 | 0; v = B + 10 | 0; s = e[n >> 1] | 0; h = b[y + 6 >> 1] << 1; r = e[m >> 1] | 0; q = b[y + 8 >> 1] << 1; p = e[v >> 1] | 0; o = b[y + 10 >> 1] << 1; k = 2147483647; t = 0; d = 0; u = 9716; while (1) { l = (Z(h, s - (e[u >> 1] | 0) << 16 >> 16) | 0) >> 16; l = Z(l, l) | 0; c = (Z(q, r - (e[u + 2 >> 1] | 0) << 16 >> 16) | 0) >> 16; l = (Z(c, c) | 0) + l | 0; c = (Z(o, p - (e[u + 4 >> 1] | 0) << 16 >> 16) | 0) >> 16; c = l + (Z(c, c) | 0) | 0; l = (c | 0) < (k | 0); d = l ? t : d; t = t + 1 << 16 >> 16; if (t << 16 >> 16 >= 256) break; else { k = l ? c : k; u = u + 12 | 0; } } k = (d << 16 >> 16) * 6 | 0; b[n >> 1] = b[9716 + (k << 1) >> 1] | 0; b[m >> 1] = b[9716 + ((k | 1) << 1) >> 1] | 0; b[v >> 1] = b[9716 + (k + 2 << 1) >> 1] | 0; b[g + 2 >> 1] = d; k = B + 12 | 0; b[g + 4 >> 1] = ue(k, 16884, y + 12 | 0, 128) | 0; t = w; s = x; d = v; l = B; } while (0); u = a; p = B; o = u + 20 | 0; do { b[u >> 1] = b[p >> 1] | 0; u = u + 2 | 0; p = p + 2 | 0; } while ((u | 0) < (o | 0)); b[z >> 1] = (e[A >> 1] | 0) + (e[l >> 1] | 0); b[z + 2 >> 1] = (e[A + 2 >> 1] | 0) + (e[t >> 1] | 0); b[z + 4 >> 1] = (e[A + 4 >> 1] | 0) + (e[s >> 1] | 0); b[z + 6 >> 1] = (e[A + 6 >> 1] | 0) + (e[n >> 1] | 0); b[z + 8 >> 1] = (e[A + 8 >> 1] | 0) + (e[m >> 1] | 0); b[z + 10 >> 1] = (e[A + 10 >> 1] | 0) + (e[d >> 1] | 0); b[z + 12 >> 1] = (e[A + 12 >> 1] | 0) + (e[k >> 1] | 0); b[z + 14 >> 1] = (e[A + 14 >> 1] | 0) + (e[B + 14 >> 1] | 0); b[z + 16 >> 1] = (e[A + 16 >> 1] | 0) + (e[B + 16 >> 1] | 0); b[z + 18 >> 1] = (e[A + 18 >> 1] | 0) + (e[B + 18 >> 1] | 0); Ae(z, 205, 10, j); me(z, f, 10, j); i = C; return } function ue(a, c, d, f) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; var g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0; t = a + 2 | 0; u = a + 4 | 0; v = a + 6 | 0; if (f << 16 >> 16 > 0) { m = e[a >> 1] | 0; n = b[d >> 1] << 1; o = e[t >> 1] | 0; p = b[d + 2 >> 1] << 1; q = e[u >> 1] | 0; r = b[d + 4 >> 1] << 1; s = e[v >> 1] | 0; g = b[d + 6 >> 1] << 1; j = 2147483647; k = 0; d = 0; l = c; while (1) { h = (Z(n, m - (e[l >> 1] | 0) << 16 >> 16) | 0) >> 16; h = Z(h, h) | 0; i = (Z(p, o - (e[l + 2 >> 1] | 0) << 16 >> 16) | 0) >> 16; h = (Z(i, i) | 0) + h | 0; i = (Z(r, q - (e[l + 4 >> 1] | 0) << 16 >> 16) | 0) >> 16; i = h + (Z(i, i) | 0) | 0; h = (Z(g, s - (e[l + 6 >> 1] | 0) << 16 >> 16) | 0) >> 16; h = i + (Z(h, h) | 0) | 0; i = (h | 0) < (j | 0); d = i ? k : d; k = k + 1 << 16 >> 16; if (k << 16 >> 16 >= f << 16 >> 16) break; else { j = i ? h : j; l = l + 8 | 0; } } } else d = 0; f = d << 16 >> 16 << 2; s = f | 1; b[a >> 1] = b[c + (f << 1) >> 1] | 0; b[t >> 1] = b[c + (s << 1) >> 1] | 0; b[u >> 1] = b[c + (s + 1 << 1) >> 1] | 0; b[v >> 1] = b[c + ((f | 3) << 1) >> 1] | 0; return d | 0 } function ve(a, c, d, f, g, h, j) { a = a | 0; c = c | 0; d = d | 0; f = f | 0; g = g | 0; h = h | 0; j = j | 0; var k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0; I = i; i = i + 192 | 0; m = I + 160 | 0; l = I + 140 | 0; C = I + 120 | 0; D = I + 100 | 0; E = I + 80 | 0; F = I + 60 | 0; k = I + 40 | 0; G = I + 20 | 0; H = I; ne(c, m, 10, j); ne(d, l, 10, j); fe(m, C, j); fe(l, D, j); n = 0; d = E; c = F; o = k; while (1) { B = (((b[a + (n << 1) >> 1] | 0) * 21299 | 0) >>> 15) + (e[20980 + (n << 1) >> 1] | 0) | 0; b[d >> 1] = B; b[c >> 1] = (e[m >> 1] | 0) - B; b[o >> 1] = (e[l >> 1] | 0) - B; n = n + 1 | 0; if ((n | 0) == 10) break; else { m = m + 2 | 0; l = l + 2 | 0; d = d + 2 | 0; c = c + 2 | 0; o = o + 2 | 0; } } b[h >> 1] = we(F, k, 21e3, b[C >> 1] | 0, b[C + 2 >> 1] | 0, b[D >> 1] | 0, b[D + 2 >> 1] | 0, 128) | 0; b[h + 2 >> 1] = we(F + 4 | 0, k + 4 | 0, 22024, b[C + 4 >> 1] | 0, b[C + 6 >> 1] | 0, b[D + 4 >> 1] | 0, b[D + 6 >> 1] | 0, 256) | 0; y = F + 8 | 0; z = k + 8 | 0; A = F + 10 | 0; B = k + 10 | 0; d = b[y >> 1] | 0; p = b[C + 8 >> 1] << 1; q = b[A >> 1] | 0; r = b[C + 10 >> 1] << 1; s = b[z >> 1] | 0; t = b[D + 8 >> 1] << 1; u = b[B >> 1] | 0; v = b[D + 10 >> 1] << 1; l = 2147483647; w = 0; o = 0; x = 24072; c = 0; while (1) { m = b[x >> 1] | 0; n = (Z(d - m << 16 >> 16, p) | 0) >> 16; n = Z(n, n) | 0; m = (Z(m + d << 16 >> 16, p) | 0) >> 16; m = Z(m, m) | 0; J = b[x + 2 >> 1] | 0; K = (Z(q - J << 16 >> 16, r) | 0) >> 16; n = (Z(K, K) | 0) + n | 0; J = (Z(J + q << 16 >> 16, r) | 0) >> 16; m = (Z(J, J) | 0) + m | 0; if ((n | 0) < (l | 0) | (m | 0) < (l | 0)) { K = b[x + 4 >> 1] | 0; J = (Z(s - K << 16 >> 16, t) | 0) >> 16; J = (Z(J, J) | 0) + n | 0; K = (Z(K + s << 16 >> 16, t) | 0) >> 16; K = (Z(K, K) | 0) + m | 0; m = b[x + 6 >> 1] | 0; n = (Z(u - m << 16 >> 16, v) | 0) >> 16; n = J + (Z(n, n) | 0) | 0; m = (Z(m + u << 16 >> 16, v) | 0) >> 16; m = K + (Z(m, m) | 0) | 0; K = (n | 0) < (l | 0); n = K ? n : l; J = (m | 0) < (n | 0); n = J ? m : n; o = K | J ? w : o; c = J ? 1 : K ? 0 : c; } else n = l; w = w + 1 << 16 >> 16; if (w << 16 >> 16 >= 256) break; else { l = n; x = x + 8 | 0; } } n = o << 16 >> 16; m = n << 2; o = m | 1; l = 24072 + (o << 1) | 0; d = b[24072 + (m << 1) >> 1] | 0; if (!(c << 16 >> 16)) { b[y >> 1] = d; b[A >> 1] = b[l >> 1] | 0; b[z >> 1] = b[24072 + (o + 1 << 1) >> 1] | 0; b[B >> 1] = b[24072 + ((m | 3) << 1) >> 1] | 0; c = n << 1; } else { b[y >> 1] = 0 - (d & 65535); b[A >> 1] = 0 - (e[l >> 1] | 0); b[z >> 1] = 0 - (e[24072 + (o + 1 << 1) >> 1] | 0); b[B >> 1] = 0 - (e[24072 + ((m | 3) << 1) >> 1] | 0); c = n << 1 & 65534 | 1; } b[h + 4 >> 1] = c; b[h + 6 >> 1] = we(F + 12 | 0, k + 12 | 0, 26120, b[C + 12 >> 1] | 0, b[C + 14 >> 1] | 0, b[D + 12 >> 1] | 0, b[D + 14 >> 1] | 0, 256) | 0; b[h + 8 >> 1] = we(F + 16 | 0, k + 16 | 0, 28168, b[C + 16 >> 1] | 0, b[C + 18 >> 1] | 0, b[D + 16 >> 1] | 0, b[D + 18 >> 1] | 0, 64) | 0; l = 0; m = G; n = H; d = E; c = F; while (1) { J = e[d >> 1] | 0; b[m >> 1] = J + (e[c >> 1] | 0); K = b[k >> 1] | 0; b[n >> 1] = J + (K & 65535); b[a + (l << 1) >> 1] = K; l = l + 1 | 0; if ((l | 0) == 10) break; else { m = m + 2 | 0; n = n + 2 | 0; d = d + 2 | 0; c = c + 2 | 0; k = k + 2 | 0; } } Ae(G, 205, 10, j); Ae(H, 205, 10, j); me(G, f, 10, j); me(H, g, 10, j); i = I; return } function we(a, c, d, e, f, g, h, i) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; h = h | 0; i = i | 0; var j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0; o = b[a >> 1] | 0; u = a + 2 | 0; q = b[u >> 1] | 0; s = b[c >> 1] | 0; v = c + 2 | 0; t = b[v >> 1] | 0; if (i << 16 >> 16 > 0) { n = e << 16 >> 16 << 1; m = f << 16 >> 16 << 1; l = g << 16 >> 16 << 1; f = h << 16 >> 16 << 1; g = 2147483647; j = 0; e = 0; k = d; while (1) { h = (Z(n, o - (b[k >> 1] | 0) | 0) | 0) >> 16; h = Z(h, h) | 0; if (((h | 0) < (g | 0) ? (p = (Z(m, q - (b[k + 2 >> 1] | 0) | 0) | 0) >> 16, p = (Z(p, p) | 0) + h | 0, (p | 0) < (g | 0)) : 0) ? (r = (Z(l, s - (b[k + 4 >> 1] | 0) | 0) | 0) >> 16, r = (Z(r, r) | 0) + p | 0, (r | 0) < (g | 0)) : 0) { h = (Z(f, t - (b[k + 6 >> 1] | 0) | 0) | 0) >> 16; h = (Z(h, h) | 0) + r | 0; w = (h | 0) < (g | 0); h = w ? h : g; e = w ? j : e; } else h = g; j = j + 1 << 16 >> 16; if (j << 16 >> 16 >= i << 16 >> 16) break; else { g = h; k = k + 8 | 0; } } } else e = 0; w = e << 16 >> 16 << 2; i = w | 1; b[a >> 1] = b[d + (w << 1) >> 1] | 0; b[u >> 1] = b[d + (i << 1) >> 1] | 0; b[c >> 1] = b[d + (i + 1 << 1) >> 1] | 0; b[v >> 1] = b[d + ((w | 3) << 1) >> 1] | 0; return e | 0 } function xe(a) { a = a | 0; var d = 0, e = 0, f = 0; if (!a) { f = -1; return f | 0 } c[a >> 2] = 0; d = Je(20) | 0; if (!d) { f = -1; return f | 0 } e = d; f = e + 20 | 0; do { b[e >> 1] = 0; e = e + 2 | 0; } while ((e | 0) < (f | 0)); c[a >> 2] = d; f = 0; return f | 0 } function ye(a) { a = a | 0; var c = 0; if (!a) { c = -1; return c | 0 } c = a + 20 | 0; do { b[a >> 1] = 0; a = a + 2 | 0; } while ((a | 0) < (c | 0)); c = 0; return c | 0 } function ze(a) { a = a | 0; var b = 0; if (!a) return; b = c[a >> 2] | 0; if (!b) return; Ke(b); c[a >> 2] = 0; return } function Ae(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0; if (d << 16 >> 16 <= 0) return; f = c << 16 >> 16; g = c & 65535; h = 0; while (1) { e = b[a >> 1] | 0; if (e << 16 >> 16 < c << 16 >> 16) { b[a >> 1] = c; e = (c << 16 >> 16) + f | 0; } else e = (e & 65535) + g | 0; h = h + 1 << 16 >> 16; if (h << 16 >> 16 >= d << 16 >> 16) break; else { c = e & 65535; a = a + 2 | 0; } } return } function Be(a, c, d, e) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0; f = e << 16 >> 16; e = f >>> 2 & 65535; if (!(e << 16 >> 16)) return; n = f + -1 | 0; t = a + 20 | 0; p = c + (f + -4 << 1) | 0; q = c + (f + -3 << 1) | 0; r = c + (f + -2 << 1) | 0; s = c + (n << 1) | 0; o = c + (f + -11 << 1) | 0; n = d + (n << 1) | 0; while (1) { c = b[t >> 1] | 0; h = 5; i = t; j = o; k = o + -2 | 0; l = o + -4 | 0; m = o + -6 | 0; g = 2048; a = 2048; f = 2048; d = 2048; while (1) { g = (Z(b[j >> 1] | 0, c) | 0) + g | 0; a = (Z(b[k >> 1] | 0, c) | 0) + a | 0; f = (Z(b[l >> 1] | 0, c) | 0) + f | 0; c = (Z(b[m >> 1] | 0, c) | 0) + d | 0; d = b[i + -2 >> 1] | 0; g = g + (Z(b[j + 2 >> 1] | 0, d) | 0) | 0; a = a + (Z(b[k + 2 >> 1] | 0, d) | 0) | 0; f = f + (Z(b[l + 2 >> 1] | 0, d) | 0) | 0; i = i + -4 | 0; d = c + (Z(b[m + 2 >> 1] | 0, d) | 0) | 0; h = h + -1 << 16 >> 16; c = b[i >> 1] | 0; if (!(h << 16 >> 16)) break; else { j = j + 4 | 0; k = k + 4 | 0; l = l + 4 | 0; m = m + 4 | 0; } } j = (Z(b[s >> 1] | 0, c) | 0) + g | 0; k = (Z(b[r >> 1] | 0, c) | 0) + a | 0; l = (Z(b[q >> 1] | 0, c) | 0) + f | 0; m = (Z(b[p >> 1] | 0, c) | 0) + d | 0; b[n >> 1] = j >>> 12; b[n + -2 >> 1] = k >>> 12; b[n + -4 >> 1] = l >>> 12; b[n + -6 >> 1] = m >>> 12; e = e + -1 << 16 >> 16; if (!(e << 16 >> 16)) break; else { p = p + -8 | 0; q = q + -8 | 0; r = r + -8 | 0; s = s + -8 | 0; o = o + -8 | 0; n = n + -8 | 0; } } return } function Ce(a, b) { a = a | 0; b = b | 0; var d = 0; d = a + 32768 | 0; if ((a | 0) > -1 & (d ^ a | 0) < 0) { c[b >> 2] = 1; d = (a >>> 31) + 2147483647 | 0; } return d >>> 16 & 65535 | 0 } function De(a, b, d) { a = a | 0; b = b | 0; d = d | 0; var e = 0, f = 0; e = b << 16 >> 16; if (!(b << 16 >> 16)) return a | 0; if (b << 16 >> 16 > 0) { a = a << 16 >> 16 >> (b << 16 >> 16 > 15 ? 15 : e) & 65535; return a | 0 } f = 0 - e | 0; b = a << 16 >> 16; f = (f & 65535) << 16 >> 16 > 15 ? 15 : f << 16 >> 16; e = b << f; if ((e << 16 >> 16 >> f | 0) == (b | 0)) { f = e & 65535; return f | 0 } c[d >> 2] = 1; f = a << 16 >> 16 > 0 ? 32767 : -32768; return f | 0 } function Ee(a, b, c) { a = a | 0; b = b | 0; c = c | 0; if (b << 16 >> 16 > 15) { b = 0; return b | 0 } c = De(a, b, c) | 0; if (b << 16 >> 16 > 0) return c + ((1 << (b << 16 >> 16) + -1 & a << 16 >> 16 | 0) != 0 & 1) << 16 >> 16 | 0; else { b = c; return b | 0 } return 0 } function Fe(a, d, f) { a = a | 0; d = d | 0; f = f | 0; var g = 0, h = 0, i = 0; if ((a | 0) < 1) { b[d >> 1] = 0; f = 0; return f | 0 } h = (pe(a) | 0) & 65534; i = h & 65535; h = h << 16 >> 16; if (i << 16 >> 16 > 0) { g = a << h; if ((g >> h | 0) != (a | 0)) g = a >> 31 ^ 2147483647; } else { h = 0 - h << 16; if ((h | 0) < 2031616) g = a >> (h >> 16); else g = 0; } b[d >> 1] = i; d = g >>> 25 & 63; d = d >>> 0 > 15 ? d + -16 | 0 : d; i = b[30216 + (d << 1) >> 1] | 0; a = i << 16; g = Z(i - (e[30216 + (d + 1 << 1) >> 1] | 0) << 16 >> 16, g >>> 10 & 32767) | 0; if ((g | 0) == 1073741824) { c[f >> 2] = 1; h = 2147483647; } else h = g << 1; g = a - h | 0; if (((g ^ a) & (h ^ a) | 0) >= 0) { f = g; return f | 0 } c[f >> 2] = 1; f = (i >>> 15 & 1) + 2147483647 | 0; return f | 0 } function Ge(a, b, d) { a = a | 0; b = b | 0; d = d | 0; a = (a << 16 >> 16) - (b << 16 >> 16) | 0; if ((a + 32768 | 0) >>> 0 <= 65535) { d = a; d = d & 65535; return d | 0 } c[d >> 2] = 1; d = (a | 0) > 32767 ? 32767 : -32768; d = d & 65535; return d | 0 } function He(a, c, d, e, f, g) { a = a | 0; c = c | 0; d = d | 0; e = e | 0; f = f | 0; g = g | 0; var h = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0; A = i; i = i + 48 | 0; o = A; k = o; h = f; j = k + 20 | 0; do { b[k >> 1] = b[h >> 1] | 0; k = k + 2 | 0; h = h + 2 | 0; } while ((k | 0) < (j | 0)); n = o + 18 | 0; s = a + 2 | 0; t = a + 4 | 0; p = c + 20 | 0; u = a + 6 | 0; v = a + 8 | 0; w = a + 10 | 0; x = a + 12 | 0; y = a + 14 | 0; z = a + 16 | 0; q = a + 18 | 0; r = a + 20 | 0; j = b[n >> 1] | 0; h = 5; l = c; m = d; k = o + 20 | 0; while (1) { D = b[a >> 1] | 0; C = (Z(D, b[l >> 1] | 0) | 0) + 2048 | 0; D = (Z(b[l + 2 >> 1] | 0, D) | 0) + 2048 | 0; o = j << 16 >> 16; C = C - (Z(o, b[s >> 1] | 0) | 0) | 0; B = b[t >> 1] | 0; o = D - (Z(o, B) | 0) | 0; D = b[n + -2 >> 1] | 0; B = C - (Z(D, B) | 0) | 0; C = b[u >> 1] | 0; D = o - (Z(C, D) | 0) | 0; o = b[n + -4 >> 1] | 0; C = B - (Z(o, C) | 0) | 0; B = b[v >> 1] | 0; o = D - (Z(B, o) | 0) | 0; D = b[n + -6 >> 1] | 0; B = C - (Z(D, B) | 0) | 0; C = b[w >> 1] | 0; D = o - (Z(D, C) | 0) | 0; o = b[n + -8 >> 1] | 0; C = B - (Z(o, C) | 0) | 0; B = b[x >> 1] | 0; o = D - (Z(B, o) | 0) | 0; D = b[n + -10 >> 1] | 0; B = C - (Z(D, B) | 0) | 0; C = b[y >> 1] | 0; D = o - (Z(C, D) | 0) | 0; o = b[n + -12 >> 1] | 0; C = B - (Z(o, C) | 0) | 0; B = b[z >> 1] | 0; o = D - (Z(o, B) | 0) | 0; D = b[n + -14 >> 1] | 0; B = C - (Z(D, B) | 0) | 0; C = b[q >> 1] | 0; D = o - (Z(C, D) | 0) | 0; o = b[n + -16 >> 1] | 0; C = B - (Z(o, C) | 0) | 0; B = b[r >> 1] | 0; o = D - (Z(B, o) | 0) | 0; B = C - (Z(b[n + -18 >> 1] | 0, B) | 0) | 0; B = (B + 134217728 | 0) >>> 0 < 268435455 ? B >>> 12 & 65535 : (B | 0) > 134217727 ? 32767 : -32768; o = o - (Z(b[s >> 1] | 0, B << 16 >> 16) | 0) | 0; n = k + 2 | 0; b[k >> 1] = B; b[m >> 1] = B; j = (o + 134217728 | 0) >>> 0 < 268435455 ? o >>> 12 & 65535 : (o | 0) > 134217727 ? 32767 : -32768; b[n >> 1] = j; b[m + 2 >> 1] = j; h = h + -1 << 16 >> 16; if (!(h << 16 >> 16)) break; else { l = l + 4 | 0; m = m + 4 | 0; k = k + 4 | 0; } } e = (e << 16 >> 16) + -10 | 0; k = e >>> 1 & 65535; if (k << 16 >> 16) { o = d + 18 | 0; j = c + 16 | 0; n = b[o >> 1] | 0; l = p; h = d + 20 | 0; while (1) { B = b[a >> 1] | 0; m = (Z(B, b[l >> 1] | 0) | 0) + 2048 | 0; B = (Z(b[j + 6 >> 1] | 0, B) | 0) + 2048 | 0; j = b[s >> 1] | 0; C = n << 16 >> 16; m = m - (Z(C, j) | 0) | 0; D = b[t >> 1] | 0; C = B - (Z(C, D) | 0) | 0; B = b[o + -2 >> 1] | 0; D = m - (Z(B, D) | 0) | 0; m = b[u >> 1] | 0; B = C - (Z(m, B) | 0) | 0; C = b[o + -4 >> 1] | 0; m = D - (Z(C, m) | 0) | 0; D = b[v >> 1] | 0; C = B - (Z(D, C) | 0) | 0; B = b[o + -6 >> 1] | 0; D = m - (Z(B, D) | 0) | 0; m = b[w >> 1] | 0; B = C - (Z(B, m) | 0) | 0; C = b[o + -8 >> 1] | 0; m = D - (Z(C, m) | 0) | 0; D = b[x >> 1] | 0; C = B - (Z(D, C) | 0) | 0; B = b[o + -10 >> 1] | 0; D = m - (Z(B, D) | 0) | 0; m = b[y >> 1] | 0; B = C - (Z(m, B) | 0) | 0; C = b[o + -12 >> 1] | 0; m = D - (Z(C, m) | 0) | 0; D = b[z >> 1] | 0; C = B - (Z(C, D) | 0) | 0; B = b[o + -14 >> 1] | 0; D = m - (Z(B, D) | 0) | 0; m = b[q >> 1] | 0; B = C - (Z(m, B) | 0) | 0; C = b[o + -16 >> 1] | 0; m = D - (Z(C, m) | 0) | 0; D = b[r >> 1] | 0; C = B - (Z(D, C) | 0) | 0; D = m - (Z(b[o + -18 >> 1] | 0, D) | 0) | 0; m = l + 4 | 0; D = (D + 134217728 | 0) >>> 0 < 268435455 ? D >>> 12 & 65535 : (D | 0) > 134217727 ? 32767 : -32768; j = C - (Z(j, D << 16 >> 16) | 0) | 0; o = h + 2 | 0; b[h >> 1] = D; do if ((j + 134217728 | 0) >>> 0 >= 268435455) { h = h + 4 | 0; if ((j | 0) > 134217727) { b[o >> 1] = 32767; j = 32767; break } else { b[o >> 1] = -32768; j = -32768; break } } else { j = j >>> 12 & 65535; b[o >> 1] = j; h = h + 4 | 0; } while (0); k = k + -1 << 16 >> 16; if (!(k << 16 >> 16)) break; else { D = l; n = j; l = m; j = D; } } } if (!(g << 16 >> 16)) { i = A; return } k = f; h = d + (e << 1) | 0; j = k + 20 | 0; do { b[k >> 1] = b[h >> 1] | 0; k = k + 2 | 0; h = h + 2 | 0; } while ((k | 0) < (j | 0)); i = A; return } function Ie(a, c, d) { a = a | 0; c = c | 0; d = d | 0; b[d >> 1] = b[a >> 1] | 0; b[d + 2 >> 1] = ((Z(b[c >> 1] | 0, b[a + 2 >> 1] | 0) | 0) + 16384 | 0) >>> 15; b[d + 4 >> 1] = ((Z(b[c + 2 >> 1] | 0, b[a + 4 >> 1] | 0) | 0) + 16384 | 0) >>> 15; b[d + 6 >> 1] = ((Z(b[c + 4 >> 1] | 0, b[a + 6 >> 1] | 0) | 0) + 16384 | 0) >>> 15; b[d + 8 >> 1] = ((Z(b[c + 6 >> 1] | 0, b[a + 8 >> 1] | 0) | 0) + 16384 | 0) >>> 15; b[d + 10 >> 1] = ((Z(b[c + 8 >> 1] | 0, b[a + 10 >> 1] | 0) | 0) + 16384 | 0) >>> 15; b[d + 12 >> 1] = ((Z(b[c + 10 >> 1] | 0, b[a + 12 >> 1] | 0) | 0) + 16384 | 0) >>> 15; b[d + 14 >> 1] = ((Z(b[c + 12 >> 1] | 0, b[a + 14 >> 1] | 0) | 0) + 16384 | 0) >>> 15; b[d + 16 >> 1] = ((Z(b[c + 14 >> 1] | 0, b[a + 16 >> 1] | 0) | 0) + 16384 | 0) >>> 15; b[d + 18 >> 1] = ((Z(b[c + 16 >> 1] | 0, b[a + 18 >> 1] | 0) | 0) + 16384 | 0) >>> 15; b[d + 20 >> 1] = ((Z(b[c + 18 >> 1] | 0, b[a + 20 >> 1] | 0) | 0) + 16384 | 0) >>> 15; return } function Je(a) { a = a | 0; var b = 0, d = 0, e = 0, f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0, H = 0, I = 0, J = 0, K = 0, L = 0, M = 0, N = 0, O = 0, P = 0, Q = 0, R = 0, S = 0, T = 0, U = 0, V = 0; do if (a >>> 0 < 245) { s = a >>> 0 < 11 ? 16 : a + 11 & -8; a = s >>> 3; m = c[26] | 0; j = m >>> a; if (j & 3) { e = (j & 1 ^ 1) + a | 0; b = e << 1; d = 144 + (b << 2) | 0; b = 144 + (b + 2 << 2) | 0; f = c[b >> 2] | 0; g = f + 8 | 0; h = c[g >> 2] | 0; do if ((d | 0) == (h | 0)) c[26] = m & ~(1 << e); else { if (h >>> 0 >= (c[30] | 0) >>> 0 ? (l = h + 12 | 0, (c[l >> 2] | 0) == (f | 0)) : 0) { c[l >> 2] = d; c[b >> 2] = h; break } ea(); } while (0); U = e << 3; c[f + 4 >> 2] = U | 3; U = f + (U | 4) | 0; c[U >> 2] = c[U >> 2] | 1; break } b = c[28] | 0; if (s >>> 0 > b >>> 0) { if (j) { f = 2 << a; f = j << a & (f | 0 - f); f = (f & 0 - f) + -1 | 0; g = f >>> 12 & 16; f = f >>> g; e = f >>> 5 & 8; f = f >>> e; d = f >>> 2 & 4; f = f >>> d; h = f >>> 1 & 2; f = f >>> h; i = f >>> 1 & 1; i = (e | g | d | h | i) + (f >>> i) | 0; f = i << 1; h = 144 + (f << 2) | 0; f = 144 + (f + 2 << 2) | 0; d = c[f >> 2] | 0; g = d + 8 | 0; e = c[g >> 2] | 0; do if ((h | 0) == (e | 0)) { c[26] = m & ~(1 << i); n = b; } else { if (e >>> 0 >= (c[30] | 0) >>> 0 ? (k = e + 12 | 0, (c[k >> 2] | 0) == (d | 0)) : 0) { c[k >> 2] = h; c[f >> 2] = e; n = c[28] | 0; break } ea(); } while (0); U = i << 3; b = U - s | 0; c[d + 4 >> 2] = s | 3; j = d + s | 0; c[d + (s | 4) >> 2] = b | 1; c[d + U >> 2] = b; if (n) { d = c[31] | 0; e = n >>> 3; h = e << 1; i = 144 + (h << 2) | 0; f = c[26] | 0; e = 1 << e; if (f & e) { f = 144 + (h + 2 << 2) | 0; h = c[f >> 2] | 0; if (h >>> 0 < (c[30] | 0) >>> 0) ea(); else { p = f; q = h; } } else { c[26] = f | e; p = 144 + (h + 2 << 2) | 0; q = i; } c[p >> 2] = d; c[q + 12 >> 2] = d; c[d + 8 >> 2] = q; c[d + 12 >> 2] = i; } c[28] = b; c[31] = j; break } a = c[27] | 0; if (a) { f = (a & 0 - a) + -1 | 0; T = f >>> 12 & 16; f = f >>> T; S = f >>> 5 & 8; f = f >>> S; U = f >>> 2 & 4; f = f >>> U; h = f >>> 1 & 2; f = f >>> h; j = f >>> 1 & 1; j = c[408 + ((S | T | U | h | j) + (f >>> j) << 2) >> 2] | 0; f = (c[j + 4 >> 2] & -8) - s | 0; h = j; while (1) { i = c[h + 16 >> 2] | 0; if (!i) { i = c[h + 20 >> 2] | 0; if (!i) { b = f; break } } h = (c[i + 4 >> 2] & -8) - s | 0; U = h >>> 0 < f >>> 0; f = U ? h : f; h = i; j = U ? i : j; } a = c[30] | 0; if (j >>> 0 >= a >>> 0 ? (v = j + s | 0, j >>> 0 < v >>> 0) : 0) { e = c[j + 24 >> 2] | 0; i = c[j + 12 >> 2] | 0; do if ((i | 0) == (j | 0)) { h = j + 20 | 0; i = c[h >> 2] | 0; if (!i) { h = j + 16 | 0; i = c[h >> 2] | 0; if (!i) { t = 0; break } } while (1) { g = i + 20 | 0; f = c[g >> 2] | 0; if (f) { i = f; h = g; continue } g = i + 16 | 0; f = c[g >> 2] | 0; if (!f) break; else { i = f; h = g; } } if (h >>> 0 < a >>> 0) ea(); else { c[h >> 2] = 0; t = i; break } } else { h = c[j + 8 >> 2] | 0; if ((h >>> 0 >= a >>> 0 ? (d = h + 12 | 0, (c[d >> 2] | 0) == (j | 0)) : 0) ? (o = i + 8 | 0, (c[o >> 2] | 0) == (j | 0)) : 0) { c[d >> 2] = i; c[o >> 2] = h; t = i; break } ea(); } while (0); do if (e) { h = c[j + 28 >> 2] | 0; g = 408 + (h << 2) | 0; if ((j | 0) == (c[g >> 2] | 0)) { c[g >> 2] = t; if (!t) { c[27] = c[27] & ~(1 << h); break } } else { if (e >>> 0 < (c[30] | 0) >>> 0) ea(); h = e + 16 | 0; if ((c[h >> 2] | 0) == (j | 0)) c[h >> 2] = t; else c[e + 20 >> 2] = t; if (!t) break } g = c[30] | 0; if (t >>> 0 < g >>> 0) ea(); c[t + 24 >> 2] = e; h = c[j + 16 >> 2] | 0; do if (h) if (h >>> 0 < g >>> 0) ea(); else { c[t + 16 >> 2] = h; c[h + 24 >> 2] = t; break } while (0); h = c[j + 20 >> 2] | 0; if (h) if (h >>> 0 < (c[30] | 0) >>> 0) ea(); else { c[t + 20 >> 2] = h; c[h + 24 >> 2] = t; break } } while (0); if (b >>> 0 < 16) { U = b + s | 0; c[j + 4 >> 2] = U | 3; U = j + (U + 4) | 0; c[U >> 2] = c[U >> 2] | 1; } else { c[j + 4 >> 2] = s | 3; c[j + (s | 4) >> 2] = b | 1; c[j + (b + s) >> 2] = b; e = c[28] | 0; if (e) { d = c[31] | 0; f = e >>> 3; h = f << 1; i = 144 + (h << 2) | 0; g = c[26] | 0; f = 1 << f; if (g & f) { h = 144 + (h + 2 << 2) | 0; g = c[h >> 2] | 0; if (g >>> 0 < (c[30] | 0) >>> 0) ea(); else { u = h; w = g; } } else { c[26] = g | f; u = 144 + (h + 2 << 2) | 0; w = i; } c[u >> 2] = d; c[w + 12 >> 2] = d; c[d + 8 >> 2] = w; c[d + 12 >> 2] = i; } c[28] = b; c[31] = v; } g = j + 8 | 0; break } ea(); } else V = 154; } else V = 154; } else if (a >>> 0 <= 4294967231) { a = a + 11 | 0; w = a & -8; m = c[27] | 0; if (m) { j = 0 - w | 0; a = a >>> 8; if (a) if (w >>> 0 > 16777215) l = 31; else { v = (a + 1048320 | 0) >>> 16 & 8; V = a << v; u = (V + 520192 | 0) >>> 16 & 4; V = V << u; l = (V + 245760 | 0) >>> 16 & 2; l = 14 - (u | v | l) + (V << l >>> 15) | 0; l = w >>> (l + 7 | 0) & 1 | l << 1; } else l = 0; a = c[408 + (l << 2) >> 2] | 0; a:do if (!a) { i = 0; a = 0; V = 86; } else { d = j; i = 0; b = w << ((l | 0) == 31 ? 0 : 25 - (l >>> 1) | 0); k = a; a = 0; while (1) { e = c[k + 4 >> 2] & -8; j = e - w | 0; if (j >>> 0 < d >>> 0) if ((e | 0) == (w | 0)) { e = k; a = k; V = 90; break a } else a = k; else j = d; V = c[k + 20 >> 2] | 0; k = c[k + 16 + (b >>> 31 << 2) >> 2] | 0; i = (V | 0) == 0 | (V | 0) == (k | 0) ? i : V; if (!k) { V = 86; break } else { d = j; b = b << 1; } } } while (0); if ((V | 0) == 86) { if ((i | 0) == 0 & (a | 0) == 0) { a = 2 << l; a = m & (a | 0 - a); if (!a) { s = w; V = 154; break } a = (a & 0 - a) + -1 | 0; t = a >>> 12 & 16; a = a >>> t; q = a >>> 5 & 8; a = a >>> q; u = a >>> 2 & 4; a = a >>> u; v = a >>> 1 & 2; a = a >>> v; i = a >>> 1 & 1; i = c[408 + ((q | t | u | v | i) + (a >>> i) << 2) >> 2] | 0; a = 0; } if (!i) { q = j; p = a; } else { e = i; V = 90; } } if ((V | 0) == 90) while (1) { V = 0; v = (c[e + 4 >> 2] & -8) - w | 0; i = v >>> 0 < j >>> 0; j = i ? v : j; a = i ? e : a; i = c[e + 16 >> 2] | 0; if (i) { e = i; V = 90; continue } e = c[e + 20 >> 2] | 0; if (!e) { q = j; p = a; break } else V = 90; } if ((p | 0) != 0 ? q >>> 0 < ((c[28] | 0) - w | 0) >>> 0 : 0) { a = c[30] | 0; if (p >>> 0 >= a >>> 0 ? (H = p + w | 0, p >>> 0 < H >>> 0) : 0) { j = c[p + 24 >> 2] | 0; i = c[p + 12 >> 2] | 0; do if ((i | 0) == (p | 0)) { h = p + 20 | 0; i = c[h >> 2] | 0; if (!i) { h = p + 16 | 0; i = c[h >> 2] | 0; if (!i) { y = 0; break } } while (1) { g = i + 20 | 0; f = c[g >> 2] | 0; if (f) { i = f; h = g; continue } g = i + 16 | 0; f = c[g >> 2] | 0; if (!f) break; else { i = f; h = g; } } if (h >>> 0 < a >>> 0) ea(); else { c[h >> 2] = 0; y = i; break } } else { h = c[p + 8 >> 2] | 0; if ((h >>> 0 >= a >>> 0 ? (r = h + 12 | 0, (c[r >> 2] | 0) == (p | 0)) : 0) ? (s = i + 8 | 0, (c[s >> 2] | 0) == (p | 0)) : 0) { c[r >> 2] = i; c[s >> 2] = h; y = i; break } ea(); } while (0); do if (j) { i = c[p + 28 >> 2] | 0; h = 408 + (i << 2) | 0; if ((p | 0) == (c[h >> 2] | 0)) { c[h >> 2] = y; if (!y) { c[27] = c[27] & ~(1 << i); break } } else { if (j >>> 0 < (c[30] | 0) >>> 0) ea(); h = j + 16 | 0; if ((c[h >> 2] | 0) == (p | 0)) c[h >> 2] = y; else c[j + 20 >> 2] = y; if (!y) break } i = c[30] | 0; if (y >>> 0 < i >>> 0) ea(); c[y + 24 >> 2] = j; h = c[p + 16 >> 2] | 0; do if (h) if (h >>> 0 < i >>> 0) ea(); else { c[y + 16 >> 2] = h; c[h + 24 >> 2] = y; break } while (0); h = c[p + 20 >> 2] | 0; if (h) if (h >>> 0 < (c[30] | 0) >>> 0) ea(); else { c[y + 20 >> 2] = h; c[h + 24 >> 2] = y; break } } while (0); b:do if (q >>> 0 >= 16) { c[p + 4 >> 2] = w | 3; c[p + (w | 4) >> 2] = q | 1; c[p + (q + w) >> 2] = q; i = q >>> 3; if (q >>> 0 < 256) { g = i << 1; e = 144 + (g << 2) | 0; f = c[26] | 0; h = 1 << i; if (f & h) { h = 144 + (g + 2 << 2) | 0; g = c[h >> 2] | 0; if (g >>> 0 < (c[30] | 0) >>> 0) ea(); else { z = h; A = g; } } else { c[26] = f | h; z = 144 + (g + 2 << 2) | 0; A = e; } c[z >> 2] = H; c[A + 12 >> 2] = H; c[p + (w + 8) >> 2] = A; c[p + (w + 12) >> 2] = e; break } d = q >>> 8; if (d) if (q >>> 0 > 16777215) i = 31; else { T = (d + 1048320 | 0) >>> 16 & 8; U = d << T; S = (U + 520192 | 0) >>> 16 & 4; U = U << S; i = (U + 245760 | 0) >>> 16 & 2; i = 14 - (S | T | i) + (U << i >>> 15) | 0; i = q >>> (i + 7 | 0) & 1 | i << 1; } else i = 0; h = 408 + (i << 2) | 0; c[p + (w + 28) >> 2] = i; c[p + (w + 20) >> 2] = 0; c[p + (w + 16) >> 2] = 0; g = c[27] | 0; f = 1 << i; if (!(g & f)) { c[27] = g | f; c[h >> 2] = H; c[p + (w + 24) >> 2] = h; c[p + (w + 12) >> 2] = H; c[p + (w + 8) >> 2] = H; break } d = c[h >> 2] | 0; c:do if ((c[d + 4 >> 2] & -8 | 0) != (q | 0)) { i = q << ((i | 0) == 31 ? 0 : 25 - (i >>> 1) | 0); while (1) { b = d + 16 + (i >>> 31 << 2) | 0; h = c[b >> 2] | 0; if (!h) break; if ((c[h + 4 >> 2] & -8 | 0) == (q | 0)) { C = h; break c } else { i = i << 1; d = h; } } if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else { c[b >> 2] = H; c[p + (w + 24) >> 2] = d; c[p + (w + 12) >> 2] = H; c[p + (w + 8) >> 2] = H; break b } } else C = d; while (0); d = C + 8 | 0; b = c[d >> 2] | 0; U = c[30] | 0; if (b >>> 0 >= U >>> 0 & C >>> 0 >= U >>> 0) { c[b + 12 >> 2] = H; c[d >> 2] = H; c[p + (w + 8) >> 2] = b; c[p + (w + 12) >> 2] = C; c[p + (w + 24) >> 2] = 0; break } else ea(); } else { U = q + w | 0; c[p + 4 >> 2] = U | 3; U = p + (U + 4) | 0; c[U >> 2] = c[U >> 2] | 1; } while (0); g = p + 8 | 0; break } ea(); } else { s = w; V = 154; } } else { s = w; V = 154; } } else { s = -1; V = 154; } while (0); d:do if ((V | 0) == 154) { a = c[28] | 0; if (a >>> 0 >= s >>> 0) { b = a - s | 0; d = c[31] | 0; if (b >>> 0 > 15) { c[31] = d + s; c[28] = b; c[d + (s + 4) >> 2] = b | 1; c[d + a >> 2] = b; c[d + 4 >> 2] = s | 3; } else { c[28] = 0; c[31] = 0; c[d + 4 >> 2] = a | 3; V = d + (a + 4) | 0; c[V >> 2] = c[V >> 2] | 1; } g = d + 8 | 0; break } a = c[29] | 0; if (a >>> 0 > s >>> 0) { V = a - s | 0; c[29] = V; g = c[32] | 0; c[32] = g + s; c[g + (s + 4) >> 2] = V | 1; c[g + 4 >> 2] = s | 3; g = g + 8 | 0; break } if (!(c[144] | 0)) Me(); m = s + 48 | 0; d = c[146] | 0; l = s + 47 | 0; e = d + l | 0; d = 0 - d | 0; k = e & d; if (k >>> 0 > s >>> 0) { a = c[136] | 0; if ((a | 0) != 0 ? (C = c[134] | 0, H = C + k | 0, H >>> 0 <= C >>> 0 | H >>> 0 > a >>> 0) : 0) { g = 0; break } e:do if (!(c[137] & 4)) { a = c[32] | 0; f:do if (a) { i = 552; while (1) { j = c[i >> 2] | 0; if (j >>> 0 <= a >>> 0 ? (x = i + 4 | 0, (j + (c[x >> 2] | 0) | 0) >>> 0 > a >>> 0) : 0) { g = i; a = x; break } i = c[i + 8 >> 2] | 0; if (!i) { V = 172; break f } } j = e - (c[29] | 0) & d; if (j >>> 0 < 2147483647) { i = ga(j | 0) | 0; H = (i | 0) == ((c[g >> 2] | 0) + (c[a >> 2] | 0) | 0); a = H ? j : 0; if (H) { if ((i | 0) != (-1 | 0)) { A = i; t = a; V = 192; break e } } else V = 182; } else a = 0; } else V = 172; while (0); do if ((V | 0) == 172) { g = ga(0) | 0; if ((g | 0) != (-1 | 0)) { a = g; j = c[145] | 0; i = j + -1 | 0; if (!(i & a)) j = k; else j = k - a + (i + a & 0 - j) | 0; a = c[134] | 0; i = a + j | 0; if (j >>> 0 > s >>> 0 & j >>> 0 < 2147483647) { H = c[136] | 0; if ((H | 0) != 0 ? i >>> 0 <= a >>> 0 | i >>> 0 > H >>> 0 : 0) { a = 0; break } i = ga(j | 0) | 0; V = (i | 0) == (g | 0); a = V ? j : 0; if (V) { A = g; t = a; V = 192; break e } else V = 182; } else a = 0; } else a = 0; } while (0); g:do if ((V | 0) == 182) { g = 0 - j | 0; do if (m >>> 0 > j >>> 0 & (j >>> 0 < 2147483647 & (i | 0) != (-1 | 0)) ? (B = c[146] | 0, B = l - j + B & 0 - B, B >>> 0 < 2147483647) : 0) if ((ga(B | 0) | 0) == (-1 | 0)) { ga(g | 0) | 0; break g } else { j = B + j | 0; break } while (0); if ((i | 0) != (-1 | 0)) { A = i; t = j; V = 192; break e } } while (0); c[137] = c[137] | 4; V = 189; } else { a = 0; V = 189; } while (0); if ((((V | 0) == 189 ? k >>> 0 < 2147483647 : 0) ? (D = ga(k | 0) | 0, E = ga(0) | 0, D >>> 0 < E >>> 0 & ((D | 0) != (-1 | 0) & (E | 0) != (-1 | 0))) : 0) ? (F = E - D | 0, G = F >>> 0 > (s + 40 | 0) >>> 0, G) : 0) { A = D; t = G ? F : a; V = 192; } if ((V | 0) == 192) { j = (c[134] | 0) + t | 0; c[134] = j; if (j >>> 0 > (c[135] | 0) >>> 0) c[135] = j; q = c[32] | 0; h:do if (q) { g = 552; do { a = c[g >> 2] | 0; j = g + 4 | 0; i = c[j >> 2] | 0; if ((A | 0) == (a + i | 0)) { I = a; J = j; K = i; L = g; V = 202; break } g = c[g + 8 >> 2] | 0; } while ((g | 0) != 0); if (((V | 0) == 202 ? (c[L + 12 >> 2] & 8 | 0) == 0 : 0) ? q >>> 0 < A >>> 0 & q >>> 0 >= I >>> 0 : 0) { c[J >> 2] = K + t; V = (c[29] | 0) + t | 0; U = q + 8 | 0; U = (U & 7 | 0) == 0 ? 0 : 0 - U & 7; T = V - U | 0; c[32] = q + U; c[29] = T; c[q + (U + 4) >> 2] = T | 1; c[q + (V + 4) >> 2] = 40; c[33] = c[148]; break } j = c[30] | 0; if (A >>> 0 < j >>> 0) { c[30] = A; j = A; } i = A + t | 0; a = 552; while (1) { if ((c[a >> 2] | 0) == (i | 0)) { g = a; i = a; V = 210; break } a = c[a + 8 >> 2] | 0; if (!a) { i = 552; break } } if ((V | 0) == 210) if (!(c[i + 12 >> 2] & 8)) { c[g >> 2] = A; o = i + 4 | 0; c[o >> 2] = (c[o >> 2] | 0) + t; o = A + 8 | 0; o = (o & 7 | 0) == 0 ? 0 : 0 - o & 7; l = A + (t + 8) | 0; l = (l & 7 | 0) == 0 ? 0 : 0 - l & 7; i = A + (l + t) | 0; p = o + s | 0; n = A + p | 0; a = i - (A + o) - s | 0; c[A + (o + 4) >> 2] = s | 3; i:do if ((i | 0) != (q | 0)) { if ((i | 0) == (c[31] | 0)) { V = (c[28] | 0) + a | 0; c[28] = V; c[31] = n; c[A + (p + 4) >> 2] = V | 1; c[A + (V + p) >> 2] = V; break } b = t + 4 | 0; h = c[A + (b + l) >> 2] | 0; if ((h & 3 | 0) == 1) { k = h & -8; e = h >>> 3; j:do if (h >>> 0 >= 256) { d = c[A + ((l | 24) + t) >> 2] | 0; g = c[A + (t + 12 + l) >> 2] | 0; k:do if ((g | 0) == (i | 0)) { f = l | 16; g = A + (b + f) | 0; h = c[g >> 2] | 0; if (!h) { g = A + (f + t) | 0; h = c[g >> 2] | 0; if (!h) { R = 0; break } } while (1) { f = h + 20 | 0; e = c[f >> 2] | 0; if (e) { h = e; g = f; continue } f = h + 16 | 0; e = c[f >> 2] | 0; if (!e) break; else { h = e; g = f; } } if (g >>> 0 < j >>> 0) ea(); else { c[g >> 2] = 0; R = h; break } } else { f = c[A + ((l | 8) + t) >> 2] | 0; do if (f >>> 0 >= j >>> 0) { j = f + 12 | 0; if ((c[j >> 2] | 0) != (i | 0)) break; h = g + 8 | 0; if ((c[h >> 2] | 0) != (i | 0)) break; c[j >> 2] = g; c[h >> 2] = f; R = g; break k } while (0); ea(); } while (0); if (!d) break; j = c[A + (t + 28 + l) >> 2] | 0; h = 408 + (j << 2) | 0; do if ((i | 0) != (c[h >> 2] | 0)) { if (d >>> 0 < (c[30] | 0) >>> 0) ea(); h = d + 16 | 0; if ((c[h >> 2] | 0) == (i | 0)) c[h >> 2] = R; else c[d + 20 >> 2] = R; if (!R) break j } else { c[h >> 2] = R; if (R) break; c[27] = c[27] & ~(1 << j); break j } while (0); j = c[30] | 0; if (R >>> 0 < j >>> 0) ea(); c[R + 24 >> 2] = d; i = l | 16; h = c[A + (i + t) >> 2] | 0; do if (h) if (h >>> 0 < j >>> 0) ea(); else { c[R + 16 >> 2] = h; c[h + 24 >> 2] = R; break } while (0); i = c[A + (b + i) >> 2] | 0; if (!i) break; if (i >>> 0 < (c[30] | 0) >>> 0) ea(); else { c[R + 20 >> 2] = i; c[i + 24 >> 2] = R; break } } else { h = c[A + ((l | 8) + t) >> 2] | 0; g = c[A + (t + 12 + l) >> 2] | 0; f = 144 + (e << 1 << 2) | 0; do if ((h | 0) != (f | 0)) { if (h >>> 0 >= j >>> 0 ? (c[h + 12 >> 2] | 0) == (i | 0) : 0) break; ea(); } while (0); if ((g | 0) == (h | 0)) { c[26] = c[26] & ~(1 << e); break } do if ((g | 0) == (f | 0)) M = g + 8 | 0; else { if (g >>> 0 >= j >>> 0 ? (N = g + 8 | 0, (c[N >> 2] | 0) == (i | 0)) : 0) { M = N; break } ea(); } while (0); c[h + 12 >> 2] = g; c[M >> 2] = h; } while (0); i = A + ((k | l) + t) | 0; a = k + a | 0; } i = i + 4 | 0; c[i >> 2] = c[i >> 2] & -2; c[A + (p + 4) >> 2] = a | 1; c[A + (a + p) >> 2] = a; i = a >>> 3; if (a >>> 0 < 256) { g = i << 1; e = 144 + (g << 2) | 0; f = c[26] | 0; h = 1 << i; do if (!(f & h)) { c[26] = f | h; S = 144 + (g + 2 << 2) | 0; T = e; } else { h = 144 + (g + 2 << 2) | 0; g = c[h >> 2] | 0; if (g >>> 0 >= (c[30] | 0) >>> 0) { S = h; T = g; break } ea(); } while (0); c[S >> 2] = n; c[T + 12 >> 2] = n; c[A + (p + 8) >> 2] = T; c[A + (p + 12) >> 2] = e; break } d = a >>> 8; do if (!d) i = 0; else { if (a >>> 0 > 16777215) { i = 31; break } T = (d + 1048320 | 0) >>> 16 & 8; V = d << T; S = (V + 520192 | 0) >>> 16 & 4; V = V << S; i = (V + 245760 | 0) >>> 16 & 2; i = 14 - (S | T | i) + (V << i >>> 15) | 0; i = a >>> (i + 7 | 0) & 1 | i << 1; } while (0); h = 408 + (i << 2) | 0; c[A + (p + 28) >> 2] = i; c[A + (p + 20) >> 2] = 0; c[A + (p + 16) >> 2] = 0; g = c[27] | 0; f = 1 << i; if (!(g & f)) { c[27] = g | f; c[h >> 2] = n; c[A + (p + 24) >> 2] = h; c[A + (p + 12) >> 2] = n; c[A + (p + 8) >> 2] = n; break } d = c[h >> 2] | 0; l:do if ((c[d + 4 >> 2] & -8 | 0) != (a | 0)) { i = a << ((i | 0) == 31 ? 0 : 25 - (i >>> 1) | 0); while (1) { b = d + 16 + (i >>> 31 << 2) | 0; h = c[b >> 2] | 0; if (!h) break; if ((c[h + 4 >> 2] & -8 | 0) == (a | 0)) { U = h; break l } else { i = i << 1; d = h; } } if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else { c[b >> 2] = n; c[A + (p + 24) >> 2] = d; c[A + (p + 12) >> 2] = n; c[A + (p + 8) >> 2] = n; break i } } else U = d; while (0); d = U + 8 | 0; b = c[d >> 2] | 0; V = c[30] | 0; if (b >>> 0 >= V >>> 0 & U >>> 0 >= V >>> 0) { c[b + 12 >> 2] = n; c[d >> 2] = n; c[A + (p + 8) >> 2] = b; c[A + (p + 12) >> 2] = U; c[A + (p + 24) >> 2] = 0; break } else ea(); } else { V = (c[29] | 0) + a | 0; c[29] = V; c[32] = n; c[A + (p + 4) >> 2] = V | 1; } while (0); g = A + (o | 8) | 0; break d } else i = 552; while (1) { g = c[i >> 2] | 0; if (g >>> 0 <= q >>> 0 ? (h = c[i + 4 >> 2] | 0, f = g + h | 0, f >>> 0 > q >>> 0) : 0) break; i = c[i + 8 >> 2] | 0; } i = g + (h + -39) | 0; i = g + (h + -47 + ((i & 7 | 0) == 0 ? 0 : 0 - i & 7)) | 0; j = q + 16 | 0; i = i >>> 0 < j >>> 0 ? q : i; h = i + 8 | 0; g = A + 8 | 0; g = (g & 7 | 0) == 0 ? 0 : 0 - g & 7; V = t + -40 - g | 0; c[32] = A + g; c[29] = V; c[A + (g + 4) >> 2] = V | 1; c[A + (t + -36) >> 2] = 40; c[33] = c[148]; g = i + 4 | 0; c[g >> 2] = 27; c[h >> 2] = c[138]; c[h + 4 >> 2] = c[139]; c[h + 8 >> 2] = c[140]; c[h + 12 >> 2] = c[141]; c[138] = A; c[139] = t; c[141] = 0; c[140] = h; h = i + 28 | 0; c[h >> 2] = 7; if ((i + 32 | 0) >>> 0 < f >>> 0) do { V = h; h = h + 4 | 0; c[h >> 2] = 7; } while ((V + 8 | 0) >>> 0 < f >>> 0); if ((i | 0) != (q | 0)) { a = i - q | 0; c[g >> 2] = c[g >> 2] & -2; c[q + 4 >> 2] = a | 1; c[i >> 2] = a; f = a >>> 3; if (a >>> 0 < 256) { h = f << 1; i = 144 + (h << 2) | 0; g = c[26] | 0; e = 1 << f; if (g & e) { d = 144 + (h + 2 << 2) | 0; b = c[d >> 2] | 0; if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else { O = d; P = b; } } else { c[26] = g | e; O = 144 + (h + 2 << 2) | 0; P = i; } c[O >> 2] = q; c[P + 12 >> 2] = q; c[q + 8 >> 2] = P; c[q + 12 >> 2] = i; break } d = a >>> 8; if (d) if (a >>> 0 > 16777215) h = 31; else { U = (d + 1048320 | 0) >>> 16 & 8; V = d << U; T = (V + 520192 | 0) >>> 16 & 4; V = V << T; h = (V + 245760 | 0) >>> 16 & 2; h = 14 - (T | U | h) + (V << h >>> 15) | 0; h = a >>> (h + 7 | 0) & 1 | h << 1; } else h = 0; e = 408 + (h << 2) | 0; c[q + 28 >> 2] = h; c[q + 20 >> 2] = 0; c[j >> 2] = 0; d = c[27] | 0; b = 1 << h; if (!(d & b)) { c[27] = d | b; c[e >> 2] = q; c[q + 24 >> 2] = e; c[q + 12 >> 2] = q; c[q + 8 >> 2] = q; break } d = c[e >> 2] | 0; m:do if ((c[d + 4 >> 2] & -8 | 0) != (a | 0)) { h = a << ((h | 0) == 31 ? 0 : 25 - (h >>> 1) | 0); while (1) { b = d + 16 + (h >>> 31 << 2) | 0; e = c[b >> 2] | 0; if (!e) break; if ((c[e + 4 >> 2] & -8 | 0) == (a | 0)) { Q = e; break m } else { h = h << 1; d = e; } } if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else { c[b >> 2] = q; c[q + 24 >> 2] = d; c[q + 12 >> 2] = q; c[q + 8 >> 2] = q; break h } } else Q = d; while (0); d = Q + 8 | 0; b = c[d >> 2] | 0; V = c[30] | 0; if (b >>> 0 >= V >>> 0 & Q >>> 0 >= V >>> 0) { c[b + 12 >> 2] = q; c[d >> 2] = q; c[q + 8 >> 2] = b; c[q + 12 >> 2] = Q; c[q + 24 >> 2] = 0; break } else ea(); } } else { V = c[30] | 0; if ((V | 0) == 0 | A >>> 0 < V >>> 0) c[30] = A; c[138] = A; c[139] = t; c[141] = 0; c[35] = c[144]; c[34] = -1; d = 0; do { V = d << 1; U = 144 + (V << 2) | 0; c[144 + (V + 3 << 2) >> 2] = U; c[144 + (V + 2 << 2) >> 2] = U; d = d + 1 | 0; } while ((d | 0) != 32); V = A + 8 | 0; V = (V & 7 | 0) == 0 ? 0 : 0 - V & 7; U = t + -40 - V | 0; c[32] = A + V; c[29] = U; c[A + (V + 4) >> 2] = U | 1; c[A + (t + -36) >> 2] = 40; c[33] = c[148]; } while (0); b = c[29] | 0; if (b >>> 0 > s >>> 0) { V = b - s | 0; c[29] = V; g = c[32] | 0; c[32] = g + s; c[g + (s + 4) >> 2] = V | 1; c[g + 4 >> 2] = s | 3; g = g + 8 | 0; break } } c[(Le() | 0) >> 2] = 12; g = 0; } else g = 0; } while (0); return g | 0 } function Ke(a) { a = a | 0; var b = 0, d = 0, e = 0, f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0, y = 0, z = 0, A = 0, B = 0; a:do if (a) { f = a + -8 | 0; k = c[30] | 0; b:do if (f >>> 0 >= k >>> 0 ? (e = c[a + -4 >> 2] | 0, d = e & 3, (d | 0) != 1) : 0) { v = e & -8; w = a + (v + -8) | 0; do if (!(e & 1)) { f = c[f >> 2] | 0; if (!d) break a; l = -8 - f | 0; n = a + l | 0; o = f + v | 0; if (n >>> 0 < k >>> 0) break b; if ((n | 0) == (c[31] | 0)) { g = a + (v + -4) | 0; f = c[g >> 2] | 0; if ((f & 3 | 0) != 3) { B = n; g = o; break } c[28] = o; c[g >> 2] = f & -2; c[a + (l + 4) >> 2] = o | 1; c[w >> 2] = o; break a } d = f >>> 3; if (f >>> 0 < 256) { e = c[a + (l + 8) >> 2] | 0; g = c[a + (l + 12) >> 2] | 0; f = 144 + (d << 1 << 2) | 0; do if ((e | 0) != (f | 0)) { if (e >>> 0 >= k >>> 0 ? (c[e + 12 >> 2] | 0) == (n | 0) : 0) break; ea(); } while (0); if ((g | 0) == (e | 0)) { c[26] = c[26] & ~(1 << d); B = n; g = o; break } do if ((g | 0) == (f | 0)) b = g + 8 | 0; else { if (g >>> 0 >= k >>> 0 ? (h = g + 8 | 0, (c[h >> 2] | 0) == (n | 0)) : 0) { b = h; break } ea(); } while (0); c[e + 12 >> 2] = g; c[b >> 2] = e; B = n; g = o; break } h = c[a + (l + 24) >> 2] | 0; f = c[a + (l + 12) >> 2] | 0; do if ((f | 0) == (n | 0)) { e = a + (l + 20) | 0; f = c[e >> 2] | 0; if (!f) { e = a + (l + 16) | 0; f = c[e >> 2] | 0; if (!f) { m = 0; break } } while (1) { d = f + 20 | 0; b = c[d >> 2] | 0; if (b) { f = b; e = d; continue } d = f + 16 | 0; b = c[d >> 2] | 0; if (!b) break; else { f = b; e = d; } } if (e >>> 0 < k >>> 0) ea(); else { c[e >> 2] = 0; m = f; break } } else { e = c[a + (l + 8) >> 2] | 0; if ((e >>> 0 >= k >>> 0 ? (i = e + 12 | 0, (c[i >> 2] | 0) == (n | 0)) : 0) ? (j = f + 8 | 0, (c[j >> 2] | 0) == (n | 0)) : 0) { c[i >> 2] = f; c[j >> 2] = e; m = f; break } ea(); } while (0); if (h) { f = c[a + (l + 28) >> 2] | 0; e = 408 + (f << 2) | 0; if ((n | 0) == (c[e >> 2] | 0)) { c[e >> 2] = m; if (!m) { c[27] = c[27] & ~(1 << f); B = n; g = o; break } } else { if (h >>> 0 < (c[30] | 0) >>> 0) ea(); f = h + 16 | 0; if ((c[f >> 2] | 0) == (n | 0)) c[f >> 2] = m; else c[h + 20 >> 2] = m; if (!m) { B = n; g = o; break } } e = c[30] | 0; if (m >>> 0 < e >>> 0) ea(); c[m + 24 >> 2] = h; f = c[a + (l + 16) >> 2] | 0; do if (f) if (f >>> 0 < e >>> 0) ea(); else { c[m + 16 >> 2] = f; c[f + 24 >> 2] = m; break } while (0); f = c[a + (l + 20) >> 2] | 0; if (f) if (f >>> 0 < (c[30] | 0) >>> 0) ea(); else { c[m + 20 >> 2] = f; c[f + 24 >> 2] = m; B = n; g = o; break } else { B = n; g = o; } } else { B = n; g = o; } } else { B = f; g = v; } while (0); if (B >>> 0 < w >>> 0 ? (p = a + (v + -4) | 0, q = c[p >> 2] | 0, (q & 1 | 0) != 0) : 0) { if (!(q & 2)) { if ((w | 0) == (c[32] | 0)) { A = (c[29] | 0) + g | 0; c[29] = A; c[32] = B; c[B + 4 >> 2] = A | 1; if ((B | 0) != (c[31] | 0)) break a; c[31] = 0; c[28] = 0; break a } if ((w | 0) == (c[31] | 0)) { A = (c[28] | 0) + g | 0; c[28] = A; c[31] = B; c[B + 4 >> 2] = A | 1; c[B + A >> 2] = A; break a } j = (q & -8) + g | 0; d = q >>> 3; do if (q >>> 0 >= 256) { b = c[a + (v + 16) >> 2] | 0; g = c[a + (v | 4) >> 2] | 0; do if ((g | 0) == (w | 0)) { f = a + (v + 12) | 0; g = c[f >> 2] | 0; if (!g) { f = a + (v + 8) | 0; g = c[f >> 2] | 0; if (!g) { x = 0; break } } while (1) { e = g + 20 | 0; d = c[e >> 2] | 0; if (d) { g = d; f = e; continue } e = g + 16 | 0; d = c[e >> 2] | 0; if (!d) break; else { g = d; f = e; } } if (f >>> 0 < (c[30] | 0) >>> 0) ea(); else { c[f >> 2] = 0; x = g; break } } else { f = c[a + v >> 2] | 0; if ((f >>> 0 >= (c[30] | 0) >>> 0 ? (t = f + 12 | 0, (c[t >> 2] | 0) == (w | 0)) : 0) ? (u = g + 8 | 0, (c[u >> 2] | 0) == (w | 0)) : 0) { c[t >> 2] = g; c[u >> 2] = f; x = g; break } ea(); } while (0); if (b) { g = c[a + (v + 20) >> 2] | 0; f = 408 + (g << 2) | 0; if ((w | 0) == (c[f >> 2] | 0)) { c[f >> 2] = x; if (!x) { c[27] = c[27] & ~(1 << g); break } } else { if (b >>> 0 < (c[30] | 0) >>> 0) ea(); g = b + 16 | 0; if ((c[g >> 2] | 0) == (w | 0)) c[g >> 2] = x; else c[b + 20 >> 2] = x; if (!x) break } g = c[30] | 0; if (x >>> 0 < g >>> 0) ea(); c[x + 24 >> 2] = b; f = c[a + (v + 8) >> 2] | 0; do if (f) if (f >>> 0 < g >>> 0) ea(); else { c[x + 16 >> 2] = f; c[f + 24 >> 2] = x; break } while (0); d = c[a + (v + 12) >> 2] | 0; if (d) if (d >>> 0 < (c[30] | 0) >>> 0) ea(); else { c[x + 20 >> 2] = d; c[d + 24 >> 2] = x; break } } } else { e = c[a + v >> 2] | 0; g = c[a + (v | 4) >> 2] | 0; f = 144 + (d << 1 << 2) | 0; do if ((e | 0) != (f | 0)) { if (e >>> 0 >= (c[30] | 0) >>> 0 ? (c[e + 12 >> 2] | 0) == (w | 0) : 0) break; ea(); } while (0); if ((g | 0) == (e | 0)) { c[26] = c[26] & ~(1 << d); break } do if ((g | 0) == (f | 0)) r = g + 8 | 0; else { if (g >>> 0 >= (c[30] | 0) >>> 0 ? (s = g + 8 | 0, (c[s >> 2] | 0) == (w | 0)) : 0) { r = s; break } ea(); } while (0); c[e + 12 >> 2] = g; c[r >> 2] = e; } while (0); c[B + 4 >> 2] = j | 1; c[B + j >> 2] = j; if ((B | 0) == (c[31] | 0)) { c[28] = j; break a } else g = j; } else { c[p >> 2] = q & -2; c[B + 4 >> 2] = g | 1; c[B + g >> 2] = g; } f = g >>> 3; if (g >>> 0 < 256) { e = f << 1; g = 144 + (e << 2) | 0; b = c[26] | 0; d = 1 << f; if (b & d) { d = 144 + (e + 2 << 2) | 0; b = c[d >> 2] | 0; if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else { y = d; z = b; } } else { c[26] = b | d; y = 144 + (e + 2 << 2) | 0; z = g; } c[y >> 2] = B; c[z + 12 >> 2] = B; c[B + 8 >> 2] = z; c[B + 12 >> 2] = g; break a } b = g >>> 8; if (b) if (g >>> 0 > 16777215) f = 31; else { y = (b + 1048320 | 0) >>> 16 & 8; z = b << y; a = (z + 520192 | 0) >>> 16 & 4; z = z << a; f = (z + 245760 | 0) >>> 16 & 2; f = 14 - (a | y | f) + (z << f >>> 15) | 0; f = g >>> (f + 7 | 0) & 1 | f << 1; } else f = 0; d = 408 + (f << 2) | 0; c[B + 28 >> 2] = f; c[B + 20 >> 2] = 0; c[B + 16 >> 2] = 0; b = c[27] | 0; e = 1 << f; c:do if (b & e) { d = c[d >> 2] | 0; d:do if ((c[d + 4 >> 2] & -8 | 0) != (g | 0)) { f = g << ((f | 0) == 31 ? 0 : 25 - (f >>> 1) | 0); while (1) { b = d + 16 + (f >>> 31 << 2) | 0; e = c[b >> 2] | 0; if (!e) break; if ((c[e + 4 >> 2] & -8 | 0) == (g | 0)) { A = e; break d } else { f = f << 1; d = e; } } if (b >>> 0 < (c[30] | 0) >>> 0) ea(); else { c[b >> 2] = B; c[B + 24 >> 2] = d; c[B + 12 >> 2] = B; c[B + 8 >> 2] = B; break c } } else A = d; while (0); b = A + 8 | 0; d = c[b >> 2] | 0; z = c[30] | 0; if (d >>> 0 >= z >>> 0 & A >>> 0 >= z >>> 0) { c[d + 12 >> 2] = B; c[b >> 2] = B; c[B + 8 >> 2] = d; c[B + 12 >> 2] = A; c[B + 24 >> 2] = 0; break } else ea(); } else { c[27] = b | e; c[d >> 2] = B; c[B + 24 >> 2] = d; c[B + 12 >> 2] = B; c[B + 8 >> 2] = B; } while (0); B = (c[34] | 0) + -1 | 0; c[34] = B; if (!B) b = 560; else break a; while (1) { b = c[b >> 2] | 0; if (!b) break; else b = b + 8 | 0; } c[34] = -1; break a } } while (0); ea(); } while (0); return } function Le() { var a = 0; if (!0) a = 600; return a | 0 } function Me() { var a = 0; do if (!(c[144] | 0)) { a = ca(30) | 0; if (!(a + -1 & a)) { c[146] = a; c[145] = a; c[147] = -1; c[148] = -1; c[149] = 0; c[137] = 0; c[144] = (ha(0) | 0) & -16 ^ 1431655768; break } else ea(); } while (0); return } function Ne() { } function Oe(b, d, e) { b = b | 0; d = d | 0; e = e | 0; var f = 0; if ((e | 0) >= 4096) return ja(b | 0, d | 0, e | 0) | 0; f = b | 0; if ((b & 3) == (d & 3)) { while (b & 3) { if (!e) return f | 0; a[b >> 0] = a[d >> 0] | 0; b = b + 1 | 0; d = d + 1 | 0; e = e - 1 | 0; } while ((e | 0) >= 4) { c[b >> 2] = c[d >> 2]; b = b + 4 | 0; d = d + 4 | 0; e = e - 4 | 0; } } while ((e | 0) > 0) { a[b >> 0] = a[d >> 0] | 0; b = b + 1 | 0; d = d + 1 | 0; e = e - 1 | 0; } return f | 0 } function Pe(b, c, d) { b = b | 0; c = c | 0; d = d | 0; var e = 0; if ((c | 0) < (b | 0) & (b | 0) < (c + d | 0)) { e = b; c = c + d | 0; b = b + d | 0; while ((d | 0) > 0) { b = b - 1 | 0; c = c - 1 | 0; d = d - 1 | 0; a[b >> 0] = a[c >> 0] | 0; } b = e; } else Oe(b, c, d) | 0; return b | 0 } function Qe(b, d, e) { b = b | 0; d = d | 0; e = e | 0; var f = 0, g = 0, h = 0, i = 0; f = b + e | 0; if ((e | 0) >= 20) { d = d & 255; h = b & 3; i = d | d << 8 | d << 16 | d << 24; g = f & ~3; if (h) { h = b + 4 - h | 0; while ((b | 0) < (h | 0)) { a[b >> 0] = d; b = b + 1 | 0; } } while ((b | 0) < (g | 0)) { c[b >> 2] = i; b = b + 4 | 0; } } while ((b | 0) < (f | 0)) { a[b >> 0] = d; b = b + 1 | 0; } return b - e | 0 } // EMSCRIPTEN_END_FUNCS return { _free: Ke, ___errno_location: Le, _memmove: Pe, _Decoder_Interface_Decode: xa, _Decoder_Interface_exit: wa, _Encoder_Interface_init: ya, _memset: Qe, _malloc: Je, _memcpy: Oe, _Encoder_Interface_exit: za, _Decoder_Interface_init: va, _Encoder_Interface_Encode: Aa, runPostSets: Ne, stackAlloc: ma, stackSave: na, stackRestore: oa, establishStackSpace: pa, setThrew: qa, setTempRet0: ta, getTempRet0: ua } }) // EMSCRIPTEN_END_ASM (Module.asmGlobalArg, Module.asmLibraryArg, buffer); Module["_Encoder_Interface_Encode"] = asm["_Encoder_Interface_Encode"]; var _free = Module["_free"] = asm["_free"]; Module["runPostSets"] = asm["runPostSets"]; var _memmove = Module["_memmove"] = asm["_memmove"]; Module["_Decoder_Interface_exit"] = asm["_Decoder_Interface_exit"]; Module["_Encoder_Interface_init"] = asm["_Encoder_Interface_init"]; var _memset = Module["_memset"] = asm["_memset"]; var _malloc = Module["_malloc"] = asm["_malloc"]; var _memcpy = Module["_memcpy"] = asm["_memcpy"]; Module["_Decoder_Interface_Decode"] = asm["_Decoder_Interface_Decode"]; Module["_Decoder_Interface_init"] = asm["_Decoder_Interface_init"]; Module["_Encoder_Interface_exit"] = asm["_Encoder_Interface_exit"]; Module["___errno_location"] = asm["___errno_location"]; Runtime.stackAlloc = asm["stackAlloc"]; Runtime.stackSave = asm["stackSave"]; Runtime.stackRestore = asm["stackRestore"]; Runtime.establishStackSpace = asm["establishStackSpace"]; Runtime.setTempRet0 = asm["setTempRet0"]; Runtime.getTempRet0 = asm["getTempRet0"]; function ExitStatus(status) { this.name = "ExitStatus"; this.message = "Program terminated with exit(" + status + ")"; this.status = status; } ExitStatus.prototype = new Error; ExitStatus.prototype.constructor = ExitStatus; var initialStackTop; dependenciesFulfilled = function runCaller() { if (!Module["calledRun"]) run(); if (!Module["calledRun"]) dependenciesFulfilled = runCaller; }; Module["callMain"] = Module.callMain = function callMain(args) { assert(runDependencies == 0, "cannot call main when async dependencies remain! (listen on __ATMAIN__)"); assert(__ATPRERUN__.length == 0, "cannot call main when preRun functions remain to be called"); args = args || []; ensureInitRuntime(); var argc = args.length + 1; function pad() { for (var i = 0; i < 4 - 1; i++) { argv.push(0); } } var argv = [allocate(intArrayFromString(Module["thisProgram"]), "i8", ALLOC_NORMAL)]; pad(); for (var i = 0; i < argc - 1; i = i + 1) { argv.push(allocate(intArrayFromString(args[i]), "i8", ALLOC_NORMAL)); pad(); } argv.push(0); argv = allocate(argv, "i32", ALLOC_NORMAL); initialStackTop = Runtime.stackSave(); try { var ret = Module["_main"](argc, argv, 0); exit(ret, true); } catch (e) { if (e instanceof ExitStatus) { return } else if (e == "SimulateInfiniteLoop") { Module["noExitRuntime"] = true; Runtime.stackRestore(initialStackTop); return } else { if (e && typeof e === "object" && e.stack) Module.printErr("exception thrown: " + [e, e.stack]); throw e } } finally { } }; function run(args) { args = args || Module["arguments"]; if (runDependencies > 0) { return } preRun(); if (runDependencies > 0) return; if (Module["calledRun"]) return; function doRun() { if (Module["calledRun"]) return; Module["calledRun"] = true; if (ABORT) return; ensureInitRuntime(); preMain(); if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); if (Module["_main"] && shouldRunNow) Module["callMain"](args); postRun(); } if (Module["setStatus"]) { Module["setStatus"]("Running..."); setTimeout((function () { setTimeout((function () { Module["setStatus"](""); }), 1); doRun(); }), 1); } else { doRun(); } } Module["run"] = Module.run = run; function exit(status, implicit) { if (implicit && Module["noExitRuntime"]) { return } if (Module["noExitRuntime"]) ; else { ABORT = true; STACKTOP = initialStackTop; exitRuntime(); if (Module["onExit"]) Module["onExit"](status); } if (ENVIRONMENT_IS_SHELL && typeof quit === "function") { quit(status); } throw new ExitStatus(status) } Module["exit"] = Module.exit = exit; var abortDecorators = []; function abort(what) { if (what !== undefined) { Module.print(what); Module.printErr(what); what = JSON.stringify(what); } else { what = ""; } ABORT = true; var extra = "\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information."; var output = "abort(" + what + ") at " + stackTrace() + extra; if (abortDecorators) { abortDecorators.forEach((function (decorator) { output = decorator(output, what); })); } throw output } Module["abort"] = Module.abort = abort; if (Module["preInit"]) { if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; while (Module["preInit"].length > 0) { Module["preInit"].pop()(); } } var shouldRunNow = true; if (Module["noInitialRun"]) { shouldRunNow = false; } Module["noExitRuntime"] = true; run(); return AMR; })(); self.onmessage = function (e) { switch(e.data.command){ case 'encode': encode(e.data.samples, e.data.sampleRate); break; case 'decode': decode(e.data.buffer); break; } }; function encode(samples, sampleRate) { sampleRate = sampleRate || 8000; self.postMessage({ command: 'encode', amr: AMR.encode(samples, sampleRate, 7) }); } function decode(u8Array) { self.postMessage({ command: 'decode', amr: AMR.decode(u8Array) }); } }; var amrWorkerStr = amrnb.toString().replace(/^\s*function.*?\(\)\s*{/, '').replace(/}\s*$/, ''); var amrWorkerURLObj = (window.URL || window.webkitURL).createObjectURL(new Blob([amrWorkerStr], { type: "text/javascript" })); var BenzAMRRecorder = /*#__PURE__*/ function () { /** * @type {boolean} * @private */ /** * @type {boolean} * @private */ /** * @type {RecorderControl | null} * @private */ /** * @type {Float32Array | null} * @private */ /** * @type {Uint8Array | null} * @private */ /** * @type {Blob | null} * @private */ /** * @type {Function | null} * @private */ /** * @type {Function | null} * @private */ /** * @type {Function | null} * @private */ /** * @type {Function | null} * @private */ /** * @type {Function | null} * @private */ /** * @type {Function | null} * @private */ /** * @type {Function | null} * @private */ /** * @type {Function | null} * @private */ /** * @type {Function | null} * @private */ /** * @type {boolean} * @private */ /** * @type {boolean} * @private */ /** * @type {number} * @private */ /** * @type {number} * @private */ function BenzAMRRecorder() { var _this = this; _classCallCheck(this, BenzAMRRecorder); this._isInit = false; this._isInitRecorder = false; this._recorderControl = new RecorderControl(); this._samples = new Float32Array(0); this._rawData = new Uint8Array(0); this._blob = null; this._onEnded = null; this._onAutoEnded = null; this._onPlay = null; this._onPause = null; this._onResume = null; this._onStop = null; this._onStartRecord = null; this._onCancelRecord = null; this._onFinishRecord = null; this._isPlaying = false; this._isPaused = false; this._startCtxTime = 0.0; this._pauseTime = 0.0; this._playEmpty = function () { _this._recorderControl.playPcm(new Float32Array(10), 24000); }; this._onEndCallback = function () { if (_this._isPlaying) { _this._isPlaying = false; if (_this._onStop) { _this._onStop(); } if (_this._onAutoEnded) { _this._onAutoEnded(); } } if (!_this._isPaused) { if (_this._onEnded) { _this._onEnded(); } } }; this._runAMRWorker = function (msg, resolve) { var amrWorker = new Worker(amrWorkerURLObj); amrWorker.postMessage(msg); amrWorker.onmessage = function (e) { resolve(e.data.amr); amrWorker.terminate(); }; }; } /** * 是否已经初始化 * @return {boolean} */ _createClass(BenzAMRRecorder, [{ key: "isInit", value: function isInit() { return this._isInit; } /** * 使用浮点数据初始化 * @param {Float32Array} array * @return {Promise} */ }, { key: "initWithArrayBuffer", value: function initWithArrayBuffer(array) { var _this2 = this; if (this._isInit || this._isInitRecorder) { BenzAMRRecorder.throwAlreadyInitialized(); } this._playEmpty(); return new Promise(function (resolve, reject) { var u8Array = new Uint8Array(array); _this2.decodeAMRAsync(u8Array).then(function (samples) { _this2._samples = samples; _this2._isInit = true; if (!_this2._samples) { RecorderControl.decodeAudioArrayBufferByContext(array).then(function (data) { _this2._isInit = true; return _this2.encodeAMRAsync(data, RecorderControl.getCtxSampleRate()); }).then(function (rawData) { _this2._rawData = rawData; _this2._blob = BenzAMRRecorder.rawAMRData2Blob(rawData); return _this2.decodeAMRAsync(rawData); }).then(function (sample) { _this2._samples = sample; resolve(); }).catch(function () { reject(new Error('Failed to decode.')); }); } else { _this2._rawData = u8Array; resolve(); } }); }); } /** * 使用 Blob 对象初始化( <input type="file">) * @param {Blob} blob * @return {Promise} */ }, { key: "initWithBlob", value: function initWithBlob(blob) { var _this3 = this; if (this._isInit || this._isInitRecorder) { BenzAMRRecorder.throwAlreadyInitialized(); } this._playEmpty(); this._blob = blob; var p = new Promise(function (resolve) { var reader = new FileReader(); reader.onload = function (e) { resolve(e.target.result); }; reader.readAsArrayBuffer(blob); }); return p.then(function (data) { return _this3.initWithArrayBuffer(data); }); } /** * 使用 url 初始化 * @param {string} url * @return {Promise} */ }, { key: "initWithUrl", value: function initWithUrl(url) { var _this4 = this; if (this._isInit || this._isInitRecorder) { BenzAMRRecorder.throwAlreadyInitialized(); } this._playEmpty(); var p = new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function () { resolve(this.response); }; xhr.onerror = function () { reject(new Error('Failed to fetch ' + url)); }; xhr.send(); }); return p.then(function (array) { return _this4.initWithArrayBuffer(array); }); } /** * 初始化录音 * @return {Promise} */ }, { key: "initWithRecord", value: function initWithRecord() { var _this5 = this; if (this._isInit || this._isInitRecorder) { BenzAMRRecorder.throwAlreadyInitialized(); } this._playEmpty(); return new Promise(function (resolve, reject) { _this5._recorderControl.initRecorder().then(function () { _this5._isInitRecorder = true; resolve(); }).catch(function (e) { reject(e); }); }); } /** * init 之前先播放一个空音频。 * 因为有些环境(如iOS)播放首个音频时禁止自动、异步播放, * 播放空音频防止加载后立即播放的功能失效。 * 但即使如此,initWith* 仍然须放入一个用户事件中 * @private */ }, { key: "on", value: function on(action, fn) { if (typeof fn === 'function' || fn === null) { switch (action) { case 'play': this._onPlay = fn; break; case 'stop': this._onStop = fn; break; case 'pause': this._onPause = fn; break; case 'resume': this._onResume = fn; break; case 'ended': this._onEnded = fn; break; case 'autoEnded': this._onAutoEnded = fn; break; case 'startRecord': this._onStartRecord = fn; break; case 'cancelRecord': this._onCancelRecord = fn; break; case 'finishRecord': this._onFinishRecord = fn; break; case '*': case 'all': this._onEnded = fn; this._onAutoEnded = fn; this._onPlay = fn; this._onPause = fn; this._onResume = fn; this._onStop = fn; this._onStartRecord = fn; this._onCancelRecord = fn; this._onFinishRecord = fn; break; } } } }, { key: "off", value: function off(action) { this.on(action, null); } /** * 播放事件 * @param {Function | null} fn */ }, { key: "onPlay", value: function onPlay(fn) { this.on('play', fn); } /** * 停止事件(包括播放结束) * @param {Function | null} fn */ }, { key: "onStop", value: function onStop(fn) { this.on('stop', fn); } /** * 暂停事件 * @param {Function | null} fn */ }, { key: "onPause", value: function onPause(fn) { this.on('pause', fn); } /** * 继续播放事件 * @param {Function | null} fn */ }, { key: "onResume", value: function onResume(fn) { this.on('resume', fn); } /** * 播放结束事件 * @param {Function | null} fn */ }, { key: "onEnded", value: function onEnded(fn) { this.on('ended', fn); } /** * 播放完毕自动结束事件 * @param {Function | null} fn */ }, { key: "onAutoEnded", value: function onAutoEnded(fn) { this.on('autoEnded', fn); } /** * 开始录音事件 * @param {Function | null} fn */ }, { key: "onStartRecord", value: function onStartRecord(fn) { this.on('startRecord', fn); } /** * 结束录音事件 * @param {Function | null} fn */ }, { key: "onFinishRecord", value: function onFinishRecord(fn) { this.on('finishRecord', fn); } /** * 放弃录音事件 * @param {Function | null} fn */ }, { key: "onCancelRecord", value: function onCancelRecord(fn) { this.on('cancelRecord', fn); } }, { key: "play", /** * 播放(重新开始,无视暂停状态) * @param {number|string?} startTime 可指定开始位置 */ value: function play(startTime) { var _startTime = startTime && startTime < this.getDuration() ? parseFloat(startTime) : 0; if (!this._isInit) { throw new Error('Please init AMR first.'); } if (this._onPlay) { this._onPlay(); } this._isPlaying = true; this._isPaused = false; this._startCtxTime = RecorderControl.getCtxTime() - _startTime; this._recorderControl.playPcm(this._samples, this._isInitRecorder ? RecorderControl.getCtxSampleRate() : 8000, this._onEndCallback.bind(this), _startTime); } /** * 停止 */ }, { key: "stop", value: function stop() { this._recorderControl.stopPcm(); this._isPlaying = false; this._isPaused = false; if (this._onStop) { this._onStop(); } } /** * 暂停 */ }, { key: "pause", value: function pause() { if (!this._isPlaying) { return; } this._isPlaying = false; this._isPaused = true; this._pauseTime = RecorderControl.getCtxTime() - this._startCtxTime; this._recorderControl.stopPcm(); if (this._onPause) { this._onPause(); } } /** * 从暂停处继续 */ }, { key: "resume", value: function resume() { if (!this._isPaused) { return; } this._isPlaying = true; this._isPaused = false; this._startCtxTime = RecorderControl.getCtxTime() - this._pauseTime; this._recorderControl.playPcm(this._samples, this._isInitRecorder ? RecorderControl.getCtxSampleRate() : 8000, this._onEndCallback.bind(this), this._pauseTime); if (this._onResume) { this._onResume(); } } /** * 整合 play() 和 resume(),若在暂停状态则继续,否则从头播放 */ }, { key: "playOrResume", value: function playOrResume() { if (this._isPaused) { this.resume(); } else { this.play(); } } /** * 整合 resume() 和 pause() */ }, { key: "pauseOrResume", value: function pauseOrResume() { if (this._isPaused) { this.resume(); } else { this.pause(); } } /** * 整合 play() 和 resume() 和 pause() */ }, { key: "playOrPauseOrResume", value: function playOrPauseOrResume() { if (this._isPaused) { this.resume(); } else if (this._isPlaying) { this.pause(); } else { this.play(); } } /** * 跳转到音频指定位置,不改变播放状态 * @param {number|string} time 指定位置(秒,浮点数) */ }, { key: "setPosition", value: function setPosition(time) { var _time = parseFloat(time); if (_time > this.getDuration()) { this.stop(); } else if (this._isPaused) { this._pauseTime = _time; } else if (this._isPlaying) { this._recorderControl.stopPcmSilently(); this._startCtxTime = RecorderControl.getCtxTime() - _time; this._recorderControl.playPcm(this._samples, this._isInitRecorder ? RecorderControl.getCtxSampleRate() : 8000, this._onEndCallback.bind(this), _time); } else { this.play(_time); } } /** * 获取当前播放位置(秒) * @return {Number} 位置,秒,浮点数 */ }, { key: "getCurrentPosition", value: function getCurrentPosition() { if (this._isPaused) { return this._pauseTime; } else if (this._isPlaying) { return RecorderControl.getCtxTime() - this._startCtxTime; } return 0; } /** * 是否正在播放 * @return {boolean} */ }, { key: "isPlaying", value: function isPlaying() { return this._isPlaying; } /** * 是否暂停中 * @return {boolean} */ }, { key: "isPaused", value: function isPaused() { return this._isPaused; } /** * 开始录音 */ }, { key: "startRecord", value: function startRecord() { this._recorderControl.startRecord(); if (this._onStartRecord) { this._onStartRecord(); } } /** * 结束录音,并把录制的音频转换成 AMR * @return {Promise} */ }, { key: "finishRecord", value: function finishRecord() { var _this6 = this; return new Promise(function (resolve) { _this6._recorderControl.stopRecord(); _this6._recorderControl.generateRecordSamples().then(function (samples) { _this6._samples = samples; return _this6.encodeAMRAsync(samples, RecorderControl.getCtxSampleRate()); }).then(function (rawData) { _this6._rawData = rawData; _this6._blob = BenzAMRRecorder.rawAMRData2Blob(_this6._rawData); _this6._isInit = true; if (_this6._onFinishRecord) { _this6._onFinishRecord(); } _this6._recorderControl.releaseRecord(); resolve(); }); }); } /** * 放弃录音 */ }, { key: "cancelRecord", value: function cancelRecord() { this._recorderControl.stopRecord(); this._recorderControl.releaseRecord(); if (this._onCancelRecord) { this._onCancelRecord(); } } /** * 是否正在录音 * @return {boolean} */ }, { key: "isRecording", value: function isRecording() { return this._recorderControl.isRecording(); } /** * 获取音频的时间长度(单位:秒) * @return {number} */ }, { key: "getDuration", value: function getDuration() { var rate = this._isInitRecorder ? RecorderControl.getCtxSampleRate() : 8000; return this._samples.length / rate; } /** * 获取 AMR 文件的 Blob 对象 * @returns {Blob|null} */ }, { key: "getBlob", value: function getBlob() { return this._blob; } /** * 注销,清理内部存储 */ }, { key: "destroy", value: function destroy() { this._recorderControl.stopPcmSilently(); this._recorderControl.stopRecord(); this._recorderControl.releaseRecord(); this.off('*'); this._recorderControl = null; this._samples = null; this._rawData = null; this._blob = null; } /* static encodeAMR(samples, sampleRate) { sampleRate = sampleRate || 8000; return AMR.encode(samples, sampleRate, 7); } */ }, { key: "encodeAMRAsync", value: function encodeAMRAsync(samples, sampleRate) { var _this7 = this; return new Promise(function (resolve) { _this7._runAMRWorker({ command: 'encode', samples: samples, sampleRate: sampleRate }, resolve); }); } }, { key: "decodeAMRAsync", value: function decodeAMRAsync(u8Array) { var _this8 = this; return new Promise(function (resolve) { _this8._runAMRWorker({ command: 'decode', buffer: u8Array }, resolve); }); } }], [{ key: "rawAMRData2Blob", value: function rawAMRData2Blob(data) { return new Blob([data.buffer], { type: 'audio/amr' }); } }, { key: "throwAlreadyInitialized", value: function throwAlreadyInitialized() { throw new Error('AMR has been initialized. For a new AMR, please generate a new BenzAMRRecorder().'); } /** * 判断浏览器是否支持播放 * @return {boolean} */ }, { key: "isPlaySupported", value: function isPlaySupported() { return RecorderControl.isPlaySupported(); } /** * 判断浏览器是否支持录音 * @return {boolean} */ }, { key: "isRecordSupported", value: function isRecordSupported() { return RecorderControl.isRecordSupported(); } }]); return BenzAMRRecorder; }(); return BenzAMRRecorder; })); //# sourceMappingURL=BenzAMRRecorder.js.map ================================================ FILE: assets/vendors/friendcircle/friendcircle.css ================================================ .friendcircle-container * { margin: 0; padding: 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .friendcircle-container ul { list-style-type: none; } .friendcircle-container { margin: 0 auto; max-width: 100%; } .friendcircle-container h1 { font-size: 36px; color: #283035; font-weight: 400; } .friendcircle-container h1 a { font-size: 18px; font-weight: 700; } .friendcircle-list { margin-top: 70px; position: relative; } .friendcircle-list li { margin-bottom: 15px; display: block; position: relative; } .friendcircle-list li:not(:last-child) { border-bottom:1px dotted #D7D7D7; padding-bottom: 15px; } .friendcircle-list li:after { content: ''; display: block; clear: both; height: 0; width: 0; } .reply-list { padding-left: 88px; clear: both; margin-top: 15px; } .friendcircle-list .friendcircle-avatar { width: 65px; height: 65px; position: relative; z-index: 99; float: left; border: 3px solid #FFF; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; overflow: hidden; } .friendcircle-list .friendcircle-avatar img { width: 100%; height: 100%; } .reply-list .friendcircle-avatar { width: 50px; height: 50px; } .friendcircle-main-level:after { content: ''; width: 0; height: 0; display: block; clear: both; } .friendcircle-list .friendcircle-box { max-width: 100%; margin-left: 60px; position: relative; top:-8px; word-break: break-all; } .friendcircle-list .circle-comment-tain{ padding:3px; pointer-events: auto; } .reply-list .friendcircle-box { width: 610px; } .friendcircle-box .friendcircle-head { padding: 10px 12px; overflow: hidden; } .friendcircle-box .friendcircle-head i { margin-left: 30px; position: relative; top: 2px; color: #FF5252; } .friendcircle-box .friendcircle-head .clikenum { color: #999; margin-right: 20px; font-size: 13px; vertical-align: middle; } .friendcircle-box .friendcircle-name { color: #586B95; font-size: 16px; font-weight: 700; margin-left: -5px; } .friendcircle-box .friendcircle-name a { color: #586B95; } .friendcircle-box .friendcircle-head span { float: left; color: #999; font-size: 13px; position: relative; top: 5px; } .friendcircle-box .friendcircle-content { padding: 0 0 12px 12px; margin-top:-5px; font-size: 15px; color: #595959; } .circle-pictures { width: 85%; display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 5px; margin-top: 8px; } .circle-picture { position:relative; width:100%; padding-top:100%; overflow: hidden; border-radius: 4px; } .circle-picture img { position:absolute; top:0; left:0; width: fit-content; width:100%; max-width: 100%; height:100%; object-fit: cover; object-position: center; cursor: zoom-in; } .friendcircle-box .friendcircle-time{ padding:12px 0 0 12px; color:#B2B2B2; position: relative; top:5px; } .friendcircle-box .friendcircle-map{ display:block; color: #586B95; margin-top:-10px; padding:12px 0 8px 12px; width: fit-content; } .friendcircle-box .friendcircle-action{ float:right; } .friendcircle-container .friendcircle-bg{ width:100%; height:300px; position: relative; } .friendcircle-container .friendcircle-bg .friendcircle-bg-img{ border-radius:10px; width:100%; height:300px; object-fit:cover; } .friendcircle-container .friendcircle-bg .friendcircle-bg-author{ border-radius:10px; width:80px; height:80px; max-width:80px; max-height:80px; object-fit:cover; position: absolute; bottom: -30px; right: 12px; } .friendcircle-container .friendcircle-bg .friendcircle-bg-author-name{ position: absolute; bottom: 10px; right: 100px; color:#fff; font-size:20px; font-weight:bold; letter-spacing: 1px; } .friendcircle-container .friendcircle-bg .friendcircle-bg-author-sign{ position: absolute; max-width:90%; bottom: -60px; right: 10px; color:#737373; font-size:14px; letter-spacing: 1px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis } .friendcircle-box .friendcircle-comments{ font-weight:bold; letter-spacing: 0.5px; border-radius:5px; padding:12px; margin-top:12px; background-color:#F7F7F7; color:#5A6C94; } .friendcircle-box .friendcircle-comments hr{ margin:5px 0 5px 0; border: 0.5px solid #DEDEDE; } .friendcircle-container .friendcircle-add{ background-color:#07c160; padding:10px; color:#fff; border:none; border-radius:5px; position: relative; margin-top:30px; top:40px; cursor:pointer; } .friendcircle-popup { position: fixed; left: 0; top: 0; height: 100%; width: 100%; max-width:100%; max-height:100%; display:none; background: #00000026; backdrop-filter: saturate(100%) blur(2px); -webkit-backdrop-filter: saturate(100%) blur(2px); overflow-y: auto; z-index: 108; } .friendcircle-popup.is-visible { display:block; animation: showIndex 0.3s; -moz-animation: showIndex 0.3s; /* Firefox */ -webkit-animation: showIndex 0.3s; /* Safari and Chrome */ -o-animation: showIndex 0.3s; /* Opera */ } @keyframes showIndex{ 0%{ opacity: 0; } 100%{opacity: 1; } } .friendcircle-popup-container { border-radius: 10px; height:100%; max-height:100%; border: none; position: relative; width: 90% !important; max-width: 90% !important; min-width:90%!important; margin-left:auto; margin-right:auto; background: #fff; box-shadow: none; -webkit-transform: translateY(-40px); -moz-transform: translateY(-40px); -ms-transform: translateY(-40px); -o-transform: translateY(-40px); transform: translateY(-40px); /* Force Hardware Acceleration in WebKit */ -webkit-backface-visibility: hidden; -webkit-transition-property: -webkit-transform; -moz-transition-property: -moz-transform; transition-property: transform; -webkit-transition-duration: 0.3s; -moz-transition-duration: 0.3s; transition-duration: 0.3s; } .friendcircle-popup-container p { margin: 0; padding: 3em 1em; padding-top: 1em; } .friendcircle-popup-container .friendcircle-popup-close { position: absolute; top: 20px; left: 8px; cursor:pointer; font-size:25px; } .friendcircle-close-button { color: #545454; border-bottom: none; } .friendcircle-popup-container .friendcircle-popup-close::before { -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -ms-transform: rotate(45deg); -o-transform: rotate(45deg); transform: rotate(45deg); left: 8px; } .friendcircle-popup-container .friendcircle-popup-close::after { -webkit-transform: rotate(-45deg); -moz-transform: rotate(-45deg); -ms-transform: rotate(-45deg); -o-transform: rotate(-45deg); transform: rotate(-45deg); left: 8px; } .is-visible .friendcircle-popup-container { -webkit-transform: translateY(0); -moz-transform: translateY(0); -ms-transform: translateY(0); -o-transform: translateY(0); transform: translateY(0); } .friendcircle-form { background: #ffffff !important; height: auto; margin: 100px auto; max-width: 82%; overflow: hidden !important; width: 100%; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; -moz-box-shadow: rgba(26, 26, 26, 0.1) 0 1px 3px 0; -webkit-box-shadow: rgba(26, 26, 26, 0.1) 0 1px 3px 0; box-shadow: rgba(26, 26, 26, 0.1) 0 1px 3px 0; } @media (max-width: 500px) { .friendcircle-form { margin: 0; padding-top: 1em; width: 100% !important; max-width: 100% !important; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; -moz-box-shadow: rgba(26, 26, 26, 0.1) 0 0px 0px 0; -webkit-box-shadow: rgba(26, 26, 26, 0.1) 0 0px 0px 0; box-shadow: rgba(26, 26, 26, 0.1) 0 0px 0px 0; } } .friendcircle-form .message{ overflow-x: hidden; position: relative !important; -moz-border-radius: none !important; -webkit-border-radius: none !important; border-radius: none !important; } .friendcircle-form .message { border-bottom: 1px #e6e6e6 solid !important; border-top: 1px #e6e6e6 solid !important; clear: both !important; overflow: hidden; } .friendcircle-form .message textarea { height: 200px !important; padding:20px 20px 0 20px; border: none !important; outline: none !important; resize: none !important; width: 100% !important; -moz-appearance: none !important; -webkit-appearance: none !important; -o-appearance: none; -ms-appearance: none; appearance: none; } .friendcircle-form .submit button{ background-color:#07c160; position: absolute; top: 12px; right: 8px; cursor:pointer; color:#fff; padding:10px; border-radius:6px; display: block !important; overflow: hidden !important; border:none; } .friendcircle-popup-container .message_action .getMap{ position: relative; padding:15px 15px 15px 10px; margin:10px; left:-25px; margin-top:-10px; border-bottom: 1px #e6e6e6 solid !important; border-top: 1px #e6e6e6 solid !important; clear: both !important; overflow: hidden; } .friendcircle-popup-container .message_action .canRead{ position: relative; padding:15px 15px 15px 10px; margin:10px; left:-25px; margin-top:-10px; } .friendcircle-popup-container #getUpload{ position: relative; } .ul_pics li { width: 100px; height: 100px; margin: 10px; display: inline-block!important; } .ul_pics li .img { width: 100px; height: 100px; display: inline-block!important; } .ul_pics li img { max-width: 100px; max-height: 100px; border: 1px solid #ddd; padding: 5px; object-fit:cover; display: inline-block!important; } .fprogress { position: relative; padding: 1px; border-radius: 3px; margin: 60px 0 0 0; } .fbar { background-color: green; display: block; width: 0%; height: 20px; border-radius: 3px; } .fpercent { position: absolute; height: 20px; display: inline-block; top: 0; left: 2%; color: #fff } #friendcircle-comment-container{ width:100%; max-width:100%; background-color:#F5F5F5; padding:2px; border-radius:5px; margin-top:3px; } #friendcircle-comment-container .friendcircle-comment-types{ width:100%; max-width:100%; text-align:center; background-color:#fff; padding:10px 10px 40px 10px; border-radius:5px; } #friendcircle-comment-container .friendcircle-comment-types input{ padding-left: 10px; width:32%; display:inline; border-radius:5px; height:30px; border:none; outline: none; background-color:#F5F5F5; } #friendcircle-comment-container .friendcircle-comment-types textarea{ margin-top:10px; width:97%; border:none; outline: none; resize: none; } #friendcircle-comment-container .friendcircle-comment-types textarea::-webkit-scrollbar{ width:0; height:0; display:none; } #friendcircle-comment-container .friendcircle-comment-types button{ float:right; margin-right:8px; padding:8px 12px 8px 12px; border-radius:5px; border:none; background-color:#F5F5F5; color:#586B95; pointer-events: none; } #friendcircle-comment-container .friendcircle-comment-types #friendcircle-comment-cancelsubmit{ pointer-events: auto; } #friendcircle-comment-container .friendcircle-comment-types .friendcircle-comment-emoji{ float:right; margin-right:8px; padding:9px 12px 9px 12px; border-radius:5px; border:none; background-color:#F5F5F5; color:#586B95; } #friendcircle-comment-container .friendcircle-comment-types .friendcircle-comment-readySubmit{ background-color:#07c160; color:#fff; animation: fadeIn 0.2s ease-in forwards; pointer-events: auto; } #friendcircle-comment-container .emoemo{ position: relative; width:100%; left:0; top:-2px; } #friendcircle-comment-container .emoemo .emotions{ width:100%!important; max-width:100%!important; border:none; border-radius:0 0 5px 5px; } .friendcircle_video .plyr--video{ margin-top:10px; width:20%!important; max-width:20%!important; border-radius:5px!important; height:20%!important; max-height:20%!important; } .friendcircle_video .plyr--audio{ margin-top:10px; width:100%!important; max-width:100%!important; border-radius:5px!important; } .plyr--video .plyr__controls{ background:none!important; } .plyr--video .plyr__controls .plyr__controls__item{ display:none; } video,audio{ width:100%!important; max-width:100%!important; display:none; } .tool-item{ padding:10px 0 10px 0; } /** .friendcircle-action:hover .tool-container { display: block; } **/ .tool-container { display: none; margin-left: -90px; margin-top:-50px; } input[type="range"] { -webkit-appearance: none; margin:5px; height: 4px; background: transparent; outline: none; } input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 20px; height: 20px; background: #1AAD19; cursor: pointer; border-radius: 50%; margin-top: -8px; } input[type="top"]::-moz-range-thumb { width: 20px; height: 20px; background: #1AAD19; cursor: pointer; border-radius: 50%; } input[type="range"]::-webkit-slider-runnable-track { width: 100%; height: 4px; background: #ddd; border-radius: 2px; } input[type="range"]:focus::-webkit-slider-runnable-track { background: #ddd; } input[type="range"]::-moz-range-track { width: 100%; height: 4px; background: #ddd; border-radius: 2px; } input[type="range"]::-webkit-slider-runnable-track::before, input[type="range"]::-webkit-slider-runnable-track::after { content: ""; position: absolute; top: 50%; transform: translateY(-50%); height: 4px; border-radius: 2px; } input[type="range"]::-webkit-slider-runnable-track::before { left: 0; width: var(--value); background: #1AAD19; } input[type="range"]::-webkit-slider-runnable-track::after { right: 0; width: calc(100% - var(--value)); background: #ddd; } ================================================ FILE: assets/vendors/friendcircle/moxie.js ================================================ var MXI_DEBUG=0;!function(e){function t(){var e={};return function(){(function(a,w){"use strict";var s={};function n(e,t){var i,n=[];for(var r=0;r<e.length;++r){i=s[e[r]]||o(e[r]);if(!i)throw"module definition dependecy not found: "+e[r];n.push(i)}t.apply(null,n)}function e(e,t,i){if(typeof e!=="string")throw"invalid module definition, module id must be defined and be a string";if(t===w)throw"invalid module definition, dependencies must be specified";if(i===w)throw"invalid module definition, definition function must be specified";n(t,function(){s[e]=i.apply(null,arguments)})}function d(e){return!!s[e]}function o(e){var t=a;var i=e.split(/[.\/]/);for(var n=0;n<i.length;++n){if(!t[i[n]])return;t=t[i[n]]}return t}function t(e){for(var t=0;t<e.length;t++){var i=a;var n=e[t];var r=n.split(/[.\/]/);for(var o=0;o<r.length-1;++o){if(i[r[o]]===w)i[r[o]]={};i=i[r[o]]}i[r[r.length-1]]=s[n]}}e("moxie/core/utils/Basic",[],function(){function s(e){var t;if(e===t)return"undefined";else if(e===null)return"null";else if(e.nodeType)return"node";return{}.toString.call(e).match(/\s([a-z|A-Z]+)/)[1].toLowerCase()}function t(){return l(false,false,arguments)}function e(){return l(true,false,arguments)}function i(){return l(false,true,arguments)}function n(){return l(true,true,arguments)}function r(e){switch(s(e)){case"array":return l(false,true,[[],e]);case"object":return l(false,true,[{},e]);default:return e}}function u(e){switch(s(e)){case"array":return Array.prototype.slice.call(e);case"object":return t({},e)}return e}function l(n,r,e){var o;var a=e[0];c(e,function(e,t){if(t>0)c(e,function(e,t){var i=m(s(e),["array","object"])!==-1;if(e===o||n&&a[t]===o)return true;if(i&&r)e=u(e);if(s(a[t])===s(e)&&i)l(n,r,[a[t],e]);else a[t]=e})});return a}function o(t,e){for(var i in e)if({}.hasOwnProperty.call(e,i))t[i]=e[i];function n(){this.constructor=t;if(MXI_DEBUG){var e=function(e){var t=e.toString().match(/^function\s([^\(\s]+)/);return t?t[1]:false};this.ctorName=e(t)}}n.prototype=e.prototype;t.prototype=new n;t.parent=e.prototype;return t}function c(e,t){var i,n,r,o;if(e){try{i=e.length}catch(e){i=o}if(i===o||typeof i!=="number"){for(n in e)if(e.hasOwnProperty(n))if(t(e[n],n)===false)return}else for(r=0;r<i;r++)if(t(e[r],r)===false)return}}function a(e){var t;if(!e||s(e)!=="object")return true;for(t in e)return false;return true}function f(e,i){var t=0,n=e.length;if(s(i)!=="function")i=function(){};if(!e||!e.length)i();function r(t){if(s(e[t])==="function")e[t](function(e){++t<n&&!e?r(t):i(e)})}r(t)}function d(e,n){var r=0,o=e.length,a=new Array(o);c(e,function(e,i){e(function(e){if(e)return n(e);var t=[].slice.call(arguments);t.shift();a[i]=t;r++;if(r===o){a.unshift(null);n.apply(this,a)}})})}function m(e,t){if(t){if(Array.prototype.indexOf)return Array.prototype.indexOf.call(t,e);for(var i=0,n=t.length;i<n;i++)if(t[i]===e)return i}return-1}function h(e,t){var i=[];if(s(e)!=="array")e=[e];if(s(t)!=="array")t=[t];for(var n in e)if(m(e[n],t)===-1)i.push(e[n]);return i.length?i:false}function p(e,t){var i=[];c(e,function(e){if(m(e,t)!==-1)i.push(e)});return i.length?i:null}function g(e){var t,i=[];for(t=0;t<e.length;t++)i[t]=e[t];return i}var v=function(){var n=0;return function(e){var t=(new Date).getTime().toString(32),i;for(i=0;i<5;i++)t+=Math.floor(Math.random()*65535).toString(32);return(e||"o_")+t+(n++).toString(32)}}();function x(e){if(!e)return e;return String.prototype.trim?String.prototype.trim.call(e):e.toString().replace(/^\s*/,"").replace(/\s*$/,"")}function w(e){if(typeof e!=="string")return e;var t={t:1099511627776,g:1073741824,m:1048576,k:1024},i;e=/^([0-9\.]+)([tmgk]?)$/.exec(e.toLowerCase().replace(/[^0-9\.tmkg]/g,""));i=e[2];e=+e[1];if(t.hasOwnProperty(i))e*=t[i];return Math.floor(e)}function y(e){var n=[].slice.call(arguments,1);return e.replace(/%([a-z])/g,function(e,t){var i=n.shift();switch(t){case"s":return i+"";case"d":return parseInt(i,10);case"f":return parseFloat(i);case"c":return"";default:return i}})}function E(e,t){var i=this;setTimeout(function(){e.call(i)},t||1)}return{guid:v,typeOf:s,extend:t,extendIf:e,extendImmutable:i,extendImmutableIf:n,clone:r,inherit:o,each:c,isEmptyObj:a,inSeries:f,inParallel:d,inArray:m,arrayDiff:h,arrayIntersect:p,toArray:g,trim:x,sprintf:y,parseSizeStr:w,delay:E}});e("moxie/core/utils/Encode",[],function(){var g=function(e){return unescape(encodeURIComponent(e))};var p=function(e){return decodeURIComponent(escape(e))};var e=function(e,t){if(typeof window.atob==="function")return t?p(window.atob(e)):window.atob(e);var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var n,r,o,a,s,u,l,c,f=0,d=0,m="",h=[];if(!e)return e;e+="";do{a=i.indexOf(e.charAt(f++));s=i.indexOf(e.charAt(f++));u=i.indexOf(e.charAt(f++));l=i.indexOf(e.charAt(f++));c=a<<18|s<<12|u<<6|l;n=c>>16&255;r=c>>8&255;o=c&255;if(u==64)h[d++]=String.fromCharCode(n);else if(l==64)h[d++]=String.fromCharCode(n,r);else h[d++]=String.fromCharCode(n,r,o)}while(f<e.length);m=h.join("");return t?p(m):m};var t=function(e,t){if(t)e=g(e);if(typeof window.btoa==="function")return window.btoa(e);var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var n,r,o,a,s,u,l,c,f=0,d=0,m="",h=[];if(!e)return e;do{n=e.charCodeAt(f++);r=e.charCodeAt(f++);o=e.charCodeAt(f++);c=n<<16|r<<8|o;a=c>>18&63;s=c>>12&63;u=c>>6&63;l=c&63;h[d++]=i.charAt(a)+i.charAt(s)+i.charAt(u)+i.charAt(l)}while(f<e.length);m=h.join("");var p=e.length%3;return(p?m.slice(0,p-3):m)+"===".slice(p||3)};return{utf8_encode:g,utf8_decode:p,atob:e,btoa:t}});e("moxie/core/utils/Env",["moxie/core/utils/Basic"],function(r){var e=function(f){var i="",r="?",d="function",m="undefined",h="object",e="major",t="model",n="name",o="type",a="vendor",s="version",u="architecture",l="console",c="mobile",p="tablet";var g={has:function(e,t){return t.toLowerCase().indexOf(e.toLowerCase())!==-1},lowerize:function(e){return e.toLowerCase()}};var v={rgx:function(){for(var e,t=0,i,n,r,o,a,s,u=arguments;t<u.length;t+=2){var l=u[t],c=u[t+1];if(typeof e===m){e={};for(r in c){o=c[r];if(typeof o===h)e[o[0]]=f;else e[o]=f}}for(i=n=0;i<l.length;i++){a=l[i].exec(this.getUA());if(!!a){for(r=0;r<c.length;r++){s=a[++n];o=c[r];if(typeof o===h&&o.length>0){if(o.length==2)if(typeof o[1]==d)e[o[0]]=o[1].call(this,s);else e[o[0]]=o[1];else if(o.length==3)if(typeof o[1]===d&&!(o[1].exec&&o[1].test))e[o[0]]=s?o[1].call(this,s,o[2]):f;else e[o[0]]=s?s.replace(o[1],o[2]):f;else if(o.length==4)e[o[0]]=s?o[3].call(this,s.replace(o[1],o[2])):f}else e[o]=s?s:f}break}}if(!!a)break}return e},str:function(e,t){for(var i in t)if(typeof t[i]===h&&t[i].length>0){for(var n=0;n<t[i].length;n++)if(g.has(t[i][n],e))return i===r?f:i}else if(g.has(t[i],e))return i===r?f:i;return e}};var x={browser:{oldsafari:{major:{1:["/8","/1","/3"],2:"/4","?":"/"},version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2e3:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",RT:"ARM"}}}};var w={browser:[[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[n,s],[/\s(opr)\/([\w\.]+)/i],[[n,"Opera"],s],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]+)*/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi)\/([\w\.-]+)/i],[n,s],[/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i],[[n,"IE"],s],[/(edge)\/((\d+)?[\w\.]+)/i],[n,s],[/(yabrowser)\/([\w\.]+)/i],[[n,"Yandex"],s],[/(comodo_dragon)\/([\w\.]+)/i],[[n,/_/g," "],s],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,/(uc\s?browser|qqbrowser)[\/\s]?([\w\.]+)/i],[n,s],[/(dolfin)\/([\w\.]+)/i],[[n,"Dolphin"],s],[/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[n,"Chrome"],s],[/XiaoMi\/MiuiBrowser\/([\w\.]+)/i],[s,[n,"MIUI Browser"]],[/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i],[s,[n,"Android Browser"]],[/FBAV\/([\w\.]+);/i],[s,[n,"Facebook"]],[/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i],[s,[n,"Mobile Safari"]],[/version\/([\w\.]+).+?(mobile\s?safari|safari)/i],[s,n],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[n,[s,v.str,x.browser.oldsafari.version]],[/(konqueror)\/([\w\.]+)/i,/(webkit|khtml)\/([\w\.]+)/i],[n,s],[/(navigator|netscape)\/([\w\.-]+)/i],[[n,"Netscape"],s],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]+)*/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[n,s]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[s,[n,"EdgeHTML"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[n,s],[/rv\:([\w\.]+).*(gecko)/i],[s,n]],os:[[/microsoft\s(windows)\s(vista|xp)/i],[n,s],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[n,[s,v.str,x.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[n,"Windows"],[s,v.str,x.os.windows.version]],[/\((bb)(10);/i],[[n,"BlackBerry"],s],[/(blackberry)\w*\/?([\w\.]+)*/i,/(tizen)[\/\s]([\w\.]+)/i,/(android|webos|palm\os|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,/linux;.+(sailfish);/i],[n,s],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i],[[n,"Symbian"],s],[/\((series40);/i],[n],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[n,"Firefox OS"],s],[/(nintendo|playstation)\s([wids3portablevu]+)/i,/(mint)[\/\s\(]?(\w+)*/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i,/(hurd|linux)\s?([\w\.]+)*/i,/(gnu)\s?([\w\.]+)*/i],[n,s],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[n,"Chromium OS"],s],[/(sunos)\s?([\w\.]+\d)*/i],[[n,"Solaris"],s],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i],[n,s],[/(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i],[[n,"iOS"],[s,/_/g,"."]],[/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,/(macintosh|mac(?=_powerpc)\s)/i],[[n,"Mac OS"],[s,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i,/(haiku)\s(\w+)/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,/(unix)\s?([\w\.]+)*/i],[n,s]]};var y=function(e){var t=e||(window&&window.navigator&&window.navigator.userAgent?window.navigator.userAgent:i);this.getBrowser=function(){return v.rgx.apply(this,w.browser)};this.getEngine=function(){return v.rgx.apply(this,w.engine)};this.getOS=function(){return v.rgx.apply(this,w.os)};this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS()}};this.getUA=function(){return t};this.setUA=function(e){t=e;return this};this.setUA(t)};return y}();function t(e,t,i){var n=0,r=0,o=0,a={dev:-6,alpha:-5,a:-5,beta:-4,b:-4,RC:-3,rc:-3,"#":-2,p:1,pl:1},s=function(e){e=(""+e).replace(/[_\-+]/g,".");e=e.replace(/([^.\d]+)/g,".$1.").replace(/\.{2,}/g,".");return!e.length?[-8]:e.split(".")},u=function(e){return!e?0:isNaN(e)?a[e]||-7:parseInt(e,10)};e=s(e);t=s(t);r=Math.max(e.length,t.length);for(n=0;n<r;n++){if(e[n]==t[n])continue;e[n]=u(e[n]);t[n]=u(t[n]);if(e[n]<t[n]){o=-1;break}else if(e[n]>t[n]){o=1;break}}if(!i)return o;switch(i){case">":case"gt":return o>0;case">=":case"ge":return o>=0;case"<=":case"le":return o<=0;case"==":case"=":case"eq":return o===0;case"<>":case"!=":case"ne":return o!==0;case"":case"<":case"lt":return o<0;default:return null}}var i=function(){var n={access_global_ns:function(){return!!window.moxie},define_property:function(){return false}(),create_canvas:function(){var e=document.createElement("canvas");var t=!!(e.getContext&&e.getContext("2d"));n.create_canvas=t;return t},return_response_type:function(e){try{if(r.inArray(e,["","text","document"])!==-1)return true;else if(window.XMLHttpRequest){var t=new XMLHttpRequest;t.open("get","/");if("responseType"in t){t.responseType=e;if(t.responseType!==e)return false;return true}}}catch(e){}return false},use_blob_uri:function(){var e=window.URL;n.use_blob_uri=e&&"createObjectURL"in e&&"revokeObjectURL"in e&&(o.browser!=="IE"||o.verComp(o.version,"11.0.46",">="));return n.use_blob_uri},use_data_uri:function(){var e=new Image;e.onload=function(){n.use_data_uri=e.width===1&&e.height===1};setTimeout(function(){e.src="data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=="},1);return false}(),use_data_uri_over32kb:function(){return n.use_data_uri&&(o.browser!=="IE"||o.version>=9)},use_data_uri_of:function(e){return n.use_data_uri&&e<33e3||n.use_data_uri_over32kb()},use_fileinput:function(){if(navigator.userAgent.match(/(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle\/(1.0|2.0|2.5|3.0))/))return false;var e=document.createElement("input");e.setAttribute("type","file");return n.use_fileinput=!e.disabled},use_webgl:function(){var e=document.createElement("canvas");var t=null,i;try{t=e.getContext("webgl")||e.getContext("experimental-webgl")}catch(e){}if(!t)t=null;i=!!t;n.use_webgl=i;e=w;return i}};return function(e){var t=[].slice.call(arguments);t.shift();return r.typeOf(n[e])==="function"?n[e].apply(this,t):!!n[e]}}();var n=(new e).getResult();var o={can:i,uaParser:e,browser:n.browser.name,version:n.browser.version,os:n.os.name,osVersion:n.os.version,verComp:t,swf_url:"../flash/Moxie.swf",xap_url:"../silverlight/Moxie.xap",global_event_dispatcher:"moxie.core.EventTarget.instance.dispatchEvent"};o.OS=o.os;if(MXI_DEBUG){o.debug={runtime:true,events:false};o.log=function(){function e(e){t.appendChild(document.createTextNode(e+"\n"))}if(window&&window.console&&window.console.log&&window.console.log.apply)window.console.log.apply(window.console,arguments);else if(document){var t=document.getElementById("moxie-console");if(!t){t=document.createElement("pre");t.id="moxie-console";document.body.appendChild(t)}var i=arguments[0];if(r.typeOf(i)==="string")i=r.sprintf.apply(this,arguments);else if(r.inArray(r.typeOf(i),["object","array"])!==-1){e(i);return}t.appendChild(document.createTextNode(i+"\n"))}}}return o});e("moxie/core/Exceptions",["moxie/core/utils/Basic"],function(n){function r(e,t){var i;for(i in e)if(e[i]===t)return i;return null}return{RuntimeError:function(){var i={NOT_INIT_ERR:1,EXCEPTION_ERR:3,NOT_SUPPORTED_ERR:9,JS_ERR:4};function e(e,t){this.code=e;this.name=r(i,e);this.message=this.name+(t||": RuntimeError "+this.code)}n.extend(e,i);e.prototype=Error.prototype;return e}(),OperationNotAllowedException:function(){function e(e){this.code=e;this.name="OperationNotAllowedException"}n.extend(e,{NOT_ALLOWED_ERR:1});e.prototype=Error.prototype;return e}(),ImageError:function(){var t={WRONG_FORMAT:1,MAX_RESOLUTION_ERR:2,INVALID_META_ERR:3};function e(e){this.code=e;this.name=r(t,e);this.message=this.name+": ImageError "+this.code}n.extend(e,t);e.prototype=Error.prototype;return e}(),FileException:function(){var t={NOT_FOUND_ERR:1,SECURITY_ERR:2,ABORT_ERR:3,NOT_READABLE_ERR:4,ENCODING_ERR:5,NO_MODIFICATION_ALLOWED_ERR:6,INVALID_STATE_ERR:7,SYNTAX_ERR:8};function e(e){this.code=e;this.name=r(t,e);this.message=this.name+": FileException "+this.code}n.extend(e,t);e.prototype=Error.prototype;return e}(),DOMException:function(){var t={INDEX_SIZE_ERR:1,DOMSTRING_SIZE_ERR:2,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,INVALID_CHARACTER_ERR:5,NO_DATA_ALLOWED_ERR:6,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INUSE_ATTRIBUTE_ERR:10,INVALID_STATE_ERR:11,SYNTAX_ERR:12,INVALID_MODIFICATION_ERR:13,NAMESPACE_ERR:14,INVALID_ACCESS_ERR:15,VALIDATION_ERR:16,TYPE_MISMATCH_ERR:17,SECURITY_ERR:18,NETWORK_ERR:19,ABORT_ERR:20,URL_MISMATCH_ERR:21,QUOTA_EXCEEDED_ERR:22,TIMEOUT_ERR:23,INVALID_NODE_TYPE_ERR:24,DATA_CLONE_ERR:25};function e(e){this.code=e;this.name=r(t,e);this.message=this.name+": DOMException "+this.code}n.extend(e,t);e.prototype=Error.prototype;return e}(),EventException:function(){function e(e){this.code=e;this.name="EventException"}n.extend(e,{UNSPECIFIED_EVENT_TYPE_ERR:0});e.prototype=Error.prototype;return e}()}});e("moxie/core/utils/Dom",["moxie/core/utils/Env"],function(l){var e=function(e){if(typeof e!=="string")return e;return document.getElementById(e)};var i=function(e,t){if(!e.className)return false;var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");return i.test(e.className)};var t=function(e,t){if(!i(e,t))e.className=!e.className?t:e.className.replace(/\s+$/,"")+" "+t};var n=function(e,t){if(e.className){var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");e.className=e.className.replace(i,function(e,t,i){return t===" "&&i===" "?" ":""})}};var r=function(e,t){if(e.currentStyle)return e.currentStyle[t];else if(window.getComputedStyle)return window.getComputedStyle(e,null)[t]};var o=function(e,t){var i=0,n=0,r,o=document,a,s;e=e;t=t||o.body;function u(e){var t,i,n=0,r=0;if(e){i=e.getBoundingClientRect();t=o.compatMode==="CSS1Compat"?o.documentElement:o.body;n=i.left+t.scrollLeft;r=i.top+t.scrollTop}return{x:n,y:r}}if(e&&e.getBoundingClientRect&&l.browser==="IE"&&(!o.documentMode||o.documentMode<8)){a=u(e);s=u(t);return{x:a.x-s.x,y:a.y-s.y}}r=e;while(r&&r!=t&&r.nodeType){i+=r.offsetLeft||0;n+=r.offsetTop||0;r=r.offsetParent}r=e.parentNode;while(r&&r!=t&&r.nodeType){i-=r.scrollLeft||0;n-=r.scrollTop||0;r=r.parentNode}return{x:i,y:n}};var a=function(e){return{w:e.offsetWidth||e.clientWidth,h:e.offsetHeight||e.clientHeight}};return{get:e,hasClass:i,addClass:t,removeClass:n,getStyle:r,getPos:o,getSize:a}});e("moxie/core/EventTarget",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic"],function(l,c,f){var d={};function e(){this.uid=f.guid()}f.extend(e.prototype,{init:function(){if(!this.uid)this.uid=f.guid("uid_")},addEventListener:function(e,t,i,n){var r=this,o;if(!this.hasOwnProperty("uid"))this.uid=f.guid("uid_");e=f.trim(e);if(/\s/.test(e)){f.each(e.split(/\s+/),function(e){r.addEventListener(e,t,i,n)});return}e=e.toLowerCase();i=parseInt(i,10)||0;o=d[this.uid]&&d[this.uid][e]||[];o.push({fn:t,priority:i,scope:n||this});if(!d[this.uid])d[this.uid]={};d[this.uid][e]=o},hasEventListener:function(e){var t;if(e){e=e.toLowerCase();t=d[this.uid]&&d[this.uid][e]}else t=d[this.uid];return t?t:false},removeEventListener:function(e,t){var i=this,n,r;e=e.toLowerCase();if(/\s/.test(e)){f.each(e.split(/\s+/),function(e){i.removeEventListener(e,t)});return}n=d[this.uid]&&d[this.uid][e];if(n){if(t){for(r=n.length-1;r>=0;r--)if(n[r].fn===t){n.splice(r,1);break}}else n=[];if(!n.length){delete d[this.uid][e];if(f.isEmptyObj(d[this.uid]))delete d[this.uid]}}},removeAllEventListeners:function(){if(d[this.uid])delete d[this.uid]},dispatchEvent:function(t){var i,e,n,r,o={},a=true,s;if(f.typeOf(t)!=="string"){r=t;if(f.typeOf(r.type)==="string"){t=r.type;if(r.total!==s&&r.loaded!==s){o.total=r.total;o.loaded=r.loaded}o.async=r.async||false}else throw new c.EventException(c.EventException.UNSPECIFIED_EVENT_TYPE_ERR)}if(t.indexOf("::")!==-1)(function(e){i=e[0];t=e[1]})(t.split("::"));else i=this.uid;t=t.toLowerCase();e=d[i]&&d[i][t];if(e){e.sort(function(e,t){return t.priority-e.priority});n=[].slice.call(arguments);n.shift();o.type=t;n.unshift(o);if(MXI_DEBUG&&l.debug.events)l.log("%cEvent '%s' fired on %s","color: #999;",o.type,(this.ctorName?this.ctorName+"::":"")+i);var u=[];f.each(e,function(t){n[0].target=t.scope;if(o.async)u.push(function(e){setTimeout(function(){e(t.fn.apply(t.scope,n)===false)},1)});else u.push(function(e){e(t.fn.apply(t.scope,n)===false)})});if(u.length)f.inSeries(u,function(e){a=!e})}return a},bindOnce:function(t,i,e,n){var r=this;r.bind.call(this,t,function e(){r.unbind(t,e);return i.apply(this,arguments)},e,n)},bind:function(){this.addEventListener.apply(this,arguments)},unbind:function(){this.removeEventListener.apply(this,arguments)},unbindAll:function(){this.removeAllEventListeners.apply(this,arguments)},trigger:function(){return this.dispatchEvent.apply(this,arguments)},handleEventProps:function(e){var t=this;this.bind(e.join(" "),function(e){var t="on"+e.type.toLowerCase();if(f.typeOf(this[t])==="function")this[t].apply(this,arguments)});f.each(e,function(e){e="on"+e.toLowerCase(e);if(f.typeOf(t[e])==="undefined")t[e]=null})}});e.instance=new e;return e});e("moxie/runtime/Runtime",["moxie/core/utils/Env","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/EventTarget"],function(l,c,f,i){var n={},d={};function m(e,t,r,i,n){var o=this,a,s=c.guid(t+"_"),u=n||"browser";e=e||{};d[s]=this;r=c.extend({access_binary:false,access_image_binary:false,display_media:false,do_cors:false,drag_and_drop:false,filter_by_extension:true,resize_image:false,report_upload_progress:false,return_response_headers:false,return_response_type:false,return_status_code:true,send_custom_headers:false,select_file:false,select_folder:false,select_multiple:true,send_binary_string:false,send_browser_cookies:true,send_multipart:true,slice_blob:false,stream_upload:false,summon_file_dialog:false,upload_filesize:true,use_http_method:true},r);if(e.preferred_caps)u=m.getMode(i,e.preferred_caps,u);if(MXI_DEBUG&&l.debug.runtime)l.log("\tdefault mode: %s",u);a=function(){var r={};return{exec:function(e,t,i,n){if(a[t]){if(!r[e])r[e]={context:this,instance:new a[t]};if(r[e].instance[i])return r[e].instance[i].apply(this,n)}},removeInstance:function(e){delete r[e]},removeAllInstances:function(){var i=this;c.each(r,function(e,t){if(c.typeOf(e.instance.destroy)==="function")e.instance.destroy.call(e.context);i.removeInstance(t)})}}}();c.extend(this,{initialized:false,uid:s,type:t,mode:m.getMode(i,e.required_caps,u),shimid:s+"_container",clients:0,options:e,can:function(e,t){var i=arguments[2]||r;if(c.typeOf(e)==="string"&&c.typeOf(t)==="undefined")e=m.parseCaps(e);if(c.typeOf(e)==="object"){for(var n in e)if(!this.can(n,e[n],i))return false;return true}if(c.typeOf(i[e])==="function")return i[e].call(this,t);else return t===i[e]},getShimContainer:function(){var e,t=f.get(this.shimid);if(!t){e=f.get(this.options.container)||document.body;t=document.createElement("div");t.id=this.shimid;t.className="moxie-shim moxie-shim-"+this.type;c.extend(t.style,{position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"});e.appendChild(t);e=null}return t},getShim:function(){return a},shimExec:function(e,t){var i=[].slice.call(arguments,2);return o.getShim().exec.call(this,this.uid,e,t,i)},exec:function(e,t){var i=[].slice.call(arguments,2);if(o[e]&&o[e][t])return o[e][t].apply(this,i);return o.shimExec.apply(this,arguments)},destroy:function(){if(!o)return;var e=f.get(this.shimid);if(e)e.parentNode.removeChild(e);if(a)a.removeAllInstances();this.unbindAll();delete d[this.uid];this.uid=null;s=o=a=e=null}});if(this.mode&&e.required_caps&&!this.can(e.required_caps))this.mode=false}m.order="html5,flash,silverlight,html4";m.getRuntime=function(e){return d[e]?d[e]:false};m.addConstructor=function(e,t){t.prototype=i.instance;n[e]=t};m.getConstructor=function(e){return n[e]||null};m.getInfo=function(e){var t=m.getRuntime(e);if(t)return{uid:t.uid,type:t.type,mode:t.mode,can:function(){return t.can.apply(t,arguments)}};return null};m.parseCaps=function(e){var t={};if(c.typeOf(e)!=="string")return e||{};c.each(e.split(","),function(e){t[e]=true});return t};m.can=function(e,t){var i,n=m.getConstructor(e),r;if(n){i=new n({required_caps:t});r=i.mode;i.destroy();return!!r}return false};m.thatCan=function(e,t){var i=(t||m.order).split(/\s*,\s*/);for(var n in i)if(m.can(i[n],e))return i[n];return null};m.getMode=function(n,e,t){var r=null;if(c.typeOf(t)==="undefined")t="browser";if(e&&!c.isEmptyObj(n)){c.each(e,function(e,t){if(n.hasOwnProperty(t)){var i=n[t](e);if(typeof i==="string")i=[i];if(!r)r=i;else if(!(r=c.arrayIntersect(r,i))){if(MXI_DEBUG&&l.debug.runtime)l.log("\t\t%s: %s (conflicting mode requested: %s)",t,e,i);return r=false}}if(MXI_DEBUG&&l.debug.runtime)l.log("\t\t%s: %s (compatible modes: %s)",t,e,r)});if(r)return c.inArray(t,r)!==-1?t:r[0];else if(r===false)return false}return t};m.getGlobalEventTarget=function(){if(/^moxie\./.test(l.global_event_dispatcher)&&!l.can("access_global_ns")){var e=c.guid("moxie_event_target_");window[e]=function(e,t){i.instance.dispatchEvent(e,t)};l.global_event_dispatcher=e}return l.global_event_dispatcher};m.capTrue=function(){return true};m.capFalse=function(){return false};m.capTest=function(e){return function(){return!!e}};return m});e("moxie/runtime/RuntimeClient",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/Runtime"],function(s,u,t,l){return function e(){var a;t.extend(this,{connectRuntime:function(n){var r=this,e;function o(e){var t,i;if(!e.length){r.trigger("RuntimeError",new u.RuntimeError(u.RuntimeError.NOT_INIT_ERR));a=null;return}t=e.shift().toLowerCase();i=l.getConstructor(t);if(!i){if(MXI_DEBUG&&s.debug.runtime)s.log("Constructor for '%s' runtime is not available.",t);o(e);return}if(MXI_DEBUG&&s.debug.runtime){s.log("Trying runtime: %s",t);s.log(n)}a=new i(n);a.bind("Init",function(){a.initialized=true;if(MXI_DEBUG&&s.debug.runtime)s.log("Runtime '%s' initialized",a.type);setTimeout(function(){a.clients++;r.ruid=a.uid;r.trigger("RuntimeInit",a)},1)});a.bind("Error",function(){if(MXI_DEBUG&&s.debug.runtime)s.log("Runtime '%s' failed to initialize",a.type);a.destroy();o(e)});a.bind("Exception",function(e,t){var i=t.name+"(#"+t.code+")"+(t.message?", from: "+t.message:"");if(MXI_DEBUG&&s.debug.runtime)s.log("Runtime '%s' has thrown an exception: %s",this.type,i);r.trigger("RuntimeError",new u.RuntimeError(u.RuntimeError.EXCEPTION_ERR,i))});if(MXI_DEBUG&&s.debug.runtime)s.log("\tselected mode: %s",a.mode);if(!a.mode){a.trigger("Error");return}a.init()}if(t.typeOf(n)==="string")e=n;else if(t.typeOf(n.ruid)==="string")e=n.ruid;if(e){a=l.getRuntime(e);if(a){r.ruid=e;a.clients++;return a}else throw new u.RuntimeError(u.RuntimeError.NOT_INIT_ERR)}o((n.runtime_order||l.order).split(/\s*,\s*/))},disconnectRuntime:function(){if(a&&--a.clients<=0)a.destroy();a=null},getRuntime:function(){if(a&&a.uid)return a;return a=null},exec:function(){return a?a.exec.apply(this,arguments):null},can:function(e){return a?a.can(e):false}})}});e("moxie/file/Blob",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient"],function(o,i,r){var a={};function s(e,t){function n(e,t,i){var n,r=a[this.uid];if(o.typeOf(r)!=="string"||!r.length)return null;n=new s(null,{type:i,size:t-e});n.detach(r.substr(e,n.size));return n}r.call(this);if(e)this.connectRuntime(e);if(!t)t={};else if(o.typeOf(t)==="string")t={data:t};o.extend(this,{uid:t.uid||o.guid("uid_"),ruid:e,size:t.size||0,type:t.type||"",slice:function(e,t,i){if(this.isDetached())return n.apply(this,arguments);return this.getRuntime().exec.call(this,"Blob","slice",this.getSource(),e,t,i)},getSource:function(){if(!a[this.uid])return null;return a[this.uid]},detach:function(e){if(this.ruid){this.getRuntime().exec.call(this,"Blob","destroy");this.disconnectRuntime();this.ruid=null}e=e||"";if(e.substr(0,5)=="data:"){var t=e.indexOf(";base64,");this.type=e.substring(5,t);e=i.atob(e.substring(t+8))}this.size=e.length;a[this.uid]=e},isDetached:function(){return!this.ruid&&o.typeOf(a[this.uid])==="string"},destroy:function(){this.detach();delete a[this.uid]}});if(t.data)this.detach(t.data);else a[this.uid]=t}return s});e("moxie/core/I18n",["moxie/core/utils/Basic"],function(i){var t={};return{addI18n:function(e){return i.extend(t,e)},translate:function(e){return t[e]||e},_:function(e){return this.translate(e)},sprintf:function(e){var t=[].slice.call(arguments,1);return e.replace(/%[a-z]/g,function(){var e=t.shift();return i.typeOf(e)!=="undefined"?e:""})}}});e("moxie/core/utils/Mime",["moxie/core/utils/Basic","moxie/core/I18n"],function(s,n){var e=""+"application/msword,doc dot,"+"application/pdf,pdf,"+"application/pgp-signature,pgp,"+"application/postscript,ps ai eps,"+"application/rtf,rtf,"+"application/vnd.ms-excel,xls xlb xlt xla,"+"application/vnd.ms-powerpoint,ppt pps pot ppa,"+"application/zip,zip,"+"application/x-shockwave-flash,swf swfl,"+"application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,"+"application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,"+"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,"+"application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,"+"application/vnd.openxmlformats-officedocument.presentationml.template,potx,"+"application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,"+"application/x-javascript,js,"+"application/json,json,"+"audio/mpeg,mp3 mpga mpega mp2,"+"audio/x-wav,wav,"+"audio/x-m4a,m4a,"+"audio/ogg,oga ogg,"+"audio/aiff,aiff aif,"+"audio/flac,flac,"+"audio/aac,aac,"+"audio/ac3,ac3,"+"audio/x-ms-wma,wma,"+"image/bmp,bmp,"+"image/gif,gif,"+"image/jpeg,jpg jpeg jpe,"+"image/photoshop,psd,"+"image/png,png,"+"image/svg+xml,svg svgz,"+"image/tiff,tiff tif,"+"text/plain,asc txt text diff log,"+"text/html,htm html xhtml,"+"text/css,css,"+"text/csv,csv,"+"text/rtf,rtf,"+"video/mpeg,mpeg mpg mpe m2v,"+"video/quicktime,qt mov,"+"video/mp4,mp4,"+"video/x-m4v,m4v,"+"video/x-flv,flv,"+"video/x-ms-wmv,wmv,"+"video/avi,avi,"+"video/webm,webm,"+"video/3gpp,3gpp 3gp,"+"video/3gpp2,3g2,"+"video/vnd.rn-realvideo,rv,"+"video/ogg,ogv,"+"video/x-matroska,mkv,"+"application/vnd.oasis.opendocument.formula-template,otf,"+"application/octet-stream,exe";var o={};var a={};var t=function(e){var t=e.split(/,/),i,n,r;for(i=0;i<t.length;i+=2){r=t[i+1].split(/ /);for(n=0;n<r.length;n++)o[r[n]]=t[i];a[t[i]]=r}};var i=function(e,t){var i,n,r,o,a=[];for(n=0;n<e.length;n++){i=e[n].extensions.toLowerCase().split(/\s*,\s*/);for(r=0;r<i.length;r++){if(i[r]==="*")return[];o=a[i[r]];if(t&&/^\w+$/.test(i[r]))a.push("."+i[r]);else if(o&&s.inArray(o,a)===-1)a.push(o);else if(!o)return[]}}return a};var r=function(e){var n=[];s.each(e,function(e){e=e.toLowerCase();if(e==="*"){n=[];return false}var i=e.match(/^(\w+)\/(\*|\w+)$/);if(i)if(i[2]==="*")s.each(a,function(e,t){if(new RegExp("^"+i[1]+"/").test(t))[].push.apply(n,a[t])});else if(a[e])[].push.apply(n,a[e])});return n};var u=function(e){var t=[],i=[];if(s.typeOf(e)==="string")e=s.trim(e).split(/\s*,\s*/);i=r(e);t.push({title:n.translate("Files"),extensions:i.length?i.join(","):"*"});return t};var l=function(e){var t=e&&e.match(/\.([^.]+)$/);if(t)return t[1].toLowerCase();return""};var c=function(e){return o[l(e)]||""};t(e);return{mimes:o,extensions:a,addMimeType:t,extList2mimes:i,mimes2exts:r,mimes2extList:u,getFileExtension:l,getFileMime:c}});e("moxie/file/FileInput",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Mime","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/I18n","moxie/runtime/Runtime","moxie/runtime/RuntimeClient"],function(s,n,r,u,o,e,l,c,f){var d=["ready","change","cancel","mouseenter","mouseleave","mousedown","mouseup"];function t(a){if(MXI_DEBUG)n.log("Instantiating FileInput...");var e,t,i;if(s.inArray(s.typeOf(a),["string","node"])!==-1)a={browse_button:a};t=u.get(a.browse_button);if(!t)throw new o.DOMException(o.DOMException.NOT_FOUND_ERR);i={accept:[{title:l.translate("All Files"),extensions:"*"}],multiple:false,required_caps:false,container:t.parentNode||document.body};a=s.extend({},i,a);if(typeof a.required_caps==="string")a.required_caps=c.parseCaps(a.required_caps);if(typeof a.accept==="string")a.accept=r.mimes2extList(a.accept);e=u.get(a.container);if(!e)e=document.body;if(u.getStyle(e,"position")==="static")e.style.position="relative";e=t=null;f.call(this);s.extend(this,{uid:s.guid("uid_"),ruid:null,shimid:null,files:null,init:function(){var t=this;t.bind("RuntimeInit",function(e,o){t.ruid=o.uid;t.shimid=o.shimid;t.bind("Ready",function(){t.trigger("Refresh")},999);t.bind("Refresh",function(){var e,t,i,n,r;i=u.get(a.browse_button);n=u.get(o.shimid);if(i){e=u.getPos(i,u.get(a.container));t=u.getSize(i);r=parseInt(u.getStyle(i,"z-index"),10)||0;if(n)s.extend(n.style,{top:e.y+"px",left:e.x+"px",width:t.w+"px",height:t.h+"px",zIndex:r+1})}n=i=null});o.exec.call(t,"FileInput","init",a)});t.connectRuntime(s.extend({},a,{required_caps:{select_file:true}}))},getOption:function(e){return a[e]},setOption:function(e,t){if(!a.hasOwnProperty(e))return;var i=a[e];switch(e){case"accept":if(typeof t==="string")t=r.mimes2extList(t);break;case"container":case"required_caps":throw new o.FileException(o.FileException.NO_MODIFICATION_ALLOWED_ERR)}a[e]=t;this.exec("FileInput","setOption",e,t);this.trigger("OptionChanged",e,t,i)},disable:function(e){var t=this.getRuntime();if(t)this.exec("FileInput","disable",s.typeOf(e)==="undefined"?true:e)},refresh:function(){this.trigger("Refresh")},destroy:function(){var e=this.getRuntime();if(e){e.exec.call(this,"FileInput","destroy");this.disconnectRuntime()}if(s.typeOf(this.files)==="array")s.each(this.files,function(e){e.destroy()});this.files=null;this.unbindAll()}});this.handleEventProps(d)}t.prototype=e.instance;return t});e("moxie/file/File",["moxie/core/utils/Basic","moxie/core/utils/Mime","moxie/file/Blob"],function(r,o,a){function e(e,t){if(!t)t={};a.apply(this,arguments);if(!this.type)this.type=o.getFileMime(t.name);var i;if(t.name){i=t.name.replace(/\\/g,"/");i=i.substr(i.lastIndexOf("/")+1)}else if(this.type){var n=this.type.split("/")[0];i=r.guid((n!==""?n:"file")+"_");if(o.extensions[this.type])i+="."+o.extensions[this.type][0]}r.extend(this,{name:i||r.guid("file_"),relativePath:"",lastModifiedDate:t.lastModifiedDate||(new Date).toLocaleString()})}e.prototype=a.prototype;return e});e("moxie/file/FileDrop",["moxie/core/I18n","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/utils/Basic","moxie/core/utils/Env","moxie/file/File","moxie/runtime/RuntimeClient","moxie/core/EventTarget","moxie/core/utils/Mime"],function(t,r,e,o,a,i,s,n,u){var l=["ready","dragenter","dragleave","drop","error"];function c(i){if(MXI_DEBUG)a.log("Instantiating FileDrop...");var n=this,e;if(typeof i==="string")i={drop_zone:i};e={accept:[{title:t.translate("All Files"),extensions:"*"}],required_caps:{drag_and_drop:true}};i=typeof i==="object"?o.extend({},e,i):e;i.container=r.get(i.drop_zone)||document.body;if(r.getStyle(i.container,"position")==="static")i.container.style.position="relative";if(typeof i.accept==="string")i.accept=u.mimes2extList(i.accept);s.call(n);o.extend(n,{uid:o.guid("uid_"),ruid:null,files:null,init:function(){n.bind("RuntimeInit",function(e,t){n.ruid=t.uid;t.exec.call(n,"FileDrop","init",i);n.dispatchEvent("ready")});n.connectRuntime(i)},destroy:function(){var e=this.getRuntime();if(e){e.exec.call(this,"FileDrop","destroy");this.disconnectRuntime()}this.files=null;this.unbindAll()}});this.handleEventProps(l)}c.prototype=n.instance;return c});e("moxie/file/FileReader",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/core/Exceptions","moxie/core/EventTarget","moxie/file/Blob","moxie/runtime/RuntimeClient"],function(e,r,o,t,a,i){var n=["loadstart","progress","load","abort","error","loadend"];function s(){i.call(this);e.extend(this,{uid:e.guid("uid_"),readyState:s.EMPTY,result:null,error:null,readAsBinaryString:function(e){t.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){t.call(this,"readAsDataURL",e)},readAsText:function(e){t.call(this,"readAsText",e)},abort:function(){this.result=null;if(e.inArray(this.readyState,[s.EMPTY,s.DONE])!==-1)return;else if(this.readyState===s.LOADING)this.readyState=s.DONE;this.exec("FileReader","abort");this.trigger("abort");this.trigger("loadend")},destroy:function(){this.abort();this.exec("FileReader","destroy");this.disconnectRuntime();this.unbindAll()}});this.handleEventProps(n);this.bind("Error",function(e,t){this.readyState=s.DONE;this.error=t},999);this.bind("Load",function(e){this.readyState=s.DONE},999);function t(e,t){var i=this;this.trigger("loadstart");if(this.readyState===s.LOADING){this.trigger("error",new o.DOMException(o.DOMException.INVALID_STATE_ERR));this.trigger("loadend");return}if(!(t instanceof a)){this.trigger("error",new o.DOMException(o.DOMException.NOT_FOUND_ERR));this.trigger("loadend");return}this.result=null;this.readyState=s.LOADING;if(t.isDetached()){var n=t.getSource();switch(e){case"readAsText":case"readAsBinaryString":this.result=n;break;case"readAsDataURL":this.result="data:"+t.type+";base64,"+r.btoa(n);break}this.readyState=s.DONE;this.trigger("load");this.trigger("loadend")}else{this.connectRuntime(t.ruid);this.exec("FileReader","read",e,t)}}}s.EMPTY=0;s.LOADING=1;s.DONE=2;s.prototype=t.instance;return s});e("moxie/core/utils/Url",["moxie/core/utils/Basic"],function(f){var d=function(e,t){var i=["source","scheme","authority","userInfo","user","pass","host","port","relative","path","directory","file","query","fragment"],n=i.length,r={http:80,https:443},o={},a=/^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@\/]*):?([^:@\/]*))?@)?(\[[\da-fA-F:]+\]|[^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,s=a.exec(e||""),u,l=/^\/\/\w/.test(e);switch(f.typeOf(t)){case"undefined":t=d(document.location.href,false);break;case"string":t=d(t,false);break}while(n--)if(s[n])o[i[n]]=s[n];u=!l&&!o.scheme;if(l||u)o.scheme=t.scheme;if(u){o.host=t.host;o.port=t.port;var c="";if(/^[^\/]/.test(o.path)){c=t.path;if(/\/[^\/]*\.[^\/]*$/.test(c))c=c.replace(/\/[^\/]+$/,"/");else c=c.replace(/\/?$/,"/")}o.path=c+(o.path||"")}if(!o.port)o.port=r[o.scheme]||80;o.port=parseInt(o.port,10);if(!o.path)o.path="/";delete o.source;return o};var e=function(e){var t={http:80,https:443},i=typeof e==="object"?e:d(e);return i.scheme+"://"+i.host+(i.port!==t[i.scheme]?":"+i.port:"")+i.path+(i.query?i.query:"")};var t=function(e){function t(e){return[e.scheme,e.host,e.port].join("/")}if(typeof e==="string")e=d(e);return t(d())===t(e)};return{parseUrl:d,resolveUrl:e,hasSameOrigin:t}});e("moxie/runtime/RuntimeTarget",["moxie/core/utils/Basic","moxie/runtime/RuntimeClient","moxie/core/EventTarget"],function(e,t,i){function n(){this.uid=e.guid("uid_");t.call(this);this.destroy=function(){this.disconnectRuntime();this.unbindAll()}}n.prototype=i.instance;return n});e("moxie/file/FileReaderSync",["moxie/core/utils/Basic","moxie/runtime/RuntimeClient","moxie/core/utils/Encode"],function(e,i,s){return function(){i.call(this);e.extend(this,{uid:e.guid("uid_"),readAsBinaryString:function(e){return t.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){return t.call(this,"readAsDataURL",e)},readAsText:function(e){return t.call(this,"readAsText",e)}});function t(e,t){if(t.isDetached()){var i=t.getSource();switch(e){case"readAsBinaryString":return i;case"readAsDataURL":return"data:"+t.type+";base64,"+s.btoa(i);case"readAsText":var n="";for(var r=0,o=i.length;r<o;r++)n+=String.fromCharCode(i[r]);return n}}else{var a=this.connectRuntime(t.ruid).exec.call(this,"FileReaderSync","read",e,t);this.disconnectRuntime();return a}}}});e("moxie/xhr/FormData",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/file/Blob"],function(e,a,s){function t(){var r,o=[];a.extend(this,{append:function(i,e){var n=this,t=a.typeOf(e);if(e instanceof s)r={name:i,value:e};else if("array"===t){i+="[]";a.each(e,function(e){n.append(i,e)})}else if("object"===t)a.each(e,function(e,t){n.append(i+"["+t+"]",e)});else if("null"===t||"undefined"===t||"number"===t&&isNaN(e))n.append(i,"false");else o.push({name:i,value:e.toString()})},hasBlob:function(){return!!this.getBlob()},getBlob:function(){return r&&r.value||null},getBlobName:function(){return r&&r.name||null},each:function(t){a.each(o,function(e){t(e.value,e.name)});if(r)t(r.value,r.name)},destroy:function(){r=null;o=[]}})}return t});e("moxie/xhr/XMLHttpRequest",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/utils/Encode","moxie/core/utils/Url","moxie/runtime/Runtime","moxie/runtime/RuntimeTarget","moxie/file/Blob","moxie/file/FileReaderSync","moxie/xhr/FormData","moxie/core/utils/Env","moxie/core/utils/Mime"],function(T,S,e,O,D,N,C,L,t,M,F,B){var P={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",306:"Reserved",307:"Temporary Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Requested Range Not Satisfiable",417:"Expectation Failed",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",426:"Upgrade Required",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",510:"Not Extended"};function H(){this.uid=T.guid("uid_")}H.prototype=e.instance;var U=["loadstart","progress","abort","error","load","timeout","loadend"];var i=1,n=2;function k(){var i=this,n={timeout:0,readyState:k.UNSENT,withCredentials:false,status:0,statusText:"",responseType:"",responseXML:null,responseText:null,response:null},a=true,s,u,l={},c,f,o=null,d=null,m=false,h=false,p=false,g=false,v=false,x=false,t,e,r=null,w=null,y={},E,b="",_;T.extend(this,n,{uid:T.guid("uid_"),upload:new H,open:function(e,t,i,n,r){var o;if(!e||!t)throw new S.DOMException(S.DOMException.SYNTAX_ERR);if(/[\u0100-\uffff]/.test(e)||O.utf8_encode(e)!==e)throw new S.DOMException(S.DOMException.SYNTAX_ERR);if(!!~T.inArray(e.toUpperCase(),["CONNECT","DELETE","GET","HEAD","OPTIONS","POST","PUT","TRACE","TRACK"]))u=e.toUpperCase();if(!!~T.inArray(u,["CONNECT","TRACE","TRACK"]))throw new S.DOMException(S.DOMException.SECURITY_ERR);t=O.utf8_encode(t);o=D.parseUrl(t);x=D.hasSameOrigin(o);s=D.resolveUrl(t);if((n||r)&&!x)throw new S.DOMException(S.DOMException.INVALID_ACCESS_ERR);c=n||o.user;f=r||o.pass;a=i||true;if(a===false&&(R("timeout")||R("withCredentials")||R("responseType")!==""))throw new S.DOMException(S.DOMException.INVALID_ACCESS_ERR);m=!a;h=false;l={};A.call(this);R("readyState",k.OPENED);this.dispatchEvent("readystatechange")},setRequestHeader:function(e,t){var i=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","content-transfer-encoding","date","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"];if(R("readyState")!==k.OPENED||h)throw new S.DOMException(S.DOMException.INVALID_STATE_ERR);if(/[\u0100-\uffff]/.test(e)||O.utf8_encode(e)!==e)throw new S.DOMException(S.DOMException.SYNTAX_ERR);e=T.trim(e).toLowerCase();if(!!~T.inArray(e,i)||/^(proxy\-|sec\-)/.test(e))return false;if(!l[e])l[e]=t;else l[e]+=", "+t;return true},hasRequestHeader:function(e){return e&&l[e.toLowerCase()]||false},getAllResponseHeaders:function(){return b||""},getResponseHeader:function(e){e=e.toLowerCase();if(v||!!~T.inArray(e,["set-cookie","set-cookie2"]))return null;if(b&&b!==""){if(!_){_={};T.each(b.split(/\r\n/),function(e){var t=e.split(/:\s+/);if(t.length===2){t[0]=T.trim(t[0]);_[t[0].toLowerCase()]={header:t[0],value:T.trim(t[1])}}})}if(_.hasOwnProperty(e))return _[e].header+": "+_[e].value}return null},overrideMimeType:function(e){var t,i;if(!!~T.inArray(R("readyState"),[k.LOADING,k.DONE]))throw new S.DOMException(S.DOMException.INVALID_STATE_ERR);e=T.trim(e.toLowerCase());if(/;/.test(e)&&(t=e.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))){e=t[1];if(t[2])i=t[2]}if(!B.mimes[e])throw new S.DOMException(S.DOMException.SYNTAX_ERR);r=e;w=i},send:function(e,t){if(T.typeOf(t)==="string")y={ruid:t};else if(!t)y={};else y=t;if(this.readyState!==k.OPENED||h)throw new S.DOMException(S.DOMException.INVALID_STATE_ERR);if(e instanceof L){y.ruid=e.ruid;d=e.type||"application/octet-stream"}else if(e instanceof M){if(e.hasBlob()){var i=e.getBlob();y.ruid=i.ruid;d=i.type||"application/octet-stream"}}else if(typeof e==="string"){o="UTF-8";d="text/plain;charset=UTF-8";e=O.utf8_encode(e)}if(!this.withCredentials)this.withCredentials=y.required_caps&&y.required_caps.send_browser_cookies&&!x;p=!m&&this.upload.hasEventListener();v=false;g=!e;if(!m)h=true;I.call(this,e)},abort:function(){v=true;m=false;if(!~T.inArray(R("readyState"),[k.UNSENT,k.OPENED,k.DONE])){R("readyState",k.DONE);h=false;if(E)E.getRuntime().exec.call(E,"XMLHttpRequest","abort",g);else throw new S.DOMException(S.DOMException.INVALID_STATE_ERR);g=true}else R("readyState",k.UNSENT)},destroy:function(){if(E){if(T.typeOf(E.destroy)==="function")E.destroy();E=null}this.unbindAll();if(this.upload){this.upload.unbindAll();this.upload=null}}});this.handleEventProps(U.concat(["readystatechange"]));this.upload.handleEventProps(U);function R(e,t){if(!n.hasOwnProperty(e))return;if(arguments.length===1)return F.can("define_property")?n[e]:i[e];else if(F.can("define_property"))n[e]=t;else i[e]=t}function I(e){var i=this;t=(new Date).getTime();E=new C;function n(){if(E){E.destroy();E=null}i.dispatchEvent("loadend");i=null}function r(t){E.bind("LoadStart",function(e){R("readyState",k.LOADING);i.dispatchEvent("readystatechange");i.dispatchEvent(e);if(p)i.upload.dispatchEvent(e)});E.bind("Progress",function(e){if(R("readyState")!==k.LOADING){R("readyState",k.LOADING);i.dispatchEvent("readystatechange")}i.dispatchEvent(e)});E.bind("UploadProgress",function(e){if(p)i.upload.dispatchEvent({type:"progress",lengthComputable:false,total:e.total,loaded:e.loaded})});E.bind("Load",function(e){R("readyState",k.DONE);R("status",Number(t.exec.call(E,"XMLHttpRequest","getStatus")||0));R("statusText",P[R("status")]||"");R("response",t.exec.call(E,"XMLHttpRequest","getResponse",R("responseType")));if(!!~T.inArray(R("responseType"),["text",""]))R("responseText",R("response"));else if(R("responseType")==="document")R("responseXML",R("response"));b=t.exec.call(E,"XMLHttpRequest","getAllResponseHeaders");i.dispatchEvent("readystatechange");if(R("status")>0){if(p)i.upload.dispatchEvent(e);i.dispatchEvent(e)}else{v=true;i.dispatchEvent("error")}n()});E.bind("Abort",function(e){i.dispatchEvent(e);n()});E.bind("Error",function(e){v=true;R("readyState",k.DONE);i.dispatchEvent("readystatechange");g=true;i.dispatchEvent(e);n()});t.exec.call(E,"XMLHttpRequest","send",{url:s,method:u,async:a,user:c,password:f,headers:l,mimeType:d,encoding:o,responseType:i.responseType,withCredentials:i.withCredentials,options:y},e)}if(typeof y.required_caps==="string")y.required_caps=N.parseCaps(y.required_caps);y.required_caps=T.extend({},y.required_caps,{return_response_type:i.responseType});if(e instanceof M)y.required_caps.send_multipart=true;if(!T.isEmptyObj(l))y.required_caps.send_custom_headers=true;if(!x)y.required_caps.do_cors=true;if(y.ruid)r(E.connectRuntime(y));else{E.bind("RuntimeInit",function(e,t){r(t)});E.bind("RuntimeError",function(e,t){i.dispatchEvent("RuntimeError",t)});E.connectRuntime(y)}}function A(){R("responseText","");R("responseXML",null);R("response",null);R("status",0);R("statusText","");t=e=null}}k.UNSENT=0;k.OPENED=1;k.HEADERS_RECEIVED=2;k.LOADING=3;k.DONE=4;k.prototype=e.instance;return k});e("moxie/runtime/Transporter",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient","moxie/core/EventTarget"],function(d,m,e,t){function h(){var o,n,a,s,r,u;e.call(this);d.extend(this,{uid:d.guid("uid_"),state:h.IDLE,result:null,transport:function(e,i,t){var n=this;t=d.extend({chunk_size:204798},t);if(o=t.chunk_size%3)t.chunk_size+=3-o;u=t.chunk_size;l.call(this);a=e;s=e.length;if(d.typeOf(t)==="string"||t.ruid)c.call(n,i,this.connectRuntime(t));else{var r=function(e,t){n.unbind("RuntimeInit",r);c.call(n,i,t)};this.bind("RuntimeInit",r);this.connectRuntime(t)}},abort:function(){var e=this;e.state=h.IDLE;if(n){n.exec.call(e,"Transporter","clear");e.trigger("TransportingAborted")}l.call(e)},destroy:function(){this.unbindAll();n=null;this.disconnectRuntime();l.call(this)}});function l(){s=r=0;a=this.result=null}function c(e,t){var i=this;n=t;i.bind("TransportingProgress",function(e){r=e.loaded;if(r<s&&d.inArray(i.state,[h.IDLE,h.DONE])===-1)f.call(i)},999);i.bind("TransportingComplete",function(){r=s;i.state=h.DONE;a=null;i.result=n.exec.call(i,"Transporter","getAsBlob",e||"")},999);i.state=h.BUSY;i.trigger("TransportingStarted");f.call(i)}function f(){var e=this,t,i=s-r;if(u>i)u=i;t=m.btoa(a.substr(r,u));n.exec.call(e,"Transporter","receive",t,s)}}h.IDLE=0;h.BUSY=1;h.DONE=2;h.prototype=t.instance;return h});e("moxie/image/Image",["moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/file/FileReaderSync","moxie/xhr/XMLHttpRequest","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/runtime/Transporter","moxie/core/utils/Env","moxie/core/EventTarget","moxie/file/Blob","moxie/file/File","moxie/core/utils/Encode"],function(l,c,f,e,a,s,t,d,m,i,u,h,p){var g=["progress","load","error","resize","embedded"];function v(){t.call(this);l.extend(this,{uid:l.guid("uid_"),ruid:null,name:"",size:0,width:0,height:0,type:"",meta:{},clone:function(){this.load.apply(this,arguments)},load:function(){i.apply(this,arguments)},resize:function(e){var t=this;var i;var n;var r={x:0,y:0,width:t.width,height:t.height};var o=l.extendIf({width:t.width,height:t.height,type:t.type||"image/jpeg",quality:90,crop:false,fit:true,preserveHeaders:true,resample:"default",multipass:true},e);try{if(!t.size)throw new f.DOMException(f.DOMException.INVALID_STATE_ERR);if(t.width>v.MAX_RESIZE_WIDTH||t.height>v.MAX_RESIZE_HEIGHT)throw new f.ImageError(f.ImageError.MAX_RESOLUTION_ERR);i=t.meta&&t.meta.tiff&&t.meta.tiff.Orientation||1;if(l.inArray(i,[5,6,7,8])!==-1){var a=o.width;o.width=o.height;o.height=a}if(o.crop){n=Math.max(o.width/t.width,o.height/t.height);if(e.fit){r.width=Math.min(Math.ceil(o.width/n),t.width);r.height=Math.min(Math.ceil(o.height/n),t.height);n=o.width/r.width}else{r.width=Math.min(o.width,t.width);r.height=Math.min(o.height,t.height);n=1}if(typeof o.crop==="boolean")o.crop="cc";switch(o.crop.toLowerCase().replace(/_/,"-")){case"rb":case"right-bottom":r.x=t.width-r.width;r.y=t.height-r.height;break;case"cb":case"center-bottom":r.x=Math.floor((t.width-r.width)/2);r.y=t.height-r.height;break;case"lb":case"left-bottom":r.x=0;r.y=t.height-r.height;break;case"lt":case"left-top":r.x=0;r.y=0;break;case"ct":case"center-top":r.x=Math.floor((t.width-r.width)/2);r.y=0;break;case"rt":case"right-top":r.x=t.width-r.width;r.y=0;break;case"rc":case"right-center":case"right-middle":r.x=t.width-r.width;r.y=Math.floor((t.height-r.height)/2);break;case"lc":case"left-center":case"left-middle":r.x=0;r.y=Math.floor((t.height-r.height)/2);break;case"cc":case"center-center":case"center-middle":default:r.x=Math.floor((t.width-r.width)/2);r.y=Math.floor((t.height-r.height)/2)}r.x=Math.max(r.x,0);r.y=Math.max(r.y,0)}else{n=Math.min(o.width/t.width,o.height/t.height);if(n>1&&!o.fit)n=1}this.exec("Image","resize",r,n,o)}catch(e){t.trigger("error",e.code)}},downsize:function(e){var t={width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,crop:false,fit:false,preserveHeaders:true,resample:"default"},i;if(typeof e==="object")i=l.extend(t,e);else i=l.extend(t,{width:arguments[0],height:arguments[1],crop:arguments[2],preserveHeaders:arguments[3]});this.resize(i)},crop:function(e,t,i){this.downsize(e,t,true,i)},getAsCanvas:function(){if(!m.can("create_canvas"))throw new f.RuntimeError(f.RuntimeError.NOT_SUPPORTED_ERR);return this.exec("Image","getAsCanvas")},getAsBlob:function(e,t){if(!this.size)throw new f.DOMException(f.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsBlob",e||"image/jpeg",t||90)},getAsDataURL:function(e,t){if(!this.size)throw new f.DOMException(f.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsDataURL",e||"image/jpeg",t||90)},getAsBinaryString:function(e,t){var i=this.getAsDataURL(e,t);return p.atob(i.substring(i.indexOf("base64,")+7))},embed:function(a,e){var s=this,u;var t=l.extend({width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,fit:true,resample:"nearest"},e);function i(e,t){var i=this;if(m.can("create_canvas")){var n=i.getAsCanvas();if(n){a.appendChild(n);n=null;i.destroy();s.trigger("embedded");return}}var r=i.getAsDataURL(e,t);if(!r)throw new f.ImageError(f.ImageError.WRONG_FORMAT);if(m.can("use_data_uri_of",r.length)){a.innerHTML='<img src="'+r+'" width="'+i.width+'" height="'+i.height+'" alt="" />';i.destroy();s.trigger("embedded")}else{var o=new d;o.bind("TransportingComplete",function(){u=s.connectRuntime(this.result.ruid);s.bind("Embedded",function(){l.extend(u.getShimContainer().style,{top:"0px",left:"0px",width:i.width+"px",height:i.height+"px"});u=null},999);u.exec.call(s,"ImageView","display",this.result.uid,width,height);i.destroy()});o.transport(p.atob(r.substring(r.indexOf("base64,")+7)),e,{required_caps:{display_media:true},runtime_order:"flash,silverlight",container:a})}}try{if(!(a=c.get(a)))throw new f.DOMException(f.DOMException.INVALID_NODE_TYPE_ERR);if(!this.size)throw new f.DOMException(f.DOMException.INVALID_STATE_ERR);if(this.width>v.MAX_RESIZE_WIDTH||this.height>v.MAX_RESIZE_HEIGHT);var n=new v;n.bind("Resize",function(){i.call(this,t.type,t.quality)});n.bind("Load",function(){this.downsize(t)});if(this.meta.thumb&&this.meta.thumb.width>=t.width&&this.meta.thumb.height>=t.height)n.load(this.meta.thumb.data);else n.clone(this,false);return n}catch(e){this.trigger("error",e.code)}},destroy:function(){if(this.ruid){this.getRuntime().exec.call(this,"Image","destroy");this.disconnectRuntime()}if(this.meta&&this.meta.thumb)this.meta.thumb.data.destroy();this.unbindAll()}});this.handleEventProps(g);this.bind("Load Resize",function(){return e.call(this)},999);function e(e){try{if(!e)e=this.exec("Image","getInfo");this.size=e.size;this.width=e.width;this.height=e.height;this.type=e.type;this.meta=e.meta;if(this.name==="")this.name=e.name;return true}catch(e){this.trigger("error",e.code);return false}}function i(e){var t=l.typeOf(e);try{if(e instanceof v){if(!e.size)throw new f.DOMException(f.DOMException.INVALID_STATE_ERR);n.apply(this,arguments)}else if(e instanceof u){if(!~l.inArray(e.type,["image/jpeg","image/png"]))throw new f.ImageError(f.ImageError.WRONG_FORMAT);r.apply(this,arguments)}else if(l.inArray(t,["blob","file"])!==-1)i.call(this,new h(null,e),arguments[1]);else if(t==="string")if(e.substr(0,5)==="data:")i.call(this,new u(null,{data:e}),arguments[1]);else o.apply(this,arguments);else if(t==="node"&&e.nodeName.toLowerCase()==="img")i.call(this,e.src,arguments[1]);else throw new f.DOMException(f.DOMException.TYPE_MISMATCH_ERR)}catch(e){this.trigger("error",e.code)}}function n(e,t){var i=this.connectRuntime(e.ruid);this.ruid=i.uid;i.exec.call(this,"Image","loadFromImage",e,l.typeOf(t)==="undefined"?true:t)}function r(t,e){var i=this;i.name=t.name||"";function n(e){i.ruid=e.uid;e.exec.call(i,"Image","loadFromBlob",t)}if(t.isDetached()){this.bind("RuntimeInit",function(e,t){n(t)});if(e&&typeof e.required_caps==="string")e.required_caps=s.parseCaps(e.required_caps);this.connectRuntime(l.extend({required_caps:{access_image_binary:true,resize_image:true}},e))}else n(this.connectRuntime(t.ruid))}function o(e,t){var i=this,n;n=new a;n.open("get",e);n.responseType="blob";n.onprogress=function(e){i.trigger(e)};n.onload=function(){r.call(i,n.response,true)};n.onerror=function(e){i.trigger(e)};n.onloadend=function(){n.destroy()};n.bind("RuntimeError",function(e,t){i.trigger("RuntimeError",t)});n.send(null,t)}}v.MAX_RESIZE_WIDTH=8192;v.MAX_RESIZE_HEIGHT=8192;v.prototype=i.instance;return v});e("moxie/runtime/html5/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(o,e,a,s){var u="html5",l={};function t(e){var t=this,i=a.capTest,n=a.capTrue;var r=o.extend({access_binary:i(window.FileReader||window.File&&window.File.getAsDataURL),access_image_binary:function(){return t.can("access_binary")&&!!l.Image},display_media:i((s.can("create_canvas")||s.can("use_data_uri_over32kb"))&&d("moxie/image/Image")),do_cors:i(window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest),drag_and_drop:i(function(){var e=document.createElement("div");return("draggable"in e||"ondragstart"in e&&"ondrop"in e)&&(s.browser!=="IE"||s.verComp(s.version,9,">"))}()),filter_by_extension:i(function(){return!(s.browser==="Chrome"&&s.verComp(s.version,28,"<")||s.browser==="IE"&&s.verComp(s.version,10,"<")||s.browser==="Safari"&&s.verComp(s.version,7,"<")||s.browser==="Firefox"&&s.verComp(s.version,37,"<"))}()),return_response_headers:n,return_response_type:function(e){if(e==="json"&&!!window.JSON)return true;return s.can("return_response_type",e)},return_status_code:n,report_upload_progress:i(window.XMLHttpRequest&&(new XMLHttpRequest).upload),resize_image:function(){return t.can("access_binary")&&s.can("create_canvas")},select_file:function(){return s.can("use_fileinput")&&window.File},select_folder:function(){return t.can("select_file")&&(s.browser==="Chrome"&&s.verComp(s.version,21,">=")||s.browser==="Firefox"&&s.verComp(s.version,42,">="))},select_multiple:function(){return t.can("select_file")&&!(s.browser==="Safari"&&s.os==="Windows")&&!(s.os==="iOS"&&s.verComp(s.osVersion,"7.0.0",">")&&s.verComp(s.osVersion,"8.0.0","<"))},send_binary_string:i(window.XMLHttpRequest&&((new XMLHttpRequest).sendAsBinary||window.Uint8Array&&window.ArrayBuffer)),send_custom_headers:i(window.XMLHttpRequest),send_multipart:function(){return!!(window.XMLHttpRequest&&(new XMLHttpRequest).upload&&window.FormData)||t.can("send_binary_string")},slice_blob:i(window.File&&(File.prototype.mozSlice||File.prototype.webkitSlice||File.prototype.slice)),stream_upload:function(){return t.can("slice_blob")&&t.can("send_multipart")},summon_file_dialog:function(){return t.can("select_file")&&!(s.browser==="Firefox"&&s.verComp(s.version,4,"<")||s.browser==="Opera"&&s.verComp(s.version,12,"<")||s.browser==="IE"&&s.verComp(s.version,10,"<"))},upload_filesize:n,use_http_method:n},arguments[2]);a.call(this,e,arguments[1]||u,r);o.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(t);e=t=null}}(this.destroy)});o.extend(this.getShim(),l)}a.addConstructor(u,t);return l});e("moxie/runtime/html5/file/Blob",["moxie/runtime/html5/Runtime","moxie/file/Blob"],function(e,t){function i(){function e(t,i,n){var e;if(window.File.prototype.slice)try{t.slice();return t.slice(i,n)}catch(e){return t.slice(i,n-i)}else if(e=window.File.prototype.webkitSlice||window.File.prototype.mozSlice)return e.call(t,i,n);else return null}this.slice=function(){return new t(this.getRuntime().uid,e.apply(this,arguments))};this.destroy=function(){this.getRuntime().getShim().removeInstance(this.uid)}}return e.Blob=i});e("moxie/core/utils/Events",["moxie/core/utils/Basic"],function(a){var s={},u="moxie_"+a.guid();function l(){this.returnValue=false}function c(){this.cancelBubble=true}var e=function(e,t,i,n){var r,o;t=t.toLowerCase();if(e.addEventListener){r=i;e.addEventListener(t,r,false)}else if(e.attachEvent){r=function(){var e=window.event;if(!e.target)e.target=e.srcElement;e.preventDefault=l;e.stopPropagation=c;i(e)};e.attachEvent("on"+t,r)}if(!e[u])e[u]=a.guid();if(!s.hasOwnProperty(e[u]))s[e[u]]={};o=s[e[u]];if(!o.hasOwnProperty(t))o[t]=[];o[t].push({func:r,orig:i,key:n})};var r=function(t,e,i){var n,r;e=e.toLowerCase();if(t[u]&&s[t[u]]&&s[t[u]][e])n=s[t[u]][e];else return;for(var o=n.length-1;o>=0;o--)if(n[o].orig===i||n[o].key===i){if(t.removeEventListener)t.removeEventListener(e,n[o].func,false);else if(t.detachEvent)t.detachEvent("on"+e,n[o].func);n[o].orig=null;n[o].func=null;n.splice(o,1);if(i!==r)break}if(!n.length)delete s[t[u]][e];if(a.isEmptyObj(s[t[u]])){delete s[t[u]];try{delete t[u]}catch(e){t[u]=r}}};var t=function(i,n){if(!i||!i[u])return;a.each(s[i[u]],function(e,t){r(i,t,n)})};return{addEvent:e,removeEvent:r,removeAllEvents:t}});e("moxie/runtime/html5/file/FileInput",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,f,d,m,h,p,g){function t(){var l,c;d.extend(this,{init:function(e){var i=this,n=i.getRuntime(),t,r,o,a,s,u;l=e;o=p.extList2mimes(l.accept,n.can("filter_by_extension"));r=n.getShimContainer();r.innerHTML='<input id="'+n.uid+'" type="file" style="font-size:999px;opacity:0;"'+(l.multiple&&n.can("select_multiple")?"multiple":"")+(l.directory&&n.can("select_folder")?"webkitdirectory directory":"")+(o?' accept="'+o.join(",")+'"':"")+" />";t=m.get(n.uid);d.extend(t.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"});a=m.get(l.browse_button);c=m.getStyle(a,"z-index")||"auto";if(n.can("summon_file_dialog")){if(m.getStyle(a,"position")==="static")a.style.position="relative";h.addEvent(a,"click",function(e){var t=m.get(n.uid);if(t&&!t.disabled)t.click();e.preventDefault()},i.uid);i.bind("Refresh",function(){s=parseInt(c,10)||1;m.get(l.browse_button).style.zIndex=s;this.getRuntime().getShimContainer().style.zIndex=s-1})}u=n.can("summon_file_dialog")?a:r;h.addEvent(u,"mouseover",function(){i.trigger("mouseenter")},i.uid);h.addEvent(u,"mouseout",function(){i.trigger("mouseleave")},i.uid);h.addEvent(u,"mousedown",function(){i.trigger("mousedown")},i.uid);h.addEvent(m.get(l.container),"mouseup",function(){i.trigger("mouseup")},i.uid);(n.can("summon_file_dialog")?t:a).setAttribute("tabindex",-1);t.onchange=function e(){i.files=[];d.each(this.files,function(e){var t="";if(l.directory)if(e.name==".")return true;if(e.webkitRelativePath)t="/"+e.webkitRelativePath.replace(/^\//,"");e=new f(n.uid,e);e.relativePath=t;i.files.push(e)});if(g.browser!=="IE"&&g.browser!=="IEMobile")this.value="";else{var t=this.cloneNode(true);this.parentNode.replaceChild(t,this);t.onchange=e}if(i.files.length)i.trigger("change")};i.trigger({type:"ready",async:true});r=null},setOption:function(e,t){var i=this.getRuntime();var n=m.get(i.uid);switch(e){case"accept":if(t){var r=t.mimes||p.extList2mimes(t,i.can("filter_by_extension"));n.setAttribute("accept",r.join(","))}else n.removeAttribute("accept");break;case"directory":if(t&&i.can("select_folder")){n.setAttribute("directory","");n.setAttribute("webkitdirectory","")}else{n.removeAttribute("directory");n.removeAttribute("webkitdirectory")}break;case"multiple":if(t&&i.can("select_multiple"))n.setAttribute("multiple","");else n.removeAttribute("multiple")}},disable:function(e){var t=this.getRuntime(),i;if(i=m.get(t.uid))i.disabled=!!e},destroy:function(){var e=this.getRuntime(),t=e.getShim(),i=e.getShimContainer(),n=l&&m.get(l.container),r=l&&m.get(l.browse_button);if(n)h.removeAllEvents(n,this.uid);if(r){h.removeAllEvents(r,this.uid);r.style.zIndex=c}if(i){h.removeAllEvents(i,this.uid);i.innerHTML=""}t.removeInstance(this.uid);l=i=n=r=t=null}})}return e.FileInput=t});e("moxie/runtime/html5/file/FileDrop",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime"],function(e,h,p,t,g,i){function n(){var n=[],r=[],o,a;p.extend(this,{init:function(e){var t=this,i;o=e;a=t.ruid;r=l(o.accept);i=o.container;g.addEvent(i,"dragover",function(e){if(!s(e))return;e.preventDefault();e.dataTransfer.dropEffect="copy"},t.uid);g.addEvent(i,"drop",function(e){if(!s(e))return;e.preventDefault();n=[];if(e.dataTransfer.items&&e.dataTransfer.items[0].webkitGetAsEntry)f(e.dataTransfer.items,function(){t.files=n;t.trigger("drop")});else{p.each(e.dataTransfer.files,function(e){u(e)});t.files=n;t.trigger("drop")}},t.uid);g.addEvent(i,"dragenter",function(e){t.trigger("dragenter")},t.uid);g.addEvent(i,"dragleave",function(e){t.trigger("dragleave")},t.uid)},destroy:function(){g.removeAllEvents(o&&t.get(o.container),this.uid);a=n=r=o=null;this.getRuntime().getShim().removeInstance(this.uid)}});function s(e){if(!e.dataTransfer||!e.dataTransfer.types)return false;var t=p.toArray(e.dataTransfer.types||[]);return p.inArray("Files",t)!==-1||p.inArray("public.file-url",t)!==-1||p.inArray("application/x-moz-file",t)!==-1}function u(e,t){if(c(e)){var i=new h(a,e);i.relativePath=t||"";n.push(i)}}function l(e){var t=[];for(var i=0;i<e.length;i++)[].push.apply(t,e[i].extensions.split(/\s*,\s*/));return p.inArray("*",t)===-1?t:[]}function c(e){if(!r.length)return true;var t=i.getFileExtension(e.name);return!t||p.inArray(t,r)!==-1}function f(e,t){var i=[];p.each(e,function(e){var t=e.webkitGetAsEntry();if(t)if(t.isFile)u(e.getAsFile(),t.fullPath);else i.push(t)});if(i.length)d(i,t);else t()}function d(e,t){var i=[];p.each(e,function(t){i.push(function(e){m(t,e)})});p.inSeries(i,function(){t()})}function m(t,i){if(t.isFile)t.file(function(e){u(e,t.fullPath);i()},function(){i()});else if(t.isDirectory)e(t,i);else i()}function e(e,t){var i=[],n=e.createReader();function r(t){n.readEntries(function(e){if(e.length){[].push.apply(i,e);r(t)}else t()},t)}r(function(){d(i,t)})}}return e.FileDrop=n});e("moxie/runtime/html5/file/FileReader",["moxie/runtime/html5/Runtime","moxie/core/utils/Encode","moxie/core/utils/Basic"],function(e,t,a){function i(){var n,r=false;a.extend(this,{read:function(e,t){var i=this;i.result="";n=new window.FileReader;n.addEventListener("progress",function(e){i.trigger(e)});n.addEventListener("load",function(e){i.result=r?o(n.result):n.result;i.trigger(e)});n.addEventListener("error",function(e){i.trigger(e,n.error)});n.addEventListener("loadend",function(e){n=null;i.trigger(e)});if(a.typeOf(n[e])==="function"){r=false;n[e](t.getSource())}else if(e==="readAsBinaryString"){r=true;n.readAsDataURL(t.getSource())}},abort:function(){if(n)n.abort()},destroy:function(){n=null;this.getRuntime().getShim().removeInstance(this.uid)}});function o(e){return t.atob(e.substring(e.indexOf("base64,")+7))}}return e.FileReader=i});e("moxie/runtime/html5/xhr/XMLHttpRequest",["moxie/runtime/html5/Runtime","moxie/core/utils/Basic","moxie/core/utils/Mime","moxie/core/utils/Url","moxie/file/File","moxie/file/Blob","moxie/xhr/FormData","moxie/core/Exceptions","moxie/core/utils/Env"],function(e,d,m,h,p,g,v,x,w){function t(){var o=this,s,u;d.extend(this,{send:function(n,i){var r=this,e=w.browser==="Mozilla"&&w.verComp(w.version,4,">=")&&w.verComp(w.version,7,"<"),t=w.browser==="Android Browser",o=false;u=n.url.replace(/^.+?\/([\w\-\.]+)$/,"$1").toLowerCase();s=c();s.open(n.method,n.url,n.async,n.user,n.password);if(i instanceof g){if(i.isDetached())o=true;i=i.getSource()}else if(i instanceof v){if(i.hasBlob())if(i.getBlob().isDetached()){i=f.call(r,i);o=true}else if((e||t)&&d.typeOf(i.getBlob().getSource())==="blob"&&window.FileReader){l.call(r,n,i);return}if(i instanceof v){var a=new window.FormData;i.each(function(e,t){if(e instanceof g)a.append(t,e.getSource());else a.append(t,e)});i=a}}if(s.upload){if(n.withCredentials)s.withCredentials=true;s.addEventListener("load",function(e){r.trigger(e)});s.addEventListener("error",function(e){r.trigger(e)});s.addEventListener("progress",function(e){r.trigger(e)});s.upload.addEventListener("progress",function(e){r.trigger({type:"UploadProgress",loaded:e.loaded,total:e.total})})}else s.onreadystatechange=function e(){switch(s.readyState){case 1:break;case 2:break;case 3:var t,i;try{if(h.hasSameOrigin(n.url))t=s.getResponseHeader("Content-Length")||0;if(s.responseText)i=s.responseText.length}catch(e){t=i=0}r.trigger({type:"progress",lengthComputable:!!t,total:parseInt(t,10),loaded:i});break;case 4:s.onreadystatechange=function(){};try{if(s.status>=200&&s.status<400){r.trigger("load");break}}catch(e){}r.trigger("error");break}};if(!d.isEmptyObj(n.headers))d.each(n.headers,function(e,t){s.setRequestHeader(t,e)});if(""!==n.responseType&&"responseType"in s)if("json"===n.responseType&&!w.can("return_response_type","json"))s.responseType="text";else s.responseType=n.responseType;if(!o)s.send(i);else if(s.sendAsBinary)s.sendAsBinary(i);else(function(){var e=new Uint8Array(i.length);for(var t=0;t<i.length;t++)e[t]=i.charCodeAt(t)&255;s.send(e.buffer)})();r.trigger("loadstart")},getStatus:function(){try{if(s)return s.status}catch(e){}return 0},getResponse:function(e){var t=this.getRuntime();try{switch(e){case"blob":var i=new p(t.uid,s.response);var n=s.getResponseHeader("Content-Disposition");if(n){var r=n.match(/filename=([\'\"'])([^\1]+)\1/);if(r)u=r[2]}i.name=u;if(!i.type)i.type=m.getFileMime(u);return i;case"json":if(!w.can("return_response_type","json"))return s.status===200&&!!window.JSON?JSON.parse(s.responseText):null;return s.response;case"document":return a(s);default:return s.responseText!==""?s.responseText:null}}catch(e){return null}},getAllResponseHeaders:function(){try{return s.getAllResponseHeaders()}catch(e){}return""},abort:function(){if(s)s.abort()},destroy:function(){o=u=null;this.getRuntime().getShim().removeInstance(this.uid)}});function l(e,t){var i=this,n,r;n=t.getBlob().getSource();r=new window.FileReader;r.onload=function(){t.append(t.getBlobName(),new g(null,{type:n.type,data:r.result}));o.send.call(i,e,t)};r.readAsBinaryString(n)}function c(){if(window.XMLHttpRequest&&!(w.browser==="IE"&&w.verComp(w.version,8,"<")))return new window.XMLHttpRequest;else return function(){var e=["Msxml2.XMLHTTP.6.0","Microsoft.XMLHTTP"];for(var t=0;t<e.length;t++)try{return new ActiveXObject(e[t])}catch(e){}}()}function a(e){var t=e.responseXML;var i=e.responseText;if(w.browser==="IE"&&i&&t&&!t.documentElement&&/[^\/]+\/[^\+]+\+xml/.test(e.getResponseHeader("Content-Type"))){t=new window.ActiveXObject("Microsoft.XMLDOM");t.async=false;t.validateOnParse=false;t.loadXML(i)}if(t)if(w.browser==="IE"&&t.parseError!==0||!t.documentElement||t.documentElement.tagName==="parsererror")return null;return t}function f(e){var i="----moxieboundary"+(new Date).getTime(),n="--",r="\r\n",o="",t=this.getRuntime();if(!t.can("send_binary_string"))throw new x.RuntimeError(x.RuntimeError.NOT_SUPPORTED_ERR);s.setRequestHeader("Content-Type","multipart/form-data; boundary="+i);e.each(function(e,t){if(e instanceof g)o+=n+i+r+'Content-Disposition: form-data; name="'+t+'"; filename="'+unescape(encodeURIComponent(e.name||"blob"))+'"'+r+"Content-Type: "+(e.type||"application/octet-stream")+r+r+e.getSource()+r;else o+=n+i+r+'Content-Disposition: form-data; name="'+t+'"'+r+r+unescape(encodeURIComponent(e))+r});o+=n+i+n+r;return o}}return e.XMLHttpRequest=t});e("moxie/runtime/html5/utils/BinaryReader",["moxie/core/utils/Basic"],function(e){function t(e){if(e instanceof ArrayBuffer)i.apply(this,arguments);else n.apply(this,arguments)}e.extend(t.prototype,{littleEndian:false,read:function(e,t){var i,n,r;if(e+t>this.length())throw new Error("You are trying to read outside the source boundaries.");n=this.littleEndian?0:-8*(t-1);for(r=0,i=0;r<t;r++)i|=this.readByteAt(e+r)<<Math.abs(n+r*8);return i},write:function(e,t,i){var n,r,o="";if(e>this.length())throw new Error("You are trying to write outside the source boundaries.");n=this.littleEndian?0:-8*(i-1);for(r=0;r<i;r++)this.writeByteAt(e+r,t>>Math.abs(n+r*8)&255)},BYTE:function(e){return this.read(e,1)},SHORT:function(e){return this.read(e,2)},LONG:function(e){return this.read(e,4)},SLONG:function(e){var t=this.read(e,4);return t>2147483647?t-4294967296:t},CHAR:function(e){return String.fromCharCode(this.read(e,1))},STRING:function(e,t){return this.asArray("CHAR",e,t).join("")},asArray:function(e,t,i){var n=[];for(var r=0;r<i;r++)n[r]=this[e](t+r);return n}});function i(r){var o=new DataView(r);e.extend(this,{readByteAt:function(e){return o.getUint8(e)},writeByteAt:function(e,t){o.setUint8(e,t)},SEGMENT:function(e,t,i){switch(arguments.length){case 2:return r.slice(e,e+t);case 1:return r.slice(e);case 3:if(i===null)i=new ArrayBuffer;if(i instanceof ArrayBuffer){var n=new Uint8Array(this.length()-t+i.byteLength);if(e>0)n.set(new Uint8Array(r.slice(0,e)),0);n.set(new Uint8Array(i),e);n.set(new Uint8Array(r.slice(e+t)),e+i.byteLength);this.clear();r=n.buffer;o=new DataView(r);break}default:return r}},length:function(){return r?r.byteLength:0},clear:function(){o=r=null}})}function n(n){e.extend(this,{readByteAt:function(e){return n.charCodeAt(e)},writeByteAt:function(e,t){r(String.fromCharCode(t),e,1)},SEGMENT:function(e,t,i){switch(arguments.length){case 1:return n.substr(e);case 2:return n.substr(e,t);case 3:r(i!==null?i:"",e,t);break;default:return n}},length:function(){return n?n.length:0},clear:function(){n=null}});function r(e,t,i){i=arguments.length===3?i:n.length-t-1;n=n.substr(0,t)+e+n.substr(i+t)}}return t});e("moxie/runtime/html5/image/JPEGHeaders",["moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(s,u){return function o(e){var a=[],t,r,i,n=0;t=new s(e);if(t.SHORT(0)!==65496){t.clear();throw new u.ImageError(u.ImageError.WRONG_FORMAT)}r=2;while(r<=t.length()){i=t.SHORT(r);if(i>=65488&&i<=65495){r+=2;continue}if(i===65498||i===65497)break;n=t.SHORT(r+2)+2;if(i>=65505&&i<=65519)a.push({hex:i,name:"APP"+(i&15),start:r,length:n,segment:t.SEGMENT(r,n)});r+=n}t.clear();return{headers:a,restore:function(e){var t,i,n;n=new s(e);r=n.SHORT(2)==65504?4+n.SHORT(4):2;for(i=0,t=a.length;i<t;i++){n.SEGMENT(r,0,a[i].segment);r+=a[i].length}e=n.SEGMENT();n.clear();return e},strip:function(e){var t,i,n,r;n=new o(e);i=n.headers;n.purge();t=new s(e);r=i.length;while(r--)t.SEGMENT(i[r].start,i[r].length,"");e=t.SEGMENT();t.clear();return e},get:function(e){var t=[];for(var i=0,n=a.length;i<n;i++)if(a[i].name===e.toUpperCase())t.push(a[i].segment);return t},set:function(e,t){var i=[],n,r,o;if(typeof t==="string")i.push(t);else i=t;for(n=r=0,o=a.length;n<o;n++){if(a[n].name===e.toUpperCase()){a[n].segment=i[r];a[n].length=i[r].length;r++}if(r>=i.length)break}},purge:function(){this.headers=a=[]}}}});e("moxie/runtime/html5/image/ExifParser",["moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(v,s,x){function u(e){var t,c,p,g,i,n;s.call(this,e);c={tiff:{274:"Orientation",270:"ImageDescription",271:"Make",272:"Model",305:"Software",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer"},exif:{36864:"ExifVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",36867:"DateTimeOriginal",33434:"ExposureTime",33437:"FNumber",34855:"ISOSpeedRatings",37377:"ShutterSpeedValue",37378:"ApertureValue",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37386:"FocalLength",41986:"ExposureMode",41987:"WhiteBalance",41990:"SceneCaptureType",41988:"DigitalZoomRatio",41992:"Contrast",41993:"Saturation",41994:"Sharpness"},gps:{0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude"},thumb:{513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength"}};p={ColorSpace:{1:"sRGB",0:"Uncalibrated"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{1:"Daylight",2:"Fliorescent",3:"Tungsten",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 -5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},ExposureMode:{0:"Auto exposure",1:"Manual exposure",2:"Auto bracket"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},GPSLatitudeRef:{N:"North latitude",S:"South latitude"},GPSLongitudeRef:{E:"East longitude",W:"West longitude"}};g={tiffHeader:10};i=g.tiffHeader;t={clear:this.clear};v.extend(this,{read:function(){try{return u.prototype.read.apply(this,arguments)}catch(e){throw new x.ImageError(x.ImageError.INVALID_META_ERR)}},write:function(){try{return u.prototype.write.apply(this,arguments)}catch(e){throw new x.ImageError(x.ImageError.INVALID_META_ERR)}},UNDEFINED:function(){return this.BYTE.apply(this,arguments)},RATIONAL:function(e){return this.LONG(e)/this.LONG(e+4)},SRATIONAL:function(e){return this.SLONG(e)/this.SLONG(e+4)},ASCII:function(e){return this.CHAR(e)},TIFF:function(){return n||null},EXIF:function(){var e=null;if(g.exifIFD){try{e=o.call(this,g.exifIFD,c.exif)}catch(e){return null}if(e.ExifVersion&&v.typeOf(e.ExifVersion)==="array"){for(var t=0,i="";t<e.ExifVersion.length;t++)i+=String.fromCharCode(e.ExifVersion[t]);e.ExifVersion=i}}return e},GPS:function(){var e=null;if(g.gpsIFD){try{e=o.call(this,g.gpsIFD,c.gps)}catch(e){return null}if(e.GPSVersionID&&v.typeOf(e.GPSVersionID)==="array")e.GPSVersionID=e.GPSVersionID.join(".")}return e},thumb:function(){if(g.IFD1)try{var e=o.call(this,g.IFD1,c.thumb);if("JPEGInterchangeFormat"in e)return this.SEGMENT(g.tiffHeader+e.JPEGInterchangeFormat,e.JPEGInterchangeFormatLength)}catch(e){}return null},setExif:function(e,t){if(e!=="PixelXDimension"&&e!=="PixelYDimension")return false;return a.call(this,"exif",e,t)},clear:function(){t.clear();e=c=p=n=g=t=null}});if(this.SHORT(0)!==65505||this.STRING(4,5).toUpperCase()!=="EXIF\0")throw new x.ImageError(x.ImageError.INVALID_META_ERR);this.littleEndian=this.SHORT(i)==18761;if(this.SHORT(i+=2)!==42)throw new x.ImageError(x.ImageError.INVALID_META_ERR);g.IFD0=g.tiffHeader+this.LONG(i+=2);n=o.call(this,g.IFD0,c.tiff);if("ExifIFDPointer"in n){g.exifIFD=g.tiffHeader+n.ExifIFDPointer;delete n.ExifIFDPointer}if("GPSInfoIFDPointer"in n){g.gpsIFD=g.tiffHeader+n.GPSInfoIFDPointer;delete n.GPSInfoIFDPointer}if(v.isEmptyObj(n))n=null;var r=this.LONG(g.IFD0+this.SHORT(g.IFD0)*12+2);if(r)g.IFD1=g.tiffHeader+r;function o(e,t){var i=this;var n,r,o,a,s,u,l,c,f=[],d={};var m={1:"BYTE",7:"UNDEFINED",2:"ASCII",3:"SHORT",4:"LONG",5:"RATIONAL",9:"SLONG",10:"SRATIONAL"};var h={BYTE:1,UNDEFINED:1,ASCII:1,SHORT:2,LONG:4,RATIONAL:8,SLONG:4,SRATIONAL:8};n=i.SHORT(e);for(r=0;r<n;r++){f=[];l=e+2+r*12;o=t[i.SHORT(l)];if(o===w)continue;a=m[i.SHORT(l+=2)];s=i.LONG(l+=2);u=h[a];if(!u)throw new x.ImageError(x.ImageError.INVALID_META_ERR);l+=4;if(u*s>4)l=i.LONG(l)+g.tiffHeader;if(l+u*s>=this.length())throw new x.ImageError(x.ImageError.INVALID_META_ERR);if(a==="ASCII"){d[o]=v.trim(i.STRING(l,s).replace(/\0$/,""));continue}else{f=i.asArray(a,l,s);c=s==1?f[0]:f;if(p.hasOwnProperty(o)&&typeof c!="object")d[o]=p[o][c];else d[o]=c}}return d}function a(e,t,i){var n,r,o,a=0;if(typeof t==="string"){var s=c[e.toLowerCase()];for(var u in s)if(s[u]===t){t=u;break}}n=g[e.toLowerCase()+"IFD"];r=this.SHORT(n);for(var l=0;l<r;l++){o=n+12*l+2;if(this.SHORT(o)==t){a=o+8;break}}if(!a)return false;try{this.write(a,i,4)}catch(e){return false}return true}}u.prototype=s.prototype;return u});e("moxie/runtime/html5/image/JPEG",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/html5/image/JPEGHeaders","moxie/runtime/html5/utils/BinaryReader","moxie/runtime/html5/image/ExifParser"],function(u,l,c,f,d){function e(e){var r,i,n,t;r=new f(e);if(r.SHORT(0)!==65496)throw new l.ImageError(l.ImageError.WRONG_FORMAT);i=new c(e);try{n=new d(i.get("app1")[0])}catch(e){}t=o.call(this);u.extend(this,{type:"image/jpeg",size:r.length(),width:t&&t.width||0,height:t&&t.height||0,setExif:function(e,t){if(!n)return false;if(u.typeOf(e)==="object")u.each(e,function(e,t){n.setExif(t,e)});else n.setExif(e,t);i.set("app1",n.SEGMENT())},writeHeaders:function(){if(!arguments.length)return i.restore(e);return i.restore(arguments[0])},stripHeaders:function(e){return i.strip(e)},purge:function(){s.call(this)}});if(n)this.meta={tiff:n.TIFF(),exif:n.EXIF(),gps:n.GPS(),thumb:a()};function o(e){var t=0,i,n;if(!e)e=r;while(t<=e.length()){i=e.SHORT(t+=2);if(i>=65472&&i<=65475){t+=5;return{height:e.SHORT(t),width:e.SHORT(t+=2)}}n=e.SHORT(t+=2);t+=n-2}return null}function a(){var e=n.thumb(),t,i;if(e){t=new f(e);i=o(t);t.clear();if(i){i.data=e;return i}}return null}function s(){if(!n||!i||!r)return;n.clear();i.purge();r.clear();t=i=n=r=null}}return e});e("moxie/runtime/html5/image/PNG",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader"],function(u,l,c){function e(e){var o,t,i,n;o=new c(e);(function(){var e=0,t=0,i=[35152,20039,3338,6666];for(t=0;t<i.length;t++,e+=2)if(i[t]!=o.SHORT(e))throw new u.ImageError(u.ImageError.WRONG_FORMAT)})();function r(){var e,t;e=s.call(this,8);if(e.type=="IHDR"){t=e.start;return{width:o.LONG(t),height:o.LONG(t+=4)}}return null}function a(){if(!o)return;o.clear();e=n=t=i=o=null}n=r.call(this);l.extend(this,{type:"image/png",size:o.length(),width:n.width,height:n.height,purge:function(){a.call(this)}});a.call(this);function s(e){var t,i,n,r;t=o.LONG(e);i=o.STRING(e+=4,4);n=e+=4;r=o.LONG(e+t);return{length:t,type:i,start:n,CRC:r}}}return e});e("moxie/runtime/html5/image/ImageInfo",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/html5/image/JPEG","moxie/runtime/html5/image/PNG"],function(n,r,o,a){return function(t){var i=[o,a],e;e=function(){for(var e=0;e<i.length;e++)try{return new i[e](t)}catch(e){}throw new r.ImageError(r.ImageError.WRONG_FORMAT)}();n.extend(this,{type:"",size:0,width:0,height:0,setExif:function(){},writeHeaders:function(e){return e},stripHeaders:function(e){return e},purge:function(){t=null}});n.extend(this,e);this.purge=function(){e.purge();e=null}}});e("moxie/runtime/html5/image/ResizerCanvas",[],function(){function s(e,t,i){var n=e.width>e.height?"width":"height";var r=Math.round(e[n]*t);var o=false;if(i!=="nearest"&&(t<.5||t>2)){t=t<.5?.5:2;o=true}var a=u(e,t);if(o)return s(a,r/a[n],i);else return a}function u(e,t){var i=e.width;var n=e.height;var r=Math.round(i*t);var o=Math.round(n*t);var a=document.createElement("canvas");a.width=r;a.height=o;a.getContext("2d").drawImage(e,0,0,i,n,0,0,r,o);e=null;return a}return{scale:s}});e("moxie/runtime/html5/image/Image",["moxie/runtime/html5/Runtime","moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/utils/Encode","moxie/file/Blob","moxie/file/File","moxie/runtime/html5/image/ImageInfo","moxie/runtime/html5/image/ResizerCanvas","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,x,w,y,E,b,_,R,I,t){function i(){var n=this,i,r,o,a,s,u=false,l=true;x.extend(this,{loadFromBlob:function(e){var t=this.getRuntime(),i=arguments.length>1?arguments[1]:true;if(!t.can("access_binary"))throw new w.RuntimeError(w.RuntimeError.NOT_SUPPORTED_ERR);s=e;if(e.isDetached()){a=e.getSource();h.call(this,a);return}else p.call(this,e.getSource(),function(e){if(i)a=d(e);h.call(this,e)})},loadFromImage:function(e,t){this.meta=e.meta;s=new b(null,{name:e.name,size:e.size,type:e.type});h.call(this,t?a=e.getAsBinaryString():e.getAsDataURL())},getInfo:function(){var e=this.getRuntime(),t;if(!r&&a&&e.can("access_image_binary"))r=new _(a);t={width:c().width||0,height:c().height||0,type:s.type||I.getFileMime(s.name),size:a&&a.length||s.size||0,name:s.name||"",meta:null};if(l){t.meta=r&&r.meta||this.meta||{};if(t.meta&&t.meta.thumb&&!(t.meta.thumb.data instanceof E))t.meta.thumb.data=new E(null,{type:"image/jpeg",data:t.meta.thumb.data})}return t},resize:function(e,t,i){var n=document.createElement("canvas");n.width=e.width;n.height=e.height;n.getContext("2d").drawImage(c(),e.x,e.y,e.width,e.height,0,0,n.width,n.height);o=R.scale(n,t);l=i.preserveHeaders;if(!l){var r=this.meta&&this.meta.tiff&&this.meta.tiff.Orientation||1;o=g(o,r)}this.width=o.width;this.height=o.height;u=true;this.trigger("Resize")},getAsCanvas:function(){if(!o)o=f();o.id=this.uid+"_canvas";return o},getAsBlob:function(e,t){if(e!==this.type){u=true;return new b(null,{name:s.name||"",type:e,data:n.getAsDataURL(e,t)})}return new b(null,{name:s.name||"",type:e,data:n.getAsBinaryString(e,t)})},getAsDataURL:function(e){var t=arguments[1]||90;if(!u)return i.src;f();if("image/jpeg"!==e)return o.toDataURL("image/png");else try{return o.toDataURL("image/jpeg",t/100)}catch(e){return o.toDataURL("image/jpeg")}},getAsBinaryString:function(e,t){if(!u){if(!a)a=d(n.getAsDataURL(e,t));return a}if("image/jpeg"!==e)a=d(n.getAsDataURL(e,t));else{var i;if(!t)t=90;f();try{i=o.toDataURL("image/jpeg",t/100)}catch(e){i=o.toDataURL("image/jpeg")}a=d(i);if(r){a=r.stripHeaders(a);if(l){if(r.meta&&r.meta.exif)r.setExif({PixelXDimension:this.width,PixelYDimension:this.height});a=r.writeHeaders(a)}r.purge();r=null}}u=false;return a},destroy:function(){n=null;v.call(this);this.getRuntime().getShim().removeInstance(this.uid)}});function c(){if(!o&&!i)throw new w.ImageError(w.DOMException.INVALID_STATE_ERR);return o||i}function f(){var e=c();if(e.nodeName.toLowerCase()=="canvas")return e;o=document.createElement("canvas");o.width=e.width;o.height=e.height;o.getContext("2d").drawImage(e,0,0);return o}function d(e){return y.atob(e.substring(e.indexOf("base64,")+7))}function m(e,t){return"data:"+(t||"")+";base64,"+y.btoa(e)}function h(e){var t=this;i=new Image;i.onerror=function(){v.call(this);t.trigger("error",w.ImageError.WRONG_FORMAT)};i.onload=function(){t.trigger("load")};i.src=e.substr(0,5)=="data:"?e:m(e,s.type)}function p(e,t){var i=this,n;if(window.FileReader){n=new FileReader;n.onload=function(){t.call(i,this.result)};n.onerror=function(){i.trigger("error",w.ImageError.WRONG_FORMAT)};n.readAsDataURL(e)}else return t.call(this,e.getAsDataURL())}function g(e,t){var i=Math.PI/180;var n=document.createElement("canvas");var r=n.getContext("2d");var o=e.width;var a=e.height;if(x.inArray(t,[5,6,7,8])>-1){n.width=a;n.height=o}else{n.width=o;n.height=a}switch(t){case 2:r.translate(o,0);r.scale(-1,1);break;case 3:r.translate(o,a);r.rotate(180*i);break;case 4:r.translate(0,a);r.scale(1,-1);break;case 5:r.rotate(90*i);r.scale(1,-1);break;case 6:r.rotate(90*i);r.translate(0,-a);break;case 7:r.rotate(90*i);r.translate(o,-a);r.scale(-1,1);break;case 8:r.rotate(-90*i);r.translate(-o,0);break}r.drawImage(e,0,0,o,a);return n}function v(){if(r){r.purge();r=null}a=i=o=s=null;u=false}}return e.Image=i});e("moxie/runtime/flash/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(a,s,u,l,c){var e="flash",t={};function i(){var t;try{t=navigator.plugins["Shockwave Flash"];t=t.description}catch(e){try{t=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(e){t="0.0"}}t=t.match(/\d+/g);return parseFloat(t[0]+"."+t[1])}function f(t){var i=u.get(t);if(i&&i.nodeName=="OBJECT")if(s.browser==="IE"){i.style.display="none";(function e(){if(i.readyState==4)n(t);else setTimeout(e,10)})()}else i.parentNode.removeChild(i)}function n(e){var t=u.get(e);if(t){for(var i in t)if(typeof t[i]=="function")t[i]=null;t.parentNode.removeChild(t)}}function r(n){var r=this,o;n=a.extend({swf_url:s.swf_url},n);c.call(this,n,e,{access_binary:function(e){return e&&r.mode==="browser"},access_image_binary:function(e){return e&&r.mode==="browser"},display_media:c.capTest(d("moxie/image/Image")),do_cors:c.capTrue,drag_and_drop:false,report_upload_progress:function(){return r.mode==="client"},resize_image:c.capTrue,return_response_headers:false,return_response_type:function(e){if(e==="json"&&!!window.JSON)return true;return!a.arrayDiff(e,["","text","document"])||r.mode==="browser"},return_status_code:function(e){return r.mode==="browser"||!a.arrayDiff(e,[200,404])},select_file:c.capTrue,select_multiple:c.capTrue,send_binary_string:function(e){return e&&r.mode==="browser"},send_browser_cookies:function(e){return e&&r.mode==="browser"},send_custom_headers:function(e){return e&&r.mode==="browser"},send_multipart:c.capTrue,slice_blob:function(e){return e&&r.mode==="browser"},stream_upload:function(e){return e&&r.mode==="browser"},summon_file_dialog:false,upload_filesize:function(e){return a.parseSizeStr(e)<=2097152||r.mode==="client"},use_http_method:function(e){return!a.arrayDiff(e,["GET","POST"])}},{access_binary:function(e){return e?"browser":"client"},access_image_binary:function(e){return e?"browser":"client"},report_upload_progress:function(e){return e?"browser":"client"},return_response_type:function(e){return a.arrayDiff(e,["","text","json","document"])?"browser":["client","browser"]},return_status_code:function(e){return a.arrayDiff(e,[200,404])?"browser":["client","browser"]},send_binary_string:function(e){return e?"browser":"client"},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"browser":"client"},slice_blob:function(e){return e?"browser":"client"},stream_upload:function(e){return e?"client":"browser"},upload_filesize:function(e){return a.parseSizeStr(e)>=2097152?"client":"browser"}},"client");if(i()<11.3){if(MXI_DEBUG&&s.debug.runtime)s.log("\tFlash didn't meet minimal version requirement (11.3).");this.mode=false}a.extend(this,{getShim:function(){return u.get(this.uid)},shimExec:function(e,t){var i=[].slice.call(arguments,2);return r.getShim().exec(this.uid,e,t,i)},init:function(){var e,t,i;i=this.getShimContainer();a.extend(i.style,{position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"});e='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+n.swf_url+'" ';if(s.browser==="IE")e+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';e+='width="100%" height="100%" style="outline:0">'+'<param name="movie" value="'+n.swf_url+'" />'+'<param name="flashvars" value="uid='+escape(this.uid)+"&target="+c.getGlobalEventTarget()+'" />'+'<param name="wmode" value="transparent" />'+'<param name="allowscriptaccess" value="always" />'+"</object>";if(s.browser==="IE"){t=document.createElement("div");i.appendChild(t);t.outerHTML=e;t=i=null}else i.innerHTML=e;o=setTimeout(function(){if(r&&!r.initialized){r.trigger("Error",new l.RuntimeError(l.RuntimeError.NOT_INIT_ERR));if(MXI_DEBUG&&s.debug.runtime)s.log("\tFlash failed to initialize within a specified period of time (typically 5s).")}},5e3)},destroy:function(e){return function(){f(r.uid);e.call(r);clearTimeout(o);n=o=e=r=null}}(this.destroy)},t)}c.addConstructor(e,r);return t});e("moxie/runtime/flash/file/Blob",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,o){var t={slice:function(e,t,i,n){var r=this.getRuntime();if(t<0)t=Math.max(e.size+t,0);else if(t>0)t=Math.min(t,e.size);if(i<0)i=Math.max(e.size+i,0);else if(i>0)i=Math.min(i,e.size);e=r.shimExec.call(this,"Blob","slice",t,i,n||"");if(e)e=new o(r.uid,e);return e}};return e.Blob=t});e("moxie/runtime/flash/file/FileInput",["moxie/runtime/flash/Runtime","moxie/file/File","moxie/core/utils/Dom","moxie/core/utils/Basic"],function(e,r,o,a){var t={init:function(e){var t=this,i=this.getRuntime();var n=o.get(e.browse_button);if(n){n.setAttribute("tabindex",-1);n=null}this.bind("Change",function(){var e=i.shimExec.call(t,"FileInput","getFiles");t.files=[];a.each(e,function(e){t.files.push(new r(i.uid,e))})},999);this.getRuntime().shimExec.call(this,"FileInput","init",{accept:e.accept,multiple:e.multiple});this.trigger("ready")}};return e.FileInput=t});e("moxie/runtime/flash/file/FileReader",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,i){function r(e,t){switch(t){case"readAsText":return i.atob(e,"utf8");case"readAsBinaryString":return i.atob(e);case"readAsDataURL":return e}return null}var t={read:function(i,e){var n=this;n.result="";if(i==="readAsDataURL")n.result="data:"+(e.type||"")+";base64,";n.bind("Progress",function(e,t){if(t)n.result+=r(t,i)},999);return n.getRuntime().shimExec.call(this,"FileReader","readAsBase64",e.uid)}};return e.FileReader=t});e("moxie/runtime/flash/file/FileReaderSync",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,i){function r(e,t){switch(t){case"readAsText":return i.atob(e,"utf8");case"readAsBinaryString":return i.atob(e);case"readAsDataURL":return e}return null}var t={read:function(e,t){var i,n=this.getRuntime();i=n.shimExec.call(this,"FileReaderSync","readAsBase64",t.uid);if(!i)return null;if(e==="readAsDataURL")i="data:"+(t.type||"")+";base64,"+i;return r(i,e,t.type)}};return e.FileReaderSync=t});e("moxie/runtime/flash/runtime/Transporter",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,n){var t={getAsBlob:function(e){var t=this.getRuntime(),i=t.shimExec.call(this,"Transporter","getAsBlob",e);if(i)return new n(t.uid,i);return null}};return e.Transporter=t});e("moxie/runtime/flash/xhr/XMLHttpRequest",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/file/Blob","moxie/file/File","moxie/file/FileReaderSync","moxie/runtime/flash/file/FileReaderSync","moxie/xhr/FormData","moxie/runtime/Transporter","moxie/runtime/flash/runtime/Transporter"],function(e,l,c,r,o,t,f,d,i){var n={send:function(e,i){var n=this,r=n.getRuntime();function o(){e.transport=r.mode;r.shimExec.call(n,"XMLHttpRequest","send",e,i)}function t(e,t){r.shimExec.call(n,"XMLHttpRequest","appendBlob",e,t.uid);i=null;o()}function a(e,t){var i=new d;i.bind("TransportingComplete",function(){t(this.result)});i.transport(e.getSource(),e.type,{ruid:r.uid})}if(!l.isEmptyObj(e.headers))l.each(e.headers,function(e,t){r.shimExec.call(n,"XMLHttpRequest","setRequestHeader",t,e.toString())});if(i instanceof f){var s;i.each(function(e,t){if(e instanceof c)s=t;else r.shimExec.call(n,"XMLHttpRequest","append",t,e)});if(!i.hasBlob()){i=null;o()}else{var u=i.getBlob();if(u.isDetached())a(u,function(e){u.destroy();t(s,e)});else t(s,u)}}else if(i instanceof c)if(i.isDetached())a(i,function(e){i.destroy();i=e.uid;o()});else{i=i.uid;o()}else o()},getResponse:function(e){var t,i,n=this.getRuntime();i=n.shimExec.call(this,"XMLHttpRequest","getResponseAsBlob");if(i){i=new r(n.uid,i);if("blob"===e)return i;try{t=new o;if(!!~l.inArray(e,["","text"]))return t.readAsText(i);else if("json"===e&&!!window.JSON)return JSON.parse(t.readAsText(i))}finally{i.destroy()}}return null},abort:function(e){var t=this.getRuntime();t.shimExec.call(this,"XMLHttpRequest","abort");this.dispatchEvent("readystatechange");this.dispatchEvent("abort")}};return e.XMLHttpRequest=n});e("moxie/runtime/flash/image/Image",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/runtime/Transporter","moxie/file/Blob","moxie/file/FileReaderSync"],function(e,t,o,r,n){var i={loadFromBlob:function(e){var t=this,i=t.getRuntime();function n(e){i.shimExec.call(t,"Image","loadFromBlob",e.uid);t=i=null}if(e.isDetached()){var r=new o;r.bind("TransportingComplete",function(){n(r.result.getSource())});r.transport(e.getSource(),e.type,{ruid:i.uid})}else n(e.getSource())},loadFromImage:function(e){var t=this.getRuntime();return t.shimExec.call(this,"Image","loadFromImage",e.uid)},getInfo:function(){var e=this.getRuntime(),t=e.shimExec.call(this,"Image","getInfo");if(t.meta&&t.meta.thumb&&t.meta.thumb.data&&!(e.meta.thumb.data instanceof r))t.meta.thumb.data=new r(e.uid,t.meta.thumb.data);return t},getAsBlob:function(e,t){var i=this.getRuntime(),n=i.shimExec.call(this,"Image","getAsBlob",e,t);if(n)return new r(i.uid,n);return null},getAsDataURL:function(){var e=this.getRuntime(),t=e.Image.getAsBlob.apply(this,arguments),i;if(!t)return null;i=new n;return i.readAsDataURL(t)}};return e.Image=i});e("moxie/runtime/silverlight/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(r,o,e,a,s){var u="silverlight",l={};function c(t){var i=false,e=null,n,r,o,a,s,u=0;try{try{e=new ActiveXObject("AgControl.AgControl");if(e.IsVersionSupported(t))i=true;e=null}catch(e){var l=navigator.plugins["Silverlight Plug-In"];if(l){n=l.description;if(n==="1.0.30226.2")n="2.0.30226.2";r=n.split(".");while(r.length>3)r.pop();while(r.length<4)r.push(0);o=t.split(".");while(o.length>4)o.pop();do{a=parseInt(o[u],10);s=parseInt(r[u],10);u++}while(u<o.length&&a===s);if(a<=s&&!isNaN(a))i=true}}}catch(e){i=false}return i}function t(t){var n=this,i;t=r.extend({xap_url:o.xap_url},t);s.call(this,t,u,{access_binary:s.capTrue,access_image_binary:s.capTrue,display_media:s.capTest(d("moxie/image/Image")),do_cors:s.capTrue,drag_and_drop:false,report_upload_progress:s.capTrue,resize_image:s.capTrue,return_response_headers:function(e){return e&&n.mode==="client"},return_response_type:function(e){if(e!=="json")return true;else return!!window.JSON},return_status_code:function(e){return n.mode==="client"||!r.arrayDiff(e,[200,404])},select_file:s.capTrue,select_multiple:s.capTrue,send_binary_string:s.capTrue,send_browser_cookies:function(e){return e&&n.mode==="browser"},send_custom_headers:function(e){return e&&n.mode==="client"},send_multipart:s.capTrue,slice_blob:s.capTrue,stream_upload:true,summon_file_dialog:false,upload_filesize:s.capTrue,use_http_method:function(e){return n.mode==="client"||!r.arrayDiff(e,["GET","POST"])}},{return_response_headers:function(e){return e?"client":"browser"},return_status_code:function(e){return r.arrayDiff(e,[200,404])?"client":["client","browser"]},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"client":"browser"},use_http_method:function(e){return r.arrayDiff(e,["GET","POST"])?"client":["client","browser"]}});if(!c("2.0.31005.0")||o.browser==="Opera"){if(MXI_DEBUG&&o.debug.runtime)o.log("\tSilverlight is not installed or minimal version (2.0.31005.0) requirement not met (not likely).");this.mode=false}r.extend(this,{getShim:function(){return e.get(this.uid).content.Moxie},shimExec:function(e,t){var i=[].slice.call(arguments,2);return n.getShim().exec(this.uid,e,t,i)},init:function(){var e;e=this.getShimContainer();e.innerHTML='<object id="'+this.uid+'" data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%" style="outline:none;">'+'<param name="source" value="'+t.xap_url+'"/>'+'<param name="background" value="Transparent"/>'+'<param name="windowless" value="true"/>'+'<param name="enablehtmlaccess" value="true"/>'+'<param name="initParams" value="uid='+this.uid+",target="+s.getGlobalEventTarget()+'"/>'+"</object>";i=setTimeout(function(){if(n&&!n.initialized){n.trigger("Error",new a.RuntimeError(a.RuntimeError.NOT_INIT_ERR));if(MXI_DEBUG&&o.debug.runtime)o.log("Silverlight failed to initialize within a specified period of time (5-10s).")}},o.OS!=="Windows"?1e4:5e3)},destroy:function(e){return function(){e.call(n);clearTimeout(i);t=i=e=n=null}}(this.destroy)},l)}s.addConstructor(u,t);return l});e("moxie/runtime/silverlight/file/Blob",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/Blob"],function(e,t,i){return e.Blob=t.extend({},i)});e("moxie/runtime/silverlight/file/FileInput",["moxie/runtime/silverlight/Runtime","moxie/file/File","moxie/core/utils/Dom","moxie/core/utils/Basic"],function(e,r,o,a){function s(e){var t="";for(var i=0;i<e.length;i++)t+=(t!==""?"|":"")+e[i].title+" | *."+e[i].extensions.replace(/,/g,";*.");return t}var t={init:function(e){var t=this,i=this.getRuntime();var n=o.get(e.browse_button);if(n){n.setAttribute("tabindex",-1);n=null}this.bind("Change",function(){var e=i.shimExec.call(t,"FileInput","getFiles");t.files=[];a.each(e,function(e){t.files.push(new r(i.uid,e))})},999);i.shimExec.call(this,"FileInput","init",s(e.accept),e.multiple);this.trigger("ready")},setOption:function(e,t){if(e=="accept")t=s(t);this.getRuntime().shimExec.call(this,"FileInput","setOption",e,t)}};return e.FileInput=t});e("moxie/runtime/silverlight/file/FileDrop",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Dom","moxie/core/utils/Events"],function(e,n,r){var t={init:function(){var e=this,i=e.getRuntime(),t;t=i.getShimContainer();r.addEvent(t,"dragover",function(e){e.preventDefault();e.stopPropagation();e.dataTransfer.dropEffect="copy"},e.uid);r.addEvent(t,"dragenter",function(e){e.preventDefault();var t=n.get(i.uid).dragEnter(e);if(t)e.stopPropagation()},e.uid);r.addEvent(t,"drop",function(e){e.preventDefault();var t=n.get(i.uid).dragDrop(e);if(t)e.stopPropagation()},e.uid);return i.shimExec.call(this,"FileDrop","init")}};return e.FileDrop=t});e("moxie/runtime/silverlight/file/FileReader",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/FileReader"],function(e,t,i){return e.FileReader=t.extend({},i)});e("moxie/runtime/silverlight/file/FileReaderSync",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/FileReaderSync"],function(e,t,i){return e.FileReaderSync=t.extend({},i)});e("moxie/runtime/silverlight/runtime/Transporter",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/runtime/Transporter"],function(e,t,i){return e.Transporter=t.extend({},i)});e("moxie/runtime/silverlight/xhr/XMLHttpRequest",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/xhr/XMLHttpRequest","moxie/runtime/silverlight/file/FileReaderSync","moxie/runtime/silverlight/runtime/Transporter"],function(e,t,i,n,r){return e.XMLHttpRequest=t.extend({},i)});e("moxie/runtime/silverlight/image/Image",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/file/Blob","moxie/runtime/flash/image/Image"],function(e,i,n,t){return e.Image=i.extend({},t,{getInfo:function(){var e=this.getRuntime(),t=["tiff","exif","gps","thumb"],a={meta:{}},s=e.shimExec.call(this,"Image","getInfo");if(s.meta){i.each(t,function(e){var t=s.meta[e],i,n,r,o;if(t&&t.keys){a.meta[e]={};for(n=0,r=t.keys.length;n<r;n++){i=t.keys[n];o=t[i];if(o){if(/^(\d|[1-9]\d+)$/.test(o))o=parseInt(o,10);else if(/^\d*\.\d+$/.test(o))o=parseFloat(o);a.meta[e][i]=o}}}});if(a.meta&&a.meta.thumb&&a.meta.thumb.data&&!(e.meta.thumb.data instanceof n))a.meta.thumb.data=new n(e.uid,a.meta.thumb.data)}a.width=parseInt(s.width,10);a.height=parseInt(s.height,10);a.size=parseInt(s.size,10);a.type=s.type;a.name=s.name;return a},resize:function(e,t,i){this.getRuntime().shimExec.call(this,"Image","resize",e.x,e.y,e.width,e.height,t,i.preserveHeaders,i.resample)}})});e("moxie/runtime/html4/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(r,e,o,a){var s="html4",u={};function t(e){var t=this,i=o.capTest,n=o.capTrue;o.call(this,e,s,{access_binary:i(window.FileReader||window.File&&File.getAsDataURL),access_image_binary:false,display_media:i((a.can("create_canvas")||a.can("use_data_uri_over32kb"))&&d("moxie/image/Image")),do_cors:false,drag_and_drop:false,filter_by_extension:i(function(){return!(a.browser==="Chrome"&&a.verComp(a.version,28,"<")||a.browser==="IE"&&a.verComp(a.version,10,"<")||a.browser==="Safari"&&a.verComp(a.version,7,"<")||a.browser==="Firefox"&&a.verComp(a.version,37,"<"))}()),resize_image:function(){return u.Image&&t.can("access_binary")&&a.can("create_canvas")},report_upload_progress:false,return_response_headers:false,return_response_type:function(e){if(e==="json"&&!!window.JSON)return true;return!!~r.inArray(e,["text","document",""])},return_status_code:function(e){return!r.arrayDiff(e,[200,404])},select_file:function(){return a.can("use_fileinput")},select_multiple:false,send_binary_string:false,send_custom_headers:false,send_multipart:true,slice_blob:false,stream_upload:function(){return t.can("select_file")},summon_file_dialog:function(){return t.can("select_file")&&!(a.browser==="Firefox"&&a.verComp(a.version,4,"<")||a.browser==="Opera"&&a.verComp(a.version,12,"<")||a.browser==="IE"&&a.verComp(a.version,10,"<"))},upload_filesize:n,use_http_method:function(e){return!r.arrayDiff(e,["GET","POST"])}});r.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(t);e=t=null}}(this.destroy)});r.extend(this.getShim(),u)}o.addConstructor(s,t);return u});e("moxie/runtime/html4/file/FileInput",["moxie/runtime/html4/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,d,m,h,p,g,v){function t(){var u,l=[],c,s;function f(){var t=this,i=t.getRuntime(),e,n,r,o,a,s;s=m.guid("uid_");e=i.getShimContainer();if(u){r=h.get(u+"_form");if(r){m.extend(r.style,{top:"100%"});r.firstChild.setAttribute("tabindex",-1)}}o=document.createElement("form");o.setAttribute("id",s+"_form");o.setAttribute("method","post");o.setAttribute("enctype","multipart/form-data");o.setAttribute("encoding","multipart/form-data");m.extend(o.style,{overflow:"hidden",position:"absolute",top:0,left:0,width:"100%",height:"100%"});a=document.createElement("input");a.setAttribute("id",s);a.setAttribute("type","file");a.setAttribute("accept",l.join(","));if(i.can("summon_file_dialog"))a.setAttribute("tabindex",-1);m.extend(a.style,{fontSize:"999px",opacity:0});o.appendChild(a);e.appendChild(o);m.extend(a.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"});if(v.browser==="IE"&&v.verComp(v.version,10,"<"))m.extend(a.style,{filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"});a.onchange=function(){var e;if(!this.value)return;if(this.files)e=this.files[0];else e={name:this.value};e=new d(i.uid,e);this.onchange=function(){};f.call(t);t.files=[e];a.setAttribute("id",e.uid);o.setAttribute("id",e.uid+"_form");t.trigger("change");a=o=null};if(i.can("summon_file_dialog")){n=h.get(c.browse_button);p.removeEvent(n,"click",t.uid);p.addEvent(n,"click",function(e){if(a&&!a.disabled)a.click();e.preventDefault()},t.uid)}u=s;e=r=n=null}m.extend(this,{init:function(n){var r=this,o=r.getRuntime(),a;c=n;l=g.extList2mimes(n.accept,o.can("filter_by_extension"));a=o.getShimContainer();(function(){var e,t,i;e=h.get(n.browse_button);s=h.getStyle(e,"z-index")||"auto";if(o.can("summon_file_dialog")){if(h.getStyle(e,"position")==="static")e.style.position="relative";r.bind("Refresh",function(){t=parseInt(s,10)||1;h.get(c.browse_button).style.zIndex=t;this.getRuntime().getShimContainer().style.zIndex=t-1})}else e.setAttribute("tabindex",-1);i=o.can("summon_file_dialog")?e:a;p.addEvent(i,"mouseover",function(){r.trigger("mouseenter")},r.uid);p.addEvent(i,"mouseout",function(){r.trigger("mouseleave")},r.uid);p.addEvent(i,"mousedown",function(){r.trigger("mousedown")},r.uid);p.addEvent(h.get(n.container),"mouseup",function(){r.trigger("mouseup")},r.uid);e=null})();f.call(this);a=null;r.trigger({type:"ready",async:true})},setOption:function(e,t){var i=this.getRuntime();var n;if(e=="accept")l=t.mimes||g.extList2mimes(t,i.can("filter_by_extension"));n=h.get(u);if(n)n.setAttribute("accept",l.join(","))},disable:function(e){var t;if(t=h.get(u))t.disabled=!!e},destroy:function(){var e=this.getRuntime(),t=e.getShim(),i=e.getShimContainer(),n=c&&h.get(c.container),r=c&&h.get(c.browse_button);if(n)p.removeAllEvents(n,this.uid);if(r){p.removeAllEvents(r,this.uid);r.style.zIndex=s}if(i){p.removeAllEvents(i,this.uid);i.innerHTML=""}t.removeInstance(this.uid);u=l=c=i=n=r=t=null}})}return e.FileInput=t});e("moxie/runtime/html4/file/FileReader",["moxie/runtime/html4/Runtime","moxie/runtime/html5/file/FileReader"],function(e,t){return e.FileReader=t});e("moxie/runtime/html4/xhr/XMLHttpRequest",["moxie/runtime/html4/Runtime","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Url","moxie/core/Exceptions","moxie/core/utils/Events","moxie/file/Blob","moxie/xhr/FormData"],function(e,m,h,p,g,v,x,w){function t(){var l,c,f;function d(t){var i=this,e,n,r,o,a=false;if(!f)return;e=f.id.replace(/_iframe$/,"");n=h.get(e+"_form");if(n){r=n.getElementsByTagName("input");o=r.length;while(o--)switch(r[o].getAttribute("type")){case"hidden":r[o].parentNode.removeChild(r[o]);break;case"file":a=true;break}r=[];if(!a)n.parentNode.removeChild(n);n=null}setTimeout(function(){v.removeEvent(f,"load",i.uid);if(f.parentNode)f.parentNode.removeChild(f);var e=i.getRuntime().getShimContainer();if(!e.children.length)e.parentNode.removeChild(e);e=f=null;t()},1)}m.extend(this,{send:function(i,e){var n=this,r=n.getRuntime(),o,a,s,u;l=c=null;function t(){var e=r.getShimContainer()||document.body,t=document.createElement("div");t.innerHTML='<iframe id="'+o+'_iframe" name="'+o+'_iframe" src="javascript:""" style="display:none"></iframe>';f=t.firstChild;e.appendChild(f);v.addEvent(f,"load",function(){var e;try{e=f.contentWindow.document||f.contentDocument||window.frames[f.id].document;if(/^4(0[0-9]|1[0-7]|2[2346])\s/.test(e.title))l=e.title.replace(/^(\d+).*$/,"$1");else{l=200;c=m.trim(e.body.innerHTML);n.trigger({type:"progress",loaded:c.length,total:c.length});if(u)n.trigger({type:"uploadprogress",loaded:u.size||1025,total:u.size||1025})}}catch(e){if(p.hasSameOrigin(i.url))l=404;else{d.call(n,function(){n.trigger("error")});return}}d.call(n,function(){n.trigger("load")})},n.uid)}if(e instanceof w&&e.hasBlob()){u=e.getBlob();o=u.uid;s=h.get(o);a=h.get(o+"_form");if(!a)throw new g.DOMException(g.DOMException.NOT_FOUND_ERR)}else{o=m.guid("uid_");a=document.createElement("form");a.setAttribute("id",o+"_form");a.setAttribute("method",i.method);a.setAttribute("enctype","multipart/form-data");a.setAttribute("encoding","multipart/form-data");r.getShimContainer().appendChild(a)}a.setAttribute("target",o+"_iframe");if(e instanceof w)e.each(function(e,t){if(e instanceof x){if(s)s.setAttribute("name",t)}else{var i=document.createElement("input");m.extend(i,{type:"hidden",name:t,value:e});if(s)a.insertBefore(i,s);else a.appendChild(i)}});a.setAttribute("action",i.url);t();a.submit();n.trigger("loadstart")},getStatus:function(){return l},getResponse:function(e){if("json"===e){if(m.typeOf(c)==="string"&&!!window.JSON)try{return JSON.parse(c.replace(/^\s*<pre[^>]*>/,"").replace(/<\/pre>\s*$/,""))}catch(e){return null}}else if("document"===e);return c},abort:function(){var e=this;if(f&&f.contentWindow)if(f.contentWindow.stop)f.contentWindow.stop();else if(f.contentWindow.document.execCommand)f.contentWindow.document.execCommand("Stop");else f.src="about:blank";d.call(this,function(){e.dispatchEvent("abort")})},destroy:function(){this.getRuntime().getShim().removeInstance(this.uid)}})}return e.XMLHttpRequest=t});e("moxie/runtime/html4/image/Image",["moxie/runtime/html4/Runtime","moxie/runtime/html5/image/Image"],function(e,t){return e.Image=t});t(["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Dom","moxie/core/EventTarget","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/file/Blob","moxie/core/I18n","moxie/core/utils/Mime","moxie/file/FileInput","moxie/file/File","moxie/file/FileDrop","moxie/file/FileReader","moxie/core/utils/Url","moxie/runtime/RuntimeTarget","moxie/xhr/FormData","moxie/xhr/XMLHttpRequest","moxie/image/Image","moxie/core/utils/Events","moxie/runtime/html5/image/ResizerCanvas"])})(this)}.apply(e,arguments),e.moxie}"function"==typeof define&&define.amd?define("moxie",[],t):"object"==typeof module&&module.exports?module.exports=t():e.moxie=t()}(this||window); ================================================ FILE: assets/vendors/friendcircle/plupload.js ================================================ !function(e){function t(){var e={};return function(e){(function(e,w,T){var D=window.setTimeout;var x={};var t=w.core.utils;var F=w.runtime.Runtime;function P(e){var t=e.required_features,s={};function i(e,t,i){var r={chunks:"slice_blob",jpgresize:"send_binary_string",pngresize:"send_binary_string",progress:"report_upload_progress",multi_selection:"select_multiple",dragdrop:"drag_and_drop",drop_element:"drag_and_drop",headers:"send_custom_headers",urlstream_upload:"send_binary_string",canSendBinary:"send_binary",triggerDialog:"summon_file_dialog"};if(r[e])s[r[e]]=t;else if(!i)s[e]=t}if(typeof t==="string")U.each(t.split(/\s*,\s*/),function(e){i(e,true)});else if(typeof t==="object")U.each(t,function(e,t){i(t,e)});else if(t===true){if(e.chunk_size&&e.chunk_size>0)s.slice_blob=true;if(!U.isEmptyObj(e.resize)||e.multipart===false)s.send_binary_string=true;if(e.http_method)s.use_http_method=e.http_method;U.each(e,function(e,t){i(t,!!e,true)})}return s}var U={VERSION:"2.3.6",STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-601,FILE_DUPLICATE_ERROR:-602,IMAGE_FORMAT_ERROR:-700,MEMORY_ERROR:-701,IMAGE_DIMENSIONS_ERROR:-702,moxie:w,mimeTypes:t.Mime.mimes,ua:t.Env,typeOf:t.Basic.typeOf,extend:t.Basic.extend,guid:t.Basic.guid,getAll:function e(t){var i=[],r;if(U.typeOf(t)!=="array")t=[t];var s=t.length;while(s--){r=U.get(t[s]);if(r)i.push(r)}return i.length?i:null},get:t.Dom.get,each:t.Basic.each,getPos:t.Dom.getPos,getSize:t.Dom.getSize,xmlEncode:function(e){var t={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},i=/[<>&\"\']/g;return e?(""+e).replace(i,function(e){return t[e]?"&"+t[e]+";":e}):e},toArray:t.Basic.toArray,inArray:t.Basic.inArray,inSeries:t.Basic.inSeries,addI18n:w.core.I18n.addI18n,translate:w.core.I18n.translate,sprintf:t.Basic.sprintf,isEmptyObj:t.Basic.isEmptyObj,hasClass:t.Dom.hasClass,addClass:t.Dom.addClass,removeClass:t.Dom.removeClass,getStyle:t.Dom.getStyle,addEvent:t.Events.addEvent,removeEvent:t.Events.removeEvent,removeAllEvents:t.Events.removeAllEvents,cleanName:function(e){var t,i;i=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"];for(t=0;t<i.length;t+=2)e=e.replace(i[t],i[t+1]);e=e.replace(/\s+/g,"_");e=e.replace(/[^a-z0-9_\-\.]+/gi,"");return e},buildUrl:function(e,t){var i="";U.each(t,function(e,t){i+=(i?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(e)});if(i)e+=(e.indexOf("?")>0?"&":"?")+i;return e},formatSize:function(e){if(e===T||/\D/.test(e))return U.translate("N/A");function t(e,t){return Math.round(e*Math.pow(10,t))/Math.pow(10,t)}var i=Math.pow(1024,4);if(e>i)return t(e/i,1)+" "+U.translate("tb");if(e>(i/=1024))return t(e/i,1)+" "+U.translate("gb");if(e>(i/=1024))return t(e/i,1)+" "+U.translate("mb");if(e>1024)return Math.round(e/1024)+" "+U.translate("kb");return e+" "+U.translate("b")},parseSize:t.Basic.parseSizeStr,predictRuntime:function(e,t){var i,r;i=new U.Uploader(e);r=F.thatCan(i.getOption().required_features,t||e.runtimes);i.destroy();return r},addFileFilter:function(e,t){x[e]=t}};U.addFileFilter("mime_types",function(e,t,i){if(e.length&&!e.regexp.test(t.name)){this.trigger("Error",{code:U.FILE_EXTENSION_ERROR,message:U.translate("File extension error."),file:t});i(false)}else i(true)});U.addFileFilter("max_file_size",function(e,t,i){var r;e=U.parseSize(e);if(t.size!==r&&e&&t.size>e){this.trigger("Error",{code:U.FILE_SIZE_ERROR,message:U.translate("File size error."),file:t});i(false)}else i(true)});U.addFileFilter("prevent_duplicates",function(e,t,i){if(e){var r=this.files.length;while(r--)if(t.name===this.files[r].name&&t.size===this.files[r].size){this.trigger("Error",{code:U.FILE_DUPLICATE_ERROR,message:U.translate("Duplicate file error."),file:t});i(false);return}}i(true)});U.addFileFilter("prevent_empty",function(e,t,i){if(e&&!t.size&&t.size!==T){this.trigger("Error",{code:U.FILE_SIZE_ERROR,message:U.translate("File size error."),file:t});i(false)}else i(true)});U.Uploader=function(e){var t=U.guid(),a,u=[],h={},o=[],l=[],s,n,f=false,m;function i(){var e,t=0,i;if(this.state==U.STARTED){for(i=0;i<u.length;i++)if(!e&&u[i].status==U.QUEUED){e=u[i];if(this.trigger("BeforeUpload",e)){e.status=U.UPLOADING;this.trigger("UploadFile",e)}}else t++;if(t==u.length){if(this.state!==U.STOPPED){this.state=U.STOPPED;this.trigger("StateChanged")}this.trigger("UploadComplete",u)}}}function r(e){e.percent=e.size>0?Math.ceil(e.loaded/e.size*100):100;d()}function d(){var e,t;var i;var r=0;n.reset();for(e=0;e<u.length;e++){t=u[e];if(t.size!==T){n.size+=t.origSize;i=t.loaded*t.origSize/t.size;if(!t.completeTimestamp||t.completeTimestamp>s)r+=i;n.loaded+=i}else n.size=T;if(t.status==U.DONE)n.uploaded++;else if(t.status==U.FAILED)n.failed++;else n.queued++}if(n.size===T)n.percent=u.length>0?Math.ceil(n.uploaded/u.length*100):0;else{n.bytesPerSec=Math.ceil(r/((+new Date-s||1)/1e3));n.percent=n.size>0?Math.ceil(n.loaded/n.size*100):0}}function c(){var e=o[0]||l[0];if(e)return e.getRuntime().uid;return false}function p(){this.bind("FilesAdded FilesRemoved",function(e){e.trigger("QueueChanged");e.refresh()});this.bind("CancelUpload",z);this.bind("BeforeUpload",E);this.bind("UploadFile",b);this.bind("UploadProgress",y);this.bind("StateChanged",R);this.bind("QueueChanged",d);this.bind("Error",S);this.bind("FileUploaded",O);this.bind("Destroy",I)}function g(r,e){var s=this,n=0,t=[];var a={runtime_order:r.runtimes,required_caps:r.required_features,preferred_caps:h,swf_url:r.flash_swf_url,xap_url:r.silverlight_xap_url};U.each(r.runtimes.split(/\s*,\s*/),function(e){if(r[e])a[e]=r[e]});if(r.browse_button)U.each(r.browse_button,function(i){t.push(function(t){var e=new w.file.FileInput(U.extend({},a,{accept:r.filters.mime_types,name:r.file_data_name,multiple:r.multi_selection,container:r.container,browse_button:i}));e.onready=function(){var e=F.getInfo(this.ruid);U.extend(s.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),multi_selection:e.can("select_multiple")});n++;o.push(this);t()};e.onchange=function(){s.addFile(this.files)};e.bind("mouseenter mouseleave mousedown mouseup",function(e){if(!f){if(r.browse_button_hover)if("mouseenter"===e.type)U.addClass(i,r.browse_button_hover);else if("mouseleave"===e.type)U.removeClass(i,r.browse_button_hover);if(r.browse_button_active)if("mousedown"===e.type)U.addClass(i,r.browse_button_active);else if("mouseup"===e.type)U.removeClass(i,r.browse_button_active)}});e.bind("mousedown",function(){s.trigger("Browse")});e.bind("error runtimeerror",function(){e=null;t()});e.init()})});if(r.drop_element)U.each(r.drop_element,function(i){t.push(function(t){var e=new w.file.FileDrop(U.extend({},a,{drop_zone:i}));e.onready=function(){var e=F.getInfo(this.ruid);U.extend(s.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),dragdrop:e.can("drag_and_drop")});n++;l.push(this);t()};e.ondrop=function(){s.addFile(this.files)};e.bind("error runtimeerror",function(){e=null;t()});e.init()})});U.inSeries(t,function(){if(typeof e==="function")e(n)})}function _(t,i,e,r){var s=new w.image.Image;try{s.onload=function(){if(i.width>this.width&&i.height>this.height&&i.quality===T&&i.preserve_headers&&!i.crop){this.destroy();r(t)}else s.downsize(i.width,i.height,i.crop,i.preserve_headers)};s.onresize=function(){var e=this.getAsBlob(t.type,i.quality);this.destroy();r(e)};s.bind("error runtimeerror",function(){this.destroy();r(t)});s.load(t,e)}catch(e){r(t)}}function v(e,t,i){var s=this,n=false;function r(e,t,i){var r=a[e];switch(e){case"max_file_size":if(e==="max_file_size")a.max_file_size=a.filters.max_file_size=t;break;case"chunk_size":if(t=U.parseSize(t)){a[e]=t;a.send_file_name=true}break;case"multipart":a[e]=t;if(!t)a.send_file_name=true;break;case"http_method":a[e]=t.toUpperCase()==="PUT"?"PUT":"POST";break;case"unique_names":a[e]=t;if(t)a.send_file_name=true;break;case"filters":if(U.typeOf(t)==="array")t={mime_types:t};if(i)U.extend(a.filters,t);else a.filters=t;if(t.mime_types){if(U.typeOf(t.mime_types)==="string")t.mime_types=w.core.utils.Mime.mimes2extList(t.mime_types);t.mime_types.regexp=function(e){var t=[];U.each(e,function(e){U.each(e.extensions.split(/,/),function(e){if(/^\s*\*\s*$/.test(e))t.push("\\.*");else t.push("\\."+e.replace(new RegExp("["+"/^$.*+?|()[]{}\\".replace(/./g,"\\$&")+"]","g"),"\\$&"))})});return new RegExp("("+t.join("|")+")$","i")}(t.mime_types);a.filters.mime_types=t.mime_types}break;case"resize":if(t)a.resize=U.extend({preserve_headers:true,crop:false},t);else a.resize=false;break;case"prevent_duplicates":a.prevent_duplicates=a.filters.prevent_duplicates=!!t;break;case"container":case"browse_button":case"drop_element":t="container"===e?U.get(t):U.getAll(t);case"runtimes":case"multi_selection":case"flash_swf_url":case"silverlight_xap_url":a[e]=t;if(!i)n=true;break;default:a[e]=t}if(!i)s.trigger("OptionChanged",e,t,r)}if(typeof e==="object")U.each(e,function(e,t){r(t,e,i)});else r(e,t,i);if(i){a.required_features=P(U.extend({},a));h=P(U.extend({},a,{required_features:true}))}else if(n){s.trigger("Destroy");g.call(s,a,function(e){if(e){s.runtime=F.getInfo(c()).type;s.trigger("Init",{runtime:s.runtime});s.trigger("PostInit")}else s.trigger("Error",{code:U.INIT_ERROR,message:U.translate("Init error.")})})}}function E(e,t){if(e.settings.unique_names){var i=t.name.match(/\.([^.]+)$/),r="part";if(i)r=i[1];t.target_name=t.id+"."+r}}function b(s,n){var a=s.settings.url;var r=s.settings.chunk_size;var o=s.settings.max_retries;var l=s.features;var u=0;var f;var d={runtime_order:s.settings.runtimes,required_caps:s.settings.required_features,preferred_caps:h,swf_url:s.settings.flash_swf_url,xap_url:s.settings.silverlight_xap_url};if(n.loaded)u=n.loaded=r?r*Math.floor(n.loaded/r):0;function c(){if(o-- >0)D(p,1e3);else{n.loaded=u;s.trigger("Error",{code:U.HTTP_ERROR,message:U.translate("HTTP Error."),file:n,response:m.responseText,status:m.status,responseHeaders:m.getAllResponseHeaders()})}}function p(){var e,t={},i;if(n.status!==U.UPLOADING||s.state===U.STOPPED)return;if(s.settings.send_file_name)t.name=n.target_name||n.name;if(r&&l.chunks&&f.size>r){i=Math.min(r,f.size-u);e=f.slice(u,u+i)}else{i=f.size;e=f}if(r&&l.chunks)if(s.settings.send_chunk_number){t.chunk=Math.ceil(u/r);t.chunks=Math.ceil(f.size/r)}else{t.offset=u;t.total=f.size}if(s.trigger("BeforeChunkUpload",n,t,e,u))g(t,e,i)}function g(e,t,i){var r;m=new w.xhr.XMLHttpRequest;if(m.upload)m.upload.onprogress=function(e){n.loaded=Math.min(n.size,u+e.loaded);s.trigger("UploadProgress",n)};m.onload=function(){if(m.status<200||m.status>=400){c();return}o=s.settings.max_retries;if(i<f.size){t.destroy();u+=i;n.loaded=Math.min(u,f.size);s.trigger("ChunkUploaded",n,{offset:n.loaded,total:f.size,response:m.responseText,status:m.status,responseHeaders:m.getAllResponseHeaders()});if(U.ua.browser==="Android Browser")s.trigger("UploadProgress",n)}else n.loaded=n.size;t=r=null;if(!u||u>=f.size){if(n.size!=n.origSize){f.destroy();f=null}s.trigger("UploadProgress",n);n.status=U.DONE;n.completeTimestamp=+new Date;s.trigger("FileUploaded",n,{response:m.responseText,status:m.status,responseHeaders:m.getAllResponseHeaders()})}else D(p,1)};m.onerror=function(){c()};m.onloadend=function(){this.destroy()};if(s.settings.multipart&&l.multipart){m.open(s.settings.http_method,a,true);U.each(s.settings.headers,function(e,t){m.setRequestHeader(t,e)});r=new w.xhr.FormData;U.each(U.extend(e,s.settings.multipart_params),function(e,t){r.append(t,e)});r.append(s.settings.file_data_name,t);m.send(r,d)}else{a=U.buildUrl(s.settings.url,U.extend(e,s.settings.multipart_params));m.open(s.settings.http_method,a,true);U.each(s.settings.headers,function(e,t){m.setRequestHeader(t,e)});if(!m.hasRequestHeader("Content-Type"))m.setRequestHeader("Content-Type","application/octet-stream");m.send(t,d)}}f=n.getSource();if(!U.isEmptyObj(s.settings.resize)&&U.inArray(f.type,["image/jpeg","image/png"])!==-1)_(f,s.settings.resize,d,function(e){f=e;n.size=e.size;p()});else p()}function y(e,t){r(t)}function R(e){if(e.state==U.STARTED)s=+new Date;else if(e.state==U.STOPPED)for(var t=e.files.length-1;t>=0;t--)if(e.files[t].status==U.UPLOADING){e.files[t].status=U.QUEUED;d()}}function z(){if(m)m.abort()}function O(e){d();D(function(){i.call(e)},1)}function S(e,t){if(t.code===U.INIT_ERROR)e.destroy();else if(t.code===U.HTTP_ERROR){t.file.status=U.FAILED;t.file.completeTimestamp=+new Date;r(t.file);if(e.state==U.STARTED){e.trigger("CancelUpload");D(function(){i.call(e)},1)}}}function I(e){e.stop();U.each(u,function(e){e.destroy()});u=[];if(o.length){U.each(o,function(e){e.destroy()});o=[]}if(l.length){U.each(l,function(e){e.destroy()});l=[]}h={};f=false;s=m=null;n.reset()}a={chunk_size:0,file_data_name:"file",filters:{mime_types:[],max_file_size:0,prevent_duplicates:false,prevent_empty:true},flash_swf_url:"js/Moxie.swf",http_method:"POST",max_retries:0,multipart:true,multi_selection:true,resize:false,runtimes:F.order,send_file_name:true,send_chunk_number:true,silverlight_xap_url:"js/Moxie.xap"};v.call(this,e,null,true);n=new U.QueueProgress;U.extend(this,{id:t,uid:t,state:U.STOPPED,features:{},runtime:null,files:u,settings:a,total:n,init:function(){var i=this,e,t,r;t=i.getOption("preinit");if(typeof t=="function")t(i);else U.each(t,function(e,t){i.bind(t,e)});p.call(i);U.each(["container","browse_button","drop_element"],function(e){if(i.getOption(e)===null){r={code:U.INIT_ERROR,message:U.sprintf(U.translate("%s specified, but cannot be found."),e)};return false}});if(r)return i.trigger("Error",r);if(!a.browse_button&&!a.drop_element)return i.trigger("Error",{code:U.INIT_ERROR,message:U.translate("You must specify either browse_button or drop_element.")});g.call(i,a,function(e){var t=i.getOption("init");if(typeof t=="function")t(i);else U.each(t,function(e,t){i.bind(t,e)});if(e){i.runtime=F.getInfo(c()).type;i.trigger("Init",{runtime:i.runtime});i.trigger("PostInit")}else i.trigger("Error",{code:U.INIT_ERROR,message:U.translate("Init error.")})})},setOption:function(e,t){v.call(this,e,t,!this.runtime)},getOption:function(e){if(!e)return a;return a[e]},refresh:function(){if(o.length)U.each(o,function(e){e.trigger("Refresh")});this.trigger("Refresh")},start:function(){if(this.state!=U.STARTED){this.state=U.STARTED;this.trigger("StateChanged");i.call(this)}},stop:function(){if(this.state!=U.STOPPED){this.state=U.STOPPED;this.trigger("StateChanged");this.trigger("CancelUpload")}},disableBrowse:function(){f=arguments[0]!==T?arguments[0]:true;if(o.length)U.each(o,function(e){e.disable(f)});this.trigger("DisableBrowse",f)},getFile:function(e){var t;for(t=u.length-1;t>=0;t--)if(u[t].id===e)return u[t]},addFile:function(e,t){var s=this,r=[],n=[],a;function o(r,e){var t=[];U.each(s.settings.filters,function(e,i){if(x[i])t.push(function(t){x[i].call(s,e,r,function(e){t(!e)})})});U.inSeries(t,e)}function l(i){var e=U.typeOf(i);if(i instanceof w.file.File){if(!i.ruid&&!i.isDetached()){if(!a)return false;i.ruid=a;i.connectRuntime(a)}l(new U.File(i))}else if(i instanceof w.file.Blob){l(i.getSource());i.destroy()}else if(i instanceof U.File){if(t)i.name=t;r.push(function(t){o(i,function(e){if(!e){u.push(i);n.push(i);s.trigger("FileFiltered",i)}D(t,1)})})}else if(U.inArray(e,["file","blob"])!==-1)l(new w.file.File(null,i));else if(e==="node"&&U.typeOf(i.files)==="filelist")U.each(i.files,l);else if(e==="array"){t=null;U.each(i,l)}}a=c();l(e);if(r.length)U.inSeries(r,function(){if(n.length)s.trigger("FilesAdded",n)})},removeFile:function(e){var t=typeof e==="string"?e:e.id;for(var i=u.length-1;i>=0;i--)if(u[i].id===t)return this.splice(i,1)[0]},splice:function(e,t){var i=u.splice(e===T?0:e,t===T?u.length:t);var r=false;if(this.state==U.STARTED){U.each(i,function(e){if(e.status===U.UPLOADING){r=true;return false}});if(r)this.stop()}this.trigger("FilesRemoved",i);U.each(i,function(e){e.destroy()});if(r)this.start();return i},dispatchEvent:function(e){var t,i,r;e=e.toLowerCase();t=this.hasEventListener(e);if(t){t.sort(function(e,t){return t.priority-e.priority});i=[].slice.call(arguments);i.shift();i.unshift(this);for(var s=0;s<t.length;s++)if(t[s].fn.apply(t[s].scope,i)===false)return false}return true},bind:function(e,t,i,r){U.Uploader.prototype.bind.call(this,e,t,r,i)},destroy:function(){this.trigger("Destroy");a=n=null;this.unbindAll()}})};U.Uploader.prototype=w.core.EventTarget.instance;U.File=function(){var t={};function e(e){U.extend(this,{id:U.guid(),name:e.name||e.fileName,type:e.type||"",relativePath:e.relativePath||"",size:e.fileSize||e.size,origSize:e.fileSize||e.size,loaded:0,percent:0,status:U.QUEUED,lastModifiedDate:e.lastModifiedDate||(new Date).toLocaleString(),completeTimestamp:0,getNative:function(){var e=this.getSource().getSource();return U.inArray(U.typeOf(e),["blob","file"])!==-1?e:null},getSource:function(){if(!t[this.id])return null;return t[this.id]},destroy:function(){var e=this.getSource();if(e){e.destroy();delete t[this.id]}}});t[this.id]=e}return e}();U.QueueProgress=function(){var e=this;e.size=0;e.loaded=0;e.uploaded=0;e.failed=0;e.queued=0;e.percent=0;e.bytesPerSec=0;e.reset=function(){e.size=e.loaded=e.uploaded=e.failed=e.queued=e.percent=e.bytesPerSec=0}};e.plupload=U})(this,e)}.apply(e,arguments),e.plupload}"function"==typeof define&&define.amd?define("plupload",["./moxie"],t):"object"==typeof module&&module.exports?module.exports=t(require("./moxie")):e.plupload=t(e.moxie)}(this||window); ================================================ FILE: assets/vendors/layer/theme/default/layer.css ================================================ .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:50px;line-height:50px;border-bottom:1px solid #F0F0F0;font-size:14px;color:#333;overflow:hidden;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:17px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:300px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:300px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgnext,.layui-layer-imgprev{position:fixed;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:30px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:30px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:40px;line-height:40px;background-color:#000\9;filter:Alpha(opacity=60);background-color:rgba(2,0,0,.35);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} ================================================ FILE: assets/vendors/layer/theme/moon/style.css ================================================ html #layui_layer_skinmoonstylecss{display:none;position:absolute;width:1989px}body .layer-ext-moon[type=dialog]{min-width:320px}body .layer-ext-moon-msg[type=dialog]{min-width:200px}body .layer-ext-moon .layui-layer-title{background:#f6f6f6;color:#212a31;font-size:16px;font-weight:700;height:46px;line-height:46px;border-bottom:1px solid #D5D5D5}body .layer-ext-moon .layui-layer-content .layui-layer-ico{height:32px;width:32px;top:18.5px}body .layer-ext-moon .layui-layer-ico0{background:url(default.png) -96px 0 no-repeat}body .layer-ext-moon .layui-layer-ico1{background:url(default.png) -224px 0 no-repeat}body .layer-ext-moon .layui-layer-ico2{background:url(default.png) -192px 0 no-repeat}body .layer-ext-moon .layui-layer-ico3{background:url(default.png) -160px 0 no-repeat}body .layer-ext-moon .layui-layer-ico4{background:url(default.png) -320px 0 no-repeat}body .layer-ext-moon .layui-layer-ico5{background:url(default.png) -288px 0 no-repeat}body .layer-ext-moon .layui-layer-ico6{background:url(default.png) -256px 0}body .layer-ext-moon .layui-layer-ico7{background:url(default.png) -128px 0 no-repeat}body .layer-ext-moon .layui-layer-setwin{top:15px;right:15px}body .layer-ext-moon .layui-layer-setwin a{width:16px;height:16px}body .layer-ext-moon .layui-layer-setwin .layui-layer-min cite:hover{background-color:#56abe4}body .layer-ext-moon .layui-layer-setwin .layui-layer-max{background:url(default.png) -80px 0 no-repeat}body .layer-ext-moon .layui-layer-setwin .layui-layer-max:hover{background:url(default.png) -64px 0 no-repeat}body .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin{background:url(default.png) -32px 0 no-repeat}body .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin:hover{background:url(default.png) -16px 0 no-repeat}body .layer-ext-moon .layui-layer-setwin .layui-layer-close1,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2{background:url(default.png)}body .layer-ext-moon .layui-layer-setwin .layui-layer-close1:hover,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2:hover{background:url(default.png) -48px 0}body .layer-ext-moon .layui-layer-padding{padding-top:24px}body .layer-ext-moon .layui-layer-btn{text-align:center;padding-top:15px;padding-bottom:15px;background:#f0f4f7;border-top:1px #c7c7c7 solid}body .layer-ext-moon .layui-layer-btn a{font-size:12px;font-weight:400;margin:0 7px;padding:6px 20px;color:#fff;border:1px solid #0064b6;background:no-repeat #0071ce;border-radius:3px;display:inline-block;height:20px;line-height:20px;text-align:center;vertical-align:middle;text-decoration:none;outline:0}body .layer-ext-moon .layui-layer-btn .layui-layer-btn0{background:#0071ce}body .layer-ext-moon .layui-layer-btn .layui-layer-btn1{background:#fff;color:#404a58;border:1px solid #c0c4cd;border-radius:3px}body .layer-ext-moon .layui-layer-btn .layui-layer-btn2{background:#f60;color:#fff;border:1px solid #f60;border-radius:3px}body .layer-ext-moon .layui-layer-btn .layui-layer-btn3{background:red;color:#fff;border:1px solid red;border-radius:3px}body .layer-ext-moon .layui-layer-title span.layui-layer-tabnow{height:47px} ================================================ FILE: assets/vendors/mathjax-v3/output/chtml/fonts/tex.js ================================================ !function(){"use strict";var c={8667:function(c,f){f.q=void 0,f.q="3.2.2"},2308:function(c,f,i){var t,e=this&&this.__extends||(t=function(c,f){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(c,f){c.__proto__=f}||function(c,f){for(var i in f)Object.prototype.hasOwnProperty.call(f,i)&&(c[i]=f[i])},t(c,f)},function(c,f){if("function"!=typeof f&&null!==f)throw new TypeError("Class extends value "+String(f)+" is not a constructor or null");function i(){this.constructor=c}t(c,f),c.prototype=null===f?Object.create(f):(i.prototype=f.prototype,new i)}),s=this&&this.__assign||function(){return s=Object.assign||function(c){for(var f,i=1,t=arguments.length;i<t;i++)for(var e in f=arguments[i])Object.prototype.hasOwnProperty.call(f,e)&&(c[e]=f[e]);return c},s.apply(this,arguments)};Object.defineProperty(f,"__esModule",{value:!0}),f.TeXFont=void 0;var r=i(73),o=i(2176),a=i(7841),S=i(5031),l=i(6051),n=i(9236),B=i(1937),d=i(4244),u=i(482),k=i(196),I=i(527),A=i(3518),p=i(965),m=i(9169),h=i(6736),M=i(2290),x=i(3012),H=i(8787),_=i(5392),E=i(6318),y=i(5351),R=i(873),v=i(7611),D=i(6590),b=i(8798),T=i(2138),X=i(7481),O=function(c){function f(){return null!==c&&c.apply(this,arguments)||this}return e(f,c),f.defaultCssFamilyPrefix="MJXZERO",f.defaultVariantClasses={normal:"mjx-n",bold:"mjx-b",italic:"mjx-i","bold-italic":"mjx-b mjx-i","double-struck":"mjx-ds mjx-b",fraktur:"mjx-fr","bold-fraktur":"mjx-fr mjx-b",script:"mjx-sc mjx-i","bold-script":"mjx-sc mjx-b mjx-i","sans-serif":"mjx-ss","bold-sans-serif":"mjx-ss mjx-b","sans-serif-italic":"mjx-ss mjx-i","sans-serif-bold-italic":"mjx-ss mjx-b mjx-i",monospace:"mjx-ty","-smallop":"mjx-sop","-largeop":"mjx-lop","-size3":"mjx-s3","-size4":"mjx-s4","-tex-calligraphic":"mjx-cal mjx-i","-tex-bold-calligraphic":"mjx-cal mjx-b","-tex-mathit":"mjx-mit mjx-i","-tex-oldstyle":"mjx-os","-tex-bold-oldstyle":"mjx-os mjx-b","-tex-variant":"mjx-var"},f.defaultVariantLetters={normal:"",bold:"B",italic:"MI","bold-italic":"BI","double-struck":"A",fraktur:"FR","bold-fraktur":"FRB",script:"SC","bold-script":"SCB","sans-serif":"SS","bold-sans-serif":"SSB","sans-serif-italic":"SSI","sans-serif-bold-italic":"SSBI",monospace:"T","-smallop":"S1","-largeop":"S2","-size3":"S3","-size4":"S4","-tex-calligraphic":"C","-tex-bold-calligraphic":"CB","-tex-mathit":"MI","-tex-oldstyle":"C","-tex-bold-oldstyle":"CB","-tex-variant":"A"},f.defaultDelimiters=X.delimiters,f.defaultChars={normal:I.normal,bold:S.bold,italic:d.italic,"bold-italic":a.boldItalic,"double-struck":l.doubleStruck,fraktur:B.fraktur,"bold-fraktur":n.frakturBold,script:x.script,"bold-script":M.scriptBold,"sans-serif":h.sansSerif,"bold-sans-serif":p.sansSerifBold,"sans-serif-italic":m.sansSerifItalic,"sans-serif-bold-italic":A.sansSerifBoldItalic,monospace:k.monospace,"-smallop":H.smallop,"-largeop":u.largeop,"-size3":D.texSize3,"-size4":b.texSize4,"-tex-calligraphic":E.texCalligraphic,"-tex-bold-calligraphic":_.texCalligraphicBold,"-tex-mathit":y.texMathit,"-tex-oldstyle":v.texOldstyle,"-tex-bold-oldstyle":R.texOldstyleBold,"-tex-variant":T.texVariant},f.defaultStyles=s(s({},r.CHTMLFontData.defaultStyles),{".MJX-TEX":{"font-family":"MJXZERO, MJXTEX"},".TEX-B":{"font-family":"MJXZERO, MJXTEX-B"},".TEX-I":{"font-family":"MJXZERO, MJXTEX-I"},".TEX-MI":{"font-family":"MJXZERO, MJXTEX-MI"},".TEX-BI":{"font-family":"MJXZERO, MJXTEX-BI"},".TEX-S1":{"font-family":"MJXZERO, MJXTEX-S1"},".TEX-S2":{"font-family":"MJXZERO, MJXTEX-S2"},".TEX-S3":{"font-family":"MJXZERO, MJXTEX-S3"},".TEX-S4":{"font-family":"MJXZERO, MJXTEX-S4"},".TEX-A":{"font-family":"MJXZERO, MJXTEX-A"},".TEX-C":{"font-family":"MJXZERO, MJXTEX-C"},".TEX-CB":{"font-family":"MJXZERO, MJXTEX-CB"},".TEX-FR":{"font-family":"MJXZERO, MJXTEX-FR"},".TEX-FRB":{"font-family":"MJXZERO, MJXTEX-FRB"},".TEX-SS":{"font-family":"MJXZERO, MJXTEX-SS"},".TEX-SSB":{"font-family":"MJXZERO, MJXTEX-SSB"},".TEX-SSI":{"font-family":"MJXZERO, MJXTEX-SSI"},".TEX-SC":{"font-family":"MJXZERO, MJXTEX-SC"},".TEX-T":{"font-family":"MJXZERO, MJXTEX-T"},".TEX-V":{"font-family":"MJXZERO, MJXTEX-V"},".TEX-VB":{"font-family":"MJXZERO, MJXTEX-VB"},"mjx-stretchy-v mjx-c, mjx-stretchy-h mjx-c":{"font-family":"MJXZERO, MJXTEX-S1, MJXTEX-S4, MJXTEX, MJXTEX-A ! important"}}),f.defaultFonts=s(s({},r.CHTMLFontData.defaultFonts),{"@font-face /* 1 */":{"font-family":"MJXTEX",src:'url("%%URL%%/MathJax_Main-Regular.woff") format("woff")'},"@font-face /* 2 */":{"font-family":"MJXTEX-B",src:'url("%%URL%%/MathJax_Main-Bold.woff") format("woff")'},"@font-face /* 3 */":{"font-family":"MJXTEX-I",src:'url("%%URL%%/MathJax_Math-Italic.woff") format("woff")'},"@font-face /* 4 */":{"font-family":"MJXTEX-MI",src:'url("%%URL%%/MathJax_Main-Italic.woff") format("woff")'},"@font-face /* 5 */":{"font-family":"MJXTEX-BI",src:'url("%%URL%%/MathJax_Math-BoldItalic.woff") format("woff")'},"@font-face /* 6 */":{"font-family":"MJXTEX-S1",src:'url("%%URL%%/MathJax_Size1-Regular.woff") format("woff")'},"@font-face /* 7 */":{"font-family":"MJXTEX-S2",src:'url("%%URL%%/MathJax_Size2-Regular.woff") format("woff")'},"@font-face /* 8 */":{"font-family":"MJXTEX-S3",src:'url("%%URL%%/MathJax_Size3-Regular.woff") format("woff")'},"@font-face /* 9 */":{"font-family":"MJXTEX-S4",src:'url("%%URL%%/MathJax_Size4-Regular.woff") format("woff")'},"@font-face /* 10 */":{"font-family":"MJXTEX-A",src:'url("%%URL%%/MathJax_AMS-Regular.woff") format("woff")'},"@font-face /* 11 */":{"font-family":"MJXTEX-C",src:'url("%%URL%%/MathJax_Calligraphic-Regular.woff") format("woff")'},"@font-face /* 12 */":{"font-family":"MJXTEX-CB",src:'url("%%URL%%/MathJax_Calligraphic-Bold.woff") format("woff")'},"@font-face /* 13 */":{"font-family":"MJXTEX-FR",src:'url("%%URL%%/MathJax_Fraktur-Regular.woff") format("woff")'},"@font-face /* 14 */":{"font-family":"MJXTEX-FRB",src:'url("%%URL%%/MathJax_Fraktur-Bold.woff") format("woff")'},"@font-face /* 15 */":{"font-family":"MJXTEX-SS",src:'url("%%URL%%/MathJax_SansSerif-Regular.woff") format("woff")'},"@font-face /* 16 */":{"font-family":"MJXTEX-SSB",src:'url("%%URL%%/MathJax_SansSerif-Bold.woff") format("woff")'},"@font-face /* 17 */":{"font-family":"MJXTEX-SSI",src:'url("%%URL%%/MathJax_SansSerif-Italic.woff") format("woff")'},"@font-face /* 18 */":{"font-family":"MJXTEX-SC",src:'url("%%URL%%/MathJax_Script-Regular.woff") format("woff")'},"@font-face /* 19 */":{"font-family":"MJXTEX-T",src:'url("%%URL%%/MathJax_Typewriter-Regular.woff") format("woff")'},"@font-face /* 20 */":{"font-family":"MJXTEX-V",src:'url("%%URL%%/MathJax_Vector-Regular.woff") format("woff")'},"@font-face /* 21 */":{"font-family":"MJXTEX-VB",src:'url("%%URL%%/MathJax_Vector-Bold.woff") format("woff")'}}),f}((0,o.CommonTeXFontMixin)(r.CHTMLFontData));f.TeXFont=O},7841:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.boldItalic=void 0;var t=i(73),e=i(3869);f.boldItalic=(0,t.AddCSS)(e.boldItalic,{305:{f:"B"},567:{f:"B"},8260:{c:"/"},8710:{c:"\\394"},10744:{c:"/"}})},5031:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.bold=void 0;var t=i(73),e=i(7557);f.bold=(0,t.AddCSS)(e.bold,{183:{c:"\\22C5"},305:{f:""},567:{f:""},697:{c:"\\2032"},8194:{c:""},8195:{c:""},8196:{c:""},8197:{c:""},8198:{c:""},8201:{c:""},8202:{c:""},8213:{c:"\\2014"},8214:{c:"\\2225"},8215:{c:"_"},8226:{c:"\\2219"},8243:{c:"\\2032\\2032"},8244:{c:"\\2032\\2032\\2032"},8254:{c:"\\2C9"},8260:{c:"/"},8279:{c:"\\2032\\2032\\2032\\2032"},8407:{c:"\\2192",f:"VB"},8602:{c:"\\2190\\338"},8603:{c:"\\2192\\338"},8622:{c:"\\2194\\338"},8653:{c:"\\21D0\\338"},8654:{c:"\\21D4\\338"},8655:{c:"\\21D2\\338"},8708:{c:"\\2203\\338"},8710:{c:"\\394"},8716:{c:"\\220B\\338"},8740:{c:"\\2223\\338"},8742:{c:"\\2225\\338"},8769:{c:"\\223C\\338"},8772:{c:"\\2243\\338"},8775:{c:"\\2245\\338"},8777:{c:"\\2248\\338"},8802:{c:"\\2261\\338"},8813:{c:"\\224D\\338"},8814:{c:"<\\338"},8815:{c:">\\338"},8816:{c:"\\2264\\338"},8817:{c:"\\2265\\338"},8832:{c:"\\227A\\338"},8833:{c:"\\227B\\338"},8836:{c:"\\2282\\338"},8837:{c:"\\2283\\338"},8840:{c:"\\2286\\338"},8841:{c:"\\2287\\338"},8876:{c:"\\22A2\\338"},8877:{c:"\\22A8\\338"},8930:{c:"\\2291\\338"},8931:{c:"\\2292\\338"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},9653:{c:"\\25B3"},9663:{c:"\\25BD"},10072:{c:"\\2223"},10744:{c:"/",f:"BI"},10799:{c:"\\D7"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},6051:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.doubleStruck=void 0;var t=i(5674);Object.defineProperty(f,"doubleStruck",{enumerable:!0,get:function(){return t.doubleStruck}})},9236:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.frakturBold=void 0;var t=i(73),e=i(7002);f.frakturBold=(0,t.AddCSS)(e.frakturBold,{8260:{c:"/"}})},1937:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.fraktur=void 0;var t=i(73),e=i(9349);f.fraktur=(0,t.AddCSS)(e.fraktur,{8260:{c:"/"}})},4244:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.italic=void 0;var t=i(73),e=i(9741);f.italic=(0,t.AddCSS)(e.italic,{47:{f:"I"},989:{c:"\\E008",f:"A"},8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/",f:"I"},8710:{c:"\\394",f:"I"},10744:{c:"/",f:"I"}})},482:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.largeop=void 0;var t=i(73),e=i(2827);f.largeop=(0,t.AddCSS)(e.largeop,{8214:{f:"S1"},8260:{c:"/"},8593:{f:"S1"},8595:{f:"S1"},8657:{f:"S1"},8659:{f:"S1"},8739:{f:"S1"},8741:{f:"S1"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},9168:{f:"S1"},10072:{c:"\\2223",f:"S1"},10764:{c:"\\222C\\222C"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},196:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.monospace=void 0;var t=i(73),e=i(2970);f.monospace=(0,t.AddCSS)(e.monospace,{697:{c:"\\2032"},913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8215:{c:"_"},8243:{c:"\\2032\\2032"},8244:{c:"\\2032\\2032\\2032"},8260:{c:"/"},8279:{c:"\\2032\\2032\\2032\\2032"},8710:{c:"\\394"}})},527:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.normal=void 0;var t=i(73),e=i(1668);f.normal=(0,t.AddCSS)(e.normal,{163:{f:"MI"},165:{f:"A"},174:{f:"A"},183:{c:"\\22C5"},240:{f:"A"},697:{c:"\\2032"},913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8192:{c:""},8193:{c:""},8194:{c:""},8195:{c:""},8196:{c:""},8197:{c:""},8198:{c:""},8201:{c:""},8202:{c:""},8203:{c:""},8204:{c:""},8213:{c:"\\2014"},8214:{c:"\\2225"},8215:{c:"_"},8226:{c:"\\2219"},8243:{c:"\\2032\\2032"},8244:{c:"\\2032\\2032\\2032"},8245:{f:"A"},8246:{c:"\\2035\\2035",f:"A"},8247:{c:"\\2035\\2035\\2035",f:"A"},8254:{c:"\\2C9"},8260:{c:"/"},8279:{c:"\\2032\\2032\\2032\\2032"},8288:{c:""},8289:{c:""},8290:{c:""},8291:{c:""},8292:{c:""},8407:{c:"\\2192",f:"V"},8450:{c:"C",f:"A"},8459:{c:"H",f:"SC"},8460:{c:"H",f:"FR"},8461:{c:"H",f:"A"},8462:{c:"h",f:"I"},8463:{f:"A"},8464:{c:"I",f:"SC"},8465:{c:"I",f:"FR"},8466:{c:"L",f:"SC"},8469:{c:"N",f:"A"},8473:{c:"P",f:"A"},8474:{c:"Q",f:"A"},8475:{c:"R",f:"SC"},8476:{c:"R",f:"FR"},8477:{c:"R",f:"A"},8484:{c:"Z",f:"A"},8486:{c:"\\3A9"},8487:{f:"A"},8488:{c:"Z",f:"FR"},8492:{c:"B",f:"SC"},8493:{c:"C",f:"FR"},8496:{c:"E",f:"SC"},8497:{c:"F",f:"SC"},8498:{f:"A"},8499:{c:"M",f:"SC"},8502:{f:"A"},8503:{f:"A"},8504:{f:"A"},8513:{f:"A"},8602:{f:"A"},8603:{f:"A"},8606:{f:"A"},8608:{f:"A"},8610:{f:"A"},8611:{f:"A"},8619:{f:"A"},8620:{f:"A"},8621:{f:"A"},8622:{f:"A"},8624:{f:"A"},8625:{f:"A"},8630:{f:"A"},8631:{f:"A"},8634:{f:"A"},8635:{f:"A"},8638:{f:"A"},8639:{f:"A"},8642:{f:"A"},8643:{f:"A"},8644:{f:"A"},8646:{f:"A"},8647:{f:"A"},8648:{f:"A"},8649:{f:"A"},8650:{f:"A"},8651:{f:"A"},8653:{f:"A"},8654:{f:"A"},8655:{f:"A"},8666:{f:"A"},8667:{f:"A"},8669:{f:"A"},8672:{f:"A"},8674:{f:"A"},8705:{f:"A"},8708:{c:"\\2203\\338"},8710:{c:"\\394"},8716:{c:"\\220B\\338"},8717:{f:"A"},8719:{f:"S1"},8720:{f:"S1"},8721:{f:"S1"},8724:{f:"A"},8737:{f:"A"},8738:{f:"A"},8740:{f:"A"},8742:{f:"A"},8748:{f:"S1"},8749:{f:"S1"},8750:{f:"S1"},8756:{f:"A"},8757:{f:"A"},8765:{f:"A"},8769:{f:"A"},8770:{f:"A"},8772:{c:"\\2243\\338"},8775:{c:"\\2246",f:"A"},8777:{c:"\\2248\\338"},8778:{f:"A"},8782:{f:"A"},8783:{f:"A"},8785:{f:"A"},8786:{f:"A"},8787:{f:"A"},8790:{f:"A"},8791:{f:"A"},8796:{f:"A"},8802:{c:"\\2261\\338"},8806:{f:"A"},8807:{f:"A"},8808:{f:"A"},8809:{f:"A"},8812:{f:"A"},8813:{c:"\\224D\\338"},8814:{f:"A"},8815:{f:"A"},8816:{f:"A"},8817:{f:"A"},8818:{f:"A"},8819:{f:"A"},8820:{c:"\\2272\\338"},8821:{c:"\\2273\\338"},8822:{f:"A"},8823:{f:"A"},8824:{c:"\\2276\\338"},8825:{c:"\\2277\\338"},8828:{f:"A"},8829:{f:"A"},8830:{f:"A"},8831:{f:"A"},8832:{f:"A"},8833:{f:"A"},8836:{c:"\\2282\\338"},8837:{c:"\\2283\\338"},8840:{f:"A"},8841:{f:"A"},8842:{f:"A"},8843:{f:"A"},8847:{f:"A"},8848:{f:"A"},8858:{f:"A"},8859:{f:"A"},8861:{f:"A"},8862:{f:"A"},8863:{f:"A"},8864:{f:"A"},8865:{f:"A"},8873:{f:"A"},8874:{f:"A"},8876:{f:"A"},8877:{f:"A"},8878:{f:"A"},8879:{f:"A"},8882:{f:"A"},8883:{f:"A"},8884:{f:"A"},8885:{f:"A"},8888:{f:"A"},8890:{f:"A"},8891:{f:"A"},8892:{f:"A"},8896:{f:"S1"},8897:{f:"S1"},8898:{f:"S1"},8899:{f:"S1"},8903:{f:"A"},8905:{f:"A"},8906:{f:"A"},8907:{f:"A"},8908:{f:"A"},8909:{f:"A"},8910:{f:"A"},8911:{f:"A"},8912:{f:"A"},8913:{f:"A"},8914:{f:"A"},8915:{f:"A"},8916:{f:"A"},8918:{f:"A"},8919:{f:"A"},8920:{f:"A"},8921:{f:"A"},8922:{f:"A"},8923:{f:"A"},8926:{f:"A"},8927:{f:"A"},8928:{f:"A"},8929:{f:"A"},8930:{c:"\\2291\\338"},8931:{c:"\\2292\\338"},8934:{f:"A"},8935:{f:"A"},8936:{f:"A"},8937:{f:"A"},8938:{f:"A"},8939:{f:"A"},8940:{f:"A"},8941:{f:"A"},8965:{c:"\\22BC",f:"A"},8966:{c:"\\2A5E",f:"A"},8988:{c:"\\250C",f:"A"},8989:{c:"\\2510",f:"A"},8990:{c:"\\2514",f:"A"},8991:{c:"\\2518",f:"A"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},9168:{f:"S1"},9416:{f:"A"},9484:{f:"A"},9488:{f:"A"},9492:{f:"A"},9496:{f:"A"},9585:{f:"A"},9586:{f:"A"},9632:{f:"A"},9633:{f:"A"},9642:{c:"\\25A0",f:"A"},9650:{f:"A"},9652:{c:"\\25B2",f:"A"},9653:{c:"\\25B3"},9654:{f:"A"},9656:{c:"\\25B6",f:"A"},9660:{f:"A"},9662:{c:"\\25BC",f:"A"},9663:{c:"\\25BD"},9664:{f:"A"},9666:{c:"\\25C0",f:"A"},9674:{f:"A"},9723:{c:"\\25A1",f:"A"},9724:{c:"\\25A0",f:"A"},9733:{f:"A"},10003:{f:"A"},10016:{f:"A"},10072:{c:"\\2223"},10731:{f:"A"},10744:{c:"/",f:"I"},10752:{f:"S1"},10753:{f:"S1"},10754:{f:"S1"},10756:{f:"S1"},10758:{f:"S1"},10764:{c:"\\222C\\222C",f:"S1"},10799:{c:"\\D7"},10846:{f:"A"},10877:{f:"A"},10878:{f:"A"},10885:{f:"A"},10886:{f:"A"},10887:{f:"A"},10888:{f:"A"},10889:{f:"A"},10890:{f:"A"},10891:{f:"A"},10892:{f:"A"},10901:{f:"A"},10902:{f:"A"},10933:{f:"A"},10934:{f:"A"},10935:{f:"A"},10936:{f:"A"},10937:{f:"A"},10938:{f:"A"},10949:{f:"A"},10950:{f:"A"},10955:{f:"A"},10956:{f:"A"},12296:{c:"\\27E8"},12297:{c:"\\27E9"},57350:{f:"A"},57351:{f:"A"},57352:{f:"A"},57353:{f:"A"},57356:{f:"A"},57357:{f:"A"},57358:{f:"A"},57359:{f:"A"},57360:{f:"A"},57361:{f:"A"},57366:{f:"A"},57367:{f:"A"},57368:{f:"A"},57369:{f:"A"},57370:{f:"A"},57371:{f:"A"},119808:{c:"A",f:"B"},119809:{c:"B",f:"B"},119810:{c:"C",f:"B"},119811:{c:"D",f:"B"},119812:{c:"E",f:"B"},119813:{c:"F",f:"B"},119814:{c:"G",f:"B"},119815:{c:"H",f:"B"},119816:{c:"I",f:"B"},119817:{c:"J",f:"B"},119818:{c:"K",f:"B"},119819:{c:"L",f:"B"},119820:{c:"M",f:"B"},119821:{c:"N",f:"B"},119822:{c:"O",f:"B"},119823:{c:"P",f:"B"},119824:{c:"Q",f:"B"},119825:{c:"R",f:"B"},119826:{c:"S",f:"B"},119827:{c:"T",f:"B"},119828:{c:"U",f:"B"},119829:{c:"V",f:"B"},119830:{c:"W",f:"B"},119831:{c:"X",f:"B"},119832:{c:"Y",f:"B"},119833:{c:"Z",f:"B"},119834:{c:"a",f:"B"},119835:{c:"b",f:"B"},119836:{c:"c",f:"B"},119837:{c:"d",f:"B"},119838:{c:"e",f:"B"},119839:{c:"f",f:"B"},119840:{c:"g",f:"B"},119841:{c:"h",f:"B"},119842:{c:"i",f:"B"},119843:{c:"j",f:"B"},119844:{c:"k",f:"B"},119845:{c:"l",f:"B"},119846:{c:"m",f:"B"},119847:{c:"n",f:"B"},119848:{c:"o",f:"B"},119849:{c:"p",f:"B"},119850:{c:"q",f:"B"},119851:{c:"r",f:"B"},119852:{c:"s",f:"B"},119853:{c:"t",f:"B"},119854:{c:"u",f:"B"},119855:{c:"v",f:"B"},119856:{c:"w",f:"B"},119857:{c:"x",f:"B"},119858:{c:"y",f:"B"},119859:{c:"z",f:"B"},119860:{c:"A",f:"I"},119861:{c:"B",f:"I"},119862:{c:"C",f:"I"},119863:{c:"D",f:"I"},119864:{c:"E",f:"I"},119865:{c:"F",f:"I"},119866:{c:"G",f:"I"},119867:{c:"H",f:"I"},119868:{c:"I",f:"I"},119869:{c:"J",f:"I"},119870:{c:"K",f:"I"},119871:{c:"L",f:"I"},119872:{c:"M",f:"I"},119873:{c:"N",f:"I"},119874:{c:"O",f:"I"},119875:{c:"P",f:"I"},119876:{c:"Q",f:"I"},119877:{c:"R",f:"I"},119878:{c:"S",f:"I"},119879:{c:"T",f:"I"},119880:{c:"U",f:"I"},119881:{c:"V",f:"I"},119882:{c:"W",f:"I"},119883:{c:"X",f:"I"},119884:{c:"Y",f:"I"},119885:{c:"Z",f:"I"},119886:{c:"a",f:"I"},119887:{c:"b",f:"I"},119888:{c:"c",f:"I"},119889:{c:"d",f:"I"},119890:{c:"e",f:"I"},119891:{c:"f",f:"I"},119892:{c:"g",f:"I"},119894:{c:"i",f:"I"},119895:{c:"j",f:"I"},119896:{c:"k",f:"I"},119897:{c:"l",f:"I"},119898:{c:"m",f:"I"},119899:{c:"n",f:"I"},119900:{c:"o",f:"I"},119901:{c:"p",f:"I"},119902:{c:"q",f:"I"},119903:{c:"r",f:"I"},119904:{c:"s",f:"I"},119905:{c:"t",f:"I"},119906:{c:"u",f:"I"},119907:{c:"v",f:"I"},119908:{c:"w",f:"I"},119909:{c:"x",f:"I"},119910:{c:"y",f:"I"},119911:{c:"z",f:"I"},119912:{c:"A",f:"BI"},119913:{c:"B",f:"BI"},119914:{c:"C",f:"BI"},119915:{c:"D",f:"BI"},119916:{c:"E",f:"BI"},119917:{c:"F",f:"BI"},119918:{c:"G",f:"BI"},119919:{c:"H",f:"BI"},119920:{c:"I",f:"BI"},119921:{c:"J",f:"BI"},119922:{c:"K",f:"BI"},119923:{c:"L",f:"BI"},119924:{c:"M",f:"BI"},119925:{c:"N",f:"BI"},119926:{c:"O",f:"BI"},119927:{c:"P",f:"BI"},119928:{c:"Q",f:"BI"},119929:{c:"R",f:"BI"},119930:{c:"S",f:"BI"},119931:{c:"T",f:"BI"},119932:{c:"U",f:"BI"},119933:{c:"V",f:"BI"},119934:{c:"W",f:"BI"},119935:{c:"X",f:"BI"},119936:{c:"Y",f:"BI"},119937:{c:"Z",f:"BI"},119938:{c:"a",f:"BI"},119939:{c:"b",f:"BI"},119940:{c:"c",f:"BI"},119941:{c:"d",f:"BI"},119942:{c:"e",f:"BI"},119943:{c:"f",f:"BI"},119944:{c:"g",f:"BI"},119945:{c:"h",f:"BI"},119946:{c:"i",f:"BI"},119947:{c:"j",f:"BI"},119948:{c:"k",f:"BI"},119949:{c:"l",f:"BI"},119950:{c:"m",f:"BI"},119951:{c:"n",f:"BI"},119952:{c:"o",f:"BI"},119953:{c:"p",f:"BI"},119954:{c:"q",f:"BI"},119955:{c:"r",f:"BI"},119956:{c:"s",f:"BI"},119957:{c:"t",f:"BI"},119958:{c:"u",f:"BI"},119959:{c:"v",f:"BI"},119960:{c:"w",f:"BI"},119961:{c:"x",f:"BI"},119962:{c:"y",f:"BI"},119963:{c:"z",f:"BI"},119964:{c:"A",f:"SC"},119966:{c:"C",f:"SC"},119967:{c:"D",f:"SC"},119970:{c:"G",f:"SC"},119973:{c:"J",f:"SC"},119974:{c:"K",f:"SC"},119977:{c:"N",f:"SC"},119978:{c:"O",f:"SC"},119979:{c:"P",f:"SC"},119980:{c:"Q",f:"SC"},119982:{c:"S",f:"SC"},119983:{c:"T",f:"SC"},119984:{c:"U",f:"SC"},119985:{c:"V",f:"SC"},119986:{c:"W",f:"SC"},119987:{c:"X",f:"SC"},119988:{c:"Y",f:"SC"},119989:{c:"Z",f:"SC"},120068:{c:"A",f:"FR"},120069:{c:"B",f:"FR"},120071:{c:"D",f:"FR"},120072:{c:"E",f:"FR"},120073:{c:"F",f:"FR"},120074:{c:"G",f:"FR"},120077:{c:"J",f:"FR"},120078:{c:"K",f:"FR"},120079:{c:"L",f:"FR"},120080:{c:"M",f:"FR"},120081:{c:"N",f:"FR"},120082:{c:"O",f:"FR"},120083:{c:"P",f:"FR"},120084:{c:"Q",f:"FR"},120086:{c:"S",f:"FR"},120087:{c:"T",f:"FR"},120088:{c:"U",f:"FR"},120089:{c:"V",f:"FR"},120090:{c:"W",f:"FR"},120091:{c:"X",f:"FR"},120092:{c:"Y",f:"FR"},120094:{c:"a",f:"FR"},120095:{c:"b",f:"FR"},120096:{c:"c",f:"FR"},120097:{c:"d",f:"FR"},120098:{c:"e",f:"FR"},120099:{c:"f",f:"FR"},120100:{c:"g",f:"FR"},120101:{c:"h",f:"FR"},120102:{c:"i",f:"FR"},120103:{c:"j",f:"FR"},120104:{c:"k",f:"FR"},120105:{c:"l",f:"FR"},120106:{c:"m",f:"FR"},120107:{c:"n",f:"FR"},120108:{c:"o",f:"FR"},120109:{c:"p",f:"FR"},120110:{c:"q",f:"FR"},120111:{c:"r",f:"FR"},120112:{c:"s",f:"FR"},120113:{c:"t",f:"FR"},120114:{c:"u",f:"FR"},120115:{c:"v",f:"FR"},120116:{c:"w",f:"FR"},120117:{c:"x",f:"FR"},120118:{c:"y",f:"FR"},120119:{c:"z",f:"FR"},120120:{c:"A",f:"A"},120121:{c:"B",f:"A"},120123:{c:"D",f:"A"},120124:{c:"E",f:"A"},120125:{c:"F",f:"A"},120126:{c:"G",f:"A"},120128:{c:"I",f:"A"},120129:{c:"J",f:"A"},120130:{c:"K",f:"A"},120131:{c:"L",f:"A"},120132:{c:"M",f:"A"},120134:{c:"O",f:"A"},120138:{c:"S",f:"A"},120139:{c:"T",f:"A"},120140:{c:"U",f:"A"},120141:{c:"V",f:"A"},120142:{c:"W",f:"A"},120143:{c:"X",f:"A"},120144:{c:"Y",f:"A"},120172:{c:"A",f:"FRB"},120173:{c:"B",f:"FRB"},120174:{c:"C",f:"FRB"},120175:{c:"D",f:"FRB"},120176:{c:"E",f:"FRB"},120177:{c:"F",f:"FRB"},120178:{c:"G",f:"FRB"},120179:{c:"H",f:"FRB"},120180:{c:"I",f:"FRB"},120181:{c:"J",f:"FRB"},120182:{c:"K",f:"FRB"},120183:{c:"L",f:"FRB"},120184:{c:"M",f:"FRB"},120185:{c:"N",f:"FRB"},120186:{c:"O",f:"FRB"},120187:{c:"P",f:"FRB"},120188:{c:"Q",f:"FRB"},120189:{c:"R",f:"FRB"},120190:{c:"S",f:"FRB"},120191:{c:"T",f:"FRB"},120192:{c:"U",f:"FRB"},120193:{c:"V",f:"FRB"},120194:{c:"W",f:"FRB"},120195:{c:"X",f:"FRB"},120196:{c:"Y",f:"FRB"},120197:{c:"Z",f:"FRB"},120198:{c:"a",f:"FRB"},120199:{c:"b",f:"FRB"},120200:{c:"c",f:"FRB"},120201:{c:"d",f:"FRB"},120202:{c:"e",f:"FRB"},120203:{c:"f",f:"FRB"},120204:{c:"g",f:"FRB"},120205:{c:"h",f:"FRB"},120206:{c:"i",f:"FRB"},120207:{c:"j",f:"FRB"},120208:{c:"k",f:"FRB"},120209:{c:"l",f:"FRB"},120210:{c:"m",f:"FRB"},120211:{c:"n",f:"FRB"},120212:{c:"o",f:"FRB"},120213:{c:"p",f:"FRB"},120214:{c:"q",f:"FRB"},120215:{c:"r",f:"FRB"},120216:{c:"s",f:"FRB"},120217:{c:"t",f:"FRB"},120218:{c:"u",f:"FRB"},120219:{c:"v",f:"FRB"},120220:{c:"w",f:"FRB"},120221:{c:"x",f:"FRB"},120222:{c:"y",f:"FRB"},120223:{c:"z",f:"FRB"},120224:{c:"A",f:"SS"},120225:{c:"B",f:"SS"},120226:{c:"C",f:"SS"},120227:{c:"D",f:"SS"},120228:{c:"E",f:"SS"},120229:{c:"F",f:"SS"},120230:{c:"G",f:"SS"},120231:{c:"H",f:"SS"},120232:{c:"I",f:"SS"},120233:{c:"J",f:"SS"},120234:{c:"K",f:"SS"},120235:{c:"L",f:"SS"},120236:{c:"M",f:"SS"},120237:{c:"N",f:"SS"},120238:{c:"O",f:"SS"},120239:{c:"P",f:"SS"},120240:{c:"Q",f:"SS"},120241:{c:"R",f:"SS"},120242:{c:"S",f:"SS"},120243:{c:"T",f:"SS"},120244:{c:"U",f:"SS"},120245:{c:"V",f:"SS"},120246:{c:"W",f:"SS"},120247:{c:"X",f:"SS"},120248:{c:"Y",f:"SS"},120249:{c:"Z",f:"SS"},120250:{c:"a",f:"SS"},120251:{c:"b",f:"SS"},120252:{c:"c",f:"SS"},120253:{c:"d",f:"SS"},120254:{c:"e",f:"SS"},120255:{c:"f",f:"SS"},120256:{c:"g",f:"SS"},120257:{c:"h",f:"SS"},120258:{c:"i",f:"SS"},120259:{c:"j",f:"SS"},120260:{c:"k",f:"SS"},120261:{c:"l",f:"SS"},120262:{c:"m",f:"SS"},120263:{c:"n",f:"SS"},120264:{c:"o",f:"SS"},120265:{c:"p",f:"SS"},120266:{c:"q",f:"SS"},120267:{c:"r",f:"SS"},120268:{c:"s",f:"SS"},120269:{c:"t",f:"SS"},120270:{c:"u",f:"SS"},120271:{c:"v",f:"SS"},120272:{c:"w",f:"SS"},120273:{c:"x",f:"SS"},120274:{c:"y",f:"SS"},120275:{c:"z",f:"SS"},120276:{c:"A",f:"SSB"},120277:{c:"B",f:"SSB"},120278:{c:"C",f:"SSB"},120279:{c:"D",f:"SSB"},120280:{c:"E",f:"SSB"},120281:{c:"F",f:"SSB"},120282:{c:"G",f:"SSB"},120283:{c:"H",f:"SSB"},120284:{c:"I",f:"SSB"},120285:{c:"J",f:"SSB"},120286:{c:"K",f:"SSB"},120287:{c:"L",f:"SSB"},120288:{c:"M",f:"SSB"},120289:{c:"N",f:"SSB"},120290:{c:"O",f:"SSB"},120291:{c:"P",f:"SSB"},120292:{c:"Q",f:"SSB"},120293:{c:"R",f:"SSB"},120294:{c:"S",f:"SSB"},120295:{c:"T",f:"SSB"},120296:{c:"U",f:"SSB"},120297:{c:"V",f:"SSB"},120298:{c:"W",f:"SSB"},120299:{c:"X",f:"SSB"},120300:{c:"Y",f:"SSB"},120301:{c:"Z",f:"SSB"},120302:{c:"a",f:"SSB"},120303:{c:"b",f:"SSB"},120304:{c:"c",f:"SSB"},120305:{c:"d",f:"SSB"},120306:{c:"e",f:"SSB"},120307:{c:"f",f:"SSB"},120308:{c:"g",f:"SSB"},120309:{c:"h",f:"SSB"},120310:{c:"i",f:"SSB"},120311:{c:"j",f:"SSB"},120312:{c:"k",f:"SSB"},120313:{c:"l",f:"SSB"},120314:{c:"m",f:"SSB"},120315:{c:"n",f:"SSB"},120316:{c:"o",f:"SSB"},120317:{c:"p",f:"SSB"},120318:{c:"q",f:"SSB"},120319:{c:"r",f:"SSB"},120320:{c:"s",f:"SSB"},120321:{c:"t",f:"SSB"},120322:{c:"u",f:"SSB"},120323:{c:"v",f:"SSB"},120324:{c:"w",f:"SSB"},120325:{c:"x",f:"SSB"},120326:{c:"y",f:"SSB"},120327:{c:"z",f:"SSB"},120328:{c:"A",f:"SSI"},120329:{c:"B",f:"SSI"},120330:{c:"C",f:"SSI"},120331:{c:"D",f:"SSI"},120332:{c:"E",f:"SSI"},120333:{c:"F",f:"SSI"},120334:{c:"G",f:"SSI"},120335:{c:"H",f:"SSI"},120336:{c:"I",f:"SSI"},120337:{c:"J",f:"SSI"},120338:{c:"K",f:"SSI"},120339:{c:"L",f:"SSI"},120340:{c:"M",f:"SSI"},120341:{c:"N",f:"SSI"},120342:{c:"O",f:"SSI"},120343:{c:"P",f:"SSI"},120344:{c:"Q",f:"SSI"},120345:{c:"R",f:"SSI"},120346:{c:"S",f:"SSI"},120347:{c:"T",f:"SSI"},120348:{c:"U",f:"SSI"},120349:{c:"V",f:"SSI"},120350:{c:"W",f:"SSI"},120351:{c:"X",f:"SSI"},120352:{c:"Y",f:"SSI"},120353:{c:"Z",f:"SSI"},120354:{c:"a",f:"SSI"},120355:{c:"b",f:"SSI"},120356:{c:"c",f:"SSI"},120357:{c:"d",f:"SSI"},120358:{c:"e",f:"SSI"},120359:{c:"f",f:"SSI"},120360:{c:"g",f:"SSI"},120361:{c:"h",f:"SSI"},120362:{c:"i",f:"SSI"},120363:{c:"j",f:"SSI"},120364:{c:"k",f:"SSI"},120365:{c:"l",f:"SSI"},120366:{c:"m",f:"SSI"},120367:{c:"n",f:"SSI"},120368:{c:"o",f:"SSI"},120369:{c:"p",f:"SSI"},120370:{c:"q",f:"SSI"},120371:{c:"r",f:"SSI"},120372:{c:"s",f:"SSI"},120373:{c:"t",f:"SSI"},120374:{c:"u",f:"SSI"},120375:{c:"v",f:"SSI"},120376:{c:"w",f:"SSI"},120377:{c:"x",f:"SSI"},120378:{c:"y",f:"SSI"},120379:{c:"z",f:"SSI"},120432:{c:"A",f:"T"},120433:{c:"B",f:"T"},120434:{c:"C",f:"T"},120435:{c:"D",f:"T"},120436:{c:"E",f:"T"},120437:{c:"F",f:"T"},120438:{c:"G",f:"T"},120439:{c:"H",f:"T"},120440:{c:"I",f:"T"},120441:{c:"J",f:"T"},120442:{c:"K",f:"T"},120443:{c:"L",f:"T"},120444:{c:"M",f:"T"},120445:{c:"N",f:"T"},120446:{c:"O",f:"T"},120447:{c:"P",f:"T"},120448:{c:"Q",f:"T"},120449:{c:"R",f:"T"},120450:{c:"S",f:"T"},120451:{c:"T",f:"T"},120452:{c:"U",f:"T"},120453:{c:"V",f:"T"},120454:{c:"W",f:"T"},120455:{c:"X",f:"T"},120456:{c:"Y",f:"T"},120457:{c:"Z",f:"T"},120458:{c:"a",f:"T"},120459:{c:"b",f:"T"},120460:{c:"c",f:"T"},120461:{c:"d",f:"T"},120462:{c:"e",f:"T"},120463:{c:"f",f:"T"},120464:{c:"g",f:"T"},120465:{c:"h",f:"T"},120466:{c:"i",f:"T"},120467:{c:"j",f:"T"},120468:{c:"k",f:"T"},120469:{c:"l",f:"T"},120470:{c:"m",f:"T"},120471:{c:"n",f:"T"},120472:{c:"o",f:"T"},120473:{c:"p",f:"T"},120474:{c:"q",f:"T"},120475:{c:"r",f:"T"},120476:{c:"s",f:"T"},120477:{c:"t",f:"T"},120478:{c:"u",f:"T"},120479:{c:"v",f:"T"},120480:{c:"w",f:"T"},120481:{c:"x",f:"T"},120482:{c:"y",f:"T"},120483:{c:"z",f:"T"},120488:{c:"A",f:"B"},120489:{c:"B",f:"B"},120490:{c:"\\393",f:"B"},120491:{c:"\\394",f:"B"},120492:{c:"E",f:"B"},120493:{c:"Z",f:"B"},120494:{c:"H",f:"B"},120495:{c:"\\398",f:"B"},120496:{c:"I",f:"B"},120497:{c:"K",f:"B"},120498:{c:"\\39B",f:"B"},120499:{c:"M",f:"B"},120500:{c:"N",f:"B"},120501:{c:"\\39E",f:"B"},120502:{c:"O",f:"B"},120503:{c:"\\3A0",f:"B"},120504:{c:"P",f:"B"},120506:{c:"\\3A3",f:"B"},120507:{c:"T",f:"B"},120508:{c:"\\3A5",f:"B"},120509:{c:"\\3A6",f:"B"},120510:{c:"X",f:"B"},120511:{c:"\\3A8",f:"B"},120512:{c:"\\3A9",f:"B"},120513:{c:"\\2207",f:"B"},120546:{c:"A",f:"I"},120547:{c:"B",f:"I"},120548:{c:"\\393",f:"I"},120549:{c:"\\394",f:"I"},120550:{c:"E",f:"I"},120551:{c:"Z",f:"I"},120552:{c:"H",f:"I"},120553:{c:"\\398",f:"I"},120554:{c:"I",f:"I"},120555:{c:"K",f:"I"},120556:{c:"\\39B",f:"I"},120557:{c:"M",f:"I"},120558:{c:"N",f:"I"},120559:{c:"\\39E",f:"I"},120560:{c:"O",f:"I"},120561:{c:"\\3A0",f:"I"},120562:{c:"P",f:"I"},120564:{c:"\\3A3",f:"I"},120565:{c:"T",f:"I"},120566:{c:"\\3A5",f:"I"},120567:{c:"\\3A6",f:"I"},120568:{c:"X",f:"I"},120569:{c:"\\3A8",f:"I"},120570:{c:"\\3A9",f:"I"},120572:{c:"\\3B1",f:"I"},120573:{c:"\\3B2",f:"I"},120574:{c:"\\3B3",f:"I"},120575:{c:"\\3B4",f:"I"},120576:{c:"\\3B5",f:"I"},120577:{c:"\\3B6",f:"I"},120578:{c:"\\3B7",f:"I"},120579:{c:"\\3B8",f:"I"},120580:{c:"\\3B9",f:"I"},120581:{c:"\\3BA",f:"I"},120582:{c:"\\3BB",f:"I"},120583:{c:"\\3BC",f:"I"},120584:{c:"\\3BD",f:"I"},120585:{c:"\\3BE",f:"I"},120586:{c:"\\3BF",f:"I"},120587:{c:"\\3C0",f:"I"},120588:{c:"\\3C1",f:"I"},120589:{c:"\\3C2",f:"I"},120590:{c:"\\3C3",f:"I"},120591:{c:"\\3C4",f:"I"},120592:{c:"\\3C5",f:"I"},120593:{c:"\\3C6",f:"I"},120594:{c:"\\3C7",f:"I"},120595:{c:"\\3C8",f:"I"},120596:{c:"\\3C9",f:"I"},120597:{c:"\\2202"},120598:{c:"\\3F5",f:"I"},120599:{c:"\\3D1",f:"I"},120600:{c:"\\E009",f:"A"},120601:{c:"\\3D5",f:"I"},120602:{c:"\\3F1",f:"I"},120603:{c:"\\3D6",f:"I"},120604:{c:"A",f:"BI"},120605:{c:"B",f:"BI"},120606:{c:"\\393",f:"BI"},120607:{c:"\\394",f:"BI"},120608:{c:"E",f:"BI"},120609:{c:"Z",f:"BI"},120610:{c:"H",f:"BI"},120611:{c:"\\398",f:"BI"},120612:{c:"I",f:"BI"},120613:{c:"K",f:"BI"},120614:{c:"\\39B",f:"BI"},120615:{c:"M",f:"BI"},120616:{c:"N",f:"BI"},120617:{c:"\\39E",f:"BI"},120618:{c:"O",f:"BI"},120619:{c:"\\3A0",f:"BI"},120620:{c:"P",f:"BI"},120622:{c:"\\3A3",f:"BI"},120623:{c:"T",f:"BI"},120624:{c:"\\3A5",f:"BI"},120625:{c:"\\3A6",f:"BI"},120626:{c:"X",f:"BI"},120627:{c:"\\3A8",f:"BI"},120628:{c:"\\3A9",f:"BI"},120630:{c:"\\3B1",f:"BI"},120631:{c:"\\3B2",f:"BI"},120632:{c:"\\3B3",f:"BI"},120633:{c:"\\3B4",f:"BI"},120634:{c:"\\3B5",f:"BI"},120635:{c:"\\3B6",f:"BI"},120636:{c:"\\3B7",f:"BI"},120637:{c:"\\3B8",f:"BI"},120638:{c:"\\3B9",f:"BI"},120639:{c:"\\3BA",f:"BI"},120640:{c:"\\3BB",f:"BI"},120641:{c:"\\3BC",f:"BI"},120642:{c:"\\3BD",f:"BI"},120643:{c:"\\3BE",f:"BI"},120644:{c:"\\3BF",f:"BI"},120645:{c:"\\3C0",f:"BI"},120646:{c:"\\3C1",f:"BI"},120647:{c:"\\3C2",f:"BI"},120648:{c:"\\3C3",f:"BI"},120649:{c:"\\3C4",f:"BI"},120650:{c:"\\3C5",f:"BI"},120651:{c:"\\3C6",f:"BI"},120652:{c:"\\3C7",f:"BI"},120653:{c:"\\3C8",f:"BI"},120654:{c:"\\3C9",f:"BI"},120655:{c:"\\2202",f:"B"},120656:{c:"\\3F5",f:"BI"},120657:{c:"\\3D1",f:"BI"},120658:{c:"\\E009",f:"A"},120659:{c:"\\3D5",f:"BI"},120660:{c:"\\3F1",f:"BI"},120661:{c:"\\3D6",f:"BI"},120662:{c:"A",f:"SSB"},120663:{c:"B",f:"SSB"},120664:{c:"\\393",f:"SSB"},120665:{c:"\\394",f:"SSB"},120666:{c:"E",f:"SSB"},120667:{c:"Z",f:"SSB"},120668:{c:"H",f:"SSB"},120669:{c:"\\398",f:"SSB"},120670:{c:"I",f:"SSB"},120671:{c:"K",f:"SSB"},120672:{c:"\\39B",f:"SSB"},120673:{c:"M",f:"SSB"},120674:{c:"N",f:"SSB"},120675:{c:"\\39E",f:"SSB"},120676:{c:"O",f:"SSB"},120677:{c:"\\3A0",f:"SSB"},120678:{c:"P",f:"SSB"},120680:{c:"\\3A3",f:"SSB"},120681:{c:"T",f:"SSB"},120682:{c:"\\3A5",f:"SSB"},120683:{c:"\\3A6",f:"SSB"},120684:{c:"X",f:"SSB"},120685:{c:"\\3A8",f:"SSB"},120686:{c:"\\3A9",f:"SSB"},120782:{c:"0",f:"B"},120783:{c:"1",f:"B"},120784:{c:"2",f:"B"},120785:{c:"3",f:"B"},120786:{c:"4",f:"B"},120787:{c:"5",f:"B"},120788:{c:"6",f:"B"},120789:{c:"7",f:"B"},120790:{c:"8",f:"B"},120791:{c:"9",f:"B"},120802:{c:"0",f:"SS"},120803:{c:"1",f:"SS"},120804:{c:"2",f:"SS"},120805:{c:"3",f:"SS"},120806:{c:"4",f:"SS"},120807:{c:"5",f:"SS"},120808:{c:"6",f:"SS"},120809:{c:"7",f:"SS"},120810:{c:"8",f:"SS"},120811:{c:"9",f:"SS"},120812:{c:"0",f:"SSB"},120813:{c:"1",f:"SSB"},120814:{c:"2",f:"SSB"},120815:{c:"3",f:"SSB"},120816:{c:"4",f:"SSB"},120817:{c:"5",f:"SSB"},120818:{c:"6",f:"SSB"},120819:{c:"7",f:"SSB"},120820:{c:"8",f:"SSB"},120821:{c:"9",f:"SSB"},120822:{c:"0",f:"T"},120823:{c:"1",f:"T"},120824:{c:"2",f:"T"},120825:{c:"3",f:"T"},120826:{c:"4",f:"T"},120827:{c:"5",f:"T"},120828:{c:"6",f:"T"},120829:{c:"7",f:"T"},120830:{c:"8",f:"T"},120831:{c:"9",f:"T"}})},3518:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.sansSerifBoldItalic=void 0;var t=i(73),e=i(6949);f.sansSerifBoldItalic=(0,t.AddCSS)(e.sansSerifBoldItalic,{305:{f:"SSB"},567:{f:"SSB"}})},965:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.sansSerifBold=void 0;var t=i(73),e=i(5193);f.sansSerifBold=(0,t.AddCSS)(e.sansSerifBold,{8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/"},8710:{c:"\\394"}})},9169:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.sansSerifItalic=void 0;var t=i(73),e=i(2632);f.sansSerifItalic=(0,t.AddCSS)(e.sansSerifItalic,{913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/"},8710:{c:"\\394"}})},6736:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.sansSerif=void 0;var t=i(73),e=i(4214);f.sansSerif=(0,t.AddCSS)(e.sansSerif,{913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/"},8710:{c:"\\394"}})},2290:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.scriptBold=void 0;var t=i(6466);Object.defineProperty(f,"scriptBold",{enumerable:!0,get:function(){return t.scriptBold}})},3012:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.script=void 0;var t=i(3776);Object.defineProperty(f,"script",{enumerable:!0,get:function(){return t.script}})},8787:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.smallop=void 0;var t=i(73),e=i(7405);f.smallop=(0,t.AddCSS)(e.smallop,{8260:{c:"/"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},10072:{c:"\\2223"},10764:{c:"\\222C\\222C"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},5392:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.texCalligraphicBold=void 0;var t=i(73),e=i(8105);f.texCalligraphicBold=(0,t.AddCSS)(e.texCalligraphicBold,{305:{f:"B"},567:{f:"B"}})},6318:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.texCalligraphic=void 0;var t=i(2518);Object.defineProperty(f,"texCalligraphic",{enumerable:!0,get:function(){return t.texCalligraphic}})},5351:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.texMathit=void 0;var t=i(5595);Object.defineProperty(f,"texMathit",{enumerable:!0,get:function(){return t.texMathit}})},873:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.texOldstyleBold=void 0;var t=i(6357);Object.defineProperty(f,"texOldstyleBold",{enumerable:!0,get:function(){return t.texOldstyleBold}})},7611:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.texOldstyle=void 0;var t=i(9474);Object.defineProperty(f,"texOldstyle",{enumerable:!0,get:function(){return t.texOldstyle}})},6590:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.texSize3=void 0;var t=i(73),e=i(584);f.texSize3=(0,t.AddCSS)(e.texSize3,{8260:{c:"/"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},8798:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.texSize4=void 0;var t=i(73),e=i(4324);f.texSize4=(0,t.AddCSS)(e.texSize4,{8260:{c:"/"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},12296:{c:"\\27E8"},12297:{c:"\\27E9"},57685:{c:"\\E153\\E152"},57686:{c:"\\E151\\E150"}})},2138:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.texVariant=void 0;var t=i(73),e=i(8135);f.texVariant=(0,t.AddCSS)(e.texVariant,{1008:{c:"\\E009"},8463:{f:""},8740:{c:"\\E006"},8742:{c:"\\E007"},8808:{c:"\\E00C"},8809:{c:"\\E00D"},8816:{c:"\\E011"},8817:{c:"\\E00E"},8840:{c:"\\E016"},8841:{c:"\\E018"},8842:{c:"\\E01A"},8843:{c:"\\E01B"},10887:{c:"\\E010"},10888:{c:"\\E00F"},10955:{c:"\\E017"},10956:{c:"\\E019"}})},2176:function(c,f){var i,t=this&&this.__extends||(i=function(c,f){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(c,f){c.__proto__=f}||function(c,f){for(var i in f)Object.prototype.hasOwnProperty.call(f,i)&&(c[i]=f[i])},i(c,f)},function(c,f){if("function"!=typeof f&&null!==f)throw new TypeError("Class extends value "+String(f)+" is not a constructor or null");function t(){this.constructor=c}i(c,f),c.prototype=null===f?Object.create(f):(t.prototype=f.prototype,new t)}),e=this&&this.__assign||function(){return e=Object.assign||function(c){for(var f,i=1,t=arguments.length;i<t;i++)for(var e in f=arguments[i])Object.prototype.hasOwnProperty.call(f,e)&&(c[e]=f[e]);return c},e.apply(this,arguments)},s=this&&this.__read||function(c,f){var i="function"==typeof Symbol&&c[Symbol.iterator];if(!i)return c;var t,e,s=i.call(c),r=[];try{for(;(void 0===f||f-- >0)&&!(t=s.next()).done;)r.push(t.value)}catch(c){e={error:c}}finally{try{t&&!t.done&&(i=s.return)&&i.call(s)}finally{if(e)throw e.error}}return r},r=this&&this.__spreadArray||function(c,f,i){if(i||2===arguments.length)for(var t,e=0,s=f.length;e<s;e++)!t&&e in f||(t||(t=Array.prototype.slice.call(f,0,e)),t[e]=f[e]);return c.concat(t||Array.prototype.slice.call(f))};Object.defineProperty(f,"__esModule",{value:!0}),f.CommonTeXFontMixin=void 0,f.CommonTeXFontMixin=function(c){var f;return f=function(c){function f(){return null!==c&&c.apply(this,arguments)||this}return t(f,c),f.prototype.getDelimiterData=function(c){return this.getChar("-smallop",c)||this.getChar("-size4",c)},f}(c),f.NAME="TeX",f.defaultVariants=r(r([],s(c.defaultVariants),!1),[["-smallop","normal"],["-largeop","normal"],["-size3","normal"],["-size4","normal"],["-tex-calligraphic","italic"],["-tex-bold-calligraphic","bold-italic"],["-tex-oldstyle","normal"],["-tex-bold-oldstyle","bold"],["-tex-mathit","italic"],["-tex-variant","normal"]],!1),f.defaultCssFonts=e(e({},c.defaultCssFonts),{"-smallop":["serif",!1,!1],"-largeop":["serif",!1,!1],"-size3":["serif",!1,!1],"-size4":["serif",!1,!1],"-tex-calligraphic":["cursive",!0,!1],"-tex-bold-calligraphic":["cursive",!0,!0],"-tex-oldstyle":["serif",!1,!1],"-tex-bold-oldstyle":["serif",!1,!0],"-tex-mathit":["serif",!0,!1]}),f.defaultSizeVariants=["normal","-smallop","-largeop","-size3","-size4","-tex-variant"],f.defaultStretchVariants=["-size4"],f}},3869:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.boldItalic=void 0,f.boldItalic={47:[.711,.21,.894],305:[.452,.008,.394,{sk:.0319}],567:[.451,.201,.439,{sk:.0958}],8260:[.711,.21,.894],8710:[.711,0,.958,{sk:.192}],10744:[.711,.21,.894]}},7557:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.bold=void 0,f.bold={33:[.705,0,.35],34:[.694,-.329,.603],35:[.694,.193,.958],36:[.75,.056,.575],37:[.75,.056,.958],38:[.705,.011,.894],39:[.694,-.329,.319],40:[.75,.249,.447],41:[.75,.249,.447],42:[.75,-.306,.575],43:[.633,.131,.894],44:[.171,.194,.319],45:[.278,-.166,.383],46:[.171,0,.319],47:[.75,.25,.575],58:[.444,0,.319],59:[.444,.194,.319],60:[.587,.085,.894],61:[.393,-.109,.894],62:[.587,.085,.894],63:[.7,0,.543],64:[.699,.006,.894],91:[.75,.25,.319],92:[.75,.25,.575],93:[.75,.25,.319],94:[.694,-.52,.575],95:[-.01,.061,.575],96:[.706,-.503,.575],123:[.75,.25,.575],124:[.75,.249,.319],125:[.75,.25,.575],126:[.344,-.202,.575],168:[.695,-.535,.575],172:[.371,-.061,.767],175:[.607,-.54,.575],176:[.702,-.536,.575],177:[.728,.035,.894],180:[.706,-.503,.575],183:[.336,-.166,.319],215:[.53,.028,.894],247:[.597,.096,.894],305:[.442,0,.278,{sk:.0278}],567:[.442,.205,.306,{sk:.0833}],697:[.563,-.033,.344],710:[.694,-.52,.575],711:[.66,-.515,.575],713:[.607,-.54,.575],714:[.706,-.503,.575],715:[.706,-.503,.575],728:[.694,-.5,.575],729:[.695,-.525,.575],730:[.702,-.536,.575],732:[.694,-.552,.575],768:[.706,-.503,0],769:[.706,-.503,0],770:[.694,-.52,0],771:[.694,-.552,0],772:[.607,-.54,0],774:[.694,-.5,0],775:[.695,-.525,0],776:[.695,-.535,0],778:[.702,-.536,0],779:[.714,-.511,0],780:[.66,-.515,0],824:[.711,.21,0],8194:[0,0,.5],8195:[0,0,.999],8196:[0,0,.333],8197:[0,0,.25],8198:[0,0,.167],8201:[0,0,.167],8202:[0,0,.083],8211:[.3,-.249,.575],8212:[.3,-.249,1.15],8213:[.3,-.249,1.15],8214:[.75,.248,.575],8215:[-.01,.061,.575],8216:[.694,-.329,.319],8217:[.694,-.329,.319],8220:[.694,-.329,.603],8221:[.694,-.329,.603],8224:[.702,.211,.511],8225:[.702,.202,.511],8226:[.474,-.028,.575],8230:[.171,0,1.295],8242:[.563,-.033,.344],8243:[.563,0,.688],8244:[.563,0,1.032],8254:[.607,-.54,.575],8260:[.75,.25,.575],8279:[.563,0,1.376],8407:[.723,-.513,.575],8463:[.694,.008,.668,{sk:-.0319}],8467:[.702,.019,.474,{sk:.128}],8472:[.461,.21,.74],8501:[.694,0,.703],8592:[.518,.017,1.15],8593:[.694,.193,.575],8594:[.518,.017,1.15],8595:[.694,.194,.575],8596:[.518,.017,1.15],8597:[.767,.267,.575],8598:[.724,.194,1.15],8599:[.724,.193,1.15],8600:[.694,.224,1.15],8601:[.694,.224,1.15],8602:[.711,.21,1.15],8603:[.711,.21,1.15],8614:[.518,.017,1.15],8617:[.518,.017,1.282],8618:[.518,.017,1.282],8622:[.711,.21,1.15],8636:[.518,-.22,1.15],8637:[.281,.017,1.15],8640:[.518,-.22,1.15],8641:[.281,.017,1.15],8652:[.718,.017,1.15],8653:[.711,.21,1.15],8654:[.711,.21,1.15],8655:[.711,.21,1.15],8656:[.547,.046,1.15],8657:[.694,.193,.703],8658:[.547,.046,1.15],8659:[.694,.194,.703],8660:[.547,.046,1.15],8661:[.767,.267,.703],8704:[.694,.016,.639],8707:[.694,0,.639],8708:[.711,.21,.639],8709:[.767,.073,.575],8710:[.698,0,.958],8712:[.587,.086,.767],8713:[.711,.21,.767],8715:[.587,.086,.767],8716:[.711,.21,.767],8722:[.281,-.221,.894],8723:[.537,.227,.894],8725:[.75,.25,.575],8726:[.75,.25,.575],8727:[.472,-.028,.575],8728:[.474,-.028,.575],8729:[.474,-.028,.575],8730:[.82,.18,.958,{ic:.03}],8733:[.451,.008,.894],8734:[.452,.008,1.15],8736:[.714,0,.722],8739:[.75,.249,.319],8740:[.75,.249,.319],8741:[.75,.248,.575],8742:[.75,.248,.575],8743:[.604,.017,.767],8744:[.604,.016,.767],8745:[.603,.016,.767],8746:[.604,.016,.767],8747:[.711,.211,.569,{ic:.063}],8764:[.391,-.109,.894],8768:[.583,.082,.319],8769:[.711,.21,.894],8771:[.502,0,.894],8772:[.711,.21,.894],8773:[.638,.027,.894],8775:[.711,.21,.894],8776:[.524,-.032,.894],8777:[.711,.21,.894],8781:[.533,.032,.894],8784:[.721,-.109,.894],8800:[.711,.21,.894],8801:[.505,0,.894],8802:[.711,.21,.894],8804:[.697,.199,.894],8805:[.697,.199,.894],8810:[.617,.116,1.15],8811:[.618,.116,1.15],8813:[.711,.21,.894],8814:[.711,.21,.894],8815:[.711,.21,.894],8816:[.711,.21,.894],8817:[.711,.21,.894],8826:[.585,.086,.894],8827:[.586,.086,.894],8832:[.711,.21,.894],8833:[.711,.21,.894],8834:[.587,.085,.894],8835:[.587,.086,.894],8836:[.711,.21,.894],8837:[.711,.21,.894],8838:[.697,.199,.894],8839:[.697,.199,.894],8840:[.711,.21,.894],8841:[.711,.21,.894],8846:[.604,.016,.767],8849:[.697,.199,.894],8850:[.697,.199,.894],8851:[.604,0,.767],8852:[.604,0,.767],8853:[.632,.132,.894],8854:[.632,.132,.894],8855:[.632,.132,.894],8856:[.632,.132,.894],8857:[.632,.132,.894],8866:[.693,0,.703],8867:[.693,0,.703],8868:[.694,0,.894],8869:[.693,0,.894],8872:[.75,.249,.974],8876:[.711,.21,.703],8877:[.75,.249,.974],8900:[.523,.021,.575],8901:[.336,-.166,.319],8902:[.502,0,.575],8904:[.54,.039,1],8930:[.711,.21,.894],8931:[.711,.21,.894],8942:[.951,.029,.319],8943:[.336,-.166,1.295],8945:[.871,-.101,1.323],8968:[.75,.248,.511],8969:[.75,.248,.511],8970:[.749,.248,.511],8971:[.749,.248,.511],8994:[.405,-.108,1.15],8995:[.392,-.126,1.15],9001:[.75,.249,.447],9002:[.75,.249,.447],9651:[.711,0,1.022],9653:[.711,0,1.022],9657:[.54,.039,.575],9661:[.5,.21,1.022],9663:[.5,.21,1.022],9667:[.539,.038,.575],9711:[.711,.211,1.15],9824:[.719,.129,.894],9825:[.711,.024,.894],9826:[.719,.154,.894],9827:[.719,.129,.894],9837:[.75,.017,.447],9838:[.741,.223,.447],9839:[.724,.224,.447],10072:[.75,.249,.319],10216:[.75,.249,.447],10217:[.75,.249,.447],10229:[.518,.017,1.805],10230:[.518,.017,1.833],10231:[.518,.017,2.126],10232:[.547,.046,1.868],10233:[.547,.046,1.87],10234:[.547,.046,2.126],10236:[.518,.017,1.833],10744:[.711,.21,.894],10799:[.53,.028,.894],10815:[.686,0,.9],10927:[.696,.199,.894],10928:[.697,.199,.894],12296:[.75,.249,.447],12297:[.75,.249,.447]}},7481:function(c,f,i){Object.defineProperty(f,"__esModule",{value:!0}),f.delimiters=f.VSIZES=f.HDW3=f.HDW2=f.HDW1=void 0;var t=i(4228);f.HDW1=[.75,.25,.875],f.HDW2=[.85,.349,.667],f.HDW3=[.583,.082,.5],f.VSIZES=[1,1.2,1.8,2.4,3];var e={c:47,dir:t.V,sizes:f.VSIZES},s={c:175,dir:t.H,sizes:[.5],stretch:[0,175],HDW:[.59,-.544,.5]},r={c:710,dir:t.H,sizes:[.5,.556,1,1.444,1.889]},o={c:732,dir:t.H,sizes:[.5,.556,1,1.444,1.889]},a={c:8211,dir:t.H,sizes:[.5],stretch:[0,8211],HDW:[.285,-.248,.5]},S={c:8592,dir:t.H,sizes:[1],stretch:[8592,8722],HDW:f.HDW3},l={c:8594,dir:t.H,sizes:[1],stretch:[0,8722,8594],HDW:f.HDW3},n={c:8596,dir:t.H,sizes:[1],stretch:[8592,8722,8594],HDW:f.HDW3},B={c:8612,dir:t.H,stretch:[8592,8722,8739],HDW:f.HDW3,min:1.278},d={c:8614,dir:t.H,sizes:[1],stretch:[8739,8722,8594],HDW:f.HDW3},u={c:8656,dir:t.H,sizes:[1],stretch:[8656,61],HDW:f.HDW3},k={c:8658,dir:t.H,sizes:[1],stretch:[0,61,8658],HDW:f.HDW3},I={c:8660,dir:t.H,sizes:[1],stretch:[8656,61,8658],HDW:f.HDW3},A={c:8722,dir:t.H,sizes:[.778],stretch:[0,8722],HDW:f.HDW3},p={c:8739,dir:t.V,sizes:[1],stretch:[0,8739],HDW:[.627,.015,.333]},m={c:9180,dir:t.H,sizes:[.778,1],schar:[8994,8994],variants:[5,0],stretch:[57680,57684,57681],HDW:[.32,.2,.5]},h={c:9181,dir:t.H,sizes:[.778,1],schar:[8995,8995],variants:[5,0],stretch:[57682,57684,57683],HDW:[.32,.2,.5]},M={c:9182,dir:t.H,stretch:[57680,57684,57681,57685],HDW:[.32,.2,.5],min:1.8},x={c:9183,dir:t.H,stretch:[57682,57684,57683,57686],HDW:[.32,.2,.5],min:1.8},H={c:10216,dir:t.V,sizes:f.VSIZES},_={c:10217,dir:t.V,sizes:f.VSIZES},E={c:10502,dir:t.H,stretch:[8656,61,8739],HDW:f.HDW3,min:1.278},y={c:10503,dir:t.H,stretch:[8872,61,8658],HDW:f.HDW3,min:1.278};f.delimiters={40:{dir:t.V,sizes:f.VSIZES,stretch:[9115,9116,9117],HDW:[.85,.349,.875]},41:{dir:t.V,sizes:f.VSIZES,stretch:[9118,9119,9120],HDW:[.85,.349,.875]},45:A,47:e,61:{dir:t.H,sizes:[.778],stretch:[0,61],HDW:f.HDW3},91:{dir:t.V,sizes:f.VSIZES,stretch:[9121,9122,9123],HDW:f.HDW2},92:{dir:t.V,sizes:f.VSIZES},93:{dir:t.V,sizes:f.VSIZES,stretch:[9124,9125,9126],HDW:f.HDW2},94:r,95:a,123:{dir:t.V,sizes:f.VSIZES,stretch:[9127,9130,9129,9128],HDW:[.85,.349,.889]},124:{dir:t.V,sizes:[1],stretch:[0,8739],HDW:[.75,.25,.333]},125:{dir:t.V,sizes:f.VSIZES,stretch:[9131,9130,9133,9132],HDW:[.85,.349,.889]},126:o,175:s,710:r,713:s,732:o,770:r,771:o,818:a,8211:a,8212:a,8213:a,8214:{dir:t.V,sizes:[.602,1],schar:[0,8741],variants:[1,0],stretch:[0,8741],HDW:[.602,0,.556]},8215:a,8254:s,8407:l,8592:S,8593:{dir:t.V,sizes:[.888],stretch:[8593,9168],HDW:[.6,0,.667]},8594:l,8595:{dir:t.V,sizes:[.888],stretch:[0,9168,8595],HDW:[.6,0,.667]},8596:n,8597:{dir:t.V,sizes:[1.044],stretch:[8593,9168,8595],HDW:f.HDW1},8606:{dir:t.H,sizes:[1],stretch:[8606,8722],HDW:f.HDW3},8608:{dir:t.H,sizes:[1],stretch:[0,8722,8608],HDW:f.HDW3},8612:B,8613:{dir:t.V,stretch:[8593,9168,8869],HDW:f.HDW1,min:1.555},8614:d,8615:{dir:t.V,stretch:[8868,9168,8595],HDW:f.HDW1,min:1.555},8624:{dir:t.V,sizes:[.722],stretch:[8624,9168],HDW:f.HDW1},8625:{dir:t.V,sizes:[.722],stretch:[8625,9168],HDW:f.HDW1},8636:{dir:t.H,sizes:[1],stretch:[8636,8722],HDW:f.HDW3},8637:{dir:t.H,sizes:[1],stretch:[8637,8722],HDW:f.HDW3},8638:{dir:t.V,sizes:[.888],stretch:[8638,9168],HDW:f.HDW1},8639:{dir:t.V,sizes:[.888],stretch:[8639,9168],HDW:f.HDW1},8640:{dir:t.H,sizes:[1],stretch:[0,8722,8640],HDW:f.HDW3},8641:{dir:t.H,sizes:[1],stretch:[0,8722,8641],HDW:f.HDW3},8642:{dir:t.V,sizes:[.888],stretch:[0,9168,8642],HDW:f.HDW1},8643:{dir:t.V,sizes:[.888],stretch:[0,9168,8643],HDW:f.HDW1},8656:u,8657:{dir:t.V,sizes:[.888],stretch:[8657,8214],HDW:[.599,0,.778]},8658:k,8659:{dir:t.V,sizes:[.888],stretch:[0,8214,8659],HDW:[.6,0,.778]},8660:I,8661:{dir:t.V,sizes:[1.044],stretch:[8657,8214,8659],HDW:[.75,.25,.778]},8666:{dir:t.H,sizes:[1],stretch:[8666,8801],HDW:[.464,-.036,.5]},8667:{dir:t.H,sizes:[1],stretch:[0,8801,8667],HDW:[.464,-.036,.5]},8722:A,8725:e,8730:{dir:t.V,sizes:f.VSIZES,stretch:[57345,57344,9143],fullExt:[.65,2.3],HDW:[.85,.35,1.056]},8739:p,8741:{dir:t.V,sizes:[1],stretch:[0,8741],HDW:[.627,.015,.556]},8968:{dir:t.V,sizes:f.VSIZES,stretch:[9121,9122],HDW:f.HDW2},8969:{dir:t.V,sizes:f.VSIZES,stretch:[9124,9125],HDW:f.HDW2},8970:{dir:t.V,sizes:f.VSIZES,stretch:[0,9122,9123],HDW:f.HDW2},8971:{dir:t.V,sizes:f.VSIZES,stretch:[0,9125,9126],HDW:f.HDW2},8978:m,8994:m,8995:h,9001:H,9002:_,9130:{dir:t.V,sizes:[.32],stretch:[9130,9130,9130],HDW:[.29,.015,.889]},9135:a,9136:{dir:t.V,sizes:[.989],stretch:[9127,9130,9133],HDW:[.75,.25,.889]},9137:{dir:t.V,sizes:[.989],stretch:[9131,9130,9129],HDW:[.75,.25,.889]},9140:{dir:t.H,stretch:[9484,8722,9488],HDW:f.HDW3,min:1},9141:{dir:t.H,stretch:[9492,8722,9496],HDW:f.HDW3,min:1},9168:{dir:t.V,sizes:[.602,1],schar:[0,8739],variants:[1,0],stretch:[0,8739],HDW:[.602,0,.333]},9180:m,9181:h,9182:M,9183:x,9184:{dir:t.H,stretch:[714,713,715],HDW:[.59,-.544,.5],min:1},9185:{dir:t.H,stretch:[715,713,714],HDW:[.59,-.544,.5],min:1},9472:a,10072:p,10216:H,10217:_,10222:{dir:t.V,sizes:[.989],stretch:[9127,9130,9129],HDW:[.75,.25,.889]},10223:{dir:t.V,sizes:[.989],stretch:[9131,9130,9133],HDW:[.75,.25,.889]},10229:S,10230:l,10231:n,10232:u,10233:k,10234:I,10235:B,10236:d,10237:E,10238:y,10502:E,10503:y,10574:{dir:t.H,stretch:[8636,8722,8640],HDW:f.HDW3,min:2},10575:{dir:t.V,stretch:[8638,9168,8642],HDW:f.HDW1,min:1.776},10576:{dir:t.H,stretch:[8637,8722,8641],HDW:f.HDW3,min:2},10577:{dir:t.V,stretch:[8639,9168,8643],HDW:f.HDW1,min:.5},10586:{dir:t.H,stretch:[8636,8722,8739],HDW:f.HDW3,min:1.278},10587:{dir:t.H,stretch:[8739,8722,8640],HDW:f.HDW3,min:1.278},10588:{dir:t.V,stretch:[8638,9168,8869],HDW:f.HDW1,min:1.556},10589:{dir:t.V,stretch:[8868,9168,8642],HDW:f.HDW1,min:1.556},10590:{dir:t.H,stretch:[8637,8722,8739],HDW:f.HDW3,min:1.278},10591:{dir:t.H,stretch:[8739,8722,8641],HDW:f.HDW3,min:1.278},10592:{dir:t.V,stretch:[8639,9168,8869],HDW:f.HDW1,min:1.776},10593:{dir:t.V,stretch:[8868,9168,8643],HDW:f.HDW1,min:1.776},12296:H,12297:_,65079:M,65080:x}},5674:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.doubleStruck=void 0,f.doubleStruck={}},7002:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.frakturBold=void 0,f.frakturBold={33:[.689,.012,.349],34:[.695,-.432,.254],38:[.696,.016,.871],39:[.695,-.436,.25],40:[.737,.186,.459],41:[.735,.187,.459],42:[.692,-.449,.328],43:[.598,.082,.893],44:[.107,.191,.328],45:[.275,-.236,.893],46:[.102,.015,.328],47:[.721,.182,.593],48:[.501,.012,.593],49:[.489,0,.593],50:[.491,0,.593],51:[.487,.193,.593],52:[.495,.196,.593],53:[.481,.19,.593],54:[.704,.012,.593],55:[.479,.197,.593],56:[.714,.005,.593],57:[.487,.195,.593],58:[.457,.012,.255],59:[.458,.19,.255],61:[.343,-.168,.582],63:[.697,.014,.428],91:[.74,.13,.257],93:[.738,.132,.257],94:[.734,-.452,.59],8216:[.708,-.411,.254],8217:[.692,-.394,.254],8260:[.721,.182,.593],58113:[.63,.027,.587],58114:[.693,.212,.394,{ic:.014}],58115:[.681,.219,.387],58116:[.473,.212,.593],58117:[.684,.027,.393],58120:[.679,.22,.981],58121:[.717,.137,.727]}},9349:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.fraktur=void 0,f.fraktur={33:[.689,.012,.296],34:[.695,-.432,.215],38:[.698,.011,.738],39:[.695,-.436,.212],40:[.737,.186,.389],41:[.735,.187,.389],42:[.692,-.449,.278],43:[.598,.082,.756],44:[.107,.191,.278],45:[.275,-.236,.756],46:[.102,.015,.278],47:[.721,.182,.502],48:[.492,.013,.502],49:[.468,0,.502],50:[.474,0,.502],51:[.473,.182,.502],52:[.476,.191,.502],53:[.458,.184,.502],54:[.7,.013,.502],55:[.468,.181,.502],56:[.705,.01,.502],57:[.469,.182,.502],58:[.457,.012,.216],59:[.458,.189,.216],61:[.368,-.132,.756],63:[.693,.011,.362],91:[.74,.13,.278],93:[.738,.131,.278],94:[.734,-.452,.5],8216:[.708,-.41,.215],8217:[.692,-.395,.215],8260:[.721,.182,.502],58112:[.683,.032,.497],58113:[.616,.03,.498],58114:[.68,.215,.333],58115:[.679,.224,.329],58116:[.471,.214,.503],58117:[.686,.02,.333],58118:[.577,.021,.334,{ic:.013}],58119:[.475,.022,.501,{ic:.013}]}},9741:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.italic=void 0,f.italic={33:[.716,0,.307,{ic:.073}],34:[.694,-.379,.514,{ic:.024}],35:[.694,.194,.818,{ic:.01}],37:[.75,.056,.818,{ic:.029}],38:[.716,.022,.767,{ic:.035}],39:[.694,-.379,.307,{ic:.07}],40:[.75,.25,.409,{ic:.108}],41:[.75,.25,.409],42:[.75,-.32,.511,{ic:.073}],43:[.557,.057,.767],44:[.121,.194,.307],45:[.251,-.18,.358],46:[.121,0,.307],47:[.716,.215,.778],48:[.665,.021,.511,{ic:.051}],49:[.666,0,.511],50:[.666,.022,.511,{ic:.04}],51:[.666,.022,.511,{ic:.051}],52:[.666,.194,.511],53:[.666,.022,.511,{ic:.056}],54:[.665,.022,.511,{ic:.054}],55:[.666,.022,.511,{ic:.123}],56:[.666,.021,.511,{ic:.042}],57:[.666,.022,.511,{ic:.042}],58:[.431,0,.307],59:[.431,.194,.307],61:[.367,-.133,.767],63:[.716,0,.511,{ic:.04}],64:[.705,.011,.767,{ic:.022}],91:[.75,.25,.307,{ic:.139}],93:[.75,.25,.307,{ic:.052}],94:[.694,-.527,.511,{ic:.017}],95:[-.025,.062,.511,{ic:.043}],126:[.318,-.208,.511,{ic:.06}],305:[.441,.01,.307,{ic:.033}],567:[.442,.204,.332],768:[.697,-.5,0],769:[.697,-.5,0,{ic:.039}],770:[.694,-.527,0,{ic:.017}],771:[.668,-.558,0,{ic:.06}],772:[.589,-.544,0,{ic:.054}],774:[.694,-.515,0,{ic:.062}],775:[.669,-.548,0],776:[.669,-.554,0,{ic:.045}],778:[.716,-.542,0],779:[.697,-.503,0,{ic:.065}],780:[.638,-.502,0,{ic:.029}],989:[.605,.085,.778],8211:[.285,-.248,.511,{ic:.043}],8212:[.285,-.248,1.022,{ic:.016}],8213:[.285,-.248,1.022,{ic:.016}],8215:[-.025,.062,.511,{ic:.043}],8216:[.694,-.379,.307,{ic:.055}],8217:[.694,-.379,.307,{ic:.07}],8220:[.694,-.379,.514,{ic:.092}],8221:[.694,-.379,.514,{ic:.024}],8260:[.716,.215,.778],8463:[.695,.013,.54,{ic:.022}],8710:[.716,0,.833,{sk:.167}],10744:[.716,.215,.778]}},2827:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.largeop=void 0,f.largeop={40:[1.15,.649,.597],41:[1.15,.649,.597],47:[1.15,.649,.811],91:[1.15,.649,.472],92:[1.15,.649,.811],93:[1.15,.649,.472],123:[1.15,.649,.667],125:[1.15,.649,.667],710:[.772,-.565,1],732:[.75,-.611,1],770:[.772,-.565,0],771:[.75,-.611,0],8214:[.602,0,.778],8260:[1.15,.649,.811],8593:[.6,0,.667],8595:[.6,0,.667],8657:[.599,0,.778],8659:[.6,0,.778],8719:[.95,.45,1.278],8720:[.95,.45,1.278],8721:[.95,.45,1.444],8730:[1.15,.65,1,{ic:.02}],8739:[.627,.015,.333],8741:[.627,.015,.556],8747:[1.36,.862,.556,{ic:.388}],8748:[1.36,.862,1.084,{ic:.388}],8749:[1.36,.862,1.592,{ic:.388}],8750:[1.36,.862,.556,{ic:.388}],8896:[.95,.45,1.111],8897:[.95,.45,1.111],8898:[.949,.45,1.111],8899:[.95,.449,1.111],8968:[1.15,.649,.528],8969:[1.15,.649,.528],8970:[1.15,.649,.528],8971:[1.15,.649,.528],9001:[1.15,.649,.611],9002:[1.15,.649,.611],9168:[.602,0,.667],10072:[.627,.015,.333],10216:[1.15,.649,.611],10217:[1.15,.649,.611],10752:[.949,.449,1.511],10753:[.949,.449,1.511],10754:[.949,.449,1.511],10756:[.95,.449,1.111],10758:[.95,.45,1.111],10764:[1.36,.862,2.168,{ic:.388}],12296:[1.15,.649,.611],12297:[1.15,.649,.611]}},2970:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.monospace=void 0,f.monospace={32:[0,0,.525],33:[.622,0,.525],34:[.623,-.333,.525],35:[.611,0,.525],36:[.694,.082,.525],37:[.694,.083,.525],38:[.622,.011,.525],39:[.611,-.287,.525],40:[.694,.082,.525],41:[.694,.082,.525],42:[.52,-.09,.525],43:[.531,-.081,.525],44:[.14,.139,.525],45:[.341,-.271,.525],46:[.14,0,.525],47:[.694,.083,.525],58:[.431,0,.525],59:[.431,.139,.525],60:[.557,-.055,.525],61:[.417,-.195,.525],62:[.557,-.055,.525],63:[.617,0,.525],64:[.617,.006,.525],91:[.694,.082,.525],92:[.694,.083,.525],93:[.694,.082,.525],94:[.611,-.46,.525],95:[-.025,.095,.525],96:[.681,-.357,.525],123:[.694,.083,.525],124:[.694,.082,.525],125:[.694,.083,.525],126:[.611,-.466,.525],127:[.612,-.519,.525],160:[0,0,.525],305:[.431,0,.525],567:[.431,.228,.525],697:[.623,-.334,.525],768:[.611,-.485,0],769:[.611,-.485,0],770:[.611,-.46,0],771:[.611,-.466,0],772:[.577,-.5,0],774:[.611,-.504,0],776:[.612,-.519,0],778:[.619,-.499,0],780:[.577,-.449,0],913:[.623,0,.525],914:[.611,0,.525],915:[.611,0,.525],916:[.623,0,.525],917:[.611,0,.525],918:[.611,0,.525],919:[.611,0,.525],920:[.621,.01,.525],921:[.611,0,.525],922:[.611,0,.525],923:[.623,0,.525],924:[.611,0,.525],925:[.611,0,.525],926:[.611,0,.525],927:[.621,.01,.525],928:[.611,0,.525],929:[.611,0,.525],931:[.611,0,.525],932:[.611,0,.525],933:[.622,0,.525],934:[.611,0,.525],935:[.611,0,.525],936:[.611,0,.525],937:[.622,0,.525],8215:[-.025,.095,.525],8242:[.623,-.334,.525],8243:[.623,0,1.05],8244:[.623,0,1.575],8260:[.694,.083,.525],8279:[.623,0,2.1],8710:[.623,0,.525]}},1668:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.normal=void 0,f.normal={32:[0,0,.25],33:[.716,0,.278],34:[.694,-.379,.5],35:[.694,.194,.833],36:[.75,.056,.5],37:[.75,.056,.833],38:[.716,.022,.778],39:[.694,-.379,.278],40:[.75,.25,.389],41:[.75,.25,.389],42:[.75,-.32,.5],43:[.583,.082,.778],44:[.121,.194,.278],45:[.252,-.179,.333],46:[.12,0,.278],47:[.75,.25,.5],48:[.666,.022,.5],49:[.666,0,.5],50:[.666,0,.5],51:[.665,.022,.5],52:[.677,0,.5],53:[.666,.022,.5],54:[.666,.022,.5],55:[.676,.022,.5],56:[.666,.022,.5],57:[.666,.022,.5],58:[.43,0,.278],59:[.43,.194,.278],60:[.54,.04,.778],61:[.583,.082,.778],62:[.54,.04,.778],63:[.705,0,.472],64:[.705,.011,.778],65:[.716,0,.75],66:[.683,0,.708],67:[.705,.021,.722],68:[.683,0,.764],69:[.68,0,.681],70:[.68,0,.653],71:[.705,.022,.785],72:[.683,0,.75],73:[.683,0,.361],74:[.683,.022,.514],75:[.683,0,.778],76:[.683,0,.625],77:[.683,0,.917],78:[.683,0,.75],79:[.705,.022,.778],80:[.683,0,.681],81:[.705,.193,.778],82:[.683,.022,.736],83:[.705,.022,.556],84:[.677,0,.722],85:[.683,.022,.75],86:[.683,.022,.75],87:[.683,.022,1.028],88:[.683,0,.75],89:[.683,0,.75],90:[.683,0,.611],91:[.75,.25,.278],92:[.75,.25,.5],93:[.75,.25,.278],94:[.694,-.531,.5],95:[-.025,.062,.5],96:[.699,-.505,.5],97:[.448,.011,.5],98:[.694,.011,.556],99:[.448,.011,.444],100:[.694,.011,.556],101:[.448,.011,.444],102:[.705,0,.306,{ic:.066}],103:[.453,.206,.5],104:[.694,0,.556],105:[.669,0,.278],106:[.669,.205,.306],107:[.694,0,.528],108:[.694,0,.278],109:[.442,0,.833],110:[.442,0,.556],111:[.448,.01,.5],112:[.442,.194,.556],113:[.442,.194,.528],114:[.442,0,.392],115:[.448,.011,.394],116:[.615,.01,.389],117:[.442,.011,.556],118:[.431,.011,.528],119:[.431,.011,.722],120:[.431,0,.528],121:[.431,.204,.528],122:[.431,0,.444],123:[.75,.25,.5],124:[.75,.249,.278],125:[.75,.25,.5],126:[.318,-.215,.5],160:[0,0,.25],163:[.714,.011,.769],165:[.683,0,.75],168:[.669,-.554,.5],172:[.356,-.089,.667],174:[.709,.175,.947],175:[.59,-.544,.5],176:[.715,-.542,.5],177:[.666,0,.778],180:[.699,-.505,.5],183:[.31,-.19,.278],215:[.491,-.009,.778],240:[.749,.021,.556],247:[.537,.036,.778],305:[.442,0,.278,{sk:.0278}],567:[.442,.205,.306,{sk:.0833}],697:[.56,-.043,.275],710:[.694,-.531,.5],711:[.644,-.513,.5],713:[.59,-.544,.5],714:[.699,-.505,.5],715:[.699,-.505,.5],728:[.694,-.515,.5],729:[.669,-.549,.5],730:[.715,-.542,.5],732:[.668,-.565,.5],768:[.699,-.505,0],769:[.699,-.505,0],770:[.694,-.531,0],771:[.668,-.565,0],772:[.59,-.544,0],774:[.694,-.515,0],775:[.669,-.549,0],776:[.669,-.554,0],778:[.715,-.542,0],779:[.701,-.51,0],780:[.644,-.513,0],824:[.716,.215,0],913:[.716,0,.75],914:[.683,0,.708],915:[.68,0,.625],916:[.716,0,.833],917:[.68,0,.681],918:[.683,0,.611],919:[.683,0,.75],920:[.705,.022,.778],921:[.683,0,.361],922:[.683,0,.778],923:[.716,0,.694],924:[.683,0,.917],925:[.683,0,.75],926:[.677,0,.667],927:[.705,.022,.778],928:[.68,0,.75],929:[.683,0,.681],931:[.683,0,.722],932:[.677,0,.722],933:[.705,0,.778],934:[.683,0,.722],935:[.683,0,.75],936:[.683,0,.778],937:[.704,0,.722],8192:[0,0,.5],8193:[0,0,1],8194:[0,0,.5],8195:[0,0,1],8196:[0,0,.333],8197:[0,0,.25],8198:[0,0,.167],8201:[0,0,.167],8202:[0,0,.1],8203:[0,0,0],8204:[0,0,0],8211:[.285,-.248,.5],8212:[.285,-.248,1],8213:[.285,-.248,1],8214:[.75,.25,.5],8215:[-.025,.062,.5],8216:[.694,-.379,.278],8217:[.694,-.379,.278],8220:[.694,-.379,.5],8221:[.694,-.379,.5],8224:[.705,.216,.444],8225:[.705,.205,.444],8226:[.444,-.055,.5],8230:[.12,0,1.172],8242:[.56,-.043,.275],8243:[.56,0,.55],8244:[.56,0,.825],8245:[.56,-.043,.275],8246:[.56,0,.55],8247:[.56,0,.825],8254:[.59,-.544,.5],8260:[.75,.25,.5],8279:[.56,0,1.1],8288:[0,0,0],8289:[0,0,0],8290:[0,0,0],8291:[0,0,0],8292:[0,0,0],8407:[.714,-.516,.5],8450:[.702,.019,.722],8459:[.717,.036,.969,{ic:.272,sk:.333}],8460:[.666,.133,.72],8461:[.683,0,.778],8462:[.694,.011,.576,{sk:-.0278}],8463:[.695,.013,.54,{ic:.022}],8464:[.717,.017,.809,{ic:.137,sk:.333}],8465:[.686,.026,.554],8466:[.717,.017,.874,{ic:.161,sk:.306}],8467:[.705,.02,.417,{sk:.111}],8469:[.683,.02,.722],8472:[.453,.216,.636,{sk:.111}],8473:[.683,0,.611],8474:[.701,.181,.778],8475:[.717,.017,.85,{ic:.037,sk:.194}],8476:[.686,.026,.828],8477:[.683,0,.722],8484:[.683,0,.667],8486:[.704,0,.722],8487:[.684,.022,.722],8488:[.729,.139,.602],8492:[.708,.028,.908,{ic:.02,sk:.194}],8493:[.685,.024,.613],8496:[.707,.008,.562,{ic:.156,sk:.139}],8497:[.735,.036,.895,{ic:.095,sk:.222}],8498:[.695,0,.556],8499:[.721,.05,1.08,{ic:.136,sk:.444}],8501:[.694,0,.611],8502:[.763,.021,.667,{ic:.02}],8503:[.764,.043,.444],8504:[.764,.043,.667],8513:[.705,.023,.639],8592:[.511,.011,1],8593:[.694,.193,.5],8594:[.511,.011,1],8595:[.694,.194,.5],8596:[.511,.011,1],8597:[.772,.272,.5],8598:[.72,.195,1],8599:[.72,.195,1],8600:[.695,.22,1],8601:[.695,.22,1],8602:[.437,-.06,1],8603:[.437,-.06,1],8606:[.417,-.083,1],8608:[.417,-.083,1],8610:[.417,-.083,1.111],8611:[.417,-.083,1.111],8614:[.511,.011,1],8617:[.511,.011,1.126],8618:[.511,.011,1.126],8619:[.575,.041,1],8620:[.575,.041,1],8621:[.417,-.083,1.389],8622:[.437,-.06,1],8624:[.722,0,.5],8625:[.722,0,.5],8630:[.461,0,1],8631:[.46,0,1],8634:[.65,.083,.778],8635:[.65,.083,.778],8636:[.511,-.23,1],8637:[.27,.011,1],8638:[.694,.194,.417],8639:[.694,.194,.417],8640:[.511,-.23,1],8641:[.27,.011,1],8642:[.694,.194,.417],8643:[.694,.194,.417],8644:[.667,0,1],8646:[.667,0,1],8647:[.583,.083,1],8648:[.694,.193,.833],8649:[.583,.083,1],8650:[.694,.194,.833],8651:[.514,.014,1],8652:[.671,.011,1],8653:[.534,.035,1],8654:[.534,.037,1],8655:[.534,.035,1],8656:[.525,.024,1],8657:[.694,.194,.611],8658:[.525,.024,1],8659:[.694,.194,.611],8660:[.526,.025,1],8661:[.772,.272,.611],8666:[.611,.111,1],8667:[.611,.111,1],8669:[.417,-.083,1],8672:[.437,-.064,1.334],8674:[.437,-.064,1.334],8704:[.694,.022,.556],8705:[.846,.021,.5],8706:[.715,.022,.531,{ic:.035,sk:.0833}],8707:[.694,0,.556],8708:[.716,.215,.556],8709:[.772,.078,.5],8710:[.716,0,.833],8711:[.683,.033,.833],8712:[.54,.04,.667],8713:[.716,.215,.667],8715:[.54,.04,.667],8716:[.716,.215,.667],8717:[.44,0,.429,{ic:.027}],8719:[.75,.25,.944],8720:[.75,.25,.944],8721:[.75,.25,1.056],8722:[.583,.082,.778],8723:[.5,.166,.778],8724:[.766,.093,.778],8725:[.75,.25,.5],8726:[.75,.25,.5],8727:[.465,-.035,.5],8728:[.444,-.055,.5],8729:[.444,-.055,.5],8730:[.8,.2,.833,{ic:.02}],8733:[.442,.011,.778],8734:[.442,.011,1],8736:[.694,0,.722],8737:[.714,.02,.722],8738:[.551,.051,.722],8739:[.75,.249,.278],8740:[.75,.252,.278,{ic:.019}],8741:[.75,.25,.5],8742:[.75,.25,.5,{ic:.018}],8743:[.598,.022,.667],8744:[.598,.022,.667],8745:[.598,.022,.667],8746:[.598,.022,.667],8747:[.716,.216,.417,{ic:.055}],8748:[.805,.306,.819,{ic:.138}],8749:[.805,.306,1.166,{ic:.138}],8750:[.805,.306,.472,{ic:.138}],8756:[.471,.082,.667],8757:[.471,.082,.667],8764:[.367,-.133,.778],8765:[.367,-.133,.778],8768:[.583,.083,.278],8769:[.467,-.032,.778],8770:[.463,-.034,.778],8771:[.464,-.036,.778],8772:[.716,.215,.778],8773:[.589,-.022,.778],8775:[.652,.155,.778],8776:[.483,-.055,.778],8777:[.716,.215,.778],8778:[.579,.039,.778],8781:[.484,-.016,.778],8782:[.492,-.008,.778],8783:[.492,-.133,.778],8784:[.67,-.133,.778],8785:[.609,.108,.778],8786:[.601,.101,.778],8787:[.601,.102,.778],8790:[.367,-.133,.778],8791:[.721,-.133,.778],8796:[.859,-.133,.778],8800:[.716,.215,.778],8801:[.464,-.036,.778],8802:[.716,.215,.778],8804:[.636,.138,.778],8805:[.636,.138,.778],8806:[.753,.175,.778],8807:[.753,.175,.778],8808:[.752,.286,.778],8809:[.752,.286,.778],8810:[.568,.067,1],8811:[.567,.067,1],8812:[.75,.25,.5],8813:[.716,.215,.778],8814:[.708,.209,.778],8815:[.708,.209,.778],8816:[.801,.303,.778],8817:[.801,.303,.778],8818:[.732,.228,.778],8819:[.732,.228,.778],8820:[.732,.228,.778],8821:[.732,.228,.778],8822:[.681,.253,.778],8823:[.681,.253,.778],8824:[.716,.253,.778],8825:[.716,.253,.778],8826:[.539,.041,.778],8827:[.539,.041,.778],8828:[.58,.153,.778],8829:[.58,.154,.778],8830:[.732,.228,.778],8831:[.732,.228,.778],8832:[.705,.208,.778],8833:[.705,.208,.778],8834:[.54,.04,.778],8835:[.54,.04,.778],8836:[.716,.215,.778],8837:[.716,.215,.778],8838:[.636,.138,.778],8839:[.636,.138,.778],8840:[.801,.303,.778],8841:[.801,.303,.778],8842:[.635,.241,.778],8843:[.635,.241,.778],8846:[.598,.022,.667],8847:[.539,.041,.778],8848:[.539,.041,.778],8849:[.636,.138,.778],8850:[.636,.138,.778],8851:[.598,0,.667],8852:[.598,0,.667],8853:[.583,.083,.778],8854:[.583,.083,.778],8855:[.583,.083,.778],8856:[.583,.083,.778],8857:[.583,.083,.778],8858:[.582,.082,.778],8859:[.582,.082,.778],8861:[.582,.082,.778],8862:[.689,0,.778],8863:[.689,0,.778],8864:[.689,0,.778],8865:[.689,0,.778],8866:[.694,0,.611],8867:[.694,0,.611],8868:[.668,0,.778],8869:[.668,0,.778],8872:[.75,.249,.867],8873:[.694,0,.722],8874:[.694,0,.889],8876:[.695,0,.611],8877:[.695,0,.611],8878:[.695,0,.722],8879:[.695,0,.722],8882:[.539,.041,.778],8883:[.539,.041,.778],8884:[.636,.138,.778],8885:[.636,.138,.778],8888:[.408,-.092,1.111],8890:[.431,.212,.556],8891:[.716,0,.611],8892:[.716,0,.611],8896:[.75,.249,.833],8897:[.75,.249,.833],8898:[.75,.249,.833],8899:[.75,.249,.833],8900:[.488,-.012,.5],8901:[.31,-.19,.278],8902:[.486,-.016,.5],8903:[.545,.044,.778],8904:[.505,.005,.9],8905:[.492,-.008,.778],8906:[.492,-.008,.778],8907:[.694,.022,.778],8908:[.694,.022,.778],8909:[.464,-.036,.778],8910:[.578,.021,.76],8911:[.578,.022,.76],8912:[.54,.04,.778],8913:[.54,.04,.778],8914:[.598,.022,.667],8915:[.598,.022,.667],8916:[.736,.022,.667],8918:[.541,.041,.778],8919:[.541,.041,.778],8920:[.568,.067,1.333],8921:[.568,.067,1.333],8922:[.886,.386,.778],8923:[.886,.386,.778],8926:[.734,0,.778],8927:[.734,0,.778],8928:[.801,.303,.778],8929:[.801,.303,.778],8930:[.716,.215,.778],8931:[.716,.215,.778],8934:[.73,.359,.778],8935:[.73,.359,.778],8936:[.73,.359,.778],8937:[.73,.359,.778],8938:[.706,.208,.778],8939:[.706,.208,.778],8940:[.802,.303,.778],8941:[.801,.303,.778],8942:[1.3,.03,.278],8943:[.31,-.19,1.172],8945:[1.52,-.1,1.282],8965:[.716,0,.611],8966:[.813,.097,.611],8968:[.75,.25,.444],8969:[.75,.25,.444],8970:[.75,.25,.444],8971:[.75,.25,.444],8988:[.694,-.306,.5],8989:[.694,-.306,.5],8990:[.366,.022,.5],8991:[.366,.022,.5],8994:[.388,-.122,1],8995:[.378,-.134,1],9001:[.75,.25,.389],9002:[.75,.25,.389],9136:[.744,.244,.412],9137:[.744,.244,.412],9168:[.602,0,.667],9416:[.709,.175,.902],9484:[.694,-.306,.5],9488:[.694,-.306,.5],9492:[.366,.022,.5],9496:[.366,.022,.5],9585:[.694,.195,.889],9586:[.694,.195,.889],9632:[.689,0,.778],9633:[.689,0,.778],9642:[.689,0,.778],9650:[.575,.02,.722],9651:[.716,0,.889],9652:[.575,.02,.722],9653:[.716,0,.889],9654:[.539,.041,.778],9656:[.539,.041,.778],9657:[.505,.005,.5],9660:[.576,.019,.722],9661:[.5,.215,.889],9662:[.576,.019,.722],9663:[.5,.215,.889],9664:[.539,.041,.778],9666:[.539,.041,.778],9667:[.505,.005,.5],9674:[.716,.132,.667],9711:[.715,.215,1],9723:[.689,0,.778],9724:[.689,0,.778],9733:[.694,.111,.944],9824:[.727,.13,.778],9825:[.716,.033,.778],9826:[.727,.162,.778],9827:[.726,.13,.778],9837:[.75,.022,.389],9838:[.734,.223,.389],9839:[.723,.223,.389],10003:[.706,.034,.833],10016:[.716,.022,.833],10072:[.75,.249,.278],10216:[.75,.25,.389],10217:[.75,.25,.389],10222:[.744,.244,.412],10223:[.744,.244,.412],10229:[.511,.011,1.609],10230:[.511,.011,1.638],10231:[.511,.011,1.859],10232:[.525,.024,1.609],10233:[.525,.024,1.638],10234:[.525,.024,1.858],10236:[.511,.011,1.638],10731:[.716,.132,.667],10744:[.716,.215,.778],10752:[.75,.25,1.111],10753:[.75,.25,1.111],10754:[.75,.25,1.111],10756:[.75,.249,.833],10758:[.75,.249,.833],10764:[.805,.306,1.638,{ic:.138}],10799:[.491,-.009,.778],10815:[.683,0,.75],10846:[.813,.097,.611],10877:[.636,.138,.778],10878:[.636,.138,.778],10885:[.762,.29,.778],10886:[.762,.29,.778],10887:[.635,.241,.778],10888:[.635,.241,.778],10889:[.761,.387,.778],10890:[.761,.387,.778],10891:[1.003,.463,.778],10892:[1.003,.463,.778],10901:[.636,.138,.778],10902:[.636,.138,.778],10927:[.636,.138,.778],10928:[.636,.138,.778],10933:[.752,.286,.778],10934:[.752,.286,.778],10935:[.761,.294,.778],10936:[.761,.294,.778],10937:[.761,.337,.778],10938:[.761,.337,.778],10949:[.753,.215,.778],10950:[.753,.215,.778],10955:[.783,.385,.778],10956:[.783,.385,.778],12296:[.75,.25,.389],12297:[.75,.25,.389],57350:[.43,.023,.222,{ic:.018}],57351:[.431,.024,.389,{ic:.018}],57352:[.605,.085,.778],57353:[.434,.006,.667,{ic:.067}],57356:[.752,.284,.778],57357:[.752,.284,.778],57358:[.919,.421,.778],57359:[.801,.303,.778],57360:[.801,.303,.778],57361:[.919,.421,.778],57366:[.828,.33,.778],57367:[.752,.332,.778],57368:[.828,.33,.778],57369:[.752,.333,.778],57370:[.634,.255,.778],57371:[.634,.254,.778],119808:[.698,0,.869],119809:[.686,0,.818],119810:[.697,.011,.831],119811:[.686,0,.882],119812:[.68,0,.756],119813:[.68,0,.724],119814:[.697,.01,.904],119815:[.686,0,.9],119816:[.686,0,.436],119817:[.686,.011,.594],119818:[.686,0,.901],119819:[.686,0,.692],119820:[.686,0,1.092],119821:[.686,0,.9],119822:[.696,.01,.864],119823:[.686,0,.786],119824:[.696,.193,.864],119825:[.686,.011,.862],119826:[.697,.011,.639],119827:[.675,0,.8],119828:[.686,.011,.885],119829:[.686,.007,.869],119830:[.686,.007,1.189],119831:[.686,0,.869],119832:[.686,0,.869],119833:[.686,0,.703],119834:[.453,.006,.559],119835:[.694,.006,.639],119836:[.453,.006,.511],119837:[.694,.006,.639],119838:[.452,.006,.527],119839:[.7,0,.351,{ic:.101}],119840:[.455,.201,.575],119841:[.694,0,.639],119842:[.695,0,.319],119843:[.695,.2,.351],119844:[.694,0,.607],119845:[.694,0,.319],119846:[.45,0,.958],119847:[.45,0,.639],119848:[.452,.005,.575],119849:[.45,.194,.639],119850:[.45,.194,.607],119851:[.45,0,.474],119852:[.453,.006,.454],119853:[.635,.005,.447],119854:[.45,.006,.639],119855:[.444,0,.607],119856:[.444,0,.831],119857:[.444,0,.607],119858:[.444,.2,.607],119859:[.444,0,.511],119860:[.716,0,.75,{sk:.139}],119861:[.683,0,.759,{sk:.0833}],119862:[.705,.022,.715,{ic:.045,sk:.0833}],119863:[.683,0,.828,{sk:.0556}],119864:[.68,0,.738,{ic:.026,sk:.0833}],119865:[.68,0,.643,{ic:.106,sk:.0833}],119866:[.705,.022,.786,{sk:.0833}],119867:[.683,0,.831,{ic:.057,sk:.0556}],119868:[.683,0,.44,{ic:.064,sk:.111}],119869:[.683,.022,.555,{ic:.078,sk:.167}],119870:[.683,0,.849,{ic:.04,sk:.0556}],119871:[.683,0,.681,{sk:.0278}],119872:[.683,0,.97,{ic:.081,sk:.0833}],119873:[.683,0,.803,{ic:.085,sk:.0833}],119874:[.704,.022,.763,{sk:.0833}],119875:[.683,0,.642,{ic:.109,sk:.0833}],119876:[.704,.194,.791,{sk:.0833}],119877:[.683,.021,.759,{sk:.0833}],119878:[.705,.022,.613,{ic:.032,sk:.0833}],119879:[.677,0,.584,{ic:.12,sk:.0833}],119880:[.683,.022,.683,{ic:.084,sk:.0278}],119881:[.683,.022,.583,{ic:.186}],119882:[.683,.022,.944,{ic:.104}],119883:[.683,0,.828,{ic:.024,sk:.0833}],119884:[.683,0,.581,{ic:.182}],119885:[.683,0,.683,{ic:.04,sk:.0833}],119886:[.441,.01,.529],119887:[.694,.011,.429],119888:[.442,.011,.433,{sk:.0556}],119889:[.694,.01,.52,{sk:.167}],119890:[.442,.011,.466,{sk:.0556}],119891:[.705,.205,.49,{ic:.06,sk:.167}],119892:[.442,.205,.477,{sk:.0278}],119894:[.661,.011,.345],119895:[.661,.204,.412],119896:[.694,.011,.521],119897:[.694,.011,.298,{sk:.0833}],119898:[.442,.011,.878],119899:[.442,.011,.6],119900:[.441,.011,.485,{sk:.0556}],119901:[.442,.194,.503,{sk:.0833}],119902:[.442,.194,.446,{ic:.014,sk:.0833}],119903:[.442,.011,.451,{sk:.0556}],119904:[.442,.01,.469,{sk:.0556}],119905:[.626,.011,.361,{sk:.0833}],119906:[.442,.011,.572,{sk:.0278}],119907:[.443,.011,.485,{sk:.0278}],119908:[.443,.011,.716,{sk:.0833}],119909:[.442,.011,.572,{sk:.0278}],119910:[.442,.205,.49,{sk:.0556}],119911:[.442,.011,.465,{sk:.0556}],119912:[.711,0,.869,{sk:.16}],119913:[.686,0,.866,{sk:.0958}],119914:[.703,.017,.817,{ic:.038,sk:.0958}],119915:[.686,0,.938,{sk:.0639}],119916:[.68,0,.81,{ic:.015,sk:.0958}],119917:[.68,0,.689,{ic:.12,sk:.0958}],119918:[.703,.016,.887,{sk:.0958}],119919:[.686,0,.982,{ic:.045,sk:.0639}],119920:[.686,0,.511,{ic:.062,sk:.128}],119921:[.686,.017,.631,{ic:.063,sk:.192}],119922:[.686,0,.971,{ic:.032,sk:.0639}],119923:[.686,0,.756,{sk:.0319}],119924:[.686,0,1.142,{ic:.077,sk:.0958}],119925:[.686,0,.95,{ic:.077,sk:.0958}],119926:[.703,.017,.837,{sk:.0958}],119927:[.686,0,.723,{ic:.124,sk:.0958}],119928:[.703,.194,.869,{sk:.0958}],119929:[.686,.017,.872,{sk:.0958}],119930:[.703,.017,.693,{ic:.021,sk:.0958}],119931:[.675,0,.637,{ic:.135,sk:.0958}],119932:[.686,.016,.8,{ic:.077,sk:.0319}],119933:[.686,.016,.678,{ic:.208}],119934:[.686,.017,1.093,{ic:.114}],119935:[.686,0,.947,{sk:.0958}],119936:[.686,0,.675,{ic:.201}],119937:[.686,0,.773,{ic:.032,sk:.0958}],119938:[.452,.008,.633],119939:[.694,.008,.521],119940:[.451,.008,.513,{sk:.0639}],119941:[.694,.008,.61,{sk:.192}],119942:[.452,.008,.554,{sk:.0639}],119943:[.701,.201,.568,{ic:.056,sk:.192}],119944:[.452,.202,.545,{sk:.0319}],119945:[.694,.008,.668,{sk:-.0319}],119946:[.694,.008,.405],119947:[.694,.202,.471],119948:[.694,.008,.604],119949:[.694,.008,.348,{sk:.0958}],119950:[.452,.008,1.032],119951:[.452,.008,.713],119952:[.452,.008,.585,{sk:.0639}],119953:[.452,.194,.601,{sk:.0958}],119954:[.452,.194,.542,{sk:.0958}],119955:[.452,.008,.529,{sk:.0639}],119956:[.451,.008,.531,{sk:.0639}],119957:[.643,.007,.415,{sk:.0958}],119958:[.452,.008,.681,{sk:.0319}],119959:[.453,.008,.567,{sk:.0319}],119960:[.453,.008,.831,{sk:.0958}],119961:[.452,.008,.659,{sk:.0319}],119962:[.452,.202,.59,{sk:.0639}],119963:[.452,.008,.555,{sk:.0639}],119964:[.717,.008,.803,{ic:.213,sk:.389}],119966:[.728,.026,.666,{ic:.153,sk:.278}],119967:[.708,.031,.774,{ic:.081,sk:.111}],119970:[.717,.037,.61,{ic:.128,sk:.25}],119973:[.717,.314,1.052,{ic:.081,sk:.417}],119974:[.717,.037,.914,{ic:.29,sk:.361}],119977:[.726,.036,.902,{ic:.306,sk:.389}],119978:[.707,.008,.738,{ic:.067,sk:.167}],119979:[.716,.037,1.013,{ic:.018,sk:.222}],119980:[.717,.017,.883,{sk:.278}],119982:[.708,.036,.868,{ic:.148,sk:.333}],119983:[.735,.037,.747,{ic:.249,sk:.222}],119984:[.717,.017,.8,{ic:.16,sk:.25}],119985:[.717,.017,.622,{ic:.228,sk:.222}],119986:[.717,.017,.805,{ic:.221,sk:.25}],119987:[.717,.017,.944,{ic:.187,sk:.278}],119988:[.716,.017,.71,{ic:.249,sk:.194}],119989:[.717,.016,.821,{ic:.211,sk:.306}],120068:[.696,.026,.718],120069:[.691,.027,.884],120071:[.685,.027,.832],120072:[.685,.024,.663],120073:[.686,.153,.611],120074:[.69,.026,.785],120077:[.686,.139,.552],120078:[.68,.027,.668,{ic:.014}],120079:[.686,.026,.666],120080:[.692,.027,1.05],120081:[.686,.025,.832],120082:[.729,.027,.827],120083:[.692,.218,.828],120084:[.729,.069,.827],120086:[.692,.027,.829],120087:[.701,.027,.669],120088:[.697,.027,.646,{ic:.019}],120089:[.686,.026,.831],120090:[.686,.027,1.046],120091:[.688,.027,.719],120092:[.686,.218,.833],120094:[.47,.035,.5],120095:[.685,.031,.513],120096:[.466,.029,.389],120097:[.609,.033,.499],120098:[.467,.03,.401],120099:[.681,.221,.326],120100:[.47,.209,.504],120101:[.688,.205,.521],120102:[.673,.02,.279],120103:[.672,.208,.281],120104:[.689,.025,.389],120105:[.685,.02,.28],120106:[.475,.026,.767],120107:[.475,.022,.527],120108:[.48,.028,.489],120109:[.541,.212,.5],120110:[.479,.219,.489],120111:[.474,.021,.389],120112:[.478,.029,.443],120113:[.64,.02,.333,{ic:.015}],120114:[.474,.023,.517],120115:[.53,.028,.512],120116:[.532,.028,.774],120117:[.472,.188,.389],120118:[.528,.218,.499],120119:[.471,.214,.391],120120:[.701,0,.722],120121:[.683,0,.667],120123:[.683,0,.722],120124:[.683,0,.667],120125:[.683,0,.611],120126:[.702,.019,.778],120128:[.683,0,.389],120129:[.683,.077,.5],120130:[.683,0,.778],120131:[.683,0,.667],120132:[.683,0,.944],120134:[.701,.019,.778],120138:[.702,.012,.556],120139:[.683,0,.667],120140:[.683,.019,.722],120141:[.683,.02,.722],120142:[.683,.019,1],120143:[.683,0,.722],120144:[.683,0,.722],120172:[.686,.031,.847],120173:[.684,.031,1.044],120174:[.676,.032,.723],120175:[.683,.029,.982],120176:[.686,.029,.783],120177:[.684,.146,.722],120178:[.687,.029,.927],120179:[.683,.126,.851],120180:[.681,.025,.655],120181:[.68,.141,.652],120182:[.681,.026,.789,{ic:.017}],120183:[.683,.028,.786],120184:[.683,.032,1.239],120185:[.679,.03,.983],120186:[.726,.03,.976],120187:[.688,.223,.977],120188:[.726,.083,.976],120189:[.688,.028,.978],120190:[.685,.031,.978],120191:[.686,.03,.79,{ic:.012}],120192:[.688,.039,.851,{ic:.02}],120193:[.685,.029,.982],120194:[.683,.03,1.235],120195:[.681,.035,.849],120196:[.688,.214,.984],120197:[.677,.148,.711],120198:[.472,.032,.603],120199:[.69,.032,.59],120200:[.473,.026,.464],120201:[.632,.028,.589],120202:[.471,.027,.472],120203:[.687,.222,.388],120204:[.472,.208,.595],120205:[.687,.207,.615],120206:[.686,.025,.331],120207:[.682,.203,.332],120208:[.682,.025,.464],120209:[.681,.024,.337],120210:[.476,.031,.921],120211:[.473,.028,.654],120212:[.482,.034,.609],120213:[.557,.207,.604],120214:[.485,.211,.596],120215:[.472,.026,.46],120216:[.479,.034,.523],120217:[.648,.027,.393,{ic:.014}],120218:[.472,.032,.589,{ic:.014}],120219:[.546,.027,.604],120220:[.549,.032,.918],120221:[.471,.188,.459],120222:[.557,.221,.589],120223:[.471,.214,.461],120224:[.694,0,.667],120225:[.694,0,.667],120226:[.705,.011,.639],120227:[.694,0,.722],120228:[.691,0,.597],120229:[.691,0,.569],120230:[.704,.011,.667],120231:[.694,0,.708],120232:[.694,0,.278],120233:[.694,.022,.472],120234:[.694,0,.694],120235:[.694,0,.542],120236:[.694,0,.875],120237:[.694,0,.708],120238:[.715,.022,.736],120239:[.694,0,.639],120240:[.715,.125,.736],120241:[.694,0,.646],120242:[.716,.022,.556],120243:[.688,0,.681],120244:[.694,.022,.688],120245:[.694,0,.667],120246:[.694,0,.944],120247:[.694,0,.667],120248:[.694,0,.667],120249:[.694,0,.611],120250:[.46,.01,.481],120251:[.694,.011,.517],120252:[.46,.01,.444],120253:[.694,.01,.517],120254:[.461,.01,.444],120255:[.705,0,.306,{ic:.041}],120256:[.455,.206,.5],120257:[.694,0,.517],120258:[.68,0,.239],120259:[.68,.205,.267],120260:[.694,0,.489],120261:[.694,0,.239],120262:[.455,0,.794],120263:[.455,0,.517],120264:[.46,.01,.5],120265:[.455,.194,.517],120266:[.455,.194,.517],120267:[.455,0,.342],120268:[.46,.01,.383],120269:[.571,.01,.361],120270:[.444,.01,.517],120271:[.444,0,.461],120272:[.444,0,.683],120273:[.444,0,.461],120274:[.444,.204,.461],120275:[.444,0,.435],120276:[.694,0,.733],120277:[.694,0,.733],120278:[.704,.011,.703],120279:[.694,0,.794],120280:[.691,0,.642],120281:[.691,0,.611],120282:[.705,.011,.733],120283:[.694,0,.794],120284:[.694,0,.331],120285:[.694,.022,.519],120286:[.694,0,.764],120287:[.694,0,.581],120288:[.694,0,.978],120289:[.694,0,.794],120290:[.716,.022,.794],120291:[.694,0,.703],120292:[.716,.106,.794],120293:[.694,0,.703],120294:[.716,.022,.611],120295:[.688,0,.733],120296:[.694,.022,.764],120297:[.694,0,.733],120298:[.694,0,1.039],120299:[.694,0,.733],120300:[.694,0,.733],120301:[.694,0,.672],120302:[.475,.011,.525],120303:[.694,.01,.561],120304:[.475,.011,.489],120305:[.694,.011,.561],120306:[.474,.01,.511],120307:[.705,0,.336,{ic:.045}],120308:[.469,.206,.55],120309:[.694,0,.561],120310:[.695,0,.256],120311:[.695,.205,.286],120312:[.694,0,.531],120313:[.694,0,.256],120314:[.469,0,.867],120315:[.468,0,.561],120316:[.474,.011,.55],120317:[.469,.194,.561],120318:[.469,.194,.561],120319:[.469,0,.372],120320:[.474,.01,.422],120321:[.589,.01,.404],120322:[.458,.011,.561],120323:[.458,0,.5],120324:[.458,0,.744],120325:[.458,0,.5],120326:[.458,.205,.5],120327:[.458,0,.476],120328:[.694,0,.667],120329:[.694,0,.667,{ic:.029}],120330:[.705,.01,.639,{ic:.08}],120331:[.694,0,.722,{ic:.025}],120332:[.691,0,.597,{ic:.091}],120333:[.691,0,.569,{ic:.104}],120334:[.705,.011,.667,{ic:.063}],120335:[.694,0,.708,{ic:.06}],120336:[.694,0,.278,{ic:.06}],120337:[.694,.022,.472,{ic:.063}],120338:[.694,0,.694,{ic:.091}],120339:[.694,0,.542],120340:[.694,0,.875,{ic:.054}],120341:[.694,0,.708,{ic:.058}],120342:[.716,.022,.736,{ic:.027}],120343:[.694,0,.639,{ic:.051}],120344:[.716,.125,.736,{ic:.027}],120345:[.694,0,.646,{ic:.052}],120346:[.716,.022,.556,{ic:.053}],120347:[.688,0,.681,{ic:.109}],120348:[.694,.022,.688,{ic:.059}],120349:[.694,0,.667,{ic:.132}],120350:[.694,0,.944,{ic:.132}],120351:[.694,0,.667,{ic:.091}],120352:[.694,0,.667,{ic:.143}],120353:[.694,0,.611,{ic:.091}],120354:[.461,.01,.481],120355:[.694,.011,.517,{ic:.022}],120356:[.46,.011,.444,{ic:.055}],120357:[.694,.01,.517,{ic:.071}],120358:[.46,.011,.444,{ic:.028}],120359:[.705,0,.306,{ic:.188}],120360:[.455,.206,.5,{ic:.068}],120361:[.694,0,.517],120362:[.68,0,.239,{ic:.076}],120363:[.68,.204,.267,{ic:.069}],120364:[.694,0,.489,{ic:.054}],120365:[.694,0,.239,{ic:.072}],120366:[.455,0,.794],120367:[.454,0,.517],120368:[.461,.011,.5,{ic:.023}],120369:[.455,.194,.517,{ic:.021}],120370:[.455,.194,.517,{ic:.021}],120371:[.455,0,.342,{ic:.082}],120372:[.461,.011,.383,{ic:.053}],120373:[.571,.011,.361,{ic:.049}],120374:[.444,.01,.517,{ic:.02}],120375:[.444,0,.461,{ic:.079}],120376:[.444,0,.683,{ic:.079}],120377:[.444,0,.461,{ic:.076}],120378:[.444,.205,.461,{ic:.079}],120379:[.444,0,.435,{ic:.059}],120432:[.623,0,.525],120433:[.611,0,.525],120434:[.622,.011,.525],120435:[.611,0,.525],120436:[.611,0,.525],120437:[.611,0,.525],120438:[.622,.011,.525],120439:[.611,0,.525],120440:[.611,0,.525],120441:[.611,.011,.525],120442:[.611,0,.525],120443:[.611,0,.525],120444:[.611,0,.525],120445:[.611,0,.525],120446:[.621,.01,.525],120447:[.611,0,.525],120448:[.621,.138,.525],120449:[.611,.011,.525],120450:[.622,.011,.525],120451:[.611,0,.525],120452:[.611,.011,.525],120453:[.611,.007,.525],120454:[.611,.007,.525],120455:[.611,0,.525],120456:[.611,0,.525],120457:[.611,0,.525],120458:[.439,.006,.525],120459:[.611,.006,.525],120460:[.44,.006,.525],120461:[.611,.006,.525],120462:[.44,.006,.525],120463:[.617,0,.525],120464:[.442,.229,.525],120465:[.611,0,.525],120466:[.612,0,.525],120467:[.612,.228,.525],120468:[.611,0,.525],120469:[.611,0,.525],120470:[.436,0,.525,{ic:.011}],120471:[.436,0,.525],120472:[.44,.006,.525],120473:[.437,.221,.525],120474:[.437,.221,.525,{ic:.02}],120475:[.437,0,.525],120476:[.44,.006,.525],120477:[.554,.006,.525],120478:[.431,.005,.525],120479:[.431,0,.525],120480:[.431,0,.525],120481:[.431,0,.525],120482:[.431,.228,.525],120483:[.431,0,.525],120488:[.698,0,.869],120489:[.686,0,.818],120490:[.68,0,.692],120491:[.698,0,.958],120492:[.68,0,.756],120493:[.686,0,.703],120494:[.686,0,.9],120495:[.696,.01,.894],120496:[.686,0,.436],120497:[.686,0,.901],120498:[.698,0,.806],120499:[.686,0,1.092],120500:[.686,0,.9],120501:[.675,0,.767],120502:[.696,.01,.864],120503:[.68,0,.9],120504:[.686,0,.786],120506:[.686,0,.831],120507:[.675,0,.8],120508:[.697,0,.894],120509:[.686,0,.831],120510:[.686,0,.869],120511:[.686,0,.894],120512:[.696,0,.831],120513:[.686,.024,.958],120546:[.716,0,.75,{sk:.139}],120547:[.683,0,.759,{sk:.0833}],120548:[.68,0,.615,{ic:.106,sk:.0833}],120549:[.716,0,.833,{sk:.167}],120550:[.68,0,.738,{ic:.026,sk:.0833}],120551:[.683,0,.683,{ic:.04,sk:.0833}],120552:[.683,0,.831,{ic:.057,sk:.0556}],120553:[.704,.022,.763,{sk:.0833}],120554:[.683,0,.44,{ic:.064,sk:.111}],120555:[.683,0,.849,{ic:.04,sk:.0556}],120556:[.716,0,.694,{sk:.167}],120557:[.683,0,.97,{ic:.081,sk:.0833}],120558:[.683,0,.803,{ic:.085,sk:.0833}],120559:[.677,0,.742,{ic:.035,sk:.0833}],120560:[.704,.022,.763,{sk:.0833}],120561:[.68,0,.831,{ic:.056,sk:.0556}],120562:[.683,0,.642,{ic:.109,sk:.0833}],120564:[.683,0,.78,{ic:.026,sk:.0833}],120565:[.677,0,.584,{ic:.12,sk:.0833}],120566:[.705,0,.583,{ic:.117,sk:.0556}],120567:[.683,0,.667,{sk:.0833}],120568:[.683,0,.828,{ic:.024,sk:.0833}],120569:[.683,0,.612,{ic:.08,sk:.0556}],120570:[.704,0,.772,{ic:.014,sk:.0833}],120572:[.442,.011,.64,{sk:.0278}],120573:[.705,.194,.566,{sk:.0833}],120574:[.441,.216,.518,{ic:.025}],120575:[.717,.01,.444,{sk:.0556}],120576:[.452,.022,.466,{sk:.0833}],120577:[.704,.204,.438,{ic:.033,sk:.0833}],120578:[.442,.216,.497,{sk:.0556}],120579:[.705,.01,.469,{sk:.0833}],120580:[.442,.01,.354,{sk:.0556}],120581:[.442,.011,.576],120582:[.694,.012,.583],120583:[.442,.216,.603,{sk:.0278}],120584:[.442,0,.494,{ic:.036,sk:.0278}],120585:[.704,.205,.438,{sk:.111}],120586:[.441,.011,.485,{sk:.0556}],120587:[.431,.011,.57],120588:[.442,.216,.517,{sk:.0833}],120589:[.442,.107,.363,{ic:.042,sk:.0833}],120590:[.431,.011,.571],120591:[.431,.013,.437,{ic:.08,sk:.0278}],120592:[.443,.01,.54,{sk:.0278}],120593:[.442,.218,.654,{sk:.0833}],120594:[.442,.204,.626,{sk:.0556}],120595:[.694,.205,.651,{sk:.111}],120596:[.443,.011,.622],120597:[.715,.022,.531,{ic:.035,sk:.0833}],120598:[.431,.011,.406,{sk:.0556}],120599:[.705,.011,.591,{sk:.0833}],120600:[.434,.006,.667,{ic:.067}],120601:[.694,.205,.596,{sk:.0833}],120602:[.442,.194,.517,{sk:.0833}],120603:[.431,.01,.828],120604:[.711,0,.869,{sk:.16}],120605:[.686,0,.866,{sk:.0958}],120606:[.68,0,.657,{ic:.12,sk:.0958}],120607:[.711,0,.958,{sk:.192}],120608:[.68,0,.81,{ic:.015,sk:.0958}],120609:[.686,0,.773,{ic:.032,sk:.0958}],120610:[.686,0,.982,{ic:.045,sk:.0639}],120611:[.702,.017,.867,{sk:.0958}],120612:[.686,0,.511,{ic:.062,sk:.128}],120613:[.686,0,.971,{ic:.032,sk:.0639}],120614:[.711,0,.806,{sk:.192}],120615:[.686,0,1.142,{ic:.077,sk:.0958}],120616:[.686,0,.95,{ic:.077,sk:.0958}],120617:[.675,0,.841,{ic:.026,sk:.0958}],120618:[.703,.017,.837,{sk:.0958}],120619:[.68,0,.982,{ic:.044,sk:.0639}],120620:[.686,0,.723,{ic:.124,sk:.0958}],120622:[.686,0,.885,{ic:.017,sk:.0958}],120623:[.675,0,.637,{ic:.135,sk:.0958}],120624:[.703,0,.671,{ic:.131,sk:.0639}],120625:[.686,0,.767,{sk:.0958}],120626:[.686,0,.947,{sk:.0958}],120627:[.686,0,.714,{ic:.076,sk:.0639}],120628:[.703,0,.879,{sk:.0958}],120630:[.452,.008,.761,{sk:.0319}],120631:[.701,.194,.66,{sk:.0958}],120632:[.451,.211,.59,{ic:.027}],120633:[.725,.008,.522,{sk:.0639}],120634:[.461,.017,.529,{sk:.0958}],120635:[.711,.202,.508,{ic:.013,sk:.0958}],120636:[.452,.211,.6,{sk:.0639}],120637:[.702,.008,.562,{sk:.0958}],120638:[.452,.008,.412,{sk:.0639}],120639:[.452,.008,.668],120640:[.694,.013,.671],120641:[.452,.211,.708,{sk:.0319}],120642:[.452,0,.577,{ic:.031,sk:.0319}],120643:[.711,.201,.508,{sk:.128}],120644:[.452,.008,.585,{sk:.0639}],120645:[.444,.008,.682],120646:[.451,.211,.612,{sk:.0958}],120647:[.451,.105,.424,{ic:.033,sk:.0958}],120648:[.444,.008,.686],120649:[.444,.013,.521,{ic:.089,sk:.0319}],120650:[.453,.008,.631,{sk:.0319}],120651:[.452,.216,.747,{sk:.0958}],120652:[.452,.201,.718,{sk:.0639}],120653:[.694,.202,.758,{sk:.128}],120654:[.453,.008,.718],120655:[.71,.017,.628,{ic:.029,sk:.0958}],120656:[.444,.007,.483,{sk:.0639}],120657:[.701,.008,.692,{sk:.0958}],120658:[.434,.006,.667,{ic:.067}],120659:[.694,.202,.712,{sk:.0958}],120660:[.451,.194,.612,{sk:.0958}],120661:[.444,.008,.975],120662:[.694,0,.733],120663:[.694,0,.733],120664:[.691,0,.581],120665:[.694,0,.917],120666:[.691,0,.642],120667:[.694,0,.672],120668:[.694,0,.794],120669:[.716,.022,.856],120670:[.694,0,.331],120671:[.694,0,.764],120672:[.694,0,.672],120673:[.694,0,.978],120674:[.694,0,.794],120675:[.688,0,.733],120676:[.716,.022,.794],120677:[.691,0,.794],120678:[.694,0,.703],120680:[.694,0,.794],120681:[.688,0,.733],120682:[.715,0,.856],120683:[.694,0,.794],120684:[.694,0,.733],120685:[.694,0,.856],120686:[.716,0,.794],120782:[.654,.01,.575],120783:[.655,0,.575],120784:[.654,0,.575],120785:[.655,.011,.575],120786:[.656,0,.575],120787:[.655,.011,.575],120788:[.655,.011,.575],120789:[.676,.011,.575],120790:[.654,.011,.575],120791:[.654,.011,.575],120802:[.678,.022,.5],120803:[.678,0,.5],120804:[.677,0,.5],120805:[.678,.022,.5],120806:[.656,0,.5],120807:[.656,.021,.5],120808:[.677,.022,.5],120809:[.656,.011,.5],120810:[.678,.022,.5],120811:[.677,.022,.5],120812:[.715,.022,.55],120813:[.716,0,.55],120814:[.716,0,.55],120815:[.716,.022,.55],120816:[.694,0,.55],120817:[.694,.022,.55],120818:[.716,.022,.55],120819:[.695,.011,.55],120820:[.715,.022,.55],120821:[.716,.022,.55],120822:[.621,.01,.525],120823:[.622,0,.525],120824:[.622,0,.525],120825:[.622,.011,.525],120826:[.624,0,.525],120827:[.611,.01,.525],120828:[.622,.011,.525],120829:[.627,.01,.525],120830:[.621,.01,.525],120831:[.622,.011,.525]}},6949:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.sansSerifBoldItalic=void 0,f.sansSerifBoldItalic={305:[.458,0,.256],567:[.458,.205,.286]}},5193:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.sansSerifBold=void 0,f.sansSerifBold={33:[.694,0,.367],34:[.694,-.442,.558],35:[.694,.193,.917],36:[.75,.056,.55],37:[.75,.056,1.029],38:[.716,.022,.831],39:[.694,-.442,.306],40:[.75,.249,.428],41:[.75,.25,.428],42:[.75,-.293,.55],43:[.617,.116,.856],44:[.146,.106,.306],45:[.273,-.186,.367],46:[.146,0,.306],47:[.75,.249,.55],58:[.458,0,.306],59:[.458,.106,.306],61:[.407,-.094,.856],63:[.705,0,.519],64:[.704,.011,.733],91:[.75,.25,.343],93:[.75,.25,.343],94:[.694,-.537,.55],95:[-.023,.11,.55],126:[.344,-.198,.55],305:[.458,0,.256],567:[.458,.205,.286],768:[.694,-.537,0],769:[.694,-.537,0],770:[.694,-.537,0],771:[.694,-.548,0],772:[.66,-.56,0],774:[.694,-.552,0],775:[.695,-.596,0],776:[.695,-.595,0],778:[.694,-.538,0],779:[.694,-.537,0],780:[.657,-.5,0],8211:[.327,-.24,.55],8212:[.327,-.24,1.1],8213:[.327,-.24,1.1],8215:[-.023,.11,.55],8216:[.694,-.443,.306],8217:[.694,-.442,.306],8220:[.694,-.443,.558],8221:[.694,-.442,.558],8260:[.75,.249,.55],8710:[.694,0,.917]}},2632:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.sansSerifItalic=void 0,f.sansSerifItalic={33:[.694,0,.319,{ic:.036}],34:[.694,-.471,.5],35:[.694,.194,.833,{ic:.018}],36:[.75,.056,.5,{ic:.065}],37:[.75,.056,.833],38:[.716,.022,.758],39:[.694,-.471,.278,{ic:.057}],40:[.75,.25,.389,{ic:.102}],41:[.75,.25,.389],42:[.75,-.306,.5,{ic:.068}],43:[.583,.083,.778],44:[.098,.125,.278],45:[.259,-.186,.333],46:[.098,0,.278],47:[.75,.25,.5,{ic:.1}],48:[.678,.022,.5,{ic:.049}],49:[.678,0,.5],50:[.678,0,.5,{ic:.051}],51:[.678,.022,.5,{ic:.044}],52:[.656,0,.5,{ic:.021}],53:[.656,.022,.5,{ic:.055}],54:[.678,.022,.5,{ic:.048}],55:[.656,.011,.5,{ic:.096}],56:[.678,.022,.5,{ic:.054}],57:[.677,.022,.5,{ic:.045}],58:[.444,0,.278],59:[.444,.125,.278],61:[.37,-.13,.778,{ic:.018}],63:[.704,0,.472,{ic:.064}],64:[.705,.01,.667,{ic:.04}],91:[.75,.25,.289,{ic:.136}],93:[.75,.25,.289,{ic:.064}],94:[.694,-.527,.5,{ic:.033}],95:[-.038,.114,.5,{ic:.065}],126:[.327,-.193,.5,{ic:.06}],305:[.444,0,.239,{ic:.019}],567:[.444,.204,.267,{ic:.019}],768:[.694,-.527,0],769:[.694,-.527,0,{ic:.063}],770:[.694,-.527,0,{ic:.033}],771:[.677,-.543,0,{ic:.06}],772:[.631,-.552,0,{ic:.064}],774:[.694,-.508,0,{ic:.073}],775:[.68,-.576,0],776:[.68,-.582,0,{ic:.04}],778:[.693,-.527,0],779:[.694,-.527,0,{ic:.063}],780:[.654,-.487,0,{ic:.06}],913:[.694,0,.667],914:[.694,0,.667,{ic:.029}],915:[.691,0,.542,{ic:.104}],916:[.694,0,.833],917:[.691,0,.597,{ic:.091}],918:[.694,0,.611,{ic:.091}],919:[.694,0,.708,{ic:.06}],920:[.715,.022,.778,{ic:.026}],921:[.694,0,.278,{ic:.06}],922:[.694,0,.694,{ic:.091}],923:[.694,0,.611],924:[.694,0,.875,{ic:.054}],925:[.694,0,.708,{ic:.058}],926:[.688,0,.667,{ic:.098}],927:[.716,.022,.736,{ic:.027}],928:[.691,0,.708,{ic:.06}],929:[.694,0,.639,{ic:.051}],931:[.694,0,.722,{ic:.091}],932:[.688,0,.681,{ic:.109}],933:[.716,0,.778,{ic:.065}],934:[.694,0,.722,{ic:.021}],935:[.694,0,.667,{ic:.091}],936:[.694,0,.778,{ic:.076}],937:[.716,0,.722,{ic:.047}],8211:[.312,-.236,.5,{ic:.065}],8212:[.312,-.236,1,{ic:.065}],8213:[.312,-.236,1,{ic:.065}],8215:[-.038,.114,.5,{ic:.065}],8216:[.694,-.471,.278,{ic:.058}],8217:[.694,-.471,.278,{ic:.057}],8220:[.694,-.471,.5,{ic:.114}],8221:[.694,-.471,.5],8260:[.75,.25,.5,{ic:.1}],8710:[.694,0,.833]}},4214:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.sansSerif=void 0,f.sansSerif={33:[.694,0,.319],34:[.694,-.471,.5],35:[.694,.194,.833],36:[.75,.056,.5],37:[.75,.056,.833],38:[.716,.022,.758],39:[.694,-.471,.278],40:[.75,.25,.389],41:[.75,.25,.389],42:[.75,-.306,.5],43:[.583,.082,.778],44:[.098,.125,.278],45:[.259,-.186,.333],46:[.098,0,.278],47:[.75,.25,.5],58:[.444,0,.278],59:[.444,.125,.278],61:[.37,-.13,.778],63:[.704,0,.472],64:[.704,.011,.667],91:[.75,.25,.289],93:[.75,.25,.289],94:[.694,-.527,.5],95:[-.038,.114,.5],126:[.327,-.193,.5],305:[.444,0,.239],567:[.444,.205,.267],768:[.694,-.527,0],769:[.694,-.527,0],770:[.694,-.527,0],771:[.677,-.543,0],772:[.631,-.552,0],774:[.694,-.508,0],775:[.68,-.576,0],776:[.68,-.582,0],778:[.694,-.527,0],779:[.694,-.527,0],780:[.654,-.487,0],913:[.694,0,.667],914:[.694,0,.667],915:[.691,0,.542],916:[.694,0,.833],917:[.691,0,.597],918:[.694,0,.611],919:[.694,0,.708],920:[.716,.021,.778],921:[.694,0,.278],922:[.694,0,.694],923:[.694,0,.611],924:[.694,0,.875],925:[.694,0,.708],926:[.688,0,.667],927:[.715,.022,.736],928:[.691,0,.708],929:[.694,0,.639],931:[.694,0,.722],932:[.688,0,.681],933:[.716,0,.778],934:[.694,0,.722],935:[.694,0,.667],936:[.694,0,.778],937:[.716,0,.722],8211:[.312,-.236,.5],8212:[.312,-.236,1],8213:[.312,-.236,1],8215:[-.038,.114,.5],8216:[.694,-.471,.278],8217:[.694,-.471,.278],8220:[.694,-.471,.5],8221:[.694,-.471,.5],8260:[.75,.25,.5],8710:[.694,0,.833]}},6466:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.scriptBold=void 0,f.scriptBold={}},3776:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.script=void 0,f.script={}},7405:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.smallop=void 0,f.smallop={40:[.85,.349,.458],41:[.85,.349,.458],47:[.85,.349,.578],91:[.85,.349,.417],92:[.85,.349,.578],93:[.85,.349,.417],123:[.85,.349,.583],125:[.85,.349,.583],710:[.744,-.551,.556],732:[.722,-.597,.556],770:[.744,-.551,0],771:[.722,-.597,0],8214:[.602,0,.778],8260:[.85,.349,.578],8593:[.6,0,.667],8595:[.6,0,.667],8657:[.599,0,.778],8659:[.6,0,.778],8719:[.75,.25,.944],8720:[.75,.25,.944],8721:[.75,.25,1.056],8730:[.85,.35,1,{ic:.02}],8739:[.627,.015,.333],8741:[.627,.015,.556],8747:[.805,.306,.472,{ic:.138}],8748:[.805,.306,.819,{ic:.138}],8749:[.805,.306,1.166,{ic:.138}],8750:[.805,.306,.472,{ic:.138}],8896:[.75,.249,.833],8897:[.75,.249,.833],8898:[.75,.249,.833],8899:[.75,.249,.833],8968:[.85,.349,.472],8969:[.85,.349,.472],8970:[.85,.349,.472],8971:[.85,.349,.472],9001:[.85,.35,.472],9002:[.85,.35,.472],9168:[.602,0,.667],10072:[.627,.015,.333],10216:[.85,.35,.472],10217:[.85,.35,.472],10752:[.75,.25,1.111],10753:[.75,.25,1.111],10754:[.75,.25,1.111],10756:[.75,.249,.833],10758:[.75,.249,.833],10764:[.805,.306,1.638,{ic:.138}],12296:[.85,.35,.472],12297:[.85,.35,.472]}},8105:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.texCalligraphicBold=void 0,f.texCalligraphicBold={65:[.751,.049,.921,{ic:.068,sk:.224}],66:[.705,.017,.748,{sk:.16}],67:[.703,.02,.613,{sk:.16}],68:[.686,0,.892,{sk:.0958}],69:[.703,.016,.607,{ic:.02,sk:.128}],70:[.686,.03,.814,{ic:.116,sk:.128}],71:[.703,.113,.682,{sk:.128}],72:[.686,.048,.987,{sk:.128}],73:[.686,0,.642,{ic:.104,sk:.0319}],74:[.686,.114,.779,{ic:.158,sk:.192}],75:[.703,.017,.871,{sk:.0639}],76:[.703,.017,.788,{sk:.16}],77:[.703,.049,1.378,{sk:.16}],78:[.84,.049,.937,{ic:.168,sk:.0958}],79:[.703,.017,.906,{sk:.128}],80:[.686,.067,.81,{ic:.036,sk:.0958}],81:[.703,.146,.939,{sk:.128}],82:[.686,.017,.99,{sk:.0958}],83:[.703,.016,.696,{ic:.025,sk:.16}],84:[.72,.069,.644,{ic:.303,sk:.0319}],85:[.686,.024,.715,{ic:.056,sk:.0958}],86:[.686,.077,.737,{ic:.037,sk:.0319}],87:[.686,.077,1.169,{ic:.037,sk:.0958}],88:[.686,0,.817,{ic:.089,sk:.16}],89:[.686,.164,.759,{ic:.038,sk:.0958}],90:[.686,0,.818,{ic:.035,sk:.16}],305:[.452,.008,.394,{sk:.0319}],567:[.451,.201,.439,{sk:.0958}]}},2518:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.texCalligraphic=void 0,f.texCalligraphic={65:[.728,.05,.798,{ic:.021,sk:.194}],66:[.705,.022,.657,{sk:.139}],67:[.705,.025,.527,{sk:.139}],68:[.683,0,.771,{sk:.0833}],69:[.705,.022,.528,{ic:.036,sk:.111}],70:[.683,.032,.719,{ic:.11,sk:.111}],71:[.704,.119,.595,{sk:.111}],72:[.683,.048,.845,{sk:.111}],73:[.683,0,.545,{ic:.097,sk:.0278}],74:[.683,.119,.678,{ic:.161,sk:.167}],75:[.705,.022,.762,{sk:.0556}],76:[.705,.022,.69,{sk:.139}],77:[.705,.05,1.201,{sk:.139}],78:[.789,.05,.82,{ic:.159,sk:.0833}],79:[.705,.022,.796,{sk:.111}],80:[.683,.057,.696,{ic:.037,sk:.0833}],81:[.705,.131,.817,{sk:.111}],82:[.682,.022,.848,{sk:.0833}],83:[.705,.022,.606,{ic:.036,sk:.139}],84:[.717,.068,.545,{ic:.288,sk:.0278}],85:[.683,.028,.626,{ic:.061,sk:.0833}],86:[.683,.052,.613,{ic:.045,sk:.0278}],87:[.683,.053,.988,{ic:.046,sk:.0833}],88:[.683,0,.713,{ic:.094,sk:.139}],89:[.683,.143,.668,{ic:.046,sk:.0833}],90:[.683,0,.725,{ic:.042,sk:.139}]}},5595:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.texMathit=void 0,f.texMathit={65:[.716,0,.743],66:[.683,0,.704],67:[.705,.021,.716],68:[.683,0,.755],69:[.68,0,.678],70:[.68,0,.653],71:[.705,.022,.774],72:[.683,0,.743],73:[.683,0,.386],74:[.683,.021,.525],75:[.683,0,.769],76:[.683,0,.627],77:[.683,0,.897],78:[.683,0,.743],79:[.704,.022,.767],80:[.683,0,.678],81:[.704,.194,.767],82:[.683,.022,.729],83:[.705,.022,.562],84:[.677,0,.716],85:[.683,.022,.743],86:[.683,.022,.743],87:[.683,.022,.999],88:[.683,0,.743],89:[.683,0,.743],90:[.683,0,.613],97:[.442,.011,.511],98:[.694,.011,.46],99:[.441,.01,.46],100:[.694,.011,.511],101:[.442,.01,.46],102:[.705,.204,.307],103:[.442,.205,.46],104:[.694,.011,.511],105:[.656,.01,.307],106:[.656,.204,.307],107:[.694,.011,.46],108:[.694,.011,.256],109:[.442,.011,.818],110:[.442,.011,.562],111:[.442,.011,.511],112:[.442,.194,.511],113:[.442,.194,.46],114:[.442,.011,.422],115:[.442,.011,.409],116:[.626,.011,.332],117:[.441,.011,.537],118:[.443,.01,.46],119:[.443,.011,.664],120:[.442,.011,.464],121:[.441,.205,.486],122:[.442,.011,.409]}},6357:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.texOldstyleBold=void 0,f.texOldstyleBold={48:[.46,.017,.575],49:[.461,0,.575],50:[.46,0,.575],51:[.461,.211,.575],52:[.469,.194,.575],53:[.461,.211,.575],54:[.66,.017,.575],55:[.476,.211,.575],56:[.661,.017,.575],57:[.461,.21,.575],65:[.751,.049,.921,{ic:.068,sk:.224}],66:[.705,.017,.748,{sk:.16}],67:[.703,.02,.613,{sk:.16}],68:[.686,0,.892,{sk:.0958}],69:[.703,.016,.607,{ic:.02,sk:.128}],70:[.686,.03,.814,{ic:.116,sk:.128}],71:[.703,.113,.682,{sk:.128}],72:[.686,.048,.987,{sk:.128}],73:[.686,0,.642,{ic:.104,sk:.0319}],74:[.686,.114,.779,{ic:.158,sk:.192}],75:[.703,.017,.871,{sk:.0639}],76:[.703,.017,.788,{sk:.16}],77:[.703,.049,1.378,{sk:.16}],78:[.84,.049,.937,{ic:.168,sk:.0958}],79:[.703,.017,.906,{sk:.128}],80:[.686,.067,.81,{ic:.036,sk:.0958}],81:[.703,.146,.939,{sk:.128}],82:[.686,.017,.99,{sk:.0958}],83:[.703,.016,.696,{ic:.025,sk:.16}],84:[.72,.069,.644,{ic:.303,sk:.0319}],85:[.686,.024,.715,{ic:.056,sk:.0958}],86:[.686,.077,.737,{ic:.037,sk:.0319}],87:[.686,.077,1.169,{ic:.037,sk:.0958}],88:[.686,0,.817,{ic:.089,sk:.16}],89:[.686,.164,.759,{ic:.038,sk:.0958}],90:[.686,0,.818,{ic:.035,sk:.16}]}},9474:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.texOldstyle=void 0,f.texOldstyle={48:[.452,.022,.5],49:[.453,0,.5],50:[.453,0,.5],51:[.452,.216,.5],52:[.464,.194,.5],53:[.453,.216,.5],54:[.665,.022,.5],55:[.463,.216,.5],56:[.666,.021,.5],57:[.453,.216,.5],65:[.728,.05,.798,{ic:.021,sk:.194}],66:[.705,.022,.657,{sk:.139}],67:[.705,.025,.527,{sk:.139}],68:[.683,0,.771,{sk:.0833}],69:[.705,.022,.528,{ic:.036,sk:.111}],70:[.683,.032,.719,{ic:.11,sk:.111}],71:[.704,.119,.595,{sk:.111}],72:[.683,.048,.845,{sk:.111}],73:[.683,0,.545,{ic:.097,sk:.0278}],74:[.683,.119,.678,{ic:.161,sk:.167}],75:[.705,.022,.762,{sk:.0556}],76:[.705,.022,.69,{sk:.139}],77:[.705,.05,1.201,{sk:.139}],78:[.789,.05,.82,{ic:.159,sk:.0833}],79:[.705,.022,.796,{sk:.111}],80:[.683,.057,.696,{ic:.037,sk:.0833}],81:[.705,.131,.817,{sk:.111}],82:[.682,.022,.848,{sk:.0833}],83:[.705,.022,.606,{ic:.036,sk:.139}],84:[.717,.068,.545,{ic:.288,sk:.0278}],85:[.683,.028,.626,{ic:.061,sk:.0833}],86:[.683,.052,.613,{ic:.045,sk:.0278}],87:[.683,.053,.988,{ic:.046,sk:.0833}],88:[.683,0,.713,{ic:.094,sk:.139}],89:[.683,.143,.668,{ic:.046,sk:.0833}],90:[.683,0,.725,{ic:.042,sk:.139}]}},584:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.texSize3=void 0,f.texSize3={40:[1.45,.949,.736],41:[1.45,.949,.736],47:[1.45,.949,1.044],91:[1.45,.949,.528],92:[1.45,.949,1.044],93:[1.45,.949,.528],123:[1.45,.949,.75],125:[1.45,.949,.75],710:[.772,-.564,1.444],732:[.749,-.61,1.444],770:[.772,-.564,0],771:[.749,-.61,0],8260:[1.45,.949,1.044],8730:[1.45,.95,1,{ic:.02}],8968:[1.45,.949,.583],8969:[1.45,.949,.583],8970:[1.45,.949,.583],8971:[1.45,.949,.583],9001:[1.45,.95,.75],9002:[1.45,.949,.75],10216:[1.45,.95,.75],10217:[1.45,.949,.75],12296:[1.45,.95,.75],12297:[1.45,.949,.75]}},4324:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.texSize4=void 0,f.texSize4={40:[1.75,1.249,.792],41:[1.75,1.249,.792],47:[1.75,1.249,1.278],91:[1.75,1.249,.583],92:[1.75,1.249,1.278],93:[1.75,1.249,.583],123:[1.75,1.249,.806],125:[1.75,1.249,.806],710:[.845,-.561,1.889,{ic:.013}],732:[.823,-.583,1.889],770:[.845,-.561,0,{ic:.013}],771:[.823,-.583,0],8260:[1.75,1.249,1.278],8730:[1.75,1.25,1,{ic:.02}],8968:[1.75,1.249,.639],8969:[1.75,1.249,.639],8970:[1.75,1.249,.639],8971:[1.75,1.249,.639],9001:[1.75,1.248,.806],9002:[1.75,1.248,.806],9115:[1.154,.655,.875],9116:[.61,.01,.875],9117:[1.165,.644,.875],9118:[1.154,.655,.875],9119:[.61,.01,.875],9120:[1.165,.644,.875],9121:[1.154,.645,.667],9122:[.602,0,.667],9123:[1.155,.644,.667],9124:[1.154,.645,.667],9125:[.602,0,.667],9126:[1.155,.644,.667],9127:[.899,.01,.889],9128:[1.16,.66,.889],9129:[.01,.899,.889],9130:[.29,.015,.889],9131:[.899,.01,.889],9132:[1.16,.66,.889],9133:[.01,.899,.889],9143:[.935,.885,1.056],10216:[1.75,1.248,.806],10217:[1.75,1.248,.806],12296:[1.75,1.248,.806],12297:[1.75,1.248,.806],57344:[.625,.014,1.056],57345:[.605,.014,1.056,{ic:.02}],57680:[.12,.213,.45,{ic:.01}],57681:[.12,.213,.45,{ic:.024}],57682:[.333,0,.45,{ic:.01}],57683:[.333,0,.45,{ic:.024}],57684:[.32,.2,.4,{ic:.01}],57685:[.333,0,.9,{ic:.01}],57686:[.12,.213,.9,{ic:.01}]}},8135:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.texVariant=void 0,f.texVariant={710:[.845,-.561,2.333,{ic:.013}],732:[.899,-.628,2.333],770:[.845,-.561,0,{ic:.013}],771:[.899,-.628,0],1008:[.434,.006,.667,{ic:.067}],8463:[.695,.013,.54,{ic:.022}],8592:[.437,-.064,.5],8594:[.437,-.064,.5],8652:[.514,.014,1],8708:[.86,.166,.556],8709:[.587,0,.778],8722:[.27,-.23,.5],8726:[.43,.023,.778],8733:[.472,-.028,.778],8739:[.43,.023,.222],8740:[.43,.023,.222,{ic:.018}],8741:[.431,.023,.389],8742:[.431,.024,.389,{ic:.018}],8764:[.365,-.132,.778],8776:[.481,-.05,.778],8808:[.752,.284,.778],8809:[.752,.284,.778],8816:[.919,.421,.778],8817:[.919,.421,.778],8840:[.828,.33,.778],8841:[.828,.33,.778],8842:[.634,.255,.778],8843:[.634,.254,.778],8872:[.694,0,.611],8901:[.189,0,.278],8994:[.378,-.122,.778],8995:[.378,-.143,.778],9651:[.575,.02,.722],9661:[.576,.019,.722],10887:[.801,.303,.778],10888:[.801,.303,.778],10955:[.752,.332,.778],10956:[.752,.333,.778]}},8955:function(c,f){MathJax._.components.global.isObject,MathJax._.components.global.combineConfig,f.PV=MathJax._.components.global.combineDefaults,f.r8=MathJax._.components.global.combineWithMathJax,MathJax._.components.global.MathJax},5074:function(c,f){MathJax._.util.Options.isObject,MathJax._.util.Options.APPEND,MathJax._.util.Options.REMOVE,MathJax._.util.Options.OPTIONS,MathJax._.util.Options.Expandable,MathJax._.util.Options.expandable,MathJax._.util.Options.makeArray,MathJax._.util.Options.keys,MathJax._.util.Options.copy,MathJax._.util.Options.insert,MathJax._.util.Options.defaultOptions,MathJax._.util.Options.userOptions,MathJax._.util.Options.selectOptions,f.Pp=MathJax._.util.Options.selectOptionsFromKeys,MathJax._.util.Options.separateOptions,MathJax._.util.Options.lookup},73:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.CHTMLFontData=MathJax._.output.chtml.FontData.CHTMLFontData,f.AddCSS=MathJax._.output.chtml.FontData.AddCSS},4228:function(c,f){Object.defineProperty(f,"__esModule",{value:!0}),f.enum=MathJax._.output.common.FontData.enum,f.V=MathJax._.output.common.FontData.V,f.H=MathJax._.output.common.FontData.H,f.NOSTRETCH=MathJax._.output.common.FontData.NOSTRETCH,f.FontData=MathJax._.output.common.FontData.FontData},4629:function(c,f){MathJax._.components.package.PackageError,f.GL=MathJax._.components.package.Package}},f={};function i(t){var e=f[t];if(void 0!==e)return e.exports;var s=f[t]={exports:{}};return c[t].call(s.exports,s,s.exports,i),s.exports}!function(){var c=i(8955),f=i(8667),t=i(2308),e=i(7841),s=i(5031),r=i(9236),o=i(1937),a=i(4244),S=i(482),l=i(196),n=i(527),B=i(3518),d=i(965),u=i(9169),k=i(6736),I=i(8787),A=i(5392),p=i(6590),m=i(8798),h=i(2138),M=i(3869),x=i(7557),H=i(7481),_=i(5674),E=i(7002),y=i(9349),R=i(9741),v=i(2827),D=i(2970),b=i(1668),T=i(6949),X=i(5193),O=i(2632),F=i(4214),C=i(6466),W=i(3776),J=i(7405),j=i(8105),z=i(2518),V=i(5595),P=i(6357),g=i(9474),w=i(584),Z=i(4324),L=i(8135);MathJax.loader&&MathJax.loader.checkVersion("output/chtml/fonts/tex",f.q,"chtml-font"),(0,c.r8)({_:{output:{chtml:{fonts:{tex_ts:t,tex:{"bold-italic":e,bold:s,"fraktur-bold":r,fraktur:o,italic:a,largeop:S,monospace:l,normal:n,"sans-serif-bold-italic":B,"sans-serif-bold":d,"sans-serif-italic":u,"sans-serif":k,smallop:I,"tex-calligraphic-bold":A,"tex-size3":p,"tex-size4":m,"tex-variant":h}}},common:{fonts:{tex:{"bold-italic":M,bold:x,delimiters:H,"double-struck":_,"fraktur-bold":E,fraktur:y,italic:R,largeop:v,monospace:D,normal:b,"sans-serif-bold-italic":T,"sans-serif-bold":X,"sans-serif-italic":O,"sans-serif":F,"script-bold":C,script:W,smallop:J,"tex-calligraphic-bold":j,"tex-calligraphic":z,"tex-mathit":V,"tex-oldstyle-bold":P,"tex-oldstyle":g,"tex-size3":w,"tex-size4":Z,"tex-variant":L}}}}}});var U=i(4629),N=i(5074);if(MathJax.startup){(0,c.PV)(MathJax.config,"chtml",{fontURL:U.GL.resolvePath("output/chtml/fonts/woff-v2",!1)});var K=(0,N.Pp)(MathJax.config.chtml||{},t.TeXFont.OPTIONS);(0,c.PV)(MathJax.config,"chtml",{font:new t.TeXFont(K)})}}()}(); ================================================ FILE: assets/vendors/mathjax-v3/output/chtml.js ================================================ !function(){"use strict";var t,e,r,o,n,i,a,s,l,c,h,u,p,d,f,m,y,v,b,g,x,M,_,w,j,C,O,S,T,B,L,P,A,H,k,N,D,E,W,R,I,F,J,V,z,U,X,q,K,Q,G,Y,Z,$,tt,et,rt,ot,nt,it,at,st,lt,ct,ht,ut,pt={7306:function(t,e){e.q=void 0,e.q="3.2.2"},7016:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},i.apply(this,arguments)},a=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),s=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),l=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&a(e,t,r);return s(e,t),e},c=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTML=void 0;var h=r(716),u=r(5888),p=r(4477),d=r(7427),f=r(4142),m=l(r(6914)),y=r(6720),v=function(t){function e(e){void 0===e&&(e=null);var r=t.call(this,e,p.CHTMLWrapperFactory,f.TeXFont)||this;return r.chtmlStyles=null,r.font.adaptiveCSS(r.options.adaptiveCSS),r.wrapperUsage=new d.Usage,r}return n(e,t),e.prototype.escaped=function(t,e){return this.setDocument(e),this.html("span",{},[this.text(t.math)])},e.prototype.styleSheet=function(r){if(this.chtmlStyles){if(this.options.adaptiveCSS){var o=new u.CssStyles;this.addWrapperStyles(o),this.updateFontStyles(o),this.adaptor.insertRules(this.chtmlStyles,o.getStyleRules())}return this.chtmlStyles}var n=this.chtmlStyles=t.prototype.styleSheet.call(this,r);return this.adaptor.setAttribute(n,"id",e.STYLESHEETID),this.wrapperUsage.update(),n},e.prototype.updateFontStyles=function(t){t.addStyles(this.font.updateStyles({}))},e.prototype.addWrapperStyles=function(e){var r,o;if(this.options.adaptiveCSS)try{for(var n=c(this.wrapperUsage.update()),i=n.next();!i.done;i=n.next()){var a=i.value,s=this.factory.getNodeClass(a);s&&this.addClassStyles(s,e)}}catch(t){r={error:t}}finally{try{i&&!i.done&&(o=n.return)&&o.call(n)}finally{if(r)throw r.error}}else t.prototype.addWrapperStyles.call(this,e)},e.prototype.addClassStyles=function(e,r){var o,n=e;n.autoStyle&&"unknown"!==n.kind&&r.addStyles(((o={})["mjx-"+n.kind]={display:"inline-block","text-align":"left"},o)),this.wrapperUsage.add(n.kind),t.prototype.addClassStyles.call(this,e,r)},e.prototype.processMath=function(t,e){this.factory.wrap(t).toCHTML(e)},e.prototype.clearCache=function(){this.cssStyles.clear(),this.font.clearCache(),this.wrapperUsage.clear(),this.chtmlStyles=null},e.prototype.reset=function(){this.clearCache()},e.prototype.unknownText=function(t,e,r){void 0===r&&(r=null);var o={},n=100/this.math.metrics.scale;if(100!==n&&(o["font-size"]=this.fixed(n,1)+"%",o.padding=m.em(75/n)+" 0 "+m.em(20/n)+" 0"),"-explicitFont"!==e){var i=(0,y.unicodeChars)(t);(1!==i.length||i[0]<119808||i[0]>120831)&&this.cssFontStyles(this.font.getCssFont(e),o)}if(null!==r){var a=this.math.metrics;o.width=Math.round(r*a.em*a.scale)+"px"}return this.html("mjx-utext",{variant:e,style:o},[this.text(t)])},e.prototype.measureTextNode=function(t){var e=this.adaptor,r=e.clone(t);e.setStyle(r,"font-family",e.getStyle(r,"font-family").replace(/MJXZERO, /g,""));var o=this.html("mjx-measure-text",{style:{position:"absolute","white-space":"nowrap"}},[r]);e.append(e.parent(this.math.start.node),this.container),e.append(this.container,o);var n=e.nodeSize(r,this.math.metrics.em)[0]/this.math.metrics.scale;return e.remove(this.container),e.remove(o),{w:n,h:.75,d:.2}},e.NAME="CHTML",e.OPTIONS=i(i({},h.CommonOutputJax.OPTIONS),{adaptiveCSS:!0,matchFontHeight:!0}),e.commonStyles={'mjx-container[jax="CHTML"]':{"line-height":0},'mjx-container [space="1"]':{"margin-left":".111em"},'mjx-container [space="2"]':{"margin-left":".167em"},'mjx-container [space="3"]':{"margin-left":".222em"},'mjx-container [space="4"]':{"margin-left":".278em"},'mjx-container [space="5"]':{"margin-left":".333em"},'mjx-container [rspace="1"]':{"margin-right":".111em"},'mjx-container [rspace="2"]':{"margin-right":".167em"},'mjx-container [rspace="3"]':{"margin-right":".222em"},'mjx-container [rspace="4"]':{"margin-right":".278em"},'mjx-container [rspace="5"]':{"margin-right":".333em"},'mjx-container [size="s"]':{"font-size":"70.7%"},'mjx-container [size="ss"]':{"font-size":"50%"},'mjx-container [size="Tn"]':{"font-size":"60%"},'mjx-container [size="sm"]':{"font-size":"85%"},'mjx-container [size="lg"]':{"font-size":"120%"},'mjx-container [size="Lg"]':{"font-size":"144%"},'mjx-container [size="LG"]':{"font-size":"173%"},'mjx-container [size="hg"]':{"font-size":"207%"},'mjx-container [size="HG"]':{"font-size":"249%"},'mjx-container [width="full"]':{width:"100%"},"mjx-box":{display:"inline-block"},"mjx-block":{display:"block"},"mjx-itable":{display:"inline-table"},"mjx-row":{display:"table-row"},"mjx-row > *":{display:"table-cell"},"mjx-mtext":{display:"inline-block"},"mjx-mstyle":{display:"inline-block"},"mjx-merror":{display:"inline-block",color:"red","background-color":"yellow"},"mjx-mphantom":{visibility:"hidden"},"_::-webkit-full-page-media, _:future, :root mjx-container":{"will-change":"opacity"}},e.STYLESHEETID="MJX-CHTML-styles",e}(h.CommonOutputJax);e.CHTML=v},2098:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},i.apply(this,arguments)},a=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),s=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||a(e,t,r)},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.AddCSS=e.CHTMLFontData=void 0;var h=r(9250),u=r(7427),p=r(6914);s(r(9250),e);var d=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.charUsage=new u.Usage,e.delimUsage=new u.Usage,e}return n(e,t),e.charOptions=function(e,r){return t.charOptions.call(this,e,r)},e.prototype.adaptiveCSS=function(t){this.options.adaptiveCSS=t},e.prototype.clearCache=function(){this.options.adaptiveCSS&&(this.charUsage.clear(),this.delimUsage.clear())},e.prototype.createVariant=function(e,r,o){void 0===r&&(r=null),void 0===o&&(o=null),t.prototype.createVariant.call(this,e,r,o);var n=this.constructor;this.variant[e].classes=n.defaultVariantClasses[e],this.variant[e].letter=n.defaultVariantLetters[e]},e.prototype.defineChars=function(r,o){var n,i;t.prototype.defineChars.call(this,r,o);var a=this.variant[r].letter;try{for(var s=l(Object.keys(o)),c=s.next();!c.done;c=s.next()){var h=c.value,u=e.charOptions(o,parseInt(h));void 0===u.f&&(u.f=a)}}catch(t){n={error:t}}finally{try{c&&!c.done&&(i=s.return)&&i.call(s)}finally{if(n)throw n.error}}},Object.defineProperty(e.prototype,"styles",{get:function(){var t=this.constructor,e=i({},t.defaultStyles);return this.addFontURLs(e,t.defaultFonts,this.options.fontURL),this.options.adaptiveCSS?this.updateStyles(e):this.allStyles(e),e},enumerable:!1,configurable:!0}),e.prototype.updateStyles=function(t){var e,r,o,n;try{for(var i=l(this.delimUsage.update()),a=i.next();!a.done;a=i.next()){var s=a.value;this.addDelimiterStyles(t,s,this.delimiters[s])}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}try{for(var h=l(this.charUsage.update()),u=h.next();!u.done;u=h.next()){var p=c(u.value,2),d=p[0],f=(s=p[1],this.variant[d]);this.addCharStyles(t,f.letter,s,f.chars[s])}}catch(t){o={error:t}}finally{try{u&&!u.done&&(n=h.return)&&n.call(h)}finally{if(o)throw o.error}}return t},e.prototype.allStyles=function(t){var e,r,o,n,i,a;try{for(var s=l(Object.keys(this.delimiters)),c=s.next();!c.done;c=s.next()){var h=c.value,u=parseInt(h);this.addDelimiterStyles(t,u,this.delimiters[u])}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}try{for(var p=l(Object.keys(this.variant)),d=p.next();!d.done;d=p.next()){var f=d.value,m=this.variant[f],y=m.letter;try{for(var v=(i=void 0,l(Object.keys(m.chars))),b=v.next();!b.done;b=v.next()){h=b.value,u=parseInt(h);var g=m.chars[u];(g[3]||{}).smp||(g.length<4&&(g[3]={}),this.addCharStyles(t,y,u,g))}}catch(t){i={error:t}}finally{try{b&&!b.done&&(a=v.return)&&a.call(v)}finally{if(i)throw i.error}}}}catch(t){o={error:t}}finally{try{d&&!d.done&&(n=p.return)&&n.call(p)}finally{if(o)throw o.error}}},e.prototype.addFontURLs=function(t,e,r){var o,n;try{for(var a=l(Object.keys(e)),s=a.next();!s.done;s=a.next()){var c=s.value,h=i({},e[c]);h.src=h.src.replace(/%%URL%%/,r),t[c]=h}}catch(t){o={error:t}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}},e.prototype.addDelimiterStyles=function(t,e,r){var o=this.charSelector(e);r.c&&r.c!==e&&(t[".mjx-stretched mjx-c"+(o=this.charSelector(r.c))+"::before"]={content:this.charContent(r.c)}),r.stretch&&(1===r.dir?this.addDelimiterVStyles(t,o,r):this.addDelimiterHStyles(t,o,r))},e.prototype.addDelimiterVStyles=function(t,e,r){var o=r.HDW,n=c(r.stretch,4),i=n[0],a=n[1],s=n[2],l=n[3],h=this.addDelimiterVPart(t,e,"beg",i,o);this.addDelimiterVPart(t,e,"ext",a,o);var u=this.addDelimiterVPart(t,e,"end",s,o),p={};if(l){var d=this.addDelimiterVPart(t,e,"mid",l,o);p.height="50%",t["mjx-stretchy-v"+e+" > mjx-mid"]={"margin-top":this.em(-d/2),"margin-bottom":this.em(-d/2)}}h&&(p["border-top-width"]=this.em0(h-.03)),u&&(p["border-bottom-width"]=this.em0(u-.03),t["mjx-stretchy-v"+e+" > mjx-end"]={"margin-top":this.em(-u)}),Object.keys(p).length&&(t["mjx-stretchy-v"+e+" > mjx-ext"]=p)},e.prototype.addDelimiterVPart=function(t,e,r,o,n){if(!o)return 0;var i=this.getDelimiterData(o),a=(n[2]-i[2])/2,s={content:this.charContent(o)};return"ext"!==r?s.padding=this.padding(i,a):(s.width=this.em0(n[2]),a&&(s["padding-left"]=this.em0(a))),t["mjx-stretchy-v"+e+" mjx-"+r+" mjx-c::before"]=s,i[0]+i[1]},e.prototype.addDelimiterHStyles=function(t,e,r){var o=c(r.stretch,4),n=o[0],i=o[1],a=o[2],s=o[3],l=r.HDW;this.addDelimiterHPart(t,e,"beg",n,l),this.addDelimiterHPart(t,e,"ext",i,l),this.addDelimiterHPart(t,e,"end",a,l),s&&(this.addDelimiterHPart(t,e,"mid",s,l),t["mjx-stretchy-h"+e+" > mjx-ext"]={width:"50%"})},e.prototype.addDelimiterHPart=function(t,e,r,o,n){if(o){var i=this.getDelimiterData(o)[3],a={content:i&&i.c?'"'+i.c+'"':this.charContent(o)};a.padding=this.padding(n,0,-n[2]),t["mjx-stretchy-h"+e+" mjx-"+r+" mjx-c::before"]=a}},e.prototype.addCharStyles=function(t,e,r,o){var n=o[3],i=void 0!==n.f?n.f:e;t["mjx-c"+this.charSelector(r)+(i?".TEX-"+i:"")+"::before"]={padding:this.padding(o,0,n.ic||0),content:null!=n.c?'"'+n.c+'"':this.charContent(r)}},e.prototype.getDelimiterData=function(t){return this.getChar("-smallop",t)},e.prototype.em=function(t){return(0,p.em)(t)},e.prototype.em0=function(t){return(0,p.em)(Math.max(0,t))},e.prototype.padding=function(t,e,r){var o=c(t,3),n=o[0],i=o[1];return void 0===e&&(e=0),void 0===r&&(r=0),[n,o[2]+r,i,e].map(this.em0).join(" ")},e.prototype.charContent=function(t){return'"'+(t>=32&&t<=126&&34!==t&&39!==t&&92!==t?String.fromCharCode(t):"\\"+t.toString(16).toUpperCase())+'"'},e.prototype.charSelector=function(t){return".mjx-c"+t.toString(16).toUpperCase()},e.OPTIONS=i(i({},h.FontData.OPTIONS),{fontURL:"js/output/chtml/fonts/tex-woff-v2"}),e.JAX="CHTML",e.defaultVariantClasses={},e.defaultVariantLetters={},e.defaultStyles={"mjx-c::before":{display:"block",width:0}},e.defaultFonts={"@font-face /* 0 */":{"font-family":"MJXZERO",src:'url("%%URL%%/MathJax_Zero.woff") format("woff")'}},e}(h.FontData);e.CHTMLFontData=d,e.AddCSS=function(t,e){var r,o;try{for(var n=l(Object.keys(e)),i=n.next();!i.done;i=n.next()){var a=i.value,s=parseInt(a);Object.assign(h.FontData.charOptions(t,s),e[s])}}catch(t){r={error:t}}finally{try{i&&!i.done&&(o=n.return)&&o.call(n)}finally{if(r)throw r.error}}return t}},4458:function(t,e,r){var o=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),n=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&o(e,t,r);return n(e,t),e},a=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||o(e,t,r)},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.Arrow=e.DiagonalArrow=e.DiagonalStrike=e.Border2=e.Border=e.RenderElement=void 0;var l=i(r(5373));a(r(5373),e);e.RenderElement=function(t,e){return void 0===e&&(e=""),function(r,o){var n=r.adjustBorder(r.html("mjx-"+t));if(e){var i=r.getOffset(e);if(r.thickness!==l.THICKNESS||i){var a="translate".concat(e,"(").concat(r.em(r.thickness/2-i),")");r.adaptor.setStyle(n,"transform",a)}}r.adaptor.append(r.chtml,n)}};e.Border=function(t){return l.CommonBorder((function(e,r){e.adaptor.setStyle(r,"border-"+t,e.em(e.thickness)+" solid")}))(t)};e.Border2=function(t,e,r){return l.CommonBorder2((function(t,o){var n=t.em(t.thickness)+" solid";t.adaptor.setStyle(o,"border-"+e,n),t.adaptor.setStyle(o,"border-"+r,n)}))(t,e,r)};e.DiagonalStrike=function(t,e){return l.CommonDiagonalStrike((function(t){return function(r,o){var n=r.getBBox(),i=n.w,a=n.h,l=n.d,c=s(r.getArgMod(i,a+l),2),h=c[0],u=c[1],p=e*r.thickness/2,d=r.adjustBorder(r.html(t,{style:{width:r.em(u),transform:"rotate("+r.fixed(-e*h)+"rad) translateY("+p+"em)"}}));r.adaptor.append(r.chtml,d)}}))(t)};e.DiagonalArrow=function(t){return l.CommonDiagonalArrow((function(t,e){t.adaptor.append(t.chtml,e)}))(t)};e.Arrow=function(t){return l.CommonArrow((function(t,e){t.adaptor.append(t.chtml,e)}))(t)}},7427:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Usage=void 0;var r=function(){function t(){this.used=new Set,this.needsUpdate=[]}return t.prototype.add=function(t){var e=JSON.stringify(t);this.used.has(e)||this.needsUpdate.push(t),this.used.add(e)},t.prototype.has=function(t){return this.used.has(JSON.stringify(t))},t.prototype.clear=function(){this.used.clear(),this.needsUpdate=[]},t.prototype.update=function(){var t=this.needsUpdate;return this.needsUpdate=[],t},t}();e.Usage=r},6617:function(t,e,r){var o,n,i=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),a=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),s=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),l=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&a(e,t,r);return s(e,t),e},c=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},h=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLWrapper=e.SPACE=e.FONTSIZE=void 0;var u=l(r(6914)),p=r(1541),d=r(3717);e.FONTSIZE={"70.7%":"s","70%":"s","50%":"ss","60%":"Tn","85%":"sm","120%":"lg","144%":"Lg","173%":"LG","207%":"hg","249%":"HG"},e.SPACE=((n={})[u.em(2/18)]="1",n[u.em(3/18)]="2",n[u.em(4/18)]="3",n[u.em(5/18)]="4",n[u.em(6/18)]="5",n);var f=function(t){function r(){var e=null!==t&&t.apply(this,arguments)||this;return e.chtml=null,e}return i(r,t),r.prototype.toCHTML=function(t){var e,r,o=this.standardCHTMLnode(t);try{for(var n=c(this.childNodes),i=n.next();!i.done;i=n.next()){i.value.toCHTML(o)}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},r.prototype.standardCHTMLnode=function(t){this.markUsed();var e=this.createCHTMLnode(t);return this.handleStyles(),this.handleVariant(),this.handleScale(),this.handleColor(),this.handleSpace(),this.handleAttributes(),this.handlePWidth(),e},r.prototype.markUsed=function(){this.jax.wrapperUsage.add(this.kind)},r.prototype.createCHTMLnode=function(t){var e=this.node.attributes.get("href");return e&&(t=this.adaptor.append(t,this.html("a",{href:e}))),this.chtml=this.adaptor.append(t,this.html("mjx-"+this.node.kind)),this.chtml},r.prototype.handleStyles=function(){if(this.styles){var t=this.styles.cssText;if(t){this.adaptor.setAttribute(this.chtml,"style",t);var e=this.styles.get("font-family");e&&this.adaptor.setStyle(this.chtml,"font-family","MJXZERO, "+e)}}},r.prototype.handleVariant=function(){this.node.isToken&&"-explicitFont"!==this.variant&&this.adaptor.setAttribute(this.chtml,"class",(this.font.getVariant(this.variant)||this.font.getVariant("normal")).classes)},r.prototype.handleScale=function(){this.setScale(this.chtml,this.bbox.rscale)},r.prototype.setScale=function(t,r){var o=Math.abs(r-1)<.001?1:r;if(t&&1!==o){var n=this.percent(o);e.FONTSIZE[n]?this.adaptor.setAttribute(t,"size",e.FONTSIZE[n]):this.adaptor.setStyle(t,"fontSize",n)}return t},r.prototype.handleSpace=function(){var t,r;try{for(var o=c([[this.bbox.L,"space","marginLeft"],[this.bbox.R,"rspace","marginRight"]]),n=o.next();!n.done;n=o.next()){var i=n.value,a=h(i,3),s=a[0],l=a[1],u=a[2];if(s){var p=this.em(s);e.SPACE[p]?this.adaptor.setAttribute(this.chtml,l,e.SPACE[p]):this.adaptor.setStyle(this.chtml,u,p)}}}catch(e){t={error:e}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}},r.prototype.handleColor=function(){var t=this.node.attributes,e=t.getExplicit("mathcolor"),r=t.getExplicit("color"),o=t.getExplicit("mathbackground"),n=t.getExplicit("background");(e||r)&&this.adaptor.setStyle(this.chtml,"color",e||r),(o||n)&&this.adaptor.setStyle(this.chtml,"backgroundColor",o||n)},r.prototype.handleAttributes=function(){var t,e,o,n,i=this.node.attributes,a=i.getAllDefaults(),s=r.skipAttributes;try{for(var l=c(i.getExplicitNames()),h=l.next();!h.done;h=l.next()){var u=h.value;!1!==s[u]&&(u in a||s[u]||this.adaptor.hasAttribute(this.chtml,u))||this.adaptor.setAttribute(this.chtml,u,i.getExplicit(u))}}catch(e){t={error:e}}finally{try{h&&!h.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}if(i.get("class")){var p=i.get("class").trim().split(/ +/);try{for(var d=c(p),f=d.next();!f.done;f=d.next()){var m=f.value;this.adaptor.addClass(this.chtml,m)}}catch(t){o={error:t}}finally{try{f&&!f.done&&(n=d.return)&&n.call(d)}finally{if(o)throw o.error}}}},r.prototype.handlePWidth=function(){this.bbox.pwidth&&(this.bbox.pwidth===d.BBox.fullWidth?this.adaptor.setAttribute(this.chtml,"width","full"):this.adaptor.setStyle(this.chtml,"width",this.bbox.pwidth))},r.prototype.setIndent=function(t,e,r){var o=this.adaptor;if("center"===e||"left"===e){var n=this.getBBox().L;o.setStyle(t,"margin-left",this.em(r+n))}if("center"===e||"right"===e){var i=this.getBBox().R;o.setStyle(t,"margin-right",this.em(-r+i))}},r.prototype.drawBBox=function(){var t=this.getBBox(),e=t.w,r=t.h,o=t.d,n=t.R,i=this.html("mjx-box",{style:{opacity:.25,"margin-left":this.em(-e-n)}},[this.html("mjx-box",{style:{height:this.em(r),width:this.em(e),"background-color":"red"}}),this.html("mjx-box",{style:{height:this.em(o),width:this.em(e),"margin-left":this.em(-e),"vertical-align":this.em(-o),"background-color":"green"}})]),a=this.chtml||this.parent.chtml,s=this.adaptor.getAttribute(a,"size");s&&this.adaptor.setAttribute(i,"size",s);var l=this.adaptor.getStyle(a,"fontSize");l&&this.adaptor.setStyle(i,"fontSize",l),this.adaptor.append(this.adaptor.parent(a),i),this.adaptor.setStyle(a,"backgroundColor","#FFEE00")},r.prototype.html=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.jax.html(t,e,r)},r.prototype.text=function(t){return this.jax.text(t)},r.prototype.char=function(t){return this.font.charSelector(t).substr(1)},r.kind="unknown",r.autoStyle=!0,r}(p.CommonWrapper);e.CHTMLWrapper=f},4477:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLWrapperFactory=void 0;var i=r(1475),a=r(8369),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.defaultNodes=a.CHTMLWrappers,e}(i.CommonWrapperFactory);e.CHTMLWrapperFactory=s},8369:function(t,e,r){var o;Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLWrappers=void 0;var n=r(6617),i=r(4155),a=r(3271),s=r(3292),l=r(7013),c=r(9821),h=r(6359),u=r(6024),p=r(7215),d=r(3215),f=r(3126),m=r(7047),y=r(7837),v=r(5437),b=r(7111),g=r(513),x=r(6577),M=r(1096),_=r(6918),w=r(7500),j=r(8709),C=r(7918),O=r(1315),S=r(7795),T=r(518),B=r(1114);e.CHTMLWrappers=((o={})[i.CHTMLmath.kind]=i.CHTMLmath,o[f.CHTMLmrow.kind]=f.CHTMLmrow,o[f.CHTMLinferredMrow.kind]=f.CHTMLinferredMrow,o[a.CHTMLmi.kind]=a.CHTMLmi,o[s.CHTMLmo.kind]=s.CHTMLmo,o[l.CHTMLmn.kind]=l.CHTMLmn,o[c.CHTMLms.kind]=c.CHTMLms,o[h.CHTMLmtext.kind]=h.CHTMLmtext,o[u.CHTMLmspace.kind]=u.CHTMLmspace,o[p.CHTMLmpadded.kind]=p.CHTMLmpadded,o[d.CHTMLmenclose.kind]=d.CHTMLmenclose,o[y.CHTMLmfrac.kind]=y.CHTMLmfrac,o[v.CHTMLmsqrt.kind]=v.CHTMLmsqrt,o[b.CHTMLmroot.kind]=b.CHTMLmroot,o[g.CHTMLmsub.kind]=g.CHTMLmsub,o[g.CHTMLmsup.kind]=g.CHTMLmsup,o[g.CHTMLmsubsup.kind]=g.CHTMLmsubsup,o[x.CHTMLmunder.kind]=x.CHTMLmunder,o[x.CHTMLmover.kind]=x.CHTMLmover,o[x.CHTMLmunderover.kind]=x.CHTMLmunderover,o[M.CHTMLmmultiscripts.kind]=M.CHTMLmmultiscripts,o[m.CHTMLmfenced.kind]=m.CHTMLmfenced,o[_.CHTMLmtable.kind]=_.CHTMLmtable,o[w.CHTMLmtr.kind]=w.CHTMLmtr,o[w.CHTMLmlabeledtr.kind]=w.CHTMLmlabeledtr,o[j.CHTMLmtd.kind]=j.CHTMLmtd,o[C.CHTMLmaction.kind]=C.CHTMLmaction,o[O.CHTMLmglyph.kind]=O.CHTMLmglyph,o[S.CHTMLsemantics.kind]=S.CHTMLsemantics,o[S.CHTMLannotation.kind]=S.CHTMLannotation,o[S.CHTMLannotationXML.kind]=S.CHTMLannotationXML,o[S.CHTMLxml.kind]=S.CHTMLxml,o[T.CHTMLTeXAtom.kind]=T.CHTMLTeXAtom,o[B.CHTMLTextNode.kind]=B.CHTMLTextNode,o[n.CHTMLWrapper.kind]=n.CHTMLWrapper,o)},518:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLTeXAtom=void 0;var i=r(6617),a=r(3438),s=r(4282),l=r(8921),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(e){if(t.prototype.toCHTML.call(this,e),this.adaptor.setAttribute(this.chtml,"texclass",l.TEXCLASSNAMES[this.node.texClass]),this.node.texClass===l.TEXCLASS.VCENTER){var r=this.childNodes[0].getBBox(),o=r.h,n=(o+r.d)/2+this.font.params.axis_height-o;this.adaptor.setStyle(this.chtml,"verticalAlign",this.em(n))}},e.kind=s.TeXAtom.prototype.kind,e}((0,a.CommonTeXAtomMixin)(i.CHTMLWrapper));e.CHTMLTeXAtom=c},1114:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLTextNode=void 0;var a=r(8921),s=r(6617),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e,r;this.markUsed();var o=this.adaptor,n=this.parent.variant,a=this.node.getText();if(0!==a.length)if("-explicitFont"===n)o.append(t,this.jax.unknownText(a,n,this.getBBox().w));else{var s=this.remappedText(a,n);try{for(var l=i(s),c=l.next();!c.done;c=l.next()){var h=c.value,u=this.getVariantChar(n,h)[3],p=u.f?" TEX-"+u.f:"",d=u.unknown?this.jax.unknownText(String.fromCodePoint(h),n):this.html("mjx-c",{class:this.char(h)+p});o.append(t,d),!u.unknown&&this.font.charUsage.add([n,h])}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(e)throw e.error}}}},e.kind=a.TextNode.prototype.kind,e.autoStyle=!1,e.styles={"mjx-c":{display:"inline-block"},"mjx-utext":{display:"inline-block",padding:".75em 0 .2em 0"}},e}((0,r(555).CommonTextNodeMixin)(s.CHTMLWrapper));e.CHTMLTextNode=l},7918:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmaction=void 0;var i=r(6617),a=r(3345),s=r(3345),l=r(3969),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);this.selected.toCHTML(e),this.action(this,this.data)},e.prototype.setEventHandler=function(t,e){this.chtml.addEventListener(t,e)},e.kind=l.MmlMaction.prototype.kind,e.styles={"mjx-maction":{position:"relative"},"mjx-maction > mjx-tool":{display:"none",position:"absolute",bottom:0,right:0,width:0,height:0,"z-index":500},"mjx-tool > mjx-tip":{display:"inline-block",padding:".2em",border:"1px solid #888","font-size":"70%","background-color":"#F8F8F8",color:"black","box-shadow":"2px 2px 5px #AAAAAA"},"mjx-maction[toggle]":{cursor:"pointer"},"mjx-status":{display:"block",position:"fixed",left:"1em",bottom:"1em","min-width":"25%",padding:".2em .4em",border:"1px solid #888","font-size":"90%","background-color":"#F8F8F8",color:"black"}},e.actions=new Map([["toggle",[function(t,e){t.adaptor.setAttribute(t.chtml,"toggle",t.node.attributes.get("selection"));var r=t.factory.jax.math,o=t.factory.jax.document,n=t.node;t.setEventHandler("click",(function(t){r.end.node||(r.start.node=r.end.node=r.typesetRoot,r.start.n=r.end.n=0),n.nextToggleSelection(),r.rerender(o),t.stopPropagation()}))},{}]],["tooltip",[function(t,e){var r=t.childNodes[1];if(r)if(r.node.isKind("mtext")){var o=r.node.getText();t.adaptor.setAttribute(t.chtml,"title",o)}else{var n=t.adaptor,i=n.append(t.chtml,t.html("mjx-tool",{style:{bottom:t.em(-t.dy),right:t.em(-t.dx)}},[t.html("mjx-tip")]));r.toCHTML(n.firstChild(i)),t.setEventHandler("mouseover",(function(r){e.stopTimers(t,e);var o=setTimeout((function(){return n.setStyle(i,"display","block")}),e.postDelay);e.hoverTimer.set(t,o),r.stopPropagation()})),t.setEventHandler("mouseout",(function(r){e.stopTimers(t,e);var o=setTimeout((function(){return n.setStyle(i,"display","")}),e.clearDelay);e.clearTimer.set(t,o),r.stopPropagation()}))}},s.TooltipData]],["statusline",[function(t,e){var r=t.childNodes[1];if(r&&r.node.isKind("mtext")){var o=t.adaptor,n=r.node.getText();o.setAttribute(t.chtml,"statusline",n),t.setEventHandler("mouseover",(function(r){if(null===e.status){var i=o.body(o.document);e.status=o.append(i,t.html("mjx-status",{},[t.text(n)]))}r.stopPropagation()})),t.setEventHandler("mouseout",(function(t){e.status&&(o.remove(e.status),e.status=null),t.stopPropagation()}))}},{status:null}]]]),e}((0,a.CommonMactionMixin)(i.CHTMLWrapper));e.CHTMLmaction=c},4155:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmath=void 0;var a=r(6617),s=r(2057),l=r(304),c=r(3717),h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.chtml,o=this.adaptor;"block"===this.node.attributes.get("display")?(o.setAttribute(r,"display","true"),o.setAttribute(e,"display","true"),this.handleDisplay(e)):this.handleInline(e),o.addClass(r,"MJX-TEX")},e.prototype.handleDisplay=function(t){var e=this.adaptor,r=i(this.getAlignShift(),2),o=r[0],n=r[1];if("center"!==o&&e.setAttribute(t,"justify",o),this.bbox.pwidth===c.BBox.fullWidth){if(e.setAttribute(t,"width","full"),this.jax.table){var a=this.jax.table.getOuterBBox(),s=a.L,l=a.w,h=a.R;"right"===o?h=Math.max(h||-n,-n):"left"===o?s=Math.max(s||n,n):"center"===o&&(l+=2*Math.abs(n));var u=this.em(Math.max(0,s+l+h));e.setStyle(t,"min-width",u),e.setStyle(this.jax.table.chtml,"min-width",u)}}else this.setIndent(this.chtml,o,n)},e.prototype.handleInline=function(t){var e=this.adaptor,r=e.getStyle(this.chtml,"margin-right");r&&(e.setStyle(this.chtml,"margin-right",""),e.setStyle(t,"margin-right",r),e.setStyle(t,"width","0"))},e.prototype.setChildPWidths=function(e,r,o){return void 0===r&&(r=null),void 0===o&&(o=!0),!!this.parent&&t.prototype.setChildPWidths.call(this,e,r,o)},e.kind=l.MmlMath.prototype.kind,e.styles={"mjx-math":{"line-height":0,"text-align":"left","text-indent":0,"font-style":"normal","font-weight":"normal","font-size":"100%","font-size-adjust":"none","letter-spacing":"normal","border-collapse":"collapse","word-wrap":"normal","word-spacing":"normal","white-space":"nowrap",direction:"ltr",padding:"1px 0"},'mjx-container[jax="CHTML"][display="true"]':{display:"block","text-align":"center",margin:"1em 0"},'mjx-container[jax="CHTML"][display="true"][width="full"]':{display:"flex"},'mjx-container[jax="CHTML"][display="true"] mjx-math':{padding:0},'mjx-container[jax="CHTML"][justify="left"]':{"text-align":"left"},'mjx-container[jax="CHTML"][justify="right"]':{"text-align":"right"}},e}((0,s.CommonMathMixin)(a.CHTMLWrapper));e.CHTMLmath=h},3215:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return a(e,t),e},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmenclose=void 0;var h=r(6617),u=r(6200),p=s(r(4458)),d=r(4374),f=r(6914);function m(t,e){return Math.atan2(t,e).toFixed(3).replace(/\.?0+$/,"")}var y=m(p.ARROWDX,p.ARROWY),v=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e,r,o,n,i=this.adaptor,a=this.standardCHTMLnode(t),s=i.append(a,this.html("mjx-box"));this.renderChild?this.renderChild(this,s):this.childNodes[0].toCHTML(s);try{for(var c=l(Object.keys(this.notations)),h=c.next();!h.done;h=c.next()){var u=h.value,d=this.notations[u];!d.renderChild&&d.renderer(this,s)}}catch(t){e={error:t}}finally{try{h&&!h.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}var f=this.getPadding();try{for(var m=l(p.sideNames),y=m.next();!y.done;y=m.next()){var v=y.value,b=p.sideIndex[v];f[b]>0&&i.setStyle(s,"padding-"+v,this.em(f[b]))}}catch(t){o={error:t}}finally{try{y&&!y.done&&(n=m.return)&&n.call(m)}finally{if(o)throw o.error}}},e.prototype.arrow=function(t,e,r,o,n){void 0===o&&(o=""),void 0===n&&(n=0);var i=this.getBBox().w,a={width:this.em(t)};i!==t&&(a.left=this.em((i-t)/2)),e&&(a.transform="rotate("+this.fixed(e)+"rad)");var s=this.html("mjx-arrow",{style:a},[this.html("mjx-aline"),this.html("mjx-rthead"),this.html("mjx-rbhead")]);return r&&(this.adaptor.append(s,this.html("mjx-lthead")),this.adaptor.append(s,this.html("mjx-lbhead")),this.adaptor.setAttribute(s,"double","true")),this.adjustArrow(s,r),this.moveArrow(s,o,n),s},e.prototype.adjustArrow=function(t,e){var r=this,o=this.thickness,n=this.arrowhead;if(n.x!==p.ARROWX||n.y!==p.ARROWY||n.dx!==p.ARROWDX||o!==p.THICKNESS){var i=c([o*n.x,o*n.y].map((function(t){return r.em(t)})),2),a=i[0],s=i[1],l=m(n.dx,n.y),h=c(this.adaptor.childNodes(t),5),u=h[0],d=h[1],f=h[2],y=h[3],v=h[4];this.adjustHead(d,[s,"0","1px",a],l),this.adjustHead(f,["1px","0",s,a],"-"+l),this.adjustHead(y,[s,a,"1px","0"],"-"+l),this.adjustHead(v,["1px",a,s,"0"],l),this.adjustLine(u,o,n.x,e)}},e.prototype.adjustHead=function(t,e,r){t&&(this.adaptor.setStyle(t,"border-width",e.join(" ")),this.adaptor.setStyle(t,"transform","skewX("+r+"rad)"))},e.prototype.adjustLine=function(t,e,r,o){this.adaptor.setStyle(t,"borderTop",this.em(e)+" solid"),this.adaptor.setStyle(t,"top",this.em(-e/2)),this.adaptor.setStyle(t,"right",this.em(e*(r-1))),o&&this.adaptor.setStyle(t,"left",this.em(e*(r-1)))},e.prototype.moveArrow=function(t,e,r){if(r){var o=this.adaptor.getStyle(t,"transform");this.adaptor.setStyle(t,"transform","translate".concat(e,"(").concat(this.em(-r),")").concat(o?" "+o:""))}},e.prototype.adjustBorder=function(t){return this.thickness!==p.THICKNESS&&this.adaptor.setStyle(t,"borderWidth",this.em(this.thickness)),t},e.prototype.adjustThickness=function(t){return this.thickness!==p.THICKNESS&&this.adaptor.setStyle(t,"strokeWidth",this.fixed(this.thickness)),t},e.prototype.fixed=function(t,e){return void 0===e&&(e=3),Math.abs(t)<6e-4?"0":t.toFixed(e).replace(/\.?0+$/,"")},e.prototype.em=function(e){return t.prototype.em.call(this,e)},e.kind=d.MmlMenclose.prototype.kind,e.styles={"mjx-menclose":{position:"relative"},"mjx-menclose > mjx-dstrike":{display:"inline-block",left:0,top:0,position:"absolute","border-top":p.SOLID,"transform-origin":"top left"},"mjx-menclose > mjx-ustrike":{display:"inline-block",left:0,bottom:0,position:"absolute","border-top":p.SOLID,"transform-origin":"bottom left"},"mjx-menclose > mjx-hstrike":{"border-top":p.SOLID,position:"absolute",left:0,right:0,bottom:"50%",transform:"translateY("+(0,f.em)(p.THICKNESS/2)+")"},"mjx-menclose > mjx-vstrike":{"border-left":p.SOLID,position:"absolute",top:0,bottom:0,right:"50%",transform:"translateX("+(0,f.em)(p.THICKNESS/2)+")"},"mjx-menclose > mjx-rbox":{position:"absolute",top:0,bottom:0,right:0,left:0,border:p.SOLID,"border-radius":(0,f.em)(p.THICKNESS+p.PADDING)},"mjx-menclose > mjx-cbox":{position:"absolute",top:0,bottom:0,right:0,left:0,border:p.SOLID,"border-radius":"50%"},"mjx-menclose > mjx-arrow":{position:"absolute",left:0,bottom:"50%",height:0,width:0},"mjx-menclose > mjx-arrow > *":{display:"block",position:"absolute","transform-origin":"bottom","border-left":(0,f.em)(p.THICKNESS*p.ARROWX)+" solid","border-right":0,"box-sizing":"border-box"},"mjx-menclose > mjx-arrow > mjx-aline":{left:0,top:(0,f.em)(-p.THICKNESS/2),right:(0,f.em)(p.THICKNESS*(p.ARROWX-1)),height:0,"border-top":(0,f.em)(p.THICKNESS)+" solid","border-left":0},"mjx-menclose > mjx-arrow[double] > mjx-aline":{left:(0,f.em)(p.THICKNESS*(p.ARROWX-1)),height:0},"mjx-menclose > mjx-arrow > mjx-rthead":{transform:"skewX("+y+"rad)",right:0,bottom:"-1px","border-bottom":"1px solid transparent","border-top":(0,f.em)(p.THICKNESS*p.ARROWY)+" solid transparent"},"mjx-menclose > mjx-arrow > mjx-rbhead":{transform:"skewX(-"+y+"rad)","transform-origin":"top",right:0,top:"-1px","border-top":"1px solid transparent","border-bottom":(0,f.em)(p.THICKNESS*p.ARROWY)+" solid transparent"},"mjx-menclose > mjx-arrow > mjx-lthead":{transform:"skewX(-"+y+"rad)",left:0,bottom:"-1px","border-left":0,"border-right":(0,f.em)(p.THICKNESS*p.ARROWX)+" solid","border-bottom":"1px solid transparent","border-top":(0,f.em)(p.THICKNESS*p.ARROWY)+" solid transparent"},"mjx-menclose > mjx-arrow > mjx-lbhead":{transform:"skewX("+y+"rad)","transform-origin":"top",left:0,top:"-1px","border-left":0,"border-right":(0,f.em)(p.THICKNESS*p.ARROWX)+" solid","border-top":"1px solid transparent","border-bottom":(0,f.em)(p.THICKNESS*p.ARROWY)+" solid transparent"},"mjx-menclose > dbox":{position:"absolute",top:0,bottom:0,left:(0,f.em)(-1.5*p.PADDING),width:(0,f.em)(3*p.PADDING),border:(0,f.em)(p.THICKNESS)+" solid","border-radius":"50%","clip-path":"inset(0 0 0 "+(0,f.em)(1.5*p.PADDING)+")","box-sizing":"border-box"}},e.notations=new Map([p.Border("top"),p.Border("right"),p.Border("bottom"),p.Border("left"),p.Border2("actuarial","top","right"),p.Border2("madruwb","bottom","right"),p.DiagonalStrike("up",1),p.DiagonalStrike("down",-1),["horizontalstrike",{renderer:p.RenderElement("hstrike","Y"),bbox:function(t){return[0,t.padding,0,t.padding]}}],["verticalstrike",{renderer:p.RenderElement("vstrike","X"),bbox:function(t){return[t.padding,0,t.padding,0]}}],["box",{renderer:function(t,e){t.adaptor.setStyle(e,"border",t.em(t.thickness)+" solid")},bbox:p.fullBBox,border:p.fullBorder,remove:"left right top bottom"}],["roundedbox",{renderer:p.RenderElement("rbox"),bbox:p.fullBBox}],["circle",{renderer:p.RenderElement("cbox"),bbox:p.fullBBox}],["phasorangle",{renderer:function(t,e){var r=t.getBBox(),o=r.h,n=r.d,i=c(t.getArgMod(1.75*t.padding,o+n),2),a=i[0],s=i[1],l=t.thickness*Math.sin(a)*.9;t.adaptor.setStyle(e,"border-bottom",t.em(t.thickness)+" solid");var h=t.adjustBorder(t.html("mjx-ustrike",{style:{width:t.em(s),transform:"translateX("+t.em(l)+") rotate("+t.fixed(-a)+"rad)"}}));t.adaptor.append(t.chtml,h)},bbox:function(t){var e=t.padding/2,r=t.thickness;return[2*e,e,e+r,3*e+r]},border:function(t){return[0,0,t.thickness,0]},remove:"bottom"}],p.Arrow("up"),p.Arrow("down"),p.Arrow("left"),p.Arrow("right"),p.Arrow("updown"),p.Arrow("leftright"),p.DiagonalArrow("updiagonal"),p.DiagonalArrow("northeast"),p.DiagonalArrow("southeast"),p.DiagonalArrow("northwest"),p.DiagonalArrow("southwest"),p.DiagonalArrow("northeastsouthwest"),p.DiagonalArrow("northwestsoutheast"),["longdiv",{renderer:function(t,e){var r=t.adaptor;r.setStyle(e,"border-top",t.em(t.thickness)+" solid");var o=r.append(t.chtml,t.html("dbox")),n=t.thickness,i=t.padding;n!==p.THICKNESS&&r.setStyle(o,"border-width",t.em(n)),i!==p.PADDING&&(r.setStyle(o,"left",t.em(-1.5*i)),r.setStyle(o,"width",t.em(3*i)),r.setStyle(o,"clip-path","inset(0 0 0 "+t.em(1.5*i)+")"))},bbox:function(t){var e=t.padding,r=t.thickness;return[e+r,e,e,2*e+r/2]}}],["radical",{renderer:function(t,e){t.msqrt.toCHTML(e);var r=t.sqrtTRBL();t.adaptor.setStyle(t.msqrt.chtml,"margin",r.map((function(e){return t.em(-e)})).join(" "))},init:function(t){t.msqrt=t.createMsqrt(t.childNodes[0])},bbox:function(t){return t.sqrtTRBL()},renderChild:!0}]]),e}((0,u.CommonMencloseMixin)(h.CHTMLWrapper));e.CHTMLmenclose=v},7047:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmfenced=void 0;var i=r(6617),a=r(1346),s=r(7451),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);this.mrow.toCHTML(e)},e.kind=s.MmlMfenced.prototype.kind,e}((0,a.CommonMfencedMixin)(i.CHTMLWrapper));e.CHTMLmfenced=l},7837:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmfrac=void 0;var a=r(6617),s=r(5705),l=r(848),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){this.standardCHTMLnode(t);var e=this.node.attributes.getList("linethickness","bevelled"),r=e.linethickness,o=e.bevelled,n=this.isDisplay();if(o)this.makeBevelled(n);else{var i=this.length2em(String(r),.06);0===i?this.makeAtop(n):this.makeFraction(n,i)}},e.prototype.makeFraction=function(t,e){var r,o,n=this.node.attributes.getList("numalign","denomalign"),a=n.numalign,s=n.denomalign,l=t?{type:"d"}:{},c=this.node.getProperty("withDelims")?i(i({},l),{delims:"true"}):i({},l),h="center"!==a?{align:a}:{},u="center"!==s?{align:s}:{},p=i({},l),d=i({},l),f=this.font.params;if(.06!==e){var m=f.axis_height,y=this.em(e),v=this.getTUV(t,e),b=v.T,g=v.u,x=v.v,M=(t?this.em(3*e):y)+" -.1em";l.style={height:y,"border-top":y+" solid",margin:M};var _=this.em(Math.max(0,g));d.style={height:_,"vertical-align":"-"+_},p.style={height:this.em(Math.max(0,x))},c.style={"vertical-align":this.em(m-b)}}this.adaptor.append(this.chtml,this.html("mjx-frac",c,[r=this.html("mjx-num",h,[this.html("mjx-nstrut",d)]),this.html("mjx-dbox",{},[this.html("mjx-dtable",{},[this.html("mjx-line",l),this.html("mjx-row",{},[o=this.html("mjx-den",u,[this.html("mjx-dstrut",p)])])])])])),this.childNodes[0].toCHTML(r),this.childNodes[1].toCHTML(o)},e.prototype.makeAtop=function(t){var e,r,o=this.node.attributes.getList("numalign","denomalign"),n=o.numalign,a=o.denomalign,s=t?{type:"d",atop:!0}:{atop:!0},l=this.node.getProperty("withDelims")?i(i({},s),{delims:!0}):i({},s),c="center"!==n?{align:n}:{},h="center"!==a?{align:a}:{},u=this.getUVQ(t),p=u.v,d=u.q;c.style={"padding-bottom":this.em(d)},l.style={"vertical-align":this.em(-p)},this.adaptor.append(this.chtml,this.html("mjx-frac",l,[e=this.html("mjx-num",c),r=this.html("mjx-den",h)])),this.childNodes[0].toCHTML(e),this.childNodes[1].toCHTML(r)},e.prototype.makeBevelled=function(t){var e=this.adaptor;e.setAttribute(this.chtml,"bevelled","ture");var r=e.append(this.chtml,this.html("mjx-num"));this.childNodes[0].toCHTML(r),this.bevel.toCHTML(this.chtml);var o=e.append(this.chtml,this.html("mjx-den"));this.childNodes[1].toCHTML(o);var n=this.getBevelData(t),i=n.u,a=n.v,s=n.delta,l=n.nbox,c=n.dbox;i&&e.setStyle(r,"verticalAlign",this.em(i/l.scale)),a&&e.setStyle(o,"verticalAlign",this.em(a/c.scale));var h=this.em(-s/2);e.setStyle(this.bevel.chtml,"marginLeft",h),e.setStyle(this.bevel.chtml,"marginRight",h)},e.kind=l.MmlMfrac.prototype.kind,e.styles={"mjx-frac":{display:"inline-block","vertical-align":"0.17em",padding:"0 .22em"},'mjx-frac[type="d"]':{"vertical-align":".04em"},"mjx-frac[delims]":{padding:"0 .1em"},"mjx-frac[atop]":{padding:"0 .12em"},"mjx-frac[atop][delims]":{padding:"0"},"mjx-dtable":{display:"inline-table",width:"100%"},"mjx-dtable > *":{"font-size":"2000%"},"mjx-dbox":{display:"block","font-size":"5%"},"mjx-num":{display:"block","text-align":"center"},"mjx-den":{display:"block","text-align":"center"},"mjx-mfrac[bevelled] > mjx-num":{display:"inline-block"},"mjx-mfrac[bevelled] > mjx-den":{display:"inline-block"},'mjx-den[align="right"], mjx-num[align="right"]':{"text-align":"right"},'mjx-den[align="left"], mjx-num[align="left"]':{"text-align":"left"},"mjx-nstrut":{display:"inline-block",height:".054em",width:0,"vertical-align":"-.054em"},'mjx-nstrut[type="d"]':{height:".217em","vertical-align":"-.217em"},"mjx-dstrut":{display:"inline-block",height:".505em",width:0},'mjx-dstrut[type="d"]':{height:".726em"},"mjx-line":{display:"block","box-sizing":"border-box","min-height":"1px",height:".06em","border-top":".06em solid",margin:".06em -.1em",overflow:"hidden"},'mjx-line[type="d"]':{margin:".18em -.1em"}},e}((0,s.CommonMfracMixin)(a.CHTMLWrapper));e.CHTMLmfrac=c},1315:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmglyph=void 0;var i=r(6617),a=r(7969),s=r(910),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);if(this.charWrapper)this.charWrapper.toCHTML(e);else{var r=this.node.attributes.getList("src","alt"),o=r.src,n=r.alt,i={width:this.em(this.width),height:this.em(this.height)};this.valign&&(i.verticalAlign=this.em(this.valign));var a=this.html("img",{src:o,style:i,alt:n,title:n});this.adaptor.append(e,a)}},e.kind=s.MmlMglyph.prototype.kind,e.styles={"mjx-mglyph > img":{display:"inline-block",border:0,padding:0}},e}((0,a.CommonMglyphMixin)(i.CHTMLWrapper));e.CHTMLmglyph=l},3271:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmi=void 0;var i=r(6617),a=r(1419),s=r(7754),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlMi.prototype.kind,e}((0,a.CommonMiMixin)(i.CHTMLWrapper));e.CHTMLmi=l},1096:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmmultiscripts=void 0;var a=r(513),s=r(9906),l=r(7764),c=r(6720),h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t),r=this.scriptData,o=this.node.getProperty("scriptalign")||"right left",n=i((0,c.split)(o+" "+o),2),a=n[0],s=n[1],l=this.combinePrePost(r.sub,r.psub),h=this.combinePrePost(r.sup,r.psup),u=i(this.getUVQ(l,h),2),p=u[0],d=u[1];if(r.numPrescripts){var f=this.addScripts(p,-d,!0,r.psub,r.psup,this.firstPrescript,r.numPrescripts);"right"!==a&&this.adaptor.setAttribute(f,"script-align",a)}if(this.childNodes[0].toCHTML(e),r.numScripts){f=this.addScripts(p,-d,!1,r.sub,r.sup,1,r.numScripts);"left"!==s&&this.adaptor.setAttribute(f,"script-align",s)}},e.prototype.addScripts=function(t,e,r,o,n,i,a){for(var s=this.adaptor,l=t-n.d+(e-o.h),c=t<0&&0===e?o.h+t:t,h=l>0?{style:{height:this.em(l)}}:{},u=c?{style:{"vertical-align":this.em(c)}}:{},p=this.html("mjx-row"),d=this.html("mjx-row",h),f=this.html("mjx-row"),m="mjx-"+(r?"pre":"")+"scripts",y=i+2*a;i<y;)this.childNodes[i++].toCHTML(s.append(f,this.html("mjx-cell"))),this.childNodes[i++].toCHTML(s.append(p,this.html("mjx-cell")));return s.append(this.chtml,this.html(m,u,[p,d,f]))},e.kind=l.MmlMmultiscripts.prototype.kind,e.styles={"mjx-prescripts":{display:"inline-table","padding-left":".05em"},"mjx-scripts":{display:"inline-table","padding-right":".05em"},"mjx-prescripts > mjx-row > mjx-cell":{"text-align":"right"},'[script-align="left"] > mjx-row > mjx-cell':{"text-align":"left"},'[script-align="center"] > mjx-row > mjx-cell':{"text-align":"center"},'[script-align="right"] > mjx-row > mjx-cell':{"text-align":"right"}},e}((0,s.CommonMmultiscriptsMixin)(a.CHTMLmsubsup));e.CHTMLmmultiscripts=h},7013:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmn=void 0;var i=r(6617),a=r(2304),s=r(3235),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlMn.prototype.kind,e}((0,a.CommonMnMixin)(i.CHTMLWrapper));e.CHTMLmn=l},3292:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmo=void 0;var a=r(6617),s=r(437),l=r(9946),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e,r,o=this.node.attributes,n=o.get("symmetric")&&2!==this.stretch.dir,a=0!==this.stretch.dir;a&&null===this.size&&this.getStretchedVariant([]);var s=this.standardCHTMLnode(t);if(a&&this.size<0)this.stretchHTML(s);else{if(n||o.get("largeop")){var l=this.em(this.getCenterOffset());"0"!==l&&this.adaptor.setStyle(s,"verticalAlign",l)}this.node.getProperty("mathaccent")&&(this.adaptor.setStyle(s,"width","0"),this.adaptor.setStyle(s,"margin-left",this.em(this.getAccentOffset())));try{for(var c=i(this.childNodes),h=c.next();!h.done;h=c.next()){h.value.toCHTML(s)}}catch(t){e={error:t}}finally{try{h&&!h.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}}},e.prototype.stretchHTML=function(t){var e=this.getText().codePointAt(0);this.font.delimUsage.add(e),this.childNodes[0].markUsed();var r=this.stretch,o=r.stretch,n=[];o[0]&&n.push(this.html("mjx-beg",{},[this.html("mjx-c")])),n.push(this.html("mjx-ext",{},[this.html("mjx-c")])),4===o.length&&n.push(this.html("mjx-mid",{},[this.html("mjx-c")]),this.html("mjx-ext",{},[this.html("mjx-c")])),o[2]&&n.push(this.html("mjx-end",{},[this.html("mjx-c")]));var i={},a=this.bbox,l=a.h,c=a.d,h=a.w;1===r.dir?(n.push(this.html("mjx-mark")),i.height=this.em(l+c),i.verticalAlign=this.em(-c)):i.width=this.em(h);var u=s.DirectionVH[r.dir],p={class:this.char(r.c||e),style:i},d=this.html("mjx-stretchy-"+u,p,n);this.adaptor.append(t,d)},e.kind=l.MmlMo.prototype.kind,e.styles={"mjx-stretchy-h":{display:"inline-table",width:"100%"},"mjx-stretchy-h > *":{display:"table-cell",width:0},"mjx-stretchy-h > * > mjx-c":{display:"inline-block",transform:"scalex(1.0000001)"},"mjx-stretchy-h > * > mjx-c::before":{display:"inline-block",width:"initial"},"mjx-stretchy-h > mjx-ext":{"/* IE */ overflow":"hidden","/* others */ overflow":"clip visible",width:"100%"},"mjx-stretchy-h > mjx-ext > mjx-c::before":{transform:"scalex(500)"},"mjx-stretchy-h > mjx-ext > mjx-c":{width:0},"mjx-stretchy-h > mjx-beg > mjx-c":{"margin-right":"-.1em"},"mjx-stretchy-h > mjx-end > mjx-c":{"margin-left":"-.1em"},"mjx-stretchy-v":{display:"inline-block"},"mjx-stretchy-v > *":{display:"block"},"mjx-stretchy-v > mjx-beg":{height:0},"mjx-stretchy-v > mjx-end > mjx-c":{display:"block"},"mjx-stretchy-v > * > mjx-c":{transform:"scaley(1.0000001)","transform-origin":"left center",overflow:"hidden"},"mjx-stretchy-v > mjx-ext":{display:"block",height:"100%","box-sizing":"border-box",border:"0px solid transparent","/* IE */ overflow":"hidden","/* others */ overflow":"visible clip"},"mjx-stretchy-v > mjx-ext > mjx-c::before":{width:"initial","box-sizing":"border-box"},"mjx-stretchy-v > mjx-ext > mjx-c":{transform:"scaleY(500) translateY(.075em)",overflow:"visible"},"mjx-mark":{display:"inline-block",height:"0px"}},e}((0,s.CommonMoMixin)(a.CHTMLWrapper));e.CHTMLmo=c},7215:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmpadded=void 0;var s=r(6617),l=r(7481),c=r(189),h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e,r,o=this.standardCHTMLnode(t),n=[],s={},l=i(this.getDimens(),9),c=l[2],h=l[3],u=l[4],p=l[5],d=l[6],f=l[7],m=l[8];if(p&&(s.width=this.em(c+p)),(h||u)&&(s.margin=this.em(h)+" 0 "+this.em(u)),d+m||f){s.position="relative";var y=this.html("mjx-rbox",{style:{left:this.em(d+m),top:this.em(-f),"max-width":s.width}});d+m&&this.childNodes[0].getBBox().pwidth&&(this.adaptor.setAttribute(y,"width","full"),this.adaptor.setStyle(y,"left",this.em(d))),n.push(y)}o=this.adaptor.append(o,this.html("mjx-block",{style:s},n));try{for(var v=a(this.childNodes),b=v.next();!b.done;b=v.next()){b.value.toCHTML(n[0]||o)}}catch(t){e={error:t}}finally{try{b&&!b.done&&(r=v.return)&&r.call(v)}finally{if(e)throw e.error}}},e.kind=c.MmlMpadded.prototype.kind,e.styles={"mjx-mpadded":{display:"inline-block"},"mjx-rbox":{display:"inline-block",position:"relative"}},e}((0,l.CommonMpaddedMixin)(s.CHTMLWrapper));e.CHTMLmpadded=h},7111:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmroot=void 0;var a=r(5437),s=r(5997),l=r(4664),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.addRoot=function(t,e,r,o){e.toCHTML(t);var n=i(this.getRootDimens(r,o),3),a=n[0],s=n[1],l=n[2];this.adaptor.setStyle(t,"verticalAlign",this.em(s)),this.adaptor.setStyle(t,"width",this.em(a)),l&&this.adaptor.setStyle(this.adaptor.firstChild(t),"paddingLeft",this.em(l))},e.kind=l.MmlMroot.prototype.kind,e}((0,s.CommonMrootMixin)(a.CHTMLmsqrt));e.CHTMLmroot=c},3126:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLinferredMrow=e.CHTMLmrow=void 0;var a=r(6617),s=r(9323),l=r(9323),c=r(1691),h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e,r,o=this.node.isInferred?this.chtml=t:this.standardCHTMLnode(t),n=!1;try{for(var a=i(this.childNodes),s=a.next();!s.done;s=a.next()){var l=s.value;l.toCHTML(o),l.bbox.w<0&&(n=!0)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=a.return)&&r.call(a)}finally{if(e)throw e.error}}if(n){var c=this.getBBox().w;c&&(this.adaptor.setStyle(o,"width",this.em(Math.max(0,c))),c<0&&this.adaptor.setStyle(o,"marginRight",this.em(c)))}},e.kind=c.MmlMrow.prototype.kind,e}((0,s.CommonMrowMixin)(a.CHTMLWrapper));e.CHTMLmrow=h;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=c.MmlInferredMrow.prototype.kind,e}((0,l.CommonInferredMrowMixin)(h));e.CHTMLinferredMrow=u},9821:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLms=void 0;var i=r(6617),a=r(6920),s=r(4042),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlMs.prototype.kind,e}((0,a.CommonMsMixin)(i.CHTMLWrapper));e.CHTMLms=l},6024:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmspace=void 0;var i=r(6617),a=r(37),s=r(1465),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t),r=this.getBBox(),o=r.w,n=r.h,i=r.d;o<0&&(this.adaptor.setStyle(e,"marginRight",this.em(o)),o=0),o&&this.adaptor.setStyle(e,"width",this.em(o)),(n=Math.max(0,n+i))&&this.adaptor.setStyle(e,"height",this.em(Math.max(0,n))),i&&this.adaptor.setStyle(e,"verticalAlign",this.em(-i))},e.kind=s.MmlMspace.prototype.kind,e}((0,a.CommonMspaceMixin)(i.CHTMLWrapper));e.CHTMLmspace=l},5437:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmsqrt=void 0;var a=r(6617),s=r(222),l=r(4655),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e,r,o,n,a=this.childNodes[this.surd],s=this.childNodes[this.base],l=a.getBBox(),c=s.getOuterBBox(),h=i(this.getPQ(l),2)[1],u=this.font.params.rule_thickness,p=c.h+h+u,d=this.standardCHTMLnode(t);null!=this.root&&(o=this.adaptor.append(d,this.html("mjx-root")),n=this.childNodes[this.root]);var f=this.adaptor.append(d,this.html("mjx-sqrt",{},[e=this.html("mjx-surd"),r=this.html("mjx-box",{style:{paddingTop:this.em(h)}})]));this.addRoot(o,n,l,p),a.toCHTML(e),s.toCHTML(r),a.size<0&&this.adaptor.addClass(f,"mjx-tall")},e.prototype.addRoot=function(t,e,r,o){},e.kind=l.MmlMsqrt.prototype.kind,e.styles={"mjx-root":{display:"inline-block","white-space":"nowrap"},"mjx-surd":{display:"inline-block","vertical-align":"top"},"mjx-sqrt":{display:"inline-block","padding-top":".07em"},"mjx-sqrt > mjx-box":{"border-top":".07em solid"},"mjx-sqrt.mjx-tall > mjx-box":{"padding-left":".3em","margin-left":"-.3em"}},e}((0,s.CommonMsqrtMixin)(a.CHTMLWrapper));e.CHTMLmsqrt=c},513:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmsubsup=e.CHTMLmsup=e.CHTMLmsub=void 0;var a=r(7322),s=r(3069),l=r(3069),c=r(3069),h=r(5857),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=h.MmlMsub.prototype.kind,e}((0,s.CommonMsubMixin)(a.CHTMLscriptbase));e.CHTMLmsub=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=h.MmlMsup.prototype.kind,e}((0,l.CommonMsupMixin)(a.CHTMLscriptbase));e.CHTMLmsup=p;var d=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e=this.adaptor,r=this.standardCHTMLnode(t),o=i([this.baseChild,this.supChild,this.subChild],3),n=o[0],a=o[1],s=o[2],l=i(this.getUVQ(),3),c=l[1],h=l[2],u={"vertical-align":this.em(c)};n.toCHTML(r);var p=e.append(r,this.html("mjx-script",{style:u}));a.toCHTML(p),e.append(p,this.html("mjx-spacer",{style:{"margin-top":this.em(h)}})),s.toCHTML(p);var d=this.getAdjustedIc();d&&e.setStyle(a.chtml,"marginLeft",this.em(d/a.bbox.rscale)),this.baseRemoveIc&&e.setStyle(p,"marginLeft",this.em(-this.baseIc))},e.kind=h.MmlMsubsup.prototype.kind,e.styles={"mjx-script":{display:"inline-block","padding-right":".05em","padding-left":".033em"},"mjx-script > mjx-spacer":{display:"block"}},e}((0,c.CommonMsubsupMixin)(a.CHTMLscriptbase));e.CHTMLmsubsup=d},6918:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmtable=void 0;var s=r(6617),l=r(8589),c=r(4859),h=r(6720),u=function(t){function e(e,r,o){void 0===o&&(o=null);var n=t.call(this,e,r,o)||this;return n.itable=n.html("mjx-itable"),n.labels=n.html("mjx-itable"),n}return n(e,t),e.prototype.getAlignShift=function(){var e=t.prototype.getAlignShift.call(this);return this.isTop||(e[1]=0),e},e.prototype.toCHTML=function(t){var e,r,o=this.standardCHTMLnode(t);this.adaptor.append(o,this.html("mjx-table",{},[this.itable]));try{for(var n=i(this.childNodes),a=n.next();!a.done;a=n.next()){a.value.toCHTML(this.itable)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}this.padRows(),this.handleColumnSpacing(),this.handleColumnLines(),this.handleColumnWidths(),this.handleRowSpacing(),this.handleRowLines(),this.handleRowHeights(),this.handleFrame(),this.handleWidth(),this.handleLabels(),this.handleAlign(),this.handleJustify(),this.shiftColor()},e.prototype.shiftColor=function(){var t=this.adaptor,e=t.getStyle(this.chtml,"backgroundColor");e&&(t.setStyle(this.chtml,"backgroundColor",""),t.setStyle(this.itable,"backgroundColor",e))},e.prototype.padRows=function(){var t,e,r=this.adaptor;try{for(var o=i(r.childNodes(this.itable)),n=o.next();!n.done;n=o.next())for(var a=n.value;r.childNodes(a).length<this.numCols;)r.append(a,this.html("mjx-mtd",{extra:!0}))}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}},e.prototype.handleColumnSpacing=function(){var t,e,r,o,n=this.childNodes[0]?1/this.childNodes[0].getBBox().rscale:1,a=this.getEmHalfSpacing(this.fSpace[0],this.cSpace,n),s=this.frame;try{for(var l=i(this.tableRows),c=l.next();!c.done;c=l.next()){var h=c.value,u=0;try{for(var p=(r=void 0,i(h.tableCells)),d=p.next();!d.done;d=p.next()){var f=d.value,m=a[u++],y=a[u],v=f?f.chtml:this.adaptor.childNodes(h.chtml)[u];(u>1&&"0.4em"!==m||s&&1===u)&&this.adaptor.setStyle(v,"paddingLeft",m),(u<this.numCols&&"0.4em"!==y||s&&u===this.numCols)&&this.adaptor.setStyle(v,"paddingRight",y)}}catch(t){r={error:t}}finally{try{d&&!d.done&&(o=p.return)&&o.call(p)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}},e.prototype.handleColumnLines=function(){var t,e,r,o;if("none"!==this.node.attributes.get("columnlines")){var n=this.getColumnAttributes("columnlines");try{for(var a=i(this.childNodes),s=a.next();!s.done;s=a.next()){var l=s.value,c=0;try{for(var h=(r=void 0,i(this.adaptor.childNodes(l.chtml).slice(1))),u=h.next();!u.done;u=h.next()){var p=u.value,d=n[c++];"none"!==d&&this.adaptor.setStyle(p,"borderLeft",".07em "+d)}}catch(t){r={error:t}}finally{try{u&&!u.done&&(o=h.return)&&o.call(h)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{s&&!s.done&&(e=a.return)&&e.call(a)}finally{if(t)throw t.error}}}},e.prototype.handleColumnWidths=function(){var t,e,r,o;try{for(var n=i(this.childNodes),a=n.next();!a.done;a=n.next()){var s=a.value,l=0;try{for(var c=(r=void 0,i(this.adaptor.childNodes(s.chtml))),h=c.next();!h.done;h=c.next()){var u=h.value,p=this.cWidths[l++];if(null!==p){var d="number"==typeof p?this.em(p):p;this.adaptor.setStyle(u,"width",d),this.adaptor.setStyle(u,"maxWidth",d),this.adaptor.setStyle(u,"minWidth",d)}}}catch(t){r={error:t}}finally{try{h&&!h.done&&(o=c.return)&&o.call(c)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.handleRowSpacing=function(){var t,e,r,o,n=this.childNodes[0]?1/this.childNodes[0].getBBox().rscale:1,a=this.getEmHalfSpacing(this.fSpace[1],this.rSpace,n),s=this.frame,l=0;try{for(var c=i(this.childNodes),h=c.next();!h.done;h=c.next()){var u=h.value,p=a[l++],d=a[l];try{for(var f=(r=void 0,i(u.childNodes)),m=f.next();!m.done;m=f.next()){var y=m.value;(l>1&&"0.215em"!==p||s&&1===l)&&this.adaptor.setStyle(y.chtml,"paddingTop",p),(l<this.numRows&&"0.215em"!==d||s&&l===this.numRows)&&this.adaptor.setStyle(y.chtml,"paddingBottom",d)}}catch(t){r={error:t}}finally{try{m&&!m.done&&(o=f.return)&&o.call(f)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{h&&!h.done&&(e=c.return)&&e.call(c)}finally{if(t)throw t.error}}},e.prototype.handleRowLines=function(){var t,e,r,o;if("none"!==this.node.attributes.get("rowlines")){var n=this.getRowAttributes("rowlines"),a=0;try{for(var s=i(this.childNodes.slice(1)),l=s.next();!l.done;l=s.next()){var c=l.value,h=n[a++];if("none"!==h)try{for(var u=(r=void 0,i(this.adaptor.childNodes(c.chtml))),p=u.next();!p.done;p=u.next()){var d=p.value;this.adaptor.setStyle(d,"borderTop",".07em "+h)}}catch(t){r={error:t}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{l&&!l.done&&(e=s.return)&&e.call(s)}finally{if(t)throw t.error}}}},e.prototype.handleRowHeights=function(){this.node.attributes.get("equalrows")&&this.handleEqualRows()},e.prototype.handleEqualRows=function(){for(var t=this.getRowHalfSpacing(),e=this.getTableData(),r=e.H,o=e.D,n=e.NH,i=e.ND,a=this.getEqualRowHeight(),s=0;s<this.numRows;s++){var l=this.childNodes[s];this.setRowHeight(l,a+t[s]+t[s+1]+this.rLines[s]),a!==n[s]+i[s]&&this.setRowBaseline(l,a,(a-r[s]+o[s])/2)}},e.prototype.setRowHeight=function(t,e){this.adaptor.setStyle(t.chtml,"height",this.em(e))},e.prototype.setRowBaseline=function(t,e,r){var o,n,a=t.node.attributes.get("rowalign");try{for(var s=i(t.childNodes),l=s.next();!l.done;l=s.next()){var c=l.value;if(this.setCellBaseline(c,a,e,r))break}}catch(t){o={error:t}}finally{try{l&&!l.done&&(n=s.return)&&n.call(s)}finally{if(o)throw o.error}}},e.prototype.setCellBaseline=function(t,e,r,o){var n=t.node.attributes.get("rowalign");if("baseline"===n||"axis"===n){var i=this.adaptor,a=i.lastChild(t.chtml);i.setStyle(a,"height",this.em(r)),i.setStyle(a,"verticalAlign",this.em(-o));var s=t.parent;if(!(s.node.isKind("mlabeledtr")&&t===s.childNodes[0]||"baseline"!==e&&"axis"!==e))return!0}return!1},e.prototype.handleFrame=function(){this.frame&&this.fLine&&this.adaptor.setStyle(this.itable,"border",".07em "+this.node.attributes.get("frame"))},e.prototype.handleWidth=function(){var t=this.adaptor,e=this.getBBox(),r=e.w,o=e.L,n=e.R;t.setStyle(this.chtml,"minWidth",this.em(o+r+n));var i=this.node.attributes.get("width");if((0,h.isPercent)(i))t.setStyle(this.chtml,"width",""),t.setAttribute(this.chtml,"width","full");else if(!this.hasLabels){if("auto"===i)return;i=this.em(this.length2em(i)+2*this.fLine)}var a=t.firstChild(this.chtml);if(t.setStyle(a,"width",i),t.setStyle(a,"minWidth",this.em(r)),o||n){t.setStyle(this.chtml,"margin","");var s=this.node.attributes.get("data-width-includes-label")?"padding":"margin";o===n?t.setStyle(a,s,"0 "+this.em(n)):t.setStyle(a,s,"0 "+this.em(n)+" 0 "+this.em(o))}t.setAttribute(this.itable,"width","full")},e.prototype.handleAlign=function(){var t=a(this.getAlignmentRow(),2),e=t[0],r=t[1];if(null===r)"axis"!==e&&this.adaptor.setAttribute(this.chtml,"align",e);else{var o=this.getVerticalPosition(r,e);this.adaptor.setAttribute(this.chtml,"align","top"),this.adaptor.setStyle(this.chtml,"verticalAlign",this.em(o))}},e.prototype.handleJustify=function(){var t=this.getAlignShift()[0];"center"!==t&&this.adaptor.setAttribute(this.chtml,"justify",t)},e.prototype.handleLabels=function(){if(this.hasLabels){var t=this.labels,e=this.node.attributes,r=this.adaptor,o=e.get("side");r.setAttribute(this.chtml,"side",o),r.setAttribute(t,"align",o),r.setStyle(t,o,"0");var n=a(this.addLabelPadding(o),2),i=n[0],s=n[1];if(s){var l=r.firstChild(this.chtml);this.setIndent(l,i,s)}this.updateRowHeights(),this.addLabelSpacing()}},e.prototype.addLabelPadding=function(t){var e=a(this.getPadAlignShift(t),3),r=e[1],o=e[2],n={};if("right"===t&&!this.node.attributes.get("data-width-includes-label")){var i=this.node.attributes.get("width"),s=this.getBBox(),l=s.w,c=s.L,u=s.R;n.style={width:(0,h.isPercent)(i)?"calc("+i+" + "+this.em(c+u)+")":this.em(c+l+u)}}return this.adaptor.append(this.chtml,this.html("mjx-labels",n,[this.labels])),[r,o]},e.prototype.updateRowHeights=function(){for(var t=this.getTableData(),e=t.H,r=t.D,o=t.NH,n=t.ND,i=this.getRowHalfSpacing(),a=0;a<this.numRows;a++){var s=this.childNodes[a];this.setRowHeight(s,e[a]+r[a]+i[a]+i[a+1]+this.rLines[a]),e[a]!==o[a]||r[a]!==n[a]?this.setRowBaseline(s,e[a]+r[a],r[a]):s.node.isKind("mlabeledtr")&&this.setCellBaseline(s.childNodes[0],"",e[a]+r[a],r[a])}},e.prototype.addLabelSpacing=function(){for(var t=this.adaptor,e=this.node.attributes.get("equalrows"),r=this.getTableData(),o=r.H,n=r.D,i=e?this.getEqualRowHeight():0,a=this.getRowHalfSpacing(),s=this.fLine,l=t.firstChild(this.labels),c=0;c<this.numRows;c++){this.childNodes[c].node.isKind("mlabeledtr")?(s&&t.insert(this.html("mjx-mtr",{style:{height:this.em(s)}}),l),t.setStyle(l,"height",this.em((e?i:o[c]+n[c])+a[c]+a[c+1])),l=t.next(l),s=this.rLines[c]):s+=a[c]+(e?i:o[c]+n[c])+a[c+1]+this.rLines[c]}},e.kind=c.MmlMtable.prototype.kind,e.styles={"mjx-mtable":{"vertical-align":".25em","text-align":"center",position:"relative","box-sizing":"border-box","border-spacing":0,"border-collapse":"collapse"},'mjx-mstyle[size="s"] mjx-mtable':{"vertical-align":".354em"},"mjx-labels":{position:"absolute",left:0,top:0},"mjx-table":{display:"inline-block","vertical-align":"-.5ex","box-sizing":"border-box"},"mjx-table > mjx-itable":{"vertical-align":"middle","text-align":"left","box-sizing":"border-box"},"mjx-labels > mjx-itable":{position:"absolute",top:0},'mjx-mtable[justify="left"]':{"text-align":"left"},'mjx-mtable[justify="right"]':{"text-align":"right"},'mjx-mtable[justify="left"][side="left"]':{"padding-right":"0 ! important"},'mjx-mtable[justify="left"][side="right"]':{"padding-left":"0 ! important"},'mjx-mtable[justify="right"][side="left"]':{"padding-right":"0 ! important"},'mjx-mtable[justify="right"][side="right"]':{"padding-left":"0 ! important"},"mjx-mtable[align]":{"vertical-align":"baseline"},'mjx-mtable[align="top"] > mjx-table':{"vertical-align":"top"},'mjx-mtable[align="bottom"] > mjx-table':{"vertical-align":"bottom"},'mjx-mtable[side="right"] mjx-labels':{"min-width":"100%"}},e}((0,l.CommonMtableMixin)(s.CHTMLWrapper));e.CHTMLmtable=u},8709:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmtd=void 0;var i=r(6617),a=r(7805),s=r(2321),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.node.attributes.get("rowalign"),o=this.node.attributes.get("columnalign");r!==this.parent.node.attributes.get("rowalign")&&this.adaptor.setAttribute(this.chtml,"rowalign",r),"center"===o||"mlabeledtr"===this.parent.kind&&this===this.parent.childNodes[0]&&o===this.parent.parent.node.attributes.get("side")||this.adaptor.setStyle(this.chtml,"textAlign",o),this.parent.parent.node.getProperty("useHeight")&&this.adaptor.append(this.chtml,this.html("mjx-tstrut"))},e.kind=s.MmlMtd.prototype.kind,e.styles={"mjx-mtd":{display:"table-cell","text-align":"center",padding:".215em .4em"},"mjx-mtd:first-child":{"padding-left":0},"mjx-mtd:last-child":{"padding-right":0},"mjx-mtable > * > mjx-itable > *:first-child > mjx-mtd":{"padding-top":0},"mjx-mtable > * > mjx-itable > *:last-child > mjx-mtd":{"padding-bottom":0},"mjx-tstrut":{display:"inline-block",height:"1em","vertical-align":"-.25em"},'mjx-labels[align="left"] > mjx-mtr > mjx-mtd':{"text-align":"left"},'mjx-labels[align="right"] > mjx-mtr > mjx-mtd':{"text-align":"right"},"mjx-mtd[extra]":{padding:0},'mjx-mtd[rowalign="top"]':{"vertical-align":"top"},'mjx-mtd[rowalign="center"]':{"vertical-align":"middle"},'mjx-mtd[rowalign="bottom"]':{"vertical-align":"bottom"},'mjx-mtd[rowalign="baseline"]':{"vertical-align":"baseline"},'mjx-mtd[rowalign="axis"]':{"vertical-align":".25em"}},e}((0,a.CommonMtdMixin)(i.CHTMLWrapper));e.CHTMLmtd=l},6359:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmtext=void 0;var i=r(6617),a=r(8325),s=r(6277),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlMtext.prototype.kind,e}((0,a.CommonMtextMixin)(i.CHTMLWrapper));e.CHTMLmtext=l},7500:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmlabeledtr=e.CHTMLmtr=void 0;var i=r(6617),a=r(4818),s=r(4818),l=r(4393),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.node.attributes.get("rowalign");"baseline"!==r&&this.adaptor.setAttribute(this.chtml,"rowalign",r)},e.kind=l.MmlMtr.prototype.kind,e.styles={"mjx-mtr":{display:"table-row"},'mjx-mtr[rowalign="top"] > mjx-mtd':{"vertical-align":"top"},'mjx-mtr[rowalign="center"] > mjx-mtd':{"vertical-align":"middle"},'mjx-mtr[rowalign="bottom"] > mjx-mtd':{"vertical-align":"bottom"},'mjx-mtr[rowalign="baseline"] > mjx-mtd':{"vertical-align":"baseline"},'mjx-mtr[rowalign="axis"] > mjx-mtd':{"vertical-align":".25em"}},e}((0,a.CommonMtrMixin)(i.CHTMLWrapper));e.CHTMLmtr=c;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.adaptor.firstChild(this.chtml);if(r){this.adaptor.remove(r);var o=this.node.attributes.get("rowalign"),n="baseline"!==o&&"axis"!==o?{rowalign:o}:{},i=this.html("mjx-mtr",n,[r]);this.adaptor.append(this.parent.labels,i)}},e.prototype.markUsed=function(){t.prototype.markUsed.call(this),this.jax.wrapperUsage.add(c.kind)},e.kind=l.MmlMlabeledtr.prototype.kind,e.styles={"mjx-mlabeledtr":{display:"table-row"},'mjx-mlabeledtr[rowalign="top"] > mjx-mtd':{"vertical-align":"top"},'mjx-mlabeledtr[rowalign="center"] > mjx-mtd':{"vertical-align":"middle"},'mjx-mlabeledtr[rowalign="bottom"] > mjx-mtd':{"vertical-align":"bottom"},'mjx-mlabeledtr[rowalign="baseline"] > mjx-mtd':{"vertical-align":"baseline"},'mjx-mlabeledtr[rowalign="axis"] > mjx-mtd':{"vertical-align":".25em"}},e}((0,s.CommonMlabeledtrMixin)(c));e.CHTMLmlabeledtr=h},6577:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmunderover=e.CHTMLmover=e.CHTMLmunder=void 0;var i=r(513),a=r(9690),s=r(9690),l=r(9690),c=r(3102),h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(e){if(this.hasMovableLimits())return t.prototype.toCHTML.call(this,e),void this.adaptor.setAttribute(this.chtml,"limits","false");this.chtml=this.standardCHTMLnode(e);var r=this.adaptor.append(this.adaptor.append(this.chtml,this.html("mjx-row")),this.html("mjx-base")),o=this.adaptor.append(this.adaptor.append(this.chtml,this.html("mjx-row")),this.html("mjx-under"));this.baseChild.toCHTML(r),this.scriptChild.toCHTML(o);var n=this.baseChild.getOuterBBox(),i=this.scriptChild.getOuterBBox(),a=this.getUnderKV(n,i)[0],s=this.isLineBelow?0:this.getDelta(!0);this.adaptor.setStyle(o,"paddingTop",this.em(a)),this.setDeltaW([r,o],this.getDeltaW([n,i],[0,-s])),this.adjustUnderDepth(o,i)},e.kind=c.MmlMunder.prototype.kind,e.styles={"mjx-over":{"text-align":"left"},'mjx-munder:not([limits="false"])':{display:"inline-table"},"mjx-munder > mjx-row":{"text-align":"left"},"mjx-under":{"padding-bottom":".1em"}},e}((0,a.CommonMunderMixin)(i.CHTMLmsub));e.CHTMLmunder=h;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(e){if(this.hasMovableLimits())return t.prototype.toCHTML.call(this,e),void this.adaptor.setAttribute(this.chtml,"limits","false");this.chtml=this.standardCHTMLnode(e);var r=this.adaptor.append(this.chtml,this.html("mjx-over")),o=this.adaptor.append(this.chtml,this.html("mjx-base"));this.scriptChild.toCHTML(r),this.baseChild.toCHTML(o);var n=this.scriptChild.getOuterBBox(),i=this.baseChild.getOuterBBox();this.adjustBaseHeight(o,i);var a=this.getOverKU(i,n)[0],s=this.isLineAbove?0:this.getDelta();this.adaptor.setStyle(r,"paddingBottom",this.em(a)),this.setDeltaW([o,r],this.getDeltaW([i,n],[0,s])),this.adjustOverDepth(r,n)},e.kind=c.MmlMover.prototype.kind,e.styles={'mjx-mover:not([limits="false"])':{"padding-top":".1em"},'mjx-mover:not([limits="false"]) > *':{display:"block","text-align":"left"}},e}((0,s.CommonMoverMixin)(i.CHTMLmsup));e.CHTMLmover=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(e){if(this.hasMovableLimits())return t.prototype.toCHTML.call(this,e),void this.adaptor.setAttribute(this.chtml,"limits","false");this.chtml=this.standardCHTMLnode(e);var r=this.adaptor.append(this.chtml,this.html("mjx-over")),o=this.adaptor.append(this.adaptor.append(this.chtml,this.html("mjx-box")),this.html("mjx-munder")),n=this.adaptor.append(this.adaptor.append(o,this.html("mjx-row")),this.html("mjx-base")),i=this.adaptor.append(this.adaptor.append(o,this.html("mjx-row")),this.html("mjx-under"));this.overChild.toCHTML(r),this.baseChild.toCHTML(n),this.underChild.toCHTML(i);var a=this.overChild.getOuterBBox(),s=this.baseChild.getOuterBBox(),l=this.underChild.getOuterBBox();this.adjustBaseHeight(n,s);var c=this.getOverKU(s,a)[0],h=this.getUnderKV(s,l)[0],u=this.getDelta();this.adaptor.setStyle(r,"paddingBottom",this.em(c)),this.adaptor.setStyle(i,"paddingTop",this.em(h)),this.setDeltaW([n,i,r],this.getDeltaW([s,l,a],[0,this.isLineBelow?0:-u,this.isLineAbove?0:u])),this.adjustOverDepth(r,a),this.adjustUnderDepth(i,l)},e.prototype.markUsed=function(){t.prototype.markUsed.call(this),this.jax.wrapperUsage.add(i.CHTMLmsubsup.kind)},e.kind=c.MmlMunderover.prototype.kind,e.styles={'mjx-munderover:not([limits="false"])':{"padding-top":".1em"},'mjx-munderover:not([limits="false"]) > *':{display:"block"}},e}((0,l.CommonMunderoverMixin)(i.CHTMLmsubsup));e.CHTMLmunderover=p},7322:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLscriptbase=void 0;var s=r(6617),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){this.chtml=this.standardCHTMLnode(t);var e=i(this.getOffset(),2),r=e[0],o=e[1],n=r-(this.baseRemoveIc?this.baseIc:0),a={"vertical-align":this.em(o)};n&&(a["margin-left"]=this.em(n)),this.baseChild.toCHTML(this.chtml),this.scriptChild.toCHTML(this.adaptor.append(this.chtml,this.html("mjx-script",{style:a})))},e.prototype.setDeltaW=function(t,e){for(var r=0;r<e.length;r++)e[r]&&this.adaptor.setStyle(t[r],"paddingLeft",this.em(e[r]))},e.prototype.adjustOverDepth=function(t,e){e.d>=0||this.adaptor.setStyle(t,"marginBottom",this.em(e.d*e.rscale))},e.prototype.adjustUnderDepth=function(t,e){var r,o;if(!(e.d>=0)){var n=this.adaptor,i=this.em(e.d),s=this.html("mjx-box",{style:{"margin-bottom":i,"vertical-align":i}});try{for(var l=a(n.childNodes(n.firstChild(t))),c=l.next();!c.done;c=l.next()){var h=c.value;n.append(s,h)}}catch(t){r={error:t}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(r)throw r.error}}n.append(n.firstChild(t),s)}},e.prototype.adjustBaseHeight=function(t,e){if(this.node.attributes.get("accent")){var r=this.font.params.x_height*e.scale;e.h<r&&(this.adaptor.setStyle(t,"paddingTop",this.em(r-e.h)),e.h=r)}},e.kind="scriptbase",e}((0,r(7091).CommonScriptbaseMixin)(s.CHTMLWrapper));e.CHTMLscriptbase=l},7795:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLxml=e.CHTMLannotationXML=e.CHTMLannotation=e.CHTMLsemantics=void 0;var i=r(6617),a=r(3191),s=r(9167),l=r(8921),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);this.childNodes.length&&this.childNodes[0].toCHTML(e)},e.kind=s.MmlSemantics.prototype.kind,e}((0,a.CommonSemanticsMixin)(i.CHTMLWrapper));e.CHTMLsemantics=c;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e)},e.prototype.computeBBox=function(){return this.bbox},e.kind=s.MmlAnnotation.prototype.kind,e}(i.CHTMLWrapper);e.CHTMLannotation=h;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlAnnotationXML.prototype.kind,e.styles={"mjx-annotation-xml":{"font-family":"initial","line-height":"normal"}},e}(i.CHTMLWrapper);e.CHTMLannotationXML=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toCHTML=function(t){this.chtml=this.adaptor.append(t,this.adaptor.clone(this.node.getXML()))},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.jax.measureXMLnode(this.node.getXML()),o=r.w,n=r.h,i=r.d;t.w=o,t.h=n,t.d=i},e.prototype.getStyles=function(){},e.prototype.getScale=function(){},e.prototype.getVariant=function(){},e.kind=l.XMLNode.prototype.kind,e.autoStyle=!1,e}(i.CHTMLWrapper);e.CHTMLxml=p},9250:function(t,e,r){var o=this&&this.__assign||function(){return o=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},o.apply(this,arguments)},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.FontData=e.NOSTRETCH=e.H=e.V=void 0;var s=r(9077);e.V=1,e.H=2,e.NOSTRETCH={dir:0};var l=function(){function t(t){var e,r,l,c;void 0===t&&(t=null),this.variant={},this.delimiters={},this.cssFontMap={},this.remapChars={},this.skewIcFactor=.75;var h=this.constructor;this.options=(0,s.userOptions)((0,s.defaultOptions)({},h.OPTIONS),t),this.params=o({},h.defaultParams),this.sizeVariants=i([],n(h.defaultSizeVariants),!1),this.stretchVariants=i([],n(h.defaultStretchVariants),!1),this.cssFontMap=o({},h.defaultCssFonts);try{for(var u=a(Object.keys(this.cssFontMap)),p=u.next();!p.done;p=u.next()){var d=p.value;"unknown"===this.cssFontMap[d][0]&&(this.cssFontMap[d][0]=this.options.unknownFamily)}}catch(t){e={error:t}}finally{try{p&&!p.done&&(r=u.return)&&r.call(u)}finally{if(e)throw e.error}}this.cssFamilyPrefix=h.defaultCssFamilyPrefix,this.createVariants(h.defaultVariants),this.defineDelimiters(h.defaultDelimiters);try{for(var f=a(Object.keys(h.defaultChars)),m=f.next();!m.done;m=f.next()){var y=m.value;this.defineChars(y,h.defaultChars[y])}}catch(t){l={error:t}}finally{try{m&&!m.done&&(c=f.return)&&c.call(f)}finally{if(l)throw l.error}}this.defineRemap("accent",h.defaultAccentMap),this.defineRemap("mo",h.defaultMoMap),this.defineRemap("mn",h.defaultMnMap)}return t.charOptions=function(t,e){var r=t[e];return 3===r.length&&(r[3]={}),r[3]},Object.defineProperty(t.prototype,"styles",{get:function(){return this._styles},set:function(t){this._styles=t},enumerable:!1,configurable:!0}),t.prototype.createVariant=function(t,e,r){void 0===e&&(e=null),void 0===r&&(r=null);var o={linked:[],chars:e?Object.create(this.variant[e].chars):{}};r&&this.variant[r]&&(Object.assign(o.chars,this.variant[r].chars),this.variant[r].linked.push(o.chars),o.chars=Object.create(o.chars)),this.remapSmpChars(o.chars,t),this.variant[t]=o},t.prototype.remapSmpChars=function(t,e){var r,o,i,s,l=this.constructor;if(l.VariantSmp[e]){var c=l.SmpRemap,h=[null,null,l.SmpRemapGreekU,l.SmpRemapGreekL];try{for(var u=a(l.SmpRanges),p=u.next();!p.done;p=u.next()){var d=n(p.value,3),f=d[0],m=d[1],y=d[2],v=l.VariantSmp[e][f];if(v){for(var b=m;b<=y;b++)if(930!==b){var g=v+b-m;t[b]=this.smpChar(c[g]||g)}if(h[f])try{for(var x=(i=void 0,a(Object.keys(h[f]).map((function(t){return parseInt(t)})))),M=x.next();!M.done;M=x.next()){t[b=M.value]=this.smpChar(v+h[f][b])}}catch(t){i={error:t}}finally{try{M&&!M.done&&(s=x.return)&&s.call(x)}finally{if(i)throw i.error}}}}}catch(t){r={error:t}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(r)throw r.error}}}"bold"===e&&(t[988]=this.smpChar(120778),t[989]=this.smpChar(120779))},t.prototype.smpChar=function(t){return[,,,{smp:t}]},t.prototype.createVariants=function(t){var e,r;try{for(var o=a(t),n=o.next();!n.done;n=o.next()){var i=n.value;this.createVariant(i[0],i[1],i[2])}}catch(t){e={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},t.prototype.defineChars=function(t,e){var r,o,n=this.variant[t];Object.assign(n.chars,e);try{for(var i=a(n.linked),s=i.next();!s.done;s=i.next()){var l=s.value;Object.assign(l,e)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(o=i.return)&&o.call(i)}finally{if(r)throw r.error}}},t.prototype.defineDelimiters=function(t){Object.assign(this.delimiters,t)},t.prototype.defineRemap=function(t,e){this.remapChars.hasOwnProperty(t)||(this.remapChars[t]={}),Object.assign(this.remapChars[t],e)},t.prototype.getDelimiter=function(t){return this.delimiters[t]},t.prototype.getSizeVariant=function(t,e){return this.delimiters[t].variants&&(e=this.delimiters[t].variants[e]),this.sizeVariants[e]},t.prototype.getStretchVariant=function(t,e){return this.stretchVariants[this.delimiters[t].stretchv?this.delimiters[t].stretchv[e]:0]},t.prototype.getChar=function(t,e){return this.variant[t].chars[e]},t.prototype.getVariant=function(t){return this.variant[t]},t.prototype.getCssFont=function(t){return this.cssFontMap[t]||["serif",!1,!1]},t.prototype.getFamily=function(t){return this.cssFamilyPrefix?this.cssFamilyPrefix+", "+t:t},t.prototype.getRemappedChar=function(t,e){return(this.remapChars[t]||{})[e]},t.OPTIONS={unknownFamily:"serif"},t.JAX="common",t.NAME="",t.defaultVariants=[["normal"],["bold","normal"],["italic","normal"],["bold-italic","italic","bold"],["double-struck","bold"],["fraktur","normal"],["bold-fraktur","bold","fraktur"],["script","italic"],["bold-script","bold-italic","script"],["sans-serif","normal"],["bold-sans-serif","bold","sans-serif"],["sans-serif-italic","italic","sans-serif"],["sans-serif-bold-italic","bold-italic","bold-sans-serif"],["monospace","normal"]],t.defaultCssFonts={normal:["unknown",!1,!1],bold:["unknown",!1,!0],italic:["unknown",!0,!1],"bold-italic":["unknown",!0,!0],"double-struck":["unknown",!1,!0],fraktur:["unknown",!1,!1],"bold-fraktur":["unknown",!1,!0],script:["cursive",!1,!1],"bold-script":["cursive",!1,!0],"sans-serif":["sans-serif",!1,!1],"bold-sans-serif":["sans-serif",!1,!0],"sans-serif-italic":["sans-serif",!0,!1],"sans-serif-bold-italic":["sans-serif",!0,!0],monospace:["monospace",!1,!1]},t.defaultCssFamilyPrefix="",t.VariantSmp={bold:[119808,119834,120488,120514,120782],italic:[119860,119886,120546,120572],"bold-italic":[119912,119938,120604,120630],script:[119964,119990],"bold-script":[120016,120042],fraktur:[120068,120094],"double-struck":[120120,120146,,,120792],"bold-fraktur":[120172,120198],"sans-serif":[120224,120250,,,120802],"bold-sans-serif":[120276,120302,120662,120688,120812],"sans-serif-italic":[120328,120354],"sans-serif-bold-italic":[120380,120406,120720,120746],monospace:[120432,120458,,,120822]},t.SmpRanges=[[0,65,90],[1,97,122],[2,913,937],[3,945,969],[4,48,57]],t.SmpRemap={119893:8462,119965:8492,119968:8496,119969:8497,119971:8459,119972:8464,119975:8466,119976:8499,119981:8475,119994:8495,119996:8458,120004:8500,120070:8493,120075:8460,120076:8465,120085:8476,120093:8488,120122:8450,120127:8461,120133:8469,120135:8473,120136:8474,120137:8477,120145:8484},t.SmpRemapGreekU={8711:25,1012:17},t.SmpRemapGreekL={977:27,981:29,982:31,1008:28,1009:30,1013:26,8706:25},t.defaultAccentMap={768:"\u02cb",769:"\u02ca",770:"\u02c6",771:"\u02dc",772:"\u02c9",774:"\u02d8",775:"\u02d9",776:"\xa8",778:"\u02da",780:"\u02c7",8594:"\u20d7",8242:"'",8243:"''",8244:"'''",8245:"`",8246:"``",8247:"```",8279:"''''",8400:"\u21bc",8401:"\u21c0",8406:"\u2190",8417:"\u2194",8432:"*",8411:"...",8412:"....",8428:"\u21c1",8429:"\u21bd",8430:"\u2190",8431:"\u2192"},t.defaultMoMap={45:"\u2212"},t.defaultMnMap={45:"\u2212"},t.defaultParams={x_height:.442,quad:1,num1:.676,num2:.394,num3:.444,denom1:.686,denom2:.345,sup1:.413,sup2:.363,sup3:.289,sub1:.15,sub2:.247,sup_drop:.386,sub_drop:.05,delim1:2.39,delim2:1,axis_height:.25,rule_thickness:.06,big_op_spacing1:.111,big_op_spacing2:.167,big_op_spacing3:.2,big_op_spacing4:.6,big_op_spacing5:.1,surd_height:.075,scriptspace:.05,nulldelimiterspace:.12,delimiterfactor:901,delimitershortfall:.3,min_rule_thickness:1.25,separation_factor:1.75,extra_ic:.033},t.defaultDelimiters={},t.defaultChars={},t.defaultSizeVariants=[],t.defaultStretchVariants=[],t}();e.FontData=l},5373:function(t,e){var r=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonArrow=e.CommonDiagonalArrow=e.CommonDiagonalStrike=e.CommonBorder2=e.CommonBorder=e.arrowBBox=e.diagonalArrowDef=e.arrowDef=e.arrowBBoxW=e.arrowBBoxHD=e.arrowHead=e.fullBorder=e.fullPadding=e.fullBBox=e.sideNames=e.sideIndex=e.SOLID=e.PADDING=e.THICKNESS=e.ARROWY=e.ARROWDX=e.ARROWX=void 0,e.ARROWX=4,e.ARROWDX=1,e.ARROWY=2,e.THICKNESS=.067,e.PADDING=.2,e.SOLID=e.THICKNESS+"em solid",e.sideIndex={top:0,right:1,bottom:2,left:3},e.sideNames=Object.keys(e.sideIndex),e.fullBBox=function(t){return new Array(4).fill(t.thickness+t.padding)},e.fullPadding=function(t){return new Array(4).fill(t.padding)},e.fullBorder=function(t){return new Array(4).fill(t.thickness)};e.arrowHead=function(t){return Math.max(t.padding,t.thickness*(t.arrowhead.x+t.arrowhead.dx+1))};e.arrowBBoxHD=function(t,e){if(t.childNodes[0]){var r=t.childNodes[0].getBBox(),o=r.h,n=r.d;e[0]=e[2]=Math.max(0,t.thickness*t.arrowhead.y-(o+n)/2)}return e};e.arrowBBoxW=function(t,e){if(t.childNodes[0]){var r=t.childNodes[0].getBBox().w;e[1]=e[3]=Math.max(0,t.thickness*t.arrowhead.y-r/2)}return e},e.arrowDef={up:[-Math.PI/2,!1,!0,"verticalstrike"],down:[Math.PI/2,!1,!0,"verticakstrike"],right:[0,!1,!1,"horizontalstrike"],left:[Math.PI,!1,!1,"horizontalstrike"],updown:[Math.PI/2,!0,!0,"verticalstrike uparrow downarrow"],leftright:[0,!0,!1,"horizontalstrike leftarrow rightarrow"]},e.diagonalArrowDef={updiagonal:[-1,0,!1,"updiagonalstrike northeastarrow"],northeast:[-1,0,!1,"updiagonalstrike updiagonalarrow"],southeast:[1,0,!1,"downdiagonalstrike"],northwest:[1,Math.PI,!1,"downdiagonalstrike"],southwest:[-1,Math.PI,!1,"updiagonalstrike"],northeastsouthwest:[-1,0,!0,"updiagonalstrike northeastarrow updiagonalarrow southwestarrow"],northwestsoutheast:[1,0,!0,"downdiagonalstrike northwestarrow southeastarrow"]},e.arrowBBox={up:function(t){return(0,e.arrowBBoxW)(t,[(0,e.arrowHead)(t),0,t.padding,0])},down:function(t){return(0,e.arrowBBoxW)(t,[t.padding,0,(0,e.arrowHead)(t),0])},right:function(t){return(0,e.arrowBBoxHD)(t,[0,(0,e.arrowHead)(t),0,t.padding])},left:function(t){return(0,e.arrowBBoxHD)(t,[0,t.padding,0,(0,e.arrowHead)(t)])},updown:function(t){return(0,e.arrowBBoxW)(t,[(0,e.arrowHead)(t),0,(0,e.arrowHead)(t),0])},leftright:function(t){return(0,e.arrowBBoxHD)(t,[0,(0,e.arrowHead)(t),0,(0,e.arrowHead)(t)])}};e.CommonBorder=function(t){return function(r){var o=e.sideIndex[r];return[r,{renderer:t,bbox:function(t){var e=[0,0,0,0];return e[o]=t.thickness+t.padding,e},border:function(t){var e=[0,0,0,0];return e[o]=t.thickness,e}}]}};e.CommonBorder2=function(t){return function(r,o,n){var i=e.sideIndex[o],a=e.sideIndex[n];return[r,{renderer:t,bbox:function(t){var e=t.thickness+t.padding,r=[0,0,0,0];return r[i]=r[a]=e,r},border:function(t){var e=[0,0,0,0];return e[i]=e[a]=t.thickness,e},remove:o+" "+n}]}};e.CommonDiagonalStrike=function(t){return function(r){var o="mjx-"+r.charAt(0)+"strike";return[r+"diagonalstrike",{renderer:t(o),bbox:e.fullBBox}]}};e.CommonDiagonalArrow=function(t){return function(o){var n=r(e.diagonalArrowDef[o],4),i=n[0],a=n[1],s=n[2];return[o+"arrow",{renderer:function(e,o){var n=r(e.arrowAW(),2),l=n[0],c=n[1],h=e.arrow(c,i*(l-a),s);t(e,h)},bbox:function(t){var e=t.arrowData(),o=e.a,n=e.x,i=e.y,a=r([t.arrowhead.x,t.arrowhead.y,t.arrowhead.dx],3),s=a[0],l=a[1],c=a[2],h=r(t.getArgMod(s+c,l),2),u=h[0],p=h[1],d=i+(u>o?t.thickness*p*Math.sin(u-o):0),f=n+(u>Math.PI/2-o?t.thickness*p*Math.sin(u+o-Math.PI/2):0);return[d,f,d,f]},remove:n[3]}]}};e.CommonArrow=function(t){return function(o){var n=r(e.arrowDef[o],4),i=n[0],a=n[1],s=n[2],l=n[3];return[o+"arrow",{renderer:function(e,o){var n=e.getBBox(),l=n.w,c=n.h,h=n.d,u=r(s?[c+h,"X"]:[l,"Y"],2),p=u[0],d=u[1],f=e.getOffset(d),m=e.arrow(p,i,a,d,f);t(e,m)},bbox:e.arrowBBox[o],remove:l}]}}},716:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},i.apply(this,arguments)},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonOutputJax=void 0;var l=r(3985),c=r(4769),h=r(9077),u=r(6914),p=r(5878),d=r(5888),f=function(t){function e(e,r,o){void 0===e&&(e=null),void 0===r&&(r=null),void 0===o&&(o=null);var n=this,i=a((0,h.separateOptions)(e,o.OPTIONS),2),s=i[0],l=i[1];return(n=t.call(this,s)||this).factory=n.options.wrapperFactory||new r,n.factory.jax=n,n.cssStyles=n.options.cssStyles||new d.CssStyles,n.font=n.options.font||new o(l),n.unknownCache=new Map,n}return n(e,t),e.prototype.typeset=function(t,e){this.setDocument(e);var r=this.createNode();return this.toDOM(t,r,e),r},e.prototype.createNode=function(){var t=this.constructor.NAME;return this.html("mjx-container",{class:"MathJax",jax:t})},e.prototype.setScale=function(t){var e=this.math.metrics.scale*this.options.scale;1!==e&&this.adaptor.setStyle(t,"fontSize",(0,u.percent)(e))},e.prototype.toDOM=function(t,e,r){void 0===r&&(r=null),this.setDocument(r),this.math=t,this.pxPerEm=t.metrics.ex/this.font.params.x_height,t.root.setTeXclass(null),this.setScale(e),this.nodeMap=new Map,this.container=e,this.processMath(t.root,e),this.nodeMap=null,this.executeFilters(this.postFilters,t,r,e)},e.prototype.getBBox=function(t,e){this.setDocument(e),this.math=t,t.root.setTeXclass(null),this.nodeMap=new Map;var r=this.factory.wrap(t.root).getOuterBBox();return this.nodeMap=null,r},e.prototype.getMetrics=function(t){var e,r;this.setDocument(t);var o=this.adaptor,n=this.getMetricMaps(t);try{for(var i=s(t.math),a=i.next();!a.done;a=i.next()){var l=a.value,h=o.parent(l.start.node);if(l.state()<c.STATE.METRICS&&h){var u=n[l.display?1:0].get(h),p=u.em,d=u.ex,f=u.containerWidth,m=u.lineWidth,y=u.scale,v=u.family;l.setMetrics(p,d,f,m,y),this.options.mtextInheritFont&&(l.outputData.mtextFamily=v),this.options.merrorInheritFont&&(l.outputData.merrorFamily=v),l.state(c.STATE.METRICS)}}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},e.prototype.getMetricsFor=function(t,e){var r=this.options.mtextInheritFont||this.options.merrorInheritFont,o=this.getTestElement(t,e),n=this.measureMetrics(o,r);return this.adaptor.remove(o),n},e.prototype.getMetricMaps=function(t){var e,r,o,n,i,a,l,h,u,p,d=this.adaptor,f=[new Map,new Map];try{for(var m=s(t.math),y=m.next();!y.done;y=m.next()){var v=y.value;if((O=d.parent(v.start.node))&&v.state()<c.STATE.METRICS){var b=f[v.display?1:0];b.has(O)||b.set(O,this.getTestElement(O,v.display))}}}catch(t){e={error:t}}finally{try{y&&!y.done&&(r=m.return)&&r.call(m)}finally{if(e)throw e.error}}var g=this.options.mtextInheritFont||this.options.merrorInheritFont,x=[new Map,new Map];try{for(var M=s(x.keys()),_=M.next();!_.done;_=M.next()){var w=_.value;try{for(var j=(i=void 0,s(f[w].keys())),C=j.next();!C.done;C=j.next()){var O=C.value;x[w].set(O,this.measureMetrics(f[w].get(O),g))}}catch(t){i={error:t}}finally{try{C&&!C.done&&(a=j.return)&&a.call(j)}finally{if(i)throw i.error}}}}catch(t){o={error:t}}finally{try{_&&!_.done&&(n=M.return)&&n.call(M)}finally{if(o)throw o.error}}try{for(var S=s(x.keys()),T=S.next();!T.done;T=S.next()){w=T.value;try{for(var B=(u=void 0,s(f[w].values())),L=B.next();!L.done;L=B.next()){O=L.value;d.remove(O)}}catch(t){u={error:t}}finally{try{L&&!L.done&&(p=B.return)&&p.call(B)}finally{if(u)throw u.error}}}}catch(t){l={error:t}}finally{try{T&&!T.done&&(h=S.return)&&h.call(S)}finally{if(l)throw l.error}}return x},e.prototype.getTestElement=function(t,e){var r=this.adaptor;if(!this.testInline){this.testInline=this.html("mjx-test",{style:{display:"inline-block",width:"100%","font-style":"normal","font-weight":"normal","font-size":"100%","font-size-adjust":"none","text-indent":0,"text-transform":"none","letter-spacing":"normal","word-spacing":"normal",overflow:"hidden",height:"1px","margin-right":"-1px"}},[this.html("mjx-left-box",{style:{display:"inline-block",width:0,float:"left"}}),this.html("mjx-ex-box",{style:{position:"absolute",overflow:"hidden",width:"1px",height:"60ex"}}),this.html("mjx-right-box",{style:{display:"inline-block",width:0,float:"right"}})]),this.testDisplay=r.clone(this.testInline),r.setStyle(this.testDisplay,"display","table"),r.setStyle(this.testDisplay,"margin-right",""),r.setStyle(r.firstChild(this.testDisplay),"display","none");var o=r.lastChild(this.testDisplay);r.setStyle(o,"display","table-cell"),r.setStyle(o,"width","10000em"),r.setStyle(o,"float","")}return r.append(t,r.clone(e?this.testDisplay:this.testInline))},e.prototype.measureMetrics=function(t,e){var r=this.adaptor,o=e?r.fontFamily(t):"",n=r.fontSize(t),i=a(r.nodeSize(r.childNode(t,1)),2),s=i[0],l=i[1],c=s?l/60:n*this.options.exFactor;return{em:n,ex:c,containerWidth:s?"table"===r.getStyle(t,"display")?r.nodeSize(r.lastChild(t))[0]-1:r.nodeBBox(r.lastChild(t)).left-r.nodeBBox(r.firstChild(t)).left-2:1e6,lineWidth:1e6,scale:Math.max(this.options.minScale,this.options.matchFontHeight?c/this.font.params.x_height/n:1),family:o}},e.prototype.styleSheet=function(t){var e,r;if(this.setDocument(t),this.cssStyles.clear(),this.cssStyles.addStyles(this.constructor.commonStyles),"getStyles"in t)try{for(var o=s(t.getStyles()),n=o.next();!n.done;n=o.next()){var i=n.value;this.cssStyles.addStyles(i)}}catch(t){e={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return this.addWrapperStyles(this.cssStyles),this.addFontStyles(this.cssStyles),this.html("style",{id:"MJX-styles"},[this.text("\n"+this.cssStyles.cssText+"\n")])},e.prototype.addFontStyles=function(t){t.addStyles(this.font.styles)},e.prototype.addWrapperStyles=function(t){var e,r;try{for(var o=s(this.factory.getKinds()),n=o.next();!n.done;n=o.next()){var i=n.value;this.addClassStyles(this.factory.getNodeClass(i),t)}}catch(t){e={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},e.prototype.addClassStyles=function(t,e){e.addStyles(t.styles)},e.prototype.setDocument=function(t){t&&(this.document=t,this.adaptor.document=t.document)},e.prototype.html=function(t,e,r,o){return void 0===e&&(e={}),void 0===r&&(r=[]),this.adaptor.node(t,e,r,o)},e.prototype.text=function(t){return this.adaptor.text(t)},e.prototype.fixed=function(t,e){return void 0===e&&(e=3),Math.abs(t)<6e-4?"0":t.toFixed(e).replace(/\.?0+$/,"")},e.prototype.measureText=function(t,e,r){void 0===r&&(r=["",!1,!1]);var o=this.unknownText(t,e);if("-explicitFont"===e){var n=this.cssFontStyles(r);this.adaptor.setAttributes(o,{style:n})}return this.measureTextNodeWithCache(o,t,e,r)},e.prototype.measureTextNodeWithCache=function(t,e,r,o){void 0===o&&(o=["",!1,!1]),"-explicitFont"===r&&(r=[o[0],o[1]?"T":"F",o[2]?"T":"F",""].join("-")),this.unknownCache.has(r)||this.unknownCache.set(r,new Map);var n=this.unknownCache.get(r),i=n.get(e);if(i)return i;var a=this.measureTextNode(t);return n.set(e,a),a},e.prototype.measureXMLnode=function(t){var e=this.adaptor,r=this.html("mjx-xml-block",{style:{display:"inline-block"}},[e.clone(t)]),o=this.html("mjx-baseline",{style:{display:"inline-block",width:0,height:0}}),n=this.html("mjx-measure-xml",{style:{position:"absolute",display:"inline-block","font-family":"initial","line-height":"normal"}},[o,r]);e.append(e.parent(this.math.start.node),this.container),e.append(this.container,n);var i=this.math.metrics.em*this.math.metrics.scale,a=e.nodeBBox(r),s=a.left,l=a.right,c=a.bottom,h=a.top,u=(l-s)/i,p=(e.nodeBBox(o).top-h)/i,d=(c-h)/i-p;return e.remove(this.container),e.remove(n),{w:u,h:p,d:d}},e.prototype.cssFontStyles=function(t,e){void 0===e&&(e={});var r=a(t,3),o=r[0],n=r[1],i=r[2];return e["font-family"]=this.font.getFamily(o),n&&(e["font-style"]="italic"),i&&(e["font-weight"]="bold"),e},e.prototype.getFontData=function(t){return t||(t=new p.Styles),[this.font.getFamily(t.get("font-family")),"italic"===t.get("font-style"),"bold"===t.get("font-weight")]},e.NAME="Common",e.OPTIONS=i(i({},l.AbstractOutputJax.OPTIONS),{scale:1,minScale:.5,mtextInheritFont:!1,merrorInheritFont:!1,mtextFont:"",merrorFont:"serif",mathmlSpacing:!1,skipAttributes:{},exFactor:.5,displayAlign:"center",displayIndent:"0",wrapperFactory:null,font:null,cssStyles:null}),e.commonStyles={},e}(l.AbstractOutputJax);e.CommonOutputJax=f},1541:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return a(e,t),e},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},h=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonWrapper=void 0;var u=r(9879),p=r(8921),d=r(6720),f=s(r(6914)),m=r(5878),y=r(3717),v=r(9250),b=2/18;function g(t,e){return t?e<b?0:b:e}var x=function(t){function e(e,r,o){void 0===o&&(o=null);var n=t.call(this,e,r)||this;return n.parent=null,n.removedStyles=null,n.styles=null,n.variant="",n.bboxComputed=!1,n.stretch=v.NOSTRETCH,n.font=null,n.parent=o,n.font=e.jax.font,n.bbox=y.BBox.zero(),n.getStyles(),n.getVariant(),n.getScale(),n.getSpace(),n.childNodes=r.childNodes.map((function(t){var e=n.wrap(t);return e.bbox.pwidth&&(r.notParent||r.isKind("math"))&&(n.bbox.pwidth=y.BBox.fullWidth),e})),n}return n(e,t),Object.defineProperty(e.prototype,"jax",{get:function(){return this.factory.jax},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"adaptor",{get:function(){return this.factory.jax.adaptor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"metrics",{get:function(){return this.factory.jax.math.metrics},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!this.node.notParent&&!this.node.isToken},enumerable:!1,configurable:!0}),e.prototype.wrap=function(t,e){void 0===e&&(e=null);var r=this.factory.wrap(t,e||this);return e&&e.childNodes.push(r),this.jax.nodeMap.set(t,r),r},e.prototype.getBBox=function(t){if(void 0===t&&(t=!0),this.bboxComputed)return this.bbox;var e=t?this.bbox:y.BBox.zero();return this.computeBBox(e),this.bboxComputed=t,e},e.prototype.getOuterBBox=function(t){var e,r;void 0===t&&(t=!0);var o=this.getBBox(t);if(!this.styles)return o;var n=new y.BBox;Object.assign(n,o);try{for(var i=l(y.BBox.StyleAdjust),a=i.next();!a.done;a=i.next()){var s=c(a.value,2),h=s[0],u=s[1],p=this.styles.get(h);p&&(n[u]+=this.length2em(p,1,n.rscale))}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}return n},e.prototype.computeBBox=function(t,e){var r,o;void 0===e&&(e=!1),t.empty();try{for(var n=l(this.childNodes),i=n.next();!i.done;i=n.next()){var a=i.value;t.append(a.getOuterBBox())}}catch(t){r={error:t}}finally{try{i&&!i.done&&(o=n.return)&&o.call(n)}finally{if(r)throw r.error}}t.clean(),this.fixesPWidth&&this.setChildPWidths(e)&&this.computeBBox(t,!0)},e.prototype.setChildPWidths=function(t,e,r){var o,n;if(void 0===e&&(e=null),void 0===r&&(r=!0),t)return!1;r&&(this.bbox.pwidth="");var i=!1;try{for(var a=l(this.childNodes),s=a.next();!s.done;s=a.next()){var c=s.value,h=c.getOuterBBox();h.pwidth&&c.setChildPWidths(t,null===e?h.w:e,r)&&(i=!0)}}catch(t){o={error:t}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i},e.prototype.invalidateBBox=function(){this.bboxComputed&&(this.bboxComputed=!1,this.parent&&this.parent.invalidateBBox())},e.prototype.copySkewIC=function(t){var e=this.childNodes[0];(null==e?void 0:e.bbox.sk)&&(t.sk=e.bbox.sk),(null==e?void 0:e.bbox.dx)&&(t.dx=e.bbox.dx);var r=this.childNodes[this.childNodes.length-1];(null==r?void 0:r.bbox.ic)&&(t.ic=r.bbox.ic,t.w+=t.ic)},e.prototype.getStyles=function(){var t=this.node.attributes.getExplicit("style");if(t)for(var r=this.styles=new m.Styles(t),o=0,n=e.removeStyles.length;o<n;o++){var i=e.removeStyles[o];r.get(i)&&(this.removedStyles||(this.removedStyles={}),this.removedStyles[i]=r.get(i),r.set(i,""))}},e.prototype.getVariant=function(){if(this.node.isToken){var t=this.node.attributes,r=t.get("mathvariant");if(!t.getExplicit("mathvariant")){var o=t.getList("fontfamily","fontweight","fontstyle");if(this.removedStyles){var n=this.removedStyles;n.fontFamily&&(o.family=n.fontFamily),n.fontWeight&&(o.weight=n.fontWeight),n.fontStyle&&(o.style=n.fontStyle)}o.fontfamily&&(o.family=o.fontfamily),o.fontweight&&(o.weight=o.fontweight),o.fontstyle&&(o.style=o.fontstyle),o.weight&&o.weight.match(/^\d+$/)&&(o.weight=parseInt(o.weight)>600?"bold":"normal"),o.family?r=this.explicitVariant(o.family,o.weight,o.style):(this.node.getProperty("variantForm")&&(r="-tex-variant"),r=(e.BOLDVARIANTS[o.weight]||{})[r]||r,r=(e.ITALICVARIANTS[o.style]||{})[r]||r)}this.variant=r}},e.prototype.explicitVariant=function(t,e,r){var o=this.styles;return o||(o=this.styles=new m.Styles),o.set("fontFamily",t),e&&o.set("fontWeight",e),r&&o.set("fontStyle",r),"-explicitFont"},e.prototype.getScale=function(){var t=1,e=this.parent,r=e?e.bbox.scale:1,o=this.node.attributes,n=Math.min(o.get("scriptlevel"),2),i=o.get("fontsize"),a=this.node.isToken||this.node.isKind("mstyle")?o.get("mathsize"):o.getInherited("mathsize");if(0!==n){t=Math.pow(o.get("scriptsizemultiplier"),n);var s=this.length2em(o.get("scriptminsize"),.8,1);t<s&&(t=s)}this.removedStyles&&this.removedStyles.fontSize&&!i&&(i=this.removedStyles.fontSize),i&&!o.getExplicit("mathsize")&&(a=i),"1"!==a&&(t*=this.length2em(a,1,1)),this.bbox.scale=t,this.bbox.rscale=t/r},e.prototype.getSpace=function(){var t=this.isTopEmbellished(),e=this.node.hasSpacingAttributes();this.jax.options.mathmlSpacing||e?t&&this.getMathMLSpacing():this.getTeXSpacing(t,e)},e.prototype.getMathMLSpacing=function(){var t=this.node.coreMO(),e=t.coreParent(),r=e.parent;if(r&&r.isKind("mrow")&&1!==r.childNodes.length){var o=t.attributes,n=o.get("scriptlevel")>0;this.bbox.L=o.isSet("lspace")?Math.max(0,this.length2em(o.get("lspace"))):g(n,t.lspace),this.bbox.R=o.isSet("rspace")?Math.max(0,this.length2em(o.get("rspace"))):g(n,t.rspace);var i=r.childIndex(e);if(0!==i){var a=r.childNodes[i-1];if(a.isEmbellished){var s=this.jax.nodeMap.get(a).getBBox();s.R&&(this.bbox.L=Math.max(0,this.bbox.L-s.R))}}}},e.prototype.getTeXSpacing=function(t,e){if(!e){var r=this.node.texSpacing();r&&(this.bbox.L=this.length2em(r))}if(t||e){var o=this.node.coreMO().attributes;o.isSet("lspace")&&(this.bbox.L=Math.max(0,this.length2em(o.get("lspace")))),o.isSet("rspace")&&(this.bbox.R=Math.max(0,this.length2em(o.get("rspace"))))}},e.prototype.isTopEmbellished=function(){return this.node.isEmbellished&&!(this.node.parent&&this.node.parent.isEmbellished)},e.prototype.core=function(){return this.jax.nodeMap.get(this.node.core())},e.prototype.coreMO=function(){return this.jax.nodeMap.get(this.node.coreMO())},e.prototype.getText=function(){var t,e,r="";if(this.node.isToken)try{for(var o=l(this.node.childNodes),n=o.next();!n.done;n=o.next()){var i=n.value;i instanceof p.TextNode&&(r+=i.getText())}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r},e.prototype.canStretch=function(t){if(this.stretch=v.NOSTRETCH,this.node.isEmbellished){var e=this.core();e&&e.node!==this.node&&e.canStretch(t)&&(this.stretch=e.stretch)}return 0!==this.stretch.dir},e.prototype.getAlignShift=function(){var t,e=(t=this.node.attributes).getList.apply(t,h([],c(p.indentAttributes),!1)),r=e.indentalign,o=e.indentshift,n=e.indentalignfirst,i=e.indentshiftfirst;return"indentalign"!==n&&(r=n),"auto"===r&&(r=this.jax.options.displayAlign),"indentshift"!==i&&(o=i),"auto"===o&&(o=this.jax.options.displayIndent,"right"!==r||o.match(/^\s*0[a-z]*\s*$/)||(o=("-"+o.trim()).replace(/^--/,""))),[r,this.length2em(o,this.metrics.containerWidth)]},e.prototype.getAlignX=function(t,e,r){return"right"===r?t-(e.w+e.R)*e.rscale:"left"===r?e.L*e.rscale:(t-e.w*e.rscale)/2},e.prototype.getAlignY=function(t,e,r,o,n){return"top"===n?t-r:"bottom"===n?o-e:"center"===n?(t-r-(e-o))/2:0},e.prototype.getWrapWidth=function(t){return this.childNodes[t].getBBox().w},e.prototype.getChildAlign=function(t){return"left"},e.prototype.percent=function(t){return f.percent(t)},e.prototype.em=function(t){return f.em(t)},e.prototype.px=function(t,e){return void 0===e&&(e=-f.BIGDIMEN),f.px(t,e,this.metrics.em)},e.prototype.length2em=function(t,e,r){return void 0===e&&(e=1),void 0===r&&(r=null),null===r&&(r=this.bbox.scale),f.length2em(t,e,r,this.jax.pxPerEm)},e.prototype.unicodeChars=function(t,e){void 0===e&&(e=this.variant);var r=(0,d.unicodeChars)(t),o=this.font.getVariant(e);if(o&&o.chars){var n=o.chars;r=r.map((function(t){return((n[t]||[])[3]||{}).smp||t}))}return r},e.prototype.remapChars=function(t){return t},e.prototype.mmlText=function(t){return this.node.factory.create("text").setText(t)},e.prototype.mmlNode=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.node.factory.create(t,e,r)},e.prototype.createMo=function(t){var e=this.node.factory,r=e.create("text").setText(t),o=e.create("mo",{stretchy:!0},[r]);o.inheritAttributesFrom(this.node);var n=this.wrap(o);return n.parent=this,n},e.prototype.getVariantChar=function(t,e){var r=this.font.getChar(t,e)||[0,0,0,{unknown:!0}];return 3===r.length&&(r[3]={}),r},e.kind="unknown",e.styles={},e.removeStyles=["fontSize","fontFamily","fontWeight","fontStyle","fontVariant","font"],e.skipAttributes={fontfamily:!0,fontsize:!0,fontweight:!0,fontstyle:!0,color:!0,background:!0,class:!0,href:!0,style:!0,xmlns:!0},e.BOLDVARIANTS={bold:{normal:"bold",italic:"bold-italic",fraktur:"bold-fraktur",script:"bold-script","sans-serif":"bold-sans-serif","sans-serif-italic":"sans-serif-bold-italic"},normal:{bold:"normal","bold-italic":"italic","bold-fraktur":"fraktur","bold-script":"script","bold-sans-serif":"sans-serif","sans-serif-bold-italic":"sans-serif-italic"}},e.ITALICVARIANTS={italic:{normal:"italic",bold:"bold-italic","sans-serif":"sans-serif-italic","bold-sans-serif":"sans-serif-bold-italic"},normal:{italic:"normal","bold-italic":"bold","sans-serif-italic":"sans-serif","sans-serif-bold-italic":"bold-sans-serif"}},e}(u.AbstractWrapper);e.CommonWrapper=x},1475:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonWrapperFactory=void 0;var i=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.jax=null,e}return n(e,t),Object.defineProperty(e.prototype,"Wrappers",{get:function(){return this.node},enumerable:!1,configurable:!0}),e.defaultNodes={},e}(r(2506).AbstractWrapperFactory);e.CommonWrapperFactory=i},3438:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTeXAtomMixin=void 0;var i=r(8921);e.CommonTeXAtomMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.computeBBox=function(e,r){if(void 0===r&&(r=!1),t.prototype.computeBBox.call(this,e,r),this.childNodes[0]&&this.childNodes[0].bbox.ic&&(e.ic=this.childNodes[0].bbox.ic),this.node.texClass===i.TEXCLASS.VCENTER){var o=e.h,n=(o+e.d)/2+this.font.params.axis_height-o;e.h+=n,e.d-=n}},e}(t)}},555:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTextNodeMixin=void 0,e.CommonTextNodeMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(t,e){var r,o;void 0===e&&(e=!1);var a=this.parent.variant,s=this.node.getText();if("-explicitFont"===a){var l=this.jax.getFontData(this.parent.styles),c=this.jax.measureText(s,a,l),h=c.w,u=c.h,p=c.d;t.h=u,t.d=p,t.w=h}else{var d=this.remappedText(s,a);t.empty();try{for(var f=n(d),m=f.next();!m.done;m=f.next()){var y=m.value,v=i(this.getVariantChar(a,y),4),b=(u=v[0],p=v[1],h=v[2],v[3]);if(b.unknown){var g=this.jax.measureText(String.fromCodePoint(y),a);h=g.w,u=g.h,p=g.d}t.w+=h,u>t.h&&(t.h=u),p>t.d&&(t.d=p),t.ic=b.ic||0,t.sk=b.sk||0,t.dx=b.dx||0}}catch(t){r={error:t}}finally{try{m&&!m.done&&(o=f.return)&&o.call(f)}finally{if(r)throw r.error}}d.length>1&&(t.sk=0),t.clean()}},e.prototype.remappedText=function(t,e){var r=this.parent.stretch.c;return r?[r]:this.parent.remapChars(this.unicodeChars(t,e))},e.prototype.getStyles=function(){},e.prototype.getVariant=function(){},e.prototype.getScale=function(){},e.prototype.getSpace=function(){},e}(t)}},3345:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMactionMixin=e.TooltipData=void 0;var s=r(6720);e.TooltipData={dx:".2em",dy:".1em",postDelay:600,clearDelay:100,hoverTimer:new Map,clearTimer:new Map,stopTimers:function(t,e){e.clearTimer.has(t)&&(clearTimeout(e.clearTimer.get(t)),e.clearTimer.delete(t)),e.hoverTimer.has(t)&&(clearTimeout(e.hoverTimer.get(t)),e.hoverTimer.delete(t))}},e.CommonMactionMixin=function(t){return function(t){function r(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,a([],i(e),!1))||this,n=o.constructor.actions,s=o.node.attributes.get("actiontype"),l=i(n.get(s)||[function(t,e){},{}],2),c=l[0],h=l[1];return o.action=c,o.data=h,o.getParameters(),o}return n(r,t),Object.defineProperty(r.prototype,"selected",{get:function(){var t=this.node.attributes.get("selection"),e=Math.max(1,Math.min(this.childNodes.length,t))-1;return this.childNodes[e]||this.wrap(this.node.selected)},enumerable:!1,configurable:!0}),r.prototype.getParameters=function(){var t=this.node.attributes.get("data-offsets"),r=i((0,s.split)(t||""),2),o=r[0],n=r[1];this.dx=this.length2em(o||e.TooltipData.dx),this.dy=this.length2em(n||e.TooltipData.dy)},r.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),t.updateFrom(this.selected.getOuterBBox()),this.selected.setChildPWidths(e)},r}(t)}},2057:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMathMixin=void 0,e.CommonMathMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getWrapWidth=function(t){return this.parent?this.getBBox().w:this.metrics.containerWidth/this.jax.pxPerEm},e}(t)}},6200:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return a(e,t),e},l=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},c=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},h=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMencloseMixin=void 0;var u=s(r(5373)),p=r(6720);e.CommonMencloseMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,c([],l(e),!1))||this;return o.notations={},o.renderChild=null,o.msqrt=null,o.padding=u.PADDING,o.thickness=u.THICKNESS,o.arrowhead={x:u.ARROWX,y:u.ARROWY,dx:u.ARROWDX},o.TRBL=[0,0,0,0],o.getParameters(),o.getNotations(),o.removeRedundantNotations(),o.initializeNotations(),o.TRBL=o.getBBoxExtenders(),o}return n(e,t),e.prototype.getParameters=function(){var t=this.node.attributes,e=t.get("data-padding");void 0!==e&&(this.padding=this.length2em(e,u.PADDING));var r=t.get("data-thickness");void 0!==r&&(this.thickness=this.length2em(r,u.THICKNESS));var o=t.get("data-arrowhead");if(void 0!==o){var n=l((0,p.split)(o),3),i=n[0],a=n[1],s=n[2];this.arrowhead={x:i?parseFloat(i):u.ARROWX,y:a?parseFloat(a):u.ARROWY,dx:s?parseFloat(s):u.ARROWDX}}},e.prototype.getNotations=function(){var t,e,r=this.constructor.notations;try{for(var o=h((0,p.split)(this.node.attributes.get("notation"))),n=o.next();!n.done;n=o.next()){var i=n.value,a=r.get(i);a&&(this.notations[i]=a,a.renderChild&&(this.renderChild=a.renderer))}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}},e.prototype.removeRedundantNotations=function(){var t,e,r,o;try{for(var n=h(Object.keys(this.notations)),i=n.next();!i.done;i=n.next()){var a=i.value;if(this.notations[a]){var s=this.notations[a].remove||"";try{for(var l=(r=void 0,h(s.split(/ /))),c=l.next();!c.done;c=l.next()){var u=c.value;delete this.notations[u]}}catch(t){r={error:t}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(r)throw r.error}}}}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.initializeNotations=function(){var t,e;try{for(var r=h(Object.keys(this.notations)),o=r.next();!o.done;o=r.next()){var n=o.value,i=this.notations[n].init;i&&i(this)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=l(this.TRBL,4),o=r[0],n=r[1],i=r[2],a=r[3],s=this.childNodes[0].getBBox();t.combine(s,a,0),t.h+=o,t.d+=i,t.w+=n,this.setChildPWidths(e)},e.prototype.getBBoxExtenders=function(){var t,e,r=[0,0,0,0];try{for(var o=h(Object.keys(this.notations)),n=o.next();!n.done;n=o.next()){var i=n.value;this.maximizeEntries(r,this.notations[i].bbox(this))}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r},e.prototype.getPadding=function(){var t,e,r=this,o=[0,0,0,0];try{for(var n=h(Object.keys(this.notations)),i=n.next();!i.done;i=n.next()){var a=i.value,s=this.notations[a].border;s&&this.maximizeEntries(o,s(this))}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return[0,1,2,3].map((function(t){return r.TRBL[t]-o[t]}))},e.prototype.maximizeEntries=function(t,e){for(var r=0;r<t.length;r++)t[r]<e[r]&&(t[r]=e[r])},e.prototype.getOffset=function(t){var e=l(this.TRBL,4),r=e[0],o=e[1],n=e[2],i=e[3],a=("X"===t?o-i:n-r)/2;return Math.abs(a)>.001?a:0},e.prototype.getArgMod=function(t,e){return[Math.atan2(e,t),Math.sqrt(t*t+e*e)]},e.prototype.arrow=function(t,e,r,o,n){return void 0===o&&(o=""),void 0===n&&(n=0),null},e.prototype.arrowData=function(){var t=l([this.padding,this.thickness],2),e=t[0],r=t[1]*(this.arrowhead.x+Math.max(1,this.arrowhead.dx)),o=this.childNodes[0].getBBox(),n=o.h,i=o.d,a=o.w,s=n+i,c=Math.sqrt(s*s+a*a),h=Math.max(e,r*a/c),u=Math.max(e,r*s/c),p=l(this.getArgMod(a+2*h,s+2*u),2);return{a:p[0],W:p[1],x:h,y:u}},e.prototype.arrowAW=function(){var t=this.childNodes[0].getBBox(),e=t.h,r=t.d,o=t.w,n=l(this.TRBL,4),i=n[0],a=n[1],s=n[2],c=n[3];return this.getArgMod(c+o+a,i+e+r+s)},e.prototype.createMsqrt=function(t){var e=this.node.factory.create("msqrt");e.inheritAttributesFrom(this.node),e.childNodes[0]=t.node;var r=this.wrap(e);return r.parent=this,r},e.prototype.sqrtTRBL=function(){var t=this.msqrt.getBBox(),e=this.msqrt.childNodes[0].getBBox();return[t.h-e.h,0,t.d-e.d,t.w-e.w]},e}(t)}},1346:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMfencedMixin=void 0,e.CommonMfencedMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;return o.mrow=null,o.createMrow(),o.addMrowChildren(),o}return o(e,t),e.prototype.createMrow=function(){var t=this.node.factory.create("inferredMrow");t.inheritAttributesFrom(this.node),this.mrow=this.wrap(t),this.mrow.parent=this},e.prototype.addMrowChildren=function(){var t,e,r=this.node,o=this.mrow;this.addMo(r.open),this.childNodes.length&&o.childNodes.push(this.childNodes[0]);var n=0;try{for(var i=a(this.childNodes.slice(1)),s=i.next();!s.done;s=i.next()){var l=s.value;this.addMo(r.separators[n++]),o.childNodes.push(l)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(e=i.return)&&e.call(i)}finally{if(t)throw t.error}}this.addMo(r.close),o.stretchChildren()},e.prototype.addMo=function(t){if(t){var e=this.wrap(t);this.mrow.childNodes.push(e),e.parent=this.mrow}},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),t.updateFrom(this.mrow.getOuterBBox()),this.setChildPWidths(e)},e}(t)}},5705:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMfracMixin=void 0,e.CommonMfracMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;if(o.bevel=null,o.pad=o.node.getProperty("withDelims")?0:o.font.params.nulldelimiterspace,o.node.attributes.get("bevelled")){var a=o.getBevelData(o.isDisplay()).H,s=o.bevel=o.createMo("/");s.node.attributes.set("symmetric",!0),s.canStretch(1),s.getStretchedVariant([a],!0)}return o}return o(e,t),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),t.empty();var r=this.node.attributes.getList("linethickness","bevelled"),o=r.linethickness,n=r.bevelled,i=this.isDisplay(),a=null;if(n)this.getBevelledBBox(t,i);else{var s=this.length2em(String(o),.06);a=-2*this.pad,0===s?this.getAtopBBox(t,i):(this.getFractionBBox(t,i,s),a-=.2),a+=t.w}t.clean(),this.setChildPWidths(e,a)},e.prototype.getFractionBBox=function(t,e,r){var o=this.childNodes[0].getOuterBBox(),n=this.childNodes[1].getOuterBBox(),i=this.font.params.axis_height,a=this.getTUV(e,r),s=a.T,l=a.u,c=a.v;t.combine(o,0,i+s+Math.max(o.d*o.rscale,l)),t.combine(n,0,i-s-Math.max(n.h*n.rscale,c)),t.w+=2*this.pad+.2},e.prototype.getTUV=function(t,e){var r=this.font.params,o=r.axis_height,n=(t?3.5:1.5)*e;return{T:(t?3.5:1.5)*e,u:(t?r.num1:r.num2)-o-n,v:(t?r.denom1:r.denom2)+o-n}},e.prototype.getAtopBBox=function(t,e){var r=this.getUVQ(e),o=r.u,n=r.v,i=r.nbox,a=r.dbox;t.combine(i,0,o),t.combine(a,0,-n),t.w+=2*this.pad},e.prototype.getUVQ=function(t){var e=this.childNodes[0].getOuterBBox(),r=this.childNodes[1].getOuterBBox(),o=this.font.params,i=n(t?[o.num1,o.denom1]:[o.num3,o.denom2],2),a=i[0],s=i[1],l=(t?7:3)*o.rule_thickness,c=a-e.d*e.scale-(r.h*r.scale-s);return c<l&&(a+=(l-c)/2,s+=(l-c)/2,c=l),{u:a,v:s,q:c,nbox:e,dbox:r}},e.prototype.getBevelledBBox=function(t,e){var r=this.getBevelData(e),o=r.u,n=r.v,i=r.delta,a=r.nbox,s=r.dbox,l=this.bevel.getOuterBBox();t.combine(a,0,o),t.combine(l,t.w-i/2,0),t.combine(s,t.w-i/2,n)},e.prototype.getBevelData=function(t){var e=this.childNodes[0].getOuterBBox(),r=this.childNodes[1].getOuterBBox(),o=t?.4:.15,n=Math.max(e.scale*(e.h+e.d),r.scale*(r.h+r.d))+2*o,i=this.font.params.axis_height;return{H:n,delta:o,u:e.scale*(e.d-e.h)/2+i+o,v:r.scale*(r.d-r.h)/2+i-o,nbox:e,dbox:r}},e.prototype.canStretch=function(t){return!1},e.prototype.isDisplay=function(){var t=this.node.attributes.getList("displaystyle","scriptlevel"),e=t.displaystyle,r=t.scriptlevel;return e&&0===r},e.prototype.getWrapWidth=function(t){var e=this.node.attributes;return e.get("bevelled")?this.childNodes[t].getOuterBBox().w:this.getBBox().w-(this.length2em(e.get("linethickness"))?.2:0)-2*this.pad},e.prototype.getChildAlign=function(t){var e=this.node.attributes;return e.get("bevelled")?"left":e.get(["numalign","denomalign"][t])},e}(t)}},7969:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMglyphMixin=void 0,e.CommonMglyphMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;return o.getParameters(),o}return o(e,t),e.prototype.getParameters=function(){var t=this.node.attributes.getList("width","height","valign","src","index"),e=t.width,r=t.height,o=t.valign,n=t.src,i=t.index;if(n)this.width="auto"===e?1:this.length2em(e),this.height="auto"===r?1:this.length2em(r),this.valign=this.length2em(o||"0");else{var a=String.fromCodePoint(parseInt(i)),s=this.node.factory;this.charWrapper=this.wrap(s.create("text").setText(a)),this.charWrapper.parent=this}},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),this.charWrapper?t.updateFrom(this.charWrapper.getBBox()):(t.w=this.width,t.h=this.height+this.valign,t.d=-this.valign)},e}(t)}},1419:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMiMixin=void 0,e.CommonMiMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(e,r){void 0===r&&(r=!1),t.prototype.computeBBox.call(this,e),this.copySkewIC(e)},e}(t)}},9906:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMmultiscriptsMixin=e.ScriptNames=e.NextScript=void 0;var l=r(3717);e.NextScript={base:"subList",subList:"supList",supList:"subList",psubList:"psupList",psupList:"psubList"},e.ScriptNames=["sup","sup","psup","psub"],e.CommonMmultiscriptsMixin=function(t){return function(t){function r(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,a([],i(e),!1))||this;return o.scriptData=null,o.firstPrescript=0,o.getScriptData(),o}return n(r,t),r.prototype.combinePrePost=function(t,e){var r=new l.BBox(t);return r.combine(e,0,0),r},r.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.font.params.scriptspace,o=this.scriptData,n=this.combinePrePost(o.sub,o.psub),a=this.combinePrePost(o.sup,o.psup),s=i(this.getUVQ(n,a),2),l=s[0],c=s[1];if(t.empty(),o.numPrescripts&&(t.combine(o.psup,r,l),t.combine(o.psub,r,c)),t.append(o.base),o.numScripts){var h=t.w;t.combine(o.sup,h,l),t.combine(o.sub,h,c),t.w+=r}t.clean(),this.setChildPWidths(e)},r.prototype.getScriptData=function(){var t=this.scriptData={base:null,sub:l.BBox.empty(),sup:l.BBox.empty(),psub:l.BBox.empty(),psup:l.BBox.empty(),numPrescripts:0,numScripts:0},e=this.getScriptBBoxLists();this.combineBBoxLists(t.sub,t.sup,e.subList,e.supList),this.combineBBoxLists(t.psub,t.psup,e.psubList,e.psupList),t.base=e.base[0],t.numPrescripts=e.psubList.length,t.numScripts=e.subList.length},r.prototype.getScriptBBoxLists=function(){var t,r,o={base:[],subList:[],supList:[],psubList:[],psupList:[]},n="base";try{for(var i=s(this.childNodes),a=i.next();!a.done;a=i.next()){var l=a.value;l.node.isKind("mprescripts")?n="psubList":(o[n].push(l.getOuterBBox()),n=e.NextScript[n])}}catch(e){t={error:e}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}return this.firstPrescript=o.subList.length+o.supList.length+2,this.padLists(o.subList,o.supList),this.padLists(o.psubList,o.psupList),o},r.prototype.padLists=function(t,e){t.length>e.length&&e.push(l.BBox.empty())},r.prototype.combineBBoxLists=function(t,e,r,o){for(var n=0;n<r.length;n++){var a=i(this.getScaledWHD(r[n]),3),s=a[0],l=a[1],c=a[2],h=i(this.getScaledWHD(o[n]),3),u=h[0],p=h[1],d=h[2],f=Math.max(s,u);t.w+=f,e.w+=f,l>t.h&&(t.h=l),c>t.d&&(t.d=c),p>e.h&&(e.h=p),d>e.d&&(e.d=d)}},r.prototype.getScaledWHD=function(t){var e=t.w,r=t.h,o=t.d,n=t.rscale;return[e*n,r*n,o*n]},r.prototype.getUVQ=function(e,r){var o;if(!this.UVQ){var n=i([0,0,0],3),a=n[0],s=n[1],l=n[2];0===e.h&&0===e.d?a=this.getU():0===r.h&&0===r.d?a=-this.getV():(a=(o=i(t.prototype.getUVQ.call(this,e,r),3))[0],s=o[1],l=o[2]),this.UVQ=[a,s,l]}return this.UVQ},r}(t)}},2304:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMnMixin=void 0,e.CommonMnMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.remapChars=function(t){if(t.length){var e=this.font.getRemappedChar("mn",t[0]);if(e){var r=this.unicodeChars(e,this.variant);1===r.length?t[0]=r[0]:t=r.concat(t.slice(1))}}return t},e}(t)}},437:function(t,e,r){var o,n,i=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),a=this&&this.__assign||function(){return a=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},a.apply(this,arguments)},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},l=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},c=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMoMixin=e.DirectionVH=void 0;var h=r(3717),u=r(6720),p=r(9250);e.DirectionVH=((n={})[1]="v",n[2]="h",n),e.CommonMoMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,l([],s(e),!1))||this;return o.size=null,o.isAccent=o.node.isAccent,o}return i(e,t),e.prototype.computeBBox=function(t,e){if(void 0===e&&(e=!1),this.protoBBox(t),this.node.attributes.get("symmetric")&&2!==this.stretch.dir){var r=this.getCenterOffset(t);t.h+=r,t.d-=r}this.node.getProperty("mathaccent")&&(0===this.stretch.dir||this.size>=0)&&(t.w=0)},e.prototype.protoBBox=function(e){var r=0!==this.stretch.dir;r&&null===this.size&&this.getStretchedVariant([0]),r&&this.size<0||(t.prototype.computeBBox.call(this,e),this.copySkewIC(e))},e.prototype.getAccentOffset=function(){var t=h.BBox.empty();return this.protoBBox(t),-t.w/2},e.prototype.getCenterOffset=function(e){return void 0===e&&(e=null),e||(e=h.BBox.empty(),t.prototype.computeBBox.call(this,e)),(e.h+e.d)/2+this.font.params.axis_height-e.h},e.prototype.getVariant=function(){this.node.attributes.get("largeop")?this.variant=this.node.attributes.get("displaystyle")?"-largeop":"-smallop":this.node.attributes.getExplicit("mathvariant")||!1!==this.node.getProperty("pseudoscript")?t.prototype.getVariant.call(this):this.variant="-tex-variant"},e.prototype.canStretch=function(t){if(0!==this.stretch.dir)return this.stretch.dir===t;if(!this.node.attributes.get("stretchy"))return!1;var e=this.getText();if(1!==Array.from(e).length)return!1;var r=this.font.getDelimiter(e.codePointAt(0));return this.stretch=r&&r.dir===t?r:p.NOSTRETCH,0!==this.stretch.dir},e.prototype.getStretchedVariant=function(t,e){var r,o;if(void 0===e&&(e=!1),0!==this.stretch.dir){var n=this.getWH(t),i=this.getSize("minsize",0),s=this.getSize("maxsize",1/0),l=this.node.getProperty("mathaccent");n=Math.max(i,Math.min(s,n));var h=this.font.params.delimiterfactor/1e3,u=this.font.params.delimitershortfall,p=i||e?n:l?Math.min(n/h,n+u):Math.max(n*h,n-u),d=this.stretch,f=d.c||this.getText().codePointAt(0),m=0;if(d.sizes)try{for(var y=c(d.sizes),v=y.next();!v.done;v=y.next()){if(v.value>=p)return l&&m&&m--,this.variant=this.font.getSizeVariant(f,m),this.size=m,void(d.schar&&d.schar[m]&&(this.stretch=a(a({},this.stretch),{c:d.schar[m]})));m++}}catch(t){r={error:t}}finally{try{v&&!v.done&&(o=y.return)&&o.call(y)}finally{if(r)throw r.error}}d.stretch?(this.size=-1,this.invalidateBBox(),this.getStretchBBox(t,this.checkExtendedHeight(n,d),d)):(this.variant=this.font.getSizeVariant(f,m-1),this.size=m-1)}},e.prototype.getSize=function(t,e){var r=this.node.attributes;return r.isSet(t)&&(e=this.length2em(r.get(t),1,1)),e},e.prototype.getWH=function(t){if(0===t.length)return 0;if(1===t.length)return t[0];var e=s(t,2),r=e[0],o=e[1],n=this.font.params.axis_height;return this.node.attributes.get("symmetric")?2*Math.max(r-n,o+n):r+o},e.prototype.getStretchBBox=function(t,e,r){var o;r.hasOwnProperty("min")&&r.min>e&&(e=r.min);var n=s(r.HDW,3),i=n[0],a=n[1],l=n[2];1===this.stretch.dir?(i=(o=s(this.getBaseline(t,e,r),2))[0],a=o[1]):l=e,this.bbox.h=i,this.bbox.d=a,this.bbox.w=l},e.prototype.getBaseline=function(t,e,r){var o=2===t.length&&t[0]+t[1]===e,n=this.node.attributes.get("symmetric"),i=s(o?t:[e,0],2),a=i[0],l=i[1],c=s([a+l,0],2),h=c[0],u=c[1];if(n){var p=this.font.params.axis_height;o&&(h=2*Math.max(a-p,l+p)),u=h/2-p}else if(o)u=l;else{var d=s(r.HDW||[.75,.25],2),f=d[0],m=d[1];u=m*(h/(f+m))}return[h-u,u]},e.prototype.checkExtendedHeight=function(t,e){if(e.fullExt){var r=s(e.fullExt,2),o=r[0],n=r[1];t=n+Math.ceil(Math.max(0,t-n)/o)*o}return t},e.prototype.remapChars=function(t){var e=this.node.getProperty("primes");if(e)return(0,u.unicodeChars)(e);if(1===t.length){var r=this.node.coreParent().parent,o=this.isAccent&&!r.isKind("mrow")?"accent":"mo",n=this.font.getRemappedChar(o,t[0]);n&&(t=this.unicodeChars(n,this.variant))}return t},e}(t)}},7481:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMpaddedMixin=void 0,e.CommonMpaddedMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getDimens=function(){var t=this.node.attributes.getList("width","height","depth","lspace","voffset"),e=this.childNodes[0].getBBox(),r=e.w,o=e.h,n=e.d,i=r,a=o,s=n,l=0,c=0,h=0;""!==t.width&&(r=this.dimen(t.width,e,"w",0)),""!==t.height&&(o=this.dimen(t.height,e,"h",0)),""!==t.depth&&(n=this.dimen(t.depth,e,"d",0)),""!==t.voffset&&(c=this.dimen(t.voffset,e)),""!==t.lspace&&(l=this.dimen(t.lspace,e));var u=this.node.attributes.get("data-align");return u&&(h=this.getAlignX(r,e,u)),[a,s,i,o-a,n-s,r-i,l,c,h]},e.prototype.dimen=function(t,e,r,o){void 0===r&&(r=""),void 0===o&&(o=null);var n=(t=String(t)).match(/width|height|depth/),i=n?e[n[0].charAt(0)]:r?e[r]:0,a=this.length2em(t,i)||0;return t.match(/^[-+]/)&&r&&(a+=i),null!=o&&(a=Math.max(o,a)),a},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=n(this.getDimens(),6),o=r[0],i=r[1],a=r[2],s=r[3],l=r[4],c=r[5];t.w=a+c,t.h=o+s,t.d=i+l,this.setChildPWidths(e,t.w)},e.prototype.getWrapWidth=function(t){return this.getBBox().w},e.prototype.getChildAlign=function(t){return this.node.attributes.get("data-align")||"left"},e}(t)}},5997:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMrootMixin=void 0,e.CommonMrootMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"surd",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"root",{get:function(){return 1},enumerable:!1,configurable:!0}),e.prototype.combineRootBBox=function(t,e,r){var o=this.childNodes[this.root].getOuterBBox(),n=this.getRootDimens(e,r)[1];t.combine(o,0,n)},e.prototype.getRootDimens=function(t,e){var r=this.childNodes[this.surd],o=this.childNodes[this.root].getOuterBBox(),n=(r.size<0?.5:.6)*t.w,i=o.w,a=o.rscale,s=Math.max(i,n/a),l=Math.max(0,s-i);return[s*a-n,this.rootHeight(o,t,r.size,e),l]},e.prototype.rootHeight=function(t,e,r,o){var n=e.h+e.d;return(r<0?1.9:.55*n)-(n-o)+Math.max(0,t.d*t.rscale)},e}(t)}},9323:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonInferredMrowMixin=e.CommonMrowMixin=void 0;var l=r(3717);e.CommonMrowMixin=function(t){return function(t){function e(){for(var e,r,o=[],n=0;n<arguments.length;n++)o[n]=arguments[n];var c=t.apply(this,a([],i(o),!1))||this;c.stretchChildren();try{for(var h=s(c.childNodes),u=h.next();!u.done;u=h.next()){var p=u.value;if(p.bbox.pwidth){c.bbox.pwidth=l.BBox.fullWidth;break}}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=h.return)&&r.call(h)}finally{if(e)throw e.error}}return c}return n(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.stretchChildren=function(){var t,e,r,o,n,i,a=[];try{for(var l=s(this.childNodes),c=l.next();!c.done;c=l.next()){(j=c.value).canStretch(1)&&a.push(j)}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}var h=a.length,u=this.childNodes.length;if(h&&u>1){var p=0,d=0,f=h>1&&h===u;try{for(var m=s(this.childNodes),y=m.next();!y.done;y=m.next()){var v=0===(j=y.value).stretch.dir;if(f||v){var b=j.getOuterBBox(v),g=b.h,x=b.d,M=b.rscale;(g*=M)>p&&(p=g),(x*=M)>d&&(d=x)}}}catch(t){r={error:t}}finally{try{y&&!y.done&&(o=m.return)&&o.call(m)}finally{if(r)throw r.error}}try{for(var _=s(a),w=_.next();!w.done;w=_.next()){var j;(j=w.value).coreMO().getStretchedVariant([p,d])}}catch(t){n={error:t}}finally{try{w&&!w.done&&(i=_.return)&&i.call(_)}finally{if(n)throw n.error}}}},e}(t)},e.CommonInferredMrowMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getScale=function(){this.bbox.scale=this.parent.bbox.scale,this.bbox.rscale=1},e}(t)}},6920:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsMixin=void 0,e.CommonMsMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this,a=o.node.attributes,s=a.getList("lquote","rquote");return"monospace"!==o.variant&&(a.isSet("lquote")||'"'!==s.lquote||(s.lquote="\u201c"),a.isSet("rquote")||'"'!==s.rquote||(s.rquote="\u201d")),o.childNodes.unshift(o.createText(s.lquote)),o.childNodes.push(o.createText(s.rquote)),o}return o(e,t),e.prototype.createText=function(t){var e=this.wrap(this.mmlText(t));return e.parent=this,e},e}(t)}},37:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMspaceMixin=void 0,e.CommonMspaceMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.node.attributes;t.w=this.length2em(r.get("width"),0),t.h=this.length2em(r.get("height"),0),t.d=this.length2em(r.get("depth"),0)},e.prototype.handleVariant=function(){},e}(t)}},222:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsqrtMixin=void 0;var s=r(3717);e.CommonMsqrtMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,a([],i(e),!1))||this,n=o.createMo("\u221a");n.canStretch(1);var s=o.childNodes[o.base].getOuterBBox(),l=s.h,c=s.d,h=o.font.params.rule_thickness,u=o.node.attributes.get("displaystyle")?o.font.params.x_height:h;return o.surdH=l+c+2*h+u/4,n.getStretchedVariant([o.surdH-c,c],!0),o}return n(e,t),Object.defineProperty(e.prototype,"base",{get:function(){return 0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"surd",{get:function(){return 1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"root",{get:function(){return null},enumerable:!1,configurable:!0}),e.prototype.createMo=function(e){var r=t.prototype.createMo.call(this,e);return this.childNodes.push(r),r},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.childNodes[this.surd].getBBox(),o=new s.BBox(this.childNodes[this.base].getOuterBBox()),n=this.getPQ(r)[1],a=this.font.params.rule_thickness,l=o.h+n+a,c=i(this.getRootDimens(r,l),1)[0];t.h=l+a,this.combineRootBBox(t,r,l),t.combine(r,c,l-r.h),t.combine(o,c+r.w,0),t.clean(),this.setChildPWidths(e)},e.prototype.combineRootBBox=function(t,e,r){},e.prototype.getPQ=function(t){var e=this.font.params.rule_thickness,r=this.node.attributes.get("displaystyle")?this.font.params.x_height:e;return[r,t.h+t.d>this.surdH?(t.h+t.d-(this.surdH-2*e-r/2))/2:e+r/4]},e.prototype.getRootDimens=function(t,e){return[0,0,0,0]},e}(t)}},3069:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsubsupMixin=e.CommonMsupMixin=e.CommonMsubMixin=void 0,e.CommonMsubMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.sub]},enumerable:!1,configurable:!0}),e.prototype.getOffset=function(){return[0,-this.getV()]},e}(t),e.useIC=!1,e},e.CommonMsupMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.sup]},enumerable:!1,configurable:!0}),e.prototype.getOffset=function(){return[this.getAdjustedIc()-(this.baseRemoveIc?0:this.baseIc),this.getU()]},e}(t)},e.CommonMsubsupMixin=function(t){var e;return e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.UVQ=null,e}return o(e,t),Object.defineProperty(e.prototype,"subChild",{get:function(){return this.childNodes[this.node.sub]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"supChild",{get:function(){return this.childNodes[this.node.sup]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.baseChild.getOuterBBox(),o=n([this.subChild.getOuterBBox(),this.supChild.getOuterBBox()],2),i=o[0],a=o[1];t.empty(),t.append(r);var s=this.getBaseWidth(),l=this.getAdjustedIc(),c=n(this.getUVQ(),2),h=c[0],u=c[1];t.combine(i,s,u),t.combine(a,s+l,h),t.w+=this.font.params.scriptspace,t.clean(),this.setChildPWidths(e)},e.prototype.getUVQ=function(t,e){void 0===t&&(t=this.subChild.getOuterBBox()),void 0===e&&(e=this.supChild.getOuterBBox());var r=this.baseCore.getOuterBBox();if(this.UVQ)return this.UVQ;var o=this.font.params,i=3*o.rule_thickness,a=this.length2em(this.node.attributes.get("subscriptshift"),o.sub2),s=this.baseCharZero(r.d*this.baseScale+o.sub_drop*t.rscale),l=n([this.getU(),Math.max(s,a)],2),c=l[0],h=l[1],u=c-e.d*e.rscale-(t.h*t.rscale-h);if(u<i){h+=i-u;var p=.8*o.x_height-(c-e.d*e.rscale);p>0&&(c+=p,h-=p)}return c=Math.max(this.length2em(this.node.attributes.get("superscriptshift"),c),c),h=Math.max(this.length2em(this.node.attributes.get("subscriptshift"),h),h),u=c-e.d*e.rscale-(t.h*t.rscale-h),this.UVQ=[c,-h,u],this.UVQ},e}(t),e.useIC=!1,e}},8589:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtableMixin=void 0;var l=r(3717),c=r(6720),h=r(1490);e.CommonMtableMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,a([],i(e),!1))||this;o.numCols=0,o.numRows=0,o.data=null,o.pwidthCells=[],o.pWidth=0,o.numCols=(0,h.max)(o.tableRows.map((function(t){return t.numCells}))),o.numRows=o.childNodes.length,o.hasLabels=o.childNodes.reduce((function(t,e){return t||e.node.isKind("mlabeledtr")}),!1),o.findContainer(),o.isTop=!o.container||o.container.node.isKind("math")&&!o.container.parent,o.isTop&&(o.jax.table=o),o.getPercentageWidth();var n=o.node.attributes;return o.frame="none"!==n.get("frame"),o.fLine=o.frame&&n.get("frame")?.07:0,o.fSpace=o.frame?o.convertLengths(o.getAttributeArray("framespacing")):[0,0],o.cSpace=o.convertLengths(o.getColumnAttributes("columnspacing")),o.rSpace=o.convertLengths(o.getRowAttributes("rowspacing")),o.cLines=o.getColumnAttributes("columnlines").map((function(t){return"none"===t?0:.07})),o.rLines=o.getRowAttributes("rowlines").map((function(t){return"none"===t?0:.07})),o.cWidths=o.getColumnWidths(),o.stretchRows(),o.stretchColumns(),o}return n(e,t),Object.defineProperty(e.prototype,"tableRows",{get:function(){return this.childNodes},enumerable:!1,configurable:!0}),e.prototype.findContainer=function(){for(var t=this,e=t.parent;e&&(e.node.notParent||e.node.isKind("mrow"));)t=e,e=e.parent;this.container=e,this.containerI=t.node.childPosition()},e.prototype.getPercentageWidth=function(){if(this.hasLabels)this.bbox.pwidth=l.BBox.fullWidth;else{var t=this.node.attributes.get("width");(0,c.isPercent)(t)&&(this.bbox.pwidth=t)}},e.prototype.stretchRows=function(){for(var t=this.node.attributes.get("equalrows"),e=t?this.getEqualRowHeight():0,r=t?this.getTableData():{H:[0],D:[0]},o=r.H,n=r.D,i=this.tableRows,a=0;a<this.numRows;a++){var s=t?[(e+o[a]-n[a])/2,(e-o[a]+n[a])/2]:null;i[a].stretchChildren(s)}},e.prototype.stretchColumns=function(){for(var t=0;t<this.numCols;t++){var e="number"==typeof this.cWidths[t]?this.cWidths[t]:null;this.stretchColumn(t,e)}},e.prototype.stretchColumn=function(t,e){var r,o,n,i,a,l,c=[];try{for(var h=s(this.tableRows),u=h.next();!u.done;u=h.next()){if(v=u.value.getChild(t))0===(_=v.childNodes[0]).stretch.dir&&_.canStretch(2)&&c.push(_)}}catch(t){r={error:t}}finally{try{u&&!u.done&&(o=h.return)&&o.call(h)}finally{if(r)throw r.error}}var p=c.length,d=this.childNodes.length;if(p&&d>1){if(null===e){e=0;var f=p>1&&p===d;try{for(var m=s(this.tableRows),y=m.next();!y.done;y=m.next()){var v;if(v=y.value.getChild(t)){var b=0===(_=v.childNodes[0]).stretch.dir;if(f||b){var g=_.getBBox(b).w;g>e&&(e=g)}}}}catch(t){n={error:t}}finally{try{y&&!y.done&&(i=m.return)&&i.call(m)}finally{if(n)throw n.error}}}try{for(var x=s(c),M=x.next();!M.done;M=x.next()){var _;(_=M.value).coreMO().getStretchedVariant([e])}}catch(t){a={error:t}}finally{try{M&&!M.done&&(l=x.return)&&l.call(x)}finally{if(a)throw a.error}}}},e.prototype.getTableData=function(){if(this.data)return this.data;for(var t=new Array(this.numRows).fill(0),e=new Array(this.numRows).fill(0),r=new Array(this.numCols).fill(0),o=new Array(this.numRows),n=new Array(this.numRows),i=[0],a=this.tableRows,s=0;s<a.length;s++){for(var l=0,c=a[s],h=c.node.attributes.get("rowalign"),u=0;u<c.numCells;u++){var p=c.getChild(u);l=this.updateHDW(p,u,s,h,t,e,r,l),this.recordPWidthCell(p,u)}o[s]=t[s],n[s]=e[s],c.labeled&&(l=this.updateHDW(c.childNodes[0],0,s,h,t,e,i,l)),this.extendHD(s,t,e,l),this.extendHD(s,o,n,l)}var d=i[0];return this.data={H:t,D:e,W:r,NH:o,ND:n,L:d},this.data},e.prototype.updateHDW=function(t,e,r,o,n,i,a,s){var l=t.getBBox(),c=l.h,h=l.d,u=l.w,p=t.parent.bbox.rscale;1!==t.parent.bbox.rscale&&(c*=p,h*=p,u*=p),this.node.getProperty("useHeight")&&(c<.75&&(c=.75),h<.25&&(h=.25));var d=0;return"baseline"!==(o=t.node.attributes.get("rowalign")||o)&&"axis"!==o&&(d=c+h,c=h=0),c>n[r]&&(n[r]=c),h>i[r]&&(i[r]=h),d>s&&(s=d),a&&u>a[e]&&(a[e]=u),s},e.prototype.extendHD=function(t,e,r,o){var n=(o-(e[t]+r[t]))/2;n<1e-5||(e[t]+=n,r[t]+=n)},e.prototype.recordPWidthCell=function(t,e){t.childNodes[0]&&t.childNodes[0].getBBox().pwidth&&this.pwidthCells.push([t,e])},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r,o,n=this.getTableData(),a=n.H,s=n.D;if(this.node.attributes.get("equalrows")){var l=this.getEqualRowHeight();r=(0,h.sum)([].concat(this.rLines,this.rSpace))+l*this.numRows}else r=(0,h.sum)(a.concat(s,this.rLines,this.rSpace));r+=2*(this.fLine+this.fSpace[1]);var u=this.getComputedWidths();o=(0,h.sum)(u.concat(this.cLines,this.cSpace))+2*(this.fLine+this.fSpace[0]);var p=this.node.attributes.get("width");"auto"!==p&&(o=Math.max(this.length2em(p,0)+2*this.fLine,o));var d=i(this.getBBoxHD(r),2),f=d[0],m=d[1];t.h=f,t.d=m,t.w=o;var y=i(this.getBBoxLR(),2),v=y[0],b=y[1];t.L=v,t.R=b,(0,c.isPercent)(p)||this.setColumnPWidths()},e.prototype.setChildPWidths=function(t,e,r){var o=this.node.attributes.get("width");if(!(0,c.isPercent)(o))return!1;this.hasLabels||(this.bbox.pwidth="",this.container.bbox.pwidth="");var n=this.bbox,i=n.w,a=n.L,s=n.R,l=this.node.attributes.get("data-width-includes-label"),u=Math.max(i,this.length2em(o,Math.max(e,a+i+s)))-(l?a+s:0),p=this.node.attributes.get("equalcolumns")?Array(this.numCols).fill(this.percent(1/Math.max(1,this.numCols))):this.getColumnAttributes("columnwidth",0);this.cWidths=this.getColumnWidthsFixed(p,u);var d=this.getComputedWidths();return this.pWidth=(0,h.sum)(d.concat(this.cLines,this.cSpace))+2*(this.fLine+this.fSpace[0]),this.isTop&&(this.bbox.w=this.pWidth),this.setColumnPWidths(),this.pWidth!==i&&this.parent.invalidateBBox(),this.pWidth!==i},e.prototype.setColumnPWidths=function(){var t,e,r=this.cWidths;try{for(var o=s(this.pwidthCells),n=o.next();!n.done;n=o.next()){var a=i(n.value,2),l=a[0],c=a[1];l.setChildPWidths(!1,r[c])&&(l.invalidateBBox(),l.getBBox())}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}},e.prototype.getBBoxHD=function(t){var e=i(this.getAlignmentRow(),2),r=e[0],o=e[1];if(null===o){var n=this.font.params.axis_height,a=t/2;return{top:[0,t],center:[a,a],bottom:[t,0],baseline:[a,a],axis:[a+n,a-n]}[r]||[a,a]}var s=this.getVerticalPosition(o,r);return[s,t-s]},e.prototype.getBBoxLR=function(){if(this.hasLabels){var t=this.node.attributes,e=t.get("side"),r=i(this.getPadAlignShift(e),2),o=r[0],n=r[1],a=this.hasLabels&&!!t.get("data-width-includes-label");return a&&this.frame&&this.fSpace[0]&&(o-=this.fSpace[0]),"center"!==n||a?"left"===e?[o,0]:[0,o]:[o,o]}return[0,0]},e.prototype.getPadAlignShift=function(t){var e=this.getTableData().L+this.length2em(this.node.attributes.get("minlabelspacing")),r=i(null==this.styles?["",""]:[this.styles.get("padding-left"),this.styles.get("padding-right")],2),o=r[0],n=r[1];(o||n)&&(e=Math.max(e,this.length2em(o||"0"),this.length2em(n||"0")));var a=i(this.getAlignShift(),2),s=a[0],l=a[1];return s===t&&(l="left"===t?Math.max(e,l)-e:Math.min(-e,l)+e),[e,s,l]},e.prototype.getAlignShift=function(){return this.isTop?t.prototype.getAlignShift.call(this):[this.container.getChildAlign(this.containerI),0]},e.prototype.getWidth=function(){return this.pWidth||this.getBBox().w},e.prototype.getEqualRowHeight=function(){var t=this.getTableData(),e=t.H,r=t.D,o=Array.from(e.keys()).map((function(t){return e[t]+r[t]}));return Math.max.apply(Math,o)},e.prototype.getComputedWidths=function(){var t=this,e=this.getTableData().W,r=Array.from(e.keys()).map((function(r){return"number"==typeof t.cWidths[r]?t.cWidths[r]:e[r]}));return this.node.attributes.get("equalcolumns")&&(r=Array(r.length).fill((0,h.max)(r))),r},e.prototype.getColumnWidths=function(){var t=this.node.attributes.get("width");if(this.node.attributes.get("equalcolumns"))return this.getEqualColumns(t);var e=this.getColumnAttributes("columnwidth",0);return"auto"===t?this.getColumnWidthsAuto(e):(0,c.isPercent)(t)?this.getColumnWidthsPercent(e):this.getColumnWidthsFixed(e,this.length2em(t))},e.prototype.getEqualColumns=function(t){var e,r=Math.max(1,this.numCols);if("auto"===t){var o=this.getTableData().W;e=(0,h.max)(o)}else if((0,c.isPercent)(t))e=this.percent(1/r);else{var n=(0,h.sum)([].concat(this.cLines,this.cSpace))+2*this.fSpace[0];e=Math.max(0,this.length2em(t)-n)/r}return Array(this.numCols).fill(e)},e.prototype.getColumnWidthsAuto=function(t){var e=this;return t.map((function(t){return"auto"===t||"fit"===t?null:(0,c.isPercent)(t)?t:e.length2em(t)}))},e.prototype.getColumnWidthsPercent=function(t){var e=this,r=t.indexOf("fit")>=0,o=(r?this.getTableData():{W:null}).W;return Array.from(t.keys()).map((function(n){var i=t[n];return"fit"===i?null:"auto"===i?r?o[n]:null:(0,c.isPercent)(i)?i:e.length2em(i)}))},e.prototype.getColumnWidthsFixed=function(t,e){var r=this,o=Array.from(t.keys()),n=o.filter((function(e){return"fit"===t[e]})),i=o.filter((function(e){return"auto"===t[e]})),a=n.length||i.length,s=(a?this.getTableData():{W:null}).W,l=e-(0,h.sum)([].concat(this.cLines,this.cSpace))-2*this.fSpace[0],c=l;o.forEach((function(e){var o=t[e];c-="fit"===o||"auto"===o?s[e]:r.length2em(o,l)}));var u=a&&c>0?c/a:0;return o.map((function(e){var o=t[e];return"fit"===o?s[e]+u:"auto"===o?s[e]+(0===n.length?u:0):r.length2em(o,l)}))},e.prototype.getVerticalPosition=function(t,e){for(var r=this.node.attributes.get("equalrows"),o=this.getTableData(),n=o.H,a=o.D,s=r?this.getEqualRowHeight():0,l=this.getRowHalfSpacing(),c=this.fLine,h=0;h<t;h++)c+=l[h]+(r?s:n[h]+a[h])+l[h+1]+this.rLines[h];var u=i(r?[(s+n[t]-a[t])/2,(s-n[t]+a[t])/2]:[n[t],a[t]],2),p=u[0],d=u[1];return c+={top:0,center:l[t]+(p+d)/2,bottom:l[t]+p+d+l[t+1],baseline:l[t]+p,axis:l[t]+p-.25}[e]||0},e.prototype.getEmHalfSpacing=function(t,e,r){void 0===r&&(r=1);var o=this.em(t*r),n=this.addEm(e,2/r);return n.unshift(o),n.push(o),n},e.prototype.getRowHalfSpacing=function(){var t=this.rSpace.map((function(t){return t/2}));return t.unshift(this.fSpace[1]),t.push(this.fSpace[1]),t},e.prototype.getColumnHalfSpacing=function(){var t=this.cSpace.map((function(t){return t/2}));return t.unshift(this.fSpace[0]),t.push(this.fSpace[0]),t},e.prototype.getAlignmentRow=function(){var t=i((0,c.split)(this.node.attributes.get("align")),2),e=t[0],r=t[1];if(null==r)return[e,null];var o=parseInt(r);return o<0&&(o+=this.numRows+1),[e,o<1||o>this.numRows?null:o-1]},e.prototype.getColumnAttributes=function(t,e){void 0===e&&(e=1);var r=this.numCols-e,o=this.getAttributeArray(t);if(0===o.length)return null;for(;o.length<r;)o.push(o[o.length-1]);return o.length>r&&o.splice(r),o},e.prototype.getRowAttributes=function(t,e){void 0===e&&(e=1);var r=this.numRows-e,o=this.getAttributeArray(t);if(0===o.length)return null;for(;o.length<r;)o.push(o[o.length-1]);return o.length>r&&o.splice(r),o},e.prototype.getAttributeArray=function(t){var e=this.node.attributes.get(t);return e?(0,c.split)(e):[this.node.attributes.getDefault(t)]},e.prototype.addEm=function(t,e){var r=this;return void 0===e&&(e=1),t?t.map((function(t){return r.em(t/e)})):null},e.prototype.convertLengths=function(t){var e=this;return t?t.map((function(t){return e.length2em(t)})):null},e}(t)}},7805:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtdMixin=void 0,e.CommonMtdMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.invalidateBBox=function(){this.bboxComputed=!1},e.prototype.getWrapWidth=function(t){var e=this.parent.parent,r=this.parent,o=this.node.childPosition()-(r.labeled?1:0);return"number"==typeof e.cWidths[o]?e.cWidths[o]:e.getTableData().W[o]},e.prototype.getChildAlign=function(t){return this.node.attributes.get("columnalign")},e}(t)}},8325:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtextMixin=void 0,e.CommonMtextMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getVariant=function(){var e=this.jax.options,r=this.jax.math.outputData,o=(!!r.merrorFamily||!!e.merrorFont)&&this.node.Parent.isKind("merror");if(r.mtextFamily||e.mtextFont||o){var n=this.node.attributes.get("mathvariant"),i=this.constructor.INHERITFONTS[n]||this.jax.font.getCssFont(n),a=i[0]||(o?r.merrorFamily||e.merrorFont:r.mtextFamily||e.mtextFont);this.variant=this.explicitVariant(a,i[2]?"bold":"",i[1]?"italic":"")}else t.prototype.getVariant.call(this)},e}(t),e.INHERITFONTS={normal:["",!1,!1],bold:["",!1,!0],italic:["",!0,!1],"bold-italic":["",!0,!0]},e}},4818:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMlabeledtrMixin=e.CommonMtrMixin=void 0,e.CommonMtrMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"numCells",{get:function(){return this.childNodes.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"labeled",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tableCells",{get:function(){return this.childNodes},enumerable:!1,configurable:!0}),e.prototype.getChild=function(t){return this.childNodes[t]},e.prototype.getChildBBoxes=function(){return this.childNodes.map((function(t){return t.getBBox()}))},e.prototype.stretchChildren=function(t){var e,r,o,i,a,s;void 0===t&&(t=null);var l=[],c=this.labeled?this.childNodes.slice(1):this.childNodes;try{for(var h=n(c),u=h.next();!u.done;u=h.next()){(C=u.value.childNodes[0]).canStretch(1)&&l.push(C)}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=h.return)&&r.call(h)}finally{if(e)throw e.error}}var p=l.length,d=this.childNodes.length;if(p&&d>1){if(null===t){var f=0,m=0,y=p>1&&p===d;try{for(var v=n(c),b=v.next();!b.done;b=v.next()){var g=0===(C=b.value.childNodes[0]).stretch.dir;if(y||g){var x=C.getBBox(g),M=x.h,_=x.d;M>f&&(f=M),_>m&&(m=_)}}}catch(t){o={error:t}}finally{try{b&&!b.done&&(i=v.return)&&i.call(v)}finally{if(o)throw o.error}}t=[f,m]}try{for(var w=n(l),j=w.next();!j.done;j=w.next()){var C;(C=j.value).coreMO().getStretchedVariant(t)}}catch(t){a={error:t}}finally{try{j&&!j.done&&(s=w.return)&&s.call(w)}finally{if(a)throw a.error}}}},e}(t)},e.CommonMlabeledtrMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"numCells",{get:function(){return Math.max(0,this.childNodes.length-1)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"labeled",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tableCells",{get:function(){return this.childNodes.slice(1)},enumerable:!1,configurable:!0}),e.prototype.getChild=function(t){return this.childNodes[t+1]},e.prototype.getChildBBoxes=function(){return this.childNodes.slice(1).map((function(t){return t.getBBox()}))},e}(t)}},9690:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMunderoverMixin=e.CommonMoverMixin=e.CommonMunderMixin=void 0,e.CommonMunderMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;return o.stretchChildren(),o}return o(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.under]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(e,r){if(void 0===r&&(r=!1),this.hasMovableLimits())t.prototype.computeBBox.call(this,e,r);else{e.empty();var o=this.baseChild.getOuterBBox(),i=this.scriptChild.getOuterBBox(),a=this.getUnderKV(o,i)[1],s=this.isLineBelow?0:this.getDelta(!0),l=n(this.getDeltaW([o,i],[0,-s]),2),c=l[0],h=l[1];e.combine(o,c,0),e.combine(i,h,a),e.d+=this.font.params.big_op_spacing5,e.clean(),this.setChildPWidths(r)}},e}(t)},e.CommonMoverMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;return o.stretchChildren(),o}return o(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.over]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(e){if(this.hasMovableLimits())t.prototype.computeBBox.call(this,e);else{e.empty();var r=this.baseChild.getOuterBBox(),o=this.scriptChild.getOuterBBox();this.node.attributes.get("accent")&&(r.h=Math.max(r.h,this.font.params.x_height*r.scale));var i=this.getOverKU(r,o)[1],a=this.isLineAbove?0:this.getDelta(),s=n(this.getDeltaW([r,o],[0,a]),2),l=s[0],c=s[1];e.combine(r,l,0),e.combine(o,c,i),e.h+=this.font.params.big_op_spacing5,e.clean()}},e}(t)},e.CommonMunderoverMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;return o.stretchChildren(),o}return o(e,t),Object.defineProperty(e.prototype,"underChild",{get:function(){return this.childNodes[this.node.under]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overChild",{get:function(){return this.childNodes[this.node.over]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"subChild",{get:function(){return this.underChild},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"supChild",{get:function(){return this.overChild},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(e){if(this.hasMovableLimits())t.prototype.computeBBox.call(this,e);else{e.empty();var r=this.overChild.getOuterBBox(),o=this.baseChild.getOuterBBox(),i=this.underChild.getOuterBBox();this.node.attributes.get("accent")&&(o.h=Math.max(o.h,this.font.params.x_height*o.scale));var a=this.getOverKU(o,r)[1],s=this.getUnderKV(o,i)[1],l=this.getDelta(),c=n(this.getDeltaW([o,i,r],[0,this.isLineBelow?0:-l,this.isLineAbove?0:l]),3),h=c[0],u=c[1],p=c[2];e.combine(o,h,0),e.combine(r,p,a),e.combine(i,u,s);var d=this.font.params.big_op_spacing5;e.h+=d,e.d+=d,e.clean()}},e}(t)}},7091:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonScriptbaseMixin=void 0;var l=r(8921);e.CommonScriptbaseMixin=function(t){var e;return e=function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,a([],i(e),!1))||this;o.baseScale=1,o.baseIc=0,o.baseRemoveIc=!1,o.baseIsChar=!1,o.baseHasAccentOver=null,o.baseHasAccentUnder=null,o.isLineAbove=!1,o.isLineBelow=!1,o.isMathAccent=!1;var n=o.baseCore=o.getBaseCore();return n?(o.setBaseAccentsFor(n),o.baseScale=o.getBaseScale(),o.baseIc=o.getBaseIc(),o.baseIsChar=o.isCharBase(),o.isMathAccent=o.baseIsChar&&o.scriptChild&&!!o.scriptChild.coreMO().node.getProperty("mathaccent"),o.checkLineAccents(),o.baseRemoveIc=!o.isLineAbove&&!o.isLineBelow&&(!o.constructor.useIC||o.isMathAccent),o):o}return n(e,t),Object.defineProperty(e.prototype,"baseChild",{get:function(){return this.childNodes[this.node.base]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[1]},enumerable:!1,configurable:!0}),e.prototype.getBaseCore=function(){for(var t=this.getSemanticBase()||this.childNodes[0];t&&(1===t.childNodes.length&&(t.node.isKind("mrow")||t.node.isKind("TeXAtom")&&t.node.texClass!==l.TEXCLASS.VCENTER||t.node.isKind("mstyle")||t.node.isKind("mpadded")||t.node.isKind("mphantom")||t.node.isKind("semantics"))||t.node.isKind("munderover")&&t.isMathAccent);)this.setBaseAccentsFor(t),t=t.childNodes[0];return t||(this.baseHasAccentOver=this.baseHasAccentUnder=!1),t||this.childNodes[0]},e.prototype.setBaseAccentsFor=function(t){t.node.isKind("munderover")&&(null===this.baseHasAccentOver&&(this.baseHasAccentOver=!!t.node.attributes.get("accent")),null===this.baseHasAccentUnder&&(this.baseHasAccentUnder=!!t.node.attributes.get("accentunder")))},e.prototype.getSemanticBase=function(){var t=this.node.attributes.getExplicit("data-semantic-fencepointer");return this.getBaseFence(this.baseChild,t)},e.prototype.getBaseFence=function(t,e){var r,o;if(!t||!t.node.attributes||!e)return null;if(t.node.attributes.getExplicit("data-semantic-id")===e)return t;try{for(var n=s(t.childNodes),i=n.next();!i.done;i=n.next()){var a=i.value,l=this.getBaseFence(a,e);if(l)return l}}catch(t){r={error:t}}finally{try{i&&!i.done&&(o=n.return)&&o.call(n)}finally{if(r)throw r.error}}return null},e.prototype.getBaseScale=function(){for(var t=this.baseCore,e=1;t&&t!==this;){e*=t.getOuterBBox().rscale,t=t.parent}return e},e.prototype.getBaseIc=function(){return this.baseCore.getOuterBBox().ic*this.baseScale},e.prototype.getAdjustedIc=function(){var t=this.baseCore.getOuterBBox();return(t.ic?1.05*t.ic+.05:0)*this.baseScale},e.prototype.isCharBase=function(){var t=this.baseCore;return(t.node.isKind("mo")&&null===t.size||t.node.isKind("mi")||t.node.isKind("mn"))&&1===t.bbox.rscale&&1===Array.from(t.getText()).length},e.prototype.checkLineAccents=function(){if(this.node.isKind("munderover"))if(this.node.isKind("mover"))this.isLineAbove=this.isLineAccent(this.scriptChild);else if(this.node.isKind("munder"))this.isLineBelow=this.isLineAccent(this.scriptChild);else{this.isLineAbove=this.isLineAccent(this.overChild),this.isLineBelow=this.isLineAccent(this.underChild)}},e.prototype.isLineAccent=function(t){var e=t.coreMO().node;return e.isToken&&"\u2015"===e.getText()},e.prototype.getBaseWidth=function(){var t=this.baseChild.getOuterBBox();return t.w*t.rscale-(this.baseRemoveIc?this.baseIc:0)+this.font.params.extra_ic},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.getBaseWidth(),o=i(this.getOffset(),2),n=o[0],a=o[1];t.append(this.baseChild.getOuterBBox()),t.combine(this.scriptChild.getOuterBBox(),r+n,a),t.w+=this.font.params.scriptspace,t.clean(),this.setChildPWidths(e)},e.prototype.getOffset=function(){return[0,0]},e.prototype.baseCharZero=function(t){var e=!!this.baseCore.node.attributes.get("largeop"),r=this.baseScale;return this.baseIsChar&&!e&&1===r?0:t},e.prototype.getV=function(){var t=this.baseCore.getOuterBBox(),e=this.scriptChild.getOuterBBox(),r=this.font.params,o=this.length2em(this.node.attributes.get("subscriptshift"),r.sub1);return Math.max(this.baseCharZero(t.d*this.baseScale+r.sub_drop*e.rscale),o,e.h*e.rscale-.8*r.x_height)},e.prototype.getU=function(){var t=this.baseCore.getOuterBBox(),e=this.scriptChild.getOuterBBox(),r=this.font.params,o=this.node.attributes.getList("displaystyle","superscriptshift"),n=this.node.getProperty("texprimestyle")?r.sup3:o.displaystyle?r.sup1:r.sup2,i=this.length2em(o.superscriptshift,n);return Math.max(this.baseCharZero(t.h*this.baseScale-r.sup_drop*e.rscale),i,e.d*e.rscale+1/4*r.x_height)},e.prototype.hasMovableLimits=function(){var t=this.node.attributes.get("displaystyle"),e=this.baseChild.coreMO().node;return!t&&!!e.attributes.get("movablelimits")},e.prototype.getOverKU=function(t,e){var r=this.node.attributes.get("accent"),o=this.font.params,n=e.d*e.rscale,i=o.rule_thickness*o.separation_factor,a=this.baseHasAccentOver?i:0,s=this.isLineAbove?3*o.rule_thickness:i,l=(r?s:Math.max(o.big_op_spacing1,o.big_op_spacing3-Math.max(0,n)))-a;return[l,t.h*t.rscale+l+n]},e.prototype.getUnderKV=function(t,e){var r=this.node.attributes.get("accentunder"),o=this.font.params,n=e.h*e.rscale,i=o.rule_thickness*o.separation_factor,a=this.baseHasAccentUnder?i:0,s=this.isLineBelow?3*o.rule_thickness:i,l=(r?s:Math.max(o.big_op_spacing2,o.big_op_spacing4-n))-a;return[l,-(t.d*t.rscale+l+n)]},e.prototype.getDeltaW=function(t,e){var r,o,n,l;void 0===e&&(e=[0,0,0]);var c=this.node.attributes.get("align"),h=t.map((function(t){return t.w*t.rscale}));h[0]-=this.baseRemoveIc&&!this.baseCore.node.attributes.get("largeop")?this.baseIc:0;var u=Math.max.apply(Math,a([],i(h),!1)),p=[],d=0;try{for(var f=s(h.keys()),m=f.next();!m.done;m=f.next()){var y=m.value;p[y]=("center"===c?(u-h[y])/2:"right"===c?u-h[y]:0)+e[y],p[y]<d&&(d=-p[y])}}catch(t){r={error:t}}finally{try{m&&!m.done&&(o=f.return)&&o.call(f)}finally{if(r)throw r.error}}if(d)try{for(var v=s(p.keys()),b=v.next();!b.done;b=v.next()){y=b.value;p[y]+=d}}catch(t){n={error:t}}finally{try{b&&!b.done&&(l=v.return)&&l.call(v)}finally{if(n)throw n.error}}return[1,2].map((function(e){return p[e]+=t[e]?t[e].dx*t[0].scale:0})),p},e.prototype.getDelta=function(t){void 0===t&&(t=!1);var e=this.node.attributes.get("accent"),r=this.baseCore.getOuterBBox(),o=r.sk,n=r.ic;return((e&&!t?o:0)+this.font.skewIcFactor*n)*this.baseScale},e.prototype.stretchChildren=function(){var t,e,r,o,n,i,a=[];try{for(var l=s(this.childNodes),c=l.next();!c.done;c=l.next()){(_=c.value).canStretch(2)&&a.push(_)}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}var h=a.length,u=this.childNodes.length;if(h&&u>1){var p=0,d=h>1&&h===u;try{for(var f=s(this.childNodes),m=f.next();!m.done;m=f.next()){var y=0===(_=m.value).stretch.dir;if(d||y){var v=_.getOuterBBox(y),b=v.w,g=v.rscale;b*g>p&&(p=b*g)}}}catch(t){r={error:t}}finally{try{m&&!m.done&&(o=f.return)&&o.call(f)}finally{if(r)throw r.error}}try{for(var x=s(a),M=x.next();!M.done;M=x.next()){var _;(_=M.value).coreMO().getStretchedVariant([p/_.bbox.rscale])}}catch(t){n={error:t}}finally{try{M&&!M.done&&(i=x.return)&&i.call(x)}finally{if(n)throw n.error}}}},e}(t),e.useIC=!0,e}},3191:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonSemanticsMixin=void 0,e.CommonSemanticsMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(t,e){if(void 0===e&&(e=!1),this.childNodes.length){var r=this.childNodes[0].getBBox(),o=r.w,n=r.h,i=r.d;t.w=o,t.h=n,t.d=i}},e}(t)}},8723:function(t,e){MathJax._.components.global.isObject,MathJax._.components.global.combineConfig,e.PV=MathJax._.components.global.combineDefaults,e.r8=MathJax._.components.global.combineWithMathJax,MathJax._.components.global.MathJax},4769:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.protoItem=MathJax._.core.MathItem.protoItem,e.AbstractMathItem=MathJax._.core.MathItem.AbstractMathItem,e.STATE=MathJax._.core.MathItem.STATE,e.newState=MathJax._.core.MathItem.newState},8921:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.TEXCLASS=MathJax._.core.MmlTree.MmlNode.TEXCLASS,e.TEXCLASSNAMES=MathJax._.core.MmlTree.MmlNode.TEXCLASSNAMES,e.indentAttributes=MathJax._.core.MmlTree.MmlNode.indentAttributes,e.AbstractMmlNode=MathJax._.core.MmlTree.MmlNode.AbstractMmlNode,e.AbstractMmlTokenNode=MathJax._.core.MmlTree.MmlNode.AbstractMmlTokenNode,e.AbstractMmlLayoutNode=MathJax._.core.MmlTree.MmlNode.AbstractMmlLayoutNode,e.AbstractMmlBaseNode=MathJax._.core.MmlTree.MmlNode.AbstractMmlBaseNode,e.AbstractMmlEmptyNode=MathJax._.core.MmlTree.MmlNode.AbstractMmlEmptyNode,e.TextNode=MathJax._.core.MmlTree.MmlNode.TextNode,e.XMLNode=MathJax._.core.MmlTree.MmlNode.XMLNode},4282:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.TeXAtom=MathJax._.core.MmlTree.MmlNodes.TeXAtom.TeXAtom},3969:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMaction=MathJax._.core.MmlTree.MmlNodes.maction.MmlMaction},304:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMath=MathJax._.core.MmlTree.MmlNodes.math.MmlMath},4374:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMenclose=MathJax._.core.MmlTree.MmlNodes.menclose.MmlMenclose},7451:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMfenced=MathJax._.core.MmlTree.MmlNodes.mfenced.MmlMfenced},848:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMfrac=MathJax._.core.MmlTree.MmlNodes.mfrac.MmlMfrac},910:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMglyph=MathJax._.core.MmlTree.MmlNodes.mglyph.MmlMglyph},7754:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMi=MathJax._.core.MmlTree.MmlNodes.mi.MmlMi},7764:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMmultiscripts=MathJax._.core.MmlTree.MmlNodes.mmultiscripts.MmlMmultiscripts,e.MmlMprescripts=MathJax._.core.MmlTree.MmlNodes.mmultiscripts.MmlMprescripts,e.MmlNone=MathJax._.core.MmlTree.MmlNodes.mmultiscripts.MmlNone},3235:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMn=MathJax._.core.MmlTree.MmlNodes.mn.MmlMn},9946:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMo=MathJax._.core.MmlTree.MmlNodes.mo.MmlMo},189:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMpadded=MathJax._.core.MmlTree.MmlNodes.mpadded.MmlMpadded},4664:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMroot=MathJax._.core.MmlTree.MmlNodes.mroot.MmlMroot},1691:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMrow=MathJax._.core.MmlTree.MmlNodes.mrow.MmlMrow,e.MmlInferredMrow=MathJax._.core.MmlTree.MmlNodes.mrow.MmlInferredMrow},4042:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMs=MathJax._.core.MmlTree.MmlNodes.ms.MmlMs},1465:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMspace=MathJax._.core.MmlTree.MmlNodes.mspace.MmlMspace},4655:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMsqrt=MathJax._.core.MmlTree.MmlNodes.msqrt.MmlMsqrt},5857:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMsubsup=MathJax._.core.MmlTree.MmlNodes.msubsup.MmlMsubsup,e.MmlMsub=MathJax._.core.MmlTree.MmlNodes.msubsup.MmlMsub,e.MmlMsup=MathJax._.core.MmlTree.MmlNodes.msubsup.MmlMsup},4859:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtable=MathJax._.core.MmlTree.MmlNodes.mtable.MmlMtable},2321:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtd=MathJax._.core.MmlTree.MmlNodes.mtd.MmlMtd},6277:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtext=MathJax._.core.MmlTree.MmlNodes.mtext.MmlMtext},4393:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtr=MathJax._.core.MmlTree.MmlNodes.mtr.MmlMtr,e.MmlMlabeledtr=MathJax._.core.MmlTree.MmlNodes.mtr.MmlMlabeledtr},3102:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMunderover=MathJax._.core.MmlTree.MmlNodes.munderover.MmlMunderover,e.MmlMunder=MathJax._.core.MmlTree.MmlNodes.munderover.MmlMunder,e.MmlMover=MathJax._.core.MmlTree.MmlNodes.munderover.MmlMover},9167:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlSemantics=MathJax._.core.MmlTree.MmlNodes.semantics.MmlSemantics,e.MmlAnnotationXML=MathJax._.core.MmlTree.MmlNodes.semantics.MmlAnnotationXML,e.MmlAnnotation=MathJax._.core.MmlTree.MmlNodes.semantics.MmlAnnotation},3985:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractOutputJax=MathJax._.core.OutputJax.AbstractOutputJax},9879:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractWrapper=MathJax._.core.Tree.Wrapper.AbstractWrapper},2506:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractWrapperFactory=MathJax._.core.Tree.WrapperFactory.AbstractWrapperFactory},3717:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.BBox=MathJax._.util.BBox.BBox},9077:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.isObject=MathJax._.util.Options.isObject,e.APPEND=MathJax._.util.Options.APPEND,e.REMOVE=MathJax._.util.Options.REMOVE,e.OPTIONS=MathJax._.util.Options.OPTIONS,e.Expandable=MathJax._.util.Options.Expandable,e.expandable=MathJax._.util.Options.expandable,e.makeArray=MathJax._.util.Options.makeArray,e.keys=MathJax._.util.Options.keys,e.copy=MathJax._.util.Options.copy,e.insert=MathJax._.util.Options.insert,e.defaultOptions=MathJax._.util.Options.defaultOptions,e.userOptions=MathJax._.util.Options.userOptions,e.selectOptions=MathJax._.util.Options.selectOptions,e.selectOptionsFromKeys=MathJax._.util.Options.selectOptionsFromKeys,e.separateOptions=MathJax._.util.Options.separateOptions,e.lookup=MathJax._.util.Options.lookup},5888:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.CssStyles=MathJax._.util.StyleList.CssStyles},5878:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Styles=MathJax._.util.Styles.Styles},6914:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.BIGDIMEN=MathJax._.util.lengths.BIGDIMEN,e.UNITS=MathJax._.util.lengths.UNITS,e.RELUNITS=MathJax._.util.lengths.RELUNITS,e.MATHSPACE=MathJax._.util.lengths.MATHSPACE,e.length2em=MathJax._.util.lengths.length2em,e.percent=MathJax._.util.lengths.percent,e.em=MathJax._.util.lengths.em,e.emRounded=MathJax._.util.lengths.emRounded,e.px=MathJax._.util.lengths.px},1490:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.sum=MathJax._.util.numeric.sum,e.max=MathJax._.util.numeric.max},6720:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.sortLength=MathJax._.util.string.sortLength,e.quotePattern=MathJax._.util.string.quotePattern,e.unicodeChars=MathJax._.util.string.unicodeChars,e.unicodeString=MathJax._.util.string.unicodeString,e.isPercent=MathJax._.util.string.isPercent,e.split=MathJax._.util.string.split},4142:function(t,e,r){r.r(e),r.d(e,{TeXFont:function(){return u}});var o=r(2098);function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function i(t,e){for(var r=0;r<e.length;r++){var o=e[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){return s=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},s(t,e)}function l(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var r,o=h(t);if(e){var n=h(this).constructor;r=Reflect.construct(o,arguments,n)}else r=o.apply(this,arguments);return c(this,r)}}function c(t,e){if(e&&("object"===n(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function h(t){return h=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},h(t)}var u=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&s(t,e)}(c,t);var e,r,o,n=l(c);function c(){return a(this,c),n.apply(this,arguments)}return e=c,r&&i(e.prototype,r),o&&i(e,o),Object.defineProperty(e,"prototype",{writable:!1}),e}(o.FontData);u.OPTIONS={fontURL:"."}}},dt={};function ft(t){var e=dt[t];if(void 0!==e)return e.exports;var r=dt[t]={exports:{}};return pt[t].call(r.exports,r,r.exports,ft),r.exports}ft.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return ft.d(e,{a:e}),e},ft.d=function(t,e){for(var r in e)ft.o(e,r)&&!ft.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},ft.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},ft.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},t=ft(8723),e=ft(7306),r=ft(7016),o=ft(2098),n=ft(4458),i=ft(7427),a=ft(6617),s=ft(4477),l=ft(8369),c=ft(518),h=ft(1114),u=ft(7918),p=ft(4155),d=ft(3215),f=ft(7047),m=ft(7837),y=ft(1315),v=ft(3271),b=ft(1096),g=ft(7013),x=ft(3292),M=ft(7215),_=ft(7111),w=ft(3126),j=ft(9821),C=ft(6024),O=ft(5437),S=ft(513),T=ft(6918),B=ft(8709),L=ft(6359),P=ft(7500),A=ft(6577),H=ft(7322),k=ft(7795),N=ft(9250),D=ft(5373),E=ft(716),W=ft(1541),R=ft(1475),I=ft(3438),F=ft(555),J=ft(3345),V=ft(2057),z=ft(6200),U=ft(1346),X=ft(5705),q=ft(7969),K=ft(1419),Q=ft(9906),G=ft(2304),Y=ft(437),Z=ft(7481),$=ft(5997),tt=ft(9323),et=ft(6920),rt=ft(37),ot=ft(222),nt=ft(3069),it=ft(8589),at=ft(7805),st=ft(8325),lt=ft(4818),ct=ft(9690),ht=ft(7091),ut=ft(3191),MathJax.loader&&MathJax.loader.checkVersion("output/chtml",e.q,"output"),(0,t.r8)({_:{output:{chtml_ts:r,chtml:{FontData:o,Notation:n,Usage:i,Wrapper:a,WrapperFactory:s,Wrappers_ts:l,Wrappers:{TeXAtom:c,TextNode:h,maction:u,math:p,menclose:d,mfenced:f,mfrac:m,mglyph:y,mi:v,mmultiscripts:b,mn:g,mo:x,mpadded:M,mroot:_,mrow:w,ms:j,mspace:C,msqrt:O,msubsup:S,mtable:T,mtd:B,mtext:L,mtr:P,munderover:A,scriptbase:H,semantics:k}},common:{FontData:N,Notation:D,OutputJax:E,Wrapper:W,WrapperFactory:R,Wrappers:{TeXAtom:I,TextNode:F,maction:J,math:V,menclose:z,mfenced:U,mfrac:X,mglyph:q,mi:K,mmultiscripts:Q,mn:G,mo:Y,mpadded:Z,mroot:$,mrow:tt,ms:et,mspace:rt,msqrt:ot,msubsup:nt,mtable:it,mtd:at,mtext:st,mtr:lt,munderover:ct,scriptbase:ht,semantics:ut}}}}}),MathJax.loader&&(0,t.PV)(MathJax.config.loader,"output/chtml",{checkReady:function(){return MathJax.loader.load("output/chtml/fonts/tex")}}),MathJax.startup&&(MathJax.startup.registerConstructor("chtml",r.CHTML),MathJax.startup.useOutput("chtml"))}(); ================================================ FILE: assets/vendors/mathjax-v3/output/svg/fonts/tex.js ================================================ !function(){"use strict";var Q={8667:function(Q,T){T.q=void 0,T.q="3.2.2"},2176:function(Q,T){var L,H=this&&this.__extends||(L=function(Q,T){return L=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(Q,T){Q.__proto__=T}||function(Q,T){for(var L in T)Object.prototype.hasOwnProperty.call(T,L)&&(Q[L]=T[L])},L(Q,T)},function(Q,T){if("function"!=typeof T&&null!==T)throw new TypeError("Class extends value "+String(T)+" is not a constructor or null");function H(){this.constructor=Q}L(Q,T),Q.prototype=null===T?Object.create(T):(H.prototype=T.prototype,new H)}),V=this&&this.__assign||function(){return V=Object.assign||function(Q){for(var T,L=1,H=arguments.length;L<H;L++)for(var V in T=arguments[L])Object.prototype.hasOwnProperty.call(T,V)&&(Q[V]=T[V]);return Q},V.apply(this,arguments)},M=this&&this.__read||function(Q,T){var L="function"==typeof Symbol&&Q[Symbol.iterator];if(!L)return Q;var H,V,M=L.call(Q),Z=[];try{for(;(void 0===T||T-- >0)&&!(H=M.next()).done;)Z.push(H.value)}catch(Q){V={error:Q}}finally{try{H&&!H.done&&(L=M.return)&&L.call(M)}finally{if(V)throw V.error}}return Z},Z=this&&this.__spreadArray||function(Q,T,L){if(L||2===arguments.length)for(var H,V=0,M=T.length;V<M;V++)!H&&V in T||(H||(H=Array.prototype.slice.call(T,0,V)),H[V]=T[V]);return Q.concat(H||Array.prototype.slice.call(T))};Object.defineProperty(T,"__esModule",{value:!0}),T.CommonTeXFontMixin=void 0,T.CommonTeXFontMixin=function(Q){var T;return T=function(Q){function T(){return null!==Q&&Q.apply(this,arguments)||this}return H(T,Q),T.prototype.getDelimiterData=function(Q){return this.getChar("-smallop",Q)||this.getChar("-size4",Q)},T}(Q),T.NAME="TeX",T.defaultVariants=Z(Z([],M(Q.defaultVariants),!1),[["-smallop","normal"],["-largeop","normal"],["-size3","normal"],["-size4","normal"],["-tex-calligraphic","italic"],["-tex-bold-calligraphic","bold-italic"],["-tex-oldstyle","normal"],["-tex-bold-oldstyle","bold"],["-tex-mathit","italic"],["-tex-variant","normal"]],!1),T.defaultCssFonts=V(V({},Q.defaultCssFonts),{"-smallop":["serif",!1,!1],"-largeop":["serif",!1,!1],"-size3":["serif",!1,!1],"-size4":["serif",!1,!1],"-tex-calligraphic":["cursive",!0,!1],"-tex-bold-calligraphic":["cursive",!0,!0],"-tex-oldstyle":["serif",!1,!1],"-tex-bold-oldstyle":["serif",!1,!0],"-tex-mathit":["serif",!0,!1]}),T.defaultSizeVariants=["normal","-smallop","-largeop","-size3","-size4","-tex-variant"],T.defaultStretchVariants=["-size4"],T}},3869:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.boldItalic=void 0,T.boldItalic={47:[.711,.21,.894],305:[.452,.008,.394,{sk:.0319}],567:[.451,.201,.439,{sk:.0958}],8260:[.711,.21,.894],8710:[.711,0,.958,{sk:.192}],10744:[.711,.21,.894]}},7557:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.bold=void 0,T.bold={33:[.705,0,.35],34:[.694,-.329,.603],35:[.694,.193,.958],36:[.75,.056,.575],37:[.75,.056,.958],38:[.705,.011,.894],39:[.694,-.329,.319],40:[.75,.249,.447],41:[.75,.249,.447],42:[.75,-.306,.575],43:[.633,.131,.894],44:[.171,.194,.319],45:[.278,-.166,.383],46:[.171,0,.319],47:[.75,.25,.575],58:[.444,0,.319],59:[.444,.194,.319],60:[.587,.085,.894],61:[.393,-.109,.894],62:[.587,.085,.894],63:[.7,0,.543],64:[.699,.006,.894],91:[.75,.25,.319],92:[.75,.25,.575],93:[.75,.25,.319],94:[.694,-.52,.575],95:[-.01,.061,.575],96:[.706,-.503,.575],123:[.75,.25,.575],124:[.75,.249,.319],125:[.75,.25,.575],126:[.344,-.202,.575],168:[.695,-.535,.575],172:[.371,-.061,.767],175:[.607,-.54,.575],176:[.702,-.536,.575],177:[.728,.035,.894],180:[.706,-.503,.575],183:[.336,-.166,.319],215:[.53,.028,.894],247:[.597,.096,.894],305:[.442,0,.278,{sk:.0278}],567:[.442,.205,.306,{sk:.0833}],697:[.563,-.033,.344],710:[.694,-.52,.575],711:[.66,-.515,.575],713:[.607,-.54,.575],714:[.706,-.503,.575],715:[.706,-.503,.575],728:[.694,-.5,.575],729:[.695,-.525,.575],730:[.702,-.536,.575],732:[.694,-.552,.575],768:[.706,-.503,0],769:[.706,-.503,0],770:[.694,-.52,0],771:[.694,-.552,0],772:[.607,-.54,0],774:[.694,-.5,0],775:[.695,-.525,0],776:[.695,-.535,0],778:[.702,-.536,0],779:[.714,-.511,0],780:[.66,-.515,0],824:[.711,.21,0],8194:[0,0,.5],8195:[0,0,.999],8196:[0,0,.333],8197:[0,0,.25],8198:[0,0,.167],8201:[0,0,.167],8202:[0,0,.083],8211:[.3,-.249,.575],8212:[.3,-.249,1.15],8213:[.3,-.249,1.15],8214:[.75,.248,.575],8215:[-.01,.061,.575],8216:[.694,-.329,.319],8217:[.694,-.329,.319],8220:[.694,-.329,.603],8221:[.694,-.329,.603],8224:[.702,.211,.511],8225:[.702,.202,.511],8226:[.474,-.028,.575],8230:[.171,0,1.295],8242:[.563,-.033,.344],8243:[.563,0,.688],8244:[.563,0,1.032],8254:[.607,-.54,.575],8260:[.75,.25,.575],8279:[.563,0,1.376],8407:[.723,-.513,.575],8463:[.694,.008,.668,{sk:-.0319}],8467:[.702,.019,.474,{sk:.128}],8472:[.461,.21,.74],8501:[.694,0,.703],8592:[.518,.017,1.15],8593:[.694,.193,.575],8594:[.518,.017,1.15],8595:[.694,.194,.575],8596:[.518,.017,1.15],8597:[.767,.267,.575],8598:[.724,.194,1.15],8599:[.724,.193,1.15],8600:[.694,.224,1.15],8601:[.694,.224,1.15],8602:[.711,.21,1.15],8603:[.711,.21,1.15],8614:[.518,.017,1.15],8617:[.518,.017,1.282],8618:[.518,.017,1.282],8622:[.711,.21,1.15],8636:[.518,-.22,1.15],8637:[.281,.017,1.15],8640:[.518,-.22,1.15],8641:[.281,.017,1.15],8652:[.718,.017,1.15],8653:[.711,.21,1.15],8654:[.711,.21,1.15],8655:[.711,.21,1.15],8656:[.547,.046,1.15],8657:[.694,.193,.703],8658:[.547,.046,1.15],8659:[.694,.194,.703],8660:[.547,.046,1.15],8661:[.767,.267,.703],8704:[.694,.016,.639],8707:[.694,0,.639],8708:[.711,.21,.639],8709:[.767,.073,.575],8710:[.698,0,.958],8712:[.587,.086,.767],8713:[.711,.21,.767],8715:[.587,.086,.767],8716:[.711,.21,.767],8722:[.281,-.221,.894],8723:[.537,.227,.894],8725:[.75,.25,.575],8726:[.75,.25,.575],8727:[.472,-.028,.575],8728:[.474,-.028,.575],8729:[.474,-.028,.575],8730:[.82,.18,.958,{ic:.03}],8733:[.451,.008,.894],8734:[.452,.008,1.15],8736:[.714,0,.722],8739:[.75,.249,.319],8740:[.75,.249,.319],8741:[.75,.248,.575],8742:[.75,.248,.575],8743:[.604,.017,.767],8744:[.604,.016,.767],8745:[.603,.016,.767],8746:[.604,.016,.767],8747:[.711,.211,.569,{ic:.063}],8764:[.391,-.109,.894],8768:[.583,.082,.319],8769:[.711,.21,.894],8771:[.502,0,.894],8772:[.711,.21,.894],8773:[.638,.027,.894],8775:[.711,.21,.894],8776:[.524,-.032,.894],8777:[.711,.21,.894],8781:[.533,.032,.894],8784:[.721,-.109,.894],8800:[.711,.21,.894],8801:[.505,0,.894],8802:[.711,.21,.894],8804:[.697,.199,.894],8805:[.697,.199,.894],8810:[.617,.116,1.15],8811:[.618,.116,1.15],8813:[.711,.21,.894],8814:[.711,.21,.894],8815:[.711,.21,.894],8816:[.711,.21,.894],8817:[.711,.21,.894],8826:[.585,.086,.894],8827:[.586,.086,.894],8832:[.711,.21,.894],8833:[.711,.21,.894],8834:[.587,.085,.894],8835:[.587,.086,.894],8836:[.711,.21,.894],8837:[.711,.21,.894],8838:[.697,.199,.894],8839:[.697,.199,.894],8840:[.711,.21,.894],8841:[.711,.21,.894],8846:[.604,.016,.767],8849:[.697,.199,.894],8850:[.697,.199,.894],8851:[.604,0,.767],8852:[.604,0,.767],8853:[.632,.132,.894],8854:[.632,.132,.894],8855:[.632,.132,.894],8856:[.632,.132,.894],8857:[.632,.132,.894],8866:[.693,0,.703],8867:[.693,0,.703],8868:[.694,0,.894],8869:[.693,0,.894],8872:[.75,.249,.974],8876:[.711,.21,.703],8877:[.75,.249,.974],8900:[.523,.021,.575],8901:[.336,-.166,.319],8902:[.502,0,.575],8904:[.54,.039,1],8930:[.711,.21,.894],8931:[.711,.21,.894],8942:[.951,.029,.319],8943:[.336,-.166,1.295],8945:[.871,-.101,1.323],8968:[.75,.248,.511],8969:[.75,.248,.511],8970:[.749,.248,.511],8971:[.749,.248,.511],8994:[.405,-.108,1.15],8995:[.392,-.126,1.15],9001:[.75,.249,.447],9002:[.75,.249,.447],9651:[.711,0,1.022],9653:[.711,0,1.022],9657:[.54,.039,.575],9661:[.5,.21,1.022],9663:[.5,.21,1.022],9667:[.539,.038,.575],9711:[.711,.211,1.15],9824:[.719,.129,.894],9825:[.711,.024,.894],9826:[.719,.154,.894],9827:[.719,.129,.894],9837:[.75,.017,.447],9838:[.741,.223,.447],9839:[.724,.224,.447],10072:[.75,.249,.319],10216:[.75,.249,.447],10217:[.75,.249,.447],10229:[.518,.017,1.805],10230:[.518,.017,1.833],10231:[.518,.017,2.126],10232:[.547,.046,1.868],10233:[.547,.046,1.87],10234:[.547,.046,2.126],10236:[.518,.017,1.833],10744:[.711,.21,.894],10799:[.53,.028,.894],10815:[.686,0,.9],10927:[.696,.199,.894],10928:[.697,.199,.894],12296:[.75,.249,.447],12297:[.75,.249,.447]}},7481:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.delimiters=T.VSIZES=T.HDW3=T.HDW2=T.HDW1=void 0;var H=L(4228);T.HDW1=[.75,.25,.875],T.HDW2=[.85,.349,.667],T.HDW3=[.583,.082,.5],T.VSIZES=[1,1.2,1.8,2.4,3];var V={c:47,dir:H.V,sizes:T.VSIZES},M={c:175,dir:H.H,sizes:[.5],stretch:[0,175],HDW:[.59,-.544,.5]},Z={c:710,dir:H.H,sizes:[.5,.556,1,1.444,1.889]},i={c:732,dir:H.H,sizes:[.5,.556,1,1.444,1.889]},t={c:8211,dir:H.H,sizes:[.5],stretch:[0,8211],HDW:[.285,-.248,.5]},e={c:8592,dir:H.H,sizes:[1],stretch:[8592,8722],HDW:T.HDW3},s={c:8594,dir:H.H,sizes:[1],stretch:[0,8722,8594],HDW:T.HDW3},c={c:8596,dir:H.H,sizes:[1],stretch:[8592,8722,8594],HDW:T.HDW3},r={c:8612,dir:H.H,stretch:[8592,8722,8739],HDW:T.HDW3,min:1.278},o={c:8614,dir:H.H,sizes:[1],stretch:[8739,8722,8594],HDW:T.HDW3},a={c:8656,dir:H.H,sizes:[1],stretch:[8656,61],HDW:T.HDW3},l={c:8658,dir:H.H,sizes:[1],stretch:[0,61,8658],HDW:T.HDW3},n={c:8660,dir:H.H,sizes:[1],stretch:[8656,61,8658],HDW:T.HDW3},d={c:8722,dir:H.H,sizes:[.778],stretch:[0,8722],HDW:T.HDW3},k={c:8739,dir:H.V,sizes:[1],stretch:[0,8739],HDW:[.627,.015,.333]},u={c:9180,dir:H.H,sizes:[.778,1],schar:[8994,8994],variants:[5,0],stretch:[57680,57684,57681],HDW:[.32,.2,.5]},f={c:9181,dir:H.H,sizes:[.778,1],schar:[8995,8995],variants:[5,0],stretch:[57682,57684,57683],HDW:[.32,.2,.5]},p={c:9182,dir:H.H,stretch:[57680,57684,57681,57685],HDW:[.32,.2,.5],min:1.8},h={c:9183,dir:H.H,stretch:[57682,57684,57683,57686],HDW:[.32,.2,.5],min:1.8},v={c:10216,dir:H.V,sizes:T.VSIZES},_={c:10217,dir:H.V,sizes:T.VSIZES},D={c:10502,dir:H.H,stretch:[8656,61,8739],HDW:T.HDW3,min:1.278},b={c:10503,dir:H.H,stretch:[8872,61,8658],HDW:T.HDW3,min:1.278};T.delimiters={40:{dir:H.V,sizes:T.VSIZES,stretch:[9115,9116,9117],HDW:[.85,.349,.875]},41:{dir:H.V,sizes:T.VSIZES,stretch:[9118,9119,9120],HDW:[.85,.349,.875]},45:d,47:V,61:{dir:H.H,sizes:[.778],stretch:[0,61],HDW:T.HDW3},91:{dir:H.V,sizes:T.VSIZES,stretch:[9121,9122,9123],HDW:T.HDW2},92:{dir:H.V,sizes:T.VSIZES},93:{dir:H.V,sizes:T.VSIZES,stretch:[9124,9125,9126],HDW:T.HDW2},94:Z,95:t,123:{dir:H.V,sizes:T.VSIZES,stretch:[9127,9130,9129,9128],HDW:[.85,.349,.889]},124:{dir:H.V,sizes:[1],stretch:[0,8739],HDW:[.75,.25,.333]},125:{dir:H.V,sizes:T.VSIZES,stretch:[9131,9130,9133,9132],HDW:[.85,.349,.889]},126:i,175:M,710:Z,713:M,732:i,770:Z,771:i,818:t,8211:t,8212:t,8213:t,8214:{dir:H.V,sizes:[.602,1],schar:[0,8741],variants:[1,0],stretch:[0,8741],HDW:[.602,0,.556]},8215:t,8254:M,8407:s,8592:e,8593:{dir:H.V,sizes:[.888],stretch:[8593,9168],HDW:[.6,0,.667]},8594:s,8595:{dir:H.V,sizes:[.888],stretch:[0,9168,8595],HDW:[.6,0,.667]},8596:c,8597:{dir:H.V,sizes:[1.044],stretch:[8593,9168,8595],HDW:T.HDW1},8606:{dir:H.H,sizes:[1],stretch:[8606,8722],HDW:T.HDW3},8608:{dir:H.H,sizes:[1],stretch:[0,8722,8608],HDW:T.HDW3},8612:r,8613:{dir:H.V,stretch:[8593,9168,8869],HDW:T.HDW1,min:1.555},8614:o,8615:{dir:H.V,stretch:[8868,9168,8595],HDW:T.HDW1,min:1.555},8624:{dir:H.V,sizes:[.722],stretch:[8624,9168],HDW:T.HDW1},8625:{dir:H.V,sizes:[.722],stretch:[8625,9168],HDW:T.HDW1},8636:{dir:H.H,sizes:[1],stretch:[8636,8722],HDW:T.HDW3},8637:{dir:H.H,sizes:[1],stretch:[8637,8722],HDW:T.HDW3},8638:{dir:H.V,sizes:[.888],stretch:[8638,9168],HDW:T.HDW1},8639:{dir:H.V,sizes:[.888],stretch:[8639,9168],HDW:T.HDW1},8640:{dir:H.H,sizes:[1],stretch:[0,8722,8640],HDW:T.HDW3},8641:{dir:H.H,sizes:[1],stretch:[0,8722,8641],HDW:T.HDW3},8642:{dir:H.V,sizes:[.888],stretch:[0,9168,8642],HDW:T.HDW1},8643:{dir:H.V,sizes:[.888],stretch:[0,9168,8643],HDW:T.HDW1},8656:a,8657:{dir:H.V,sizes:[.888],stretch:[8657,8214],HDW:[.599,0,.778]},8658:l,8659:{dir:H.V,sizes:[.888],stretch:[0,8214,8659],HDW:[.6,0,.778]},8660:n,8661:{dir:H.V,sizes:[1.044],stretch:[8657,8214,8659],HDW:[.75,.25,.778]},8666:{dir:H.H,sizes:[1],stretch:[8666,8801],HDW:[.464,-.036,.5]},8667:{dir:H.H,sizes:[1],stretch:[0,8801,8667],HDW:[.464,-.036,.5]},8722:d,8725:V,8730:{dir:H.V,sizes:T.VSIZES,stretch:[57345,57344,9143],fullExt:[.65,2.3],HDW:[.85,.35,1.056]},8739:k,8741:{dir:H.V,sizes:[1],stretch:[0,8741],HDW:[.627,.015,.556]},8968:{dir:H.V,sizes:T.VSIZES,stretch:[9121,9122],HDW:T.HDW2},8969:{dir:H.V,sizes:T.VSIZES,stretch:[9124,9125],HDW:T.HDW2},8970:{dir:H.V,sizes:T.VSIZES,stretch:[0,9122,9123],HDW:T.HDW2},8971:{dir:H.V,sizes:T.VSIZES,stretch:[0,9125,9126],HDW:T.HDW2},8978:u,8994:u,8995:f,9001:v,9002:_,9130:{dir:H.V,sizes:[.32],stretch:[9130,9130,9130],HDW:[.29,.015,.889]},9135:t,9136:{dir:H.V,sizes:[.989],stretch:[9127,9130,9133],HDW:[.75,.25,.889]},9137:{dir:H.V,sizes:[.989],stretch:[9131,9130,9129],HDW:[.75,.25,.889]},9140:{dir:H.H,stretch:[9484,8722,9488],HDW:T.HDW3,min:1},9141:{dir:H.H,stretch:[9492,8722,9496],HDW:T.HDW3,min:1},9168:{dir:H.V,sizes:[.602,1],schar:[0,8739],variants:[1,0],stretch:[0,8739],HDW:[.602,0,.333]},9180:u,9181:f,9182:p,9183:h,9184:{dir:H.H,stretch:[714,713,715],HDW:[.59,-.544,.5],min:1},9185:{dir:H.H,stretch:[715,713,714],HDW:[.59,-.544,.5],min:1},9472:t,10072:k,10216:v,10217:_,10222:{dir:H.V,sizes:[.989],stretch:[9127,9130,9129],HDW:[.75,.25,.889]},10223:{dir:H.V,sizes:[.989],stretch:[9131,9130,9133],HDW:[.75,.25,.889]},10229:e,10230:s,10231:c,10232:a,10233:l,10234:n,10235:r,10236:o,10237:D,10238:b,10502:D,10503:b,10574:{dir:H.H,stretch:[8636,8722,8640],HDW:T.HDW3,min:2},10575:{dir:H.V,stretch:[8638,9168,8642],HDW:T.HDW1,min:1.776},10576:{dir:H.H,stretch:[8637,8722,8641],HDW:T.HDW3,min:2},10577:{dir:H.V,stretch:[8639,9168,8643],HDW:T.HDW1,min:.5},10586:{dir:H.H,stretch:[8636,8722,8739],HDW:T.HDW3,min:1.278},10587:{dir:H.H,stretch:[8739,8722,8640],HDW:T.HDW3,min:1.278},10588:{dir:H.V,stretch:[8638,9168,8869],HDW:T.HDW1,min:1.556},10589:{dir:H.V,stretch:[8868,9168,8642],HDW:T.HDW1,min:1.556},10590:{dir:H.H,stretch:[8637,8722,8739],HDW:T.HDW3,min:1.278},10591:{dir:H.H,stretch:[8739,8722,8641],HDW:T.HDW3,min:1.278},10592:{dir:H.V,stretch:[8639,9168,8869],HDW:T.HDW1,min:1.776},10593:{dir:H.V,stretch:[8868,9168,8643],HDW:T.HDW1,min:1.776},12296:v,12297:_,65079:p,65080:h}},5674:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.doubleStruck=void 0,T.doubleStruck={}},7002:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.frakturBold=void 0,T.frakturBold={33:[.689,.012,.349],34:[.695,-.432,.254],38:[.696,.016,.871],39:[.695,-.436,.25],40:[.737,.186,.459],41:[.735,.187,.459],42:[.692,-.449,.328],43:[.598,.082,.893],44:[.107,.191,.328],45:[.275,-.236,.893],46:[.102,.015,.328],47:[.721,.182,.593],48:[.501,.012,.593],49:[.489,0,.593],50:[.491,0,.593],51:[.487,.193,.593],52:[.495,.196,.593],53:[.481,.19,.593],54:[.704,.012,.593],55:[.479,.197,.593],56:[.714,.005,.593],57:[.487,.195,.593],58:[.457,.012,.255],59:[.458,.19,.255],61:[.343,-.168,.582],63:[.697,.014,.428],91:[.74,.13,.257],93:[.738,.132,.257],94:[.734,-.452,.59],8216:[.708,-.411,.254],8217:[.692,-.394,.254],8260:[.721,.182,.593],58113:[.63,.027,.587],58114:[.693,.212,.394,{ic:.014}],58115:[.681,.219,.387],58116:[.473,.212,.593],58117:[.684,.027,.393],58120:[.679,.22,.981],58121:[.717,.137,.727]}},9349:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.fraktur=void 0,T.fraktur={33:[.689,.012,.296],34:[.695,-.432,.215],38:[.698,.011,.738],39:[.695,-.436,.212],40:[.737,.186,.389],41:[.735,.187,.389],42:[.692,-.449,.278],43:[.598,.082,.756],44:[.107,.191,.278],45:[.275,-.236,.756],46:[.102,.015,.278],47:[.721,.182,.502],48:[.492,.013,.502],49:[.468,0,.502],50:[.474,0,.502],51:[.473,.182,.502],52:[.476,.191,.502],53:[.458,.184,.502],54:[.7,.013,.502],55:[.468,.181,.502],56:[.705,.01,.502],57:[.469,.182,.502],58:[.457,.012,.216],59:[.458,.189,.216],61:[.368,-.132,.756],63:[.693,.011,.362],91:[.74,.13,.278],93:[.738,.131,.278],94:[.734,-.452,.5],8216:[.708,-.41,.215],8217:[.692,-.395,.215],8260:[.721,.182,.502],58112:[.683,.032,.497],58113:[.616,.03,.498],58114:[.68,.215,.333],58115:[.679,.224,.329],58116:[.471,.214,.503],58117:[.686,.02,.333],58118:[.577,.021,.334,{ic:.013}],58119:[.475,.022,.501,{ic:.013}]}},9741:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.italic=void 0,T.italic={33:[.716,0,.307,{ic:.073}],34:[.694,-.379,.514,{ic:.024}],35:[.694,.194,.818,{ic:.01}],37:[.75,.056,.818,{ic:.029}],38:[.716,.022,.767,{ic:.035}],39:[.694,-.379,.307,{ic:.07}],40:[.75,.25,.409,{ic:.108}],41:[.75,.25,.409],42:[.75,-.32,.511,{ic:.073}],43:[.557,.057,.767],44:[.121,.194,.307],45:[.251,-.18,.358],46:[.121,0,.307],47:[.716,.215,.778],48:[.665,.021,.511,{ic:.051}],49:[.666,0,.511],50:[.666,.022,.511,{ic:.04}],51:[.666,.022,.511,{ic:.051}],52:[.666,.194,.511],53:[.666,.022,.511,{ic:.056}],54:[.665,.022,.511,{ic:.054}],55:[.666,.022,.511,{ic:.123}],56:[.666,.021,.511,{ic:.042}],57:[.666,.022,.511,{ic:.042}],58:[.431,0,.307],59:[.431,.194,.307],61:[.367,-.133,.767],63:[.716,0,.511,{ic:.04}],64:[.705,.011,.767,{ic:.022}],91:[.75,.25,.307,{ic:.139}],93:[.75,.25,.307,{ic:.052}],94:[.694,-.527,.511,{ic:.017}],95:[-.025,.062,.511,{ic:.043}],126:[.318,-.208,.511,{ic:.06}],305:[.441,.01,.307,{ic:.033}],567:[.442,.204,.332],768:[.697,-.5,0],769:[.697,-.5,0,{ic:.039}],770:[.694,-.527,0,{ic:.017}],771:[.668,-.558,0,{ic:.06}],772:[.589,-.544,0,{ic:.054}],774:[.694,-.515,0,{ic:.062}],775:[.669,-.548,0],776:[.669,-.554,0,{ic:.045}],778:[.716,-.542,0],779:[.697,-.503,0,{ic:.065}],780:[.638,-.502,0,{ic:.029}],989:[.605,.085,.778],8211:[.285,-.248,.511,{ic:.043}],8212:[.285,-.248,1.022,{ic:.016}],8213:[.285,-.248,1.022,{ic:.016}],8215:[-.025,.062,.511,{ic:.043}],8216:[.694,-.379,.307,{ic:.055}],8217:[.694,-.379,.307,{ic:.07}],8220:[.694,-.379,.514,{ic:.092}],8221:[.694,-.379,.514,{ic:.024}],8260:[.716,.215,.778],8463:[.695,.013,.54,{ic:.022}],8710:[.716,0,.833,{sk:.167}],10744:[.716,.215,.778]}},2827:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.largeop=void 0,T.largeop={40:[1.15,.649,.597],41:[1.15,.649,.597],47:[1.15,.649,.811],91:[1.15,.649,.472],92:[1.15,.649,.811],93:[1.15,.649,.472],123:[1.15,.649,.667],125:[1.15,.649,.667],710:[.772,-.565,1],732:[.75,-.611,1],770:[.772,-.565,0],771:[.75,-.611,0],8214:[.602,0,.778],8260:[1.15,.649,.811],8593:[.6,0,.667],8595:[.6,0,.667],8657:[.599,0,.778],8659:[.6,0,.778],8719:[.95,.45,1.278],8720:[.95,.45,1.278],8721:[.95,.45,1.444],8730:[1.15,.65,1,{ic:.02}],8739:[.627,.015,.333],8741:[.627,.015,.556],8747:[1.36,.862,.556,{ic:.388}],8748:[1.36,.862,1.084,{ic:.388}],8749:[1.36,.862,1.592,{ic:.388}],8750:[1.36,.862,.556,{ic:.388}],8896:[.95,.45,1.111],8897:[.95,.45,1.111],8898:[.949,.45,1.111],8899:[.95,.449,1.111],8968:[1.15,.649,.528],8969:[1.15,.649,.528],8970:[1.15,.649,.528],8971:[1.15,.649,.528],9001:[1.15,.649,.611],9002:[1.15,.649,.611],9168:[.602,0,.667],10072:[.627,.015,.333],10216:[1.15,.649,.611],10217:[1.15,.649,.611],10752:[.949,.449,1.511],10753:[.949,.449,1.511],10754:[.949,.449,1.511],10756:[.95,.449,1.111],10758:[.95,.45,1.111],10764:[1.36,.862,2.168,{ic:.388}],12296:[1.15,.649,.611],12297:[1.15,.649,.611]}},2970:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.monospace=void 0,T.monospace={32:[0,0,.525],33:[.622,0,.525],34:[.623,-.333,.525],35:[.611,0,.525],36:[.694,.082,.525],37:[.694,.083,.525],38:[.622,.011,.525],39:[.611,-.287,.525],40:[.694,.082,.525],41:[.694,.082,.525],42:[.52,-.09,.525],43:[.531,-.081,.525],44:[.14,.139,.525],45:[.341,-.271,.525],46:[.14,0,.525],47:[.694,.083,.525],58:[.431,0,.525],59:[.431,.139,.525],60:[.557,-.055,.525],61:[.417,-.195,.525],62:[.557,-.055,.525],63:[.617,0,.525],64:[.617,.006,.525],91:[.694,.082,.525],92:[.694,.083,.525],93:[.694,.082,.525],94:[.611,-.46,.525],95:[-.025,.095,.525],96:[.681,-.357,.525],123:[.694,.083,.525],124:[.694,.082,.525],125:[.694,.083,.525],126:[.611,-.466,.525],127:[.612,-.519,.525],160:[0,0,.525],305:[.431,0,.525],567:[.431,.228,.525],697:[.623,-.334,.525],768:[.611,-.485,0],769:[.611,-.485,0],770:[.611,-.46,0],771:[.611,-.466,0],772:[.577,-.5,0],774:[.611,-.504,0],776:[.612,-.519,0],778:[.619,-.499,0],780:[.577,-.449,0],913:[.623,0,.525],914:[.611,0,.525],915:[.611,0,.525],916:[.623,0,.525],917:[.611,0,.525],918:[.611,0,.525],919:[.611,0,.525],920:[.621,.01,.525],921:[.611,0,.525],922:[.611,0,.525],923:[.623,0,.525],924:[.611,0,.525],925:[.611,0,.525],926:[.611,0,.525],927:[.621,.01,.525],928:[.611,0,.525],929:[.611,0,.525],931:[.611,0,.525],932:[.611,0,.525],933:[.622,0,.525],934:[.611,0,.525],935:[.611,0,.525],936:[.611,0,.525],937:[.622,0,.525],8215:[-.025,.095,.525],8242:[.623,-.334,.525],8243:[.623,0,1.05],8244:[.623,0,1.575],8260:[.694,.083,.525],8279:[.623,0,2.1],8710:[.623,0,.525]}},1668:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.normal=void 0,T.normal={32:[0,0,.25],33:[.716,0,.278],34:[.694,-.379,.5],35:[.694,.194,.833],36:[.75,.056,.5],37:[.75,.056,.833],38:[.716,.022,.778],39:[.694,-.379,.278],40:[.75,.25,.389],41:[.75,.25,.389],42:[.75,-.32,.5],43:[.583,.082,.778],44:[.121,.194,.278],45:[.252,-.179,.333],46:[.12,0,.278],47:[.75,.25,.5],48:[.666,.022,.5],49:[.666,0,.5],50:[.666,0,.5],51:[.665,.022,.5],52:[.677,0,.5],53:[.666,.022,.5],54:[.666,.022,.5],55:[.676,.022,.5],56:[.666,.022,.5],57:[.666,.022,.5],58:[.43,0,.278],59:[.43,.194,.278],60:[.54,.04,.778],61:[.583,.082,.778],62:[.54,.04,.778],63:[.705,0,.472],64:[.705,.011,.778],65:[.716,0,.75],66:[.683,0,.708],67:[.705,.021,.722],68:[.683,0,.764],69:[.68,0,.681],70:[.68,0,.653],71:[.705,.022,.785],72:[.683,0,.75],73:[.683,0,.361],74:[.683,.022,.514],75:[.683,0,.778],76:[.683,0,.625],77:[.683,0,.917],78:[.683,0,.75],79:[.705,.022,.778],80:[.683,0,.681],81:[.705,.193,.778],82:[.683,.022,.736],83:[.705,.022,.556],84:[.677,0,.722],85:[.683,.022,.75],86:[.683,.022,.75],87:[.683,.022,1.028],88:[.683,0,.75],89:[.683,0,.75],90:[.683,0,.611],91:[.75,.25,.278],92:[.75,.25,.5],93:[.75,.25,.278],94:[.694,-.531,.5],95:[-.025,.062,.5],96:[.699,-.505,.5],97:[.448,.011,.5],98:[.694,.011,.556],99:[.448,.011,.444],100:[.694,.011,.556],101:[.448,.011,.444],102:[.705,0,.306,{ic:.066}],103:[.453,.206,.5],104:[.694,0,.556],105:[.669,0,.278],106:[.669,.205,.306],107:[.694,0,.528],108:[.694,0,.278],109:[.442,0,.833],110:[.442,0,.556],111:[.448,.01,.5],112:[.442,.194,.556],113:[.442,.194,.528],114:[.442,0,.392],115:[.448,.011,.394],116:[.615,.01,.389],117:[.442,.011,.556],118:[.431,.011,.528],119:[.431,.011,.722],120:[.431,0,.528],121:[.431,.204,.528],122:[.431,0,.444],123:[.75,.25,.5],124:[.75,.249,.278],125:[.75,.25,.5],126:[.318,-.215,.5],160:[0,0,.25],163:[.714,.011,.769],165:[.683,0,.75],168:[.669,-.554,.5],172:[.356,-.089,.667],174:[.709,.175,.947],175:[.59,-.544,.5],176:[.715,-.542,.5],177:[.666,0,.778],180:[.699,-.505,.5],183:[.31,-.19,.278],215:[.491,-.009,.778],240:[.749,.021,.556],247:[.537,.036,.778],305:[.442,0,.278,{sk:.0278}],567:[.442,.205,.306,{sk:.0833}],697:[.56,-.043,.275],710:[.694,-.531,.5],711:[.644,-.513,.5],713:[.59,-.544,.5],714:[.699,-.505,.5],715:[.699,-.505,.5],728:[.694,-.515,.5],729:[.669,-.549,.5],730:[.715,-.542,.5],732:[.668,-.565,.5],768:[.699,-.505,0],769:[.699,-.505,0],770:[.694,-.531,0],771:[.668,-.565,0],772:[.59,-.544,0],774:[.694,-.515,0],775:[.669,-.549,0],776:[.669,-.554,0],778:[.715,-.542,0],779:[.701,-.51,0],780:[.644,-.513,0],824:[.716,.215,0],913:[.716,0,.75],914:[.683,0,.708],915:[.68,0,.625],916:[.716,0,.833],917:[.68,0,.681],918:[.683,0,.611],919:[.683,0,.75],920:[.705,.022,.778],921:[.683,0,.361],922:[.683,0,.778],923:[.716,0,.694],924:[.683,0,.917],925:[.683,0,.75],926:[.677,0,.667],927:[.705,.022,.778],928:[.68,0,.75],929:[.683,0,.681],931:[.683,0,.722],932:[.677,0,.722],933:[.705,0,.778],934:[.683,0,.722],935:[.683,0,.75],936:[.683,0,.778],937:[.704,0,.722],8192:[0,0,.5],8193:[0,0,1],8194:[0,0,.5],8195:[0,0,1],8196:[0,0,.333],8197:[0,0,.25],8198:[0,0,.167],8201:[0,0,.167],8202:[0,0,.1],8203:[0,0,0],8204:[0,0,0],8211:[.285,-.248,.5],8212:[.285,-.248,1],8213:[.285,-.248,1],8214:[.75,.25,.5],8215:[-.025,.062,.5],8216:[.694,-.379,.278],8217:[.694,-.379,.278],8220:[.694,-.379,.5],8221:[.694,-.379,.5],8224:[.705,.216,.444],8225:[.705,.205,.444],8226:[.444,-.055,.5],8230:[.12,0,1.172],8242:[.56,-.043,.275],8243:[.56,0,.55],8244:[.56,0,.825],8245:[.56,-.043,.275],8246:[.56,0,.55],8247:[.56,0,.825],8254:[.59,-.544,.5],8260:[.75,.25,.5],8279:[.56,0,1.1],8288:[0,0,0],8289:[0,0,0],8290:[0,0,0],8291:[0,0,0],8292:[0,0,0],8407:[.714,-.516,.5],8450:[.702,.019,.722],8459:[.717,.036,.969,{ic:.272,sk:.333}],8460:[.666,.133,.72],8461:[.683,0,.778],8462:[.694,.011,.576,{sk:-.0278}],8463:[.695,.013,.54,{ic:.022}],8464:[.717,.017,.809,{ic:.137,sk:.333}],8465:[.686,.026,.554],8466:[.717,.017,.874,{ic:.161,sk:.306}],8467:[.705,.02,.417,{sk:.111}],8469:[.683,.02,.722],8472:[.453,.216,.636,{sk:.111}],8473:[.683,0,.611],8474:[.701,.181,.778],8475:[.717,.017,.85,{ic:.037,sk:.194}],8476:[.686,.026,.828],8477:[.683,0,.722],8484:[.683,0,.667],8486:[.704,0,.722],8487:[.684,.022,.722],8488:[.729,.139,.602],8492:[.708,.028,.908,{ic:.02,sk:.194}],8493:[.685,.024,.613],8496:[.707,.008,.562,{ic:.156,sk:.139}],8497:[.735,.036,.895,{ic:.095,sk:.222}],8498:[.695,0,.556],8499:[.721,.05,1.08,{ic:.136,sk:.444}],8501:[.694,0,.611],8502:[.763,.021,.667,{ic:.02}],8503:[.764,.043,.444],8504:[.764,.043,.667],8513:[.705,.023,.639],8592:[.511,.011,1],8593:[.694,.193,.5],8594:[.511,.011,1],8595:[.694,.194,.5],8596:[.511,.011,1],8597:[.772,.272,.5],8598:[.72,.195,1],8599:[.72,.195,1],8600:[.695,.22,1],8601:[.695,.22,1],8602:[.437,-.06,1],8603:[.437,-.06,1],8606:[.417,-.083,1],8608:[.417,-.083,1],8610:[.417,-.083,1.111],8611:[.417,-.083,1.111],8614:[.511,.011,1],8617:[.511,.011,1.126],8618:[.511,.011,1.126],8619:[.575,.041,1],8620:[.575,.041,1],8621:[.417,-.083,1.389],8622:[.437,-.06,1],8624:[.722,0,.5],8625:[.722,0,.5],8630:[.461,0,1],8631:[.46,0,1],8634:[.65,.083,.778],8635:[.65,.083,.778],8636:[.511,-.23,1],8637:[.27,.011,1],8638:[.694,.194,.417],8639:[.694,.194,.417],8640:[.511,-.23,1],8641:[.27,.011,1],8642:[.694,.194,.417],8643:[.694,.194,.417],8644:[.667,0,1],8646:[.667,0,1],8647:[.583,.083,1],8648:[.694,.193,.833],8649:[.583,.083,1],8650:[.694,.194,.833],8651:[.514,.014,1],8652:[.671,.011,1],8653:[.534,.035,1],8654:[.534,.037,1],8655:[.534,.035,1],8656:[.525,.024,1],8657:[.694,.194,.611],8658:[.525,.024,1],8659:[.694,.194,.611],8660:[.526,.025,1],8661:[.772,.272,.611],8666:[.611,.111,1],8667:[.611,.111,1],8669:[.417,-.083,1],8672:[.437,-.064,1.334],8674:[.437,-.064,1.334],8704:[.694,.022,.556],8705:[.846,.021,.5],8706:[.715,.022,.531,{ic:.035,sk:.0833}],8707:[.694,0,.556],8708:[.716,.215,.556],8709:[.772,.078,.5],8710:[.716,0,.833],8711:[.683,.033,.833],8712:[.54,.04,.667],8713:[.716,.215,.667],8715:[.54,.04,.667],8716:[.716,.215,.667],8717:[.44,0,.429,{ic:.027}],8719:[.75,.25,.944],8720:[.75,.25,.944],8721:[.75,.25,1.056],8722:[.583,.082,.778],8723:[.5,.166,.778],8724:[.766,.093,.778],8725:[.75,.25,.5],8726:[.75,.25,.5],8727:[.465,-.035,.5],8728:[.444,-.055,.5],8729:[.444,-.055,.5],8730:[.8,.2,.833,{ic:.02}],8733:[.442,.011,.778],8734:[.442,.011,1],8736:[.694,0,.722],8737:[.714,.02,.722],8738:[.551,.051,.722],8739:[.75,.249,.278],8740:[.75,.252,.278,{ic:.019}],8741:[.75,.25,.5],8742:[.75,.25,.5,{ic:.018}],8743:[.598,.022,.667],8744:[.598,.022,.667],8745:[.598,.022,.667],8746:[.598,.022,.667],8747:[.716,.216,.417,{ic:.055}],8748:[.805,.306,.819,{ic:.138}],8749:[.805,.306,1.166,{ic:.138}],8750:[.805,.306,.472,{ic:.138}],8756:[.471,.082,.667],8757:[.471,.082,.667],8764:[.367,-.133,.778],8765:[.367,-.133,.778],8768:[.583,.083,.278],8769:[.467,-.032,.778],8770:[.463,-.034,.778],8771:[.464,-.036,.778],8772:[.716,.215,.778],8773:[.589,-.022,.778],8775:[.652,.155,.778],8776:[.483,-.055,.778],8777:[.716,.215,.778],8778:[.579,.039,.778],8781:[.484,-.016,.778],8782:[.492,-.008,.778],8783:[.492,-.133,.778],8784:[.67,-.133,.778],8785:[.609,.108,.778],8786:[.601,.101,.778],8787:[.601,.102,.778],8790:[.367,-.133,.778],8791:[.721,-.133,.778],8796:[.859,-.133,.778],8800:[.716,.215,.778],8801:[.464,-.036,.778],8802:[.716,.215,.778],8804:[.636,.138,.778],8805:[.636,.138,.778],8806:[.753,.175,.778],8807:[.753,.175,.778],8808:[.752,.286,.778],8809:[.752,.286,.778],8810:[.568,.067,1],8811:[.567,.067,1],8812:[.75,.25,.5],8813:[.716,.215,.778],8814:[.708,.209,.778],8815:[.708,.209,.778],8816:[.801,.303,.778],8817:[.801,.303,.778],8818:[.732,.228,.778],8819:[.732,.228,.778],8820:[.732,.228,.778],8821:[.732,.228,.778],8822:[.681,.253,.778],8823:[.681,.253,.778],8824:[.716,.253,.778],8825:[.716,.253,.778],8826:[.539,.041,.778],8827:[.539,.041,.778],8828:[.58,.153,.778],8829:[.58,.154,.778],8830:[.732,.228,.778],8831:[.732,.228,.778],8832:[.705,.208,.778],8833:[.705,.208,.778],8834:[.54,.04,.778],8835:[.54,.04,.778],8836:[.716,.215,.778],8837:[.716,.215,.778],8838:[.636,.138,.778],8839:[.636,.138,.778],8840:[.801,.303,.778],8841:[.801,.303,.778],8842:[.635,.241,.778],8843:[.635,.241,.778],8846:[.598,.022,.667],8847:[.539,.041,.778],8848:[.539,.041,.778],8849:[.636,.138,.778],8850:[.636,.138,.778],8851:[.598,0,.667],8852:[.598,0,.667],8853:[.583,.083,.778],8854:[.583,.083,.778],8855:[.583,.083,.778],8856:[.583,.083,.778],8857:[.583,.083,.778],8858:[.582,.082,.778],8859:[.582,.082,.778],8861:[.582,.082,.778],8862:[.689,0,.778],8863:[.689,0,.778],8864:[.689,0,.778],8865:[.689,0,.778],8866:[.694,0,.611],8867:[.694,0,.611],8868:[.668,0,.778],8869:[.668,0,.778],8872:[.75,.249,.867],8873:[.694,0,.722],8874:[.694,0,.889],8876:[.695,0,.611],8877:[.695,0,.611],8878:[.695,0,.722],8879:[.695,0,.722],8882:[.539,.041,.778],8883:[.539,.041,.778],8884:[.636,.138,.778],8885:[.636,.138,.778],8888:[.408,-.092,1.111],8890:[.431,.212,.556],8891:[.716,0,.611],8892:[.716,0,.611],8896:[.75,.249,.833],8897:[.75,.249,.833],8898:[.75,.249,.833],8899:[.75,.249,.833],8900:[.488,-.012,.5],8901:[.31,-.19,.278],8902:[.486,-.016,.5],8903:[.545,.044,.778],8904:[.505,.005,.9],8905:[.492,-.008,.778],8906:[.492,-.008,.778],8907:[.694,.022,.778],8908:[.694,.022,.778],8909:[.464,-.036,.778],8910:[.578,.021,.76],8911:[.578,.022,.76],8912:[.54,.04,.778],8913:[.54,.04,.778],8914:[.598,.022,.667],8915:[.598,.022,.667],8916:[.736,.022,.667],8918:[.541,.041,.778],8919:[.541,.041,.778],8920:[.568,.067,1.333],8921:[.568,.067,1.333],8922:[.886,.386,.778],8923:[.886,.386,.778],8926:[.734,0,.778],8927:[.734,0,.778],8928:[.801,.303,.778],8929:[.801,.303,.778],8930:[.716,.215,.778],8931:[.716,.215,.778],8934:[.73,.359,.778],8935:[.73,.359,.778],8936:[.73,.359,.778],8937:[.73,.359,.778],8938:[.706,.208,.778],8939:[.706,.208,.778],8940:[.802,.303,.778],8941:[.801,.303,.778],8942:[1.3,.03,.278],8943:[.31,-.19,1.172],8945:[1.52,-.1,1.282],8965:[.716,0,.611],8966:[.813,.097,.611],8968:[.75,.25,.444],8969:[.75,.25,.444],8970:[.75,.25,.444],8971:[.75,.25,.444],8988:[.694,-.306,.5],8989:[.694,-.306,.5],8990:[.366,.022,.5],8991:[.366,.022,.5],8994:[.388,-.122,1],8995:[.378,-.134,1],9001:[.75,.25,.389],9002:[.75,.25,.389],9136:[.744,.244,.412],9137:[.744,.244,.412],9168:[.602,0,.667],9416:[.709,.175,.902],9484:[.694,-.306,.5],9488:[.694,-.306,.5],9492:[.366,.022,.5],9496:[.366,.022,.5],9585:[.694,.195,.889],9586:[.694,.195,.889],9632:[.689,0,.778],9633:[.689,0,.778],9642:[.689,0,.778],9650:[.575,.02,.722],9651:[.716,0,.889],9652:[.575,.02,.722],9653:[.716,0,.889],9654:[.539,.041,.778],9656:[.539,.041,.778],9657:[.505,.005,.5],9660:[.576,.019,.722],9661:[.5,.215,.889],9662:[.576,.019,.722],9663:[.5,.215,.889],9664:[.539,.041,.778],9666:[.539,.041,.778],9667:[.505,.005,.5],9674:[.716,.132,.667],9711:[.715,.215,1],9723:[.689,0,.778],9724:[.689,0,.778],9733:[.694,.111,.944],9824:[.727,.13,.778],9825:[.716,.033,.778],9826:[.727,.162,.778],9827:[.726,.13,.778],9837:[.75,.022,.389],9838:[.734,.223,.389],9839:[.723,.223,.389],10003:[.706,.034,.833],10016:[.716,.022,.833],10072:[.75,.249,.278],10216:[.75,.25,.389],10217:[.75,.25,.389],10222:[.744,.244,.412],10223:[.744,.244,.412],10229:[.511,.011,1.609],10230:[.511,.011,1.638],10231:[.511,.011,1.859],10232:[.525,.024,1.609],10233:[.525,.024,1.638],10234:[.525,.024,1.858],10236:[.511,.011,1.638],10731:[.716,.132,.667],10744:[.716,.215,.778],10752:[.75,.25,1.111],10753:[.75,.25,1.111],10754:[.75,.25,1.111],10756:[.75,.249,.833],10758:[.75,.249,.833],10764:[.805,.306,1.638,{ic:.138}],10799:[.491,-.009,.778],10815:[.683,0,.75],10846:[.813,.097,.611],10877:[.636,.138,.778],10878:[.636,.138,.778],10885:[.762,.29,.778],10886:[.762,.29,.778],10887:[.635,.241,.778],10888:[.635,.241,.778],10889:[.761,.387,.778],10890:[.761,.387,.778],10891:[1.003,.463,.778],10892:[1.003,.463,.778],10901:[.636,.138,.778],10902:[.636,.138,.778],10927:[.636,.138,.778],10928:[.636,.138,.778],10933:[.752,.286,.778],10934:[.752,.286,.778],10935:[.761,.294,.778],10936:[.761,.294,.778],10937:[.761,.337,.778],10938:[.761,.337,.778],10949:[.753,.215,.778],10950:[.753,.215,.778],10955:[.783,.385,.778],10956:[.783,.385,.778],12296:[.75,.25,.389],12297:[.75,.25,.389],57350:[.43,.023,.222,{ic:.018}],57351:[.431,.024,.389,{ic:.018}],57352:[.605,.085,.778],57353:[.434,.006,.667,{ic:.067}],57356:[.752,.284,.778],57357:[.752,.284,.778],57358:[.919,.421,.778],57359:[.801,.303,.778],57360:[.801,.303,.778],57361:[.919,.421,.778],57366:[.828,.33,.778],57367:[.752,.332,.778],57368:[.828,.33,.778],57369:[.752,.333,.778],57370:[.634,.255,.778],57371:[.634,.254,.778],119808:[.698,0,.869],119809:[.686,0,.818],119810:[.697,.011,.831],119811:[.686,0,.882],119812:[.68,0,.756],119813:[.68,0,.724],119814:[.697,.01,.904],119815:[.686,0,.9],119816:[.686,0,.436],119817:[.686,.011,.594],119818:[.686,0,.901],119819:[.686,0,.692],119820:[.686,0,1.092],119821:[.686,0,.9],119822:[.696,.01,.864],119823:[.686,0,.786],119824:[.696,.193,.864],119825:[.686,.011,.862],119826:[.697,.011,.639],119827:[.675,0,.8],119828:[.686,.011,.885],119829:[.686,.007,.869],119830:[.686,.007,1.189],119831:[.686,0,.869],119832:[.686,0,.869],119833:[.686,0,.703],119834:[.453,.006,.559],119835:[.694,.006,.639],119836:[.453,.006,.511],119837:[.694,.006,.639],119838:[.452,.006,.527],119839:[.7,0,.351,{ic:.101}],119840:[.455,.201,.575],119841:[.694,0,.639],119842:[.695,0,.319],119843:[.695,.2,.351],119844:[.694,0,.607],119845:[.694,0,.319],119846:[.45,0,.958],119847:[.45,0,.639],119848:[.452,.005,.575],119849:[.45,.194,.639],119850:[.45,.194,.607],119851:[.45,0,.474],119852:[.453,.006,.454],119853:[.635,.005,.447],119854:[.45,.006,.639],119855:[.444,0,.607],119856:[.444,0,.831],119857:[.444,0,.607],119858:[.444,.2,.607],119859:[.444,0,.511],119860:[.716,0,.75,{sk:.139}],119861:[.683,0,.759,{sk:.0833}],119862:[.705,.022,.715,{ic:.045,sk:.0833}],119863:[.683,0,.828,{sk:.0556}],119864:[.68,0,.738,{ic:.026,sk:.0833}],119865:[.68,0,.643,{ic:.106,sk:.0833}],119866:[.705,.022,.786,{sk:.0833}],119867:[.683,0,.831,{ic:.057,sk:.0556}],119868:[.683,0,.44,{ic:.064,sk:.111}],119869:[.683,.022,.555,{ic:.078,sk:.167}],119870:[.683,0,.849,{ic:.04,sk:.0556}],119871:[.683,0,.681,{sk:.0278}],119872:[.683,0,.97,{ic:.081,sk:.0833}],119873:[.683,0,.803,{ic:.085,sk:.0833}],119874:[.704,.022,.763,{sk:.0833}],119875:[.683,0,.642,{ic:.109,sk:.0833}],119876:[.704,.194,.791,{sk:.0833}],119877:[.683,.021,.759,{sk:.0833}],119878:[.705,.022,.613,{ic:.032,sk:.0833}],119879:[.677,0,.584,{ic:.12,sk:.0833}],119880:[.683,.022,.683,{ic:.084,sk:.0278}],119881:[.683,.022,.583,{ic:.186}],119882:[.683,.022,.944,{ic:.104}],119883:[.683,0,.828,{ic:.024,sk:.0833}],119884:[.683,0,.581,{ic:.182}],119885:[.683,0,.683,{ic:.04,sk:.0833}],119886:[.441,.01,.529],119887:[.694,.011,.429],119888:[.442,.011,.433,{sk:.0556}],119889:[.694,.01,.52,{sk:.167}],119890:[.442,.011,.466,{sk:.0556}],119891:[.705,.205,.49,{ic:.06,sk:.167}],119892:[.442,.205,.477,{sk:.0278}],119894:[.661,.011,.345],119895:[.661,.204,.412],119896:[.694,.011,.521],119897:[.694,.011,.298,{sk:.0833}],119898:[.442,.011,.878],119899:[.442,.011,.6],119900:[.441,.011,.485,{sk:.0556}],119901:[.442,.194,.503,{sk:.0833}],119902:[.442,.194,.446,{ic:.014,sk:.0833}],119903:[.442,.011,.451,{sk:.0556}],119904:[.442,.01,.469,{sk:.0556}],119905:[.626,.011,.361,{sk:.0833}],119906:[.442,.011,.572,{sk:.0278}],119907:[.443,.011,.485,{sk:.0278}],119908:[.443,.011,.716,{sk:.0833}],119909:[.442,.011,.572,{sk:.0278}],119910:[.442,.205,.49,{sk:.0556}],119911:[.442,.011,.465,{sk:.0556}],119912:[.711,0,.869,{sk:.16}],119913:[.686,0,.866,{sk:.0958}],119914:[.703,.017,.817,{ic:.038,sk:.0958}],119915:[.686,0,.938,{sk:.0639}],119916:[.68,0,.81,{ic:.015,sk:.0958}],119917:[.68,0,.689,{ic:.12,sk:.0958}],119918:[.703,.016,.887,{sk:.0958}],119919:[.686,0,.982,{ic:.045,sk:.0639}],119920:[.686,0,.511,{ic:.062,sk:.128}],119921:[.686,.017,.631,{ic:.063,sk:.192}],119922:[.686,0,.971,{ic:.032,sk:.0639}],119923:[.686,0,.756,{sk:.0319}],119924:[.686,0,1.142,{ic:.077,sk:.0958}],119925:[.686,0,.95,{ic:.077,sk:.0958}],119926:[.703,.017,.837,{sk:.0958}],119927:[.686,0,.723,{ic:.124,sk:.0958}],119928:[.703,.194,.869,{sk:.0958}],119929:[.686,.017,.872,{sk:.0958}],119930:[.703,.017,.693,{ic:.021,sk:.0958}],119931:[.675,0,.637,{ic:.135,sk:.0958}],119932:[.686,.016,.8,{ic:.077,sk:.0319}],119933:[.686,.016,.678,{ic:.208}],119934:[.686,.017,1.093,{ic:.114}],119935:[.686,0,.947,{sk:.0958}],119936:[.686,0,.675,{ic:.201}],119937:[.686,0,.773,{ic:.032,sk:.0958}],119938:[.452,.008,.633],119939:[.694,.008,.521],119940:[.451,.008,.513,{sk:.0639}],119941:[.694,.008,.61,{sk:.192}],119942:[.452,.008,.554,{sk:.0639}],119943:[.701,.201,.568,{ic:.056,sk:.192}],119944:[.452,.202,.545,{sk:.0319}],119945:[.694,.008,.668,{sk:-.0319}],119946:[.694,.008,.405],119947:[.694,.202,.471],119948:[.694,.008,.604],119949:[.694,.008,.348,{sk:.0958}],119950:[.452,.008,1.032],119951:[.452,.008,.713],119952:[.452,.008,.585,{sk:.0639}],119953:[.452,.194,.601,{sk:.0958}],119954:[.452,.194,.542,{sk:.0958}],119955:[.452,.008,.529,{sk:.0639}],119956:[.451,.008,.531,{sk:.0639}],119957:[.643,.007,.415,{sk:.0958}],119958:[.452,.008,.681,{sk:.0319}],119959:[.453,.008,.567,{sk:.0319}],119960:[.453,.008,.831,{sk:.0958}],119961:[.452,.008,.659,{sk:.0319}],119962:[.452,.202,.59,{sk:.0639}],119963:[.452,.008,.555,{sk:.0639}],119964:[.717,.008,.803,{ic:.213,sk:.389}],119966:[.728,.026,.666,{ic:.153,sk:.278}],119967:[.708,.031,.774,{ic:.081,sk:.111}],119970:[.717,.037,.61,{ic:.128,sk:.25}],119973:[.717,.314,1.052,{ic:.081,sk:.417}],119974:[.717,.037,.914,{ic:.29,sk:.361}],119977:[.726,.036,.902,{ic:.306,sk:.389}],119978:[.707,.008,.738,{ic:.067,sk:.167}],119979:[.716,.037,1.013,{ic:.018,sk:.222}],119980:[.717,.017,.883,{sk:.278}],119982:[.708,.036,.868,{ic:.148,sk:.333}],119983:[.735,.037,.747,{ic:.249,sk:.222}],119984:[.717,.017,.8,{ic:.16,sk:.25}],119985:[.717,.017,.622,{ic:.228,sk:.222}],119986:[.717,.017,.805,{ic:.221,sk:.25}],119987:[.717,.017,.944,{ic:.187,sk:.278}],119988:[.716,.017,.71,{ic:.249,sk:.194}],119989:[.717,.016,.821,{ic:.211,sk:.306}],120068:[.696,.026,.718],120069:[.691,.027,.884],120071:[.685,.027,.832],120072:[.685,.024,.663],120073:[.686,.153,.611],120074:[.69,.026,.785],120077:[.686,.139,.552],120078:[.68,.027,.668,{ic:.014}],120079:[.686,.026,.666],120080:[.692,.027,1.05],120081:[.686,.025,.832],120082:[.729,.027,.827],120083:[.692,.218,.828],120084:[.729,.069,.827],120086:[.692,.027,.829],120087:[.701,.027,.669],120088:[.697,.027,.646,{ic:.019}],120089:[.686,.026,.831],120090:[.686,.027,1.046],120091:[.688,.027,.719],120092:[.686,.218,.833],120094:[.47,.035,.5],120095:[.685,.031,.513],120096:[.466,.029,.389],120097:[.609,.033,.499],120098:[.467,.03,.401],120099:[.681,.221,.326],120100:[.47,.209,.504],120101:[.688,.205,.521],120102:[.673,.02,.279],120103:[.672,.208,.281],120104:[.689,.025,.389],120105:[.685,.02,.28],120106:[.475,.026,.767],120107:[.475,.022,.527],120108:[.48,.028,.489],120109:[.541,.212,.5],120110:[.479,.219,.489],120111:[.474,.021,.389],120112:[.478,.029,.443],120113:[.64,.02,.333,{ic:.015}],120114:[.474,.023,.517],120115:[.53,.028,.512],120116:[.532,.028,.774],120117:[.472,.188,.389],120118:[.528,.218,.499],120119:[.471,.214,.391],120120:[.701,0,.722],120121:[.683,0,.667],120123:[.683,0,.722],120124:[.683,0,.667],120125:[.683,0,.611],120126:[.702,.019,.778],120128:[.683,0,.389],120129:[.683,.077,.5],120130:[.683,0,.778],120131:[.683,0,.667],120132:[.683,0,.944],120134:[.701,.019,.778],120138:[.702,.012,.556],120139:[.683,0,.667],120140:[.683,.019,.722],120141:[.683,.02,.722],120142:[.683,.019,1],120143:[.683,0,.722],120144:[.683,0,.722],120172:[.686,.031,.847],120173:[.684,.031,1.044],120174:[.676,.032,.723],120175:[.683,.029,.982],120176:[.686,.029,.783],120177:[.684,.146,.722],120178:[.687,.029,.927],120179:[.683,.126,.851],120180:[.681,.025,.655],120181:[.68,.141,.652],120182:[.681,.026,.789,{ic:.017}],120183:[.683,.028,.786],120184:[.683,.032,1.239],120185:[.679,.03,.983],120186:[.726,.03,.976],120187:[.688,.223,.977],120188:[.726,.083,.976],120189:[.688,.028,.978],120190:[.685,.031,.978],120191:[.686,.03,.79,{ic:.012}],120192:[.688,.039,.851,{ic:.02}],120193:[.685,.029,.982],120194:[.683,.03,1.235],120195:[.681,.035,.849],120196:[.688,.214,.984],120197:[.677,.148,.711],120198:[.472,.032,.603],120199:[.69,.032,.59],120200:[.473,.026,.464],120201:[.632,.028,.589],120202:[.471,.027,.472],120203:[.687,.222,.388],120204:[.472,.208,.595],120205:[.687,.207,.615],120206:[.686,.025,.331],120207:[.682,.203,.332],120208:[.682,.025,.464],120209:[.681,.024,.337],120210:[.476,.031,.921],120211:[.473,.028,.654],120212:[.482,.034,.609],120213:[.557,.207,.604],120214:[.485,.211,.596],120215:[.472,.026,.46],120216:[.479,.034,.523],120217:[.648,.027,.393,{ic:.014}],120218:[.472,.032,.589,{ic:.014}],120219:[.546,.027,.604],120220:[.549,.032,.918],120221:[.471,.188,.459],120222:[.557,.221,.589],120223:[.471,.214,.461],120224:[.694,0,.667],120225:[.694,0,.667],120226:[.705,.011,.639],120227:[.694,0,.722],120228:[.691,0,.597],120229:[.691,0,.569],120230:[.704,.011,.667],120231:[.694,0,.708],120232:[.694,0,.278],120233:[.694,.022,.472],120234:[.694,0,.694],120235:[.694,0,.542],120236:[.694,0,.875],120237:[.694,0,.708],120238:[.715,.022,.736],120239:[.694,0,.639],120240:[.715,.125,.736],120241:[.694,0,.646],120242:[.716,.022,.556],120243:[.688,0,.681],120244:[.694,.022,.688],120245:[.694,0,.667],120246:[.694,0,.944],120247:[.694,0,.667],120248:[.694,0,.667],120249:[.694,0,.611],120250:[.46,.01,.481],120251:[.694,.011,.517],120252:[.46,.01,.444],120253:[.694,.01,.517],120254:[.461,.01,.444],120255:[.705,0,.306,{ic:.041}],120256:[.455,.206,.5],120257:[.694,0,.517],120258:[.68,0,.239],120259:[.68,.205,.267],120260:[.694,0,.489],120261:[.694,0,.239],120262:[.455,0,.794],120263:[.455,0,.517],120264:[.46,.01,.5],120265:[.455,.194,.517],120266:[.455,.194,.517],120267:[.455,0,.342],120268:[.46,.01,.383],120269:[.571,.01,.361],120270:[.444,.01,.517],120271:[.444,0,.461],120272:[.444,0,.683],120273:[.444,0,.461],120274:[.444,.204,.461],120275:[.444,0,.435],120276:[.694,0,.733],120277:[.694,0,.733],120278:[.704,.011,.703],120279:[.694,0,.794],120280:[.691,0,.642],120281:[.691,0,.611],120282:[.705,.011,.733],120283:[.694,0,.794],120284:[.694,0,.331],120285:[.694,.022,.519],120286:[.694,0,.764],120287:[.694,0,.581],120288:[.694,0,.978],120289:[.694,0,.794],120290:[.716,.022,.794],120291:[.694,0,.703],120292:[.716,.106,.794],120293:[.694,0,.703],120294:[.716,.022,.611],120295:[.688,0,.733],120296:[.694,.022,.764],120297:[.694,0,.733],120298:[.694,0,1.039],120299:[.694,0,.733],120300:[.694,0,.733],120301:[.694,0,.672],120302:[.475,.011,.525],120303:[.694,.01,.561],120304:[.475,.011,.489],120305:[.694,.011,.561],120306:[.474,.01,.511],120307:[.705,0,.336,{ic:.045}],120308:[.469,.206,.55],120309:[.694,0,.561],120310:[.695,0,.256],120311:[.695,.205,.286],120312:[.694,0,.531],120313:[.694,0,.256],120314:[.469,0,.867],120315:[.468,0,.561],120316:[.474,.011,.55],120317:[.469,.194,.561],120318:[.469,.194,.561],120319:[.469,0,.372],120320:[.474,.01,.422],120321:[.589,.01,.404],120322:[.458,.011,.561],120323:[.458,0,.5],120324:[.458,0,.744],120325:[.458,0,.5],120326:[.458,.205,.5],120327:[.458,0,.476],120328:[.694,0,.667],120329:[.694,0,.667,{ic:.029}],120330:[.705,.01,.639,{ic:.08}],120331:[.694,0,.722,{ic:.025}],120332:[.691,0,.597,{ic:.091}],120333:[.691,0,.569,{ic:.104}],120334:[.705,.011,.667,{ic:.063}],120335:[.694,0,.708,{ic:.06}],120336:[.694,0,.278,{ic:.06}],120337:[.694,.022,.472,{ic:.063}],120338:[.694,0,.694,{ic:.091}],120339:[.694,0,.542],120340:[.694,0,.875,{ic:.054}],120341:[.694,0,.708,{ic:.058}],120342:[.716,.022,.736,{ic:.027}],120343:[.694,0,.639,{ic:.051}],120344:[.716,.125,.736,{ic:.027}],120345:[.694,0,.646,{ic:.052}],120346:[.716,.022,.556,{ic:.053}],120347:[.688,0,.681,{ic:.109}],120348:[.694,.022,.688,{ic:.059}],120349:[.694,0,.667,{ic:.132}],120350:[.694,0,.944,{ic:.132}],120351:[.694,0,.667,{ic:.091}],120352:[.694,0,.667,{ic:.143}],120353:[.694,0,.611,{ic:.091}],120354:[.461,.01,.481],120355:[.694,.011,.517,{ic:.022}],120356:[.46,.011,.444,{ic:.055}],120357:[.694,.01,.517,{ic:.071}],120358:[.46,.011,.444,{ic:.028}],120359:[.705,0,.306,{ic:.188}],120360:[.455,.206,.5,{ic:.068}],120361:[.694,0,.517],120362:[.68,0,.239,{ic:.076}],120363:[.68,.204,.267,{ic:.069}],120364:[.694,0,.489,{ic:.054}],120365:[.694,0,.239,{ic:.072}],120366:[.455,0,.794],120367:[.454,0,.517],120368:[.461,.011,.5,{ic:.023}],120369:[.455,.194,.517,{ic:.021}],120370:[.455,.194,.517,{ic:.021}],120371:[.455,0,.342,{ic:.082}],120372:[.461,.011,.383,{ic:.053}],120373:[.571,.011,.361,{ic:.049}],120374:[.444,.01,.517,{ic:.02}],120375:[.444,0,.461,{ic:.079}],120376:[.444,0,.683,{ic:.079}],120377:[.444,0,.461,{ic:.076}],120378:[.444,.205,.461,{ic:.079}],120379:[.444,0,.435,{ic:.059}],120432:[.623,0,.525],120433:[.611,0,.525],120434:[.622,.011,.525],120435:[.611,0,.525],120436:[.611,0,.525],120437:[.611,0,.525],120438:[.622,.011,.525],120439:[.611,0,.525],120440:[.611,0,.525],120441:[.611,.011,.525],120442:[.611,0,.525],120443:[.611,0,.525],120444:[.611,0,.525],120445:[.611,0,.525],120446:[.621,.01,.525],120447:[.611,0,.525],120448:[.621,.138,.525],120449:[.611,.011,.525],120450:[.622,.011,.525],120451:[.611,0,.525],120452:[.611,.011,.525],120453:[.611,.007,.525],120454:[.611,.007,.525],120455:[.611,0,.525],120456:[.611,0,.525],120457:[.611,0,.525],120458:[.439,.006,.525],120459:[.611,.006,.525],120460:[.44,.006,.525],120461:[.611,.006,.525],120462:[.44,.006,.525],120463:[.617,0,.525],120464:[.442,.229,.525],120465:[.611,0,.525],120466:[.612,0,.525],120467:[.612,.228,.525],120468:[.611,0,.525],120469:[.611,0,.525],120470:[.436,0,.525,{ic:.011}],120471:[.436,0,.525],120472:[.44,.006,.525],120473:[.437,.221,.525],120474:[.437,.221,.525,{ic:.02}],120475:[.437,0,.525],120476:[.44,.006,.525],120477:[.554,.006,.525],120478:[.431,.005,.525],120479:[.431,0,.525],120480:[.431,0,.525],120481:[.431,0,.525],120482:[.431,.228,.525],120483:[.431,0,.525],120488:[.698,0,.869],120489:[.686,0,.818],120490:[.68,0,.692],120491:[.698,0,.958],120492:[.68,0,.756],120493:[.686,0,.703],120494:[.686,0,.9],120495:[.696,.01,.894],120496:[.686,0,.436],120497:[.686,0,.901],120498:[.698,0,.806],120499:[.686,0,1.092],120500:[.686,0,.9],120501:[.675,0,.767],120502:[.696,.01,.864],120503:[.68,0,.9],120504:[.686,0,.786],120506:[.686,0,.831],120507:[.675,0,.8],120508:[.697,0,.894],120509:[.686,0,.831],120510:[.686,0,.869],120511:[.686,0,.894],120512:[.696,0,.831],120513:[.686,.024,.958],120546:[.716,0,.75,{sk:.139}],120547:[.683,0,.759,{sk:.0833}],120548:[.68,0,.615,{ic:.106,sk:.0833}],120549:[.716,0,.833,{sk:.167}],120550:[.68,0,.738,{ic:.026,sk:.0833}],120551:[.683,0,.683,{ic:.04,sk:.0833}],120552:[.683,0,.831,{ic:.057,sk:.0556}],120553:[.704,.022,.763,{sk:.0833}],120554:[.683,0,.44,{ic:.064,sk:.111}],120555:[.683,0,.849,{ic:.04,sk:.0556}],120556:[.716,0,.694,{sk:.167}],120557:[.683,0,.97,{ic:.081,sk:.0833}],120558:[.683,0,.803,{ic:.085,sk:.0833}],120559:[.677,0,.742,{ic:.035,sk:.0833}],120560:[.704,.022,.763,{sk:.0833}],120561:[.68,0,.831,{ic:.056,sk:.0556}],120562:[.683,0,.642,{ic:.109,sk:.0833}],120564:[.683,0,.78,{ic:.026,sk:.0833}],120565:[.677,0,.584,{ic:.12,sk:.0833}],120566:[.705,0,.583,{ic:.117,sk:.0556}],120567:[.683,0,.667,{sk:.0833}],120568:[.683,0,.828,{ic:.024,sk:.0833}],120569:[.683,0,.612,{ic:.08,sk:.0556}],120570:[.704,0,.772,{ic:.014,sk:.0833}],120572:[.442,.011,.64,{sk:.0278}],120573:[.705,.194,.566,{sk:.0833}],120574:[.441,.216,.518,{ic:.025}],120575:[.717,.01,.444,{sk:.0556}],120576:[.452,.022,.466,{sk:.0833}],120577:[.704,.204,.438,{ic:.033,sk:.0833}],120578:[.442,.216,.497,{sk:.0556}],120579:[.705,.01,.469,{sk:.0833}],120580:[.442,.01,.354,{sk:.0556}],120581:[.442,.011,.576],120582:[.694,.012,.583],120583:[.442,.216,.603,{sk:.0278}],120584:[.442,0,.494,{ic:.036,sk:.0278}],120585:[.704,.205,.438,{sk:.111}],120586:[.441,.011,.485,{sk:.0556}],120587:[.431,.011,.57],120588:[.442,.216,.517,{sk:.0833}],120589:[.442,.107,.363,{ic:.042,sk:.0833}],120590:[.431,.011,.571],120591:[.431,.013,.437,{ic:.08,sk:.0278}],120592:[.443,.01,.54,{sk:.0278}],120593:[.442,.218,.654,{sk:.0833}],120594:[.442,.204,.626,{sk:.0556}],120595:[.694,.205,.651,{sk:.111}],120596:[.443,.011,.622],120597:[.715,.022,.531,{ic:.035,sk:.0833}],120598:[.431,.011,.406,{sk:.0556}],120599:[.705,.011,.591,{sk:.0833}],120600:[.434,.006,.667,{ic:.067}],120601:[.694,.205,.596,{sk:.0833}],120602:[.442,.194,.517,{sk:.0833}],120603:[.431,.01,.828],120604:[.711,0,.869,{sk:.16}],120605:[.686,0,.866,{sk:.0958}],120606:[.68,0,.657,{ic:.12,sk:.0958}],120607:[.711,0,.958,{sk:.192}],120608:[.68,0,.81,{ic:.015,sk:.0958}],120609:[.686,0,.773,{ic:.032,sk:.0958}],120610:[.686,0,.982,{ic:.045,sk:.0639}],120611:[.702,.017,.867,{sk:.0958}],120612:[.686,0,.511,{ic:.062,sk:.128}],120613:[.686,0,.971,{ic:.032,sk:.0639}],120614:[.711,0,.806,{sk:.192}],120615:[.686,0,1.142,{ic:.077,sk:.0958}],120616:[.686,0,.95,{ic:.077,sk:.0958}],120617:[.675,0,.841,{ic:.026,sk:.0958}],120618:[.703,.017,.837,{sk:.0958}],120619:[.68,0,.982,{ic:.044,sk:.0639}],120620:[.686,0,.723,{ic:.124,sk:.0958}],120622:[.686,0,.885,{ic:.017,sk:.0958}],120623:[.675,0,.637,{ic:.135,sk:.0958}],120624:[.703,0,.671,{ic:.131,sk:.0639}],120625:[.686,0,.767,{sk:.0958}],120626:[.686,0,.947,{sk:.0958}],120627:[.686,0,.714,{ic:.076,sk:.0639}],120628:[.703,0,.879,{sk:.0958}],120630:[.452,.008,.761,{sk:.0319}],120631:[.701,.194,.66,{sk:.0958}],120632:[.451,.211,.59,{ic:.027}],120633:[.725,.008,.522,{sk:.0639}],120634:[.461,.017,.529,{sk:.0958}],120635:[.711,.202,.508,{ic:.013,sk:.0958}],120636:[.452,.211,.6,{sk:.0639}],120637:[.702,.008,.562,{sk:.0958}],120638:[.452,.008,.412,{sk:.0639}],120639:[.452,.008,.668],120640:[.694,.013,.671],120641:[.452,.211,.708,{sk:.0319}],120642:[.452,0,.577,{ic:.031,sk:.0319}],120643:[.711,.201,.508,{sk:.128}],120644:[.452,.008,.585,{sk:.0639}],120645:[.444,.008,.682],120646:[.451,.211,.612,{sk:.0958}],120647:[.451,.105,.424,{ic:.033,sk:.0958}],120648:[.444,.008,.686],120649:[.444,.013,.521,{ic:.089,sk:.0319}],120650:[.453,.008,.631,{sk:.0319}],120651:[.452,.216,.747,{sk:.0958}],120652:[.452,.201,.718,{sk:.0639}],120653:[.694,.202,.758,{sk:.128}],120654:[.453,.008,.718],120655:[.71,.017,.628,{ic:.029,sk:.0958}],120656:[.444,.007,.483,{sk:.0639}],120657:[.701,.008,.692,{sk:.0958}],120658:[.434,.006,.667,{ic:.067}],120659:[.694,.202,.712,{sk:.0958}],120660:[.451,.194,.612,{sk:.0958}],120661:[.444,.008,.975],120662:[.694,0,.733],120663:[.694,0,.733],120664:[.691,0,.581],120665:[.694,0,.917],120666:[.691,0,.642],120667:[.694,0,.672],120668:[.694,0,.794],120669:[.716,.022,.856],120670:[.694,0,.331],120671:[.694,0,.764],120672:[.694,0,.672],120673:[.694,0,.978],120674:[.694,0,.794],120675:[.688,0,.733],120676:[.716,.022,.794],120677:[.691,0,.794],120678:[.694,0,.703],120680:[.694,0,.794],120681:[.688,0,.733],120682:[.715,0,.856],120683:[.694,0,.794],120684:[.694,0,.733],120685:[.694,0,.856],120686:[.716,0,.794],120782:[.654,.01,.575],120783:[.655,0,.575],120784:[.654,0,.575],120785:[.655,.011,.575],120786:[.656,0,.575],120787:[.655,.011,.575],120788:[.655,.011,.575],120789:[.676,.011,.575],120790:[.654,.011,.575],120791:[.654,.011,.575],120802:[.678,.022,.5],120803:[.678,0,.5],120804:[.677,0,.5],120805:[.678,.022,.5],120806:[.656,0,.5],120807:[.656,.021,.5],120808:[.677,.022,.5],120809:[.656,.011,.5],120810:[.678,.022,.5],120811:[.677,.022,.5],120812:[.715,.022,.55],120813:[.716,0,.55],120814:[.716,0,.55],120815:[.716,.022,.55],120816:[.694,0,.55],120817:[.694,.022,.55],120818:[.716,.022,.55],120819:[.695,.011,.55],120820:[.715,.022,.55],120821:[.716,.022,.55],120822:[.621,.01,.525],120823:[.622,0,.525],120824:[.622,0,.525],120825:[.622,.011,.525],120826:[.624,0,.525],120827:[.611,.01,.525],120828:[.622,.011,.525],120829:[.627,.01,.525],120830:[.621,.01,.525],120831:[.622,.011,.525]}},6949:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.sansSerifBoldItalic=void 0,T.sansSerifBoldItalic={305:[.458,0,.256],567:[.458,.205,.286]}},5193:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.sansSerifBold=void 0,T.sansSerifBold={33:[.694,0,.367],34:[.694,-.442,.558],35:[.694,.193,.917],36:[.75,.056,.55],37:[.75,.056,1.029],38:[.716,.022,.831],39:[.694,-.442,.306],40:[.75,.249,.428],41:[.75,.25,.428],42:[.75,-.293,.55],43:[.617,.116,.856],44:[.146,.106,.306],45:[.273,-.186,.367],46:[.146,0,.306],47:[.75,.249,.55],58:[.458,0,.306],59:[.458,.106,.306],61:[.407,-.094,.856],63:[.705,0,.519],64:[.704,.011,.733],91:[.75,.25,.343],93:[.75,.25,.343],94:[.694,-.537,.55],95:[-.023,.11,.55],126:[.344,-.198,.55],305:[.458,0,.256],567:[.458,.205,.286],768:[.694,-.537,0],769:[.694,-.537,0],770:[.694,-.537,0],771:[.694,-.548,0],772:[.66,-.56,0],774:[.694,-.552,0],775:[.695,-.596,0],776:[.695,-.595,0],778:[.694,-.538,0],779:[.694,-.537,0],780:[.657,-.5,0],8211:[.327,-.24,.55],8212:[.327,-.24,1.1],8213:[.327,-.24,1.1],8215:[-.023,.11,.55],8216:[.694,-.443,.306],8217:[.694,-.442,.306],8220:[.694,-.443,.558],8221:[.694,-.442,.558],8260:[.75,.249,.55],8710:[.694,0,.917]}},2632:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.sansSerifItalic=void 0,T.sansSerifItalic={33:[.694,0,.319,{ic:.036}],34:[.694,-.471,.5],35:[.694,.194,.833,{ic:.018}],36:[.75,.056,.5,{ic:.065}],37:[.75,.056,.833],38:[.716,.022,.758],39:[.694,-.471,.278,{ic:.057}],40:[.75,.25,.389,{ic:.102}],41:[.75,.25,.389],42:[.75,-.306,.5,{ic:.068}],43:[.583,.083,.778],44:[.098,.125,.278],45:[.259,-.186,.333],46:[.098,0,.278],47:[.75,.25,.5,{ic:.1}],48:[.678,.022,.5,{ic:.049}],49:[.678,0,.5],50:[.678,0,.5,{ic:.051}],51:[.678,.022,.5,{ic:.044}],52:[.656,0,.5,{ic:.021}],53:[.656,.022,.5,{ic:.055}],54:[.678,.022,.5,{ic:.048}],55:[.656,.011,.5,{ic:.096}],56:[.678,.022,.5,{ic:.054}],57:[.677,.022,.5,{ic:.045}],58:[.444,0,.278],59:[.444,.125,.278],61:[.37,-.13,.778,{ic:.018}],63:[.704,0,.472,{ic:.064}],64:[.705,.01,.667,{ic:.04}],91:[.75,.25,.289,{ic:.136}],93:[.75,.25,.289,{ic:.064}],94:[.694,-.527,.5,{ic:.033}],95:[-.038,.114,.5,{ic:.065}],126:[.327,-.193,.5,{ic:.06}],305:[.444,0,.239,{ic:.019}],567:[.444,.204,.267,{ic:.019}],768:[.694,-.527,0],769:[.694,-.527,0,{ic:.063}],770:[.694,-.527,0,{ic:.033}],771:[.677,-.543,0,{ic:.06}],772:[.631,-.552,0,{ic:.064}],774:[.694,-.508,0,{ic:.073}],775:[.68,-.576,0],776:[.68,-.582,0,{ic:.04}],778:[.693,-.527,0],779:[.694,-.527,0,{ic:.063}],780:[.654,-.487,0,{ic:.06}],913:[.694,0,.667],914:[.694,0,.667,{ic:.029}],915:[.691,0,.542,{ic:.104}],916:[.694,0,.833],917:[.691,0,.597,{ic:.091}],918:[.694,0,.611,{ic:.091}],919:[.694,0,.708,{ic:.06}],920:[.715,.022,.778,{ic:.026}],921:[.694,0,.278,{ic:.06}],922:[.694,0,.694,{ic:.091}],923:[.694,0,.611],924:[.694,0,.875,{ic:.054}],925:[.694,0,.708,{ic:.058}],926:[.688,0,.667,{ic:.098}],927:[.716,.022,.736,{ic:.027}],928:[.691,0,.708,{ic:.06}],929:[.694,0,.639,{ic:.051}],931:[.694,0,.722,{ic:.091}],932:[.688,0,.681,{ic:.109}],933:[.716,0,.778,{ic:.065}],934:[.694,0,.722,{ic:.021}],935:[.694,0,.667,{ic:.091}],936:[.694,0,.778,{ic:.076}],937:[.716,0,.722,{ic:.047}],8211:[.312,-.236,.5,{ic:.065}],8212:[.312,-.236,1,{ic:.065}],8213:[.312,-.236,1,{ic:.065}],8215:[-.038,.114,.5,{ic:.065}],8216:[.694,-.471,.278,{ic:.058}],8217:[.694,-.471,.278,{ic:.057}],8220:[.694,-.471,.5,{ic:.114}],8221:[.694,-.471,.5],8260:[.75,.25,.5,{ic:.1}],8710:[.694,0,.833]}},4214:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.sansSerif=void 0,T.sansSerif={33:[.694,0,.319],34:[.694,-.471,.5],35:[.694,.194,.833],36:[.75,.056,.5],37:[.75,.056,.833],38:[.716,.022,.758],39:[.694,-.471,.278],40:[.75,.25,.389],41:[.75,.25,.389],42:[.75,-.306,.5],43:[.583,.082,.778],44:[.098,.125,.278],45:[.259,-.186,.333],46:[.098,0,.278],47:[.75,.25,.5],58:[.444,0,.278],59:[.444,.125,.278],61:[.37,-.13,.778],63:[.704,0,.472],64:[.704,.011,.667],91:[.75,.25,.289],93:[.75,.25,.289],94:[.694,-.527,.5],95:[-.038,.114,.5],126:[.327,-.193,.5],305:[.444,0,.239],567:[.444,.205,.267],768:[.694,-.527,0],769:[.694,-.527,0],770:[.694,-.527,0],771:[.677,-.543,0],772:[.631,-.552,0],774:[.694,-.508,0],775:[.68,-.576,0],776:[.68,-.582,0],778:[.694,-.527,0],779:[.694,-.527,0],780:[.654,-.487,0],913:[.694,0,.667],914:[.694,0,.667],915:[.691,0,.542],916:[.694,0,.833],917:[.691,0,.597],918:[.694,0,.611],919:[.694,0,.708],920:[.716,.021,.778],921:[.694,0,.278],922:[.694,0,.694],923:[.694,0,.611],924:[.694,0,.875],925:[.694,0,.708],926:[.688,0,.667],927:[.715,.022,.736],928:[.691,0,.708],929:[.694,0,.639],931:[.694,0,.722],932:[.688,0,.681],933:[.716,0,.778],934:[.694,0,.722],935:[.694,0,.667],936:[.694,0,.778],937:[.716,0,.722],8211:[.312,-.236,.5],8212:[.312,-.236,1],8213:[.312,-.236,1],8215:[-.038,.114,.5],8216:[.694,-.471,.278],8217:[.694,-.471,.278],8220:[.694,-.471,.5],8221:[.694,-.471,.5],8260:[.75,.25,.5],8710:[.694,0,.833]}},6466:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.scriptBold=void 0,T.scriptBold={}},3776:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.script=void 0,T.script={}},7405:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.smallop=void 0,T.smallop={40:[.85,.349,.458],41:[.85,.349,.458],47:[.85,.349,.578],91:[.85,.349,.417],92:[.85,.349,.578],93:[.85,.349,.417],123:[.85,.349,.583],125:[.85,.349,.583],710:[.744,-.551,.556],732:[.722,-.597,.556],770:[.744,-.551,0],771:[.722,-.597,0],8214:[.602,0,.778],8260:[.85,.349,.578],8593:[.6,0,.667],8595:[.6,0,.667],8657:[.599,0,.778],8659:[.6,0,.778],8719:[.75,.25,.944],8720:[.75,.25,.944],8721:[.75,.25,1.056],8730:[.85,.35,1,{ic:.02}],8739:[.627,.015,.333],8741:[.627,.015,.556],8747:[.805,.306,.472,{ic:.138}],8748:[.805,.306,.819,{ic:.138}],8749:[.805,.306,1.166,{ic:.138}],8750:[.805,.306,.472,{ic:.138}],8896:[.75,.249,.833],8897:[.75,.249,.833],8898:[.75,.249,.833],8899:[.75,.249,.833],8968:[.85,.349,.472],8969:[.85,.349,.472],8970:[.85,.349,.472],8971:[.85,.349,.472],9001:[.85,.35,.472],9002:[.85,.35,.472],9168:[.602,0,.667],10072:[.627,.015,.333],10216:[.85,.35,.472],10217:[.85,.35,.472],10752:[.75,.25,1.111],10753:[.75,.25,1.111],10754:[.75,.25,1.111],10756:[.75,.249,.833],10758:[.75,.249,.833],10764:[.805,.306,1.638,{ic:.138}],12296:[.85,.35,.472],12297:[.85,.35,.472]}},8105:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.texCalligraphicBold=void 0,T.texCalligraphicBold={65:[.751,.049,.921,{ic:.068,sk:.224}],66:[.705,.017,.748,{sk:.16}],67:[.703,.02,.613,{sk:.16}],68:[.686,0,.892,{sk:.0958}],69:[.703,.016,.607,{ic:.02,sk:.128}],70:[.686,.03,.814,{ic:.116,sk:.128}],71:[.703,.113,.682,{sk:.128}],72:[.686,.048,.987,{sk:.128}],73:[.686,0,.642,{ic:.104,sk:.0319}],74:[.686,.114,.779,{ic:.158,sk:.192}],75:[.703,.017,.871,{sk:.0639}],76:[.703,.017,.788,{sk:.16}],77:[.703,.049,1.378,{sk:.16}],78:[.84,.049,.937,{ic:.168,sk:.0958}],79:[.703,.017,.906,{sk:.128}],80:[.686,.067,.81,{ic:.036,sk:.0958}],81:[.703,.146,.939,{sk:.128}],82:[.686,.017,.99,{sk:.0958}],83:[.703,.016,.696,{ic:.025,sk:.16}],84:[.72,.069,.644,{ic:.303,sk:.0319}],85:[.686,.024,.715,{ic:.056,sk:.0958}],86:[.686,.077,.737,{ic:.037,sk:.0319}],87:[.686,.077,1.169,{ic:.037,sk:.0958}],88:[.686,0,.817,{ic:.089,sk:.16}],89:[.686,.164,.759,{ic:.038,sk:.0958}],90:[.686,0,.818,{ic:.035,sk:.16}],305:[.452,.008,.394,{sk:.0319}],567:[.451,.201,.439,{sk:.0958}]}},2518:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.texCalligraphic=void 0,T.texCalligraphic={65:[.728,.05,.798,{ic:.021,sk:.194}],66:[.705,.022,.657,{sk:.139}],67:[.705,.025,.527,{sk:.139}],68:[.683,0,.771,{sk:.0833}],69:[.705,.022,.528,{ic:.036,sk:.111}],70:[.683,.032,.719,{ic:.11,sk:.111}],71:[.704,.119,.595,{sk:.111}],72:[.683,.048,.845,{sk:.111}],73:[.683,0,.545,{ic:.097,sk:.0278}],74:[.683,.119,.678,{ic:.161,sk:.167}],75:[.705,.022,.762,{sk:.0556}],76:[.705,.022,.69,{sk:.139}],77:[.705,.05,1.201,{sk:.139}],78:[.789,.05,.82,{ic:.159,sk:.0833}],79:[.705,.022,.796,{sk:.111}],80:[.683,.057,.696,{ic:.037,sk:.0833}],81:[.705,.131,.817,{sk:.111}],82:[.682,.022,.848,{sk:.0833}],83:[.705,.022,.606,{ic:.036,sk:.139}],84:[.717,.068,.545,{ic:.288,sk:.0278}],85:[.683,.028,.626,{ic:.061,sk:.0833}],86:[.683,.052,.613,{ic:.045,sk:.0278}],87:[.683,.053,.988,{ic:.046,sk:.0833}],88:[.683,0,.713,{ic:.094,sk:.139}],89:[.683,.143,.668,{ic:.046,sk:.0833}],90:[.683,0,.725,{ic:.042,sk:.139}]}},5595:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.texMathit=void 0,T.texMathit={65:[.716,0,.743],66:[.683,0,.704],67:[.705,.021,.716],68:[.683,0,.755],69:[.68,0,.678],70:[.68,0,.653],71:[.705,.022,.774],72:[.683,0,.743],73:[.683,0,.386],74:[.683,.021,.525],75:[.683,0,.769],76:[.683,0,.627],77:[.683,0,.897],78:[.683,0,.743],79:[.704,.022,.767],80:[.683,0,.678],81:[.704,.194,.767],82:[.683,.022,.729],83:[.705,.022,.562],84:[.677,0,.716],85:[.683,.022,.743],86:[.683,.022,.743],87:[.683,.022,.999],88:[.683,0,.743],89:[.683,0,.743],90:[.683,0,.613],97:[.442,.011,.511],98:[.694,.011,.46],99:[.441,.01,.46],100:[.694,.011,.511],101:[.442,.01,.46],102:[.705,.204,.307],103:[.442,.205,.46],104:[.694,.011,.511],105:[.656,.01,.307],106:[.656,.204,.307],107:[.694,.011,.46],108:[.694,.011,.256],109:[.442,.011,.818],110:[.442,.011,.562],111:[.442,.011,.511],112:[.442,.194,.511],113:[.442,.194,.46],114:[.442,.011,.422],115:[.442,.011,.409],116:[.626,.011,.332],117:[.441,.011,.537],118:[.443,.01,.46],119:[.443,.011,.664],120:[.442,.011,.464],121:[.441,.205,.486],122:[.442,.011,.409]}},6357:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.texOldstyleBold=void 0,T.texOldstyleBold={48:[.46,.017,.575],49:[.461,0,.575],50:[.46,0,.575],51:[.461,.211,.575],52:[.469,.194,.575],53:[.461,.211,.575],54:[.66,.017,.575],55:[.476,.211,.575],56:[.661,.017,.575],57:[.461,.21,.575],65:[.751,.049,.921,{ic:.068,sk:.224}],66:[.705,.017,.748,{sk:.16}],67:[.703,.02,.613,{sk:.16}],68:[.686,0,.892,{sk:.0958}],69:[.703,.016,.607,{ic:.02,sk:.128}],70:[.686,.03,.814,{ic:.116,sk:.128}],71:[.703,.113,.682,{sk:.128}],72:[.686,.048,.987,{sk:.128}],73:[.686,0,.642,{ic:.104,sk:.0319}],74:[.686,.114,.779,{ic:.158,sk:.192}],75:[.703,.017,.871,{sk:.0639}],76:[.703,.017,.788,{sk:.16}],77:[.703,.049,1.378,{sk:.16}],78:[.84,.049,.937,{ic:.168,sk:.0958}],79:[.703,.017,.906,{sk:.128}],80:[.686,.067,.81,{ic:.036,sk:.0958}],81:[.703,.146,.939,{sk:.128}],82:[.686,.017,.99,{sk:.0958}],83:[.703,.016,.696,{ic:.025,sk:.16}],84:[.72,.069,.644,{ic:.303,sk:.0319}],85:[.686,.024,.715,{ic:.056,sk:.0958}],86:[.686,.077,.737,{ic:.037,sk:.0319}],87:[.686,.077,1.169,{ic:.037,sk:.0958}],88:[.686,0,.817,{ic:.089,sk:.16}],89:[.686,.164,.759,{ic:.038,sk:.0958}],90:[.686,0,.818,{ic:.035,sk:.16}]}},9474:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.texOldstyle=void 0,T.texOldstyle={48:[.452,.022,.5],49:[.453,0,.5],50:[.453,0,.5],51:[.452,.216,.5],52:[.464,.194,.5],53:[.453,.216,.5],54:[.665,.022,.5],55:[.463,.216,.5],56:[.666,.021,.5],57:[.453,.216,.5],65:[.728,.05,.798,{ic:.021,sk:.194}],66:[.705,.022,.657,{sk:.139}],67:[.705,.025,.527,{sk:.139}],68:[.683,0,.771,{sk:.0833}],69:[.705,.022,.528,{ic:.036,sk:.111}],70:[.683,.032,.719,{ic:.11,sk:.111}],71:[.704,.119,.595,{sk:.111}],72:[.683,.048,.845,{sk:.111}],73:[.683,0,.545,{ic:.097,sk:.0278}],74:[.683,.119,.678,{ic:.161,sk:.167}],75:[.705,.022,.762,{sk:.0556}],76:[.705,.022,.69,{sk:.139}],77:[.705,.05,1.201,{sk:.139}],78:[.789,.05,.82,{ic:.159,sk:.0833}],79:[.705,.022,.796,{sk:.111}],80:[.683,.057,.696,{ic:.037,sk:.0833}],81:[.705,.131,.817,{sk:.111}],82:[.682,.022,.848,{sk:.0833}],83:[.705,.022,.606,{ic:.036,sk:.139}],84:[.717,.068,.545,{ic:.288,sk:.0278}],85:[.683,.028,.626,{ic:.061,sk:.0833}],86:[.683,.052,.613,{ic:.045,sk:.0278}],87:[.683,.053,.988,{ic:.046,sk:.0833}],88:[.683,0,.713,{ic:.094,sk:.139}],89:[.683,.143,.668,{ic:.046,sk:.0833}],90:[.683,0,.725,{ic:.042,sk:.139}]}},584:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.texSize3=void 0,T.texSize3={40:[1.45,.949,.736],41:[1.45,.949,.736],47:[1.45,.949,1.044],91:[1.45,.949,.528],92:[1.45,.949,1.044],93:[1.45,.949,.528],123:[1.45,.949,.75],125:[1.45,.949,.75],710:[.772,-.564,1.444],732:[.749,-.61,1.444],770:[.772,-.564,0],771:[.749,-.61,0],8260:[1.45,.949,1.044],8730:[1.45,.95,1,{ic:.02}],8968:[1.45,.949,.583],8969:[1.45,.949,.583],8970:[1.45,.949,.583],8971:[1.45,.949,.583],9001:[1.45,.95,.75],9002:[1.45,.949,.75],10216:[1.45,.95,.75],10217:[1.45,.949,.75],12296:[1.45,.95,.75],12297:[1.45,.949,.75]}},4324:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.texSize4=void 0,T.texSize4={40:[1.75,1.249,.792],41:[1.75,1.249,.792],47:[1.75,1.249,1.278],91:[1.75,1.249,.583],92:[1.75,1.249,1.278],93:[1.75,1.249,.583],123:[1.75,1.249,.806],125:[1.75,1.249,.806],710:[.845,-.561,1.889,{ic:.013}],732:[.823,-.583,1.889],770:[.845,-.561,0,{ic:.013}],771:[.823,-.583,0],8260:[1.75,1.249,1.278],8730:[1.75,1.25,1,{ic:.02}],8968:[1.75,1.249,.639],8969:[1.75,1.249,.639],8970:[1.75,1.249,.639],8971:[1.75,1.249,.639],9001:[1.75,1.248,.806],9002:[1.75,1.248,.806],9115:[1.154,.655,.875],9116:[.61,.01,.875],9117:[1.165,.644,.875],9118:[1.154,.655,.875],9119:[.61,.01,.875],9120:[1.165,.644,.875],9121:[1.154,.645,.667],9122:[.602,0,.667],9123:[1.155,.644,.667],9124:[1.154,.645,.667],9125:[.602,0,.667],9126:[1.155,.644,.667],9127:[.899,.01,.889],9128:[1.16,.66,.889],9129:[.01,.899,.889],9130:[.29,.015,.889],9131:[.899,.01,.889],9132:[1.16,.66,.889],9133:[.01,.899,.889],9143:[.935,.885,1.056],10216:[1.75,1.248,.806],10217:[1.75,1.248,.806],12296:[1.75,1.248,.806],12297:[1.75,1.248,.806],57344:[.625,.014,1.056],57345:[.605,.014,1.056,{ic:.02}],57680:[.12,.213,.45,{ic:.01}],57681:[.12,.213,.45,{ic:.024}],57682:[.333,0,.45,{ic:.01}],57683:[.333,0,.45,{ic:.024}],57684:[.32,.2,.4,{ic:.01}],57685:[.333,0,.9,{ic:.01}],57686:[.12,.213,.9,{ic:.01}]}},8135:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.texVariant=void 0,T.texVariant={710:[.845,-.561,2.333,{ic:.013}],732:[.899,-.628,2.333],770:[.845,-.561,0,{ic:.013}],771:[.899,-.628,0],1008:[.434,.006,.667,{ic:.067}],8463:[.695,.013,.54,{ic:.022}],8592:[.437,-.064,.5],8594:[.437,-.064,.5],8652:[.514,.014,1],8708:[.86,.166,.556],8709:[.587,0,.778],8722:[.27,-.23,.5],8726:[.43,.023,.778],8733:[.472,-.028,.778],8739:[.43,.023,.222],8740:[.43,.023,.222,{ic:.018}],8741:[.431,.023,.389],8742:[.431,.024,.389,{ic:.018}],8764:[.365,-.132,.778],8776:[.481,-.05,.778],8808:[.752,.284,.778],8809:[.752,.284,.778],8816:[.919,.421,.778],8817:[.919,.421,.778],8840:[.828,.33,.778],8841:[.828,.33,.778],8842:[.634,.255,.778],8843:[.634,.254,.778],8872:[.694,0,.611],8901:[.189,0,.278],8994:[.378,-.122,.778],8995:[.378,-.143,.778],9651:[.575,.02,.722],9661:[.576,.019,.722],10887:[.801,.303,.778],10888:[.801,.303,.778],10955:[.752,.332,.778],10956:[.752,.333,.778]}},1054:function(Q,T,L){var H,V=this&&this.__extends||(H=function(Q,T){return H=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(Q,T){Q.__proto__=T}||function(Q,T){for(var L in T)Object.prototype.hasOwnProperty.call(T,L)&&(Q[L]=T[L])},H(Q,T)},function(Q,T){if("function"!=typeof T&&null!==T)throw new TypeError("Class extends value "+String(T)+" is not a constructor or null");function L(){this.constructor=Q}H(Q,T),Q.prototype=null===T?Object.create(T):(L.prototype=T.prototype,new L)}),M=this&&this.__values||function(Q){var T="function"==typeof Symbol&&Symbol.iterator,L=T&&Q[T],H=0;if(L)return L.call(Q);if(Q&&"number"==typeof Q.length)return{next:function(){return Q&&H>=Q.length&&(Q=void 0),{value:Q&&Q[H++],done:!Q}}};throw new TypeError(T?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(T,"__esModule",{value:!0}),T.TeXFont=void 0;var Z=L(9403),i=L(2176),t=L(8681),e=L(7293),s=L(59),c=L(3566),r=L(8745),o=L(181),a=L(6560),l=L(1500),n=L(2418),d=L(353),k=L(1082),u=L(67),f=L(9007),p=L(3377),h=L(8318),v=L(2226),_=L(6385),D=L(871),b=L(6819),x=L(4025),W=L(2698),y=L(5211),O=L(8742),m=L(2989),S=L(7481),P=function(Q){function T(T){var L,H;void 0===T&&(T=null);var V=Q.call(this,T)||this,Z=V.constructor;try{for(var i=M(Object.keys(Z.variantCacheIds)),t=i.next();!t.done;t=i.next()){var e=t.value;V.variant[e].cacheID="TEX-"+Z.variantCacheIds[e]}}catch(Q){L={error:Q}}finally{try{t&&!t.done&&(H=i.return)&&H.call(i)}finally{if(L)throw L.error}}return V}return V(T,Q),T.defaultDelimiters=S.delimiters,T.defaultChars={normal:n.normal,bold:e.bold,italic:o.italic,"bold-italic":t.boldItalic,"double-struck":s.doubleStruck,fraktur:r.fraktur,"bold-fraktur":c.frakturBold,script:h.script,"bold-script":p.scriptBold,"sans-serif":f.sansSerif,"bold-sans-serif":k.sansSerifBold,"sans-serif-italic":u.sansSerifItalic,"sans-serif-bold-italic":d.sansSerifBoldItalic,monospace:l.monospace,"-smallop":v.smallop,"-largeop":a.largeop,"-size3":y.texSize3,"-size4":O.texSize4,"-tex-calligraphic":D.texCalligraphic,"-tex-bold-calligraphic":_.texCalligraphicBold,"-tex-mathit":b.texMathit,"-tex-oldstyle":W.texOldstyle,"-tex-bold-oldstyle":x.texOldstyleBold,"-tex-variant":m.texVariant},T.variantCacheIds={normal:"N",bold:"B",italic:"I","bold-italic":"BI","double-struck":"D",fraktur:"F","bold-fraktur":"BF",script:"S","bold-script":"BS","sans-serif":"SS","bold-sans-serif":"BSS","sans-serif-italic":"SSI","sans-serif-bold-italic":"SSBI",monospace:"M","-smallop":"SO","-largeop":"LO","-size3":"S3","-size4":"S4","-tex-calligraphic":"C","-tex-bold-calligraphic":"BC","-tex-mathit":"MI","-tex-oldstyle":"OS","-tex-bold-oldstyle":"BOS","-tex-variant":"V"},T}((0,i.CommonTeXFontMixin)(Z.SVGFontData));T.TeXFont=P},8681:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.boldItalic=void 0;var H=L(9403),V=L(3869);T.boldItalic=(0,H.AddPaths)(V.boldItalic,{47:"189 -210Q179 -210 170 -203T160 -179Q160 -171 162 -166Q164 -163 420 266T679 698Q686 711 704 711Q714 711 723 704T733 681Q733 672 730 667Q723 654 469 228T211 -201Q202 -210 189 -210",305:"24 296Q24 305 34 328T63 380T115 430T187 452Q205 452 223 448T262 435T295 406T308 360Q308 345 287 290T240 170T207 87Q202 67 202 57Q202 42 215 42Q235 42 257 64Q288 92 302 140Q307 156 310 159T330 162H336H347Q367 162 367 148Q367 140 357 117T329 65T276 14T201 -8Q158 -8 121 15T83 84Q83 104 133 229T184 358Q189 376 189 388Q189 402 177 402Q156 402 134 380Q103 352 89 304Q84 288 81 285T61 282H55H44Q24 282 24 296",567:"297 360T297 373T294 392T288 400T278 401H276Q237 398 200 363Q181 343 170 325T156 299T149 287T129 282H123H116Q102 282 97 284T92 298Q93 303 98 315T118 349T151 390T201 427T267 451H279Q357 451 388 422T420 354V339L370 138Q321 -60 317 -69Q287 -157 163 -194Q133 -201 99 -201Q39 -201 14 -178T-12 -125Q-12 -94 11 -69T68 -43Q93 -43 108 -57T123 -95Q123 -121 100 -151H104Q131 -151 155 -125T193 -60Q195 -54 244 141T294 345Q297 360 297 373",8260:"189 -210Q179 -210 170 -203T160 -179Q160 -171 162 -166Q164 -163 420 266T679 698Q686 711 704 711Q714 711 723 704T733 681Q733 672 730 667Q723 654 469 228T211 -201Q202 -210 189 -210",8710:"65 0Q59 6 59 9T61 16Q64 20 334 357T608 698Q616 706 629 710Q630 710 634 710T644 710T656 711Q686 711 694 703Q698 699 700 693Q706 674 805 345T904 14Q904 7 894 1L479 0H65ZM630 342L567 551L232 134L462 133H693Q693 137 630 342",10744:"189 -210Q179 -210 170 -203T160 -179Q160 -171 162 -166Q164 -163 420 266T679 698Q686 711 704 711Q714 711 723 704T733 681Q733 672 730 667Q723 654 469 228T211 -201Q202 -210 189 -210"},{})},7293:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.bold=void 0;var H=L(9403),V=L(7557);T.bold=(0,H.AddPaths)(V.bold,{33:"89 629Q89 663 116 684T171 705Q215 705 237 681T260 634Q260 619 233 434T204 244Q201 237 175 237Q150 237 146 244Q144 248 117 433T89 629ZM90 86Q90 125 116 148T177 171Q211 169 235 146T259 86Q259 48 235 25T175 1Q138 1 114 24T90 86",34:"38 572T38 608T61 669T121 694Q167 694 196 657T225 559Q225 520 214 482T186 418T151 370T119 339T99 329T82 340T70 360Q70 365 74 369T92 385T122 414Q142 441 154 471T170 518L172 535L166 532Q160 530 148 527T122 523Q85 523 62 547ZM305 572T305 608T328 669T388 694Q434 694 463 657T492 559Q492 520 481 482T453 418T418 370T386 339T366 329T349 340T337 360Q337 365 341 369T359 385T389 414Q409 441 421 471T436 518L439 535L433 532Q427 530 415 527T389 523Q352 523 329 547",35:"64 362Q64 380 87 393H363L366 404Q379 443 390 480T409 542T424 590T435 628T443 655T451 674T458 686T467 692T478 694Q490 694 499 686T509 662Q505 643 427 395Q427 393 523 393H620L623 404Q630 426 652 498T691 624T711 681Q718 694 735 694Q748 694 757 685T766 662Q762 643 684 395Q684 393 777 393H871Q872 392 875 390T881 386T887 381T891 374T893 363Q893 345 871 333L767 332H664L660 319Q660 318 638 245T614 171Q614 169 742 169H871L877 165Q883 161 885 159T890 151T893 138Q893 120 871 109L732 108H594L590 95Q587 84 546 -46Q508 -175 505 -178Q498 -193 478 -193Q462 -193 455 -183T448 -164Q448 -156 530 106Q530 108 434 108H337L333 95Q330 84 289 -46Q251 -175 248 -178Q240 -193 222 -193Q206 -193 199 -183T191 -164Q191 -154 273 106Q273 108 180 108L87 109Q64 117 64 139Q64 156 87 169H293L321 262Q326 277 331 294T340 321L343 330Q343 332 215 332L87 333Q64 343 64 362ZM600 330Q600 332 504 332H407L403 319Q403 318 381 245T357 171Q357 169 453 169H550L578 262Q583 277 588 294T597 321L600 330",36:"64 494Q64 541 80 579T120 638T171 674T219 693T253 698H256V750H318V699H323Q355 694 380 686T433 663T480 620T506 556Q510 539 510 520Q510 480 488 463T440 445L422 447Q407 451 398 459Q370 478 370 515Q370 542 384 559T412 580L427 584Q424 589 418 596T386 617T324 636H318V434Q411 419 460 355T510 217Q510 196 507 175T492 122T461 67T404 23T318 -4V-56H256V-5H254Q252 -3 240 -3Q194 4 160 23T108 64T80 112T67 156T64 190Q64 218 81 240T134 262Q171 262 187 240T204 193T190 150T153 125Q146 125 144 123Q142 123 149 113T174 89T218 66Q247 58 255 58Q256 58 256 173V287L239 291Q160 308 112 365T64 494ZM255 636Q246 635 236 632T206 620T173 591T160 543Q160 472 256 448V542Q256 636 255 636ZM320 59Q324 59 333 61T356 70T384 89T406 120T415 167Q415 200 395 225T356 260T318 274V59H320",37:"65 549Q65 609 84 652T132 714T187 742T236 750Q265 750 296 734T355 697T431 661T541 644Q662 644 736 730Q751 749 767 749T790 739T797 719Q797 710 768 672T504 329Q212 -47 211 -48Q203 -55 191 -55Q161 -55 161 -25Q161 -17 163 -12L642 609Q608 595 542 595Q515 595 488 599T441 608T405 619T381 628L373 632Q373 630 375 619T380 589T383 548Q383 455 343 401T235 347Q217 347 198 351T154 368T110 403T78 462T65 549ZM320 549Q320 633 295 665T235 698H234Q214 698 196 674Q182 650 182 549Q182 509 183 486T190 441T207 409T238 399Q269 399 294 431T320 549ZM745 -56Q727 -56 708 -52T664 -35T620 0T588 59T575 146T588 232T620 291T663 325T708 343T747 347Q810 347 851 294T893 146Q893 89 879 48T841 -15T794 -46T745 -56ZM830 146Q830 230 805 262T745 295H744Q724 295 706 271Q692 247 692 146Q692 106 693 83T700 38T717 6T748 -4Q779 -4 804 28T830 146",38:"255 -11Q209 -11 164 4T84 56T48 146Q48 159 50 171Q57 197 72 218T99 249T152 292Q204 333 204 334L194 356Q185 379 176 421T166 511Q166 538 168 551Q182 613 226 654T332 704Q334 704 343 704T358 705Q412 702 444 661T476 565V559Q476 489 334 371L330 368L335 357Q382 272 485 165L496 154L506 163Q543 200 597 273L671 382H601V444H610L732 441Q821 441 830 444H836V382H741L709 335Q702 324 687 302T665 270T646 244T625 216T605 191T581 162T553 132L537 116Q544 109 557 98T605 69T673 51Q711 51 739 70T767 115V118H829V114Q829 70 786 30T668 -11Q570 -11 474 37L451 49L441 43Q352 -11 255 -11ZM415 564Q415 596 400 625T356 654Q329 654 310 634T285 588Q283 580 283 554Q283 475 309 417L325 431Q415 512 415 564ZM192 182Q192 126 213 89T279 51Q348 51 400 83L389 91Q362 112 338 137T295 186T264 229T240 265T227 286Q226 285 222 280T217 272T211 263T205 251T200 238T196 222T193 204T192 182",39:"74 572T74 608T97 669T157 694Q203 694 232 657T261 559Q261 520 250 482T222 418T187 370T155 339T135 329Q128 329 117 340T106 359Q106 365 117 375T144 399T176 440T203 505Q204 511 205 518T208 530V535L202 532Q196 530 184 527T158 523Q121 523 98 547",40:"103 166T103 251T121 412T165 541T225 639T287 708T341 750H356H361Q382 750 382 736Q382 732 365 714T323 661T274 576T232 439T214 250Q214 -62 381 -229Q382 -231 382 -234Q382 -249 360 -249H356H341Q314 -231 287 -207T226 -138T165 -41T121 89",41:"231 251Q231 354 214 439T173 575T123 661T81 714T64 735Q64 744 73 749H75Q77 749 79 749T84 750T90 750H105Q132 732 159 708T220 639T281 542T325 413T343 251T325 89T281 -40T221 -138T159 -207T105 -249H90Q80 -249 76 -249T68 -245T64 -234Q64 -230 81 -212T123 -160T172 -75T214 61T231 251",42:"235 706Q235 724 251 737T287 750Q306 750 322 738T339 706Q339 685 318 580V579Q429 663 436 666Q441 668 449 668Q471 668 486 650T501 612Q501 582 478 572Q476 570 414 549L354 528L414 507Q420 505 430 502T445 497T458 492T470 488T479 483T487 478T493 471T497 463T500 454T501 443Q501 423 486 406T449 388H446Q435 388 370 437Q339 461 318 477V476Q339 371 339 350Q339 332 323 319T287 306T251 319T235 350Q235 371 256 476V477Q145 393 138 390Q133 388 125 388Q103 388 88 406T73 444Q73 474 96 484Q98 486 160 507L220 528L160 549Q154 551 144 554T129 559T116 564T104 568T95 573T87 578T81 585T77 593T74 602T73 613Q73 633 88 650T125 668H128Q139 668 204 619Q235 595 256 579V580Q235 685 235 706",43:"64 232T64 250T87 281H416V444Q416 608 418 612Q426 633 446 633T475 613Q477 608 477 444V281H807Q808 280 811 278T817 274T823 269T827 262T829 251Q829 230 807 221L642 220H477V57Q477 -107 475 -112Q468 -131 446 -131Q425 -131 418 -112Q416 -107 416 57V220H251L87 221Q64 232 64 250",44:"74 85Q74 120 97 145T159 171Q200 171 226 138Q258 101 258 37Q258 -5 246 -44T218 -109T183 -155T152 -184T135 -194Q129 -194 118 -183T106 -164Q106 -157 115 -149Q121 -145 130 -137T161 -100T195 -35Q197 -28 200 -17T204 3T205 11T199 9T183 3T159 0Q120 0 97 26T74 85",45:"13 166V278H318V166H13",46:"74 85Q74 121 99 146T156 171Q200 171 222 143T245 85Q245 56 224 29T160 1Q118 1 96 27T74 85",47:"451 730Q460 750 479 750Q492 750 501 740T510 718Q508 708 318 244L122 -232Q112 -250 95 -250Q82 -250 73 -241T64 -218Q66 -205 258 261T451 730",58:"74 359Q74 394 98 419T158 444Q200 444 222 417T245 358Q245 329 224 302T160 274Q116 274 95 301T74 359ZM74 85Q74 121 99 146T156 171Q200 171 222 143T245 85Q245 56 224 29T160 1Q118 1 96 27T74 85",59:"74 359Q74 394 98 419T158 444Q200 444 222 417T245 358Q245 329 224 302T160 274Q116 274 95 301T74 359ZM74 50T74 86T97 146T158 171Q204 171 226 132T248 38Q248 -23 223 -80T171 -165T135 -194Q129 -194 118 -183T106 -164Q106 -163 106 -160L107 -158Q108 -155 121 -142T150 -107T177 -58Q189 -32 194 3Q195 6 193 6Q172 0 158 0Q121 0 98 25",60:"797 -56Q797 -68 790 -76T767 -85H759L434 70Q108 226 105 229Q96 238 96 250Q96 263 105 272Q109 276 271 354T595 508T757 585Q763 587 766 587Q780 587 788 578T797 556Q797 544 788 535Q784 531 490 391L197 251Q213 242 359 173T644 37T788 -34Q797 -43 797 -56",61:"87 333Q64 343 64 362Q64 383 84 391Q89 393 448 393H807Q808 392 811 390T817 386T823 381T827 374T829 363Q829 345 807 333H87ZM87 109Q64 118 64 139Q64 159 86 168Q89 169 448 169H807L812 166Q816 163 818 162T823 157T827 149T829 139Q829 118 807 109H87",62:"127 -85Q110 -85 103 -75T96 -55Q96 -41 106 -34Q119 -24 308 65Q361 90 411 114L696 250L427 379Q106 533 103 537Q96 545 96 557Q96 568 104 577T128 587Q137 586 460 431T788 272Q797 263 797 250Q797 238 788 229Q785 226 459 70L135 -85H127",63:"65 570Q65 628 119 664T259 700Q326 700 372 688T440 654T469 613T478 569Q478 505 412 465Q287 391 287 294V283Q287 250 284 244T263 237H256H249Q232 237 229 242T225 272V287Q227 364 253 418Q274 463 311 504Q335 530 335 575Q335 622 323 635T259 648Q231 648 209 644T179 636T170 630L172 628Q174 627 177 625T183 620T190 611T197 601T202 587T204 570Q204 539 185 519T134 499Q105 499 85 517T65 570ZM171 86Q171 125 197 148T258 171Q292 169 316 146T340 86Q340 48 316 25T256 1Q218 1 195 24T171 86",64:"64 347Q64 511 171 605T434 699Q487 699 500 698Q624 684 703 621T811 464Q828 414 828 344Q828 232 788 179T691 125Q673 125 657 127T628 132T606 140T588 148T576 156T568 162L566 164Q565 164 549 154T504 135T444 125Q349 125 284 183T218 347Q218 455 284 512T448 569Q554 569 610 479H638Q670 479 674 471Q676 468 676 340V258Q676 213 679 199T694 178Q701 174 713 177Q767 187 767 340Q767 489 678 569T446 649Q299 649 213 566T126 346Q126 307 134 269T166 189T225 116T320 65T455 45H463Q606 51 721 91L746 99H782H801Q829 99 829 85Q829 78 825 75T804 65Q800 63 797 62Q625 -6 451 -6Q271 -6 168 91T64 347ZM547 468Q526 493 504 505T444 517T377 476T346 347Q346 306 354 271T386 206T448 177Q505 177 547 226V468",91:"128 -250V750H293V689H189V-189H293V-250H128",92:"64 718Q63 731 72 740T94 750Q106 750 113 743Q118 741 122 732L318 256Q508 -208 510 -218Q511 -231 502 -240T480 -250Q460 -250 451 -230Q451 -229 259 238T64 718",93:"25 689V750H190V-250H25V-189H129V689H25",94:"207 632L287 694Q289 693 368 632T448 570T431 545T413 520Q410 520 350 559L287 597L224 559Q164 520 161 520Q160 520 143 544T126 570T207 632",95:"0 -61V-10H574V-61H0",96:"114 634Q114 663 136 684T183 706Q191 706 196 705T208 700T219 693T232 681T245 666T262 645T282 620Q332 558 337 553Q338 552 318 527L299 503L223 543Q215 547 202 553T183 563T167 571T153 580T141 587T131 595T124 603T118 612T115 622T114 634",123:"504 -207T504 -225T500 -246T476 -250H469Q257 -250 227 -145L225 -135L224 0Q224 15 224 30T224 59T224 84T224 106T223 122T223 133V137Q222 138 221 144T213 162T195 185Q171 206 141 215Q123 222 107 223T84 225T74 229T70 250T73 270T83 276T106 276T141 285Q171 294 195 315Q201 321 206 328T214 341T219 352T222 360L223 363V367Q223 371 223 378T223 394T224 415T224 441T224 470T224 501L225 636Q249 739 426 749Q428 749 443 749T466 750H473Q495 750 499 747T504 725T501 704T480 699Q381 693 357 645Q352 634 351 617T350 497V412Q350 350 338 329Q325 303 298 284T251 258T227 251Q226 251 226 250L227 249Q231 248 238 246T265 236T299 217T329 184T349 137Q350 131 350 3T352 -130Q358 -160 392 -178T480 -199Q497 -200 500 -203",124:"160 -249Q138 -249 129 -225V250Q129 725 131 729Q139 750 159 750T190 725V-225Q181 -249 160 -249",125:"70 726Q71 744 74 747T99 750H106Q323 750 349 636L350 501Q350 486 350 470T350 441T350 416T350 394T351 378T351 367V363Q352 362 353 356T361 338T379 315Q403 294 433 285Q451 278 467 277T490 275T500 271T504 250T501 230T491 224T468 224T433 215Q403 206 379 185Q373 179 368 172T360 159T355 148T352 140L351 137V133Q351 129 351 122T351 106T350 85T350 59T350 31T350 0L349 -135L347 -145Q317 -250 106 -250H99Q79 -250 75 -247T70 -226Q70 -208 73 -204T95 -199Q193 -193 217 -145Q222 -134 223 -117T224 3Q224 20 224 48T223 86Q223 145 237 175T301 232Q335 249 347 249Q348 249 348 250L347 251Q343 252 336 254T309 264T275 284T245 316T225 363Q224 369 224 497T222 631Q216 660 182 678T95 699Q77 700 74 704T70 726",126:"343 202Q320 202 278 225T215 249Q181 249 146 214L134 202L115 219Q111 222 106 226T98 234L96 236Q158 306 165 313Q199 344 230 344Q239 344 244 343Q262 339 300 318T359 297Q393 297 428 332L440 344L459 327Q463 324 468 320T476 312L478 310Q416 240 409 233Q375 202 343 202",168:"96 615Q96 650 120 672T178 695Q214 693 234 669T255 615Q255 583 232 559T176 535Q147 535 122 556T96 615ZM319 615Q319 651 343 673T399 695Q426 695 452 675T478 615Q478 578 454 557T395 535Q364 537 342 559T319 615",172:"680 371Q683 369 688 366T695 361T698 356T701 346T701 332T702 308V216Q702 196 702 168T703 130Q703 90 697 76T671 61Q650 61 643 81Q641 86 641 198V310H364L87 311Q64 319 64 341Q64 362 84 369Q89 371 385 371H680",175:"80 540V607H494V540H80",176:"160 618Q160 653 193 677T279 702H284Q381 702 407 647Q414 634 414 618Q414 607 410 596T395 570T355 546T287 536T220 545T181 568T165 594T160 618ZM352 618Q352 645 341 652T301 659H292Q286 659 278 659T268 660Q247 660 236 653T224 638T222 619Q222 591 234 585T287 578Q315 578 326 580T345 590T352 618",177:"64 328T64 346T87 377H416V542L417 707Q431 728 443 728Q467 728 475 709Q477 704 477 540V377H807Q808 376 811 374T817 370T823 365T827 358T829 347Q829 326 807 317L642 316H477V25H807Q808 24 811 22T817 18T823 13T827 6T829 -5Q829 -26 807 -35H87Q64 -24 64 -6T87 25H416V316H251L87 317Q64 328 64 346",180:"391 706Q419 706 439 683T460 634Q460 608 441 593T366 550Q356 545 351 543L275 503L256 527Q236 552 237 553Q242 558 292 620Q299 629 309 641T324 659T336 673T346 685T354 693T363 699T371 703T380 705T391 706",183:"74 251Q74 286 99 311T156 336Q200 336 222 308T245 250Q245 221 224 194T160 166T96 193T74 251",215:"168 500Q168 515 178 522T195 530H198Q207 530 218 521T282 458Q312 428 331 409L447 294L563 409Q674 520 682 525Q687 529 695 529Q711 529 718 520T726 499V498Q726 489 720 481T666 427Q631 392 606 367L490 251L606 135Q717 23 721 17T726 2Q726 -9 719 -18T695 -28H692Q685 -28 674 -18T608 47Q581 74 563 92L447 207L331 91Q217 -22 208 -27Q206 -28 203 -28H197Q168 -28 168 2Q168 13 178 24T288 135L404 250L288 366Q177 479 173 485T168 500",247:"344 495Q344 535 372 566T447 597Q490 597 519 566T548 495Q548 452 518 423T446 393Q404 393 374 423T344 495ZM87 221Q64 230 64 251T84 279Q89 281 448 281H806Q807 280 810 278T816 274T822 269T826 262T828 251Q828 230 806 221H87ZM344 -36T344 6T373 78T446 108Q487 108 517 79T548 6Q548 -35 519 -65T446 -96Q406 -96 375 -66",305:"247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247",567:"28 -163Q58 -168 64 -168Q124 -168 135 -77Q137 -65 137 141T136 353Q132 371 120 377T72 385H52V408Q52 431 54 431L58 432Q62 432 70 432T87 433T108 434T133 436Q151 437 171 438T202 441T214 442H218V184Q217 -36 217 -59T211 -98Q195 -145 153 -175T58 -205Q9 -205 -23 -179T-55 -117Q-55 -94 -40 -79T-2 -64T36 -79T52 -118Q52 -143 28 -163",697:"240 563Q278 563 304 539T331 480V473Q331 462 316 431T217 236Q199 200 174 151T136 78T123 50Q113 33 105 33Q101 33 72 45T38 60Q35 63 35 65Q35 77 101 293T171 517Q182 542 202 552T240 563",710:"207 632L287 694Q289 693 368 632T448 570T431 545T413 520Q410 520 350 559L287 597L224 559Q164 520 161 520Q160 520 143 544T126 570T207 632",711:"131 603Q130 604 136 618T150 646T158 659L223 635L287 611L351 635L416 659Q417 660 424 647T437 619T443 603Q440 601 364 558T287 515T210 558T131 603",713:"80 540V607H494V540H80",714:"391 706Q419 706 439 683T460 634Q460 608 441 593T366 550Q356 545 351 543L275 503L256 527Q236 552 237 553Q242 558 292 620Q299 629 309 641T324 659T336 673T346 685T354 693T363 699T371 703T380 705T391 706",715:"114 634Q114 663 136 684T183 706Q191 706 196 705T208 700T219 693T232 681T245 666T262 645T282 620Q332 558 337 553Q338 552 318 527L299 503L223 543Q215 547 202 553T183 563T167 571T153 580T141 587T131 595T124 603T118 612T115 622T114 634",728:"287 500Q208 500 155 558T102 689V694H153V685Q153 681 154 674T164 648T186 615T226 590T287 578Q347 578 382 611T421 685V694H472V689Q472 623 422 562T287 500",729:"202 610Q202 647 227 671T283 695Q324 695 348 669T372 610T350 551T287 525Q248 525 225 551T202 610",730:"160 618Q160 653 193 677T279 702H284Q381 702 407 647Q414 634 414 618Q414 607 410 596T395 570T355 546T287 536T220 545T181 568T165 594T160 618ZM352 618Q352 645 341 652T301 659H292Q286 659 278 659T268 660Q247 660 236 653T224 638T222 619Q222 591 234 585T287 578Q315 578 326 580T345 590T352 618",732:"343 552Q320 552 278 575T215 599Q181 599 146 564L134 552L115 569Q111 572 106 576T98 584L96 586Q158 656 165 663Q199 694 230 694Q239 694 244 693Q262 689 300 668T359 647Q393 647 428 682L440 694L459 677Q463 674 468 670T476 662L478 660Q416 590 409 583Q375 552 343 552",768:"-461 634Q-461 663 -439 684T-392 706Q-384 706 -379 705T-367 700T-356 693T-343 681T-330 666T-313 645T-293 620Q-243 558 -238 553Q-237 552 -257 527L-276 503L-352 543Q-360 547 -373 553T-392 563T-408 571T-422 580T-434 587T-444 595T-451 603T-457 612T-460 622T-461 634",769:"-184 706Q-156 706 -136 683T-115 634Q-115 608 -134 593T-209 550Q-219 545 -224 543L-300 503L-319 527Q-339 552 -338 553Q-333 558 -283 620Q-276 629 -266 641T-251 659T-239 673T-229 685T-221 693T-212 699T-204 703T-195 705T-184 706",770:"-368 632L-288 694Q-286 693 -207 632T-127 570T-144 545T-162 520Q-165 520 -225 559L-288 597L-351 559Q-411 520 -414 520Q-415 520 -432 544T-449 570T-368 632",771:"-232 552Q-255 552 -297 575T-360 599Q-394 599 -429 564L-441 552L-460 569Q-464 572 -469 576T-476 584L-479 586Q-417 656 -410 663Q-376 694 -345 694Q-336 694 -331 693Q-313 689 -275 668T-216 647Q-182 647 -147 682L-135 694L-116 677Q-112 674 -107 670T-100 662L-97 660Q-159 590 -166 583Q-200 552 -232 552",772:"-495 540V607H-81V540H-495",774:"-288 500Q-367 500 -420 558T-473 689V694H-422V685Q-422 681 -421 674T-411 648T-389 615T-349 590T-288 578Q-228 578 -193 611T-154 685V694H-103V689Q-103 623 -153 562T-288 500",775:"-373 610Q-373 647 -348 671T-292 695Q-251 695 -227 669T-203 610T-225 551T-288 525Q-327 525 -350 551T-373 610",776:"-479 615Q-479 650 -456 672T-397 695Q-361 693 -341 669T-320 615Q-320 583 -343 559T-399 535Q-428 535 -453 556T-479 615ZM-256 615Q-256 651 -232 673T-176 695Q-149 695 -123 675T-97 615Q-97 578 -121 557T-180 535Q-211 537 -233 559T-256 615",778:"-415 618Q-415 653 -382 677T-296 702H-291Q-194 702 -168 647Q-161 634 -161 618Q-161 607 -165 596T-180 570T-220 546T-288 536T-355 545T-394 568T-410 594T-415 618ZM-223 618Q-223 645 -234 652T-274 659H-283Q-289 659 -297 659T-307 660Q-328 660 -339 653T-351 638T-353 619Q-353 591 -341 585T-288 578Q-260 578 -249 580T-230 590T-223 618",779:"-389 511L-442 543Q-442 544 -424 606T-404 674Q-390 705 -361 713Q-360 713 -356 713T-349 714Q-340 714 -330 712Q-273 690 -273 644Q-273 621 -290 604L-342 554L-389 511ZM-198 511L-251 543Q-251 544 -233 606T-213 674Q-199 705 -170 713Q-169 713 -165 713T-158 714Q-127 714 -105 693T-82 647Q-82 638 -84 631T-89 618T-99 604T-112 590T-130 574T-151 554L-198 511",780:"-444 603Q-445 604 -439 618T-425 646T-417 659L-352 635L-288 611L-224 635L-159 659Q-158 660 -151 647T-138 619T-132 603Q-135 601 -211 558T-288 515T-365 558T-444 603",824:"-705 -210Q-715 -210 -724 -203T-734 -179Q-734 -171 -732 -166Q-730 -163 -474 266T-215 698Q-208 711 -190 711Q-180 711 -171 704T-161 681Q-161 672 -164 667Q-171 654 -425 228T-683 -201Q-692 -210 -705 -210",8194:"",8195:"",8196:"",8197:"",8198:"",8201:"",8202:"",8211:"0 249V300H574V249H0",8212:"0 249V300H1149V249H0",8213:"0 249V300H1149V249H0",8214:"205 -225Q201 -234 199 -237T191 -244T175 -248T161 -246Q151 -240 146 -229Q145 -224 145 251Q145 725 146 730Q156 750 176 750Q193 748 205 727V-225ZM369 727L372 732Q375 737 377 740T385 747T398 750Q406 750 413 747Q423 740 428 730Q430 720 430 251Q430 -219 428 -229Q423 -240 413 -246Q408 -248 400 -248Q393 -248 388 -247T379 -242T375 -236T371 -230L369 -225V727",8215:"0 -61V-10H574V-61H0",8216:"58 461Q58 503 70 542T99 607T134 654T165 684T184 694T201 683T213 664Q213 658 202 648T175 624T143 583T116 518Q115 512 114 505T112 493L111 488Q132 500 161 500Q198 500 221 475T245 414T222 354T161 329Q112 329 85 369T58 461",8217:"74 572T74 608T97 669T157 694Q203 694 232 657T261 559Q261 520 250 482T222 418T187 370T155 339T135 329Q128 329 117 340T106 359Q106 365 117 375T144 399T176 440T203 505Q204 511 205 518T208 530V535L202 532Q196 530 184 527T158 523Q121 523 98 547",8220:"110 461Q110 502 121 541T150 606T185 653T217 684T235 694Q242 694 254 682T266 664Q266 659 254 648T226 623T193 578T167 511Q164 500 164 494T164 487Q188 500 212 500Q251 500 274 475T297 414Q297 378 274 354T212 329Q167 329 139 367T110 461ZM377 461Q377 502 388 541T417 606T452 653T484 684T502 694Q509 694 521 682T533 664Q533 659 521 648T493 623T460 578T434 511Q431 500 431 494T431 487Q455 500 479 500Q518 500 541 475T564 414Q564 378 541 354T479 329Q434 329 406 367T377 461",8221:"38 572T38 608T61 669T121 694Q167 694 196 657T225 559Q225 520 214 482T186 418T151 370T119 339T99 329T82 340T70 360Q70 365 74 369T92 385T122 414Q142 441 154 471T170 518L172 535L166 532Q160 530 148 527T122 523Q85 523 62 547ZM305 572T305 608T328 669T388 694Q434 694 463 657T492 559Q492 520 481 482T453 418T418 370T386 339T366 329T349 340T337 360Q337 365 341 369T359 385T389 414Q409 441 421 471T436 518L439 535L433 532Q427 530 415 527T389 523Q352 523 329 547",8224:"231 470Q232 471 232 473Q232 477 213 540T193 636Q192 642 192 651T204 677T239 700Q249 702 255 702Q300 702 315 660Q317 653 317 636Q317 603 298 539T279 472V470Q280 470 318 488T383 506Q408 506 423 493T442 467T446 444T443 421T424 396T383 382Q355 382 318 400T279 418Q278 416 285 392T303 334T316 284Q318 268 318 234Q318 149 311 45T296 -127T284 -203Q279 -211 255 -211Q237 -211 233 -210T226 -203Q222 -195 214 -129T199 41T192 234V245Q192 286 212 349Q233 413 231 418Q229 418 192 400T128 382Q102 382 86 396T67 421T64 444T67 466T86 492T128 506Q155 506 192 488T231 470",8225:"193 637Q193 663 206 679T231 698T255 702T279 699T304 679T317 637Q317 605 299 557T280 504Q280 503 281 503T320 521T382 539Q410 539 428 521T446 476Q446 454 432 434T383 414H377Q358 414 320 431T281 449L280 448Q280 444 298 396T317 316Q318 310 318 301T306 275T271 252Q261 250 255 250Q210 250 195 292Q193 299 193 316Q193 347 211 395T230 448Q230 449 229 449Q227 449 196 434Q151 414 133 414H127Q102 414 87 427T68 452T64 477Q64 503 81 521T127 539Q143 539 164 532T204 515T226 504Q230 502 230 504Q230 508 212 556T193 637ZM193 184Q193 210 206 226T231 245T255 249T279 246T304 226T317 184Q317 153 299 106T280 53Q280 51 282 51T322 68T383 86Q411 86 428 69T445 24T428 -21T382 -39Q358 -39 322 -22T282 -4Q280 -3 280 -3T280 -6Q281 -13 299 -59T317 -136Q318 -142 318 -151T306 -177T271 -200Q261 -202 255 -202Q210 -202 195 -160Q193 -153 193 -136Q193 -106 211 -60T230 -6Q230 -4 228 -4T188 -21T128 -39Q100 -39 83 -22T65 24Q65 53 82 69T127 86Q150 86 187 69T228 51Q230 50 230 50T230 53Q229 58 211 105T193 184",8226:"64 251Q64 303 80 344T121 409T175 448T230 469T275 474Q277 474 283 474T292 473Q385 473 447 415T510 251Q510 149 449 89T287 28T126 88T64 251",8230:"74 85Q74 121 99 146T156 171Q200 171 222 143T245 85Q245 56 224 29T160 1Q118 1 96 27T74 85ZM562 85Q562 121 587 146T644 171Q688 171 710 143T733 85Q733 56 712 29T648 1Q606 1 584 27T562 85ZM1050 85Q1050 121 1075 146T1132 171Q1176 171 1198 143T1221 85Q1221 56 1200 29T1136 1Q1094 1 1072 27T1050 85",8242:"240 563Q278 563 304 539T331 480V473Q331 462 316 431T217 236Q199 200 174 151T136 78T123 50Q113 33 105 33Q101 33 72 45T38 60Q35 63 35 65Q35 77 101 293T171 517Q182 542 202 552T240 563",8254:"80 540V607H494V540H80",8260:"451 730Q460 750 479 750Q492 750 501 740T510 718Q508 708 318 244L122 -232Q112 -250 95 -250Q82 -250 73 -241T64 -218Q66 -205 258 261T451 730",8407:"406 694Q406 704 413 713T433 723Q448 723 454 719T467 701Q483 665 522 648Q542 637 542 619Q542 605 536 599T514 586Q468 569 431 532Q411 513 399 513Q386 513 378 522T369 543Q369 557 381 568Q385 572 387 574L400 588H228L56 589Q33 598 33 618Q33 636 56 649H426Q406 676 406 694",8463:"477 56Q477 48 479 46T490 43Q522 45 544 75T577 140Q582 156 585 159T605 162H611H622Q642 162 642 148Q642 138 632 114T602 62T550 13T478 -8Q429 -8 394 17T358 83Q358 95 395 199T433 350Q433 400 394 400H388H383Q335 400 291 363Q256 332 236 298Q233 293 202 170T169 40Q160 18 141 5T99 -8Q70 -8 58 9T45 39Q45 51 116 336L167 540H80V607H184L188 622H184Q183 622 179 622T169 623T157 624T146 624T136 624T131 625Q119 628 119 642Q119 647 123 661T129 679Q133 684 142 685T220 690Q293 694 307 694Q324 694 328 679Q328 673 311 607H494V540H294Q286 507 278 473T264 420L260 403Q260 400 269 408Q327 451 393 451H401H410Q425 451 439 450T476 442T515 424T544 391T556 337Q556 286 517 179T477 56",8467:"245 -19Q228 -19 212 -16T184 -6T162 9T143 27T129 46T118 66T111 84T106 99T102 111L101 116L69 89L36 62Q31 60 24 62Q-1 88 -1 98Q-1 101 1 105Q1 106 73 170L95 189V197Q95 242 112 317T159 476T241 624T353 701Q357 702 367 702Q428 702 444 641Q446 630 446 606Q446 454 241 246L215 220L212 203Q203 150 203 114Q203 113 203 106T204 95T205 82T209 67T214 54T223 43T236 35T253 32Q277 32 305 44T352 70T389 98T407 112Q409 113 412 113Q420 113 432 95Q445 77 443 70Q440 64 416 44T342 3T245 -19ZM387 615Q387 651 366 651Q342 651 321 604T276 470L241 331Q246 331 280 373T350 486T387 615",8472:"399 159Q410 159 421 151T433 126Q433 104 410 85Q408 84 410 78Q411 72 414 66T428 51T455 43Q483 43 506 55T543 83T568 125T584 166T594 206Q595 211 596 214Q610 273 610 301Q610 365 542 365H538Q483 365 429 344T337 292T269 229T225 175T210 150L255 99Q261 92 274 78T292 58T305 41T316 22T321 3T324 -23Q324 -87 283 -148T174 -210H171Q161 -210 152 -209T128 -201T101 -180T81 -141T72 -78Q72 -72 72 -60T73 -45Q79 4 102 65L108 81Q84 117 84 167Q84 273 140 367T269 461Q285 461 285 447Q285 440 282 431Q278 418 276 415T264 410Q228 404 201 336T174 219Q174 218 176 202L184 214Q252 303 348 360T549 417Q614 417 658 391T719 317Q726 292 726 260Q726 148 646 70T451 -8Q407 -8 377 17T346 92Q346 159 396 159H399ZM178 -160Q200 -160 216 -132T232 -75Q232 -63 228 -56T203 -26Q196 -18 192 -14Q185 -5 176 5T161 20T156 27L153 28Q151 28 146 8T137 -42T132 -89Q132 -160 178 -160",8501:"590 427Q581 427 579 433T575 450T568 470V468L532 288L541 281Q620 220 634 165L637 154V124Q637 74 628 46Q623 32 612 16T592 0Q580 0 578 19T569 69T538 121Q532 126 385 240T236 355Q234 355 231 338T225 291T222 237Q222 222 223 213T225 201T228 195T231 190Q238 179 261 160T300 119T316 73Q316 41 291 23T231 1Q226 0 149 0H98Q73 0 69 3T64 24Q64 43 67 47T85 51H89Q119 51 134 55T152 64T154 76Q154 95 125 141T96 220Q96 243 104 270T123 319T145 360T164 391T172 404T150 421T102 468T68 529L65 541V570Q65 620 74 648Q79 664 91 679T111 694Q122 694 123 675T132 625T164 573Q168 569 319 452T471 335Q471 337 486 409T502 488Q502 489 491 493T467 511T448 546V573Q448 602 452 624T462 659T474 680T486 691T493 694Q499 694 502 691T507 682T513 673Q517 667 534 651T557 630Q558 629 590 616T631 587Q638 577 638 543Q637 489 622 458T590 427",8592:"1063 281Q1084 268 1084 251Q1084 231 1063 221L649 220H235Q340 133 364 17Q368 1 368 -2Q368 -16 343 -17Q340 -17 338 -17H332Q317 -17 314 -14T305 6Q298 34 285 62T247 126T179 189T78 233Q64 237 64 251Q64 261 74 265T108 277T154 297Q212 328 251 379T305 495Q309 511 313 514T333 518H338Q363 517 367 510Q368 507 368 503Q368 500 364 484Q345 401 287 331Q254 295 235 282L649 281H1063",8593:"33 396Q14 396 14 423Q14 445 18 449T41 459Q72 466 99 478T147 505T185 537T215 571T238 604T254 635T264 661T270 678L272 685Q276 694 288 694Q298 692 300 689T307 672Q331 592 392 535T535 459Q553 454 557 450T561 423Q561 396 542 396Q531 396 501 405T418 443T329 517L319 529L318 179V-171Q307 -193 288 -193Q265 -193 258 -171L257 179V529L247 517Q209 473 158 444T76 405T33 396",8594:"65 251Q65 270 87 281H500L914 282Q881 304 842 357T785 482Q781 500 781 501Q781 512 792 517Q794 518 812 518H817Q832 518 835 515T844 495Q864 412 923 351T1065 270Q1085 263 1085 251Q1085 240 1077 236T1044 225T995 204Q937 173 898 122T844 6Q840 -10 836 -13T816 -17H811Q786 -16 782 -9Q781 -6 781 -2Q781 1 785 17Q813 138 914 220H500L87 221Q65 228 65 251",8595:"14 77Q14 104 33 104Q44 104 74 96T156 57T247 -17L257 -29V321Q257 669 259 675Q268 694 289 694Q295 693 300 691T307 686T313 679T318 672V321L319 -29L329 -17Q366 26 417 55T499 94T542 104Q561 104 561 77Q561 56 557 51T535 41Q481 28 438 0T370 -58T330 -119T308 -167T302 -187Q297 -194 288 -194Q278 -194 273 -186T265 -165T251 -127T220 -77Q151 15 41 41Q22 46 18 50T14 77",8596:"305 495Q309 511 313 514T333 518H338Q363 517 367 510Q368 507 368 503Q368 500 364 484Q345 401 287 331Q254 295 235 282L404 281H744L914 282Q880 305 839 362T785 484Q781 500 781 503Q781 517 806 518Q809 518 811 518H817Q832 518 835 515T844 495Q864 412 923 351T1065 270Q1085 263 1085 251Q1085 240 1077 236T1044 225T995 204Q937 173 898 122T844 6Q840 -10 836 -13T816 -17H811Q786 -16 782 -9Q781 -6 781 -2Q781 1 785 17Q813 138 914 220H235Q340 133 364 17Q368 1 368 -2Q368 -16 343 -17Q340 -17 338 -17H332Q317 -17 314 -14T305 6Q298 34 285 62T247 126T179 189T78 233Q64 237 64 251Q64 261 74 265T108 277T154 297Q212 328 251 379T305 495",8597:"33 469Q14 469 14 496Q14 518 18 522T41 532Q121 551 182 608T268 745Q275 767 288 767Q299 767 303 755T320 713T355 650Q424 558 535 532Q553 527 557 523T561 496Q561 469 542 469Q531 469 501 478T418 516T329 590L319 602L318 426V74L319 -102L329 -90Q366 -47 417 -18T499 21T542 31Q561 31 561 4Q561 -17 557 -22T535 -32Q454 -51 393 -108T307 -245Q300 -267 288 -267Q279 -267 274 -259T266 -238T250 -200T220 -150Q151 -58 41 -32Q22 -27 18 -23T14 4Q14 31 33 31Q44 31 74 23T156 -16T247 -90L257 -102V602L247 590Q209 546 158 517T76 478T33 469",8598:"429 724Q438 724 452 711T466 690Q466 681 452 671Q361 602 242 599H218L756 135Q832 69 913 -1T1036 -108L1077 -143Q1084 -151 1084 -163Q1084 -180 1074 -187T1054 -194H1052Q1043 -194 939 -105Q866 -42 812 5Q180 549 178 549V546Q179 542 179 539Q183 520 183 483Q183 435 172 390T149 323T130 296Q121 292 115 295Q85 312 85 328Q85 331 95 350T115 406T125 486Q125 540 110 583T79 648T64 675Q64 681 68 687T81 693Q87 693 94 690Q162 657 232 657Q296 657 349 681T420 722Q422 724 429 724",8599:"1069 693Q1076 693 1080 687T1085 675Q1085 671 1076 656T1055 621T1034 565T1024 486Q1024 442 1034 406T1054 351T1064 328Q1064 321 1057 313T1042 300L1034 295Q1030 293 1027 293Q1023 293 1020 295T1014 301T1009 308T1005 316T1001 324Q980 368 971 419Q966 442 966 484V492Q966 528 972 553Q971 553 757 368T328 -3T107 -191Q103 -193 94 -193Q78 -193 71 -184T64 -164Q64 -153 72 -143Q79 -136 382 124L934 599H909Q837 599 760 634T683 690Q683 697 696 710T722 724Q726 724 742 714T779 691T838 668T920 657Q959 657 991 666T1043 684T1069 693",8600:"65 663Q65 680 74 687T93 694H96Q104 694 118 683T204 610Q280 545 338 495Q969 -49 971 -49L970 -46Q970 -42 970 -39Q966 -20 966 18Q966 65 977 110T1001 177T1019 204Q1028 208 1034 205Q1064 188 1064 172Q1064 169 1054 150T1034 94T1024 14Q1024 -28 1033 -64T1054 -120T1075 -155T1085 -175Q1085 -181 1081 -187T1068 -193Q1062 -193 1055 -190Q987 -157 919 -157Q817 -157 739 -215Q727 -224 720 -224Q712 -224 697 -210Q683 -199 683 -190T697 -171Q788 -102 907 -99H931L393 365Q317 431 236 501T114 608L72 643Q65 651 65 663",8601:"80 -193Q73 -193 69 -187T64 -175Q64 -172 79 -150T109 -84T125 14Q125 58 115 94T95 149T85 172Q85 179 92 187T108 200L115 205Q119 207 122 207Q126 207 129 205T135 199T140 192T144 184T148 176Q169 132 178 81Q183 58 183 17Q183 -7 182 -24T178 -48L177 -53Q178 -53 389 129T816 498T1043 692Q1049 694 1054 694Q1070 694 1077 684T1085 664Q1085 653 1077 643Q1070 636 767 376L215 -98L240 -99Q312 -99 389 -134T466 -190Q466 -197 452 -210T429 -224Q422 -224 411 -215Q330 -157 229 -157Q190 -157 158 -166T106 -184T80 -193",8614:"65 426Q74 448 95 448Q112 448 125 426V281H500L914 282Q881 304 842 357T785 482Q781 500 781 501Q781 512 792 517Q794 518 812 518H817Q832 518 835 515T844 495Q864 412 923 351T1065 270Q1085 263 1085 251Q1085 240 1077 236T1044 225T995 204Q937 173 898 122T844 6Q840 -10 836 -13T816 -17H811Q786 -16 782 -9Q781 -6 781 -2Q781 1 785 17Q813 138 914 220H500L135 221Q134 221 133 221T130 220H125V76Q115 54 95 54Q73 54 65 76V426",8617:"1029 475Q1029 505 1068 505Q1129 501 1173 463T1218 363Q1218 296 1170 259T1066 221H1063L649 220H235Q340 133 364 17Q368 1 368 -2Q368 -16 343 -17Q340 -17 338 -17H332Q317 -17 314 -14T305 6Q298 34 285 62T247 126T179 189T78 233Q64 237 64 251Q64 261 74 265T108 277T154 297Q212 328 251 379T305 495Q309 511 313 514T333 518H338Q363 517 367 510Q368 507 368 503Q368 500 364 484Q345 401 287 331Q254 295 235 282L649 281H1063Q1105 284 1131 305T1158 361Q1158 385 1146 401Q1122 441 1063 444Q1029 446 1029 475",8618:"225 221H218Q159 221 112 260T65 363Q65 431 116 468T221 505Q254 503 254 474Q254 456 245 450T216 443T188 438Q152 427 137 401Q125 385 125 362Q125 334 147 310Q171 288 221 281H632L1046 282Q1013 304 974 357T917 482Q913 500 913 501Q913 512 924 517Q926 518 944 518H949Q964 518 967 515T976 495Q996 412 1055 351T1197 270Q1217 263 1217 251Q1217 240 1209 236T1176 225T1127 204Q1069 173 1030 122T976 6Q972 -10 968 -13T948 -17H943Q918 -16 914 -9Q913 -6 913 -2Q913 1 917 17Q945 138 1046 220H632L225 221",8636:"1063 281Q1084 268 1084 251Q1084 231 1063 221L572 220Q79 220 77 221Q64 225 64 244Q64 250 64 254T67 261T71 265T78 268T85 272Q142 302 189 345T258 421T296 484T315 516Q319 518 337 518Q358 518 363 512Q370 504 367 496Q360 469 319 404T219 290L209 282L636 281H1063",8637:"1063 281Q1084 268 1084 251Q1084 231 1063 221L636 220H209L219 212Q278 162 319 97T367 5Q370 -3 363 -11Q358 -17 337 -17H332Q318 -17 314 -14T302 7Q278 55 246 95T185 160T130 202T88 228L70 237Q64 243 64 257Q64 274 75 279Q78 281 571 281H1063",8640:"65 251Q65 270 87 281H513L940 282L930 290Q871 338 830 403T782 496Q779 510 791 517Q794 518 812 518H817Q831 518 835 515T847 494Q871 445 903 404T966 338T1022 298T1064 272T1083 259Q1085 255 1085 245Q1085 225 1072 221Q1070 220 578 220L87 221Q65 228 65 251",8641:"84 279Q89 281 580 281Q1070 281 1074 279Q1085 275 1085 256Q1085 245 1083 241T1066 230Q919 153 847 7Q839 -11 835 -14T817 -17H812Q791 -17 786 -11Q779 -3 782 5Q789 31 830 96T930 212L940 220H513L87 221Q64 229 64 250Q64 272 84 279",8652:"65 451Q65 470 87 481H513L940 482L930 490Q871 538 830 603T782 696Q779 710 791 717Q794 718 812 718H817Q831 718 835 715T847 694Q871 645 903 604T966 538T1022 498T1064 472T1083 459Q1085 455 1085 445Q1085 425 1072 421Q1070 420 578 420L87 421Q65 428 65 451ZM1063 281Q1084 268 1084 251Q1084 231 1063 221L636 220H209L219 212Q278 162 319 97T367 5Q370 -3 363 -11Q358 -17 337 -17H332Q318 -17 314 -14T302 7Q278 55 246 95T185 160T130 202T88 228L70 237Q64 243 64 257Q64 274 75 279Q78 281 571 281H1063",8656:"1063 169L1068 166Q1072 163 1074 162T1079 157T1083 149T1085 139Q1085 118 1063 109L733 108H404L412 99Q455 50 488 -10Q498 -27 493 -37Q487 -46 465 -46H460Q446 -46 439 -39T426 -18T399 25T344 89Q239 194 99 229Q96 230 92 231T85 232T79 234T73 235T69 237T66 240T65 244T64 250Q64 267 90 271Q197 295 286 361T430 525Q439 542 442 544T460 547H465Q487 547 492 539Q496 531 496 530Q496 521 471 482T414 405L404 394L733 393H1063Q1064 392 1069 389T1076 384T1082 375T1085 362Q1085 344 1063 333L700 332H338L324 321Q283 290 230 264L205 250Q266 224 323 180L338 170L700 169H1063",8657:"672 343Q672 326 670 320T657 313Q644 313 602 335Q577 349 557 361T527 381T509 395T499 403T495 406T494 118Q494 -166 492 -174Q484 -193 465 -193H463Q456 -193 453 -192T444 -186T433 -170V465L423 477Q407 495 394 514T367 554T351 579Q349 576 339 560T313 520T279 477L269 465V-22V-102Q269 -132 269 -145T268 -169T266 -180T260 -185T253 -191Q248 -193 239 -193H237Q218 -193 210 -174Q208 -166 208 118Q208 406 207 406L199 399Q191 392 165 374T100 335Q58 313 45 313Q35 313 33 319T30 343V349Q30 359 30 362T35 369T45 374T66 383T100 401Q267 499 333 680Q339 694 351 694Q361 694 365 687T380 652T407 597Q442 536 489 489T573 420T638 383T670 365Q672 361 672 343",8658:"64 362Q64 380 87 393H416L745 394L735 405Q708 436 681 477T654 531Q654 547 679 547H684H689Q703 547 710 540T723 519T750 475T806 411Q914 303 1059 271Q1060 271 1063 270T1068 269T1072 268T1076 266T1079 264T1082 260T1083 256T1084 250Q1084 242 1080 238T1063 231T1035 225T992 211T934 185Q797 112 719 -24Q710 -40 706 -43T689 -46H684Q653 -46 653 -31Q653 -24 661 -10Q694 50 737 99L745 108H416L87 109Q64 117 64 139Q64 156 87 169H449L812 170L826 180Q842 193 860 204T892 223T918 237T937 246L944 250L919 264Q866 290 825 321L811 332H449L87 333Q64 343 64 362",8659:"30 157Q30 174 32 180T46 187Q59 187 104 163Q154 136 198 101L207 94Q208 94 208 382Q208 666 210 674Q219 694 241 694Q254 692 262 683Q266 679 267 674Q269 658 269 522V35L279 23Q295 5 308 -14T335 -54T351 -79Q353 -76 363 -60T389 -20T423 23L433 35V671Q439 682 444 686T452 692T463 693H465Q484 693 492 674Q494 666 494 382Q494 94 495 94L504 101Q547 135 593 160T652 187Q665 191 671 177Q672 175 672 157Q672 137 669 134T636 116Q606 101 578 83T528 47T486 9T452 -30T424 -68T403 -103T387 -134T377 -159T370 -176L367 -184Q360 -194 351 -194Q345 -194 342 -192T334 -182T327 -166T315 -137T295 -97Q260 -36 213 11T129 80T63 117T32 136Q30 139 30 157",8660:"336 497Q358 541 363 544Q367 547 379 547H384Q401 547 405 545Q418 538 414 525T389 474T346 408L335 393H814L803 408Q781 436 760 474T735 525T744 545Q748 547 765 547Q771 547 774 547T780 546T786 544T790 541T794 535T799 527T805 514T813 497Q841 446 877 406T950 340T1014 301T1068 276L1096 265Q1102 259 1102 251Q1102 240 1085 232Q981 195 902 121Q835 56 798 -25Q791 -40 787 -43T765 -46T744 -44Q735 -40 735 -30Q735 -15 760 28T806 98L814 108H335L343 98Q361 75 378 46T404 -1T414 -24Q418 -37 405 -44Q401 -46 384 -46T363 -43T351 -25Q314 56 247 121Q216 150 182 173T125 206T79 226T53 237Q47 243 47 251Q47 254 47 256T49 261T52 264T57 267T61 268T66 270T71 272Q246 335 336 497ZM985 251Q932 280 882 323L871 332H278Q264 321 253 311T237 297T214 282T164 251L176 244Q221 218 278 169H871Q928 218 973 244L985 251",8661:"49 441Q30 441 30 464V471V480Q30 498 44 502Q237 573 331 750Q337 767 351 767Q360 767 368 753T400 702T460 629Q504 584 552 554T632 511T666 497Q672 493 672 471Q672 454 670 449Q664 441 653 441Q639 443 591 465T508 513L495 522L494 386V114L495 -22L508 -13Q543 12 591 34T653 59Q672 59 672 36V29V20Q672 2 658 -2Q465 -71 367 -257Q360 -267 351 -267Q343 -267 336 -257T320 -231T292 -187T242 -129Q198 -84 150 -54T70 -11T36 3Q30 7 30 29Q30 46 32 51Q38 59 49 59Q63 57 111 35T194 -13L208 -22V522L194 513Q159 488 111 466T49 441ZM422 584Q411 594 400 606T383 626T366 648T351 667Q349 665 339 652T314 620T280 584L269 573V-73L280 -84Q305 -108 351 -166Q353 -164 363 -151T389 -119T422 -84L433 -73V573L422 584",8704:"1 664Q-2 685 23 693H27Q46 693 54 680T102 578L148 475H492L533 570Q541 586 548 603T560 630T569 650T576 667T582 678T588 686T594 691T600 693T609 694Q622 694 631 684T639 662Q637 653 492 325T341 -8Q333 -16 320 -16Q306 -16 298 -8Q294 -4 147 326L1 656V664ZM464 414H319Q175 414 175 413L319 88L464 414",8707:"81 347Q81 359 84 363T104 378H513V633H300L87 634Q64 642 64 664Q64 685 84 692Q89 694 321 694H552Q571 681 574 669V25Q567 7 552 1H87Q64 12 64 30T87 61H513V317H308Q103 317 99 319Q81 328 81 347",8709:"285 711Q307 711 326 708T357 701T370 698Q371 698 375 710T383 735T389 750Q395 767 415 767Q431 767 438 757T446 738T436 701T426 670Q426 668 433 664Q468 633 489 588Q511 542 519 488T528 344Q528 286 524 243T508 150T466 63T394 6Q345 -17 287 -17Q265 -17 246 -14T216 -7T203 -4Q191 -47 183 -60T159 -73Q146 -73 137 -63T128 -44Q128 -38 138 -7L148 24L141 30Q134 35 120 49Q94 77 78 113T56 194T48 268T46 344Q46 388 47 416T56 494T78 577T122 644T194 694Q239 711 285 711ZM351 639Q350 639 346 642T337 648T325 654T306 658T283 660Q254 660 221 638T181 567Q171 513 171 375Q171 164 182 129L351 639ZM402 356Q402 516 395 555Q395 557 395 559T394 563T394 566L393 568L223 57Q252 34 286 34H288Q318 34 346 53T387 109Q402 152 402 329V356",8710:"901 12Q901 7 892 0H479Q65 0 62 2Q56 6 56 11Q56 14 242 347T433 685Q438 694 450 696Q454 698 480 698H506L523 687Q526 683 711 354T899 17Q901 13 901 12ZM653 137L427 538L202 137L315 136H540L653 137",8712:"97 251Q97 393 194 484T417 586Q418 586 436 586T482 586T538 587H648Q649 586 652 584T658 580T664 575T668 568T670 557Q670 536 648 527L534 526Q515 526 491 526T457 526T435 526T417 525T404 523T390 521T374 517Q298 498 243 447T167 324Q159 295 159 283Q159 281 403 281H648Q649 280 652 278T658 274T664 269T668 262T670 251Q670 230 648 221L403 220Q159 220 159 218Q159 206 166 182T190 122T247 50T341 -6Q380 -20 405 -22T534 -25H648Q649 -26 654 -29T661 -34T667 -43T670 -56Q670 -74 648 -85L541 -86Q419 -86 396 -82Q276 -65 187 24T97 251",8713:"126 -210Q116 -210 107 -203T97 -179Q97 -171 99 -166Q99 -165 111 -145T150 -80T203 8Q97 104 97 251Q97 393 194 484T417 586Q418 586 436 586T482 586T538 587H549Q565 614 582 643T608 685L616 698Q623 711 641 711Q651 711 660 704T670 681Q670 672 667 667Q666 666 661 657T644 627T620 587H648Q649 586 652 584T658 580T664 575T668 568T670 557Q670 536 648 527L584 526L437 281H648Q649 280 652 278T658 274T664 269T668 262T670 251Q670 230 648 221L403 220H401L283 23Q311 5 341 -6Q380 -20 405 -22T534 -25H648Q649 -26 654 -29T661 -34T667 -43T670 -56Q670 -74 648 -85L541 -86Q419 -86 396 -82Q320 -71 252 -29Q152 -197 148 -201Q139 -210 126 -210ZM235 62L330 220Q159 219 159 218Q159 196 176 150T235 62ZM366 281L513 526Q503 526 487 526T465 526T448 525T433 525T422 525T412 524T403 523T394 521T385 519T374 517Q298 498 243 447T167 324Q159 295 159 283Q159 281 366 281",8715:"96 251Q96 268 119 281H363Q607 281 607 283Q607 295 600 319T576 379T519 451T425 507Q386 521 361 523T233 526L119 527Q96 535 96 557Q96 578 116 585Q121 587 229 587Q238 587 257 587T288 588Q366 588 435 568T568 488Q670 388 670 251Q670 155 621 78T499 -39T345 -85Q336 -86 225 -86L119 -85Q96 -77 96 -55Q96 -38 119 -25H233Q356 -24 371 -21Q373 -21 393 -16Q468 3 523 55T599 177Q607 206 607 218Q607 220 363 220L119 221Q96 229 96 251",8722:"119 221Q96 230 96 251T116 279Q121 281 448 281H775Q776 280 779 278T785 274T791 269T795 262T797 251Q797 230 775 221H119",8723:"64 155Q64 172 87 185H416V476H251L87 477Q64 485 64 507Q64 528 84 535Q89 537 448 537H807Q808 536 811 534T817 530T823 525T827 518T829 507Q829 486 807 477L642 476H477V185H807Q808 184 811 182T817 178T823 173T827 166T829 155Q829 134 807 125L642 124H477V-39Q477 -203 475 -208Q466 -227 446 -227Q427 -227 417 -205L416 -41V124H251L87 125Q64 133 64 155",8725:"451 730Q460 750 479 750Q492 750 501 740T510 718Q508 708 318 244L122 -232Q112 -250 95 -250Q82 -250 73 -241T64 -218Q66 -205 258 261T451 730",8726:"64 718Q63 731 72 740T94 750Q106 750 113 743Q118 741 122 732L318 256Q508 -208 510 -218Q511 -231 502 -240T480 -250Q460 -250 451 -230Q451 -229 259 238T64 718",8727:"236 431Q237 447 251 459T287 472T323 459T338 431Q338 423 328 363L317 300Q318 300 340 317T392 356T435 387Q442 390 450 390Q470 390 485 374T501 335Q501 326 500 320T494 309T486 300T473 293T458 287T438 280T414 272L353 250L414 228Q422 225 436 221T457 214T472 208T485 201T493 192T499 181T501 166Q501 141 484 126T450 111Q447 111 445 111T441 111T437 112T433 114T428 117T422 121T414 127T404 135T391 145T374 158L317 200L328 137Q338 77 338 69Q336 52 321 40T287 28T253 40T236 69Q236 77 246 137L257 200Q256 200 234 183T182 144T139 113Q132 110 124 110Q104 110 89 126T73 165Q73 174 74 180T80 191T88 200T101 207T116 213T136 220T160 228L221 250L160 272Q152 275 138 279T117 286T102 292T89 299T81 308T75 319T73 334Q73 359 90 374T124 389Q127 389 129 389T133 389T137 388T141 386T146 383T152 379T160 373T170 365T183 355T200 342L257 300L246 363Q236 423 236 431",8728:"64 251Q64 303 80 344T121 409T175 448T230 469T275 474Q277 474 283 474T292 473Q385 473 447 415T510 251Q510 149 449 89T287 28T126 88T64 251ZM448 251Q448 325 405 369T286 413Q215 413 171 371T126 251Q126 177 168 133T287 89Q361 89 404 132T448 251",8729:"64 251Q64 303 80 344T121 409T175 448T230 469T275 474Q277 474 283 474T292 473Q385 473 447 415T510 251Q510 149 449 89T287 28T126 88T64 251",8730:"107 178Q100 178 89 188T78 207Q78 216 84 220Q85 221 124 248T207 304T260 338Q269 340 275 335Q276 334 370 156L463 -20L698 393Q928 800 935 811Q944 820 954 820Q972 820 980 811T988 789Q988 781 858 553Q776 409 718 306Q452 -166 447 -171Q439 -179 422 -180Q405 -180 400 -175Q399 -174 346 -73T241 128T187 229L151 205Q111 178 107 178",8733:"65 222Q65 282 88 329T144 401T208 438T261 451H273Q312 451 320 450Q456 431 526 330L537 316Q638 451 778 451Q813 451 830 445V388Q821 391 799 391Q758 391 721 377T660 342T618 301T592 266L584 251Q648 152 697 114Q748 74 804 74H806Q823 74 829 77Q830 77 830 38V-1L820 -3Q801 -7 786 -7H771Q699 -7 632 25T527 114L516 128Q414 -8 276 -8Q192 -8 129 56T65 222ZM256 53Q296 53 332 67T392 102T434 143T461 178L469 193Q405 292 356 330Q308 369 251 369H243Q196 369 156 328T116 221Q116 191 124 161T158 99T225 55Q234 53 256 53",8734:"65 219Q65 318 132 385T302 452Q473 452 573 331L589 312L596 320Q710 452 857 452Q948 452 1016 386T1084 225Q1084 125 1017 59T848 -8Q679 -8 576 113L560 132L553 124Q439 -8 292 -8Q200 -8 133 58T65 219ZM1033 224Q1033 291 987 340T875 389Q748 389 648 261Q641 253 642 251Q717 163 748 137Q813 81 880 81Q941 81 987 120T1033 224ZM275 56Q315 56 353 70T418 104T466 144T497 178L507 192Q507 193 474 230T441 269Q355 362 267 362Q210 362 163 324T116 221Q116 150 162 103T275 56",8736:"71 0L68 2Q65 3 63 5T58 11T55 20Q55 21 56 23V25Q55 27 55 30Q55 31 56 33V35Q55 37 55 40Q55 42 57 48Q67 63 346 381Q421 467 518 578Q607 680 623 697T647 714Q656 714 661 708T666 694V692Q676 687 676 674Q676 668 673 663Q672 662 637 622T534 503T400 350L147 61L386 60H653Q666 50 666 40V38Q676 31 676 20Q676 8 661 0H71",8739:"160 -249Q138 -249 129 -225V250Q129 725 131 729Q139 750 159 750T190 725V-225Q181 -249 160 -249",8741:"205 -225Q201 -234 199 -237T191 -244T175 -248T161 -246Q151 -240 146 -229Q145 -224 145 251Q145 725 146 730Q156 750 176 750Q193 748 205 727V-225ZM369 727L372 732Q375 737 377 740T385 747T398 750Q406 750 413 747Q423 740 428 730Q430 720 430 251Q430 -219 428 -229Q423 -240 413 -246Q408 -248 400 -248Q393 -248 388 -247T379 -242T375 -236T371 -230L369 -225V727",8743:"95 -16Q78 -16 71 -6T64 14Q64 20 65 22L212 308Q359 593 361 595Q370 604 385 604Q398 602 405 595Q407 593 554 308L701 22Q702 20 702 15Q702 1 693 -8T671 -17Q661 -17 651 -9Q647 -5 515 251L383 506L251 251Q119 -5 116 -8Q108 -16 95 -16",8744:"64 572Q64 585 72 594T94 604T116 595Q119 592 251 336L383 81L515 336Q647 592 651 596Q661 604 671 604Q684 604 693 595T702 572Q702 567 701 565L554 279Q407 -6 405 -8Q404 -9 401 -11T397 -14Q392 -16 383 -16H380Q369 -16 361 -8Q359 -6 212 279L65 565Q65 566 65 568T64 572",8745:"94 -16Q73 -16 64 8V209Q64 239 64 287Q65 418 69 432Q70 434 70 435Q84 487 125 523T216 575T299 597T354 603H372Q444 603 501 590T591 558T648 515T681 471T696 435Q696 434 697 432Q701 417 702 309Q702 303 702 287Q702 239 702 209V8Q693 -16 672 -16Q650 -16 643 3Q641 8 641 201Q641 397 640 403Q631 472 558 507T383 542Q339 542 298 535T219 511T156 468T126 403Q125 397 125 201Q125 8 123 3Q116 -16 94 -16",8746:"672 603Q693 603 702 579V378Q702 348 702 300Q701 169 697 155Q696 153 696 152Q676 78 593 31T383 -16Q265 -16 179 28T70 152Q70 153 69 155Q65 170 64 278Q64 285 64 300Q64 348 64 378Q64 579 65 583Q74 604 94 604T123 584Q125 579 125 386Q125 190 126 184Q135 115 210 80T383 44Q426 44 467 51T546 75T609 119T640 184Q641 190 641 386Q641 579 643 584Q650 603 672 603",8747:"204 -71Q204 -108 181 -124T137 -141Q132 -141 132 -142Q142 -161 154 -161Q164 -161 186 -152Q200 -145 210 -135T228 -107T241 -77T249 -38T254 -2T258 38T262 74Q282 265 334 489Q334 490 337 503T341 523T347 544T355 569T365 594T379 620T397 643T420 666T447 685T481 700Q511 711 539 711T587 696T616 656T628 612T632 573Q632 536 610 519T562 501Q534 501 513 519T492 571Q492 608 515 624T559 641Q564 641 564 642Q554 661 542 661Q532 661 510 652Q496 645 486 635T468 607T455 577T447 538T442 502T438 462T434 426Q414 235 362 11Q352 -35 347 -54T328 -101T291 -152Q235 -208 162 -211Q147 -211 136 -208T109 -196T83 -165T67 -108Q64 -94 64 -73Q64 -37 86 -19T134 -1Q162 -1 183 -19T204 -71",8764:"64 155Q64 210 84 262T150 353T257 391Q300 391 341 371T417 321T484 264T557 215T637 194Q702 194 745 244T788 367Q796 391 808 391Q815 391 821 381T828 353V342Q828 252 776 181T637 109Q594 109 552 129T476 179T409 236T336 285T256 306Q193 306 149 258T105 132Q98 109 86 109Q76 109 70 122T64 155",8768:"64 561Q64 570 76 576T108 583Q174 583 214 535T254 407Q254 368 238 324T202 248T166 173T149 92Q149 43 169 2T217 -39Q231 -40 242 -46T254 -60Q254 -69 241 -75T210 -82Q145 -82 105 -34T64 93Q64 133 80 177T116 253T152 328T169 408Q169 461 148 500T105 540Q92 540 78 545T64 561",8771:"64 295Q64 378 117 440T257 502Q298 502 339 485T416 443T486 394T560 352T637 335Q693 335 740 373T788 478Q796 502 808 502Q815 502 821 492T828 465V455Q828 365 771 308T640 250Q603 250 562 265T501 294T439 336L370 382Q308 417 256 417Q205 417 164 388T110 317Q110 316 109 304T107 286T103 270T97 255T86 250Q76 250 70 263T64 295ZM64 6T64 27T87 56H93Q99 56 110 56T137 56T173 56T217 56T267 57T323 57T383 57T448 57H807Q808 56 811 54T815 52T819 49T823 45T826 40T828 34T829 27Q829 7 807 -3H87Q64 6 64 27",8773:"64 402Q64 457 84 509T150 600T257 638Q300 638 341 618T417 569T484 511T557 462T637 441Q702 441 745 491T788 614Q796 638 808 638Q815 638 821 628T828 600V589Q828 499 776 428T637 356Q594 356 552 376T476 425T409 483T336 532T256 553Q193 553 149 505T105 379Q98 356 86 356Q76 356 70 369T64 402ZM87 197Q64 207 64 226Q64 247 84 255Q89 257 448 257H807Q808 256 811 254T817 250T823 245T827 238T829 227Q829 209 807 197H87ZM87 -27Q64 -18 64 3Q64 23 86 32Q89 33 448 33H807L812 30Q816 27 818 26T823 21T827 13T829 3Q829 -18 807 -27H87",8776:"64 345Q64 423 119 473T250 524Q301 524 356 503T451 455T542 407T636 385Q700 385 743 417T786 481Q786 493 791 508T807 524Q817 524 823 512T829 479Q829 404 776 352T638 300Q590 300 537 321T443 369T352 417T256 439Q207 439 166 417T110 359Q109 357 107 341T100 312T85 300Q77 300 71 313T64 345ZM64 77Q64 155 119 205T250 256Q302 256 357 235T451 187T541 139T636 117Q699 117 742 148T786 213Q786 231 792 243T808 256T823 242T829 208Q829 134 776 83T640 32Q591 32 537 53T443 101T352 149T256 171Q206 171 165 148T110 91Q109 89 107 73T100 44T85 32Q77 32 71 45T64 77",8781:"798 533Q812 533 820 524T829 502T819 480T769 440Q655 355 537 330Q492 322 447 322Q401 322 356 330Q289 344 219 381T118 443T73 481Q64 490 64 503Q64 517 72 525T94 533Q99 533 102 532Q107 531 138 507T209 456T314 405T446 382Q604 382 765 515Q788 533 798 533ZM95 -32Q81 -32 73 -23T64 -1Q64 10 74 21T124 61Q213 127 293 153T421 179L422 180Q424 180 426 180T432 180T441 180T452 179Q612 179 769 61Q811 29 820 19T829 -1Q829 -14 821 -23T798 -32Q788 -32 765 -14Q608 118 446 118Q287 118 128 -14Q105 -32 95 -32",8784:"87 333Q64 343 64 362Q64 383 84 391Q89 393 448 393H807Q808 392 811 390T817 386T823 381T827 374T829 363Q829 345 807 333H87ZM87 109Q64 118 64 139Q64 159 86 168Q89 169 448 169H807L812 166Q816 163 818 162T823 157T827 149T829 139Q829 118 807 109H87ZM362 635Q362 671 387 696T444 721Q488 721 510 693T533 635Q533 606 512 579T448 551Q406 551 384 577T362 635",8800:"189 -210Q179 -210 170 -203T160 -179Q160 -171 162 -166Q165 -163 327 109H87Q64 118 64 139Q64 159 86 168Q89 169 363 169L461 333H87Q64 343 64 362Q64 383 84 391Q89 393 448 393H496Q533 455 583 539T656 660T679 698Q686 711 704 711Q714 711 723 704T733 681Q733 672 730 667Q729 664 709 631T645 523T567 393H807Q808 392 811 390T817 386T823 381T827 374T829 363Q829 345 807 333H532L433 169H807L812 166Q816 163 818 162T823 157T827 149T829 139Q829 118 807 109H398Q217 -195 211 -201Q202 -210 189 -210",8801:"87 445Q64 454 64 475Q64 497 84 503Q89 505 448 505H807Q808 504 812 502T818 497T823 492T827 484T829 474Q829 456 807 445H87ZM87 221Q64 230 64 251T84 279Q89 281 448 281H807Q808 280 811 278T817 274T823 269T827 262T829 251Q829 230 807 221H87ZM64 6T64 27T87 56H93Q99 56 110 56T137 56T173 56T217 56T267 57T323 57T383 57T448 57H807Q808 56 811 54T815 52T819 49T823 45T826 40T828 34T829 27Q829 7 807 -3H87Q64 6 64 27",8804:"797 55Q797 45 790 35T767 25H759L434 180Q108 336 105 339Q96 348 96 360Q96 378 114 388Q126 394 439 544T757 695Q763 697 766 697Q780 697 788 688T797 666Q797 654 788 645Q784 641 507 509T197 361L466 232Q785 80 790 74Q797 66 797 55ZM119 -199Q96 -191 96 -169Q96 -160 102 -152T119 -140H124Q130 -140 140 -140T164 -140T197 -140T237 -140T283 -139T334 -139T389 -139T448 -139H775Q797 -153 797 -169Q797 -187 775 -199H119",8805:"127 25Q110 25 103 34T96 54Q96 66 105 75Q109 80 439 238L696 361Q113 637 105 645Q96 654 96 667Q96 679 104 688T128 697Q137 696 460 541T788 382Q797 373 797 360Q797 348 788 339Q785 336 459 180L135 25H127ZM119 -199Q96 -191 96 -169Q96 -160 102 -152T119 -140H124Q130 -140 140 -140T164 -140T197 -140T237 -140T283 -139T334 -139T389 -139T448 -139H775Q797 -153 797 -169Q797 -187 775 -199H119",8810:"734 -74T734 -86T727 -107T704 -116H702Q694 -116 584 -55Q473 7 380 58Q87 219 73 229Q64 238 64 250Q64 263 73 272Q87 282 380 443Q695 616 699 617H700Q718 617 726 607T734 588Q734 568 717 560Q705 554 435 404L157 250L439 94Q721 -61 726 -66Q734 -74 734 -86ZM1085 -74T1085 -86T1078 -107T1055 -116H1053Q1045 -116 935 -55Q824 7 731 58Q438 219 424 229Q415 238 415 250Q415 263 424 272Q438 282 731 443Q1046 616 1050 617H1051Q1069 617 1077 607T1085 588Q1085 568 1068 560Q1056 554 786 404L508 250L790 94Q1072 -61 1077 -66Q1085 -74 1085 -86",8811:"64 588Q64 600 72 609T94 618H95Q103 618 209 559Q322 496 419 443Q712 282 725 272Q734 263 734 250Q734 238 725 229Q714 220 415 55T110 -113Q103 -116 95 -116Q78 -116 71 -106T64 -86Q64 -74 72 -66Q77 -61 359 94L641 250L363 404Q277 452 173 509Q95 552 82 560T66 576V577Q64 585 64 588ZM415 588Q415 600 423 609T445 618H446Q454 618 560 559Q673 496 770 443Q1063 282 1076 272Q1085 263 1085 250Q1085 238 1076 229Q1065 220 766 55T461 -113Q454 -116 446 -116Q429 -116 422 -106T415 -86Q415 -74 423 -66Q428 -61 710 94L992 250L714 404Q628 452 524 509Q446 552 433 560T417 576V577Q415 585 415 588",8826:"797 -57Q797 -65 790 -75T766 -86Q748 -86 741 -74T733 -43T719 8T681 72Q647 112 588 141T475 185T343 207T230 216T136 219Q96 219 96 250Q96 280 132 280H136Q193 281 239 283T347 292T457 310T556 342T643 391T703 460T735 553Q741 585 763 585Q781 585 789 575T797 556Q797 540 792 513T758 434T682 345Q605 285 481 254L462 249Q483 246 526 233T633 185T733 104Q767 63 782 15T797 -57",8827:"96 556Q96 568 104 577T126 586Q152 586 158 553Q164 503 188 462T247 394T331 345T429 313T539 294T649 284T758 280H760Q797 280 797 250Q797 219 760 219H758Q627 217 529 204T347 160T216 77T158 -54Q152 -86 126 -86Q110 -86 103 -76T96 -57Q96 -41 101 -14T135 65T211 154Q288 214 412 245L431 250Q410 252 367 265T259 314T160 395Q127 435 112 483T96 556",8834:"96 251Q96 389 191 482T417 586Q418 586 428 586T456 586T496 586T546 587T601 587H775Q776 586 779 584T785 580T791 575T795 568T797 557Q797 536 775 527L597 526Q411 525 395 522Q390 521 370 516Q285 494 222 424T158 251Q158 131 246 53Q313 -9 408 -23Q417 -24 597 -25H775Q776 -26 781 -29T788 -34T794 -43T797 -56Q797 -74 775 -85H493Q407 -85 376 -79Q257 -55 177 35T96 251",8835:"96 -55Q96 -38 119 -25H296Q482 -24 498 -21Q503 -20 523 -15Q609 7 672 77T735 251T665 431T485 524Q476 525 296 526L119 527Q96 535 96 557Q96 578 116 585Q121 587 300 587Q451 586 476 585T522 579Q632 556 714 468T796 251Q796 112 695 13Q612 -65 497 -82Q473 -86 289 -86L119 -85Q96 -77 96 -55",8838:"96 361Q96 499 191 592T417 696Q418 696 428 696T456 696T496 696T546 697T601 697H775Q776 696 779 694T785 690T791 685T795 678T797 667Q797 646 775 637L597 636Q411 635 395 632Q390 631 370 626Q285 604 222 534T158 361Q158 241 246 163Q313 101 408 87Q417 86 597 85H775Q776 84 781 81T788 76T794 67T797 54Q797 36 775 25H493Q407 25 376 31Q257 55 177 145T96 361ZM149 -199Q127 -191 127 -169T149 -140H154Q160 -140 169 -140T192 -140T224 -140T262 -140T306 -139T354 -139T407 -139T463 -139H775Q776 -140 779 -142T785 -146T791 -151T795 -158T797 -169Q797 -190 775 -199H149",8839:"96 55Q96 72 119 85H296Q482 86 498 89Q503 90 523 95Q609 117 672 187T735 361T665 541T485 634Q476 635 296 636L119 637Q96 645 96 667Q96 688 116 695Q121 697 300 697Q451 696 476 695T522 689Q632 666 714 578T796 361Q796 222 695 123Q612 45 497 28Q473 24 289 24L119 25Q96 33 96 55ZM119 -199Q96 -190 96 -169T116 -141Q121 -139 433 -139H745Q766 -152 766 -170Q766 -190 745 -199H119",8846:"672 603Q693 603 702 579V378Q702 348 702 300Q701 169 697 155Q696 153 696 152Q676 78 593 31T383 -16Q265 -16 179 28T70 152Q70 153 69 155Q65 170 64 278Q64 285 64 300Q64 348 64 378Q64 579 65 583Q74 604 94 604T123 584Q125 579 125 386Q125 190 126 184Q135 115 210 80T383 44Q426 44 467 51T546 75T609 119T640 184Q641 190 641 386Q641 579 643 584Q650 603 672 603ZM353 412Q353 420 353 435T352 456Q352 483 358 495T385 507Q403 506 409 494T415 457Q415 451 415 436T414 411V341H558Q579 329 579 311Q579 289 558 281L486 280H414V136Q400 114 384 114Q363 114 354 136L353 208V280H281L209 281Q187 289 187 310Q187 328 209 341H353V412",8849:"127 25Q111 29 104 49V362L105 675Q114 693 127 696H132Q138 696 149 696T174 696T208 696T249 696T297 697T350 697T407 697T468 697H806Q828 683 828 666Q828 646 806 637L485 636H165V85H805Q806 84 809 82T813 80T817 77T821 73T824 68T826 62T827 55Q827 34 806 25H127ZM96 -190T96 -169T119 -140H125Q131 -140 141 -140T167 -140T201 -140T242 -140T290 -139T344 -139T402 -139T463 -139H805Q806 -140 809 -142T813 -144T817 -147T821 -151T824 -156T826 -162T827 -169Q827 -190 806 -199H119Q96 -190 96 -169",8850:"66 55Q66 74 89 85H728V636H408L88 637Q66 645 66 667T88 696H94Q99 696 110 696T135 696T169 696T210 696T258 697T311 697T368 697T429 697H767Q786 684 789 672V49Q782 31 767 25H88Q66 32 66 55ZM88 -199Q66 -191 66 -169Q66 -148 87 -140Q91 -139 433 -139H775Q776 -140 779 -142T783 -144T787 -147T791 -151T794 -156T796 -162T797 -169Q797 -189 775 -199H88",8851:"131 25Q121 1 100 1Q81 1 71 23L70 301Q70 579 72 583Q77 598 90 602Q95 604 385 604H674Q693 591 696 579V25Q686 1 665 1Q646 1 636 23L635 283V543H131V25",8852:"696 25Q689 7 674 1H93Q77 7 71 23L70 301Q70 579 72 583Q80 604 100 604T131 579V61H635V579Q644 603 666 603Q687 603 696 579V25",8853:"64 250Q64 350 98 426T189 546T307 610T434 632Q485 632 496 631Q572 621 635 592Q669 575 699 550T760 484T809 384T828 250Q828 77 725 -27T446 -132Q272 -132 168 -27T64 250ZM416 282V570H414Q341 564 285 535T202 475T156 397T134 332T128 287Q127 283 127 282H416ZM765 288Q760 344 743 389T700 462T647 512T589 543T538 560T499 568L483 570H478V282H766L765 288ZM416 -69V220H127Q130 195 131 189T138 155T150 115T168 76T196 35T234 0T286 -35Q337 -61 410 -69H416ZM483 -69Q554 -60 607 -33T687 21T733 93T756 156T764 209Q766 217 766 220H478V-69H483",8854:"64 250Q64 350 98 426T189 546T307 610T434 632Q485 632 496 631Q572 621 635 592Q669 575 699 550T760 484T809 384T828 250Q828 77 725 -27T446 -132Q272 -132 168 -27T64 250ZM765 288Q753 424 666 497T446 571T227 498T128 288L127 282H766L765 288ZM446 -70Q578 -70 666 4T765 213L766 220H127Q130 195 131 189T138 155T150 115T168 76T196 35T234 0T286 -35Q353 -70 446 -70",8855:"64 250Q64 350 98 426T189 546T307 610T434 632Q485 632 496 631Q572 621 635 592Q669 575 699 550T760 484T809 384T828 250Q828 77 725 -27T446 -132Q272 -132 168 -27T64 250ZM647 512Q567 571 447 571Q340 571 262 523Q237 507 237 505L342 399L447 295L657 505L647 512ZM298 356L192 461Q180 445 161 411Q126 341 126 251Q126 128 192 40L403 250L298 356ZM701 41Q704 41 719 63T750 138T767 250Q767 310 750 362T719 437T701 460L491 250L701 41ZM238 -5Q238 -8 261 -22T336 -53T447 -70Q567 -70 647 -11L657 -4L447 206L342 101Q238 -1 238 -5",8856:"64 250Q64 350 98 426T189 546T307 610T434 632Q485 632 496 631Q572 621 635 592Q669 575 699 550T760 484T809 384T828 250Q828 77 725 -27T446 -132Q272 -132 168 -27T64 250ZM657 505Q656 506 650 510T638 518T623 527T604 537T581 547T553 556T522 563T486 569T446 571Q305 571 216 487T126 251Q126 128 192 40L657 505ZM447 -70Q591 -70 679 16T767 250Q767 308 751 360T719 436T701 460L469 228Q238 -1 238 -5Q238 -8 261 -22T336 -53T447 -70",8857:"64 250Q64 350 98 426T189 546T307 610T434 632Q485 632 496 631Q572 621 635 592Q669 575 699 550T760 484T809 384T828 250Q828 77 725 -27T446 -132Q272 -132 168 -27T64 250ZM767 252Q767 395 681 483T446 571Q303 571 215 486T126 249Q126 107 212 19T446 -70Q596 -70 681 18T767 252ZM335 251Q335 297 368 329T441 361Q498 361 527 327T557 250Q557 202 525 171T446 140Q397 140 366 173T335 251",8866:"65 672Q76 693 91 693Q115 693 123 674Q125 669 125 523V378H615Q618 376 622 373T628 369T632 366T635 362T636 356T637 347Q637 328 619 319Q615 317 370 317H125V171Q125 25 123 20Q114 1 94 1Q73 1 65 23V672",8867:"64 327T64 347T89 378H577V525L578 672Q592 693 604 693Q629 693 638 669V25Q628 1 607 1Q588 1 578 23L577 170V317H88Q64 327 64 347",8868:"64 664Q64 675 71 683T87 693H93Q99 693 110 693T137 693T173 693T217 694T267 694T323 694T383 694T448 694H807Q808 693 811 691T817 687T823 682T827 675T829 664Q829 643 807 634L642 633H477V25Q467 1 446 1Q427 1 417 23L416 328V633H251L87 634Q64 643 64 664",8869:"65 31Q65 38 66 41T71 50T87 61H416V366L417 672Q431 693 443 693Q468 693 477 669V61H807Q808 60 811 58T817 54T823 49T827 42T829 31Q829 10 807 1H87Q65 10 65 31",8872:"160 -249Q138 -249 129 -225V250Q129 725 131 729Q139 750 159 750T190 725V392Q219 393 537 393H896Q897 392 900 390T906 386T912 381T916 374T918 363Q918 345 896 333H190V169H896L900 166Q905 163 907 162T912 157T916 149T918 139Q918 118 896 109H190V-225Q181 -249 160 -249",8900:"280 522Q281 523 285 523H289Q301 523 366 457Q404 420 431 393Q533 291 546 277T560 250Q560 239 548 226T431 108Q313 -10 304 -16Q297 -21 287 -21Q278 -21 275 -19Q270 -17 146 107T18 238Q15 242 15 251Q15 258 18 263Q20 268 145 392T274 519L280 522ZM388 350L288 449L188 350L89 250L288 52L487 250L388 350",8901:"74 251Q74 286 99 311T156 336Q200 336 222 308T245 250Q245 221 224 194T160 166T96 193T74 251",8902:"270 491Q274 502 287 502Q298 502 304 491Q304 486 323 396T342 303L438 314Q520 324 534 324Q540 324 545 320T550 307Q550 298 539 290T456 243Q377 198 377 197L416 111Q456 26 456 22Q457 21 457 18Q457 11 451 6T438 0H437Q432 0 415 16Q387 42 358 68L287 133L216 68Q193 47 167 23Q142 0 136 0Q129 0 123 5T117 18Q117 21 118 22Q118 26 158 111L197 197Q197 198 156 221T72 269T26 298Q24 304 24 307Q24 315 29 319T40 324Q53 324 136 314L232 303Q232 306 251 396T270 491",8904:"906 251Q906 456 905 456Q550 252 549 251Q549 250 726 148T905 45T906 251ZM967 -14Q958 -38 939 -38H937Q928 -38 923 -35Q919 -34 748 64T500 209L71 -38Q69 -39 63 -39Q42 -39 33 -16V518Q45 540 63 540H65Q72 540 174 481Q247 439 302 407L500 292Q578 339 750 438T929 539H933Q958 539 967 515V-14ZM449 251L94 456Q93 456 93 251Q93 45 94 45L106 52Q119 59 139 71T186 98T242 131T301 165T357 197T404 225T437 244L449 251",8942:"74 55Q74 91 99 116T156 141Q200 141 222 113T245 55Q245 26 224 -1T160 -29Q118 -29 96 -3T74 55ZM74 465Q74 501 99 526T156 551Q200 551 222 523T245 465Q245 436 224 409T160 381Q118 381 96 407T74 465ZM74 865Q74 901 99 926T156 951Q200 951 222 923T245 865Q245 836 224 809T160 781Q118 781 96 807T74 865",8943:"74 251Q74 286 99 311T156 336Q200 336 222 308T245 250Q245 221 224 194T160 166T96 193T74 251ZM562 251Q562 286 587 311T644 336Q688 336 710 308T733 250Q733 221 712 194T648 166T584 193T562 251ZM1050 251Q1050 286 1075 311T1132 336Q1176 336 1198 308T1221 250Q1221 221 1200 194T1136 166T1072 193T1050 251",8945:"129 785Q129 821 154 846T211 871Q255 871 277 843T300 785Q300 756 279 729T215 701Q173 701 151 727T129 785ZM576 485Q576 521 601 546T658 571Q702 571 724 543T747 485Q747 456 726 429T662 401Q620 401 598 427T576 485ZM1023 185Q1023 221 1048 246T1105 271Q1149 271 1171 243T1194 185Q1194 156 1173 129T1109 101Q1067 101 1045 127T1023 185",8968:"194 728Q199 743 216 749H220Q223 749 229 749T245 749T265 750T289 750T316 750T345 750H471Q472 749 477 746T484 741T490 732T493 719Q493 701 471 690L362 689H254V-224Q244 -248 223 -248T194 -226V728",8969:"317 -224Q307 -248 286 -248Q267 -248 257 -226L256 231V689H148L40 690Q17 698 17 720Q17 741 37 748Q42 750 169 750H295Q314 737 317 725V-224",8970:"194 728Q204 749 220 749Q245 749 254 725V-188H471Q472 -189 477 -192T484 -197T490 -206T493 -219Q493 -237 471 -248H216Q200 -242 194 -226V728",8971:"17 -219Q17 -201 40 -188H256V270L257 728Q271 749 283 749Q308 749 317 725V-224Q310 -242 295 -248H40L38 -247Q35 -246 34 -245T30 -243T25 -239T21 -234T18 -227T17 -219",8994:"95 108Q85 108 75 114T65 139Q65 159 129 227Q316 405 573 405Q654 405 729 387T854 344T950 286T1015 232T1053 191Q1078 160 1083 152Q1084 148 1084 139Q1084 121 1074 115T1054 108Q1040 108 1029 122T990 167T922 223Q819 291 680 309Q641 315 575 315Q508 315 469 309Q303 288 197 201Q168 179 148 155T118 119T95 108",8995:"1054 392Q1067 392 1076 384T1085 362Q1085 351 1079 342T1050 310Q983 243 901 200Q753 126 575 126Q494 126 420 141T298 176T205 225T140 272T100 310Q64 346 64 362Q64 370 67 374Q75 393 93 393Q107 393 124 375Q272 214 575 214Q877 214 1025 375Q1039 392 1054 392",9001:"127 243V259L223 491Q251 557 286 642Q318 719 324 732T340 748H341Q347 750 351 750Q365 750 373 740T382 723Q382 713 286 482L190 251Q190 249 286 20T382 -219Q382 -232 373 -240T352 -249Q332 -249 323 -229Q320 -220 223 10L127 243",9002:"64 720Q64 732 72 741T94 750Q106 750 113 743Q118 741 122 732L319 259V243L122 -231Q112 -249 95 -249Q83 -249 74 -240T64 -218Q64 -210 160 20L256 251L160 482Q64 715 64 720",9651:"91 1Q69 10 69 31Q69 39 81 59T168 197Q327 447 485 697Q493 711 510 711Q523 711 532 702Q536 697 743 371T951 41Q953 35 953 31Q953 12 931 1H91ZM690 340Q651 401 604 476T534 586L512 621Q511 622 507 616Q498 604 332 342L154 62L333 61H689L867 62L690 340",9653:"91 1Q69 10 69 31Q69 39 81 59T168 197Q327 447 485 697Q493 711 510 711Q523 711 532 702Q536 697 743 371T951 41Q953 35 953 31Q953 12 931 1H91ZM690 340Q651 401 604 476T534 586L512 621Q511 622 507 616Q498 604 332 342L154 62L333 61H689L867 62L690 340",9657:"33 518Q45 540 63 540H65Q72 540 174 481Q247 439 302 407Q529 276 533 272Q542 263 542 250Q542 238 533 229Q528 224 304 95T71 -38Q69 -39 63 -39Q42 -39 33 -16V518ZM449 251L94 456Q93 456 93 251Q93 45 94 45L106 52Q119 59 139 71T186 98T242 131T301 165T357 197T404 225T437 244L449 251",9661:"68 470Q68 481 75 489T91 499H93Q296 500 512 500H931Q932 499 937 496T945 490T950 482T953 469Q953 465 951 459Q950 455 743 129T532 -202Q524 -210 511 -210Q497 -210 489 -202Q486 -199 281 124T71 456Q68 462 68 470ZM154 439Q155 437 332 158T510 -122Q510 -123 533 -87T600 18T688 157Q866 437 866 438Q867 439 805 439T511 439H154",9663:"68 470Q68 481 75 489T91 499H93Q296 500 512 500H931Q932 499 937 496T945 490T950 482T953 469Q953 465 951 459Q950 455 743 129T532 -202Q524 -210 511 -210Q497 -210 489 -202Q486 -199 281 124T71 456Q68 462 68 470ZM154 439Q155 437 332 158T510 -122Q510 -123 533 -87T600 18T688 157Q866 437 866 438Q867 439 805 439T511 439H154",9667:"542 -14Q533 -38 514 -38H512Q503 -38 498 -35Q494 -34 270 95T42 229Q33 238 33 251Q33 259 35 264Q36 265 38 268T42 272Q48 278 271 407T504 539H508Q533 539 542 515V-14ZM481 251Q481 456 480 456Q125 252 124 251Q124 250 301 148T480 45T481 251",9711:"65 42T65 250T204 584T574 711Q795 711 935 594Q955 577 974 555T1022 490T1067 385T1084 250Q1084 42 945 -84T574 -211T204 -85ZM1024 250Q1024 431 903 540T578 650Q482 650 404 627T274 565T189 474T140 366T125 250Q125 123 186 31T347 -106T573 -150Q772 -150 898 -45T1024 250",9824:"675 -18Q536 -18 527 62V70H477V55Q479 14 487 -21T502 -75T509 -101Q509 -120 491 -127Q487 -129 447 -129Q446 -129 439 -129T427 -130Q384 -130 384 -101Q384 -95 391 -76T406 -21T416 55V70H366Q364 52 360 40T342 14T300 -8T230 -17H218Q110 -17 75 117Q64 163 64 209Q64 290 116 357T261 495Q363 574 414 690Q425 719 445 719Q467 719 478 693Q507 627 547 578T623 503T702 438T777 357Q829 285 829 202V197Q826 128 808 81T762 15T714 -11T675 -18",9825:"65 491Q65 602 121 656T246 710Q375 710 440 624L447 615Q519 711 638 711Q723 711 775 652T828 491Q828 390 770 313T581 129Q539 95 514 63T483 14T469 -13T446 -24Q434 -24 427 -17T416 0T400 32T371 74Q352 97 310 131T229 199T151 276T89 374T65 491ZM249 649Q188 649 157 603T125 489Q125 409 181 338T352 176Q408 131 437 87L446 73L456 87Q479 121 507 147T579 207T659 278Q768 387 768 489Q768 506 766 524T756 566T731 611T687 642Q668 649 638 649Q609 649 593 644Q547 633 516 604T478 534Q473 505 447 505H445Q420 505 416 534Q407 577 372 608T285 648Q277 649 249 649",9826:"409 686Q410 688 412 691T415 696T418 701T421 706T424 709T427 713T431 715T435 717T440 718T446 719Q455 719 460 717T472 704T488 679T516 633T563 567Q624 485 687 422T787 330T826 296T828 282Q828 270 825 265T801 245Q696 161 612 59T477 -133Q465 -154 447 -154Q439 -154 434 -152T425 -146T414 -130T399 -104T372 -62T330 -3Q270 78 207 142T107 234T70 265Q64 274 64 282Q64 296 90 317Q284 472 409 686ZM749 282Q745 286 721 307T681 343T635 388T581 446T525 516T465 601Q462 606 457 613T450 624L447 627V628Q446 628 436 611T402 561T348 489T266 396T155 292L145 282Q147 280 185 245T257 177T343 79T442 -57Q446 -64 447 -64V-63Q450 -59 475 -22T530 56T619 160T749 282",9827:"240 527Q240 611 301 665T446 719T590 665T652 527Q652 431 571 373Q578 363 584 352T593 335T597 329L604 335Q611 341 617 345T637 356T667 366Q672 366 680 367T694 368Q767 368 814 310T861 177Q861 109 819 57T713 -12Q690 -17 656 -17Q535 -13 527 62V70H477V55Q479 14 487 -21T502 -75T509 -101Q509 -120 491 -127Q487 -129 447 -129Q446 -129 439 -129T427 -130Q384 -130 384 -101Q384 -95 391 -76T406 -21T416 55V70H366V62Q356 -12 237 -17Q130 -17 71 60Q32 111 32 178Q32 251 78 309T198 368Q217 368 233 364T260 354T279 343T291 333T296 329L300 336Q304 343 310 354T322 373Q240 432 240 527",9837:"230 480Q293 480 337 440T381 330V322Q381 240 323 161Q258 71 123 -11L114 -16L97 -17Q70 -17 66 -7Q64 -3 64 366V641Q64 717 65 731T75 748Q78 750 95 750Q117 750 122 742T127 694Q127 685 127 653T126 595V454Q183 480 230 480ZM242 333Q242 405 212 405H207Q147 405 130 370L127 364L126 219Q126 77 128 77Q133 82 140 90T167 127T202 183T229 253T242 333",9838:"345 -223Q333 -223 330 -214T327 -178V-116Q327 -23 326 -23L203 -82Q90 -134 77 -140Q65 -142 59 -130Q57 -126 57 295V595Q57 643 57 667T58 704T60 719T63 724Q93 741 101 741Q113 741 116 732T119 680V597Q119 467 120 467Q121 468 180 495T301 552T369 584Q381 586 387 574Q389 570 389 187V-88Q389 -132 389 -154T388 -188T386 -202T383 -206Q353 -223 345 -223ZM327 271Q327 421 326 421L120 323L119 173V23Q120 23 223 72L327 121V271",9839:"140 628Q151 628 154 620T158 591V549V484L166 488Q175 492 192 500T223 516L288 548V622V674Q288 681 288 685T289 693T289 699T291 703T295 707T298 709T304 712T311 716Q326 724 332 724Q343 724 346 715T350 685V644V579Q358 583 364 583Q376 583 380 574Q382 570 382 514V481Q382 459 380 454T363 441L350 435V135Q358 139 364 139Q376 139 380 130Q382 126 382 70V37Q382 15 380 10T363 -3L350 -9V-76Q350 -102 348 -106T328 -119Q312 -128 306 -128Q288 -128 288 -99V-77V-40L280 -44Q271 -48 254 -56T223 -72L158 -104V-150V-180Q158 -198 155 -202T135 -216Q119 -224 114 -224Q96 -224 96 -192V-172V-135Q86 -140 81 -140Q70 -140 66 -129Q64 -126 64 -70V-54Q64 -18 66 -12T83 3L96 9V309Q86 304 81 304Q70 304 66 315Q64 318 64 374V407Q64 429 66 434T83 447L96 453V602Q99 609 100 610T118 619Q134 628 140 628ZM288 254Q288 404 287 404L158 340V40L166 44Q175 48 192 56T223 72L288 104V254",10072:"160 -249Q138 -249 129 -225V250Q129 725 131 729Q139 750 159 750T190 725V-225Q181 -249 160 -249",10216:"127 243V259L223 491Q251 557 286 642Q318 719 324 732T340 748H341Q347 750 351 750Q365 750 373 740T382 723Q382 713 286 482L190 251Q190 249 286 20T382 -219Q382 -232 373 -240T352 -249Q332 -249 323 -229Q320 -220 223 10L127 243",10217:"64 720Q64 732 72 741T94 750Q106 750 113 743Q118 741 122 732L319 259V243L122 -231Q112 -249 95 -249Q83 -249 74 -240T64 -218Q64 -210 160 20L256 251L160 482Q64 715 64 720",10229:"1063 221L649 220H235Q340 133 364 17Q368 1 368 -2Q368 -16 343 -17Q340 -17 338 -17H332Q317 -17 314 -14T305 6Q298 34 285 62T247 126T179 189T78 233Q64 237 64 251Q64 261 74 265T108 277T154 297Q212 328 251 379T305 495Q309 511 313 514T333 518H338Q363 517 367 510Q368 507 368 503Q368 500 364 484Q345 401 287 331Q254 295 235 282L649 281H1063L1065 280Q1079 281 1392 281H1719Q1720 280 1723 278T1729 274T1735 269T1739 262T1741 251Q1741 230 1719 221H1063",10230:"119 221Q96 230 96 251T116 279Q121 281 448 281H1188L1602 282Q1569 304 1530 357T1473 482Q1469 500 1469 501Q1469 512 1480 517Q1482 518 1500 518H1505Q1520 518 1523 515T1532 495Q1552 412 1611 351T1753 270Q1773 263 1773 251Q1773 240 1765 236T1732 225T1683 204Q1625 173 1586 122T1532 6Q1528 -10 1524 -13T1504 -17H1499Q1474 -16 1470 -9Q1469 -6 1469 -2Q1469 1 1473 17Q1501 138 1602 220H1188L775 221H119",10231:"1063 221L649 220H235Q340 133 364 17Q368 1 368 -2Q368 -16 343 -17Q340 -17 338 -17H332Q317 -17 314 -14T305 6Q298 34 285 62T247 126T179 189T78 233Q64 237 64 251Q64 261 74 265T108 277T154 297Q212 328 251 379T305 495Q309 511 313 514T333 518H338Q363 517 367 510Q368 507 368 503Q368 500 364 484Q345 401 287 331Q254 295 235 282L649 281H1476L1890 282Q1857 304 1818 357T1761 482Q1757 500 1757 501Q1757 512 1768 517Q1770 518 1788 518H1793Q1808 518 1811 515T1820 495Q1840 412 1899 351T2041 270Q2061 263 2061 251Q2061 240 2053 236T2020 225T1971 204Q1913 173 1874 122T1820 6Q1816 -10 1812 -13T1792 -17H1787Q1762 -16 1758 -9Q1757 -6 1757 -2Q1757 1 1761 17Q1789 138 1890 220H1476L1063 221",10232:"1063 333L700 332H338L324 321Q283 290 230 264L205 250Q266 224 323 180L338 170L700 169H1063L1064 168Q1080 169 1423 169H1782L1786 166Q1791 163 1793 162T1798 157T1802 149T1804 139Q1804 118 1782 109H1063L733 108H404L412 99Q455 50 488 -10Q498 -27 493 -37Q487 -46 465 -46H460Q446 -46 439 -39T426 -18T399 25T344 89Q239 194 99 229Q96 230 92 231T85 232T79 234T73 235T69 237T66 240T65 244T64 250Q64 267 90 271Q197 295 286 361T430 525Q439 542 442 544T460 547H465Q487 547 492 539Q496 531 496 530Q496 521 471 482T414 405L404 394L733 393H1063Q1064 392 1065 392Q1081 393 1423 393H1782Q1783 392 1786 390T1792 386T1798 381T1802 374T1804 363Q1804 345 1782 333H1063",10233:"87 109Q64 118 64 139Q64 159 86 168Q89 169 448 169H1169L1532 170L1546 180Q1562 193 1580 204T1612 223T1638 237T1657 246L1664 250L1639 264Q1586 290 1545 321L1531 332H1169L807 333H87Q64 343 64 362Q64 383 84 391Q89 393 448 393H1136L1465 394L1455 405Q1428 436 1401 477T1374 531Q1374 547 1399 547H1404H1409Q1423 547 1430 540T1443 519T1470 475T1526 411Q1634 303 1779 271Q1780 271 1783 270T1788 269T1792 268T1796 266T1799 264T1802 260T1803 256T1804 250Q1804 242 1800 238T1783 231T1755 225T1712 211T1654 185Q1517 112 1439 -24Q1430 -40 1426 -43T1409 -46H1404Q1373 -46 1373 -31Q1373 -24 1381 -10Q1414 50 1457 99L1465 108H1136L807 109H87",10234:"1063 333L700 332H338L324 321Q283 290 230 264L205 250Q266 224 323 180L338 170L700 169H1425L1788 170L1802 180Q1818 193 1836 204T1868 223T1894 237T1913 246L1920 250L1895 264Q1842 290 1801 321L1787 332H1425L1063 333ZM733 393H1392L1721 394L1711 405Q1684 436 1657 477T1630 531Q1630 547 1655 547H1660H1665Q1679 547 1686 540T1699 519T1726 475T1782 411Q1890 303 2035 271Q2036 271 2039 270T2044 269T2048 268T2052 266T2055 264T2058 260T2059 256T2060 250Q2060 242 2056 238T2039 231T2011 225T1968 211T1910 185Q1773 112 1695 -24Q1686 -40 1682 -43T1665 -46H1660Q1629 -46 1629 -31Q1629 -24 1637 -10Q1670 50 1713 99L1721 108H1392L1063 109L733 108H404L412 99Q455 50 488 -10Q498 -27 493 -37Q487 -46 465 -46H460Q446 -46 439 -39T426 -18T399 25T344 89Q239 194 99 229Q96 230 92 231T85 232T79 234T73 235T69 237T66 240T65 244T64 250Q64 267 90 271Q197 295 286 361T430 525Q439 542 442 544T460 547H465Q487 547 492 539Q496 531 496 530Q496 521 471 482T414 405L404 394L733 393",10236:"65 426Q74 448 95 448Q112 448 125 426V281H130L132 280H134Q162 281 448 281H1188L1602 282Q1569 304 1530 357T1473 482Q1469 500 1469 501Q1469 512 1480 517Q1482 518 1500 518H1505Q1520 518 1523 515T1532 495Q1552 412 1611 351T1753 270Q1773 263 1773 251Q1773 240 1765 236T1732 225T1683 204Q1625 173 1586 122T1532 6Q1528 -10 1524 -13T1504 -17H1499Q1474 -16 1470 -9Q1469 -6 1469 -2Q1469 1 1473 17Q1501 138 1602 220H1188L775 221H135Q133 220 130 220H125V76Q115 54 95 54Q73 54 65 76V426",10744:"189 -210Q179 -210 170 -203T160 -179Q160 -171 162 -166Q164 -163 420 266T679 698Q686 711 704 711Q714 711 723 704T733 681Q733 672 730 667Q723 654 469 228T211 -201Q202 -210 189 -210",10799:"168 500Q168 515 178 522T195 530H198Q207 530 218 521T282 458Q312 428 331 409L447 294L563 409Q674 520 682 525Q687 529 695 529Q711 529 718 520T726 499V498Q726 489 720 481T666 427Q631 392 606 367L490 251L606 135Q717 23 721 17T726 2Q726 -9 719 -18T695 -28H692Q685 -28 674 -18T608 47Q581 74 563 92L447 207L331 91Q217 -22 208 -27Q206 -28 203 -28H197Q168 -28 168 2Q168 13 178 24T288 135L404 250L288 366Q177 479 173 485T168 500",10815:"39 655Q39 675 43 680T69 686Q110 684 225 684Q267 684 303 684T360 685T385 686Q401 686 405 680T409 651Q409 632 403 628T367 624H348H301V62H598V624H551H532Q502 624 496 628T490 651Q490 673 494 679T514 686Q518 686 558 685T675 684T792 685T836 686Q852 686 856 680T860 651Q860 632 854 628T818 624H799H752V62H799H809Q846 62 853 59T860 36V31V21Q860 6 850 2Q846 0 450 0H156Q75 0 60 1T40 11V18Q39 26 39 31Q39 54 44 58T82 63Q84 63 90 63T100 62H147V624H100H90Q53 624 46 627T39 650V655",10927:"796 54Q796 40 788 32T767 24Q741 24 735 57Q729 107 705 148T646 216T563 264T465 297T356 316T245 326T136 330H134Q96 330 96 360Q96 391 134 391H136Q193 392 239 394T347 403T457 421T556 453T643 502T703 571T735 664Q741 696 763 696Q781 696 789 686T797 667Q797 651 792 624T758 545T682 456Q605 396 481 365L462 360Q483 357 526 344T633 296T733 215Q767 173 781 128T796 54ZM119 -199Q96 -190 96 -169T116 -141Q121 -139 448 -139H775Q776 -140 779 -142T785 -146T791 -151T795 -158T797 -169Q797 -190 775 -199H119",10928:"127 24Q115 24 106 32T97 55Q97 95 124 156T211 265Q288 325 412 356L431 361Q410 363 367 376T259 425T160 506Q127 546 112 594T96 667Q96 679 104 688T126 697Q152 697 158 664Q164 614 188 573T247 505T331 456T429 424T539 405T649 395T758 391Q797 391 797 360Q797 330 761 330H758Q701 329 655 327T547 318T437 300T337 268T251 219T190 150T158 57Q151 24 127 24ZM119 -199Q96 -190 96 -169T116 -141Q121 -139 448 -139H775Q776 -140 779 -142T785 -146T791 -151T795 -158T797 -169Q797 -190 775 -199H119",12296:"127 243V259L223 491Q251 557 286 642Q318 719 324 732T340 748H341Q347 750 351 750Q365 750 373 740T382 723Q382 713 286 482L190 251Q190 249 286 20T382 -219Q382 -232 373 -240T352 -249Q332 -249 323 -229Q320 -220 223 10L127 243",12297:"64 720Q64 732 72 741T94 750Q106 750 113 743Q118 741 122 732L319 259V243L122 -231Q112 -249 95 -249Q83 -249 74 -240T64 -218Q64 -210 160 20L256 251L160 482Q64 715 64 720"},{8243:"\u2032\u2032",8244:"\u2032\u2032\u2032",8279:"\u2032\u2032\u2032\u2032",8602:"\u2190\u0338",8603:"\u2192\u0338",8622:"\u2194\u0338",8653:"\u21d0\u0338",8654:"\u21d4\u0338",8655:"\u21d2\u0338",8708:"\u2203\u0338",8716:"\u220b\u0338",8740:"\u2223\u0338",8742:"\u2225\u0338",8769:"\u223c\u0338",8772:"\u2243\u0338",8775:"\u2245\u0338",8777:"\u2248\u0338",8802:"\u2261\u0338",8813:"\u224d\u0338",8814:"<\u0338",8815:">\u0338",8816:"\u2264\u0338",8817:"\u2265\u0338",8832:"\u227a\u0338",8833:"\u227b\u0338",8836:"\u2282\u0338",8837:"\u2283\u0338",8840:"\u2286\u0338",8841:"\u2287\u0338",8876:"\u22a2\u0338",8877:"\u22a8\u0338",8930:"\u2291\u0338",8931:"\u2292\u0338"})},59:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.doubleStruck=void 0;var H=L(5674);Object.defineProperty(T,"doubleStruck",{enumerable:!0,get:function(){return H.doubleStruck}})},3566:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.frakturBold=void 0;var H=L(9403),V=L(7002);T.frakturBold=(0,H.AddPaths)(V.frakturBold,{33:"121 621Q121 657 132 673T177 689Q223 689 223 644V635Q223 604 222 595Q221 590 210 490T187 292T175 190V186L166 185L156 184Q156 185 139 393T121 621ZM107 47Q107 70 127 87T174 104Q201 104 221 89T241 48Q241 24 222 6T174 -12Q147 -12 127 6T107 47",34:"53 695Q74 695 90 679V622L65 433L52 432H39L27 516Q10 626 10 655Q10 680 26 688Q33 693 39 693Q49 695 53 695ZM151 668Q151 691 191 691Q217 691 224 685T231 661V652Q230 634 219 531L207 433L195 432Q183 432 183 433L168 541Q151 664 151 668",38:"290 -14Q186 -14 115 41T44 185Q44 222 54 249T88 300T131 336T189 371Q216 387 216 388Q185 459 185 510Q185 563 206 601T263 659T334 687T405 696Q476 696 503 668T531 603Q531 565 513 536T450 476Q423 459 370 432L334 413L354 384Q474 212 560 139L563 137Q611 185 611 250Q611 295 577 329Q549 356 496 357Q439 357 433 354Q432 354 432 379V403L437 402Q443 402 479 401T557 400Q653 400 735 403T831 407H836Q833 352 833 351L821 352Q809 352 792 352T756 352T720 353T696 354Q680 354 680 353L681 346Q682 339 683 327T685 306Q685 283 681 260T669 218T653 182T635 152T619 129T606 114L602 109Q604 107 618 99T659 81T707 71Q742 71 767 99T804 155L815 183Q815 184 821 183T833 180T839 177Q837 169 834 156T816 110T782 52T727 5T648 -16Q569 -16 499 35H498Q496 35 466 23T387 -1T290 -14ZM418 592Q418 617 398 639T352 661T302 642T278 574Q278 545 288 514T306 465T319 444Q342 456 353 463T382 488T409 529T418 584V592ZM159 239Q159 158 222 98T364 38Q386 38 447 57L469 63L434 98Q349 185 286 275Q258 316 238 345Q233 353 232 353Q159 316 159 239",39:"80 645T80 662T93 687T123 695Q158 695 158 659Q158 649 157 643L123 437Q123 436 114 436H104Q104 442 92 538Q80 645 80 662",40:"347 719Q325 708 311 698T272 656T233 580T207 455T195 267Q195 30 247 -79Q261 -110 291 -136Q320 -163 347 -172V-179Q347 -186 344 -186Q338 -186 328 -184T287 -165T230 -123Q134 -25 134 271Q134 417 158 514T226 662T335 734L346 737Q347 737 347 728V719",41:"264 262Q264 366 253 446T226 572T186 649T145 692T105 714V725Q105 735 107 735Q108 734 121 731T154 719T196 692T242 641T284 560T314 437T326 268Q326 112 299 7Q279 -78 239 -124T116 -185L105 -187V-179L106 -171L109 -169Q130 -161 138 -158T165 -146T190 -127T210 -101T229 -64T243 -12T255 58T261 148T264 262",42:"40 516L62 529Q85 542 110 556T140 574L126 582Q112 591 104 595T80 607T40 629Q53 642 57 645L65 652L78 642Q106 620 132 603L152 589V595Q152 630 149 681V692H179V689Q178 681 174 638T171 593Q173 593 240 639L258 652Q260 652 267 643L276 633L260 625Q190 587 175 576Q173 575 180 570Q183 569 186 567Q213 549 256 527L277 515L256 495Q246 501 228 515T194 539T170 554V543Q170 486 178 449H148V456Q152 492 152 550L151 562Q150 562 102 528L53 495Q40 514 40 516",43:"422 584L471 598Q472 598 472 440V282H837Q833 273 829 263L821 244L647 243H472V-63L448 -73L423 -82Q422 -82 422 81V243H239Q56 243 56 244Q60 253 65 263L73 282H422V584",44:"118 61Q118 80 135 93T169 107Q190 107 221 65T253 -23Q253 -39 251 -49T237 -80T198 -133Q148 -191 144 -191Q142 -191 137 -182T132 -172Q143 -161 160 -131T183 -83Q185 -77 185 -62Q185 -54 184 -48T182 -38T177 -28T171 -19T162 -8T150 6Q130 28 124 38T118 61",45:"54 236L73 275H453Q833 275 833 274Q830 265 825 255L818 236H54",46:"103 23T103 44T120 83T170 102Q200 102 218 84T237 44Q237 20 216 3T168 -15Q138 -15 121 4",47:"272 270Q503 721 506 721L509 720Q512 720 518 719T529 717L550 713L91 -181L66 -182Q41 -182 41 -181L272 270",48:"238 -12Q162 -12 102 42T42 185Q42 303 130 393Q163 425 208 452T284 490L313 501Q323 499 339 495T395 472T464 426Q533 357 533 273Q533 201 483 133T364 27T238 -12ZM428 208Q428 255 402 297T342 365T280 404T241 419Q214 419 178 374T142 259Q142 206 168 164T225 99Q259 74 310 74Q326 74 337 75T366 82T396 103T417 141Q428 171 428 208",49:"95 481Q102 481 217 485T383 489Q384 489 384 485Q367 397 367 165Q367 58 369 54Q374 46 380 44T410 42H466H546V40Q547 38 547 19L548 0H54V23Q54 29 54 34T54 44L55 47Q79 47 134 46T202 45Q226 45 234 52Q240 57 241 64T245 105Q254 236 254 320V347Q254 369 252 382T240 409T211 431L97 450L96 465Q95 480 95 481",50:"307 335Q307 374 283 397T224 421Q187 421 112 387Q105 384 100 382T95 381Q90 387 86 394L77 407L86 413Q219 491 298 491Q370 491 399 460T428 388Q428 373 424 358T409 326T391 297T363 264T335 235T301 202T269 171L199 104Q194 99 205 97Q209 96 214 96Q527 105 544 105Q553 107 563 102Q563 100 557 79T545 34T537 2H377Q338 2 247 2T130 4H44V26L104 77Q185 145 212 172T267 235Q307 291 307 335",51:"102 402L108 408Q115 413 122 418T141 431T165 447T194 461T227 474T263 483T302 487H307Q413 487 452 420Q465 400 465 371Q465 334 445 303T396 253T347 225T317 213Q314 213 314 211Q316 209 316 205Q317 201 320 201Q337 201 359 198T411 184T465 156T506 109T523 39Q523 -62 436 -127T229 -193Q179 -193 130 -178T56 -150T31 -133Q31 -132 41 -122L52 -112L63 -117Q128 -148 201 -148Q282 -148 331 -104T381 20Q381 71 363 100T304 145Q243 166 149 166H137V204H146Q179 204 211 210T275 229T326 268T346 329Q346 372 314 401Q292 423 245 423Q188 423 125 383L102 402",52:"346 -196Q344 -196 335 -187L336 -148Q337 -127 337 -55V0H13V29L187 253Q362 477 362 479L368 480Q375 481 387 483T411 487T434 491T452 494L459 495Q460 495 470 482V453Q470 389 466 230T461 62Q461 61 513 61T565 60L555 29L546 -1H461V-15Q461 -48 463 -100T465 -154L457 -157Q449 -160 434 -165T405 -175Q347 -196 346 -196ZM339 265V341Q339 362 335 362Q327 362 219 217T110 65V61H337V117Q338 133 338 187T339 265",53:"232 192Q176 192 122 152L95 162V481H306Q516 481 516 479Q514 477 501 433L486 389L319 388H152V386V382Q152 379 152 374T151 365Q147 329 146 260V218H149Q211 242 284 242Q353 242 402 224T474 176T508 117T518 55Q518 -62 432 -126T220 -190Q184 -190 151 -185T96 -172T57 -157T31 -145T20 -139T19 -138Q19 -136 27 -125L35 -112L51 -120Q114 -152 174 -152Q257 -152 314 -100T371 46Q371 107 340 149T232 192",54:"48 251Q48 330 76 403T150 529T253 623T370 683T485 704Q494 704 520 701T547 695Q547 692 542 659T536 625Q531 624 524 624L512 623L502 628Q489 635 468 640Q452 645 423 645Q403 645 379 640T320 617T255 568T201 481T171 348Q170 341 170 330V325L183 333Q275 385 357 385H361Q464 385 514 312Q546 267 546 217Q546 127 457 58T262 -12Q225 -12 189 3T120 49T68 132T48 251ZM448 165Q448 228 406 274T289 320Q264 320 236 312T190 295T173 284Q173 266 176 241T189 178T214 112T259 61T326 39Q372 39 410 75T448 165",55:"57 376L87 479H591V455L584 446Q544 399 491 328T349 117T185 -169L171 -196H159Q152 -197 102 -197Q58 -197 58 -196T56 -185L54 -175L299 158L443 359Q446 367 444 370H254L71 365L57 376",56:"88 533Q88 573 120 610T194 668T268 701T307 714Q324 714 352 711T422 695T486 659Q518 625 518 585Q518 536 479 489T384 406L371 398L385 390Q387 389 400 382T420 370T442 356T466 339T489 319T510 295T526 269T538 238T542 204Q542 125 463 60T256 -5Q145 -5 92 52Q45 97 45 165Q45 204 64 237T109 290T163 324T209 345T228 353L214 364Q199 375 179 392T138 431T103 480T88 533ZM405 557Q405 568 402 581T387 612T350 644T286 663Q283 663 280 663T274 664H272Q256 664 228 636T199 572Q199 547 238 507Q268 475 320 437L334 427Q345 433 358 443T388 483T405 549V557ZM304 42Q366 42 398 76T431 155Q431 178 420 200T396 238T359 270T321 296T283 318L263 328Q262 328 230 312Q190 290 175 266T160 198Q160 132 202 87T304 42",57:"549 220Q549 23 429 -82T105 -195H84V-189Q84 -179 85 -174V-164H93Q184 -156 238 -132T334 -56Q361 -23 376 16T394 78L397 100L363 88Q329 75 291 61T244 45Q237 44 218 44Q154 44 94 97Q29 152 29 240Q29 350 108 404Q145 429 257 480Q270 487 279 487Q403 487 470 421Q549 347 549 220ZM408 217Q408 276 390 320T346 385T297 415T259 424Q218 424 185 393T151 286Q151 216 213 154Q252 115 321 115Q368 115 388 134T408 217",58:"57 398Q57 419 72 438T117 457Q154 457 174 439T194 398Q194 379 176 361T119 343Q85 343 71 362T57 398ZM62 19T62 43T77 85T115 104Q153 104 175 86T197 42Q197 14 171 1T119 -12Q96 -12 79 3",59:"56 399Q56 424 73 440T104 456Q114 458 120 458Q149 458 170 440T192 399Q192 380 174 362T120 344Q85 344 71 362T56 399ZM78 53Q78 67 84 76T90 86Q90 88 98 92T116 98Q117 98 121 98T128 99Q152 97 181 58T211 -24Q211 -77 128 -165Q124 -170 121 -173T116 -178T113 -181T110 -185T106 -190L97 -184L88 -177L95 -168Q143 -104 143 -65Q143 -51 137 -40T113 -7T81 35Q78 41 78 53",61:"559 342L549 304H22L27 319Q29 328 30 333T33 343H296Q559 343 559 342ZM559 206L549 168H22L27 183Q29 192 30 197T33 207H296Q559 207 559 206",63:"121 590Q121 575 128 562T144 542T152 533T115 512L78 491Q55 499 47 516Q40 530 40 553Q40 601 77 632Q155 697 257 697H268Q316 697 355 679Q422 646 422 576Q422 518 388 476Q383 468 376 461T358 444T340 428T316 410T290 390L230 344Q180 307 180 275Q180 261 187 248T202 227L209 219Q209 215 176 193L142 170Q114 177 100 194T84 226V239Q84 259 93 276T113 302T150 331T192 362Q203 370 219 382T247 403T267 422Q312 471 312 546Q312 593 282 623T207 653Q170 653 146 636T121 590ZM95 23T95 49T117 94T173 113Q204 113 223 96T242 54Q242 27 221 7T167 -14Q136 -14 116 4",91:"226 711T225 711T86 699V-93H89Q94 -93 157 -96T223 -100H226V-119H223Q134 -119 42 -130H36V740H42Q61 738 156 736H226V723Q226 711 225 711",93:"69 732Q116 733 146 734T184 736T197 737T206 738H208V-132Q190 -129 160 -127T99 -125T66 -124H14V-103H19Q20 -103 84 -98T152 -92H158V699H151Q148 700 85 703T18 708H14V732H69",94:"1 463T1 464T148 599T296 734Q584 486 584 485L561 472Q538 459 537 461Q296 672 293 672L161 563Q133 539 97 509T44 466L28 452Q27 452 14 457",8216:"187 456Q187 437 169 424T138 411Q114 411 84 454T53 538Q53 565 75 597Q109 648 155 697L166 708L181 694L173 681Q124 610 124 577Q124 549 155 511T187 456",8217:"125 524Q125 545 92 588T58 651Q58 661 61 667Q65 674 80 683T107 692Q131 692 162 645T193 564Q193 540 176 509T144 460T87 394L78 400L68 406L79 421Q125 489 125 524",8260:"272 270Q503 721 506 721L509 720Q512 720 518 719T529 717L550 713L91 -181L66 -182Q41 -182 41 -181L272 270",58113:"388 427Q320 485 242 524T128 563H116Q95 563 87 561L77 559Q72 563 69 566T65 570T65 572L75 576Q106 592 154 611T212 630Q230 630 262 622T358 581T492 498L508 486Q512 463 512 396Q512 246 469 112L465 102Q453 94 341 25Q252 -27 247 -27Q243 -27 174 24T97 84Q90 100 90 214Q90 285 98 345Q100 360 102 363T118 377Q175 422 262 465Q264 463 270 460L277 456Q277 455 267 447T244 428T228 414Q206 382 206 269Q206 187 214 164T259 110Q286 89 342 58Q391 131 391 313Q391 355 388 412V427",58114:"39 362L37 366L38 368L82 405H133V474Q135 563 143 589T198 658Q210 669 224 676T247 687L255 690H253Q241 690 253 692Q254 692 256 692T260 693Q263 693 262 691L261 690Q300 690 361 662L373 656L388 666Q404 675 405 675L406 674Q406 672 406 670T406 664L408 655L301 555Q300 555 287 564T254 584T221 597Q190 597 176 583T161 550Q161 525 184 495T232 440T261 405H387V399Q377 389 364 379L340 359H258V315Q258 52 228 -18L172 -120L121 -211H109Q102 -212 96 -212L109 -174Q131 -108 135 -80T139 53V76V157V362H39",58115:"41 352Q40 354 39 355T37 358L36 360H37Q48 370 61 380L84 400H108Q131 400 131 402Q121 424 104 501L100 519Q109 560 134 602T196 664Q230 681 271 681Q291 681 316 669T358 644L373 631Q373 630 304 553Q299 548 294 547Q292 547 290 546H287Q286 546 274 562T243 593T205 609Q180 609 165 596T150 562Q150 526 191 488L217 462Q248 431 253 405V400H381L384 394L349 352H251V332Q249 271 231 17L227 -37L120 -217L109 -218Q103 -219 97 -219Q97 -218 101 -206T110 -177T118 -151Q126 -129 128 -120T136 -46T141 127Q141 250 136 340V352H41",58116:"107 370Q127 384 172 409T255 454T294 473L306 468Q356 446 425 431L435 429L524 468Q528 465 531 461Q499 395 499 271V263Q499 146 509 71T519 -8Q519 -28 512 -45Q510 -50 435 -123T355 -197Q296 -212 257 -212Q209 -212 164 -196T98 -167T67 -143L133 -44H144Q167 -88 216 -111T320 -134Q371 -134 390 -118T410 -69Q410 -52 404 -12T392 60T385 92L193 -29L158 5Q124 39 110 51L96 63V71Q94 79 94 121Q94 130 94 148T93 174Q93 230 96 275T103 344T107 370ZM221 397Q200 334 200 254Q200 170 210 140Q216 126 234 109T268 81L283 71L383 119V127Q384 132 384 241L385 347L368 349Q325 357 290 369T240 389T221 397",58117:"103 453Q103 631 95 661Q95 663 102 667T110 672L114 664Q117 655 123 641T131 621L140 597L154 606Q208 641 275 673L297 684Q300 683 302 682T307 679T310 678L314 676Q283 658 256 625Q238 601 231 579T223 515L224 512L282 548Q339 583 341 583T365 548T386 509Q326 443 318 443L316 446Q314 448 311 452T304 460T294 470T283 480T272 488T260 494T248 497Q231 497 223 474Q220 468 218 440T215 407V401H345L309 360H218V314Q218 181 221 139V129L253 108Q306 73 310 73Q315 73 343 83L373 92L374 87Q375 82 375 79T375 74T360 65T308 36T229 -13L208 -27L192 -13Q149 24 90 61Q89 61 89 62L90 68Q91 73 93 87T97 125T100 191T103 291V360H33V366L34 371L85 405H94L103 404V453",58120:"602 575Q505 508 505 489Q505 488 505 482T506 463T507 432Q507 314 456 237L449 226L434 216Q420 208 325 143L316 137Q453 82 488 82Q527 82 585 127L596 136Q597 136 599 126L602 115Q578 85 511 27T428 -31Q400 -31 308 10T170 51Q143 51 123 43T92 24T54 -15L34 6L41 14Q65 41 170 129L188 144L204 145Q254 147 293 164T350 208Q378 249 378 344Q378 422 362 478T320 563T268 605T213 618Q177 618 156 600T134 561Q134 539 162 508T217 446T245 394Q245 368 213 337T85 250L62 262Q73 269 86 279T116 308T133 338T108 378T57 439T32 499Q32 556 117 617T291 679Q350 679 393 658Q415 647 433 631T462 600T480 572T490 550T494 541T499 544T516 556T547 578T603 613T689 662L720 679L730 670Q742 659 756 649T785 629T810 615T836 601T855 590Q855 587 860 536T870 419T875 312Q875 114 800 -25Q794 -35 781 -47Q584 -220 398 -220Q322 -220 278 -190Q253 -173 239 -155L244 -150Q248 -145 255 -138T271 -120T290 -100T310 -80T328 -63T341 -51T349 -46Q350 -46 351 -46T354 -47Q357 -47 357 -52Q359 -68 364 -83T383 -118T424 -151T491 -166Q559 -166 613 -129Q629 -118 641 -108T674 -68T710 1T735 107T746 260Q746 433 727 507Q727 512 685 535T615 570L602 575",58121:"351 571Q317 571 247 563T171 555Q153 555 133 563T107 584Q94 605 98 609Q101 615 138 658T190 717H207Q204 710 204 699Q204 673 231 666Q235 665 264 665Q296 665 345 667T426 669Q474 669 501 660T545 626Q553 612 553 594Q553 531 498 474T379 384Q371 379 371 378Q371 376 390 376H411H434Q520 376 602 318Q621 303 627 288T633 234Q633 59 540 -34Q465 -109 348 -130Q308 -137 235 -137Q159 -136 143 -129Q132 -125 132 -118V-53Q118 -24 90 -24Q69 -24 37 -39L27 -44L25 -42Q23 -39 21 -35T17 -30Q17 -28 40 -14T103 19T177 44Q183 45 205 45Q219 45 227 44T245 37T259 20T264 -12Q264 -33 262 -48T259 -80Q259 -93 260 -95Q271 -110 305 -110Q343 -110 383 -86T443 -33Q491 34 491 154Q491 223 467 249Q428 288 334 288H322Q288 288 237 276L222 273L206 286L262 367Q279 369 303 377T358 403T410 452T431 524Q431 531 431 533T427 545T416 558T392 566T351 571"},{})},8745:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.fraktur=void 0;var H=L(9403),V=L(9349);T.fraktur=(0,H.AddPaths)(V.fraktur,{33:"102 582T102 620T112 673T152 689Q190 689 190 638Q190 605 167 373L148 187L133 184Q102 582 102 620ZM91 24T91 48T107 88T148 104Q171 104 187 87T204 48Q204 22 188 5T149 -12Q124 -12 108 6",34:"33 436Q8 603 8 648Q8 663 9 671T19 687T43 695Q63 695 74 681Q76 678 76 650V623L66 532Q57 443 55 436V432H33V436ZM128 666Q128 691 162 691T196 668Q196 634 186 531Q176 441 176 432H166Q155 432 155 434L142 545Q135 603 130 647Q128 664 128 666",38:"181 520Q181 604 231 650T328 697L330 698Q333 698 335 698Q336 698 340 698T346 697Q390 697 418 670T446 604Q446 554 414 511Q384 467 300 417L283 406Q281 405 296 374T347 286T425 182Q466 135 469 135Q470 135 473 140T480 152T486 165Q509 210 509 263Q509 282 507 292Q498 317 488 332T465 352T443 359T418 361Q388 361 357 358L346 356L347 374Q347 394 348 396V399H355Q366 396 535 396Q663 396 689 398L703 399Q703 398 702 375T700 351L688 353Q655 356 601 357Q553 357 553 355Q562 332 562 294Q562 280 561 267T555 241T548 218T539 195T529 175T518 156T508 141T497 126L489 115L496 107Q549 54 596 54Q623 54 644 67T677 101T697 140T708 174L710 187Q710 188 710 188L711 190Q714 190 723 187T733 183Q733 179 732 172T726 145T714 107T694 66T665 27T623 0T569 -11Q500 -11 443 41L434 49L425 42Q348 -9 275 -9Q251 -9 233 -6Q187 -1 152 18T98 60T67 111T52 159T49 195Q49 231 60 261T96 315T141 354T197 390L208 397Q181 459 181 520ZM374 577Q374 607 356 629T311 651Q289 651 271 636Q242 614 242 559Q242 533 249 502T262 453T270 435T279 440T298 453T314 464Q374 503 374 577ZM127 217Q127 145 173 89T291 32Q318 32 347 42T393 63T409 75Q384 100 325 184T227 351Q223 366 220 366Q215 366 178 338Q127 298 127 217",39:"69 666Q69 680 79 687T104 695Q112 695 117 694T128 684T134 659L104 438Q104 436 96 436T88 438Q88 447 79 540T69 655V666",40:"293 737V719Q291 718 285 714T276 708T268 702T258 695T250 686T241 674Q164 570 164 282Q164 -37 230 -119Q273 -171 292 -171Q293 -171 293 -179V-186H289Q270 -180 259 -175Q175 -132 145 -23T114 275Q114 491 157 598T293 737",41:"223 259Q223 386 212 474T178 609T136 677T89 714V735Q121 726 139 713Q276 622 276 273Q276 98 246 -23Q225 -106 189 -139T89 -187V-170L101 -165Q148 -146 172 -110T210 13T223 259",42:"118 573Q118 575 76 602L34 629L50 647L55 652L66 642Q76 633 91 620T117 598L128 590Q128 663 125 687V692H151V689V687Q151 685 151 683T150 678T150 672Q145 628 144 605V592L219 652L232 634Q232 632 220 624Q195 610 155 582L146 575L158 567Q178 552 197 540T225 523T233 516Q233 515 226 506T217 495L152 549L143 555V530Q144 509 145 492T148 466T149 454Q149 449 142 449H125V462Q128 522 128 549V562L115 552Q88 531 59 506L45 495Q44 495 39 505T34 516L118 573",43:"357 584L399 598V282H709L702 263L696 243H399V-64L379 -73L358 -82Q357 -82 357 81V243H47L51 253Q52 256 54 263T58 272L62 282H357V584",44:"99 62Q99 82 114 94T144 107Q159 107 178 77T205 26Q213 5 213 -23Q213 -49 207 -65T181 -113Q128 -189 122 -191Q121 -191 116 -184T111 -174Q111 -173 122 -155T145 -111T156 -62Q156 -44 152 -34T127 4L104 37Q99 49 99 62",45:"46 236L62 274Q62 275 384 275H706L699 255L693 236H46",46:"87 43Q87 69 104 85T142 102Q164 102 182 86T200 44Q200 20 183 3T141 -15Q118 -15 103 2T87 43",47:"230 270Q426 721 428 721Q437 719 447 717L466 713L448 672Q78 -180 77 -181Q77 -182 55 -182L34 -181L230 270",48:"212 -13Q184 -13 156 -2T101 32T59 97T42 195Q42 311 132 396Q170 433 211 462T262 492Q272 492 301 477T366 434T429 360T456 258Q456 161 378 74T212 -13ZM381 209Q381 257 365 295T328 355T282 390T243 408T223 413Q220 413 204 403T167 376T137 341Q119 305 119 250Q119 168 159 114T263 59Q308 59 344 93T381 209",49:"123 459Q145 459 170 460T217 462T256 464T284 466L295 467Q296 467 296 467T297 468Q299 468 302 466T307 462L309 459Q307 454 304 424T299 341T297 235Q297 139 298 101T302 55T313 44Q316 43 367 43L460 46Q460 35 459 22V-1H450Q402 2 281 6Q222 6 171 4T91 1T56 -1L47 -2V43H121H170Q195 43 201 45T209 56Q212 69 212 214Q212 333 209 365T194 409Q183 417 161 423T121 430L104 432Q103 432 103 446V459H123",50:"104 384Q115 394 133 409T199 449T281 474Q321 474 351 447T385 378Q385 328 333 255T228 127T176 72Q176 67 183 65Q184 65 203 65T260 67T331 69L475 73L484 67Q484 64 472 33L460 1H60V17L107 61Q210 159 249 208Q309 283 309 331Q309 363 285 389T228 415Q212 415 184 403T134 379L114 367L104 384",51:"305 328Q305 372 279 396T214 421H211Q172 421 128 384L107 398L116 405Q151 437 191 455T251 473H260Q314 473 341 455T382 394Q384 386 384 367T382 338Q362 263 271 217L256 210L257 206L259 202Q260 202 272 201T296 198T324 192T355 179T384 157T410 123T427 75Q429 64 429 41Q429 -59 353 -120T183 -182L88 -164Q81 -162 69 -157T48 -147T39 -141Q39 -139 46 -127L53 -114L69 -122Q129 -149 171 -149Q218 -149 253 -131T305 -83T330 -26T338 29Q338 41 336 55T328 89T308 127T273 153Q228 171 162 171Q158 171 152 171T142 170H127V204H134Q232 214 275 257Q305 292 305 328",52:"299 -179Q306 -156 306 -48V0H11V7Q10 10 10 18Q10 23 154 236L298 449Q298 450 339 463L379 476Q385 473 384 470V466Q384 463 384 457T384 444T383 427T383 408Q381 328 381 248Q381 46 384 40H387Q422 40 460 44Q465 44 470 44T478 44L481 45Q481 43 478 24T473 1Q473 -1 464 -1Q462 -1 451 -1T430 0H387V-76L389 -156V-161L311 -191Q299 -181 299 -179ZM299 364H287L277 352Q234 297 186 224T112 104T79 43Q79 42 192 42H306V115Q306 300 299 359V364",53:"334 25Q334 99 296 134T207 169Q154 169 107 123L98 114L89 120L80 125V458H420Q420 456 409 418L397 379Q397 378 264 378H131Q130 377 128 376T125 374T124 371T122 368T122 363T121 356T121 345V279V190L130 186L140 190Q196 214 260 214Q311 214 348 197T404 153T431 99T440 42T433 -16T406 -76T356 -130T276 -169T163 -184H156Q110 -184 57 -163L47 -159L53 -147L58 -134Q61 -134 74 -139T110 -148T156 -153Q206 -153 243 -135T299 -87T326 -30T334 25",54:"45 240Q45 328 73 406T143 536T235 626T327 681T399 699Q400 699 404 699T411 700Q424 700 441 696T459 689Q459 671 451 637Q451 633 447 632L444 629L434 633Q413 640 384 640H377Q299 640 222 565Q182 531 156 463T129 315V306H136L149 315Q229 376 316 376H318Q393 376 432 326T471 213Q471 129 402 58T237 -13T93 59T45 240ZM391 172Q391 231 354 272T258 314Q230 314 200 302T154 279T133 262L134 249Q154 32 266 32Q315 32 353 64T391 172",55:"395 377L391 382H225Q59 382 59 383L74 423Q89 464 89 465Q90 468 94 468Q146 460 350 458H498V442L473 406Q241 75 125 -156L113 -181H40L37 -168L57 -140Q115 -58 199 70T339 287T395 377",56:"220 -10Q168 -10 131 6T75 50T48 103T40 157Q40 223 77 266Q103 295 156 328T225 375Q247 393 247 394L206 361Q205 361 193 368T164 391T131 426T102 474T90 531Q90 580 114 615Q146 660 238 698L254 705L262 704Q288 704 332 693T402 656Q434 620 434 568Q434 518 401 475T321 402L305 391L336 368Q339 366 353 356T372 343T389 330T406 316T420 301T434 283T445 265T454 244T458 222T461 195Q461 106 389 48T220 -10ZM350 545Q350 578 337 601T304 634T266 649T234 653L224 654L204 639Q196 634 191 629T182 621T176 614T173 609T170 603T168 597Q165 585 165 567Q165 497 261 424L273 415Q350 467 350 545ZM261 405L263 407Q262 407 261 405ZM258 403Q257 403 255 401L254 399L256 400Q258 402 258 403ZM252 398Q251 398 249 396L248 394L250 395Q252 397 252 398ZM245 36Q276 36 300 45T338 69T360 102T371 136T374 168Q374 211 341 255Q324 275 305 289T235 332Q231 330 215 321T193 307T173 292T153 271T138 247T127 216T123 177Q123 146 132 117T170 62T245 36",57:"353 93T352 93T320 79T251 49T201 34Q127 37 87 79Q28 138 28 234Q28 273 37 304T60 355T101 396T152 429T218 462L234 469H243Q348 461 395 417Q466 348 466 201Q466 72 397 -29T211 -163Q155 -179 91 -182H72V-154H80Q144 -154 202 -131T297 -60Q318 -31 333 7T352 68L357 92Q353 93 352 93ZM369 208Q369 240 362 272T339 339T290 394T214 415Q171 415 144 372T116 266Q116 193 154 144T238 95H249Q369 95 369 208",58:"50 377T50 400T64 440T99 457Q128 457 146 440T165 399Q165 375 146 359T102 342T64 359ZM53 19T53 43T66 86T103 105Q129 105 148 87T168 41Q168 17 147 3T102 -12Q80 -12 67 3",59:"47 399Q47 424 62 441T101 458T143 442T162 400T144 359T101 343Q78 343 63 360T47 399ZM76 86Q76 88 80 91T91 96T106 99Q119 99 131 86Q179 35 179 -25Q179 -64 146 -115T89 -189Q86 -187 83 -185T79 -182T76 -180T75 -177T77 -173T80 -168Q121 -108 121 -64Q121 -44 94 -5T66 52Q66 66 71 75T76 86",61:"725 366Q724 365 721 349T716 331V329H385Q54 329 54 331Q55 332 59 349T63 368H394Q725 368 725 366ZM725 169Q724 168 721 152T716 134V132H385Q54 132 54 134Q55 135 59 152T63 171H394Q725 171 725 169",63:"46 557Q46 613 103 653T227 693Q287 693 322 659T357 564Q357 517 326 469T259 390T191 326T160 272Q160 240 187 221Q193 217 193 216Q182 209 170 200L147 184Q127 192 113 209T98 250Q98 290 193 376Q287 454 287 542Q287 581 262 616T188 652Q143 652 126 631T108 588Q108 559 140 527L79 490Q46 515 46 557ZM108 47Q108 68 123 85T160 103Q179 103 198 90T217 46Q215 24 201 7T164 -11Q142 -11 125 6T108 47",91:"262 -119Q224 -120 191 -123T141 -128T118 -130Q117 -130 117 305V740H122Q141 737 219 736H278V723Q278 711 277 711L159 699V-93H162Q167 -93 220 -96T276 -100Q278 -100 278 -109V-119H262",93:"64 733Q89 733 110 734T143 737T158 738H160V-131H154Q101 -125 40 -124H-4V-103H1Q3 -102 57 -98T113 -92H118V700L64 703Q7 707 3 708H-4V732H21Q34 733 64 733",94:"0 464L250 734L262 722Q274 712 384 598L495 486Q483 478 467 467L456 459L248 672L154 580L23 452Q17 454 10 458T0 464",8216:"117 410Q97 410 71 455T45 539Q45 588 129 694L140 708Q142 708 153 694L147 682Q106 609 106 582V577V571Q106 548 132 511T158 455Q158 434 143 422T117 410",8217:"105 529Q105 546 77 588T49 651Q49 658 51 666Q53 672 67 682T92 692Q111 692 137 644T163 563Q163 534 143 497T99 428T74 395Q72 395 65 400T58 407Q105 476 105 523V529",8260:"230 270Q426 721 428 721Q437 719 447 717L466 713L448 672Q78 -180 77 -181Q77 -182 55 -182L34 -181L230 270",58112:"427 436Q427 434 427 425T429 398T430 362Q430 222 396 109L393 99L305 33Q218 -32 216 -32Q208 -29 142 22L91 68L78 81L77 94Q75 130 75 173Q75 245 87 347L135 385Q178 418 184 424L177 428Q174 429 170 431Q116 454 96 473T75 534Q79 608 154 683Q164 677 164 673Q164 670 157 662T144 637T137 598Q137 552 182 518T280 470T380 447T427 436ZM342 371L275 394L208 417Q203 417 192 399T168 334T156 229Q153 187 153 157Q153 141 156 135Q158 125 208 88T280 51Q306 51 326 120T346 297Q346 339 344 354T342 371",58113:"39 551L35 569L52 577Q72 586 98 595T140 610T158 616Q174 612 200 604T293 560T412 477Q414 475 417 472Q428 462 430 450T432 376Q432 223 401 124Q395 106 393 103T382 92Q351 68 281 20T206 -29Q201 -31 137 26L100 60L78 83L77 112Q76 132 76 170Q76 259 86 342L88 360L101 371Q116 386 163 422T215 459Q216 459 224 455T233 450L229 446Q225 442 218 434T203 419Q179 394 175 389T168 372Q156 334 156 262Q156 167 164 137Q168 125 196 102T252 62L278 45Q279 45 285 52T302 78T322 126T339 205T346 316Q346 367 344 389L343 406L326 423Q228 520 113 559L100 564L70 557L39 551",58114:"123 386L120 431Q116 476 116 511V520Q116 593 174 649Q207 680 236 680Q258 680 284 664T312 648Q318 648 327 656Q328 657 330 659Q337 664 337 661Q337 660 338 657Q338 652 339 648L268 566L260 574Q234 600 206 600Q182 600 164 585T145 541Q145 492 211 386L267 385H324L299 354H214V312Q214 86 193 -58L192 -69L116 -215H108Q92 -215 92 -212Q93 -211 100 -189T116 -135T128 -80Q134 -41 134 22Q134 54 130 185T125 349V354H29L59 385H91Q123 385 123 386",58115:"91 530Q91 564 116 600T164 656T194 678Q195 678 200 678T209 679Q268 679 316 639L293 593Q267 547 263 546H262Q260 546 256 553Q222 613 180 613Q160 613 146 599T132 564T170 474T210 388H318L296 356H206V322Q204 284 204 255Q202 221 202 161V99Q202 28 194 -22T160 -124Q148 -146 116 -199L101 -224L91 -220Q85 -218 84 -217T83 -215L101 -161Q116 -114 119 -73T122 108Q119 334 117 352V356H72L28 357L66 388H92Q118 388 118 389L109 433Q91 514 91 530",58116:"254 -150Q293 -150 328 -126T363 -54Q363 -38 352 29T339 98L250 34Q160 -30 159 -30L77 64V71Q74 95 74 174Q74 212 75 243T79 294T83 328T87 352T90 366L117 384Q206 446 238 464L250 471Q277 455 306 443T350 427L365 423Q367 423 405 443T443 465L449 455Q431 414 426 362T418 201Q418 135 420 121Q438 -4 438 -19Q438 -26 438 -31T434 -42T429 -51T420 -63T408 -77T391 -95T370 -119T346 -147T325 -170T309 -187T291 -200T274 -207T252 -213T225 -214Q175 -214 132 -196T70 -160L52 -143Q52 -138 90 -48Q90 -47 95 -47H101Q108 -81 146 -115T254 -150ZM341 136Q341 157 344 242T347 348V355L334 356Q299 359 262 367T203 383T179 391Q177 391 173 377T163 323T158 227Q158 164 161 128V121L174 106Q203 75 223 59L341 127V136",58117:"92 446Q92 603 82 664Q94 670 95 670L96 666Q98 661 101 651T108 633Q121 598 121 597L141 612Q247 686 250 686Q251 686 266 679Q261 674 243 659T213 632T190 597T173 546Q172 541 171 530T170 511T170 502Q171 502 222 542L273 582Q308 522 315 504L279 449L269 462Q231 506 215 506Q202 506 190 490Q164 458 164 395V390H279L266 373L254 355H167V306Q169 252 169 217Q170 195 170 147V117L200 92Q234 64 237 64Q243 64 277 81L311 99V75Q310 75 242 27L174 -20L156 -3Q88 60 81 60L79 62Q80 60 82 62Q87 67 87 290V355H57L26 356L73 390H92V446",58118:"117 531Q117 533 137 544T178 566L198 577Q200 577 204 575T208 572V570Q208 568 208 566T207 560Q197 496 197 397V392H321L295 353H199V260Q199 157 200 145V122L269 68Q271 67 274 67Q282 67 310 83T342 100Q343 100 345 92T346 83L211 -21L172 12Q117 59 117 63Q117 65 117 87T119 150T120 238V353H75L29 354L65 391H118V460Q117 498 117 531",58119:"337 91V78L324 71Q288 53 256 29T206 -8T180 -22Q174 -22 158 -9Q82 46 60 46H59L63 51Q67 56 73 68T85 96Q101 158 101 254Q101 300 95 330T83 370T66 394L53 388Q48 385 41 382T24 374Q22 376 20 378T16 381T13 383T10 385V386L119 475Q150 439 160 430L171 422V409Q173 377 173 300Q173 228 166 183T152 122T145 102Q207 81 242 58L337 104V111Q340 146 340 227Q340 320 339 351T338 408V423L422 469Q425 465 429 462L426 438Q413 354 413 251Q413 152 423 119Q426 110 435 96T452 82Q454 82 509 103Q514 98 514 89Q514 87 507 81T472 51T409 -7L395 -20Q393 -18 390 -17Q386 -14 382 -6Q380 -2 379 1Q369 24 361 40T348 62T341 73T338 84L337 91"},{})},181:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.italic=void 0;var H=L(9403),V=L(9741);T.italic=(0,H.AddPaths)(V.italic,{33:"330 716Q351 716 365 703T380 670V659L304 433Q230 207 227 204Q225 198 205 198Q184 198 184 207T220 439T260 669Q270 694 297 708Q300 709 304 710T311 713T316 714Q324 716 330 716ZM107 51Q110 83 133 102T179 121Q207 121 219 105T231 72Q231 45 209 23T156 0Q138 0 123 11T107 51",34:"214 620Q214 647 236 670T289 694Q312 694 326 677T341 633V624Q341 588 327 550T294 482T253 428T216 392T196 379Q191 379 184 388T176 401Q176 404 195 421T243 472T287 547Q299 576 299 582L295 580Q291 578 282 576T264 573Q241 573 228 585T214 620ZM411 620Q411 647 433 670T486 694Q509 694 523 677T538 633V624Q538 588 524 550T491 482T450 428T413 392T393 379Q388 379 381 388T373 401Q373 404 392 421T440 472T484 547Q496 576 496 582L492 580Q488 578 479 576T461 573Q438 573 425 585T411 620",35:"281 327H228Q186 327 175 330T164 347Q164 359 176 365Q179 367 292 367H404L563 688Q569 694 578 694T593 686T597 670Q597 667 531 535L448 367H614L773 688Q779 694 787 694Q796 694 802 688T808 674V672L807 670Q807 667 732 517L658 368L736 367H814Q828 357 828 347Q828 336 812 327H637L599 250Q561 174 561 173H662H724Q760 173 769 170T779 153T770 136T729 132Q721 132 696 132T651 133H540L380 -188Q374 -194 366 -194Q357 -194 351 -188T345 -174L346 -172V-170Q346 -167 412 -35L495 133H330L170 -188Q164 -194 156 -194Q147 -194 141 -188T135 -174L136 -172V-170Q136 -167 211 -17L285 133H207L130 134Q115 140 115 153Q115 164 131 173H306L344 250Q382 326 382 327H281ZM592 327H427L389 250Q351 174 351 173H516L554 250Q592 326 592 327",37:"301 348Q257 348 231 383T205 480Q205 553 244 629T346 736Q370 750 394 750Q416 750 429 742T458 714Q512 644 606 644Q722 644 802 732Q817 750 827 750Q835 750 841 744T847 730Q847 725 827 700T689 540Q586 421 512 335Q180 -50 176 -52Q172 -56 165 -56Q157 -56 151 -50T145 -35Q145 -29 162 -9T330 186Q392 258 430 302Q711 627 711 628L701 624Q652 607 604 607Q551 607 494 634L479 642V624Q479 544 439 467Q414 416 377 382T301 348ZM270 443Q270 385 303 385H306H308Q326 385 348 407Q384 441 409 504T434 627Q434 713 390 713Q358 713 328 663Q307 631 289 556T270 451V443ZM608 -56Q573 -56 543 -23T513 76Q513 129 536 190T604 296L627 318Q670 347 704 347Q747 347 767 310T788 222Q788 126 732 35T608 -56ZM742 222Q742 310 699 310Q677 310 655 285T620 227Q608 197 593 138T578 42V36Q578 -18 613 -18Q657 -18 699 64T742 222",38:"209 444Q209 546 278 631T424 716Q473 716 501 683T530 601Q530 554 511 535T467 515Q446 515 437 527T427 553Q427 578 446 594T481 610H483V617Q480 641 464 660T419 679Q367 679 328 603Q316 578 305 538T288 470L282 443L295 449Q308 455 330 462T371 469Q397 469 413 450T430 404Q430 363 400 329T331 295Q291 295 256 322Q255 322 246 293T227 223T217 158Q217 117 232 88T273 43T327 22T387 15Q457 15 512 37T599 93T652 169T680 248T688 317T678 380T659 423T647 437Q643 435 637 431T613 416T581 392T554 364T538 332Q540 310 541 310Q554 335 587 335Q601 335 613 327T626 300Q626 290 622 279T603 255T563 242Q532 245 512 263T491 320Q494 351 511 377T547 418T600 456T652 494Q676 512 697 539T728 582T738 601Q738 602 736 602Q732 602 726 604T714 616T707 638Q707 661 724 677T764 694Q799 694 802 660Q802 625 767 562T688 467L694 458Q700 449 702 444T711 428T720 408T727 385T733 358T735 327Q735 281 724 235T685 141T617 59T515 1T375 -22Q270 -22 199 34T127 181Q127 216 147 270T207 374L216 386Q209 421 209 444ZM386 412Q386 432 366 432Q345 432 325 418T294 390T284 375Q284 371 289 362T306 343T335 332Q355 332 367 350T383 384T386 412",39:"250 620Q250 647 272 670T325 694Q348 694 362 677T377 633V624Q377 566 343 506T275 412T231 379Q226 379 220 388T213 401T232 421T279 472T323 547Q335 573 335 582L331 580Q327 578 318 576T300 573Q277 573 264 585T250 620",40:"241 -250Q203 -212 174 -140T144 39Q144 158 180 288T296 544T481 746L487 750H499Q517 750 517 740Q517 736 495 716Q399 630 331 491T236 228T208 3Q208 -73 224 -130T255 -214T271 -244Q271 -250 252 -250H241",41:"326 497Q326 546 320 588T304 655T285 699T269 728T262 740Q262 746 267 749L272 750Q276 750 281 750H293Q331 712 360 640T390 461Q390 332 339 171T188 -116Q161 -150 121 -188T47 -250H35Q17 -250 17 -240Q17 -236 39 -216Q135 -130 203 9T298 272T326 497",42:"560 658Q569 658 576 649T584 631Q584 625 583 620T577 611T569 603T556 595T540 587T519 578T494 566L428 536Q427 535 433 531T479 502Q525 475 532 469T539 450Q538 435 525 424T497 412Q489 412 482 418T442 456Q400 497 400 494L387 420Q376 353 373 343T352 323Q345 320 336 320H331Q322 320 316 327T309 343Q309 347 334 420L359 496Q358 496 297 456T234 414Q228 411 221 411Q212 411 204 417T195 439Q198 458 209 465T283 502L353 534L300 566Q255 593 247 599T239 616Q239 631 252 644T282 658Q290 658 295 654T335 615L378 573L391 647Q393 657 395 671T398 691T400 706T404 720T408 730T414 739T423 744T434 749Q435 749 439 749T445 750Q467 748 469 728Q469 723 457 685T432 610L420 573L481 613Q548 658 560 658",43:"139 237T139 250T151 266T198 270H293H431L465 407Q469 424 476 452Q494 528 500 542T519 557Q526 557 532 552T538 538Q538 536 507 409T472 272Q472 270 604 270Q737 270 741 268Q753 261 753 250Q753 237 742 233T696 229Q687 229 655 229T599 230H462L461 226Q461 224 427 91T392 -47Q387 -57 374 -57Q367 -57 361 -51T355 -37Q355 -31 388 99L421 230H288Q267 230 238 230T199 229Q163 229 151 233",44:"106 46Q106 68 121 90T167 120Q168 120 173 120T180 121Q232 121 232 59V54Q232 18 219 -20T186 -88T145 -143T109 -181T88 -194Q84 -194 77 -185T69 -171Q69 -168 70 -166T76 -161T85 -154T101 -139T124 -114Q146 -88 162 -58T183 -12T188 7Q187 7 183 5T172 2T156 0Q129 0 118 14T106 46",45:"205 180H131Q102 180 93 181T84 190Q90 238 103 251H334Q341 244 341 241Q341 236 336 214T327 186Q325 181 312 181T205 180",46:"107 50Q107 76 129 98T181 121Q203 121 217 108T231 72Q231 47 210 24T156 0Q135 0 121 13T107 50",47:"166 -215T159 -215T147 -212T141 -204T139 -197Q139 -190 144 -183Q157 -157 378 274T602 707Q605 716 618 716Q625 716 630 712T636 703T638 696Q638 691 406 241T170 -212Q166 -215 159 -215",48:"414 665Q562 665 562 490Q562 426 534 318Q451 -21 251 -21Q222 -21 202 -15Q155 2 134 40T110 144Q110 201 127 286T187 470T287 614Q348 665 414 665ZM187 98Q187 59 208 37T260 15Q320 15 365 83Q394 128 440 312T487 547Q487 580 471 600T433 627Q428 628 408 628Q381 628 353 609T311 569Q279 526 239 364T190 143Q187 120 187 98",49:"248 491Q228 491 228 502Q228 516 236 532Q237 536 246 537T275 541T314 552Q350 567 382 595T430 644L446 664Q450 666 454 666Q468 666 468 658Q468 647 395 359Q321 63 321 59Q321 52 334 50T388 46H422Q428 37 428 35Q428 19 421 5Q416 0 405 0Q400 0 361 1T263 2Q215 2 185 2T142 1T127 0Q110 0 110 11Q110 13 113 25T118 40Q120 46 146 46Q196 46 212 49T235 61Q238 66 295 295L353 526L340 519Q328 512 302 503T248 491",50:"159 404Q159 433 176 476T222 562T297 635T395 666Q466 666 508 617T551 497Q551 473 545 446Q534 388 482 333Q441 292 355 240T264 184Q216 151 179 101L171 91Q171 90 177 90Q206 90 269 77T366 64Q385 64 390 65Q418 73 441 98T475 156Q479 168 481 170T495 173H518Q524 167 524 166T521 152Q502 86 459 32T353 -22Q315 -22 259 15T172 53Q156 53 143 36T126 1L121 -16Q119 -22 98 -22H82Q76 -16 76 -13T80 5T98 50T132 111T189 178T274 242Q327 273 364 305T420 370T447 427T460 483Q466 514 466 538Q466 586 443 607T389 629Q338 629 293 584T226 487T204 399Q204 390 204 386T209 378T222 373Q258 376 282 422T307 493Q307 506 302 517T297 531Q297 537 308 546T327 551Q329 550 333 543T340 523T344 497Q344 450 306 393T216 336Q186 336 173 355T159 396V404",51:"296 531Q296 536 307 544T322 553Q330 553 338 534T346 501Q346 468 319 440T258 412Q232 412 216 430T200 478Q200 552 281 618Q345 666 416 666Q489 666 525 625T562 530Q562 473 525 419T430 335L416 329Q479 288 479 206Q479 142 440 89T344 7T229 -22Q173 -22 135 12T96 106Q96 192 157 192Q192 192 197 157Q197 134 184 117T142 96Q153 47 180 29Q201 15 232 15Q249 15 275 22Q307 34 331 57Q363 90 379 153T396 246Q396 261 393 272T384 290T371 301T355 308T341 311T326 312H316H307Q287 312 282 313T276 320Q276 323 279 337T283 352Q284 356 290 357T325 358Q364 359 368 360Q386 365 400 372T433 397T464 448T485 527Q487 535 487 556Q487 629 414 629Q350 629 298 580T245 476Q245 450 263 450H264Q280 450 294 463T308 496Q308 508 302 518T296 531",52:"448 34Q453 34 463 22T473 5Q473 -2 457 -7Q417 -22 383 -23H366L350 -91Q348 -98 345 -111T340 -130T335 -146T330 -161T325 -172T318 -182T310 -188T299 -193T286 -194Q256 -194 253 -165Q253 -159 271 -83T292 -5Q231 29 169 29Q114 29 91 14Q72 -2 65 1Q46 20 46 28Q46 35 55 43T77 60T96 74Q306 257 396 623Q410 666 444 666Q459 666 468 657T478 634Q478 627 470 595T440 504T387 381T303 239T187 99L164 75H178Q217 75 260 59L304 43Q304 48 325 127Q342 195 346 207T358 228Q372 242 391 242Q403 242 413 235T423 214Q423 205 402 116T378 25Q378 23 387 23Q405 23 418 25T439 31T448 34",53:"196 304Q189 309 189 314Q189 317 231 487T275 660Q278 666 283 666Q287 666 302 658T346 643T413 635Q447 635 481 642T537 658T559 666Q561 666 564 663T567 658Q565 637 557 629Q528 600 474 573T359 545Q342 545 327 546T304 550T294 552L291 540Q288 529 283 507T273 465L251 379Q307 420 364 420Q415 420 456 382T497 261Q497 165 429 82T262 -20Q256 -20 247 -21T233 -22Q176 -22 141 15T106 112Q106 208 173 208Q192 208 203 197T214 169Q214 143 195 125T156 107H153V100Q155 73 174 47T239 21Q245 21 259 23Q355 46 392 200Q393 205 394 207Q412 276 412 312Q412 352 396 367T358 383Q288 383 233 314Q226 306 224 305T209 304H196",54:"377 434Q425 434 457 404T499 341T509 278Q509 243 496 194T456 105T383 27Q322 -22 256 -22Q142 -22 122 114Q120 130 120 159Q120 221 135 292T195 452T310 599Q390 665 465 665Q565 665 565 583V574Q565 543 546 524Q528 506 504 506Q491 506 478 514T465 543Q465 585 515 602Q505 626 466 626Q419 626 372 587Q334 557 305 503T266 409L255 370Q287 410 339 429Q361 434 377 434ZM424 333Q424 359 411 378T365 397Q318 397 282 356T230 257T205 157T197 94Q197 67 211 45T260 22Q313 22 341 57T386 151Q424 283 424 333",55:"466 519Q448 519 435 528T416 550T400 571T376 581Q324 581 271 540T186 437Q185 435 183 432T181 428T179 426T177 424T174 423T171 422T165 422H159Q141 422 141 423Q136 423 136 431Q136 433 190 548T247 665Q249 666 266 666H282Q288 660 288 657Q288 655 284 646T276 628L273 620Q337 666 390 666Q413 666 425 652T438 620T444 584T457 559Q460 557 470 557Q497 557 524 582T571 635T594 665Q595 666 612 666H628Q634 660 634 657Q634 653 618 629T572 556T510 441T437 269T367 43Q356 -22 304 -22Q291 -22 278 -14T263 14Q263 36 281 95T354 269T486 507Q497 524 495 524Q482 519 466 519",56:"209 449Q209 545 278 605T416 666Q482 666 517 631T553 546Q553 513 539 482T504 430T463 394T426 370L410 360L430 343Q471 309 483 278T495 211Q495 141 441 75Q363 -21 253 -21Q182 -21 141 18T99 117Q99 161 119 201T170 268T222 308T259 331L272 338L259 349Q212 389 209 449ZM492 542Q492 586 469 605T415 625Q360 625 320 587T279 505Q279 495 281 487T286 474T295 460T306 449T321 436T337 422Q379 386 380 386Q389 386 420 412T472 471Q492 513 492 542ZM163 118Q163 76 189 49T258 21Q316 21 368 64T420 170Q420 193 412 208T395 233T350 271L302 312Q298 312 284 303T249 276T209 235T177 181T163 118",57:"297 211Q258 211 230 228T189 273T169 323T163 367Q163 411 183 472T254 585Q327 656 401 665Q403 665 412 665T427 666Q458 664 481 652T518 622T539 580T550 535T553 491Q553 448 544 395T515 277T454 148T358 37Q282 -22 213 -22Q166 -22 137 -1T107 55V64Q107 88 114 104T134 127T154 136T169 138Q185 138 196 128T207 101Q207 82 196 68T172 48L161 43Q161 40 167 36T187 26T219 21Q286 21 344 99Q364 126 382 169T408 241T417 275L412 269Q406 263 395 253T370 234T337 218T297 211ZM476 552Q476 626 417 626Q368 626 330 584Q312 563 300 533T270 433Q248 341 248 312Q248 286 262 267T310 248Q353 248 387 287T440 380T467 480T476 552",58:"184 358Q184 385 206 408T258 431Q279 431 293 418T308 383Q308 354 284 332T233 310Q212 310 198 324T184 358ZM107 50Q107 76 129 98T181 121Q203 121 217 108T231 72Q231 47 210 24T156 0Q135 0 121 13T107 50",59:"184 358Q184 385 206 408T258 431Q279 431 293 418T308 383Q308 354 284 332T233 310Q212 310 198 324T184 358ZM107 47Q107 77 130 99T180 121Q226 121 226 61Q226 25 214 -14T182 -84T144 -140T109 -180T88 -194T77 -185T70 -172Q70 -169 84 -155T121 -112T161 -48Q180 -10 180 3Q180 4 174 2Q172 2 166 1T156 0Q135 0 121 13T107 47",61:"776 357T776 347T761 327H470Q180 327 176 329Q164 334 164 347Q164 359 176 365Q179 367 470 367H761Q776 357 776 347ZM116 143T116 153T131 173H422Q713 173 717 171Q728 166 728 153T717 135Q713 133 422 133H131Q116 143 116 153",63:"235 431Q217 431 206 442T195 468Q195 490 215 537T280 638T380 707Q403 716 423 716Q425 716 429 716T436 715Q485 715 518 681T551 590Q551 543 530 503T482 439Q471 428 400 375T318 310Q300 287 300 259Q300 236 315 236Q333 236 352 251T384 300Q386 306 407 306H423Q429 300 429 297Q429 272 393 235T308 198Q287 198 269 215T251 270Q251 330 293 374L374 436Q377 438 401 456T432 480T457 503T481 531T494 561T501 598Q501 614 499 626Q482 678 430 678H426Q392 678 362 660T311 615T280 571T264 540L259 528Q259 527 266 526T283 516T294 492Q294 466 276 449T235 431ZM209 51Q212 83 235 102T281 121Q309 121 321 105T333 72Q333 45 311 23T258 0Q240 0 225 11T209 51",64:"198 250Q198 155 248 91T394 26Q514 26 640 80L650 84H675H683Q709 84 709 76Q709 73 708 71Q706 64 660 45T534 8T383 -11T260 24T181 115Q152 168 152 248Q152 410 268 552Q303 590 324 608Q439 705 551 705Q611 705 658 683T733 623T775 543T789 454Q789 380 766 304T720 192Q677 125 617 125Q591 125 573 137T548 160T541 176Q541 178 540 178L534 173Q527 168 515 160T488 144T454 131T417 125Q361 125 320 166T279 284Q279 393 356 481T523 569Q570 569 603 537Q623 515 632 490L637 480L657 479Q684 479 684 470Q684 465 650 333L617 199V185Q616 162 628 162Q677 162 712 278Q743 381 743 442Q743 555 687 611T553 668Q467 668 385 608T250 450T198 250ZM598 445Q598 453 594 470T569 510T518 532Q463 532 410 448T356 271Q356 220 374 191T423 162Q482 162 552 255L575 348Q598 440 598 445",91:"205 -221Q205 -239 194 -250H137H106Q73 -250 73 -242Q73 -232 194 255T321 747L324 750H381H417Q435 750 440 748T446 739Q446 730 443 723T437 712L434 710H350L349 706Q349 704 235 249T120 -208Q120 -210 159 -210Q166 -210 175 -210T187 -209Q205 -209 205 -221",93:"227 721Q227 739 238 750H295H326Q359 750 359 742Q359 732 238 245T111 -247L108 -250H51H15Q-3 -250 -8 -248T-14 -239Q-14 -230 -11 -223T-5 -212L-2 -210H82L83 -206Q83 -204 197 251T312 708Q312 710 273 710Q266 710 257 710T245 709Q227 709 227 721",94:"528 555Q528 549 514 538T496 527Q491 527 470 554Q458 569 449 580L414 625L353 578Q339 567 323 555T298 536L290 529Q286 527 285 527Q279 527 273 533T264 546L260 553Q260 559 263 562Q265 564 342 628T421 693T425 694Q430 694 433 691Q528 563 528 555",95:"98 -62Q91 -58 91 -51Q91 -31 100 -26Q102 -25 324 -25H442H500Q536 -25 545 -27T554 -36Q554 -50 548 -56Q546 -60 538 -61Q520 -62 319 -62H98",126:"266 208Q262 208 255 215T247 228Q247 233 250 236T274 259Q335 318 369 318Q394 318 420 292T464 265Q485 265 516 291T550 318Q554 318 562 311T571 297Q570 293 551 273T502 231T451 209H447Q421 209 396 235T355 261Q334 261 301 235T266 208",305:"75 287Q75 292 82 313T103 362T142 413T196 441H214Q248 441 270 419T293 357Q292 338 289 330T245 208Q193 72 193 46Q193 26 209 26Q228 26 247 43Q273 71 292 136Q295 148 297 150T311 153H317Q327 153 330 153T337 150T340 143Q340 133 330 105T292 41T228 -8Q220 -10 204 -10Q160 -10 141 15T122 71Q122 98 171 227T221 384Q221 396 218 400T203 405Q175 403 156 374T128 312T116 279Q115 278 97 278H81Q75 284 75 287",567:"75 284T75 287T81 305T101 343T133 389T180 426T240 442Q273 440 300 420T327 350V332L278 134Q267 92 253 37T233 -45T225 -73Q208 -123 162 -163T54 -204Q8 -204 -15 -181Q-32 -164 -32 -140Q-32 -112 -14 -96T27 -79Q48 -79 57 -91T67 -114Q67 -146 39 -166L44 -167H59H60Q112 -167 145 -74Q148 -65 198 134T251 347Q252 353 252 370Q252 382 251 388T245 399T230 405Q204 405 175 378Q157 360 145 337T126 298T117 280T98 278H81Q75 284 75 287",768:"-222 651Q-222 668 -206 682T-174 697Q-155 697 -145 680Q-140 671 -107 599T-74 526Q-74 522 -88 511T-107 500Q-109 500 -113 502T-167 568T-219 637Q-222 643 -222 651",769:"-148 500Q-154 500 -163 511T-173 528Q-173 529 -172 530V532Q-170 534 -97 610T-21 688Q-8 697 4 697Q19 697 29 688T39 663T30 638Q26 631 -50 573L-135 507Q-144 500 -148 500",770:"17 555Q17 549 3 538T-15 527Q-20 527 -41 554Q-53 569 -62 580L-97 625L-158 578Q-172 567 -188 555T-212 536L-221 529Q-225 527 -226 527Q-232 527 -238 533T-248 546L-251 553Q-251 559 -248 562Q-246 564 -169 628T-90 693T-86 694Q-81 694 -78 691Q17 563 17 555",771:"-245 558Q-249 558 -256 565T-264 578Q-264 583 -261 586T-237 609Q-176 668 -142 668Q-117 668 -91 642T-47 615Q-26 615 5 641T39 668Q43 668 51 661T60 647Q59 643 40 623T-9 581T-60 559H-64Q-90 559 -115 585T-156 611Q-177 611 -210 585T-245 558",772:"-275 544Q-282 548 -282 554Q-282 561 -279 573T-271 588Q-269 589 -111 589H-27H12Q38 589 46 587T54 578Q54 574 51 563T47 550Q45 546 32 545Q15 544 -118 544H-275",774:"-237 641Q-237 694 -218 694H-213Q-195 694 -195 684Q-195 683 -195 679T-197 667T-198 650Q-198 611 -176 589T-117 566Q-74 566 -34 597T23 678Q27 689 30 691T43 694Q62 694 62 684Q62 671 49 645T14 589T-46 537T-123 515Q-175 515 -206 550T-237 641",775:"-165 599Q-162 631 -139 650T-93 669Q-65 669 -53 653T-41 620Q-41 593 -63 571T-116 548Q-134 548 -149 559T-165 599",776:"-251 601Q-251 626 -230 647T-180 669Q-139 669 -133 625Q-133 595 -155 575T-203 554Q-223 554 -237 567T-251 601ZM-72 599Q-72 632 -48 650T-2 669Q18 669 31 657T45 623Q45 592 22 573T-25 554Q-68 554 -72 599",778:"-199 610Q-199 654 -161 685T-79 716Q-39 716 -16 693Q3 674 3 647Q3 607 -34 575T-118 542Q-199 542 -199 610ZM-41 631T-41 655T-83 679H-89Q-129 679 -142 656Q-146 650 -151 632T-156 604Q-156 578 -113 578H-108Q-94 578 -86 579T-69 586T-52 605Q-41 631 -41 655",779:"-217 503Q-221 503 -234 510T-248 523Q-248 528 -205 602Q-200 610 -192 623T-180 644T-170 661T-159 676T-151 686T-142 694T-134 696Q-132 697 -121 697Q-88 694 -88 664Q-88 652 -97 640T-152 574Q-214 504 -217 503ZM-64 503Q-68 503 -81 510T-95 523Q-95 528 -52 602Q-47 610 -39 623T-27 644T-17 661T-6 676T2 686T11 694T19 696Q21 697 32 697Q65 694 65 664Q65 652 56 640T1 574Q-61 504 -64 503",780:"11 637Q16 637 22 624T29 607Q29 606 27 602Q26 600 -47 552T-125 502H-127Q-133 502 -184 553Q-236 602 -236 608Q-236 612 -224 625T-206 638L-202 637L-196 632Q-190 628 -179 620T-158 603L-116 570Q-109 572 -52 604T11 637",989:"477 261Q477 257 473 256T455 253T417 251T348 250H235L155 -77L146 -82Q137 -85 109 -85Q55 -85 55 -77L139 261Q224 596 226 598Q229 603 239 603Q240 603 254 603T290 603T341 604T405 605T477 605Q656 603 687 602T719 596Q719 589 692 588T513 585H319L282 427L242 272Q242 270 351 270Q388 270 410 270T444 269T460 267T469 265T477 261",8211:"98 248Q91 252 91 259Q91 279 100 284Q102 285 324 285H442H500Q536 285 545 283T554 274Q554 260 548 254Q546 250 538 249Q520 248 319 248H98",8212:"124 248Q117 252 117 259Q117 279 126 284Q128 285 579 285T1033 284Q1037 280 1037 278Q1038 276 1038 274Q1038 253 1029 250Q1026 248 575 248H124",8213:"124 248Q117 252 117 259Q117 279 126 284Q128 285 579 285T1033 284Q1037 280 1037 278Q1038 276 1038 274Q1038 253 1029 250Q1026 248 575 248H124",8215:"98 -62Q91 -58 91 -51Q91 -31 100 -26Q102 -25 324 -25H442H500Q536 -25 545 -27T554 -36Q554 -50 548 -56Q546 -60 538 -61Q520 -62 319 -62H98",8216:"249 379Q228 379 213 396T197 448Q197 533 271 627L278 635Q286 643 295 652T314 671T332 687T344 694Q349 694 355 685T362 671Q362 668 345 654T301 608T256 537Q238 493 240 491Q241 491 245 493T258 498T275 500Q296 500 311 488T326 454Q326 426 304 403T249 379",8217:"250 620Q250 647 272 670T325 694Q348 694 362 677T377 633V624Q377 566 343 506T275 412T231 379Q226 379 220 388T213 401T232 421T279 472T323 547Q335 573 335 582L331 580Q327 578 318 576T300 573Q277 573 264 585T250 620",8220:"295 379Q274 379 259 396T243 448Q243 533 317 627Q326 638 354 666T391 694Q395 694 402 686T409 673Q409 668 392 654T348 608T302 537Q284 493 286 491Q287 491 291 493T304 498T321 500Q342 500 357 488T372 454Q372 426 350 403T295 379ZM492 379Q471 379 456 396T440 448Q440 533 514 627Q523 638 551 666T588 694Q592 694 599 685T606 672T589 654T544 608T499 537Q481 493 483 491Q484 491 488 493T501 498T518 500Q539 500 554 488T569 454Q569 426 547 403T492 379",8221:"214 620Q214 647 236 670T289 694Q312 694 326 677T341 633V624Q341 588 327 550T294 482T253 428T216 392T196 379Q191 379 184 388T176 401Q176 404 195 421T243 472T287 547Q299 576 299 582L295 580Q291 578 282 576T264 573Q241 573 228 585T214 620ZM411 620Q411 647 433 670T486 694Q509 694 523 677T538 633V624Q538 588 524 550T491 482T450 428T413 392T393 379Q388 379 381 388T373 401Q373 404 392 421T440 472T484 547Q496 576 496 582L492 580Q488 578 479 576T461 573Q438 573 425 585T411 620",8260:"166 -215T159 -215T147 -212T141 -204T139 -197Q139 -190 144 -183Q157 -157 378 274T602 707Q605 716 618 716Q625 716 630 712T636 703T638 696Q638 691 406 241T170 -212Q166 -215 159 -215",8463:"150 475Q147 475 118 466T82 457Q73 457 64 467T54 487Q54 490 55 492Q63 506 64 506Q67 512 118 526Q162 541 169 546Q173 559 175 575Q181 596 181 604Q181 613 166 617Q164 617 153 618T135 619Q119 619 114 621T109 630Q109 636 114 656T122 681Q125 685 202 688Q272 695 286 695Q304 695 304 684Q304 682 291 628L278 577L386 612Q466 635 476 635T492 627T499 607Q499 593 489 586Q485 583 373 546L262 512Q262 511 248 455T233 397T236 397T244 404Q295 441 357 441Q405 441 445 417T485 333Q485 284 449 178T412 58T426 44Q447 44 466 68Q485 87 500 130L509 152H531H543Q562 152 562 144Q562 128 546 93T494 23T415 -13Q385 -13 359 3T322 44Q318 52 318 77Q318 99 352 196T386 337Q386 386 346 386Q318 386 286 370Q267 361 245 338T211 292Q207 287 193 235T162 113T138 21Q128 7 122 4Q105 -12 83 -12Q66 -12 54 -2T42 26Q42 45 98 257L151 475H150",8710:"574 715L582 716Q589 716 595 716Q612 716 616 714Q621 712 621 709Q622 707 705 359T788 8Q786 5 785 3L781 0H416Q52 0 50 2T48 6Q48 9 305 358T567 711Q572 712 574 715ZM599 346L538 602L442 474Q347 345 252 217T157 87T409 86T661 88L654 120Q646 151 629 220T599 346",10744:"166 -215T159 -215T147 -212T141 -204T139 -197Q139 -190 144 -183Q157 -157 378 274T602 707Q605 716 618 716Q625 716 630 712T636 703T638 696Q638 691 406 241T170 -212Q166 -215 159 -215"},{})},6560:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.largeop=void 0;var H=L(9403),V=L(2827);T.largeop=(0,H.AddPaths)(V.largeop,{40:"180 96T180 250T205 541T266 770T353 944T444 1069T527 1150H555Q561 1144 561 1141Q561 1137 545 1120T504 1072T447 995T386 878T330 721T288 513T272 251Q272 133 280 56Q293 -87 326 -209T399 -405T475 -531T536 -609T561 -640Q561 -643 555 -649H527Q483 -612 443 -568T353 -443T266 -270T205 -41",41:"35 1138Q35 1150 51 1150H56H69Q113 1113 153 1069T243 944T330 771T391 541T416 250T391 -40T330 -270T243 -443T152 -568T69 -649H56Q43 -649 39 -647T35 -637Q65 -607 110 -548Q283 -316 316 56Q324 133 324 251Q324 368 316 445Q278 877 48 1123Q36 1137 35 1138",47:"78 -649Q56 -646 56 -625Q56 -614 382 261T712 1140Q716 1150 732 1150Q754 1147 754 1126Q754 1116 428 240T98 -639Q94 -649 78 -649",91:"224 -649V1150H455V1099H275V-598H455V-649H224",92:"754 -625Q754 -649 731 -649Q715 -649 712 -639Q709 -635 383 242T55 1124Q54 1135 61 1142T80 1150Q92 1150 98 1140Q101 1137 427 262T754 -625",93:"16 1099V1150H247V-649H16V-598H196V1099H16",123:"547 -643L541 -649H528Q515 -649 503 -645Q324 -582 293 -466Q289 -449 289 -428T287 -200L286 42L284 53Q274 98 248 135T196 190T146 222L121 235Q119 239 119 250Q119 262 121 266T133 273Q262 336 284 449L286 460L287 701Q287 737 287 794Q288 949 292 963Q293 966 293 967Q325 1080 508 1148Q516 1150 527 1150H541L547 1144V1130Q547 1117 546 1115T536 1109Q480 1086 437 1046T381 950L379 940L378 699Q378 657 378 594Q377 452 374 438Q373 437 373 436Q350 348 243 282Q192 257 186 254L176 251L188 245Q211 236 234 223T287 189T340 135T373 65Q373 64 374 63Q377 49 378 -93Q378 -156 378 -198L379 -438L381 -449Q393 -504 436 -544T536 -608Q544 -611 545 -613T547 -629V-643",125:"119 1130Q119 1144 121 1147T135 1150H139Q151 1150 182 1138T252 1105T326 1046T373 964Q378 942 378 702Q378 469 379 462Q386 394 439 339Q482 296 535 272Q544 268 545 266T547 251Q547 241 547 238T542 231T531 227T510 217T477 194Q390 129 379 39Q378 32 378 -201Q378 -441 373 -463Q342 -580 165 -644Q152 -649 139 -649Q125 -649 122 -646T119 -629Q119 -622 119 -619T121 -614T124 -610T132 -607T143 -602Q195 -579 235 -539T285 -447Q286 -435 287 -199T289 51Q294 74 300 91T329 138T390 197Q412 213 436 226T475 244L489 250L472 258Q455 265 430 279T377 313T327 366T293 434Q289 451 289 472T287 699Q286 941 285 948Q279 978 262 1005T227 1048T184 1080T151 1100T129 1109L127 1110Q119 1113 119 1130",710:"1004 603Q1004 600 999 583T991 565L960 574Q929 582 866 599T745 631L500 698Q497 698 254 631Q197 616 134 599T39 574L8 565Q5 565 0 582T-5 603L26 614Q58 624 124 646T248 687L499 772Q999 604 1004 603",732:"296 691Q258 691 216 683T140 663T79 639T34 619T16 611Q13 619 8 628L0 644L36 662Q206 749 321 749Q410 749 517 710T703 670Q741 670 783 678T859 698T920 722T965 742T983 750Q986 742 991 733L999 717L963 699Q787 611 664 611Q594 611 484 651T296 691",770:"4 603Q4 600 -1 583T-9 565L-40 574Q-71 582 -134 599T-255 631L-500 698Q-503 698 -746 631Q-803 616 -866 599T-961 574L-992 565Q-995 565 -1000 582T-1005 603L-974 614Q-942 624 -876 646T-752 687L-501 772Q-1 604 4 603",771:"-704 691Q-742 691 -784 683T-860 663T-921 639T-966 619T-984 611Q-987 619 -992 628L-1000 644L-964 662Q-794 749 -679 749Q-590 749 -483 710T-297 670Q-259 670 -217 678T-141 698T-80 722T-35 742T-17 750Q-14 742 -9 733L-1 717L-37 699Q-213 611 -336 611Q-405 611 -515 651T-704 691",8214:"257 0V602H300V0H257ZM478 0V602H521V0H478",8260:"78 -649Q56 -646 56 -625Q56 -614 382 261T712 1140Q716 1150 732 1150Q754 1147 754 1126Q754 1116 428 240T98 -639Q94 -649 78 -649",8593:"112 421L120 424Q127 427 136 430T161 441T191 458T224 481T260 510T295 546T328 591L333 600L340 589Q380 527 431 489T555 421V377L543 381Q445 418 368 492L355 504V0H312V504L299 492Q222 418 124 381L112 377V421",8595:"312 96V600H355V96L368 108Q445 182 543 219L555 223V179L546 176Q538 173 529 169T505 158T475 141T442 119T407 90T372 53T339 9L334 0L327 11Q287 73 236 111T112 179V223L124 219Q222 182 299 108L312 96",8657:"142 329Q300 419 389 599Q389 598 399 579T420 541T452 494T497 438T558 383T636 329T708 294L721 289V246Q718 246 694 256T623 293T532 356L522 364L521 182V0H478V405L466 417Q436 450 389 516Q388 515 378 500T352 463T312 417L300 405V0H257V364L247 356Q202 320 155 293T82 256L57 246V289L70 294Q101 305 142 329",8659:"257 236V600H300V195L312 183Q342 150 389 84Q390 85 400 100T426 137T466 183L478 195V600H521V418L522 236L532 244Q576 280 623 307T696 344L721 354V311L708 306Q677 295 636 271Q478 181 389 1Q389 2 379 21T358 59T326 106T281 162T220 217T142 271T70 306L57 311V354Q60 354 83 345T154 308T247 244L257 236",8719:"220 812Q220 813 218 819T214 829T208 840T199 853T185 866T166 878T140 887T107 893T66 896H56V950H1221V896H1211Q1080 896 1058 812V-311Q1076 -396 1211 -396H1221V-450H725V-396H735Q864 -396 888 -314Q889 -312 889 -311V896H388V292L389 -311Q405 -396 542 -396H552V-450H56V-396H66Q195 -396 219 -314Q220 -312 220 -311V812",8720:"220 812Q220 813 218 819T214 829T208 840T199 853T185 866T166 878T140 887T107 893T66 896H56V950H552V896H542Q411 896 389 812L388 208V-396H889V812Q889 813 887 819T883 829T877 840T868 853T854 866T835 878T809 887T776 893T735 896H725V950H1221V896H1211Q1080 896 1058 812V-311Q1076 -396 1211 -396H1221V-450H56V-396H66Q195 -396 219 -314Q220 -312 220 -311V812",8721:"60 948Q63 950 665 950H1267L1325 815Q1384 677 1388 669H1348L1341 683Q1320 724 1285 761Q1235 809 1174 838T1033 881T882 898T699 902H574H543H251L259 891Q722 258 724 252Q725 250 724 246Q721 243 460 -56L196 -356Q196 -357 407 -357Q459 -357 548 -357T676 -358Q812 -358 896 -353T1063 -332T1204 -283T1307 -196Q1328 -170 1348 -124H1388Q1388 -125 1381 -145T1356 -210T1325 -294L1267 -449L666 -450Q64 -450 61 -448Q55 -446 55 -439Q55 -437 57 -433L590 177Q590 178 557 222T452 366T322 544L56 909L55 924Q55 945 60 948",8730:"1001 1150Q1017 1150 1020 1132Q1020 1127 741 244L460 -643Q453 -650 436 -650H424Q423 -647 423 -645T421 -640T419 -631T415 -617T408 -594T399 -560T385 -512T367 -448T343 -364T312 -259L203 119L138 41L111 67L212 188L264 248L472 -474L983 1140Q988 1150 1001 1150",8739:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612",8741:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612ZM368 612Q373 627 388 627Q404 627 409 612Q410 610 410 306T409 0Q406 -15 389 -15Q371 -15 368 0V10Q368 19 368 35T368 73T368 122T367 179T367 241T367 306T367 370T367 433T367 489T368 538T368 576T368 602V612",8747:"114 -798Q132 -824 165 -824H167Q195 -824 223 -764T275 -600T320 -391T362 -164Q365 -143 367 -133Q439 292 523 655T645 1127Q651 1145 655 1157T672 1201T699 1257T733 1306T777 1346T828 1360Q884 1360 912 1325T944 1245Q944 1220 932 1205T909 1186T887 1183Q866 1183 849 1198T832 1239Q832 1287 885 1296L882 1300Q879 1303 874 1307T866 1313Q851 1323 833 1323Q819 1323 807 1311T775 1255T736 1139T689 936T633 628Q574 293 510 -5T410 -437T355 -629Q278 -862 165 -862Q125 -862 92 -831T55 -746Q55 -711 74 -698T112 -685Q133 -685 150 -700T167 -741Q167 -789 114 -798",8748:"114 -798Q132 -824 165 -824H167Q195 -824 223 -764T275 -600T320 -391T362 -164Q365 -143 367 -133Q439 292 523 655T645 1127Q651 1145 655 1157T672 1201T699 1257T733 1306T777 1346T828 1360Q884 1360 912 1325T944 1245Q944 1220 932 1205T909 1186T887 1183Q866 1183 849 1198T832 1239Q832 1287 885 1296L882 1300Q879 1303 874 1307T866 1313Q851 1323 833 1323Q819 1323 807 1311T775 1255T736 1139T689 936T633 628Q574 293 510 -5T410 -437T355 -629Q278 -862 165 -862Q125 -862 92 -831T55 -746Q55 -711 74 -698T112 -685Q133 -685 150 -700T167 -741Q167 -789 114 -798ZM642 -798Q660 -824 693 -824H695Q723 -824 751 -764T803 -600T848 -391T890 -164Q893 -143 895 -133Q967 292 1051 655T1173 1127Q1179 1145 1183 1157T1200 1201T1227 1257T1261 1306T1305 1346T1356 1360Q1412 1360 1440 1325T1472 1245Q1472 1220 1460 1205T1437 1186T1415 1183Q1394 1183 1377 1198T1360 1239Q1360 1287 1413 1296L1410 1300Q1407 1303 1402 1307T1394 1313Q1379 1323 1361 1323Q1347 1323 1335 1311T1303 1255T1264 1139T1217 936T1161 628Q1102 293 1038 -5T938 -437T883 -629Q806 -862 693 -862Q653 -862 620 -831T583 -746Q583 -711 602 -698T640 -685Q661 -685 678 -700T695 -741Q695 -789 642 -798",8749:"114 -798Q132 -824 165 -824H167Q195 -824 223 -764T275 -600T320 -391T362 -164Q365 -143 367 -133Q439 292 523 655T645 1127Q651 1145 655 1157T672 1201T699 1257T733 1306T777 1346T828 1360Q884 1360 912 1325T944 1245Q944 1220 932 1205T909 1186T887 1183Q866 1183 849 1198T832 1239Q832 1287 885 1296L882 1300Q879 1303 874 1307T866 1313Q851 1323 833 1323Q819 1323 807 1311T775 1255T736 1139T689 936T633 628Q574 293 510 -5T410 -437T355 -629Q278 -862 165 -862Q125 -862 92 -831T55 -746Q55 -711 74 -698T112 -685Q133 -685 150 -700T167 -741Q167 -789 114 -798ZM642 -798Q660 -824 693 -824H695Q723 -824 751 -764T803 -600T848 -391T890 -164Q893 -143 895 -133Q967 292 1051 655T1173 1127Q1179 1145 1183 1157T1200 1201T1227 1257T1261 1306T1305 1346T1356 1360Q1412 1360 1440 1325T1472 1245Q1472 1220 1460 1205T1437 1186T1415 1183Q1394 1183 1377 1198T1360 1239Q1360 1287 1413 1296L1410 1300Q1407 1303 1402 1307T1394 1313Q1379 1323 1361 1323Q1347 1323 1335 1311T1303 1255T1264 1139T1217 936T1161 628Q1102 293 1038 -5T938 -437T883 -629Q806 -862 693 -862Q653 -862 620 -831T583 -746Q583 -711 602 -698T640 -685Q661 -685 678 -700T695 -741Q695 -789 642 -798ZM1150 -798Q1168 -824 1201 -824H1203Q1231 -824 1259 -764T1311 -600T1356 -391T1398 -164Q1401 -143 1403 -133Q1475 292 1559 655T1681 1127Q1687 1145 1691 1157T1708 1201T1735 1257T1769 1306T1813 1346T1864 1360Q1920 1360 1948 1325T1980 1245Q1980 1220 1968 1205T1945 1186T1923 1183Q1902 1183 1885 1198T1868 1239Q1868 1287 1921 1296L1918 1300Q1915 1303 1910 1307T1902 1313Q1887 1323 1869 1323Q1855 1323 1843 1311T1811 1255T1772 1139T1725 936T1669 628Q1610 293 1546 -5T1446 -437T1391 -629Q1314 -862 1201 -862Q1161 -862 1128 -831T1091 -746Q1091 -711 1110 -698T1148 -685Q1169 -685 1186 -700T1203 -741Q1203 -789 1150 -798",8750:"114 -798Q132 -824 165 -824H167Q195 -824 223 -764T275 -600T320 -391T362 -164Q365 -143 367 -133Q382 -52 390 2Q314 40 276 99Q230 167 230 249Q230 363 305 436T484 519H494L503 563Q587 939 632 1087T727 1298Q774 1360 828 1360Q884 1360 912 1325T944 1245Q944 1220 932 1205T909 1186T887 1183Q866 1183 849 1198T832 1239Q832 1287 885 1296L882 1300Q879 1303 874 1307T866 1313Q851 1323 833 1323Q766 1323 688 929Q662 811 610 496Q770 416 770 249Q770 147 701 68T516 -21H506L497 -65Q407 -464 357 -623T237 -837Q203 -862 165 -862Q125 -862 92 -831T55 -746Q55 -711 74 -698T112 -685Q133 -685 150 -700T167 -741Q167 -789 114 -798ZM480 478Q460 478 435 470T380 444T327 401T287 335T271 249Q271 124 375 56L397 43L431 223L485 478H480ZM519 20Q545 20 578 33T647 72T706 144T730 249Q730 383 603 455Q603 454 597 421T582 343T569 276Q516 22 515 20H519",8896:"1055 -401Q1055 -419 1042 -434T1007 -450Q977 -450 963 -423Q959 -417 757 167L555 750L353 167Q151 -417 147 -423Q134 -450 104 -450Q84 -450 70 -436T55 -401Q55 -394 56 -390Q59 -381 284 270T512 925Q525 950 555 950Q583 950 597 926Q599 923 825 270T1054 -391Q1055 -394 1055 -401",8897:"55 900Q55 919 69 934T103 950Q134 950 147 924Q152 913 353 333L555 -250L757 333Q958 913 963 924Q978 950 1007 950Q1028 950 1041 935T1055 901Q1055 894 1054 891Q1052 884 826 231T597 -426Q583 -450 556 -450Q527 -450 512 -424Q510 -421 285 229T56 890Q55 893 55 900",8898:"57 516Q68 602 104 675T190 797T301 882T423 933T542 949Q594 949 606 948Q780 928 901 815T1048 545Q1053 516 1053 475T1055 49Q1055 -406 1054 -410Q1051 -427 1037 -438T1006 -450T976 -439T958 -411Q957 -407 957 37Q957 484 956 494Q945 643 831 747T554 852Q481 852 411 826Q301 786 232 696T154 494Q153 484 153 37Q153 -407 152 -411Q148 -428 135 -439T104 -450T73 -439T56 -410Q55 -406 55 49Q56 505 57 516",8899:"56 911Q58 926 71 938T103 950Q120 950 134 939T152 911Q153 907 153 463Q153 16 154 6Q165 -143 279 -247T556 -352Q716 -352 830 -248T956 6Q957 16 957 463Q957 907 958 911Q962 928 975 939T1006 950T1037 939T1054 911Q1055 906 1055 451Q1054 -5 1053 -16Q1029 -207 889 -328T555 -449Q363 -449 226 -331T62 -45Q57 -16 57 25T55 451Q55 906 56 911",8968:"224 -649V1150H511V1099H275V-649H224",8969:"16 1099V1150H303V-649H252V1099H16",8970:"224 -649V1150H275V-598H511V-649H224",8971:"252 -598V1150H303V-649H16V-598H252",9001:"112 244V258L473 1130Q482 1150 498 1150Q511 1150 517 1142T523 1125V1118L344 685Q304 587 257 473T187 305L165 251L344 -184L523 -616V-623Q524 -634 517 -641T499 -649Q484 -649 473 -629L112 244",9002:"112 -649Q103 -649 95 -642T87 -623V-616L266 -184L445 251Q445 252 356 466T178 898T86 1123Q85 1134 93 1142T110 1150Q126 1150 133 1137Q134 1136 317 695L498 258V244L317 -194Q134 -635 133 -636Q126 -649 112 -649",9168:"312 0V602H355V0H312",10072:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612",10216:"112 244V258L473 1130Q482 1150 498 1150Q511 1150 517 1142T523 1125V1118L344 685Q304 587 257 473T187 305L165 251L344 -184L523 -616V-623Q524 -634 517 -641T499 -649Q484 -649 473 -629L112 244",10217:"112 -649Q103 -649 95 -642T87 -623V-616L266 -184L445 251Q445 252 356 466T178 898T86 1123Q85 1134 93 1142T110 1150Q126 1150 133 1137Q134 1136 317 695L498 258V244L317 -194Q134 -635 133 -636Q126 -649 112 -649",10752:"668 944Q697 949 744 949Q803 949 814 948Q916 937 1006 902T1154 826T1262 730T1336 638T1380 563Q1454 415 1454 250Q1454 113 1402 -14T1258 -238T1036 -391T755 -449Q608 -449 477 -392T255 -240T110 -16T56 250Q56 387 105 510T239 723T434 871T668 944ZM755 -352Q922 -352 1061 -269T1278 -48T1356 250Q1356 479 1202 652T809 850Q798 851 747 851Q634 851 527 806T337 682T204 491T154 251Q154 128 201 17T329 -176T521 -304T755 -352ZM665 250Q665 290 692 315T758 341Q792 339 818 315T845 250Q845 211 819 186T755 160Q716 160 691 186T665 250",10753:"668 944Q697 949 744 949Q803 949 814 948Q916 937 1006 902T1154 826T1262 730T1336 638T1380 563Q1454 415 1454 250Q1454 113 1402 -14T1258 -238T1036 -391T755 -449Q608 -449 477 -392T255 -240T110 -16T56 250Q56 387 105 510T239 723T434 871T668 944ZM706 299V850H704Q519 832 386 725T198 476Q181 433 169 379T156 300Q156 299 431 299H706ZM1116 732Q1054 778 982 807T871 842T810 849L804 850V299H1079Q1354 299 1354 300Q1354 311 1352 329T1336 402T1299 506T1228 620T1116 732ZM706 -350V201H431Q156 201 156 200Q156 189 158 171T174 98T211 -6T282 -120T395 -232Q428 -257 464 -277T527 -308T587 -328T636 -339T678 -346T706 -350ZM1354 200Q1354 201 1079 201H804V-350Q808 -349 838 -345T887 -338T940 -323T1010 -295Q1038 -282 1067 -265T1144 -208T1229 -121T1301 0T1349 158Q1354 188 1354 200",10754:"668 944Q697 949 744 949Q803 949 814 948Q916 937 1006 902T1154 826T1262 730T1336 638T1380 563Q1454 415 1454 250Q1454 113 1402 -14T1258 -238T1036 -391T755 -449Q608 -449 477 -392T255 -240T110 -16T56 250Q56 387 105 510T239 723T434 871T668 944ZM1143 709Q1138 714 1129 722T1086 752T1017 791T925 826T809 850Q798 851 747 851H728Q659 851 571 823T408 741Q367 713 367 709L755 320L1143 709ZM297 639Q296 639 282 622T247 570T205 491T169 382T154 250T168 118T204 9T247 -70T282 -122L297 -139L685 250L297 639ZM1213 -139Q1214 -139 1228 -122T1263 -70T1305 9T1341 118T1356 250T1342 382T1306 491T1263 570T1228 622L1213 639L825 250L1213 -139ZM367 -209Q373 -215 384 -224T434 -258T514 -302T622 -336T755 -352T887 -338T996 -302T1075 -259T1126 -224L1143 -209L755 180Q754 180 561 -14T367 -209",10756:"56 911Q58 926 71 938T103 950Q120 950 134 939T152 911Q153 907 153 463Q153 16 154 6Q165 -143 279 -247T556 -352Q716 -352 830 -248T956 6Q957 16 957 463Q957 907 958 911Q962 928 975 939T1006 950T1037 939T1054 911Q1055 906 1055 451Q1054 -5 1053 -16Q1029 -207 889 -328T555 -449Q363 -449 226 -331T62 -45Q57 -16 57 25T55 451Q55 906 56 911ZM507 554Q511 570 523 581T554 593Q571 593 585 582T603 554Q604 551 604 443V338H709Q817 338 820 337Q835 334 847 321T859 290Q859 254 819 241Q816 240 709 240H604V134Q604 48 604 34T598 11Q583 -15 555 -15Q526 -15 512 11Q507 20 507 34T506 134V240H401H344Q292 240 278 246Q251 259 251 290Q251 309 264 321T290 337Q293 338 401 338H506V443Q506 551 507 554",10758:"56 911Q60 927 72 938T103 950Q120 950 134 939T152 911Q153 907 153 277V-352H957V277Q957 907 958 911Q962 928 975 939T1006 950T1036 939T1054 911V891Q1054 871 1054 836T1054 754T1054 647T1055 525T1055 390T1055 250T1055 111T1055 -24T1055 -147T1054 -253T1054 -335T1054 -391V-411Q1047 -442 1016 -449Q1011 -450 552 -450L94 -449Q63 -439 56 -411V-391Q56 -371 56 -336T56 -254T56 -147T55 -25T55 110T55 250T55 389T55 524T55 647T56 753T56 835T56 891V911",12296:"112 244V258L473 1130Q482 1150 498 1150Q511 1150 517 1142T523 1125V1118L344 685Q304 587 257 473T187 305L165 251L344 -184L523 -616V-623Q524 -634 517 -641T499 -649Q484 -649 473 -629L112 244",12297:"112 -649Q103 -649 95 -642T87 -623V-616L266 -184L445 251Q445 252 356 466T178 898T86 1123Q85 1134 93 1142T110 1150Q126 1150 133 1137Q134 1136 317 695L498 258V244L317 -194Q134 -635 133 -636Q126 -649 112 -649"},{10764:"\u222c\u222c"})},1500:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.monospace=void 0;var H=L(9403),V=L(2970);T.monospace=(0,H.AddPaths)(V.monospace,{32:"",33:"206 565Q206 590 222 606T265 622Q287 621 303 606T319 565T314 392L308 216Q299 194 273 194H262Q247 194 241 195T228 200T217 216L211 392Q206 539 206 565ZM206 56Q206 83 223 99T265 115Q288 113 304 99T320 58Q320 33 303 17T262 0Q237 0 222 17T206 56",34:"122 575Q122 593 137 608T173 623Q196 623 210 608T225 575Q225 562 218 464Q212 373 211 361T201 341Q193 333 173 333Q154 333 146 341Q138 348 137 360T129 464Q122 561 122 575ZM299 575Q299 593 314 608T350 623Q373 623 387 608T402 575Q402 562 395 464Q389 373 388 361T378 341Q370 333 350 333Q331 333 323 341Q315 348 314 360T306 464Q299 561 299 575",35:"93 163Q74 163 65 164T46 173T36 198Q36 210 40 215T61 233H131V236Q132 239 140 307T149 377Q149 379 105 379L61 380Q36 392 36 414Q36 450 86 450Q91 450 99 450T112 449H159Q163 480 167 517Q168 524 170 545T174 573T180 591T191 607T210 611Q223 611 232 604T243 588L245 580Q245 565 238 511T230 451Q230 449 282 449H333Q337 480 341 517Q342 524 343 537T345 556T348 573T352 589T359 600T370 608T384 611Q395 611 406 602T419 580Q419 565 412 511T404 451Q404 449 431 449H442Q477 449 485 429Q489 421 489 414Q489 392 463 380L428 379H394V376Q393 373 385 305T376 235Q376 233 419 233H463L468 230Q472 227 473 227T477 223T482 218T486 213T488 206T489 198Q489 162 436 162Q430 162 422 162T412 163H366V161Q364 159 357 92Q356 85 355 73T353 54T350 37T346 22T339 11T328 3T314 0Q303 0 292 9T279 31Q279 37 287 96T295 162Q295 163 244 163H192V161Q190 159 183 92Q182 85 181 73T179 54T176 37T172 22T165 11T154 3T140 0Q129 0 118 9T105 31Q105 37 113 96T121 162Q121 163 93 163ZM323 377Q323 379 272 379H220V376Q219 373 211 305T202 235Q202 233 253 233H305V236Q306 239 314 307T323 377",36:"415 397Q392 397 377 411T362 448Q362 464 376 485Q369 498 362 506T346 520T332 528T315 533T300 538V445L301 353L311 350Q382 334 424 284T466 174Q466 115 425 65T303 -2L300 -3V-30Q300 -64 291 -74Q283 -82 262 -82H255Q234 -82 225 -60L224 -32V-4L213 -2Q152 6 106 51T59 170V180Q59 197 74 213Q89 227 110 227T146 213T162 174Q162 156 147 137Q153 123 161 112T176 95T191 85T205 79T216 76T224 74V283L213 285Q147 298 103 343T58 449Q58 516 108 560T224 614V643V654Q224 666 226 673T237 687T264 694Q289 693 294 683T300 642V615H303Q355 607 390 587T440 540T460 493T466 453Q466 425 451 411T415 397ZM137 452Q137 425 158 404T198 376T223 369Q224 369 224 453T223 537Q198 532 168 509T137 452ZM301 75Q307 75 325 83T365 116T387 171Q387 238 300 267V171Q300 75 301 75",37:"35 560Q35 607 54 645T110 693Q111 693 116 693T125 694Q165 692 187 651T210 560Q210 506 186 467T123 428Q84 428 60 466T35 560ZM139 560Q139 574 136 587T130 608T124 615Q122 617 120 614Q106 595 106 561Q106 516 121 506Q123 504 125 507Q139 526 139 560ZM123 -83Q107 -83 98 -73T88 -48Q88 -43 89 -41Q90 -37 229 316T370 675Q381 694 400 694Q416 694 426 684T436 659Q436 654 435 652Q434 647 295 294T153 -65Q144 -83 123 -83ZM314 50Q314 104 338 143T400 183Q439 183 464 144T489 50T465 -43T402 -82Q358 -82 336 -41T314 50ZM417 50Q417 71 413 85T405 102L401 106Q386 95 386 50Q386 29 390 15T398 -2L402 -6Q417 5 417 50",38:"96 462Q96 546 132 584T211 622Q255 622 284 583T314 474Q314 395 224 305L208 288Q213 275 226 251L265 185L269 179Q273 184 299 246L332 333L342 363Q342 364 341 365Q334 365 334 393Q334 406 334 410T340 420T356 431H412H440Q467 431 478 424T490 393Q490 376 484 367T470 357T448 355H441H415L399 312Q349 176 322 127L315 115L323 106Q360 65 393 65Q405 65 410 80T416 109Q416 140 452 140Q487 140 487 105Q487 56 460 23T391 -11L286 41L273 53L262 42Q212 -11 151 -11Q97 -11 63 33T28 143Q28 161 30 176T38 205T47 227T60 247T72 261T84 274T94 283L122 311L119 323Q96 392 96 462ZM243 474Q243 533 218 545L215 546Q212 546 210 546Q182 546 169 501Q167 492 167 466Q167 419 179 368L188 377Q234 425 242 461Q243 465 243 474ZM217 129Q185 174 154 235Q121 214 115 176Q113 168 113 143Q113 83 139 67Q141 66 152 66Q191 66 228 112L217 129",39:"205 554Q205 577 221 594T263 611Q302 611 325 577T349 490Q349 409 298 347Q285 330 258 309T214 287Q203 289 189 302T175 327Q175 341 185 349T213 369T245 402Q269 437 273 483V497Q264 496 263 496Q240 496 223 513T205 554",40:"437 -53Q437 -82 399 -82H394Q377 -82 342 -55Q259 7 213 102T166 306Q166 412 211 507T342 667Q377 694 393 694H399Q437 694 437 665Q437 654 426 643T397 620T356 584T311 525Q301 511 290 488T264 412T250 306Q250 191 300 105T422 -27Q437 -37 437 -53",41:"87 664Q87 694 126 694Q138 694 147 690T183 667Q266 605 312 510T358 306Q358 193 307 93T161 -70Q142 -82 126 -82Q105 -82 96 -73T87 -53Q87 -47 88 -44Q92 -36 116 -19T173 34T230 119Q273 206 273 306Q273 408 231 494T109 635Q87 649 87 664",42:"222 487Q224 501 235 510T262 520Q279 520 289 510T302 487Q302 458 301 429Q301 421 301 413T301 398T300 386T300 377V374Q300 373 301 373Q304 373 353 403T416 434Q432 434 444 423T456 393Q456 389 456 386T454 379T451 373T448 368T442 363T436 358T427 353T417 348T405 342T391 334Q345 309 339 305L388 279Q400 273 412 266T432 255T441 250Q456 238 456 218Q456 200 445 189T417 177Q403 177 354 207T301 238Q300 238 300 237V234Q300 231 300 226T300 214T301 199T301 182Q302 153 302 124Q300 109 289 100T262 90T235 100T222 124Q222 153 223 182Q223 190 223 198T223 213T224 225T224 234V237Q224 238 223 238Q220 238 171 208T108 177Q92 177 80 188T68 218Q68 237 79 246T134 277Q180 303 185 306L136 332Q124 338 112 345T92 356T83 361Q68 373 68 393Q68 411 79 422T107 434Q121 434 170 404T223 373Q224 373 224 374V377Q224 380 224 385T224 397T223 412T223 429Q222 458 222 487",43:"147 271Q138 271 122 271T98 270Q68 270 53 277T38 306T53 335T98 342Q105 342 121 342T147 341H227V423L228 505Q241 531 262 531Q268 531 273 530T282 525T287 519T293 511L297 505V341H377H430Q457 341 467 338T483 321Q487 313 487 306Q487 295 480 286T463 273Q457 271 377 271H297V107Q281 81 262 81Q250 81 242 87T230 100L228 107L227 189V271H147",44:"193 37T193 70T213 121T260 140Q302 140 327 108T353 36Q353 -7 336 -43T294 -98T249 -128T215 -139Q204 -139 189 -125Q177 -111 174 -101Q172 -84 183 -77T217 -61T253 -33Q261 -24 272 1L265 0Q234 0 214 18",45:"57 306Q57 333 86 341H438Q468 332 468 306T438 271H86Q57 280 57 306",46:"193 70Q193 105 214 122T258 140Q291 140 311 120T332 70Q332 44 314 23T262 1Q234 1 214 18T193 70",47:"94 -83Q78 -83 68 -73T58 -48Q58 -44 60 -36Q62 -31 227 314T399 673Q410 694 431 694Q445 694 455 684T466 659Q466 656 464 648Q463 643 298 298T125 -62Q114 -83 94 -83",58:"193 361Q193 396 214 413T258 431Q291 431 311 411T332 361Q332 335 314 314T262 292Q234 292 214 309T193 361ZM193 70Q193 105 214 122T258 140Q291 140 311 120T332 70Q332 44 314 23T262 1Q234 1 214 18T193 70",59:"193 361Q193 396 214 413T258 431Q291 431 311 411T332 361Q332 335 314 314T262 292Q234 292 214 309T193 361ZM193 70Q193 105 214 122T259 140Q301 140 319 108T337 33Q337 -38 291 -88T214 -139Q203 -139 189 -126T175 -97Q175 -85 182 -78T200 -66T225 -50T249 -17Q256 -3 256 0Q252 1 248 1Q242 2 235 5T218 15T200 36T193 70",60:"468 90Q468 76 458 66T433 55Q426 55 419 58Q413 61 243 168T68 280Q57 291 57 306T68 332Q72 335 241 442T416 553Q424 557 432 557Q447 557 457 547T468 522T456 496Q454 494 305 399L158 306L305 213Q341 190 390 159Q443 125 452 119T464 106V105Q468 97 468 90",61:"38 382Q38 409 67 417H457Q487 408 487 382Q487 358 461 348H64Q51 352 45 360T38 376V382ZM67 195Q38 204 38 230Q38 255 62 264Q66 265 264 265H461L464 264Q467 262 469 261T475 256T481 249T485 240T487 230Q487 204 457 195H67",62:"57 522Q57 539 67 548T90 557Q98 557 105 554Q111 551 281 444T456 332Q468 320 468 306T456 280Q452 276 282 169T105 58Q98 55 91 55Q79 55 68 63T57 90Q57 105 68 116Q70 118 219 213L366 306L219 399Q75 491 71 494Q57 507 57 522",63:"62 493Q62 540 107 578T253 617Q366 617 414 578T462 490Q462 459 445 434T411 400L394 390Q315 347 296 287Q294 278 293 247V217Q285 201 278 198T246 194T216 197T201 215V245V253Q201 379 351 456Q366 464 375 477Q377 482 377 490Q377 517 339 528T251 540Q182 540 159 517Q166 503 166 490Q166 468 151 453T114 438Q96 438 79 451T62 493ZM190 58Q190 85 208 100T249 115Q272 113 288 99T304 58Q304 33 287 17T246 0T206 16T190 58",64:"44 306Q44 445 125 531T302 617Q332 617 358 607T411 574T456 502T479 387Q481 361 481 321Q481 203 421 143Q381 103 332 103Q266 103 225 165T183 307Q183 390 227 449T332 508Q358 508 378 498Q350 541 304 541Q229 541 172 473T115 305Q115 208 171 140T306 71H310Q358 71 397 105Q409 115 436 115Q458 115 462 113Q481 106 481 86Q481 73 468 61Q401 -6 305 -6Q262 -6 217 14T133 71T69 170T44 306ZM410 306Q410 361 386 396T333 431Q300 431 277 394T254 305Q254 256 276 218T332 180Q364 180 387 217T410 306",91:"237 -82Q221 -78 214 -58V305Q214 669 216 673Q220 687 231 690T278 694H350H461Q462 693 467 690T474 685T478 679T482 670T483 656Q483 632 471 625T428 617Q422 617 406 617T379 618H298V-7H379H420Q459 -7 471 -13T483 -45Q483 -55 483 -59T477 -70T461 -82H237",92:"58 659Q58 673 68 683T93 694Q114 694 125 673Q132 659 297 314T464 -36Q466 -44 466 -48Q466 -66 454 -74T431 -83Q410 -83 399 -62Q391 -47 226 298T60 648Q58 656 58 659",93:"41 656Q41 681 53 688T99 695Q107 695 133 695T177 694H288Q307 681 310 669V-58Q303 -76 288 -82H64Q41 -73 41 -45Q41 -21 53 -14T96 -6Q102 -6 118 -6T145 -7H226V618H145H100Q67 618 54 625T41 656",94:"138 460Q121 460 109 479T96 512Q96 527 106 534Q109 536 178 571T253 609Q256 611 264 611Q272 610 343 574Q357 567 369 561T389 550T402 543T411 538T416 535T420 532T422 529T425 525Q428 518 428 512Q428 498 416 479T386 460H384Q377 460 316 496L262 526L208 496Q147 460 138 460",95:"57 -60Q57 -33 86 -25H438Q468 -34 468 -60T438 -95H86Q57 -86 57 -60",96:"176 479Q176 563 227 622T310 681Q324 680 337 667T350 641Q350 627 340 619T312 599T280 566Q256 531 252 485V471Q261 472 262 472Q285 472 302 455T320 414Q320 389 303 373T261 357Q223 357 200 391T176 479",123:"430 -7H436Q449 -7 456 -8T469 -19T475 -45Q475 -69 466 -76T434 -83H419Q386 -82 363 -80T308 -69T253 -41T223 7L221 17L220 118V220L218 224Q215 229 214 230T210 235T204 241T195 246T184 252T170 257T151 262T127 265Q118 267 100 267T69 270T52 283Q50 288 50 306V314Q50 335 67 341Q68 342 102 343T172 355T217 386L220 392V493L221 595Q225 611 230 621T251 650T304 679T395 693L406 694Q418 694 426 694Q458 694 466 685Q475 676 475 656T466 627Q458 618 430 618Q319 618 305 587L304 486Q304 476 304 458T305 431Q305 385 295 358T251 311L243 306Q243 305 254 298T281 274T302 231Q304 223 304 125L305 25Q309 16 316 10T352 -1T430 -7",124:"228 668Q241 694 262 694Q268 694 273 693T282 688T287 682T293 674L297 668V-57Q282 -82 262 -82Q239 -82 228 -57V668",125:"49 655Q49 674 56 682T73 692T106 694Q141 693 167 690T224 677T275 647T303 595L305 392Q313 367 347 356T417 344T457 341Q475 335 475 306Q475 292 473 285T464 273T451 269T430 267Q352 262 327 246Q311 236 305 220L303 17L301 7Q294 -16 277 -33T242 -60T196 -74T150 -80T106 -83Q78 -83 72 -82T58 -74Q49 -65 49 -44Q49 -24 58 -16Q66 -7 94 -7Q143 -7 171 -1T207 10T220 25V125Q220 223 222 231Q228 257 243 274T270 299L281 306Q234 329 222 381Q220 387 220 486V587Q212 597 207 601T173 612T94 618Q66 618 58 627Q49 635 49 655",126:"125 467Q113 467 100 480T87 509Q88 520 111 543Q172 602 209 609Q219 611 224 611Q246 611 263 596T290 566T304 551Q319 551 367 594Q383 610 396 610H400Q411 610 424 597T437 568Q436 557 413 534Q348 469 305 466Q278 466 260 481T234 511T220 526Q205 526 157 483Q141 467 129 467H125",127:"104 565Q104 590 120 600T155 611Q175 611 180 610Q217 599 217 565Q217 545 202 532T166 519H159H155Q120 519 107 547Q104 553 104 565ZM307 565Q307 580 317 593T346 610Q348 610 350 610T354 611Q355 612 367 612Q395 611 408 597T421 565T409 534T365 519H358Q336 519 322 532T307 565",160:"",305:"411 76Q441 76 451 69T462 38Q462 29 462 26T460 18T453 9T440 1H94Q72 8 72 33V38Q72 46 72 49T74 58T81 68T94 76H233V355H167L102 356Q80 363 80 393Q80 418 91 425T138 432Q145 432 165 432T200 431H295Q297 429 303 425T310 420T314 415T317 404T317 389T318 363Q318 354 318 314T317 241V76H378H411",567:"75 -91T100 -91T138 -107T152 -144V-150L160 -151H193H203Q241 -151 267 -121Q284 -97 288 -73T292 23V151V355H218L145 356Q123 365 123 387V393Q123 422 145 430H148Q151 430 156 430T169 430T185 430T205 431T227 431T251 431H354Q356 430 360 427T365 424T369 420T372 416T373 410T375 402T376 391T377 376T377 356Q377 345 377 286T376 176Q376 -67 371 -88Q362 -123 342 -151T299 -194Q254 -228 180 -228Q84 -226 56 -177Q49 -162 48 -148Q48 -122 61 -107",697:"211 572Q211 593 226 608T262 623Q281 623 297 610T313 573Q313 561 307 465Q301 370 299 357T284 336Q279 334 262 334Q240 334 231 343Q226 350 225 362T217 465Q211 549 211 572",768:"-409 569Q-409 586 -399 596T-377 610Q-376 610 -372 610T-365 611Q-355 610 -284 588T-210 563Q-195 556 -195 537Q-195 533 -197 522T-208 498T-229 485Q-238 485 -312 508T-388 533Q-400 538 -405 552Q-409 559 -409 569",769:"-297 485Q-315 485 -323 505T-331 537Q-331 556 -316 563Q-307 569 -170 610Q-169 610 -165 610T-157 611Q-141 609 -131 600T-119 584T-117 569Q-117 555 -124 545T-138 533Q-140 531 -214 508T-297 485",770:"-387 460Q-404 460 -416 479T-429 512Q-429 527 -419 534Q-416 536 -347 571T-272 609Q-269 611 -261 611Q-254 610 -182 574Q-168 567 -156 561T-136 550T-123 543T-114 538T-109 535T-105 532T-103 529T-100 525Q-97 518 -97 512Q-97 498 -109 479T-139 460H-141Q-148 460 -209 496L-263 526L-317 496Q-378 460 -387 460",771:"-400 467Q-412 467 -425 480T-438 509Q-437 520 -414 543Q-353 602 -316 609Q-306 611 -301 611Q-279 611 -262 596T-235 566T-221 551Q-206 551 -158 594Q-142 610 -129 610H-125Q-114 610 -101 597T-88 568Q-89 557 -112 534Q-177 469 -220 466Q-247 466 -265 481T-291 511T-305 526Q-320 526 -368 483Q-384 467 -396 467H-400",772:"-429 500Q-440 504 -445 511T-450 522T-452 536Q-452 552 -451 556Q-445 571 -434 574T-379 578Q-369 578 -330 578T-261 577H-96Q-94 575 -90 573T-85 569T-81 564T-77 558T-75 550T-74 538Q-74 522 -78 515T-96 500H-429",774:"-446 579Q-446 611 -412 611H-407Q-383 609 -378 599T-358 587Q-340 583 -263 583H-235Q-159 583 -152 593Q-145 611 -120 611H-117H-115Q-79 611 -79 577Q-80 552 -95 536T-140 514T-191 506T-251 504H-263H-274Q-311 504 -334 505T-386 513T-431 536T-446 579",776:"-421 565Q-421 590 -405 600T-370 611Q-350 611 -345 610Q-308 599 -308 565Q-308 545 -323 532T-359 519H-366H-370Q-405 519 -418 547Q-421 553 -421 565ZM-218 565Q-218 580 -208 593T-179 610Q-177 610 -175 610T-171 611Q-170 612 -158 612Q-130 611 -117 597T-104 565T-116 534T-160 519H-167Q-189 519 -203 532T-218 565",778:"-344 558Q-344 583 -321 601T-262 619Q-225 619 -204 600T-182 560Q-182 536 -205 518T-264 499Q-301 499 -322 519T-344 558ZM-223 559Q-223 570 -234 579T-261 588T-289 580T-303 559Q-303 549 -293 540T-263 530T-234 539T-223 559",780:"-427 525Q-427 542 -417 559T-392 577Q-385 577 -323 553L-263 530L-203 553Q-143 576 -136 576Q-118 576 -109 559T-99 525Q-99 508 -107 502T-161 481Q-177 475 -186 472Q-256 449 -263 449Q-272 449 -339 472T-412 498Q-420 501 -423 508T-427 520V525",913:"191 76Q212 75 220 68T229 38Q229 10 208 1H129H80Q48 1 38 7T28 38Q28 51 29 57T40 69T70 76Q89 76 89 78Q90 79 117 205T173 461T205 599Q212 623 250 623H262H273Q312 623 319 599Q322 591 350 461T406 205T435 78Q435 76 454 76H458Q484 76 493 59Q496 53 496 38Q496 11 478 3Q474 1 395 1H317Q295 8 295 38Q295 65 311 73Q316 75 333 76L348 77V78Q348 80 341 112L334 143H190L183 112Q176 80 176 78Q175 76 178 76Q180 76 191 76ZM318 221Q313 238 288 366T263 519Q263 526 262 527Q261 527 261 520Q261 493 236 365T206 221Q206 219 262 219T318 221",914:"39 1Q17 10 17 32V38V46Q17 65 34 73Q40 76 61 76H84V535H61H54Q27 535 19 553Q17 557 17 573Q17 583 17 587T23 599T39 610Q40 611 179 611Q320 610 332 607Q332 607 339 605Q394 591 427 547T461 454Q461 413 436 378T369 325L358 320Q405 311 443 270T482 169Q482 112 445 64T345 3L334 1H39ZM309 533Q302 535 234 535H168V356H230Q284 357 296 358T323 368Q346 380 361 402T377 452Q377 482 358 505T309 533ZM398 176Q396 218 371 246T315 279Q310 280 237 280H168V76H239Q316 77 327 81Q329 82 334 84Q398 107 398 176",915:"466 611Q468 609 473 606T479 602T483 598T486 593T487 586T488 576T488 562V526V488Q488 452 470 444Q466 442 446 442Q421 442 413 450Q406 457 405 463T404 501V535H185V76H222H239Q260 76 270 69T281 38Q281 12 270 6T209 0H155H104Q48 0 37 5T25 38Q25 59 35 69Q44 76 76 76H101V535H76H64Q36 535 27 552Q25 557 25 573T27 594Q33 606 43 608T106 611H258H466",916:"232 622H237Q242 622 249 622T264 623H293Q295 622 300 619T308 613T314 608T319 601Q322 597 405 316T489 19Q489 9 473 1Q471 0 262 0T51 1Q35 9 35 19Q35 34 118 315T205 601Q214 616 232 622ZM267 501Q266 504 265 510T263 521T261 526V523Q261 508 211 332Q142 91 138 82H386Q385 84 345 224Q281 439 267 501",917:"374 271Q374 241 367 232T332 223Q307 223 299 231Q290 240 290 263V279H173V76H418V118V144Q418 167 426 176T460 186Q491 186 500 166Q502 161 502 93V52Q502 25 499 17T480 1H41Q19 9 19 32V38Q19 63 36 73Q42 76 65 76H89V535H65H55Q44 535 38 537T25 548T19 573Q19 602 41 610H47Q53 610 63 610T88 610T121 610T160 611T204 611T251 611H458Q460 609 465 606T471 602T475 598T478 593T479 586T480 576T480 562V526V488Q480 452 462 444Q458 442 438 442Q413 442 405 450Q398 457 397 463T396 501V535H173V355H290V371Q290 394 299 403T332 412Q363 412 372 392Q374 387 374 317V271",918:"71 1Q60 5 55 11T49 23T48 39V46Q48 56 58 73T131 183Q171 242 197 282L366 535H144V501Q144 470 143 464T135 450Q127 442 102 442H94Q71 442 62 461Q60 466 60 527L61 589Q70 607 83 610H88Q93 610 102 610T124 610T154 610T188 611T227 611T270 611H454Q456 609 461 606T467 601T471 597T474 591T475 584T476 572V565Q476 555 466 538T393 428Q353 369 327 329L158 76H397V120V146Q397 169 405 179T439 189Q470 189 479 169Q481 164 481 95V48Q481 24 478 16T459 1H71",919:"16 571Q16 597 27 604T74 611H125H208Q223 602 226 596T230 573Q230 559 227 551T217 540T204 536T186 535H165V356H359V535H338H333Q306 535 297 552Q295 556 295 573Q295 586 295 590T301 600T317 611H486Q501 602 504 596T508 573Q508 559 505 551T495 540T482 536T464 535H443V76H464H470Q482 76 489 75T502 64T508 38Q508 10 486 1H317Q306 5 301 11T296 21T295 38V44Q295 66 311 73Q318 76 338 76H359V280H165V76H186H192Q204 76 211 75T224 64T230 38Q230 10 208 1H39Q28 5 23 11T18 21T17 38V44Q17 66 33 73Q40 76 60 76H81V535H60Q45 535 38 536T24 545T16 571",920:"102 588Q140 621 240 621Q323 621 335 620Q393 613 422 588Q450 560 459 493T468 306Q468 185 460 118T422 23Q382 -10 289 -10H262H235Q142 -10 102 23Q74 50 65 118T56 306Q56 427 64 494T102 588ZM262 66Q285 66 300 67T329 74T351 86T366 108T376 138T381 181T383 235T384 306Q384 452 371 492T304 544Q296 545 251 545Q230 545 215 543T188 534T169 520T155 497T147 466T143 423T141 371T140 306Q140 247 141 215T146 151T158 107T179 82T212 69T262 66ZM179 356Q187 378 219 378H223Q240 377 249 372T260 360L261 355Q261 353 262 353T263 355Q263 362 272 369Q280 377 304 377H310Q325 377 331 374T346 356V256Q338 241 331 238T309 234H304Q280 234 272 242Q263 249 263 256Q263 258 262 258T261 256Q261 249 252 242Q244 234 220 234H216Q186 234 179 256V356",921:"400 76Q431 76 441 69T452 38Q452 29 452 26T450 18T443 9T430 1H95Q84 6 79 12T73 23T72 38Q72 65 90 73Q96 76 157 76H220V535H157H124Q93 535 83 542T72 573Q72 603 93 610Q97 611 264 611H430Q432 609 436 607T444 602T449 594Q452 588 452 573Q452 546 434 538Q428 535 367 535H304V76H367H400",922:"18 549T18 573T29 604T70 611H118H193Q207 603 210 596T214 573Q214 549 198 538Q191 535 172 535H152V421Q152 344 152 326T153 309L242 422L329 534Q327 535 322 536T314 538T308 542T303 548T300 558T298 573Q298 600 316 608Q322 611 392 611H463Q477 602 481 595T485 573Q485 535 446 535H441H420L281 357L436 77L454 76Q473 75 478 73Q495 62 495 38Q495 10 473 1H345Q334 5 329 11T324 21T323 38Q323 51 324 56T332 68T355 77L233 296L152 192V76H172Q191 76 198 73Q214 63 214 38Q214 9 193 1H41Q18 8 18 38Q18 61 35 73Q42 76 61 76H81V535H61Q42 535 35 538Q18 549 18 573",923:"30 38Q30 57 38 66T70 76Q88 76 88 78Q89 79 117 207T173 466T205 602Q213 617 231 622H236Q241 622 249 622T264 623H294Q315 609 319 602Q321 598 350 468T407 208T435 78Q436 76 454 76Q470 76 478 73Q495 62 495 38Q495 10 473 1H313Q290 10 290 38Q290 56 297 65T310 74T331 76Q350 76 350 78Q349 80 328 176T285 383T263 520Q263 526 262 527Q261 527 261 521Q261 497 240 388T198 181T174 78Q174 76 193 76Q220 75 227 65Q234 56 234 38Q234 28 234 24T228 13T212 1H52Q30 9 30 32V38",924:"50 535Q37 536 31 537T18 547T12 573Q12 598 22 604T62 611H91H121Q147 611 158 607T178 587Q183 579 222 446T261 293Q261 289 262 288Q263 288 263 292Q263 311 298 434T346 588Q353 603 365 607T402 611H435H450Q488 611 500 605T512 573Q512 556 506 547T493 537T474 535H459V76H474Q487 75 493 74T505 64T512 38Q512 11 494 3Q490 1 424 1H386Q355 1 345 7T335 38Q335 55 341 64T354 74T373 76H388V302Q388 512 387 519Q382 482 346 359T304 228Q292 204 262 204T220 228Q215 237 179 359T137 519Q136 512 136 302V76H151Q164 75 170 74T182 64T189 38Q189 11 171 3Q167 1 101 1H63Q32 1 22 7T12 38Q12 55 18 64T31 74T50 76H65V535H50",925:"20 571Q20 598 30 604T73 611H105H136Q152 611 160 611T177 607T189 601T198 587T206 568T217 537T231 497Q354 142 365 95L368 84V535H347H342Q314 535 306 552Q304 556 304 573Q304 586 304 590T310 600T326 611H482Q497 602 500 596T504 573Q504 559 501 551T491 540T478 536T460 535H439V25Q432 7 424 4T389 0H374Q334 0 322 31L293 115Q171 468 159 517L156 528V76H177H183Q195 76 202 75T215 64T221 38Q221 10 199 1H43Q32 5 27 11T22 21T21 38V44Q21 66 37 73Q44 76 64 76H85V535H64Q49 535 42 536T28 545T20 571",926:"37 555V569Q37 605 60 610H66Q71 610 81 610T105 610T137 610T175 611T217 611T264 611H465Q467 609 471 606T477 602T481 599T484 594T485 588T487 580T487 570T487 554Q487 526 486 520T478 506Q470 498 445 498T412 506Q403 515 403 531V539H121V531Q121 498 86 498H79H71Q48 498 39 517Q37 522 37 555ZM109 318V346Q109 366 113 374T132 389H170Q193 379 193 359V354H331V359Q331 379 354 389H392Q407 381 411 373T415 342V318V290Q415 270 411 262T392 247H354Q331 257 331 277V282H193V277Q193 257 170 247H132Q117 255 113 263T109 294V318ZM56 1Q41 7 37 15T33 42V58V80Q33 101 41 110T77 119Q87 118 91 118T103 114T114 103T117 83V72H407V83Q407 101 416 110T449 119T482 110Q489 103 490 97T491 59V41Q491 24 487 16T469 1H56",927:"102 588Q140 621 240 621Q323 621 335 620Q393 613 422 588Q450 560 459 493T468 306Q468 185 460 118T422 23Q382 -10 289 -10H262H235Q142 -10 102 23Q74 50 65 118T56 306Q56 427 64 494T102 588ZM363 513Q357 523 347 530T324 540T302 544T280 546H268Q192 546 167 521Q150 501 145 452T140 300Q140 235 142 197T151 130T172 89T207 71T262 65Q317 65 341 81T374 144T384 300Q384 474 363 513",928:"60 535Q45 535 38 536T24 545T16 571Q16 603 36 609Q41 611 264 611H486Q501 602 504 596T508 573Q508 559 505 551T495 540T482 536T464 535H443V76H464H470Q482 76 489 75T502 64T508 38Q508 10 486 1H317Q306 5 301 11T296 21T295 38V44Q295 66 311 73Q318 76 338 76H359V535H165V76H186H192Q204 76 211 75T224 64T230 38Q230 10 208 1H39Q28 5 23 11T18 21T17 38V44Q17 66 33 73Q40 76 60 76H81V535H60",929:"41 1Q19 9 19 32V38Q19 63 36 73Q42 76 65 76H89V535H65H55Q38 535 29 543T19 576Q19 603 41 610H49Q57 610 70 610T100 610T136 611T175 611Q190 611 216 611T255 612Q321 612 363 598T441 537Q480 486 480 427V421Q480 354 447 311T378 251Q339 230 275 230H239H173V76H197Q220 76 227 73Q244 62 244 38Q244 10 222 1H41ZM396 421Q396 461 369 491T300 533Q294 534 233 535H173V306H233Q294 307 300 308Q345 319 370 352T396 421",931:"40 575Q40 576 40 579T41 583T41 588T43 593T46 597T50 602T55 606T63 610H68Q74 610 84 610T108 610T139 610T176 611T219 611T264 611H462Q464 609 469 606T475 602T479 598T482 593T483 586T484 576T484 562V526V488Q484 452 466 444Q462 442 442 442Q417 442 409 450Q402 457 401 463T400 501V535H153Q153 533 218 430Q233 405 250 378T276 336T286 319Q290 311 290 307Q290 296 239 211Q229 194 223 184L161 78H400V112Q400 142 401 149T409 163Q418 172 442 172Q473 172 482 152Q484 147 484 86V49Q484 25 481 17T462 1H63Q41 10 41 31Q41 39 43 44Q43 45 81 109T157 238L195 303Q195 307 119 430T41 557T40 575",932:"129 38Q129 51 129 55T135 65T151 76H220V535H110V501Q110 470 109 464T101 450Q93 442 68 442H60Q37 442 28 461Q26 466 26 527L27 589Q36 607 49 610H55Q61 610 72 610T97 610T131 610T170 611T215 611T264 611H476Q478 609 483 606T489 602T493 598T496 593T497 586T498 576T498 562V526V488Q498 452 480 444Q476 442 456 442Q431 442 423 450Q416 457 415 463T414 501V535H304V76H374Q389 67 392 61T396 38Q396 10 374 1H151Q140 5 135 11T130 21T129 38",933:"38 494Q38 549 74 585T152 621Q168 621 179 619T209 606T241 566T262 492Q262 494 265 507T270 526T276 547T285 569T298 589T315 606T337 617T365 622Q416 622 451 584T486 494Q486 470 469 461Q464 459 445 459H437Q416 459 406 476Q404 479 403 502T393 541T365 558Q350 558 340 548T323 519T312 475T307 419T305 354T304 282Q304 254 304 239V76H358Q372 67 376 60T380 38Q380 10 358 1H167Q145 9 145 32V38Q145 54 148 60T167 76H220V239Q220 256 220 289T220 338T219 383T217 426T214 463T209 497T201 522T189 543T174 555Q168 558 159 558Q139 558 131 541T121 502T118 476Q108 459 84 459H79H71Q38 459 38 494",934:"139 573V578Q139 603 161 610H166Q172 610 182 610T204 610T232 611T264 611H364Q379 602 382 595T385 573Q385 544 364 536L334 535H304V441H306Q313 440 325 438T367 426T421 403T464 364T483 306Q483 251 430 216T317 172Q315 172 313 172T308 170H306H304V76H364Q379 67 382 60T385 38Q385 28 385 24T379 12T364 1H161Q139 8 139 33V38Q139 46 139 49T141 58T148 68T161 76H220V170H218Q211 171 199 173T157 185T103 208T60 248T41 306Q41 361 94 396T208 439Q210 439 212 439T216 440L218 441H220V535H190L161 536Q139 543 139 573ZM124 306Q124 286 147 271T194 252L218 247Q220 247 220 306V364H218Q212 364 192 359T148 340T124 306ZM400 305Q400 325 377 340T330 360L306 364Q304 364 304 306Q304 247 306 247Q312 247 332 252T376 271T400 305",935:"39 571Q39 597 49 604T93 611H141H218Q233 602 236 595T239 573Q239 538 210 535Q202 535 202 534T215 507T243 454L257 428L307 535H298Q266 538 266 573Q266 584 267 588T273 598T289 611H366H401Q442 611 454 605T466 573Q466 546 448 538Q442 535 421 535H398L299 327Q299 323 362 201L426 77L449 76Q467 76 475 75T489 65T495 38Q495 11 477 3Q473 1 395 1H317Q295 8 295 38Q295 73 325 76L334 77Q333 78 314 117T276 196L257 235L239 196Q221 157 204 118T186 77Q190 76 196 76Q211 74 218 67T227 55T228 38Q228 28 227 24T221 13T206 1H50Q28 9 28 32V38Q28 63 45 73Q51 76 73 76H96L214 324Q215 327 162 431L108 535H85H79Q67 535 60 536T46 546T39 571",936:"37 439Q38 451 40 457T52 469T77 475H79Q96 475 107 473T132 456T152 411Q152 409 153 396T154 372V365Q154 291 198 261Q215 251 219 251Q220 251 220 393V535H193L167 536Q145 545 145 567V573Q145 602 167 610Q168 611 264 611H358Q372 602 376 595T380 573Q380 545 358 536L331 535H304V393Q304 251 305 251Q307 251 310 252T323 259T339 272T355 295T367 331Q368 337 370 372Q370 382 371 395T372 411Q376 434 384 448T404 467T425 474T447 475Q461 474 467 473T480 463T487 437Q487 419 481 412Q476 403 459 398Q457 390 453 344T431 263Q415 228 383 205T332 177T306 172H304V76H358Q372 67 376 60T380 38Q380 10 358 1H167Q145 9 145 32V38Q145 54 148 60T167 76H220V172H218Q211 172 192 177T141 205T93 263Q74 298 71 343T67 391L66 398Q47 403 42 411T37 433V439",937:"40 404Q40 498 106 560T258 622Q357 622 420 558T484 406Q484 359 469 311T428 205T392 117Q382 84 382 78Q382 76 402 76H421V87Q421 110 431 116T457 123Q474 123 483 114Q490 107 491 100T492 61V42Q492 11 474 3Q470 1 397 1H324Q302 9 302 32V39Q302 104 351 225T400 405Q400 462 361 504T262 546Q200 546 162 504T124 405Q124 346 171 230T223 42V36Q223 11 205 3Q201 1 128 1H55Q39 7 33 23L32 60V80Q32 94 34 102T44 116T68 123Q103 123 103 87V76H123Q142 76 142 78Q142 100 117 156T66 282T40 404",8215:"57 -60Q57 -33 86 -25H438Q468 -34 468 -60T438 -95H86Q57 -86 57 -60",8242:"211 572Q211 593 226 608T262 623Q281 623 297 610T313 573Q313 561 307 465Q301 370 299 357T284 336Q279 334 262 334Q240 334 231 343Q226 350 225 362T217 465Q211 549 211 572",8260:"94 -83Q78 -83 68 -73T58 -48Q58 -44 60 -36Q62 -31 227 314T399 673Q410 694 431 694Q445 694 455 684T466 659Q466 656 464 648Q463 643 298 298T125 -62Q114 -83 94 -83",8710:"232 622H237Q242 622 249 622T264 623H293Q295 622 300 619T308 613T314 608T319 601Q322 597 405 316T489 19Q489 9 473 1Q471 0 262 0T51 1Q35 9 35 19Q35 34 118 315T205 601Q214 616 232 622ZM267 501Q266 504 265 510T263 521T261 526V523Q261 508 211 332Q142 91 138 82H386Q385 84 345 224Q281 439 267 501"},{8243:"\u2032\u2032",8244:"\u2032\u2032\u2032",8279:"\u2032\u2032\u2032\u2032"})},2418:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.normal=void 0;var H=L(9403),V=L(1668);T.normal=(0,H.AddPaths)(V.normal,{32:"",33:"78 661Q78 682 96 699T138 716T180 700T199 661Q199 654 179 432T158 206Q156 198 139 198Q121 198 119 206Q118 209 98 431T78 661ZM79 61Q79 89 97 105T141 121Q164 119 181 104T198 61Q198 31 181 16T139 1Q114 1 97 16T79 61",34:"34 634Q34 659 50 676T93 694Q121 694 144 668T168 579Q168 525 146 476T101 403T73 379Q69 379 60 388T50 401Q50 404 62 417T88 448T116 500T131 572Q131 584 130 584T125 581T112 576T94 573Q69 573 52 590T34 634ZM238 634Q238 659 254 676T297 694Q325 694 348 668T372 579Q372 525 350 476T305 403T277 379Q273 379 264 388T254 401Q254 404 266 417T292 448T320 500T335 572Q335 584 334 584T329 581T316 576T298 573Q273 573 256 590T238 634",35:"56 347Q56 360 70 367H313L355 524Q394 676 401 686Q406 694 416 694Q434 694 436 676Q436 672 396 522Q355 374 355 369L354 367H543L585 524Q626 679 630 685Q636 694 646 694Q653 694 659 689T665 678Q665 668 626 522Q585 374 585 369L584 367H762Q777 359 777 347Q777 334 767 331T722 327H667H572L552 251L531 174Q531 173 647 173H720Q756 173 766 170T777 153T762 133H519L477 -24Q436 -179 432 -185Q426 -194 416 -194Q409 -194 403 -189T397 -177Q397 -167 436 -21Q477 125 477 131L478 133H289L247 -24Q206 -179 202 -185Q196 -194 186 -194Q179 -194 173 -189T167 -177Q167 -167 206 -21Q247 125 247 131L248 133H70Q56 140 56 153Q56 168 72 173H260L280 249L301 326Q301 327 186 327H72Q56 332 56 347ZM531 326Q531 327 437 327H342L322 251L301 174Q301 173 395 173H490L510 249L531 326",36:"162 187Q162 164 146 149T109 133H103V130Q108 115 115 105Q122 92 131 82T150 64T170 52T190 44T206 40T220 37L227 36V313Q190 320 162 335Q116 358 86 404T55 508Q55 567 85 614T165 685Q186 696 225 704H227V750H273V704L286 703Q369 690 413 631Q441 588 444 531Q444 514 443 509Q439 490 425 479T391 468Q368 468 353 483T337 522Q337 546 353 560T390 575L394 576V578Q386 599 372 614T342 637T314 649T288 656L273 658V408L288 405Q329 394 355 376Q396 348 420 300T444 199Q444 130 408 76T313 1Q286 -9 276 -9H273V-56H227V-10H221Q202 -6 193 -4T155 11T108 41T74 94T55 176V182Q55 227 95 238Q103 240 108 240Q129 240 145 226T162 187ZM225 657Q219 657 204 651T169 632T135 594T121 538Q121 512 131 491T156 457T187 435T213 423T227 420V539Q227 657 225 657ZM378 169Q378 230 339 265T274 301Q273 301 273 169V37Q324 50 351 87T378 169",37:"465 605Q428 605 394 614T340 632T319 641Q332 608 332 548Q332 458 293 403T202 347Q145 347 101 402T56 548Q56 637 101 693T202 750Q241 750 272 719Q359 642 464 642Q580 642 650 732Q662 748 668 749Q670 750 673 750Q682 750 688 743T693 726Q178 -47 170 -52Q166 -56 160 -56Q147 -56 142 -45Q137 -36 142 -27Q143 -24 363 304Q469 462 525 546T581 630Q528 605 465 605ZM207 385Q235 385 263 427T292 548Q292 617 267 664T200 712Q193 712 186 709T167 698T147 668T134 615Q132 595 132 548V527Q132 436 165 403Q183 385 203 385H207ZM500 146Q500 234 544 290T647 347Q699 347 737 292T776 146T737 0T646 -56Q590 -56 545 0T500 146ZM651 -18Q679 -18 707 24T736 146Q736 215 711 262T644 309Q637 309 630 306T611 295T591 265T578 212Q577 200 577 146V124Q577 -18 647 -18H651",38:"156 540Q156 620 201 668T302 716Q354 716 377 671T401 578Q401 505 287 386L274 373Q309 285 416 148L429 132L437 142Q474 191 543 309L562 341V349Q562 368 541 376T498 385H493V431H502L626 428Q709 428 721 431H727V385H712Q688 384 669 379T639 369T618 354T603 337T591 316T578 295Q537 223 506 176T464 117T454 104Q454 102 471 85T497 62Q543 24 585 24Q618 24 648 48T682 113V121H722V112Q721 94 714 75T692 32T646 -7T574 -22Q491 -19 414 42L402 51L391 42Q312 -22 224 -22Q144 -22 93 25T42 135Q42 153 46 169T55 197T74 225T96 249T125 278T156 308L195 347L190 360Q185 372 182 382T174 411T165 448T159 491T156 540ZM361 576Q361 613 348 646T305 679Q272 679 252 649T232 572Q232 497 255 426L259 411L267 420Q361 519 361 576ZM140 164Q140 103 167 64T240 24Q271 24 304 36T356 61T374 77Q295 156 235 262L220 292L210 310L193 293Q177 277 169 268T151 229T140 164",39:"78 634Q78 659 95 676T138 694Q166 694 189 668T212 579Q212 525 190 476T146 403T118 379Q114 379 105 388T95 401Q95 404 107 417T133 448T161 500T176 572Q176 584 175 584T170 581T157 576T139 573Q114 573 96 590T78 634",40:"94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250",41:"60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749",42:"215 721Q216 732 225 741T248 750Q263 750 273 742T284 721L270 571L327 613Q383 654 388 657T399 660Q412 660 423 650T435 624T424 600T376 575Q363 569 355 566L289 534L355 504L424 470Q435 462 435 447Q435 431 424 420T399 409Q393 409 388 412T327 456L270 498L277 423L284 348Q280 320 250 320T215 348L229 498L172 456Q116 415 111 412T100 409Q87 409 76 420T64 447Q64 461 75 470L144 504L210 534L144 566Q136 570 122 576Q83 593 74 600T64 624Q64 639 75 649T100 660Q106 660 111 657T172 613L229 571Q229 578 222 643T215 721",43:"56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250",44:"78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17",45:"11 179V252H277V179H11",46:"78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60",47:"423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750",48:"96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597",49:"213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578",50:"109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429",51:"127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463",52:"462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293",53:"164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157",54:"42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397",55:"55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458",56:"70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21",57:"352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248",58:"78 370Q78 394 95 412T138 430Q162 430 180 414T199 371Q199 346 182 328T139 310T96 327T78 370ZM78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60",59:"78 370Q78 394 95 412T138 430Q162 430 180 414T199 371Q199 346 182 328T139 310T96 327T78 370ZM78 60Q78 85 94 103T137 121Q202 121 202 8Q202 -44 183 -94T144 -169T118 -194Q115 -194 106 -186T95 -174Q94 -171 107 -155T137 -107T160 -38Q161 -32 162 -22T165 -4T165 4Q165 5 161 4T142 0Q110 0 94 18T78 60",60:"694 -11T694 -19T688 -33T678 -40Q671 -40 524 29T234 166L90 235Q83 240 83 250Q83 261 91 266Q664 540 678 540Q681 540 687 534T694 519T687 505Q686 504 417 376L151 250L417 124Q686 -4 687 -5Q694 -11 694 -19",61:"56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153",62:"84 520Q84 528 88 533T96 539L99 540Q106 540 253 471T544 334L687 265Q694 260 694 250T687 235Q685 233 395 96L107 -40H101Q83 -38 83 -20Q83 -19 83 -17Q82 -10 98 -1Q117 9 248 71Q326 108 378 132L626 250L378 368Q90 504 86 509Q84 513 84 520",63:"226 668Q190 668 162 656T124 632L114 621Q116 621 119 620T130 616T145 607T157 591T162 567Q162 544 147 529T109 514T71 528T55 566Q55 625 100 661T199 704Q201 704 210 704T224 705H228Q281 705 320 692T378 656T407 612T416 567Q416 503 361 462Q267 395 247 303Q242 279 242 241V224Q242 205 239 202T222 198T205 201T202 218V249Q204 320 220 371T255 445T292 491T315 537Q317 546 317 574V587Q317 604 315 615T304 640T277 661T226 668ZM162 61Q162 89 180 105T224 121Q247 119 264 104T281 61Q281 31 264 16T222 1Q197 1 180 16T162 61",64:"56 347Q56 429 86 498T164 612T270 680T386 705Q522 705 622 603T722 349Q722 126 608 126Q541 126 513 176Q512 177 512 179T510 182L509 183Q508 183 503 177T487 163T464 146T429 132T385 126Q311 126 251 186T190 347Q190 448 251 508T385 568Q426 568 460 548T509 511T531 479H555Q580 479 582 478Q586 477 587 468Q588 454 588 338V260Q588 200 593 182T619 163Q641 163 655 178T674 223T680 273T682 325V330Q682 426 647 500Q611 569 544 618T388 668Q271 668 184 577T96 347Q96 216 180 121T396 26Q421 26 446 28T493 34T535 43T573 52T605 63T629 72T647 80T657 84H716Q722 78 722 74Q722 65 675 45T547 7T392 -11Q255 -11 156 90T56 347ZM274 347Q274 266 308 214T390 162Q420 162 449 182T498 235L504 245V449L498 459Q453 532 387 532Q347 532 311 483T274 347",65:"255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447",66:"131 622Q124 629 120 631T104 634T61 637H28V683H229H267H346Q423 683 459 678T531 651Q574 627 599 590T624 512Q624 461 583 419T476 360L466 357Q539 348 595 302T651 187Q651 119 600 67T469 3Q456 1 242 0H28V46H61Q103 47 112 49T131 61V622ZM511 513Q511 560 485 594T416 636Q415 636 403 636T371 636T333 637Q266 637 251 636T232 628Q229 624 229 499V374H312L396 375L406 377Q410 378 417 380T442 393T474 417T499 456T511 513ZM537 188Q537 239 509 282T430 336L329 337H229V200V116Q229 57 234 52Q240 47 334 47H383Q425 47 443 53Q486 67 511 104T537 188",67:"56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342",68:"130 622Q123 629 119 631T103 634T60 637H27V683H228Q399 682 419 682T461 676Q504 667 546 641T626 573T685 470T708 336Q708 210 634 116T442 3Q429 1 228 0H27V46H60Q102 47 111 49T130 61V622ZM593 338Q593 439 571 501T493 602Q439 637 355 637H322H294Q238 637 234 628Q231 624 231 344Q231 62 232 59Q233 49 248 48T339 46H350Q456 46 515 95Q561 133 577 191T593 338",69:"128 619Q121 626 117 628T101 631T58 634H25V680H597V676Q599 670 611 560T625 444V440H585V444Q584 447 582 465Q578 500 570 526T553 571T528 601T498 619T457 629T411 633T353 634Q266 634 251 633T233 622Q233 622 233 621Q232 619 232 497V376H286Q359 378 377 385Q413 401 416 469Q416 471 416 473V493H456V213H416V233Q415 268 408 288T383 317T349 328T297 330Q290 330 286 330H232V196V114Q232 57 237 52Q243 47 289 47H340H391Q428 47 452 50T505 62T552 92T584 146Q594 172 599 200T607 247T612 270V273H652V270Q651 267 632 137T610 3V0H25V46H58Q100 47 109 49T128 61V619",70:"128 619Q121 626 117 628T101 631T58 634H25V680H582V676Q584 670 596 560T610 444V440H570V444Q563 493 561 501Q555 538 543 563T516 601T477 622T431 631T374 633H334H286Q252 633 244 631T233 621Q232 619 232 490V363H284Q287 363 303 363T327 364T349 367T372 373T389 385Q407 403 410 459V480H450V200H410V221Q407 276 389 296Q381 303 371 307T348 313T327 316T303 317T284 317H232V189L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619",71:"56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q401 658 376 654T316 633T254 592T205 519T177 411Q173 369 173 335Q173 259 192 201T238 111T302 58T370 31T431 24Q478 24 513 45T559 100Q562 110 562 160V212Q561 213 557 216T551 220T542 223T526 225T502 226T463 227H437V273H449L609 270Q715 270 727 273H735V227H721Q674 227 668 215Q666 211 666 108V6Q660 0 657 0Q653 0 639 10Q617 25 600 42L587 54Q571 27 524 3T406 -22Q317 -22 238 22T108 151T56 342",72:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 500V378H517V622Q510 629 506 631T490 634T447 637H414V683H425Q446 680 569 680Q704 680 713 683H724V637H691Q651 636 640 634T622 622V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V332H232V197L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622",73:"328 0Q307 3 180 3T32 0H21V46H43Q92 46 106 49T126 60Q128 63 128 342Q128 620 126 623Q122 628 118 630T96 635T43 637H21V683H32Q53 680 180 680T328 683H339V637H317Q268 637 254 634T234 623Q232 620 232 342Q232 63 234 60Q238 55 242 53T264 48T317 46H339V0H328",74:"89 177Q115 177 133 160T152 112Q152 88 137 72T102 52Q99 51 101 49Q106 43 129 29Q159 15 190 15Q232 15 256 48T286 126Q286 127 286 142T286 183T286 238T287 306T287 378Q287 403 287 429T287 479T287 524T286 563T286 593T286 614V621Q281 630 263 633T182 637H154V683H166Q187 680 332 680Q439 680 457 683H465V637H449Q422 637 401 634Q393 631 389 623Q388 621 388 376T387 123Q377 61 322 20T194 -22Q188 -22 177 -21T160 -20Q96 -9 61 29T25 110Q25 144 44 160T89 177",75:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H313Q235 637 233 620Q232 618 232 462L233 307L379 449Q425 494 479 546Q518 584 524 591T531 607V608Q531 630 503 636Q501 636 498 636T493 637H489V683H499Q517 680 630 680Q704 680 716 683H722V637H708Q633 633 589 597Q584 592 495 506T406 419T515 254T631 80Q644 60 662 54T715 46H736V0H728Q719 3 615 3Q493 3 472 0H461V46H469Q515 46 515 72Q515 78 512 84L336 351Q332 348 278 296L232 251V156Q232 62 235 58Q243 47 302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622",76:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q48 680 182 680Q324 680 348 683H360V637H333Q273 637 258 635T233 622L232 342V129Q232 57 237 52Q243 47 313 47Q384 47 410 53Q470 70 498 110T536 221Q536 226 537 238T540 261T542 272T562 273H582V268Q580 265 568 137T554 5V0H25V46H58Q100 47 109 49T128 61V622",77:"132 622Q125 629 121 631T105 634T62 637H29V683H135Q221 683 232 682T249 675Q250 674 354 398L458 124L562 398Q666 674 668 675Q671 681 683 682T781 683H887V637H854Q814 636 803 634T785 622V61Q791 51 802 49T854 46H887V0H876Q855 3 736 3Q605 3 596 0H585V46H618Q660 47 669 49T688 61V347Q688 424 688 461T688 546T688 613L687 632Q454 14 450 7Q446 1 430 1T410 7Q409 9 292 316L176 624V606Q175 588 175 543T175 463T175 356L176 86Q187 50 261 46H278V0H269Q254 3 154 3Q52 3 37 0H29V46H46Q78 48 98 56T122 69T132 86V622",78:"42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42",79:"56 340Q56 423 86 494T164 610T270 680T388 705Q521 705 621 601T722 341Q722 260 693 191T617 75T510 4T388 -22T267 3T160 74T85 189T56 340ZM467 647Q426 665 388 665Q360 665 331 654T269 620T213 549T179 439Q174 411 174 354Q174 144 277 61Q327 20 385 20H389H391Q474 20 537 99Q603 188 603 354Q603 411 598 439Q577 592 467 647",80:"130 622Q123 629 119 631T103 634T60 637H27V683H214Q237 683 276 683T331 684Q419 684 471 671T567 616Q624 563 624 489Q624 421 573 372T451 307Q429 302 328 301H234V181Q234 62 237 58Q245 47 304 46H337V0H326Q305 3 182 3Q47 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM507 488Q507 514 506 528T500 564T483 597T450 620T397 635Q385 637 307 637H286Q237 637 234 628Q231 624 231 483V342H302H339Q390 342 423 349T481 382Q507 411 507 488",81:"56 341Q56 499 157 602T388 705Q521 705 621 601T722 341Q722 275 703 218T660 127T603 63T555 25T525 9Q524 8 524 8H523Q524 5 526 -1T537 -21T555 -47T581 -67T615 -76Q653 -76 678 -56T706 -3Q707 10 716 10Q721 10 728 5L727 -13Q727 -88 697 -140T606 -193Q563 -193 538 -166T498 -83Q483 -23 483 -8L471 -11Q459 -14 435 -18T388 -22Q254 -22 155 81T56 341ZM607 339Q607 429 586 496T531 598T461 649T390 665T318 649T248 598T192 496T170 339Q170 143 277 57Q301 39 305 39L304 42Q304 44 304 46Q301 53 301 68Q301 101 325 128T391 155Q454 155 495 70L501 58Q549 91 578 164Q607 234 607 339ZM385 18Q404 18 425 23T459 33T472 40Q471 47 468 57T449 88T412 115Q398 117 386 117Q367 117 353 102T338 67Q338 48 351 33T385 18",82:"130 622Q123 629 119 631T103 634T60 637H27V683H202H236H300Q376 683 417 677T500 648Q595 600 609 517Q610 512 610 501Q610 468 594 439T556 392T511 361T472 343L456 338Q459 335 467 332Q497 316 516 298T545 254T559 211T568 155T578 94Q588 46 602 31T640 16H645Q660 16 674 32T692 87Q692 98 696 101T712 105T728 103T732 90Q732 59 716 27T672 -16Q656 -22 630 -22Q481 -16 458 90Q456 101 456 163T449 246Q430 304 373 320L363 322L297 323H231V192L232 61Q238 51 249 49T301 46H334V0H323Q302 3 181 3Q59 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM491 499V509Q491 527 490 539T481 570T462 601T424 623T362 636Q360 636 340 636T304 637H283Q238 637 234 628Q231 624 231 492V360H289Q390 360 434 378T489 456Q491 467 491 499",83:"55 507Q55 590 112 647T243 704H257Q342 704 405 641L426 672Q431 679 436 687T446 700L449 704Q450 704 453 704T459 705H463Q466 705 472 699V462L466 456H448Q437 456 435 459T430 479Q413 605 329 646Q292 662 254 662Q201 662 168 626T135 542Q135 508 152 480T200 435Q210 431 286 412T370 389Q427 367 463 314T500 191Q500 110 448 45T301 -21Q245 -21 201 -4T140 27L122 41Q118 36 107 21T87 -7T78 -21Q76 -22 68 -22H64Q61 -22 55 -16V101Q55 220 56 222Q58 227 76 227H89Q95 221 95 214Q95 182 105 151T139 90T205 42T305 24Q352 24 386 62T420 155Q420 198 398 233T340 281Q284 295 266 300Q261 301 239 306T206 314T174 325T141 343T112 367T85 402Q55 451 55 507",84:"36 443Q37 448 46 558T55 671V677H666V671Q667 666 676 556T685 443V437H645V443Q645 445 642 478T631 544T610 593Q593 614 555 625Q534 630 478 630H451H443Q417 630 414 618Q413 616 413 339V63Q420 53 439 50T528 46H558V0H545L361 3Q186 1 177 0H164V46H194Q264 46 283 49T309 63V339V550Q309 620 304 625T271 630H244H224Q154 630 119 601Q101 585 93 554T81 486T76 443V437H36V443",85:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 418V291Q232 189 240 145T280 67Q325 24 389 24Q454 24 506 64T571 183Q575 206 575 410V598Q569 608 565 613T541 627T489 637H472V683H481Q496 680 598 680T715 683H724V637H707Q634 633 622 598L621 399Q620 194 617 180Q617 179 615 171Q595 83 531 31T389 -22Q304 -22 226 33T130 192Q129 201 128 412V622",86:"114 620Q113 621 110 624T107 627T103 630T98 632T91 634T80 635T67 636T48 637H19V683H28Q46 680 152 680Q273 680 294 683H305V637H284Q223 634 223 620Q223 618 313 372T404 126L490 358Q575 588 575 597Q575 616 554 626T508 637H503V683H512Q527 680 627 680Q718 680 724 683H730V637H723Q648 637 627 596Q627 595 515 291T401 -14Q396 -22 382 -22H374H367Q353 -22 348 -14Q346 -12 231 303Q114 617 114 620",87:"792 683Q810 680 914 680Q991 680 1003 683H1009V637H996Q931 633 915 598Q912 591 863 438T766 135T716 -17Q711 -22 694 -22Q676 -22 673 -15Q671 -13 593 231L514 477L435 234Q416 174 391 92T358 -6T341 -22H331Q314 -21 310 -15Q309 -14 208 302T104 622Q98 632 87 633Q73 637 35 637H18V683H27Q69 681 154 681Q164 681 181 681T216 681T249 682T276 683H287H298V637H285Q213 637 213 620Q213 616 289 381L364 144L427 339Q490 535 492 546Q487 560 482 578T475 602T468 618T461 628T449 633T433 636T408 637H380V683H388Q397 680 508 680Q629 680 650 683H660V637H647Q576 637 576 619L727 146Q869 580 869 600Q869 605 863 612T839 627T794 637H783V683H792",88:"270 0Q252 3 141 3Q46 3 31 0H23V46H40Q129 50 161 88Q165 94 244 216T324 339Q324 341 235 480T143 622Q133 631 119 634T57 637H37V683H46Q64 680 172 680Q297 680 318 683H329V637H324Q307 637 286 632T263 621Q263 618 322 525T384 431Q385 431 437 511T489 593Q490 595 490 599Q490 611 477 622T436 637H428V683H437Q455 680 566 680Q661 680 676 683H684V637H667Q585 634 551 599Q548 596 478 491Q412 388 412 387Q412 385 514 225T620 62Q628 53 642 50T695 46H726V0H717Q699 3 591 3Q466 3 445 0H434V46H440Q454 46 476 51T499 64Q499 67 463 124T390 238L353 295L350 292Q348 290 343 283T331 265T312 236T286 195Q219 88 218 84Q218 70 234 59T272 46H280V0H270",89:"518 0Q497 3 374 3Q253 3 232 0H221V46H254Q313 47 321 58Q324 62 324 167V273L221 446Q117 620 114 623Q106 631 91 634T31 637H11V683H20Q29 680 148 680Q273 680 294 683H305V637H287Q239 636 236 621Q236 619 321 475L407 332L483 460Q502 492 527 534Q563 594 563 604Q563 632 517 637H508V683H517H525Q533 683 545 683T571 682T600 681T626 681Q695 681 731 683H738V637H723Q640 633 613 588Q612 587 517 427L425 273V169V95Q425 66 428 59T444 49Q459 46 506 46H528V0H518",90:"69 443Q69 452 74 554T80 683H549Q555 677 555 664Q555 649 554 648Q552 645 366 348T179 50T192 49T263 49H275H302Q333 49 353 50T401 59T447 78T482 115T507 173Q513 200 520 273V282H560V274Q560 272 552 143T543 8V0H302L61 1L58 3Q55 8 55 21V35Q59 43 153 193T340 489T432 637H343Q259 637 214 625T141 573Q109 523 109 445Q109 443 89 443H69",91:"118 -250V750H255V710H158V-210H255V-250H118",92:"56 731Q56 740 62 745T75 750Q85 750 92 740Q96 733 270 255T444 -231Q444 -239 438 -244T424 -250Q414 -250 407 -240Q404 -236 230 242T56 731",93:"22 710V750H159V-250H22V-210H119V710H22",94:"112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560",95:"0 -62V-25H499V-62H0",96:"106 655Q106 671 119 685T150 699Q166 699 177 688Q190 671 222 629T275 561T295 533T282 519L267 505L196 563Q119 626 113 634Q106 643 106 655",97:"137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106",98:"307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98",99:"370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320",100:"376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342",101:"28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275",102:"273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273",103:"329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75",104:"41 46H55Q94 46 102 60V68Q102 77 102 91T102 124T102 167T103 217T103 272T103 329Q103 366 103 407T103 482T102 542T102 586T102 603Q99 622 88 628T43 637H25V660Q25 683 27 683L37 684Q47 685 66 686T103 688Q120 689 140 690T170 693T181 694H184V367Q244 442 328 442Q451 442 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41",105:"69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247",106:"98 609Q98 637 116 653T160 669Q183 667 200 652T217 609Q217 579 200 564T158 549Q133 549 116 564T98 609ZM28 -163Q58 -168 64 -168Q124 -168 135 -77Q137 -65 137 141T136 353Q132 371 120 377T72 385H52V408Q52 431 54 431L58 432Q62 432 70 432T87 433T108 434T133 436Q151 437 171 438T202 441T214 442H218V184Q217 -36 217 -59T211 -98Q195 -145 153 -175T58 -205Q9 -205 -23 -179T-55 -117Q-55 -94 -40 -79T-2 -64T36 -79T52 -118Q52 -143 28 -163",107:"36 46H50Q89 46 97 60V68Q97 77 97 91T97 124T98 167T98 217T98 272T98 329Q98 366 98 407T98 482T98 542T97 586T97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V463L180 233L240 287Q300 341 304 347Q310 356 310 364Q310 383 289 385H284V431H293Q308 428 412 428Q475 428 484 431H489V385H476Q407 380 360 341Q286 278 286 274Q286 273 349 181T420 79Q434 60 451 53T500 46H511V0H505Q496 3 418 3Q322 3 307 0H299V46H306Q330 48 330 65Q330 72 326 79Q323 84 276 153T228 222L176 176V120V84Q176 65 178 59T189 49Q210 46 238 46H254V0H246Q231 3 137 3T28 0H20V46H36",108:"42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42",109:"41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41",110:"41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41",111:"28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30",112:"36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218",113:"33 218Q33 308 95 374T236 441H246Q330 441 381 372L387 364Q388 364 404 403L420 442H457V156Q457 -132 458 -134Q462 -142 470 -145Q491 -148 519 -148H535V-194H527L504 -193Q480 -192 453 -192T415 -191Q312 -191 303 -194H295V-148H311Q339 -148 360 -145Q369 -141 371 -135T373 -106V-41V49Q313 -11 236 -11Q154 -11 94 53T33 218ZM376 300Q346 389 278 401Q275 401 269 401T261 402Q211 400 171 350T131 214Q131 137 165 82T253 27Q296 27 328 54T376 118V300",114:"36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36",115:"295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316",116:"27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27",117:"383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58",118:"338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338",119:"90 368Q84 378 76 380T40 385H18V431H24L43 430Q62 430 84 429T116 428Q206 428 221 431H229V385H215Q177 383 177 368Q177 367 221 239L265 113L339 328L333 345Q323 374 316 379Q308 384 278 385H258V431H264Q270 428 348 428Q439 428 454 431H461V385H452Q404 385 404 369Q404 366 418 324T449 234T481 143L496 100L537 219Q579 341 579 347Q579 363 564 373T530 385H522V431H529Q541 428 624 428Q692 428 698 431H703V385H697Q696 385 691 385T682 384Q635 377 619 334L559 161Q546 124 528 71Q508 12 503 1T487 -11H479Q460 -11 456 -4Q455 -3 407 133L361 267Q359 263 266 -4Q261 -11 243 -11H238Q225 -11 220 -3L90 368",120:"201 0Q189 3 102 3Q26 3 17 0H11V46H25Q48 47 67 52T96 61T121 78T139 96T160 122T180 150L226 210L168 288Q159 301 149 315T133 336T122 351T113 363T107 370T100 376T94 379T88 381T80 383Q74 383 44 385H16V431H23Q59 429 126 429Q219 429 229 431H237V385Q201 381 201 369Q201 367 211 353T239 315T268 274L272 270L297 304Q329 345 329 358Q329 364 327 369T322 376T317 380T310 384L307 385H302V431H309Q324 428 408 428Q487 428 493 431H499V385H492Q443 385 411 368Q394 360 377 341T312 257L296 236L358 151Q424 61 429 57T446 50Q464 46 499 46H516V0H510H502Q494 1 482 1T457 2T432 2T414 3Q403 3 377 3T327 1L304 0H295V46H298Q309 46 320 51T331 63Q331 65 291 120L250 175Q249 174 219 133T185 88Q181 83 181 74Q181 63 188 55T206 46Q208 46 208 23V0H201",121:"69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66",122:"42 263Q44 270 48 345T53 423V431H393Q399 425 399 415Q399 403 398 402L381 378Q364 355 331 309T265 220L134 41L182 40H206Q254 40 283 46T331 77Q352 105 359 185L361 201Q361 202 381 202H401V196Q401 195 393 103T384 6V0H209L34 1L31 3Q28 8 28 17Q28 30 29 31T160 210T294 394H236Q169 393 152 388Q127 382 113 367Q89 344 82 264V255H42V263",123:"434 -231Q434 -244 428 -250H410Q281 -250 230 -184Q225 -177 222 -172T217 -161T213 -148T211 -133T210 -111T209 -84T209 -47T209 0Q209 21 209 53Q208 142 204 153Q203 154 203 155Q189 191 153 211T82 231Q71 231 68 234T65 250T68 266T82 269Q116 269 152 289T203 345Q208 356 208 377T209 529V579Q209 634 215 656T244 698Q270 724 324 740Q361 748 377 749Q379 749 390 749T408 750H428Q434 744 434 732Q434 719 431 716Q429 713 415 713Q362 710 332 689T296 647Q291 634 291 499V417Q291 370 288 353T271 314Q240 271 184 255L170 250L184 245Q202 239 220 230T262 196T290 137Q291 131 291 1Q291 -134 296 -147Q306 -174 339 -192T415 -213Q429 -213 431 -216Q434 -219 434 -231",124:"139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139",125:"65 731Q65 745 68 747T88 750Q171 750 216 725T279 670Q288 649 289 635T291 501Q292 362 293 357Q306 312 345 291T417 269Q428 269 431 266T434 250T431 234T417 231Q380 231 345 210T298 157Q293 143 292 121T291 -28V-79Q291 -134 285 -156T256 -198Q202 -250 89 -250Q71 -250 68 -247T65 -230Q65 -224 65 -223T66 -218T69 -214T77 -213Q91 -213 108 -210T146 -200T183 -177T207 -139Q208 -134 209 3L210 139Q223 196 280 230Q315 247 330 250Q305 257 280 270Q225 304 212 352L210 362L209 498Q208 635 207 640Q195 680 154 696T77 713Q68 713 67 716T65 731",126:"179 251Q164 251 151 245T131 234T111 215L97 227L83 238Q83 239 95 253T121 283T142 304Q165 318 187 318T253 300T320 282Q335 282 348 288T368 299T388 318L402 306L416 295Q375 236 344 222Q330 215 313 215Q292 215 248 233T179 251",160:"",163:"699 578Q699 473 635 473Q597 473 595 508Q595 559 654 569V576Q654 619 637 648T581 677Q545 677 513 647T463 561Q460 554 437 464T414 371Q414 370 458 370H502Q508 364 508 362Q505 334 495 324H402L382 241Q377 224 373 206T366 180T361 163T358 151T354 142T350 133T344 120Q340 112 338 107T336 101L354 90Q398 63 422 54T476 44Q515 44 539 73T574 133Q578 144 580 146T598 148Q622 148 622 139Q622 138 620 130Q602 74 555 32T447 -11Q395 -11 317 38L294 51Q271 28 233 9T155 -10Q117 -10 103 5T88 39Q88 73 126 106T224 139Q236 139 247 138T266 134L273 132Q275 132 302 239L323 324H259Q253 330 253 332Q253 350 265 370H300L334 371L355 453Q356 457 360 477T366 501T372 522T379 545T387 565T397 587T409 606T425 627Q453 664 497 689T583 714Q640 714 669 676T699 578ZM245 76Q211 85 195 85Q173 85 158 71T142 42Q142 26 160 26H163Q211 30 245 76",165:"515 0Q494 3 374 3Q256 3 235 0H224V46H257Q316 47 324 58Q327 62 327 137V213H133Q121 213 113 213T97 213T86 213T78 213T73 214T70 215T69 216T68 218T67 220Q64 225 66 231T73 240Q76 242 202 242H327V273L247 407H115Q81 407 75 408T67 414Q64 419 66 425T73 434Q76 436 153 436Q228 436 228 437Q227 440 173 530T115 623Q101 637 31 637H11V683H20Q66 681 153 681Q169 681 202 681T262 682L288 683H298V637H280Q230 636 230 621Q230 619 250 584Q255 576 264 561T286 526T305 494L340 437L403 436H467L513 514Q564 596 564 605Q564 608 560 616Q550 634 517 637H508V683H516Q531 680 633 680Q722 680 731 683H738V637H723Q644 632 617 595Q614 591 568 515T521 437T597 436T676 434Q681 432 683 426T682 414T671 409T589 407H503L422 273V242H547Q673 242 676 240Q681 238 683 232T682 220Q682 219 682 218T681 217T679 216T677 215T672 214T664 213T652 213T637 213T616 213H422V139V87Q422 64 425 58T441 49Q456 46 503 46H525V0H515ZM449 406Q449 407 403 407Q358 407 358 406L370 387Q381 368 392 350L404 331Q447 404 449 406",168:"95 612Q95 633 112 651T153 669T193 652T210 612Q210 588 194 571T152 554L127 560Q95 577 95 612ZM289 611Q289 634 304 649T335 668Q336 668 340 668T346 669Q369 669 386 652T404 612T387 572T346 554Q323 554 306 570T289 611",172:"56 323T56 336T70 356H596Q603 353 611 343V102Q598 89 591 89Q587 89 584 90T579 94T575 98T572 102L571 209V316H70Q56 323 56 336",174:"915 266Q915 140 852 38T689 -120T474 -175Q312 -175 188 -71T38 190Q32 220 32 266V287Q32 345 57 416T129 545Q192 624 282 666T464 709Q513 709 522 708Q599 698 665 666T776 590T853 493T900 387T915 287V266ZM875 285Q875 339 853 399T789 517T676 616T519 668Q510 669 465 669Q380 669 299 630T155 514T77 336Q72 312 72 285V266V256Q72 123 163 11Q290 -135 474 -135Q614 -135 727 -46Q875 81 875 266V285ZM276 457Q275 458 274 460T272 463T270 465T267 467T264 469T258 471T252 472T243 473T232 474T218 474H204V514H335Q477 514 499 510Q560 502 610 467T661 375Q661 362 658 350T648 327T635 308T618 292T601 280T583 269T568 262T554 256L547 253Q548 252 556 247T570 237T586 223T602 202T614 174Q616 169 626 123T638 72Q652 23 683 23Q715 23 720 68Q721 78 724 81T740 84T756 82T760 70Q760 47 747 25T715 -7Q700 -14 673 -14Q672 -14 662 -14T643 -12T619 -7T593 2T568 16T547 37T534 67Q531 80 531 97Q531 103 531 116T532 136Q532 218 472 236Q466 238 413 239H360V148L361 58Q366 47 375 44T418 40H432V0H424Q409 3 318 3T212 0H204V40H218Q242 40 253 42T268 47T276 58V457ZM376 473Q365 471 363 464T360 430V366V276H416Q421 276 434 276T453 276T469 277T486 279T501 282T517 287T529 294T542 305Q561 324 561 375Q561 424 545 444T482 472Q478 473 427 474Q415 474 403 474T384 474L376 473",175:"69 544V590H430V544H69",176:"147 628Q147 669 179 692T244 715Q298 715 325 689T352 629Q352 592 323 567T249 542Q202 542 175 567T147 628ZM313 628Q313 660 300 669T259 678H253Q248 678 242 678T234 679Q217 679 207 674T192 659T188 644T187 629Q187 600 198 590Q210 579 250 579H265Q279 579 288 581T305 595T313 628",177:"56 320T56 333T70 353H369V502Q369 651 371 655Q376 666 388 666Q402 666 405 654T409 596V500V353H707Q722 345 722 333Q722 320 707 313H409V40H707Q722 32 722 20T707 0H70Q56 7 56 20T70 40H369V313H70Q56 320 56 333",180:"349 699Q367 699 380 686T393 656Q393 651 392 647T387 637T380 627T367 616T351 602T330 585T303 563L232 505L217 519Q203 533 204 533Q204 534 229 567T282 636T313 678L316 681Q318 684 321 686T328 692T337 697T349 699",183:"78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250",215:"630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29",240:"75 566V604Q75 624 79 629T102 635Q124 635 127 629T131 588L133 550L191 588L249 628L231 635Q176 654 124 657Q116 657 106 658L95 659Q94 661 94 687T95 715Q99 717 113 717Q195 717 282 679L309 668L331 681Q351 697 391 721Q428 748 435 748Q437 749 446 749Q470 749 473 746Q478 744 478 681V621Q466 615 456 615Q435 615 424 624L422 661V699L382 675L344 648Q353 639 366 630Q480 538 504 413Q509 393 509 333V313Q509 284 507 257T495 184T466 102T413 33T329 -16Q311 -21 275 -21Q226 -21 195 -10Q150 7 110 50T53 141Q42 179 42 227Q42 332 101 403T245 474Q282 474 314 461T359 436T380 415Q386 405 389 408Q389 426 378 475Q368 505 355 529T329 567T306 590T288 603L282 606L120 501Q116 500 102 500Q84 500 75 506V566ZM388 225Q388 376 309 410Q299 416 273 419Q216 419 191 390Q174 371 168 342T162 218Q162 112 184 79Q212 39 273 39Q312 39 342 62T380 121Q388 159 388 225",247:"318 466Q318 500 339 518T386 537Q418 537 438 517T458 466Q458 438 440 417T388 396Q355 396 337 417T318 466ZM56 237T56 250T70 270H706Q721 262 721 250T706 230H70Q56 237 56 250ZM318 34Q318 68 339 86T386 105Q418 105 438 85T458 34Q458 6 440 -15T388 -36Q355 -36 337 -15T318 34",305:"247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247",567:"28 -163Q58 -168 64 -168Q124 -168 135 -77Q137 -65 137 141T136 353Q132 371 120 377T72 385H52V408Q52 431 54 431L58 432Q62 432 70 432T87 433T108 434T133 436Q151 437 171 438T202 441T214 442H218V184Q217 -36 217 -59T211 -98Q195 -145 153 -175T58 -205Q9 -205 -23 -179T-55 -117Q-55 -94 -40 -79T-2 -64T36 -79T52 -118Q52 -143 28 -163",697:"79 43Q73 43 52 49T30 61Q30 68 85 293T146 528Q161 560 198 560Q218 560 240 545T262 501Q262 496 260 486Q259 479 173 263T84 45T79 43",710:"112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560",711:"114 611L127 630L136 644Q138 644 193 612Q248 581 250 581L306 612Q361 644 363 644L385 611L318 562L249 513L114 611",713:"69 544V590H430V544H69",714:"349 699Q367 699 380 686T393 656Q393 651 392 647T387 637T380 627T367 616T351 602T330 585T303 563L232 505L217 519Q203 533 204 533Q204 534 229 567T282 636T313 678L316 681Q318 684 321 686T328 692T337 697T349 699",715:"106 655Q106 671 119 685T150 699Q166 699 177 688Q190 671 222 629T275 561T295 533T282 519L267 505L196 563Q119 626 113 634Q106 643 106 655",728:"250 515Q179 515 138 565T92 683V694H129V689Q129 688 129 683T130 675Q137 631 169 599T248 567Q304 567 337 608T370 689V694H407V683Q403 617 361 566T250 515",729:"190 609Q190 637 208 653T252 669Q275 667 292 652T309 609Q309 579 292 564T250 549Q225 549 208 564T190 609",730:"147 628Q147 669 179 692T244 715Q298 715 325 689T352 629Q352 592 323 567T249 542Q202 542 175 567T147 628ZM313 628Q313 660 300 669T259 678H253Q248 678 242 678T234 679Q217 679 207 674T192 659T188 644T187 629Q187 600 198 590Q210 579 250 579H265Q279 579 288 581T305 595T313 628",732:"179 601Q164 601 151 595T131 584T111 565L97 577L83 588Q83 589 95 603T121 633T142 654Q165 668 187 668T253 650T320 632Q335 632 348 638T368 649T388 668L402 656L416 645Q375 586 344 572Q330 565 313 565Q292 565 248 583T179 601",768:"-394 655Q-394 671 -381 685T-350 699Q-334 699 -323 688Q-310 671 -278 629T-225 561T-205 533T-218 519L-233 505L-304 563Q-381 626 -387 634Q-394 643 -394 655",769:"-151 699Q-133 699 -120 686T-107 656Q-107 651 -108 647T-113 637T-120 627T-133 616T-149 602T-170 585T-197 563L-268 505L-283 519Q-297 533 -296 533Q-296 534 -271 567T-218 636T-187 678L-184 681Q-182 684 -179 686T-172 692T-163 697T-151 699",770:"-388 560L-251 694L-243 686Q-113 562 -113 560L-139 531Q-141 532 -197 581L-250 627L-305 580Q-318 569 -331 557T-352 538L-360 532Q-362 530 -375 546L-388 560",771:"-321 601Q-336 601 -349 595T-369 584T-389 565L-403 577L-417 588Q-417 589 -405 603T-379 633T-358 654Q-335 668 -313 668T-247 650T-180 632Q-165 632 -152 638T-132 649T-112 668L-98 656L-84 645Q-125 586 -156 572Q-170 565 -187 565Q-208 565 -252 583T-321 601",772:"-431 544V590H-70V544H-431",774:"-250 515Q-321 515 -362 565T-408 683V694H-371V689Q-371 688 -371 683T-370 675Q-363 631 -331 599T-252 567Q-196 567 -163 608T-130 689V694H-93V683Q-97 617 -139 566T-250 515",775:"-310 609Q-310 637 -292 653T-248 669Q-225 667 -208 652T-191 609Q-191 579 -208 564T-250 549Q-275 549 -292 564T-310 609",776:"-405 612Q-405 633 -388 651T-347 669T-307 652T-290 612Q-290 588 -306 571T-348 554L-373 560Q-405 577 -405 612ZM-211 611Q-211 634 -196 649T-165 668Q-164 668 -160 668T-154 669Q-131 669 -114 652T-96 612T-113 572T-154 554Q-177 554 -194 570T-211 611",778:"-353 628Q-353 669 -321 692T-256 715Q-202 715 -175 689T-148 629Q-148 592 -177 567T-251 542Q-298 542 -325 567T-353 628ZM-187 628Q-187 660 -200 669T-241 678H-247Q-252 678 -258 678T-266 679Q-283 679 -293 674T-308 659T-312 644T-313 629Q-313 600 -302 590Q-290 579 -250 579H-235Q-221 579 -212 581T-195 595T-187 628",779:"-292 701Q-278 701 -262 690T-246 658Q-246 649 -250 641Q-252 637 -297 574T-344 510L-378 528Q-378 530 -355 598T-327 676Q-316 701 -292 701ZM-126 701Q-112 701 -96 690T-80 658Q-80 649 -84 641Q-86 637 -131 574T-178 510L-212 528Q-212 530 -189 598T-161 676Q-150 701 -126 701",780:"-386 611L-373 630L-364 644Q-362 644 -307 612Q-252 581 -250 581L-194 612Q-139 644 -137 644L-115 611L-182 562L-251 513L-386 611",824:"-612 -215T-619 -215T-631 -212T-637 -204T-639 -197Q-639 -190 -634 -183Q-621 -157 -400 274T-176 707Q-173 716 -160 716Q-153 716 -148 712T-142 703T-140 696Q-140 691 -372 241T-608 -212Q-612 -215 -619 -215",913:"255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447",914:"131 622Q124 629 120 631T104 634T61 637H28V683H229H267H346Q423 683 459 678T531 651Q574 627 599 590T624 512Q624 461 583 419T476 360L466 357Q539 348 595 302T651 187Q651 119 600 67T469 3Q456 1 242 0H28V46H61Q103 47 112 49T131 61V622ZM511 513Q511 560 485 594T416 636Q415 636 403 636T371 636T333 637Q266 637 251 636T232 628Q229 624 229 499V374H312L396 375L406 377Q410 378 417 380T442 393T474 417T499 456T511 513ZM537 188Q537 239 509 282T430 336L329 337H229V200V116Q229 57 234 52Q240 47 334 47H383Q425 47 443 53Q486 67 511 104T537 188",915:"128 619Q121 626 117 628T101 631T58 634H25V680H554V676Q556 670 568 560T582 444V440H542V444Q542 445 538 478T523 545T492 598Q454 634 349 634H334Q264 634 249 633T233 621Q232 618 232 339L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619",916:"51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344",917:"128 619Q121 626 117 628T101 631T58 634H25V680H597V676Q599 670 611 560T625 444V440H585V444Q584 447 582 465Q578 500 570 526T553 571T528 601T498 619T457 629T411 633T353 634Q266 634 251 633T233 622Q233 622 233 621Q232 619 232 497V376H286Q359 378 377 385Q413 401 416 469Q416 471 416 473V493H456V213H416V233Q415 268 408 288T383 317T349 328T297 330Q290 330 286 330H232V196V114Q232 57 237 52Q243 47 289 47H340H391Q428 47 452 50T505 62T552 92T584 146Q594 172 599 200T607 247T612 270V273H652V270Q651 267 632 137T610 3V0H25V46H58Q100 47 109 49T128 61V619",918:"69 443Q69 452 74 554T80 683H549Q555 677 555 664Q555 649 554 648Q552 645 366 348T179 50T192 49T263 49H275H302Q333 49 353 50T401 59T447 78T482 115T507 173Q513 200 520 273V282H560V274Q560 272 552 143T543 8V0H302L61 1L58 3Q55 8 55 21V35Q59 43 153 193T340 489T432 637H343Q259 637 214 625T141 573Q109 523 109 445Q109 443 89 443H69",919:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 500V378H517V622Q510 629 506 631T490 634T447 637H414V683H425Q446 680 569 680Q704 680 713 683H724V637H691Q651 636 640 634T622 622V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V332H232V197L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622",920:"56 340Q56 423 86 494T164 610T270 680T388 705Q521 705 621 601T722 341Q722 260 693 191T617 75T510 4T388 -22T267 3T160 74T85 189T56 340ZM610 339Q610 428 590 495T535 598T463 651T384 668Q332 668 289 638T221 566Q168 485 168 339Q168 274 176 235Q189 158 228 105T324 28Q356 16 388 16Q415 16 442 24T501 54T555 111T594 205T610 339ZM223 263V422H263V388H514V422H554V263H514V297H263V263H223",921:"328 0Q307 3 180 3T32 0H21V46H43Q92 46 106 49T126 60Q128 63 128 342Q128 620 126 623Q122 628 118 630T96 635T43 637H21V683H32Q53 680 180 680T328 683H339V637H317Q268 637 254 634T234 623Q232 620 232 342Q232 63 234 60Q238 55 242 53T264 48T317 46H339V0H328",922:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H313Q235 637 233 620Q232 618 232 462L233 307L379 449Q425 494 479 546Q518 584 524 591T531 607V608Q531 630 503 636Q501 636 498 636T493 637H489V683H499Q517 680 630 680Q704 680 716 683H722V637H708Q633 633 589 597Q584 592 495 506T406 419T515 254T631 80Q644 60 662 54T715 46H736V0H728Q719 3 615 3Q493 3 472 0H461V46H469Q515 46 515 72Q515 78 512 84L336 351Q332 348 278 296L232 251V156Q232 62 235 58Q243 47 302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622",923:"320 708Q326 716 340 716H348H355Q367 716 372 708Q374 706 423 547T523 226T575 62Q581 52 591 50T634 46H661V0H653Q644 3 532 3Q411 3 390 0H379V46H392Q464 46 464 65Q463 70 390 305T316 539L246 316Q177 95 177 84Q177 72 198 59T248 46H253V0H245Q230 3 130 3Q47 3 38 0H32V46H45Q112 51 127 91Q128 92 224 399T320 708",924:"132 622Q125 629 121 631T105 634T62 637H29V683H135Q221 683 232 682T249 675Q250 674 354 398L458 124L562 398Q666 674 668 675Q671 681 683 682T781 683H887V637H854Q814 636 803 634T785 622V61Q791 51 802 49T854 46H887V0H876Q855 3 736 3Q605 3 596 0H585V46H618Q660 47 669 49T688 61V347Q688 424 688 461T688 546T688 613L687 632Q454 14 450 7Q446 1 430 1T410 7Q409 9 292 316L176 624V606Q175 588 175 543T175 463T175 356L176 86Q187 50 261 46H278V0H269Q254 3 154 3Q52 3 37 0H29V46H46Q78 48 98 56T122 69T132 86V622",925:"42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42",926:"47 509L55 676Q55 677 333 677T611 676L619 509Q619 508 599 508T579 510Q579 529 575 557T564 589Q550 594 333 594T102 589Q95 586 91 558T87 510Q87 508 67 508T47 509ZM139 260V445H179V394H487V445H527V260H487V311H179V260H139ZM50 0L42 180H62Q82 180 82 178Q82 133 89 105Q92 93 95 90T108 86Q137 83 333 83Q530 83 558 86Q568 87 571 90T577 105Q584 133 584 178Q584 180 604 180H624L616 0H50",927:"56 340Q56 423 86 494T164 610T270 680T388 705Q521 705 621 601T722 341Q722 260 693 191T617 75T510 4T388 -22T267 3T160 74T85 189T56 340ZM467 647Q426 665 388 665Q360 665 331 654T269 620T213 549T179 439Q174 411 174 354Q174 144 277 61Q327 20 385 20H389H391Q474 20 537 99Q603 188 603 354Q603 411 598 439Q577 592 467 647",928:"128 619Q121 626 117 628T101 631T58 634H25V680H724V634H691Q651 633 640 631T622 619V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V634H232V348L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V619",929:"130 622Q123 629 119 631T103 634T60 637H27V683H214Q237 683 276 683T331 684Q419 684 471 671T567 616Q624 563 624 489Q624 421 573 372T451 307Q429 302 328 301H234V181Q234 62 237 58Q245 47 304 46H337V0H326Q305 3 182 3Q47 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM507 488Q507 514 506 528T500 564T483 597T450 620T397 635Q385 637 307 637H286Q237 637 234 628Q231 624 231 483V342H302H339Q390 342 423 349T481 382Q507 411 507 488",931:"666 247Q664 244 652 126T638 4V0H351Q131 0 95 0T57 5V6Q54 12 57 17L73 36Q89 54 121 90T182 159L305 299L56 644L55 658Q55 677 60 681Q63 683 351 683H638V679Q640 674 652 564T666 447V443H626V447Q618 505 604 543T559 605Q529 626 478 631T333 637H294H189L293 494Q314 465 345 422Q400 346 400 340Q400 338 399 337L154 57Q407 57 428 58Q476 60 508 68T551 83T575 103Q595 125 608 162T624 225L626 251H666V247",932:"36 443Q37 448 46 558T55 671V677H666V671Q667 666 676 556T685 443V437H645V443Q645 445 642 478T631 544T610 593Q593 614 555 625Q534 630 478 630H451H443Q417 630 414 618Q413 616 413 339V63Q420 53 439 50T528 46H558V0H545L361 3Q186 1 177 0H164V46H194Q264 46 283 49T309 63V339V550Q309 620 304 625T271 630H244H224Q154 630 119 601Q101 585 93 554T81 486T76 443V437H36V443",933:"55 551Q55 604 91 654T194 705Q240 705 277 681T334 624T367 556T385 498L389 474L392 488Q394 501 400 521T414 566T438 615T473 659T521 692T584 705Q620 705 648 689T691 647T714 597T722 551Q722 540 719 538T699 536Q680 536 677 541Q677 542 677 544T676 548Q676 576 650 596T588 616H582Q538 616 505 582Q466 543 454 477T441 318Q441 301 441 269T442 222V61Q448 55 452 53T478 48T542 46H569V0H557Q533 3 389 3T221 0H209V46H236Q256 46 270 46T295 47T311 48T322 51T328 54T332 57T337 61V209Q337 383 333 415Q313 616 189 616Q154 616 128 597T101 548Q101 540 97 538T78 536Q63 536 59 538T55 551",934:"312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415",935:"270 0Q252 3 141 3Q46 3 31 0H23V46H40Q129 50 161 88Q165 94 244 216T324 339Q324 341 235 480T143 622Q133 631 119 634T57 637H37V683H46Q64 680 172 680Q297 680 318 683H329V637H324Q307 637 286 632T263 621Q263 618 322 525T384 431Q385 431 437 511T489 593Q490 595 490 599Q490 611 477 622T436 637H428V683H437Q455 680 566 680Q661 680 676 683H684V637H667Q585 634 551 599Q548 596 478 491Q412 388 412 387Q412 385 514 225T620 62Q628 53 642 50T695 46H726V0H717Q699 3 591 3Q466 3 445 0H434V46H440Q454 46 476 51T499 64Q499 67 463 124T390 238L353 295L350 292Q348 290 343 283T331 265T312 236T286 195Q219 88 218 84Q218 70 234 59T272 46H280V0H270",936:"340 622Q338 623 335 625T331 629T325 631T314 634T298 635T274 636T239 637H212V683H224Q248 680 389 680T554 683H566V637H539Q479 637 464 635T439 622L438 407Q438 192 439 192Q443 193 449 195T474 207T507 232T536 276T557 344Q560 365 562 417T573 493Q587 536 620 544Q627 546 671 546H715L722 540V515Q714 509 708 509Q680 505 671 476T658 392T644 307Q599 177 451 153L438 151V106L439 61Q446 54 451 52T476 48T539 46H566V0H554Q530 3 389 3T224 0H212V46H239Q259 46 273 46T298 47T314 48T325 51T331 54T335 57T340 61V151Q126 178 117 406Q115 503 69 509Q55 509 55 526Q55 541 59 543T86 546H107H120Q150 546 161 543T184 528Q198 514 204 493Q212 472 213 420T226 316T272 230Q287 216 303 207T330 194L339 192Q340 192 340 407V622",937:"55 454Q55 503 75 546T127 617T197 665T272 695T337 704H352Q396 704 404 703Q527 687 596 615T666 454Q666 392 635 330T559 200T499 83V80H543Q589 81 600 83T617 93Q622 102 629 135T636 172L637 177H677V175L660 89Q645 3 644 2V0H552H488Q461 0 456 3T451 20Q451 89 499 235T548 455Q548 512 530 555T483 622T424 656T361 668Q332 668 303 658T243 626T193 560T174 456Q174 380 222 233T270 20Q270 7 263 0H77V2Q76 3 61 89L44 175V177H84L85 172Q85 171 88 155T96 119T104 93Q109 86 120 84T178 80H222V83Q206 132 162 199T87 329T55 454",8192:"",8193:"",8194:"",8195:"",8196:"",8197:"",8198:"",8201:"",8202:"",8203:"",8204:"",8211:"0 248V285H499V248H0",8212:"0 248V285H999V248H0",8213:"0 248V285H999V248H0",8214:"133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739",8215:"0 -62V-25H499V-62H0",8216:"64 494Q64 548 86 597T131 670T160 694Q163 694 172 685T182 672Q182 669 170 656T144 625T116 573T101 501Q101 489 102 489T107 491T120 497T138 500Q163 500 180 483T198 440T181 397T139 379Q110 379 87 405T64 494",8217:"78 634Q78 659 95 676T138 694Q166 694 189 668T212 579Q212 525 190 476T146 403T118 379Q114 379 105 388T95 401Q95 404 107 417T133 448T161 500T176 572Q176 584 175 584T170 581T157 576T139 573Q114 573 96 590T78 634",8220:"128 494Q128 528 137 560T158 616T185 658T209 685T223 694T236 685T245 670Q244 668 231 654T204 622T178 571T164 501Q164 489 165 489T170 491T183 497T201 500Q226 500 244 483T262 440T245 397T202 379Q173 379 151 405T128 494ZM332 494Q332 528 341 560T362 616T389 658T413 685T427 694T439 685T449 672Q449 669 437 656T411 625T383 573T368 501Q368 489 369 489T374 491T387 497T405 500Q430 500 448 483T466 440T449 397T406 379Q377 379 355 405T332 494",8221:"34 634Q34 659 50 676T93 694Q121 694 144 668T168 579Q168 525 146 476T101 403T73 379Q69 379 60 388T50 401Q50 404 62 417T88 448T116 500T131 572Q131 584 130 584T125 581T112 576T94 573Q69 573 52 590T34 634ZM238 634Q238 659 254 676T297 694Q325 694 348 668T372 579Q372 525 350 476T305 403T277 379Q273 379 264 388T254 401Q254 404 266 417T292 448T320 500T335 572Q335 584 334 584T329 581T316 576T298 573Q273 573 256 590T238 634",8224:"182 675Q195 705 222 705Q234 705 243 700T253 691T263 675L262 655Q262 620 252 549T240 454V449Q250 451 288 461T346 472T377 461T389 431Q389 417 379 404T346 390Q327 390 288 401T243 412H240V405Q245 367 250 339T258 301T261 274T263 225Q263 124 255 -41T239 -213Q236 -216 222 -216H217Q206 -216 204 -212T200 -186Q199 -175 199 -168Q181 38 181 225Q181 265 182 280T191 327T204 405V412H201Q196 412 157 401T98 390Q76 390 66 403T55 431T65 458T98 472Q116 472 155 462T205 449Q204 452 204 460T201 490T193 547Q182 619 182 655V675",8225:"181 658Q181 705 222 705T263 658Q263 633 252 572T240 497Q240 496 241 496Q243 496 285 507T345 519Q365 519 376 508T388 478Q388 466 384 458T375 447T361 438H344Q318 438 282 448T241 459Q240 458 240 456Q240 449 251 384T263 297Q263 278 255 267T238 253T222 250T206 252T190 266T181 297Q181 323 192 383T204 458Q204 459 203 459Q198 459 162 449T101 438H84Q74 443 70 446T61 457T56 478Q56 497 67 508T99 519Q117 519 159 508T203 496Q204 496 204 499Q204 507 193 572T181 658ZM181 202Q181 249 222 249T263 202Q263 185 259 161T249 103T240 48V41H243Q248 41 287 52T346 63T377 52T389 22Q389 8 379 -5T346 -19Q327 -19 288 -8T243 3H240V-4Q243 -24 249 -58T259 -117T263 -158Q263 -177 255 -188T238 -202T222 -205T206 -203T190 -189T181 -158Q181 -141 185 -117T195 -59T204 -4V3H201Q196 3 157 -8T98 -19Q76 -19 66 -6T55 22T65 49T98 63Q117 63 156 52T201 41H204V48Q201 68 195 102T185 161T181 202",8226:"55 251Q55 328 112 386T249 444T386 388T444 249Q444 171 388 113T250 55Q170 55 113 112T55 251",8230:"78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60ZM525 60Q525 84 542 102T585 120Q609 120 627 104T646 61Q646 36 629 18T586 0T543 17T525 60ZM972 60Q972 84 989 102T1032 120Q1056 120 1074 104T1093 61Q1093 36 1076 18T1033 0T990 17T972 60",8242:"79 43Q73 43 52 49T30 61Q30 68 85 293T146 528Q161 560 198 560Q218 560 240 545T262 501Q262 496 260 486Q259 479 173 263T84 45T79 43",8245:"12 501Q12 527 31 542T63 558Q73 560 77 560Q114 560 128 528Q133 518 188 293T244 61Q244 56 223 50T195 43Q192 43 190 45T102 263T14 486Q12 496 12 501",8254:"69 544V590H430V544H69",8260:"423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750",8288:"",8289:"",8290:"",8291:"",8292:"",8407:"377 694Q377 702 382 708T397 714Q404 714 409 709Q414 705 419 690Q429 653 460 633Q471 626 471 615Q471 606 468 603T454 594Q411 572 379 531Q377 529 374 525T369 519T364 517T357 516Q350 516 344 521T337 536Q337 555 384 595H213L42 596Q29 605 29 615Q29 622 42 635H401Q377 673 377 694",8450:"684 131Q684 125 672 109T633 71T573 29T489 -5T386 -19Q330 -19 276 -3T174 46T91 134T44 261Q39 283 39 341T44 421Q66 538 143 611T341 699Q344 699 364 700T395 701Q449 698 503 677T585 655Q603 655 611 662T620 678T625 694T639 702Q650 702 657 690V481L653 474Q640 467 628 472Q624 476 618 496T595 541Q562 587 507 625T390 663H381Q337 663 299 625Q212 547 212 336Q212 249 233 179Q274 30 405 30Q533 30 641 130Q658 147 666 147Q671 147 677 143T684 131ZM250 625Q264 643 261 643Q238 635 214 620T161 579T110 510T79 414Q74 384 74 341T79 268Q89 213 113 169T164 101T217 61T260 39L277 34Q270 41 264 48Q199 111 181 254Q178 281 178 344T181 434Q200 559 250 625ZM621 565V625Q617 623 613 623Q603 619 590 619H575L588 605Q608 583 610 579L621 565",8459:"331 505Q331 519 382 574T472 629H480Q512 629 529 614T547 576Q547 555 534 532T520 504Q520 493 549 493Q590 493 623 506T668 533L681 546Q731 600 772 641T832 700T852 717Q857 717 860 711T865 697L866 690Q866 688 813 617T708 475T656 403Q682 403 714 404H771L780 416Q1004 707 1167 707Q1209 707 1225 689T1241 646Q1241 604 1209 547T1118 447Q1081 422 1034 405T952 382T888 374T857 370H852L826 334Q733 204 708 144Q691 104 691 76Q691 29 748 29Q768 31 791 48T831 83T862 122T881 146Q883 148 900 148H917Q921 143 921 140T914 127Q810 -8 723 -8Q611 -4 611 100Q611 142 631 191T676 275T721 337T742 367Q716 367 685 366H628L620 355Q618 352 558 268Q486 168 461 141Q405 79 339 34T215 -28Q188 -36 153 -36Q86 -36 58 -11T29 46Q29 82 55 120T123 158Q144 158 154 146T164 119Q164 102 143 89T100 75Q92 75 86 76T77 80T72 82Q67 82 67 60Q67 28 99 14T170 0Q214 0 272 47T419 224L505 340L518 357Q513 357 504 356T467 347T415 330T360 300T308 253Q296 238 295 237H278H274Q256 237 256 243Q256 248 263 256Q291 294 330 321T407 362T476 382T530 393T552 398Q556 402 573 423T600 454Q602 457 604 460T608 465L610 467Q565 455 532 455Q465 455 449 483Q447 487 447 498Q447 513 463 538T479 579Q479 593 463 593Q436 593 385 519Q374 504 371 502T360 499H353H349Q331 499 331 505ZM1195 634Q1195 643 1195 648T1185 662T1157 671Q1130 671 1092 644T1019 579T952 502T901 436L882 409L891 410Q900 411 913 412T934 415Q1081 439 1144 520Q1195 590 1195 634",8460:"11 -16L1 0Q7 6 25 27T57 62T91 88T128 101Q159 99 195 66L203 59L211 67Q239 95 239 133Q239 158 210 213T152 330T123 430Q123 477 173 536T269 630T320 666Q376 610 440 606H443Q457 606 466 611T519 647L542 664Q543 664 543 654V643L522 622Q434 537 403 537Q388 537 366 543T329 555T293 570T270 580L261 585L253 574Q206 517 206 475Q206 452 218 416T242 356L255 331Q256 331 270 345T324 391T421 459L437 468H453Q545 463 608 421L618 415L623 392Q644 307 644 233Q644 97 612 9Q604 -10 601 -15T581 -35Q505 -104 467 -124Q446 -133 431 -133Q414 -132 399 -126T376 -115T368 -107Q368 -106 392 -75L415 -43Q432 -67 444 -73T472 -79H474Q479 -79 484 -78T501 -69T521 -50T538 -13T551 46Q558 97 558 180Q558 232 557 245Q553 277 547 300T528 349T488 389T424 404Q344 404 276 295Q272 288 273 285Q300 216 300 168Q300 161 300 156T298 145T297 137T293 129T289 123T283 116T277 107Q212 23 178 -13L166 -26L149 -9Q108 32 81 32Q63 32 21 -7L11 -16",8461:"14 666Q14 675 26 683H344L351 679Q361 665 351 655Q344 648 317 648Q287 645 282 641Q270 637 269 623T266 497V370H511V497Q511 519 510 553Q509 615 507 626T496 641H495Q489 645 459 648Q420 648 420 665Q420 672 426 679L433 683H751Q762 676 762 666Q762 648 724 648Q684 645 677 632Q675 626 675 341Q675 57 677 52Q684 38 724 35Q762 35 762 16Q762 6 751 -1H433L426 3Q420 10 420 17Q420 35 459 35Q501 38 506 52Q511 64 511 190V323H266V190Q266 60 271 52Q276 38 317 35Q342 35 351 28Q360 17 351 3L344 -1H26Q14 5 14 16Q14 35 53 35Q94 38 99 52Q104 60 104 341T99 632Q93 645 53 648Q14 648 14 666ZM233 341V553Q233 635 239 648H131Q134 641 135 638T137 603T139 517T139 341Q139 131 138 89T132 37Q131 36 131 35H239Q233 47 233 129V341ZM639 341V489Q639 548 639 576T640 620T642 639T646 648H537L542 639Q546 625 546 341Q546 130 545 88T538 37Q537 36 537 35H646Q643 41 643 42T641 55T639 84T639 140V341",8462:"137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683",8463:"150 475Q147 475 118 466T82 457Q73 457 64 467T54 487Q54 490 55 492Q63 506 64 506Q67 512 118 526Q162 541 169 546Q173 559 175 575Q181 596 181 604Q181 613 166 617Q164 617 153 618T135 619Q119 619 114 621T109 630Q109 636 114 656T122 681Q125 685 202 688Q272 695 286 695Q304 695 304 684Q304 682 291 628L278 577L386 612Q466 635 476 635T492 627T499 607Q499 593 489 586Q485 583 373 546L262 512Q262 511 248 455T233 397T236 397T244 404Q295 441 357 441Q405 441 445 417T485 333Q485 284 449 178T412 58T426 44Q447 44 466 68Q485 87 500 130L509 152H531H543Q562 152 562 144Q562 128 546 93T494 23T415 -13Q385 -13 359 3T322 44Q318 52 318 77Q318 99 352 196T386 337Q386 386 346 386Q318 386 286 370Q267 361 245 338T211 292Q207 287 193 235T162 113T138 21Q128 7 122 4Q105 -12 83 -12Q66 -12 54 -2T42 26Q42 45 98 257L151 475H150",8464:"487 225Q398 255 398 342Q398 410 455 492Q491 545 552 582T669 636T800 673T918 712Q930 717 933 717Q939 717 942 706T946 689Q946 686 915 664T830 591T729 480Q691 429 657 351T615 260Q628 260 663 279T733 339T769 426Q769 442 767 459T764 479Q764 484 766 486Q769 488 781 493T797 498Q802 498 803 494T808 472Q813 442 813 425Q813 369 761 315Q692 246 605 224L592 220L584 209Q547 155 487 106T358 25Q270 -17 191 -17Q143 -17 101 1T59 59Q59 96 85 127T148 158Q169 158 179 146T189 119Q189 102 167 89T125 75Q116 75 109 77T101 81T97 80Q96 77 96 72Q96 50 123 36T204 21H216Q249 21 302 49T411 134Q439 161 459 187Q487 220 487 225ZM460 334Q460 308 472 290T498 268L510 263Q515 263 545 313T626 438T723 561Q751 589 775 609T808 636T817 644H816Q813 644 732 618Q681 601 645 584T585 548T549 514T518 476Q460 390 460 334",8465:"190 601Q161 601 137 587T97 553T71 512T55 477T48 463Q44 465 39 468L30 473L35 488Q73 594 106 636T199 685Q200 686 211 686Q250 686 326 652T417 617Q435 617 455 626T497 652T522 670Q532 660 532 654Q469 591 390 550L378 543L343 556Q223 601 190 601ZM378 208Q378 249 369 318T360 424Q360 430 360 439T361 451L362 462Q416 526 482 571L495 580L503 577L511 575L499 562Q442 502 442 465Q442 436 452 368T462 246Q462 169 442 128T385 56Q292 -26 195 -26Q150 -26 104 14L96 21L43 -16Q43 -15 43 -14T41 -10T38 0L48 13Q76 50 123 97L150 125Q154 131 159 131Q166 131 171 116T182 81T193 53Q199 43 216 33T261 22Q307 22 344 68Q378 113 378 208",8466:"572 704Q607 704 607 693Q607 681 590 664H588Q586 664 584 664T578 663Q504 658 434 592T363 457Q363 426 386 401Q417 371 481 361Q490 360 527 360H562Q565 363 595 404T666 494T755 596T854 682T945 717Q986 717 1010 696T1035 637Q1035 593 996 531T873 414Q809 378 753 360T674 338T651 333Q650 333 633 308T588 245T544 185Q498 126 426 78L413 68H414Q498 47 575 47Q626 47 676 74T755 139L762 148H779H783Q802 148 802 142Q802 137 795 129Q760 81 691 33T544 -16Q470 -16 366 20L341 29L331 24Q239 -17 155 -17H141Q90 -17 61 -12T23 1T14 22Q14 44 39 65T103 95Q126 101 180 101Q224 101 258 98T309 90T330 86Q332 86 353 103T389 135Q401 146 412 158T431 179T450 203T466 225T485 252T505 280L535 322H509Q391 322 340 362T289 452Q289 495 321 547T396 630Q438 665 486 684T572 704ZM978 635Q978 644 977 650T973 661T968 668T961 673T954 676T946 678T938 680Q929 680 925 677Q893 659 795 531T682 377Q683 377 711 385T755 401T801 421T856 453T906 495Q927 516 952 557T978 635ZM274 50Q274 51 258 54T216 61T166 65Q160 65 151 65T140 64Q115 58 102 48T88 31Q88 20 159 20Q191 20 219 27T261 42L274 50",8467:"345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634",8469:"20 664Q20 666 31 683H142Q256 683 258 681Q259 680 279 653T342 572T422 468L582 259V425Q582 451 582 490T583 541Q583 611 573 628T522 648Q500 648 493 654Q484 665 493 679L500 683H691Q702 676 702 666Q702 657 698 652Q688 648 680 648Q633 648 627 612Q624 601 624 294V-8Q616 -20 607 -20Q601 -20 596 -15Q593 -13 371 270L156 548L153 319Q153 284 153 234T152 167Q152 103 156 78T172 44T213 34Q236 34 242 28Q253 17 242 3L236 -1H36Q24 6 24 16Q24 34 56 34Q58 35 69 36T86 40T100 50T109 72Q111 83 111 345V603L96 619Q72 643 44 648Q20 648 20 664ZM413 419L240 648H120L136 628Q137 626 361 341T587 54L589 68Q589 78 589 121V192L413 419",8472:"300 74Q300 133 338 133Q350 133 356 126T363 109Q363 88 340 76Q340 71 342 62T358 39T393 26Q435 26 474 67T532 182T551 290Q551 325 535 349T484 373Q430 373 378 348T291 289T228 218T187 157T174 130Q254 30 265 10Q276 -15 276 -41Q276 -101 235 -158T142 -216Q112 -216 90 -195T67 -118Q67 -40 104 64L110 81Q81 118 81 174Q81 268 134 360T247 453Q252 453 255 451T258 447L259 445Q259 432 253 420Q251 416 242 416Q209 411 176 341T142 203Q142 193 143 184T146 170T149 165L158 180Q215 280 303 345T485 410Q548 410 586 368T625 255Q625 157 553 74T389 -10H383Q349 -10 325 14Q302 37 300 74ZM105 -123Q105 -134 106 -141T110 -158T122 -173T145 -178Q155 -178 160 -176Q184 -163 199 -132T214 -73Q214 -69 214 -66T213 -59T212 -53T209 -47T205 -41T199 -33T193 -25T184 -14T174 -1L165 10Q156 22 148 32L139 43Q138 43 130 15T113 -54T105 -123",8473:"16 666Q16 675 28 683H195Q334 683 370 682T437 672Q511 657 554 611T597 495Q597 343 404 309Q402 308 401 308Q381 303 319 303H261V181Q261 157 262 120Q262 60 267 50T304 36Q310 35 313 35Q352 35 352 17Q352 10 346 3L339 -1H28Q16 5 16 16Q16 35 53 35Q68 36 75 37T87 42T95 52Q98 61 98 341T95 630Q91 640 83 643T53 648Q16 648 16 666ZM235 35Q228 46 227 84Q226 129 226 337V621L230 635L237 648H128Q128 647 133 632Q136 620 136 341Q136 64 133 50L128 35H235ZM301 341H313Q339 341 354 344T389 362T417 410T426 498Q426 586 401 616T322 647Q301 647 293 643Q271 637 264 621Q261 617 261 479V341H301ZM429 350Q431 350 443 353T476 367T515 391T548 432T562 490Q562 550 524 592Q507 607 484 619Q481 621 448 635L433 639L439 621Q462 578 462 506Q462 448 454 413T437 366T428 350H429",8474:"480 -10Q480 -13 486 -24T507 -50T541 -80T588 -104T648 -114Q666 -114 688 -110T714 -106Q724 -106 728 -114T729 -130Q723 -145 663 -163T548 -181Q503 -181 463 -169T395 -139T343 -97T307 -56T284 -19L280 -3L262 1Q188 24 131 81Q57 155 37 275Q34 292 34 342T37 410Q58 528 131 601Q179 652 248 676T388 701Q485 701 562 661Q698 595 731 448Q742 410 742 341T731 235Q707 141 646 81Q616 50 575 27T493 -5L480 -10ZM568 342Q568 613 437 659L395 666Q329 666 286 626Q232 570 213 439Q210 408 210 342T213 246Q231 113 286 57Q309 37 342 23Q357 19 389 19Q420 19 437 23Q469 38 491 57Q568 134 568 342ZM174 341V354Q174 393 175 419T183 484T205 561T246 635L249 639Q246 639 224 627T193 608Q189 606 183 601T169 589T155 577Q69 491 69 344Q69 133 231 52Q247 42 247 46Q247 46 246 48Q231 69 222 85T200 141T177 239Q174 269 174 341ZM708 341Q708 410 689 467T640 556T588 606T546 630Q532 638 531 638Q530 638 531 635Q563 590 577 543Q602 472 602 341V316Q602 264 599 230T580 144T531 48Q529 44 532 45T546 52Q575 68 596 84T642 128T683 200T706 299Q708 327 708 341ZM391 -17H333Q329 -15 326 -15Q324 -15 324 -17Q324 -21 362 -68Q424 -130 506 -143Q518 -144 544 -144Q569 -144 577 -143L589 -141L575 -139Q544 -127 509 -101T453 -37L442 -19L391 -17",8475:"224 266Q185 266 156 286T127 354Q127 419 176 487T282 594Q346 642 433 679T615 717Q732 717 802 680L815 673Q824 680 840 690T860 700Q864 700 867 693T872 680L873 673Q873 668 858 659L845 651L853 642Q887 605 887 561Q887 500 840 439Q790 379 681 336Q693 312 693 292Q692 276 689 263T672 229T653 198T620 152L575 87Q557 57 557 33Q557 24 560 17T566 8L569 5Q546 5 508 25T470 76Q470 83 473 92T545 198T616 310Q616 317 615 318T612 319Q603 319 575 315H560L545 291Q492 201 429 135T277 23Q202 -17 142 -17H130Q50 -17 16 17Q-2 35 -2 57Q-2 95 24 126T88 158Q106 158 116 147T127 121Q127 110 122 102Q116 93 99 84T63 75Q58 75 53 76T47 77T45 75T44 67Q45 52 57 42T88 27T120 21T144 19Q174 19 208 36T267 76T324 134T369 189T406 239Q462 319 504 374T616 503T755 631L770 644Q767 647 753 654T697 670T602 680Q493 680 399 631T247 516Q218 485 193 440T168 359Q168 328 188 316T234 303Q255 303 273 315T304 340T343 389T390 448Q428 490 441 510T456 548Q456 557 458 559Q459 560 476 567T496 575Q505 575 505 558Q505 511 434 412Q429 406 427 403Q397 360 378 343Q342 308 300 287T224 266ZM819 564Q819 595 800 619L784 606Q729 557 692 512T605 387L591 365L610 364Q622 364 631 363T641 361Q643 361 651 363Q725 388 772 449T819 564ZM794 141Q794 123 725 63T612 3Q609 3 612 5Q612 5 615 7Q639 19 678 57T742 131L755 148H772H780Q794 148 794 141ZM588 -3Q590 0 593 0H594L593 -1Q592 -1 590 -2L588 -3",8476:"27 496Q31 569 102 627T234 685Q236 685 241 685T251 686Q287 686 318 672T367 638T399 598T418 564L423 550Q424 554 434 567T463 601T505 639T561 671T626 685Q672 685 688 659T710 572Q713 533 721 523T766 513Q781 513 787 514T794 516Q796 512 798 509T801 504T802 501T787 493Q702 461 624 401L607 389Q655 383 688 358L697 352V342Q699 330 699 297Q704 209 710 173T734 103Q751 69 765 69Q769 69 806 83L824 90V74Q823 73 759 24T693 -26Q692 -26 660 32L628 90L629 111Q631 159 631 177Q631 278 614 300Q584 340 523 340Q500 340 467 333T431 325Q429 325 429 322Q428 321 426 308T420 275T410 230T392 178T366 125L358 112L342 99Q306 70 269 38T213 -10T193 -26Q192 -26 163 0T116 26Q82 26 50 -8L42 -16L35 -8L27 0L35 10Q43 21 58 38T104 80T158 106Q179 106 218 65L235 48Q238 48 255 60T295 99T329 158Q352 231 352 359Q352 555 242 614Q210 628 187 628Q140 628 116 600T91 548Q91 522 138 464T185 382V376Q185 345 158 313T103 263L76 246Q74 244 64 253L54 260L65 267Q91 285 100 302Q111 318 111 337Q111 355 69 410T27 496ZM562 628Q504 628 443 507L435 491L436 479Q437 471 437 446Q437 396 432 351L529 389L602 426Q673 462 673 463H672Q644 470 637 483T622 553Q608 628 562 628",8477:"17 665Q17 672 28 683H221Q415 681 439 677Q461 673 481 667T516 654T544 639T566 623T584 607T597 592T607 578T614 565T618 554L621 548Q626 530 626 497Q626 447 613 419Q578 348 473 326L455 321Q462 310 473 292T517 226T578 141T637 72T686 35Q705 30 705 16Q705 7 693 -1H510Q503 6 404 159L306 310H268V183Q270 67 271 59Q274 42 291 38Q295 37 319 35Q344 35 353 28Q362 17 353 3L346 -1H28Q16 5 16 16Q16 35 55 35Q96 38 101 52Q106 60 106 341T101 632Q95 645 55 648Q17 648 17 665ZM241 35Q238 42 237 45T235 78T233 163T233 337V621L237 635L244 648H133Q136 641 137 638T139 603T141 517T141 341Q141 131 140 89T134 37Q133 36 133 35H241ZM457 496Q457 540 449 570T425 615T400 634T377 643Q374 643 339 648Q300 648 281 635Q271 628 270 610T268 481V346H284Q327 346 375 352Q421 364 439 392T457 496ZM492 537T492 496T488 427T478 389T469 371T464 361Q464 360 465 360Q469 360 497 370Q593 400 593 495Q593 592 477 630L457 637L461 626Q474 611 488 561Q492 537 492 496ZM464 243Q411 317 410 317Q404 317 401 315Q384 315 370 312H346L526 35H619L606 50Q553 109 464 243",8484:"39 -1Q29 9 29 12Q29 23 60 77T219 337L410 648H364Q261 648 210 628Q168 612 142 588T109 545T97 509T88 490Q85 489 80 489Q72 489 61 503L70 588Q72 607 75 628T79 662T81 675Q84 677 88 681Q90 683 341 683H592Q604 673 604 666Q604 662 412 348L221 37Q221 35 301 35Q406 35 446 48Q504 68 543 111T597 212Q602 239 617 239Q624 239 629 234T635 223Q635 215 621 113T604 8L597 1Q595 -1 317 -1H39ZM148 637L166 648H112V632Q111 629 110 622T108 612Q108 608 110 608T116 612T129 623T148 637ZM552 646Q552 648 504 648Q452 648 450 643Q448 639 266 343T77 37Q77 35 128 35H179L366 339L552 646ZM572 35Q581 89 581 97L561 77Q542 59 526 48L508 37L539 35H572",8486:"55 454Q55 503 75 546T127 617T197 665T272 695T337 704H352Q396 704 404 703Q527 687 596 615T666 454Q666 392 635 330T559 200T499 83V80H543Q589 81 600 83T617 93Q622 102 629 135T636 172L637 177H677V175L660 89Q645 3 644 2V0H552H488Q461 0 456 3T451 20Q451 89 499 235T548 455Q548 512 530 555T483 622T424 656T361 668Q332 668 303 658T243 626T193 560T174 456Q174 380 222 233T270 20Q270 7 263 0H77V2Q76 3 61 89L44 175V177H84L85 172Q85 171 88 155T96 119T104 93Q109 86 120 84T178 80H222V83Q206 132 162 199T87 329T55 454",8487:"126 584Q119 584 110 539T97 493Q95 490 73 490Q44 490 44 501Q44 515 62 590Q75 672 82 679Q84 684 177 684Q193 684 214 684T241 685Q265 685 271 682T277 664V648Q271 572 229 434T186 231Q186 173 203 132T247 70T302 42T360 33Q391 33 419 42T474 72T517 133T533 231Q533 297 491 437T442 648Q442 675 446 679Q448 684 542 684Q635 684 637 681Q640 678 657 594T675 501Q675 490 646 490Q624 490 622 493Q620 493 609 538T593 584Q591 585 585 585T569 586T551 588H513Q514 586 518 573T538 531T582 453Q647 340 660 277Q663 259 663 232Q663 194 657 177Q652 151 629 112T560 39Q495 -5 424 -19Q403 -22 360 -22Q318 -22 297 -19Q239 -8 193 18T120 74T80 131T62 177Q56 194 56 229Q56 281 74 328T137 453Q160 491 174 518T193 555T201 575T206 588H168Q160 587 150 587T134 586T126 584",8488:"148 590Q95 592 91 627V633L160 729H176Q169 713 169 705Q169 670 244 670Q269 670 305 672T357 675Q405 675 432 661T468 609Q469 605 469 596Q469 572 460 540Q433 463 301 372Q325 378 359 378Q431 378 472 350T519 297Q532 249 532 198Q532 115 500 40T442 -57Q335 -139 202 -139Q165 -139 125 -131L112 -129V-100Q112 -49 106 -33T75 -17Q55 -17 31 -35L22 -42L11 -26L22 -18Q94 36 151 36H160Q171 36 178 33T188 27T194 13T196 -5T197 -32Q198 -79 206 -90Q217 -107 251 -107Q336 -107 389 -33T442 155Q442 240 407 274Q362 319 285 319Q236 319 192 298Q188 298 181 309L224 372Q227 373 234 374T246 376T257 379T271 384T285 391T302 402T321 417Q384 471 384 540Q384 562 366 581T306 600Q292 600 233 595T148 590",8492:"256 262Q161 262 161 351Q161 408 203 471T289 570Q380 645 475 676T617 707L627 708Q637 708 644 708Q759 708 831 675L844 669L857 677Q892 700 896 700Q902 700 907 685Q907 683 907 681T908 678T909 676T909 673Q909 671 909 670T906 667T903 664T897 660T889 655L878 647L889 636Q928 598 928 548Q928 529 923 510T907 474T886 442T861 412T837 388T815 368T800 355Q847 323 847 270V263Q847 205 806 145Q766 82 695 37T564 -8Q527 -8 506 10T484 58Q484 85 501 117T543 172Q607 226 685 228Q695 228 698 226Q703 220 692 206Q684 194 682 193T665 191Q625 189 595 172T550 133T529 93T522 66Q522 29 576 29Q642 29 705 109Q785 211 785 270Q785 287 779 300T769 316T755 327L740 319Q682 290 634 290Q611 290 592 294H588L565 261Q559 252 544 231T522 201T504 178T481 151T455 123Q394 63 314 18T159 -28Q103 -28 67 -6T31 54Q31 88 57 123T123 158Q144 158 154 146T164 119Q164 102 142 89T100 75Q94 75 87 77T76 80L72 81Q69 78 69 65Q69 35 102 22T175 9Q184 9 198 11Q248 23 300 70T403 187T508 331T636 489T789 629L801 639Q796 642 786 647T732 661T633 670Q592 670 558 665Q481 651 409 613T286 520Q274 507 258 485T222 424T202 354Q202 299 269 299Q282 299 295 301T318 307T339 317T358 329T376 345T391 362T406 380T420 398T433 417T445 435Q496 512 496 547Q496 559 497 560T516 569Q526 574 530 574Q538 574 538 540Q538 414 427 325Q342 262 256 262ZM689 382Q708 382 753 375L765 387Q860 482 860 555Q860 594 839 610L822 592Q794 563 752 511T680 420T651 380Q655 381 660 381Q664 382 689 382ZM697 344Q692 345 681 345H675Q671 345 665 345T655 344T650 344L648 342Q646 339 645 338Q643 333 639 327H653Q670 329 676 330Q706 342 706 343Q702 344 697 344",8493:"299 585Q333 609 384 634T470 672L505 685Q506 685 513 662T531 613T548 580Q553 576 563 576Q575 576 605 585Q607 585 607 575V564Q537 532 496 527Q475 542 456 567T427 610T415 627Q410 627 398 618T382 603Q373 588 373 558T386 475T400 399Q400 337 366 303Q343 281 309 266T254 247T226 242L214 257Q214 258 223 260T251 272T287 299Q304 316 304 360Q304 396 289 451T274 532Q274 553 277 561V564H269Q205 558 172 501T139 358Q139 207 226 127T443 46Q448 46 457 46T470 47L485 48L601 106Q602 106 602 93V80Q551 48 517 25T474 -4T460 -13T443 -19Q409 -24 367 -24Q360 -24 351 -24T335 -23T326 -22Q190 -2 125 87T59 319V328Q62 412 96 487L101 500L118 512Q189 563 245 591L266 601L299 585",8496:"280 398L279 400Q278 402 277 405T275 413T272 426T271 443Q271 494 302 544T379 629T472 685T553 707H565H573Q630 707 664 689Q718 661 718 604Q718 548 662 492T553 436Q525 436 508 451T490 492Q490 534 531 579T619 630Q632 630 632 623Q632 619 624 606Q614 593 602 592T578 580Q566 568 549 541T532 497Q532 474 565 474Q577 474 587 476Q600 481 611 489Q630 503 651 535T672 596Q672 660 553 660H548Q494 660 450 616Q421 587 384 531T343 439Q341 420 344 415H345Q346 415 352 415T369 417T391 418Q421 418 440 412T466 398T473 382Q473 367 452 353T398 339Q370 339 348 345T315 359L304 366Q297 365 284 360T234 321T163 234Q120 160 120 117Q120 83 149 57T252 30Q311 30 357 60Q386 79 414 114T452 179Q454 186 454 200Q454 230 415 242Q401 246 373 246Q353 246 347 244Q328 236 313 219T288 184T274 149T265 121T261 109Q260 107 247 102T230 97Q223 97 223 105Q223 148 271 216T386 284Q446 284 483 260T520 195Q520 121 427 57T239 -8Q192 -8 152 2T79 46T46 133Q46 212 107 285T269 394L280 398ZM427 376Q427 377 402 380Q386 380 386 379L425 375L427 376",8497:"258 428Q258 489 322 562T482 685T661 735Q726 735 824 693T977 651Q990 651 990 644Q990 639 971 612T948 581Q947 580 938 580Q878 580 784 621T617 663Q544 663 480 635T379 568T320 492T299 431Q299 387 362 387Q404 387 438 402T493 438T527 486T546 531T551 563Q551 569 550 575T549 584T549 590Q551 593 563 602T579 611Q584 611 592 605T608 584T616 548Q616 513 595 477T554 423Q518 392 464 372T349 351Q258 351 258 428ZM324 187T305 187T286 196Q286 202 301 217Q327 242 383 262T484 290L527 297L567 356Q624 441 643 467T688 521Q715 550 752 581T795 613T804 603T808 587T778 547T702 444T626 300H637Q663 302 685 306L697 308L703 317Q745 376 792 400Q806 406 818 406Q849 406 849 375Q847 355 831 338T797 312T763 296L747 290Q744 289 735 266T724 241Q722 240 702 232T664 217T645 210Q638 210 638 218Q638 224 653 246T669 270Q669 271 668 271Q663 270 624 264L607 263Q570 199 529 152Q513 133 484 106T409 45T305 -13T193 -36Q109 -36 74 -10T39 50Q39 86 64 121T128 158Q171 158 171 121Q171 97 141 83Q125 75 107 75Q93 75 80 83Q76 71 76 62Q76 29 117 15T207 0Q324 0 494 248L501 258H495Q368 239 330 195Q324 187 305 187ZM775 335Q806 358 806 368Q805 369 804 369Q800 369 791 360Q774 336 775 335",8498:"457 681Q471 695 477 695Q485 695 497 681V12L484 -1H68Q55 14 55 19T68 39H457V328H215L211 335Q198 346 211 359L217 368H457V681",8499:"112 -7Q86 -7 58 6T30 48T54 103T113 130Q129 130 141 121T153 94Q153 71 132 59T90 47H80Q95 30 133 30Q180 30 228 63T311 137T402 249T500 361Q566 425 703 529T910 693Q942 721 945 721T958 716T970 709Q974 704 964 691Q961 688 905 622T847 554L595 181Q553 121 527 77T496 19L492 5Q497 5 531 46Q579 98 685 224T850 409L972 524Q994 543 1004 556Q1012 567 1097 643T1186 720Q1194 720 1206 715T1215 703Q1215 701 1191 671T1133 599T1080 530Q1036 461 983 357T862 152Q802 64 799 17Q799 7 800 5T811 2Q836 2 882 37T969 126Q972 130 974 134T978 138T983 139T996 140H1012Q1018 134 1018 132Q1018 122 981 83T889 4T795 -35Q761 -35 745 -12T728 48Q728 122 781 190Q833 269 890 370L927 434L914 422Q848 360 752 245Q643 117 582 51T498 -33T461 -50Q424 -48 424 -4Q424 84 481 172L714 495Q591 406 523 333Q507 316 430 226T313 95Q263 48 221 24T162 -4T120 -7H112",8501:"55 613Q55 643 61 663T74 688T85 694Q94 694 94 681Q98 632 134 588L412 285Q416 311 430 397T447 509V519L438 526Q407 554 398 571T388 617T394 664T407 688T418 694Q425 694 427 684Q429 675 454 635T488 586Q490 584 496 579T513 563T537 540Q555 516 555 487Q555 460 549 441T537 416T528 409Q519 409 517 415T513 435T503 463Q492 481 490 481Q454 264 454 246Q454 237 479 212T529 152T555 79Q555 32 538 9Q531 1 524 1Q516 1 516 13Q512 62 476 106Q468 115 337 258T195 412L193 406Q191 401 189 394T183 377T176 352T171 322T167 284T165 240Q165 224 166 220Q171 199 211 152T252 70Q252 45 235 29T203 8T175 1Q170 0 115 0H79Q60 0 58 3T55 20Q55 31 58 34Q60 37 76 37Q112 39 126 46T140 70Q140 96 112 148T83 236Q83 281 102 334T140 419T159 452Q55 556 55 613",8502:"56 706V726Q56 763 76 763Q83 763 87 759T98 741Q108 726 116 721L127 717L340 715Q547 712 564 709Q575 705 587 692Q599 680 605 663L609 650V137H676Q687 124 687 115Q687 110 678 100T622 43L558 -21H-9Q-22 -6 -22 -1T-13 14T42 72L107 137H569V339Q569 541 567 546Q558 555 554 557L545 563H329Q118 566 101 569Q90 573 78 586Q54 610 54 661Q54 670 56 706",8503:"56 750Q68 764 76 764Q88 764 97 743T125 717Q131 715 240 715T358 713Q421 691 421 640Q421 608 399 588T358 566Q353 566 352 565T351 557L356 526Q356 488 379 346T402 97Q400 21 385 -12Q366 -43 351 -43Q335 -43 329 -10Q316 40 316 64Q316 67 315 67Q313 67 269 26L222 -21H-9Q-22 -7 -22 -1Q-22 4 -14 14T42 73L107 137H311V564H211H164Q115 564 93 573T60 615Q56 630 56 690V750",8504:"62 757Q69 764 75 764Q87 764 97 741Q102 731 105 728T117 721L129 715H349Q569 715 580 710Q618 701 635 670Q640 661 640 639Q640 609 622 590Q617 583 604 575T580 566H573V553Q575 547 576 531T582 469T600 353Q624 205 624 104Q624 46 617 17T591 -32Q581 -43 573 -43Q550 -43 540 44Q535 73 533 319V564H322Q117 566 100 570Q90 573 77 586Q54 609 54 663Q54 689 55 706Q55 738 56 745T62 757",8513:"239 665Q194 665 154 653T90 629T66 617Q59 617 53 623T46 637Q46 652 66 659Q129 695 197 701Q218 705 248 705Q293 705 335 693Q371 684 435 644Q543 562 573 417Q577 393 577 341Q577 290 573 266Q531 83 384 10Q346 -9 315 -16T234 -23H206Q202 -23 183 -23T152 -21T120 -18T88 -10T63 3T44 24L37 35V297L50 310H235Q248 297 248 290Q248 285 235 270H77V103Q77 88 77 80T77 63T78 50T80 43T82 38T85 35T89 32T95 30Q126 20 206 17Q289 17 330 30Q407 55 460 120T533 275Q538 305 538 342Q538 486 452 575T239 665",8592:"944 261T944 250T929 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H929Q944 261 944 250",8593:"27 414Q17 414 17 433Q17 437 17 439T17 444T19 447T20 450T22 452T26 453T30 454T36 456Q80 467 120 494T180 549Q227 607 238 678Q240 694 251 694Q259 694 261 684Q261 677 265 659T284 608T320 549Q340 525 363 507T405 479T440 463T467 455T479 451Q483 447 483 433Q483 413 472 413Q467 413 458 416Q342 448 277 545L270 555V-179Q262 -193 252 -193H250H248Q236 -193 230 -179V555L223 545Q192 499 146 467T70 424T27 414",8594:"56 237T56 250T70 270H835Q719 357 692 493Q692 494 692 496T691 499Q691 511 708 511H711Q720 511 723 510T729 506T732 497T735 481T743 456Q765 389 816 336T935 261Q944 258 944 250Q944 244 939 241T915 231T877 212Q836 186 806 152T761 85T740 35T732 4Q730 -6 727 -8T711 -11Q691 -11 691 0Q691 7 696 25Q728 151 835 230H70Q56 237 56 250",8595:"473 86Q483 86 483 67Q483 63 483 61T483 56T481 53T480 50T478 48T474 47T470 46T464 44Q428 35 391 14T316 -55T264 -168Q264 -170 263 -173T262 -180T261 -184Q259 -194 251 -194Q242 -194 238 -176T221 -121T180 -49Q169 -34 155 -21T125 2T95 20T67 33T44 42T27 47L21 49Q17 53 17 67Q17 87 28 87Q33 87 42 84Q158 52 223 -45L230 -55V312Q230 391 230 482T229 591Q229 662 231 676T243 693Q244 694 251 694Q264 692 270 679V-55L277 -45Q307 1 353 33T430 76T473 86",8596:"263 479Q267 501 271 506T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H835Q729 349 696 475Q691 493 691 500Q691 511 711 511Q720 511 723 510T729 506T732 497T735 481T743 456Q765 389 816 336T935 261Q944 258 944 250Q944 244 939 241T915 231T877 212Q836 186 806 152T761 85T740 35T732 4Q730 -6 727 -8T711 -11Q691 -11 691 0Q691 7 696 25Q728 151 835 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q144 292 194 349T263 479",8597:"27 492Q17 492 17 511Q17 515 17 517T17 522T19 525T20 528T22 530T26 531T30 532T36 534Q80 545 120 572T180 627Q210 664 223 701T238 755T250 772T261 762Q261 757 264 741T282 691T319 628Q352 589 390 566T454 536L479 529Q483 525 483 511Q483 491 472 491Q467 491 458 494Q342 526 277 623L270 633V-133L277 -123Q307 -77 353 -45T430 -2T473 8Q483 8 483 -11Q483 -15 483 -17T483 -22T481 -25T480 -28T478 -30T474 -31T470 -32T464 -34Q407 -49 364 -84T300 -157T270 -223T261 -262Q259 -272 250 -272Q242 -272 239 -255T223 -201T180 -127Q169 -112 155 -99T125 -76T95 -58T67 -45T44 -36T27 -31L21 -29Q17 -25 17 -11Q17 9 28 9Q33 9 42 6Q158 -26 223 -123L230 -133V633L223 623Q192 577 146 545T70 502T27 492",8598:"204 662Q257 662 301 676T369 705T394 720Q398 720 407 711T417 697Q417 688 389 671T310 639T212 623Q176 623 153 628Q151 628 221 557T546 232Q942 -164 943 -168Q944 -170 944 -174Q944 -182 938 -188T924 -195Q922 -195 916 -193Q912 -191 517 204Q440 281 326 394T166 553L121 598Q126 589 126 541Q126 438 70 349Q59 332 52 332Q48 332 39 341T29 355Q29 358 38 372T57 407T77 464T86 545Q86 583 78 614T63 663T55 683Q55 693 65 693Q73 693 82 688Q136 662 204 662",8599:"582 697Q582 701 591 710T605 720Q607 720 630 706T697 677T795 662Q830 662 863 670T914 686T934 694Q942 694 944 685Q944 680 936 663T921 615T913 545Q913 490 927 446T956 379T970 355Q970 351 961 342T947 332Q940 332 929 349Q874 436 874 541Q874 590 878 598L832 553Q787 508 673 395T482 204Q87 -191 83 -193Q77 -195 75 -195Q67 -195 61 -189T55 -174Q55 -170 56 -168Q58 -164 453 232Q707 487 777 557T847 628Q824 623 787 623Q689 623 599 679Q582 690 582 697",8600:"55 675Q55 683 60 689T75 695Q77 695 83 693Q87 691 482 296Q532 246 605 174T717 62T799 -20T859 -80T878 -97Q874 -93 874 -41Q874 64 929 151Q940 168 947 168Q951 168 960 159T970 145Q970 143 956 121T928 54T913 -45Q913 -83 920 -114T936 -163T944 -185Q942 -194 934 -194Q932 -194 914 -186T864 -170T795 -162Q743 -162 698 -176T630 -205T605 -220Q601 -220 592 -211T582 -197Q582 -187 611 -170T691 -138T787 -123Q824 -123 847 -128Q848 -128 778 -57T453 268Q58 664 56 668Q55 670 55 675",8601:"126 -41Q126 -92 121 -97Q121 -98 139 -80T200 -20T281 61T394 173T517 296Q909 690 916 693Q922 695 924 695Q932 695 938 689T944 674Q944 670 943 668Q942 664 546 268Q292 13 222 -57T153 -128Q176 -123 212 -123Q310 -123 400 -179Q417 -190 417 -197Q417 -201 408 -210T394 -220Q392 -220 369 -206T302 -177T204 -162Q131 -162 67 -194Q63 -195 59 -192T55 -183Q55 -180 62 -163T78 -115T86 -45Q86 10 72 54T44 120T29 145Q29 149 38 158T52 168Q59 168 70 151Q126 62 126 -41",8602:"942 250Q942 244 928 230H511L457 148Q440 124 420 93Q404 68 400 64T389 60Q381 60 375 66T368 81Q368 88 415 159L462 230H175L188 214Q210 188 235 145T264 85Q264 75 260 74T231 72L206 74L191 103Q169 142 164 150Q130 195 64 239Q56 244 56 250T64 261Q115 294 142 323T191 397L206 428H231Q255 428 259 426T264 414Q260 397 235 355T188 288L175 272L331 270Q488 270 491 272Q491 275 542 352T597 432Q602 437 609 437Q617 437 622 432T628 417T582 341L537 272L735 270H931Q942 257 942 250",8603:"54 250Q54 258 66 270H277L488 272L542 350Q596 431 602 435Q604 437 609 437Q617 437 622 432T628 417T582 341L537 272L608 270H751L822 272L808 288Q786 313 761 355T733 414Q733 424 737 426T766 428H793L806 397Q829 354 864 314Q896 284 928 263Q942 257 942 250T928 237Q887 208 864 185Q829 147 806 103L793 74L766 72Q742 72 738 73T733 85Q735 102 756 137T797 198L817 225L822 230H511L457 148Q440 124 420 93Q404 68 400 64T389 60Q381 60 375 66T368 81Q368 88 415 159L462 230H264L66 232Q54 239 54 250",8606:"56 250Q103 277 142 322T199 417H221Q244 417 244 416Q244 414 237 397T208 344T158 278L151 270H276L285 277Q322 306 349 345T388 417H434Q434 413 424 392T393 338T349 279L340 270H634Q933 270 937 266L938 265Q944 259 944 250T938 235L937 234Q933 230 634 230H340L349 221Q372 196 393 163T424 108T434 83H388Q377 116 350 155T285 223L276 230H151L158 222Q186 191 207 156T236 104T244 84Q244 83 221 83H199Q181 133 142 178T56 250",8608:"943 250Q895 221 856 177T801 83H778Q755 83 755 84Q755 86 762 103T791 156T841 222L848 230H723L714 223Q677 194 650 155T611 83H565Q565 87 575 108T606 162T650 221L659 230H365Q66 230 62 234L61 235Q55 241 55 250T61 265L62 266Q66 270 365 270H659L650 279Q627 304 606 337T575 392T565 417H611Q622 384 649 345T714 277L723 270H848L841 278Q813 309 792 344T763 396T755 416Q755 417 778 417H801Q817 367 856 323T943 250",8610:"56 250Q103 277 142 322T199 417H221Q244 417 244 416Q244 414 237 397T208 344T158 278L151 270H873L882 277Q919 306 946 345T985 417H1031Q1031 413 1021 392T990 338T946 279L937 270V230L946 221Q969 196 990 163T1021 108T1031 83H985Q974 116 947 155T882 223L873 230H151L158 222Q186 191 207 156T236 104T244 84Q244 83 221 83H199Q181 133 142 178T56 250",8611:"1054 250Q1006 221 967 177T912 83H889Q866 83 866 84Q866 86 873 103T902 156T952 222L959 230H237L228 223Q191 194 164 155T125 83H79Q79 87 89 108T120 162T164 221L173 230V270L164 279Q141 304 120 337T89 392T79 417H125Q136 384 163 345T228 277L237 270H959L952 278Q924 309 903 344T874 396T866 416Q866 417 889 417H912Q928 367 967 323T1054 250",8614:"95 155V109Q95 83 92 73T75 63Q61 63 58 74T54 130Q54 140 54 180T55 250Q55 421 57 425Q61 437 75 437Q88 437 91 428T95 393V345V270H835Q719 357 692 493Q692 494 692 496T691 499Q691 511 708 511H711Q720 511 723 510T729 506T732 497T735 481T743 456Q765 389 816 336T935 261Q944 258 944 250Q944 244 939 241T915 231T877 212Q836 186 806 152T761 85T740 35T732 4Q730 -6 727 -8T711 -11Q691 -11 691 0Q691 7 696 25Q728 151 835 230H95V155",8617:"903 424T903 444T929 464Q976 464 1023 434T1070 347Q1070 316 1055 292T1016 256T971 237T929 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H926Q929 270 941 271T960 275T978 280T998 290T1015 307Q1030 325 1030 347Q1030 355 1027 364T1014 387T983 411T929 424H928Q903 424 903 444",8618:"55 347Q55 380 72 404T113 441T159 458T197 464Q222 464 222 444Q222 429 204 426T157 417T110 387Q95 369 95 347Q95 339 98 330T111 307T142 283T196 270H961Q845 357 818 493Q818 494 818 496T817 499Q817 511 834 511H837Q846 511 849 510T855 506T858 497T861 481T869 456Q891 389 942 336T1061 261Q1070 258 1070 250Q1070 244 1065 241T1041 231T1003 212Q962 186 932 152T887 85T866 35T858 4Q856 -6 853 -8T837 -11Q817 -11 817 0Q817 7 822 25Q854 151 961 230H196Q149 230 102 260T55 347",8619:"56 250Q103 277 142 322T199 417H221Q244 417 244 416Q244 414 237 397T208 344T158 278L151 270H622V305Q622 356 624 388T635 460T661 521T709 559T785 575Q813 575 833 573T880 561T923 534T952 483T964 405Q964 374 959 350T942 307T918 276T884 255T847 242T804 235T760 231T713 230H662V-27Q654 -41 644 -41H642H640Q628 -41 622 -27V230H151L158 222Q186 191 207 156T236 104T244 84Q244 83 221 83H199Q181 133 142 178T56 250ZM924 403Q924 474 894 505T794 536Q758 536 734 526T696 500T675 453T665 395T662 319V270H699Q826 270 875 295T924 403",8620:"35 405Q35 454 48 489T86 542T137 567T195 575Q229 575 251 571T301 554T345 510T370 429Q377 384 377 305V270H848L841 278Q813 309 792 344T763 396T755 416Q755 417 778 417H801Q817 367 856 323T943 250Q896 221 857 177T801 83H778Q755 83 755 84Q755 86 762 103T791 156T841 222L848 230H377V-27Q369 -41 359 -41H357Q342 -41 337 -25V230H286Q247 231 225 232T169 238T115 255T75 284T45 333T35 405ZM75 406Q75 322 123 296T300 270H337V319Q335 432 317 477T240 534Q232 535 197 535Q140 535 108 507T75 406",8621:"57 250Q159 311 200 417H246L242 407Q215 340 159 278L152 270H276L315 310Q354 349 358 351Q366 356 376 351Q378 350 455 273L530 196L606 273Q683 350 686 351Q694 354 703 351Q705 350 782 273L858 196L933 273Q1010 350 1012 351Q1022 356 1030 351Q1034 349 1073 310L1112 270H1236L1229 278Q1173 340 1146 407L1142 417H1188Q1233 306 1331 250Q1231 192 1188 83H1142L1146 93Q1173 160 1229 222L1236 230H1168Q1155 230 1139 230T1119 229Q1112 229 1108 229T1099 231T1092 233T1085 238T1078 245T1068 256T1056 269L1021 304L984 267Q948 230 910 191T867 149Q857 144 848 150Q844 151 770 227T694 304T618 228T540 150Q531 144 521 149Q517 152 479 191T404 267L367 304L332 269Q328 264 320 256T310 246T303 239T296 234T289 231T280 229T269 229Q265 229 249 229T220 230H152L159 222Q215 160 242 93L246 83H223L200 84L195 96Q152 190 57 250",8622:"491 272Q491 275 542 352T597 432Q602 437 609 437Q617 437 622 432T628 417T582 341L537 272L608 270H751L822 272L808 288Q786 313 761 355T733 414Q733 424 737 426T766 428H793L806 397Q829 354 864 314Q896 284 928 263Q942 257 942 250T928 237Q887 208 864 185Q829 147 806 103L793 74L766 72Q742 72 738 73T733 85Q735 102 756 137T797 198L817 225L822 230H511L457 148Q440 124 420 93Q404 68 400 64T389 60Q381 60 375 66T368 81Q368 88 415 159L462 230H175L188 214Q210 188 235 145T264 85Q264 75 260 74T231 72L206 74L191 103Q169 142 164 150Q130 195 64 239Q56 244 56 250T64 261Q115 294 142 323T191 397L206 428H231Q255 428 259 426T264 414Q260 397 235 355T188 288L175 272L331 270Q488 270 491 272",8624:"56 555Q74 567 79 570T107 592T141 625T170 667T198 722H221Q244 722 244 721Q244 718 236 699T207 647T161 587L151 576L291 575H292H293H294H296H297H298H299H300H301H302H304H305H306H307H308H309H310H311H312H314H315H316H317H318H319H320H321H322H323H324H325H327H328H329H330H331H332H333H334H335H336H337H338H339H340H341H342H343H345Q435 574 438 570L439 569L440 568Q444 564 444 287Q444 15 442 12Q436 0 424 0T406 12Q404 15 404 275V535H151L162 523Q187 495 207 462T236 410T244 389H198L193 402Q171 457 131 497T56 555",8625:"301 722Q339 618 443 555L437 551Q431 547 422 541T401 526T377 504T352 477T327 443T306 402L301 389H255Q255 392 263 410T291 461T337 523L348 535H95V275Q95 15 93 12Q87 0 75 0T57 12Q55 15 55 287Q55 564 59 568L60 569Q64 573 76 573T208 575L348 576L338 587Q314 613 294 646T264 698T255 721Q255 722 278 722H301",8630:"361 210Q373 210 373 182V177Q373 155 370 151T348 139Q303 118 267 84T216 28T201 1Q197 -1 196 -1Q189 -1 184 8Q166 39 143 64T99 104T61 129T32 144T19 150Q17 152 17 179Q17 203 21 208Q28 210 39 206Q106 178 157 135L175 119V126Q179 130 179 155Q182 173 193 201Q228 305 312 374T510 459Q532 461 551 461H567Q678 461 784 386Q835 344 861 301Q902 245 926 173T950 32Q950 15 944 8Q930 -6 917 8Q910 12 910 43Q901 208 801 314T561 421Q453 421 359 359Q300 319 263 258T217 126L216 125Q216 124 216 123T217 122Q219 122 229 131T260 156T301 181Q314 189 336 199T361 210",8631:"972 209Q980 209 981 204T982 179Q982 155 979 151T957 139Q915 121 878 86T815 8Q808 -1 803 -1Q801 -1 797 1Q797 6 783 28T732 84T650 139L628 150Q626 152 626 177Q626 201 630 206Q636 210 637 210Q650 210 697 181Q727 166 764 137L784 119L782 132Q767 239 689 318T499 417Q474 421 442 421Q343 421 261 369T130 219Q86 121 86 28Q86 15 79 8Q73 1 66 1T53 8Q46 15 46 30Q46 102 77 192T186 361Q274 443 386 459Q396 460 426 460Q515 460 588 431T703 361T773 271T812 187T822 132Q822 123 825 123Q936 209 972 209",8634:"369 543T369 563T397 583Q408 583 440 579L454 577L464 581Q492 592 516 609T552 638T565 650Q604 638 607 637Q606 636 598 628T585 614T570 601T548 584T523 568L510 560L516 558Q522 555 527 553T541 546T559 536T580 523T603 506T626 485Q722 384 722 250Q722 106 622 12T387 -83Q253 -83 155 12T56 250Q56 357 110 433T235 545Q244 550 252 550Q270 550 270 531Q270 522 261 515T238 501T202 477T159 433Q95 352 95 250Q95 131 178 45T388 -42Q511 -42 596 43T682 250Q682 340 636 408T522 511Q495 526 488 526Q488 525 488 525T487 522T485 515L490 506Q505 481 516 451T531 404T535 384L532 385Q529 386 524 387T513 390L491 397L488 408Q472 483 413 542L399 543Q369 543 369 563",8635:"170 637L213 650Q270 597 313 581L323 577L337 579Q369 583 380 583Q408 583 408 563T380 543H378L364 542Q305 483 289 408L286 397L264 390Q259 389 254 388T245 385L242 384Q242 387 246 403T261 450T287 506L292 515Q291 519 291 521T290 524T289 526Q284 526 265 517T216 486T160 434T114 354T95 249Q95 132 178 45T388 -42Q513 -42 597 44T682 250Q682 337 638 404T532 506Q529 508 525 510T519 514T515 516T511 519T509 522T508 526T507 531Q507 550 525 550Q533 550 542 545Q569 532 596 511T653 454T702 366T721 250Q721 151 672 74T547 -43T388 -83Q254 -83 155 12T56 250Q56 385 151 485Q164 498 179 509T205 528T228 542T247 551T260 558L267 560L254 568Q215 590 170 637",8636:"62 230Q56 236 55 244Q55 252 57 255T69 265Q114 292 151 326T208 391T243 448T265 491T273 509Q276 511 288 511Q304 511 306 505Q309 501 303 484Q293 456 279 430T251 383T223 344T196 313T173 291T156 276L148 270H929Q944 261 944 250T929 230H62",8637:"55 256Q56 264 62 270H929Q944 261 944 250T929 230H148Q149 229 165 215T196 185T231 145T270 87T303 16Q309 -1 306 -5Q304 -11 288 -11Q279 -11 276 -10T269 -4T264 10T253 36T231 75Q172 173 69 235Q59 242 57 245T55 256",8638:"188 258V694H208L215 682Q246 628 293 594T375 551V528Q375 505 374 505Q369 505 351 510T299 534T237 578L228 587V205Q228 -178 226 -182Q221 -194 208 -194T190 -182Q188 -178 188 258",8639:"41 551Q76 559 123 592T201 682L208 694H228V258Q228 -178 226 -182Q221 -194 208 -194T190 -182Q188 -178 188 205V587L179 578Q151 552 117 534T65 511T42 505Q41 505 41 528V551",8640:"691 500Q691 511 711 511Q720 511 723 510T730 504T735 490T746 464T768 425Q796 378 835 339T897 285T933 263Q941 258 942 256T944 245T937 230H70Q56 237 56 250T70 270H852Q802 308 762 364T707 455T691 500",8641:"56 237T56 250T70 270H937Q944 263 944 256Q944 251 944 250T943 246T940 242T933 238Q794 153 734 7Q729 -7 726 -9T711 -11Q695 -11 693 -5Q690 -1 696 16Q721 84 763 139T852 230H70Q56 237 56 250",8642:"190 682Q195 694 208 694T226 683Q228 679 228 296V-87L237 -78Q265 -52 299 -34T351 -11T374 -5Q375 -5 375 -28V-51Q340 -60 293 -92T215 -182L208 -194H188V242Q188 678 190 682",8643:"188 295V573Q188 657 189 672T200 692Q206 694 208 694Q221 694 226 683Q228 679 228 242V-194H208L201 -182Q170 -128 123 -94T41 -51V-28Q41 -5 42 -5Q47 -5 65 -10T117 -34T179 -78L188 -87V295",8644:"943 500Q895 471 856 427T801 333H778Q755 333 755 334Q755 336 762 353T791 406T841 472L848 480H459Q70 480 67 482Q55 488 55 500T67 518Q70 520 459 520H848L841 528Q813 559 792 594T763 646T755 666Q755 667 778 667H801Q817 617 856 573T943 500ZM56 167Q102 194 141 238T198 333H221Q244 333 244 332Q221 265 161 198L151 187H539Q928 187 930 186Q944 182 944 167Q944 155 934 149Q930 147 541 147H151L160 137Q185 110 205 77T235 24T244 1Q244 0 221 0H199Q158 106 56 167",8646:"56 500Q103 527 142 572T199 667H221Q244 667 244 666Q244 664 237 647T208 594T158 528L151 520H539Q928 520 932 518Q944 513 944 500T932 482Q928 480 539 480H151L158 472Q186 441 207 406T236 354T244 334Q244 333 221 333H199Q181 383 142 428T56 500ZM943 167Q835 101 801 0H778Q755 0 755 1T758 9T765 25T771 39Q800 94 839 137L848 147H458Q68 147 66 149Q55 154 55 167Q55 182 69 186Q71 187 460 187H848L838 198Q811 228 791 261T762 314L755 332Q755 333 778 333H801Q841 227 943 167",8647:"930 437Q944 426 944 416T934 399Q930 397 540 397H150L159 387Q185 360 205 328T234 277T243 252Q243 237 217 191T159 113L150 103H540Q930 103 934 101Q944 94 944 84Q944 71 930 64L540 63H151Q180 34 203 -2T236 -61L244 -83H198Q178 -31 142 11T66 77L55 83L65 89Q157 145 197 246Q199 250 190 269Q150 359 65 411L55 417L66 423Q106 447 142 489T198 583H244Q202 488 151 437H930",8648:"83 551Q190 590 250 694Q251 689 263 671T307 621T380 567Q409 551 416 551Q422 551 447 563T511 608T577 684L582 694Q642 591 749 551V528Q749 505 748 505Q745 505 724 515T669 546T612 590L602 599V-181Q595 -193 585 -193H582H581Q568 -193 565 -183L563 -179L562 209V598L552 589Q517 556 473 531T414 506H412Q411 506 393 514T361 530T324 553T280 589L270 598V-179Q255 -192 250 -193H247Q237 -193 230 -181V599L220 590Q197 567 164 546T110 515T84 505Q83 505 83 528V551",8649:"55 416Q55 427 70 437H848Q819 466 796 502T764 561L755 583H801Q821 531 857 489T933 423L944 417L934 411Q843 355 802 254Q800 250 809 231Q849 141 934 89L944 83L933 77Q893 53 857 11T801 -83H755Q797 12 848 63H459L70 64Q55 70 55 84Q55 94 65 101Q69 103 459 103H849L840 113Q806 148 779 196T756 254Q756 255 760 264T770 286T786 315T809 351T840 387L849 397H459Q69 397 65 399Q55 406 55 416",8650:"230 681Q240 694 251 694Q260 693 270 680V-98L280 -89Q297 -73 314 -60T348 -38T374 -24T397 -13T412 -6H414Q428 -6 473 -32T552 -89L562 -98V291L563 680Q570 693 582 693Q593 694 602 681V-99L612 -90Q635 -68 668 -47T723 -15T748 -5Q749 -5 749 -28V-51Q642 -91 582 -194L577 -184Q551 -141 512 -108T447 -63T416 -51T385 -63T321 -108T255 -184L250 -194Q189 -89 83 -51V-28Q83 -5 84 -5Q88 -5 109 -15T164 -46T220 -90L230 -99V681",8651:"195 504L198 514H221Q244 514 244 512Q244 508 239 490T215 437T171 376L162 367H545Q928 367 932 365Q944 360 944 347T932 329Q928 327 492 327H55V347L67 354Q113 379 146 420T195 504ZM67 171Q70 173 507 173H944V153L932 146Q839 95 804 -4L801 -14H778Q755 -14 755 -12Q768 59 828 124L837 133H454Q71 133 67 135Q55 140 55 153Q55 165 67 171",8652:"691 660Q691 671 711 671Q720 671 723 670T730 664T735 650T746 624T768 585Q797 538 836 499T897 445T933 423Q941 418 942 416T944 405T937 390H70Q56 397 56 410T70 430H852Q802 468 762 524T707 615T691 660ZM55 256Q56 264 62 270H929Q944 261 944 250T929 230H148Q149 229 165 215T196 185T231 145T270 87T303 16Q309 -1 306 -5Q304 -11 288 -11Q279 -11 276 -10T269 -4T264 10T253 36T231 75Q172 173 69 235Q59 242 57 245T55 256",8653:"397 525Q410 525 414 524T418 516Q418 506 394 467T331 381L319 367H473L624 369L657 445Q674 487 684 507T699 531T709 534Q717 534 722 528T728 516Q728 510 695 434Q689 418 683 402T672 377T668 367H928Q942 355 942 347Q942 341 928 327H791Q651 327 651 325Q649 324 620 251T586 174Q586 172 757 172H928Q942 158 942 152Q942 143 928 132H568L537 54Q510 -9 503 -22T486 -35Q479 -35 473 -29T466 -17T495 61L526 132H319L331 118Q364 81 391 37T418 -17Q418 -23 415 -24T401 -26Q398 -26 397 -26L384 -24L377 -13Q344 49 301 97T218 170T143 210T84 233T55 245Q54 253 59 256T86 267Q281 327 377 512L384 525H397ZM606 325Q606 327 439 327H275Q258 312 179 265L148 249Q228 206 262 181L275 172H544L575 247L606 325",8654:"395 -24T395 -19T417 57T440 132H255L266 116Q308 64 340 -6Q342 -17 337 -21Q335 -26 320 -26T302 -19Q302 -15 294 4T265 54T217 117T145 182T49 236Q30 243 33 254Q40 261 49 263Q98 283 142 315T214 379T263 442T293 493T302 519Q305 525 320 525T337 521Q342 516 340 505Q308 435 266 383L255 370L384 367H515Q561 522 569 530Q574 534 580 534Q587 534 594 528T602 516Q602 512 580 441T557 367H651L742 370L731 383Q689 435 657 505Q655 516 660 521Q662 525 677 525T695 519Q695 515 703 496T732 446T780 383T853 317T949 263Q967 258 964 245Q959 240 949 236Q897 215 852 182T779 116T731 52T703 3T695 -19Q692 -26 677 -26T660 -21Q655 -17 657 -6Q670 21 682 42T702 77T717 99T728 114T735 122T739 126T740 130T613 132H482L460 54Q440 -9 433 -23T415 -37Q408 -37 402 -31ZM502 325Q502 327 360 327H217L195 310Q173 291 120 256L111 250Q114 248 143 229T195 190L217 172H335L453 174L502 325ZM886 250Q885 251 865 263T831 286T802 310L780 327H544L535 299Q531 283 511 223L495 174L637 172H780L802 190Q843 225 877 243L886 250",8655:"346 174Q348 176 378 249T411 325Q411 327 239 327H68Q55 342 55 347Q55 354 68 367H428L459 445Q487 509 494 521T510 534Q517 534 524 527T531 516Q531 515 502 438L471 367H677L666 381Q631 421 605 463T578 516Q578 522 582 523T599 525H615L619 512Q659 437 714 383T812 309T896 272T942 254Q943 246 938 243T911 232Q718 172 619 -13L615 -24L599 -26Q578 -26 578 -17Q578 -11 587 6T617 53T666 118L677 132H373L339 54Q323 12 313 -8T298 -32T288 -35Q280 -35 275 -29T269 -17Q269 -14 298 57T328 132H68Q55 145 55 152Q55 156 56 158T62 165T68 172H206Q346 172 346 174ZM848 249Q763 297 735 318L722 327H455L422 252L391 174Q391 172 557 172H722L735 181Q773 210 819 234L848 249",8656:"944 153Q944 140 929 133H318L328 123Q379 69 414 0Q419 -13 419 -17Q419 -24 399 -24Q388 -24 385 -23T377 -12Q332 77 253 144T72 237Q62 240 59 242T56 250T59 257T70 262T89 268T119 278T160 296Q303 366 377 512Q382 522 385 523T401 525Q419 524 419 515Q419 510 414 500Q379 431 328 377L318 367H929Q944 359 944 347Q944 336 930 328L602 327H274L264 319Q225 289 147 250Q148 249 165 241T210 217T264 181L274 173H930Q931 172 933 171T936 169T938 167T941 164T942 162T943 158T944 153",8657:"228 -179Q227 -180 226 -182T223 -186T221 -189T218 -192T214 -193T208 -194Q196 -194 189 -181L188 125V430L176 419Q122 369 59 338Q46 330 40 330Q38 330 31 337V350Q31 362 33 365T46 374Q60 381 77 390T128 426T190 484T247 567T292 677Q295 688 298 692Q302 694 305 694Q313 694 318 677Q334 619 363 568T420 485T481 427T532 391T564 374Q575 368 577 365T579 350V337Q572 330 570 330Q564 330 551 338Q487 370 435 419L423 430L422 125V-181Q409 -194 401 -194Q397 -194 394 -193T388 -189T385 -184T382 -180V-177V475L373 487Q331 541 305 602Q304 601 300 591T290 571T278 548T260 519T238 488L229 476L228 148V-179",8658:"580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514",8659:"401 694Q412 694 422 681V375L423 70L435 81Q487 130 551 162Q564 170 570 170Q572 170 579 163V150Q579 138 577 135T564 126Q541 114 518 99T453 48T374 -46T318 -177Q313 -194 305 -194T293 -178T272 -119T225 -31Q158 70 46 126Q35 132 33 135T31 150V163Q38 170 40 170Q46 170 59 162Q122 131 176 81L188 70V375L189 681Q199 694 208 694Q219 694 228 680V352L229 25L238 12Q279 -42 305 -102Q344 -23 373 13L382 25V678Q387 692 401 694",8660:"308 524Q318 526 323 526Q340 526 340 514Q340 507 336 499Q326 476 314 454T292 417T274 391T260 374L255 368Q255 367 500 367Q744 367 744 368L739 374Q734 379 726 390T707 416T685 453T663 499Q658 511 658 515Q658 525 680 525Q687 524 690 523T695 519T701 507Q766 359 902 287Q921 276 939 269T961 259T966 250Q966 246 965 244T960 240T949 236T930 228T902 213Q763 137 701 -7Q697 -16 695 -19T690 -23T680 -25Q658 -25 658 -15Q658 -11 663 1Q673 24 685 46T707 83T725 109T739 126L744 132Q744 133 500 133Q255 133 255 132L260 126Q265 121 273 110T292 84T314 47T336 1Q341 -11 341 -15Q341 -25 319 -25Q312 -24 309 -23T304 -19T298 -7Q233 141 97 213Q83 221 70 227T51 235T41 239T35 243T34 250T35 256T40 261T51 265T70 273T97 287Q235 363 299 509Q305 522 308 524ZM792 319L783 327H216Q183 294 120 256L110 250L120 244Q173 212 207 181L216 173H783L792 181Q826 212 879 244L889 250L879 256Q826 288 792 319",8661:"290 755Q298 772 305 772T318 757T343 706T393 633Q431 588 473 558T545 515T579 497V484Q579 464 570 464Q564 464 550 470Q485 497 423 550L422 400V100L423 -50Q485 3 550 30Q565 36 570 36Q579 36 579 16V3Q575 -1 549 -12T480 -53T393 -132Q361 -172 342 -208T318 -258T305 -272T293 -258T268 -208T217 -132Q170 -80 128 -51T61 -12T31 3V16Q31 36 40 36Q46 36 61 30Q86 19 109 6T146 -18T173 -38T188 -50V550Q186 549 173 539T147 519T110 495T61 470Q46 464 40 464Q31 464 31 484V497Q34 500 63 513T135 557T217 633Q267 692 290 755ZM374 598Q363 610 351 625T332 651T316 676T305 695L294 676Q282 657 267 636T236 598L228 589V-89L236 -98Q247 -110 259 -125T278 -151T294 -176T305 -195L316 -176Q328 -157 343 -136T374 -98L382 -89V589L374 598",8666:"944 54Q942 44 929 36H372Q372 34 377 26T395 -4T422 -58Q442 -109 442 -110T408 -111H374L370 -100Q282 124 87 243L76 250L87 257Q284 377 370 600L374 611H408Q442 611 442 610Q423 550 381 480Q380 478 379 475T376 471T374 468T372 465V464H929Q942 456 944 446Q944 442 943 439T941 434T938 430T935 428T931 426T928 424H344L336 414Q277 336 200 277L191 270H560Q929 270 933 268Q944 262 944 250Q944 237 933 232Q929 230 560 230H191L200 223Q279 162 336 86L344 76H928Q929 76 931 75T934 73T938 70T941 66T943 61T944 54",8667:"56 250Q56 260 68 270H808L799 277Q720 338 663 414L655 424H363Q71 424 68 426Q55 432 55 444T68 462Q71 464 349 464H627Q627 466 622 474T604 504T577 558Q557 609 557 610T591 611H626L629 600Q717 376 912 257L923 250L912 243Q715 123 629 -100L626 -111H591Q557 -111 557 -110Q576 -50 618 20Q619 22 620 25T623 29T625 32T626 35L627 36H349Q71 36 68 38Q55 44 55 56T68 74Q71 76 363 76H655L663 86Q722 164 799 223L808 230H438L68 231Q56 236 56 250",8669:"76 230Q68 230 62 237T56 250Q56 257 63 264T91 291Q102 300 108 306L159 351Q168 356 177 351L218 316L303 239L353 195Q376 214 403 239L488 316L529 351Q538 356 546 351Q548 350 594 310L638 270H848L841 278Q813 309 792 344T763 396T755 416Q755 417 778 417H801Q817 367 856 323T943 250Q895 221 856 177T801 83H778Q755 83 755 84Q755 86 762 103T791 156T841 222L848 230H737Q625 230 622 232Q620 233 599 251T558 288L537 306Q537 305 451 228T362 149Q353 146 345 149Q341 150 255 227T169 306Q167 306 129 270Q123 265 115 257T102 245T93 237T84 232T76 230",8672:"292 419Q292 400 261 347T211 275H306H364Q400 275 411 271T422 250T411 230T366 225H306H211Q214 222 232 197T271 136T292 82Q292 71 285 68T262 64H250H241Q221 64 216 67T205 83Q186 127 153 167T78 230Q64 238 64 250Q64 258 69 263T82 272T106 288T139 318Q162 342 177 365T198 402T209 425T223 436Q224 437 252 437H258Q292 437 292 419ZM501 237T501 250T515 270H819Q834 262 834 250T819 230H515Q501 237 501 250ZM918 237T918 250T932 270H1236Q1251 262 1251 250T1236 230H932Q918 237 918 250",8674:"84 237T84 250T98 270H402Q417 262 417 250T402 230H98Q84 237 84 250ZM501 237T501 250T515 270H819Q834 262 834 250T819 230H515Q501 237 501 250ZM1022 417Q1022 437 1055 437H1067Q1090 437 1097 434T1109 417Q1128 373 1161 333T1236 270Q1251 261 1251 250Q1251 241 1244 236T1216 217T1175 182Q1149 155 1133 128T1109 85T1097 66Q1093 64 1065 64H1053Q1031 64 1025 72T1027 100Q1036 124 1049 147T1073 185T1091 210T1101 223L1103 225H1008H950Q914 225 903 229T892 250T903 270T948 275H1008H1103L1101 277Q1100 280 1091 291T1067 325T1039 374Q1022 408 1022 417",8704:"0 673Q0 684 7 689T20 694Q32 694 38 680T82 567L126 451H430L473 566Q483 593 494 622T512 668T519 685Q524 694 538 694Q556 692 556 674Q556 670 426 329T293 -15Q288 -22 278 -22T263 -15Q260 -11 131 328T0 673ZM414 410Q414 411 278 411T142 410L278 55L414 410",8705:"404 269Q412 269 418 267T428 261T435 253T441 245L444 240V172Q444 103 443 96Q440 81 431 65T403 27T344 -7T250 -21T156 -8T97 27T69 65T58 96Q56 103 56 413Q56 722 58 729Q74 822 215 845Q221 846 229 846H243Q282 846 290 845Q422 826 443 729Q444 722 444 653V586L442 583Q441 580 440 578T436 573T430 567T423 562T415 558T404 556Q377 556 367 583Q364 590 364 654V719Q363 721 360 726T355 733Q326 766 250 766H249Q235 766 219 765T174 752T137 719V107Q145 83 178 71T251 58H254Q340 58 364 107V172Q364 176 364 187T363 204Q363 269 404 269",8706:"202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306",8707:"56 661T56 674T70 694H487Q497 686 500 679V15Q497 10 487 1L279 0H70Q56 7 56 20T70 40H460V327H84Q70 334 70 347T84 367H460V654H70Q56 661 56 674",8709:"331 696Q335 708 339 722T345 744T350 759T357 769T367 772Q374 772 381 767T388 754Q388 746 377 712L366 673L378 661Q460 575 460 344Q460 281 456 234T432 126T373 27Q319 -22 250 -22Q214 -22 180 -7Q168 -3 168 -4L159 -33Q148 -71 142 -75Q138 -78 132 -78Q124 -78 118 -72T111 -60Q111 -52 122 -18L133 21L125 29Q39 111 39 344Q39 596 137 675Q187 716 251 716Q265 716 278 714T296 710T315 703T331 696ZM276 676Q264 679 246 679Q196 679 159 631Q134 597 128 536T121 356Q121 234 127 174T151 80L234 366Q253 430 275 506T308 618L318 654Q318 656 294 669L276 676ZM181 42Q207 16 250 16Q291 16 324 47Q354 78 366 136T378 356Q378 470 372 528T349 616L348 613Q348 611 264 326L181 42",8710:"51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344",8711:"46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596",8712:"84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250",8713:"196 25Q84 109 84 250Q84 372 166 450T360 539Q361 539 375 539T413 540T460 540L547 707Q550 716 563 716Q570 716 575 712T581 703T583 696T505 540H568Q583 532 583 520Q583 511 570 501L484 500L366 270H568Q583 262 583 250T568 230H346L247 38Q284 16 328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 447 -40T419 -41Q304 -41 228 3Q117 -211 115 -212Q111 -215 104 -215T92 -212T86 -204T84 -197Q84 -190 89 -183L196 25ZM214 61L301 230H124V228Q124 196 147 147T214 61ZM321 270L440 500Q353 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H321",8715:"83 520Q83 532 98 540H195Q202 540 220 540T249 541Q404 541 494 455Q582 374 582 250Q582 165 539 99T434 0T304 -39Q297 -40 195 -40H98Q83 -32 83 -20Q83 -10 96 0H200Q311 1 337 6Q369 14 401 28Q422 39 445 55Q484 85 508 127T537 191T542 228V230H98Q84 237 84 250T98 270H542V272Q542 280 539 295T527 336T497 391T445 445Q422 461 401 472Q386 479 374 483T347 491T325 495T298 498T273 499T239 500T200 500L96 501Q83 511 83 520",8717:"154 -1Q122 -1 112 3T102 26Q102 63 158 63H178Q192 64 206 65T228 66T240 68Q301 85 324 146L329 157H244Q158 157 153 161Q149 162 145 169T140 183Q140 201 158 215L167 221H256L344 223L349 237Q352 262 352 287Q352 308 351 315Q341 352 315 368T256 385Q231 385 206 376T166 356T149 346Q143 346 138 364T132 388Q132 396 147 406Q198 440 252 440Q291 440 318 435Q421 404 451 301Q456 288 456 248V234Q456 151 391 86Q330 25 240 3Q212 -1 154 -1",8719:"158 656Q147 684 131 694Q110 707 69 710H55V750H888V710H874Q840 708 820 698T795 678T786 656V-155Q798 -206 874 -210H888V-250H570V-210H584Q618 -208 638 -197T663 -178T673 -155V710H270V277L271 -155Q283 -206 359 -210H373V-250H55V-210H69Q103 -208 123 -197T148 -178T158 -155V656",8720:"158 656Q147 684 131 694Q110 707 69 710H55V750H373V710H359Q325 708 305 698T280 678T271 656L270 223V-210H673V656Q666 672 663 679T639 697T584 710H570V750H888V710H874Q840 708 820 698T795 678T786 656V-155Q798 -206 874 -210H888V-250H55V-210H69Q103 -208 123 -197T148 -178T158 -155V656",8721:"61 748Q64 750 489 750H913L954 640Q965 609 976 579T993 533T999 516H979L959 517Q936 579 886 621T777 682Q724 700 655 705T436 710H319Q183 710 183 709Q186 706 348 484T511 259Q517 250 513 244L490 216Q466 188 420 134T330 27L149 -187Q149 -188 362 -188Q388 -188 436 -188T506 -189Q679 -189 778 -162T936 -43Q946 -27 959 6H999L913 -249L489 -250Q65 -250 62 -248Q56 -246 56 -239Q56 -234 118 -161Q186 -81 245 -11L428 206Q428 207 242 462L57 717L56 728Q56 744 61 748",8722:"84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250",8723:"56 467T56 480T70 500H707Q722 492 722 480T707 460H409V187H707Q722 179 722 167Q722 154 707 147H409V0V-93Q409 -144 406 -155T389 -166Q376 -166 372 -155T368 -105Q368 -96 368 -62T369 -2V147H70Q56 154 56 167T70 187H369V460H70Q56 467 56 480",8724:"339 717Q339 739 354 752T388 766Q410 766 424 751T439 716T424 681T390 666Q369 666 354 681T339 717ZM57 237T57 250T71 270H369V425L370 581Q380 594 389 594Q402 594 409 579V270H707Q722 262 722 250T707 230H409V-79Q401 -93 391 -93H389H387Q375 -93 369 -79V230H71Q57 237 57 250",8725:"423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750",8726:"56 731Q56 740 62 745T75 750Q85 750 92 740Q96 733 270 255T444 -231Q444 -239 438 -244T424 -250Q414 -250 407 -240Q404 -236 230 242T56 731",8727:"229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286",8728:"55 251Q55 328 112 386T249 444T386 388T444 249Q444 171 388 113T250 55Q170 55 113 112T55 251ZM245 403Q188 403 142 361T96 250Q96 183 141 140T250 96Q284 96 313 109T354 135T375 160Q403 197 403 250Q403 313 360 358T245 403",8729:"55 251Q55 328 112 386T249 444T386 388T444 249Q444 171 388 113T250 55Q170 55 113 112T55 251",8730:"95 178Q89 178 81 186T72 200T103 230T169 280T207 309Q209 311 212 311H213Q219 311 227 294T281 177Q300 134 312 108L397 -77Q398 -77 501 136T707 565T814 786Q820 800 834 800Q841 800 846 794T853 782V776L620 293L385 -193Q381 -200 366 -200Q357 -200 354 -197Q352 -195 256 15L160 225L144 214Q129 202 113 190T95 178",8733:"56 124T56 216T107 375T238 442Q260 442 280 438T319 425T352 407T382 385T406 361T427 336T442 315T455 297T462 285L469 297Q555 442 679 442Q687 442 722 437V398H718Q710 400 694 400Q657 400 623 383T567 343T527 294T503 253T495 235Q495 231 520 192T554 143Q625 44 696 44Q717 44 719 46H722V-5Q695 -11 678 -11Q552 -11 457 141Q455 145 454 146L447 134Q362 -11 235 -11Q157 -11 107 56ZM93 213Q93 143 126 87T220 31Q258 31 292 48T349 88T389 137T413 178T421 196Q421 200 396 239T362 288Q322 345 288 366T213 387Q163 387 128 337T93 213",8734:"55 217Q55 305 111 373T254 442Q342 442 419 381Q457 350 493 303L507 284L514 294Q618 442 747 442Q833 442 888 374T944 214Q944 128 889 59T743 -11Q657 -11 580 50Q542 81 506 128L492 147L485 137Q381 -11 252 -11Q166 -11 111 57T55 217ZM907 217Q907 285 869 341T761 397Q740 397 720 392T682 378T648 359T619 335T594 310T574 285T559 263T548 246L543 238L574 198Q605 158 622 138T664 94T714 61T765 51Q827 51 867 100T907 217ZM92 214Q92 145 131 89T239 33Q357 33 456 193L425 233Q364 312 334 337Q285 380 233 380Q171 380 132 331T92 214",8736:"71 0L68 2Q65 3 63 5T58 11T55 20Q55 22 57 28Q67 43 346 361Q397 420 474 508Q595 648 616 671T647 694T661 688T666 674Q666 668 663 663Q662 662 627 622T524 503T390 350L120 41L386 40H653Q666 30 666 20Q666 8 651 0H71",8737:"71 0L68 2Q65 3 63 5T58 11T55 20Q55 22 57 28Q64 38 348 373T638 712Q644 714 646 714Q653 714 659 709T666 694V693Q666 687 633 647Q619 631 576 580Q528 524 495 485Q336 296 329 289Q328 288 348 264T395 182T433 54L434 40H651Q666 32 666 20T651 0H436Q431 -20 416 -20Q400 -20 396 -4V0H71ZM394 40Q394 51 389 76T366 149T319 234L302 256L119 41L256 40H394",8738:"666 -32Q666 -51 646 -51Q639 -51 365 85L75 228Q55 238 55 250Q55 257 59 262T68 268L72 270L611 536Q642 551 647 551T659 547T666 532Q666 521 657 515L525 449Q525 448 535 424T556 352T566 250T556 148T536 77T525 51L657 -15Q666 -21 666 -32ZM526 250Q526 297 517 342T499 409T488 431Q487 431 304 341T121 250T304 159T488 69Q526 143 526 250",8739:"139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139",8740:"118 737Q131 750 138 750L151 746L158 739V579L160 421L213 470Q269 519 276 519Q284 519 290 513T296 499V498Q296 493 291 488T244 445Q225 428 213 417L158 368V-239Q143 -252 136 -252L124 -248L120 -241L118 44V328L62 279Q4 231 0 230Q-8 230 -14 236T-20 250Q-20 257 -11 265T62 332L118 384V737",8741:"133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739",8742:"131 737Q134 739 138 743T144 748T151 750T171 737V199L327 357V737Q340 750 347 750Q351 750 353 749T360 743T367 737V397L429 457Q493 518 498 519Q506 519 512 512T518 500Q518 489 442 417L367 339V-237Q352 -250 346 -250L333 -243L327 -237V301L171 143V-237Q156 -250 151 -250T131 -237V101L69 41Q24 -3 15 -12T0 -21Q-8 -21 -14 -14T-20 -2Q-20 5 -7 19T56 81L131 159V737",8743:"318 591Q325 598 333 598Q344 598 348 591Q349 590 414 445T545 151T611 -4Q609 -22 591 -22Q588 -22 586 -21T581 -20T577 -17T575 -13T572 -9T570 -4L333 528L96 -4Q87 -20 80 -21Q78 -22 75 -22Q57 -22 55 -4Q55 2 120 150T251 444T318 591",8744:"55 580Q56 587 61 592T75 598Q86 598 96 580L333 48L570 580Q579 596 586 597Q588 598 591 598Q609 598 611 580Q611 574 546 426T415 132T348 -15Q343 -22 333 -22T318 -15Q317 -14 252 131T121 425T55 580",8745:"88 -21T75 -21T55 -7V200Q55 231 55 280Q56 414 60 428Q61 430 61 431Q77 500 152 549T332 598Q443 598 522 544T610 405Q611 399 611 194V-7Q604 -22 591 -22Q582 -22 572 -9L570 405Q563 433 556 449T529 485Q498 519 445 538T334 558Q251 558 179 518T96 401Q95 396 95 193V-7Q88 -21 75 -21",8746:"591 598H592Q604 598 611 583V376Q611 345 611 296Q610 162 606 148Q605 146 605 145Q586 68 507 23T333 -22Q268 -22 209 -1T106 66T56 173Q55 180 55 384L56 585Q66 598 75 598Q85 598 95 585V378L96 172L98 162Q112 95 181 57T332 18Q415 18 487 58T570 175Q571 180 571 383V583Q579 598 591 598",8747:"151 -112Q151 -150 106 -161Q106 -165 114 -172T134 -179Q155 -179 170 -146Q181 -120 188 -64T206 101T232 310Q256 472 277 567Q308 716 392 716Q434 716 453 681T472 613Q472 590 458 577T424 564Q404 564 390 578T376 612Q376 650 421 661Q421 663 418 667T407 675T393 679Q387 679 380 675Q360 665 350 619T326 438Q302 190 253 -57Q235 -147 201 -186Q174 -213 138 -216Q93 -216 74 -181T55 -113Q55 -91 69 -78T103 -64Q123 -64 137 -78T151 -112",8748:"113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244ZM460 -244Q460 -246 466 -251T486 -263T514 -269Q532 -269 546 -260Q567 -247 579 -218T598 -133T609 -15T623 155T644 367Q647 390 652 438T661 512T672 580T687 647T708 703T737 751T775 784T826 804Q828 804 835 804T848 805Q899 802 928 769T957 695Q957 669 941 657T908 645Q889 645 874 658T859 694Q859 705 863 714T873 729T885 737T895 742L899 743Q899 745 892 751T872 762T845 768Q822 768 807 756T781 716T765 652T754 559T745 444T734 300T716 133Q696 -38 684 -102T650 -207Q603 -306 516 -306Q466 -306 434 -272T402 -196Q402 -170 418 -158T451 -146Q470 -146 485 -159T500 -195Q500 -206 496 -215T486 -230T474 -238T464 -242L460 -244",8749:"113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244ZM460 -244Q460 -246 466 -251T486 -263T514 -269Q532 -269 546 -260Q567 -247 579 -218T598 -133T609 -15T623 155T644 367Q647 390 652 438T661 512T672 580T687 647T708 703T737 751T775 784T826 804Q828 804 835 804T848 805Q899 802 928 769T957 695Q957 669 941 657T908 645Q889 645 874 658T859 694Q859 705 863 714T873 729T885 737T895 742L899 743Q899 745 892 751T872 762T845 768Q822 768 807 756T781 716T765 652T754 559T745 444T734 300T716 133Q696 -38 684 -102T650 -207Q603 -306 516 -306Q466 -306 434 -272T402 -196Q402 -170 418 -158T451 -146Q470 -146 485 -159T500 -195Q500 -206 496 -215T486 -230T474 -238T464 -242L460 -244ZM807 -244Q807 -246 813 -251T833 -263T861 -269Q880 -269 893 -260Q914 -247 926 -218T945 -133T956 -15T970 155T991 367Q994 390 999 438T1008 512T1019 580T1034 647T1055 703T1084 751T1122 784T1173 804Q1175 804 1182 804T1195 805Q1246 802 1275 769T1304 695Q1304 669 1288 657T1255 645Q1236 645 1221 658T1206 694Q1206 705 1210 714T1220 729T1232 737T1242 742L1246 743Q1246 745 1239 751T1219 762T1192 768Q1169 768 1154 756T1128 716T1112 652T1101 559T1092 444T1081 300T1063 133Q1043 -38 1031 -102T997 -207Q950 -306 863 -306Q813 -306 781 -272T749 -196Q749 -170 765 -158T798 -146Q817 -146 832 -159T847 -195Q847 -206 843 -215T833 -230T821 -238T811 -242L807 -244",8750:"269 74L256 80Q244 85 227 97T191 128T161 179T148 250Q148 332 199 379T302 433L306 434L307 444Q309 456 313 495T321 553T331 607T345 664T365 712T393 756T431 785T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q471 768 454 752T427 693T414 626T406 536Q405 530 405 527L397 425L404 422Q410 419 421 413T445 399T470 376T494 345T511 303T518 250Q518 205 502 169T460 112T410 80T364 66L360 65L359 55Q357 38 353 4T346 -43T340 -81T333 -118T326 -148T316 -179T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q231 -241 242 -183T266 33L269 74ZM272 122Q272 156 300 391Q300 392 299 392Q287 392 263 379T213 331T187 249Q187 211 205 180T239 137T272 116V122ZM366 107Q378 107 402 119T453 167T479 249Q479 340 394 383V377Q394 375 394 374T393 371T393 366T392 357T391 342T389 321T386 291T382 251T377 199T369 133Q366 112 366 107",8756:"273 411Q273 437 291 454T334 471Q358 471 375 454T393 411T376 368T333 351Q307 351 290 368T273 411ZM84 38Q110 38 126 21T143 -22Q143 -46 127 -64T83 -82Q57 -82 41 -65T24 -22Q24 4 41 21T84 38ZM524 -22Q524 4 541 21T584 38Q608 38 625 21T643 -22Q643 -45 627 -63T583 -82Q557 -82 541 -65T524 -22",8757:"23 411Q23 437 41 454T84 471Q108 471 125 454T143 411T126 368T83 351Q57 351 40 368T23 411ZM523 411Q523 437 541 454T584 471Q608 471 625 454T643 411T626 368T583 351Q557 351 540 368T523 411ZM274 -22Q274 4 291 21T334 38Q356 38 374 22T392 -22T375 -65T333 -82Q307 -82 291 -65T274 -22",8764:"55 166Q55 241 101 304T222 367Q260 367 296 349T362 304T421 252T484 208T554 189Q616 189 655 236T694 338Q694 350 698 358T708 367Q722 367 722 334Q722 260 677 197T562 134H554Q517 134 481 152T414 196T355 248T292 293T223 311Q179 311 145 286Q109 257 96 218T80 156T69 133Q55 133 55 166",8765:"222 133Q147 133 102 197T56 335Q56 362 66 365Q71 369 77 364Q83 356 84 335T90 298Q102 254 137 222T223 189Q258 189 292 206T355 250T413 301T477 346T550 367Q628 367 673 309T722 171Q722 133 708 133Q703 133 699 141T694 162Q694 220 655 265T555 311Q519 311 485 293T421 248T363 196T298 152T222 133",8768:"55 569Q55 583 83 583Q122 583 151 565T194 519T215 464T222 411Q222 360 194 304T139 193T111 89Q111 38 134 -7T195 -55Q222 -57 222 -69Q222 -83 189 -83Q130 -83 93 -33T55 90Q55 130 72 174T110 252T148 328T166 411Q166 462 144 507T83 555Q55 556 55 569",8769:"220 366Q258 366 297 347T361 308T391 288Q394 288 464 370Q494 407 510 425T535 454T546 465T552 467H553Q560 467 566 461T573 448Q573 439 499 350Q424 266 424 261Q424 259 442 247T492 222T554 209Q607 209 646 243Q671 268 680 295T690 341T702 366Q719 366 719 314Q716 265 695 226Q682 199 664 179Q614 132 555 132Q517 132 477 151T412 190T383 210T347 172T278 89T233 37Q228 32 220 32Q210 32 206 38T201 48Q201 57 266 137Q272 144 275 148Q351 231 351 237Q351 239 333 251T283 276T221 289Q159 289 123 248T86 166Q86 156 82 145T73 132Q55 132 55 172Q55 220 79 272Q95 301 111 319Q161 366 220 366",8770:"55 439T55 443T56 449T62 456T68 463H706Q720 449 720 443T706 423H68Q55 439 55 443ZM56 72Q56 112 73 152T130 225T224 257Q259 257 294 240T360 199T419 149T484 107T553 90Q603 90 643 125T691 223Q693 257 704 257Q717 257 717 221Q717 147 671 91T554 34Q517 34 481 51T414 93T355 142T291 184T222 201Q172 201 131 167T84 67Q81 34 71 34Q56 37 56 72",8771:"55 283Q55 356 103 409T217 463Q262 463 297 447T395 382Q431 355 446 344T493 320T554 307H558Q613 307 652 344T694 433Q694 464 708 464T722 432Q722 356 673 304T564 251H554Q510 251 465 275T387 329T310 382T223 407H219Q164 407 122 367Q91 333 85 295T76 253T69 250Q55 250 55 283ZM56 56Q56 71 72 76H706Q722 70 722 56Q722 44 707 36H70Q56 43 56 56",8773:"55 388Q55 463 101 526T222 589Q260 589 296 571T362 526T421 474T484 430T554 411Q616 411 655 458T694 560Q694 572 698 580T708 589Q722 589 722 556Q722 482 677 419T562 356H554Q517 356 481 374T414 418T355 471T292 515T223 533Q179 533 145 508Q109 479 96 440T80 378T69 355Q55 355 55 388ZM56 236Q56 249 70 256H707Q722 248 722 236Q722 225 708 217L390 216H72Q56 221 56 236ZM56 42Q56 57 72 62H708Q722 52 722 42Q722 30 707 22H70Q56 29 56 42",8775:"55 417Q55 479 101 528T222 578Q259 578 294 564T393 507Q413 493 434 480T469 460T484 454L537 549Q587 639 595 647Q600 652 607 652Q615 652 621 647T628 634Q628 625 575 536Q524 446 524 443Q527 440 555 440Q603 440 644 469T691 547Q694 578 706 578T718 556Q718 555 718 551T717 545Q717 488 684 445T595 387Q582 384 558 384Q530 384 508 389L493 394L404 238L557 236H708Q720 224 720 217T706 196H379L291 43L499 41H708Q720 29 720 21T706 1H268L226 -71Q186 -143 179 -148Q173 -155 165 -155T152 -150T146 -137Q146 -133 184 -64L222 1H144L66 3L59 7Q54 14 54 20Q54 29 66 41H246L333 194Q333 196 202 196H68Q55 211 55 218T66 236H213L357 238L457 409L437 421Q432 423 393 450T307 500T222 523Q171 523 129 491T84 414Q82 383 70 383Q55 383 55 417",8776:"55 319Q55 360 72 393T114 444T163 472T205 482Q207 482 213 482T223 483Q262 483 296 468T393 413L443 381Q502 346 553 346Q609 346 649 375T694 454Q694 465 698 474T708 483Q722 483 722 452Q722 386 675 338T555 289Q514 289 468 310T388 357T308 404T224 426Q164 426 125 393T83 318Q81 289 69 289Q55 289 55 319ZM55 85Q55 126 72 159T114 210T163 238T205 248Q207 248 213 248T223 249Q262 249 296 234T393 179L443 147Q502 112 553 112Q609 112 649 141T694 220Q694 249 708 249T722 217Q722 153 675 104T555 55Q514 55 468 76T388 123T308 170T224 192Q164 192 125 159T83 84Q80 55 69 55Q55 55 55 85",8778:"220 523Q163 523 124 486T84 412Q81 383 69 383Q56 383 56 413Q56 441 67 470Q78 508 111 537T187 575Q203 579 219 579Q248 579 271 572Q304 565 393 508Q498 439 551 439Q620 439 662 486Q688 512 693 557Q693 565 697 572T707 579Q719 579 719 548Q719 483 673 434T550 384Q512 384 467 405T386 453T305 501T220 523ZM222 288Q164 288 124 251T84 177Q81 148 69 148Q56 148 56 178Q56 206 67 235Q78 274 111 302T187 339Q198 343 220 343Q244 343 259 341T308 322T393 272Q496 203 553 203Q612 203 651 241T691 312Q693 343 705 343Q719 343 719 313Q719 245 673 199Q626 148 552 148Q513 148 467 170T385 218T304 266T222 288ZM51 -19Q51 -6 62 -1H387Q713 -1 715 -3Q725 -10 725 -20Q725 -27 718 -34Q714 -38 672 -38T387 -39H62Q51 -25 51 -19",8781:"55 464Q55 471 60 477T74 484Q80 484 108 464T172 420T268 376T389 356Q436 356 483 368T566 399T630 436T675 467T695 482Q701 484 703 484Q711 484 716 478T722 464Q722 454 707 442Q550 316 389 316Q338 316 286 329T195 362T124 402T76 437T57 456Q55 462 55 464ZM57 45Q66 58 109 88T230 151T381 183Q438 183 494 168T587 135T658 94T703 61T720 45Q722 39 722 36Q722 28 717 22T703 16Q697 16 669 36T606 80T510 124T389 144Q341 144 294 132T211 101T147 64T102 33T82 18Q76 16 74 16Q66 16 61 22T55 36Q55 39 57 45",8782:"245 367Q251 415 288 453T392 492Q445 492 485 456T532 367H707Q722 359 722 347Q722 334 711 331T665 327H608H509Q500 332 498 336Q496 338 493 363T472 411Q443 451 389 451H387Q335 451 305 411Q290 392 287 374T282 344T268 327H72Q56 332 56 347Q56 360 70 367H245ZM56 153Q56 168 72 173H268Q277 168 279 164Q281 162 284 137T305 89Q334 49 389 49H391Q442 49 472 89Q487 108 490 126T495 156T509 173H608H666Q701 173 711 170T722 153T707 133H532Q526 81 486 45T389 8Q331 8 291 45T245 133H70Q56 140 56 153",8783:"245 367Q251 415 288 453T392 492Q445 492 485 456T532 367H707Q722 359 722 347Q722 334 711 331T665 327H608H509Q500 332 498 336Q496 338 493 363T472 411Q443 451 389 451H387Q335 451 305 411Q290 392 287 374T282 344T268 327H72Q56 332 56 347Q56 360 70 367H245ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153",8784:"56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153ZM329 610Q329 634 346 652T389 670Q413 670 431 654T450 611Q450 586 433 568T390 550T347 567T329 610",8785:"421 474T389 474T339 493T321 541Q321 566 337 587T391 609Q456 602 456 541Q456 512 439 493ZM56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153ZM421 -108T389 -108T339 -89T321 -41Q321 -16 337 5T391 27Q456 20 456 -41Q456 -70 439 -89",8786:"15 541Q15 569 33 585T75 601T117 585T135 541Q135 514 118 498T75 481T32 498T15 541ZM56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153ZM642 -41Q642 -17 658 0T702 18Q726 18 744 3T762 -41Q762 -67 745 -84T702 -101Q676 -101 659 -85T642 -41",8787:"642 541Q642 569 660 585T702 601T744 585T762 541Q762 515 745 498T702 481Q676 481 659 497T642 541ZM56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153ZM14 -41Q14 -15 31 1T74 18Q101 18 118 0T135 -41Q135 -64 118 -83T75 -102Q51 -102 33 -85T14 -41",8790:"56 347Q56 360 70 367H707Q722 359 722 347Q722 334 711 331T658 327H586H465L472 318Q496 288 496 250T472 182L465 173H586H663Q700 173 711 170T722 153T707 133H70Q56 140 56 153Q56 168 72 173H312L305 182Q281 212 281 250T305 318L312 327H72Q56 332 56 347ZM473 250Q473 265 472 273T460 297T428 327H349Q328 313 318 298T306 273T304 250Q304 235 305 227T317 203T349 173H428Q449 187 459 202T471 227T473 250",8791:"279 612Q279 656 310 688T388 721Q433 721 465 689T498 612Q498 573 470 538T389 503Q336 503 308 538T279 612ZM458 614Q458 637 452 651T433 672T411 679T383 680T352 675T333 664T324 647T321 629T320 611Q320 593 321 584T332 562T359 545Q366 543 389 543H391Q406 543 414 544T435 552T452 573T458 614ZM56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153",8796:"192 482H190Q187 483 185 484T181 488T177 493T175 501Q175 506 178 512Q184 523 278 687T375 853Q379 857 383 857Q385 857 387 858T390 859Q397 859 403 853Q405 851 499 687T600 512Q603 506 603 501Q603 488 587 482H192ZM548 523L389 798Q388 798 309 661T230 523T389 522T548 523ZM56 347Q56 360 70 367H708Q723 359 723 347Q723 336 709 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H709Q723 163 723 153Q723 140 708 133H70Q56 140 56 153",8800:"166 -215T159 -215T147 -212T141 -204T139 -197Q139 -190 144 -183L306 133H70Q56 140 56 153Q56 168 72 173H327L406 327H72Q56 332 56 347Q56 360 70 367H426Q597 702 602 707Q605 716 618 716Q625 716 630 712T636 703T638 696Q638 692 471 367H707Q722 359 722 347Q722 336 708 328L451 327L371 173H708Q722 163 722 153Q722 140 707 133H351Q175 -210 170 -212Q166 -215 159 -215",8801:"56 444Q56 457 70 464H707Q722 456 722 444Q722 430 706 424H72Q56 429 56 444ZM56 237T56 250T70 270H707Q722 262 722 250T707 230H70Q56 237 56 250ZM56 56Q56 71 72 76H706Q722 70 722 56Q722 44 707 36H70Q56 43 56 56",8804:"674 636Q682 636 688 630T694 615T687 601Q686 600 417 472L151 346L399 228Q687 92 691 87Q694 81 694 76Q694 58 676 56H670L382 192Q92 329 90 331Q83 336 83 348Q84 359 96 365Q104 369 382 500T665 634Q669 636 674 636ZM84 -118Q84 -108 99 -98H678Q694 -104 694 -118Q694 -130 679 -138H98Q84 -131 84 -118",8805:"83 616Q83 624 89 630T99 636Q107 636 253 568T543 431T687 361Q694 356 694 346T687 331Q685 329 395 192L107 56H101Q83 58 83 76Q83 77 83 79Q82 86 98 95Q117 105 248 167Q326 204 378 228L626 346L360 472Q291 505 200 548Q112 589 98 597T83 616ZM84 -118Q84 -108 99 -98H678Q694 -104 694 -118Q694 -130 679 -138H98Q84 -131 84 -118",8806:"674 753Q682 753 688 747T694 732T687 718Q686 717 417 589L151 463L399 345Q687 209 691 204Q694 198 694 193Q694 175 676 173H670L382 309Q92 446 90 448Q83 453 83 465Q84 476 96 482Q104 486 382 617T665 751Q669 753 674 753ZM84 39Q84 49 99 59H678Q694 53 694 39Q694 26 679 19H98Q84 26 84 39ZM83 -157Q83 -153 84 -150T86 -145T89 -141T92 -139T96 -137T99 -135H678Q694 -146 694 -155Q694 -168 679 -175H98Q84 -168 83 -157",8807:"83 733Q83 741 89 747T99 753Q107 753 253 685T543 548T687 478Q694 473 694 463T687 448Q685 446 395 309L107 173H101Q83 175 83 193Q83 194 83 196Q82 203 98 212Q117 222 248 284Q326 321 378 345L626 463L360 589Q291 622 200 665Q112 706 98 714T83 733ZM84 39Q84 49 99 59H678Q694 53 694 39Q694 26 679 19H98Q84 26 84 39ZM83 -157Q83 -153 84 -150T86 -145T89 -141T92 -139T96 -137T99 -135H678Q694 -146 694 -155Q694 -168 679 -175H98Q84 -168 83 -157",8808:"86 472Q93 477 381 614T673 752Q680 752 686 746T693 732T689 721Q686 715 418 590L151 461L418 332Q684 207 689 201Q693 195 693 190Q693 183 687 177T675 170Q668 170 380 307T86 450Q82 454 82 461Q82 467 86 472ZM82 33Q82 37 83 40T89 47T95 54H473L520 105Q569 156 571 156Q573 157 578 157Q586 157 592 151T598 136Q598 130 562 92L526 56L604 54H682Q693 43 693 35Q693 31 692 28T686 21T680 14H489L342 -139L513 -142H682Q693 -148 693 -160Q693 -167 680 -182H304L258 -230Q248 -240 237 -251T221 -268T211 -278T203 -284T197 -286Q189 -286 184 -280T178 -264Q178 -257 213 -219L249 -182H171L93 -179L86 -175Q82 -170 82 -163Q82 -155 95 -142H289L360 -64L433 14H262L93 16Q82 23 82 33",8809:"89 745Q95 752 100 752Q106 752 394 615T689 472Q693 468 693 461T689 450Q684 445 396 308T100 170Q95 170 89 176T82 190Q82 195 86 201Q91 208 358 332L624 461L358 590Q90 715 86 721Q82 725 82 731Q82 739 89 745ZM82 33Q82 37 83 40T89 47T95 54H473L520 105Q569 156 571 156Q573 157 578 157Q586 157 592 151T598 136Q598 130 562 92L526 56L604 54H682Q693 43 693 35Q693 31 692 28T686 21T680 14H489L342 -139L513 -142H682Q693 -148 693 -160Q693 -167 680 -182H304L258 -230Q248 -240 237 -251T221 -268T211 -278T203 -284T197 -286Q189 -286 184 -280T178 -264Q178 -257 213 -219L249 -182H171L93 -179L86 -175Q82 -170 82 -163Q82 -155 95 -142H289L360 -64L433 14H262L93 16Q82 23 82 33",8810:"639 -48Q639 -54 634 -60T619 -67H618Q612 -67 536 -26Q430 33 329 88Q61 235 59 239Q56 243 56 250T59 261Q62 266 336 415T615 567L619 568Q622 567 625 567Q639 562 639 548Q639 540 633 534Q632 532 374 391L117 250L374 109Q632 -32 633 -34Q639 -40 639 -48ZM944 -48Q944 -54 939 -60T924 -67H923Q917 -67 841 -26Q735 33 634 88Q366 235 364 239Q361 243 361 250T364 261Q367 266 641 415T920 567L924 568Q927 567 930 567Q944 562 944 548Q944 540 938 534Q937 532 679 391L422 250L679 109Q937 -32 938 -34Q944 -40 944 -48",8811:"55 539T55 547T60 561T74 567Q81 567 207 498Q297 449 365 412Q633 265 636 261Q639 255 639 250Q639 241 626 232Q614 224 365 88Q83 -65 79 -66Q76 -67 73 -67Q65 -67 60 -61T55 -47Q55 -39 61 -33Q62 -33 95 -15T193 39T320 109L321 110H322L323 111H324L325 112L326 113H327L329 114H330L331 115H332L333 116L334 117H335L336 118H337L338 119H339L340 120L341 121H342L343 122H344L345 123H346L347 124L348 125H349L351 126H352L353 127H354L355 128L356 129H357L358 130H359L360 131H361L362 132L363 133H364L365 134H366L367 135H368L369 136H370L371 137L372 138H373L374 139H375L376 140L378 141L576 251Q63 530 62 533Q55 539 55 547ZM360 539T360 547T365 561T379 567Q386 567 512 498Q602 449 670 412Q938 265 941 261Q944 255 944 250Q944 241 931 232Q919 224 670 88Q388 -65 384 -66Q381 -67 378 -67Q370 -67 365 -61T360 -47Q360 -39 366 -33Q367 -33 400 -15T498 39T625 109L626 110H627L628 111H629L630 112L631 113H632L634 114H635L636 115H637L638 116L639 117H640L641 118H642L643 119H644L645 120L646 121H647L648 122H649L650 123H651L652 124L653 125H654L656 126H657L658 127H659L660 128L661 129H662L663 130H664L665 131H666L667 132L668 133H669L670 134H671L672 135H673L674 136H675L676 137L677 138H678L679 139H680L681 140L683 141L881 251Q368 530 367 533Q360 539 360 547",8812:"104 730Q104 749 123 749Q130 749 138 745Q186 717 237 671L250 659L261 670Q297 703 332 726T375 750T389 744T395 730Q395 721 390 717T364 699T322 668Q290 641 283 632Q280 628 281 627T293 612Q425 454 425 250Q425 144 388 51T293 -112Q282 -125 281 -126T283 -132Q306 -162 379 -209Q395 -219 395 -230Q395 -238 389 -244T375 -250T335 -228T262 -171L250 -159L238 -170Q202 -203 167 -226T124 -250T110 -244T104 -230Q104 -219 121 -209Q199 -156 216 -132Q219 -128 218 -127T206 -112Q74 46 74 250T206 612Q217 625 218 626T216 632Q199 656 121 709Q104 719 104 730ZM249 -94Q364 61 364 250Q364 430 265 574Q253 590 249 594L242 583Q134 439 134 250Q134 114 192 -1Q212 -44 242 -83L249 -94",8814:"693 -14T693 -20T687 -33T675 -41Q667 -41 506 37L344 112Q342 112 262 -46Q184 -196 176 -205Q172 -209 168 -209T162 -208Q155 -208 151 -203T146 -190Q146 -178 171 -137Q193 -91 251 21L306 132L198 183Q142 208 118 220T88 238T82 249Q82 253 86 261Q92 267 278 357L464 443L529 572Q561 637 577 667T597 703T607 708Q615 708 622 702T629 688Q629 680 575 579L524 474Q524 473 545 482T598 508Q666 541 673 541T686 535T693 521Q693 512 679 504T589 459L493 414L360 150Q366 148 378 142T431 116T529 70Q686 -8 689 -10Q693 -14 693 -20ZM380 277L433 383Q432 385 292 319T151 250T237 209T324 170L380 277",8815:"82 514T82 520T89 533T100 541Q106 541 271 463Q434 386 435 386L515 543Q593 699 600 706Q604 708 607 708Q615 708 622 702T629 688T549 526Q509 445 491 407T473 368Q522 343 580 317Q636 291 660 278T688 261T693 250V249Q693 241 681 234T580 184Q533 161 502 146Q317 59 315 59Q312 56 246 -74Q197 -170 186 -189T168 -209Q164 -209 162 -208Q155 -208 151 -203T146 -190Q146 -187 200 -79L253 28L218 11Q182 -6 144 -23T100 -41Q95 -41 89 -35T82 -21Q82 -12 96 -4T186 41L284 88L349 217Q377 273 395 311T413 350Q413 351 253 428Q101 498 86 510Q82 514 82 520ZM624 250Q461 330 455 330Q454 331 453 329T448 321T441 308T430 287T416 259T398 223L342 114L624 250",8816:"82 -124Q82 -120 83 -117T89 -110T95 -103H220L284 50Q346 204 344 206L218 268Q153 297 123 313T87 333T82 344T86 355Q104 369 291 455Q491 552 491 553L542 673Q581 767 590 784T609 801Q616 801 622 795T629 781Q629 773 586 677Q546 581 546 577L609 606Q669 635 673 635Q680 635 686 629T693 615Q693 610 692 608T670 593T604 561L524 521L400 226L542 157Q617 123 649 107T687 85T694 72Q694 66 690 60T679 54Q664 54 526 121Q513 127 495 136T464 150T438 162T416 173T399 180T388 185L384 186Q383 186 322 41L262 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L464 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 174 -213T202 -143H146L93 -141Q82 -134 82 -124ZM418 370L466 495Q464 495 308 420T151 344T204 317T311 267T364 244Q364 247 418 370",8817:"97 54Q82 54 82 72Q82 79 86 84Q95 91 222 153L351 215L398 324L442 433L258 519Q95 597 87 604Q82 608 82 615T88 628T102 635Q107 635 424 484L458 468L524 630Q593 789 597 795Q601 801 609 801Q616 801 622 795T629 781L562 615L493 450L589 406Q665 371 679 362T694 344Q694 339 693 337T677 326T631 302T538 257Q504 241 465 223T406 195T386 186Q384 185 322 39L262 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L464 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 174 -213T202 -143H146L93 -141Q82 -134 82 -124Q82 -120 83 -117T89 -110T95 -103H220L273 26Q326 156 326 157L218 106Q109 54 97 54ZM553 379Q480 412 480 415Q479 415 460 372T423 285T406 241Q408 240 516 291T624 344L553 379",8818:"674 732Q682 732 688 726T694 711T687 697Q686 696 417 568L151 442L399 324Q687 188 691 183Q694 177 694 172Q694 154 676 152H670L382 288Q92 425 90 427Q83 432 83 444Q84 455 96 461Q104 465 382 596T665 730Q669 732 674 732ZM56 -194Q56 -107 106 -51T222 6Q260 6 296 -12T362 -56T420 -108T483 -153T554 -171Q616 -171 654 -128T694 -29Q696 6 708 6Q722 6 722 -26Q722 -102 676 -164T557 -227Q518 -227 481 -209T415 -165T358 -113T294 -69T223 -51Q163 -51 125 -93T83 -196Q81 -228 69 -228Q56 -228 56 -202V-194",8819:"90 697Q83 704 83 712T88 726T99 732Q107 732 253 664T543 527T687 457Q694 452 694 442T687 427Q685 425 395 288L107 152H101Q83 154 83 172Q83 173 83 175Q82 182 98 191Q117 201 248 263Q326 300 378 324L626 442L360 568Q91 696 90 697ZM56 -194Q56 -107 106 -51T222 6Q260 6 296 -12T362 -56T420 -108T483 -153T554 -171Q616 -171 654 -128T694 -29Q696 6 708 6Q722 6 722 -26Q722 -102 676 -164T557 -227Q518 -227 481 -209T415 -165T358 -113T294 -69T223 -51Q163 -51 125 -93T83 -196Q81 -228 69 -228Q56 -228 56 -202V-194",8822:"734 181Q734 173 728 167T714 161Q711 161 386 280T54 404Q44 408 44 421Q44 432 52 437Q66 443 388 562T714 681Q721 681 727 675T734 661Q734 651 722 645Q711 639 462 546Q441 539 420 531L122 421L420 311L723 198Q734 192 734 181ZM44 247Q44 255 50 261T63 267Q66 267 391 148T723 24Q734 18 734 7T723 -10Q716 -14 391 -133T63 -253Q56 -253 50 -247T44 -233Q44 -223 55 -217Q67 -210 317 -118Q337 -110 357 -103L655 7L357 117L54 230Q44 236 44 247",8823:"83 661Q83 668 88 674T104 681Q111 679 396 560Q686 437 687 436Q694 431 694 421T687 406Q686 405 543 344T253 222T101 161Q83 163 83 180Q83 194 95 199Q96 199 130 213T232 257T361 311L621 421L357 532Q307 553 233 584Q121 631 102 640T83 661ZM673 267Q694 267 694 248Q694 237 687 232Q684 229 420 118L156 7L416 -103L683 -215Q694 -222 694 -233Q694 -251 676 -253Q670 -253 524 -192T235 -70T90 -8Q83 -1 83 7Q83 19 94 24Q97 25 378 144T667 266Q669 267 673 267",8826:"84 249Q84 262 91 266T117 270Q120 270 126 270T137 269Q388 273 512 333T653 512Q657 539 676 539Q685 538 689 532T694 520V515Q689 469 672 431T626 366T569 320T500 286T435 265T373 249Q379 248 404 242T440 233T477 221T533 199Q681 124 694 -17Q694 -41 674 -41Q658 -41 653 -17Q646 41 613 84T533 154T418 197T284 220T137 229H114Q104 229 98 230T88 235T84 249",8827:"84 517Q84 539 102 539Q115 539 119 529T125 503T137 459T171 404Q277 275 640 269H661Q694 269 694 249T661 229H640Q526 227 439 214T283 173T173 98T124 -17Q118 -41 103 -41Q83 -41 83 -17Q88 29 105 67T151 132T208 178T277 212T342 233T404 249Q401 250 380 254T345 263T302 276T245 299Q125 358 92 468Q84 502 84 517",8828:"112 270Q83 270 83 290Q83 301 94 307Q98 310 118 310Q516 310 620 464Q635 486 642 510T651 548T657 571T675 580Q693 577 693 559V552Q684 472 628 410T465 314Q436 303 372 290Q373 290 388 287T425 278T465 266Q674 199 693 28L694 17Q688 5 683 3Q677 0 673 0Q656 0 653 24Q623 270 118 270H112ZM110 116Q83 116 83 136T110 156H113Q134 156 160 155T231 146T318 128T407 95T489 44T550 -30T583 -131Q583 -153 563 -153Q556 -153 553 -152T547 -145T542 -127Q531 -54 478 0Q425 53 333 83T123 116H110",8829:"668 310Q694 310 694 290Q694 285 691 279Q684 271 664 270Q550 268 464 257T301 220T179 146T124 27Q119 0 103 0T83 16Q83 21 83 31T92 68T113 121T157 177T229 231Q295 268 405 290Q404 290 389 293T352 302T312 314Q138 371 96 500Q83 541 83 562Q83 568 89 574T103 580Q115 580 120 570T126 542T138 497T173 442Q289 310 659 310H668ZM194 -131Q201 -60 241 -6T343 82T477 133T628 155Q632 155 644 155T661 156Q685 155 690 147Q694 143 694 136Q694 132 693 129T689 124T685 120T681 117L656 116Q596 114 543 106T436 79T342 35T272 -33T235 -127Q231 -154 212 -154Q203 -153 199 -147T194 -136V-131",8830:"84 442Q84 455 91 459T117 463Q120 463 126 463T137 462Q388 466 512 526T653 705Q657 732 676 732Q685 731 689 725T694 714V708Q689 662 672 624T626 559T569 513T500 479T435 458T373 442Q379 441 404 435T440 426T477 414T533 392Q592 362 630 319T681 241T694 174Q694 153 674 153Q662 153 657 163T652 188T640 231T606 287Q500 416 137 422H114Q104 422 98 423T88 428T84 442ZM56 -194Q56 -107 106 -51T222 6Q260 6 296 -12T362 -56T420 -108T483 -153T554 -171Q616 -171 654 -128T694 -29Q696 6 708 6Q722 6 722 -26Q722 -102 676 -164T557 -227Q518 -227 481 -209T415 -165T358 -113T294 -69T223 -51Q163 -51 125 -93T83 -196Q81 -228 69 -228Q56 -228 56 -202V-194",8831:"84 710Q84 732 102 732Q115 732 119 722T125 696T137 652T171 597Q277 468 640 462H661Q694 462 694 442T661 422H640Q578 421 526 417T415 403T309 376T222 333T156 268T124 179Q122 162 118 158T103 153Q100 153 98 153T95 154T93 155T90 158T85 163Q83 167 83 176Q88 222 105 260T151 325T208 371T277 405T342 426T404 442Q401 443 380 447T345 456T302 469T245 492Q125 551 92 661Q84 695 84 710ZM56 -194Q56 -107 106 -51T222 6Q260 6 296 -12T362 -56T420 -108T483 -153T554 -171Q616 -171 654 -128T694 -29Q696 6 708 6Q722 6 722 -26Q722 -102 676 -164T557 -227Q518 -227 481 -209T415 -165T358 -113T294 -69T223 -51Q163 -51 125 -93T83 -196Q81 -228 69 -228Q56 -228 56 -202V-194",8832:"386 292Q388 292 439 393T543 598T598 703Q599 703 603 704T609 705Q616 705 622 699T629 685T533 494Q440 308 440 305Q451 310 462 312Q547 342 592 388T651 505Q654 525 658 532T673 539Q680 539 686 533T693 519Q693 495 678 450Q638 341 500 283Q433 259 418 259Q416 259 411 251T406 241T415 239Q482 224 544 190Q674 121 691 -10Q693 -28 691 -32Q684 -43 672 -43Q664 -43 658 -37Q656 -33 650 -6T634 47T589 109T500 168Q473 179 436 190T388 201H386L284 -1Q261 -45 232 -101T191 -181T178 -206Q176 -206 172 -207T166 -208Q160 -208 153 -202T146 -188Q146 -185 246 12Q344 206 344 210Q344 213 305 217T213 225T124 228H95Q82 241 82 248Q82 253 95 268H124Q172 268 236 273T343 283T386 292",8833:"103 -43Q96 -43 89 -39T82 -26L84 -10Q105 141 275 212Q342 236 355 236Q360 236 364 245L369 256H360Q284 280 275 283Q115 351 86 490Q82 507 82 517Q82 526 88 532T103 538Q110 538 115 534Q119 531 122 517T128 486T143 444T174 397T231 351T320 310Q371 292 389 292L491 496Q595 701 598 703Q599 703 603 704T609 705Q616 705 622 699T629 685Q629 684 531 485Q431 296 431 288Q431 278 520 273T651 268H680Q693 253 693 248Q693 241 680 228H651Q591 228 491 218T386 201L284 -1Q261 -45 232 -101T191 -181T178 -206Q176 -206 172 -207T166 -208Q160 -208 153 -202T146 -188Q146 -182 302 125L335 190L324 185Q313 185 289 172Q241 153 208 128T159 78T135 31T124 -11T118 -37Q112 -43 103 -43",8834:"84 250Q84 372 166 450T360 539Q361 539 370 539T395 539T430 540T475 540T524 540H679Q694 532 694 520Q694 511 681 501L522 500H470H441Q366 500 338 496T266 472Q244 461 224 446T179 404T139 337T124 250V245Q124 157 185 89Q244 25 328 7Q348 2 366 2T522 0H681Q694 -10 694 -20Q694 -32 679 -40H526Q510 -40 480 -40T434 -41Q350 -41 289 -25T172 45Q84 127 84 250",8835:"83 520Q83 532 98 540H251Q267 540 297 540T343 541Q427 541 488 525T605 455Q693 374 693 250Q693 165 650 99T545 0T415 -39Q407 -40 251 -40H98Q83 -32 83 -20Q83 -10 96 0H255H308H337Q412 0 439 4T512 28Q533 39 553 54T599 96T639 163T654 250Q654 341 592 411Q557 449 512 472Q468 491 439 495T335 500H306H255L96 501Q83 511 83 520",8838:"84 346Q84 468 166 546T360 635Q361 635 370 635T395 635T430 636T475 636T524 636H679Q694 628 694 616Q694 607 681 597L522 596H470H441Q366 596 338 592T266 568Q244 557 224 542T179 500T139 433T124 346V341Q124 253 185 185Q244 121 328 103Q348 98 366 98T522 96H681Q694 86 694 76Q694 64 679 56H526Q510 56 480 56T434 55Q350 55 289 71T172 141Q84 223 84 346ZM104 -131T104 -118T118 -98H679Q694 -106 694 -118T679 -138H118Q104 -131 104 -118",8839:"83 616Q83 628 98 636H251Q267 636 297 636T343 637Q427 637 488 621T605 551Q693 470 693 346Q693 261 650 195T545 96T415 57Q407 56 251 56H98Q83 64 83 76Q83 86 96 96H255H308H337Q412 96 439 100T512 124Q533 135 553 150T599 192T639 259T654 346Q654 437 592 507Q557 545 512 568Q468 587 439 591T335 596H306H255L96 597Q83 607 83 616ZM84 -131T84 -118T98 -98H659Q674 -106 674 -118T659 -138H98Q84 -131 84 -118",8840:"146 -283Q146 -282 174 -213T202 -143H115Q102 -127 102 -123T115 -103H220L291 68L278 73Q203 101 153 157T86 288Q83 309 83 344Q83 380 86 399Q107 480 160 539Q222 601 298 621Q328 630 345 631T435 635L526 637L560 715Q587 778 593 789T609 801Q616 801 622 795T629 781Q629 780 625 771T614 742T600 706L571 637Q571 635 626 635H680Q693 620 693 613T689 601L682 597L618 595H553L449 346Q425 288 399 223T359 127T346 95H356Q365 95 381 95T417 94T463 93T515 93H682Q693 82 693 74T680 53H511Q420 55 335 55L329 57L262 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L464 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283ZM509 590Q509 595 438 595Q354 595 318 586Q246 567 195 516T126 395Q123 378 123 344T126 293Q141 229 184 181T291 110L306 104L406 346L509 590",8841:"82 606T82 613T95 635H251H348Q408 635 435 632T502 615L515 608L520 617Q520 619 558 708Q584 774 591 787T609 801Q616 801 622 795T629 781Q629 775 562 615L551 590L569 577Q646 527 678 437Q691 398 691 344T678 250Q653 182 597 132T469 64Q427 53 366 53H326L295 -25L262 -103H660Q673 -118 673 -124Q673 -129 669 -136L662 -141L453 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 174 -213T202 -143H95Q82 -128 82 -123T95 -103H220L251 -25L284 53H189L93 55L86 59Q82 64 82 71T95 93H302L400 333Q498 569 498 573L444 590Q431 593 260 595L93 597L86 601Q82 606 82 613ZM652 344V354Q652 451 575 521Q571 526 557 538T537 551Q534 551 533 548Q533 543 438 319L344 95L371 93H386Q487 93 557 150T649 293Q652 309 652 344",8842:"693 72Q693 68 692 66T686 59T680 52H524Q398 52 367 53T309 63Q236 82 180 132T98 250Q84 288 84 343Q84 397 98 437Q126 515 193 568T346 632Q347 632 373 633T440 634T520 635H680Q693 620 693 615Q693 608 680 595H526Q364 595 353 592Q279 582 221 539T138 430Q124 392 124 343Q124 296 138 257Q163 192 221 149T353 95Q364 92 526 92H680Q693 79 693 72ZM102 -132T102 -125T115 -103H382L420 -68Q429 -60 438 -52T452 -39T463 -28T472 -20T478 -14T483 -10T487 -7T490 -6T493 -5T496 -5Q502 -5 508 -12T515 -28Q515 -34 513 -37Q512 -38 507 -42T492 -55T475 -70L440 -101L562 -103H682Q693 -114 693 -122T680 -143H395L355 -179Q289 -241 280 -241Q273 -241 267 -235T260 -221T265 -208T300 -174L335 -143H224L113 -141L106 -137Q102 -132 102 -125",8843:"82 615Q82 620 95 635H251Q378 635 409 634T469 623Q540 605 596 555T678 437Q691 397 691 343T678 250Q649 172 581 119T426 55Q415 52 251 52H95Q93 55 89 59T84 65T82 72Q82 79 95 92H249Q411 92 422 95Q496 105 554 148T638 257Q651 296 651 343Q651 391 638 430Q613 495 555 538T422 592Q411 595 249 595H95Q82 608 82 615ZM82 -132T82 -125T95 -103H380L420 -57Q452 -21 460 -14T474 -6Q482 -6 488 -12T495 -25T451 -81L433 -101L549 -103H662Q673 -114 673 -122T660 -143H395L355 -190Q311 -239 309 -239Q305 -241 302 -241Q294 -241 287 -235T280 -221T324 -163L342 -143H218L93 -141L86 -137Q82 -132 82 -125",8846:"591 598H592Q604 598 611 583V376Q611 345 611 296Q610 162 606 148Q605 146 605 145Q586 68 507 23T333 -22Q268 -22 209 -1T106 66T56 173Q55 180 55 384L56 585Q66 598 75 598Q85 598 95 585V378L96 172L98 162Q112 95 181 57T332 18Q415 18 487 58T570 175Q571 180 571 383V583Q579 598 591 598ZM313 406Q313 417 313 435T312 459Q312 483 316 493T333 503T349 494T353 461V406V325H515Q516 325 519 323T527 316T531 305T527 294T520 287T515 285H353V204V152Q353 127 350 117T333 107T316 117T312 152Q312 158 312 175T313 204V285H151Q150 285 147 287T139 294T135 305T139 316T146 323T151 325H313V406",8847:"83 523Q87 535 99 539H679Q694 531 694 519Q694 506 679 499H123V-1H678Q694 -7 694 -21Q694 -34 679 -41H98Q93 -38 84 -28L83 247V523",8848:"64 506T64 519T78 539H699Q706 536 714 526V-28Q706 -38 699 -41H78Q64 -34 64 -21Q64 -6 80 -1H674V499H78Q64 506 64 519",8849:"94 620Q98 632 110 636H699Q714 628 714 616T699 596H134V96H698Q714 90 714 76Q714 64 699 56H109Q104 59 95 69L94 344V620ZM84 -118Q84 -103 100 -98H698Q714 -104 714 -118Q714 -130 699 -138H98Q84 -131 84 -118",8850:"64 603T64 616T78 636H668Q675 633 683 623V69Q675 59 668 56H78Q64 63 64 76Q64 91 80 96H643V596H78Q64 603 64 616ZM64 -118Q64 -108 79 -98H678Q694 -104 694 -118Q694 -130 679 -138H78Q64 -131 64 -118",8851:"83 0Q79 0 76 1T71 3T67 6T65 9T63 13T61 16V301L62 585Q70 595 76 598H592Q602 590 605 583V15Q598 2 587 0Q583 0 580 1T575 3T571 6T569 9T567 13T565 16V558H101V15Q94 2 83 0",8852:"77 0Q65 4 61 16V301L62 585Q72 598 81 598Q94 598 101 583V40H565V583Q573 598 585 598Q598 598 605 583V15Q602 10 592 1L335 0H77",8853:"56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM364 542Q308 539 251 509T148 418T96 278V270H369V542H364ZM681 278Q675 338 650 386T592 462T522 509T458 535T412 542H409V270H681V278ZM96 222Q104 150 139 95T219 12T302 -29T366 -42H369V230H96V222ZM681 222V230H409V-42H412Q429 -42 456 -36T521 -10T590 37T649 113T681 222",8854:"56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM681 278Q669 385 591 463T381 542Q283 542 196 471T96 278V270H681V278ZM275 -42T388 -42T585 32T681 222V230H96V222Q108 107 191 33",8855:"56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM582 471Q531 510 496 523Q446 542 381 542Q324 542 272 519T196 471L389 278L485 375L582 471ZM167 442Q95 362 95 250Q95 137 167 58L359 250L167 442ZM610 58Q682 138 682 250Q682 363 610 442L418 250L610 58ZM196 29Q209 16 230 2T295 -27T388 -42Q409 -42 429 -40T465 -33T496 -23T522 -11T544 1T561 13T574 22T582 29L388 222L196 29",8856:"56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM582 471Q581 472 571 480T556 491T539 502T517 514T491 525T460 534T424 539T381 542Q272 542 184 460T95 251Q95 198 113 150T149 80L167 58L582 471ZM388 -42Q513 -42 597 44T682 250Q682 363 610 442L196 29Q209 16 229 2T295 -27T388 -42",8857:"56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM682 250Q682 322 649 387T546 497T381 542Q272 542 184 459T95 250Q95 132 178 45T389 -42Q515 -42 598 45T682 250ZM311 250Q311 285 332 304T375 328Q376 328 382 328T392 329Q424 326 445 305T466 250Q466 217 445 195T389 172Q354 172 333 195T311 250",8858:"57 250Q57 327 87 392T166 497T270 560T382 582H394Q512 582 610 500Q721 401 721 250Q721 112 626 15T389 -82Q251 -82 154 13T57 250ZM682 129T682 250T596 457T390 543Q269 543 183 457T96 250Q96 132 180 45T389 -43Q511 -43 596 43ZM250 250Q250 316 295 352T384 388Q451 388 489 347T528 250Q528 192 487 152T389 112Q331 112 291 152T250 250ZM488 250Q488 290 460 319T389 349Q348 349 319 320T290 250Q290 208 320 180T389 151Q431 151 459 181T488 250",8859:"57 250Q57 327 87 392T166 497T270 560T382 582H394Q512 582 610 500Q721 401 721 250Q721 112 626 15T389 -82Q251 -82 154 13T57 250ZM682 129T682 250T596 457T390 543Q269 543 183 457T96 250Q96 132 180 45T389 -43Q511 -43 596 43ZM204 339Q204 357 215 366T238 375Q247 375 283 348Q300 336 311 328L368 286Q369 286 366 323T359 398T355 437Q357 456 379 465Q380 465 384 465T391 466Q403 465 412 457T423 437Q423 436 420 398T413 323T410 286L467 328Q476 334 486 341T501 353T513 361T523 368T529 372T535 374T541 375Q554 375 564 365T575 339Q575 325 566 318T519 292Q504 285 496 281L430 250L496 219Q552 192 559 188T572 175Q575 168 575 161Q575 148 566 137T541 126H538Q530 126 499 149Q480 163 467 172L410 214Q409 214 412 177T419 102T423 63Q423 59 421 54T411 43T389 36T368 42T357 54T355 63Q355 64 358 102T365 177T368 214L311 172Q302 165 293 159T279 148T268 140T260 134T254 131T250 128T246 127T242 126T238 126Q223 126 214 135T204 161T213 183T282 219L348 250L282 281Q226 308 219 312T206 325Q204 330 204 339",8861:"57 250Q57 327 87 392T166 497T270 560T382 582H394Q512 582 610 500Q721 401 721 250Q721 112 626 15T389 -82Q251 -82 154 13T57 250ZM682 129T682 250T596 457T390 543Q269 543 183 457T96 250Q96 132 180 45T389 -43Q511 -43 596 43ZM223 250Q223 263 233 267T280 271Q289 271 325 271T389 270H490Q535 270 545 267T555 250Q555 241 549 235Q544 231 527 231T389 230Q239 230 235 232Q223 236 223 250",8862:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM369 365V649H95V365H369ZM682 365V649H409V365H682ZM369 40V325H95V40H369ZM682 40V325H409V40H682",8863:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM682 365V649H95V365H682ZM682 40V325H95V40H682",8864:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H707Q714 686 722 676V13Q714 3 707 0H71ZM123 649Q147 625 214 555T335 430T389 374L654 649H123ZM95 70Q99 74 229 209T360 345L95 619V70ZM682 70V619L418 346Q417 344 549 207L682 70ZM654 41L400 304L388 315L123 41L256 40H522L654 41",8865:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM682 40V649H95V40H682ZM330 345Q330 371 347 388T390 405Q412 405 430 389T448 345Q448 317 430 301T389 285T348 301T330 345",8866:"55 678Q55 679 56 681T58 684T61 688T65 691T70 693T77 694Q88 692 95 679V367H540Q555 359 555 347Q555 334 540 327H95V15Q88 2 77 0Q73 0 70 1T65 3T61 6T59 9T57 13T55 16V678",8867:"515 678Q515 679 516 681T518 684T521 688T525 691T530 693T537 694Q548 692 555 679V15Q548 2 537 0Q533 0 530 1T525 3T521 6T519 9T517 13T515 16V327H71Q70 327 67 329T59 336T55 347T59 358T66 365T71 367H515V678",8868:"55 642T55 648T59 659T66 666T71 668H708Q723 660 723 648T708 628H409V15Q402 2 391 0Q387 0 384 1T379 3T375 6T373 9T371 13T369 16V628H71Q70 628 67 630T59 637",8869:"369 652Q369 653 370 655T372 658T375 662T379 665T384 667T391 668Q402 666 409 653V40H708Q723 32 723 20T708 0H71Q70 0 67 2T59 9T55 20T59 31T66 38T71 40H369V652",8872:"139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V367H796Q811 359 811 347Q811 336 797 328L479 327H161L159 328V172L161 173H797Q798 172 800 171T803 169T805 167T808 164T809 162T810 158T811 153Q811 140 796 133H159V-235Q151 -249 141 -249H139",8873:"55 678Q55 679 56 681T58 684T61 688T65 691T70 693T77 694Q88 692 95 679V15Q88 2 77 0Q73 0 70 1T65 3T61 6T59 9T57 13T55 16V678ZM249 678Q249 679 250 681T252 684T255 688T259 691T264 693T271 694Q282 692 289 679V367H651Q666 359 666 347Q666 334 651 327H289V15Q282 2 271 0Q267 0 264 1T259 3T255 6T253 9T251 13T249 16V678",8874:"55 678Q55 679 56 681T58 684T61 688T65 691T70 693T77 694Q88 692 95 679V15Q88 2 77 0Q73 0 70 1T65 3T61 6T59 9T57 13T55 16V678ZM237 678Q237 679 238 681T240 684T243 688T247 691T252 693T259 694Q270 692 277 679V15Q270 2 259 0Q255 0 252 1T247 3T243 6T241 9T239 13T237 16V678ZM419 678Q419 679 420 681T422 684T425 688T429 691T434 693T441 694Q452 692 459 679V367H818Q833 359 833 347Q833 334 818 327H459V15Q452 2 441 0Q437 0 434 1T429 3T425 6T423 9T421 13T419 16V678",8876:"56 681Q70 695 76 695T96 681V368H243L381 530Q521 692 525 692Q537 700 547 688Q554 682 554 674Q554 671 553 669T548 661T539 649T522 631T499 604T465 565T421 512Q296 373 296 368H416H476Q525 368 539 365T554 348Q554 334 543 328H261L96 141V12Q81 -1 75 -1Q65 -1 58 10L56 50V92L18 48Q7 37 -1 28T-13 14T-19 6T-23 1T-27 0T-33 -1Q-42 -1 -48 4T-55 19Q-55 24 -47 34T12 103L56 155V681ZM205 326Q205 328 152 328H96V263Q96 203 98 203Q99 203 123 231T174 290T205 326",8877:"56 681Q70 695 76 695T96 681V466H327L425 579Q522 692 527 692Q529 693 534 693Q542 693 547 688T553 674Q553 668 549 663Q549 662 538 650T504 611T463 563L381 468L461 466H543Q554 453 554 446T541 426H345L209 272L376 270H543Q554 257 554 251T541 230H174L96 141V12Q81 -1 75 -1Q65 -1 58 10L56 50V92L18 48Q7 37 -1 28T-13 14T-19 6T-23 1T-27 0T-33 -1Q-42 -1 -48 4T-55 19Q-55 24 -47 34T12 103L56 155V681ZM267 399L292 426H96V270H158L201 321Q256 382 267 399ZM118 228L119 229Q119 230 109 230H96V201L107 212Q118 227 118 228",8878:"56 681Q70 695 77 695T96 683V428L98 175L252 323V681Q264 695 272 695Q278 695 292 681V526Q292 368 296 368Q298 368 447 510Q638 695 642 695H645Q651 695 658 688T665 673Q665 666 661 661Q659 660 639 641T578 582T505 512L356 370L505 368H654Q665 357 665 349Q665 343 652 328H314L303 317L292 308V12Q289 10 285 6T279 1T272 -1Q265 -1 252 12V139Q252 266 249 266L96 119V12Q80 -1 76 -1T70 0T63 6T56 12V79L29 55Q-26 -1 -35 -1Q-42 -1 -48 5T-55 19Q-55 25 -51 30T-15 66Q5 86 18 99L56 135V681",8879:"56 681Q70 695 77 695T96 683V428L98 175L252 323V681Q264 695 272 695Q278 695 292 681V466H401L503 563L621 679Q637 695 645 695Q652 695 658 688T665 673Q665 670 663 666Q663 665 651 652T611 612T561 563L458 468L556 466H654Q665 455 665 447T652 426H416L294 308L292 288V270H652Q665 255 665 250T652 230H292V12Q289 10 285 6T279 1T272 -1Q265 -1 252 12V139Q252 266 249 266L96 119V12Q80 -1 76 -1T70 0T63 6T56 12V79L29 55Q-26 -1 -35 -1Q-42 -1 -48 5T-55 19Q-55 25 -51 30T-15 66Q5 86 18 99L56 135V681ZM358 426H292V361L325 392L358 426",8882:"694 -26Q686 -40 676 -41H670L382 95Q92 232 90 234Q83 239 83 249Q83 262 96 267Q101 270 379 401T665 537Q671 539 674 539Q686 539 694 524V-26ZM654 11T654 249T653 487T402 369T151 249L275 190Q399 131 524 72T652 11Q654 11 654 249",8883:"83 523Q83 524 85 527T92 535T103 539Q107 539 389 406T680 268Q694 260 694 249Q694 239 687 234Q685 232 395 95L107 -41H101Q90 -40 83 -26V523ZM376 368Q323 393 254 425T155 472L125 487Q123 487 123 249T125 11Q127 12 252 71T502 190L626 249L376 368",8884:"694 71Q686 58 676 56H670L382 192Q92 329 90 331Q83 336 83 346Q83 359 96 364Q101 367 379 498T665 634Q671 636 674 636Q686 636 694 621V71ZM654 108T654 346T653 584T402 466T151 346L275 287Q399 228 524 169T652 108Q654 108 654 346ZM83 -120Q83 -116 84 -113T86 -108T89 -104T92 -102T96 -100T99 -98H678Q679 -98 681 -99T684 -101T688 -104T691 -108T693 -113T694 -120Q692 -130 679 -138H98Q84 -130 83 -120",8885:"83 620Q83 621 85 624T92 632T103 636Q107 636 389 503T680 365Q694 357 694 346Q694 336 687 331Q685 329 395 192L107 56H101Q90 58 83 71V620ZM376 465Q323 490 254 522T155 570L125 584Q123 584 123 346T125 108Q127 109 252 168T502 287L626 346L376 465ZM83 -120Q83 -116 84 -113T86 -108T89 -104T92 -102T96 -100T99 -98H678Q679 -98 681 -99T684 -101T688 -104T691 -108T693 -113T694 -120Q692 -130 679 -138H98Q84 -130 83 -120",8888:"1055 250Q1055 190 1012 141T896 92Q858 92 828 106T781 140T755 180T741 214L738 228V230H405Q71 230 68 232Q55 238 55 250T68 268Q71 270 405 270H738V272L740 280Q742 287 745 297T754 321T771 348T796 374T832 396T881 408H891Q969 408 1012 360T1055 250ZM896 132Q948 132 981 166T1014 250Q1014 301 985 330T920 367Q914 368 891 368Q853 368 816 338T778 250Q778 198 812 165T896 132",8890:"318 -182Q302 -212 280 -212H278H275Q249 -212 239 -182L238 84V351H162L87 352Q57 362 57 391T84 429Q89 431 280 431H470L474 429Q477 427 479 426T484 423T490 417T495 410T499 402T500 391Q500 365 470 352L394 351H318V-182",8891:"56 697Q56 706 62 711T75 716Q86 716 90 709Q91 708 104 680T147 592T199 483L305 261L411 483Q443 548 481 629Q512 694 518 705T535 716Q543 716 549 710T555 700Q555 693 501 577T388 340T325 210Q316 194 305 194Q292 194 285 210Q282 219 224 339T111 574T56 697ZM55 14T55 20T59 31T66 38T71 40H540Q555 32 555 20T540 0H71Q70 0 67 2T59 9",8892:"55 698Q56 708 70 716H540Q554 708 555 698Q555 694 554 691T552 686T549 682T546 680T542 678T539 676H71Q70 676 68 677T65 679T61 682T58 686T56 691T55 698ZM555 18Q554 12 549 6T536 0H535Q525 0 515 17T459 132Q430 194 410 235L305 455L199 233Q176 185 147 125T105 36T90 7Q85 0 75 0Q63 0 58 11Q55 15 55 21Q58 31 170 266T285 507Q295 522 305 522T320 515Q322 513 439 268L555 24V18",8896:"119 -249T97 -249T65 -235T55 -207Q55 -201 56 -198Q58 -190 218 268T380 729Q392 750 416 750Q438 750 451 732Q453 728 534 498T695 36L775 -194Q777 -204 777 -208Q777 -222 767 -235T735 -249Q713 -249 700 -231Q696 -225 557 177L416 579L276 177Q136 -226 132 -231Q119 -249 97 -249",8897:"55 708Q55 729 68 739T96 750Q119 750 132 731Q136 726 276 323L416 -79L557 323Q696 725 700 731Q713 749 735 749Q756 749 766 736T777 708Q777 700 696 466T533 1T451 -232Q436 -249 416 -249Q402 -249 391 -241Q384 -236 380 -226Q368 -198 219 230Q55 697 55 708",8898:"139 -217Q127 -241 114 -246Q106 -249 97 -249Q67 -249 57 -220Q55 -214 55 102Q55 152 55 221T54 312Q54 422 60 464T91 554Q120 612 165 654T257 714T337 741T392 749Q393 750 402 750Q414 750 422 749Q557 749 660 659T776 430Q777 422 777 102Q777 -214 775 -220Q765 -249 735 -249Q716 -249 708 -241T694 -217L692 428L690 441Q674 540 597 603T416 666H409Q388 666 364 662T294 638T212 581Q156 523 142 441L140 428L139 105V-217",8899:"96 750Q103 750 109 748T120 744T127 737T133 730T137 723T139 718V395L140 73L142 60Q159 -43 237 -104T416 -166Q521 -166 597 -103T690 60L692 73L694 718Q708 749 735 749Q765 749 775 720Q777 714 777 398Q777 78 776 71Q766 -51 680 -140Q571 -249 416 -249H411Q261 -249 152 -140Q66 -51 56 71Q55 78 55 398Q55 714 57 720Q60 734 70 740Q80 750 96 750",8900:"242 486Q245 488 250 488Q256 488 258 486Q262 484 373 373T486 258T488 250T486 242T373 127T258 14Q256 12 250 12Q245 12 242 14Q237 16 127 126T14 242Q12 245 12 250T14 258Q16 263 126 373T242 486ZM439 250L250 439L61 250L250 61L439 250",8901:"78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250",8902:"210 282Q210 284 225 381T241 480Q241 484 245 484Q249 486 251 486Q258 486 260 477T272 406Q275 390 276 380Q290 286 290 282L388 299Q484 314 487 314H488Q497 314 497 302Q497 297 434 266Q416 257 404 251L315 206L361 118Q372 98 383 75T401 40L407 28Q407 16 395 16Q394 16 392 16L390 17L250 159L110 17L108 16Q106 16 105 16Q93 16 93 28L99 40Q105 52 116 75T139 118L185 206L96 251Q6 296 4 300Q3 301 3 302Q3 314 12 314H13Q16 314 112 299L210 282",8903:"366 543Q374 545 382 545Q405 545 419 538Q429 534 443 521T462 496Q466 478 466 467Q466 438 444 412Q422 390 388 390Q352 390 331 412Q311 434 311 467Q311 499 331 518Q345 533 366 543ZM146 472Q146 479 153 485T166 492Q171 492 187 476T279 385L386 278L495 385Q600 492 608 492Q615 492 621 486T628 472Q628 467 614 452T531 367L435 270H706Q720 256 720 250Q720 241 706 230H435L531 132Q600 63 614 48T628 27Q628 20 622 14T608 7Q600 7 495 114L386 221L279 114Q204 39 188 23T166 7Q159 7 153 13T146 27Q146 32 160 47T244 132L339 230H68Q55 243 55 250Q55 255 68 270H339L244 367Q175 436 161 451T146 472ZM466 34Q466 4 447 -20T388 -44Q353 -44 331 -22Q311 1 311 34Q311 66 331 85Q347 101 366 110Q374 112 382 112Q405 112 419 105Q429 100 443 87T462 63Q466 45 466 34",8904:"833 50T833 250T832 450T659 351T487 250T658 150T832 50Q833 50 833 250ZM873 10Q866 -5 854 -5Q851 -5 845 -3L449 226L260 115Q51 -5 43 -5Q39 -5 35 -1T28 7L26 11V489Q33 505 43 505Q51 505 260 385L449 274L845 503Q851 505 853 505Q866 505 873 490V10ZM412 250L67 450Q66 450 66 250T67 50Q69 51 240 150T412 250",8905:"146 479Q159 492 166 492Q171 492 189 475T279 386L386 279L495 386Q598 492 608 492Q615 492 621 486T628 472Q628 464 522 357L415 250L522 144Q628 37 628 28Q628 21 622 15T608 8Q599 8 495 115L386 221L279 115Q204 40 188 24T166 8Q162 8 160 9T153 15T146 21V479ZM186 77L359 250L186 424V77",8906:"146 472Q146 479 152 485T166 492Q171 492 189 475T279 386L386 279L495 386Q598 492 608 492Q615 492 628 479V21Q615 8 608 8Q599 8 495 115L386 221L279 115Q204 40 188 24T166 8Q159 8 153 14T146 28Q146 37 253 144L359 250L253 357Q146 464 146 472ZM588 77V424L499 337L415 250L588 77",8907:"55 674Q55 682 62 688T76 694H77Q83 694 100 677T208 561Q320 440 410 342Q462 286 541 201Q677 55 699 30T722 -2Q722 -9 716 -15T701 -22T688 -17Q687 -15 542 141T394 301L388 306L240 146Q119 15 101 -3T75 -22T61 -16T55 -2Q55 4 67 19T158 117Q190 151 209 172L361 336L209 500Q62 657 57 667Q55 671 55 674",8908:"84 -22T76 -22T62 -16T55 -2Q55 4 78 30T249 215Q321 293 367 342Q672 672 683 682Q695 694 702 694Q710 694 716 688T722 674Q722 668 710 653T619 555Q587 521 568 500L416 336L568 172Q715 15 720 5Q722 1 722 -2Q722 -9 716 -15T702 -22H700Q693 -22 671 1T537 146L389 306Q387 304 340 253T237 143T135 33L89 -17Q84 -22 76 -22",8909:"56 433Q56 464 71 464Q74 464 77 461Q82 454 82 438T91 397T123 347Q166 307 222 307Q264 307 308 331T386 385T465 438T556 463Q631 463 676 408T722 283Q722 250 708 250Q704 250 699 257Q695 265 693 286T682 330Q670 350 655 367Q612 407 556 407Q514 407 470 383T393 329T314 276T222 251Q148 251 102 306T56 433ZM57 56Q57 71 73 76H706Q722 70 722 56Q722 44 707 36H71Q57 43 57 56",8910:"83 558Q83 566 89 572T104 578Q108 578 116 577T146 570T190 555T239 526T286 480Q308 453 325 420T351 358T367 304T376 265T380 251T381 253Q381 262 395 312Q428 434 492 499T642 576Q654 578 655 578Q664 578 670 572T676 558Q676 543 657 540T599 524T525 476Q406 362 400 29V8Q400 -21 380 -21Q369 -21 362 -11Q360 -7 360 12Q360 115 348 200T308 360T231 480T111 537Q83 540 83 558",8911:"104 -22Q95 -22 89 -16T83 -2Q83 11 98 16T135 23T192 46T256 103Q360 233 360 549Q360 554 360 557T361 563T362 567T364 569T367 572T371 576Q377 578 380 578Q401 578 401 547Q401 543 401 537T400 527Q409 53 648 19Q676 16 676 -2Q676 -10 670 -16T655 -22Q654 -22 642 -20Q556 -9 492 56T395 244Q381 294 381 303Q381 305 380 305T374 275T352 201T310 110T234 27T117 -20Q105 -22 104 -22",8912:"84 250Q84 372 166 450T360 539Q361 539 370 539T395 539T430 540T475 540T524 540H679Q694 532 694 520Q694 511 681 501L522 500H470H441Q366 500 338 496T266 472Q244 461 224 446T179 404T139 337T124 250V245Q124 157 185 89Q244 25 328 7Q348 2 366 2T522 0H681Q694 -10 694 -20Q694 -32 679 -40H526Q510 -40 480 -40T434 -41Q350 -41 289 -25T172 45Q84 127 84 250ZM694 134Q694 123 679 114H425H384Q350 114 326 121T277 154Q238 193 238 251Q238 322 295 361Q318 378 339 382T412 387Q423 387 459 387T520 386H679Q694 377 694 366Q694 354 679 346H519Q493 346 458 346T411 347Q360 347 341 342T303 315Q278 287 278 250Q278 210 301 187T351 156Q358 154 519 154H679Q694 146 694 134",8913:"83 520Q83 532 98 540H251Q267 540 297 540T343 541Q427 541 488 525T605 455Q693 374 693 250Q693 165 650 99T545 0T415 -39Q407 -40 251 -40H98Q83 -32 83 -20Q83 -10 96 0H255H308H337Q412 0 439 4T512 28Q533 39 553 54T599 96T639 163T654 250Q654 341 592 411Q557 449 512 472Q468 491 439 495T335 500H306H255L96 501Q83 511 83 520ZM83 366Q83 376 96 386H244Q280 386 317 386T378 386L402 387Q456 387 498 348T540 250Q540 203 512 168T446 120Q427 114 353 114H99Q84 120 84 134Q84 147 98 154H258Q284 154 319 154T366 153Q416 153 436 158T474 185Q500 214 500 250Q500 290 477 313T426 344Q419 346 258 346H98Q83 354 83 366",8914:"88 -21T75 -21T55 -7V200Q55 231 55 280Q56 414 60 428Q61 430 61 431Q77 500 152 549T332 598Q443 598 522 544T610 405Q611 399 611 194V-7Q604 -22 591 -22Q582 -22 572 -9L570 405Q563 433 556 449T529 485Q498 519 445 538T334 558Q251 558 179 518T96 401Q95 396 95 193V-7Q88 -21 75 -21ZM229 -21H227Q215 -21 209 -7V166Q209 304 209 327T215 363Q226 398 259 421T333 444Q380 444 414 416T455 347Q457 339 457 166V-7Q449 -21 439 -21H437H435Q423 -21 417 -7V164Q417 303 417 325T411 358Q387 403 333 403T255 358Q250 347 250 325T249 164V-7Q241 -21 231 -21H229",8915:"591 598H592Q604 598 611 583V376Q611 345 611 296Q610 162 606 148Q605 146 605 145Q586 68 507 23T333 -22Q268 -22 209 -1T106 66T56 173Q55 180 55 384L56 585Q66 598 75 598Q85 598 95 585V378L96 172L98 162Q112 95 181 57T332 18Q415 18 487 58T570 175Q571 180 571 383V583Q579 598 591 598ZM437 598Q450 598 457 583V410Q457 237 455 229Q448 189 414 161T333 132Q291 132 255 157T211 230Q209 237 209 412L210 585Q220 598 229 598Q242 598 249 583V412Q249 273 249 251T255 218Q279 173 333 173T411 218Q416 229 416 251T417 412V583Q425 598 437 598",8916:"76 -22Q64 -22 56 -7V176L57 360L59 370Q66 401 83 426T123 468T171 495T221 513T265 522T298 527L311 528H314V625L315 723Q325 736 334 736Q346 736 354 721V528H356L368 527Q380 526 399 523T441 515T490 498T537 472T578 433T606 379Q611 359 611 171V-7Q604 -21 591 -21T571 -7V170Q571 313 571 337T565 375Q555 408 526 432T461 467T402 482T365 487H354V-7Q347 -21 334 -21T314 -7V487H303Q251 484 207 467Q121 438 99 367L97 357L96 174V-9Q86 -22 76 -22",8918:"86 261Q92 267 381 404T673 541Q680 541 686 535T693 521T689 510Q684 504 418 379L151 250L418 121Q686 -4 689 -10Q693 -14 693 -21T687 -34T675 -41Q668 -41 380 96T86 239Q82 244 82 250Q82 257 86 261ZM610 250Q610 224 592 198T531 172Q498 172 475 195Q453 214 453 250Q453 308 513 328Q515 330 535 330Q569 328 589 304T610 250",8919:"82 521Q82 529 89 535T100 541Q107 541 395 404T689 261Q693 257 693 250T689 239Q684 234 396 97T100 -41Q95 -41 89 -35T82 -21Q82 -12 96 -4Q118 9 358 121L624 250L358 379Q91 503 86 510Q82 514 82 521ZM165 250Q165 282 188 306T239 330Q262 330 275 323Q303 312 318 283Q322 272 322 250Q322 213 300 195Q277 172 246 172Q224 172 213 177Q165 200 165 250",8920:"639 -48Q639 -54 634 -60T619 -67H618Q612 -67 536 -26Q430 33 329 88Q61 235 59 239Q56 243 56 250T59 261Q62 266 336 415T615 567L619 568Q622 567 625 567Q639 562 639 548Q639 540 633 534Q632 532 374 391L117 250L374 109Q632 -32 633 -34Q639 -40 639 -48ZM958 -48Q958 -54 953 -60T938 -67H937Q931 -67 855 -26Q749 33 648 88Q380 235 378 239Q375 243 375 250T378 261Q381 266 655 415T934 567L938 568Q941 567 944 567Q958 562 958 548Q958 540 952 534Q951 532 693 391L436 250L693 109Q951 -32 952 -34Q958 -40 958 -48ZM1277 -48Q1277 -54 1272 -60T1257 -67H1256Q1250 -67 1174 -26Q1068 33 967 88Q699 235 697 239Q694 243 694 250T697 261Q700 266 974 415T1253 567L1257 568Q1260 567 1263 567Q1277 562 1277 548Q1277 540 1271 534Q1270 532 1012 391L755 250L1012 109Q1270 -32 1271 -34Q1277 -40 1277 -48",8921:"75 -67Q65 -67 60 -61T55 -48Q55 -40 61 -34Q62 -32 329 109L595 250L329 391Q62 532 61 534Q55 540 55 548Q55 562 69 567H77Q81 567 222 493T506 342T653 264Q667 250 653 236Q649 234 504 157T220 7T77 -67H75ZM364 547Q364 563 381 567L384 568Q387 568 518 499T795 353T955 269Q967 261 967 250T955 231Q925 216 780 139T513 -3T383 -67Q373 -67 369 -60T364 -47Q364 -40 370 -34Q373 -31 639 109L904 250L639 391Q373 531 370 534Q364 540 364 547ZM674 538T674 548T681 562T693 567Q699 567 816 505Q915 453 993 412Q1050 382 1132 339Q1241 282 1259 271T1277 250Q1277 241 1263 232Q1246 221 985 84Q698 -67 692 -67Q674 -67 674 -47Q674 -38 680 -33Q683 -30 947 109L1213 250L947 391Q683 530 680 533Q674 538 674 548",8922:"674 445Q674 438 669 432T655 425T369 531T90 640Q83 645 83 655Q83 668 95 673Q644 886 654 886Q662 886 668 880T674 866Q674 856 663 850Q649 843 411 751L160 655L407 560Q474 534 561 501Q646 469 660 462T674 445ZM84 250Q84 260 99 270H658Q674 264 674 250Q674 238 659 230H98Q84 237 84 250ZM83 55Q83 68 94 73Q98 76 104 76Q108 75 383 -30T664 -138Q674 -144 674 -155Q674 -165 667 -170Q664 -173 385 -279T104 -386Q85 -386 83 -368Q83 -354 92 -349Q93 -349 347 -251L597 -155L346 -59Q296 -40 223 -12Q118 28 101 36T83 55",8923:"111 425T102 425T88 431T83 445V446Q83 455 96 461Q111 469 203 504Q287 536 350 560L597 655L346 751Q94 848 92 850Q83 856 83 866Q83 873 88 879T104 886Q109 885 386 779T667 670Q674 665 674 655T667 640Q665 638 388 532ZM84 250Q84 260 99 270H658Q674 264 674 250Q674 238 659 230H98Q84 237 84 250ZM653 76Q656 76 660 75T669 68T674 56Q674 46 665 40Q663 38 411 -59L160 -155L410 -251Q664 -349 665 -349Q674 -354 674 -368Q672 -386 654 -386Q650 -386 371 -279T90 -170Q83 -165 83 -155Q83 -144 93 -138Q645 76 653 76",8926:"113 424Q83 424 83 444Q83 453 96 464H121Q181 466 234 474T341 501T435 545T505 613T542 707Q545 734 564 734Q583 731 583 714Q583 658 560 613T500 538T414 486T321 453T229 434T156 426T113 424ZM112 270Q83 270 83 290Q83 301 94 307Q98 310 118 310Q624 310 653 556Q657 580 675 580Q693 577 693 559V552Q684 472 628 410T465 314Q436 303 372 290Q373 290 388 287T425 278T465 266Q674 199 693 28L694 17L692 14Q691 11 689 8T683 3T673 0Q657 0 653 24Q623 270 118 270H112",8927:"195 713Q195 725 201 729T214 734Q227 734 231 722T238 691T255 641T299 580Q405 474 656 464H681Q694 451 694 443Q694 424 670 424H664Q535 424 415 465T235 595Q195 657 195 713ZM668 310Q694 310 694 290Q694 285 691 279Q684 271 664 270Q550 268 464 257T301 220T179 146T124 27Q119 0 103 0T83 16Q83 21 83 31T92 68T113 121T157 177T229 231Q295 268 405 290Q404 290 389 293T352 302T312 314Q138 371 96 500Q83 541 83 562Q83 568 89 574T103 580Q115 580 120 570T126 542T138 497T173 442Q289 310 659 310H668",8928:"82 344Q82 349 95 364H124Q266 364 398 390L429 397L509 595Q519 619 536 659Q581 766 590 783T609 801Q616 801 622 795T629 781Q629 776 553 595Q533 548 516 506T489 439T480 415Q482 415 505 426T538 444Q632 498 651 601Q654 621 658 628T673 635Q680 635 686 629T693 615Q693 591 678 546Q636 433 484 375L458 364L451 348Q443 332 443 329T455 324Q480 316 503 307T560 277T619 233T664 170T691 86Q693 68 691 64Q684 53 672 53Q664 53 658 59Q657 60 650 97T617 174T538 244Q515 257 476 273T428 289Q425 289 412 256Q381 179 344 90L262 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L464 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 174 -213T202 -143H95Q82 -128 82 -123T95 -103H220L302 97Q384 288 384 299Q384 302 341 308T235 319T124 324H95Q82 337 82 344ZM399 338Q403 338 406 346L409 353L375 344Q375 343 384 341T399 338",8929:"146 -283Q146 -282 174 -213T202 -143H95Q82 -127 82 -123T95 -103H220L300 93Q343 196 374 270Q385 294 386 299L373 295Q331 287 289 268Q241 249 208 224T159 174T135 127T124 85T118 59Q112 53 103 53Q91 53 84 64Q82 68 84 86Q96 185 174 248T375 337L400 344Q399 344 381 348T351 355T316 364T276 379T235 398T193 424T155 456T122 497T98 546Q82 587 82 615Q82 622 88 628T102 635Q112 635 116 628T124 601Q128 579 134 562T159 515T207 463T290 418T415 384L422 381L506 586Q571 744 584 772T609 801Q616 801 622 795T629 781T544 577Q525 529 504 478T473 402T462 375Q480 373 500 373Q579 364 651 364H680Q682 361 686 357T691 351T693 344Q693 337 680 324H651Q553 324 451 310L433 308L349 104L262 -101L473 -103H682Q694 -115 694 -123Q694 -133 682 -141L464 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283",8934:"86 450Q93 455 380 592T673 730Q680 730 686 724T693 710Q693 702 688 699Q686 693 417 568L151 439L417 310Q685 185 688 179Q693 176 693 168Q693 161 687 155T675 148Q668 148 380 285T86 428Q74 438 86 450ZM55 -205Q55 -175 64 -142T92 -76T145 -22T222 -1Q288 -1 362 -66Q369 -72 372 -75T378 -79T382 -81T384 -79Q389 -74 439 21Q483 100 490 111T504 122Q510 122 518 118T526 103Q526 101 510 69T467 -12T419 -99L413 -112L433 -128Q498 -180 553 -180Q605 -180 646 -139Q672 -112 681 -77T693 -21T706 -1Q719 -1 719 -33Q719 -39 717 -57Q708 -141 655 -190Q625 -224 586 -232Q568 -237 551 -237Q487 -237 413 -172L391 -155Q391 -157 335 -255Q297 -325 286 -342T268 -359Q260 -359 254 -353T248 -339T304 -230L359 -126Q359 -124 337 -107T302 -81Q262 -57 221 -57Q170 -57 130 -93T84 -201Q82 -236 70 -236Q55 -236 55 -205",8935:"88 723Q95 730 99 730Q106 730 394 593T688 450Q693 447 693 439T688 428Q683 423 395 286T99 148Q94 148 88 155T82 168Q82 175 86 179Q89 184 357 310L624 439L357 568Q88 694 86 699Q81 703 81 711T88 723ZM55 -205Q55 -175 64 -142T92 -76T145 -22T222 -1Q288 -1 362 -66Q369 -72 372 -75T378 -79T382 -81T384 -79Q389 -74 439 21Q483 100 490 111T504 122Q510 122 518 118T526 103Q526 101 510 69T467 -12T419 -99L413 -112L433 -128Q498 -180 553 -180Q605 -180 646 -139Q672 -112 681 -77T693 -21T706 -1Q719 -1 719 -33Q719 -39 717 -57Q708 -141 655 -190Q625 -224 586 -232Q568 -237 551 -237Q487 -237 413 -172L391 -155Q391 -157 335 -255Q297 -325 286 -342T268 -359Q260 -359 254 -353T248 -339T304 -230L359 -126Q359 -124 337 -107T302 -81Q262 -57 221 -57Q170 -57 130 -93T84 -201Q82 -236 70 -236Q55 -236 55 -205",8936:"95 419Q81 433 81 439T95 459H124Q318 459 455 501Q515 521 556 550T615 607T641 659T652 702T659 725Q667 730 673 730Q680 730 686 724T693 710Q693 682 677 641Q668 616 654 594T622 554T586 522T545 497T504 477T464 462T428 452T397 444T375 439Q379 437 410 430T476 411T551 379T625 321T677 237Q693 196 693 168Q693 161 687 155T673 148Q662 148 658 154T651 181Q638 253 591 300T455 377Q318 419 124 419H95ZM55 -205Q55 -175 64 -142T92 -76T145 -22T222 -1Q288 -1 362 -66Q369 -72 372 -75T378 -79T382 -81T384 -79Q389 -74 439 21Q483 100 490 111T504 122Q510 122 518 118T526 103Q526 101 510 69T467 -12T419 -99L413 -112L433 -128Q498 -180 553 -180Q605 -180 646 -139Q672 -112 681 -77T693 -21T706 -1Q719 -1 719 -33Q719 -39 717 -57Q708 -141 655 -190Q625 -224 586 -232Q568 -237 551 -237Q487 -237 413 -172L391 -155Q391 -157 335 -255Q297 -325 286 -342T268 -359Q260 -359 254 -353T248 -339T304 -230L359 -126Q359 -124 337 -107T302 -81Q262 -57 221 -57Q170 -57 130 -93T84 -201Q82 -236 70 -236Q55 -236 55 -205",8937:"679 459Q693 445 693 439Q693 430 679 419H651Q455 419 319 377Q231 347 184 300T124 181Q120 161 116 155T102 148Q95 148 89 154T82 168Q82 192 97 237Q111 275 137 306T188 355T249 391T307 414T361 429T399 439Q397 440 364 447T298 467T224 499T149 557T97 641Q82 686 82 710Q82 717 88 723T102 730L115 725Q118 722 124 697Q137 625 184 578T319 501Q456 459 651 459H679ZM55 -205Q55 -175 64 -142T92 -76T145 -22T222 -1Q288 -1 362 -66Q369 -72 372 -75T378 -79T382 -81T384 -79Q389 -74 439 21Q483 100 490 111T504 122Q510 122 518 118T526 103Q526 101 510 69T467 -12T419 -99L413 -112L433 -128Q498 -180 553 -180Q605 -180 646 -139Q672 -112 681 -77T693 -21T706 -1Q719 -1 719 -33Q719 -39 717 -57Q708 -141 655 -190Q625 -224 586 -232Q568 -237 551 -237Q487 -237 413 -172L391 -155Q391 -157 335 -255Q297 -325 286 -342T268 -359Q260 -359 254 -353T248 -339T304 -230L359 -126Q359 -124 337 -107T302 -81Q262 -57 221 -57Q170 -57 130 -93T84 -201Q82 -236 70 -236Q55 -236 55 -205",8938:"693 -30Q686 -41 673 -41Q661 -41 506 34L346 110L280 -44Q228 -162 216 -185T193 -208Q177 -208 173 -192Q173 -186 242 -30T311 128Q271 145 184 186T86 236Q82 240 82 246Q82 251 86 259Q96 267 271 350L449 434L506 565Q537 635 551 664T571 700T582 706Q587 706 593 701T600 690Q600 679 553 572Q504 463 504 461L586 501Q672 539 673 539Q679 539 693 525V-30ZM653 10V488L566 445L480 405L422 276Q415 260 405 236T388 199T376 171T368 151T366 145Q368 143 510 77T653 10ZM422 374Q422 376 420 376T285 313T151 248Q315 168 326 163Q415 356 422 374",8939:"82 525Q96 539 102 539Q103 539 122 530T186 501T266 463L426 388Q428 388 495 541Q564 694 569 699Q573 706 581 706Q587 706 593 702T600 691Q600 676 533 528Q515 486 506 465T485 418T470 381T466 370Q466 369 575 316Q676 269 689 259Q693 253 693 248Q693 242 689 236Q688 235 506 145Q328 63 324 59Q324 50 266 -70Q224 -169 214 -188T193 -208Q177 -208 173 -192Q173 -183 222 -77Q244 -29 257 2T269 34L186 -6Q108 -43 99 -43Q93 -43 82 -30V525ZM271 416Q129 485 126 485H125Q122 485 122 250Q122 10 124 10L211 50L295 92L411 350Q411 351 271 416ZM624 248L449 332L440 319Q434 297 393 214Q353 121 353 119Q355 119 489 182T624 248",8940:"82 -123Q82 -114 93 -103H166L238 -101L293 50Q349 200 349 204L220 266Q166 291 140 304T100 325T84 336T82 344Q82 353 94 360Q112 372 282 453L473 541L482 568Q487 578 529 693Q559 785 569 795Q573 802 581 802Q587 802 593 797T599 786Q599 775 564 675L526 570Q526 568 561 584T633 617T673 635Q679 635 693 621V66Q686 54 679 54Q665 54 526 119Q491 137 458 153T405 177T386 184Q385 182 334 42T282 -101T482 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L473 -143H266L238 -219Q217 -278 210 -290T193 -303Q178 -303 173 -287Q173 -279 198 -214L222 -145Q222 -143 158 -143L93 -141L86 -136Q82 -131 82 -123ZM653 106V584L506 513L453 370Q442 339 428 300T407 243T400 224Q403 222 527 164T653 106ZM453 486Q453 488 451 488T300 417T151 344L224 308Q247 298 285 279T331 257L364 241L453 486",8941:"82 621Q96 635 102 635T249 568L420 486L449 473L469 533Q563 789 569 797Q573 801 581 801Q598 801 600 786Q602 781 544 617L484 455Q531 435 584 408Q677 364 689 355Q693 351 693 344Q693 339 692 337T676 325T631 302T538 257Q504 241 465 223T406 195T386 186Q384 184 333 44T282 -101Q282 -103 482 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L473 -143H266L238 -219Q217 -278 210 -290T193 -303Q178 -303 173 -287Q173 -279 198 -214L222 -145Q222 -143 158 -143L93 -141L86 -136Q82 -131 82 -123Q82 -114 93 -103H166L238 -101L333 159Q326 159 220 106Q110 54 97 54Q89 54 82 66V621ZM298 501Q155 567 142 575L122 584V344Q122 106 124 106Q125 106 180 132T291 185T351 213Q355 217 393 326L433 435Q433 436 298 501ZM549 381Q472 417 471 417L406 241Q408 240 516 291T624 344L549 381",8942:"78 30Q78 54 95 72T138 90Q162 90 180 74T199 31Q199 6 182 -12T139 -30T96 -13T78 30ZM78 440Q78 464 95 482T138 500Q162 500 180 484T199 441Q199 416 182 398T139 380T96 397T78 440ZM78 840Q78 864 95 882T138 900Q162 900 180 884T199 841Q199 816 182 798T139 780T96 797T78 840",8943:"78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250ZM525 250Q525 274 542 292T585 310Q609 310 627 294T646 251Q646 226 629 208T586 190T543 207T525 250ZM972 250Q972 274 989 292T1032 310Q1056 310 1074 294T1093 251Q1093 226 1076 208T1033 190T990 207T972 250",8945:"133 760Q133 784 150 802T193 820Q217 820 235 804T254 761Q254 736 237 718T194 700T151 717T133 760ZM580 460Q580 484 597 502T640 520Q664 520 682 504T701 461Q701 436 684 418T641 400T598 417T580 460ZM1027 160Q1027 184 1044 202T1087 220Q1111 220 1129 204T1148 161Q1148 136 1131 118T1088 100T1045 117T1027 160",8965:"55 698Q56 708 70 716H540Q554 708 555 698Q555 694 554 691T552 686T549 682T546 680T542 678T539 676H71Q70 676 68 677T65 679T61 682T58 686T56 691T55 698ZM555 18Q554 12 549 6T536 0H535Q525 0 515 17T459 132Q430 194 410 235L305 455L199 233Q176 185 147 125T105 36T90 7Q85 0 75 0Q63 0 58 11Q55 15 55 21Q58 31 170 266T285 507Q295 522 305 522T320 515Q322 513 439 268L555 24V18",8966:"55 795Q56 806 70 813H540Q554 806 555 795Q555 791 554 788T552 783T549 779T546 777T542 775T539 773H71Q70 773 68 774T65 776T61 779T58 783T56 788T55 795ZM55 601Q56 612 70 619H540Q554 612 555 601Q555 597 554 594T552 589T549 585T546 583T542 581T539 579H71Q70 579 68 580T65 582T61 585T58 589T56 594T55 601ZM75 -97Q67 -97 61 -91T55 -81Q55 -71 169 166T285 410Q295 425 305 425Q311 425 316 422T323 414L325 410Q327 404 441 167T555 -81Q555 -85 549 -91T535 -97T520 -90Q519 -89 506 -61T463 27T411 136L305 358L199 136Q167 71 129 -10Q98 -75 92 -86T75 -97",8968:"174 734Q178 746 190 750H298H369Q400 750 411 747T422 730T411 713T372 709Q365 709 345 709T310 710H214V-235Q206 -248 196 -250Q192 -250 189 -249T184 -247T180 -244T178 -241T176 -237T174 -234V734",8969:"21 717T21 730T32 746T75 750H147H256Q266 742 269 735V-235Q262 -248 251 -250Q247 -250 244 -249T239 -247T235 -244T233 -241T231 -237T229 -234V710H133Q119 710 99 710T71 709Q43 709 32 713",8970:"174 734Q174 735 175 737T177 740T180 744T184 747T189 749T196 750Q206 748 214 735V-210H310H373Q401 -210 411 -213T422 -230T411 -247T369 -251Q362 -251 338 -251T298 -250H190Q178 -246 174 -234V734",8971:"229 734Q229 735 230 737T232 740T235 744T239 747T244 749T251 750Q262 748 269 735V-235Q266 -240 256 -249L147 -250H77Q43 -250 32 -247T21 -230T32 -213T72 -209Q79 -209 99 -209T133 -210H229V734",8988:"76 306Q62 306 59 319T55 386V500V596Q55 664 57 676T68 692Q71 694 250 694Q428 694 432 692Q444 685 444 674Q444 665 432 656Q428 654 261 654H95V487Q95 355 95 336T90 312Q84 306 76 306",8989:"424 306Q418 306 413 310T406 318L404 321V654H238Q71 654 68 656Q55 662 55 674T68 692Q71 694 250 694H379Q432 694 438 688Q443 683 443 662T444 500T444 338T438 312Q432 306 424 306",8990:"55 172V287Q55 341 58 353T76 366Q88 366 95 351V18H261Q428 18 432 16Q444 9 444 -2Q444 -11 432 -20Q428 -22 250 -22H120Q67 -22 61 -16Q56 -11 56 10T55 172",8991:"404 351Q410 366 424 366Q437 366 440 353T444 288V172V72Q444 8 443 -4T432 -20Q428 -22 250 -22Q71 -22 68 -20Q55 -14 55 -2T68 16Q71 18 238 18H404V351",8994:"55 141Q55 149 72 174T125 234T209 303T329 360T478 388H526Q649 383 765 319Q814 291 858 250T923 179T944 141Q944 133 938 128T924 122Q914 124 912 125T902 139Q766 328 500 328Q415 328 342 308T225 258T150 199T102 148T84 124Q81 122 75 122Q55 127 55 141",8995:"923 378Q944 378 944 358Q944 345 912 311T859 259Q710 134 500 134Q288 134 140 259Q55 336 55 358Q55 366 61 372T75 378Q78 378 84 376Q86 376 101 356T147 310T221 257T339 212T500 193Q628 193 734 236Q841 282 903 363Q914 378 923 378",9001:"333 -232Q332 -239 327 -244T313 -250Q303 -250 296 -240Q293 -233 202 6T110 250T201 494T296 740Q299 745 306 749L309 750Q312 750 313 750Q331 750 333 732Q333 727 243 489Q152 252 152 250T243 11Q333 -227 333 -232",9002:"55 732Q56 739 61 744T75 750Q85 750 92 740Q95 733 186 494T278 250T187 6T92 -240Q85 -250 75 -250Q67 -250 62 -245T55 -232Q55 -227 145 11Q236 248 236 250T145 489Q55 727 55 732",9136:"357 741V726Q357 720 349 715Q261 655 242 539Q240 526 240 454T239 315T239 247Q240 235 240 124V40Q240 -17 233 -53T201 -130Q155 -206 78 -244H69H64Q58 -244 57 -243T56 -234Q56 -232 56 -231V-225Q56 -218 63 -215Q153 -153 170 -39Q172 -25 173 119V219Q173 245 174 249Q173 258 173 376V460Q173 515 178 545T201 611Q244 695 327 741L334 744H354L357 741",9137:"78 744Q153 706 196 640T239 492V376Q239 341 239 314T238 271T238 253Q239 251 239 223V119V49Q239 -39 254 -85Q263 -111 275 -134T301 -172T326 -197T346 -213T356 -221T357 -232V-241L354 -244H334Q264 -209 222 -146T174 -12Q173 -6 173 95Q173 134 173 191T174 250Q173 258 173 382V451Q173 542 159 585Q145 626 120 658T75 706T56 723V731Q56 741 57 742T66 744H78",9168:"312 0V602H355V0H312",9416:"451 -175Q328 -175 226 -115T66 47T8 267Q8 303 15 342T39 431T94 531T186 622Q239 663 307 686T424 709H440Q604 709 716 622Q757 592 788 555T838 482T869 414T886 350T892 301T894 267Q894 147 835 45T674 -116T451 -175ZM854 268Q854 375 802 467T657 614T450 670Q283 670 166 552T49 267Q49 99 167 -18T453 -136Q617 -136 735 -18T854 268ZM273 378Q273 430 309 474T409 527Q411 527 417 527T428 528Q498 528 549 484L567 505Q583 528 590 528H594Q600 528 606 522V350L600 344H586Q577 344 574 344T569 347T566 357Q542 491 432 491Q389 491 365 465T340 407Q340 391 344 378T358 356T377 340T400 328T421 321T443 316T459 313Q499 305 517 300T559 279T601 238Q629 195 629 148Q629 80 583 33T471 -14Q392 -14 330 30Q312 6 293 -13Q292 -14 285 -14Q279 -14 273 -8V77V138Q273 160 275 165T286 170H294H307Q313 164 313 158Q313 108 350 67T471 26Q512 26 537 54T562 119Q562 137 558 151T544 176T527 193T504 205T483 212T459 218T441 222Q391 232 368 241T318 273Q273 316 273 378",9484:"76 306Q62 306 59 319T55 386V500V596Q55 664 57 676T68 692Q71 694 250 694Q428 694 432 692Q444 685 444 674Q444 665 432 656Q428 654 261 654H95V487Q95 355 95 336T90 312Q84 306 76 306",9488:"424 306Q418 306 413 310T406 318L404 321V654H238Q71 654 68 656Q55 662 55 674T68 692Q71 694 250 694H379Q432 694 438 688Q443 683 443 662T444 500T444 338T438 312Q432 306 424 306",9492:"55 172V287Q55 341 58 353T76 366Q88 366 95 351V18H261Q428 18 432 16Q444 9 444 -2Q444 -11 432 -20Q428 -22 250 -22H120Q67 -22 61 -16Q56 -11 56 10T55 172",9496:"404 351Q410 366 424 366Q437 366 440 353T444 288V172V72Q444 8 443 -4T432 -20Q428 -22 250 -22Q71 -22 68 -20Q55 -14 55 -2T68 16Q71 18 238 18H404V351",9585:"19 -195Q13 -195 7 -188T0 -176Q0 -169 18 -151L822 683Q835 694 840 694T852 688T860 674Q860 667 810 614T460 252Q57 -167 44 -179Q27 -195 19 -195",9586:"0 675Q0 681 6 687T19 694Q27 694 44 678L460 247Q759 -62 809 -115T860 -175Q860 -183 852 -189T840 -195Q835 -195 822 -184L18 649Q0 667 0 675",9632:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71",9633:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM682 40V649H95V40H682",9642:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71",9650:"99 -20Q84 -11 84 0Q84 5 148 145T278 424L342 563Q347 575 360 575Q368 575 375 570Q376 569 441 430T571 148T637 0Q637 -11 622 -20H99",9651:"75 0L72 2Q69 3 67 5T62 11T59 20Q59 24 62 30Q65 37 245 370T428 707Q428 708 430 710T436 714T444 716Q451 716 455 712Q459 710 644 368L828 27V20Q828 7 814 0H75ZM610 347L444 653Q443 653 278 347T113 40H775Q775 42 610 347",9652:"99 -20Q84 -11 84 0Q84 5 148 145T278 424L342 563Q347 575 360 575Q368 575 375 570Q376 569 441 430T571 148T637 0Q637 -11 622 -20H99",9653:"75 0L72 2Q69 3 67 5T62 11T59 20Q59 24 62 30Q65 37 245 370T428 707Q428 708 430 710T436 714T444 716Q451 716 455 712Q459 710 644 368L828 27V20Q828 7 814 0H75ZM610 347L444 653Q443 653 278 347T113 40H775Q775 42 610 347",9654:"83 523Q83 524 85 527T92 535T103 539Q107 539 389 406T680 268Q694 260 694 249Q694 239 687 234Q685 232 395 95L107 -41H101Q90 -40 83 -26V523",9656:"83 523Q83 524 85 527T92 535T103 539Q107 539 389 406T680 268Q694 260 694 249Q694 239 687 234Q685 232 395 95L107 -41H101Q90 -40 83 -26V523",9657:"26 489Q33 505 43 505Q51 505 260 385Q464 266 471 259Q473 257 473 250Q473 242 469 239Q459 231 260 115Q51 -5 43 -5Q39 -5 35 -1T28 7L26 11V489ZM412 250L67 450Q66 450 66 250T67 50Q69 51 240 150T412 250",9660:"84 556Q84 567 99 576H622Q637 567 637 556Q637 551 572 409T441 127T375 -14Q368 -19 360 -19H358Q349 -19 342 -7T296 92Q249 193 211 275Q84 550 84 556",9661:"59 480Q59 485 61 489T66 495T72 498L75 500H814Q828 493 828 480V474L644 132Q458 -210 455 -212Q451 -215 444 -215T433 -212Q429 -210 342 -49T164 282T64 466Q59 478 59 480ZM775 460H113Q113 459 278 153T444 -153T610 153T775 460",9662:"84 556Q84 567 99 576H622Q637 567 637 556Q637 551 572 409T441 127T375 -14Q368 -19 360 -19H358Q349 -19 342 -7T296 92Q249 193 211 275Q84 550 84 556",9663:"59 480Q59 485 61 489T66 495T72 498L75 500H814Q828 493 828 480V474L644 132Q458 -210 455 -212Q451 -215 444 -215T433 -212Q429 -210 342 -49T164 282T64 466Q59 478 59 480ZM775 460H113Q113 459 278 153T444 -153T610 153T775 460",9664:"694 -26Q686 -40 676 -41H670L382 95Q92 232 90 234Q83 239 83 249Q83 262 96 267Q101 270 379 401T665 537Q671 539 674 539Q686 539 694 524V-26",9666:"694 -26Q686 -40 676 -41H670L382 95Q92 232 90 234Q83 239 83 249Q83 262 96 267Q101 270 379 401T665 537Q671 539 674 539Q686 539 694 524V-26",9667:"473 10Q466 -5 454 -5Q451 -5 445 -3Q444 -3 343 56T140 173T35 234Q26 239 26 250T35 266Q40 269 240 384T445 503Q451 505 453 505Q466 505 473 490V10ZM433 50T433 250T432 450T259 351T87 250T258 150T432 50Q433 50 433 250",9674:"318 709Q325 716 332 716Q340 716 344 713T474 511Q611 298 611 292Q611 285 526 152Q494 103 474 72Q347 -128 344 -130Q340 -132 333 -132T322 -130Q319 -128 257 -31T131 169T60 278Q56 285 56 292Q56 298 60 305Q73 326 194 516T318 709ZM567 290T567 291T451 475T333 658L100 293Q100 288 215 108L333 -74Q334 -74 450 108",9711:"56 250Q56 353 95 442T196 589T335 681T491 715Q573 715 635 693Q694 673 747 635T846 543T917 412T944 250Q944 58 815 -78T500 -215Q457 -215 429 -210Q274 -183 165 -56T56 250ZM500 -176Q664 -176 784 -54T904 250Q904 418 799 536T543 674Q534 675 493 675Q425 675 357 647T229 567T133 432T96 250Q96 160 129 80T217 -56T346 -144T500 -176",9723:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM682 40V649H95V40H682",9724:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71",9733:"367 395Q374 416 398 492T442 627T463 688Q463 692 467 692Q471 694 472 694Q478 694 484 680T523 562Q553 469 576 400L577 395H731H819Q872 395 883 394T895 384Q895 380 891 376T832 333Q794 305 767 285Q643 195 643 194L690 47Q737 -96 737 -103Q737 -111 727 -111Q721 -111 594 -18L472 71L350 -18Q223 -111 217 -111Q207 -111 207 -103Q207 -96 254 47L301 194Q301 195 241 239T118 328T51 378Q49 382 49 384Q49 392 58 393T110 395H213H367",9824:"181 -21Q134 -21 96 27T55 193Q55 224 58 247T82 317T143 410Q172 443 234 498Q282 543 314 598T360 687T380 725Q386 727 389 727Q395 727 398 725T406 716T413 702T423 677T439 641Q481 556 544 498Q633 420 678 353T723 204Q723 142 711 94T669 12T590 -21Q520 -21 490 8T459 66V70H409V62Q409 22 416 -17T430 -82T437 -112Q437 -131 407 -131Q403 -131 397 -131T389 -130T382 -130T372 -131Q341 -131 341 -111Q341 -107 348 -82T362 -18T369 62V70H319V66Q319 57 314 44T297 16T257 -10T191 -21H181",9825:"55 490Q55 557 71 604T114 674T167 706T222 716Q279 716 322 684T389 605Q391 610 395 617T414 643T447 677T494 704T555 716Q642 716 682 652T723 490Q723 455 718 426T684 342T602 227Q573 196 537 161T485 110T449 63T412 -8Q408 -22 404 -27T389 -33Q382 -33 379 -31T372 -23T366 -8T355 18T335 54Q319 81 298 104T239 163T176 227Q102 310 79 371T55 490ZM198 674Q143 664 119 613T95 491Q95 415 137 346Q174 282 265 194T384 48L389 39Q391 42 397 54T406 71T415 86T427 104T442 122T464 146T491 172Q571 249 613 303Q683 396 683 487Q683 581 649 631Q613 676 556 676Q495 676 457 634T410 538Q407 514 390 514Q386 514 380 517Q372 520 369 536T355 581T319 635Q277 675 223 675H217H208L204 674Q200 674 198 674",9826:"370 714Q370 717 375 722T388 727Q398 727 403 721T417 697Q420 692 421 689Q536 465 709 304Q723 291 723 282T709 260Q529 93 406 -153Q402 -162 390 -162H389Q379 -162 376 -158T357 -125Q247 89 89 241L64 265Q55 272 55 282Q55 287 57 290T64 300T77 312T98 331T127 361Q197 435 258 523T344 663L370 714ZM655 299Q568 384 508 470T389 662L376 638Q362 613 341 577T289 497T215 399T123 299L105 282L123 265Q210 180 270 94T389 -98L402 -74Q416 -49 437 -13T489 67T563 165T655 265L673 282L655 299",9827:"213 532Q213 615 265 670T389 726Q461 726 513 671T565 532Q565 511 562 492T553 458T541 432T526 409T512 393T498 379L490 371L511 326Q512 326 516 330T528 341T546 353T572 363T606 368Q664 368 707 315T750 174Q750 87 699 33T579 -22Q567 -22 553 -20T517 -10T479 16T459 63V70H409V62Q409 22 416 -17T430 -82T437 -112Q437 -131 407 -131Q403 -131 397 -131T389 -130T382 -130T372 -131Q341 -131 341 -111Q341 -107 348 -82T362 -18T369 62V70H319V63Q315 25 281 2T197 -22Q132 -22 80 32T28 174Q28 255 69 311T175 368Q192 368 207 364T232 353T250 341T262 331T267 326L288 371L280 378Q272 385 267 391T253 407T238 430T226 457T217 492T213 532",9837:"200 467Q254 467 293 428T332 321Q332 147 104 -11L88 -22H75Q62 -22 56 -16L55 362V647Q55 743 60 748Q63 750 76 750H83Q87 750 95 744V434L104 440Q144 467 200 467ZM237 322Q237 360 225 388T183 417Q158 417 134 407T101 378Q96 370 96 349T95 197V34Q152 91 194 167T237 322",9838:"65 721Q78 734 94 734Q100 734 104 727V444L116 449Q129 454 157 465T208 486Q313 527 314 527Q318 527 324 521V-210Q306 -223 294 -223Q289 -223 284 -216V-13L270 -18Q257 -24 231 -34T180 -54Q77 -96 74 -96T65 -90V721ZM104 13Q282 84 283 85Q284 85 284 252Q284 418 283 418L230 396L140 360L104 346V13",9839:"101 -223Q94 -223 93 -217T91 -188V-151Q91 -88 90 -88Q87 -88 80 -92T68 -96Q62 -96 56 -90L55 -50V-22Q55 -8 58 -4T78 5L91 10V177Q91 343 90 343Q87 343 80 339T68 335Q62 335 56 341L55 381V409Q55 423 58 427T78 436L91 441V543V616Q91 643 93 648T106 656Q119 662 126 659Q130 657 130 645T131 554V456L257 503V607L258 710L260 712Q261 715 272 719T286 723Q293 723 295 715T297 671V617Q297 519 298 519Q301 519 307 522T319 526Q327 526 333 521V437L330 435Q328 432 312 427L297 421V254Q297 88 298 88Q301 88 307 91T319 95Q327 95 333 90V6L330 4Q328 1 312 -4L297 -10V-78V-122Q297 -145 295 -149T282 -156Q274 -160 268 -160Q257 -160 257 -130V-89V-25L131 -72V-210Q123 -215 116 -218T104 -222L101 -223ZM257 72V406L131 359V25L257 72",10003:"84 231Q84 244 114 264T170 285Q176 285 183 274T224 205Q267 129 268 129Q271 141 279 163T318 250T389 378T502 523T662 673Q702 706 732 706H734Q749 706 749 695Q749 682 730 666T660 607T559 505Q387 299 328 29Q324 0 295 -17T245 -34H241Q234 -34 225 -21T185 46Q166 79 154 101Q84 223 84 231",10016:"195 702T195 706T201 716H632Q638 710 638 706T636 700T621 690Q436 581 427 374V357H430Q554 357 645 421Q682 447 711 483T755 542T770 567Q775 572 786 563V131Q777 125 774 125T762 139Q709 228 642 274T482 333Q452 337 430 337H427V320Q430 279 437 247T462 170T521 82T621 4Q630 -2 633 -4T637 -7T638 -12Q638 -16 632 -22H201Q195 -16 195 -12T197 -6T212 4Q397 113 406 320V337H403Q279 337 188 273Q151 247 122 211T78 152T63 127Q58 122 48 131V563Q54 569 59 569Q62 569 71 555Q124 466 191 420T351 361Q381 357 403 357H406V374Q403 415 396 447T371 525T312 613T212 690Q199 697 197 699",10072:"139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139",10216:"333 -232Q332 -239 327 -244T313 -250Q303 -250 296 -240Q293 -233 202 6T110 250T201 494T296 740Q299 745 306 749L309 750Q312 750 313 750Q331 750 333 732Q333 727 243 489Q152 252 152 250T243 11Q333 -227 333 -232",10217:"55 732Q56 739 61 744T75 750Q85 750 92 740Q95 733 186 494T278 250T187 6T92 -240Q85 -250 75 -250Q67 -250 62 -245T55 -232Q55 -227 145 11Q236 248 236 250T145 489Q55 727 55 732",10222:"357 741V726Q357 720 349 715Q261 655 242 539Q240 526 240 394V331Q240 259 239 250Q240 242 240 119V49Q240 -42 254 -85Q263 -111 275 -134T301 -172T326 -197T346 -213T356 -221T357 -232V-241L354 -244H334Q264 -209 222 -146T174 -12Q173 -6 173 95Q173 134 173 191T174 250Q173 260 173 376V460Q173 515 178 545T201 611Q244 695 327 741L334 744H354L357 741",10223:"78 744Q153 706 196 640T239 492V376Q239 339 239 311T238 269T238 252Q240 236 240 124V40Q240 -18 233 -53T202 -130Q156 -206 79 -244H70H65Q58 -244 57 -242T56 -231T57 -220T64 -215Q153 -154 170 -39Q173 -18 174 119V247Q173 249 173 382V451Q173 542 159 585Q145 626 120 658T75 706T56 723V731Q56 741 57 742T66 744H78",10229:"165 270H1510Q1525 262 1525 250T1510 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270",10230:"84 237T84 250T98 270H1444Q1328 357 1301 493Q1301 494 1301 496T1300 499Q1300 511 1317 511H1320Q1329 511 1332 510T1338 506T1341 497T1344 481T1352 456Q1374 389 1425 336T1544 261Q1553 258 1553 250Q1553 244 1548 241T1524 231T1486 212Q1445 186 1415 152T1370 85T1349 35T1341 4Q1339 -6 1336 -8T1320 -11Q1300 -11 1300 0Q1300 7 1305 25Q1337 151 1444 230H98Q84 237 84 250",10231:"165 270H1694Q1578 357 1551 493Q1551 494 1551 496T1550 499Q1550 511 1567 511H1570Q1579 511 1582 510T1588 506T1591 497T1594 481T1602 456Q1624 389 1675 336T1794 261Q1803 258 1803 250Q1803 244 1798 241T1774 231T1736 212Q1695 186 1665 152T1620 85T1599 35T1591 4Q1589 -6 1586 -8T1570 -11Q1550 -11 1550 0Q1550 7 1555 25Q1587 151 1694 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270",10232:"274 173H1539Q1540 172 1542 171T1545 169T1547 167T1550 164T1551 162T1552 158T1553 153Q1553 140 1538 133H318L328 123Q379 69 414 0Q419 -13 419 -17Q419 -24 399 -24Q388 -24 385 -23T377 -12Q332 77 253 144T72 237Q62 240 59 242T56 250T59 257T70 262T89 268T119 278T160 296Q303 366 377 512Q382 522 385 523T401 525Q419 524 419 515Q419 510 414 500Q379 431 328 377L318 367H1538Q1553 359 1553 347Q1553 336 1539 328L1221 327H903L900 328L602 327H274L264 319Q225 289 147 250Q148 249 165 241T210 217T264 181L274 173",10233:"1218 514Q1218 525 1234 525Q1239 525 1242 525T1247 525T1251 524T1253 523T1255 520T1257 517T1260 512Q1297 438 1358 381T1469 300T1565 263Q1582 258 1582 250T1573 239T1536 228T1478 204Q1334 134 1260 -12Q1256 -21 1253 -22T1238 -24Q1218 -24 1218 -17Q1218 -13 1223 0Q1258 69 1309 123L1319 133H70Q56 140 56 153Q56 168 72 173H1363L1373 181Q1412 211 1490 250Q1489 251 1472 259T1427 283T1373 319L1363 327H710L707 328L390 327H72Q56 332 56 347Q56 360 70 367H1319L1309 377Q1276 412 1247 458T1218 514",10234:"1438 514Q1438 525 1454 525Q1459 525 1462 525T1467 525T1471 524T1473 523T1475 520T1477 517T1480 512Q1517 438 1578 381T1689 300T1785 263Q1802 258 1802 250T1793 239T1756 228T1698 204Q1554 134 1480 -12Q1476 -21 1473 -22T1458 -24Q1438 -24 1438 -17Q1438 -13 1443 0Q1478 69 1529 123L1539 133H318L328 123Q379 69 414 0Q419 -13 419 -17Q419 -24 399 -24Q388 -24 385 -23T377 -12Q332 77 253 144T72 237Q62 240 59 242T56 250T59 257T70 262T89 268T119 278T160 296Q303 366 377 512Q382 522 385 523T401 525Q419 524 419 515Q419 510 414 500Q379 431 328 377L318 367H1539L1529 377Q1496 412 1467 458T1438 514ZM274 173H1583L1593 181Q1632 211 1710 250Q1709 251 1692 259T1647 283T1593 319L1583 327H930L927 328L602 327H274L264 319Q225 289 147 250Q148 249 165 241T210 217T264 181L274 173",10236:"95 155V109Q95 83 92 73T75 63Q61 63 58 74T54 130Q54 140 54 180T55 250Q55 421 57 425Q61 437 75 437Q88 437 91 428T95 393V345V270H1444Q1328 357 1301 493Q1301 494 1301 496T1300 499Q1300 511 1317 511H1320Q1329 511 1332 510T1338 506T1341 497T1344 481T1352 456Q1374 389 1425 336T1544 261Q1553 258 1553 250Q1553 244 1548 241T1524 231T1486 212Q1445 186 1415 152T1370 85T1349 35T1341 4Q1339 -6 1336 -8T1320 -11Q1300 -11 1300 0Q1300 7 1305 25Q1337 151 1444 230H95V155",10731:"318 709Q325 716 332 716Q340 716 344 713T474 511Q611 298 611 292Q611 285 526 152Q494 103 474 72Q347 -128 344 -130Q340 -132 333 -132T322 -130Q319 -128 257 -31T131 169T60 278Q56 285 56 292Q56 298 60 305Q73 326 194 516T318 709",10744:"166 -215T159 -215T147 -212T141 -204T139 -197Q139 -190 144 -183Q157 -157 378 274T602 707Q605 716 618 716Q625 716 630 712T636 703T638 696Q638 691 406 241T170 -212Q166 -215 159 -215",10752:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM555 -165Q672 -165 767 -108T916 44T970 250Q970 418 861 532T600 664Q591 665 548 665Q446 665 353 614T200 466T140 250V243Q140 88 248 -30Q262 -46 280 -62T338 -105T434 -148T555 -165ZM478 250Q478 288 503 307T551 326Q586 326 609 305T632 250Q632 217 610 196T555 174T500 196T478 250",10753:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM513 478Q513 664 512 664Q504 664 481 660T406 637T313 588Q281 564 255 537T211 483T181 431T161 382T150 342T144 310T141 292H513V478ZM798 588Q758 616 711 634T639 658T602 663L597 664V292H969Q969 293 967 309T960 341T949 381T930 430T900 482T856 537T798 588ZM513 -164V208H141Q142 205 144 189T149 160T158 125T173 83T196 39T229 -9Q249 -34 273 -55T318 -92T363 -119T405 -138T444 -150T475 -158T499 -162T513 -164ZM775 -103Q801 -87 823 -68T863 -30T894 10T919 49T937 88T950 123T959 154T964 180T968 198L969 208H597V-164Q599 -163 616 -161T647 -155T683 -145T728 -128T775 -103",10754:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM600 664Q591 665 548 665Q414 665 306 583L292 573L423 441L555 310L687 441L818 573L804 583Q714 650 600 664ZM364 118L495 250L364 382L232 513L223 500Q140 391 140 250Q140 107 223 0L232 -13L364 118ZM970 250Q970 389 887 501L878 512Q878 513 861 496T812 447T746 381L615 250L746 118L878 -13L887 0Q970 109 970 250ZM687 59L555 190L423 59L292 -73L306 -83Q416 -166 555 -166T804 -83L818 -73L687 59",10756:"96 750Q103 750 109 748T120 744T127 737T133 730T137 723T139 718V395L140 73L142 60Q159 -43 237 -104T416 -166Q521 -166 597 -103T690 60L692 73L694 718Q708 749 735 749Q765 749 775 720Q777 714 777 398Q777 78 776 71Q766 -51 680 -140Q571 -249 416 -249H411Q261 -249 152 -140Q66 -51 56 71Q55 78 55 398Q55 714 57 720Q60 734 70 740Q80 750 96 750ZM223 276Q223 282 224 287T227 296T232 302T238 308T243 313T250 316L254 319H374V376V406Q374 438 382 454T418 470Q443 467 450 453T458 410V376V319H579Q580 319 583 317T589 313T594 308T600 302T604 295T608 287T609 276Q609 253 587 241Q577 235 513 235H458V178Q458 176 458 166T459 148Q459 84 415 84Q401 84 390 93T375 117Q374 120 374 178V235H319Q317 235 307 235T290 234Q223 234 223 276",10758:"777 -217Q766 -244 745 -249H88Q64 -242 57 -220Q55 -214 55 250T57 720Q60 734 70 740Q80 750 96 750Q127 750 137 720Q139 714 139 274V-166H693V274Q693 714 695 720Q705 749 735 749Q766 749 775 719Q777 713 777 248V-217",10799:"630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29",10815:"28 660Q28 676 31 679T46 683H50Q87 681 182 681Q217 681 247 681T294 682T315 682Q321 682 323 682T328 679T331 673T332 660Q332 643 328 640T304 637Q239 637 231 626Q229 620 229 334V46H520V334Q520 620 518 626Q510 637 445 637Q426 637 422 640T417 660Q417 675 420 678T432 682H435Q437 682 467 682T569 681T671 681T703 682Q714 682 717 679T721 660Q721 643 717 640T693 637Q628 637 620 626Q619 623 619 342Q619 60 620 57Q628 46 693 46Q714 46 717 43T721 23Q721 5 715 1Q713 0 374 0Q36 0 34 1Q28 5 28 23Q28 40 31 43T56 46Q121 46 129 57Q131 63 131 342Q131 620 129 626Q121 637 56 637Q35 637 32 640T28 660",10846:"55 795Q56 806 70 813H540Q554 806 555 795Q555 791 554 788T552 783T549 779T546 777T542 775T539 773H71Q70 773 68 774T65 776T61 779T58 783T56 788T55 795ZM55 601Q56 612 70 619H540Q554 612 555 601Q555 597 554 594T552 589T549 585T546 583T542 581T539 579H71Q70 579 68 580T65 582T61 585T58 589T56 594T55 601ZM75 -97Q67 -97 61 -91T55 -81Q55 -71 169 166T285 410Q295 425 305 425Q311 425 316 422T323 414L325 410Q327 404 441 167T555 -81Q555 -85 549 -91T535 -97T520 -90Q519 -89 506 -61T463 27T411 136L305 358L199 136Q167 71 129 -10Q98 -75 92 -86T75 -97",10877:"674 636Q682 636 688 630T694 615T687 601Q686 600 417 472L151 346L399 228Q687 92 691 87Q694 81 694 76Q694 58 676 56H670L382 192Q92 329 90 331Q83 336 83 348Q84 359 96 365Q104 369 382 500T665 634Q669 636 674 636ZM94 170Q102 172 104 172Q110 171 254 103T535 -30T678 -98Q694 -106 694 -118Q694 -136 676 -138H670L382 -2Q92 135 90 137Q83 142 83 154Q84 164 94 170",10878:"83 616Q83 624 89 630T99 636Q107 636 253 568T543 431T687 361Q694 356 694 346T687 331Q685 329 395 192L107 56H101Q83 58 83 76Q83 77 83 79Q82 86 98 95Q117 105 248 167Q326 204 378 228L626 346L360 472Q291 505 200 548Q112 589 98 597T83 616ZM674 172Q692 172 694 154Q694 142 687 137Q685 135 395 -2L107 -138H101Q83 -136 83 -118Q83 -106 96 -100Q100 -98 380 35T665 170T674 172",10885:"667 761Q669 762 673 762Q682 762 688 756T694 741Q694 731 687 727Q684 724 420 613L156 502L416 392Q476 367 544 338T647 295T682 280Q694 274 694 262Q694 244 676 242Q670 242 524 303T235 425T90 487Q83 493 83 501Q83 514 94 519Q97 520 378 639T667 761ZM55 -23Q55 43 103 90T223 138Q265 138 316 114Q342 100 393 68L443 36Q502 0 554 0Q609 0 650 32T694 109Q694 138 708 138Q710 138 713 136T719 127T722 108Q722 37 673 -9T557 -56Q514 -56 468 -35T387 13T308 60T223 82Q167 82 127 50T83 -27Q81 -56 69 -56Q55 -56 55 -23ZM55 -257Q55 -191 103 -144T223 -96Q265 -96 316 -120Q342 -134 393 -166L443 -198Q502 -234 554 -234Q609 -234 650 -202T694 -125Q694 -96 708 -96Q710 -96 713 -98T719 -107T722 -126Q722 -197 673 -243T557 -290Q514 -290 468 -269T387 -221T308 -174T223 -152Q167 -152 127 -184T83 -261Q80 -290 69 -290Q55 -290 55 -257",10886:"90 727Q83 734 83 743Q83 751 89 756T104 762Q111 760 396 641Q686 518 687 517Q694 512 694 502T687 487Q686 486 543 425T253 303T101 242Q83 244 83 262Q83 274 95 280Q96 280 130 294T232 338T361 392L621 502L357 613Q93 724 90 727ZM55 -23Q55 43 103 90T223 138Q265 138 316 114Q342 100 393 68L443 36Q502 0 554 0Q609 0 650 32T694 109Q694 138 708 138Q710 138 713 136T719 127T722 108Q722 37 673 -9T557 -56Q514 -56 468 -35T387 13T308 60T223 82Q167 82 127 50T83 -27Q81 -56 69 -56Q55 -56 55 -23ZM55 -257Q55 -191 103 -144T223 -96Q265 -96 316 -120Q342 -134 393 -166L443 -198Q502 -234 554 -234Q609 -234 650 -202T694 -125Q694 -96 708 -96Q710 -96 713 -98T719 -107T722 -126Q722 -197 673 -243T557 -290Q514 -290 468 -269T387 -221T308 -174T223 -152Q167 -152 127 -184T83 -261Q80 -290 69 -290Q55 -290 55 -257",10887:"380 497Q445 528 522 564T636 618T673 635Q680 635 686 628T693 615T689 603Q686 599 418 472L151 343L418 215Q686 88 689 83Q693 79 693 72T687 59T675 52Q669 52 381 189T86 332Q82 337 82 344Q82 350 86 355Q91 359 380 497ZM82 -130T82 -124T95 -103H380L431 -54Q476 -6 486 -6Q491 -6 498 -12T505 -27Q505 -28 505 -29T504 -32Q503 -33 498 -38T485 -53T469 -70L438 -103H680Q682 -106 686 -110T691 -116T693 -123Q693 -130 680 -143H398L346 -192Q300 -241 291 -241Q271 -241 271 -221Q271 -209 306 -179L340 -143H95Q82 -130 82 -124",10888:"82 614Q82 620 86 625T94 632T100 635Q106 635 394 498T689 355Q693 349 693 343Q693 338 689 332Q683 327 395 190T100 52Q95 52 89 58T82 72Q82 80 95 88Q114 99 358 215L624 343L358 472Q89 599 86 603Q82 607 82 614ZM82 -130T82 -124T95 -103H380L431 -54Q476 -6 486 -6Q491 -6 498 -12T505 -27Q505 -28 505 -29T504 -32Q503 -33 498 -38T485 -53T469 -70L438 -103H680Q682 -106 686 -110T691 -116T693 -123Q693 -130 680 -143H398L346 -192Q300 -241 291 -241Q271 -241 271 -221Q271 -209 306 -179L340 -143H95Q82 -130 82 -124",10889:"86 512Q93 518 381 639T673 761Q680 761 686 755T693 741Q693 733 688 730Q685 723 419 612L155 501L419 390Q685 277 688 272Q693 269 693 261Q693 254 687 248T675 241Q669 241 381 362T86 490Q74 500 86 512ZM70 -59Q57 -59 57 -24Q57 40 104 87Q116 102 146 118Q186 136 231 136Q232 136 242 135T258 133T276 128T302 118T334 101T377 74Q386 69 396 63T411 53T417 50Q435 87 453 134Q491 223 495 227Q498 230 505 230Q513 230 519 225T526 212Q526 203 491 118T453 30Q453 22 489 10T553 -3Q589 -3 622 14Q653 28 669 50T688 90T694 122T706 136Q718 136 718 114Q718 113 718 109T717 103Q717 31 668 -14T554 -60Q529 -60 499 -50T451 -32T433 -24Q431 -24 404 -90T375 -157Q375 -159 402 -178T473 -218T553 -239Q599 -239 641 -211T691 -130Q694 -99 706 -99T718 -122Q718 -123 718 -127T717 -133Q717 -204 668 -249T559 -295Q512 -295 470 -275T355 -206L322 -290Q313 -310 304 -332T289 -367T282 -382Q277 -387 270 -387Q262 -387 255 -382T248 -368Q248 -361 322 -186Q311 -177 280 -166T222 -155Q189 -155 153 -173Q122 -186 106 -208T87 -248T82 -280T71 -294Q57 -294 57 -259Q57 -195 104 -148Q122 -126 155 -113T220 -99Q245 -99 276 -109T324 -127T342 -135Q397 -2 397 1Q386 10 367 23T302 58T222 80Q175 80 132 52T84 -28Q82 -59 70 -59",10890:"86 730Q81 734 81 740Q81 747 88 754T99 761Q103 761 392 640T688 512Q693 509 693 501T688 490Q682 484 394 363T99 241Q94 241 88 248T82 261Q82 268 86 272Q89 277 355 390L619 501L355 612Q89 723 86 730ZM70 -59Q57 -59 57 -24Q57 40 104 87Q116 102 146 118Q186 136 231 136Q232 136 242 135T258 133T276 128T302 118T334 101T377 74Q386 69 396 63T411 53T417 50Q435 87 453 134Q491 223 495 227Q498 230 505 230Q513 230 519 225T526 212Q526 203 491 118T453 30Q453 22 489 10T553 -3Q589 -3 622 14Q653 28 669 50T688 90T694 122T706 136Q718 136 718 114Q718 113 718 109T717 103Q717 31 668 -14T554 -60Q529 -60 499 -50T451 -32T433 -24Q431 -24 404 -90T375 -157Q375 -159 402 -178T473 -218T553 -239Q599 -239 641 -211T691 -130Q694 -99 706 -99T718 -122Q718 -123 718 -127T717 -133Q717 -204 668 -249T559 -295Q512 -295 470 -275T355 -206L322 -290Q313 -310 304 -332T289 -367T282 -382Q277 -387 270 -387Q262 -387 255 -382T248 -368Q248 -361 322 -186Q311 -177 280 -166T222 -155Q189 -155 153 -173Q122 -186 106 -208T87 -248T82 -280T71 -294Q57 -294 57 -259Q57 -195 104 -148Q122 -126 155 -113T220 -99Q245 -99 276 -109T324 -127T342 -135Q397 -2 397 1Q386 10 367 23T302 58T222 80Q175 80 132 52T84 -28Q82 -59 70 -59",10891:"674 1003Q681 1003 687 999T694 983Q694 973 683 967Q669 959 420 868L162 772L422 676Q683 579 685 577Q694 571 694 560Q694 550 687 546T673 541Q669 542 384 647T93 755Q83 760 83 772Q83 783 91 788Q98 791 383 897T674 1003ZM84 354T84 367T98 387H679Q694 379 694 367Q694 354 679 347H98Q84 354 84 367ZM84 160T84 173T98 193H679Q694 185 694 173Q694 160 679 153H98Q84 160 84 173ZM94 -3Q102 -1 104 -1Q107 -2 392 -107T684 -215Q694 -219 694 -232Q694 -241 687 -247Q686 -248 395 -357Q106 -463 101 -463Q83 -461 83 -443Q83 -431 94 -426Q97 -423 357 -328L615 -232L355 -136Q94 -39 92 -37Q83 -31 83 -21Q83 -9 94 -3",10892:"104 541Q98 541 91 545T83 560Q83 571 92 577Q94 579 355 676L615 772L357 868Q108 959 94 967Q83 973 83 983Q83 989 87 996T104 1003Q109 1002 396 896T687 787Q694 781 694 772Q694 759 684 755Q678 752 393 647T104 541ZM84 367Q84 380 98 387H679Q694 379 694 367Q694 356 680 348L390 347H100Q84 352 84 367ZM84 173Q84 188 100 193H680Q694 183 694 173Q694 160 679 153H98Q84 160 84 173ZM674 -1Q682 -1 688 -6T694 -20Q694 -31 685 -37Q683 -39 422 -136L162 -232L420 -328Q680 -423 683 -426Q694 -431 694 -443Q694 -461 676 -463Q671 -463 382 -357Q91 -248 90 -247Q83 -242 83 -232Q83 -220 93 -215Q667 -1 674 -1",10901:"674 636Q682 636 688 631T694 616Q694 605 687 601Q685 599 395 462L107 326H101Q83 328 83 345Q83 358 96 365Q102 367 382 500T665 634Q671 636 674 636ZM674 442Q692 442 694 424Q694 412 687 407Q686 406 417 278L151 152L399 34Q687 -102 691 -107Q694 -113 694 -118Q694 -136 676 -138H670L382 -2Q92 135 90 137Q83 142 83 154Q84 165 96 171Q104 175 382 306T665 440Q669 442 674 442",10902:"83 616Q83 624 89 630T99 636Q107 636 253 568T543 431T687 361Q694 354 694 346Q694 328 676 326H670L382 462Q317 493 226 535Q119 585 101 595T83 616ZM94 440Q102 442 104 442Q110 441 254 373T535 240T678 172Q679 172 680 171Q694 164 694 153T687 137Q685 135 395 -2L107 -138H101Q83 -136 83 -118Q83 -106 93 -101L128 -84Q163 -68 230 -36T361 26L626 152L360 278Q91 406 90 407Q83 412 83 424Q84 434 94 440",10927:"84 346Q84 359 91 363T117 367Q120 367 126 367T137 366Q388 370 512 430T653 609Q657 636 676 636Q685 635 689 629T694 618V612Q689 566 672 528T626 463T569 417T500 383T435 362T373 346Q379 345 404 339T440 330T477 318T533 296Q592 266 630 223T681 145T694 78Q694 57 674 57Q662 57 657 67T652 92T640 135T606 191Q500 320 137 326H114Q104 326 98 327T88 332T84 346ZM84 -131T84 -118T98 -98H679Q694 -106 694 -118T679 -138H98Q84 -131 84 -118",10928:"84 614Q84 636 102 636Q115 636 119 626T125 600T137 556T171 501Q277 372 640 366H661Q694 366 694 346T661 326H640Q578 325 526 321T415 307T309 280T222 237T156 172T124 83Q122 66 118 62T103 57Q100 57 98 57T95 58T93 59T90 62T85 67Q83 71 83 80Q88 126 105 164T151 229T208 275T277 309T342 330T404 346Q401 347 380 351T345 360T302 373T245 396Q125 455 92 565Q84 599 84 614ZM84 -131T84 -118T98 -98H679Q694 -106 694 -118T679 -138H98Q84 -131 84 -118",10933:"653 734Q653 738 660 745T673 752T686 745T693 723Q672 555 466 485Q390 463 378 463Q373 463 373 461Q373 458 378 458Q390 458 466 436Q562 404 620 350Q682 283 693 198Q693 183 686 176Q681 170 674 170T660 176T653 187Q653 192 652 200T646 228T631 265T602 307T555 350Q435 431 151 441H95Q82 454 82 460T95 481H151Q165 482 197 483T238 485Q427 500 528 554T649 707Q653 729 653 734ZM82 33Q82 37 83 40T89 47T95 54H473L520 105Q569 156 571 156Q573 157 578 157Q586 157 592 151T598 136Q598 130 562 92L526 56L604 54H682Q693 43 693 35Q693 31 692 28T686 21T680 14H489L342 -139L513 -142H682Q693 -148 693 -160Q693 -167 680 -182H304L258 -230Q248 -240 237 -251T221 -268T211 -278T203 -284T197 -286Q189 -286 184 -280T178 -264Q178 -257 213 -219L249 -182H171L93 -179L86 -175Q82 -170 82 -163Q82 -155 95 -142H289L360 -64L433 14H262L93 16Q82 23 82 33",10934:"693 466T693 460T680 441H624Q608 439 577 438T538 436Q349 421 248 367T126 214Q122 192 122 187Q122 183 116 177T102 170Q95 170 89 176Q82 183 82 198Q93 283 155 350Q213 404 309 436Q385 458 398 458Q402 458 402 461Q402 463 398 463Q385 463 309 485Q103 555 82 723Q82 738 89 745T102 752T115 745T122 734Q122 721 126 701T155 640T220 572Q340 490 624 481H680Q693 466 693 460ZM82 33Q82 37 83 40T89 47T95 54H473L520 105Q569 156 571 156Q573 157 578 157Q586 157 592 151T598 136Q598 130 562 92L526 56L604 54H682Q693 43 693 35Q693 31 692 28T686 21T680 14H489L342 -139L513 -142H682Q693 -148 693 -160Q693 -167 680 -182H304L258 -230Q248 -240 237 -251T221 -268T211 -278T203 -284T197 -286Q189 -286 184 -280T178 -264Q178 -257 213 -219L249 -182H171L93 -179L86 -175Q82 -170 82 -163Q82 -155 95 -142H289L360 -64L433 14H262L93 16Q82 23 82 33",10935:"82 494T82 501T95 521H171Q405 527 511 569Q630 618 651 732Q652 734 653 740T655 748T658 754T663 759T672 761L686 754Q693 747 693 734Q684 668 648 623Q627 591 573 557T442 507L417 501Q428 496 442 494Q520 478 573 444T648 378Q684 333 693 267Q693 254 686 247Q673 234 659 245Q657 247 651 269Q630 383 511 432Q406 474 171 481H95Q82 494 82 501ZM70 -59Q57 -59 57 -26Q57 30 90 73T177 132Q191 136 226 136Q228 136 239 136T253 135T267 132T287 125T311 113T346 95T391 67Q462 20 502 5Q519 1 553 1Q586 1 602 5Q641 18 664 45T691 107Q694 136 704 136Q717 136 717 115V105Q717 39 671 -9T554 -58Q518 -58 481 -43T382 14Q302 63 273 74Q255 78 222 78Q188 78 173 74Q90 46 84 -28Q82 -59 70 -59ZM71 -294Q57 -294 57 -262Q57 -205 90 -162T177 -104Q191 -99 226 -99Q266 -103 277 -106Q310 -119 391 -168Q455 -212 502 -231Q519 -235 553 -235Q586 -235 602 -231Q640 -218 661 -195T686 -151T693 -115T704 -99Q717 -99 717 -121V-131Q717 -198 671 -246T556 -294Q519 -294 482 -279T382 -222Q307 -175 273 -162Q255 -157 222 -157Q188 -157 173 -162Q133 -175 110 -201T84 -264Q82 -294 71 -294",10936:"693 501Q693 493 679 481H604Q369 474 264 432Q143 382 124 269Q116 246 115 245Q101 234 88 247Q82 254 82 267Q89 329 126 378Q147 410 201 444T333 494L357 501Q354 502 340 505T318 510T295 516T269 525T243 535T215 548T188 565Q142 599 126 623Q89 672 82 734Q82 761 102 761L115 756Q116 755 124 732Q143 619 264 569Q371 527 604 521H679Q693 507 693 501ZM70 -59Q57 -59 57 -26Q57 30 90 73T177 132Q191 136 226 136Q228 136 239 136T253 135T267 132T287 125T311 113T346 95T391 67Q462 20 502 5Q519 1 553 1Q586 1 602 5Q641 18 664 45T691 107Q694 136 704 136Q717 136 717 115V105Q717 39 671 -9T554 -58Q518 -58 481 -43T382 14Q302 63 273 74Q255 78 222 78Q188 78 173 74Q90 46 84 -28Q82 -59 70 -59ZM71 -294Q57 -294 57 -262Q57 -205 90 -162T177 -104Q191 -99 226 -99Q266 -103 277 -106Q310 -119 391 -168Q455 -212 502 -231Q519 -235 553 -235Q586 -235 602 -231Q640 -218 661 -195T686 -151T693 -115T704 -99Q717 -99 717 -121V-131Q717 -198 671 -246T556 -294Q519 -294 482 -279T382 -222Q307 -175 273 -162Q255 -157 222 -157Q188 -157 173 -162Q133 -175 110 -201T84 -264Q82 -294 71 -294",10937:"82 494T82 501T95 521H171Q256 523 317 528T441 548T543 584T613 644T651 732Q652 734 653 740T655 748T658 754T663 759T672 761L686 754Q693 747 693 734Q686 686 664 647T615 586T548 545T482 518T417 501Q419 500 451 493T517 471T590 434T657 367T693 267Q693 241 673 241Q664 241 659 245Q656 249 650 273T635 323T593 380T511 432Q406 474 171 481H95Q82 494 82 501ZM57 -26Q57 39 101 87T219 136Q254 136 277 130Q320 114 382 72Q419 50 424 45Q426 45 459 110Q496 178 497 179Q500 180 504 180Q509 180 517 175T526 161Q526 158 495 90L462 25Q462 21 502 5Q519 1 553 1Q586 1 602 5Q641 18 664 45T691 107Q694 136 706 136T718 115Q718 114 718 111T717 105Q717 39 671 -9T554 -58L459 -33Q450 -29 444 -27T437 -26L371 -155L391 -168Q485 -235 538 -235H553Q586 -235 602 -230Q683 -204 691 -128Q694 -99 706 -99T718 -120Q718 -121 718 -124T717 -130Q717 -199 670 -246T557 -294T393 -228Q353 -205 351 -201Q348 -201 315 -266Q294 -310 285 -323T268 -337Q259 -337 254 -331T248 -317Q248 -305 282 -246L313 -181Q313 -177 273 -161Q255 -157 222 -157Q188 -157 173 -161Q134 -174 113 -198T88 -242T82 -278T71 -294Q57 -294 57 -261Q57 -204 91 -161T179 -104Q195 -99 228 -99Q274 -102 315 -124Q337 -132 337 -130L404 -1L384 12Q319 58 273 74Q255 79 222 79Q188 79 173 74Q133 61 112 37T88 -7T82 -43T70 -59Q57 -59 57 -26",10938:"693 501Q693 493 679 481H604Q548 479 509 477T418 469T331 454T257 429T194 392T150 340T124 270Q117 247 115 245Q101 236 88 247Q82 254 82 267Q89 330 126 379Q147 411 202 444T333 494L357 501Q239 531 188 565Q142 599 126 623Q89 672 82 734Q82 761 102 761L115 756Q116 755 124 732Q133 678 166 640T241 579T349 544T470 527T604 521H679Q693 507 693 501ZM57 -26Q57 39 101 87T219 136Q254 136 277 130Q320 114 382 72Q419 50 424 45Q426 45 459 110Q496 178 497 179Q500 180 504 180Q509 180 517 175T526 161Q526 158 495 90L462 25Q462 21 502 5Q519 1 553 1Q586 1 602 5Q641 18 664 45T691 107Q694 136 706 136T718 115Q718 114 718 111T717 105Q717 39 671 -9T554 -58L459 -33Q450 -29 444 -27T437 -26L371 -155L391 -168Q485 -235 538 -235H553Q586 -235 602 -230Q683 -204 691 -128Q694 -99 706 -99T718 -120Q718 -121 718 -124T717 -130Q717 -199 670 -246T557 -294T393 -228Q353 -205 351 -201Q348 -201 315 -266Q294 -310 285 -323T268 -337Q259 -337 254 -331T248 -317Q248 -305 282 -246L313 -181Q313 -177 273 -161Q255 -157 222 -157Q188 -157 173 -161Q134 -174 113 -198T88 -242T82 -278T71 -294Q57 -294 57 -261Q57 -204 91 -161T179 -104Q195 -99 228 -99Q274 -102 315 -124Q337 -132 337 -130L404 -1L384 12Q319 58 273 74Q255 79 222 79Q188 79 173 74Q133 61 112 37T88 -7T82 -43T70 -59Q57 -59 57 -26",10949:"84 463Q84 585 166 663T360 752Q361 752 370 752T395 752T430 752T475 753T524 753H679Q694 746 694 733Q694 724 681 714L522 713H470H441Q366 713 338 709T266 685Q244 674 224 659T179 617T139 550T124 463V458Q124 370 185 302Q244 238 328 220Q348 215 366 215T522 213H681Q694 203 694 193Q694 180 679 173H526Q510 173 480 173T434 172Q350 172 289 188T172 258Q84 340 84 463ZM84 -14T84 -1T98 19H679Q694 11 694 -1Q694 -14 679 -21H98Q84 -14 84 -1ZM84 -208T84 -195T98 -175H679Q694 -183 694 -195Q694 -208 679 -215H98Q84 -208 84 -195",10950:"83 733Q83 746 98 753H251Q267 753 297 753T343 754Q427 754 488 738T605 668Q693 587 693 463Q693 378 650 312T545 213T415 174Q407 173 251 173H98Q83 180 83 193Q83 203 96 213H255H308H337Q412 213 439 217T512 241Q533 252 553 267T599 309T639 376T654 463Q654 554 592 624Q557 662 512 685Q468 704 439 708T335 713H306H255L96 714Q83 724 83 733ZM84 -14T84 -1T98 19H679Q694 11 694 -1Q694 -14 679 -21H98Q84 -14 84 -1ZM84 -208T84 -195T98 -175H679Q694 -183 694 -195Q694 -208 679 -215H98Q84 -208 84 -195",10955:"693 221Q693 214 680 201H524Q398 201 367 202T309 212Q236 230 180 280T98 398Q84 438 84 492T98 585Q126 663 193 716T346 781Q347 781 373 781T440 782T520 783H680Q682 780 686 776T691 770T693 763T680 743H526Q364 743 353 741Q279 730 221 687T138 578Q124 540 124 492T138 405Q163 340 221 297T353 243Q364 241 526 241H680Q682 238 686 234T691 228T693 221ZM82 -48T82 -41T95 -19H462L513 41L569 105Q574 110 582 110T596 104T602 90Q602 87 600 83Q600 77 555 30L515 -17L600 -19H682Q693 -30 693 -38T680 -59H480L415 -137L349 -213L515 -215H682Q693 -226 693 -233T680 -255H313L260 -317Q224 -360 212 -372T192 -385Q184 -385 179 -377T173 -362Q174 -361 218 -306L260 -255H178L93 -253L86 -248Q82 -243 82 -235Q82 -226 93 -215H195L295 -213L362 -137L426 -59H260L93 -57L86 -53Q82 -48 82 -41",10956:"82 759T82 763T83 769T89 776T95 783H251Q378 783 409 782T469 772Q540 753 596 703T678 585Q691 546 691 492T678 398Q649 320 581 267T426 203Q415 201 251 201H95Q82 214 82 221Q82 225 83 227T89 234T95 241H249Q411 241 422 243Q496 253 554 296T638 405Q651 444 651 492Q651 539 638 578Q613 643 555 686T422 741Q411 743 249 743H95Q82 759 82 763ZM82 -48T82 -41T95 -19H462L513 41L569 105Q574 110 582 110T596 104T602 90Q602 87 600 83Q600 77 555 30L515 -17L600 -19H682Q693 -30 693 -38T680 -59H480L415 -137L349 -213L515 -215H682Q693 -226 693 -233T680 -255H313L260 -317Q224 -360 212 -372T192 -385Q184 -385 179 -377T173 -362Q174 -361 218 -306L260 -255H178L93 -253L86 -248Q82 -243 82 -235Q82 -226 93 -215H195L295 -213L362 -137L426 -59H260L93 -57L86 -53Q82 -48 82 -41",12296:"333 -232Q332 -239 327 -244T313 -250Q303 -250 296 -240Q293 -233 202 6T110 250T201 494T296 740Q299 745 306 749L309 750Q312 750 313 750Q331 750 333 732Q333 727 243 489Q152 252 152 250T243 11Q333 -227 333 -232",12297:"55 732Q56 739 61 744T75 750Q85 750 92 740Q95 733 186 494T278 250T187 6T92 -240Q85 -250 75 -250Q67 -250 62 -245T55 -232Q55 -227 145 11Q236 248 236 250T145 489Q55 727 55 732",57350:"91 417Q104 430 111 430T131 417V301L171 341Q201 373 207 378T220 384Q227 384 233 377T240 366Q240 357 187 299L131 244V-10Q116 -23 111 -23T91 -10V201L49 157Q20 127 14 121T0 115Q-8 115 -14 121T-20 132Q-20 139 17 178Q29 191 36 199L91 257V417",57351:"56 417Q68 431 76 431L89 426L96 419V317L98 215L193 273L291 330V375L293 419Q301 431 311 431Q331 431 331 388L333 355L356 370Q381 384 388 384Q394 384 400 377T407 363Q407 354 367 328L331 308V-10Q316 -23 310 -23Q300 -23 293 -12L291 135V284L98 168L96 77V-12Q84 -24 76 -24L62 -19L58 -12L56 66V144L31 128Q5 114 -2 114Q-8 114 -14 121T-20 136Q-20 142 -14 147T20 170L56 190V417",57352:"477 261Q477 257 473 256T455 253T417 251T348 250H235L155 -77L146 -82Q137 -85 109 -85Q55 -85 55 -77L139 261Q224 596 226 598Q229 603 239 603Q240 603 254 603T290 603T341 604T405 605T477 605Q656 603 687 602T719 596Q719 589 692 588T513 585H319L282 427L242 272Q242 270 351 270Q388 270 410 270T444 269T460 267T469 265T477 261",57353:"228 325Q170 322 156 316T127 309Q108 309 104 314Q99 319 99 322T108 341Q125 376 171 400T268 425H271Q302 425 319 396Q328 377 328 358Q328 332 324 314Q311 270 286 221Q274 194 274 192H275Q339 234 484 325T639 421Q669 434 691 434T723 425T734 406Q734 394 719 381Q715 376 644 330L575 287L566 267Q543 233 526 176Q520 160 515 143T508 115T506 105Q506 103 533 103Q585 103 607 110T641 118Q670 118 670 107Q670 100 661 85Q643 50 598 27T504 3Q465 3 450 36Q441 51 441 73Q441 84 444 96Q452 146 484 205L497 236L324 125Q143 12 135 10Q103 -6 77 -6Q61 -6 49 2T37 21Q37 36 49 46T124 96L195 141L204 156Q219 179 243 248T264 323Q264 325 228 325",57356:"86 472Q93 477 381 614T673 752Q680 752 686 746T693 732T689 721Q686 715 418 590L151 461L418 332Q684 207 689 201Q693 195 693 190Q693 183 687 177T675 170Q668 170 380 307T86 450Q82 454 82 461Q82 467 86 472ZM369 101V126Q369 156 382 156H384Q385 157 386 157Q409 157 409 115V98V54H680Q693 39 693 34T680 14H409V-142H680Q693 -155 693 -162Q693 -167 680 -182H409V-273Q396 -284 388 -284Q382 -284 369 -275V-182H95Q82 -167 82 -162Q82 -155 95 -142H369V14H95Q93 17 89 21T84 27T82 34T83 40T89 47T95 54H369V101",57357:"89 745Q95 752 100 752Q106 752 394 615T689 472Q693 468 693 461T689 450Q684 445 396 308T100 170Q95 170 89 176T82 190Q82 195 86 201Q91 208 358 332L624 461L358 590Q90 715 86 721Q82 725 82 731Q82 739 89 745ZM369 101V126Q369 156 382 156H384Q385 157 386 157Q409 157 409 115V98V54H680Q693 39 693 34T680 14H409V-142H680Q693 -155 693 -162Q693 -167 680 -182H409V-273Q396 -284 388 -284Q382 -284 369 -275V-182H95Q82 -167 82 -162Q82 -155 95 -142H369V14H95Q93 17 89 21T84 27T82 34T83 40T89 47T95 54H369V101",57358:"97 172Q82 172 82 190Q82 197 86 201Q94 209 173 246T327 319T402 357Q405 360 434 448T462 539L278 628Q96 713 86 721Q82 725 82 732T88 745T102 752Q103 752 125 742T198 709T293 666Q342 642 385 622T453 590T478 579Q479 579 506 659T562 824T598 915Q602 919 609 919T622 913T629 901Q629 898 571 728Q546 656 531 608T518 559Q555 539 602 519Q664 488 679 479T694 461Q694 457 689 450Q680 443 616 413T494 356T435 326L389 190L342 57L513 55H682Q694 43 694 34Q694 28 689 21L682 17L506 15H329L322 -8Q320 -13 310 -41T295 -85L275 -141H680Q682 -143 684 -146T688 -151T691 -156T693 -162Q693 -172 682 -179L473 -181H262L220 -303Q192 -388 185 -404T166 -421Q160 -421 153 -415T146 -403Q146 -400 179 -302T220 -185Q220 -181 158 -181L93 -179L86 -174Q82 -169 82 -161Q82 -152 93 -141H164L233 -139L260 -63L286 15H189L93 17L86 21Q82 26 82 34Q82 44 93 55H198L300 57L342 179Q350 204 361 238T378 286T382 301L246 237Q111 172 97 172ZM624 461Q621 464 560 492Q512 518 503 518Q500 518 500 517Q499 513 488 479T465 413T453 379L624 461",57359:"97 54Q82 54 82 72Q82 79 86 84Q95 91 222 153L351 215L398 324L442 433L258 519Q95 597 87 604Q82 608 82 615T88 628T102 635Q107 635 424 484L458 468L524 630Q593 789 597 795Q601 801 609 801Q616 801 622 795T629 781L562 615L493 450L589 406Q665 371 679 362T694 344Q694 339 693 337T677 326T631 302T538 257Q504 241 465 223T406 195T386 186Q383 185 344 92T306 -3L486 81Q662 168 673 168Q680 168 686 162T693 148T689 137Q688 136 482 35L280 -59L233 -176Q184 -291 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -279 185 -186T224 -90Q225 -88 223 -88Q219 -88 193 -101Q109 -143 98 -143Q82 -138 82 -122Q82 -116 85 -113T108 -98T171 -67L249 -30L289 61Q297 81 307 107T321 144T326 157L218 106Q109 54 97 54ZM553 379Q480 412 480 415Q479 415 460 372T423 285T406 241Q408 240 516 291T624 344L553 379",57360:"102 168Q103 168 151 146T247 102T295 81Q299 85 322 144T344 206L218 268Q153 297 123 313T87 333T82 344T86 355Q104 369 291 455Q491 552 491 553L542 673Q581 767 590 784T609 801Q616 801 622 795T629 781Q629 773 586 677Q546 581 546 577L609 606Q669 635 673 635Q680 635 686 629T693 615Q693 610 692 608T670 593T604 561L524 521L400 226L542 157Q617 123 649 107T687 85T694 72Q694 66 690 60T679 54Q665 54 526 119Q394 186 386 186Q385 186 342 88L331 61L509 -23Q680 -105 688 -111Q693 -115 693 -122T688 -135T675 -141H673Q664 -141 491 -59Q320 21 316 21H315L249 -136Q183 -293 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 154 -261T181 -197T213 -119L280 41Q280 46 186 86Q157 101 121 119Q92 133 87 136T82 148Q82 155 88 161T102 168ZM418 370L466 495Q464 495 308 420T151 344T204 317T311 267T364 244Q364 247 418 370",57361:"82 34Q82 44 93 55H198L300 57L342 179Q351 207 362 238T378 286T384 303T238 377Q109 435 86 450Q82 454 82 460T86 472Q90 476 302 579L511 679Q512 679 553 795Q569 842 577 866T592 903T600 917T608 919Q615 919 622 912T629 901Q629 899 595 799Q589 777 581 753T569 717T564 703L618 728Q666 752 673 752T686 746T693 732Q693 723 683 717T615 683L546 650L491 488Q464 410 450 368T438 326Q493 297 562 266Q660 219 677 209T694 190Q694 183 690 177T678 171Q664 171 546 228L424 286Q422 286 382 172L342 57L513 55H682Q694 43 694 34Q694 28 689 21L682 17L506 15H329L322 -8Q320 -13 310 -41T295 -85L275 -141H680Q682 -143 684 -146T688 -151T691 -156T693 -162Q693 -172 682 -179L473 -181H262L220 -303Q192 -388 185 -404T166 -421Q160 -421 153 -415T146 -403Q146 -400 179 -302T220 -185Q220 -181 158 -181L93 -179L86 -174Q82 -169 82 -161Q82 -152 93 -141H164L233 -139L260 -63L286 15H189L93 17L86 21Q82 26 82 34ZM495 623Q495 626 493 626T321 544T151 461L398 343Q399 343 405 360T423 415T446 483Q457 513 469 551T488 606T495 623",57366:"82 -6Q82 1 95 14H262L295 94Q331 171 331 174Q324 175 312 178T267 194T206 227T146 283T98 368Q84 406 84 461T98 554Q126 632 194 685T349 750Q360 752 480 752H591L604 783Q620 819 624 821Q631 828 640 828Q653 825 658 810Q658 808 646 781L635 754Q635 752 658 752Q680 752 686 746Q693 739 693 732Q693 728 692 726T686 719T680 712H615L506 466Q479 407 451 344T408 248T393 214Q393 210 535 210H680Q693 194 693 190T680 170H373L340 92L304 14H680Q693 1 693 -6Q693 -11 680 -26H286L253 -103L218 -179L451 -181H682Q694 -193 694 -201Q694 -212 682 -219L440 -221H200L178 -270Q160 -309 154 -319T139 -330Q122 -330 118 -312L155 -223Q155 -221 126 -221H95Q82 -206 82 -201T95 -181H175L206 -108Q237 -35 242 -30Q242 -26 169 -26H95Q82 -11 82 -6ZM571 710Q571 712 469 712Q443 712 416 712T371 711T351 710Q279 700 221 656T138 548Q124 508 124 461T138 374Q186 245 351 212L460 459Q571 709 571 710",57367:"82 -14T82 -7T95 15H431L529 170H435Q341 170 333 175Q149 218 98 368Q84 406 84 461Q84 515 98 555Q126 633 193 686T346 750Q347 750 373 750T440 751T520 752H680Q693 739 693 732Q693 727 680 712H526Q364 712 353 710Q268 700 207 646T126 512Q123 496 123 461T126 410Q141 350 180 304T280 232Q312 217 344 214T464 210H555L589 261Q613 301 620 311T635 321Q644 321 650 315T657 301Q657 296 651 286T630 252T604 212Q604 210 642 210H680Q693 197 693 190Q693 186 692 184T686 177T680 170H578L526 92L478 17L580 15H682Q693 4 693 -4T680 -25H451L353 -179L518 -181H682Q694 -193 694 -201Q694 -211 682 -219L504 -221H326L293 -272Q257 -332 246 -332Q238 -332 232 -326T225 -313Q225 -310 226 -308Q226 -305 251 -265T278 -223Q278 -221 186 -221H95Q93 -218 89 -214T84 -208T82 -201T95 -181H306L404 -25H249L93 -23L86 -19Q82 -14 82 -7",57368:"82 732Q82 739 95 752H251H348Q420 752 460 744T551 708Q566 697 566 701Q618 815 624 821Q631 828 640 828Q653 825 658 810L600 677Q600 671 615 656T653 605T689 517Q692 496 692 461T689 406Q668 325 615 266Q572 221 513 196T391 170H373L340 92L304 14H680Q693 1 693 -6Q693 -11 680 -26H286L253 -103L218 -179L451 -181H682Q694 -193 694 -201Q694 -212 682 -219L440 -221H200L178 -270Q160 -309 154 -319T139 -330Q122 -330 118 -312L155 -223Q155 -221 126 -221H95Q82 -206 82 -201T95 -181H175L206 -108Q237 -35 242 -30Q242 -26 169 -26H95Q82 -11 82 -6Q82 1 95 14H262L295 92L331 170H95Q93 172 91 175T87 180T84 185T82 191Q82 199 93 210H220L349 212L549 659Q507 692 462 702T338 712H249H95Q82 727 82 732ZM652 473Q652 513 636 552T603 611T582 632Q581 632 487 422T393 210Q424 210 460 220T535 253T605 316T649 410Q652 427 652 461V473",57369:"82 732Q82 739 95 752H251Q415 752 426 750Q539 736 615 657Q667 599 689 517Q692 496 692 461T689 406Q668 325 615 266Q522 170 382 170H355L326 95Q319 80 311 59T298 28T293 17Q293 15 486 15H680Q693 0 693 -6T680 -25H275L213 -179L449 -181H682Q693 -192 693 -199T680 -221H198L178 -270Q153 -333 139 -333Q132 -333 126 -327T119 -314T135 -266T153 -223Q153 -221 124 -221H95Q82 -207 82 -201T95 -181H171L233 -25H162L93 -23L86 -19Q82 -14 82 -7T95 15H251L313 170H202L93 172L86 177Q82 182 82 190Q82 199 93 210H211L329 212L349 261Q366 301 372 311T386 321Q392 321 399 315T407 302Q407 295 390 254T373 210Q374 209 377 209Q412 209 444 217Q512 231 564 273T638 377Q651 414 651 461Q651 509 638 548Q613 613 555 656T422 710Q411 712 249 712H95Q82 727 82 732",57370:"693 -115T693 -122T680 -144H315L269 -199Q221 -255 213 -255H212Q203 -255 197 -248T193 -231Q195 -225 229 -184L262 -144H186L113 -142L106 -137Q102 -130 102 -125Q102 -119 115 -104H298L426 52H386Q342 54 309 63Q236 79 180 129T98 249Q84 289 84 343Q84 398 98 436Q126 514 193 567T346 632Q347 632 373 632T440 633T520 634H680Q682 631 686 627T691 621T693 614T680 594H526Q364 594 353 592Q268 581 207 528T126 394Q123 378 123 343T126 292Q141 231 181 185T280 114Q329 92 415 92H462L506 147Q554 203 562 203H563Q572 203 578 196T582 178Q579 173 546 132L513 94L598 92H682Q693 81 693 73T680 52H480L349 -102L515 -104H682Q693 -115 693 -122",57371:"82 610T82 614T83 620T89 627T95 634H251Q378 634 409 633T469 623Q540 604 596 554T678 436Q691 397 691 343T678 249Q653 181 597 131T469 63Q427 52 362 52H315L213 -102L438 -104H662Q673 -115 673 -123Q673 -129 660 -144H186L151 -197Q114 -250 109 -253Q106 -254 104 -254Q100 -254 98 -253Q91 -253 87 -248T82 -235Q82 -230 109 -186L138 -144H115Q82 -144 82 -125Q82 -119 95 -104H166L266 49Q266 52 182 52H95Q82 65 82 72Q82 76 83 78T89 85T95 92H295L329 143Q365 195 369 198Q372 203 380 203Q385 203 391 197T398 185Q398 184 398 184L399 182Q399 175 369 129L344 94Q344 92 376 92Q402 92 422 94Q496 104 554 147T638 256Q651 295 651 343Q651 390 638 429Q613 494 555 537T422 592Q411 594 249 594H95Q82 610 82 614",119808:"296 0Q278 3 164 3Q58 3 49 0H40V62H92Q144 62 144 64Q388 682 397 689Q403 698 434 698Q463 698 471 689Q475 686 538 530T663 218L724 64Q724 62 776 62H828V0H817Q796 3 658 3Q509 3 485 0H472V62H517Q561 62 561 63L517 175H262L240 120Q218 65 217 64Q217 62 261 62H306V0H296ZM390 237L492 238L440 365Q390 491 388 491Q287 239 287 237H390",119809:"720 510Q720 476 704 448T665 404T619 377T580 362L564 359L583 356Q602 353 632 342T690 312Q712 292 725 276Q752 235 752 189V183Q752 160 741 125Q698 18 547 2Q543 1 288 0H39V62H147V624H39V686H264H409Q502 686 542 681T624 655Q720 607 720 510ZM563 513Q563 553 548 578T518 611T486 622Q479 624 385 624H293V382H375Q458 383 467 385Q563 405 563 513ZM590 192Q590 307 505 329Q504 330 503 330L398 331H293V62H391H400H444Q496 62 528 75T580 131Q590 155 590 192",119810:"64 343Q64 502 174 599T468 697Q502 697 533 691T586 674T623 655T647 639T657 632L694 663Q703 670 711 677T723 687T730 692T735 695T740 696T746 697Q759 697 762 692T766 668V627V489V449Q766 428 762 424T742 419H732H720Q699 419 697 436Q690 498 657 545Q611 618 532 632Q522 634 496 634Q356 634 286 553Q232 488 232 343T286 133Q355 52 497 52Q597 52 650 112T704 237Q704 248 709 251T729 254H735Q750 254 755 253T763 248T766 234Q766 136 680 63T469 -11Q285 -11 175 86T64 343",119811:"39 624V686H270H310H408Q500 686 545 680T638 649Q768 584 805 438Q817 388 817 338Q817 171 702 75Q628 17 515 2Q504 1 270 0H39V62H147V624H39ZM655 337Q655 370 655 390T650 442T639 494T616 540T580 580T526 607T451 623Q443 624 368 624H298V62H377H387H407Q445 62 472 65T540 83T606 129Q629 156 640 195T653 262T655 337",119812:"723 286Q721 284 700 145T677 3V0H39V62H147V618H39V680H660V676Q662 670 675 552T691 428V424H629V428Q629 429 627 448T618 494T601 541Q574 593 527 605T382 618H374H304V384H336Q338 384 347 384T361 384T376 386T392 390T407 397T421 407T432 423Q442 444 443 482V501H505V205H443V224Q442 258 435 278T411 307T380 318T336 322H304V62H375H394Q429 62 449 62T497 66T541 76T577 95T609 126T632 170T651 232Q661 287 661 289H723V286",119813:"425 0L228 3Q63 3 51 0H39V62H147V618H39V680H644V676Q647 670 659 552T675 428V424H613Q613 433 605 477Q599 511 589 535T562 574T530 599T488 612T441 617T387 618H368H304V371H333Q389 373 411 390T437 468V488H499V192H437V212Q436 244 430 263T408 292T378 305T333 309H304V62H439V0H425",119814:"465 -10Q281 -10 173 88T64 343Q64 413 85 471T143 568T217 631T298 670Q371 697 449 697Q452 697 459 697T470 696Q502 696 531 690T582 675T618 658T644 641T656 632L732 695Q734 697 745 697Q758 697 761 692T765 668V627V489V449Q765 428 761 424T741 419H731H724Q705 419 702 422T695 444Q683 520 631 577T495 635Q364 635 295 563Q261 528 247 477T232 343Q232 296 236 260T256 185T296 120T366 76T472 52Q481 51 498 51Q544 51 573 67T607 108Q608 111 608 164V214H464V276H479Q506 273 680 273Q816 273 834 276H845V214H765V113V51Q765 16 763 8T750 0Q742 2 709 16T658 40L648 46Q592 -10 465 -10",119815:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H51Q75 683 226 683Q376 683 400 686H412V624H304V388H595V624H487V686H499Q523 683 673 683Q824 683 848 686H860V624H752V62H860V0H848Q824 3 674 3Q523 3 499 0H487V62H595V326H304V62H412V0H400",119816:"397 0Q370 3 218 3Q65 3 38 0H25V62H139V624H25V686H38Q65 683 218 683Q370 683 397 686H410V624H296V62H410V0H397",119817:"174 114Q174 96 169 82T159 63T144 47L155 45Q183 40 203 40Q271 40 290 104Q294 118 294 150T295 380V624H154V686H169Q196 683 365 683Q499 683 517 686H527V624H446V379Q446 183 446 153T441 108Q413 32 315 2Q266 -11 208 -11Q160 -11 118 -2T42 37T8 114V122Q8 150 30 174T91 198T152 174T174 122V114",119818:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H51Q75 683 226 683Q376 683 400 686H412V624H304V338L472 483L634 624H565V686H576Q597 683 728 683Q814 683 829 686H836V624H730L614 524Q507 432 497 422Q496 422 498 418T514 395T553 342T627 241L759 63L805 62H852V0H842Q830 3 701 3Q550 3 526 0H513V62H549Q584 62 584 63Q583 65 486 196T388 328L304 256V62H412V0H400",119819:"643 285Q641 280 629 148T612 4V0H39V62H147V624H39V686H51Q75 683 228 683Q415 685 425 686H439V624H304V62H352H378Q492 62 539 138Q551 156 558 178T569 214T576 255T581 289H643V285",119820:"314 0Q296 3 181 3T48 0H39V62H147V624H39V686H305Q316 679 323 667Q330 653 434 414L546 157L658 414Q766 662 773 674Q778 681 788 686H1052V624H944V62H1052V0H1040Q1016 3 874 3T708 0H696V62H804V341L803 618L786 580Q770 543 735 462T671 315Q540 13 536 9Q528 1 507 1Q485 1 477 9Q472 14 408 162T281 457T217 603Q215 603 215 334V62H323V0H314",119821:"314 0Q296 3 181 3T48 0H39V62H147V624H39V686H171H265Q288 686 297 686T309 684T315 679Q317 676 500 455T684 233V624H576V686H585Q603 683 718 683T851 686H860V624H752V319Q752 15 750 11Q747 4 742 2T718 0H712Q708 0 706 0T700 0T696 1T693 2T690 4T687 7T684 11T679 16T674 23Q671 27 437 311L215 579V62H323V0H314",119822:"64 339Q64 431 96 502T182 614T295 675T420 696Q469 696 481 695Q620 680 709 589T798 339Q798 173 697 82T432 -10Q262 -10 163 85T64 339ZM625 454Q618 502 600 538T562 593T515 624T469 639T431 642Q331 642 276 563Q232 493 232 353Q232 315 234 285T244 216T267 148T308 94T372 56Q405 46 432 46Q517 46 567 106T627 267Q631 299 631 353Q631 418 625 454",119823:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H253Q435 686 470 685T536 678Q585 668 621 648T675 605T705 557T718 514T721 483T718 451T704 409T673 362T616 322T530 293Q500 288 399 287H304V62H412V0H400ZM553 475Q553 554 537 582T459 622Q451 623 373 624H298V343H372Q457 344 480 350Q527 362 540 390T553 475",119824:"64 339Q64 431 96 502T182 614T295 675T420 696Q469 696 481 695Q620 680 709 589T798 339Q798 255 768 184Q720 77 611 26L600 21Q635 -26 682 -26H696Q769 -26 769 0Q769 7 774 12T787 18Q805 18 805 -7V-13Q803 -64 785 -106T737 -171Q720 -183 697 -191Q687 -193 668 -193Q636 -193 613 -182T575 -144T552 -94T532 -27Q531 -23 530 -16T528 -6T526 -3L512 -5Q499 -7 477 -8T431 -10Q393 -10 382 -9Q238 8 151 97T64 339ZM326 80Q326 113 356 138T430 163Q492 163 542 100L553 86Q554 85 561 91T578 108Q637 179 637 330Q637 430 619 498T548 604Q500 641 425 641Q408 641 390 637T347 623T299 590T259 535Q226 469 226 338Q226 244 246 180T318 79L325 74Q326 74 326 80ZM506 58Q480 112 433 112Q412 112 395 104T378 77Q378 44 431 44Q480 44 506 58",119825:"394 0Q370 3 222 3Q75 3 51 0H39V62H147V624H39V686H234Q256 686 299 686T362 687Q479 687 554 669T681 593Q716 550 716 497Q716 390 568 338Q569 337 572 336T577 332Q605 317 623 300T650 258T662 218T668 172Q678 98 689 76Q707 40 748 40Q770 40 780 54T795 88T801 111Q805 117 827 117H831Q846 117 852 113T858 92Q857 78 852 63T834 30T797 1T739 -11Q630 -11 580 12T511 87Q506 104 506 168Q506 170 506 178T507 194Q507 289 438 313Q424 318 356 318H298V62H406V0H394ZM366 369Q459 370 490 381Q548 402 548 476V498V517Q548 578 513 600Q479 624 392 624H358H298V369H366",119826:"64 493Q64 582 120 636T264 696H272Q280 697 285 697Q380 697 454 645L480 669Q484 672 488 676T495 683T500 688T504 691T508 693T511 695T514 696T517 697T522 697Q536 697 539 691T542 652V577Q542 557 542 532T543 500Q543 472 540 465T524 458H511H505Q489 458 485 461T479 478Q472 529 449 564T393 614T336 634T287 639Q228 639 203 610T177 544Q177 517 195 493T247 457Q253 454 343 436T475 391Q574 326 574 207V200Q574 163 559 120Q517 12 389 -9Q380 -10 346 -10Q308 -10 275 -5T221 7T184 22T160 35T151 40L126 17Q122 14 118 10T111 3T106 -2T102 -5T98 -7T95 -9T92 -10T89 -11T84 -11Q70 -11 67 -4T64 35V108Q64 128 64 153T63 185Q63 203 63 211T69 223T77 227T94 228H100Q118 228 122 225T126 205Q130 125 193 88T345 51Q408 51 434 82T460 157Q460 196 439 221T388 257Q384 259 305 276T221 295Q155 313 110 366T64 493",119827:"41 425Q41 426 51 545T62 669V675H737V669Q738 665 748 546T758 425V419H696V425Q687 517 669 555T595 607Q578 612 522 613H478V62H631V0H615Q585 3 399 3Q214 3 184 0H168V62H321V613H277H263Q164 613 134 561Q113 527 103 425V419H41V425",119828:"570 686Q588 683 703 683T836 686H845V624H737V420Q737 390 737 345T738 284Q738 205 729 164T689 83Q614 -11 465 -11Q321 -11 240 51T148 207Q147 214 147 421V624H39V686H51Q75 683 226 683Q376 683 400 686H412V624H304V405V370V268Q304 181 311 146T346 87Q387 52 466 52Q642 52 667 195Q668 204 669 415V624H561V686H570",119829:"592 686H604Q615 685 631 685T666 684T700 684T724 683Q829 683 835 686H843V624H744L611 315Q584 254 546 165Q492 40 482 19T461 -6L460 -7H409Q398 -4 391 9Q385 20 257 315L124 624H25V686H36Q57 683 190 683Q340 683 364 686H377V624H289L384 403L480 185L492 212Q504 240 529 298T575 405L670 624H582V686H592",119830:"915 686L1052 683Q1142 683 1157 686H1164V624H1073L957 320Q930 249 900 170T855 52T839 10Q834 0 826 -5Q821 -7 799 -7H792Q777 -7 772 -5T759 10Q759 11 748 39T716 122T676 228L594 442L512 228Q486 159 455 78Q433 19 428 9T416 -5Q411 -7 389 -7H379Q356 -7 349 10Q349 12 334 51T288 170T231 320L116 624H24V686H35Q44 683 183 683Q331 683 355 686H368V624H323Q278 624 278 623L437 207L499 369L561 531L526 624H434V686H445Q454 683 593 683Q741 683 765 686H778V624H733Q688 624 688 623L847 207Q848 207 927 415T1006 624H905V686H915",119831:"327 0Q306 3 174 3Q52 3 43 0H33V62H98L162 63L360 333L157 624H48V686H59Q80 683 217 683Q368 683 395 686H408V624H335L393 540L452 458L573 623Q573 624 528 624H483V686H494Q515 683 646 683Q769 683 778 686H787V624H658L575 511Q493 398 493 397L508 376Q522 356 553 312T611 229L727 62H835V0H824Q803 3 667 3Q516 3 489 0H476V62H513L549 63L401 274L247 63Q247 62 292 62H338V0H327",119832:"605 0Q581 3 434 3Q286 3 262 0H250V62H358V275L126 624H19V686H30Q54 683 189 683Q361 685 370 686H383V624H308L319 608Q330 591 353 556T396 491L484 359L660 623Q660 624 623 624H585V686H595Q613 683 728 683Q832 683 841 686H849V624H742L509 274V62H618V0H605",119833:"80 430L92 686H358Q624 686 628 684Q638 679 638 656Q638 640 637 639Q637 638 445 353Q401 288 351 214T277 103L253 67L256 66Q258 66 265 66T279 66T298 66H343Q380 66 406 68T464 81T518 110T557 164T579 250Q583 278 583 298Q583 299 614 299H645V291Q643 281 636 150T627 8V0H353Q79 0 75 2Q64 7 64 31Q64 48 66 52L259 340L451 623Q451 624 384 624Q294 623 259 612Q155 581 143 446Q142 440 142 432V430H80",119834:"64 349Q64 399 107 426T255 453Q346 453 402 423T473 341Q478 327 478 310T479 196V77Q493 63 529 62Q549 62 553 57T558 31Q558 9 552 5T514 0H497H481Q375 0 367 56L356 46Q300 -6 210 -6Q130 -6 81 30T32 121Q32 188 111 226T332 272H350V292Q350 313 348 327T337 361T306 391T248 402T194 399H189Q204 376 204 354Q204 327 187 306T134 284Q97 284 81 305T64 349ZM164 121Q164 89 186 67T238 45Q274 45 307 63T346 108L350 117V226H347Q248 218 206 189T164 121",119835:"32 686L123 690Q214 694 215 694H221V409Q289 450 378 450Q479 450 539 387T600 221Q600 122 535 58T358 -6H355Q272 -6 203 53L160 1L129 0H98V301Q98 362 98 435T99 525Q99 591 97 604T83 620Q69 624 42 624H29V686H32ZM227 105L232 99Q237 93 242 87T258 73T280 59T306 49T339 45Q380 45 411 66T451 131Q457 160 457 230Q457 264 456 284T448 329T430 367T396 389T343 398Q282 398 235 355L227 348V105",119836:"447 131H458Q478 131 478 117Q478 112 471 95T439 51T377 9Q330 -6 286 -6Q196 -6 135 35Q39 96 39 222Q39 324 101 384Q169 453 286 453Q359 453 411 431T464 353Q464 319 445 302T395 284Q360 284 343 305T325 353Q325 380 338 396H333Q317 398 295 398H292Q280 398 271 397T245 390T218 373T197 338T183 283Q182 275 182 231Q182 199 184 180T193 132T220 85T270 57Q289 50 317 50H326Q385 50 414 115Q419 127 423 129T447 131",119837:"351 686L442 690Q533 694 534 694H540V389Q540 327 540 253T539 163Q539 97 541 83T555 66Q569 62 596 62H609V31Q609 0 608 0Q588 0 510 -3T412 -6Q411 -6 411 16V38L401 31Q337 -6 265 -6Q159 -6 99 58T38 224Q38 265 51 303T92 375T165 429T272 449Q359 449 417 412V507V555Q417 597 415 607T402 620Q388 624 361 624H348V686H351ZM411 350Q362 399 291 399Q278 399 256 392T218 371Q195 351 189 320T182 238V221Q182 179 183 159T191 115T212 74Q241 46 288 46Q358 46 404 100L411 109V350",119838:"32 225Q32 332 102 392T272 452H283Q382 452 436 401Q494 343 494 243Q494 226 486 222T440 217Q431 217 394 217T327 218H175V209Q175 177 179 154T196 107T236 69T306 50Q312 49 323 49Q376 49 410 85Q421 99 427 111T434 127T442 133T463 135H468Q494 135 494 117Q494 110 489 97T468 66T431 32T373 5T292 -6Q181 -6 107 55T32 225ZM383 276Q377 346 348 374T280 402Q253 402 230 390T195 357Q179 331 176 279V266H383V276",119839:"308 0Q290 3 172 3Q58 3 49 0H40V62H109V382H42V444H109V503L110 562L112 572Q127 625 178 658T316 699Q318 699 330 699T348 700Q381 698 404 687T436 658T449 629T452 606Q452 576 432 557T383 537Q355 537 335 555T314 605Q314 635 328 649H325Q311 649 293 644T253 618T227 560Q226 555 226 498V444H340V382H232V62H318V0H308",119840:"50 300Q50 368 105 409T255 450Q328 450 376 426L388 420Q435 455 489 455Q517 455 533 441T554 414T558 389Q558 367 544 353T508 339Q484 339 471 354T458 387Q458 397 462 400Q464 401 461 400Q459 400 454 399Q429 392 427 390Q454 353 459 328Q461 315 461 300Q461 240 419 202Q364 149 248 149Q185 149 136 172Q129 158 129 148Q129 105 170 93Q176 91 263 91Q273 91 298 91T334 91T366 89T400 85T432 77T466 64Q544 22 544 -69Q544 -114 506 -145Q438 -201 287 -201Q149 -201 90 -161T30 -70Q30 -58 33 -47T42 -27T54 -13T69 -1T82 6T94 12T101 15Q66 57 66 106Q66 151 90 187L97 197L89 204Q50 243 50 300ZM485 403H492Q491 404 488 404L485 403V403ZM255 200Q279 200 295 206T319 219T331 242T335 268T336 300Q336 337 333 352T317 380Q298 399 255 399Q228 399 211 392T187 371T178 345T176 312V300V289Q176 235 194 219Q215 200 255 200ZM287 -150Q357 -150 400 -128T443 -71Q443 -65 442 -61T436 -50T420 -37T389 -27T339 -21L308 -20Q276 -20 253 -20Q190 -20 180 -20T156 -26Q130 -38 130 -69Q130 -105 173 -127T287 -150",119841:"40 686L131 690Q222 694 223 694H229V533L230 372L238 381Q248 394 264 407T317 435T398 450Q428 450 448 447T491 434T529 402T551 346Q553 335 554 198V62H623V0H614Q596 3 489 3Q374 3 365 0H356V62H425V194V275Q425 348 416 373T371 399Q326 399 288 370T238 290Q236 281 235 171V62H304V0H295Q277 3 171 3Q64 3 46 0H37V62H106V332Q106 387 106 453T107 534Q107 593 105 605T91 620Q77 624 50 624H37V686H40",119842:"72 610Q72 649 98 672T159 695Q193 693 217 670T241 610Q241 572 217 549T157 525Q120 525 96 548T72 610ZM46 442L136 446L226 450H232V62H294V0H286Q271 3 171 3Q67 3 49 0H40V62H109V209Q109 358 108 362Q103 380 55 380H43V442H46",119843:"104 610Q104 649 130 672T191 695Q225 693 249 670T273 610Q273 572 249 549T189 525Q152 525 128 548T104 610ZM78 442L173 446L268 450H274V196Q274 -5 274 -37T269 -83Q256 -132 201 -166T71 -200Q10 -200 -30 -173T-71 -102Q-71 -70 -51 -51T-1 -31Q27 -31 48 -49T69 -100Q69 -121 53 -147H56Q66 -149 77 -149H80Q90 -149 100 -146T127 -125T149 -73Q151 -55 151 149V362Q150 364 148 366T145 370T142 373T138 375T133 377T124 378T113 379T97 380H75V442H78",119844:"32 686L123 690Q214 694 215 694H221V255L377 382H346V444H355Q370 441 476 441Q544 441 556 444H562V382H476L347 277L515 62H587V0H579Q564 3 476 3Q370 3 352 0H343V62H358L373 63L260 206L237 189L216 172V62H285V0H277Q259 3 157 3Q46 3 37 0H29V62H98V332Q98 387 98 453T99 534Q99 593 97 605T83 620Q69 624 42 624H29V686H32",119845:"43 686L134 690Q225 694 226 694H232V62H301V0H292Q274 3 170 3Q67 3 49 0H40V62H109V332Q109 387 109 453T110 534Q110 593 108 605T94 620Q80 624 53 624H40V686H43",119846:"40 442Q217 450 218 450H224V365Q226 367 235 378T254 397T278 416T314 435T362 448Q376 450 400 450H406Q503 450 534 393Q545 376 545 370Q545 368 555 379Q611 450 716 450Q774 450 809 434Q850 414 861 379T873 276V213V198V62H942V0H933Q915 3 809 3Q702 3 684 0H675V62H744V194V275Q744 348 735 373T690 399Q645 399 607 370T557 290Q555 281 554 171V62H623V0H614Q596 3 489 3Q374 3 365 0H356V62H425V194V275Q425 348 416 373T371 399Q326 399 288 370T238 290Q236 281 235 171V62H304V0H295Q277 3 171 3Q64 3 46 0H37V62H106V210V303Q106 353 104 363T91 376Q77 380 50 380H37V442H40",119847:"40 442Q217 450 218 450H224V407L225 365Q233 378 245 391T289 422T362 448Q374 450 398 450Q428 450 448 447T491 434T529 402T551 346Q553 335 554 198V62H623V0H614Q596 3 489 3Q374 3 365 0H356V62H425V194V275Q425 348 416 373T371 399Q326 399 288 370T238 290Q236 281 235 171V62H304V0H295Q277 3 171 3Q64 3 46 0H37V62H106V210V303Q106 353 104 363T91 376Q77 380 50 380H37V442H40",119848:"287 -5Q228 -5 182 10T109 48T63 102T39 161T32 219Q32 272 50 314T94 382T154 423T214 446T265 452H279Q319 452 326 451Q428 439 485 376T542 221Q542 156 514 108T442 33Q384 -5 287 -5ZM399 230V250Q399 280 398 298T391 338T372 372T338 392T282 401Q241 401 212 380Q190 363 183 334T175 230Q175 202 175 189T177 153T183 118T195 91T215 68T245 56T287 50Q348 50 374 84Q388 101 393 132T399 230",119849:"32 442L123 446Q214 450 215 450H221V409Q222 409 229 413T251 423T284 436T328 446T382 450Q480 450 540 388T600 223Q600 128 539 61T361 -6H354Q292 -6 236 28L227 34V-132H296V-194H287Q269 -191 163 -191Q56 -191 38 -194H29V-132H98V113V284Q98 330 97 348T93 370T83 376Q69 380 42 380H29V442H32ZM457 224Q457 303 427 349T350 395Q282 395 235 352L227 345V104L233 97Q274 45 337 45Q383 45 420 86T457 224",119850:"38 220Q38 273 54 314T95 380T152 421T211 443T264 449Q368 449 429 386L438 377L484 450H540V-132H609V-194H600Q582 -191 475 -191Q360 -191 351 -194H342V-132H411V42Q409 41 399 34T383 25T367 16T347 7T324 1T296 -4T264 -6Q162 -6 100 56T38 220ZM287 46Q368 46 417 127V301L412 312Q398 347 369 371T302 395Q282 395 263 388T225 362T194 308T182 221Q182 126 214 86T287 46",119851:"405 293T374 293T324 312T305 361Q305 378 312 394Q315 397 315 399Q305 399 294 394T266 375T238 329T222 249Q221 241 221 149V62H308V0H298Q280 3 161 3Q47 3 38 0H29V62H98V210V303Q98 353 96 363T83 376Q69 380 42 380H29V442H32L118 446Q204 450 205 450H210V414L211 378Q247 449 315 449H321Q384 449 413 422T442 360Q442 332 424 313",119852:"38 315Q38 339 45 360T70 404T127 440T223 453Q273 453 320 436L338 445L357 453H366Q380 453 383 447T386 403V387V355Q386 331 383 326T365 321H355H349Q333 321 329 324T324 341Q317 406 224 406H216Q123 406 123 353Q123 334 143 321T188 304T244 294T285 286Q305 281 325 273T373 237T412 172Q414 162 414 142Q414 -6 230 -6Q154 -6 117 22L68 -6H58Q44 -6 41 0T38 42V73Q38 85 38 101T37 122Q37 144 42 148T68 153H75Q87 153 91 151T97 147T103 132Q131 46 220 46H230Q257 46 265 47Q330 58 330 108Q330 127 316 142Q300 156 284 162Q271 168 212 178T122 202Q38 243 38 315",119853:"272 49Q320 49 320 136V145V177H382V143Q382 106 380 99Q374 62 349 36T285 -2L272 -5H247Q173 -5 134 27Q109 46 102 74T94 160Q94 171 94 199T95 245V382H21V433H25Q58 433 90 456Q121 479 140 523T162 621V635H224V444H363V382H224V239V207V149Q224 98 228 81T249 55Q261 49 272 49",119854:"40 442L134 446Q228 450 229 450H235V273V165Q235 90 238 74T254 52Q268 46 304 46H319Q352 46 380 67T419 121L420 123Q424 135 425 199Q425 201 425 207Q425 233 425 249V316Q425 354 423 363T410 376Q396 380 369 380H356V442L554 450V267Q554 84 556 79Q561 62 610 62H623V31Q623 0 622 0Q603 0 527 -3T432 -6Q431 -6 431 25V56L420 45Q373 6 332 -1Q313 -6 281 -6Q208 -6 165 14T109 87L107 98L106 230Q106 358 104 366Q96 380 50 380H37V442H40",119855:"401 444Q413 441 495 441Q568 441 574 444H580V382H510L409 156Q348 18 339 6Q331 -4 320 -4Q318 -4 313 -4T303 -3H288Q273 -3 264 12T221 102Q206 135 197 156L96 382H26V444H34Q49 441 145 441Q252 441 270 444H279V382H231L284 264Q335 149 338 149Q338 150 389 264T442 381Q442 382 418 382H394V444H401",119856:"624 444Q636 441 722 441Q797 441 800 444H805V382H741L593 11Q592 10 590 8T586 4T584 2T581 0T579 -2T575 -3T571 -3T567 -4T561 -4T553 -4H542Q525 -4 518 6T490 70Q474 110 463 137L415 257L367 137Q357 111 341 72Q320 17 313 7T289 -4H277Q259 -4 253 -2T238 11L90 382H25V444H32Q47 441 140 441Q243 441 261 444H270V382H222L310 164L382 342L366 382H303V444H310Q322 441 407 441Q508 441 523 444H531V382H506Q481 382 481 380Q482 376 529 259T577 142L674 382H617V444H624",119857:"227 0Q212 3 121 3Q40 3 28 0H21V62H117L245 213L109 382H26V444H34Q49 441 143 441Q247 441 265 444H274V382H246L281 339Q315 297 316 297Q320 297 354 341L389 382H352V444H360Q375 441 466 441Q547 441 559 444H566V382H471L355 246L504 63L545 62H586V0H578Q563 3 469 3Q365 3 347 0H338V62H366Q366 63 326 112T285 163L198 63L217 62H235V0H227",119858:"84 -102Q84 -110 87 -119T102 -138T133 -149Q148 -148 162 -143T186 -131T206 -114T222 -95T234 -76T243 -59T249 -45T252 -37L269 0L96 382H26V444H34Q49 441 146 441Q252 441 270 444H279V382H255Q232 382 232 380L337 151L442 382H394V444H401Q413 441 495 441Q568 441 574 444H580V382H510L406 152Q298 -84 297 -87Q269 -139 225 -169T131 -200Q85 -200 54 -172T23 -100Q23 -64 44 -50T87 -35Q111 -35 130 -50T152 -92V-100H84V-102",119859:"48 262Q48 264 54 349T60 436V444H252Q289 444 336 444T394 445Q441 445 450 441T459 418Q459 406 458 404Q456 399 327 229T194 55H237Q260 56 268 56T297 58T325 65T348 77T370 98T384 128T395 170Q400 197 400 216Q400 217 431 217H462V211Q461 208 453 108T444 6V0H245Q46 0 43 2Q32 7 32 28V33Q32 41 40 52T84 112Q129 170 164 217L298 393H256Q189 392 165 380Q124 360 115 303Q110 280 110 256Q110 254 79 254H48V262",119860:"208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260",119861:"231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229",119862:"50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252",119863:"287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469",119864:"492 213Q472 213 472 226Q472 230 477 250T482 285Q482 316 461 323T364 330H312Q311 328 277 192T243 52Q243 48 254 48T334 46Q428 46 458 48T518 61Q567 77 599 117T670 248Q680 270 683 272Q690 274 698 274Q718 274 718 261Q613 7 608 2Q605 0 322 0H133Q31 0 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H757Q764 676 764 669Q764 664 751 557T737 447Q735 440 717 440H705Q698 445 698 453L701 476Q704 500 704 528Q704 558 697 578T678 609T643 625T596 632T532 634H485Q397 633 392 631Q388 629 386 622Q385 619 355 499T324 377Q347 376 372 376H398Q464 376 489 391T534 472Q538 488 540 490T557 493Q562 493 565 493T570 492T572 491T574 487T577 483L544 351Q511 218 508 216Q505 213 492 213",119865:"48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1",119866:"50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q492 659 471 656T418 643T357 615T294 567T236 496T189 394T158 260Q156 242 156 221Q156 173 170 136T206 79T256 45T308 28T353 24Q407 24 452 47T514 106Q517 114 529 161T541 214Q541 222 528 224T468 227H431Q425 233 425 235T427 254Q431 267 437 273H454Q494 271 594 271Q634 271 659 271T695 272T707 272Q721 272 721 263Q721 261 719 249Q714 230 709 228Q706 227 694 227Q674 227 653 224Q646 221 643 215T629 164Q620 131 614 108Q589 6 586 3Q584 1 581 1Q571 1 553 21T530 52Q530 53 528 52T522 47Q448 -22 322 -22Q201 -22 126 55T50 252",119867:"228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 219 683Q260 681 355 681Q389 681 418 681T463 682T483 682Q499 682 499 672Q499 670 497 658Q492 641 487 638H485Q483 638 480 638T473 638T464 637T455 637Q416 636 405 634T387 623Q384 619 355 500Q348 474 340 442T328 395L324 380Q324 378 469 378H614L615 381Q615 384 646 504Q674 619 674 627T617 637Q594 637 587 639T580 648Q580 650 582 660Q586 677 588 679T604 682Q609 682 646 681T740 680Q802 680 835 681T871 682Q888 682 888 672Q888 645 876 638H874Q872 638 869 638T862 638T853 637T844 637Q805 636 794 634T776 623Q773 618 704 340T634 58Q634 51 638 51Q646 48 692 46H723Q729 38 729 37T726 19Q722 6 716 0H701Q664 2 567 2Q533 2 504 2T458 2T437 1Q420 1 420 10Q420 15 423 24Q428 43 433 45Q437 46 448 46H454Q481 46 514 49Q520 50 522 50T528 55T534 64T540 82T547 110T558 153Q565 181 569 198Q602 330 602 331T457 332H312L279 197Q245 63 245 58Q245 51 253 49T303 46H334Q340 38 340 37T337 19Q333 6 327 0H312Q275 2 178 2Q144 2 115 2T69 2T48 1Q31 1 31 10Q31 12 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637",119868:"43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1",119869:"447 625Q447 637 354 637H329Q323 642 323 645T325 664Q329 677 335 683H352Q393 681 498 681Q541 681 568 681T605 682T619 682Q633 682 633 672Q633 670 630 658Q626 642 623 640T604 637Q552 637 545 623Q541 610 483 376Q420 128 419 127Q397 64 333 21T195 -22Q137 -22 97 8T57 88Q57 130 80 152T132 174Q177 174 182 130Q182 98 164 80T123 56Q115 54 115 53T122 44Q148 15 197 15Q235 15 271 47T324 130Q328 142 387 380T447 625",119870:"285 628Q285 635 228 637Q205 637 198 638T191 647Q191 649 193 661Q199 681 203 682Q205 683 214 683H219Q260 681 355 681Q389 681 418 681T463 682T483 682Q500 682 500 674Q500 669 497 660Q496 658 496 654T495 648T493 644T490 641T486 639T479 638T470 637T456 637Q416 636 405 634T387 623L306 305Q307 305 490 449T678 597Q692 611 692 620Q692 635 667 637Q651 637 651 648Q651 650 654 662T659 677Q662 682 676 682Q680 682 711 681T791 680Q814 680 839 681T869 682Q889 682 889 672Q889 650 881 642Q878 637 862 637Q787 632 726 586Q710 576 656 534T556 455L509 418L518 396Q527 374 546 329T581 244Q656 67 661 61Q663 59 666 57Q680 47 717 46H738Q744 38 744 37T741 19Q737 6 731 0H720Q680 3 625 3Q503 3 488 0H478Q472 6 472 9T474 27Q478 40 480 43T491 46H494Q544 46 544 71Q544 75 517 141T485 216L427 354L359 301L291 248L268 155Q245 63 245 58Q245 51 253 49T303 46H334Q340 37 340 35Q340 19 333 5Q328 0 317 0Q314 0 280 1T180 2Q118 2 85 2T49 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628",119871:"228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637",119872:"289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629",119873:"234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637",119874:"740 435Q740 320 676 213T511 42T304 -22Q207 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435ZM637 476Q637 565 591 615T476 665Q396 665 322 605Q242 542 200 428T157 216Q157 126 200 73T314 19Q404 19 485 98T608 313Q637 408 637 476",119875:"287 628Q287 635 230 637Q206 637 199 638T192 648Q192 649 194 659Q200 679 203 681T397 683Q587 682 600 680Q664 669 707 631T751 530Q751 453 685 389Q616 321 507 303Q500 302 402 301H307L277 182Q247 66 247 59Q247 55 248 54T255 50T272 48T305 46H336Q342 37 342 35Q342 19 335 5Q330 0 319 0Q316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597T609 619T560 635Q553 636 480 637Q463 637 445 637T416 636T404 636Q391 635 386 627Q384 621 367 550T332 412T314 344Q314 342 395 342H407H430Q542 342 590 392Q617 419 631 471T645 554",119876:"399 -80Q399 -47 400 -30T402 -11V-7L387 -11Q341 -22 303 -22Q208 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435Q740 255 592 107Q529 47 461 16L444 8V3Q444 2 449 -24T470 -66T516 -82Q551 -82 583 -60T625 -3Q631 11 638 11Q647 11 649 2Q649 -6 639 -34T611 -100T557 -165T481 -194Q399 -194 399 -87V-80ZM636 468Q636 523 621 564T580 625T530 655T477 665Q429 665 379 640Q277 591 215 464T153 216Q153 110 207 59Q231 38 236 38V46Q236 86 269 120T347 155Q372 155 390 144T417 114T429 82T435 55L448 64Q512 108 557 185T619 334T636 468ZM314 18Q362 18 404 39L403 49Q399 104 366 115Q354 117 347 117Q344 117 341 117T337 118Q317 118 296 98T274 52Q274 18 314 18",119877:"230 637Q203 637 198 638T193 649Q193 676 204 682Q206 683 378 683Q550 682 564 680Q620 672 658 652T712 606T733 563T739 529Q739 484 710 445T643 385T576 351T538 338L545 333Q612 295 612 223Q612 212 607 162T602 80V71Q602 53 603 43T614 25T640 16Q668 16 686 38T712 85Q717 99 720 102T735 105Q755 105 755 93Q755 75 731 36Q693 -21 641 -21H632Q571 -21 531 4T487 82Q487 109 502 166T517 239Q517 290 474 313Q459 320 449 321T378 323H309L277 193Q244 61 244 59Q244 55 245 54T252 50T269 48T302 46H333Q339 38 339 37T336 19Q332 6 326 0H311Q275 2 180 2Q146 2 117 2T71 2T50 1Q33 1 33 10Q33 12 36 24Q41 43 46 45Q50 46 61 46H67Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628Q287 635 230 637ZM630 554Q630 586 609 608T523 636Q521 636 500 636T462 637H440Q393 637 386 627Q385 624 352 494T319 361Q319 360 388 360Q466 361 492 367Q556 377 592 426Q608 449 619 486T630 554",119878:"308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24",119879:"40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40",119880:"107 637Q73 637 71 641Q70 643 70 649Q70 673 81 682Q83 683 98 683Q139 681 234 681Q268 681 297 681T342 682T362 682Q378 682 378 672Q378 670 376 658Q371 641 366 638H364Q362 638 359 638T352 638T343 637T334 637Q295 636 284 634T266 623Q265 621 238 518T184 302T154 169Q152 155 152 140Q152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606Q599 633 535 637Q511 637 511 648Q511 650 513 660Q517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672Q767 650 759 642Q756 637 737 637Q666 633 648 597Q646 592 598 404Q557 235 548 205Q515 105 433 42T263 -22Q171 -22 116 34T60 167V183Q60 201 115 421Q164 622 164 628Q164 635 107 637",119881:"52 648Q52 670 65 683H76Q118 680 181 680Q299 680 320 683H330Q336 677 336 674T334 656Q329 641 325 637H304Q282 635 274 635Q245 630 242 620Q242 618 271 369T301 118L374 235Q447 352 520 471T595 594Q599 601 599 609Q599 633 555 637Q537 637 537 648Q537 649 539 661Q542 675 545 679T558 683Q560 683 570 683T604 682T668 681Q737 681 755 683H762Q769 676 769 672Q769 655 760 640Q757 637 743 637Q730 636 719 635T698 630T682 623T670 615T660 608T652 599T645 592L452 282Q272 -9 266 -16Q263 -18 259 -21L241 -22H234Q216 -22 216 -15Q213 -9 177 305Q139 623 138 626Q133 637 76 637H59Q52 642 52 648",119882:"436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683",119883:"42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0",119884:"66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637",119885:"58 8Q58 23 64 35Q64 36 329 334T596 635L586 637Q575 637 512 637H500H476Q442 637 420 635T365 624T311 598T266 548T228 469Q227 466 226 463T224 458T223 453T222 450L221 448Q218 443 202 443Q185 443 182 453L214 561Q228 606 241 651Q249 679 253 681Q256 683 487 683H718Q723 678 723 675Q723 673 717 649Q189 54 188 52L185 49H274Q369 50 377 51Q452 60 500 100T579 247Q587 272 590 277T603 282H607Q628 282 628 271Q547 5 541 2Q538 0 300 0H124Q58 0 58 8",119886:"33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328",119887:"73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325",119888:"34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159",119889:"366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326",119890:"39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353",119891:"118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162",119892:"311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328",119894:"184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287",119895:"297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376",119896:"121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647",119897:"117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59",119898:"21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287",119899:"21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287",119900:"201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120",119901:"23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102",119902:"33 157Q33 258 109 349T280 441Q340 441 372 389Q373 390 377 395T388 406T404 418Q438 442 450 442Q454 442 457 439T460 434Q460 425 391 149Q320 -135 320 -139Q320 -147 365 -148H390Q396 -156 396 -157T393 -175Q389 -188 383 -194H370Q339 -192 262 -192Q234 -192 211 -192T174 -192T157 -193Q143 -193 143 -185Q143 -182 145 -170Q149 -154 152 -151T172 -148Q220 -148 230 -141Q238 -136 258 -53T279 32Q279 33 272 29Q224 -10 172 -10Q117 -10 75 30T33 157ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326",119903:"21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287",119904:"131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289",119905:"26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26",119906:"21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287",119907:"173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380",119908:"580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385",119909:"52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289",119910:"21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287",119911:"347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338",119912:"65 0Q45 0 45 18Q48 52 61 60Q65 62 81 62Q155 62 165 74Q166 74 265 228T465 539T569 699Q576 707 583 709T611 711T637 710T649 700Q650 697 695 380L741 63L784 62H827Q839 50 839 45L835 29Q831 9 827 5T806 0Q803 0 790 0T743 1T657 2Q585 2 547 1T504 0Q481 0 481 17Q484 54 497 60Q501 62 541 62Q580 62 580 63Q580 68 573 121T564 179V181H308L271 124Q236 69 236 67T283 62H287Q316 62 316 46Q316 26 307 8Q302 3 295 0L262 1Q242 2 168 2Q119 2 93 1T65 0ZM537 372Q533 402 528 435T521 486T518 504V505Q517 505 433 375L348 244L451 243Q555 243 555 244L537 372",119913:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 449 686H477H586Q684 686 733 677T817 634Q853 598 853 547Q853 499 826 460T761 401T695 371T654 360H653L662 358Q670 357 683 354T712 344T744 327T774 303T795 269T804 224Q804 148 732 79T533 1Q524 0 288 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624ZM703 550Q703 571 695 586T675 609T656 619T643 623L545 624H447L417 504Q386 384 386 383T470 382Q554 383 565 385Q632 397 667 447T703 550ZM651 240Q651 265 645 282T626 309T608 322T592 329Q587 330 479 331H373L340 198Q307 65 306 64Q306 62 406 62L507 63L519 65Q565 76 596 107T639 171T651 240",119914:"380 -17Q335 -17 293 -10T207 16T130 65T76 144T55 256Q55 306 70 361T122 476T211 582T345 663T525 702H545Q673 702 731 634L777 668Q783 672 789 677T800 685T808 691T814 695T818 698T822 700T825 702T828 703T830 703T833 703Q855 703 855 690Q855 686 823 558T789 426Q786 421 782 420T756 419Q734 420 729 421T724 432Q724 434 725 447T726 472Q726 552 678 604Q640 640 586 640H574Q533 640 494 632T409 604T324 541T260 437Q243 397 227 333T210 219Q210 152 237 117Q255 90 299 68T420 46H429Q506 46 580 100T678 234Q683 249 687 251T712 254H723Q743 254 743 240Q743 232 736 213T710 162T663 100T586 40T477 -5Q433 -17 380 -17",119915:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 437 686Q659 686 668 685Q727 680 772 662T842 621T883 568T905 517T913 475Q914 466 914 434Q914 373 892 307T828 179T712 69T548 7Q517 2 494 2T279 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624ZM768 475Q768 515 753 544T718 588T666 611T613 622T563 624H538H532H452L382 344Q311 64 311 63T363 62H405Q490 62 545 76T656 142Q696 185 724 265T760 399T768 475",119916:"257 618H231Q198 618 198 636Q202 672 214 678L219 680H811Q817 677 820 673T824 666L825 664Q825 659 814 549T799 433Q793 424 771 424Q752 424 746 427T740 441Q740 445 742 466T744 505Q744 561 722 585T646 616Q639 617 545 618H456Q456 617 427 502T398 385Q398 384 435 384Q461 385 471 385T499 391T526 405T545 433T562 478Q566 494 571 497T595 501H604Q622 501 626 486Q626 482 593 349T557 213Q552 205 530 205Q499 205 499 219Q499 222 503 242T508 281Q508 308 491 314T429 322Q425 322 423 322H382L317 64Q317 62 390 62Q460 62 493 64T569 80T640 124Q665 149 686 187T719 253T733 283Q739 289 760 289Q791 289 791 274Q791 267 763 201T706 71L678 8Q676 4 667 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L163 66Q163 67 231 341T301 616Q301 618 257 618",119917:"257 618H231Q198 618 198 636Q202 672 214 678L219 680H795Q801 677 804 673T808 666L809 664Q809 659 798 549T783 433Q777 424 755 424Q736 424 730 427T724 444Q724 448 725 468T727 507V524Q727 541 724 554T713 577T698 594T676 605T653 612T625 616T597 617T566 618T538 618H456L455 614Q455 611 424 491L394 371H429Q454 372 463 372T491 378T517 392T536 419T552 464Q556 481 561 484T586 488Q603 488 607 486Q616 482 616 473Q616 467 584 337T549 201Q542 192 521 192Q503 192 497 195T490 209Q490 212 492 224Q499 251 499 269Q499 288 489 296T465 306T417 308L379 309L348 188Q341 161 334 129T322 80L318 65L317 62H375H409Q430 62 438 59T447 45Q444 8 431 2L426 0L377 1Q347 2 231 2Q152 2 111 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L163 66Q163 67 231 341T301 616Q301 618 257 618",119918:"379 -16Q233 -16 145 52T56 255Q56 310 73 368T127 483T216 586T347 663T518 702H540Q562 702 582 700T616 696T644 689T667 681T686 670T702 659T717 647T731 635L776 668Q782 672 788 677T799 685T807 691T813 695T817 698T821 700T824 702T827 703T829 703T832 703Q854 703 854 690Q854 686 822 558T788 426Q785 421 781 420T755 419Q734 420 729 422T723 432Q723 434 724 446T725 469Q725 531 702 571T642 628Q616 640 575 640Q468 640 390 593T272 464Q247 415 229 340T210 214Q210 166 228 132T277 79T343 54T419 46Q445 46 465 50T500 59T526 76T544 96T557 123T566 150T574 182T581 214H519Q511 214 498 214T479 213Q443 213 443 230Q443 250 452 268Q457 273 464 276L514 275Q546 274 657 274Q735 274 768 275T803 276Q826 276 826 258Q823 224 810 216Q806 214 771 214H736Q736 211 710 109T683 5Q678 0 671 0Q666 0 637 14T597 36Q593 38 590 40T585 44T582 44T576 40Q511 -16 379 -16",119919:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 239 686Q290 684 403 684Q475 684 512 685T553 686Q576 686 576 668Q572 632 560 626Q555 624 506 624H457L399 389Q399 388 547 388H695L753 623Q753 624 709 624H686Q665 624 660 626T650 639Q653 678 668 684Q672 686 681 686Q685 686 726 685T847 684Q902 684 937 684T986 685T1004 686Q1027 686 1027 668Q1023 632 1011 626Q1006 624 957 624H908L839 344Q768 64 768 63T812 62H839Q871 62 871 44Q867 6 854 2L850 0L808 1Q782 2 675 2Q600 2 560 1T516 0Q499 0 494 15Q498 54 511 60Q515 62 564 62H613L614 66L679 324Q679 326 531 326H383L382 322L317 64Q317 62 361 62H388Q420 62 420 44Q416 6 403 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624",119920:"247 624Q242 624 233 624T220 623Q186 623 186 640Q186 647 190 664T202 684Q206 686 226 686Q277 684 393 684Q435 684 471 684T528 685T553 686Q573 686 573 670Q573 650 564 632Q556 624 537 624H501H449L380 344Q309 64 309 63T356 62Q361 62 370 62T384 63Q417 63 417 46Q417 26 408 8Q403 3 396 0L352 1Q325 2 216 2T82 1L45 0Q30 7 30 16Q33 51 46 60Q51 62 102 62H154L294 623Q294 624 247 624",119921:"205 131Q205 105 192 84T165 54L152 45Q152 44 160 42T182 37T213 35H216Q255 35 289 65Q314 90 329 129Q331 136 392 378T453 623Q453 624 393 624H332Q318 631 318 640Q318 647 322 664T334 684Q338 686 359 686Q413 684 533 684Q566 684 605 685T652 686Q677 686 685 683T694 669Q694 664 691 652Q686 631 681 628T647 624H602L542 380Q531 336 518 285T500 212T487 161T475 122T463 97T448 74T429 55Q351 -17 213 -17Q142 -17 99 7T43 70Q42 75 42 93Q42 143 73 168T139 194Q168 194 186 177T205 131",119922:"536 0Q522 6 522 18Q522 35 533 57Q539 62 557 62Q595 62 601 65L472 330L365 255L342 160Q318 65 317 64Q317 62 361 62H388Q420 62 420 44Q416 6 403 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 239 686Q290 684 403 684Q475 684 512 685T553 686Q576 686 576 668Q572 632 560 626Q555 624 506 624H457L422 481Q386 339 386 337L785 621Q779 624 749 624Q726 624 726 641Q726 645 730 659Q734 675 736 679T747 686L786 685Q812 684 888 684Q908 684 934 685T968 686Q1003 686 1003 669Q1003 646 991 629Q985 624 967 624Q918 624 888 617Q884 617 874 613L865 609Q864 608 732 515T599 420Q599 418 686 242T775 65Q784 62 829 62Q847 62 850 61T860 54Q862 52 862 43Q862 10 845 1Q844 1 842 1T836 0T797 1T694 2Q599 2 573 1L536 0",119923:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 239 686Q290 684 409 684Q454 684 492 684T552 685T579 686Q603 686 603 668Q599 632 587 626Q583 624 520 624H457L388 344Q317 64 317 63T353 62H390Q418 62 440 64T493 78T548 110T598 169T643 261Q651 282 655 285T680 289Q696 289 700 288T709 279Q711 274 711 269Q710 265 663 138T613 8Q611 4 602 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624",119924:"258 624H231Q214 624 208 626T199 639Q203 678 216 684Q220 686 347 686H473Q474 685 478 682T484 677Q487 673 535 413L584 153L608 187Q631 221 672 281T761 410Q935 663 943 671Q949 678 962 686H1082H1166Q1201 686 1210 683T1219 668Q1215 632 1203 626Q1199 624 1149 624H1100L1031 344Q960 64 960 63T1004 62H1031Q1063 62 1063 44Q1060 7 1046 2Q1042 0 1034 0Q1030 0 990 1T875 2Q804 2 767 1T725 0H723Q707 0 703 15Q707 54 720 60Q724 62 773 62H822Q961 618 961 619L754 318Q546 15 543 12Q531 0 510 0Q500 0 495 0T484 5T477 19Q477 20 421 315L367 604L299 335Q234 72 234 68Q234 62 302 62Q334 62 334 46Q332 8 317 2Q313 0 306 0Q301 0 267 1T181 2Q125 2 96 1T63 0Q48 0 43 15Q43 19 47 35Q52 55 57 58T94 62Q147 64 164 69L233 345Q302 619 302 622Q302 624 258 624",119925:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 344 686H434Q464 686 477 680Q480 677 607 454Q738 227 739 227Q742 227 789 418T836 618Q836 620 835 620L821 622Q811 622 779 624Q755 624 749 625T740 632Q737 635 737 644Q737 656 742 669T754 685Q755 685 757 685T763 686Q768 686 803 685T890 684Q925 684 951 684T990 685T1006 686Q1014 686 1016 684Q1027 679 1027 668Q1023 632 1011 626Q1007 624 978 624Q912 622 907 617Q907 616 831 314T753 8Q749 0 723 0H712Q699 0 692 7Q692 8 671 44T607 155T526 296L361 580L296 323Q234 74 234 68T302 62H307Q334 62 334 44Q330 6 317 2L313 0L280 1Q260 2 181 2Q125 2 96 1T63 0Q48 0 43 15Q43 19 47 35Q52 55 57 58T94 62Q147 64 164 69L233 345Q302 619 302 622Q302 624 258 624",119926:"53 245Q53 297 70 356T125 478T216 590T349 671T523 703Q656 703 735 637T815 445Q815 378 791 307Q727 104 527 17Q437 -17 344 -17Q289 -17 242 -5T150 35T79 116T53 245ZM664 489Q664 575 618 611T511 648Q463 648 416 627T334 570Q297 531 270 472T230 355T213 261T208 206Q208 177 215 151T237 98T284 56T358 40Q440 40 510 98T618 270Q664 400 664 489",119927:"162 62L302 623Q302 624 258 624H234Q214 624 209 626T200 638Q200 677 217 684Q220 686 439 686Q667 685 684 682Q686 681 693 680Q713 677 733 671T782 649T829 602T847 528Q847 450 784 382T604 293Q571 288 469 287H373L346 176Q340 151 333 122T321 78L317 64Q317 62 361 62H387Q420 62 420 44Q417 10 404 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q43 0 43 17Q43 21 47 33Q52 54 57 58T89 62H113H162ZM692 558Q692 611 617 622Q610 623 529 624H452L381 343H458H492Q604 343 641 389Q662 414 677 471T692 558",119928:"53 245Q53 297 70 356T125 478T216 590T349 671T523 703Q656 703 735 637T815 445Q815 410 808 370T781 277T729 178T643 87T519 14L525 4Q540 -19 553 -25T592 -32Q632 -32 654 -24T680 -7T689 10T704 18Q713 18 717 12T722 0Q722 -8 711 -36T681 -101T624 -166T541 -194Q513 -194 494 -183T465 -157T450 -118T444 -79T443 -41V-7L433 -9Q391 -17 344 -17Q301 -17 263 -10T185 15T118 62T71 138T53 245ZM666 482Q666 529 652 563T614 615T565 640T512 648Q412 648 335 573Q268 506 235 389T201 202Q201 164 210 136T230 95T259 66L262 76Q269 109 302 135T382 162Q401 162 415 159T449 140T484 92L491 78L496 82Q502 86 505 88T515 97T528 107T541 120T555 137T570 156T585 179T599 205T612 235Q629 278 647 351T666 482ZM439 56Q439 58 439 62T435 75T426 92T410 106T383 112Q353 112 332 96T311 63Q311 38 355 38H366Q391 39 415 45T439 56",119929:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 422 686H446H525Q634 686 698 674T806 620Q843 583 843 535Q843 505 833 478T805 432T768 396T728 370T690 352T662 342L651 338L654 336Q658 334 667 327T688 310Q719 278 719 237Q719 222 710 165T701 94Q701 35 748 35Q775 35 793 57T819 101Q822 112 826 114T843 117H849Q881 117 881 99Q881 78 852 39T781 -11Q765 -17 728 -17Q537 -13 537 94Q537 110 552 169T567 243Q567 292 529 309Q517 316 508 316T441 318H375L374 314Q374 312 343 189T311 64Q311 62 355 62H382Q414 62 414 44Q410 6 397 2L393 0L351 1Q325 2 221 2Q147 2 108 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624ZM687 555Q687 617 589 623Q581 624 513 624H451L420 498Q413 468 405 436T392 388L388 371Q388 369 458 369Q464 369 485 369T515 369T541 372T570 377T596 386T624 400Q649 417 664 457T683 522T687 555",119930:"354 45Q429 45 467 91T506 184Q506 225 477 250Q461 262 384 279T294 300Q238 318 210 362T182 452Q182 493 202 540T257 623Q338 702 449 702Q491 702 501 701Q571 690 610 654Q614 649 617 650Q618 650 650 675T683 702Q685 703 692 703Q714 703 714 690Q714 686 687 578T658 466Q653 458 629 458Q606 458 602 463Q600 465 599 466Q599 467 599 469T598 473Q598 475 599 487T600 511Q600 584 557 614T454 645Q386 645 347 606T308 520Q308 506 311 496T323 477T338 464T360 454T384 446T413 439T441 433Q523 416 549 401Q581 384 602 352Q631 309 631 254Q631 214 615 170T567 83T478 12T347 -16Q322 -16 300 -14T261 -8T230 0T205 10T187 20T172 30L162 37L130 11Q124 7 119 3T110 -4T104 -9T100 -13T96 -15T93 -16T91 -17T88 -17H82Q76 -17 73 -16T69 -14T66 -10T63 -5L90 107Q97 133 106 170Q116 211 120 219T136 228H148Q167 228 173 227T179 218Q179 216 176 200T173 168Q173 102 227 74T354 45",119931:"498 62Q511 58 511 43Q511 10 494 1L490 0Q487 0 482 0T424 1T271 2Q201 2 157 2T94 1T72 0H70Q46 0 46 17Q49 54 62 60L66 62H137Q208 62 209 63L218 98Q227 134 244 203T278 339L347 613H300Q262 612 246 611T198 599T146 564Q128 545 114 512T91 454T79 425Q73 419 52 419Q22 419 22 434Q22 440 41 498T80 611L100 666Q105 673 111 675H434Q758 675 762 673Q772 668 772 657Q772 655 756 549T738 434Q735 419 711 419H707Q690 419 686 421Q677 425 677 434Q676 436 678 449T683 485T686 529Q686 553 679 569T662 594T631 607T593 612T544 613H502L433 340Q418 279 400 207T374 100L365 65L364 62H498",119932:"856 686Q877 686 877 668Q877 663 873 649T867 631Q861 624 828 624Q762 622 757 617Q757 613 705 409T651 200Q620 112 540 48T328 -16Q251 -16 196 2T113 51T75 112T63 176Q63 202 70 232T117 422Q129 469 141 520T160 598L167 623Q167 624 123 624H96Q79 624 73 626T64 639Q68 678 81 684Q85 686 104 686Q155 684 268 684Q340 684 377 685T418 686Q441 686 441 668Q437 632 425 626Q421 624 371 624H322L270 415Q224 232 217 198T209 141Q209 45 336 45Q372 45 406 52T475 77T540 128T585 211L590 229Q594 247 601 274T617 336T636 409T654 482T670 547T681 595T686 618Q686 620 685 620H683Q681 621 678 621T671 622Q660 622 630 624Q616 624 610 624T598 626T589 630T587 640Q587 647 590 659Q594 677 598 681T613 686Q618 686 653 685T740 684Q775 684 801 684T840 685T856 686",119933:"401 686Q415 680 415 668Q415 651 404 629Q398 624 356 624Q318 624 318 623Q318 620 337 508T377 284L397 174L472 285Q548 396 623 507T699 620Q698 621 652 624Q634 624 627 627T619 641Q619 648 622 658Q627 677 631 681T650 686Q654 686 686 685T766 684Q794 684 823 684T858 685Q874 685 878 683T886 671Q886 667 882 651Q877 632 873 628T850 624Q800 624 779 617Q774 617 770 613Q767 610 560 304T350 -5Q346 -9 332 -16H306H291Q270 -16 267 -2Q267 -1 260 37T238 161T210 313L156 624H116H94Q62 624 62 642Q66 678 78 684Q82 686 99 686Q144 684 246 684Q330 684 368 685L401 686",119934:"111 624Q109 624 102 624T91 623Q61 623 61 640Q61 660 70 678Q78 686 98 686Q140 684 239 684Q277 684 309 684T360 685T383 686H385Q407 686 407 668Q404 634 391 626Q387 624 348 624Q307 624 307 622Q307 618 332 409Q359 198 359 195L570 532L564 576L558 622V624H522H504Q472 624 472 641Q475 678 488 684L493 686L529 685Q551 684 645 684Q716 684 753 685T795 686Q818 686 818 669Q815 632 802 626Q798 624 759 624Q718 624 718 622Q718 615 743 410Q770 199 770 196Q770 195 806 253T903 406Q1035 618 1035 619Q1025 624 968 624Q943 624 943 641Q943 648 946 659Q950 675 952 679T963 686L998 685Q1020 684 1093 684Q1113 684 1139 685T1173 686Q1207 686 1207 669Q1207 664 1204 652Q1199 631 1194 628T1164 624Q1113 622 1101 615Q1098 612 905 305Q715 -1 709 -7Q699 -17 673 -17Q645 -17 639 -8L581 441Q581 444 442 221Q331 44 314 18T288 -14Q279 -17 263 -17H254Q229 -17 227 -5Q225 2 186 311L147 620V624H111",119935:"931 686Q953 686 953 670Q953 650 944 632Q936 624 924 624H914Q823 624 803 611Q800 609 696 503T591 396Q591 394 667 229L743 62H787H814Q846 62 846 44Q843 7 829 2Q825 0 817 0Q813 0 775 1T664 2Q590 2 551 1T508 0H507Q484 0 484 18Q484 19 488 37Q492 56 497 58T534 62L566 63Q567 64 520 169T471 274Q469 274 369 172T268 67L315 62Q320 62 328 62L335 61Q347 58 347 44Q344 10 331 2L326 0L287 1Q263 2 177 2Q95 2 78 1L53 0Q38 6 38 17Q38 40 50 57Q56 62 78 62Q169 62 188 75Q194 77 435 324L444 334L439 347Q437 351 373 492L313 624H268H246Q220 624 212 632Q210 636 210 642Q210 655 215 669T227 684Q230 686 247 686Q295 684 398 684Q438 684 472 684T527 685T551 686Q567 686 572 671Q572 667 568 651Q563 631 558 628T523 624T492 623H488L526 540Q563 457 564 457Q564 456 574 466T604 496T645 537L724 619Q716 622 677 624H673Q645 624 645 640Q645 660 654 678Q659 683 666 686L704 685Q728 684 813 684Q847 684 873 684T913 685T931 686",119936:"97 624H73Q40 624 40 640Q40 660 49 678Q57 686 77 686Q122 684 228 684Q269 684 304 684T360 685T385 686Q406 686 406 668Q406 662 403 653Q398 631 393 628T361 624H353Q321 624 321 623T376 491T432 360L448 377Q465 394 493 424T553 490L673 620Q662 624 630 624Q606 624 606 640Q608 678 623 684Q627 686 634 686Q638 686 671 685T755 684Q777 684 805 685T841 686Q861 686 868 683T876 669Q876 664 873 652Q868 631 863 628T829 624Q764 622 747 611Q727 590 590 441L437 275L411 170Q385 65 384 64Q384 62 429 62H453Q473 62 478 60T487 48Q488 44 484 29Q479 6 473 3Q468 0 454 0Q450 0 436 0T386 1T294 2Q220 2 181 1T138 0Q121 0 116 15Q120 54 133 60Q137 62 187 62H236L289 275L142 624H97",119937:"223 430Q192 430 192 448Q192 450 225 561T261 677Q265 683 270 684Q273 686 534 686Q796 686 797 685Q805 682 805 673Q805 668 804 661T800 648T798 641Q796 637 531 352L266 67L329 66H364Q412 66 446 70T523 96T596 157Q617 186 630 220T649 273T663 297Q667 299 684 299H688Q715 299 715 281Q715 278 673 145T628 8Q626 4 617 0H348Q289 0 221 0T139 -1Q112 -1 99 -1T78 1T69 5T68 12Q68 16 71 31T77 49L84 57Q91 65 104 79T133 110T170 151T213 196L610 624H540Q533 624 514 624T488 624T467 623T443 620T422 616T398 609T373 600Q292 560 255 449Q251 436 246 433T223 430",119938:"222 -8Q140 -8 89 34T38 158Q38 191 48 227Q72 329 151 390T327 452Q361 452 385 443T421 425T433 416H434L441 421Q448 426 460 430T486 435Q509 435 523 422T538 386Q538 380 522 315T488 179T467 93Q466 87 466 72Q466 42 483 42Q505 42 521 75Q531 94 541 134Q546 155 550 158T571 162H576H587Q607 162 607 148Q606 142 604 132T590 94T566 47T528 9T474 -8Q396 -8 358 40Q295 -8 222 -8ZM404 351Q383 401 324 401Q300 401 270 385T221 330Q206 296 186 220Q166 136 166 106Q166 72 184 58T228 43Q256 43 284 57T328 84T343 103Q343 106 374 228L404 351",119939:"220 -8Q142 -8 94 35T45 155V167Q45 187 52 218T104 426L153 622H149Q148 622 144 622T134 623T122 624T111 624T101 624T96 625Q84 628 84 642Q84 647 88 661T94 679Q98 684 109 685T185 690Q258 694 272 694Q289 694 293 679Q293 676 263 553L232 429L244 434Q256 440 281 446T331 452Q417 452 465 407T513 285Q513 235 494 184T439 90T346 20T220 -8ZM385 337Q385 400 318 400Q269 400 226 360Q214 349 211 341T191 268Q162 149 162 113Q162 44 226 44Q269 44 299 76T339 135T362 215Q364 222 365 226Q385 303 385 337",119940:"362 325Q362 344 371 361T390 386L399 394Q390 401 355 401Q276 401 231 338Q207 301 189 230T170 122Q170 43 264 43Q392 43 457 105Q472 120 480 117Q486 114 497 102T509 83Q509 79 502 70T477 47T432 21T360 1T259 -8Q194 -8 148 9T80 54T49 109T40 167Q40 280 129 365T352 451Q390 451 396 450Q448 442 473 416T499 358T477 302T421 274H417Q393 274 378 288T362 325",119941:"222 -8Q140 -8 89 34T38 158Q38 220 68 285T151 391Q230 452 329 452Q382 452 416 428L422 424Q423 424 447 523L472 622H468Q467 622 463 622T453 623T441 624T430 624T420 624T415 625Q403 628 403 642Q403 647 407 661T413 679Q417 684 428 685T504 690Q577 694 591 694Q608 694 612 679L467 91Q466 87 466 72Q466 43 483 43Q518 43 541 134Q546 155 550 158T571 162H576H587Q607 162 607 148Q606 142 604 132T590 94T566 47T528 9T474 -8Q396 -8 358 40Q295 -8 222 -8ZM404 351Q383 401 324 401Q300 401 270 385T221 330Q206 296 186 220Q166 136 166 106Q166 72 184 58T228 43Q256 43 284 57T328 84T343 103Q343 106 374 228L404 351",119942:"260 -8Q196 -8 151 9T83 54T52 111T42 169Q42 188 44 210Q50 240 58 266Q127 434 335 451L338 452Q342 452 345 452Q347 452 353 452T363 451Q426 451 464 424T502 352Q502 289 442 250Q381 211 222 211H184Q184 210 181 196T175 162T171 126Q171 43 264 43Q391 43 457 105Q472 120 480 117Q486 114 497 102T509 83Q509 79 502 70T477 47T432 21T360 1T260 -8ZM237 262Q427 266 427 349Q427 368 409 384T354 401Q316 401 287 388T242 354T216 314T202 278L197 263Q197 262 237 262",119943:"584 444Q597 439 597 426Q597 409 586 387Q580 382 505 382H434V380Q432 378 421 314T395 162T368 30Q324 -164 203 -199Q194 -201 175 -201Q123 -201 94 -177T64 -117T88 -58T145 -33Q169 -33 184 -47T200 -84Q200 -122 166 -150L174 -151H185Q202 -148 217 -112Q222 -94 240 9Q246 40 262 132T293 303T307 382H247H210Q190 382 182 385T173 400Q177 436 189 442Q193 444 256 444H318L319 446Q337 565 355 602Q373 640 404 664T458 694T503 701Q569 701 596 676T624 617Q624 581 599 557T544 533Q520 533 504 547T488 585Q488 596 491 606T499 624T508 637T516 646L520 650Q515 650 509 651Q459 651 459 561V554L458 518L452 484Q446 448 445 447V444H584",119944:"227 0Q142 0 93 43T43 166Q43 207 58 252T104 341T188 414T310 451L313 452Q316 452 319 452Q321 452 326 452T335 451Q367 451 390 443T425 425L436 416L443 421Q450 426 462 430T488 435Q511 435 525 422T540 386Q540 378 483 151T424 -82Q401 -139 335 -170T167 -202Q72 -202 36 -183T0 -125Q0 -90 24 -67T81 -43Q103 -43 119 -56T136 -99Q133 -124 114 -149L123 -150H183Q222 -150 254 -127T299 -74Q300 -71 306 -47T318 -1T324 23Q323 23 310 18T274 6T227 0ZM407 353Q406 354 404 358T400 365T395 371T388 379T381 385T371 391T360 396T346 400T329 401Q300 401 277 389T240 355T219 317T205 280Q171 148 171 109Q171 77 190 64T235 51T296 67Q322 82 337 98L345 106L407 353",119945:"477 56Q477 48 479 46T490 43Q522 45 544 75T577 140Q582 156 585 159T605 162H611H622Q642 162 642 148Q642 138 632 114T602 62T550 13T478 -8Q429 -8 394 17T358 83Q358 95 395 199T433 350Q433 400 394 400H388H383Q335 400 291 363Q256 332 236 298Q233 293 202 170T169 40Q160 18 141 5T99 -8Q70 -8 58 9T45 39Q45 51 116 336L188 622H184Q183 622 179 622T169 623T157 624T146 624T136 624T131 625Q119 628 119 642Q119 647 123 661T129 679Q133 684 144 685T220 690Q293 694 307 694Q324 694 328 679Q328 672 294 540Q286 507 278 473T264 420L260 403Q260 400 269 408Q327 451 393 451H401H410Q425 451 439 450T476 442T515 424T544 391T556 337Q556 286 517 179T477 56",119946:"205 615Q205 646 229 670T283 694Q310 694 324 679T339 641Q339 610 315 586T258 562Q235 562 220 577T205 615ZM24 296Q24 305 34 328T63 380T115 430T187 452Q205 452 223 448T262 435T295 406T308 360Q308 345 287 290T240 170T207 87Q202 67 202 57Q202 42 215 42Q235 42 257 64Q288 92 302 140Q307 156 310 159T330 162H336H347Q367 162 367 148Q367 140 357 117T329 65T276 14T201 -8Q158 -8 121 15T83 84Q83 104 133 229T184 358Q189 376 189 388Q189 402 177 402Q156 402 134 380Q103 352 89 304Q84 288 81 285T61 282H55H44Q24 282 24 296",119947:"321 616Q321 648 346 671T400 694Q425 694 440 680T456 640Q456 609 431 586T376 562Q353 562 337 577T321 616ZM297 360T297 373T294 392T288 400T278 401H276Q241 399 210 372T158 303Q151 287 148 285T129 282H123H116Q102 282 97 284T92 298Q96 331 153 391T279 451Q357 451 388 422T420 354V339L371 142Q363 111 353 71T339 13T329 -30T318 -64T308 -88T296 -109T283 -125T264 -142Q190 -202 88 -202Q44 -202 16 -181T-12 -125Q-12 -93 11 -68T68 -43Q92 -43 108 -58T124 -93Q124 -121 106 -144Q101 -150 103 -150Q120 -150 147 -128T191 -64Q194 -57 242 136T294 345Q297 360 297 373",119948:"99 -8Q71 -8 58 9T45 39Q45 51 116 336L188 622H184Q183 622 179 622T169 623T157 624T146 624T136 624T131 625Q119 628 119 642Q119 647 123 661T129 679Q133 684 144 685T220 690Q293 694 307 694Q324 694 328 679Q328 674 280 482Q231 290 231 287Q231 285 234 286Q259 302 294 334T356 390T420 433T493 452Q528 452 546 427T564 364Q564 308 538 282T480 256Q456 256 441 269T425 308Q425 339 444 359T483 384L502 389Q502 395 496 398Q493 400 483 400Q465 400 449 395T409 374T373 347T323 305T268 257Q274 256 282 256Q312 251 329 247T371 232T411 202Q431 181 431 146Q431 132 427 110T422 73Q422 44 440 44H442Q462 44 478 64T502 102T514 141Q518 157 522 159T547 162H558Q578 162 578 148Q578 118 537 56T440 -7H432Q374 -7 337 21T299 94Q299 103 301 116T304 139Q304 164 281 181T235 202L212 206H211Q176 47 160 24Q137 -8 99 -8",119949:"157 -8Q138 -8 118 -4T77 11T41 42T27 91V106L156 622H152Q151 622 147 622T137 623T125 624T114 624T104 624T99 625Q87 628 87 642Q87 647 91 661T97 679Q101 684 112 685T188 690Q261 694 275 694Q292 694 296 679L151 91Q150 85 150 71Q150 42 167 42Q186 42 205 75Q216 96 225 134Q230 155 234 158T255 162H260H271Q291 162 291 148Q290 145 289 140T283 118T271 87T254 54T229 23T197 1T157 -8",119950:"24 296Q25 302 27 312T41 350T65 397T104 435T159 452Q203 452 234 435Q268 419 285 384L295 392Q305 401 317 410T349 429T389 445Q411 451 446 451Q560 451 592 383Q593 380 594 379L595 375L604 384Q675 452 762 452Q893 452 916 367Q918 356 918 334Q918 285 881 183T841 66Q838 43 849 43Q876 43 901 69T940 138Q945 156 949 159T969 162H975H986Q1006 162 1006 148Q1006 138 996 115T966 63T914 13T841 -8Q794 -8 758 16T721 82Q721 96 758 199T796 351Q796 401 753 401Q702 401 662 369T599 298Q597 294 567 172T533 40Q525 22 506 7T462 -8Q435 -8 422 8T409 39Q409 48 425 114T458 248T476 320Q478 330 478 348T474 377T462 393T449 399T433 400H428Q380 400 336 363Q301 332 281 298Q278 293 247 170T214 40Q206 22 187 7T143 -8T104 7T90 39Q90 47 108 124T146 274L164 347Q166 355 166 372Q166 401 149 401Q129 401 115 379T89 306Q84 288 80 285T55 282H44Q24 282 24 296",119951:"24 296Q25 302 27 312T41 350T65 397T104 435T159 452Q203 452 234 435Q268 419 285 384L293 391Q363 452 454 452Q575 446 597 367Q599 356 599 334Q599 285 562 183T522 66Q519 43 530 43Q557 43 582 69T621 138Q626 156 630 159T650 162H656H667Q687 162 687 148Q687 138 677 115T647 63T595 13T522 -8Q475 -8 439 16T402 82Q402 96 439 199T477 351Q477 401 434 401Q421 401 409 398Q341 388 285 305L278 295L247 170Q216 46 214 40Q206 22 187 7T143 -8T104 7T90 39Q90 47 108 124T146 274L164 347Q166 355 166 372Q166 401 149 401Q129 401 115 379T89 306Q84 288 80 285T55 282H44Q24 282 24 296",119952:"254 -8Q191 -8 146 9T80 54T49 111T39 169Q39 206 53 247T96 329T176 402T292 446Q317 451 336 451L344 452Q353 452 359 452Q457 452 516 408T576 279Q576 169 488 81T254 -8ZM349 400Q321 400 287 385T231 338Q206 301 188 228T170 126Q170 99 178 83Q198 44 260 44Q367 44 409 157Q419 185 432 238T445 317Q445 336 443 348Q435 372 416 384T384 398T349 400",119953:"24 296Q25 302 27 312T41 350T65 397T103 435T157 452Q235 452 273 404Q336 452 409 452Q434 452 458 448T507 432T550 402T581 354T593 285Q593 221 564 159T480 53Q401 -8 302 -8Q290 -8 279 -7T259 -3T242 3T228 9T218 14T212 18L209 20Q208 19 190 -55T171 -131T198 -132H213Q240 -132 240 -150Q237 -187 223 -192Q219 -194 212 -194Q208 -194 176 -193T95 -192Q48 -192 24 -193T-3 -194Q-11 -194 -16 -190T-22 -182T-23 -176Q-20 -142 -7 -134Q-3 -132 20 -132H44L164 354Q165 357 165 372Q165 401 148 401Q113 401 90 310Q85 289 82 286T60 282H55H44Q24 282 24 296ZM465 339Q465 373 447 387T403 401Q375 401 347 387T303 360T288 341Q288 338 257 216L227 93Q248 43 306 43Q332 43 361 59T410 115Q425 147 445 224Q465 309 465 339",119954:"38 159Q38 209 58 260T113 355T205 425T327 452Q338 452 348 451T366 449T382 444T394 440T405 434T414 429T422 423T429 418Q440 429 481 440T533 452Q540 452 545 447T550 437Q550 432 481 152Q410 -130 410 -131T437 -132H452Q479 -132 479 -150Q476 -187 462 -192Q458 -194 451 -194Q447 -194 414 -193T330 -192Q277 -192 249 -193T217 -194Q202 -194 197 -179Q197 -175 201 -159Q206 -139 211 -136T243 -132H283L319 15L307 10Q295 4 270 -2T220 -8Q134 -8 86 37T38 159ZM402 353Q402 358 395 368T369 390T324 401Q301 401 282 394T249 369T226 338T208 297T196 258T186 218Q166 141 166 107Q166 44 229 44Q265 44 294 61T337 95Q341 100 371 222T402 353",119955:"24 296Q24 298 28 313T42 352T67 398T104 436T154 452Q198 452 230 437T273 404L282 411Q334 452 393 452Q441 452 470 423T500 350Q500 301 473 279T418 256Q395 256 379 270T363 308Q363 366 424 386Q424 388 420 391T405 398T385 401Q363 401 343 390Q321 380 289 341L252 192Q214 42 212 39Q190 -8 142 -8Q117 -8 103 7T89 39Q89 52 127 202T165 369Q165 402 148 402Q139 402 128 393T110 369Q100 348 90 310Q85 289 82 286T60 282H55H44Q24 282 24 296",119956:"140 290Q140 311 148 336T176 388T235 433T326 451H336Q355 451 373 449T418 439T460 412T476 363Q476 333 456 311T406 289Q384 289 371 302T357 335Q357 351 364 364T379 384L386 391Q386 392 381 394T362 398T330 400Q299 400 278 393T247 373T235 352T232 335Q232 322 242 312Q258 299 315 290T403 260Q457 224 457 167Q457 152 453 134T435 90T397 43T330 7T229 -8Q133 -8 95 22T57 91Q57 127 81 152T139 177Q161 177 177 164T194 121Q189 80 153 56Q179 43 236 43Q275 43 303 52T343 75T361 101T366 124Q366 148 338 161T272 180T232 186Q187 198 164 227T140 290",119957:"82 382H55Q21 382 21 399Q21 422 33 439Q39 444 93 444H144L162 517Q163 522 167 541T174 567T181 589T192 611T206 627T226 639T253 643Q276 643 291 630T306 594Q306 586 288 514Q284 499 280 481T273 454L271 445Q271 444 317 444Q322 444 331 444T345 445Q377 445 377 428Q377 408 368 390Q360 382 341 382H306H255Q182 86 182 75Q182 43 201 43H204Q242 46 279 81Q298 101 309 119T323 145T330 157T350 162H356H363Q377 162 382 160T387 146Q385 136 372 114T337 64T275 14T192 -7Q131 -7 95 19T59 90V105L128 381Q128 382 82 382",119958:"189 389Q189 397 187 399T176 401Q150 399 126 372T89 304Q84 288 81 285T61 282H55H44Q24 282 24 296Q24 307 35 331T65 383T117 431T187 452Q237 452 272 427T308 362Q308 347 273 254T238 111Q238 43 291 43Q319 43 344 58T380 86T391 103T426 247T464 396Q472 414 491 429T535 444T574 429T588 397Q588 390 570 315T534 168L516 97Q514 89 514 72Q514 42 531 42Q544 42 556 56Q574 76 589 134Q594 155 598 158T619 162H624H635Q655 162 655 148Q654 142 652 132T638 94T614 47T575 9T520 -8Q509 -8 498 -7T478 -3T461 2T446 8T434 16T424 23T416 29T410 35T406 39L405 41L397 34Q347 -7 288 -7H281Q148 -7 122 78Q116 95 116 125V136Q116 174 152 273T189 389",119959:"380 367Q380 397 406 425T465 453Q493 453 516 430T540 357Q540 314 524 250T467 115T373 13Q338 -8 292 -8Q218 -8 167 23T116 129Q116 178 152 275T189 388Q189 396 187 398T176 401Q148 398 125 372T89 304Q84 288 81 285T61 282H55H44Q24 282 24 296Q24 306 34 330T64 382T116 431T189 452Q231 452 269 429T308 362Q308 346 273 255T238 114Q238 43 306 43Q336 43 363 65T407 118T437 182T456 239T462 268Q462 290 417 315Q380 335 380 367",119960:"636 367Q636 400 664 426T719 453Q748 453 772 431T796 357Q796 321 782 256T727 112T633 6Q604 -8 567 -8Q466 -8 415 43Q414 42 410 38T403 31T396 25T388 18T378 11T367 5T355 0T340 -4T324 -7T306 -8Q249 -8 209 5T151 40T125 84T117 129Q117 176 153 274T190 388Q190 408 158 396Q112 376 90 306Q85 288 81 285T61 282H55H44Q24 282 24 296Q24 305 34 328T63 380T114 430T187 452Q240 452 274 427T309 362Q309 346 275 255T240 117Q240 43 317 43Q325 43 333 45T347 50T359 57T369 66T377 75T383 83T388 90L390 95Q390 99 389 110T387 129Q387 139 391 167Q393 177 419 282T448 396Q456 414 475 429T519 444Q546 444 559 428T572 397Q572 384 542 265T511 114Q511 43 579 43Q608 43 633 66T673 122T699 188T714 244L718 267Q718 291 673 315Q636 335 636 367",119961:"74 282H63Q43 282 43 296Q43 298 45 307T56 332T76 365T110 401T159 433Q200 451 233 451H236Q273 451 282 450Q358 437 382 400L392 410Q434 452 483 452Q538 452 568 421T599 346Q599 303 573 280T517 256Q494 256 478 270T462 308Q462 343 488 367Q501 377 520 385Q520 386 516 389T502 396T480 400T462 398Q429 383 415 341Q354 116 354 80T405 44Q449 44 485 74T535 142Q539 156 542 159T562 162H568H579Q599 162 599 148Q599 135 586 111T550 60T485 12T397 -8Q313 -8 266 35L258 44Q215 -7 161 -7H156Q99 -7 71 25T43 95Q43 143 70 165T125 188Q148 188 164 174T180 136Q180 101 154 77Q141 67 122 59Q124 54 136 49T161 43Q183 43 200 61T226 103Q287 328 287 364T236 400Q200 400 164 377T107 302Q103 288 100 285T80 282H74",119962:"206 -150Q240 -150 268 -134T314 -95T344 -48T362 -7T367 14Q339 -7 280 -7Q230 -7 195 5T144 39T122 79T115 122Q115 175 152 274T189 388Q189 396 187 398T176 401Q148 398 125 372T89 304Q84 288 81 285T61 282H55H44Q24 282 24 296Q24 306 34 329T64 381T116 431T188 452Q239 452 273 427T308 361Q308 347 273 253T237 109Q237 43 291 43T388 98Q388 99 425 246T463 396Q471 414 490 429T534 444T573 430T587 399Q587 386 537 186T483 -25Q461 -84 410 -126T296 -188Q248 -202 204 -202Q127 -202 96 -175T64 -114Q64 -82 86 -57T144 -31Q169 -31 184 -45T199 -83Q199 -89 198 -94T196 -104T193 -113T189 -120T184 -128T179 -134T173 -141T168 -147Q189 -150 206 -150",119963:"66 -8H60Q34 -8 34 5Q34 9 42 22T70 59T115 110Q162 156 255 229T381 332L389 339H381Q348 332 298 329T212 325T172 321Q168 318 151 318H146Q116 318 116 332Q116 334 118 342Q128 374 154 402Q205 452 265 452Q304 452 352 422T426 392Q441 392 462 421T485 451T508 452H518Q539 452 539 438Q539 431 516 401T458 334Q412 289 312 210Q229 146 191 111L183 103H195Q203 103 213 104T240 107T268 110Q301 114 337 116T391 119T428 123T455 134T469 157Q473 166 495 166Q521 166 525 161Q532 156 528 141Q510 81 456 37T337 -7Q297 -7 251 22T177 52Q154 52 134 38T100 8L88 -7Q86 -8 66 -8",119964:"76 60Q83 29 135 29Q190 29 264 81Q280 93 280 95T277 99T265 106T248 118Q189 166 189 237Q189 307 245 388Q267 421 299 436Q336 455 386 455Q488 455 550 403L559 395L571 405Q727 544 944 679L957 687L966 701Q968 704 970 707T973 712T975 714T978 716T982 717T989 717H995Q1004 717 1007 717T1013 714T1016 708Q1016 705 829 403L636 92L630 83Q659 93 685 110T728 143L745 158Q758 158 752 138L748 127L740 119Q676 58 605 42L593 22Q590 17 587 12T583 6T579 2T573 0T564 0H530H484Q480 3 480 8Q480 15 489 26T498 39T497 40Q477 40 423 49T327 74L316 78L302 68Q200 -8 121 -8Q85 -8 60 7T35 53T60 113T123 144Q144 144 153 132T162 106Q162 89 143 75T99 61Q90 61 76 65V60ZM904 614L905 615Q901 615 840 573T700 469T581 369L587 359Q600 340 608 315T618 273T622 238T624 216L764 414Q904 612 904 614ZM525 363Q493 405 379 418H375Q342 418 309 378Q251 300 251 234Q251 174 306 137Q318 128 322 131Q323 132 329 139Q351 161 362 180Q430 273 509 348L525 363ZM579 205Q579 245 571 278T556 323T546 337L521 311Q461 248 422 196T362 121L353 111Q427 85 499 79Q517 77 520 77L525 76L549 111Q551 114 556 121T563 131T568 138T573 147T575 157T577 169T578 185T579 205",119966:"367 89Q367 84 353 77T334 70Q325 70 312 83T298 120Q298 169 364 233T496 298Q538 298 563 275T588 220V213Q588 132 501 53T306 -26Q251 -26 211 6T170 114Q171 148 181 184T205 248T232 298T255 334T265 349T246 350Q127 350 77 390T26 480Q26 533 71 581T178 656T295 683Q312 683 312 676Q312 674 311 672L302 660Q294 648 292 647L286 646Q280 646 276 646Q197 641 145 583T93 476Q93 387 265 387Q271 387 277 387T287 388T292 388T313 414T373 483T451 562Q618 712 732 727Q733 727 740 727T753 728Q790 727 804 708T819 665Q819 643 810 617T773 553T699 481T572 414T385 361Q381 361 367 341Q247 172 247 86Q247 11 325 11Q404 11 465 95Q518 165 528 208Q529 212 529 220Q529 237 518 249T480 261Q431 261 387 209T343 126Q343 111 355 101T367 89ZM777 658Q777 691 738 691Q704 691 658 662T570 590T491 504T432 432T410 400H411Q416 400 440 405T505 423T589 455T675 506T743 576Q777 627 777 658",119967:"251 272Q199 272 168 298T136 374Q136 432 175 496T267 603Q321 645 395 676T552 708Q610 708 655 694T724 659T763 618T784 584L790 569Q792 569 800 572T819 576T840 578Q855 578 855 571Q855 566 846 554T829 541Q824 541 817 539T804 533T799 529Q802 517 802 483Q802 376 742 256T585 53T392 -31Q353 -31 300 -7L289 -2L277 -6Q242 -17 192 -17Q141 -17 113 -13T77 -3T68 14Q68 20 73 28T93 45T131 58Q152 62 197 62Q241 62 272 48L282 44Q308 65 334 93Q380 145 467 266T622 454Q644 476 664 493T694 517T720 534T740 547Q699 671 540 671Q461 671 385 625T276 534Q265 520 251 499T219 438T202 368Q202 309 267 309Q325 309 396 383T491 545Q492 548 493 552Q494 558 496 559T511 564Q513 565 514 565Q523 568 527 568Q534 568 534 560Q534 554 529 537Q507 442 420 357T251 272ZM332 20Q332 19 341 15T368 6T400 2Q425 2 457 13T531 49T614 125T690 248Q750 376 750 476V490L738 479Q698 436 646 366T554 239T455 121T332 20ZM226 20Q226 25 186 25Q181 25 174 24H166Q161 24 158 23H152Q170 21 197 21Q205 21 213 21T223 20H226",119970:"206 318L249 320Q249 327 259 352T282 399Q312 447 366 510T465 610Q588 717 661 717Q695 717 716 701T738 653T704 577Q663 522 610 474T512 397T424 346T359 315T333 306Q331 304 327 290T323 267Q323 229 368 229Q402 229 439 254T505 312T571 382T638 435Q642 437 644 437Q658 437 658 409Q655 403 647 399T624 379T595 326Q583 296 564 267T523 179Q504 126 483 91T423 27Q335 -37 231 -37Q191 -37 157 -30T95 -2T67 53Q67 89 94 123T159 158Q180 158 190 146T200 119Q200 102 178 89T136 75Q128 75 120 78T110 81Q105 81 105 62Q105 38 129 24T180 5T238 1H244Q282 1 319 32Q349 55 371 85T436 190L465 239Q413 192 354 192Q300 192 274 217T245 276Q245 284 242 284Q220 280 187 280Q106 280 59 315T12 409Q12 457 43 508T118 597T210 659T295 683Q308 683 308 675Q308 670 299 658T282 646Q266 646 240 633Q182 606 118 511Q76 448 76 400Q76 368 105 343T206 318ZM677 660Q677 680 646 680Q616 680 565 629Q537 601 514 571Q493 544 455 492T389 398T360 355Q366 357 386 367Q463 406 534 473T641 591T677 660",119973:"829 148Q845 148 845 143T841 130T823 109T788 83T730 54T644 22Q637 20 634 19T627 16T622 13T618 10T612 3T604 -6Q510 -112 396 -203T201 -312Q190 -314 171 -314H166Q156 -314 147 -312T123 -304T101 -283T92 -245Q92 -203 117 -160T175 -93Q214 -65 280 -41T390 -6T509 22L532 27L547 47Q673 219 673 225L665 228Q657 231 648 235T627 249T606 270T591 300T584 341Q584 389 614 447T686 544Q735 588 799 615T959 667T1108 713Q1118 717 1119 717Q1125 717 1129 705T1133 689Q1133 686 1115 673Q1051 627 1001 579T918 481T867 403T828 328T805 277Q802 271 801 267T798 261T798 259Q849 270 900 317Q956 371 956 421Q956 438 953 457T950 480Q950 481 950 482L951 484Q953 487 966 492T985 498Q989 498 994 473Q1000 441 1000 423Q1000 362 934 302T790 223L775 220L767 207Q757 191 731 158T685 98T662 63Q662 61 690 70T755 99T811 142L816 148H829ZM646 332Q646 308 659 291T685 268L698 263L735 320Q828 465 865 511Q923 582 1003 643L1005 645Q1004 645 924 620Q775 572 716 492Q646 401 646 332ZM184 -278Q233 -278 311 -212T444 -80L498 -15H496Q468 -20 424 -30T293 -70T174 -133Q167 -140 158 -153T138 -190T127 -232Q127 -278 184 -278",119974:"521 506Q521 493 549 493Q608 493 660 527Q667 531 690 555L736 604Q750 619 777 646T825 694T848 716T852 717Q857 717 860 711T865 697L866 690Q866 687 812 615Q654 404 654 401Q655 401 656 401T659 402T665 403T680 404Q718 404 734 374Q735 370 743 376Q745 377 752 382Q806 416 852 466T933 563T982 623Q1028 666 1075 686T1155 706Q1165 706 1173 705T1186 703T1194 699T1199 695T1201 692T1202 688V687L1204 677Q1204 667 1191 670Q1189 670 1183 670T1174 671Q1137 671 1086 643T1001 564Q970 517 899 449T749 339L739 333L736 322Q730 295 703 253T652 165T628 77Q628 21 681 21Q692 21 698 23Q751 46 817 134L827 148H844Q861 148 864 146Q869 140 859 127Q818 75 761 29T665 -17Q649 -17 633 -12T598 4T569 40T558 100Q558 128 563 152T585 205T609 245T643 294Q647 300 645 300Q633 297 615 297Q607 297 600 298T589 300T584 301Q581 301 569 284T536 236T488 171T418 97T331 28Q233 -37 155 -37Q104 -37 68 -17T29 44Q29 82 55 120T123 158Q144 158 154 146T164 119Q164 102 143 89T100 75Q92 75 86 76T77 80T72 82Q68 82 68 59Q68 37 85 23T123 5T167 0Q203 0 238 21T311 85T382 174T468 288T563 410Q576 426 588 440T607 462T615 472L605 468Q568 456 533 456H527Q490 456 463 483Q451 496 451 508T468 545T486 581Q486 593 465 593Q448 593 425 568T384 518T364 493Q364 492 347 492Q326 492 326 499T351 537T414 599T477 630Q509 630 528 615T547 576Q547 556 534 533T521 506ZM675 357Q675 368 665 368Q656 368 644 363Q631 355 616 333H628Q640 334 672 341Q675 354 675 357",119977:"764 513Q764 482 772 423T780 330Q780 304 778 285T775 256T773 245Q778 252 826 328T932 484T1042 617Q1077 652 1114 678T1173 715T1200 726Q1208 726 1208 717Q1208 711 1206 695L1203 679L1199 675Q1197 675 1187 670T1161 657T1133 639Q1050 583 959 456Q906 381 858 307T779 179T725 83T691 18T679 -6Q677 -8 660 -8H656Q639 -8 639 -1Q639 4 646 17Q685 93 685 173V196Q685 233 681 288T676 380Q676 438 687 487L664 454Q505 230 454 170Q366 64 290 14T163 -36H152Q87 -36 58 -11T29 46Q29 82 55 120T123 158Q144 158 154 146T164 119Q164 102 143 89T100 75Q92 75 86 76T77 80T72 82Q67 82 67 59Q67 37 89 19T167 1Q187 1 197 3Q221 9 246 22T292 52T336 91T375 132T411 174T440 212T463 245T478 266Q779 695 784 698Q786 700 802 700H818Q824 694 824 692T809 668T779 604T764 513",119978:"259 -8Q230 -7 205 0T153 24T112 74T96 153Q96 254 174 379T374 599T607 707H621Q732 707 778 661Q805 634 805 598Q805 558 775 517T696 452L684 447V441Q684 378 626 273T484 97Q379 7 288 -7Q279 -8 259 -8ZM760 594Q760 670 608 670Q562 670 493 622T347 472Q174 240 174 131Q174 76 205 53T279 29Q294 29 306 32Q405 60 507 205Q592 325 616 401Q625 426 625 435Q625 436 621 436T603 440T569 449Q524 466 515 475Q513 477 513 481T525 496T541 508L548 504Q555 501 565 497T587 488T609 480T625 476Q627 476 626 481Q626 486 623 494T613 513T589 533T548 541Q495 541 413 454T286 281Q265 241 254 201T240 141T235 120Q234 118 217 111T197 104Q195 104 192 107T189 112Q190 125 193 147T220 231T280 348Q335 428 407 493T539 576Q548 578 563 578Q594 578 617 568T653 546T672 518T681 494T683 482Q683 481 684 481Q690 481 707 495T742 538T760 594",119979:"571 345Q571 384 612 418T687 452Q698 452 698 445Q698 436 679 417Q677 415 670 415Q650 412 633 389T615 350Q615 340 621 331T634 319T643 315L663 342Q751 462 817 536Q873 595 896 614L907 625Q843 680 701 680Q594 680 499 632T344 516Q317 486 296 449T267 384Q262 366 262 354Q262 332 276 316T326 299H327Q374 299 426 338Q481 376 537 456T597 598Q597 616 599 617Q601 619 614 624T630 630Q639 630 639 604V587V581Q639 519 597 456Q544 377 462 320T318 262Q278 262 250 282T222 350Q222 418 285 504Q360 597 480 656T702 716Q773 716 825 707T898 688T951 660Q962 670 985 685T1012 700Q1018 700 1022 690T1026 673Q1026 670 1019 664Q988 633 988 631Q988 630 999 618T1020 580T1031 522Q1031 471 1003 419T928 330Q854 275 765 264Q757 262 733 262H714L701 245Q615 121 473 42T218 -37Q159 -37 125 -15T90 46Q90 82 116 120T185 158Q203 158 213 147T224 121Q224 110 219 102Q198 75 159 75Q154 75 149 76T143 77T140 77Q137 72 137 53Q138 37 149 26T177 9T205 2T228 0Q313 0 419 74T602 257L620 281L614 285Q607 289 601 294T587 306T576 323T571 345ZM950 529Q950 576 943 576Q940 576 840 439T741 299H751Q804 300 845 334T924 438Q949 490 950 529",119980:"330 387Q330 331 402 331Q463 331 514 371T589 459T613 542Q613 559 608 570T598 588T593 596Q593 601 617 610Q632 617 636 616Q675 585 675 527Q675 464 629 409T516 324T387 294Q271 294 271 394V402Q271 438 292 478Q344 582 457 649T672 717Q765 717 825 675T885 548Q885 433 771 298T498 76Q493 73 491 72T486 69T484 67T485 66Q539 41 607 41Q655 41 703 71T780 139L787 148H804Q806 148 809 148Q826 149 826 140Q826 128 786 91T687 19T589 -16H576Q503 -16 414 20L396 27Q279 -17 192 -17Q130 -17 92 2T54 53Q54 92 107 123T222 155Q303 155 401 106L431 91L441 97Q476 118 527 157Q622 236 711 361T801 573Q801 591 795 607T775 641T732 668T660 679Q592 679 528 644T422 560T355 464T330 387ZM201 20Q232 20 267 27T322 40T342 49Q342 52 315 60T243 77T160 86Q150 88 144 88Q130 88 122 79T112 62L111 53Q111 20 201 20",119982:"346 463Q346 419 406 386T576 352H588L613 384L681 476Q767 594 842 651T973 708Q1016 708 1016 661Q1016 621 987 562T894 449Q802 375 696 338L682 334L665 312Q638 279 605 233T547 158T482 97Q418 46 332 5T158 -36Q87 -36 58 -11T29 48Q29 82 55 120T123 158Q144 158 154 146T164 119Q164 102 143 89T100 75Q92 75 86 76T77 80T72 82Q67 82 67 59Q67 28 98 14T166 0Q232 0 320 55T491 226Q530 279 551 305L558 314Q558 315 543 315Q417 321 353 365T289 460Q289 566 488 632Q578 662 660 665H679Q685 660 685 657T676 642Q670 633 666 629L664 628Q663 628 661 628T655 628Q606 628 546 615T426 568T350 486Q346 475 346 463ZM976 653Q976 671 959 671Q938 671 919 661T883 629T858 593T835 554Q832 548 830 545Q802 495 775 455T734 400T721 382L736 388Q876 449 946 568Q948 572 949 573Q976 622 976 653",119983:"354 350Q264 350 264 426Q264 442 265 448Q279 514 347 582T503 692T662 735Q719 735 774 714T882 672T983 651Q996 651 996 644Q996 639 977 612T954 581Q953 580 938 580Q909 582 884 587L869 591L870 587Q870 583 849 557T796 491T748 422Q729 391 692 313T620 188Q555 105 454 34T253 -37Q214 -37 181 -30T120 -2T92 53Q92 89 119 123T184 158Q205 158 215 146T225 119Q225 102 203 89T161 75Q153 75 145 78T135 81Q130 81 130 62Q130 39 153 24T204 5T267 0Q311 0 358 29T454 117T539 226T629 358T710 476Q726 496 744 516T778 551T807 577T828 595L836 601L785 623Q743 642 713 651T668 661T626 663Q564 663 509 644T418 596T356 535T317 475T305 431Q305 416 312 408Q323 388 369 388Q429 388 465 411T530 480Q557 526 557 565Q557 573 556 579T555 587T555 590Q555 591 568 600T584 611Q588 612 600 603Q622 581 622 549Q622 516 600 475T536 405Q454 350 354 350",119984:"55 377Q55 443 122 523T290 660T478 717Q533 717 575 689T618 594Q618 565 611 538T585 477T552 422T506 355T458 288L357 146Q307 68 307 31Q307 20 318 20Q326 20 331 21Q367 27 411 57T490 128L767 500L861 617H908H939Q953 617 956 616T960 609Q960 605 928 566T816 423T648 198Q587 113 571 86Q540 34 540 21Q540 20 545 20Q580 25 623 55T696 124Q702 132 704 133T722 134H739Q744 130 744 127T735 113Q713 80 655 38T548 -14Q527 -17 524 -17Q475 -17 473 47V63L462 55Q364 -17 302 -17Q235 -17 235 69Q235 88 239 105T248 135T268 171T292 205T328 251T369 304Q376 313 395 338T423 374T450 408T476 445T499 479T519 514T534 546T545 579T548 608Q548 647 522 663T460 680Q355 680 243 591T99 406Q97 399 97 383V377Q97 339 153 339Q169 339 175 340Q215 350 241 373T298 444Q333 496 349 535T367 588T374 603Q402 616 408 616Q416 616 416 608Q416 563 393 492T320 378Q233 302 140 302H132Q75 302 57 353Q55 361 55 377",119985:"540 717Q542 717 545 717Q562 717 562 710Q562 708 557 702T541 678T517 632T485 544T448 407Q447 405 443 388T438 366T433 345T427 321T420 299T411 274T400 250T387 223T372 197Q363 181 364 181L388 203Q476 284 527 354T620 490T718 612Q754 647 790 673T835 700Q839 700 842 691T848 672L850 662Q850 657 842 653Q803 630 768 600T699 527T653 467T610 405Q554 322 518 282T368 138Q307 84 273 51T231 9T218 -5L207 -17H175Q169 -11 169 -9Q169 -4 183 10Q227 56 258 120T302 234T330 350T356 445Q357 450 360 458L362 464Q317 434 276 434Q221 437 221 479Q221 498 240 521T259 552Q259 565 235 565Q209 565 174 546T105 482Q103 480 102 478T99 474T97 472T95 470T93 468T90 467T86 467T81 467H75Q56 467 56 475Q56 482 82 511T156 570T253 601Q289 601 311 590T334 557Q334 543 312 517T289 478Q289 471 297 471Q327 471 378 514Q384 519 390 531T412 571T451 632Q482 675 524 717H540",119986:"232 504Q232 492 263 492Q304 492 356 515L367 520L379 537Q443 632 515 705L527 717H543H552Q564 717 564 709Q564 705 562 703T554 694T540 677T518 643T488 589T448 504T398 385Q368 309 353 281L349 270L523 472L669 634Q726 695 737 706T757 717H765Q786 717 786 710Q786 704 776 691T738 627T675 497Q630 394 609 354T541 244Q456 120 449 111L447 107L448 108Q630 240 700 327Q734 368 788 463Q821 520 841 550T898 619T980 683Q1010 700 1018 700Q1020 700 1023 697T1026 692Q1026 688 1024 671T1020 652Q1018 650 1007 645T988 635Q940 609 902 565T842 477T781 374T699 272Q653 226 535 133Q423 47 373 -2L358 -17H342Q320 -17 320 -11Q320 -7 328 5T354 46T390 112Q416 161 439 217T488 326T564 453L589 490Q587 490 523 414T352 217T166 14Q138 -16 137 -16Q136 -17 120 -17Q106 -17 103 -16T99 -9Q99 -5 100 -3T106 3T116 14T132 35T154 72T184 129T222 212T270 327Q310 426 337 471L326 467Q278 455 243 455Q209 455 188 462T161 478T155 496Q155 508 176 533T198 576Q198 579 198 581T192 588T178 593Q151 593 100 519Q89 504 86 502T75 499H68Q46 499 46 506Q46 510 63 534T112 587T170 627Q178 629 195 629Q235 629 252 613T270 577Q270 556 251 532T232 504",119987:"351 351Q308 351 290 373T272 426Q272 487 329 566T478 688Q538 717 584 717Q635 717 681 696T745 620Q752 598 752 564T745 498L741 485Q742 486 769 516T825 573T889 634T962 689T1027 716Q1035 717 1060 717Q1083 716 1096 714T1120 705T1131 686Q1131 668 1109 647T1055 626Q1035 626 1026 638T1016 663Q1016 667 1020 679H1015Q971 671 886 589T728 413L688 360Q688 359 725 359H750Q762 359 766 357T770 348Q769 345 761 335T750 322Q748 321 704 321H660Q651 311 632 282T589 199T565 107Q565 25 653 20Q684 20 720 44T779 95T826 152T850 183L856 184Q861 184 865 184Q888 184 888 173Q883 163 845 117Q770 37 723 10T638 -17Q584 -14 554 17T523 101Q523 147 534 167L532 166Q530 164 526 160T518 153Q378 15 256 -15Q250 -16 226 -16Q161 -16 132 7T103 59Q103 93 129 125T194 158Q232 158 232 121Q233 118 233 113T221 96T188 77Q182 75 168 75T150 78V70Q150 43 178 32T241 20Q340 20 527 286L552 321H524Q489 321 489 330Q489 333 497 344T509 358Q511 359 545 359H579Q580 362 597 389T631 445T661 514T675 586Q675 637 645 658T572 680Q506 680 444 632T348 527T314 434Q314 388 361 388H364H366Q380 388 389 390T416 408T457 454Q487 497 505 536T526 594L529 613Q531 615 545 622T560 630Q568 630 573 613T578 577Q578 518 532 455Q504 413 453 382T351 351",119988:"155 280Q116 280 87 300T57 368Q57 409 87 466T192 589Q269 653 345 684T472 716Q572 716 613 675Q644 644 644 599Q644 585 643 574T637 550T629 529T616 505T600 481T578 450T554 416Q494 330 493 328L480 306Q466 278 466 256Q466 227 492 227H496Q514 227 534 234Q541 237 544 241T571 279L762 559Q777 579 792 595Q818 620 856 646T919 686T946 700Q951 700 955 692T959 677Q959 673 947 665T911 639T866 595Q816 538 749 408T640 225Q574 138 464 61T248 -17Q190 -17 144 1T98 62Q98 81 109 102T131 135Q156 156 183 158Q226 158 226 121Q226 111 224 107Q215 93 196 84T162 74Q154 74 147 77H144V70Q146 41 185 31T263 20Q363 20 493 175L507 192H504Q500 191 498 191Q484 189 476 189Q430 189 405 219T379 287Q379 294 379 299T382 311T385 322T391 335T398 347T408 363T420 379T434 399T450 422Q455 429 469 449T488 475T504 499T520 523T533 543T544 565T552 583T557 603T559 620Q559 680 467 680Q402 680 333 646T213 563T131 462T98 373Q98 343 119 330T169 317Q187 317 212 333Q242 354 291 423T352 555Q354 562 355 588Q355 612 356 612Q357 614 371 622T387 630Q391 630 397 623T409 597T415 556Q415 507 380 448T294 344Q216 280 155 280",119989:"221 428Q221 487 280 555T425 670T583 717H587Q641 717 665 695T689 646Q689 625 674 600T658 564Q658 550 671 541T695 530T710 528L718 539Q779 613 821 646Q894 707 964 707H970Q1010 707 1025 675Q1032 661 1032 645Q1032 626 1022 607Q1008 579 980 560T897 522Q867 512 836 505T788 496L771 493Q768 493 760 477T736 429T702 370Q700 367 698 363Q696 360 696 359H805Q809 355 809 350Q809 340 791 322Q789 321 728 321H668Q562 179 433 88L419 78L434 73Q505 54 554 54Q609 54 654 82T720 140H752Q758 134 758 132Q758 128 747 113Q711 67 657 32T552 -14Q540 -16 517 -16T480 -15T439 -3T375 27L354 38L338 30Q257 -8 191 -8H184Q154 -8 133 -5T103 1T88 10T83 19T83 29Q83 35 86 44T100 65T127 88T173 105T241 112Q286 112 342 99L360 95L372 105Q434 157 523 270L560 320Q560 321 533 321L507 322Q502 325 502 330Q502 339 521 358Q523 359 556 359H588L669 474L682 491Q676 492 665 494T647 498T632 503T614 510T596 521Q556 547 556 570Q556 585 579 618T603 663Q603 679 568 679Q510 679 452 650T354 581T288 500T262 431Q262 407 280 397T321 387Q331 387 341 390T360 398T376 409T390 423T400 435T409 447L414 454Q457 514 460 562Q460 575 461 576Q461 577 475 586T492 595Q496 595 503 588T514 572Q520 559 520 539Q520 473 452 412T308 351Q269 351 245 370T221 428ZM989 642Q989 667 953 671Q905 671 871 644Q853 632 832 604T799 554T787 531H788Q801 531 842 539T916 561Q989 592 989 642ZM198 29Q230 29 257 36T295 52L306 59Q306 63 259 73Q251 74 209 74Q177 74 158 66T134 48L130 40Q130 29 198 29",120068:"22 505Q22 563 94 624T271 685H280Q416 685 443 560Q447 535 447 504Q444 414 405 330L399 319L229 155Q233 154 241 153T253 150T265 145T281 135T301 119T328 93L357 64L402 92Q438 116 473 137L500 154V339Q500 528 495 593V601L559 649Q621 696 624 696L638 686L629 677Q599 650 593 638Q582 614 581 504Q580 490 580 443Q580 314 584 238Q584 235 584 224T584 210T585 199T586 187T588 176T591 164T595 152T601 137T609 121Q630 77 640 77Q661 77 703 101Q704 95 706 90L707 86V84L636 29Q618 15 601 2T574 -19T564 -25L500 121Q499 121 399 48L299 -26Q298 -26 291 -15T272 11T245 42T209 69T165 80Q120 80 58 43L48 37L40 42L32 48L122 117Q196 173 241 211Q319 280 343 327T368 447Q368 535 317 582Q264 633 199 633Q155 633 122 605T86 542Q86 518 133 467T181 387Q181 348 140 309Q113 281 73 260L64 255L50 265L59 273Q112 307 112 345Q112 363 90 387T45 441T22 505",120069:"48 506Q48 568 120 629T268 691Q362 691 425 594L431 585L441 594Q478 628 528 657T629 686Q665 686 687 670Q703 658 718 584T753 506Q756 505 763 505Q778 505 804 512L815 516L820 496Q820 494 808 490T774 476T732 454Q720 445 708 437L675 415L640 394L625 383Q626 382 635 382Q652 382 670 379T712 364T754 336T784 289T797 220Q797 172 776 122Q769 106 766 102T745 84Q654 11 619 -8T538 -27Q483 -27 387 10T249 47Q218 47 186 34T133 8T112 -5T104 7T97 21L196 82Q259 120 284 140Q333 181 351 214Q368 251 368 353Q368 588 228 620Q222 621 205 621Q160 621 139 596Q117 569 117 548Q117 526 162 470T208 387Q208 352 179 320T104 264Q88 256 86 256Q83 256 70 266L82 274Q134 309 134 343Q134 352 130 359Q118 377 100 401T72 439T56 470T48 506ZM453 528Q457 496 457 419L458 357L488 367Q554 390 622 425Q673 449 673 453L671 454Q669 456 665 460T657 473T648 498T639 541Q629 597 616 613Q599 633 567 633Q534 633 493 599Q471 577 457 540L453 528ZM713 176Q713 252 661 295T528 339Q512 339 494 336T466 330T455 325Q454 325 452 311T444 270T425 217L420 207L304 118L319 116Q381 111 475 74T602 37Q655 37 684 79T713 176",120071:"346 611Q300 611 261 604T194 584T144 555T107 519T82 481T65 443T55 410T50 383T48 367L37 372L27 378V393Q33 524 115 603Q160 648 230 666T365 685Q423 685 434 684Q745 653 745 405Q745 281 694 151L687 133L657 103Q524 -27 470 -27Q456 -27 331 18T157 64Q122 64 84 28Q67 9 57 -6L50 -16L43 -8L35 0Q35 3 46 22T83 74T141 133H154Q208 136 253 161T299 230Q299 259 277 290T232 348T209 392Q209 434 254 479T358 556L368 561L382 550Q382 549 381 548T377 545T371 541Q353 527 326 496T298 444Q298 430 343 365T389 277Q389 240 353 202T267 136L252 127Q304 118 400 83T513 47Q548 47 582 79T635 145Q671 208 671 323Q671 390 651 441T599 524T523 576T436 603T346 611",120072:"301 564Q240 564 203 507T165 361Q165 280 190 218T260 119T358 64T474 46Q491 46 499 47L511 48L628 106V80L499 -5Q498 -6 497 -7T494 -10T490 -12T485 -15T478 -17T468 -19T456 -21T439 -22T418 -23T392 -24Q252 -20 169 67T86 315Q86 409 124 491Q128 500 139 508Q211 560 272 591L293 601L325 585L338 594Q374 617 422 639T502 674L532 685Q533 685 540 663T557 614T574 581Q580 575 591 575Q600 575 616 580T634 585V564L623 559Q572 535 532 529L522 527Q491 547 442 627Q442 628 440 627T435 624T428 620Q410 610 405 597T399 559V553Q399 534 409 487Q419 431 427 369L476 400Q526 431 526 432Q531 426 537 420Q565 382 602 359Q611 353 610 352Q609 351 575 332T537 312Q536 312 505 335T463 358Q451 358 439 352T425 337Q394 243 263 223L251 221L243 229L235 236L245 239Q274 247 303 266Q320 277 325 290T330 336Q330 394 315 451T300 531Q300 549 303 561Q303 564 301 564",120073:"198 617Q177 617 159 609T128 587T106 557T91 524T82 494T76 472L75 463Q74 463 67 468T59 474Q59 488 63 510T80 564T114 622T170 667T253 686Q272 686 295 680Q330 672 384 645T468 598Q498 580 524 580Q549 580 595 626L612 643V616L599 599Q522 500 482 500Q466 500 435 514L420 521Q388 516 349 486T309 415Q309 396 323 366T352 315T367 294Q367 293 375 301T398 322T429 352L490 410Q537 355 542 332Q542 330 531 315T510 286L499 273Q479 313 449 313Q437 313 419 303T390 282L378 271L394 250Q444 183 470 129Q484 96 484 71Q484 -19 402 -86T223 -153H220Q175 -153 137 -120Q103 -89 103 -8Q103 12 106 40T109 96Q109 132 103 146T72 161Q46 161 16 143L14 154L11 165Q88 219 143 219Q163 219 177 197T192 127Q192 102 186 65T179 4Q179 -60 210 -88T272 -117Q319 -117 362 -75T405 33Q405 72 363 139T278 271T235 368Q235 385 243 404T264 439T292 472T324 500T353 522T374 538L382 543Q382 544 351 562T274 598T198 617",120074:"373 560Q373 543 378 509T388 448T394 421Q396 421 416 433T474 474T548 537L538 543Q481 570 452 628L487 659Q521 690 522 690L526 684Q529 677 535 667T551 646T575 625T607 608Q617 606 621 606Q644 606 660 622L664 600L497 455Q495 453 527 453H546Q628 453 665 407L666 406Q710 357 710 297Q710 196 631 109L621 98L577 69Q471 -7 452 -15Q413 -26 370 -26Q239 -26 155 59Q66 148 66 319Q66 442 113 505L191 552Q269 600 270 600H271Q273 600 280 596T293 589T299 586Q300 586 357 623Q413 659 415 659L426 649Q373 604 373 560ZM219 228Q305 262 305 329V343Q305 384 294 434T282 519Q282 562 287 567Q287 569 286 569Q222 556 191 520Q144 464 144 362Q144 213 228 128T420 42Q514 42 568 103T622 255V260Q622 320 578 357Q526 400 453 400Q434 400 410 396L399 394L400 378V372Q400 330 388 301T348 254T305 232T252 217Q245 215 242 214L234 213L226 220L219 228",120077:"194 601Q175 601 155 590T121 564T95 533T76 506L69 495Q55 503 55 507Q55 509 60 521Q87 586 132 636T222 686Q251 686 289 660T363 607T422 580Q442 580 466 588T506 604L522 612V591L487 574Q371 517 359 517H357Q332 522 280 561T194 601ZM383 39Q383 96 356 203T329 361Q329 364 329 370T330 378L331 388L339 399Q362 429 394 462T446 513T469 531Q470 531 477 527T484 521L474 509Q411 434 411 379Q411 341 434 223T458 82Q458 1 390 -69T239 -139Q191 -139 162 -123T123 -83T108 -30T101 23T88 64T52 80Q27 80 -4 64L-10 80Q-5 85 13 98T63 128T118 144Q149 144 163 129T179 93T182 38T187 -19Q199 -96 278 -96Q294 -96 309 -91T343 -73T372 -31T383 39",120078:"154 37Q219 41 219 142Q219 203 190 302T160 434Q160 445 172 472T209 534T269 602T354 657T460 680H472Q576 680 618 617V599Q618 578 615 555T608 517T602 501Q596 495 587 495Q586 495 586 499Q586 500 586 505T585 513Q567 628 415 628Q384 628 356 621T302 596T260 546T244 466Q244 416 258 377L261 367L276 382Q294 401 317 422T386 471T468 500Q500 500 518 477T544 422T554 386Q555 382 560 376T576 364T601 357Q612 357 623 361Q623 360 621 351T617 340L541 305L465 272Q469 271 476 270T488 266T502 260L512 255L519 242Q533 211 546 157T564 93Q584 53 617 53Q649 53 682 74V54L675 46Q646 17 612 -5T554 -27Q546 -27 538 -23T517 -9T494 28T478 91Q465 172 448 200T378 228Q337 228 289 207L288 196Q288 160 284 138Q283 125 262 98Q185 1 112 -24L102 -27L91 -25Q47 -13 17 31Q17 33 49 69L80 106Q111 37 154 37ZM421 434Q411 436 405 436Q370 436 336 407T275 337L267 325L271 313Q288 257 288 234Q289 234 395 276T502 319Q501 320 499 323T493 330T485 345T475 371Q473 378 468 388T449 416T421 434",120079:"251 231Q251 254 206 341T160 468Q160 529 238 605Q313 677 425 685L432 686Q440 686 445 686Q520 686 545 657T571 576Q571 548 568 517T564 480Q564 466 572 460T608 452H623V431L619 430Q618 430 611 428T591 423T566 417L516 404Q497 415 491 419T480 433T475 461Q475 470 477 498T480 546Q480 561 480 569T474 592T459 615T429 631T379 638Q322 638 283 606T239 526Q237 480 280 394Q319 310 320 268V250Q308 235 244 169L203 128H210Q215 128 256 112T357 80T466 64Q526 64 564 88T625 186L629 196Q643 187 644 186Q618 70 604 41Q577 -15 513 -24Q496 -26 476 -26Q418 -26 344 -3T211 45T133 69Q115 69 97 50T65 7T49 -20L45 -16Q41 -11 37 -6T33 0Q33 8 66 69T111 134Q251 156 251 231",120080:"687 578Q690 586 719 612T794 665T877 692Q909 692 926 670T953 614T973 570Q983 561 1000 560Q1023 560 1048 569V553L1034 546Q1003 528 972 504T933 466Q905 403 905 264Q905 205 909 172T920 126T940 91Q951 74 959 74T997 87L1027 100V79L956 27Q940 15 922 2T894 -19L885 -26Q883 -26 854 27L825 80V192Q826 314 830 341Q831 345 833 356Q840 398 844 404Q871 444 920 489L917 491Q914 493 911 495T903 501T898 508Q893 516 877 562T852 616Q840 628 818 628Q751 628 702 541L697 532L700 515Q708 467 708 419Q706 348 690 276T662 169T643 126L634 116Q626 105 611 87T581 51L522 -22L514 -15Q470 21 452 21Q431 21 394 -16L384 5L386 9L426 60Q449 87 460 95T486 104Q487 104 491 104T497 103Q514 99 541 81L559 69Q595 96 606 169T618 350Q618 486 598 543T517 601Q484 601 458 570T432 523Q432 516 434 492T436 443Q436 250 369 133L363 122L280 50Q207 -16 192 -27L182 -18Q136 26 106 26Q83 26 62 9T37 -16L27 0L33 10Q41 22 54 39T94 81T143 106Q178 106 225 62L235 53Q283 82 307 117Q352 190 352 359Q352 408 345 451T320 534T267 597T183 621Q159 621 147 617T120 598Q97 574 96 556Q96 528 143 469T191 377T161 311T102 262T70 245Q69 245 59 252T49 260L56 264Q63 268 73 275T94 291T111 312T118 338Q118 355 95 384T50 446T27 506Q31 567 101 626T255 686Q297 686 330 671T382 632T409 595T421 572V571L430 580Q454 610 496 634T588 659H590Q655 659 683 585L687 578",120081:"112 334Q112 356 70 410T27 497Q27 553 94 619T229 685Q230 685 236 685T246 686Q303 686 349 654Q373 636 392 607T419 558L426 538L454 576Q474 604 486 618T520 651T569 678T633 686Q668 684 687 673T713 651T730 609Q730 608 732 600T736 588T741 578T747 568T754 561T765 555T779 553Q789 553 817 562Q819 557 819 555V547L790 526Q743 492 730 479T712 447Q697 369 697 281Q697 166 726 108Q741 76 755 68Q759 66 767 66Q789 66 825 93V82Q825 71 822 70Q821 69 763 27T701 -18L692 -25L668 15Q662 25 650 45T635 70L627 85V107Q627 122 626 162T624 285Q624 381 632 398Q638 409 651 425T675 454T696 477T707 489H696Q683 490 679 492T669 507T653 551Q642 588 627 608T584 628Q572 628 560 625T538 616T519 602T502 586T486 568T473 549T463 532T454 517T448 504L445 497Q437 480 437 474Q437 472 439 461T444 421T446 348Q446 205 405 124Q396 105 392 100T368 78Q312 32 278 9T235 -18T214 -22Q191 -22 170 -10T139 12T129 25T160 66T192 105Q193 102 194 98T200 83T213 64T233 49T261 42Q303 42 339 90Q373 134 373 268Q373 397 339 493T235 618Q215 628 191 628Q155 628 126 604T97 548Q97 524 120 493T168 431T192 381Q192 346 164 318T86 260L70 250L54 266L63 272Q112 300 112 334",120082:"428 596Q412 596 386 595T350 593Q289 593 270 625Q267 632 267 640Q267 656 280 672T312 705T336 729H343Q351 729 351 728Q342 710 342 703Q342 683 382 676T493 662T604 643Q648 627 677 599T720 535T739 466T744 392Q744 317 732 260T696 166T659 116T621 83Q617 80 615 78Q485 -27 377 -27Q320 -25 272 -9T187 21T122 36H116Q65 36 29 -13L27 -15L12 0Q12 1 32 26T76 78T109 109Q145 123 166 150T187 207Q187 244 134 318T80 412Q80 454 112 498T176 566T213 590Q216 590 224 585L234 580L225 573Q216 566 207 557T188 536T172 511T165 484Q165 448 213 368T261 259Q261 241 252 219T228 179T200 146T176 122L167 112Q170 111 174 111Q188 110 233 91T339 55T453 37Q508 37 556 68T626 152Q655 219 655 328Q655 543 532 582Q484 596 428 596",120083:"112 339Q112 354 91 380T49 438T28 497Q28 565 95 628T242 692Q261 692 277 689T307 682T331 670T351 655T367 637T379 619T388 600T395 582T401 565T405 550Q409 554 422 570T453 603T500 641Q573 692 637 692Q656 692 670 686T692 672T705 647T713 618T718 584Q720 568 721 562T728 546T742 534T768 530Q776 531 782 532T791 535T796 536Q799 536 804 521Q801 519 789 513T764 499T738 480Q697 447 680 414Q677 407 677 396Q677 370 713 312T750 210Q750 125 686 57T560 -11Q540 -11 475 13L410 37V31Q410 -9 412 -50T417 -118T420 -150Q419 -150 373 -184T326 -218L305 -208Q305 -207 307 -196T314 -165T322 -116T328 -46T331 43V63L318 66Q270 80 250 80Q233 80 213 70Q183 57 138 -3L128 -16L118 5L125 20Q193 154 282 154Q309 154 331 146V287Q331 444 327 469Q321 522 301 560Q284 590 251 611T184 633Q146 633 119 607T92 550Q92 539 94 534Q100 516 143 460T186 386Q186 366 170 336T119 281Q102 264 70 250L49 260L56 266Q64 271 72 278T90 296T106 317T112 339ZM602 345Q602 357 608 371T622 397T642 421T661 441T678 456L686 462Q663 473 652 486T639 512T634 553Q631 594 624 608T593 631Q587 632 567 632Q539 632 497 600T416 497L410 484V122L467 103Q481 99 502 92T533 82T557 75T578 69T594 66T610 64Q647 64 672 87T697 144Q697 180 650 250T602 345",120084:"428 596Q412 596 386 595T350 593Q313 593 291 605T268 638Q268 644 269 648T274 658T284 669T301 689T326 718L336 729H343Q351 729 351 728Q342 710 342 703Q342 683 382 676T493 662T604 643Q744 592 744 398Q744 299 708 213T646 104L603 68L614 55Q670 -5 710 -5Q726 -5 744 1T772 14L781 20Q782 20 782 7V-6L771 -13Q673 -69 665 -69L647 -63Q552 -30 514 8H512Q509 8 500 3T471 -9T428 -23Q405 -27 377 -27Q305 -24 228 6T124 36Q69 36 27 -16Q23 -13 19 -8L11 0L27 20Q93 102 109 109Q145 123 166 150T187 207Q187 244 134 318T80 412Q80 454 112 498T176 566T213 590Q216 590 224 585L234 580L225 573Q216 566 207 557T188 536T172 511T165 484Q165 448 213 368T261 259Q261 241 252 219T228 179T200 146T176 122L167 112Q170 111 174 111Q188 110 233 91T339 55T453 37Q508 37 556 68T626 152Q655 219 655 328Q655 543 532 582Q484 596 428 596",120086:"750 276Q750 141 645 57T378 -27Q224 -27 146 67Q66 163 66 307Q66 361 80 412T127 515T217 609T356 676L388 684L420 692L442 681Q545 625 586 608T654 591Q688 591 710 609T737 646L742 665Q742 665 756 654L752 642Q736 594 706 566T621 515L607 510Q580 513 528 542T421 599T335 627Q272 627 214 569Q139 500 139 373Q139 308 159 247T217 136T316 56T455 26Q520 26 566 43T634 90T666 148T676 207Q676 264 649 297T580 338Q574 339 552 339Q516 339 442 325T327 310H324Q303 310 290 312T259 328T232 369Q230 375 230 390Q230 426 259 461Q286 488 338 507Q351 498 351 495L346 492Q342 490 339 488T330 482T320 473T312 462T305 447T303 428Q303 368 366 368Q393 368 487 388T613 409Q656 409 696 385T748 306Q750 294 750 276",120087:"289 686Q338 686 439 668T565 649Q606 649 641 672Q656 683 664 690T674 700L675 701Q676 698 676 692V681L641 636Q608 591 602 588Q577 575 528 575Q490 575 438 583L426 585L416 578Q335 520 335 465Q335 437 393 366T452 259Q452 226 406 171Q387 146 351 115L341 106L358 97Q438 58 475 58Q525 58 598 124L608 133Q617 119 617 118Q617 114 606 103Q513 0 448 -27L438 -25Q401 -19 337 14T234 48Q186 48 122 -3L112 -11L106 -3L101 5L110 15Q160 63 209 105L224 117H310Q384 163 384 210Q384 238 329 303T263 398Q262 400 262 404Q262 427 290 476T368 580Q383 596 381 596Q315 622 228 622Q159 622 118 593T76 516Q76 482 96 461T139 431L107 399L75 367Q34 403 34 472Q34 525 64 572T148 652Q207 686 289 686",120088:"160 247Q160 291 110 382T59 505Q59 542 106 597T207 690L218 697L229 682Q229 680 216 669T187 644T158 604T144 552Q144 526 165 482T207 387T228 291Q228 277 228 267T224 247T219 232T210 217T199 202T184 184T166 163L118 107Q124 105 132 105T160 98T220 77Q298 47 317 47Q354 47 409 105Q444 142 451 161T458 244V277Q458 339 455 457T447 596L575 686L591 676L583 668Q550 632 541 587T532 449V372V298Q532 198 550 147Q572 79 605 79Q617 79 631 84T656 95L665 100V79L595 27Q578 15 560 2T532 -19L523 -26Q522 -26 490 42L458 111L397 50Q389 42 374 27T355 8T340 -5T325 -16T311 -22T294 -26T274 -27Q232 -25 152 6T35 37Q28 36 19 30T4 18T-8 4T-16 -5Q-25 10 -25 11T-20 18Q-5 34 15 57L54 101Q70 103 86 116Q94 121 113 140T137 166Q160 201 160 247",120089:"54 266Q118 307 118 339Q118 360 74 413T27 493Q26 530 59 578T133 651Q187 686 256 686Q299 686 332 673T382 640T409 600T424 567T429 553Q431 553 463 586T542 653T624 686Q663 686 715 652T798 617Q812 617 825 622V606L815 599Q785 576 762 546Q724 495 724 432Q724 397 737 317T750 217Q750 148 711 96Q697 75 639 34T578 -10Q563 -21 555 -23T522 -26Q458 -26 363 29Q253 89 211 89Q192 89 173 83T139 67T114 49T96 34L90 27L80 43L95 59Q121 87 148 110T191 143T213 154Q261 154 300 195Q328 222 340 267T352 406Q352 562 255 611Q222 627 187 627H182Q143 627 115 598Q96 579 96 559Q96 528 144 470T192 381Q192 348 156 314T80 256L70 250L54 266ZM727 548Q701 550 650 583T567 617Q560 617 554 615Q532 610 501 580T445 501L437 485V465Q432 326 378 223L294 150Q321 143 421 87T560 31Q608 31 634 64Q660 102 660 198Q660 226 655 292T650 387Q650 418 658 452L660 462L735 548H727ZM264 150Q265 151 263 151H261Q261 150 264 150ZM280 150H276V149Q280 149 280 150",120090:"32 501Q35 564 103 625T264 686Q326 686 365 652Q402 618 420 564L441 585Q486 630 539 670L559 686L572 672Q637 606 665 559L682 576Q787 686 845 686Q877 686 929 656T992 623Q999 621 1016 621Q1041 621 1054 628L1051 617L1047 606Q1042 602 1037 597Q983 557 969 522T954 434Q954 394 961 336T968 221Q968 201 966 184T963 155T956 131T948 113T936 96T923 82T906 66T887 50L816 -2Q815 -3 810 -6T801 -11T791 -16T777 -20T759 -23T735 -25Q691 -25 619 4T505 37H496L463 21Q420 0 389 -20L378 -27H362Q316 -27 275 -9T202 28T150 46H146Q114 46 59 -5L48 -16L41 -6Q40 -4 38 -2T34 2L33 4Q33 8 77 54Q111 87 142 112L154 122H166Q239 127 288 182Q346 244 346 406Q346 489 326 537T259 610Q227 628 195 628Q155 628 128 606T101 549Q101 517 146 465T192 382Q192 348 156 310T85 254L75 250L64 258L55 266Q56 267 74 276T105 301T118 339Q118 362 75 413T32 501ZM952 547Q927 555 877 586T796 617Q744 617 682 525L676 516L677 498Q678 486 678 425Q678 301 652 206Q649 195 613 151T577 102Q577 100 582 100Q618 100 720 51Q761 32 790 32H794Q843 32 869 83Q884 110 884 189Q884 233 879 294T873 400Q874 433 879 451T889 478T915 507T952 547ZM241 105Q249 98 263 88T317 60T393 42Q478 42 547 109Q607 171 607 358Q607 371 607 380T604 417T595 467T577 517T546 566T500 601L479 580Q449 550 433 526L426 516V503Q426 311 357 200L352 191L296 149Q241 107 241 105",120091:"96 511L78 527L149 603Q207 666 227 686L237 685Q278 680 306 667T351 631T376 588T395 533L400 516L406 527Q439 600 523 653Q538 664 587 688Q589 688 596 672T613 635T629 606Q643 588 665 588Q677 588 693 596L709 603V585L607 526Q583 536 554 564T512 614Q461 571 435 507T405 381V367H581L563 347Q561 344 558 341T553 335T549 330T546 326L545 325H541Q537 325 488 329T411 334H405V325Q405 198 454 123Q497 54 568 54Q594 54 619 64T660 84L676 95V74L565 -16L553 -20Q528 -27 512 -27Q492 -27 475 -21T444 -5T418 19T398 47T382 77T371 105T363 128T358 145L357 151Q354 151 339 136T294 91T232 37Q152 -22 113 -22Q90 -22 69 -9T38 17T28 32Q28 33 58 68L86 101Q94 81 115 64T165 47Q206 47 249 84Q302 128 325 222Q334 263 336 312V334H312Q198 334 163 324H161Q162 326 182 348L198 367H336V398Q333 508 308 550Q295 570 274 585T227 601Q204 601 181 589T145 565T115 533T96 511",120092:"123 345Q123 358 75 415T27 496Q27 533 63 578T121 639Q181 685 256 685Q305 685 332 676T384 635Q419 588 425 542Q468 585 526 628T618 686Q632 667 658 645T704 609T724 594Q740 512 740 385V375V361Q740 128 682 -3Q656 -64 554 -141T361 -218Q319 -218 287 -203T243 -173T230 -150Q230 -148 267 -109L304 -69Q311 -115 341 -142T411 -170Q474 -170 534 -119T624 11Q660 111 660 312Q660 447 633 528L612 549Q578 583 552 596L543 601L528 592Q501 574 483 558Q454 528 436 494L431 484V473Q431 330 376 230Q366 213 359 206T306 159L250 112Q278 105 327 82T399 58Q421 58 440 69T471 92T484 104H485L493 90L480 73Q453 39 429 13Q393 -22 372 -22Q342 -22 260 15T153 53Q97 53 48 -16L38 5Q46 22 74 54T128 108L143 122H155Q226 127 275 168Q352 236 352 399Q352 501 309 564T197 628Q156 628 129 607T102 553Q102 517 147 463T192 383Q192 323 75 250L59 266Q123 314 123 345",120094:"86 363Q86 365 128 391T212 444L255 470Q256 470 263 465T283 453T308 442Q338 431 346 431Q350 431 358 436L414 465L421 459L418 434Q404 339 404 262Q404 147 408 119L425 97Q443 74 444 74L467 86L491 97Q492 97 497 83L436 28Q377 -26 374 -26L331 46L329 91L155 -35Q152 -35 114 10T68 65L67 86Q66 100 66 156Q66 177 66 198T68 236T71 268T74 296T77 320T80 338T83 351T86 360V363ZM314 365Q285 367 255 374T206 386L187 392Q181 392 172 376T154 311T145 197Q145 124 151 118Q156 110 187 78L208 56H214Q221 57 253 76L308 109L329 123V136Q328 143 328 257V365H314",120095:"177 427Q177 364 181 364Q184 364 192 370T223 395T271 433Q317 469 323 469Q325 469 338 462T377 440T432 413L440 409L441 396Q441 394 441 372T442 334Q442 203 425 108L423 97L400 83Q347 49 296 21T222 -19T196 -31Q192 -29 149 12T87 71L89 89Q100 155 100 319Q100 500 94 627Q94 632 94 638T94 648T94 656T93 662V664Q93 668 97 669T106 670H110Q114 653 118 633L127 596Q127 595 132 597Q136 599 195 642L255 685L272 673Q269 670 256 659T233 637T211 609T190 565T179 508Q177 494 177 427ZM295 377L274 385Q273 385 264 381T242 370T223 361Q213 355 188 340L178 333V123L198 103Q259 42 285 42Q299 42 314 55T339 85Q363 132 363 232Q363 310 358 343V349L345 355Q330 363 295 377",120096:"72 208Q72 323 84 361Q84 363 167 414Q248 466 250 466Q255 465 260 465Q283 460 307 450T344 430L357 422L306 343L301 342L296 340Q267 362 247 372T216 384T177 390Q154 349 154 238Q154 220 156 158V145L168 132Q179 121 208 93T244 59Q245 58 246 58Q255 58 302 83T350 108L352 104Q355 100 356 96L358 92Q358 91 274 32T187 -29L177 -20Q160 -6 120 36T77 84Q77 87 75 118T72 208",120097:"13 542Q13 544 77 576T147 609Q154 609 185 598T283 551T414 464L427 454V440Q427 436 427 412T428 372Q428 315 426 270T418 197T409 152T400 121T394 103L304 35Q285 21 261 2T225 -25L214 -33Q149 7 97 59L76 80L75 91V171Q75 221 76 254T79 299T80 313Q80 315 78 321Q78 323 78 326L77 330Q79 336 132 384T211 447L219 445Q221 445 224 444L228 443Q229 443 228 441T221 432T206 415L191 395Q175 378 162 339Q152 306 152 250Q152 217 159 140V134L171 121Q194 99 235 74T284 48Q296 48 310 75T337 156T349 267Q349 346 336 400L315 420Q246 489 176 525Q127 545 94 545H73L27 527L13 542",120098:"353 103Q353 97 358 87L337 71Q293 38 247 6Q191 -30 189 -30Q188 -30 173 -16T130 26T76 85L74 99Q70 139 70 190Q70 228 73 271T79 338T84 365L94 372Q105 378 126 392T166 417L246 467Q283 417 349 369L364 358L355 349Q249 249 169 180L151 166L152 152V139L165 126Q186 105 215 84T260 62Q267 62 309 82L353 103ZM267 323Q246 337 230 350T204 371T189 385T179 394T174 397Q149 381 149 219V211Q151 211 171 223T220 258T268 299L282 313L267 323",120099:"128 387Q128 391 112 456T92 546V555L101 568Q133 617 183 670L193 681L204 673Q238 648 262 648Q276 648 292 656L302 661L308 653Q308 652 278 618L249 585H234Q194 587 159 595Q158 595 156 596H153L150 597Q151 593 152 581T154 564T157 547T164 524T176 494Q199 436 203 400V392H207L323 386Q323 384 309 368L296 351H203V176Q201 -9 198 -32Q194 -61 166 -114Q158 -129 153 -138Q114 -214 110 -221Q105 -221 98 -220L87 -219V-216Q88 -215 106 -150T124 -82Q128 -73 129 155V351H30L64 386H96Q128 386 128 387",120100:"27 -144L17 -131L82 -75L146 -20L126 6Q99 37 92 48L78 65L77 79Q75 103 75 158Q75 217 78 268T86 343T91 368Q92 370 109 382T157 413T222 452Q240 465 249 469L251 470Q296 443 350 428L365 424L437 465L442 459Q442 456 441 453T437 444T432 424T427 385T423 317T421 215V133L423 119Q423 111 455 -17Q455 -21 380 -108T290 -201Q290 -202 284 -204T269 -207T252 -209Q172 -209 75 -135L62 -126Q60 -126 44 -135L27 -144ZM349 351Q267 359 178 389Q177 387 173 376T166 358T161 337T157 303T155 259Q155 195 159 135L160 124L170 112Q180 101 204 77T230 53Q231 53 286 88L340 123V141Q340 235 348 329Q348 334 348 339T348 348L349 351ZM364 -59Q364 -37 358 -1T347 64T341 93Q336 93 252 28T149 -57Q226 -134 293 -134Q325 -134 344 -118T364 -69V-59",120101:"88 427Q88 486 87 545T84 634T81 667Q81 673 82 673T89 676H94L117 600L200 661Q208 667 218 674T233 684L238 688L254 678Q222 646 216 637Q164 572 164 483V442V371Q187 390 244 431T312 478Q344 446 411 423L428 417L429 396Q434 297 434 218Q430 8 406 -34Q346 -111 262 -195L251 -205L249 -203Q248 -203 244 -199T236 -193Q226 -183 227 -182Q228 -182 244 -169T278 -140T301 -121Q330 -89 340 -22Q355 60 355 171Q355 200 353 244T348 321T344 354Q333 363 307 376T260 390Q241 390 179 350L164 341V121Q180 96 201 66L213 50Q210 46 172 11T131 -24Q130 -24 123 -11T102 25T77 65V78Q80 104 84 227T88 427",120102:"72 617Q72 618 102 645T133 673H134Q134 668 175 627L187 615L130 555L116 568Q72 615 72 617ZM27 369Q21 376 14 382L26 392Q83 440 119 474Q158 435 169 427L179 420L176 395Q166 302 166 227Q166 171 174 139Q178 119 186 103T202 81L208 75Q255 100 261 100Q262 100 264 92T267 83Q267 80 208 30T145 -20Q143 -20 118 17L91 55Q98 117 98 193Q98 339 88 369Q71 390 68 390Q63 390 39 376L27 369",120103:"101 644L132 672L145 657Q155 642 169 628L182 614L169 600Q148 579 140 570L125 555L112 568Q109 570 91 592T72 615Q72 617 101 644ZM19 -208Q-9 -185 -9 -183Q57 -134 80 -106Q103 -81 110 -19T118 179Q118 294 113 329T86 383Q78 389 76 389Q73 389 57 379L39 367Q26 380 26 381L33 387Q40 393 53 405T79 428L130 474Q147 457 186 428L195 422L196 376Q196 130 192 58T174 -35Q172 -39 104 -114T19 -208",120104:"93 348Q93 379 90 503T87 658V670Q87 671 94 671L100 672L112 636Q124 603 124 600L144 616Q196 659 234 682L246 689Q252 686 256 685T268 680L254 667Q225 641 211 626T184 579T168 505V497L178 504Q203 523 237 544L300 584L310 573Q359 522 359 481Q359 476 359 472T358 464T355 456T351 448T346 440T340 433T332 424T323 414T312 402T299 389L255 343L300 342H346L320 309H177V128L193 113Q214 92 244 68L254 60L303 84Q351 108 352 108L362 96Q355 85 277 30T194 -25L170 -4Q146 18 120 41T89 68Q94 85 94 168Q94 184 94 218T93 268V309H58L24 310L51 342H93V348ZM172 342Q217 342 252 374T287 445Q287 472 255 504Q242 517 241 517Q202 498 187 468T168 365V342H172",120105:"221 76L267 99Q268 98 269 96T271 88T270 82L262 76Q255 69 241 57T214 34L148 -20L98 56L99 89Q107 247 107 373Q107 494 101 621Q101 653 99 659V665L106 668L113 672L118 655Q122 642 131 617L138 597Q140 597 157 611L240 670L264 685Q265 685 270 680T276 674T269 667T247 647T219 617Q197 587 186 551T173 493T171 438Q171 376 175 282T179 147V117Q184 109 201 93T221 76",120106:"20 367L8 379Q9 380 63 425T118 471Q130 460 143 446L168 421V398L169 376L295 475Q362 433 415 418V399Q415 380 416 380T437 394T484 428T529 462L544 474L556 467Q590 449 614 438T646 424L653 421L665 417L664 412Q664 411 664 407T664 397T663 384Q660 342 660 335Q658 303 658 245Q658 186 660 152L661 126L669 115Q680 96 697 79L707 83Q716 87 723 90T735 96T741 100T746 102L747 103V102L750 95Q753 88 753 87L631 -18Q630 -17 622 -3T589 43L576 60L579 72Q592 146 592 218Q592 265 584 321Q581 345 578 350T560 363Q535 376 496 386L481 390Q475 387 425 358L415 351V238V157Q415 142 415 135T417 120T421 110T430 98T441 81L465 47Q462 44 458 41T443 28T420 8L380 -26L333 47L336 62Q339 77 342 109T345 184Q345 223 341 285T333 348Q322 364 258 382L240 388L169 347L168 240Q168 118 171 110L174 106Q178 101 183 93T195 78L217 48Q217 47 196 30T154 -5T133 -21L130 -16Q127 -10 122 0T111 19Q89 56 89 60Q95 76 95 153Q95 239 88 337V365L62 391L20 367",120107:"31 368Q20 379 20 380T72 427L121 470L129 463Q137 455 155 441T176 425V367L320 475L329 469Q351 454 385 437T434 417L432 402Q429 362 429 231V128L439 111Q442 107 445 102T449 95T453 90T456 86T459 84T463 82T467 82Q468 82 489 93T511 105T514 95V88L395 -18L340 65L341 77Q347 111 348 178Q348 343 343 353V358L332 363Q298 377 264 382Q260 382 254 382L249 383Q247 383 211 362L176 341V229V147Q176 134 176 127T177 115T179 106T183 99T189 91T197 81Q201 76 206 69T214 57L217 53Q217 52 175 15T132 -22Q132 -20 114 5T88 41Q84 45 84 50Q94 116 94 203Q94 227 93 263T92 324L90 364L67 388L50 378Q32 368 31 368",120108:"67 121Q70 265 84 359V364L97 371Q137 394 177 421T238 464T260 480L278 468Q295 457 327 442T394 418L406 414Q412 388 412 300Q412 263 410 228T405 170T399 130T393 103T391 92L381 86Q274 19 165 -28L161 -24Q157 -21 151 -15T136 -2T118 14T101 30T86 46T74 60L67 68V121ZM335 278Q335 286 335 303T334 335L333 349V356H326Q288 360 208 388L183 397Q178 393 172 383T154 333T142 239Q142 192 151 134Q152 124 155 120T175 99Q197 77 219 64T251 47T267 44T281 52T302 80T320 124Q335 182 335 278",120109:"23 25Q15 33 12 38L35 59Q82 102 87 105V351L68 378Q42 414 42 422Q42 437 67 472T114 530L125 541Q126 541 132 537T138 532Q121 507 121 488Q121 453 160 413L167 405L166 390L165 372Q169 372 233 421T305 478Q307 479 315 472Q395 421 423 415Q424 415 424 415T425 414L426 410Q426 407 426 401T426 388Q430 335 430 272Q430 139 408 80Q407 78 340 22L273 -33Q200 23 165 23Q164 23 164 -32Q165 -89 168 -155V-170L93 -212L78 -203Q85 -48 87 16V47H79Q53 44 23 25ZM319 41Q346 94 349 212Q349 278 343 343V351L330 357Q318 363 270 381L255 387L245 383Q212 370 178 345L166 336V287Q165 260 165 166V94H175Q219 90 299 51L319 41ZM132 57L129 60Q130 58 132 57ZM158 29Q159 29 155 34T145 45T138 50Q155 29 158 29",120110:"399 19Q399 -123 407 -174V-179L332 -219L322 -210L312 -202L314 -185Q320 -83 323 54V95L311 85Q255 40 162 -19Q146 -29 145 -27Q140 -22 103 20L63 65V73Q61 83 61 115Q61 122 61 135T60 154Q60 263 79 353L83 368L94 375Q123 391 147 405T186 429T212 446T229 458T238 466T243 470T247 471L260 464Q274 457 295 448T330 434L341 432L410 479L412 478Q414 476 416 475T419 473L417 461Q399 358 399 19ZM316 367Q287 370 252 377T196 391L176 397H175Q173 397 166 382T149 314T139 187V158Q139 138 141 132T155 114Q158 111 160 109Q210 58 211 58L218 62Q226 67 240 75T266 91L319 124V196Q319 334 325 361V367H316",120111:"357 398Q364 398 375 403L386 408Q386 404 387 400V393L369 377Q361 370 350 360T336 347T327 340T316 336T303 335Q270 335 234 371L224 379Q220 375 214 370T198 355L182 340V243Q182 164 183 152T189 129Q195 117 211 100T239 72T254 60T298 81Q342 101 343 101Q344 100 345 92T346 82L200 -21Q174 -5 117 55L97 75L99 92Q106 147 106 196Q106 216 104 282T97 355Q95 359 95 361Q95 364 77 378L65 387L48 380Q30 372 29 372Q28 371 23 375T17 380Q17 384 50 415T107 467L115 474L128 461Q171 421 182 414V382L235 425Q247 435 261 446T283 462L290 468L295 460Q335 398 357 398",120112:"272 33Q284 33 290 70T296 138Q296 181 290 198T262 230Q257 232 246 232Q231 232 218 227T156 194L108 167L101 176Q90 192 75 219L69 230V284Q69 346 70 357V377L146 427Q181 450 202 464T223 477L225 476Q227 475 229 474Q231 472 242 466T270 450T296 431Q309 418 326 418Q342 418 361 429T392 450T403 459Q406 445 406 442Q406 440 384 421T338 382L316 363Q315 362 310 362Q292 362 251 371T173 396Q156 403 155 403Q143 386 143 342Q143 305 150 278T168 244Q171 242 181 242L190 243L315 300Q330 295 357 274Q358 273 362 270T366 266T369 261T372 253T373 239T374 217T374 185Q374 157 372 133T368 98T363 71T358 50L336 40Q288 20 255 2T211 -22T198 -29L190 -22Q181 -14 168 -3T138 19T104 38T70 46Q50 46 32 37T3 20T-9 11L-18 23L-1 41Q46 89 62 99T112 110Q141 110 157 103T225 62Q268 33 272 33",120113:"228 640L242 627L227 613Q213 599 211 593T203 553Q197 500 196 435V389H301L272 353H195V274Q195 178 196 159L197 123Q249 71 273 68H280L312 83Q344 99 345 99Q348 99 348 78Q348 76 314 52T246 4L212 -20Q211 -20 164 19T112 62Q112 122 113 196Q113 228 113 262T114 318T114 341V353H27L62 389H116L117 431V558L228 640",120114:"171 315Q171 252 165 199T153 124L147 103Q147 102 196 80L244 57L335 107V116Q339 161 339 268Q339 315 338 351T337 412V424L420 468Q424 465 427 461L424 435Q412 331 412 226Q412 170 415 145T434 96Q442 84 452 83Q461 83 492 96L506 102Q507 102 510 96T513 88L493 71Q445 32 401 -9Q392 -18 388 -17L384 -16Q358 39 355 44Q336 77 333 77Q261 45 203 -9Q186 -23 181 -23Q177 -23 162 -11T121 18T69 44L57 48L61 54Q65 60 71 73T82 102Q100 156 100 262Q100 305 93 335T80 373T62 396L23 376Q18 377 9 386L119 474Q149 437 171 421V339V315",120115:"55 418Q55 443 100 503Q121 530 123 530Q125 528 127 528T131 528T134 528T135 524T131 516Q123 499 123 486Q123 457 159 416L169 405L170 388L171 372Q171 371 244 424L317 477L334 466Q394 428 432 416L433 402Q433 400 433 377T434 336V305Q434 195 420 131Q413 94 406 87Q403 84 298 29L192 -28L172 -8Q139 25 106 52L92 64V70Q95 97 95 198Q95 293 94 318L92 355L84 367Q55 406 55 418ZM174 306Q174 297 173 255T171 184Q171 153 175 136T198 100Q207 94 224 80T255 57T282 49Q304 49 328 80Q359 129 359 243Q359 284 352 345Q351 358 348 360Q333 373 304 384T265 396L251 390Q215 372 186 351L175 344V337Q175 319 174 306",120116:"45 425Q45 439 82 485T126 532Q127 532 128 532T131 531T137 529L132 519Q121 499 121 483Q121 473 131 454T156 419L167 408L169 376L185 388Q237 425 291 473L301 466Q337 443 394 416L419 405L418 387V369Q419 369 487 418T560 471L581 459Q597 450 621 437T664 415T684 406Q688 406 688 323Q688 254 679 193T662 103T648 71Q647 70 554 20L464 -28L443 -15Q416 1 386 17T343 40T331 49Q331 52 333 73T337 133T339 216Q339 309 334 339Q333 341 316 353T277 377T246 389Q235 389 201 369T166 346Q166 345 164 247Q164 232 164 210T163 179Q163 139 170 116T205 57L212 48L136 -27Q115 16 87 44L78 53L80 67Q88 124 88 211Q88 282 87 315T83 356T74 371Q45 410 45 425ZM591 352Q580 359 565 365T540 374T517 381T504 385L418 342L417 318V220Q417 212 417 194T417 170T418 152T420 134T424 120T431 106T440 95T454 83Q508 44 544 44Q566 44 583 77Q603 120 605 235Q605 289 600 322Q598 343 597 345T591 352",120117:"14 377Q63 428 117 472Q130 462 144 449L193 408V392V376L247 420Q300 464 301 464L310 451Q331 417 363 390L333 365Q303 340 301 340Q293 343 277 364T250 386Q241 386 215 361L195 341Q194 333 193 327T191 318T190 304T188 269Q188 220 192 148Q193 122 195 118T210 101Q255 60 271 60Q276 60 278 61L318 82Q327 86 336 91T351 98L356 101Q359 82 356 79Q354 77 283 27T210 -24L192 -7Q160 23 137 40L126 49L116 40Q66 -13 66 -54Q66 -117 167 -140L179 -142V-147L180 -152L123 -188L112 -185Q58 -170 31 -145Q10 -122 10 -96Q10 -80 22 -53Q44 -10 95 49Q97 51 100 54T104 59T107 64T109 71T111 81T112 97T113 119T114 149T114 188Q114 284 108 347V354L96 365Q76 385 67 385Q62 385 45 377L27 368L14 377",120118:"74 58Q89 124 89 241Q89 265 89 278T89 305T88 324T87 336T84 346T81 352T77 359T71 368Q57 388 52 398L45 409Q62 454 98 507L113 528Q128 528 128 524Q128 523 125 518T120 503T117 483V471Q123 456 130 445Q135 438 140 432T148 422T153 415T157 409T160 405T162 402T163 399T163 395V384V365Q165 365 237 419L311 473Q383 430 420 416Q426 414 426 411V404Q426 398 426 388T427 367Q431 233 431 201Q431 -3 391 -52Q387 -58 305 -138T221 -218L218 -217Q216 -216 211 -214T202 -210L184 -202L199 -194Q259 -162 288 -127T334 -19T350 184Q350 257 342 328L340 356Q282 390 262 390Q248 390 178 346L163 336V111L216 45L131 -26L124 -15Q114 3 85 44L74 58",120119:"47 335L36 347L52 362Q112 421 167 461L181 471L192 465Q236 444 260 417T284 369Q284 355 276 343T233 291Q195 246 195 245T205 242T241 228T300 198L302 187Q314 138 314 74Q314 -24 291 -95Q290 -100 222 -157L154 -214H145Q102 -214 53 -189T-7 -117Q41 -21 183 122L207 147Q205 149 186 157T140 172T100 180H97V192L140 231Q192 280 199 293Q205 303 205 315Q205 339 185 363T137 388Q119 388 63 347L47 335ZM179 -153Q212 -153 226 -113T240 14Q240 67 233 98T223 132T211 143L222 130Q216 125 206 116T170 82T124 33T88 -20T72 -70Q72 -99 105 -126T179 -153",120120:"130 -1H63Q34 -1 26 2T17 17Q17 24 22 29T35 35Q49 35 64 44T88 66Q101 93 210 383Q331 693 335 697T346 701T357 697Q358 696 493 399Q621 104 633 83Q656 35 686 35Q693 35 698 30T703 17Q703 5 693 2T643 -1H541Q388 -1 386 1Q378 6 378 16Q378 24 383 29T397 35Q412 35 434 45T456 65Q456 93 428 170L419 197H197L195 179Q184 134 184 97Q184 82 186 71T190 55T198 45T205 39T214 36L219 35Q241 31 241 17Q241 5 233 2T196 -1H130ZM493 68Q493 51 481 35H619Q604 56 515 256Q486 321 468 361L348 637Q347 637 330 592T313 543Q313 538 358 436T448 219T493 68ZM404 235Q404 239 355 355T295 488L275 430Q241 348 208 232H306Q404 232 404 235ZM155 48Q151 55 148 88V117L135 86Q118 47 117 46L110 37L135 35H159Q157 41 155 48",120121:"11 665Q11 672 22 683H213Q407 681 431 677Q582 649 582 515Q582 488 573 468Q554 413 484 372L474 366H475Q620 317 620 178Q620 115 568 69T420 6Q393 1 207 -1H22Q11 10 11 18Q11 35 51 35Q79 37 88 39T102 52Q107 70 107 341T102 630Q97 640 88 643T51 648H46Q11 648 11 665ZM142 341Q142 129 141 88T134 37Q133 36 133 35H240L233 48L229 61V623L233 635L240 648H133L138 639Q142 621 142 341ZM284 370Q365 378 391 411T417 508Q417 551 406 581T378 624T347 643T320 648Q298 648 278 635Q267 628 266 611T264 492V370H284ZM546 515Q546 551 531 577T494 617T454 635T422 641L411 643L420 630Q439 604 445 579T452 510V504Q452 481 451 467T441 430T415 383Q420 383 439 391T483 413T527 455T546 515ZM585 185Q585 221 570 249T534 294T490 320T453 334T436 337L435 336L440 330Q445 325 452 315T467 288T479 246T484 188Q484 145 474 110T454 62T442 48Q442 47 444 47Q450 47 470 54T517 75T564 119T585 185ZM449 184Q449 316 358 332Q355 332 335 333T302 335H264V199Q266 68 270 57Q275 50 289 43Q300 37 324 37Q449 37 449 184",120123:"16 666Q16 675 28 683H193Q329 683 364 682T430 672Q534 650 600 585T686 423Q688 406 688 352Q688 274 673 226Q641 130 565 72T381 1Q368 -1 195 -1H28Q16 5 16 16Q16 35 53 35Q68 36 75 37T87 42T95 52Q98 61 98 341T95 630Q91 640 83 643T53 648Q16 648 16 666ZM237 646Q237 648 184 648H128Q128 647 133 632Q136 620 136 341Q136 64 133 50L128 35H237L230 48L226 61V343Q228 620 231 633Q232 636 237 646ZM264 61Q278 40 310 35Q363 35 401 55T461 112T496 193T513 295Q515 333 515 349Q515 411 504 459Q481 598 373 641Q351 648 321 648Q304 648 292 643T277 635T264 621V61ZM461 628Q462 627 471 616T489 594T509 559T529 509T544 441T550 352Q550 165 479 75L468 59Q474 61 484 65T522 87T573 128T618 195T650 290Q654 322 654 354Q654 418 638 464T581 552Q559 576 529 595T480 621L461 628",120124:"12 666Q12 675 24 683H582Q590 680 593 672V588Q593 514 591 502T575 490Q567 490 563 495T555 517Q552 556 517 590Q486 623 445 634T340 648H282Q266 636 264 620T260 492V370H277Q329 375 358 391T404 439Q420 480 420 506Q420 529 436 529Q445 529 451 521Q455 517 455 361Q455 333 455 298T456 253Q456 217 453 207T437 197Q420 196 420 217Q420 240 406 270Q377 328 284 335H260V201Q261 174 261 134Q262 73 264 61T278 38Q281 36 282 35H331Q400 35 449 50Q571 93 602 179Q605 203 622 203Q629 203 634 197T640 183Q638 181 624 95T604 3L600 -1H24Q12 5 12 16Q12 35 51 35Q92 38 97 52Q102 60 102 341T97 632Q91 645 51 648Q12 648 12 666ZM137 341Q137 131 136 89T130 37Q129 36 129 35H235Q233 41 231 48L226 61V623L231 635L235 648H129Q132 641 133 638T135 603T137 517T137 341ZM557 603V648H504Q504 646 515 639Q527 634 542 619L557 603ZM420 317V397L406 383Q394 370 380 363L366 355Q373 350 382 346Q400 333 409 328L420 317ZM582 61L586 88Q585 88 582 83Q557 61 526 46L511 37L542 35H577Q577 36 578 39T580 49T582 61",120125:"584 499Q569 490 566 490Q558 490 552 497T546 515Q546 535 533 559Q526 574 506 593T469 621Q415 648 326 648Q293 648 287 647T275 641Q264 630 263 617Q262 609 260 492V370L275 372Q323 376 350 392T393 441Q409 473 409 506Q409 529 427 529Q437 529 442 519Q444 511 444 362Q444 212 442 206Q436 197 426 197Q409 197 409 217Q409 265 375 299Q346 328 280 335H260V206Q260 70 262 63Q265 46 276 41T326 35Q362 35 366 28Q377 17 366 3L360 -1H24Q12 5 12 16Q12 35 51 35Q92 38 97 52Q102 60 102 341T97 632Q91 645 51 648Q12 648 12 666Q12 675 24 683H573Q576 678 584 670V499ZM137 341Q137 131 136 89T130 37Q129 36 129 35H182Q233 35 233 39Q226 54 225 92T224 346L226 623L231 635L235 648H129Q132 641 133 638T135 603T137 517T137 341ZM549 603V648H495L506 641Q531 621 533 619L549 603ZM409 317V395L400 386Q390 376 375 366L357 355L373 346Q394 331 397 328L409 317",120126:"737 285Q749 277 749 268Q749 260 744 255T730 250Q695 250 677 217Q666 195 666 119Q666 52 664 50Q656 36 555 3Q483 -16 415 -19Q364 -19 348 -17Q226 -3 146 70T44 261Q39 283 39 341T44 421Q66 538 143 611T341 699Q344 699 364 700T395 701Q449 698 503 677T585 655Q603 655 611 662T620 678T625 694T639 702Q650 702 657 690V481L653 474Q640 467 628 472Q624 476 618 496T595 541Q562 587 507 625T390 663H381Q337 663 299 625Q213 547 213 337Q213 75 341 23Q357 19 397 19Q440 19 462 22T492 30T513 45V119Q513 184 506 203Q491 237 435 250Q421 250 415 257Q404 267 415 281L421 285H737ZM250 43Q250 45 243 55T225 87T203 139T185 224T177 343V361Q184 533 250 625Q264 643 261 643Q238 635 214 620T161 579T110 510T79 414Q74 384 74 341T79 268Q106 117 230 52L250 43ZM621 565V625Q617 623 613 623Q603 619 590 619H575L588 605Q608 583 610 579L621 565ZM655 250H517L524 241Q548 213 548 149V114V39Q549 39 562 44T592 55T615 63L630 70V134Q632 190 634 204T648 237Q655 245 655 250",120128:"20 666Q20 676 31 683H358Q369 676 369 666Q369 648 331 648Q288 645 282 632Q278 626 278 341Q278 57 282 50Q286 42 295 40T331 35Q369 35 369 16Q369 6 358 -1H31Q20 4 20 16Q20 35 58 35Q84 37 93 39T107 50Q113 60 113 341Q113 623 107 632Q101 645 58 648Q20 648 20 666ZM249 35Q246 40 246 41T244 54T242 83T242 139V341Q242 632 244 639L249 648H140Q146 634 147 596T149 341Q149 124 148 86T140 35H249",120129:"79 103Q108 103 129 83T151 38Q151 9 130 -15Q116 -34 130 -37Q133 -39 157 -39Q208 -39 219 -8L226 3V305Q226 612 224 621Q220 636 211 641T166 647Q137 647 128 654Q119 665 128 679L135 683H466Q478 677 478 666Q478 647 439 647Q399 644 393 632Q388 620 388 347Q386 69 384 59Q364 -6 316 -39T184 -77H172Q102 -77 56 -48T6 30Q6 62 26 82T79 103ZM353 354Q353 556 354 596T361 645Q362 646 362 647H253Q257 639 258 628T261 547T262 312V-4L255 -17Q248 -29 250 -29Q253 -29 258 -28T277 -20T302 -5T327 22T348 65Q350 74 353 354ZM115 36Q115 47 105 57T79 67Q73 67 67 66T52 56T44 34Q44 9 62 -8Q66 -11 71 -15T81 -22T86 -24L90 -13Q100 3 102 5Q115 22 115 36",120130:"22 666Q22 676 33 683H351L358 679Q368 665 358 655Q351 648 324 648Q288 645 280 637Q275 631 274 605T273 477L275 343L382 446Q473 530 492 553T512 599Q512 617 502 631T475 648Q455 651 455 666Q455 677 465 680T510 683H593H720Q732 676 732 666Q732 659 727 654T713 648Q670 648 589 581Q567 562 490 489T413 415Q413 413 554 245T711 61Q737 35 751 35Q758 35 763 29T768 15Q768 6 758 -1H624Q491 -1 486 3Q480 10 480 17Q480 25 487 30T506 35Q518 36 520 38T520 48L400 195L302 310L286 297L273 283V170Q275 65 277 57Q280 41 300 38Q302 37 324 35Q349 35 358 28Q367 17 358 3L351 -1H33Q22 4 22 16Q22 35 60 35Q101 38 106 52Q111 60 111 341T106 632Q100 645 60 648Q22 648 22 666ZM240 341V553Q240 635 246 648H138Q141 641 142 638T144 603T146 517T146 341Q146 131 145 89T139 37Q138 36 138 35H246Q240 47 240 129V341ZM595 632L615 648H535L542 637Q542 636 544 625T549 610V595L562 606Q565 608 577 618T595 632ZM524 226L386 388Q386 389 378 382T358 361Q330 338 330 333Q330 332 330 332L331 330L533 90Q558 55 558 41V35H684L671 50Q667 54 524 226",120131:"12 666Q12 675 24 683H333L340 679Q350 665 340 655Q333 648 309 648Q287 646 279 643T266 630Q264 623 264 346Q264 68 266 57Q274 40 284 35H340Q413 37 460 55Q514 78 553 117T602 197Q605 221 622 221Q629 221 634 215T640 201Q638 194 625 105T611 12Q611 6 600 -1H24Q12 5 12 16Q12 35 51 35Q92 38 97 52Q102 60 102 341T97 632Q91 645 51 648Q12 648 12 666ZM137 341Q137 131 136 89T130 37Q129 36 129 35H237Q235 41 233 48L229 61L226 339Q226 621 229 628Q230 630 231 636T233 643V648H129Q132 641 133 638T135 603T137 517T137 341ZM580 48Q580 59 583 74T586 97Q586 98 585 97T579 92T571 86Q549 64 513 43L500 35H577L580 48",120132:"18 666Q18 677 27 680T73 683H146Q261 683 266 679L465 215Q469 215 566 443Q663 676 668 681Q673 683 790 683H908L915 679Q924 664 915 655Q912 648 897 648Q851 639 835 606L833 346Q833 86 835 79Q838 69 849 58T873 41Q877 40 887 38T901 35Q926 35 926 16Q926 6 915 -1H604L597 3Q588 19 597 28Q600 35 615 35Q660 42 673 68L679 79V339Q679 409 679 443T679 520T679 580T677 597Q646 521 584 375T473 117T424 3Q416 -1 410 -1T401 1Q399 3 273 301L148 599L146 343Q146 86 148 79Q152 69 163 58T186 41Q190 40 200 38T215 35Q226 35 235 28Q244 17 235 3L228 -1H28Q17 4 17 17Q17 35 39 35Q84 42 97 68L104 79V639L88 641Q72 644 53 648Q34 648 26 651T18 666ZM457 166Q451 169 449 171T435 198T404 268T344 412L244 648H157L166 637Q169 633 293 346L413 66Q424 88 435 117L457 166ZM817 646Q817 648 766 648H715V72L708 57Q701 45 697 41L695 37Q695 35 757 35H819L813 46Q802 61 800 76Q797 105 797 346L799 612L804 626Q812 638 815 641L817 646ZM124 42Q119 42 119 38Q119 35 128 35Q132 35 132 36Q125 42 124 42",120134:"131 601Q180 652 249 676T387 701Q485 701 562 661Q628 629 671 575T731 448Q742 410 742 341T731 234Q707 140 646 81Q549 -19 389 -19Q228 -19 131 81Q57 155 37 274Q34 292 34 341Q34 392 37 410Q58 528 131 601ZM568 341Q568 613 437 659Q406 664 395 665Q329 665 286 625Q232 571 213 439Q210 408 210 341Q210 275 213 245Q232 111 286 57Q309 37 342 23Q357 19 389 19Q420 19 437 23Q469 38 491 57Q568 132 568 341ZM174 341Q174 403 177 441T197 535T249 639Q246 639 224 627T193 608Q189 606 183 601T169 589T155 577Q69 488 69 344Q69 133 231 52Q244 45 246 45Q248 45 246 48Q231 69 222 85T200 141T177 239Q174 269 174 341ZM708 341Q708 415 684 475T635 563T582 610Q578 612 565 619T546 630Q533 637 531 637Q530 637 530 636V635L531 634Q562 591 577 543Q602 471 602 341V316Q602 264 599 230T580 144T531 48L530 47V46Q530 45 531 45Q533 45 547 52T583 75T622 105Q708 195 708 341",120138:"54 238Q72 238 72 212Q72 174 106 121Q113 110 132 90T166 59Q221 23 264 23Q315 23 348 41Q368 50 384 79Q393 102 393 129Q393 181 356 219T221 299Q120 343 74 390T28 501Q28 561 55 610Q98 682 212 699Q214 699 231 700T261 701Q309 698 340 687T408 675Q431 678 445 690T465 702Q474 702 481 690V497L477 490Q464 481 450 490Q446 500 446 501Q446 546 386 606T260 666Q215 666 182 639T148 565Q148 528 186 496T319 428Q352 414 370 405T418 379T468 338T506 284Q528 239 528 191Q528 102 456 46T266 -10Q211 -10 176 2T110 15Q86 9 73 -1T53 -12Q44 -12 37 -1V112V182Q37 214 40 226T54 238ZM446 619Q446 648 444 648Q439 646 435 644Q425 644 415 639H404L417 624Q435 606 439 601L446 592V619ZM124 619L128 635Q126 635 108 617Q64 576 64 502Q64 489 65 479T76 449T102 414T150 376T228 335Q335 291 381 245T427 128Q427 94 419 75L415 61Q421 61 448 88Q490 127 490 190Q490 233 475 264Q456 299 430 321Q402 349 369 367T287 404T204 441Q138 481 119 526Q113 544 113 565Q113 596 124 619ZM75 43Q76 43 90 46T110 50H119L106 64L74 101Q72 101 72 72T75 43",120139:"33 672Q36 680 44 683H624Q632 680 635 672V490L631 483Q621 479 617 479Q611 479 606 485T600 499Q600 525 584 552Q577 567 558 588T524 617Q479 642 426 646L415 648V355Q415 62 422 52Q425 42 434 40T473 35Q500 35 509 28Q518 17 509 3L502 -1H166L160 3Q149 17 160 28Q167 35 195 35Q224 37 234 39T249 52Q253 66 253 355V648L242 646Q192 642 144 617Q129 609 110 588T84 552Q69 527 69 499Q69 490 64 484T50 478Q39 478 33 490V672ZM113 639L126 648H69V597L84 612Q93 623 113 639ZM389 35Q382 46 381 86Q380 134 380 350V648H289V350Q289 199 288 131T286 53T280 35H389ZM600 597V648H542L555 639Q575 623 584 612L600 597",120140:"16 666Q16 677 28 683H341L348 679Q359 665 348 654Q342 648 315 648Q270 644 266 632Q262 627 262 598T261 399Q261 372 261 325T260 260Q260 149 274 99T339 30Q355 25 393 25Q430 25 457 33T494 49T519 72Q562 115 575 205Q576 219 576 379Q576 538 575 550Q568 597 550 622T506 648Q498 648 493 654T487 667T499 683H697Q709 675 709 667T704 654T690 648Q653 648 633 597Q624 573 622 546T619 377Q617 193 613 174Q596 95 544 41Q477 -19 355 -19H344Q275 -16 226 5T153 57T120 110T106 154Q101 172 99 399Q99 618 95 632Q88 644 53 648Q16 648 16 666ZM228 639L233 648H128Q128 647 133 632Q135 621 135 412Q135 197 137 185Q148 115 181 79Q209 51 235 41Q242 36 258 31T277 25Q276 27 268 38T254 59T241 92T228 145Q226 161 226 399Q226 632 228 639ZM604 621Q606 626 619 648H577L586 634Q587 632 591 625T595 614L597 608L604 621",120141:"316 683Q327 676 327 666Q327 648 302 648Q272 642 258 628Q249 621 249 608Q252 589 263 556T289 485T322 406T357 325T388 256T411 205L420 185Q423 185 473 317Q547 497 547 590Q547 621 541 632T516 648Q501 648 498 654Q488 664 498 679L504 683H607H660Q695 683 707 680T719 667Q719 660 714 654T700 648Q678 648 658 628L642 614L513 301Q484 231 449 148T397 25T380 -15Q373 -20 368 -20Q361 -20 358 -15Q354 -13 287 135T149 438T67 610Q45 648 18 648Q11 648 6 653T0 666Q0 677 9 680T59 683H164H316ZM216 614Q216 620 216 622T216 628T216 633T217 635T218 638T219 640T221 644T224 648H84L96 632Q118 592 236 330L367 43L387 88L404 132L380 185Q250 468 222 568Q216 590 216 614ZM576 645Q584 628 584 597L587 568L598 597Q609 624 618 637L624 648H600Q576 648 576 645",120142:"785 664Q785 670 795 683H982Q994 675 994 665Q994 650 975 648Q953 643 939 619Q931 593 823 292T710 -15Q706 -19 699 -19T688 -15Q682 -6 639 107T555 328T513 437Q513 438 500 409T462 325T413 212Q315 -14 310 -17Q308 -19 302 -19T288 -15L57 619Q45 643 24 648Q5 650 5 665Q5 677 17 683H146H200Q256 683 270 681T285 666Q285 659 280 654T268 648Q253 648 239 634Q230 630 230 619Q230 598 264 481L362 192Q363 193 428 341T493 492Q493 496 473 546T446 608Q426 648 399 648Q392 648 387 653T382 667Q382 678 393 683H679Q690 670 690 665Q690 662 685 655T673 648Q653 648 633 632L622 625V610Q626 576 657 479T719 300T751 218Q754 218 779 294Q847 492 847 581Q847 648 802 648Q796 648 791 652T785 664ZM194 623Q194 630 199 648H82L90 632Q99 616 199 332L302 50Q303 50 322 94T342 141Q342 142 305 245T231 467T194 623ZM585 620Q585 634 593 648H530Q466 648 466 645Q479 632 595 323L699 54Q701 56 718 103T735 154L702 245Q585 562 585 620ZM884 572L890 587Q896 602 903 620T915 645Q915 648 893 648H868L875 634Q883 598 883 576Q883 572 884 572",120143:"22 666Q22 677 31 680T80 683H184H335Q346 675 346 667Q346 660 341 655Q335 648 315 648Q280 644 273 637Q273 630 300 583T356 492T386 448Q430 504 450 535T474 577T478 601Q478 620 469 634T444 648Q428 648 428 666Q428 678 436 680T488 683H559H630Q673 683 681 681T690 666Q690 648 673 648Q652 648 619 637Q571 615 517 550Q490 517 450 464T410 408Q415 399 501 273T617 106Q648 61 661 48T688 35Q705 35 705 16Q705 5 695 -1H539Q384 -1 379 3Q373 10 373 17Q373 27 380 31T408 35Q459 40 459 49Q459 59 418 129T335 259Q334 260 332 260Q328 260 273 197Q210 127 208 117Q199 104 199 82Q199 57 213 46T239 35Q247 35 252 29T257 15Q257 10 256 7T253 3T248 0L246 -1H28Q16 7 16 15T21 29T35 35Q61 35 117 88Q289 279 304 297Q307 303 255 377Q117 586 79 626Q60 648 39 648Q32 648 27 653T22 666ZM237 639V648H173Q113 647 113 646Q113 642 137 612Q186 546 302 373T453 139Q497 63 497 43Q497 39 495 35H559Q622 35 622 37Q622 38 583 94T486 233T373 399T277 552T237 639ZM553 637L566 648H504L508 637Q510 630 515 615V603L528 615Q529 616 539 625T553 637ZM170 46Q169 49 167 58T164 70V83L137 59L113 35H175Q175 38 170 46",120144:"16 659T16 667T28 683H295Q306 676 306 666Q306 648 284 648Q258 648 255 641Q255 634 265 615T339 479Q418 339 421 339L455 394Q489 448 523 502L557 557Q560 566 560 582Q560 637 504 648Q489 648 486 655Q475 664 486 679L493 683H693Q704 675 704 667Q704 650 684 648Q672 645 653 623Q633 604 614 576T517 426L439 301V183Q442 62 444 59Q449 35 504 35Q521 35 528 30Q538 16 528 3L521 -1H195L188 3Q178 16 188 30Q195 35 213 35Q266 35 273 59Q274 61 277 163V261L75 621Q64 638 58 643T37 648Q28 648 22 653ZM219 637V648H101Q110 634 215 446L313 270V166Q310 59 306 48L301 35H415L410 48Q404 65 404 175V290L317 443Q230 601 226 612Q219 625 219 637ZM608 630L624 648H575Q584 632 588 623L595 610L608 630",120172:"821 97Q822 97 824 88T827 77L793 53Q676 -25 670 -28Q669 -29 656 -27L583 123Q583 124 467 46L352 -31L341 -20Q305 18 264 47T192 77Q161 77 60 32L49 40Q37 47 38 49Q39 49 93 83T212 160T297 219Q411 312 411 452Q411 519 360 571T233 624Q180 624 157 601T133 548Q133 524 160 496T214 441T241 393Q241 356 199 321T100 256L86 249L77 256Q68 263 67 263L84 274Q101 286 118 304T135 339T109 384T56 446T29 504Q29 566 118 624Q207 686 309 686Q349 686 360 685Q405 678 439 661T491 625T520 583T534 543T537 511Q537 436 491 344L478 318L455 299Q420 272 308 179L284 160L294 158Q348 154 426 89L437 79Q513 110 579 153V175Q579 183 579 227T580 330T581 446T582 542L583 582L664 630Q681 640 703 653T734 673L744 679Q750 678 756 676L767 674L716 623V585Q716 568 712 463T708 289V250Q708 237 709 218T710 195L711 180L739 130Q768 79 771 79Q775 79 796 88T821 97",120173:"160 345Q160 357 144 376T109 413T73 458T57 509Q57 544 95 584Q142 631 205 657T331 684Q382 684 427 658T500 585L505 577L521 588Q537 599 562 614T616 646T679 673T738 684Q790 684 807 666T840 587Q850 552 863 532T888 508Q894 505 906 505Q917 505 930 507T953 512T963 514L964 504Q965 495 965 494T914 467T808 413T745 384H751Q782 380 802 377T854 362T904 334T937 287T951 217Q951 178 937 143T908 91Q903 86 820 34L734 -21L718 -24Q679 -31 639 -31Q561 -31 451 4T271 40Q190 40 119 -2L99 -13L91 1L84 15L86 16Q88 18 132 42T233 100T315 152Q377 199 386 233Q388 240 393 297T399 363Q399 487 353 551Q337 573 306 597T238 622Q201 622 179 602T157 557T214 476T272 396Q272 371 229 334T143 272T96 246Q95 246 85 252T74 259T95 273T138 306T160 345ZM529 443Q529 409 528 385T526 353L525 346Q526 346 649 390T773 435Q749 451 742 464T727 518Q727 519 725 532T721 548T717 562T712 577T706 589T698 601T688 608T675 614T658 616Q626 616 576 582T525 528Q525 527 526 518T528 489T529 443ZM772 57Q774 57 778 58T792 64T808 77T821 103T827 144Q827 222 784 266T660 322Q652 323 611 323H596Q577 323 535 316L523 314Q520 291 505 255L500 241L356 138L366 137Q443 131 518 110T650 72T748 54Q763 54 772 57",120174:"460 -32Q373 -32 305 -11T193 45T122 124T83 214T72 303Q72 395 114 476L119 486L313 592L338 568L359 580Q418 615 479 638T568 668T606 675Q607 675 608 676H610Q612 676 615 661T630 621T660 578Q673 568 694 568Q717 568 721 570H726Q724 565 722 559L717 549L706 545Q608 513 583 513Q568 517 559 522T533 546T493 603L490 609Q452 599 452 558Q452 537 469 481T486 393Q486 353 474 331T422 285T296 231L272 223L262 230L253 237Q279 246 314 274T351 338Q351 376 334 442T316 532Q316 546 319 552Q319 554 316 554Q304 554 288 547T250 523T214 466T199 371Q199 218 299 133T541 47Q571 47 585 51T652 81L712 108Q716 104 716 81L706 74Q695 68 673 54T633 29L550 -22L540 -24Q492 -32 460 -32",120175:"380 596Q307 596 250 582T158 546T100 493T67 433T56 373V361Q55 361 43 366L31 372V384Q31 455 69 523T173 627Q213 650 284 666T444 683H452Q629 683 735 629Q896 548 896 369Q896 263 839 163Q835 155 818 140Q746 82 662 27T563 -29Q525 -29 386 16T183 62Q147 62 127 52T63 1L48 -14L40 -4L31 5Q83 73 172 149L186 161H199Q291 161 329 181Q357 199 357 231Q357 258 301 316T245 396Q245 423 282 458T349 512T403 543L413 548L425 545L438 541Q373 491 373 462Q373 446 399 415T453 349T480 288Q480 251 433 212Q394 180 348 156L334 148L353 145Q408 134 513 105T654 76Q711 76 745 132T780 277Q780 434 676 517Q637 549 562 572T380 596",120176:"527 55Q574 55 619 69T691 97L717 111V85L562 -18Q520 -29 443 -29Q379 -29 325 -15T235 21T180 61T146 98Q74 186 74 307Q74 395 109 472Q113 482 123 489T190 533Q251 568 295 591L308 598L350 580L361 586Q403 612 464 636T564 673T609 686Q610 686 610 685Q612 683 616 670T627 636T646 601Q666 572 686 572H692Q713 572 726 576H728L725 565L723 554L692 544Q660 535 629 526T595 516Q585 514 574 519Q563 527 543 552T507 597T490 617Q467 604 456 579V564Q456 535 473 471T492 393L494 381L613 460L622 446Q630 433 650 411T696 371L703 365L614 312H596L580 322Q568 329 553 340T528 355T510 360Q496 358 491 354T484 345T471 326T435 297Q408 278 370 261T307 235T277 227Q273 227 266 234L256 240L267 245Q280 251 294 258T330 288T353 336Q353 373 335 444T316 530V537Q316 549 322 567Q270 554 233 499T196 370Q196 253 287 157Q392 55 527 55",120177:"424 522Q265 596 208 596Q193 596 180 593T150 579T116 542T89 474Q86 465 86 463L59 481L63 494Q87 578 137 627Q191 684 285 684Q334 684 406 658T538 607T621 581Q644 581 706 629L721 640Q722 640 725 630L727 620Q701 592 654 548T582 486L569 487Q533 490 485 504L468 508Q449 503 429 495T387 466T365 422Q365 373 439 299L453 310Q473 325 528 370L588 418Q614 398 642 368T668 331Q667 331 628 296L590 262L582 274Q557 311 526 311Q511 311 487 297T462 278Q462 277 492 244T551 166T581 88Q581 54 570 25T536 -27T505 -56T478 -76Q376 -146 274 -146H270Q199 -146 162 -118T124 -15Q124 12 128 30T132 96V107Q132 144 117 157Q102 169 85 169Q74 169 59 165T32 156T20 151Q20 152 19 158T17 167Q17 168 17 168T17 169T19 170T22 172T27 175T35 179Q131 230 195 230Q231 230 259 202Q270 190 270 171Q269 150 253 87T236 -16Q236 -67 261 -87T322 -107Q380 -107 428 -68Q467 -35 467 30Q467 60 447 91T383 171T316 251Q290 286 278 308T263 339T261 359Q261 384 284 418Q322 469 424 522",120178:"742 611Q784 611 812 631V611Q807 607 783 591T718 544T629 476L606 458Q608 458 628 457T667 453T713 443T762 423T804 388T836 335Q844 313 844 289Q844 231 814 182T746 103Q720 82 655 48T546 -18L520 -21Q456 -29 432 -29Q313 -29 223 33Q204 45 183 65T135 119T91 207T74 320Q74 428 109 480Q116 491 127 497T215 546L308 595L343 583L355 591Q387 613 433 636T488 660H489L491 659Q493 658 495 657T500 655L509 650L500 645Q479 635 460 612T441 552Q441 535 447 498T459 433T466 405L625 513L643 526Q620 530 585 546T535 586Q535 587 532 592T527 602T525 610Q525 613 577 649L630 687Q632 687 638 675T653 649T686 623T742 611ZM349 313Q349 328 327 413T305 510V516Q305 531 308 542T314 559T317 566T315 567Q297 567 270 548Q233 524 212 490T191 392Q191 337 206 288T244 207T284 156T316 128Q410 51 535 51Q632 51 675 102T718 217Q718 269 690 314T599 375Q574 381 535 381Q501 381 477 377L466 376Q469 364 469 349Q469 314 457 295T408 258Q366 236 308 219L288 213L279 220L270 227Q284 232 294 236T309 243T320 252T326 260T331 270T336 281Q349 310 349 313",120179:"288 139Q288 172 255 224T189 335T156 442Q156 495 242 579Q289 625 361 668Q364 671 368 673T376 678T380 681L384 683L392 676Q401 670 414 661T443 642T477 626T509 619Q543 619 618 668Q625 672 628 674T631 675Q632 673 633 663T633 651L564 595Q556 589 545 580T528 566T516 556T505 548T497 543T488 539T481 537T472 535T463 534T451 534H442Q385 534 304 581L291 589Q290 588 285 583T277 575T269 566T262 555T257 543T255 529V522Q255 507 260 487T276 446T293 409T311 376L321 359Q321 358 322 358T324 359T327 361T333 366Q386 409 481 460L503 472L543 471Q586 471 599 470Q692 459 714 430Q725 416 738 360T752 245Q752 184 742 127T725 51T703 -8Q700 -13 619 -64T518 -123Q508 -126 493 -126Q438 -126 398 -86L427 -52Q456 -17 457 -17Q460 -17 465 -16H473Q474 -21 481 -32T504 -56T539 -69Q572 -69 599 -34Q625 4 625 158Q625 264 609 311T532 378Q508 386 484 386Q455 386 419 372T360 345T337 330L346 313Q375 263 386 227Q389 215 389 202Q389 192 388 184T384 168T376 152T365 138T350 121T331 103T307 81T278 54L194 -24Q130 30 99 30Q85 30 64 20T31 1T16 -10Q15 -11 13 -7Q12 -6 11 -3Q8 4 6 8L32 35Q88 88 117 107T169 126Q177 126 182 125Q218 118 252 84L263 73Q288 113 288 139",120180:"500 615Q523 615 550 628T595 655T614 668L623 654L607 642Q512 569 440 534L427 527L413 529Q384 535 340 547T265 565T209 572Q173 572 145 556T101 522T60 465Q58 460 54 460T41 468L32 477L37 487Q96 599 139 640Q187 681 247 681Q275 681 283 680Q313 674 398 645T500 615ZM418 170Q418 186 410 260T401 382Q403 418 403 424L405 433L415 444Q482 515 571 571L582 578Q591 573 607 568L597 560Q522 504 522 450Q522 427 533 357T545 241V228Q545 190 536 159T508 106T478 73T446 48Q343 -25 238 -25Q179 -25 118 15L107 22L79 5Q51 -12 51 -12L38 2L55 18Q106 67 175 122L192 136Q202 130 206 123Q223 91 252 61Q263 50 266 48T278 39T297 32T320 30Q357 30 389 68Q415 102 418 170",120181:"65 510Q68 517 74 528T101 569T144 620T202 661T274 680Q308 680 389 628T503 576Q530 576 596 600Q615 607 616 607Q616 602 615 596V585Q605 581 576 568T531 548T485 531T418 509L400 503L358 522Q347 527 327 537T299 550T277 560T257 568T239 573T220 577T201 578H196Q181 578 169 575T135 554T88 502L83 496Q82 496 74 502T65 510ZM424 4Q424 50 395 151T365 313V320Q365 352 369 361T405 403Q431 432 465 462T521 508T547 525L549 524Q551 524 554 523T560 521L571 517L552 498Q515 461 499 430Q485 399 485 366Q485 326 512 231T539 84Q539 -14 460 -77T273 -141Q248 -141 234 -140T198 -131T160 -106T134 -59Q128 -40 124 -16T117 22T108 49T91 69T59 75T15 65L1 59Q-8 76 -7 77Q4 85 22 97T88 129T170 149Q218 149 234 125Q242 112 242 43V21Q242 -17 248 -41T274 -85T322 -105H325H330Q363 -105 396 -75Q424 -47 424 4",120182:"234 109Q234 144 194 245T153 404Q153 445 180 490Q232 572 325 626T517 681H524Q612 681 661 658Q683 647 699 632T717 604Q717 600 708 545L699 490L690 489Q681 488 679 488Q675 488 669 504T640 546T577 592Q520 620 446 620Q415 620 386 614T327 594T280 553T262 487Q262 468 265 447T271 413T279 384T285 362L295 371Q320 396 352 421T439 474T538 502Q577 502 596 484T627 428Q642 386 651 373T677 360H682Q698 360 727 369L724 357Q724 354 724 351T722 346V344Q559 289 539 283Q582 272 589 271L615 265L637 189Q662 109 663 108Q668 97 682 84Q698 68 722 68H730H738Q762 68 799 91L803 80L806 70Q795 59 770 40T703 -3T631 -26Q598 -26 578 -8Q548 24 536 92Q524 154 509 183T477 218T428 224Q409 224 385 220T346 212L331 207Q330 205 330 201T331 189T332 178Q332 158 325 116L305 96Q269 60 240 38Q171 -21 123 -21Q72 -21 33 18L20 32L62 74Q96 107 102 112T116 118Q120 118 122 113T131 95T150 69Q171 48 190 48Q198 48 206 51T224 69T234 109ZM519 367Q497 432 450 432Q379 432 313 333L300 314L304 299Q306 294 309 280T315 260L321 235L542 313Q530 325 519 367",120183:"277 226Q277 248 253 286T203 369T178 449Q178 490 212 533T284 607Q380 683 532 683Q610 683 639 660T668 583Q668 568 666 546T663 509Q663 478 683 460Q691 452 719 452L738 450Q732 437 729 437Q728 437 652 416T573 394Q554 394 541 409T527 444Q527 449 532 487T538 542Q536 584 501 606T418 628Q389 628 364 620T317 587T295 523Q295 478 333 401T372 276Q372 269 371 267Q371 264 318 206L264 149Q284 141 317 130T433 101T577 82Q619 82 652 95T701 127T728 164T742 196L744 209Q744 210 749 208T759 203T764 199T760 185T751 154T744 129Q714 42 680 13Q628 -28 566 -28Q490 -28 403 -5T249 42T153 66T106 53T70 15T47 -16Q46 -17 30 -5L39 13Q85 100 138 148L147 156L161 157Q218 165 246 179T277 226",120184:"134 338Q134 357 81 417T27 504Q27 516 34 530Q55 568 110 615Q190 683 305 683H314Q445 683 495 580L501 569L512 577Q608 646 681 646Q759 646 801 585L808 576L816 583Q860 619 921 650T1041 682Q1063 682 1077 675T1096 660T1112 631T1132 596Q1160 555 1188 555Q1204 555 1228 564Q1230 565 1231 562Q1231 560 1232 554V547L1215 538Q1179 521 1114 475Q1112 474 1106 470T1099 464T1093 459T1088 452T1085 441T1082 425T1081 404T1079 376T1079 339Q1079 282 1084 236T1098 160T1117 112T1138 85T1159 77Q1166 77 1180 81T1207 90L1219 94Q1220 94 1221 86T1222 76L1045 -32Q1044 -32 1004 15L964 64V167Q965 334 970 372V378L994 402Q1032 440 1057 460Q1061 463 1066 467Q1070 469 1070 470T1068 471T1060 474T1050 481Q1040 488 1021 531T996 583Q979 609 947 609Q922 609 887 592T820 537L821 524Q825 484 825 448Q825 268 768 155L759 137L589 -28L579 -20Q533 17 507 17Q475 17 449 -7L436 -18L424 2L441 20Q446 25 456 36T471 52T484 65T497 79T509 90T522 99T534 106T548 112T561 115T576 117Q602 117 639 86Q648 81 648 81Q650 82 657 94T668 112Q711 202 711 373Q711 484 677 533T600 583Q592 583 583 581T569 577T554 568T542 560T528 549T516 539L519 523Q527 485 527 461Q527 444 522 407Q506 266 447 150L437 130L217 -25L208 -15Q165 28 126 28Q89 28 62 1Q47 -14 43 -14Q42 -14 36 -8L28 0L44 17Q96 73 120 92T166 117Q182 123 204 123Q239 123 284 78L295 67Q307 72 337 102Q400 178 400 346Q400 508 325 571Q270 618 208 618Q180 618 168 614T140 594Q124 578 124 564Q124 540 182 480T240 396Q240 359 197 321Q154 285 94 252L80 245L76 248L67 257L61 262L71 268Q82 275 94 284T120 309T134 338",120185:"522 492Q521 492 517 502T512 513Q542 444 542 333Q542 226 503 137L498 125L396 53Q308 -8 292 -17T260 -27Q226 -27 191 -9T136 29L145 39Q162 56 192 89L230 129L235 128H241Q276 57 332 57Q358 57 391 80Q403 89 409 100T422 143T428 227Q428 329 406 408T347 530T272 594T196 615Q152 615 135 596T118 558Q118 535 146 502T203 438T232 385Q232 357 195 322T122 265T83 243Q82 242 72 249T61 258L66 262Q72 265 82 273T103 292Q125 314 125 333Q125 351 101 376T51 432T26 492Q26 549 108 614T290 679Q326 679 335 678Q353 675 370 670T400 658T425 642T445 625T463 606T477 588T487 571T495 556T500 543L504 535L523 553Q553 581 569 595T619 632T686 667T757 678Q778 678 793 675T819 664T833 651T844 633T852 617Q884 548 910 548H916Q938 548 962 556L967 542Q967 540 947 531Q909 509 883 492T847 467T838 458Q825 419 825 328Q825 234 833 191T858 121Q875 94 892 77Q898 71 907 71Q912 71 928 76T957 87T971 91L972 88Q972 84 972 81L973 73L957 63Q891 21 806 -23L794 -30L783 -14Q766 13 728 60L713 79V372L724 384Q743 406 765 427T800 460L813 471Q809 472 806 472Q783 479 766 503T741 551T715 594T672 614Q644 614 622 595Q597 576 572 550T534 508L522 492",120186:"254 595Q269 583 269 581L262 577Q256 573 247 566T228 549T212 527T205 502Q205 480 266 386T328 277Q328 234 239 150L221 134L231 133Q264 131 376 99T516 62Q567 50 604 50Q614 50 626 52Q643 57 662 71T703 115T739 198T753 323Q753 454 692 517Q652 555 584 565T382 577Q365 577 357 577H308L300 591L292 606Q292 608 342 665L392 724L403 725Q406 725 411 726H416L417 725L412 715Q408 705 408 698Q408 684 423 679Q431 677 516 672T663 655Q757 634 806 593T873 463Q881 421 881 380Q881 340 874 306Q859 223 809 147Q801 134 789 124Q595 -30 456 -30Q395 -30 289 3T147 36Q134 36 121 33T98 26T76 15T59 4T44 -8T32 -17L22 -7L12 4L56 59L100 114L116 118Q217 142 217 199Q217 230 185 276T120 365T87 430Q87 435 109 464T172 534T254 595",120187:"247 398Q247 372 206 334T126 272T83 247Q82 247 72 253T61 261Q60 261 61 262T66 265Q127 306 127 343Q127 364 63 430Q42 451 38 458T33 480V490V497Q33 526 63 567Q112 632 170 660T282 688Q341 688 384 667Q454 633 482 566Q483 565 484 566T496 574Q562 623 630 653Q699 681 751 681Q778 681 797 673Q818 662 830 609Q835 580 843 564Q863 524 895 524H901Q917 524 932 528Q936 522 938 518T942 513T942 511Q873 480 836 454Q789 423 789 395Q789 362 834 298T880 200Q880 170 867 145T820 81Q733 -20 647 -20Q581 -20 499 21V9Q499 -16 502 -53T509 -116L512 -141L370 -223L357 -216Q344 -209 344 -208L348 -196Q370 -113 370 33V52L355 58Q307 76 284 76Q258 76 228 60T183 29T141 -11Q137 -7 133 -2L126 7L134 18Q181 89 210 121T278 170Q304 179 328 179Q336 179 358 177L370 175Q368 268 367 359Q367 416 363 434Q362 438 362 441Q348 527 302 574T203 621Q169 621 148 599T127 557Q127 535 187 476T247 398ZM673 315Q673 357 786 442Q786 443 776 444T750 449T727 462Q719 471 716 484V496Q715 507 715 515Q715 571 698 588Q680 611 643 611Q592 611 547 571Q534 558 511 522L499 505V139L543 123Q702 64 744 64Q770 64 781 79T793 112Q793 143 733 217T673 315",120188:"254 595Q269 583 269 581L262 577Q256 573 247 566T228 549T212 527T205 502Q205 480 266 386T328 277Q328 234 239 150L221 134L231 133Q264 131 376 99T516 62Q567 50 604 50Q614 50 626 52Q643 57 662 71T703 115T739 198T753 323Q753 454 692 517Q652 555 584 565T382 577Q365 577 357 577H308L300 591L292 606Q292 608 342 665L392 724L403 725Q406 725 411 726H416L417 725L412 715Q408 705 408 698Q408 684 423 679Q431 677 516 672T663 655Q757 634 806 593T873 463Q881 421 881 380Q881 340 874 306Q864 250 838 196T791 126Q748 93 733 82L715 69Q714 68 723 60T748 40T774 23Q806 2 832 2Q849 2 870 6T904 14L917 17Q917 12 918 6V-3L882 -22Q806 -60 778 -73L755 -83Q640 -36 596 -7L586 0L576 -4Q513 -30 457 -30Q394 -30 289 2T149 35Q119 35 93 22T52 -4T36 -17T24 -7T12 4L56 59L100 114L116 118Q217 142 217 199Q217 230 185 276T120 365T87 430Q87 435 109 464T172 534T254 595",120189:"31 498Q34 541 76 586T176 659T279 688H290Q377 688 429 653T506 569L511 558L526 572Q620 663 707 682Q722 685 737 685Q781 685 804 665T830 619T838 565T854 525Q866 511 897 511Q917 511 925 513L937 515Q938 515 941 509T944 501T925 493T870 470T803 438Q735 406 735 401Q735 400 741 399T767 390T814 374L828 367L829 307Q829 233 833 202T852 144Q873 109 896 90Q906 82 928 82T976 95V92Q976 88 978 72L807 -28Q768 39 733 87L718 108V149Q718 230 714 257T693 298Q654 333 580 333Q524 333 520 329Q520 300 489 224T443 133Q441 131 333 53T223 -27Q221 -26 204 -11T169 16T136 28Q110 28 66 -8L56 -16Q52 -13 40 -1L48 7Q165 124 211 124Q232 124 287 77L298 67Q309 73 337 97Q397 150 397 347Q397 419 379 474T330 560T269 604T207 619Q177 619 152 601T126 563Q126 540 185 479T244 387Q240 336 160 289Q144 278 98 255L80 246L62 261L79 272Q96 283 113 301T130 337Q130 353 115 373T81 410T47 451T31 498ZM524 358Q537 358 657 405T777 457Q777 459 768 459Q749 462 738 474T723 499T714 539Q706 585 697 599Q681 618 657 618Q632 618 597 595T532 515L525 502L524 441Q524 375 523 369Q523 358 524 358",120190:"457 -31Q356 -31 272 6T135 120T82 304Q82 372 106 430T170 527T241 588T305 626Q341 643 386 657T460 678T495 685T554 660T674 609T778 584Q800 584 818 591T848 610T866 633T878 651T883 659L893 649L901 639Q879 574 803 532T666 490Q661 490 657 490T650 491T641 492T633 495T622 500T610 505T595 513T577 522T554 533T527 547Q436 594 415 602Q393 608 374 608Q303 608 253 545T202 386Q202 229 307 135T568 41Q674 41 748 85T822 198Q822 244 779 283T639 322Q595 322 499 303T383 283Q358 283 335 290T291 318T270 374Q270 418 313 460T424 510H431L435 505L440 500Q425 496 403 475T380 427Q380 382 431 373Q437 372 475 372Q543 372 626 388T742 404Q831 404 868 362T905 260Q905 182 831 108Q692 -31 457 -31",120191:"666 641Q737 641 794 686L802 662Q790 648 734 596L677 541L664 538Q630 528 583 528Q540 528 482 537L461 541Q402 512 402 456Q402 427 439 387T512 311T549 253Q549 220 455 139L440 126Q541 75 586 75Q600 75 619 80T654 94T685 110T709 124T719 130Q722 125 725 119L730 108Q700 72 568 -18Q551 -30 542 -30Q495 -30 404 6T270 42H263Q213 42 142 -11L131 -19L129 -8Q126 1 126 4Q218 84 301 126L316 134H406L413 142Q436 165 436 189Q436 202 421 221T364 281Q336 307 318 328T296 356T283 381L290 394Q338 478 410 540Q419 549 417 549Q415 550 369 558T268 575T195 584Q153 584 127 567T100 523Q100 499 116 479T151 447T170 433Q170 429 171 428Q171 427 131 394T88 359Q82 363 73 370T47 403T31 457Q31 513 79 565T197 648T332 679Q369 679 490 660T666 641",120192:"273 244Q273 281 244 331T186 428T155 502Q155 524 165 536Q239 634 333 688Q338 684 345 680L356 672L344 664Q310 642 295 624T280 582Q280 550 303 505T348 407T371 300Q371 270 362 248L247 123L358 92Q452 64 484 64Q507 64 523 72Q553 87 573 109Q583 121 586 146T593 283Q594 303 594 344Q594 401 591 461T584 558L581 595Q598 600 623 611T672 634T719 659T754 678L768 686Q770 686 784 673L782 670Q781 668 777 664T768 655Q747 635 738 616T721 535T714 359Q714 205 723 176Q727 164 744 133T771 89Q780 75 804 75Q814 75 853 87L867 92L871 73L671 -39L654 -10Q636 20 619 50T600 83Q600 84 589 75T539 34Q478 -16 475 -19Q469 -22 449 -28T414 -34Q410 -34 394 -32Q356 -28 282 -2L237 15Q169 38 126 38Q106 38 85 27T51 4T37 -8T27 -1T18 8Q18 10 70 63T124 116Q154 123 176 131T223 154T260 191T273 244",120193:"133 343Q133 360 79 416T25 496Q25 523 58 563T118 624Q197 685 293 685Q331 685 339 684Q453 665 489 558L493 546Q521 570 553 596T640 653T725 684Q753 684 783 672T844 641T889 618Q895 616 912 616Q924 616 936 617T956 620T965 622T966 612V604L952 595Q924 576 895 549Q864 517 856 496T847 448V434Q847 395 848 388L859 323Q874 241 874 212Q874 142 830 96Q796 62 724 14Q661 -29 603 -29Q555 -29 421 28T242 86Q182 86 110 31Q105 28 102 26T99 25Q88 36 88 42Q95 54 222 142Q252 163 262 165Q319 183 344 218Q378 266 378 377Q378 444 362 494T319 571T266 610T212 623Q181 623 156 603T131 562Q131 539 154 512T206 458T243 416Q246 409 246 399Q246 387 242 377T225 351T178 311T94 259L79 251Q72 256 68 261T62 268L61 270L70 277Q131 318 133 343ZM822 526Q778 531 719 564T628 597Q611 597 579 574Q543 543 513 506L505 495L506 473Q506 469 506 461T507 449Q507 348 467 271L462 261L404 218L348 174Q349 173 356 173Q384 169 450 144L546 105Q665 56 708 56Q737 56 746 72T756 118Q756 129 755 135L741 219Q725 314 725 334V344Q725 416 736 431Q748 450 815 510L832 526H822",120194:"133 317T133 338T80 413T26 496Q26 532 83 591Q100 608 111 616T151 644T219 672T304 682Q381 682 434 646T506 564L510 557Q513 557 534 573L677 665L707 683L790 561L803 572Q933 682 1001 682Q1037 682 1098 650T1193 616Q1208 616 1222 619L1235 622Q1239 622 1239 616Q1239 611 1240 609Q1240 608 1206 577T1138 503T1104 430Q1104 409 1123 330T1142 208Q1142 183 1136 147Q1127 118 1117 106Q1114 103 1031 48T935 -14Q930 -18 908 -22T862 -27Q826 -27 759 -6T647 26Q597 38 578 38Q573 38 561 33T533 20T505 4T480 -10L469 -16L452 -26L439 -28Q423 -30 411 -30Q358 -30 279 7T169 45Q125 45 58 -5L47 -14L41 -4L35 8Q35 11 56 29T113 75T181 125L200 139H217Q279 143 320 180T377 270T394 393Q394 453 378 498T334 568T277 605T213 617Q177 617 155 607Q140 600 130 587T119 560Q119 545 137 522T177 479T217 434T236 393Q236 324 98 251L89 246L76 253L63 261Q91 275 112 296ZM1088 526Q1066 526 1004 556T909 586Q863 586 816 539L802 526L804 514Q814 461 814 411Q814 319 781 238Q772 214 760 198T730 165T702 136L715 133Q759 122 848 90T973 57Q1003 57 1017 80Q1022 93 1022 116Q1022 152 1003 241T983 377V391Q983 405 985 409T1002 429Q1019 450 1045 475T1090 514L1107 528Q1104 527 1102 527T1096 527T1088 526ZM699 358Q699 391 696 419T688 467T675 503T660 530T642 550T626 563T608 574T593 582Q581 575 559 554T524 512Q523 510 523 477Q523 315 444 218L435 207L368 169Q301 132 301 131Q307 128 315 125L377 99Q476 57 515 57Q534 57 608 94L627 102L636 111Q699 187 699 358",120195:"273 679Q354 674 408 633T477 525L484 533Q496 548 524 574T571 615Q594 633 625 649T675 673T699 681Q724 632 747 607Q754 601 756 599T765 594T777 591T794 590Q818 590 834 594V585L835 577L704 513L693 518Q657 534 631 560T597 599Q596 601 581 584Q495 490 489 379V366H562L681 369Q682 369 679 366T668 355T651 341L620 314H485V295Q490 190 543 125T686 60Q720 60 789 88L801 93V89Q798 83 798 66Q781 59 685 -10L665 -25L634 -30Q596 -35 594 -35Q570 -35 536 -23T477 19Q461 37 445 67T418 118L409 138Q401 131 388 120T340 79T273 28T206 -12T151 -31Q129 -31 90 -12T32 22L113 101Q114 101 120 96T136 84T160 69T189 56T221 51Q256 51 305 90Q376 149 376 301V315H293Q276 315 251 315T210 314T190 313L168 312Q168 313 200 340L231 368L238 367Q275 367 311 366H378V387Q376 470 355 512T291 572Q274 579 252 579Q223 579 197 568T156 544T131 519T117 508Q112 512 108 518L99 527L117 545Q177 604 255 665L273 679",120196:"34 496Q34 518 53 549T107 610T195 661T310 682Q357 682 398 663T460 611Q467 600 475 583T489 554T495 542Q495 544 531 570T617 629T700 676L724 688Q742 670 756 657T784 635T806 621T830 606T856 592Q878 416 878 340Q878 154 805 -3L798 -20L779 -40Q706 -113 613 -163T421 -214Q359 -214 317 -196T256 -160L306 -63L313 -64L320 -66L326 -79Q337 -104 349 -120T392 -151T470 -166Q576 -166 644 -101Q750 7 750 292Q750 426 721 495T617 565H611Q563 565 513 509L506 501L508 493Q508 490 509 475T510 445Q510 319 458 236L451 225L436 216Q406 198 365 169T318 134L332 127Q336 126 397 103T489 80H493Q527 80 593 129L604 137L607 127Q610 119 610 116Q610 114 592 95T543 46T484 -4Q450 -27 446 -27Q441 -27 402 -18Q365 -9 290 20T188 50Q135 50 64 -7L52 -17L43 -7L34 2L51 19Q118 87 177 132L192 143H215Q259 145 289 155T335 184T355 214T366 245Q382 306 382 388Q382 426 381 436Q368 520 318 570T214 621Q184 621 165 608T142 583T137 562Q137 541 163 508L201 469Q245 425 251 408Q253 403 253 398Q253 383 240 366T212 335T161 295Q128 271 99 253L89 247L77 256L65 266L76 273Q125 301 134 329Q136 334 136 342Q136 357 124 372T88 410T49 455Q34 479 34 496",120197:"278 601Q242 601 212 591T167 570T121 533Q114 528 111 525L93 550Q223 661 244 667Q299 677 356 677Q415 677 456 666T515 634T541 596T549 555Q549 513 529 478T480 421T424 388T377 372Q365 370 365 367Q365 365 389 365T450 358T523 337T588 282T623 183Q624 177 624 161Q624 20 524 -60Q415 -148 285 -148Q242 -148 213 -139Q181 -131 159 -109Q136 -87 127 -56T114 6T104 49Q94 69 57 69Q38 69 13 58L1 53Q1 55 0 59T-3 68T-4 76Q78 130 138 142Q150 144 162 144Q213 144 227 120T242 31Q242 -30 263 -66T345 -102Q397 -102 444 -52T491 107Q491 172 471 211T428 265Q392 288 306 288Q269 288 233 284L218 282Q208 289 208 291L229 324L251 359Q250 360 248 360Q239 360 248 371L256 381H273Q344 385 378 409T413 495Q413 537 384 569T278 601",120198:"80 129V151Q80 241 99 363Q99 367 111 372T172 401T285 465L297 472Q340 455 405 443L423 440L455 453Q486 467 489 467L497 461L494 451Q480 390 480 292V283Q480 207 483 155L484 143L535 80L558 90L582 99Q586 95 586 83Q586 81 513 25L443 -29Q410 16 386 40L371 55V61Q371 63 371 67T370 74V80L278 25Q186 -29 184 -31Q182 -32 160 -12T112 35T80 75V129ZM359 366Q334 366 300 371T243 382L221 388Q218 388 212 375T200 323T194 228Q194 191 197 152L198 139L217 120Q245 92 269 74L279 66L304 78Q338 95 349 100L369 110V152Q368 164 368 210T367 275Q367 358 366 361V366H359",120199:"99 398Q99 610 86 662Q86 665 95 669T106 674L108 669Q109 664 112 654T119 635Q122 626 125 616T130 601L131 596Q214 649 273 678Q295 690 298 690Q299 690 304 688T313 682L317 679Q275 653 240 612Q210 569 210 469V459Q210 450 210 432T211 406L212 378L285 425Q301 435 321 447T350 466L360 472Q360 473 361 473T368 471T401 456T465 429L501 414V408Q504 386 504 309Q504 255 500 203T491 125T485 97Q485 95 445 74T343 23T237 -24L214 -32Q197 -22 165 3T109 49T87 73Q99 169 99 398ZM386 251Q386 320 380 347V350L305 374L282 382L214 348L213 274Q213 184 214 165V131L230 119Q288 76 349 54Q386 137 386 251",120200:"227 393Q215 393 210 351T205 269Q205 161 213 153Q220 145 244 125T290 88L312 72L365 92Q414 113 418 113V93L365 60Q255 -9 221 -26L211 -18Q158 21 91 88L90 107Q87 167 87 225Q87 267 90 302T96 351T100 366L295 473L311 470Q340 464 368 454T410 437T424 429L347 334L342 333H337L325 342Q299 363 271 378T228 393H227",120201:"88 117Q88 177 91 231T97 310T102 341Q102 343 118 357T168 397T239 447L257 459L268 454L278 449Q242 416 238 412L219 394Q219 391 216 378T211 349T206 307T203 249Q203 211 206 166L208 148Q224 132 261 108T333 70Q341 66 342 67T350 79Q393 157 393 302Q393 368 388 406V411L371 424Q199 558 101 558Q69 558 28 545L18 542L8 549L-1 557L24 569Q61 587 147 621L177 632Q179 631 194 627T216 621T240 613T269 602T302 589T340 571T382 549T431 522T484 488Q504 475 504 472Q511 449 511 365Q511 248 474 129L468 108L451 96Q427 77 347 28T254 -28Q235 -20 174 21T89 86L88 117",120202:"309 69Q391 98 416 108Q418 106 422 100T425 92Q419 86 326 30T229 -27Q228 -27 207 -13T154 27T97 76L85 87L84 106Q81 152 81 194Q81 295 93 359L95 369L286 471L313 449Q376 397 414 372L428 362Q428 360 375 318L188 181V170Q188 156 189 153V148L203 138Q228 119 266 94T309 69ZM209 389Q208 388 204 366T194 307T187 244Q187 225 188 225T201 233L245 261Q283 284 291 291Q324 313 324 316L296 334Q280 343 259 357T224 380L210 390Q209 390 209 389",120203:"128 400Q127 401 121 422T108 478T99 540V555L111 569Q135 597 165 626T214 671T235 687L249 678Q263 668 282 659T315 650Q335 650 362 666L372 654L286 569H271Q205 576 173 586V583Q173 558 208 492T252 401Q253 399 310 399T367 398L332 355H254V311Q251 160 235 16Q230 -28 226 -36Q225 -38 221 -45Q171 -140 121 -211L113 -222H104Q94 -222 94 -220Q94 -215 105 -187L121 -145Q139 -80 139 35V93Q139 222 135 314L134 354Q134 355 84 355H35L84 399H106Q128 399 128 400",120204:"92 71Q92 74 91 88T88 128T86 183Q86 230 91 275T102 342T109 366Q115 372 207 422T305 472Q407 426 431 426Q435 426 476 445L519 465L525 463L532 461Q497 392 497 268Q496 255 496 233Q496 179 516 92T539 -10L541 -22L526 -38Q441 -126 355 -194L339 -206L327 -207Q324 -207 319 -207T310 -208Q242 -208 171 -179T73 -131L56 -141Q40 -150 38 -150Q17 -140 17 -137Q17 -136 18 -136T98 -79L176 -23Q174 -21 134 24T92 71ZM226 393Q224 393 221 372T214 312T210 235Q210 182 214 144L215 132L230 118Q281 70 301 66Q304 66 331 80T373 105L384 112L383 165Q383 224 387 309Q387 314 387 319T387 329T388 336T388 341V343Q388 344 381 344T339 354T249 384Q246 385 243 386T236 389T231 391T228 392L226 393ZM414 -80Q414 -64 411 -43T403 -1T394 37T386 66T382 79Q381 79 286 15T189 -52Q312 -125 365 -125Q397 -125 405 -115T414 -80",120205:"95 661Q95 662 103 667T113 672L126 634L137 596L147 602Q235 656 275 677L292 687L303 680Q305 679 307 677T312 674L313 672L310 670Q307 669 301 667T289 660T274 649T259 634Q250 622 244 611T233 585T226 560T222 528T221 497T220 456T219 413V377L232 384Q244 391 271 409T339 455L362 471L383 461Q425 440 491 415L504 410V406Q507 399 507 269Q507 76 486 -21Q485 -30 483 -33T461 -57Q382 -139 299 -207L281 -197L263 -186L266 -185Q268 -184 280 -177T312 -155Q344 -130 353 -116Q394 -59 394 117Q394 162 391 216T386 301T382 335Q382 338 365 346T323 364T281 376L250 362Q220 347 219 347Q213 336 213 232Q213 177 217 144L218 128L224 119Q244 92 263 71L272 60Q206 21 157 -24Q156 -24 151 -16T132 11T98 52L89 62L91 103Q104 289 104 436Q104 471 103 506T101 568T99 616T96 649L95 661",120206:"73 613L164 686L184 666Q200 650 214 637T235 620T242 614T203 577T162 540Q158 540 122 570T73 613ZM92 58Q92 63 94 83T98 142T101 234Q101 318 97 358V366L59 387L40 379L21 371Q20 371 12 376T3 382L38 406Q78 431 125 466L138 477Q149 468 186 444L219 422V389Q215 324 215 247Q215 136 222 123Q226 113 238 98T258 83Q263 83 292 94L322 104Q322 103 324 97T327 89Q327 88 317 82T272 52T190 -7Q166 -25 164 -25L112 35Q92 55 92 58",120207:"74 611L155 682Q172 666 186 655T208 636L235 614Q227 606 191 574L154 540L135 556Q101 582 84 601L74 611ZM10 377L144 477Q145 476 184 453T229 428L233 425V416Q238 346 238 252Q238 93 215 -16L213 -30L185 -57Q29 -203 19 -203Q17 -203 -19 -189L-9 -183Q52 -146 78 -116T114 -37Q120 31 120 192V237Q120 327 113 351T72 380L53 372Q34 362 32 364L10 377",120208:"106 72Q110 105 111 193T114 294V308H74L34 309L83 346H115V430Q114 591 106 652Q105 662 107 665T114 668T123 672Q125 672 139 635L152 597L154 598Q156 600 160 602T167 607Q193 625 226 644T279 672T302 682L312 676L321 670L312 665Q281 649 263 626T241 587T233 547Q232 541 231 530T230 510T230 501Q231 501 265 522T334 564T369 583L380 570Q428 509 428 481Q428 475 427 470T423 459T416 448T404 434T389 418T369 397T344 371L321 347L365 346H409L372 308H227V294Q227 272 230 208T234 138Q234 136 256 119T302 84L324 68L372 88Q421 108 422 108T432 90L421 83Q373 53 270 -5L234 -25L204 -1Q172 25 124 60L106 72ZM336 434Q336 452 327 472T308 503T297 514Q296 514 290 510T275 499T264 490Q230 458 230 358V346H247Q268 346 276 350T302 372Q328 398 335 423Q335 424 335 428T336 434",120209:"111 275Q111 406 108 518T104 650V657Q105 657 109 660T117 665T122 666L133 629L144 594L161 606Q218 642 272 670L294 681Q295 681 300 677T306 672L302 669Q298 666 292 662T278 651T263 637T251 621Q232 587 227 530T222 343Q222 226 230 125L231 112L244 98L258 83Q271 87 285 92L312 102V84Q297 72 231 24T163 -23L100 55Q110 141 111 275",120210:"115 203Q115 257 114 291T112 338T111 355Q111 357 93 370L75 384L54 375Q32 366 31 365Q27 365 16 378Q25 383 89 430L152 476Q175 453 228 420Q229 420 229 418T229 410T227 394L225 369Q279 400 315 425T363 461T376 471Q480 424 514 416V412Q514 411 514 404T513 392L511 376L520 382Q529 387 548 399T584 422Q599 432 618 444T648 463L657 469H658Q661 469 681 461T735 440T796 420Q803 418 803 416Q801 414 798 390T791 325T788 247Q788 220 790 172T794 123Q799 115 814 97T835 78H838Q841 78 867 89L895 101Q896 101 896 100T897 92T900 78L873 62Q810 23 761 -12L736 -30Q735 -30 729 -22T707 7T671 48L661 59Q674 93 674 207V219Q674 341 670 344Q655 353 591 372L576 376L544 364Q511 351 510 351Q507 349 507 224V132L535 95Q541 87 548 78T560 63L563 58Q563 57 504 15T444 -28L385 53L387 67Q396 114 396 206Q396 289 393 334Q393 346 390 348Q369 358 306 373Q301 373 265 361L228 349V335Q227 322 227 284Q227 206 231 157Q231 151 231 144T232 133V129Q232 125 259 90Q286 56 286 53Q287 53 284 51T273 43T258 31L173 -31L166 -20Q160 -11 145 7T119 38T108 59Q108 62 110 81T113 133T115 203",120211:"608 88Q572 65 535 37T477 -8T455 -25Q432 7 389 53L375 68L378 82Q386 160 386 195V221Q386 284 385 307L384 344Q352 359 306 373L286 379L213 353V273Q214 229 214 161V129L275 62L163 -28L150 -14Q136 0 121 16T91 44Q86 48 86 50Q95 83 96 148Q96 224 89 340L88 366L79 374Q69 384 67 385L64 388L55 383Q52 382 44 378T33 373L21 367L13 374Q5 379 5 381Q5 384 69 428L133 473Q135 473 147 464T179 443T215 424L214 400V376Q271 404 342 457L363 472Q363 473 364 473Q366 473 375 469T418 449T502 414L512 411V407Q502 330 502 217V197V132L523 109Q527 104 533 97T543 87T547 83L550 80L578 92Q603 103 604 103Q606 103 608 88",120212:"107 102Q107 178 112 242T123 334T129 362Q129 363 140 368T199 400T315 469L336 482L346 476Q409 439 498 414L514 410L515 389Q515 208 502 141Q494 101 491 94Q490 89 478 81Q430 51 375 23T288 -20T254 -34Q250 -34 200 -1T119 56L108 65L107 76V102ZM389 355Q367 358 346 363T309 372T282 381T264 388L257 390H256Q254 390 249 381T238 348T227 293Q226 280 226 237Q226 183 231 146L232 131L244 122Q285 91 323 74T374 57H377L380 68Q405 154 405 267Q405 315 401 349V354L389 355",120213:"66 435Q66 445 117 501T173 557Q174 557 183 555T193 551Q174 526 174 509Q174 496 190 472T233 428V386L377 482L399 471Q450 445 509 425Q519 421 519 420L518 419Q518 418 518 416T517 410Q517 405 518 381T519 335Q519 222 501 137Q492 84 489 84L473 75Q457 66 423 44T354 -6L338 -19L329 -13Q320 -8 313 -4T297 4T284 10T270 14T258 17T245 20T233 22V12L241 -161L214 -172Q187 -184 160 -195T131 -207Q127 -207 112 -202L113 -188Q113 -182 115 -77T118 31Q118 32 109 32Q63 27 23 0L10 -9Q5 -4 -1 8Q1 13 52 57T114 101H115L117 123Q117 141 117 230V359L110 367Q85 394 71 421Q66 433 66 435ZM384 83Q386 83 389 110T396 180T400 254Q400 294 395 339L394 349L379 355Q308 383 294 383Q290 383 263 372L234 360L233 245V130Q270 125 305 113T361 92T384 83",120214:"362 -196Q375 -92 375 47V78L282 24Q189 -29 188 -30Q187 -30 139 21T90 75Q87 84 87 158Q88 206 94 259T107 342L113 372L308 478L322 473Q374 452 421 444L433 442L503 485Q515 479 515 477Q485 378 485 56Q485 -100 494 -164V-171L381 -211L371 -207L362 -202V-196ZM280 72Q301 77 323 86T358 101T372 110Q372 268 377 346L378 358H374Q368 360 358 360T323 365T257 380L234 386Q231 386 229 379Q215 353 211 310T207 180Q207 152 208 150Q210 142 235 114T280 72",120215:"23 367Q21 370 18 374T14 380L13 382L151 472L236 411L238 381L290 426Q298 432 307 439T322 452T333 461T342 467L344 469Q382 410 404 399Q410 397 416 397Q423 397 432 399T446 403L451 405Q453 405 453 399V393Q430 374 404 356T364 328T350 318L349 317Q321 320 276 356Q257 371 256 371Q253 374 249 366T242 351Q232 321 232 236Q232 214 232 205T232 182T233 162T235 148T238 137T242 129T249 120T257 114T268 105T281 95Q313 70 314 70L358 85Q377 92 389 96T402 100V90L403 80L229 -26L221 -18Q195 6 166 29T121 63T105 76T106 82T110 97T114 121T117 158T119 208Q119 269 114 329L113 341L103 350Q90 362 67 380L45 374L23 367",120216:"189 331Q190 304 196 282T207 252T214 244Q239 244 348 292L371 302L382 297Q398 290 415 279T433 265Q442 238 442 166Q442 103 423 45Q416 42 380 29T310 3T244 -26L227 -34Q139 40 73 40Q61 40 48 37T24 30T6 22T-8 14L-13 11Q-14 11 -18 18T-23 26T38 75T102 125Q107 128 146 131H153Q192 131 296 56Q318 40 318 43Q323 48 323 114Q323 157 321 177L319 194Q308 208 291 216T261 225Q239 225 160 185L123 167Q85 205 79 227Q78 230 78 304V377L171 428Q264 479 265 478Q268 478 287 465T334 440T384 427Q423 427 475 463L478 453Q481 446 481 442Q481 439 410 391L339 342H331Q309 345 277 361T222 391T198 406T195 399T191 372T189 331",120217:"328 69Q401 102 403 102Q404 102 405 94T406 84Q406 83 318 28L230 -27Q223 -21 206 -5T171 25T132 54L124 60V71Q129 154 129 297V359H43L44 363Q44 365 44 367L45 369L48 372Q51 374 57 378T68 387L90 405H129V553L285 648Q304 641 306 640L260 598V592Q259 589 255 505T249 413V405H353V402Q353 399 328 379L303 360H245V319Q245 150 253 125Q257 115 276 101T311 78T328 69",120218:"444 -31Q444 -29 384 66Q382 66 364 58T309 30T231 -17Q214 -29 212 -29L197 -20Q172 -4 140 11T88 34L68 42Q68 43 73 49T85 67T100 98T113 149T118 221Q118 272 105 332L100 356L58 383L23 365L9 379L76 425Q141 472 144 472Q144 471 183 443L221 414V404Q224 365 224 275V253Q224 159 196 113Q191 104 193 104Q203 104 285 72L308 62L374 89L375 106Q375 266 373 340Q373 364 371 396V424L430 445L491 467Q493 467 499 463T505 457Q505 456 503 442Q488 335 488 187V158L529 81L534 80Q541 80 568 90L598 101Q605 94 602 87L524 27Q445 -32 444 -31",120219:"95 67Q104 80 104 193Q104 261 100 321L98 355L91 363Q56 402 56 421Q56 441 82 472T132 524T159 546Q174 542 175 542Q159 520 159 501Q159 481 205 432L221 415L220 401Q219 394 219 387L288 429Q309 441 325 451T347 465T358 472T365 476L504 415V409Q504 408 505 374T507 318Q507 155 474 91L469 80L343 26Q314 14 281 0T232 -20L216 -27L202 -15Q192 -5 152 28Q141 35 126 45T103 60T95 67ZM386 349Q302 389 287 389Q271 383 253 375L220 361V136Q226 120 256 100T312 68T342 56Q355 56 360 68Q389 134 389 258Q389 310 386 341V349",120220:"90 58T90 59T92 64T97 78T102 105T107 150T109 218Q109 290 103 350V356L83 377Q55 407 55 425Q55 445 138 528Q158 549 162 549L164 548Q165 548 167 548T170 547L175 546L172 540Q168 533 165 523T161 502Q161 479 216 430L229 419V382Q232 382 366 471Q407 445 500 408L511 404V387L512 370L595 420Q678 469 679 469L693 462Q756 431 795 417L815 409L814 380Q812 187 782 96Q774 71 766 62T744 48T684 25T577 -23L557 -32L546 -26Q536 -19 519 -10T481 10T436 31T393 47Q384 50 380 50Q380 52 381 58T384 77T387 104Q391 174 391 256V292L390 333L377 340Q350 357 304 373L294 376L227 355V348Q224 322 224 243Q228 117 232 112L235 108Q238 103 245 95T257 80L281 50Q281 49 227 10T172 -29L159 -13Q133 19 116 36T94 56ZM652 64Q658 64 667 84T685 162T697 303V336L686 341Q653 356 619 367L591 376Q590 376 553 361T514 344T512 324T510 275T508 221Q508 167 510 152T521 126Q537 112 590 88T652 64",120221:"8 -90Q8 -68 13 -63Q13 -56 53 -8T120 63L128 71L129 85Q133 120 134 182Q134 308 131 331T106 365Q100 367 97 369L75 381L35 365L20 377Q20 378 47 397T110 440T161 471L253 413V396Q253 378 254 378L309 422Q364 466 365 466Q365 467 366 466T370 461T376 454Q403 419 426 396L441 380L438 377Q438 376 433 372T420 359T404 344L372 314Q351 320 338 327T310 344T277 364Q261 364 252 316Q251 306 251 235Q251 136 255 129Q257 127 258 124T268 113T298 92Q334 68 335 68Q340 70 349 73T377 84T408 95T421 99Q422 99 422 90L423 82L334 26Q246 -28 243 -28L200 8Q156 43 148 43Q144 43 130 36T99 9T83 -36Q83 -67 121 -89T198 -118L237 -124V-129L238 -133L193 -160Q183 -166 171 -173T152 -184L146 -188Q140 -187 131 -185T98 -173T56 -154T23 -127T8 -90",120222:"280 53Q272 47 246 27T199 -10T176 -27L167 -18Q137 17 107 44L90 60L93 71Q108 130 109 290V331Q109 339 109 344T108 353T107 359T105 364T102 369T97 374T91 381Q60 412 60 432Q60 448 86 479T138 534L164 557Q168 553 180 553Q163 532 163 511Q165 491 186 468Q206 443 231 423V404L232 385L371 477L389 468Q439 441 498 418L512 412V386Q512 360 507 190T500 14Q488 -26 445 -67Q401 -111 355 -148T282 -203T249 -221Q247 -220 230 -210T213 -199T229 -191T269 -172T306 -151Q361 -120 379 14Q391 92 391 182Q391 218 386 305Q384 339 380 341Q363 353 330 366T288 379Q282 379 258 368L230 356V181V141Q230 127 232 120T236 108T251 89T275 59L280 53",120223:"153 371Q141 371 126 365T100 354T78 340L65 331L57 338L50 346L62 356Q133 419 222 471Q274 453 306 422T338 366Q338 356 329 346T283 301L243 264L262 257Q298 246 361 214Q378 154 378 73Q378 33 371 -9T356 -74T345 -104Q340 -106 267 -160L191 -214H177Q60 -214 13 -150Q-7 -122 -7 -115Q-7 -112 19 -77T106 25T241 149Q241 152 227 158T181 173T109 185V190L108 194L158 229Q212 267 223 278T234 306Q234 329 208 350T153 371ZM258 1Q258 42 257 68T254 105T252 118Q235 105 210 85T144 22T102 -45Q102 -79 146 -106T234 -133H238Q248 -128 254 -80Q258 -58 258 1",120224:"183 181Q183 179 152 91T118 0H28L154 346L280 693Q281 694 333 694H385L511 349Q636 4 638 2Q638 0 584 0H530L464 183H184L183 181ZM324 606Q319 578 292 492T238 332T210 256Q210 254 324 254T438 255L429 281L419 308Q409 336 395 378T365 465T339 551T324 611V606",120225:"425 363Q438 363 465 353T526 324T585 270T610 192Q610 132 561 78T426 7Q404 2 387 2T240 0H90V694H227Q373 693 396 689Q484 673 533 623T583 517Q583 494 574 473T551 437T520 409T487 388T456 374T433 366L425 363ZM490 516Q490 527 485 539T467 568T423 599T347 621Q340 622 262 623H188V399H261H286Q432 399 478 475Q490 496 490 516ZM514 190Q514 245 462 280T343 322Q336 323 259 323H188V71H274Q365 72 388 77Q445 88 479 121T514 190",120226:"59 347Q59 440 100 521T218 654T392 705Q473 705 550 680Q577 670 577 667Q576 666 572 642T564 595T559 571Q515 601 479 613T392 626Q300 626 232 549T164 347Q164 231 229 150T397 68Q453 68 489 80T568 120L581 129L582 110Q584 91 585 71T587 46Q580 40 566 31T502 5T396 -11Q296 -11 218 41T99 174T59 347",120227:"88 0V694H237H258H316Q383 694 425 686T511 648Q578 604 622 525T666 343Q666 190 564 86Q494 18 400 3Q387 1 237 0H88ZM565 341Q565 409 546 463T495 550T429 600T359 621Q348 623 267 623H189V71H267Q272 71 286 71T310 70Q461 70 527 184Q565 251 565 341",120228:"86 0V691H541V611H366L190 612V397H513V321H190V85H372L554 86V0H86",120229:"86 0V691H526V611H358L190 612V384H485V308H190V0H86",120230:"59 346Q59 499 157 601T384 704Q436 704 466 700T541 679Q551 674 560 670T575 664T583 660T588 658T590 656Q590 652 582 605T573 557L564 564Q489 626 392 626Q301 626 233 549T164 347T233 145T392 68Q441 68 506 84V223H388V299H599V38L588 33Q494 -11 393 -11Q296 -11 219 40T100 172T59 346",120231:"86 0V694H190V399H517V694H621V0H517V323H190V0H86",120232:"87 0V694H191V0H87",120233:"181 53Q200 53 215 56T241 66T259 79T272 95T280 109T285 122L287 129V694H388V415V229Q388 135 385 112T369 63Q364 51 355 39T328 12T280 -12T212 -22Q172 -22 130 -12T66 8T43 20L46 42Q50 65 54 88L58 110Q58 111 65 104Q107 53 181 53",120234:"88 0V694H188V519L189 343L525 694H638L375 419L651 0H541L309 351L188 225V0H88",120235:"87 0V694H191V79L297 80H451L499 81V0H87",120236:"92 0V694H228L233 680Q236 675 284 547T382 275T436 106Q446 149 497 292T594 558L640 680L645 694H782V0H689V305L688 606Q688 577 500 78L479 23H392L364 96Q364 97 342 156T296 280T246 418T203 544T186 609V588Q185 568 185 517T185 427T185 305V0H92",120237:"88 0V694H235L252 659Q261 639 364 428T526 84V694H619V0H472L455 35Q453 39 330 294T185 601L181 611V0H88",120238:"55 345Q55 504 149 609T361 715Q386 715 406 713Q521 696 600 592T680 344Q680 193 590 86T368 -22Q239 -22 147 84T55 345ZM276 59T368 59T518 146T576 360Q576 473 525 545T401 634Q371 637 362 637Q284 637 222 562T159 360T217 147",120239:"88 0V694H230Q347 693 370 692T410 686Q487 667 535 611T583 485Q583 409 527 348T379 276Q369 274 279 274H192V0H88ZM486 485Q486 523 471 551T432 593T391 612T357 621Q350 622 268 623H189V347H268Q350 348 357 349Q370 351 383 354T416 368T450 391T475 429T486 485",120240:"55 345Q55 504 149 609T361 715Q386 715 406 713Q521 696 600 592T680 344Q680 284 665 231T629 143T587 85T551 48L536 35L648 -120L652 -125H531L452 -8L440 -12Q407 -22 369 -22Q239 -22 147 85T55 345ZM579 345Q579 473 517 555T369 637Q279 637 218 554T156 345Q156 223 215 141T368 58Q376 58 382 58T392 58T397 59T401 60T403 61H404Q404 63 360 128T315 194H421L453 150Q485 105 486 105Q490 108 496 113T517 138T545 182T567 247T579 334V345",120241:"88 0V694H227H259H302Q365 694 399 689T474 663Q528 637 558 595T589 504Q589 482 584 462T569 426T547 396T522 372T495 353T470 338T449 328T434 322L429 320L440 300Q452 280 477 238T523 160L617 1L565 0Q513 0 512 1Q512 2 424 156L337 309H189V0H88ZM492 504Q492 600 367 620Q354 622 271 623H189V385H271Q363 386 388 392Q432 402 462 430T492 504",120242:"55 514Q55 589 115 652T283 716Q315 716 345 711T396 699T432 685T457 672T467 667Q467 666 459 618T449 568Q383 634 282 634Q214 634 182 600T150 525Q150 507 155 492T172 465T194 446T222 432T247 423T272 416T289 412Q353 396 378 384Q432 358 466 307T500 194Q500 110 438 44T272 -22Q215 -22 159 -5T73 28T44 50Q45 51 49 75T57 122T62 146L65 143Q68 140 74 136T88 125T107 111T131 98T160 85T194 74T232 66T274 63H286Q327 63 366 96T406 182Q406 245 352 280Q329 296 265 310T173 339Q124 363 90 409T55 514",120243:"36 608V688H644V608H518L392 609V0H288V609L162 608H36",120244:"87 450V694H191V449Q192 203 193 194Q200 148 220 117T266 72T311 54T347 49Q404 49 446 84T501 178Q505 195 505 218T507 449V694H600V450Q600 414 600 356Q599 198 595 181Q594 178 594 177Q575 89 505 34T345 -22Q258 -22 184 34T89 196Q88 205 87 450",120245:"14 692Q14 694 68 694H122L146 633Q325 165 339 90Q340 87 341 87Q341 124 530 619L558 694H605Q652 694 652 692Q650 690 523 354T390 10L387 0H279L276 10Q271 18 144 354T14 692",120246:"115 694Q115 693 156 550T233 266T270 90L271 85Q272 86 272 92Q272 153 405 616L427 694H524L553 590Q672 174 681 95L682 84L684 95Q689 138 728 287T803 563T841 692Q841 694 885 694T929 693Q929 691 829 346L730 0H679L628 1L606 75Q478 524 470 600L469 611L467 600Q458 518 338 101L310 0H213L114 346Q14 691 14 693Q14 694 64 694H115",120247:"14 0Q16 5 144 184T275 367L153 528Q121 571 88 615T42 674T28 694H150L228 584Q315 463 316 461L326 448L497 694H610L609 692Q606 689 492 528Q440 454 409 410T378 366Q378 365 515 182L652 0H531L326 292Q326 293 299 254T226 146L128 0H14",120248:"4 693L64 694H125L174 621Q335 378 340 364L341 362Q361 398 395 450L558 694H663L383 277V0H282V278L143 485Q112 531 75 586T21 668L4 693",120249:"69 617V694H555V643L373 362Q190 81 190 79H234Q244 79 272 79T344 80T419 81H560V0H55V53L237 334Q420 615 420 617Q413 618 387 618Q380 618 334 618T245 617H69",120250:"236 387Q209 387 184 382T141 370T111 355T91 342T83 337L82 355Q80 373 79 393T77 417Q77 419 81 421Q86 423 91 426Q155 460 227 460H238Q319 460 368 400Q393 371 400 341T408 252Q408 240 408 207T407 152V0H317V39L306 32Q244 -10 159 -10H152Q109 -10 77 22Q38 61 38 126Q38 142 39 146Q55 199 130 223T295 252H314V277Q314 305 313 310Q308 342 287 364T236 387ZM303 186Q124 180 124 126Q124 105 144 86T208 66Q284 66 309 124Q314 137 314 166V186H303",120251:"303 -11Q280 -11 259 -6T222 6T194 21T176 33T168 38V0H75V694H165V550L166 405Q247 455 336 455Q397 455 439 389T482 226Q482 115 428 52T303 -11ZM390 221Q390 283 361 331T265 379Q214 379 177 342L168 334V118Q203 66 258 66Q316 66 353 106T390 221",120252:"34 223Q34 327 99 393T245 460Q290 460 301 459Q328 455 354 445T395 427T410 415L396 338L386 344Q377 349 362 357T335 370Q305 381 258 381H252Q182 381 146 315Q126 275 126 224Q126 158 159 113T255 68Q329 68 394 106L408 114L410 93Q411 72 412 52L414 32Q407 27 394 20T338 2T252 -10Q156 -10 95 58T34 223",120253:"33 224Q33 321 81 388T197 455Q277 455 342 414L351 408V694H441V0H348V44L338 37Q278 -10 198 -10Q177 -10 168 -8Q99 11 62 90Q33 148 33 224ZM348 337Q307 378 263 378Q260 378 256 378T251 379Q239 379 223 374T182 355T142 305T126 220Q126 90 225 67Q231 66 250 66H255Q306 66 342 115L348 124V337",120254:"28 226Q28 329 91 395T235 461Q258 461 279 456T325 436T368 397T399 332T415 238V219H113V215Q113 163 151 114T248 65Q273 65 298 70T341 82T373 96T396 108L403 113Q403 106 406 76T409 38Q409 34 408 33T393 24Q325 -10 252 -10Q155 -10 92 59T28 226ZM340 289L338 297Q335 305 333 310T327 326T317 343T304 358T286 372T263 381T233 385Q212 385 193 376T162 353T140 325T127 301T123 289H340",120255:"262 705H267Q300 705 347 694V612L336 616Q303 628 274 628H266Q224 628 199 605Q187 590 184 579T181 541V507V444H287V371H184V0H94V371H27V444H94V492Q94 544 95 550Q102 617 151 661T262 705",120256:"55 286Q55 357 105 406T224 455Q280 455 323 421L322 423L318 427Q318 428 339 434T396 448T465 455H471L478 416L485 377Q484 377 474 379T445 383T401 385Q397 385 391 385T381 384L362 383L357 387Q358 386 364 375T375 354T384 325T389 287Q389 217 340 168T221 119Q178 119 138 142Q133 145 131 143Q125 131 125 117Q125 82 155 72L227 71Q230 71 251 71T280 71T310 69T343 65T373 57T403 46T428 30T449 7Q471 -26 471 -62V-71Q471 -136 384 -178Q326 -206 250 -206Q159 -206 102 -172T30 -92Q28 -84 28 -68T31 -37T40 -12T52 7T64 21T75 31T82 38Q60 68 60 106Q60 145 80 180L86 189L80 199Q55 240 55 286ZM304 233T304 287T279 362T220 383Q189 383 165 361T140 287Q140 243 161 217T220 191Q253 191 278 212ZM250 -134Q298 -134 331 -122T375 -96T387 -69Q387 -21 306 -7Q288 -5 216 -5Q161 -5 153 -7Q146 -9 139 -13T122 -31T113 -66Q113 -75 113 -80T127 -97T166 -121Q203 -134 250 -134",120257:"163 395Q223 455 307 455Q417 455 438 354Q442 331 443 164V0H350V157Q349 315 348 320Q334 378 259 378H253Q224 378 204 358Q180 334 173 301T165 209Q165 198 165 172T166 129V0H73V694H163V395",120258:"67 576V680H171V576H67ZM74 0V444H164V0H74",120259:"88 576V680H192V576H88ZM31 -126Q40 -126 48 -125T62 -122T73 -117T82 -111T89 -105T94 -99T98 -92L102 -86V444H192V180Q191 -45 191 -70T184 -113Q171 -152 140 -178T63 -205Q34 -205 4 -197T-43 -181T-59 -171T-51 -133T-41 -96L-38 -99Q-34 -102 -28 -106T-13 -115T7 -123T31 -126",120260:"76 0V694H163V257L340 444H449L286 272L292 263Q296 259 378 138T463 12L471 0H372L309 92Q294 114 277 139T250 179T237 198L228 211L160 139V0H76",120261:"74 0V694H164V0H74",120262:"160 392Q223 455 304 455Q359 455 386 436T430 383L437 391Q495 455 584 455Q694 455 715 354Q719 331 720 164V0H627V157Q626 315 625 320Q611 378 536 378H530Q501 378 481 358Q457 334 450 301T442 209Q442 198 442 172T443 129V0H350V157Q349 315 348 320Q334 378 259 378H253Q224 378 204 358Q180 334 173 301T165 209Q165 198 165 172T166 129V0H73V450H160V392",120263:"160 392Q214 446 283 454Q285 454 292 454T303 455H306Q417 455 438 354Q442 331 443 164V0H350V157Q349 315 348 320Q334 378 259 378H253Q224 378 204 358Q180 334 173 301T165 209Q165 198 165 172T166 129V0H73V450H160V392",120264:"28 222Q28 323 95 391T244 460Q275 460 281 459Q364 445 417 377T471 219Q471 124 408 57T250 -10Q158 -10 93 57T28 222ZM377 230Q377 277 364 310T328 358T287 379T248 385Q233 385 219 382T186 369T155 342T132 297T122 230Q122 146 159 108T250 69H253Q263 69 274 70T305 81T339 106T365 154T377 230",120265:"166 404Q194 424 241 439T337 455H341Q410 455 451 370Q483 307 483 222Q483 128 433 59T306 -10Q282 -10 260 -5T222 7T194 21T176 33T168 38V-194H75V444H165V424L166 404ZM390 222Q390 287 354 331T266 376T177 340L168 332V118Q200 66 257 66Q313 66 351 112T390 222",120266:"33 220Q33 325 87 389T206 454Q286 454 341 406L351 398V455H441V-194H348V41L338 35Q276 -8 198 -11Q171 -11 154 -5Q102 12 68 74T33 220ZM126 220Q126 160 161 113T251 65Q305 65 351 123V298L350 301Q349 304 347 308T342 319T336 331T327 343T315 355T300 365T283 373Q273 375 256 375Q208 375 167 332T126 220",120267:"171 389Q237 455 320 455H327V373H317Q262 369 220 336T167 248Q165 239 164 119V0H74V450H159V377L171 389",120268:"33 326Q33 376 60 408T117 450T175 460H190Q245 460 272 454T345 429Q345 428 338 388L331 349Q278 386 188 386H183Q119 386 119 336Q119 307 142 295T210 276T278 256Q360 213 360 130Q360 108 354 88T332 43T281 5T195 -10Q152 -10 111 1T49 22T28 35Q29 36 32 56T39 95T43 115T51 110T72 99T102 85T143 73T193 68Q274 68 274 123Q274 152 248 167Q234 178 187 186T115 207Q66 229 46 273Q33 298 33 326",120269:"333 27Q333 24 314 16T257 -1T184 -10H172Q146 -10 128 14T105 58T99 91Q95 113 95 251V371H18V444H98V571H182V444H316V371H182V253Q183 128 189 104Q199 68 234 68Q277 72 314 98Q315 93 323 61T333 27",120270:"353 39Q352 38 344 34T331 27T315 19T295 11T270 3T241 -3T207 -8T168 -10H162Q148 -10 137 -8T111 2T87 30T74 81Q73 89 73 268V444H166V268L167 92Q171 79 174 74T192 64T238 59Q317 59 344 116Q349 128 349 148T350 291V444H443V0H353V39",120271:"178 0Q15 441 14 442Q14 444 60 444Q107 444 107 442Q108 441 136 364T196 194T232 67Q233 98 280 234T356 442Q356 444 401 444T446 442L282 0H178",120272:"14 444H105L108 434Q192 160 200 74V65L201 75Q206 144 282 399L296 444H381L399 381Q480 112 480 69L481 70Q481 113 562 386L580 444H668L534 1L483 0H432L429 10Q343 294 338 367L337 377Q336 375 336 370Q336 340 313 250T269 88T245 11L242 0H195L148 1L14 444",120273:"187 229L6 444H107L227 294L344 444H393L442 443Q439 437 299 268L267 229L460 0H359L294 88Q280 107 262 131T236 166L227 177L100 0H0Q1 1 47 58T140 171T187 229",120274:"113 -204Q83 -204 63 -200L43 -197Q43 -196 40 -157T36 -117L48 -121Q79 -133 114 -133Q124 -133 130 -132T145 -121T163 -94Q169 -82 184 -42T200 1L188 29Q176 57 152 115T107 223T62 330T26 416L14 443Q14 444 61 444H109L122 411Q230 155 236 75L237 65V74Q245 161 348 424L356 444H401Q446 444 446 443L396 313Q345 183 293 49T236 -93Q191 -204 123 -204H113",120275:"42 370V444H400V395L156 76L279 77H402V0H28V51L273 371L157 370H42",120276:"110 0H86Q42 0 42 27Q42 37 148 350T258 667Q269 687 291 692Q295 694 366 694H399Q432 694 448 689T474 667Q477 663 583 350T690 27Q690 0 642 0H617H592Q582 0 575 1T561 2T549 6T541 11T533 18T527 26T522 37T517 49T512 64T506 81L490 130H225Q225 128 208 79T189 27Q185 19 180 14T170 7T156 3T143 1T127 0T110 0ZM439 279Q359 524 359 547L357 555L355 543Q347 503 270 263L259 231H357Q455 231 455 232L439 279",120277:"119 1Q98 5 92 28V667Q98 686 118 693Q121 694 272 694H289H346Q439 694 500 681T600 625Q640 580 640 513Q640 451 601 414T504 364L518 361Q568 351 602 329T649 280T666 235T671 197Q671 172 665 147T642 91T586 37T488 5Q456 1 282 1H119ZM489 509Q489 532 479 548T450 573T421 585T394 591Q387 592 315 593H247V404H298H325Q432 404 466 444Q489 470 489 509ZM517 194Q517 235 502 261T458 299T407 313T353 317H329H322H247V101H319H357Q387 101 407 103T452 111T492 133T514 171Q516 176 517 194",120278:"423 -11Q339 -11 275 9T171 62T106 143T71 240T61 347Q61 450 93 527Q157 664 313 694Q357 704 416 704Q479 704 517 699T608 676Q634 667 635 660Q635 653 624 592L612 528L609 524Q604 521 601 521Q595 521 583 531T555 555T505 578T428 589H424Q298 589 250 494Q224 438 224 347Q224 292 233 251T265 175T329 122T432 104Q488 104 524 115T604 158Q607 160 610 162T615 165T619 168L621 170Q625 172 630 170T637 163Q638 160 642 109T647 54Q646 49 625 37T568 11T499 -7Q463 -11 423 -11",120279:"119 1Q98 5 92 28V667Q98 686 118 693H124Q131 693 142 693T168 694T200 694T237 694H296Q416 694 450 692T525 677Q732 617 732 342Q732 169 644 81Q593 32 528 16T372 0Q356 0 324 0T276 1H119ZM573 349Q573 387 571 413T559 473T532 527T482 567T403 591Q395 592 320 593H250V101H321Q418 102 456 114Q553 144 569 263Q573 303 573 349",120280:"277 122Q280 122 380 123T544 125Q552 125 557 125T565 124T569 124Q595 115 595 75V62V47Q595 9 569 2Q564 0 341 0L119 1Q99 7 92 28V664Q98 683 118 690Q121 691 335 691T554 689Q580 682 580 644V632V618Q580 582 554 573Q553 573 551 573T542 572T527 572Q464 572 364 573T260 575H253V412H385H459Q524 412 536 404T549 357Q549 341 549 334T542 318T523 305Q518 303 385 303H253V122H277",120281:"512 572Q451 572 356 573T258 575H253V400H370H431Q494 400 506 392T518 345Q518 307 507 299T437 291H370H253V161Q253 141 253 113T254 75Q254 23 245 12T195 0H170L119 1Q99 7 92 28V664Q98 683 118 690Q121 691 327 691T538 689Q564 682 564 644V632V618Q564 582 538 573Q537 573 535 573T526 572T512 572",120282:"61 347Q61 405 70 454T105 550T171 631T276 685T426 705Q483 705 537 693T620 668T650 646Q650 645 649 637T645 612T639 578L627 514L624 510Q620 507 615 507T597 520T566 548T512 577T430 590Q223 590 223 347T431 104Q478 104 506 112Q508 112 508 164V215H471L434 216L428 222L427 268Q427 315 429 318Q432 323 444 323T544 324H652Q655 320 659 317V45L656 43Q654 39 624 27T536 2T424 -11Q366 -11 317 -2T219 33T137 97T82 200T61 347",120283:"92 667Q101 694 143 694H172H198Q244 694 251 669Q253 663 253 539V415H540V539Q540 558 540 585T539 621Q539 673 550 683T611 694H621H646Q671 694 683 690T700 669Q702 663 702 347T700 25Q696 9 684 5T646 0H621H606Q560 0 550 11T539 76Q539 85 539 116T540 169V306H253V169Q253 147 253 116T254 75Q254 23 245 12T194 0H170L119 1Q99 7 92 28V667",120284:"85 667Q94 694 136 694H165H191Q237 694 244 669Q246 663 246 347T244 25Q235 0 192 0H163L112 1Q92 7 85 28V667",120285:"236 -22Q190 -22 144 -11T72 12T46 29Q63 147 69 153Q80 164 92 146Q124 91 191 91Q222 91 242 102T267 134Q268 139 268 402Q268 663 270 669Q275 687 294 692Q298 694 347 694H367Q393 694 406 690T425 669Q427 663 427 399Q427 132 426 125Q421 87 404 58T366 15T318 -9T273 -20T236 -22",120286:"92 667Q101 694 139 694H163H186Q225 694 234 671Q236 663 236 529L237 392L533 682Q550 694 590 694H623H681Q695 680 695 672Q695 670 693 664Q688 657 561 533L431 405L698 33Q701 28 701 23Q701 7 683 0H626H604Q571 0 564 2T545 13Q544 14 530 33T489 90T437 162L332 307Q331 307 284 260L236 214V122V65Q236 32 231 19T210 2Q205 0 161 0L119 1Q99 7 92 28V667",120287:"92 667Q98 684 109 689T142 694H172H198Q244 694 251 669Q253 663 253 389V116L278 117Q410 119 490 119H495Q511 119 517 115T534 93V63V48Q534 9 508 2Q503 0 310 0L119 1Q99 7 92 28V667",120288:"92 667Q98 684 109 689T146 695Q152 695 167 695T192 694Q200 694 214 694T234 695Q291 695 305 664Q313 651 400 419T487 165Q487 162 488 162T489 165Q489 187 574 413T671 664Q679 680 695 688Q708 694 785 694H828Q855 694 867 689T884 669Q886 663 886 347T884 25Q876 0 832 0H817H802Q758 0 750 25Q748 31 748 293V555L746 544Q737 509 692 386T606 160T564 52Q548 22 502 22H487H472Q423 22 410 52Q407 59 367 160T283 385T231 546L230 548Q229 548 229 293Q229 31 227 25Q222 9 211 5T176 0H158L119 1Q99 7 92 28V667",120289:"92 667Q98 684 109 689T146 694H185Q273 694 279 692Q301 689 315 669Q322 660 419 453L554 163L562 143Q564 143 564 401Q564 663 566 669Q574 694 618 694H633H648Q692 694 700 669Q702 663 702 347T700 25Q696 10 683 5T642 0H596H551Q520 0 505 4T478 25Q471 34 374 241L239 532Q231 550 231 552L229 479Q229 440 229 293Q229 31 227 25Q222 9 211 5T176 0H158L119 1Q99 7 92 28V667",120290:"362 715Q364 715 376 715T394 716H400Q542 716 626 643T727 426Q731 395 731 342Q731 271 722 225Q674 -22 396 -22Q320 -22 259 -3T148 68T77 201Q62 257 62 342Q62 447 86 522T173 649Q245 707 362 715ZM568 433Q551 623 396 623Q383 623 370 622T333 612T292 591T257 550T233 485Q223 442 223 350Q223 276 232 227T267 137Q309 74 397 74Q433 74 461 85T507 113T537 156T556 205T566 260T569 310T570 357Q570 409 568 433",120291:"641 470Q641 426 630 391T603 334T561 295T513 271T459 259T408 254T361 253H350H337H253V142Q253 125 253 100T254 67Q254 32 249 19T227 2Q222 0 170 0L119 1Q99 7 92 28V667Q98 686 118 693Q121 694 271 694Q428 693 462 688Q641 656 641 470ZM487 467Q487 495 485 510T474 546T442 578T382 592Q375 593 310 593H250V347H309H339Q364 347 380 348T418 354T451 368T474 395T486 438Q487 444 487 467",120292:"450 -20Q444 -20 429 -21T396 -22Q320 -22 259 -3T148 68T77 201Q62 257 62 342Q62 447 86 522T173 649Q245 707 362 715Q364 715 376 715T394 716Q732 716 732 340Q732 268 719 210T686 120T647 68T615 39T601 29T638 -22T676 -73Q679 -78 679 -83Q679 -98 661 -106H593Q526 -106 521 -104Q514 -103 507 -97T496 -84T477 -55L454 -19L450 -20ZM554 509Q516 622 391 622Q294 622 250 535Q220 475 220 345Q220 299 222 266T234 198T258 140T299 99T363 74Q378 71 393 71H395L381 92Q367 114 353 136T338 161Q336 165 336 170Q336 186 352 193L361 194Q370 194 384 194T412 194H452Q457 194 460 194T466 194T471 192T476 191T480 188T483 185T487 180T492 174T497 167T504 158L526 129Q532 127 552 175Q573 231 573 348Q573 455 554 509",120293:"654 24Q654 9 644 5T612 0H577L521 1Q509 5 503 13Q498 20 421 160L343 304H250V168Q250 147 250 118T251 78Q251 24 242 12T192 0H168L119 1Q99 7 92 28V667Q98 686 118 693H124Q131 693 141 693T165 694T195 694T229 694T280 694T332 695Q389 695 428 691T510 675T582 637T627 569Q641 532 641 493Q641 377 537 331L497 317L493 316L571 177Q653 28 654 24ZM487 472T487 492T485 525T476 553T450 577T404 591Q398 592 322 593H250V391H321Q327 391 353 391T385 392T412 395T438 401T457 412T474 430T483 456",120294:"61 503Q61 547 72 583T110 650T186 698T305 716Q405 716 496 671Q513 664 514 657Q514 656 513 648T509 623T503 589L491 525L488 521Q484 518 479 518H475L461 532Q430 565 395 581T305 598Q201 598 201 523Q201 480 240 462T345 431T443 394Q549 324 549 204Q549 160 538 123T502 51T427 -2T308 -22Q180 -22 69 41Q50 52 49 57Q49 58 50 66T54 91T60 125L72 189L75 193Q80 196 84 196Q87 196 104 182T145 149T212 117T304 102Q408 102 408 188Q408 215 396 234T362 263T319 278T267 290T219 302Q149 324 105 380T61 503",120295:"67 687Q70 688 366 688Q661 688 666 686Q692 680 692 641V629V615Q692 579 666 570H660Q655 569 648 569Q645 569 624 569T581 570Q505 570 475 572H447V302Q447 31 445 25Q436 0 393 0H364L313 1Q293 7 286 28L285 300V572H257Q227 570 151 570Q130 570 109 570T84 569Q77 569 72 570H66Q48 577 44 588T40 631L41 661Q47 680 67 687",120296:"92 667Q101 694 143 694H172H200Q242 694 251 671Q253 663 253 430Q254 189 255 185Q262 134 288 107T384 79Q498 79 516 168Q520 191 521 431Q521 663 523 671Q532 694 572 694H596H618Q639 694 648 692T665 679Q671 672 671 653Q672 632 672 555V432Q671 200 670 190Q652 79 581 29T383 -22Q137 -22 98 166Q92 195 92 303V667",120297:"27 667Q27 683 39 688T75 694H101Q155 694 159 692Q182 687 194 665Q202 652 283 419T374 142Q376 165 473 445Q552 664 553 666Q568 694 618 694H639H658Q681 694 693 689T705 667Q705 660 592 347Q481 32 477 28Q466 7 441 1H292Q266 7 255 28Q251 32 140 347Q27 660 27 667",120298:"994 694Q1012 683 1014 668Q1014 661 977 519T896 217T845 26Q831 0 783 0H747H711Q685 0 672 5T649 26Q644 36 583 272T517 548Q516 552 516 551Q503 479 437 227Q389 37 383 26Q367 0 323 0H288H254Q207 0 193 26Q191 32 108 346T24 665Q24 685 44 693Q47 694 98 694H115Q152 694 168 668Q174 657 235 417T297 144Q297 134 300 153Q307 204 362 421T427 668Q441 694 488 694H523Q586 694 597 688Q612 683 620 661T651 549Q664 496 673 462Q744 194 750 146V140Q767 223 800 354T857 576T883 668Q897 694 938 694H958H994",120299:"52 1Q37 11 37 23Q37 26 39 32Q39 34 158 202L275 369Q275 370 221 441T112 586T55 663Q53 669 53 672Q53 687 68 693H72Q77 693 84 693T99 694T118 694T139 694H176Q203 694 212 692T230 682Q231 681 239 669T265 634T296 591L358 504L418 591Q481 682 486 686Q491 691 499 692Q505 694 569 694H632Q650 685 650 672Q650 667 646 660Q643 654 592 582T491 440T441 369T566 201T693 29Q694 27 694 23Q694 11 677 0H607L537 1Q523 6 519 10T437 131Q422 153 411 170T390 200T375 222T365 237T359 245L357 247L348 232Q339 218 319 188T283 131Q222 37 211 22T186 1H52",120300:"635 694H668Q688 694 698 690T708 670Q708 664 704 658L446 278L445 152V27Q442 20 440 17T433 9T419 1L368 0H339Q316 0 305 5T288 26Q286 31 286 154V278L157 468Q135 500 101 550Q43 635 34 650T24 671Q24 686 39 693Q42 694 105 694H122H132Q163 694 180 689T214 666Q225 654 336 485Q373 425 373 420L374 418Q375 419 375 421Q378 432 418 493T496 609T536 667Q543 676 551 681T572 689T591 693T615 694T635 694",120301:"411 584Q243 581 131 581Q122 581 116 581T106 582T102 582Q84 589 80 600T76 640L77 667Q83 686 103 693Q106 694 343 694Q579 694 584 692Q592 691 599 684T609 668Q610 665 610 646Q610 614 608 608Q605 603 434 361L261 116Q340 117 402 118T490 119T533 120T560 120H572Q605 120 614 95Q616 89 616 60V46Q616 9 590 2Q585 0 339 0Q92 0 87 2Q79 3 72 10T62 26Q61 29 61 49Q61 84 63 90Q65 94 152 217T325 461T411 584",120302:"255 394Q218 394 186 383T138 358T109 333T94 321H91Q88 321 86 322T83 325T80 331T79 339T78 349T77 362T75 377Q72 410 72 420Q72 423 72 425T73 429T74 431T77 433T80 435T85 437Q166 475 262 475Q360 475 413 440Q462 406 471 341Q472 332 472 181Q472 155 472 119T473 73Q473 20 462 10T398 0H380Q349 0 337 8T324 48V65Q298 30 257 10T172 -11Q109 -11 70 37T31 145Q31 276 307 289H321V309Q321 337 318 352T300 381T255 394ZM176 146Q176 116 190 97T231 77Q251 77 266 85Q322 110 322 185Q322 189 322 192T322 198L321 201V234L308 232Q176 220 176 146",120303:"54 667Q63 694 102 694H127H151Q190 694 199 671Q201 663 201 544L202 422L211 428Q270 468 355 468Q523 468 523 231Q523 -10 321 -10Q286 -10 261 -2T204 33Q197 11 187 6T142 0H126L81 1Q61 7 54 28V667ZM372 230Q372 317 355 349T280 382Q251 382 204 356V107Q235 76 274 76Q301 76 320 84T349 105T364 139T371 180T372 230",120304:"188 233Q188 199 190 177T200 131T225 95T271 83H281Q356 83 421 130Q433 138 434 139Q446 141 448 131Q449 128 453 84T457 36Q455 30 432 20T364 -1T273 -11Q37 -11 37 232Q37 456 244 474Q246 474 257 474T276 475Q349 475 400 455Q443 436 448 431L451 425Q451 419 443 377Q442 372 441 366T439 356T438 348T436 340T435 334T433 330T431 327T429 325T426 324Q420 324 406 336Q376 362 350 372T281 382Q254 382 236 373T208 352T194 317T189 278T188 233",120305:"225 -11Q192 -11 164 -3T104 29T55 102T37 227Q37 321 63 376Q111 469 223 469Q292 469 349 433L359 426V546Q359 564 359 589T358 623Q358 675 369 684T433 694H451Q497 694 505 669Q507 663 507 347T505 25Q500 9 487 5T450 0H432H413Q356 0 356 36V40Q298 -11 225 -11ZM356 359Q326 382 286 382Q239 382 215 358Q189 330 189 256V229V203V195Q189 102 231 86Q251 76 274 76Q318 76 356 114V359",120306:"30 231Q30 301 51 351T107 426T181 463T262 474H268Q293 474 312 472T366 459T422 427T462 363T480 260Q480 230 466 222T405 213Q395 213 364 213T311 214H173V211Q173 183 183 148T216 96Q244 76 287 76Q319 76 350 85T399 104T433 125T451 136Q463 138 465 128Q466 125 469 84T473 39Q471 29 423 13T330 -9Q321 -10 286 -10Q213 -10 161 11T81 68T42 144T30 231ZM353 292Q350 324 342 344T320 373T294 384T264 387Q191 387 175 286V282H353V292",120307:"67 458H78V502V509Q78 538 79 556T90 604T117 651T169 685T253 704Q254 704 258 704T265 705T275 705T287 704Q364 704 381 687V638V607Q381 591 378 585T366 579Q362 581 351 591T323 610T282 618Q238 618 226 587Q224 581 223 519V458H253Q288 458 298 453Q315 441 315 415Q315 399 312 390T299 377T282 372T259 371H255H226V201Q226 31 224 25Q215 0 174 0H150L106 1Q86 7 79 28L78 199V371H69Q29 371 29 412Q29 425 30 431T40 447T67 458",120308:"63 108Q63 142 83 176L76 184Q35 227 35 300Q35 469 243 469Q330 469 385 437L397 443Q451 469 508 469Q515 468 517 466T522 456T528 425Q534 392 534 386Q532 379 523 377Q520 377 509 381T477 390T431 398L425 399Q453 362 453 297Q453 268 445 242T417 189T351 146T242 130Q169 130 119 153Q117 141 117 136Q117 95 155 83Q161 81 252 81Q354 80 362 79Q437 71 475 48T526 -24Q532 -42 532 -65Q532 -116 489 -156T341 -204Q323 -206 274 -206H256Q39 -206 18 -84Q17 -79 17 -68Q17 15 82 42L76 53Q63 79 63 108ZM310 300Q310 359 298 377T238 396Q217 396 204 390T186 368T179 339T178 300Q178 245 189 224T244 203T299 224T310 300ZM414 -66Q414 -55 411 -47T401 -32T387 -21T368 -14T346 -10T322 -7T297 -6T271 -6T246 -6H193Q163 -6 154 -10T140 -30Q135 -45 135 -62Q135 -134 274 -134Q414 -134 414 -66",120309:"53 667Q62 694 101 694H126H148Q191 694 198 669Q200 663 200 526V390Q263 469 361 469Q390 469 412 465T456 449T491 413T507 351Q508 342 508 185Q508 31 506 25Q498 0 450 0H432H413Q368 0 359 23Q357 31 357 186Q356 345 355 350Q349 369 336 376Q324 381 301 381H298Q269 381 242 362Q217 342 210 316T202 239Q202 229 202 202T203 157V82Q203 24 195 12T146 0H125L80 1Q60 7 53 28V667",120310:"72 574Q55 583 51 591T46 619V636L47 670L48 673Q50 676 52 678T56 684T63 690T73 694H81Q89 694 102 694T129 695H181Q193 687 196 685T203 676T207 661T208 634Q208 603 204 593T181 574H72ZM54 431Q63 458 102 458H127H149Q192 458 199 433Q201 427 201 229T199 25Q190 0 149 0H125L81 1Q61 7 54 28V431",120311:"70 634V648Q70 686 96 693Q100 695 151 695H176Q201 695 213 691T230 670Q232 665 232 634V620Q232 582 206 575Q202 573 151 573H126Q101 573 89 577T72 598Q70 603 70 634ZM-41 -84Q-1 -105 28 -105Q67 -105 78 -85Q83 -77 83 -48T84 180Q84 427 86 433Q93 458 136 458H158H180Q201 458 209 456T225 443Q230 436 231 418Q232 397 232 313V183V124V40Q232 -55 228 -87T203 -147Q166 -205 78 -205Q31 -205 -20 -189T-71 -159Q-71 -156 -62 -124T-52 -89Q-49 -84 -41 -84",120312:"496 23Q496 9 487 5T457 0H427H398Q367 0 354 11Q352 12 288 99L226 183L191 150V90V54Q191 30 186 18T165 2Q160 0 124 0L90 1Q70 7 63 28V667Q72 694 108 694H128H146Q183 694 192 671Q194 663 194 496L195 325L254 383Q266 394 281 409T301 429T316 441T329 450T341 455T357 458T376 458H409H436Q461 458 470 454T480 437Q480 430 477 427T445 395Q417 368 396 347L319 271Q319 270 358 217T442 103T494 32Q496 30 496 23",120313:"54 667Q63 694 102 694H127H149Q192 694 199 669Q201 663 201 347T199 25Q190 0 149 0H125L81 1Q61 7 54 28V667",120314:"197 386Q256 468 366 468Q404 468 430 461T471 438T491 413T503 385Q563 469 666 469Q731 469 769 446T814 350Q815 343 815 185Q815 31 813 25Q808 9 796 5T758 0H737L692 1Q672 7 665 28L664 186V206V290Q664 349 655 365T610 381Q581 381 560 370T529 341T515 311T510 291Q509 286 509 157V82Q509 24 501 12T452 0H431L386 1Q366 7 359 28L358 186V206V290Q358 349 349 365T304 381Q275 381 254 370T223 341T209 311T204 291Q203 286 203 157V82Q203 24 195 12T146 0H125L80 1Q60 7 53 28V437Q58 453 80 464H122H142Q167 464 178 460T195 439Q197 434 197 409V386",120315:"197 386Q264 468 350 468Q375 468 390 467T429 460T466 443T492 408T507 351Q508 342 508 185Q508 31 506 25Q498 0 450 0H432H413Q368 0 359 23Q357 31 357 186Q356 345 355 350Q349 369 336 376Q324 381 301 381H298Q269 381 242 362Q217 342 210 316T202 239Q202 229 202 202T203 157V82Q203 24 195 12T146 0H125L80 1Q60 7 53 28V437Q58 453 80 464H122H142Q167 464 178 460T195 439Q197 434 197 409V386",120316:"274 -11Q32 -11 32 225Q32 346 85 406T249 474H266H271Q302 474 325 471T385 458T451 419T498 346Q518 300 518 225Q518 -11 274 -11ZM367 233Q367 322 350 354T270 387Q240 387 222 377T195 344T184 298T182 233Q182 151 198 117T275 83H282Q318 83 339 104Q355 119 361 146T367 233",120317:"125 458H139Q174 458 185 452T202 420L211 426Q245 448 288 458T354 469Q356 469 361 469T369 468Q443 468 481 412Q523 355 523 223Q523 164 509 120T473 51T423 12T371 -7T323 -11Q260 -11 204 33V-65Q204 -80 204 -102T205 -131Q205 -162 200 -175T178 -192Q173 -194 126 -194L81 -193Q61 -187 54 -166V431Q58 447 81 458H125ZM372 230Q372 376 282 376Q247 376 204 352V107L208 103Q213 99 218 95T232 87T251 79T274 76Q323 76 349 116Q372 153 372 230",120318:"226 -11Q37 -11 37 236Q37 294 51 338T86 407T135 445T186 464T233 469H235Q300 469 349 422L359 413V425Q359 452 376 464Q384 469 433 469H455Q498 469 505 444Q507 438 507 137Q507 -163 505 -169Q500 -185 487 -189T450 -194H432H413Q367 -194 358 -171Q356 -163 356 -63V40L348 33Q296 -11 231 -11H226ZM281 375Q188 375 188 228Q188 77 275 77Q322 77 359 120V328Q338 357 324 366T281 375",120319:"54 437Q58 453 81 464H122H147Q186 464 194 439Q196 434 196 405V377L203 387Q245 456 324 468Q325 468 331 468T340 469Q347 469 356 462V360Q350 355 346 354T339 353T326 353T300 347Q260 337 234 311T202 252Q201 247 201 138Q201 122 201 98T202 66Q202 33 197 20T175 2Q170 0 125 0L81 1Q61 7 54 28V437",120320:"37 328Q37 392 75 433T203 474Q254 474 265 473Q319 465 370 442Q378 439 380 432Q380 426 372 384Q364 336 359 333Q358 331 355 331Q348 331 337 341Q282 388 216 388H208Q190 388 180 387T161 377T151 351Q151 333 164 323T224 306L267 297Q314 285 355 246T396 144Q396 17 282 -5Q260 -10 218 -10Q170 -10 124 2T55 26T30 44Q30 48 39 99T49 153Q52 159 60 159Q66 159 70 153Q100 120 133 101T218 82Q231 82 238 83T258 87T277 101T283 126Q283 149 260 160T200 176T153 186Q109 201 73 236T37 328",120321:"225 267Q225 202 226 169T232 115T244 88T265 82Q295 84 318 100T345 116Q352 116 354 110T364 77Q373 46 373 43Q373 28 312 9T190 -10Q160 -10 139 1T107 29T89 77T82 136T80 210V258V371H66H59Q39 371 27 386Q20 394 20 417Q21 432 23 437Q35 458 60 458H65H83V510L84 562Q93 589 131 589H154H174Q216 589 223 564Q225 558 225 508V458H274Q330 458 338 453Q355 441 355 415Q355 388 338 376Q330 371 274 371H225V267",120322:"53 431Q62 459 100 459Q105 459 114 459T127 458H152Q192 458 201 435Q203 427 203 262Q204 86 208 77Q209 74 216 71Q227 66 258 66H264Q334 66 354 140L356 150L357 290Q357 427 359 435Q365 449 377 453T412 458H432H450Q498 458 506 433Q508 427 508 229T506 25Q498 0 451 0H434H418Q386 0 374 7T360 43V58L352 49Q298 -11 199 -11Q135 -9 101 11T56 80Q52 100 52 273L53 431",120323:"26 429T26 435T32 448T44 456Q48 458 85 458H99Q145 458 161 431Q162 429 207 285L251 145L294 284Q333 410 341 430Q351 451 374 456Q379 458 420 458H430Q450 458 457 456T471 443Q473 437 473 435Q473 426 443 325T381 126L350 28Q339 7 316 2Q312 0 250 0Q187 0 183 2Q160 7 149 28L136 68Q124 109 106 166T70 283T39 385",120324:"699 458Q717 447 719 432Q719 426 666 230T610 27Q602 10 588 5T548 0H512H482Q431 0 420 17T384 135Q356 241 352 298V308L351 295Q348 251 322 145T290 28Q279 0 233 0H212H191Q146 0 133 27Q130 33 77 229T24 430Q24 449 44 457Q47 458 79 458Q122 458 126 456Q154 450 163 419L233 153Q241 187 272 304T307 431Q318 458 368 458Q394 458 398 456Q421 451 430 431Q434 423 509 147L547 286Q582 416 588 429Q600 454 624 457Q632 458 647 458H663H699",120325:"92 0Q87 0 77 0T62 -1Q24 -1 24 22Q24 29 33 41T106 136Q185 237 184 238Q184 239 147 284T73 376T33 427Q31 430 31 436Q31 451 45 457Q48 458 96 458H122Q152 458 163 450T208 394L247 345L282 394Q288 403 297 416T309 434T319 444T328 452T338 455T352 458T372 458H393H440Q457 449 457 435Q457 428 450 419T379 328Q308 239 308 237L389 137Q409 112 436 79Q475 31 475 23Q475 -1 436 -1Q432 -1 422 -1T407 0Q360 0 352 3Q343 6 336 16T291 83L247 151L245 148Q243 145 239 139T229 124T218 106T204 84Q167 24 160 15T141 1L92 0",120326:"454 458Q473 446 473 430Q473 426 394 184L311 -68Q291 -119 245 -162T123 -205Q51 -205 46 -190Q44 -187 40 -142T36 -92Q36 -90 36 -88L37 -87Q41 -80 46 -80Q48 -80 73 -92T126 -105Q146 -105 161 -98T185 -76T197 -53T206 -28L215 0L122 212Q29 427 29 435Q29 448 46 457Q49 458 91 458Q93 458 106 458T125 457T140 454T157 446T170 431Q183 410 224 305T266 158Q266 152 266 151Q267 151 268 163Q271 206 302 310T342 432Q354 458 398 458H418H454",120327:"268 376Q250 376 180 375T92 374Q69 374 63 380Q46 390 46 419Q46 428 49 437Q57 451 73 457Q76 458 242 458T413 456Q420 455 427 448Q439 438 439 413Q439 392 433 385Q432 383 318 236T204 88Q235 88 306 89T395 90H399Q408 90 414 89T427 84T438 70T442 45Q442 9 416 2Q411 0 236 0H136Q73 0 62 1T41 12Q31 23 31 47Q31 68 36 77Q37 78 51 97T96 155T153 228L268 376",120328:"28 0L429 694H533L585 350Q596 275 610 182T632 46L638 3V0H530L528 18Q527 25 515 103T503 183H223L135 29L118 1L73 0H28ZM492 254Q492 256 473 398T454 589V610Q433 552 290 301L264 255L378 254H492",120329:"501 363Q557 355 605 316T653 222Q653 148 586 85T403 2Q394 1 240 0Q90 0 90 1L100 46Q109 90 128 177T164 348L238 694H375Q518 693 546 688Q614 674 655 635T696 544Q696 490 648 441T516 368L501 363ZM601 530Q601 568 566 590T479 621Q472 622 394 623H320L297 513Q292 489 286 459T276 415L273 401V399H339H372Q504 399 571 466Q601 498 601 530ZM257 322Q256 320 230 197T203 73Q203 71 289 71Q379 72 387 73Q459 84 507 122T556 210Q556 255 519 283T428 320Q415 322 336 323Q257 323 257 322",120330:"124 266Q124 372 179 473T333 639T544 705Q592 705 635 697T698 679L718 670Q719 669 701 621T681 572L676 576Q670 580 661 586T641 598T614 611T583 620Q558 625 526 625Q406 625 318 516T230 276Q230 238 236 212Q251 148 294 108T412 68Q469 68 508 80T598 123Q608 129 608 128Q606 109 603 87L598 45L573 33Q521 7 486 -1T394 -10Q358 -10 346 -8Q260 5 202 62Q124 145 124 266",120331:"162 348L236 694H385Q535 693 543 692Q600 682 641 654T705 586T737 506T747 425Q747 296 672 187Q625 114 548 62T384 1Q376 0 262 0Q88 0 88 1L98 46Q107 90 126 177T162 348ZM622 533Q575 624 443 624Q434 624 419 624T399 623H321L263 348Q249 283 234 213T212 107L204 72Q204 71 289 71Q374 72 386 74Q501 94 573 193T646 422Q646 487 622 533",120332:"86 2Q88 4 160 346T233 689Q233 691 461 691Q688 691 688 689Q685 686 671 611H495L320 612L319 609Q319 607 297 501L274 397H436Q597 397 597 396L596 391Q595 386 593 376T589 358L581 322L420 321Q258 321 258 320Q209 89 208 87Q208 85 390 85Q417 85 460 85T518 86L572 85Q556 8 554 2V0H86V2",120333:"86 2Q88 4 160 346T233 689Q233 691 453 691T673 689Q670 686 656 611H488L320 612Q314 579 302 523T281 427T272 385Q272 384 419 384H567L551 308H255L223 156Q216 124 207 82T194 20L190 2Q190 0 138 0H86V2",120334:"125 267Q125 375 182 476T337 641T544 705Q598 705 644 693T710 669T730 655L712 609L693 560L692 557L681 567Q618 626 526 626Q447 626 378 573T269 440T229 277Q229 185 276 127T406 68Q422 68 451 71T502 78T524 84L526 93Q528 102 532 119T539 153L553 222Q553 223 495 223Q436 223 436 224Q436 230 444 262L452 299H662V296Q661 290 635 166T607 40Q606 37 576 25T492 1T391 -11Q272 -11 199 66T125 267",120335:"517 2Q518 3 551 161T585 322Q586 323 557 323T422 323H259L190 0H138Q86 0 86 1L96 46Q105 90 124 177T160 348L234 694H337V691Q336 690 306 545T275 399H602L603 403Q603 407 634 551L665 694H768V691Q768 690 695 348T621 2V0H517V2",120336:"161 348L235 694H338V691Q338 690 265 348T191 2V0H139Q87 0 87 1L96 46Q106 90 125 177T161 348",120337:"377 424L435 694H535V691Q534 685 476 412T416 135Q401 74 350 26T210 -22Q165 -22 124 -11T65 9T46 21L54 41Q62 61 70 83T81 109Q82 111 85 106Q86 105 87 103Q93 94 103 84T135 64T185 53Q238 53 272 76T317 142Q317 145 325 182T348 289T377 424",120338:"236 223Q235 222 213 113T188 2V0H138Q88 0 88 1L98 46Q107 90 126 177T162 348L236 694H285Q335 694 335 693L330 671Q326 649 316 603T298 518Q289 477 280 433T266 366L261 343L672 694H729L784 693L465 420L651 0H596L541 1L384 350Q383 351 310 288T236 223",120339:"161 348L235 694H338V691Q338 690 273 385T208 79Q278 80 362 80H516Q502 11 499 2V0H293Q87 0 87 1L96 46Q106 90 125 177T161 348",120340:"375 691Q456 215 459 124V106Q488 177 762 641L793 694H929V691Q929 690 856 348T782 2V0H689V2Q691 4 753 304Q817 604 818 606Q819 611 817 608Q817 607 815 603Q798 559 540 117L484 22H440L397 23L393 42Q393 47 373 169T334 422T315 594V609L250 306Q186 3 185 2Q185 0 138 0Q92 0 92 1L102 46Q111 90 130 177T166 348L240 694H375V691",120341:"311 609Q310 608 246 306T181 2V0H134Q88 0 88 1L98 46Q107 90 126 177T162 348L236 694H382L383 691Q383 688 418 561T493 286T541 97L544 84L545 89Q545 90 553 128T578 246T610 394L674 694H766V691Q766 690 693 348T619 2V0H472L469 13Q468 17 393 293T312 605L311 609",120342:"118 254Q118 366 174 473T324 648T517 716Q627 716 695 638T763 435Q763 321 706 215T555 43T362 -22Q256 -22 187 56T118 254ZM380 58Q452 58 518 116T622 263T661 442Q661 496 646 535T608 594T567 622T534 634Q516 636 496 636Q400 636 313 528T225 264Q225 172 267 115T380 58",120343:"162 348L236 694H378Q522 693 530 692Q604 680 647 635T690 524Q690 474 665 430T612 359Q550 299 465 280Q443 275 343 274H250V271Q250 269 235 201T206 68T192 2V0H140Q88 0 88 1L98 46Q107 90 126 177T162 348ZM594 513Q594 560 562 588T477 622Q470 623 394 623H321L293 487L263 349V347H342H347H375Q530 347 578 449Q594 483 594 513",120344:"118 254Q118 366 174 473T324 648T517 716Q627 716 695 638T763 435Q763 305 693 194T543 36Q547 29 586 -47T625 -125H504L450 -8Q406 -22 363 -22Q256 -22 187 56T118 254ZM661 437Q661 532 616 584T506 636Q428 636 361 578T257 433T220 258Q220 167 264 113T380 58Q390 58 397 58T408 59T413 60T417 61Q417 63 387 127T356 193Q356 194 409 194H462L485 150L508 105Q509 103 532 125T567 161Q661 278 661 437",120345:"162 348L236 694H375H414H445Q507 694 538 690T606 668Q698 623 698 534V528Q698 447 608 377Q582 358 555 345T512 326L497 321L617 0H565L513 1L402 309H255L189 0H138Q88 0 88 1L98 46Q107 90 126 177T162 348ZM603 525Q603 603 499 620Q486 622 403 623H321L297 506Q292 482 285 449T274 402L271 387V385H346Q350 385 363 385T386 384Q548 384 592 479Q603 503 603 525",120346:"161 478Q161 568 242 642T435 716Q527 716 599 673L609 667Q595 633 589 615L571 568Q570 568 564 575T546 592T518 611T475 628T417 635Q351 635 305 596T259 507Q259 465 290 444T372 411T432 396Q473 385 509 343T545 236Q545 140 464 59T270 -22Q155 -22 54 48L92 146Q93 146 101 138T124 117T161 92T216 72T288 63Q360 63 403 109T447 204Q447 220 444 233T435 256T421 273T404 285T385 295T366 301T347 306T331 310T315 314T292 321T265 331T235 346T207 367T183 395T168 431T161 478",120347:"165 608L182 687Q182 688 486 688H790L789 685L781 645L773 609H521L457 306Q393 3 392 2Q392 0 340 0H288V2Q289 5 353 304T417 605V609L291 608H165",120348:"340 -22Q251 -22 191 33T131 177V187Q131 192 131 195T132 205T133 215T136 231T141 253T147 285T156 328T168 384T184 457L235 694H338V691Q338 690 288 451T236 210Q234 194 234 177Q234 138 247 111T280 72T319 54T357 49Q408 49 449 74T510 128Q516 136 521 143T530 158T538 175T545 194T553 220T560 250T569 289T579 336T591 395T606 464L655 694H747V691Q651 243 645 213Q623 149 587 102Q482 -22 340 -22",120349:"220 348L161 694H216Q270 694 270 693L283 613Q334 313 346 215Q359 102 359 96Q359 87 358 84Q388 162 684 657L706 694H753Q799 694 799 693L387 0H333Q279 0 279 1L272 45Q264 89 249 177T220 348",120350:"596 540Q596 562 597 585T599 609Q599 588 436 255Q402 185 362 104L310 0H213V3Q213 6 188 347T161 694H263L265 664Q290 327 293 184Q293 112 289 85Q290 85 290 87Q290 95 301 123T332 194T373 282T419 380T463 469T498 541T517 579L574 694H671V689L674 646Q678 603 682 538T691 401T699 263T703 160Q703 102 700 87Q719 154 930 576L989 694H1076Q1076 693 903 347L730 0H628V4L626 26Q624 48 622 85T616 168T609 267T603 369T598 464T596 540",120351:"14 0Q17 3 184 184T352 367L265 529Q244 567 222 609T188 672L176 692Q176 694 236 694H297L338 612Q387 515 400 489L421 448L645 694H758L708 640Q481 393 456 368Q455 366 500 281T596 104T652 0H531L388 293L128 0H14",120352:"151 692Q151 694 212 694H272L418 362L696 683L705 694H758L809 693Q809 692 630 490T444 280Q442 275 413 139L383 1L333 0Q282 0 282 2Q283 3 312 141L341 278L246 484L151 692",120353:"67 54Q551 615 551 617Q543 618 517 618Q510 618 463 618T376 617Q200 617 200 618T209 657L216 694H459Q702 694 702 692Q702 689 697 667L692 643L207 80H392Q493 81 577 81Q577 70 560 2V0H55V2L67 54",120354:"313 386Q286 386 260 381T217 369T186 355T164 342T155 337Q154 338 159 377T165 418Q251 461 320 461Q322 461 328 461T337 460Q397 460 435 424T473 329Q473 325 473 318T472 308Q432 110 407 2V0H317V2L325 38Q295 21 269 10Q215 -10 156 -10H149Q76 -10 62 69Q61 75 61 90Q61 127 73 150T116 194Q146 215 207 231T348 252H368L373 277Q378 302 378 318Q378 367 339 384Q332 386 313 386ZM150 116Q150 93 171 79T223 65Q259 65 293 85T341 135Q343 140 348 160T353 184Q353 186 342 186Q298 186 231 174T153 134Q150 127 150 116",120355:"302 -11Q266 -11 235 1T190 26L176 38Q170 8 168 2V0H121Q75 0 75 1L84 46Q94 90 113 177T149 348L223 694H267Q312 694 312 693T282 551T251 407Q251 406 256 408T271 415Q347 454 430 454H438Q501 454 528 374Q539 339 539 299Q539 179 466 84T302 -11ZM443 275Q443 317 421 348T346 379Q318 379 296 369Q269 359 238 332L193 118L198 109Q220 65 269 65Q350 65 396 130T443 275",120356:"75 164Q75 226 100 282T165 377T252 437T342 460H347Q447 460 499 417L483 378Q468 339 468 338Q466 338 455 347T424 366T385 378Q355 382 334 382Q262 382 215 318T168 177Q168 120 196 95T259 69H269Q345 69 420 108Q432 114 432 113T427 72L422 32L402 22Q382 12 344 2T259 -11Q214 -11 180 2T126 36T95 81T79 126T75 164",120357:"73 156Q73 224 102 293T184 408T294 455Q375 455 432 413Q438 407 438 410T469 553L499 694H588V691Q588 690 515 348T441 2V0H348V2Q357 29 357 43L352 41Q332 24 288 7T196 -10H190Q178 -10 166 -7T134 8T98 46T75 113Q73 129 73 156ZM419 335Q419 339 412 348T386 368T342 379Q284 379 243 343T184 261T167 168Q167 122 191 94T263 66Q321 66 367 116L374 124L397 229Q419 333 419 335",120358:"248 -11Q170 -11 121 41T71 173Q71 265 133 349T285 454Q305 460 318 460H328Q368 460 399 448Q472 414 472 309Q472 274 464 234L462 219H159Q156 198 156 185Q156 137 179 107T237 68Q246 66 268 66Q345 66 427 113V109Q426 108 422 73T417 37Q417 34 409 29Q329 -11 248 -11ZM401 299Q399 337 376 361T316 385Q291 385 266 371Q220 350 184 289H401V299",120359:"381 443Q381 440 374 407T366 371H315Q263 371 263 369Q262 368 224 186Q215 145 205 97T189 25L184 2V0H94V2L99 25Q104 48 114 96T134 186Q172 368 173 369Q173 371 139 371H106V373L114 410L121 444H155L188 445L191 455L212 551Q232 612 288 658T415 705Q438 705 464 701T494 694Q478 614 477 614L467 618Q457 621 440 624T406 629H400Q333 629 306 579Q301 568 289 507L275 444H328Q381 444 381 443",120360:"113 252Q113 334 177 394T311 454Q332 454 350 451T379 442T398 432T410 424L413 421Q412 423 411 424L409 426Q409 429 434 436T496 449T560 455H568V451Q568 447 567 429T566 394L565 377L553 379Q522 385 479 385Q463 385 456 384L443 383L436 392Q454 357 454 324Q454 243 390 182T249 120Q233 120 219 122T195 128T178 136T167 142L163 145Q149 131 149 105Q149 78 171 72L242 71Q246 71 269 71T303 71T336 68T372 62T403 51T432 32Q461 8 461 -40Q461 -112 383 -159T211 -206Q123 -206 68 -172T12 -86Q12 -55 31 -23T82 32Q90 38 89 39Q89 40 87 44T82 59T80 82Q80 134 126 189Q113 228 113 252ZM369 319Q369 354 350 368T304 383Q274 383 252 369T218 333T202 291T197 255Q197 221 217 206T263 191Q317 191 343 233T369 319ZM373 -59Q373 -41 362 -30T330 -13T291 -7T247 -5H216Q167 -5 158 -6T139 -12Q123 -20 110 -38T97 -76Q97 -102 133 -118T221 -134Q242 -134 267 -130T316 -118T357 -94T373 -59",120361:"416 321Q416 379 336 379Q276 379 237 302Q226 276 209 202T180 66T166 2V0H119Q73 0 73 1L82 46Q92 90 111 177T147 348L221 694H265Q310 694 310 693T279 544L247 395Q325 455 403 455Q513 455 513 358Q513 334 508 309Q507 304 476 156T443 2V0H350V2L357 34Q364 65 373 110T392 200T409 281T416 321",120362:"189 578Q190 579 199 627T211 678V680H315V678Q313 675 304 627T293 578V576H189V578ZM168 442T168 443T213 444T258 443T212 225T164 2V0H74V2Q75 7 121 224",120363:"211 577L233 680H284Q336 680 336 679L315 576H263Q211 576 211 577ZM19 -204Q-12 -204 -40 -196T-82 -179T-96 -170Q-96 -168 -78 -132L-61 -95L-54 -103Q-32 -126 3 -126Q26 -126 50 -116Q76 -101 83 -85Q84 -79 140 180T196 443Q196 444 241 444T286 443Q286 441 232 186T175 -75Q163 -120 122 -162T19 -204",120364:"150 348L224 694H310V691Q218 259 218 258L232 270Q245 281 274 306T327 351L435 444H489L542 443Q542 442 443 357L344 272L471 1L422 0H372L366 14Q359 27 347 54T323 105L273 210Q271 210 231 174L190 139L160 0H118Q76 0 76 1L86 46Q95 90 114 177T150 348",120365:"148 348L222 694H311V691Q311 690 238 348T164 2V0H119Q74 0 74 1L84 46Q93 90 112 177T148 348",120366:"416 321Q416 379 336 379Q276 379 237 302Q226 276 209 202T180 66T166 2V0H119Q73 0 73 2L121 226L169 449Q169 450 213 450H256L249 421Q248 417 247 412T246 404T245 398T244 394T244 392Q250 398 261 407T307 433T379 454H392H400Q451 454 472 439Q482 434 489 427T500 412T506 399T510 388L511 384Q511 384 517 388Q563 431 620 446Q648 455 680 455Q790 455 790 358Q790 334 785 309Q784 304 753 156T720 2V0H627V2L634 34Q641 65 650 110T669 200T686 281T693 321Q693 379 613 379Q553 379 514 302Q503 276 486 202T457 66T443 2V0H350V2L357 34Q364 65 373 110T392 200T409 281T416 321",120367:"416 321Q416 379 336 379Q276 379 237 302Q226 276 209 202T180 66T166 2V0H119Q73 0 73 2L121 226L169 449Q169 450 213 450H256L249 421Q248 417 247 412T246 404T245 398T244 394T244 392Q250 398 261 407T307 433T379 454H392Q416 454 433 452T470 440T502 411T513 358Q513 334 508 309Q507 304 476 156T443 2V0H350V2L357 34Q364 65 373 110T392 200T409 281T416 321",120368:"69 169Q69 238 107 306T211 417T348 461Q419 461 471 412T523 271Q523 161 438 75T247 -11Q170 -11 120 39T69 169ZM432 279Q432 338 401 361T333 385Q280 385 240 352T182 273T164 178Q164 119 195 94T265 68Q306 68 344 94Q380 115 406 169T432 279",120369:"259 443Q251 405 251 404L260 409Q269 414 286 421T324 436T375 449T434 455Q482 455 510 417T538 303Q538 169 463 79T302 -11Q226 -11 176 39V36Q175 35 151 -80L127 -193Q127 -194 80 -194H34V-191L102 127L169 443Q169 444 214 444T259 443ZM269 65Q332 65 386 124T441 262Q441 304 422 334T370 373Q356 375 339 375Q293 375 238 331L193 118Q200 103 206 94T229 75T269 65",120370:"72 149Q72 272 146 363T304 455Q340 455 371 442T409 423T436 398Q438 411 442 427L448 455H538L400 -193Q400 -194 354 -194Q307 -194 307 -193L356 37V41Q355 41 350 38T332 27T302 13Q247 -10 191 -10H179Q138 -10 105 32T72 149ZM414 298Q402 376 341 376Q277 376 223 317T169 182Q169 121 198 93T265 65Q319 65 365 111L377 123L414 298",120371:"240 377L244 380Q248 384 255 390T272 404T296 419T325 434T361 446T401 454Q403 454 408 454T416 455H424L421 442Q419 435 413 405T406 373Q351 373 294 336T216 237Q213 231 201 173T178 60T164 2V0H119Q74 0 74 2L122 226L170 449Q170 450 213 450H255L247 414Q246 409 245 403T243 393T241 385T240 379T240 377",120372:"99 299Q99 318 106 341T133 393T195 441T298 461Q336 461 370 453T420 437L436 429Q436 428 421 389T405 350Q356 386 273 386H265Q248 386 237 384T211 371T191 337Q189 329 189 326Q189 320 190 315T194 306T200 299T209 293T218 289T228 285T239 283T251 281T263 278L270 276Q278 275 283 274T298 270T316 264T333 255T351 243T367 228T380 209T388 186T391 157Q391 96 341 43T193 -11Q171 -11 150 -8T114 -1T84 9T61 19T45 28T35 33Q35 36 67 116L76 109Q132 67 211 67Q258 67 279 88T301 135Q301 159 280 170T224 187T180 197Q141 212 120 239T99 299",120373:"245 68Q267 68 289 75T322 90L334 98Q338 94 338 28V24L324 19Q268 -4 218 -8Q198 -11 177 -11Q118 -11 118 75Q118 98 123 127Q125 137 149 251T174 369Q174 371 135 371H97V373L105 410L112 444H152L192 445L200 478Q208 512 213 541L219 571H261Q303 571 303 570T290 506L276 444H343Q410 444 410 443Q410 440 403 407T395 371H328Q261 371 261 369Q211 152 211 118Q211 68 245 68",120374:"166 -10H160Q146 -10 137 -8T115 0T97 22T90 63Q90 79 130 268L167 443Q167 444 214 444Q260 444 260 443L224 273Q187 97 187 86Q187 70 202 65T250 59Q303 59 336 83T379 139Q380 143 412 292T444 443Q444 444 491 444Q537 444 537 443T491 225T443 2V0H353V2L361 38L352 34Q344 29 326 22T286 7T232 -5T166 -10",120375:"177 6L108 442V444H201V442Q202 441 213 371T235 213T246 90V65Q259 117 429 406L450 444H495Q540 444 540 443Q539 442 411 221L282 1L230 0H178L177 6",120376:"148 5Q147 8 128 222T109 440L108 444H199V442Q200 441 204 385T214 253T219 140Q219 108 215 76Q215 72 214 67V65L215 66Q219 95 278 221L390 444H475V437Q497 203 497 121Q497 90 494 70Q494 67 494 67L496 73Q520 143 654 405L674 444H718Q762 444 762 443L534 1L483 0H432V5Q429 28 422 126T413 283Q413 343 416 370L417 378Q416 377 416 376Q401 303 248 12L242 0H148V5",120377:"317 229Q453 9 460 0H409L359 1L312 88Q266 176 265 176Q265 177 254 165T223 132T182 88L100 0H1L15 14Q29 28 61 59T118 115L236 229L226 244Q108 433 100 444H201L290 294L438 444H537L528 435Q526 432 512 418T468 376T418 327L317 229",120378:"11 -117L20 -120Q28 -124 46 -128T84 -132H100Q124 -122 149 -85Q200 -6 200 1Q200 17 155 204T109 442Q109 444 156 444H203Q203 443 208 419T221 357T235 277T248 190T254 114Q254 81 250 67V65Q251 65 251 67Q256 94 297 177Q339 259 422 397L450 444H540Q540 443 386 186T219 -90Q179 -153 145 -179T73 -205Q52 -205 34 -202Q29 -202 21 -201T7 -198L1 -197Q1 -196 6 -157T11 -117",120379:"129 408L136 444H315Q494 444 494 443Q494 441 489 419L484 396L164 76L291 77Q418 77 418 76T411 41T402 2V0H215Q28 0 28 2L34 27L38 50L360 371L240 370Q121 370 121 371Q124 388 129 408",120432:"191 76Q212 75 220 68T229 38Q229 10 208 1H129H80Q48 1 38 7T28 38Q28 51 29 57T40 69T70 76Q89 76 89 78Q90 79 117 205T173 461T205 599Q212 623 250 623H262H273Q312 623 319 599Q322 591 350 461T406 205T435 78Q435 76 454 76H458Q484 76 493 59Q496 53 496 38Q496 11 478 3Q474 1 395 1H317Q295 8 295 38Q295 65 311 73Q316 75 333 76L348 77V78Q348 80 341 112L334 143H190L183 112Q176 80 176 78Q175 76 178 76Q180 76 191 76ZM318 221Q313 238 288 366T263 519Q263 526 262 527Q261 527 261 520Q261 493 236 365T206 221Q206 219 262 219T318 221",120433:"39 1Q17 10 17 32V38V46Q17 65 34 73Q40 76 61 76H84V535H61H54Q27 535 19 553Q17 557 17 573Q17 583 17 587T23 599T39 610Q40 611 179 611Q320 610 332 607Q332 607 339 605Q394 591 427 547T461 454Q461 413 436 378T369 325L358 320Q405 311 443 270T482 169Q482 112 445 64T345 3L334 1H39ZM309 533Q302 535 234 535H168V356H230Q284 357 296 358T323 368Q346 380 361 402T377 452Q377 482 358 505T309 533ZM398 176Q396 218 371 246T315 279Q310 280 237 280H168V76H239Q316 77 327 81Q329 82 334 84Q398 107 398 176",120434:"40 305Q40 437 110 529T281 622Q315 622 343 611T387 589T404 578Q409 585 415 596T425 611T435 618T452 622Q472 622 478 609T485 566Q485 559 485 540T484 508V460Q484 413 478 403T442 393Q417 393 409 402Q400 409 400 420Q400 428 395 445T380 487T347 528T295 546Q235 546 180 483T124 306Q124 245 141 197T186 121T241 80T296 66Q346 66 373 103T400 178Q400 209 435 209H442H450Q484 209 484 172Q480 96 421 43T281 -11Q177 -11 109 84T40 305",120435:"38 1Q16 8 16 38Q16 62 32 73Q39 76 58 76H78V535H58Q40 535 32 538Q16 548 16 573Q16 587 17 591Q23 604 34 607T83 611H166H176Q188 611 209 611T239 612Q299 612 337 597T415 530Q485 438 485 300Q485 180 431 100T301 3L291 1H38ZM400 301Q400 363 385 410T346 482T303 519T267 534Q261 535 210 535H162V76H214L267 77Q323 89 361 148T400 301",120436:"374 271Q374 241 367 232T332 223Q307 223 299 231Q290 240 290 263V279H173V76H418V118V144Q418 167 426 176T460 186Q491 186 500 166Q502 161 502 93V52Q502 25 499 17T480 1H41Q19 9 19 32V38Q19 63 36 73Q42 76 65 76H89V535H65H55Q44 535 38 537T25 548T19 573Q19 602 41 610H47Q53 610 63 610T88 610T121 610T160 611T204 611T251 611H458Q460 609 465 606T471 602T475 598T478 593T479 586T480 576T480 562V526V488Q480 452 462 444Q458 442 438 442Q413 442 405 450Q398 457 397 463T396 501V535H173V355H290V371Q290 394 299 403T332 412Q363 412 372 392Q374 387 374 317V271",120437:"384 260Q384 230 377 221T342 212Q317 212 309 220Q300 229 300 252V268H179V76H249Q264 67 267 61T271 38Q271 10 249 1H44Q22 9 22 32V38Q22 63 39 73Q45 76 69 76H95V535H69H59Q42 535 32 542T22 573Q22 602 44 610H50Q56 610 66 610T91 610T125 610T164 611T208 611T257 611H468Q470 609 475 606T481 602T485 598T488 593T489 586T490 576T490 562V526V488Q490 452 472 444Q468 442 448 442Q423 442 415 450Q408 457 407 463T406 501V535H179V344H300V360Q300 383 309 392T342 401Q373 401 382 381Q384 376 384 306V260",120438:"38 306Q38 447 105 534T261 622Q280 622 298 618T329 608T350 596T366 585L371 581Q373 581 377 591T390 612T417 622Q437 622 443 609T450 566Q450 559 450 540T449 508V460Q449 413 443 403T407 393Q392 393 386 394T373 402T364 426Q360 472 335 509T271 546Q214 546 168 477T121 308Q121 210 164 138T271 65Q293 65 310 78T337 109T352 147T360 180T362 195Q362 196 333 196L304 197Q282 204 282 227V234Q282 247 282 251T288 261T304 272H474Q488 263 492 256T496 234Q496 211 479 199Q475 197 461 196H449V21Q441 6 434 3T412 -1H407H402Q385 -1 379 3T364 28Q350 14 322 2T260 -11Q173 -11 106 76T38 306",120439:"16 571Q16 597 27 604T74 611H125H208Q223 602 226 596T230 573Q230 559 227 551T217 540T204 536T186 535H165V356H359V535H338H333Q306 535 297 552Q295 556 295 573Q295 586 295 590T301 600T317 611H486Q501 602 504 596T508 573Q508 559 505 551T495 540T482 536T464 535H443V76H464H470Q482 76 489 75T502 64T508 38Q508 10 486 1H317Q306 5 301 11T296 21T295 38V44Q295 66 311 73Q318 76 338 76H359V280H165V76H186H192Q204 76 211 75T224 64T230 38Q230 10 208 1H39Q28 5 23 11T18 21T17 38V44Q17 66 33 73Q40 76 60 76H81V535H60Q45 535 38 536T24 545T16 571",120440:"400 76Q431 76 441 69T452 38Q452 29 452 26T450 18T443 9T430 1H95Q84 6 79 12T73 23T72 38Q72 65 90 73Q96 76 157 76H220V535H157H124Q93 535 83 542T72 573Q72 603 93 610Q97 611 264 611H430Q432 609 436 607T444 602T449 594Q452 588 452 573Q452 546 434 538Q428 535 367 535H304V76H367H400",120441:"202 543T202 573T224 610H228Q231 610 237 610T251 610T269 610T291 611T315 611T342 611H457Q471 602 475 595T479 573Q479 549 462 538Q454 535 432 535H408V328Q408 159 408 133T402 93Q386 48 340 19T229 -11Q158 -11 108 16T57 100Q57 129 73 141T108 154Q128 154 143 140T159 102Q159 93 155 79Q188 65 228 65H230Q290 65 318 106Q323 115 323 139T324 329V535H274L224 536Q202 543 202 573",120442:"18 549T18 573T29 604T70 611H118H193Q207 603 210 596T214 573Q214 549 198 538Q191 535 172 535H152V421Q152 344 152 326T153 309L242 422L329 534Q327 535 322 536T314 538T308 542T303 548T300 558T298 573Q298 600 316 608Q322 611 392 611H463Q477 602 481 595T485 573Q485 535 446 535H441H420L281 357L436 77L454 76Q473 75 478 73Q495 62 495 38Q495 10 473 1H345Q334 5 329 11T324 21T323 38Q323 51 324 56T332 68T355 77L233 296L152 192V76H172Q191 76 198 73Q214 63 214 38Q214 9 193 1H41Q18 8 18 38Q18 61 35 73Q42 76 61 76H81V535H61Q42 535 35 538Q18 549 18 573",120443:"27 594Q34 605 43 608T84 611H154H213Q258 611 269 605T281 573Q281 546 263 538Q257 535 222 535H185V76H404V118V145Q404 168 411 177T446 186H453Q478 186 486 167Q488 161 488 93V50Q488 24 485 17T466 1L258 0H147H99Q47 0 36 6T25 38Q25 59 35 69Q44 76 76 76H101V535H76H64Q36 535 27 552Q25 557 25 573T27 594",120444:"50 535Q37 536 31 537T18 547T12 573Q12 598 22 604T62 611H91H121Q147 611 158 607T178 587Q183 579 222 446T261 293Q261 289 262 288Q263 288 263 292Q263 311 298 434T346 588Q353 603 365 607T402 611H435H450Q488 611 500 605T512 573Q512 556 506 547T493 537T474 535H459V76H474Q487 75 493 74T505 64T512 38Q512 11 494 3Q490 1 424 1H386Q355 1 345 7T335 38Q335 55 341 64T354 74T373 76H388V302Q388 512 387 519Q382 482 346 359T304 228Q292 204 262 204T220 228Q215 237 179 359T137 519Q136 512 136 302V76H151Q164 75 170 74T182 64T189 38Q189 11 171 3Q167 1 101 1H63Q32 1 22 7T12 38Q12 55 18 64T31 74T50 76H65V535H50",120445:"20 571Q20 598 30 604T73 611H105H136Q152 611 160 611T177 607T189 601T198 587T206 568T217 537T231 497Q354 142 365 95L368 84V535H347H342Q314 535 306 552Q304 556 304 573Q304 586 304 590T310 600T326 611H482Q497 602 500 596T504 573Q504 559 501 551T491 540T478 536T460 535H439V25Q432 7 424 4T389 0H374Q334 0 322 31L293 115Q171 468 159 517L156 528V76H177H183Q195 76 202 75T215 64T221 38Q221 10 199 1H43Q32 5 27 11T22 21T21 38V44Q21 66 37 73Q44 76 64 76H85V535H64Q49 535 42 536T28 545T20 571",120446:"102 588Q140 621 240 621Q323 621 335 620Q393 613 422 588Q450 560 459 493T468 306Q468 185 460 118T422 23Q382 -10 289 -10H262H235Q142 -10 102 23Q74 50 65 118T56 306Q56 427 64 494T102 588ZM363 513Q357 523 347 530T324 540T302 544T280 546H268Q192 546 167 521Q150 501 145 452T140 300Q140 235 142 197T151 130T172 89T207 71T262 65Q317 65 341 81T374 144T384 300Q384 474 363 513",120447:"41 1Q19 9 19 32V38Q19 63 36 73Q42 76 65 76H89V535H65H55Q38 535 29 543T19 576Q19 603 41 610H49Q57 610 70 610T100 610T136 611T175 611Q190 611 216 611T255 612Q321 612 363 598T441 537Q480 486 480 427V421Q480 354 447 311T378 251Q339 230 275 230H239H173V76H197Q220 76 227 73Q244 62 244 38Q244 10 222 1H41ZM396 421Q396 461 369 491T300 533Q294 534 233 535H173V306H233Q294 307 300 308Q345 319 370 352T396 421",120448:"56 306Q56 380 58 426T68 510T87 568T120 600T170 617T240 621Q323 621 335 620Q393 613 422 588Q450 560 459 493T468 306Q468 124 447 66Q433 23 394 6L424 -53Q454 -112 454 -118Q454 -128 441 -138H377Q367 -135 363 -129T333 -69L304 -11H254Q205 -10 180 -8T128 6T91 36T70 92T58 178T56 306ZM227 151Q227 171 262 171H276H281Q292 171 296 171T305 170T313 165T317 158T323 145T332 127L353 88Q356 88 361 95T372 131T382 202Q384 228 384 306Q384 452 371 492T304 544Q296 545 251 545Q230 545 215 543T188 534T169 520T155 497T147 466T143 423T141 371T140 306Q140 248 141 217T146 154T157 109T178 83T212 68T262 65H266L264 70Q261 75 256 85T247 105Q227 145 227 151",120449:"16 571Q16 598 27 605T76 612Q84 612 108 612T148 611Q268 611 294 605Q346 592 389 550T432 440Q432 394 410 359Q393 329 366 310L358 303Q387 273 399 239Q405 219 405 178T408 106T421 68Q426 65 428 65Q433 65 435 74T438 96T441 112Q450 130 480 130H485Q519 130 522 100Q522 79 516 56T488 11T434 -11Q421 -11 408 -8T377 5T344 37T324 93Q322 101 322 154L321 209Q304 257 257 267Q252 268 207 268H165V76H186H192Q204 76 211 75T224 64T230 38Q230 10 208 1H39Q28 5 23 11T18 21T17 38V44Q17 66 33 73Q40 76 60 76H81V535H60Q45 535 38 536T24 545T16 571ZM348 440Q348 478 321 502T260 532Q252 534 208 535H165V344H208Q212 344 223 344T239 345T252 346T266 348T278 351T293 358Q348 387 348 440",120450:"52 454Q52 524 107 572T229 621Q266 621 274 620Q326 610 360 588L371 581Q377 594 379 598T386 610T397 619T412 622Q433 622 439 610T446 570Q446 563 446 545T445 515V479Q445 441 444 432T436 417Q428 408 403 408T370 417Q361 424 361 434Q361 439 360 448T351 476T331 509T295 535T238 546Q194 546 163 522T132 458Q132 435 148 412Q155 401 166 393T192 380T218 371T247 364T270 359Q341 342 349 339Q389 325 418 296T461 229Q472 201 472 164Q469 92 417 41T287 -11Q240 -11 200 -1T143 19L126 29Q117 6 109 -2Q100 -11 84 -11Q64 -11 58 1T51 42Q51 49 51 66T52 95V135Q52 173 53 180T61 194Q70 203 95 203Q119 203 127 194Q136 186 136 168Q143 66 284 66H290Q325 66 350 85Q391 115 391 165Q391 204 369 228T322 260Q320 260 255 275T185 293Q123 309 88 355T52 454",120451:"129 38Q129 51 129 55T135 65T151 76H220V535H110V501Q110 470 109 464T101 450Q93 442 68 442H60Q37 442 28 461Q26 466 26 527L27 589Q36 607 49 610H55Q61 610 72 610T97 610T131 610T170 611T215 611T264 611H476Q478 609 483 606T489 602T493 598T496 593T497 586T498 576T498 562V526V488Q498 452 480 444Q476 442 456 442Q431 442 423 450Q416 457 415 463T414 501V535H304V76H374Q389 67 392 61T396 38Q396 10 374 1H151Q140 5 135 11T130 21T129 38",120452:"-3 573Q-3 597 8 604T50 612Q57 612 77 612T111 611H200Q214 602 218 595T222 573Q222 549 205 538Q198 535 175 535H151V359Q151 333 151 291Q152 177 156 162Q157 160 157 159Q165 123 193 95T262 66Q303 66 330 94T367 159Q371 175 371 191T373 359V535H349H339Q328 535 322 537T309 548T303 573T306 595T325 611H506Q520 602 524 595T528 573Q528 549 511 538Q504 535 481 535H457V364Q457 189 456 182Q448 101 394 45T262 -11Q189 -11 132 43T68 182Q67 189 67 364V535H43H33Q22 535 16 537T3 548T-3 573",120453:"19 578Q19 585 20 590T23 598T29 604T38 608T48 610T62 611T78 612T97 611T119 611H195Q210 602 213 596T217 573Q217 561 216 555T206 542T179 535H164Q166 529 188 435T235 231T261 94L262 84V88Q263 91 263 94Q265 121 289 231T336 438L360 535H345Q308 535 308 566V573Q308 586 308 590T314 600T330 611H484Q499 602 502 595T505 573Q505 560 504 554T493 541T465 535H447L384 278Q321 19 319 14Q309 -7 278 -7H262H246Q215 -7 205 14Q203 19 140 278L78 535H59Q45 535 38 536T25 547T19 573V578",120454:"459 611Q491 611 501 605T512 573Q512 538 482 535H474L439 276Q406 26 402 11Q398 2 389 -3Q387 -3 386 -4L380 -7H359H349Q324 -7 313 13Q307 29 285 139T263 275Q263 283 262 283Q261 282 261 274Q261 248 239 137T211 13Q200 -7 175 -7H165H144Q136 -3 127 3Q121 10 117 36T85 276L50 535H42Q26 536 19 545T12 564V573Q12 603 33 610Q37 611 101 611H134Q165 611 175 604T186 573Q186 563 186 559T182 547T169 538T143 535H122V531Q124 517 133 446T155 266T172 96V84L173 102Q176 157 192 243T215 346Q227 367 259 367H262H265Q297 367 309 346Q316 329 332 243T351 102L352 84V96Q356 161 368 266T390 444T402 531V535H381Q366 535 359 536T345 547T338 573Q338 600 356 608Q362 611 425 611H459",120455:"39 571Q39 597 49 604T93 611H141H218Q233 602 236 595T239 573Q239 538 210 535Q202 535 202 534T215 507T243 454L257 428L307 535H298Q266 538 266 573Q266 584 267 588T273 598T289 611H366H401Q442 611 454 605T466 573Q466 546 448 538Q442 535 421 535H398L299 327Q299 323 362 201L426 77L449 76Q467 76 475 75T489 65T495 38Q495 11 477 3Q473 1 395 1H317Q295 8 295 38Q295 73 325 76L334 77Q333 78 314 117T276 196L257 235L239 196Q221 157 204 118T186 77Q190 76 196 76Q211 74 218 67T227 55T228 38Q228 28 227 24T221 13T206 1H50Q28 9 28 32V38Q28 63 45 73Q51 76 73 76H96L214 324Q215 327 162 431L108 535H85H79Q67 535 60 536T46 546T39 571",120456:"20 573Q20 597 30 604T72 611H121H198Q212 602 216 595T220 573Q220 568 219 563T217 555T214 549T211 544T207 541T203 538T198 537T194 536T190 536L188 535Q179 535 179 534L188 516Q196 497 208 470T232 415T252 363T261 332Q261 329 262 329T263 332Q263 354 333 508L345 534Q345 535 336 535Q305 538 305 567V573Q305 589 308 595T327 611H483Q505 598 505 573Q505 549 488 538Q481 535 460 535H438L304 245V76H325H331Q343 76 350 75T363 64T369 38Q369 10 347 1H178Q167 5 162 11T157 21T156 38V44Q156 66 172 73Q180 76 199 76H220V245L86 535H64Q44 535 36 538Q20 548 20 573",120457:"71 1Q60 5 55 11T49 23T48 39V46Q48 56 58 73T131 183Q171 242 197 282L366 535H144V501Q144 470 143 464T135 450Q127 442 102 442H94Q71 442 62 461Q60 466 60 527L61 589Q70 607 83 610H88Q93 610 102 610T124 610T154 610T188 611T227 611T270 611H454Q456 609 461 606T467 601T471 597T474 591T475 584T476 572V565Q476 555 466 538T393 428Q353 369 327 329L158 76H397V120V146Q397 169 405 179T439 189Q470 189 479 169Q481 164 481 95V48Q481 24 478 16T459 1H71",120458:"126 306Q105 306 90 321T74 359Q74 439 211 439Q268 439 276 438Q343 426 383 390T430 306Q431 301 431 190V81Q446 79 465 78T492 76T509 72T521 60T524 38Q524 11 506 3Q502 1 466 1Q426 1 406 5T379 14T355 36L345 30Q284 -6 205 -6Q135 -6 92 39T48 141Q48 182 79 212T158 256T252 278T342 285H347V290Q347 315 325 335T267 362Q258 363 224 363Q189 363 185 362H179L178 358Q178 353 178 352T176 345T174 337T170 330T165 322T158 316T150 311T139 308T126 306ZM132 140Q132 115 157 93T224 70Q269 70 302 87T344 133Q346 139 347 175V211H339Q256 209 194 190T132 140",120459:"4 573Q4 596 15 603T52 611H90H124Q146 611 155 608T171 591Q173 586 173 491V396L182 402Q217 424 256 431Q280 437 309 437Q376 437 434 379T492 217Q492 162 473 118T422 47T358 8T293 -6Q229 -6 174 38Q171 13 163 7T135 1H131H122Q99 1 90 23L89 279V535H58L27 536Q4 543 4 573ZM409 215Q409 269 377 315T283 361Q255 361 224 344T177 297L173 290V167Q189 124 213 97T278 70Q330 70 369 111T409 215",120460:"291 -6Q196 -6 131 60T66 216Q66 296 119 361Q154 403 200 421T273 439Q275 440 293 440H313Q400 440 433 409Q454 388 454 359Q454 335 439 321T402 306Q380 306 365 321T350 357V362L340 363Q339 363 326 363T303 364Q280 364 266 362Q217 352 184 313T151 215Q151 153 199 112T313 70Q341 70 357 85T381 118T394 140Q402 146 424 146Q443 146 447 144Q466 137 466 117Q466 106 457 88T429 47T374 10T291 -6",120461:"266 573Q266 596 277 603T314 611H352H385Q411 611 419 607T435 586V76H498Q512 67 516 60T520 38Q520 9 498 1H436Q429 1 417 1T398 0Q375 0 363 7T351 34V43L342 36Q288 -6 223 -6Q143 -6 87 58T31 216Q31 307 88 372T230 437Q292 437 342 405L351 399V535H320L289 536Q266 543 266 573ZM351 290Q347 302 337 316T302 346T244 361Q193 361 154 319T115 215Q115 152 152 111T235 70Q314 70 351 170V290",120462:"48 217Q48 295 100 361T248 439L258 440Q268 440 274 440Q329 438 369 416T428 359T456 292T464 228Q464 215 461 208T454 198T442 190L288 189H135L138 179Q153 132 199 102T303 71Q336 71 353 86T380 120T398 143Q404 146 422 146Q453 146 462 126Q464 120 464 116Q464 84 416 39T285 -6Q187 -6 118 59T48 217ZM377 264Q371 291 365 306T341 338T294 362Q288 363 264 363Q225 363 190 336T139 264H377",120463:"43 395Q44 405 44 408T47 416T53 423T66 431H176V461Q176 500 182 518Q201 570 252 593T353 617Q399 614 418 593T437 548Q437 528 424 514T387 499Q365 499 353 511T338 537V541H328Q275 536 261 494Q260 490 260 460V431H327Q334 431 346 431T364 432Q392 432 404 425T416 393T405 362T365 355H327H260V76H319Q375 76 388 71T401 38Q401 27 400 23T395 12T379 1H58Q47 6 42 12T36 23T35 38Q35 65 53 73Q59 76 117 76H176V355H121H93Q64 355 54 362T43 395",120464:"60 274Q60 337 107 386T233 436Q278 436 316 417L329 410L338 416Q384 442 427 442T489 423T509 381T494 345T460 332Q449 332 440 338Q432 341 427 348T419 360T415 365Q414 364 410 364L383 355Q406 320 406 274Q406 211 358 162T233 112Q189 112 155 128L146 133Q142 125 142 115Q142 99 150 85T175 71Q182 72 187 70Q188 70 195 70T218 70T254 69Q259 69 275 69T297 69T318 68T340 66T361 62T384 57T405 49T428 38Q495 -1 495 -76Q495 -143 427 -186T262 -229Q161 -229 94 -185T29 -73Q30 -60 33 -48T39 -26T47 -8T57 8T67 20T77 30T86 38L91 43Q91 44 86 53T75 80T70 117Q70 142 89 183L83 194Q60 232 60 274ZM321 274Q321 312 296 337T230 362Q197 362 171 338T145 274Q145 235 170 211T233 187Q273 187 297 212T321 274ZM422 -78Q422 -54 408 -38T366 -15T315 -6T255 -4H200Q198 -4 193 -4T183 -3Q148 -3 125 -26T102 -78Q102 -110 151 -132T261 -154Q321 -154 371 -132T422 -78",120465:"4 573Q4 596 15 603T52 611H90H124Q146 611 155 608T171 591Q173 586 173 489Q173 394 175 394L186 402Q197 410 219 420T269 434Q278 436 306 436Q343 436 371 423Q411 402 423 365T436 265Q436 257 436 239T435 211V198V76H498Q512 67 516 60T520 38Q520 9 498 1H308Q286 10 286 32V38V46Q286 65 303 73Q309 76 329 76H351V188Q351 204 351 230T352 266Q352 321 341 341T288 361Q253 361 222 341T176 274L174 264L173 170V76H236Q250 67 254 60T258 38Q258 9 236 1H27Q4 8 4 38Q4 53 8 60T27 76H89V535H58L27 536Q4 543 4 573",120466:"202 538T202 559T218 596T260 612Q283 612 300 597T317 560Q317 538 300 523T260 507Q235 507 219 522ZM411 76Q441 76 451 69T462 38Q462 29 462 26T460 18T453 9T440 1H94Q72 8 72 33V38Q72 46 72 49T74 58T81 68T94 76H233V355H167L102 356Q80 363 80 393Q80 418 91 425T138 432Q145 432 165 432T200 431H295Q297 429 303 425T310 420T314 415T317 404T317 389T318 363Q318 354 318 314T317 241V76H378H411",120467:"261 559Q261 580 277 596T319 612Q342 612 359 597T376 560T360 523T320 507Q296 507 279 523T261 559ZM75 -91T100 -91T138 -107T152 -144V-150L160 -151H193H203Q241 -151 267 -121Q284 -97 288 -73T292 23V151V355H218L145 356Q123 365 123 387V393Q123 422 145 430H148Q151 430 156 430T169 430T185 430T205 431T227 431T251 431H354Q356 430 360 427T365 424T369 420T372 416T373 410T375 402T376 391T377 376T377 356Q377 345 377 286T376 176Q376 -67 371 -88Q362 -123 342 -151T299 -194Q254 -228 180 -228Q84 -226 56 -177Q49 -162 48 -148Q48 -122 61 -107",120468:"13 42Q13 63 23 69T69 76H102V535H69H54Q34 535 24 542T13 573Q13 588 15 593Q22 605 29 608T56 611H95Q113 611 122 611T140 610T152 609T159 607T163 603T167 597T173 589V413L174 237L295 355H275Q260 355 253 356T239 367T232 393Q232 419 243 425T304 431H359H464Q479 422 482 415T485 393Q485 364 464 356L431 355H398L293 254L427 76H486Q501 67 504 60T507 38Q507 28 507 24T501 12T486 1H314Q292 8 292 38Q292 62 308 73Q312 75 326 76L338 77L290 140Q279 154 267 171T248 196L242 204L207 171L173 139V76H206H221Q241 76 251 69T262 38Q262 11 244 3Q240 1 138 1Q123 1 100 1T70 0Q32 0 23 7T13 42",120469:"51 573Q51 602 73 610H76Q79 610 84 610T97 610T113 610T133 611T155 611T179 611H282Q301 598 304 586V76H452Q466 67 470 60T474 38Q474 10 452 1H73Q51 9 51 32V38Q51 54 54 60T73 76H220V535H146L73 536Q51 545 51 567V573",120470:"133 76Q156 74 164 67T172 38Q172 9 151 1H11Q-12 8 -12 38Q-12 61 5 73Q10 75 28 76H45V355H28Q10 356 5 358Q-12 370 -12 393Q-12 419 11 431H52H70Q91 431 100 427T116 405Q163 436 200 436Q255 436 281 390L285 394Q289 398 292 400T301 407T314 415T329 423T346 429T366 434T389 436H392Q425 436 448 411Q469 390 474 360T480 268V232V203V76H497Q520 74 528 67T536 38Q536 9 515 1H396Q374 9 374 32V38Q374 73 402 76H409V191V242Q409 317 404 339T375 361Q343 361 323 332T299 264Q298 258 298 165V76H315Q338 74 346 67T354 38Q354 9 333 1H214Q192 9 192 32V38Q192 73 220 76H227V191V242Q227 317 222 339T193 361Q161 361 141 332T117 264Q116 258 116 165V76H133",120471:"89 431Q94 431 105 431T122 432Q173 432 173 399Q173 394 175 394Q176 394 190 404T233 425T298 436Q343 436 371 423Q411 402 423 365T436 265Q436 257 436 239T435 211V198V76H498Q512 67 516 60T520 38Q520 9 498 1H308Q286 9 286 32V38V45Q286 65 303 73Q309 76 329 76H351V188Q351 204 351 230T352 266Q352 321 341 341T288 361Q253 361 222 341T176 274L174 264L173 170V76H236Q250 67 254 60T258 38Q258 9 236 1H27Q4 8 4 38Q4 53 8 60T27 76H89V355H58L27 356Q4 363 4 393Q4 408 8 415T27 431H89",120472:"52 216Q52 318 118 379T261 440Q343 440 407 378T472 216Q472 121 410 58T262 -6Q176 -6 114 58T52 216ZM388 225Q388 281 351 322T261 364Q213 364 175 325T136 225Q136 158 174 114T262 70T350 114T388 225",120473:"89 431Q93 431 104 431T121 432Q173 432 173 401V396L182 402Q237 437 305 437Q376 437 434 378T492 217Q492 146 459 93T382 17T291 -6Q261 -6 232 5T188 26L174 37Q173 37 173 -54V-146H236Q250 -155 254 -162T258 -184Q258 -213 236 -221H27Q4 -214 4 -184Q4 -169 8 -162T27 -146H89V355H58L27 356Q4 363 4 393Q4 408 8 415T27 431H89ZM409 215Q409 269 377 315T283 361Q255 361 224 344T177 297L173 290V167Q189 124 213 97T278 70Q330 70 369 111T409 215",120474:"34 215Q34 309 91 368T222 436Q224 436 231 436T242 437Q309 437 372 390V401Q372 419 381 428T414 437Q426 437 432 436T444 430T456 412V-146H489H504Q524 -146 534 -153T545 -184Q545 -211 527 -219Q523 -221 414 -221Q398 -221 374 -221T342 -222Q304 -222 294 -216T283 -184Q283 -157 301 -149Q307 -146 339 -146H372V-51Q372 43 371 43L364 38Q357 33 345 26T318 12T280 -1T236 -6Q155 -6 95 55T34 215ZM117 215Q117 152 157 111T250 70Q289 70 318 92T363 146Q372 163 372 192V215L371 263Q339 360 254 360Q206 360 162 321T117 215",120475:"327 76Q359 76 369 70T380 38Q380 10 359 1H47Q24 8 24 38Q24 54 28 61T47 76H145V355H96L47 356Q24 363 24 393Q24 409 28 416T47 431H207Q223 419 226 414T229 393V387V369Q297 437 394 437Q436 437 461 417T487 368Q487 347 473 332T438 317Q428 317 420 320T407 327T398 337T393 347T390 356L388 361Q348 356 324 345Q228 299 228 170Q228 161 228 151T229 138V76H293H327",120476:"72 317Q72 361 108 396T229 439Q231 439 245 439T268 440Q303 439 324 435T353 427T363 423L372 432Q380 440 397 440Q430 440 430 395Q430 390 430 380T429 366V335Q429 311 422 302T387 293Q364 293 355 300T346 316T343 336T325 353Q306 364 257 364Q209 364 178 351T147 317Q147 284 231 272Q327 256 357 247Q458 210 458 129V121Q458 74 413 34T271 -6Q246 -6 224 -3T189 5T165 14T150 22T144 26Q142 23 139 18T135 11T132 6T128 1T124 -2T119 -4T113 -5T104 -6Q84 -6 78 6T71 43Q71 48 71 60T72 79Q72 132 73 141T81 157Q90 166 115 166Q135 166 142 162T157 140Q168 108 191 90T260 70Q297 70 323 76T361 91T379 110T384 129Q384 157 346 171T247 195T165 212Q119 228 96 256T72 317",120477:"25 395Q26 405 26 408T29 416T35 423T48 431H145V481L146 532Q154 547 161 550T184 554H189Q218 554 227 534Q229 529 229 480V431H405Q406 430 411 427T418 422T422 416T426 407T427 393Q427 387 427 382T424 374T421 368T417 363T413 360T408 358L405 356L317 355H229V249Q229 237 229 214T228 179Q228 126 241 98T295 70Q354 70 365 149Q366 167 375 174Q383 182 407 182H415Q438 182 446 166Q448 161 448 148Q448 84 398 39T282 -6Q226 -6 189 29T146 128Q145 134 145 247V355H96H72Q45 355 35 362T25 395",120478:"4 393Q4 416 15 423T52 431H90Q141 431 151 429T168 417Q171 412 173 409V254L174 100Q182 70 244 70Q320 70 344 119Q349 130 350 144T351 248V355H320L289 356Q266 363 266 393Q266 408 270 415T289 431H351H386Q409 431 418 428T433 411Q435 406 435 241V76H498Q512 67 516 60T520 38Q520 9 498 1H436H394Q372 1 364 5T351 26L342 21Q293 -5 227 -5Q118 -5 96 67Q91 82 90 101T89 227V355H58L27 356Q4 363 4 393",120479:"24 392Q24 417 36 424T79 432Q85 432 103 432T132 431H215Q229 422 233 415T237 393Q237 355 198 355H193H172L262 77L352 355H331H323Q288 355 288 393Q288 409 291 415T310 431H478Q491 423 495 416T500 393Q500 364 478 356L452 355H426L374 190Q320 24 318 20Q307 -4 273 -4H262H251Q217 -4 206 20Q204 24 150 190L98 355H72L47 356Q24 363 24 392",120480:"54 355Q16 355 16 388V393Q16 423 37 430Q41 431 125 431H162Q206 431 218 425T230 393Q230 366 212 358Q206 355 174 355Q141 355 141 354L150 296Q181 110 181 89V84Q182 85 183 96Q185 118 199 173T218 237Q223 247 245 259H264H268Q294 259 309 240Q315 229 329 174T343 92Q343 84 344 84V86Q344 88 344 91T345 97Q347 125 356 187T374 301T383 354Q383 355 350 355H333Q314 355 304 362T294 393Q294 420 312 428Q318 431 401 431H440Q485 431 496 425T508 393Q508 382 508 377T498 363T470 355L455 354Q455 353 441 271T413 104T396 16Q384 -4 355 -4H351Q315 -4 305 9T280 79Q278 90 276 96Q265 149 265 169Q265 176 264 169Q263 166 263 162Q261 130 248 79T230 18Q220 -4 183 -4H175L151 -3Q134 5 127 17L112 102Q97 188 83 270T69 354Q62 355 54 355",120481:"35 393Q35 417 46 424T89 432Q95 432 112 432T141 431H223Q238 422 241 415T244 393Q244 389 244 383T237 367T216 355Q209 355 209 354L234 319Q259 286 260 286L308 354Q308 355 301 355Q285 356 278 365T270 384L271 393Q271 420 289 428Q295 431 376 431H459Q460 430 465 427T472 422T476 416T480 407T481 393Q481 368 470 362T434 355H425H392L344 290Q295 225 295 223Q294 223 309 203T350 149L405 77L439 76H453Q474 76 484 69T495 38Q495 10 473 1H303Q281 9 281 32V38Q281 49 282 54T290 67T313 76Q324 76 324 77L259 173L197 77Q202 76 209 76Q225 75 233 68T241 55T242 38Q242 28 242 24T236 12T221 1H51Q29 9 29 32V38Q29 48 29 51T31 59T38 67T51 76H117L171 149Q224 222 224 223L124 355H90H78Q54 355 45 361T35 393",120482:"26 393Q26 417 37 424T80 431H134H217Q232 422 235 416T239 393Q239 379 236 371T226 360T214 356T197 355L179 354V353L188 330Q197 306 209 272T235 201T259 133T271 89V84L274 95Q279 122 298 185T335 300T352 354Q352 355 331 355Q312 355 304 358Q288 368 288 393Q288 408 291 415T310 431H478Q479 430 484 427T491 422T495 416T499 407T500 393Q500 376 493 367T479 357T458 355H452Q426 355 425 353Q420 337 351 124T280 -94Q240 -195 168 -220Q147 -228 125 -228Q89 -228 66 -201T42 -139Q42 -116 56 -102T93 -87Q117 -87 130 -102T144 -135V-138H126Q121 -148 121 -150T130 -152Q182 -147 207 -87Q211 -78 223 -40T236 1Q230 10 102 355H75L49 356Q26 363 26 393",120483:"56 1Q40 7 37 14T34 41Q34 59 36 64Q39 67 43 73Q65 95 191 213T341 355H133V334Q133 306 124 297Q116 289 91 289H83Q60 289 51 308Q49 313 49 361L50 409Q59 427 72 430H78Q83 430 92 430T115 430T144 430T179 431T219 431T262 431H450Q452 430 455 428T459 424T463 422T466 419T468 416T469 413T470 409T471 404T472 398T472 391Q472 374 469 368L462 358Q453 349 315 218Q210 122 164 76H391V103Q391 136 400 146Q409 155 433 155Q464 155 473 135Q475 130 475 78V46Q475 24 472 16T453 1H56",120488:"296 0Q278 3 164 3Q58 3 49 0H40V62H92Q144 62 144 64Q388 682 397 689Q403 698 434 698Q463 698 471 689Q475 686 538 530T663 218L724 64Q724 62 776 62H828V0H817Q796 3 658 3Q509 3 485 0H472V62H517Q561 62 561 63L517 175H262L240 120Q218 65 217 64Q217 62 261 62H306V0H296ZM390 237L492 238L440 365Q390 491 388 491Q287 239 287 237H390",120489:"720 510Q720 476 704 448T665 404T619 377T580 362L564 359L583 356Q602 353 632 342T690 312Q712 292 725 276Q752 235 752 189V183Q752 160 741 125Q698 18 547 2Q543 1 288 0H39V62H147V624H39V686H264H409Q502 686 542 681T624 655Q720 607 720 510ZM563 513Q563 553 548 578T518 611T486 622Q479 624 385 624H293V382H375Q458 383 467 385Q563 405 563 513ZM590 192Q590 307 505 329Q504 330 503 330L398 331H293V62H391H400H444Q496 62 528 75T580 131Q590 155 590 192",120490:"425 0L228 3Q63 3 51 0H39V62H147V618H39V680H612V676Q614 670 627 552T643 428V424H581V428Q580 430 576 461T562 524T532 576Q512 596 481 605T426 616T357 618H304V62H439V0H425",120491:"901 12Q901 7 892 0H479Q65 0 62 2Q56 6 56 11Q56 14 242 347T433 685Q438 694 450 696Q454 698 480 698H506L523 687Q526 683 711 354T899 17Q901 13 901 12ZM653 137L427 538L202 137L315 136H540L653 137",120492:"723 286Q721 284 700 145T677 3V0H39V62H147V618H39V680H660V676Q662 670 675 552T691 428V424H629V428Q629 429 627 448T618 494T601 541Q574 593 527 605T382 618H374H304V384H336Q338 384 347 384T361 384T376 386T392 390T407 397T421 407T432 423Q442 444 443 482V501H505V205H443V224Q442 258 435 278T411 307T380 318T336 322H304V62H375H394Q429 62 449 62T497 66T541 76T577 95T609 126T632 170T651 232Q661 287 661 289H723V286",120493:"80 430L92 686H358Q624 686 628 684Q638 679 638 656Q638 640 637 639Q637 638 445 353Q401 288 351 214T277 103L253 67L256 66Q258 66 265 66T279 66T298 66H343Q380 66 406 68T464 81T518 110T557 164T579 250Q583 278 583 298Q583 299 614 299H645V291Q643 281 636 150T627 8V0H353Q79 0 75 2Q64 7 64 31Q64 48 66 52L259 340L451 623Q451 624 384 624Q294 623 259 612Q155 581 143 446Q142 440 142 432V430H80",120494:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H51Q75 683 226 683Q376 683 400 686H412V624H304V388H595V624H487V686H499Q523 683 673 683Q824 683 848 686H860V624H752V62H860V0H848Q824 3 674 3Q523 3 499 0H487V62H595V326H304V62H412V0H400",120495:"629 -10T446 -10T164 89T64 340Q64 380 71 420T102 510T163 596T266 662T418 696H438Q488 696 499 695Q582 686 644 655T741 584T796 495T823 409T829 338Q829 188 729 89ZM439 645Q416 645 390 638T333 615T275 564T236 480Q221 423 221 341Q221 272 230 228Q247 144 301 94T447 43T592 93T663 228Q672 272 672 341Q672 645 439 645ZM286 242V446H348V412H545V446H607V242H545V276H348V242H286",120496:"397 0Q370 3 218 3Q65 3 38 0H25V62H139V624H25V686H38Q65 683 218 683Q370 683 397 686H410V624H296V62H410V0H397",120497:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H51Q75 683 226 683Q376 683 400 686H412V624H304V338L472 483L634 624H565V686H576Q597 683 728 683Q814 683 829 686H836V624H730L614 524Q507 432 497 422Q496 422 498 418T514 395T553 342T627 241L759 63L805 62H852V0H842Q830 3 701 3Q550 3 526 0H513V62H549Q584 62 584 63Q583 65 486 196T388 328L304 256V62H412V0H400",120498:"285 0Q267 3 154 3Q56 3 47 0H40V62H131Q131 63 167 160T244 369T321 578T359 678Q366 698 393 698H404H413Q437 698 446 678Q448 672 560 369T674 62H765V0H754Q733 3 604 3Q453 3 429 0H416V62H461L507 63L355 470Q353 468 279 265L203 63L249 62H294V0H285",120499:"314 0Q296 3 181 3T48 0H39V62H147V624H39V686H305Q316 679 323 667Q330 653 434 414L546 157L658 414Q766 662 773 674Q778 681 788 686H1052V624H944V62H1052V0H1040Q1016 3 874 3T708 0H696V62H804V341L803 618L786 580Q770 543 735 462T671 315Q540 13 536 9Q528 1 507 1Q485 1 477 9Q472 14 408 162T281 457T217 603Q215 603 215 334V62H323V0H314",120500:"314 0Q296 3 181 3T48 0H39V62H147V624H39V686H171H265Q288 686 297 686T309 684T315 679Q317 676 500 455T684 233V624H576V686H585Q603 683 718 683T851 686H860V624H752V319Q752 15 750 11Q747 4 742 2T718 0H712Q708 0 706 0T700 0T696 1T693 2T690 4T687 7T684 11T679 16T674 23Q671 27 437 311L215 579V62H323V0H314",120501:"54 465L63 674Q63 675 383 675T703 674L712 465Q712 464 681 464H650V467Q650 490 646 516T632 545Q612 550 383 550H283Q169 550 149 548T124 531Q123 530 123 529Q116 506 116 467V464H85Q54 464 54 465ZM160 256V447H222V414H544V447H606V256H544V289H222V256H160ZM57 0L48 222H110V219Q110 147 125 133Q127 130 130 129T160 127T235 126T383 126Q482 126 530 126T604 127T635 129T641 133Q656 146 656 219V222H718L709 0H57",120502:"64 339Q64 431 96 502T182 614T295 675T420 696Q469 696 481 695Q620 680 709 589T798 339Q798 173 697 82T432 -10Q262 -10 163 85T64 339ZM625 454Q618 502 600 538T562 593T515 624T469 639T431 642Q331 642 276 563Q232 493 232 353Q232 315 234 285T244 216T267 148T308 94T372 56Q405 46 432 46Q517 46 567 106T627 267Q631 299 631 353Q631 418 625 454",120503:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V618H39V680H860V618H752V62H860V0H848Q824 3 674 3Q523 3 499 0H487V62H595V618H304V62H412V0H400",120504:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H253Q435 686 470 685T536 678Q585 668 621 648T675 605T705 557T718 514T721 483T718 451T704 409T673 362T616 322T530 293Q500 288 399 287H304V62H412V0H400ZM553 475Q553 554 537 582T459 622Q451 623 373 624H298V343H372Q457 344 480 350Q527 362 540 390T553 475",120506:"766 271Q764 266 750 137T735 4V0H407Q74 0 71 4L70 5Q64 9 64 18Q64 24 82 41T213 158L359 288Q360 288 320 336T214 460Q67 633 66 635Q64 638 64 655Q64 679 75 684Q78 686 407 686H735V682Q738 676 751 558T766 434V430H735Q704 430 704 431Q704 434 703 444T696 477T681 520T654 563T613 598Q578 615 527 619T371 624H281L396 489Q506 358 513 351Q517 342 512 334Q503 325 371 208Q338 179 303 147T249 99L231 83L243 81Q258 81 364 81Q382 81 418 81T470 82T513 83T554 88T587 96T619 109T645 129Q689 173 702 260L704 274Q704 275 735 275H766V271",120507:"41 425Q41 426 51 545T62 669V675H737V669Q738 665 748 546T758 425V419H696V425Q687 517 669 555T595 607Q578 612 522 613H478V62H631V0H615Q585 3 399 3Q214 3 184 0H168V62H321V613H277H263Q164 613 134 561Q113 527 103 425V419H41V425",120508:"64 556Q69 619 114 658T224 697Q271 697 310 677T375 622T417 554T444 484L447 477V479Q456 516 473 551T516 620T582 676T670 697Q735 697 780 656T829 556Q829 539 818 532H772Q761 539 761 548Q761 571 681 571Q664 571 653 570T623 562T587 537T555 490Q536 448 531 410T525 300V210V62H660V0H646L447 3Q257 1 247 0H233V62H368V210V301Q368 373 363 410T338 490Q324 518 307 536T270 561T240 569T212 571Q132 571 132 548Q132 539 121 532H75Q64 538 64 556",120509:"609 0Q582 3 415 3T221 0H207V62H342V168L328 169Q193 180 117 241Q64 286 64 343T117 445Q193 506 328 517L342 518V624H207V686H221Q248 683 415 683T609 686H623V624H488V518L502 517Q637 506 713 445Q766 400 766 343T713 241Q637 180 502 169L488 168V62H623V0H609ZM342 219T342 343T340 467Q328 467 304 459Q277 451 261 439T237 409T228 378T226 343Q226 314 229 296T250 259T301 228Q331 219 341 219Q342 219 342 343ZM604 343Q604 365 602 379T591 413T560 446T503 464L489 467Q488 467 488 343T489 219Q499 219 529 228Q554 236 570 248T593 277T602 308T604 343",120510:"327 0Q306 3 174 3Q52 3 43 0H33V62H98L162 63L360 333L157 624H48V686H59Q80 683 217 683Q368 683 395 686H408V624H335L393 540L452 458L573 623Q573 624 528 624H483V686H494Q515 683 646 683Q769 683 778 686H787V624H658L575 511Q493 398 493 397L508 376Q522 356 553 312T611 229L727 62H835V0H824Q803 3 667 3Q516 3 489 0H476V62H513L549 63L401 274L247 63Q247 62 292 62H338V0H327",120511:"64 515Q64 532 71 536T104 540H139Q200 540 207 538Q225 533 236 521T253 489T260 454T264 414Q264 340 287 296T347 237Q369 226 373 226Q374 226 374 425V624H239V686H253Q280 683 447 683T641 686H655V624H520V226L522 227Q525 228 531 229T552 240T580 261T606 298T624 354Q627 368 628 394T631 440T637 482T654 518T686 538Q693 540 754 540H794Q817 540 823 536T829 515Q829 500 824 495T811 489T796 483T782 461T775 408Q767 212 568 175Q526 168 521 168Q520 168 520 115V62H655V0H641Q614 3 447 3T253 0H239V62H374V168L364 169Q290 178 243 203Q126 261 118 409Q117 443 111 461T98 484T83 489T70 495T64 515",120512:"598 645T415 645T232 458Q232 385 275 239T318 26Q318 8 311 4T272 -1Q265 -1 240 -1T196 0H88V3Q86 5 70 108Q52 211 51 212V215H113V212Q123 149 132 133Q136 124 149 122T202 118Q241 118 241 119Q241 132 132 277Q64 378 64 457Q64 564 158 630T403 696Q487 696 543 685T661 638Q722 599 744 549T766 458Q766 434 761 410T749 368T729 327T709 293T684 258T663 229Q632 187 614 160T592 126L589 119Q589 118 628 118Q667 119 680 121T698 133Q702 140 706 160T714 196L717 212V215H779V212Q778 211 760 108Q744 5 742 3V0H634H562Q528 0 520 4T512 26Q512 92 555 238T598 458Q598 645 415 645",120513:"56 673Q56 679 65 686H892Q901 679 901 673Q901 668 714 331T521 -15Q518 -18 506 -24H452Q440 -19 436 -15Q431 -8 337 162T150 501L57 669Q57 670 56 672V673ZM528 136L758 553H297Q298 551 414 341L528 136",120546:"208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260",120547:"231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229",120548:"49 1Q31 1 31 10Q31 12 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 661Q197 674 203 680H714Q721 676 721 669Q721 664 708 557T694 447Q692 440 674 440H662Q655 445 655 454Q655 455 658 480T661 534Q661 572 652 592Q638 619 603 626T501 634H471Q398 633 393 630Q389 628 386 622Q385 619 315 341T245 60Q245 46 333 46H345Q366 46 366 35Q366 33 363 21T358 6Q356 1 339 1Q334 1 292 1T187 2Q122 2 88 2T49 1",120549:"574 715L582 716Q589 716 595 716Q612 716 616 714Q621 712 621 709Q622 707 705 359T788 8Q786 5 785 3L781 0H416Q52 0 50 2T48 6Q48 9 305 358T567 711Q572 712 574 715ZM599 346L538 602L442 474Q347 345 252 217T157 87T409 86T661 88L654 120Q646 151 629 220T599 346",120550:"492 213Q472 213 472 226Q472 230 477 250T482 285Q482 316 461 323T364 330H312Q311 328 277 192T243 52Q243 48 254 48T334 46Q428 46 458 48T518 61Q567 77 599 117T670 248Q680 270 683 272Q690 274 698 274Q718 274 718 261Q613 7 608 2Q605 0 322 0H133Q31 0 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H757Q764 676 764 669Q764 664 751 557T737 447Q735 440 717 440H705Q698 445 698 453L701 476Q704 500 704 528Q704 558 697 578T678 609T643 625T596 632T532 634H485Q397 633 392 631Q388 629 386 622Q385 619 355 499T324 377Q347 376 372 376H398Q464 376 489 391T534 472Q538 488 540 490T557 493Q562 493 565 493T570 492T572 491T574 487T577 483L544 351Q511 218 508 216Q505 213 492 213",120551:"58 8Q58 23 64 35Q64 36 329 334T596 635L586 637Q575 637 512 637H500H476Q442 637 420 635T365 624T311 598T266 548T228 469Q227 466 226 463T224 458T223 453T222 450L221 448Q218 443 202 443Q185 443 182 453L214 561Q228 606 241 651Q249 679 253 681Q256 683 487 683H718Q723 678 723 675Q723 673 717 649Q189 54 188 52L185 49H274Q369 50 377 51Q452 60 500 100T579 247Q587 272 590 277T603 282H607Q628 282 628 271Q547 5 541 2Q538 0 300 0H124Q58 0 58 8",120552:"228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 219 683Q260 681 355 681Q389 681 418 681T463 682T483 682Q499 682 499 672Q499 670 497 658Q492 641 487 638H485Q483 638 480 638T473 638T464 637T455 637Q416 636 405 634T387 623Q384 619 355 500Q348 474 340 442T328 395L324 380Q324 378 469 378H614L615 381Q615 384 646 504Q674 619 674 627T617 637Q594 637 587 639T580 648Q580 650 582 660Q586 677 588 679T604 682Q609 682 646 681T740 680Q802 680 835 681T871 682Q888 682 888 672Q888 645 876 638H874Q872 638 869 638T862 638T853 637T844 637Q805 636 794 634T776 623Q773 618 704 340T634 58Q634 51 638 51Q646 48 692 46H723Q729 38 729 37T726 19Q722 6 716 0H701Q664 2 567 2Q533 2 504 2T458 2T437 1Q420 1 420 10Q420 15 423 24Q428 43 433 45Q437 46 448 46H454Q481 46 514 49Q520 50 522 50T528 55T534 64T540 82T547 110T558 153Q565 181 569 198Q602 330 602 331T457 332H312L279 197Q245 63 245 58Q245 51 253 49T303 46H334Q340 38 340 37T337 19Q333 6 327 0H312Q275 2 178 2Q144 2 115 2T69 2T48 1Q31 1 31 10Q31 12 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637",120553:"740 435Q740 320 676 213T511 42T304 -22Q207 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435ZM640 466Q640 523 625 565T583 628T532 658T479 668Q370 668 273 559T151 255Q150 245 150 213Q150 156 165 116T207 55T259 26T313 17Q385 17 451 63T561 184Q590 234 615 312T640 466ZM510 276Q510 278 512 288L515 298Q515 299 384 299H253L250 285Q246 271 244 268T231 265H227Q216 265 214 266T207 274Q207 278 223 345T244 416Q247 419 260 419H263Q280 419 280 408Q280 406 278 396L275 386Q275 385 406 385H537L540 399Q544 413 546 416T559 419H563Q574 419 576 418T583 410Q583 403 566 339Q549 271 544 267Q542 265 538 265H530H527Q510 265 510 276",120554:"43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1",120555:"285 628Q285 635 228 637Q205 637 198 638T191 647Q191 649 193 661Q199 681 203 682Q205 683 214 683H219Q260 681 355 681Q389 681 418 681T463 682T483 682Q500 682 500 674Q500 669 497 660Q496 658 496 654T495 648T493 644T490 641T486 639T479 638T470 637T456 637Q416 636 405 634T387 623L306 305Q307 305 490 449T678 597Q692 611 692 620Q692 635 667 637Q651 637 651 648Q651 650 654 662T659 677Q662 682 676 682Q680 682 711 681T791 680Q814 680 839 681T869 682Q889 682 889 672Q889 650 881 642Q878 637 862 637Q787 632 726 586Q710 576 656 534T556 455L509 418L518 396Q527 374 546 329T581 244Q656 67 661 61Q663 59 666 57Q680 47 717 46H738Q744 38 744 37T741 19Q737 6 731 0H720Q680 3 625 3Q503 3 488 0H478Q472 6 472 9T474 27Q478 40 480 43T491 46H494Q544 46 544 71Q544 75 517 141T485 216L427 354L359 301L291 248L268 155Q245 63 245 58Q245 51 253 49T303 46H334Q340 37 340 35Q340 19 333 5Q328 0 317 0Q314 0 280 1T180 2Q118 2 85 2T49 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628",120556:"135 2Q114 2 90 2T60 1Q35 1 35 11Q35 28 42 40Q45 46 55 46Q119 46 151 94Q153 97 325 402T498 709Q505 716 526 716Q543 716 549 710Q550 709 560 548T580 224T591 57Q594 52 595 52Q603 47 638 46H663Q670 39 670 35Q669 12 657 0H644Q613 2 530 2Q497 2 469 2T424 2T405 1Q388 1 388 10Q388 15 391 24Q392 27 393 32T395 38T397 41T401 44T406 45T415 46Q473 46 487 64L472 306Q468 365 465 426T459 518L457 550Q456 550 328 322T198 88Q196 80 196 77Q196 49 243 46Q261 46 261 35Q261 34 259 22Q256 7 254 4T240 0Q237 0 211 1T135 2",120557:"289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629",120558:"234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637",120559:"222 668Q222 670 229 677H654Q677 677 705 677T740 678Q764 678 770 676T777 667Q777 662 764 594Q761 579 757 559T751 528L749 519Q747 512 729 512H717Q710 519 710 525Q712 532 715 559T719 591Q718 595 711 595Q682 598 486 598Q252 598 246 592Q239 587 228 552L216 517Q214 512 197 512H185Q178 517 178 522Q178 524 198 591T222 668ZM227 262Q218 262 215 262T209 266L207 270L227 356Q247 435 250 439Q253 443 260 443H267H280Q287 438 287 433Q287 430 285 420T280 402L278 393Q278 392 431 392H585L590 415Q595 436 598 439T612 443H628Q635 438 635 433Q635 431 615 351T594 268Q592 262 575 262H572Q556 262 556 272Q556 280 560 293L565 313H258L252 292Q248 271 245 267T230 262H227ZM60 0Q53 4 53 11Q53 14 68 89T84 169Q88 176 98 176H104H116Q123 169 123 163Q122 160 117 127T112 88Q112 80 243 80H351H454Q554 80 574 81T597 88V89Q603 100 610 121T622 157T630 174Q633 176 646 176H658Q665 171 665 166Q665 164 643 89T618 7Q616 2 607 1T548 0H335H60",120560:"740 435Q740 320 676 213T511 42T304 -22Q207 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435ZM637 476Q637 565 591 615T476 665Q396 665 322 605Q242 542 200 428T157 216Q157 126 200 73T314 19Q404 19 485 98T608 313Q637 408 637 476",120561:"48 1Q31 1 31 10Q31 12 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 661Q197 674 203 680H541Q621 680 709 680T812 681Q841 681 855 681T877 679T886 676T887 670Q887 663 885 656Q880 637 875 635Q871 634 860 634H854Q827 634 794 631Q780 628 775 619Q773 614 704 338T634 58Q634 51 638 51Q646 48 692 46H723Q729 38 729 37T726 19Q722 6 716 0H701Q664 2 567 2Q533 2 504 2T458 2T437 1Q420 1 420 10Q420 15 423 24Q428 43 433 45Q437 46 448 46H454Q481 46 514 49Q528 52 533 61Q536 67 572 209T642 491T678 632Q678 634 533 634H388Q387 631 316 347T245 59Q245 55 246 54T253 50T270 48T303 46H334Q340 38 340 37T337 19Q333 6 327 0H312Q275 2 178 2Q144 2 115 2T69 2T48 1",120562:"287 628Q287 635 230 637Q206 637 199 638T192 648Q192 649 194 659Q200 679 203 681T397 683Q587 682 600 680Q664 669 707 631T751 530Q751 453 685 389Q616 321 507 303Q500 302 402 301H307L277 182Q247 66 247 59Q247 55 248 54T255 50T272 48T305 46H336Q342 37 342 35Q342 19 335 5Q330 0 319 0Q316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597T609 619T560 635Q553 636 480 637Q463 637 445 637T416 636T404 636Q391 635 386 627Q384 621 367 550T332 412T314 344Q314 342 395 342H407H430Q542 342 590 392Q617 419 631 471T645 554",120564:"65 0Q58 4 58 11Q58 16 114 67Q173 119 222 164L377 304Q378 305 340 386T261 552T218 644Q217 648 219 660Q224 678 228 681Q231 683 515 683H799Q804 678 806 674Q806 667 793 559T778 448Q774 443 759 443Q747 443 743 445T739 456Q739 458 741 477T743 516Q743 552 734 574T710 609T663 627T596 635T502 637Q480 637 469 637H339Q344 627 411 486T478 341V339Q477 337 477 336L457 318Q437 300 398 265T322 196L168 57Q167 56 188 56T258 56H359Q426 56 463 58T537 69T596 97T639 146T680 225Q686 243 689 246T702 250H705Q726 250 726 239Q726 238 683 123T639 5Q637 1 610 1Q577 0 348 0H65",120565:"40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40",120566:"45 535Q34 535 31 536T28 544Q28 554 39 578T70 631T126 683T206 705Q230 705 251 698T295 671T330 612T344 514Q344 477 342 473V472Q343 472 347 480T361 509T380 547Q471 704 596 704Q615 704 625 702Q659 692 679 663T700 595Q700 565 696 552T687 537T670 535Q656 535 653 536T649 543Q649 544 649 550T650 562Q650 589 629 605T575 621Q502 621 448 547T365 361Q290 70 290 60Q290 46 379 46H404Q410 40 410 39T408 19Q404 6 398 0H381Q340 2 225 2Q184 2 149 2T94 2T69 1Q61 1 58 1T53 4T51 10Q51 11 53 23Q54 25 55 30T56 36T58 40T60 43T62 44T67 46T73 46T82 46H89Q144 46 163 49T190 62L198 93Q206 124 217 169T241 262T262 350T274 404Q281 445 281 486V494Q281 621 185 621Q147 621 116 601T74 550Q71 539 66 537T45 535",120567:"356 624Q356 637 267 637H243Q237 642 237 645T239 664Q243 677 249 683H264Q342 681 429 681Q565 681 571 683H583Q589 677 589 674T587 656Q582 641 578 637H540Q516 637 504 637T479 633T463 630T454 623T448 613T443 597T438 576Q436 566 434 556T430 539L428 533Q442 533 472 526T543 502T613 451T642 373Q642 301 567 241T386 158L336 150Q332 150 331 146Q310 66 310 60Q310 46 399 46H424Q430 40 430 39T428 19Q424 6 418 0H401Q360 2 247 2Q207 2 173 2T119 2T95 1Q87 1 84 1T79 4T77 10Q77 11 79 23Q80 25 81 30T82 36T84 40T86 43T88 44T93 46T99 46T108 46H115Q170 46 189 49T216 62Q220 74 228 107L239 150L223 152Q139 164 82 205T24 311Q24 396 125 462Q207 517 335 533L346 578Q356 619 356 624ZM130 291Q130 203 241 188H249Q249 190 287 342L325 495H324Q313 495 291 491T229 466T168 414Q130 357 130 291ZM536 393Q536 440 507 463T418 496L341 187L351 189Q443 201 487 255Q536 314 536 393",120568:"42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0",120569:"216 151Q48 174 48 329Q48 361 56 403T65 458Q65 482 58 494T43 507T28 510T21 520Q21 528 23 534T29 544L32 546H72H94Q110 546 119 544T139 536T154 514T159 476V465Q159 445 149 399T138 314Q142 229 197 201Q223 187 226 190L233 218Q240 246 253 300T280 407Q333 619 333 625Q333 637 244 637H220Q214 642 214 645T216 664Q220 677 226 683H241Q321 681 405 681Q543 681 549 683H560Q566 677 566 674T564 656Q559 641 555 637H517Q448 636 436 628Q429 623 423 600T373 404L320 192Q370 201 419 248Q451 281 469 317T500 400T518 457Q529 486 542 505T569 532T594 543T621 546H644H669Q692 546 692 536Q691 509 676 509Q623 509 593 399Q587 377 579 355T552 301T509 244T446 195T359 159Q324 151 314 151Q311 151 310 150T298 106T287 60Q287 46 376 46H401Q407 40 407 39T405 19Q401 6 395 0H378Q337 2 224 2Q184 2 150 2T96 2T72 1Q64 1 61 1T56 4T54 10Q54 11 56 23Q57 25 58 30T59 36T61 40T63 43T65 44T70 46T76 46T85 46H92Q147 46 166 49T193 62L204 106Q216 149 216 151",120570:"125 84Q127 78 194 76H243V78Q243 122 208 215T165 350Q164 359 162 389Q162 522 272 610Q328 656 396 680T525 704Q628 704 698 661Q734 637 755 601T781 544T786 504Q786 439 747 374T635 226T537 109Q518 81 518 77Q537 76 557 76Q608 76 620 78T640 92Q646 100 656 119T673 155T683 172Q690 173 698 173Q718 173 718 162Q718 161 681 82T642 2Q639 0 550 0H461Q455 5 455 9T458 28Q472 78 510 149T584 276T648 402T677 525Q677 594 636 631T530 668Q476 668 423 641T335 568Q284 499 271 400Q270 388 270 348Q270 298 277 228T285 115Q285 82 280 49T271 6Q269 1 258 1T175 0H87Q83 3 80 7V18Q80 22 82 98Q84 156 85 163T91 172Q94 173 104 173T119 172Q124 169 124 126Q125 104 125 84",120572:"34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26",120573:"29 -194Q23 -188 23 -186Q23 -183 102 134T186 465Q208 533 243 584T309 658Q365 705 429 705H431Q493 705 533 667T573 570Q573 465 469 396L482 383Q533 332 533 252Q533 139 448 65T257 -10Q227 -10 203 -2T165 17T143 40T131 59T126 65L62 -188Q60 -194 42 -194H29ZM353 431Q392 431 427 419L432 422Q436 426 439 429T449 439T461 453T472 471T484 495T493 524T501 560Q503 569 503 593Q503 611 502 616Q487 667 426 667Q384 667 347 643T286 582T247 514T224 455Q219 439 186 308T152 168Q151 163 151 147Q151 99 173 68Q204 26 260 26Q302 26 349 51T425 137Q441 171 449 214T457 279Q457 337 422 372Q380 358 347 358H337Q258 358 258 389Q258 396 261 403Q275 431 353 431",120574:"31 249Q11 249 11 258Q11 275 26 304T66 365T129 418T206 441Q233 441 239 440Q287 429 318 386T371 255Q385 195 385 170Q385 166 386 166L398 193Q418 244 443 300T486 391T508 430Q510 431 524 431H537Q543 425 543 422Q543 418 522 378T463 251T391 71Q385 55 378 6T357 -100Q341 -165 330 -190T303 -216Q286 -216 286 -188Q286 -138 340 32L346 51L347 69Q348 79 348 100Q348 257 291 317Q251 355 196 355Q148 355 108 329T51 260Q49 251 47 251Q45 249 31 249",120575:"195 609Q195 656 227 686T302 717Q319 716 351 709T407 697T433 690Q451 682 451 662Q451 644 438 628T403 612Q382 612 348 641T288 671T249 657T235 628Q235 584 334 463Q401 379 401 292Q401 169 340 80T205 -10H198Q127 -10 83 36T36 153Q36 286 151 382Q191 413 252 434Q252 435 245 449T230 481T214 521T201 566T195 609ZM112 130Q112 83 136 55T204 27Q233 27 256 51T291 111T309 178T316 232Q316 267 309 298T295 344T269 400L259 396Q215 381 183 342T137 256T118 179T112 130",120576:"190 -22Q124 -22 76 11T27 107Q27 174 97 232L107 239L99 248Q76 273 76 304Q76 364 144 408T290 452H302Q360 452 405 421Q428 405 428 392Q428 381 417 369T391 356Q382 356 371 365T338 383T283 392Q217 392 167 368T116 308Q116 289 133 272Q142 263 145 262T157 264Q188 278 238 278H243Q308 278 308 247Q308 206 223 206Q177 206 142 219L132 212Q68 169 68 112Q68 39 201 39Q253 39 286 49T328 72T345 94T362 105Q376 103 376 88Q376 79 365 62T334 26T275 -8T190 -22",120577:"296 643Q298 704 324 704Q342 704 342 687Q342 682 339 664T336 633Q336 623 337 618T338 611Q339 612 341 612Q343 614 354 616T374 618L384 619H394Q471 619 471 586Q467 548 386 546H372Q338 546 320 564L311 558Q235 506 175 398T114 190Q114 171 116 155T125 127T137 104T153 86T171 72T192 61T213 53T235 46T256 39L322 16Q389 -10 389 -80Q389 -119 364 -154T300 -202Q292 -204 274 -204Q247 -204 225 -196Q210 -192 193 -182T172 -167Q167 -159 173 -148Q180 -139 191 -139Q195 -139 221 -153T283 -168Q298 -166 310 -152T322 -117Q322 -91 302 -75T250 -51T183 -29T116 4T65 62T44 160Q44 287 121 410T293 590L302 595Q296 613 296 643",120578:"21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q156 442 175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336V326Q503 302 439 53Q381 -182 377 -189Q364 -216 332 -216Q319 -216 310 -208T299 -186Q299 -177 358 57L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287",120579:"35 200Q35 302 74 415T180 610T319 704Q320 704 327 704T339 705Q393 701 423 656Q462 596 462 495Q462 380 417 261T302 66T168 -10H161Q125 -10 99 10T60 63T41 130T35 200ZM383 566Q383 668 330 668Q294 668 260 623T204 521T170 421T157 371Q206 370 254 370L351 371Q352 372 359 404T375 484T383 566ZM113 132Q113 26 166 26Q181 26 198 36T239 74T287 161T335 307L340 324H145Q145 321 136 286T120 208T113 132",120580:"139 -10Q111 -10 92 0T64 25T52 52T48 74Q48 89 55 109T85 199T135 375L137 384Q139 394 140 397T145 409T151 422T160 431T173 439T190 442Q202 442 213 435T225 410Q225 404 214 358T181 238T137 107Q126 74 126 54Q126 43 126 39T130 31T142 27H147Q206 27 255 78Q272 98 281 114T290 138T295 149T313 153Q321 153 324 153T329 152T332 149T332 143Q332 106 276 48T145 -10H139",120581:"83 -11Q70 -11 62 -4T51 8T49 17Q49 30 96 217T147 414Q160 442 193 442Q205 441 213 435T223 422T225 412Q225 401 208 337L192 270Q193 269 208 277T235 292Q252 304 306 349T396 412T467 431Q489 431 500 420T512 391Q512 366 494 347T449 327Q430 327 418 338T405 368Q405 370 407 380L397 375Q368 360 315 315L253 266L240 257H245Q262 257 300 251T366 230Q422 203 422 150Q422 140 417 114T411 67Q411 26 437 26Q484 26 513 137Q516 149 519 151T535 153Q554 153 554 144Q554 121 527 64T457 -7Q447 -10 431 -10Q386 -10 360 17T333 90Q333 108 336 122T339 146Q339 170 320 186T271 209T222 218T185 221H180L155 122Q129 22 126 16Q113 -11 83 -11",120582:"166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673",120583:"58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216",120584:"74 431Q75 431 146 436T219 442Q231 442 231 434Q231 428 185 241L137 51H140L150 55Q161 59 177 67T214 86T261 119T312 165Q410 264 445 394Q458 442 496 442Q509 442 519 434T530 411Q530 390 516 352T469 262T388 162T267 70T106 5Q81 -2 71 -2Q66 -2 59 -1T51 1Q45 5 45 11Q45 13 88 188L132 364Q133 377 125 380T86 385H65Q59 391 59 393T61 412Q65 431 74 431",120585:"268 632Q268 704 296 704Q314 704 314 687Q314 682 311 664T308 635T309 620V616H315Q342 619 360 619Q443 619 443 586Q439 548 358 546H344Q326 546 317 549T290 566Q257 550 226 505T195 405Q195 381 201 364T211 342T218 337Q266 347 298 347Q375 347 375 314Q374 297 359 288T327 277T280 275Q234 275 208 283L195 286Q149 260 119 214T88 130Q88 116 90 108Q101 79 129 63T229 20Q238 17 243 15Q337 -21 354 -33Q383 -53 383 -94Q383 -137 351 -171T273 -205Q240 -205 202 -190T158 -167Q156 -163 156 -159Q156 -151 161 -146T176 -140Q182 -140 189 -143Q232 -168 274 -168Q286 -168 292 -165Q313 -151 313 -129Q313 -112 301 -104T232 -75Q214 -68 204 -64Q198 -62 171 -52T136 -38T107 -24T78 -8T56 12T36 37T26 66T21 103Q21 149 55 206T145 301L154 307L148 313Q141 319 136 323T124 338T111 358T103 382T99 413Q99 471 143 524T259 602L271 607Q268 618 268 632",120586:"201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120",120587:"132 -11Q98 -11 98 22V33L111 61Q186 219 220 334L228 358H196Q158 358 142 355T103 336Q92 329 81 318T62 297T53 285Q51 284 38 284Q19 284 19 294Q19 300 38 329T93 391T164 429Q171 431 389 431Q549 431 553 430Q573 423 573 402Q573 371 541 360Q535 358 472 358H408L405 341Q393 269 393 222Q393 170 402 129T421 65T431 37Q431 20 417 5T381 -10Q370 -10 363 -7T347 17T331 77Q330 86 330 121Q330 170 339 226T357 318T367 358H269L268 354Q268 351 249 275T206 114T175 17Q164 -11 132 -11",120588:"58 -216Q25 -216 23 -186Q23 -176 73 26T127 234Q143 289 182 341Q252 427 341 441Q343 441 349 441T359 442Q432 442 471 394T510 276Q510 219 486 165T425 74T345 13T266 -10H255H248Q197 -10 165 35L160 41L133 -71Q108 -168 104 -181T92 -202Q76 -216 58 -216ZM424 322Q424 359 407 382T357 405Q322 405 287 376T231 300Q217 269 193 170L176 102Q193 26 260 26Q298 26 334 62Q367 92 389 158T418 266T424 322",120589:"31 207Q31 306 115 374T302 442Q341 442 373 430T405 400Q405 392 399 383T379 374Q373 375 348 390T296 405Q222 405 160 357T98 249Q98 232 103 218T112 195T132 175T154 159T186 141T219 122Q234 114 255 102T286 85T299 78L302 74Q306 71 308 69T315 61T322 51T328 40T332 25T334 8Q334 -31 305 -69T224 -107Q194 -107 163 -92Q156 -88 156 -80Q156 -73 162 -67T178 -61Q186 -61 190 -63Q209 -71 224 -71Q244 -71 253 -59T263 -30Q263 -25 263 -21T260 -12T255 -4T248 3T239 9T227 17T213 25T195 34T174 46Q170 48 150 58T122 74T97 90T70 112T51 137T36 169T31 207",120590:"184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278",120591:"39 284Q18 284 18 294Q18 301 45 338T99 398Q134 425 164 429Q170 431 332 431Q492 431 497 429Q517 424 517 402Q517 388 508 376T485 360Q479 358 389 358T299 356Q298 355 283 274T251 109T233 20Q228 5 215 -4T186 -13Q153 -13 153 20V30L203 192Q214 228 227 272T248 336L254 357Q254 358 208 358Q206 358 197 358T183 359Q105 359 61 295Q56 287 53 286T39 284",120592:"413 384Q413 406 432 424T473 443Q492 443 507 425T523 367Q523 334 508 270T468 153Q424 63 373 27T282 -10H268Q220 -10 186 2T135 36T111 78T104 121Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 299 34 333T82 404T161 441Q200 441 225 419T250 355Q248 336 247 334Q247 331 232 291T201 199T185 118Q185 68 211 47T275 26Q317 26 355 57T416 132T452 216T465 277Q465 301 457 318T439 343T421 361T413 384",120593:"92 210Q92 176 106 149T142 108T185 85T220 72L235 70L237 71L250 112Q268 170 283 211T322 299T370 375T429 423T502 442Q547 442 582 410T618 302Q618 224 575 152T457 35T299 -10Q273 -10 273 -12L266 -48Q260 -83 252 -125T241 -179Q236 -203 215 -212Q204 -218 190 -218Q159 -215 159 -185Q159 -175 214 -2L209 0Q204 2 195 5T173 14T147 28T120 46T94 71T71 103T56 142T50 190Q50 238 76 311T149 431H162Q183 431 183 423Q183 417 175 409Q134 361 114 300T92 210ZM574 278Q574 320 550 344T486 369Q437 369 394 329T323 218Q309 184 295 109L286 64Q304 62 306 62Q423 62 498 131T574 278",120594:"576 -125Q576 -147 547 -175T487 -204H476Q394 -204 363 -157Q334 -114 293 26L284 59Q283 58 248 19T170 -66T92 -151T53 -191Q49 -194 43 -194Q36 -194 31 -189T25 -177T38 -154T151 -30L272 102L265 131Q189 405 135 405Q104 405 87 358Q86 351 68 351Q48 351 48 361Q48 369 56 386T89 423T148 442Q224 442 258 400Q276 375 297 320T330 222L341 180Q344 180 455 303T573 429Q579 431 582 431Q600 431 600 414Q600 407 587 392T477 270Q356 138 353 134L362 102Q392 -10 428 -89T490 -168Q504 -168 517 -156T536 -126Q539 -116 543 -115T557 -114T571 -115Q576 -118 576 -125",120595:"161 441Q202 441 226 417T250 358Q250 338 218 252T187 127Q190 85 214 61Q235 43 257 37Q275 29 288 29H289L371 360Q455 691 456 692Q459 694 472 694Q492 694 492 687Q492 678 411 356Q329 28 329 27T335 26Q421 26 498 114T576 278Q576 302 568 319T550 343T532 361T524 384Q524 405 541 424T583 443Q602 443 618 425T634 366Q634 337 623 288T605 220Q573 125 492 57T329 -11H319L296 -104Q272 -198 272 -199Q270 -205 252 -205H239Q233 -199 233 -197Q233 -192 256 -102T279 -9Q272 -8 265 -8Q106 14 106 139Q106 174 139 264T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 299 34 333T82 404T161 441",120596:"495 384Q495 406 514 424T555 443Q574 443 589 425T604 364Q604 334 592 278T555 155T483 38T377 -11Q297 -11 267 66Q266 68 260 61Q201 -11 125 -11Q15 -11 15 139Q15 230 56 325T123 434Q135 441 147 436Q160 429 160 418Q160 406 140 379T94 306T62 208Q61 202 61 187Q61 124 85 100T143 76Q201 76 245 129L253 137V156Q258 297 317 297Q348 297 348 261Q348 243 338 213T318 158L308 135Q309 133 310 129T318 115T334 97T358 83T393 76Q456 76 501 148T546 274Q546 305 533 325T508 357T495 384",120597:"202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306",120598:"227 -11Q149 -11 95 41T40 174Q40 262 87 322Q121 367 173 396T287 430Q289 431 329 431H367Q382 426 382 411Q382 385 341 385H325H312Q191 385 154 277L150 265H327Q340 256 340 246Q340 228 320 219H138V217Q128 187 128 143Q128 77 160 52T231 26Q258 26 284 36T326 57T343 68Q350 68 354 58T358 39Q358 36 357 35Q354 31 337 21T289 0T227 -11",120599:"537 500Q537 474 533 439T524 383L521 362Q558 355 561 351Q563 349 563 345Q563 321 552 318Q542 318 521 323L510 326Q496 261 459 187T362 51T241 -11Q100 -11 100 105Q100 139 127 242T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Q21 291 27 313T47 368T79 418Q103 442 134 442Q169 442 201 419T233 344Q232 330 206 228T180 98Q180 26 247 26Q292 26 332 90T404 260L427 349Q422 349 398 359T339 392T289 440Q265 476 265 520Q265 590 312 647T417 705Q463 705 491 670T528 592T537 500ZM464 564Q464 668 413 668Q373 668 339 622T304 522Q304 494 317 470T349 431T388 406T421 391T435 387H436L443 415Q450 443 457 485T464 564",120600:"228 325Q170 322 156 316T127 309Q108 309 104 314Q99 319 99 322T108 341Q125 376 171 400T268 425H271Q302 425 319 396Q328 377 328 358Q328 332 324 314Q311 270 286 221Q274 194 274 192H275Q339 234 484 325T639 421Q669 434 691 434T723 425T734 406Q734 394 719 381Q715 376 644 330L575 287L566 267Q543 233 526 176Q520 160 515 143T508 115T506 105Q506 103 533 103Q585 103 607 110T641 118Q670 118 670 107Q670 100 661 85Q643 50 598 27T504 3Q465 3 450 36Q441 51 441 73Q441 84 444 96Q452 146 484 205L497 236L324 125Q143 12 135 10Q103 -6 77 -6Q61 -6 49 2T37 21Q37 36 49 46T124 96L195 141L204 156Q219 179 243 248T264 323Q264 325 228 325",120601:"409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282",120602:"205 -174Q136 -174 102 -153T67 -76Q67 -25 91 85T127 234Q143 289 182 341Q252 427 341 441Q343 441 349 441T359 442Q432 442 471 394T510 276Q510 169 431 80T253 -10Q226 -10 204 -2T169 19T146 44T132 64L128 73Q128 72 124 53T116 5T112 -44Q112 -68 117 -78T150 -95T236 -102Q327 -102 356 -111T386 -154Q386 -166 384 -178Q381 -190 378 -192T361 -194H348Q342 -188 342 -179Q342 -169 315 -169Q294 -169 264 -171T205 -174ZM424 322Q424 359 407 382T357 405Q322 405 287 376T231 300Q221 276 204 217Q188 152 188 116Q188 68 210 47T259 26Q297 26 334 62Q367 92 389 158T418 266T424 322",120603:"206 -10Q158 -10 136 24T114 110Q114 233 199 349L205 358H184Q144 358 121 347Q108 340 95 330T75 312T61 295T53 285Q51 284 38 284Q19 284 19 294Q19 300 38 329T93 391T164 429Q171 431 532 431Q799 431 803 430Q823 423 823 402Q823 377 801 364Q790 358 766 358Q748 358 748 357Q748 355 749 348T752 327T754 297Q754 258 738 207T693 107T618 24T520 -10Q488 -10 466 2T432 36T416 77T411 120Q411 128 410 128T404 122Q373 71 323 31T206 -10ZM714 296Q714 316 707 358H251Q250 357 244 348T230 328T212 301T193 267T176 229T164 187T159 144Q159 62 222 62Q290 62 349 127T432 285Q433 286 434 288T435 291T437 293T440 294T444 294T452 294H466Q472 288 472 286Q472 285 464 244T456 170Q456 62 534 62Q604 62 659 139T714 296",120604:"65 0Q45 0 45 18Q48 52 61 60Q65 62 81 62Q155 62 165 74Q166 74 265 228T465 539T569 699Q576 707 583 709T611 711T637 710T649 700Q650 697 695 380L741 63L784 62H827Q839 50 839 45L835 29Q831 9 827 5T806 0Q803 0 790 0T743 1T657 2Q585 2 547 1T504 0Q481 0 481 17Q484 54 497 60Q501 62 541 62Q580 62 580 63Q580 68 573 121T564 179V181H308L271 124Q236 69 236 67T283 62H287Q316 62 316 46Q316 26 307 8Q302 3 295 0L262 1Q242 2 168 2Q119 2 93 1T65 0ZM537 372Q533 402 528 435T521 486T518 504V505Q517 505 433 375L348 244L451 243Q555 243 555 244L537 372",120605:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 449 686H477H586Q684 686 733 677T817 634Q853 598 853 547Q853 499 826 460T761 401T695 371T654 360H653L662 358Q670 357 683 354T712 344T744 327T774 303T795 269T804 224Q804 148 732 79T533 1Q524 0 288 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624ZM703 550Q703 571 695 586T675 609T656 619T643 623L545 624H447L417 504Q386 384 386 383T470 382Q554 383 565 385Q632 397 667 447T703 550ZM651 240Q651 265 645 282T626 309T608 322T592 329Q587 330 479 331H373L340 198Q307 65 306 64Q306 62 406 62L507 63L519 65Q565 76 596 107T639 171T651 240",120606:"257 618H231Q198 618 198 636Q202 672 214 678L219 680H763Q769 677 772 673T776 666L777 664Q777 659 766 549T751 433Q745 424 723 424Q704 424 699 427T693 441Q693 444 695 467T697 513Q697 543 689 563T670 594T636 610T592 617T534 618H516H456L455 614Q455 613 387 339T317 64Q317 62 375 62H411Q430 62 438 59T447 44Q444 7 430 2Q426 0 416 0Q409 0 359 1T231 2Q152 2 111 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L163 66Q163 67 231 341T301 616Q301 618 257 618",120607:"65 0Q59 6 59 9T61 16Q64 20 334 357T608 698Q616 706 629 710Q630 710 634 710T644 710T656 711Q686 711 694 703Q698 699 700 693Q706 674 805 345T904 14Q904 7 894 1L479 0H65ZM630 342L567 551L232 134L462 133H693Q693 137 630 342",120608:"257 618H231Q198 618 198 636Q202 672 214 678L219 680H811Q817 677 820 673T824 666L825 664Q825 659 814 549T799 433Q793 424 771 424Q752 424 746 427T740 441Q740 445 742 466T744 505Q744 561 722 585T646 616Q639 617 545 618H456Q456 617 427 502T398 385Q398 384 435 384Q461 385 471 385T499 391T526 405T545 433T562 478Q566 494 571 497T595 501H604Q622 501 626 486Q626 482 593 349T557 213Q552 205 530 205Q499 205 499 219Q499 222 503 242T508 281Q508 308 491 314T429 322Q425 322 423 322H382L317 64Q317 62 390 62Q460 62 493 64T569 80T640 124Q665 149 686 187T719 253T733 283Q739 289 760 289Q791 289 791 274Q791 267 763 201T706 71L678 8Q676 4 667 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L163 66Q163 67 231 341T301 616Q301 618 257 618",120609:"223 430Q192 430 192 448Q192 450 225 561T261 677Q265 683 270 684Q273 686 534 686Q796 686 797 685Q805 682 805 673Q805 668 804 661T800 648T798 641Q796 637 531 352L266 67L329 66H364Q412 66 446 70T523 96T596 157Q617 186 630 220T649 273T663 297Q667 299 684 299H688Q715 299 715 281Q715 278 673 145T628 8Q626 4 617 0H348Q289 0 221 0T139 -1Q112 -1 99 -1T78 1T69 5T68 12Q68 16 71 31T77 49L84 57Q91 65 104 79T133 110T170 151T213 196L610 624H540Q533 624 514 624T488 624T467 623T443 620T422 616T398 609T373 600Q292 560 255 449Q251 436 246 433T223 430",120610:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 239 686Q290 684 403 684Q475 684 512 685T553 686Q576 686 576 668Q572 632 560 626Q555 624 506 624H457L399 389Q399 388 547 388H695L753 623Q753 624 709 624H686Q665 624 660 626T650 639Q653 678 668 684Q672 686 681 686Q685 686 726 685T847 684Q902 684 937 684T986 685T1004 686Q1027 686 1027 668Q1023 632 1011 626Q1006 624 957 624H908L839 344Q768 64 768 63T812 62H839Q871 62 871 44Q867 6 854 2L850 0L808 1Q782 2 675 2Q600 2 560 1T516 0Q499 0 494 15Q498 54 511 60Q515 62 564 62H613L614 66L679 324Q679 326 531 326H383L382 322L317 64Q317 62 361 62H388Q420 62 420 44Q416 6 403 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624",120611:"358 -17Q218 -17 136 49T54 243Q54 298 70 356T123 474T211 582T338 663T504 702H527Q578 702 590 701Q709 688 776 622T844 441Q844 379 825 315T765 192T668 86T532 11T358 -17ZM700 474Q700 525 685 561T642 616T587 643T528 652Q390 652 301 534Q252 472 225 373T198 210Q198 160 214 125T256 71T311 44T372 36Q484 36 571 119Q639 189 669 299T700 474ZM366 428Q366 425 364 419T362 411H466L570 412L573 422Q576 437 581 441T604 445Q620 445 623 444Q636 440 636 429Q636 423 616 340T593 253Q586 243 572 243H566Q545 243 539 249Q536 251 535 253T534 258T534 263T535 270T537 277H329L326 266Q323 251 318 247T295 243Q279 243 276 244Q263 248 263 259Q263 265 283 346Q288 366 295 394Q304 431 308 438T326 445H334H338Q366 445 366 428",120612:"247 624Q242 624 233 624T220 623Q186 623 186 640Q186 647 190 664T202 684Q206 686 226 686Q277 684 393 684Q435 684 471 684T528 685T553 686Q573 686 573 670Q573 650 564 632Q556 624 537 624H501H449L380 344Q309 64 309 63T356 62Q361 62 370 62T384 63Q417 63 417 46Q417 26 408 8Q403 3 396 0L352 1Q325 2 216 2T82 1L45 0Q30 7 30 16Q33 51 46 60Q51 62 102 62H154L294 623Q294 624 247 624",120613:"536 0Q522 6 522 18Q522 35 533 57Q539 62 557 62Q595 62 601 65L472 330L365 255L342 160Q318 65 317 64Q317 62 361 62H388Q420 62 420 44Q416 6 403 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 239 686Q290 684 403 684Q475 684 512 685T553 686Q576 686 576 668Q572 632 560 626Q555 624 506 624H457L422 481Q386 339 386 337L785 621Q779 624 749 624Q726 624 726 641Q726 645 730 659Q734 675 736 679T747 686L786 685Q812 684 888 684Q908 684 934 685T968 686Q1003 686 1003 669Q1003 646 991 629Q985 624 967 624Q918 624 888 617Q884 617 874 613L865 609Q864 608 732 515T599 420Q599 418 686 242T775 65Q784 62 829 62Q847 62 850 61T860 54Q862 52 862 43Q862 10 845 1Q844 1 842 1T836 0T797 1T694 2Q599 2 573 1L536 0",120614:"439 0Q425 6 425 18Q425 35 436 57Q442 62 485 62Q525 62 525 64L478 483Q478 484 465 463T422 394T350 277Q222 69 222 68Q223 67 224 67Q229 64 271 62Q290 62 297 59T305 45Q305 38 302 28Q297 9 293 5T274 0Q270 0 238 1T159 2Q133 2 105 2T72 1Q56 1 52 3T44 15Q44 19 48 35Q53 55 58 58T89 62Q142 64 151 73Q154 76 345 387T538 699Q550 711 570 711H580H592Q613 711 618 695Q619 692 654 379T690 63Q690 62 726 62H746Q776 62 776 44Q773 7 759 2Q755 0 747 0Q743 0 707 1T600 2Q502 2 476 1L439 0",120615:"258 624H231Q214 624 208 626T199 639Q203 678 216 684Q220 686 347 686H473Q474 685 478 682T484 677Q487 673 535 413L584 153L608 187Q631 221 672 281T761 410Q935 663 943 671Q949 678 962 686H1082H1166Q1201 686 1210 683T1219 668Q1215 632 1203 626Q1199 624 1149 624H1100L1031 344Q960 64 960 63T1004 62H1031Q1063 62 1063 44Q1060 7 1046 2Q1042 0 1034 0Q1030 0 990 1T875 2Q804 2 767 1T725 0H723Q707 0 703 15Q707 54 720 60Q724 62 773 62H822Q961 618 961 619L754 318Q546 15 543 12Q531 0 510 0Q500 0 495 0T484 5T477 19Q477 20 421 315L367 604L299 335Q234 72 234 68Q234 62 302 62Q334 62 334 46Q332 8 317 2Q313 0 306 0Q301 0 267 1T181 2Q125 2 96 1T63 0Q48 0 43 15Q43 19 47 35Q52 55 57 58T94 62Q147 64 164 69L233 345Q302 619 302 622Q302 624 258 624",120616:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 344 686H434Q464 686 477 680Q480 677 607 454Q738 227 739 227Q742 227 789 418T836 618Q836 620 835 620L821 622Q811 622 779 624Q755 624 749 625T740 632Q737 635 737 644Q737 656 742 669T754 685Q755 685 757 685T763 686Q768 686 803 685T890 684Q925 684 951 684T990 685T1006 686Q1014 686 1016 684Q1027 679 1027 668Q1023 632 1011 626Q1007 624 978 624Q912 622 907 617Q907 616 831 314T753 8Q749 0 723 0H712Q699 0 692 7Q692 8 671 44T607 155T526 296L361 580L296 323Q234 74 234 68T302 62H307Q334 62 334 44Q330 6 317 2L313 0L280 1Q260 2 181 2Q125 2 96 1T63 0Q48 0 43 15Q43 19 47 35Q52 55 57 58T94 62Q147 64 164 69L233 345Q302 619 302 622Q302 624 258 624",120617:"206 466Q175 466 175 484Q175 487 201 574T230 666Q235 673 241 675H547Q853 675 857 673Q867 668 867 657Q867 655 850 569T832 478Q827 466 808 466H802H795Q773 466 771 481Q771 486 775 508T779 541V549H774Q755 552 505 552Q281 551 267 548Q262 548 255 533T242 496T233 472Q228 466 206 466ZM259 255H252Q231 255 228 270Q228 275 248 355T270 439Q277 448 288 448H298Q321 448 326 440Q331 434 326 414Q326 413 486 413H647L650 424Q654 441 658 444T678 448H683H693Q702 448 705 446T714 432L694 348Q674 267 669 261Q664 255 652 255H643Q622 255 617 261Q613 265 613 272T613 283T616 289Q616 290 456 290H295L294 285Q293 280 292 275T288 265T281 257Q278 255 259 255ZM150 131Q150 124 281 123Q346 123 390 123Q640 123 664 126Q668 127 675 127Q686 131 704 198Q708 213 713 216T733 220H738Q755 220 759 218Q768 213 768 203Q768 198 741 105T710 8Q708 4 699 0H388Q77 0 73 2Q62 7 62 18Q62 27 81 115Q99 206 102 212Q106 220 120 220H129Q140 220 145 220T155 215T160 202Q160 196 159 192Q150 145 150 131",120618:"53 245Q53 297 70 356T125 478T216 590T349 671T523 703Q656 703 735 637T815 445Q815 378 791 307Q727 104 527 17Q437 -17 344 -17Q289 -17 242 -5T150 35T79 116T53 245ZM664 489Q664 575 618 611T511 648Q463 648 416 627T334 570Q297 531 270 472T230 355T213 261T208 206Q208 177 215 151T237 98T284 56T358 40Q440 40 510 98T618 270Q664 400 664 489",120619:"257 618H231Q198 618 198 636Q202 672 214 678L219 680H1011Q1022 675 1026 665Q1022 626 1009 620Q1005 618 956 618H907L906 614Q906 613 838 339T768 64Q768 62 812 62H839Q871 62 871 44Q867 6 854 2L850 0L808 1Q782 2 675 2Q600 2 560 1T516 0Q499 0 494 15Q498 54 511 60Q515 62 564 62H613L614 66Q614 67 682 341T752 616Q752 618 604 618H456L455 614Q455 613 387 339T317 64Q317 62 361 62H388Q420 62 420 44Q416 6 403 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L163 66Q163 67 231 341T301 616Q301 618 257 618",120620:"162 62L302 623Q302 624 258 624H234Q214 624 209 626T200 638Q200 677 217 684Q220 686 439 686Q667 685 684 682Q686 681 693 680Q713 677 733 671T782 649T829 602T847 528Q847 450 784 382T604 293Q571 288 469 287H373L346 176Q340 151 333 122T321 78L317 64Q317 62 361 62H387Q420 62 420 44Q417 10 404 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q43 0 43 17Q43 21 47 33Q52 54 57 58T89 62H113H162ZM692 558Q692 611 617 622Q610 623 529 624H452L381 343H458H492Q604 343 641 389Q662 414 677 471T692 558",120622:"847 430Q828 430 823 434T817 450Q817 454 817 466T818 487Q818 526 809 551T784 591T737 613T675 622T590 624H528H430L513 487Q594 351 596 345Q596 335 590 330Q583 323 418 204L250 81L363 80Q533 80 591 89T694 142Q739 185 765 252Q772 268 776 271T799 274Q816 274 820 272Q832 266 830 254Q829 250 784 130T736 7Q732 3 725 0H405Q84 0 80 2Q69 7 69 18Q69 26 75 32Q76 32 98 48T168 100T255 164L432 293Q429 300 329 465T225 637Q223 675 245 686H888Q900 680 902 671Q902 667 890 556T876 441Q871 430 847 430",120623:"498 62Q511 58 511 43Q511 10 494 1L490 0Q487 0 482 0T424 1T271 2Q201 2 157 2T94 1T72 0H70Q46 0 46 17Q49 54 62 60L66 62H137Q208 62 209 63L218 98Q227 134 244 203T278 339L347 613H300Q262 612 246 611T198 599T146 564Q128 545 114 512T91 454T79 425Q73 419 52 419Q22 419 22 434Q22 440 41 498T80 611L100 666Q105 673 111 675H434Q758 675 762 673Q772 668 772 657Q772 655 756 549T738 434Q735 419 711 419H707Q690 419 686 421Q677 425 677 434Q676 436 678 449T683 485T686 529Q686 553 679 569T662 594T631 607T593 612T544 613H502L433 340Q418 279 400 207T374 100L365 65L364 62H498",120624:"32 544Q32 586 91 644T229 703Q277 703 311 683T363 628T389 560T397 491V478L404 491Q455 589 526 646T677 703Q730 703 766 671T802 584Q802 551 793 541T766 531H757L736 532L732 535L729 539V549Q731 569 715 575T658 581H650Q545 581 477 443Q453 392 443 351Q441 345 424 273T389 133T371 64Q371 62 428 62H461Q483 62 492 59T501 44Q498 10 485 2L480 0L431 1Q401 2 278 2T127 1L85 0Q71 5 71 17Q71 24 74 33Q77 46 78 49T84 57T95 61T118 62H154H216Q232 126 249 193T273 287T287 345T296 388T299 416T300 452Q294 581 198 581Q154 581 132 575T106 562T99 546T86 533Q82 531 60 531L39 532Q32 537 32 544",120625:"323 624H293Q267 624 261 626T251 639Q255 678 268 684Q272 686 293 686Q348 684 475 684Q557 684 600 685T647 686H648Q671 686 671 668Q667 632 655 626Q650 624 588 624H525L500 520Q500 519 520 518T579 507T656 480Q737 440 737 372Q737 294 648 237Q562 180 426 169L412 168L399 118Q386 66 386 65L385 62H443H479Q498 62 506 59T515 44Q511 8 499 2L494 0L447 1Q417 2 298 2Q212 2 167 1T118 0Q100 0 95 15Q99 54 112 60Q116 62 179 62H241Q242 64 254 114T266 167Q266 168 262 168Q256 168 237 170T180 181T110 205T54 249T29 316Q29 391 112 446T327 516Q345 518 349 518Q351 518 353 518L355 519Q356 520 368 570T381 623Q381 624 323 624ZM342 466Q341 467 339 467Q320 467 283 455T225 420Q181 361 181 296Q181 273 193 257T222 233T254 222T277 219L280 220Q281 220 311 342T342 466ZM583 389Q583 409 576 423T557 444T533 456T509 463T492 467H486L455 343Q444 300 437 271T428 231T426 219Q430 219 445 222T483 232T521 250Q551 269 567 310T583 389",120626:"931 686Q953 686 953 670Q953 650 944 632Q936 624 924 624H914Q823 624 803 611Q800 609 696 503T591 396Q591 394 667 229L743 62H787H814Q846 62 846 44Q843 7 829 2Q825 0 817 0Q813 0 775 1T664 2Q590 2 551 1T508 0H507Q484 0 484 18Q484 19 488 37Q492 56 497 58T534 62L566 63Q567 64 520 169T471 274Q469 274 369 172T268 67L315 62Q320 62 328 62L335 61Q347 58 347 44Q344 10 331 2L326 0L287 1Q263 2 177 2Q95 2 78 1L53 0Q38 6 38 17Q38 40 50 57Q56 62 78 62Q169 62 188 75Q194 77 435 324L444 334L439 347Q437 351 373 492L313 624H268H246Q220 624 212 632Q210 636 210 642Q210 655 215 669T227 684Q230 686 247 686Q295 684 398 684Q438 684 472 684T527 685T551 686Q567 686 572 671Q572 667 568 651Q563 631 558 628T523 624T492 623H488L526 540Q563 457 564 457Q564 456 574 466T604 496T645 537L724 619Q716 622 677 624H673Q645 624 645 640Q645 660 654 678Q659 683 666 686L704 685Q728 684 813 684Q847 684 873 684T913 685T931 686",120627:"205 471Q205 445 196 403T186 333Q186 303 194 281T218 248T240 233T262 224L361 623Q361 624 303 624Q296 624 284 624T266 623Q232 623 232 641Q232 648 235 657Q240 678 244 682T268 686H273Q329 684 457 684Q502 684 540 684T599 685T626 686H628Q651 686 651 668Q649 633 631 624H505L407 227Q410 228 416 229T439 239T472 259T507 294T539 345Q549 365 563 416T597 498T649 538Q657 540 717 540Q725 540 737 540T755 541Q790 541 790 524Q790 512 784 497Q780 491 767 490T742 477Q736 471 731 463T722 449T715 433T710 419T705 403T701 389Q686 340 658 302T599 240T530 201T463 179T404 169L391 168L379 116Q365 67 365 63Q365 62 422 62H455Q477 62 486 59T495 44Q492 10 479 2L474 0L427 1Q397 2 278 2T131 1L90 0Q76 5 76 17Q76 24 79 33Q82 46 83 49T89 57T100 61T123 62H159H221Q247 162 247 168H244Q241 169 239 169Q202 176 178 182T123 207T74 252Q46 291 46 351Q46 375 52 404T59 454Q59 489 40 489Q32 489 27 494T22 507Q22 535 37 538Q40 540 99 540H128Q168 540 186 528T205 471",120628:"162 119Q181 115 235 115L273 116Q273 133 231 222T180 345Q173 368 173 391V406V414Q173 477 214 540Q255 600 315 635Q353 661 423 682T585 703Q656 703 711 690T799 656T851 608T879 555T886 503Q886 449 860 401Q840 359 810 322T725 230T643 146Q619 117 619 116T650 115Q707 115 722 120Q730 123 750 165T775 210Q779 212 796 212Q828 212 828 196Q828 191 807 144T764 52L743 7Q740 4 740 4T733 2T717 0T686 0H632H573Q535 0 526 3T517 17Q517 44 544 103T617 243T671 341Q729 454 729 535Q729 599 686 625T583 652Q549 652 517 645T450 616T388 561T344 470T327 340Q327 304 331 237T336 135Q336 93 330 50T313 2Q308 0 208 0H142Q107 0 100 4T93 25Q93 28 93 41T95 77T96 118L100 199Q105 208 109 210T131 212Q147 212 151 210T161 199V160Q161 131 162 125V119",120630:"39 166Q39 213 59 261T117 353T219 424T362 452Q420 452 466 433T536 384T573 325T586 269V265Q593 272 609 308T636 381Q640 397 644 399T669 402H680Q700 402 700 388Q700 379 691 351T659 276T604 188L593 173L595 153Q600 79 612 43H618Q634 45 642 51T653 64T658 71Q661 73 684 73Q712 73 712 59Q712 39 685 16T603 -7Q588 -7 575 -5T551 2T532 12T516 24T503 37T494 49T487 60T481 69L469 61Q362 -8 251 -8Q159 -8 99 36T39 166ZM260 43Q310 43 361 63T438 101T465 124Q458 240 453 277Q435 401 354 401Q291 401 245 355Q230 337 217 313Q201 279 186 216T170 126Q170 72 208 54Q230 43 260 43",120631:"59 -194H49Q31 -194 28 -182Q28 -178 107 139T192 473Q212 533 248 580T324 652T395 689T450 701H461Q514 701 551 688T605 652T630 607T637 561Q637 546 634 526T611 465T556 393Q572 382 590 347T608 262Q608 146 522 69T299 -8Q279 -8 261 -6T228 2T204 13T183 26T169 37T157 48L150 56L120 -64Q113 -90 104 -128Q93 -175 89 -184T73 -194H59ZM531 592Q531 651 463 651Q399 651 341 600T253 466Q250 458 217 327T182 185Q180 176 180 159Q180 108 212 76T301 44Q330 44 354 51T393 65T423 91T444 118T459 151T468 179T475 206Q490 264 491 296Q491 313 489 326T484 345L482 350Q481 350 477 348T464 344T444 340T413 335T372 333T334 334T301 340T274 355T265 380Q265 444 397 444Q425 444 445 441T476 436L485 433Q489 433 499 458Q509 482 520 527T531 592ZM424 390Q424 393 389 393Q383 393 374 393T362 392Q348 392 333 388Q345 384 379 384Q424 384 424 390",120632:"5 269Q5 285 19 312T57 368T124 421T215 451H241Q274 451 303 439T353 406T389 361T416 311T432 266T442 232L444 220L446 216L450 226Q473 278 513 357T561 441Q566 444 584 444H594Q617 444 617 430Q617 426 596 389T536 273T462 110L452 84L451 70Q447 12 427 -76T388 -192Q375 -211 355 -211Q339 -211 332 -198T325 -171Q325 -114 386 64L393 84V98Q393 181 371 241Q360 280 319 303T210 327Q158 327 126 317T84 296T68 272T59 258Q55 256 36 256Q23 256 18 256T9 260T5 269",120633:"216 610Q216 640 229 664T262 700T299 719T327 725Q330 725 406 709T487 690Q513 681 513 651Q513 627 494 607T450 587Q417 587 378 631Q346 663 314 663Q286 663 272 639Q271 637 271 634Q271 609 344 536L397 484Q438 448 458 410T478 313Q478 234 443 147T338 18Q298 -8 249 -8Q214 -8 180 0T113 26T60 81T39 168Q39 200 50 237T87 316T160 391T272 442L260 465Q216 553 216 610ZM348 235Q348 274 336 313T310 372L298 392Q295 391 290 390T269 380T241 359T212 323T185 267Q157 168 157 130Q157 83 186 63T255 43Q280 43 300 67Q317 89 332 138T348 235",120634:"224 -17Q126 -17 81 22T36 112Q36 178 84 226L93 236L88 246Q79 264 79 289Q79 341 124 388Q201 461 333 461Q402 461 455 425Q480 409 481 390Q481 365 464 350T428 334Q415 334 387 352T313 370Q141 370 141 293Q141 275 146 270Q147 270 148 270T155 272Q202 291 263 291H270Q349 291 349 244Q349 195 281 183Q274 182 239 182Q201 182 184 185T137 200Q123 188 112 168T100 129T112 98T148 81T189 75T237 74H243H251Q288 74 310 75T359 86T398 112Q405 124 417 124Q426 124 432 117T439 100Q439 88 427 70T390 32T322 -3T224 -17ZM286 238Q286 240 253 240Q245 240 234 239T216 237T209 235Q209 232 250 232Q286 232 286 238",120635:"361 711Q373 711 381 703T389 683Q389 681 388 676T383 656T376 618V612H379Q385 618 429 618Q521 618 521 572Q521 551 506 534Q483 510 415 507Q385 507 371 511T336 536L326 528Q254 472 204 381T154 209Q154 190 157 177Q159 165 162 154T170 135T182 119T195 106T212 95T229 86T249 78T269 72T290 66T311 60Q385 37 388 36Q437 14 454 -36Q456 -46 456 -64Q456 -83 455 -90Q445 -132 413 -167T333 -202Q300 -202 257 -191T206 -169Q203 -164 203 -158Q203 -148 210 -140T231 -130Q239 -130 263 -139T326 -151H329Q337 -151 342 -150T352 -143T357 -123Q356 -117 355 -113T350 -104T344 -96T335 -90T324 -85T310 -80T294 -74T275 -68T254 -62Q253 -62 231 -56T205 -48T179 -39T150 -26T125 -10T100 11T80 37T62 70T53 109T48 157Q48 281 123 396T317 586V612Q319 638 320 649T325 678T338 703T361 711ZM454 564Q445 567 424 567Q407 567 398 565T387 563Q387 558 411 558Q434 558 450 562L454 564",120636:"24 296Q25 302 27 312T41 350T65 397T103 435T157 452Q202 452 233 435Q267 419 284 384L294 392Q304 401 316 410T348 429T388 445Q410 451 445 451H453Q468 451 482 450T519 443T558 425T587 391T600 337V327Q600 311 538 64Q484 -158 478 -168Q457 -211 409 -211Q386 -211 372 -197T357 -161Q357 -158 415 80Q476 330 477 348Q477 366 473 377T461 393T448 399T432 400H427Q379 400 335 363Q300 332 280 298Q277 293 246 170T213 40Q205 22 186 7T142 -8T103 7T89 39Q89 49 106 117T142 260T164 351Q166 363 166 372Q166 402 148 402Q126 402 110 369Q100 350 90 310Q85 289 82 286T60 282H55H44Q24 282 24 296",120637:"213 -8Q130 -8 85 50T40 200V207Q40 303 83 428Q122 535 189 608Q279 702 381 702Q410 702 437 693T492 661T537 593T554 486Q554 428 539 362T495 230T425 111T330 25T213 -8ZM433 562Q433 600 419 625T377 651Q363 651 348 644T311 619T268 557T229 453Q225 441 217 411T208 378H401Q433 500 433 562ZM161 140Q161 43 217 43Q249 43 280 74Q310 103 332 150T378 287Q385 313 385 315Q385 316 289 316H192Q191 308 183 275T169 205T161 140",120638:"161 -8Q111 -8 75 16T38 85Q38 95 48 121T80 214T123 368L124 374Q126 381 127 386T132 399T139 414T149 428T162 440T180 448T203 452Q226 452 241 439T257 404Q257 386 230 290T171 111Q157 73 157 57Q157 43 166 43Q209 43 258 69T322 144Q326 157 330 159T348 162H355H366Q386 162 386 148Q386 143 383 132T367 100T335 61Q301 27 253 10T161 -8",120639:"258 405Q258 394 251 364T237 308T230 281T238 284T270 306T330 349Q365 377 389 394T450 427T519 444Q545 444 559 430T574 391Q574 360 551 336T491 312Q469 312 454 326T439 364Q439 372 438 372Q433 372 395 344T320 289T283 260H285Q287 260 290 260T297 259Q495 248 495 146Q495 132 491 110T486 74Q486 43 505 43Q520 43 531 53Q559 72 578 141Q582 157 586 159T611 162H622Q642 162 642 148T627 100T578 29T504 -7H495Q435 -7 399 22T363 96Q363 111 366 122T369 142Q369 155 364 165T347 182T326 193T298 200T269 204T238 207T212 210L211 206L190 123L169 40Q161 22 142 7T98 -8T59 7T45 39Q45 48 67 139T112 317L134 404Q142 424 161 438T204 452Q226 452 242 440T258 405",120640:"95 -13Q70 -13 55 4T40 41Q40 65 61 88Q65 92 210 207T357 322L235 602Q217 640 185 643Q182 643 178 644T173 645Q161 651 161 666Q161 677 167 684T181 692Q189 694 212 694Q335 694 358 660Q362 653 500 340T647 18Q652 10 652 6Q652 -8 622 -8H589H538L526 -5Q506 1 500 8Q494 16 444 128Q442 133 440 138L387 259L265 134Q156 20 137 4T95 -13",120641:"294 -8Q265 -8 244 -5T213 1T201 4Q200 4 192 -32T172 -111T155 -168Q134 -211 86 -211Q62 -211 48 -196T34 -158Q37 -144 103 123T174 404Q182 424 201 438T244 452Q271 452 284 436T298 404Q298 392 267 269T235 114Q235 43 305 43Q342 43 375 68T418 110Q420 112 455 253T492 397Q514 444 562 444Q587 444 601 429T615 397Q615 387 599 320T563 178T542 93Q540 81 540 72Q540 42 558 42Q580 42 596 75Q606 94 616 134Q621 155 624 158T646 162H651H662Q682 162 682 148Q681 142 679 132T665 94T641 47T602 9T548 -8Q523 -8 502 -3T468 11T446 27T432 40L429 46Q367 -8 294 -8",120642:"88 382Q70 382 65 385T59 402T64 427T78 443Q79 444 157 448T247 452Q256 452 261 448T266 440L267 437Q267 432 223 252L177 71L192 77Q293 117 371 199T480 388Q489 424 511 438T556 452Q579 452 593 438T608 402Q608 378 593 340T540 251T446 152T299 62T96 -1Q91 -2 78 -2Q38 -2 38 15Q38 22 82 198L127 379Q124 382 88 382",120643:"287 648Q291 671 293 680T305 700T329 711Q339 711 347 705T356 687Q356 680 351 653T345 619Q345 615 346 615Q358 618 398 618Q490 618 490 572Q490 553 476 536T434 512Q411 508 378 508H366Q332 508 306 534L298 525Q271 496 254 456T237 375Q237 336 244 336Q272 346 319 346H325Q354 346 372 344T406 331T422 300Q422 252 350 238Q332 236 303 236Q286 236 269 238T240 242T218 247T202 252L196 254Q191 254 174 237T141 191T124 139Q124 108 151 92T267 46Q285 40 295 37Q308 33 332 25T366 13T392 3T415 -8T432 -20T445 -36T451 -55T454 -80Q454 -118 427 -153T358 -199Q349 -201 327 -201Q313 -201 298 -200T271 -196T246 -191T226 -185T210 -180T200 -176L196 -174Q187 -170 187 -158T196 -138T216 -130Q217 -130 254 -140T329 -151Q349 -151 349 -135Q349 -127 340 -122T293 -104Q260 -93 238 -85Q130 -48 115 -41Q71 -19 47 15T23 88Q23 126 48 179T130 277L144 288L136 297Q99 336 99 390Q99 456 148 514T285 602V619Q285 624 286 635T287 648ZM355 563Q362 560 376 558Q424 558 423 564Q405 567 390 567Q369 567 355 563ZM279 292Q297 287 315 287Q355 287 355 293Q355 296 321 296Q316 296 308 296L301 295Q295 295 289 294L279 292",120644:"254 -8Q191 -8 146 9T80 54T49 111T39 169Q39 206 53 247T96 329T176 402T292 446Q317 451 336 451L344 452Q353 452 359 452Q457 452 516 408T576 279Q576 169 488 81T254 -8ZM349 400Q321 400 287 385T231 338Q206 301 188 228T170 126Q170 99 178 83Q198 44 260 44Q367 44 409 157Q419 185 432 238T445 317Q445 336 443 348Q435 372 416 384T384 398T349 400",120645:"55 289H43Q23 289 23 303Q23 308 33 322Q116 434 199 443Q200 444 418 444Q591 444 617 444T652 439Q674 426 674 400Q674 378 661 360T625 335Q621 334 549 333H479L477 321Q476 312 476 279Q476 219 491 174T521 104T536 65Q536 38 511 15T457 -8Q403 -8 386 94Q384 110 384 139Q384 181 391 229T406 304L413 331Q413 333 365 333H316L315 329Q315 328 312 314T301 272T288 220Q274 167 258 103Q244 49 240 38T228 18Q225 16 224 14Q200 -8 172 -8Q146 -8 132 7T118 44Q118 54 121 61Q122 65 142 102T190 195T235 293Q250 329 250 333Q177 333 166 332Q115 328 88 301L77 290L55 289",120646:"307 -8Q277 -8 251 0T215 14L205 20Q203 18 193 -25T171 -114T155 -168Q134 -211 87 -211Q64 -211 49 -198T34 -162Q34 -158 137 254Q153 299 179 334T232 390T277 419T311 434Q357 451 403 451Q435 451 455 449T506 435T560 400Q603 357 603 285Q603 172 520 82T307 -8ZM474 343Q474 364 458 382T409 400H406Q339 400 299 341Q281 313 264 257Q261 248 242 170T222 89Q222 84 230 74T260 54T308 43Q334 43 365 57T417 110Q437 145 456 228Q474 298 474 332V343",120647:"33 209Q33 277 80 334T195 421T330 451H344Q410 451 439 429Q457 417 457 402Q457 386 445 375T420 363Q415 363 406 368T383 383T354 398Q347 400 330 400Q256 400 196 361T135 265V257Q135 242 147 225T174 199L358 107Q400 77 400 28T362 -63T271 -105Q254 -105 229 -99T195 -86Q188 -82 188 -71Q188 -56 197 -50T216 -44Q225 -44 237 -48T270 -53H282Q293 -44 293 -31Q293 -19 283 -10Q278 -4 200 33T115 76Q77 98 55 133T33 209",120648:"35 151Q35 190 51 236T99 327T184 404T306 443Q307 443 316 443T342 443T378 444T425 444T476 444Q606 444 626 444T655 439Q677 426 677 400Q677 358 639 340Q625 333 563 333Q510 333 510 331Q518 319 518 272Q518 155 437 74T226 -8Q123 -8 79 41T35 151ZM396 278Q396 314 375 323T305 332Q249 332 222 310T180 243Q171 219 162 178T153 116V110Q153 43 234 43Q347 43 382 199Q383 203 383 204Q396 255 396 278",120649:"55 289H43Q23 289 23 303Q23 308 33 322Q116 434 199 443Q200 444 386 444Q571 444 577 442Q588 441 599 432T610 402Q610 359 572 340Q561 335 547 334T452 333H353V331Q352 330 342 261T320 119T306 40Q300 18 281 3Q257 -13 233 -13Q210 -13 196 0T181 35Q181 44 182 48Q183 53 229 187T279 331Q279 333 228 333H209Q163 333 136 328T88 301L77 290L55 289",120650:"189 388Q189 396 187 398T176 401Q144 399 122 369T89 304Q84 288 81 285T61 282H55H44Q24 282 24 296Q24 306 34 330T64 382T116 431T188 452Q232 452 270 430T308 361Q308 345 275 258T241 123Q241 44 336 44H344Q380 44 415 73T474 140T511 214T526 267Q526 280 513 292Q505 301 486 311T456 333T444 367Q444 400 471 426T529 453Q555 453 579 431T604 358Q604 327 592 271T557 172Q550 157 541 142T510 97T464 47T404 9T328 -8Q264 -8 219 5T154 41T125 85T117 131Q117 182 153 277T189 388",120651:"238 4Q230 5 218 8T174 26T118 58T73 112T53 190Q53 219 60 246Q77 313 103 362T143 426T163 443Q165 444 186 444Q217 444 217 432Q217 425 188 392Q157 351 137 291T116 206Q116 127 263 109L276 107L288 139Q347 304 414 378T566 452Q621 449 662 412T703 286Q698 167 598 82T357 -8H332V-11Q332 -12 327 -46T317 -116T310 -157Q306 -180 286 -198T234 -216Q211 -216 197 -203T183 -168Q183 -160 184 -155Q184 -152 198 -112T225 -34T238 4ZM637 260Q637 303 607 322T541 341Q502 341 466 319T405 264Q368 218 356 159Q348 111 348 104Q348 103 361 103Q502 103 569 152T637 260",120652:"58 -194Q32 -194 32 -164Q32 -153 46 -139L175 -13Q296 104 296 106Q271 232 226 308Q165 401 141 401Q128 401 117 390T100 365Q94 350 91 349T69 346H45Q35 348 35 359Q35 380 62 411T133 450Q143 452 165 452Q286 452 329 402Q347 379 366 333T394 254T404 215Q404 213 405 213Q405 212 420 227T463 268T520 324Q637 437 640 438Q647 444 661 444Q667 444 676 438T685 419Q685 405 670 389T549 271L420 145Q433 85 444 53Q466 -25 509 -88T575 -151Q590 -151 600 -140T617 -114T626 -98Q629 -96 650 -96H655Q681 -96 681 -108Q681 -114 679 -119Q670 -148 646 -169T591 -199Q581 -201 550 -201Q422 -201 381 -143Q345 -88 316 20L311 39L230 -40Q144 -126 114 -153Q85 -182 77 -188T58 -194",120653:"244 141Q244 117 254 98T277 70T305 55T329 48T342 47L344 48L424 366Q501 678 505 686Q508 691 512 692T533 694T555 693T562 688T565 683Q565 678 486 362T406 45Q406 43 415 43Q467 49 514 78T590 143T636 213T653 266Q653 282 641 293T613 311T585 332T572 367Q572 397 598 425T657 453Q684 453 708 430T732 358Q732 330 723 287T706 225Q671 124 578 58T401 -8H393L370 -101Q346 -196 345 -197Q340 -202 316 -202H306Q286 -202 286 -188Q286 -187 296 -144T318 -57T331 -8Q331 -6 328 -6Q290 -6 233 11T148 62Q119 97 119 146Q119 181 154 275T190 388Q190 401 181 401Q154 401 129 375T90 306Q85 288 81 285T61 282H55H44Q24 282 24 296Q24 306 34 329T64 381T116 431T189 452Q237 452 273 428T309 362Q309 343 277 260T244 141",120654:"532 367Q532 399 559 426T618 453Q645 453 668 430T691 357Q691 319 677 261T649 171Q640 149 626 125T586 68T521 14T438 -7Q401 -7 372 7T333 30T311 57Q246 -8 165 -8Q119 -8 82 19T30 102Q24 126 24 163V178Q24 210 37 255Q61 346 118 424Q141 451 161 451Q174 451 184 443T194 419Q194 402 179 387Q91 273 91 206Q91 159 122 138T189 117T281 145V173Q283 223 294 253Q304 276 323 289T364 303Q386 303 400 287T415 250Q415 219 385 157L378 144Q378 142 388 136T419 124T462 117Q522 117 566 165T610 255Q610 288 561 320Q532 337 532 367",120655:"230 475Q202 475 189 492T175 526T186 570T221 631T288 687T389 710Q430 710 438 709Q495 701 537 679T601 629T637 568T653 509T657 459Q657 409 640 341Q617 248 581 180T507 75T424 16T348 -11T282 -17Q171 -17 113 37Q60 88 60 159Q60 192 71 231Q96 336 184 402Q264 462 366 462Q407 462 439 448T497 389L502 380Q503 381 508 403T519 463T525 531Q523 580 499 610T447 648T387 657Q324 657 283 616Q271 604 276 604Q279 604 286 600T302 583T311 555Q311 523 287 499T230 475ZM196 110Q196 41 287 41Q351 41 398 88Q422 111 437 151Q473 243 473 298Q473 386 409 409Q408 409 383 411Q316 411 278 373Q265 360 259 351T241 311T217 226Q196 143 196 110",120656:"415 89Q423 89 429 74T436 46Q436 43 434 39Q432 36 420 29T380 11T322 -5Q311 -7 281 -7Q216 -7 168 10T94 54T56 110T44 167V181Q44 262 94 329Q104 343 119 357T162 391T234 425T327 443Q328 443 348 443T383 444Q434 444 442 438Q450 430 450 416Q446 392 424 383L376 382Q306 381 278 369Q230 349 208 294Q199 274 199 268Q199 267 291 267Q305 267 325 267T353 268Q383 268 394 263T406 241Q406 214 380 206Q375 205 279 205T183 203Q174 176 174 140Q174 87 208 65T292 43Q295 43 300 43T307 44Q337 49 372 69T415 89",120657:"114 132Q114 153 140 253T166 372Q166 402 148 402Q126 402 110 369Q100 350 90 310Q85 289 82 286T60 282H55H44Q24 282 24 296Q25 302 27 312T41 350T65 397T104 435T158 452Q184 452 211 445T263 414T288 354V339L265 245Q237 134 237 118V107V102Q237 87 239 77T257 56T300 43Q395 43 455 254Q479 346 479 347L460 354Q294 408 294 528Q294 606 350 653T464 701Q536 701 579 659Q634 601 634 491Q634 468 630 438T623 388L620 370Q624 370 631 369T647 364T656 352Q656 347 653 335Q647 317 642 316Q640 315 637 315Q635 315 619 317Q606 319 605 316Q605 315 603 308Q587 248 550 177T457 57Q379 -8 293 -8Q192 -8 153 23T114 116V132ZM519 566Q519 600 507 625T464 651Q425 651 391 617T356 529Q356 501 370 478T404 441T443 417T477 404L491 400Q493 400 499 428T512 497T519 566",120658:"228 325Q170 322 156 316T127 309Q108 309 104 314Q99 319 99 322T108 341Q125 376 171 400T268 425H271Q302 425 319 396Q328 377 328 358Q328 332 324 314Q311 270 286 221Q274 194 274 192H275Q339 234 484 325T639 421Q669 434 691 434T723 425T734 406Q734 394 719 381Q715 376 644 330L575 287L566 267Q543 233 526 176Q520 160 515 143T508 115T506 105Q506 103 533 103Q585 103 607 110T641 118Q670 118 670 107Q670 100 661 85Q643 50 598 27T504 3Q465 3 450 36Q441 51 441 73Q441 84 444 96Q452 146 484 205L497 236L324 125Q143 12 135 10Q103 -6 77 -6Q61 -6 49 2T37 21Q37 36 49 46T124 96L195 141L204 156Q219 179 243 248T264 323Q264 325 228 325",120659:"274 -7Q232 -4 195 7T125 38T71 94T51 176V190Q51 213 60 242T95 307T156 373T255 425T393 451L397 452L427 568Q434 597 443 636Q452 677 456 685T472 694H486H495Q517 694 517 680L514 665Q510 650 503 621T489 564L460 451H469Q527 447 574 430T657 370T693 266Q693 163 599 82T350 -7H346L322 -100Q301 -190 295 -197Q291 -202 283 -202H269H258Q238 -202 238 -188Q238 -186 260 -96L283 -7H274ZM449 400Q448 400 404 225T359 47T366 45Q464 55 516 119Q542 149 558 199T575 295Q575 387 462 398L449 400ZM384 398Q384 399 381 399Q350 399 298 378T214 308Q168 236 168 149Q168 68 259 49Q282 44 294 44H295L384 398",120660:"371 -168Q357 -168 323 -171T245 -175Q143 -175 109 -150T75 -66Q75 -5 100 108T137 254Q153 299 179 334T232 390T277 419T311 434Q357 451 403 451Q435 451 455 449T506 435T560 400Q603 357 603 282Q603 213 569 148T465 38T304 -8Q273 -8 247 -2T204 14T176 31T159 46T152 53Q152 52 148 27T144 -16Q144 -36 150 -44T189 -58T293 -64Q405 -65 432 -75Q466 -88 466 -127Q466 -140 459 -172Q455 -188 451 -191T426 -194H420Q405 -194 400 -191T395 -176Q396 -170 394 -169T378 -168Q373 -168 371 -168ZM236 116Q236 77 258 60T311 43Q369 43 407 94Q429 123 451 206T474 331Q474 400 409 400H406Q339 400 299 341Q276 305 256 227T236 116",120661:"55 289H43Q23 289 23 303Q23 308 33 322Q116 434 199 443Q200 444 562 444Q922 444 928 442Q961 434 961 400Q961 376 944 355T886 333H870Q872 322 872 295V279Q872 230 842 165T751 46T618 -8Q581 -8 554 6T513 45T494 84T484 119Q484 121 478 114Q477 113 476 111Q384 -7 268 -7H265Q251 -7 237 -4T199 11T162 54T147 132Q147 149 149 166T155 198T165 229T176 256T189 281T200 301T211 319T220 333H199Q120 333 88 301L77 290L55 289ZM639 103Q674 103 712 122T780 188T811 295Q811 318 808 330V333H289Q274 318 244 263T214 169Q214 133 236 118T288 103Q351 103 412 153T494 278Q497 290 502 292T529 295Q546 295 551 293T556 283Q556 281 553 260T550 218Q550 153 576 128T639 103",120662:"110 0H86Q42 0 42 27Q42 37 148 350T258 667Q269 687 291 692Q295 694 366 694H399Q432 694 448 689T474 667Q477 663 583 350T690 27Q690 0 642 0H617H592Q582 0 575 1T561 2T549 6T541 11T533 18T527 26T522 37T517 49T512 64T506 81L490 130H225Q225 128 208 79T189 27Q185 19 180 14T170 7T156 3T143 1T127 0T110 0ZM439 279Q359 524 359 547L357 555L355 543Q347 503 270 263L259 231H357Q455 231 455 232L439 279",120663:"119 1Q98 5 92 28V667Q98 686 118 693Q121 694 272 694H289H346Q439 694 500 681T600 625Q640 580 640 513Q640 451 601 414T504 364L518 361Q568 351 602 329T649 280T666 235T671 197Q671 172 665 147T642 91T586 37T488 5Q456 1 282 1H119ZM489 509Q489 532 479 548T450 573T421 585T394 591Q387 592 315 593H247V404H298H325Q432 404 466 444Q489 470 489 509ZM517 194Q517 235 502 261T458 299T407 313T353 317H329H322H247V101H319H357Q387 101 407 103T452 111T492 133T514 171Q516 176 517 194",120664:"92 664Q98 683 118 690Q121 691 312 691T508 689Q534 682 534 644V632V618Q534 582 508 573L502 572Q496 572 489 572Q486 572 463 572T416 573Q333 573 291 575H253V303Q253 31 251 25Q242 0 199 0H170L119 1Q99 7 92 28V664",120665:"381 692Q386 694 458 694Q516 694 527 693T549 687Q564 680 575 663Q576 658 715 349T856 27Q856 6 838 1H826Q815 1 795 1T747 1T686 1T616 0T539 0T458 0T378 0T300 0T230 0T169 1T122 1T90 1H78Q60 6 60 27Q62 38 201 349T341 663Q356 687 381 692ZM627 148Q626 149 581 250T492 453L447 554Q447 553 446 552Q444 546 326 278L268 148Q268 147 448 147Q627 147 627 148",120666:"277 122Q280 122 380 123T544 125Q552 125 557 125T565 124T569 124Q595 115 595 75V62V47Q595 9 569 2Q564 0 341 0L119 1Q99 7 92 28V664Q98 683 118 690Q121 691 335 691T554 689Q580 682 580 644V632V618Q580 582 554 573Q553 573 551 573T542 572T527 572Q464 572 364 573T260 575H253V412H385H459Q524 412 536 404T549 357Q549 341 549 334T542 318T523 305Q518 303 385 303H253V122H277",120667:"411 584Q243 581 131 581Q122 581 116 581T106 582T102 582Q84 589 80 600T76 640L77 667Q83 686 103 693Q106 694 343 694Q579 694 584 692Q592 691 599 684T609 668Q610 665 610 646Q610 614 608 608Q605 603 434 361L261 116Q340 117 402 118T490 119T533 120T560 120H572Q605 120 614 95Q616 89 616 60V46Q616 9 590 2Q585 0 339 0Q92 0 87 2Q79 3 72 10T62 26Q61 29 61 49Q61 84 63 90Q65 94 152 217T325 461T411 584",120668:"92 667Q101 694 143 694H172H198Q244 694 251 669Q253 663 253 539V415H540V539Q540 558 540 585T539 621Q539 673 550 683T611 694H621H646Q671 694 683 690T700 669Q702 663 702 347T700 25Q696 9 684 5T646 0H621H606Q560 0 550 11T539 76Q539 85 539 116T540 169V306H253V169Q253 147 253 116T254 75Q254 23 245 12T194 0H170L119 1Q99 7 92 28V667",120669:"62 340Q62 716 425 716Q511 716 576 696T681 642T747 559T783 458T793 341Q793 264 777 203T721 89T608 7T428 -22Q62 -22 62 340ZM638 333Q638 365 637 387T632 441T621 495T600 542T567 583T518 611T451 628Q443 629 427 629Q402 629 378 624T327 608T276 571T240 511Q217 453 217 345Q217 254 231 204T279 120Q333 69 428 69Q522 69 576 120Q638 183 638 333ZM279 349V373Q279 413 305 420Q309 422 427 422H487Q550 422 563 414T576 369V349Q576 345 576 337T577 324Q577 284 550 277Q545 275 428 275H369Q306 275 293 283T279 329V349",120670:"85 667Q94 694 136 694H165H191Q237 694 244 669Q246 663 246 347T244 25Q235 0 192 0H163L112 1Q92 7 85 28V667",120671:"92 667Q101 694 139 694H163H186Q225 694 234 671Q236 663 236 529L237 392L533 682Q550 694 590 694H623H681Q695 680 695 672Q695 670 693 664Q688 657 561 533L431 405L698 33Q701 28 701 23Q701 7 683 0H626H604Q571 0 564 2T545 13Q544 14 530 33T489 90T437 162L332 307Q331 307 284 260L236 214V122V65Q236 32 231 19T210 2Q205 0 161 0L119 1Q99 7 92 28V667",120672:"106 0H83Q41 0 41 28Q41 39 133 349T229 667Q242 694 296 694H335H375Q403 694 418 689T442 667Q445 660 537 350T630 28Q630 11 619 6T584 0H555H526Q478 0 465 27Q462 32 431 136T366 372T325 555V546Q320 503 287 376T222 141T186 27Q184 22 177 15T165 6Q154 0 106 0",120673:"92 667Q98 684 109 689T146 695Q152 695 167 695T192 694Q200 694 214 694T234 695Q291 695 305 664Q313 651 400 419T487 165Q487 162 488 162T489 165Q489 187 574 413T671 664Q679 680 695 688Q708 694 785 694H828Q855 694 867 689T884 669Q886 663 886 347T884 25Q876 0 832 0H817H802Q758 0 750 25Q748 31 748 293V555L746 544Q737 509 692 386T606 160T564 52Q548 22 502 22H487H472Q423 22 410 52Q407 59 367 160T283 385T231 546L230 548Q229 548 229 293Q229 31 227 25Q222 9 211 5T176 0H158L119 1Q99 7 92 28V667",120674:"92 667Q98 684 109 689T146 694H185Q273 694 279 692Q301 689 315 669Q322 660 419 453L554 163L562 143Q564 143 564 401Q564 663 566 669Q574 694 618 694H633H648Q692 694 700 669Q702 663 702 347T700 25Q696 10 683 5T642 0H596H551Q520 0 505 4T478 25Q471 34 374 241L239 532Q231 550 231 552L229 479Q229 440 229 293Q229 31 227 25Q222 9 211 5T176 0H158L119 1Q99 7 92 28V667",120675:"627 553Q609 553 512 554T366 555Q316 555 220 554T105 553Q96 553 90 553T82 554T78 554Q61 560 57 571T52 605V623L53 661Q59 680 79 687Q82 688 366 688Q649 688 654 686Q680 679 680 639V621V603Q680 563 654 554Q653 554 651 554T642 554T627 553ZM149 423Q152 424 366 424Q579 424 584 422Q610 415 610 376V358V340Q610 300 584 293Q579 291 366 291H232Q162 291 150 293T129 306Q122 315 122 360L123 397Q129 416 149 423ZM108 135Q143 135 226 134T363 133Q407 133 507 134T632 135H645Q675 135 684 110Q686 104 686 68V49Q686 9 660 2Q655 0 364 0L74 1Q57 7 49 21L47 28L46 65V83Q46 126 72 133Q80 135 108 135",120676:"362 715Q364 715 376 715T394 716H400Q542 716 626 643T727 426Q731 395 731 342Q731 271 722 225Q674 -22 396 -22Q320 -22 259 -3T148 68T77 201Q62 257 62 342Q62 447 86 522T173 649Q245 707 362 715ZM568 433Q551 623 396 623Q383 623 370 622T333 612T292 591T257 550T233 485Q223 442 223 350Q223 276 232 227T267 137Q309 74 397 74Q433 74 461 85T507 113T537 156T556 205T566 260T569 310T570 357Q570 409 568 433",120677:"92 664Q98 683 118 690Q121 691 396 691T676 689Q695 684 700 666Q702 660 702 345Q702 31 700 25Q696 9 684 5T646 0H621H596Q571 0 559 4T542 25Q540 31 540 307V582H253V307Q253 31 251 25Q242 0 199 0H170L119 1Q99 7 92 28V664",120678:"641 470Q641 426 630 391T603 334T561 295T513 271T459 259T408 254T361 253H350H337H253V142Q253 125 253 100T254 67Q254 32 249 19T227 2Q222 0 170 0L119 1Q99 7 92 28V667Q98 686 118 693Q121 694 271 694Q428 693 462 688Q641 656 641 470ZM487 467Q487 495 485 510T474 546T442 578T382 592Q375 593 310 593H250V347H309H339Q364 347 380 348T418 354T451 368T474 395T486 438Q487 444 487 467",120680:"322 124Q326 124 457 125T672 127H689Q721 127 730 102Q732 96 732 64V48Q732 9 706 2Q701 0 394 0L89 1Q76 5 69 13T62 29V36Q62 37 62 38Q62 47 70 58T126 126Q161 167 185 196Q302 335 302 336L187 463Q74 584 68 594Q61 603 61 639L62 667Q68 686 88 693Q91 694 396 694T706 692Q732 686 732 647V635V621Q732 585 706 576Q705 576 702 576T691 576T670 575L302 578Q302 577 394 475T490 371Q498 362 498 347Q498 336 488 323T408 226L322 124",120681:"67 687Q70 688 366 688Q661 688 666 686Q692 680 692 641V629V615Q692 579 666 570H660Q655 569 648 569Q645 569 624 569T581 570Q505 570 475 572H447V302Q447 31 445 25Q436 0 393 0H364L313 1Q293 7 286 28L285 300V572H257Q227 570 151 570Q130 570 109 570T84 569Q77 569 72 570H66Q48 577 44 588T40 631L41 661Q47 680 67 687",120682:"62 560Q62 607 94 644T169 698T253 715Q273 715 286 713T322 704T363 677T398 625Q413 597 423 556L428 540Q429 541 436 566T454 620T494 677T561 713Q570 715 593 715Q682 715 737 668T793 560Q793 549 793 545T786 533T767 520H670Q646 532 644 551T632 579Q618 594 591 594Q539 594 524 530T509 321V216Q509 31 507 25Q498 0 455 0H426L375 1Q355 7 348 28L347 232Q346 344 346 441Q346 442 343 468T335 521T312 571T266 594Q252 594 247 593Q228 586 220 576T212 557T209 539T191 523L185 520H88Q75 527 69 534T63 545T62 560",120683:"62 292T62 347T80 445T124 511T183 552T243 574T292 584L315 587H319V627L320 667Q329 694 370 694H397H422Q466 694 473 669Q475 663 475 625V587H478Q479 587 500 584T548 575T608 553T668 513T713 446T732 347Q732 253 674 187Q655 167 628 152T576 128T530 116T493 109L478 107H475V69V50Q475 9 449 2Q444 0 395 0L347 1Q327 7 320 28L319 67V107H315L292 110Q269 114 243 119T184 142T124 182T80 249ZM319 197T319 347T318 497Q316 497 307 494T284 485T262 471Q220 438 220 347Q220 285 239 249Q248 234 261 223T286 208T308 200L317 197Q319 197 319 347ZM572 347V357Q572 387 569 407T548 452T496 491Q495 491 494 491T487 493T475 497V197Q518 210 541 232T571 303Q572 312 572 347",120684:"52 1Q37 11 37 23Q37 26 39 32Q39 34 158 202L275 369Q275 370 221 441T112 586T55 663Q53 669 53 672Q53 687 68 693H72Q77 693 84 693T99 694T118 694T139 694H176Q203 694 212 692T230 682Q231 681 239 669T265 634T296 591L358 504L418 591Q481 682 486 686Q491 691 499 692Q505 694 569 694H632Q650 685 650 672Q650 667 646 660Q643 654 592 582T491 440T441 369T566 201T693 29Q694 27 694 23Q694 11 677 0H607L537 1Q523 6 519 10T437 131Q422 153 411 170T390 200T375 222T365 237T359 245L357 247L348 232Q339 218 319 188T283 131Q222 37 211 22T186 1H52",120685:"61 585Q62 594 62 597T64 606T73 616T89 626H138Q196 626 208 620Q243 602 253 546T261 431T271 309T325 219Q342 205 349 205Q350 205 350 436L351 667Q360 694 401 694H428H454Q495 694 504 671Q506 663 506 436L507 205Q542 222 561 251T586 318T593 392T595 472T602 546Q614 614 661 625Q665 626 708 626H730Q766 626 780 618T794 582Q794 548 768 540Q755 538 754 501T750 410T736 298T680 191T560 120Q550 116 512 109H506V70V50Q506 9 480 2Q475 0 426 0L378 1Q358 7 351 28L350 68V109L335 111Q298 117 267 129T214 156T175 191T146 229T127 272T115 314T109 357T106 395T105 429Q104 537 87 540Q66 548 63 565Q61 570 61 585",120686:"241 122Q225 154 191 199T131 278T83 363T61 464Q61 497 68 527T94 591T145 650T228 693T349 715Q354 715 370 715T396 716Q539 716 622 668Q658 647 682 617T715 556T728 505T732 465Q732 415 711 365T663 280T602 200T552 122H632Q649 122 669 122T693 123H697Q736 123 742 98Q744 92 744 62V47Q744 9 718 2Q713 0 591 0L471 1Q454 7 446 21Q444 27 444 45Q444 96 463 154T506 257T549 360T569 469Q569 504 563 530T538 580T485 616T396 629Q313 629 268 594T223 468Q223 419 243 361T286 258T330 152T350 41Q350 14 335 7T276 -1Q267 -1 241 -1T197 0L77 1Q57 7 50 28L49 59V74Q49 114 75 121Q81 123 100 123Q104 123 124 123T161 122H241",120782:"266 654H280H282Q500 654 524 418Q529 370 529 320Q529 125 456 52Q397 -10 287 -10Q110 -10 63 154Q45 212 45 316Q45 504 113 585Q140 618 185 636T266 654ZM374 548Q347 604 286 604Q247 604 218 575Q197 552 193 511T188 311Q188 159 196 116Q202 87 225 64T287 41Q339 41 367 87Q379 107 382 152T386 329Q386 518 374 548",120783:"481 0L294 3Q136 3 109 0H96V62H227V304Q227 546 225 546Q169 529 97 529H80V591H97Q231 591 308 647L319 655H333Q355 655 359 644Q361 640 361 351V62H494V0H481",120784:"175 580Q175 578 185 572T205 551T215 510Q215 467 191 449T137 430Q107 430 83 448T58 511Q58 558 91 592T168 640T259 654Q328 654 383 637Q451 610 484 563T517 459Q517 401 482 360T368 262Q340 243 265 184L210 140H274Q416 140 429 145Q439 148 447 186T455 237H517V233Q516 230 501 119Q489 9 486 4V0H57V25Q57 51 58 54Q60 57 109 106T215 214T288 291Q364 377 364 458Q364 515 328 553T231 592Q214 592 201 589T181 584T175 580",120785:"80 503Q80 565 133 610T274 655Q366 655 421 623T491 538Q493 528 493 510Q493 446 453 407T361 348L376 344Q452 324 489 281T526 184Q526 152 514 121T474 58T392 8T265 -11Q175 -11 111 34T48 152Q50 187 72 209T132 232Q171 232 193 208T216 147Q216 136 214 126T207 108T197 94T187 84T178 77T170 72L168 71Q168 70 179 65T215 54T266 48H270Q331 48 350 105Q358 128 358 185Q358 239 348 268T309 313Q292 321 242 322Q205 322 198 324T191 341V348Q191 366 196 369T232 375Q239 375 247 376T260 377T268 378Q284 383 297 393T326 436T341 517Q341 536 339 547T331 573T308 593T266 600Q248 600 241 599Q214 593 183 576Q234 556 234 503Q234 462 210 444T157 426Q126 426 103 446T80 503",120786:"531 0Q510 3 381 3Q238 3 214 0H201V62H313V155H32V217L205 434Q342 606 362 630T387 655L391 656Q395 656 401 656T414 656H427Q447 656 451 645Q453 641 453 429V217H542V155H453V62H542V0H531ZM324 217V494L103 218L213 217H324",120787:"100 565V605Q100 637 102 646T113 655Q116 655 139 647T202 631T286 623Q332 623 372 631T434 647T459 655Q466 655 469 651T472 643T472 629Q472 613 463 601Q370 487 219 487Q195 487 183 488T169 490T168 433V376Q169 376 174 379T188 387T211 397T244 405T288 409Q390 409 453 352T517 201Q517 106 445 48T253 -11Q169 -11 113 37T57 154Q57 187 79 208T131 229T183 209T206 154Q206 99 155 83Q152 82 157 78Q196 47 253 47Q347 47 358 135Q358 137 358 138Q360 158 360 209Q360 277 355 301T337 338Q315 358 282 358Q202 358 160 303Q153 294 149 292T130 290Q107 290 102 301Q100 304 100 474V565",120788:"48 318Q48 395 68 456T120 553T193 613T273 646T350 655Q425 655 461 616T497 524Q497 485 475 468T428 451Q399 451 378 470T357 521Q357 565 403 588Q375 601 351 601Q313 601 282 584Q242 565 222 526Q199 473 199 367Q201 369 210 380T227 396T246 410T275 422T312 426Q438 426 494 332Q526 285 526 208V199Q526 112 465 53Q428 17 388 3T285 -11Q236 -11 195 7T135 43T104 80Q48 165 48 318ZM375 231V244V268Q375 295 373 310T364 342T341 366T299 374H297Q231 374 208 287Q200 257 200 196Q201 120 209 100Q231 47 288 47Q351 47 368 90Q375 112 375 231",120789:"256 -11Q231 -11 208 5T185 65Q185 105 193 146T212 220T241 289T275 349T312 402T346 445T377 479T397 502L400 504H301Q156 503 150 497Q142 491 134 456T126 407H64V411Q65 414 82 544T99 675T130 676H161V673Q161 669 162 666T167 661T173 657T181 654T190 652T200 651T210 650T220 649T229 648Q237 648 254 647T276 646Q277 646 426 644H558V620V607Q558 596 551 586T509 537Q489 515 476 500Q390 401 384 393Q349 339 337 259T324 113T322 38Q307 -11 256 -11",120790:"80 474Q80 561 139 607T278 654Q357 654 411 632Q490 593 494 509Q494 424 416 376L407 371L418 364Q432 356 447 345T481 312T513 260T526 192Q526 100 461 45T285 -11Q184 -11 116 32T48 164Q48 181 50 196T58 225T69 249T84 270T100 286T117 300T134 311T149 321T162 329L152 336Q120 360 100 397T80 474ZM347 404Q404 446 404 503Q404 579 317 599Q309 600 276 600Q178 600 170 538Q170 532 171 527T173 518T178 509T184 501T194 492T205 484T219 476T235 467T254 456T275 445L347 404ZM289 47Q323 47 351 54T402 82T425 137Q425 147 421 161Q411 183 391 197T303 249Q224 293 223 293Q220 291 215 288T197 273T175 248T157 213T149 167Q149 109 188 78T289 47",120791:"178 59Q206 48 238 48Q311 48 345 102Q370 138 375 259V278Q374 278 369 271T350 252T322 232Q297 220 258 220Q172 220 110 275T48 438V446Q54 561 146 618Q199 654 278 654Q321 654 329 653Q526 621 526 330Q526 252 507 190T457 92T388 31T312 -2T240 -11Q165 -11 121 25T77 120Q77 159 99 176T147 193T194 177T217 122Q217 113 216 106T211 92T205 82T198 73T191 67T184 62T178 59ZM374 446V465Q374 523 364 552T315 598Q309 600 293 601Q227 601 210 562Q199 539 199 433Q199 343 204 319T235 279Q250 272 274 271H282Q293 271 303 274T327 288T353 323T371 385Q374 403 374 446",120802:"117 621Q174 678 247 678Q305 678 351 647Q396 617 424 557Q460 472 460 328Q460 271 455 224Q448 154 427 104T376 27T314 -10T249 -22Q201 -22 160 1T91 67Q39 154 39 316Q39 541 117 621ZM250 55Q274 55 293 66T324 93T344 136T357 185T364 240T366 291T367 340Q367 373 367 393T363 449T352 507T332 553T299 589T250 601Q217 601 194 584T159 542T141 479T133 411T132 340V331Q132 299 133 277T137 219T147 157T167 107T201 68T250 55",120803:"94 612Q172 616 211 632T284 678H307V73H430V0H88V73H213V317Q213 560 212 560Q210 558 197 554T155 546T96 540L83 539V612H94",120804:"222 599Q190 599 166 585T128 550T108 509T97 474T93 459L67 492L42 526L47 539Q72 608 120 642T225 677Q304 677 355 644Q449 579 449 454Q449 373 361 290Q351 280 315 250T199 144Q156 103 137 85L293 86H449V0H50V79L216 242Q284 302 317 349T351 456Q351 517 315 558T222 599",120805:"333 521Q333 554 313 579T243 604Q154 604 99 514L78 546Q56 577 56 579Q56 580 62 589T82 611T114 637T162 662T222 677Q224 677 231 677T242 678H245Q318 678 374 634T430 520Q430 483 417 452T382 398T351 369T329 354L328 353Q369 333 373 330Q408 306 432 268T457 184Q457 103 397 41T242 -22Q131 -22 51 58L42 68L49 105L55 142L58 138Q62 134 66 130T77 120T91 108T108 96T129 83T152 72T179 63T209 57T242 54Q285 54 319 86T353 184Q353 231 331 267T260 315L213 316H166V354Q166 392 167 392Q233 395 257 405Q290 418 311 450T333 521",120806:"271 654L272 656H380V235H471V159H380V0H286V159H28V235L149 443Q269 652 271 654ZM292 235V607Q292 604 290 591T286 571T280 548T269 517T252 476T226 422T189 354T140 267Q136 260 132 253T126 240L123 236Q123 235 207 235H292",120807:"257 350Q236 350 218 342T189 323T171 301T160 281L157 273Q157 272 116 272H75V656H416V577H162V486Q162 396 163 396T174 403T207 418T258 426Q339 426 394 360T449 203Q449 113 386 46T226 -21H223Q188 -21 156 -11T102 13T64 42T41 66T33 77Q34 78 44 95T64 128L73 144Q93 112 117 93Q165 54 223 54Q270 54 306 86T345 197Q345 350 257 350",120808:"42 318Q42 396 61 460T109 564T173 629T237 666T289 677H301H317Q359 677 408 658V621Q408 585 407 585H406Q359 605 308 605Q246 605 203 556T146 421Q143 403 144 403Q145 402 152 409Q216 469 299 469Q333 469 357 457T407 405Q457 330 457 226Q457 126 402 57Q340 -22 251 -22Q216 -22 183 -7T116 43T63 149T42 318ZM260 393Q216 393 188 365T150 306T141 243Q141 153 172 104Q192 68 230 56Q238 54 251 54Q311 54 342 116Q360 152 360 226Q360 297 344 332Q320 382 277 392Q275 392 270 392T260 393",120809:"42 570V656H457V577L447 564Q345 439 295 289T244 0V-11H145V12Q160 330 356 550Q360 556 365 561T374 571L208 570H42",120810:"55 500Q55 568 109 623T250 678Q327 678 385 627T444 501Q444 445 410 410T336 357L329 353H330Q378 335 417 293T456 184Q456 93 393 36T249 -22T106 35T43 184Q43 251 82 293T169 353Q171 354 166 356Q165 356 163 357Q113 378 84 416T55 500ZM358 496Q358 557 325 581T250 605Q206 605 174 580T141 496Q141 446 171 420T250 393Q298 393 328 419T358 496ZM245 316Q205 316 172 285T139 185V179Q139 79 222 57Q231 55 250 55H254Q295 55 327 84Q360 120 360 188Q360 254 326 285Q295 316 245 316",120811:"44 476Q57 561 116 619T245 677H255Q308 677 349 647Q392 619 424 545T457 334Q457 178 382 78T205 -22Q168 -22 135 -10T86 14L72 25Q73 25 91 58L110 91Q127 78 136 72T163 60T203 54Q238 54 265 71T308 110T335 164T350 214T357 253V257L347 248Q284 187 200 187Q165 187 140 201T87 258Q42 332 42 430Q42 458 44 476ZM269 604Q265 605 254 605Q222 605 199 591T164 554T148 517T141 487Q140 478 140 430T141 373Q146 335 164 307T207 269Q223 263 247 263Q299 266 328 308T358 417Q358 435 356 456T346 511T318 570T269 604",120812:"274 -22Q227 -22 190 -9T128 24T87 76T62 135T49 204T44 271T43 336V343V362Q43 407 45 440T56 524T86 613T141 677Q197 715 264 715Q314 715 353 702T418 669T460 616T487 555T500 483T505 413T506 343Q506 310 506 293T503 241T498 185T486 133T467 83T437 42T397 8T343 -13T274 -22ZM355 355V401Q355 448 354 476T349 537T336 587T311 617T272 629Q270 629 266 629T261 628Q219 618 207 568T194 419V355Q194 203 200 156T231 85Q250 66 275 66Q299 66 318 85Q342 109 348 156T355 355",120813:"118 560H116Q107 560 100 561T85 572T76 600Q76 612 77 618T83 632T99 644Q102 645 135 646T207 660T275 700Q292 716 310 716Q353 716 360 691Q362 685 362 386V87H446Q464 76 468 69T473 44Q473 12 446 1H118Q105 7 100 13T94 25T93 44V62Q100 79 119 87H210V329Q210 571 208 571Q182 560 118 560",120814:"339 477Q339 505 332 531T301 579T242 601Q165 601 136 503Q133 493 130 490T121 486Q116 486 94 514Q86 523 82 528Q46 572 46 577Q46 591 77 632T147 691Q192 716 257 716Q305 716 351 700Q416 674 455 615T494 481Q494 421 463 376T356 266Q326 240 287 205T224 146T199 122H331Q359 122 392 122T431 123H445Q485 123 492 98Q494 92 494 62V47Q494 9 468 2Q463 0 272 0L83 1Q63 7 56 28L55 57V89Q59 97 215 261Q255 303 275 327T317 394T339 477",120815:"61 624Q62 630 83 650T153 693T262 716Q328 716 373 698T438 650T465 593T473 536Q473 438 375 376L387 371Q450 350 476 305T503 208Q503 164 492 126T456 53T380 -2T261 -22Q224 -22 189 -15T130 2T86 24T57 43T46 53Q46 56 53 99T62 145Q65 152 71 152Q76 152 90 143T123 121T175 99T248 87Q302 87 321 113T341 202Q341 264 329 292T279 329L232 331L190 332L184 338V411Q190 417 192 417Q193 418 205 419T232 421T252 424Q280 430 299 461T318 539V551Q318 599 283 609Q276 611 257 611Q225 611 199 601T159 577T136 554T120 543T102 560T76 597T62 618T61 624",120816:"278 693H282Q285 693 291 693T305 694T322 694T342 694H377Q402 694 411 691T430 677Q434 670 434 646T435 456V249H461H472Q509 249 516 224Q518 219 518 194Q518 178 518 171T511 155T492 142Q488 140 461 140H435V86V53Q435 9 409 2Q405 0 366 0H351Q306 0 298 25Q296 31 296 86V140H179H123Q99 140 80 129T50 106T37 95Q31 95 31 163V208Q31 246 33 251Q251 673 262 684Q268 691 278 693ZM302 249V416L301 576Q301 536 165 276L151 250L226 249H302",120817:"109 282Q87 290 83 310V666Q83 667 84 670T87 676T91 682T98 688T108 693Q112 694 269 694T431 692Q457 686 457 648V637V624Q457 588 431 581Q426 579 326 579H227V510Q227 442 229 442Q243 450 288 450Q377 450 435 399T494 222Q494 -22 241 -22Q202 -22 167 -11T109 16T69 49T45 79T37 94T69 151Q91 185 97 185Q105 185 112 170Q127 135 160 111T240 87Q266 87 284 94T311 111T325 142T331 179T332 226Q332 307 324 335T281 363Q228 363 197 306Q189 289 172 282H109",120818:"414 589Q410 589 389 600T334 612Q275 612 243 575Q209 538 202 433V422L209 431Q243 487 317 487Q392 487 440 442Q478 402 490 357T503 236Q503 113 454 54Q421 13 381 -4T279 -22Q263 -22 250 -21T214 -15T173 1T133 30T96 77T68 146T50 242Q46 278 46 336Q46 406 52 447Q84 698 312 715L315 716Q318 716 321 716Q323 716 328 716T337 715Q398 715 425 688V596Q419 591 414 589ZM282 87Q324 89 336 117T348 231Q348 310 343 343T324 388T277 399Q249 399 231 373T208 317T202 253Q202 201 207 168T224 117T249 93T282 87",120819:"135 38Q135 190 198 335T353 572H215Q185 572 151 572T110 571H96Q55 571 48 596Q46 602 46 633V648Q46 686 72 693Q76 695 124 695Q134 695 183 695T274 694Q472 694 477 692Q503 686 503 648V637Q503 612 502 605T491 588Q300 349 292 46V36Q292 -4 266 -9Q262 -11 214 -11H192Q160 -11 148 -3T135 38",120820:"61 518Q61 574 79 614T128 676T192 706T263 715H270Q298 715 318 714T373 701T430 671T470 612T488 517Q488 459 458 423T390 376Q388 375 393 373Q395 372 398 371Q503 330 503 204Q503 -22 275 -22Q209 -22 163 -3T92 49T57 120T46 204Q46 230 50 252T61 289T77 318T96 339T116 353T134 363T148 369T158 373T160 376Q118 389 90 424T61 518ZM344 538Q344 563 340 578T326 600T307 609T279 612Q232 612 218 594T204 518Q204 459 216 439T275 418Q328 418 338 450Q344 464 344 515V538ZM248 88T274 88T315 94T338 117T346 149T349 197Q349 269 342 290Q338 309 320 320T274 331Q246 331 229 320T207 290Q200 269 200 197Q201 163 202 149T210 118T232 94",120821:"347 272Q346 272 342 266T330 250T309 230T276 214T230 207Q185 207 150 223Q116 240 90 276T54 357Q46 393 46 468Q46 469 46 484T47 502T48 520T51 540T55 559T61 579T69 599T81 620T96 640T115 661Q174 716 276 716Q299 716 317 714T369 698T426 658T471 580T499 456Q503 402 503 342Q503 115 392 29Q322 -22 231 -22Q163 -22 115 7L82 31Q76 38 81 46Q116 112 127 123Q130 126 134 126T148 116T179 97T226 87Q287 87 318 132Q323 139 326 146T332 165T337 182T340 204T342 225T345 249T347 272ZM201 547T201 454T211 329T262 294Q276 294 285 296T310 312T335 355Q347 391 347 447Q347 520 340 550T317 595Q300 612 277 612Q226 612 214 580",120822:"42 305Q42 450 111 535T257 621Q335 621 390 562Q482 468 482 306Q482 174 418 82T262 -10T106 82T42 305ZM257 545Q209 545 168 481T126 320Q126 220 162 147Q204 65 262 65Q318 65 358 139T398 320V328Q395 411 364 470T284 543Q270 545 257 545",120823:"99 461Q99 470 99 474T104 487T120 498T151 502Q213 517 251 596Q264 622 283 622Q308 622 319 597V76H373H401Q428 76 439 69T450 38Q450 11 428 1H127Q104 10 104 38Q104 62 115 69T153 76H181H235V269Q235 461 234 461Q184 426 137 424H133Q124 424 119 425T109 431T99 447V461",120824:"52 462Q52 528 110 575T247 622H250Q343 622 407 565T472 421Q472 371 446 324T390 248T308 178Q307 177 275 151T214 101L185 77Q185 76 286 76H388V87Q388 105 397 114T430 123T463 114Q470 107 471 100T472 61V42Q472 24 468 16T450 1H75Q53 10 53 32V38V48Q53 57 63 67T127 122Q153 144 169 157L289 256Q388 345 388 419Q388 473 346 509T231 545H224Q176 545 146 499L144 494Q155 476 155 459Q154 459 155 455T154 444T148 430T136 417T114 408Q113 408 110 408T104 407Q80 407 66 422T52 462",120825:"260 546Q233 546 211 541T180 531T171 524L174 514Q177 505 177 497Q177 476 162 461T125 446Q106 446 90 459T73 504Q76 540 98 565T150 601T203 616T239 621Q241 622 265 622Q322 620 362 602T420 558T444 513T451 478Q451 386 369 329L375 326Q381 323 386 320T401 311T419 298T436 283T452 263T466 240T475 212T479 180Q479 99 416 44T259 -11T105 28T44 130Q44 154 59 168T95 183Q117 183 132 169T148 131Q148 119 139 101Q175 65 260 65Q316 65 355 97T395 179Q395 211 375 240Q336 292 253 292H234H215Q194 292 185 299T175 330Q175 350 184 359Q192 368 238 370T309 384Q336 398 351 423T367 474Q367 496 350 513Q321 546 260 546",120826:"235 1Q213 10 213 32V38V46Q213 65 230 73Q236 76 274 76H314V168H183L52 169Q37 175 33 182T29 205V218L30 244Q53 283 155 443T264 613Q276 623 298 623H323H363Q378 616 385 601V244H429H450Q474 244 484 237T495 206Q495 179 477 171Q471 168 429 168H385V76H425H442Q466 76 476 69T487 38Q487 10 465 1H235ZM314 244V554L117 245L215 244H314",120827:"387 189Q387 244 354 278T273 313Q230 313 205 301T163 271T138 249H120Q102 249 97 251Q85 258 83 266T80 311Q80 320 80 359T81 430Q81 587 82 591Q88 605 103 610H108Q112 610 120 610T138 610T163 610T192 611T225 611T260 611H415Q416 610 421 607T428 602T432 596T436 587T437 573Q437 567 437 562T434 554T431 548T427 543T423 540T418 538L415 536L289 535H164V363L170 366Q175 368 184 372T207 380T238 386T276 389Q357 389 414 331T472 187Q472 116 412 53T245 -10Q218 -10 209 -9Q126 5 89 48T52 137Q52 164 68 177T104 191Q130 191 143 175T156 141Q156 132 154 125T149 113T146 107Q146 104 155 95T188 76T245 65Q298 65 342 98T387 189",120828:"357 536Q357 546 318 546Q258 546 205 497T133 357V353L144 361Q210 402 285 402Q362 402 414 350Q479 285 479 193Q479 111 418 50T263 -11Q234 -11 207 -3T149 26T97 81T60 171T45 301Q45 444 129 533T319 622Q388 622 421 589T454 510Q454 491 442 475T402 458Q373 458 362 475T350 510Q350 520 354 528L357 536ZM319 326T269 326T179 298T136 223Q136 202 143 174T176 112T237 68Q246 66 265 66Q319 66 360 107Q395 146 395 197Q395 250 356 289Q319 326 269 326",120829:"204 -10Q162 -10 162 40Q162 146 198 261T310 477Q311 478 321 491T342 517T358 535H128V524Q128 506 119 497Q111 489 86 489H78Q55 489 46 508Q44 513 44 557V580Q44 605 52 616T88 627H93Q114 627 125 611H458Q474 598 477 593T480 573Q480 559 478 553T469 543T446 521T408 477Q252 290 246 49Q246 43 246 37T246 27T245 22Q243 11 233 1T204 -10",120830:"58 460Q58 523 117 572T254 621Q290 621 298 620Q376 607 421 560T466 460Q466 441 460 424T443 393T421 370T397 352T374 340T357 332L350 330L356 328Q363 325 371 321T392 310T415 295T439 274T459 249T473 217T479 179Q479 102 418 46T262 -10T106 46T45 179Q45 202 52 222T70 257T96 284T123 305T148 319T167 328L174 330L170 332Q166 333 159 336T145 343Q104 362 81 393T58 460ZM382 458Q382 491 349 518T263 546Q215 546 179 521T142 458Q142 421 178 395T262 368Q315 368 348 396T382 458ZM396 178Q396 223 358 257T263 292Q206 292 167 258T128 178Q128 137 163 102T262 66Q324 66 360 101T396 178",120831:"392 259Q333 210 236 210H233Q163 210 109 262Q46 325 46 411T99 550Q164 622 264 622Q293 622 319 615T376 587T428 532T464 440T479 304Q479 167 400 78T217 -11Q140 -11 105 22T70 101Q70 124 84 138T122 153Q150 153 162 137T174 101Q174 91 168 76Q179 65 216 65Q267 65 300 93Q322 109 339 130T366 173T380 210T388 242T392 259ZM388 389Q388 438 357 492T268 546T185 520Q129 479 129 415Q129 384 138 363Q145 349 156 334T195 302T255 285Q305 285 345 313T388 389"},{8243:"\u2032\u2032",8244:"\u2032\u2032\u2032",8246:"\u2035\u2035",8247:"\u2035\u2035\u2035",8279:"\u2032\u2032\u2032\u2032",8708:"\u2203\u0338",8716:"\u220b\u0338",8772:"\u2243\u0338",8777:"\u2248\u0338",8802:"\u2261\u0338",8813:"\u224d\u0338",8820:"\u2272\u0338",8821:"\u2273\u0338",8824:"\u2276\u0338",8825:"\u2277\u0338",8836:"\u2282\u0338",8837:"\u2283\u0338",8930:"\u2291\u0338",8931:"\u2292\u0338",10764:"\u222c\u222c"})},353:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.sansSerifBoldItalic=void 0;var H=L(9403),V=L(6949);T.sansSerifBoldItalic=(0,H.AddPaths)(V.sansSerifBoldItalic,{305:"54 431Q63 458 102 458H127H149Q192 458 199 433Q201 427 201 229T199 25Q190 0 149 0H125L81 1Q61 7 54 28V431",567:"-38 -84Q-36 -84 -14 -95T33 -106H38Q70 -103 78 -86Q83 -78 83 -49T84 180Q84 427 86 433Q93 458 136 458H158H180Q201 458 209 456T225 443Q230 436 231 418Q232 397 232 313V183V124V40Q232 -55 228 -87T203 -147Q166 -205 78 -205Q31 -205 -20 -189T-71 -159Q-71 -156 -59 -123Q-50 -96 -47 -91T-38 -84"},{})},1082:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.sansSerifBold=void 0;var H=L(9403),V=L(5193);T.sansSerifBold=(0,H.AddPaths)(V.sansSerifBold,{33:"111 669Q111 680 111 682T113 689T121 693T137 694H184H249Q255 686 256 681Q244 220 239 213Q236 208 229 208T183 207T137 207T127 213T118 431T111 669ZM110 71V95Q110 137 136 144Q140 146 183 146H200Q246 146 254 121Q256 115 256 73V51Q256 9 230 2Q225 0 181 0L138 1Q121 7 113 21L111 28L110 71",34:"38 687Q42 693 45 693Q46 694 111 694H176Q179 690 183 687V556L144 501Q139 494 134 486T126 474T120 465T114 457T110 451T106 447T102 445T98 443T94 443T89 442H73H62Q37 442 37 453Q37 458 55 501T74 546Q74 548 59 548L44 549L38 555V687ZM275 687Q279 693 282 693Q283 694 348 694H413Q416 690 420 687V556L381 501Q376 494 371 486T363 474T357 465T351 457T347 451T343 447T339 445T335 443T331 443T326 442H310H299Q274 442 274 453Q274 458 292 501T311 546Q311 548 296 548L281 549L275 555V687",35:"61 365Q61 370 62 375T65 383T69 390T74 395T80 399T85 403T90 406L94 407H344L381 536Q418 668 426 680Q431 687 445 692Q451 694 457 694Q477 694 488 682T500 651Q500 645 466 528T431 409Q431 407 504 407H577L609 521Q651 668 656 675Q669 693 691 693Q710 693 721 680T733 651Q733 645 699 528T664 409Q664 407 743 407H823L827 405Q831 403 834 402T841 397T848 389T853 379T855 365Q855 337 823 324L731 323H639L619 253Q599 181 598 180V177H823L827 175Q831 173 834 172T841 167T848 159T853 149T855 135Q855 107 823 94L698 93H573L540 -21Q498 -168 493 -175Q480 -193 458 -193Q439 -193 428 -180T416 -151Q416 -144 450 -27T485 91Q485 93 412 93H340L307 -21Q265 -168 260 -175Q247 -193 225 -193Q206 -193 195 -180T183 -151Q183 -144 217 -27T252 91Q252 93 173 93L94 94Q61 105 61 135Q61 140 62 145T65 153T69 160T74 165T80 169T85 173T90 176L94 177H185L277 178L297 248L318 320V323H206L94 324Q61 335 61 365ZM551 320V323H479Q406 323 405 322Q404 319 385 249T365 178T438 177L510 178L530 248L551 320",36:"231 712L232 716Q232 719 232 722T234 729T239 736T246 743T256 748T271 750Q318 750 318 711V703Q393 692 451 656Q469 645 470 640Q470 635 461 587L453 537Q445 529 442 529Q438 529 424 540T384 565T330 585Q328 585 325 585T320 586L318 587V434Q322 433 333 429T350 424T365 418T382 409T399 397T419 380Q488 313 488 213Q488 24 334 -5L318 -8V-17Q318 -56 279 -56H272Q253 -56 243 -46T232 -30T231 -18V-8H224Q170 2 127 20T68 50T49 67Q49 71 58 122T68 176Q71 182 79 182Q83 182 98 169T145 138T216 110Q228 108 229 108H231V288Q167 299 114 356T61 496Q61 537 70 570T94 624T126 661T162 684T195 696T219 701L228 702H231V712ZM231 521Q231 583 230 583Q226 582 220 579T204 561T193 521Q193 491 212 472Q226 458 230 458Q231 458 231 521ZM318 112Q356 131 356 187Q356 237 318 263V112",37:"61 549Q61 733 218 749Q220 749 228 749T241 750Q286 750 321 735T369 708T389 683Q422 634 422 548V538Q422 519 420 501T408 453T381 401T328 364T243 347Q61 347 61 549ZM292 549Q292 663 242 663Q221 663 211 648T198 615T196 566V548Q196 471 206 454Q218 434 242 434Q292 434 292 549ZM243 -55Q223 -55 212 -42T201 -13Q201 -2 207 7Q209 11 480 371T758 738Q770 750 788 750Q805 750 817 738T830 709Q830 694 820 681L544 315Q273 -43 269 -47Q258 -55 243 -55ZM606 146Q606 330 763 346Q764 346 773 346T786 347Q831 347 866 332T914 305T934 280Q966 233 966 146V135Q966 115 964 97T952 49T925 -2T872 -40T788 -56Q606 -56 606 146ZM742 146V132Q742 107 743 93T748 62T762 39T787 31Q819 31 832 79Q837 97 837 146Q837 260 787 260Q767 260 757 246T744 214T742 169V146",38:"757 117Q762 117 769 110V3Q759 -7 718 -14T641 -22T571 -15T518 1T477 19T453 31L437 23Q350 -19 257 -22Q158 -22 103 30T47 155Q47 188 57 216T87 263T119 292T151 313L182 333L187 336L181 349Q150 431 150 506Q150 605 211 660T347 716Q417 716 471 668T526 543Q526 517 518 495T471 432T360 343L342 330Q342 327 358 306T402 250T458 189L467 181Q518 225 556 289T607 395L620 437Q622 443 630 443Q631 443 679 430Q718 420 725 418T733 409Q733 402 722 365T670 255T573 123Q562 111 563 111Q589 94 644 94Q678 94 703 100T740 111T757 117ZM397 544Q397 573 384 601T346 629Q320 629 299 607T277 538Q277 484 295 429Q301 413 301 412Q302 409 309 415Q397 476 397 544ZM227 258Q197 228 197 177Q197 150 207 126T234 95Q242 93 251 93Q288 93 337 107L349 110L328 131Q266 196 234 248L227 258",39:"81 687Q85 693 88 693Q89 694 154 694H219Q222 690 226 687V556L187 501Q182 494 177 486T169 474T163 465T157 457T153 451T149 447T145 445T141 443T137 443T132 442H116H105Q80 442 80 453Q80 458 98 501T117 546Q117 548 102 548L87 549L81 555V687",40:"79 250Q79 352 100 441T152 585T213 678T266 733L287 749Q288 750 324 750H359Q366 741 366 738Q366 734 356 721T329 682T296 623T262 531T238 407Q230 346 230 250Q230 142 244 55T278 -82T318 -165T352 -215T366 -238Q366 -242 359 -249H286L277 -242Q79 -74 79 250",41:"61 737Q61 750 85 750H106H141L150 742Q348 574 348 250T150 -242L141 -249L106 -250H87Q61 -250 61 -238Q61 -233 74 -216Q157 -113 183 51Q197 130 197 250T183 449Q174 505 158 554T126 634T95 687T71 722T61 737",42:"241 579Q241 582 228 639T215 702Q215 722 233 736T271 750Q296 750 315 736T334 702V697Q334 693 328 664T314 607L308 579L352 620Q389 654 397 660T417 668Q447 668 464 647T482 602Q482 591 479 583T472 569T459 559T443 552T421 546T397 538L342 521L397 504Q405 501 420 497T442 490T458 483T472 473T479 460T482 440Q482 416 465 395T417 374Q406 375 398 381T352 422L308 463L314 435Q321 407 327 378T334 345Q336 333 327 319T296 295Q288 293 275 293Q241 293 227 311T215 345Q215 349 221 378T234 435L241 463L197 422Q160 388 152 382T132 374Q102 374 85 395T67 440Q67 451 70 459T77 473T90 483T106 490T128 496T152 504L207 521L152 538Q144 541 129 545T107 552T91 559T77 569T70 582T67 602Q67 626 84 647T132 668Q143 667 151 661T197 620L241 579",43:"61 250Q61 276 94 292H386V436V535Q386 577 388 589T401 607Q411 617 427 617Q458 617 468 587Q470 581 470 436V292H762L766 290Q770 288 773 287T780 282T787 274T792 264T794 250Q794 222 762 209L616 208H470V64Q470 -81 468 -87Q458 -116 428 -116T388 -87Q386 -81 386 64V208H240L94 209Q61 220 61 250",44:"81 139Q85 145 88 145Q89 146 154 146H219Q222 142 226 139V8L187 -47Q182 -54 177 -62T169 -74T163 -83T157 -91T153 -97T149 -101T145 -103T141 -105T137 -105T132 -106H116H105Q80 -106 80 -95Q80 -90 98 -47T117 -2Q117 0 102 0L87 1L81 7V139",45:"12 230Q12 257 26 265T80 274Q88 274 114 274T158 273T201 273T235 274Q276 274 290 266T305 230T291 194T235 185Q226 185 201 185T159 186Q143 186 119 186T85 185Q43 185 28 193T12 230",46:"219 146Q222 142 226 139V7L222 4L219 1L154 0Q102 0 94 0T82 6Q80 9 80 74L81 139Q85 145 88 145Q89 146 154 146H219",47:"103 -249Q81 -249 71 -235T61 -207Q61 -201 62 -198Q64 -192 235 265T409 727Q418 750 445 750Q464 750 476 737T488 707Q488 701 313 234Q143 -225 137 -232Q126 -249 103 -249",58:"226 319L219 313H87L81 319L80 384Q80 437 80 445T86 456Q89 458 154 458H219Q222 454 226 451V319ZM219 146Q222 142 226 139V7L222 4L219 1L154 0Q102 0 94 0T82 6Q80 9 80 74L81 139Q85 145 88 145Q89 146 154 146H219",59:"226 319L219 313H87L81 319L80 384Q80 437 80 445T86 456Q89 458 154 458H219Q222 454 226 451V319ZM81 139Q85 145 88 145Q89 146 154 146H219Q222 142 226 139V8L187 -47Q182 -54 177 -62T169 -74T163 -83T157 -91T153 -97T149 -101T145 -103T141 -105T137 -105T132 -106H116H105Q80 -106 80 -95Q80 -90 98 -47T117 -2Q117 0 102 0L87 1L81 7V139",61:"94 324Q61 335 61 366Q61 396 91 405Q96 407 429 407H762Q763 406 767 404T774 400T781 395T787 387T792 378T794 365Q794 338 762 324H94ZM94 94Q61 105 61 135Q61 149 69 160T92 175Q97 177 430 177H762L766 175Q770 173 773 172T780 167T787 159T792 149T794 135Q794 107 762 94H94",63:"61 644Q61 652 87 666T157 693T244 705Q344 705 400 671T457 551Q457 516 446 490T422 451T387 421T356 391Q330 361 318 332T305 292T303 252Q303 218 300 213T290 208T244 207H220Q194 207 188 213Q187 214 186 215V255Q187 282 188 296T198 345T229 417T288 496Q306 515 306 559Q306 596 296 607T253 618Q214 618 185 607T143 583T120 558T103 547Q99 547 95 551Q93 553 77 597T61 644ZM171 71V95Q171 137 197 144Q201 146 244 146H261Q307 146 315 121Q317 115 317 73V51Q317 9 291 2Q286 0 242 0L199 1Q182 7 174 21L172 28L171 71",64:"61 264T61 347T82 494T136 596T217 660T311 694T410 704Q460 704 471 703Q534 694 577 666Q633 623 651 552T670 370V342Q670 249 633 195Q583 116 454 116Q238 116 238 347Q238 443 276 499Q328 578 456 578Q488 578 494 577L504 575Q475 617 430 617H421Q196 617 196 347Q196 215 253 143Q310 76 427 76Q499 76 561 102L575 107H664Q671 97 671 94V89L663 81Q566 -11 422 -11Q365 -11 316 -2T219 33T137 97T82 200ZM469 490Q459 492 453 492Q429 492 405 472Q374 439 374 347Q374 233 423 210Q436 202 454 202L486 210Q536 228 536 347Q536 461 486 484Q476 490 469 490",91:"318 -206Q318 -235 305 -243T255 -251Q248 -251 229 -251T198 -250H143Q112 -250 99 -246T81 -225Q79 -219 79 250T81 725Q85 741 98 745T143 750H198Q210 750 229 750T255 751Q291 751 304 743T318 707Q318 680 301 668Q293 663 255 663H224V-163H255Q293 -163 301 -168Q318 -180 318 -206",93:"24 706Q24 734 39 742T90 751Q97 751 114 751T143 750H198Q230 750 243 746T261 725Q263 719 263 250T261 -225Q257 -241 244 -245T198 -250H143Q131 -250 112 -250T86 -251Q50 -251 37 -243T24 -207Q24 -180 41 -168Q49 -163 87 -163H118V663H87H71Q24 663 24 706",94:"108 550Q108 554 135 589T190 658T219 692Q221 694 275 694Q328 694 330 693Q331 692 381 629T438 557Q441 553 441 549T434 538L399 537Q363 537 362 538Q361 538 318 575L275 611Q274 611 231 575Q188 538 187 538Q186 537 150 537L115 538Q108 545 108 550",95:"0 -66Q0 -32 26 -25Q30 -23 274 -23Q469 -23 497 -23T532 -28Q549 -40 549 -67Q549 -93 532 -105Q525 -109 498 -109T275 -110Q31 -110 26 -108Q0 -101 0 -66",126:"92 215Q92 259 122 301T204 344Q238 344 264 329T310 300T343 285Q356 285 361 295T369 322T377 344H450Q457 334 457 330Q457 281 427 240T344 198Q312 198 285 213T239 242T206 257Q188 257 182 230T172 199L137 198H120Q102 198 97 200T92 215",305:"54 431Q63 458 102 458H127H149Q192 458 199 433Q201 427 201 229T199 25Q190 0 149 0H125L81 1Q61 7 54 28V431",567:"-38 -84Q-36 -84 -14 -95T33 -106H38Q70 -103 78 -86Q83 -78 83 -49T84 180Q84 427 86 433Q93 458 136 458H158H180Q201 458 209 456T225 443Q230 436 231 418Q232 397 232 313V183V124V40Q232 -55 228 -87T203 -147Q166 -205 78 -205Q31 -205 -20 -189T-71 -159Q-71 -156 -59 -123Q-50 -96 -47 -91T-38 -84",768:"-458 682Q-458 690 -452 692T-426 694H-381H-314L-312 691Q-311 691 -305 682T-287 655T-263 622L-218 555V549Q-218 544 -224 538L-259 537Q-295 537 -296 538Q-298 539 -376 606T-456 676Q-458 680 -458 682",769:"-290 537H-310Q-334 537 -334 549Q-334 553 -311 588T-264 656L-241 690Q-240 690 -239 691T-236 693Q-235 694 -167 694H-100Q-93 684 -93 681T-94 677Q-95 675 -173 607T-255 538Q-256 537 -290 537",770:"-442 550Q-442 554 -415 589T-360 658T-331 692Q-329 694 -275 694Q-222 694 -220 693Q-219 692 -169 629T-112 557Q-109 552 -109 549Q-109 545 -116 538L-151 537Q-187 537 -188 538Q-189 538 -232 575L-275 611Q-276 611 -319 575Q-362 538 -363 538Q-364 537 -400 537L-435 538Q-442 545 -442 550",771:"-458 565Q-458 609 -428 651T-346 694Q-312 694 -286 679T-240 650T-207 635Q-194 635 -189 645T-181 672T-173 694H-100Q-93 684 -93 680Q-93 631 -123 590T-206 548Q-238 548 -265 563T-311 592T-344 607Q-362 607 -368 580T-378 549L-413 548H-430Q-448 548 -453 550T-458 565",772:"-84 660Q-81 656 -77 653V567L-81 564L-84 561L-274 560H-383Q-469 560 -471 565L-472 566Q-474 569 -474 611L-473 653Q-469 659 -466 659Q-465 660 -274 660H-84",774:"-123 694Q-80 694 -80 657Q-80 626 -99 601T-161 563Q-199 552 -275 552Q-352 552 -389 563Q-470 586 -470 655Q-470 667 -468 673Q-457 694 -435 694H-431Q-408 694 -396 685Q-387 676 -387 671Q-384 661 -275 661Q-167 661 -164 671Q-164 674 -163 677T-151 687T-123 694",775:"-329 596Q-346 602 -351 611T-356 638V646Q-356 653 -356 654T-356 661T-355 668T-353 673T-351 679T-347 684T-341 689T-332 693T-274 695H-221Q-202 683 -198 676T-194 645Q-194 632 -195 625T-202 610T-221 596H-329",776:"-331 695Q-312 683 -308 676T-304 645Q-304 632 -304 626T-311 610T-331 596L-380 595H-408Q-448 595 -457 617Q-459 621 -459 645T-457 673Q-448 696 -409 696Q-405 696 -396 696T-380 695H-331ZM-247 644Q-247 658 -246 665T-239 680T-221 694Q-217 695 -169 695H-143Q-102 695 -93 672Q-91 664 -91 645V635Q-91 613 -106 602Q-113 597 -121 596T-171 595L-219 596Q-232 600 -238 608T-246 622T-247 644",778:"-365 616Q-365 658 -331 676T-256 694Q-253 694 -247 694T-236 693Q-166 693 -139 666Q-119 644 -119 616T-139 565Q-166 538 -237 538H-242Q-365 538 -365 616ZM-181 616Q-181 641 -195 647T-242 654Q-258 654 -266 654T-284 650T-298 638T-303 616Q-303 592 -289 585T-242 577Q-209 577 -195 584T-181 616",779:"-426 686Q-424 694 -394 694H-350H-283Q-277 686 -277 682Q-277 673 -317 608T-361 538L-396 537H-420Q-432 537 -436 539T-440 548Q-440 560 -434 616Q-432 633 -430 650T-427 677L-426 686ZM-243 686Q-241 694 -211 694H-167H-100Q-94 686 -94 682Q-94 673 -134 608T-178 538L-213 537H-237Q-249 537 -253 539T-257 548Q-257 560 -251 616Q-249 633 -247 650T-244 677L-243 686",780:"-442 645Q-442 657 -418 657H-398Q-393 657 -388 657T-379 657T-371 656T-365 656H-363L-319 620L-276 583Q-275 583 -232 619Q-189 656 -188 656Q-187 657 -151 657H-116Q-109 649 -109 645Q-109 642 -112 637Q-118 629 -168 566T-220 501Q-222 500 -275 500Q-329 500 -331 501Q-442 634 -442 645",8211:"0 284Q0 318 26 325Q30 327 274 327Q469 327 497 327T532 322Q549 310 549 283Q549 257 532 245Q525 241 498 241T275 240Q31 240 26 242Q0 249 0 284",8212:"0 284Q0 318 26 325Q30 327 549 327T1073 325Q1099 318 1099 284Q1099 249 1073 242Q1068 240 549 240Q31 240 26 242Q0 249 0 284",8213:"0 284Q0 318 26 325Q30 327 549 327T1073 325Q1099 318 1099 284Q1099 249 1073 242Q1068 240 549 240Q31 240 26 242Q0 249 0 284",8215:"0 -66Q0 -32 26 -25Q30 -23 274 -23Q469 -23 497 -23T532 -28Q549 -40 549 -67Q549 -93 532 -105Q525 -109 498 -109T275 -110Q31 -110 26 -108Q0 -101 0 -66",8216:"87 443L81 449V581L119 636Q125 644 131 653T141 667T148 677T154 685T158 689T163 692T167 693T173 694H190H201Q226 694 226 683Q226 678 208 635T189 590Q189 588 204 588H219Q222 584 226 581V449L219 443H87",8217:"81 687Q85 693 88 693Q89 694 154 694H219Q222 690 226 687V556L187 501Q182 494 177 486T169 474T163 465T157 457T153 451T149 447T145 445T141 443T137 443T132 442H116H105Q80 442 80 453Q80 458 98 501T117 546Q117 548 102 548L87 549L81 555V687",8220:"144 443L138 449V581L176 636Q182 644 188 653T198 667T205 677T211 685T215 689T220 692T224 693T230 694H247H258Q283 694 283 683Q283 678 265 635T246 590Q246 588 261 588H276Q279 584 283 581V449L276 443H144ZM381 443L375 449V581L413 636Q419 644 425 653T435 667T442 677T448 685T452 689T457 692T461 693T467 694H484H495Q520 694 520 683Q520 678 502 635T483 590Q483 588 498 588H513Q516 584 520 581V449L513 443H381",8221:"38 687Q42 693 45 693Q46 694 111 694H176Q179 690 183 687V556L144 501Q139 494 134 486T126 474T120 465T114 457T110 451T106 447T102 445T98 443T94 443T89 442H73H62Q37 442 37 453Q37 458 55 501T74 546Q74 548 59 548L44 549L38 555V687ZM275 687Q279 693 282 693Q283 694 348 694H413Q416 690 420 687V556L381 501Q376 494 371 486T363 474T357 465T351 457T347 451T343 447T339 445T335 443T331 443T326 442H310H299Q274 442 274 453Q274 458 292 501T311 546Q311 548 296 548L281 549L275 555V687",8260:"103 -249Q81 -249 71 -235T61 -207Q61 -201 62 -198Q64 -192 235 265T409 727Q418 750 445 750Q464 750 476 737T488 707Q488 701 313 234Q143 -225 137 -232Q126 -249 103 -249",8710:"381 692Q386 694 458 694Q516 694 527 693T549 687Q564 680 575 663Q576 658 715 349T856 27Q856 6 838 1H826Q815 1 795 1T747 1T686 1T616 0T539 0T458 0T378 0T300 0T230 0T169 1T122 1T90 1H78Q60 6 60 27Q62 38 201 349T341 663Q356 687 381 692ZM627 148Q626 149 581 250T492 453L447 554Q447 553 446 552Q444 546 326 278L268 148Q268 147 448 147Q627 147 627 148"},{})},67:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.sansSerifItalic=void 0;var H=L(9403),V=L(2632);T.sansSerifItalic=(0,H.AddPaths)(V.sansSerifItalic,{33:"160 187L257 694H306Q355 694 355 693L238 186H199Q160 186 160 187ZM110 2Q111 3 120 49T131 96Q131 98 180 98T229 96L219 50Q209 3 208 2V0H110V2",34:"171 647L180 694H229Q278 694 278 693L276 686Q275 680 273 668T268 644L258 597L182 471H157Q133 471 133 472L189 595Q189 596 174 596H160V598Q160 601 171 647ZM365 647L374 694H423Q472 694 472 693L470 686Q469 680 467 668T462 644L452 597L376 471H351Q327 471 327 472L383 595Q383 596 368 596H354V598Q354 601 365 647",35:"793 170Q809 162 809 149Q809 145 807 141T802 135T796 132L793 130H547L472 -27Q397 -184 394 -187Q389 -194 379 -194Q367 -194 362 -183Q359 -179 359 -173Q360 -168 431 -20L503 129Q503 130 410 130H317L242 -27Q167 -184 164 -187Q159 -194 149 -194Q137 -194 132 -183Q129 -179 129 -173Q130 -168 201 -19L273 130H187L100 131Q87 141 87 150Q87 162 102 170H294L331 248Q339 265 349 286T365 318L370 328Q370 330 258 330Q145 330 142 332Q129 338 129 351Q129 362 140 368Q146 370 267 370L391 371L467 527Q542 684 544 686Q544 688 549 691T560 694H562Q565 693 567 692T571 690T575 686T578 681T579 672Q577 665 507 520T436 373L435 370H528L621 371L692 518Q767 675 769 677Q775 694 789 694Q798 694 804 688T809 672Q806 664 737 519L665 371L751 370Q835 370 841 368Q851 362 851 350Q851 337 841 334T799 330H765H741H645L606 250L568 170H793ZM600 328Q600 330 508 330H415Q412 326 338 171Q338 170 431 170H524L561 248Q569 265 579 286T595 318L600 328",36:"228 70Q233 92 246 155T270 266T280 316Q271 318 265 320T237 333T200 360T172 403T159 468Q159 537 205 600T325 691Q352 701 360 701Q361 701 361 701T362 703T364 711T368 727L372 750H409Q445 750 445 749L436 705Q436 703 450 702T494 691T554 657L565 649Q562 642 548 604L534 568Q511 591 484 605T440 621L424 623L419 624L372 405Q399 400 424 384Q490 338 490 247V240Q490 156 430 85Q374 13 294 -5L284 -7L280 -30Q279 -35 278 -41T275 -52L274 -55Q274 -56 237 -56Q201 -56 201 -54Q202 -53 205 -34T211 -11Q211 -9 206 -9Q154 -2 115 19Q80 35 56 59L88 141L99 131Q109 121 119 113T141 99T160 89T180 82T197 77T214 73T228 70ZM303 426Q304 427 313 471T332 564T345 620L335 616Q287 596 263 549Q252 525 252 499Q252 470 267 451T298 426Q303 424 303 426ZM302 75Q305 75 315 80T340 98T367 125T390 164T399 214Q399 247 384 268T349 297Q338 247 326 186L302 75",37:"268 347Q224 347 195 386T165 488Q165 517 173 552Q191 637 246 693T349 749Q389 749 414 725T448 673T456 614Q456 506 396 427T268 347ZM372 604Q372 674 339 674Q311 674 290 633T261 549T253 482V474Q253 438 272 426Q277 424 286 424Q319 424 345 485T372 604ZM189 -56Q179 -56 173 -49T167 -37Q167 -30 347 198Q425 296 475 360Q780 745 785 747Q790 750 796 750Q814 748 814 730Q814 725 811 719L204 -49Q198 -56 189 -56ZM523 87Q523 184 583 265T713 347Q758 347 786 308T815 207Q815 110 757 28T629 -55Q576 -55 550 -12T523 87ZM729 200Q729 271 696 271Q675 271 658 247T631 189T616 125T611 76Q611 21 644 21H647Q672 21 700 77T729 200",38:"219 -22Q158 -22 117 13T71 111Q71 131 74 150T84 185T98 215T118 241T137 262T159 281T179 295T199 308L214 318L258 348L256 362Q254 373 254 413V435Q254 483 271 537T325 641T411 708Q427 715 441 715Q446 716 455 716Q504 716 534 681T565 590Q565 522 519 468T377 347L358 334Q359 333 363 320T374 290T387 262Q404 227 428 187T460 139Q521 183 574 251T651 362T674 409L710 398Q746 388 747 388Q747 381 720 333T635 213T517 94L510 87Q542 57 598 57Q649 57 708 72Q716 75 718 75L709 34L701 -7Q636 -22 578 -22Q531 -22 498 -8T428 34L408 25Q314 -22 219 -22ZM480 579Q480 640 436 640Q410 640 385 615T351 554Q340 513 340 457Q340 413 343 410Q343 406 360 419Q431 471 455 505T480 579ZM245 57Q279 59 311 67T359 81T375 89T358 113T318 178T281 260L274 277L245 257Q167 205 167 135Q167 110 174 93T194 69T217 60T237 57H245",39:"228 647L237 694H286Q335 694 335 693L334 686Q332 680 330 668T325 644L315 597L239 471H214Q190 471 190 472L246 595Q246 596 231 596H217V598Q217 601 228 647",40:"195 37Q195 -7 200 -47T213 -113T231 -166T250 -204T268 -232T280 -250H204L194 -238Q104 -124 104 55Q104 238 181 432T405 740L417 750H454Q491 750 491 749L468 729Q446 709 411 667T337 565T262 405T208 188Q195 110 195 37",41:"300 463Q300 634 222 740L214 750H290L299 740Q300 738 309 726T323 707T337 682T353 651T367 613T379 566T387 510T390 444Q390 314 344 156T203 -125Q179 -155 145 -191Q111 -224 89 -241L78 -250H2Q4 -248 27 -227T65 -189T107 -140T155 -71T200 16T244 129T278 266Q300 372 300 463",42:"193 608Q193 628 210 644T246 660Q250 660 252 660T257 658T264 654T272 648T284 638T302 623Q340 590 340 593Q341 594 345 623T354 682T360 715Q365 729 378 739T407 750Q424 750 433 740T443 720Q443 712 427 652L410 591L462 623Q505 650 514 655T534 660Q549 660 558 650T568 625Q568 617 567 611T560 599T551 590T536 580T519 571T496 561T470 548L429 528L474 500Q482 495 492 489T506 481T516 475T523 469T527 464T529 458T530 450Q530 430 514 414T479 397H475Q468 397 460 402T423 433Q414 440 404 448T388 461L383 465L365 344Q348 306 314 306Q302 306 292 313T281 338Q281 347 297 404L313 464L260 433Q201 397 195 397H189Q173 397 165 407T156 432Q156 438 157 443T161 452T166 460T175 468T185 475T198 482T212 489T230 497T250 506L295 528L250 556Q203 582 202 585Q193 591 193 608",43:"108 244T108 250T112 261T119 268T124 270H426V272Q428 274 457 419Q489 565 492 573Q497 583 508 583Q516 583 522 577T528 565Q528 553 498 417Q491 384 483 346T471 288L467 270H760Q775 262 775 250T760 230H458Q456 221 426 77T394 -71Q389 -83 375 -83Q367 -83 362 -78T356 -64Q356 -58 387 84Q394 118 401 155T413 210L417 229Q417 230 271 230H124Q123 230 120 232T112 239",44:"90 2Q91 3 100 49T111 96Q111 98 160 98T209 96L199 50Q189 3 188 2Q188 0 149 -63L112 -125H63L120 0H105Q90 0 90 2",45:"66 257V259H332V257L324 220L317 186H184Q51 186 51 187T58 220T66 257",46:"90 2Q91 3 100 49T111 96Q111 98 160 98T209 96L199 50Q189 3 188 2V0H90V2",47:"564 744L568 747Q573 750 579 750Q588 750 594 744T599 729Q597 721 321 241T41 -243Q37 -250 27 -250Q6 -250 6 -230Q6 -228 8 -222Q9 -219 285 261T564 744",48:"245 -22Q209 -22 181 -11T135 20T107 65T92 116T88 171Q88 235 114 354T194 557Q226 606 269 635T340 671T392 678H395Q422 678 446 670T495 643T534 582T549 481Q549 430 534 350T499 213Q459 89 379 25Q315 -22 247 -22H245ZM430 582Q408 601 378 601Q313 601 269 534Q234 475 205 341Q181 232 181 174Q181 104 209 76Q231 54 260 54T318 73T368 125Q410 194 447 375Q460 445 460 487Q460 555 430 582",49:"234 613Q277 613 331 628T428 678H439Q451 678 451 676Q450 671 387 373T323 74T384 73H445L430 0H259L88 1L104 73H229L332 560Q278 541 198 539Q198 540 198 541T199 546T200 554T202 564T205 576L213 612H219Q221 612 226 612T234 613",50:"190 460Q189 460 181 475T164 507T155 527Q155 535 182 571Q259 678 380 678Q462 678 506 630T551 513V507Q551 418 487 349Q469 329 441 305T391 265T344 232T316 212Q158 87 158 86T188 85Q194 85 234 85T311 86Q467 86 467 85Q451 9 449 2V0H50Q54 18 58 40L67 79L133 133Q246 226 269 243Q369 318 410 373T452 492Q452 535 433 560T393 592T350 599Q311 599 279 578T231 532T203 484T190 460",51:"446 542Q446 576 424 590T372 605Q330 605 288 583T216 524Q209 515 208 516Q207 517 192 549L178 580L187 589Q224 627 276 652T386 678Q456 678 500 642T544 550Q544 515 530 482T495 427T453 387T418 362L403 353L413 348Q440 335 462 313Q500 271 500 217Q500 135 423 57T236 -22T63 59L56 68L85 141Q106 112 125 98Q177 54 254 54Q315 54 355 105T396 218Q396 242 393 254Q380 301 335 313Q327 315 280 316Q233 316 233 318L249 392Q298 392 322 399Q373 408 409 453T446 542",52:"78 235L411 656H465Q519 656 519 655T475 447T430 237V235H521V233L505 160Q505 159 459 159H414L380 0H286L320 159H62L63 164Q64 169 66 179T70 198L78 235ZM342 235L421 607Q420 607 419 604Q409 535 197 267Q173 236 173 235H342",53:"330 350Q263 350 214 272H133V275Q134 276 174 467L214 655Q214 656 385 656H555V653Q555 652 554 647T550 631T546 613L539 577H284L265 486Q261 464 256 441T248 406L246 395L250 398Q255 401 264 406T286 415T315 423T350 427Q412 427 455 381T498 256Q498 150 415 64T222 -22Q186 -22 155 -12T105 12T74 41T55 65T50 77L51 79Q61 89 78 112L104 145L107 138Q110 130 114 123T125 106T142 88T165 72T196 60T236 55Q282 55 316 79T366 140T389 208T396 267Q396 310 378 330T337 350H330",54:"437 605Q397 605 361 585T301 536T261 477T236 426T228 401L236 408Q244 414 260 424T296 445T345 462T402 469H404Q422 469 434 467T465 446T498 394Q515 351 515 307Q515 254 497 193T439 85Q352 -22 246 -22Q220 -22 196 -14T148 15T109 78T94 179Q94 272 123 373Q163 505 257 591T450 678Q474 678 498 674T535 664T548 656L540 621L532 586L520 590Q509 594 485 599T437 605ZM339 392Q281 392 233 334T185 163V158Q185 87 230 61Q244 54 262 54Q325 54 371 122Q395 158 407 217T419 298Q419 337 401 364T339 392",55:"173 614L181 656H389Q596 656 596 655L595 650Q594 645 592 635T588 616L580 578L554 551Q313 307 245 4L242 -11H192Q143 -11 143 -10Q144 0 148 17T169 89T212 198T285 327T393 470Q423 504 472 550Q479 555 485 561T496 571L329 570Q163 570 163 571L164 577Q166 583 168 593T173 614",56:"159 470Q159 547 229 612T394 678Q467 678 510 636T554 533Q554 512 549 493T535 458T515 429T492 405T467 386T443 372T423 362T409 356L404 354Q404 353 405 353Q411 353 432 341T476 295T500 218Q500 134 424 56T246 -22Q175 -22 126 22T77 143Q77 204 110 251T188 327L202 334Q216 340 229 346T243 353T235 358T214 372T189 393T168 426T159 470ZM467 527Q467 605 375 605Q317 605 281 566T244 472Q244 429 271 411T334 392Q392 392 429 430T467 527ZM405 228Q405 262 384 289T315 316Q257 316 216 266T174 144Q174 95 199 75T262 54Q329 54 367 109T405 228",57:"220 594Q303 677 389 677Q545 677 545 479Q545 413 526 327Q493 175 398 77T202 -22Q124 -22 77 25L130 91L137 83Q169 54 218 54Q255 54 290 76T347 129Q364 151 380 182T403 232T411 256Q410 255 390 241T353 217T303 197T236 187Q195 187 173 209Q155 226 140 263T124 352Q124 392 135 435Q154 527 220 594ZM455 497Q455 605 383 605Q340 605 305 577T246 492Q220 411 220 360Q220 278 279 264Q280 264 287 264T299 263Q347 263 387 302Q455 375 455 497",58:"174 396L184 444H233Q282 444 282 443Q277 421 272 394L262 346H213Q164 346 164 347Q169 369 174 396ZM90 2Q91 3 100 49T111 96Q111 98 160 98T209 96L199 50Q189 3 188 2V0H90V2",59:"174 396L184 444H233Q282 444 282 443Q277 421 272 394L262 346H213Q164 346 164 347Q169 369 174 396ZM90 2Q91 3 100 49T111 96Q111 98 160 98T209 96L199 50Q189 3 188 2Q188 0 149 -63L112 -125H63L120 0H105Q90 0 90 2",61:"142 368Q145 370 463 370Q780 370 784 368Q796 364 796 350T784 332Q780 330 463 330Q145 330 142 332Q129 338 129 351Q129 362 142 368ZM88 137T88 150T102 170H738Q739 170 742 168T750 161T754 150T750 139T743 132T738 130H102Q88 137 88 150",63:"194 652Q194 654 218 666T284 691T362 704Q444 704 490 678T536 583Q536 541 516 500T459 433Q415 400 387 371T343 313T321 266T307 216L301 186H262Q223 186 223 187Q224 199 228 218T250 288T294 377Q317 413 344 440T391 481T414 499Q442 527 442 574Q442 584 441 590T433 607T409 623T362 629Q335 629 310 624T267 610T235 595T214 582T205 576L200 614Q194 651 194 652ZM173 2Q174 3 183 49T194 96Q194 98 243 98T292 96L282 50Q272 3 271 2V0H173V2",64:"120 267Q120 377 179 478T336 642T538 705Q610 705 658 662T707 513Q707 425 681 331Q658 241 590 179T447 117Q386 117 343 163T300 288Q300 397 374 486T544 576Q575 576 608 562Q590 628 517 628Q406 628 309 522T212 278Q212 179 267 122T404 65T550 91H631Q513 -10 390 -10Q265 -10 193 70T120 267ZM600 397Q600 441 581 471T530 501Q476 501 433 436T390 298Q390 254 409 224T462 193Q512 193 556 257T600 397",91:"148 252L253 750H339Q425 750 425 749L424 744Q423 739 421 729T417 711L409 675L367 674H325L235 252Q145 -167 145 -172Q145 -174 187 -174H229V-176Q213 -240 213 -250H127Q41 -250 41 -248Q41 -245 148 252",93:"353 749Q353 746 303 512T200 27T141 -250H-31Q-31 -240 -15 -176V-174H70L250 674H208L165 675L181 750H267Q353 750 353 749",94:"190 527L360 694H434L484 611Q533 528 533 527H457L390 632L385 639L266 527H190",95:"59 -75L66 -38H316Q565 -38 565 -39T558 -75T549 -112Q549 -114 299 -114Q50 -114 50 -113L52 -108Q53 -103 55 -93T59 -75",126:"330 327Q356 326 388 298T446 269Q470 269 484 327H522Q560 327 560 325L557 316Q554 306 549 292T535 263T512 232T480 208Q453 193 429 193T370 222T315 251Q285 251 275 193H199V197Q214 257 251 292T330 327",305:"168 442T168 443T213 444T258 443T212 225T164 2V0H74V2Q75 7 121 224",567:"-54 -96L-48 -104Q-41 -111 -27 -118T7 -126Q60 -126 82 -87Q85 -81 140 181L196 443Q196 444 241 444T286 443Q286 441 232 186T175 -75Q163 -120 122 -162T19 -204Q-13 -204 -41 -196T-83 -180T-96 -170Q-55 -96 -54 -96",768:"-262 681L-270 694H-177L-132 612Q-89 530 -87 528Q-87 527 -125 527H-163L-208 598Q-254 670 -262 681",769:"-96 625L-29 694H63Q42 673 -31 605L-114 527H-190L-176 541Q-160 559 -96 625",770:"-310 527L-140 694H-66L-16 611Q33 528 33 527H-43L-110 632L-115 639L-234 527H-310",771:"-170 677Q-144 676 -112 648T-54 619Q-30 619 -16 677H22Q60 677 60 675L57 666Q54 656 49 642T35 613T12 582T-20 558Q-47 543 -71 543T-130 572T-185 601Q-215 601 -225 543H-301V547Q-286 607 -249 642T-170 677",772:"-314 553L-297 631H-116Q64 631 64 630Q60 612 56 591L47 553L-133 552Q-314 552 -314 553",774:"-142 508Q-205 508 -244 548T-284 652Q-284 666 -281 683L-280 694H-204Q-205 689 -205 677Q-205 650 -196 631T-173 604T-147 593T-125 590Q-85 590 -50 618T-5 686L-2 694H73V690Q53 610 -10 559T-142 508",775:"-180 578Q-179 579 -170 627T-158 678V680H-54V678Q-56 675 -65 627T-76 578V576H-180V578",776:"-273 584Q-272 585 -262 632L-252 678V680H-154V678L-164 632Q-174 585 -175 584Q-175 582 -224 582T-273 584ZM-78 586Q-78 587 -69 632T-58 678V680H40L39 677Q39 676 38 670T34 651T29 628L19 583L-30 582H-79L-78 586",778:"-227 597Q-227 639 -186 666T-102 693H-97Q-29 693 -8 649Q-2 637 -2 623Q-2 582 -43 555T-132 527Q-171 527 -199 546T-227 597ZM-59 619Q-59 635 -68 643T-104 652Q-142 652 -156 636T-171 602Q-171 569 -123 569Q-119 569 -111 570T-99 571Q-59 582 -59 619",779:"-236 619L-195 694H-149Q-103 694 -103 693L-211 527H-287L-282 536Q-281 539 -236 619ZM-70 619L-29 694H17Q63 694 63 693L-45 527H-121L-116 536Q-115 539 -70 619",780:"-283 654H-207L-140 549L-135 542L-16 654H60L-109 487H-147L-184 488L-234 570Q-283 653 -283 654",913:"28 0L429 694H533L585 350Q596 275 610 182T632 46L638 3V0H530L528 18Q527 25 515 103T503 183H223L135 29L118 1L73 0H28ZM492 254Q492 256 473 398T454 589V610Q433 552 290 301L264 255L378 254H492",914:"501 363Q557 355 605 316T653 222Q653 148 586 85T403 2Q394 1 240 0Q90 0 90 1L100 46Q109 90 128 177T164 348L238 694H375Q518 693 546 688Q614 674 655 635T696 544Q696 490 648 441T516 368L501 363ZM601 530Q601 568 566 590T479 621Q472 622 394 623H320L297 513Q292 489 286 459T276 415L273 401V399H339H372Q504 399 571 466Q601 498 601 530ZM257 322Q256 320 230 197T203 73Q203 71 289 71Q379 72 387 73Q459 84 507 122T556 210Q556 255 519 283T428 320Q415 322 336 323Q257 323 257 322",915:"87 2Q88 4 160 346T234 689Q234 691 440 691T646 689Q643 686 629 611H475L321 612Q193 4 191 2V0H87V2",916:"273 343L510 694H617Q790 2 790 0H416L42 1L273 343ZM539 576Q536 597 536 600Q536 602 535 605Q534 607 534 607Q527 580 222 130L201 98H651L648 110Q645 123 639 149T627 198Q554 489 539 576",917:"86 2Q88 4 160 346T233 689Q233 691 461 691Q688 691 688 689Q685 686 671 611H495L320 612L319 609Q319 607 297 501L274 397H436Q597 397 597 396L596 391Q595 386 593 376T589 358L581 322L420 321Q258 321 258 320Q209 89 208 87Q208 85 390 85Q417 85 460 85T518 86L572 85Q556 8 554 2V0H86V2",918:"67 54Q551 615 551 617Q543 618 517 618Q510 618 463 618T376 617Q200 617 200 618T209 657L216 694H459Q702 694 702 692Q702 689 697 667L692 643L207 80H392Q493 81 577 81Q577 70 560 2V0H55V2L67 54",919:"517 2Q518 3 551 161T585 322Q586 323 557 323T422 323H259L190 0H138Q86 0 86 1L96 46Q105 90 124 177T160 348L234 694H337V691Q336 690 306 545T275 399H602L603 403Q603 407 634 551L665 694H768V691Q768 690 695 348T621 2V0H517V2",920:"119 260Q119 348 157 433T254 579T387 677T533 715Q701 715 772 574Q804 511 804 431Q804 315 744 209T586 41T384 -22Q262 -22 191 59T119 260ZM706 426Q706 524 655 582T525 640Q454 640 395 600T293 502Q256 447 237 383T218 266Q218 168 269 112T401 55Q518 55 612 166T706 426ZM283 349L293 397H473Q652 397 652 396Q647 374 642 347L632 299H452Q273 299 273 300Q278 322 283 349",921:"161 348L235 694H338V691Q338 690 265 348T191 2V0H139Q87 0 87 1L96 46Q106 90 125 177T161 348",922:"236 223Q235 222 213 113T188 2V0H138Q88 0 88 1L98 46Q107 90 126 177T162 348L236 694H285Q335 694 335 693L330 671Q326 649 316 603T298 518Q289 477 280 433T266 366L261 343L672 694H729L784 693L465 420L651 0H596L541 1L384 350Q383 351 310 288T236 223",923:"28 0L401 694H504V690Q505 686 543 345T582 1Q582 0 528 0H473V3Q472 6 460 113T435 359T422 558Q422 593 424 603L425 610L424 608Q414 572 343 431Q287 316 143 49L117 1L73 0H28",924:"375 691Q456 215 459 124V106Q488 177 762 641L793 694H929V691Q929 690 856 348T782 2V0H689V2Q691 4 753 304Q817 604 818 606Q819 611 817 608Q817 607 815 603Q798 559 540 117L484 22H440L397 23L393 42Q393 47 373 169T334 422T315 594V609L250 306Q186 3 185 2Q185 0 138 0Q92 0 92 1L102 46Q111 90 130 177T166 348L240 694H375V691",925:"311 609Q310 608 246 306T181 2V0H134Q88 0 88 1L98 46Q107 90 126 177T162 348L236 694H382L383 691Q383 688 418 561T493 286T541 97L544 84L545 89Q545 90 553 128T578 246T610 394L674 694H766V691Q766 690 693 348T619 2V0H472L469 13Q468 17 393 293T312 605L311 609",926:"193 687Q193 688 479 688H765V686Q764 685 755 642L747 600H461L175 601Q175 602 184 645L193 687ZM196 400Q196 401 418 401T640 400L622 315Q622 314 400 314T178 315L196 400ZM42 2Q43 3 51 44T60 87H64Q68 87 75 87T93 87T119 87T151 88T190 88T237 88T291 88T352 88H643Q638 66 634 44T627 13T624 2V0H42V2",927:"118 254Q118 366 174 473T324 648T517 716Q627 716 695 638T763 435Q763 321 706 215T555 43T362 -22Q256 -22 187 56T118 254ZM380 58Q452 58 518 116T622 263T661 442Q661 496 646 535T608 594T567 622T534 634Q516 636 496 636Q400 636 313 528T225 264Q225 172 267 115T380 58",928:"86 2Q88 4 160 346T233 689Q233 691 501 691Q768 691 768 689Q766 688 694 346T621 2V0H517V2Q518 3 582 304T646 609L648 615H321L190 0H86V2",929:"162 348L236 694H378Q522 693 530 692Q604 680 647 635T690 524Q690 474 665 430T612 359Q550 299 465 280Q443 275 343 274H250V271Q250 269 235 201T206 68T192 2V0H140Q88 0 88 1L98 46Q107 90 126 177T162 348ZM594 513Q594 560 562 588T477 622Q470 623 394 623H321L293 487L263 349V347H342H347H375Q530 347 578 449Q594 483 594 513",931:"194 655L202 694H508Q813 694 813 693Q809 675 805 653L797 614H559L321 615Q327 606 405 478L485 347Q449 311 348 203T247 86Q247 84 294 84Q303 84 359 84T465 85H684Q684 84 675 42L666 0H360L55 1L195 154Q346 319 347 320L359 333L273 473Q187 614 186 614L187 620Q188 625 190 635T194 655",932:"165 608L182 687Q182 688 486 688H790L789 685L781 645L773 609H521L457 306Q393 3 392 2Q392 0 340 0H288V2Q289 5 353 304T417 605V609L291 608H165",933:"357 637Q320 637 297 612T266 555H173Q178 576 188 598Q214 651 265 683T373 716Q497 716 497 542V509L504 526Q579 715 711 715Q773 715 808 677T843 589Q843 576 840 555H747L748 557Q748 559 748 563T749 574V580Q749 604 731 622Q715 638 693 638Q591 638 543 465Q531 425 506 309T462 98T441 2V0H337V2Q425 401 436 486Q438 504 438 526Q438 637 364 637H357",934:"124 308Q124 399 208 481T433 587Q437 587 437 589Q438 590 449 643L459 694H508Q557 694 557 693Q557 691 546 641T535 587Q543 587 562 583T614 565T674 531T722 472T743 387Q743 288 656 209T449 110L433 106Q411 3 410 2Q410 0 361 0H312L313 3Q313 5 324 56L335 107H331L321 108Q311 110 297 114T266 124T228 141T190 168Q124 225 124 308ZM227 315Q227 282 239 257T270 218T306 197T338 186L350 184H351L386 346Q420 507 420 509H419Q411 509 393 505T342 485T284 444Q227 387 227 315ZM642 381Q642 413 629 437T599 475T563 496T533 507T519 510Q518 510 484 348T450 184Q544 201 593 258T642 381",935:"14 0Q17 3 184 184T352 367L265 529Q244 567 222 609T188 672L176 692Q176 694 236 694H297L338 612Q387 515 400 489L421 448L645 694H758L708 640Q481 393 456 368Q455 366 500 281T596 104T652 0H531L388 293L128 0H14",936:"325 556Q325 524 310 447T294 330Q294 289 304 260Q314 234 333 216T364 192T380 187L488 694H585V691Q584 689 531 438L478 188H479Q485 188 503 195T555 231T613 305Q637 352 654 435Q662 470 669 496T681 538T690 562T698 578T704 587Q719 609 733 615T772 621H802H854V619L838 546Q838 545 832 545Q775 539 749 418Q716 274 638 196Q616 173 590 156T543 131T503 117T473 110T460 106Q460 105 450 54T438 2V0H340V2Q341 3 351 54T362 106Q363 107 358 108T344 111T322 117T295 128T267 145T239 171T216 207T200 256T194 319Q194 356 203 408T213 483Q213 517 203 530T182 544T171 546Q184 609 187 619V621H239Q286 621 294 620T309 612Q325 596 325 556",937:"148 407Q148 475 182 534T269 633T386 694T511 716Q622 716 695 658T769 507Q769 461 747 409T699 321T628 225T562 136Q533 90 533 86Q542 85 557 85Q564 85 583 85T614 86Q695 86 695 85Q679 9 677 2V0H425Q426 3 433 30T447 72T480 131T549 241L554 248Q558 254 563 261T576 281T592 306T609 335T625 366T640 400T653 434T661 466T664 498Q664 562 618 601T497 640Q416 640 351 596T262 482Q250 441 250 392T276 237T302 70V56Q302 28 296 2V0H44V2L62 85Q62 86 143 86L225 85V88Q224 89 224 89T224 91T224 95T223 101T222 110T220 123T216 140T209 163T200 191T188 227Q148 344 148 407",8211:"59 275L66 312H316Q565 312 565 311T558 275T549 238Q549 236 299 236Q50 236 50 237L52 242Q53 247 55 257T59 275",8212:"59 275L66 312H566Q1065 312 1065 311T1058 275T1049 238Q1049 236 549 236Q50 236 50 237L52 242Q53 247 55 257T59 275",8213:"59 275L66 312H566Q1065 312 1065 311T1058 275T1049 238Q1049 236 549 236Q50 236 50 237L52 242Q53 247 55 257T59 275",8215:"59 -75L66 -38H316Q565 -38 565 -39T558 -75T549 -112Q549 -114 299 -114Q50 -114 50 -113L52 -108Q53 -103 55 -93T59 -75",8216:"309 567L299 520Q289 474 288 473Q288 471 239 471T190 473L192 480Q193 486 196 499T201 522L211 569L287 694H312L335 693L332 685Q328 677 321 661T307 630L279 570L294 569Q309 569 309 567",8217:"228 647L237 694H286Q335 694 335 693L334 686Q332 680 330 668T325 644L315 597L239 471H214Q190 471 190 472L246 595Q246 596 231 596H217V598Q217 601 228 647",8220:"393 567L383 520Q373 474 372 473Q372 471 323 471T274 473L276 480Q277 486 280 499T285 522L295 569L371 694H396L419 693L416 685Q412 677 405 661T391 630L363 570L378 569Q393 569 393 567ZM587 567L577 520Q567 474 566 473Q566 471 517 471T468 473L470 480Q471 486 474 499T479 522L489 569L565 694H590L613 693L610 685Q606 677 599 661T585 630L557 570L572 569Q587 569 587 567",8221:"171 647L180 694H229Q278 694 278 693L276 686Q275 680 273 668T268 644L258 597L182 471H157Q133 471 133 472L189 595Q189 596 174 596H160V598Q160 601 171 647ZM365 647L374 694H423Q472 694 472 693L470 686Q469 680 467 668T462 644L452 597L376 471H351Q327 471 327 472L383 595Q383 596 368 596H354V598Q354 601 365 647",8260:"564 744L568 747Q573 750 579 750Q588 750 594 744T599 729Q597 721 321 241T41 -243Q37 -250 27 -250Q6 -250 6 -230Q6 -228 8 -222Q9 -219 285 261T564 744",8710:"273 343L510 694H617Q790 2 790 0H416L42 1L273 343ZM539 576Q536 597 536 600Q536 602 535 605Q534 607 534 607Q527 580 222 130L201 98H651L648 110Q645 123 639 149T627 198Q554 489 539 576"},{})},9007:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.sansSerif=void 0;var H=L(9403),V=L(4214);T.sansSerif=(0,H.AddPaths)(V.sansSerif,{33:"120 187Q120 225 115 440T110 693Q110 694 159 694T208 693Q208 655 203 440T198 187Q198 186 159 186T120 187ZM110 0V98H208V0H110",34:"33 596V694H131V597L82 471H32L47 532Q62 593 63 594Q63 596 48 596H33ZM227 596V694H325V597L276 471H226L241 532Q256 593 257 594Q257 596 242 596H227",35:"56 350Q56 363 70 370H192Q314 370 314 371L356 526Q396 676 401 685Q406 694 416 694Q423 694 429 689T436 677Q436 673 396 523T355 371Q355 370 449 370Q544 370 544 371L586 526Q628 682 630 685Q636 694 646 694Q653 694 659 689T665 678Q665 670 645 593T605 444L585 371Q585 370 673 370H762Q777 362 777 350Q777 337 767 334T723 330H668H573L567 305Q560 282 545 226L530 171L646 170H721Q756 170 766 167T777 150Q777 138 762 130H640Q518 130 518 129L476 -26Q434 -182 432 -185Q426 -194 416 -194Q409 -194 403 -189T397 -178Q397 -170 417 -93T457 56L477 129Q477 130 383 130Q288 130 288 129L246 -26Q204 -182 202 -185Q196 -194 186 -194Q179 -194 173 -189T167 -178Q167 -170 187 -94T227 56L247 129Q247 130 159 130H70Q56 137 56 150Q56 165 72 170H259L265 195Q273 222 287 275L302 330H186L70 331Q63 334 58 339Q56 343 56 350ZM489 170L532 330H343L337 305Q330 282 315 226L300 171L394 170H489",36:"55 509Q55 585 103 638T213 701V750H286V703H289Q312 703 354 689Q372 682 399 666T427 646L413 569Q413 568 403 575Q352 615 291 624H286V405Q357 389 400 331T444 199Q444 128 402 69T286 -7V-56H213V-9Q167 -3 125 14T63 44T44 60Q44 61 52 101L59 140L69 132Q78 125 87 119T107 107T124 97T141 90T157 84T173 80T187 76T201 73T213 70V317L202 319Q141 335 98 386T55 509ZM213 424V620L203 615Q143 587 143 522Q143 455 213 424ZM356 187Q356 208 350 227T334 258T315 280T298 293T287 297Q286 297 286 186V75Q356 110 356 187",37:"56 549Q56 639 98 694T195 750Q248 750 290 694T332 548Q332 455 290 401T195 347Q141 347 99 403T56 549ZM248 549Q248 602 234 638T195 674Q145 674 145 549Q145 423 195 423Q219 423 233 459T248 549ZM197 -56Q187 -56 182 -49T176 -35Q176 -33 178 -27Q179 -25 399 356T623 741Q626 750 639 750Q648 750 654 744T659 729Q657 721 435 336T207 -52Q203 -56 197 -56ZM500 146Q500 235 542 291T639 347Q692 347 734 293T776 146Q776 53 733 -1T639 -56Q587 -56 544 -2T500 146ZM692 146Q692 199 678 235T639 271Q589 271 589 146Q589 20 639 20Q663 20 677 56T692 146",38:"156 502Q156 600 198 658T302 716Q367 716 405 665T444 549Q444 531 442 523Q426 446 304 348L287 334Q305 297 340 249T402 170T430 139T443 149T472 181T509 231T549 303T583 394Q584 398 586 404Q587 408 587 409Q588 409 626 399T665 388Q663 381 660 369T644 322T614 253T567 176T502 98L491 87Q534 57 584 57Q653 57 700 75Q702 75 702 34T700 -7Q652 -22 586 -22H580Q505 -22 434 26L421 34Q419 33 405 25T374 11T336 -4T285 -17T226 -22Q143 -22 93 31T42 152Q42 184 51 211T81 260T111 291T144 317L184 348L178 365Q156 430 156 502ZM359 552Q359 588 345 614T302 640Q292 640 282 636T260 622T241 590T233 535Q236 474 253 417L257 407L271 419Q312 454 330 479Q359 514 359 552ZM345 102Q262 190 216 277Q215 277 204 267T180 247T165 236Q135 208 135 159Q135 123 152 97T198 61Q207 58 227 58Q286 58 357 89L345 102",39:"90 596V694H188V597L139 471H89L104 532Q119 593 120 594Q120 596 105 596H90",40:"74 250Q74 564 240 733L257 750H333L323 739Q167 573 167 250T323 -239L333 -250H257L240 -233Q74 -63 74 250",41:"221 -73T221 250T65 739L55 750H131L148 733Q314 567 314 250T148 -233L131 -250H55L65 -239Q221 -73 221 250",42:"208 717Q211 731 222 740T250 750Q265 750 277 741T291 717Q291 706 290 675T286 617L285 591L329 622Q369 651 376 655T393 659Q411 659 423 647T436 616Q436 609 434 603T429 594T419 585T407 577T389 567T368 556L316 528L368 500Q421 472 429 464Q436 455 436 440Q436 422 423 409T393 396Q390 396 388 396T384 397T380 398T375 401T367 406T358 413T346 422T329 434L285 465Q284 465 285 438T289 381T291 347Q291 327 278 317T250 306Q234 306 222 315T208 339Q208 350 209 381T212 439L214 465L170 434Q130 405 123 401T106 397Q88 397 76 409T63 440Q63 447 65 453T70 462T80 471T92 479T110 489T131 500L183 528L131 556Q78 584 70 592Q63 601 63 616Q63 634 76 647T106 660Q109 660 111 660T115 659T119 658T124 655T132 650T141 643T153 634T170 622L214 591L212 617Q211 643 210 674T208 717",43:"56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250",44:"90 0V98H188V1L139 -125H89L104 -64Q119 -3 120 -2Q120 0 105 0H90",45:"11 186V259H277V186H11",46:"90 0V98H188V0H90",47:"423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750",58:"90 346V444H188V346H90ZM90 0V98H188V0H90",59:"90 346V444H188V346H90ZM90 0V98H188V1L139 -125H89L104 -64Q119 -3 120 -2Q120 0 105 0H90",61:"56 350Q56 363 70 370H707Q722 362 722 350Q722 339 708 331L390 330H72Q56 335 56 350ZM56 150Q56 165 72 170H708Q722 160 722 150Q722 138 707 130H70Q56 137 56 150",63:"55 652Q63 658 77 666T132 689T214 704T265 703Q303 698 332 684T376 653T401 615T413 578T416 546Q416 475 360 426Q325 396 303 365T273 303T263 256T261 216V186H183V225Q184 281 194 322Q206 368 232 409T276 469T306 495Q323 517 323 550Q323 596 297 612T223 629Q187 629 157 618Q122 607 91 583L83 576L55 652ZM173 0V98H271V0H173",64:"422 576Q440 576 456 573T480 566L488 563Q488 565 484 571T472 588T452 607T424 622T387 629Q294 629 220 550T146 347Q146 233 210 155T365 66Q376 65 400 65Q465 68 517 86L532 91H612L598 76Q511 -11 388 -11Q250 -11 153 93T56 347Q56 454 107 538T231 663T378 704Q446 704 492 680T564 608T599 506T611 376Q611 320 607 299Q595 227 546 173T422 118Q343 118 288 185T232 347Q232 444 287 510T422 576ZM520 347Q520 429 487 465T421 501Q385 501 354 461T323 347Q323 270 355 232T422 193Q454 193 487 229T520 347",91:"94 -250V750H266V674H181V-174H266V-250H94",93:"22 674V750H194V-250H22V-174H107V674H22",94:"146 612L212 694H287L353 612Q417 532 420 529Q421 528 418 527Q414 527 383 527H345L250 639Q244 633 199 580L154 527H116Q79 528 79 529Q82 532 146 612",95:"0 -114V-38H499V-114H0",126:"83 204Q86 254 113 290T186 327Q211 327 251 299T312 270Q337 270 340 315V327H416V316Q413 258 382 226T315 193Q289 193 249 221T187 250Q162 250 159 205V193H83V204",305:"74 0V444H164V0H74",567:"-35 -95Q-4 -126 34 -126Q58 -126 76 -116T100 -88Q102 -82 102 181V444H192V180Q191 -45 191 -70T184 -113Q171 -152 140 -178T63 -205Q34 -205 4 -197T-43 -181T-59 -171L-47 -133L-35 -95",768:"-415 692L-417 694H-324L-262 612Q-249 594 -233 572T-208 539L-200 528L-237 527H-275L-344 608Q-359 625 -378 647T-406 680T-415 692",769:"-239 612L-177 694H-84L-86 692Q-86 691 -95 681T-123 648T-157 608L-226 527H-264L-301 528L-293 539Q-285 550 -269 572T-239 612",770:"-354 612L-288 694H-213L-147 612Q-83 532 -80 529Q-79 528 -82 527Q-86 527 -117 527H-155L-250 639Q-256 633 -301 580L-346 527H-384Q-421 528 -421 529Q-418 532 -354 612",771:"-417 554Q-414 604 -387 640T-314 677Q-289 677 -249 649T-188 620Q-163 620 -160 665V677H-84V666Q-87 608 -118 576T-185 543Q-211 543 -251 571T-313 600Q-338 600 -341 555V543H-417V554",772:"-431 552V631H-70V552H-431",774:"-250 508Q-331 508 -379 567T-427 689V694H-351V685Q-348 649 -321 620T-250 591Q-206 591 -180 619T-150 685V694H-74V689Q-74 624 -122 566T-250 508",775:"-302 576V680H-198V576H-302",776:"-397 582V680H-299V582H-397ZM-202 582V680H-104V582H-202",778:"-319 611Q-319 649 -285 671T-211 694Q-164 694 -132 671T-99 611Q-99 572 -133 550T-209 527T-285 549T-319 611ZM-155 610Q-155 635 -171 643T-215 651Q-263 651 -263 610Q-263 570 -211 570H-209H-207Q-155 570 -155 610",779:"-250 693Q-317 544 -323 527H-399L-343 694H-296Q-250 694 -250 693ZM-84 693Q-151 544 -157 527H-233L-177 694H-130Q-84 694 -84 693",780:"-421 652Q-422 653 -419 654Q-415 654 -384 654H-346L-301 601Q-287 585 -275 571T-258 551T-250 542L-155 654H-117Q-80 653 -80 652Q-83 649 -147 569L-213 487H-288L-354 569Q-418 649 -421 652",913:"183 181Q183 179 152 91T118 0H28L154 346L280 693Q281 694 333 694H385L511 349Q636 4 638 2Q638 0 584 0H530L464 183H184L183 181ZM324 606Q319 578 292 492T238 332T210 256Q210 254 324 254T438 255L429 281L419 308Q409 336 395 378T365 465T339 551T324 611V606",914:"425 363Q438 363 465 353T526 324T585 270T610 192Q610 132 561 78T426 7Q404 2 387 2T240 0H90V694H227Q373 693 396 689Q484 673 533 623T583 517Q583 494 574 473T551 437T520 409T487 388T456 374T433 366L425 363ZM490 516Q490 527 485 539T467 568T423 599T347 621Q340 622 262 623H188V399H261H286Q432 399 478 475Q490 496 490 516ZM514 190Q514 245 462 280T343 322Q336 323 259 323H188V71H274Q365 72 388 77Q445 88 479 121T514 190",915:"87 0V691H499V611H345L191 612V0H87",916:"203 348L362 694H470L629 348Q789 2 790 1Q790 0 416 0T42 1Q43 2 203 348ZM630 98Q630 100 584 198T481 422T407 603L405 610L403 600Q388 544 191 122L180 99L405 98H630",917:"86 0V691H541V611H366L190 612V397H513V321H190V85H372L554 86V0H86",918:"69 617V694H555V643L373 362Q190 81 190 79H234Q244 79 272 79T344 80T419 81H560V0H55V53L237 334Q420 615 420 617Q413 618 387 618Q380 618 334 618T245 617H69",919:"86 0V694H190V399H517V694H621V0H517V323H190V0H86",920:"56 344Q56 430 86 502T164 619T271 690T388 716Q448 716 506 691T613 619T692 501T722 344Q722 188 624 84T389 -21Q252 -21 154 83T56 344ZM624 345Q624 423 597 488T513 596T380 639Q343 639 305 621T232 568T175 475T153 344Q153 216 222 136T388 56Q487 56 555 138T624 345ZM209 299V397H568V299H209",921:"87 0V694H191V0H87",922:"88 0V694H188V519L189 343L525 694H638L375 419L651 0H541L309 351L188 225V0H88",923:"294 606Q294 574 252 430T163 144T117 0H72Q28 0 28 1T141 348L254 694H357L469 348Q582 2 582 1T527 0L473 1L469 11Q469 13 427 141T343 411T296 599L294 610V606",924:"92 0V694H228L233 680Q236 675 284 547T382 275T436 106Q446 149 497 292T594 558L640 680L645 694H782V0H689V305L688 606Q688 577 500 78L479 23H392L364 96Q364 97 342 156T296 280T246 418T203 544T186 609V588Q185 568 185 517T185 427T185 305V0H92",925:"88 0V694H235L252 659Q261 639 364 428T526 84V694H619V0H472L455 35Q453 39 330 294T185 601L181 611V0H88",926:"47 600V688H619V600H47ZM111 314V401H555V314H111ZM42 0V88H624V0H42",927:"55 345Q55 504 149 609T361 715Q386 715 406 713Q521 696 600 592T680 344Q680 193 590 86T368 -22Q239 -22 147 84T55 345ZM276 59T368 59T518 146T576 360Q576 473 525 545T401 634Q371 637 362 637Q284 637 222 562T159 360T217 147",928:"86 0V691H621V0H517V615H190V0H86",929:"88 0V694H230Q347 693 370 692T410 686Q487 667 535 611T583 485Q583 409 527 348T379 276Q369 274 279 274H192V0H88ZM486 485Q486 523 471 551T432 593T391 612T357 621Q350 622 268 623H189V347H268Q350 348 357 349Q370 351 383 354T416 368T450 391T475 429T486 485",931:"55 0Q56 3 171 167T288 332Q288 334 172 474L55 615V694H666V614H428L190 615L412 347L322 218Q236 97 228 84L447 85H666V0H55",932:"36 608V688H644V608H518L392 609V0H288V609L162 608H36",933:"55 565Q59 625 105 670T219 716H222Q310 716 353 627Q376 583 386 524L389 510L393 532Q397 555 407 584T433 644T482 695T557 716Q621 716 669 673T722 565V555H629V563Q627 592 607 615T557 638Q530 638 511 629T479 598T459 553T447 488T442 411T441 319V202V0H337V202Q337 453 331 497Q313 634 226 638Q185 638 167 612T148 563V555H55V565",934:"666 347Q666 326 661 302T638 247T594 190T520 140T413 107H410V0H312V54Q312 107 311 107Q286 107 229 128T125 192Q55 260 55 347Q55 396 77 438T131 507T200 552T265 579T311 587Q312 587 312 641V694H410V587H413Q476 576 524 552T598 502T640 444T661 390T666 347ZM310 510Q305 510 291 507T252 492T208 464T172 416T157 347T171 279T204 233T247 205T286 190T310 184H312V347Q312 510 310 510ZM564 347Q564 385 549 416T514 463T470 491T433 505T414 509L410 510V184Q413 184 426 187T464 200T510 227T548 275T564 347",935:"14 0Q16 5 144 184T275 367L153 528Q121 571 88 615T42 674T28 694H150L228 584Q315 463 316 461L326 448L497 694H610L609 692Q606 689 492 528Q440 454 409 410T378 366Q378 365 515 182L652 0H531L326 292Q326 293 299 254T226 146L128 0H14",936:"340 187V694H438V187Q481 206 495 219Q518 239 533 267T553 332T560 386T562 435Q562 576 593 608Q608 621 637 621H670H722V545H719Q718 545 715 545T710 544Q679 536 666 487Q664 474 662 429T654 344T633 259T580 175T486 119Q450 109 438 108V0H340V108L326 110Q122 149 117 415Q116 460 111 487Q98 536 67 544Q65 544 62 544T58 545H55V621H107Q160 621 163 620Q191 613 202 573Q213 536 213 473T220 351T256 249Q262 239 270 230T285 216T301 205T316 197T329 192T340 187",937:"55 462Q55 561 141 638T359 716Q492 716 579 640T666 462Q666 407 642 347T579 222T529 126Q515 91 515 86Q517 85 528 85Q530 85 552 85T596 86H677V0H425V14Q429 79 465 168L492 228Q494 232 504 254T516 283T527 310T539 340T548 368T556 399T560 428T562 460Q562 531 510 585T361 639Q263 639 211 585T159 460Q159 422 170 378T192 309T229 228L256 168Q292 79 296 14V0H44V86H125Q146 86 168 86T193 85L206 86Q206 103 183 148T131 241T79 352T55 462",8211:"0 236V312H499V236H0",8212:"0 236V312H999V236H0",8213:"0 236V312H999V236H0",8215:"0 -114V-38H499V-114H0",8216:"90 568L140 694H189L174 633Q159 572 158 571Q158 569 173 569H188V471H90V568",8217:"90 596V694H188V597L139 471H89L104 532Q119 593 120 594Q120 596 105 596H90",8220:"174 568L224 694H273L258 633Q243 572 242 571Q242 569 257 569H272V471H174V568ZM368 568L418 694H467L452 633Q437 572 436 571Q436 569 451 569H466V471H368V568",8221:"33 596V694H131V597L82 471H32L47 532Q62 593 63 594Q63 596 48 596H33ZM227 596V694H325V597L276 471H226L241 532Q256 593 257 594Q257 596 242 596H227",8260:"423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750",8710:"203 348L362 694H470L629 348Q789 2 790 1Q790 0 416 0T42 1Q43 2 203 348ZM630 98Q630 100 584 198T481 422T407 603L405 610L403 600Q388 544 191 122L180 99L405 98H630"},{})},3377:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.scriptBold=void 0;var H=L(6466);Object.defineProperty(T,"scriptBold",{enumerable:!0,get:function(){return H.scriptBold}})},8318:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.script=void 0;var H=L(3776);Object.defineProperty(T,"script",{enumerable:!0,get:function(){return H.script}})},2226:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.smallop=void 0;var H=L(9403),V=L(7405);T.smallop=(0,H.AddPaths)(V.smallop,{40:"152 251Q152 646 388 850H416Q422 844 422 841Q422 837 403 816T357 753T302 649T255 482T236 250Q236 124 255 19T301 -147T356 -251T403 -315T422 -340Q422 -343 416 -349H388Q359 -325 332 -296T271 -213T212 -97T170 56T152 251",41:"305 251Q305 -145 69 -349H56Q43 -349 39 -347T35 -338Q37 -333 60 -307T108 -239T160 -136T204 27T221 250T204 473T160 636T108 740T60 807T35 839Q35 850 50 850H56H69Q197 743 256 566Q305 425 305 251",47:"481 838Q489 850 500 850Q508 850 515 844T522 827Q521 824 311 248T96 -337Q90 -349 77 -349Q68 -349 62 -343T55 -326Q56 -323 266 253T481 838",91:"202 -349V850H394V810H242V-309H394V-349H202",92:"522 -326Q522 -337 515 -343T500 -349Q487 -349 481 -337Q477 -328 267 248T55 827Q54 835 60 842T76 850Q89 850 96 838Q100 829 310 253T522 -326",93:"22 810V850H214V-349H22V-309H174V810H22",123:"477 -343L471 -349H458Q432 -349 367 -325T273 -263Q258 -245 250 -212L249 -51Q249 -27 249 12Q248 118 244 128Q243 129 243 130Q220 189 121 228Q109 232 107 235T105 250Q105 256 105 257T105 261T107 265T111 268T118 272T128 276T142 283T162 291Q224 324 243 371Q243 372 244 373Q248 384 249 469Q249 475 249 489Q249 528 249 552L250 714Q253 728 256 736T271 761T299 789T347 816T422 843Q440 849 441 849H443Q445 849 447 849T452 850T457 850H471L477 844V830Q477 820 476 817T470 811T459 807T437 801T404 785Q353 760 338 724Q333 710 333 550Q333 526 333 492T334 447Q334 393 327 368T295 318Q257 280 181 255L169 251L184 245Q318 198 332 112Q333 106 333 -49Q333 -209 338 -223Q351 -255 391 -277T469 -309Q477 -311 477 -329V-343",125:"110 849L115 850Q120 850 125 850Q151 850 215 826T309 764Q324 747 332 714L333 552Q333 528 333 489Q334 383 338 373Q339 372 339 371Q353 336 391 310T469 271Q477 268 477 251Q477 241 476 237T472 232T456 225T428 214Q357 179 339 130Q339 129 338 128Q334 117 333 32Q333 26 333 12Q333 -27 333 -51L332 -212Q328 -228 323 -240T302 -271T255 -307T175 -338Q139 -349 125 -349T108 -346T105 -329Q105 -314 107 -312T130 -304Q233 -271 248 -209Q249 -203 249 -49V57Q249 106 253 125T273 167Q307 213 398 245L413 251L401 255Q265 300 250 389Q249 395 249 550Q249 710 244 724Q224 774 112 811Q105 813 105 830Q105 845 110 849",710:"279 669Q273 669 142 610T9 551L0 569Q-8 585 -8 587Q-8 588 -7 588L12 598Q30 608 66 628T136 666L277 744L564 587L555 569Q549 556 547 554T544 552Q539 555 410 612T279 669",732:"374 597Q337 597 269 627T160 658Q101 658 34 606L24 597L12 611Q1 624 1 626Q1 627 27 648T55 671Q120 722 182 722Q219 722 286 692T395 661Q454 661 521 713L531 722L543 708Q554 695 554 693Q554 692 528 671T500 648Q434 597 374 597",770:"-277 669Q-283 669 -414 610T-547 551L-556 569Q-564 585 -564 587Q-564 588 -563 588L-544 598Q-526 608 -490 628T-420 666L-279 744L8 587L-1 569Q-7 556 -9 554T-12 552Q-17 555 -146 612T-277 669",771:"-182 597Q-219 597 -287 627T-396 658Q-455 658 -522 606L-532 597L-544 611Q-555 624 -555 626Q-555 627 -529 648T-501 671Q-436 722 -374 722Q-337 722 -270 692T-161 661Q-102 661 -35 713L-25 722L-13 708Q-2 695 -2 693Q-2 692 -28 671T-56 648Q-122 597 -182 597",8214:"257 0V602H300V0H257ZM478 0V602H521V0H478",8260:"481 838Q489 850 500 850Q508 850 515 844T522 827Q521 824 311 248T96 -337Q90 -349 77 -349Q68 -349 62 -343T55 -326Q56 -323 266 253T481 838",8593:"112 421L120 424Q127 427 136 430T161 441T191 458T224 481T260 510T295 546T328 591L333 600L340 589Q380 527 431 489T555 421V377L543 381Q445 418 368 492L355 504V0H312V504L299 492Q222 418 124 381L112 377V421",8595:"312 96V600H355V96L368 108Q445 182 543 219L555 223V179L546 176Q538 173 529 169T505 158T475 141T442 119T407 90T372 53T339 9L334 0L327 11Q287 73 236 111T112 179V223L124 219Q222 182 299 108L312 96",8657:"142 329Q300 419 389 599Q389 598 399 579T420 541T452 494T497 438T558 383T636 329T708 294L721 289V246Q718 246 694 256T623 293T532 356L522 364L521 182V0H478V405L466 417Q436 450 389 516Q388 515 378 500T352 463T312 417L300 405V0H257V364L247 356Q202 320 155 293T82 256L57 246V289L70 294Q101 305 142 329",8659:"257 236V600H300V195L312 183Q342 150 389 84Q390 85 400 100T426 137T466 183L478 195V600H521V418L522 236L532 244Q576 280 623 307T696 344L721 354V311L708 306Q677 295 636 271Q478 181 389 1Q389 2 379 21T358 59T326 106T281 162T220 217T142 271T70 306L57 311V354Q60 354 83 345T154 308T247 244L257 236",8719:"158 656Q147 684 131 694Q110 707 69 710H55V750H888V710H874Q840 708 820 698T795 678T786 656V-155Q798 -206 874 -210H888V-250H570V-210H584Q618 -208 638 -197T663 -178T673 -155V710H270V277L271 -155Q283 -206 359 -210H373V-250H55V-210H69Q103 -208 123 -197T148 -178T158 -155V656",8720:"158 656Q147 684 131 694Q110 707 69 710H55V750H373V710H359Q325 708 305 698T280 678T271 656L270 223V-210H673V656Q666 672 663 679T639 697T584 710H570V750H888V710H874Q840 708 820 698T795 678T786 656V-155Q798 -206 874 -210H888V-250H55V-210H69Q103 -208 123 -197T148 -178T158 -155V656",8721:"61 748Q64 750 489 750H913L954 640Q965 609 976 579T993 533T999 516H979L959 517Q936 579 886 621T777 682Q724 700 655 705T436 710H319Q183 710 183 709Q186 706 348 484T511 259Q517 250 513 244L490 216Q466 188 420 134T330 27L149 -187Q149 -188 362 -188Q388 -188 436 -188T506 -189Q679 -189 778 -162T936 -43Q946 -27 959 6H999L913 -249L489 -250Q65 -250 62 -248Q56 -246 56 -239Q56 -234 118 -161Q186 -81 245 -11L428 206Q428 207 242 462L57 717L56 728Q56 744 61 748",8730:"263 249Q264 249 315 130T417 -108T470 -228L725 302Q981 837 982 839Q989 850 1001 850Q1008 850 1013 844T1020 832V826L741 243Q645 43 540 -176Q479 -303 469 -324T453 -348Q449 -350 436 -350L424 -349L315 -96Q206 156 205 156L171 130Q138 104 137 104L111 130L263 249",8739:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612",8741:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612ZM368 612Q373 627 388 627Q404 627 409 612Q410 610 410 306T409 0Q406 -15 389 -15Q371 -15 368 0V10Q368 19 368 35T368 73T368 122T367 179T367 241T367 306T367 370T367 433T367 489T368 538T368 576T368 602V612",8747:"113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244",8748:"113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244ZM460 -244Q460 -246 466 -251T486 -263T514 -269Q532 -269 546 -260Q567 -247 579 -218T598 -133T609 -15T623 155T644 367Q647 390 652 438T661 512T672 580T687 647T708 703T737 751T775 784T826 804Q828 804 835 804T848 805Q899 802 928 769T957 695Q957 669 941 657T908 645Q889 645 874 658T859 694Q859 705 863 714T873 729T885 737T895 742L899 743Q899 745 892 751T872 762T845 768Q822 768 807 756T781 716T765 652T754 559T745 444T734 300T716 133Q696 -38 684 -102T650 -207Q603 -306 516 -306Q466 -306 434 -272T402 -196Q402 -170 418 -158T451 -146Q470 -146 485 -159T500 -195Q500 -206 496 -215T486 -230T474 -238T464 -242L460 -244",8749:"113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244ZM460 -244Q460 -246 466 -251T486 -263T514 -269Q532 -269 546 -260Q567 -247 579 -218T598 -133T609 -15T623 155T644 367Q647 390 652 438T661 512T672 580T687 647T708 703T737 751T775 784T826 804Q828 804 835 804T848 805Q899 802 928 769T957 695Q957 669 941 657T908 645Q889 645 874 658T859 694Q859 705 863 714T873 729T885 737T895 742L899 743Q899 745 892 751T872 762T845 768Q822 768 807 756T781 716T765 652T754 559T745 444T734 300T716 133Q696 -38 684 -102T650 -207Q603 -306 516 -306Q466 -306 434 -272T402 -196Q402 -170 418 -158T451 -146Q470 -146 485 -159T500 -195Q500 -206 496 -215T486 -230T474 -238T464 -242L460 -244ZM807 -244Q807 -246 813 -251T833 -263T861 -269Q880 -269 893 -260Q914 -247 926 -218T945 -133T956 -15T970 155T991 367Q994 390 999 438T1008 512T1019 580T1034 647T1055 703T1084 751T1122 784T1173 804Q1175 804 1182 804T1195 805Q1246 802 1275 769T1304 695Q1304 669 1288 657T1255 645Q1236 645 1221 658T1206 694Q1206 705 1210 714T1220 729T1232 737T1242 742L1246 743Q1246 745 1239 751T1219 762T1192 768Q1169 768 1154 756T1128 716T1112 652T1101 559T1092 444T1081 300T1063 133Q1043 -38 1031 -102T997 -207Q950 -306 863 -306Q813 -306 781 -272T749 -196Q749 -170 765 -158T798 -146Q817 -146 832 -159T847 -195Q847 -206 843 -215T833 -230T821 -238T811 -242L807 -244",8750:"269 74L256 80Q244 85 227 97T191 128T161 179T148 250Q148 332 199 379T302 433L306 434L307 444Q309 456 313 495T321 553T331 607T345 664T365 712T393 756T431 785T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q471 768 454 752T427 693T414 626T406 536Q405 530 405 527L397 425L404 422Q410 419 421 413T445 399T470 376T494 345T511 303T518 250Q518 205 502 169T460 112T410 80T364 66L360 65L359 55Q357 38 353 4T346 -43T340 -81T333 -118T326 -148T316 -179T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q231 -241 242 -183T266 33L269 74ZM272 122Q272 156 300 391Q300 392 299 392Q287 392 263 379T213 331T187 249Q187 211 205 180T239 137T272 116V122ZM366 107Q378 107 402 119T453 167T479 249Q479 340 394 383V377Q394 375 394 374T393 371T393 366T392 357T391 342T389 321T386 291T382 251T377 199T369 133Q366 112 366 107",8896:"119 -249T97 -249T65 -235T55 -207Q55 -201 56 -198Q58 -190 218 268T380 729Q392 750 416 750Q438 750 451 732Q453 728 534 498T695 36L775 -194Q777 -204 777 -208Q777 -222 767 -235T735 -249Q713 -249 700 -231Q696 -225 557 177L416 579L276 177Q136 -226 132 -231Q119 -249 97 -249",8897:"55 708Q55 729 68 739T96 750Q119 750 132 731Q136 726 276 323L416 -79L557 323Q696 725 700 731Q713 749 735 749Q756 749 766 736T777 708Q777 700 696 466T533 1T451 -232Q436 -249 416 -249Q402 -249 391 -241Q384 -236 380 -226Q368 -198 219 230Q55 697 55 708",8898:"139 -217Q127 -241 114 -246Q106 -249 97 -249Q67 -249 57 -220Q55 -214 55 102Q55 152 55 221T54 312Q54 422 60 464T91 554Q120 612 165 654T257 714T337 741T392 749Q393 750 402 750Q414 750 422 749Q557 749 660 659T776 430Q777 422 777 102Q777 -214 775 -220Q765 -249 735 -249Q716 -249 708 -241T694 -217L692 428L690 441Q674 540 597 603T416 666H409Q388 666 364 662T294 638T212 581Q156 523 142 441L140 428L139 105V-217",8899:"96 750Q103 750 109 748T120 744T127 737T133 730T137 723T139 718V395L140 73L142 60Q159 -43 237 -104T416 -166Q521 -166 597 -103T690 60L692 73L694 718Q708 749 735 749Q765 749 775 720Q777 714 777 398Q777 78 776 71Q766 -51 680 -140Q571 -249 416 -249H411Q261 -249 152 -140Q66 -51 56 71Q55 78 55 398Q55 714 57 720Q60 734 70 740Q80 750 96 750",8968:"202 -349V850H449V810H242V-349H202",8969:"22 810V850H269V-349H229V810H22",8970:"202 -349V850H242V-309H449V-349H202",8971:"229 -309V850H269V-349H22V-309H229",9001:"373 850Q392 850 394 832Q394 825 267 538L139 250L267 -38Q394 -325 394 -332Q392 -350 375 -350Q361 -350 356 -338Q354 -331 289 -186T161 103T97 250T160 397T289 685T356 838Q362 850 373 850",9002:"77 832Q77 837 82 843T98 850Q110 849 115 838Q117 831 182 686T310 397T374 250T311 103T182 -185T115 -338Q110 -350 96 -350Q79 -350 77 -332Q77 -325 204 -38L332 250L204 538Q77 825 77 832",9168:"312 0V602H355V0H312",10072:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612",10216:"373 850Q392 850 394 832Q394 825 267 538L139 250L267 -38Q394 -325 394 -332Q392 -350 375 -350Q361 -350 356 -338Q354 -331 289 -186T161 103T97 250T160 397T289 685T356 838Q362 850 373 850",10217:"77 832Q77 837 82 843T98 850Q110 849 115 838Q117 831 182 686T310 397T374 250T311 103T182 -185T115 -338Q110 -350 96 -350Q79 -350 77 -332Q77 -325 204 -38L332 250L204 538Q77 825 77 832",10752:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM555 -165Q672 -165 767 -108T916 44T970 250Q970 418 861 532T600 664Q591 665 548 665Q446 665 353 614T200 466T140 250V243Q140 88 248 -30Q262 -46 280 -62T338 -105T434 -148T555 -165ZM478 250Q478 288 503 307T551 326Q586 326 609 305T632 250Q632 217 610 196T555 174T500 196T478 250",10753:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM513 478Q513 664 512 664Q504 664 481 660T406 637T313 588Q281 564 255 537T211 483T181 431T161 382T150 342T144 310T141 292H513V478ZM798 588Q758 616 711 634T639 658T602 663L597 664V292H969Q969 293 967 309T960 341T949 381T930 430T900 482T856 537T798 588ZM513 -164V208H141Q142 205 144 189T149 160T158 125T173 83T196 39T229 -9Q249 -34 273 -55T318 -92T363 -119T405 -138T444 -150T475 -158T499 -162T513 -164ZM775 -103Q801 -87 823 -68T863 -30T894 10T919 49T937 88T950 123T959 154T964 180T968 198L969 208H597V-164Q599 -163 616 -161T647 -155T683 -145T728 -128T775 -103",10754:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM600 664Q591 665 548 665Q414 665 306 583L292 573L423 441L555 310L687 441L818 573L804 583Q714 650 600 664ZM364 118L495 250L364 382L232 513L223 500Q140 391 140 250Q140 107 223 0L232 -13L364 118ZM970 250Q970 389 887 501L878 512Q878 513 861 496T812 447T746 381L615 250L746 118L878 -13L887 0Q970 109 970 250ZM687 59L555 190L423 59L292 -73L306 -83Q416 -166 555 -166T804 -83L818 -73L687 59",10756:"96 750Q103 750 109 748T120 744T127 737T133 730T137 723T139 718V395L140 73L142 60Q159 -43 237 -104T416 -166Q521 -166 597 -103T690 60L692 73L694 718Q708 749 735 749Q765 749 775 720Q777 714 777 398Q777 78 776 71Q766 -51 680 -140Q571 -249 416 -249H411Q261 -249 152 -140Q66 -51 56 71Q55 78 55 398Q55 714 57 720Q60 734 70 740Q80 750 96 750ZM223 276Q223 282 224 287T227 296T232 302T238 308T243 313T250 316L254 319H374V376V406Q374 438 382 454T418 470Q443 467 450 453T458 410V376V319H579Q580 319 583 317T589 313T594 308T600 302T604 295T608 287T609 276Q609 253 587 241Q577 235 513 235H458V178Q458 176 458 166T459 148Q459 84 415 84Q401 84 390 93T375 117Q374 120 374 178V235H319Q317 235 307 235T290 234Q223 234 223 276",10758:"777 -217Q766 -244 745 -249H88Q64 -242 57 -220Q55 -214 55 250T57 720Q60 734 70 740Q80 750 96 750Q127 750 137 720Q139 714 139 274V-166H693V274Q693 714 695 720Q705 749 735 749Q766 749 775 719Q777 713 777 248V-217",12296:"373 850Q392 850 394 832Q394 825 267 538L139 250L267 -38Q394 -325 394 -332Q392 -350 375 -350Q361 -350 356 -338Q354 -331 289 -186T161 103T97 250T160 397T289 685T356 838Q362 850 373 850",12297:"77 832Q77 837 82 843T98 850Q110 849 115 838Q117 831 182 686T310 397T374 250T311 103T182 -185T115 -338Q110 -350 96 -350Q79 -350 77 -332Q77 -325 204 -38L332 250L204 538Q77 825 77 832"},{10764:"\u222c\u222c"})},6385:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.texCalligraphicBold=void 0;var H=L(9403),V=L(8105);T.texCalligraphicBold=(0,H.AddPaths)(V.texCalligraphicBold,{65:"761 751Q784 751 784 728V711Q784 570 795 417T820 191Q844 76 865 76Q868 76 902 93T962 112H973Q989 104 989 94Q989 92 987 86Q978 47 846 -11Q812 -25 779 -26Q722 -26 708 9Q688 47 669 161H524L379 162L359 136Q286 43 234 -3T142 -49T71 -19T39 55Q39 92 60 131T103 174Q113 174 117 167T124 149T136 128T166 110Q183 105 190 105Q230 105 341 246Q401 322 453 397T531 514T582 601T611 651H640V663Q640 692 676 718T745 750Q747 750 752 750T761 751ZM658 266Q653 312 649 377T644 489T641 541V556L557 415Q500 325 448 253Q467 261 524 261H568H658V266",66:"441 83Q571 83 571 195Q571 246 538 279T466 322T386 333Q378 333 357 330T329 327Q307 327 307 345Q307 354 313 365T347 396T419 430Q546 472 581 498Q594 508 594 535Q594 574 567 589T508 604Q469 604 442 583Q390 546 342 457T265 256Q237 148 186 60Q167 29 144 13Q105 -15 68 -17H65Q40 -17 40 1Q40 7 53 29T87 100T124 210Q162 373 190 575Q188 575 174 567T138 550T98 542Q75 542 75 560Q75 588 123 618Q135 625 203 659T281 696Q299 703 316 703Q339 703 339 685Q339 656 328 583L333 588Q338 592 346 599T367 615T394 634T428 654T467 674T511 690T559 701T611 705Q651 704 681 689Q739 659 739 598Q739 507 595 427L584 421Q585 420 595 416T610 410T626 402T644 392T660 380T677 365T691 347T703 325T710 299T715 268Q717 193 665 130Q622 73 531 28T348 -17Q275 -17 225 10Q206 19 200 24T193 36Q193 57 231 86T311 119H322Q386 83 441 83",67:"243 -20Q135 -20 78 48T20 218Q20 280 39 344T98 470T193 580T324 661T488 702H490Q491 702 493 702T498 703T507 703T518 702H526Q599 702 599 631Q599 597 577 550T541 486Q523 463 490 447T431 430Q423 430 419 433Q409 437 409 450Q410 456 432 499T454 567Q454 586 446 594T415 603Q316 603 254 532Q216 487 190 421T164 284Q164 228 181 186T226 122T282 90T340 80Q377 80 405 96T449 131T492 167T553 187H555Q580 187 580 168Q580 153 551 123T476 60T367 4T243 -20",68:"107 0Q92 5 92 18Q92 33 113 53T160 86Q170 91 182 94T197 100L206 120Q248 226 273 337T304 501T309 585Q278 585 234 577T179 557Q172 550 166 532T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q281 686 447 686H480H517Q692 686 784 631Q885 571 885 450Q885 339 805 239T586 75T286 1Q276 0 187 0H107ZM741 391Q741 424 731 452T694 510T613 558T481 584Q476 584 468 584T457 585L449 586V579Q441 501 425 424T391 292T357 193T330 125T319 100H324Q511 100 628 175Q688 215 714 275T741 391",69:"495 516Q485 516 478 520T470 532Q470 537 476 550T482 570Q482 589 465 596T401 603Q344 603 319 582Q295 558 295 519Q295 493 312 474T355 445T407 432T455 427Q477 427 477 409Q477 395 453 371T389 333Q380 330 345 327T279 312T223 272Q181 223 181 176Q181 131 225 107T324 83Q366 83 395 98T448 136T487 167Q517 185 547 187H551Q574 187 574 170Q574 151 535 113T421 36T271 -15Q260 -16 226 -16Q181 -16 152 -9Q104 4 71 33T37 111Q37 140 50 176T106 263T216 356Q215 357 207 362T190 374T172 392T156 419T150 456Q150 521 208 580T341 670T474 702Q475 703 499 703Q528 703 547 701T586 693T615 673T627 637Q627 584 581 550T495 516",70:"812 567Q804 567 795 570T786 579Q786 586 647 586H559L558 582Q558 575 539 510T506 407L498 384H775Q788 378 790 368Q790 328 746 298T665 268Q646 268 642 284H457L447 261Q396 150 360 94Q329 46 270 8T149 -30Q123 -30 100 -24T63 -10T37 9T22 26T17 36Q17 59 56 88T135 119Q145 119 149 117T165 104Q187 78 227 72Q232 72 234 76Q245 93 273 145T350 323T424 570L428 586H276Q265 575 239 563T190 551Q180 551 174 556T167 569Q167 580 179 597T213 634T278 668T371 685Q374 686 624 686Q863 685 888 682Q917 678 927 663Q930 658 930 650Q930 624 888 596T812 567",71:"50 279Q50 361 88 438T190 570T335 661T503 702H514Q524 703 532 703Q671 703 671 626Q671 580 614 514T495 447Q472 447 472 465Q472 477 499 511T527 562Q527 582 507 592T433 602Q351 602 302 569Q252 535 223 469T194 344Q194 266 237 217T352 168Q401 168 442 205T505 316Q515 345 551 368T622 393H625Q649 393 649 376Q649 371 635 318T612 237Q580 129 540 62T442 -49Q353 -114 264 -114Q259 -114 252 -114L246 -113Q190 -113 142 -107T81 -96Q71 -90 71 -81Q71 -57 110 -30T187 2Q196 2 236 -4T338 -14Q371 -14 377 -9Q410 24 446 113L451 127Q353 68 253 68Q157 68 104 129T50 279",72:"42 447Q20 447 20 465Q20 481 47 515T119 589T239 657T392 686Q443 686 463 664T484 616Q484 570 473 506T452 401L441 360Q441 359 550 359H660L663 370Q684 435 716 522T758 624Q771 646 806 666T870 686Q894 686 894 668Q894 667 867 597T804 416T752 218Q737 135 737 93Q737 77 746 65T778 53Q799 53 803 54T814 63Q831 86 864 103T924 120Q946 120 946 100Q945 85 931 63T888 16T806 -27T684 -48H681Q625 -48 603 -10Q593 4 593 29Q593 71 603 131T624 230L634 269Q632 269 624 266Q610 261 600 261T507 259H411L399 222Q344 62 322 21Q301 -7 268 -24T209 -41H207Q187 -41 185 -25Q185 -17 192 2T220 71T261 184Q284 256 284 258Q284 259 227 259H170Q169 259 166 261T162 264T158 266T156 271T155 277Q155 296 184 320T250 356Q259 358 286 359Q312 359 312 360Q314 372 318 385Q332 450 339 526Q339 530 339 535T340 543Q340 586 296 586Q255 586 227 576T188 553T165 523T146 497Q127 476 97 462T42 447",73:"56 499Q32 499 32 516Q32 540 64 580T165 649Q241 682 365 685Q366 685 376 685T405 685T445 686T496 686T553 686H732Q746 677 746 668Q746 646 711 620T642 587L572 586H503Q479 546 458 479T424 352T383 224T318 111L309 101L412 100H514L523 109Q567 150 618 153Q644 153 644 135Q644 132 642 124Q629 86 581 52T476 6Q454 2 433 2T216 0Q-11 0 -15 2Q-27 6 -27 18Q-27 37 2 61T59 93Q77 100 142 100H198Q255 177 299 369Q337 513 382 574L391 586H348Q261 586 176 576Q163 543 124 521T56 499",74:"286 390Q263 390 263 407Q263 432 293 481T367 566Q511 687 724 687Q738 687 761 687T793 686H923Q937 677 937 668Q937 648 905 623T842 589Q829 587 817 586T802 585T795 583T788 578Q709 506 632 189Q622 153 615 134T588 81T537 17Q482 -39 404 -76T247 -114Q192 -114 158 -100Q53 -61 53 32Q53 59 58 73T79 102Q126 147 177 147Q200 147 200 128Q200 123 198 112T196 96Q196 47 238 17T345 -13Q362 -13 377 -9T404 0T426 16T444 34T459 55T470 76T478 97T483 116T488 132L490 141Q511 222 520 257T554 364T608 486T675 576L685 586H634H612Q532 586 484 564Q453 549 436 526T409 478T395 447Q378 424 345 407T286 390",75:"98 542Q75 542 75 560Q75 588 123 618Q132 624 199 657T275 694Q291 703 315 703Q327 703 332 699T338 690T339 670Q339 596 323 505T283 337T237 194T198 90L181 53Q170 31 136 8T68 -17H65Q40 -17 40 0L76 92Q112 185 150 322T194 564V578L168 565Q125 542 98 542ZM834 142Q834 125 819 100T774 48T692 3T576 -16H560Q540 -16 508 6Q469 33 422 108T342 267T309 398Q309 411 310 417T320 442T347 482Q401 542 517 615T710 702Q712 702 721 702T735 703Q772 703 791 690Q819 674 819 646T792 597T733 574H722Q704 584 704 599Q706 607 700 610T672 617L660 613Q609 595 524 538T423 450V440Q423 376 488 247T604 83Q621 70 640 70Q677 70 701 82Q713 87 718 101T737 132T783 160Q792 163 807 163Q834 163 834 142",76:"63 -17Q41 -17 41 0Q41 22 85 54Q101 68 113 92T133 141T154 219T182 315Q230 462 306 553Q345 599 391 632T478 678T543 697T582 703Q584 703 589 703T598 702Q643 702 666 676T689 613Q689 588 683 575Q674 551 632 524T552 496Q530 496 530 512Q530 517 531 525T533 538Q533 559 522 577T480 596H476Q462 596 451 588T415 544Q350 447 310 281Q284 181 261 136L255 124H285Q342 123 441 107T583 90L596 89Q603 116 647 144T729 173Q751 173 751 157Q751 118 685 60T523 -15Q514 -16 479 -16Q421 -16 320 0T171 18H155L142 10Q98 -17 63 -17",77:"38 20Q38 59 60 99T104 139Q106 139 126 125T176 106H181Q200 106 221 139T286 281Q322 370 342 451T368 581T376 634Q384 657 420 680T487 703Q502 703 507 696T522 649Q538 589 554 537Q579 453 609 372T660 248T686 202Q687 201 739 244T830 322L1166 642Q1225 700 1230 701Q1230 701 1237 703Q1258 703 1258 667L1253 637Q1248 607 1241 558T1227 451T1214 326T1209 202Q1209 77 1232 77Q1237 77 1269 94T1326 112H1329Q1353 112 1353 94Q1353 81 1334 60Q1311 37 1248 7T1150 -24H1141H1135Q1085 -24 1074 26Q1064 75 1064 134Q1064 239 1086 426Q1087 430 1087 434L1061 410Q871 227 783 149L694 76Q653 44 647 40T631 34Q620 34 616 37T594 63Q546 125 514 198Q467 307 423 449L418 466L412 444Q376 310 306 153Q278 88 251 45T201 -18T163 -43T131 -49Q102 -48 70 -31T38 20",78:"47 139Q81 105 122 105Q137 105 147 117Q159 134 182 199T234 381T274 610Q275 634 284 647Q297 666 327 684T389 703Q403 703 408 695T428 645Q480 490 567 298Q628 163 673 103Q674 102 674 102T675 106Q732 331 803 551Q842 674 875 725Q908 775 966 807T1081 840H1084Q1105 840 1105 803Q1105 768 1088 733T1051 689Q1045 686 1032 686Q986 683 948 663T901 624Q881 579 837 430T760 154L726 28Q725 28 725 28T723 25Q716 0 682 -24T611 -48Q600 -48 595 -45T576 -23Q522 44 480 124Q417 243 332 463L328 473L325 457Q291 293 227 124Q159 -49 72 -49Q38 -49 5 -28Q-24 -8 -24 21Q-24 58 -3 98T41 139H47",79:"433 703Q456 703 456 685Q456 672 441 655T407 627Q402 623 378 611T328 579T276 524Q207 434 207 324Q207 222 270 153T441 84Q566 84 651 177T737 400V405Q737 496 693 549T576 603Q542 603 510 560Q490 537 472 502T442 454Q397 412 346 409Q320 409 320 427Q320 430 322 436Q331 465 360 507T433 594T542 671T677 703Q776 703 829 636T882 468Q882 369 831 277T702 122T528 21T343 -17Q214 -17 139 61T63 257Q63 336 94 409T173 534T272 625T367 684T432 703H433",80:"170 -67Q147 -67 147 -49Q147 -42 162 -8T204 99T253 254Q274 332 288 415T305 542L308 585Q277 585 234 577T179 557Q172 550 166 532T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q279 686 448 686H495H537Q622 686 678 677T784 637Q846 598 846 533Q846 452 776 375T597 252T378 206H366L358 181Q341 130 316 68T282 -7Q262 -33 230 -50T170 -67ZM701 468Q701 512 661 540T570 577T461 586H448V582Q446 576 443 545T428 447T395 301L389 280Q390 280 398 284T419 295T441 303Q443 304 484 306T572 321T651 359Q701 402 701 468",81:"874 453Q874 372 836 298T750 177T638 89T543 33T486 8L483 7Q485 5 523 -7T622 -32T726 -46Q741 -46 746 -45T755 -41T762 -27Q770 -1 806 23T878 50H890Q905 42 905 33Q905 -8 838 -68T670 -145Q662 -146 628 -146Q538 -146 389 -100T164 -50Q132 -50 132 -32T162 11T227 47Q231 48 286 51T394 62T518 100T641 180Q730 271 730 387Q730 478 673 540T520 602Q410 602 337 525T264 355Q264 284 310 244T420 203Q476 203 568 222Q594 222 594 204Q594 184 565 161T508 128Q433 103 316 103Q227 103 174 157T120 290Q120 382 182 471T343 620T548 697Q578 703 601 703Q604 703 611 703T623 702Q663 702 687 696Q760 679 817 618T874 453",82:"159 0Q159 5 172 34T205 114T245 229T284 386T309 575V585H304Q303 585 295 585T282 584Q233 579 207 570T175 553T165 531T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q279 686 448 686H505H582Q683 686 745 672T834 611Q842 594 842 565Q842 523 824 484T780 419T722 370T669 336T632 318L619 312L626 302Q640 279 667 227T696 172Q717 133 735 112T762 88T784 84Q824 84 872 118T957 153Q981 153 981 136Q981 114 937 78T820 13T684 -17Q646 -17 616 8T569 66T526 151T477 234Q461 256 446 265Q437 272 421 274Q400 274 400 291Q400 311 430 336T495 371Q496 371 543 374T627 392T681 436Q699 467 699 503Q699 550 644 568T471 586H449V582Q449 581 447 559T438 499T422 413T393 298T348 165Q313 73 296 45Q282 24 249 4T185 -17Q159 -17 159 0",83:"204 476Q204 525 248 577T372 666T539 703T674 683T721 612Q721 588 714 569Q704 547 669 524T601 499Q573 499 573 516Q573 521 575 527T577 543Q577 563 568 574T548 588L539 590Q490 603 444 603Q418 603 394 597T364 583Q348 567 348 533Q348 493 382 466T459 425T555 387T633 330Q662 292 662 249Q662 153 544 69T257 -16Q218 -16 208 -15Q118 1 64 46Q25 76 25 126Q25 185 82 235T203 290H207Q229 290 231 274Q231 243 180 213Q173 209 172 206T170 189T171 170T183 150T216 121Q273 83 356 83Q412 83 459 100Q493 111 507 141Q518 165 518 185Q518 208 506 228T478 262T437 288T398 306T360 320Q316 335 285 352T239 384T215 416T205 443T204 467V476",84:"61 462H59Q38 462 38 479Q38 528 109 594T289 683L304 685L837 687L846 693Q889 720 923 720Q947 720 947 702Q945 671 892 631T776 583Q774 583 772 583T769 582T766 582L764 581H758Q753 581 744 581T722 580T693 580T662 580H563L514 385Q507 355 493 299T475 225T460 172T443 119T426 76T402 24Q386 -11 355 -33T304 -61T266 -69Q242 -69 242 -50Q243 -45 253 -25T278 32T307 115L364 340Q405 511 413 538T436 580H207Q202 572 200 568T197 561T195 552T190 537Q176 511 135 487T61 462",85:"124 586Q107 586 74 569T15 552H13Q-10 552 -10 570Q-10 605 70 645T222 686Q283 686 283 631Q283 590 246 504T172 326T135 181Q135 130 157 107T205 83Q221 83 259 106Q347 165 453 301T604 548Q607 557 612 569T619 587T624 600T628 612T632 621T637 628T641 634T647 640T654 645T662 652Q706 686 748 686Q771 686 771 669Q771 656 754 614T700 467T630 229Q615 168 610 105Q610 88 617 78L641 90Q681 111 706 112Q733 112 733 95Q733 82 714 60Q694 40 633 10Q567 -23 532 -24Q507 -24 495 -17Q466 -4 466 32Q466 96 500 225Q277 -17 102 -17Q56 -17 23 17T-10 118Q-10 164 13 234T64 363T115 481T139 567Q139 586 124 586",86:"25 608Q25 628 60 657T148 686Q184 683 213 671T273 625T327 538T363 394T380 184L381 134L399 148Q503 226 574 302T667 415T689 467Q688 474 684 482T672 502T645 521T600 532Q576 532 576 567Q576 604 597 644T641 685H649Q701 685 737 648T774 545Q774 457 703 333T461 66Q397 13 332 -32T255 -77Q237 -77 237 -30V-23Q241 20 241 109Q241 483 115 569Q91 586 50 589Q25 589 25 608",87:"25 607Q25 629 62 657T142 686Q205 686 248 647T312 541T339 411T347 275Q347 249 345 203V189Q375 219 449 316T587 516Q629 584 629 587Q629 589 626 597T622 607Q622 629 658 656T732 686H744Q755 680 757 678Q757 677 769 649T799 577T835 475T874 339T904 183Q908 157 910 151L925 169Q997 252 1059 343T1121 474Q1120 498 1103 513T1059 532Q1036 532 1036 568Q1036 600 1053 636T1090 683L1097 686H1109Q1147 684 1176 652T1206 551Q1206 460 1131 320T897 7Q859 -33 840 -52T816 -74T804 -77Q788 -77 784 -32Q783 -28 783 -26Q774 108 744 239T691 436T665 501Q664 501 649 475T602 400T528 289T420 146T280 -15Q243 -56 231 -66T210 -77Q191 -77 191 -40Q191 -38 195 -4T204 91T209 217Q209 290 202 351T177 469T126 557T45 589Q25 589 25 607",88:"762 562Q762 579 737 584T711 604Q711 630 753 658T834 686Q864 686 885 669T906 627Q906 580 834 522T614 379L584 362V357Q585 354 589 315T597 233T603 183Q610 132 627 116T671 100Q678 100 704 113T754 126T778 107Q776 79 733 45T626 2Q615 1 578 1Q542 1 535 3Q521 7 510 15T491 31T477 54T467 78T460 108T456 137T452 170T449 201Q447 220 445 240T442 270L441 281Q435 281 357 233Q240 165 206 135Q200 128 200 124Q200 113 208 108T226 101T244 96T252 82Q252 61 214 31T129 1H120Q97 1 77 16T56 60Q56 105 133 168T414 345Q428 352 431 354T433 359Q422 493 414 522Q407 551 395 566T373 583T350 586H341L332 580Q290 560 265 560Q243 560 243 577Q243 585 248 596T269 624T306 653T365 676T447 686H456Q472 686 484 683T514 671T543 637T562 576Q565 557 570 501L577 437Q577 436 613 457T694 506T756 551Q762 558 762 562",89:"73 555Q49 555 49 573Q49 602 110 644T239 686Q319 686 376 624Q416 584 444 511T483 361T499 240T503 173Q503 165 504 165Q506 165 524 184T556 218Q631 297 674 377T718 485Q718 505 699 526Q673 552 628 552Q619 552 613 562T607 590Q607 617 621 645T658 685Q661 686 671 686Q718 686 757 652T797 545Q797 476 749 369T602 146Q500 29 371 -67T176 -164Q112 -164 74 -120T36 -29Q36 5 55 36T95 67Q104 67 108 59T115 39T128 12T154 -12Q183 -30 216 -30Q239 -30 305 7L361 44L367 49V54Q367 95 364 143T351 273T312 429T243 546Q206 581 156 588L146 581Q108 555 73 555",90:"622 574Q522 579 420 579H396Q373 579 364 574T351 550Q339 516 297 490T218 462Q195 462 195 479Q195 487 197 492Q218 565 313 625T509 685Q564 685 650 683T755 680Q787 680 807 683T831 686Q853 686 853 669Q853 657 826 626Q742 532 641 437L619 415L622 414Q626 414 631 414T642 414Q697 411 697 388Q697 367 670 345T607 323Q605 323 592 325T546 329H522L490 302Q457 274 400 226T289 136L260 113L318 112Q345 111 452 109T587 106H627Q650 143 656 170Q666 197 710 225T788 253Q811 253 811 237Q811 211 781 160T710 77Q619 0 515 0Q507 0 497 0T484 1Q434 1 319 3T177 6Q123 6 95 2Q83 2 71 0H68Q46 0 46 17Q46 28 58 44Q68 56 100 80T210 165T383 307L408 329H361L314 330Q297 338 297 350Q297 368 320 388T368 413Q375 415 441 415H506L647 555L664 574H622",305:"24 296Q24 305 34 328T63 380T115 430T187 452Q205 452 223 448T262 435T295 406T308 360Q308 345 287 290T240 170T207 87Q202 67 202 57Q202 42 215 42Q235 42 257 64Q288 92 302 140Q307 156 310 159T330 162H336H347Q367 162 367 148Q367 140 357 117T329 65T276 14T201 -8Q158 -8 121 15T83 84Q83 104 133 229T184 358Q189 376 189 388Q189 402 177 402Q156 402 134 380Q103 352 89 304Q84 288 81 285T61 282H55H44Q24 282 24 296",567:"297 360T297 373T294 392T288 400T278 401H276Q237 398 200 363Q181 343 170 325T156 299T149 287T129 282H123H116Q102 282 97 284T92 298Q93 303 98 315T118 349T151 390T201 427T267 451H279Q357 451 388 422T420 354V339L370 138Q321 -60 317 -69Q287 -157 163 -194Q133 -201 99 -201Q39 -201 14 -178T-12 -125Q-12 -94 11 -69T68 -43Q93 -43 108 -57T123 -95Q123 -121 100 -151H104Q131 -151 155 -125T193 -60Q195 -54 244 141T294 345Q297 360 297 373"},{})},871:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.texCalligraphic=void 0;var H=L(9403),V=L(2518);T.texCalligraphic=(0,H.AddPaths)(V.texCalligraphic,{65:"576 668Q576 688 606 708T660 728Q676 728 675 712V571Q675 409 688 252Q696 122 720 57Q722 53 723 50T728 46T732 43T737 41T743 39L754 45Q788 61 803 61Q819 61 819 47Q818 43 814 35Q799 15 755 -7T675 -30Q659 -30 648 -25T630 -8T621 11T614 34Q603 77 599 106T594 146T591 160V163H460L329 164L316 145Q241 35 196 -7T119 -50T59 -24T30 43Q30 75 46 100T74 125Q81 125 83 120T88 104T96 84Q118 57 151 57Q189 57 277 182Q432 400 542 625L559 659H567Q574 659 575 660T576 668ZM584 249Q579 333 577 386T575 473T574 520V581L563 560Q497 426 412 290L372 228L370 224H371L383 228L393 232H586L584 249",66:"304 342Q292 342 292 353Q292 372 323 391Q331 396 417 428T533 487Q563 512 563 555V562Q563 575 557 589T530 618T475 636Q429 636 396 613T330 539Q263 446 210 238Q196 183 173 120Q135 31 121 16Q108 1 85 -10T47 -22T32 -10Q32 -5 44 18T77 93T112 206Q135 296 154 395T182 550T191 615Q191 616 190 616Q188 616 179 611T157 601T131 594Q113 594 113 605Q113 623 144 644Q154 650 205 676T267 703Q277 705 279 705Q295 705 295 693Q295 686 288 635T278 575Q278 572 287 582Q336 635 402 669T540 704Q603 704 633 673T664 599Q664 559 638 523T580 462Q553 440 504 413L491 407L504 402Q566 381 596 338T627 244Q627 172 575 110T444 13T284 -22Q208 -22 158 28Q144 42 146 50Q150 67 178 85T230 103Q236 103 246 95T267 75T302 56T357 47Q436 47 486 93Q526 136 526 198V210Q526 228 518 249T491 292T436 330T350 345Q335 345 321 344T304 342",67:"201 -25Q167 -25 136 -14T75 23T29 94T12 202Q12 290 50 394T161 574Q227 642 303 673T433 704Q435 705 457 705Q533 701 533 640Q533 606 507 548T464 474Q431 444 396 444Q381 444 381 453Q381 459 388 473T407 513T428 563Q433 580 433 594Q433 636 381 636Q314 636 260 594T175 489T128 363T112 247Q112 157 153 101T273 44Q347 44 398 121Q413 144 437 157T481 171Q496 171 496 160Q496 150 476 123Q426 56 350 16T201 -25",68:"37 475Q19 475 19 487Q19 536 103 604T327 682H356Q386 683 408 683H419Q475 683 506 681T582 668T667 633Q766 571 766 450Q766 365 723 287T611 152T455 57T279 6Q248 1 160 0Q148 0 131 0T108 -1Q72 -1 72 11Q72 24 90 40T133 64L144 68L152 88Q247 328 272 587Q275 613 272 613Q272 613 269 613Q225 610 195 602T149 579T129 556T119 532Q118 530 116 525T113 518Q102 502 80 490T37 475ZM665 407Q665 596 412 613Q403 614 383 614Q370 614 370 612Q370 598 363 542T323 357T242 103L228 69H265Q391 73 481 119Q536 148 575 188T633 268T658 338T665 392V407",69:"144 470Q144 556 240 630T451 705Q564 705 564 637Q564 611 540 573Q529 559 505 547T464 534Q448 534 448 545Q448 552 455 562Q463 577 463 591Q463 600 462 604T456 616T436 627T400 635Q396 635 390 635T380 636Q291 636 258 568Q245 544 245 516Q245 463 290 438T391 410Q415 410 415 398Q415 392 407 380T376 356T326 341Q288 340 260 327Q218 311 187 276T143 208T130 151Q130 113 156 88T211 55T268 47Q349 47 403 125Q415 144 439 157T483 171Q499 171 499 160Q499 148 475 120T413 59T315 3T197 -22Q124 -22 77 14T30 105Q30 126 39 154T66 216T122 288T209 354L223 362Q144 400 144 470",70:"199 579Q181 579 181 590Q181 598 188 611T212 639T260 666T335 682Q336 682 349 682T383 682T431 682T493 683T561 683Q776 682 784 681Q826 673 829 647Q829 620 797 600T744 580Q728 580 728 595Q729 607 713 610Q698 613 598 614H500L499 610Q499 598 467 486T428 367Q428 365 551 365H674Q683 360 684 355Q687 346 677 329Q666 312 642 299T598 285Q586 285 582 296H402L394 277Q386 258 373 229T346 167T315 102T286 51Q265 22 225 -5T133 -32Q108 -32 87 -25T54 -7T33 15T21 35T18 47Q18 60 44 80T98 103Q108 103 111 101T119 88Q130 66 150 54T179 39T195 37Q199 37 203 43Q217 67 245 125T318 300T391 532Q393 543 398 564T406 598T409 613T339 614H269Q229 579 199 579",71:"216 68Q155 68 115 100T59 177T44 273Q44 299 50 333T73 421T133 533T239 632Q346 704 466 704Q508 704 515 703Q555 696 577 681T599 635Q599 605 570 560T523 496Q490 466 455 466Q440 466 440 475T469 526T499 589Q499 605 489 617Q460 636 403 636Q343 636 295 611T220 548T174 464T150 382T144 318Q144 241 180 189T287 137Q325 137 359 160Q428 205 466 322Q472 342 501 359T551 376Q557 376 560 373T564 368L565 365Q560 341 551 302T512 173T451 31Q359 -119 204 -119Q163 -118 127 -109T74 -91T53 -77Q52 -75 52 -71Q52 -54 79 -35T132 -14H140L151 -19Q210 -49 281 -49H289Q312 -49 329 -31Q351 -7 372 36T405 109T416 142L408 136Q401 131 392 125T369 111T338 96T303 82T261 72T216 68",72:"18 487Q18 496 29 517T67 566T127 621T216 665T330 683Q359 683 376 669T397 643T400 622Q400 584 382 488T348 343Q348 342 467 342H587L594 366Q615 440 648 534T690 641Q701 656 723 669T764 683Q783 683 783 672L750 578Q716 485 677 346T625 101Q624 92 623 82T622 65T621 56Q621 20 658 20Q666 20 701 25Q709 52 736 69T785 87Q803 87 803 75T791 44T754 3T685 -33T588 -48Q568 -48 562 -46Q522 -31 522 13V23Q531 129 562 250L569 281L565 280Q561 278 556 277T549 274L438 273H328L321 249Q307 202 275 107T232 0Q219 -16 196 -28T155 -41Q149 -41 145 -39T140 -34T139 -29Q139 -24 148 -3T181 86T233 247Q240 270 240 272Q240 273 194 273H169Q139 273 139 285Q139 295 153 308T187 332Q206 341 236 342L260 343L264 359Q278 414 289 482T300 578Q300 613 260 613H254Q198 613 169 592Q148 578 127 544T104 508Q72 478 37 475Q18 475 18 487",73:"174 0H31Q-13 0 -21 2T-30 12Q-30 23 -17 36Q9 60 42 68L155 70Q187 102 214 179T257 333T302 491T366 610L369 614H305Q221 611 188 607T145 596T128 569Q119 543 94 529T47 512Q28 512 28 524Q28 527 32 539Q56 614 159 654Q218 678 312 682Q314 682 339 682T404 682T481 683H632Q642 678 642 671Q642 657 621 641T577 617Q570 615 507 614H444Q427 592 406 542Q382 478 355 366T310 209Q280 123 238 78L230 69H330Q442 70 442 74Q443 74 443 77T447 87T460 105Q490 134 527 137Q545 137 545 125Q545 120 542 112Q531 78 491 49T399 7Q379 2 360 2T174 0",74:"148 78Q148 16 189 -17T286 -50Q319 -50 348 -33T396 10T426 59T444 101L471 204Q498 306 521 372Q575 532 649 605L659 614H591Q517 613 494 607Q433 591 400 550T360 477Q353 454 325 437T275 419Q256 419 260 435Q280 523 376 597T583 681Q603 683 713 683H830Q839 674 839 671Q839 654 810 634T754 614Q735 614 721 601Q688 571 654 495T600 351T561 209T541 132Q507 29 412 -45T213 -119Q141 -119 94 -77T47 33Q47 55 50 69T58 90T71 103Q105 131 135 131Q152 131 152 120Q152 119 151 114T149 99T148 78",75:"194 618Q193 618 182 613T156 601T131 594Q113 594 113 605Q113 623 144 644Q154 650 205 676T267 703Q277 705 279 705Q295 705 295 691Q295 569 250 397Q225 306 197 217T151 81T128 25Q120 8 94 -7T47 -22Q32 -22 32 -10L64 76Q95 163 133 295T185 530Q198 611 194 618ZM331 429Q331 383 364 290T449 117T542 36Q574 36 607 51T652 103Q660 124 677 133T709 143Q727 143 727 128Q727 119 723 111Q704 56 639 17T497 -22H493Q463 -22 425 16Q401 40 382 71Q335 138 296 243T256 399Q256 434 288 473Q342 540 471 622T670 705Q691 704 703 696Q732 678 732 644Q732 613 714 600T677 586Q671 586 667 587T660 592T657 604V619Q657 647 629 647Q623 647 620 646Q576 635 495 583T365 482Q331 448 331 429",76:"62 -22T47 -22T32 -11Q32 -1 56 24T83 55Q113 96 138 172T180 320T234 473T323 609Q364 649 419 677T531 705Q559 705 578 696T604 671T615 645T618 623V611Q618 582 615 571T598 548Q581 531 558 520T518 509Q503 509 503 520Q503 523 505 536T507 560Q507 590 494 610T452 630Q423 630 410 617Q367 578 333 492T271 301T233 170Q211 123 204 112L198 103L224 102Q281 102 369 79T509 52H523Q535 64 544 87T579 128Q616 152 641 152Q656 152 656 142Q656 101 588 40T433 -22Q381 -22 289 1T156 28L141 29L131 20Q111 0 87 -11",77:"28 9Q28 37 43 63T73 90Q77 90 83 84T103 70T141 57H146Q162 57 178 79T222 167Q266 279 295 371T334 513T349 598T358 651T371 677Q397 705 432 705Q442 705 445 699T452 666Q453 661 453 659Q475 538 509 405T568 207L574 192Q581 178 587 164T594 150Q596 150 635 189T693 248Q765 324 863 438T1024 626T1089 701Q1093 705 1100 705Q1111 705 1111 682Q1111 675 1108 660T1099 611T1086 540Q1041 277 1041 144Q1041 98 1044 75T1050 48T1059 42Q1064 41 1075 46Q1102 61 1121 61Q1137 61 1137 50Q1137 28 1087 0T1000 -29Q983 -29 972 -23T955 -9T945 16T942 45T941 83V96Q941 158 952 256T974 422L985 489Q984 489 939 436T821 300T698 164Q665 128 620 85T568 37Q564 34 558 34Q550 34 546 37T535 54Q512 91 496 127T450 259T389 498L384 518Q349 367 294 223T198 15Q155 -50 117 -50Q87 -50 61 -35T30 -6Q28 2 28 9",78:"343 705Q358 705 358 698Q360 696 370 658T411 524T484 319Q536 174 590 82L595 73L615 152Q646 274 683 407Q729 571 752 637T799 727Q852 780 937 788Q939 788 947 788T958 789H962Q979 789 979 765Q979 722 951 692Q942 683 924 683Q888 681 859 672T818 654T803 639Q784 608 708 322T631 15Q631 14 630 15Q630 17 629 15Q628 14 628 12Q621 -4 601 -17T560 -31Q550 -31 546 -28T530 -7Q484 67 458 123T398 272Q352 392 314 514L306 535V534Q306 533 296 488T272 379T234 239T185 100T127 -7T61 -50Q34 -50 4 -34T-27 8Q-27 33 -12 61T18 90Q21 90 36 77T87 57H92Q109 57 123 78T162 173Q206 299 232 417T265 599T276 667Q284 681 304 693T343 705",79:"308 428Q289 428 289 438Q289 457 318 508T378 593Q417 638 475 671T599 705Q688 705 732 643T777 483Q777 380 733 285T620 123T464 18T293 -22Q188 -22 123 51T58 245Q58 327 87 403T159 533T249 626T333 685T388 705Q404 705 404 693Q404 674 363 649Q333 632 304 606T239 537T181 429T158 290Q158 179 214 114T364 48Q489 48 583 165T677 438Q677 473 670 505T648 568T601 617T528 636Q518 636 513 635Q486 629 460 600T419 544T392 490Q383 470 372 459Q341 430 308 428",80:"37 475Q19 475 19 487Q19 536 103 604T327 682Q329 682 344 682T380 682T421 683H463Q625 683 695 615Q718 591 726 564Q733 547 733 525Q733 412 607 312T321 205H312Q293 205 293 217Q293 224 302 236T333 260T385 274Q558 287 614 407Q633 445 633 477Q633 515 612 543T556 585T481 607T399 614H370L368 603Q352 463 312 312T242 82T202 -13Q190 -33 164 -45T121 -57Q108 -57 108 -45Q108 -40 120 -10T151 73T192 190T233 349T266 539Q267 546 269 565T272 598T274 613H270Q209 613 163 588Q131 572 113 518Q102 502 80 490T37 475",81:"114 286Q114 358 151 433T249 569T392 667T558 705Q653 705 713 641T774 460Q774 389 750 322T687 206T600 114T504 46T412 4L399 -2Q542 -62 636 -62Q660 -62 670 -54T686 -27T700 0Q734 34 770 34Q787 34 787 23Q787 -18 720 -74T563 -131Q485 -131 350 -83T145 -34Q127 -34 127 -22Q127 -12 144 5T190 31L200 34L237 35Q386 38 467 79Q550 120 612 210T675 416Q675 510 625 573T484 636Q410 636 346 587T248 469T214 333Q214 306 221 281T243 229T288 188T360 172Q403 172 441 188T490 205Q510 205 510 192Q505 162 432 132T287 102Q206 102 160 155T114 286",82:"37 475Q19 475 19 487Q19 503 35 530T83 589T180 647T327 682H374Q387 682 417 682T464 683Q519 683 559 679T642 663T708 625T731 557Q731 481 668 411T504 300Q506 296 512 286T528 257T553 202Q594 105 611 82Q635 47 665 47Q708 47 742 93Q758 113 786 128Q804 136 819 137Q837 137 837 125Q837 115 818 92T767 43T687 -2T589 -22Q549 -22 517 22T467 120T422 221T362 273Q346 273 346 287Q348 301 373 320T436 342Q437 342 446 343T462 345T481 348T504 353T527 362T553 375T577 393Q598 412 614 443T630 511Q630 545 613 566T541 600T393 614Q370 614 370 613L366 584Q349 446 311 307T243 96L213 25Q205 8 179 -7T132 -22Q125 -22 120 -18T117 -8Q117 -5 130 26T163 113T205 239T246 408T274 606V614Q273 614 259 613T231 609T198 602T163 588Q131 572 113 518Q102 502 80 490T37 475",83:"554 512Q536 512 536 522Q536 525 539 539T542 564Q542 588 528 604Q515 616 482 625T410 635Q374 635 349 624T312 594T295 561T290 532Q290 505 303 482T342 442T378 419T409 404Q435 391 451 383T494 357T535 323T562 282T574 231Q574 133 464 56T220 -22Q138 -22 78 21T18 123Q18 184 61 227T156 274Q178 274 178 263Q178 260 177 258Q172 247 164 239T151 227T136 218L127 213L124 202Q118 186 118 163Q120 124 165 86T292 48Q374 48 423 86T473 186V193Q473 267 347 327Q268 364 239 389Q191 431 191 486Q191 547 242 600T356 679T470 705Q472 705 478 705T489 704Q551 704 596 682T642 610Q642 566 621 545Q592 516 554 512",84:"49 475Q34 475 34 490Q34 552 106 611T261 681Q272 683 507 683H742Q790 717 816 717Q833 717 833 708Q833 682 795 653T714 615Q691 610 588 609Q490 609 490 607L483 580Q476 554 462 496T435 392Q410 289 395 231T363 116T335 34T309 -15T279 -47T242 -64Q231 -68 218 -68Q203 -68 203 -57Q203 -52 211 -38Q224 -7 234 20T251 66T268 123T283 179T304 261T328 360Q342 415 360 488Q380 567 384 582T397 605Q400 607 401 609H302H244Q200 609 188 607T167 596Q145 572 145 541Q145 520 109 498T49 475",85:"8 592Q8 616 70 649T193 683Q246 683 246 631Q246 587 205 492T124 297T83 143Q83 101 100 75T154 48Q202 48 287 135T450 342T560 553Q589 635 593 640Q603 656 626 668T669 683H670Q687 683 687 672T670 616T617 463T547 220Q525 137 521 68Q521 54 522 50T533 42L543 47Q573 61 588 61Q604 61 604 47Q599 16 506 -22Q486 -28 468 -28T436 -18T421 18Q421 92 468 258Q468 259 467 257T459 248Q426 206 391 167T303 81T194 6T83 -22Q66 -22 58 -20Q25 -11 4 19T-17 99Q-17 146 8 220T64 358T120 488T146 586Q146 604 141 608T123 613H120Q99 613 72 597T25 580Q8 580 8 592",86:"25 633Q25 647 47 665T100 683Q291 683 291 306Q291 264 288 213T282 132L279 102Q281 102 308 126T378 191T464 279T545 381T596 479Q600 490 600 502Q600 527 581 550T523 577Q505 577 505 601Q505 622 516 647T542 681Q546 683 558 683Q605 679 631 645T658 559Q658 423 487 215Q409 126 308 37T190 -52Q177 -52 177 -28Q177 -26 183 15T196 127T203 270Q203 356 192 421T165 523T126 583T83 613T41 620Q25 620 25 633",87:"25 633Q25 647 46 665T103 683Q168 683 207 632Q228 608 243 568Q269 485 269 374Q269 324 265 271T256 184L251 150L252 152Q254 153 257 157T264 167T274 180T286 197Q359 293 424 398T519 558T549 616Q549 618 547 624T545 638Q550 654 572 668T615 683Q626 683 632 672T657 595Q726 370 741 128L742 110Q752 122 767 142T823 217T894 321T950 424T976 511Q976 544 958 560T918 577Q906 577 906 602Q906 629 918 651T942 681Q948 683 954 683Q983 683 1008 658T1034 569T999 421T915 257T813 109T724 -3T681 -49Q666 -59 660 -45Q659 -41 657 35T639 233T591 477Q573 551 570 551Q569 551 554 523T507 439T433 315T323 155T182 -25Q160 -52 151 -53Q137 -53 137 -30Q137 -29 148 25T170 168T181 338Q181 424 168 483T131 571T87 609T40 620Q25 620 25 633",88:"324 614Q291 576 250 573Q231 573 231 584Q231 589 232 592Q235 601 244 614T271 643T324 671T400 683H403Q462 683 481 610Q485 594 490 545T498 454L501 413Q504 413 551 442T648 509T705 561Q707 565 707 578Q707 610 682 614Q667 614 667 626Q667 641 695 662T755 683Q765 683 775 680T796 662T807 623Q807 596 792 572T713 499T530 376L505 361V356Q508 346 511 278T524 148T557 75Q569 69 580 69Q585 69 593 77Q624 108 660 110Q667 110 670 110T676 106T678 94Q668 59 624 30T510 0Q487 0 471 9T445 32T430 71T422 117T417 173Q416 183 416 188Q413 214 411 244T407 286T405 299Q403 299 344 263T223 182T154 122Q152 118 152 105Q152 69 180 69Q183 69 187 66T191 60L192 58V56Q192 41 163 21T105 0Q94 0 84 3T63 21T52 60Q52 77 56 90T85 131T155 191Q197 223 259 263T362 327T402 352L391 489Q391 492 390 505T387 526T384 547T379 568T372 586T361 602T348 611Q346 612 341 613T333 614H324",89:"65 599Q65 618 107 650T204 683Q267 683 312 643T380 533T414 385T424 217Q424 186 423 160T422 123Q426 123 468 170T567 304T650 469Q661 503 661 519Q661 546 639 570Q615 591 583 591Q569 591 569 616Q569 640 582 661T613 683Q624 683 638 679T671 664T702 625T714 558Q714 472 639 329T426 45Q361 -21 282 -82T154 -143Q97 -143 64 -104T31 -20Q31 4 44 25T70 46Q78 46 81 39T87 16T97 -9Q127 -51 182 -51Q184 -51 187 -50H190Q233 -41 314 25Q330 36 330 40Q336 79 336 178Q336 508 223 594Q199 614 158 619L148 620L139 611Q111 586 83 586Q65 586 65 599",90:"694 220Q708 220 708 210Q708 195 695 167T658 105T593 42T502 3Q492 1 458 1Q400 1 293 11T150 22Q116 22 92 11T51 0Q37 0 37 10Q37 21 63 44T179 146T367 319L391 343H343L296 344Q285 350 285 358Q285 365 289 372T300 383T313 392T324 398L329 400H450L561 518Q597 558 607 571L621 587H596Q553 589 484 599T383 609Q342 609 326 596T301 555Q294 533 263 514T208 492Q189 492 189 503Q189 510 197 528T215 559Q249 607 318 645T466 683Q504 683 573 673T669 662L690 661Q734 682 748 683Q767 683 767 673Q767 666 746 640Q655 531 555 428L529 400Q529 399 543 399Q604 397 604 366Q604 350 587 337T551 322Q541 322 539 323Q529 328 529 334Q529 339 487 342L470 343L446 320Q272 153 200 96L235 95Q297 95 392 86T533 74H554Q586 116 597 159Q604 179 635 199T694 220"},{})},6819:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.texMathit=void 0;var H=L(9403),V=L(5595);T.texMathit=(0,H.AddPaths)(V.texMathit,{65:"85 46Q112 48 132 56T161 73T176 92T185 104Q185 106 353 407T524 709Q527 716 551 716Q568 716 572 712Q573 711 574 710Q576 708 594 384Q613 54 617 52H618Q626 46 672 46H689Q696 41 696 36Q696 13 683 0H670Q639 2 557 2Q526 2 500 2T459 2T441 1Q425 1 425 10Q425 12 427 24Q428 27 429 31T430 36T432 40T434 43T437 45T443 46T450 46Q514 46 514 69Q514 74 511 136L506 209H292L260 152Q222 84 222 74Q222 48 264 46Q280 46 280 35Q280 33 278 21Q275 7 272 4T259 0Q256 0 232 1T159 2Q135 2 109 1T78 0Q58 0 58 10Q58 14 61 26T66 40Q68 46 85 46ZM504 260Q503 263 496 407T486 553L466 520Q446 486 402 406L318 256Q318 255 411 255H504V260",66:"57 11Q57 38 69 45L74 46Q78 46 85 46T99 46Q134 47 145 50T162 62Q164 66 233 344T303 626Q303 627 302 629V631Q296 637 241 637H223Q217 642 217 645T219 664Q223 677 229 683H411L593 682L605 680Q616 678 628 675T660 662T694 639T720 601T732 547Q732 519 726 503Q710 452 662 414T556 360L545 357L556 355Q604 346 641 312T678 221Q678 155 622 92T482 8Q459 2 439 2T256 0H154H105Q74 0 66 2T57 11ZM629 549Q628 550 629 557T627 576T619 600T601 622T570 636Q564 637 490 637Q472 637 454 637T424 636T411 636Q399 635 395 622T364 500Q333 377 332 376Q332 374 408 374L485 375L495 377Q547 390 588 437T629 549ZM504 336Q500 337 410 337Q323 337 322 336Q322 334 305 263T270 122T252 51Q252 47 337 46Q346 46 361 46T384 45Q425 45 455 55T515 95Q574 156 574 235Q574 276 555 304T504 336",67:"395 -21Q279 -21 215 56T150 244Q150 402 265 543Q339 630 421 667T562 704Q596 704 604 703Q627 698 647 689T679 669T699 649T711 633T716 627L753 665Q790 704 792 704Q793 705 798 705Q812 705 812 698Q812 694 780 561Q744 422 744 421Q742 416 739 415T721 413H705Q699 419 699 426Q701 432 701 444Q705 464 705 493Q705 524 700 551T681 604T643 644T583 659Q480 659 387 570Q321 502 287 397T252 213Q252 123 297 74Q347 24 421 24Q500 24 564 89T653 240Q656 253 659 255T677 257Q700 257 700 248Q700 242 694 222Q681 183 656 143T593 65T504 3T395 -21",68:"56 11Q56 38 68 45L72 46Q77 46 84 46T98 46Q133 47 144 50T161 62Q163 66 232 344T302 626Q302 627 302 629L301 631Q295 637 240 637H222Q216 642 216 645T218 664Q222 677 228 683H403Q582 683 589 682Q672 674 723 608T775 440Q775 312 709 209T562 54Q502 14 432 2Q423 1 243 0H148H102Q72 0 64 2T56 11ZM254 51Q254 46 348 46Q395 46 422 50T484 71Q585 121 633 255Q679 396 679 477Q679 522 665 554T629 603T587 626T548 636Q547 636 536 636T510 636T480 637Q420 637 411 636T398 627Q396 623 325 339T254 51",69:"248 634Q216 634 214 638Q213 641 213 646Q213 674 224 678Q226 680 481 680H736Q743 676 743 669Q743 665 729 557T713 447Q711 440 690 440H675Q667 445 667 454Q667 455 671 481T675 536Q675 583 658 604T592 632Q574 634 475 634Q439 634 424 633T405 631T399 625Q397 622 367 501T336 377Q336 376 367 376H388Q451 376 477 389Q493 399 503 419T520 462T528 489Q531 493 549 493Q557 493 561 492T566 491T569 488T572 483L539 351Q507 221 503 216Q503 216 500 213H484Q468 213 465 216Q461 219 461 225Q461 228 466 250T472 290Q472 317 452 323T368 330H324Q323 326 289 191T255 51T331 46H360Q413 46 444 49T511 67T570 113Q589 137 608 175T638 242T652 272Q656 274 670 274Q693 274 693 262L648 148Q590 4 588 2Q585 0 323 0H61Q54 4 54 11Q54 27 61 41Q65 46 95 46Q131 47 142 50T159 62L194 200Q229 337 264 477T299 623Q299 630 292 631T248 634",70:"299 623Q299 630 292 631T247 634H219Q213 640 213 642T215 661Q218 673 225 680H724Q731 676 731 669Q731 665 717 557T701 447Q699 440 678 440H663Q656 444 656 452Q656 457 659 485T663 538Q663 586 644 607T566 633Q564 633 535 633T486 634H458Q404 634 399 625Q396 620 364 492L332 363H380Q446 365 464 373Q496 389 514 458Q518 477 523 479Q527 480 541 480H556Q563 475 563 470Q563 467 532 339T498 207Q496 200 475 200H460Q453 207 453 212Q454 213 456 225T461 254T464 278Q464 304 445 310T369 317H321L289 190Q257 66 257 59Q257 54 261 52T283 48T337 46Q348 46 352 46T360 45T366 42T368 37Q368 32 365 23Q360 4 355 2Q352 1 342 1Q336 1 297 1T199 2Q138 2 106 2T71 1H68Q54 1 54 11Q54 38 66 45L70 46Q75 46 82 46T96 46Q131 47 142 50T159 62L194 200Q229 337 264 477T299 623",71:"632 -1Q629 -1 622 5T604 25T583 53Q508 -22 394 -22Q287 -22 219 52T150 244Q150 402 265 543Q339 630 421 667T562 704Q596 704 604 703Q627 698 647 689T679 669T699 649T711 633T716 627L753 665Q790 704 792 704Q793 705 798 705Q812 705 812 698Q812 694 780 561Q744 422 744 421Q742 416 739 415T721 413H705Q699 419 699 426Q701 432 701 444Q705 464 705 493Q705 524 700 551T681 604T643 644T583 659Q480 659 387 570Q319 501 286 394T252 208Q252 156 269 118T314 61T369 33T425 24Q470 24 509 46T566 104Q571 116 583 162T595 214Q595 222 583 223Q561 227 517 227H495Q488 230 488 238Q488 254 495 268Q500 273 511 273Q515 273 532 273T581 272T649 271Q731 271 752 273H761Q767 267 767 264T765 246Q761 233 755 227H742Q698 227 693 213L639 4Q636 -1 632 -1",72:"61 0Q54 7 54 11Q54 27 61 41Q65 46 95 46Q131 47 142 50T159 62Q161 66 230 344T300 626Q300 627 300 629L299 631Q293 637 238 637H220Q214 642 214 645T216 664Q220 677 226 683H239Q307 681 372 681Q480 681 486 683H496Q502 677 502 674T500 656Q496 643 490 637H472Q418 637 406 630Q400 627 396 612T367 500Q360 474 352 442T340 395L336 380Q336 378 466 378H596Q657 622 657 626Q657 627 656 629V631Q650 637 595 637H577Q571 642 571 645T573 664Q577 677 583 683H596Q664 681 729 681Q837 681 843 683H853Q860 676 860 672Q858 647 848 637H819Q783 636 772 634T756 623Q753 618 684 340T614 57Q614 50 621 49T666 46Q697 46 699 40Q701 37 698 21Q693 3 689 1Q686 0 677 0Q673 0 657 0T611 1T546 2Q453 2 428 0H418Q411 7 411 11Q411 27 418 41Q422 46 452 46Q488 47 499 50T516 62Q517 64 550 196T584 331Q584 332 454 332H324L291 197Q257 64 257 56Q257 50 265 49T309 46Q340 46 342 40Q344 37 341 21Q336 3 332 1Q329 0 320 0Q316 0 300 0T254 1T189 2Q96 2 71 0H61",73:"235 637Q217 637 213 638T209 649Q209 673 220 682Q222 683 237 683Q278 681 369 681Q404 681 441 682T483 683Q499 683 503 681T508 672Q508 670 505 658T500 643Q498 637 464 637Q425 635 415 633T398 621Q396 618 327 340T257 58T260 52T278 48T322 46Q349 46 349 36Q349 31 346 22Q342 4 337 1Q336 1 334 1T329 0Q325 0 307 0T258 1T190 2Q95 2 67 0H56Q49 7 49 11Q51 38 62 46H91Q129 47 141 50T159 62Q161 66 230 344T300 625Q300 637 235 637",74:"361 637Q333 637 331 641Q330 644 330 649Q330 673 341 682Q343 683 360 683Q405 681 500 681Q551 681 577 681T607 682Q622 682 622 673Q622 665 616 647Q614 640 610 639T587 637Q547 636 541 624Q538 618 477 374T413 124Q391 64 333 22T207 -21T109 12T78 86Q78 130 101 150T149 170Q193 170 196 129Q196 100 178 80T137 58L132 57Q134 52 138 46T160 28T205 16Q242 16 273 48T319 122Q322 129 383 371T444 627Q444 637 361 637",75:"668 621Q668 635 645 637Q629 637 629 648Q629 650 632 662T637 677Q640 682 653 682Q657 682 688 681T764 680Q786 680 810 681T839 682Q859 682 859 672Q859 655 852 643Q849 637 839 637Q804 637 768 621T717 595T697 578Q696 578 600 497L505 417L508 408Q543 311 574 227T618 106T632 69Q645 47 688 46H707Q713 38 713 37T710 19Q706 6 700 0H688Q659 2 587 2Q557 2 532 2T492 2T474 1Q458 1 458 10Q458 13 460 23Q464 39 466 42T480 46Q526 46 526 72Q526 75 476 213L427 350Q426 350 396 325T334 272T302 242Q302 241 299 230T290 194T279 150Q257 61 257 55Q257 50 265 49T309 46H337Q343 40 343 38T341 19Q337 6 331 0H316Q280 2 190 2Q158 2 131 2T89 2T70 1Q54 1 54 11Q54 38 66 45L70 46Q75 46 82 46T96 46Q131 47 142 50T159 62Q161 66 230 344T300 626Q300 627 300 629L299 631Q293 637 238 637H220Q214 642 214 645T216 664Q220 677 226 683H239Q307 681 372 681Q386 681 414 681T464 682L487 683H496Q502 677 502 674T500 656Q495 641 491 637H462Q426 636 415 634T399 623Q396 618 358 467L320 314Q321 314 484 452Q510 474 552 509Q625 570 646 590T668 621",76:"61 0Q54 4 54 11Q54 27 61 41Q65 46 95 46Q131 47 142 50T159 62Q161 66 230 344T300 626Q300 627 300 629L299 631Q293 637 238 637H220Q214 642 214 645T216 664Q220 677 226 683H240Q275 681 371 681Q407 681 438 681T487 682T509 682Q527 682 527 674Q527 670 524 659Q523 657 523 654T522 649T520 645T519 642T517 640T515 639T512 638T507 637T502 637T494 637H478Q433 636 417 633T396 617Q395 614 325 334T255 51Q255 47 319 47Q387 47 410 52Q459 65 494 98T543 163T570 229T589 273H622Q628 264 628 262Q628 259 584 133T539 5Q537 1 511 1Q482 0 296 0H61",77:"72 1Q58 1 58 11Q58 33 66 41Q68 46 87 46Q150 50 168 84Q172 91 238 356T304 626Q304 627 304 629L303 631Q297 637 242 637H224Q218 642 218 645T220 664Q224 677 230 683H326H394Q417 683 422 682T429 676L480 127L502 163Q523 199 560 262T642 400Q801 668 805 676L817 683H1003Q1010 678 1010 672Q1010 650 997 637H979Q915 637 906 623Q903 618 834 340T764 57Q764 50 771 49T817 46H845Q851 38 851 37T848 19Q845 7 838 0H824Q789 2 701 2Q670 2 644 2T603 2T584 1Q569 1 569 11Q569 13 571 25Q576 42 581 45L586 46Q590 46 597 46T611 46Q646 47 657 50T674 62L813 616L634 313Q453 7 452 7Q446 0 428 0Q409 0 407 6Q405 10 379 304T351 604L285 348Q220 83 220 82Q220 65 233 57T279 46H295Q301 38 301 37T298 19Q295 7 288 0H275Q244 2 171 2Q145 2 123 2T88 2T72 1",78:"633 637Q624 637 621 639T617 650Q617 670 630 683H641Q682 680 736 680Q836 680 845 683H853Q860 676 860 672Q858 647 848 637H832Q764 633 750 598Q746 590 673 300Q656 230 638 156T610 44L600 7Q598 0 576 0H559Q553 6 448 297L342 588Q341 588 279 336T216 81Q216 49 274 46Q293 46 295 40Q297 37 294 21Q293 19 292 16T291 11T290 7T289 4T287 2T284 1T280 1T275 0T263 0T229 1T167 2Q91 2 70 0H61Q54 7 54 11T57 27Q61 41 64 43T83 46Q146 50 164 84Q167 90 235 362L303 634Q300 635 253 637H220Q214 643 214 645T216 664Q220 677 226 683H314Q386 683 397 683T410 677Q412 675 501 428L591 179Q591 178 592 180T595 189T600 209T610 246T624 303T645 385Q698 595 698 606Q698 618 683 627T633 637",79:"149 237Q149 326 186 413T282 563T412 665T552 704Q619 704 667 678T741 611T777 528T788 444Q788 328 728 219T572 44T377 -22Q275 -22 212 50T149 237ZM688 487Q688 570 650 617T548 665Q467 665 398 592T291 413T253 203Q253 119 290 70T387 20Q440 20 489 52T573 135T635 249T675 373T688 487",80:"62 0Q55 7 55 11Q55 27 62 41Q66 46 96 46Q132 47 143 50T160 62Q162 66 231 344T301 626Q301 627 300 629V631Q294 637 239 637H221Q215 642 215 645T217 664Q221 677 227 683H404H431H502Q578 683 615 675T684 636Q729 595 729 531Q729 462 671 396T524 308Q499 302 404 301H318L288 182Q258 63 258 55T310 46Q341 46 343 40Q345 37 342 21Q337 3 333 1Q330 0 321 0Q317 0 301 0T255 1T190 2Q97 2 72 0H62ZM626 555V562Q626 620 552 635Q546 636 481 637Q466 637 450 637T423 636T412 636Q401 635 398 627Q396 622 361 484Q353 452 344 416T330 362L325 344Q325 342 390 342H427Q523 342 567 386Q596 415 611 473T626 555",81:"460 -107Q460 -72 464 -42T468 -7L457 -10Q446 -14 424 -18T379 -22Q276 -22 213 50T149 237Q149 326 186 413T282 563T412 665T552 704Q664 704 726 631T788 442Q788 305 703 180Q627 64 517 13L506 8Q506 7 508 -12T513 -38T522 -59T538 -79T565 -85Q604 -85 634 -59T672 0Q676 11 684 11Q693 11 695 2Q695 -1 690 -20T673 -69T644 -126T599 -174T538 -194Q464 -194 460 -110Q460 -108 460 -107ZM689 481Q689 578 646 621T551 665Q468 665 391 586Q321 512 285 399T249 202Q249 106 295 58Q310 41 314 41Q315 41 315 46Q315 83 344 118T420 154Q450 154 473 135Q493 114 500 69L502 58L512 65Q571 110 613 192T672 348T689 481ZM472 49Q472 118 415 118Q393 118 373 98T353 51Q353 18 386 18H387Q424 18 472 40V49",82:"62 0Q55 7 55 11Q55 27 62 41Q66 46 96 46Q132 47 143 50T160 62Q162 66 231 344T301 626Q301 627 300 629V631Q294 637 239 637H221Q215 642 215 645T217 664Q221 677 227 683H386Q554 682 569 679Q571 678 580 676Q643 662 680 623T717 533Q717 473 667 420T528 337L538 330Q563 314 578 286T594 228Q594 212 588 147T581 65Q581 36 589 26T616 16H618Q637 16 652 37Q668 57 677 94Q679 105 701 105T723 95Q723 89 717 72T698 33T662 -5T610 -22Q555 -22 513 3T471 88Q471 107 486 168T502 244Q502 303 452 320Q445 322 382 323H320L288 192Q255 63 255 55T307 46Q338 46 340 40Q342 37 339 21Q335 3 330 1Q326 0 320 0Q317 0 306 0T265 1T190 2Q99 2 73 0H62ZM612 558Q612 566 612 568T610 581T603 597T590 611T567 625T532 635Q526 636 470 637Q458 637 445 637T422 636T412 636Q402 635 397 627L390 598Q383 570 373 532T354 455T337 389T330 361Q356 360 384 360H415Q483 360 527 382Q557 399 574 424T604 498Q612 533 612 558",83:"198 460Q198 551 269 628T432 705Q516 705 557 644L583 673Q589 679 593 684T600 693T605 698T609 702T611 704T614 705T618 705H620Q633 705 633 698T605 577T573 459L570 456H554Q546 456 543 456T536 457T532 460T531 466Q531 469 533 489T536 532Q536 573 525 600T496 640T462 657T427 662Q369 662 325 612T281 503Q281 475 290 458T318 430T356 415T407 401T463 383Q506 360 522 323T538 258V244Q538 141 465 60T300 -22Q198 -22 152 41L143 31Q137 25 126 12T106 -10T95 -21L92 -22Q88 -22 86 -22Q81 -22 78 -20T74 -16V-14Q74 -11 132 221Q134 227 155 227H171Q177 221 177 215Q177 212 175 205T171 182T169 147Q171 99 195 70T246 33T306 25Q358 25 400 70T453 169Q455 180 455 203V210Q455 263 414 285Q409 288 347 305Q271 328 254 339Q239 350 224 371Q198 409 198 460",84:"178 437Q173 442 171 446Q171 451 238 654Q243 670 250 677H681H762Q792 677 799 676T806 667Q806 661 788 553T768 444Q768 437 746 437Q727 437 723 445Q723 450 729 492T736 562Q736 589 728 602T693 624Q675 630 622 630H595Q575 630 571 629T564 623Q562 621 492 342T422 59Q422 48 502 46H542Q548 38 548 37T545 19Q541 6 535 0H517Q475 2 357 2Q315 2 279 2T223 2T198 1Q179 1 179 9Q179 14 182 24Q187 42 190 44Q194 46 206 46H232Q289 47 301 49T326 65L395 344Q465 619 465 626Q465 629 462 629Q456 631 411 631Q364 631 336 625T288 597T255 549T224 467Q215 442 210 437H178",85:"636 637Q627 637 624 639T620 650Q620 670 633 683H644Q702 681 753 681Q760 681 772 681T796 681T820 682T838 683H845H853Q860 676 860 672Q858 647 848 637H832Q764 633 750 598Q745 588 698 400T648 204Q627 140 584 86Q484 -22 378 -22Q300 -22 247 31T194 167Q194 176 194 182T196 198T200 218T207 248T217 288T231 346T250 422Q300 618 300 626Q300 627 300 629L299 631Q293 637 238 637H220Q214 642 214 645T216 664Q220 677 226 683H239Q307 681 372 681Q480 681 486 683H496Q502 677 502 674T500 656Q496 643 490 637H472Q418 637 406 630Q400 627 394 603T344 410Q299 232 292 198T284 135Q284 102 294 78T322 44T355 29T387 24Q455 24 515 74T604 211Q605 215 653 404T701 607Q701 618 686 627T636 637",86:"667 637Q657 637 654 639T650 650Q650 670 663 683H675Q704 681 772 681Q793 681 818 682T847 683Q868 683 868 672Q868 670 865 658T860 643Q857 637 848 637Q785 637 749 587L394 -15Q387 -22 366 -22Q346 -22 342 -16Q341 -13 313 303Q285 622 285 623Q283 631 273 634T229 637Q205 637 205 648Q205 654 208 666T217 682Q219 683 230 683Q276 680 329 680Q444 680 456 683H466Q472 677 472 674T470 656Q466 643 460 637H448Q384 637 384 615Q385 612 406 371T427 126Q427 125 495 240T632 473T704 596Q707 604 707 609Q707 633 667 637",87:"234 637H226Q205 637 205 648Q205 673 216 682Q218 683 231 683Q265 681 340 681Q371 681 404 682T443 683Q458 683 462 681T467 672Q467 670 464 658T459 643Q457 637 434 637Q407 636 394 632T378 623T376 613Q376 589 385 377T394 149L511 361Q542 419 596 519L613 551L612 585Q610 621 610 624Q608 637 559 637H555Q537 637 537 647Q537 654 540 664Q544 677 550 683H561Q600 680 656 680Q771 680 783 683H792Q798 677 798 675T796 658Q792 643 790 640T778 637H774Q721 637 708 620L717 385Q726 150 727 149Q727 148 752 193T812 303T882 433T942 546T969 596Q970 600 970 606Q970 610 969 613T966 620T961 625T955 628T949 631T941 633T934 634T927 636T920 637Q903 637 903 648Q903 650 905 664Q909 677 915 683H928Q960 681 1031 681Q1050 681 1073 681T1101 682Q1124 682 1124 672Q1124 655 1117 643Q1114 637 1104 637Q1085 637 1069 632T1043 618T1026 603T1014 588L1009 580L687 -16Q681 -22 660 -22Q643 -22 637 -16Q635 -14 627 223Q617 441 617 464L602 441Q578 397 487 228Q456 171 423 110T372 17T355 -15Q348 -22 328 -22Q312 -22 308 -20T303 -9Q303 -5 291 310T277 627Q273 636 234 637",88:"684 0Q670 0 634 1T569 2Q512 2 482 2T449 1Q433 1 433 10Q433 11 435 25Q437 34 438 37T442 43T448 45T459 46T476 49Q506 58 506 64Q506 65 467 179T426 295L382 244Q339 194 295 142T249 86Q245 79 245 72Q245 48 279 46Q293 46 293 32Q293 13 280 0H268Q206 2 151 2Q70 2 64 0Q50 0 50 11Q50 15 53 27Q57 41 60 43T78 46Q154 49 205 100Q207 103 312 225L411 341L407 353Q404 360 381 428T336 560T310 627Q301 636 255 637H229Q223 643 223 645T225 664Q229 677 235 683H246Q288 680 346 680Q462 680 477 683H487Q493 677 493 674T491 656Q488 644 485 641T471 637Q461 635 454 635Q419 626 421 619Q421 617 453 524T486 430T554 509T624 593Q631 604 631 611Q631 622 621 629T598 637Q583 637 583 648Q583 650 585 660Q589 676 591 679T602 683Q606 683 637 682T715 680Q742 680 771 681T804 682Q825 682 825 672Q825 650 817 642Q814 637 797 637Q739 634 700 608Q684 597 659 569T505 389L501 384L557 222Q612 61 616 57Q625 47 671 46Q691 46 697 45T704 36Q704 35 702 23Q701 19 700 14T699 7T696 3T692 1T684 0",89:"232 637Q198 637 198 647Q198 651 201 664T210 682Q212 683 223 683Q269 680 325 680Q443 680 455 683H465Q472 676 472 672Q472 656 465 642Q460 637 441 637Q395 634 395 623Q395 621 438 478T482 334T583 460T688 591Q688 593 694 601T700 617Q700 637 668 637H666Q655 637 655 648Q655 654 658 664Q660 672 660 673T663 678T668 682T677 683Q680 683 704 682T776 680Q801 680 828 681T858 682Q875 682 875 673Q875 669 872 657T867 643Q865 637 848 637Q788 634 749 597Q733 581 608 424L487 273L461 170Q454 145 448 118T438 76T434 60Q434 54 436 52T452 48T496 46H514Q520 41 520 38T518 19Q514 6 508 0H495Q427 2 364 2Q350 2 323 2T272 0H250H241Q234 7 234 11Q234 27 241 41Q245 46 275 46Q312 47 323 50T340 64Q340 65 344 79T355 120T368 171L393 274L341 448Q288 622 286 626Q278 636 232 637",90:"203 452Q203 455 236 565T270 677Q270 681 274 681Q276 683 488 683H699Q704 678 704 675Q704 663 697 649Q697 647 449 348L201 50L266 49H301Q442 49 495 116Q525 155 556 251Q563 274 565 278T579 282H585Q609 285 609 271Q609 270 570 142T528 8T518 1T466 0H303Q253 0 197 0T131 -1Q112 -1 102 -1T87 1T81 3T80 8Q80 30 89 39Q90 41 204 178T446 470T575 626L584 637H512H504H475Q446 637 426 635T378 624T330 597T289 546T254 467Q247 446 243 444Q239 442 226 442Q203 442 203 452",97:"418 53Q418 26 438 26Q466 26 494 131Q500 151 504 152Q507 153 516 153H521Q531 153 534 153T540 150T543 144Q543 141 540 126T529 88T509 43T477 5T434 -11Q404 -11 383 3T354 30T347 48H346Q345 47 342 45T337 40Q282 -11 228 -11Q172 -11 137 34T101 146Q101 260 177 351T333 442Q343 442 352 441T369 437T382 431T393 425T402 417T409 410T414 402T419 396Q423 406 436 414T461 422Q475 422 484 413T494 395Q494 384 459 244T420 88Q418 80 418 58V53ZM397 323Q397 344 382 374T333 405Q302 405 271 372Q249 349 235 316T203 215Q184 135 184 108V100V94Q184 54 207 35Q218 26 235 26Q279 26 330 91Q343 109 346 118T372 217Q397 317 397 323",98:"158 683Q163 683 223 688T300 694Q312 694 312 685T279 544Q243 405 243 403L256 412Q268 422 292 432T338 442Q395 442 431 398T467 284Q467 175 393 82T229 -11Q175 -11 142 32T108 142Q108 176 115 207T166 412Q177 458 190 510T209 588T216 616Q216 629 209 632T170 637H149Q143 643 143 645T145 664Q150 683 158 683ZM178 109Q178 27 234 27Q247 27 254 29Q295 44 323 94Q343 129 363 208T384 332Q384 354 382 361Q369 405 332 405Q282 405 228 326L222 317L205 250Q178 142 178 109",99:"257 -10Q183 -10 143 37T103 155Q103 257 173 341T337 440Q341 441 348 441H358Q421 441 445 415T469 356Q469 320 450 305T410 289Q392 289 381 299T370 325Q370 362 404 378L414 383Q392 402 365 405Q322 405 285 375T227 294Q217 271 202 213T187 119Q187 27 263 27Q299 27 330 40Q361 51 386 71T424 106T440 121Q444 121 455 110T466 96Q466 92 458 81T432 54T390 24T331 0T257 -10",100:"418 54Q418 26 438 26Q466 26 494 131Q500 151 504 152Q507 153 516 153H521H526Q543 153 543 144Q543 143 541 129Q531 91 521 65T487 14T434 -11T383 3T354 30T347 48H346Q345 47 342 45T337 40Q282 -11 228 -11Q172 -11 137 34T101 146Q101 255 174 348T337 441Q354 441 368 437T390 427T404 414T413 404T417 400L471 616Q471 629 464 632T425 637H404Q398 643 398 645T400 664Q405 683 413 683Q418 683 478 688T555 694Q567 694 567 686Q567 676 495 389L419 86Q418 80 418 61V54ZM397 323Q397 329 394 340T385 367T365 394T333 405Q302 405 271 372Q249 349 235 316T203 215Q184 135 184 108V100Q184 71 191 56Q204 26 235 26Q267 26 300 57T344 112Q347 117 372 217T397 323",101:"107 166Q107 230 131 283T193 369T270 420T345 441Q346 441 352 441T361 442H364Q409 442 439 418T470 355Q470 270 366 239Q308 223 218 223H205Q189 164 189 125Q189 83 206 55T261 27Q309 27 353 50T426 109Q436 121 440 121T453 111T466 97Q469 92 455 77Q424 41 372 16T258 -10Q184 -10 146 41T107 166ZM416 333T416 354T401 390T360 405Q322 405 292 384T246 336T223 288T215 261Q215 260 240 260Q262 261 276 262T314 266T353 275T384 291T408 317",102:"351 608Q351 642 389 661Q368 668 365 668Q358 668 352 664Q349 663 347 661T342 654T337 647T333 637T330 627T327 614T324 601T321 587T318 571L291 432Q291 431 343 431H394Q400 426 400 423T398 404Q394 390 389 386L335 385H282L255 246Q212 20 189 -51Q136 -199 58 -204Q22 -204 0 -185T-23 -134Q-23 -100 -3 -85T37 -69Q54 -69 65 -80T76 -108Q76 -115 75 -119Q70 -134 61 -144T46 -158L39 -161Q39 -162 42 -163T50 -166T61 -168Q77 -168 91 -145Q98 -128 105 -95L125 -1Q145 90 146 98Q149 109 163 180T189 317T202 384T158 385H114Q108 390 108 393T110 412Q113 424 120 431H165Q211 431 211 433Q213 435 219 473T237 561T266 639Q282 667 310 686T367 705Q402 705 426 686T450 635Q450 600 430 585T390 569Q373 569 362 580T351 608",103:"103 163Q106 263 173 347T320 441Q322 441 329 441T341 442Q387 439 419 398Q420 399 420 400Q421 402 425 406T440 416T464 422Q476 421 485 413T494 396Q494 386 465 268T407 38T377 -77Q365 -123 310 -164T179 -205Q46 -205 46 -139Q46 -114 64 -97T106 -79Q127 -79 136 -91T146 -115Q146 -127 141 -138T130 -155T124 -162T125 -163Q133 -166 170 -168Q200 -168 217 -162Q242 -153 264 -130T297 -78Q298 -74 305 -46T320 10T327 38Q326 38 317 31T291 15T256 2Q249 1 231 1Q182 1 143 38T103 163ZM398 324Q398 330 395 346T375 383T332 405Q330 405 326 405T320 404Q291 396 263 365Q230 324 208 239T185 115Q185 38 238 38Q258 38 279 50T312 77T336 106L348 122Q349 125 373 223T398 324",104:"398 44Q398 26 414 26Q431 26 451 43Q477 71 496 136Q499 148 501 150T515 153H521Q531 153 534 153T541 150T544 143Q544 133 534 105T496 41T432 -8Q424 -10 408 -10Q370 -10 348 12T326 72Q326 93 342 135Q397 288 397 349Q397 367 396 372Q386 405 357 405Q283 405 228 310Q217 290 212 274T180 152Q153 42 148 26T135 3Q121 -11 102 -11Q89 -11 80 -3T69 19L216 616Q216 629 209 632T170 637H149Q143 643 143 645T145 664Q150 683 158 683Q163 683 223 688T300 694Q312 694 312 685Q312 674 277 539Q241 395 241 393Q242 394 249 399T259 407T271 415T285 424T300 431T318 437T338 440T362 442Q423 442 449 410T475 338Q475 290 437 178T398 44",105:"234 599Q234 620 251 638T292 656Q306 656 319 647T332 617Q332 594 313 577T273 560Q260 560 247 569T234 599ZM75 287Q75 292 82 313T103 362T142 413T196 441H214Q248 441 270 419T293 357Q292 338 289 330T245 208Q193 72 193 46Q193 26 209 26Q228 26 247 43Q273 71 292 136Q295 148 297 150T311 153H317Q327 153 330 153T337 150T340 143Q340 133 330 105T292 41T228 -8Q220 -10 204 -10Q160 -10 141 15T122 71Q122 98 171 227T221 384Q221 396 218 400T203 405Q175 403 156 374T128 312T116 279Q115 278 97 278H81Q75 284 75 287",106:"266 600Q266 622 283 639T322 656Q340 656 352 645T364 616Q364 596 347 578T305 560Q291 560 279 569T266 600ZM75 287Q75 293 86 316T117 369T168 420T236 442Q282 442 304 415T327 358V332L278 134Q269 98 260 60T246 3T236 -36T227 -66T220 -85T213 -101T204 -114Q181 -150 139 -177T46 -204Q8 -204 -12 -186T-32 -140Q-32 -112 -14 -96T27 -79Q48 -79 57 -91T67 -114Q67 -146 38 -166Q42 -168 49 -168Q75 -168 98 -147T130 -108T146 -71Q150 -59 199 138T250 346Q253 359 253 373Q253 405 230 405Q206 405 184 386T149 345T126 301L117 280Q115 278 98 278H81Q75 284 75 287",107:"158 683Q163 683 223 688T300 694Q312 694 312 686Q312 679 262 478L211 273Q212 272 219 276T248 299T296 349Q317 371 328 382T360 410T399 434T439 442Q462 442 480 427T498 373Q498 329 479 313T437 296Q420 296 409 305T398 331Q398 357 413 372T445 391Q454 392 448 399Q445 405 431 405Q408 405 377 385Q351 368 314 327T250 261Q243 257 243 254Q249 254 279 243T328 220Q366 192 366 146Q366 131 361 109T355 62V54Q355 26 376 26Q379 26 387 28Q420 36 443 130Q449 151 454 152Q457 153 465 153H470Q484 153 488 152T492 144Q492 141 489 126T476 88T454 42T420 5T372 -11Q331 -11 306 17T280 88Q280 100 283 119T287 146Q287 172 265 190T221 215T198 220Q197 220 173 121Q152 37 148 24T135 3Q121 -11 102 -11Q89 -11 80 -3T69 19L216 616Q216 629 209 632T170 637H149Q143 643 143 645T145 664Q150 683 158 683",108:"162 61Q162 26 183 26Q211 26 239 131Q245 151 249 152Q252 153 261 153H266H271Q288 153 288 144Q288 143 286 129Q276 91 266 65T232 14T179 -11Q144 -11 116 12T87 81Q87 96 88 102L216 616Q216 629 209 632T170 637H149Q143 643 143 645T145 664Q150 683 158 683Q163 683 223 688T300 694Q312 694 312 686Q312 676 240 389L164 86Q162 74 162 61",109:"81 278Q75 284 75 289Q77 299 89 338Q101 373 114 396T142 428T166 439T186 442H189Q225 440 251 417Q266 401 271 384L275 374L286 386Q342 442 414 442Q428 442 440 440T461 435T479 427T493 418T503 407T511 397T516 387T520 378T523 370L524 366Q546 395 583 418T667 442Q729 442 755 411T782 338Q782 290 743 178T704 45Q704 26 720 26Q773 26 802 136Q805 148 807 150T822 153H828Q838 153 841 153T848 150T851 143Q851 137 843 115T821 63T778 12T715 -10Q671 -10 652 16T632 71Q632 88 668 191T704 349Q704 367 703 372Q693 405 664 405Q637 405 613 393T571 360T547 329T534 309Q523 290 518 274T487 151Q455 24 452 16Q438 -11 408 -11T376 18Q376 26 411 167T447 314Q449 325 449 346Q449 372 444 384Q431 405 408 405Q334 405 276 305Q266 289 262 273T231 151Q199 24 196 16Q182 -11 152 -11T120 18Q120 26 159 182T200 347Q202 361 202 372Q202 405 181 405Q168 405 159 391Q145 374 132 328T117 280T98 278H81",110:"449 44Q449 26 465 26Q482 26 502 43Q528 71 547 136Q550 148 552 150T566 153H572Q582 153 585 153T592 150T595 143Q595 133 585 105T547 41T483 -8Q475 -10 459 -10Q421 -10 399 12T377 72Q377 93 393 135Q448 288 448 349Q448 367 447 372Q437 405 408 405Q381 405 357 393T315 360T291 329T278 309Q267 290 262 274T231 151Q199 24 196 16Q182 -11 152 -11T120 18Q120 23 159 181Q199 343 199 346Q202 360 202 372Q202 406 183 406Q163 406 148 374Q142 360 135 338T124 299T117 280T98 278H81Q75 284 75 287Q76 293 78 303T90 341T110 388T141 425T184 442Q195 442 204 441T221 436T235 429T247 421T256 412T262 403T267 394T271 387T273 381L274 378V374L287 387Q342 442 414 442Q474 442 500 410T526 338Q526 290 488 178T449 44",111:"103 155Q103 266 185 354T366 442Q435 442 476 394T517 275Q517 169 436 79T255 -11Q194 -11 149 32T103 155ZM187 119Q187 67 209 47T260 26Q290 26 321 47Q354 68 380 113T426 260Q432 291 432 315Q432 361 408 385Q388 405 358 405Q319 405 283 374T227 294Q217 271 202 213T187 119",112:"81 278Q75 284 75 287Q93 379 131 417Q154 442 189 442Q222 440 243 423T272 382L280 390Q335 442 389 442Q446 442 482 398T518 284Q518 212 480 137T375 19Q321 -10 291 -10H282H278Q237 -10 204 28L202 32L181 -51Q160 -135 160 -139Q160 -147 205 -148H230Q236 -155 236 -157T233 -175Q230 -187 227 -190T214 -194Q211 -194 202 -194T169 -193T108 -192Q40 -192 21 -194H13Q6 -187 6 -183T9 -167Q13 -153 16 -151T39 -148Q73 -147 78 -136Q82 -128 139 104Q199 337 199 347Q202 362 202 372Q202 406 182 406Q169 406 159 391Q145 374 132 328T117 280T98 278H81ZM221 111Q234 26 286 26Q307 26 336 47T385 116Q398 147 416 217T435 332Q435 354 433 361Q420 405 383 405Q333 405 279 326L273 317L221 111",113:"228 -11Q172 -11 137 33T101 147Q101 205 125 266T201 377T318 441Q322 442 333 442Q388 442 420 394L429 403Q439 413 455 423T481 437T494 442Q498 442 501 439T504 434Q504 425 435 149Q364 -135 364 -139Q364 -147 409 -148H434Q440 -155 440 -157T437 -175Q433 -191 429 -193Q425 -194 418 -194Q416 -194 406 -194T372 -193T309 -192Q259 -192 233 -192T204 -193Q190 -193 190 -184Q190 -181 192 -169Q196 -153 199 -151T219 -148Q266 -148 277 -141Q283 -137 305 -51L325 29L316 22Q270 -11 228 -11ZM397 323Q397 329 394 340T385 367T365 394T333 405Q302 405 271 372Q249 349 235 316T203 215Q184 135 184 108V100Q184 71 191 56Q204 26 235 26Q267 26 300 57T344 112Q347 117 372 217T397 323",114:"81 278Q75 284 75 289Q77 301 89 339Q122 442 183 442Q219 442 241 425T271 384L283 396Q327 442 384 442Q424 442 454 421T484 362Q484 327 464 312T424 296Q407 296 396 305T385 331Q385 352 394 365T414 384T424 390Q409 405 378 405Q322 405 276 315L268 300L234 161Q200 25 196 16Q182 -11 152 -11T120 18Q120 23 159 181Q199 343 199 346Q202 360 202 372Q202 405 182 405Q164 405 150 377T128 316T117 280Q115 278 98 278H81",115:"153 285Q153 349 197 395T311 442Q355 442 386 420T418 356Q418 321 401 308T365 294Q336 294 331 326Q331 336 334 345T343 359T353 368T362 374L366 376Q365 379 362 383T344 396T308 404Q265 404 246 377T226 325T244 289T287 275T339 258T383 212Q395 188 395 163Q395 132 379 95T333 32Q279 -11 207 -11Q154 -11 115 13T76 86Q76 108 83 123T102 145T121 153T135 156Q154 156 164 145T175 117Q175 82 142 66L132 62Q131 62 131 61Q131 57 139 49T166 34T210 26Q250 26 277 44T312 83T321 123Q321 153 301 166T248 185T204 198Q176 211 162 241Q153 258 153 285",116:"94 385Q87 392 87 395Q87 399 90 411T95 425Q97 430 103 430T149 431H196L215 511Q218 521 222 539T228 565T234 585T242 603T251 615T264 623T281 626Q311 626 315 597Q315 591 296 513T275 433Q275 431 320 431H366Q373 424 373 420Q373 398 360 385H263L189 86Q188 80 188 61V54Q188 29 201 27Q213 23 229 30Q253 37 276 66T316 138Q321 149 324 151T342 153H347Q364 153 364 146T360 130Q331 63 290 26T202 -11Q158 -11 135 18T111 81Q111 93 129 168T166 314L184 383Q184 385 139 385H94",117:"75 287Q75 299 89 333T135 404T205 441Q246 441 269 420T293 357Q292 338 259 245T225 95Q225 26 274 26Q301 26 324 43T358 77T369 99Q369 102 406 249T446 404Q460 431 490 431T522 402Q522 394 485 245T446 89Q443 74 443 56Q443 28 461 26Q487 26 507 86Q524 130 524 146Q524 147 530 153H547Q570 153 570 144Q570 138 561 109T544 62Q530 29 512 12Q492 -11 454 -11Q429 -9 410 2T385 23T376 41L363 28Q350 16 325 3T269 -10Q204 -10 176 25T148 108Q148 161 184 262T221 383Q221 405 206 405Q178 405 158 375T128 313T116 279Q115 278 97 278H81Q75 284 75 287",118:"387 386Q387 407 406 425T445 443Q466 443 479 423T492 371Q492 330 473 253Q411 18 307 -8Q298 -10 279 -10Q208 -10 179 26T149 114Q149 162 185 261T221 384Q221 405 206 405Q177 405 157 375T128 313T116 279Q115 278 97 278H81Q75 284 75 287T79 304T93 342T119 388T158 425T210 441H218Q243 441 268 421T293 357Q292 337 259 245T226 102Q226 26 285 26Q328 26 360 72T422 237Q429 265 429 290Q428 324 408 349T387 386",119:"591 386Q591 407 610 425T649 443Q670 443 683 423T696 371Q696 327 672 232T621 85Q575 -11 493 -11Q469 -11 449 -6T418 8T398 24T386 38L382 43Q347 -10 293 -10H286Q221 -10 186 21T150 115Q150 164 185 262T221 384Q221 405 206 405Q177 405 157 375T128 313T116 279Q115 278 97 278H81Q75 284 75 287T79 304T93 342T119 388T158 425T210 441H218Q243 441 268 421T293 357Q292 336 260 246T227 108Q227 26 292 26H295Q332 26 361 93L366 103V119Q366 122 367 133T369 150Q372 167 401 282T433 404Q446 431 477 431Q507 431 509 402Q509 396 500 358T474 254T446 140Q444 126 444 104V92Q444 66 459 46T502 26H505Q527 28 545 43T577 88T602 149T623 226Q633 265 633 290Q632 324 612 349T591 386",120:"275 356Q275 383 262 394T233 405Q196 405 166 371T121 289Q119 280 116 279T98 278H81Q77 282 76 283T75 288T78 300Q88 332 109 363T153 411Q195 442 235 442Q306 442 333 386Q373 442 427 442Q461 442 487 421T513 364T494 312T453 296Q436 296 425 305T414 331Q414 352 424 366T446 386L456 390Q448 404 421 404H418Q382 404 358 341Q355 332 328 227T298 105Q295 90 295 75Q295 26 339 26Q365 26 388 43T424 82T444 123T451 146L457 153H474Q490 153 493 152T496 144Q496 133 486 110T456 58T404 10T333 -11Q276 -11 237 45Q197 -11 146 -11Q108 -11 83 10T58 67Q58 99 76 117T119 135Q136 135 147 124T158 96Q158 89 157 85Q149 57 125 45L115 41Q125 26 151 26Q171 26 187 45T214 93Q217 102 244 210T273 330Q275 339 275 356",121:"75 287Q75 299 89 333T135 404T205 441Q246 441 269 420T293 357Q292 338 259 245T225 95Q225 26 274 26Q325 26 367 93L405 245Q442 393 446 404Q460 431 490 431T522 402Q522 400 416 -24Q389 -102 327 -153T196 -205Q152 -205 122 -181T91 -119Q91 -84 110 -67T152 -49Q170 -49 180 -60T191 -87Q191 -108 174 -128Q167 -134 157 -138T146 -144Q155 -153 159 -156T173 -163T199 -167Q229 -167 255 -149T297 -105T325 -52T342 -6T347 15Q315 -10 269 -10Q204 -10 176 25T148 108Q148 161 184 262T221 383Q221 405 206 405Q178 405 158 375T128 313T116 279Q115 278 97 278H81Q75 284 75 287",122:"160 317Q158 317 155 317Q136 317 136 324Q136 351 171 396T260 442Q292 442 321 410T365 375H369Q384 375 404 408L425 441Q427 442 444 442H460Q466 436 466 434Q466 419 426 367Q387 314 294 222T178 105L170 95L181 94Q198 93 236 81T295 68Q328 68 356 89T395 141Q398 150 401 151T419 153Q441 153 441 144Q441 110 394 50T282 -11Q251 -11 221 23T171 57Q157 57 143 47T121 26T104 3T95 -10Q93 -11 76 -11H60Q54 -5 54 -2Q54 3 61 14Q103 88 233 215Q349 329 349 338L302 351Q269 362 247 362Q227 362 212 356T192 342T183 327T178 320Q175 317 160 317"},{})},4025:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.texOldstyleBold=void 0;var H=L(9403),V=L(6357);T.texOldstyleBold=(0,H.AddPaths)(V.texOldstyleBold,{48:"259 460H279Q352 460 403 444T491 378Q528 320 528 219Q528 100 475 45Q417 -17 287 -17Q152 -17 99 44T46 219Q46 246 47 265T57 318T82 376T131 422T210 454Q234 460 259 460ZM389 229V271Q389 351 371 380T280 409Q232 409 208 385Q194 371 190 345T185 229V210Q185 108 194 83Q208 35 287 35Q317 35 336 42Q372 55 380 85T389 204V229",49:"119 417Q191 417 240 428T310 450T338 461Q353 461 357 452T361 400Q361 389 361 342T360 254V62H420H456Q483 62 488 58T494 35V29Q494 13 491 7T473 0Q468 0 424 1T295 2T167 1T117 0Q114 0 111 0T107 1Q96 8 96 27V35Q96 54 102 58T140 62H170H229V213Q229 363 228 363Q220 360 196 358T150 356L130 355H93Q84 360 82 365T80 386Q80 404 81 407T95 417H119",50:"214 399Q202 399 191 398T175 395T170 392L171 390Q172 389 174 386T178 379T181 369T182 355Q182 328 165 312T123 296Q99 296 82 312T64 356Q64 397 105 428T253 460Q301 460 337 456T411 441T476 403T514 338Q516 328 516 310V304Q516 257 470 227Q456 217 427 205T376 184L354 176Q350 174 325 162T277 139L254 128Q414 129 428 130H439Q450 148 453 166T460 188T486 193H493Q515 193 517 178Q517 171 502 94T484 11Q481 3 472 2T410 0H269Q65 0 62 2Q55 5 53 10T51 32Q51 54 56 58Q60 62 173 131Q296 207 318 224Q368 264 368 308Q368 342 342 363T283 392T214 399",51:"80 309Q80 367 131 414T276 461Q388 461 441 417T494 313Q494 265 463 223T373 155L361 151L376 147Q436 132 480 92T525 -15T487 -127T393 -192T274 -211Q179 -211 114 -167T48 -53Q48 -18 69 5T128 29Q168 29 188 5T208 -50Q208 -59 207 -67T203 -81T197 -92T190 -101T183 -109T177 -114T170 -118L167 -121Q160 -125 164 -127Q167 -129 176 -133Q215 -152 268 -152H273Q337 -152 356 -92Q364 -69 364 -14Q364 45 352 74T303 120Q287 125 240 125H230Q201 125 196 127T191 146V152Q192 170 196 173T233 178Q234 178 241 178T252 179T262 181T274 183T285 188T297 195T308 205T319 218T328 235T337 257Q345 280 345 320V330Q345 345 343 355T335 379T312 399T270 407Q226 407 177 377Q226 356 226 310Q226 270 204 253T153 235Q123 235 102 253T80 309",52:"180 0Q155 0 124 0T84 -1Q48 -1 40 3T32 27V37Q32 59 34 63T204 265T377 465Q380 468 383 468H387Q391 468 398 468T411 469Q432 469 438 468T449 459Q451 455 451 258V62H489H498Q531 62 536 58T542 31Q542 9 537 5T504 0H489H451V-132H489H498Q530 -132 536 -136T542 -163Q542 -181 538 -187T522 -194Q518 -194 483 -193T378 -192Q281 -192 256 -193L217 -194Q203 -189 203 -169V-163V-158Q203 -140 209 -136T246 -132H265H314V0H180ZM325 62V320L105 63L215 62H325",53:"131 29Q159 26 175 12T194 -13T197 -35V-41Q197 -58 195 -66Q191 -76 185 -84T173 -97T161 -105T152 -109L148 -110Q148 -112 158 -121T195 -141T252 -152Q274 -152 280 -151Q335 -137 349 -104T363 9Q363 85 356 114T322 157Q305 166 286 166Q251 166 223 154T182 131T162 109Q154 98 150 96T130 93Q107 93 102 104Q100 107 100 279V371V424Q100 461 110 461Q114 461 123 458T149 450T183 441Q234 429 286 429Q313 429 340 432T387 440T422 449T447 457T458 461Q472 461 472 435Q472 420 470 418Q464 405 438 379T352 325T226 297Q189 297 171 301H168V182Q169 182 174 185T190 194T213 205T248 213T292 217Q391 217 454 159T517 5Q517 -92 444 -151T255 -211Q167 -211 112 -160T57 -44Q57 -12 76 8T131 29",54:"48 316Q48 398 70 462T124 562T198 621T274 652T339 660Q377 660 384 659Q497 632 497 532Q497 507 482 487T431 466Q397 466 381 486T365 530Q365 569 405 593Q382 603 381 603Q361 607 350 607Q316 607 279 589T221 533Q199 489 196 385L195 370Q196 371 203 379T217 395T237 410T263 424Q283 431 313 431Q409 431 468 368Q526 310 526 208Q526 131 492 81T405 5Q359 -17 289 -17Q256 -17 227 -11T163 17T105 73T65 170T48 316ZM293 380Q244 380 220 331T196 212Q196 104 216 80Q240 41 292 41Q295 41 301 41T309 42Q338 46 355 62Q372 81 375 108T379 230Q378 314 372 333Q358 375 299 380H293",55:"95 210H88Q66 210 64 225Q64 229 82 345T102 465Q106 476 125 476H131Q162 476 162 458Q162 451 213 448Q221 448 238 447T260 446Q261 446 410 444Q436 444 468 444T509 445Q544 445 551 440T558 413V404Q558 395 547 380T478 301L392 202Q354 150 339 81T321 -104V-132Q321 -187 286 -203Q273 -211 255 -211Q236 -211 217 -199T190 -160Q189 -153 189 -130Q194 17 282 156Q309 200 370 270Q404 307 400 307H293Q151 306 146 303Q140 300 132 259T120 215Q115 210 95 210",56:"48 164Q48 199 59 228T92 277T128 307T163 329Q159 332 155 336Q135 346 110 382Q80 427 80 477Q80 564 147 620Q202 660 264 660Q266 660 275 660T290 661Q384 661 439 619T494 506Q494 486 489 468T477 437T459 413T440 395T421 380T406 370L410 368Q414 365 421 361T437 351T456 335T476 316T495 291T511 262T522 228T526 189Q526 93 460 38T282 -17Q242 -17 205 -9T130 19T71 75T48 164ZM406 506Q406 545 379 576T283 607Q218 606 193 585T168 536Q168 522 172 513T195 490T224 471T275 443L346 403Q406 446 406 506ZM291 42Q365 42 395 70T425 134V141Q425 170 401 190T319 242Q308 248 302 251Q286 260 266 271T235 288L225 294Q222 292 217 289T198 274T175 249T157 212T148 163Q148 116 179 79T291 42",57:"175 -140Q198 -152 236 -152Q294 -152 332 -116Q356 -91 366 -54T379 62V78L376 74Q372 70 366 64T352 50T333 35T308 23Q289 17 262 17Q168 17 108 77T48 235Q48 273 59 317Q81 381 141 421T276 461Q279 461 285 461T295 460Q326 460 354 454T415 426T471 371T510 277T526 136Q526 42 501 -28T432 -136T341 -192T240 -210Q199 -210 169 -201T121 -178T94 -146T80 -112T77 -82Q77 -51 95 -33T143 -15Q170 -15 189 -33T209 -81Q209 -116 175 -140ZM377 244V274Q377 300 376 316T368 352T348 384T312 405Q307 406 283 406Q257 406 238 396T213 376T205 361Q196 341 196 259V233V181Q196 122 211 96T278 69H298Q330 82 345 104Q367 134 376 190Q377 200 377 244",65:"761 751Q784 751 784 728V711Q784 570 795 417T820 191Q844 76 865 76Q868 76 902 93T962 112H973Q989 104 989 94Q989 92 987 86Q978 47 846 -11Q812 -25 779 -26Q722 -26 708 9Q688 47 669 161H524L379 162L359 136Q286 43 234 -3T142 -49T71 -19T39 55Q39 92 60 131T103 174Q113 174 117 167T124 149T136 128T166 110Q183 105 190 105Q230 105 341 246Q401 322 453 397T531 514T582 601T611 651H640V663Q640 692 676 718T745 750Q747 750 752 750T761 751ZM658 266Q653 312 649 377T644 489T641 541V556L557 415Q500 325 448 253Q467 261 524 261H568H658V266",66:"441 83Q571 83 571 195Q571 246 538 279T466 322T386 333Q378 333 357 330T329 327Q307 327 307 345Q307 354 313 365T347 396T419 430Q546 472 581 498Q594 508 594 535Q594 574 567 589T508 604Q469 604 442 583Q390 546 342 457T265 256Q237 148 186 60Q167 29 144 13Q105 -15 68 -17H65Q40 -17 40 1Q40 7 53 29T87 100T124 210Q162 373 190 575Q188 575 174 567T138 550T98 542Q75 542 75 560Q75 588 123 618Q135 625 203 659T281 696Q299 703 316 703Q339 703 339 685Q339 656 328 583L333 588Q338 592 346 599T367 615T394 634T428 654T467 674T511 690T559 701T611 705Q651 704 681 689Q739 659 739 598Q739 507 595 427L584 421Q585 420 595 416T610 410T626 402T644 392T660 380T677 365T691 347T703 325T710 299T715 268Q717 193 665 130Q622 73 531 28T348 -17Q275 -17 225 10Q206 19 200 24T193 36Q193 57 231 86T311 119H322Q386 83 441 83",67:"243 -20Q135 -20 78 48T20 218Q20 280 39 344T98 470T193 580T324 661T488 702H490Q491 702 493 702T498 703T507 703T518 702H526Q599 702 599 631Q599 597 577 550T541 486Q523 463 490 447T431 430Q423 430 419 433Q409 437 409 450Q410 456 432 499T454 567Q454 586 446 594T415 603Q316 603 254 532Q216 487 190 421T164 284Q164 228 181 186T226 122T282 90T340 80Q377 80 405 96T449 131T492 167T553 187H555Q580 187 580 168Q580 153 551 123T476 60T367 4T243 -20",68:"107 0Q92 5 92 18Q92 33 113 53T160 86Q170 91 182 94T197 100L206 120Q248 226 273 337T304 501T309 585Q278 585 234 577T179 557Q172 550 166 532T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q281 686 447 686H480H517Q692 686 784 631Q885 571 885 450Q885 339 805 239T586 75T286 1Q276 0 187 0H107ZM741 391Q741 424 731 452T694 510T613 558T481 584Q476 584 468 584T457 585L449 586V579Q441 501 425 424T391 292T357 193T330 125T319 100H324Q511 100 628 175Q688 215 714 275T741 391",69:"495 516Q485 516 478 520T470 532Q470 537 476 550T482 570Q482 589 465 596T401 603Q344 603 319 582Q295 558 295 519Q295 493 312 474T355 445T407 432T455 427Q477 427 477 409Q477 395 453 371T389 333Q380 330 345 327T279 312T223 272Q181 223 181 176Q181 131 225 107T324 83Q366 83 395 98T448 136T487 167Q517 185 547 187H551Q574 187 574 170Q574 151 535 113T421 36T271 -15Q260 -16 226 -16Q181 -16 152 -9Q104 4 71 33T37 111Q37 140 50 176T106 263T216 356Q215 357 207 362T190 374T172 392T156 419T150 456Q150 521 208 580T341 670T474 702Q475 703 499 703Q528 703 547 701T586 693T615 673T627 637Q627 584 581 550T495 516",70:"812 567Q804 567 795 570T786 579Q786 586 647 586H559L558 582Q558 575 539 510T506 407L498 384H775Q788 378 790 368Q790 328 746 298T665 268Q646 268 642 284H457L447 261Q396 150 360 94Q329 46 270 8T149 -30Q123 -30 100 -24T63 -10T37 9T22 26T17 36Q17 59 56 88T135 119Q145 119 149 117T165 104Q187 78 227 72Q232 72 234 76Q245 93 273 145T350 323T424 570L428 586H276Q265 575 239 563T190 551Q180 551 174 556T167 569Q167 580 179 597T213 634T278 668T371 685Q374 686 624 686Q863 685 888 682Q917 678 927 663Q930 658 930 650Q930 624 888 596T812 567",71:"50 279Q50 361 88 438T190 570T335 661T503 702H514Q524 703 532 703Q671 703 671 626Q671 580 614 514T495 447Q472 447 472 465Q472 477 499 511T527 562Q527 582 507 592T433 602Q351 602 302 569Q252 535 223 469T194 344Q194 266 237 217T352 168Q401 168 442 205T505 316Q515 345 551 368T622 393H625Q649 393 649 376Q649 371 635 318T612 237Q580 129 540 62T442 -49Q353 -114 264 -114Q259 -114 252 -114L246 -113Q190 -113 142 -107T81 -96Q71 -90 71 -81Q71 -57 110 -30T187 2Q196 2 236 -4T338 -14Q371 -14 377 -9Q410 24 446 113L451 127Q353 68 253 68Q157 68 104 129T50 279",72:"42 447Q20 447 20 465Q20 481 47 515T119 589T239 657T392 686Q443 686 463 664T484 616Q484 570 473 506T452 401L441 360Q441 359 550 359H660L663 370Q684 435 716 522T758 624Q771 646 806 666T870 686Q894 686 894 668Q894 667 867 597T804 416T752 218Q737 135 737 93Q737 77 746 65T778 53Q799 53 803 54T814 63Q831 86 864 103T924 120Q946 120 946 100Q945 85 931 63T888 16T806 -27T684 -48H681Q625 -48 603 -10Q593 4 593 29Q593 71 603 131T624 230L634 269Q632 269 624 266Q610 261 600 261T507 259H411L399 222Q344 62 322 21Q301 -7 268 -24T209 -41H207Q187 -41 185 -25Q185 -17 192 2T220 71T261 184Q284 256 284 258Q284 259 227 259H170Q169 259 166 261T162 264T158 266T156 271T155 277Q155 296 184 320T250 356Q259 358 286 359Q312 359 312 360Q314 372 318 385Q332 450 339 526Q339 530 339 535T340 543Q340 586 296 586Q255 586 227 576T188 553T165 523T146 497Q127 476 97 462T42 447",73:"56 499Q32 499 32 516Q32 540 64 580T165 649Q241 682 365 685Q366 685 376 685T405 685T445 686T496 686T553 686H732Q746 677 746 668Q746 646 711 620T642 587L572 586H503Q479 546 458 479T424 352T383 224T318 111L309 101L412 100H514L523 109Q567 150 618 153Q644 153 644 135Q644 132 642 124Q629 86 581 52T476 6Q454 2 433 2T216 0Q-11 0 -15 2Q-27 6 -27 18Q-27 37 2 61T59 93Q77 100 142 100H198Q255 177 299 369Q337 513 382 574L391 586H348Q261 586 176 576Q163 543 124 521T56 499",74:"286 390Q263 390 263 407Q263 432 293 481T367 566Q511 687 724 687Q738 687 761 687T793 686H923Q937 677 937 668Q937 648 905 623T842 589Q829 587 817 586T802 585T795 583T788 578Q709 506 632 189Q622 153 615 134T588 81T537 17Q482 -39 404 -76T247 -114Q192 -114 158 -100Q53 -61 53 32Q53 59 58 73T79 102Q126 147 177 147Q200 147 200 128Q200 123 198 112T196 96Q196 47 238 17T345 -13Q362 -13 377 -9T404 0T426 16T444 34T459 55T470 76T478 97T483 116T488 132L490 141Q511 222 520 257T554 364T608 486T675 576L685 586H634H612Q532 586 484 564Q453 549 436 526T409 478T395 447Q378 424 345 407T286 390",75:"98 542Q75 542 75 560Q75 588 123 618Q132 624 199 657T275 694Q291 703 315 703Q327 703 332 699T338 690T339 670Q339 596 323 505T283 337T237 194T198 90L181 53Q170 31 136 8T68 -17H65Q40 -17 40 0L76 92Q112 185 150 322T194 564V578L168 565Q125 542 98 542ZM834 142Q834 125 819 100T774 48T692 3T576 -16H560Q540 -16 508 6Q469 33 422 108T342 267T309 398Q309 411 310 417T320 442T347 482Q401 542 517 615T710 702Q712 702 721 702T735 703Q772 703 791 690Q819 674 819 646T792 597T733 574H722Q704 584 704 599Q706 607 700 610T672 617L660 613Q609 595 524 538T423 450V440Q423 376 488 247T604 83Q621 70 640 70Q677 70 701 82Q713 87 718 101T737 132T783 160Q792 163 807 163Q834 163 834 142",76:"63 -17Q41 -17 41 0Q41 22 85 54Q101 68 113 92T133 141T154 219T182 315Q230 462 306 553Q345 599 391 632T478 678T543 697T582 703Q584 703 589 703T598 702Q643 702 666 676T689 613Q689 588 683 575Q674 551 632 524T552 496Q530 496 530 512Q530 517 531 525T533 538Q533 559 522 577T480 596H476Q462 596 451 588T415 544Q350 447 310 281Q284 181 261 136L255 124H285Q342 123 441 107T583 90L596 89Q603 116 647 144T729 173Q751 173 751 157Q751 118 685 60T523 -15Q514 -16 479 -16Q421 -16 320 0T171 18H155L142 10Q98 -17 63 -17",77:"38 20Q38 59 60 99T104 139Q106 139 126 125T176 106H181Q200 106 221 139T286 281Q322 370 342 451T368 581T376 634Q384 657 420 680T487 703Q502 703 507 696T522 649Q538 589 554 537Q579 453 609 372T660 248T686 202Q687 201 739 244T830 322L1166 642Q1225 700 1230 701Q1230 701 1237 703Q1258 703 1258 667L1253 637Q1248 607 1241 558T1227 451T1214 326T1209 202Q1209 77 1232 77Q1237 77 1269 94T1326 112H1329Q1353 112 1353 94Q1353 81 1334 60Q1311 37 1248 7T1150 -24H1141H1135Q1085 -24 1074 26Q1064 75 1064 134Q1064 239 1086 426Q1087 430 1087 434L1061 410Q871 227 783 149L694 76Q653 44 647 40T631 34Q620 34 616 37T594 63Q546 125 514 198Q467 307 423 449L418 466L412 444Q376 310 306 153Q278 88 251 45T201 -18T163 -43T131 -49Q102 -48 70 -31T38 20",78:"47 139Q81 105 122 105Q137 105 147 117Q159 134 182 199T234 381T274 610Q275 634 284 647Q297 666 327 684T389 703Q403 703 408 695T428 645Q480 490 567 298Q628 163 673 103Q674 102 674 102T675 106Q732 331 803 551Q842 674 875 725Q908 775 966 807T1081 840H1084Q1105 840 1105 803Q1105 768 1088 733T1051 689Q1045 686 1032 686Q986 683 948 663T901 624Q881 579 837 430T760 154L726 28Q725 28 725 28T723 25Q716 0 682 -24T611 -48Q600 -48 595 -45T576 -23Q522 44 480 124Q417 243 332 463L328 473L325 457Q291 293 227 124Q159 -49 72 -49Q38 -49 5 -28Q-24 -8 -24 21Q-24 58 -3 98T41 139H47",79:"433 703Q456 703 456 685Q456 672 441 655T407 627Q402 623 378 611T328 579T276 524Q207 434 207 324Q207 222 270 153T441 84Q566 84 651 177T737 400V405Q737 496 693 549T576 603Q542 603 510 560Q490 537 472 502T442 454Q397 412 346 409Q320 409 320 427Q320 430 322 436Q331 465 360 507T433 594T542 671T677 703Q776 703 829 636T882 468Q882 369 831 277T702 122T528 21T343 -17Q214 -17 139 61T63 257Q63 336 94 409T173 534T272 625T367 684T432 703H433",80:"170 -67Q147 -67 147 -49Q147 -42 162 -8T204 99T253 254Q274 332 288 415T305 542L308 585Q277 585 234 577T179 557Q172 550 166 532T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q279 686 448 686H495H537Q622 686 678 677T784 637Q846 598 846 533Q846 452 776 375T597 252T378 206H366L358 181Q341 130 316 68T282 -7Q262 -33 230 -50T170 -67ZM701 468Q701 512 661 540T570 577T461 586H448V582Q446 576 443 545T428 447T395 301L389 280Q390 280 398 284T419 295T441 303Q443 304 484 306T572 321T651 359Q701 402 701 468",81:"874 453Q874 372 836 298T750 177T638 89T543 33T486 8L483 7Q485 5 523 -7T622 -32T726 -46Q741 -46 746 -45T755 -41T762 -27Q770 -1 806 23T878 50H890Q905 42 905 33Q905 -8 838 -68T670 -145Q662 -146 628 -146Q538 -146 389 -100T164 -50Q132 -50 132 -32T162 11T227 47Q231 48 286 51T394 62T518 100T641 180Q730 271 730 387Q730 478 673 540T520 602Q410 602 337 525T264 355Q264 284 310 244T420 203Q476 203 568 222Q594 222 594 204Q594 184 565 161T508 128Q433 103 316 103Q227 103 174 157T120 290Q120 382 182 471T343 620T548 697Q578 703 601 703Q604 703 611 703T623 702Q663 702 687 696Q760 679 817 618T874 453",82:"159 0Q159 5 172 34T205 114T245 229T284 386T309 575V585H304Q303 585 295 585T282 584Q233 579 207 570T175 553T165 531T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q279 686 448 686H505H582Q683 686 745 672T834 611Q842 594 842 565Q842 523 824 484T780 419T722 370T669 336T632 318L619 312L626 302Q640 279 667 227T696 172Q717 133 735 112T762 88T784 84Q824 84 872 118T957 153Q981 153 981 136Q981 114 937 78T820 13T684 -17Q646 -17 616 8T569 66T526 151T477 234Q461 256 446 265Q437 272 421 274Q400 274 400 291Q400 311 430 336T495 371Q496 371 543 374T627 392T681 436Q699 467 699 503Q699 550 644 568T471 586H449V582Q449 581 447 559T438 499T422 413T393 298T348 165Q313 73 296 45Q282 24 249 4T185 -17Q159 -17 159 0",83:"204 476Q204 525 248 577T372 666T539 703T674 683T721 612Q721 588 714 569Q704 547 669 524T601 499Q573 499 573 516Q573 521 575 527T577 543Q577 563 568 574T548 588L539 590Q490 603 444 603Q418 603 394 597T364 583Q348 567 348 533Q348 493 382 466T459 425T555 387T633 330Q662 292 662 249Q662 153 544 69T257 -16Q218 -16 208 -15Q118 1 64 46Q25 76 25 126Q25 185 82 235T203 290H207Q229 290 231 274Q231 243 180 213Q173 209 172 206T170 189T171 170T183 150T216 121Q273 83 356 83Q412 83 459 100Q493 111 507 141Q518 165 518 185Q518 208 506 228T478 262T437 288T398 306T360 320Q316 335 285 352T239 384T215 416T205 443T204 467V476",84:"61 462H59Q38 462 38 479Q38 528 109 594T289 683L304 685L837 687L846 693Q889 720 923 720Q947 720 947 702Q945 671 892 631T776 583Q774 583 772 583T769 582T766 582L764 581H758Q753 581 744 581T722 580T693 580T662 580H563L514 385Q507 355 493 299T475 225T460 172T443 119T426 76T402 24Q386 -11 355 -33T304 -61T266 -69Q242 -69 242 -50Q243 -45 253 -25T278 32T307 115L364 340Q405 511 413 538T436 580H207Q202 572 200 568T197 561T195 552T190 537Q176 511 135 487T61 462",85:"124 586Q107 586 74 569T15 552H13Q-10 552 -10 570Q-10 605 70 645T222 686Q283 686 283 631Q283 590 246 504T172 326T135 181Q135 130 157 107T205 83Q221 83 259 106Q347 165 453 301T604 548Q607 557 612 569T619 587T624 600T628 612T632 621T637 628T641 634T647 640T654 645T662 652Q706 686 748 686Q771 686 771 669Q771 656 754 614T700 467T630 229Q615 168 610 105Q610 88 617 78L641 90Q681 111 706 112Q733 112 733 95Q733 82 714 60Q694 40 633 10Q567 -23 532 -24Q507 -24 495 -17Q466 -4 466 32Q466 96 500 225Q277 -17 102 -17Q56 -17 23 17T-10 118Q-10 164 13 234T64 363T115 481T139 567Q139 586 124 586",86:"25 608Q25 628 60 657T148 686Q184 683 213 671T273 625T327 538T363 394T380 184L381 134L399 148Q503 226 574 302T667 415T689 467Q688 474 684 482T672 502T645 521T600 532Q576 532 576 567Q576 604 597 644T641 685H649Q701 685 737 648T774 545Q774 457 703 333T461 66Q397 13 332 -32T255 -77Q237 -77 237 -30V-23Q241 20 241 109Q241 483 115 569Q91 586 50 589Q25 589 25 608",87:"25 607Q25 629 62 657T142 686Q205 686 248 647T312 541T339 411T347 275Q347 249 345 203V189Q375 219 449 316T587 516Q629 584 629 587Q629 589 626 597T622 607Q622 629 658 656T732 686H744Q755 680 757 678Q757 677 769 649T799 577T835 475T874 339T904 183Q908 157 910 151L925 169Q997 252 1059 343T1121 474Q1120 498 1103 513T1059 532Q1036 532 1036 568Q1036 600 1053 636T1090 683L1097 686H1109Q1147 684 1176 652T1206 551Q1206 460 1131 320T897 7Q859 -33 840 -52T816 -74T804 -77Q788 -77 784 -32Q783 -28 783 -26Q774 108 744 239T691 436T665 501Q664 501 649 475T602 400T528 289T420 146T280 -15Q243 -56 231 -66T210 -77Q191 -77 191 -40Q191 -38 195 -4T204 91T209 217Q209 290 202 351T177 469T126 557T45 589Q25 589 25 607",88:"762 562Q762 579 737 584T711 604Q711 630 753 658T834 686Q864 686 885 669T906 627Q906 580 834 522T614 379L584 362V357Q585 354 589 315T597 233T603 183Q610 132 627 116T671 100Q678 100 704 113T754 126T778 107Q776 79 733 45T626 2Q615 1 578 1Q542 1 535 3Q521 7 510 15T491 31T477 54T467 78T460 108T456 137T452 170T449 201Q447 220 445 240T442 270L441 281Q435 281 357 233Q240 165 206 135Q200 128 200 124Q200 113 208 108T226 101T244 96T252 82Q252 61 214 31T129 1H120Q97 1 77 16T56 60Q56 105 133 168T414 345Q428 352 431 354T433 359Q422 493 414 522Q407 551 395 566T373 583T350 586H341L332 580Q290 560 265 560Q243 560 243 577Q243 585 248 596T269 624T306 653T365 676T447 686H456Q472 686 484 683T514 671T543 637T562 576Q565 557 570 501L577 437Q577 436 613 457T694 506T756 551Q762 558 762 562",89:"73 555Q49 555 49 573Q49 602 110 644T239 686Q319 686 376 624Q416 584 444 511T483 361T499 240T503 173Q503 165 504 165Q506 165 524 184T556 218Q631 297 674 377T718 485Q718 505 699 526Q673 552 628 552Q619 552 613 562T607 590Q607 617 621 645T658 685Q661 686 671 686Q718 686 757 652T797 545Q797 476 749 369T602 146Q500 29 371 -67T176 -164Q112 -164 74 -120T36 -29Q36 5 55 36T95 67Q104 67 108 59T115 39T128 12T154 -12Q183 -30 216 -30Q239 -30 305 7L361 44L367 49V54Q367 95 364 143T351 273T312 429T243 546Q206 581 156 588L146 581Q108 555 73 555",90:"622 574Q522 579 420 579H396Q373 579 364 574T351 550Q339 516 297 490T218 462Q195 462 195 479Q195 487 197 492Q218 565 313 625T509 685Q564 685 650 683T755 680Q787 680 807 683T831 686Q853 686 853 669Q853 657 826 626Q742 532 641 437L619 415L622 414Q626 414 631 414T642 414Q697 411 697 388Q697 367 670 345T607 323Q605 323 592 325T546 329H522L490 302Q457 274 400 226T289 136L260 113L318 112Q345 111 452 109T587 106H627Q650 143 656 170Q666 197 710 225T788 253Q811 253 811 237Q811 211 781 160T710 77Q619 0 515 0Q507 0 497 0T484 1Q434 1 319 3T177 6Q123 6 95 2Q83 2 71 0H68Q46 0 46 17Q46 28 58 44Q68 56 100 80T210 165T383 307L408 329H361L314 330Q297 338 297 350Q297 368 320 388T368 413Q375 415 441 415H506L647 555L664 574H622"},{})},2698:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.texOldstyle=void 0;var H=L(9403),V=L(9474);T.texOldstyle=(0,H.AddPaths)(V.texOldstyle,{48:"39 213Q39 274 53 319T89 389T139 429T192 448T242 452Q347 452 400 400Q460 335 460 213Q460 -22 250 -22Q39 -22 39 213ZM364 242Q364 279 363 301T355 348T338 385T306 406T254 415Q250 415 245 415T238 416Q217 416 190 404T150 368Q136 339 136 221Q136 114 146 78T200 23Q219 16 250 16Q280 16 299 23Q341 41 352 77T364 221V242",49:"116 410Q176 412 215 423T269 443T288 453H291Q293 453 301 447V254Q301 62 303 60Q307 52 322 49T394 46Q418 46 422 43T426 23Q426 8 424 4T411 0Q407 0 369 1T258 2T148 1T106 0Q96 0 94 4T91 23Q91 40 95 43T123 46Q180 46 195 49T215 61Q216 63 216 220V376Q192 367 119 364H93L86 371V403L92 410H116",50:"55 334Q55 386 105 419T236 453Q333 453 390 413T448 307Q448 278 437 256T406 218T365 193T318 172T277 151L248 134Q219 118 191 102T163 84T267 83L382 85H391Q399 99 406 126Q410 143 413 145T429 148Q440 148 442 147T449 139Q449 137 435 73T420 7Q420 6 414 0H233Q94 0 71 0T46 5Q46 5 46 6Q44 8 44 24Q44 39 46 41Q47 44 98 78T212 155T294 212Q347 257 347 304Q347 354 306 380T203 407Q150 407 120 377Q118 375 123 373Q146 362 146 332Q146 315 133 302T101 288Q85 288 70 298T55 334",51:"69 312Q69 377 122 414T233 452Q333 452 381 409T430 313Q430 268 402 223T311 149L301 144Q307 143 317 140T355 123T402 92T439 44T456 -25Q456 -101 396 -158T241 -216Q154 -216 98 -173T42 -68Q42 -58 44 -50T50 -35T57 -25T66 -17T75 -13T82 -10L87 -8Q92 -7 102 -7Q132 -7 147 -25T162 -66Q162 -112 118 -125L113 -126Q113 -129 127 -140T173 -162T239 -173Q268 -173 292 -158Q345 -124 345 -24Q345 33 329 67Q298 125 229 125H210H172Q166 131 166 142Q166 159 172 161Q178 161 208 164T244 169Q251 169 263 176T291 199T316 245T327 314Q327 413 238 413Q182 413 130 369Q177 350 181 312Q181 289 166 273T125 257Q102 257 86 272T69 312",52:"163 0Q139 0 109 0T71 -1Q43 -1 36 2T28 15V27V46L190 270Q325 457 330 462Q333 464 352 464H371L377 458V46H464L471 40V6L464 0H377V-65V-108Q377 -131 379 -137T391 -144Q409 -148 446 -148H464Q468 -151 471 -155V-187L464 -194H453Q395 -192 325 -192Q222 -192 210 -194H199L193 -188V-154L199 -148H228Q241 -148 250 -148T265 -146T275 -145T281 -143T284 -141T286 -138T289 -134V0H163ZM295 46V350L75 46H295",53:"159 -44Q159 -66 145 -80T109 -96H102L107 -105Q148 -173 228 -173Q255 -173 280 -162Q351 -128 351 -6V8Q351 67 344 98T316 151Q288 176 255 176Q175 176 136 109Q129 100 114 100Q97 100 95 106Q93 110 93 277V403Q93 451 98 451Q100 452 103 452Q105 452 124 445T177 431T251 423Q294 423 328 430T380 445T401 453Q410 453 410 435V422Q332 331 203 331Q152 331 140 339Q139 339 139 254V168Q194 214 256 214Q332 214 390 154T448 0Q448 -95 381 -155T229 -216Q153 -216 104 -166T50 -49Q50 -15 66 -1T105 13Q128 13 143 -3T159 -44",54:"42 313Q42 401 68 472T133 583T215 644T296 665H304Q317 665 329 664T360 657T393 640T418 608T432 557Q432 533 422 519T401 502T380 498Q358 498 343 512T328 550Q328 591 367 601L372 602Q372 604 365 609T341 620T307 626Q260 626 226 600T174 537Q147 483 143 376V356Q192 434 266 434Q317 434 357 409Q406 375 435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM251 396Q211 396 178 354T145 217Q145 159 152 122T166 73T187 47Q216 21 252 21Q294 21 321 47Q342 68 349 99T356 203V232Q356 264 354 285T345 331T322 373T280 395Q274 396 251 396",55:"75 246Q64 246 62 247T55 255Q55 259 72 357T90 458L94 462H99Q104 463 109 463H121Q128 460 128 452Q128 445 134 441T165 435T233 432T356 431H478L485 425V392L414 298Q408 290 385 260T358 223T337 191T317 154T302 116T289 68T282 14T275 -55T274 -137Q274 -173 272 -177Q262 -216 223 -216Q170 -216 170 -157V-148Q172 -78 189 -12T237 109T288 196T338 266Q345 275 348 279Q395 340 395 342Q396 343 376 343T274 343Q122 342 117 339T103 294T90 248Q88 246 75 246",56:"69 496Q69 570 124 618T247 666Q321 666 375 624T429 515Q429 468 405 433T320 361L346 344Q385 320 403 301T439 250Q456 212 456 181V172V160Q456 141 449 119T426 71T386 26T326 -8T246 -21Q160 -21 102 30T43 155Q43 265 167 332L176 337L161 347Q105 384 87 423Q69 458 69 496ZM371 513Q371 567 334 596T249 626Q198 626 163 598T127 532Q127 521 129 511T138 492T150 476T167 460T185 447T207 433T228 420L284 384L294 391Q346 424 363 469Q371 486 371 513ZM190 21T250 21T351 56T393 140Q393 180 362 213Q354 221 317 246T246 292L212 313Q210 313 200 307T173 287T142 256T117 212T106 157Q106 100 148 61",57:"171 -101Q171 -118 163 -130T146 -146T134 -151Q132 -151 132 -152Q132 -154 140 -159T167 -168T206 -173Q274 -173 317 -108Q356 -50 356 79V86L350 77Q308 9 231 9Q150 9 92 81Q42 141 42 228Q42 289 64 333Q93 390 142 421T235 452Q237 452 244 452T255 453Q289 453 321 439T386 391T437 290T457 128Q457 -29 381 -122T206 -216Q148 -216 108 -187T67 -104Q67 -75 84 -62T119 -49Q141 -49 156 -63T171 -101ZM242 46Q293 46 324 94T355 223Q355 323 337 356Q316 401 275 410Q267 412 248 412Q206 412 179 386Q155 360 149 328T143 224Q143 120 163 88Q192 46 242 46",65:"576 668Q576 688 606 708T660 728Q676 728 675 712V571Q675 409 688 252Q696 122 720 57Q722 53 723 50T728 46T732 43T737 41T743 39L754 45Q788 61 803 61Q819 61 819 47Q818 43 814 35Q799 15 755 -7T675 -30Q659 -30 648 -25T630 -8T621 11T614 34Q603 77 599 106T594 146T591 160V163H460L329 164L316 145Q241 35 196 -7T119 -50T59 -24T30 43Q30 75 46 100T74 125Q81 125 83 120T88 104T96 84Q118 57 151 57Q189 57 277 182Q432 400 542 625L559 659H567Q574 659 575 660T576 668ZM584 249Q579 333 577 386T575 473T574 520V581L563 560Q497 426 412 290L372 228L370 224H371L383 228L393 232H586L584 249",66:"304 342Q292 342 292 353Q292 372 323 391Q331 396 417 428T533 487Q563 512 563 555V562Q563 575 557 589T530 618T475 636Q429 636 396 613T330 539Q263 446 210 238Q196 183 173 120Q135 31 121 16Q108 1 85 -10T47 -22T32 -10Q32 -5 44 18T77 93T112 206Q135 296 154 395T182 550T191 615Q191 616 190 616Q188 616 179 611T157 601T131 594Q113 594 113 605Q113 623 144 644Q154 650 205 676T267 703Q277 705 279 705Q295 705 295 693Q295 686 288 635T278 575Q278 572 287 582Q336 635 402 669T540 704Q603 704 633 673T664 599Q664 559 638 523T580 462Q553 440 504 413L491 407L504 402Q566 381 596 338T627 244Q627 172 575 110T444 13T284 -22Q208 -22 158 28Q144 42 146 50Q150 67 178 85T230 103Q236 103 246 95T267 75T302 56T357 47Q436 47 486 93Q526 136 526 198V210Q526 228 518 249T491 292T436 330T350 345Q335 345 321 344T304 342",67:"201 -25Q167 -25 136 -14T75 23T29 94T12 202Q12 290 50 394T161 574Q227 642 303 673T433 704Q435 705 457 705Q533 701 533 640Q533 606 507 548T464 474Q431 444 396 444Q381 444 381 453Q381 459 388 473T407 513T428 563Q433 580 433 594Q433 636 381 636Q314 636 260 594T175 489T128 363T112 247Q112 157 153 101T273 44Q347 44 398 121Q413 144 437 157T481 171Q496 171 496 160Q496 150 476 123Q426 56 350 16T201 -25",68:"37 475Q19 475 19 487Q19 536 103 604T327 682H356Q386 683 408 683H419Q475 683 506 681T582 668T667 633Q766 571 766 450Q766 365 723 287T611 152T455 57T279 6Q248 1 160 0Q148 0 131 0T108 -1Q72 -1 72 11Q72 24 90 40T133 64L144 68L152 88Q247 328 272 587Q275 613 272 613Q272 613 269 613Q225 610 195 602T149 579T129 556T119 532Q118 530 116 525T113 518Q102 502 80 490T37 475ZM665 407Q665 596 412 613Q403 614 383 614Q370 614 370 612Q370 598 363 542T323 357T242 103L228 69H265Q391 73 481 119Q536 148 575 188T633 268T658 338T665 392V407",69:"144 470Q144 556 240 630T451 705Q564 705 564 637Q564 611 540 573Q529 559 505 547T464 534Q448 534 448 545Q448 552 455 562Q463 577 463 591Q463 600 462 604T456 616T436 627T400 635Q396 635 390 635T380 636Q291 636 258 568Q245 544 245 516Q245 463 290 438T391 410Q415 410 415 398Q415 392 407 380T376 356T326 341Q288 340 260 327Q218 311 187 276T143 208T130 151Q130 113 156 88T211 55T268 47Q349 47 403 125Q415 144 439 157T483 171Q499 171 499 160Q499 148 475 120T413 59T315 3T197 -22Q124 -22 77 14T30 105Q30 126 39 154T66 216T122 288T209 354L223 362Q144 400 144 470",70:"199 579Q181 579 181 590Q181 598 188 611T212 639T260 666T335 682Q336 682 349 682T383 682T431 682T493 683T561 683Q776 682 784 681Q826 673 829 647Q829 620 797 600T744 580Q728 580 728 595Q729 607 713 610Q698 613 598 614H500L499 610Q499 598 467 486T428 367Q428 365 551 365H674Q683 360 684 355Q687 346 677 329Q666 312 642 299T598 285Q586 285 582 296H402L394 277Q386 258 373 229T346 167T315 102T286 51Q265 22 225 -5T133 -32Q108 -32 87 -25T54 -7T33 15T21 35T18 47Q18 60 44 80T98 103Q108 103 111 101T119 88Q130 66 150 54T179 39T195 37Q199 37 203 43Q217 67 245 125T318 300T391 532Q393 543 398 564T406 598T409 613T339 614H269Q229 579 199 579",71:"216 68Q155 68 115 100T59 177T44 273Q44 299 50 333T73 421T133 533T239 632Q346 704 466 704Q508 704 515 703Q555 696 577 681T599 635Q599 605 570 560T523 496Q490 466 455 466Q440 466 440 475T469 526T499 589Q499 605 489 617Q460 636 403 636Q343 636 295 611T220 548T174 464T150 382T144 318Q144 241 180 189T287 137Q325 137 359 160Q428 205 466 322Q472 342 501 359T551 376Q557 376 560 373T564 368L565 365Q560 341 551 302T512 173T451 31Q359 -119 204 -119Q163 -118 127 -109T74 -91T53 -77Q52 -75 52 -71Q52 -54 79 -35T132 -14H140L151 -19Q210 -49 281 -49H289Q312 -49 329 -31Q351 -7 372 36T405 109T416 142L408 136Q401 131 392 125T369 111T338 96T303 82T261 72T216 68",72:"18 487Q18 496 29 517T67 566T127 621T216 665T330 683Q359 683 376 669T397 643T400 622Q400 584 382 488T348 343Q348 342 467 342H587L594 366Q615 440 648 534T690 641Q701 656 723 669T764 683Q783 683 783 672L750 578Q716 485 677 346T625 101Q624 92 623 82T622 65T621 56Q621 20 658 20Q666 20 701 25Q709 52 736 69T785 87Q803 87 803 75T791 44T754 3T685 -33T588 -48Q568 -48 562 -46Q522 -31 522 13V23Q531 129 562 250L569 281L565 280Q561 278 556 277T549 274L438 273H328L321 249Q307 202 275 107T232 0Q219 -16 196 -28T155 -41Q149 -41 145 -39T140 -34T139 -29Q139 -24 148 -3T181 86T233 247Q240 270 240 272Q240 273 194 273H169Q139 273 139 285Q139 295 153 308T187 332Q206 341 236 342L260 343L264 359Q278 414 289 482T300 578Q300 613 260 613H254Q198 613 169 592Q148 578 127 544T104 508Q72 478 37 475Q18 475 18 487",73:"174 0H31Q-13 0 -21 2T-30 12Q-30 23 -17 36Q9 60 42 68L155 70Q187 102 214 179T257 333T302 491T366 610L369 614H305Q221 611 188 607T145 596T128 569Q119 543 94 529T47 512Q28 512 28 524Q28 527 32 539Q56 614 159 654Q218 678 312 682Q314 682 339 682T404 682T481 683H632Q642 678 642 671Q642 657 621 641T577 617Q570 615 507 614H444Q427 592 406 542Q382 478 355 366T310 209Q280 123 238 78L230 69H330Q442 70 442 74Q443 74 443 77T447 87T460 105Q490 134 527 137Q545 137 545 125Q545 120 542 112Q531 78 491 49T399 7Q379 2 360 2T174 0",74:"148 78Q148 16 189 -17T286 -50Q319 -50 348 -33T396 10T426 59T444 101L471 204Q498 306 521 372Q575 532 649 605L659 614H591Q517 613 494 607Q433 591 400 550T360 477Q353 454 325 437T275 419Q256 419 260 435Q280 523 376 597T583 681Q603 683 713 683H830Q839 674 839 671Q839 654 810 634T754 614Q735 614 721 601Q688 571 654 495T600 351T561 209T541 132Q507 29 412 -45T213 -119Q141 -119 94 -77T47 33Q47 55 50 69T58 90T71 103Q105 131 135 131Q152 131 152 120Q152 119 151 114T149 99T148 78",75:"194 618Q193 618 182 613T156 601T131 594Q113 594 113 605Q113 623 144 644Q154 650 205 676T267 703Q277 705 279 705Q295 705 295 691Q295 569 250 397Q225 306 197 217T151 81T128 25Q120 8 94 -7T47 -22Q32 -22 32 -10L64 76Q95 163 133 295T185 530Q198 611 194 618ZM331 429Q331 383 364 290T449 117T542 36Q574 36 607 51T652 103Q660 124 677 133T709 143Q727 143 727 128Q727 119 723 111Q704 56 639 17T497 -22H493Q463 -22 425 16Q401 40 382 71Q335 138 296 243T256 399Q256 434 288 473Q342 540 471 622T670 705Q691 704 703 696Q732 678 732 644Q732 613 714 600T677 586Q671 586 667 587T660 592T657 604V619Q657 647 629 647Q623 647 620 646Q576 635 495 583T365 482Q331 448 331 429",76:"62 -22T47 -22T32 -11Q32 -1 56 24T83 55Q113 96 138 172T180 320T234 473T323 609Q364 649 419 677T531 705Q559 705 578 696T604 671T615 645T618 623V611Q618 582 615 571T598 548Q581 531 558 520T518 509Q503 509 503 520Q503 523 505 536T507 560Q507 590 494 610T452 630Q423 630 410 617Q367 578 333 492T271 301T233 170Q211 123 204 112L198 103L224 102Q281 102 369 79T509 52H523Q535 64 544 87T579 128Q616 152 641 152Q656 152 656 142Q656 101 588 40T433 -22Q381 -22 289 1T156 28L141 29L131 20Q111 0 87 -11",77:"28 9Q28 37 43 63T73 90Q77 90 83 84T103 70T141 57H146Q162 57 178 79T222 167Q266 279 295 371T334 513T349 598T358 651T371 677Q397 705 432 705Q442 705 445 699T452 666Q453 661 453 659Q475 538 509 405T568 207L574 192Q581 178 587 164T594 150Q596 150 635 189T693 248Q765 324 863 438T1024 626T1089 701Q1093 705 1100 705Q1111 705 1111 682Q1111 675 1108 660T1099 611T1086 540Q1041 277 1041 144Q1041 98 1044 75T1050 48T1059 42Q1064 41 1075 46Q1102 61 1121 61Q1137 61 1137 50Q1137 28 1087 0T1000 -29Q983 -29 972 -23T955 -9T945 16T942 45T941 83V96Q941 158 952 256T974 422L985 489Q984 489 939 436T821 300T698 164Q665 128 620 85T568 37Q564 34 558 34Q550 34 546 37T535 54Q512 91 496 127T450 259T389 498L384 518Q349 367 294 223T198 15Q155 -50 117 -50Q87 -50 61 -35T30 -6Q28 2 28 9",78:"343 705Q358 705 358 698Q360 696 370 658T411 524T484 319Q536 174 590 82L595 73L615 152Q646 274 683 407Q729 571 752 637T799 727Q852 780 937 788Q939 788 947 788T958 789H962Q979 789 979 765Q979 722 951 692Q942 683 924 683Q888 681 859 672T818 654T803 639Q784 608 708 322T631 15Q631 14 630 15Q630 17 629 15Q628 14 628 12Q621 -4 601 -17T560 -31Q550 -31 546 -28T530 -7Q484 67 458 123T398 272Q352 392 314 514L306 535V534Q306 533 296 488T272 379T234 239T185 100T127 -7T61 -50Q34 -50 4 -34T-27 8Q-27 33 -12 61T18 90Q21 90 36 77T87 57H92Q109 57 123 78T162 173Q206 299 232 417T265 599T276 667Q284 681 304 693T343 705",79:"308 428Q289 428 289 438Q289 457 318 508T378 593Q417 638 475 671T599 705Q688 705 732 643T777 483Q777 380 733 285T620 123T464 18T293 -22Q188 -22 123 51T58 245Q58 327 87 403T159 533T249 626T333 685T388 705Q404 705 404 693Q404 674 363 649Q333 632 304 606T239 537T181 429T158 290Q158 179 214 114T364 48Q489 48 583 165T677 438Q677 473 670 505T648 568T601 617T528 636Q518 636 513 635Q486 629 460 600T419 544T392 490Q383 470 372 459Q341 430 308 428",80:"37 475Q19 475 19 487Q19 536 103 604T327 682Q329 682 344 682T380 682T421 683H463Q625 683 695 615Q718 591 726 564Q733 547 733 525Q733 412 607 312T321 205H312Q293 205 293 217Q293 224 302 236T333 260T385 274Q558 287 614 407Q633 445 633 477Q633 515 612 543T556 585T481 607T399 614H370L368 603Q352 463 312 312T242 82T202 -13Q190 -33 164 -45T121 -57Q108 -57 108 -45Q108 -40 120 -10T151 73T192 190T233 349T266 539Q267 546 269 565T272 598T274 613H270Q209 613 163 588Q131 572 113 518Q102 502 80 490T37 475",81:"114 286Q114 358 151 433T249 569T392 667T558 705Q653 705 713 641T774 460Q774 389 750 322T687 206T600 114T504 46T412 4L399 -2Q542 -62 636 -62Q660 -62 670 -54T686 -27T700 0Q734 34 770 34Q787 34 787 23Q787 -18 720 -74T563 -131Q485 -131 350 -83T145 -34Q127 -34 127 -22Q127 -12 144 5T190 31L200 34L237 35Q386 38 467 79Q550 120 612 210T675 416Q675 510 625 573T484 636Q410 636 346 587T248 469T214 333Q214 306 221 281T243 229T288 188T360 172Q403 172 441 188T490 205Q510 205 510 192Q505 162 432 132T287 102Q206 102 160 155T114 286",82:"37 475Q19 475 19 487Q19 503 35 530T83 589T180 647T327 682H374Q387 682 417 682T464 683Q519 683 559 679T642 663T708 625T731 557Q731 481 668 411T504 300Q506 296 512 286T528 257T553 202Q594 105 611 82Q635 47 665 47Q708 47 742 93Q758 113 786 128Q804 136 819 137Q837 137 837 125Q837 115 818 92T767 43T687 -2T589 -22Q549 -22 517 22T467 120T422 221T362 273Q346 273 346 287Q348 301 373 320T436 342Q437 342 446 343T462 345T481 348T504 353T527 362T553 375T577 393Q598 412 614 443T630 511Q630 545 613 566T541 600T393 614Q370 614 370 613L366 584Q349 446 311 307T243 96L213 25Q205 8 179 -7T132 -22Q125 -22 120 -18T117 -8Q117 -5 130 26T163 113T205 239T246 408T274 606V614Q273 614 259 613T231 609T198 602T163 588Q131 572 113 518Q102 502 80 490T37 475",83:"554 512Q536 512 536 522Q536 525 539 539T542 564Q542 588 528 604Q515 616 482 625T410 635Q374 635 349 624T312 594T295 561T290 532Q290 505 303 482T342 442T378 419T409 404Q435 391 451 383T494 357T535 323T562 282T574 231Q574 133 464 56T220 -22Q138 -22 78 21T18 123Q18 184 61 227T156 274Q178 274 178 263Q178 260 177 258Q172 247 164 239T151 227T136 218L127 213L124 202Q118 186 118 163Q120 124 165 86T292 48Q374 48 423 86T473 186V193Q473 267 347 327Q268 364 239 389Q191 431 191 486Q191 547 242 600T356 679T470 705Q472 705 478 705T489 704Q551 704 596 682T642 610Q642 566 621 545Q592 516 554 512",84:"49 475Q34 475 34 490Q34 552 106 611T261 681Q272 683 507 683H742Q790 717 816 717Q833 717 833 708Q833 682 795 653T714 615Q691 610 588 609Q490 609 490 607L483 580Q476 554 462 496T435 392Q410 289 395 231T363 116T335 34T309 -15T279 -47T242 -64Q231 -68 218 -68Q203 -68 203 -57Q203 -52 211 -38Q224 -7 234 20T251 66T268 123T283 179T304 261T328 360Q342 415 360 488Q380 567 384 582T397 605Q400 607 401 609H302H244Q200 609 188 607T167 596Q145 572 145 541Q145 520 109 498T49 475",85:"8 592Q8 616 70 649T193 683Q246 683 246 631Q246 587 205 492T124 297T83 143Q83 101 100 75T154 48Q202 48 287 135T450 342T560 553Q589 635 593 640Q603 656 626 668T669 683H670Q687 683 687 672T670 616T617 463T547 220Q525 137 521 68Q521 54 522 50T533 42L543 47Q573 61 588 61Q604 61 604 47Q599 16 506 -22Q486 -28 468 -28T436 -18T421 18Q421 92 468 258Q468 259 467 257T459 248Q426 206 391 167T303 81T194 6T83 -22Q66 -22 58 -20Q25 -11 4 19T-17 99Q-17 146 8 220T64 358T120 488T146 586Q146 604 141 608T123 613H120Q99 613 72 597T25 580Q8 580 8 592",86:"25 633Q25 647 47 665T100 683Q291 683 291 306Q291 264 288 213T282 132L279 102Q281 102 308 126T378 191T464 279T545 381T596 479Q600 490 600 502Q600 527 581 550T523 577Q505 577 505 601Q505 622 516 647T542 681Q546 683 558 683Q605 679 631 645T658 559Q658 423 487 215Q409 126 308 37T190 -52Q177 -52 177 -28Q177 -26 183 15T196 127T203 270Q203 356 192 421T165 523T126 583T83 613T41 620Q25 620 25 633",87:"25 633Q25 647 46 665T103 683Q168 683 207 632Q228 608 243 568Q269 485 269 374Q269 324 265 271T256 184L251 150L252 152Q254 153 257 157T264 167T274 180T286 197Q359 293 424 398T519 558T549 616Q549 618 547 624T545 638Q550 654 572 668T615 683Q626 683 632 672T657 595Q726 370 741 128L742 110Q752 122 767 142T823 217T894 321T950 424T976 511Q976 544 958 560T918 577Q906 577 906 602Q906 629 918 651T942 681Q948 683 954 683Q983 683 1008 658T1034 569T999 421T915 257T813 109T724 -3T681 -49Q666 -59 660 -45Q659 -41 657 35T639 233T591 477Q573 551 570 551Q569 551 554 523T507 439T433 315T323 155T182 -25Q160 -52 151 -53Q137 -53 137 -30Q137 -29 148 25T170 168T181 338Q181 424 168 483T131 571T87 609T40 620Q25 620 25 633",88:"324 614Q291 576 250 573Q231 573 231 584Q231 589 232 592Q235 601 244 614T271 643T324 671T400 683H403Q462 683 481 610Q485 594 490 545T498 454L501 413Q504 413 551 442T648 509T705 561Q707 565 707 578Q707 610 682 614Q667 614 667 626Q667 641 695 662T755 683Q765 683 775 680T796 662T807 623Q807 596 792 572T713 499T530 376L505 361V356Q508 346 511 278T524 148T557 75Q569 69 580 69Q585 69 593 77Q624 108 660 110Q667 110 670 110T676 106T678 94Q668 59 624 30T510 0Q487 0 471 9T445 32T430 71T422 117T417 173Q416 183 416 188Q413 214 411 244T407 286T405 299Q403 299 344 263T223 182T154 122Q152 118 152 105Q152 69 180 69Q183 69 187 66T191 60L192 58V56Q192 41 163 21T105 0Q94 0 84 3T63 21T52 60Q52 77 56 90T85 131T155 191Q197 223 259 263T362 327T402 352L391 489Q391 492 390 505T387 526T384 547T379 568T372 586T361 602T348 611Q346 612 341 613T333 614H324",89:"65 599Q65 618 107 650T204 683Q267 683 312 643T380 533T414 385T424 217Q424 186 423 160T422 123Q426 123 468 170T567 304T650 469Q661 503 661 519Q661 546 639 570Q615 591 583 591Q569 591 569 616Q569 640 582 661T613 683Q624 683 638 679T671 664T702 625T714 558Q714 472 639 329T426 45Q361 -21 282 -82T154 -143Q97 -143 64 -104T31 -20Q31 4 44 25T70 46Q78 46 81 39T87 16T97 -9Q127 -51 182 -51Q184 -51 187 -50H190Q233 -41 314 25Q330 36 330 40Q336 79 336 178Q336 508 223 594Q199 614 158 619L148 620L139 611Q111 586 83 586Q65 586 65 599",90:"694 220Q708 220 708 210Q708 195 695 167T658 105T593 42T502 3Q492 1 458 1Q400 1 293 11T150 22Q116 22 92 11T51 0Q37 0 37 10Q37 21 63 44T179 146T367 319L391 343H343L296 344Q285 350 285 358Q285 365 289 372T300 383T313 392T324 398L329 400H450L561 518Q597 558 607 571L621 587H596Q553 589 484 599T383 609Q342 609 326 596T301 555Q294 533 263 514T208 492Q189 492 189 503Q189 510 197 528T215 559Q249 607 318 645T466 683Q504 683 573 673T669 662L690 661Q734 682 748 683Q767 683 767 673Q767 666 746 640Q655 531 555 428L529 400Q529 399 543 399Q604 397 604 366Q604 350 587 337T551 322Q541 322 539 323Q529 328 529 334Q529 339 487 342L470 343L446 320Q272 153 200 96L235 95Q297 95 392 86T533 74H554Q586 116 597 159Q604 179 635 199T694 220"},{})},5211:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.texSize3=void 0;var H=L(9403),V=L(584);T.texSize3=(0,H.AddPaths)(V.texSize3,{40:"701 -940Q701 -943 695 -949H664Q662 -947 636 -922T591 -879T537 -818T475 -737T412 -636T350 -511T295 -362T250 -186T221 17T209 251Q209 962 573 1361Q596 1386 616 1405T649 1437T664 1450H695Q701 1444 701 1441Q701 1436 681 1415T629 1356T557 1261T476 1118T400 927T340 675T308 359Q306 321 306 250Q306 -139 400 -430T690 -924Q701 -936 701 -940",41:"34 1438Q34 1446 37 1448T50 1450H56H71Q73 1448 99 1423T144 1380T198 1319T260 1238T323 1137T385 1013T440 864T485 688T514 485T526 251Q526 134 519 53Q472 -519 162 -860Q139 -885 119 -904T86 -936T71 -949H56Q43 -949 39 -947T34 -937Q88 -883 140 -813Q428 -430 428 251Q428 453 402 628T338 922T245 1146T145 1309T46 1425Q44 1427 42 1429T39 1433T36 1436L34 1438",47:"81 -949Q71 -949 63 -941T55 -921Q55 -917 56 -915Q59 -906 498 264T939 1438Q945 1450 960 1450Q972 1450 980 1441T988 1421Q982 1403 839 1020L398 -155Q107 -934 103 -938Q96 -949 81 -949",91:"247 -949V1450H516V1388H309V-887H516V-949H247",92:"988 -922Q988 -933 980 -941T962 -949Q947 -949 940 -938Q936 -934 645 -155L204 1020Q56 1416 56 1424Q56 1433 62 1441T84 1450Q97 1448 103 1439Q107 1435 398 656L839 -519Q988 -918 988 -922",93:"11 1388V1450H280V-949H11V-887H218V1388H11",123:"618 -943L612 -949H582L568 -943Q472 -903 411 -841T332 -703Q327 -682 327 -653T325 -350Q324 -28 323 -18Q317 24 301 61T264 124T221 171T179 205T147 225T132 234Q130 238 130 250Q130 255 130 258T131 264T132 267T134 269T139 272T144 275Q207 308 256 367Q310 436 323 519Q324 529 325 851Q326 1124 326 1154T332 1205Q369 1358 566 1443L582 1450H612L618 1444V1429Q618 1413 616 1411L608 1406Q599 1402 585 1393T552 1372T515 1343T479 1305T449 1257T429 1200Q425 1180 425 1152T423 851Q422 579 422 549T416 498Q407 459 388 424T346 364T297 318T250 284T214 264T197 254L188 251L205 242Q290 200 345 138T416 3Q421 -18 421 -48T423 -349Q423 -397 423 -472Q424 -677 428 -694Q429 -697 429 -699Q434 -722 443 -743T465 -782T491 -816T519 -845T548 -868T574 -886T595 -899T610 -908L616 -910Q618 -912 618 -928V-943",125:"131 1414T131 1429T133 1447T148 1450H153H167L182 1444Q276 1404 336 1343T415 1207Q421 1184 421 1154T423 851L424 531L426 517Q434 462 460 415T518 339T571 296T608 274Q615 270 616 267T618 251Q618 241 618 238T615 232T608 227Q542 194 491 132T426 -15L424 -29L423 -350Q422 -622 422 -652T415 -706Q397 -780 337 -841T182 -943L167 -949H153Q137 -949 134 -946T131 -928Q131 -914 132 -911T144 -904Q146 -903 148 -902Q299 -820 323 -680Q324 -663 325 -349T327 -19Q355 145 541 241L561 250L541 260Q356 355 327 520Q326 537 325 850T323 1181Q315 1227 293 1267T244 1332T193 1374T151 1401T132 1413Q131 1414 131 1429",710:"1439 564Q1434 564 1080 631T722 698Q719 698 362 631Q7 564 4 564L0 583Q-4 602 -4 603L720 772L1083 688Q1446 603 1447 603Q1447 602 1443 583L1439 564",732:"1 643Q1 646 76 671T271 722T476 749Q555 749 626 736T742 706T856 676T999 662Q1088 662 1192 684T1363 727T1432 749Q1432 745 1437 731T1442 716Q1442 714 1381 693T1212 645T1012 611Q1000 610 955 610Q851 610 701 653T444 697Q355 697 251 676T80 632T11 610Q11 614 6 628T1 643",770:"-5 564Q-9 564 -363 631T-722 698Q-725 698 -1082 631Q-1437 564 -1440 564L-1444 583Q-1448 602 -1448 603L-724 772L-361 688Q2 603 3 603Q3 602 -1 583L-5 564",771:"-1443 643Q-1443 646 -1368 671T-1173 722T-968 749Q-889 749 -818 736T-702 706T-588 676T-445 662Q-356 662 -252 684T-81 727T-12 749Q-12 745 -7 731T-2 716Q-2 714 -63 693T-232 645T-432 611Q-444 610 -489 610Q-593 610 -743 653T-1000 697Q-1089 697 -1193 676T-1364 632T-1433 610Q-1433 614 -1438 628T-1443 643",8260:"81 -949Q71 -949 63 -941T55 -921Q55 -917 56 -915Q59 -906 498 264T939 1438Q945 1450 960 1450Q972 1450 980 1441T988 1421Q982 1403 839 1020L398 -155Q107 -934 103 -938Q96 -949 81 -949",8730:"424 -948Q422 -947 313 -434T202 80L170 31Q165 24 157 10Q137 -21 137 -21Q131 -16 124 -8L111 5L264 248L473 -720Q473 -717 727 359T983 1440Q989 1450 1001 1450Q1007 1450 1013 1445T1020 1433Q1020 1425 742 244T460 -941Q458 -950 439 -950H436Q424 -950 424 -948",8968:"246 -949V1450H571V1388H308V-949H246",8969:"11 1388V1450H336V-949H274V1388H11",8970:"246 -949V1450H308V-887H571V-949H246",8971:"274 -887V1450H336V-949H11V-887H274",9001:"126 242V259L361 845Q595 1431 597 1435Q610 1450 624 1450Q634 1450 644 1443T654 1419V1411L422 831Q190 253 190 250T422 -331L654 -910V-919Q654 -936 644 -943T624 -950Q612 -950 597 -935Q595 -931 361 -345L126 242",9002:"94 1424Q94 1426 97 1432T107 1444T124 1450Q141 1450 152 1435Q154 1431 388 845L623 259V242L388 -345Q153 -933 152 -934Q142 -949 127 -949H125Q95 -949 95 -919V-910L327 -331Q559 247 559 250T327 831Q94 1411 94 1424",10216:"126 242V259L361 845Q595 1431 597 1435Q610 1450 624 1450Q634 1450 644 1443T654 1419V1411L422 831Q190 253 190 250T422 -331L654 -910V-919Q654 -936 644 -943T624 -950Q612 -950 597 -935Q595 -931 361 -345L126 242",10217:"94 1424Q94 1426 97 1432T107 1444T124 1450Q141 1450 152 1435Q154 1431 388 845L623 259V242L388 -345Q153 -933 152 -934Q142 -949 127 -949H125Q95 -949 95 -919V-910L327 -331Q559 247 559 250T327 831Q94 1411 94 1424",12296:"126 242V259L361 845Q595 1431 597 1435Q610 1450 624 1450Q634 1450 644 1443T654 1419V1411L422 831Q190 253 190 250T422 -331L654 -910V-919Q654 -936 644 -943T624 -950Q612 -950 597 -935Q595 -931 361 -345L126 242",12297:"94 1424Q94 1426 97 1432T107 1444T124 1450Q141 1450 152 1435Q154 1431 388 845L623 259V242L388 -345Q153 -933 152 -934Q142 -949 127 -949H125Q95 -949 95 -919V-910L327 -331Q559 247 559 250T327 831Q94 1411 94 1424"},{})},8742:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.texSize4=void 0;var H=L(9403),V=L(4324);T.texSize4=(0,H.AddPaths)(V.texSize4,{40:"758 -1237T758 -1240T752 -1249H736Q718 -1249 717 -1248Q711 -1245 672 -1199Q237 -706 237 251T672 1700Q697 1730 716 1749Q718 1750 735 1750H752Q758 1744 758 1741Q758 1737 740 1713T689 1644T619 1537T540 1380T463 1176Q348 802 348 251Q348 -242 441 -599T744 -1218Q758 -1237 758 -1240",41:"33 1741Q33 1750 51 1750H60H65Q73 1750 81 1743T119 1700Q554 1207 554 251Q554 -707 119 -1199Q76 -1250 66 -1250Q65 -1250 62 -1250T56 -1249Q55 -1249 53 -1249T49 -1250Q33 -1250 33 -1239Q33 -1236 50 -1214T98 -1150T163 -1052T238 -910T311 -727Q443 -335 443 251Q443 402 436 532T405 831T339 1142T224 1438T50 1716Q33 1737 33 1741",47:"1166 1738Q1176 1750 1189 1750T1211 1742T1221 1721Q1221 1720 1221 1718T1220 1715Q1219 1708 666 238T111 -1237Q102 -1249 86 -1249Q74 -1249 65 -1240T56 -1220Q56 -1219 56 -1217T57 -1214Q58 -1207 611 263T1166 1738",91:"269 -1249V1750H577V1677H342V-1176H577V-1249H269",92:"56 1720Q56 1732 64 1741T85 1750Q104 1750 111 1738Q113 1734 666 264T1220 -1214Q1220 -1215 1220 -1217T1221 -1220Q1221 -1231 1212 -1240T1191 -1249Q1175 -1249 1166 -1237Q1164 -1233 611 237T57 1715Q57 1716 56 1718V1720",93:"5 1677V1750H313V-1249H5V-1176H240V1677H5",123:"661 -1243L655 -1249H622L604 -1240Q503 -1190 434 -1107T348 -909Q346 -897 346 -499L345 -98L343 -82Q335 3 287 87T157 223Q146 232 145 236Q144 240 144 250Q144 265 145 268T157 278Q242 333 288 417T343 583L345 600L346 1001Q346 1398 348 1410Q379 1622 600 1739L622 1750H655L661 1744V1727V1721Q661 1712 661 1710T657 1705T648 1700T630 1690T602 1668Q589 1659 574 1643T531 1593T484 1508T459 1398Q458 1389 458 1001Q458 614 457 605Q441 435 301 316Q254 277 202 251L250 222Q260 216 301 185Q443 66 457 -104Q458 -113 458 -501Q458 -888 459 -897Q463 -944 478 -988T509 -1060T548 -1114T580 -1149T602 -1167Q620 -1183 634 -1192T653 -1202T659 -1207T661 -1220V-1226V-1243",125:"144 1727Q144 1743 146 1746T162 1750H167H183L203 1740Q274 1705 325 1658T403 1562T440 1478T456 1410Q458 1398 458 1001Q459 661 459 624T465 558Q470 526 480 496T502 441T529 395T559 356T588 325T615 301T637 284T654 273L660 269V266Q660 263 660 259T661 250V239Q661 236 661 234T660 232T656 229T649 224Q577 179 528 105T465 -57Q460 -86 460 -123T458 -499V-661Q458 -857 457 -893T447 -955Q425 -1048 359 -1120T203 -1239L183 -1249H168Q150 -1249 147 -1246T144 -1226Q144 -1213 145 -1210T153 -1202Q169 -1193 186 -1181T232 -1140T282 -1081T322 -1000T345 -897Q346 -888 346 -501Q346 -113 347 -104Q359 58 503 184Q554 226 603 250Q504 299 430 393T347 605Q346 614 346 1002Q346 1389 345 1398Q338 1493 288 1573T153 1703Q146 1707 145 1710T144 1727",710:"5 561Q-4 561 -9 582T-14 618Q-14 623 -13 625Q-11 628 461 736T943 845Q945 845 1417 738T1896 628Q1902 628 1902 618Q1902 607 1897 584T1883 561Q1881 561 1412 654L945 750L476 654Q6 561 5 561",732:"1212 583Q1124 583 1048 603T923 647T799 691T635 711Q524 711 375 679T120 615L16 583Q14 584 12 587T9 592Q-2 650 2 659Q2 669 38 687Q54 696 146 723T309 767Q527 823 666 823Q759 823 837 803T964 759T1088 715T1252 695Q1363 695 1512 727T1764 791T1871 823Q1872 822 1874 819T1878 814Q1885 783 1885 753Q1885 748 1884 747Q1884 738 1849 719Q1836 712 1740 682T1484 617T1212 583",770:"-1884 561Q-1893 561 -1898 582T-1903 618Q-1903 623 -1902 625Q-1900 628 -1428 736T-946 845Q-944 845 -472 738T7 628Q13 628 13 618Q13 607 8 584T-6 561Q-8 561 -477 654L-944 750L-1413 654Q-1883 561 -1884 561",771:"-677 583Q-765 583 -841 603T-966 647T-1090 691T-1254 711Q-1365 711 -1514 679T-1768 615L-1873 583Q-1875 584 -1877 587T-1880 592Q-1891 650 -1887 659Q-1887 669 -1851 687Q-1835 696 -1743 723T-1580 767Q-1362 823 -1223 823Q-1130 823 -1052 803T-925 759T-801 715T-637 695Q-526 695 -377 727T-125 791T-18 823Q-17 822 -15 819T-11 814Q-4 782 -4 753Q-4 748 -5 747Q-5 738 -40 719Q-53 712 -149 682T-405 617T-677 583",8260:"1166 1738Q1176 1750 1189 1750T1211 1742T1221 1721Q1221 1720 1221 1718T1220 1715Q1219 1708 666 238T111 -1237Q102 -1249 86 -1249Q74 -1249 65 -1240T56 -1220Q56 -1219 56 -1217T57 -1214Q58 -1207 611 263T1166 1738",8730:"983 1739Q988 1750 1001 1750Q1008 1750 1013 1745T1020 1733Q1020 1726 742 244T460 -1241Q458 -1250 439 -1250H436Q424 -1250 424 -1248L410 -1166Q395 -1083 367 -920T312 -601L201 44L137 -83L111 -57L187 96L264 247Q265 246 369 -357Q470 -958 473 -963L727 384Q979 1729 983 1739",8968:"269 -1249V1750H633V1677H342V-1249H269",8969:"5 1677V1750H369V-1249H296V1677H5",8970:"269 -1249V1750H342V-1176H633V-1249H269",8971:"296 -1176V1750H369V-1249H5V-1176H296",9001:"140 242V260L386 994Q633 1729 635 1732Q643 1745 657 1749Q658 1749 662 1749T668 1750Q682 1749 692 1740T702 1714V1705L214 251L703 -1204L702 -1213Q702 -1230 692 -1239T667 -1248H664Q647 -1248 635 -1231Q633 -1228 386 -493L140 242",9002:"103 1714Q103 1732 114 1741T137 1750Q157 1750 170 1732Q172 1729 419 994L665 260V242L419 -493Q172 -1228 170 -1231Q158 -1248 141 -1248H138Q123 -1248 113 -1239T103 -1213V-1204L591 251L103 1705V1714",9115:"837 1154Q843 1148 843 1145Q843 1141 818 1106T753 1002T667 841T574 604T494 299Q417 -84 417 -609Q417 -641 416 -647T411 -654Q409 -655 366 -655Q299 -655 297 -654Q292 -652 292 -643T291 -583Q293 -400 304 -242T347 110T432 470T574 813T785 1136Q787 1139 790 1142T794 1147T796 1150T799 1152T802 1153T807 1154T813 1154H819H837",9116:"413 -9Q412 -9 407 -9T388 -10T354 -10Q300 -10 297 -9Q294 -8 293 -5Q291 5 291 127V300Q291 602 292 605L296 609Q298 610 366 610Q382 610 392 610T407 610T412 609Q416 609 416 592T417 473V127Q417 -9 413 -9",9117:"843 -635Q843 -638 837 -644H820Q801 -644 800 -643Q792 -635 785 -626Q684 -503 605 -363T473 -75T385 216T330 518T302 809T291 1093Q291 1144 291 1153T296 1164Q298 1165 366 1165Q409 1165 411 1164Q415 1163 416 1157T417 1119Q417 529 517 109T833 -617Q843 -631 843 -635",9118:"31 1143Q31 1154 49 1154H59Q72 1154 75 1152T89 1136Q190 1013 269 873T401 585T489 294T544 -8T572 -299T583 -583Q583 -634 583 -643T577 -654Q575 -655 508 -655Q465 -655 463 -654Q459 -653 458 -647T457 -609Q457 -58 371 340T100 1037Q87 1059 61 1098T31 1143",9119:"579 -9Q578 -9 573 -9T554 -10T520 -10Q466 -10 463 -9Q460 -8 459 -5Q457 5 457 127V300Q457 602 458 605L462 609Q464 610 532 610Q548 610 558 610T573 610T578 609Q582 609 582 592T583 473V127Q583 -9 579 -9",9120:"56 -644H50Q31 -644 31 -635Q31 -632 37 -622Q69 -579 100 -527Q286 -228 371 170T457 1119Q457 1161 462 1164Q464 1165 520 1165Q575 1165 577 1164Q582 1162 582 1153T583 1093Q581 910 570 752T527 400T442 40T300 -303T89 -626Q78 -640 75 -642T61 -644H56",9121:"319 -645V1154H666V1070H403V-645H319",9122:"319 0V602H403V0H319",9123:"319 -644V1155H403V-560H666V-644H319",9124:"0 1070V1154H347V-645H263V1070H0",9125:"263 0V602H347V0H263",9126:"263 -560V1155H347V-644H0V-560H263",9127:"712 899L718 893V876V865Q718 854 704 846Q627 793 577 710T510 525Q510 524 509 521Q505 493 504 349Q504 345 504 334Q504 277 504 240Q504 -2 503 -4Q502 -8 494 -9T444 -10Q392 -10 390 -9Q387 -8 386 -5Q384 5 384 230Q384 262 384 312T383 382Q383 481 392 535T434 656Q510 806 664 892L677 899H712",9128:"389 1159Q391 1160 455 1160Q496 1160 498 1159Q501 1158 502 1155Q504 1145 504 924Q504 691 503 682Q494 549 425 439T243 259L229 250L243 241Q349 175 421 66T503 -182Q504 -191 504 -424Q504 -600 504 -629T499 -659H498Q496 -660 444 -660T390 -659Q387 -658 386 -655Q384 -645 384 -425V-282Q384 -176 377 -116T342 10Q325 54 301 92T255 155T214 196T183 222T171 232Q170 233 170 250T171 268Q171 269 191 284T240 331T300 407T354 524T383 679Q384 691 384 925Q384 1152 385 1155L389 1159",9129:"718 -893L712 -899H677L666 -893Q542 -825 468 -714T385 -476Q384 -466 384 -282Q384 3 385 5L389 9Q392 10 444 10Q486 10 494 9T503 4Q504 2 504 -239V-310V-366Q504 -470 508 -513T530 -609Q546 -657 569 -698T617 -767T661 -812T699 -843T717 -856T718 -876V-893",9130:"384 150V266Q384 304 389 309Q391 310 455 310Q496 310 498 309Q502 308 503 298Q504 283 504 150Q504 32 504 12T499 -9H498Q496 -10 444 -10T390 -9Q386 -8 385 2Q384 17 384 150",9131:"170 875Q170 892 172 895T189 899H194H211L222 893Q345 826 420 715T503 476Q504 467 504 230Q504 51 504 21T499 -9H498Q496 -10 444 -10Q402 -10 394 -9T385 -4Q384 -2 384 240V311V366Q384 469 380 513T358 609Q342 657 319 698T271 767T227 812T189 843T171 856T170 875",9132:"389 1159Q391 1160 455 1160Q496 1160 498 1159Q501 1158 502 1155Q504 1145 504 925V782Q504 676 511 616T546 490Q563 446 587 408T633 345T674 304T705 278T717 268Q718 267 718 250T717 232Q717 231 697 216T648 169T588 93T534 -24T505 -179Q504 -191 504 -425Q504 -600 504 -629T499 -659H498Q496 -660 444 -660T390 -659Q387 -658 386 -655Q384 -645 384 -424Q384 -191 385 -182Q394 -49 463 61T645 241L659 250L645 259Q539 325 467 434T385 682Q384 692 384 873Q384 1153 385 1155L389 1159",9133:"384 -239V-57Q384 4 389 9Q391 10 455 10Q496 10 498 9Q501 8 502 5Q504 -5 504 -230Q504 -261 504 -311T505 -381Q505 -486 492 -551T435 -691Q357 -820 222 -893L211 -899H195Q176 -899 173 -896T170 -874Q170 -858 171 -855T184 -846Q262 -793 312 -709T378 -525Q378 -524 379 -522Q383 -493 384 -351Q384 -345 384 -334Q384 -276 384 -239",9143:"742 -871Q740 -873 737 -876T733 -880T730 -882T724 -884T714 -885H702L222 569L180 484Q138 399 137 399Q131 404 124 412L111 425L265 736L702 -586V168L703 922Q713 935 722 935Q734 935 742 920V-871",10216:"140 242V260L386 994Q633 1729 635 1732Q643 1745 657 1749Q658 1749 662 1749T668 1750Q682 1749 692 1740T702 1714V1705L214 251L703 -1204L702 -1213Q702 -1230 692 -1239T667 -1248H664Q647 -1248 635 -1231Q633 -1228 386 -493L140 242",10217:"103 1714Q103 1732 114 1741T137 1750Q157 1750 170 1732Q172 1729 419 994L665 260V242L419 -493Q172 -1228 170 -1231Q158 -1248 141 -1248H138Q123 -1248 113 -1239T103 -1213V-1204L591 251L103 1705V1714",12296:"140 242V260L386 994Q633 1729 635 1732Q643 1745 657 1749Q658 1749 662 1749T668 1750Q682 1749 692 1740T702 1714V1705L214 251L703 -1204L702 -1213Q702 -1230 692 -1239T667 -1248H664Q647 -1248 635 -1231Q633 -1228 386 -493L140 242",12297:"103 1714Q103 1732 114 1741T137 1750Q157 1750 170 1732Q172 1729 419 994L665 260V242L419 -493Q172 -1228 170 -1231Q158 -1248 141 -1248H138Q123 -1248 113 -1239T103 -1213V-1204L591 251L103 1705V1714",57344:"722 -14H720Q708 -14 702 0V306L703 612Q713 625 722 625Q734 625 742 610V0Q734 -14 724 -14H722",57345:"702 589Q706 601 718 605H1061Q1076 597 1076 585Q1076 572 1061 565H742V0Q734 -14 724 -14H722H720Q708 -14 702 0V589",57680:"-18 -213L-24 -207V-172L-16 -158Q75 2 260 84Q334 113 415 119Q418 119 427 119T440 120Q454 120 457 117T460 98V60V25Q460 7 457 4T441 0Q308 0 193 -55T25 -205Q21 -211 18 -212T-1 -213H-18",57681:"-10 60Q-10 104 -10 111T-5 118Q-1 120 10 120Q96 120 190 84Q375 2 466 -158L474 -172V-207L468 -213H451H447Q437 -213 434 -213T428 -209T423 -202T414 -187T396 -163Q331 -82 224 -41T9 0Q-4 0 -7 3T-10 25V60",57682:"-24 327L-18 333H-1Q11 333 15 333T22 329T27 322T35 308T54 284Q115 203 225 162T441 120Q454 120 457 117T460 95V60V28Q460 8 457 4T442 0Q355 0 260 36Q75 118 -16 278L-24 292V327",57683:"-10 60V95Q-10 113 -7 116T9 120Q151 120 250 171T396 284Q404 293 412 305T424 324T431 331Q433 333 451 333H468L474 327V292L466 278Q375 118 190 36Q95 0 8 0Q-5 0 -7 3T-10 24V60",57684:"-10 0V120H410V0H-10"},{57685:"\ue153\ue152",57686:"\ue151\ue150"})},2989:function(Q,T,L){Object.defineProperty(T,"__esModule",{value:!0}),T.texVariant=void 0;var H=L(9403),V=L(8135);T.texVariant=(0,H.AddPaths)(V.texVariant,{710:"1 561Q-3 563 -6 577T-12 604L-14 618Q-14 625 -7 628T23 635Q31 636 36 637Q63 641 621 745Q1148 845 1165 845Q1167 845 1752 739L2338 630Q2346 630 2346 618Q2340 565 2332 561Q2329 561 1749 654Q1617 675 1466 699T1241 736T1167 748Q1165 748 1093 737T867 700T583 654Q3 561 1 561",732:"804 788Q717 788 606 772T397 732T213 685T75 645T18 628Q11 628 11 632Q8 637 4 668T2 704Q2 713 36 732Q55 739 242 795Q622 898 826 898Q893 898 947 895Q1009 887 1056 872T1187 819Q1286 776 1356 758T1527 739Q1614 739 1725 755T1934 795T2118 842T2256 882T2313 899Q2320 899 2320 895Q2323 890 2327 860T2329 824Q2329 818 2296 795Q2273 787 2089 732Q1810 657 1598 632Q1562 629 1492 629Q1389 629 1320 644T1144 708Q1048 751 977 769T804 788",770:"-2332 561Q-2336 563 -2340 577T-2346 604L-2347 618Q-2347 625 -2340 628T-2310 635Q-2302 636 -2297 637Q-2270 641 -1712 745Q-1185 845 -1168 845Q-1166 845 -581 739L5 630Q13 630 13 618Q7 565 -1 561Q-4 561 -584 654Q-716 675 -867 699T-1092 736T-1166 748Q-1168 748 -1240 737T-1466 700T-1750 654Q-2330 561 -2332 561",771:"-1529 788Q-1616 788 -1727 772T-1936 732T-2120 685T-2258 645T-2315 628Q-2322 628 -2322 632Q-2325 637 -2329 668T-2331 704Q-2331 713 -2297 732Q-2278 739 -2091 795Q-1711 898 -1507 898Q-1440 898 -1386 895Q-1324 887 -1277 872T-1146 819Q-1047 776 -977 758T-806 739Q-719 739 -608 755T-399 795T-215 842T-77 882T-20 899Q-13 899 -13 895Q-10 890 -6 860T-4 824Q-4 818 -37 795Q-60 787 -244 732Q-523 657 -735 632Q-771 629 -841 629Q-944 629 -1013 644T-1189 708Q-1285 751 -1356 769T-1529 788",1008:"228 325Q170 322 156 316T127 309Q108 309 104 314Q99 319 99 322T108 341Q125 376 171 400T268 425H271Q302 425 319 396Q328 377 328 358Q328 332 324 314Q311 270 286 221Q274 194 274 192H275Q339 234 484 325T639 421Q669 434 691 434T723 425T734 406Q734 394 719 381Q715 376 644 330L575 287L566 267Q543 233 526 176Q520 160 515 143T508 115T506 105Q506 103 533 103Q585 103 607 110T641 118Q670 118 670 107Q670 100 661 85Q643 50 598 27T504 3Q465 3 450 36Q441 51 441 73Q441 84 444 96Q452 146 484 205L497 236L324 125Q143 12 135 10Q103 -6 77 -6Q61 -6 49 2T37 21Q37 36 49 46T124 96L195 141L204 156Q219 179 243 248T264 323Q264 325 228 325",8463:"182 599Q182 611 174 615T133 619Q118 619 114 621T109 630Q109 636 114 656T122 681Q125 685 202 688Q272 695 286 695Q304 695 304 684Q304 682 295 644T282 597Q282 592 360 592H399Q430 592 445 587T460 563Q460 552 451 541L442 535H266L251 468Q247 453 243 436T236 409T233 399Q233 395 244 404Q295 441 357 441Q405 441 445 417T485 333Q485 284 449 178T412 58T426 44Q447 44 466 68Q485 87 500 130L509 152H531H543Q562 152 562 144Q562 128 546 93T494 23T415 -13Q385 -13 359 3T322 44Q318 52 318 77Q318 99 352 196T386 337Q386 386 346 386Q318 386 286 370Q267 361 245 338T211 292Q207 287 193 235T162 113T138 21Q128 7 122 4Q105 -12 83 -12Q66 -12 54 -2T42 26L166 530Q166 534 161 534T129 535Q127 535 122 535T112 534Q74 534 74 562Q74 570 77 576T84 585T96 589T109 591T124 592T138 592L182 595V599",8592:"292 419Q292 400 261 347T211 275H306Q319 275 338 275T364 276Q399 276 410 271T422 250T411 230T366 225H306H211Q214 222 232 197T271 136T292 82Q292 71 285 68T262 64H250H241Q221 64 216 67T205 83Q186 127 153 167T78 230Q64 238 64 250Q64 258 69 263T82 272T106 288T139 318Q162 342 177 365T198 402T209 425T223 436Q224 437 252 437H258Q292 437 292 419",8594:"188 417Q188 437 221 437H233Q256 437 263 434T275 417Q294 373 327 333T402 270Q417 261 417 250Q417 241 410 236T382 217T341 182Q315 155 299 128T275 85T263 66Q259 64 231 64H219Q197 64 191 72T193 100Q202 124 215 147T239 185T257 210T267 223L269 225H174H116Q80 225 69 229T58 250T70 271T114 276Q121 276 140 276T174 275H269L267 277Q266 280 257 291T233 325T205 374Q188 408 188 417",8652:"755 512Q755 514 778 514H801L804 503Q805 501 812 486T824 462T839 437T862 408T892 381T932 354L944 347V327H507Q70 327 67 329Q55 335 55 347T67 365Q70 367 454 367H837L828 376Q803 403 785 437T761 489T755 512ZM55 153V173H492Q928 173 932 171Q944 166 944 153T932 135Q928 133 545 133H162L171 124Q198 95 216 61T239 8L244 -12Q244 -14 221 -14H198L195 -4Q160 95 67 146L55 153",8708:"55 676Q55 688 66 694H199L333 696L351 772Q364 827 370 843T386 860Q393 860 399 854T406 841Q406 836 391 765L375 696Q375 694 431 694H484Q491 688 497 681V12L493 5L486 1L353 -1H219L202 -79Q184 -153 180 -159Q175 -166 165 -166Q146 -166 146 -148Q146 -141 161 -76T177 -4Q177 -1 122 -1H68Q55 12 55 20T66 39H126L186 41L219 181Q226 215 234 251T246 305T251 325Q251 328 166 328H79Q68 345 68 347Q68 352 75 359L82 368H262L291 505Q298 539 306 575T319 630T324 650V654H68Q55 669 55 676ZM457 368V654H411Q366 654 366 652Q365 651 361 634T349 580T333 514Q303 373 302 372V368H457ZM457 39V328H375Q293 328 293 325Q292 322 260 183T228 41T344 39H457",8709:"624 470Q624 468 639 446T668 382T683 291Q683 181 612 99T437 -1Q425 -2 387 -2T337 -1Q245 18 193 70L179 81L131 39Q96 8 89 3T75 -3Q55 -3 55 17Q55 24 61 30T111 73Q154 113 151 113Q151 114 140 130T115 177T95 241Q94 253 94 291T95 341Q112 431 173 495Q265 587 385 587Q410 587 437 581Q522 571 582 513L595 501L642 541Q689 586 695 586Q696 586 697 586T699 587Q706 587 713 583T720 568Q720 560 711 551T664 510Q651 499 642 490T628 475T624 470ZM564 477Q517 522 448 539Q428 546 375 546Q290 546 229 492T144 370Q133 332 133 279Q136 228 151 195Q157 179 168 160T184 141Q186 141 375 307T564 477ZM642 290Q642 318 637 343T625 386T611 416T598 436T593 444Q590 444 402 277T213 108Q213 104 231 89T293 55T392 37Q495 37 568 111T642 290",8722:"84 237T84 250T98 270H402Q417 262 417 250T402 230H98Q84 237 84 250",8726:"91 404T91 410T97 423T111 430Q117 430 395 224Q676 13 678 10Q685 3 685 -3T678 -16T664 -23Q658 -23 380 184T98 397Q91 404 91 410",8733:"56 250Q56 346 122 409T276 472Q349 472 407 430T486 326L489 316Q490 317 493 326T501 345T514 367T531 393Q557 425 602 448T698 472Q722 472 722 452Q722 437 702 435T642 421T571 377Q520 323 520 250Q520 179 568 126T693 68Q722 66 722 48Q722 28 698 28Q636 28 576 67T493 174L490 184Q489 181 483 167T475 150T468 136T458 120T447 107T432 90T412 73Q350 28 277 28Q188 28 122 91T56 250ZM199 68T278 68T408 122T459 250Q459 322 414 370T308 430Q302 431 273 431Q204 431 150 380T96 250Q96 176 147 122",8739:"91 417Q104 430 111 430T131 417V-10Q116 -23 111 -23T91 -10V417",8740:"91 417Q104 430 111 430T131 417V301L171 341Q201 373 207 378T220 384Q227 384 233 377T240 366Q240 357 187 299L131 244V-10Q116 -23 111 -23T91 -10V201L49 157Q20 127 14 121T0 115Q-8 115 -14 121T-20 132Q-20 139 17 178Q29 191 36 199L91 257V417",8741:"55 417Q69 431 76 431T95 419V-12Q84 -23 76 -23Q72 -23 69 -22T62 -16T55 -10V417ZM293 419Q300 431 310 431L324 424L331 417V-10Q316 -23 309 -23L297 -19L293 -12V419",8742:"56 417Q68 431 76 431L89 426L96 419V317L98 215L193 273L291 330V375L293 419Q301 431 311 431Q331 431 331 388L333 355L356 370Q381 384 388 384Q394 384 400 377T407 363Q407 354 367 328L331 308V-10Q316 -23 310 -23Q300 -23 293 -12L291 135V284L98 168L96 77V-12Q84 -24 76 -24L62 -19L58 -12L56 66V144L31 128Q5 114 -2 114Q-8 114 -14 121T-20 136Q-20 142 -14 147T20 170L56 190V417",8764:"73 132Q55 132 55 172Q55 220 79 272Q95 301 111 319Q148 353 195 363Q199 364 212 364Q262 364 294 350T408 272Q472 222 522 212Q537 208 555 208Q606 208 646 243Q671 268 680 296T691 342T702 365Q713 365 716 354T719 314Q714 236 664 179L660 176Q657 173 654 170T644 163T631 154T615 146T596 139T574 134T549 132Q510 132 465 156T386 211T307 265T223 290Q162 290 124 249T86 165Q86 155 82 144T73 132",8776:"55 326Q55 394 101 437T226 481Q268 479 313 460T392 419T469 379T555 361Q622 361 662 401Q686 423 688 450Q693 479 702 479H705Q719 479 719 442Q719 367 670 327T554 286Q512 286 466 304T386 345T307 385T220 404Q184 404 157 394T120 374L111 363Q86 339 86 317Q86 288 71 288Q55 288 55 326ZM55 90Q55 164 105 205T226 246Q269 243 314 224T392 183T470 144T558 126Q622 126 662 166Q686 187 688 214Q693 244 704 244Q716 244 719 210Q719 165 702 132T658 82T605 58T552 50T498 58T447 77T384 110Q322 146 302 152Q263 168 220 168Q179 168 144 152Q128 147 107 125T86 81Q86 52 71 52Q55 52 55 90",8808:"86 472Q93 477 381 614T673 752Q680 752 686 746T693 732T689 721Q686 715 418 590L151 461L418 332Q684 207 689 201Q693 195 693 190Q693 183 687 177T675 170Q668 170 380 307T86 450Q82 454 82 461Q82 467 86 472ZM369 101V126Q369 156 382 156H384Q385 157 386 157Q409 157 409 115V98V54H680Q693 39 693 34T680 14H409V-142H680Q693 -155 693 -162Q693 -167 680 -182H409V-273Q396 -284 388 -284Q382 -284 369 -275V-182H95Q82 -167 82 -162Q82 -155 95 -142H369V14H95Q93 17 89 21T84 27T82 34T83 40T89 47T95 54H369V101",8809:"89 745Q95 752 100 752Q106 752 394 615T689 472Q693 468 693 461T689 450Q684 445 396 308T100 170Q95 170 89 176T82 190Q82 195 86 201Q91 208 358 332L624 461L358 590Q90 715 86 721Q82 725 82 731Q82 739 89 745ZM369 101V126Q369 156 382 156H384Q385 157 386 157Q409 157 409 115V98V54H680Q693 39 693 34T680 14H409V-142H680Q693 -155 693 -162Q693 -167 680 -182H409V-273Q396 -284 388 -284Q382 -284 369 -275V-182H95Q82 -167 82 -162Q82 -155 95 -142H369V14H95Q93 17 89 21T84 27T82 34T83 40T89 47T95 54H369V101",8816:"82 34Q82 44 93 55H198L300 57L342 179Q351 207 362 238T378 286T384 303T238 377Q109 435 86 450Q82 454 82 460T86 472Q90 476 302 579L511 679Q512 679 553 795Q569 842 577 866T592 903T600 917T608 919Q615 919 622 912T629 901Q629 899 595 799Q589 777 581 753T569 717T564 703L618 728Q666 752 673 752T686 746T693 732Q693 723 683 717T615 683L546 650L491 488Q464 410 450 368T438 326Q493 297 562 266Q660 219 677 209T694 190Q694 183 690 177T678 171Q664 171 546 228L424 286Q422 286 382 172L342 57L513 55H682Q694 43 694 34Q694 28 689 21L682 17L506 15H329L322 -8Q320 -13 310 -41T295 -85L275 -141H680Q682 -143 684 -146T688 -151T691 -156T693 -162Q693 -172 682 -179L473 -181H262L220 -303Q192 -388 185 -404T166 -421Q160 -421 153 -415T146 -403Q146 -400 179 -302T220 -185Q220 -181 158 -181L93 -179L86 -174Q82 -169 82 -161Q82 -152 93 -141H164L233 -139L260 -63L286 15H189L93 17L86 21Q82 26 82 34ZM495 623Q495 626 493 626T321 544T151 461L398 343Q399 343 405 360T423 415T446 483Q457 513 469 551T488 606T495 623",8817:"97 172Q82 172 82 190Q82 197 86 201Q94 209 173 246T327 319T402 357Q405 360 434 448T462 539L278 628Q96 713 86 721Q82 725 82 732T88 745T102 752Q103 752 125 742T198 709T293 666Q342 642 385 622T453 590T478 579Q479 579 506 659T562 824T598 915Q602 919 609 919T622 913T629 901Q629 898 571 728Q546 656 531 608T518 559Q555 539 602 519Q664 488 679 479T694 461Q694 457 689 450Q680 443 616 413T494 356T435 326L389 190L342 57L513 55H682Q694 43 694 34Q694 28 689 21L682 17L506 15H329L322 -8Q320 -13 310 -41T295 -85L275 -141H680Q682 -143 684 -146T688 -151T691 -156T693 -162Q693 -172 682 -179L473 -181H262L220 -303Q192 -388 185 -404T166 -421Q160 -421 153 -415T146 -403Q146 -400 179 -302T220 -185Q220 -181 158 -181L93 -179L86 -174Q82 -169 82 -161Q82 -152 93 -141H164L233 -139L260 -63L286 15H189L93 17L86 21Q82 26 82 34Q82 44 93 55H198L300 57L342 179Q350 204 361 238T378 286T382 301L246 237Q111 172 97 172ZM624 461Q621 464 560 492Q512 518 503 518Q500 518 500 517Q499 513 488 479T465 413T453 379L624 461",8840:"82 -6Q82 1 95 14H262L295 94Q331 171 331 174Q324 175 312 178T267 194T206 227T146 283T98 368Q84 406 84 461T98 554Q126 632 194 685T349 750Q360 752 480 752H591L604 783Q620 819 624 821Q631 828 640 828Q653 825 658 810Q658 808 646 781L635 754Q635 752 658 752Q680 752 686 746Q693 739 693 732Q693 728 692 726T686 719T680 712H615L506 466Q479 407 451 344T408 248T393 214Q393 210 535 210H680Q693 194 693 190T680 170H373L340 92L304 14H680Q693 1 693 -6Q693 -11 680 -26H286L253 -103L218 -179L451 -181H682Q694 -193 694 -201Q694 -212 682 -219L440 -221H200L178 -270Q160 -309 154 -319T139 -330Q122 -330 118 -312L155 -223Q155 -221 126 -221H95Q82 -206 82 -201T95 -181H175L206 -108Q237 -35 242 -30Q242 -26 169 -26H95Q82 -11 82 -6ZM571 710Q571 712 469 712Q443 712 416 712T371 711T351 710Q279 700 221 656T138 548Q124 508 124 461T138 374Q186 245 351 212L460 459Q571 709 571 710",8841:"82 732Q82 739 95 752H251H348Q420 752 460 744T551 708Q566 697 566 701Q618 815 624 821Q631 828 640 828Q653 825 658 810L600 677Q600 671 615 656T653 605T689 517Q692 496 692 461T689 406Q668 325 615 266Q572 221 513 196T391 170H373L340 92L304 14H680Q693 1 693 -6Q693 -11 680 -26H286L253 -103L218 -179L451 -181H682Q694 -193 694 -201Q694 -212 682 -219L440 -221H200L178 -270Q160 -309 154 -319T139 -330Q122 -330 118 -312L155 -223Q155 -221 126 -221H95Q82 -206 82 -201T95 -181H175L206 -108Q237 -35 242 -30Q242 -26 169 -26H95Q82 -11 82 -6Q82 1 95 14H262L295 92L331 170H95Q93 172 91 175T87 180T84 185T82 191Q82 199 93 210H220L349 212L549 659Q507 692 462 702T338 712H249H95Q82 727 82 732ZM652 473Q652 513 636 552T603 611T582 632Q581 632 487 422T393 210Q424 210 460 220T535 253T605 316T649 410Q652 427 652 461V473",8842:"693 -115T693 -122T680 -144H315L269 -199Q221 -255 213 -255H212Q203 -255 197 -248T193 -231Q195 -225 229 -184L262 -144H186L113 -142L106 -137Q102 -130 102 -125Q102 -119 115 -104H298L426 52H386Q342 54 309 63Q236 79 180 129T98 249Q84 289 84 343Q84 398 98 436Q126 514 193 567T346 632Q347 632 373 632T440 633T520 634H680Q682 631 686 627T691 621T693 614T680 594H526Q364 594 353 592Q268 581 207 528T126 394Q123 378 123 343T126 292Q141 231 181 185T280 114Q329 92 415 92H462L506 147Q554 203 562 203H563Q572 203 578 196T582 178Q579 173 546 132L513 94L598 92H682Q693 81 693 73T680 52H480L349 -102L515 -104H682Q693 -115 693 -122",8843:"82 610T82 614T83 620T89 627T95 634H251Q378 634 409 633T469 623Q540 604 596 554T678 436Q691 397 691 343T678 249Q653 181 597 131T469 63Q427 52 362 52H315L213 -102L438 -104H662Q673 -115 673 -123Q673 -129 660 -144H186L151 -197Q114 -250 109 -253Q106 -254 104 -254Q100 -254 98 -253Q91 -253 87 -248T82 -235Q82 -230 109 -186L138 -144H115Q82 -144 82 -125Q82 -119 95 -104H166L266 49Q266 52 182 52H95Q82 65 82 72Q82 76 83 78T89 85T95 92H295L329 143Q365 195 369 198Q372 203 380 203Q385 203 391 197T398 185Q398 184 398 184L399 182Q399 175 369 129L344 94Q344 92 376 92Q402 92 422 94Q496 104 554 147T638 256Q651 295 651 343Q651 390 638 429Q613 494 555 537T422 592Q411 594 249 594H95Q82 610 82 614",8872:"55 678Q55 679 56 681T58 684T61 688T65 691T70 693T77 694Q88 692 95 679V464H540Q554 456 555 446Q555 442 554 439T552 434T549 430T546 428T542 426T539 424H95V270H539Q540 270 542 269T545 267T549 264T552 260T554 255T555 248Q554 238 540 230H95V15Q88 2 77 0Q73 0 70 1T65 3T61 6T59 9T57 13T55 16V678",8901:"71 0Q59 4 55 16V96L56 176Q59 180 66 187L70 189H209Q219 181 222 174V15Q219 10 209 1L140 0H71",8994:"77 122Q68 122 63 126T57 135T55 142Q55 151 68 176T111 235T177 302T271 356T388 378Q451 378 508 355T602 300T668 233T709 174T722 142Q722 124 704 122Q692 122 685 134T658 179T606 243Q511 338 390 338Q354 338 320 329Q251 312 193 263T97 141Q87 123 77 122",8995:"389 143Q324 143 266 164T171 215T107 277T67 330T55 358T60 371T77 378Q85 377 92 367T116 331T158 280Q256 182 389 182Q475 182 552 227T675 351Q688 378 704 378Q722 376 722 358Q722 352 710 330T670 276T605 215T511 164T389 143",9651:"99 -20Q84 -11 84 0Q84 5 148 145T278 424L342 563Q347 575 360 575Q368 575 375 570Q376 569 441 430T571 148T637 0Q637 -11 622 -20H99ZM476 260L360 509L248 266Q137 24 135 22Q135 20 360 20Q586 20 586 21L476 260",9661:"84 556Q84 567 99 576H622Q637 567 637 556Q637 551 572 409T441 127T375 -14Q368 -19 360 -19H358Q349 -19 342 -7T296 92Q249 193 211 275Q84 550 84 556ZM586 534Q586 536 361 536Q135 536 135 535L358 52L361 47L473 290Q584 532 586 534",10887:"102 168Q103 168 151 146T247 102T295 81Q299 85 322 144T344 206L218 268Q153 297 123 313T87 333T82 344T86 355Q104 369 291 455Q491 552 491 553L542 673Q581 767 590 784T609 801Q616 801 622 795T629 781Q629 773 586 677Q546 581 546 577L609 606Q669 635 673 635Q680 635 686 629T693 615Q693 610 692 608T670 593T604 561L524 521L400 226L542 157Q617 123 649 107T687 85T694 72Q694 66 690 60T679 54Q665 54 526 119Q394 186 386 186Q385 186 342 88L331 61L509 -23Q680 -105 688 -111Q693 -115 693 -122T688 -135T675 -141H673Q664 -141 491 -59Q320 21 316 21H315L249 -136Q183 -293 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 154 -261T181 -197T213 -119L280 41Q280 46 186 86Q157 101 121 119Q92 133 87 136T82 148Q82 155 88 161T102 168ZM418 370L466 495Q464 495 308 420T151 344T204 317T311 267T364 244Q364 247 418 370",10888:"97 54Q82 54 82 72Q82 79 86 84Q95 91 222 153L351 215L398 324L442 433L258 519Q95 597 87 604Q82 608 82 615T88 628T102 635Q107 635 424 484L458 468L524 630Q593 789 597 795Q601 801 609 801Q616 801 622 795T629 781L562 615L493 450L589 406Q665 371 679 362T694 344Q694 339 693 337T677 326T631 302T538 257Q504 241 465 223T406 195T386 186Q383 185 344 92T306 -3L486 81Q662 168 673 168Q680 168 686 162T693 148T689 137Q688 136 482 35L280 -59L233 -176Q184 -291 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -279 185 -186T224 -90Q225 -88 223 -88Q219 -88 193 -101Q109 -143 98 -143Q82 -138 82 -122Q82 -116 85 -113T108 -98T171 -67L249 -30L289 61Q297 81 307 107T321 144T326 157L218 106Q109 54 97 54ZM553 379Q480 412 480 415Q479 415 460 372T423 285T406 241Q408 240 516 291T624 344L553 379",10955:"82 -14T82 -7T95 15H431L529 170H435Q341 170 333 175Q149 218 98 368Q84 406 84 461Q84 515 98 555Q126 633 193 686T346 750Q347 750 373 750T440 751T520 752H680Q693 739 693 732Q693 727 680 712H526Q364 712 353 710Q268 700 207 646T126 512Q123 496 123 461T126 410Q141 350 180 304T280 232Q312 217 344 214T464 210H555L589 261Q613 301 620 311T635 321Q644 321 650 315T657 301Q657 296 651 286T630 252T604 212Q604 210 642 210H680Q693 197 693 190Q693 186 692 184T686 177T680 170H578L526 92L478 17L580 15H682Q693 4 693 -4T680 -25H451L353 -179L518 -181H682Q694 -193 694 -201Q694 -211 682 -219L504 -221H326L293 -272Q257 -332 246 -332Q238 -332 232 -326T225 -313Q225 -310 226 -308Q226 -305 251 -265T278 -223Q278 -221 186 -221H95Q93 -218 89 -214T84 -208T82 -201T95 -181H306L404 -25H249L93 -23L86 -19Q82 -14 82 -7",10956:"82 732Q82 739 95 752H251Q415 752 426 750Q539 736 615 657Q667 599 689 517Q692 496 692 461T689 406Q668 325 615 266Q522 170 382 170H355L326 95Q319 80 311 59T298 28T293 17Q293 15 486 15H680Q693 0 693 -6T680 -25H275L213 -179L449 -181H682Q693 -192 693 -199T680 -221H198L178 -270Q153 -333 139 -333Q132 -333 126 -327T119 -314T135 -266T153 -223Q153 -221 124 -221H95Q82 -207 82 -201T95 -181H171L233 -25H162L93 -23L86 -19Q82 -14 82 -7T95 15H251L313 170H202L93 172L86 177Q82 182 82 190Q82 199 93 210H211L329 212L349 261Q366 301 372 311T386 321Q392 321 399 315T407 302Q407 295 390 254T373 210Q374 209 377 209Q412 209 444 217Q512 231 564 273T638 377Q651 414 651 461Q651 509 638 548Q613 613 555 656T422 710Q411 712 249 712H95Q82 727 82 732"},{})},8955:function(Q,T){MathJax._.components.global.isObject,MathJax._.components.global.combineConfig,T.PV=MathJax._.components.global.combineDefaults,T.r8=MathJax._.components.global.combineWithMathJax,MathJax._.components.global.MathJax},5074:function(Q,T){MathJax._.util.Options.isObject,MathJax._.util.Options.APPEND,MathJax._.util.Options.REMOVE,MathJax._.util.Options.OPTIONS,MathJax._.util.Options.Expandable,MathJax._.util.Options.expandable,MathJax._.util.Options.makeArray,MathJax._.util.Options.keys,MathJax._.util.Options.copy,MathJax._.util.Options.insert,MathJax._.util.Options.defaultOptions,MathJax._.util.Options.userOptions,MathJax._.util.Options.selectOptions,T.Pp=MathJax._.util.Options.selectOptionsFromKeys,MathJax._.util.Options.separateOptions,MathJax._.util.Options.lookup},4228:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.enum=MathJax._.output.common.FontData.enum,T.V=MathJax._.output.common.FontData.V,T.H=MathJax._.output.common.FontData.H,T.NOSTRETCH=MathJax._.output.common.FontData.NOSTRETCH,T.FontData=MathJax._.output.common.FontData.FontData},9403:function(Q,T){Object.defineProperty(T,"__esModule",{value:!0}),T.SVGFontData=MathJax._.output.svg.FontData.SVGFontData,T.AddPaths=MathJax._.output.svg.FontData.AddPaths}},T={};function L(H){var V=T[H];if(void 0!==V)return V.exports;var M=T[H]={exports:{}};return Q[H].call(M.exports,M,M.exports,L),M.exports}!function(){var Q=L(8955),T=L(8667),H=L(3869),V=L(7557),M=L(7481),Z=L(5674),i=L(7002),t=L(9349),e=L(9741),s=L(2827),c=L(2970),r=L(1668),o=L(6949),a=L(5193),l=L(2632),n=L(4214),d=L(6466),k=L(3776),u=L(7405),f=L(8105),p=L(2518),h=L(5595),v=L(6357),_=L(9474),D=L(584),b=L(4324),x=L(8135),W=L(1054),y=L(8681),O=L(7293),m=L(3566),S=L(8745),P=L(181),z=L(6560),j=L(1500),g=L(2418),I=L(353),B=L(1082),J=L(67),A=L(9007),C=L(2226),E=L(6385),F=L(871),w=L(6819),X=L(4025),N=L(2698),q=L(5211),G=L(8742),R=L(2989);MathJax.loader&&MathJax.loader.checkVersion("output/svg/fonts/tex",T.q,"svg-font"),(0,Q.r8)({_:{output:{common:{fonts:{tex:{"bold-italic":H,bold:V,delimiters:M,"double-struck":Z,"fraktur-bold":i,fraktur:t,italic:e,largeop:s,monospace:c,normal:r,"sans-serif-bold-italic":o,"sans-serif-bold":a,"sans-serif-italic":l,"sans-serif":n,"script-bold":d,script:k,smallop:u,"tex-calligraphic-bold":f,"tex-calligraphic":p,"tex-mathit":h,"tex-oldstyle-bold":v,"tex-oldstyle":_,"tex-size3":D,"tex-size4":b,"tex-variant":x}}},svg:{fonts:{tex_ts:W,tex:{"bold-italic":y,bold:O,"fraktur-bold":m,fraktur:S,italic:P,largeop:z,monospace:j,normal:g,"sans-serif-bold-italic":I,"sans-serif-bold":B,"sans-serif-italic":J,"sans-serif":A,smallop:C,"tex-calligraphic-bold":E,"tex-calligraphic":F,"tex-mathit":w,"tex-oldstyle-bold":X,"tex-oldstyle":N,"tex-size3":q,"tex-size4":G,"tex-variant":R}}}}}});var K=L(5074);if(MathJax.startup){var U=(0,K.Pp)(MathJax.config.svg||{},W.TeXFont.OPTIONS);(0,Q.PV)(MathJax.config,"svg",{font:new W.TeXFont(U)})}}()}(); ================================================ FILE: assets/vendors/mathjax-v3/output/svg.js ================================================ !function(){"use strict";var t,e,r,o,n,i,a,s,l,c,h,u,p,d,f,y,m,v,g,b,x,_,M,w,S,O,C,B,j,P,A,V,T,k,G,N,L,D,W,E,R,I,F,H,J,X,z,q,K,U,Q,Y,Z,$,tt,et,rt,ot,nt,it,at,st,lt,ct,ht,ut,pt,dt,ft={7306:function(t,e){e.q=void 0,e.q="3.2.2"},9250:function(t,e,r){var o=this&&this.__assign||function(){return o=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},o.apply(this,arguments)},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.FontData=e.NOSTRETCH=e.H=e.V=void 0;var s=r(9077);e.V=1,e.H=2,e.NOSTRETCH={dir:0};var l=function(){function t(t){var e,r,l,c;void 0===t&&(t=null),this.variant={},this.delimiters={},this.cssFontMap={},this.remapChars={},this.skewIcFactor=.75;var h=this.constructor;this.options=(0,s.userOptions)((0,s.defaultOptions)({},h.OPTIONS),t),this.params=o({},h.defaultParams),this.sizeVariants=i([],n(h.defaultSizeVariants),!1),this.stretchVariants=i([],n(h.defaultStretchVariants),!1),this.cssFontMap=o({},h.defaultCssFonts);try{for(var u=a(Object.keys(this.cssFontMap)),p=u.next();!p.done;p=u.next()){var d=p.value;"unknown"===this.cssFontMap[d][0]&&(this.cssFontMap[d][0]=this.options.unknownFamily)}}catch(t){e={error:t}}finally{try{p&&!p.done&&(r=u.return)&&r.call(u)}finally{if(e)throw e.error}}this.cssFamilyPrefix=h.defaultCssFamilyPrefix,this.createVariants(h.defaultVariants),this.defineDelimiters(h.defaultDelimiters);try{for(var f=a(Object.keys(h.defaultChars)),y=f.next();!y.done;y=f.next()){var m=y.value;this.defineChars(m,h.defaultChars[m])}}catch(t){l={error:t}}finally{try{y&&!y.done&&(c=f.return)&&c.call(f)}finally{if(l)throw l.error}}this.defineRemap("accent",h.defaultAccentMap),this.defineRemap("mo",h.defaultMoMap),this.defineRemap("mn",h.defaultMnMap)}return t.charOptions=function(t,e){var r=t[e];return 3===r.length&&(r[3]={}),r[3]},Object.defineProperty(t.prototype,"styles",{get:function(){return this._styles},set:function(t){this._styles=t},enumerable:!1,configurable:!0}),t.prototype.createVariant=function(t,e,r){void 0===e&&(e=null),void 0===r&&(r=null);var o={linked:[],chars:e?Object.create(this.variant[e].chars):{}};r&&this.variant[r]&&(Object.assign(o.chars,this.variant[r].chars),this.variant[r].linked.push(o.chars),o.chars=Object.create(o.chars)),this.remapSmpChars(o.chars,t),this.variant[t]=o},t.prototype.remapSmpChars=function(t,e){var r,o,i,s,l=this.constructor;if(l.VariantSmp[e]){var c=l.SmpRemap,h=[null,null,l.SmpRemapGreekU,l.SmpRemapGreekL];try{for(var u=a(l.SmpRanges),p=u.next();!p.done;p=u.next()){var d=n(p.value,3),f=d[0],y=d[1],m=d[2],v=l.VariantSmp[e][f];if(v){for(var g=y;g<=m;g++)if(930!==g){var b=v+g-y;t[g]=this.smpChar(c[b]||b)}if(h[f])try{for(var x=(i=void 0,a(Object.keys(h[f]).map((function(t){return parseInt(t)})))),_=x.next();!_.done;_=x.next()){t[g=_.value]=this.smpChar(v+h[f][g])}}catch(t){i={error:t}}finally{try{_&&!_.done&&(s=x.return)&&s.call(x)}finally{if(i)throw i.error}}}}}catch(t){r={error:t}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(r)throw r.error}}}"bold"===e&&(t[988]=this.smpChar(120778),t[989]=this.smpChar(120779))},t.prototype.smpChar=function(t){return[,,,{smp:t}]},t.prototype.createVariants=function(t){var e,r;try{for(var o=a(t),n=o.next();!n.done;n=o.next()){var i=n.value;this.createVariant(i[0],i[1],i[2])}}catch(t){e={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},t.prototype.defineChars=function(t,e){var r,o,n=this.variant[t];Object.assign(n.chars,e);try{for(var i=a(n.linked),s=i.next();!s.done;s=i.next()){var l=s.value;Object.assign(l,e)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(o=i.return)&&o.call(i)}finally{if(r)throw r.error}}},t.prototype.defineDelimiters=function(t){Object.assign(this.delimiters,t)},t.prototype.defineRemap=function(t,e){this.remapChars.hasOwnProperty(t)||(this.remapChars[t]={}),Object.assign(this.remapChars[t],e)},t.prototype.getDelimiter=function(t){return this.delimiters[t]},t.prototype.getSizeVariant=function(t,e){return this.delimiters[t].variants&&(e=this.delimiters[t].variants[e]),this.sizeVariants[e]},t.prototype.getStretchVariant=function(t,e){return this.stretchVariants[this.delimiters[t].stretchv?this.delimiters[t].stretchv[e]:0]},t.prototype.getChar=function(t,e){return this.variant[t].chars[e]},t.prototype.getVariant=function(t){return this.variant[t]},t.prototype.getCssFont=function(t){return this.cssFontMap[t]||["serif",!1,!1]},t.prototype.getFamily=function(t){return this.cssFamilyPrefix?this.cssFamilyPrefix+", "+t:t},t.prototype.getRemappedChar=function(t,e){return(this.remapChars[t]||{})[e]},t.OPTIONS={unknownFamily:"serif"},t.JAX="common",t.NAME="",t.defaultVariants=[["normal"],["bold","normal"],["italic","normal"],["bold-italic","italic","bold"],["double-struck","bold"],["fraktur","normal"],["bold-fraktur","bold","fraktur"],["script","italic"],["bold-script","bold-italic","script"],["sans-serif","normal"],["bold-sans-serif","bold","sans-serif"],["sans-serif-italic","italic","sans-serif"],["sans-serif-bold-italic","bold-italic","bold-sans-serif"],["monospace","normal"]],t.defaultCssFonts={normal:["unknown",!1,!1],bold:["unknown",!1,!0],italic:["unknown",!0,!1],"bold-italic":["unknown",!0,!0],"double-struck":["unknown",!1,!0],fraktur:["unknown",!1,!1],"bold-fraktur":["unknown",!1,!0],script:["cursive",!1,!1],"bold-script":["cursive",!1,!0],"sans-serif":["sans-serif",!1,!1],"bold-sans-serif":["sans-serif",!1,!0],"sans-serif-italic":["sans-serif",!0,!1],"sans-serif-bold-italic":["sans-serif",!0,!0],monospace:["monospace",!1,!1]},t.defaultCssFamilyPrefix="",t.VariantSmp={bold:[119808,119834,120488,120514,120782],italic:[119860,119886,120546,120572],"bold-italic":[119912,119938,120604,120630],script:[119964,119990],"bold-script":[120016,120042],fraktur:[120068,120094],"double-struck":[120120,120146,,,120792],"bold-fraktur":[120172,120198],"sans-serif":[120224,120250,,,120802],"bold-sans-serif":[120276,120302,120662,120688,120812],"sans-serif-italic":[120328,120354],"sans-serif-bold-italic":[120380,120406,120720,120746],monospace:[120432,120458,,,120822]},t.SmpRanges=[[0,65,90],[1,97,122],[2,913,937],[3,945,969],[4,48,57]],t.SmpRemap={119893:8462,119965:8492,119968:8496,119969:8497,119971:8459,119972:8464,119975:8466,119976:8499,119981:8475,119994:8495,119996:8458,120004:8500,120070:8493,120075:8460,120076:8465,120085:8476,120093:8488,120122:8450,120127:8461,120133:8469,120135:8473,120136:8474,120137:8477,120145:8484},t.SmpRemapGreekU={8711:25,1012:17},t.SmpRemapGreekL={977:27,981:29,982:31,1008:28,1009:30,1013:26,8706:25},t.defaultAccentMap={768:"\u02cb",769:"\u02ca",770:"\u02c6",771:"\u02dc",772:"\u02c9",774:"\u02d8",775:"\u02d9",776:"\xa8",778:"\u02da",780:"\u02c7",8594:"\u20d7",8242:"'",8243:"''",8244:"'''",8245:"`",8246:"``",8247:"```",8279:"''''",8400:"\u21bc",8401:"\u21c0",8406:"\u2190",8417:"\u2194",8432:"*",8411:"...",8412:"....",8428:"\u21c1",8429:"\u21bd",8430:"\u2190",8431:"\u2192"},t.defaultMoMap={45:"\u2212"},t.defaultMnMap={45:"\u2212"},t.defaultParams={x_height:.442,quad:1,num1:.676,num2:.394,num3:.444,denom1:.686,denom2:.345,sup1:.413,sup2:.363,sup3:.289,sub1:.15,sub2:.247,sup_drop:.386,sub_drop:.05,delim1:2.39,delim2:1,axis_height:.25,rule_thickness:.06,big_op_spacing1:.111,big_op_spacing2:.167,big_op_spacing3:.2,big_op_spacing4:.6,big_op_spacing5:.1,surd_height:.075,scriptspace:.05,nulldelimiterspace:.12,delimiterfactor:901,delimitershortfall:.3,min_rule_thickness:1.25,separation_factor:1.75,extra_ic:.033},t.defaultDelimiters={},t.defaultChars={},t.defaultSizeVariants=[],t.defaultStretchVariants=[],t}();e.FontData=l},5373:function(t,e){var r=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonArrow=e.CommonDiagonalArrow=e.CommonDiagonalStrike=e.CommonBorder2=e.CommonBorder=e.arrowBBox=e.diagonalArrowDef=e.arrowDef=e.arrowBBoxW=e.arrowBBoxHD=e.arrowHead=e.fullBorder=e.fullPadding=e.fullBBox=e.sideNames=e.sideIndex=e.SOLID=e.PADDING=e.THICKNESS=e.ARROWY=e.ARROWDX=e.ARROWX=void 0,e.ARROWX=4,e.ARROWDX=1,e.ARROWY=2,e.THICKNESS=.067,e.PADDING=.2,e.SOLID=e.THICKNESS+"em solid",e.sideIndex={top:0,right:1,bottom:2,left:3},e.sideNames=Object.keys(e.sideIndex),e.fullBBox=function(t){return new Array(4).fill(t.thickness+t.padding)},e.fullPadding=function(t){return new Array(4).fill(t.padding)},e.fullBorder=function(t){return new Array(4).fill(t.thickness)};e.arrowHead=function(t){return Math.max(t.padding,t.thickness*(t.arrowhead.x+t.arrowhead.dx+1))};e.arrowBBoxHD=function(t,e){if(t.childNodes[0]){var r=t.childNodes[0].getBBox(),o=r.h,n=r.d;e[0]=e[2]=Math.max(0,t.thickness*t.arrowhead.y-(o+n)/2)}return e};e.arrowBBoxW=function(t,e){if(t.childNodes[0]){var r=t.childNodes[0].getBBox().w;e[1]=e[3]=Math.max(0,t.thickness*t.arrowhead.y-r/2)}return e},e.arrowDef={up:[-Math.PI/2,!1,!0,"verticalstrike"],down:[Math.PI/2,!1,!0,"verticakstrike"],right:[0,!1,!1,"horizontalstrike"],left:[Math.PI,!1,!1,"horizontalstrike"],updown:[Math.PI/2,!0,!0,"verticalstrike uparrow downarrow"],leftright:[0,!0,!1,"horizontalstrike leftarrow rightarrow"]},e.diagonalArrowDef={updiagonal:[-1,0,!1,"updiagonalstrike northeastarrow"],northeast:[-1,0,!1,"updiagonalstrike updiagonalarrow"],southeast:[1,0,!1,"downdiagonalstrike"],northwest:[1,Math.PI,!1,"downdiagonalstrike"],southwest:[-1,Math.PI,!1,"updiagonalstrike"],northeastsouthwest:[-1,0,!0,"updiagonalstrike northeastarrow updiagonalarrow southwestarrow"],northwestsoutheast:[1,0,!0,"downdiagonalstrike northwestarrow southeastarrow"]},e.arrowBBox={up:function(t){return(0,e.arrowBBoxW)(t,[(0,e.arrowHead)(t),0,t.padding,0])},down:function(t){return(0,e.arrowBBoxW)(t,[t.padding,0,(0,e.arrowHead)(t),0])},right:function(t){return(0,e.arrowBBoxHD)(t,[0,(0,e.arrowHead)(t),0,t.padding])},left:function(t){return(0,e.arrowBBoxHD)(t,[0,t.padding,0,(0,e.arrowHead)(t)])},updown:function(t){return(0,e.arrowBBoxW)(t,[(0,e.arrowHead)(t),0,(0,e.arrowHead)(t),0])},leftright:function(t){return(0,e.arrowBBoxHD)(t,[0,(0,e.arrowHead)(t),0,(0,e.arrowHead)(t)])}};e.CommonBorder=function(t){return function(r){var o=e.sideIndex[r];return[r,{renderer:t,bbox:function(t){var e=[0,0,0,0];return e[o]=t.thickness+t.padding,e},border:function(t){var e=[0,0,0,0];return e[o]=t.thickness,e}}]}};e.CommonBorder2=function(t){return function(r,o,n){var i=e.sideIndex[o],a=e.sideIndex[n];return[r,{renderer:t,bbox:function(t){var e=t.thickness+t.padding,r=[0,0,0,0];return r[i]=r[a]=e,r},border:function(t){var e=[0,0,0,0];return e[i]=e[a]=t.thickness,e},remove:o+" "+n}]}};e.CommonDiagonalStrike=function(t){return function(r){var o="mjx-"+r.charAt(0)+"strike";return[r+"diagonalstrike",{renderer:t(o),bbox:e.fullBBox}]}};e.CommonDiagonalArrow=function(t){return function(o){var n=r(e.diagonalArrowDef[o],4),i=n[0],a=n[1],s=n[2];return[o+"arrow",{renderer:function(e,o){var n=r(e.arrowAW(),2),l=n[0],c=n[1],h=e.arrow(c,i*(l-a),s);t(e,h)},bbox:function(t){var e=t.arrowData(),o=e.a,n=e.x,i=e.y,a=r([t.arrowhead.x,t.arrowhead.y,t.arrowhead.dx],3),s=a[0],l=a[1],c=a[2],h=r(t.getArgMod(s+c,l),2),u=h[0],p=h[1],d=i+(u>o?t.thickness*p*Math.sin(u-o):0),f=n+(u>Math.PI/2-o?t.thickness*p*Math.sin(u+o-Math.PI/2):0);return[d,f,d,f]},remove:n[3]}]}};e.CommonArrow=function(t){return function(o){var n=r(e.arrowDef[o],4),i=n[0],a=n[1],s=n[2],l=n[3];return[o+"arrow",{renderer:function(e,o){var n=e.getBBox(),l=n.w,c=n.h,h=n.d,u=r(s?[c+h,"X"]:[l,"Y"],2),p=u[0],d=u[1],f=e.getOffset(d),y=e.arrow(p,i,a,d,f);t(e,y)},bbox:e.arrowBBox[o],remove:l}]}}},716:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},i.apply(this,arguments)},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonOutputJax=void 0;var l=r(3985),c=r(4769),h=r(9077),u=r(6914),p=r(5878),d=r(5888),f=function(t){function e(e,r,o){void 0===e&&(e=null),void 0===r&&(r=null),void 0===o&&(o=null);var n=this,i=a((0,h.separateOptions)(e,o.OPTIONS),2),s=i[0],l=i[1];return(n=t.call(this,s)||this).factory=n.options.wrapperFactory||new r,n.factory.jax=n,n.cssStyles=n.options.cssStyles||new d.CssStyles,n.font=n.options.font||new o(l),n.unknownCache=new Map,n}return n(e,t),e.prototype.typeset=function(t,e){this.setDocument(e);var r=this.createNode();return this.toDOM(t,r,e),r},e.prototype.createNode=function(){var t=this.constructor.NAME;return this.html("mjx-container",{class:"MathJax",jax:t})},e.prototype.setScale=function(t){var e=this.math.metrics.scale*this.options.scale;1!==e&&this.adaptor.setStyle(t,"fontSize",(0,u.percent)(e))},e.prototype.toDOM=function(t,e,r){void 0===r&&(r=null),this.setDocument(r),this.math=t,this.pxPerEm=t.metrics.ex/this.font.params.x_height,t.root.setTeXclass(null),this.setScale(e),this.nodeMap=new Map,this.container=e,this.processMath(t.root,e),this.nodeMap=null,this.executeFilters(this.postFilters,t,r,e)},e.prototype.getBBox=function(t,e){this.setDocument(e),this.math=t,t.root.setTeXclass(null),this.nodeMap=new Map;var r=this.factory.wrap(t.root).getOuterBBox();return this.nodeMap=null,r},e.prototype.getMetrics=function(t){var e,r;this.setDocument(t);var o=this.adaptor,n=this.getMetricMaps(t);try{for(var i=s(t.math),a=i.next();!a.done;a=i.next()){var l=a.value,h=o.parent(l.start.node);if(l.state()<c.STATE.METRICS&&h){var u=n[l.display?1:0].get(h),p=u.em,d=u.ex,f=u.containerWidth,y=u.lineWidth,m=u.scale,v=u.family;l.setMetrics(p,d,f,y,m),this.options.mtextInheritFont&&(l.outputData.mtextFamily=v),this.options.merrorInheritFont&&(l.outputData.merrorFamily=v),l.state(c.STATE.METRICS)}}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},e.prototype.getMetricsFor=function(t,e){var r=this.options.mtextInheritFont||this.options.merrorInheritFont,o=this.getTestElement(t,e),n=this.measureMetrics(o,r);return this.adaptor.remove(o),n},e.prototype.getMetricMaps=function(t){var e,r,o,n,i,a,l,h,u,p,d=this.adaptor,f=[new Map,new Map];try{for(var y=s(t.math),m=y.next();!m.done;m=y.next()){var v=m.value;if((C=d.parent(v.start.node))&&v.state()<c.STATE.METRICS){var g=f[v.display?1:0];g.has(C)||g.set(C,this.getTestElement(C,v.display))}}}catch(t){e={error:t}}finally{try{m&&!m.done&&(r=y.return)&&r.call(y)}finally{if(e)throw e.error}}var b=this.options.mtextInheritFont||this.options.merrorInheritFont,x=[new Map,new Map];try{for(var _=s(x.keys()),M=_.next();!M.done;M=_.next()){var w=M.value;try{for(var S=(i=void 0,s(f[w].keys())),O=S.next();!O.done;O=S.next()){var C=O.value;x[w].set(C,this.measureMetrics(f[w].get(C),b))}}catch(t){i={error:t}}finally{try{O&&!O.done&&(a=S.return)&&a.call(S)}finally{if(i)throw i.error}}}}catch(t){o={error:t}}finally{try{M&&!M.done&&(n=_.return)&&n.call(_)}finally{if(o)throw o.error}}try{for(var B=s(x.keys()),j=B.next();!j.done;j=B.next()){w=j.value;try{for(var P=(u=void 0,s(f[w].values())),A=P.next();!A.done;A=P.next()){C=A.value;d.remove(C)}}catch(t){u={error:t}}finally{try{A&&!A.done&&(p=P.return)&&p.call(P)}finally{if(u)throw u.error}}}}catch(t){l={error:t}}finally{try{j&&!j.done&&(h=B.return)&&h.call(B)}finally{if(l)throw l.error}}return x},e.prototype.getTestElement=function(t,e){var r=this.adaptor;if(!this.testInline){this.testInline=this.html("mjx-test",{style:{display:"inline-block",width:"100%","font-style":"normal","font-weight":"normal","font-size":"100%","font-size-adjust":"none","text-indent":0,"text-transform":"none","letter-spacing":"normal","word-spacing":"normal",overflow:"hidden",height:"1px","margin-right":"-1px"}},[this.html("mjx-left-box",{style:{display:"inline-block",width:0,float:"left"}}),this.html("mjx-ex-box",{style:{position:"absolute",overflow:"hidden",width:"1px",height:"60ex"}}),this.html("mjx-right-box",{style:{display:"inline-block",width:0,float:"right"}})]),this.testDisplay=r.clone(this.testInline),r.setStyle(this.testDisplay,"display","table"),r.setStyle(this.testDisplay,"margin-right",""),r.setStyle(r.firstChild(this.testDisplay),"display","none");var o=r.lastChild(this.testDisplay);r.setStyle(o,"display","table-cell"),r.setStyle(o,"width","10000em"),r.setStyle(o,"float","")}return r.append(t,r.clone(e?this.testDisplay:this.testInline))},e.prototype.measureMetrics=function(t,e){var r=this.adaptor,o=e?r.fontFamily(t):"",n=r.fontSize(t),i=a(r.nodeSize(r.childNode(t,1)),2),s=i[0],l=i[1],c=s?l/60:n*this.options.exFactor;return{em:n,ex:c,containerWidth:s?"table"===r.getStyle(t,"display")?r.nodeSize(r.lastChild(t))[0]-1:r.nodeBBox(r.lastChild(t)).left-r.nodeBBox(r.firstChild(t)).left-2:1e6,lineWidth:1e6,scale:Math.max(this.options.minScale,this.options.matchFontHeight?c/this.font.params.x_height/n:1),family:o}},e.prototype.styleSheet=function(t){var e,r;if(this.setDocument(t),this.cssStyles.clear(),this.cssStyles.addStyles(this.constructor.commonStyles),"getStyles"in t)try{for(var o=s(t.getStyles()),n=o.next();!n.done;n=o.next()){var i=n.value;this.cssStyles.addStyles(i)}}catch(t){e={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return this.addWrapperStyles(this.cssStyles),this.addFontStyles(this.cssStyles),this.html("style",{id:"MJX-styles"},[this.text("\n"+this.cssStyles.cssText+"\n")])},e.prototype.addFontStyles=function(t){t.addStyles(this.font.styles)},e.prototype.addWrapperStyles=function(t){var e,r;try{for(var o=s(this.factory.getKinds()),n=o.next();!n.done;n=o.next()){var i=n.value;this.addClassStyles(this.factory.getNodeClass(i),t)}}catch(t){e={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},e.prototype.addClassStyles=function(t,e){e.addStyles(t.styles)},e.prototype.setDocument=function(t){t&&(this.document=t,this.adaptor.document=t.document)},e.prototype.html=function(t,e,r,o){return void 0===e&&(e={}),void 0===r&&(r=[]),this.adaptor.node(t,e,r,o)},e.prototype.text=function(t){return this.adaptor.text(t)},e.prototype.fixed=function(t,e){return void 0===e&&(e=3),Math.abs(t)<6e-4?"0":t.toFixed(e).replace(/\.?0+$/,"")},e.prototype.measureText=function(t,e,r){void 0===r&&(r=["",!1,!1]);var o=this.unknownText(t,e);if("-explicitFont"===e){var n=this.cssFontStyles(r);this.adaptor.setAttributes(o,{style:n})}return this.measureTextNodeWithCache(o,t,e,r)},e.prototype.measureTextNodeWithCache=function(t,e,r,o){void 0===o&&(o=["",!1,!1]),"-explicitFont"===r&&(r=[o[0],o[1]?"T":"F",o[2]?"T":"F",""].join("-")),this.unknownCache.has(r)||this.unknownCache.set(r,new Map);var n=this.unknownCache.get(r),i=n.get(e);if(i)return i;var a=this.measureTextNode(t);return n.set(e,a),a},e.prototype.measureXMLnode=function(t){var e=this.adaptor,r=this.html("mjx-xml-block",{style:{display:"inline-block"}},[e.clone(t)]),o=this.html("mjx-baseline",{style:{display:"inline-block",width:0,height:0}}),n=this.html("mjx-measure-xml",{style:{position:"absolute",display:"inline-block","font-family":"initial","line-height":"normal"}},[o,r]);e.append(e.parent(this.math.start.node),this.container),e.append(this.container,n);var i=this.math.metrics.em*this.math.metrics.scale,a=e.nodeBBox(r),s=a.left,l=a.right,c=a.bottom,h=a.top,u=(l-s)/i,p=(e.nodeBBox(o).top-h)/i,d=(c-h)/i-p;return e.remove(this.container),e.remove(n),{w:u,h:p,d:d}},e.prototype.cssFontStyles=function(t,e){void 0===e&&(e={});var r=a(t,3),o=r[0],n=r[1],i=r[2];return e["font-family"]=this.font.getFamily(o),n&&(e["font-style"]="italic"),i&&(e["font-weight"]="bold"),e},e.prototype.getFontData=function(t){return t||(t=new p.Styles),[this.font.getFamily(t.get("font-family")),"italic"===t.get("font-style"),"bold"===t.get("font-weight")]},e.NAME="Common",e.OPTIONS=i(i({},l.AbstractOutputJax.OPTIONS),{scale:1,minScale:.5,mtextInheritFont:!1,merrorInheritFont:!1,mtextFont:"",merrorFont:"serif",mathmlSpacing:!1,skipAttributes:{},exFactor:.5,displayAlign:"center",displayIndent:"0",wrapperFactory:null,font:null,cssStyles:null}),e.commonStyles={},e}(l.AbstractOutputJax);e.CommonOutputJax=f},1541:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return a(e,t),e},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},h=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonWrapper=void 0;var u=r(9879),p=r(8921),d=r(6720),f=s(r(6914)),y=r(5878),m=r(3717),v=r(9250),g=2/18;function b(t,e){return t?e<g?0:g:e}var x=function(t){function e(e,r,o){void 0===o&&(o=null);var n=t.call(this,e,r)||this;return n.parent=null,n.removedStyles=null,n.styles=null,n.variant="",n.bboxComputed=!1,n.stretch=v.NOSTRETCH,n.font=null,n.parent=o,n.font=e.jax.font,n.bbox=m.BBox.zero(),n.getStyles(),n.getVariant(),n.getScale(),n.getSpace(),n.childNodes=r.childNodes.map((function(t){var e=n.wrap(t);return e.bbox.pwidth&&(r.notParent||r.isKind("math"))&&(n.bbox.pwidth=m.BBox.fullWidth),e})),n}return n(e,t),Object.defineProperty(e.prototype,"jax",{get:function(){return this.factory.jax},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"adaptor",{get:function(){return this.factory.jax.adaptor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"metrics",{get:function(){return this.factory.jax.math.metrics},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!this.node.notParent&&!this.node.isToken},enumerable:!1,configurable:!0}),e.prototype.wrap=function(t,e){void 0===e&&(e=null);var r=this.factory.wrap(t,e||this);return e&&e.childNodes.push(r),this.jax.nodeMap.set(t,r),r},e.prototype.getBBox=function(t){if(void 0===t&&(t=!0),this.bboxComputed)return this.bbox;var e=t?this.bbox:m.BBox.zero();return this.computeBBox(e),this.bboxComputed=t,e},e.prototype.getOuterBBox=function(t){var e,r;void 0===t&&(t=!0);var o=this.getBBox(t);if(!this.styles)return o;var n=new m.BBox;Object.assign(n,o);try{for(var i=l(m.BBox.StyleAdjust),a=i.next();!a.done;a=i.next()){var s=c(a.value,2),h=s[0],u=s[1],p=this.styles.get(h);p&&(n[u]+=this.length2em(p,1,n.rscale))}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}return n},e.prototype.computeBBox=function(t,e){var r,o;void 0===e&&(e=!1),t.empty();try{for(var n=l(this.childNodes),i=n.next();!i.done;i=n.next()){var a=i.value;t.append(a.getOuterBBox())}}catch(t){r={error:t}}finally{try{i&&!i.done&&(o=n.return)&&o.call(n)}finally{if(r)throw r.error}}t.clean(),this.fixesPWidth&&this.setChildPWidths(e)&&this.computeBBox(t,!0)},e.prototype.setChildPWidths=function(t,e,r){var o,n;if(void 0===e&&(e=null),void 0===r&&(r=!0),t)return!1;r&&(this.bbox.pwidth="");var i=!1;try{for(var a=l(this.childNodes),s=a.next();!s.done;s=a.next()){var c=s.value,h=c.getOuterBBox();h.pwidth&&c.setChildPWidths(t,null===e?h.w:e,r)&&(i=!0)}}catch(t){o={error:t}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i},e.prototype.invalidateBBox=function(){this.bboxComputed&&(this.bboxComputed=!1,this.parent&&this.parent.invalidateBBox())},e.prototype.copySkewIC=function(t){var e=this.childNodes[0];(null==e?void 0:e.bbox.sk)&&(t.sk=e.bbox.sk),(null==e?void 0:e.bbox.dx)&&(t.dx=e.bbox.dx);var r=this.childNodes[this.childNodes.length-1];(null==r?void 0:r.bbox.ic)&&(t.ic=r.bbox.ic,t.w+=t.ic)},e.prototype.getStyles=function(){var t=this.node.attributes.getExplicit("style");if(t)for(var r=this.styles=new y.Styles(t),o=0,n=e.removeStyles.length;o<n;o++){var i=e.removeStyles[o];r.get(i)&&(this.removedStyles||(this.removedStyles={}),this.removedStyles[i]=r.get(i),r.set(i,""))}},e.prototype.getVariant=function(){if(this.node.isToken){var t=this.node.attributes,r=t.get("mathvariant");if(!t.getExplicit("mathvariant")){var o=t.getList("fontfamily","fontweight","fontstyle");if(this.removedStyles){var n=this.removedStyles;n.fontFamily&&(o.family=n.fontFamily),n.fontWeight&&(o.weight=n.fontWeight),n.fontStyle&&(o.style=n.fontStyle)}o.fontfamily&&(o.family=o.fontfamily),o.fontweight&&(o.weight=o.fontweight),o.fontstyle&&(o.style=o.fontstyle),o.weight&&o.weight.match(/^\d+$/)&&(o.weight=parseInt(o.weight)>600?"bold":"normal"),o.family?r=this.explicitVariant(o.family,o.weight,o.style):(this.node.getProperty("variantForm")&&(r="-tex-variant"),r=(e.BOLDVARIANTS[o.weight]||{})[r]||r,r=(e.ITALICVARIANTS[o.style]||{})[r]||r)}this.variant=r}},e.prototype.explicitVariant=function(t,e,r){var o=this.styles;return o||(o=this.styles=new y.Styles),o.set("fontFamily",t),e&&o.set("fontWeight",e),r&&o.set("fontStyle",r),"-explicitFont"},e.prototype.getScale=function(){var t=1,e=this.parent,r=e?e.bbox.scale:1,o=this.node.attributes,n=Math.min(o.get("scriptlevel"),2),i=o.get("fontsize"),a=this.node.isToken||this.node.isKind("mstyle")?o.get("mathsize"):o.getInherited("mathsize");if(0!==n){t=Math.pow(o.get("scriptsizemultiplier"),n);var s=this.length2em(o.get("scriptminsize"),.8,1);t<s&&(t=s)}this.removedStyles&&this.removedStyles.fontSize&&!i&&(i=this.removedStyles.fontSize),i&&!o.getExplicit("mathsize")&&(a=i),"1"!==a&&(t*=this.length2em(a,1,1)),this.bbox.scale=t,this.bbox.rscale=t/r},e.prototype.getSpace=function(){var t=this.isTopEmbellished(),e=this.node.hasSpacingAttributes();this.jax.options.mathmlSpacing||e?t&&this.getMathMLSpacing():this.getTeXSpacing(t,e)},e.prototype.getMathMLSpacing=function(){var t=this.node.coreMO(),e=t.coreParent(),r=e.parent;if(r&&r.isKind("mrow")&&1!==r.childNodes.length){var o=t.attributes,n=o.get("scriptlevel")>0;this.bbox.L=o.isSet("lspace")?Math.max(0,this.length2em(o.get("lspace"))):b(n,t.lspace),this.bbox.R=o.isSet("rspace")?Math.max(0,this.length2em(o.get("rspace"))):b(n,t.rspace);var i=r.childIndex(e);if(0!==i){var a=r.childNodes[i-1];if(a.isEmbellished){var s=this.jax.nodeMap.get(a).getBBox();s.R&&(this.bbox.L=Math.max(0,this.bbox.L-s.R))}}}},e.prototype.getTeXSpacing=function(t,e){if(!e){var r=this.node.texSpacing();r&&(this.bbox.L=this.length2em(r))}if(t||e){var o=this.node.coreMO().attributes;o.isSet("lspace")&&(this.bbox.L=Math.max(0,this.length2em(o.get("lspace")))),o.isSet("rspace")&&(this.bbox.R=Math.max(0,this.length2em(o.get("rspace"))))}},e.prototype.isTopEmbellished=function(){return this.node.isEmbellished&&!(this.node.parent&&this.node.parent.isEmbellished)},e.prototype.core=function(){return this.jax.nodeMap.get(this.node.core())},e.prototype.coreMO=function(){return this.jax.nodeMap.get(this.node.coreMO())},e.prototype.getText=function(){var t,e,r="";if(this.node.isToken)try{for(var o=l(this.node.childNodes),n=o.next();!n.done;n=o.next()){var i=n.value;i instanceof p.TextNode&&(r+=i.getText())}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r},e.prototype.canStretch=function(t){if(this.stretch=v.NOSTRETCH,this.node.isEmbellished){var e=this.core();e&&e.node!==this.node&&e.canStretch(t)&&(this.stretch=e.stretch)}return 0!==this.stretch.dir},e.prototype.getAlignShift=function(){var t,e=(t=this.node.attributes).getList.apply(t,h([],c(p.indentAttributes),!1)),r=e.indentalign,o=e.indentshift,n=e.indentalignfirst,i=e.indentshiftfirst;return"indentalign"!==n&&(r=n),"auto"===r&&(r=this.jax.options.displayAlign),"indentshift"!==i&&(o=i),"auto"===o&&(o=this.jax.options.displayIndent,"right"!==r||o.match(/^\s*0[a-z]*\s*$/)||(o=("-"+o.trim()).replace(/^--/,""))),[r,this.length2em(o,this.metrics.containerWidth)]},e.prototype.getAlignX=function(t,e,r){return"right"===r?t-(e.w+e.R)*e.rscale:"left"===r?e.L*e.rscale:(t-e.w*e.rscale)/2},e.prototype.getAlignY=function(t,e,r,o,n){return"top"===n?t-r:"bottom"===n?o-e:"center"===n?(t-r-(e-o))/2:0},e.prototype.getWrapWidth=function(t){return this.childNodes[t].getBBox().w},e.prototype.getChildAlign=function(t){return"left"},e.prototype.percent=function(t){return f.percent(t)},e.prototype.em=function(t){return f.em(t)},e.prototype.px=function(t,e){return void 0===e&&(e=-f.BIGDIMEN),f.px(t,e,this.metrics.em)},e.prototype.length2em=function(t,e,r){return void 0===e&&(e=1),void 0===r&&(r=null),null===r&&(r=this.bbox.scale),f.length2em(t,e,r,this.jax.pxPerEm)},e.prototype.unicodeChars=function(t,e){void 0===e&&(e=this.variant);var r=(0,d.unicodeChars)(t),o=this.font.getVariant(e);if(o&&o.chars){var n=o.chars;r=r.map((function(t){return((n[t]||[])[3]||{}).smp||t}))}return r},e.prototype.remapChars=function(t){return t},e.prototype.mmlText=function(t){return this.node.factory.create("text").setText(t)},e.prototype.mmlNode=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.node.factory.create(t,e,r)},e.prototype.createMo=function(t){var e=this.node.factory,r=e.create("text").setText(t),o=e.create("mo",{stretchy:!0},[r]);o.inheritAttributesFrom(this.node);var n=this.wrap(o);return n.parent=this,n},e.prototype.getVariantChar=function(t,e){var r=this.font.getChar(t,e)||[0,0,0,{unknown:!0}];return 3===r.length&&(r[3]={}),r},e.kind="unknown",e.styles={},e.removeStyles=["fontSize","fontFamily","fontWeight","fontStyle","fontVariant","font"],e.skipAttributes={fontfamily:!0,fontsize:!0,fontweight:!0,fontstyle:!0,color:!0,background:!0,class:!0,href:!0,style:!0,xmlns:!0},e.BOLDVARIANTS={bold:{normal:"bold",italic:"bold-italic",fraktur:"bold-fraktur",script:"bold-script","sans-serif":"bold-sans-serif","sans-serif-italic":"sans-serif-bold-italic"},normal:{bold:"normal","bold-italic":"italic","bold-fraktur":"fraktur","bold-script":"script","bold-sans-serif":"sans-serif","sans-serif-bold-italic":"sans-serif-italic"}},e.ITALICVARIANTS={italic:{normal:"italic",bold:"bold-italic","sans-serif":"sans-serif-italic","bold-sans-serif":"sans-serif-bold-italic"},normal:{italic:"normal","bold-italic":"bold","sans-serif-italic":"sans-serif","sans-serif-bold-italic":"bold-sans-serif"}},e}(u.AbstractWrapper);e.CommonWrapper=x},1475:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonWrapperFactory=void 0;var i=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.jax=null,e}return n(e,t),Object.defineProperty(e.prototype,"Wrappers",{get:function(){return this.node},enumerable:!1,configurable:!0}),e.defaultNodes={},e}(r(2506).AbstractWrapperFactory);e.CommonWrapperFactory=i},3438:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTeXAtomMixin=void 0;var i=r(8921);e.CommonTeXAtomMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.computeBBox=function(e,r){if(void 0===r&&(r=!1),t.prototype.computeBBox.call(this,e,r),this.childNodes[0]&&this.childNodes[0].bbox.ic&&(e.ic=this.childNodes[0].bbox.ic),this.node.texClass===i.TEXCLASS.VCENTER){var o=e.h,n=(o+e.d)/2+this.font.params.axis_height-o;e.h+=n,e.d-=n}},e}(t)}},555:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTextNodeMixin=void 0,e.CommonTextNodeMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(t,e){var r,o;void 0===e&&(e=!1);var a=this.parent.variant,s=this.node.getText();if("-explicitFont"===a){var l=this.jax.getFontData(this.parent.styles),c=this.jax.measureText(s,a,l),h=c.w,u=c.h,p=c.d;t.h=u,t.d=p,t.w=h}else{var d=this.remappedText(s,a);t.empty();try{for(var f=n(d),y=f.next();!y.done;y=f.next()){var m=y.value,v=i(this.getVariantChar(a,m),4),g=(u=v[0],p=v[1],h=v[2],v[3]);if(g.unknown){var b=this.jax.measureText(String.fromCodePoint(m),a);h=b.w,u=b.h,p=b.d}t.w+=h,u>t.h&&(t.h=u),p>t.d&&(t.d=p),t.ic=g.ic||0,t.sk=g.sk||0,t.dx=g.dx||0}}catch(t){r={error:t}}finally{try{y&&!y.done&&(o=f.return)&&o.call(f)}finally{if(r)throw r.error}}d.length>1&&(t.sk=0),t.clean()}},e.prototype.remappedText=function(t,e){var r=this.parent.stretch.c;return r?[r]:this.parent.remapChars(this.unicodeChars(t,e))},e.prototype.getStyles=function(){},e.prototype.getVariant=function(){},e.prototype.getScale=function(){},e.prototype.getSpace=function(){},e}(t)}},3345:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMactionMixin=e.TooltipData=void 0;var s=r(6720);e.TooltipData={dx:".2em",dy:".1em",postDelay:600,clearDelay:100,hoverTimer:new Map,clearTimer:new Map,stopTimers:function(t,e){e.clearTimer.has(t)&&(clearTimeout(e.clearTimer.get(t)),e.clearTimer.delete(t)),e.hoverTimer.has(t)&&(clearTimeout(e.hoverTimer.get(t)),e.hoverTimer.delete(t))}},e.CommonMactionMixin=function(t){return function(t){function r(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,a([],i(e),!1))||this,n=o.constructor.actions,s=o.node.attributes.get("actiontype"),l=i(n.get(s)||[function(t,e){},{}],2),c=l[0],h=l[1];return o.action=c,o.data=h,o.getParameters(),o}return n(r,t),Object.defineProperty(r.prototype,"selected",{get:function(){var t=this.node.attributes.get("selection"),e=Math.max(1,Math.min(this.childNodes.length,t))-1;return this.childNodes[e]||this.wrap(this.node.selected)},enumerable:!1,configurable:!0}),r.prototype.getParameters=function(){var t=this.node.attributes.get("data-offsets"),r=i((0,s.split)(t||""),2),o=r[0],n=r[1];this.dx=this.length2em(o||e.TooltipData.dx),this.dy=this.length2em(n||e.TooltipData.dy)},r.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),t.updateFrom(this.selected.getOuterBBox()),this.selected.setChildPWidths(e)},r}(t)}},2057:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMathMixin=void 0,e.CommonMathMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getWrapWidth=function(t){return this.parent?this.getBBox().w:this.metrics.containerWidth/this.jax.pxPerEm},e}(t)}},6200:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return a(e,t),e},l=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},c=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},h=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMencloseMixin=void 0;var u=s(r(5373)),p=r(6720);e.CommonMencloseMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,c([],l(e),!1))||this;return o.notations={},o.renderChild=null,o.msqrt=null,o.padding=u.PADDING,o.thickness=u.THICKNESS,o.arrowhead={x:u.ARROWX,y:u.ARROWY,dx:u.ARROWDX},o.TRBL=[0,0,0,0],o.getParameters(),o.getNotations(),o.removeRedundantNotations(),o.initializeNotations(),o.TRBL=o.getBBoxExtenders(),o}return n(e,t),e.prototype.getParameters=function(){var t=this.node.attributes,e=t.get("data-padding");void 0!==e&&(this.padding=this.length2em(e,u.PADDING));var r=t.get("data-thickness");void 0!==r&&(this.thickness=this.length2em(r,u.THICKNESS));var o=t.get("data-arrowhead");if(void 0!==o){var n=l((0,p.split)(o),3),i=n[0],a=n[1],s=n[2];this.arrowhead={x:i?parseFloat(i):u.ARROWX,y:a?parseFloat(a):u.ARROWY,dx:s?parseFloat(s):u.ARROWDX}}},e.prototype.getNotations=function(){var t,e,r=this.constructor.notations;try{for(var o=h((0,p.split)(this.node.attributes.get("notation"))),n=o.next();!n.done;n=o.next()){var i=n.value,a=r.get(i);a&&(this.notations[i]=a,a.renderChild&&(this.renderChild=a.renderer))}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}},e.prototype.removeRedundantNotations=function(){var t,e,r,o;try{for(var n=h(Object.keys(this.notations)),i=n.next();!i.done;i=n.next()){var a=i.value;if(this.notations[a]){var s=this.notations[a].remove||"";try{for(var l=(r=void 0,h(s.split(/ /))),c=l.next();!c.done;c=l.next()){var u=c.value;delete this.notations[u]}}catch(t){r={error:t}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(r)throw r.error}}}}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.initializeNotations=function(){var t,e;try{for(var r=h(Object.keys(this.notations)),o=r.next();!o.done;o=r.next()){var n=o.value,i=this.notations[n].init;i&&i(this)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=l(this.TRBL,4),o=r[0],n=r[1],i=r[2],a=r[3],s=this.childNodes[0].getBBox();t.combine(s,a,0),t.h+=o,t.d+=i,t.w+=n,this.setChildPWidths(e)},e.prototype.getBBoxExtenders=function(){var t,e,r=[0,0,0,0];try{for(var o=h(Object.keys(this.notations)),n=o.next();!n.done;n=o.next()){var i=n.value;this.maximizeEntries(r,this.notations[i].bbox(this))}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r},e.prototype.getPadding=function(){var t,e,r=this,o=[0,0,0,0];try{for(var n=h(Object.keys(this.notations)),i=n.next();!i.done;i=n.next()){var a=i.value,s=this.notations[a].border;s&&this.maximizeEntries(o,s(this))}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return[0,1,2,3].map((function(t){return r.TRBL[t]-o[t]}))},e.prototype.maximizeEntries=function(t,e){for(var r=0;r<t.length;r++)t[r]<e[r]&&(t[r]=e[r])},e.prototype.getOffset=function(t){var e=l(this.TRBL,4),r=e[0],o=e[1],n=e[2],i=e[3],a=("X"===t?o-i:n-r)/2;return Math.abs(a)>.001?a:0},e.prototype.getArgMod=function(t,e){return[Math.atan2(e,t),Math.sqrt(t*t+e*e)]},e.prototype.arrow=function(t,e,r,o,n){return void 0===o&&(o=""),void 0===n&&(n=0),null},e.prototype.arrowData=function(){var t=l([this.padding,this.thickness],2),e=t[0],r=t[1]*(this.arrowhead.x+Math.max(1,this.arrowhead.dx)),o=this.childNodes[0].getBBox(),n=o.h,i=o.d,a=o.w,s=n+i,c=Math.sqrt(s*s+a*a),h=Math.max(e,r*a/c),u=Math.max(e,r*s/c),p=l(this.getArgMod(a+2*h,s+2*u),2);return{a:p[0],W:p[1],x:h,y:u}},e.prototype.arrowAW=function(){var t=this.childNodes[0].getBBox(),e=t.h,r=t.d,o=t.w,n=l(this.TRBL,4),i=n[0],a=n[1],s=n[2],c=n[3];return this.getArgMod(c+o+a,i+e+r+s)},e.prototype.createMsqrt=function(t){var e=this.node.factory.create("msqrt");e.inheritAttributesFrom(this.node),e.childNodes[0]=t.node;var r=this.wrap(e);return r.parent=this,r},e.prototype.sqrtTRBL=function(){var t=this.msqrt.getBBox(),e=this.msqrt.childNodes[0].getBBox();return[t.h-e.h,0,t.d-e.d,t.w-e.w]},e}(t)}},1346:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMfencedMixin=void 0,e.CommonMfencedMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;return o.mrow=null,o.createMrow(),o.addMrowChildren(),o}return o(e,t),e.prototype.createMrow=function(){var t=this.node.factory.create("inferredMrow");t.inheritAttributesFrom(this.node),this.mrow=this.wrap(t),this.mrow.parent=this},e.prototype.addMrowChildren=function(){var t,e,r=this.node,o=this.mrow;this.addMo(r.open),this.childNodes.length&&o.childNodes.push(this.childNodes[0]);var n=0;try{for(var i=a(this.childNodes.slice(1)),s=i.next();!s.done;s=i.next()){var l=s.value;this.addMo(r.separators[n++]),o.childNodes.push(l)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(e=i.return)&&e.call(i)}finally{if(t)throw t.error}}this.addMo(r.close),o.stretchChildren()},e.prototype.addMo=function(t){if(t){var e=this.wrap(t);this.mrow.childNodes.push(e),e.parent=this.mrow}},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),t.updateFrom(this.mrow.getOuterBBox()),this.setChildPWidths(e)},e}(t)}},5705:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMfracMixin=void 0,e.CommonMfracMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;if(o.bevel=null,o.pad=o.node.getProperty("withDelims")?0:o.font.params.nulldelimiterspace,o.node.attributes.get("bevelled")){var a=o.getBevelData(o.isDisplay()).H,s=o.bevel=o.createMo("/");s.node.attributes.set("symmetric",!0),s.canStretch(1),s.getStretchedVariant([a],!0)}return o}return o(e,t),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),t.empty();var r=this.node.attributes.getList("linethickness","bevelled"),o=r.linethickness,n=r.bevelled,i=this.isDisplay(),a=null;if(n)this.getBevelledBBox(t,i);else{var s=this.length2em(String(o),.06);a=-2*this.pad,0===s?this.getAtopBBox(t,i):(this.getFractionBBox(t,i,s),a-=.2),a+=t.w}t.clean(),this.setChildPWidths(e,a)},e.prototype.getFractionBBox=function(t,e,r){var o=this.childNodes[0].getOuterBBox(),n=this.childNodes[1].getOuterBBox(),i=this.font.params.axis_height,a=this.getTUV(e,r),s=a.T,l=a.u,c=a.v;t.combine(o,0,i+s+Math.max(o.d*o.rscale,l)),t.combine(n,0,i-s-Math.max(n.h*n.rscale,c)),t.w+=2*this.pad+.2},e.prototype.getTUV=function(t,e){var r=this.font.params,o=r.axis_height,n=(t?3.5:1.5)*e;return{T:(t?3.5:1.5)*e,u:(t?r.num1:r.num2)-o-n,v:(t?r.denom1:r.denom2)+o-n}},e.prototype.getAtopBBox=function(t,e){var r=this.getUVQ(e),o=r.u,n=r.v,i=r.nbox,a=r.dbox;t.combine(i,0,o),t.combine(a,0,-n),t.w+=2*this.pad},e.prototype.getUVQ=function(t){var e=this.childNodes[0].getOuterBBox(),r=this.childNodes[1].getOuterBBox(),o=this.font.params,i=n(t?[o.num1,o.denom1]:[o.num3,o.denom2],2),a=i[0],s=i[1],l=(t?7:3)*o.rule_thickness,c=a-e.d*e.scale-(r.h*r.scale-s);return c<l&&(a+=(l-c)/2,s+=(l-c)/2,c=l),{u:a,v:s,q:c,nbox:e,dbox:r}},e.prototype.getBevelledBBox=function(t,e){var r=this.getBevelData(e),o=r.u,n=r.v,i=r.delta,a=r.nbox,s=r.dbox,l=this.bevel.getOuterBBox();t.combine(a,0,o),t.combine(l,t.w-i/2,0),t.combine(s,t.w-i/2,n)},e.prototype.getBevelData=function(t){var e=this.childNodes[0].getOuterBBox(),r=this.childNodes[1].getOuterBBox(),o=t?.4:.15,n=Math.max(e.scale*(e.h+e.d),r.scale*(r.h+r.d))+2*o,i=this.font.params.axis_height;return{H:n,delta:o,u:e.scale*(e.d-e.h)/2+i+o,v:r.scale*(r.d-r.h)/2+i-o,nbox:e,dbox:r}},e.prototype.canStretch=function(t){return!1},e.prototype.isDisplay=function(){var t=this.node.attributes.getList("displaystyle","scriptlevel"),e=t.displaystyle,r=t.scriptlevel;return e&&0===r},e.prototype.getWrapWidth=function(t){var e=this.node.attributes;return e.get("bevelled")?this.childNodes[t].getOuterBBox().w:this.getBBox().w-(this.length2em(e.get("linethickness"))?.2:0)-2*this.pad},e.prototype.getChildAlign=function(t){var e=this.node.attributes;return e.get("bevelled")?"left":e.get(["numalign","denomalign"][t])},e}(t)}},7969:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMglyphMixin=void 0,e.CommonMglyphMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;return o.getParameters(),o}return o(e,t),e.prototype.getParameters=function(){var t=this.node.attributes.getList("width","height","valign","src","index"),e=t.width,r=t.height,o=t.valign,n=t.src,i=t.index;if(n)this.width="auto"===e?1:this.length2em(e),this.height="auto"===r?1:this.length2em(r),this.valign=this.length2em(o||"0");else{var a=String.fromCodePoint(parseInt(i)),s=this.node.factory;this.charWrapper=this.wrap(s.create("text").setText(a)),this.charWrapper.parent=this}},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),this.charWrapper?t.updateFrom(this.charWrapper.getBBox()):(t.w=this.width,t.h=this.height+this.valign,t.d=-this.valign)},e}(t)}},1419:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMiMixin=void 0,e.CommonMiMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(e,r){void 0===r&&(r=!1),t.prototype.computeBBox.call(this,e),this.copySkewIC(e)},e}(t)}},9906:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMmultiscriptsMixin=e.ScriptNames=e.NextScript=void 0;var l=r(3717);e.NextScript={base:"subList",subList:"supList",supList:"subList",psubList:"psupList",psupList:"psubList"},e.ScriptNames=["sup","sup","psup","psub"],e.CommonMmultiscriptsMixin=function(t){return function(t){function r(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,a([],i(e),!1))||this;return o.scriptData=null,o.firstPrescript=0,o.getScriptData(),o}return n(r,t),r.prototype.combinePrePost=function(t,e){var r=new l.BBox(t);return r.combine(e,0,0),r},r.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.font.params.scriptspace,o=this.scriptData,n=this.combinePrePost(o.sub,o.psub),a=this.combinePrePost(o.sup,o.psup),s=i(this.getUVQ(n,a),2),l=s[0],c=s[1];if(t.empty(),o.numPrescripts&&(t.combine(o.psup,r,l),t.combine(o.psub,r,c)),t.append(o.base),o.numScripts){var h=t.w;t.combine(o.sup,h,l),t.combine(o.sub,h,c),t.w+=r}t.clean(),this.setChildPWidths(e)},r.prototype.getScriptData=function(){var t=this.scriptData={base:null,sub:l.BBox.empty(),sup:l.BBox.empty(),psub:l.BBox.empty(),psup:l.BBox.empty(),numPrescripts:0,numScripts:0},e=this.getScriptBBoxLists();this.combineBBoxLists(t.sub,t.sup,e.subList,e.supList),this.combineBBoxLists(t.psub,t.psup,e.psubList,e.psupList),t.base=e.base[0],t.numPrescripts=e.psubList.length,t.numScripts=e.subList.length},r.prototype.getScriptBBoxLists=function(){var t,r,o={base:[],subList:[],supList:[],psubList:[],psupList:[]},n="base";try{for(var i=s(this.childNodes),a=i.next();!a.done;a=i.next()){var l=a.value;l.node.isKind("mprescripts")?n="psubList":(o[n].push(l.getOuterBBox()),n=e.NextScript[n])}}catch(e){t={error:e}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}return this.firstPrescript=o.subList.length+o.supList.length+2,this.padLists(o.subList,o.supList),this.padLists(o.psubList,o.psupList),o},r.prototype.padLists=function(t,e){t.length>e.length&&e.push(l.BBox.empty())},r.prototype.combineBBoxLists=function(t,e,r,o){for(var n=0;n<r.length;n++){var a=i(this.getScaledWHD(r[n]),3),s=a[0],l=a[1],c=a[2],h=i(this.getScaledWHD(o[n]),3),u=h[0],p=h[1],d=h[2],f=Math.max(s,u);t.w+=f,e.w+=f,l>t.h&&(t.h=l),c>t.d&&(t.d=c),p>e.h&&(e.h=p),d>e.d&&(e.d=d)}},r.prototype.getScaledWHD=function(t){var e=t.w,r=t.h,o=t.d,n=t.rscale;return[e*n,r*n,o*n]},r.prototype.getUVQ=function(e,r){var o;if(!this.UVQ){var n=i([0,0,0],3),a=n[0],s=n[1],l=n[2];0===e.h&&0===e.d?a=this.getU():0===r.h&&0===r.d?a=-this.getV():(a=(o=i(t.prototype.getUVQ.call(this,e,r),3))[0],s=o[1],l=o[2]),this.UVQ=[a,s,l]}return this.UVQ},r}(t)}},2304:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMnMixin=void 0,e.CommonMnMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.remapChars=function(t){if(t.length){var e=this.font.getRemappedChar("mn",t[0]);if(e){var r=this.unicodeChars(e,this.variant);1===r.length?t[0]=r[0]:t=r.concat(t.slice(1))}}return t},e}(t)}},437:function(t,e,r){var o,n,i=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),a=this&&this.__assign||function(){return a=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},a.apply(this,arguments)},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},l=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},c=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMoMixin=e.DirectionVH=void 0;var h=r(3717),u=r(6720),p=r(9250);e.DirectionVH=((n={})[1]="v",n[2]="h",n),e.CommonMoMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,l([],s(e),!1))||this;return o.size=null,o.isAccent=o.node.isAccent,o}return i(e,t),e.prototype.computeBBox=function(t,e){if(void 0===e&&(e=!1),this.protoBBox(t),this.node.attributes.get("symmetric")&&2!==this.stretch.dir){var r=this.getCenterOffset(t);t.h+=r,t.d-=r}this.node.getProperty("mathaccent")&&(0===this.stretch.dir||this.size>=0)&&(t.w=0)},e.prototype.protoBBox=function(e){var r=0!==this.stretch.dir;r&&null===this.size&&this.getStretchedVariant([0]),r&&this.size<0||(t.prototype.computeBBox.call(this,e),this.copySkewIC(e))},e.prototype.getAccentOffset=function(){var t=h.BBox.empty();return this.protoBBox(t),-t.w/2},e.prototype.getCenterOffset=function(e){return void 0===e&&(e=null),e||(e=h.BBox.empty(),t.prototype.computeBBox.call(this,e)),(e.h+e.d)/2+this.font.params.axis_height-e.h},e.prototype.getVariant=function(){this.node.attributes.get("largeop")?this.variant=this.node.attributes.get("displaystyle")?"-largeop":"-smallop":this.node.attributes.getExplicit("mathvariant")||!1!==this.node.getProperty("pseudoscript")?t.prototype.getVariant.call(this):this.variant="-tex-variant"},e.prototype.canStretch=function(t){if(0!==this.stretch.dir)return this.stretch.dir===t;if(!this.node.attributes.get("stretchy"))return!1;var e=this.getText();if(1!==Array.from(e).length)return!1;var r=this.font.getDelimiter(e.codePointAt(0));return this.stretch=r&&r.dir===t?r:p.NOSTRETCH,0!==this.stretch.dir},e.prototype.getStretchedVariant=function(t,e){var r,o;if(void 0===e&&(e=!1),0!==this.stretch.dir){var n=this.getWH(t),i=this.getSize("minsize",0),s=this.getSize("maxsize",1/0),l=this.node.getProperty("mathaccent");n=Math.max(i,Math.min(s,n));var h=this.font.params.delimiterfactor/1e3,u=this.font.params.delimitershortfall,p=i||e?n:l?Math.min(n/h,n+u):Math.max(n*h,n-u),d=this.stretch,f=d.c||this.getText().codePointAt(0),y=0;if(d.sizes)try{for(var m=c(d.sizes),v=m.next();!v.done;v=m.next()){if(v.value>=p)return l&&y&&y--,this.variant=this.font.getSizeVariant(f,y),this.size=y,void(d.schar&&d.schar[y]&&(this.stretch=a(a({},this.stretch),{c:d.schar[y]})));y++}}catch(t){r={error:t}}finally{try{v&&!v.done&&(o=m.return)&&o.call(m)}finally{if(r)throw r.error}}d.stretch?(this.size=-1,this.invalidateBBox(),this.getStretchBBox(t,this.checkExtendedHeight(n,d),d)):(this.variant=this.font.getSizeVariant(f,y-1),this.size=y-1)}},e.prototype.getSize=function(t,e){var r=this.node.attributes;return r.isSet(t)&&(e=this.length2em(r.get(t),1,1)),e},e.prototype.getWH=function(t){if(0===t.length)return 0;if(1===t.length)return t[0];var e=s(t,2),r=e[0],o=e[1],n=this.font.params.axis_height;return this.node.attributes.get("symmetric")?2*Math.max(r-n,o+n):r+o},e.prototype.getStretchBBox=function(t,e,r){var o;r.hasOwnProperty("min")&&r.min>e&&(e=r.min);var n=s(r.HDW,3),i=n[0],a=n[1],l=n[2];1===this.stretch.dir?(i=(o=s(this.getBaseline(t,e,r),2))[0],a=o[1]):l=e,this.bbox.h=i,this.bbox.d=a,this.bbox.w=l},e.prototype.getBaseline=function(t,e,r){var o=2===t.length&&t[0]+t[1]===e,n=this.node.attributes.get("symmetric"),i=s(o?t:[e,0],2),a=i[0],l=i[1],c=s([a+l,0],2),h=c[0],u=c[1];if(n){var p=this.font.params.axis_height;o&&(h=2*Math.max(a-p,l+p)),u=h/2-p}else if(o)u=l;else{var d=s(r.HDW||[.75,.25],2),f=d[0],y=d[1];u=y*(h/(f+y))}return[h-u,u]},e.prototype.checkExtendedHeight=function(t,e){if(e.fullExt){var r=s(e.fullExt,2),o=r[0],n=r[1];t=n+Math.ceil(Math.max(0,t-n)/o)*o}return t},e.prototype.remapChars=function(t){var e=this.node.getProperty("primes");if(e)return(0,u.unicodeChars)(e);if(1===t.length){var r=this.node.coreParent().parent,o=this.isAccent&&!r.isKind("mrow")?"accent":"mo",n=this.font.getRemappedChar(o,t[0]);n&&(t=this.unicodeChars(n,this.variant))}return t},e}(t)}},7481:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMpaddedMixin=void 0,e.CommonMpaddedMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getDimens=function(){var t=this.node.attributes.getList("width","height","depth","lspace","voffset"),e=this.childNodes[0].getBBox(),r=e.w,o=e.h,n=e.d,i=r,a=o,s=n,l=0,c=0,h=0;""!==t.width&&(r=this.dimen(t.width,e,"w",0)),""!==t.height&&(o=this.dimen(t.height,e,"h",0)),""!==t.depth&&(n=this.dimen(t.depth,e,"d",0)),""!==t.voffset&&(c=this.dimen(t.voffset,e)),""!==t.lspace&&(l=this.dimen(t.lspace,e));var u=this.node.attributes.get("data-align");return u&&(h=this.getAlignX(r,e,u)),[a,s,i,o-a,n-s,r-i,l,c,h]},e.prototype.dimen=function(t,e,r,o){void 0===r&&(r=""),void 0===o&&(o=null);var n=(t=String(t)).match(/width|height|depth/),i=n?e[n[0].charAt(0)]:r?e[r]:0,a=this.length2em(t,i)||0;return t.match(/^[-+]/)&&r&&(a+=i),null!=o&&(a=Math.max(o,a)),a},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=n(this.getDimens(),6),o=r[0],i=r[1],a=r[2],s=r[3],l=r[4],c=r[5];t.w=a+c,t.h=o+s,t.d=i+l,this.setChildPWidths(e,t.w)},e.prototype.getWrapWidth=function(t){return this.getBBox().w},e.prototype.getChildAlign=function(t){return this.node.attributes.get("data-align")||"left"},e}(t)}},5997:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMrootMixin=void 0,e.CommonMrootMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"surd",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"root",{get:function(){return 1},enumerable:!1,configurable:!0}),e.prototype.combineRootBBox=function(t,e,r){var o=this.childNodes[this.root].getOuterBBox(),n=this.getRootDimens(e,r)[1];t.combine(o,0,n)},e.prototype.getRootDimens=function(t,e){var r=this.childNodes[this.surd],o=this.childNodes[this.root].getOuterBBox(),n=(r.size<0?.5:.6)*t.w,i=o.w,a=o.rscale,s=Math.max(i,n/a),l=Math.max(0,s-i);return[s*a-n,this.rootHeight(o,t,r.size,e),l]},e.prototype.rootHeight=function(t,e,r,o){var n=e.h+e.d;return(r<0?1.9:.55*n)-(n-o)+Math.max(0,t.d*t.rscale)},e}(t)}},9323:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonInferredMrowMixin=e.CommonMrowMixin=void 0;var l=r(3717);e.CommonMrowMixin=function(t){return function(t){function e(){for(var e,r,o=[],n=0;n<arguments.length;n++)o[n]=arguments[n];var c=t.apply(this,a([],i(o),!1))||this;c.stretchChildren();try{for(var h=s(c.childNodes),u=h.next();!u.done;u=h.next()){var p=u.value;if(p.bbox.pwidth){c.bbox.pwidth=l.BBox.fullWidth;break}}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=h.return)&&r.call(h)}finally{if(e)throw e.error}}return c}return n(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.stretchChildren=function(){var t,e,r,o,n,i,a=[];try{for(var l=s(this.childNodes),c=l.next();!c.done;c=l.next()){(S=c.value).canStretch(1)&&a.push(S)}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}var h=a.length,u=this.childNodes.length;if(h&&u>1){var p=0,d=0,f=h>1&&h===u;try{for(var y=s(this.childNodes),m=y.next();!m.done;m=y.next()){var v=0===(S=m.value).stretch.dir;if(f||v){var g=S.getOuterBBox(v),b=g.h,x=g.d,_=g.rscale;(b*=_)>p&&(p=b),(x*=_)>d&&(d=x)}}}catch(t){r={error:t}}finally{try{m&&!m.done&&(o=y.return)&&o.call(y)}finally{if(r)throw r.error}}try{for(var M=s(a),w=M.next();!w.done;w=M.next()){var S;(S=w.value).coreMO().getStretchedVariant([p,d])}}catch(t){n={error:t}}finally{try{w&&!w.done&&(i=M.return)&&i.call(M)}finally{if(n)throw n.error}}}},e}(t)},e.CommonInferredMrowMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getScale=function(){this.bbox.scale=this.parent.bbox.scale,this.bbox.rscale=1},e}(t)}},6920:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsMixin=void 0,e.CommonMsMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this,a=o.node.attributes,s=a.getList("lquote","rquote");return"monospace"!==o.variant&&(a.isSet("lquote")||'"'!==s.lquote||(s.lquote="\u201c"),a.isSet("rquote")||'"'!==s.rquote||(s.rquote="\u201d")),o.childNodes.unshift(o.createText(s.lquote)),o.childNodes.push(o.createText(s.rquote)),o}return o(e,t),e.prototype.createText=function(t){var e=this.wrap(this.mmlText(t));return e.parent=this,e},e}(t)}},37:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMspaceMixin=void 0,e.CommonMspaceMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.node.attributes;t.w=this.length2em(r.get("width"),0),t.h=this.length2em(r.get("height"),0),t.d=this.length2em(r.get("depth"),0)},e.prototype.handleVariant=function(){},e}(t)}},222:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsqrtMixin=void 0;var s=r(3717);e.CommonMsqrtMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,a([],i(e),!1))||this,n=o.createMo("\u221a");n.canStretch(1);var s=o.childNodes[o.base].getOuterBBox(),l=s.h,c=s.d,h=o.font.params.rule_thickness,u=o.node.attributes.get("displaystyle")?o.font.params.x_height:h;return o.surdH=l+c+2*h+u/4,n.getStretchedVariant([o.surdH-c,c],!0),o}return n(e,t),Object.defineProperty(e.prototype,"base",{get:function(){return 0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"surd",{get:function(){return 1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"root",{get:function(){return null},enumerable:!1,configurable:!0}),e.prototype.createMo=function(e){var r=t.prototype.createMo.call(this,e);return this.childNodes.push(r),r},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.childNodes[this.surd].getBBox(),o=new s.BBox(this.childNodes[this.base].getOuterBBox()),n=this.getPQ(r)[1],a=this.font.params.rule_thickness,l=o.h+n+a,c=i(this.getRootDimens(r,l),1)[0];t.h=l+a,this.combineRootBBox(t,r,l),t.combine(r,c,l-r.h),t.combine(o,c+r.w,0),t.clean(),this.setChildPWidths(e)},e.prototype.combineRootBBox=function(t,e,r){},e.prototype.getPQ=function(t){var e=this.font.params.rule_thickness,r=this.node.attributes.get("displaystyle")?this.font.params.x_height:e;return[r,t.h+t.d>this.surdH?(t.h+t.d-(this.surdH-2*e-r/2))/2:e+r/4]},e.prototype.getRootDimens=function(t,e){return[0,0,0,0]},e}(t)}},3069:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsubsupMixin=e.CommonMsupMixin=e.CommonMsubMixin=void 0,e.CommonMsubMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.sub]},enumerable:!1,configurable:!0}),e.prototype.getOffset=function(){return[0,-this.getV()]},e}(t),e.useIC=!1,e},e.CommonMsupMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.sup]},enumerable:!1,configurable:!0}),e.prototype.getOffset=function(){return[this.getAdjustedIc()-(this.baseRemoveIc?0:this.baseIc),this.getU()]},e}(t)},e.CommonMsubsupMixin=function(t){var e;return e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.UVQ=null,e}return o(e,t),Object.defineProperty(e.prototype,"subChild",{get:function(){return this.childNodes[this.node.sub]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"supChild",{get:function(){return this.childNodes[this.node.sup]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.baseChild.getOuterBBox(),o=n([this.subChild.getOuterBBox(),this.supChild.getOuterBBox()],2),i=o[0],a=o[1];t.empty(),t.append(r);var s=this.getBaseWidth(),l=this.getAdjustedIc(),c=n(this.getUVQ(),2),h=c[0],u=c[1];t.combine(i,s,u),t.combine(a,s+l,h),t.w+=this.font.params.scriptspace,t.clean(),this.setChildPWidths(e)},e.prototype.getUVQ=function(t,e){void 0===t&&(t=this.subChild.getOuterBBox()),void 0===e&&(e=this.supChild.getOuterBBox());var r=this.baseCore.getOuterBBox();if(this.UVQ)return this.UVQ;var o=this.font.params,i=3*o.rule_thickness,a=this.length2em(this.node.attributes.get("subscriptshift"),o.sub2),s=this.baseCharZero(r.d*this.baseScale+o.sub_drop*t.rscale),l=n([this.getU(),Math.max(s,a)],2),c=l[0],h=l[1],u=c-e.d*e.rscale-(t.h*t.rscale-h);if(u<i){h+=i-u;var p=.8*o.x_height-(c-e.d*e.rscale);p>0&&(c+=p,h-=p)}return c=Math.max(this.length2em(this.node.attributes.get("superscriptshift"),c),c),h=Math.max(this.length2em(this.node.attributes.get("subscriptshift"),h),h),u=c-e.d*e.rscale-(t.h*t.rscale-h),this.UVQ=[c,-h,u],this.UVQ},e}(t),e.useIC=!1,e}},8589:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtableMixin=void 0;var l=r(3717),c=r(6720),h=r(1490);e.CommonMtableMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,a([],i(e),!1))||this;o.numCols=0,o.numRows=0,o.data=null,o.pwidthCells=[],o.pWidth=0,o.numCols=(0,h.max)(o.tableRows.map((function(t){return t.numCells}))),o.numRows=o.childNodes.length,o.hasLabels=o.childNodes.reduce((function(t,e){return t||e.node.isKind("mlabeledtr")}),!1),o.findContainer(),o.isTop=!o.container||o.container.node.isKind("math")&&!o.container.parent,o.isTop&&(o.jax.table=o),o.getPercentageWidth();var n=o.node.attributes;return o.frame="none"!==n.get("frame"),o.fLine=o.frame&&n.get("frame")?.07:0,o.fSpace=o.frame?o.convertLengths(o.getAttributeArray("framespacing")):[0,0],o.cSpace=o.convertLengths(o.getColumnAttributes("columnspacing")),o.rSpace=o.convertLengths(o.getRowAttributes("rowspacing")),o.cLines=o.getColumnAttributes("columnlines").map((function(t){return"none"===t?0:.07})),o.rLines=o.getRowAttributes("rowlines").map((function(t){return"none"===t?0:.07})),o.cWidths=o.getColumnWidths(),o.stretchRows(),o.stretchColumns(),o}return n(e,t),Object.defineProperty(e.prototype,"tableRows",{get:function(){return this.childNodes},enumerable:!1,configurable:!0}),e.prototype.findContainer=function(){for(var t=this,e=t.parent;e&&(e.node.notParent||e.node.isKind("mrow"));)t=e,e=e.parent;this.container=e,this.containerI=t.node.childPosition()},e.prototype.getPercentageWidth=function(){if(this.hasLabels)this.bbox.pwidth=l.BBox.fullWidth;else{var t=this.node.attributes.get("width");(0,c.isPercent)(t)&&(this.bbox.pwidth=t)}},e.prototype.stretchRows=function(){for(var t=this.node.attributes.get("equalrows"),e=t?this.getEqualRowHeight():0,r=t?this.getTableData():{H:[0],D:[0]},o=r.H,n=r.D,i=this.tableRows,a=0;a<this.numRows;a++){var s=t?[(e+o[a]-n[a])/2,(e-o[a]+n[a])/2]:null;i[a].stretchChildren(s)}},e.prototype.stretchColumns=function(){for(var t=0;t<this.numCols;t++){var e="number"==typeof this.cWidths[t]?this.cWidths[t]:null;this.stretchColumn(t,e)}},e.prototype.stretchColumn=function(t,e){var r,o,n,i,a,l,c=[];try{for(var h=s(this.tableRows),u=h.next();!u.done;u=h.next()){if(v=u.value.getChild(t))0===(M=v.childNodes[0]).stretch.dir&&M.canStretch(2)&&c.push(M)}}catch(t){r={error:t}}finally{try{u&&!u.done&&(o=h.return)&&o.call(h)}finally{if(r)throw r.error}}var p=c.length,d=this.childNodes.length;if(p&&d>1){if(null===e){e=0;var f=p>1&&p===d;try{for(var y=s(this.tableRows),m=y.next();!m.done;m=y.next()){var v;if(v=m.value.getChild(t)){var g=0===(M=v.childNodes[0]).stretch.dir;if(f||g){var b=M.getBBox(g).w;b>e&&(e=b)}}}}catch(t){n={error:t}}finally{try{m&&!m.done&&(i=y.return)&&i.call(y)}finally{if(n)throw n.error}}}try{for(var x=s(c),_=x.next();!_.done;_=x.next()){var M;(M=_.value).coreMO().getStretchedVariant([e])}}catch(t){a={error:t}}finally{try{_&&!_.done&&(l=x.return)&&l.call(x)}finally{if(a)throw a.error}}}},e.prototype.getTableData=function(){if(this.data)return this.data;for(var t=new Array(this.numRows).fill(0),e=new Array(this.numRows).fill(0),r=new Array(this.numCols).fill(0),o=new Array(this.numRows),n=new Array(this.numRows),i=[0],a=this.tableRows,s=0;s<a.length;s++){for(var l=0,c=a[s],h=c.node.attributes.get("rowalign"),u=0;u<c.numCells;u++){var p=c.getChild(u);l=this.updateHDW(p,u,s,h,t,e,r,l),this.recordPWidthCell(p,u)}o[s]=t[s],n[s]=e[s],c.labeled&&(l=this.updateHDW(c.childNodes[0],0,s,h,t,e,i,l)),this.extendHD(s,t,e,l),this.extendHD(s,o,n,l)}var d=i[0];return this.data={H:t,D:e,W:r,NH:o,ND:n,L:d},this.data},e.prototype.updateHDW=function(t,e,r,o,n,i,a,s){var l=t.getBBox(),c=l.h,h=l.d,u=l.w,p=t.parent.bbox.rscale;1!==t.parent.bbox.rscale&&(c*=p,h*=p,u*=p),this.node.getProperty("useHeight")&&(c<.75&&(c=.75),h<.25&&(h=.25));var d=0;return"baseline"!==(o=t.node.attributes.get("rowalign")||o)&&"axis"!==o&&(d=c+h,c=h=0),c>n[r]&&(n[r]=c),h>i[r]&&(i[r]=h),d>s&&(s=d),a&&u>a[e]&&(a[e]=u),s},e.prototype.extendHD=function(t,e,r,o){var n=(o-(e[t]+r[t]))/2;n<1e-5||(e[t]+=n,r[t]+=n)},e.prototype.recordPWidthCell=function(t,e){t.childNodes[0]&&t.childNodes[0].getBBox().pwidth&&this.pwidthCells.push([t,e])},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r,o,n=this.getTableData(),a=n.H,s=n.D;if(this.node.attributes.get("equalrows")){var l=this.getEqualRowHeight();r=(0,h.sum)([].concat(this.rLines,this.rSpace))+l*this.numRows}else r=(0,h.sum)(a.concat(s,this.rLines,this.rSpace));r+=2*(this.fLine+this.fSpace[1]);var u=this.getComputedWidths();o=(0,h.sum)(u.concat(this.cLines,this.cSpace))+2*(this.fLine+this.fSpace[0]);var p=this.node.attributes.get("width");"auto"!==p&&(o=Math.max(this.length2em(p,0)+2*this.fLine,o));var d=i(this.getBBoxHD(r),2),f=d[0],y=d[1];t.h=f,t.d=y,t.w=o;var m=i(this.getBBoxLR(),2),v=m[0],g=m[1];t.L=v,t.R=g,(0,c.isPercent)(p)||this.setColumnPWidths()},e.prototype.setChildPWidths=function(t,e,r){var o=this.node.attributes.get("width");if(!(0,c.isPercent)(o))return!1;this.hasLabels||(this.bbox.pwidth="",this.container.bbox.pwidth="");var n=this.bbox,i=n.w,a=n.L,s=n.R,l=this.node.attributes.get("data-width-includes-label"),u=Math.max(i,this.length2em(o,Math.max(e,a+i+s)))-(l?a+s:0),p=this.node.attributes.get("equalcolumns")?Array(this.numCols).fill(this.percent(1/Math.max(1,this.numCols))):this.getColumnAttributes("columnwidth",0);this.cWidths=this.getColumnWidthsFixed(p,u);var d=this.getComputedWidths();return this.pWidth=(0,h.sum)(d.concat(this.cLines,this.cSpace))+2*(this.fLine+this.fSpace[0]),this.isTop&&(this.bbox.w=this.pWidth),this.setColumnPWidths(),this.pWidth!==i&&this.parent.invalidateBBox(),this.pWidth!==i},e.prototype.setColumnPWidths=function(){var t,e,r=this.cWidths;try{for(var o=s(this.pwidthCells),n=o.next();!n.done;n=o.next()){var a=i(n.value,2),l=a[0],c=a[1];l.setChildPWidths(!1,r[c])&&(l.invalidateBBox(),l.getBBox())}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}},e.prototype.getBBoxHD=function(t){var e=i(this.getAlignmentRow(),2),r=e[0],o=e[1];if(null===o){var n=this.font.params.axis_height,a=t/2;return{top:[0,t],center:[a,a],bottom:[t,0],baseline:[a,a],axis:[a+n,a-n]}[r]||[a,a]}var s=this.getVerticalPosition(o,r);return[s,t-s]},e.prototype.getBBoxLR=function(){if(this.hasLabels){var t=this.node.attributes,e=t.get("side"),r=i(this.getPadAlignShift(e),2),o=r[0],n=r[1],a=this.hasLabels&&!!t.get("data-width-includes-label");return a&&this.frame&&this.fSpace[0]&&(o-=this.fSpace[0]),"center"!==n||a?"left"===e?[o,0]:[0,o]:[o,o]}return[0,0]},e.prototype.getPadAlignShift=function(t){var e=this.getTableData().L+this.length2em(this.node.attributes.get("minlabelspacing")),r=i(null==this.styles?["",""]:[this.styles.get("padding-left"),this.styles.get("padding-right")],2),o=r[0],n=r[1];(o||n)&&(e=Math.max(e,this.length2em(o||"0"),this.length2em(n||"0")));var a=i(this.getAlignShift(),2),s=a[0],l=a[1];return s===t&&(l="left"===t?Math.max(e,l)-e:Math.min(-e,l)+e),[e,s,l]},e.prototype.getAlignShift=function(){return this.isTop?t.prototype.getAlignShift.call(this):[this.container.getChildAlign(this.containerI),0]},e.prototype.getWidth=function(){return this.pWidth||this.getBBox().w},e.prototype.getEqualRowHeight=function(){var t=this.getTableData(),e=t.H,r=t.D,o=Array.from(e.keys()).map((function(t){return e[t]+r[t]}));return Math.max.apply(Math,o)},e.prototype.getComputedWidths=function(){var t=this,e=this.getTableData().W,r=Array.from(e.keys()).map((function(r){return"number"==typeof t.cWidths[r]?t.cWidths[r]:e[r]}));return this.node.attributes.get("equalcolumns")&&(r=Array(r.length).fill((0,h.max)(r))),r},e.prototype.getColumnWidths=function(){var t=this.node.attributes.get("width");if(this.node.attributes.get("equalcolumns"))return this.getEqualColumns(t);var e=this.getColumnAttributes("columnwidth",0);return"auto"===t?this.getColumnWidthsAuto(e):(0,c.isPercent)(t)?this.getColumnWidthsPercent(e):this.getColumnWidthsFixed(e,this.length2em(t))},e.prototype.getEqualColumns=function(t){var e,r=Math.max(1,this.numCols);if("auto"===t){var o=this.getTableData().W;e=(0,h.max)(o)}else if((0,c.isPercent)(t))e=this.percent(1/r);else{var n=(0,h.sum)([].concat(this.cLines,this.cSpace))+2*this.fSpace[0];e=Math.max(0,this.length2em(t)-n)/r}return Array(this.numCols).fill(e)},e.prototype.getColumnWidthsAuto=function(t){var e=this;return t.map((function(t){return"auto"===t||"fit"===t?null:(0,c.isPercent)(t)?t:e.length2em(t)}))},e.prototype.getColumnWidthsPercent=function(t){var e=this,r=t.indexOf("fit")>=0,o=(r?this.getTableData():{W:null}).W;return Array.from(t.keys()).map((function(n){var i=t[n];return"fit"===i?null:"auto"===i?r?o[n]:null:(0,c.isPercent)(i)?i:e.length2em(i)}))},e.prototype.getColumnWidthsFixed=function(t,e){var r=this,o=Array.from(t.keys()),n=o.filter((function(e){return"fit"===t[e]})),i=o.filter((function(e){return"auto"===t[e]})),a=n.length||i.length,s=(a?this.getTableData():{W:null}).W,l=e-(0,h.sum)([].concat(this.cLines,this.cSpace))-2*this.fSpace[0],c=l;o.forEach((function(e){var o=t[e];c-="fit"===o||"auto"===o?s[e]:r.length2em(o,l)}));var u=a&&c>0?c/a:0;return o.map((function(e){var o=t[e];return"fit"===o?s[e]+u:"auto"===o?s[e]+(0===n.length?u:0):r.length2em(o,l)}))},e.prototype.getVerticalPosition=function(t,e){for(var r=this.node.attributes.get("equalrows"),o=this.getTableData(),n=o.H,a=o.D,s=r?this.getEqualRowHeight():0,l=this.getRowHalfSpacing(),c=this.fLine,h=0;h<t;h++)c+=l[h]+(r?s:n[h]+a[h])+l[h+1]+this.rLines[h];var u=i(r?[(s+n[t]-a[t])/2,(s-n[t]+a[t])/2]:[n[t],a[t]],2),p=u[0],d=u[1];return c+={top:0,center:l[t]+(p+d)/2,bottom:l[t]+p+d+l[t+1],baseline:l[t]+p,axis:l[t]+p-.25}[e]||0},e.prototype.getEmHalfSpacing=function(t,e,r){void 0===r&&(r=1);var o=this.em(t*r),n=this.addEm(e,2/r);return n.unshift(o),n.push(o),n},e.prototype.getRowHalfSpacing=function(){var t=this.rSpace.map((function(t){return t/2}));return t.unshift(this.fSpace[1]),t.push(this.fSpace[1]),t},e.prototype.getColumnHalfSpacing=function(){var t=this.cSpace.map((function(t){return t/2}));return t.unshift(this.fSpace[0]),t.push(this.fSpace[0]),t},e.prototype.getAlignmentRow=function(){var t=i((0,c.split)(this.node.attributes.get("align")),2),e=t[0],r=t[1];if(null==r)return[e,null];var o=parseInt(r);return o<0&&(o+=this.numRows+1),[e,o<1||o>this.numRows?null:o-1]},e.prototype.getColumnAttributes=function(t,e){void 0===e&&(e=1);var r=this.numCols-e,o=this.getAttributeArray(t);if(0===o.length)return null;for(;o.length<r;)o.push(o[o.length-1]);return o.length>r&&o.splice(r),o},e.prototype.getRowAttributes=function(t,e){void 0===e&&(e=1);var r=this.numRows-e,o=this.getAttributeArray(t);if(0===o.length)return null;for(;o.length<r;)o.push(o[o.length-1]);return o.length>r&&o.splice(r),o},e.prototype.getAttributeArray=function(t){var e=this.node.attributes.get(t);return e?(0,c.split)(e):[this.node.attributes.getDefault(t)]},e.prototype.addEm=function(t,e){var r=this;return void 0===e&&(e=1),t?t.map((function(t){return r.em(t/e)})):null},e.prototype.convertLengths=function(t){var e=this;return t?t.map((function(t){return e.length2em(t)})):null},e}(t)}},7805:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtdMixin=void 0,e.CommonMtdMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.invalidateBBox=function(){this.bboxComputed=!1},e.prototype.getWrapWidth=function(t){var e=this.parent.parent,r=this.parent,o=this.node.childPosition()-(r.labeled?1:0);return"number"==typeof e.cWidths[o]?e.cWidths[o]:e.getTableData().W[o]},e.prototype.getChildAlign=function(t){return this.node.attributes.get("columnalign")},e}(t)}},8325:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtextMixin=void 0,e.CommonMtextMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getVariant=function(){var e=this.jax.options,r=this.jax.math.outputData,o=(!!r.merrorFamily||!!e.merrorFont)&&this.node.Parent.isKind("merror");if(r.mtextFamily||e.mtextFont||o){var n=this.node.attributes.get("mathvariant"),i=this.constructor.INHERITFONTS[n]||this.jax.font.getCssFont(n),a=i[0]||(o?r.merrorFamily||e.merrorFont:r.mtextFamily||e.mtextFont);this.variant=this.explicitVariant(a,i[2]?"bold":"",i[1]?"italic":"")}else t.prototype.getVariant.call(this)},e}(t),e.INHERITFONTS={normal:["",!1,!1],bold:["",!1,!0],italic:["",!0,!1],"bold-italic":["",!0,!0]},e}},4818:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMlabeledtrMixin=e.CommonMtrMixin=void 0,e.CommonMtrMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"numCells",{get:function(){return this.childNodes.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"labeled",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tableCells",{get:function(){return this.childNodes},enumerable:!1,configurable:!0}),e.prototype.getChild=function(t){return this.childNodes[t]},e.prototype.getChildBBoxes=function(){return this.childNodes.map((function(t){return t.getBBox()}))},e.prototype.stretchChildren=function(t){var e,r,o,i,a,s;void 0===t&&(t=null);var l=[],c=this.labeled?this.childNodes.slice(1):this.childNodes;try{for(var h=n(c),u=h.next();!u.done;u=h.next()){(O=u.value.childNodes[0]).canStretch(1)&&l.push(O)}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=h.return)&&r.call(h)}finally{if(e)throw e.error}}var p=l.length,d=this.childNodes.length;if(p&&d>1){if(null===t){var f=0,y=0,m=p>1&&p===d;try{for(var v=n(c),g=v.next();!g.done;g=v.next()){var b=0===(O=g.value.childNodes[0]).stretch.dir;if(m||b){var x=O.getBBox(b),_=x.h,M=x.d;_>f&&(f=_),M>y&&(y=M)}}}catch(t){o={error:t}}finally{try{g&&!g.done&&(i=v.return)&&i.call(v)}finally{if(o)throw o.error}}t=[f,y]}try{for(var w=n(l),S=w.next();!S.done;S=w.next()){var O;(O=S.value).coreMO().getStretchedVariant(t)}}catch(t){a={error:t}}finally{try{S&&!S.done&&(s=w.return)&&s.call(w)}finally{if(a)throw a.error}}}},e}(t)},e.CommonMlabeledtrMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"numCells",{get:function(){return Math.max(0,this.childNodes.length-1)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"labeled",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tableCells",{get:function(){return this.childNodes.slice(1)},enumerable:!1,configurable:!0}),e.prototype.getChild=function(t){return this.childNodes[t+1]},e.prototype.getChildBBoxes=function(){return this.childNodes.slice(1).map((function(t){return t.getBBox()}))},e}(t)}},9690:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)}),n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMunderoverMixin=e.CommonMoverMixin=e.CommonMunderMixin=void 0,e.CommonMunderMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;return o.stretchChildren(),o}return o(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.under]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(e,r){if(void 0===r&&(r=!1),this.hasMovableLimits())t.prototype.computeBBox.call(this,e,r);else{e.empty();var o=this.baseChild.getOuterBBox(),i=this.scriptChild.getOuterBBox(),a=this.getUnderKV(o,i)[1],s=this.isLineBelow?0:this.getDelta(!0),l=n(this.getDeltaW([o,i],[0,-s]),2),c=l[0],h=l[1];e.combine(o,c,0),e.combine(i,h,a),e.d+=this.font.params.big_op_spacing5,e.clean(),this.setChildPWidths(r)}},e}(t)},e.CommonMoverMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;return o.stretchChildren(),o}return o(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.over]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(e){if(this.hasMovableLimits())t.prototype.computeBBox.call(this,e);else{e.empty();var r=this.baseChild.getOuterBBox(),o=this.scriptChild.getOuterBBox();this.node.attributes.get("accent")&&(r.h=Math.max(r.h,this.font.params.x_height*r.scale));var i=this.getOverKU(r,o)[1],a=this.isLineAbove?0:this.getDelta(),s=n(this.getDeltaW([r,o],[0,a]),2),l=s[0],c=s[1];e.combine(r,l,0),e.combine(o,c,i),e.h+=this.font.params.big_op_spacing5,e.clean()}},e}(t)},e.CommonMunderoverMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,i([],n(e),!1))||this;return o.stretchChildren(),o}return o(e,t),Object.defineProperty(e.prototype,"underChild",{get:function(){return this.childNodes[this.node.under]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overChild",{get:function(){return this.childNodes[this.node.over]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"subChild",{get:function(){return this.underChild},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"supChild",{get:function(){return this.overChild},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(e){if(this.hasMovableLimits())t.prototype.computeBBox.call(this,e);else{e.empty();var r=this.overChild.getOuterBBox(),o=this.baseChild.getOuterBBox(),i=this.underChild.getOuterBBox();this.node.attributes.get("accent")&&(o.h=Math.max(o.h,this.font.params.x_height*o.scale));var a=this.getOverKU(o,r)[1],s=this.getUnderKV(o,i)[1],l=this.getDelta(),c=n(this.getDeltaW([o,i,r],[0,this.isLineBelow?0:-l,this.isLineAbove?0:l]),3),h=c[0],u=c[1],p=c[2];e.combine(o,h,0),e.combine(r,p,a),e.combine(i,u,s);var d=this.font.params.big_op_spacing5;e.h+=d,e.d+=d,e.clean()}},e}(t)}},7091:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonScriptbaseMixin=void 0;var l=r(8921);e.CommonScriptbaseMixin=function(t){var e;return e=function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var o=t.apply(this,a([],i(e),!1))||this;o.baseScale=1,o.baseIc=0,o.baseRemoveIc=!1,o.baseIsChar=!1,o.baseHasAccentOver=null,o.baseHasAccentUnder=null,o.isLineAbove=!1,o.isLineBelow=!1,o.isMathAccent=!1;var n=o.baseCore=o.getBaseCore();return n?(o.setBaseAccentsFor(n),o.baseScale=o.getBaseScale(),o.baseIc=o.getBaseIc(),o.baseIsChar=o.isCharBase(),o.isMathAccent=o.baseIsChar&&o.scriptChild&&!!o.scriptChild.coreMO().node.getProperty("mathaccent"),o.checkLineAccents(),o.baseRemoveIc=!o.isLineAbove&&!o.isLineBelow&&(!o.constructor.useIC||o.isMathAccent),o):o}return n(e,t),Object.defineProperty(e.prototype,"baseChild",{get:function(){return this.childNodes[this.node.base]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[1]},enumerable:!1,configurable:!0}),e.prototype.getBaseCore=function(){for(var t=this.getSemanticBase()||this.childNodes[0];t&&(1===t.childNodes.length&&(t.node.isKind("mrow")||t.node.isKind("TeXAtom")&&t.node.texClass!==l.TEXCLASS.VCENTER||t.node.isKind("mstyle")||t.node.isKind("mpadded")||t.node.isKind("mphantom")||t.node.isKind("semantics"))||t.node.isKind("munderover")&&t.isMathAccent);)this.setBaseAccentsFor(t),t=t.childNodes[0];return t||(this.baseHasAccentOver=this.baseHasAccentUnder=!1),t||this.childNodes[0]},e.prototype.setBaseAccentsFor=function(t){t.node.isKind("munderover")&&(null===this.baseHasAccentOver&&(this.baseHasAccentOver=!!t.node.attributes.get("accent")),null===this.baseHasAccentUnder&&(this.baseHasAccentUnder=!!t.node.attributes.get("accentunder")))},e.prototype.getSemanticBase=function(){var t=this.node.attributes.getExplicit("data-semantic-fencepointer");return this.getBaseFence(this.baseChild,t)},e.prototype.getBaseFence=function(t,e){var r,o;if(!t||!t.node.attributes||!e)return null;if(t.node.attributes.getExplicit("data-semantic-id")===e)return t;try{for(var n=s(t.childNodes),i=n.next();!i.done;i=n.next()){var a=i.value,l=this.getBaseFence(a,e);if(l)return l}}catch(t){r={error:t}}finally{try{i&&!i.done&&(o=n.return)&&o.call(n)}finally{if(r)throw r.error}}return null},e.prototype.getBaseScale=function(){for(var t=this.baseCore,e=1;t&&t!==this;){e*=t.getOuterBBox().rscale,t=t.parent}return e},e.prototype.getBaseIc=function(){return this.baseCore.getOuterBBox().ic*this.baseScale},e.prototype.getAdjustedIc=function(){var t=this.baseCore.getOuterBBox();return(t.ic?1.05*t.ic+.05:0)*this.baseScale},e.prototype.isCharBase=function(){var t=this.baseCore;return(t.node.isKind("mo")&&null===t.size||t.node.isKind("mi")||t.node.isKind("mn"))&&1===t.bbox.rscale&&1===Array.from(t.getText()).length},e.prototype.checkLineAccents=function(){if(this.node.isKind("munderover"))if(this.node.isKind("mover"))this.isLineAbove=this.isLineAccent(this.scriptChild);else if(this.node.isKind("munder"))this.isLineBelow=this.isLineAccent(this.scriptChild);else{this.isLineAbove=this.isLineAccent(this.overChild),this.isLineBelow=this.isLineAccent(this.underChild)}},e.prototype.isLineAccent=function(t){var e=t.coreMO().node;return e.isToken&&"\u2015"===e.getText()},e.prototype.getBaseWidth=function(){var t=this.baseChild.getOuterBBox();return t.w*t.rscale-(this.baseRemoveIc?this.baseIc:0)+this.font.params.extra_ic},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.getBaseWidth(),o=i(this.getOffset(),2),n=o[0],a=o[1];t.append(this.baseChild.getOuterBBox()),t.combine(this.scriptChild.getOuterBBox(),r+n,a),t.w+=this.font.params.scriptspace,t.clean(),this.setChildPWidths(e)},e.prototype.getOffset=function(){return[0,0]},e.prototype.baseCharZero=function(t){var e=!!this.baseCore.node.attributes.get("largeop"),r=this.baseScale;return this.baseIsChar&&!e&&1===r?0:t},e.prototype.getV=function(){var t=this.baseCore.getOuterBBox(),e=this.scriptChild.getOuterBBox(),r=this.font.params,o=this.length2em(this.node.attributes.get("subscriptshift"),r.sub1);return Math.max(this.baseCharZero(t.d*this.baseScale+r.sub_drop*e.rscale),o,e.h*e.rscale-.8*r.x_height)},e.prototype.getU=function(){var t=this.baseCore.getOuterBBox(),e=this.scriptChild.getOuterBBox(),r=this.font.params,o=this.node.attributes.getList("displaystyle","superscriptshift"),n=this.node.getProperty("texprimestyle")?r.sup3:o.displaystyle?r.sup1:r.sup2,i=this.length2em(o.superscriptshift,n);return Math.max(this.baseCharZero(t.h*this.baseScale-r.sup_drop*e.rscale),i,e.d*e.rscale+1/4*r.x_height)},e.prototype.hasMovableLimits=function(){var t=this.node.attributes.get("displaystyle"),e=this.baseChild.coreMO().node;return!t&&!!e.attributes.get("movablelimits")},e.prototype.getOverKU=function(t,e){var r=this.node.attributes.get("accent"),o=this.font.params,n=e.d*e.rscale,i=o.rule_thickness*o.separation_factor,a=this.baseHasAccentOver?i:0,s=this.isLineAbove?3*o.rule_thickness:i,l=(r?s:Math.max(o.big_op_spacing1,o.big_op_spacing3-Math.max(0,n)))-a;return[l,t.h*t.rscale+l+n]},e.prototype.getUnderKV=function(t,e){var r=this.node.attributes.get("accentunder"),o=this.font.params,n=e.h*e.rscale,i=o.rule_thickness*o.separation_factor,a=this.baseHasAccentUnder?i:0,s=this.isLineBelow?3*o.rule_thickness:i,l=(r?s:Math.max(o.big_op_spacing2,o.big_op_spacing4-n))-a;return[l,-(t.d*t.rscale+l+n)]},e.prototype.getDeltaW=function(t,e){var r,o,n,l;void 0===e&&(e=[0,0,0]);var c=this.node.attributes.get("align"),h=t.map((function(t){return t.w*t.rscale}));h[0]-=this.baseRemoveIc&&!this.baseCore.node.attributes.get("largeop")?this.baseIc:0;var u=Math.max.apply(Math,a([],i(h),!1)),p=[],d=0;try{for(var f=s(h.keys()),y=f.next();!y.done;y=f.next()){var m=y.value;p[m]=("center"===c?(u-h[m])/2:"right"===c?u-h[m]:0)+e[m],p[m]<d&&(d=-p[m])}}catch(t){r={error:t}}finally{try{y&&!y.done&&(o=f.return)&&o.call(f)}finally{if(r)throw r.error}}if(d)try{for(var v=s(p.keys()),g=v.next();!g.done;g=v.next()){m=g.value;p[m]+=d}}catch(t){n={error:t}}finally{try{g&&!g.done&&(l=v.return)&&l.call(v)}finally{if(n)throw n.error}}return[1,2].map((function(e){return p[e]+=t[e]?t[e].dx*t[0].scale:0})),p},e.prototype.getDelta=function(t){void 0===t&&(t=!1);var e=this.node.attributes.get("accent"),r=this.baseCore.getOuterBBox(),o=r.sk,n=r.ic;return((e&&!t?o:0)+this.font.skewIcFactor*n)*this.baseScale},e.prototype.stretchChildren=function(){var t,e,r,o,n,i,a=[];try{for(var l=s(this.childNodes),c=l.next();!c.done;c=l.next()){(M=c.value).canStretch(2)&&a.push(M)}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}var h=a.length,u=this.childNodes.length;if(h&&u>1){var p=0,d=h>1&&h===u;try{for(var f=s(this.childNodes),y=f.next();!y.done;y=f.next()){var m=0===(M=y.value).stretch.dir;if(d||m){var v=M.getOuterBBox(m),g=v.w,b=v.rscale;g*b>p&&(p=g*b)}}}catch(t){r={error:t}}finally{try{y&&!y.done&&(o=f.return)&&o.call(f)}finally{if(r)throw r.error}}try{for(var x=s(a),_=x.next();!_.done;_=x.next()){var M;(M=_.value).coreMO().getStretchedVariant([p/M.bbox.rscale])}}catch(t){n={error:t}}finally{try{_&&!_.done&&(i=x.return)&&i.call(x)}finally{if(n)throw n.error}}}},e}(t),e.useIC=!0,e}},3191:function(t,e){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonSemanticsMixin=void 0,e.CommonSemanticsMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(t,e){if(void 0===e&&(e=!1),this.childNodes.length){var r=this.childNodes[0].getBBox(),o=r.w,n=r.h,i=r.d;t.w=o,t.h=n,t.d=i}},e}(t)}},6582:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},i.apply(this,arguments)},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVG=e.XLINKNS=e.SVGNS=void 0;var s=r(716),l=r(9416),c=r(4142),h=r(4129),u=r(6720),p=r(6914);e.SVGNS="http://www.w3.org/2000/svg",e.XLINKNS="http://www.w3.org/1999/xlink";var d=function(t){function r(e){void 0===e&&(e=null);var r=t.call(this,e,l.SVGWrapperFactory,c.TeXFont)||this;return r.minwidth=0,r.shift=0,r.container=null,r.svgStyles=null,r.fontCache=new h.FontCache(r),r}return n(r,t),r.prototype.initialize=function(){"global"===this.options.fontCache&&this.fontCache.clearCache()},r.prototype.clearFontCache=function(){this.fontCache.clearCache()},r.prototype.reset=function(){this.clearFontCache()},r.prototype.setScale=function(t){1!==this.options.scale&&this.adaptor.setStyle(t,"fontSize",(0,p.percent)(this.options.scale))},r.prototype.escaped=function(t,e){return this.setDocument(e),this.html("span",{},[this.text(t.math)])},r.prototype.styleSheet=function(e){if(this.svgStyles)return this.svgStyles;var o=this.svgStyles=t.prototype.styleSheet.call(this,e);return this.adaptor.setAttribute(o,"id",r.STYLESHEETID),o},r.prototype.pageElements=function(t){return"global"!==this.options.fontCache||this.findCache(t)?null:this.svg("svg",{id:r.FONTCACHEID,style:{display:"none"}},[this.fontCache.getCache()])},r.prototype.findCache=function(t){for(var e=this.adaptor,o=e.tags(e.body(t.document),"svg"),n=o.length-1;n>=0;n--)if(this.adaptor.getAttribute(o[n],"id")===r.FONTCACHEID)return!0;return!1},r.prototype.processMath=function(t,e){var r=this.container;this.container=e;var o=this.factory.wrap(t),n=a(this.createRoot(o),2),i=n[0],s=n[1];this.typesetSVG(o,i,s),this.container=r},r.prototype.createRoot=function(t){var r=t.getOuterBBox(),o=r.w,n=r.h,i=r.d,a=r.pwidth,s=t.metrics.em/1e3,l=Math.max(o,s),c=Math.max(n+i,s),h=this.svg("g",{stroke:"currentColor",fill:"currentColor","stroke-width":0,transform:"scale(1,-1)"}),u=this.adaptor,p=u.append(this.container,this.svg("svg",{xmlns:e.SVGNS,width:this.ex(l),height:this.ex(c),role:"img",focusable:!1,style:{"vertical-align":this.ex(-i)},viewBox:[0,this.fixed(1e3*-n,1),this.fixed(1e3*l,1),this.fixed(1e3*c,1)].join(" ")},[h]));if(.001===l&&(u.setAttribute(p,"preserveAspectRatio","xMidYMid slice"),o<0&&u.setStyle(this.container,"margin-right",this.ex(o))),a){u.setStyle(p,"min-width",this.ex(l)),u.setAttribute(p,"width",a),u.removeAttribute(p,"viewBox");var d=this.fixed(t.metrics.ex/(1e3*this.font.params.x_height),6);u.setAttribute(h,"transform","scale(".concat(d,",-").concat(d,") translate(0, ").concat(this.fixed(1e3*-n,1),")"))}return"none"!==this.options.fontCache&&u.setAttribute(p,"xmlns:xlink",e.XLINKNS),[p,h]},r.prototype.typesetSVG=function(t,e,r){var o=this.adaptor;if(this.minwidth=this.shift=0,"local"===this.options.fontCache&&(this.fontCache.clearCache(),this.fontCache.useLocalID(this.options.localID),o.insert(this.fontCache.getCache(),r)),t.toSVG(r),this.fontCache.clearLocalID(),this.minwidth)o.setStyle(e,"minWidth",this.ex(this.minwidth)),o.setStyle(this.container,"minWidth",this.ex(this.minwidth));else if(this.shift){var n=o.getAttribute(this.container,"justify")||"center";this.setIndent(e,n,this.shift)}},r.prototype.setIndent=function(t,e,r){"center"!==e&&"left"!==e||this.adaptor.setStyle(t,"margin-left",this.ex(r)),"center"!==e&&"right"!==e||this.adaptor.setStyle(t,"margin-right",this.ex(-r))},r.prototype.ex=function(t){return t/=this.font.params.x_height,Math.abs(t)<.001?"0":t.toFixed(3).replace(/\.?0+$/,"")+"ex"},r.prototype.svg=function(t,r,o){return void 0===r&&(r={}),void 0===o&&(o=[]),this.html(t,r,o,e.SVGNS)},r.prototype.unknownText=function(t,e){var r=this.math.metrics,o=this.font.params.x_height/r.ex*r.em*1e3,n=this.svg("text",{"data-variant":e,transform:"scale(1,-1)","font-size":this.fixed(o,1)+"px"},[this.text(t)]),i=this.adaptor;if("-explicitFont"!==e){var s=(0,u.unicodeChars)(t);if(1!==s.length||s[0]<119808||s[0]>120831){var l=a(this.font.getCssFont(e),3),c=l[0],h=l[1],p=l[2];i.setAttribute(n,"font-family",c),h&&i.setAttribute(n,"font-style","italic"),p&&i.setAttribute(n,"font-weight","bold")}}return n},r.prototype.measureTextNode=function(t){var e=this.adaptor;t=e.clone(t),e.removeAttribute(t,"transform");var r=this.fixed(1e3*this.font.params.x_height,1),o=this.svg("svg",{position:"absolute",visibility:"hidden",width:"1ex",height:"1ex",viewBox:[0,0,r,r].join(" ")},[t]);e.append(e.body(e.document),o);var n=e.nodeSize(t,1e3,!0)[0];return e.remove(o),{w:n,h:.75,d:.2}},r.NAME="SVG",r.OPTIONS=i(i({},s.CommonOutputJax.OPTIONS),{internalSpeechTitles:!0,titleID:0,fontCache:"local",localID:null}),r.commonStyles={'mjx-container[jax="SVG"]':{direction:"ltr"},'mjx-container[jax="SVG"] > svg':{overflow:"visible","min-height":"1px","min-width":"1px"},'mjx-container[jax="SVG"] > svg a':{fill:"blue",stroke:"blue"}},r.FONTCACHEID="MJX-SVG-global-cache",r.STYLESHEETID="MJX-SVG-styles",r}(s.CommonOutputJax);e.SVG=d},4129:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.FontCache=void 0;var r=function(){function t(t){this.cache=new Map,this.defs=null,this.localID="",this.nextID=0,this.jax=t}return t.prototype.cachePath=function(t,e,r){var o="MJX-"+this.localID+(this.jax.font.getVariant(t).cacheID||"")+"-"+e;return this.cache.has(o)||(this.cache.set(o,r),this.jax.adaptor.append(this.defs,this.jax.svg("path",{id:o,d:r}))),o},t.prototype.clearLocalID=function(){this.localID=""},t.prototype.useLocalID=function(t){void 0===t&&(t=null),this.localID=(null==t?++this.nextID:t)+(""===t?"":"-")},t.prototype.clearCache=function(){this.cache=new Map,this.defs=this.jax.svg("defs")},t.prototype.getCache=function(){return this.defs},t}();e.FontCache=r},9708:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var n in e=arguments[r])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},i.apply(this,arguments)},a=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),s=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||a(e,t,r)},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AddPaths=e.SVGFontData=void 0;var c=r(9250);s(r(9250),e);var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.charOptions=function(e,r){return t.charOptions.call(this,e,r)},e.OPTIONS=i(i({},c.FontData.OPTIONS),{dynamicPrefix:"./output/svg/fonts"}),e.JAX="SVG",e}(c.FontData);e.SVGFontData=h,e.AddPaths=function(t,e,r){var o,n,i,a;try{for(var s=l(Object.keys(e)),c=s.next();!c.done;c=s.next()){var u=c.value,p=parseInt(u);h.charOptions(t,p).p=e[p]}}catch(t){o={error:t}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(o)throw o.error}}try{for(var d=l(Object.keys(r)),f=d.next();!f.done;f=d.next()){u=f.value,p=parseInt(u);h.charOptions(t,p).c=r[p]}}catch(t){i={error:t}}finally{try{f&&!f.done&&(a=d.return)&&a.call(d)}finally{if(i)throw i.error}}return t}},9737:function(t,e,r){var o=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),n=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&o(e,t,r);return n(e,t),e},a=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||o(e,t,r)};Object.defineProperty(e,"__esModule",{value:!0}),e.Arrow=e.DiagonalArrow=e.DiagonalStrike=e.Border2=e.Border=e.RenderLine=e.lineOffset=e.lineData=e.computeLineData=void 0;var s=i(r(5373));a(r(5373),e),e.computeLineData={top:function(t,e,r,o){return[0,t-o,r,t-o]},right:function(t,e,r,o){return[r-o,-e,r-o,t]},bottom:function(t,e,r,o){return[0,o-e,r,o-e]},left:function(t,e,r,o){return[o,-e,o,t]},vertical:function(t,e,r,o){return[r/2,t,r/2,-e]},horizontal:function(t,e,r,o){return[0,(t-e)/2,r,(t-e)/2]},up:function(t,e,r,o){return[o,o-e,r-o,t-o]},down:function(t,e,r,o){return[o,t-o,r-o,o-e]}};e.lineData=function(t,r,o){void 0===o&&(o="");var n=t.getBBox(),i=n.h,a=n.d,s=n.w,l=t.thickness/2;return(0,e.lineOffset)(e.computeLineData[r](i,a,s,l),t,o)};e.lineOffset=function(t,e,r){if(r){var o=e.getOffset(r);o&&("X"===r?(t[0]-=o,t[2]-=o):(t[1]-=o,t[3]-=o))}return t};e.RenderLine=function(t,r){return void 0===r&&(r=""),function(o,n){var i=o.line((0,e.lineData)(o,t,r));o.adaptor.append(o.element,i)}};e.Border=function(t){return s.CommonBorder((function(r,o){r.adaptor.append(r.element,r.line((0,e.lineData)(r,t)))}))(t)};e.Border2=function(t,r,o){return s.CommonBorder2((function(t,n){t.adaptor.append(t.element,t.line((0,e.lineData)(t,r))),t.adaptor.append(t.element,t.line((0,e.lineData)(t,o)))}))(t,r,o)};e.DiagonalStrike=function(t){return s.CommonDiagonalStrike((function(r){return function(r,o){r.adaptor.append(r.element,r.line((0,e.lineData)(r,t)))}}))(t)};e.DiagonalArrow=function(t){return s.CommonDiagonalArrow((function(t,e){t.adaptor.append(t.element,e)}))(t)};e.Arrow=function(t){return s.CommonArrow((function(t,e){t.adaptor.append(t.element,e)}))(t)}},9321:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGWrapper=void 0;var s=r(3717),l=r(1541),c=r(6582),h=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.element=null,e.dx=0,e}return n(e,t),e.prototype.toSVG=function(t){this.addChildren(this.standardSVGnode(t))},e.prototype.addChildren=function(t){var e,r,o=0;try{for(var n=i(this.childNodes),a=n.next();!a.done;a=n.next()){var s=a.value;s.toSVG(t);var l=s.getOuterBBox();s.element&&s.place(o+l.L*l.rscale,0),o+=(l.L+l.w+l.R)*l.rscale}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},e.prototype.standardSVGnode=function(t){var e=this.createSVGnode(t);return this.handleStyles(),this.handleScale(),this.handleBorder(),this.handleColor(),this.handleAttributes(),e},e.prototype.createSVGnode=function(t){this.element=this.svg("g",{"data-mml-node":this.node.kind});var e=this.node.attributes.get("href");if(e){t=this.adaptor.append(t,this.svg("a",{href:e}));var r=this.getOuterBBox(),o=r.h,n=r.d,i=r.w;this.adaptor.append(this.element,this.svg("rect",{"data-hitbox":!0,fill:"none",stroke:"none","pointer-events":"all",width:this.fixed(i),height:this.fixed(o+n),y:this.fixed(-n)}))}return this.adaptor.append(t,this.element),this.element},e.prototype.handleStyles=function(){var t=this;if(this.styles){var e=this.styles.cssText;e&&this.adaptor.setAttribute(this.element,"style",e),s.BBox.StyleAdjust.forEach((function(e){var r=a(e,3),o=r[0];if(0===r[2]){var n=t.styles.get(o);n&&(t.dx+=t.length2em(n,1,t.bbox.rscale))}}))}},e.prototype.handleScale=function(){if(1!==this.bbox.rscale){var t="scale("+this.fixed(this.bbox.rscale/1e3,3)+")";this.adaptor.setAttribute(this.element,"transform",t)}},e.prototype.handleColor=function(){var t,e=this.adaptor,r=this.node.attributes,o=r.getExplicit("mathcolor"),n=r.getExplicit("color"),i=r.getExplicit("mathbackground"),a=r.getExplicit("background"),s=(null===(t=this.styles)||void 0===t?void 0:t.get("background-color"))||"";if((o||n)&&(e.setAttribute(this.element,"fill",o||n),e.setAttribute(this.element,"stroke",o||n)),i||a||s){var l=this.getOuterBBox(),c=l.h,h=l.d,u=l.w,p=this.svg("rect",{fill:i||a||s,x:this.fixed(-this.dx),y:this.fixed(-h),width:this.fixed(u),height:this.fixed(c+h),"data-bgcolor":!0}),d=e.firstChild(this.element);d?e.insert(p,d):e.append(this.element,p)}},e.prototype.handleBorder=function(){var t,r,o,n;if(this.styles){var s=Array(4).fill(0),l=Array(4),c=Array(4);try{for(var h=i([["Top",0],["Right",1],["Bottom",2],["Left",3]]),u=h.next();!u.done;u=h.next()){var p=a(u.value,2),d=p[0],f=p[1],y="border"+d,m=this.styles.get(y+"Width");m&&(s[f]=Math.max(0,this.length2em(m,1,this.bbox.rscale)),l[f]=this.styles.get(y+"Style")||"solid",c[f]=this.styles.get(y+"Color")||"currentColor")}}catch(e){t={error:e}}finally{try{u&&!u.done&&(r=h.return)&&r.call(h)}finally{if(t)throw t.error}}var v=e.borderFuzz,g=this.getOuterBBox(),b=a([g.h+v,g.d+v,g.w+v],3),x=b[0],_=b[1],M=b[2],w=[M,x],S=[-v,x],O=[M,-_],C=[-v,-_],B=[M-s[1],x-s[0]],j=[-v+s[3],x-s[0]],P=[M-s[1],-_+s[2]],A=[-v+s[3],-_+s[2]],V=[[S,w,B,j],[O,w,B,P],[C,O,P,A],[C,S,j,A]],T=this.adaptor.firstChild(this.element);try{for(var k=i([0,1,2,3]),G=k.next();!G.done;G=k.next()){if(s[f=G.value]){var N=V[f];"dashed"===l[f]||"dotted"===l[f]?this.addBorderBroken(N,c[f],l[f],s[f],f):this.addBorderSolid(N,c[f],T)}}}catch(t){o={error:t}}finally{try{G&&!G.done&&(n=k.return)&&n.call(k)}finally{if(o)throw o.error}}}},e.prototype.addBorderSolid=function(t,e,r){var o=this,n=this.svg("polygon",{points:t.map((function(t){var e=a(t,2),r=e[0],n=e[1];return"".concat(o.fixed(r-o.dx),",").concat(o.fixed(n))})).join(" "),stroke:"none",fill:e});r?this.adaptor.insert(n,r):this.adaptor.append(this.element,n)},e.prototype.addBorderBroken=function(t,e,r,o,n){var i="dotted"===r,s=o/2,l=a([[s,-s,-s,-s],[-s,s,-s,-s],[s,s,-s,s],[s,s,s,-s]][n],4),c=l[0],h=l[1],u=l[2],p=l[3],d=a(t,2),f=d[0],y=d[1],m=f[0]+c-this.dx,v=f[1]+h,g=y[0]+u-this.dx,b=y[1]+p,x=Math.abs(n%2?b-v:g-m),_=i?Math.ceil(x/(2*o)):Math.ceil((x-o)/(4*o)),M=x/(4*_+1),w=this.svg("line",{x1:this.fixed(m),y1:this.fixed(v),x2:this.fixed(g),y2:this.fixed(b),"stroke-width":this.fixed(o),stroke:e,"stroke-linecap":i?"round":"square","stroke-dasharray":i?[1,this.fixed(x/_-.002)].join(" "):[this.fixed(M),this.fixed(3*M)].join(" ")}),S=this.adaptor,O=S.firstChild(this.element);O?S.insert(w,O):S.append(this.element,w)},e.prototype.handleAttributes=function(){var t,r,o,n,a=this.node.attributes,s=a.getAllDefaults(),l=e.skipAttributes;try{for(var c=i(a.getExplicitNames()),h=c.next();!h.done;h=c.next()){var u=h.value;!1!==l[u]&&(u in s||l[u]||this.adaptor.hasAttribute(this.element,u))||this.adaptor.setAttribute(this.element,u,a.getExplicit(u))}}catch(e){t={error:e}}finally{try{h&&!h.done&&(r=c.return)&&r.call(c)}finally{if(t)throw t.error}}if(a.get("class")){var p=a.get("class").trim().split(/ +/);try{for(var d=i(p),f=d.next();!f.done;f=d.next()){var y=f.value;this.adaptor.addClass(this.element,y)}}catch(t){o={error:t}}finally{try{f&&!f.done&&(n=d.return)&&n.call(d)}finally{if(o)throw o.error}}}},e.prototype.place=function(t,e,r){if(void 0===r&&(r=null),(t+=this.dx)||e){r||(r=this.element,e=this.handleId(e));var o="translate(".concat(this.fixed(t),",").concat(this.fixed(e),")"),n=this.adaptor.getAttribute(r,"transform")||"";this.adaptor.setAttribute(r,"transform",o+(n?" "+n:""))}},e.prototype.handleId=function(t){if(!this.node.attributes||!this.node.attributes.get("id"))return t;var e=this.adaptor,r=this.getBBox().h,o=e.childNodes(this.element);o.forEach((function(t){return e.remove(t)}));var n=this.svg("g",{"data-idbox":!0,transform:"translate(0,".concat(this.fixed(-r),")")},o);return e.append(this.element,this.svg("text",{"data-id-align":!0},[this.text("")])),e.append(this.element,n),t+r},e.prototype.firstChild=function(){var t=this.adaptor,e=t.firstChild(this.element);return e&&"text"===t.kind(e)&&t.getAttribute(e,"data-id-align")&&(e=t.firstChild(t.next(e))),e&&"rect"===t.kind(e)&&t.getAttribute(e,"data-hitbox")&&(e=t.next(e)),e},e.prototype.placeChar=function(t,e,r,o,n){var s,l;void 0===n&&(n=null),null===n&&(n=this.variant);var c=t.toString(16).toUpperCase(),h=a(this.getVariantChar(n,t),4),u=h[2],p=h[3];if("p"in p){var d=p.p?"M"+p.p+"Z":"";this.place(e,r,this.adaptor.append(o,this.charNode(n,c,d)))}else if("c"in p){var f=this.adaptor.append(o,this.svg("g",{"data-c":c}));this.place(e,r,f),e=0;try{for(var y=i(this.unicodeChars(p.c,n)),m=y.next();!m.done;m=y.next()){var v=m.value;e+=this.placeChar(v,e,r,f,n)}}catch(t){s={error:t}}finally{try{m&&!m.done&&(l=y.return)&&l.call(y)}finally{if(s)throw s.error}}}else if(p.unknown){var g=String.fromCodePoint(t),b=this.adaptor.append(o,this.jax.unknownText(g,n));return this.place(e,r,b),this.jax.measureTextNodeWithCache(b,g,n).w}return u},e.prototype.charNode=function(t,e,r){return"none"!==this.jax.options.fontCache?this.useNode(t,e,r):this.pathNode(e,r)},e.prototype.pathNode=function(t,e){return this.svg("path",{"data-c":t,d:e})},e.prototype.useNode=function(t,e,r){var o=this.svg("use",{"data-c":e}),n="#"+this.jax.fontCache.cachePath(t,e,r);return this.adaptor.setAttribute(o,"href",n,c.XLINKNS),o},e.prototype.drawBBox=function(){var t=this.getBBox(),e=t.w,r=t.h,o=t.d,n=this.svg("g",{style:{opacity:.25}},[this.svg("rect",{fill:"red",height:this.fixed(r),width:this.fixed(e)}),this.svg("rect",{fill:"green",height:this.fixed(o),width:this.fixed(e),y:this.fixed(-o)})]),i=this.element||this.parent.element;this.adaptor.append(i,n)},e.prototype.html=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.jax.html(t,e,r)},e.prototype.svg=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.jax.svg(t,e,r)},e.prototype.text=function(t){return this.jax.text(t)},e.prototype.fixed=function(t,e){return void 0===e&&(e=1),this.jax.fixed(1e3*t,e)},e.kind="unknown",e.borderFuzz=.005,e}(l.CommonWrapper);e.SVGWrapper=h},9416:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGWrapperFactory=void 0;var i=r(1475),a=r(4687),s=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.jax=null,e}return n(e,t),e.defaultNodes=a.SVGWrappers,e}(i.CommonWrapperFactory);e.SVGWrapperFactory=s},4687:function(t,e,r){var o;Object.defineProperty(e,"__esModule",{value:!0}),e.SVGWrappers=void 0;var n=r(9321),i=r(1211),a=r(322),s=r(2983),l=r(6760),c=r(9810),h=r(3677),u=r(1941),p=r(3007),d=r(2458),f=r(4539),y=r(438),m=r(9295),v=r(9948),g=r(8798),b=r(5258),x=r(7522),_=r(4299),M=r(4750),w=r(451),S=r(4682),O=r(2673),C=r(4601),B=r(144),j=r(6965),P=r(4916),A=r(484),V=r(7455);e.SVGWrappers=((o={})[i.SVGmath.kind]=i.SVGmath,o[a.SVGmrow.kind]=a.SVGmrow,o[a.SVGinferredMrow.kind]=a.SVGinferredMrow,o[s.SVGmi.kind]=s.SVGmi,o[l.SVGmo.kind]=l.SVGmo,o[c.SVGmn.kind]=c.SVGmn,o[h.SVGms.kind]=h.SVGms,o[u.SVGmtext.kind]=u.SVGmtext,o[p.SVGmerror.kind]=p.SVGmerror,o[d.SVGmspace.kind]=d.SVGmspace,o[f.SVGmpadded.kind]=f.SVGmpadded,o[y.SVGmphantom.kind]=y.SVGmphantom,o[m.SVGmfrac.kind]=m.SVGmfrac,o[v.SVGmsqrt.kind]=v.SVGmsqrt,o[g.SVGmroot.kind]=g.SVGmroot,o[b.SVGmfenced.kind]=b.SVGmfenced,o[x.SVGmsub.kind]=x.SVGmsub,o[x.SVGmsup.kind]=x.SVGmsup,o[x.SVGmsubsup.kind]=x.SVGmsubsup,o[_.SVGmunder.kind]=_.SVGmunder,o[_.SVGmover.kind]=_.SVGmover,o[_.SVGmunderover.kind]=_.SVGmunderover,o[M.SVGmmultiscripts.kind]=M.SVGmmultiscripts,o[w.SVGmtable.kind]=w.SVGmtable,o[S.SVGmtr.kind]=S.SVGmtr,o[S.SVGmlabeledtr.kind]=S.SVGmlabeledtr,o[O.SVGmtd.kind]=O.SVGmtd,o[C.SVGmaction.kind]=C.SVGmaction,o[B.SVGmenclose.kind]=B.SVGmenclose,o[j.SVGsemantics.kind]=j.SVGsemantics,o[j.SVGannotation.kind]=j.SVGannotation,o[j.SVGannotationXML.kind]=j.SVGannotationXML,o[j.SVGxml.kind]=j.SVGxml,o[P.SVGmglyph.kind]=P.SVGmglyph,o[A.SVGTeXAtom.kind]=A.SVGTeXAtom,o[V.SVGTextNode.kind]=V.SVGTextNode,o[n.SVGWrapper.kind]=n.SVGWrapper,o)},484:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGTeXAtom=void 0;var i=r(9321),a=r(3438),s=r(4282),l=r(8921),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(e){if(t.prototype.toSVG.call(this,e),this.adaptor.setAttribute(this.element,"data-mjx-texclass",l.TEXCLASSNAMES[this.node.texClass]),this.node.texClass===l.TEXCLASS.VCENTER){var r=this.childNodes[0].getBBox(),o=r.h,n=(o+r.d)/2+this.font.params.axis_height-o,i="translate(0 "+this.fixed(n)+")";this.adaptor.setAttribute(this.element,"transform",i)}},e.kind=s.TeXAtom.prototype.kind,e}((0,a.CommonTeXAtomMixin)(i.SVGWrapper));e.SVGTeXAtom=c},7455:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGTextNode=void 0;var a=r(8921),s=r(9321),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e,r,o=this.node.getText(),n=this.parent.variant;if(0!==o.length)if("-explicitFont"===n)this.element=this.adaptor.append(t,this.jax.unknownText(o,n));else{var a=this.remappedText(o,n);this.parent.childNodes.length>1&&(t=this.element=this.adaptor.append(t,this.svg("g",{"data-mml-node":"text"})));var s=0;try{for(var l=i(a),c=l.next();!c.done;c=l.next()){var h=c.value;s+=this.placeChar(h,s,0,t,n)}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(e)throw e.error}}}},e.kind=a.TextNode.prototype.kind,e.styles={'mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c]':{"stroke-width":3}},e}((0,r(555).CommonTextNodeMixin)(s.SVGWrapper));e.SVGTextNode=l},4601:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmaction=void 0;var i=r(9321),a=r(3345),s=r(3345),l=r(3969),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=this.selected,o=r.getOuterBBox(),n=o.h,i=o.d,a=o.w;this.adaptor.append(this.element,this.svg("rect",{width:this.fixed(a),height:this.fixed(n+i),y:this.fixed(-i),fill:"none","pointer-events":"all"})),r.toSVG(e);var s=r.getOuterBBox();r.element&&r.place(s.L*s.rscale,0),this.action(this,this.data)},e.prototype.setEventHandler=function(t,e){this.element.addEventListener(t,e)},e.kind=l.MmlMaction.prototype.kind,e.styles={'[jax="SVG"] mjx-tool':{display:"inline-block",position:"relative",width:0,height:0},'[jax="SVG"] mjx-tool > mjx-tip':{position:"absolute",top:0,left:0},"mjx-tool > mjx-tip":{display:"inline-block",padding:".2em",border:"1px solid #888","font-size":"70%","background-color":"#F8F8F8",color:"black","box-shadow":"2px 2px 5px #AAAAAA"},'g[data-mml-node="maction"][data-toggle]':{cursor:"pointer"},"mjx-status":{display:"block",position:"fixed",left:"1em",bottom:"1em","min-width":"25%",padding:".2em .4em",border:"1px solid #888","font-size":"90%","background-color":"#F8F8F8",color:"black"}},e.actions=new Map([["toggle",[function(t,e){t.adaptor.setAttribute(t.element,"data-toggle",t.node.attributes.get("selection"));var r=t.factory.jax.math,o=t.factory.jax.document,n=t.node;t.setEventHandler("click",(function(t){r.end.node||(r.start.node=r.end.node=r.typesetRoot,r.start.n=r.end.n=0),n.nextToggleSelection(),r.rerender(o),t.stopPropagation()}))},{}]],["tooltip",[function(t,e){var r=t.childNodes[1];if(r){var o=t.firstChild();if(r.node.isKind("mtext")){var n=r.node.getText();t.adaptor.insert(t.svg("title",{},[t.text(n)]),o)}else{var i=t.adaptor,a=t.jax.container,s=t.node.factory.create("math",{},[t.childNodes[1].node]),l=t.html("mjx-tool",{},[t.html("mjx-tip")]),c=i.append(o,t.svg("foreignObject",{style:{display:"none"}},[l]));t.jax.processMath(s,i.firstChild(l)),t.childNodes[1].node.parent=t.node,t.setEventHandler("mouseover",(function(r){e.stopTimers(t,e),e.hoverTimer.set(t,setTimeout((function(){i.setStyle(l,"left","0"),i.setStyle(l,"top","0"),i.append(a,l);var e=i.nodeBBox(l),r=i.nodeBBox(t.element),o=(r.right-e.left)/t.metrics.em+t.dx,n=(r.bottom-e.bottom)/t.metrics.em+t.dy;i.setStyle(l,"left",t.px(o)),i.setStyle(l,"top",t.px(n))}),e.postDelay)),r.stopPropagation()})),t.setEventHandler("mouseout",(function(r){e.stopTimers(t,e);var o=setTimeout((function(){return i.append(c,l)}),e.clearDelay);e.clearTimer.set(t,o),r.stopPropagation()}))}}},s.TooltipData]],["statusline",[function(t,e){var r=t.childNodes[1];if(r&&r.node.isKind("mtext")){var o=t.adaptor,n=r.node.getText();o.setAttribute(t.element,"data-statusline",n),t.setEventHandler("mouseover",(function(r){if(null===e.status){var i=o.body(o.document);e.status=o.append(i,t.html("mjx-status",{},[t.text(n)]))}r.stopPropagation()})),t.setEventHandler("mouseout",(function(t){e.status&&(o.remove(e.status),e.status=null),t.stopPropagation()}))}},{status:null}]]]),e}((0,a.CommonMactionMixin)(i.SVGWrapper));e.SVGmaction=c},1211:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmath=void 0;var s=r(9321),l=r(2057),c=r(304),h=r(3717),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(e){t.prototype.toSVG.call(this,e);var r=this.adaptor;"block"===this.node.attributes.get("display")&&(r.setAttribute(this.jax.container,"display","true"),this.handleDisplay()),this.jax.document.options.internalSpeechTitles&&this.handleSpeech()},e.prototype.handleDisplay=function(){var t=i(this.getAlignShift(),2),e=t[0],r=t[1];if("center"!==e&&this.adaptor.setAttribute(this.jax.container,"justify",e),this.bbox.pwidth===h.BBox.fullWidth){if(this.adaptor.setAttribute(this.jax.container,"width","full"),this.jax.table){var o=this.jax.table.getOuterBBox(),n=o.L,a=o.w,s=o.R;"right"===e?s=Math.max(s||-r,-r):"left"===e?n=Math.max(n||r,r):"center"===e&&(a+=2*Math.abs(r)),this.jax.minwidth=Math.max(0,n+a+s)}}else this.jax.shift=r},e.prototype.handleSpeech=function(){var t,e,r=this.adaptor,o=this.node.attributes,n=o.get("aria-label")||o.get("data-semantic-speech");if(n){var i=this.getTitleID(),s=this.svg("title",{id:i},[this.text(n)]);r.insert(s,r.firstChild(this.element)),r.setAttribute(this.element,"aria-labeledby",i),r.removeAttribute(this.element,"aria-label");try{for(var l=a(this.childNodes[0].childNodes),c=l.next();!c.done;c=l.next()){var h=c.value;r.setAttribute(h.element,"aria-hidden","true")}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}}},e.prototype.getTitleID=function(){return"mjx-svg-title-"+String(this.jax.options.titleID++)},e.prototype.setChildPWidths=function(e,r,o){return void 0===r&&(r=null),void 0===o&&(o=!0),t.prototype.setChildPWidths.call(this,e,this.parent?r:this.metrics.containerWidth/this.jax.pxPerEm,!1)},e.kind=c.MmlMath.prototype.kind,e.styles={'mjx-container[jax="SVG"][display="true"]':{display:"block","text-align":"center",margin:"1em 0"},'mjx-container[jax="SVG"][display="true"][width="full"]':{display:"flex"},'mjx-container[jax="SVG"][justify="left"]':{"text-align":"left"},'mjx-container[jax="SVG"][justify="right"]':{"text-align":"right"}},e}((0,l.CommonMathMixin)(s.SVGWrapper));e.SVGmath=u},144:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return a(e,t),e},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmenclose=void 0;var h=r(9321),u=r(6200),p=s(r(9737)),d=r(4374),f=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e,r,o=this.standardSVGnode(t),n=this.getBBoxExtenders()[3],i={};n>0&&(i.transform="translate("+this.fixed(n)+", 0)");var a=this.adaptor.append(o,this.svg("g",i));this.renderChild?this.renderChild(this,a):this.childNodes[0].toSVG(a);try{for(var s=l(Object.keys(this.notations)),c=s.next();!c.done;c=s.next()){var h=c.value,u=this.notations[h];!u.renderChild&&u.renderer(this,o)}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}},e.prototype.arrow=function(t,e,r,o,n){void 0===o&&(o=""),void 0===n&&(n=0);var i=this.getBBox(),a=i.w,s=(t-a)/2,l=(i.h-i.d)/2,h=this.thickness,u=h/2,p=c([h*this.arrowhead.x,h*this.arrowhead.y,h*this.arrowhead.dx],3),d=p[0],f=p[1],y=p[2],m=r?this.fill("M",a+s,l,"l",-(d+y),f,"l",y,u-f,"L",d-s,l+u,"l",y,f-u,"l",-(d+y),-f,"l",d+y,-f,"l",-y,f-u,"L",a+s-d,l-u,"l",-y,u-f,"Z"):this.fill("M",a+s,l,"l",-(d+y),f,"l",y,u-f,"L",-s,l+u,"l",0,-h,"L",a+s-d,l-u,"l",-y,u-f,"Z"),v=[];if(n&&v.push("X"===o?"translate(".concat(this.fixed(-n)," 0)"):"translate(0 ".concat(this.fixed(n),")")),e){var g=this.jax.fixed(180*-e/Math.PI);v.push("rotate(".concat(g," ").concat(this.fixed(a/2)," ").concat(this.fixed(l),")"))}return v.length&&this.adaptor.setAttribute(m,"transform",v.join(" ")),m},e.prototype.line=function(t){var e=c(t,4),r=e[0],o=e[1],n=e[2],i=e[3];return this.svg("line",{x1:this.fixed(r),y1:this.fixed(o),x2:this.fixed(n),y2:this.fixed(i),"stroke-width":this.fixed(this.thickness)})},e.prototype.box=function(t,e,r,o){void 0===o&&(o=0);var n=this.thickness,i={x:this.fixed(n/2),y:this.fixed(n/2-r),width:this.fixed(t-n),height:this.fixed(e+r-n),fill:"none","stroke-width":this.fixed(n)};return o&&(i.rx=this.fixed(o)),this.svg("rect",i)},e.prototype.ellipse=function(t,e,r){var o=this.thickness;return this.svg("ellipse",{rx:this.fixed((t-o)/2),ry:this.fixed((e+r-o)/2),cx:this.fixed(t/2),cy:this.fixed((e-r)/2),fill:"none","stroke-width":this.fixed(o)})},e.prototype.path=function(t){for(var e=this,r=[],o=1;o<arguments.length;o++)r[o-1]=arguments[o];return this.svg("path",{d:r.map((function(t){return"string"==typeof t?t:e.fixed(t)})).join(" "),style:{"stroke-width":this.fixed(this.thickness)},"stroke-linecap":"round","stroke-linejoin":t,fill:"none"})},e.prototype.fill=function(){for(var t=this,e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return this.svg("path",{d:e.map((function(e){return"string"==typeof e?e:t.fixed(e)})).join(" ")})},e.kind=d.MmlMenclose.prototype.kind,e.notations=new Map([p.Border("top"),p.Border("right"),p.Border("bottom"),p.Border("left"),p.Border2("actuarial","top","right"),p.Border2("madruwb","bottom","right"),p.DiagonalStrike("up"),p.DiagonalStrike("down"),["horizontalstrike",{renderer:p.RenderLine("horizontal","Y"),bbox:function(t){return[0,t.padding,0,t.padding]}}],["verticalstrike",{renderer:p.RenderLine("vertical","X"),bbox:function(t){return[t.padding,0,t.padding,0]}}],["box",{renderer:function(t,e){var r=t.getBBox(),o=r.w,n=r.h,i=r.d;t.adaptor.append(t.element,t.box(o,n,i))},bbox:p.fullBBox,border:p.fullBorder,remove:"left right top bottom"}],["roundedbox",{renderer:function(t,e){var r=t.getBBox(),o=r.w,n=r.h,i=r.d,a=t.thickness+t.padding;t.adaptor.append(t.element,t.box(o,n,i,a))},bbox:p.fullBBox}],["circle",{renderer:function(t,e){var r=t.getBBox(),o=r.w,n=r.h,i=r.d;t.adaptor.append(t.element,t.ellipse(o,n,i))},bbox:p.fullBBox}],["phasorangle",{renderer:function(t,e){var r=t.getBBox(),o=r.w,n=r.h,i=r.d,a=t.getArgMod(1.75*t.padding,n+i)[0],s=t.thickness/2,l=n+i,c=Math.cos(a);t.adaptor.append(t.element,t.path("mitre","M",o,s-i,"L",s+c*s,s-i,"L",c*l+s,l-i-s))},bbox:function(t){var e=t.padding/2,r=t.thickness;return[2*e,e,e+r,3*e+r]},border:function(t){return[0,0,t.thickness,0]},remove:"bottom"}],p.Arrow("up"),p.Arrow("down"),p.Arrow("left"),p.Arrow("right"),p.Arrow("updown"),p.Arrow("leftright"),p.DiagonalArrow("updiagonal"),p.DiagonalArrow("northeast"),p.DiagonalArrow("southeast"),p.DiagonalArrow("northwest"),p.DiagonalArrow("southwest"),p.DiagonalArrow("northeastsouthwest"),p.DiagonalArrow("northwestsoutheast"),["longdiv",{renderer:function(t,e){var r=t.getBBox(),o=r.w,n=r.h,i=r.d,a=t.thickness/2,s=t.padding;t.adaptor.append(t.element,t.path("round","M",a,a-i,"a",s-a/2,(n+i)/2-4*a,0,"0,1",0,n+i-2*a,"L",o-a,n-a))},bbox:function(t){var e=t.padding,r=t.thickness;return[e+r,e,e,2*e+r/2]}}],["radical",{renderer:function(t,e){t.msqrt.toSVG(e);var r=t.sqrtTRBL()[3];t.place(-r,0,e)},init:function(t){t.msqrt=t.createMsqrt(t.childNodes[0])},bbox:function(t){return t.sqrtTRBL()},renderChild:!0}]]),e}((0,u.CommonMencloseMixin)(h.SVGWrapper));e.SVGmenclose=f},3007:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmerror=void 0;var i=r(9321),a=r(8078),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=this.getBBox(),o=r.h,n=r.d,i=r.w;this.adaptor.append(this.element,this.svg("rect",{"data-background":!0,width:this.fixed(i),height:this.fixed(o+n),y:this.fixed(-n)}));var a=this.node.attributes.get("title");a&&this.adaptor.append(this.element,this.svg("title",{},[this.adaptor.text(a)])),this.addChildren(e)},e.kind=a.MmlMerror.prototype.kind,e.styles={'g[data-mml-node="merror"] > g':{fill:"red",stroke:"red"},'g[data-mml-node="merror"] > rect[data-background]':{fill:"yellow",stroke:"none"}},e}(i.SVGWrapper);e.SVGmerror=s},5258:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmfenced=void 0;var a=r(9321),s=r(1346),l=r(7451),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t);this.setChildrenParent(this.mrow),this.mrow.toSVG(e),this.setChildrenParent(this)},e.prototype.setChildrenParent=function(t){var e,r;try{for(var o=i(this.childNodes),n=o.next();!n.done;n=o.next()){n.value.parent=t}}catch(t){e={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},e.kind=l.MmlMfenced.prototype.kind,e}((0,s.CommonMfencedMixin)(a.SVGWrapper));e.SVGmfenced=c},9295:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmfrac=void 0;var a=r(9321),s=r(5705),l=r(848),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){this.standardSVGnode(t);var e=this.node.attributes.getList("linethickness","bevelled"),r=e.linethickness,o=e.bevelled,n=this.isDisplay();if(o)this.makeBevelled(n);else{var i=this.length2em(String(r),.06);0===i?this.makeAtop(n):this.makeFraction(n,i)}},e.prototype.makeFraction=function(t,e){var r=this.element,o=this.node.attributes.getList("numalign","denomalign"),n=o.numalign,a=o.denomalign,s=i(this.childNodes,2),l=s[0],c=s[1],h=l.getOuterBBox(),u=c.getOuterBBox(),p=this.font.params,d=p.axis_height,f=this.node.getProperty("withDelims")?0:p.nulldelimiterspace,y=Math.max((h.L+h.w+h.R)*h.rscale,(u.L+u.w+u.R)*u.rscale),m=this.getAlignX(y,h,n)+.1+f,v=this.getAlignX(y,u,a)+.1+f,g=this.getTUV(t,e),b=g.T,x=g.u,_=g.v;l.toSVG(r),l.place(m,d+b+Math.max(h.d*h.rscale,x)),c.toSVG(r),c.place(v,d-b-Math.max(u.h*u.rscale,_)),this.adaptor.append(r,this.svg("rect",{width:this.fixed(y+.2),height:this.fixed(e),x:this.fixed(f),y:this.fixed(d-e/2)}))},e.prototype.makeAtop=function(t){var e=this.element,r=this.node.attributes.getList("numalign","denomalign"),o=r.numalign,n=r.denomalign,a=i(this.childNodes,2),s=a[0],l=a[1],c=s.getOuterBBox(),h=l.getOuterBBox(),u=this.font.params,p=this.node.getProperty("withDelims")?0:u.nulldelimiterspace,d=Math.max((c.L+c.w+c.R)*c.rscale,(h.L+h.w+h.R)*h.rscale),f=this.getAlignX(d,c,o)+p,y=this.getAlignX(d,h,n)+p,m=this.getUVQ(t),v=m.u,g=m.v;s.toSVG(e),s.place(f,v),l.toSVG(e),l.place(y,-g)},e.prototype.makeBevelled=function(t){var e=this.element,r=i(this.childNodes,2),o=r[0],n=r[1],a=this.getBevelData(t),s=a.u,l=a.v,c=a.delta,h=a.nbox,u=a.dbox,p=(h.L+h.w+h.R)*h.rscale;o.toSVG(e),this.bevel.toSVG(e),n.toSVG(e),o.place(h.L*h.rscale,s),this.bevel.place(p-c/2,0),n.place(p+this.bevel.getOuterBBox().w+u.L*u.rscale-c,l)},e.kind=l.MmlMfrac.prototype.kind,e}((0,s.CommonMfracMixin)(a.SVGWrapper));e.SVGmfrac=c},4916:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmglyph=void 0;var i=r(9321),a=r(7969),s=r(910),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t);if(this.charWrapper)this.charWrapper.toSVG(e);else{var r=this.node.attributes.getList("src","alt"),o=r.src,n=r.alt,i=this.fixed(this.height),a={width:this.fixed(this.width),height:i,transform:"translate(0 "+this.fixed(this.height+(this.valign||0))+") matrix(1 0 0 -1 0 0)",preserveAspectRatio:"none","aria-label":n,href:o},s=this.svg("image",a);this.adaptor.append(e,s)}},e.kind=s.MmlMglyph.prototype.kind,e}((0,a.CommonMglyphMixin)(i.SVGWrapper));e.SVGmglyph=l},2983:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmi=void 0;var i=r(9321),a=r(1419),s=r(7754),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlMi.prototype.kind,e}((0,a.CommonMiMixin)(i.SVGWrapper));e.SVGmi=l},4750:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmmultiscripts=e.AlignX=void 0;var a=r(7522),s=r(9906),l=r(7764),c=r(6720);function h(t){return{left:function(t,e){return 0},center:function(t,e){return(e-t)/2},right:function(t,e){return e-t}}[t]||function(t,e){return 0}}e.AlignX=h;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=this.scriptData,o=this.node.getProperty("scriptalign")||"right left",n=i((0,c.split)(o+" "+o),2),a=n[0],s=n[1],l=this.combinePrePost(r.sub,r.psub),h=this.combinePrePost(r.sup,r.psup),u=i(this.getUVQ(l,h),2),p=u[0],d=u[1],f=0;r.numPrescripts&&(f=this.addScripts(.05,p,d,this.firstPrescript,r.numPrescripts,a));var y=this.baseChild;y.toSVG(e),y.place(f,0),f+=y.getOuterBBox().w,r.numScripts&&this.addScripts(f,p,d,1,r.numScripts,s)},e.prototype.addScripts=function(t,e,r,o,n,a){var s=this.adaptor,l=h(a),c=s.append(this.element,this.svg("g")),u=s.append(this.element,this.svg("g"));this.place(t,e,c),this.place(t,r,u);for(var p=o+2*n,d=0;o<p;){var f=i([this.childNodes[o++],this.childNodes[o++]],2),y=f[0],m=f[1],v=i([y.getOuterBBox(),m.getOuterBBox()],2),g=v[0],b=v[1],x=i([g.rscale,b.rscale],2),_=x[0],M=x[1],w=Math.max(g.w*_,b.w*M);y.toSVG(u),m.toSVG(c),y.place(d+l(g.w*_,w),0),m.place(d+l(b.w*M,w),0),d+=w}return t+d},e.kind=l.MmlMmultiscripts.prototype.kind,e}((0,s.CommonMmultiscriptsMixin)(a.SVGmsubsup));e.SVGmmultiscripts=u},9810:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmn=void 0;var i=r(9321),a=r(2304),s=r(3235),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlMn.prototype.kind,e}((0,a.CommonMnMixin)(i.SVGWrapper));e.SVGmn=l},6760:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],o=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmo=void 0;var s=r(9321),l=r(437),c=r(9946),h=.1,u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.node.attributes,r=e.get("symmetric")&&2!==this.stretch.dir,o=0!==this.stretch.dir;o&&null===this.size&&this.getStretchedVariant([]);var n=this.standardSVGnode(t);if(o&&this.size<0)this.stretchSVG();else{var i=r||e.get("largeop")?this.fixed(this.getCenterOffset()):"0",a=this.node.getProperty("mathaccent")?this.fixed(this.getAccentOffset()):"0";"0"===i&&"0"===a||this.adaptor.setAttribute(n,"transform","translate(".concat(a," ").concat(i,")")),this.addChildren(n)}},e.prototype.stretchSVG=function(){var t=this.stretch.stretch,e=this.getStretchVariants(),r=this.getBBox();1===this.stretch.dir?this.stretchVertical(t,e,r):this.stretchHorizontal(t,e,r)},e.prototype.getStretchVariants=function(){var t,e,r=this.stretch.c||this.getText().codePointAt(0),o=[];try{for(var n=i(this.stretch.stretch.keys()),a=n.next();!a.done;a=n.next()){var s=a.value;o[s]=this.font.getStretchVariant(r,s)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return o},e.prototype.stretchVertical=function(t,e,r){var o=r.h,n=r.d,i=r.w,s=this.addTop(t[0],e[0],o,i),l=this.addBot(t[2],e[2],n,i);if(4===t.length){var c=a(this.addMidV(t[3],e[3],i),2),h=c[0],u=c[1];this.addExtV(t[1],e[1],o,0,s,h,i),this.addExtV(t[1],e[1],0,n,u,l,i)}else this.addExtV(t[1],e[1],o,n,s,l,i)},e.prototype.stretchHorizontal=function(t,e,r){var o=r.w,n=this.addLeft(t[0],e[0]),i=this.addRight(t[2],e[2],o);if(4===t.length){var s=a(this.addMidH(t[3],e[3],o),2),l=s[0],c=s[1],h=o/2;this.addExtH(t[1],e[1],h,n,h-l),this.addExtH(t[1],e[1],h,c-h,i,h)}else this.addExtH(t[1],e[1],o,n,i)},e.prototype.getChar=function(t,e){var r=this.font.getChar(e,t)||[0,0,0,null];return[r[0],r[1],r[2],r[3]||{}]},e.prototype.addGlyph=function(t,e,r,o,n){return void 0===n&&(n=null),this.placeChar(t,r,o,n||this.element,e)},e.prototype.addTop=function(t,e,r,o){if(!t)return 0;var n=a(this.getChar(t,e),3),i=n[0],s=n[1],l=n[2];return this.addGlyph(t,e,(o-l)/2,r-i),i+s},e.prototype.addExtV=function(t,e,r,o,n,i,s){var l=this;if(t){n=Math.max(0,n-h),i=Math.max(0,i-h);var c=this.adaptor,u=a(this.getChar(t,e),3),p=u[0],d=u[1],f=u[2],y=r+o-n-i,m=1.5*y/(p+d),v=(m*(p-d)-y)/2;if(!(y<=0)){var g=this.svg("svg",{width:this.fixed(f),height:this.fixed(y),y:this.fixed(i-o),x:this.fixed((s-f)/2),viewBox:[0,v,f,y].map((function(t){return l.fixed(t)})).join(" ")});this.addGlyph(t,e,0,0,g);var b=c.lastChild(g);c.setAttribute(b,"transform","scale(1,".concat(this.jax.fixed(m),")")),c.append(this.element,g)}}},e.prototype.addBot=function(t,e,r,o){if(!t)return 0;var n=a(this.getChar(t,e),3),i=n[0],s=n[1],l=n[2];return this.addGlyph(t,e,(o-l)/2,s-r),i+s},e.prototype.addMidV=function(t,e,r){if(!t)return[0,0];var o=a(this.getChar(t,e),3),n=o[0],i=o[1],s=o[2],l=(i-n)/2+this.font.params.axis_height;return this.addGlyph(t,e,(r-s)/2,l),[n+l,i-l]},e.prototype.addLeft=function(t,e){return t?this.addGlyph(t,e,0,0):0},e.prototype.addExtH=function(t,e,r,o,n,i){var s=this;if(void 0===i&&(i=0),t){n=Math.max(0,n-.1),o=Math.max(0,o-.1);var l=this.adaptor,c=a(this.getChar(t,e),3),u=c[0],p=c[1],d=c[2],f=r-o-n,y=u+p+.2,m=f/d*1.5,v=-(p+h);if(!(f<=0)){var g=this.svg("svg",{width:this.fixed(f),height:this.fixed(y),x:this.fixed(i+o),y:this.fixed(v),viewBox:[(m*d-f)/2,v,f,y].map((function(t){return s.fixed(t)})).join(" ")});this.addGlyph(t,e,0,0,g);var b=l.lastChild(g);l.setAttribute(b,"transform","scale("+this.jax.fixed(m)+",1)"),l.append(this.element,g)}}},e.prototype.addRight=function(t,e,r){if(!t)return 0;var o=this.getChar(t,e)[2];return this.addGlyph(t,e,r-o,0)},e.prototype.addMidH=function(t,e,r){if(!t)return[0,0];var o=this.getChar(t,e)[2];return this.addGlyph(t,e,(r-o)/2,0),[(r-o)/2,(r+o)/2]},e.kind=c.MmlMo.prototype.kind,e}((0,l.CommonMoMixin)(s.SVGWrapper));e.SVGmo=u},4539:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmpadded=void 0;var a=r(9321),s=r(7481),l=r(189),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=i(this.getDimens(),9),o=r[5],n=r[6],a=r[7],s=r[8],l=this.node.attributes.get("data-align")||"left",c=n+s-(o<0&&"left"!==l?"center"===l?o/2:o:0);(c||a)&&(e=this.adaptor.append(e,this.svg("g")),this.place(c,a,e)),this.addChildren(e)},e.kind=l.MmlMpadded.prototype.kind,e}((0,s.CommonMpaddedMixin)(a.SVGWrapper));e.SVGmpadded=c},438:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmphantom=void 0;var i=r(9321),a=r(7988),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){this.standardSVGnode(t)},e.kind=a.MmlMphantom.prototype.kind,e}(i.SVGWrapper);e.SVGmphantom=s},8798:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmroot=void 0;var a=r(9948),s=r(5997),l=r(4664),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.addRoot=function(t,e,r,o){e.toSVG(t);var n=i(this.getRootDimens(r,o),3),a=n[0],s=n[1],l=n[2],c=e.getOuterBBox();e.place(l*c.rscale,s),this.dx=a},e.kind=l.MmlMroot.prototype.kind,e}((0,s.CommonMrootMixin)(a.SVGmsqrt));e.SVGmroot=c},322:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGinferredMrow=e.SVGmrow=void 0;var i=r(9321),a=r(9323),s=r(9323),l=r(1691),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.node.isInferred?this.element=t:this.standardSVGnode(t);this.addChildren(e)},e.kind=l.MmlMrow.prototype.kind,e}((0,a.CommonMrowMixin)(i.SVGWrapper));e.SVGmrow=c;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=l.MmlInferredMrow.prototype.kind,e}((0,s.CommonInferredMrowMixin)(c));e.SVGinferredMrow=h},3677:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGms=void 0;var i=r(9321),a=r(6920),s=r(4042),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlMs.prototype.kind,e}((0,a.CommonMsMixin)(i.SVGWrapper));e.SVGms=l},2458:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmspace=void 0;var i=r(9321),a=r(37),s=r(1465),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlMspace.prototype.kind,e}((0,a.CommonMspaceMixin)(i.SVGWrapper));e.SVGmspace=l},9948:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmsqrt=void 0;var i=r(9321),a=r(222),s=r(4655),l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.dx=0,e}return n(e,t),e.prototype.toSVG=function(t){var e=this.childNodes[this.surd],r=this.childNodes[this.base],o=this.root?this.childNodes[this.root]:null,n=e.getBBox(),i=r.getOuterBBox(),a=this.getPQ(n)[1],s=this.font.params.rule_thickness*this.bbox.scale,l=i.h+a+s,c=this.standardSVGnode(t),h=this.adaptor.append(c,this.svg("g"));this.addRoot(c,o,n,l),e.toSVG(c),e.place(this.dx,l-n.h),r.toSVG(h),r.place(this.dx+n.w,0),this.adaptor.append(c,this.svg("rect",{width:this.fixed(i.w),height:this.fixed(s),x:this.fixed(this.dx+n.w),y:this.fixed(l-s)}))},e.prototype.addRoot=function(t,e,r,o){},e.kind=s.MmlMsqrt.prototype.kind,e}((0,a.CommonMsqrtMixin)(i.SVGWrapper));e.SVGmsqrt=l},7522:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmsubsup=e.SVGmsup=e.SVGmsub=void 0;var a=r(1269),s=r(3069),l=r(3069),c=r(3069),h=r(5857),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=h.MmlMsub.prototype.kind,e}((0,s.CommonMsubMixin)(a.SVGscriptbase));e.SVGmsub=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=h.MmlMsup.prototype.kind,e}((0,l.CommonMsupMixin)(a.SVGscriptbase));e.SVGmsup=p;var d=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=i([this.baseChild,this.supChild,this.subChild],3),o=r[0],n=r[1],a=r[2],s=this.getBaseWidth(),l=this.getAdjustedIc(),c=i(this.getUVQ(),2),h=c[0],u=c[1];o.toSVG(e),n.toSVG(e),a.toSVG(e),a.place(s,u),n.place(s+l,h)},e.kind=h.MmlMsubsup.prototype.kind,e}((0,c.CommonMsubsupMixin)(a.SVGscriptbase));e.SVGmsubsup=d},451:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmtable=void 0;var s=r(9321),l=r(8589),c=r(4859),h=function(t){function e(e,r,o){void 0===o&&(o=null);var n=t.call(this,e,r,o)||this,i={"data-labels":!0};return n.isTop&&(i.transform="matrix(1 0 0 -1 0 0)"),n.labels=n.svg("g",i),n}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t);this.placeRows(e),this.handleColumnLines(e),this.handleRowLines(e),this.handleFrame(e);var r=this.handlePWidth(e);this.handleLabels(e,t,r)},e.prototype.placeRows=function(t){for(var e,r,o,n=this.node.attributes.get("equalrows"),s=this.getTableData(),l=s.H,c=s.D,h=this.getEqualRowHeight(),u=this.getRowHalfSpacing(),p=a(a([this.fLine],i(this.rLines),!1),[this.fLine],!1),d=this.getBBox().h-p[0],f=0;f<this.numRows;f++){var y=this.childNodes[f];e=i(this.getRowHD(n,h,l[f],c[f]),2),y.H=e[0],y.D=e[1],r=i([u[f],u[f+1]],2),y.tSpace=r[0],y.bSpace=r[1],o=i([p[f],p[f+1]],2),y.tLine=o[0],y.bLine=o[1],y.toSVG(t),y.place(0,d-u[f]-y.H),d-=u[f]+y.H+y.D+u[f+1]+p[f+1]}},e.prototype.getRowHD=function(t,e,r,o){return t?[(e+r-o)/2,(e-r+o)/2]:[r,o]},e.prototype.handleColor=function(){t.prototype.handleColor.call(this);var e=this.firstChild();e&&this.adaptor.setAttribute(e,"width",this.fixed(this.getWidth()))},e.prototype.handleColumnLines=function(t){if("none"!==this.node.attributes.get("columnlines")){var e=this.getColumnAttributes("columnlines");if(e)for(var r=this.getColumnHalfSpacing(),o=this.cLines,n=this.getComputedWidths(),i=this.fLine,a=0;a<e.length;a++)i+=r[a]+n[a]+r[a+1],"none"!==e[a]&&this.adaptor.append(t,this.makeVLine(i,e[a],o[a])),i+=o[a]}},e.prototype.handleRowLines=function(t){if("none"!==this.node.attributes.get("rowlines")){var e=this.getRowAttributes("rowlines");if(e)for(var r=this.node.attributes.get("equalrows"),o=this.getTableData(),n=o.H,a=o.D,s=this.getEqualRowHeight(),l=this.getRowHalfSpacing(),c=this.rLines,h=this.getBBox().h-this.fLine,u=0;u<e.length;u++){var p=i(this.getRowHD(r,s,n[u],a[u]),2),d=p[0],f=p[1];h-=l[u]+d+f+l[u+1],"none"!==e[u]&&this.adaptor.append(t,this.makeHLine(h,e[u],c[u])),h-=c[u]}}},e.prototype.handleFrame=function(t){if(this.frame&&this.fLine){var e=this.getBBox(),r=e.h,o=e.d,n=e.w,i=this.node.attributes.get("frame");this.adaptor.append(t,this.makeFrame(n,r,o,i))}},e.prototype.handlePWidth=function(t){if(!this.pWidth)return 0;var e=this.getBBox(),r=e.w,o=e.L,n=e.R,i=o+this.pWidth+n,a=this.getAlignShift()[0],s=Math.max(this.isTop?i:0,this.container.getWrapWidth(this.containerI))-o-n,l=r-(this.pWidth>s?s:this.pWidth),c="left"===a?0:"right"===a?l:l/2;if(c){var h=this.svg("g",{},this.adaptor.childNodes(t));this.place(c,0,h),this.adaptor.append(t,h)}return c},e.prototype.lineClass=function(t){return"mjx-"+t},e.prototype.makeFrame=function(t,e,r,o){var n=this.fLine;return this.svg("rect",this.setLineThickness(n,o,{"data-frame":!0,class:this.lineClass(o),width:this.fixed(t-n),height:this.fixed(e+r-n),x:this.fixed(n/2),y:this.fixed(n/2-r)}))},e.prototype.makeVLine=function(t,e,r){var o=this.getBBox(),n=o.h,i=o.d,a="dotted"===e?r/2:0,s=this.fixed(t+r/2);return this.svg("line",this.setLineThickness(r,e,{"data-line":"v",class:this.lineClass(e),x1:s,y1:this.fixed(a-i),x2:s,y2:this.fixed(n-a)}))},e.prototype.makeHLine=function(t,e,r){var o=this.getBBox().w,n="dotted"===e?r/2:0,i=this.fixed(t-r/2);return this.svg("line",this.setLineThickness(r,e,{"data-line":"h",class:this.lineClass(e),x1:this.fixed(n),y1:i,x2:this.fixed(o-n),y2:i}))},e.prototype.setLineThickness=function(t,e,r){return.07!==t&&(r["stroke-thickness"]=this.fixed(t),"solid"!==e&&(r["stroke-dasharray"]=("dotted"===e?"0,":"")+this.fixed(2*t))),r},e.prototype.handleLabels=function(t,e,r){if(this.hasLabels){var o=this.labels,n=this.node.attributes.get("side");this.spaceLabels(),this.isTop?this.topTable(t,o,n):this.subTable(t,o,n,r)}},e.prototype.spaceLabels=function(){for(var t=this.adaptor,e=this.getBBox().h,r=this.getTableData().L,o=this.getRowHalfSpacing(),n=e-this.fLine,i=t.firstChild(this.labels),a=0;a<this.numRows;a++){var s=this.childNodes[a];if(s.node.isKind("mlabeledtr")){var l=s.childNodes[0];n-=o[a]+s.H,s.placeCell(l,{x:0,y:n,w:r,lSpace:0,rSpace:0,lLine:0,rLine:0}),n-=s.D+o[a+1]+this.rLines[a],i=t.next(i)}else n-=o[a]+s.H+s.D+o[a+1]+this.rLines[a]}},e.prototype.topTable=function(t,e,r){var o=this.adaptor,n=this.getBBox(),a=n.h,s=n.d,l=n.w,c=n.L,h=n.R,u=c+(this.pWidth||l)+h,p=this.getTableData().L,d=i(this.getPadAlignShift(r),3),f=d[1],y=d[2]+("right"===f?-u:"center"===f?-u/2:0)+c,m="matrix(1 0 0 -1 0 0)",v="scale(".concat(this.jax.fixed(1e3*this.font.params.x_height/this.metrics.ex,2),")"),g="translate(0 ".concat(this.fixed(a),") ").concat(m," ").concat(v),b=this.svg("svg",{"data-table":!0,preserveAspectRatio:"left"===f?"xMinYMid":"right"===f?"xMaxYMid":"xMidYMid",viewBox:[this.fixed(-y),this.fixed(-a),1,this.fixed(a+s)].join(" ")},[this.svg("g",{transform:m},o.childNodes(t))]);e=this.svg("svg",{"data-labels":!0,preserveAspectRatio:"left"===r?"xMinYMid":"xMaxYMid",viewBox:["left"===r?0:this.fixed(p),this.fixed(-a),1,this.fixed(a+s)].join(" ")},[e]),o.append(t,this.svg("g",{transform:g},[b,e])),this.place(-c,0,t)},e.prototype.subTable=function(t,e,r,o){var n=this.adaptor,i=this.getBBox(),a=i.w,s=i.L,l=i.R,c=s+(this.pWidth||a)+l,h=this.getTableData().L,u=this.getAlignShift()[0],p=Math.max(c,this.container.getWrapWidth(this.containerI));this.place("left"===r?("left"===u?0:"right"===u?c-p+o:(c-p)/2+o)-s:("left"===u?p:"right"===u?c+o:(p+c)/2+o)-s-h,0,e),n.append(t,e)},e.kind=c.MmlMtable.prototype.kind,e.styles={'g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line]':{"stroke-width":"70px",fill:"none"},'g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame]':{"stroke-width":"70px",fill:"none"},'g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed':{"stroke-dasharray":"140"},'g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted':{"stroke-linecap":"round","stroke-dasharray":"0,140"},'g[data-mml-node="mtable"] > g > svg':{overflow:"visible"}},e}((0,l.CommonMtableMixin)(s.SVGWrapper));e.SVGmtable=h},2673:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmtd=void 0;var i=r(9321),a=r(7805),s=r(2321),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.placeCell=function(t,e,r,o,n){var i=this.getBBox(),a=Math.max(i.h,.75),s=Math.max(i.d,.25),l=this.node.attributes.get("columnalign"),c=this.node.attributes.get("rowalign"),h=this.getAlignX(r,i,l),u=this.getAlignY(o,n,a,s,c);return this.place(t+h,e+u),[h,u]},e.prototype.placeColor=function(t,e,r,o){var n=this.adaptor,i=this.firstChild();i&&"rect"===n.kind(i)&&n.getAttribute(i,"data-bgcolor")&&(n.setAttribute(i,"x",this.fixed(t)),n.setAttribute(i,"y",this.fixed(e)),n.setAttribute(i,"width",this.fixed(r)),n.setAttribute(i,"height",this.fixed(o)))},e.kind=s.MmlMtd.prototype.kind,e}((0,a.CommonMtdMixin)(i.SVGWrapper));e.SVGmtd=l},1941:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmtext=void 0;var i=r(9321),a=r(8325),s=r(6277),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlMtext.prototype.kind,e}((0,a.CommonMtextMixin)(i.SVGWrapper));e.SVGmtext=l},4682:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var o,n=0,i=e.length;n<i;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmlabeledtr=e.SVGmtr=void 0;var s=r(9321),l=r(4818),c=r(4818),h=r(4393),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t);this.placeCells(e),this.placeColor()},e.prototype.placeCells=function(t){for(var e=this.parent.getColumnHalfSpacing(),r=a(a([this.parent.fLine],i(this.parent.cLines),!1),[this.parent.fLine],!1),o=this.parent.getComputedWidths(),n=1/this.getBBox().rscale,s=r[0],l=0;l<this.numCells;l++){var c=this.getChild(l);c.toSVG(t),s+=this.placeCell(c,{x:s,y:0,lSpace:e[l]*n,rSpace:e[l+1]*n,w:o[l]*n,lLine:r[l]*n,rLine:r[l+1]*n})}},e.prototype.placeCell=function(t,e){var r=e.x,o=e.y,n=e.lSpace,a=e.w,s=e.rSpace,l=e.lLine,c=e.rLine,h=1/this.getBBox().rscale,u=i([this.H*h,this.D*h],2),p=u[0],d=u[1],f=i([this.tSpace*h,this.bSpace*h],2),y=f[0],m=f[1],v=i(t.placeCell(r+n,o,a,p,d),2),g=v[0],b=v[1],x=n+a+s;return t.placeColor(-(g+n+l/2),-(d+m+b),x+(l+c)/2,p+d+y+m),x+c},e.prototype.placeColor=function(){var t=1/this.getBBox().rscale,e=this.adaptor,r=this.firstChild();if(r&&"rect"===e.kind(r)&&e.getAttribute(r,"data-bgcolor")){var o=i([this.tLine/2*t,this.bLine/2*t],2),n=o[0],a=o[1],s=i([this.tSpace*t,this.bSpace*t],2),l=s[0],c=s[1],h=i([this.H*t,this.D*t],2),u=h[0],p=h[1];e.setAttribute(r,"y",this.fixed(-(p+c+a))),e.setAttribute(r,"width",this.fixed(this.parent.getWidth()*t)),e.setAttribute(r,"height",this.fixed(n+l+u+p+c+a))}},e.kind=h.MmlMtr.prototype.kind,e}((0,l.CommonMtrMixin)(s.SVGWrapper));e.SVGmtr=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(e){t.prototype.toSVG.call(this,e);var r=this.childNodes[0];r&&r.toSVG(this.parent.labels)},e.kind=h.MmlMlabeledtr.prototype.kind,e}((0,c.CommonMlabeledtrMixin)(u));e.SVGmlabeledtr=p},4299:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmunderover=e.SVGmover=e.SVGmunder=void 0;var a=r(7522),s=r(9690),l=r(9690),c=r(9690),h=r(3102),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(e){if(this.hasMovableLimits())t.prototype.toSVG.call(this,e);else{var r=this.standardSVGnode(e),o=i([this.baseChild,this.scriptChild],2),n=o[0],a=o[1],s=i([n.getOuterBBox(),a.getOuterBBox()],2),l=s[0],c=s[1];n.toSVG(r),a.toSVG(r);var h=this.isLineBelow?0:this.getDelta(!0),u=this.getUnderKV(l,c)[1],p=i(this.getDeltaW([l,c],[0,-h]),2),d=p[0],f=p[1];n.place(d,0),a.place(f,u)}},e.kind=h.MmlMunder.prototype.kind,e}((0,s.CommonMunderMixin)(a.SVGmsub));e.SVGmunder=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(e){if(this.hasMovableLimits())t.prototype.toSVG.call(this,e);else{var r=this.standardSVGnode(e),o=i([this.baseChild,this.scriptChild],2),n=o[0],a=o[1],s=i([n.getOuterBBox(),a.getOuterBBox()],2),l=s[0],c=s[1];n.toSVG(r),a.toSVG(r);var h=this.isLineAbove?0:this.getDelta(),u=this.getOverKU(l,c)[1],p=i(this.getDeltaW([l,c],[0,h]),2),d=p[0],f=p[1];n.place(d,0),a.place(f,u)}},e.kind=h.MmlMover.prototype.kind,e}((0,l.CommonMoverMixin)(a.SVGmsup));e.SVGmover=p;var d=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(e){if(this.hasMovableLimits())t.prototype.toSVG.call(this,e);else{var r=this.standardSVGnode(e),o=i([this.baseChild,this.overChild,this.underChild],3),n=o[0],a=o[1],s=o[2],l=i([n.getOuterBBox(),a.getOuterBBox(),s.getOuterBBox()],3),c=l[0],h=l[1],u=l[2];n.toSVG(r),s.toSVG(r),a.toSVG(r);var p=this.getDelta(),d=this.getOverKU(c,h)[1],f=this.getUnderKV(c,u)[1],y=i(this.getDeltaW([c,u,h],[0,this.isLineBelow?0:-p,this.isLineAbove?0:p]),3),m=y[0],v=y[1],g=y[2];n.place(m,0),s.place(v,f),a.place(g,d)}},e.kind=h.MmlMunderover.prototype.kind,e}((0,c.CommonMunderoverMixin)(a.SVGmsubsup));e.SVGmunderover=d},1269:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var o,n,i=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return a};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGscriptbase=void 0;var a=r(9321),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=this.getBaseWidth(),o=i(this.getOffset(),2),n=o[0],a=o[1];this.baseChild.toSVG(e),this.scriptChild.toSVG(e),this.scriptChild.place(r+n,a)},e.kind="scriptbase",e}((0,r(7091).CommonScriptbaseMixin)(a.SVGWrapper));e.SVGscriptbase=s},6965:function(t,e,r){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGxml=e.SVGannotationXML=e.SVGannotation=e.SVGsemantics=void 0;var i=r(9321),a=r(3191),s=r(9167),l=r(8921),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t);this.childNodes.length&&this.childNodes[0].toSVG(e)},e.kind=s.MmlSemantics.prototype.kind,e}((0,a.CommonSemanticsMixin)(i.SVGWrapper));e.SVGsemantics=c;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(e){t.prototype.toSVG.call(this,e)},e.prototype.computeBBox=function(){return this.bbox},e.kind=s.MmlAnnotation.prototype.kind,e}(i.SVGWrapper);e.SVGannotation=h;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.kind=s.MmlAnnotationXML.prototype.kind,e.styles={"foreignObject[data-mjx-xml]":{"font-family":"initial","line-height":"normal",overflow:"visible"}},e}(i.SVGWrapper);e.SVGannotationXML=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.toSVG=function(t){var e=this.adaptor.clone(this.node.getXML()),r=this.jax.math.metrics.em*this.jax.math.metrics.scale,o=this.fixed(1/r),n=this.getBBox(),i=n.w,a=n.h,s=n.d;this.element=this.adaptor.append(t,this.svg("foreignObject",{"data-mjx-xml":!0,y:this.jax.fixed(-a*r)+"px",width:this.jax.fixed(i*r)+"px",height:this.jax.fixed((a+s)*r)+"px",transform:"scale(".concat(o,") matrix(1 0 0 -1 0 0)")},[e]))},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.jax.measureXMLnode(this.node.getXML()),o=r.w,n=r.h,i=r.d;t.w=o,t.h=n,t.d=i},e.prototype.getStyles=function(){},e.prototype.getScale=function(){},e.prototype.getVariant=function(){},e.kind=l.XMLNode.prototype.kind,e.autoStyle=!1,e}(i.SVGWrapper);e.SVGxml=p},8723:function(t,e){MathJax._.components.global.isObject,MathJax._.components.global.combineConfig,e.PV=MathJax._.components.global.combineDefaults,e.r8=MathJax._.components.global.combineWithMathJax,MathJax._.components.global.MathJax},4769:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.protoItem=MathJax._.core.MathItem.protoItem,e.AbstractMathItem=MathJax._.core.MathItem.AbstractMathItem,e.STATE=MathJax._.core.MathItem.STATE,e.newState=MathJax._.core.MathItem.newState},8921:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.TEXCLASS=MathJax._.core.MmlTree.MmlNode.TEXCLASS,e.TEXCLASSNAMES=MathJax._.core.MmlTree.MmlNode.TEXCLASSNAMES,e.indentAttributes=MathJax._.core.MmlTree.MmlNode.indentAttributes,e.AbstractMmlNode=MathJax._.core.MmlTree.MmlNode.AbstractMmlNode,e.AbstractMmlTokenNode=MathJax._.core.MmlTree.MmlNode.AbstractMmlTokenNode,e.AbstractMmlLayoutNode=MathJax._.core.MmlTree.MmlNode.AbstractMmlLayoutNode,e.AbstractMmlBaseNode=MathJax._.core.MmlTree.MmlNode.AbstractMmlBaseNode,e.AbstractMmlEmptyNode=MathJax._.core.MmlTree.MmlNode.AbstractMmlEmptyNode,e.TextNode=MathJax._.core.MmlTree.MmlNode.TextNode,e.XMLNode=MathJax._.core.MmlTree.MmlNode.XMLNode},4282:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.TeXAtom=MathJax._.core.MmlTree.MmlNodes.TeXAtom.TeXAtom},3969:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMaction=MathJax._.core.MmlTree.MmlNodes.maction.MmlMaction},304:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMath=MathJax._.core.MmlTree.MmlNodes.math.MmlMath},4374:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMenclose=MathJax._.core.MmlTree.MmlNodes.menclose.MmlMenclose},8078:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMerror=MathJax._.core.MmlTree.MmlNodes.merror.MmlMerror},7451:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMfenced=MathJax._.core.MmlTree.MmlNodes.mfenced.MmlMfenced},848:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMfrac=MathJax._.core.MmlTree.MmlNodes.mfrac.MmlMfrac},910:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMglyph=MathJax._.core.MmlTree.MmlNodes.mglyph.MmlMglyph},7754:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMi=MathJax._.core.MmlTree.MmlNodes.mi.MmlMi},7764:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMmultiscripts=MathJax._.core.MmlTree.MmlNodes.mmultiscripts.MmlMmultiscripts,e.MmlMprescripts=MathJax._.core.MmlTree.MmlNodes.mmultiscripts.MmlMprescripts,e.MmlNone=MathJax._.core.MmlTree.MmlNodes.mmultiscripts.MmlNone},3235:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMn=MathJax._.core.MmlTree.MmlNodes.mn.MmlMn},9946:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMo=MathJax._.core.MmlTree.MmlNodes.mo.MmlMo},189:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMpadded=MathJax._.core.MmlTree.MmlNodes.mpadded.MmlMpadded},7988:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMphantom=MathJax._.core.MmlTree.MmlNodes.mphantom.MmlMphantom},4664:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMroot=MathJax._.core.MmlTree.MmlNodes.mroot.MmlMroot},1691:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMrow=MathJax._.core.MmlTree.MmlNodes.mrow.MmlMrow,e.MmlInferredMrow=MathJax._.core.MmlTree.MmlNodes.mrow.MmlInferredMrow},4042:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMs=MathJax._.core.MmlTree.MmlNodes.ms.MmlMs},1465:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMspace=MathJax._.core.MmlTree.MmlNodes.mspace.MmlMspace},4655:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMsqrt=MathJax._.core.MmlTree.MmlNodes.msqrt.MmlMsqrt},5857:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMsubsup=MathJax._.core.MmlTree.MmlNodes.msubsup.MmlMsubsup,e.MmlMsub=MathJax._.core.MmlTree.MmlNodes.msubsup.MmlMsub,e.MmlMsup=MathJax._.core.MmlTree.MmlNodes.msubsup.MmlMsup},4859:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtable=MathJax._.core.MmlTree.MmlNodes.mtable.MmlMtable},2321:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtd=MathJax._.core.MmlTree.MmlNodes.mtd.MmlMtd},6277:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtext=MathJax._.core.MmlTree.MmlNodes.mtext.MmlMtext},4393:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtr=MathJax._.core.MmlTree.MmlNodes.mtr.MmlMtr,e.MmlMlabeledtr=MathJax._.core.MmlTree.MmlNodes.mtr.MmlMlabeledtr},3102:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMunderover=MathJax._.core.MmlTree.MmlNodes.munderover.MmlMunderover,e.MmlMunder=MathJax._.core.MmlTree.MmlNodes.munderover.MmlMunder,e.MmlMover=MathJax._.core.MmlTree.MmlNodes.munderover.MmlMover},9167:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlSemantics=MathJax._.core.MmlTree.MmlNodes.semantics.MmlSemantics,e.MmlAnnotationXML=MathJax._.core.MmlTree.MmlNodes.semantics.MmlAnnotationXML,e.MmlAnnotation=MathJax._.core.MmlTree.MmlNodes.semantics.MmlAnnotation},3985:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractOutputJax=MathJax._.core.OutputJax.AbstractOutputJax},9879:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractWrapper=MathJax._.core.Tree.Wrapper.AbstractWrapper},2506:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractWrapperFactory=MathJax._.core.Tree.WrapperFactory.AbstractWrapperFactory},3717:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.BBox=MathJax._.util.BBox.BBox},9077:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.isObject=MathJax._.util.Options.isObject,e.APPEND=MathJax._.util.Options.APPEND,e.REMOVE=MathJax._.util.Options.REMOVE,e.OPTIONS=MathJax._.util.Options.OPTIONS,e.Expandable=MathJax._.util.Options.Expandable,e.expandable=MathJax._.util.Options.expandable,e.makeArray=MathJax._.util.Options.makeArray,e.keys=MathJax._.util.Options.keys,e.copy=MathJax._.util.Options.copy,e.insert=MathJax._.util.Options.insert,e.defaultOptions=MathJax._.util.Options.defaultOptions,e.userOptions=MathJax._.util.Options.userOptions,e.selectOptions=MathJax._.util.Options.selectOptions,e.selectOptionsFromKeys=MathJax._.util.Options.selectOptionsFromKeys,e.separateOptions=MathJax._.util.Options.separateOptions,e.lookup=MathJax._.util.Options.lookup},5888:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.CssStyles=MathJax._.util.StyleList.CssStyles},5878:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Styles=MathJax._.util.Styles.Styles},6914:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.BIGDIMEN=MathJax._.util.lengths.BIGDIMEN,e.UNITS=MathJax._.util.lengths.UNITS,e.RELUNITS=MathJax._.util.lengths.RELUNITS,e.MATHSPACE=MathJax._.util.lengths.MATHSPACE,e.length2em=MathJax._.util.lengths.length2em,e.percent=MathJax._.util.lengths.percent,e.em=MathJax._.util.lengths.em,e.emRounded=MathJax._.util.lengths.emRounded,e.px=MathJax._.util.lengths.px},1490:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.sum=MathJax._.util.numeric.sum,e.max=MathJax._.util.numeric.max},6720:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.sortLength=MathJax._.util.string.sortLength,e.quotePattern=MathJax._.util.string.quotePattern,e.unicodeChars=MathJax._.util.string.unicodeChars,e.unicodeString=MathJax._.util.string.unicodeString,e.isPercent=MathJax._.util.string.isPercent,e.split=MathJax._.util.string.split},4142:function(t,e,r){r.r(e),r.d(e,{TeXFont:function(){return u}});var o=r(9708);function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function i(t,e){for(var r=0;r<e.length;r++){var o=e[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){return s=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},s(t,e)}function l(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var r,o=h(t);if(e){var n=h(this).constructor;r=Reflect.construct(o,arguments,n)}else r=o.apply(this,arguments);return c(this,r)}}function c(t,e){if(e&&("object"===n(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function h(t){return h=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},h(t)}var u=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&s(t,e)}(c,t);var e,r,o,n=l(c);function c(){return a(this,c),n.apply(this,arguments)}return e=c,r&&i(e.prototype,r),o&&i(e,o),Object.defineProperty(e,"prototype",{writable:!1}),e}(o.FontData);u.OPTIONS={fontURL:"."}}},yt={};function mt(t){var e=yt[t];if(void 0!==e)return e.exports;var r=yt[t]={exports:{}};return ft[t].call(r.exports,r,r.exports,mt),r.exports}mt.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return mt.d(e,{a:e}),e},mt.d=function(t,e){for(var r in e)mt.o(e,r)&&!mt.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},mt.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},mt.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},t=mt(8723),e=mt(7306),r=mt(9250),o=mt(5373),n=mt(716),i=mt(1541),a=mt(1475),s=mt(3438),l=mt(555),c=mt(3345),h=mt(2057),u=mt(6200),p=mt(1346),d=mt(5705),f=mt(7969),y=mt(1419),m=mt(9906),v=mt(2304),g=mt(437),b=mt(7481),x=mt(5997),_=mt(9323),M=mt(6920),w=mt(37),S=mt(222),O=mt(3069),C=mt(8589),B=mt(7805),j=mt(8325),P=mt(4818),A=mt(9690),V=mt(7091),T=mt(3191),k=mt(6582),G=mt(4129),N=mt(9708),L=mt(9737),D=mt(9321),W=mt(9416),E=mt(4687),R=mt(484),I=mt(7455),F=mt(4601),H=mt(1211),J=mt(144),X=mt(3007),z=mt(5258),q=mt(9295),K=mt(4916),U=mt(2983),Q=mt(4750),Y=mt(9810),Z=mt(6760),$=mt(4539),tt=mt(438),et=mt(8798),rt=mt(322),ot=mt(3677),nt=mt(2458),it=mt(9948),at=mt(7522),st=mt(451),lt=mt(2673),ct=mt(1941),ht=mt(4682),ut=mt(4299),pt=mt(1269),dt=mt(6965),MathJax.loader&&MathJax.loader.checkVersion("output/svg",e.q,"output"),(0,t.r8)({_:{output:{common:{FontData:r,Notation:o,OutputJax:n,Wrapper:i,WrapperFactory:a,Wrappers:{TeXAtom:s,TextNode:l,maction:c,math:h,menclose:u,mfenced:p,mfrac:d,mglyph:f,mi:y,mmultiscripts:m,mn:v,mo:g,mpadded:b,mroot:x,mrow:_,ms:M,mspace:w,msqrt:S,msubsup:O,mtable:C,mtd:B,mtext:j,mtr:P,munderover:A,scriptbase:V,semantics:T}},svg_ts:k,svg:{FontCache:G,FontData:N,Notation:L,Wrapper:D,WrapperFactory:W,Wrappers_ts:E,Wrappers:{TeXAtom:R,TextNode:I,maction:F,math:H,menclose:J,merror:X,mfenced:z,mfrac:q,mglyph:K,mi:U,mmultiscripts:Q,mn:Y,mo:Z,mpadded:$,mphantom:tt,mroot:et,mrow:rt,ms:ot,mspace:nt,msqrt:it,msubsup:at,mtable:st,mtd:lt,mtext:ct,mtr:ht,munderover:ut,scriptbase:pt,semantics:dt}}}}}),MathJax.loader&&(0,t.PV)(MathJax.config.loader,"output/svg",{checkReady:function(){return MathJax.loader.load("output/svg/fonts/tex")}}),MathJax.startup&&(MathJax.startup.registerConstructor("svg",k.SVG),MathJax.startup.useOutput("svg"))}(); ================================================ FILE: assets/vendors/mathjax-v3/tex-chtml.js ================================================ (function(){"use strict";var __webpack_modules__={351:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AssistiveMmlHandler=e.AssistiveMmlMathDocumentMixin=e.AssistiveMmlMathItemMixin=e.LimitedMmlVisitor=void 0;var c=r(4474),u=r(9259),p=r(7233),h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getAttributes=function(e){return t.prototype.getAttributes.call(this,e).replace(/ ?id=".*?"/,"")},e}(u.SerializedMmlVisitor);function f(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.assistiveMml=function(t,e){if(void 0===e&&(e=!1),!(this.state()>=c.STATE.ASSISTIVEMML)){if(!this.isEscaped&&(t.options.enableAssistiveMml||e)){var r=t.adaptor,n=t.toMML(this.root).replace(/\n */g,"").replace(/<!--.*?-->/g,""),o=r.firstChild(r.body(r.parse(n,"text/html"))),i=r.node("mjx-assistive-mml",{unselectable:"on",display:this.display?"block":"inline"},[o]);r.setAttribute(r.firstChild(this.typesetRoot),"aria-hidden","true"),r.setStyle(this.typesetRoot,"position","relative"),r.append(this.typesetRoot,i)}this.state(c.STATE.ASSISTIVEMML)}},e}(t)}function d(t){var e;return e=function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,a([],s(e),!1))||this,o=n.constructor,i=o.ProcessBits;return i.has("assistive-mml")||i.allocate("assistive-mml"),n.visitor=new h(n.mmlFactory),n.options.MathItem=f(n.options.MathItem),"addStyles"in n&&n.addStyles(o.assistiveStyles),n}return o(e,t),e.prototype.toMML=function(t){return this.visitor.visitTree(t)},e.prototype.assistiveMml=function(){var t,e;if(!this.processed.isSet("assistive-mml")){try{for(var r=l(this.math),n=r.next();!n.done;n=r.next()){n.value.assistiveMml(this)}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}this.processed.set("assistive-mml")}return this},e.prototype.state=function(e,r){return void 0===r&&(r=!1),t.prototype.state.call(this,e,r),e<c.STATE.ASSISTIVEMML&&this.processed.clear("assistive-mml"),this},e}(t),e.OPTIONS=i(i({},t.OPTIONS),{enableAssistiveMml:!0,renderActions:(0,p.expandable)(i(i({},t.OPTIONS.renderActions),{assistiveMml:[c.STATE.ASSISTIVEMML]}))}),e.assistiveStyles={"mjx-assistive-mml":{position:"absolute !important",top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)",padding:"1px 0px 0px 0px !important",border:"0px !important",display:"block !important",width:"auto !important",overflow:"hidden !important","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none"},'mjx-assistive-mml[display="block"]':{width:"100% !important"}},e}e.LimitedMmlVisitor=h,(0,c.newState)("ASSISTIVEMML",153),e.AssistiveMmlMathItemMixin=f,e.AssistiveMmlMathDocumentMixin=d,e.AssistiveMmlHandler=function(t){return t.documentClass=d(t.documentClass),t}},5282:function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var r=new Map;e.default=r},5445:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},s=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function s(t){try{l(n.next(t))}catch(t){i(t)}}function a(t){try{l(n.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}l((n=n.apply(t,e||[])).next())}))},a=this&&this.__generator||function(t,e){var r,n,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;s;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,n=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!(o=s.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=e.call(t,s)}catch(t){i=[6,t],n=0}finally{r=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.sreReady=e.Sre=void 0;var c,u=i(r(2998)),p=i(r(3362)),h=i(r(9552)),f=i(r(4440)),d=l(r(5897)),m=r(8504),y=i(r(3090)),g=r(1377),b=l(r(5282));!function(t){t.locales=g.Variables.LOCALES,t.sreReady=u.engineReady,t.setupEngine=u.setupEngine,t.engineSetup=u.engineSetup,t.toEnriched=u.toEnriched,t.toSpeech=u.toSpeech,t.clearspeakPreferences=m.ClearspeakPreferences,t.getHighlighter=y.highlighter,t.getSpeechGenerator=h.generator,t.getWalker=p.walker,t.clearspeakStyle=function(){return f.DOMAIN_TO_STYLES.clearspeak},t.preloadLocales=function(t){return s(this,void 0,void 0,(function(){var e;return a(this,(function(r){return[2,(e=b.default.get(t))?new Promise((function(t,r){return t(JSON.stringify(e))})):u.localeLoader()(t)]}))}))}}(c=e.Sre||(e.Sre={})),e.sreReady=c.sreReady,d.default.getInstance().delay=!0,e.default=c},444:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLAdaptor=void 0;var s=function(t){function e(e){var r=t.call(this,e.document)||this;return r.window=e,r.parser=new e.DOMParser,r}return o(e,t),e.prototype.parse=function(t,e){return void 0===e&&(e="text/html"),this.parser.parseFromString(t,e)},e.prototype.create=function(t,e){return e?this.document.createElementNS(e,t):this.document.createElement(t)},e.prototype.text=function(t){return this.document.createTextNode(t)},e.prototype.head=function(t){return t.head||t},e.prototype.body=function(t){return t.body||t},e.prototype.root=function(t){return t.documentElement||t},e.prototype.doctype=function(t){return t.doctype?"<!DOCTYPE ".concat(t.doctype.name,">"):""},e.prototype.tags=function(t,e,r){void 0===r&&(r=null);var n=r?t.getElementsByTagNameNS(r,e):t.getElementsByTagName(e);return Array.from(n)},e.prototype.getElements=function(t,e){var r,n,o=[];try{for(var s=i(t),a=s.next();!a.done;a=s.next()){var l=a.value;"string"==typeof l?o=o.concat(Array.from(this.document.querySelectorAll(l))):Array.isArray(l)||l instanceof this.window.NodeList||l instanceof this.window.HTMLCollection?o=o.concat(Array.from(l)):o.push(l)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return o},e.prototype.contains=function(t,e){return t.contains(e)},e.prototype.parent=function(t){return t.parentNode},e.prototype.append=function(t,e){return t.appendChild(e)},e.prototype.insert=function(t,e){return this.parent(e).insertBefore(t,e)},e.prototype.remove=function(t){return this.parent(t).removeChild(t)},e.prototype.replace=function(t,e){return this.parent(e).replaceChild(t,e)},e.prototype.clone=function(t){return t.cloneNode(!0)},e.prototype.split=function(t,e){return t.splitText(e)},e.prototype.next=function(t){return t.nextSibling},e.prototype.previous=function(t){return t.previousSibling},e.prototype.firstChild=function(t){return t.firstChild},e.prototype.lastChild=function(t){return t.lastChild},e.prototype.childNodes=function(t){return Array.from(t.childNodes)},e.prototype.childNode=function(t,e){return t.childNodes[e]},e.prototype.kind=function(t){var e=t.nodeType;return 1===e||3===e||8===e?t.nodeName.toLowerCase():""},e.prototype.value=function(t){return t.nodeValue||""},e.prototype.textContent=function(t){return t.textContent},e.prototype.innerHTML=function(t){return t.innerHTML},e.prototype.outerHTML=function(t){return t.outerHTML},e.prototype.serializeXML=function(t){return(new this.window.XMLSerializer).serializeToString(t)},e.prototype.setAttribute=function(t,e,r,n){return void 0===n&&(n=null),n?(e=n.replace(/.*\//,"")+":"+e.replace(/^.*:/,""),t.setAttributeNS(n,e,r)):t.setAttribute(e,r)},e.prototype.getAttribute=function(t,e){return t.getAttribute(e)},e.prototype.removeAttribute=function(t,e){return t.removeAttribute(e)},e.prototype.hasAttribute=function(t,e){return t.hasAttribute(e)},e.prototype.allAttributes=function(t){return Array.from(t.attributes).map((function(t){return{name:t.name,value:t.value}}))},e.prototype.addClass=function(t,e){t.classList?t.classList.add(e):t.className=(t.className+" "+e).trim()},e.prototype.removeClass=function(t,e){t.classList?t.classList.remove(e):t.className=t.className.split(/ /).filter((function(t){return t!==e})).join(" ")},e.prototype.hasClass=function(t,e){return t.classList?t.classList.contains(e):t.className.split(/ /).indexOf(e)>=0},e.prototype.setStyle=function(t,e,r){t.style[e]=r},e.prototype.getStyle=function(t,e){return t.style[e]},e.prototype.allStyles=function(t){return t.style.cssText},e.prototype.insertRules=function(t,e){var r,n;try{for(var o=i(e.reverse()),s=o.next();!s.done;s=o.next()){var a=s.value;try{t.sheet.insertRule(a,0)}catch(t){console.warn("MathJax: can't insert css rule '".concat(a,"': ").concat(t.message))}}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.fontSize=function(t){var e=this.window.getComputedStyle(t);return parseFloat(e.fontSize)},e.prototype.fontFamily=function(t){return this.window.getComputedStyle(t).fontFamily||""},e.prototype.nodeSize=function(t,e,r){if(void 0===e&&(e=1),void 0===r&&(r=!1),r&&t.getBBox){var n=t.getBBox();return[n.width/e,n.height/e]}return[t.offsetWidth/e,t.offsetHeight/e]},e.prototype.nodeBBox=function(t){var e=t.getBoundingClientRect();return{left:e.left,right:e.right,top:e.top,bottom:e.bottom}},e}(r(5009).AbstractDOMAdaptor);e.HTMLAdaptor=s},6191:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.browserAdaptor=void 0;var n=r(444);e.browserAdaptor=function(){return new n.HTMLAdaptor(window)}},9515:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MathJax=e.combineWithMathJax=e.combineDefaults=e.combineConfig=e.isObject=void 0;var o=r(3282);function i(t){return"object"==typeof t&&null!==t}function s(t,e){var r,o;try{for(var a=n(Object.keys(e)),l=a.next();!l.done;l=a.next()){var c=l.value;"__esModule"!==c&&(!i(t[c])||!i(e[c])||e[c]instanceof Promise?null!==e[c]&&void 0!==e[c]&&(t[c]=e[c]):s(t[c],e[c]))}}catch(t){r={error:t}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(r)throw r.error}}return t}e.isObject=i,e.combineConfig=s,e.combineDefaults=function t(e,r,o){var s,a;e[r]||(e[r]={}),e=e[r];try{for(var l=n(Object.keys(o)),c=l.next();!c.done;c=l.next()){var u=c.value;i(e[u])&&i(o[u])?t(e,u,o[u]):null==e[u]&&null!=o[u]&&(e[u]=o[u])}}catch(t){s={error:t}}finally{try{c&&!c.done&&(a=l.return)&&a.call(l)}finally{if(s)throw s.error}}return e},e.combineWithMathJax=function(t){return s(e.MathJax,t)},void 0===r.g.MathJax&&(r.g.MathJax={}),r.g.MathJax.version||(r.g.MathJax={version:o.VERSION,_:{},config:r.g.MathJax}),e.MathJax=r.g.MathJax},235:function(t,e,r){var n,o,i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CONFIG=e.MathJax=e.Loader=e.PathFilters=e.PackageError=e.Package=void 0;var s=r(9515),a=r(265),l=r(265);Object.defineProperty(e,"Package",{enumerable:!0,get:function(){return l.Package}}),Object.defineProperty(e,"PackageError",{enumerable:!0,get:function(){return l.PackageError}});var c,u=r(7525);if(e.PathFilters={source:function(t){return e.CONFIG.source.hasOwnProperty(t.name)&&(t.name=e.CONFIG.source[t.name]),!0},normalize:function(t){var e=t.name;return e.match(/^(?:[a-z]+:\/)?\/|[a-z]:\\|\[/i)||(t.name="[mathjax]/"+e.replace(/^\.\//,"")),t.addExtension&&!e.match(/\.[^\/]+$/)&&(t.name+=".js"),!0},prefix:function(t){for(var r;(r=t.name.match(/^\[([^\]]*)\]/))&&e.CONFIG.paths.hasOwnProperty(r[1]);)t.name=e.CONFIG.paths[r[1]]+t.name.substr(r[0].length);return!0}},function(t){var r=s.MathJax.version;t.versions=new Map,t.ready=function(){for(var t,e,r=[],n=0;n<arguments.length;n++)r[n]=arguments[n];0===r.length&&(r=Array.from(a.Package.packages.keys()));var o=[];try{for(var s=i(r),l=s.next();!l.done;l=s.next()){var c=l.value,u=a.Package.packages.get(c)||new a.Package(c,!0);o.push(u.promise)}}catch(e){t={error:e}}finally{try{l&&!l.done&&(e=s.return)&&e.call(s)}finally{if(t)throw t.error}}return Promise.all(o)},t.load=function(){for(var r,n,o=[],s=0;s<arguments.length;s++)o[s]=arguments[s];if(0===o.length)return Promise.resolve();var l=[],c=function(r){var n=a.Package.packages.get(r);n||(n=new a.Package(r)).provides(e.CONFIG.provides[r]),n.checkNoLoad(),l.push(n.promise.then((function(){e.CONFIG.versionWarnings&&n.isLoaded&&!t.versions.has(a.Package.resolvePath(r))&&console.warn("No version information available for component ".concat(r))})))};try{for(var u=i(o),p=u.next();!p.done;p=u.next()){var h=p.value;c(h)}}catch(t){r={error:t}}finally{try{p&&!p.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}return a.Package.loadAll(),Promise.all(l)},t.preLoad=function(){for(var t,r,n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];try{for(var s=i(n),l=s.next();!l.done;l=s.next()){var c=l.value,u=a.Package.packages.get(c);u||(u=new a.Package(c,!0)).provides(e.CONFIG.provides[c]),u.loaded()}}catch(e){t={error:e}}finally{try{l&&!l.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}},t.defaultReady=function(){void 0!==e.MathJax.startup&&e.MathJax.config.startup.ready()},t.getRoot=function(){var t="//../../es5";if("undefined"!=typeof document){var e=document.currentScript||document.getElementById("MathJax-script");e&&(t=e.src.replace(/\/[^\/]*$/,""))}return t},t.checkVersion=function(n,o,i){return t.versions.set(a.Package.resolvePath(n),r),!(!e.CONFIG.versionWarnings||o===r)&&(console.warn("Component ".concat(n," uses ").concat(o," of MathJax; version in use is ").concat(r)),!0)},t.pathFilters=new u.FunctionList,t.pathFilters.add(e.PathFilters.source,0),t.pathFilters.add(e.PathFilters.normalize,10),t.pathFilters.add(e.PathFilters.prefix,20)}(c=e.Loader||(e.Loader={})),e.MathJax=s.MathJax,void 0===e.MathJax.loader){(0,s.combineDefaults)(e.MathJax.config,"loader",{paths:{mathjax:c.getRoot()},source:{},dependencies:{},provides:{},load:[],ready:c.defaultReady.bind(c),failed:function(t){return console.log("MathJax(".concat(t.package||"?","): ").concat(t.message))},require:null,pathFilters:[],versionWarnings:!0}),(0,s.combineWithMathJax)({loader:c});try{for(var p=i(e.MathJax.config.loader.pathFilters),h=p.next();!h.done;h=p.next()){var f=h.value;Array.isArray(f)?c.pathFilters.add(f[0],f[1]):c.pathFilters.add(f)}}catch(t){n={error:t}}finally{try{h&&!h.done&&(o=p.return)&&o.call(p)}finally{if(n)throw n.error}}}e.CONFIG=e.MathJax.config.loader},265:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.Package=e.PackageError=void 0;var l=r(235),c=function(t){function e(e,r){var n=t.call(this,e)||this;return n.package=r,n}return o(e,t),e}(Error);e.PackageError=c;var u=function(){function t(e,r){void 0===r&&(r=!1),this.isLoaded=!1,this.isLoading=!1,this.hasFailed=!1,this.dependents=[],this.dependencies=[],this.dependencyCount=0,this.provided=[],this.name=e,this.noLoad=r,t.packages.set(e,this),this.promise=this.makePromise(this.makeDependencies())}return Object.defineProperty(t.prototype,"canLoad",{get:function(){return 0===this.dependencyCount&&!this.noLoad&&!this.isLoading&&!this.hasFailed},enumerable:!1,configurable:!0}),t.resolvePath=function(t,e){void 0===e&&(e=!0);var r={name:t,original:t,addExtension:e};return l.Loader.pathFilters.execute(r),r.name},t.loadAll=function(){var t,e;try{for(var r=i(this.packages.values()),n=r.next();!n.done;n=r.next()){var o=n.value;o.canLoad&&o.load()}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},t.prototype.makeDependencies=function(){var e,r,n=[],o=t.packages,c=this.noLoad,u=this.name,p=[];l.CONFIG.dependencies.hasOwnProperty(u)?p.push.apply(p,a([],s(l.CONFIG.dependencies[u]),!1)):"core"!==u&&p.push("core");try{for(var h=i(p),f=h.next();!f.done;f=h.next()){var d=f.value,m=o.get(d)||new t(d,c);this.dependencies.indexOf(m)<0&&(m.addDependent(this,c),this.dependencies.push(m),m.isLoaded||(this.dependencyCount++,n.push(m.promise)))}}catch(t){e={error:t}}finally{try{f&&!f.done&&(r=h.return)&&r.call(h)}finally{if(e)throw e.error}}return n},t.prototype.makePromise=function(t){var e=this,r=new Promise((function(t,r){e.resolve=t,e.reject=r})),n=l.CONFIG[this.name]||{};return n.ready&&(r=r.then((function(t){return n.ready(e.name)}))),t.length&&(t.push(r),r=Promise.all(t).then((function(t){return t.join(", ")}))),n.failed&&r.catch((function(t){return n.failed(new c(t,e.name))})),r},t.prototype.load=function(){if(!this.isLoaded&&!this.isLoading&&!this.noLoad){this.isLoading=!0;var e=t.resolvePath(this.name);l.CONFIG.require?this.loadCustom(e):this.loadScript(e)}},t.prototype.loadCustom=function(t){var e=this;try{var r=l.CONFIG.require(t);r instanceof Promise?r.then((function(){return e.checkLoad()})).catch((function(r){return e.failed("Can't load \""+t+'"\n'+r.message.trim())})):this.checkLoad()}catch(t){this.failed(t.message)}},t.prototype.loadScript=function(t){var e=this,r=document.createElement("script");r.src=t,r.charset="UTF-8",r.onload=function(t){return e.checkLoad()},r.onerror=function(r){return e.failed("Can't load \""+t+'"')},document.head.appendChild(r)},t.prototype.loaded=function(){var t,e,r,n;this.isLoaded=!0,this.isLoading=!1;try{for(var o=i(this.dependents),s=o.next();!s.done;s=o.next()){s.value.requirementSatisfied()}}catch(e){t={error:e}}finally{try{s&&!s.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}try{for(var a=i(this.provided),l=a.next();!l.done;l=a.next()){l.value.loaded()}}catch(t){r={error:t}}finally{try{l&&!l.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}this.resolve(this.name)},t.prototype.failed=function(t){this.hasFailed=!0,this.isLoading=!1,this.reject(new c(t,this.name))},t.prototype.checkLoad=function(){var t=this;((l.CONFIG[this.name]||{}).checkReady||function(){return Promise.resolve()})().then((function(){return t.loaded()})).catch((function(e){return t.failed(e)}))},t.prototype.requirementSatisfied=function(){this.dependencyCount&&(this.dependencyCount--,this.canLoad&&this.load())},t.prototype.provides=function(e){var r,n;void 0===e&&(e=[]);try{for(var o=i(e),s=o.next();!s.done;s=o.next()){var a=s.value,c=t.packages.get(a);c||(l.CONFIG.dependencies[a]||(l.CONFIG.dependencies[a]=[]),l.CONFIG.dependencies[a].push(a),(c=new t(a,!0)).isLoading=!0),this.provided.push(c)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},t.prototype.addDependent=function(t,e){this.dependents.push(t),e||this.checkNoLoad()},t.prototype.checkNoLoad=function(){var t,e;if(this.noLoad){this.noLoad=!1;try{for(var r=i(this.dependencies),n=r.next();!n.done;n=r.next()){n.value.checkNoLoad()}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}}},t.packages=new Map,t}();e.Package=u},2388:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},n.apply(this,arguments)},o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CONFIG=e.MathJax=e.Startup=void 0;var a,l=r(9515),c=r(8666),u=r(7233);!function(t){var a,l,u=new c.PrioritizedList;function h(e){return a.visitTree(e,t.document)}function f(){a=new e.MathJax._.core.MmlTree.SerializedMmlVisitor.SerializedMmlVisitor,l=e.MathJax._.mathjax.mathjax,t.input=v(),t.output=_(),t.adaptor=S(),t.handler&&l.handlers.unregister(t.handler),t.handler=O(),t.handler&&(l.handlers.register(t.handler),t.document=M())}function d(){var e,r;t.input&&t.output&&m();var n=t.output?t.output.name.toLowerCase():"";try{for(var i=o(t.input),s=i.next();!s.done;s=i.next()){var a=s.value,l=a.name.toLowerCase();g(l,a),b(l,a),t.output&&y(l,n,a)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}}function m(){e.MathJax.typeset=function(e){void 0===e&&(e=null),t.document.options.elements=e,t.document.reset(),t.document.render()},e.MathJax.typesetPromise=function(e){return void 0===e&&(e=null),t.document.options.elements=e,t.document.reset(),l.handleRetriesFor((function(){t.document.render()}))},e.MathJax.typesetClear=function(e){void 0===e&&(e=null),e?t.document.clearMathItemsWithin(e):t.document.clear()}}function y(r,n,o){var i=r+"2"+n;e.MathJax[i]=function(e,r){return void 0===r&&(r={}),r.format=o.name,t.document.convert(e,r)},e.MathJax[i+"Promise"]=function(e,r){return void 0===r&&(r={}),r.format=o.name,l.handleRetriesFor((function(){return t.document.convert(e,r)}))},e.MathJax[n+"Stylesheet"]=function(){return t.output.styleSheet(t.document)},"getMetricsFor"in t.output&&(e.MathJax.getMetricsFor=function(e,r){return t.output.getMetricsFor(e,r)})}function g(r,n){var o=e.MathJax._.core.MathItem.STATE;e.MathJax[r+"2mml"]=function(e,r){return void 0===r&&(r={}),r.end=o.CONVERT,r.format=n.name,h(t.document.convert(e,r))},e.MathJax[r+"2mmlPromise"]=function(e,r){return void 0===r&&(r={}),r.end=o.CONVERT,r.format=n.name,l.handleRetriesFor((function(){return h(t.document.convert(e,r))}))}}function b(t,r){e.MathJax[t+"Reset"]=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return r.reset.apply(r,s([],i(t),!1))}}function v(){var r,n,i=[];try{for(var s=o(e.CONFIG.input),a=s.next();!a.done;a=s.next()){var l=a.value,c=t.constructors[l];if(!c)throw Error('Input Jax "'+l+'" is not defined (has it been loaded?)');i.push(new c(e.MathJax.config[l]))}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return i}function _(){var r=e.CONFIG.output;if(!r)return null;var n=t.constructors[r];if(!n)throw Error('Output Jax "'+r+'" is not defined (has it been loaded?)');return new n(e.MathJax.config[r])}function S(){var r=e.CONFIG.adaptor;if(!r||"none"===r)return null;var n=t.constructors[r];if(!n)throw Error('DOMAdaptor "'+r+'" is not defined (has it been loaded?)');return n(e.MathJax.config[r])}function O(){var r,n,i=e.CONFIG.handler;if(!i||"none"===i||!t.adaptor)return null;var s=t.constructors[i];if(!s)throw Error('Handler "'+i+'" is not defined (has it been loaded?)');var a=new s(t.adaptor,5);try{for(var l=o(u),c=l.next();!c.done;c=l.next()){a=c.value.item(a)}}catch(t){r={error:t}}finally{try{c&&!c.done&&(n=l.return)&&n.call(l)}finally{if(r)throw r.error}}return a}function M(r){return void 0===r&&(r=null),l.document(r||e.CONFIG.document,n(n({},e.MathJax.config.options),{InputJax:t.input,OutputJax:t.output}))}t.constructors={},t.input=[],t.output=null,t.handler=null,t.adaptor=null,t.elements=null,t.document=null,t.promise=new Promise((function(e,r){t.promiseResolve=e,t.promiseReject=r})),t.pagePromise=new Promise((function(t,e){var n=r.g.document;if(n&&n.readyState&&"complete"!==n.readyState&&"interactive"!==n.readyState){var o=function(){return t()};n.defaultView.addEventListener("load",o,!0),n.defaultView.addEventListener("DOMContentLoaded",o,!0)}else t()})),t.toMML=h,t.registerConstructor=function(e,r){t.constructors[e]=r},t.useHandler=function(t,r){void 0===r&&(r=!1),e.CONFIG.handler&&!r||(e.CONFIG.handler=t)},t.useAdaptor=function(t,r){void 0===r&&(r=!1),e.CONFIG.adaptor&&!r||(e.CONFIG.adaptor=t)},t.useInput=function(t,r){void 0===r&&(r=!1),p&&!r||e.CONFIG.input.push(t)},t.useOutput=function(t,r){void 0===r&&(r=!1),e.CONFIG.output&&!r||(e.CONFIG.output=t)},t.extendHandler=function(t,e){void 0===e&&(e=10),u.add(t,e)},t.defaultReady=function(){f(),d(),t.pagePromise.then((function(){return e.CONFIG.pageReady()})).then((function(){return t.promiseResolve()})).catch((function(e){return t.promiseReject(e)}))},t.defaultPageReady=function(){return e.CONFIG.typeset&&e.MathJax.typesetPromise?e.MathJax.typesetPromise(e.CONFIG.elements):Promise.resolve()},t.getComponents=f,t.makeMethods=d,t.makeTypesetMethods=m,t.makeOutputMethods=y,t.makeMmlMethods=g,t.makeResetMethod=b,t.getInputJax=v,t.getOutputJax=_,t.getAdaptor=S,t.getHandler=O,t.getDocument=M}(a=e.Startup||(e.Startup={})),e.MathJax=l.MathJax,void 0===e.MathJax._.startup&&((0,l.combineDefaults)(e.MathJax.config,"startup",{input:[],output:"",handler:null,adaptor:null,document:"undefined"==typeof document?"":document,elements:null,typeset:!0,ready:a.defaultReady.bind(a),pageReady:a.defaultPageReady.bind(a)}),(0,l.combineWithMathJax)({startup:a,options:{}}),e.MathJax.config.startup.invalidOption&&(u.OPTIONS.invalidOption=e.MathJax.config.startup.invalidOption),e.MathJax.config.startup.optionError&&(u.OPTIONS.optionError=e.MathJax.config.startup.optionError)),e.CONFIG=e.MathJax.config.startup;var p=0!==e.CONFIG.input.length},3282:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.VERSION=void 0,e.VERSION="3.2.2"},5009:function(t,e){var r=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractDOMAdaptor=void 0;var n=function(){function t(t){void 0===t&&(t=null),this.document=t}return t.prototype.node=function(t,e,n,o){var i,s;void 0===e&&(e={}),void 0===n&&(n=[]);var a=this.create(t,o);this.setAttributes(a,e);try{for(var l=r(n),c=l.next();!c.done;c=l.next()){var u=c.value;this.append(a,u)}}catch(t){i={error:t}}finally{try{c&&!c.done&&(s=l.return)&&s.call(l)}finally{if(i)throw i.error}}return a},t.prototype.setAttributes=function(t,e){var n,o,i,s,a,l;if(e.style&&"string"!=typeof e.style)try{for(var c=r(Object.keys(e.style)),u=c.next();!u.done;u=c.next()){var p=u.value;this.setStyle(t,p.replace(/-([a-z])/g,(function(t,e){return e.toUpperCase()})),e.style[p])}}catch(t){n={error:t}}finally{try{u&&!u.done&&(o=c.return)&&o.call(c)}finally{if(n)throw n.error}}if(e.properties)try{for(var h=r(Object.keys(e.properties)),f=h.next();!f.done;f=h.next()){t[p=f.value]=e.properties[p]}}catch(t){i={error:t}}finally{try{f&&!f.done&&(s=h.return)&&s.call(h)}finally{if(i)throw i.error}}try{for(var d=r(Object.keys(e)),m=d.next();!m.done;m=d.next()){"style"===(p=m.value)&&"string"!=typeof e.style||"properties"===p||this.setAttribute(t,p,e[p])}}catch(t){a={error:t}}finally{try{m&&!m.done&&(l=d.return)&&l.call(d)}finally{if(a)throw a.error}}},t.prototype.replace=function(t,e){return this.insert(t,e),this.remove(e),e},t.prototype.childNode=function(t,e){return this.childNodes(t)[e]},t.prototype.allClasses=function(t){var e=this.getAttribute(t,"class");return e?e.replace(/ +/g," ").replace(/^ /,"").replace(/ $/,"").split(/ /):[]},t}();e.AbstractDOMAdaptor=n},3494:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractFindMath=void 0;var n=r(7233),o=function(){function t(t){var e=this.constructor;this.options=(0,n.userOptions)((0,n.defaultOptions)({},e.OPTIONS),t)}return t.OPTIONS={},t}();e.AbstractFindMath=o},3670:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractHandler=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(r(5722).AbstractMathDocument),s=function(){function t(t,e){void 0===e&&(e=5),this.documentClass=i,this.adaptor=t,this.priority=e}return Object.defineProperty(t.prototype,"name",{get:function(){return this.constructor.NAME},enumerable:!1,configurable:!0}),t.prototype.handlesDocument=function(t){return!1},t.prototype.create=function(t,e){return new this.documentClass(t,this.adaptor,e)},t.NAME="generic",t}();e.AbstractHandler=s},805:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.HandlerList=void 0;var s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.register=function(t){return this.add(t,t.priority)},e.prototype.unregister=function(t){this.remove(t)},e.prototype.handlesDocument=function(t){var e,r;try{for(var n=i(this),o=n.next();!o.done;o=n.next()){var s=o.value.item;if(s.handlesDocument(t))return s}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}throw new Error("Can't find handler for document")},e.prototype.document=function(t,e){return void 0===e&&(e=null),this.handlesDocument(t).create(t,e)},e}(r(8666).PrioritizedList);e.HandlerList=s},9206:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractInputJax=void 0;var n=r(7233),o=r(7525),i=function(){function t(t){void 0===t&&(t={}),this.adaptor=null,this.mmlFactory=null;var e=this.constructor;this.options=(0,n.userOptions)((0,n.defaultOptions)({},e.OPTIONS),t),this.preFilters=new o.FunctionList,this.postFilters=new o.FunctionList}return Object.defineProperty(t.prototype,"name",{get:function(){return this.constructor.NAME},enumerable:!1,configurable:!0}),t.prototype.setAdaptor=function(t){this.adaptor=t},t.prototype.setMmlFactory=function(t){this.mmlFactory=t},t.prototype.initialize=function(){},t.prototype.reset=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e]},Object.defineProperty(t.prototype,"processStrings",{get:function(){return!0},enumerable:!1,configurable:!0}),t.prototype.findMath=function(t,e){return[]},t.prototype.executeFilters=function(t,e,r,n){var o={math:e,document:r,data:n};return t.execute(o),o.data},t.NAME="generic",t.OPTIONS={},t}();e.AbstractInputJax=i},5722:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractMathDocument=e.resetAllOptions=e.resetOptions=e.RenderList=void 0;var l=r(7233),c=r(9206),u=r(2975),p=r(9e3),h=r(4474),f=r(3909),d=r(6751),m=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.create=function(t){var e,r,n=new this;try{for(var o=i(Object.keys(t)),a=o.next();!a.done;a=o.next()){var l=a.value,c=s(this.action(l,t[l]),2),u=c[0],p=c[1];p&&n.add(u,p)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return n},e.action=function(t,e){var r,n,o,i,a,l,c=!0,u=e[0];if(1===e.length||"boolean"==typeof e[1])2===e.length&&(c=e[1]),a=(r=s(this.methodActions(t),2))[0],l=r[1];else if("string"==typeof e[1])if("string"==typeof e[2]){4===e.length&&(c=e[3]);var p=s(e.slice(1),2),h=p[0],f=p[1];a=(n=s(this.methodActions(h,f),2))[0],l=n[1]}else 3===e.length&&(c=e[2]),a=(o=s(this.methodActions(e[1]),2))[0],l=o[1];else 4===e.length&&(c=e[3]),a=(i=s(e.slice(1),2))[0],l=i[1];return[{id:t,renderDoc:a,renderMath:l,convert:c},u]},e.methodActions=function(t,e){return void 0===e&&(e=t),[function(e){return t&&e[t](),!1},function(t,r){return e&&t[e](r),!1}]},e.prototype.renderDoc=function(t,e){var r,n;void 0===e&&(e=h.STATE.UNPROCESSED);try{for(var o=i(this.items),s=o.next();!s.done;s=o.next()){var a=s.value;if(a.priority>=e&&a.item.renderDoc(t))return}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.renderMath=function(t,e,r){var n,o;void 0===r&&(r=h.STATE.UNPROCESSED);try{for(var s=i(this.items),a=s.next();!a.done;a=s.next()){var l=a.value;if(l.priority>=r&&l.item.renderMath(t,e))return}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}},e.prototype.renderConvert=function(t,e,r){var n,o;void 0===r&&(r=h.STATE.LAST);try{for(var s=i(this.items),a=s.next();!a.done;a=s.next()){var l=a.value;if(l.priority>r)return;if(l.item.convert&&l.item.renderMath(t,e))return}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}},e.prototype.findID=function(t){var e,r;try{for(var n=i(this.items),o=n.next();!o.done;o=n.next()){var s=o.value;if(s.item.id===t)return s.item}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return null},e}(r(8666).PrioritizedList);e.RenderList=m,e.resetOptions={all:!1,processed:!1,inputJax:null,outputJax:null},e.resetAllOptions={all:!0,processed:!0,inputJax:[],outputJax:[]};var y=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.compile=function(t){return null},e}(c.AbstractInputJax),g=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.typeset=function(t,e){return void 0===e&&(e=null),null},e.prototype.escaped=function(t,e){return null},e}(u.AbstractOutputJax),b=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(p.AbstractMathList),v=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(h.AbstractMathItem),_=function(){function t(e,r,n){var o=this,i=this.constructor;this.document=e,this.options=(0,l.userOptions)((0,l.defaultOptions)({},i.OPTIONS),n),this.math=new(this.options.MathList||b),this.renderActions=m.create(this.options.renderActions),this.processed=new t.ProcessBits,this.outputJax=this.options.OutputJax||new g;var s=this.options.InputJax||[new y];Array.isArray(s)||(s=[s]),this.inputJax=s,this.adaptor=r,this.outputJax.setAdaptor(r),this.inputJax.map((function(t){return t.setAdaptor(r)})),this.mmlFactory=this.options.MmlFactory||new f.MmlFactory,this.inputJax.map((function(t){return t.setMmlFactory(o.mmlFactory)})),this.outputJax.initialize(),this.inputJax.map((function(t){return t.initialize()}))}return Object.defineProperty(t.prototype,"kind",{get:function(){return this.constructor.KIND},enumerable:!1,configurable:!0}),t.prototype.addRenderAction=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];var n=s(m.action(t,e),2),o=n[0],i=n[1];this.renderActions.add(o,i)},t.prototype.removeRenderAction=function(t){var e=this.renderActions.findID(t);e&&this.renderActions.remove(e)},t.prototype.render=function(){return this.renderActions.renderDoc(this),this},t.prototype.rerender=function(t){return void 0===t&&(t=h.STATE.RERENDER),this.state(t-1),this.render(),this},t.prototype.convert=function(t,e){void 0===e&&(e={});var r=(0,l.userOptions)({format:this.inputJax[0].name,display:!0,end:h.STATE.LAST,em:16,ex:8,containerWidth:null,lineWidth:1e6,scale:1,family:""},e),n=r.format,o=r.display,i=r.end,s=r.ex,a=r.em,c=r.containerWidth,u=r.lineWidth,p=r.scale,f=r.family;null===c&&(c=80*s);var d=this.inputJax.reduce((function(t,e){return e.name===n?e:t}),null),m=new this.options.MathItem(t,d,o);return m.start.node=this.adaptor.body(this.document),m.setMetrics(a,s,c,u,p),this.outputJax.options.mtextInheritFont&&(m.outputData.mtextFamily=f),this.outputJax.options.merrorInheritFont&&(m.outputData.merrorFamily=f),m.convert(this,i),m.typesetRoot||m.root},t.prototype.findMath=function(t){return void 0===t&&(t=null),this.processed.set("findMath"),this},t.prototype.compile=function(){var t,e,r,n;if(!this.processed.isSet("compile")){var o=[];try{for(var s=i(this.math),a=s.next();!a.done;a=s.next()){var l=a.value;this.compileMath(l),void 0!==l.inputData.recompile&&o.push(l)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=s.return)&&e.call(s)}finally{if(t)throw t.error}}try{for(var c=i(o),u=c.next();!u.done;u=c.next()){var p=(l=u.value).inputData.recompile;l.state(p.state),l.inputData.recompile=p,this.compileMath(l)}}catch(t){r={error:t}}finally{try{u&&!u.done&&(n=c.return)&&n.call(c)}finally{if(r)throw r.error}}this.processed.set("compile")}return this},t.prototype.compileMath=function(t){try{t.compile(this)}catch(e){if(e.retry||e.restart)throw e;this.options.compileError(this,t,e),t.inputData.error=e}},t.prototype.compileError=function(t,e){t.root=this.mmlFactory.create("math",null,[this.mmlFactory.create("merror",{"data-mjx-error":e.message,title:e.message},[this.mmlFactory.create("mtext",null,[this.mmlFactory.create("text").setText("Math input error")])])]),t.display&&t.root.attributes.set("display","block"),t.inputData.error=e.message},t.prototype.typeset=function(){var t,e;if(!this.processed.isSet("typeset")){try{for(var r=i(this.math),n=r.next();!n.done;n=r.next()){var o=n.value;try{o.typeset(this)}catch(t){if(t.retry||t.restart)throw t;this.options.typesetError(this,o,t),o.outputData.error=t}}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}this.processed.set("typeset")}return this},t.prototype.typesetError=function(t,e){t.typesetRoot=this.adaptor.node("mjx-container",{class:"MathJax mjx-output-error",jax:this.outputJax.name},[this.adaptor.node("span",{"data-mjx-error":e.message,title:e.message,style:{color:"red","background-color":"yellow","line-height":"normal"}},[this.adaptor.text("Math output error")])]),t.display&&this.adaptor.setAttributes(t.typesetRoot,{style:{display:"block",margin:"1em 0","text-align":"center"}}),t.outputData.error=e.message},t.prototype.getMetrics=function(){return this.processed.isSet("getMetrics")||(this.outputJax.getMetrics(this),this.processed.set("getMetrics")),this},t.prototype.updateDocument=function(){var t,e;if(!this.processed.isSet("updateDocument")){try{for(var r=i(this.math.reversed()),n=r.next();!n.done;n=r.next()){n.value.updateDocument(this)}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}this.processed.set("updateDocument")}return this},t.prototype.removeFromDocument=function(t){return void 0===t&&(t=!1),this},t.prototype.state=function(t,e){var r,n;void 0===e&&(e=!1);try{for(var o=i(this.math),s=o.next();!s.done;s=o.next()){s.value.state(t,e)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return t<h.STATE.INSERTED&&this.processed.clear("updateDocument"),t<h.STATE.TYPESET&&(this.processed.clear("typeset"),this.processed.clear("getMetrics")),t<h.STATE.COMPILED&&this.processed.clear("compile"),this},t.prototype.reset=function(t){var r;return void 0===t&&(t={processed:!0}),(t=(0,l.userOptions)(Object.assign({},e.resetOptions),t)).all&&Object.assign(t,e.resetAllOptions),t.processed&&this.processed.reset(),t.inputJax&&this.inputJax.forEach((function(e){return e.reset.apply(e,a([],s(t.inputJax),!1))})),t.outputJax&&(r=this.outputJax).reset.apply(r,a([],s(t.outputJax),!1)),this},t.prototype.clear=function(){return this.reset(),this.math.clear(),this},t.prototype.concat=function(t){return this.math.merge(t),this},t.prototype.clearMathItemsWithin=function(t){var e,r=this.getMathItemsWithin(t);return(e=this.math).remove.apply(e,a([],s(r),!1)),r},t.prototype.getMathItemsWithin=function(t){var e,r,n,o;Array.isArray(t)||(t=[t]);var s=this.adaptor,a=[],l=s.getElements(t,this.document);try{t:for(var c=i(this.math),u=c.next();!u.done;u=c.next()){var p=u.value;try{for(var h=(n=void 0,i(l)),f=h.next();!f.done;f=h.next()){var d=f.value;if(p.start.node&&s.contains(d,p.start.node)){a.push(p);continue t}}}catch(t){n={error:t}}finally{try{f&&!f.done&&(o=h.return)&&o.call(h)}finally{if(n)throw n.error}}}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}return a},t.KIND="MathDocument",t.OPTIONS={OutputJax:null,InputJax:null,MmlFactory:null,MathList:b,MathItem:v,compileError:function(t,e,r){t.compileError(e,r)},typesetError:function(t,e,r){t.typesetError(e,r)},renderActions:(0,l.expandable)({find:[h.STATE.FINDMATH,"findMath","",!1],compile:[h.STATE.COMPILED],metrics:[h.STATE.METRICS,"getMetrics","",!1],typeset:[h.STATE.TYPESET],update:[h.STATE.INSERTED,"updateDocument",!1]})},t.ProcessBits=(0,d.BitFieldClass)("findMath","compile","getMetrics","typeset","updateDocument"),t}();e.AbstractMathDocument=_},4474:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.newState=e.STATE=e.AbstractMathItem=e.protoItem=void 0,e.protoItem=function(t,e,r,n,o,i,s){return void 0===s&&(s=null),{open:t,math:e,close:r,n:n,start:{n:o},end:{n:i},display:s}};var r=function(){function t(t,r,n,o,i){void 0===n&&(n=!0),void 0===o&&(o={i:0,n:0,delim:""}),void 0===i&&(i={i:0,n:0,delim:""}),this.root=null,this.typesetRoot=null,this.metrics={},this.inputData={},this.outputData={},this._state=e.STATE.UNPROCESSED,this.math=t,this.inputJax=r,this.display=n,this.start=o,this.end=i,this.root=null,this.typesetRoot=null,this.metrics={},this.inputData={},this.outputData={}}return Object.defineProperty(t.prototype,"isEscaped",{get:function(){return null===this.display},enumerable:!1,configurable:!0}),t.prototype.render=function(t){t.renderActions.renderMath(this,t)},t.prototype.rerender=function(t,r){void 0===r&&(r=e.STATE.RERENDER),this.state()>=r&&this.state(r-1),t.renderActions.renderMath(this,t,r)},t.prototype.convert=function(t,r){void 0===r&&(r=e.STATE.LAST),t.renderActions.renderConvert(this,t,r)},t.prototype.compile=function(t){this.state()<e.STATE.COMPILED&&(this.root=this.inputJax.compile(this,t),this.state(e.STATE.COMPILED))},t.prototype.typeset=function(t){this.state()<e.STATE.TYPESET&&(this.typesetRoot=t.outputJax[this.isEscaped?"escaped":"typeset"](this,t),this.state(e.STATE.TYPESET))},t.prototype.updateDocument=function(t){},t.prototype.removeFromDocument=function(t){void 0===t&&(t=!1)},t.prototype.setMetrics=function(t,e,r,n,o){this.metrics={em:t,ex:e,containerWidth:r,lineWidth:n,scale:o}},t.prototype.state=function(t,r){return void 0===t&&(t=null),void 0===r&&(r=!1),null!=t&&(t<e.STATE.INSERTED&&this._state>=e.STATE.INSERTED&&this.removeFromDocument(r),t<e.STATE.TYPESET&&this._state>=e.STATE.TYPESET&&(this.outputData={}),t<e.STATE.COMPILED&&this._state>=e.STATE.COMPILED&&(this.inputData={}),this._state=t),this._state},t.prototype.reset=function(t){void 0===t&&(t=!1),this.state(e.STATE.UNPROCESSED,t)},t}();e.AbstractMathItem=r,e.STATE={UNPROCESSED:0,FINDMATH:10,COMPILED:20,CONVERT:100,METRICS:110,RERENDER:125,TYPESET:150,INSERTED:200,LAST:1e4},e.newState=function(t,r){if(t in e.STATE)throw Error("State "+t+" already exists");e.STATE[t]=r}},9e3:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractMathList=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.isBefore=function(t,e){return t.start.i<e.start.i||t.start.i===e.start.i&&t.start.n<e.start.n},e}(r(103).LinkedList);e.AbstractMathList=i},91:function(t,e){var r=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.Attributes=e.INHERIT=void 0,e.INHERIT="_inherit_";var n=function(){function t(t,e){this.global=e,this.defaults=Object.create(e),this.inherited=Object.create(this.defaults),this.attributes=Object.create(this.inherited),Object.assign(this.defaults,t)}return t.prototype.set=function(t,e){this.attributes[t]=e},t.prototype.setList=function(t){Object.assign(this.attributes,t)},t.prototype.get=function(t){var r=this.attributes[t];return r===e.INHERIT&&(r=this.global[t]),r},t.prototype.getExplicit=function(t){if(this.attributes.hasOwnProperty(t))return this.attributes[t]},t.prototype.getList=function(){for(var t,e,n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];var i={};try{for(var s=r(n),a=s.next();!a.done;a=s.next()){var l=a.value;i[l]=this.get(l)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=s.return)&&e.call(s)}finally{if(t)throw t.error}}return i},t.prototype.setInherited=function(t,e){this.inherited[t]=e},t.prototype.getInherited=function(t){return this.inherited[t]},t.prototype.getDefault=function(t){return this.defaults[t]},t.prototype.isSet=function(t){return this.attributes.hasOwnProperty(t)||this.inherited.hasOwnProperty(t)},t.prototype.hasDefault=function(t){return t in this.defaults},t.prototype.getExplicitNames=function(){return Object.keys(this.attributes)},t.prototype.getInheritedNames=function(){return Object.keys(this.inherited)},t.prototype.getDefaultNames=function(){return Object.keys(this.defaults)},t.prototype.getGlobalNames=function(){return Object.keys(this.global)},t.prototype.getAllAttributes=function(){return this.attributes},t.prototype.getAllInherited=function(){return this.inherited},t.prototype.getAllDefaults=function(){return this.defaults},t.prototype.getAllGlobals=function(){return this.global},t}();e.Attributes=n},6336:function(t,e,r){var n;Object.defineProperty(e,"__esModule",{value:!0}),e.MML=void 0;var o=r(9007),i=r(3233),s=r(450),a=r(3050),l=r(2756),c=r(4770),u=r(6030),p=r(7265),h=r(9878),f=r(6850),d=r(7131),m=r(6145),y=r(1314),g=r(1581),b=r(7238),v=r(5741),_=r(5410),S=r(6661),O=r(9145),M=r(4461),x=r(5184),E=r(6405),A=r(1349),C=r(5022),T=r(4359),N=r(142),w=r(7590),L=r(3985),I=r(9102),P=r(3948),R=r(1334);e.MML=((n={})[i.MmlMath.prototype.kind]=i.MmlMath,n[s.MmlMi.prototype.kind]=s.MmlMi,n[a.MmlMn.prototype.kind]=a.MmlMn,n[l.MmlMo.prototype.kind]=l.MmlMo,n[c.MmlMtext.prototype.kind]=c.MmlMtext,n[u.MmlMspace.prototype.kind]=u.MmlMspace,n[p.MmlMs.prototype.kind]=p.MmlMs,n[h.MmlMrow.prototype.kind]=h.MmlMrow,n[h.MmlInferredMrow.prototype.kind]=h.MmlInferredMrow,n[f.MmlMfrac.prototype.kind]=f.MmlMfrac,n[d.MmlMsqrt.prototype.kind]=d.MmlMsqrt,n[m.MmlMroot.prototype.kind]=m.MmlMroot,n[y.MmlMstyle.prototype.kind]=y.MmlMstyle,n[g.MmlMerror.prototype.kind]=g.MmlMerror,n[b.MmlMpadded.prototype.kind]=b.MmlMpadded,n[v.MmlMphantom.prototype.kind]=v.MmlMphantom,n[_.MmlMfenced.prototype.kind]=_.MmlMfenced,n[S.MmlMenclose.prototype.kind]=S.MmlMenclose,n[O.MmlMaction.prototype.kind]=O.MmlMaction,n[M.MmlMsub.prototype.kind]=M.MmlMsub,n[M.MmlMsup.prototype.kind]=M.MmlMsup,n[M.MmlMsubsup.prototype.kind]=M.MmlMsubsup,n[x.MmlMunder.prototype.kind]=x.MmlMunder,n[x.MmlMover.prototype.kind]=x.MmlMover,n[x.MmlMunderover.prototype.kind]=x.MmlMunderover,n[E.MmlMmultiscripts.prototype.kind]=E.MmlMmultiscripts,n[E.MmlMprescripts.prototype.kind]=E.MmlMprescripts,n[E.MmlNone.prototype.kind]=E.MmlNone,n[A.MmlMtable.prototype.kind]=A.MmlMtable,n[C.MmlMlabeledtr.prototype.kind]=C.MmlMlabeledtr,n[C.MmlMtr.prototype.kind]=C.MmlMtr,n[T.MmlMtd.prototype.kind]=T.MmlMtd,n[N.MmlMaligngroup.prototype.kind]=N.MmlMaligngroup,n[w.MmlMalignmark.prototype.kind]=w.MmlMalignmark,n[L.MmlMglyph.prototype.kind]=L.MmlMglyph,n[I.MmlSemantics.prototype.kind]=I.MmlSemantics,n[I.MmlAnnotation.prototype.kind]=I.MmlAnnotation,n[I.MmlAnnotationXML.prototype.kind]=I.MmlAnnotationXML,n[P.TeXAtom.prototype.kind]=P.TeXAtom,n[R.MathChoice.prototype.kind]=R.MathChoice,n[o.TextNode.prototype.kind]=o.TextNode,n[o.XMLNode.prototype.kind]=o.XMLNode,n)},1759:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MathMLVisitor=void 0;var s=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.document=null,e}return o(e,t),e.prototype.visitTree=function(t,e){this.document=e;var r=e.createElement("top");return this.visitNode(t,r),this.document=null,r.firstChild},e.prototype.visitTextNode=function(t,e){e.appendChild(this.document.createTextNode(t.getText()))},e.prototype.visitXMLNode=function(t,e){e.appendChild(t.getXML().cloneNode(!0))},e.prototype.visitInferredMrowNode=function(t,e){var r,n;try{for(var o=i(t.childNodes),s=o.next();!s.done;s=o.next()){var a=s.value;this.visitNode(a,e)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.visitDefault=function(t,e){var r,n,o=this.document.createElement(t.kind);this.addAttributes(t,o);try{for(var s=i(t.childNodes),a=s.next();!a.done;a=s.next()){var l=a.value;this.visitNode(l,o)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}e.appendChild(o)},e.prototype.addAttributes=function(t,e){var r,n,o=t.attributes,s=o.getExplicitNames();try{for(var a=i(s),l=a.next();!l.done;l=a.next()){var c=l.value;e.setAttribute(c,o.getExplicit(c).toString())}}catch(t){r={error:t}}finally{try{l&&!l.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}},e}(r(6325).MmlVisitor);e.MathMLVisitor=s},3909:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.MmlFactory=void 0;var i=r(7860),s=r(6336),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"MML",{get:function(){return this.node},enumerable:!1,configurable:!0}),e.defaultNodes=s.MML,e}(i.AbstractNodeFactory);e.MmlFactory=a},9007:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.XMLNode=e.TextNode=e.AbstractMmlEmptyNode=e.AbstractMmlBaseNode=e.AbstractMmlLayoutNode=e.AbstractMmlTokenNode=e.AbstractMmlNode=e.indentAttributes=e.TEXCLASSNAMES=e.TEXCLASS=void 0;var l=r(91),c=r(4596);e.TEXCLASS={ORD:0,OP:1,BIN:2,REL:3,OPEN:4,CLOSE:5,PUNCT:6,INNER:7,VCENTER:8,NONE:-1},e.TEXCLASSNAMES=["ORD","OP","BIN","REL","OPEN","CLOSE","PUNCT","INNER","VCENTER"];var u=["","thinmathspace","mediummathspace","thickmathspace"],p=[[0,-1,2,3,0,0,0,1],[-1,-1,0,3,0,0,0,1],[2,2,0,0,2,0,0,2],[3,3,0,0,3,0,0,3],[0,0,0,0,0,0,0,0],[0,-1,2,3,0,0,0,1],[1,1,0,1,1,1,1,1],[1,-1,2,3,1,0,1,1]];e.indentAttributes=["indentalign","indentalignfirst","indentshift","indentshiftfirst"];var h=function(t){function r(e,r,n){void 0===r&&(r={}),void 0===n&&(n=[]);var o=t.call(this,e)||this;return o.prevClass=null,o.prevLevel=null,o.texclass=null,o.arity<0&&(o.childNodes=[e.create("inferredMrow")],o.childNodes[0].parent=o),o.setChildren(n),o.attributes=new l.Attributes(e.getNodeClass(o.kind).defaults,e.getNodeClass("math").defaults),o.attributes.setList(r),o}return o(r,t),r.prototype.copy=function(t){var e,r,n,o;void 0===t&&(t=!1);var a=this.factory.create(this.kind);if(a.properties=i({},this.properties),this.attributes){var l=this.attributes.getAllAttributes();try{for(var c=s(Object.keys(l)),u=c.next();!u.done;u=c.next()){var p=u.value;("id"!==p||t)&&a.attributes.set(p,l[p])}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}}if(this.childNodes&&this.childNodes.length){var h=this.childNodes;1===h.length&&h[0].isInferred&&(h=h[0].childNodes);try{for(var f=s(h),d=f.next();!d.done;d=f.next()){var m=d.value;m?a.appendChild(m.copy()):a.childNodes.push(null)}}catch(t){n={error:t}}finally{try{d&&!d.done&&(o=f.return)&&o.call(f)}finally{if(n)throw n.error}}}return a},Object.defineProperty(r.prototype,"texClass",{get:function(){return this.texclass},set:function(t){this.texclass=t},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isToken",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isEmbellished",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isSpacelike",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"linebreakContainer",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"hasNewLine",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"arity",{get:function(){return 1/0},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isInferred",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"Parent",{get:function(){for(var t=this.parent;t&&t.notParent;)t=t.Parent;return t},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"notParent",{get:function(){return!1},enumerable:!1,configurable:!0}),r.prototype.setChildren=function(e){return this.arity<0?this.childNodes[0].setChildren(e):t.prototype.setChildren.call(this,e)},r.prototype.appendChild=function(e){var r,n,o=this;if(this.arity<0)return this.childNodes[0].appendChild(e),e;if(e.isInferred){if(this.arity===1/0)return e.childNodes.forEach((function(e){return t.prototype.appendChild.call(o,e)})),e;var i=e;(e=this.factory.create("mrow")).setChildren(i.childNodes),e.attributes=i.attributes;try{for(var a=s(i.getPropertyNames()),l=a.next();!l.done;l=a.next()){var c=l.value;e.setProperty(c,i.getProperty(c))}}catch(t){r={error:t}}finally{try{l&&!l.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}}return t.prototype.appendChild.call(this,e)},r.prototype.replaceChild=function(e,r){return this.arity<0?(this.childNodes[0].replaceChild(e,r),e):t.prototype.replaceChild.call(this,e,r)},r.prototype.core=function(){return this},r.prototype.coreMO=function(){return this},r.prototype.coreIndex=function(){return 0},r.prototype.childPosition=function(){for(var t,e,r=this,n=r.parent;n&&n.notParent;)r=n,n=n.parent;if(n){var o=0;try{for(var i=s(n.childNodes),a=i.next();!a.done;a=i.next()){if(a.value===r)return o;o++}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=i.return)&&e.call(i)}finally{if(t)throw t.error}}}return null},r.prototype.setTeXclass=function(t){return this.getPrevClass(t),null!=this.texClass?this:t},r.prototype.updateTeXclass=function(t){t&&(this.prevClass=t.prevClass,this.prevLevel=t.prevLevel,t.prevClass=t.prevLevel=null,this.texClass=t.texClass)},r.prototype.getPrevClass=function(t){t&&(this.prevClass=t.texClass,this.prevLevel=t.attributes.get("scriptlevel"))},r.prototype.texSpacing=function(){var t=null!=this.prevClass?this.prevClass:e.TEXCLASS.NONE,r=this.texClass||e.TEXCLASS.ORD;if(t===e.TEXCLASS.NONE||r===e.TEXCLASS.NONE)return"";t===e.TEXCLASS.VCENTER&&(t=e.TEXCLASS.ORD),r===e.TEXCLASS.VCENTER&&(r=e.TEXCLASS.ORD);var n=p[t][r];return(this.prevLevel>0||this.attributes.get("scriptlevel")>0)&&n>=0?"":u[Math.abs(n)]},r.prototype.hasSpacingAttributes=function(){return this.isEmbellished&&this.coreMO().hasSpacingAttributes()},r.prototype.setInheritedAttributes=function(t,e,n,o){var i,l;void 0===t&&(t={}),void 0===e&&(e=!1),void 0===n&&(n=0),void 0===o&&(o=!1);var c=this.attributes.getAllDefaults();try{for(var u=s(Object.keys(t)),p=u.next();!p.done;p=u.next()){var h=p.value;if(c.hasOwnProperty(h)||r.alwaysInherit.hasOwnProperty(h)){var f=a(t[h],2),d=f[0],m=f[1];((r.noInherit[d]||{})[this.kind]||{})[h]||this.attributes.setInherited(h,m)}}}catch(t){i={error:t}}finally{try{p&&!p.done&&(l=u.return)&&l.call(u)}finally{if(i)throw i.error}}void 0===this.attributes.getExplicit("displaystyle")&&this.attributes.setInherited("displaystyle",e),void 0===this.attributes.getExplicit("scriptlevel")&&this.attributes.setInherited("scriptlevel",n),o&&this.setProperty("texprimestyle",o);var y=this.arity;if(y>=0&&y!==1/0&&(1===y&&0===this.childNodes.length||1!==y&&this.childNodes.length!==y))if(y<this.childNodes.length)this.childNodes=this.childNodes.slice(0,y);else for(;this.childNodes.length<y;)this.appendChild(this.factory.create("mrow"));this.setChildInheritedAttributes(t,e,n,o)},r.prototype.setChildInheritedAttributes=function(t,e,r,n){var o,i;try{for(var a=s(this.childNodes),l=a.next();!l.done;l=a.next()){l.value.setInheritedAttributes(t,e,r,n)}}catch(t){o={error:t}}finally{try{l&&!l.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}},r.prototype.addInheritedAttributes=function(t,e){var r,n,o=i({},t);try{for(var a=s(Object.keys(e)),l=a.next();!l.done;l=a.next()){var c=l.value;"displaystyle"!==c&&"scriptlevel"!==c&&"style"!==c&&(o[c]=[this.kind,e[c]])}}catch(t){r={error:t}}finally{try{l&&!l.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return o},r.prototype.inheritAttributesFrom=function(t){var e=t.attributes,r=e.get("displaystyle"),n=e.get("scriptlevel"),o=e.isSet("mathsize")?{mathsize:["math",e.get("mathsize")]}:{},i=t.getProperty("texprimestyle")||!1;this.setInheritedAttributes(o,r,n,i)},r.prototype.verifyTree=function(t){if(void 0===t&&(t=null),null!==t){this.verifyAttributes(t);var e=this.arity;t.checkArity&&e>=0&&e!==1/0&&(1===e&&0===this.childNodes.length||1!==e&&this.childNodes.length!==e)&&this.mError('Wrong number of children for "'+this.kind+'" node',t,!0),this.verifyChildren(t)}},r.prototype.verifyAttributes=function(t){var e,r;if(t.checkAttributes){var n=this.attributes,o=[];try{for(var i=s(n.getExplicitNames()),a=i.next();!a.done;a=i.next()){var l=a.value;"data-"===l.substr(0,5)||void 0!==n.getDefault(l)||l.match(/^(?:class|style|id|(?:xlink:)?href)$/)||o.push(l)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}o.length&&this.mError("Unknown attributes for "+this.kind+" node: "+o.join(", "),t)}},r.prototype.verifyChildren=function(t){var e,r;try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.verifyTree(t)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},r.prototype.mError=function(t,e,r){if(void 0===r&&(r=!1),this.parent&&this.parent.isKind("merror"))return null;var n=this.factory.create("merror");if(n.attributes.set("data-mjx-message",t),e.fullErrors||r){var o=this.factory.create("mtext"),i=this.factory.create("text");i.setText(e.fullErrors?t:this.kind),o.appendChild(i),n.appendChild(o),this.parent.replaceChild(n,this)}else this.parent.replaceChild(n,this),n.appendChild(this);return n},r.defaults={mathbackground:l.INHERIT,mathcolor:l.INHERIT,mathsize:l.INHERIT,dir:l.INHERIT},r.noInherit={mstyle:{mpadded:{width:!0,height:!0,depth:!0,lspace:!0,voffset:!0},mtable:{width:!0,height:!0,depth:!0,align:!0}},maligngroup:{mrow:{groupalign:!0},mtable:{groupalign:!0}}},r.alwaysInherit={scriptminsize:!0,scriptsizemultiplier:!0},r.verifyDefaults={checkArity:!0,checkAttributes:!1,fullErrors:!1,fixMmultiscripts:!0,fixMtables:!0},r}(c.AbstractNode);e.AbstractMmlNode=h;var f=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"isToken",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.getText=function(){var t,e,r="";try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){var i=o.value;i instanceof g&&(r+=i.getText())}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o,i;try{for(var a=s(this.childNodes),l=a.next();!l.done;l=a.next()){var c=l.value;c instanceof h&&c.setInheritedAttributes(t,e,r,n)}}catch(t){o={error:t}}finally{try{l&&!l.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}},e.prototype.walkTree=function(t,e){var r,n;t(this,e);try{for(var o=s(this.childNodes),i=o.next();!i.done;i=o.next()){var a=i.value;a instanceof h&&a.walkTree(t,e)}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return e},e.defaults=i(i({},h.defaults),{mathvariant:"normal",mathsize:l.INHERIT}),e}(h);e.AbstractMmlTokenNode=f;var d=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){return this.childNodes[0].isSpacelike},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isEmbellished",{get:function(){return this.childNodes[0].isEmbellished},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return-1},enumerable:!1,configurable:!0}),e.prototype.core=function(){return this.childNodes[0]},e.prototype.coreMO=function(){return this.childNodes[0].coreMO()},e.prototype.setTeXclass=function(t){return t=this.childNodes[0].setTeXclass(t),this.updateTeXclass(this.childNodes[0]),t},e.defaults=h.defaults,e}(h);e.AbstractMmlLayoutNode=d;var m=function(t){function r(){return null!==t&&t.apply(this,arguments)||this}return o(r,t),Object.defineProperty(r.prototype,"isEmbellished",{get:function(){return this.childNodes[0].isEmbellished},enumerable:!1,configurable:!0}),r.prototype.core=function(){return this.childNodes[0]},r.prototype.coreMO=function(){return this.childNodes[0].coreMO()},r.prototype.setTeXclass=function(t){var r,n;this.getPrevClass(t),this.texClass=e.TEXCLASS.ORD;var o=this.childNodes[0];o?this.isEmbellished||o.isKind("mi")?(t=o.setTeXclass(t),this.updateTeXclass(this.core())):(o.setTeXclass(null),t=this):t=this;try{for(var i=s(this.childNodes.slice(1)),a=i.next();!a.done;a=i.next()){var l=a.value;l&&l.setTeXclass(null)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return t},r.defaults=h.defaults,r}(h);e.AbstractMmlBaseNode=m;var y=function(t){function r(){return null!==t&&t.apply(this,arguments)||this}return o(r,t),Object.defineProperty(r.prototype,"isToken",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isEmbellished",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isSpacelike",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"linebreakContainer",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"hasNewLine",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"arity",{get:function(){return 0},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isInferred",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"notParent",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"Parent",{get:function(){return this.parent},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"texClass",{get:function(){return e.TEXCLASS.NONE},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"prevClass",{get:function(){return e.TEXCLASS.NONE},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"prevLevel",{get:function(){return 0},enumerable:!1,configurable:!0}),r.prototype.hasSpacingAttributes=function(){return!1},Object.defineProperty(r.prototype,"attributes",{get:function(){return null},enumerable:!1,configurable:!0}),r.prototype.core=function(){return this},r.prototype.coreMO=function(){return this},r.prototype.coreIndex=function(){return 0},r.prototype.childPosition=function(){return 0},r.prototype.setTeXclass=function(t){return t},r.prototype.texSpacing=function(){return""},r.prototype.setInheritedAttributes=function(t,e,r,n){},r.prototype.inheritAttributesFrom=function(t){},r.prototype.verifyTree=function(t){},r.prototype.mError=function(t,e,r){return void 0===r&&(r=!1),null},r}(c.AbstractEmptyNode);e.AbstractMmlEmptyNode=y;var g=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.text="",e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"text"},enumerable:!1,configurable:!0}),e.prototype.getText=function(){return this.text},e.prototype.setText=function(t){return this.text=t,this},e.prototype.copy=function(){return this.factory.create(this.kind).setText(this.getText())},e.prototype.toString=function(){return this.text},e}(y);e.TextNode=g;var b=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.xml=null,e.adaptor=null,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"XML"},enumerable:!1,configurable:!0}),e.prototype.getXML=function(){return this.xml},e.prototype.setXML=function(t,e){return void 0===e&&(e=null),this.xml=t,this.adaptor=e,this},e.prototype.getSerializedXML=function(){return this.adaptor.serializeXML(this.xml)},e.prototype.copy=function(){return this.factory.create(this.kind).setXML(this.adaptor.clone(this.xml))},e.prototype.toString=function(){return"XML data"},e}(y);e.XMLNode=b},3948:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.TeXAtom=void 0;var s=r(9007),a=r(2756),l=function(t){function e(e,r,n){var o=t.call(this,e,r,n)||this;return o.texclass=s.TEXCLASS.ORD,o.setProperty("texClass",o.texClass),o}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"TeXAtom"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return-1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"notParent",{get:function(){return this.childNodes[0]&&1===this.childNodes[0].childNodes.length},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){return this.childNodes[0].setTeXclass(null),this.adjustTeXclass(t)},e.prototype.adjustTeXclass=function(t){return t},e.defaults=i({},s.AbstractMmlBaseNode.defaults),e}(s.AbstractMmlBaseNode);e.TeXAtom=l,l.prototype.adjustTeXclass=a.MmlMo.prototype.adjustTeXclass},9145:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMaction=void 0;var s=r(9007),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"maction"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){var t=this.attributes.get("selection"),e=Math.max(1,Math.min(this.childNodes.length,t))-1;return this.childNodes[e]||this.factory.create("mrow")},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isEmbellished",{get:function(){return this.selected.isEmbellished},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){return this.selected.isSpacelike},enumerable:!1,configurable:!0}),e.prototype.core=function(){return this.selected.core()},e.prototype.coreMO=function(){return this.selected.coreMO()},e.prototype.verifyAttributes=function(e){(t.prototype.verifyAttributes.call(this,e),"toggle"!==this.attributes.get("actiontype")&&void 0!==this.attributes.getExplicit("selection"))&&delete this.attributes.getAllAttributes().selection},e.prototype.setTeXclass=function(t){"tooltip"===this.attributes.get("actiontype")&&this.childNodes[1]&&this.childNodes[1].setTeXclass(null);var e=this.selected;return t=e.setTeXclass(t),this.updateTeXclass(e),t},e.prototype.nextToggleSelection=function(){var t=Math.max(1,this.attributes.get("selection")+1);t>this.childNodes.length&&(t=1),this.attributes.set("selection",t)},e.defaults=i(i({},s.AbstractMmlNode.defaults),{actiontype:"toggle",selection:1}),e}(s.AbstractMmlNode);e.MmlMaction=a},142:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMaligngroup=void 0;var s=r(9007),a=r(91),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"maligngroup"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setChildInheritedAttributes=function(e,r,n,o){e=this.addInheritedAttributes(e,this.attributes.getAllAttributes()),t.prototype.setChildInheritedAttributes.call(this,e,r,n,o)},e.defaults=i(i({},s.AbstractMmlLayoutNode.defaults),{groupalign:a.INHERIT}),e}(s.AbstractMmlLayoutNode);e.MmlMaligngroup=l},7590:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMalignmark=void 0;var s=r(9007),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"malignmark"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){return!0},enumerable:!1,configurable:!0}),e.defaults=i(i({},s.AbstractMmlNode.defaults),{edge:"left"}),e}(s.AbstractMmlNode);e.MmlMalignmark=a},3233:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMath=void 0;var s=r(9007),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"math"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setChildInheritedAttributes=function(e,r,n,o){"display"===this.attributes.get("mode")&&this.attributes.setInherited("display","block"),e=this.addInheritedAttributes(e,this.attributes.getAllAttributes()),r=!!this.attributes.get("displaystyle")||!this.attributes.get("displaystyle")&&"block"===this.attributes.get("display"),this.attributes.setInherited("displaystyle",r),n=this.attributes.get("scriptlevel")||this.constructor.defaults.scriptlevel,t.prototype.setChildInheritedAttributes.call(this,e,r,n,o)},e.defaults=i(i({},s.AbstractMmlLayoutNode.defaults),{mathvariant:"normal",mathsize:"normal",mathcolor:"",mathbackground:"transparent",dir:"ltr",scriptlevel:0,displaystyle:!1,display:"inline",maxwidth:"",overflow:"linebreak",altimg:"","altimg-width":"","altimg-height":"","altimg-valign":"",alttext:"",cdgroup:"",scriptsizemultiplier:1/Math.sqrt(2),scriptminsize:"8px",infixlinebreakstyle:"before",lineleading:"1ex",linebreakmultchar:"\u2062",indentshift:"auto",indentalign:"auto",indenttarget:"",indentalignfirst:"indentalign",indentshiftfirst:"indentshift",indentalignlast:"indentalign",indentshiftlast:"indentshift"}),e}(s.AbstractMmlLayoutNode);e.MmlMath=a},1334:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MathChoice=void 0;var s=r(9007),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"MathChoice"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 4},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"notParent",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setInheritedAttributes=function(t,e,r,n){var o=e?0:Math.max(0,Math.min(r,2))+1,i=this.childNodes[o]||this.factory.create("mrow");this.parent.replaceChild(i,this),i.setInheritedAttributes(t,e,r,n)},e.defaults=i({},s.AbstractMmlBaseNode.defaults),e}(s.AbstractMmlBaseNode);e.MathChoice=a},6661:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMenclose=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"menclose"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return-1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContininer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){return t=this.childNodes[0].setTeXclass(t),this.updateTeXclass(this.childNodes[0]),t},e.defaults=i(i({},s.AbstractMmlNode.defaults),{notation:"longdiv"}),e}(s.AbstractMmlNode);e.MmlMenclose=a},1581:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMerror=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"merror"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return-1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.defaults=i({},s.AbstractMmlNode.defaults),e}(s.AbstractMmlNode);e.MmlMerror=a},5410:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMfenced=void 0;var a=r(9007),l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=a.TEXCLASS.INNER,e.separators=[],e.open=null,e.close=null,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mfenced"},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){this.getPrevClass(t),this.open&&(t=this.open.setTeXclass(t)),this.childNodes[0]&&(t=this.childNodes[0].setTeXclass(t));for(var e=1,r=this.childNodes.length;e<r;e++)this.separators[e-1]&&(t=this.separators[e-1].setTeXclass(t)),this.childNodes[e]&&(t=this.childNodes[e].setTeXclass(t));return this.close&&(t=this.close.setTeXclass(t)),this.updateTeXclass(this.open),t},e.prototype.setChildInheritedAttributes=function(e,r,n,o){var i,a;this.addFakeNodes();try{for(var l=s([this.open,this.close].concat(this.separators)),c=l.next();!c.done;c=l.next()){var u=c.value;u&&u.setInheritedAttributes(e,r,n,o)}}catch(t){i={error:t}}finally{try{c&&!c.done&&(a=l.return)&&a.call(l)}finally{if(i)throw i.error}}t.prototype.setChildInheritedAttributes.call(this,e,r,n,o)},e.prototype.addFakeNodes=function(){var t,e,r=this.attributes.getList("open","close","separators"),n=r.open,o=r.close,i=r.separators;if(n=n.replace(/[ \t\n\r]/g,""),o=o.replace(/[ \t\n\r]/g,""),i=i.replace(/[ \t\n\r]/g,""),n&&(this.open=this.fakeNode(n,{fence:!0,form:"prefix"},a.TEXCLASS.OPEN)),i){for(;i.length<this.childNodes.length-1;)i+=i.charAt(i.length-1);var l=0;try{for(var c=s(this.childNodes.slice(1)),u=c.next();!u.done;u=c.next()){u.value&&this.separators.push(this.fakeNode(i.charAt(l++)))}}catch(e){t={error:e}}finally{try{u&&!u.done&&(e=c.return)&&e.call(c)}finally{if(t)throw t.error}}}o&&(this.close=this.fakeNode(o,{fence:!0,form:"postfix"},a.TEXCLASS.CLOSE))},e.prototype.fakeNode=function(t,e,r){void 0===e&&(e={}),void 0===r&&(r=null);var n=this.factory.create("text").setText(t),o=this.factory.create("mo",e,[n]);return o.texClass=r,o.parent=this,o},e.defaults=i(i({},a.AbstractMmlNode.defaults),{open:"(",close:")",separators:","}),e}(a.AbstractMmlNode);e.MmlMfenced=l},6850:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMfrac=void 0;var a=r(9007),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mfrac"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){var e,r;this.getPrevClass(t);try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.setTeXclass(null)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this},e.prototype.setChildInheritedAttributes=function(t,e,r,n){(!e||r>0)&&r++,this.childNodes[0].setInheritedAttributes(t,!1,r,n),this.childNodes[1].setInheritedAttributes(t,!1,r,!0)},e.defaults=i(i({},a.AbstractMmlBaseNode.defaults),{linethickness:"medium",numalign:"center",denomalign:"center",bevelled:!1}),e}(a.AbstractMmlBaseNode);e.MmlMfrac=l},3985:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMglyph=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mglyph"},enumerable:!1,configurable:!0}),e.prototype.verifyAttributes=function(e){var r=this.attributes.getList("src","fontfamily","index"),n=r.src,o=r.fontfamily,i=r.index;""!==n||""!==o&&""!==i?t.prototype.verifyAttributes.call(this,e):this.mError("mglyph must have either src or fontfamily and index attributes",e,!0)},e.defaults=i(i({},s.AbstractMmlTokenNode.defaults),{alt:"",src:"",index:"",width:"auto",height:"auto",valign:"0em"}),e}(s.AbstractMmlTokenNode);e.MmlMglyph=a},450:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMi=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mi"},enumerable:!1,configurable:!0}),e.prototype.setInheritedAttributes=function(r,n,o,i){void 0===r&&(r={}),void 0===n&&(n=!1),void 0===o&&(o=0),void 0===i&&(i=!1),t.prototype.setInheritedAttributes.call(this,r,n,o,i),this.getText().match(e.singleCharacter)&&!r.mathvariant&&this.attributes.setInherited("mathvariant","italic")},e.prototype.setTeXclass=function(t){this.getPrevClass(t);var r=this.getText();return r.length>1&&r.match(e.operatorName)&&"normal"===this.attributes.get("mathvariant")&&void 0===this.getProperty("autoOP")&&void 0===this.getProperty("texClass")&&(this.texClass=s.TEXCLASS.OP,this.setProperty("autoOP",!0)),this},e.defaults=i({},s.AbstractMmlTokenNode.defaults),e.operatorName=/^[a-z][a-z0-9]*$/i,e.singleCharacter=/^[\uD800-\uDBFF]?.[\u0300-\u036F\u1AB0-\u1ABE\u1DC0-\u1DFF\u20D0-\u20EF]*$/,e}(s.AbstractMmlTokenNode);e.MmlMi=a},6405:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlNone=e.MmlMprescripts=e.MmlMmultiscripts=void 0;var s=r(9007),a=r(4461),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mmultiscripts"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 1},enumerable:!1,configurable:!0}),e.prototype.setChildInheritedAttributes=function(t,e,r,n){this.childNodes[0].setInheritedAttributes(t,e,r,n);for(var o=!1,i=1,s=0;i<this.childNodes.length;i++){var a=this.childNodes[i];if(a.isKind("mprescripts")){if(!o&&(o=!0,i%2==0)){var l=this.factory.create("mrow");this.childNodes.splice(i,0,l),l.parent=this,i++}}else{var c=n||s%2==0;a.setInheritedAttributes(t,!1,r+1,c),s++}}this.childNodes.length%2==(o?1:0)&&(this.appendChild(this.factory.create("mrow")),this.childNodes[this.childNodes.length-1].setInheritedAttributes(t,!1,r+1,n))},e.prototype.verifyChildren=function(e){for(var r=!1,n=e.fixMmultiscripts,o=0;o<this.childNodes.length;o++){var i=this.childNodes[o];i.isKind("mprescripts")&&(r?i.mError(i.kind+" can only appear once in "+this.kind,e,!0):(r=!0,o%2!=0||n||this.mError("There must be an equal number of prescripts of each type",e)))}this.childNodes.length%2!=(r?1:0)||n||this.mError("There must be an equal number of scripts of each type",e),t.prototype.verifyChildren.call(this,e)},e.defaults=i({},a.MmlMsubsup.defaults),e}(a.MmlMsubsup);e.MmlMmultiscripts=l;var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mprescripts"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 0},enumerable:!1,configurable:!0}),e.prototype.verifyTree=function(e){t.prototype.verifyTree.call(this,e),this.parent&&!this.parent.isKind("mmultiscripts")&&this.mError(this.kind+" must be a child of mmultiscripts",e,!0)},e.defaults=i({},s.AbstractMmlNode.defaults),e}(s.AbstractMmlNode);e.MmlMprescripts=c;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"none"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 0},enumerable:!1,configurable:!0}),e.prototype.verifyTree=function(e){t.prototype.verifyTree.call(this,e),this.parent&&!this.parent.isKind("mmultiscripts")&&this.mError(this.kind+" must be a child of mmultiscripts",e,!0)},e.defaults=i({},s.AbstractMmlNode.defaults),e}(s.AbstractMmlNode);e.MmlNone=u},3050:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMn=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mn"},enumerable:!1,configurable:!0}),e.defaults=i({},s.AbstractMmlTokenNode.defaults),e}(s.AbstractMmlTokenNode);e.MmlMn=a},2756:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMo=void 0;var l=r(9007),c=r(4082),u=r(505),p=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._texClass=null,e.lspace=5/18,e.rspace=5/18,e}return o(e,t),Object.defineProperty(e.prototype,"texClass",{get:function(){if(null===this._texClass){var t=this.getText(),e=s(this.handleExplicitForm(this.getForms()),3),r=e[0],n=e[1],o=e[2],i=this.constructor.OPTABLE,a=i[r][t]||i[n][t]||i[o][t];return a?a[2]:l.TEXCLASS.REL}return this._texClass},set:function(t){this._texClass=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"kind",{get:function(){return"mo"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isEmbellished",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasNewLine",{get:function(){return"newline"===this.attributes.get("linebreak")},enumerable:!1,configurable:!0}),e.prototype.coreParent=function(){for(var t=this,e=this,r=this.factory.getNodeClass("math");e&&e.isEmbellished&&e.coreMO()===this&&!(e instanceof r);)t=e,e=e.parent;return t},e.prototype.coreText=function(t){if(!t)return"";if(t.isEmbellished)return t.coreMO().getText();for(;((t.isKind("mrow")||t.isKind("TeXAtom")&&t.texClass!==l.TEXCLASS.VCENTER||t.isKind("mstyle")||t.isKind("mphantom"))&&1===t.childNodes.length||t.isKind("munderover"))&&t.childNodes[0];)t=t.childNodes[0];return t.isToken?t.getText():""},e.prototype.hasSpacingAttributes=function(){return this.attributes.isSet("lspace")||this.attributes.isSet("rspace")},Object.defineProperty(e.prototype,"isAccent",{get:function(){var t=!1,e=this.coreParent().parent;if(e){var r=e.isKind("mover")?e.childNodes[e.over].coreMO()?"accent":"":e.isKind("munder")?e.childNodes[e.under].coreMO()?"accentunder":"":e.isKind("munderover")?this===e.childNodes[e.over].coreMO()?"accent":this===e.childNodes[e.under].coreMO()?"accentunder":"":"";if(r)t=void 0!==e.attributes.getExplicit(r)?t:this.attributes.get("accent")}return t},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){var e=this.attributes.getList("form","fence"),r=e.form,n=e.fence;return void 0===this.getProperty("texClass")&&(this.attributes.isSet("lspace")||this.attributes.isSet("rspace"))?null:(n&&this.texClass===l.TEXCLASS.REL&&("prefix"===r&&(this.texClass=l.TEXCLASS.OPEN),"postfix"===r&&(this.texClass=l.TEXCLASS.CLOSE)),this.adjustTeXclass(t))},e.prototype.adjustTeXclass=function(t){var e=this.texClass,r=this.prevClass;if(e===l.TEXCLASS.NONE)return t;if(t?(!t.getProperty("autoOP")||e!==l.TEXCLASS.BIN&&e!==l.TEXCLASS.REL||(r=t.texClass=l.TEXCLASS.ORD),r=this.prevClass=t.texClass||l.TEXCLASS.ORD,this.prevLevel=this.attributes.getInherited("scriptlevel")):r=this.prevClass=l.TEXCLASS.NONE,e!==l.TEXCLASS.BIN||r!==l.TEXCLASS.NONE&&r!==l.TEXCLASS.BIN&&r!==l.TEXCLASS.OP&&r!==l.TEXCLASS.REL&&r!==l.TEXCLASS.OPEN&&r!==l.TEXCLASS.PUNCT)if(r!==l.TEXCLASS.BIN||e!==l.TEXCLASS.REL&&e!==l.TEXCLASS.CLOSE&&e!==l.TEXCLASS.PUNCT){if(e===l.TEXCLASS.BIN){for(var n=this,o=this.parent;o&&o.parent&&o.isEmbellished&&(1===o.childNodes.length||!o.isKind("mrow")&&o.core()===n);)n=o,o=o.parent;o.childNodes[o.childNodes.length-1]===n&&(this.texClass=l.TEXCLASS.ORD)}}else t.texClass=this.prevClass=l.TEXCLASS.ORD;else this.texClass=l.TEXCLASS.ORD;return this},e.prototype.setInheritedAttributes=function(e,r,n,o){void 0===e&&(e={}),void 0===r&&(r=!1),void 0===n&&(n=0),void 0===o&&(o=!1),t.prototype.setInheritedAttributes.call(this,e,r,n,o);var i=this.getText();this.checkOperatorTable(i),this.checkPseudoScripts(i),this.checkPrimes(i),this.checkMathAccent(i)},e.prototype.checkOperatorTable=function(t){var e,r,n=s(this.handleExplicitForm(this.getForms()),3),o=n[0],i=n[1],l=n[2];this.attributes.setInherited("form",o);var u=this.constructor.OPTABLE,p=u[o][t]||u[i][t]||u[l][t];if(p){void 0===this.getProperty("texClass")&&(this.texClass=p[2]);try{for(var h=a(Object.keys(p[3]||{})),f=h.next();!f.done;f=h.next()){var d=f.value;this.attributes.setInherited(d,p[3][d])}}catch(t){e={error:t}}finally{try{f&&!f.done&&(r=h.return)&&r.call(h)}finally{if(e)throw e.error}}this.lspace=(p[0]+1)/18,this.rspace=(p[1]+1)/18}else{var m=(0,c.getRange)(t);if(m){void 0===this.getProperty("texClass")&&(this.texClass=m[2]);var y=this.constructor.MMLSPACING[m[2]];this.lspace=(y[0]+1)/18,this.rspace=(y[1]+1)/18}}},e.prototype.getForms=function(){for(var t=this,e=this.parent,r=this.Parent;r&&r.isEmbellished;)t=e,e=r.parent,r=r.Parent;if(e&&e.isKind("mrow")&&1!==e.nonSpaceLength()){if(e.firstNonSpace()===t)return["prefix","infix","postfix"];if(e.lastNonSpace()===t)return["postfix","infix","prefix"]}return["infix","prefix","postfix"]},e.prototype.handleExplicitForm=function(t){if(this.attributes.isSet("form")){var e=this.attributes.get("form");t=[e].concat(t.filter((function(t){return t!==e})))}return t},e.prototype.checkPseudoScripts=function(t){var e=this.constructor.pseudoScripts;if(t.match(e)){var r=this.coreParent().Parent,n=!r||!(r.isKind("msubsup")&&!r.isKind("msub"));this.setProperty("pseudoscript",n),n&&(this.attributes.setInherited("lspace",0),this.attributes.setInherited("rspace",0))}},e.prototype.checkPrimes=function(t){var e=this.constructor.primes;if(t.match(e)){var r=this.constructor.remapPrimes,n=(0,u.unicodeString)((0,u.unicodeChars)(t).map((function(t){return r[t]})));this.setProperty("primes",n)}},e.prototype.checkMathAccent=function(t){var e=this.Parent;if(void 0===this.getProperty("mathaccent")&&e&&e.isKind("munderover")){var r=e.childNodes[0];if(!r.isEmbellished||r.coreMO()!==this){var n=this.constructor.mathaccents;t.match(n)&&this.setProperty("mathaccent",!0)}}},e.defaults=i(i({},l.AbstractMmlTokenNode.defaults),{form:"infix",fence:!1,separator:!1,lspace:"thickmathspace",rspace:"thickmathspace",stretchy:!1,symmetric:!1,maxsize:"infinity",minsize:"0em",largeop:!1,movablelimits:!1,accent:!1,linebreak:"auto",lineleading:"1ex",linebreakstyle:"before",indentalign:"auto",indentshift:"0",indenttarget:"",indentalignfirst:"indentalign",indentshiftfirst:"indentshift",indentalignlast:"indentalign",indentshiftlast:"indentshift"}),e.MMLSPACING=c.MMLSPACING,e.OPTABLE=c.OPTABLE,e.pseudoScripts=new RegExp(["^[\"'*`","\xaa","\xb0","\xb2-\xb4","\xb9","\xba","\u2018-\u201f","\u2032-\u2037\u2057","\u2070\u2071","\u2074-\u207f","\u2080-\u208e","]+$"].join("")),e.primes=new RegExp(["^[\"'`","\u2018-\u201f","]+$"].join("")),e.remapPrimes={34:8243,39:8242,96:8245,8216:8245,8217:8242,8218:8242,8219:8245,8220:8246,8221:8243,8222:8243,8223:8246},e.mathaccents=new RegExp(["^[","\xb4\u0301\u02ca","`\u0300\u02cb","\xa8\u0308","~\u0303\u02dc","\xaf\u0304\u02c9","\u02d8\u0306","\u02c7\u030c","^\u0302\u02c6","\u2192\u20d7","\u02d9\u0307","\u02da\u030a","\u20db","\u20dc","]$"].join("")),e}(l.AbstractMmlTokenNode);e.MmlMo=p},7238:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMpadded=void 0;var s=r(9007),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mpadded"},enumerable:!1,configurable:!0}),e.defaults=i(i({},s.AbstractMmlLayoutNode.defaults),{width:"",height:"",depth:"",lspace:0,voffset:0}),e}(s.AbstractMmlLayoutNode);e.MmlMpadded=a},5741:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMphantom=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mphantom"},enumerable:!1,configurable:!0}),e.defaults=i({},s.AbstractMmlLayoutNode.defaults),e}(s.AbstractMmlLayoutNode);e.MmlMphantom=a},6145:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMroot=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mroot"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 2},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){return this.getPrevClass(t),this.childNodes[0].setTeXclass(null),this.childNodes[1].setTeXclass(null),this},e.prototype.setChildInheritedAttributes=function(t,e,r,n){this.childNodes[0].setInheritedAttributes(t,e,r,!0),this.childNodes[1].setInheritedAttributes(t,!1,r+2,n)},e.defaults=i({},s.AbstractMmlNode.defaults),e}(s.AbstractMmlNode);e.MmlMroot=a},9878:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlInferredMrow=e.MmlMrow=void 0;var a=r(9007),l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._core=null,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mrow"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){var t,e;try{for(var r=s(this.childNodes),n=r.next();!n.done;n=r.next()){if(!n.value.isSpacelike)return!1}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isEmbellished",{get:function(){var t,e,r=!1,n=0;try{for(var o=s(this.childNodes),i=o.next();!i.done;i=o.next()){var a=i.value;if(a)if(a.isEmbellished){if(r)return!1;r=!0,this._core=n}else if(!a.isSpacelike)return!1;n++}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r},enumerable:!1,configurable:!0}),e.prototype.core=function(){return this.isEmbellished&&null!=this._core?this.childNodes[this._core]:this},e.prototype.coreMO=function(){return this.isEmbellished&&null!=this._core?this.childNodes[this._core].coreMO():this},e.prototype.nonSpaceLength=function(){var t,e,r=0;try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){var i=o.value;i&&!i.isSpacelike&&r++}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},e.prototype.firstNonSpace=function(){var t,e;try{for(var r=s(this.childNodes),n=r.next();!n.done;n=r.next()){var o=n.value;if(o&&!o.isSpacelike)return o}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}return null},e.prototype.lastNonSpace=function(){for(var t=this.childNodes.length;--t>=0;){var e=this.childNodes[t];if(e&&!e.isSpacelike)return e}return null},e.prototype.setTeXclass=function(t){var e,r,n,o;if(null!=this.getProperty("open")||null!=this.getProperty("close")){this.getPrevClass(t),t=null;try{for(var i=s(this.childNodes),l=i.next();!l.done;l=i.next()){t=l.value.setTeXclass(t)}}catch(t){e={error:t}}finally{try{l&&!l.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}null==this.texClass&&(this.texClass=a.TEXCLASS.INNER)}else{try{for(var c=s(this.childNodes),u=c.next();!u.done;u=c.next()){t=u.value.setTeXclass(t)}}catch(t){n={error:t}}finally{try{u&&!u.done&&(o=c.return)&&o.call(c)}finally{if(n)throw n.error}}this.childNodes[0]&&this.updateTeXclass(this.childNodes[0])}return t},e.defaults=i({},a.AbstractMmlNode.defaults),e}(a.AbstractMmlNode);e.MmlMrow=l;var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"inferredMrow"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isInferred",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"notParent",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return"["+this.childNodes.join(",")+"]"},e.defaults=l.defaults,e}(l);e.MmlInferredMrow=c},7265:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMs=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"ms"},enumerable:!1,configurable:!0}),e.defaults=i(i({},s.AbstractMmlTokenNode.defaults),{lquote:'"',rquote:'"'}),e}(s.AbstractMmlTokenNode);e.MmlMs=a},6030:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMspace=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.NONE,e}return o(e,t),e.prototype.setTeXclass=function(t){return t},Object.defineProperty(e.prototype,"kind",{get:function(){return"mspace"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasNewline",{get:function(){var t=this.attributes;return null==t.getExplicit("width")&&null==t.getExplicit("height")&&null==t.getExplicit("depth")&&"newline"===t.get("linebreak")},enumerable:!1,configurable:!0}),e.defaults=i(i({},s.AbstractMmlTokenNode.defaults),{width:"0em",height:"0ex",depth:"0ex",linebreak:"auto"}),e}(s.AbstractMmlTokenNode);e.MmlMspace=a},7131:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMsqrt=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"msqrt"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return-1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){return this.getPrevClass(t),this.childNodes[0].setTeXclass(null),this},e.prototype.setChildInheritedAttributes=function(t,e,r,n){this.childNodes[0].setInheritedAttributes(t,e,r,!0)},e.defaults=i({},s.AbstractMmlNode.defaults),e}(s.AbstractMmlNode);e.MmlMsqrt=a},1314:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMstyle=void 0;var s=r(9007),a=r(91),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mstyle"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"notParent",{get:function(){return this.childNodes[0]&&1===this.childNodes[0].childNodes.length},enumerable:!1,configurable:!0}),e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o=this.attributes.getExplicit("scriptlevel");null!=o&&((o=o.toString()).match(/^\s*[-+]/)?r+=parseInt(o):r=parseInt(o),n=!1);var i=this.attributes.getExplicit("displaystyle");null!=i&&(e=!0===i,n=!1);var s=this.attributes.getExplicit("data-cramped");null!=s&&(n=s),t=this.addInheritedAttributes(t,this.attributes.getAllAttributes()),this.childNodes[0].setInheritedAttributes(t,e,r,n)},e.defaults=i(i({},s.AbstractMmlLayoutNode.defaults),{scriptlevel:a.INHERIT,displaystyle:a.INHERIT,scriptsizemultiplier:1/Math.sqrt(2),scriptminsize:"8px",mathbackground:a.INHERIT,mathcolor:a.INHERIT,dir:a.INHERIT,infixlinebreakstyle:"before"}),e}(s.AbstractMmlLayoutNode);e.MmlMstyle=l},4461:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMsup=e.MmlMsub=e.MmlMsubsup=void 0;var s=r(9007),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"msubsup"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 3},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"base",{get:function(){return 0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sub",{get:function(){return 1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sup",{get:function(){return 2},enumerable:!1,configurable:!0}),e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o=this.childNodes;o[0].setInheritedAttributes(t,e,r,n),o[1].setInheritedAttributes(t,!1,r+1,n||1===this.sub),o[2]&&o[2].setInheritedAttributes(t,!1,r+1,n||2===this.sub)},e.defaults=i(i({},s.AbstractMmlBaseNode.defaults),{subscriptshift:"",superscriptshift:""}),e}(s.AbstractMmlBaseNode);e.MmlMsubsup=a;var l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"msub"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 2},enumerable:!1,configurable:!0}),e.defaults=i({},a.defaults),e}(a);e.MmlMsub=l;var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"msup"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sup",{get:function(){return 1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sub",{get:function(){return 2},enumerable:!1,configurable:!0}),e.defaults=i({},a.defaults),e}(a);e.MmlMsup=c},1349:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtable=void 0;var a=r(9007),l=r(505),c=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.properties={useHeight:!0},e.texclass=a.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mtable"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setInheritedAttributes=function(e,r,n,o){var i,l;try{for(var c=s(a.indentAttributes),u=c.next();!u.done;u=c.next()){var p=u.value;e[p]&&this.attributes.setInherited(p,e[p][1]),void 0!==this.attributes.getExplicit(p)&&delete this.attributes.getAllAttributes()[p]}}catch(t){i={error:t}}finally{try{u&&!u.done&&(l=c.return)&&l.call(c)}finally{if(i)throw i.error}}t.prototype.setInheritedAttributes.call(this,e,r,n,o)},e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o,i,a,c;try{for(var u=s(this.childNodes),p=u.next();!p.done;p=u.next()){(y=p.value).isKind("mtr")||this.replaceChild(this.factory.create("mtr"),y).appendChild(y)}}catch(t){o={error:t}}finally{try{p&&!p.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}r=this.getProperty("scriptlevel")||r,e=!(!this.attributes.getExplicit("displaystyle")&&!this.attributes.getDefault("displaystyle")),t=this.addInheritedAttributes(t,{columnalign:this.attributes.get("columnalign"),rowalign:"center"});var h=this.attributes.getExplicit("data-cramped"),f=(0,l.split)(this.attributes.get("rowalign"));try{for(var d=s(this.childNodes),m=d.next();!m.done;m=d.next()){var y=m.value;t.rowalign[1]=f.shift()||t.rowalign[1],y.setInheritedAttributes(t,e,r,!!h)}}catch(t){a={error:t}}finally{try{m&&!m.done&&(c=d.return)&&c.call(d)}finally{if(a)throw a.error}}},e.prototype.verifyChildren=function(e){for(var r=null,n=this.factory,o=0;o<this.childNodes.length;o++){var i=this.childNodes[o];if(i.isKind("mtr"))r=null;else{var s=i.isKind("mtd");if(r?(this.removeChild(i),o--):r=this.replaceChild(n.create("mtr"),i),r.appendChild(s?i:n.create("mtd",{},[i])),!e.fixMtables){i.parent.removeChild(i),i.parent=this,s&&r.appendChild(n.create("mtd"));var a=i.mError("Children of "+this.kind+" must be mtr or mlabeledtr",e,s);r.childNodes[r.childNodes.length-1].appendChild(a)}}}t.prototype.verifyChildren.call(this,e)},e.prototype.setTeXclass=function(t){var e,r;this.getPrevClass(t);try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.setTeXclass(null)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this},e.defaults=i(i({},a.AbstractMmlNode.defaults),{align:"axis",rowalign:"baseline",columnalign:"center",groupalign:"{left}",alignmentscope:!0,columnwidth:"auto",width:"auto",rowspacing:"1ex",columnspacing:".8em",rowlines:"none",columnlines:"none",frame:"none",framespacing:"0.4em 0.5ex",equalrows:!1,equalcolumns:!1,displaystyle:!1,side:"right",minlabelspacing:"0.8em"}),e}(a.AbstractMmlNode);e.MmlMtable=c},4359:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtd=void 0;var s=r(9007),a=r(91),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mtd"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return-1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.verifyChildren=function(e){!this.parent||this.parent.isKind("mtr")?t.prototype.verifyChildren.call(this,e):this.mError(this.kind+" can only be a child of an mtr or mlabeledtr",e,!0)},e.prototype.setTeXclass=function(t){return this.getPrevClass(t),this.childNodes[0].setTeXclass(null),this},e.defaults=i(i({},s.AbstractMmlBaseNode.defaults),{rowspan:1,columnspan:1,rowalign:a.INHERIT,columnalign:a.INHERIT,groupalign:a.INHERIT}),e}(s.AbstractMmlBaseNode);e.MmlMtd=l},4770:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtext=void 0;var s=r(9007),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=s.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mtext"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){return!0},enumerable:!1,configurable:!0}),e.defaults=i({},s.AbstractMmlTokenNode.defaults),e}(s.AbstractMmlTokenNode);e.MmlMtext=a},5022:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMlabeledtr=e.MmlMtr=void 0;var a=r(9007),l=r(91),c=r(505),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mtr"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o,i,a,l;try{for(var u=s(this.childNodes),p=u.next();!p.done;p=u.next()){(m=p.value).isKind("mtd")||this.replaceChild(this.factory.create("mtd"),m).appendChild(m)}}catch(t){o={error:t}}finally{try{p&&!p.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}var h=(0,c.split)(this.attributes.get("columnalign"));1===this.arity&&h.unshift(this.parent.attributes.get("side")),t=this.addInheritedAttributes(t,{rowalign:this.attributes.get("rowalign"),columnalign:"center"});try{for(var f=s(this.childNodes),d=f.next();!d.done;d=f.next()){var m=d.value;t.columnalign[1]=h.shift()||t.columnalign[1],m.setInheritedAttributes(t,e,r,n)}}catch(t){a={error:t}}finally{try{d&&!d.done&&(l=f.return)&&l.call(f)}finally{if(a)throw a.error}}},e.prototype.verifyChildren=function(e){var r,n;if(!this.parent||this.parent.isKind("mtable")){try{for(var o=s(this.childNodes),i=o.next();!i.done;i=o.next()){var a=i.value;if(!a.isKind("mtd"))this.replaceChild(this.factory.create("mtd"),a).appendChild(a),e.fixMtables||a.mError("Children of "+this.kind+" must be mtd",e)}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}t.prototype.verifyChildren.call(this,e)}else this.mError(this.kind+" can only be a child of an mtable",e,!0)},e.prototype.setTeXclass=function(t){var e,r;this.getPrevClass(t);try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.setTeXclass(null)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this},e.defaults=i(i({},a.AbstractMmlNode.defaults),{rowalign:l.INHERIT,columnalign:l.INHERIT,groupalign:l.INHERIT}),e}(a.AbstractMmlNode);e.MmlMtr=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mlabeledtr"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 1},enumerable:!1,configurable:!0}),e}(u);e.MmlMlabeledtr=p},5184:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMover=e.MmlMunder=e.MmlMunderover=void 0;var s=r(9007),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"munderover"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 3},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"base",{get:function(){return 0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"under",{get:function(){return 1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"over",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o=this.childNodes;o[0].setInheritedAttributes(t,e,r,n||!!o[this.over]);var i=!(e||!o[0].coreMO().attributes.get("movablelimits")),s=this.constructor.ACCENTS;o[1].setInheritedAttributes(t,!1,this.getScriptlevel(s[1],i,r),n||1===this.under),this.setInheritedAccent(1,s[1],e,r,n,i),o[2]&&(o[2].setInheritedAttributes(t,!1,this.getScriptlevel(s[2],i,r),n||2===this.under),this.setInheritedAccent(2,s[2],e,r,n,i))},e.prototype.getScriptlevel=function(t,e,r){return!e&&this.attributes.get(t)||r++,r},e.prototype.setInheritedAccent=function(t,e,r,n,o,i){var s=this.childNodes[t];if(null==this.attributes.getExplicit(e)&&s.isEmbellished){var a=s.coreMO().attributes.get("accent");this.attributes.setInherited(e,a),a!==this.attributes.getDefault(e)&&s.setInheritedAttributes({},r,this.getScriptlevel(e,i,n),o)}},e.defaults=i(i({},s.AbstractMmlBaseNode.defaults),{accent:!1,accentunder:!1,align:"center"}),e.ACCENTS=["","accentunder","accent"],e}(s.AbstractMmlBaseNode);e.MmlMunderover=a;var l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"munder"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 2},enumerable:!1,configurable:!0}),e.defaults=i({},a.defaults),e}(a);e.MmlMunder=l;var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mover"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"over",{get:function(){return 1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"under",{get:function(){return 2},enumerable:!1,configurable:!0}),e.defaults=i({},a.defaults),e.ACCENTS=["","accent","accentunder"],e}(a);e.MmlMover=c},9102:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlAnnotation=e.MmlAnnotationXML=e.MmlSemantics=void 0;var s=r(9007),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"semantics"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"notParent",{get:function(){return!0},enumerable:!1,configurable:!0}),e.defaults=i(i({},s.AbstractMmlBaseNode.defaults),{definitionUrl:null,encoding:null}),e}(s.AbstractMmlBaseNode);e.MmlSemantics=a;var l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"annotation-xml"},enumerable:!1,configurable:!0}),e.prototype.setChildInheritedAttributes=function(){},e.defaults=i(i({},s.AbstractMmlNode.defaults),{definitionUrl:null,encoding:null,cd:"mathmlkeys",name:"",src:null}),e}(s.AbstractMmlNode);e.MmlAnnotationXML=l;var c=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.properties={isChars:!0},e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"annotation"},enumerable:!1,configurable:!0}),e.defaults=i({},l.defaults),e}(l);e.MmlAnnotation=c},6325:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.MmlVisitor=void 0;var i=r(3909),s=function(t){function e(e){return void 0===e&&(e=null),e||(e=new i.MmlFactory),t.call(this,e)||this}return o(e,t),e.prototype.visitTextNode=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r]},e.prototype.visitXMLNode=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r]},e}(r(8823).AbstractVisitor);e.MmlVisitor=s},4082:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.OPTABLE=e.MMLSPACING=e.getRange=e.RANGES=e.MO=e.OPDEF=void 0;var o=r(9007);function i(t,e,r,n){return void 0===r&&(r=o.TEXCLASS.BIN),void 0===n&&(n=null),[t,e,r,n]}e.OPDEF=i,e.MO={ORD:i(0,0,o.TEXCLASS.ORD),ORD11:i(1,1,o.TEXCLASS.ORD),ORD21:i(2,1,o.TEXCLASS.ORD),ORD02:i(0,2,o.TEXCLASS.ORD),ORD55:i(5,5,o.TEXCLASS.ORD),NONE:i(0,0,o.TEXCLASS.NONE),OP:i(1,2,o.TEXCLASS.OP,{largeop:!0,movablelimits:!0,symmetric:!0}),OPFIXED:i(1,2,o.TEXCLASS.OP,{largeop:!0,movablelimits:!0}),INTEGRAL:i(0,1,o.TEXCLASS.OP,{largeop:!0,symmetric:!0}),INTEGRAL2:i(1,2,o.TEXCLASS.OP,{largeop:!0,symmetric:!0}),BIN3:i(3,3,o.TEXCLASS.BIN),BIN4:i(4,4,o.TEXCLASS.BIN),BIN01:i(0,1,o.TEXCLASS.BIN),BIN5:i(5,5,o.TEXCLASS.BIN),TALLBIN:i(4,4,o.TEXCLASS.BIN,{stretchy:!0}),BINOP:i(4,4,o.TEXCLASS.BIN,{largeop:!0,movablelimits:!0}),REL:i(5,5,o.TEXCLASS.REL),REL1:i(1,1,o.TEXCLASS.REL,{stretchy:!0}),REL4:i(4,4,o.TEXCLASS.REL),RELSTRETCH:i(5,5,o.TEXCLASS.REL,{stretchy:!0}),RELACCENT:i(5,5,o.TEXCLASS.REL,{accent:!0}),WIDEREL:i(5,5,o.TEXCLASS.REL,{accent:!0,stretchy:!0}),OPEN:i(0,0,o.TEXCLASS.OPEN,{fence:!0,stretchy:!0,symmetric:!0}),CLOSE:i(0,0,o.TEXCLASS.CLOSE,{fence:!0,stretchy:!0,symmetric:!0}),INNER:i(0,0,o.TEXCLASS.INNER),PUNCT:i(0,3,o.TEXCLASS.PUNCT),ACCENT:i(0,0,o.TEXCLASS.ORD,{accent:!0}),WIDEACCENT:i(0,0,o.TEXCLASS.ORD,{accent:!0,stretchy:!0})},e.RANGES=[[32,127,o.TEXCLASS.REL,"mo"],[160,191,o.TEXCLASS.ORD,"mo"],[192,591,o.TEXCLASS.ORD,"mi"],[688,879,o.TEXCLASS.ORD,"mo"],[880,6688,o.TEXCLASS.ORD,"mi"],[6832,6911,o.TEXCLASS.ORD,"mo"],[6912,7615,o.TEXCLASS.ORD,"mi"],[7616,7679,o.TEXCLASS.ORD,"mo"],[7680,8191,o.TEXCLASS.ORD,"mi"],[8192,8303,o.TEXCLASS.ORD,"mo"],[8304,8351,o.TEXCLASS.ORD,"mo"],[8448,8527,o.TEXCLASS.ORD,"mi"],[8528,8591,o.TEXCLASS.ORD,"mn"],[8592,8703,o.TEXCLASS.REL,"mo"],[8704,8959,o.TEXCLASS.BIN,"mo"],[8960,9215,o.TEXCLASS.ORD,"mo"],[9312,9471,o.TEXCLASS.ORD,"mn"],[9472,10223,o.TEXCLASS.ORD,"mo"],[10224,10239,o.TEXCLASS.REL,"mo"],[10240,10495,o.TEXCLASS.ORD,"mtext"],[10496,10623,o.TEXCLASS.REL,"mo"],[10624,10751,o.TEXCLASS.ORD,"mo"],[10752,11007,o.TEXCLASS.BIN,"mo"],[11008,11055,o.TEXCLASS.ORD,"mo"],[11056,11087,o.TEXCLASS.REL,"mo"],[11088,11263,o.TEXCLASS.ORD,"mo"],[11264,11744,o.TEXCLASS.ORD,"mi"],[11776,11903,o.TEXCLASS.ORD,"mo"],[11904,12255,o.TEXCLASS.ORD,"mi","normal"],[12272,12351,o.TEXCLASS.ORD,"mo"],[12352,42143,o.TEXCLASS.ORD,"mi","normal"],[42192,43055,o.TEXCLASS.ORD,"mi"],[43056,43071,o.TEXCLASS.ORD,"mn"],[43072,55295,o.TEXCLASS.ORD,"mi"],[63744,64255,o.TEXCLASS.ORD,"mi","normal"],[64256,65023,o.TEXCLASS.ORD,"mi"],[65024,65135,o.TEXCLASS.ORD,"mo"],[65136,65791,o.TEXCLASS.ORD,"mi"],[65792,65935,o.TEXCLASS.ORD,"mn"],[65936,74751,o.TEXCLASS.ORD,"mi","normal"],[74752,74879,o.TEXCLASS.ORD,"mn"],[74880,113823,o.TEXCLASS.ORD,"mi","normal"],[113824,119391,o.TEXCLASS.ORD,"mo"],[119648,119679,o.TEXCLASS.ORD,"mn"],[119808,120781,o.TEXCLASS.ORD,"mi"],[120782,120831,o.TEXCLASS.ORD,"mn"],[122624,129023,o.TEXCLASS.ORD,"mo"],[129024,129279,o.TEXCLASS.REL,"mo"],[129280,129535,o.TEXCLASS.ORD,"mo"],[131072,195103,o.TEXCLASS.ORD,"mi","normnal"]],e.getRange=function(t){var r,o,i=t.codePointAt(0);try{for(var s=n(e.RANGES),a=s.next();!a.done;a=s.next()){var l=a.value;if(i<=l[1]){if(i>=l[0])return l;break}}}catch(t){r={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(r)throw r.error}}return null},e.MMLSPACING=[[0,0],[1,2],[3,3],[4,4],[0,0],[0,0],[0,3]],e.OPTABLE={prefix:{"(":e.MO.OPEN,"+":e.MO.BIN01,"-":e.MO.BIN01,"[":e.MO.OPEN,"{":e.MO.OPEN,"|":e.MO.OPEN,"||":[0,0,o.TEXCLASS.BIN,{fence:!0,stretchy:!0,symmetric:!0}],"|||":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"\xac":e.MO.ORD21,"\xb1":e.MO.BIN01,"\u2016":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2018":[0,0,o.TEXCLASS.OPEN,{fence:!0}],"\u201c":[0,0,o.TEXCLASS.OPEN,{fence:!0}],"\u2145":e.MO.ORD21,"\u2146":i(2,0,o.TEXCLASS.ORD),"\u2200":e.MO.ORD21,"\u2202":e.MO.ORD21,"\u2203":e.MO.ORD21,"\u2204":e.MO.ORD21,"\u2207":e.MO.ORD21,"\u220f":e.MO.OP,"\u2210":e.MO.OP,"\u2211":e.MO.OP,"\u2212":e.MO.BIN01,"\u2213":e.MO.BIN01,"\u221a":[1,1,o.TEXCLASS.ORD,{stretchy:!0}],"\u221b":e.MO.ORD11,"\u221c":e.MO.ORD11,"\u2220":e.MO.ORD,"\u2221":e.MO.ORD,"\u2222":e.MO.ORD,"\u222b":e.MO.INTEGRAL,"\u222c":e.MO.INTEGRAL,"\u222d":e.MO.INTEGRAL,"\u222e":e.MO.INTEGRAL,"\u222f":e.MO.INTEGRAL,"\u2230":e.MO.INTEGRAL,"\u2231":e.MO.INTEGRAL,"\u2232":e.MO.INTEGRAL,"\u2233":e.MO.INTEGRAL,"\u22c0":e.MO.OP,"\u22c1":e.MO.OP,"\u22c2":e.MO.OP,"\u22c3":e.MO.OP,"\u2308":e.MO.OPEN,"\u230a":e.MO.OPEN,"\u2329":e.MO.OPEN,"\u2772":e.MO.OPEN,"\u27e6":e.MO.OPEN,"\u27e8":e.MO.OPEN,"\u27ea":e.MO.OPEN,"\u27ec":e.MO.OPEN,"\u27ee":e.MO.OPEN,"\u2980":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2983":e.MO.OPEN,"\u2985":e.MO.OPEN,"\u2987":e.MO.OPEN,"\u2989":e.MO.OPEN,"\u298b":e.MO.OPEN,"\u298d":e.MO.OPEN,"\u298f":e.MO.OPEN,"\u2991":e.MO.OPEN,"\u2993":e.MO.OPEN,"\u2995":e.MO.OPEN,"\u2997":e.MO.OPEN,"\u29fc":e.MO.OPEN,"\u2a00":e.MO.OP,"\u2a01":e.MO.OP,"\u2a02":e.MO.OP,"\u2a03":e.MO.OP,"\u2a04":e.MO.OP,"\u2a05":e.MO.OP,"\u2a06":e.MO.OP,"\u2a07":e.MO.OP,"\u2a08":e.MO.OP,"\u2a09":e.MO.OP,"\u2a0a":e.MO.OP,"\u2a0b":e.MO.INTEGRAL2,"\u2a0c":e.MO.INTEGRAL,"\u2a0d":e.MO.INTEGRAL2,"\u2a0e":e.MO.INTEGRAL2,"\u2a0f":e.MO.INTEGRAL2,"\u2a10":e.MO.OP,"\u2a11":e.MO.OP,"\u2a12":e.MO.OP,"\u2a13":e.MO.OP,"\u2a14":e.MO.OP,"\u2a15":e.MO.INTEGRAL2,"\u2a16":e.MO.INTEGRAL2,"\u2a17":e.MO.INTEGRAL2,"\u2a18":e.MO.INTEGRAL2,"\u2a19":e.MO.INTEGRAL2,"\u2a1a":e.MO.INTEGRAL2,"\u2a1b":e.MO.INTEGRAL2,"\u2a1c":e.MO.INTEGRAL2,"\u2afc":e.MO.OP,"\u2aff":e.MO.OP},postfix:{"!!":i(1,0),"!":[1,0,o.TEXCLASS.CLOSE,null],'"':e.MO.ACCENT,"&":e.MO.ORD,")":e.MO.CLOSE,"++":i(0,0),"--":i(0,0),"..":i(0,0),"...":e.MO.ORD,"'":e.MO.ACCENT,"]":e.MO.CLOSE,"^":e.MO.WIDEACCENT,_:e.MO.WIDEACCENT,"`":e.MO.ACCENT,"|":e.MO.CLOSE,"}":e.MO.CLOSE,"~":e.MO.WIDEACCENT,"||":[0,0,o.TEXCLASS.BIN,{fence:!0,stretchy:!0,symmetric:!0}],"|||":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"\xa8":e.MO.ACCENT,"\xaa":e.MO.ACCENT,"\xaf":e.MO.WIDEACCENT,"\xb0":e.MO.ORD,"\xb2":e.MO.ACCENT,"\xb3":e.MO.ACCENT,"\xb4":e.MO.ACCENT,"\xb8":e.MO.ACCENT,"\xb9":e.MO.ACCENT,"\xba":e.MO.ACCENT,"\u02c6":e.MO.WIDEACCENT,"\u02c7":e.MO.WIDEACCENT,"\u02c9":e.MO.WIDEACCENT,"\u02ca":e.MO.ACCENT,"\u02cb":e.MO.ACCENT,"\u02cd":e.MO.WIDEACCENT,"\u02d8":e.MO.ACCENT,"\u02d9":e.MO.ACCENT,"\u02da":e.MO.ACCENT,"\u02dc":e.MO.WIDEACCENT,"\u02dd":e.MO.ACCENT,"\u02f7":e.MO.WIDEACCENT,"\u0302":e.MO.WIDEACCENT,"\u0311":e.MO.ACCENT,"\u03f6":e.MO.REL,"\u2016":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2019":[0,0,o.TEXCLASS.CLOSE,{fence:!0}],"\u201a":e.MO.ACCENT,"\u201b":e.MO.ACCENT,"\u201d":[0,0,o.TEXCLASS.CLOSE,{fence:!0}],"\u201e":e.MO.ACCENT,"\u201f":e.MO.ACCENT,"\u2032":e.MO.ORD,"\u2033":e.MO.ACCENT,"\u2034":e.MO.ACCENT,"\u2035":e.MO.ACCENT,"\u2036":e.MO.ACCENT,"\u2037":e.MO.ACCENT,"\u203e":e.MO.WIDEACCENT,"\u2057":e.MO.ACCENT,"\u20db":e.MO.ACCENT,"\u20dc":e.MO.ACCENT,"\u2309":e.MO.CLOSE,"\u230b":e.MO.CLOSE,"\u232a":e.MO.CLOSE,"\u23b4":e.MO.WIDEACCENT,"\u23b5":e.MO.WIDEACCENT,"\u23dc":e.MO.WIDEACCENT,"\u23dd":e.MO.WIDEACCENT,"\u23de":e.MO.WIDEACCENT,"\u23df":e.MO.WIDEACCENT,"\u23e0":e.MO.WIDEACCENT,"\u23e1":e.MO.WIDEACCENT,"\u25a0":e.MO.BIN3,"\u25a1":e.MO.BIN3,"\u25aa":e.MO.BIN3,"\u25ab":e.MO.BIN3,"\u25ad":e.MO.BIN3,"\u25ae":e.MO.BIN3,"\u25af":e.MO.BIN3,"\u25b0":e.MO.BIN3,"\u25b1":e.MO.BIN3,"\u25b2":e.MO.BIN4,"\u25b4":e.MO.BIN4,"\u25b6":e.MO.BIN4,"\u25b7":e.MO.BIN4,"\u25b8":e.MO.BIN4,"\u25bc":e.MO.BIN4,"\u25be":e.MO.BIN4,"\u25c0":e.MO.BIN4,"\u25c1":e.MO.BIN4,"\u25c2":e.MO.BIN4,"\u25c4":e.MO.BIN4,"\u25c5":e.MO.BIN4,"\u25c6":e.MO.BIN4,"\u25c7":e.MO.BIN4,"\u25c8":e.MO.BIN4,"\u25c9":e.MO.BIN4,"\u25cc":e.MO.BIN4,"\u25cd":e.MO.BIN4,"\u25ce":e.MO.BIN4,"\u25cf":e.MO.BIN4,"\u25d6":e.MO.BIN4,"\u25d7":e.MO.BIN4,"\u25e6":e.MO.BIN4,"\u266d":e.MO.ORD02,"\u266e":e.MO.ORD02,"\u266f":e.MO.ORD02,"\u2773":e.MO.CLOSE,"\u27e7":e.MO.CLOSE,"\u27e9":e.MO.CLOSE,"\u27eb":e.MO.CLOSE,"\u27ed":e.MO.CLOSE,"\u27ef":e.MO.CLOSE,"\u2980":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2984":e.MO.CLOSE,"\u2986":e.MO.CLOSE,"\u2988":e.MO.CLOSE,"\u298a":e.MO.CLOSE,"\u298c":e.MO.CLOSE,"\u298e":e.MO.CLOSE,"\u2990":e.MO.CLOSE,"\u2992":e.MO.CLOSE,"\u2994":e.MO.CLOSE,"\u2996":e.MO.CLOSE,"\u2998":e.MO.CLOSE,"\u29fd":e.MO.CLOSE},infix:{"!=":e.MO.BIN4,"#":e.MO.ORD,$:e.MO.ORD,"%":[3,3,o.TEXCLASS.ORD,null],"&&":e.MO.BIN4,"":e.MO.ORD,"*":e.MO.BIN3,"**":i(1,1),"*=":e.MO.BIN4,"+":e.MO.BIN4,"+=":e.MO.BIN4,",":[0,3,o.TEXCLASS.PUNCT,{linebreakstyle:"after",separator:!0}],"-":e.MO.BIN4,"-=":e.MO.BIN4,"->":e.MO.BIN5,".":[0,3,o.TEXCLASS.PUNCT,{separator:!0}],"/":e.MO.ORD11,"//":i(1,1),"/=":e.MO.BIN4,":":[1,2,o.TEXCLASS.REL,null],":=":e.MO.BIN4,";":[0,3,o.TEXCLASS.PUNCT,{linebreakstyle:"after",separator:!0}],"<":e.MO.REL,"<=":e.MO.BIN5,"<>":i(1,1),"=":e.MO.REL,"==":e.MO.BIN4,">":e.MO.REL,">=":e.MO.BIN5,"?":[1,1,o.TEXCLASS.CLOSE,null],"@":e.MO.ORD11,"\\":e.MO.ORD,"^":e.MO.ORD11,_:e.MO.ORD11,"|":[2,2,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"||":[2,2,o.TEXCLASS.BIN,{fence:!0,stretchy:!0,symmetric:!0}],"|||":[2,2,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"\xb1":e.MO.BIN4,"\xb7":e.MO.BIN4,"\xd7":e.MO.BIN4,"\xf7":e.MO.BIN4,"\u02b9":e.MO.ORD,"\u0300":e.MO.ACCENT,"\u0301":e.MO.ACCENT,"\u0303":e.MO.WIDEACCENT,"\u0304":e.MO.ACCENT,"\u0306":e.MO.ACCENT,"\u0307":e.MO.ACCENT,"\u0308":e.MO.ACCENT,"\u030c":e.MO.ACCENT,"\u0332":e.MO.WIDEACCENT,"\u0338":e.MO.REL4,"\u2015":[0,0,o.TEXCLASS.ORD,{stretchy:!0}],"\u2017":[0,0,o.TEXCLASS.ORD,{stretchy:!0}],"\u2020":e.MO.BIN3,"\u2021":e.MO.BIN3,"\u2022":e.MO.BIN4,"\u2026":e.MO.INNER,"\u2043":e.MO.BIN4,"\u2044":e.MO.TALLBIN,"\u2061":e.MO.NONE,"\u2062":e.MO.NONE,"\u2063":[0,0,o.TEXCLASS.NONE,{linebreakstyle:"after",separator:!0}],"\u2064":e.MO.NONE,"\u20d7":e.MO.ACCENT,"\u2111":e.MO.ORD,"\u2113":e.MO.ORD,"\u2118":e.MO.ORD,"\u211c":e.MO.ORD,"\u2190":e.MO.WIDEREL,"\u2191":e.MO.RELSTRETCH,"\u2192":e.MO.WIDEREL,"\u2193":e.MO.RELSTRETCH,"\u2194":e.MO.WIDEREL,"\u2195":e.MO.RELSTRETCH,"\u2196":e.MO.RELSTRETCH,"\u2197":e.MO.RELSTRETCH,"\u2198":e.MO.RELSTRETCH,"\u2199":e.MO.RELSTRETCH,"\u219a":e.MO.RELACCENT,"\u219b":e.MO.RELACCENT,"\u219c":e.MO.WIDEREL,"\u219d":e.MO.WIDEREL,"\u219e":e.MO.WIDEREL,"\u219f":e.MO.WIDEREL,"\u21a0":e.MO.WIDEREL,"\u21a1":e.MO.RELSTRETCH,"\u21a2":e.MO.WIDEREL,"\u21a3":e.MO.WIDEREL,"\u21a4":e.MO.WIDEREL,"\u21a5":e.MO.RELSTRETCH,"\u21a6":e.MO.WIDEREL,"\u21a7":e.MO.RELSTRETCH,"\u21a8":e.MO.RELSTRETCH,"\u21a9":e.MO.WIDEREL,"\u21aa":e.MO.WIDEREL,"\u21ab":e.MO.WIDEREL,"\u21ac":e.MO.WIDEREL,"\u21ad":e.MO.WIDEREL,"\u21ae":e.MO.RELACCENT,"\u21af":e.MO.RELSTRETCH,"\u21b0":e.MO.RELSTRETCH,"\u21b1":e.MO.RELSTRETCH,"\u21b2":e.MO.RELSTRETCH,"\u21b3":e.MO.RELSTRETCH,"\u21b4":e.MO.RELSTRETCH,"\u21b5":e.MO.RELSTRETCH,"\u21b6":e.MO.RELACCENT,"\u21b7":e.MO.RELACCENT,"\u21b8":e.MO.REL,"\u21b9":e.MO.WIDEREL,"\u21ba":e.MO.REL,"\u21bb":e.MO.REL,"\u21bc":e.MO.WIDEREL,"\u21bd":e.MO.WIDEREL,"\u21be":e.MO.RELSTRETCH,"\u21bf":e.MO.RELSTRETCH,"\u21c0":e.MO.WIDEREL,"\u21c1":e.MO.WIDEREL,"\u21c2":e.MO.RELSTRETCH,"\u21c3":e.MO.RELSTRETCH,"\u21c4":e.MO.WIDEREL,"\u21c5":e.MO.RELSTRETCH,"\u21c6":e.MO.WIDEREL,"\u21c7":e.MO.WIDEREL,"\u21c8":e.MO.RELSTRETCH,"\u21c9":e.MO.WIDEREL,"\u21ca":e.MO.RELSTRETCH,"\u21cb":e.MO.WIDEREL,"\u21cc":e.MO.WIDEREL,"\u21cd":e.MO.RELACCENT,"\u21ce":e.MO.RELACCENT,"\u21cf":e.MO.RELACCENT,"\u21d0":e.MO.WIDEREL,"\u21d1":e.MO.RELSTRETCH,"\u21d2":e.MO.WIDEREL,"\u21d3":e.MO.RELSTRETCH,"\u21d4":e.MO.WIDEREL,"\u21d5":e.MO.RELSTRETCH,"\u21d6":e.MO.RELSTRETCH,"\u21d7":e.MO.RELSTRETCH,"\u21d8":e.MO.RELSTRETCH,"\u21d9":e.MO.RELSTRETCH,"\u21da":e.MO.WIDEREL,"\u21db":e.MO.WIDEREL,"\u21dc":e.MO.WIDEREL,"\u21dd":e.MO.WIDEREL,"\u21de":e.MO.REL,"\u21df":e.MO.REL,"\u21e0":e.MO.WIDEREL,"\u21e1":e.MO.RELSTRETCH,"\u21e2":e.MO.WIDEREL,"\u21e3":e.MO.RELSTRETCH,"\u21e4":e.MO.WIDEREL,"\u21e5":e.MO.WIDEREL,"\u21e6":e.MO.WIDEREL,"\u21e7":e.MO.RELSTRETCH,"\u21e8":e.MO.WIDEREL,"\u21e9":e.MO.RELSTRETCH,"\u21ea":e.MO.RELSTRETCH,"\u21eb":e.MO.RELSTRETCH,"\u21ec":e.MO.RELSTRETCH,"\u21ed":e.MO.RELSTRETCH,"\u21ee":e.MO.RELSTRETCH,"\u21ef":e.MO.RELSTRETCH,"\u21f0":e.MO.WIDEREL,"\u21f1":e.MO.REL,"\u21f2":e.MO.REL,"\u21f3":e.MO.RELSTRETCH,"\u21f4":e.MO.RELACCENT,"\u21f5":e.MO.RELSTRETCH,"\u21f6":e.MO.WIDEREL,"\u21f7":e.MO.RELACCENT,"\u21f8":e.MO.RELACCENT,"\u21f9":e.MO.RELACCENT,"\u21fa":e.MO.RELACCENT,"\u21fb":e.MO.RELACCENT,"\u21fc":e.MO.RELACCENT,"\u21fd":e.MO.WIDEREL,"\u21fe":e.MO.WIDEREL,"\u21ff":e.MO.WIDEREL,"\u2201":i(1,2,o.TEXCLASS.ORD),"\u2205":e.MO.ORD,"\u2206":e.MO.BIN3,"\u2208":e.MO.REL,"\u2209":e.MO.REL,"\u220a":e.MO.REL,"\u220b":e.MO.REL,"\u220c":e.MO.REL,"\u220d":e.MO.REL,"\u220e":e.MO.BIN3,"\u2212":e.MO.BIN4,"\u2213":e.MO.BIN4,"\u2214":e.MO.BIN4,"\u2215":e.MO.TALLBIN,"\u2216":e.MO.BIN4,"\u2217":e.MO.BIN4,"\u2218":e.MO.BIN4,"\u2219":e.MO.BIN4,"\u221d":e.MO.REL,"\u221e":e.MO.ORD,"\u221f":e.MO.REL,"\u2223":e.MO.REL,"\u2224":e.MO.REL,"\u2225":e.MO.REL,"\u2226":e.MO.REL,"\u2227":e.MO.BIN4,"\u2228":e.MO.BIN4,"\u2229":e.MO.BIN4,"\u222a":e.MO.BIN4,"\u2234":e.MO.REL,"\u2235":e.MO.REL,"\u2236":e.MO.REL,"\u2237":e.MO.REL,"\u2238":e.MO.BIN4,"\u2239":e.MO.REL,"\u223a":e.MO.BIN4,"\u223b":e.MO.REL,"\u223c":e.MO.REL,"\u223d":e.MO.REL,"\u223d\u0331":e.MO.BIN3,"\u223e":e.MO.REL,"\u223f":e.MO.BIN3,"\u2240":e.MO.BIN4,"\u2241":e.MO.REL,"\u2242":e.MO.REL,"\u2242\u0338":e.MO.REL,"\u2243":e.MO.REL,"\u2244":e.MO.REL,"\u2245":e.MO.REL,"\u2246":e.MO.REL,"\u2247":e.MO.REL,"\u2248":e.MO.REL,"\u2249":e.MO.REL,"\u224a":e.MO.REL,"\u224b":e.MO.REL,"\u224c":e.MO.REL,"\u224d":e.MO.REL,"\u224e":e.MO.REL,"\u224e\u0338":e.MO.REL,"\u224f":e.MO.REL,"\u224f\u0338":e.MO.REL,"\u2250":e.MO.REL,"\u2251":e.MO.REL,"\u2252":e.MO.REL,"\u2253":e.MO.REL,"\u2254":e.MO.REL,"\u2255":e.MO.REL,"\u2256":e.MO.REL,"\u2257":e.MO.REL,"\u2258":e.MO.REL,"\u2259":e.MO.REL,"\u225a":e.MO.REL,"\u225b":e.MO.REL,"\u225c":e.MO.REL,"\u225d":e.MO.REL,"\u225e":e.MO.REL,"\u225f":e.MO.REL,"\u2260":e.MO.REL,"\u2261":e.MO.REL,"\u2262":e.MO.REL,"\u2263":e.MO.REL,"\u2264":e.MO.REL,"\u2265":e.MO.REL,"\u2266":e.MO.REL,"\u2266\u0338":e.MO.REL,"\u2267":e.MO.REL,"\u2268":e.MO.REL,"\u2269":e.MO.REL,"\u226a":e.MO.REL,"\u226a\u0338":e.MO.REL,"\u226b":e.MO.REL,"\u226b\u0338":e.MO.REL,"\u226c":e.MO.REL,"\u226d":e.MO.REL,"\u226e":e.MO.REL,"\u226f":e.MO.REL,"\u2270":e.MO.REL,"\u2271":e.MO.REL,"\u2272":e.MO.REL,"\u2273":e.MO.REL,"\u2274":e.MO.REL,"\u2275":e.MO.REL,"\u2276":e.MO.REL,"\u2277":e.MO.REL,"\u2278":e.MO.REL,"\u2279":e.MO.REL,"\u227a":e.MO.REL,"\u227b":e.MO.REL,"\u227c":e.MO.REL,"\u227d":e.MO.REL,"\u227e":e.MO.REL,"\u227f":e.MO.REL,"\u227f\u0338":e.MO.REL,"\u2280":e.MO.REL,"\u2281":e.MO.REL,"\u2282":e.MO.REL,"\u2282\u20d2":e.MO.REL,"\u2283":e.MO.REL,"\u2283\u20d2":e.MO.REL,"\u2284":e.MO.REL,"\u2285":e.MO.REL,"\u2286":e.MO.REL,"\u2287":e.MO.REL,"\u2288":e.MO.REL,"\u2289":e.MO.REL,"\u228a":e.MO.REL,"\u228b":e.MO.REL,"\u228c":e.MO.BIN4,"\u228d":e.MO.BIN4,"\u228e":e.MO.BIN4,"\u228f":e.MO.REL,"\u228f\u0338":e.MO.REL,"\u2290":e.MO.REL,"\u2290\u0338":e.MO.REL,"\u2291":e.MO.REL,"\u2292":e.MO.REL,"\u2293":e.MO.BIN4,"\u2294":e.MO.BIN4,"\u2295":e.MO.BIN4,"\u2296":e.MO.BIN4,"\u2297":e.MO.BIN4,"\u2298":e.MO.BIN4,"\u2299":e.MO.BIN4,"\u229a":e.MO.BIN4,"\u229b":e.MO.BIN4,"\u229c":e.MO.BIN4,"\u229d":e.MO.BIN4,"\u229e":e.MO.BIN4,"\u229f":e.MO.BIN4,"\u22a0":e.MO.BIN4,"\u22a1":e.MO.BIN4,"\u22a2":e.MO.REL,"\u22a3":e.MO.REL,"\u22a4":e.MO.ORD55,"\u22a5":e.MO.REL,"\u22a6":e.MO.REL,"\u22a7":e.MO.REL,"\u22a8":e.MO.REL,"\u22a9":e.MO.REL,"\u22aa":e.MO.REL,"\u22ab":e.MO.REL,"\u22ac":e.MO.REL,"\u22ad":e.MO.REL,"\u22ae":e.MO.REL,"\u22af":e.MO.REL,"\u22b0":e.MO.REL,"\u22b1":e.MO.REL,"\u22b2":e.MO.REL,"\u22b3":e.MO.REL,"\u22b4":e.MO.REL,"\u22b5":e.MO.REL,"\u22b6":e.MO.REL,"\u22b7":e.MO.REL,"\u22b8":e.MO.REL,"\u22b9":e.MO.REL,"\u22ba":e.MO.BIN4,"\u22bb":e.MO.BIN4,"\u22bc":e.MO.BIN4,"\u22bd":e.MO.BIN4,"\u22be":e.MO.BIN3,"\u22bf":e.MO.BIN3,"\u22c4":e.MO.BIN4,"\u22c5":e.MO.BIN4,"\u22c6":e.MO.BIN4,"\u22c7":e.MO.BIN4,"\u22c8":e.MO.REL,"\u22c9":e.MO.BIN4,"\u22ca":e.MO.BIN4,"\u22cb":e.MO.BIN4,"\u22cc":e.MO.BIN4,"\u22cd":e.MO.REL,"\u22ce":e.MO.BIN4,"\u22cf":e.MO.BIN4,"\u22d0":e.MO.REL,"\u22d1":e.MO.REL,"\u22d2":e.MO.BIN4,"\u22d3":e.MO.BIN4,"\u22d4":e.MO.REL,"\u22d5":e.MO.REL,"\u22d6":e.MO.REL,"\u22d7":e.MO.REL,"\u22d8":e.MO.REL,"\u22d9":e.MO.REL,"\u22da":e.MO.REL,"\u22db":e.MO.REL,"\u22dc":e.MO.REL,"\u22dd":e.MO.REL,"\u22de":e.MO.REL,"\u22df":e.MO.REL,"\u22e0":e.MO.REL,"\u22e1":e.MO.REL,"\u22e2":e.MO.REL,"\u22e3":e.MO.REL,"\u22e4":e.MO.REL,"\u22e5":e.MO.REL,"\u22e6":e.MO.REL,"\u22e7":e.MO.REL,"\u22e8":e.MO.REL,"\u22e9":e.MO.REL,"\u22ea":e.MO.REL,"\u22eb":e.MO.REL,"\u22ec":e.MO.REL,"\u22ed":e.MO.REL,"\u22ee":e.MO.ORD55,"\u22ef":e.MO.INNER,"\u22f0":e.MO.REL,"\u22f1":[5,5,o.TEXCLASS.INNER,null],"\u22f2":e.MO.REL,"\u22f3":e.MO.REL,"\u22f4":e.MO.REL,"\u22f5":e.MO.REL,"\u22f6":e.MO.REL,"\u22f7":e.MO.REL,"\u22f8":e.MO.REL,"\u22f9":e.MO.REL,"\u22fa":e.MO.REL,"\u22fb":e.MO.REL,"\u22fc":e.MO.REL,"\u22fd":e.MO.REL,"\u22fe":e.MO.REL,"\u22ff":e.MO.REL,"\u2305":e.MO.BIN3,"\u2306":e.MO.BIN3,"\u2322":e.MO.REL4,"\u2323":e.MO.REL4,"\u2329":e.MO.OPEN,"\u232a":e.MO.CLOSE,"\u23aa":e.MO.ORD,"\u23af":[0,0,o.TEXCLASS.ORD,{stretchy:!0}],"\u23b0":e.MO.OPEN,"\u23b1":e.MO.CLOSE,"\u2500":e.MO.ORD,"\u25b3":e.MO.BIN4,"\u25b5":e.MO.BIN4,"\u25b9":e.MO.BIN4,"\u25bd":e.MO.BIN4,"\u25bf":e.MO.BIN4,"\u25c3":e.MO.BIN4,"\u25ef":e.MO.BIN3,"\u2660":e.MO.ORD,"\u2661":e.MO.ORD,"\u2662":e.MO.ORD,"\u2663":e.MO.ORD,"\u2758":e.MO.REL,"\u27f0":e.MO.RELSTRETCH,"\u27f1":e.MO.RELSTRETCH,"\u27f5":e.MO.WIDEREL,"\u27f6":e.MO.WIDEREL,"\u27f7":e.MO.WIDEREL,"\u27f8":e.MO.WIDEREL,"\u27f9":e.MO.WIDEREL,"\u27fa":e.MO.WIDEREL,"\u27fb":e.MO.WIDEREL,"\u27fc":e.MO.WIDEREL,"\u27fd":e.MO.WIDEREL,"\u27fe":e.MO.WIDEREL,"\u27ff":e.MO.WIDEREL,"\u2900":e.MO.RELACCENT,"\u2901":e.MO.RELACCENT,"\u2902":e.MO.RELACCENT,"\u2903":e.MO.RELACCENT,"\u2904":e.MO.RELACCENT,"\u2905":e.MO.RELACCENT,"\u2906":e.MO.RELACCENT,"\u2907":e.MO.RELACCENT,"\u2908":e.MO.REL,"\u2909":e.MO.REL,"\u290a":e.MO.RELSTRETCH,"\u290b":e.MO.RELSTRETCH,"\u290c":e.MO.WIDEREL,"\u290d":e.MO.WIDEREL,"\u290e":e.MO.WIDEREL,"\u290f":e.MO.WIDEREL,"\u2910":e.MO.WIDEREL,"\u2911":e.MO.RELACCENT,"\u2912":e.MO.RELSTRETCH,"\u2913":e.MO.RELSTRETCH,"\u2914":e.MO.RELACCENT,"\u2915":e.MO.RELACCENT,"\u2916":e.MO.RELACCENT,"\u2917":e.MO.RELACCENT,"\u2918":e.MO.RELACCENT,"\u2919":e.MO.RELACCENT,"\u291a":e.MO.RELACCENT,"\u291b":e.MO.RELACCENT,"\u291c":e.MO.RELACCENT,"\u291d":e.MO.RELACCENT,"\u291e":e.MO.RELACCENT,"\u291f":e.MO.RELACCENT,"\u2920":e.MO.RELACCENT,"\u2921":e.MO.RELSTRETCH,"\u2922":e.MO.RELSTRETCH,"\u2923":e.MO.REL,"\u2924":e.MO.REL,"\u2925":e.MO.REL,"\u2926":e.MO.REL,"\u2927":e.MO.REL,"\u2928":e.MO.REL,"\u2929":e.MO.REL,"\u292a":e.MO.REL,"\u292b":e.MO.REL,"\u292c":e.MO.REL,"\u292d":e.MO.REL,"\u292e":e.MO.REL,"\u292f":e.MO.REL,"\u2930":e.MO.REL,"\u2931":e.MO.REL,"\u2932":e.MO.REL,"\u2933":e.MO.RELACCENT,"\u2934":e.MO.REL,"\u2935":e.MO.REL,"\u2936":e.MO.REL,"\u2937":e.MO.REL,"\u2938":e.MO.REL,"\u2939":e.MO.REL,"\u293a":e.MO.RELACCENT,"\u293b":e.MO.RELACCENT,"\u293c":e.MO.RELACCENT,"\u293d":e.MO.RELACCENT,"\u293e":e.MO.REL,"\u293f":e.MO.REL,"\u2940":e.MO.REL,"\u2941":e.MO.REL,"\u2942":e.MO.RELACCENT,"\u2943":e.MO.RELACCENT,"\u2944":e.MO.RELACCENT,"\u2945":e.MO.RELACCENT,"\u2946":e.MO.RELACCENT,"\u2947":e.MO.RELACCENT,"\u2948":e.MO.RELACCENT,"\u2949":e.MO.REL,"\u294a":e.MO.RELACCENT,"\u294b":e.MO.RELACCENT,"\u294c":e.MO.REL,"\u294d":e.MO.REL,"\u294e":e.MO.WIDEREL,"\u294f":e.MO.RELSTRETCH,"\u2950":e.MO.WIDEREL,"\u2951":e.MO.RELSTRETCH,"\u2952":e.MO.WIDEREL,"\u2953":e.MO.WIDEREL,"\u2954":e.MO.RELSTRETCH,"\u2955":e.MO.RELSTRETCH,"\u2956":e.MO.RELSTRETCH,"\u2957":e.MO.RELSTRETCH,"\u2958":e.MO.RELSTRETCH,"\u2959":e.MO.RELSTRETCH,"\u295a":e.MO.WIDEREL,"\u295b":e.MO.WIDEREL,"\u295c":e.MO.RELSTRETCH,"\u295d":e.MO.RELSTRETCH,"\u295e":e.MO.WIDEREL,"\u295f":e.MO.WIDEREL,"\u2960":e.MO.RELSTRETCH,"\u2961":e.MO.RELSTRETCH,"\u2962":e.MO.RELACCENT,"\u2963":e.MO.REL,"\u2964":e.MO.RELACCENT,"\u2965":e.MO.REL,"\u2966":e.MO.RELACCENT,"\u2967":e.MO.RELACCENT,"\u2968":e.MO.RELACCENT,"\u2969":e.MO.RELACCENT,"\u296a":e.MO.RELACCENT,"\u296b":e.MO.RELACCENT,"\u296c":e.MO.RELACCENT,"\u296d":e.MO.RELACCENT,"\u296e":e.MO.RELSTRETCH,"\u296f":e.MO.RELSTRETCH,"\u2970":e.MO.RELACCENT,"\u2971":e.MO.RELACCENT,"\u2972":e.MO.RELACCENT,"\u2973":e.MO.RELACCENT,"\u2974":e.MO.RELACCENT,"\u2975":e.MO.RELACCENT,"\u2976":e.MO.RELACCENT,"\u2977":e.MO.RELACCENT,"\u2978":e.MO.RELACCENT,"\u2979":e.MO.RELACCENT,"\u297a":e.MO.RELACCENT,"\u297b":e.MO.RELACCENT,"\u297c":e.MO.RELACCENT,"\u297d":e.MO.RELACCENT,"\u297e":e.MO.REL,"\u297f":e.MO.REL,"\u2981":e.MO.BIN3,"\u2982":e.MO.BIN3,"\u2999":e.MO.BIN3,"\u299a":e.MO.BIN3,"\u299b":e.MO.BIN3,"\u299c":e.MO.BIN3,"\u299d":e.MO.BIN3,"\u299e":e.MO.BIN3,"\u299f":e.MO.BIN3,"\u29a0":e.MO.BIN3,"\u29a1":e.MO.BIN3,"\u29a2":e.MO.BIN3,"\u29a3":e.MO.BIN3,"\u29a4":e.MO.BIN3,"\u29a5":e.MO.BIN3,"\u29a6":e.MO.BIN3,"\u29a7":e.MO.BIN3,"\u29a8":e.MO.BIN3,"\u29a9":e.MO.BIN3,"\u29aa":e.MO.BIN3,"\u29ab":e.MO.BIN3,"\u29ac":e.MO.BIN3,"\u29ad":e.MO.BIN3,"\u29ae":e.MO.BIN3,"\u29af":e.MO.BIN3,"\u29b0":e.MO.BIN3,"\u29b1":e.MO.BIN3,"\u29b2":e.MO.BIN3,"\u29b3":e.MO.BIN3,"\u29b4":e.MO.BIN3,"\u29b5":e.MO.BIN3,"\u29b6":e.MO.BIN4,"\u29b7":e.MO.BIN4,"\u29b8":e.MO.BIN4,"\u29b9":e.MO.BIN4,"\u29ba":e.MO.BIN4,"\u29bb":e.MO.BIN4,"\u29bc":e.MO.BIN4,"\u29bd":e.MO.BIN4,"\u29be":e.MO.BIN4,"\u29bf":e.MO.BIN4,"\u29c0":e.MO.REL,"\u29c1":e.MO.REL,"\u29c2":e.MO.BIN3,"\u29c3":e.MO.BIN3,"\u29c4":e.MO.BIN4,"\u29c5":e.MO.BIN4,"\u29c6":e.MO.BIN4,"\u29c7":e.MO.BIN4,"\u29c8":e.MO.BIN4,"\u29c9":e.MO.BIN3,"\u29ca":e.MO.BIN3,"\u29cb":e.MO.BIN3,"\u29cc":e.MO.BIN3,"\u29cd":e.MO.BIN3,"\u29ce":e.MO.REL,"\u29cf":e.MO.REL,"\u29cf\u0338":e.MO.REL,"\u29d0":e.MO.REL,"\u29d0\u0338":e.MO.REL,"\u29d1":e.MO.REL,"\u29d2":e.MO.REL,"\u29d3":e.MO.REL,"\u29d4":e.MO.REL,"\u29d5":e.MO.REL,"\u29d6":e.MO.BIN4,"\u29d7":e.MO.BIN4,"\u29d8":e.MO.BIN3,"\u29d9":e.MO.BIN3,"\u29db":e.MO.BIN3,"\u29dc":e.MO.BIN3,"\u29dd":e.MO.BIN3,"\u29de":e.MO.REL,"\u29df":e.MO.BIN3,"\u29e0":e.MO.BIN3,"\u29e1":e.MO.REL,"\u29e2":e.MO.BIN4,"\u29e3":e.MO.REL,"\u29e4":e.MO.REL,"\u29e5":e.MO.REL,"\u29e6":e.MO.REL,"\u29e7":e.MO.BIN3,"\u29e8":e.MO.BIN3,"\u29e9":e.MO.BIN3,"\u29ea":e.MO.BIN3,"\u29eb":e.MO.BIN3,"\u29ec":e.MO.BIN3,"\u29ed":e.MO.BIN3,"\u29ee":e.MO.BIN3,"\u29ef":e.MO.BIN3,"\u29f0":e.MO.BIN3,"\u29f1":e.MO.BIN3,"\u29f2":e.MO.BIN3,"\u29f3":e.MO.BIN3,"\u29f4":e.MO.REL,"\u29f5":e.MO.BIN4,"\u29f6":e.MO.BIN4,"\u29f7":e.MO.BIN4,"\u29f8":e.MO.BIN3,"\u29f9":e.MO.BIN3,"\u29fa":e.MO.BIN3,"\u29fb":e.MO.BIN3,"\u29fe":e.MO.BIN4,"\u29ff":e.MO.BIN4,"\u2a1d":e.MO.BIN3,"\u2a1e":e.MO.BIN3,"\u2a1f":e.MO.BIN3,"\u2a20":e.MO.BIN3,"\u2a21":e.MO.BIN3,"\u2a22":e.MO.BIN4,"\u2a23":e.MO.BIN4,"\u2a24":e.MO.BIN4,"\u2a25":e.MO.BIN4,"\u2a26":e.MO.BIN4,"\u2a27":e.MO.BIN4,"\u2a28":e.MO.BIN4,"\u2a29":e.MO.BIN4,"\u2a2a":e.MO.BIN4,"\u2a2b":e.MO.BIN4,"\u2a2c":e.MO.BIN4,"\u2a2d":e.MO.BIN4,"\u2a2e":e.MO.BIN4,"\u2a2f":e.MO.BIN4,"\u2a30":e.MO.BIN4,"\u2a31":e.MO.BIN4,"\u2a32":e.MO.BIN4,"\u2a33":e.MO.BIN4,"\u2a34":e.MO.BIN4,"\u2a35":e.MO.BIN4,"\u2a36":e.MO.BIN4,"\u2a37":e.MO.BIN4,"\u2a38":e.MO.BIN4,"\u2a39":e.MO.BIN4,"\u2a3a":e.MO.BIN4,"\u2a3b":e.MO.BIN4,"\u2a3c":e.MO.BIN4,"\u2a3d":e.MO.BIN4,"\u2a3e":e.MO.BIN4,"\u2a3f":e.MO.BIN4,"\u2a40":e.MO.BIN4,"\u2a41":e.MO.BIN4,"\u2a42":e.MO.BIN4,"\u2a43":e.MO.BIN4,"\u2a44":e.MO.BIN4,"\u2a45":e.MO.BIN4,"\u2a46":e.MO.BIN4,"\u2a47":e.MO.BIN4,"\u2a48":e.MO.BIN4,"\u2a49":e.MO.BIN4,"\u2a4a":e.MO.BIN4,"\u2a4b":e.MO.BIN4,"\u2a4c":e.MO.BIN4,"\u2a4d":e.MO.BIN4,"\u2a4e":e.MO.BIN4,"\u2a4f":e.MO.BIN4,"\u2a50":e.MO.BIN4,"\u2a51":e.MO.BIN4,"\u2a52":e.MO.BIN4,"\u2a53":e.MO.BIN4,"\u2a54":e.MO.BIN4,"\u2a55":e.MO.BIN4,"\u2a56":e.MO.BIN4,"\u2a57":e.MO.BIN4,"\u2a58":e.MO.BIN4,"\u2a59":e.MO.REL,"\u2a5a":e.MO.BIN4,"\u2a5b":e.MO.BIN4,"\u2a5c":e.MO.BIN4,"\u2a5d":e.MO.BIN4,"\u2a5e":e.MO.BIN4,"\u2a5f":e.MO.BIN4,"\u2a60":e.MO.BIN4,"\u2a61":e.MO.BIN4,"\u2a62":e.MO.BIN4,"\u2a63":e.MO.BIN4,"\u2a64":e.MO.BIN4,"\u2a65":e.MO.BIN4,"\u2a66":e.MO.REL,"\u2a67":e.MO.REL,"\u2a68":e.MO.REL,"\u2a69":e.MO.REL,"\u2a6a":e.MO.REL,"\u2a6b":e.MO.REL,"\u2a6c":e.MO.REL,"\u2a6d":e.MO.REL,"\u2a6e":e.MO.REL,"\u2a6f":e.MO.REL,"\u2a70":e.MO.REL,"\u2a71":e.MO.BIN4,"\u2a72":e.MO.BIN4,"\u2a73":e.MO.REL,"\u2a74":e.MO.REL,"\u2a75":e.MO.REL,"\u2a76":e.MO.REL,"\u2a77":e.MO.REL,"\u2a78":e.MO.REL,"\u2a79":e.MO.REL,"\u2a7a":e.MO.REL,"\u2a7b":e.MO.REL,"\u2a7c":e.MO.REL,"\u2a7d":e.MO.REL,"\u2a7d\u0338":e.MO.REL,"\u2a7e":e.MO.REL,"\u2a7e\u0338":e.MO.REL,"\u2a7f":e.MO.REL,"\u2a80":e.MO.REL,"\u2a81":e.MO.REL,"\u2a82":e.MO.REL,"\u2a83":e.MO.REL,"\u2a84":e.MO.REL,"\u2a85":e.MO.REL,"\u2a86":e.MO.REL,"\u2a87":e.MO.REL,"\u2a88":e.MO.REL,"\u2a89":e.MO.REL,"\u2a8a":e.MO.REL,"\u2a8b":e.MO.REL,"\u2a8c":e.MO.REL,"\u2a8d":e.MO.REL,"\u2a8e":e.MO.REL,"\u2a8f":e.MO.REL,"\u2a90":e.MO.REL,"\u2a91":e.MO.REL,"\u2a92":e.MO.REL,"\u2a93":e.MO.REL,"\u2a94":e.MO.REL,"\u2a95":e.MO.REL,"\u2a96":e.MO.REL,"\u2a97":e.MO.REL,"\u2a98":e.MO.REL,"\u2a99":e.MO.REL,"\u2a9a":e.MO.REL,"\u2a9b":e.MO.REL,"\u2a9c":e.MO.REL,"\u2a9d":e.MO.REL,"\u2a9e":e.MO.REL,"\u2a9f":e.MO.REL,"\u2aa0":e.MO.REL,"\u2aa1":e.MO.REL,"\u2aa1\u0338":e.MO.REL,"\u2aa2":e.MO.REL,"\u2aa2\u0338":e.MO.REL,"\u2aa3":e.MO.REL,"\u2aa4":e.MO.REL,"\u2aa5":e.MO.REL,"\u2aa6":e.MO.REL,"\u2aa7":e.MO.REL,"\u2aa8":e.MO.REL,"\u2aa9":e.MO.REL,"\u2aaa":e.MO.REL,"\u2aab":e.MO.REL,"\u2aac":e.MO.REL,"\u2aad":e.MO.REL,"\u2aae":e.MO.REL,"\u2aaf":e.MO.REL,"\u2aaf\u0338":e.MO.REL,"\u2ab0":e.MO.REL,"\u2ab0\u0338":e.MO.REL,"\u2ab1":e.MO.REL,"\u2ab2":e.MO.REL,"\u2ab3":e.MO.REL,"\u2ab4":e.MO.REL,"\u2ab5":e.MO.REL,"\u2ab6":e.MO.REL,"\u2ab7":e.MO.REL,"\u2ab8":e.MO.REL,"\u2ab9":e.MO.REL,"\u2aba":e.MO.REL,"\u2abb":e.MO.REL,"\u2abc":e.MO.REL,"\u2abd":e.MO.REL,"\u2abe":e.MO.REL,"\u2abf":e.MO.REL,"\u2ac0":e.MO.REL,"\u2ac1":e.MO.REL,"\u2ac2":e.MO.REL,"\u2ac3":e.MO.REL,"\u2ac4":e.MO.REL,"\u2ac5":e.MO.REL,"\u2ac6":e.MO.REL,"\u2ac7":e.MO.REL,"\u2ac8":e.MO.REL,"\u2ac9":e.MO.REL,"\u2aca":e.MO.REL,"\u2acb":e.MO.REL,"\u2acc":e.MO.REL,"\u2acd":e.MO.REL,"\u2ace":e.MO.REL,"\u2acf":e.MO.REL,"\u2ad0":e.MO.REL,"\u2ad1":e.MO.REL,"\u2ad2":e.MO.REL,"\u2ad3":e.MO.REL,"\u2ad4":e.MO.REL,"\u2ad5":e.MO.REL,"\u2ad6":e.MO.REL,"\u2ad7":e.MO.REL,"\u2ad8":e.MO.REL,"\u2ad9":e.MO.REL,"\u2ada":e.MO.REL,"\u2adb":e.MO.REL,"\u2add":e.MO.REL,"\u2add\u0338":e.MO.REL,"\u2ade":e.MO.REL,"\u2adf":e.MO.REL,"\u2ae0":e.MO.REL,"\u2ae1":e.MO.REL,"\u2ae2":e.MO.REL,"\u2ae3":e.MO.REL,"\u2ae4":e.MO.REL,"\u2ae5":e.MO.REL,"\u2ae6":e.MO.REL,"\u2ae7":e.MO.REL,"\u2ae8":e.MO.REL,"\u2ae9":e.MO.REL,"\u2aea":e.MO.REL,"\u2aeb":e.MO.REL,"\u2aec":e.MO.REL,"\u2aed":e.MO.REL,"\u2aee":e.MO.REL,"\u2aef":e.MO.REL,"\u2af0":e.MO.REL,"\u2af1":e.MO.REL,"\u2af2":e.MO.REL,"\u2af3":e.MO.REL,"\u2af4":e.MO.BIN4,"\u2af5":e.MO.BIN4,"\u2af6":e.MO.BIN4,"\u2af7":e.MO.REL,"\u2af8":e.MO.REL,"\u2af9":e.MO.REL,"\u2afa":e.MO.REL,"\u2afb":e.MO.BIN4,"\u2afd":e.MO.BIN4,"\u2afe":e.MO.BIN3,"\u2b45":e.MO.RELSTRETCH,"\u2b46":e.MO.RELSTRETCH,"\u3008":e.MO.OPEN,"\u3009":e.MO.CLOSE,"\ufe37":e.MO.WIDEACCENT,"\ufe38":e.MO.WIDEACCENT}},e.OPTABLE.infix["^"]=e.MO.WIDEREL,e.OPTABLE.infix._=e.MO.WIDEREL,e.OPTABLE.infix["\u2adc"]=e.MO.REL},9259:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.SerializedMmlVisitor=e.toEntity=e.DATAMJX=void 0;var a=r(6325),l=r(9007),c=r(450);e.DATAMJX="data-mjx-";e.toEntity=function(t){return"&#x"+t.codePointAt(0).toString(16).toUpperCase()+";"};var u=function(t){function r(){return null!==t&&t.apply(this,arguments)||this}return o(r,t),r.prototype.visitTree=function(t){return this.visitNode(t,"")},r.prototype.visitTextNode=function(t,e){return this.quoteHTML(t.getText())},r.prototype.visitXMLNode=function(t,e){return e+t.getSerializedXML()},r.prototype.visitInferredMrowNode=function(t,e){var r,n,o=[];try{for(var s=i(t.childNodes),a=s.next();!a.done;a=s.next()){var l=a.value;o.push(this.visitNode(l,e))}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return o.join("\n")},r.prototype.visitTeXAtomNode=function(t,e){var r=this.childNodeMml(t,e+" ","\n");return e+"<mrow"+this.getAttributes(t)+">"+(r.match(/\S/)?"\n"+r+e:"")+"</mrow>"},r.prototype.visitAnnotationNode=function(t,e){return e+"<annotation"+this.getAttributes(t)+">"+this.childNodeMml(t,"","")+"</annotation>"},r.prototype.visitDefault=function(t,e){var r=t.kind,n=s(t.isToken||0===t.childNodes.length?["",""]:["\n",e],2),o=n[0],i=n[1],a=this.childNodeMml(t,e+" ",o);return e+"<"+r+this.getAttributes(t)+">"+(a.match(/\S/)?o+a+i:"")+"</"+r+">"},r.prototype.childNodeMml=function(t,e,r){var n,o,s="";try{for(var a=i(t.childNodes),l=a.next();!l.done;l=a.next()){var c=l.value;s+=this.visitNode(c,e)+r}}catch(t){n={error:t}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return s},r.prototype.getAttributes=function(t){var e,r,n=[],o=this.constructor.defaultAttributes[t.kind]||{},s=Object.assign({},o,this.getDataAttributes(t),t.attributes.getAllAttributes()),a=this.constructor.variants;s.hasOwnProperty("mathvariant")&&a.hasOwnProperty(s.mathvariant)&&(s.mathvariant=a[s.mathvariant]);try{for(var l=i(Object.keys(s)),c=l.next();!c.done;c=l.next()){var u=c.value,p=String(s[u]);void 0!==p&&n.push(u+'="'+this.quoteHTML(p)+'"')}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(e)throw e.error}}return n.length?" "+n.join(" "):""},r.prototype.getDataAttributes=function(t){var e={},r=t.attributes.getExplicit("mathvariant"),n=this.constructor.variants;r&&n.hasOwnProperty(r)&&this.setDataAttribute(e,"variant",r),t.getProperty("variantForm")&&this.setDataAttribute(e,"alternate","1"),t.getProperty("pseudoscript")&&this.setDataAttribute(e,"pseudoscript","true"),!1===t.getProperty("autoOP")&&this.setDataAttribute(e,"auto-op","false");var o=t.getProperty("scriptalign");o&&this.setDataAttribute(e,"script-align",o);var i=t.getProperty("texClass");if(void 0!==i){var s=!0;if(i===l.TEXCLASS.OP&&t.isKind("mi")){var a=t.getText();s=!(a.length>1&&a.match(c.MmlMi.operatorName))}s&&this.setDataAttribute(e,"texclass",i<0?"NONE":l.TEXCLASSNAMES[i])}return t.getProperty("scriptlevel")&&!1===t.getProperty("useHeight")&&this.setDataAttribute(e,"smallmatrix","true"),e},r.prototype.setDataAttribute=function(t,r,n){t[e.DATAMJX+r]=n},r.prototype.quoteHTML=function(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/\"/g,""").replace(/[\uD800-\uDBFF]./g,e.toEntity).replace(/[\u0080-\uD7FF\uE000-\uFFFF]/g,e.toEntity)},r.variants={"-tex-calligraphic":"script","-tex-bold-calligraphic":"bold-script","-tex-oldstyle":"normal","-tex-bold-oldstyle":"bold","-tex-mathit":"italic"},r.defaultAttributes={math:{xmlns:"http://www.w3.org/1998/Math/MathML"}},r}(a.MmlVisitor);e.SerializedMmlVisitor=u},2975:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractOutputJax=void 0;var n=r(7233),o=r(7525),i=function(){function t(t){void 0===t&&(t={}),this.adaptor=null;var e=this.constructor;this.options=(0,n.userOptions)((0,n.defaultOptions)({},e.OPTIONS),t),this.postFilters=new o.FunctionList}return Object.defineProperty(t.prototype,"name",{get:function(){return this.constructor.NAME},enumerable:!1,configurable:!0}),t.prototype.setAdaptor=function(t){this.adaptor=t},t.prototype.initialize=function(){},t.prototype.reset=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e]},t.prototype.getMetrics=function(t){},t.prototype.styleSheet=function(t){return null},t.prototype.pageElements=function(t){return null},t.prototype.executeFilters=function(t,e,r,n){var o={math:e,document:r,data:n};return t.execute(o),o.data},t.NAME="generic",t.OPTIONS={},t}();e.AbstractOutputJax=i},4574:function(t,e){var r=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractFactory=void 0;var i=function(){function t(t){var e,n;void 0===t&&(t=null),this.defaultKind="unknown",this.nodeMap=new Map,this.node={},null===t&&(t=this.constructor.defaultNodes);try{for(var o=r(Object.keys(t)),i=o.next();!i.done;i=o.next()){var s=i.value;this.setNodeClass(s,t[s])}}catch(t){e={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(e)throw e.error}}}return t.prototype.create=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];return(this.node[t]||this.node[this.defaultKind]).apply(void 0,o([],n(e),!1))},t.prototype.setNodeClass=function(t,e){this.nodeMap.set(t,e);var r=this,i=this.nodeMap.get(t);this.node[t]=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return new(i.bind.apply(i,o([void 0,r],n(t),!1)))}},t.prototype.getNodeClass=function(t){return this.nodeMap.get(t)},t.prototype.deleteNodeClass=function(t){this.nodeMap.delete(t),delete this.node[t]},t.prototype.nodeIsKind=function(t,e){return t instanceof this.getNodeClass(e)},t.prototype.getKinds=function(){return Array.from(this.nodeMap.keys())},t.defaultNodes={},t}();e.AbstractFactory=i},4596:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__assign||function(){return o=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},o.apply(this,arguments)},i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEmptyNode=e.AbstractNode=void 0;var s=function(){function t(t,e,r){var n,o;void 0===e&&(e={}),void 0===r&&(r=[]),this.factory=t,this.parent=null,this.properties={},this.childNodes=[];try{for(var s=i(Object.keys(e)),a=s.next();!a.done;a=s.next()){var l=a.value;this.setProperty(l,e[l])}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}r.length&&this.setChildren(r)}return Object.defineProperty(t.prototype,"kind",{get:function(){return"unknown"},enumerable:!1,configurable:!0}),t.prototype.setProperty=function(t,e){this.properties[t]=e},t.prototype.getProperty=function(t){return this.properties[t]},t.prototype.getPropertyNames=function(){return Object.keys(this.properties)},t.prototype.getAllProperties=function(){return this.properties},t.prototype.removeProperty=function(){for(var t,e,r=[],n=0;n<arguments.length;n++)r[n]=arguments[n];try{for(var o=i(r),s=o.next();!s.done;s=o.next()){var a=s.value;delete this.properties[a]}}catch(e){t={error:e}}finally{try{s&&!s.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}},t.prototype.isKind=function(t){return this.factory.nodeIsKind(this,t)},t.prototype.setChildren=function(t){var e,r;this.childNodes=[];try{for(var n=i(t),o=n.next();!o.done;o=n.next()){var s=o.value;this.appendChild(s)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},t.prototype.appendChild=function(t){return this.childNodes.push(t),t.parent=this,t},t.prototype.replaceChild=function(t,e){var r=this.childIndex(e);return null!==r&&(this.childNodes[r]=t,t.parent=this,e.parent=null),t},t.prototype.removeChild=function(t){var e=this.childIndex(t);return null!==e&&(this.childNodes.splice(e,1),t.parent=null),t},t.prototype.childIndex=function(t){var e=this.childNodes.indexOf(t);return-1===e?null:e},t.prototype.copy=function(){var t,e,r=this.factory.create(this.kind);r.properties=o({},this.properties);try{for(var n=i(this.childNodes||[]),s=n.next();!s.done;s=n.next()){var a=s.value;a&&r.appendChild(a.copy())}}catch(e){t={error:e}}finally{try{s&&!s.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},t.prototype.findNodes=function(t){var e=[];return this.walkTree((function(r){r.isKind(t)&&e.push(r)})),e},t.prototype.walkTree=function(t,e){var r,n;t(this,e);try{for(var o=i(this.childNodes),s=o.next();!s.done;s=o.next()){var a=s.value;a&&a.walkTree(t,e)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return e},t.prototype.toString=function(){return this.kind+"("+this.childNodes.join(",")+")"},t}();e.AbstractNode=s;var a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.setChildren=function(t){},e.prototype.appendChild=function(t){return t},e.prototype.replaceChild=function(t,e){return e},e.prototype.childIndex=function(t){return null},e.prototype.walkTree=function(t,e){return t(this,e),e},e.prototype.toString=function(){return this.kind},e}(s);e.AbstractEmptyNode=a},7860:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractNodeFactory=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.create=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.node[t](e,r)},e}(r(4574).AbstractFactory);e.AbstractNodeFactory=i},8823:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractVisitor=void 0;var s=r(4596),a=function(){function t(e){var r,o;this.nodeHandlers=new Map;try{for(var i=n(e.getKinds()),s=i.next();!s.done;s=i.next()){var a=s.value,l=this[t.methodName(a)];l&&this.nodeHandlers.set(a,l)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(o=i.return)&&o.call(i)}finally{if(r)throw r.error}}}return t.methodName=function(t){return"visit"+(t.charAt(0).toUpperCase()+t.substr(1)).replace(/[^a-z0-9_]/gi,"_")+"Node"},t.prototype.visitTree=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];return this.visitNode.apply(this,i([t],o(e),!1))},t.prototype.visitNode=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];var n=this.nodeHandlers.get(t.kind)||this.visitDefault;return n.call.apply(n,i([this,t],o(e),!1))},t.prototype.visitDefault=function(t){for(var e,r,a=[],l=1;l<arguments.length;l++)a[l-1]=arguments[l];if(t instanceof s.AbstractNode)try{for(var c=n(t.childNodes),u=c.next();!u.done;u=c.next()){var p=u.value;this.visitNode.apply(this,i([p],o(a),!1))}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}},t.prototype.setNodeHandler=function(t,e){this.nodeHandlers.set(t,e)},t.prototype.removeNodeHandler=function(t){this.nodeHandlers.delete(t)},t}();e.AbstractVisitor=a},8912:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractWrapper=void 0;var r=function(){function t(t,e){this.factory=t,this.node=e}return Object.defineProperty(t.prototype,"kind",{get:function(){return this.node.kind},enumerable:!1,configurable:!0}),t.prototype.wrap=function(t){return this.factory.wrap(t)},t}();e.AbstractWrapper=r},3811:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractWrapperFactory=void 0;var a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.wrap=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];return this.create.apply(this,s([t.kind,t],i(e),!1))},e}(r(4574).AbstractFactory);e.AbstractWrapperFactory=a},6272:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.RegisterHTMLHandler=void 0;var n=r(5713),o=r(3726);e.RegisterHTMLHandler=function(t){var e=new o.HTMLHandler(t);return n.mathjax.handlers.register(e),e}},3683:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLDocument=void 0;var l=r(5722),c=r(7233),u=r(3363),p=r(3335),h=r(5138),f=r(4474),d=function(t){function e(e,r,n){var o=this,i=s((0,c.separateOptions)(n,h.HTMLDomStrings.OPTIONS),2),a=i[0],l=i[1];return(o=t.call(this,e,r,a)||this).domStrings=o.options.DomStrings||new h.HTMLDomStrings(l),o.domStrings.adaptor=r,o.styles=[],o}return o(e,t),e.prototype.findPosition=function(t,e,r,n){var o,i,l=this.adaptor;try{for(var c=a(n[t]),u=c.next();!u.done;u=c.next()){var p=u.value,h=s(p,2),f=h[0],d=h[1];if(e<=d&&"#text"===l.kind(f))return{node:f,n:Math.max(e,0),delim:r};e-=d}}catch(t){o={error:t}}finally{try{u&&!u.done&&(i=c.return)&&i.call(c)}finally{if(o)throw o.error}}return{node:null,n:0,delim:r}},e.prototype.mathItem=function(t,e,r){var n=t.math,o=this.findPosition(t.n,t.start.n,t.open,r),i=this.findPosition(t.n,t.end.n,t.close,r);return new this.options.MathItem(n,e,t.display,o,i)},e.prototype.findMath=function(t){var e,r,n,o,i,l,u,p,h;if(!this.processed.isSet("findMath")){this.adaptor.document=this.document,t=(0,c.userOptions)({elements:this.options.elements||[this.adaptor.body(this.document)]},t);try{for(var f=a(this.adaptor.getElements(t.elements,this.document)),d=f.next();!d.done;d=f.next()){var m=d.value,y=s([null,null],2),g=y[0],b=y[1];try{for(var v=(n=void 0,a(this.inputJax)),_=v.next();!_.done;_=v.next()){var S=_.value,O=new this.options.MathList;if(S.processStrings){null===g&&(g=(i=s(this.domStrings.find(m),2))[0],b=i[1]);try{for(var M=(l=void 0,a(S.findMath(g))),x=M.next();!x.done;x=M.next()){var E=x.value;O.push(this.mathItem(E,S,b))}}catch(t){l={error:t}}finally{try{x&&!x.done&&(u=M.return)&&u.call(M)}finally{if(l)throw l.error}}}else try{for(var A=(p=void 0,a(S.findMath(m))),C=A.next();!C.done;C=A.next()){E=C.value;var T=new this.options.MathItem(E.math,S,E.display,E.start,E.end);O.push(T)}}catch(t){p={error:t}}finally{try{C&&!C.done&&(h=A.return)&&h.call(A)}finally{if(p)throw p.error}}this.math.merge(O)}}catch(t){n={error:t}}finally{try{_&&!_.done&&(o=v.return)&&o.call(v)}finally{if(n)throw n.error}}}}catch(t){e={error:t}}finally{try{d&&!d.done&&(r=f.return)&&r.call(f)}finally{if(e)throw e.error}}this.processed.set("findMath")}return this},e.prototype.updateDocument=function(){return this.processed.isSet("updateDocument")||(this.addPageElements(),this.addStyleSheet(),t.prototype.updateDocument.call(this),this.processed.set("updateDocument")),this},e.prototype.addPageElements=function(){var t=this.adaptor.body(this.document),e=this.documentPageElements();e&&this.adaptor.append(t,e)},e.prototype.addStyleSheet=function(){var t=this.documentStyleSheet(),e=this.adaptor;if(t&&!e.parent(t)){var r=e.head(this.document),n=this.findSheet(r,e.getAttribute(t,"id"));n?e.replace(t,n):e.append(r,t)}},e.prototype.findSheet=function(t,e){var r,n;if(e)try{for(var o=a(this.adaptor.tags(t,"style")),i=o.next();!i.done;i=o.next()){var s=i.value;if(this.adaptor.getAttribute(s,"id")===e)return s}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return null},e.prototype.removeFromDocument=function(t){var e,r;if(void 0===t&&(t=!1),this.processed.isSet("updateDocument"))try{for(var n=a(this.math),o=n.next();!o.done;o=n.next()){var i=o.value;i.state()>=f.STATE.INSERTED&&i.state(f.STATE.TYPESET,t)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this.processed.clear("updateDocument"),this},e.prototype.documentStyleSheet=function(){return this.outputJax.styleSheet(this)},e.prototype.documentPageElements=function(){return this.outputJax.pageElements(this)},e.prototype.addStyles=function(t){this.styles.push(t)},e.prototype.getStyles=function(){return this.styles},e.KIND="HTML",e.OPTIONS=i(i({},l.AbstractMathDocument.OPTIONS),{renderActions:(0,c.expandable)(i(i({},l.AbstractMathDocument.OPTIONS.renderActions),{styles:[f.STATE.INSERTED+1,"","updateStyleSheet",!1]})),MathList:p.HTMLMathList,MathItem:u.HTMLMathItem,DomStrings:null}),e}(l.AbstractMathDocument);e.HTMLDocument=d},5138:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLDomStrings=void 0;var o=r(7233),i=function(){function t(t){void 0===t&&(t=null);var e=this.constructor;this.options=(0,o.userOptions)((0,o.defaultOptions)({},e.OPTIONS),t),this.init(),this.getPatterns()}return t.prototype.init=function(){this.strings=[],this.string="",this.snodes=[],this.nodes=[],this.stack=[]},t.prototype.getPatterns=function(){var t=(0,o.makeArray)(this.options.skipHtmlTags),e=(0,o.makeArray)(this.options.ignoreHtmlClass),r=(0,o.makeArray)(this.options.processHtmlClass);this.skipHtmlTags=new RegExp("^(?:"+t.join("|")+")$","i"),this.ignoreHtmlClass=new RegExp("(?:^| )(?:"+e.join("|")+")(?: |$)"),this.processHtmlClass=new RegExp("(?:^| )(?:"+r+")(?: |$)")},t.prototype.pushString=function(){this.string.match(/\S/)&&(this.strings.push(this.string),this.nodes.push(this.snodes)),this.string="",this.snodes=[]},t.prototype.extendString=function(t,e){this.snodes.push([t,e.length]),this.string+=e},t.prototype.handleText=function(t,e){return e||this.extendString(t,this.adaptor.value(t)),this.adaptor.next(t)},t.prototype.handleTag=function(t,e){if(!e){var r=this.options.includeHtmlTags[this.adaptor.kind(t)];this.extendString(t,r)}return this.adaptor.next(t)},t.prototype.handleContainer=function(t,e){this.pushString();var r=this.adaptor.getAttribute(t,"class")||"",n=this.adaptor.kind(t)||"",o=this.processHtmlClass.exec(r),i=t;return!this.adaptor.firstChild(t)||this.adaptor.getAttribute(t,"data-MJX")||!o&&this.skipHtmlTags.exec(n)?i=this.adaptor.next(t):(this.adaptor.next(t)&&this.stack.push([this.adaptor.next(t),e]),i=this.adaptor.firstChild(t),e=(e||this.ignoreHtmlClass.exec(r))&&!o),[i,e]},t.prototype.handleOther=function(t,e){return this.pushString(),this.adaptor.next(t)},t.prototype.find=function(t){var e,r;this.init();for(var o=this.adaptor.next(t),i=!1,s=this.options.includeHtmlTags;t&&t!==o;){var a=this.adaptor.kind(t);"#text"===a?t=this.handleText(t,i):s.hasOwnProperty(a)?t=this.handleTag(t,i):a?(t=(e=n(this.handleContainer(t,i),2))[0],i=e[1]):t=this.handleOther(t,i),!t&&this.stack.length&&(this.pushString(),t=(r=n(this.stack.pop(),2))[0],i=r[1])}this.pushString();var l=[this.strings,this.nodes];return this.init(),l},t.OPTIONS={skipHtmlTags:["script","noscript","style","textarea","pre","code","annotation","annotation-xml"],includeHtmlTags:{br:"\n",wbr:"","#comment":""},ignoreHtmlClass:"mathjax_ignore",processHtmlClass:"mathjax_process"},t}();e.HTMLDomStrings=i},3726:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLHandler=void 0;var i=r(3670),s=r(3683),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.documentClass=s.HTMLDocument,e}return o(e,t),e.prototype.handlesDocument=function(t){var e=this.adaptor;if("string"==typeof t)try{t=e.parse(t,"text/html")}catch(t){}return t instanceof e.window.Document||t instanceof e.window.HTMLElement||t instanceof e.window.DocumentFragment},e.prototype.create=function(e,r){var n=this.adaptor;if("string"==typeof e)e=n.parse(e,"text/html");else if(e instanceof n.window.HTMLElement||e instanceof n.window.DocumentFragment){var o=e;e=n.parse("","text/html"),n.append(n.body(e),o)}return t.prototype.create.call(this,e,r)},e}(i.AbstractHandler);e.HTMLHandler=a},3363:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLMathItem=void 0;var i=r(4474),s=function(t){function e(e,r,n,o,i){return void 0===n&&(n=!0),void 0===o&&(o={node:null,n:0,delim:""}),void 0===i&&(i={node:null,n:0,delim:""}),t.call(this,e,r,n,o,i)||this}return o(e,t),Object.defineProperty(e.prototype,"adaptor",{get:function(){return this.inputJax.adaptor},enumerable:!1,configurable:!0}),e.prototype.updateDocument=function(t){if(this.state()<i.STATE.INSERTED){if(this.inputJax.processStrings){var e=this.start.node;if(e===this.end.node)this.end.n&&this.end.n<this.adaptor.value(this.end.node).length&&this.adaptor.split(this.end.node,this.end.n),this.start.n&&(e=this.adaptor.split(this.start.node,this.start.n)),this.adaptor.replace(this.typesetRoot,e);else{for(this.start.n&&(e=this.adaptor.split(e,this.start.n));e!==this.end.node;){var r=this.adaptor.next(e);this.adaptor.remove(e),e=r}this.adaptor.insert(this.typesetRoot,e),this.end.n<this.adaptor.value(e).length&&this.adaptor.split(e,this.end.n),this.adaptor.remove(e)}}else this.adaptor.replace(this.typesetRoot,this.start.node);this.start.node=this.end.node=this.typesetRoot,this.start.n=this.end.n=0,this.state(i.STATE.INSERTED)}},e.prototype.updateStyleSheet=function(t){t.addStyleSheet()},e.prototype.removeFromDocument=function(t){if(void 0===t&&(t=!1),this.state()>=i.STATE.TYPESET){var e=this.adaptor,r=this.start.node,n=e.text("");if(t){var o=this.start.delim+this.math+this.end.delim;if(this.inputJax.processStrings)n=e.text(o);else{var s=e.parse(o,"text/html");n=e.firstChild(e.body(s))}}e.parent(r)&&e.replace(n,r),this.start.node=this.end.node=n,this.start.n=this.end.n=0}},e}(i.AbstractMathItem);e.HTMLMathItem=s},3335:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLMathList=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(r(9e3).AbstractMathList);e.HTMLMathList=i},8462:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.TeX=void 0;var l=r(9206),c=r(7233),u=r(7073),p=a(r(4676)),h=a(r(1256)),f=a(r(8417)),d=a(r(3971)),m=a(r(8562)),y=r(6521),g=r(9899);r(2942);var b=function(t){function e(r){void 0===r&&(r={});var n=this,o=s((0,c.separateOptions)(r,e.OPTIONS,u.FindTeX.OPTIONS),3),i=o[0],a=o[1],l=o[2];(n=t.call(this,a)||this).findTeX=n.options.FindTeX||new u.FindTeX(l);var h=n.options.packages,f=n.configuration=e.configure(h),d=n._parseOptions=new m.default(f,[n.options,y.TagsFactory.OPTIONS]);return(0,c.userOptions)(d.options,i),f.config(n),e.tags(d,f),n.postFilters.add(p.default.cleanSubSup,-6),n.postFilters.add(p.default.setInherited,-5),n.postFilters.add(p.default.moveLimits,-4),n.postFilters.add(p.default.cleanStretchy,-3),n.postFilters.add(p.default.cleanAttributes,-2),n.postFilters.add(p.default.combineRelations,-1),n}return o(e,t),e.configure=function(t){var e=new g.ParserConfiguration(t,["tex"]);return e.init(),e},e.tags=function(t,e){y.TagsFactory.addTags(e.tags),y.TagsFactory.setDefault(t.options.tags),t.tags=y.TagsFactory.getDefault(),t.tags.configuration=t},e.prototype.setMmlFactory=function(e){t.prototype.setMmlFactory.call(this,e),this._parseOptions.nodeFactory.setMmlFactory(e)},Object.defineProperty(e.prototype,"parseOptions",{get:function(){return this._parseOptions},enumerable:!1,configurable:!0}),e.prototype.reset=function(t){void 0===t&&(t=0),this.parseOptions.tags.reset(t)},e.prototype.compile=function(t,e){this.parseOptions.clear(),this.executeFilters(this.preFilters,t,e,this.parseOptions);var r,n,o=t.display;this.latex=t.math,this.parseOptions.tags.startEquation(t);try{var i=new f.default(this.latex,{display:o,isInner:!1},this.parseOptions);r=i.mml(),n=i.stack.global}catch(t){if(!(t instanceof d.default))throw t;this.parseOptions.error=!0,r=this.options.formatError(this,t)}return r=this.parseOptions.nodeFactory.create("node","math",[r]),(null==n?void 0:n.indentalign)&&h.default.setAttribute(r,"indentalign",n.indentalign),o&&h.default.setAttribute(r,"display","block"),this.parseOptions.tags.finishEquation(t),this.parseOptions.root=r,this.executeFilters(this.postFilters,t,e,this.parseOptions),this.mathNode=this.parseOptions.root,this.mathNode},e.prototype.findMath=function(t){return this.findTeX.findMath(t)},e.prototype.formatError=function(t){var e=t.message.replace(/\n.*/,"");return this.parseOptions.nodeFactory.create("error",e,t.id,this.latex)},e.NAME="TeX",e.OPTIONS=i(i({},l.AbstractInputJax.OPTIONS),{FindTeX:null,packages:["base"],digits:/^(?:[0-9]+(?:\{,\}[0-9]{3})*(?:\.[0-9]*)?|\.[0-9]+)/,maxBuffer:5120,formatError:function(t,e){return t.formatError(e)}}),e}(l.AbstractInputJax);e.TeX=b},9899:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.ParserConfiguration=e.ConfigurationHandler=e.Configuration=void 0;var i,s=r(7233),a=r(2947),l=r(7525),c=r(8666),u=r(6521),p=function(){function t(t,e,r,n,o,i,s,a,l,c,u,p,h){void 0===e&&(e={}),void 0===r&&(r={}),void 0===n&&(n={}),void 0===o&&(o={}),void 0===i&&(i={}),void 0===s&&(s={}),void 0===a&&(a=[]),void 0===l&&(l=[]),void 0===c&&(c=null),void 0===u&&(u=null),this.name=t,this.handler=e,this.fallback=r,this.items=n,this.tags=o,this.options=i,this.nodes=s,this.preprocessors=a,this.postprocessors=l,this.initMethod=c,this.configMethod=u,this.priority=p,this.parser=h,this.handler=Object.assign({character:[],delimiter:[],macro:[],environment:[]},e)}return t.makeProcessor=function(t,e){return Array.isArray(t)?t:[t,e]},t._create=function(e,r){var n=this;void 0===r&&(r={});var o=r.priority||c.PrioritizedList.DEFAULTPRIORITY,i=r.init?this.makeProcessor(r.init,o):null,s=r.config?this.makeProcessor(r.config,o):null,a=(r.preprocessors||[]).map((function(t){return n.makeProcessor(t,o)})),l=(r.postprocessors||[]).map((function(t){return n.makeProcessor(t,o)})),u=r.parser||"tex";return new t(e,r.handler||{},r.fallback||{},r.items||{},r.tags||{},r.options||{},r.nodes||{},a,l,i,s,o,u)},t.create=function(e,r){void 0===r&&(r={});var n=t._create(e,r);return i.set(e,n),n},t.local=function(e){return void 0===e&&(e={}),t._create("",e)},Object.defineProperty(t.prototype,"init",{get:function(){return this.initMethod?this.initMethod[0]:null},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"config",{get:function(){return this.configMethod?this.configMethod[0]:null},enumerable:!1,configurable:!0}),t}();e.Configuration=p,function(t){var e=new Map;t.set=function(t,r){e.set(t,r)},t.get=function(t){return e.get(t)},t.keys=function(){return e.keys()}}(i=e.ConfigurationHandler||(e.ConfigurationHandler={}));var h=function(){function t(t,e){var r,o,i,s;void 0===e&&(e=["tex"]),this.initMethod=new l.FunctionList,this.configMethod=new l.FunctionList,this.configurations=new c.PrioritizedList,this.parsers=[],this.handlers=new a.SubHandlers,this.items={},this.tags={},this.options={},this.nodes={},this.parsers=e;try{for(var u=n(t.slice().reverse()),p=u.next();!p.done;p=u.next()){var h=p.value;this.addPackage(h)}}catch(t){r={error:t}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(r)throw r.error}}try{for(var f=n(this.configurations),d=f.next();!d.done;d=f.next()){var m=d.value,y=m.item,g=m.priority;this.append(y,g)}}catch(t){i={error:t}}finally{try{d&&!d.done&&(s=f.return)&&s.call(f)}finally{if(i)throw i.error}}}return t.prototype.init=function(){this.initMethod.execute(this)},t.prototype.config=function(t){var e,r;this.configMethod.execute(this,t);try{for(var o=n(this.configurations),i=o.next();!i.done;i=o.next()){var s=i.value;this.addFilters(t,s.item)}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},t.prototype.addPackage=function(t){var e="string"==typeof t?t:t[0],r=this.getPackage(e);r&&this.configurations.add(r,"string"==typeof t?r.priority:t[1])},t.prototype.add=function(t,e,r){var o,i;void 0===r&&(r={});var a=this.getPackage(t);this.append(a),this.configurations.add(a,a.priority),this.init();var l=e.parseOptions;l.nodeFactory.setCreators(a.nodes);try{for(var c=n(Object.keys(a.items)),p=c.next();!p.done;p=c.next()){var h=p.value;l.itemFactory.setNodeClass(h,a.items[h])}}catch(t){o={error:t}}finally{try{p&&!p.done&&(i=c.return)&&i.call(c)}finally{if(o)throw o.error}}u.TagsFactory.addTags(a.tags),(0,s.defaultOptions)(l.options,a.options),(0,s.userOptions)(l.options,r),this.addFilters(e,a),a.config&&a.config(this,e)},t.prototype.getPackage=function(t){var e=i.get(t);if(e&&this.parsers.indexOf(e.parser)<0)throw Error("Package ".concat(t," doesn't target the proper parser"));return e},t.prototype.append=function(t,e){e=e||t.priority,t.initMethod&&this.initMethod.add(t.initMethod[0],t.initMethod[1]),t.configMethod&&this.configMethod.add(t.configMethod[0],t.configMethod[1]),this.handlers.add(t.handler,t.fallback,e),Object.assign(this.items,t.items),Object.assign(this.tags,t.tags),(0,s.defaultOptions)(this.options,t.options),Object.assign(this.nodes,t.nodes)},t.prototype.addFilters=function(t,e){var r,i,s,a;try{for(var l=n(e.preprocessors),c=l.next();!c.done;c=l.next()){var u=o(c.value,2),p=u[0],h=u[1];t.preFilters.add(p,h)}}catch(t){r={error:t}}finally{try{c&&!c.done&&(i=l.return)&&i.call(l)}finally{if(r)throw r.error}}try{for(var f=n(e.postprocessors),d=f.next();!d.done;d=f.next()){var m=o(d.value,2),y=m[0];h=m[1];t.postFilters.add(y,h)}}catch(t){s={error:t}}finally{try{d&&!d.done&&(a=f.return)&&a.call(f)}finally{if(s)throw s.error}}},t}();e.ParserConfiguration=h},4676:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var i,s=r(9007),a=o(r(1256));!function(t){t.cleanStretchy=function(t){var e,r,o=t.data;try{for(var i=n(o.getList("fixStretchy")),s=i.next();!s.done;s=i.next()){var l=s.value;if(a.default.getProperty(l,"fixStretchy")){var c=a.default.getForm(l);c&&c[3]&&c[3].stretchy&&a.default.setAttribute(l,"stretchy",!1);var u=l.parent;if(!(a.default.getTexClass(l)||c&&c[2])){var p=o.nodeFactory.create("node","TeXAtom",[l]);u.replaceChild(p,l),p.inheritAttributesFrom(l)}a.default.removeProperties(l,"fixStretchy")}}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},t.cleanAttributes=function(t){t.data.root.walkTree((function(t,e){var r,o,i=t.attributes;if(i){var s=new Set((i.get("mjx-keep-attrs")||"").split(/ /));delete i.getAllAttributes()["mjx-keep-attrs"];try{for(var a=n(i.getExplicitNames()),l=a.next();!l.done;l=a.next()){var c=l.value;s.has(c)||i.attributes[c]!==t.attributes.getInherited(c)||delete i.attributes[c]}}catch(t){r={error:t}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(r)throw r.error}}}}),{})},t.combineRelations=function(t){var o,i,l,c,u=[];try{for(var p=n(t.data.getList("mo")),h=p.next();!h.done;h=p.next()){var f=h.value;if(!f.getProperty("relationsCombined")&&f.parent&&(!f.parent||a.default.isType(f.parent,"mrow"))&&a.default.getTexClass(f)===s.TEXCLASS.REL){for(var d=f.parent,m=void 0,y=d.childNodes,g=y.indexOf(f)+1,b=a.default.getProperty(f,"variantForm");g<y.length&&(m=y[g])&&a.default.isType(m,"mo")&&a.default.getTexClass(m)===s.TEXCLASS.REL;){if(b!==a.default.getProperty(m,"variantForm")||!r(f,m)){null==f.attributes.getExplicit("rspace")&&a.default.setAttribute(f,"rspace","0pt"),null==m.attributes.getExplicit("lspace")&&a.default.setAttribute(m,"lspace","0pt");break}a.default.appendChildren(f,a.default.getChildren(m)),e(["stretchy","rspace"],f,m);try{for(var v=(l=void 0,n(m.getPropertyNames())),_=v.next();!_.done;_=v.next()){var S=_.value;f.setProperty(S,m.getProperty(S))}}catch(t){l={error:t}}finally{try{_&&!_.done&&(c=v.return)&&c.call(v)}finally{if(l)throw l.error}}y.splice(g,1),u.push(m),m.parent=null,m.setProperty("relationsCombined",!0)}f.attributes.setInherited("form",f.getForms()[0])}}}catch(t){o={error:t}}finally{try{h&&!h.done&&(i=p.return)&&i.call(p)}finally{if(o)throw o.error}}t.data.removeFromList("mo",u)};var e=function(t,e,r){var n=e.attributes,o=r.attributes;t.forEach((function(t){var e=o.getExplicit(t);null!=e&&n.set(t,e)}))},r=function(t,e){var r,o,i=function(t,e){return t.getExplicitNames().filter((function(r){return r!==e&&("stretchy"!==r||t.getExplicit("stretchy"))}))},s=t.attributes,a=e.attributes,l=i(s,"lspace"),c=i(a,"rspace");if(l.length!==c.length)return!1;try{for(var u=n(l),p=u.next();!p.done;p=u.next()){var h=p.value;if(s.getExplicit(h)!==a.getExplicit(h))return!1}}catch(t){r={error:t}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(r)throw r.error}}return!0},o=function(t,e,r){var o,i,s=[];try{for(var l=n(t.getList("m"+e+r)),c=l.next();!c.done;c=l.next()){var u=c.value,p=u.childNodes;if(!p[u[e]]||!p[u[r]]){var h=u.parent,f=p[u[e]]?t.nodeFactory.create("node","m"+e,[p[u.base],p[u[e]]]):t.nodeFactory.create("node","m"+r,[p[u.base],p[u[r]]]);a.default.copyAttributes(u,f),h?h.replaceChild(f,u):t.root=f,s.push(u)}}}catch(t){o={error:t}}finally{try{c&&!c.done&&(i=l.return)&&i.call(l)}finally{if(o)throw o.error}}t.removeFromList("m"+e+r,s)};t.cleanSubSup=function(t){var e=t.data;e.error||(o(e,"sub","sup"),o(e,"under","over"))};var i=function(t,e,r){var o,i,s=[];try{for(var l=n(t.getList(e)),c=l.next();!c.done;c=l.next()){var u=c.value;if(!u.attributes.get("displaystyle")){var p=u.childNodes[u.base],h=p.coreMO();if(p.getProperty("movablelimits")&&!h.attributes.getExplicit("movablelimits")){var f=t.nodeFactory.create("node",r,u.childNodes);a.default.copyAttributes(u,f),u.parent?u.parent.replaceChild(f,u):t.root=f,s.push(u)}}}}catch(t){o={error:t}}finally{try{c&&!c.done&&(i=l.return)&&i.call(l)}finally{if(o)throw o.error}}t.removeFromList(e,s)};t.moveLimits=function(t){var e=t.data;i(e,"munderover","msubsup"),i(e,"munder","msub"),i(e,"mover","msup")},t.setInherited=function(t){t.data.root.setInheritedAttributes({},t.math.display,0,!1)}}(i||(i={})),e.default=i},7073:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.FindTeX=void 0;var s=r(3494),a=r(505),l=r(4474),c=function(t){function e(e){var r=t.call(this,e)||this;return r.getPatterns(),r}return o(e,t),e.prototype.getPatterns=function(){var t=this,e=this.options,r=[],n=[],o=[];this.end={},this.env=this.sub=0;var i=1;e.inlineMath.forEach((function(e){return t.addPattern(r,e,!1)})),e.displayMath.forEach((function(e){return t.addPattern(r,e,!0)})),r.length&&n.push(r.sort(a.sortLength).join("|")),e.processEnvironments&&(n.push("\\\\begin\\s*\\{([^}]*)\\}"),this.env=i,i++),e.processEscapes&&o.push("\\\\([\\\\$])"),e.processRefs&&o.push("(\\\\(?:eq)?ref\\s*\\{[^}]*\\})"),o.length&&(n.push("("+o.join("|")+")"),this.sub=i),this.start=new RegExp(n.join("|"),"g"),this.hasPatterns=n.length>0},e.prototype.addPattern=function(t,e,r){var n=i(e,2),o=n[0],s=n[1];t.push((0,a.quotePattern)(o)),this.end[o]=[s,r,this.endPattern(s)]},e.prototype.endPattern=function(t,e){return new RegExp((e||(0,a.quotePattern)(t))+"|\\\\(?:[a-zA-Z]|.)|[{}]","g")},e.prototype.findEnd=function(t,e,r,n){for(var o,s=i(n,3),a=s[0],c=s[1],u=s[2],p=u.lastIndex=r.index+r[0].length,h=0;o=u.exec(t);){if((o[1]||o[0])===a&&0===h)return(0,l.protoItem)(r[0],t.substr(p,o.index-p),o[0],e,r.index,o.index+o[0].length,c);"{"===o[0]?h++:"}"===o[0]&&h&&h--}return null},e.prototype.findMathInString=function(t,e,r){var n,o;for(this.start.lastIndex=0;n=this.start.exec(r);){if(void 0!==n[this.env]&&this.env){var i="\\\\end\\s*(\\{"+(0,a.quotePattern)(n[this.env])+"\\})";(o=this.findEnd(r,e,n,["{"+n[this.env]+"}",!0,this.endPattern(null,i)]))&&(o.math=o.open+o.math+o.close,o.open=o.close="")}else if(void 0!==n[this.sub]&&this.sub){var s=n[this.sub];i=n.index+n[this.sub].length;o=2===s.length?(0,l.protoItem)("",s.substr(1),"",e,n.index,i):(0,l.protoItem)("",s,"",e,n.index,i,!1)}else o=this.findEnd(r,e,n,this.end[n[0]]);o&&(t.push(o),this.start.lastIndex=o.end.n)}},e.prototype.findMath=function(t){var e=[];if(this.hasPatterns)for(var r=0,n=t.length;r<n;r++)this.findMathInString(e,r,t[r]);return e},e.OPTIONS={inlineMath:[["\\(","\\)"]],displayMath:[["$$","$$"],["\\[","\\]"]],processEscapes:!0,processEnvironments:!0,processRefs:!0},e}(s.AbstractFindMath);e.FindTeX=c},2947:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.SubHandlers=e.SubHandler=e.MapHandler=void 0;var i,s=r(8666),a=r(7525);!function(t){var e=new Map;t.register=function(t){e.set(t.name,t)},t.getMap=function(t){return e.get(t)}}(i=e.MapHandler||(e.MapHandler={}));var l=function(){function t(){this._configuration=new s.PrioritizedList,this._fallback=new a.FunctionList}return t.prototype.add=function(t,e,r){var o,a;void 0===r&&(r=s.PrioritizedList.DEFAULTPRIORITY);try{for(var l=n(t.slice().reverse()),c=l.next();!c.done;c=l.next()){var u=c.value,p=i.getMap(u);if(!p)return void this.warn("Configuration "+u+" not found! Omitted.");this._configuration.add(p,r)}}catch(t){o={error:t}}finally{try{c&&!c.done&&(a=l.return)&&a.call(l)}finally{if(o)throw o.error}}e&&this._fallback.add(e,r)},t.prototype.parse=function(t){var e,r;try{for(var i=n(this._configuration),s=i.next();!s.done;s=i.next()){var a=s.value.item.parse(t);if(a)return a}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}var l=o(t,2),c=l[0],u=l[1];Array.from(this._fallback)[0].item(c,u)},t.prototype.lookup=function(t){var e=this.applicable(t);return e?e.lookup(t):null},t.prototype.contains=function(t){return!!this.applicable(t)},t.prototype.toString=function(){var t,e,r=[];try{for(var o=n(this._configuration),i=o.next();!i.done;i=o.next()){var s=i.value.item;r.push(s.name)}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r.join(", ")},t.prototype.applicable=function(t){var e,r;try{for(var o=n(this._configuration),i=o.next();!i.done;i=o.next()){var s=i.value.item;if(s.contains(t))return s}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},t.prototype.retrieve=function(t){var e,r;try{for(var o=n(this._configuration),i=o.next();!i.done;i=o.next()){var s=i.value.item;if(s.name===t)return s}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},t.prototype.warn=function(t){console.log("TexParser Warning: "+t)},t}();e.SubHandler=l;var c=function(){function t(){this.map=new Map}return t.prototype.add=function(t,e,r){var o,i;void 0===r&&(r=s.PrioritizedList.DEFAULTPRIORITY);try{for(var a=n(Object.keys(t)),c=a.next();!c.done;c=a.next()){var u=c.value,p=this.get(u);p||(p=new l,this.set(u,p)),p.add(t[u],e[u],r)}}catch(t){o={error:t}}finally{try{c&&!c.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}},t.prototype.set=function(t,e){this.map.set(t,e)},t.prototype.get=function(t){return this.map.get(t)},t.prototype.retrieve=function(t){var e,r;try{for(var o=n(this.map.values()),i=o.next();!i.done;i=o.next()){var s=i.value.retrieve(t);if(s)return s}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},t.prototype.keys=function(){return this.map.keys()},t}();e.SubHandlers=c},8929:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.NodeFactory=void 0;var s=i(r(1256)),a=function(){function t(){this.mmlFactory=null,this.factory={node:t.createNode,token:t.createToken,text:t.createText,error:t.createError}}return t.createNode=function(t,e,r,n,o){void 0===r&&(r=[]),void 0===n&&(n={});var i=t.mmlFactory.create(e);return i.setChildren(r),o&&i.appendChild(o),s.default.setProperties(i,n),i},t.createToken=function(t,e,r,n){void 0===r&&(r={}),void 0===n&&(n="");var o=t.create("text",n);return t.create("node",e,[],r,o)},t.createText=function(t,e){return null==e?null:t.mmlFactory.create("text").setText(e)},t.createError=function(t,e){var r=t.create("text",e),n=t.create("node","mtext",[],{},r);return t.create("node","merror",[n],{"data-mjx-error":e})},t.prototype.setMmlFactory=function(t){this.mmlFactory=t},t.prototype.set=function(t,e){this.factory[t]=e},t.prototype.setCreators=function(t){for(var e in t)this.set(e,t[e])},t.prototype.create=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];var i=this.factory[t]||this.factory.node,s=i.apply(void 0,o([this,e[0]],n(e.slice(1)),!1));return"node"===t&&this.configuration.addNode(e[0],s),s},t.prototype.get=function(t){return this.factory[t]},t}();e.NodeFactory=a},1256:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0});var s,a=r(9007),l=r(2756);!function(t){var e=new Map([["autoOP",!0],["fnOP",!0],["movesupsub",!0],["subsupOK",!0],["texprimestyle",!0],["useHeight",!0],["variantForm",!0],["withDelims",!0],["mathaccent",!0],["open",!0],["close",!0]]);function r(t,r){var o,i;try{for(var s=n(Object.keys(r)),a=s.next();!a.done;a=s.next()){var l=a.value,c=r[l];"texClass"===l?(t.texClass=c,t.setProperty(l,c)):"movablelimits"===l?(t.setProperty("movablelimits",c),(t.isKind("mo")||t.isKind("mstyle"))&&t.attributes.set("movablelimits",c)):"inferred"===l||(e.has(l)?t.setProperty(l,c):t.attributes.set(l,c))}}catch(t){o={error:t}}finally{try{a&&!a.done&&(i=s.return)&&i.call(s)}finally{if(o)throw o.error}}}function s(t,e,r){t.childNodes[e]=r,r&&(r.parent=t)}function c(t,e){return t.isKind(e)}t.createEntity=function(t){return String.fromCodePoint(parseInt(t,16))},t.getChildren=function(t){return t.childNodes},t.getText=function(t){return t.getText()},t.appendChildren=function(t,e){var r,o;try{for(var i=n(e),s=i.next();!s.done;s=i.next()){var a=s.value;t.appendChild(a)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(o=i.return)&&o.call(i)}finally{if(r)throw r.error}}},t.setAttribute=function(t,e,r){t.attributes.set(e,r)},t.setProperty=function(t,e,r){t.setProperty(e,r)},t.setProperties=r,t.getProperty=function(t,e){return t.getProperty(e)},t.getAttribute=function(t,e){return t.attributes.get(e)},t.removeProperties=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];t.removeProperty.apply(t,i([],o(e),!1))},t.getChildAt=function(t,e){return t.childNodes[e]},t.setChild=s,t.copyChildren=function(t,e){for(var r=t.childNodes,n=0;n<r.length;n++)s(e,n,r[n])},t.copyAttributes=function(t,e){e.attributes=t.attributes,r(e,t.getAllProperties())},t.isType=c,t.isEmbellished=function(t){return t.isEmbellished},t.getTexClass=function(t){return t.texClass},t.getCoreMO=function(t){return t.coreMO()},t.isNode=function(t){return t instanceof a.AbstractMmlNode||t instanceof a.AbstractMmlEmptyNode},t.isInferred=function(t){return t.isInferred},t.getForm=function(t){var e,r;if(!c(t,"mo"))return null;var o=t,i=o.getForms();try{for(var s=n(i),a=s.next();!a.done;a=s.next()){var u=a.value,p=l.MmlMo.OPTABLE[u][o.getText()];if(p)return p}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}return null}}(s||(s={})),e.default=s},5450:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var s,a=i(r(1256)),l=r(8317),c=i(r(1130));!function(t){t.variable=function(t,e){var r=c.default.getFontDef(t),n=t.stack.env;n.multiLetterIdentifiers&&""!==n.font&&(e=t.string.substr(t.i-1).match(n.multiLetterIdentifiers)[0],t.i+=e.length-1,r.mathvariant===l.TexConstant.Variant.NORMAL&&n.noAutoOP&&e.length>1&&(r.autoOP=!1));var o=t.create("token","mi",r,e);t.Push(o)},t.digit=function(t,e){var r,n=t.configuration.options.digits,o=t.string.slice(t.i-1).match(n),i=c.default.getFontDef(t);o?(r=t.create("token","mn",i,o[0].replace(/[{}]/g,"")),t.i+=o[0].length-1):r=t.create("token","mo",i,e),t.Push(r)},t.controlSequence=function(t,e){var r=t.GetCS();t.parse("macro",[t,r])},t.mathchar0mi=function(t,e){var r=e.attributes||{mathvariant:l.TexConstant.Variant.ITALIC},n=t.create("token","mi",r,e.char);t.Push(n)},t.mathchar0mo=function(t,e){var r=e.attributes||{};r.stretchy=!1;var n=t.create("token","mo",r,e.char);a.default.setProperty(n,"fixStretchy",!0),t.configuration.addNode("fixStretchy",n),t.Push(n)},t.mathchar7=function(t,e){var r=e.attributes||{mathvariant:l.TexConstant.Variant.NORMAL};t.stack.env.font&&(r.mathvariant=t.stack.env.font);var n=t.create("token","mi",r,e.char);t.Push(n)},t.delimiter=function(t,e){var r=e.attributes||{};r=Object.assign({fence:!1,stretchy:!1},r);var n=t.create("token","mo",r,e.char);t.Push(n)},t.environment=function(t,e,r,i){var s=i[0],a=t.itemFactory.create("begin").setProperties({name:e,end:s});a=r.apply(void 0,o([t,a],n(i.slice(1)),!1)),t.Push(a)}}(s||(s={})),e.default=s},8562:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=s(r(5453)),l=r(8929),c=s(r(1256)),u=r(7233),p=function(){function t(t,e){void 0===e&&(e=[]),this.options={},this.packageData=new Map,this.parsers=[],this.root=null,this.nodeLists={},this.error=!1,this.handlers=t.handlers,this.nodeFactory=new l.NodeFactory,this.nodeFactory.configuration=this,this.nodeFactory.setCreators(t.nodes),this.itemFactory=new a.default(t.items),this.itemFactory.configuration=this,u.defaultOptions.apply(void 0,o([this.options],n(e),!1)),(0,u.defaultOptions)(this.options,t.options)}return t.prototype.pushParser=function(t){this.parsers.unshift(t)},t.prototype.popParser=function(){this.parsers.shift()},Object.defineProperty(t.prototype,"parser",{get:function(){return this.parsers[0]},enumerable:!1,configurable:!0}),t.prototype.clear=function(){this.parsers=[],this.root=null,this.nodeLists={},this.error=!1,this.tags.resetTag()},t.prototype.addNode=function(t,e){var r=this.nodeLists[t];if(r||(r=this.nodeLists[t]=[]),r.push(e),e.kind!==t){var n=c.default.getProperty(e,"in-lists")||"",o=(n?n.split(/,/):[]).concat(t).join(",");c.default.setProperty(e,"in-lists",o)}},t.prototype.getList=function(t){var e,r,n=this.nodeLists[t]||[],o=[];try{for(var s=i(n),a=s.next();!a.done;a=s.next()){var l=a.value;this.inTree(l)&&o.push(l)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}return this.nodeLists[t]=o,o},t.prototype.removeFromList=function(t,e){var r,n,o=this.nodeLists[t]||[];try{for(var s=i(e),a=s.next();!a.done;a=s.next()){var l=a.value,c=o.indexOf(l);c>=0&&o.splice(c,1)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}},t.prototype.inTree=function(t){for(;t&&t!==this.root;)t=t.parent;return!!t},t}();e.default=p},1130:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var s,a=r(9007),l=i(r(1256)),c=i(r(8417)),u=i(r(3971)),p=r(5368);!function(t){var e=7.2,r={em:function(t){return t},ex:function(t){return.43*t},pt:function(t){return t/10},pc:function(t){return 1.2*t},px:function(t){return t*e/72},in:function(t){return t*e},cm:function(t){return t*e/2.54},mm:function(t){return t*e/25.4},mu:function(t){return t/18}},i="([-+]?([.,]\\d+|\\d+([.,]\\d*)?))",s="(pt|em|ex|mu|px|mm|cm|in|pc)",h=RegExp("^\\s*"+i+"\\s*"+s+"\\s*$"),f=RegExp("^\\s*"+i+"\\s*"+s+" ?");function d(t,e){void 0===e&&(e=!1);var o=t.match(e?f:h);return o?function(t){var e=n(t,3),o=e[0],i=e[1],s=e[2];if("mu"!==i)return[o,i,s];return[m(r[i](parseFloat(o||"1"))).slice(0,-2),"em",s]}([o[1].replace(/,/,"."),o[4],o[0].length]):[null,null,0]}function m(t){return Math.abs(t)<6e-4?"0em":t.toFixed(3).replace(/\.?0+$/,"")+"em"}function y(t,e,r){"{"!==e&&"}"!==e||(e="\\"+e);var n="{\\bigg"+r+" "+e+"}",o="{\\big"+r+" "+e+"}";return new c.default("\\mathchoice"+n+o+o+o,{},t).mml()}function g(t,e,r){e=e.replace(/^\s+/,p.entities.nbsp).replace(/\s+$/,p.entities.nbsp);var n=t.create("text",e);return t.create("node","mtext",[],r,n)}function b(t,e,r){if(r.match(/^[a-z]/i)&&e.match(/(^|[^\\])(\\\\)*\\[a-z]+$/i)&&(e+=" "),e.length+r.length>t.configuration.options.maxBuffer)throw new u.default("MaxBufferSize","MathJax internal buffer size exceeded; is there a recursive macro call?");return e+r}function v(t,e){for(;e>0;)t=t.trim().slice(1,-1),e--;return t.trim()}function _(t,e){for(var r=t.length,n=0,o="",i=0,s=0,a=!0,l=!1;i<r;){var c=t[i++];switch(c){case" ":break;case"{":a?s++:(l=!1,s>n&&(s=n)),n++;break;case"}":n&&n--,(a||l)&&(s--,l=!0),a=!1;break;default:if(!n&&-1!==e.indexOf(c))return[l?"true":v(o,s),c,t.slice(i)];a=!1,l=!1}o+=c}if(n)throw new u.default("ExtraOpenMissingClose","Extra open brace or missing close brace");return[l?"true":v(o,s),"",t.slice(i)]}t.matchDimen=d,t.dimen2em=function(t){var e=n(d(t),2),o=e[0],i=e[1],s=parseFloat(o||"1"),a=r[i];return a?a(s):0},t.Em=m,t.cols=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return t.map((function(t){return m(t)})).join(" ")},t.fenced=function(t,e,r,n,o,i){void 0===o&&(o=""),void 0===i&&(i="");var s,u=t.nodeFactory,p=u.create("node","mrow",[],{open:e,close:n,texClass:a.TEXCLASS.INNER});if(o)s=new c.default("\\"+o+"l"+e,t.parser.stack.env,t).mml();else{var h=u.create("text",e);s=u.create("node","mo",[],{fence:!0,stretchy:!0,symmetric:!0,texClass:a.TEXCLASS.OPEN},h)}if(l.default.appendChildren(p,[s,r]),o)s=new c.default("\\"+o+"r"+n,t.parser.stack.env,t).mml();else{var f=u.create("text",n);s=u.create("node","mo",[],{fence:!0,stretchy:!0,symmetric:!0,texClass:a.TEXCLASS.CLOSE},f)}return i&&s.attributes.set("mathcolor",i),l.default.appendChildren(p,[s]),p},t.fixedFence=function(t,e,r,n){var o=t.nodeFactory.create("node","mrow",[],{open:e,close:n,texClass:a.TEXCLASS.ORD});return e&&l.default.appendChildren(o,[y(t,e,"l")]),l.default.isType(r,"mrow")?l.default.appendChildren(o,l.default.getChildren(r)):l.default.appendChildren(o,[r]),n&&l.default.appendChildren(o,[y(t,n,"r")]),o},t.mathPalette=y,t.fixInitialMO=function(t,e){for(var r=0,n=e.length;r<n;r++){var o=e[r];if(o&&!l.default.isType(o,"mspace")&&(!l.default.isType(o,"TeXAtom")||l.default.getChildren(o)[0]&&l.default.getChildren(l.default.getChildren(o)[0]).length)){if(l.default.isEmbellished(o)||l.default.isType(o,"TeXAtom")&&l.default.getTexClass(o)===a.TEXCLASS.REL){var i=t.nodeFactory.create("node","mi");e.unshift(i)}break}}},t.internalMath=function(t,e,r,n){if(t.configuration.options.internalMath)return t.configuration.options.internalMath(t,e,r,n);var o,i,s=n||t.stack.env.font,a=s?{mathvariant:s}:{},l=[],p=0,h=0,f="",d=0;if(e.match(/\\?[${}\\]|\\\(|\\(eq)?ref\s*\{/)){for(;p<e.length;)if("$"===(o=e.charAt(p++)))"$"===f&&0===d?(i=t.create("node","TeXAtom",[new c.default(e.slice(h,p-1),{},t.configuration).mml()]),l.push(i),f="",h=p):""===f&&(h<p-1&&l.push(g(t,e.slice(h,p-1),a)),f="$",h=p);else if("{"===o&&""!==f)d++;else if("}"===o)if("}"===f&&0===d){var m=new c.default(e.slice(h,p),{},t.configuration).mml();i=t.create("node","TeXAtom",[m],a),l.push(i),f="",h=p}else""!==f&&d&&d--;else if("\\"===o)if(""===f&&e.substr(p).match(/^(eq)?ref\s*\{/)){var y=RegExp["$&"].length;h<p-1&&l.push(g(t,e.slice(h,p-1),a)),f="}",h=p-1,p+=y}else"("===(o=e.charAt(p++))&&""===f?(h<p-2&&l.push(g(t,e.slice(h,p-2),a)),f=")",h=p):")"===o&&")"===f&&0===d?(i=t.create("node","TeXAtom",[new c.default(e.slice(h,p-2),{},t.configuration).mml()]),l.push(i),f="",h=p):o.match(/[${}\\]/)&&""===f&&(p--,e=e.substr(0,p-1)+e.substr(p));if(""!==f)throw new u.default("MathNotTerminated","Math not terminated in text box")}return h<e.length&&l.push(g(t,e.slice(h),a)),null!=r?l=[t.create("node","mstyle",l,{displaystyle:!1,scriptlevel:r})]:l.length>1&&(l=[t.create("node","mrow",l)]),l},t.internalText=g,t.underOver=function(e,r,n,o,i){if(t.checkMovableLimits(r),l.default.isType(r,"munderover")&&l.default.isEmbellished(r)){l.default.setProperties(l.default.getCoreMO(r),{lspace:0,rspace:0});var s=e.create("node","mo",[],{rspace:0});r=e.create("node","mrow",[s,r])}var c=e.create("node","munderover",[r]);l.default.setChild(c,"over"===o?c.over:c.under,n);var u=c;return i&&(u=e.create("node","TeXAtom",[c],{texClass:a.TEXCLASS.OP,movesupsub:!0})),l.default.setProperty(u,"subsupOK",!0),u},t.checkMovableLimits=function(t){var e=l.default.isType(t,"mo")?l.default.getForm(t):null;(l.default.getProperty(t,"movablelimits")||e&&e[3]&&e[3].movablelimits)&&l.default.setProperties(t,{movablelimits:!1})},t.trimSpaces=function(t){if("string"!=typeof t)return t;var e=t.trim();return e.match(/\\$/)&&t.match(/ $/)&&(e+=" "),e},t.setArrayAlign=function(e,r){return"t"===(r=t.trimSpaces(r||""))?e.arraydef.align="baseline 1":"b"===r?e.arraydef.align="baseline -1":"c"===r?e.arraydef.align="axis":r&&(e.arraydef.align=r),e},t.substituteArgs=function(t,e,r){for(var n="",o="",i=0;i<r.length;){var s=r.charAt(i++);if("\\"===s)n+=s+r.charAt(i++);else if("#"===s)if("#"===(s=r.charAt(i++)))n+=s;else{if(!s.match(/[1-9]/)||parseInt(s,10)>e.length)throw new u.default("IllegalMacroParam","Illegal macro parameter reference");o=b(t,b(t,o,n),e[parseInt(s,10)-1]),n=""}else n+=s}return b(t,o,n)},t.addArgs=b,t.checkMaxMacros=function(t,e){if(void 0===e&&(e=!0),!(++t.macroCount<=t.configuration.options.maxMacros))throw e?new u.default("MaxMacroSub1","MathJax maximum macro substitution count exceeded; is here a recursive macro call?"):new u.default("MaxMacroSub2","MathJax maximum substitution count exceeded; is there a recursive latex environment?")},t.checkEqnEnv=function(t){if(t.stack.global.eqnenv)throw new u.default("ErroneousNestingEq","Erroneous nesting of equation structures");t.stack.global.eqnenv=!0},t.copyNode=function(t,e){var r=t.copy(),n=e.configuration;return r.walkTree((function(t){var e,r;n.addNode(t.kind,t);var i=(t.getProperty("in-lists")||"").split(/,/);try{for(var s=o(i),a=s.next();!a.done;a=s.next()){var l=a.value;l&&n.addNode(l,t)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}})),r},t.MmlFilterAttribute=function(t,e,r){return r},t.getFontDef=function(t){var e=t.stack.env.font;return e?{mathvariant:e}:{}},t.keyvalOptions=function(t,e,r){var i,s;void 0===e&&(e=null),void 0===r&&(r=!1);var a=function(t){var e,r,o,i,s,a={},l=t;for(;l;)i=(e=n(_(l,["=",","]),3))[0],o=e[1],l=e[2],"="===o?(s=(r=n(_(l,[","]),3))[0],o=r[1],l=r[2],s="false"===s||"true"===s?JSON.parse(s):s,a[i]=s):i&&(a[i]=!0);return a}(t);if(e)try{for(var l=o(Object.keys(a)),c=l.next();!c.done;c=l.next()){var p=c.value;if(!e.hasOwnProperty(p)){if(r)throw new u.default("InvalidOption","Invalid option: %1",p);delete a[p]}}}catch(t){i={error:t}}finally{try{c&&!c.done&&(s=l.return)&&s.call(l)}finally{if(i)throw i.error}}return a}}(s||(s={})),e.default=s},9497:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=s(r(1256)),l=function(){function t(t,e,r){this._factory=t,this._env=e,this.global={},this.stack=[],this.global={isInner:r},this.stack=[this._factory.create("start",this.global)],e&&(this.stack[0].env=e),this.env=this.stack[0].env}return Object.defineProperty(t.prototype,"env",{get:function(){return this._env},set:function(t){this._env=t},enumerable:!1,configurable:!0}),t.prototype.Push=function(){for(var t,e,r=[],s=0;s<arguments.length;s++)r[s]=arguments[s];try{for(var l=n(r),c=l.next();!c.done;c=l.next()){var u=c.value;if(u){var p=a.default.isNode(u)?this._factory.create("mml",u):u;p.global=this.global;var h=o(this.stack.length?this.Top().checkItem(p):[null,!0],2),f=h[0],d=h[1];d&&(f?(this.Pop(),this.Push.apply(this,i([],o(f),!1))):(this.stack.push(p),p.env?(p.copyEnv&&Object.assign(p.env,this.env),this.env=p.env):p.env=this.env))}}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}},t.prototype.Pop=function(){var t=this.stack.pop();return t.isOpen||delete t.env,this.env=this.stack.length?this.Top().env:{},t},t.prototype.Top=function(t){return void 0===t&&(t=1),this.stack.length<t?null:this.stack[this.stack.length-t]},t.prototype.Prev=function(t){var e=this.Top();return t?e.First:e.Pop()},t.prototype.toString=function(){return"stack[\n "+this.stack.join("\n ")+"\n]"},t}();e.default=l},8292:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.BaseItem=e.MmlStack=void 0;var c=l(r(3971)),u=function(){function t(t){this._nodes=t}return Object.defineProperty(t.prototype,"nodes",{get:function(){return this._nodes},enumerable:!1,configurable:!0}),t.prototype.Push=function(){for(var t,e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];(t=this._nodes).push.apply(t,s([],i(e),!1))},t.prototype.Pop=function(){return this._nodes.pop()},Object.defineProperty(t.prototype,"First",{get:function(){return this._nodes[this.Size()-1]},set:function(t){this._nodes[this.Size()-1]=t},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"Last",{get:function(){return this._nodes[0]},set:function(t){this._nodes[0]=t},enumerable:!1,configurable:!0}),t.prototype.Peek=function(t){return null==t&&(t=1),this._nodes.slice(this.Size()-t)},t.prototype.Size=function(){return this._nodes.length},t.prototype.Clear=function(){this._nodes=[]},t.prototype.toMml=function(t,e){return void 0===t&&(t=!0),1!==this._nodes.length||e?this.create("node",t?"inferredMrow":"mrow",this._nodes,{}):this.First},t.prototype.create=function(t){for(var e,r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];return(e=this.factory.configuration.nodeFactory).create.apply(e,s([t],i(r),!1))},t}();e.MmlStack=u;var p=function(t){function e(e){for(var r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];var o=t.call(this,r)||this;return o.factory=e,o.global={},o._properties={},o.isOpen&&(o._env={}),o}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"base"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"env",{get:function(){return this._env},set:function(t){this._env=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"copyEnv",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.getProperty=function(t){return this._properties[t]},e.prototype.setProperty=function(t,e){return this._properties[t]=e,this},Object.defineProperty(e.prototype,"isOpen",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isClose",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isFinal",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.isKind=function(t){return t===this.kind},e.prototype.checkItem=function(t){if(t.isKind("over")&&this.isOpen&&(t.setProperty("num",this.toMml(!1)),this.Clear()),t.isKind("cell")&&this.isOpen){if(t.getProperty("linebreak"))return e.fail;throw new c.default("Misplaced","Misplaced %1",t.getName())}if(t.isClose&&this.getErrors(t.kind)){var r=i(this.getErrors(t.kind),2),n=r[0],o=r[1];throw new c.default(n,o,t.getName())}return t.isFinal?(this.Push(t.First),e.fail):e.success},e.prototype.clearEnv=function(){var t,e;try{for(var r=a(Object.keys(this.env)),n=r.next();!n.done;n=r.next()){var o=n.value;delete this.env[o]}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},e.prototype.setProperties=function(t){return Object.assign(this._properties,t),this},e.prototype.getName=function(){return this.getProperty("name")},e.prototype.toString=function(){return this.kind+"["+this.nodes.join("; ")+"]"},e.prototype.getErrors=function(t){return(this.constructor.errors||{})[t]||e.errors[t]},e.fail=[null,!1],e.success=[null,!0],e.errors={end:["MissingBeginExtraEnd","Missing \\begin{%1} or extra \\end{%1}"],close:["ExtraCloseMissingOpen","Extra close brace or missing open brace"],right:["MissingLeftExtraRight","Missing \\left or extra \\right"],middle:["ExtraMiddle","Extra \\middle"]},e}(u);e.BaseItem=p},5453:function(t,e,r){var n,o,i=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0});var s=r(8292),a=r(4574),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e}(s.BaseItem),c=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.defaultKind="dummy",e.configuration=null,e}return i(e,t),e.DefaultStackItems=((o={})[l.prototype.kind]=l,o),e}(a.AbstractFactory);e.default=c},8803:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Macro=e.Symbol=void 0;var r=function(){function t(t,e,r){this._symbol=t,this._char=e,this._attributes=r}return Object.defineProperty(t.prototype,"symbol",{get:function(){return this._symbol},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"char",{get:function(){return this._char},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"attributes",{get:function(){return this._attributes},enumerable:!1,configurable:!0}),t}();e.Symbol=r;var n=function(){function t(t,e,r){void 0===r&&(r=[]),this._symbol=t,this._func=e,this._args=r}return Object.defineProperty(t.prototype,"symbol",{get:function(){return this._symbol},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"func",{get:function(){return this._func},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"args",{get:function(){return this._args},enumerable:!1,configurable:!0}),t}();e.Macro=n},9140:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.EnvironmentMap=e.CommandMap=e.MacroMap=e.DelimiterMap=e.CharacterMap=e.AbstractParseMap=e.RegExpMap=e.AbstractSymbolMap=e.parseResult=void 0;var l=r(8803),c=r(2947);function u(t){return void 0===t||t}e.parseResult=u;var p=function(){function t(t,e){this._name=t,this._parser=e,c.MapHandler.register(this)}return Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),t.prototype.parserFor=function(t){return this.contains(t)?this.parser:null},t.prototype.parse=function(t){var e=i(t,2),r=e[0],n=e[1],o=this.parserFor(n),s=this.lookup(n);return o&&s?u(o(r,s)):null},Object.defineProperty(t.prototype,"parser",{get:function(){return this._parser},set:function(t){this._parser=t},enumerable:!1,configurable:!0}),t}();e.AbstractSymbolMap=p;var h=function(t){function e(e,r,n){var o=t.call(this,e,r)||this;return o._regExp=n,o}return o(e,t),e.prototype.contains=function(t){return this._regExp.test(t)},e.prototype.lookup=function(t){return this.contains(t)?t:null},e}(p);e.RegExpMap=h;var f=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.map=new Map,e}return o(e,t),e.prototype.lookup=function(t){return this.map.get(t)},e.prototype.contains=function(t){return this.map.has(t)},e.prototype.add=function(t,e){this.map.set(t,e)},e.prototype.remove=function(t){this.map.delete(t)},e}(p);e.AbstractParseMap=f;var d=function(t){function e(e,r,n){var o,a,c=t.call(this,e,r)||this;try{for(var u=s(Object.keys(n)),p=u.next();!p.done;p=u.next()){var h=p.value,f=n[h],d=i("string"==typeof f?[f,null]:f,2),m=d[0],y=d[1],g=new l.Symbol(h,m,y);c.add(h,g)}}catch(t){o={error:t}}finally{try{p&&!p.done&&(a=u.return)&&a.call(u)}finally{if(o)throw o.error}}return c}return o(e,t),e}(f);e.CharacterMap=d;var m=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.parse=function(e){var r=i(e,2),n=r[0],o=r[1];return t.prototype.parse.call(this,[n,"\\"+o])},e}(d);e.DelimiterMap=m;var y=function(t){function e(e,r,n){var o,a,c=t.call(this,e,null)||this;try{for(var u=s(Object.keys(r)),p=u.next();!p.done;p=u.next()){var h=p.value,f=r[h],d=i("string"==typeof f?[f]:f),m=d[0],y=d.slice(1),g=new l.Macro(h,n[m],y);c.add(h,g)}}catch(t){o={error:t}}finally{try{p&&!p.done&&(a=u.return)&&a.call(u)}finally{if(o)throw o.error}}return c}return o(e,t),e.prototype.parserFor=function(t){var e=this.lookup(t);return e?e.func:null},e.prototype.parse=function(t){var e=i(t,2),r=e[0],n=e[1],o=this.lookup(n),s=this.parserFor(n);return o&&s?u(s.apply(void 0,a([r,o.symbol],i(o.args),!1))):null},e}(f);e.MacroMap=y;var g=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.parse=function(t){var e=i(t,2),r=e[0],n=e[1],o=this.lookup(n),s=this.parserFor(n);if(!o||!s)return null;var l=r.currentCS;r.currentCS="\\"+n;var c=s.apply(void 0,a([r,"\\"+o.symbol],i(o.args),!1));return r.currentCS=l,u(c)},e}(y);e.CommandMap=g;var b=function(t){function e(e,r,n,o){var i=t.call(this,e,n,o)||this;return i.parser=r,i}return o(e,t),e.prototype.parse=function(t){var e=i(t,2),r=e[0],n=e[1],o=this.lookup(n),s=this.parserFor(n);return o&&s?u(this.parser(r,o.symbol,s,o.args)):null},e}(y);e.EnvironmentMap=b},6521:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.TagsFactory=e.AllTags=e.NoTags=e.AbstractTags=e.TagInfo=e.Label=void 0;var a=s(r(8417)),l=function(t,e){void 0===t&&(t="???"),void 0===e&&(e=""),this.tag=t,this.id=e};e.Label=l;var c=function(t,e,r,n,o,i,s,a){void 0===t&&(t=""),void 0===e&&(e=!1),void 0===r&&(r=!1),void 0===n&&(n=null),void 0===o&&(o=""),void 0===i&&(i=""),void 0===s&&(s=!1),void 0===a&&(a=""),this.env=t,this.taggable=e,this.defaultTags=r,this.tag=n,this.tagId=o,this.tagFormat=i,this.noTag=s,this.labelId=a};e.TagInfo=c;var u=function(){function t(){this.counter=0,this.allCounter=0,this.configuration=null,this.ids={},this.allIds={},this.labels={},this.allLabels={},this.redo=!1,this.refUpdate=!1,this.currentTag=new c,this.history=[],this.stack=[],this.enTag=function(t,e){var r=this.configuration.nodeFactory,n=r.create("node","mtd",[t]),o=r.create("node","mlabeledtr",[e,n]);return r.create("node","mtable",[o],{side:this.configuration.options.tagSide,minlabelspacing:this.configuration.options.tagIndent,displaystyle:!0})}}return t.prototype.start=function(t,e,r){this.currentTag&&this.stack.push(this.currentTag),this.currentTag=new c(t,e,r)},Object.defineProperty(t.prototype,"env",{get:function(){return this.currentTag.env},enumerable:!1,configurable:!0}),t.prototype.end=function(){this.history.push(this.currentTag),this.currentTag=this.stack.pop()},t.prototype.tag=function(t,e){this.currentTag.tag=t,this.currentTag.tagFormat=e?t:this.formatTag(t),this.currentTag.noTag=!1},t.prototype.notag=function(){this.tag("",!0),this.currentTag.noTag=!0},Object.defineProperty(t.prototype,"noTag",{get:function(){return this.currentTag.noTag},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"label",{get:function(){return this.currentTag.labelId},set:function(t){this.currentTag.labelId=t},enumerable:!1,configurable:!0}),t.prototype.formatUrl=function(t,e){return e+"#"+encodeURIComponent(t)},t.prototype.formatTag=function(t){return"("+t+")"},t.prototype.formatId=function(t){return"mjx-eqn:"+t.replace(/\s/g,"_")},t.prototype.formatNumber=function(t){return t.toString()},t.prototype.autoTag=function(){null==this.currentTag.tag&&(this.counter++,this.tag(this.formatNumber(this.counter),!1))},t.prototype.clearTag=function(){this.label="",this.tag(null,!0),this.currentTag.tagId=""},t.prototype.getTag=function(t){if(void 0===t&&(t=!1),t)return this.autoTag(),this.makeTag();var e=this.currentTag;return e.taggable&&!e.noTag&&(e.defaultTags&&this.autoTag(),e.tag)?this.makeTag():null},t.prototype.resetTag=function(){this.history=[],this.redo=!1,this.refUpdate=!1,this.clearTag()},t.prototype.reset=function(t){void 0===t&&(t=0),this.resetTag(),this.counter=this.allCounter=t,this.allLabels={},this.allIds={}},t.prototype.startEquation=function(t){this.history=[],this.stack=[],this.clearTag(),this.currentTag=new c("",void 0,void 0),this.labels={},this.ids={},this.counter=this.allCounter,this.redo=!1;var e=t.inputData.recompile;e&&(this.refUpdate=!0,this.counter=e.counter)},t.prototype.finishEquation=function(t){this.redo&&(t.inputData.recompile={state:t.state(),counter:this.allCounter}),this.refUpdate||(this.allCounter=this.counter),Object.assign(this.allIds,this.ids),Object.assign(this.allLabels,this.labels)},t.prototype.finalize=function(t,e){if(!e.display||this.currentTag.env||null==this.currentTag.tag)return t;var r=this.makeTag();return this.enTag(t,r)},t.prototype.makeId=function(){this.currentTag.tagId=this.formatId(this.configuration.options.useLabelIds&&this.label||this.currentTag.tag)},t.prototype.makeTag=function(){this.makeId(),this.label&&(this.labels[this.label]=new l(this.currentTag.tag,this.currentTag.tagId));var t=new a.default("\\text{"+this.currentTag.tagFormat+"}",{},this.configuration).mml();return this.configuration.nodeFactory.create("node","mtd",[t],{id:this.currentTag.tagId})},t}();e.AbstractTags=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.autoTag=function(){},e.prototype.getTag=function(){return this.currentTag.tag?t.prototype.getTag.call(this):null},e}(u);e.NoTags=p;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.finalize=function(t,e){if(!e.display||this.history.find((function(t){return t.taggable})))return t;var r=this.getTag(!0);return this.enTag(t,r)},e}(u);e.AllTags=h,function(t){var e=new Map([["none",p],["all",h]]),r="none";t.OPTIONS={tags:r,tagSide:"right",tagIndent:"0.8em",useLabelIds:!0,ignoreDuplicateLabels:!1},t.add=function(t,r){e.set(t,r)},t.addTags=function(e){var r,n;try{for(var o=i(Object.keys(e)),s=o.next();!s.done;s=o.next()){var a=s.value;t.add(a,e[a])}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},t.create=function(t){var n=e.get(t)||e.get(r);if(!n)throw Error("Unknown tags class");return new n},t.setDefault=function(t){r=t},t.getDefault=function(){return t.create(r)}}(e.TagsFactory||(e.TagsFactory={}))},8317:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.TexConstant=void 0,function(t){t.Variant={NORMAL:"normal",BOLD:"bold",ITALIC:"italic",BOLDITALIC:"bold-italic",DOUBLESTRUCK:"double-struck",FRAKTUR:"fraktur",BOLDFRAKTUR:"bold-fraktur",SCRIPT:"script",BOLDSCRIPT:"bold-script",SANSSERIF:"sans-serif",BOLDSANSSERIF:"bold-sans-serif",SANSSERIFITALIC:"sans-serif-italic",SANSSERIFBOLDITALIC:"sans-serif-bold-italic",MONOSPACE:"monospace",INITIAL:"inital",TAILED:"tailed",LOOPED:"looped",STRETCHED:"stretched",CALLIGRAPHIC:"-tex-calligraphic",BOLDCALLIGRAPHIC:"-tex-bold-calligraphic",OLDSTYLE:"-tex-oldstyle",BOLDOLDSTYLE:"-tex-bold-oldstyle",MATHITALIC:"-tex-mathit"},t.Form={PREFIX:"prefix",INFIX:"infix",POSTFIX:"postfix"},t.LineBreak={AUTO:"auto",NEWLINE:"newline",NOBREAK:"nobreak",GOODBREAK:"goodbreak",BADBREAK:"badbreak"},t.LineBreakStyle={BEFORE:"before",AFTER:"after",DUPLICATE:"duplicate",INFIXLINBREAKSTYLE:"infixlinebreakstyle"},t.IndentAlign={LEFT:"left",CENTER:"center",RIGHT:"right",AUTO:"auto",ID:"id",INDENTALIGN:"indentalign"},t.IndentShift={INDENTSHIFT:"indentshift"},t.LineThickness={THIN:"thin",MEDIUM:"medium",THICK:"thick"},t.Notation={LONGDIV:"longdiv",ACTUARIAL:"actuarial",PHASORANGLE:"phasorangle",RADICAL:"radical",BOX:"box",ROUNDEDBOX:"roundedbox",CIRCLE:"circle",LEFT:"left",RIGHT:"right",TOP:"top",BOTTOM:"bottom",UPDIAGONALSTRIKE:"updiagonalstrike",DOWNDIAGONALSTRIKE:"downdiagonalstrike",VERTICALSTRIKE:"verticalstrike",HORIZONTALSTRIKE:"horizontalstrike",NORTHEASTARROW:"northeastarrow",MADRUWB:"madruwb",UPDIAGONALARROW:"updiagonalarrow"},t.Align={TOP:"top",BOTTOM:"bottom",CENTER:"center",BASELINE:"baseline",AXIS:"axis",LEFT:"left",RIGHT:"right"},t.Lines={NONE:"none",SOLID:"solid",DASHED:"dashed"},t.Side={LEFT:"left",RIGHT:"right",LEFTOVERLAP:"leftoverlap",RIGHTOVERLAP:"rightoverlap"},t.Width={AUTO:"auto",FIT:"fit"},t.Actiontype={TOGGLE:"toggle",STATUSLINE:"statusline",TOOLTIP:"tooltip",INPUT:"input"},t.Overflow={LINBREAK:"linebreak",SCROLL:"scroll",ELIDE:"elide",TRUNCATE:"truncate",SCALE:"scale"},t.Unit={EM:"em",EX:"ex",PX:"px",IN:"in",CM:"cm",MM:"mm",PT:"pt",PC:"pc"}}(e.TexConstant||(e.TexConstant={}))},3971:function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(e,r){for(var n=[],o=2;o<arguments.length;o++)n[o-2]=arguments[o];this.id=e,this.message=t.processString(r,n)}return t.processString=function(e,r){for(var n=e.split(t.pattern),o=1,i=n.length;o<i;o+=2){var s=n[o].charAt(0);if(s>="0"&&s<="9")n[o]=r[parseInt(n[o],10)-1],"number"==typeof n[o]&&(n[o]=n[o].toString());else if("{"===s){if((s=n[o].substr(1))>="0"&&s<="9")n[o]=r[parseInt(n[o].substr(1,n[o].length-2),10)-1],"number"==typeof n[o]&&(n[o]=n[o].toString());else n[o].match(/^\{([a-z]+):%(\d+)\|(.*)\}$/)&&(n[o]="%"+n[o])}null==n[o]&&(n[o]="???")}return n.join("")},t.pattern=/%(\d+|\{\d+\}|\{[a-z]+:\%\d+(?:\|(?:%\{\d+\}|%.|[^\}])*)+\}|.)/g,t}();e.default=r},8417:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=s(r(1130)),l=s(r(9497)),c=s(r(3971)),u=r(9007),p=function(){function t(t,e,r){var o,i;this._string=t,this.configuration=r,this.macroCount=0,this.i=0,this.currentCS="";var s,a=e.hasOwnProperty("isInner"),c=e.isInner;if(delete e.isInner,e){s={};try{for(var u=n(Object.keys(e)),p=u.next();!p.done;p=u.next()){var h=p.value;s[h]=e[h]}}catch(t){o={error:t}}finally{try{p&&!p.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}}this.configuration.pushParser(this),this.stack=new l.default(this.itemFactory,s,!a||c),this.Parse(),this.Push(this.itemFactory.create("stop"))}return Object.defineProperty(t.prototype,"options",{get:function(){return this.configuration.options},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"itemFactory",{get:function(){return this.configuration.itemFactory},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"tags",{get:function(){return this.configuration.tags},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"string",{get:function(){return this._string},set:function(t){this._string=t},enumerable:!1,configurable:!0}),t.prototype.parse=function(t,e){return this.configuration.handlers.get(t).parse(e)},t.prototype.lookup=function(t,e){return this.configuration.handlers.get(t).lookup(e)},t.prototype.contains=function(t,e){return this.configuration.handlers.get(t).contains(e)},t.prototype.toString=function(){var t,e,r="";try{for(var o=n(Array.from(this.configuration.handlers.keys())),i=o.next();!i.done;i=o.next()){var s=i.value;r+=s+": "+this.configuration.handlers.get(s)+"\n"}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r},t.prototype.Parse=function(){for(var t;this.i<this.string.length;)t=this.getCodePoint(),this.i+=t.length,this.parse("character",[this,t])},t.prototype.Push=function(t){t instanceof u.AbstractMmlNode&&t.isInferred?this.PushAll(t.childNodes):this.stack.Push(t)},t.prototype.PushAll=function(t){var e,r;try{for(var o=n(t),i=o.next();!i.done;i=o.next()){var s=i.value;this.stack.Push(s)}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},t.prototype.mml=function(){if(!this.stack.Top().isKind("mml"))return null;var t=this.stack.Top().First;return this.configuration.popParser(),t},t.prototype.convertDelimiter=function(t){var e=this.lookup("delimiter",t);return e?e.char:null},t.prototype.getCodePoint=function(){var t=this.string.codePointAt(this.i);return void 0===t?"":String.fromCodePoint(t)},t.prototype.nextIsSpace=function(){return!!this.string.charAt(this.i).match(/\s/)},t.prototype.GetNext=function(){for(;this.nextIsSpace();)this.i++;return this.getCodePoint()},t.prototype.GetCS=function(){var t=this.string.slice(this.i).match(/^(([a-z]+) ?|[\uD800-\uDBFF].|.)/i);return t?(this.i+=t[0].length,t[2]||t[1]):(this.i++," ")},t.prototype.GetArgument=function(t,e){switch(this.GetNext()){case"":if(!e)throw new c.default("MissingArgFor","Missing argument for %1",this.currentCS);return null;case"}":if(!e)throw new c.default("ExtraCloseMissingOpen","Extra close brace or missing open brace");return null;case"\\":return this.i++,"\\"+this.GetCS();case"{":for(var r=++this.i,n=1;this.i<this.string.length;)switch(this.string.charAt(this.i++)){case"\\":this.i++;break;case"{":n++;break;case"}":if(0==--n)return this.string.slice(r,this.i-1)}throw new c.default("MissingCloseBrace","Missing close brace")}var o=this.getCodePoint();return this.i+=o.length,o},t.prototype.GetBrackets=function(t,e){if("["!==this.GetNext())return e;for(var r=++this.i,n=0;this.i<this.string.length;)switch(this.string.charAt(this.i++)){case"{":n++;break;case"\\":this.i++;break;case"}":if(n--<=0)throw new c.default("ExtraCloseLooking","Extra close brace while looking for %1","']'");break;case"]":if(0===n)return this.string.slice(r,this.i-1)}throw new c.default("MissingCloseBracket","Could not find closing ']' for argument to %1",this.currentCS)},t.prototype.GetDelimiter=function(t,e){var r=this.GetNext();if(this.i+=r.length,this.i<=this.string.length&&("\\"===r?r+=this.GetCS():"{"===r&&e&&(this.i--,r=this.GetArgument(t).trim()),this.contains("delimiter",r)))return this.convertDelimiter(r);throw new c.default("MissingOrUnrecognizedDelim","Missing or unrecognized delimiter for %1",this.currentCS)},t.prototype.GetDimen=function(t){if("{"===this.GetNext()){var e=this.GetArgument(t),r=o(a.default.matchDimen(e),2),n=r[0],i=r[1];if(n)return n+i}else{e=this.string.slice(this.i);var s=o(a.default.matchDimen(e,!0),3),l=(n=s[0],i=s[1],s[2]);if(n)return this.i+=l,n+i}throw new c.default("MissingDimOrUnits","Missing dimension or its units for %1",this.currentCS)},t.prototype.GetUpTo=function(t,e){for(;this.nextIsSpace();)this.i++;for(var r=this.i,n=0;this.i<this.string.length;){var o=this.i,i=this.GetNext();switch(this.i+=i.length,i){case"\\":i+=this.GetCS();break;case"{":n++;break;case"}":if(0===n)throw new c.default("ExtraCloseLooking","Extra close brace while looking for %1",e);n--}if(0===n&&i===e)return this.string.slice(r,o)}throw new c.default("TokenNotFoundForCommand","Could not find %1 for %2",e,this.currentCS)},t.prototype.ParseArg=function(e){return new t(this.GetArgument(e),this.stack.env,this.configuration).mml()},t.prototype.ParseUpTo=function(e,r){return new t(this.GetUpTo(e,r),this.stack.env,this.configuration).mml()},t.prototype.GetDelimiterArg=function(t){var e=a.default.trimSpaces(this.GetArgument(t));if(""===e)return null;if(this.contains("delimiter",e))return e;throw new c.default("MissingOrUnrecognizedDelim","Missing or unrecognized delimiter for %1",this.currentCS)},t.prototype.GetStar=function(){var t="*"===this.GetNext();return t&&this.i++,t},t.prototype.create=function(t){for(var e,r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];return(e=this.configuration.nodeFactory).create.apply(e,i([t],o(r),!1))},t}();e.default=p},8021:function(t,e,r){var n,o,i=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AmsConfiguration=e.AmsTags=void 0;var s=r(9899),a=r(2790),l=r(6521),c=r(4387);r(7379);var u=r(9140),p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e}(l.AbstractTags);e.AmsTags=p;e.AmsConfiguration=s.Configuration.create("ams",{handler:{character:["AMSmath-operatorLetter"],delimiter:["AMSsymbols-delimiter","AMSmath-delimiter"],macro:["AMSsymbols-mathchar0mi","AMSsymbols-mathchar0mo","AMSsymbols-delimiter","AMSsymbols-macros","AMSmath-mathchar0mo","AMSmath-macros","AMSmath-delimiter"],environment:["AMSmath-environment"]},items:(o={},o[a.MultlineItem.prototype.kind]=a.MultlineItem,o[a.FlalignItem.prototype.kind]=a.FlalignItem,o),tags:{ams:p},init:function(t){new u.CommandMap(c.NEW_OPS,{},{}),t.append(s.Configuration.local({handler:{macro:[c.NEW_OPS]},priority:-1}))},config:function(t,e){e.parseOptions.options.multlineWidth&&(e.parseOptions.options.ams.multlineWidth=e.parseOptions.options.multlineWidth),delete e.parseOptions.options.multlineWidth},options:{multlineWidth:"",ams:{multlineWidth:"100%",multlineIndent:"1em"}}})},2790:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.FlalignItem=e.MultlineItem=void 0;var a=r(1181),l=s(r(1130)),c=s(r(1256)),u=s(r(3971)),p=r(8317),h=function(t){function e(e){for(var r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];var o=t.call(this,e)||this;return o.factory.configuration.tags.start("multline",!0,r[0]),o}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"multline"},enumerable:!1,configurable:!0}),e.prototype.EndEntry=function(){this.table.length&&l.default.fixInitialMO(this.factory.configuration,this.nodes);var t=this.getProperty("shove"),e=this.create("node","mtd",this.nodes,t?{columnalign:t}:{});this.setProperty("shove",null),this.row.push(e),this.Clear()},e.prototype.EndRow=function(){if(1!==this.row.length)throw new u.default("MultlineRowsOneCol","The rows within the %1 environment must have exactly one column","multline");var t=this.create("node","mtr",this.row);this.table.push(t),this.row=[]},e.prototype.EndTable=function(){if(t.prototype.EndTable.call(this),this.table.length){var e=this.table.length-1,r=-1;c.default.getAttribute(c.default.getChildren(this.table[0])[0],"columnalign")||c.default.setAttribute(c.default.getChildren(this.table[0])[0],"columnalign",p.TexConstant.Align.LEFT),c.default.getAttribute(c.default.getChildren(this.table[e])[0],"columnalign")||c.default.setAttribute(c.default.getChildren(this.table[e])[0],"columnalign",p.TexConstant.Align.RIGHT);var n=this.factory.configuration.tags.getTag();if(n){r=this.arraydef.side===p.TexConstant.Align.LEFT?0:this.table.length-1;var o=this.table[r],i=this.create("node","mlabeledtr",[n].concat(c.default.getChildren(o)));c.default.copyAttributes(o,i),this.table[r]=i}}this.factory.configuration.tags.end()},e}(a.ArrayItem);e.MultlineItem=h;var f=function(t){function e(e,r,n,o,i){var s=t.call(this,e)||this;return s.name=r,s.numbered=n,s.padded=o,s.center=i,s.factory.configuration.tags.start(r,n,n),s}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"flalign"},enumerable:!1,configurable:!0}),e.prototype.EndEntry=function(){t.prototype.EndEntry.call(this);var e=this.getProperty("xalignat");if(e&&this.row.length>e)throw new u.default("XalignOverflow","Extra %1 in row of %2","&",this.name)},e.prototype.EndRow=function(){for(var e,r=this.row,n=this.getProperty("xalignat");r.length<n;)r.push(this.create("node","mtd"));for(this.row=[],this.padded&&this.row.push(this.create("node","mtd"));e=r.shift();)this.row.push(e),(e=r.shift())&&this.row.push(e),(r.length||this.padded)&&this.row.push(this.create("node","mtd"));this.row.length>this.maxrow&&(this.maxrow=this.row.length),t.prototype.EndRow.call(this);var o=this.table[this.table.length-1];if(this.getProperty("zeroWidthLabel")&&o.isKind("mlabeledtr")){var s=c.default.getChildren(o)[0],a=this.factory.configuration.options.tagSide,l=i({width:0},"right"===a?{lspace:"-1width"}:{}),u=this.create("node","mpadded",c.default.getChildren(s),l);s.setChildren([u])}},e.prototype.EndTable=function(){(t.prototype.EndTable.call(this),this.center)&&(this.maxrow<=2&&(delete this.arraydef.width,delete this.global.indentalign))},e}(a.EqnArrayItem);e.FlalignItem=f},7379:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=r(4387),l=i(r(9140)),c=r(8317),u=s(r(5450)),p=s(r(1130)),h=r(9007),f=r(6010);new l.CharacterMap("AMSmath-mathchar0mo",u.default.mathchar0mo,{iiiint:["\u2a0c",{texClass:h.TEXCLASS.OP}]}),new l.RegExpMap("AMSmath-operatorLetter",a.AmsMethods.operatorLetter,/[-*]/i),new l.CommandMap("AMSmath-macros",{mathring:["Accent","02DA"],nobreakspace:"Tilde",negmedspace:["Spacer",f.MATHSPACE.negativemediummathspace],negthickspace:["Spacer",f.MATHSPACE.negativethickmathspace],idotsint:["MultiIntegral","\\int\\cdots\\int"],dddot:["Accent","20DB"],ddddot:["Accent","20DC"],sideset:"SideSet",boxed:["Macro","\\fbox{$\\displaystyle{#1}$}",1],tag:"HandleTag",notag:"HandleNoTag",eqref:["HandleRef",!0],substack:["Macro","\\begin{subarray}{c}#1\\end{subarray}",1],injlim:["NamedOp","inj lim"],projlim:["NamedOp","proj lim"],varliminf:["Macro","\\mathop{\\underline{\\mmlToken{mi}{lim}}}"],varlimsup:["Macro","\\mathop{\\overline{\\mmlToken{mi}{lim}}}"],varinjlim:["Macro","\\mathop{\\underrightarrow{\\mmlToken{mi}{lim}}}"],varprojlim:["Macro","\\mathop{\\underleftarrow{\\mmlToken{mi}{lim}}}"],DeclareMathOperator:"HandleDeclareOp",operatorname:"HandleOperatorName",genfrac:"Genfrac",frac:["Genfrac","","","",""],tfrac:["Genfrac","","","","1"],dfrac:["Genfrac","","","","0"],binom:["Genfrac","(",")","0",""],tbinom:["Genfrac","(",")","0","1"],dbinom:["Genfrac","(",")","0","0"],cfrac:"CFrac",shoveleft:["HandleShove",c.TexConstant.Align.LEFT],shoveright:["HandleShove",c.TexConstant.Align.RIGHT],xrightarrow:["xArrow",8594,5,10],xleftarrow:["xArrow",8592,10,5]},a.AmsMethods),new l.EnvironmentMap("AMSmath-environment",u.default.environment,{"equation*":["Equation",null,!1],"eqnarray*":["EqnArray",null,!1,!0,"rcl",p.default.cols(0,f.MATHSPACE.thickmathspace),".5em"],align:["EqnArray",null,!0,!0,"rl",p.default.cols(0,2)],"align*":["EqnArray",null,!1,!0,"rl",p.default.cols(0,2)],multline:["Multline",null,!0],"multline*":["Multline",null,!1],split:["EqnArray",null,!1,!1,"rl",p.default.cols(0)],gather:["EqnArray",null,!0,!0,"c"],"gather*":["EqnArray",null,!1,!0,"c"],alignat:["AlignAt",null,!0,!0],"alignat*":["AlignAt",null,!1,!0],alignedat:["AlignAt",null,!1,!1],aligned:["AmsEqnArray",null,null,null,"rl",p.default.cols(0,2),".5em","D"],gathered:["AmsEqnArray",null,null,null,"c",null,".5em","D"],xalignat:["XalignAt",null,!0,!0],"xalignat*":["XalignAt",null,!1,!0],xxalignat:["XalignAt",null,!1,!1],flalign:["FlalignArray",null,!0,!1,!0,"rlc","auto auto fit"],"flalign*":["FlalignArray",null,!1,!1,!0,"rlc","auto auto fit"],subarray:["Array",null,null,null,null,p.default.cols(0),"0.1em","S",1],smallmatrix:["Array",null,null,null,"c",p.default.cols(1/3),".2em","S",1],matrix:["Array",null,null,null,"c"],pmatrix:["Array",null,"(",")","c"],bmatrix:["Array",null,"[","]","c"],Bmatrix:["Array",null,"\\{","\\}","c"],vmatrix:["Array",null,"\\vert","\\vert","c"],Vmatrix:["Array",null,"\\Vert","\\Vert","c"],cases:["Array",null,"\\{",".","ll",null,".2em","T"]},a.AmsMethods),new l.DelimiterMap("AMSmath-delimiter",u.default.delimiter,{"\\lvert":["|",{texClass:h.TEXCLASS.OPEN}],"\\rvert":["|",{texClass:h.TEXCLASS.CLOSE}],"\\lVert":["\u2016",{texClass:h.TEXCLASS.OPEN}],"\\rVert":["\u2016",{texClass:h.TEXCLASS.CLOSE}]}),new l.CharacterMap("AMSsymbols-mathchar0mi",u.default.mathchar0mi,{digamma:"\u03dd",varkappa:"\u03f0",varGamma:["\u0393",{mathvariant:c.TexConstant.Variant.ITALIC}],varDelta:["\u0394",{mathvariant:c.TexConstant.Variant.ITALIC}],varTheta:["\u0398",{mathvariant:c.TexConstant.Variant.ITALIC}],varLambda:["\u039b",{mathvariant:c.TexConstant.Variant.ITALIC}],varXi:["\u039e",{mathvariant:c.TexConstant.Variant.ITALIC}],varPi:["\u03a0",{mathvariant:c.TexConstant.Variant.ITALIC}],varSigma:["\u03a3",{mathvariant:c.TexConstant.Variant.ITALIC}],varUpsilon:["\u03a5",{mathvariant:c.TexConstant.Variant.ITALIC}],varPhi:["\u03a6",{mathvariant:c.TexConstant.Variant.ITALIC}],varPsi:["\u03a8",{mathvariant:c.TexConstant.Variant.ITALIC}],varOmega:["\u03a9",{mathvariant:c.TexConstant.Variant.ITALIC}],beth:"\u2136",gimel:"\u2137",daleth:"\u2138",backprime:["\u2035",{variantForm:!0}],hslash:"\u210f",varnothing:["\u2205",{variantForm:!0}],blacktriangle:"\u25b4",triangledown:["\u25bd",{variantForm:!0}],blacktriangledown:"\u25be",square:"\u25fb",Box:"\u25fb",blacksquare:"\u25fc",lozenge:"\u25ca",Diamond:"\u25ca",blacklozenge:"\u29eb",circledS:["\u24c8",{mathvariant:c.TexConstant.Variant.NORMAL}],bigstar:"\u2605",sphericalangle:"\u2222",measuredangle:"\u2221",nexists:"\u2204",complement:"\u2201",mho:"\u2127",eth:["\xf0",{mathvariant:c.TexConstant.Variant.NORMAL}],Finv:"\u2132",diagup:"\u2571",Game:"\u2141",diagdown:"\u2572",Bbbk:["k",{mathvariant:c.TexConstant.Variant.DOUBLESTRUCK}],yen:"\xa5",circledR:"\xae",checkmark:"\u2713",maltese:"\u2720"}),new l.CharacterMap("AMSsymbols-mathchar0mo",u.default.mathchar0mo,{dotplus:"\u2214",ltimes:"\u22c9",smallsetminus:["\u2216",{variantForm:!0}],rtimes:"\u22ca",Cap:"\u22d2",doublecap:"\u22d2",leftthreetimes:"\u22cb",Cup:"\u22d3",doublecup:"\u22d3",rightthreetimes:"\u22cc",barwedge:"\u22bc",curlywedge:"\u22cf",veebar:"\u22bb",curlyvee:"\u22ce",doublebarwedge:"\u2a5e",boxminus:"\u229f",circleddash:"\u229d",boxtimes:"\u22a0",circledast:"\u229b",boxdot:"\u22a1",circledcirc:"\u229a",boxplus:"\u229e",centerdot:["\u22c5",{variantForm:!0}],divideontimes:"\u22c7",intercal:"\u22ba",leqq:"\u2266",geqq:"\u2267",leqslant:"\u2a7d",geqslant:"\u2a7e",eqslantless:"\u2a95",eqslantgtr:"\u2a96",lesssim:"\u2272",gtrsim:"\u2273",lessapprox:"\u2a85",gtrapprox:"\u2a86",approxeq:"\u224a",lessdot:"\u22d6",gtrdot:"\u22d7",lll:"\u22d8",llless:"\u22d8",ggg:"\u22d9",gggtr:"\u22d9",lessgtr:"\u2276",gtrless:"\u2277",lesseqgtr:"\u22da",gtreqless:"\u22db",lesseqqgtr:"\u2a8b",gtreqqless:"\u2a8c",doteqdot:"\u2251",Doteq:"\u2251",eqcirc:"\u2256",risingdotseq:"\u2253",circeq:"\u2257",fallingdotseq:"\u2252",triangleq:"\u225c",backsim:"\u223d",thicksim:["\u223c",{variantForm:!0}],backsimeq:"\u22cd",thickapprox:["\u2248",{variantForm:!0}],subseteqq:"\u2ac5",supseteqq:"\u2ac6",Subset:"\u22d0",Supset:"\u22d1",sqsubset:"\u228f",sqsupset:"\u2290",preccurlyeq:"\u227c",succcurlyeq:"\u227d",curlyeqprec:"\u22de",curlyeqsucc:"\u22df",precsim:"\u227e",succsim:"\u227f",precapprox:"\u2ab7",succapprox:"\u2ab8",vartriangleleft:"\u22b2",lhd:"\u22b2",vartriangleright:"\u22b3",rhd:"\u22b3",trianglelefteq:"\u22b4",unlhd:"\u22b4",trianglerighteq:"\u22b5",unrhd:"\u22b5",vDash:["\u22a8",{variantForm:!0}],Vdash:"\u22a9",Vvdash:"\u22aa",smallsmile:["\u2323",{variantForm:!0}],shortmid:["\u2223",{variantForm:!0}],smallfrown:["\u2322",{variantForm:!0}],shortparallel:["\u2225",{variantForm:!0}],bumpeq:"\u224f",between:"\u226c",Bumpeq:"\u224e",pitchfork:"\u22d4",varpropto:["\u221d",{variantForm:!0}],backepsilon:"\u220d",blacktriangleleft:"\u25c2",blacktriangleright:"\u25b8",therefore:"\u2234",because:"\u2235",eqsim:"\u2242",vartriangle:["\u25b3",{variantForm:!0}],Join:"\u22c8",nless:"\u226e",ngtr:"\u226f",nleq:"\u2270",ngeq:"\u2271",nleqslant:["\u2a87",{variantForm:!0}],ngeqslant:["\u2a88",{variantForm:!0}],nleqq:["\u2270",{variantForm:!0}],ngeqq:["\u2271",{variantForm:!0}],lneq:"\u2a87",gneq:"\u2a88",lneqq:"\u2268",gneqq:"\u2269",lvertneqq:["\u2268",{variantForm:!0}],gvertneqq:["\u2269",{variantForm:!0}],lnsim:"\u22e6",gnsim:"\u22e7",lnapprox:"\u2a89",gnapprox:"\u2a8a",nprec:"\u2280",nsucc:"\u2281",npreceq:["\u22e0",{variantForm:!0}],nsucceq:["\u22e1",{variantForm:!0}],precneqq:"\u2ab5",succneqq:"\u2ab6",precnsim:"\u22e8",succnsim:"\u22e9",precnapprox:"\u2ab9",succnapprox:"\u2aba",nsim:"\u2241",ncong:"\u2247",nshortmid:["\u2224",{variantForm:!0}],nshortparallel:["\u2226",{variantForm:!0}],nmid:"\u2224",nparallel:"\u2226",nvdash:"\u22ac",nvDash:"\u22ad",nVdash:"\u22ae",nVDash:"\u22af",ntriangleleft:"\u22ea",ntriangleright:"\u22eb",ntrianglelefteq:"\u22ec",ntrianglerighteq:"\u22ed",nsubseteq:"\u2288",nsupseteq:"\u2289",nsubseteqq:["\u2288",{variantForm:!0}],nsupseteqq:["\u2289",{variantForm:!0}],subsetneq:"\u228a",supsetneq:"\u228b",varsubsetneq:["\u228a",{variantForm:!0}],varsupsetneq:["\u228b",{variantForm:!0}],subsetneqq:"\u2acb",supsetneqq:"\u2acc",varsubsetneqq:["\u2acb",{variantForm:!0}],varsupsetneqq:["\u2acc",{variantForm:!0}],leftleftarrows:"\u21c7",rightrightarrows:"\u21c9",leftrightarrows:"\u21c6",rightleftarrows:"\u21c4",Lleftarrow:"\u21da",Rrightarrow:"\u21db",twoheadleftarrow:"\u219e",twoheadrightarrow:"\u21a0",leftarrowtail:"\u21a2",rightarrowtail:"\u21a3",looparrowleft:"\u21ab",looparrowright:"\u21ac",leftrightharpoons:"\u21cb",rightleftharpoons:["\u21cc",{variantForm:!0}],curvearrowleft:"\u21b6",curvearrowright:"\u21b7",circlearrowleft:"\u21ba",circlearrowright:"\u21bb",Lsh:"\u21b0",Rsh:"\u21b1",upuparrows:"\u21c8",downdownarrows:"\u21ca",upharpoonleft:"\u21bf",upharpoonright:"\u21be",downharpoonleft:"\u21c3",restriction:"\u21be",multimap:"\u22b8",downharpoonright:"\u21c2",leftrightsquigarrow:"\u21ad",rightsquigarrow:"\u21dd",leadsto:"\u21dd",dashrightarrow:"\u21e2",dashleftarrow:"\u21e0",nleftarrow:"\u219a",nrightarrow:"\u219b",nLeftarrow:"\u21cd",nRightarrow:"\u21cf",nleftrightarrow:"\u21ae",nLeftrightarrow:"\u21ce"}),new l.DelimiterMap("AMSsymbols-delimiter",u.default.delimiter,{"\\ulcorner":"\u231c","\\urcorner":"\u231d","\\llcorner":"\u231e","\\lrcorner":"\u231f"}),new l.CommandMap("AMSsymbols-macros",{implies:["Macro","\\;\\Longrightarrow\\;"],impliedby:["Macro","\\;\\Longleftarrow\\;"]},a.AmsMethods)},4387:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},n.apply(this,arguments)},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.NEW_OPS=e.AmsMethods=void 0;var s=i(r(1130)),a=i(r(5450)),l=i(r(1256)),c=r(8317),u=i(r(8417)),p=i(r(3971)),h=r(8803),f=i(r(7693)),d=r(9007);function m(t){if(!t||t.isInferred&&0===t.childNodes.length)return[null,null];if(t.isKind("msubsup")&&y(t))return[t,null];var e=l.default.getChildAt(t,0);return t.isInferred&&e&&y(e)?(t.childNodes.splice(0,1),[e,t]):[null,t]}function y(t){var e=t.childNodes[0];return e&&e.isKind("mi")&&""===e.getText()}e.AmsMethods={},e.AmsMethods.AmsEqnArray=function(t,e,r,n,o,i,a){var l=t.GetBrackets("\\begin{"+e.getName()+"}"),c=f.default.EqnArray(t,e,r,n,o,i,a);return s.default.setArrayAlign(c,l)},e.AmsMethods.AlignAt=function(t,r,n,o){var i,a,l=r.getName(),c="",u=[];if(o||(a=t.GetBrackets("\\begin{"+l+"}")),(i=t.GetArgument("\\begin{"+l+"}")).match(/[^0-9]/))throw new p.default("PositiveIntegerArg","Argument to %1 must me a positive integer","\\begin{"+l+"}");for(var h=parseInt(i,10);h>0;)c+="rl",u.push("0em 0em"),h--;var f=u.join(" ");if(o)return e.AmsMethods.EqnArray(t,r,n,o,c,f);var d=e.AmsMethods.EqnArray(t,r,n,o,c,f);return s.default.setArrayAlign(d,a)},e.AmsMethods.Multline=function(t,e,r){t.Push(e),s.default.checkEqnEnv(t);var n=t.itemFactory.create("multline",r,t.stack);return n.arraydef={displaystyle:!0,rowspacing:".5em",columnspacing:"100%",width:t.options.ams.multlineWidth,side:t.options.tagSide,minlabelspacing:t.options.tagIndent,framespacing:t.options.ams.multlineIndent+" 0",frame:"","data-width-includes-label":!0},n},e.AmsMethods.XalignAt=function(t,r,n,o){var i=t.GetArgument("\\begin{"+r.getName()+"}");if(i.match(/[^0-9]/))throw new p.default("PositiveIntegerArg","Argument to %1 must me a positive integer","\\begin{"+r.getName()+"}");var s=o?"crl":"rlc",a=o?"fit auto auto":"auto auto fit",l=e.AmsMethods.FlalignArray(t,r,n,o,!1,s,a,!0);return l.setProperty("xalignat",2*parseInt(i)),l},e.AmsMethods.FlalignArray=function(t,e,r,n,o,i,a,l){void 0===l&&(l=!1),t.Push(e),s.default.checkEqnEnv(t),i=i.split("").join(" ").replace(/r/g,"right").replace(/l/g,"left").replace(/c/g,"center");var c=t.itemFactory.create("flalign",e.getName(),r,n,o,t.stack);return c.arraydef={width:"100%",displaystyle:!0,columnalign:i,columnspacing:"0em",columnwidth:a,rowspacing:"3pt",side:t.options.tagSide,minlabelspacing:l?"0":t.options.tagIndent,"data-width-includes-label":!0},c.setProperty("zeroWidthLabel",l),c},e.NEW_OPS="ams-declare-ops",e.AmsMethods.HandleDeclareOp=function(t,r){var n=t.GetStar()?"*":"",o=s.default.trimSpaces(t.GetArgument(r));"\\"===o.charAt(0)&&(o=o.substr(1));var i=t.GetArgument(r);t.configuration.handlers.retrieve(e.NEW_OPS).add(o,new h.Macro(o,e.AmsMethods.Macro,["\\operatorname".concat(n,"{").concat(i,"}")]))},e.AmsMethods.HandleOperatorName=function(t,e){var r=t.GetStar(),o=s.default.trimSpaces(t.GetArgument(e)),i=new u.default(o,n(n({},t.stack.env),{font:c.TexConstant.Variant.NORMAL,multiLetterIdentifiers:/^[-*a-z]+/i,operatorLetters:!0}),t.configuration).mml();if(i.isKind("mi")||(i=t.create("node","TeXAtom",[i])),l.default.setProperties(i,{movesupsub:r,movablelimits:!0,texClass:d.TEXCLASS.OP}),!r){var a=t.GetNext(),p=t.i;"\\"===a&&++t.i&&"limits"!==t.GetCS()&&(t.i=p)}t.Push(i)},e.AmsMethods.SideSet=function(t,e){var r=o(m(t.ParseArg(e)),2),n=r[0],i=r[1],a=o(m(t.ParseArg(e)),2),c=a[0],u=a[1],p=t.ParseArg(e),h=p;n&&(i?n.replaceChild(t.create("node","mphantom",[t.create("node","mpadded",[s.default.copyNode(p,t)],{width:0})]),l.default.getChildAt(n,0)):(h=t.create("node","mmultiscripts",[p]),c&&l.default.appendChildren(h,[l.default.getChildAt(c,1)||t.create("node","none"),l.default.getChildAt(c,2)||t.create("node","none")]),l.default.setProperty(h,"scriptalign","left"),l.default.appendChildren(h,[t.create("node","mprescripts"),l.default.getChildAt(n,1)||t.create("node","none"),l.default.getChildAt(n,2)||t.create("node","none")]))),c&&h===p&&(c.replaceChild(p,l.default.getChildAt(c,0)),h=c);var f=t.create("node","TeXAtom",[],{texClass:d.TEXCLASS.OP,movesupsub:!0,movablelimits:!0});i&&(n&&f.appendChild(n),f.appendChild(i)),f.appendChild(h),u&&f.appendChild(u),t.Push(f)},e.AmsMethods.operatorLetter=function(t,e){return!!t.stack.env.operatorLetters&&a.default.variable(t,e)},e.AmsMethods.MultiIntegral=function(t,e,r){var n=t.GetNext();if("\\"===n){var o=t.i;n=t.GetArgument(e),t.i=o,"\\limits"===n&&(r="\\idotsint"===e?"\\!\\!\\mathop{\\,\\,"+r+"}":"\\!\\!\\!\\mathop{\\,\\,\\,"+r+"}")}t.string=r+" "+t.string.slice(t.i),t.i=0},e.AmsMethods.xArrow=function(t,e,r,n,o){var i={width:"+"+s.default.Em((n+o)/18),lspace:s.default.Em(n/18)},a=t.GetBrackets(e),c=t.ParseArg(e),p=t.create("node","mspace",[],{depth:".25em"}),h=t.create("token","mo",{stretchy:!0,texClass:d.TEXCLASS.REL},String.fromCodePoint(r));h=t.create("node","mstyle",[h],{scriptlevel:0});var f=t.create("node","munderover",[h]),m=t.create("node","mpadded",[c,p],i);if(l.default.setAttribute(m,"voffset","-.2em"),l.default.setAttribute(m,"height","-.2em"),l.default.setChild(f,f.over,m),a){var y=new u.default(a,t.stack.env,t.configuration).mml(),g=t.create("node","mspace",[],{height:".75em"});m=t.create("node","mpadded",[y,g],i),l.default.setAttribute(m,"voffset",".15em"),l.default.setAttribute(m,"depth","-.15em"),l.default.setChild(f,f.under,m)}l.default.setProperty(f,"subsupOK",!0),t.Push(f)},e.AmsMethods.HandleShove=function(t,e,r){var n=t.stack.Top();if("multline"!==n.kind)throw new p.default("CommandOnlyAllowedInEnv","%1 only allowed in %2 environment",t.currentCS,"multline");if(n.Size())throw new p.default("CommandAtTheBeginingOfLine","%1 must come at the beginning of the line",t.currentCS);n.setProperty("shove",r)},e.AmsMethods.CFrac=function(t,e){var r=s.default.trimSpaces(t.GetBrackets(e,"")),n=t.GetArgument(e),o=t.GetArgument(e),i={l:c.TexConstant.Align.LEFT,r:c.TexConstant.Align.RIGHT,"":""},a=new u.default("\\strut\\textstyle{"+n+"}",t.stack.env,t.configuration).mml(),h=new u.default("\\strut\\textstyle{"+o+"}",t.stack.env,t.configuration).mml(),f=t.create("node","mfrac",[a,h]);if(null==(r=i[r]))throw new p.default("IllegalAlign","Illegal alignment specified in %1",t.currentCS);r&&l.default.setProperties(f,{numalign:r,denomalign:r}),t.Push(f)},e.AmsMethods.Genfrac=function(t,e,r,n,o,i){null==r&&(r=t.GetDelimiterArg(e)),null==n&&(n=t.GetDelimiterArg(e)),null==o&&(o=t.GetArgument(e)),null==i&&(i=s.default.trimSpaces(t.GetArgument(e)));var a=t.ParseArg(e),c=t.ParseArg(e),u=t.create("node","mfrac",[a,c]);if(""!==o&&l.default.setAttribute(u,"linethickness",o),(r||n)&&(l.default.setProperty(u,"withDelims",!0),u=s.default.fixedFence(t.configuration,r,u,n)),""!==i){var h=parseInt(i,10),f=["D","T","S","SS"][h];if(null==f)throw new p.default("BadMathStyleFor","Bad math style for %1",t.currentCS);u=t.create("node","mstyle",[u]),"D"===f?l.default.setProperties(u,{displaystyle:!0,scriptlevel:0}):l.default.setProperties(u,{displaystyle:!1,scriptlevel:h-1})}t.Push(u)},e.AmsMethods.HandleTag=function(t,e){if(!t.tags.currentTag.taggable&&t.tags.env)throw new p.default("CommandNotAllowedInEnv","%1 not allowed in %2 environment",t.currentCS,t.tags.env);if(t.tags.currentTag.tag)throw new p.default("MultipleCommand","Multiple %1",t.currentCS);var r=t.GetStar(),n=s.default.trimSpaces(t.GetArgument(e));t.tags.tag(n,r)},e.AmsMethods.HandleNoTag=f.default.HandleNoTag,e.AmsMethods.HandleRef=f.default.HandleRef,e.AmsMethods.Macro=f.default.Macro,e.AmsMethods.Accent=f.default.Accent,e.AmsMethods.Tilde=f.default.Tilde,e.AmsMethods.Array=f.default.Array,e.AmsMethods.Spacer=f.default.Spacer,e.AmsMethods.NamedOp=f.default.NamedOp,e.AmsMethods.EqnArray=f.default.EqnArray,e.AmsMethods.Equation=f.default.Equation},1275:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AutoloadConfiguration=void 0;var i=r(9899),s=r(9140),a=r(8803),l=r(7741),c=r(265),u=r(7233);function p(t,e,r,i){var s,a,u,p;if(c.Package.packages.has(t.options.require.prefix+r)){var d=t.options.autoload[r],m=n(2===d.length&&Array.isArray(d[0])?d:[d,[]],2),y=m[0],g=m[1];try{for(var b=o(y),v=b.next();!v.done;v=b.next()){var _=v.value;h.remove(_)}}catch(t){s={error:t}}finally{try{v&&!v.done&&(a=b.return)&&a.call(b)}finally{if(s)throw s.error}}try{for(var S=o(g),O=S.next();!O.done;O=S.next()){var M=O.value;f.remove(M)}}catch(t){u={error:t}}finally{try{O&&!O.done&&(p=S.return)&&p.call(S)}finally{if(u)throw u.error}}t.string=(i?e+" ":"\\begin{"+e.slice(1)+"}")+t.string.slice(t.i),t.i=0}(0,l.RequireLoad)(t,r)}var h=new s.CommandMap("autoload-macros",{},{}),f=new s.CommandMap("autoload-environments",{},{});e.AutoloadConfiguration=i.Configuration.create("autoload",{handler:{macro:["autoload-macros"],environment:["autoload-environments"]},options:{autoload:(0,u.expandable)({action:["toggle","mathtip","texttip"],amscd:[[],["CD"]],bbox:["bbox"],boldsymbol:["boldsymbol"],braket:["bra","ket","braket","set","Bra","Ket","Braket","Set","ketbra","Ketbra"],bussproofs:[[],["prooftree"]],cancel:["cancel","bcancel","xcancel","cancelto"],color:["color","definecolor","textcolor","colorbox","fcolorbox"],enclose:["enclose"],extpfeil:["xtwoheadrightarrow","xtwoheadleftarrow","xmapsto","xlongequal","xtofrom","Newextarrow"],html:["href","class","style","cssId"],mhchem:["ce","pu"],newcommand:["newcommand","renewcommand","newenvironment","renewenvironment","def","let"],unicode:["unicode"],verb:["verb"]})},config:function(t,e){var r,i,s,c,u,d,m=e.parseOptions,y=m.handlers.get("macro"),g=m.handlers.get("environment"),b=m.options.autoload;m.packageData.set("autoload",{Autoload:p});try{for(var v=o(Object.keys(b)),_=v.next();!_.done;_=v.next()){var S=_.value,O=b[S],M=n(2===O.length&&Array.isArray(O[0])?O:[O,[]],2),x=M[0],E=M[1];try{for(var A=(s=void 0,o(x)),C=A.next();!C.done;C=A.next()){var T=C.value;y.lookup(T)&&"color"!==T||h.add(T,new a.Macro(T,p,[S,!0]))}}catch(t){s={error:t}}finally{try{C&&!C.done&&(c=A.return)&&c.call(A)}finally{if(s)throw s.error}}try{for(var N=(u=void 0,o(E)),w=N.next();!w.done;w=N.next()){var L=w.value;g.lookup(L)||f.add(L,new a.Macro(L,p,[S,!1]))}}catch(t){u={error:t}}finally{try{w&&!w.done&&(d=N.return)&&d.call(N)}finally{if(u)throw u.error}}}}catch(t){r={error:t}}finally{try{_&&!_.done&&(i=v.return)&&i.call(v)}finally{if(r)throw r.error}}m.packageData.get("require")||l.RequireConfiguration.config(t,e)},init:function(t){t.options.require||(0,u.defaultOptions)(t.options,l.RequireConfiguration.options)},priority:10})},2942:function(t,e,r){var n,o,i=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),s=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),l=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&s(e,t,r);return a(e,t),e},c=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},u=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.BaseConfiguration=e.BaseTags=e.Other=void 0;var p=r(9899),h=r(2947),f=u(r(3971)),d=u(r(1256)),m=r(9140),y=l(r(1181)),g=r(6521);r(1267);var b=r(4082);function v(t,e){var r=t.stack.env.font?{mathvariant:t.stack.env.font}:{},n=h.MapHandler.getMap("remap").lookup(e),o=(0,b.getRange)(e),i=o?o[3]:"mo",s=t.create("token",i,r,n?n.char:e);o[4]&&s.attributes.set("mathvariant",o[4]),"mo"===i&&(d.default.setProperty(s,"fixStretchy",!0),t.configuration.addNode("fixStretchy",s)),t.Push(s)}new m.CharacterMap("remap",null,{"-":"\u2212","*":"\u2217","`":"\u2018"}),e.Other=v;var _=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e}(g.AbstractTags);e.BaseTags=_,e.BaseConfiguration=p.Configuration.create("base",{handler:{character:["command","special","letter","digit"],delimiter:["delimiter"],macro:["delimiter","macros","mathchar0mi","mathchar0mo","mathchar7"],environment:["environment"]},fallback:{character:v,macro:function(t,e){throw new f.default("UndefinedControlSequence","Undefined control sequence %1","\\"+e)},environment:function(t,e){throw new f.default("UnknownEnv","Unknown environment '%1'",e)}},items:(o={},o[y.StartItem.prototype.kind]=y.StartItem,o[y.StopItem.prototype.kind]=y.StopItem,o[y.OpenItem.prototype.kind]=y.OpenItem,o[y.CloseItem.prototype.kind]=y.CloseItem,o[y.PrimeItem.prototype.kind]=y.PrimeItem,o[y.SubsupItem.prototype.kind]=y.SubsupItem,o[y.OverItem.prototype.kind]=y.OverItem,o[y.LeftItem.prototype.kind]=y.LeftItem,o[y.Middle.prototype.kind]=y.Middle,o[y.RightItem.prototype.kind]=y.RightItem,o[y.BeginItem.prototype.kind]=y.BeginItem,o[y.EndItem.prototype.kind]=y.EndItem,o[y.StyleItem.prototype.kind]=y.StyleItem,o[y.PositionItem.prototype.kind]=y.PositionItem,o[y.CellItem.prototype.kind]=y.CellItem,o[y.MmlItem.prototype.kind]=y.MmlItem,o[y.FnItem.prototype.kind]=y.FnItem,o[y.NotItem.prototype.kind]=y.NotItem,o[y.NonscriptItem.prototype.kind]=y.NonscriptItem,o[y.DotsItem.prototype.kind]=y.DotsItem,o[y.ArrayItem.prototype.kind]=y.ArrayItem,o[y.EqnArrayItem.prototype.kind]=y.EqnArrayItem,o[y.EquationItem.prototype.kind]=y.EquationItem,o),options:{maxMacros:1e3,baseURL:"undefined"==typeof document||0===document.getElementsByTagName("base").length?"":String(document.location).replace(/#.*$/,"")},tags:{base:_},postprocessors:[[function(t){var e,r,n=t.data;try{for(var o=c(n.getList("nonscript")),i=o.next();!i.done;i=o.next()){var s=i.value;if(s.attributes.get("scriptlevel")>0){var a=s.parent;if(a.childNodes.splice(a.childIndex(s),1),n.removeFromList(s.kind,[s]),s.isKind("mrow")){var l=s.childNodes[0];n.removeFromList("mstyle",[l]),n.removeFromList("mspace",l.childNodes[0].childNodes)}}else s.isKind("mrow")&&(s.parent.replaceChild(s.childNodes[0],s),n.removeFromList("mrow",[s]))}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},-4]]})},1181:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.EquationItem=e.EqnArrayItem=e.ArrayItem=e.DotsItem=e.NonscriptItem=e.NotItem=e.FnItem=e.MmlItem=e.CellItem=e.PositionItem=e.StyleItem=e.EndItem=e.BeginItem=e.RightItem=e.Middle=e.LeftItem=e.OverItem=e.SubsupItem=e.PrimeItem=e.CloseItem=e.OpenItem=e.StopItem=e.StartItem=void 0;var l=r(2947),c=r(5368),u=r(9007),p=a(r(3971)),h=a(r(1130)),f=a(r(1256)),d=r(8292),m=function(t){function e(e,r){var n=t.call(this,e)||this;return n.global=r,n}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"start"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isKind("stop")){var r=this.toMml();return this.global.isInner||(r=this.factory.configuration.tags.finalize(r,this.env)),[[this.factory.create("mml",r)],!0]}return t.prototype.checkItem.call(this,e)},e}(d.BaseItem);e.StartItem=m;var y=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"stop"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isClose",{get:function(){return!0},enumerable:!1,configurable:!0}),e}(d.BaseItem);e.StopItem=y;var g=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"open"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isKind("close")){var r=this.toMml(),n=this.create("node","TeXAtom",[r]);return[[this.factory.create("mml",n)],!0]}return t.prototype.checkItem.call(this,e)},e.errors=Object.assign(Object.create(d.BaseItem.errors),{stop:["ExtraOpenMissingClose","Extra open brace or missing close brace"]}),e}(d.BaseItem);e.OpenItem=g;var b=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"close"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isClose",{get:function(){return!0},enumerable:!1,configurable:!0}),e}(d.BaseItem);e.CloseItem=b;var v=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"prime"},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(t){var e=i(this.Peek(2),2),r=e[0],n=e[1];return!f.default.isType(r,"msubsup")||f.default.isType(r,"msup")?[[this.create("node","msup",[r,n]),t],!0]:(f.default.setChild(r,r.sup,n),[[r,t],!0])},e}(d.BaseItem);e.PrimeItem=v;var _=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"subsup"},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isKind("open")||e.isKind("left"))return d.BaseItem.success;var r=this.First,n=this.getProperty("position");if(e.isKind("mml")){if(this.getProperty("primes"))if(2!==n)f.default.setChild(r,2,this.getProperty("primes"));else{f.default.setProperty(this.getProperty("primes"),"variantForm",!0);var o=this.create("node","mrow",[this.getProperty("primes"),e.First]);e.First=o}return f.default.setChild(r,n,e.First),null!=this.getProperty("movesupsub")&&f.default.setProperty(r,"movesupsub",this.getProperty("movesupsub")),[[this.factory.create("mml",r)],!0]}if(t.prototype.checkItem.call(this,e)[1]){var a=this.getErrors(["","sub","sup"][n]);throw new(p.default.bind.apply(p.default,s([void 0,a[0],a[1]],i(a.splice(2)),!1)))}return null},e.errors=Object.assign(Object.create(d.BaseItem.errors),{stop:["MissingScript","Missing superscript or subscript argument"],sup:["MissingOpenForSup","Missing open brace for superscript"],sub:["MissingOpenForSub","Missing open brace for subscript"]}),e}(d.BaseItem);e.SubsupItem=_;var S=function(t){function e(e){var r=t.call(this,e)||this;return r.setProperty("name","\\over"),r}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"over"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isClose",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isKind("over"))throw new p.default("AmbiguousUseOf","Ambiguous use of %1",e.getName());if(e.isClose){var r=this.create("node","mfrac",[this.getProperty("num"),this.toMml(!1)]);return null!=this.getProperty("thickness")&&f.default.setAttribute(r,"linethickness",this.getProperty("thickness")),(this.getProperty("open")||this.getProperty("close"))&&(f.default.setProperty(r,"withDelims",!0),r=h.default.fixedFence(this.factory.configuration,this.getProperty("open"),r,this.getProperty("close"))),[[this.factory.create("mml",r),e],!0]}return t.prototype.checkItem.call(this,e)},e.prototype.toString=function(){return"over["+this.getProperty("num")+" / "+this.nodes.join("; ")+"]"},e}(d.BaseItem);e.OverItem=S;var O=function(t){function e(e,r){var n=t.call(this,e)||this;return n.setProperty("delim",r),n}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"left"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isKind("right"))return[[this.factory.create("mml",h.default.fenced(this.factory.configuration,this.getProperty("delim"),this.toMml(),e.getProperty("delim"),"",e.getProperty("color")))],!0];if(e.isKind("middle")){var r={stretchy:!0};return e.getProperty("color")&&(r.mathcolor=e.getProperty("color")),this.Push(this.create("node","TeXAtom",[],{texClass:u.TEXCLASS.CLOSE}),this.create("token","mo",r,e.getProperty("delim")),this.create("node","TeXAtom",[],{texClass:u.TEXCLASS.OPEN})),this.env={},[[this],!0]}return t.prototype.checkItem.call(this,e)},e.errors=Object.assign(Object.create(d.BaseItem.errors),{stop:["ExtraLeftMissingRight","Extra \\left or missing \\right"]}),e}(d.BaseItem);e.LeftItem=O;var M=function(t){function e(e,r,n){var o=t.call(this,e)||this;return o.setProperty("delim",r),n&&o.setProperty("color",n),o}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"middle"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isClose",{get:function(){return!0},enumerable:!1,configurable:!0}),e}(d.BaseItem);e.Middle=M;var x=function(t){function e(e,r,n){var o=t.call(this,e)||this;return o.setProperty("delim",r),n&&o.setProperty("color",n),o}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"right"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isClose",{get:function(){return!0},enumerable:!1,configurable:!0}),e}(d.BaseItem);e.RightItem=x;var E=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"begin"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isKind("end")){if(e.getName()!==this.getName())throw new p.default("EnvBadEnd","\\begin{%1} ended with \\end{%2}",this.getName(),e.getName());return this.getProperty("end")?d.BaseItem.fail:[[this.factory.create("mml",this.toMml())],!0]}if(e.isKind("stop"))throw new p.default("EnvMissingEnd","Missing \\end{%1}",this.getName());return t.prototype.checkItem.call(this,e)},e}(d.BaseItem);e.BeginItem=E;var A=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"end"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isClose",{get:function(){return!0},enumerable:!1,configurable:!0}),e}(d.BaseItem);e.EndItem=A;var C=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"style"},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(!e.isClose)return t.prototype.checkItem.call(this,e);var r=this.create("node","mstyle",this.nodes,this.getProperty("styles"));return[[this.factory.create("mml",r),e],!0]},e}(d.BaseItem);e.StyleItem=C;var T=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"position"},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isClose)throw new p.default("MissingBoxFor","Missing box for %1",this.getName());if(e.isFinal){var r=e.toMml();switch(this.getProperty("move")){case"vertical":return r=this.create("node","mpadded",[r],{height:this.getProperty("dh"),depth:this.getProperty("dd"),voffset:this.getProperty("dh")}),[[this.factory.create("mml",r)],!0];case"horizontal":return[[this.factory.create("mml",this.getProperty("left")),e,this.factory.create("mml",this.getProperty("right"))],!0]}}return t.prototype.checkItem.call(this,e)},e}(d.BaseItem);e.PositionItem=T;var N=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"cell"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isClose",{get:function(){return!0},enumerable:!1,configurable:!0}),e}(d.BaseItem);e.CellItem=N;var w=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"isFinal",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"kind",{get:function(){return"mml"},enumerable:!1,configurable:!0}),e}(d.BaseItem);e.MmlItem=w;var L=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"fn"},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){var r=this.First;if(r){if(e.isOpen)return d.BaseItem.success;if(!e.isKind("fn")){var n=e.First;if(!e.isKind("mml")||!n)return[[r,e],!0];if(f.default.isType(n,"mstyle")&&n.childNodes.length&&f.default.isType(n.childNodes[0].childNodes[0],"mspace")||f.default.isType(n,"mspace"))return[[r,e],!0];f.default.isEmbellished(n)&&(n=f.default.getCoreMO(n));var o=f.default.getForm(n);if(null!=o&&[0,0,1,1,0,1,1,0,0,0][o[2]])return[[r,e],!0]}var i=this.create("token","mo",{texClass:u.TEXCLASS.NONE},c.entities.ApplyFunction);return[[r,i,e],!0]}return t.prototype.checkItem.apply(this,arguments)},e}(d.BaseItem);e.FnItem=L;var I=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.remap=l.MapHandler.getMap("not_remap"),e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"not"},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(t){var e,r,n;if(t.isKind("open")||t.isKind("left"))return d.BaseItem.success;if(t.isKind("mml")&&(f.default.isType(t.First,"mo")||f.default.isType(t.First,"mi")||f.default.isType(t.First,"mtext"))&&(e=t.First,1===(r=f.default.getText(e)).length&&!f.default.getProperty(e,"movesupsub")&&1===f.default.getChildren(e).length))return this.remap.contains(r)?(n=this.create("text",this.remap.lookup(r).char),f.default.setChild(e,0,n)):(n=this.create("text","\u0338"),f.default.appendChildren(e,[n])),[[t],!0];n=this.create("text","\u29f8");var o=this.create("node","mtext",[],{},n),i=this.create("node","mpadded",[o],{width:0});return[[e=this.create("node","TeXAtom",[i],{texClass:u.TEXCLASS.REL}),t],!0]},e}(d.BaseItem);e.NotItem=I;var P=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"nonscript"},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(t){if(t.isKind("mml")&&1===t.Size()){var e=t.First;if(e.isKind("mstyle")&&e.notParent&&(e=f.default.getChildren(f.default.getChildren(e)[0])[0]),e.isKind("mspace")){if(e!==t.First){var r=this.create("node","mrow",[t.Pop()]);t.Push(r)}this.factory.configuration.addNode("nonscript",t.First)}}return[[t],!0]},e}(d.BaseItem);e.NonscriptItem=P;var R=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"dots"},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(t){if(t.isKind("open")||t.isKind("left"))return d.BaseItem.success;var e=this.getProperty("ldots"),r=t.First;if(t.isKind("mml")&&f.default.isEmbellished(r)){var n=f.default.getTexClass(f.default.getCoreMO(r));n!==u.TEXCLASS.BIN&&n!==u.TEXCLASS.REL||(e=this.getProperty("cdots"))}return[[e,t],!0]},e}(d.BaseItem);e.DotsItem=R;var k=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.table=[],e.row=[],e.frame=[],e.hfill=[],e.arraydef={},e.dashed=!1,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"array"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"copyEnv",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isClose&&!e.isKind("over")){if(e.getProperty("isEntry"))return this.EndEntry(),this.clearEnv(),d.BaseItem.fail;if(e.getProperty("isCR"))return this.EndEntry(),this.EndRow(),this.clearEnv(),d.BaseItem.fail;this.EndTable(),this.clearEnv();var r=this.factory.create("mml",this.createMml());if(this.getProperty("requireClose")){if(e.isKind("close"))return[[r],!0];throw new p.default("MissingCloseBrace","Missing close brace")}return[[r,e],!0]}return t.prototype.checkItem.call(this,e)},e.prototype.createMml=function(){var t=this.arraydef.scriptlevel;delete this.arraydef.scriptlevel;var e=this.create("node","mtable",this.table,this.arraydef);return t&&e.setProperty("scriptlevel",t),4===this.frame.length?f.default.setAttribute(e,"frame",this.dashed?"dashed":"solid"):this.frame.length&&(this.arraydef.rowlines&&(this.arraydef.rowlines=this.arraydef.rowlines.replace(/none( none)+$/,"none")),f.default.setAttribute(e,"frame",""),e=this.create("node","menclose",[e],{notation:this.frame.join(" ")}),"none"===(this.arraydef.columnlines||"none")&&"none"===(this.arraydef.rowlines||"none")||f.default.setAttribute(e,"data-padding",0)),(this.getProperty("open")||this.getProperty("close"))&&(e=h.default.fenced(this.factory.configuration,this.getProperty("open"),e,this.getProperty("close"))),e},e.prototype.EndEntry=function(){var t=this.create("node","mtd",this.nodes);this.hfill.length&&(0===this.hfill[0]&&f.default.setAttribute(t,"columnalign","right"),this.hfill[this.hfill.length-1]===this.Size()&&f.default.setAttribute(t,"columnalign",f.default.getAttribute(t,"columnalign")?"center":"left")),this.row.push(t),this.Clear(),this.hfill=[]},e.prototype.EndRow=function(){var t;this.getProperty("isNumbered")&&3===this.row.length?(this.row.unshift(this.row.pop()),t=this.create("node","mlabeledtr",this.row)):t=this.create("node","mtr",this.row),this.table.push(t),this.row=[]},e.prototype.EndTable=function(){(this.Size()||this.row.length)&&(this.EndEntry(),this.EndRow()),this.checkLines()},e.prototype.checkLines=function(){if(this.arraydef.rowlines){var t=this.arraydef.rowlines.split(/ /);t.length===this.table.length?(this.frame.push("bottom"),t.pop(),this.arraydef.rowlines=t.join(" ")):t.length<this.table.length-1&&(this.arraydef.rowlines+=" none")}if(this.getProperty("rowspacing")){for(var e=this.arraydef.rowspacing.split(/ /);e.length<this.table.length;)e.push(this.getProperty("rowspacing")+"em");this.arraydef.rowspacing=e.join(" ")}},e.prototype.addRowSpacing=function(t){if(this.arraydef.rowspacing){var e=this.arraydef.rowspacing.split(/ /);if(!this.getProperty("rowspacing")){var r=h.default.dimen2em(e[0]);this.setProperty("rowspacing",r)}for(var n=this.getProperty("rowspacing");e.length<this.table.length;)e.push(h.default.Em(n));e[this.table.length-1]=h.default.Em(Math.max(0,n+h.default.dimen2em(t))),this.arraydef.rowspacing=e.join(" ")}},e}(d.BaseItem);e.ArrayItem=k;var j=function(t){function e(e){for(var r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];var o=t.call(this,e)||this;return o.maxrow=0,o.factory.configuration.tags.start(r[0],r[2],r[1]),o}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"eqnarray"},enumerable:!1,configurable:!0}),e.prototype.EndEntry=function(){this.row.length&&h.default.fixInitialMO(this.factory.configuration,this.nodes);var t=this.create("node","mtd",this.nodes);this.row.push(t),this.Clear()},e.prototype.EndRow=function(){this.row.length>this.maxrow&&(this.maxrow=this.row.length);var t="mtr",e=this.factory.configuration.tags.getTag();e&&(this.row=[e].concat(this.row),t="mlabeledtr"),this.factory.configuration.tags.clearTag();var r=this.create("node",t,this.row);this.table.push(r),this.row=[]},e.prototype.EndTable=function(){t.prototype.EndTable.call(this),this.factory.configuration.tags.end(),this.extendArray("columnalign",this.maxrow),this.extendArray("columnwidth",this.maxrow),this.extendArray("columnspacing",this.maxrow-1)},e.prototype.extendArray=function(t,e){if(this.arraydef[t]){var r=this.arraydef[t].split(/ /),n=s([],i(r),!1);if(n.length>1){for(;n.length<e;)n.push.apply(n,s([],i(r),!1));this.arraydef[t]=n.slice(0,e).join(" ")}}},e}(k);e.EqnArrayItem=j;var B=function(t){function e(e){for(var r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];var o=t.call(this,e)||this;return o.factory.configuration.tags.start("equation",!0,r[0]),o}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"equation"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isKind("end")){var r=this.toMml(),n=this.factory.configuration.tags.getTag();return this.factory.configuration.tags.end(),[[n?this.factory.configuration.tags.enTag(r,n):r,e],!0]}if(e.isKind("stop"))throw new p.default("EnvMissingEnd","Missing \\end{%1}",this.getName());return t.prototype.checkItem.call(this,e)},e}(d.BaseItem);e.EquationItem=B},1267:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=i(r(9140)),l=r(8317),c=s(r(7693)),u=s(r(5450)),p=s(r(1130)),h=r(9007),f=r(6010);new a.RegExpMap("letter",u.default.variable,/[a-z]/i),new a.RegExpMap("digit",u.default.digit,/[0-9.,]/),new a.RegExpMap("command",u.default.controlSequence,/^\\/),new a.MacroMap("special",{"{":"Open","}":"Close","~":"Tilde","^":"Superscript",_:"Subscript"," ":"Space","\t":"Space","\r":"Space","\n":"Space","'":"Prime","%":"Comment","&":"Entry","#":"Hash","\xa0":"Space","\u2019":"Prime"},c.default),new a.CharacterMap("mathchar0mi",u.default.mathchar0mi,{alpha:"\u03b1",beta:"\u03b2",gamma:"\u03b3",delta:"\u03b4",epsilon:"\u03f5",zeta:"\u03b6",eta:"\u03b7",theta:"\u03b8",iota:"\u03b9",kappa:"\u03ba",lambda:"\u03bb",mu:"\u03bc",nu:"\u03bd",xi:"\u03be",omicron:"\u03bf",pi:"\u03c0",rho:"\u03c1",sigma:"\u03c3",tau:"\u03c4",upsilon:"\u03c5",phi:"\u03d5",chi:"\u03c7",psi:"\u03c8",omega:"\u03c9",varepsilon:"\u03b5",vartheta:"\u03d1",varpi:"\u03d6",varrho:"\u03f1",varsigma:"\u03c2",varphi:"\u03c6",S:["\xa7",{mathvariant:l.TexConstant.Variant.NORMAL}],aleph:["\u2135",{mathvariant:l.TexConstant.Variant.NORMAL}],hbar:["\u210f",{variantForm:!0}],imath:"\u0131",jmath:"\u0237",ell:"\u2113",wp:["\u2118",{mathvariant:l.TexConstant.Variant.NORMAL}],Re:["\u211c",{mathvariant:l.TexConstant.Variant.NORMAL}],Im:["\u2111",{mathvariant:l.TexConstant.Variant.NORMAL}],partial:["\u2202",{mathvariant:l.TexConstant.Variant.ITALIC}],infty:["\u221e",{mathvariant:l.TexConstant.Variant.NORMAL}],prime:["\u2032",{variantForm:!0}],emptyset:["\u2205",{mathvariant:l.TexConstant.Variant.NORMAL}],nabla:["\u2207",{mathvariant:l.TexConstant.Variant.NORMAL}],top:["\u22a4",{mathvariant:l.TexConstant.Variant.NORMAL}],bot:["\u22a5",{mathvariant:l.TexConstant.Variant.NORMAL}],angle:["\u2220",{mathvariant:l.TexConstant.Variant.NORMAL}],triangle:["\u25b3",{mathvariant:l.TexConstant.Variant.NORMAL}],backslash:["\u2216",{mathvariant:l.TexConstant.Variant.NORMAL}],forall:["\u2200",{mathvariant:l.TexConstant.Variant.NORMAL}],exists:["\u2203",{mathvariant:l.TexConstant.Variant.NORMAL}],neg:["\xac",{mathvariant:l.TexConstant.Variant.NORMAL}],lnot:["\xac",{mathvariant:l.TexConstant.Variant.NORMAL}],flat:["\u266d",{mathvariant:l.TexConstant.Variant.NORMAL}],natural:["\u266e",{mathvariant:l.TexConstant.Variant.NORMAL}],sharp:["\u266f",{mathvariant:l.TexConstant.Variant.NORMAL}],clubsuit:["\u2663",{mathvariant:l.TexConstant.Variant.NORMAL}],diamondsuit:["\u2662",{mathvariant:l.TexConstant.Variant.NORMAL}],heartsuit:["\u2661",{mathvariant:l.TexConstant.Variant.NORMAL}],spadesuit:["\u2660",{mathvariant:l.TexConstant.Variant.NORMAL}]}),new a.CharacterMap("mathchar0mo",u.default.mathchar0mo,{surd:"\u221a",coprod:["\u2210",{texClass:h.TEXCLASS.OP,movesupsub:!0}],bigvee:["\u22c1",{texClass:h.TEXCLASS.OP,movesupsub:!0}],bigwedge:["\u22c0",{texClass:h.TEXCLASS.OP,movesupsub:!0}],biguplus:["\u2a04",{texClass:h.TEXCLASS.OP,movesupsub:!0}],bigcap:["\u22c2",{texClass:h.TEXCLASS.OP,movesupsub:!0}],bigcup:["\u22c3",{texClass:h.TEXCLASS.OP,movesupsub:!0}],int:["\u222b",{texClass:h.TEXCLASS.OP}],intop:["\u222b",{texClass:h.TEXCLASS.OP,movesupsub:!0,movablelimits:!0}],iint:["\u222c",{texClass:h.TEXCLASS.OP}],iiint:["\u222d",{texClass:h.TEXCLASS.OP}],prod:["\u220f",{texClass:h.TEXCLASS.OP,movesupsub:!0}],sum:["\u2211",{texClass:h.TEXCLASS.OP,movesupsub:!0}],bigotimes:["\u2a02",{texClass:h.TEXCLASS.OP,movesupsub:!0}],bigoplus:["\u2a01",{texClass:h.TEXCLASS.OP,movesupsub:!0}],bigodot:["\u2a00",{texClass:h.TEXCLASS.OP,movesupsub:!0}],oint:["\u222e",{texClass:h.TEXCLASS.OP}],bigsqcup:["\u2a06",{texClass:h.TEXCLASS.OP,movesupsub:!0}],smallint:["\u222b",{largeop:!1}],triangleleft:"\u25c3",triangleright:"\u25b9",bigtriangleup:"\u25b3",bigtriangledown:"\u25bd",wedge:"\u2227",land:"\u2227",vee:"\u2228",lor:"\u2228",cap:"\u2229",cup:"\u222a",ddagger:"\u2021",dagger:"\u2020",sqcap:"\u2293",sqcup:"\u2294",uplus:"\u228e",amalg:"\u2a3f",diamond:"\u22c4",bullet:"\u2219",wr:"\u2240",div:"\xf7",divsymbol:"\xf7",odot:["\u2299",{largeop:!1}],oslash:["\u2298",{largeop:!1}],otimes:["\u2297",{largeop:!1}],ominus:["\u2296",{largeop:!1}],oplus:["\u2295",{largeop:!1}],mp:"\u2213",pm:"\xb1",circ:"\u2218",bigcirc:"\u25ef",setminus:"\u2216",cdot:"\u22c5",ast:"\u2217",times:"\xd7",star:"\u22c6",propto:"\u221d",sqsubseteq:"\u2291",sqsupseteq:"\u2292",parallel:"\u2225",mid:"\u2223",dashv:"\u22a3",vdash:"\u22a2",leq:"\u2264",le:"\u2264",geq:"\u2265",ge:"\u2265",lt:"<",gt:">",succ:"\u227b",prec:"\u227a",approx:"\u2248",succeq:"\u2ab0",preceq:"\u2aaf",supset:"\u2283",subset:"\u2282",supseteq:"\u2287",subseteq:"\u2286",in:"\u2208",ni:"\u220b",notin:"\u2209",owns:"\u220b",gg:"\u226b",ll:"\u226a",sim:"\u223c",simeq:"\u2243",perp:"\u22a5",equiv:"\u2261",asymp:"\u224d",smile:"\u2323",frown:"\u2322",ne:"\u2260",neq:"\u2260",cong:"\u2245",doteq:"\u2250",bowtie:"\u22c8",models:"\u22a8",notChar:"\u29f8",Leftrightarrow:"\u21d4",Leftarrow:"\u21d0",Rightarrow:"\u21d2",leftrightarrow:"\u2194",leftarrow:"\u2190",gets:"\u2190",rightarrow:"\u2192",to:["\u2192",{accent:!1}],mapsto:"\u21a6",leftharpoonup:"\u21bc",leftharpoondown:"\u21bd",rightharpoonup:"\u21c0",rightharpoondown:"\u21c1",nearrow:"\u2197",searrow:"\u2198",nwarrow:"\u2196",swarrow:"\u2199",rightleftharpoons:"\u21cc",hookrightarrow:"\u21aa",hookleftarrow:"\u21a9",longleftarrow:"\u27f5",Longleftarrow:"\u27f8",longrightarrow:"\u27f6",Longrightarrow:"\u27f9",Longleftrightarrow:"\u27fa",longleftrightarrow:"\u27f7",longmapsto:"\u27fc",ldots:"\u2026",cdots:"\u22ef",vdots:"\u22ee",ddots:"\u22f1",dotsc:"\u2026",dotsb:"\u22ef",dotsm:"\u22ef",dotsi:"\u22ef",dotso:"\u2026",ldotp:[".",{texClass:h.TEXCLASS.PUNCT}],cdotp:["\u22c5",{texClass:h.TEXCLASS.PUNCT}],colon:[":",{texClass:h.TEXCLASS.PUNCT}]}),new a.CharacterMap("mathchar7",u.default.mathchar7,{Gamma:"\u0393",Delta:"\u0394",Theta:"\u0398",Lambda:"\u039b",Xi:"\u039e",Pi:"\u03a0",Sigma:"\u03a3",Upsilon:"\u03a5",Phi:"\u03a6",Psi:"\u03a8",Omega:"\u03a9",_:"_","#":"#",$:"$","%":"%","&":"&",And:"&"}),new a.DelimiterMap("delimiter",u.default.delimiter,{"(":"(",")":")","[":"[","]":"]","<":"\u27e8",">":"\u27e9","\\lt":"\u27e8","\\gt":"\u27e9","/":"/","|":["|",{texClass:h.TEXCLASS.ORD}],".":"","\\\\":"\\","\\lmoustache":"\u23b0","\\rmoustache":"\u23b1","\\lgroup":"\u27ee","\\rgroup":"\u27ef","\\arrowvert":"\u23d0","\\Arrowvert":"\u2016","\\bracevert":"\u23aa","\\Vert":["\u2016",{texClass:h.TEXCLASS.ORD}],"\\|":["\u2016",{texClass:h.TEXCLASS.ORD}],"\\vert":["|",{texClass:h.TEXCLASS.ORD}],"\\uparrow":"\u2191","\\downarrow":"\u2193","\\updownarrow":"\u2195","\\Uparrow":"\u21d1","\\Downarrow":"\u21d3","\\Updownarrow":"\u21d5","\\backslash":"\\","\\rangle":"\u27e9","\\langle":"\u27e8","\\rbrace":"}","\\lbrace":"{","\\}":"}","\\{":"{","\\rceil":"\u2309","\\lceil":"\u2308","\\rfloor":"\u230b","\\lfloor":"\u230a","\\lbrack":"[","\\rbrack":"]"}),new a.CommandMap("macros",{displaystyle:["SetStyle","D",!0,0],textstyle:["SetStyle","T",!1,0],scriptstyle:["SetStyle","S",!1,1],scriptscriptstyle:["SetStyle","SS",!1,2],rm:["SetFont",l.TexConstant.Variant.NORMAL],mit:["SetFont",l.TexConstant.Variant.ITALIC],oldstyle:["SetFont",l.TexConstant.Variant.OLDSTYLE],cal:["SetFont",l.TexConstant.Variant.CALLIGRAPHIC],it:["SetFont",l.TexConstant.Variant.MATHITALIC],bf:["SetFont",l.TexConstant.Variant.BOLD],bbFont:["SetFont",l.TexConstant.Variant.DOUBLESTRUCK],scr:["SetFont",l.TexConstant.Variant.SCRIPT],frak:["SetFont",l.TexConstant.Variant.FRAKTUR],sf:["SetFont",l.TexConstant.Variant.SANSSERIF],tt:["SetFont",l.TexConstant.Variant.MONOSPACE],mathrm:["MathFont",l.TexConstant.Variant.NORMAL],mathup:["MathFont",l.TexConstant.Variant.NORMAL],mathnormal:["MathFont",""],mathbf:["MathFont",l.TexConstant.Variant.BOLD],mathbfup:["MathFont",l.TexConstant.Variant.BOLD],mathit:["MathFont",l.TexConstant.Variant.MATHITALIC],mathbfit:["MathFont",l.TexConstant.Variant.BOLDITALIC],mathbb:["MathFont",l.TexConstant.Variant.DOUBLESTRUCK],Bbb:["MathFont",l.TexConstant.Variant.DOUBLESTRUCK],mathfrak:["MathFont",l.TexConstant.Variant.FRAKTUR],mathbffrak:["MathFont",l.TexConstant.Variant.BOLDFRAKTUR],mathscr:["MathFont",l.TexConstant.Variant.SCRIPT],mathbfscr:["MathFont",l.TexConstant.Variant.BOLDSCRIPT],mathsf:["MathFont",l.TexConstant.Variant.SANSSERIF],mathsfup:["MathFont",l.TexConstant.Variant.SANSSERIF],mathbfsf:["MathFont",l.TexConstant.Variant.BOLDSANSSERIF],mathbfsfup:["MathFont",l.TexConstant.Variant.BOLDSANSSERIF],mathsfit:["MathFont",l.TexConstant.Variant.SANSSERIFITALIC],mathbfsfit:["MathFont",l.TexConstant.Variant.SANSSERIFBOLDITALIC],mathtt:["MathFont",l.TexConstant.Variant.MONOSPACE],mathcal:["MathFont",l.TexConstant.Variant.CALLIGRAPHIC],mathbfcal:["MathFont",l.TexConstant.Variant.BOLDCALLIGRAPHIC],symrm:["MathFont",l.TexConstant.Variant.NORMAL],symup:["MathFont",l.TexConstant.Variant.NORMAL],symnormal:["MathFont",""],symbf:["MathFont",l.TexConstant.Variant.BOLD],symbfup:["MathFont",l.TexConstant.Variant.BOLD],symit:["MathFont",l.TexConstant.Variant.ITALIC],symbfit:["MathFont",l.TexConstant.Variant.BOLDITALIC],symbb:["MathFont",l.TexConstant.Variant.DOUBLESTRUCK],symfrak:["MathFont",l.TexConstant.Variant.FRAKTUR],symbffrak:["MathFont",l.TexConstant.Variant.BOLDFRAKTUR],symscr:["MathFont",l.TexConstant.Variant.SCRIPT],symbfscr:["MathFont",l.TexConstant.Variant.BOLDSCRIPT],symsf:["MathFont",l.TexConstant.Variant.SANSSERIF],symsfup:["MathFont",l.TexConstant.Variant.SANSSERIF],symbfsf:["MathFont",l.TexConstant.Variant.BOLDSANSSERIF],symbfsfup:["MathFont",l.TexConstant.Variant.BOLDSANSSERIF],symsfit:["MathFont",l.TexConstant.Variant.SANSSERIFITALIC],symbfsfit:["MathFont",l.TexConstant.Variant.SANSSERIFBOLDITALIC],symtt:["MathFont",l.TexConstant.Variant.MONOSPACE],symcal:["MathFont",l.TexConstant.Variant.CALLIGRAPHIC],symbfcal:["MathFont",l.TexConstant.Variant.BOLDCALLIGRAPHIC],textrm:["HBox",null,l.TexConstant.Variant.NORMAL],textup:["HBox",null,l.TexConstant.Variant.NORMAL],textnormal:["HBox"],textit:["HBox",null,l.TexConstant.Variant.ITALIC],textbf:["HBox",null,l.TexConstant.Variant.BOLD],textsf:["HBox",null,l.TexConstant.Variant.SANSSERIF],texttt:["HBox",null,l.TexConstant.Variant.MONOSPACE],tiny:["SetSize",.5],Tiny:["SetSize",.6],scriptsize:["SetSize",.7],small:["SetSize",.85],normalsize:["SetSize",1],large:["SetSize",1.2],Large:["SetSize",1.44],LARGE:["SetSize",1.73],huge:["SetSize",2.07],Huge:["SetSize",2.49],arcsin:"NamedFn",arccos:"NamedFn",arctan:"NamedFn",arg:"NamedFn",cos:"NamedFn",cosh:"NamedFn",cot:"NamedFn",coth:"NamedFn",csc:"NamedFn",deg:"NamedFn",det:"NamedOp",dim:"NamedFn",exp:"NamedFn",gcd:"NamedOp",hom:"NamedFn",inf:"NamedOp",ker:"NamedFn",lg:"NamedFn",lim:"NamedOp",liminf:["NamedOp","lim inf"],limsup:["NamedOp","lim sup"],ln:"NamedFn",log:"NamedFn",max:"NamedOp",min:"NamedOp",Pr:"NamedOp",sec:"NamedFn",sin:"NamedFn",sinh:"NamedFn",sup:"NamedOp",tan:"NamedFn",tanh:"NamedFn",limits:["Limits",1],nolimits:["Limits",0],overline:["UnderOver","2015"],underline:["UnderOver","2015"],overbrace:["UnderOver","23DE",1],underbrace:["UnderOver","23DF",1],overparen:["UnderOver","23DC"],underparen:["UnderOver","23DD"],overrightarrow:["UnderOver","2192"],underrightarrow:["UnderOver","2192"],overleftarrow:["UnderOver","2190"],underleftarrow:["UnderOver","2190"],overleftrightarrow:["UnderOver","2194"],underleftrightarrow:["UnderOver","2194"],overset:"Overset",underset:"Underset",overunderset:"Overunderset",stackrel:["Macro","\\mathrel{\\mathop{#2}\\limits^{#1}}",2],stackbin:["Macro","\\mathbin{\\mathop{#2}\\limits^{#1}}",2],over:"Over",overwithdelims:"Over",atop:"Over",atopwithdelims:"Over",above:"Over",abovewithdelims:"Over",brace:["Over","{","}"],brack:["Over","[","]"],choose:["Over","(",")"],frac:"Frac",sqrt:"Sqrt",root:"Root",uproot:["MoveRoot","upRoot"],leftroot:["MoveRoot","leftRoot"],left:"LeftRight",right:"LeftRight",middle:"LeftRight",llap:"Lap",rlap:"Lap",raise:"RaiseLower",lower:"RaiseLower",moveleft:"MoveLeftRight",moveright:"MoveLeftRight",",":["Spacer",f.MATHSPACE.thinmathspace],":":["Spacer",f.MATHSPACE.mediummathspace],">":["Spacer",f.MATHSPACE.mediummathspace],";":["Spacer",f.MATHSPACE.thickmathspace],"!":["Spacer",f.MATHSPACE.negativethinmathspace],enspace:["Spacer",.5],quad:["Spacer",1],qquad:["Spacer",2],thinspace:["Spacer",f.MATHSPACE.thinmathspace],negthinspace:["Spacer",f.MATHSPACE.negativethinmathspace],hskip:"Hskip",hspace:"Hskip",kern:"Hskip",mskip:"Hskip",mspace:"Hskip",mkern:"Hskip",rule:"rule",Rule:["Rule"],Space:["Rule","blank"],nonscript:"Nonscript",big:["MakeBig",h.TEXCLASS.ORD,.85],Big:["MakeBig",h.TEXCLASS.ORD,1.15],bigg:["MakeBig",h.TEXCLASS.ORD,1.45],Bigg:["MakeBig",h.TEXCLASS.ORD,1.75],bigl:["MakeBig",h.TEXCLASS.OPEN,.85],Bigl:["MakeBig",h.TEXCLASS.OPEN,1.15],biggl:["MakeBig",h.TEXCLASS.OPEN,1.45],Biggl:["MakeBig",h.TEXCLASS.OPEN,1.75],bigr:["MakeBig",h.TEXCLASS.CLOSE,.85],Bigr:["MakeBig",h.TEXCLASS.CLOSE,1.15],biggr:["MakeBig",h.TEXCLASS.CLOSE,1.45],Biggr:["MakeBig",h.TEXCLASS.CLOSE,1.75],bigm:["MakeBig",h.TEXCLASS.REL,.85],Bigm:["MakeBig",h.TEXCLASS.REL,1.15],biggm:["MakeBig",h.TEXCLASS.REL,1.45],Biggm:["MakeBig",h.TEXCLASS.REL,1.75],mathord:["TeXAtom",h.TEXCLASS.ORD],mathop:["TeXAtom",h.TEXCLASS.OP],mathopen:["TeXAtom",h.TEXCLASS.OPEN],mathclose:["TeXAtom",h.TEXCLASS.CLOSE],mathbin:["TeXAtom",h.TEXCLASS.BIN],mathrel:["TeXAtom",h.TEXCLASS.REL],mathpunct:["TeXAtom",h.TEXCLASS.PUNCT],mathinner:["TeXAtom",h.TEXCLASS.INNER],vcenter:["TeXAtom",h.TEXCLASS.VCENTER],buildrel:"BuildRel",hbox:["HBox",0],text:"HBox",mbox:["HBox",0],fbox:"FBox",boxed:["Macro","\\fbox{$\\displaystyle{#1}$}",1],framebox:"FrameBox",strut:"Strut",mathstrut:["Macro","\\vphantom{(}"],phantom:"Phantom",vphantom:["Phantom",1,0],hphantom:["Phantom",0,1],smash:"Smash",acute:["Accent","00B4"],grave:["Accent","0060"],ddot:["Accent","00A8"],tilde:["Accent","007E"],bar:["Accent","00AF"],breve:["Accent","02D8"],check:["Accent","02C7"],hat:["Accent","005E"],vec:["Accent","2192"],dot:["Accent","02D9"],widetilde:["Accent","007E",1],widehat:["Accent","005E",1],matrix:"Matrix",array:"Matrix",pmatrix:["Matrix","(",")"],cases:["Matrix","{","","left left",null,".1em",null,!0],eqalign:["Matrix",null,null,"right left",(0,f.em)(f.MATHSPACE.thickmathspace),".5em","D"],displaylines:["Matrix",null,null,"center",null,".5em","D"],cr:"Cr","\\":"CrLaTeX",newline:["CrLaTeX",!0],hline:["HLine","solid"],hdashline:["HLine","dashed"],eqalignno:["Matrix",null,null,"right left",(0,f.em)(f.MATHSPACE.thickmathspace),".5em","D",null,"right"],leqalignno:["Matrix",null,null,"right left",(0,f.em)(f.MATHSPACE.thickmathspace),".5em","D",null,"left"],hfill:"HFill",hfil:"HFill",hfilll:"HFill",bmod:["Macro",'\\mmlToken{mo}[lspace="thickmathspace" rspace="thickmathspace"]{mod}'],pmod:["Macro","\\pod{\\mmlToken{mi}{mod}\\kern 6mu #1}",1],mod:["Macro","\\mathchoice{\\kern18mu}{\\kern12mu}{\\kern12mu}{\\kern12mu}\\mmlToken{mi}{mod}\\,\\,#1",1],pod:["Macro","\\mathchoice{\\kern18mu}{\\kern8mu}{\\kern8mu}{\\kern8mu}(#1)",1],iff:["Macro","\\;\\Longleftrightarrow\\;"],skew:["Macro","{{#2{#3\\mkern#1mu}\\mkern-#1mu}{}}",3],pmb:["Macro","\\rlap{#1}\\kern1px{#1}",1],TeX:["Macro","T\\kern-.14em\\lower.5ex{E}\\kern-.115em X"],LaTeX:["Macro","L\\kern-.325em\\raise.21em{\\scriptstyle{A}}\\kern-.17em\\TeX"]," ":["Macro","\\text{ }"],not:"Not",dots:"Dots",space:"Tilde","\xa0":"Tilde",begin:"BeginEnd",end:"BeginEnd",label:"HandleLabel",ref:"HandleRef",nonumber:"HandleNoTag",mathchoice:"MathChoice",mmlToken:"MmlToken"},c.default),new a.EnvironmentMap("environment",u.default.environment,{array:["AlignedArray"],equation:["Equation",null,!0],eqnarray:["EqnArray",null,!0,!0,"rcl",p.default.cols(0,f.MATHSPACE.thickmathspace),".5em"]},c.default),new a.CharacterMap("not_remap",null,{"\u2190":"\u219a","\u2192":"\u219b","\u2194":"\u21ae","\u21d0":"\u21cd","\u21d2":"\u21cf","\u21d4":"\u21ce","\u2208":"\u2209","\u220b":"\u220c","\u2223":"\u2224","\u2225":"\u2226","\u223c":"\u2241","~":"\u2241","\u2243":"\u2244","\u2245":"\u2247","\u2248":"\u2249","\u224d":"\u226d","=":"\u2260","\u2261":"\u2262","<":"\u226e",">":"\u226f","\u2264":"\u2270","\u2265":"\u2271","\u2272":"\u2274","\u2273":"\u2275","\u2276":"\u2278","\u2277":"\u2279","\u227a":"\u2280","\u227b":"\u2281","\u2282":"\u2284","\u2283":"\u2285","\u2286":"\u2288","\u2287":"\u2289","\u22a2":"\u22ac","\u22a8":"\u22ad","\u22a9":"\u22ae","\u22ab":"\u22af","\u227c":"\u22e0","\u227d":"\u22e1","\u2291":"\u22e2","\u2292":"\u22e3","\u22b2":"\u22ea","\u22b3":"\u22eb","\u22b4":"\u22ec","\u22b5":"\u22ed","\u2203":"\u2204"})},7693:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},n.apply(this,arguments)},o=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),i=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&o(e,t,r);return i(e,t),e},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var c=s(r(1181)),u=l(r(1256)),p=l(r(3971)),h=l(r(8417)),f=r(8317),d=l(r(1130)),m=r(9007),y=r(6521),g=r(6010),b=r(5368),v=r(7233),_={},S={fontfamily:1,fontsize:1,fontweight:1,fontstyle:1,color:1,background:1,id:1,class:1,href:1,style:1};function O(t,e){var r=t.stack.env,n=r.inRoot;r.inRoot=!0;var o=new h.default(e,r,t.configuration),i=o.mml(),s=o.stack.global;if(s.leftRoot||s.upRoot){var a={};s.leftRoot&&(a.width=s.leftRoot),s.upRoot&&(a.voffset=s.upRoot,a.height=s.upRoot),i=t.create("node","mpadded",[i],a)}return r.inRoot=n,i}_.Open=function(t,e){t.Push(t.itemFactory.create("open"))},_.Close=function(t,e){t.Push(t.itemFactory.create("close"))},_.Tilde=function(t,e){t.Push(t.create("token","mtext",{},b.entities.nbsp))},_.Space=function(t,e){},_.Superscript=function(t,e){var r,n,o;t.GetNext().match(/\d/)&&(t.string=t.string.substr(0,t.i+1)+" "+t.string.substr(t.i+1));var i=t.stack.Top();i.isKind("prime")?(o=(r=a(i.Peek(2),2))[0],n=r[1],t.stack.Pop()):(o=t.stack.Prev())||(o=t.create("token","mi",{},""));var s=u.default.getProperty(o,"movesupsub"),l=u.default.isType(o,"msubsup")?o.sup:o.over;if(u.default.isType(o,"msubsup")&&!u.default.isType(o,"msup")&&u.default.getChildAt(o,o.sup)||u.default.isType(o,"munderover")&&!u.default.isType(o,"mover")&&u.default.getChildAt(o,o.over)&&!u.default.getProperty(o,"subsupOK"))throw new p.default("DoubleExponent","Double exponent: use braces to clarify");u.default.isType(o,"msubsup")&&!u.default.isType(o,"msup")||(s?((!u.default.isType(o,"munderover")||u.default.isType(o,"mover")||u.default.getChildAt(o,o.over))&&(o=t.create("node","munderover",[o],{movesupsub:!0})),l=o.over):l=(o=t.create("node","msubsup",[o])).sup),t.Push(t.itemFactory.create("subsup",o).setProperties({position:l,primes:n,movesupsub:s}))},_.Subscript=function(t,e){var r,n,o;t.GetNext().match(/\d/)&&(t.string=t.string.substr(0,t.i+1)+" "+t.string.substr(t.i+1));var i=t.stack.Top();i.isKind("prime")?(o=(r=a(i.Peek(2),2))[0],n=r[1],t.stack.Pop()):(o=t.stack.Prev())||(o=t.create("token","mi",{},""));var s=u.default.getProperty(o,"movesupsub"),l=u.default.isType(o,"msubsup")?o.sub:o.under;if(u.default.isType(o,"msubsup")&&!u.default.isType(o,"msup")&&u.default.getChildAt(o,o.sub)||u.default.isType(o,"munderover")&&!u.default.isType(o,"mover")&&u.default.getChildAt(o,o.under)&&!u.default.getProperty(o,"subsupOK"))throw new p.default("DoubleSubscripts","Double subscripts: use braces to clarify");u.default.isType(o,"msubsup")&&!u.default.isType(o,"msup")||(s?((!u.default.isType(o,"munderover")||u.default.isType(o,"mover")||u.default.getChildAt(o,o.under))&&(o=t.create("node","munderover",[o],{movesupsub:!0})),l=o.under):l=(o=t.create("node","msubsup",[o])).sub),t.Push(t.itemFactory.create("subsup",o).setProperties({position:l,primes:n,movesupsub:s}))},_.Prime=function(t,e){var r=t.stack.Prev();if(r||(r=t.create("node","mi")),u.default.isType(r,"msubsup")&&!u.default.isType(r,"msup")&&u.default.getChildAt(r,r.sup))throw new p.default("DoubleExponentPrime","Prime causes double exponent: use braces to clarify");var n="";t.i--;do{n+=b.entities.prime,t.i++,e=t.GetNext()}while("'"===e||e===b.entities.rsquo);n=["","\u2032","\u2033","\u2034","\u2057"][n.length]||n;var o=t.create("token","mo",{variantForm:!0},n);t.Push(t.itemFactory.create("prime",r,o))},_.Comment=function(t,e){for(;t.i<t.string.length&&"\n"!==t.string.charAt(t.i);)t.i++},_.Hash=function(t,e){throw new p.default("CantUseHash1","You can't use 'macro parameter character #' in math mode")},_.MathFont=function(t,e,r){var o=t.GetArgument(e),i=new h.default(o,n(n({},t.stack.env),{font:r,multiLetterIdentifiers:/^[a-zA-Z]+/,noAutoOP:!0}),t.configuration).mml();t.Push(t.create("node","TeXAtom",[i]))},_.SetFont=function(t,e,r){t.stack.env.font=r},_.SetStyle=function(t,e,r,n,o){t.stack.env.style=r,t.stack.env.level=o,t.Push(t.itemFactory.create("style").setProperty("styles",{displaystyle:n,scriptlevel:o}))},_.SetSize=function(t,e,r){t.stack.env.size=r,t.Push(t.itemFactory.create("style").setProperty("styles",{mathsize:(0,g.em)(r)}))},_.Spacer=function(t,e,r){var n=t.create("node","mspace",[],{width:(0,g.em)(r)}),o=t.create("node","mstyle",[n],{scriptlevel:0});t.Push(o)},_.LeftRight=function(t,e){var r=e.substr(1);t.Push(t.itemFactory.create(r,t.GetDelimiter(e),t.stack.env.color))},_.NamedFn=function(t,e,r){r||(r=e.substr(1));var n=t.create("token","mi",{texClass:m.TEXCLASS.OP},r);t.Push(t.itemFactory.create("fn",n))},_.NamedOp=function(t,e,r){r||(r=e.substr(1)),r=r.replace(/ /,"\u2006");var n=t.create("token","mo",{movablelimits:!0,movesupsub:!0,form:f.TexConstant.Form.PREFIX,texClass:m.TEXCLASS.OP},r);t.Push(n)},_.Limits=function(t,e,r){var n=t.stack.Prev(!0);if(!n||u.default.getTexClass(u.default.getCoreMO(n))!==m.TEXCLASS.OP&&null==u.default.getProperty(n,"movesupsub"))throw new p.default("MisplacedLimits","%1 is allowed only on operators",t.currentCS);var o,i=t.stack.Top();u.default.isType(n,"munderover")&&!r?(o=t.create("node","msubsup"),u.default.copyChildren(n,o),n=i.Last=o):u.default.isType(n,"msubsup")&&r&&(o=t.create("node","munderover"),u.default.copyChildren(n,o),n=i.Last=o),u.default.setProperty(n,"movesupsub",!!r),u.default.setProperties(u.default.getCoreMO(n),{movablelimits:!1}),(u.default.getAttribute(n,"movablelimits")||u.default.getProperty(n,"movablelimits"))&&u.default.setProperties(n,{movablelimits:!1})},_.Over=function(t,e,r,n){var o=t.itemFactory.create("over").setProperty("name",t.currentCS);r||n?(o.setProperty("open",r),o.setProperty("close",n)):e.match(/withdelims$/)&&(o.setProperty("open",t.GetDelimiter(e)),o.setProperty("close",t.GetDelimiter(e))),e.match(/^\\above/)?o.setProperty("thickness",t.GetDimen(e)):(e.match(/^\\atop/)||r||n)&&o.setProperty("thickness",0),t.Push(o)},_.Frac=function(t,e){var r=t.ParseArg(e),n=t.ParseArg(e),o=t.create("node","mfrac",[r,n]);t.Push(o)},_.Sqrt=function(t,e){var r=t.GetBrackets(e),n=t.GetArgument(e);"\\frac"===n&&(n+="{"+t.GetArgument(n)+"}{"+t.GetArgument(n)+"}");var o=new h.default(n,t.stack.env,t.configuration).mml();o=r?t.create("node","mroot",[o,O(t,r)]):t.create("node","msqrt",[o]),t.Push(o)},_.Root=function(t,e){var r=t.GetUpTo(e,"\\of"),n=t.ParseArg(e),o=t.create("node","mroot",[n,O(t,r)]);t.Push(o)},_.MoveRoot=function(t,e,r){if(!t.stack.env.inRoot)throw new p.default("MisplacedMoveRoot","%1 can appear only within a root",t.currentCS);if(t.stack.global[r])throw new p.default("MultipleMoveRoot","Multiple use of %1",t.currentCS);var n=t.GetArgument(e);if(!n.match(/-?[0-9]+/))throw new p.default("IntegerArg","The argument to %1 must be an integer",t.currentCS);"-"!==(n=parseInt(n,10)/15+"em").substr(0,1)&&(n="+"+n),t.stack.global[r]=n},_.Accent=function(t,e,r,o){var i=t.ParseArg(e),s=n(n({},d.default.getFontDef(t)),{accent:!0,mathaccent:!0}),a=u.default.createEntity(r),l=t.create("token","mo",s,a);u.default.setAttribute(l,"stretchy",!!o);var c=u.default.isEmbellished(i)?u.default.getCoreMO(i):i;(u.default.isType(c,"mo")||u.default.getProperty(c,"movablelimits"))&&u.default.setProperties(c,{movablelimits:!1});var p=t.create("node","munderover");u.default.setChild(p,0,i),u.default.setChild(p,1,null),u.default.setChild(p,2,l);var h=t.create("node","TeXAtom",[p]);t.Push(h)},_.UnderOver=function(t,e,r,n){var o=u.default.createEntity(r),i=t.create("token","mo",{stretchy:!0,accent:!0},o),s="o"===e.charAt(1)?"over":"under",a=t.ParseArg(e);t.Push(d.default.underOver(t,a,i,s,n))},_.Overset=function(t,e){var r=t.ParseArg(e),n=t.ParseArg(e);d.default.checkMovableLimits(n),r.isKind("mo")&&u.default.setAttribute(r,"accent",!1);var o=t.create("node","mover",[n,r]);t.Push(o)},_.Underset=function(t,e){var r=t.ParseArg(e),n=t.ParseArg(e);d.default.checkMovableLimits(n),r.isKind("mo")&&u.default.setAttribute(r,"accent",!1);var o=t.create("node","munder",[n,r],{accentunder:!1});t.Push(o)},_.Overunderset=function(t,e){var r=t.ParseArg(e),n=t.ParseArg(e),o=t.ParseArg(e);d.default.checkMovableLimits(o),r.isKind("mo")&&u.default.setAttribute(r,"accent",!1),n.isKind("mo")&&u.default.setAttribute(n,"accent",!1);var i=t.create("node","munderover",[o,n,r],{accent:!1,accentunder:!1});t.Push(i)},_.TeXAtom=function(t,e,r){var n,o,i,s={texClass:r};if(r===m.TEXCLASS.OP){s.movesupsub=s.movablelimits=!0;var a=t.GetArgument(e),l=a.match(/^\s*\\rm\s+([a-zA-Z0-9 ]+)$/);l?(s.mathvariant=f.TexConstant.Variant.NORMAL,o=t.create("token","mi",s,l[1])):(i=new h.default(a,t.stack.env,t.configuration).mml(),o=t.create("node","TeXAtom",[i],s)),n=t.itemFactory.create("fn",o)}else i=t.ParseArg(e),n=t.create("node","TeXAtom",[i],s);t.Push(n)},_.MmlToken=function(t,e){var r,n=t.GetArgument(e),o=t.GetBrackets(e,"").replace(/^\s+/,""),i=t.GetArgument(e),s={},a=[];try{r=t.create("node",n)}catch(t){r=null}if(!r||!r.isToken)throw new p.default("NotMathMLToken","%1 is not a token element",n);for(;""!==o;){var l=o.match(/^([a-z]+)\s*=\s*('[^']*'|"[^"]*"|[^ ,]*)\s*,?\s*/i);if(!l)throw new p.default("InvalidMathMLAttr","Invalid MathML attribute: %1",o);if(!r.attributes.hasDefault(l[1])&&!S[l[1]])throw new p.default("UnknownAttrForElement","%1 is not a recognized attribute for %2",l[1],n);var c=d.default.MmlFilterAttribute(t,l[1],l[2].replace(/^(['"])(.*)\1$/,"$2"));c&&("true"===c.toLowerCase()?c=!0:"false"===c.toLowerCase()&&(c=!1),s[l[1]]=c,a.push(l[1])),o=o.substr(l[0].length)}a.length&&(s["mjx-keep-attrs"]=a.join(" "));var h=t.create("text",i);r.appendChild(h),u.default.setProperties(r,s),t.Push(r)},_.Strut=function(t,e){var r=t.create("node","mrow"),n=t.create("node","mpadded",[r],{height:"8.6pt",depth:"3pt",width:0});t.Push(n)},_.Phantom=function(t,e,r,n){var o=t.create("node","mphantom",[t.ParseArg(e)]);(r||n)&&(o=t.create("node","mpadded",[o]),n&&(u.default.setAttribute(o,"height",0),u.default.setAttribute(o,"depth",0)),r&&u.default.setAttribute(o,"width",0));var i=t.create("node","TeXAtom",[o]);t.Push(i)},_.Smash=function(t,e){var r=d.default.trimSpaces(t.GetBrackets(e,"")),n=t.create("node","mpadded",[t.ParseArg(e)]);switch(r){case"b":u.default.setAttribute(n,"depth",0);break;case"t":u.default.setAttribute(n,"height",0);break;default:u.default.setAttribute(n,"height",0),u.default.setAttribute(n,"depth",0)}var o=t.create("node","TeXAtom",[n]);t.Push(o)},_.Lap=function(t,e){var r=t.create("node","mpadded",[t.ParseArg(e)],{width:0});"\\llap"===e&&u.default.setAttribute(r,"lspace","-1width");var n=t.create("node","TeXAtom",[r]);t.Push(n)},_.RaiseLower=function(t,e){var r=t.GetDimen(e),n=t.itemFactory.create("position").setProperties({name:t.currentCS,move:"vertical"});"-"===r.charAt(0)&&(r=r.slice(1),e="raise"===e.substr(1)?"\\lower":"\\raise"),"\\lower"===e?(n.setProperty("dh","-"+r),n.setProperty("dd","+"+r)):(n.setProperty("dh","+"+r),n.setProperty("dd","-"+r)),t.Push(n)},_.MoveLeftRight=function(t,e){var r=t.GetDimen(e),n="-"===r.charAt(0)?r.slice(1):"-"+r;if("\\moveleft"===e){var o=r;r=n,n=o}t.Push(t.itemFactory.create("position").setProperties({name:t.currentCS,move:"horizontal",left:t.create("node","mspace",[],{width:r}),right:t.create("node","mspace",[],{width:n})}))},_.Hskip=function(t,e){var r=t.create("node","mspace",[],{width:t.GetDimen(e)});t.Push(r)},_.Nonscript=function(t,e){t.Push(t.itemFactory.create("nonscript"))},_.Rule=function(t,e,r){var n={width:t.GetDimen(e),height:t.GetDimen(e),depth:t.GetDimen(e)};"blank"!==r&&(n.mathbackground=t.stack.env.color||"black");var o=t.create("node","mspace",[],n);t.Push(o)},_.rule=function(t,e){var r=t.GetBrackets(e),n=t.GetDimen(e),o=t.GetDimen(e),i=t.create("node","mspace",[],{width:n,height:o,mathbackground:t.stack.env.color||"black"});r&&(i=t.create("node","mpadded",[i],{voffset:r}),r.match(/^\-/)?(u.default.setAttribute(i,"height",r),u.default.setAttribute(i,"depth","+"+r.substr(1))):u.default.setAttribute(i,"height","+"+r)),t.Push(i)},_.MakeBig=function(t,e,r,n){var o=String(n*=1.411764705882353).replace(/(\.\d\d\d).+/,"$1")+"em",i=t.GetDelimiter(e,!0),s=t.create("token","mo",{minsize:o,maxsize:o,fence:!0,stretchy:!0,symmetric:!0},i),a=t.create("node","TeXAtom",[s],{texClass:r});t.Push(a)},_.BuildRel=function(t,e){var r=t.ParseUpTo(e,"\\over"),n=t.ParseArg(e),o=t.create("node","munderover");u.default.setChild(o,0,n),u.default.setChild(o,1,null),u.default.setChild(o,2,r);var i=t.create("node","TeXAtom",[o],{texClass:m.TEXCLASS.REL});t.Push(i)},_.HBox=function(t,e,r,n){t.PushAll(d.default.internalMath(t,t.GetArgument(e),r,n))},_.FBox=function(t,e){var r=d.default.internalMath(t,t.GetArgument(e)),n=t.create("node","menclose",r,{notation:"box"});t.Push(n)},_.FrameBox=function(t,e){var r=t.GetBrackets(e),n=t.GetBrackets(e)||"c",o=d.default.internalMath(t,t.GetArgument(e));r&&(o=[t.create("node","mpadded",o,{width:r,"data-align":(0,v.lookup)(n,{l:"left",r:"right"},"center")})]);var i=t.create("node","TeXAtom",[t.create("node","menclose",o,{notation:"box"})],{texClass:m.TEXCLASS.ORD});t.Push(i)},_.Not=function(t,e){t.Push(t.itemFactory.create("not"))},_.Dots=function(t,e){var r=u.default.createEntity("2026"),n=u.default.createEntity("22EF"),o=t.create("token","mo",{stretchy:!1},r),i=t.create("token","mo",{stretchy:!1},n);t.Push(t.itemFactory.create("dots").setProperties({ldots:o,cdots:i}))},_.Matrix=function(t,e,r,n,o,i,s,a,l,c){var u=t.GetNext();if(""===u)throw new p.default("MissingArgFor","Missing argument for %1",t.currentCS);"{"===u?t.i++:(t.string=u+"}"+t.string.slice(t.i+1),t.i=0);var h=t.itemFactory.create("array").setProperty("requireClose",!0);h.arraydef={rowspacing:s||"4pt",columnspacing:i||"1em"},l&&h.setProperty("isCases",!0),c&&(h.setProperty("isNumbered",!0),h.arraydef.side=c),(r||n)&&(h.setProperty("open",r),h.setProperty("close",n)),"D"===a&&(h.arraydef.displaystyle=!0),null!=o&&(h.arraydef.columnalign=o),t.Push(h)},_.Entry=function(t,e){t.Push(t.itemFactory.create("cell").setProperties({isEntry:!0,name:e}));var r=t.stack.Top(),n=r.getProperty("casesEnv");if(r.getProperty("isCases")||n){for(var o=t.string,i=0,s=-1,a=t.i,l=o.length,c=n?new RegExp("^\\\\end\\s*\\{".concat(n.replace(/\*/,"\\*"),"\\}")):null;a<l;){var u=o.charAt(a);if("{"===u)i++,a++;else if("}"===u)0===i?l=0:(0===--i&&s<0&&(s=a-t.i),a++);else{if("&"===u&&0===i)throw new p.default("ExtraAlignTab","Extra alignment tab in \\cases text");if("\\"===u){var h=o.substr(a);h.match(/^((\\cr)[^a-zA-Z]|\\\\)/)||c&&h.match(c)?l=0:a+=2}else a++}}var f=o.substr(t.i,a-t.i);if(!f.match(/^\s*\\text[^a-zA-Z]/)||s!==f.replace(/\s+$/,"").length-1){var m=d.default.internalMath(t,d.default.trimSpaces(f),0);t.PushAll(m),t.i=a}}},_.Cr=function(t,e){t.Push(t.itemFactory.create("cell").setProperties({isCR:!0,name:e}))},_.CrLaTeX=function(t,e,r){var n;if(void 0===r&&(r=!1),!r&&("*"===t.string.charAt(t.i)&&t.i++,"["===t.string.charAt(t.i))){var o=t.GetBrackets(e,""),i=a(d.default.matchDimen(o),2),s=i[0],l=i[1];if(o&&!s)throw new p.default("BracketMustBeDimension","Bracket argument to %1 must be a dimension",t.currentCS);n=s+l}t.Push(t.itemFactory.create("cell").setProperties({isCR:!0,name:e,linebreak:!0}));var u,h=t.stack.Top();h instanceof c.ArrayItem?n&&h.addRowSpacing(n):(n&&(u=t.create("node","mspace",[],{depth:n}),t.Push(u)),u=t.create("node","mspace",[],{linebreak:f.TexConstant.LineBreak.NEWLINE}),t.Push(u))},_.HLine=function(t,e,r){null==r&&(r="solid");var n=t.stack.Top();if(!(n instanceof c.ArrayItem)||n.Size())throw new p.default("Misplaced","Misplaced %1",t.currentCS);if(n.table.length){for(var o=n.arraydef.rowlines?n.arraydef.rowlines.split(/ /):[];o.length<n.table.length;)o.push("none");o[n.table.length-1]=r,n.arraydef.rowlines=o.join(" ")}else n.frame.push("top")},_.HFill=function(t,e){var r=t.stack.Top();if(!(r instanceof c.ArrayItem))throw new p.default("UnsupportedHFill","Unsupported use of %1",t.currentCS);r.hfill.push(r.Size())},_.BeginEnd=function(t,e){var r=t.GetArgument(e);if(r.match(/\\/i))throw new p.default("InvalidEnv","Invalid environment name '%1'",r);var n=t.configuration.handlers.get("environment").lookup(r);if(n&&"\\end"===e){if(!n.args[0]){var o=t.itemFactory.create("end").setProperty("name",r);return void t.Push(o)}t.stack.env.closing=r}d.default.checkMaxMacros(t,!1),t.parse("environment",[t,r])},_.Array=function(t,e,r,n,o,i,s,a,l){o||(o=t.GetArgument("\\begin{"+e.getName()+"}"));var c=("c"+o).replace(/[^clr|:]/g,"").replace(/[^|:]([|:])+/g,"$1");o=(o=o.replace(/[^clr]/g,"").split("").join(" ")).replace(/l/g,"left").replace(/r/g,"right").replace(/c/g,"center");var u=t.itemFactory.create("array");return u.arraydef={columnalign:o,columnspacing:i||"1em",rowspacing:s||"4pt"},c.match(/[|:]/)&&(c.charAt(0).match(/[|:]/)&&(u.frame.push("left"),u.dashed=":"===c.charAt(0)),c.charAt(c.length-1).match(/[|:]/)&&u.frame.push("right"),c=c.substr(1,c.length-2),u.arraydef.columnlines=c.split("").join(" ").replace(/[^|: ]/g,"none").replace(/\|/g,"solid").replace(/:/g,"dashed")),r&&u.setProperty("open",t.convertDelimiter(r)),n&&u.setProperty("close",t.convertDelimiter(n)),"'"===(a||"").charAt(1)&&(u.arraydef["data-cramped"]=!0,a=a.charAt(0)),"D"===a?u.arraydef.displaystyle=!0:a&&(u.arraydef.displaystyle=!1),"S"===a&&(u.arraydef.scriptlevel=1),l&&(u.arraydef.useHeight=!1),t.Push(e),u},_.AlignedArray=function(t,e){var r=t.GetBrackets("\\begin{"+e.getName()+"}"),n=_.Array(t,e);return d.default.setArrayAlign(n,r)},_.Equation=function(t,e,r){return t.Push(e),d.default.checkEqnEnv(t),t.itemFactory.create("equation",r).setProperty("name",e.getName())},_.EqnArray=function(t,e,r,n,o,i){t.Push(e),n&&d.default.checkEqnEnv(t),o=(o=o.replace(/[^clr]/g,"").split("").join(" ")).replace(/l/g,"left").replace(/r/g,"right").replace(/c/g,"center");var s=t.itemFactory.create("eqnarray",e.getName(),r,n,t.stack.global);return s.arraydef={displaystyle:!0,columnalign:o,columnspacing:i||"1em",rowspacing:"3pt",side:t.options.tagSide,minlabelspacing:t.options.tagIndent},s},_.HandleNoTag=function(t,e){t.tags.notag()},_.HandleLabel=function(t,e){var r=t.GetArgument(e);if(""!==r&&!t.tags.refUpdate){if(t.tags.label)throw new p.default("MultipleCommand","Multiple %1",t.currentCS);if(t.tags.label=r,(t.tags.allLabels[r]||t.tags.labels[r])&&!t.options.ignoreDuplicateLabels)throw new p.default("MultipleLabel","Label '%1' multiply defined",r);t.tags.labels[r]=new y.Label}},_.HandleRef=function(t,e,r){var n=t.GetArgument(e),o=t.tags.allLabels[n]||t.tags.labels[n];o||(t.tags.refUpdate||(t.tags.redo=!0),o=new y.Label);var i=o.tag;r&&(i=t.tags.formatTag(i));var s=t.create("node","mrow",d.default.internalMath(t,i),{href:t.tags.formatUrl(o.id,t.options.baseURL),class:"MathJax_ref"});t.Push(s)},_.Macro=function(t,e,r,n,o){if(n){var i=[];if(null!=o){var s=t.GetBrackets(e);i.push(null==s?o:s)}for(var a=i.length;a<n;a++)i.push(t.GetArgument(e));r=d.default.substituteArgs(t,i,r)}t.string=d.default.addArgs(t,r,t.string.slice(t.i)),t.i=0,d.default.checkMaxMacros(t)},_.MathChoice=function(t,e){var r=t.ParseArg(e),n=t.ParseArg(e),o=t.ParseArg(e),i=t.ParseArg(e);t.Push(t.create("node","MathChoice",[r,n,o,i]))},e.default=_},8458:function(t,e,r){var n,o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.ConfigMacrosConfiguration=void 0;var s=r(9899),a=r(7233),l=r(9140),c=i(r(5450)),u=r(8803),p=i(r(1110)),h=r(6793),f="configmacros-map",d="configmacros-env-map";e.ConfigMacrosConfiguration=s.Configuration.create("configmacros",{init:function(t){new l.CommandMap(f,{},{}),new l.EnvironmentMap(d,c.default.environment,{},{}),t.append(s.Configuration.local({handler:{macro:[f],environment:[d]},priority:3}))},config:function(t,e){!function(t){var e,r,n=t.parseOptions.handlers.retrieve(f),i=t.parseOptions.options.macros;try{for(var s=o(Object.keys(i)),a=s.next();!a.done;a=s.next()){var l=a.value,c="string"==typeof i[l]?[i[l]]:i[l],h=Array.isArray(c[2])?new u.Macro(l,p.default.MacroWithTemplate,c.slice(0,2).concat(c[2])):new u.Macro(l,p.default.Macro,c);n.add(l,h)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}}(e),function(t){var e,r,n=t.parseOptions.handlers.retrieve(d),i=t.parseOptions.options.environments;try{for(var s=o(Object.keys(i)),a=s.next();!a.done;a=s.next()){var l=a.value;n.add(l,new u.Macro(l,p.default.BeginEnv,[!0].concat(i[l])))}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}}(e)},items:(n={},n[h.BeginEnvItem.prototype.kind]=h.BeginEnvItem,n),options:{macros:(0,a.expandable)({}),environments:(0,a.expandable)({})}})},1496:function(t,e,r){var n,o=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),i=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&o(e,t,r);return i(e,t),e},a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.NewcommandConfiguration=void 0;var l=r(9899),c=r(6793),u=a(r(5579));r(5117);var p=a(r(5450)),h=s(r(9140));e.NewcommandConfiguration=l.Configuration.create("newcommand",{handler:{macro:["Newcommand-macros"]},items:(n={},n[c.BeginEnvItem.prototype.kind]=c.BeginEnvItem,n),options:{maxMacros:1e3},init:function(t){new h.DelimiterMap(u.default.NEW_DELIMITER,p.default.delimiter,{}),new h.CommandMap(u.default.NEW_COMMAND,{},{}),new h.EnvironmentMap(u.default.NEW_ENVIRONMENT,p.default.environment,{},{}),t.append(l.Configuration.local({handler:{character:[],delimiter:[u.default.NEW_DELIMITER],macro:[u.default.NEW_DELIMITER,u.default.NEW_COMMAND],environment:[u.default.NEW_ENVIRONMENT]},priority:-1}))}})},6793:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.BeginEnvItem=void 0;var s=i(r(3971)),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"beginEnv"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isKind("end")){if(e.getName()!==this.getName())throw new s.default("EnvBadEnd","\\begin{%1} ended with \\end{%2}",this.getName(),e.getName());return[[this.factory.create("mml",this.toMml())],!0]}if(e.isKind("stop"))throw new s.default("EnvMissingEnd","Missing \\end{%1}",this.getName());return t.prototype.checkItem.call(this,e)},e}(r(8292).BaseItem);e.BeginEnvItem=a},5117:function(t,e,r){var n=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var o=n(r(1110));new(r(9140).CommandMap)("Newcommand-macros",{newcommand:"NewCommand",renewcommand:"NewCommand",newenvironment:"NewEnvironment",renewenvironment:"NewEnvironment",def:"MacroDef",let:"Let"},o.default)},1110:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=s(r(3971)),l=i(r(9140)),c=s(r(7693)),u=s(r(1130)),p=s(r(5579)),h={NewCommand:function(t,e){var r=p.default.GetCsNameArgument(t,e),n=p.default.GetArgCount(t,e),o=t.GetBrackets(e),i=t.GetArgument(e);p.default.addMacro(t,r,h.Macro,[i,n,o])},NewEnvironment:function(t,e){var r=u.default.trimSpaces(t.GetArgument(e)),n=p.default.GetArgCount(t,e),o=t.GetBrackets(e),i=t.GetArgument(e),s=t.GetArgument(e);p.default.addEnvironment(t,r,h.BeginEnv,[!0,i,s,n,o])},MacroDef:function(t,e){var r=p.default.GetCSname(t,e),n=p.default.GetTemplate(t,e,"\\"+r),o=t.GetArgument(e);n instanceof Array?p.default.addMacro(t,r,h.MacroWithTemplate,[o].concat(n)):p.default.addMacro(t,r,h.Macro,[o,n])},Let:function(t,e){var r=p.default.GetCSname(t,e),n=t.GetNext();"="===n&&(t.i++,n=t.GetNext());var o=t.configuration.handlers;if("\\"!==n){t.i++;var i=o.get("delimiter").lookup(n);i?p.default.addDelimiter(t,"\\"+r,i.char,i.attributes):p.default.addMacro(t,r,h.Macro,[n])}else{e=p.default.GetCSname(t,e);var s=o.get("delimiter").lookup("\\"+e);if(s)return void p.default.addDelimiter(t,"\\"+r,s.char,s.attributes);var a=o.get("macro").applicable(e);if(!a)return;if(a instanceof l.MacroMap){var c=a.lookup(e);return void p.default.addMacro(t,r,c.func,c.args,c.symbol)}s=a.lookup(e);var u=p.default.disassembleSymbol(r,s);p.default.addMacro(t,r,(function(t,e){for(var r=[],n=2;n<arguments.length;n++)r[n-2]=arguments[n];var o=p.default.assembleSymbol(r);return a.parser(t,o)}),u)}},MacroWithTemplate:function(t,e,r,n){for(var o=[],i=4;i<arguments.length;i++)o[i-4]=arguments[i];var s=parseInt(n,10);if(s){var l=[];if(t.GetNext(),o[0]&&!p.default.MatchParam(t,o[0]))throw new a.default("MismatchUseDef","Use of %1 doesn't match its definition",e);for(var c=0;c<s;c++)l.push(p.default.GetParameter(t,e,o[c+1]));r=u.default.substituteArgs(t,l,r)}t.string=u.default.addArgs(t,r,t.string.slice(t.i)),t.i=0,u.default.checkMaxMacros(t)},BeginEnv:function(t,e,r,n,o,i){if(e.getProperty("end")&&t.stack.env.closing===e.getName()){delete t.stack.env.closing;var s=t.string.slice(t.i);return t.string=n,t.i=0,t.Parse(),t.string=s,t.i=0,t.itemFactory.create("end").setProperty("name",e.getName())}if(o){var a=[];if(null!=i){var l=t.GetBrackets("\\begin{"+e.getName()+"}");a.push(null==l?i:l)}for(var c=a.length;c<o;c++)a.push(t.GetArgument("\\begin{"+e.getName()+"}"));r=u.default.substituteArgs(t,a,r),n=u.default.substituteArgs(t,[],n)}return t.string=u.default.addArgs(t,r,t.string.slice(t.i)),t.i=0,t.itemFactory.create("beginEnv").setProperty("name",e.getName())}};h.Macro=c.default.Macro,e.default=h},5579:function(t,e,r){var n=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var o,i=n(r(1130)),s=n(r(3971)),a=r(8803);!function(t){function e(t,e){return t.string.substr(t.i,e.length)!==e||e.match(/\\[a-z]+$/i)&&t.string.charAt(t.i+e.length).match(/[a-z]/i)?0:(t.i+=e.length,1)}t.disassembleSymbol=function(t,e){var r=[t,e.char];if(e.attributes)for(var n in e.attributes)r.push(n),r.push(e.attributes[n]);return r},t.assembleSymbol=function(t){for(var e=t[0],r=t[1],n={},o=2;o<t.length;o+=2)n[t[o]]=t[o+1];return new a.Symbol(e,r,n)},t.GetCSname=function(t,e){if("\\"!==t.GetNext())throw new s.default("MissingCS","%1 must be followed by a control sequence",e);return i.default.trimSpaces(t.GetArgument(e)).substr(1)},t.GetCsNameArgument=function(t,e){var r=i.default.trimSpaces(t.GetArgument(e));if("\\"===r.charAt(0)&&(r=r.substr(1)),!r.match(/^(.|[a-z]+)$/i))throw new s.default("IllegalControlSequenceName","Illegal control sequence name for %1",e);return r},t.GetArgCount=function(t,e){var r=t.GetBrackets(e);if(r&&!(r=i.default.trimSpaces(r)).match(/^[0-9]+$/))throw new s.default("IllegalParamNumber","Illegal number of parameters specified in %1",e);return r},t.GetTemplate=function(t,e,r){for(var n=t.GetNext(),o=[],i=0,a=t.i;t.i<t.string.length;){if("#"===(n=t.GetNext())){if(a!==t.i&&(o[i]=t.string.substr(a,t.i-a)),!(n=t.string.charAt(++t.i)).match(/^[1-9]$/))throw new s.default("CantUseHash2","Illegal use of # in template for %1",r);if(parseInt(n)!==++i)throw new s.default("SequentialParam","Parameters for %1 must be numbered sequentially",r);a=t.i+1}else if("{"===n)return a!==t.i&&(o[i]=t.string.substr(a,t.i-a)),o.length>0?[i.toString()].concat(o):i;t.i++}throw new s.default("MissingReplacementString","Missing replacement string for definition of %1",e)},t.GetParameter=function(t,r,n){if(null==n)return t.GetArgument(r);for(var o=t.i,i=0,a=0;t.i<t.string.length;){var l=t.string.charAt(t.i);if("{"===l)t.i===o&&(a=1),t.GetArgument(r),i=t.i-o;else{if(e(t,n))return a&&(o++,i-=2),t.string.substr(o,i);if("\\"===l){t.i++,i++,a=0;var c=t.string.substr(t.i).match(/[a-z]+|./i);c&&(t.i+=c[0].length,i=t.i-o)}else t.i++,i++,a=0}}throw new s.default("RunawayArgument","Runaway argument for %1?",r)},t.MatchParam=e,t.addDelimiter=function(e,r,n,o){e.configuration.handlers.retrieve(t.NEW_DELIMITER).add(r,new a.Symbol(r,n,o))},t.addMacro=function(e,r,n,o,i){void 0===i&&(i=""),e.configuration.handlers.retrieve(t.NEW_COMMAND).add(r,new a.Macro(i||r,n,o))},t.addEnvironment=function(e,r,n,o){e.configuration.handlers.retrieve(t.NEW_ENVIRONMENT).add(r,new a.Macro(r,n,o))},t.NEW_DELIMITER="new-Delimiter",t.NEW_COMMAND="new-Command",t.NEW_ENVIRONMENT="new-Environment"}(o||(o={})),e.default=o},4898:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.NoUndefinedConfiguration=void 0;var o=r(9899);e.NoUndefinedConfiguration=o.Configuration.create("noundefined",{fallback:{macro:function(t,e){var r,o,i=t.create("text","\\"+e),s=t.options.noundefined||{},a={};try{for(var l=n(["color","background","size"]),c=l.next();!c.done;c=l.next()){var u=c.value;s[u]&&(a["math"+u]=s[u])}}catch(t){r={error:t}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(r)throw r.error}}t.Push(t.create("node","mtext",[],a,i))}},options:{noundefined:{color:"red",background:"",size:""}},priority:3})},7741:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.RequireConfiguration=e.options=e.RequireMethods=e.RequireLoad=void 0;var a=r(9899),l=r(9140),c=s(r(3971)),u=r(9515),p=r(265),h=r(235),f=r(5713),d=r(7233),m=u.MathJax.config;function y(t,e){var r,o=t.parseOptions.options.require,i=t.parseOptions.packageData.get("require").required,s=e.substr(o.prefix.length);if(i.indexOf(s)<0){i.push(s),function(t,e){var r,o;void 0===e&&(e=[]);var i=t.parseOptions.options.require.prefix;try{for(var s=n(e),a=s.next();!a.done;a=s.next()){var l=a.value;l.substr(0,i.length)===i&&y(t,l)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(r)throw r.error}}}(t,h.CONFIG.dependencies[e]);var l=a.ConfigurationHandler.get(s);if(l){var c=m[e]||{};l.options&&1===Object.keys(l.options).length&&l.options[s]&&((r={})[s]=c,c=r),t.configuration.add(s,t,c);var u=t.parseOptions.packageData.get("require").configured;l.preprocessors.length&&!u.has(s)&&(u.set(s,!0),f.mathjax.retryAfter(Promise.resolve()))}}}function g(t,e){var r=t.options.require,n=r.allow,o=("["===e.substr(0,1)?"":r.prefix)+e;if(!(n.hasOwnProperty(o)?n[o]:n.hasOwnProperty(e)?n[e]:r.defaultAllow))throw new c.default("BadRequire",'Extension "%1" is not allowed to be loaded',o);p.Package.packages.has(o)?y(t.configuration.packageData.get("require").jax,o):f.mathjax.retryAfter(h.Loader.load(o))}e.RequireLoad=g,e.RequireMethods={Require:function(t,e){var r=t.GetArgument(e);if(r.match(/[^_a-zA-Z0-9]/)||""===r)throw new c.default("BadPackageName","Argument for %1 is not a valid package name",e);g(t,r)}},e.options={require:{allow:(0,d.expandable)({base:!1,"all-packages":!1,autoload:!1,configmacros:!1,tagformat:!1,setoptions:!1}),defaultAllow:!0,prefix:"tex"}},new l.CommandMap("require",{require:"Require"},e.RequireMethods),e.RequireConfiguration=a.Configuration.create("require",{handler:{macro:["require"]},config:function(t,e){e.parseOptions.packageData.set("require",{jax:e,required:i([],o(e.options.packages),!1),configured:new Map});var r=e.parseOptions.options.require,n=r.prefix;if(n.match(/[^_a-zA-Z0-9]/))throw Error("Illegal characters used in \\require prefix");h.CONFIG.paths[n]||(h.CONFIG.paths[n]="[mathjax]/input/tex/extensions"),r.prefix="["+n+"]/"},options:e.options})},5713:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.mathjax=void 0;var n=r(3282),o=r(805),i=r(4542);e.mathjax={version:n.VERSION,handlers:new o.HandlerList,document:function(t,r){return e.mathjax.handlers.document(t,r)},handleRetriesFor:i.handleRetriesFor,retryAfter:i.retryAfter,asyncLoad:null}},50:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),l=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&s(e,t,r);return a(e,t),e},c=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTML=void 0;var u=r(3055),p=r(4139),h=r(9261),f=r(6797),d=r(2760),m=l(r(6010)),y=r(505),g=function(t){function e(e){void 0===e&&(e=null);var r=t.call(this,e,h.CHTMLWrapperFactory,d.TeXFont)||this;return r.chtmlStyles=null,r.font.adaptiveCSS(r.options.adaptiveCSS),r.wrapperUsage=new f.Usage,r}return o(e,t),e.prototype.escaped=function(t,e){return this.setDocument(e),this.html("span",{},[this.text(t.math)])},e.prototype.styleSheet=function(r){if(this.chtmlStyles){if(this.options.adaptiveCSS){var n=new p.CssStyles;this.addWrapperStyles(n),this.updateFontStyles(n),this.adaptor.insertRules(this.chtmlStyles,n.getStyleRules())}return this.chtmlStyles}var o=this.chtmlStyles=t.prototype.styleSheet.call(this,r);return this.adaptor.setAttribute(o,"id",e.STYLESHEETID),this.wrapperUsage.update(),o},e.prototype.updateFontStyles=function(t){t.addStyles(this.font.updateStyles({}))},e.prototype.addWrapperStyles=function(e){var r,n;if(this.options.adaptiveCSS)try{for(var o=c(this.wrapperUsage.update()),i=o.next();!i.done;i=o.next()){var s=i.value,a=this.factory.getNodeClass(s);a&&this.addClassStyles(a,e)}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}else t.prototype.addWrapperStyles.call(this,e)},e.prototype.addClassStyles=function(e,r){var n,o=e;o.autoStyle&&"unknown"!==o.kind&&r.addStyles(((n={})["mjx-"+o.kind]={display:"inline-block","text-align":"left"},n)),this.wrapperUsage.add(o.kind),t.prototype.addClassStyles.call(this,e,r)},e.prototype.processMath=function(t,e){this.factory.wrap(t).toCHTML(e)},e.prototype.clearCache=function(){this.cssStyles.clear(),this.font.clearCache(),this.wrapperUsage.clear(),this.chtmlStyles=null},e.prototype.reset=function(){this.clearCache()},e.prototype.unknownText=function(t,e,r){void 0===r&&(r=null);var n={},o=100/this.math.metrics.scale;if(100!==o&&(n["font-size"]=this.fixed(o,1)+"%",n.padding=m.em(75/o)+" 0 "+m.em(20/o)+" 0"),"-explicitFont"!==e){var i=(0,y.unicodeChars)(t);(1!==i.length||i[0]<119808||i[0]>120831)&&this.cssFontStyles(this.font.getCssFont(e),n)}if(null!==r){var s=this.math.metrics;n.width=Math.round(r*s.em*s.scale)+"px"}return this.html("mjx-utext",{variant:e,style:n},[this.text(t)])},e.prototype.measureTextNode=function(t){var e=this.adaptor,r=e.clone(t);e.setStyle(r,"font-family",e.getStyle(r,"font-family").replace(/MJXZERO, /g,""));var n=this.html("mjx-measure-text",{style:{position:"absolute","white-space":"nowrap"}},[r]);e.append(e.parent(this.math.start.node),this.container),e.append(this.container,n);var o=e.nodeSize(r,this.math.metrics.em)[0]/this.math.metrics.scale;return e.remove(this.container),e.remove(n),{w:o,h:.75,d:.2}},e.NAME="CHTML",e.OPTIONS=i(i({},u.CommonOutputJax.OPTIONS),{adaptiveCSS:!0,matchFontHeight:!0}),e.commonStyles={'mjx-container[jax="CHTML"]':{"line-height":0},'mjx-container [space="1"]':{"margin-left":".111em"},'mjx-container [space="2"]':{"margin-left":".167em"},'mjx-container [space="3"]':{"margin-left":".222em"},'mjx-container [space="4"]':{"margin-left":".278em"},'mjx-container [space="5"]':{"margin-left":".333em"},'mjx-container [rspace="1"]':{"margin-right":".111em"},'mjx-container [rspace="2"]':{"margin-right":".167em"},'mjx-container [rspace="3"]':{"margin-right":".222em"},'mjx-container [rspace="4"]':{"margin-right":".278em"},'mjx-container [rspace="5"]':{"margin-right":".333em"},'mjx-container [size="s"]':{"font-size":"70.7%"},'mjx-container [size="ss"]':{"font-size":"50%"},'mjx-container [size="Tn"]':{"font-size":"60%"},'mjx-container [size="sm"]':{"font-size":"85%"},'mjx-container [size="lg"]':{"font-size":"120%"},'mjx-container [size="Lg"]':{"font-size":"144%"},'mjx-container [size="LG"]':{"font-size":"173%"},'mjx-container [size="hg"]':{"font-size":"207%"},'mjx-container [size="HG"]':{"font-size":"249%"},'mjx-container [width="full"]':{width:"100%"},"mjx-box":{display:"inline-block"},"mjx-block":{display:"block"},"mjx-itable":{display:"inline-table"},"mjx-row":{display:"table-row"},"mjx-row > *":{display:"table-cell"},"mjx-mtext":{display:"inline-block"},"mjx-mstyle":{display:"inline-block"},"mjx-merror":{display:"inline-block",color:"red","background-color":"yellow"},"mjx-mphantom":{visibility:"hidden"},"_::-webkit-full-page-media, _:future, :root mjx-container":{"will-change":"opacity"}},e.STYLESHEETID="MJX-CHTML-styles",e}(u.CommonOutputJax);e.CHTML=g},8042:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),a=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||s(e,t,r)},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.AddCSS=e.CHTMLFontData=void 0;var u=r(5884),p=r(6797),h=r(6010);a(r(5884),e);var f=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.charUsage=new p.Usage,e.delimUsage=new p.Usage,e}return o(e,t),e.charOptions=function(e,r){return t.charOptions.call(this,e,r)},e.prototype.adaptiveCSS=function(t){this.options.adaptiveCSS=t},e.prototype.clearCache=function(){this.options.adaptiveCSS&&(this.charUsage.clear(),this.delimUsage.clear())},e.prototype.createVariant=function(e,r,n){void 0===r&&(r=null),void 0===n&&(n=null),t.prototype.createVariant.call(this,e,r,n);var o=this.constructor;this.variant[e].classes=o.defaultVariantClasses[e],this.variant[e].letter=o.defaultVariantLetters[e]},e.prototype.defineChars=function(r,n){var o,i;t.prototype.defineChars.call(this,r,n);var s=this.variant[r].letter;try{for(var a=l(Object.keys(n)),c=a.next();!c.done;c=a.next()){var u=c.value,p=e.charOptions(n,parseInt(u));void 0===p.f&&(p.f=s)}}catch(t){o={error:t}}finally{try{c&&!c.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}},Object.defineProperty(e.prototype,"styles",{get:function(){var t=this.constructor,e=i({},t.defaultStyles);return this.addFontURLs(e,t.defaultFonts,this.options.fontURL),this.options.adaptiveCSS?this.updateStyles(e):this.allStyles(e),e},enumerable:!1,configurable:!0}),e.prototype.updateStyles=function(t){var e,r,n,o;try{for(var i=l(this.delimUsage.update()),s=i.next();!s.done;s=i.next()){var a=s.value;this.addDelimiterStyles(t,a,this.delimiters[a])}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}try{for(var u=l(this.charUsage.update()),p=u.next();!p.done;p=u.next()){var h=c(p.value,2),f=h[0],d=(a=h[1],this.variant[f]);this.addCharStyles(t,d.letter,a,d.chars[a])}}catch(t){n={error:t}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(n)throw n.error}}return t},e.prototype.allStyles=function(t){var e,r,n,o,i,s;try{for(var a=l(Object.keys(this.delimiters)),c=a.next();!c.done;c=a.next()){var u=c.value,p=parseInt(u);this.addDelimiterStyles(t,p,this.delimiters[p])}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(e)throw e.error}}try{for(var h=l(Object.keys(this.variant)),f=h.next();!f.done;f=h.next()){var d=f.value,m=this.variant[d],y=m.letter;try{for(var g=(i=void 0,l(Object.keys(m.chars))),b=g.next();!b.done;b=g.next()){u=b.value,p=parseInt(u);var v=m.chars[p];(v[3]||{}).smp||(v.length<4&&(v[3]={}),this.addCharStyles(t,y,p,v))}}catch(t){i={error:t}}finally{try{b&&!b.done&&(s=g.return)&&s.call(g)}finally{if(i)throw i.error}}}}catch(t){n={error:t}}finally{try{f&&!f.done&&(o=h.return)&&o.call(h)}finally{if(n)throw n.error}}},e.prototype.addFontURLs=function(t,e,r){var n,o;try{for(var s=l(Object.keys(e)),a=s.next();!a.done;a=s.next()){var c=a.value,u=i({},e[c]);u.src=u.src.replace(/%%URL%%/,r),t[c]=u}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}},e.prototype.addDelimiterStyles=function(t,e,r){var n=this.charSelector(e);r.c&&r.c!==e&&(t[".mjx-stretched mjx-c"+(n=this.charSelector(r.c))+"::before"]={content:this.charContent(r.c)}),r.stretch&&(1===r.dir?this.addDelimiterVStyles(t,n,r):this.addDelimiterHStyles(t,n,r))},e.prototype.addDelimiterVStyles=function(t,e,r){var n=r.HDW,o=c(r.stretch,4),i=o[0],s=o[1],a=o[2],l=o[3],u=this.addDelimiterVPart(t,e,"beg",i,n);this.addDelimiterVPart(t,e,"ext",s,n);var p=this.addDelimiterVPart(t,e,"end",a,n),h={};if(l){var f=this.addDelimiterVPart(t,e,"mid",l,n);h.height="50%",t["mjx-stretchy-v"+e+" > mjx-mid"]={"margin-top":this.em(-f/2),"margin-bottom":this.em(-f/2)}}u&&(h["border-top-width"]=this.em0(u-.03)),p&&(h["border-bottom-width"]=this.em0(p-.03),t["mjx-stretchy-v"+e+" > mjx-end"]={"margin-top":this.em(-p)}),Object.keys(h).length&&(t["mjx-stretchy-v"+e+" > mjx-ext"]=h)},e.prototype.addDelimiterVPart=function(t,e,r,n,o){if(!n)return 0;var i=this.getDelimiterData(n),s=(o[2]-i[2])/2,a={content:this.charContent(n)};return"ext"!==r?a.padding=this.padding(i,s):(a.width=this.em0(o[2]),s&&(a["padding-left"]=this.em0(s))),t["mjx-stretchy-v"+e+" mjx-"+r+" mjx-c::before"]=a,i[0]+i[1]},e.prototype.addDelimiterHStyles=function(t,e,r){var n=c(r.stretch,4),o=n[0],i=n[1],s=n[2],a=n[3],l=r.HDW;this.addDelimiterHPart(t,e,"beg",o,l),this.addDelimiterHPart(t,e,"ext",i,l),this.addDelimiterHPart(t,e,"end",s,l),a&&(this.addDelimiterHPart(t,e,"mid",a,l),t["mjx-stretchy-h"+e+" > mjx-ext"]={width:"50%"})},e.prototype.addDelimiterHPart=function(t,e,r,n,o){if(n){var i=this.getDelimiterData(n)[3],s={content:i&&i.c?'"'+i.c+'"':this.charContent(n)};s.padding=this.padding(o,0,-o[2]),t["mjx-stretchy-h"+e+" mjx-"+r+" mjx-c::before"]=s}},e.prototype.addCharStyles=function(t,e,r,n){var o=n[3],i=void 0!==o.f?o.f:e;t["mjx-c"+this.charSelector(r)+(i?".TEX-"+i:"")+"::before"]={padding:this.padding(n,0,o.ic||0),content:null!=o.c?'"'+o.c+'"':this.charContent(r)}},e.prototype.getDelimiterData=function(t){return this.getChar("-smallop",t)},e.prototype.em=function(t){return(0,h.em)(t)},e.prototype.em0=function(t){return(0,h.em)(Math.max(0,t))},e.prototype.padding=function(t,e,r){var n=c(t,3),o=n[0],i=n[1];return void 0===e&&(e=0),void 0===r&&(r=0),[o,n[2]+r,i,e].map(this.em0).join(" ")},e.prototype.charContent=function(t){return'"'+(t>=32&&t<=126&&34!==t&&39!==t&&92!==t?String.fromCharCode(t):"\\"+t.toString(16).toUpperCase())+'"'},e.prototype.charSelector=function(t){return".mjx-c"+t.toString(16).toUpperCase()},e.OPTIONS=i(i({},u.FontData.OPTIONS),{fontURL:"js/output/chtml/fonts/tex-woff-v2"}),e.JAX="CHTML",e.defaultVariantClasses={},e.defaultVariantLetters={},e.defaultStyles={"mjx-c::before":{display:"block",width:0}},e.defaultFonts={"@font-face /* 0 */":{"font-family":"MJXZERO",src:'url("%%URL%%/MathJax_Zero.woff") format("woff")'}},e}(u.FontData);e.CHTMLFontData=f,e.AddCSS=function(t,e){var r,n;try{for(var o=l(Object.keys(e)),i=o.next();!i.done;i=o.next()){var s=i.value,a=parseInt(s);Object.assign(u.FontData.charOptions(t,a),e[a])}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return t}},8270:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},s=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||n(e,t,r)},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.Arrow=e.DiagonalArrow=e.DiagonalStrike=e.Border2=e.Border=e.RenderElement=void 0;var l=i(r(5552));s(r(5552),e);e.RenderElement=function(t,e){return void 0===e&&(e=""),function(r,n){var o=r.adjustBorder(r.html("mjx-"+t));if(e){var i=r.getOffset(e);if(r.thickness!==l.THICKNESS||i){var s="translate".concat(e,"(").concat(r.em(r.thickness/2-i),")");r.adaptor.setStyle(o,"transform",s)}}r.adaptor.append(r.chtml,o)}};e.Border=function(t){return l.CommonBorder((function(e,r){e.adaptor.setStyle(r,"border-"+t,e.em(e.thickness)+" solid")}))(t)};e.Border2=function(t,e,r){return l.CommonBorder2((function(t,n){var o=t.em(t.thickness)+" solid";t.adaptor.setStyle(n,"border-"+e,o),t.adaptor.setStyle(n,"border-"+r,o)}))(t,e,r)};e.DiagonalStrike=function(t,e){return l.CommonDiagonalStrike((function(t){return function(r,n){var o=r.getBBox(),i=o.w,s=o.h,l=o.d,c=a(r.getArgMod(i,s+l),2),u=c[0],p=c[1],h=e*r.thickness/2,f=r.adjustBorder(r.html(t,{style:{width:r.em(p),transform:"rotate("+r.fixed(-e*u)+"rad) translateY("+h+"em)"}}));r.adaptor.append(r.chtml,f)}}))(t)};e.DiagonalArrow=function(t){return l.CommonDiagonalArrow((function(t,e){t.adaptor.append(t.chtml,e)}))(t)};e.Arrow=function(t){return l.CommonArrow((function(t,e){t.adaptor.append(t.chtml,e)}))(t)}},6797:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Usage=void 0;var r=function(){function t(){this.used=new Set,this.needsUpdate=[]}return t.prototype.add=function(t){var e=JSON.stringify(t);this.used.has(e)||this.needsUpdate.push(t),this.used.add(e)},t.prototype.has=function(t){return this.used.has(JSON.stringify(t))},t.prototype.clear=function(){this.used.clear(),this.needsUpdate=[]},t.prototype.update=function(){var t=this.needsUpdate;return this.needsUpdate=[],t},t}();e.Usage=r},5355:function(t,e,r){var n,o,i=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),s=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),l=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&s(e,t,r);return a(e,t),e},c=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},u=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLWrapper=e.SPACE=e.FONTSIZE=void 0;var p=l(r(6010)),h=r(7519),f=r(6469);e.FONTSIZE={"70.7%":"s","70%":"s","50%":"ss","60%":"Tn","85%":"sm","120%":"lg","144%":"Lg","173%":"LG","207%":"hg","249%":"HG"},e.SPACE=((o={})[p.em(2/18)]="1",o[p.em(3/18)]="2",o[p.em(4/18)]="3",o[p.em(5/18)]="4",o[p.em(6/18)]="5",o);var d=function(t){function r(){var e=null!==t&&t.apply(this,arguments)||this;return e.chtml=null,e}return i(r,t),r.prototype.toCHTML=function(t){var e,r,n=this.standardCHTMLnode(t);try{for(var o=c(this.childNodes),i=o.next();!i.done;i=o.next()){i.value.toCHTML(n)}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},r.prototype.standardCHTMLnode=function(t){this.markUsed();var e=this.createCHTMLnode(t);return this.handleStyles(),this.handleVariant(),this.handleScale(),this.handleColor(),this.handleSpace(),this.handleAttributes(),this.handlePWidth(),e},r.prototype.markUsed=function(){this.jax.wrapperUsage.add(this.kind)},r.prototype.createCHTMLnode=function(t){var e=this.node.attributes.get("href");return e&&(t=this.adaptor.append(t,this.html("a",{href:e}))),this.chtml=this.adaptor.append(t,this.html("mjx-"+this.node.kind)),this.chtml},r.prototype.handleStyles=function(){if(this.styles){var t=this.styles.cssText;if(t){this.adaptor.setAttribute(this.chtml,"style",t);var e=this.styles.get("font-family");e&&this.adaptor.setStyle(this.chtml,"font-family","MJXZERO, "+e)}}},r.prototype.handleVariant=function(){this.node.isToken&&"-explicitFont"!==this.variant&&this.adaptor.setAttribute(this.chtml,"class",(this.font.getVariant(this.variant)||this.font.getVariant("normal")).classes)},r.prototype.handleScale=function(){this.setScale(this.chtml,this.bbox.rscale)},r.prototype.setScale=function(t,r){var n=Math.abs(r-1)<.001?1:r;if(t&&1!==n){var o=this.percent(n);e.FONTSIZE[o]?this.adaptor.setAttribute(t,"size",e.FONTSIZE[o]):this.adaptor.setStyle(t,"fontSize",o)}return t},r.prototype.handleSpace=function(){var t,r;try{for(var n=c([[this.bbox.L,"space","marginLeft"],[this.bbox.R,"rspace","marginRight"]]),o=n.next();!o.done;o=n.next()){var i=o.value,s=u(i,3),a=s[0],l=s[1],p=s[2];if(a){var h=this.em(a);e.SPACE[h]?this.adaptor.setAttribute(this.chtml,l,e.SPACE[h]):this.adaptor.setStyle(this.chtml,p,h)}}}catch(e){t={error:e}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},r.prototype.handleColor=function(){var t=this.node.attributes,e=t.getExplicit("mathcolor"),r=t.getExplicit("color"),n=t.getExplicit("mathbackground"),o=t.getExplicit("background");(e||r)&&this.adaptor.setStyle(this.chtml,"color",e||r),(n||o)&&this.adaptor.setStyle(this.chtml,"backgroundColor",n||o)},r.prototype.handleAttributes=function(){var t,e,n,o,i=this.node.attributes,s=i.getAllDefaults(),a=r.skipAttributes;try{for(var l=c(i.getExplicitNames()),u=l.next();!u.done;u=l.next()){var p=u.value;!1!==a[p]&&(p in s||a[p]||this.adaptor.hasAttribute(this.chtml,p))||this.adaptor.setAttribute(this.chtml,p,i.getExplicit(p))}}catch(e){t={error:e}}finally{try{u&&!u.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}if(i.get("class")){var h=i.get("class").trim().split(/ +/);try{for(var f=c(h),d=f.next();!d.done;d=f.next()){var m=d.value;this.adaptor.addClass(this.chtml,m)}}catch(t){n={error:t}}finally{try{d&&!d.done&&(o=f.return)&&o.call(f)}finally{if(n)throw n.error}}}},r.prototype.handlePWidth=function(){this.bbox.pwidth&&(this.bbox.pwidth===f.BBox.fullWidth?this.adaptor.setAttribute(this.chtml,"width","full"):this.adaptor.setStyle(this.chtml,"width",this.bbox.pwidth))},r.prototype.setIndent=function(t,e,r){var n=this.adaptor;if("center"===e||"left"===e){var o=this.getBBox().L;n.setStyle(t,"margin-left",this.em(r+o))}if("center"===e||"right"===e){var i=this.getBBox().R;n.setStyle(t,"margin-right",this.em(-r+i))}},r.prototype.drawBBox=function(){var t=this.getBBox(),e=t.w,r=t.h,n=t.d,o=t.R,i=this.html("mjx-box",{style:{opacity:.25,"margin-left":this.em(-e-o)}},[this.html("mjx-box",{style:{height:this.em(r),width:this.em(e),"background-color":"red"}}),this.html("mjx-box",{style:{height:this.em(n),width:this.em(e),"margin-left":this.em(-e),"vertical-align":this.em(-n),"background-color":"green"}})]),s=this.chtml||this.parent.chtml,a=this.adaptor.getAttribute(s,"size");a&&this.adaptor.setAttribute(i,"size",a);var l=this.adaptor.getStyle(s,"fontSize");l&&this.adaptor.setStyle(i,"fontSize",l),this.adaptor.append(this.adaptor.parent(s),i),this.adaptor.setStyle(s,"backgroundColor","#FFEE00")},r.prototype.html=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.jax.html(t,e,r)},r.prototype.text=function(t){return this.jax.text(t)},r.prototype.char=function(t){return this.font.charSelector(t).substr(1)},r.kind="unknown",r.autoStyle=!0,r}(h.CommonWrapper);e.CHTMLWrapper=d},9261:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLWrapperFactory=void 0;var i=r(4420),s=r(9086),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.defaultNodes=s.CHTMLWrappers,e}(i.CommonWrapperFactory);e.CHTMLWrapperFactory=a},9086:function(t,e,r){var n;Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLWrappers=void 0;var o=r(5355),i=r(804),s=r(1653),a=r(6287),l=r(6460),c=r(4597),u=r(1259),p=r(2970),h=r(5964),f=r(8147),d=r(4798),m=r(2275),y=r(9063),g=r(5610),b=r(8776),v=r(4300),_=r(6590),S=r(6781),O=r(8002),M=r(3571),x=r(7056),E=r(8102),A=r(6911),C=r(421),T=r(95),N=r(1148);e.CHTMLWrappers=((n={})[i.CHTMLmath.kind]=i.CHTMLmath,n[d.CHTMLmrow.kind]=d.CHTMLmrow,n[d.CHTMLinferredMrow.kind]=d.CHTMLinferredMrow,n[s.CHTMLmi.kind]=s.CHTMLmi,n[a.CHTMLmo.kind]=a.CHTMLmo,n[l.CHTMLmn.kind]=l.CHTMLmn,n[c.CHTMLms.kind]=c.CHTMLms,n[u.CHTMLmtext.kind]=u.CHTMLmtext,n[p.CHTMLmspace.kind]=p.CHTMLmspace,n[h.CHTMLmpadded.kind]=h.CHTMLmpadded,n[f.CHTMLmenclose.kind]=f.CHTMLmenclose,n[y.CHTMLmfrac.kind]=y.CHTMLmfrac,n[g.CHTMLmsqrt.kind]=g.CHTMLmsqrt,n[b.CHTMLmroot.kind]=b.CHTMLmroot,n[v.CHTMLmsub.kind]=v.CHTMLmsub,n[v.CHTMLmsup.kind]=v.CHTMLmsup,n[v.CHTMLmsubsup.kind]=v.CHTMLmsubsup,n[_.CHTMLmunder.kind]=_.CHTMLmunder,n[_.CHTMLmover.kind]=_.CHTMLmover,n[_.CHTMLmunderover.kind]=_.CHTMLmunderover,n[S.CHTMLmmultiscripts.kind]=S.CHTMLmmultiscripts,n[m.CHTMLmfenced.kind]=m.CHTMLmfenced,n[O.CHTMLmtable.kind]=O.CHTMLmtable,n[M.CHTMLmtr.kind]=M.CHTMLmtr,n[M.CHTMLmlabeledtr.kind]=M.CHTMLmlabeledtr,n[x.CHTMLmtd.kind]=x.CHTMLmtd,n[E.CHTMLmaction.kind]=E.CHTMLmaction,n[A.CHTMLmglyph.kind]=A.CHTMLmglyph,n[C.CHTMLsemantics.kind]=C.CHTMLsemantics,n[C.CHTMLannotation.kind]=C.CHTMLannotation,n[C.CHTMLannotationXML.kind]=C.CHTMLannotationXML,n[C.CHTMLxml.kind]=C.CHTMLxml,n[T.CHTMLTeXAtom.kind]=T.CHTMLTeXAtom,n[N.CHTMLTextNode.kind]=N.CHTMLTextNode,n[o.CHTMLWrapper.kind]=o.CHTMLWrapper,n)},95:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLTeXAtom=void 0;var i=r(5355),s=r(9800),a=r(3948),l=r(9007),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){if(t.prototype.toCHTML.call(this,e),this.adaptor.setAttribute(this.chtml,"texclass",l.TEXCLASSNAMES[this.node.texClass]),this.node.texClass===l.TEXCLASS.VCENTER){var r=this.childNodes[0].getBBox(),n=r.h,o=(n+r.d)/2+this.font.params.axis_height-n;this.adaptor.setStyle(this.chtml,"verticalAlign",this.em(o))}},e.kind=a.TeXAtom.prototype.kind,e}((0,s.CommonTeXAtomMixin)(i.CHTMLWrapper));e.CHTMLTeXAtom=c},1148:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLTextNode=void 0;var s=r(9007),a=r(5355),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r;this.markUsed();var n=this.adaptor,o=this.parent.variant,s=this.node.getText();if(0!==s.length)if("-explicitFont"===o)n.append(t,this.jax.unknownText(s,o,this.getBBox().w));else{var a=this.remappedText(s,o);try{for(var l=i(a),c=l.next();!c.done;c=l.next()){var u=c.value,p=this.getVariantChar(o,u)[3],h=p.f?" TEX-"+p.f:"",f=p.unknown?this.jax.unknownText(String.fromCodePoint(u),o):this.html("mjx-c",{class:this.char(u)+h});n.append(t,f),!p.unknown&&this.font.charUsage.add([o,u])}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(e)throw e.error}}}},e.kind=s.TextNode.prototype.kind,e.autoStyle=!1,e.styles={"mjx-c":{display:"inline-block"},"mjx-utext":{display:"inline-block",padding:".75em 0 .2em 0"}},e}((0,r(1160).CommonTextNodeMixin)(a.CHTMLWrapper));e.CHTMLTextNode=l},8102:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmaction=void 0;var i=r(5355),s=r(1956),a=r(1956),l=r(9145),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);this.selected.toCHTML(e),this.action(this,this.data)},e.prototype.setEventHandler=function(t,e){this.chtml.addEventListener(t,e)},e.kind=l.MmlMaction.prototype.kind,e.styles={"mjx-maction":{position:"relative"},"mjx-maction > mjx-tool":{display:"none",position:"absolute",bottom:0,right:0,width:0,height:0,"z-index":500},"mjx-tool > mjx-tip":{display:"inline-block",padding:".2em",border:"1px solid #888","font-size":"70%","background-color":"#F8F8F8",color:"black","box-shadow":"2px 2px 5px #AAAAAA"},"mjx-maction[toggle]":{cursor:"pointer"},"mjx-status":{display:"block",position:"fixed",left:"1em",bottom:"1em","min-width":"25%",padding:".2em .4em",border:"1px solid #888","font-size":"90%","background-color":"#F8F8F8",color:"black"}},e.actions=new Map([["toggle",[function(t,e){t.adaptor.setAttribute(t.chtml,"toggle",t.node.attributes.get("selection"));var r=t.factory.jax.math,n=t.factory.jax.document,o=t.node;t.setEventHandler("click",(function(t){r.end.node||(r.start.node=r.end.node=r.typesetRoot,r.start.n=r.end.n=0),o.nextToggleSelection(),r.rerender(n),t.stopPropagation()}))},{}]],["tooltip",[function(t,e){var r=t.childNodes[1];if(r)if(r.node.isKind("mtext")){var n=r.node.getText();t.adaptor.setAttribute(t.chtml,"title",n)}else{var o=t.adaptor,i=o.append(t.chtml,t.html("mjx-tool",{style:{bottom:t.em(-t.dy),right:t.em(-t.dx)}},[t.html("mjx-tip")]));r.toCHTML(o.firstChild(i)),t.setEventHandler("mouseover",(function(r){e.stopTimers(t,e);var n=setTimeout((function(){return o.setStyle(i,"display","block")}),e.postDelay);e.hoverTimer.set(t,n),r.stopPropagation()})),t.setEventHandler("mouseout",(function(r){e.stopTimers(t,e);var n=setTimeout((function(){return o.setStyle(i,"display","")}),e.clearDelay);e.clearTimer.set(t,n),r.stopPropagation()}))}},a.TooltipData]],["statusline",[function(t,e){var r=t.childNodes[1];if(r&&r.node.isKind("mtext")){var n=t.adaptor,o=r.node.getText();n.setAttribute(t.chtml,"statusline",o),t.setEventHandler("mouseover",(function(r){if(null===e.status){var i=n.body(n.document);e.status=n.append(i,t.html("mjx-status",{},[t.text(o)]))}r.stopPropagation()})),t.setEventHandler("mouseout",(function(t){e.status&&(n.remove(e.status),e.status=null),t.stopPropagation()}))}},{status:null}]]]),e}((0,s.CommonMactionMixin)(i.CHTMLWrapper));e.CHTMLmaction=c},804:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmath=void 0;var s=r(5355),a=r(7490),l=r(3233),c=r(6469),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.chtml,n=this.adaptor;"block"===this.node.attributes.get("display")?(n.setAttribute(r,"display","true"),n.setAttribute(e,"display","true"),this.handleDisplay(e)):this.handleInline(e),n.addClass(r,"MJX-TEX")},e.prototype.handleDisplay=function(t){var e=this.adaptor,r=i(this.getAlignShift(),2),n=r[0],o=r[1];if("center"!==n&&e.setAttribute(t,"justify",n),this.bbox.pwidth===c.BBox.fullWidth){if(e.setAttribute(t,"width","full"),this.jax.table){var s=this.jax.table.getOuterBBox(),a=s.L,l=s.w,u=s.R;"right"===n?u=Math.max(u||-o,-o):"left"===n?a=Math.max(a||o,o):"center"===n&&(l+=2*Math.abs(o));var p=this.em(Math.max(0,a+l+u));e.setStyle(t,"min-width",p),e.setStyle(this.jax.table.chtml,"min-width",p)}}else this.setIndent(this.chtml,n,o)},e.prototype.handleInline=function(t){var e=this.adaptor,r=e.getStyle(this.chtml,"margin-right");r&&(e.setStyle(this.chtml,"margin-right",""),e.setStyle(t,"margin-right",r),e.setStyle(t,"width","0"))},e.prototype.setChildPWidths=function(e,r,n){return void 0===r&&(r=null),void 0===n&&(n=!0),!!this.parent&&t.prototype.setChildPWidths.call(this,e,r,n)},e.kind=l.MmlMath.prototype.kind,e.styles={"mjx-math":{"line-height":0,"text-align":"left","text-indent":0,"font-style":"normal","font-weight":"normal","font-size":"100%","font-size-adjust":"none","letter-spacing":"normal","border-collapse":"collapse","word-wrap":"normal","word-spacing":"normal","white-space":"nowrap",direction:"ltr",padding:"1px 0"},'mjx-container[jax="CHTML"][display="true"]':{display:"block","text-align":"center",margin:"1em 0"},'mjx-container[jax="CHTML"][display="true"][width="full"]':{display:"flex"},'mjx-container[jax="CHTML"][display="true"] mjx-math':{padding:0},'mjx-container[jax="CHTML"][justify="left"]':{"text-align":"left"},'mjx-container[jax="CHTML"][justify="right"]':{"text-align":"right"}},e}((0,a.CommonMathMixin)(s.CHTMLWrapper));e.CHTMLmath=u},8147:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),s=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),a=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return s(e,t),e},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmenclose=void 0;var u=r(5355),p=r(7313),h=a(r(8270)),f=r(6661),d=r(6010);function m(t,e){return Math.atan2(t,e).toFixed(3).replace(/\.?0+$/,"")}var y=m(h.ARROWDX,h.ARROWY),g=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r,n,o,i=this.adaptor,s=this.standardCHTMLnode(t),a=i.append(s,this.html("mjx-box"));this.renderChild?this.renderChild(this,a):this.childNodes[0].toCHTML(a);try{for(var c=l(Object.keys(this.notations)),u=c.next();!u.done;u=c.next()){var p=u.value,f=this.notations[p];!f.renderChild&&f.renderer(this,a)}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}var d=this.getPadding();try{for(var m=l(h.sideNames),y=m.next();!y.done;y=m.next()){var g=y.value,b=h.sideIndex[g];d[b]>0&&i.setStyle(a,"padding-"+g,this.em(d[b]))}}catch(t){n={error:t}}finally{try{y&&!y.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}},e.prototype.arrow=function(t,e,r,n,o){void 0===n&&(n=""),void 0===o&&(o=0);var i=this.getBBox().w,s={width:this.em(t)};i!==t&&(s.left=this.em((i-t)/2)),e&&(s.transform="rotate("+this.fixed(e)+"rad)");var a=this.html("mjx-arrow",{style:s},[this.html("mjx-aline"),this.html("mjx-rthead"),this.html("mjx-rbhead")]);return r&&(this.adaptor.append(a,this.html("mjx-lthead")),this.adaptor.append(a,this.html("mjx-lbhead")),this.adaptor.setAttribute(a,"double","true")),this.adjustArrow(a,r),this.moveArrow(a,n,o),a},e.prototype.adjustArrow=function(t,e){var r=this,n=this.thickness,o=this.arrowhead;if(o.x!==h.ARROWX||o.y!==h.ARROWY||o.dx!==h.ARROWDX||n!==h.THICKNESS){var i=c([n*o.x,n*o.y].map((function(t){return r.em(t)})),2),s=i[0],a=i[1],l=m(o.dx,o.y),u=c(this.adaptor.childNodes(t),5),p=u[0],f=u[1],d=u[2],y=u[3],g=u[4];this.adjustHead(f,[a,"0","1px",s],l),this.adjustHead(d,["1px","0",a,s],"-"+l),this.adjustHead(y,[a,s,"1px","0"],"-"+l),this.adjustHead(g,["1px",s,a,"0"],l),this.adjustLine(p,n,o.x,e)}},e.prototype.adjustHead=function(t,e,r){t&&(this.adaptor.setStyle(t,"border-width",e.join(" ")),this.adaptor.setStyle(t,"transform","skewX("+r+"rad)"))},e.prototype.adjustLine=function(t,e,r,n){this.adaptor.setStyle(t,"borderTop",this.em(e)+" solid"),this.adaptor.setStyle(t,"top",this.em(-e/2)),this.adaptor.setStyle(t,"right",this.em(e*(r-1))),n&&this.adaptor.setStyle(t,"left",this.em(e*(r-1)))},e.prototype.moveArrow=function(t,e,r){if(r){var n=this.adaptor.getStyle(t,"transform");this.adaptor.setStyle(t,"transform","translate".concat(e,"(").concat(this.em(-r),")").concat(n?" "+n:""))}},e.prototype.adjustBorder=function(t){return this.thickness!==h.THICKNESS&&this.adaptor.setStyle(t,"borderWidth",this.em(this.thickness)),t},e.prototype.adjustThickness=function(t){return this.thickness!==h.THICKNESS&&this.adaptor.setStyle(t,"strokeWidth",this.fixed(this.thickness)),t},e.prototype.fixed=function(t,e){return void 0===e&&(e=3),Math.abs(t)<6e-4?"0":t.toFixed(e).replace(/\.?0+$/,"")},e.prototype.em=function(e){return t.prototype.em.call(this,e)},e.kind=f.MmlMenclose.prototype.kind,e.styles={"mjx-menclose":{position:"relative"},"mjx-menclose > mjx-dstrike":{display:"inline-block",left:0,top:0,position:"absolute","border-top":h.SOLID,"transform-origin":"top left"},"mjx-menclose > mjx-ustrike":{display:"inline-block",left:0,bottom:0,position:"absolute","border-top":h.SOLID,"transform-origin":"bottom left"},"mjx-menclose > mjx-hstrike":{"border-top":h.SOLID,position:"absolute",left:0,right:0,bottom:"50%",transform:"translateY("+(0,d.em)(h.THICKNESS/2)+")"},"mjx-menclose > mjx-vstrike":{"border-left":h.SOLID,position:"absolute",top:0,bottom:0,right:"50%",transform:"translateX("+(0,d.em)(h.THICKNESS/2)+")"},"mjx-menclose > mjx-rbox":{position:"absolute",top:0,bottom:0,right:0,left:0,border:h.SOLID,"border-radius":(0,d.em)(h.THICKNESS+h.PADDING)},"mjx-menclose > mjx-cbox":{position:"absolute",top:0,bottom:0,right:0,left:0,border:h.SOLID,"border-radius":"50%"},"mjx-menclose > mjx-arrow":{position:"absolute",left:0,bottom:"50%",height:0,width:0},"mjx-menclose > mjx-arrow > *":{display:"block",position:"absolute","transform-origin":"bottom","border-left":(0,d.em)(h.THICKNESS*h.ARROWX)+" solid","border-right":0,"box-sizing":"border-box"},"mjx-menclose > mjx-arrow > mjx-aline":{left:0,top:(0,d.em)(-h.THICKNESS/2),right:(0,d.em)(h.THICKNESS*(h.ARROWX-1)),height:0,"border-top":(0,d.em)(h.THICKNESS)+" solid","border-left":0},"mjx-menclose > mjx-arrow[double] > mjx-aline":{left:(0,d.em)(h.THICKNESS*(h.ARROWX-1)),height:0},"mjx-menclose > mjx-arrow > mjx-rthead":{transform:"skewX("+y+"rad)",right:0,bottom:"-1px","border-bottom":"1px solid transparent","border-top":(0,d.em)(h.THICKNESS*h.ARROWY)+" solid transparent"},"mjx-menclose > mjx-arrow > mjx-rbhead":{transform:"skewX(-"+y+"rad)","transform-origin":"top",right:0,top:"-1px","border-top":"1px solid transparent","border-bottom":(0,d.em)(h.THICKNESS*h.ARROWY)+" solid transparent"},"mjx-menclose > mjx-arrow > mjx-lthead":{transform:"skewX(-"+y+"rad)",left:0,bottom:"-1px","border-left":0,"border-right":(0,d.em)(h.THICKNESS*h.ARROWX)+" solid","border-bottom":"1px solid transparent","border-top":(0,d.em)(h.THICKNESS*h.ARROWY)+" solid transparent"},"mjx-menclose > mjx-arrow > mjx-lbhead":{transform:"skewX("+y+"rad)","transform-origin":"top",left:0,top:"-1px","border-left":0,"border-right":(0,d.em)(h.THICKNESS*h.ARROWX)+" solid","border-top":"1px solid transparent","border-bottom":(0,d.em)(h.THICKNESS*h.ARROWY)+" solid transparent"},"mjx-menclose > dbox":{position:"absolute",top:0,bottom:0,left:(0,d.em)(-1.5*h.PADDING),width:(0,d.em)(3*h.PADDING),border:(0,d.em)(h.THICKNESS)+" solid","border-radius":"50%","clip-path":"inset(0 0 0 "+(0,d.em)(1.5*h.PADDING)+")","box-sizing":"border-box"}},e.notations=new Map([h.Border("top"),h.Border("right"),h.Border("bottom"),h.Border("left"),h.Border2("actuarial","top","right"),h.Border2("madruwb","bottom","right"),h.DiagonalStrike("up",1),h.DiagonalStrike("down",-1),["horizontalstrike",{renderer:h.RenderElement("hstrike","Y"),bbox:function(t){return[0,t.padding,0,t.padding]}}],["verticalstrike",{renderer:h.RenderElement("vstrike","X"),bbox:function(t){return[t.padding,0,t.padding,0]}}],["box",{renderer:function(t,e){t.adaptor.setStyle(e,"border",t.em(t.thickness)+" solid")},bbox:h.fullBBox,border:h.fullBorder,remove:"left right top bottom"}],["roundedbox",{renderer:h.RenderElement("rbox"),bbox:h.fullBBox}],["circle",{renderer:h.RenderElement("cbox"),bbox:h.fullBBox}],["phasorangle",{renderer:function(t,e){var r=t.getBBox(),n=r.h,o=r.d,i=c(t.getArgMod(1.75*t.padding,n+o),2),s=i[0],a=i[1],l=t.thickness*Math.sin(s)*.9;t.adaptor.setStyle(e,"border-bottom",t.em(t.thickness)+" solid");var u=t.adjustBorder(t.html("mjx-ustrike",{style:{width:t.em(a),transform:"translateX("+t.em(l)+") rotate("+t.fixed(-s)+"rad)"}}));t.adaptor.append(t.chtml,u)},bbox:function(t){var e=t.padding/2,r=t.thickness;return[2*e,e,e+r,3*e+r]},border:function(t){return[0,0,t.thickness,0]},remove:"bottom"}],h.Arrow("up"),h.Arrow("down"),h.Arrow("left"),h.Arrow("right"),h.Arrow("updown"),h.Arrow("leftright"),h.DiagonalArrow("updiagonal"),h.DiagonalArrow("northeast"),h.DiagonalArrow("southeast"),h.DiagonalArrow("northwest"),h.DiagonalArrow("southwest"),h.DiagonalArrow("northeastsouthwest"),h.DiagonalArrow("northwestsoutheast"),["longdiv",{renderer:function(t,e){var r=t.adaptor;r.setStyle(e,"border-top",t.em(t.thickness)+" solid");var n=r.append(t.chtml,t.html("dbox")),o=t.thickness,i=t.padding;o!==h.THICKNESS&&r.setStyle(n,"border-width",t.em(o)),i!==h.PADDING&&(r.setStyle(n,"left",t.em(-1.5*i)),r.setStyle(n,"width",t.em(3*i)),r.setStyle(n,"clip-path","inset(0 0 0 "+t.em(1.5*i)+")"))},bbox:function(t){var e=t.padding,r=t.thickness;return[e+r,e,e,2*e+r/2]}}],["radical",{renderer:function(t,e){t.msqrt.toCHTML(e);var r=t.sqrtTRBL();t.adaptor.setStyle(t.msqrt.chtml,"margin",r.map((function(e){return t.em(-e)})).join(" "))},init:function(t){t.msqrt=t.createMsqrt(t.childNodes[0])},bbox:function(t){return t.sqrtTRBL()},renderChild:!0}]]),e}((0,p.CommonMencloseMixin)(u.CHTMLWrapper));e.CHTMLmenclose=g},2275:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmfenced=void 0;var i=r(5355),s=r(7555),a=r(5410),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);this.mrow.toCHTML(e)},e.kind=a.MmlMfenced.prototype.kind,e}((0,s.CommonMfencedMixin)(i.CHTMLWrapper));e.CHTMLmfenced=l},9063:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmfrac=void 0;var s=r(5355),a=r(2688),l=r(6850),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){this.standardCHTMLnode(t);var e=this.node.attributes.getList("linethickness","bevelled"),r=e.linethickness,n=e.bevelled,o=this.isDisplay();if(n)this.makeBevelled(o);else{var i=this.length2em(String(r),.06);0===i?this.makeAtop(o):this.makeFraction(o,i)}},e.prototype.makeFraction=function(t,e){var r,n,o=this.node.attributes.getList("numalign","denomalign"),s=o.numalign,a=o.denomalign,l=t?{type:"d"}:{},c=this.node.getProperty("withDelims")?i(i({},l),{delims:"true"}):i({},l),u="center"!==s?{align:s}:{},p="center"!==a?{align:a}:{},h=i({},l),f=i({},l),d=this.font.params;if(.06!==e){var m=d.axis_height,y=this.em(e),g=this.getTUV(t,e),b=g.T,v=g.u,_=g.v,S=(t?this.em(3*e):y)+" -.1em";l.style={height:y,"border-top":y+" solid",margin:S};var O=this.em(Math.max(0,v));f.style={height:O,"vertical-align":"-"+O},h.style={height:this.em(Math.max(0,_))},c.style={"vertical-align":this.em(m-b)}}this.adaptor.append(this.chtml,this.html("mjx-frac",c,[r=this.html("mjx-num",u,[this.html("mjx-nstrut",f)]),this.html("mjx-dbox",{},[this.html("mjx-dtable",{},[this.html("mjx-line",l),this.html("mjx-row",{},[n=this.html("mjx-den",p,[this.html("mjx-dstrut",h)])])])])])),this.childNodes[0].toCHTML(r),this.childNodes[1].toCHTML(n)},e.prototype.makeAtop=function(t){var e,r,n=this.node.attributes.getList("numalign","denomalign"),o=n.numalign,s=n.denomalign,a=t?{type:"d",atop:!0}:{atop:!0},l=this.node.getProperty("withDelims")?i(i({},a),{delims:!0}):i({},a),c="center"!==o?{align:o}:{},u="center"!==s?{align:s}:{},p=this.getUVQ(t),h=p.v,f=p.q;c.style={"padding-bottom":this.em(f)},l.style={"vertical-align":this.em(-h)},this.adaptor.append(this.chtml,this.html("mjx-frac",l,[e=this.html("mjx-num",c),r=this.html("mjx-den",u)])),this.childNodes[0].toCHTML(e),this.childNodes[1].toCHTML(r)},e.prototype.makeBevelled=function(t){var e=this.adaptor;e.setAttribute(this.chtml,"bevelled","ture");var r=e.append(this.chtml,this.html("mjx-num"));this.childNodes[0].toCHTML(r),this.bevel.toCHTML(this.chtml);var n=e.append(this.chtml,this.html("mjx-den"));this.childNodes[1].toCHTML(n);var o=this.getBevelData(t),i=o.u,s=o.v,a=o.delta,l=o.nbox,c=o.dbox;i&&e.setStyle(r,"verticalAlign",this.em(i/l.scale)),s&&e.setStyle(n,"verticalAlign",this.em(s/c.scale));var u=this.em(-a/2);e.setStyle(this.bevel.chtml,"marginLeft",u),e.setStyle(this.bevel.chtml,"marginRight",u)},e.kind=l.MmlMfrac.prototype.kind,e.styles={"mjx-frac":{display:"inline-block","vertical-align":"0.17em",padding:"0 .22em"},'mjx-frac[type="d"]':{"vertical-align":".04em"},"mjx-frac[delims]":{padding:"0 .1em"},"mjx-frac[atop]":{padding:"0 .12em"},"mjx-frac[atop][delims]":{padding:"0"},"mjx-dtable":{display:"inline-table",width:"100%"},"mjx-dtable > *":{"font-size":"2000%"},"mjx-dbox":{display:"block","font-size":"5%"},"mjx-num":{display:"block","text-align":"center"},"mjx-den":{display:"block","text-align":"center"},"mjx-mfrac[bevelled] > mjx-num":{display:"inline-block"},"mjx-mfrac[bevelled] > mjx-den":{display:"inline-block"},'mjx-den[align="right"], mjx-num[align="right"]':{"text-align":"right"},'mjx-den[align="left"], mjx-num[align="left"]':{"text-align":"left"},"mjx-nstrut":{display:"inline-block",height:".054em",width:0,"vertical-align":"-.054em"},'mjx-nstrut[type="d"]':{height:".217em","vertical-align":"-.217em"},"mjx-dstrut":{display:"inline-block",height:".505em",width:0},'mjx-dstrut[type="d"]':{height:".726em"},"mjx-line":{display:"block","box-sizing":"border-box","min-height":"1px",height:".06em","border-top":".06em solid",margin:".06em -.1em",overflow:"hidden"},'mjx-line[type="d"]':{margin:".18em -.1em"}},e}((0,a.CommonMfracMixin)(s.CHTMLWrapper));e.CHTMLmfrac=c},6911:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmglyph=void 0;var i=r(5355),s=r(5636),a=r(3985),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);if(this.charWrapper)this.charWrapper.toCHTML(e);else{var r=this.node.attributes.getList("src","alt"),n=r.src,o=r.alt,i={width:this.em(this.width),height:this.em(this.height)};this.valign&&(i.verticalAlign=this.em(this.valign));var s=this.html("img",{src:n,style:i,alt:o,title:o});this.adaptor.append(e,s)}},e.kind=a.MmlMglyph.prototype.kind,e.styles={"mjx-mglyph > img":{display:"inline-block",border:0,padding:0}},e}((0,s.CommonMglyphMixin)(i.CHTMLWrapper));e.CHTMLmglyph=l},1653:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmi=void 0;var i=r(5355),s=r(5723),a=r(450),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=a.MmlMi.prototype.kind,e}((0,s.CommonMiMixin)(i.CHTMLWrapper));e.CHTMLmi=l},6781:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmmultiscripts=void 0;var s=r(4300),a=r(8009),l=r(6405),c=r(505),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t),r=this.scriptData,n=this.node.getProperty("scriptalign")||"right left",o=i((0,c.split)(n+" "+n),2),s=o[0],a=o[1],l=this.combinePrePost(r.sub,r.psub),u=this.combinePrePost(r.sup,r.psup),p=i(this.getUVQ(l,u),2),h=p[0],f=p[1];if(r.numPrescripts){var d=this.addScripts(h,-f,!0,r.psub,r.psup,this.firstPrescript,r.numPrescripts);"right"!==s&&this.adaptor.setAttribute(d,"script-align",s)}if(this.childNodes[0].toCHTML(e),r.numScripts){d=this.addScripts(h,-f,!1,r.sub,r.sup,1,r.numScripts);"left"!==a&&this.adaptor.setAttribute(d,"script-align",a)}},e.prototype.addScripts=function(t,e,r,n,o,i,s){for(var a=this.adaptor,l=t-o.d+(e-n.h),c=t<0&&0===e?n.h+t:t,u=l>0?{style:{height:this.em(l)}}:{},p=c?{style:{"vertical-align":this.em(c)}}:{},h=this.html("mjx-row"),f=this.html("mjx-row",u),d=this.html("mjx-row"),m="mjx-"+(r?"pre":"")+"scripts",y=i+2*s;i<y;)this.childNodes[i++].toCHTML(a.append(d,this.html("mjx-cell"))),this.childNodes[i++].toCHTML(a.append(h,this.html("mjx-cell")));return a.append(this.chtml,this.html(m,p,[h,f,d]))},e.kind=l.MmlMmultiscripts.prototype.kind,e.styles={"mjx-prescripts":{display:"inline-table","padding-left":".05em"},"mjx-scripts":{display:"inline-table","padding-right":".05em"},"mjx-prescripts > mjx-row > mjx-cell":{"text-align":"right"},'[script-align="left"] > mjx-row > mjx-cell':{"text-align":"left"},'[script-align="center"] > mjx-row > mjx-cell':{"text-align":"center"},'[script-align="right"] > mjx-row > mjx-cell':{"text-align":"right"}},e}((0,a.CommonMmultiscriptsMixin)(s.CHTMLmsubsup));e.CHTMLmmultiscripts=u},6460:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmn=void 0;var i=r(5355),s=r(5023),a=r(3050),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=a.MmlMn.prototype.kind,e}((0,s.CommonMnMixin)(i.CHTMLWrapper));e.CHTMLmn=l},6287:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmo=void 0;var s=r(5355),a=r(7096),l=r(2756),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r,n=this.node.attributes,o=n.get("symmetric")&&2!==this.stretch.dir,s=0!==this.stretch.dir;s&&null===this.size&&this.getStretchedVariant([]);var a=this.standardCHTMLnode(t);if(s&&this.size<0)this.stretchHTML(a);else{if(o||n.get("largeop")){var l=this.em(this.getCenterOffset());"0"!==l&&this.adaptor.setStyle(a,"verticalAlign",l)}this.node.getProperty("mathaccent")&&(this.adaptor.setStyle(a,"width","0"),this.adaptor.setStyle(a,"margin-left",this.em(this.getAccentOffset())));try{for(var c=i(this.childNodes),u=c.next();!u.done;u=c.next()){u.value.toCHTML(a)}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}}},e.prototype.stretchHTML=function(t){var e=this.getText().codePointAt(0);this.font.delimUsage.add(e),this.childNodes[0].markUsed();var r=this.stretch,n=r.stretch,o=[];n[0]&&o.push(this.html("mjx-beg",{},[this.html("mjx-c")])),o.push(this.html("mjx-ext",{},[this.html("mjx-c")])),4===n.length&&o.push(this.html("mjx-mid",{},[this.html("mjx-c")]),this.html("mjx-ext",{},[this.html("mjx-c")])),n[2]&&o.push(this.html("mjx-end",{},[this.html("mjx-c")]));var i={},s=this.bbox,l=s.h,c=s.d,u=s.w;1===r.dir?(o.push(this.html("mjx-mark")),i.height=this.em(l+c),i.verticalAlign=this.em(-c)):i.width=this.em(u);var p=a.DirectionVH[r.dir],h={class:this.char(r.c||e),style:i},f=this.html("mjx-stretchy-"+p,h,o);this.adaptor.append(t,f)},e.kind=l.MmlMo.prototype.kind,e.styles={"mjx-stretchy-h":{display:"inline-table",width:"100%"},"mjx-stretchy-h > *":{display:"table-cell",width:0},"mjx-stretchy-h > * > mjx-c":{display:"inline-block",transform:"scalex(1.0000001)"},"mjx-stretchy-h > * > mjx-c::before":{display:"inline-block",width:"initial"},"mjx-stretchy-h > mjx-ext":{"/* IE */ overflow":"hidden","/* others */ overflow":"clip visible",width:"100%"},"mjx-stretchy-h > mjx-ext > mjx-c::before":{transform:"scalex(500)"},"mjx-stretchy-h > mjx-ext > mjx-c":{width:0},"mjx-stretchy-h > mjx-beg > mjx-c":{"margin-right":"-.1em"},"mjx-stretchy-h > mjx-end > mjx-c":{"margin-left":"-.1em"},"mjx-stretchy-v":{display:"inline-block"},"mjx-stretchy-v > *":{display:"block"},"mjx-stretchy-v > mjx-beg":{height:0},"mjx-stretchy-v > mjx-end > mjx-c":{display:"block"},"mjx-stretchy-v > * > mjx-c":{transform:"scaley(1.0000001)","transform-origin":"left center",overflow:"hidden"},"mjx-stretchy-v > mjx-ext":{display:"block",height:"100%","box-sizing":"border-box",border:"0px solid transparent","/* IE */ overflow":"hidden","/* others */ overflow":"visible clip"},"mjx-stretchy-v > mjx-ext > mjx-c::before":{width:"initial","box-sizing":"border-box"},"mjx-stretchy-v > mjx-ext > mjx-c":{transform:"scaleY(500) translateY(.075em)",overflow:"visible"},"mjx-mark":{display:"inline-block",height:"0px"}},e}((0,a.CommonMoMixin)(s.CHTMLWrapper));e.CHTMLmo=c},5964:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmpadded=void 0;var a=r(5355),l=r(6898),c=r(7238),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r,n=this.standardCHTMLnode(t),o=[],a={},l=i(this.getDimens(),9),c=l[2],u=l[3],p=l[4],h=l[5],f=l[6],d=l[7],m=l[8];if(h&&(a.width=this.em(c+h)),(u||p)&&(a.margin=this.em(u)+" 0 "+this.em(p)),f+m||d){a.position="relative";var y=this.html("mjx-rbox",{style:{left:this.em(f+m),top:this.em(-d),"max-width":a.width}});f+m&&this.childNodes[0].getBBox().pwidth&&(this.adaptor.setAttribute(y,"width","full"),this.adaptor.setStyle(y,"left",this.em(f))),o.push(y)}n=this.adaptor.append(n,this.html("mjx-block",{style:a},o));try{for(var g=s(this.childNodes),b=g.next();!b.done;b=g.next()){b.value.toCHTML(o[0]||n)}}catch(t){e={error:t}}finally{try{b&&!b.done&&(r=g.return)&&r.call(g)}finally{if(e)throw e.error}}},e.kind=c.MmlMpadded.prototype.kind,e.styles={"mjx-mpadded":{display:"inline-block"},"mjx-rbox":{display:"inline-block",position:"relative"}},e}((0,l.CommonMpaddedMixin)(a.CHTMLWrapper));e.CHTMLmpadded=u},8776:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmroot=void 0;var s=r(5610),a=r(6991),l=r(6145),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addRoot=function(t,e,r,n){e.toCHTML(t);var o=i(this.getRootDimens(r,n),3),s=o[0],a=o[1],l=o[2];this.adaptor.setStyle(t,"verticalAlign",this.em(a)),this.adaptor.setStyle(t,"width",this.em(s)),l&&this.adaptor.setStyle(this.adaptor.firstChild(t),"paddingLeft",this.em(l))},e.kind=l.MmlMroot.prototype.kind,e}((0,a.CommonMrootMixin)(s.CHTMLmsqrt));e.CHTMLmroot=c},4798:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLinferredMrow=e.CHTMLmrow=void 0;var s=r(5355),a=r(8411),l=r(8411),c=r(9878),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r,n=this.node.isInferred?this.chtml=t:this.standardCHTMLnode(t),o=!1;try{for(var s=i(this.childNodes),a=s.next();!a.done;a=s.next()){var l=a.value;l.toCHTML(n),l.bbox.w<0&&(o=!0)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}if(o){var c=this.getBBox().w;c&&(this.adaptor.setStyle(n,"width",this.em(Math.max(0,c))),c<0&&this.adaptor.setStyle(n,"marginRight",this.em(c)))}},e.kind=c.MmlMrow.prototype.kind,e}((0,a.CommonMrowMixin)(s.CHTMLWrapper));e.CHTMLmrow=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=c.MmlInferredMrow.prototype.kind,e}((0,l.CommonInferredMrowMixin)(u));e.CHTMLinferredMrow=p},4597:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLms=void 0;var i=r(5355),s=r(4126),a=r(7265),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=a.MmlMs.prototype.kind,e}((0,s.CommonMsMixin)(i.CHTMLWrapper));e.CHTMLms=l},2970:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmspace=void 0;var i=r(5355),s=r(258),a=r(6030),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t),r=this.getBBox(),n=r.w,o=r.h,i=r.d;n<0&&(this.adaptor.setStyle(e,"marginRight",this.em(n)),n=0),n&&this.adaptor.setStyle(e,"width",this.em(n)),(o=Math.max(0,o+i))&&this.adaptor.setStyle(e,"height",this.em(Math.max(0,o))),i&&this.adaptor.setStyle(e,"verticalAlign",this.em(-i))},e.kind=a.MmlMspace.prototype.kind,e}((0,s.CommonMspaceMixin)(i.CHTMLWrapper));e.CHTMLmspace=l},5610:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmsqrt=void 0;var s=r(5355),a=r(4093),l=r(7131),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r,n,o,s=this.childNodes[this.surd],a=this.childNodes[this.base],l=s.getBBox(),c=a.getOuterBBox(),u=i(this.getPQ(l),2)[1],p=this.font.params.rule_thickness,h=c.h+u+p,f=this.standardCHTMLnode(t);null!=this.root&&(n=this.adaptor.append(f,this.html("mjx-root")),o=this.childNodes[this.root]);var d=this.adaptor.append(f,this.html("mjx-sqrt",{},[e=this.html("mjx-surd"),r=this.html("mjx-box",{style:{paddingTop:this.em(u)}})]));this.addRoot(n,o,l,h),s.toCHTML(e),a.toCHTML(r),s.size<0&&this.adaptor.addClass(d,"mjx-tall")},e.prototype.addRoot=function(t,e,r,n){},e.kind=l.MmlMsqrt.prototype.kind,e.styles={"mjx-root":{display:"inline-block","white-space":"nowrap"},"mjx-surd":{display:"inline-block","vertical-align":"top"},"mjx-sqrt":{display:"inline-block","padding-top":".07em"},"mjx-sqrt > mjx-box":{"border-top":".07em solid"},"mjx-sqrt.mjx-tall > mjx-box":{"padding-left":".3em","margin-left":"-.3em"}},e}((0,a.CommonMsqrtMixin)(s.CHTMLWrapper));e.CHTMLmsqrt=c},4300:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmsubsup=e.CHTMLmsup=e.CHTMLmsub=void 0;var s=r(8650),a=r(905),l=r(905),c=r(905),u=r(4461),p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=u.MmlMsub.prototype.kind,e}((0,a.CommonMsubMixin)(s.CHTMLscriptbase));e.CHTMLmsub=p;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=u.MmlMsup.prototype.kind,e}((0,l.CommonMsupMixin)(s.CHTMLscriptbase));e.CHTMLmsup=h;var f=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.adaptor,r=this.standardCHTMLnode(t),n=i([this.baseChild,this.supChild,this.subChild],3),o=n[0],s=n[1],a=n[2],l=i(this.getUVQ(),3),c=l[1],u=l[2],p={"vertical-align":this.em(c)};o.toCHTML(r);var h=e.append(r,this.html("mjx-script",{style:p}));s.toCHTML(h),e.append(h,this.html("mjx-spacer",{style:{"margin-top":this.em(u)}})),a.toCHTML(h);var f=this.getAdjustedIc();f&&e.setStyle(s.chtml,"marginLeft",this.em(f/s.bbox.rscale)),this.baseRemoveIc&&e.setStyle(h,"marginLeft",this.em(-this.baseIc))},e.kind=u.MmlMsubsup.prototype.kind,e.styles={"mjx-script":{display:"inline-block","padding-right":".05em","padding-left":".033em"},"mjx-script > mjx-spacer":{display:"block"}},e}((0,c.CommonMsubsupMixin)(s.CHTMLscriptbase));e.CHTMLmsubsup=f},8002:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmtable=void 0;var a=r(5355),l=r(6237),c=r(1349),u=r(505),p=function(t){function e(e,r,n){void 0===n&&(n=null);var o=t.call(this,e,r,n)||this;return o.itable=o.html("mjx-itable"),o.labels=o.html("mjx-itable"),o}return o(e,t),e.prototype.getAlignShift=function(){var e=t.prototype.getAlignShift.call(this);return this.isTop||(e[1]=0),e},e.prototype.toCHTML=function(t){var e,r,n=this.standardCHTMLnode(t);this.adaptor.append(n,this.html("mjx-table",{},[this.itable]));try{for(var o=i(this.childNodes),s=o.next();!s.done;s=o.next()){s.value.toCHTML(this.itable)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}this.padRows(),this.handleColumnSpacing(),this.handleColumnLines(),this.handleColumnWidths(),this.handleRowSpacing(),this.handleRowLines(),this.handleRowHeights(),this.handleFrame(),this.handleWidth(),this.handleLabels(),this.handleAlign(),this.handleJustify(),this.shiftColor()},e.prototype.shiftColor=function(){var t=this.adaptor,e=t.getStyle(this.chtml,"backgroundColor");e&&(t.setStyle(this.chtml,"backgroundColor",""),t.setStyle(this.itable,"backgroundColor",e))},e.prototype.padRows=function(){var t,e,r=this.adaptor;try{for(var n=i(r.childNodes(this.itable)),o=n.next();!o.done;o=n.next())for(var s=o.value;r.childNodes(s).length<this.numCols;)r.append(s,this.html("mjx-mtd",{extra:!0}))}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.handleColumnSpacing=function(){var t,e,r,n,o=this.childNodes[0]?1/this.childNodes[0].getBBox().rscale:1,s=this.getEmHalfSpacing(this.fSpace[0],this.cSpace,o),a=this.frame;try{for(var l=i(this.tableRows),c=l.next();!c.done;c=l.next()){var u=c.value,p=0;try{for(var h=(r=void 0,i(u.tableCells)),f=h.next();!f.done;f=h.next()){var d=f.value,m=s[p++],y=s[p],g=d?d.chtml:this.adaptor.childNodes(u.chtml)[p];(p>1&&"0.4em"!==m||a&&1===p)&&this.adaptor.setStyle(g,"paddingLeft",m),(p<this.numCols&&"0.4em"!==y||a&&p===this.numCols)&&this.adaptor.setStyle(g,"paddingRight",y)}}catch(t){r={error:t}}finally{try{f&&!f.done&&(n=h.return)&&n.call(h)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}},e.prototype.handleColumnLines=function(){var t,e,r,n;if("none"!==this.node.attributes.get("columnlines")){var o=this.getColumnAttributes("columnlines");try{for(var s=i(this.childNodes),a=s.next();!a.done;a=s.next()){var l=a.value,c=0;try{for(var u=(r=void 0,i(this.adaptor.childNodes(l.chtml).slice(1))),p=u.next();!p.done;p=u.next()){var h=p.value,f=o[c++];"none"!==f&&this.adaptor.setStyle(h,"borderLeft",".07em "+f)}}catch(t){r={error:t}}finally{try{p&&!p.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=s.return)&&e.call(s)}finally{if(t)throw t.error}}}},e.prototype.handleColumnWidths=function(){var t,e,r,n;try{for(var o=i(this.childNodes),s=o.next();!s.done;s=o.next()){var a=s.value,l=0;try{for(var c=(r=void 0,i(this.adaptor.childNodes(a.chtml))),u=c.next();!u.done;u=c.next()){var p=u.value,h=this.cWidths[l++];if(null!==h){var f="number"==typeof h?this.em(h):h;this.adaptor.setStyle(p,"width",f),this.adaptor.setStyle(p,"maxWidth",f),this.adaptor.setStyle(p,"minWidth",f)}}}catch(t){r={error:t}}finally{try{u&&!u.done&&(n=c.return)&&n.call(c)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{s&&!s.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}},e.prototype.handleRowSpacing=function(){var t,e,r,n,o=this.childNodes[0]?1/this.childNodes[0].getBBox().rscale:1,s=this.getEmHalfSpacing(this.fSpace[1],this.rSpace,o),a=this.frame,l=0;try{for(var c=i(this.childNodes),u=c.next();!u.done;u=c.next()){var p=u.value,h=s[l++],f=s[l];try{for(var d=(r=void 0,i(p.childNodes)),m=d.next();!m.done;m=d.next()){var y=m.value;(l>1&&"0.215em"!==h||a&&1===l)&&this.adaptor.setStyle(y.chtml,"paddingTop",h),(l<this.numRows&&"0.215em"!==f||a&&l===this.numRows)&&this.adaptor.setStyle(y.chtml,"paddingBottom",f)}}catch(t){r={error:t}}finally{try{m&&!m.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{u&&!u.done&&(e=c.return)&&e.call(c)}finally{if(t)throw t.error}}},e.prototype.handleRowLines=function(){var t,e,r,n;if("none"!==this.node.attributes.get("rowlines")){var o=this.getRowAttributes("rowlines"),s=0;try{for(var a=i(this.childNodes.slice(1)),l=a.next();!l.done;l=a.next()){var c=l.value,u=o[s++];if("none"!==u)try{for(var p=(r=void 0,i(this.adaptor.childNodes(c.chtml))),h=p.next();!h.done;h=p.next()){var f=h.value;this.adaptor.setStyle(f,"borderTop",".07em "+u)}}catch(t){r={error:t}}finally{try{h&&!h.done&&(n=p.return)&&n.call(p)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{l&&!l.done&&(e=a.return)&&e.call(a)}finally{if(t)throw t.error}}}},e.prototype.handleRowHeights=function(){this.node.attributes.get("equalrows")&&this.handleEqualRows()},e.prototype.handleEqualRows=function(){for(var t=this.getRowHalfSpacing(),e=this.getTableData(),r=e.H,n=e.D,o=e.NH,i=e.ND,s=this.getEqualRowHeight(),a=0;a<this.numRows;a++){var l=this.childNodes[a];this.setRowHeight(l,s+t[a]+t[a+1]+this.rLines[a]),s!==o[a]+i[a]&&this.setRowBaseline(l,s,(s-r[a]+n[a])/2)}},e.prototype.setRowHeight=function(t,e){this.adaptor.setStyle(t.chtml,"height",this.em(e))},e.prototype.setRowBaseline=function(t,e,r){var n,o,s=t.node.attributes.get("rowalign");try{for(var a=i(t.childNodes),l=a.next();!l.done;l=a.next()){var c=l.value;if(this.setCellBaseline(c,s,e,r))break}}catch(t){n={error:t}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}},e.prototype.setCellBaseline=function(t,e,r,n){var o=t.node.attributes.get("rowalign");if("baseline"===o||"axis"===o){var i=this.adaptor,s=i.lastChild(t.chtml);i.setStyle(s,"height",this.em(r)),i.setStyle(s,"verticalAlign",this.em(-n));var a=t.parent;if(!(a.node.isKind("mlabeledtr")&&t===a.childNodes[0]||"baseline"!==e&&"axis"!==e))return!0}return!1},e.prototype.handleFrame=function(){this.frame&&this.fLine&&this.adaptor.setStyle(this.itable,"border",".07em "+this.node.attributes.get("frame"))},e.prototype.handleWidth=function(){var t=this.adaptor,e=this.getBBox(),r=e.w,n=e.L,o=e.R;t.setStyle(this.chtml,"minWidth",this.em(n+r+o));var i=this.node.attributes.get("width");if((0,u.isPercent)(i))t.setStyle(this.chtml,"width",""),t.setAttribute(this.chtml,"width","full");else if(!this.hasLabels){if("auto"===i)return;i=this.em(this.length2em(i)+2*this.fLine)}var s=t.firstChild(this.chtml);if(t.setStyle(s,"width",i),t.setStyle(s,"minWidth",this.em(r)),n||o){t.setStyle(this.chtml,"margin","");var a=this.node.attributes.get("data-width-includes-label")?"padding":"margin";n===o?t.setStyle(s,a,"0 "+this.em(o)):t.setStyle(s,a,"0 "+this.em(o)+" 0 "+this.em(n))}t.setAttribute(this.itable,"width","full")},e.prototype.handleAlign=function(){var t=s(this.getAlignmentRow(),2),e=t[0],r=t[1];if(null===r)"axis"!==e&&this.adaptor.setAttribute(this.chtml,"align",e);else{var n=this.getVerticalPosition(r,e);this.adaptor.setAttribute(this.chtml,"align","top"),this.adaptor.setStyle(this.chtml,"verticalAlign",this.em(n))}},e.prototype.handleJustify=function(){var t=this.getAlignShift()[0];"center"!==t&&this.adaptor.setAttribute(this.chtml,"justify",t)},e.prototype.handleLabels=function(){if(this.hasLabels){var t=this.labels,e=this.node.attributes,r=this.adaptor,n=e.get("side");r.setAttribute(this.chtml,"side",n),r.setAttribute(t,"align",n),r.setStyle(t,n,"0");var o=s(this.addLabelPadding(n),2),i=o[0],a=o[1];if(a){var l=r.firstChild(this.chtml);this.setIndent(l,i,a)}this.updateRowHeights(),this.addLabelSpacing()}},e.prototype.addLabelPadding=function(t){var e=s(this.getPadAlignShift(t),3),r=e[1],n=e[2],o={};if("right"===t&&!this.node.attributes.get("data-width-includes-label")){var i=this.node.attributes.get("width"),a=this.getBBox(),l=a.w,c=a.L,p=a.R;o.style={width:(0,u.isPercent)(i)?"calc("+i+" + "+this.em(c+p)+")":this.em(c+l+p)}}return this.adaptor.append(this.chtml,this.html("mjx-labels",o,[this.labels])),[r,n]},e.prototype.updateRowHeights=function(){for(var t=this.getTableData(),e=t.H,r=t.D,n=t.NH,o=t.ND,i=this.getRowHalfSpacing(),s=0;s<this.numRows;s++){var a=this.childNodes[s];this.setRowHeight(a,e[s]+r[s]+i[s]+i[s+1]+this.rLines[s]),e[s]!==n[s]||r[s]!==o[s]?this.setRowBaseline(a,e[s]+r[s],r[s]):a.node.isKind("mlabeledtr")&&this.setCellBaseline(a.childNodes[0],"",e[s]+r[s],r[s])}},e.prototype.addLabelSpacing=function(){for(var t=this.adaptor,e=this.node.attributes.get("equalrows"),r=this.getTableData(),n=r.H,o=r.D,i=e?this.getEqualRowHeight():0,s=this.getRowHalfSpacing(),a=this.fLine,l=t.firstChild(this.labels),c=0;c<this.numRows;c++){this.childNodes[c].node.isKind("mlabeledtr")?(a&&t.insert(this.html("mjx-mtr",{style:{height:this.em(a)}}),l),t.setStyle(l,"height",this.em((e?i:n[c]+o[c])+s[c]+s[c+1])),l=t.next(l),a=this.rLines[c]):a+=s[c]+(e?i:n[c]+o[c])+s[c+1]+this.rLines[c]}},e.kind=c.MmlMtable.prototype.kind,e.styles={"mjx-mtable":{"vertical-align":".25em","text-align":"center",position:"relative","box-sizing":"border-box","border-spacing":0,"border-collapse":"collapse"},'mjx-mstyle[size="s"] mjx-mtable':{"vertical-align":".354em"},"mjx-labels":{position:"absolute",left:0,top:0},"mjx-table":{display:"inline-block","vertical-align":"-.5ex","box-sizing":"border-box"},"mjx-table > mjx-itable":{"vertical-align":"middle","text-align":"left","box-sizing":"border-box"},"mjx-labels > mjx-itable":{position:"absolute",top:0},'mjx-mtable[justify="left"]':{"text-align":"left"},'mjx-mtable[justify="right"]':{"text-align":"right"},'mjx-mtable[justify="left"][side="left"]':{"padding-right":"0 ! important"},'mjx-mtable[justify="left"][side="right"]':{"padding-left":"0 ! important"},'mjx-mtable[justify="right"][side="left"]':{"padding-right":"0 ! important"},'mjx-mtable[justify="right"][side="right"]':{"padding-left":"0 ! important"},"mjx-mtable[align]":{"vertical-align":"baseline"},'mjx-mtable[align="top"] > mjx-table':{"vertical-align":"top"},'mjx-mtable[align="bottom"] > mjx-table':{"vertical-align":"bottom"},'mjx-mtable[side="right"] mjx-labels':{"min-width":"100%"}},e}((0,l.CommonMtableMixin)(a.CHTMLWrapper));e.CHTMLmtable=p},7056:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmtd=void 0;var i=r(5355),s=r(5164),a=r(4359),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.node.attributes.get("rowalign"),n=this.node.attributes.get("columnalign");r!==this.parent.node.attributes.get("rowalign")&&this.adaptor.setAttribute(this.chtml,"rowalign",r),"center"===n||"mlabeledtr"===this.parent.kind&&this===this.parent.childNodes[0]&&n===this.parent.parent.node.attributes.get("side")||this.adaptor.setStyle(this.chtml,"textAlign",n),this.parent.parent.node.getProperty("useHeight")&&this.adaptor.append(this.chtml,this.html("mjx-tstrut"))},e.kind=a.MmlMtd.prototype.kind,e.styles={"mjx-mtd":{display:"table-cell","text-align":"center",padding:".215em .4em"},"mjx-mtd:first-child":{"padding-left":0},"mjx-mtd:last-child":{"padding-right":0},"mjx-mtable > * > mjx-itable > *:first-child > mjx-mtd":{"padding-top":0},"mjx-mtable > * > mjx-itable > *:last-child > mjx-mtd":{"padding-bottom":0},"mjx-tstrut":{display:"inline-block",height:"1em","vertical-align":"-.25em"},'mjx-labels[align="left"] > mjx-mtr > mjx-mtd':{"text-align":"left"},'mjx-labels[align="right"] > mjx-mtr > mjx-mtd':{"text-align":"right"},"mjx-mtd[extra]":{padding:0},'mjx-mtd[rowalign="top"]':{"vertical-align":"top"},'mjx-mtd[rowalign="center"]':{"vertical-align":"middle"},'mjx-mtd[rowalign="bottom"]':{"vertical-align":"bottom"},'mjx-mtd[rowalign="baseline"]':{"vertical-align":"baseline"},'mjx-mtd[rowalign="axis"]':{"vertical-align":".25em"}},e}((0,s.CommonMtdMixin)(i.CHTMLWrapper));e.CHTMLmtd=l},1259:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmtext=void 0;var i=r(5355),s=r(6319),a=r(4770),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=a.MmlMtext.prototype.kind,e}((0,s.CommonMtextMixin)(i.CHTMLWrapper));e.CHTMLmtext=l},3571:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmlabeledtr=e.CHTMLmtr=void 0;var i=r(5355),s=r(5766),a=r(5766),l=r(5022),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.node.attributes.get("rowalign");"baseline"!==r&&this.adaptor.setAttribute(this.chtml,"rowalign",r)},e.kind=l.MmlMtr.prototype.kind,e.styles={"mjx-mtr":{display:"table-row"},'mjx-mtr[rowalign="top"] > mjx-mtd':{"vertical-align":"top"},'mjx-mtr[rowalign="center"] > mjx-mtd':{"vertical-align":"middle"},'mjx-mtr[rowalign="bottom"] > mjx-mtd':{"vertical-align":"bottom"},'mjx-mtr[rowalign="baseline"] > mjx-mtd':{"vertical-align":"baseline"},'mjx-mtr[rowalign="axis"] > mjx-mtd':{"vertical-align":".25em"}},e}((0,s.CommonMtrMixin)(i.CHTMLWrapper));e.CHTMLmtr=c;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.adaptor.firstChild(this.chtml);if(r){this.adaptor.remove(r);var n=this.node.attributes.get("rowalign"),o="baseline"!==n&&"axis"!==n?{rowalign:n}:{},i=this.html("mjx-mtr",o,[r]);this.adaptor.append(this.parent.labels,i)}},e.prototype.markUsed=function(){t.prototype.markUsed.call(this),this.jax.wrapperUsage.add(c.kind)},e.kind=l.MmlMlabeledtr.prototype.kind,e.styles={"mjx-mlabeledtr":{display:"table-row"},'mjx-mlabeledtr[rowalign="top"] > mjx-mtd':{"vertical-align":"top"},'mjx-mlabeledtr[rowalign="center"] > mjx-mtd':{"vertical-align":"middle"},'mjx-mlabeledtr[rowalign="bottom"] > mjx-mtd':{"vertical-align":"bottom"},'mjx-mlabeledtr[rowalign="baseline"] > mjx-mtd':{"vertical-align":"baseline"},'mjx-mlabeledtr[rowalign="axis"] > mjx-mtd':{"vertical-align":".25em"}},e}((0,a.CommonMlabeledtrMixin)(c));e.CHTMLmlabeledtr=u},6590:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmunderover=e.CHTMLmover=e.CHTMLmunder=void 0;var i=r(4300),s=r(1971),a=r(1971),l=r(1971),c=r(5184),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){if(this.hasMovableLimits())return t.prototype.toCHTML.call(this,e),void this.adaptor.setAttribute(this.chtml,"limits","false");this.chtml=this.standardCHTMLnode(e);var r=this.adaptor.append(this.adaptor.append(this.chtml,this.html("mjx-row")),this.html("mjx-base")),n=this.adaptor.append(this.adaptor.append(this.chtml,this.html("mjx-row")),this.html("mjx-under"));this.baseChild.toCHTML(r),this.scriptChild.toCHTML(n);var o=this.baseChild.getOuterBBox(),i=this.scriptChild.getOuterBBox(),s=this.getUnderKV(o,i)[0],a=this.isLineBelow?0:this.getDelta(!0);this.adaptor.setStyle(n,"paddingTop",this.em(s)),this.setDeltaW([r,n],this.getDeltaW([o,i],[0,-a])),this.adjustUnderDepth(n,i)},e.kind=c.MmlMunder.prototype.kind,e.styles={"mjx-over":{"text-align":"left"},'mjx-munder:not([limits="false"])':{display:"inline-table"},"mjx-munder > mjx-row":{"text-align":"left"},"mjx-under":{"padding-bottom":".1em"}},e}((0,s.CommonMunderMixin)(i.CHTMLmsub));e.CHTMLmunder=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){if(this.hasMovableLimits())return t.prototype.toCHTML.call(this,e),void this.adaptor.setAttribute(this.chtml,"limits","false");this.chtml=this.standardCHTMLnode(e);var r=this.adaptor.append(this.chtml,this.html("mjx-over")),n=this.adaptor.append(this.chtml,this.html("mjx-base"));this.scriptChild.toCHTML(r),this.baseChild.toCHTML(n);var o=this.scriptChild.getOuterBBox(),i=this.baseChild.getOuterBBox();this.adjustBaseHeight(n,i);var s=this.getOverKU(i,o)[0],a=this.isLineAbove?0:this.getDelta();this.adaptor.setStyle(r,"paddingBottom",this.em(s)),this.setDeltaW([n,r],this.getDeltaW([i,o],[0,a])),this.adjustOverDepth(r,o)},e.kind=c.MmlMover.prototype.kind,e.styles={'mjx-mover:not([limits="false"])':{"padding-top":".1em"},'mjx-mover:not([limits="false"]) > *':{display:"block","text-align":"left"}},e}((0,a.CommonMoverMixin)(i.CHTMLmsup));e.CHTMLmover=p;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){if(this.hasMovableLimits())return t.prototype.toCHTML.call(this,e),void this.adaptor.setAttribute(this.chtml,"limits","false");this.chtml=this.standardCHTMLnode(e);var r=this.adaptor.append(this.chtml,this.html("mjx-over")),n=this.adaptor.append(this.adaptor.append(this.chtml,this.html("mjx-box")),this.html("mjx-munder")),o=this.adaptor.append(this.adaptor.append(n,this.html("mjx-row")),this.html("mjx-base")),i=this.adaptor.append(this.adaptor.append(n,this.html("mjx-row")),this.html("mjx-under"));this.overChild.toCHTML(r),this.baseChild.toCHTML(o),this.underChild.toCHTML(i);var s=this.overChild.getOuterBBox(),a=this.baseChild.getOuterBBox(),l=this.underChild.getOuterBBox();this.adjustBaseHeight(o,a);var c=this.getOverKU(a,s)[0],u=this.getUnderKV(a,l)[0],p=this.getDelta();this.adaptor.setStyle(r,"paddingBottom",this.em(c)),this.adaptor.setStyle(i,"paddingTop",this.em(u)),this.setDeltaW([o,i,r],this.getDeltaW([a,l,s],[0,this.isLineBelow?0:-p,this.isLineAbove?0:p])),this.adjustOverDepth(r,s),this.adjustUnderDepth(i,l)},e.prototype.markUsed=function(){t.prototype.markUsed.call(this),this.jax.wrapperUsage.add(i.CHTMLmsubsup.kind)},e.kind=c.MmlMunderover.prototype.kind,e.styles={'mjx-munderover:not([limits="false"])':{"padding-top":".1em"},'mjx-munderover:not([limits="false"]) > *':{display:"block"}},e}((0,l.CommonMunderoverMixin)(i.CHTMLmsubsup));e.CHTMLmunderover=h},8650:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLscriptbase=void 0;var a=r(5355),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){this.chtml=this.standardCHTMLnode(t);var e=i(this.getOffset(),2),r=e[0],n=e[1],o=r-(this.baseRemoveIc?this.baseIc:0),s={"vertical-align":this.em(n)};o&&(s["margin-left"]=this.em(o)),this.baseChild.toCHTML(this.chtml),this.scriptChild.toCHTML(this.adaptor.append(this.chtml,this.html("mjx-script",{style:s})))},e.prototype.setDeltaW=function(t,e){for(var r=0;r<e.length;r++)e[r]&&this.adaptor.setStyle(t[r],"paddingLeft",this.em(e[r]))},e.prototype.adjustOverDepth=function(t,e){e.d>=0||this.adaptor.setStyle(t,"marginBottom",this.em(e.d*e.rscale))},e.prototype.adjustUnderDepth=function(t,e){var r,n;if(!(e.d>=0)){var o=this.adaptor,i=this.em(e.d),a=this.html("mjx-box",{style:{"margin-bottom":i,"vertical-align":i}});try{for(var l=s(o.childNodes(o.firstChild(t))),c=l.next();!c.done;c=l.next()){var u=c.value;o.append(a,u)}}catch(t){r={error:t}}finally{try{c&&!c.done&&(n=l.return)&&n.call(l)}finally{if(r)throw r.error}}o.append(o.firstChild(t),a)}},e.prototype.adjustBaseHeight=function(t,e){if(this.node.attributes.get("accent")){var r=this.font.params.x_height*e.scale;e.h<r&&(this.adaptor.setStyle(t,"paddingTop",this.em(r-e.h)),e.h=r)}},e.kind="scriptbase",e}((0,r(167).CommonScriptbaseMixin)(a.CHTMLWrapper));e.CHTMLscriptbase=l},421:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLxml=e.CHTMLannotationXML=e.CHTMLannotation=e.CHTMLsemantics=void 0;var i=r(5355),s=r(5806),a=r(9102),l=r(9007),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);this.childNodes.length&&this.childNodes[0].toCHTML(e)},e.kind=a.MmlSemantics.prototype.kind,e}((0,s.CommonSemanticsMixin)(i.CHTMLWrapper));e.CHTMLsemantics=c;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e)},e.prototype.computeBBox=function(){return this.bbox},e.kind=a.MmlAnnotation.prototype.kind,e}(i.CHTMLWrapper);e.CHTMLannotation=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=a.MmlAnnotationXML.prototype.kind,e.styles={"mjx-annotation-xml":{"font-family":"initial","line-height":"normal"}},e}(i.CHTMLWrapper);e.CHTMLannotationXML=p;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){this.chtml=this.adaptor.append(t,this.adaptor.clone(this.node.getXML()))},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.jax.measureXMLnode(this.node.getXML()),n=r.w,o=r.h,i=r.d;t.w=n,t.h=o,t.d=i},e.prototype.getStyles=function(){},e.prototype.getScale=function(){},e.prototype.getVariant=function(){},e.kind=l.XMLNode.prototype.kind,e.autoStyle=!1,e}(i.CHTMLWrapper);e.CHTMLxml=h},2760:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.TeXFont=void 0;var s=r(8042),a=r(5920),l=r(4005),c=r(1015),u=r(4515),p=r(6555),h=r(2183),f=r(3490),d=r(9056),m=r(3019),y=r(2713),g=r(7517),b=r(4182),v=r(2679),_=r(5469),S=r(7563),O=r(9409),M=r(775),x=r(9551),E=r(7907),A=r(9659),C=r(98),T=r(6275),N=r(6530),w=r(4409),L=r(5292),I=r(9124),P=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.defaultCssFamilyPrefix="MJXZERO",e.defaultVariantClasses={normal:"mjx-n",bold:"mjx-b",italic:"mjx-i","bold-italic":"mjx-b mjx-i","double-struck":"mjx-ds mjx-b",fraktur:"mjx-fr","bold-fraktur":"mjx-fr mjx-b",script:"mjx-sc mjx-i","bold-script":"mjx-sc mjx-b mjx-i","sans-serif":"mjx-ss","bold-sans-serif":"mjx-ss mjx-b","sans-serif-italic":"mjx-ss mjx-i","sans-serif-bold-italic":"mjx-ss mjx-b mjx-i",monospace:"mjx-ty","-smallop":"mjx-sop","-largeop":"mjx-lop","-size3":"mjx-s3","-size4":"mjx-s4","-tex-calligraphic":"mjx-cal mjx-i","-tex-bold-calligraphic":"mjx-cal mjx-b","-tex-mathit":"mjx-mit mjx-i","-tex-oldstyle":"mjx-os","-tex-bold-oldstyle":"mjx-os mjx-b","-tex-variant":"mjx-var"},e.defaultVariantLetters={normal:"",bold:"B",italic:"MI","bold-italic":"BI","double-struck":"A",fraktur:"FR","bold-fraktur":"FRB",script:"SC","bold-script":"SCB","sans-serif":"SS","bold-sans-serif":"SSB","sans-serif-italic":"SSI","sans-serif-bold-italic":"SSBI",monospace:"T","-smallop":"S1","-largeop":"S2","-size3":"S3","-size4":"S4","-tex-calligraphic":"C","-tex-bold-calligraphic":"CB","-tex-mathit":"MI","-tex-oldstyle":"C","-tex-bold-oldstyle":"CB","-tex-variant":"A"},e.defaultDelimiters=I.delimiters,e.defaultChars={normal:y.normal,bold:c.bold,italic:f.italic,"bold-italic":l.boldItalic,"double-struck":u.doubleStruck,fraktur:h.fraktur,"bold-fraktur":p.frakturBold,script:O.script,"bold-script":S.scriptBold,"sans-serif":_.sansSerif,"bold-sans-serif":b.sansSerifBold,"sans-serif-italic":v.sansSerifItalic,"sans-serif-bold-italic":g.sansSerifBoldItalic,monospace:m.monospace,"-smallop":M.smallop,"-largeop":d.largeop,"-size3":N.texSize3,"-size4":w.texSize4,"-tex-calligraphic":E.texCalligraphic,"-tex-bold-calligraphic":x.texCalligraphicBold,"-tex-mathit":A.texMathit,"-tex-oldstyle":T.texOldstyle,"-tex-bold-oldstyle":C.texOldstyleBold,"-tex-variant":L.texVariant},e.defaultStyles=i(i({},s.CHTMLFontData.defaultStyles),{".MJX-TEX":{"font-family":"MJXZERO, MJXTEX"},".TEX-B":{"font-family":"MJXZERO, MJXTEX-B"},".TEX-I":{"font-family":"MJXZERO, MJXTEX-I"},".TEX-MI":{"font-family":"MJXZERO, MJXTEX-MI"},".TEX-BI":{"font-family":"MJXZERO, MJXTEX-BI"},".TEX-S1":{"font-family":"MJXZERO, MJXTEX-S1"},".TEX-S2":{"font-family":"MJXZERO, MJXTEX-S2"},".TEX-S3":{"font-family":"MJXZERO, MJXTEX-S3"},".TEX-S4":{"font-family":"MJXZERO, MJXTEX-S4"},".TEX-A":{"font-family":"MJXZERO, MJXTEX-A"},".TEX-C":{"font-family":"MJXZERO, MJXTEX-C"},".TEX-CB":{"font-family":"MJXZERO, MJXTEX-CB"},".TEX-FR":{"font-family":"MJXZERO, MJXTEX-FR"},".TEX-FRB":{"font-family":"MJXZERO, MJXTEX-FRB"},".TEX-SS":{"font-family":"MJXZERO, MJXTEX-SS"},".TEX-SSB":{"font-family":"MJXZERO, MJXTEX-SSB"},".TEX-SSI":{"font-family":"MJXZERO, MJXTEX-SSI"},".TEX-SC":{"font-family":"MJXZERO, MJXTEX-SC"},".TEX-T":{"font-family":"MJXZERO, MJXTEX-T"},".TEX-V":{"font-family":"MJXZERO, MJXTEX-V"},".TEX-VB":{"font-family":"MJXZERO, MJXTEX-VB"},"mjx-stretchy-v mjx-c, mjx-stretchy-h mjx-c":{"font-family":"MJXZERO, MJXTEX-S1, MJXTEX-S4, MJXTEX, MJXTEX-A ! important"}}),e.defaultFonts=i(i({},s.CHTMLFontData.defaultFonts),{"@font-face /* 1 */":{"font-family":"MJXTEX",src:'url("%%URL%%/MathJax_Main-Regular.woff") format("woff")'},"@font-face /* 2 */":{"font-family":"MJXTEX-B",src:'url("%%URL%%/MathJax_Main-Bold.woff") format("woff")'},"@font-face /* 3 */":{"font-family":"MJXTEX-I",src:'url("%%URL%%/MathJax_Math-Italic.woff") format("woff")'},"@font-face /* 4 */":{"font-family":"MJXTEX-MI",src:'url("%%URL%%/MathJax_Main-Italic.woff") format("woff")'},"@font-face /* 5 */":{"font-family":"MJXTEX-BI",src:'url("%%URL%%/MathJax_Math-BoldItalic.woff") format("woff")'},"@font-face /* 6 */":{"font-family":"MJXTEX-S1",src:'url("%%URL%%/MathJax_Size1-Regular.woff") format("woff")'},"@font-face /* 7 */":{"font-family":"MJXTEX-S2",src:'url("%%URL%%/MathJax_Size2-Regular.woff") format("woff")'},"@font-face /* 8 */":{"font-family":"MJXTEX-S3",src:'url("%%URL%%/MathJax_Size3-Regular.woff") format("woff")'},"@font-face /* 9 */":{"font-family":"MJXTEX-S4",src:'url("%%URL%%/MathJax_Size4-Regular.woff") format("woff")'},"@font-face /* 10 */":{"font-family":"MJXTEX-A",src:'url("%%URL%%/MathJax_AMS-Regular.woff") format("woff")'},"@font-face /* 11 */":{"font-family":"MJXTEX-C",src:'url("%%URL%%/MathJax_Calligraphic-Regular.woff") format("woff")'},"@font-face /* 12 */":{"font-family":"MJXTEX-CB",src:'url("%%URL%%/MathJax_Calligraphic-Bold.woff") format("woff")'},"@font-face /* 13 */":{"font-family":"MJXTEX-FR",src:'url("%%URL%%/MathJax_Fraktur-Regular.woff") format("woff")'},"@font-face /* 14 */":{"font-family":"MJXTEX-FRB",src:'url("%%URL%%/MathJax_Fraktur-Bold.woff") format("woff")'},"@font-face /* 15 */":{"font-family":"MJXTEX-SS",src:'url("%%URL%%/MathJax_SansSerif-Regular.woff") format("woff")'},"@font-face /* 16 */":{"font-family":"MJXTEX-SSB",src:'url("%%URL%%/MathJax_SansSerif-Bold.woff") format("woff")'},"@font-face /* 17 */":{"font-family":"MJXTEX-SSI",src:'url("%%URL%%/MathJax_SansSerif-Italic.woff") format("woff")'},"@font-face /* 18 */":{"font-family":"MJXTEX-SC",src:'url("%%URL%%/MathJax_Script-Regular.woff") format("woff")'},"@font-face /* 19 */":{"font-family":"MJXTEX-T",src:'url("%%URL%%/MathJax_Typewriter-Regular.woff") format("woff")'},"@font-face /* 20 */":{"font-family":"MJXTEX-V",src:'url("%%URL%%/MathJax_Vector-Regular.woff") format("woff")'},"@font-face /* 21 */":{"font-family":"MJXTEX-VB",src:'url("%%URL%%/MathJax_Vector-Bold.woff") format("woff")'}}),e}((0,a.CommonTeXFontMixin)(s.CHTMLFontData));e.TeXFont=P},4005:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.boldItalic=void 0;var n=r(8042),o=r(3980);e.boldItalic=(0,n.AddCSS)(o.boldItalic,{305:{f:"B"},567:{f:"B"},8260:{c:"/"},8710:{c:"\\394"},10744:{c:"/"}})},1015:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.bold=void 0;var n=r(8042),o=r(1103);e.bold=(0,n.AddCSS)(o.bold,{183:{c:"\\22C5"},305:{f:""},567:{f:""},697:{c:"\\2032"},8194:{c:""},8195:{c:""},8196:{c:""},8197:{c:""},8198:{c:""},8201:{c:""},8202:{c:""},8213:{c:"\\2014"},8214:{c:"\\2225"},8215:{c:"_"},8226:{c:"\\2219"},8243:{c:"\\2032\\2032"},8244:{c:"\\2032\\2032\\2032"},8254:{c:"\\2C9"},8260:{c:"/"},8279:{c:"\\2032\\2032\\2032\\2032"},8407:{c:"\\2192",f:"VB"},8602:{c:"\\2190\\338"},8603:{c:"\\2192\\338"},8622:{c:"\\2194\\338"},8653:{c:"\\21D0\\338"},8654:{c:"\\21D4\\338"},8655:{c:"\\21D2\\338"},8708:{c:"\\2203\\338"},8710:{c:"\\394"},8716:{c:"\\220B\\338"},8740:{c:"\\2223\\338"},8742:{c:"\\2225\\338"},8769:{c:"\\223C\\338"},8772:{c:"\\2243\\338"},8775:{c:"\\2245\\338"},8777:{c:"\\2248\\338"},8802:{c:"\\2261\\338"},8813:{c:"\\224D\\338"},8814:{c:"<\\338"},8815:{c:">\\338"},8816:{c:"\\2264\\338"},8817:{c:"\\2265\\338"},8832:{c:"\\227A\\338"},8833:{c:"\\227B\\338"},8836:{c:"\\2282\\338"},8837:{c:"\\2283\\338"},8840:{c:"\\2286\\338"},8841:{c:"\\2287\\338"},8876:{c:"\\22A2\\338"},8877:{c:"\\22A8\\338"},8930:{c:"\\2291\\338"},8931:{c:"\\2292\\338"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},9653:{c:"\\25B3"},9663:{c:"\\25BD"},10072:{c:"\\2223"},10744:{c:"/",f:"BI"},10799:{c:"\\D7"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},4515:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.doubleStruck=void 0;var n=r(6001);Object.defineProperty(e,"doubleStruck",{enumerable:!0,get:function(){return n.doubleStruck}})},6555:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.frakturBold=void 0;var n=r(8042),o=r(3696);e.frakturBold=(0,n.AddCSS)(o.frakturBold,{8260:{c:"/"}})},2183:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.fraktur=void 0;var n=r(8042),o=r(9587);e.fraktur=(0,n.AddCSS)(o.fraktur,{8260:{c:"/"}})},3490:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.italic=void 0;var n=r(8042),o=r(8348);e.italic=(0,n.AddCSS)(o.italic,{47:{f:"I"},989:{c:"\\E008",f:"A"},8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/",f:"I"},8710:{c:"\\394",f:"I"},10744:{c:"/",f:"I"}})},9056:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.largeop=void 0;var n=r(8042),o=r(1376);e.largeop=(0,n.AddCSS)(o.largeop,{8214:{f:"S1"},8260:{c:"/"},8593:{f:"S1"},8595:{f:"S1"},8657:{f:"S1"},8659:{f:"S1"},8739:{f:"S1"},8741:{f:"S1"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},9168:{f:"S1"},10072:{c:"\\2223",f:"S1"},10764:{c:"\\222C\\222C"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},3019:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.monospace=void 0;var n=r(8042),o=r(1439);e.monospace=(0,n.AddCSS)(o.monospace,{697:{c:"\\2032"},913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8215:{c:"_"},8243:{c:"\\2032\\2032"},8244:{c:"\\2032\\2032\\2032"},8260:{c:"/"},8279:{c:"\\2032\\2032\\2032\\2032"},8710:{c:"\\394"}})},2713:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.normal=void 0;var n=r(8042),o=r(331);e.normal=(0,n.AddCSS)(o.normal,{163:{f:"MI"},165:{f:"A"},174:{f:"A"},183:{c:"\\22C5"},240:{f:"A"},697:{c:"\\2032"},913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8192:{c:""},8193:{c:""},8194:{c:""},8195:{c:""},8196:{c:""},8197:{c:""},8198:{c:""},8201:{c:""},8202:{c:""},8203:{c:""},8204:{c:""},8213:{c:"\\2014"},8214:{c:"\\2225"},8215:{c:"_"},8226:{c:"\\2219"},8243:{c:"\\2032\\2032"},8244:{c:"\\2032\\2032\\2032"},8245:{f:"A"},8246:{c:"\\2035\\2035",f:"A"},8247:{c:"\\2035\\2035\\2035",f:"A"},8254:{c:"\\2C9"},8260:{c:"/"},8279:{c:"\\2032\\2032\\2032\\2032"},8288:{c:""},8289:{c:""},8290:{c:""},8291:{c:""},8292:{c:""},8407:{c:"\\2192",f:"V"},8450:{c:"C",f:"A"},8459:{c:"H",f:"SC"},8460:{c:"H",f:"FR"},8461:{c:"H",f:"A"},8462:{c:"h",f:"I"},8463:{f:"A"},8464:{c:"I",f:"SC"},8465:{c:"I",f:"FR"},8466:{c:"L",f:"SC"},8469:{c:"N",f:"A"},8473:{c:"P",f:"A"},8474:{c:"Q",f:"A"},8475:{c:"R",f:"SC"},8476:{c:"R",f:"FR"},8477:{c:"R",f:"A"},8484:{c:"Z",f:"A"},8486:{c:"\\3A9"},8487:{f:"A"},8488:{c:"Z",f:"FR"},8492:{c:"B",f:"SC"},8493:{c:"C",f:"FR"},8496:{c:"E",f:"SC"},8497:{c:"F",f:"SC"},8498:{f:"A"},8499:{c:"M",f:"SC"},8502:{f:"A"},8503:{f:"A"},8504:{f:"A"},8513:{f:"A"},8602:{f:"A"},8603:{f:"A"},8606:{f:"A"},8608:{f:"A"},8610:{f:"A"},8611:{f:"A"},8619:{f:"A"},8620:{f:"A"},8621:{f:"A"},8622:{f:"A"},8624:{f:"A"},8625:{f:"A"},8630:{f:"A"},8631:{f:"A"},8634:{f:"A"},8635:{f:"A"},8638:{f:"A"},8639:{f:"A"},8642:{f:"A"},8643:{f:"A"},8644:{f:"A"},8646:{f:"A"},8647:{f:"A"},8648:{f:"A"},8649:{f:"A"},8650:{f:"A"},8651:{f:"A"},8653:{f:"A"},8654:{f:"A"},8655:{f:"A"},8666:{f:"A"},8667:{f:"A"},8669:{f:"A"},8672:{f:"A"},8674:{f:"A"},8705:{f:"A"},8708:{c:"\\2203\\338"},8710:{c:"\\394"},8716:{c:"\\220B\\338"},8717:{f:"A"},8719:{f:"S1"},8720:{f:"S1"},8721:{f:"S1"},8724:{f:"A"},8737:{f:"A"},8738:{f:"A"},8740:{f:"A"},8742:{f:"A"},8748:{f:"S1"},8749:{f:"S1"},8750:{f:"S1"},8756:{f:"A"},8757:{f:"A"},8765:{f:"A"},8769:{f:"A"},8770:{f:"A"},8772:{c:"\\2243\\338"},8775:{c:"\\2246",f:"A"},8777:{c:"\\2248\\338"},8778:{f:"A"},8782:{f:"A"},8783:{f:"A"},8785:{f:"A"},8786:{f:"A"},8787:{f:"A"},8790:{f:"A"},8791:{f:"A"},8796:{f:"A"},8802:{c:"\\2261\\338"},8806:{f:"A"},8807:{f:"A"},8808:{f:"A"},8809:{f:"A"},8812:{f:"A"},8813:{c:"\\224D\\338"},8814:{f:"A"},8815:{f:"A"},8816:{f:"A"},8817:{f:"A"},8818:{f:"A"},8819:{f:"A"},8820:{c:"\\2272\\338"},8821:{c:"\\2273\\338"},8822:{f:"A"},8823:{f:"A"},8824:{c:"\\2276\\338"},8825:{c:"\\2277\\338"},8828:{f:"A"},8829:{f:"A"},8830:{f:"A"},8831:{f:"A"},8832:{f:"A"},8833:{f:"A"},8836:{c:"\\2282\\338"},8837:{c:"\\2283\\338"},8840:{f:"A"},8841:{f:"A"},8842:{f:"A"},8843:{f:"A"},8847:{f:"A"},8848:{f:"A"},8858:{f:"A"},8859:{f:"A"},8861:{f:"A"},8862:{f:"A"},8863:{f:"A"},8864:{f:"A"},8865:{f:"A"},8873:{f:"A"},8874:{f:"A"},8876:{f:"A"},8877:{f:"A"},8878:{f:"A"},8879:{f:"A"},8882:{f:"A"},8883:{f:"A"},8884:{f:"A"},8885:{f:"A"},8888:{f:"A"},8890:{f:"A"},8891:{f:"A"},8892:{f:"A"},8896:{f:"S1"},8897:{f:"S1"},8898:{f:"S1"},8899:{f:"S1"},8903:{f:"A"},8905:{f:"A"},8906:{f:"A"},8907:{f:"A"},8908:{f:"A"},8909:{f:"A"},8910:{f:"A"},8911:{f:"A"},8912:{f:"A"},8913:{f:"A"},8914:{f:"A"},8915:{f:"A"},8916:{f:"A"},8918:{f:"A"},8919:{f:"A"},8920:{f:"A"},8921:{f:"A"},8922:{f:"A"},8923:{f:"A"},8926:{f:"A"},8927:{f:"A"},8928:{f:"A"},8929:{f:"A"},8930:{c:"\\2291\\338"},8931:{c:"\\2292\\338"},8934:{f:"A"},8935:{f:"A"},8936:{f:"A"},8937:{f:"A"},8938:{f:"A"},8939:{f:"A"},8940:{f:"A"},8941:{f:"A"},8965:{c:"\\22BC",f:"A"},8966:{c:"\\2A5E",f:"A"},8988:{c:"\\250C",f:"A"},8989:{c:"\\2510",f:"A"},8990:{c:"\\2514",f:"A"},8991:{c:"\\2518",f:"A"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},9168:{f:"S1"},9416:{f:"A"},9484:{f:"A"},9488:{f:"A"},9492:{f:"A"},9496:{f:"A"},9585:{f:"A"},9586:{f:"A"},9632:{f:"A"},9633:{f:"A"},9642:{c:"\\25A0",f:"A"},9650:{f:"A"},9652:{c:"\\25B2",f:"A"},9653:{c:"\\25B3"},9654:{f:"A"},9656:{c:"\\25B6",f:"A"},9660:{f:"A"},9662:{c:"\\25BC",f:"A"},9663:{c:"\\25BD"},9664:{f:"A"},9666:{c:"\\25C0",f:"A"},9674:{f:"A"},9723:{c:"\\25A1",f:"A"},9724:{c:"\\25A0",f:"A"},9733:{f:"A"},10003:{f:"A"},10016:{f:"A"},10072:{c:"\\2223"},10731:{f:"A"},10744:{c:"/",f:"I"},10752:{f:"S1"},10753:{f:"S1"},10754:{f:"S1"},10756:{f:"S1"},10758:{f:"S1"},10764:{c:"\\222C\\222C",f:"S1"},10799:{c:"\\D7"},10846:{f:"A"},10877:{f:"A"},10878:{f:"A"},10885:{f:"A"},10886:{f:"A"},10887:{f:"A"},10888:{f:"A"},10889:{f:"A"},10890:{f:"A"},10891:{f:"A"},10892:{f:"A"},10901:{f:"A"},10902:{f:"A"},10933:{f:"A"},10934:{f:"A"},10935:{f:"A"},10936:{f:"A"},10937:{f:"A"},10938:{f:"A"},10949:{f:"A"},10950:{f:"A"},10955:{f:"A"},10956:{f:"A"},12296:{c:"\\27E8"},12297:{c:"\\27E9"},57350:{f:"A"},57351:{f:"A"},57352:{f:"A"},57353:{f:"A"},57356:{f:"A"},57357:{f:"A"},57358:{f:"A"},57359:{f:"A"},57360:{f:"A"},57361:{f:"A"},57366:{f:"A"},57367:{f:"A"},57368:{f:"A"},57369:{f:"A"},57370:{f:"A"},57371:{f:"A"},119808:{c:"A",f:"B"},119809:{c:"B",f:"B"},119810:{c:"C",f:"B"},119811:{c:"D",f:"B"},119812:{c:"E",f:"B"},119813:{c:"F",f:"B"},119814:{c:"G",f:"B"},119815:{c:"H",f:"B"},119816:{c:"I",f:"B"},119817:{c:"J",f:"B"},119818:{c:"K",f:"B"},119819:{c:"L",f:"B"},119820:{c:"M",f:"B"},119821:{c:"N",f:"B"},119822:{c:"O",f:"B"},119823:{c:"P",f:"B"},119824:{c:"Q",f:"B"},119825:{c:"R",f:"B"},119826:{c:"S",f:"B"},119827:{c:"T",f:"B"},119828:{c:"U",f:"B"},119829:{c:"V",f:"B"},119830:{c:"W",f:"B"},119831:{c:"X",f:"B"},119832:{c:"Y",f:"B"},119833:{c:"Z",f:"B"},119834:{c:"a",f:"B"},119835:{c:"b",f:"B"},119836:{c:"c",f:"B"},119837:{c:"d",f:"B"},119838:{c:"e",f:"B"},119839:{c:"f",f:"B"},119840:{c:"g",f:"B"},119841:{c:"h",f:"B"},119842:{c:"i",f:"B"},119843:{c:"j",f:"B"},119844:{c:"k",f:"B"},119845:{c:"l",f:"B"},119846:{c:"m",f:"B"},119847:{c:"n",f:"B"},119848:{c:"o",f:"B"},119849:{c:"p",f:"B"},119850:{c:"q",f:"B"},119851:{c:"r",f:"B"},119852:{c:"s",f:"B"},119853:{c:"t",f:"B"},119854:{c:"u",f:"B"},119855:{c:"v",f:"B"},119856:{c:"w",f:"B"},119857:{c:"x",f:"B"},119858:{c:"y",f:"B"},119859:{c:"z",f:"B"},119860:{c:"A",f:"I"},119861:{c:"B",f:"I"},119862:{c:"C",f:"I"},119863:{c:"D",f:"I"},119864:{c:"E",f:"I"},119865:{c:"F",f:"I"},119866:{c:"G",f:"I"},119867:{c:"H",f:"I"},119868:{c:"I",f:"I"},119869:{c:"J",f:"I"},119870:{c:"K",f:"I"},119871:{c:"L",f:"I"},119872:{c:"M",f:"I"},119873:{c:"N",f:"I"},119874:{c:"O",f:"I"},119875:{c:"P",f:"I"},119876:{c:"Q",f:"I"},119877:{c:"R",f:"I"},119878:{c:"S",f:"I"},119879:{c:"T",f:"I"},119880:{c:"U",f:"I"},119881:{c:"V",f:"I"},119882:{c:"W",f:"I"},119883:{c:"X",f:"I"},119884:{c:"Y",f:"I"},119885:{c:"Z",f:"I"},119886:{c:"a",f:"I"},119887:{c:"b",f:"I"},119888:{c:"c",f:"I"},119889:{c:"d",f:"I"},119890:{c:"e",f:"I"},119891:{c:"f",f:"I"},119892:{c:"g",f:"I"},119894:{c:"i",f:"I"},119895:{c:"j",f:"I"},119896:{c:"k",f:"I"},119897:{c:"l",f:"I"},119898:{c:"m",f:"I"},119899:{c:"n",f:"I"},119900:{c:"o",f:"I"},119901:{c:"p",f:"I"},119902:{c:"q",f:"I"},119903:{c:"r",f:"I"},119904:{c:"s",f:"I"},119905:{c:"t",f:"I"},119906:{c:"u",f:"I"},119907:{c:"v",f:"I"},119908:{c:"w",f:"I"},119909:{c:"x",f:"I"},119910:{c:"y",f:"I"},119911:{c:"z",f:"I"},119912:{c:"A",f:"BI"},119913:{c:"B",f:"BI"},119914:{c:"C",f:"BI"},119915:{c:"D",f:"BI"},119916:{c:"E",f:"BI"},119917:{c:"F",f:"BI"},119918:{c:"G",f:"BI"},119919:{c:"H",f:"BI"},119920:{c:"I",f:"BI"},119921:{c:"J",f:"BI"},119922:{c:"K",f:"BI"},119923:{c:"L",f:"BI"},119924:{c:"M",f:"BI"},119925:{c:"N",f:"BI"},119926:{c:"O",f:"BI"},119927:{c:"P",f:"BI"},119928:{c:"Q",f:"BI"},119929:{c:"R",f:"BI"},119930:{c:"S",f:"BI"},119931:{c:"T",f:"BI"},119932:{c:"U",f:"BI"},119933:{c:"V",f:"BI"},119934:{c:"W",f:"BI"},119935:{c:"X",f:"BI"},119936:{c:"Y",f:"BI"},119937:{c:"Z",f:"BI"},119938:{c:"a",f:"BI"},119939:{c:"b",f:"BI"},119940:{c:"c",f:"BI"},119941:{c:"d",f:"BI"},119942:{c:"e",f:"BI"},119943:{c:"f",f:"BI"},119944:{c:"g",f:"BI"},119945:{c:"h",f:"BI"},119946:{c:"i",f:"BI"},119947:{c:"j",f:"BI"},119948:{c:"k",f:"BI"},119949:{c:"l",f:"BI"},119950:{c:"m",f:"BI"},119951:{c:"n",f:"BI"},119952:{c:"o",f:"BI"},119953:{c:"p",f:"BI"},119954:{c:"q",f:"BI"},119955:{c:"r",f:"BI"},119956:{c:"s",f:"BI"},119957:{c:"t",f:"BI"},119958:{c:"u",f:"BI"},119959:{c:"v",f:"BI"},119960:{c:"w",f:"BI"},119961:{c:"x",f:"BI"},119962:{c:"y",f:"BI"},119963:{c:"z",f:"BI"},119964:{c:"A",f:"SC"},119966:{c:"C",f:"SC"},119967:{c:"D",f:"SC"},119970:{c:"G",f:"SC"},119973:{c:"J",f:"SC"},119974:{c:"K",f:"SC"},119977:{c:"N",f:"SC"},119978:{c:"O",f:"SC"},119979:{c:"P",f:"SC"},119980:{c:"Q",f:"SC"},119982:{c:"S",f:"SC"},119983:{c:"T",f:"SC"},119984:{c:"U",f:"SC"},119985:{c:"V",f:"SC"},119986:{c:"W",f:"SC"},119987:{c:"X",f:"SC"},119988:{c:"Y",f:"SC"},119989:{c:"Z",f:"SC"},120068:{c:"A",f:"FR"},120069:{c:"B",f:"FR"},120071:{c:"D",f:"FR"},120072:{c:"E",f:"FR"},120073:{c:"F",f:"FR"},120074:{c:"G",f:"FR"},120077:{c:"J",f:"FR"},120078:{c:"K",f:"FR"},120079:{c:"L",f:"FR"},120080:{c:"M",f:"FR"},120081:{c:"N",f:"FR"},120082:{c:"O",f:"FR"},120083:{c:"P",f:"FR"},120084:{c:"Q",f:"FR"},120086:{c:"S",f:"FR"},120087:{c:"T",f:"FR"},120088:{c:"U",f:"FR"},120089:{c:"V",f:"FR"},120090:{c:"W",f:"FR"},120091:{c:"X",f:"FR"},120092:{c:"Y",f:"FR"},120094:{c:"a",f:"FR"},120095:{c:"b",f:"FR"},120096:{c:"c",f:"FR"},120097:{c:"d",f:"FR"},120098:{c:"e",f:"FR"},120099:{c:"f",f:"FR"},120100:{c:"g",f:"FR"},120101:{c:"h",f:"FR"},120102:{c:"i",f:"FR"},120103:{c:"j",f:"FR"},120104:{c:"k",f:"FR"},120105:{c:"l",f:"FR"},120106:{c:"m",f:"FR"},120107:{c:"n",f:"FR"},120108:{c:"o",f:"FR"},120109:{c:"p",f:"FR"},120110:{c:"q",f:"FR"},120111:{c:"r",f:"FR"},120112:{c:"s",f:"FR"},120113:{c:"t",f:"FR"},120114:{c:"u",f:"FR"},120115:{c:"v",f:"FR"},120116:{c:"w",f:"FR"},120117:{c:"x",f:"FR"},120118:{c:"y",f:"FR"},120119:{c:"z",f:"FR"},120120:{c:"A",f:"A"},120121:{c:"B",f:"A"},120123:{c:"D",f:"A"},120124:{c:"E",f:"A"},120125:{c:"F",f:"A"},120126:{c:"G",f:"A"},120128:{c:"I",f:"A"},120129:{c:"J",f:"A"},120130:{c:"K",f:"A"},120131:{c:"L",f:"A"},120132:{c:"M",f:"A"},120134:{c:"O",f:"A"},120138:{c:"S",f:"A"},120139:{c:"T",f:"A"},120140:{c:"U",f:"A"},120141:{c:"V",f:"A"},120142:{c:"W",f:"A"},120143:{c:"X",f:"A"},120144:{c:"Y",f:"A"},120172:{c:"A",f:"FRB"},120173:{c:"B",f:"FRB"},120174:{c:"C",f:"FRB"},120175:{c:"D",f:"FRB"},120176:{c:"E",f:"FRB"},120177:{c:"F",f:"FRB"},120178:{c:"G",f:"FRB"},120179:{c:"H",f:"FRB"},120180:{c:"I",f:"FRB"},120181:{c:"J",f:"FRB"},120182:{c:"K",f:"FRB"},120183:{c:"L",f:"FRB"},120184:{c:"M",f:"FRB"},120185:{c:"N",f:"FRB"},120186:{c:"O",f:"FRB"},120187:{c:"P",f:"FRB"},120188:{c:"Q",f:"FRB"},120189:{c:"R",f:"FRB"},120190:{c:"S",f:"FRB"},120191:{c:"T",f:"FRB"},120192:{c:"U",f:"FRB"},120193:{c:"V",f:"FRB"},120194:{c:"W",f:"FRB"},120195:{c:"X",f:"FRB"},120196:{c:"Y",f:"FRB"},120197:{c:"Z",f:"FRB"},120198:{c:"a",f:"FRB"},120199:{c:"b",f:"FRB"},120200:{c:"c",f:"FRB"},120201:{c:"d",f:"FRB"},120202:{c:"e",f:"FRB"},120203:{c:"f",f:"FRB"},120204:{c:"g",f:"FRB"},120205:{c:"h",f:"FRB"},120206:{c:"i",f:"FRB"},120207:{c:"j",f:"FRB"},120208:{c:"k",f:"FRB"},120209:{c:"l",f:"FRB"},120210:{c:"m",f:"FRB"},120211:{c:"n",f:"FRB"},120212:{c:"o",f:"FRB"},120213:{c:"p",f:"FRB"},120214:{c:"q",f:"FRB"},120215:{c:"r",f:"FRB"},120216:{c:"s",f:"FRB"},120217:{c:"t",f:"FRB"},120218:{c:"u",f:"FRB"},120219:{c:"v",f:"FRB"},120220:{c:"w",f:"FRB"},120221:{c:"x",f:"FRB"},120222:{c:"y",f:"FRB"},120223:{c:"z",f:"FRB"},120224:{c:"A",f:"SS"},120225:{c:"B",f:"SS"},120226:{c:"C",f:"SS"},120227:{c:"D",f:"SS"},120228:{c:"E",f:"SS"},120229:{c:"F",f:"SS"},120230:{c:"G",f:"SS"},120231:{c:"H",f:"SS"},120232:{c:"I",f:"SS"},120233:{c:"J",f:"SS"},120234:{c:"K",f:"SS"},120235:{c:"L",f:"SS"},120236:{c:"M",f:"SS"},120237:{c:"N",f:"SS"},120238:{c:"O",f:"SS"},120239:{c:"P",f:"SS"},120240:{c:"Q",f:"SS"},120241:{c:"R",f:"SS"},120242:{c:"S",f:"SS"},120243:{c:"T",f:"SS"},120244:{c:"U",f:"SS"},120245:{c:"V",f:"SS"},120246:{c:"W",f:"SS"},120247:{c:"X",f:"SS"},120248:{c:"Y",f:"SS"},120249:{c:"Z",f:"SS"},120250:{c:"a",f:"SS"},120251:{c:"b",f:"SS"},120252:{c:"c",f:"SS"},120253:{c:"d",f:"SS"},120254:{c:"e",f:"SS"},120255:{c:"f",f:"SS"},120256:{c:"g",f:"SS"},120257:{c:"h",f:"SS"},120258:{c:"i",f:"SS"},120259:{c:"j",f:"SS"},120260:{c:"k",f:"SS"},120261:{c:"l",f:"SS"},120262:{c:"m",f:"SS"},120263:{c:"n",f:"SS"},120264:{c:"o",f:"SS"},120265:{c:"p",f:"SS"},120266:{c:"q",f:"SS"},120267:{c:"r",f:"SS"},120268:{c:"s",f:"SS"},120269:{c:"t",f:"SS"},120270:{c:"u",f:"SS"},120271:{c:"v",f:"SS"},120272:{c:"w",f:"SS"},120273:{c:"x",f:"SS"},120274:{c:"y",f:"SS"},120275:{c:"z",f:"SS"},120276:{c:"A",f:"SSB"},120277:{c:"B",f:"SSB"},120278:{c:"C",f:"SSB"},120279:{c:"D",f:"SSB"},120280:{c:"E",f:"SSB"},120281:{c:"F",f:"SSB"},120282:{c:"G",f:"SSB"},120283:{c:"H",f:"SSB"},120284:{c:"I",f:"SSB"},120285:{c:"J",f:"SSB"},120286:{c:"K",f:"SSB"},120287:{c:"L",f:"SSB"},120288:{c:"M",f:"SSB"},120289:{c:"N",f:"SSB"},120290:{c:"O",f:"SSB"},120291:{c:"P",f:"SSB"},120292:{c:"Q",f:"SSB"},120293:{c:"R",f:"SSB"},120294:{c:"S",f:"SSB"},120295:{c:"T",f:"SSB"},120296:{c:"U",f:"SSB"},120297:{c:"V",f:"SSB"},120298:{c:"W",f:"SSB"},120299:{c:"X",f:"SSB"},120300:{c:"Y",f:"SSB"},120301:{c:"Z",f:"SSB"},120302:{c:"a",f:"SSB"},120303:{c:"b",f:"SSB"},120304:{c:"c",f:"SSB"},120305:{c:"d",f:"SSB"},120306:{c:"e",f:"SSB"},120307:{c:"f",f:"SSB"},120308:{c:"g",f:"SSB"},120309:{c:"h",f:"SSB"},120310:{c:"i",f:"SSB"},120311:{c:"j",f:"SSB"},120312:{c:"k",f:"SSB"},120313:{c:"l",f:"SSB"},120314:{c:"m",f:"SSB"},120315:{c:"n",f:"SSB"},120316:{c:"o",f:"SSB"},120317:{c:"p",f:"SSB"},120318:{c:"q",f:"SSB"},120319:{c:"r",f:"SSB"},120320:{c:"s",f:"SSB"},120321:{c:"t",f:"SSB"},120322:{c:"u",f:"SSB"},120323:{c:"v",f:"SSB"},120324:{c:"w",f:"SSB"},120325:{c:"x",f:"SSB"},120326:{c:"y",f:"SSB"},120327:{c:"z",f:"SSB"},120328:{c:"A",f:"SSI"},120329:{c:"B",f:"SSI"},120330:{c:"C",f:"SSI"},120331:{c:"D",f:"SSI"},120332:{c:"E",f:"SSI"},120333:{c:"F",f:"SSI"},120334:{c:"G",f:"SSI"},120335:{c:"H",f:"SSI"},120336:{c:"I",f:"SSI"},120337:{c:"J",f:"SSI"},120338:{c:"K",f:"SSI"},120339:{c:"L",f:"SSI"},120340:{c:"M",f:"SSI"},120341:{c:"N",f:"SSI"},120342:{c:"O",f:"SSI"},120343:{c:"P",f:"SSI"},120344:{c:"Q",f:"SSI"},120345:{c:"R",f:"SSI"},120346:{c:"S",f:"SSI"},120347:{c:"T",f:"SSI"},120348:{c:"U",f:"SSI"},120349:{c:"V",f:"SSI"},120350:{c:"W",f:"SSI"},120351:{c:"X",f:"SSI"},120352:{c:"Y",f:"SSI"},120353:{c:"Z",f:"SSI"},120354:{c:"a",f:"SSI"},120355:{c:"b",f:"SSI"},120356:{c:"c",f:"SSI"},120357:{c:"d",f:"SSI"},120358:{c:"e",f:"SSI"},120359:{c:"f",f:"SSI"},120360:{c:"g",f:"SSI"},120361:{c:"h",f:"SSI"},120362:{c:"i",f:"SSI"},120363:{c:"j",f:"SSI"},120364:{c:"k",f:"SSI"},120365:{c:"l",f:"SSI"},120366:{c:"m",f:"SSI"},120367:{c:"n",f:"SSI"},120368:{c:"o",f:"SSI"},120369:{c:"p",f:"SSI"},120370:{c:"q",f:"SSI"},120371:{c:"r",f:"SSI"},120372:{c:"s",f:"SSI"},120373:{c:"t",f:"SSI"},120374:{c:"u",f:"SSI"},120375:{c:"v",f:"SSI"},120376:{c:"w",f:"SSI"},120377:{c:"x",f:"SSI"},120378:{c:"y",f:"SSI"},120379:{c:"z",f:"SSI"},120432:{c:"A",f:"T"},120433:{c:"B",f:"T"},120434:{c:"C",f:"T"},120435:{c:"D",f:"T"},120436:{c:"E",f:"T"},120437:{c:"F",f:"T"},120438:{c:"G",f:"T"},120439:{c:"H",f:"T"},120440:{c:"I",f:"T"},120441:{c:"J",f:"T"},120442:{c:"K",f:"T"},120443:{c:"L",f:"T"},120444:{c:"M",f:"T"},120445:{c:"N",f:"T"},120446:{c:"O",f:"T"},120447:{c:"P",f:"T"},120448:{c:"Q",f:"T"},120449:{c:"R",f:"T"},120450:{c:"S",f:"T"},120451:{c:"T",f:"T"},120452:{c:"U",f:"T"},120453:{c:"V",f:"T"},120454:{c:"W",f:"T"},120455:{c:"X",f:"T"},120456:{c:"Y",f:"T"},120457:{c:"Z",f:"T"},120458:{c:"a",f:"T"},120459:{c:"b",f:"T"},120460:{c:"c",f:"T"},120461:{c:"d",f:"T"},120462:{c:"e",f:"T"},120463:{c:"f",f:"T"},120464:{c:"g",f:"T"},120465:{c:"h",f:"T"},120466:{c:"i",f:"T"},120467:{c:"j",f:"T"},120468:{c:"k",f:"T"},120469:{c:"l",f:"T"},120470:{c:"m",f:"T"},120471:{c:"n",f:"T"},120472:{c:"o",f:"T"},120473:{c:"p",f:"T"},120474:{c:"q",f:"T"},120475:{c:"r",f:"T"},120476:{c:"s",f:"T"},120477:{c:"t",f:"T"},120478:{c:"u",f:"T"},120479:{c:"v",f:"T"},120480:{c:"w",f:"T"},120481:{c:"x",f:"T"},120482:{c:"y",f:"T"},120483:{c:"z",f:"T"},120488:{c:"A",f:"B"},120489:{c:"B",f:"B"},120490:{c:"\\393",f:"B"},120491:{c:"\\394",f:"B"},120492:{c:"E",f:"B"},120493:{c:"Z",f:"B"},120494:{c:"H",f:"B"},120495:{c:"\\398",f:"B"},120496:{c:"I",f:"B"},120497:{c:"K",f:"B"},120498:{c:"\\39B",f:"B"},120499:{c:"M",f:"B"},120500:{c:"N",f:"B"},120501:{c:"\\39E",f:"B"},120502:{c:"O",f:"B"},120503:{c:"\\3A0",f:"B"},120504:{c:"P",f:"B"},120506:{c:"\\3A3",f:"B"},120507:{c:"T",f:"B"},120508:{c:"\\3A5",f:"B"},120509:{c:"\\3A6",f:"B"},120510:{c:"X",f:"B"},120511:{c:"\\3A8",f:"B"},120512:{c:"\\3A9",f:"B"},120513:{c:"\\2207",f:"B"},120546:{c:"A",f:"I"},120547:{c:"B",f:"I"},120548:{c:"\\393",f:"I"},120549:{c:"\\394",f:"I"},120550:{c:"E",f:"I"},120551:{c:"Z",f:"I"},120552:{c:"H",f:"I"},120553:{c:"\\398",f:"I"},120554:{c:"I",f:"I"},120555:{c:"K",f:"I"},120556:{c:"\\39B",f:"I"},120557:{c:"M",f:"I"},120558:{c:"N",f:"I"},120559:{c:"\\39E",f:"I"},120560:{c:"O",f:"I"},120561:{c:"\\3A0",f:"I"},120562:{c:"P",f:"I"},120564:{c:"\\3A3",f:"I"},120565:{c:"T",f:"I"},120566:{c:"\\3A5",f:"I"},120567:{c:"\\3A6",f:"I"},120568:{c:"X",f:"I"},120569:{c:"\\3A8",f:"I"},120570:{c:"\\3A9",f:"I"},120572:{c:"\\3B1",f:"I"},120573:{c:"\\3B2",f:"I"},120574:{c:"\\3B3",f:"I"},120575:{c:"\\3B4",f:"I"},120576:{c:"\\3B5",f:"I"},120577:{c:"\\3B6",f:"I"},120578:{c:"\\3B7",f:"I"},120579:{c:"\\3B8",f:"I"},120580:{c:"\\3B9",f:"I"},120581:{c:"\\3BA",f:"I"},120582:{c:"\\3BB",f:"I"},120583:{c:"\\3BC",f:"I"},120584:{c:"\\3BD",f:"I"},120585:{c:"\\3BE",f:"I"},120586:{c:"\\3BF",f:"I"},120587:{c:"\\3C0",f:"I"},120588:{c:"\\3C1",f:"I"},120589:{c:"\\3C2",f:"I"},120590:{c:"\\3C3",f:"I"},120591:{c:"\\3C4",f:"I"},120592:{c:"\\3C5",f:"I"},120593:{c:"\\3C6",f:"I"},120594:{c:"\\3C7",f:"I"},120595:{c:"\\3C8",f:"I"},120596:{c:"\\3C9",f:"I"},120597:{c:"\\2202"},120598:{c:"\\3F5",f:"I"},120599:{c:"\\3D1",f:"I"},120600:{c:"\\E009",f:"A"},120601:{c:"\\3D5",f:"I"},120602:{c:"\\3F1",f:"I"},120603:{c:"\\3D6",f:"I"},120604:{c:"A",f:"BI"},120605:{c:"B",f:"BI"},120606:{c:"\\393",f:"BI"},120607:{c:"\\394",f:"BI"},120608:{c:"E",f:"BI"},120609:{c:"Z",f:"BI"},120610:{c:"H",f:"BI"},120611:{c:"\\398",f:"BI"},120612:{c:"I",f:"BI"},120613:{c:"K",f:"BI"},120614:{c:"\\39B",f:"BI"},120615:{c:"M",f:"BI"},120616:{c:"N",f:"BI"},120617:{c:"\\39E",f:"BI"},120618:{c:"O",f:"BI"},120619:{c:"\\3A0",f:"BI"},120620:{c:"P",f:"BI"},120622:{c:"\\3A3",f:"BI"},120623:{c:"T",f:"BI"},120624:{c:"\\3A5",f:"BI"},120625:{c:"\\3A6",f:"BI"},120626:{c:"X",f:"BI"},120627:{c:"\\3A8",f:"BI"},120628:{c:"\\3A9",f:"BI"},120630:{c:"\\3B1",f:"BI"},120631:{c:"\\3B2",f:"BI"},120632:{c:"\\3B3",f:"BI"},120633:{c:"\\3B4",f:"BI"},120634:{c:"\\3B5",f:"BI"},120635:{c:"\\3B6",f:"BI"},120636:{c:"\\3B7",f:"BI"},120637:{c:"\\3B8",f:"BI"},120638:{c:"\\3B9",f:"BI"},120639:{c:"\\3BA",f:"BI"},120640:{c:"\\3BB",f:"BI"},120641:{c:"\\3BC",f:"BI"},120642:{c:"\\3BD",f:"BI"},120643:{c:"\\3BE",f:"BI"},120644:{c:"\\3BF",f:"BI"},120645:{c:"\\3C0",f:"BI"},120646:{c:"\\3C1",f:"BI"},120647:{c:"\\3C2",f:"BI"},120648:{c:"\\3C3",f:"BI"},120649:{c:"\\3C4",f:"BI"},120650:{c:"\\3C5",f:"BI"},120651:{c:"\\3C6",f:"BI"},120652:{c:"\\3C7",f:"BI"},120653:{c:"\\3C8",f:"BI"},120654:{c:"\\3C9",f:"BI"},120655:{c:"\\2202",f:"B"},120656:{c:"\\3F5",f:"BI"},120657:{c:"\\3D1",f:"BI"},120658:{c:"\\E009",f:"A"},120659:{c:"\\3D5",f:"BI"},120660:{c:"\\3F1",f:"BI"},120661:{c:"\\3D6",f:"BI"},120662:{c:"A",f:"SSB"},120663:{c:"B",f:"SSB"},120664:{c:"\\393",f:"SSB"},120665:{c:"\\394",f:"SSB"},120666:{c:"E",f:"SSB"},120667:{c:"Z",f:"SSB"},120668:{c:"H",f:"SSB"},120669:{c:"\\398",f:"SSB"},120670:{c:"I",f:"SSB"},120671:{c:"K",f:"SSB"},120672:{c:"\\39B",f:"SSB"},120673:{c:"M",f:"SSB"},120674:{c:"N",f:"SSB"},120675:{c:"\\39E",f:"SSB"},120676:{c:"O",f:"SSB"},120677:{c:"\\3A0",f:"SSB"},120678:{c:"P",f:"SSB"},120680:{c:"\\3A3",f:"SSB"},120681:{c:"T",f:"SSB"},120682:{c:"\\3A5",f:"SSB"},120683:{c:"\\3A6",f:"SSB"},120684:{c:"X",f:"SSB"},120685:{c:"\\3A8",f:"SSB"},120686:{c:"\\3A9",f:"SSB"},120782:{c:"0",f:"B"},120783:{c:"1",f:"B"},120784:{c:"2",f:"B"},120785:{c:"3",f:"B"},120786:{c:"4",f:"B"},120787:{c:"5",f:"B"},120788:{c:"6",f:"B"},120789:{c:"7",f:"B"},120790:{c:"8",f:"B"},120791:{c:"9",f:"B"},120802:{c:"0",f:"SS"},120803:{c:"1",f:"SS"},120804:{c:"2",f:"SS"},120805:{c:"3",f:"SS"},120806:{c:"4",f:"SS"},120807:{c:"5",f:"SS"},120808:{c:"6",f:"SS"},120809:{c:"7",f:"SS"},120810:{c:"8",f:"SS"},120811:{c:"9",f:"SS"},120812:{c:"0",f:"SSB"},120813:{c:"1",f:"SSB"},120814:{c:"2",f:"SSB"},120815:{c:"3",f:"SSB"},120816:{c:"4",f:"SSB"},120817:{c:"5",f:"SSB"},120818:{c:"6",f:"SSB"},120819:{c:"7",f:"SSB"},120820:{c:"8",f:"SSB"},120821:{c:"9",f:"SSB"},120822:{c:"0",f:"T"},120823:{c:"1",f:"T"},120824:{c:"2",f:"T"},120825:{c:"3",f:"T"},120826:{c:"4",f:"T"},120827:{c:"5",f:"T"},120828:{c:"6",f:"T"},120829:{c:"7",f:"T"},120830:{c:"8",f:"T"},120831:{c:"9",f:"T"}})},7517:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifBoldItalic=void 0;var n=r(8042),o=r(4886);e.sansSerifBoldItalic=(0,n.AddCSS)(o.sansSerifBoldItalic,{305:{f:"SSB"},567:{f:"SSB"}})},4182:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifBold=void 0;var n=r(8042),o=r(4471);e.sansSerifBold=(0,n.AddCSS)(o.sansSerifBold,{8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/"},8710:{c:"\\394"}})},2679:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifItalic=void 0;var n=r(8042),o=r(5181);e.sansSerifItalic=(0,n.AddCSS)(o.sansSerifItalic,{913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/"},8710:{c:"\\394"}})},5469:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerif=void 0;var n=r(8042),o=r(3526);e.sansSerif=(0,n.AddCSS)(o.sansSerif,{913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/"},8710:{c:"\\394"}})},7563:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.scriptBold=void 0;var n=r(5649);Object.defineProperty(e,"scriptBold",{enumerable:!0,get:function(){return n.scriptBold}})},9409:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.script=void 0;var n=r(7153);Object.defineProperty(e,"script",{enumerable:!0,get:function(){return n.script}})},775:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.smallop=void 0;var n=r(8042),o=r(5745);e.smallop=(0,n.AddCSS)(o.smallop,{8260:{c:"/"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},10072:{c:"\\2223"},10764:{c:"\\222C\\222C"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},9551:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texCalligraphicBold=void 0;var n=r(8042),o=r(1411);e.texCalligraphicBold=(0,n.AddCSS)(o.texCalligraphicBold,{305:{f:"B"},567:{f:"B"}})},7907:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texCalligraphic=void 0;var n=r(6384);Object.defineProperty(e,"texCalligraphic",{enumerable:!0,get:function(){return n.texCalligraphic}})},9659:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texMathit=void 0;var n=r(6041);Object.defineProperty(e,"texMathit",{enumerable:!0,get:function(){return n.texMathit}})},98:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texOldstyleBold=void 0;var n=r(8199);Object.defineProperty(e,"texOldstyleBold",{enumerable:!0,get:function(){return n.texOldstyleBold}})},6275:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texOldstyle=void 0;var n=r(9848);Object.defineProperty(e,"texOldstyle",{enumerable:!0,get:function(){return n.texOldstyle}})},6530:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texSize3=void 0;var n=r(8042),o=r(7906);e.texSize3=(0,n.AddCSS)(o.texSize3,{8260:{c:"/"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},4409:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texSize4=void 0;var n=r(8042),o=r(2644);e.texSize4=(0,n.AddCSS)(o.texSize4,{8260:{c:"/"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},12296:{c:"\\27E8"},12297:{c:"\\27E9"},57685:{c:"\\E153\\E152"},57686:{c:"\\E151\\E150"}})},5292:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texVariant=void 0;var n=r(8042),o=r(4926);e.texVariant=(0,n.AddCSS)(o.texVariant,{1008:{c:"\\E009"},8463:{f:""},8740:{c:"\\E006"},8742:{c:"\\E007"},8808:{c:"\\E00C"},8809:{c:"\\E00D"},8816:{c:"\\E011"},8817:{c:"\\E00E"},8840:{c:"\\E016"},8841:{c:"\\E018"},8842:{c:"\\E01A"},8843:{c:"\\E01B"},10887:{c:"\\E010"},10888:{c:"\\E00F"},10955:{c:"\\E017"},10956:{c:"\\E019"}})},5884:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},n.apply(this,arguments)},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.FontData=e.NOSTRETCH=e.H=e.V=void 0;var a=r(7233);e.V=1,e.H=2,e.NOSTRETCH={dir:0};var l=function(){function t(t){var e,r,l,c;void 0===t&&(t=null),this.variant={},this.delimiters={},this.cssFontMap={},this.remapChars={},this.skewIcFactor=.75;var u=this.constructor;this.options=(0,a.userOptions)((0,a.defaultOptions)({},u.OPTIONS),t),this.params=n({},u.defaultParams),this.sizeVariants=i([],o(u.defaultSizeVariants),!1),this.stretchVariants=i([],o(u.defaultStretchVariants),!1),this.cssFontMap=n({},u.defaultCssFonts);try{for(var p=s(Object.keys(this.cssFontMap)),h=p.next();!h.done;h=p.next()){var f=h.value;"unknown"===this.cssFontMap[f][0]&&(this.cssFontMap[f][0]=this.options.unknownFamily)}}catch(t){e={error:t}}finally{try{h&&!h.done&&(r=p.return)&&r.call(p)}finally{if(e)throw e.error}}this.cssFamilyPrefix=u.defaultCssFamilyPrefix,this.createVariants(u.defaultVariants),this.defineDelimiters(u.defaultDelimiters);try{for(var d=s(Object.keys(u.defaultChars)),m=d.next();!m.done;m=d.next()){var y=m.value;this.defineChars(y,u.defaultChars[y])}}catch(t){l={error:t}}finally{try{m&&!m.done&&(c=d.return)&&c.call(d)}finally{if(l)throw l.error}}this.defineRemap("accent",u.defaultAccentMap),this.defineRemap("mo",u.defaultMoMap),this.defineRemap("mn",u.defaultMnMap)}return t.charOptions=function(t,e){var r=t[e];return 3===r.length&&(r[3]={}),r[3]},Object.defineProperty(t.prototype,"styles",{get:function(){return this._styles},set:function(t){this._styles=t},enumerable:!1,configurable:!0}),t.prototype.createVariant=function(t,e,r){void 0===e&&(e=null),void 0===r&&(r=null);var n={linked:[],chars:e?Object.create(this.variant[e].chars):{}};r&&this.variant[r]&&(Object.assign(n.chars,this.variant[r].chars),this.variant[r].linked.push(n.chars),n.chars=Object.create(n.chars)),this.remapSmpChars(n.chars,t),this.variant[t]=n},t.prototype.remapSmpChars=function(t,e){var r,n,i,a,l=this.constructor;if(l.VariantSmp[e]){var c=l.SmpRemap,u=[null,null,l.SmpRemapGreekU,l.SmpRemapGreekL];try{for(var p=s(l.SmpRanges),h=p.next();!h.done;h=p.next()){var f=o(h.value,3),d=f[0],m=f[1],y=f[2],g=l.VariantSmp[e][d];if(g){for(var b=m;b<=y;b++)if(930!==b){var v=g+b-m;t[b]=this.smpChar(c[v]||v)}if(u[d])try{for(var _=(i=void 0,s(Object.keys(u[d]).map((function(t){return parseInt(t)})))),S=_.next();!S.done;S=_.next()){t[b=S.value]=this.smpChar(g+u[d][b])}}catch(t){i={error:t}}finally{try{S&&!S.done&&(a=_.return)&&a.call(_)}finally{if(i)throw i.error}}}}}catch(t){r={error:t}}finally{try{h&&!h.done&&(n=p.return)&&n.call(p)}finally{if(r)throw r.error}}}"bold"===e&&(t[988]=this.smpChar(120778),t[989]=this.smpChar(120779))},t.prototype.smpChar=function(t){return[,,,{smp:t}]},t.prototype.createVariants=function(t){var e,r;try{for(var n=s(t),o=n.next();!o.done;o=n.next()){var i=o.value;this.createVariant(i[0],i[1],i[2])}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},t.prototype.defineChars=function(t,e){var r,n,o=this.variant[t];Object.assign(o.chars,e);try{for(var i=s(o.linked),a=i.next();!a.done;a=i.next()){var l=a.value;Object.assign(l,e)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}},t.prototype.defineDelimiters=function(t){Object.assign(this.delimiters,t)},t.prototype.defineRemap=function(t,e){this.remapChars.hasOwnProperty(t)||(this.remapChars[t]={}),Object.assign(this.remapChars[t],e)},t.prototype.getDelimiter=function(t){return this.delimiters[t]},t.prototype.getSizeVariant=function(t,e){return this.delimiters[t].variants&&(e=this.delimiters[t].variants[e]),this.sizeVariants[e]},t.prototype.getStretchVariant=function(t,e){return this.stretchVariants[this.delimiters[t].stretchv?this.delimiters[t].stretchv[e]:0]},t.prototype.getChar=function(t,e){return this.variant[t].chars[e]},t.prototype.getVariant=function(t){return this.variant[t]},t.prototype.getCssFont=function(t){return this.cssFontMap[t]||["serif",!1,!1]},t.prototype.getFamily=function(t){return this.cssFamilyPrefix?this.cssFamilyPrefix+", "+t:t},t.prototype.getRemappedChar=function(t,e){return(this.remapChars[t]||{})[e]},t.OPTIONS={unknownFamily:"serif"},t.JAX="common",t.NAME="",t.defaultVariants=[["normal"],["bold","normal"],["italic","normal"],["bold-italic","italic","bold"],["double-struck","bold"],["fraktur","normal"],["bold-fraktur","bold","fraktur"],["script","italic"],["bold-script","bold-italic","script"],["sans-serif","normal"],["bold-sans-serif","bold","sans-serif"],["sans-serif-italic","italic","sans-serif"],["sans-serif-bold-italic","bold-italic","bold-sans-serif"],["monospace","normal"]],t.defaultCssFonts={normal:["unknown",!1,!1],bold:["unknown",!1,!0],italic:["unknown",!0,!1],"bold-italic":["unknown",!0,!0],"double-struck":["unknown",!1,!0],fraktur:["unknown",!1,!1],"bold-fraktur":["unknown",!1,!0],script:["cursive",!1,!1],"bold-script":["cursive",!1,!0],"sans-serif":["sans-serif",!1,!1],"bold-sans-serif":["sans-serif",!1,!0],"sans-serif-italic":["sans-serif",!0,!1],"sans-serif-bold-italic":["sans-serif",!0,!0],monospace:["monospace",!1,!1]},t.defaultCssFamilyPrefix="",t.VariantSmp={bold:[119808,119834,120488,120514,120782],italic:[119860,119886,120546,120572],"bold-italic":[119912,119938,120604,120630],script:[119964,119990],"bold-script":[120016,120042],fraktur:[120068,120094],"double-struck":[120120,120146,,,120792],"bold-fraktur":[120172,120198],"sans-serif":[120224,120250,,,120802],"bold-sans-serif":[120276,120302,120662,120688,120812],"sans-serif-italic":[120328,120354],"sans-serif-bold-italic":[120380,120406,120720,120746],monospace:[120432,120458,,,120822]},t.SmpRanges=[[0,65,90],[1,97,122],[2,913,937],[3,945,969],[4,48,57]],t.SmpRemap={119893:8462,119965:8492,119968:8496,119969:8497,119971:8459,119972:8464,119975:8466,119976:8499,119981:8475,119994:8495,119996:8458,120004:8500,120070:8493,120075:8460,120076:8465,120085:8476,120093:8488,120122:8450,120127:8461,120133:8469,120135:8473,120136:8474,120137:8477,120145:8484},t.SmpRemapGreekU={8711:25,1012:17},t.SmpRemapGreekL={977:27,981:29,982:31,1008:28,1009:30,1013:26,8706:25},t.defaultAccentMap={768:"\u02cb",769:"\u02ca",770:"\u02c6",771:"\u02dc",772:"\u02c9",774:"\u02d8",775:"\u02d9",776:"\xa8",778:"\u02da",780:"\u02c7",8594:"\u20d7",8242:"'",8243:"''",8244:"'''",8245:"`",8246:"``",8247:"```",8279:"''''",8400:"\u21bc",8401:"\u21c0",8406:"\u2190",8417:"\u2194",8432:"*",8411:"...",8412:"....",8428:"\u21c1",8429:"\u21bd",8430:"\u2190",8431:"\u2192"},t.defaultMoMap={45:"\u2212"},t.defaultMnMap={45:"\u2212"},t.defaultParams={x_height:.442,quad:1,num1:.676,num2:.394,num3:.444,denom1:.686,denom2:.345,sup1:.413,sup2:.363,sup3:.289,sub1:.15,sub2:.247,sup_drop:.386,sub_drop:.05,delim1:2.39,delim2:1,axis_height:.25,rule_thickness:.06,big_op_spacing1:.111,big_op_spacing2:.167,big_op_spacing3:.2,big_op_spacing4:.6,big_op_spacing5:.1,surd_height:.075,scriptspace:.05,nulldelimiterspace:.12,delimiterfactor:901,delimitershortfall:.3,min_rule_thickness:1.25,separation_factor:1.75,extra_ic:.033},t.defaultDelimiters={},t.defaultChars={},t.defaultSizeVariants=[],t.defaultStretchVariants=[],t}();e.FontData=l},5552:function(t,e){var r=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonArrow=e.CommonDiagonalArrow=e.CommonDiagonalStrike=e.CommonBorder2=e.CommonBorder=e.arrowBBox=e.diagonalArrowDef=e.arrowDef=e.arrowBBoxW=e.arrowBBoxHD=e.arrowHead=e.fullBorder=e.fullPadding=e.fullBBox=e.sideNames=e.sideIndex=e.SOLID=e.PADDING=e.THICKNESS=e.ARROWY=e.ARROWDX=e.ARROWX=void 0,e.ARROWX=4,e.ARROWDX=1,e.ARROWY=2,e.THICKNESS=.067,e.PADDING=.2,e.SOLID=e.THICKNESS+"em solid",e.sideIndex={top:0,right:1,bottom:2,left:3},e.sideNames=Object.keys(e.sideIndex),e.fullBBox=function(t){return new Array(4).fill(t.thickness+t.padding)},e.fullPadding=function(t){return new Array(4).fill(t.padding)},e.fullBorder=function(t){return new Array(4).fill(t.thickness)};e.arrowHead=function(t){return Math.max(t.padding,t.thickness*(t.arrowhead.x+t.arrowhead.dx+1))};e.arrowBBoxHD=function(t,e){if(t.childNodes[0]){var r=t.childNodes[0].getBBox(),n=r.h,o=r.d;e[0]=e[2]=Math.max(0,t.thickness*t.arrowhead.y-(n+o)/2)}return e};e.arrowBBoxW=function(t,e){if(t.childNodes[0]){var r=t.childNodes[0].getBBox().w;e[1]=e[3]=Math.max(0,t.thickness*t.arrowhead.y-r/2)}return e},e.arrowDef={up:[-Math.PI/2,!1,!0,"verticalstrike"],down:[Math.PI/2,!1,!0,"verticakstrike"],right:[0,!1,!1,"horizontalstrike"],left:[Math.PI,!1,!1,"horizontalstrike"],updown:[Math.PI/2,!0,!0,"verticalstrike uparrow downarrow"],leftright:[0,!0,!1,"horizontalstrike leftarrow rightarrow"]},e.diagonalArrowDef={updiagonal:[-1,0,!1,"updiagonalstrike northeastarrow"],northeast:[-1,0,!1,"updiagonalstrike updiagonalarrow"],southeast:[1,0,!1,"downdiagonalstrike"],northwest:[1,Math.PI,!1,"downdiagonalstrike"],southwest:[-1,Math.PI,!1,"updiagonalstrike"],northeastsouthwest:[-1,0,!0,"updiagonalstrike northeastarrow updiagonalarrow southwestarrow"],northwestsoutheast:[1,0,!0,"downdiagonalstrike northwestarrow southeastarrow"]},e.arrowBBox={up:function(t){return(0,e.arrowBBoxW)(t,[(0,e.arrowHead)(t),0,t.padding,0])},down:function(t){return(0,e.arrowBBoxW)(t,[t.padding,0,(0,e.arrowHead)(t),0])},right:function(t){return(0,e.arrowBBoxHD)(t,[0,(0,e.arrowHead)(t),0,t.padding])},left:function(t){return(0,e.arrowBBoxHD)(t,[0,t.padding,0,(0,e.arrowHead)(t)])},updown:function(t){return(0,e.arrowBBoxW)(t,[(0,e.arrowHead)(t),0,(0,e.arrowHead)(t),0])},leftright:function(t){return(0,e.arrowBBoxHD)(t,[0,(0,e.arrowHead)(t),0,(0,e.arrowHead)(t)])}};e.CommonBorder=function(t){return function(r){var n=e.sideIndex[r];return[r,{renderer:t,bbox:function(t){var e=[0,0,0,0];return e[n]=t.thickness+t.padding,e},border:function(t){var e=[0,0,0,0];return e[n]=t.thickness,e}}]}};e.CommonBorder2=function(t){return function(r,n,o){var i=e.sideIndex[n],s=e.sideIndex[o];return[r,{renderer:t,bbox:function(t){var e=t.thickness+t.padding,r=[0,0,0,0];return r[i]=r[s]=e,r},border:function(t){var e=[0,0,0,0];return e[i]=e[s]=t.thickness,e},remove:n+" "+o}]}};e.CommonDiagonalStrike=function(t){return function(r){var n="mjx-"+r.charAt(0)+"strike";return[r+"diagonalstrike",{renderer:t(n),bbox:e.fullBBox}]}};e.CommonDiagonalArrow=function(t){return function(n){var o=r(e.diagonalArrowDef[n],4),i=o[0],s=o[1],a=o[2];return[n+"arrow",{renderer:function(e,n){var o=r(e.arrowAW(),2),l=o[0],c=o[1],u=e.arrow(c,i*(l-s),a);t(e,u)},bbox:function(t){var e=t.arrowData(),n=e.a,o=e.x,i=e.y,s=r([t.arrowhead.x,t.arrowhead.y,t.arrowhead.dx],3),a=s[0],l=s[1],c=s[2],u=r(t.getArgMod(a+c,l),2),p=u[0],h=u[1],f=i+(p>n?t.thickness*h*Math.sin(p-n):0),d=o+(p>Math.PI/2-n?t.thickness*h*Math.sin(p+n-Math.PI/2):0);return[f,d,f,d]},remove:o[3]}]}};e.CommonArrow=function(t){return function(n){var o=r(e.arrowDef[n],4),i=o[0],s=o[1],a=o[2],l=o[3];return[n+"arrow",{renderer:function(e,n){var o=e.getBBox(),l=o.w,c=o.h,u=o.d,p=r(a?[c+u,"X"]:[l,"Y"],2),h=p[0],f=p[1],d=e.getOffset(f),m=e.arrow(h,i,s,f,d);t(e,m)},bbox:e.arrowBBox[n],remove:l}]}}},3055:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonOutputJax=void 0;var l=r(2975),c=r(4474),u=r(7233),p=r(6010),h=r(8054),f=r(4139),d=function(t){function e(e,r,n){void 0===e&&(e=null),void 0===r&&(r=null),void 0===n&&(n=null);var o=this,i=s((0,u.separateOptions)(e,n.OPTIONS),2),a=i[0],l=i[1];return(o=t.call(this,a)||this).factory=o.options.wrapperFactory||new r,o.factory.jax=o,o.cssStyles=o.options.cssStyles||new f.CssStyles,o.font=o.options.font||new n(l),o.unknownCache=new Map,o}return o(e,t),e.prototype.typeset=function(t,e){this.setDocument(e);var r=this.createNode();return this.toDOM(t,r,e),r},e.prototype.createNode=function(){var t=this.constructor.NAME;return this.html("mjx-container",{class:"MathJax",jax:t})},e.prototype.setScale=function(t){var e=this.math.metrics.scale*this.options.scale;1!==e&&this.adaptor.setStyle(t,"fontSize",(0,p.percent)(e))},e.prototype.toDOM=function(t,e,r){void 0===r&&(r=null),this.setDocument(r),this.math=t,this.pxPerEm=t.metrics.ex/this.font.params.x_height,t.root.setTeXclass(null),this.setScale(e),this.nodeMap=new Map,this.container=e,this.processMath(t.root,e),this.nodeMap=null,this.executeFilters(this.postFilters,t,r,e)},e.prototype.getBBox=function(t,e){this.setDocument(e),this.math=t,t.root.setTeXclass(null),this.nodeMap=new Map;var r=this.factory.wrap(t.root).getOuterBBox();return this.nodeMap=null,r},e.prototype.getMetrics=function(t){var e,r;this.setDocument(t);var n=this.adaptor,o=this.getMetricMaps(t);try{for(var i=a(t.math),s=i.next();!s.done;s=i.next()){var l=s.value,u=n.parent(l.start.node);if(l.state()<c.STATE.METRICS&&u){var p=o[l.display?1:0].get(u),h=p.em,f=p.ex,d=p.containerWidth,m=p.lineWidth,y=p.scale,g=p.family;l.setMetrics(h,f,d,m,y),this.options.mtextInheritFont&&(l.outputData.mtextFamily=g),this.options.merrorInheritFont&&(l.outputData.merrorFamily=g),l.state(c.STATE.METRICS)}}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},e.prototype.getMetricsFor=function(t,e){var r=this.options.mtextInheritFont||this.options.merrorInheritFont,n=this.getTestElement(t,e),o=this.measureMetrics(n,r);return this.adaptor.remove(n),o},e.prototype.getMetricMaps=function(t){var e,r,n,o,i,s,l,u,p,h,f=this.adaptor,d=[new Map,new Map];try{for(var m=a(t.math),y=m.next();!y.done;y=m.next()){var g=y.value;if((A=f.parent(g.start.node))&&g.state()<c.STATE.METRICS){var b=d[g.display?1:0];b.has(A)||b.set(A,this.getTestElement(A,g.display))}}}catch(t){e={error:t}}finally{try{y&&!y.done&&(r=m.return)&&r.call(m)}finally{if(e)throw e.error}}var v=this.options.mtextInheritFont||this.options.merrorInheritFont,_=[new Map,new Map];try{for(var S=a(_.keys()),O=S.next();!O.done;O=S.next()){var M=O.value;try{for(var x=(i=void 0,a(d[M].keys())),E=x.next();!E.done;E=x.next()){var A=E.value;_[M].set(A,this.measureMetrics(d[M].get(A),v))}}catch(t){i={error:t}}finally{try{E&&!E.done&&(s=x.return)&&s.call(x)}finally{if(i)throw i.error}}}}catch(t){n={error:t}}finally{try{O&&!O.done&&(o=S.return)&&o.call(S)}finally{if(n)throw n.error}}try{for(var C=a(_.keys()),T=C.next();!T.done;T=C.next()){M=T.value;try{for(var N=(p=void 0,a(d[M].values())),w=N.next();!w.done;w=N.next()){A=w.value;f.remove(A)}}catch(t){p={error:t}}finally{try{w&&!w.done&&(h=N.return)&&h.call(N)}finally{if(p)throw p.error}}}}catch(t){l={error:t}}finally{try{T&&!T.done&&(u=C.return)&&u.call(C)}finally{if(l)throw l.error}}return _},e.prototype.getTestElement=function(t,e){var r=this.adaptor;if(!this.testInline){this.testInline=this.html("mjx-test",{style:{display:"inline-block",width:"100%","font-style":"normal","font-weight":"normal","font-size":"100%","font-size-adjust":"none","text-indent":0,"text-transform":"none","letter-spacing":"normal","word-spacing":"normal",overflow:"hidden",height:"1px","margin-right":"-1px"}},[this.html("mjx-left-box",{style:{display:"inline-block",width:0,float:"left"}}),this.html("mjx-ex-box",{style:{position:"absolute",overflow:"hidden",width:"1px",height:"60ex"}}),this.html("mjx-right-box",{style:{display:"inline-block",width:0,float:"right"}})]),this.testDisplay=r.clone(this.testInline),r.setStyle(this.testDisplay,"display","table"),r.setStyle(this.testDisplay,"margin-right",""),r.setStyle(r.firstChild(this.testDisplay),"display","none");var n=r.lastChild(this.testDisplay);r.setStyle(n,"display","table-cell"),r.setStyle(n,"width","10000em"),r.setStyle(n,"float","")}return r.append(t,r.clone(e?this.testDisplay:this.testInline))},e.prototype.measureMetrics=function(t,e){var r=this.adaptor,n=e?r.fontFamily(t):"",o=r.fontSize(t),i=s(r.nodeSize(r.childNode(t,1)),2),a=i[0],l=i[1],c=a?l/60:o*this.options.exFactor;return{em:o,ex:c,containerWidth:a?"table"===r.getStyle(t,"display")?r.nodeSize(r.lastChild(t))[0]-1:r.nodeBBox(r.lastChild(t)).left-r.nodeBBox(r.firstChild(t)).left-2:1e6,lineWidth:1e6,scale:Math.max(this.options.minScale,this.options.matchFontHeight?c/this.font.params.x_height/o:1),family:n}},e.prototype.styleSheet=function(t){var e,r;if(this.setDocument(t),this.cssStyles.clear(),this.cssStyles.addStyles(this.constructor.commonStyles),"getStyles"in t)try{for(var n=a(t.getStyles()),o=n.next();!o.done;o=n.next()){var i=o.value;this.cssStyles.addStyles(i)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this.addWrapperStyles(this.cssStyles),this.addFontStyles(this.cssStyles),this.html("style",{id:"MJX-styles"},[this.text("\n"+this.cssStyles.cssText+"\n")])},e.prototype.addFontStyles=function(t){t.addStyles(this.font.styles)},e.prototype.addWrapperStyles=function(t){var e,r;try{for(var n=a(this.factory.getKinds()),o=n.next();!o.done;o=n.next()){var i=o.value;this.addClassStyles(this.factory.getNodeClass(i),t)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},e.prototype.addClassStyles=function(t,e){e.addStyles(t.styles)},e.prototype.setDocument=function(t){t&&(this.document=t,this.adaptor.document=t.document)},e.prototype.html=function(t,e,r,n){return void 0===e&&(e={}),void 0===r&&(r=[]),this.adaptor.node(t,e,r,n)},e.prototype.text=function(t){return this.adaptor.text(t)},e.prototype.fixed=function(t,e){return void 0===e&&(e=3),Math.abs(t)<6e-4?"0":t.toFixed(e).replace(/\.?0+$/,"")},e.prototype.measureText=function(t,e,r){void 0===r&&(r=["",!1,!1]);var n=this.unknownText(t,e);if("-explicitFont"===e){var o=this.cssFontStyles(r);this.adaptor.setAttributes(n,{style:o})}return this.measureTextNodeWithCache(n,t,e,r)},e.prototype.measureTextNodeWithCache=function(t,e,r,n){void 0===n&&(n=["",!1,!1]),"-explicitFont"===r&&(r=[n[0],n[1]?"T":"F",n[2]?"T":"F",""].join("-")),this.unknownCache.has(r)||this.unknownCache.set(r,new Map);var o=this.unknownCache.get(r),i=o.get(e);if(i)return i;var s=this.measureTextNode(t);return o.set(e,s),s},e.prototype.measureXMLnode=function(t){var e=this.adaptor,r=this.html("mjx-xml-block",{style:{display:"inline-block"}},[e.clone(t)]),n=this.html("mjx-baseline",{style:{display:"inline-block",width:0,height:0}}),o=this.html("mjx-measure-xml",{style:{position:"absolute",display:"inline-block","font-family":"initial","line-height":"normal"}},[n,r]);e.append(e.parent(this.math.start.node),this.container),e.append(this.container,o);var i=this.math.metrics.em*this.math.metrics.scale,s=e.nodeBBox(r),a=s.left,l=s.right,c=s.bottom,u=s.top,p=(l-a)/i,h=(e.nodeBBox(n).top-u)/i,f=(c-u)/i-h;return e.remove(this.container),e.remove(o),{w:p,h:h,d:f}},e.prototype.cssFontStyles=function(t,e){void 0===e&&(e={});var r=s(t,3),n=r[0],o=r[1],i=r[2];return e["font-family"]=this.font.getFamily(n),o&&(e["font-style"]="italic"),i&&(e["font-weight"]="bold"),e},e.prototype.getFontData=function(t){return t||(t=new h.Styles),[this.font.getFamily(t.get("font-family")),"italic"===t.get("font-style"),"bold"===t.get("font-weight")]},e.NAME="Common",e.OPTIONS=i(i({},l.AbstractOutputJax.OPTIONS),{scale:1,minScale:.5,mtextInheritFont:!1,merrorInheritFont:!1,mtextFont:"",merrorFont:"serif",mathmlSpacing:!1,skipAttributes:{},exFactor:.5,displayAlign:"center",displayIndent:"0",wrapperFactory:null,font:null,cssStyles:null}),e.commonStyles={},e}(l.AbstractOutputJax);e.CommonOutputJax=d},7519:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),s=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),a=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return s(e,t),e},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},u=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonWrapper=void 0;var p=r(8912),h=r(9007),f=r(505),d=a(r(6010)),m=r(8054),y=r(6469),g=r(5884),b=2/18;function v(t,e){return t?e<b?0:b:e}var _=function(t){function e(e,r,n){void 0===n&&(n=null);var o=t.call(this,e,r)||this;return o.parent=null,o.removedStyles=null,o.styles=null,o.variant="",o.bboxComputed=!1,o.stretch=g.NOSTRETCH,o.font=null,o.parent=n,o.font=e.jax.font,o.bbox=y.BBox.zero(),o.getStyles(),o.getVariant(),o.getScale(),o.getSpace(),o.childNodes=r.childNodes.map((function(t){var e=o.wrap(t);return e.bbox.pwidth&&(r.notParent||r.isKind("math"))&&(o.bbox.pwidth=y.BBox.fullWidth),e})),o}return o(e,t),Object.defineProperty(e.prototype,"jax",{get:function(){return this.factory.jax},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"adaptor",{get:function(){return this.factory.jax.adaptor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"metrics",{get:function(){return this.factory.jax.math.metrics},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!this.node.notParent&&!this.node.isToken},enumerable:!1,configurable:!0}),e.prototype.wrap=function(t,e){void 0===e&&(e=null);var r=this.factory.wrap(t,e||this);return e&&e.childNodes.push(r),this.jax.nodeMap.set(t,r),r},e.prototype.getBBox=function(t){if(void 0===t&&(t=!0),this.bboxComputed)return this.bbox;var e=t?this.bbox:y.BBox.zero();return this.computeBBox(e),this.bboxComputed=t,e},e.prototype.getOuterBBox=function(t){var e,r;void 0===t&&(t=!0);var n=this.getBBox(t);if(!this.styles)return n;var o=new y.BBox;Object.assign(o,n);try{for(var i=l(y.BBox.StyleAdjust),s=i.next();!s.done;s=i.next()){var a=c(s.value,2),u=a[0],p=a[1],h=this.styles.get(u);h&&(o[p]+=this.length2em(h,1,o.rscale))}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}return o},e.prototype.computeBBox=function(t,e){var r,n;void 0===e&&(e=!1),t.empty();try{for(var o=l(this.childNodes),i=o.next();!i.done;i=o.next()){var s=i.value;t.append(s.getOuterBBox())}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}t.clean(),this.fixesPWidth&&this.setChildPWidths(e)&&this.computeBBox(t,!0)},e.prototype.setChildPWidths=function(t,e,r){var n,o;if(void 0===e&&(e=null),void 0===r&&(r=!0),t)return!1;r&&(this.bbox.pwidth="");var i=!1;try{for(var s=l(this.childNodes),a=s.next();!a.done;a=s.next()){var c=a.value,u=c.getOuterBBox();u.pwidth&&c.setChildPWidths(t,null===e?u.w:e,r)&&(i=!0)}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}return i},e.prototype.invalidateBBox=function(){this.bboxComputed&&(this.bboxComputed=!1,this.parent&&this.parent.invalidateBBox())},e.prototype.copySkewIC=function(t){var e=this.childNodes[0];(null==e?void 0:e.bbox.sk)&&(t.sk=e.bbox.sk),(null==e?void 0:e.bbox.dx)&&(t.dx=e.bbox.dx);var r=this.childNodes[this.childNodes.length-1];(null==r?void 0:r.bbox.ic)&&(t.ic=r.bbox.ic,t.w+=t.ic)},e.prototype.getStyles=function(){var t=this.node.attributes.getExplicit("style");if(t)for(var r=this.styles=new m.Styles(t),n=0,o=e.removeStyles.length;n<o;n++){var i=e.removeStyles[n];r.get(i)&&(this.removedStyles||(this.removedStyles={}),this.removedStyles[i]=r.get(i),r.set(i,""))}},e.prototype.getVariant=function(){if(this.node.isToken){var t=this.node.attributes,r=t.get("mathvariant");if(!t.getExplicit("mathvariant")){var n=t.getList("fontfamily","fontweight","fontstyle");if(this.removedStyles){var o=this.removedStyles;o.fontFamily&&(n.family=o.fontFamily),o.fontWeight&&(n.weight=o.fontWeight),o.fontStyle&&(n.style=o.fontStyle)}n.fontfamily&&(n.family=n.fontfamily),n.fontweight&&(n.weight=n.fontweight),n.fontstyle&&(n.style=n.fontstyle),n.weight&&n.weight.match(/^\d+$/)&&(n.weight=parseInt(n.weight)>600?"bold":"normal"),n.family?r=this.explicitVariant(n.family,n.weight,n.style):(this.node.getProperty("variantForm")&&(r="-tex-variant"),r=(e.BOLDVARIANTS[n.weight]||{})[r]||r,r=(e.ITALICVARIANTS[n.style]||{})[r]||r)}this.variant=r}},e.prototype.explicitVariant=function(t,e,r){var n=this.styles;return n||(n=this.styles=new m.Styles),n.set("fontFamily",t),e&&n.set("fontWeight",e),r&&n.set("fontStyle",r),"-explicitFont"},e.prototype.getScale=function(){var t=1,e=this.parent,r=e?e.bbox.scale:1,n=this.node.attributes,o=Math.min(n.get("scriptlevel"),2),i=n.get("fontsize"),s=this.node.isToken||this.node.isKind("mstyle")?n.get("mathsize"):n.getInherited("mathsize");if(0!==o){t=Math.pow(n.get("scriptsizemultiplier"),o);var a=this.length2em(n.get("scriptminsize"),.8,1);t<a&&(t=a)}this.removedStyles&&this.removedStyles.fontSize&&!i&&(i=this.removedStyles.fontSize),i&&!n.getExplicit("mathsize")&&(s=i),"1"!==s&&(t*=this.length2em(s,1,1)),this.bbox.scale=t,this.bbox.rscale=t/r},e.prototype.getSpace=function(){var t=this.isTopEmbellished(),e=this.node.hasSpacingAttributes();this.jax.options.mathmlSpacing||e?t&&this.getMathMLSpacing():this.getTeXSpacing(t,e)},e.prototype.getMathMLSpacing=function(){var t=this.node.coreMO(),e=t.coreParent(),r=e.parent;if(r&&r.isKind("mrow")&&1!==r.childNodes.length){var n=t.attributes,o=n.get("scriptlevel")>0;this.bbox.L=n.isSet("lspace")?Math.max(0,this.length2em(n.get("lspace"))):v(o,t.lspace),this.bbox.R=n.isSet("rspace")?Math.max(0,this.length2em(n.get("rspace"))):v(o,t.rspace);var i=r.childIndex(e);if(0!==i){var s=r.childNodes[i-1];if(s.isEmbellished){var a=this.jax.nodeMap.get(s).getBBox();a.R&&(this.bbox.L=Math.max(0,this.bbox.L-a.R))}}}},e.prototype.getTeXSpacing=function(t,e){if(!e){var r=this.node.texSpacing();r&&(this.bbox.L=this.length2em(r))}if(t||e){var n=this.node.coreMO().attributes;n.isSet("lspace")&&(this.bbox.L=Math.max(0,this.length2em(n.get("lspace")))),n.isSet("rspace")&&(this.bbox.R=Math.max(0,this.length2em(n.get("rspace"))))}},e.prototype.isTopEmbellished=function(){return this.node.isEmbellished&&!(this.node.parent&&this.node.parent.isEmbellished)},e.prototype.core=function(){return this.jax.nodeMap.get(this.node.core())},e.prototype.coreMO=function(){return this.jax.nodeMap.get(this.node.coreMO())},e.prototype.getText=function(){var t,e,r="";if(this.node.isToken)try{for(var n=l(this.node.childNodes),o=n.next();!o.done;o=n.next()){var i=o.value;i instanceof h.TextNode&&(r+=i.getText())}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},e.prototype.canStretch=function(t){if(this.stretch=g.NOSTRETCH,this.node.isEmbellished){var e=this.core();e&&e.node!==this.node&&e.canStretch(t)&&(this.stretch=e.stretch)}return 0!==this.stretch.dir},e.prototype.getAlignShift=function(){var t,e=(t=this.node.attributes).getList.apply(t,u([],c(h.indentAttributes),!1)),r=e.indentalign,n=e.indentshift,o=e.indentalignfirst,i=e.indentshiftfirst;return"indentalign"!==o&&(r=o),"auto"===r&&(r=this.jax.options.displayAlign),"indentshift"!==i&&(n=i),"auto"===n&&(n=this.jax.options.displayIndent,"right"!==r||n.match(/^\s*0[a-z]*\s*$/)||(n=("-"+n.trim()).replace(/^--/,""))),[r,this.length2em(n,this.metrics.containerWidth)]},e.prototype.getAlignX=function(t,e,r){return"right"===r?t-(e.w+e.R)*e.rscale:"left"===r?e.L*e.rscale:(t-e.w*e.rscale)/2},e.prototype.getAlignY=function(t,e,r,n,o){return"top"===o?t-r:"bottom"===o?n-e:"center"===o?(t-r-(e-n))/2:0},e.prototype.getWrapWidth=function(t){return this.childNodes[t].getBBox().w},e.prototype.getChildAlign=function(t){return"left"},e.prototype.percent=function(t){return d.percent(t)},e.prototype.em=function(t){return d.em(t)},e.prototype.px=function(t,e){return void 0===e&&(e=-d.BIGDIMEN),d.px(t,e,this.metrics.em)},e.prototype.length2em=function(t,e,r){return void 0===e&&(e=1),void 0===r&&(r=null),null===r&&(r=this.bbox.scale),d.length2em(t,e,r,this.jax.pxPerEm)},e.prototype.unicodeChars=function(t,e){void 0===e&&(e=this.variant);var r=(0,f.unicodeChars)(t),n=this.font.getVariant(e);if(n&&n.chars){var o=n.chars;r=r.map((function(t){return((o[t]||[])[3]||{}).smp||t}))}return r},e.prototype.remapChars=function(t){return t},e.prototype.mmlText=function(t){return this.node.factory.create("text").setText(t)},e.prototype.mmlNode=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.node.factory.create(t,e,r)},e.prototype.createMo=function(t){var e=this.node.factory,r=e.create("text").setText(t),n=e.create("mo",{stretchy:!0},[r]);n.inheritAttributesFrom(this.node);var o=this.wrap(n);return o.parent=this,o},e.prototype.getVariantChar=function(t,e){var r=this.font.getChar(t,e)||[0,0,0,{unknown:!0}];return 3===r.length&&(r[3]={}),r},e.kind="unknown",e.styles={},e.removeStyles=["fontSize","fontFamily","fontWeight","fontStyle","fontVariant","font"],e.skipAttributes={fontfamily:!0,fontsize:!0,fontweight:!0,fontstyle:!0,color:!0,background:!0,class:!0,href:!0,style:!0,xmlns:!0},e.BOLDVARIANTS={bold:{normal:"bold",italic:"bold-italic",fraktur:"bold-fraktur",script:"bold-script","sans-serif":"bold-sans-serif","sans-serif-italic":"sans-serif-bold-italic"},normal:{bold:"normal","bold-italic":"italic","bold-fraktur":"fraktur","bold-script":"script","bold-sans-serif":"sans-serif","sans-serif-bold-italic":"sans-serif-italic"}},e.ITALICVARIANTS={italic:{normal:"italic",bold:"bold-italic","sans-serif":"sans-serif-italic","bold-sans-serif":"sans-serif-bold-italic"},normal:{italic:"normal","bold-italic":"bold","sans-serif-italic":"sans-serif","sans-serif-bold-italic":"bold-sans-serif"}},e}(p.AbstractWrapper);e.CommonWrapper=_},4420:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonWrapperFactory=void 0;var i=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.jax=null,e}return o(e,t),Object.defineProperty(e.prototype,"Wrappers",{get:function(){return this.node},enumerable:!1,configurable:!0}),e.defaultNodes={},e}(r(3811).AbstractWrapperFactory);e.CommonWrapperFactory=i},9800:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTeXAtomMixin=void 0;var i=r(9007);e.CommonTeXAtomMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(e,r){if(void 0===r&&(r=!1),t.prototype.computeBBox.call(this,e,r),this.childNodes[0]&&this.childNodes[0].bbox.ic&&(e.ic=this.childNodes[0].bbox.ic),this.node.texClass===i.TEXCLASS.VCENTER){var n=e.h,o=(n+e.d)/2+this.font.params.axis_height-n;e.h+=o,e.d-=o}},e}(t)}},1160:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTextNodeMixin=void 0,e.CommonTextNodeMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.computeBBox=function(t,e){var r,n;void 0===e&&(e=!1);var s=this.parent.variant,a=this.node.getText();if("-explicitFont"===s){var l=this.jax.getFontData(this.parent.styles),c=this.jax.measureText(a,s,l),u=c.w,p=c.h,h=c.d;t.h=p,t.d=h,t.w=u}else{var f=this.remappedText(a,s);t.empty();try{for(var d=o(f),m=d.next();!m.done;m=d.next()){var y=m.value,g=i(this.getVariantChar(s,y),4),b=(p=g[0],h=g[1],u=g[2],g[3]);if(b.unknown){var v=this.jax.measureText(String.fromCodePoint(y),s);u=v.w,p=v.h,h=v.d}t.w+=u,p>t.h&&(t.h=p),h>t.d&&(t.d=h),t.ic=b.ic||0,t.sk=b.sk||0,t.dx=b.dx||0}}catch(t){r={error:t}}finally{try{m&&!m.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}f.length>1&&(t.sk=0),t.clean()}},e.prototype.remappedText=function(t,e){var r=this.parent.stretch.c;return r?[r]:this.parent.remapChars(this.unicodeChars(t,e))},e.prototype.getStyles=function(){},e.prototype.getVariant=function(){},e.prototype.getScale=function(){},e.prototype.getSpace=function(){},e}(t)}},1956:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMactionMixin=e.TooltipData=void 0;var a=r(505);e.TooltipData={dx:".2em",dy:".1em",postDelay:600,clearDelay:100,hoverTimer:new Map,clearTimer:new Map,stopTimers:function(t,e){e.clearTimer.has(t)&&(clearTimeout(e.clearTimer.get(t)),e.clearTimer.delete(t)),e.hoverTimer.has(t)&&(clearTimeout(e.hoverTimer.get(t)),e.hoverTimer.delete(t))}},e.CommonMactionMixin=function(t){return function(t){function r(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,s([],i(e),!1))||this,o=n.constructor.actions,a=n.node.attributes.get("actiontype"),l=i(o.get(a)||[function(t,e){},{}],2),c=l[0],u=l[1];return n.action=c,n.data=u,n.getParameters(),n}return o(r,t),Object.defineProperty(r.prototype,"selected",{get:function(){var t=this.node.attributes.get("selection"),e=Math.max(1,Math.min(this.childNodes.length,t))-1;return this.childNodes[e]||this.wrap(this.node.selected)},enumerable:!1,configurable:!0}),r.prototype.getParameters=function(){var t=this.node.attributes.get("data-offsets"),r=i((0,a.split)(t||""),2),n=r[0],o=r[1];this.dx=this.length2em(n||e.TooltipData.dx),this.dy=this.length2em(o||e.TooltipData.dy)},r.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),t.updateFrom(this.selected.getOuterBBox()),this.selected.setChildPWidths(e)},r}(t)}},7490:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMathMixin=void 0,e.CommonMathMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getWrapWidth=function(t){return this.parent?this.getBBox().w:this.metrics.containerWidth/this.jax.pxPerEm},e}(t)}},7313:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),s=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),a=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return s(e,t),e},l=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},c=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},u=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMencloseMixin=void 0;var p=a(r(5552)),h=r(505);e.CommonMencloseMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,c([],l(e),!1))||this;return n.notations={},n.renderChild=null,n.msqrt=null,n.padding=p.PADDING,n.thickness=p.THICKNESS,n.arrowhead={x:p.ARROWX,y:p.ARROWY,dx:p.ARROWDX},n.TRBL=[0,0,0,0],n.getParameters(),n.getNotations(),n.removeRedundantNotations(),n.initializeNotations(),n.TRBL=n.getBBoxExtenders(),n}return o(e,t),e.prototype.getParameters=function(){var t=this.node.attributes,e=t.get("data-padding");void 0!==e&&(this.padding=this.length2em(e,p.PADDING));var r=t.get("data-thickness");void 0!==r&&(this.thickness=this.length2em(r,p.THICKNESS));var n=t.get("data-arrowhead");if(void 0!==n){var o=l((0,h.split)(n),3),i=o[0],s=o[1],a=o[2];this.arrowhead={x:i?parseFloat(i):p.ARROWX,y:s?parseFloat(s):p.ARROWY,dx:a?parseFloat(a):p.ARROWDX}}},e.prototype.getNotations=function(){var t,e,r=this.constructor.notations;try{for(var n=u((0,h.split)(this.node.attributes.get("notation"))),o=n.next();!o.done;o=n.next()){var i=o.value,s=r.get(i);s&&(this.notations[i]=s,s.renderChild&&(this.renderChild=s.renderer))}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.removeRedundantNotations=function(){var t,e,r,n;try{for(var o=u(Object.keys(this.notations)),i=o.next();!i.done;i=o.next()){var s=i.value;if(this.notations[s]){var a=this.notations[s].remove||"";try{for(var l=(r=void 0,u(a.split(/ /))),c=l.next();!c.done;c=l.next()){var p=c.value;delete this.notations[p]}}catch(t){r={error:t}}finally{try{c&&!c.done&&(n=l.return)&&n.call(l)}finally{if(r)throw r.error}}}}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}},e.prototype.initializeNotations=function(){var t,e;try{for(var r=u(Object.keys(this.notations)),n=r.next();!n.done;n=r.next()){var o=n.value,i=this.notations[o].init;i&&i(this)}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=l(this.TRBL,4),n=r[0],o=r[1],i=r[2],s=r[3],a=this.childNodes[0].getBBox();t.combine(a,s,0),t.h+=n,t.d+=i,t.w+=o,this.setChildPWidths(e)},e.prototype.getBBoxExtenders=function(){var t,e,r=[0,0,0,0];try{for(var n=u(Object.keys(this.notations)),o=n.next();!o.done;o=n.next()){var i=o.value;this.maximizeEntries(r,this.notations[i].bbox(this))}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},e.prototype.getPadding=function(){var t,e,r=this,n=[0,0,0,0];try{for(var o=u(Object.keys(this.notations)),i=o.next();!i.done;i=o.next()){var s=i.value,a=this.notations[s].border;a&&this.maximizeEntries(n,a(this))}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return[0,1,2,3].map((function(t){return r.TRBL[t]-n[t]}))},e.prototype.maximizeEntries=function(t,e){for(var r=0;r<t.length;r++)t[r]<e[r]&&(t[r]=e[r])},e.prototype.getOffset=function(t){var e=l(this.TRBL,4),r=e[0],n=e[1],o=e[2],i=e[3],s=("X"===t?n-i:o-r)/2;return Math.abs(s)>.001?s:0},e.prototype.getArgMod=function(t,e){return[Math.atan2(e,t),Math.sqrt(t*t+e*e)]},e.prototype.arrow=function(t,e,r,n,o){return void 0===n&&(n=""),void 0===o&&(o=0),null},e.prototype.arrowData=function(){var t=l([this.padding,this.thickness],2),e=t[0],r=t[1]*(this.arrowhead.x+Math.max(1,this.arrowhead.dx)),n=this.childNodes[0].getBBox(),o=n.h,i=n.d,s=n.w,a=o+i,c=Math.sqrt(a*a+s*s),u=Math.max(e,r*s/c),p=Math.max(e,r*a/c),h=l(this.getArgMod(s+2*u,a+2*p),2);return{a:h[0],W:h[1],x:u,y:p}},e.prototype.arrowAW=function(){var t=this.childNodes[0].getBBox(),e=t.h,r=t.d,n=t.w,o=l(this.TRBL,4),i=o[0],s=o[1],a=o[2],c=o[3];return this.getArgMod(c+n+s,i+e+r+a)},e.prototype.createMsqrt=function(t){var e=this.node.factory.create("msqrt");e.inheritAttributesFrom(this.node),e.childNodes[0]=t.node;var r=this.wrap(e);return r.parent=this,r},e.prototype.sqrtTRBL=function(){var t=this.msqrt.getBBox(),e=this.msqrt.childNodes[0].getBBox();return[t.h-e.h,0,t.d-e.d,t.w-e.w]},e}(t)}},7555:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMfencedMixin=void 0,e.CommonMfencedMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,i([],o(e),!1))||this;return n.mrow=null,n.createMrow(),n.addMrowChildren(),n}return n(e,t),e.prototype.createMrow=function(){var t=this.node.factory.create("inferredMrow");t.inheritAttributesFrom(this.node),this.mrow=this.wrap(t),this.mrow.parent=this},e.prototype.addMrowChildren=function(){var t,e,r=this.node,n=this.mrow;this.addMo(r.open),this.childNodes.length&&n.childNodes.push(this.childNodes[0]);var o=0;try{for(var i=s(this.childNodes.slice(1)),a=i.next();!a.done;a=i.next()){var l=a.value;this.addMo(r.separators[o++]),n.childNodes.push(l)}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=i.return)&&e.call(i)}finally{if(t)throw t.error}}this.addMo(r.close),n.stretchChildren()},e.prototype.addMo=function(t){if(t){var e=this.wrap(t);this.mrow.childNodes.push(e),e.parent=this.mrow}},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),t.updateFrom(this.mrow.getOuterBBox()),this.setChildPWidths(e)},e}(t)}},2688:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMfracMixin=void 0,e.CommonMfracMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,i([],o(e),!1))||this;if(n.bevel=null,n.pad=n.node.getProperty("withDelims")?0:n.font.params.nulldelimiterspace,n.node.attributes.get("bevelled")){var s=n.getBevelData(n.isDisplay()).H,a=n.bevel=n.createMo("/");a.node.attributes.set("symmetric",!0),a.canStretch(1),a.getStretchedVariant([s],!0)}return n}return n(e,t),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),t.empty();var r=this.node.attributes.getList("linethickness","bevelled"),n=r.linethickness,o=r.bevelled,i=this.isDisplay(),s=null;if(o)this.getBevelledBBox(t,i);else{var a=this.length2em(String(n),.06);s=-2*this.pad,0===a?this.getAtopBBox(t,i):(this.getFractionBBox(t,i,a),s-=.2),s+=t.w}t.clean(),this.setChildPWidths(e,s)},e.prototype.getFractionBBox=function(t,e,r){var n=this.childNodes[0].getOuterBBox(),o=this.childNodes[1].getOuterBBox(),i=this.font.params.axis_height,s=this.getTUV(e,r),a=s.T,l=s.u,c=s.v;t.combine(n,0,i+a+Math.max(n.d*n.rscale,l)),t.combine(o,0,i-a-Math.max(o.h*o.rscale,c)),t.w+=2*this.pad+.2},e.prototype.getTUV=function(t,e){var r=this.font.params,n=r.axis_height,o=(t?3.5:1.5)*e;return{T:(t?3.5:1.5)*e,u:(t?r.num1:r.num2)-n-o,v:(t?r.denom1:r.denom2)+n-o}},e.prototype.getAtopBBox=function(t,e){var r=this.getUVQ(e),n=r.u,o=r.v,i=r.nbox,s=r.dbox;t.combine(i,0,n),t.combine(s,0,-o),t.w+=2*this.pad},e.prototype.getUVQ=function(t){var e=this.childNodes[0].getOuterBBox(),r=this.childNodes[1].getOuterBBox(),n=this.font.params,i=o(t?[n.num1,n.denom1]:[n.num3,n.denom2],2),s=i[0],a=i[1],l=(t?7:3)*n.rule_thickness,c=s-e.d*e.scale-(r.h*r.scale-a);return c<l&&(s+=(l-c)/2,a+=(l-c)/2,c=l),{u:s,v:a,q:c,nbox:e,dbox:r}},e.prototype.getBevelledBBox=function(t,e){var r=this.getBevelData(e),n=r.u,o=r.v,i=r.delta,s=r.nbox,a=r.dbox,l=this.bevel.getOuterBBox();t.combine(s,0,n),t.combine(l,t.w-i/2,0),t.combine(a,t.w-i/2,o)},e.prototype.getBevelData=function(t){var e=this.childNodes[0].getOuterBBox(),r=this.childNodes[1].getOuterBBox(),n=t?.4:.15,o=Math.max(e.scale*(e.h+e.d),r.scale*(r.h+r.d))+2*n,i=this.font.params.axis_height;return{H:o,delta:n,u:e.scale*(e.d-e.h)/2+i+n,v:r.scale*(r.d-r.h)/2+i-n,nbox:e,dbox:r}},e.prototype.canStretch=function(t){return!1},e.prototype.isDisplay=function(){var t=this.node.attributes.getList("displaystyle","scriptlevel"),e=t.displaystyle,r=t.scriptlevel;return e&&0===r},e.prototype.getWrapWidth=function(t){var e=this.node.attributes;return e.get("bevelled")?this.childNodes[t].getOuterBBox().w:this.getBBox().w-(this.length2em(e.get("linethickness"))?.2:0)-2*this.pad},e.prototype.getChildAlign=function(t){var e=this.node.attributes;return e.get("bevelled")?"left":e.get(["numalign","denomalign"][t])},e}(t)}},5636:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMglyphMixin=void 0,e.CommonMglyphMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,i([],o(e),!1))||this;return n.getParameters(),n}return n(e,t),e.prototype.getParameters=function(){var t=this.node.attributes.getList("width","height","valign","src","index"),e=t.width,r=t.height,n=t.valign,o=t.src,i=t.index;if(o)this.width="auto"===e?1:this.length2em(e),this.height="auto"===r?1:this.length2em(r),this.valign=this.length2em(n||"0");else{var s=String.fromCodePoint(parseInt(i)),a=this.node.factory;this.charWrapper=this.wrap(a.create("text").setText(s)),this.charWrapper.parent=this}},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1),this.charWrapper?t.updateFrom(this.charWrapper.getBBox()):(t.w=this.width,t.h=this.height+this.valign,t.d=-this.valign)},e}(t)}},5723:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMiMixin=void 0,e.CommonMiMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.computeBBox=function(e,r){void 0===r&&(r=!1),t.prototype.computeBBox.call(this,e),this.copySkewIC(e)},e}(t)}},8009:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMmultiscriptsMixin=e.ScriptNames=e.NextScript=void 0;var l=r(6469);e.NextScript={base:"subList",subList:"supList",supList:"subList",psubList:"psupList",psupList:"psubList"},e.ScriptNames=["sup","sup","psup","psub"],e.CommonMmultiscriptsMixin=function(t){return function(t){function r(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,s([],i(e),!1))||this;return n.scriptData=null,n.firstPrescript=0,n.getScriptData(),n}return o(r,t),r.prototype.combinePrePost=function(t,e){var r=new l.BBox(t);return r.combine(e,0,0),r},r.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.font.params.scriptspace,n=this.scriptData,o=this.combinePrePost(n.sub,n.psub),s=this.combinePrePost(n.sup,n.psup),a=i(this.getUVQ(o,s),2),l=a[0],c=a[1];if(t.empty(),n.numPrescripts&&(t.combine(n.psup,r,l),t.combine(n.psub,r,c)),t.append(n.base),n.numScripts){var u=t.w;t.combine(n.sup,u,l),t.combine(n.sub,u,c),t.w+=r}t.clean(),this.setChildPWidths(e)},r.prototype.getScriptData=function(){var t=this.scriptData={base:null,sub:l.BBox.empty(),sup:l.BBox.empty(),psub:l.BBox.empty(),psup:l.BBox.empty(),numPrescripts:0,numScripts:0},e=this.getScriptBBoxLists();this.combineBBoxLists(t.sub,t.sup,e.subList,e.supList),this.combineBBoxLists(t.psub,t.psup,e.psubList,e.psupList),t.base=e.base[0],t.numPrescripts=e.psubList.length,t.numScripts=e.subList.length},r.prototype.getScriptBBoxLists=function(){var t,r,n={base:[],subList:[],supList:[],psubList:[],psupList:[]},o="base";try{for(var i=a(this.childNodes),s=i.next();!s.done;s=i.next()){var l=s.value;l.node.isKind("mprescripts")?o="psubList":(n[o].push(l.getOuterBBox()),o=e.NextScript[o])}}catch(e){t={error:e}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}return this.firstPrescript=n.subList.length+n.supList.length+2,this.padLists(n.subList,n.supList),this.padLists(n.psubList,n.psupList),n},r.prototype.padLists=function(t,e){t.length>e.length&&e.push(l.BBox.empty())},r.prototype.combineBBoxLists=function(t,e,r,n){for(var o=0;o<r.length;o++){var s=i(this.getScaledWHD(r[o]),3),a=s[0],l=s[1],c=s[2],u=i(this.getScaledWHD(n[o]),3),p=u[0],h=u[1],f=u[2],d=Math.max(a,p);t.w+=d,e.w+=d,l>t.h&&(t.h=l),c>t.d&&(t.d=c),h>e.h&&(e.h=h),f>e.d&&(e.d=f)}},r.prototype.getScaledWHD=function(t){var e=t.w,r=t.h,n=t.d,o=t.rscale;return[e*o,r*o,n*o]},r.prototype.getUVQ=function(e,r){var n;if(!this.UVQ){var o=i([0,0,0],3),s=o[0],a=o[1],l=o[2];0===e.h&&0===e.d?s=this.getU():0===r.h&&0===r.d?s=-this.getV():(s=(n=i(t.prototype.getUVQ.call(this,e,r),3))[0],a=n[1],l=n[2]),this.UVQ=[s,a,l]}return this.UVQ},r}(t)}},5023:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMnMixin=void 0,e.CommonMnMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.remapChars=function(t){if(t.length){var e=this.font.getRemappedChar("mn",t[0]);if(e){var r=this.unicodeChars(e,this.variant);1===r.length?t[0]=r[0]:t=r.concat(t.slice(1))}}return t},e}(t)}},7096:function(t,e,r){var n,o,i=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),s=this&&this.__assign||function(){return s=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},s.apply(this,arguments)},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},l=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},c=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMoMixin=e.DirectionVH=void 0;var u=r(6469),p=r(505),h=r(5884);e.DirectionVH=((o={})[1]="v",o[2]="h",o),e.CommonMoMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,l([],a(e),!1))||this;return n.size=null,n.isAccent=n.node.isAccent,n}return i(e,t),e.prototype.computeBBox=function(t,e){if(void 0===e&&(e=!1),this.protoBBox(t),this.node.attributes.get("symmetric")&&2!==this.stretch.dir){var r=this.getCenterOffset(t);t.h+=r,t.d-=r}this.node.getProperty("mathaccent")&&(0===this.stretch.dir||this.size>=0)&&(t.w=0)},e.prototype.protoBBox=function(e){var r=0!==this.stretch.dir;r&&null===this.size&&this.getStretchedVariant([0]),r&&this.size<0||(t.prototype.computeBBox.call(this,e),this.copySkewIC(e))},e.prototype.getAccentOffset=function(){var t=u.BBox.empty();return this.protoBBox(t),-t.w/2},e.prototype.getCenterOffset=function(e){return void 0===e&&(e=null),e||(e=u.BBox.empty(),t.prototype.computeBBox.call(this,e)),(e.h+e.d)/2+this.font.params.axis_height-e.h},e.prototype.getVariant=function(){this.node.attributes.get("largeop")?this.variant=this.node.attributes.get("displaystyle")?"-largeop":"-smallop":this.node.attributes.getExplicit("mathvariant")||!1!==this.node.getProperty("pseudoscript")?t.prototype.getVariant.call(this):this.variant="-tex-variant"},e.prototype.canStretch=function(t){if(0!==this.stretch.dir)return this.stretch.dir===t;if(!this.node.attributes.get("stretchy"))return!1;var e=this.getText();if(1!==Array.from(e).length)return!1;var r=this.font.getDelimiter(e.codePointAt(0));return this.stretch=r&&r.dir===t?r:h.NOSTRETCH,0!==this.stretch.dir},e.prototype.getStretchedVariant=function(t,e){var r,n;if(void 0===e&&(e=!1),0!==this.stretch.dir){var o=this.getWH(t),i=this.getSize("minsize",0),a=this.getSize("maxsize",1/0),l=this.node.getProperty("mathaccent");o=Math.max(i,Math.min(a,o));var u=this.font.params.delimiterfactor/1e3,p=this.font.params.delimitershortfall,h=i||e?o:l?Math.min(o/u,o+p):Math.max(o*u,o-p),f=this.stretch,d=f.c||this.getText().codePointAt(0),m=0;if(f.sizes)try{for(var y=c(f.sizes),g=y.next();!g.done;g=y.next()){if(g.value>=h)return l&&m&&m--,this.variant=this.font.getSizeVariant(d,m),this.size=m,void(f.schar&&f.schar[m]&&(this.stretch=s(s({},this.stretch),{c:f.schar[m]})));m++}}catch(t){r={error:t}}finally{try{g&&!g.done&&(n=y.return)&&n.call(y)}finally{if(r)throw r.error}}f.stretch?(this.size=-1,this.invalidateBBox(),this.getStretchBBox(t,this.checkExtendedHeight(o,f),f)):(this.variant=this.font.getSizeVariant(d,m-1),this.size=m-1)}},e.prototype.getSize=function(t,e){var r=this.node.attributes;return r.isSet(t)&&(e=this.length2em(r.get(t),1,1)),e},e.prototype.getWH=function(t){if(0===t.length)return 0;if(1===t.length)return t[0];var e=a(t,2),r=e[0],n=e[1],o=this.font.params.axis_height;return this.node.attributes.get("symmetric")?2*Math.max(r-o,n+o):r+n},e.prototype.getStretchBBox=function(t,e,r){var n;r.hasOwnProperty("min")&&r.min>e&&(e=r.min);var o=a(r.HDW,3),i=o[0],s=o[1],l=o[2];1===this.stretch.dir?(i=(n=a(this.getBaseline(t,e,r),2))[0],s=n[1]):l=e,this.bbox.h=i,this.bbox.d=s,this.bbox.w=l},e.prototype.getBaseline=function(t,e,r){var n=2===t.length&&t[0]+t[1]===e,o=this.node.attributes.get("symmetric"),i=a(n?t:[e,0],2),s=i[0],l=i[1],c=a([s+l,0],2),u=c[0],p=c[1];if(o){var h=this.font.params.axis_height;n&&(u=2*Math.max(s-h,l+h)),p=u/2-h}else if(n)p=l;else{var f=a(r.HDW||[.75,.25],2),d=f[0],m=f[1];p=m*(u/(d+m))}return[u-p,p]},e.prototype.checkExtendedHeight=function(t,e){if(e.fullExt){var r=a(e.fullExt,2),n=r[0],o=r[1];t=o+Math.ceil(Math.max(0,t-o)/n)*n}return t},e.prototype.remapChars=function(t){var e=this.node.getProperty("primes");if(e)return(0,p.unicodeChars)(e);if(1===t.length){var r=this.node.coreParent().parent,n=this.isAccent&&!r.isKind("mrow")?"accent":"mo",o=this.font.getRemappedChar(n,t[0]);o&&(t=this.unicodeChars(o,this.variant))}return t},e}(t)}},6898:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMpaddedMixin=void 0,e.CommonMpaddedMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getDimens=function(){var t=this.node.attributes.getList("width","height","depth","lspace","voffset"),e=this.childNodes[0].getBBox(),r=e.w,n=e.h,o=e.d,i=r,s=n,a=o,l=0,c=0,u=0;""!==t.width&&(r=this.dimen(t.width,e,"w",0)),""!==t.height&&(n=this.dimen(t.height,e,"h",0)),""!==t.depth&&(o=this.dimen(t.depth,e,"d",0)),""!==t.voffset&&(c=this.dimen(t.voffset,e)),""!==t.lspace&&(l=this.dimen(t.lspace,e));var p=this.node.attributes.get("data-align");return p&&(u=this.getAlignX(r,e,p)),[s,a,i,n-s,o-a,r-i,l,c,u]},e.prototype.dimen=function(t,e,r,n){void 0===r&&(r=""),void 0===n&&(n=null);var o=(t=String(t)).match(/width|height|depth/),i=o?e[o[0].charAt(0)]:r?e[r]:0,s=this.length2em(t,i)||0;return t.match(/^[-+]/)&&r&&(s+=i),null!=n&&(s=Math.max(n,s)),s},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=o(this.getDimens(),6),n=r[0],i=r[1],s=r[2],a=r[3],l=r[4],c=r[5];t.w=s+c,t.h=n+a,t.d=i+l,this.setChildPWidths(e,t.w)},e.prototype.getWrapWidth=function(t){return this.getBBox().w},e.prototype.getChildAlign=function(t){return this.node.attributes.get("data-align")||"left"},e}(t)}},6991:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMrootMixin=void 0,e.CommonMrootMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"surd",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"root",{get:function(){return 1},enumerable:!1,configurable:!0}),e.prototype.combineRootBBox=function(t,e,r){var n=this.childNodes[this.root].getOuterBBox(),o=this.getRootDimens(e,r)[1];t.combine(n,0,o)},e.prototype.getRootDimens=function(t,e){var r=this.childNodes[this.surd],n=this.childNodes[this.root].getOuterBBox(),o=(r.size<0?.5:.6)*t.w,i=n.w,s=n.rscale,a=Math.max(i,o/s),l=Math.max(0,a-i);return[a*s-o,this.rootHeight(n,t,r.size,e),l]},e.prototype.rootHeight=function(t,e,r,n){var o=e.h+e.d;return(r<0?1.9:.55*o)-(o-n)+Math.max(0,t.d*t.rscale)},e}(t)}},8411:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonInferredMrowMixin=e.CommonMrowMixin=void 0;var l=r(6469);e.CommonMrowMixin=function(t){return function(t){function e(){for(var e,r,n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];var c=t.apply(this,s([],i(n),!1))||this;c.stretchChildren();try{for(var u=a(c.childNodes),p=u.next();!p.done;p=u.next()){var h=p.value;if(h.bbox.pwidth){c.bbox.pwidth=l.BBox.fullWidth;break}}}catch(t){e={error:t}}finally{try{p&&!p.done&&(r=u.return)&&r.call(u)}finally{if(e)throw e.error}}return c}return o(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.stretchChildren=function(){var t,e,r,n,o,i,s=[];try{for(var l=a(this.childNodes),c=l.next();!c.done;c=l.next()){(x=c.value).canStretch(1)&&s.push(x)}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}var u=s.length,p=this.childNodes.length;if(u&&p>1){var h=0,f=0,d=u>1&&u===p;try{for(var m=a(this.childNodes),y=m.next();!y.done;y=m.next()){var g=0===(x=y.value).stretch.dir;if(d||g){var b=x.getOuterBBox(g),v=b.h,_=b.d,S=b.rscale;(v*=S)>h&&(h=v),(_*=S)>f&&(f=_)}}}catch(t){r={error:t}}finally{try{y&&!y.done&&(n=m.return)&&n.call(m)}finally{if(r)throw r.error}}try{for(var O=a(s),M=O.next();!M.done;M=O.next()){var x;(x=M.value).coreMO().getStretchedVariant([h,f])}}catch(t){o={error:t}}finally{try{M&&!M.done&&(i=O.return)&&i.call(O)}finally{if(o)throw o.error}}}},e}(t)},e.CommonInferredMrowMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getScale=function(){this.bbox.scale=this.parent.bbox.scale,this.bbox.rscale=1},e}(t)}},4126:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsMixin=void 0,e.CommonMsMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,i([],o(e),!1))||this,s=n.node.attributes,a=s.getList("lquote","rquote");return"monospace"!==n.variant&&(s.isSet("lquote")||'"'!==a.lquote||(a.lquote="\u201c"),s.isSet("rquote")||'"'!==a.rquote||(a.rquote="\u201d")),n.childNodes.unshift(n.createText(a.lquote)),n.childNodes.push(n.createText(a.rquote)),n}return n(e,t),e.prototype.createText=function(t){var e=this.wrap(this.mmlText(t));return e.parent=this,e},e}(t)}},258:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMspaceMixin=void 0,e.CommonMspaceMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.node.attributes;t.w=this.length2em(r.get("width"),0),t.h=this.length2em(r.get("height"),0),t.d=this.length2em(r.get("depth"),0)},e.prototype.handleVariant=function(){},e}(t)}},4093:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsqrtMixin=void 0;var a=r(6469);e.CommonMsqrtMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,s([],i(e),!1))||this,o=n.createMo("\u221a");o.canStretch(1);var a=n.childNodes[n.base].getOuterBBox(),l=a.h,c=a.d,u=n.font.params.rule_thickness,p=n.node.attributes.get("displaystyle")?n.font.params.x_height:u;return n.surdH=l+c+2*u+p/4,o.getStretchedVariant([n.surdH-c,c],!0),n}return o(e,t),Object.defineProperty(e.prototype,"base",{get:function(){return 0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"surd",{get:function(){return 1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"root",{get:function(){return null},enumerable:!1,configurable:!0}),e.prototype.createMo=function(e){var r=t.prototype.createMo.call(this,e);return this.childNodes.push(r),r},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.childNodes[this.surd].getBBox(),n=new a.BBox(this.childNodes[this.base].getOuterBBox()),o=this.getPQ(r)[1],s=this.font.params.rule_thickness,l=n.h+o+s,c=i(this.getRootDimens(r,l),1)[0];t.h=l+s,this.combineRootBBox(t,r,l),t.combine(r,c,l-r.h),t.combine(n,c+r.w,0),t.clean(),this.setChildPWidths(e)},e.prototype.combineRootBBox=function(t,e,r){},e.prototype.getPQ=function(t){var e=this.font.params.rule_thickness,r=this.node.attributes.get("displaystyle")?this.font.params.x_height:e;return[r,t.h+t.d>this.surdH?(t.h+t.d-(this.surdH-2*e-r/2))/2:e+r/4]},e.prototype.getRootDimens=function(t,e){return[0,0,0,0]},e}(t)}},905:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsubsupMixin=e.CommonMsupMixin=e.CommonMsubMixin=void 0,e.CommonMsubMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.sub]},enumerable:!1,configurable:!0}),e.prototype.getOffset=function(){return[0,-this.getV()]},e}(t),e.useIC=!1,e},e.CommonMsupMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.sup]},enumerable:!1,configurable:!0}),e.prototype.getOffset=function(){return[this.getAdjustedIc()-(this.baseRemoveIc?0:this.baseIc),this.getU()]},e}(t)},e.CommonMsubsupMixin=function(t){var e;return e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.UVQ=null,e}return n(e,t),Object.defineProperty(e.prototype,"subChild",{get:function(){return this.childNodes[this.node.sub]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"supChild",{get:function(){return this.childNodes[this.node.sup]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.baseChild.getOuterBBox(),n=o([this.subChild.getOuterBBox(),this.supChild.getOuterBBox()],2),i=n[0],s=n[1];t.empty(),t.append(r);var a=this.getBaseWidth(),l=this.getAdjustedIc(),c=o(this.getUVQ(),2),u=c[0],p=c[1];t.combine(i,a,p),t.combine(s,a+l,u),t.w+=this.font.params.scriptspace,t.clean(),this.setChildPWidths(e)},e.prototype.getUVQ=function(t,e){void 0===t&&(t=this.subChild.getOuterBBox()),void 0===e&&(e=this.supChild.getOuterBBox());var r=this.baseCore.getOuterBBox();if(this.UVQ)return this.UVQ;var n=this.font.params,i=3*n.rule_thickness,s=this.length2em(this.node.attributes.get("subscriptshift"),n.sub2),a=this.baseCharZero(r.d*this.baseScale+n.sub_drop*t.rscale),l=o([this.getU(),Math.max(a,s)],2),c=l[0],u=l[1],p=c-e.d*e.rscale-(t.h*t.rscale-u);if(p<i){u+=i-p;var h=.8*n.x_height-(c-e.d*e.rscale);h>0&&(c+=h,u-=h)}return c=Math.max(this.length2em(this.node.attributes.get("superscriptshift"),c),c),u=Math.max(this.length2em(this.node.attributes.get("subscriptshift"),u),u),p=c-e.d*e.rscale-(t.h*t.rscale-u),this.UVQ=[c,-u,p],this.UVQ},e}(t),e.useIC=!1,e}},6237:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtableMixin=void 0;var l=r(6469),c=r(505),u=r(7875);e.CommonMtableMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,s([],i(e),!1))||this;n.numCols=0,n.numRows=0,n.data=null,n.pwidthCells=[],n.pWidth=0,n.numCols=(0,u.max)(n.tableRows.map((function(t){return t.numCells}))),n.numRows=n.childNodes.length,n.hasLabels=n.childNodes.reduce((function(t,e){return t||e.node.isKind("mlabeledtr")}),!1),n.findContainer(),n.isTop=!n.container||n.container.node.isKind("math")&&!n.container.parent,n.isTop&&(n.jax.table=n),n.getPercentageWidth();var o=n.node.attributes;return n.frame="none"!==o.get("frame"),n.fLine=n.frame&&o.get("frame")?.07:0,n.fSpace=n.frame?n.convertLengths(n.getAttributeArray("framespacing")):[0,0],n.cSpace=n.convertLengths(n.getColumnAttributes("columnspacing")),n.rSpace=n.convertLengths(n.getRowAttributes("rowspacing")),n.cLines=n.getColumnAttributes("columnlines").map((function(t){return"none"===t?0:.07})),n.rLines=n.getRowAttributes("rowlines").map((function(t){return"none"===t?0:.07})),n.cWidths=n.getColumnWidths(),n.stretchRows(),n.stretchColumns(),n}return o(e,t),Object.defineProperty(e.prototype,"tableRows",{get:function(){return this.childNodes},enumerable:!1,configurable:!0}),e.prototype.findContainer=function(){for(var t=this,e=t.parent;e&&(e.node.notParent||e.node.isKind("mrow"));)t=e,e=e.parent;this.container=e,this.containerI=t.node.childPosition()},e.prototype.getPercentageWidth=function(){if(this.hasLabels)this.bbox.pwidth=l.BBox.fullWidth;else{var t=this.node.attributes.get("width");(0,c.isPercent)(t)&&(this.bbox.pwidth=t)}},e.prototype.stretchRows=function(){for(var t=this.node.attributes.get("equalrows"),e=t?this.getEqualRowHeight():0,r=t?this.getTableData():{H:[0],D:[0]},n=r.H,o=r.D,i=this.tableRows,s=0;s<this.numRows;s++){var a=t?[(e+n[s]-o[s])/2,(e-n[s]+o[s])/2]:null;i[s].stretchChildren(a)}},e.prototype.stretchColumns=function(){for(var t=0;t<this.numCols;t++){var e="number"==typeof this.cWidths[t]?this.cWidths[t]:null;this.stretchColumn(t,e)}},e.prototype.stretchColumn=function(t,e){var r,n,o,i,s,l,c=[];try{for(var u=a(this.tableRows),p=u.next();!p.done;p=u.next()){if(g=p.value.getChild(t))0===(O=g.childNodes[0]).stretch.dir&&O.canStretch(2)&&c.push(O)}}catch(t){r={error:t}}finally{try{p&&!p.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}var h=c.length,f=this.childNodes.length;if(h&&f>1){if(null===e){e=0;var d=h>1&&h===f;try{for(var m=a(this.tableRows),y=m.next();!y.done;y=m.next()){var g;if(g=y.value.getChild(t)){var b=0===(O=g.childNodes[0]).stretch.dir;if(d||b){var v=O.getBBox(b).w;v>e&&(e=v)}}}}catch(t){o={error:t}}finally{try{y&&!y.done&&(i=m.return)&&i.call(m)}finally{if(o)throw o.error}}}try{for(var _=a(c),S=_.next();!S.done;S=_.next()){var O;(O=S.value).coreMO().getStretchedVariant([e])}}catch(t){s={error:t}}finally{try{S&&!S.done&&(l=_.return)&&l.call(_)}finally{if(s)throw s.error}}}},e.prototype.getTableData=function(){if(this.data)return this.data;for(var t=new Array(this.numRows).fill(0),e=new Array(this.numRows).fill(0),r=new Array(this.numCols).fill(0),n=new Array(this.numRows),o=new Array(this.numRows),i=[0],s=this.tableRows,a=0;a<s.length;a++){for(var l=0,c=s[a],u=c.node.attributes.get("rowalign"),p=0;p<c.numCells;p++){var h=c.getChild(p);l=this.updateHDW(h,p,a,u,t,e,r,l),this.recordPWidthCell(h,p)}n[a]=t[a],o[a]=e[a],c.labeled&&(l=this.updateHDW(c.childNodes[0],0,a,u,t,e,i,l)),this.extendHD(a,t,e,l),this.extendHD(a,n,o,l)}var f=i[0];return this.data={H:t,D:e,W:r,NH:n,ND:o,L:f},this.data},e.prototype.updateHDW=function(t,e,r,n,o,i,s,a){var l=t.getBBox(),c=l.h,u=l.d,p=l.w,h=t.parent.bbox.rscale;1!==t.parent.bbox.rscale&&(c*=h,u*=h,p*=h),this.node.getProperty("useHeight")&&(c<.75&&(c=.75),u<.25&&(u=.25));var f=0;return"baseline"!==(n=t.node.attributes.get("rowalign")||n)&&"axis"!==n&&(f=c+u,c=u=0),c>o[r]&&(o[r]=c),u>i[r]&&(i[r]=u),f>a&&(a=f),s&&p>s[e]&&(s[e]=p),a},e.prototype.extendHD=function(t,e,r,n){var o=(n-(e[t]+r[t]))/2;o<1e-5||(e[t]+=o,r[t]+=o)},e.prototype.recordPWidthCell=function(t,e){t.childNodes[0]&&t.childNodes[0].getBBox().pwidth&&this.pwidthCells.push([t,e])},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r,n,o=this.getTableData(),s=o.H,a=o.D;if(this.node.attributes.get("equalrows")){var l=this.getEqualRowHeight();r=(0,u.sum)([].concat(this.rLines,this.rSpace))+l*this.numRows}else r=(0,u.sum)(s.concat(a,this.rLines,this.rSpace));r+=2*(this.fLine+this.fSpace[1]);var p=this.getComputedWidths();n=(0,u.sum)(p.concat(this.cLines,this.cSpace))+2*(this.fLine+this.fSpace[0]);var h=this.node.attributes.get("width");"auto"!==h&&(n=Math.max(this.length2em(h,0)+2*this.fLine,n));var f=i(this.getBBoxHD(r),2),d=f[0],m=f[1];t.h=d,t.d=m,t.w=n;var y=i(this.getBBoxLR(),2),g=y[0],b=y[1];t.L=g,t.R=b,(0,c.isPercent)(h)||this.setColumnPWidths()},e.prototype.setChildPWidths=function(t,e,r){var n=this.node.attributes.get("width");if(!(0,c.isPercent)(n))return!1;this.hasLabels||(this.bbox.pwidth="",this.container.bbox.pwidth="");var o=this.bbox,i=o.w,s=o.L,a=o.R,l=this.node.attributes.get("data-width-includes-label"),p=Math.max(i,this.length2em(n,Math.max(e,s+i+a)))-(l?s+a:0),h=this.node.attributes.get("equalcolumns")?Array(this.numCols).fill(this.percent(1/Math.max(1,this.numCols))):this.getColumnAttributes("columnwidth",0);this.cWidths=this.getColumnWidthsFixed(h,p);var f=this.getComputedWidths();return this.pWidth=(0,u.sum)(f.concat(this.cLines,this.cSpace))+2*(this.fLine+this.fSpace[0]),this.isTop&&(this.bbox.w=this.pWidth),this.setColumnPWidths(),this.pWidth!==i&&this.parent.invalidateBBox(),this.pWidth!==i},e.prototype.setColumnPWidths=function(){var t,e,r=this.cWidths;try{for(var n=a(this.pwidthCells),o=n.next();!o.done;o=n.next()){var s=i(o.value,2),l=s[0],c=s[1];l.setChildPWidths(!1,r[c])&&(l.invalidateBBox(),l.getBBox())}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.getBBoxHD=function(t){var e=i(this.getAlignmentRow(),2),r=e[0],n=e[1];if(null===n){var o=this.font.params.axis_height,s=t/2;return{top:[0,t],center:[s,s],bottom:[t,0],baseline:[s,s],axis:[s+o,s-o]}[r]||[s,s]}var a=this.getVerticalPosition(n,r);return[a,t-a]},e.prototype.getBBoxLR=function(){if(this.hasLabels){var t=this.node.attributes,e=t.get("side"),r=i(this.getPadAlignShift(e),2),n=r[0],o=r[1],s=this.hasLabels&&!!t.get("data-width-includes-label");return s&&this.frame&&this.fSpace[0]&&(n-=this.fSpace[0]),"center"!==o||s?"left"===e?[n,0]:[0,n]:[n,n]}return[0,0]},e.prototype.getPadAlignShift=function(t){var e=this.getTableData().L+this.length2em(this.node.attributes.get("minlabelspacing")),r=i(null==this.styles?["",""]:[this.styles.get("padding-left"),this.styles.get("padding-right")],2),n=r[0],o=r[1];(n||o)&&(e=Math.max(e,this.length2em(n||"0"),this.length2em(o||"0")));var s=i(this.getAlignShift(),2),a=s[0],l=s[1];return a===t&&(l="left"===t?Math.max(e,l)-e:Math.min(-e,l)+e),[e,a,l]},e.prototype.getAlignShift=function(){return this.isTop?t.prototype.getAlignShift.call(this):[this.container.getChildAlign(this.containerI),0]},e.prototype.getWidth=function(){return this.pWidth||this.getBBox().w},e.prototype.getEqualRowHeight=function(){var t=this.getTableData(),e=t.H,r=t.D,n=Array.from(e.keys()).map((function(t){return e[t]+r[t]}));return Math.max.apply(Math,n)},e.prototype.getComputedWidths=function(){var t=this,e=this.getTableData().W,r=Array.from(e.keys()).map((function(r){return"number"==typeof t.cWidths[r]?t.cWidths[r]:e[r]}));return this.node.attributes.get("equalcolumns")&&(r=Array(r.length).fill((0,u.max)(r))),r},e.prototype.getColumnWidths=function(){var t=this.node.attributes.get("width");if(this.node.attributes.get("equalcolumns"))return this.getEqualColumns(t);var e=this.getColumnAttributes("columnwidth",0);return"auto"===t?this.getColumnWidthsAuto(e):(0,c.isPercent)(t)?this.getColumnWidthsPercent(e):this.getColumnWidthsFixed(e,this.length2em(t))},e.prototype.getEqualColumns=function(t){var e,r=Math.max(1,this.numCols);if("auto"===t){var n=this.getTableData().W;e=(0,u.max)(n)}else if((0,c.isPercent)(t))e=this.percent(1/r);else{var o=(0,u.sum)([].concat(this.cLines,this.cSpace))+2*this.fSpace[0];e=Math.max(0,this.length2em(t)-o)/r}return Array(this.numCols).fill(e)},e.prototype.getColumnWidthsAuto=function(t){var e=this;return t.map((function(t){return"auto"===t||"fit"===t?null:(0,c.isPercent)(t)?t:e.length2em(t)}))},e.prototype.getColumnWidthsPercent=function(t){var e=this,r=t.indexOf("fit")>=0,n=(r?this.getTableData():{W:null}).W;return Array.from(t.keys()).map((function(o){var i=t[o];return"fit"===i?null:"auto"===i?r?n[o]:null:(0,c.isPercent)(i)?i:e.length2em(i)}))},e.prototype.getColumnWidthsFixed=function(t,e){var r=this,n=Array.from(t.keys()),o=n.filter((function(e){return"fit"===t[e]})),i=n.filter((function(e){return"auto"===t[e]})),s=o.length||i.length,a=(s?this.getTableData():{W:null}).W,l=e-(0,u.sum)([].concat(this.cLines,this.cSpace))-2*this.fSpace[0],c=l;n.forEach((function(e){var n=t[e];c-="fit"===n||"auto"===n?a[e]:r.length2em(n,l)}));var p=s&&c>0?c/s:0;return n.map((function(e){var n=t[e];return"fit"===n?a[e]+p:"auto"===n?a[e]+(0===o.length?p:0):r.length2em(n,l)}))},e.prototype.getVerticalPosition=function(t,e){for(var r=this.node.attributes.get("equalrows"),n=this.getTableData(),o=n.H,s=n.D,a=r?this.getEqualRowHeight():0,l=this.getRowHalfSpacing(),c=this.fLine,u=0;u<t;u++)c+=l[u]+(r?a:o[u]+s[u])+l[u+1]+this.rLines[u];var p=i(r?[(a+o[t]-s[t])/2,(a-o[t]+s[t])/2]:[o[t],s[t]],2),h=p[0],f=p[1];return c+={top:0,center:l[t]+(h+f)/2,bottom:l[t]+h+f+l[t+1],baseline:l[t]+h,axis:l[t]+h-.25}[e]||0},e.prototype.getEmHalfSpacing=function(t,e,r){void 0===r&&(r=1);var n=this.em(t*r),o=this.addEm(e,2/r);return o.unshift(n),o.push(n),o},e.prototype.getRowHalfSpacing=function(){var t=this.rSpace.map((function(t){return t/2}));return t.unshift(this.fSpace[1]),t.push(this.fSpace[1]),t},e.prototype.getColumnHalfSpacing=function(){var t=this.cSpace.map((function(t){return t/2}));return t.unshift(this.fSpace[0]),t.push(this.fSpace[0]),t},e.prototype.getAlignmentRow=function(){var t=i((0,c.split)(this.node.attributes.get("align")),2),e=t[0],r=t[1];if(null==r)return[e,null];var n=parseInt(r);return n<0&&(n+=this.numRows+1),[e,n<1||n>this.numRows?null:n-1]},e.prototype.getColumnAttributes=function(t,e){void 0===e&&(e=1);var r=this.numCols-e,n=this.getAttributeArray(t);if(0===n.length)return null;for(;n.length<r;)n.push(n[n.length-1]);return n.length>r&&n.splice(r),n},e.prototype.getRowAttributes=function(t,e){void 0===e&&(e=1);var r=this.numRows-e,n=this.getAttributeArray(t);if(0===n.length)return null;for(;n.length<r;)n.push(n[n.length-1]);return n.length>r&&n.splice(r),n},e.prototype.getAttributeArray=function(t){var e=this.node.attributes.get(t);return e?(0,c.split)(e):[this.node.attributes.getDefault(t)]},e.prototype.addEm=function(t,e){var r=this;return void 0===e&&(e=1),t?t.map((function(t){return r.em(t/e)})):null},e.prototype.convertLengths=function(t){var e=this;return t?t.map((function(t){return e.length2em(t)})):null},e}(t)}},5164:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtdMixin=void 0,e.CommonMtdMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.invalidateBBox=function(){this.bboxComputed=!1},e.prototype.getWrapWidth=function(t){var e=this.parent.parent,r=this.parent,n=this.node.childPosition()-(r.labeled?1:0);return"number"==typeof e.cWidths[n]?e.cWidths[n]:e.getTableData().W[n]},e.prototype.getChildAlign=function(t){return this.node.attributes.get("columnalign")},e}(t)}},6319:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtextMixin=void 0,e.CommonMtextMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getVariant=function(){var e=this.jax.options,r=this.jax.math.outputData,n=(!!r.merrorFamily||!!e.merrorFont)&&this.node.Parent.isKind("merror");if(r.mtextFamily||e.mtextFont||n){var o=this.node.attributes.get("mathvariant"),i=this.constructor.INHERITFONTS[o]||this.jax.font.getCssFont(o),s=i[0]||(n?r.merrorFamily||e.merrorFont:r.mtextFamily||e.mtextFont);this.variant=this.explicitVariant(s,i[2]?"bold":"",i[1]?"italic":"")}else t.prototype.getVariant.call(this)},e}(t),e.INHERITFONTS={normal:["",!1,!1],bold:["",!1,!0],italic:["",!0,!1],"bold-italic":["",!0,!0]},e}},5766:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMlabeledtrMixin=e.CommonMtrMixin=void 0,e.CommonMtrMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"numCells",{get:function(){return this.childNodes.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"labeled",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tableCells",{get:function(){return this.childNodes},enumerable:!1,configurable:!0}),e.prototype.getChild=function(t){return this.childNodes[t]},e.prototype.getChildBBoxes=function(){return this.childNodes.map((function(t){return t.getBBox()}))},e.prototype.stretchChildren=function(t){var e,r,n,i,s,a;void 0===t&&(t=null);var l=[],c=this.labeled?this.childNodes.slice(1):this.childNodes;try{for(var u=o(c),p=u.next();!p.done;p=u.next()){(E=p.value.childNodes[0]).canStretch(1)&&l.push(E)}}catch(t){e={error:t}}finally{try{p&&!p.done&&(r=u.return)&&r.call(u)}finally{if(e)throw e.error}}var h=l.length,f=this.childNodes.length;if(h&&f>1){if(null===t){var d=0,m=0,y=h>1&&h===f;try{for(var g=o(c),b=g.next();!b.done;b=g.next()){var v=0===(E=b.value.childNodes[0]).stretch.dir;if(y||v){var _=E.getBBox(v),S=_.h,O=_.d;S>d&&(d=S),O>m&&(m=O)}}}catch(t){n={error:t}}finally{try{b&&!b.done&&(i=g.return)&&i.call(g)}finally{if(n)throw n.error}}t=[d,m]}try{for(var M=o(l),x=M.next();!x.done;x=M.next()){var E;(E=x.value).coreMO().getStretchedVariant(t)}}catch(t){s={error:t}}finally{try{x&&!x.done&&(a=M.return)&&a.call(M)}finally{if(s)throw s.error}}}},e}(t)},e.CommonMlabeledtrMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"numCells",{get:function(){return Math.max(0,this.childNodes.length-1)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"labeled",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tableCells",{get:function(){return this.childNodes.slice(1)},enumerable:!1,configurable:!0}),e.prototype.getChild=function(t){return this.childNodes[t+1]},e.prototype.getChildBBoxes=function(){return this.childNodes.slice(1).map((function(t){return t.getBBox()}))},e}(t)}},1971:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMunderoverMixin=e.CommonMoverMixin=e.CommonMunderMixin=void 0,e.CommonMunderMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,i([],o(e),!1))||this;return n.stretchChildren(),n}return n(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.under]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(e,r){if(void 0===r&&(r=!1),this.hasMovableLimits())t.prototype.computeBBox.call(this,e,r);else{e.empty();var n=this.baseChild.getOuterBBox(),i=this.scriptChild.getOuterBBox(),s=this.getUnderKV(n,i)[1],a=this.isLineBelow?0:this.getDelta(!0),l=o(this.getDeltaW([n,i],[0,-a]),2),c=l[0],u=l[1];e.combine(n,c,0),e.combine(i,u,s),e.d+=this.font.params.big_op_spacing5,e.clean(),this.setChildPWidths(r)}},e}(t)},e.CommonMoverMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,i([],o(e),!1))||this;return n.stretchChildren(),n}return n(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.over]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(e){if(this.hasMovableLimits())t.prototype.computeBBox.call(this,e);else{e.empty();var r=this.baseChild.getOuterBBox(),n=this.scriptChild.getOuterBBox();this.node.attributes.get("accent")&&(r.h=Math.max(r.h,this.font.params.x_height*r.scale));var i=this.getOverKU(r,n)[1],s=this.isLineAbove?0:this.getDelta(),a=o(this.getDeltaW([r,n],[0,s]),2),l=a[0],c=a[1];e.combine(r,l,0),e.combine(n,c,i),e.h+=this.font.params.big_op_spacing5,e.clean()}},e}(t)},e.CommonMunderoverMixin=function(t){return function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,i([],o(e),!1))||this;return n.stretchChildren(),n}return n(e,t),Object.defineProperty(e.prototype,"underChild",{get:function(){return this.childNodes[this.node.under]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overChild",{get:function(){return this.childNodes[this.node.over]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"subChild",{get:function(){return this.underChild},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"supChild",{get:function(){return this.overChild},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(e){if(this.hasMovableLimits())t.prototype.computeBBox.call(this,e);else{e.empty();var r=this.overChild.getOuterBBox(),n=this.baseChild.getOuterBBox(),i=this.underChild.getOuterBBox();this.node.attributes.get("accent")&&(n.h=Math.max(n.h,this.font.params.x_height*n.scale));var s=this.getOverKU(n,r)[1],a=this.getUnderKV(n,i)[1],l=this.getDelta(),c=o(this.getDeltaW([n,i,r],[0,this.isLineBelow?0:-l,this.isLineAbove?0:l]),3),u=c[0],p=c[1],h=c[2];e.combine(n,u,0),e.combine(r,h,s),e.combine(i,p,a);var f=this.font.params.big_op_spacing5;e.h+=f,e.d+=f,e.clean()}},e}(t)}},167:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonScriptbaseMixin=void 0;var l=r(9007);e.CommonScriptbaseMixin=function(t){var e;return e=function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,s([],i(e),!1))||this;n.baseScale=1,n.baseIc=0,n.baseRemoveIc=!1,n.baseIsChar=!1,n.baseHasAccentOver=null,n.baseHasAccentUnder=null,n.isLineAbove=!1,n.isLineBelow=!1,n.isMathAccent=!1;var o=n.baseCore=n.getBaseCore();return o?(n.setBaseAccentsFor(o),n.baseScale=n.getBaseScale(),n.baseIc=n.getBaseIc(),n.baseIsChar=n.isCharBase(),n.isMathAccent=n.baseIsChar&&n.scriptChild&&!!n.scriptChild.coreMO().node.getProperty("mathaccent"),n.checkLineAccents(),n.baseRemoveIc=!n.isLineAbove&&!n.isLineBelow&&(!n.constructor.useIC||n.isMathAccent),n):n}return o(e,t),Object.defineProperty(e.prototype,"baseChild",{get:function(){return this.childNodes[this.node.base]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[1]},enumerable:!1,configurable:!0}),e.prototype.getBaseCore=function(){for(var t=this.getSemanticBase()||this.childNodes[0];t&&(1===t.childNodes.length&&(t.node.isKind("mrow")||t.node.isKind("TeXAtom")&&t.node.texClass!==l.TEXCLASS.VCENTER||t.node.isKind("mstyle")||t.node.isKind("mpadded")||t.node.isKind("mphantom")||t.node.isKind("semantics"))||t.node.isKind("munderover")&&t.isMathAccent);)this.setBaseAccentsFor(t),t=t.childNodes[0];return t||(this.baseHasAccentOver=this.baseHasAccentUnder=!1),t||this.childNodes[0]},e.prototype.setBaseAccentsFor=function(t){t.node.isKind("munderover")&&(null===this.baseHasAccentOver&&(this.baseHasAccentOver=!!t.node.attributes.get("accent")),null===this.baseHasAccentUnder&&(this.baseHasAccentUnder=!!t.node.attributes.get("accentunder")))},e.prototype.getSemanticBase=function(){var t=this.node.attributes.getExplicit("data-semantic-fencepointer");return this.getBaseFence(this.baseChild,t)},e.prototype.getBaseFence=function(t,e){var r,n;if(!t||!t.node.attributes||!e)return null;if(t.node.attributes.getExplicit("data-semantic-id")===e)return t;try{for(var o=a(t.childNodes),i=o.next();!i.done;i=o.next()){var s=i.value,l=this.getBaseFence(s,e);if(l)return l}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return null},e.prototype.getBaseScale=function(){for(var t=this.baseCore,e=1;t&&t!==this;){e*=t.getOuterBBox().rscale,t=t.parent}return e},e.prototype.getBaseIc=function(){return this.baseCore.getOuterBBox().ic*this.baseScale},e.prototype.getAdjustedIc=function(){var t=this.baseCore.getOuterBBox();return(t.ic?1.05*t.ic+.05:0)*this.baseScale},e.prototype.isCharBase=function(){var t=this.baseCore;return(t.node.isKind("mo")&&null===t.size||t.node.isKind("mi")||t.node.isKind("mn"))&&1===t.bbox.rscale&&1===Array.from(t.getText()).length},e.prototype.checkLineAccents=function(){if(this.node.isKind("munderover"))if(this.node.isKind("mover"))this.isLineAbove=this.isLineAccent(this.scriptChild);else if(this.node.isKind("munder"))this.isLineBelow=this.isLineAccent(this.scriptChild);else{this.isLineAbove=this.isLineAccent(this.overChild),this.isLineBelow=this.isLineAccent(this.underChild)}},e.prototype.isLineAccent=function(t){var e=t.coreMO().node;return e.isToken&&"\u2015"===e.getText()},e.prototype.getBaseWidth=function(){var t=this.baseChild.getOuterBBox();return t.w*t.rscale-(this.baseRemoveIc?this.baseIc:0)+this.font.params.extra_ic},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.getBaseWidth(),n=i(this.getOffset(),2),o=n[0],s=n[1];t.append(this.baseChild.getOuterBBox()),t.combine(this.scriptChild.getOuterBBox(),r+o,s),t.w+=this.font.params.scriptspace,t.clean(),this.setChildPWidths(e)},e.prototype.getOffset=function(){return[0,0]},e.prototype.baseCharZero=function(t){var e=!!this.baseCore.node.attributes.get("largeop"),r=this.baseScale;return this.baseIsChar&&!e&&1===r?0:t},e.prototype.getV=function(){var t=this.baseCore.getOuterBBox(),e=this.scriptChild.getOuterBBox(),r=this.font.params,n=this.length2em(this.node.attributes.get("subscriptshift"),r.sub1);return Math.max(this.baseCharZero(t.d*this.baseScale+r.sub_drop*e.rscale),n,e.h*e.rscale-.8*r.x_height)},e.prototype.getU=function(){var t=this.baseCore.getOuterBBox(),e=this.scriptChild.getOuterBBox(),r=this.font.params,n=this.node.attributes.getList("displaystyle","superscriptshift"),o=this.node.getProperty("texprimestyle")?r.sup3:n.displaystyle?r.sup1:r.sup2,i=this.length2em(n.superscriptshift,o);return Math.max(this.baseCharZero(t.h*this.baseScale-r.sup_drop*e.rscale),i,e.d*e.rscale+1/4*r.x_height)},e.prototype.hasMovableLimits=function(){var t=this.node.attributes.get("displaystyle"),e=this.baseChild.coreMO().node;return!t&&!!e.attributes.get("movablelimits")},e.prototype.getOverKU=function(t,e){var r=this.node.attributes.get("accent"),n=this.font.params,o=e.d*e.rscale,i=n.rule_thickness*n.separation_factor,s=this.baseHasAccentOver?i:0,a=this.isLineAbove?3*n.rule_thickness:i,l=(r?a:Math.max(n.big_op_spacing1,n.big_op_spacing3-Math.max(0,o)))-s;return[l,t.h*t.rscale+l+o]},e.prototype.getUnderKV=function(t,e){var r=this.node.attributes.get("accentunder"),n=this.font.params,o=e.h*e.rscale,i=n.rule_thickness*n.separation_factor,s=this.baseHasAccentUnder?i:0,a=this.isLineBelow?3*n.rule_thickness:i,l=(r?a:Math.max(n.big_op_spacing2,n.big_op_spacing4-o))-s;return[l,-(t.d*t.rscale+l+o)]},e.prototype.getDeltaW=function(t,e){var r,n,o,l;void 0===e&&(e=[0,0,0]);var c=this.node.attributes.get("align"),u=t.map((function(t){return t.w*t.rscale}));u[0]-=this.baseRemoveIc&&!this.baseCore.node.attributes.get("largeop")?this.baseIc:0;var p=Math.max.apply(Math,s([],i(u),!1)),h=[],f=0;try{for(var d=a(u.keys()),m=d.next();!m.done;m=d.next()){var y=m.value;h[y]=("center"===c?(p-u[y])/2:"right"===c?p-u[y]:0)+e[y],h[y]<f&&(f=-h[y])}}catch(t){r={error:t}}finally{try{m&&!m.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}if(f)try{for(var g=a(h.keys()),b=g.next();!b.done;b=g.next()){y=b.value;h[y]+=f}}catch(t){o={error:t}}finally{try{b&&!b.done&&(l=g.return)&&l.call(g)}finally{if(o)throw o.error}}return[1,2].map((function(e){return h[e]+=t[e]?t[e].dx*t[0].scale:0})),h},e.prototype.getDelta=function(t){void 0===t&&(t=!1);var e=this.node.attributes.get("accent"),r=this.baseCore.getOuterBBox(),n=r.sk,o=r.ic;return((e&&!t?n:0)+this.font.skewIcFactor*o)*this.baseScale},e.prototype.stretchChildren=function(){var t,e,r,n,o,i,s=[];try{for(var l=a(this.childNodes),c=l.next();!c.done;c=l.next()){(O=c.value).canStretch(2)&&s.push(O)}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}var u=s.length,p=this.childNodes.length;if(u&&p>1){var h=0,f=u>1&&u===p;try{for(var d=a(this.childNodes),m=d.next();!m.done;m=d.next()){var y=0===(O=m.value).stretch.dir;if(f||y){var g=O.getOuterBBox(y),b=g.w,v=g.rscale;b*v>h&&(h=b*v)}}}catch(t){r={error:t}}finally{try{m&&!m.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}try{for(var _=a(s),S=_.next();!S.done;S=_.next()){var O;(O=S.value).coreMO().getStretchedVariant([h/O.bbox.rscale])}}catch(t){o={error:t}}finally{try{S&&!S.done&&(i=_.return)&&i.call(_)}finally{if(o)throw o.error}}}},e}(t),e.useIC=!0,e}},5806:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonSemanticsMixin=void 0,e.CommonSemanticsMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.computeBBox=function(t,e){if(void 0===e&&(e=!1),this.childNodes.length){var r=this.childNodes[0].getBBox(),n=r.w,o=r.h,i=r.d;t.w=n,t.h=o,t.d=i}},e}(t)}},5920:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__assign||function(){return o=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},o.apply(this,arguments)},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTeXFontMixin=void 0,e.CommonTeXFontMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getDelimiterData=function(t){return this.getChar("-smallop",t)||this.getChar("-size4",t)},e}(t),e.NAME="TeX",e.defaultVariants=s(s([],i(t.defaultVariants),!1),[["-smallop","normal"],["-largeop","normal"],["-size3","normal"],["-size4","normal"],["-tex-calligraphic","italic"],["-tex-bold-calligraphic","bold-italic"],["-tex-oldstyle","normal"],["-tex-bold-oldstyle","bold"],["-tex-mathit","italic"],["-tex-variant","normal"]],!1),e.defaultCssFonts=o(o({},t.defaultCssFonts),{"-smallop":["serif",!1,!1],"-largeop":["serif",!1,!1],"-size3":["serif",!1,!1],"-size4":["serif",!1,!1],"-tex-calligraphic":["cursive",!0,!1],"-tex-bold-calligraphic":["cursive",!0,!0],"-tex-oldstyle":["serif",!1,!1],"-tex-bold-oldstyle":["serif",!1,!0],"-tex-mathit":["serif",!0,!1]}),e.defaultSizeVariants=["normal","-smallop","-largeop","-size3","-size4","-tex-variant"],e.defaultStretchVariants=["-size4"],e}},3980:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.boldItalic=void 0,e.boldItalic={47:[.711,.21,.894],305:[.452,.008,.394,{sk:.0319}],567:[.451,.201,.439,{sk:.0958}],8260:[.711,.21,.894],8710:[.711,0,.958,{sk:.192}],10744:[.711,.21,.894]}},1103:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.bold=void 0,e.bold={33:[.705,0,.35],34:[.694,-.329,.603],35:[.694,.193,.958],36:[.75,.056,.575],37:[.75,.056,.958],38:[.705,.011,.894],39:[.694,-.329,.319],40:[.75,.249,.447],41:[.75,.249,.447],42:[.75,-.306,.575],43:[.633,.131,.894],44:[.171,.194,.319],45:[.278,-.166,.383],46:[.171,0,.319],47:[.75,.25,.575],58:[.444,0,.319],59:[.444,.194,.319],60:[.587,.085,.894],61:[.393,-.109,.894],62:[.587,.085,.894],63:[.7,0,.543],64:[.699,.006,.894],91:[.75,.25,.319],92:[.75,.25,.575],93:[.75,.25,.319],94:[.694,-.52,.575],95:[-.01,.061,.575],96:[.706,-.503,.575],123:[.75,.25,.575],124:[.75,.249,.319],125:[.75,.25,.575],126:[.344,-.202,.575],168:[.695,-.535,.575],172:[.371,-.061,.767],175:[.607,-.54,.575],176:[.702,-.536,.575],177:[.728,.035,.894],180:[.706,-.503,.575],183:[.336,-.166,.319],215:[.53,.028,.894],247:[.597,.096,.894],305:[.442,0,.278,{sk:.0278}],567:[.442,.205,.306,{sk:.0833}],697:[.563,-.033,.344],710:[.694,-.52,.575],711:[.66,-.515,.575],713:[.607,-.54,.575],714:[.706,-.503,.575],715:[.706,-.503,.575],728:[.694,-.5,.575],729:[.695,-.525,.575],730:[.702,-.536,.575],732:[.694,-.552,.575],768:[.706,-.503,0],769:[.706,-.503,0],770:[.694,-.52,0],771:[.694,-.552,0],772:[.607,-.54,0],774:[.694,-.5,0],775:[.695,-.525,0],776:[.695,-.535,0],778:[.702,-.536,0],779:[.714,-.511,0],780:[.66,-.515,0],824:[.711,.21,0],8194:[0,0,.5],8195:[0,0,.999],8196:[0,0,.333],8197:[0,0,.25],8198:[0,0,.167],8201:[0,0,.167],8202:[0,0,.083],8211:[.3,-.249,.575],8212:[.3,-.249,1.15],8213:[.3,-.249,1.15],8214:[.75,.248,.575],8215:[-.01,.061,.575],8216:[.694,-.329,.319],8217:[.694,-.329,.319],8220:[.694,-.329,.603],8221:[.694,-.329,.603],8224:[.702,.211,.511],8225:[.702,.202,.511],8226:[.474,-.028,.575],8230:[.171,0,1.295],8242:[.563,-.033,.344],8243:[.563,0,.688],8244:[.563,0,1.032],8254:[.607,-.54,.575],8260:[.75,.25,.575],8279:[.563,0,1.376],8407:[.723,-.513,.575],8463:[.694,.008,.668,{sk:-.0319}],8467:[.702,.019,.474,{sk:.128}],8472:[.461,.21,.74],8501:[.694,0,.703],8592:[.518,.017,1.15],8593:[.694,.193,.575],8594:[.518,.017,1.15],8595:[.694,.194,.575],8596:[.518,.017,1.15],8597:[.767,.267,.575],8598:[.724,.194,1.15],8599:[.724,.193,1.15],8600:[.694,.224,1.15],8601:[.694,.224,1.15],8602:[.711,.21,1.15],8603:[.711,.21,1.15],8614:[.518,.017,1.15],8617:[.518,.017,1.282],8618:[.518,.017,1.282],8622:[.711,.21,1.15],8636:[.518,-.22,1.15],8637:[.281,.017,1.15],8640:[.518,-.22,1.15],8641:[.281,.017,1.15],8652:[.718,.017,1.15],8653:[.711,.21,1.15],8654:[.711,.21,1.15],8655:[.711,.21,1.15],8656:[.547,.046,1.15],8657:[.694,.193,.703],8658:[.547,.046,1.15],8659:[.694,.194,.703],8660:[.547,.046,1.15],8661:[.767,.267,.703],8704:[.694,.016,.639],8707:[.694,0,.639],8708:[.711,.21,.639],8709:[.767,.073,.575],8710:[.698,0,.958],8712:[.587,.086,.767],8713:[.711,.21,.767],8715:[.587,.086,.767],8716:[.711,.21,.767],8722:[.281,-.221,.894],8723:[.537,.227,.894],8725:[.75,.25,.575],8726:[.75,.25,.575],8727:[.472,-.028,.575],8728:[.474,-.028,.575],8729:[.474,-.028,.575],8730:[.82,.18,.958,{ic:.03}],8733:[.451,.008,.894],8734:[.452,.008,1.15],8736:[.714,0,.722],8739:[.75,.249,.319],8740:[.75,.249,.319],8741:[.75,.248,.575],8742:[.75,.248,.575],8743:[.604,.017,.767],8744:[.604,.016,.767],8745:[.603,.016,.767],8746:[.604,.016,.767],8747:[.711,.211,.569,{ic:.063}],8764:[.391,-.109,.894],8768:[.583,.082,.319],8769:[.711,.21,.894],8771:[.502,0,.894],8772:[.711,.21,.894],8773:[.638,.027,.894],8775:[.711,.21,.894],8776:[.524,-.032,.894],8777:[.711,.21,.894],8781:[.533,.032,.894],8784:[.721,-.109,.894],8800:[.711,.21,.894],8801:[.505,0,.894],8802:[.711,.21,.894],8804:[.697,.199,.894],8805:[.697,.199,.894],8810:[.617,.116,1.15],8811:[.618,.116,1.15],8813:[.711,.21,.894],8814:[.711,.21,.894],8815:[.711,.21,.894],8816:[.711,.21,.894],8817:[.711,.21,.894],8826:[.585,.086,.894],8827:[.586,.086,.894],8832:[.711,.21,.894],8833:[.711,.21,.894],8834:[.587,.085,.894],8835:[.587,.086,.894],8836:[.711,.21,.894],8837:[.711,.21,.894],8838:[.697,.199,.894],8839:[.697,.199,.894],8840:[.711,.21,.894],8841:[.711,.21,.894],8846:[.604,.016,.767],8849:[.697,.199,.894],8850:[.697,.199,.894],8851:[.604,0,.767],8852:[.604,0,.767],8853:[.632,.132,.894],8854:[.632,.132,.894],8855:[.632,.132,.894],8856:[.632,.132,.894],8857:[.632,.132,.894],8866:[.693,0,.703],8867:[.693,0,.703],8868:[.694,0,.894],8869:[.693,0,.894],8872:[.75,.249,.974],8876:[.711,.21,.703],8877:[.75,.249,.974],8900:[.523,.021,.575],8901:[.336,-.166,.319],8902:[.502,0,.575],8904:[.54,.039,1],8930:[.711,.21,.894],8931:[.711,.21,.894],8942:[.951,.029,.319],8943:[.336,-.166,1.295],8945:[.871,-.101,1.323],8968:[.75,.248,.511],8969:[.75,.248,.511],8970:[.749,.248,.511],8971:[.749,.248,.511],8994:[.405,-.108,1.15],8995:[.392,-.126,1.15],9001:[.75,.249,.447],9002:[.75,.249,.447],9651:[.711,0,1.022],9653:[.711,0,1.022],9657:[.54,.039,.575],9661:[.5,.21,1.022],9663:[.5,.21,1.022],9667:[.539,.038,.575],9711:[.711,.211,1.15],9824:[.719,.129,.894],9825:[.711,.024,.894],9826:[.719,.154,.894],9827:[.719,.129,.894],9837:[.75,.017,.447],9838:[.741,.223,.447],9839:[.724,.224,.447],10072:[.75,.249,.319],10216:[.75,.249,.447],10217:[.75,.249,.447],10229:[.518,.017,1.805],10230:[.518,.017,1.833],10231:[.518,.017,2.126],10232:[.547,.046,1.868],10233:[.547,.046,1.87],10234:[.547,.046,2.126],10236:[.518,.017,1.833],10744:[.711,.21,.894],10799:[.53,.028,.894],10815:[.686,0,.9],10927:[.696,.199,.894],10928:[.697,.199,.894],12296:[.75,.249,.447],12297:[.75,.249,.447]}},9124:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.delimiters=e.VSIZES=e.HDW3=e.HDW2=e.HDW1=void 0;var n=r(5884);e.HDW1=[.75,.25,.875],e.HDW2=[.85,.349,.667],e.HDW3=[.583,.082,.5],e.VSIZES=[1,1.2,1.8,2.4,3];var o={c:47,dir:n.V,sizes:e.VSIZES},i={c:175,dir:n.H,sizes:[.5],stretch:[0,175],HDW:[.59,-.544,.5]},s={c:710,dir:n.H,sizes:[.5,.556,1,1.444,1.889]},a={c:732,dir:n.H,sizes:[.5,.556,1,1.444,1.889]},l={c:8211,dir:n.H,sizes:[.5],stretch:[0,8211],HDW:[.285,-.248,.5]},c={c:8592,dir:n.H,sizes:[1],stretch:[8592,8722],HDW:e.HDW3},u={c:8594,dir:n.H,sizes:[1],stretch:[0,8722,8594],HDW:e.HDW3},p={c:8596,dir:n.H,sizes:[1],stretch:[8592,8722,8594],HDW:e.HDW3},h={c:8612,dir:n.H,stretch:[8592,8722,8739],HDW:e.HDW3,min:1.278},f={c:8614,dir:n.H,sizes:[1],stretch:[8739,8722,8594],HDW:e.HDW3},d={c:8656,dir:n.H,sizes:[1],stretch:[8656,61],HDW:e.HDW3},m={c:8658,dir:n.H,sizes:[1],stretch:[0,61,8658],HDW:e.HDW3},y={c:8660,dir:n.H,sizes:[1],stretch:[8656,61,8658],HDW:e.HDW3},g={c:8722,dir:n.H,sizes:[.778],stretch:[0,8722],HDW:e.HDW3},b={c:8739,dir:n.V,sizes:[1],stretch:[0,8739],HDW:[.627,.015,.333]},v={c:9180,dir:n.H,sizes:[.778,1],schar:[8994,8994],variants:[5,0],stretch:[57680,57684,57681],HDW:[.32,.2,.5]},_={c:9181,dir:n.H,sizes:[.778,1],schar:[8995,8995],variants:[5,0],stretch:[57682,57684,57683],HDW:[.32,.2,.5]},S={c:9182,dir:n.H,stretch:[57680,57684,57681,57685],HDW:[.32,.2,.5],min:1.8},O={c:9183,dir:n.H,stretch:[57682,57684,57683,57686],HDW:[.32,.2,.5],min:1.8},M={c:10216,dir:n.V,sizes:e.VSIZES},x={c:10217,dir:n.V,sizes:e.VSIZES},E={c:10502,dir:n.H,stretch:[8656,61,8739],HDW:e.HDW3,min:1.278},A={c:10503,dir:n.H,stretch:[8872,61,8658],HDW:e.HDW3,min:1.278};e.delimiters={40:{dir:n.V,sizes:e.VSIZES,stretch:[9115,9116,9117],HDW:[.85,.349,.875]},41:{dir:n.V,sizes:e.VSIZES,stretch:[9118,9119,9120],HDW:[.85,.349,.875]},45:g,47:o,61:{dir:n.H,sizes:[.778],stretch:[0,61],HDW:e.HDW3},91:{dir:n.V,sizes:e.VSIZES,stretch:[9121,9122,9123],HDW:e.HDW2},92:{dir:n.V,sizes:e.VSIZES},93:{dir:n.V,sizes:e.VSIZES,stretch:[9124,9125,9126],HDW:e.HDW2},94:s,95:l,123:{dir:n.V,sizes:e.VSIZES,stretch:[9127,9130,9129,9128],HDW:[.85,.349,.889]},124:{dir:n.V,sizes:[1],stretch:[0,8739],HDW:[.75,.25,.333]},125:{dir:n.V,sizes:e.VSIZES,stretch:[9131,9130,9133,9132],HDW:[.85,.349,.889]},126:a,175:i,710:s,713:i,732:a,770:s,771:a,818:l,8211:l,8212:l,8213:l,8214:{dir:n.V,sizes:[.602,1],schar:[0,8741],variants:[1,0],stretch:[0,8741],HDW:[.602,0,.556]},8215:l,8254:i,8407:u,8592:c,8593:{dir:n.V,sizes:[.888],stretch:[8593,9168],HDW:[.6,0,.667]},8594:u,8595:{dir:n.V,sizes:[.888],stretch:[0,9168,8595],HDW:[.6,0,.667]},8596:p,8597:{dir:n.V,sizes:[1.044],stretch:[8593,9168,8595],HDW:e.HDW1},8606:{dir:n.H,sizes:[1],stretch:[8606,8722],HDW:e.HDW3},8608:{dir:n.H,sizes:[1],stretch:[0,8722,8608],HDW:e.HDW3},8612:h,8613:{dir:n.V,stretch:[8593,9168,8869],HDW:e.HDW1,min:1.555},8614:f,8615:{dir:n.V,stretch:[8868,9168,8595],HDW:e.HDW1,min:1.555},8624:{dir:n.V,sizes:[.722],stretch:[8624,9168],HDW:e.HDW1},8625:{dir:n.V,sizes:[.722],stretch:[8625,9168],HDW:e.HDW1},8636:{dir:n.H,sizes:[1],stretch:[8636,8722],HDW:e.HDW3},8637:{dir:n.H,sizes:[1],stretch:[8637,8722],HDW:e.HDW3},8638:{dir:n.V,sizes:[.888],stretch:[8638,9168],HDW:e.HDW1},8639:{dir:n.V,sizes:[.888],stretch:[8639,9168],HDW:e.HDW1},8640:{dir:n.H,sizes:[1],stretch:[0,8722,8640],HDW:e.HDW3},8641:{dir:n.H,sizes:[1],stretch:[0,8722,8641],HDW:e.HDW3},8642:{dir:n.V,sizes:[.888],stretch:[0,9168,8642],HDW:e.HDW1},8643:{dir:n.V,sizes:[.888],stretch:[0,9168,8643],HDW:e.HDW1},8656:d,8657:{dir:n.V,sizes:[.888],stretch:[8657,8214],HDW:[.599,0,.778]},8658:m,8659:{dir:n.V,sizes:[.888],stretch:[0,8214,8659],HDW:[.6,0,.778]},8660:y,8661:{dir:n.V,sizes:[1.044],stretch:[8657,8214,8659],HDW:[.75,.25,.778]},8666:{dir:n.H,sizes:[1],stretch:[8666,8801],HDW:[.464,-.036,.5]},8667:{dir:n.H,sizes:[1],stretch:[0,8801,8667],HDW:[.464,-.036,.5]},8722:g,8725:o,8730:{dir:n.V,sizes:e.VSIZES,stretch:[57345,57344,9143],fullExt:[.65,2.3],HDW:[.85,.35,1.056]},8739:b,8741:{dir:n.V,sizes:[1],stretch:[0,8741],HDW:[.627,.015,.556]},8968:{dir:n.V,sizes:e.VSIZES,stretch:[9121,9122],HDW:e.HDW2},8969:{dir:n.V,sizes:e.VSIZES,stretch:[9124,9125],HDW:e.HDW2},8970:{dir:n.V,sizes:e.VSIZES,stretch:[0,9122,9123],HDW:e.HDW2},8971:{dir:n.V,sizes:e.VSIZES,stretch:[0,9125,9126],HDW:e.HDW2},8978:v,8994:v,8995:_,9001:M,9002:x,9130:{dir:n.V,sizes:[.32],stretch:[9130,9130,9130],HDW:[.29,.015,.889]},9135:l,9136:{dir:n.V,sizes:[.989],stretch:[9127,9130,9133],HDW:[.75,.25,.889]},9137:{dir:n.V,sizes:[.989],stretch:[9131,9130,9129],HDW:[.75,.25,.889]},9140:{dir:n.H,stretch:[9484,8722,9488],HDW:e.HDW3,min:1},9141:{dir:n.H,stretch:[9492,8722,9496],HDW:e.HDW3,min:1},9168:{dir:n.V,sizes:[.602,1],schar:[0,8739],variants:[1,0],stretch:[0,8739],HDW:[.602,0,.333]},9180:v,9181:_,9182:S,9183:O,9184:{dir:n.H,stretch:[714,713,715],HDW:[.59,-.544,.5],min:1},9185:{dir:n.H,stretch:[715,713,714],HDW:[.59,-.544,.5],min:1},9472:l,10072:b,10216:M,10217:x,10222:{dir:n.V,sizes:[.989],stretch:[9127,9130,9129],HDW:[.75,.25,.889]},10223:{dir:n.V,sizes:[.989],stretch:[9131,9130,9133],HDW:[.75,.25,.889]},10229:c,10230:u,10231:p,10232:d,10233:m,10234:y,10235:h,10236:f,10237:E,10238:A,10502:E,10503:A,10574:{dir:n.H,stretch:[8636,8722,8640],HDW:e.HDW3,min:2},10575:{dir:n.V,stretch:[8638,9168,8642],HDW:e.HDW1,min:1.776},10576:{dir:n.H,stretch:[8637,8722,8641],HDW:e.HDW3,min:2},10577:{dir:n.V,stretch:[8639,9168,8643],HDW:e.HDW1,min:.5},10586:{dir:n.H,stretch:[8636,8722,8739],HDW:e.HDW3,min:1.278},10587:{dir:n.H,stretch:[8739,8722,8640],HDW:e.HDW3,min:1.278},10588:{dir:n.V,stretch:[8638,9168,8869],HDW:e.HDW1,min:1.556},10589:{dir:n.V,stretch:[8868,9168,8642],HDW:e.HDW1,min:1.556},10590:{dir:n.H,stretch:[8637,8722,8739],HDW:e.HDW3,min:1.278},10591:{dir:n.H,stretch:[8739,8722,8641],HDW:e.HDW3,min:1.278},10592:{dir:n.V,stretch:[8639,9168,8869],HDW:e.HDW1,min:1.776},10593:{dir:n.V,stretch:[8868,9168,8643],HDW:e.HDW1,min:1.776},12296:M,12297:x,65079:S,65080:O}},6001:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.doubleStruck=void 0,e.doubleStruck={}},3696:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.frakturBold=void 0,e.frakturBold={33:[.689,.012,.349],34:[.695,-.432,.254],38:[.696,.016,.871],39:[.695,-.436,.25],40:[.737,.186,.459],41:[.735,.187,.459],42:[.692,-.449,.328],43:[.598,.082,.893],44:[.107,.191,.328],45:[.275,-.236,.893],46:[.102,.015,.328],47:[.721,.182,.593],48:[.501,.012,.593],49:[.489,0,.593],50:[.491,0,.593],51:[.487,.193,.593],52:[.495,.196,.593],53:[.481,.19,.593],54:[.704,.012,.593],55:[.479,.197,.593],56:[.714,.005,.593],57:[.487,.195,.593],58:[.457,.012,.255],59:[.458,.19,.255],61:[.343,-.168,.582],63:[.697,.014,.428],91:[.74,.13,.257],93:[.738,.132,.257],94:[.734,-.452,.59],8216:[.708,-.411,.254],8217:[.692,-.394,.254],8260:[.721,.182,.593],58113:[.63,.027,.587],58114:[.693,.212,.394,{ic:.014}],58115:[.681,.219,.387],58116:[.473,.212,.593],58117:[.684,.027,.393],58120:[.679,.22,.981],58121:[.717,.137,.727]}},9587:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.fraktur=void 0,e.fraktur={33:[.689,.012,.296],34:[.695,-.432,.215],38:[.698,.011,.738],39:[.695,-.436,.212],40:[.737,.186,.389],41:[.735,.187,.389],42:[.692,-.449,.278],43:[.598,.082,.756],44:[.107,.191,.278],45:[.275,-.236,.756],46:[.102,.015,.278],47:[.721,.182,.502],48:[.492,.013,.502],49:[.468,0,.502],50:[.474,0,.502],51:[.473,.182,.502],52:[.476,.191,.502],53:[.458,.184,.502],54:[.7,.013,.502],55:[.468,.181,.502],56:[.705,.01,.502],57:[.469,.182,.502],58:[.457,.012,.216],59:[.458,.189,.216],61:[.368,-.132,.756],63:[.693,.011,.362],91:[.74,.13,.278],93:[.738,.131,.278],94:[.734,-.452,.5],8216:[.708,-.41,.215],8217:[.692,-.395,.215],8260:[.721,.182,.502],58112:[.683,.032,.497],58113:[.616,.03,.498],58114:[.68,.215,.333],58115:[.679,.224,.329],58116:[.471,.214,.503],58117:[.686,.02,.333],58118:[.577,.021,.334,{ic:.013}],58119:[.475,.022,.501,{ic:.013}]}},8348:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.italic=void 0,e.italic={33:[.716,0,.307,{ic:.073}],34:[.694,-.379,.514,{ic:.024}],35:[.694,.194,.818,{ic:.01}],37:[.75,.056,.818,{ic:.029}],38:[.716,.022,.767,{ic:.035}],39:[.694,-.379,.307,{ic:.07}],40:[.75,.25,.409,{ic:.108}],41:[.75,.25,.409],42:[.75,-.32,.511,{ic:.073}],43:[.557,.057,.767],44:[.121,.194,.307],45:[.251,-.18,.358],46:[.121,0,.307],47:[.716,.215,.778],48:[.665,.021,.511,{ic:.051}],49:[.666,0,.511],50:[.666,.022,.511,{ic:.04}],51:[.666,.022,.511,{ic:.051}],52:[.666,.194,.511],53:[.666,.022,.511,{ic:.056}],54:[.665,.022,.511,{ic:.054}],55:[.666,.022,.511,{ic:.123}],56:[.666,.021,.511,{ic:.042}],57:[.666,.022,.511,{ic:.042}],58:[.431,0,.307],59:[.431,.194,.307],61:[.367,-.133,.767],63:[.716,0,.511,{ic:.04}],64:[.705,.011,.767,{ic:.022}],91:[.75,.25,.307,{ic:.139}],93:[.75,.25,.307,{ic:.052}],94:[.694,-.527,.511,{ic:.017}],95:[-.025,.062,.511,{ic:.043}],126:[.318,-.208,.511,{ic:.06}],305:[.441,.01,.307,{ic:.033}],567:[.442,.204,.332],768:[.697,-.5,0],769:[.697,-.5,0,{ic:.039}],770:[.694,-.527,0,{ic:.017}],771:[.668,-.558,0,{ic:.06}],772:[.589,-.544,0,{ic:.054}],774:[.694,-.515,0,{ic:.062}],775:[.669,-.548,0],776:[.669,-.554,0,{ic:.045}],778:[.716,-.542,0],779:[.697,-.503,0,{ic:.065}],780:[.638,-.502,0,{ic:.029}],989:[.605,.085,.778],8211:[.285,-.248,.511,{ic:.043}],8212:[.285,-.248,1.022,{ic:.016}],8213:[.285,-.248,1.022,{ic:.016}],8215:[-.025,.062,.511,{ic:.043}],8216:[.694,-.379,.307,{ic:.055}],8217:[.694,-.379,.307,{ic:.07}],8220:[.694,-.379,.514,{ic:.092}],8221:[.694,-.379,.514,{ic:.024}],8260:[.716,.215,.778],8463:[.695,.013,.54,{ic:.022}],8710:[.716,0,.833,{sk:.167}],10744:[.716,.215,.778]}},1376:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.largeop=void 0,e.largeop={40:[1.15,.649,.597],41:[1.15,.649,.597],47:[1.15,.649,.811],91:[1.15,.649,.472],92:[1.15,.649,.811],93:[1.15,.649,.472],123:[1.15,.649,.667],125:[1.15,.649,.667],710:[.772,-.565,1],732:[.75,-.611,1],770:[.772,-.565,0],771:[.75,-.611,0],8214:[.602,0,.778],8260:[1.15,.649,.811],8593:[.6,0,.667],8595:[.6,0,.667],8657:[.599,0,.778],8659:[.6,0,.778],8719:[.95,.45,1.278],8720:[.95,.45,1.278],8721:[.95,.45,1.444],8730:[1.15,.65,1,{ic:.02}],8739:[.627,.015,.333],8741:[.627,.015,.556],8747:[1.36,.862,.556,{ic:.388}],8748:[1.36,.862,1.084,{ic:.388}],8749:[1.36,.862,1.592,{ic:.388}],8750:[1.36,.862,.556,{ic:.388}],8896:[.95,.45,1.111],8897:[.95,.45,1.111],8898:[.949,.45,1.111],8899:[.95,.449,1.111],8968:[1.15,.649,.528],8969:[1.15,.649,.528],8970:[1.15,.649,.528],8971:[1.15,.649,.528],9001:[1.15,.649,.611],9002:[1.15,.649,.611],9168:[.602,0,.667],10072:[.627,.015,.333],10216:[1.15,.649,.611],10217:[1.15,.649,.611],10752:[.949,.449,1.511],10753:[.949,.449,1.511],10754:[.949,.449,1.511],10756:[.95,.449,1.111],10758:[.95,.45,1.111],10764:[1.36,.862,2.168,{ic:.388}],12296:[1.15,.649,.611],12297:[1.15,.649,.611]}},1439:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.monospace=void 0,e.monospace={32:[0,0,.525],33:[.622,0,.525],34:[.623,-.333,.525],35:[.611,0,.525],36:[.694,.082,.525],37:[.694,.083,.525],38:[.622,.011,.525],39:[.611,-.287,.525],40:[.694,.082,.525],41:[.694,.082,.525],42:[.52,-.09,.525],43:[.531,-.081,.525],44:[.14,.139,.525],45:[.341,-.271,.525],46:[.14,0,.525],47:[.694,.083,.525],58:[.431,0,.525],59:[.431,.139,.525],60:[.557,-.055,.525],61:[.417,-.195,.525],62:[.557,-.055,.525],63:[.617,0,.525],64:[.617,.006,.525],91:[.694,.082,.525],92:[.694,.083,.525],93:[.694,.082,.525],94:[.611,-.46,.525],95:[-.025,.095,.525],96:[.681,-.357,.525],123:[.694,.083,.525],124:[.694,.082,.525],125:[.694,.083,.525],126:[.611,-.466,.525],127:[.612,-.519,.525],160:[0,0,.525],305:[.431,0,.525],567:[.431,.228,.525],697:[.623,-.334,.525],768:[.611,-.485,0],769:[.611,-.485,0],770:[.611,-.46,0],771:[.611,-.466,0],772:[.577,-.5,0],774:[.611,-.504,0],776:[.612,-.519,0],778:[.619,-.499,0],780:[.577,-.449,0],913:[.623,0,.525],914:[.611,0,.525],915:[.611,0,.525],916:[.623,0,.525],917:[.611,0,.525],918:[.611,0,.525],919:[.611,0,.525],920:[.621,.01,.525],921:[.611,0,.525],922:[.611,0,.525],923:[.623,0,.525],924:[.611,0,.525],925:[.611,0,.525],926:[.611,0,.525],927:[.621,.01,.525],928:[.611,0,.525],929:[.611,0,.525],931:[.611,0,.525],932:[.611,0,.525],933:[.622,0,.525],934:[.611,0,.525],935:[.611,0,.525],936:[.611,0,.525],937:[.622,0,.525],8215:[-.025,.095,.525],8242:[.623,-.334,.525],8243:[.623,0,1.05],8244:[.623,0,1.575],8260:[.694,.083,.525],8279:[.623,0,2.1],8710:[.623,0,.525]}},331:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.normal=void 0,e.normal={32:[0,0,.25],33:[.716,0,.278],34:[.694,-.379,.5],35:[.694,.194,.833],36:[.75,.056,.5],37:[.75,.056,.833],38:[.716,.022,.778],39:[.694,-.379,.278],40:[.75,.25,.389],41:[.75,.25,.389],42:[.75,-.32,.5],43:[.583,.082,.778],44:[.121,.194,.278],45:[.252,-.179,.333],46:[.12,0,.278],47:[.75,.25,.5],48:[.666,.022,.5],49:[.666,0,.5],50:[.666,0,.5],51:[.665,.022,.5],52:[.677,0,.5],53:[.666,.022,.5],54:[.666,.022,.5],55:[.676,.022,.5],56:[.666,.022,.5],57:[.666,.022,.5],58:[.43,0,.278],59:[.43,.194,.278],60:[.54,.04,.778],61:[.583,.082,.778],62:[.54,.04,.778],63:[.705,0,.472],64:[.705,.011,.778],65:[.716,0,.75],66:[.683,0,.708],67:[.705,.021,.722],68:[.683,0,.764],69:[.68,0,.681],70:[.68,0,.653],71:[.705,.022,.785],72:[.683,0,.75],73:[.683,0,.361],74:[.683,.022,.514],75:[.683,0,.778],76:[.683,0,.625],77:[.683,0,.917],78:[.683,0,.75],79:[.705,.022,.778],80:[.683,0,.681],81:[.705,.193,.778],82:[.683,.022,.736],83:[.705,.022,.556],84:[.677,0,.722],85:[.683,.022,.75],86:[.683,.022,.75],87:[.683,.022,1.028],88:[.683,0,.75],89:[.683,0,.75],90:[.683,0,.611],91:[.75,.25,.278],92:[.75,.25,.5],93:[.75,.25,.278],94:[.694,-.531,.5],95:[-.025,.062,.5],96:[.699,-.505,.5],97:[.448,.011,.5],98:[.694,.011,.556],99:[.448,.011,.444],100:[.694,.011,.556],101:[.448,.011,.444],102:[.705,0,.306,{ic:.066}],103:[.453,.206,.5],104:[.694,0,.556],105:[.669,0,.278],106:[.669,.205,.306],107:[.694,0,.528],108:[.694,0,.278],109:[.442,0,.833],110:[.442,0,.556],111:[.448,.01,.5],112:[.442,.194,.556],113:[.442,.194,.528],114:[.442,0,.392],115:[.448,.011,.394],116:[.615,.01,.389],117:[.442,.011,.556],118:[.431,.011,.528],119:[.431,.011,.722],120:[.431,0,.528],121:[.431,.204,.528],122:[.431,0,.444],123:[.75,.25,.5],124:[.75,.249,.278],125:[.75,.25,.5],126:[.318,-.215,.5],160:[0,0,.25],163:[.714,.011,.769],165:[.683,0,.75],168:[.669,-.554,.5],172:[.356,-.089,.667],174:[.709,.175,.947],175:[.59,-.544,.5],176:[.715,-.542,.5],177:[.666,0,.778],180:[.699,-.505,.5],183:[.31,-.19,.278],215:[.491,-.009,.778],240:[.749,.021,.556],247:[.537,.036,.778],305:[.442,0,.278,{sk:.0278}],567:[.442,.205,.306,{sk:.0833}],697:[.56,-.043,.275],710:[.694,-.531,.5],711:[.644,-.513,.5],713:[.59,-.544,.5],714:[.699,-.505,.5],715:[.699,-.505,.5],728:[.694,-.515,.5],729:[.669,-.549,.5],730:[.715,-.542,.5],732:[.668,-.565,.5],768:[.699,-.505,0],769:[.699,-.505,0],770:[.694,-.531,0],771:[.668,-.565,0],772:[.59,-.544,0],774:[.694,-.515,0],775:[.669,-.549,0],776:[.669,-.554,0],778:[.715,-.542,0],779:[.701,-.51,0],780:[.644,-.513,0],824:[.716,.215,0],913:[.716,0,.75],914:[.683,0,.708],915:[.68,0,.625],916:[.716,0,.833],917:[.68,0,.681],918:[.683,0,.611],919:[.683,0,.75],920:[.705,.022,.778],921:[.683,0,.361],922:[.683,0,.778],923:[.716,0,.694],924:[.683,0,.917],925:[.683,0,.75],926:[.677,0,.667],927:[.705,.022,.778],928:[.68,0,.75],929:[.683,0,.681],931:[.683,0,.722],932:[.677,0,.722],933:[.705,0,.778],934:[.683,0,.722],935:[.683,0,.75],936:[.683,0,.778],937:[.704,0,.722],8192:[0,0,.5],8193:[0,0,1],8194:[0,0,.5],8195:[0,0,1],8196:[0,0,.333],8197:[0,0,.25],8198:[0,0,.167],8201:[0,0,.167],8202:[0,0,.1],8203:[0,0,0],8204:[0,0,0],8211:[.285,-.248,.5],8212:[.285,-.248,1],8213:[.285,-.248,1],8214:[.75,.25,.5],8215:[-.025,.062,.5],8216:[.694,-.379,.278],8217:[.694,-.379,.278],8220:[.694,-.379,.5],8221:[.694,-.379,.5],8224:[.705,.216,.444],8225:[.705,.205,.444],8226:[.444,-.055,.5],8230:[.12,0,1.172],8242:[.56,-.043,.275],8243:[.56,0,.55],8244:[.56,0,.825],8245:[.56,-.043,.275],8246:[.56,0,.55],8247:[.56,0,.825],8254:[.59,-.544,.5],8260:[.75,.25,.5],8279:[.56,0,1.1],8288:[0,0,0],8289:[0,0,0],8290:[0,0,0],8291:[0,0,0],8292:[0,0,0],8407:[.714,-.516,.5],8450:[.702,.019,.722],8459:[.717,.036,.969,{ic:.272,sk:.333}],8460:[.666,.133,.72],8461:[.683,0,.778],8462:[.694,.011,.576,{sk:-.0278}],8463:[.695,.013,.54,{ic:.022}],8464:[.717,.017,.809,{ic:.137,sk:.333}],8465:[.686,.026,.554],8466:[.717,.017,.874,{ic:.161,sk:.306}],8467:[.705,.02,.417,{sk:.111}],8469:[.683,.02,.722],8472:[.453,.216,.636,{sk:.111}],8473:[.683,0,.611],8474:[.701,.181,.778],8475:[.717,.017,.85,{ic:.037,sk:.194}],8476:[.686,.026,.828],8477:[.683,0,.722],8484:[.683,0,.667],8486:[.704,0,.722],8487:[.684,.022,.722],8488:[.729,.139,.602],8492:[.708,.028,.908,{ic:.02,sk:.194}],8493:[.685,.024,.613],8496:[.707,.008,.562,{ic:.156,sk:.139}],8497:[.735,.036,.895,{ic:.095,sk:.222}],8498:[.695,0,.556],8499:[.721,.05,1.08,{ic:.136,sk:.444}],8501:[.694,0,.611],8502:[.763,.021,.667,{ic:.02}],8503:[.764,.043,.444],8504:[.764,.043,.667],8513:[.705,.023,.639],8592:[.511,.011,1],8593:[.694,.193,.5],8594:[.511,.011,1],8595:[.694,.194,.5],8596:[.511,.011,1],8597:[.772,.272,.5],8598:[.72,.195,1],8599:[.72,.195,1],8600:[.695,.22,1],8601:[.695,.22,1],8602:[.437,-.06,1],8603:[.437,-.06,1],8606:[.417,-.083,1],8608:[.417,-.083,1],8610:[.417,-.083,1.111],8611:[.417,-.083,1.111],8614:[.511,.011,1],8617:[.511,.011,1.126],8618:[.511,.011,1.126],8619:[.575,.041,1],8620:[.575,.041,1],8621:[.417,-.083,1.389],8622:[.437,-.06,1],8624:[.722,0,.5],8625:[.722,0,.5],8630:[.461,0,1],8631:[.46,0,1],8634:[.65,.083,.778],8635:[.65,.083,.778],8636:[.511,-.23,1],8637:[.27,.011,1],8638:[.694,.194,.417],8639:[.694,.194,.417],8640:[.511,-.23,1],8641:[.27,.011,1],8642:[.694,.194,.417],8643:[.694,.194,.417],8644:[.667,0,1],8646:[.667,0,1],8647:[.583,.083,1],8648:[.694,.193,.833],8649:[.583,.083,1],8650:[.694,.194,.833],8651:[.514,.014,1],8652:[.671,.011,1],8653:[.534,.035,1],8654:[.534,.037,1],8655:[.534,.035,1],8656:[.525,.024,1],8657:[.694,.194,.611],8658:[.525,.024,1],8659:[.694,.194,.611],8660:[.526,.025,1],8661:[.772,.272,.611],8666:[.611,.111,1],8667:[.611,.111,1],8669:[.417,-.083,1],8672:[.437,-.064,1.334],8674:[.437,-.064,1.334],8704:[.694,.022,.556],8705:[.846,.021,.5],8706:[.715,.022,.531,{ic:.035,sk:.0833}],8707:[.694,0,.556],8708:[.716,.215,.556],8709:[.772,.078,.5],8710:[.716,0,.833],8711:[.683,.033,.833],8712:[.54,.04,.667],8713:[.716,.215,.667],8715:[.54,.04,.667],8716:[.716,.215,.667],8717:[.44,0,.429,{ic:.027}],8719:[.75,.25,.944],8720:[.75,.25,.944],8721:[.75,.25,1.056],8722:[.583,.082,.778],8723:[.5,.166,.778],8724:[.766,.093,.778],8725:[.75,.25,.5],8726:[.75,.25,.5],8727:[.465,-.035,.5],8728:[.444,-.055,.5],8729:[.444,-.055,.5],8730:[.8,.2,.833,{ic:.02}],8733:[.442,.011,.778],8734:[.442,.011,1],8736:[.694,0,.722],8737:[.714,.02,.722],8738:[.551,.051,.722],8739:[.75,.249,.278],8740:[.75,.252,.278,{ic:.019}],8741:[.75,.25,.5],8742:[.75,.25,.5,{ic:.018}],8743:[.598,.022,.667],8744:[.598,.022,.667],8745:[.598,.022,.667],8746:[.598,.022,.667],8747:[.716,.216,.417,{ic:.055}],8748:[.805,.306,.819,{ic:.138}],8749:[.805,.306,1.166,{ic:.138}],8750:[.805,.306,.472,{ic:.138}],8756:[.471,.082,.667],8757:[.471,.082,.667],8764:[.367,-.133,.778],8765:[.367,-.133,.778],8768:[.583,.083,.278],8769:[.467,-.032,.778],8770:[.463,-.034,.778],8771:[.464,-.036,.778],8772:[.716,.215,.778],8773:[.589,-.022,.778],8775:[.652,.155,.778],8776:[.483,-.055,.778],8777:[.716,.215,.778],8778:[.579,.039,.778],8781:[.484,-.016,.778],8782:[.492,-.008,.778],8783:[.492,-.133,.778],8784:[.67,-.133,.778],8785:[.609,.108,.778],8786:[.601,.101,.778],8787:[.601,.102,.778],8790:[.367,-.133,.778],8791:[.721,-.133,.778],8796:[.859,-.133,.778],8800:[.716,.215,.778],8801:[.464,-.036,.778],8802:[.716,.215,.778],8804:[.636,.138,.778],8805:[.636,.138,.778],8806:[.753,.175,.778],8807:[.753,.175,.778],8808:[.752,.286,.778],8809:[.752,.286,.778],8810:[.568,.067,1],8811:[.567,.067,1],8812:[.75,.25,.5],8813:[.716,.215,.778],8814:[.708,.209,.778],8815:[.708,.209,.778],8816:[.801,.303,.778],8817:[.801,.303,.778],8818:[.732,.228,.778],8819:[.732,.228,.778],8820:[.732,.228,.778],8821:[.732,.228,.778],8822:[.681,.253,.778],8823:[.681,.253,.778],8824:[.716,.253,.778],8825:[.716,.253,.778],8826:[.539,.041,.778],8827:[.539,.041,.778],8828:[.58,.153,.778],8829:[.58,.154,.778],8830:[.732,.228,.778],8831:[.732,.228,.778],8832:[.705,.208,.778],8833:[.705,.208,.778],8834:[.54,.04,.778],8835:[.54,.04,.778],8836:[.716,.215,.778],8837:[.716,.215,.778],8838:[.636,.138,.778],8839:[.636,.138,.778],8840:[.801,.303,.778],8841:[.801,.303,.778],8842:[.635,.241,.778],8843:[.635,.241,.778],8846:[.598,.022,.667],8847:[.539,.041,.778],8848:[.539,.041,.778],8849:[.636,.138,.778],8850:[.636,.138,.778],8851:[.598,0,.667],8852:[.598,0,.667],8853:[.583,.083,.778],8854:[.583,.083,.778],8855:[.583,.083,.778],8856:[.583,.083,.778],8857:[.583,.083,.778],8858:[.582,.082,.778],8859:[.582,.082,.778],8861:[.582,.082,.778],8862:[.689,0,.778],8863:[.689,0,.778],8864:[.689,0,.778],8865:[.689,0,.778],8866:[.694,0,.611],8867:[.694,0,.611],8868:[.668,0,.778],8869:[.668,0,.778],8872:[.75,.249,.867],8873:[.694,0,.722],8874:[.694,0,.889],8876:[.695,0,.611],8877:[.695,0,.611],8878:[.695,0,.722],8879:[.695,0,.722],8882:[.539,.041,.778],8883:[.539,.041,.778],8884:[.636,.138,.778],8885:[.636,.138,.778],8888:[.408,-.092,1.111],8890:[.431,.212,.556],8891:[.716,0,.611],8892:[.716,0,.611],8896:[.75,.249,.833],8897:[.75,.249,.833],8898:[.75,.249,.833],8899:[.75,.249,.833],8900:[.488,-.012,.5],8901:[.31,-.19,.278],8902:[.486,-.016,.5],8903:[.545,.044,.778],8904:[.505,.005,.9],8905:[.492,-.008,.778],8906:[.492,-.008,.778],8907:[.694,.022,.778],8908:[.694,.022,.778],8909:[.464,-.036,.778],8910:[.578,.021,.76],8911:[.578,.022,.76],8912:[.54,.04,.778],8913:[.54,.04,.778],8914:[.598,.022,.667],8915:[.598,.022,.667],8916:[.736,.022,.667],8918:[.541,.041,.778],8919:[.541,.041,.778],8920:[.568,.067,1.333],8921:[.568,.067,1.333],8922:[.886,.386,.778],8923:[.886,.386,.778],8926:[.734,0,.778],8927:[.734,0,.778],8928:[.801,.303,.778],8929:[.801,.303,.778],8930:[.716,.215,.778],8931:[.716,.215,.778],8934:[.73,.359,.778],8935:[.73,.359,.778],8936:[.73,.359,.778],8937:[.73,.359,.778],8938:[.706,.208,.778],8939:[.706,.208,.778],8940:[.802,.303,.778],8941:[.801,.303,.778],8942:[1.3,.03,.278],8943:[.31,-.19,1.172],8945:[1.52,-.1,1.282],8965:[.716,0,.611],8966:[.813,.097,.611],8968:[.75,.25,.444],8969:[.75,.25,.444],8970:[.75,.25,.444],8971:[.75,.25,.444],8988:[.694,-.306,.5],8989:[.694,-.306,.5],8990:[.366,.022,.5],8991:[.366,.022,.5],8994:[.388,-.122,1],8995:[.378,-.134,1],9001:[.75,.25,.389],9002:[.75,.25,.389],9136:[.744,.244,.412],9137:[.744,.244,.412],9168:[.602,0,.667],9416:[.709,.175,.902],9484:[.694,-.306,.5],9488:[.694,-.306,.5],9492:[.366,.022,.5],9496:[.366,.022,.5],9585:[.694,.195,.889],9586:[.694,.195,.889],9632:[.689,0,.778],9633:[.689,0,.778],9642:[.689,0,.778],9650:[.575,.02,.722],9651:[.716,0,.889],9652:[.575,.02,.722],9653:[.716,0,.889],9654:[.539,.041,.778],9656:[.539,.041,.778],9657:[.505,.005,.5],9660:[.576,.019,.722],9661:[.5,.215,.889],9662:[.576,.019,.722],9663:[.5,.215,.889],9664:[.539,.041,.778],9666:[.539,.041,.778],9667:[.505,.005,.5],9674:[.716,.132,.667],9711:[.715,.215,1],9723:[.689,0,.778],9724:[.689,0,.778],9733:[.694,.111,.944],9824:[.727,.13,.778],9825:[.716,.033,.778],9826:[.727,.162,.778],9827:[.726,.13,.778],9837:[.75,.022,.389],9838:[.734,.223,.389],9839:[.723,.223,.389],10003:[.706,.034,.833],10016:[.716,.022,.833],10072:[.75,.249,.278],10216:[.75,.25,.389],10217:[.75,.25,.389],10222:[.744,.244,.412],10223:[.744,.244,.412],10229:[.511,.011,1.609],10230:[.511,.011,1.638],10231:[.511,.011,1.859],10232:[.525,.024,1.609],10233:[.525,.024,1.638],10234:[.525,.024,1.858],10236:[.511,.011,1.638],10731:[.716,.132,.667],10744:[.716,.215,.778],10752:[.75,.25,1.111],10753:[.75,.25,1.111],10754:[.75,.25,1.111],10756:[.75,.249,.833],10758:[.75,.249,.833],10764:[.805,.306,1.638,{ic:.138}],10799:[.491,-.009,.778],10815:[.683,0,.75],10846:[.813,.097,.611],10877:[.636,.138,.778],10878:[.636,.138,.778],10885:[.762,.29,.778],10886:[.762,.29,.778],10887:[.635,.241,.778],10888:[.635,.241,.778],10889:[.761,.387,.778],10890:[.761,.387,.778],10891:[1.003,.463,.778],10892:[1.003,.463,.778],10901:[.636,.138,.778],10902:[.636,.138,.778],10927:[.636,.138,.778],10928:[.636,.138,.778],10933:[.752,.286,.778],10934:[.752,.286,.778],10935:[.761,.294,.778],10936:[.761,.294,.778],10937:[.761,.337,.778],10938:[.761,.337,.778],10949:[.753,.215,.778],10950:[.753,.215,.778],10955:[.783,.385,.778],10956:[.783,.385,.778],12296:[.75,.25,.389],12297:[.75,.25,.389],57350:[.43,.023,.222,{ic:.018}],57351:[.431,.024,.389,{ic:.018}],57352:[.605,.085,.778],57353:[.434,.006,.667,{ic:.067}],57356:[.752,.284,.778],57357:[.752,.284,.778],57358:[.919,.421,.778],57359:[.801,.303,.778],57360:[.801,.303,.778],57361:[.919,.421,.778],57366:[.828,.33,.778],57367:[.752,.332,.778],57368:[.828,.33,.778],57369:[.752,.333,.778],57370:[.634,.255,.778],57371:[.634,.254,.778],119808:[.698,0,.869],119809:[.686,0,.818],119810:[.697,.011,.831],119811:[.686,0,.882],119812:[.68,0,.756],119813:[.68,0,.724],119814:[.697,.01,.904],119815:[.686,0,.9],119816:[.686,0,.436],119817:[.686,.011,.594],119818:[.686,0,.901],119819:[.686,0,.692],119820:[.686,0,1.092],119821:[.686,0,.9],119822:[.696,.01,.864],119823:[.686,0,.786],119824:[.696,.193,.864],119825:[.686,.011,.862],119826:[.697,.011,.639],119827:[.675,0,.8],119828:[.686,.011,.885],119829:[.686,.007,.869],119830:[.686,.007,1.189],119831:[.686,0,.869],119832:[.686,0,.869],119833:[.686,0,.703],119834:[.453,.006,.559],119835:[.694,.006,.639],119836:[.453,.006,.511],119837:[.694,.006,.639],119838:[.452,.006,.527],119839:[.7,0,.351,{ic:.101}],119840:[.455,.201,.575],119841:[.694,0,.639],119842:[.695,0,.319],119843:[.695,.2,.351],119844:[.694,0,.607],119845:[.694,0,.319],119846:[.45,0,.958],119847:[.45,0,.639],119848:[.452,.005,.575],119849:[.45,.194,.639],119850:[.45,.194,.607],119851:[.45,0,.474],119852:[.453,.006,.454],119853:[.635,.005,.447],119854:[.45,.006,.639],119855:[.444,0,.607],119856:[.444,0,.831],119857:[.444,0,.607],119858:[.444,.2,.607],119859:[.444,0,.511],119860:[.716,0,.75,{sk:.139}],119861:[.683,0,.759,{sk:.0833}],119862:[.705,.022,.715,{ic:.045,sk:.0833}],119863:[.683,0,.828,{sk:.0556}],119864:[.68,0,.738,{ic:.026,sk:.0833}],119865:[.68,0,.643,{ic:.106,sk:.0833}],119866:[.705,.022,.786,{sk:.0833}],119867:[.683,0,.831,{ic:.057,sk:.0556}],119868:[.683,0,.44,{ic:.064,sk:.111}],119869:[.683,.022,.555,{ic:.078,sk:.167}],119870:[.683,0,.849,{ic:.04,sk:.0556}],119871:[.683,0,.681,{sk:.0278}],119872:[.683,0,.97,{ic:.081,sk:.0833}],119873:[.683,0,.803,{ic:.085,sk:.0833}],119874:[.704,.022,.763,{sk:.0833}],119875:[.683,0,.642,{ic:.109,sk:.0833}],119876:[.704,.194,.791,{sk:.0833}],119877:[.683,.021,.759,{sk:.0833}],119878:[.705,.022,.613,{ic:.032,sk:.0833}],119879:[.677,0,.584,{ic:.12,sk:.0833}],119880:[.683,.022,.683,{ic:.084,sk:.0278}],119881:[.683,.022,.583,{ic:.186}],119882:[.683,.022,.944,{ic:.104}],119883:[.683,0,.828,{ic:.024,sk:.0833}],119884:[.683,0,.581,{ic:.182}],119885:[.683,0,.683,{ic:.04,sk:.0833}],119886:[.441,.01,.529],119887:[.694,.011,.429],119888:[.442,.011,.433,{sk:.0556}],119889:[.694,.01,.52,{sk:.167}],119890:[.442,.011,.466,{sk:.0556}],119891:[.705,.205,.49,{ic:.06,sk:.167}],119892:[.442,.205,.477,{sk:.0278}],119894:[.661,.011,.345],119895:[.661,.204,.412],119896:[.694,.011,.521],119897:[.694,.011,.298,{sk:.0833}],119898:[.442,.011,.878],119899:[.442,.011,.6],119900:[.441,.011,.485,{sk:.0556}],119901:[.442,.194,.503,{sk:.0833}],119902:[.442,.194,.446,{ic:.014,sk:.0833}],119903:[.442,.011,.451,{sk:.0556}],119904:[.442,.01,.469,{sk:.0556}],119905:[.626,.011,.361,{sk:.0833}],119906:[.442,.011,.572,{sk:.0278}],119907:[.443,.011,.485,{sk:.0278}],119908:[.443,.011,.716,{sk:.0833}],119909:[.442,.011,.572,{sk:.0278}],119910:[.442,.205,.49,{sk:.0556}],119911:[.442,.011,.465,{sk:.0556}],119912:[.711,0,.869,{sk:.16}],119913:[.686,0,.866,{sk:.0958}],119914:[.703,.017,.817,{ic:.038,sk:.0958}],119915:[.686,0,.938,{sk:.0639}],119916:[.68,0,.81,{ic:.015,sk:.0958}],119917:[.68,0,.689,{ic:.12,sk:.0958}],119918:[.703,.016,.887,{sk:.0958}],119919:[.686,0,.982,{ic:.045,sk:.0639}],119920:[.686,0,.511,{ic:.062,sk:.128}],119921:[.686,.017,.631,{ic:.063,sk:.192}],119922:[.686,0,.971,{ic:.032,sk:.0639}],119923:[.686,0,.756,{sk:.0319}],119924:[.686,0,1.142,{ic:.077,sk:.0958}],119925:[.686,0,.95,{ic:.077,sk:.0958}],119926:[.703,.017,.837,{sk:.0958}],119927:[.686,0,.723,{ic:.124,sk:.0958}],119928:[.703,.194,.869,{sk:.0958}],119929:[.686,.017,.872,{sk:.0958}],119930:[.703,.017,.693,{ic:.021,sk:.0958}],119931:[.675,0,.637,{ic:.135,sk:.0958}],119932:[.686,.016,.8,{ic:.077,sk:.0319}],119933:[.686,.016,.678,{ic:.208}],119934:[.686,.017,1.093,{ic:.114}],119935:[.686,0,.947,{sk:.0958}],119936:[.686,0,.675,{ic:.201}],119937:[.686,0,.773,{ic:.032,sk:.0958}],119938:[.452,.008,.633],119939:[.694,.008,.521],119940:[.451,.008,.513,{sk:.0639}],119941:[.694,.008,.61,{sk:.192}],119942:[.452,.008,.554,{sk:.0639}],119943:[.701,.201,.568,{ic:.056,sk:.192}],119944:[.452,.202,.545,{sk:.0319}],119945:[.694,.008,.668,{sk:-.0319}],119946:[.694,.008,.405],119947:[.694,.202,.471],119948:[.694,.008,.604],119949:[.694,.008,.348,{sk:.0958}],119950:[.452,.008,1.032],119951:[.452,.008,.713],119952:[.452,.008,.585,{sk:.0639}],119953:[.452,.194,.601,{sk:.0958}],119954:[.452,.194,.542,{sk:.0958}],119955:[.452,.008,.529,{sk:.0639}],119956:[.451,.008,.531,{sk:.0639}],119957:[.643,.007,.415,{sk:.0958}],119958:[.452,.008,.681,{sk:.0319}],119959:[.453,.008,.567,{sk:.0319}],119960:[.453,.008,.831,{sk:.0958}],119961:[.452,.008,.659,{sk:.0319}],119962:[.452,.202,.59,{sk:.0639}],119963:[.452,.008,.555,{sk:.0639}],119964:[.717,.008,.803,{ic:.213,sk:.389}],119966:[.728,.026,.666,{ic:.153,sk:.278}],119967:[.708,.031,.774,{ic:.081,sk:.111}],119970:[.717,.037,.61,{ic:.128,sk:.25}],119973:[.717,.314,1.052,{ic:.081,sk:.417}],119974:[.717,.037,.914,{ic:.29,sk:.361}],119977:[.726,.036,.902,{ic:.306,sk:.389}],119978:[.707,.008,.738,{ic:.067,sk:.167}],119979:[.716,.037,1.013,{ic:.018,sk:.222}],119980:[.717,.017,.883,{sk:.278}],119982:[.708,.036,.868,{ic:.148,sk:.333}],119983:[.735,.037,.747,{ic:.249,sk:.222}],119984:[.717,.017,.8,{ic:.16,sk:.25}],119985:[.717,.017,.622,{ic:.228,sk:.222}],119986:[.717,.017,.805,{ic:.221,sk:.25}],119987:[.717,.017,.944,{ic:.187,sk:.278}],119988:[.716,.017,.71,{ic:.249,sk:.194}],119989:[.717,.016,.821,{ic:.211,sk:.306}],120068:[.696,.026,.718],120069:[.691,.027,.884],120071:[.685,.027,.832],120072:[.685,.024,.663],120073:[.686,.153,.611],120074:[.69,.026,.785],120077:[.686,.139,.552],120078:[.68,.027,.668,{ic:.014}],120079:[.686,.026,.666],120080:[.692,.027,1.05],120081:[.686,.025,.832],120082:[.729,.027,.827],120083:[.692,.218,.828],120084:[.729,.069,.827],120086:[.692,.027,.829],120087:[.701,.027,.669],120088:[.697,.027,.646,{ic:.019}],120089:[.686,.026,.831],120090:[.686,.027,1.046],120091:[.688,.027,.719],120092:[.686,.218,.833],120094:[.47,.035,.5],120095:[.685,.031,.513],120096:[.466,.029,.389],120097:[.609,.033,.499],120098:[.467,.03,.401],120099:[.681,.221,.326],120100:[.47,.209,.504],120101:[.688,.205,.521],120102:[.673,.02,.279],120103:[.672,.208,.281],120104:[.689,.025,.389],120105:[.685,.02,.28],120106:[.475,.026,.767],120107:[.475,.022,.527],120108:[.48,.028,.489],120109:[.541,.212,.5],120110:[.479,.219,.489],120111:[.474,.021,.389],120112:[.478,.029,.443],120113:[.64,.02,.333,{ic:.015}],120114:[.474,.023,.517],120115:[.53,.028,.512],120116:[.532,.028,.774],120117:[.472,.188,.389],120118:[.528,.218,.499],120119:[.471,.214,.391],120120:[.701,0,.722],120121:[.683,0,.667],120123:[.683,0,.722],120124:[.683,0,.667],120125:[.683,0,.611],120126:[.702,.019,.778],120128:[.683,0,.389],120129:[.683,.077,.5],120130:[.683,0,.778],120131:[.683,0,.667],120132:[.683,0,.944],120134:[.701,.019,.778],120138:[.702,.012,.556],120139:[.683,0,.667],120140:[.683,.019,.722],120141:[.683,.02,.722],120142:[.683,.019,1],120143:[.683,0,.722],120144:[.683,0,.722],120172:[.686,.031,.847],120173:[.684,.031,1.044],120174:[.676,.032,.723],120175:[.683,.029,.982],120176:[.686,.029,.783],120177:[.684,.146,.722],120178:[.687,.029,.927],120179:[.683,.126,.851],120180:[.681,.025,.655],120181:[.68,.141,.652],120182:[.681,.026,.789,{ic:.017}],120183:[.683,.028,.786],120184:[.683,.032,1.239],120185:[.679,.03,.983],120186:[.726,.03,.976],120187:[.688,.223,.977],120188:[.726,.083,.976],120189:[.688,.028,.978],120190:[.685,.031,.978],120191:[.686,.03,.79,{ic:.012}],120192:[.688,.039,.851,{ic:.02}],120193:[.685,.029,.982],120194:[.683,.03,1.235],120195:[.681,.035,.849],120196:[.688,.214,.984],120197:[.677,.148,.711],120198:[.472,.032,.603],120199:[.69,.032,.59],120200:[.473,.026,.464],120201:[.632,.028,.589],120202:[.471,.027,.472],120203:[.687,.222,.388],120204:[.472,.208,.595],120205:[.687,.207,.615],120206:[.686,.025,.331],120207:[.682,.203,.332],120208:[.682,.025,.464],120209:[.681,.024,.337],120210:[.476,.031,.921],120211:[.473,.028,.654],120212:[.482,.034,.609],120213:[.557,.207,.604],120214:[.485,.211,.596],120215:[.472,.026,.46],120216:[.479,.034,.523],120217:[.648,.027,.393,{ic:.014}],120218:[.472,.032,.589,{ic:.014}],120219:[.546,.027,.604],120220:[.549,.032,.918],120221:[.471,.188,.459],120222:[.557,.221,.589],120223:[.471,.214,.461],120224:[.694,0,.667],120225:[.694,0,.667],120226:[.705,.011,.639],120227:[.694,0,.722],120228:[.691,0,.597],120229:[.691,0,.569],120230:[.704,.011,.667],120231:[.694,0,.708],120232:[.694,0,.278],120233:[.694,.022,.472],120234:[.694,0,.694],120235:[.694,0,.542],120236:[.694,0,.875],120237:[.694,0,.708],120238:[.715,.022,.736],120239:[.694,0,.639],120240:[.715,.125,.736],120241:[.694,0,.646],120242:[.716,.022,.556],120243:[.688,0,.681],120244:[.694,.022,.688],120245:[.694,0,.667],120246:[.694,0,.944],120247:[.694,0,.667],120248:[.694,0,.667],120249:[.694,0,.611],120250:[.46,.01,.481],120251:[.694,.011,.517],120252:[.46,.01,.444],120253:[.694,.01,.517],120254:[.461,.01,.444],120255:[.705,0,.306,{ic:.041}],120256:[.455,.206,.5],120257:[.694,0,.517],120258:[.68,0,.239],120259:[.68,.205,.267],120260:[.694,0,.489],120261:[.694,0,.239],120262:[.455,0,.794],120263:[.455,0,.517],120264:[.46,.01,.5],120265:[.455,.194,.517],120266:[.455,.194,.517],120267:[.455,0,.342],120268:[.46,.01,.383],120269:[.571,.01,.361],120270:[.444,.01,.517],120271:[.444,0,.461],120272:[.444,0,.683],120273:[.444,0,.461],120274:[.444,.204,.461],120275:[.444,0,.435],120276:[.694,0,.733],120277:[.694,0,.733],120278:[.704,.011,.703],120279:[.694,0,.794],120280:[.691,0,.642],120281:[.691,0,.611],120282:[.705,.011,.733],120283:[.694,0,.794],120284:[.694,0,.331],120285:[.694,.022,.519],120286:[.694,0,.764],120287:[.694,0,.581],120288:[.694,0,.978],120289:[.694,0,.794],120290:[.716,.022,.794],120291:[.694,0,.703],120292:[.716,.106,.794],120293:[.694,0,.703],120294:[.716,.022,.611],120295:[.688,0,.733],120296:[.694,.022,.764],120297:[.694,0,.733],120298:[.694,0,1.039],120299:[.694,0,.733],120300:[.694,0,.733],120301:[.694,0,.672],120302:[.475,.011,.525],120303:[.694,.01,.561],120304:[.475,.011,.489],120305:[.694,.011,.561],120306:[.474,.01,.511],120307:[.705,0,.336,{ic:.045}],120308:[.469,.206,.55],120309:[.694,0,.561],120310:[.695,0,.256],120311:[.695,.205,.286],120312:[.694,0,.531],120313:[.694,0,.256],120314:[.469,0,.867],120315:[.468,0,.561],120316:[.474,.011,.55],120317:[.469,.194,.561],120318:[.469,.194,.561],120319:[.469,0,.372],120320:[.474,.01,.422],120321:[.589,.01,.404],120322:[.458,.011,.561],120323:[.458,0,.5],120324:[.458,0,.744],120325:[.458,0,.5],120326:[.458,.205,.5],120327:[.458,0,.476],120328:[.694,0,.667],120329:[.694,0,.667,{ic:.029}],120330:[.705,.01,.639,{ic:.08}],120331:[.694,0,.722,{ic:.025}],120332:[.691,0,.597,{ic:.091}],120333:[.691,0,.569,{ic:.104}],120334:[.705,.011,.667,{ic:.063}],120335:[.694,0,.708,{ic:.06}],120336:[.694,0,.278,{ic:.06}],120337:[.694,.022,.472,{ic:.063}],120338:[.694,0,.694,{ic:.091}],120339:[.694,0,.542],120340:[.694,0,.875,{ic:.054}],120341:[.694,0,.708,{ic:.058}],120342:[.716,.022,.736,{ic:.027}],120343:[.694,0,.639,{ic:.051}],120344:[.716,.125,.736,{ic:.027}],120345:[.694,0,.646,{ic:.052}],120346:[.716,.022,.556,{ic:.053}],120347:[.688,0,.681,{ic:.109}],120348:[.694,.022,.688,{ic:.059}],120349:[.694,0,.667,{ic:.132}],120350:[.694,0,.944,{ic:.132}],120351:[.694,0,.667,{ic:.091}],120352:[.694,0,.667,{ic:.143}],120353:[.694,0,.611,{ic:.091}],120354:[.461,.01,.481],120355:[.694,.011,.517,{ic:.022}],120356:[.46,.011,.444,{ic:.055}],120357:[.694,.01,.517,{ic:.071}],120358:[.46,.011,.444,{ic:.028}],120359:[.705,0,.306,{ic:.188}],120360:[.455,.206,.5,{ic:.068}],120361:[.694,0,.517],120362:[.68,0,.239,{ic:.076}],120363:[.68,.204,.267,{ic:.069}],120364:[.694,0,.489,{ic:.054}],120365:[.694,0,.239,{ic:.072}],120366:[.455,0,.794],120367:[.454,0,.517],120368:[.461,.011,.5,{ic:.023}],120369:[.455,.194,.517,{ic:.021}],120370:[.455,.194,.517,{ic:.021}],120371:[.455,0,.342,{ic:.082}],120372:[.461,.011,.383,{ic:.053}],120373:[.571,.011,.361,{ic:.049}],120374:[.444,.01,.517,{ic:.02}],120375:[.444,0,.461,{ic:.079}],120376:[.444,0,.683,{ic:.079}],120377:[.444,0,.461,{ic:.076}],120378:[.444,.205,.461,{ic:.079}],120379:[.444,0,.435,{ic:.059}],120432:[.623,0,.525],120433:[.611,0,.525],120434:[.622,.011,.525],120435:[.611,0,.525],120436:[.611,0,.525],120437:[.611,0,.525],120438:[.622,.011,.525],120439:[.611,0,.525],120440:[.611,0,.525],120441:[.611,.011,.525],120442:[.611,0,.525],120443:[.611,0,.525],120444:[.611,0,.525],120445:[.611,0,.525],120446:[.621,.01,.525],120447:[.611,0,.525],120448:[.621,.138,.525],120449:[.611,.011,.525],120450:[.622,.011,.525],120451:[.611,0,.525],120452:[.611,.011,.525],120453:[.611,.007,.525],120454:[.611,.007,.525],120455:[.611,0,.525],120456:[.611,0,.525],120457:[.611,0,.525],120458:[.439,.006,.525],120459:[.611,.006,.525],120460:[.44,.006,.525],120461:[.611,.006,.525],120462:[.44,.006,.525],120463:[.617,0,.525],120464:[.442,.229,.525],120465:[.611,0,.525],120466:[.612,0,.525],120467:[.612,.228,.525],120468:[.611,0,.525],120469:[.611,0,.525],120470:[.436,0,.525,{ic:.011}],120471:[.436,0,.525],120472:[.44,.006,.525],120473:[.437,.221,.525],120474:[.437,.221,.525,{ic:.02}],120475:[.437,0,.525],120476:[.44,.006,.525],120477:[.554,.006,.525],120478:[.431,.005,.525],120479:[.431,0,.525],120480:[.431,0,.525],120481:[.431,0,.525],120482:[.431,.228,.525],120483:[.431,0,.525],120488:[.698,0,.869],120489:[.686,0,.818],120490:[.68,0,.692],120491:[.698,0,.958],120492:[.68,0,.756],120493:[.686,0,.703],120494:[.686,0,.9],120495:[.696,.01,.894],120496:[.686,0,.436],120497:[.686,0,.901],120498:[.698,0,.806],120499:[.686,0,1.092],120500:[.686,0,.9],120501:[.675,0,.767],120502:[.696,.01,.864],120503:[.68,0,.9],120504:[.686,0,.786],120506:[.686,0,.831],120507:[.675,0,.8],120508:[.697,0,.894],120509:[.686,0,.831],120510:[.686,0,.869],120511:[.686,0,.894],120512:[.696,0,.831],120513:[.686,.024,.958],120546:[.716,0,.75,{sk:.139}],120547:[.683,0,.759,{sk:.0833}],120548:[.68,0,.615,{ic:.106,sk:.0833}],120549:[.716,0,.833,{sk:.167}],120550:[.68,0,.738,{ic:.026,sk:.0833}],120551:[.683,0,.683,{ic:.04,sk:.0833}],120552:[.683,0,.831,{ic:.057,sk:.0556}],120553:[.704,.022,.763,{sk:.0833}],120554:[.683,0,.44,{ic:.064,sk:.111}],120555:[.683,0,.849,{ic:.04,sk:.0556}],120556:[.716,0,.694,{sk:.167}],120557:[.683,0,.97,{ic:.081,sk:.0833}],120558:[.683,0,.803,{ic:.085,sk:.0833}],120559:[.677,0,.742,{ic:.035,sk:.0833}],120560:[.704,.022,.763,{sk:.0833}],120561:[.68,0,.831,{ic:.056,sk:.0556}],120562:[.683,0,.642,{ic:.109,sk:.0833}],120564:[.683,0,.78,{ic:.026,sk:.0833}],120565:[.677,0,.584,{ic:.12,sk:.0833}],120566:[.705,0,.583,{ic:.117,sk:.0556}],120567:[.683,0,.667,{sk:.0833}],120568:[.683,0,.828,{ic:.024,sk:.0833}],120569:[.683,0,.612,{ic:.08,sk:.0556}],120570:[.704,0,.772,{ic:.014,sk:.0833}],120572:[.442,.011,.64,{sk:.0278}],120573:[.705,.194,.566,{sk:.0833}],120574:[.441,.216,.518,{ic:.025}],120575:[.717,.01,.444,{sk:.0556}],120576:[.452,.022,.466,{sk:.0833}],120577:[.704,.204,.438,{ic:.033,sk:.0833}],120578:[.442,.216,.497,{sk:.0556}],120579:[.705,.01,.469,{sk:.0833}],120580:[.442,.01,.354,{sk:.0556}],120581:[.442,.011,.576],120582:[.694,.012,.583],120583:[.442,.216,.603,{sk:.0278}],120584:[.442,0,.494,{ic:.036,sk:.0278}],120585:[.704,.205,.438,{sk:.111}],120586:[.441,.011,.485,{sk:.0556}],120587:[.431,.011,.57],120588:[.442,.216,.517,{sk:.0833}],120589:[.442,.107,.363,{ic:.042,sk:.0833}],120590:[.431,.011,.571],120591:[.431,.013,.437,{ic:.08,sk:.0278}],120592:[.443,.01,.54,{sk:.0278}],120593:[.442,.218,.654,{sk:.0833}],120594:[.442,.204,.626,{sk:.0556}],120595:[.694,.205,.651,{sk:.111}],120596:[.443,.011,.622],120597:[.715,.022,.531,{ic:.035,sk:.0833}],120598:[.431,.011,.406,{sk:.0556}],120599:[.705,.011,.591,{sk:.0833}],120600:[.434,.006,.667,{ic:.067}],120601:[.694,.205,.596,{sk:.0833}],120602:[.442,.194,.517,{sk:.0833}],120603:[.431,.01,.828],120604:[.711,0,.869,{sk:.16}],120605:[.686,0,.866,{sk:.0958}],120606:[.68,0,.657,{ic:.12,sk:.0958}],120607:[.711,0,.958,{sk:.192}],120608:[.68,0,.81,{ic:.015,sk:.0958}],120609:[.686,0,.773,{ic:.032,sk:.0958}],120610:[.686,0,.982,{ic:.045,sk:.0639}],120611:[.702,.017,.867,{sk:.0958}],120612:[.686,0,.511,{ic:.062,sk:.128}],120613:[.686,0,.971,{ic:.032,sk:.0639}],120614:[.711,0,.806,{sk:.192}],120615:[.686,0,1.142,{ic:.077,sk:.0958}],120616:[.686,0,.95,{ic:.077,sk:.0958}],120617:[.675,0,.841,{ic:.026,sk:.0958}],120618:[.703,.017,.837,{sk:.0958}],120619:[.68,0,.982,{ic:.044,sk:.0639}],120620:[.686,0,.723,{ic:.124,sk:.0958}],120622:[.686,0,.885,{ic:.017,sk:.0958}],120623:[.675,0,.637,{ic:.135,sk:.0958}],120624:[.703,0,.671,{ic:.131,sk:.0639}],120625:[.686,0,.767,{sk:.0958}],120626:[.686,0,.947,{sk:.0958}],120627:[.686,0,.714,{ic:.076,sk:.0639}],120628:[.703,0,.879,{sk:.0958}],120630:[.452,.008,.761,{sk:.0319}],120631:[.701,.194,.66,{sk:.0958}],120632:[.451,.211,.59,{ic:.027}],120633:[.725,.008,.522,{sk:.0639}],120634:[.461,.017,.529,{sk:.0958}],120635:[.711,.202,.508,{ic:.013,sk:.0958}],120636:[.452,.211,.6,{sk:.0639}],120637:[.702,.008,.562,{sk:.0958}],120638:[.452,.008,.412,{sk:.0639}],120639:[.452,.008,.668],120640:[.694,.013,.671],120641:[.452,.211,.708,{sk:.0319}],120642:[.452,0,.577,{ic:.031,sk:.0319}],120643:[.711,.201,.508,{sk:.128}],120644:[.452,.008,.585,{sk:.0639}],120645:[.444,.008,.682],120646:[.451,.211,.612,{sk:.0958}],120647:[.451,.105,.424,{ic:.033,sk:.0958}],120648:[.444,.008,.686],120649:[.444,.013,.521,{ic:.089,sk:.0319}],120650:[.453,.008,.631,{sk:.0319}],120651:[.452,.216,.747,{sk:.0958}],120652:[.452,.201,.718,{sk:.0639}],120653:[.694,.202,.758,{sk:.128}],120654:[.453,.008,.718],120655:[.71,.017,.628,{ic:.029,sk:.0958}],120656:[.444,.007,.483,{sk:.0639}],120657:[.701,.008,.692,{sk:.0958}],120658:[.434,.006,.667,{ic:.067}],120659:[.694,.202,.712,{sk:.0958}],120660:[.451,.194,.612,{sk:.0958}],120661:[.444,.008,.975],120662:[.694,0,.733],120663:[.694,0,.733],120664:[.691,0,.581],120665:[.694,0,.917],120666:[.691,0,.642],120667:[.694,0,.672],120668:[.694,0,.794],120669:[.716,.022,.856],120670:[.694,0,.331],120671:[.694,0,.764],120672:[.694,0,.672],120673:[.694,0,.978],120674:[.694,0,.794],120675:[.688,0,.733],120676:[.716,.022,.794],120677:[.691,0,.794],120678:[.694,0,.703],120680:[.694,0,.794],120681:[.688,0,.733],120682:[.715,0,.856],120683:[.694,0,.794],120684:[.694,0,.733],120685:[.694,0,.856],120686:[.716,0,.794],120782:[.654,.01,.575],120783:[.655,0,.575],120784:[.654,0,.575],120785:[.655,.011,.575],120786:[.656,0,.575],120787:[.655,.011,.575],120788:[.655,.011,.575],120789:[.676,.011,.575],120790:[.654,.011,.575],120791:[.654,.011,.575],120802:[.678,.022,.5],120803:[.678,0,.5],120804:[.677,0,.5],120805:[.678,.022,.5],120806:[.656,0,.5],120807:[.656,.021,.5],120808:[.677,.022,.5],120809:[.656,.011,.5],120810:[.678,.022,.5],120811:[.677,.022,.5],120812:[.715,.022,.55],120813:[.716,0,.55],120814:[.716,0,.55],120815:[.716,.022,.55],120816:[.694,0,.55],120817:[.694,.022,.55],120818:[.716,.022,.55],120819:[.695,.011,.55],120820:[.715,.022,.55],120821:[.716,.022,.55],120822:[.621,.01,.525],120823:[.622,0,.525],120824:[.622,0,.525],120825:[.622,.011,.525],120826:[.624,0,.525],120827:[.611,.01,.525],120828:[.622,.011,.525],120829:[.627,.01,.525],120830:[.621,.01,.525],120831:[.622,.011,.525]}},4886:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifBoldItalic=void 0,e.sansSerifBoldItalic={305:[.458,0,.256],567:[.458,.205,.286]}},4471:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifBold=void 0,e.sansSerifBold={33:[.694,0,.367],34:[.694,-.442,.558],35:[.694,.193,.917],36:[.75,.056,.55],37:[.75,.056,1.029],38:[.716,.022,.831],39:[.694,-.442,.306],40:[.75,.249,.428],41:[.75,.25,.428],42:[.75,-.293,.55],43:[.617,.116,.856],44:[.146,.106,.306],45:[.273,-.186,.367],46:[.146,0,.306],47:[.75,.249,.55],58:[.458,0,.306],59:[.458,.106,.306],61:[.407,-.094,.856],63:[.705,0,.519],64:[.704,.011,.733],91:[.75,.25,.343],93:[.75,.25,.343],94:[.694,-.537,.55],95:[-.023,.11,.55],126:[.344,-.198,.55],305:[.458,0,.256],567:[.458,.205,.286],768:[.694,-.537,0],769:[.694,-.537,0],770:[.694,-.537,0],771:[.694,-.548,0],772:[.66,-.56,0],774:[.694,-.552,0],775:[.695,-.596,0],776:[.695,-.595,0],778:[.694,-.538,0],779:[.694,-.537,0],780:[.657,-.5,0],8211:[.327,-.24,.55],8212:[.327,-.24,1.1],8213:[.327,-.24,1.1],8215:[-.023,.11,.55],8216:[.694,-.443,.306],8217:[.694,-.442,.306],8220:[.694,-.443,.558],8221:[.694,-.442,.558],8260:[.75,.249,.55],8710:[.694,0,.917]}},5181:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifItalic=void 0,e.sansSerifItalic={33:[.694,0,.319,{ic:.036}],34:[.694,-.471,.5],35:[.694,.194,.833,{ic:.018}],36:[.75,.056,.5,{ic:.065}],37:[.75,.056,.833],38:[.716,.022,.758],39:[.694,-.471,.278,{ic:.057}],40:[.75,.25,.389,{ic:.102}],41:[.75,.25,.389],42:[.75,-.306,.5,{ic:.068}],43:[.583,.083,.778],44:[.098,.125,.278],45:[.259,-.186,.333],46:[.098,0,.278],47:[.75,.25,.5,{ic:.1}],48:[.678,.022,.5,{ic:.049}],49:[.678,0,.5],50:[.678,0,.5,{ic:.051}],51:[.678,.022,.5,{ic:.044}],52:[.656,0,.5,{ic:.021}],53:[.656,.022,.5,{ic:.055}],54:[.678,.022,.5,{ic:.048}],55:[.656,.011,.5,{ic:.096}],56:[.678,.022,.5,{ic:.054}],57:[.677,.022,.5,{ic:.045}],58:[.444,0,.278],59:[.444,.125,.278],61:[.37,-.13,.778,{ic:.018}],63:[.704,0,.472,{ic:.064}],64:[.705,.01,.667,{ic:.04}],91:[.75,.25,.289,{ic:.136}],93:[.75,.25,.289,{ic:.064}],94:[.694,-.527,.5,{ic:.033}],95:[-.038,.114,.5,{ic:.065}],126:[.327,-.193,.5,{ic:.06}],305:[.444,0,.239,{ic:.019}],567:[.444,.204,.267,{ic:.019}],768:[.694,-.527,0],769:[.694,-.527,0,{ic:.063}],770:[.694,-.527,0,{ic:.033}],771:[.677,-.543,0,{ic:.06}],772:[.631,-.552,0,{ic:.064}],774:[.694,-.508,0,{ic:.073}],775:[.68,-.576,0],776:[.68,-.582,0,{ic:.04}],778:[.693,-.527,0],779:[.694,-.527,0,{ic:.063}],780:[.654,-.487,0,{ic:.06}],913:[.694,0,.667],914:[.694,0,.667,{ic:.029}],915:[.691,0,.542,{ic:.104}],916:[.694,0,.833],917:[.691,0,.597,{ic:.091}],918:[.694,0,.611,{ic:.091}],919:[.694,0,.708,{ic:.06}],920:[.715,.022,.778,{ic:.026}],921:[.694,0,.278,{ic:.06}],922:[.694,0,.694,{ic:.091}],923:[.694,0,.611],924:[.694,0,.875,{ic:.054}],925:[.694,0,.708,{ic:.058}],926:[.688,0,.667,{ic:.098}],927:[.716,.022,.736,{ic:.027}],928:[.691,0,.708,{ic:.06}],929:[.694,0,.639,{ic:.051}],931:[.694,0,.722,{ic:.091}],932:[.688,0,.681,{ic:.109}],933:[.716,0,.778,{ic:.065}],934:[.694,0,.722,{ic:.021}],935:[.694,0,.667,{ic:.091}],936:[.694,0,.778,{ic:.076}],937:[.716,0,.722,{ic:.047}],8211:[.312,-.236,.5,{ic:.065}],8212:[.312,-.236,1,{ic:.065}],8213:[.312,-.236,1,{ic:.065}],8215:[-.038,.114,.5,{ic:.065}],8216:[.694,-.471,.278,{ic:.058}],8217:[.694,-.471,.278,{ic:.057}],8220:[.694,-.471,.5,{ic:.114}],8221:[.694,-.471,.5],8260:[.75,.25,.5,{ic:.1}],8710:[.694,0,.833]}},3526:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerif=void 0,e.sansSerif={33:[.694,0,.319],34:[.694,-.471,.5],35:[.694,.194,.833],36:[.75,.056,.5],37:[.75,.056,.833],38:[.716,.022,.758],39:[.694,-.471,.278],40:[.75,.25,.389],41:[.75,.25,.389],42:[.75,-.306,.5],43:[.583,.082,.778],44:[.098,.125,.278],45:[.259,-.186,.333],46:[.098,0,.278],47:[.75,.25,.5],58:[.444,0,.278],59:[.444,.125,.278],61:[.37,-.13,.778],63:[.704,0,.472],64:[.704,.011,.667],91:[.75,.25,.289],93:[.75,.25,.289],94:[.694,-.527,.5],95:[-.038,.114,.5],126:[.327,-.193,.5],305:[.444,0,.239],567:[.444,.205,.267],768:[.694,-.527,0],769:[.694,-.527,0],770:[.694,-.527,0],771:[.677,-.543,0],772:[.631,-.552,0],774:[.694,-.508,0],775:[.68,-.576,0],776:[.68,-.582,0],778:[.694,-.527,0],779:[.694,-.527,0],780:[.654,-.487,0],913:[.694,0,.667],914:[.694,0,.667],915:[.691,0,.542],916:[.694,0,.833],917:[.691,0,.597],918:[.694,0,.611],919:[.694,0,.708],920:[.716,.021,.778],921:[.694,0,.278],922:[.694,0,.694],923:[.694,0,.611],924:[.694,0,.875],925:[.694,0,.708],926:[.688,0,.667],927:[.715,.022,.736],928:[.691,0,.708],929:[.694,0,.639],931:[.694,0,.722],932:[.688,0,.681],933:[.716,0,.778],934:[.694,0,.722],935:[.694,0,.667],936:[.694,0,.778],937:[.716,0,.722],8211:[.312,-.236,.5],8212:[.312,-.236,1],8213:[.312,-.236,1],8215:[-.038,.114,.5],8216:[.694,-.471,.278],8217:[.694,-.471,.278],8220:[.694,-.471,.5],8221:[.694,-.471,.5],8260:[.75,.25,.5],8710:[.694,0,.833]}},5649:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.scriptBold=void 0,e.scriptBold={}},7153:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.script=void 0,e.script={}},5745:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.smallop=void 0,e.smallop={40:[.85,.349,.458],41:[.85,.349,.458],47:[.85,.349,.578],91:[.85,.349,.417],92:[.85,.349,.578],93:[.85,.349,.417],123:[.85,.349,.583],125:[.85,.349,.583],710:[.744,-.551,.556],732:[.722,-.597,.556],770:[.744,-.551,0],771:[.722,-.597,0],8214:[.602,0,.778],8260:[.85,.349,.578],8593:[.6,0,.667],8595:[.6,0,.667],8657:[.599,0,.778],8659:[.6,0,.778],8719:[.75,.25,.944],8720:[.75,.25,.944],8721:[.75,.25,1.056],8730:[.85,.35,1,{ic:.02}],8739:[.627,.015,.333],8741:[.627,.015,.556],8747:[.805,.306,.472,{ic:.138}],8748:[.805,.306,.819,{ic:.138}],8749:[.805,.306,1.166,{ic:.138}],8750:[.805,.306,.472,{ic:.138}],8896:[.75,.249,.833],8897:[.75,.249,.833],8898:[.75,.249,.833],8899:[.75,.249,.833],8968:[.85,.349,.472],8969:[.85,.349,.472],8970:[.85,.349,.472],8971:[.85,.349,.472],9001:[.85,.35,.472],9002:[.85,.35,.472],9168:[.602,0,.667],10072:[.627,.015,.333],10216:[.85,.35,.472],10217:[.85,.35,.472],10752:[.75,.25,1.111],10753:[.75,.25,1.111],10754:[.75,.25,1.111],10756:[.75,.249,.833],10758:[.75,.249,.833],10764:[.805,.306,1.638,{ic:.138}],12296:[.85,.35,.472],12297:[.85,.35,.472]}},1411:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.texCalligraphicBold=void 0,e.texCalligraphicBold={65:[.751,.049,.921,{ic:.068,sk:.224}],66:[.705,.017,.748,{sk:.16}],67:[.703,.02,.613,{sk:.16}],68:[.686,0,.892,{sk:.0958}],69:[.703,.016,.607,{ic:.02,sk:.128}],70:[.686,.03,.814,{ic:.116,sk:.128}],71:[.703,.113,.682,{sk:.128}],72:[.686,.048,.987,{sk:.128}],73:[.686,0,.642,{ic:.104,sk:.0319}],74:[.686,.114,.779,{ic:.158,sk:.192}],75:[.703,.017,.871,{sk:.0639}],76:[.703,.017,.788,{sk:.16}],77:[.703,.049,1.378,{sk:.16}],78:[.84,.049,.937,{ic:.168,sk:.0958}],79:[.703,.017,.906,{sk:.128}],80:[.686,.067,.81,{ic:.036,sk:.0958}],81:[.703,.146,.939,{sk:.128}],82:[.686,.017,.99,{sk:.0958}],83:[.703,.016,.696,{ic:.025,sk:.16}],84:[.72,.069,.644,{ic:.303,sk:.0319}],85:[.686,.024,.715,{ic:.056,sk:.0958}],86:[.686,.077,.737,{ic:.037,sk:.0319}],87:[.686,.077,1.169,{ic:.037,sk:.0958}],88:[.686,0,.817,{ic:.089,sk:.16}],89:[.686,.164,.759,{ic:.038,sk:.0958}],90:[.686,0,.818,{ic:.035,sk:.16}],305:[.452,.008,.394,{sk:.0319}],567:[.451,.201,.439,{sk:.0958}]}},6384:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.texCalligraphic=void 0,e.texCalligraphic={65:[.728,.05,.798,{ic:.021,sk:.194}],66:[.705,.022,.657,{sk:.139}],67:[.705,.025,.527,{sk:.139}],68:[.683,0,.771,{sk:.0833}],69:[.705,.022,.528,{ic:.036,sk:.111}],70:[.683,.032,.719,{ic:.11,sk:.111}],71:[.704,.119,.595,{sk:.111}],72:[.683,.048,.845,{sk:.111}],73:[.683,0,.545,{ic:.097,sk:.0278}],74:[.683,.119,.678,{ic:.161,sk:.167}],75:[.705,.022,.762,{sk:.0556}],76:[.705,.022,.69,{sk:.139}],77:[.705,.05,1.201,{sk:.139}],78:[.789,.05,.82,{ic:.159,sk:.0833}],79:[.705,.022,.796,{sk:.111}],80:[.683,.057,.696,{ic:.037,sk:.0833}],81:[.705,.131,.817,{sk:.111}],82:[.682,.022,.848,{sk:.0833}],83:[.705,.022,.606,{ic:.036,sk:.139}],84:[.717,.068,.545,{ic:.288,sk:.0278}],85:[.683,.028,.626,{ic:.061,sk:.0833}],86:[.683,.052,.613,{ic:.045,sk:.0278}],87:[.683,.053,.988,{ic:.046,sk:.0833}],88:[.683,0,.713,{ic:.094,sk:.139}],89:[.683,.143,.668,{ic:.046,sk:.0833}],90:[.683,0,.725,{ic:.042,sk:.139}]}},6041:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.texMathit=void 0,e.texMathit={65:[.716,0,.743],66:[.683,0,.704],67:[.705,.021,.716],68:[.683,0,.755],69:[.68,0,.678],70:[.68,0,.653],71:[.705,.022,.774],72:[.683,0,.743],73:[.683,0,.386],74:[.683,.021,.525],75:[.683,0,.769],76:[.683,0,.627],77:[.683,0,.897],78:[.683,0,.743],79:[.704,.022,.767],80:[.683,0,.678],81:[.704,.194,.767],82:[.683,.022,.729],83:[.705,.022,.562],84:[.677,0,.716],85:[.683,.022,.743],86:[.683,.022,.743],87:[.683,.022,.999],88:[.683,0,.743],89:[.683,0,.743],90:[.683,0,.613],97:[.442,.011,.511],98:[.694,.011,.46],99:[.441,.01,.46],100:[.694,.011,.511],101:[.442,.01,.46],102:[.705,.204,.307],103:[.442,.205,.46],104:[.694,.011,.511],105:[.656,.01,.307],106:[.656,.204,.307],107:[.694,.011,.46],108:[.694,.011,.256],109:[.442,.011,.818],110:[.442,.011,.562],111:[.442,.011,.511],112:[.442,.194,.511],113:[.442,.194,.46],114:[.442,.011,.422],115:[.442,.011,.409],116:[.626,.011,.332],117:[.441,.011,.537],118:[.443,.01,.46],119:[.443,.011,.664],120:[.442,.011,.464],121:[.441,.205,.486],122:[.442,.011,.409]}},8199:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.texOldstyleBold=void 0,e.texOldstyleBold={48:[.46,.017,.575],49:[.461,0,.575],50:[.46,0,.575],51:[.461,.211,.575],52:[.469,.194,.575],53:[.461,.211,.575],54:[.66,.017,.575],55:[.476,.211,.575],56:[.661,.017,.575],57:[.461,.21,.575],65:[.751,.049,.921,{ic:.068,sk:.224}],66:[.705,.017,.748,{sk:.16}],67:[.703,.02,.613,{sk:.16}],68:[.686,0,.892,{sk:.0958}],69:[.703,.016,.607,{ic:.02,sk:.128}],70:[.686,.03,.814,{ic:.116,sk:.128}],71:[.703,.113,.682,{sk:.128}],72:[.686,.048,.987,{sk:.128}],73:[.686,0,.642,{ic:.104,sk:.0319}],74:[.686,.114,.779,{ic:.158,sk:.192}],75:[.703,.017,.871,{sk:.0639}],76:[.703,.017,.788,{sk:.16}],77:[.703,.049,1.378,{sk:.16}],78:[.84,.049,.937,{ic:.168,sk:.0958}],79:[.703,.017,.906,{sk:.128}],80:[.686,.067,.81,{ic:.036,sk:.0958}],81:[.703,.146,.939,{sk:.128}],82:[.686,.017,.99,{sk:.0958}],83:[.703,.016,.696,{ic:.025,sk:.16}],84:[.72,.069,.644,{ic:.303,sk:.0319}],85:[.686,.024,.715,{ic:.056,sk:.0958}],86:[.686,.077,.737,{ic:.037,sk:.0319}],87:[.686,.077,1.169,{ic:.037,sk:.0958}],88:[.686,0,.817,{ic:.089,sk:.16}],89:[.686,.164,.759,{ic:.038,sk:.0958}],90:[.686,0,.818,{ic:.035,sk:.16}]}},9848:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.texOldstyle=void 0,e.texOldstyle={48:[.452,.022,.5],49:[.453,0,.5],50:[.453,0,.5],51:[.452,.216,.5],52:[.464,.194,.5],53:[.453,.216,.5],54:[.665,.022,.5],55:[.463,.216,.5],56:[.666,.021,.5],57:[.453,.216,.5],65:[.728,.05,.798,{ic:.021,sk:.194}],66:[.705,.022,.657,{sk:.139}],67:[.705,.025,.527,{sk:.139}],68:[.683,0,.771,{sk:.0833}],69:[.705,.022,.528,{ic:.036,sk:.111}],70:[.683,.032,.719,{ic:.11,sk:.111}],71:[.704,.119,.595,{sk:.111}],72:[.683,.048,.845,{sk:.111}],73:[.683,0,.545,{ic:.097,sk:.0278}],74:[.683,.119,.678,{ic:.161,sk:.167}],75:[.705,.022,.762,{sk:.0556}],76:[.705,.022,.69,{sk:.139}],77:[.705,.05,1.201,{sk:.139}],78:[.789,.05,.82,{ic:.159,sk:.0833}],79:[.705,.022,.796,{sk:.111}],80:[.683,.057,.696,{ic:.037,sk:.0833}],81:[.705,.131,.817,{sk:.111}],82:[.682,.022,.848,{sk:.0833}],83:[.705,.022,.606,{ic:.036,sk:.139}],84:[.717,.068,.545,{ic:.288,sk:.0278}],85:[.683,.028,.626,{ic:.061,sk:.0833}],86:[.683,.052,.613,{ic:.045,sk:.0278}],87:[.683,.053,.988,{ic:.046,sk:.0833}],88:[.683,0,.713,{ic:.094,sk:.139}],89:[.683,.143,.668,{ic:.046,sk:.0833}],90:[.683,0,.725,{ic:.042,sk:.139}]}},7906:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.texSize3=void 0,e.texSize3={40:[1.45,.949,.736],41:[1.45,.949,.736],47:[1.45,.949,1.044],91:[1.45,.949,.528],92:[1.45,.949,1.044],93:[1.45,.949,.528],123:[1.45,.949,.75],125:[1.45,.949,.75],710:[.772,-.564,1.444],732:[.749,-.61,1.444],770:[.772,-.564,0],771:[.749,-.61,0],8260:[1.45,.949,1.044],8730:[1.45,.95,1,{ic:.02}],8968:[1.45,.949,.583],8969:[1.45,.949,.583],8970:[1.45,.949,.583],8971:[1.45,.949,.583],9001:[1.45,.95,.75],9002:[1.45,.949,.75],10216:[1.45,.95,.75],10217:[1.45,.949,.75],12296:[1.45,.95,.75],12297:[1.45,.949,.75]}},2644:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.texSize4=void 0,e.texSize4={40:[1.75,1.249,.792],41:[1.75,1.249,.792],47:[1.75,1.249,1.278],91:[1.75,1.249,.583],92:[1.75,1.249,1.278],93:[1.75,1.249,.583],123:[1.75,1.249,.806],125:[1.75,1.249,.806],710:[.845,-.561,1.889,{ic:.013}],732:[.823,-.583,1.889],770:[.845,-.561,0,{ic:.013}],771:[.823,-.583,0],8260:[1.75,1.249,1.278],8730:[1.75,1.25,1,{ic:.02}],8968:[1.75,1.249,.639],8969:[1.75,1.249,.639],8970:[1.75,1.249,.639],8971:[1.75,1.249,.639],9001:[1.75,1.248,.806],9002:[1.75,1.248,.806],9115:[1.154,.655,.875],9116:[.61,.01,.875],9117:[1.165,.644,.875],9118:[1.154,.655,.875],9119:[.61,.01,.875],9120:[1.165,.644,.875],9121:[1.154,.645,.667],9122:[.602,0,.667],9123:[1.155,.644,.667],9124:[1.154,.645,.667],9125:[.602,0,.667],9126:[1.155,.644,.667],9127:[.899,.01,.889],9128:[1.16,.66,.889],9129:[.01,.899,.889],9130:[.29,.015,.889],9131:[.899,.01,.889],9132:[1.16,.66,.889],9133:[.01,.899,.889],9143:[.935,.885,1.056],10216:[1.75,1.248,.806],10217:[1.75,1.248,.806],12296:[1.75,1.248,.806],12297:[1.75,1.248,.806],57344:[.625,.014,1.056],57345:[.605,.014,1.056,{ic:.02}],57680:[.12,.213,.45,{ic:.01}],57681:[.12,.213,.45,{ic:.024}],57682:[.333,0,.45,{ic:.01}],57683:[.333,0,.45,{ic:.024}],57684:[.32,.2,.4,{ic:.01}],57685:[.333,0,.9,{ic:.01}],57686:[.12,.213,.9,{ic:.01}]}},4926:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.texVariant=void 0,e.texVariant={710:[.845,-.561,2.333,{ic:.013}],732:[.899,-.628,2.333],770:[.845,-.561,0,{ic:.013}],771:[.899,-.628,0],1008:[.434,.006,.667,{ic:.067}],8463:[.695,.013,.54,{ic:.022}],8592:[.437,-.064,.5],8594:[.437,-.064,.5],8652:[.514,.014,1],8708:[.86,.166,.556],8709:[.587,0,.778],8722:[.27,-.23,.5],8726:[.43,.023,.778],8733:[.472,-.028,.778],8739:[.43,.023,.222],8740:[.43,.023,.222,{ic:.018}],8741:[.431,.023,.389],8742:[.431,.024,.389,{ic:.018}],8764:[.365,-.132,.778],8776:[.481,-.05,.778],8808:[.752,.284,.778],8809:[.752,.284,.778],8816:[.919,.421,.778],8817:[.919,.421,.778],8840:[.828,.33,.778],8841:[.828,.33,.778],8842:[.634,.255,.778],8843:[.634,.254,.778],8872:[.694,0,.611],8901:[.189,0,.278],8994:[.378,-.122,.778],8995:[.378,-.143,.778],9651:[.575,.02,.722],9661:[.576,.019,.722],10887:[.801,.303,.778],10888:[.801,.303,.778],10955:[.752,.332,.778],10956:[.752,.333,.778]}},5865:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.MJContextMenu=void 0;var a=r(5073),l=r(6186),c=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.mathItem=null,e.annotation="",e.annotationTypes={},e}return o(e,t),e.prototype.post=function(e,r){if(this.mathItem){if(void 0!==r){var n=this.mathItem.inputJax.name,o=this.findID("Show","Original");o.content="MathML"===n?"Original MathML":n+" Commands",this.findID("Copy","Original").content=o.content;var i=this.findID("Settings","semantics");"MathML"===n?i.disable():i.enable(),this.getAnnotationMenu(),this.dynamicSubmenus()}t.prototype.post.call(this,e,r)}},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.mathItem=null},e.prototype.findID=function(){for(var t,e,r=[],n=0;n<arguments.length;n++)r[n]=arguments[n];var o=this,s=null;try{for(var a=i(r),c=a.next();!c.done;c=a.next()){var u=c.value;o?(s=o.find(u),o=s instanceof l.Submenu?s.submenu:null):s=null}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=a.return)&&e.call(a)}finally{if(t)throw t.error}}return s},e.prototype.getAnnotationMenu=function(){var t=this,e=this.getAnnotations(this.getSemanticNode());this.createAnnotationMenu("Show",e,(function(){return t.showAnnotation.post()})),this.createAnnotationMenu("Copy",e,(function(){return t.copyAnnotation()}))},e.prototype.getSemanticNode=function(){for(var t=this.mathItem.root;t&&!t.isKind("semantics");){if(t.isToken||1!==t.childNodes.length)return null;t=t.childNodes[0]}return t},e.prototype.getAnnotations=function(t){var e,r,n=[];if(!t)return n;try{for(var o=i(t.childNodes),s=o.next();!s.done;s=o.next()){var a=s.value;if(a.isKind("annotation")){var l=this.annotationMatch(a);if(l){var c=a.childNodes.reduce((function(t,e){return t+e.toString()}),"");n.push([l,c])}}}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return n},e.prototype.annotationMatch=function(t){var e,r,n=t.attributes.get("encoding");try{for(var o=i(Object.keys(this.annotationTypes)),s=o.next();!s.done;s=o.next()){var a=s.value;if(this.annotationTypes[a].indexOf(n)>=0)return a}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},e.prototype.createAnnotationMenu=function(t,e,r){var n=this,o=this.findID(t,"Annotation");o.submenu=this.factory.get("subMenu")(this.factory,{items:e.map((function(t){var e=s(t,2),o=e[0],i=e[1];return{type:"command",id:o,content:o,action:function(){n.annotation=i,r()}}})),id:"annotations"},o),e.length?o.enable():o.disable()},e.prototype.dynamicSubmenus=function(){var t,r;try{for(var n=i(e.DynamicSubmenus),o=n.next();!o.done;o=n.next()){var a=s(o.value,2),l=a[0],c=a[1],u=this.find(l);if(u){var p=c(this,u);u.submenu=p,p.items.length?u.enable():u.disable()}}}catch(e){t={error:e}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},e.DynamicSubmenus=new Map,e}(a.ContextMenu);e.MJContextMenu=c},8310:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Menu=void 0;var s=r(5713),a=r(4474),l=r(9515),c=r(7233),u=r(5865),p=r(473),h=r(4414),f=r(4922),d=r(6914),m=r(3463),y=r(7309),g=i(r(5445)),b=l.MathJax,v="undefined"!=typeof window&&window.navigator&&"Mac"===window.navigator.platform.substr(0,3),_=function(){function t(t,e){void 0===e&&(e={});var r=this;this.settings=null,this.defaultSettings=null,this.menu=null,this.MmlVisitor=new p.MmlVisitor,this.jax={CHTML:null,SVG:null},this.rerenderStart=a.STATE.LAST,this.about=new f.Info('<b style="font-size:120%;">MathJax</b> v'+s.mathjax.version,(function(){var t=[];return t.push("Input Jax: "+r.document.inputJax.map((function(t){return t.name})).join(", ")),t.push("Output Jax: "+r.document.outputJax.name),t.push("Document Type: "+r.document.kind),t.join("<br/>")}),'<a href="https://www.mathjax.org">www.mathjax.org</a>'),this.help=new f.Info("<b>MathJax Help</b>",(function(){return["<p><b>MathJax</b> is a JavaScript library that allows page"," authors to include mathematics within their web pages."," As a reader, you don't need to do anything to make that happen.</p>","<p><b>Browsers</b>: MathJax works with all modern browsers including"," Edge, Firefox, Chrome, Safari, Opera, and most mobile browsers.</p>","<p><b>Math Menu</b>: MathJax adds a contextual menu to equations."," Right-click or CTRL-click on any mathematics to access the menu.</p>",'<div style="margin-left: 1em;">',"<p><b>Show Math As:</b> These options allow you to view the formula's"," source markup (as MathML or in its original format).</p>","<p><b>Copy to Clipboard:</b> These options copy the formula's source markup,"," as MathML or in its original format, to the clipboard"," (in browsers that support that).</p>","<p><b>Math Settings:</b> These give you control over features of MathJax,"," such the size of the mathematics, and the mechanism used"," to display equations.</p>","<p><b>Accessibility</b>: MathJax can work with screen"," readers to make mathematics accessible to the visually impaired."," Turn on the explorer to enable generation of speech strings"," and the ability to investigate expressions interactively.</p>","<p><b>Language</b>: This menu lets you select the language used by MathJax"," for its menus and warning messages. (Not yet implemented in version 3.)</p>","</div>","<p><b>Math Zoom</b>: If you are having difficulty reading an"," equation, MathJax can enlarge it to help you see it better, or"," you can scall all the math on the page to make it larger."," Turn these features on in the <b>Math Settings</b> menu.</p>","<p><b>Preferences</b>: MathJax uses your browser's localStorage database"," to save the preferences set via this menu locally in your browser. These"," are not used to track you, and are not transferred or used remotely by"," MathJax in any way.</p>"].join("\n")}),'<a href="https://www.mathjax.org">www.mathjax.org</a>'),this.mathmlCode=new h.SelectableInfo("MathJax MathML Expression",(function(){if(!r.menu.mathItem)return"";var t=r.toMML(r.menu.mathItem);return"<pre>"+r.formatSource(t)+"</pre>"}),""),this.originalText=new h.SelectableInfo("MathJax Original Source",(function(){if(!r.menu.mathItem)return"";var t=r.menu.mathItem.math;return'<pre style="font-size:125%; margin:0">'+r.formatSource(t)+"</pre>"}),""),this.annotationText=new h.SelectableInfo("MathJax Annotation Text",(function(){if(!r.menu.mathItem)return"";var t=r.menu.annotation;return'<pre style="font-size:125%; margin:0">'+r.formatSource(t)+"</pre>"}),""),this.zoomBox=new f.Info("MathJax Zoomed Expression",(function(){if(!r.menu.mathItem)return"";var t=r.menu.mathItem.typesetRoot.cloneNode(!0);return t.style.margin="0",'<div style="font-size: '+1.25*parseFloat(r.settings.zscale)+'%">'+t.outerHTML+"</div>"}),""),this.document=t,this.options=(0,c.userOptions)((0,c.defaultOptions)({},this.constructor.OPTIONS),e),this.initSettings(),this.mergeUserSettings(),this.initMenu(),this.applySettings()}return Object.defineProperty(t.prototype,"isLoading",{get:function(){return t.loading>0},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"loadingPromise",{get:function(){return this.isLoading?(t._loadingPromise||(t._loadingPromise=new Promise((function(e,r){t._loadingOK=e,t._loadingFailed=r}))),t._loadingPromise):Promise.resolve()},enumerable:!1,configurable:!0}),t.prototype.initSettings=function(){this.settings=this.options.settings,this.jax=this.options.jax;var t=this.document.outputJax;this.jax[t.name]=t,this.settings.renderer=t.name,b._.a11y&&b._.a11y.explorer&&Object.assign(this.settings,this.document.options.a11y),this.settings.scale=t.options.scale,this.defaultSettings=Object.assign({},this.settings)},t.prototype.initMenu=function(){var t=this,e=new d.Parser([["contextMenu",u.MJContextMenu.fromJson.bind(u.MJContextMenu)]]);this.menu=e.parse({type:"contextMenu",id:"MathJax_Menu",pool:[this.variable("texHints"),this.variable("semantics"),this.variable("zoom"),this.variable("zscale"),this.variable("renderer",(function(e){return t.setRenderer(e)})),this.variable("alt"),this.variable("cmd"),this.variable("ctrl"),this.variable("shift"),this.variable("scale",(function(e){return t.setScale(e)})),this.variable("explorer",(function(e){return t.setExplorer(e)})),this.a11yVar("highlight"),this.a11yVar("backgroundColor"),this.a11yVar("backgroundOpacity"),this.a11yVar("foregroundColor"),this.a11yVar("foregroundOpacity"),this.a11yVar("speech"),this.a11yVar("subtitles"),this.a11yVar("braille"),this.a11yVar("viewBraille"),this.a11yVar("locale",(function(t){return g.default.setupEngine({locale:t})})),this.a11yVar("speechRules",(function(e){var r=n(e.split("-"),2),o=r[0],i=r[1];t.document.options.sre.domain=o,t.document.options.sre.style=i})),this.a11yVar("magnification"),this.a11yVar("magnify"),this.a11yVar("treeColoring"),this.a11yVar("infoType"),this.a11yVar("infoRole"),this.a11yVar("infoPrefix"),this.variable("autocollapse"),this.variable("collapsible",(function(e){return t.setCollapsible(e)})),this.variable("inTabOrder",(function(e){return t.setTabOrder(e)})),this.variable("assistiveMml",(function(e){return t.setAssistiveMml(e)}))],items:[this.submenu("Show","Show Math As",[this.command("MathMLcode","MathML Code",(function(){return t.mathmlCode.post()})),this.command("Original","Original Form",(function(){return t.originalText.post()})),this.submenu("Annotation","Annotation")]),this.submenu("Copy","Copy to Clipboard",[this.command("MathMLcode","MathML Code",(function(){return t.copyMathML()})),this.command("Original","Original Form",(function(){return t.copyOriginal()})),this.submenu("Annotation","Annotation")]),this.rule(),this.submenu("Settings","Math Settings",[this.submenu("Renderer","Math Renderer",this.radioGroup("renderer",[["CHTML"],["SVG"]])),this.rule(),this.submenu("ZoomTrigger","Zoom Trigger",[this.command("ZoomNow","Zoom Once Now",(function(){return t.zoom(null,"",t.menu.mathItem)})),this.rule(),this.radioGroup("zoom",[["Click"],["DoubleClick","Double-Click"],["NoZoom","No Zoom"]]),this.rule(),this.label("TriggerRequires","Trigger Requires:"),this.checkbox(v?"Option":"Alt",v?"Option":"Alt","alt"),this.checkbox("Command","Command","cmd",{hidden:!v}),this.checkbox("Control","Control","ctrl",{hiddne:v}),this.checkbox("Shift","Shift","shift")]),this.submenu("ZoomFactor","Zoom Factor",this.radioGroup("zscale",[["150%"],["175%"],["200%"],["250%"],["300%"],["400%"]])),this.rule(),this.command("Scale","Scale All Math...",(function(){return t.scaleAllMath()})),this.rule(),this.checkbox("texHints","Add TeX hints to MathML","texHints"),this.checkbox("semantics","Add original as annotation","semantics"),this.rule(),this.command("Reset","Reset to defaults",(function(){return t.resetDefaults()}))]),this.submenu("Accessibility","Accessibility",[this.checkbox("Activate","Activate","explorer"),this.submenu("Speech","Speech",[this.checkbox("Speech","Speech Output","speech"),this.checkbox("Subtitles","Speech Subtitles","subtitles"),this.checkbox("Braille","Braille Output","braille"),this.checkbox("View Braille","Braille Subtitles","viewBraille"),this.rule(),this.submenu("A11yLanguage","Language"),this.rule(),this.submenu("Mathspeak","Mathspeak Rules",this.radioGroup("speechRules",[["mathspeak-default","Verbose"],["mathspeak-brief","Brief"],["mathspeak-sbrief","Superbrief"]])),this.submenu("Clearspeak","Clearspeak Rules",this.radioGroup("speechRules",[["clearspeak-default","Auto"]])),this.submenu("ChromeVox","ChromeVox Rules",this.radioGroup("speechRules",[["chromevox-default","Standard"],["chromevox-alternative","Alternative"]]))]),this.submenu("Highlight","Highlight",[this.submenu("Background","Background",this.radioGroup("backgroundColor",[["Blue"],["Red"],["Green"],["Yellow"],["Cyan"],["Magenta"],["White"],["Black"]])),{type:"slider",variable:"backgroundOpacity",content:" "},this.submenu("Foreground","Foreground",this.radioGroup("foregroundColor",[["Black"],["White"],["Magenta"],["Cyan"],["Yellow"],["Green"],["Red"],["Blue"]])),{type:"slider",variable:"foregroundOpacity",content:" "},this.rule(),this.radioGroup("highlight",[["None"],["Hover"],["Flame"]]),this.rule(),this.checkbox("TreeColoring","Tree Coloring","treeColoring")]),this.submenu("Magnification","Magnification",[this.radioGroup("magnification",[["None"],["Keyboard"],["Mouse"]]),this.rule(),this.radioGroup("magnify",[["200%"],["300%"],["400%"],["500%"]])]),this.submenu("Semantic Info","Semantic Info",[this.checkbox("Type","Type","infoType"),this.checkbox("Role","Role","infoRole"),this.checkbox("Prefix","Prefix","infoPrefix")],!0),this.rule(),this.checkbox("Collapsible","Collapsible Math","collapsible"),this.checkbox("AutoCollapse","Auto Collapse","autocollapse",{disabled:!0}),this.rule(),this.checkbox("InTabOrder","Include in Tab Order","inTabOrder"),this.checkbox("AssistiveMml","Include Hidden MathML","assistiveMml")]),this.submenu("Language","Language"),this.rule(),this.command("About","About MathJax",(function(){return t.about.post()})),this.command("Help","MathJax Help",(function(){return t.help.post()}))]});var r=this.menu;this.about.attachMenu(r),this.help.attachMenu(r),this.originalText.attachMenu(r),this.annotationText.attachMenu(r),this.mathmlCode.attachMenu(r),this.zoomBox.attachMenu(r),this.checkLoadableItems(),this.enableExplorerItems(this.settings.explorer),r.showAnnotation=this.annotationText,r.copyAnnotation=this.copyAnnotation.bind(this),r.annotationTypes=this.options.annotationTypes,y.CssStyles.addInfoStyles(this.document.document),y.CssStyles.addMenuStyles(this.document.document)},t.prototype.checkLoadableItems=function(){var t,e;if(b&&b._&&b.loader&&b.startup)!this.settings.collapsible||b._.a11y&&b._.a11y.complexity||this.loadA11y("complexity"),!this.settings.explorer||b._.a11y&&b._.a11y.explorer||this.loadA11y("explorer"),!this.settings.assistiveMml||b._.a11y&&b._.a11y["assistive-mml"]||this.loadA11y("assistive-mml");else{var r=this.menu;try{for(var n=o(Object.keys(this.jax)),i=n.next();!i.done;i=n.next()){var s=i.value;this.jax[s]||r.findID("Settings","Renderer",s).disable()}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}r.findID("Accessibility","Activate").disable(),r.findID("Accessibility","AutoCollapse").disable(),r.findID("Accessibility","Collapsible").disable()}},t.prototype.enableExplorerItems=function(t){var e,r,n=this.menu.findID("Accessibility","Activate").menu;try{for(var i=o(n.items.slice(1)),s=i.next();!s.done;s=i.next()){var a=s.value;if(a instanceof m.Rule)break;t?a.enable():a.disable()}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},t.prototype.mergeUserSettings=function(){try{var e=localStorage.getItem(t.MENU_STORAGE);if(!e)return;Object.assign(this.settings,JSON.parse(e)),this.setA11y(this.settings)}catch(t){console.log("MathJax localStorage error: "+t.message)}},t.prototype.saveUserSettings=function(){var e,r,n={};try{for(var i=o(Object.keys(this.settings)),s=i.next();!s.done;s=i.next()){var a=s.value;this.settings[a]!==this.defaultSettings[a]&&(n[a]=this.settings[a])}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}try{Object.keys(n).length?localStorage.setItem(t.MENU_STORAGE,JSON.stringify(n)):localStorage.removeItem(t.MENU_STORAGE)}catch(t){console.log("MathJax localStorage error: "+t.message)}},t.prototype.setA11y=function(t){b._.a11y&&b._.a11y.explorer&&b._.a11y.explorer_ts.setA11yOptions(this.document,t)},t.prototype.getA11y=function(t){if(b._.a11y&&b._.a11y.explorer)return void 0!==this.document.options.a11y[t]?this.document.options.a11y[t]:this.document.options.sre[t]},t.prototype.applySettings=function(){this.setTabOrder(this.settings.inTabOrder),this.document.options.enableAssistiveMml=this.settings.assistiveMml,this.document.outputJax.options.scale=parseFloat(this.settings.scale),this.settings.renderer!==this.defaultSettings.renderer&&this.setRenderer(this.settings.renderer)},t.prototype.setScale=function(t){this.document.outputJax.options.scale=parseFloat(t),this.document.rerender()},t.prototype.setRenderer=function(t){var e=this;if(this.jax[t])this.setOutputJax(t);else{var r=t.toLowerCase();this.loadComponent("output/"+r,(function(){var n=b.startup;r in n.constructors&&(n.useOutput(r,!0),n.output=n.getOutputJax(),e.jax[t]=n.output,e.setOutputJax(t))}))}},t.prototype.setOutputJax=function(t){this.jax[t].setAdaptor(this.document.adaptor),this.document.outputJax=this.jax[t],this.rerender()},t.prototype.setTabOrder=function(t){this.menu.store.inTaborder(t)},t.prototype.setAssistiveMml=function(t){this.document.options.enableAssistiveMml=t,!t||b._.a11y&&b._.a11y["assistive-mml"]?this.rerender():this.loadA11y("assistive-mml")},t.prototype.setExplorer=function(t){this.enableExplorerItems(t),this.document.options.enableExplorer=t,!t||b._.a11y&&b._.a11y.explorer?this.rerender(this.settings.collapsible?a.STATE.RERENDER:a.STATE.COMPILED):this.loadA11y("explorer")},t.prototype.setCollapsible=function(t){this.document.options.enableComplexity=t,!t||b._.a11y&&b._.a11y.complexity?this.rerender(a.STATE.COMPILED):this.loadA11y("complexity")},t.prototype.scaleAllMath=function(){var t=(100*parseFloat(this.settings.scale)).toFixed(1).replace(/.0$/,""),e=prompt("Scale all mathematics (compared to surrounding text) by",t+"%");if(e)if(e.match(/^\s*\d+(\.\d*)?\s*%?\s*$/)){var r=parseFloat(e)/100;r?this.menu.pool.lookup("scale").setValue(String(r)):alert("The scale should not be zero")}else alert("The scale should be a percentage (e.g., 120%)")},t.prototype.resetDefaults=function(){var e,r;t.loading++;var n=this.menu.pool,i=this.defaultSettings;try{for(var s=o(Object.keys(this.settings)),l=s.next();!l.done;l=s.next()){var c=l.value,u=n.lookup(c);if(u){u.setValue(i[c]);var p=u.items[0];p&&p.executeCallbacks_()}else this.settings[c]=i[c]}}catch(t){e={error:t}}finally{try{l&&!l.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}t.loading--,this.rerender(a.STATE.COMPILED)},t.prototype.checkComponent=function(e){var r=t.loadingPromises.get(e);r&&s.mathjax.retryAfter(r)},t.prototype.loadComponent=function(e,r){if(!t.loadingPromises.has(e)){var n=b.loader;if(n){t.loading++;var o=n.load(e).then((function(){t.loading--,t.loadingPromises.delete(e),r(),0===t.loading&&t._loadingPromise&&(t._loadingPromise=null,t._loadingOK())})).catch((function(e){t._loadingPromise?(t._loadingPromise=null,t._loadingFailed(e)):console.log(e)}));t.loadingPromises.set(e,o)}}},t.prototype.loadA11y=function(e){var r=this,n=!a.STATE.ENRICHED;this.loadComponent("a11y/"+e,(function(){var o=b.startup;s.mathjax.handlers.unregister(o.handler),o.handler=o.getHandler(),s.mathjax.handlers.register(o.handler);var i=r.document;r.document=o.document=o.getDocument(),r.document.menu=r,r.document.outputJax.reset(),r.transferMathList(i),r.document.processed=i.processed,t._loadingPromise||(r.document.outputJax.reset(),r.rerender("complexity"===e||n?a.STATE.COMPILED:a.STATE.TYPESET))}))},t.prototype.transferMathList=function(t){var e,r,n=this.document.options.MathItem;try{for(var i=o(t.math),s=i.next();!s.done;s=i.next()){var a=s.value,l=new n;Object.assign(l,a),this.document.math.push(l)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},t.prototype.formatSource=function(t){return t.trim().replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")},t.prototype.toMML=function(t){return this.MmlVisitor.visitTree(t.root,t,{texHints:this.settings.texHints,semantics:this.settings.semantics&&"MathML"!==t.inputJax.name})},t.prototype.zoom=function(t,e,r){t&&!this.isZoomEvent(t,e)||(this.menu.mathItem=r,t&&this.menu.post(t),this.zoomBox.post())},t.prototype.isZoomEvent=function(t,e){return this.settings.zoom===e&&(!this.settings.alt||t.altKey)&&(!this.settings.ctrl||t.ctrlKey)&&(!this.settings.cmd||t.metaKey)&&(!this.settings.shift||t.shiftKey)},t.prototype.rerender=function(e){void 0===e&&(e=a.STATE.TYPESET),this.rerenderStart=Math.min(e,this.rerenderStart),t.loading||(this.rerenderStart<=a.STATE.COMPILED&&this.document.reset({inputJax:[]}),this.document.rerender(this.rerenderStart),this.rerenderStart=a.STATE.LAST)},t.prototype.copyMathML=function(){this.copyToClipboard(this.toMML(this.menu.mathItem))},t.prototype.copyOriginal=function(){this.copyToClipboard(this.menu.mathItem.math.trim())},t.prototype.copyAnnotation=function(){this.copyToClipboard(this.menu.annotation.trim())},t.prototype.copyToClipboard=function(t){var e=document.createElement("textarea");e.value=t,e.setAttribute("readonly",""),e.style.cssText="height: 1px; width: 1px; padding: 1px; position: absolute; left: -10px",document.body.appendChild(e),e.select();try{document.execCommand("copy")}catch(t){alert("Can't copy to clipboard: "+t.message)}document.body.removeChild(e)},t.prototype.addMenu=function(t){var e=this,r=t.typesetRoot;r.addEventListener("contextmenu",(function(){return e.menu.mathItem=t}),!0),r.addEventListener("keydown",(function(){return e.menu.mathItem=t}),!0),r.addEventListener("click",(function(r){return e.zoom(r,"Click",t)}),!0),r.addEventListener("dblclick",(function(r){return e.zoom(r,"DoubleClick",t)}),!0),this.menu.store.insert(r)},t.prototype.clear=function(){this.menu.store.clear()},t.prototype.variable=function(t,e){var r=this;return{name:t,getter:function(){return r.settings[t]},setter:function(n){r.settings[t]=n,e&&e(n),r.saveUserSettings()}}},t.prototype.a11yVar=function(t,e){var r=this;return{name:t,getter:function(){return r.getA11y(t)},setter:function(n){r.settings[t]=n;var o={};o[t]=n,r.setA11y(o),e&&e(n),r.saveUserSettings()}}},t.prototype.submenu=function(t,e,r,n){var i,s;void 0===r&&(r=[]),void 0===n&&(n=!1);var a=[];try{for(var l=o(r),c=l.next();!c.done;c=l.next()){var u=c.value;Array.isArray(u)?a=a.concat(u):a.push(u)}}catch(t){i={error:t}}finally{try{c&&!c.done&&(s=l.return)&&s.call(l)}finally{if(i)throw i.error}}return{type:"submenu",id:t,content:e,menu:{items:a},disabled:0===a.length||n}},t.prototype.command=function(t,e,r,n){return void 0===n&&(n={}),Object.assign({type:"command",id:t,content:e,action:r},n)},t.prototype.checkbox=function(t,e,r,n){return void 0===n&&(n={}),Object.assign({type:"checkbox",id:t,content:e,variable:r},n)},t.prototype.radioGroup=function(t,e){var r=this;return e.map((function(e){return r.radio(e[0],e[1]||e[0],t)}))},t.prototype.radio=function(t,e,r,n){return void 0===n&&(n={}),Object.assign({type:"radio",id:t,content:e,variable:r},n)},t.prototype.label=function(t,e){return{type:"label",id:t,content:e}},t.prototype.rule=function(){return{type:"rule"}},t.MENU_STORAGE="MathJax-Menu-Settings",t.OPTIONS={settings:{texHints:!0,semantics:!1,zoom:"NoZoom",zscale:"200%",renderer:"CHTML",alt:!1,cmd:!1,ctrl:!1,shift:!1,scale:1,autocollapse:!1,collapsible:!1,inTabOrder:!0,assistiveMml:!0,explorer:!1},jax:{CHTML:null,SVG:null},annotationTypes:(0,c.expandable)({TeX:["TeX","LaTeX","application/x-tex"],StarMath:["StarMath 5.0"],Maple:["Maple"],ContentMathML:["MathML-Content","application/mathml-content+xml"],OpenMath:["OpenMath"]})},t.loading=0,t.loadingPromises=new Map,t._loadingPromise=null,t._loadingOK=null,t._loadingFailed=null,t}();e.Menu=_},4001:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MenuHandler=e.MenuMathDocumentMixin=e.MenuMathItemMixin=void 0;var c=r(5713),u=r(4474),p=r(7233),h=r(8310);function f(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addMenu=function(t,e){void 0===e&&(e=!1),this.state()>=u.STATE.CONTEXT_MENU||(this.isEscaped||!t.options.enableMenu&&!e||t.menu.addMenu(this),this.state(u.STATE.CONTEXT_MENU))},e.prototype.checkLoading=function(t){t.checkLoading()},e}(t)}function d(t){var e;return e=function(t){function e(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];var n=t.apply(this,a([],s(e),!1))||this;n.menu=new n.options.MenuClass(n,n.options.menuOptions);var o=n.constructor.ProcessBits;return o.has("context-menu")||o.allocate("context-menu"),n.options.MathItem=f(n.options.MathItem),n}return o(e,t),e.prototype.addMenu=function(){var t,e;if(!this.processed.isSet("context-menu")){try{for(var r=l(this.math),n=r.next();!n.done;n=r.next()){n.value.addMenu(this)}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}this.processed.set("context-menu")}return this},e.prototype.checkLoading=function(){this.menu.isLoading&&c.mathjax.retryAfter(this.menu.loadingPromise.catch((function(t){return console.log(t)})));var t=this.menu.settings;return t.collapsible&&(this.options.enableComplexity=!0,this.menu.checkComponent("a11y/complexity")),t.explorer&&(this.options.enableEnrichment=!0,this.options.enableExplorer=!0,this.menu.checkComponent("a11y/explorer")),this},e.prototype.state=function(e,r){return void 0===r&&(r=!1),t.prototype.state.call(this,e,r),e<u.STATE.CONTEXT_MENU&&this.processed.clear("context-menu"),this},e.prototype.updateDocument=function(){return t.prototype.updateDocument.call(this),this.menu.menu.store.sort(),this},e}(t),e.OPTIONS=i(i({enableEnrichment:!0,enableComplexity:!0,enableExplorer:!0,enrichSpeech:"none",enrichError:function(t,e,r){return console.warn("Enrichment Error:",r)}},t.OPTIONS),{MenuClass:h.Menu,menuOptions:h.Menu.OPTIONS,enableMenu:!0,sre:t.OPTIONS.sre||(0,p.expandable)({}),a11y:t.OPTIONS.a11y||(0,p.expandable)({}),renderActions:(0,p.expandable)(i(i({},t.OPTIONS.renderActions),{addMenu:[u.STATE.CONTEXT_MENU],checkLoading:[u.STATE.UNPROCESSED+1]}))}),e}(0,u.newState)("CONTEXT_MENU",170),e.MenuMathItemMixin=f,e.MenuMathDocumentMixin=d,e.MenuHandler=function(t){return t.documentClass=d(t.documentClass),t}},473:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.MmlVisitor=void 0;var i=r(9259),s=r(7233),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.options={texHints:!0,semantics:!1},e.mathItem=null,e}return o(e,t),e.prototype.visitTree=function(t,e,r){return void 0===e&&(e=null),void 0===r&&(r={}),this.mathItem=e,(0,s.userOptions)(this.options,r),this.visitNode(t,"")},e.prototype.visitTeXAtomNode=function(e,r){return this.options.texHints?t.prototype.visitTeXAtomNode.call(this,e,r):e.childNodes[0]&&1===e.childNodes[0].childNodes.length?this.visitNode(e.childNodes[0],r):r+"<mrow"+this.getAttributes(e)+">\n"+this.childNodeMml(e,r+" ","\n")+r+"</mrow>"},e.prototype.visitMathNode=function(e,r){if(!this.options.semantics||"TeX"!==this.mathItem.inputJax.name)return t.prototype.visitDefault.call(this,e,r);var n=e.childNodes.length&&e.childNodes[0].childNodes.length>1;return r+"<math"+this.getAttributes(e)+">\n"+r+" <semantics>\n"+(n?r+" <mrow>\n":"")+this.childNodeMml(e,r+(n?" ":" "),"\n")+(n?r+" </mrow>\n":"")+r+' <annotation encoding="application/x-tex">'+this.mathItem.math+"</annotation>\n"+r+" </semantics>\n"+r+"</math>"},e}(i.SerializedMmlVisitor);e.MmlVisitor=a},4414:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SelectableInfo=void 0;var i=r(4922),s=r(2165),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addEvents=function(t){var e=this;t.addEventListener("keypress",(function(t){"a"===t.key&&(t.ctrlKey||t.metaKey)&&(e.selectAll(),e.stop(t))}))},e.prototype.selectAll=function(){document.getSelection().selectAllChildren(this.html.querySelector("pre"))},e.prototype.copyToClipboard=function(){this.selectAll();try{document.execCommand("copy")}catch(t){alert("Can't copy to clipboard: "+t.message)}document.getSelection().removeAllRanges()},e.prototype.generateHtml=function(){var e=this;t.prototype.generateHtml.call(this);var r=this.html.querySelector("span."+s.HtmlClasses.INFOSIGNATURE).appendChild(document.createElement("input"));r.type="button",r.value="Copy to Clipboard",r.addEventListener("click",(function(t){return e.copyToClipboard()}))},e}(i.Info);e.SelectableInfo=a},9923:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.asyncLoad=void 0;var n=r(5713);e.asyncLoad=function(t){return n.mathjax.asyncLoad?new Promise((function(e,r){var o=n.mathjax.asyncLoad(t);o instanceof Promise?o.then((function(t){return e(t)})).catch((function(t){return r(t)})):e(o)})):Promise.reject("Can't load '".concat(t,"': No asyncLoad method specified"))}},6469:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.BBox=void 0;var n=r(6010),o=function(){function t(t){void 0===t&&(t={w:0,h:-n.BIGDIMEN,d:-n.BIGDIMEN}),this.w=t.w||0,this.h="h"in t?t.h:-n.BIGDIMEN,this.d="d"in t?t.d:-n.BIGDIMEN,this.L=this.R=this.ic=this.sk=this.dx=0,this.scale=this.rscale=1,this.pwidth=""}return t.zero=function(){return new t({h:0,d:0,w:0})},t.empty=function(){return new t},t.prototype.empty=function(){return this.w=0,this.h=this.d=-n.BIGDIMEN,this},t.prototype.clean=function(){this.w===-n.BIGDIMEN&&(this.w=0),this.h===-n.BIGDIMEN&&(this.h=0),this.d===-n.BIGDIMEN&&(this.d=0)},t.prototype.rescale=function(t){this.w*=t,this.h*=t,this.d*=t},t.prototype.combine=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=0);var n=t.rscale,o=e+n*(t.w+t.L+t.R),i=r+n*t.h,s=n*t.d-r;o>this.w&&(this.w=o),i>this.h&&(this.h=i),s>this.d&&(this.d=s)},t.prototype.append=function(t){var e=t.rscale;this.w+=e*(t.w+t.L+t.R),e*t.h>this.h&&(this.h=e*t.h),e*t.d>this.d&&(this.d=e*t.d)},t.prototype.updateFrom=function(t){this.h=t.h,this.d=t.d,this.w=t.w,t.pwidth&&(this.pwidth=t.pwidth)},t.fullWidth="100%",t.StyleAdjust=[["borderTopWidth","h"],["borderRightWidth","w"],["borderBottomWidth","d"],["borderLeftWidth","w",0],["paddingTop","h"],["paddingRight","w"],["paddingBottom","d"],["paddingLeft","w",0]],t}();e.BBox=o},6751:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.BitFieldClass=e.BitField=void 0;var a=function(){function t(){this.bits=0}return t.allocate=function(){for(var e,r,n=[],i=0;i<arguments.length;i++)n[i]=arguments[i];try{for(var s=o(n),a=s.next();!a.done;a=s.next()){var l=a.value;if(this.has(l))throw new Error("Bit already allocated for "+l);if(this.next===t.MAXBIT)throw new Error("Maximum number of bits already allocated");this.names.set(l,this.next),this.next<<=1}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}},t.has=function(t){return this.names.has(t)},t.prototype.set=function(t){this.bits|=this.getBit(t)},t.prototype.clear=function(t){this.bits&=~this.getBit(t)},t.prototype.isSet=function(t){return!!(this.bits&this.getBit(t))},t.prototype.reset=function(){this.bits=0},t.prototype.getBit=function(t){var e=this.constructor.names.get(t);if(!e)throw new Error("Unknown bit-field name: "+t);return e},t.MAXBIT=1<<31,t.next=1,t.names=new Map,t}();e.BitField=a,e.BitFieldClass=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var r=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(a);return r.allocate.apply(r,s([],i(t),!1)),r}},5368:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.numeric=e.translate=e.remove=e.add=e.entities=e.options=void 0;var n=r(4542),o=r(9923);e.options={loadMissingEntities:!0},e.entities={ApplyFunction:"\u2061",Backslash:"\u2216",Because:"\u2235",Breve:"\u02d8",Cap:"\u22d2",CenterDot:"\xb7",CircleDot:"\u2299",CircleMinus:"\u2296",CirclePlus:"\u2295",CircleTimes:"\u2297",Congruent:"\u2261",ContourIntegral:"\u222e",Coproduct:"\u2210",Cross:"\u2a2f",Cup:"\u22d3",CupCap:"\u224d",Dagger:"\u2021",Del:"\u2207",Delta:"\u0394",Diamond:"\u22c4",DifferentialD:"\u2146",DotEqual:"\u2250",DoubleDot:"\xa8",DoubleRightTee:"\u22a8",DoubleVerticalBar:"\u2225",DownArrow:"\u2193",DownLeftVector:"\u21bd",DownRightVector:"\u21c1",DownTee:"\u22a4",Downarrow:"\u21d3",Element:"\u2208",EqualTilde:"\u2242",Equilibrium:"\u21cc",Exists:"\u2203",ExponentialE:"\u2147",FilledVerySmallSquare:"\u25aa",ForAll:"\u2200",Gamma:"\u0393",Gg:"\u22d9",GreaterEqual:"\u2265",GreaterEqualLess:"\u22db",GreaterFullEqual:"\u2267",GreaterLess:"\u2277",GreaterSlantEqual:"\u2a7e",GreaterTilde:"\u2273",Hacek:"\u02c7",Hat:"^",HumpDownHump:"\u224e",HumpEqual:"\u224f",Im:"\u2111",ImaginaryI:"\u2148",Integral:"\u222b",Intersection:"\u22c2",InvisibleComma:"\u2063",InvisibleTimes:"\u2062",Lambda:"\u039b",Larr:"\u219e",LeftAngleBracket:"\u27e8",LeftArrow:"\u2190",LeftArrowRightArrow:"\u21c6",LeftCeiling:"\u2308",LeftDownVector:"\u21c3",LeftFloor:"\u230a",LeftRightArrow:"\u2194",LeftTee:"\u22a3",LeftTriangle:"\u22b2",LeftTriangleEqual:"\u22b4",LeftUpVector:"\u21bf",LeftVector:"\u21bc",Leftarrow:"\u21d0",Leftrightarrow:"\u21d4",LessEqualGreater:"\u22da",LessFullEqual:"\u2266",LessGreater:"\u2276",LessSlantEqual:"\u2a7d",LessTilde:"\u2272",Ll:"\u22d8",Lleftarrow:"\u21da",LongLeftArrow:"\u27f5",LongLeftRightArrow:"\u27f7",LongRightArrow:"\u27f6",Longleftarrow:"\u27f8",Longleftrightarrow:"\u27fa",Longrightarrow:"\u27f9",Lsh:"\u21b0",MinusPlus:"\u2213",NestedGreaterGreater:"\u226b",NestedLessLess:"\u226a",NotDoubleVerticalBar:"\u2226",NotElement:"\u2209",NotEqual:"\u2260",NotExists:"\u2204",NotGreater:"\u226f",NotGreaterEqual:"\u2271",NotLeftTriangle:"\u22ea",NotLeftTriangleEqual:"\u22ec",NotLess:"\u226e",NotLessEqual:"\u2270",NotPrecedes:"\u2280",NotPrecedesSlantEqual:"\u22e0",NotRightTriangle:"\u22eb",NotRightTriangleEqual:"\u22ed",NotSubsetEqual:"\u2288",NotSucceeds:"\u2281",NotSucceedsSlantEqual:"\u22e1",NotSupersetEqual:"\u2289",NotTilde:"\u2241",NotVerticalBar:"\u2224",Omega:"\u03a9",OverBar:"\u203e",OverBrace:"\u23de",PartialD:"\u2202",Phi:"\u03a6",Pi:"\u03a0",PlusMinus:"\xb1",Precedes:"\u227a",PrecedesEqual:"\u2aaf",PrecedesSlantEqual:"\u227c",PrecedesTilde:"\u227e",Product:"\u220f",Proportional:"\u221d",Psi:"\u03a8",Rarr:"\u21a0",Re:"\u211c",ReverseEquilibrium:"\u21cb",RightAngleBracket:"\u27e9",RightArrow:"\u2192",RightArrowLeftArrow:"\u21c4",RightCeiling:"\u2309",RightDownVector:"\u21c2",RightFloor:"\u230b",RightTee:"\u22a2",RightTeeArrow:"\u21a6",RightTriangle:"\u22b3",RightTriangleEqual:"\u22b5",RightUpVector:"\u21be",RightVector:"\u21c0",Rightarrow:"\u21d2",Rrightarrow:"\u21db",Rsh:"\u21b1",Sigma:"\u03a3",SmallCircle:"\u2218",Sqrt:"\u221a",Square:"\u25a1",SquareIntersection:"\u2293",SquareSubset:"\u228f",SquareSubsetEqual:"\u2291",SquareSuperset:"\u2290",SquareSupersetEqual:"\u2292",SquareUnion:"\u2294",Star:"\u22c6",Subset:"\u22d0",SubsetEqual:"\u2286",Succeeds:"\u227b",SucceedsEqual:"\u2ab0",SucceedsSlantEqual:"\u227d",SucceedsTilde:"\u227f",SuchThat:"\u220b",Sum:"\u2211",Superset:"\u2283",SupersetEqual:"\u2287",Supset:"\u22d1",Therefore:"\u2234",Theta:"\u0398",Tilde:"\u223c",TildeEqual:"\u2243",TildeFullEqual:"\u2245",TildeTilde:"\u2248",UnderBar:"_",UnderBrace:"\u23df",Union:"\u22c3",UnionPlus:"\u228e",UpArrow:"\u2191",UpDownArrow:"\u2195",UpTee:"\u22a5",Uparrow:"\u21d1",Updownarrow:"\u21d5",Upsilon:"\u03a5",Vdash:"\u22a9",Vee:"\u22c1",VerticalBar:"\u2223",VerticalTilde:"\u2240",Vvdash:"\u22aa",Wedge:"\u22c0",Xi:"\u039e",amp:"&",acute:"\xb4",aleph:"\u2135",alpha:"\u03b1",amalg:"\u2a3f",and:"\u2227",ang:"\u2220",angmsd:"\u2221",angsph:"\u2222",ape:"\u224a",backprime:"\u2035",backsim:"\u223d",backsimeq:"\u22cd",beta:"\u03b2",beth:"\u2136",between:"\u226c",bigcirc:"\u25ef",bigodot:"\u2a00",bigoplus:"\u2a01",bigotimes:"\u2a02",bigsqcup:"\u2a06",bigstar:"\u2605",bigtriangledown:"\u25bd",bigtriangleup:"\u25b3",biguplus:"\u2a04",blacklozenge:"\u29eb",blacktriangle:"\u25b4",blacktriangledown:"\u25be",blacktriangleleft:"\u25c2",bowtie:"\u22c8",boxdl:"\u2510",boxdr:"\u250c",boxminus:"\u229f",boxplus:"\u229e",boxtimes:"\u22a0",boxul:"\u2518",boxur:"\u2514",bsol:"\\",bull:"\u2022",cap:"\u2229",check:"\u2713",chi:"\u03c7",circ:"\u02c6",circeq:"\u2257",circlearrowleft:"\u21ba",circlearrowright:"\u21bb",circledR:"\xae",circledS:"\u24c8",circledast:"\u229b",circledcirc:"\u229a",circleddash:"\u229d",clubs:"\u2663",colon:":",comp:"\u2201",ctdot:"\u22ef",cuepr:"\u22de",cuesc:"\u22df",cularr:"\u21b6",cup:"\u222a",curarr:"\u21b7",curlyvee:"\u22ce",curlywedge:"\u22cf",dagger:"\u2020",daleth:"\u2138",ddarr:"\u21ca",deg:"\xb0",delta:"\u03b4",digamma:"\u03dd",div:"\xf7",divideontimes:"\u22c7",dot:"\u02d9",doteqdot:"\u2251",dotplus:"\u2214",dotsquare:"\u22a1",dtdot:"\u22f1",ecir:"\u2256",efDot:"\u2252",egs:"\u2a96",ell:"\u2113",els:"\u2a95",empty:"\u2205",epsi:"\u03b5",epsiv:"\u03f5",erDot:"\u2253",eta:"\u03b7",eth:"\xf0",flat:"\u266d",fork:"\u22d4",frown:"\u2322",gEl:"\u2a8c",gamma:"\u03b3",gap:"\u2a86",gimel:"\u2137",gnE:"\u2269",gnap:"\u2a8a",gne:"\u2a88",gnsim:"\u22e7",gt:">",gtdot:"\u22d7",harrw:"\u21ad",hbar:"\u210f",hellip:"\u2026",hookleftarrow:"\u21a9",hookrightarrow:"\u21aa",imath:"\u0131",infin:"\u221e",intcal:"\u22ba",iota:"\u03b9",jmath:"\u0237",kappa:"\u03ba",kappav:"\u03f0",lEg:"\u2a8b",lambda:"\u03bb",lap:"\u2a85",larrlp:"\u21ab",larrtl:"\u21a2",lbrace:"{",lbrack:"[",le:"\u2264",leftleftarrows:"\u21c7",leftthreetimes:"\u22cb",lessdot:"\u22d6",lmoust:"\u23b0",lnE:"\u2268",lnap:"\u2a89",lne:"\u2a87",lnsim:"\u22e6",longmapsto:"\u27fc",looparrowright:"\u21ac",lowast:"\u2217",loz:"\u25ca",lt:"<",ltimes:"\u22c9",ltri:"\u25c3",macr:"\xaf",malt:"\u2720",mho:"\u2127",mu:"\u03bc",multimap:"\u22b8",nLeftarrow:"\u21cd",nLeftrightarrow:"\u21ce",nRightarrow:"\u21cf",nVDash:"\u22af",nVdash:"\u22ae",natur:"\u266e",nearr:"\u2197",nharr:"\u21ae",nlarr:"\u219a",not:"\xac",nrarr:"\u219b",nu:"\u03bd",nvDash:"\u22ad",nvdash:"\u22ac",nwarr:"\u2196",omega:"\u03c9",omicron:"\u03bf",or:"\u2228",osol:"\u2298",period:".",phi:"\u03c6",phiv:"\u03d5",pi:"\u03c0",piv:"\u03d6",prap:"\u2ab7",precnapprox:"\u2ab9",precneqq:"\u2ab5",precnsim:"\u22e8",prime:"\u2032",psi:"\u03c8",quot:'"',rarrtl:"\u21a3",rbrace:"}",rbrack:"]",rho:"\u03c1",rhov:"\u03f1",rightrightarrows:"\u21c9",rightthreetimes:"\u22cc",ring:"\u02da",rmoust:"\u23b1",rtimes:"\u22ca",rtri:"\u25b9",scap:"\u2ab8",scnE:"\u2ab6",scnap:"\u2aba",scnsim:"\u22e9",sdot:"\u22c5",searr:"\u2198",sect:"\xa7",sharp:"\u266f",sigma:"\u03c3",sigmav:"\u03c2",simne:"\u2246",smile:"\u2323",spades:"\u2660",sub:"\u2282",subE:"\u2ac5",subnE:"\u2acb",subne:"\u228a",supE:"\u2ac6",supnE:"\u2acc",supne:"\u228b",swarr:"\u2199",tau:"\u03c4",theta:"\u03b8",thetav:"\u03d1",tilde:"\u02dc",times:"\xd7",triangle:"\u25b5",triangleq:"\u225c",upsi:"\u03c5",upuparrows:"\u21c8",veebar:"\u22bb",vellip:"\u22ee",weierp:"\u2118",xi:"\u03be",yen:"\xa5",zeta:"\u03b6",zigrarr:"\u21dd",nbsp:"\xa0",rsquo:"\u2019",lsquo:"\u2018"};var i={};function s(t,r){if("#"===r.charAt(0))return a(r.slice(1));if(e.entities[r])return e.entities[r];if(e.options.loadMissingEntities){var s=r.match(/^[a-zA-Z](fr|scr|opf)$/)?RegExp.$1:r.charAt(0).toLowerCase();i[s]||(i[s]=!0,(0,n.retryAfter)((0,o.asyncLoad)("./util/entities/"+s+".js")))}return t}function a(t){var e="x"===t.charAt(0)?parseInt(t.slice(1),16):parseInt(t);return String.fromCodePoint(e)}e.add=function(t,r){Object.assign(e.entities,t),i[r]=!0},e.remove=function(t){delete e.entities[t]},e.translate=function(t){return t.replace(/&([a-z][a-z0-9]*|#(?:[0-9]+|x[0-9a-f]+));/gi,s)},e.numeric=a},7525:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.FunctionList=void 0;var l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.execute=function(){for(var t,e,r=[],n=0;n<arguments.length;n++)r[n]=arguments[n];try{for(var o=i(this),l=o.next();!l.done;l=o.next()){var c=l.value,u=c.item.apply(c,a([],s(r),!1));if(!1===u)return!1}}catch(e){t={error:e}}finally{try{l&&!l.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return!0},e.prototype.asyncExecute=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var r=-1,n=this.items;return new Promise((function(e,o){!function i(){for(var l;++r<n.length;){var c=(l=n[r]).item.apply(l,a([],s(t),!1));if(c instanceof Promise)return void c.then(i).catch((function(t){return o(t)}));if(!1===c)return void e(!1)}e(!0)}()}))},e}(r(8666).PrioritizedList);e.FunctionList=l},103:function(t,e){var r=this&&this.__generator||function(t,e){var r,n,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;s;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,n=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!(o=s.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=e.call(t,s)}catch(t){i=[6,t],n=0}finally{r=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))},i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.LinkedList=e.ListItem=e.END=void 0,e.END=Symbol();var s=function(t){void 0===t&&(t=null),this.next=null,this.prev=null,this.data=t};e.ListItem=s;var a=function(){function t(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];this.list=new s(e.END),this.list.next=this.list.prev=this.list,this.push.apply(this,o([],n(t),!1))}return t.prototype.isBefore=function(t,e){return t<e},t.prototype.push=function(){for(var t,e,r=[],n=0;n<arguments.length;n++)r[n]=arguments[n];try{for(var o=i(r),a=o.next();!a.done;a=o.next()){var l=a.value,c=new s(l);c.next=this.list,c.prev=this.list.prev,this.list.prev=c,c.prev.next=c}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return this},t.prototype.pop=function(){var t=this.list.prev;return t.data===e.END?null:(this.list.prev=t.prev,t.prev.next=this.list,t.next=t.prev=null,t.data)},t.prototype.unshift=function(){for(var t,e,r=[],n=0;n<arguments.length;n++)r[n]=arguments[n];try{for(var o=i(r.slice(0).reverse()),a=o.next();!a.done;a=o.next()){var l=a.value,c=new s(l);c.next=this.list.next,c.prev=this.list,this.list.next=c,c.next.prev=c}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return this},t.prototype.shift=function(){var t=this.list.next;return t.data===e.END?null:(this.list.next=t.next,t.next.prev=this.list,t.next=t.prev=null,t.data)},t.prototype.remove=function(){for(var t,r,n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];var s=new Map;try{for(var a=i(n),l=a.next();!l.done;l=a.next()){var c=l.value;s.set(c,!0)}}catch(e){t={error:e}}finally{try{l&&!l.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}for(var u=this.list.next;u.data!==e.END;){var p=u.next;s.has(u.data)&&(u.prev.next=u.next,u.next.prev=u.prev,u.next=u.prev=null),u=p}},t.prototype.clear=function(){return this.list.next.prev=this.list.prev.next=null,this.list.next=this.list.prev=this.list,this},t.prototype[Symbol.iterator]=function(){var t;return r(this,(function(r){switch(r.label){case 0:t=this.list.next,r.label=1;case 1:return t.data===e.END?[3,3]:[4,t.data];case 2:return r.sent(),t=t.next,[3,1];case 3:return[2]}}))},t.prototype.reversed=function(){var t;return r(this,(function(r){switch(r.label){case 0:t=this.list.prev,r.label=1;case 1:return t.data===e.END?[3,3]:[4,t.data];case 2:return r.sent(),t=t.prev,[3,1];case 3:return[2]}}))},t.prototype.insert=function(t,r){void 0===r&&(r=null),null===r&&(r=this.isBefore.bind(this));for(var n=new s(t),o=this.list.next;o.data!==e.END&&r(o.data,n.data);)o=o.next;return n.prev=o.prev,n.next=o,o.prev.next=o.prev=n,this},t.prototype.sort=function(e){var r,n;void 0===e&&(e=null),null===e&&(e=this.isBefore.bind(this));var o=[];try{for(var s=i(this),a=s.next();!a.done;a=s.next()){var l=a.value;o.push(new t(l))}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}for(this.list.next=this.list.prev=this.list;o.length>1;){var c=o.shift(),u=o.shift();c.merge(u,e),o.push(c)}return o.length&&(this.list=o[0].list),this},t.prototype.merge=function(t,r){var o,i,s,a,l;void 0===r&&(r=null),null===r&&(r=this.isBefore.bind(this));for(var c=this.list.next,u=t.list.next;c.data!==e.END&&u.data!==e.END;)r(u.data,c.data)?(o=n([c,u],2),u.prev.next=o[0],c.prev.next=o[1],i=n([c.prev,u.prev],2),u.prev=i[0],c.prev=i[1],s=n([t.list,this.list],2),this.list.prev.next=s[0],t.list.prev.next=s[1],a=n([t.list.prev,this.list.prev],2),this.list.prev=a[0],t.list.prev=a[1],c=(l=n([u.next,c],2))[0],u=l[1]):c=c.next;return u.data!==e.END&&(this.list.prev.next=t.list.next,t.list.next.prev=this.list.prev,t.list.prev.next=this.list,this.list.prev=t.list.prev,t.list.next=t.list.prev=t.list),this},t}();e.LinkedList=a},7233:function(t,e){var r=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.lookup=e.separateOptions=e.selectOptionsFromKeys=e.selectOptions=e.userOptions=e.defaultOptions=e.insert=e.copy=e.keys=e.makeArray=e.expandable=e.Expandable=e.OPTIONS=e.REMOVE=e.APPEND=e.isObject=void 0;var i={}.constructor;function s(t){return"object"==typeof t&&null!==t&&(t.constructor===i||t.constructor===a)}e.isObject=s,e.APPEND="[+]",e.REMOVE="[-]",e.OPTIONS={invalidOption:"warn",optionError:function(t,r){if("fatal"===e.OPTIONS.invalidOption)throw new Error(t);console.warn("MathJax: "+t)}};var a=function(){};function l(t){return Object.assign(Object.create(a.prototype),t)}function c(t){return t?Object.keys(t).concat(Object.getOwnPropertySymbols(t)):[]}function u(t){var e,n,o={};try{for(var i=r(c(t)),h=i.next();!h.done;h=i.next()){var f=h.value,d=Object.getOwnPropertyDescriptor(t,f),m=d.value;Array.isArray(m)?d.value=p([],m,!1):s(m)&&(d.value=u(m)),d.enumerable&&(o[f]=d)}}catch(t){e={error:t}}finally{try{h&&!h.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}return Object.defineProperties(t.constructor===a?l({}):{},o)}function p(t,i,l){var h,f;void 0===l&&(l=!0);var d=function(r){if(l&&void 0===t[r]&&t.constructor!==a)return"symbol"==typeof r&&(r=r.toString()),e.OPTIONS.optionError('Invalid option "'.concat(r,'" (no default value).'),r),"continue";var h=i[r],f=t[r];if(!s(h)||null===f||"object"!=typeof f&&"function"!=typeof f)Array.isArray(h)?(t[r]=[],p(t[r],h,!1)):s(h)?t[r]=u(h):t[r]=h;else{var d=c(h);Array.isArray(f)&&(1===d.length&&(d[0]===e.APPEND||d[0]===e.REMOVE)&&Array.isArray(h[d[0]])||2===d.length&&d.sort().join(",")===e.APPEND+","+e.REMOVE&&Array.isArray(h[e.APPEND])&&Array.isArray(h[e.REMOVE]))?(h[e.REMOVE]&&(f=t[r]=f.filter((function(t){return h[e.REMOVE].indexOf(t)<0}))),h[e.APPEND]&&(t[r]=o(o([],n(f),!1),n(h[e.APPEND]),!1))):p(f,h,l)}};try{for(var m=r(c(i)),y=m.next();!y.done;y=m.next()){d(y.value)}}catch(t){h={error:t}}finally{try{y&&!y.done&&(f=m.return)&&f.call(m)}finally{if(h)throw h.error}}return t}function h(t){for(var e,n,o=[],i=1;i<arguments.length;i++)o[i-1]=arguments[i];var s={};try{for(var a=r(o),l=a.next();!l.done;l=a.next()){var c=l.value;t.hasOwnProperty(c)&&(s[c]=t[c])}}catch(t){e={error:t}}finally{try{l&&!l.done&&(n=a.return)&&n.call(a)}finally{if(e)throw e.error}}return s}e.Expandable=a,e.expandable=l,e.makeArray=function(t){return Array.isArray(t)?t:[t]},e.keys=c,e.copy=u,e.insert=p,e.defaultOptions=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];return e.forEach((function(e){return p(t,e,!1)})),t},e.userOptions=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];return e.forEach((function(e){return p(t,e,!0)})),t},e.selectOptions=h,e.selectOptionsFromKeys=function(t,e){return h.apply(void 0,o([t],n(Object.keys(e)),!1))},e.separateOptions=function(t){for(var e,n,o,i,s=[],a=1;a<arguments.length;a++)s[a-1]=arguments[a];var l=[];try{for(var c=r(s),u=c.next();!u.done;u=c.next()){var p=u.value,h={},f={};try{for(var d=(o=void 0,r(Object.keys(t||{}))),m=d.next();!m.done;m=d.next()){var y=m.value;(void 0===p[y]?f:h)[y]=t[y]}}catch(t){o={error:t}}finally{try{m&&!m.done&&(i=d.return)&&i.call(d)}finally{if(o)throw o.error}}l.push(h),t=f}}catch(t){e={error:t}}finally{try{u&&!u.done&&(n=c.return)&&n.call(c)}finally{if(e)throw e.error}}return l.unshift(t),l},e.lookup=function(t,e,r){return void 0===r&&(r=null),e.hasOwnProperty(t)?e[t]:r}},8666:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.PrioritizedList=void 0;var r=function(){function t(){this.items=[],this.items=[]}return t.prototype[Symbol.iterator]=function(){var t=0,e=this.items;return{next:function(){return{value:e[t++],done:t>e.length}}}},t.prototype.add=function(e,r){void 0===r&&(r=t.DEFAULTPRIORITY);var n=this.items.length;do{n--}while(n>=0&&r<this.items[n].priority);return this.items.splice(n+1,0,{item:e,priority:r}),e},t.prototype.remove=function(t){var e=this.items.length;do{e--}while(e>=0&&this.items[e].item!==t);e>=0&&this.items.splice(e,1)},t.DEFAULTPRIORITY=5,t}();e.PrioritizedList=r},4542:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.retryAfter=e.handleRetriesFor=void 0,e.handleRetriesFor=function(t){return new Promise((function e(r,n){try{r(t())}catch(t){t.retry&&t.retry instanceof Promise?t.retry.then((function(){return e(r,n)})).catch((function(t){return n(t)})):t.restart&&t.restart.isCallback?MathJax.Callback.After((function(){return e(r,n)}),t.restart):n(t)}}))},e.retryAfter=function(t){var e=new Error("MathJax retry");throw e.retry=t,e}},4139:function(t,e){var r=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CssStyles=void 0;var n=function(){function t(t){void 0===t&&(t=null),this.styles={},this.addStyles(t)}return Object.defineProperty(t.prototype,"cssText",{get:function(){return this.getStyleString()},enumerable:!1,configurable:!0}),t.prototype.addStyles=function(t){var e,n;if(t)try{for(var o=r(Object.keys(t)),i=o.next();!i.done;i=o.next()){var s=i.value;this.styles[s]||(this.styles[s]={}),Object.assign(this.styles[s],t[s])}}catch(t){e={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(e)throw e.error}}},t.prototype.removeStyles=function(){for(var t,e,n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];try{for(var i=r(n),s=i.next();!s.done;s=i.next()){var a=s.value;delete this.styles[a]}}catch(e){t={error:e}}finally{try{s&&!s.done&&(e=i.return)&&e.call(i)}finally{if(t)throw t.error}}},t.prototype.clear=function(){this.styles={}},t.prototype.getStyleString=function(){return this.getStyleRules().join("\n\n")},t.prototype.getStyleRules=function(){var t,e,n=Object.keys(this.styles),o=new Array(n.length),i=0;try{for(var s=r(n),a=s.next();!a.done;a=s.next()){var l=a.value;o[i++]=l+" {\n"+this.getStyleDefString(this.styles[l])+"\n}"}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=s.return)&&e.call(s)}finally{if(t)throw t.error}}return o},t.prototype.getStyleDefString=function(t){var e,n,o=Object.keys(t),i=new Array(o.length),s=0;try{for(var a=r(o),l=a.next();!l.done;l=a.next()){var c=l.value;i[s++]=" "+c+": "+t[c]+";"}}catch(t){e={error:t}}finally{try{l&&!l.done&&(n=a.return)&&n.call(a)}finally{if(e)throw e.error}}return i.join("\n")},t}();e.CssStyles=n},8054:function(t,e){var r=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.Styles=void 0;var i=["top","right","bottom","left"],s=["width","style","color"];function a(t){for(var e=t.split(/((?:'[^']*'|"[^"]*"|,[\s\n]|[^\s\n])*)/g),r=[];e.length>1;)e.shift(),r.push(e.shift());return r}function l(t){var e,n,o=a(this.styles[t]);0===o.length&&o.push(""),1===o.length&&o.push(o[0]),2===o.length&&o.push(o[0]),3===o.length&&o.push(o[1]);try{for(var i=r(v.connect[t].children),s=i.next();!s.done;s=i.next()){var l=s.value;this.setStyle(this.childName(t,l),o.shift())}}catch(t){e={error:t}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}}function c(t){var e,n,o=v.connect[t].children,i=[];try{for(var s=r(o),a=s.next();!a.done;a=s.next()){var l=a.value,c=this.styles[t+"-"+l];if(!c)return void delete this.styles[t];i.push(c)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(e)throw e.error}}i[3]===i[1]&&(i.pop(),i[2]===i[0]&&(i.pop(),i[1]===i[0]&&i.pop())),this.styles[t]=i.join(" ")}function u(t){var e,n;try{for(var o=r(v.connect[t].children),i=o.next();!i.done;i=o.next()){var s=i.value;this.setStyle(this.childName(t,s),this.styles[t])}}catch(t){e={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(e)throw e.error}}}function p(t){var e,i,s=o([],n(v.connect[t].children),!1),a=this.styles[this.childName(t,s.shift())];try{for(var l=r(s),c=l.next();!c.done;c=l.next()){var u=c.value;if(this.styles[this.childName(t,u)]!==a)return void delete this.styles[t]}}catch(t){e={error:t}}finally{try{c&&!c.done&&(i=l.return)&&i.call(l)}finally{if(e)throw e.error}}this.styles[t]=a}var h=/^(?:[\d.]+(?:[a-z]+)|thin|medium|thick|inherit|initial|unset)$/,f=/^(?:none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset|inherit|initial|unset)$/;function d(t){var e,n,o,i,s={width:"",style:"",color:""};try{for(var l=r(a(this.styles[t])),c=l.next();!c.done;c=l.next()){var u=c.value;u.match(h)&&""===s.width?s.width=u:u.match(f)&&""===s.style?s.style=u:s.color=u}}catch(t){e={error:t}}finally{try{c&&!c.done&&(n=l.return)&&n.call(l)}finally{if(e)throw e.error}}try{for(var p=r(v.connect[t].children),d=p.next();!d.done;d=p.next()){var m=d.value;this.setStyle(this.childName(t,m),s[m])}}catch(t){o={error:t}}finally{try{d&&!d.done&&(i=p.return)&&i.call(p)}finally{if(o)throw o.error}}}function m(t){var e,n,o=[];try{for(var i=r(v.connect[t].children),s=i.next();!s.done;s=i.next()){var a=s.value,l=this.styles[this.childName(t,a)];l&&o.push(l)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}o.length?this.styles[t]=o.join(" "):delete this.styles[t]}var y={style:/^(?:normal|italic|oblique|inherit|initial|unset)$/,variant:new RegExp("^(?:"+["normal|none","inherit|initial|unset","common-ligatures|no-common-ligatures","discretionary-ligatures|no-discretionary-ligatures","historical-ligatures|no-historical-ligatures","contextual|no-contextual","(?:stylistic|character-variant|swash|ornaments|annotation)\\([^)]*\\)","small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","lining-nums|oldstyle-nums|proportional-nums|tabular-nums","diagonal-fractions|stacked-fractions","ordinal|slashed-zero","jis78|jis83|jis90|jis04|simplified|traditional","full-width|proportional-width","ruby"].join("|")+")$"),weight:/^(?:normal|bold|bolder|lighter|[1-9]00|inherit|initial|unset)$/,stretch:new RegExp("^(?:"+["normal","(?:(?:ultra|extra|semi)-)?condensed","(?:(?:semi|extra|ulta)-)?expanded","inherit|initial|unset"].join("|")+")$"),size:new RegExp("^(?:"+["xx-small|x-small|small|medium|large|x-large|xx-large|larger|smaller","[d.]+%|[d.]+[a-z]+","inherit|initial|unset"].join("|")+")(?:/(?:normal|[d.+](?:%|[a-z]+)?))?$")};function g(t){var e,o,i,s,l=a(this.styles[t]),c={style:"",variant:[],weight:"",stretch:"",size:"",family:"","line-height":""};try{for(var u=r(l),p=u.next();!p.done;p=u.next()){var h=p.value;c.family=h;try{for(var f=(i=void 0,r(Object.keys(y))),d=f.next();!d.done;d=f.next()){var m=d.value;if((Array.isArray(c[m])||""===c[m])&&h.match(y[m]))if("size"===m){var g=n(h.split(/\//),2),b=g[0],_=g[1];c[m]=b,_&&(c["line-height"]=_)}else""===c.size&&(Array.isArray(c[m])?c[m].push(h):c[m]=h)}}catch(t){i={error:t}}finally{try{d&&!d.done&&(s=f.return)&&s.call(f)}finally{if(i)throw i.error}}}}catch(t){e={error:t}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(e)throw e.error}}!function(t,e){var n,o;try{for(var i=r(v.connect[t].children),s=i.next();!s.done;s=i.next()){var a=s.value,l=this.childName(t,a);if(Array.isArray(e[a])){var c=e[a];c.length&&(this.styles[l]=c.join(" "))}else""!==e[a]&&(this.styles[l]=e[a])}}catch(t){n={error:t}}finally{try{s&&!s.done&&(o=i.return)&&o.call(i)}finally{if(n)throw n.error}}}(t,c),delete this.styles[t]}function b(t){}var v=function(){function t(t){void 0===t&&(t=""),this.parse(t)}return Object.defineProperty(t.prototype,"cssText",{get:function(){var t,e,n=[];try{for(var o=r(Object.keys(this.styles)),i=o.next();!i.done;i=o.next()){var s=i.value,a=this.parentName(s);this.styles[a]||n.push(s+": "+this.styles[s]+";")}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return n.join(" ")},enumerable:!1,configurable:!0}),t.prototype.set=function(e,r){for(e=this.normalizeName(e),this.setStyle(e,r),t.connect[e]&&!t.connect[e].combine&&(this.combineChildren(e),delete this.styles[e]);e.match(/-/)&&(e=this.parentName(e),t.connect[e]);)t.connect[e].combine.call(this,e)},t.prototype.get=function(t){return t=this.normalizeName(t),this.styles.hasOwnProperty(t)?this.styles[t]:""},t.prototype.setStyle=function(e,r){this.styles[e]=r,t.connect[e]&&t.connect[e].children&&t.connect[e].split.call(this,e),""===r&&delete this.styles[e]},t.prototype.combineChildren=function(e){var n,o,i=this.parentName(e);try{for(var s=r(t.connect[e].children),a=s.next();!a.done;a=s.next()){var l=a.value,c=this.childName(i,l);t.connect[c].combine.call(this,c)}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}},t.prototype.parentName=function(t){var e=t.replace(/-[^-]*$/,"");return t===e?"":e},t.prototype.childName=function(e,r){return r.match(/-/)?r:(t.connect[e]&&!t.connect[e].combine&&(r+=e.replace(/.*-/,"-"),e=this.parentName(e)),e+"-"+r)},t.prototype.normalizeName=function(t){return t.replace(/[A-Z]/g,(function(t){return"-"+t.toLowerCase()}))},t.prototype.parse=function(t){void 0===t&&(t="");var e=this.constructor.pattern;this.styles={};for(var r=t.replace(e.comment,"").split(e.style);r.length>1;){var o=n(r.splice(0,3),3),i=o[0],s=o[1],a=o[2];if(i.match(/[^\s\n]/))return;this.set(s,a)}},t.pattern={style:/([-a-z]+)[\s\n]*:[\s\n]*((?:'[^']*'|"[^"]*"|\n|.)*?)[\s\n]*(?:;|$)/g,comment:/\/\*[^]*?\*\//g},t.connect={padding:{children:i,split:l,combine:c},border:{children:i,split:u,combine:p},"border-top":{children:s,split:d,combine:m},"border-right":{children:s,split:d,combine:m},"border-bottom":{children:s,split:d,combine:m},"border-left":{children:s,split:d,combine:m},"border-width":{children:i,split:l,combine:null},"border-style":{children:i,split:l,combine:null},"border-color":{children:i,split:l,combine:null},font:{children:["style","variant","weight","stretch","line-height","size","family"],split:g,combine:b}},t}();e.Styles=v},6010:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.px=e.emRounded=e.em=e.percent=e.length2em=e.MATHSPACE=e.RELUNITS=e.UNITS=e.BIGDIMEN=void 0,e.BIGDIMEN=1e6,e.UNITS={px:1,in:96,cm:96/2.54,mm:96/25.4},e.RELUNITS={em:1,ex:.431,pt:.1,pc:1.2,mu:1/18},e.MATHSPACE={veryverythinmathspace:1/18,verythinmathspace:2/18,thinmathspace:3/18,mediummathspace:4/18,thickmathspace:5/18,verythickmathspace:6/18,veryverythickmathspace:7/18,negativeveryverythinmathspace:-1/18,negativeverythinmathspace:-2/18,negativethinmathspace:-3/18,negativemediummathspace:-4/18,negativethickmathspace:-5/18,negativeverythickmathspace:-6/18,negativeveryverythickmathspace:-7/18,thin:.04,medium:.06,thick:.1,normal:1,big:2,small:1/Math.sqrt(2),infinity:e.BIGDIMEN},e.length2em=function(t,r,n,o){if(void 0===r&&(r=0),void 0===n&&(n=1),void 0===o&&(o=16),"string"!=typeof t&&(t=String(t)),""===t||null==t)return r;if(e.MATHSPACE[t])return e.MATHSPACE[t];var i=t.match(/^\s*([-+]?(?:\.\d+|\d+(?:\.\d*)?))?(pt|em|ex|mu|px|pc|in|mm|cm|%)?/);if(!i)return r;var s=parseFloat(i[1]||"1"),a=i[2];return e.UNITS.hasOwnProperty(a)?s*e.UNITS[a]/o/n:e.RELUNITS.hasOwnProperty(a)?s*e.RELUNITS[a]:"%"===a?s/100*r:s*r},e.percent=function(t){return(100*t).toFixed(1).replace(/\.?0+$/,"")+"%"},e.em=function(t){return Math.abs(t)<.001?"0":t.toFixed(3).replace(/\.?0+$/,"")+"em"},e.emRounded=function(t,e){return void 0===e&&(e=16),t=(Math.round(t*e)+.05)/e,Math.abs(t)<.001?"0em":t.toFixed(3).replace(/\.?0+$/,"")+"em"},e.px=function(t,r,n){return void 0===r&&(r=-e.BIGDIMEN),void 0===n&&(n=16),t*=n,r&&t<r&&(t=r),Math.abs(t)<.1?"0":t.toFixed(1).replace(/\.0$/,"")+"px"}},7875:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.max=e.sum=void 0,e.sum=function(t){return t.reduce((function(t,e){return t+e}),0)},e.max=function(t){return t.reduce((function(t,e){return Math.max(t,e)}),0)}},505:function(t,e){var r=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},n=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return t.concat(n||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.split=e.isPercent=e.unicodeString=e.unicodeChars=e.quotePattern=e.sortLength=void 0,e.sortLength=function(t,e){return t.length!==e.length?e.length-t.length:t===e?0:t<e?-1:1},e.quotePattern=function(t){return t.replace(/([\^$(){}+*?\-|\[\]\:\\])/g,"\\$1")},e.unicodeChars=function(t){return Array.from(t).map((function(t){return t.codePointAt(0)}))},e.unicodeString=function(t){return String.fromCodePoint.apply(String,n([],r(t),!1))},e.isPercent=function(t){return!!t.match(/%\s*$/)},e.split=function(t){return t.trim().split(/\s+/)}},9329:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEntry=void 0;var i=r(9328),s=r(2165),a=function(t){function e(e,r){var n=t.call(this)||this;return n._menu=e,n._type=r,n.className=s.HtmlClasses.MENUITEM,n.role="menuitem",n.hidden=!1,n}return o(e,t),Object.defineProperty(e.prototype,"menu",{get:function(){return this._menu},set:function(t){this._menu=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),e.prototype.hide=function(){this.hidden=!0,this.menu.generateMenu()},e.prototype.show=function(){this.hidden=!1,this.menu.generateMenu()},e.prototype.isHidden=function(){return this.hidden},e}(i.MenuElement);e.AbstractEntry=a},1340:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractItem=void 0;var s=r(9329),a=r(2556),l=r(2165),c=function(t){function e(e,r,n,o){var i=t.call(this,e,r)||this;return i._content=n,i.disabled=!1,i.callbacks=[],i._id=o||n,i}return o(e,t),Object.defineProperty(e.prototype,"content",{get:function(){return this._content},set:function(t){this._content=t,this.generateHtml(),this.menu&&this.menu.generateHtml()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!1,configurable:!0}),e.prototype.press=function(){this.disabled||(this.executeAction(),this.executeCallbacks_())},e.prototype.executeAction=function(){},e.prototype.registerCallback=function(t){-1===this.callbacks.indexOf(t)&&this.callbacks.push(t)},e.prototype.unregisterCallback=function(t){var e=this.callbacks.indexOf(t);-1!==e&&this.callbacks.splice(e,1)},e.prototype.mousedown=function(t){this.press(),this.stop(t)},e.prototype.mouseover=function(t){this.focus(),this.stop(t)},e.prototype.mouseout=function(t){this.deactivate(),this.stop(t)},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;e.setAttribute("aria-disabled","false"),e.textContent=this.content},e.prototype.activate=function(){this.disabled||this.html.classList.add(l.HtmlClasses.MENUACTIVE)},e.prototype.deactivate=function(){this.html.classList.remove(l.HtmlClasses.MENUACTIVE)},e.prototype.focus=function(){this.menu.focused=this,t.prototype.focus.call(this),this.activate()},e.prototype.unfocus=function(){this.deactivate(),t.prototype.unfocus.call(this)},e.prototype.escape=function(t){a.MenuUtil.close(this)},e.prototype.up=function(t){this.menu.up(t)},e.prototype.down=function(t){this.menu.down(t)},e.prototype.left=function(t){this.menu.left(t)},e.prototype.right=function(t){this.menu.right(t)},e.prototype.space=function(t){this.press()},e.prototype.disable=function(){this.disabled=!0;var t=this.html;t.classList.add(l.HtmlClasses.MENUDISABLED),t.setAttribute("aria-disabled","true")},e.prototype.enable=function(){this.disabled=!1;var t=this.html;t.classList.remove(l.HtmlClasses.MENUDISABLED),t.removeAttribute("aria-disabled")},e.prototype.executeCallbacks_=function(){var t,e;try{for(var r=i(this.callbacks),n=r.next();!n.done;n=r.next()){var o=n.value;try{o(this)}catch(t){a.MenuUtil.error(t,"Callback for menu entry "+this.id+" failed.")}}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},e}(s.AbstractEntry);e.AbstractItem=c},1484:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractMenu=void 0;var s=r(8372),a=r(1340),l=r(2165),c=r(6186),u=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.className=l.HtmlClasses.CONTEXTMENU,e.role="menu",e._items=[],e._baseMenu=null,e}return o(e,t),Object.defineProperty(e.prototype,"baseMenu",{get:function(){return this._baseMenu},set:function(t){this._baseMenu=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"items",{get:function(){return this._items},set:function(t){this._items=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"pool",{get:function(){return this.variablePool},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"focused",{get:function(){return this._focused},set:function(t){if(this._focused!==t){this._focused||this.unfocus();var e=this._focused;this._focused=t,e&&e.unfocus()}},enumerable:!1,configurable:!0}),e.prototype.up=function(t){var e=this.items.filter((function(t){return t instanceof a.AbstractItem&&!t.isHidden()}));if(0!==e.length)if(this.focused){var r=e.indexOf(this.focused);-1!==r&&e[r=r?--r:e.length-1].focus()}else e[e.length-1].focus()},e.prototype.down=function(t){var e=this.items.filter((function(t){return t instanceof a.AbstractItem&&!t.isHidden()}));if(0!==e.length)if(this.focused){var r=e.indexOf(this.focused);-1!==r&&e[r=++r===e.length?0:r].focus()}else e[0].focus()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.generateMenu()},e.prototype.generateMenu=function(){var t,e,r=this.html;r.classList.add(l.HtmlClasses.MENU);try{for(var n=i(this.items),o=n.next();!o.done;o=n.next()){var s=o.value;if(s.isHidden()){var a=s.html;a.parentNode&&a.parentNode.removeChild(a)}else r.appendChild(s.html)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.post=function(e,r){this.variablePool.update(),t.prototype.post.call(this,e,r)},e.prototype.unpostSubmenus=function(){var t,e,r=this.items.filter((function(t){return t instanceof c.Submenu}));try{for(var n=i(r),o=n.next();!o.done;o=n.next()){var s=o.value;s.submenu.unpost(),s!==this.focused&&s.unfocus()}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.unpostSubmenus(),this.focused=null},e.prototype.find=function(t){var e,r;try{for(var n=i(this.items),o=n.next();!o.done;o=n.next()){var s=o.value;if("rule"!==s.type){if(s.id===t)return s;if("submenu"===s.type){var a=s.submenu.find(t);if(a)return a}}}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return null},e}(s.AbstractPostable);e.AbstractMenu=u},2868:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractNavigatable=void 0;var n=r(3205),o=r(8853),i=function(){function t(){this.bubble=!1}return t.prototype.bubbleKey=function(){this.bubble=!0},t.prototype.keydown=function(t){switch(t.keyCode){case n.KEY.ESCAPE:this.escape(t);break;case n.KEY.RIGHT:this.right(t);break;case n.KEY.LEFT:this.left(t);break;case n.KEY.UP:this.up(t);break;case n.KEY.DOWN:this.down(t);break;case n.KEY.RETURN:case n.KEY.SPACE:this.space(t);break;default:return}this.bubble?this.bubble=!1:this.stop(t)},t.prototype.escape=function(t){},t.prototype.space=function(t){},t.prototype.left=function(t){},t.prototype.right=function(t){},t.prototype.up=function(t){},t.prototype.down=function(t){},t.prototype.stop=function(t){t&&(t.stopPropagation(),t.preventDefault(),t.cancelBubble=!0)},t.prototype.mousedown=function(t){return this.stop(t)},t.prototype.mouseup=function(t){return this.stop(t)},t.prototype.mouseover=function(t){return this.stop(t)},t.prototype.mouseout=function(t){return this.stop(t)},t.prototype.click=function(t){return this.stop(t)},t.prototype.addEvents=function(t){t.addEventListener(o.MOUSE.DOWN,this.mousedown.bind(this)),t.addEventListener(o.MOUSE.UP,this.mouseup.bind(this)),t.addEventListener(o.MOUSE.OVER,this.mouseover.bind(this)),t.addEventListener(o.MOUSE.OUT,this.mouseout.bind(this)),t.addEventListener(o.MOUSE.CLICK,this.click.bind(this)),t.addEventListener("keydown",this.keydown.bind(this)),t.addEventListener("dragstart",this.stop.bind(this)),t.addEventListener(o.MOUSE.SELECTSTART,this.stop.bind(this)),t.addEventListener("contextmenu",this.stop.bind(this)),t.addEventListener(o.MOUSE.DBLCLICK,this.stop.bind(this))},t}();e.AbstractNavigatable=i},8372:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractPostable=void 0;var i=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.posted=!1,e}return o(e,t),e.prototype.isPosted=function(){return this.posted},e.prototype.post=function(t,e){this.posted||(void 0!==t&&void 0!==e&&this.html.setAttribute("style","left: "+t+"px; top: "+e+"px;"),this.display(),this.posted=!0)},e.prototype.unpost=function(){if(this.posted){var t=this.html;t.parentNode&&t.parentNode.removeChild(t),this.posted=!1}},e}(r(9328).MenuElement);e.AbstractPostable=i},6765:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractVariableItem=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;this.span||this.generateSpan(),e.appendChild(this.span),this.update()},e.prototype.register=function(){this.variable.register(this)},e.prototype.unregister=function(){this.variable.unregister(this)},e.prototype.update=function(){this.updateAria(),this.span&&this.updateSpan()},e}(r(1340).AbstractItem);e.AbstractVariableItem=i},5179:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CloseButton=void 0;var i=r(8372),s=r(2165),a=function(t){function e(e){var r=t.call(this)||this;return r.element=e,r.className=s.HtmlClasses.MENUCLOSE,r.role="button",r}return o(e,t),e.prototype.generateHtml=function(){var t=document.createElement("span");t.classList.add(this.className),t.setAttribute("role",this.role),t.setAttribute("tabindex","0");var e=document.createElement("span");e.textContent="\xd7",t.appendChild(e),this.html=t},e.prototype.display=function(){},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.element.unpost()},e.prototype.keydown=function(e){this.bubbleKey(),t.prototype.keydown.call(this,e)},e.prototype.space=function(t){this.unpost(),this.stop(t)},e.prototype.mousedown=function(t){this.unpost(),this.stop(t)},e}(i.AbstractPostable);e.CloseButton=a},5073:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenu=void 0;var i=r(1484),s=r(2165),a=r(1932),l=r(2358),c=function(t){function e(e){var r=t.call(this)||this;return r.factory=e,r.id="",r.moving=!1,r._store=new a.MenuStore(r),r.widgets=[],r.variablePool=new l.VariablePool,r}return o(e,t),e.fromJson=function(t,e){var r=e.pool,n=e.items,o=e.id,i=void 0===o?"":o,s=new this(t);s.id=i;var a=t.get("variable");r.forEach((function(e){return a(t,e,s.pool)}));var l=t.get("items")(t,n,s);return s.items=l,s},e.prototype.generateHtml=function(){this.isPosted()&&this.unpost(),t.prototype.generateHtml.call(this),this._frame=document.createElement("div"),this._frame.classList.add(s.HtmlClasses.MENUFRAME);var e="left: 0px; top: 0px; z-index: 200; width: 100%; height: 100%; border: 0px; padding: 0px; margin: 0px;";this._frame.setAttribute("style","position: absolute; "+e);var r=document.createElement("div");r.setAttribute("style","position: fixed; "+e),this._frame.appendChild(r),r.addEventListener("mousedown",function(t){this.unpost(),this.unpostWidgets(),this.stop(t)}.bind(this))},e.prototype.display=function(){document.body.appendChild(this.frame),this.frame.appendChild(this.html),this.focus()},e.prototype.escape=function(t){this.unpost(),this.unpostWidgets()},e.prototype.unpost=function(){if(t.prototype.unpost.call(this),!(this.widgets.length>0)){this.frame.parentNode.removeChild(this.frame);var e=this.store;this.moving||e.insertTaborder(),e.active.focus()}},e.prototype.left=function(t){this.move_(this.store.previous())},e.prototype.right=function(t){this.move_(this.store.next())},Object.defineProperty(e.prototype,"frame",{get:function(){return this._frame},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"store",{get:function(){return this._store},enumerable:!1,configurable:!0}),e.prototype.post=function(e,r){if(void 0!==r)return this.moving||this.store.removeTaborder(),void t.prototype.post.call(this,e,r);var n,o,i,s=e;if(s instanceof Event?(n=s.target,this.stop(s)):n=s,s instanceof MouseEvent&&(o=s.pageX,i=s.pageY,o||i||!s.clientX||(o=s.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,i=s.clientY+document.body.scrollTop+document.documentElement.scrollTop)),!o&&!i&&n){var a=window.pageXOffset||document.documentElement.scrollLeft,l=window.pageYOffset||document.documentElement.scrollTop,c=n.getBoundingClientRect();o=(c.right+c.left)/2+a,i=(c.bottom+c.top)/2+l}this.store.active=n,this.anchor=this.store.active;var u=this.html;o+u.offsetWidth>document.body.offsetWidth-5&&(o=document.body.offsetWidth-u.offsetWidth-5),this.post(o,i)},e.prototype.registerWidget=function(t){this.widgets.push(t)},e.prototype.unregisterWidget=function(t){var e=this.widgets.indexOf(t);e>-1&&this.widgets.splice(e,1),0===this.widgets.length&&this.unpost()},e.prototype.unpostWidgets=function(){this.widgets.forEach((function(t){return t.unpost()}))},e.prototype.toJson=function(){return{type:""}},e.prototype.move_=function(t){this.anchor&&t!==this.anchor&&(this.moving=!0,this.unpost(),this.post(t),this.moving=!1)},e}(i.AbstractMenu);e.ContextMenu=c},7309:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CssStyles=void 0;var n=r(2165);!function(t){function e(t){return"."+(n.HtmlClasses[t]||t)}var r={};r[e("INFOCLOSE")]="{ top:.2em; right:.2em;}",r[e("INFOCONTENT")]="{ overflow:auto; text-align:left; font-size:80%; padding:.4em .6em; border:1px inset; margin:1em 0px; max-height:20em; max-width:30em; background-color:#EEEEEE; white-space:normal;}",r[e("INFO")+e("MOUSEPOST")]="{outline:none;}",r[e("INFO")]='{ position:fixed; left:50%; width:auto; text-align:center; border:3px outset; padding:1em 2em; background-color:#DDDDDD; color:black; cursor:default; font-family:message-box; font-size:120%; font-style:normal; text-indent:0; text-transform:none; line-height:normal; letter-spacing:normal; word-spacing:normal; word-wrap:normal; white-space:nowrap; float:none; z-index:201; border-radius: 15px; /* Opera 10.5 and IE9 */ -webkit-border-radius:15px; /* Safari and Chrome */ -moz-border-radius:15px; /* Firefox */ -khtml-border-radius:15px; /* Konqueror */ box-shadow:0px 10px 20px #808080; /* Opera 10.5 and IE9 */ -webkit-box-shadow:0px 10px 20px #808080; /* Safari 3 & Chrome */ -moz-box-shadow:0px 10px 20px #808080; /* Forefox 3.5 */ -khtml-box-shadow:0px 10px 20px #808080; /* Konqueror */ filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color="gray", Positive="true"); /* IE */}';var o={};o[e("MENU")]="{ position:absolute; background-color:white; color:black; width:auto; padding:5px 0px; border:1px solid #CCCCCC; margin:0; cursor:default; font: menu; text-align:left; text-indent:0; text-transform:none; line-height:normal; letter-spacing:normal; word-spacing:normal; word-wrap:normal; white-space:nowrap; float:none; z-index:201; border-radius: 5px; /* Opera 10.5 and IE9 */ -webkit-border-radius: 5px; /* Safari and Chrome */ -moz-border-radius: 5px; /* Firefox */ -khtml-border-radius: 5px; /* Konqueror */ box-shadow:0px 10px 20px #808080; /* Opera 10.5 and IE9 */ -webkit-box-shadow:0px 10px 20px #808080; /* Safari 3 & Chrome */ -moz-box-shadow:0px 10px 20px #808080; /* Forefox 3.5 */ -khtml-box-shadow:0px 10px 20px #808080; /* Konqueror */}",o[e("MENUITEM")]="{ padding: 1px 2em; background:transparent;}",o[e("MENUARROW")]="{ position:absolute; right:.5em; padding-top:.25em; color:#666666; font-family: null; font-size: .75em}",o[e("MENUACTIVE")+" "+e("MENUARROW")]="{color:white}",o[e("MENUARROW")+e("RTL")]="{left:.5em; right:auto}",o[e("MENUCHECK")]="{ position:absolute; left:.7em; font-family: null}",o[e("MENUCHECK")+e("RTL")]="{ right:.7em; left:auto }",o[e("MENURADIOCHECK")]="{ position:absolute; left: .7em;}",o[e("MENURADIOCHECK")+e("RTL")]="{ right: .7em; left:auto}",o[e("MENUINPUTBOX")]="{ padding-left: 1em; right:.5em; color:#666666; font-family: null;}",o[e("MENUINPUTBOX")+e("RTL")]="{ left: .1em;}",o[e("MENUCOMBOBOX")]="{ left:.1em; padding-bottom:.5em;}",o[e("MENUSLIDER")]="{ left: .1em;}",o[e("SLIDERVALUE")]="{ position:absolute; right:.1em; padding-top:.25em; color:#333333; font-size: .75em}",o[e("SLIDERBAR")]="{ outline: none; background: #d3d3d3}",o[e("MENULABEL")]="{ padding: 1px 2em 3px 1.33em; font-style:italic}",o[e("MENURULE")]="{ border-top: 1px solid #DDDDDD; margin: 4px 3px;}",o[e("MENUDISABLED")]="{ color:GrayText}",o[e("MENUACTIVE")]="{ background-color: #606872; color: white;}",o[e("MENUDISABLED")+":focus"]="{ background-color: #E8E8E8}",o[e("MENULABEL")+":focus"]="{ background-color: #E8E8E8}",o[e("CONTEXTMENU")+":focus"]="{ outline:none}",o[e("CONTEXTMENU")+" "+e("MENUITEM")+":focus"]="{ outline:none}",o[e("SELECTIONMENU")]="{ position:relative; float:left; border-bottom: none; -webkit-box-shadow:none; -webkit-border-radius:0px; }",o[e("SELECTIONITEM")]="{ padding-right: 1em;}",o[e("SELECTION")]="{ right: 40%; width:50%; }",o[e("SELECTIONBOX")]="{ padding: 0em; max-height:20em; max-width: none; background-color:#FFFFFF;}",o[e("SELECTIONDIVIDER")]="{ clear: both; border-top: 2px solid #000000;}",o[e("MENU")+" "+e("MENUCLOSE")]="{ top:-10px; left:-10px}";var i={};i[e("MENUCLOSE")]='{ position:absolute; cursor:pointer; display:inline-block; border:2px solid #AAA; border-radius:18px; -webkit-border-radius: 18px; /* Safari and Chrome */ -moz-border-radius: 18px; /* Firefox */ -khtml-border-radius: 18px; /* Konqueror */ font-family: "Courier New", Courier; font-size:24px; color:#F0F0F0}',i[e("MENUCLOSE")+" span"]="{ display:block; background-color:#AAA; border:1.5px solid; border-radius:18px; -webkit-border-radius: 18px; /* Safari and Chrome */ -moz-border-radius: 18px; /* Firefox */ -khtml-border-radius: 18px; /* Konqueror */ line-height:0; padding:8px 0 6px /* may need to be browser-specific */}",i[e("MENUCLOSE")+":hover"]="{ color:white!important; border:2px solid #CCC!important}",i[e("MENUCLOSE")+":hover span"]="{ background-color:#CCC!important}",i[e("MENUCLOSE")+":hover:focus"]="{ outline:none}";var s=!1,a=!1,l=!1;function c(t){l||(u(i,t),l=!0)}function u(t,e){var r=e||document,n=r.createElement("style");n.type="text/css";var o="";for(var i in t)o+=i,o+=" ",o+=t[i],o+="\n";n.innerHTML=o,r.head.appendChild(n)}t.addMenuStyles=function(t){a||(u(o,t),a=!0,c(t))},t.addInfoStyles=function(t){s||(u(r,t),s=!0,c(t))}}(e.CssStyles||(e.CssStyles={}))},2165:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.HtmlAttrs=e.HtmlClasses=void 0;function r(t){return"CtxtMenu_"+t}function n(t){return r(t)}function o(t){return r(t)}e.HtmlClasses={ATTACHED:n("Attached"),CONTEXTMENU:n("ContextMenu"),MENU:n("Menu"),MENUARROW:n("MenuArrow"),MENUACTIVE:n("MenuActive"),MENUCHECK:n("MenuCheck"),MENUCLOSE:n("MenuClose"),MENUCOMBOBOX:n("MenuComboBox"),MENUDISABLED:n("MenuDisabled"),MENUFRAME:n("MenuFrame"),MENUITEM:n("MenuItem"),MENULABEL:n("MenuLabel"),MENURADIOCHECK:n("MenuRadioCheck"),MENUINPUTBOX:n("MenuInputBox"),MENURULE:n("MenuRule"),MENUSLIDER:n("MenuSlider"),MOUSEPOST:n("MousePost"),RTL:n("RTL"),INFO:n("Info"),INFOCLOSE:n("InfoClose"),INFOCONTENT:n("InfoContent"),INFOSIGNATURE:n("InfoSignature"),INFOTITLE:n("InfoTitle"),SLIDERVALUE:n("SliderValue"),SLIDERBAR:n("SliderBar"),SELECTION:n("Selection"),SELECTIONBOX:n("SelectionBox"),SELECTIONMENU:n("SelectionMenu"),SELECTIONDIVIDER:n("SelectionDivider"),SELECTIONITEM:n("SelectionItem")},e.HtmlAttrs={COUNTER:o("Counter"),KEYDOWNFUNC:o("keydownFunc"),CONTEXTMENUFUNC:o("contextmenuFunc"),OLDTAB:o("Oldtabindex"),TOUCHFUNC:o("TouchFunc")}},4922:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Info=void 0;var i=r(5179),s=r(2165),a=function(t){function e(e,r,n){var o=t.call(this)||this;return o.title=e,o.signature=n,o.className=s.HtmlClasses.INFO,o.role="dialog",o.contentDiv=o.generateContent(),o.close=o.generateClose(),o.content=r||function(){return""},o}return o(e,t),e.prototype.attachMenu=function(t){this.menu=t},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;e.appendChild(this.generateTitle()),e.appendChild(this.contentDiv),e.appendChild(this.generateSignature()),e.appendChild(this.close.html),e.setAttribute("tabindex","0")},e.prototype.post=function(){t.prototype.post.call(this);var e=document.documentElement,r=this.html,n=window.innerHeight||e.clientHeight||e.scrollHeight||0,o=Math.floor(-r.offsetWidth/2),i=Math.floor((n-r.offsetHeight)/3);r.setAttribute("style","margin-left: "+o+"px; top: "+i+"px;"),window.event instanceof MouseEvent&&r.classList.add(s.HtmlClasses.MOUSEPOST),r.focus()},e.prototype.display=function(){this.menu.registerWidget(this),this.contentDiv.innerHTML=this.content();var t=this.menu.html;t.parentNode&&t.parentNode.removeChild(t),this.menu.frame.appendChild(this.html)},e.prototype.click=function(t){},e.prototype.keydown=function(e){this.bubbleKey(),t.prototype.keydown.call(this,e)},e.prototype.escape=function(t){this.unpost()},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.html.classList.remove(s.HtmlClasses.MOUSEPOST),this.menu.unregisterWidget(this)},e.prototype.generateClose=function(){var t=new i.CloseButton(this),e=t.html;return e.classList.add(s.HtmlClasses.INFOCLOSE),e.setAttribute("aria-label","Close Dialog Box"),t},e.prototype.generateTitle=function(){var t=document.createElement("span");return t.innerHTML=this.title,t.classList.add(s.HtmlClasses.INFOTITLE),t},e.prototype.generateContent=function(){var t=document.createElement("div");return t.classList.add(s.HtmlClasses.INFOCONTENT),t.setAttribute("tabindex","0"),t},e.prototype.generateSignature=function(){var t=document.createElement("span");return t.innerHTML=this.signature,t.classList.add(s.HtmlClasses.INFOSIGNATURE),t},e.prototype.toJson=function(){return{type:""}},e}(r(8372).AbstractPostable);e.Info=a},1409:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Checkbox=void 0;var i=r(6765),s=r(2556),a=r(2165),l=function(t){function e(e,r,n,o){var i=t.call(this,e,"checkbox",r,o)||this;return i.role="menuitemcheckbox",i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(!this.variable.getValue()),s.MenuUtil.close(this)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.span.textContent="\u2713",this.span.classList.add(a.HtmlClasses.MENUCHECK)},e.prototype.updateAria=function(){this.html.setAttribute("aria-checked",this.variable.getValue()?"true":"false")},e.prototype.updateSpan=function(){this.span.style.display=this.variable.getValue()?"":"none"},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Checkbox=l},9886:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Combo=void 0;var i=r(6765),s=r(2556),a=r(2165),l=r(3205),c=function(t){function e(e,r,n,o){var i=t.call(this,e,"combobox",r,o)||this;return i.role="combobox",i.inputEvent=!1,i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(this.input.value,s.MenuUtil.getActiveElement(this))},e.prototype.space=function(e){t.prototype.space.call(this,e),s.MenuUtil.close(this)},e.prototype.focus=function(){t.prototype.focus.call(this),this.input.focus()},e.prototype.unfocus=function(){t.prototype.unfocus.call(this),this.updateSpan()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.html.classList.add(a.HtmlClasses.MENUCOMBOBOX)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.span.classList.add(a.HtmlClasses.MENUINPUTBOX),this.input=document.createElement("input"),this.input.addEventListener("keydown",this.inputKey.bind(this)),this.input.setAttribute("size","10em"),this.input.setAttribute("type","text"),this.input.setAttribute("tabindex","-1"),this.span.appendChild(this.input)},e.prototype.inputKey=function(t){this.bubbleKey(),this.inputEvent=!0},e.prototype.keydown=function(e){if(this.inputEvent&&e.keyCode!==l.KEY.ESCAPE&&e.keyCode!==l.KEY.RETURN)return this.inputEvent=!1,void e.stopPropagation();t.prototype.keydown.call(this,e),e.stopPropagation()},e.prototype.updateAria=function(){},e.prototype.updateSpan=function(){var t;try{t=this.variable.getValue(s.MenuUtil.getActiveElement(this))}catch(e){t=""}this.input.value=t},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Combo=c},3467:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Command=void 0;var i=r(1340),s=r(2556),a=function(t){function e(e,r,n,o){var i=t.call(this,e,"command",r,o)||this;return i.command=n,i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.action,e.id)},e.prototype.executeAction=function(){try{this.command(s.MenuUtil.getActiveElement(this))}catch(t){s.MenuUtil.error(t,"Illegal command callback.")}s.MenuUtil.close(this)},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractItem);e.Command=a},2965:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Label=void 0;var i=r(1340),s=r(2165),a=function(t){function e(e,r,n){return t.call(this,e,"label",r,n)||this}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.id)},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.html.classList.add(s.HtmlClasses.MENULABEL)},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractItem);e.Label=a},385:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Radio=void 0;var i=r(6765),s=r(2556),a=r(2165),l=function(t){function e(e,r,n,o){var i=t.call(this,e,"radio",r,o)||this;return i.role="menuitemradio",i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(this.id),s.MenuUtil.close(this)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.span.textContent="\u2713",this.span.classList.add(a.HtmlClasses.MENURADIOCHECK)},e.prototype.updateAria=function(){this.html.setAttribute("aria-checked",this.variable.getValue()===this.id?"true":"false")},e.prototype.updateSpan=function(){this.span.style.display=this.variable.getValue()===this.id?"":"none"},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Radio=l},3463:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Rule=void 0;var i=r(9329),s=r(2165),a=function(t){function e(e){var r=t.call(this,e,"rule")||this;return r.className=s.HtmlClasses.MENUITEM,r.role="separator",r}return o(e,t),e.fromJson=function(t,e,r){return new this(r)},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;e.classList.add(s.HtmlClasses.MENURULE),e.setAttribute("aria-orientation","vertical")},e.prototype.addEvents=function(t){},e.prototype.toJson=function(){return{type:"rule"}},e}(i.AbstractEntry);e.Rule=a},7625:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Slider=void 0;var i=r(6765),s=r(2556),a=r(2165),l=r(3205),c=function(t){function e(e,r,n,o){var i=t.call(this,e,"slider",r,o)||this;return i.role="slider",i.labelId="ctx_slideLabel"+s.MenuUtil.counter(),i.valueId="ctx_slideValue"+s.MenuUtil.counter(),i.inputEvent=!1,i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(this.input.value,s.MenuUtil.getActiveElement(this)),this.update()},e.prototype.space=function(e){t.prototype.space.call(this,e),s.MenuUtil.close(this)},e.prototype.focus=function(){t.prototype.focus.call(this),this.input.focus()},e.prototype.unfocus=function(){t.prototype.unfocus.call(this),this.updateSpan()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.html.classList.add(a.HtmlClasses.MENUSLIDER),this.valueSpan=document.createElement("span"),this.valueSpan.setAttribute("id",this.valueId),this.valueSpan.classList.add(a.HtmlClasses.SLIDERVALUE),this.html.appendChild(this.valueSpan)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.labelSpan=document.createElement("span"),this.labelSpan.setAttribute("id",this.labelId),this.labelSpan.appendChild(this.html.childNodes[0]),this.html.appendChild(this.labelSpan),this.input=document.createElement("input"),this.input.setAttribute("type","range"),this.input.setAttribute("min","0"),this.input.setAttribute("max","100"),this.input.setAttribute("aria-valuemin","0"),this.input.setAttribute("aria-valuemax","100"),this.input.setAttribute("aria-labelledby",this.labelId),this.input.addEventListener("keydown",this.inputKey.bind(this)),this.input.addEventListener("input",this.executeAction.bind(this)),this.input.classList.add(a.HtmlClasses.SLIDERBAR),this.span.appendChild(this.input)},e.prototype.inputKey=function(t){this.inputEvent=!0},e.prototype.mousedown=function(t){t.stopPropagation()},e.prototype.mouseup=function(t){event.stopPropagation()},e.prototype.keydown=function(e){var r=e.keyCode;return r===l.KEY.UP||r===l.KEY.DOWN?(e.preventDefault(),void t.prototype.keydown.call(this,e)):this.inputEvent&&r!==l.KEY.ESCAPE&&r!==l.KEY.RETURN?(this.inputEvent=!1,void e.stopPropagation()):(t.prototype.keydown.call(this,e),void e.stopPropagation())},e.prototype.updateAria=function(){var t=this.variable.getValue();t&&this.input&&(this.input.setAttribute("aria-valuenow",t),this.input.setAttribute("aria-valuetext",t+"%"))},e.prototype.updateSpan=function(){var t;try{t=this.variable.getValue(s.MenuUtil.getActiveElement(this)),this.valueSpan.innerHTML=t+"%"}catch(e){t=""}this.input.value=t},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Slider=c},6186:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Submenu=void 0;var i=r(1340),s=r(2165),a=function(t){function e(e,r,n){var o=t.call(this,e,"submenu",r,n)||this;return o._submenu=null,o}return o(e,t),e.fromJson=function(t,e,r){var n=e.content,o=e.menu,i=new this(r,n,e.id),s=t.get("subMenu")(t,o,i);return i.submenu=s,i},Object.defineProperty(e.prototype,"submenu",{get:function(){return this._submenu},set:function(t){this._submenu=t},enumerable:!1,configurable:!0}),e.prototype.mouseover=function(t){this.focus(),this.stop(t)},e.prototype.mouseout=function(t){this.stop(t)},e.prototype.unfocus=function(){if(this.submenu.isPosted()){if(this.menu.focused!==this)return t.prototype.unfocus.call(this),void this.menu.unpostSubmenus();this.html.setAttribute("tabindex","-1"),this.html.blur()}else t.prototype.unfocus.call(this)},e.prototype.focus=function(){t.prototype.focus.call(this),this.submenu.isPosted()||this.disabled||this.submenu.post()},e.prototype.executeAction=function(){this.submenu.isPosted()?this.submenu.unpost():this.submenu.post()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;this.span=document.createElement("span"),this.span.textContent="\u25ba",this.span.classList.add(s.HtmlClasses.MENUARROW),e.appendChild(this.span),e.setAttribute("aria-haspopup","true")},e.prototype.left=function(e){this.submenu.isPosted()?this.submenu.unpost():t.prototype.left.call(this,e)},e.prototype.right=function(t){this.submenu.isPosted()?this.submenu.down(t):this.submenu.post()},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractItem);e.Submenu=a},3205:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.KEY=void 0,function(t){t[t.RETURN=13]="RETURN",t[t.ESCAPE=27]="ESCAPE",t[t.SPACE=32]="SPACE",t[t.LEFT=37]="LEFT",t[t.UP=38]="UP",t[t.RIGHT=39]="RIGHT",t[t.DOWN=40]="DOWN"}(e.KEY||(e.KEY={}))},9328:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.MenuElement=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addAttributes=function(t){for(var e in t)this.html.setAttribute(e,t[e])},Object.defineProperty(e.prototype,"html",{get:function(){return this._html||this.generateHtml(),this._html},set:function(t){this._html=t,this.addEvents(t)},enumerable:!1,configurable:!0}),e.prototype.generateHtml=function(){var t=document.createElement("div");t.classList.add(this.className),t.setAttribute("role",this.role),this.html=t},e.prototype.focus=function(){var t=this.html;t.setAttribute("tabindex","0"),t.focus()},e.prototype.unfocus=function(){var t=this.html;t.hasAttribute("tabindex")&&t.setAttribute("tabindex","-1");try{t.blur()}catch(t){}t.blur()},e}(r(2868).AbstractNavigatable);e.MenuElement=i},1932:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MenuStore=void 0;var o=r(2556),i=r(2165),s=r(3205),a=function(){function t(t){this.menu=t,this.store=[],this._active=null,this.counter=0,this.attachedClass=i.HtmlClasses.ATTACHED+"_"+o.MenuUtil.counter(),this.taborder=!0,this.attrMap={}}return Object.defineProperty(t.prototype,"active",{get:function(){return this._active},set:function(t){do{if(-1!==this.store.indexOf(t)){this._active=t;break}t=t.parentNode}while(t)},enumerable:!1,configurable:!0}),t.prototype.next=function(){var t=this.store.length;if(0===t)return this.active=null,null;var e=this.store.indexOf(this.active);return e=-1===e?0:e<t-1?e+1:0,this.active=this.store[e],this.active},t.prototype.previous=function(){var t=this.store.length;if(0===t)return this.active=null,null;var e=t-1,r=this.store.indexOf(this.active);return r=-1===r||0===r?e:r-1,this.active=this.store[r],this.active},t.prototype.clear=function(){this.remove(this.store)},t.prototype.insert=function(t){var e,r,o=t instanceof HTMLElement?[t]:t;try{for(var i=n(o),s=i.next();!s.done;s=i.next()){var a=s.value;this.insertElement(a)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}this.sort()},t.prototype.remove=function(t){var e,r,o=t instanceof HTMLElement?[t]:t;try{for(var i=n(o),s=i.next();!s.done;s=i.next()){var a=s.value;this.removeElement(a)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}this.sort()},t.prototype.inTaborder=function(t){this.taborder&&!t&&this.removeTaborder(),!this.taborder&&t&&this.insertTaborder(),this.taborder=t},t.prototype.insertTaborder=function(){this.taborder&&this.insertTaborder_()},t.prototype.removeTaborder=function(){this.taborder&&this.removeTaborder_()},t.prototype.insertElement=function(t){t.classList.contains(this.attachedClass)||(t.classList.add(this.attachedClass),this.taborder&&this.addTabindex(t),this.addEvents(t))},t.prototype.removeElement=function(t){t.classList.contains(this.attachedClass)&&(t.classList.remove(this.attachedClass),this.taborder&&this.removeTabindex(t),this.removeEvents(t))},t.prototype.sort=function(){var t=document.getElementsByClassName(this.attachedClass);this.store=[].slice.call(t)},t.prototype.insertTaborder_=function(){this.store.forEach((function(t){return t.setAttribute("tabindex","0")}))},t.prototype.removeTaborder_=function(){this.store.forEach((function(t){return t.setAttribute("tabindex","-1")}))},t.prototype.addTabindex=function(t){t.hasAttribute("tabindex")&&t.setAttribute(i.HtmlAttrs.OLDTAB,t.getAttribute("tabindex")),t.setAttribute("tabindex","0")},t.prototype.removeTabindex=function(t){t.hasAttribute(i.HtmlAttrs.OLDTAB)?(t.setAttribute("tabindex",t.getAttribute(i.HtmlAttrs.OLDTAB)),t.removeAttribute(i.HtmlAttrs.OLDTAB)):t.removeAttribute("tabindex")},t.prototype.addEvents=function(t){t.hasAttribute(i.HtmlAttrs.COUNTER)||(this.addEvent(t,"contextmenu",this.menu.post.bind(this.menu)),this.addEvent(t,"keydown",this.keydown.bind(this)),t.setAttribute(i.HtmlAttrs.COUNTER,this.counter.toString()),this.counter++)},t.prototype.addEvent=function(t,e,r){var n=i.HtmlAttrs[e.toUpperCase()+"FUNC"];this.attrMap[n+this.counter]=r,t.addEventListener(e,r)},t.prototype.removeEvents=function(t){if(t.hasAttribute(i.HtmlAttrs.COUNTER)){var e=t.getAttribute(i.HtmlAttrs.COUNTER);this.removeEvent(t,"contextmenu",e),this.removeEvent(t,"keydown",e),t.removeAttribute(i.HtmlAttrs.COUNTER)}},t.prototype.removeEvent=function(t,e,r){var n=i.HtmlAttrs[e.toUpperCase()+"FUNC"],o=this.attrMap[n+r];t.removeEventListener(e,o)},t.prototype.keydown=function(t){t.keyCode===s.KEY.SPACE&&(this.menu.post(t),t.preventDefault(),t.stopImmediatePropagation())},t}();e.MenuStore=a},2556:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MenuUtil=void 0,function(t){t.close=function(t){var e=t.menu;e.baseMenu?e.baseMenu.unpost():e.unpost()},t.getActiveElement=function(t){var e=t.menu;return(e.baseMenu?e.baseMenu:e).store.active},t.error=function(t,e){console.error("ContextMenu Error: "+e)},t.counter=function(){return e++};var e=0}(e.MenuUtil||(e.MenuUtil={}))},8853:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MOUSE=void 0,e.MOUSE={CLICK:"click",DBLCLICK:"dblclick",DOWN:"mousedown",UP:"mouseup",OVER:"mouseover",OUT:"mouseout",MOVE:"mousemove",SELECTEND:"selectend",SELECTSTART:"selectstart"}},6914:function(t,e,r){var n=this&&this.__rest||function(t,e){var r={};for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&e.indexOf(n)<0&&(r[n]=t[n]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(t);o<n.length;o++)e.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(t,n[o])&&(r[n[o]]=t[n[o]])}return r},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__spread||function(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(o(arguments[e]));return t};Object.defineProperty(e,"__esModule",{value:!0}),e.Parser=void 0;var a=r(3467),l=r(5073),c=r(3737),u=r(1409),p=r(9886),h=r(2965),f=r(385),d=r(6186),m=r(3463),y=r(7625),g=r(4834),b=r(2100),v=r(2308),_=function(){function t(t){var e=this;void 0===t&&(t=[]),this._initList=[["command",a.Command.fromJson.bind(a.Command)],["checkbox",u.Checkbox.fromJson.bind(u.Checkbox)],["combo",p.Combo.fromJson.bind(p.Combo)],["slider",y.Slider.fromJson.bind(y.Slider)],["label",h.Label.fromJson.bind(h.Label)],["radio",f.Radio.fromJson.bind(f.Radio)],["rule",m.Rule.fromJson.bind(m.Rule)],["submenu",d.Submenu.fromJson.bind(d.Submenu)],["contextMenu",l.ContextMenu.fromJson.bind(l.ContextMenu)],["subMenu",g.SubMenu.fromJson.bind(g.SubMenu)],["variable",c.Variable.fromJson.bind(c.Variable)],["items",this.items.bind(this)],["selectionMenu",b.SelectionMenu.fromJson.bind(b.SelectionMenu)],["selectionBox",b.SelectionBox.fromJson.bind(b.SelectionBox)]],this._factory=new v.ParserFactory(this._initList),t.forEach((function(t){var r=o(t,2),n=r[0],i=r[1];return e.factory.add(n,i)}))}return Object.defineProperty(t.prototype,"factory",{get:function(){return this._factory},enumerable:!1,configurable:!0}),t.prototype.items=function(t,e,r){var n,o,s=[];try{for(var a=i(e),l=a.next();!l.done;l=a.next()){var c=l.value,u=this.parse(c,r);u&&(r.items.push(u),c.disabled&&u.disable(),c.hidden&&s.push(u))}}catch(t){n={error:t}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return s.forEach((function(t){return t.hide()})),r.items},t.prototype.parse=function(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];var o=t.type,i=n(t,["type"]),a=this.factory.get(o);return a?a.apply(void 0,s([this.factory,i],e)):null},t}();e.Parser=_},2308:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.ParserFactory=void 0;var r=function(){function t(t){this._parser=new Map(t)}return t.prototype.get=function(t){return this._parser.get(t)},t.prototype.add=function(t,e){this._parser.set(t,e)},t}();e.ParserFactory=r},2100:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionBox=e.SelectionMenu=void 0;var s=r(2556),a=r(2165),l=r(1484),c=r(4922),u=function(t){function e(e){var r=t.call(this)||this;return r.anchor=e,r.className=a.HtmlClasses.SELECTIONMENU,r.variablePool=r.anchor.menu.pool,r.baseMenu=r.anchor.menu,r}return o(e,t),e.fromJson=function(t,e,r){var n=e.title,o=e.values,i=e.variable,s=new this(r),a=t.get("label")(t,{content:n||"",id:n||"id"},s),l=t.get("rule")(t,{},s),c=o.map((function(e){return t.get("radio")(t,{content:e,variable:i,id:e},s)})),u=[a,l].concat(c);return s.items=u,s},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.items.forEach((function(t){return t.html.classList.add(a.HtmlClasses.SELECTIONITEM)}))},e.prototype.display=function(){},e.prototype.right=function(t){this.anchor.right(t)},e.prototype.left=function(t){this.anchor.left(t)},e}(l.AbstractMenu);e.SelectionMenu=u;var p=function(t){function e(e,r,n,o){void 0===n&&(n="none"),void 0===o&&(o="vertical");var i=t.call(this,e,null,r)||this;return i.style=n,i.grid=o,i._selections=[],i.prefix="ctxt-selection",i._balanced=!0,i}return o(e,t),e.fromJson=function(t,e,r){var n=e.title,o=e.signature,i=e.selections,s=new this(n,o,e.order,e.grid);s.attachMenu(r);var a=i.map((function(e){return t.get("selectionMenu")(t,e,s)}));return s.selections=a,s},e.prototype.attachMenu=function(t){this.menu=t},Object.defineProperty(e.prototype,"selections",{get:function(){return this._selections},set:function(t){var e=this;this._selections=[],t.forEach((function(t){return e.addSelection(t)}))},enumerable:!1,configurable:!0}),e.prototype.addSelection=function(t){t.anchor=this,this._selections.push(t)},e.prototype.rowDiv=function(t){var e=this,r=document.createElement("div");this.contentDiv.appendChild(r);var n=t.map((function(t){return r.appendChild(t.html),t.html.id||(t.html.id=e.prefix+s.MenuUtil.counter()),t.html.getBoundingClientRect()})),o=n.map((function(t){return t.width})),i=o.reduce((function(t,e){return t+e}),0),l=n.reduce((function(t,e){return Math.max(t,e.height)}),0);return r.classList.add(a.HtmlClasses.SELECTIONDIVIDER),r.setAttribute("style","height: "+l+"px;"),[r,i,l,o]},e.prototype.display=function(){if(t.prototype.display.call(this),this.order(),this.selections.length){for(var e=[],r=0,n=[],o=this.getChunkSize(this.selections.length),s=function(t){var s=a.selections.slice(t,t+o),l=i(a.rowDiv(s),4),c=l[0],u=l[1],p=l[2],h=l[3];e.push(c),r=Math.max(r,u),s.forEach((function(t){return t.html.style.height=p+"px"})),n=a.combineColumn(n,h)},a=this,l=0;l<this.selections.length;l+=o)s(l);this._balanced&&(this.balanceColumn(e,n),r=n.reduce((function(t,e){return t+e}),20)),e.forEach((function(t){return t.style.width=r+"px"}))}},e.prototype.getChunkSize=function(t){switch(this.grid){case"square":return Math.floor(Math.sqrt(t));case"horizontal":return Math.floor(t/e.chunkSize);default:return e.chunkSize}},e.prototype.balanceColumn=function(t,e){t.forEach((function(t){for(var r=Array.from(t.children),n=0,o=void 0;o=r[n];n++)o.style.width=e[n]+"px"}))},e.prototype.combineColumn=function(t,e){for(var r=[],n=0;t[n]||e[n];){if(!t[n]){r=r.concat(e.slice(n));break}if(!e[n]){r=r.concat(t.slice(n));break}r.push(Math.max(t[n],e[n])),n++}return r},e.prototype.left=function(t){var e=this;this.move(t,(function(t){return(0===t?e.selections.length:t)-1}))},e.prototype.right=function(t){var e=this;this.move(t,(function(t){return t===e.selections.length-1?0:t+1}))},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.html.classList.add(a.HtmlClasses.SELECTION)},e.prototype.generateContent=function(){var e=t.prototype.generateContent.call(this);return e.classList.add(a.HtmlClasses.SELECTIONBOX),e.removeAttribute("tabindex"),e},e.prototype.findSelection=function(t){var e=t.target,r=null;if(e.id&&(r=this.selections.find((function(t){return t.html.id===e.id}))),!r){var n=e.parentElement.id;r=this.selections.find((function(t){return t.html.id===n}))}return r},e.prototype.move=function(t,e){var r=this.findSelection(t);r.focused&&r.focused.unfocus();var n=e(this.selections.indexOf(r));this.selections[n].focus()},e.prototype.order=function(){this.selections.sort(e.orderMethod.get(this.style))},e.prototype.toJson=function(){return{type:""}},e.chunkSize=4,e.orderMethod=new Map([["alphabetical",function(t,e){return t.items[0].content.localeCompare(e.items[0].content)}],["none",function(t,e){return 1}],["decreasing",function(t,e){var r=t.items.length,n=e.items.length;return r<n?1:n<r?-1:0}],["increasing",function(t,e){var r=t.items.length,n=e.items.length;return r<n?-1:n<r?1:0}]]),e}(c.Info);e.SelectionBox=p},4834:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SubMenu=void 0;var i=function(t){function e(e){var r=t.call(this)||this;return r._anchor=e,r.variablePool=r.anchor.menu.pool,r.setBaseMenu(),r}return o(e,t),e.fromJson=function(t,e,r){var n=e.items,o=new this(r),i=t.get("items")(t,n,o);return o.items=i,o},Object.defineProperty(e.prototype,"anchor",{get:function(){return this._anchor},enumerable:!1,configurable:!0}),e.prototype.post=function(){if(this.anchor.menu.isPosted()){for(var e=this.anchor.html,r=this.html,n=this.baseMenu.frame,o=e.offsetWidth,i=o-2,s=0;e&&e!==n;)i+=e.offsetLeft,s+=e.offsetTop,e=e.parentNode;i+r.offsetWidth>document.body.offsetWidth-5&&(i=Math.max(5,i-o-r.offsetWidth+6)),t.prototype.post.call(this,i,s)}},e.prototype.display=function(){this.baseMenu.frame.appendChild(this.html)},e.prototype.setBaseMenu=function(){var t=this;do{t=t.anchor.menu}while(t instanceof e);this.baseMenu=t},e.prototype.left=function(t){this.focused=null,this.anchor.focus()},e.prototype.toJson=function(){return{type:""}},e}(r(1484).AbstractMenu);e.SubMenu=i},3737:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Variable=void 0;var n=r(2556),o=function(){function t(t,e,r){this._name=t,this.getter=e,this.setter=r,this.items=[]}return t.fromJson=function(t,e,r){var n=new this(e.name,e.getter,e.setter);r.insert(n)},Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),t.prototype.getValue=function(t){try{return this.getter(t)}catch(t){return n.MenuUtil.error(t,"Command of variable "+this.name+" failed."),null}},t.prototype.setValue=function(t,e){try{this.setter(t,e)}catch(t){n.MenuUtil.error(t,"Command of variable "+this.name+" failed.")}this.update()},t.prototype.register=function(t){-1===this.items.indexOf(t)&&this.items.push(t)},t.prototype.unregister=function(t){var e=this.items.indexOf(t);-1!==e&&this.items.splice(e,1)},t.prototype.update=function(){this.items.forEach((function(t){return t.update()}))},t.prototype.registerCallback=function(t){this.items.forEach((function(e){return e.registerCallback(t)}))},t.prototype.unregisterCallback=function(t){this.items.forEach((function(e){return e.unregisterCallback(t)}))},t.prototype.toJson=function(){return{type:"variable",name:this.name,getter:this.getter.toString(),setter:this.setter.toString()}},t}();e.Variable=o},2358:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.VariablePool=void 0;var r=function(){function t(){this.pool={}}return t.prototype.insert=function(t){this.pool[t.name]=t},t.prototype.lookup=function(t){return this.pool[t]},t.prototype.remove=function(t){delete this.pool[t]},t.prototype.update=function(){for(var t in this.pool)this.pool[t].update()},t}();e.VariablePool=r},3921:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractAudioRenderer=void 0;const n=r(5897);e.AbstractAudioRenderer=class{constructor(){this.separator_=" "}setSeparator(t){this.separator_=t}getSeparator(){return"braille"===n.default.getInstance().modality?"":this.separator_}error(t){return null}merge(t){let e="";const r=t.length-1;for(let n,o=0;n=t[o];o++)if(e+=n.speech,o<r){const t=n.attributes.separator;e+=void 0!==t?t:this.getSeparator()}return e}finalize(t){return t}pauseValue(t){let e;switch(t){case"long":e=750;break;case"medium":e=500;break;case"short":e=250;break;default:e=parseInt(t,10)}return Math.floor(e*n.default.getInstance().getRate()/100)}}},4196:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AcssRenderer=void 0;const n=r(4440),o=r(8496),i=r(3706),s=r(182);class a extends s.MarkupRenderer{markup(t){this.setScaleFunction(-2,2,0,10,0);const e=i.personalityMarkup(t),r=[],n={open:[]};let o=null,s=!1;for(let t,a=0;t=e[a];a++){if(i.isMarkupElement(t)){i.mergeMarkup(n,t);continue}if(i.isPauseElement(t)){s&&(o=i.mergePause(o,t,Math.max));continue}const e='"'+this.merge(t.span)+'"';s=!0,o&&(r.push(this.pause(o)),o=null);const a=this.prosody_(n);r.push(a?"(text ("+a+") "+e+")":e)}return"(exp "+r.join(" ")+")"}error(t){return'(error "'+o.Move.get(t)+'")'}prosodyElement(t,e){switch(e=this.applyScaleFunction(e),t){case n.personalityProps.RATE:return"(richness . "+e+")";case n.personalityProps.PITCH:return"(average-pitch . "+e+")";case n.personalityProps.VOLUME:return"(stress . "+e+")"}return"(value . "+e+")"}pause(t){return"(pause . "+this.pauseValue(t[n.personalityProps.PAUSE])+")"}prosody_(t){const e=t.open,r=[];for(let n,o=0;n=e[o];o++)r.push(this.prosodyElement(n,t[n]));return r.join(" ")}}e.AcssRenderer=a},3706:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.isSpanElement=e.isPauseElement=e.isMarkupElement=e.personalityMarkup=e.sortClose=e.mergeMarkup=e.mergePause=void 0;const n=r(707),o=r(4440),i=r(9536);function s(t,e,r){return(r||function(r,n){return"number"==typeof r&&"number"==typeof n?r+n:"number"==typeof r?n:"number"==typeof n?r:[t,e].sort()[0]}).call(null,t,e)}e.mergePause=function(t,e,r){return t?{pause:s(t.pause,e.pause,r)}:e},e.mergeMarkup=function(t,e){delete t.open,e.close.forEach((e=>delete t[e])),e.open.forEach((r=>t[r]=e[r]));const r=Object.keys(t);t.open=r},e.sortClose=function(t,e){if(t.length<=1)return t;const r=[];for(let n,o=0;n=e[o],t.length;o++)n.close&&n.close.length&&n.close.forEach((function(e){const n=t.indexOf(e);-1!==n&&(r.unshift(e),t.splice(n,1))}));return r};let a={},l=[];function c(t,e){const r=t[t.length-1];if(r){if(f(e)&&f(r)){if(void 0===r.join)return void(r.span=r.span.concat(e.span));const t=r.span.pop(),n=e.span.shift();return r.span.push(t+r.join+n),r.span=r.span.concat(e.span),void(r.join=e.join)}h(e)&&h(r)?r.pause=s(r.pause,e.pause):t.push(e)}else t.push(e)}function u(t,e){t.rate&&(e.rate=t.rate),t.pitch&&(e.pitch=t.pitch),t.volume&&(e.volume=t.volume)}function p(t){return"object"==typeof t&&t.open}function h(t){return"object"==typeof t&&1===Object.keys(t).length&&Object.keys(t)[0]===o.personalityProps.PAUSE}function f(t){const e=Object.keys(t);return"object"==typeof t&&(1===e.length&&"span"===e[0]||2===e.length&&("span"===e[0]&&"join"===e[1]||"span"===e[1]&&"join"===e[0]))}function d(t,e,r,n,a,l=!1){if(l){const l=t[t.length-1];let c;if(l&&(c=l[o.personalityProps.JOIN]),l&&!e.speech&&a&&h(l)){const t=o.personalityProps.PAUSE;l[t]=s(l[t],a[t]),a=null}if(l&&e.speech&&0===Object.keys(r).length&&f(l)){if(void 0!==c){const t=l.span.pop();e=new i.Span(t.speech+c+e.speech,t.attributes)}l.span.push(e),e=new i.Span("",{}),l[o.personalityProps.JOIN]=n}}0!==Object.keys(r).length&&t.push(r),e.speech&&t.push({span:[e],join:n}),a&&t.push(a)}function m(t,e){if(!e)return t;const r={};for(const n of o.personalityPropList){const o=t[n],i=e[n];if(!o&&!i||o&&i&&o===i)continue;const s=o||0;p(r)||(r.open=[],r.close=[]),o||r.close.push(n),i||r.open.push(n),i&&o&&(r.close.push(n),r.open.push(n)),e[n]=s,r[n]=s,a[n]?a[n].push(s):a[n]=[s]}if(p(r)){let t=r.close.slice();for(;t.length>0;){let o=l.pop();const i=(0,n.setdifference)(o,t);if(t=(0,n.setdifference)(t,o),o=i,0!==t.length){if(0!==o.length){r.close=r.close.concat(o),r.open=r.open.concat(o);for(let t,n=0;t=o[n];n++)r[t]=e[t]}}else 0!==o.length&&l.push(o)}l.push(r.open)}return r}e.personalityMarkup=function(t){a={},l=[];let e=[];const r={};for(let n,i=0;n=t[i];i++){let t=null;const i=n.descriptionSpan(),s=n.personality,a=s[o.personalityProps.JOIN];delete s[o.personalityProps.JOIN],void 0!==s[o.personalityProps.PAUSE]&&(t={[o.personalityProps.PAUSE]:s[o.personalityProps.PAUSE]},delete s[o.personalityProps.PAUSE]);d(e,i,m(s,r),a,t,!0)}return e=e.concat(function(){const t=[];for(let e=l.length-1;e>=0;e--){const r=l[e];if(r.length){const e={open:[],close:[]};for(let t=0;t<r.length;t++){const n=r[t];e.close.push(n),e[n]=0}t.push(e)}}return t}()),e=function(t){const e={},r=[];for(let n,o=0;n=t[o];o++){if(!p(n)){c(r,n);continue}if(!n.close||1!==n.close.length||n.open.length){u(n,e),r.push(n);continue}let i=t[o+1];if(!i||f(i)){u(n,e),r.push(n);continue}const s=h(i)?i:null;s&&(i=t[o+2]),i&&p(i)&&i.open[0]===n.close[0]&&!i.close.length&&i[i.open[0]]===e[i.open[0]]?s?(c(r,s),o+=2):o+=1:(u(n,e),r.push(n))}return r}(e),e},e.isMarkupElement=p,e.isPauseElement=h,e.isSpanElement=f},7052:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AuditoryDescription=void 0;const n=r(2105),o=r(9536);class i{constructor({context:t,text:e,userValue:r,annotation:n,attributes:o,personality:i,layout:s}){this.context=t||"",this.text=e||"",this.userValue=r||"",this.annotation=n||"",this.attributes=o||{},this.personality=i||{},this.layout=s||""}static create(t,e={}){return t.text=n.Grammar.getInstance().apply(t.text,e),new i(t)}isEmpty(){return 0===this.context.length&&0===this.text.length&&0===this.userValue.length&&0===this.annotation.length}clone(){let t,e;if(this.personality){t={};for(const e in this.personality)t[e]=this.personality[e]}if(this.attributes){e={};for(const t in this.attributes)e[t]=this.attributes[t]}return new i({context:this.context,text:this.text,userValue:this.userValue,annotation:this.annotation,personality:t,attributes:e,layout:this.layout})}toString(){return'AuditoryDescription(context="'+this.context+'" text="'+this.text+'" userValue="'+this.userValue+'" annotation="'+this.annotation+'")'}descriptionString(){return this.context&&this.text?this.context+" "+this.text:this.context||this.text}descriptionSpan(){return new o.Span(this.descriptionString(),this.attributes)}equals(t){return this.context===t.context&&this.text===t.text&&this.userValue===t.userValue&&this.annotation===t.annotation}}e.AuditoryDescription=i},8290:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.isXml=e.registerRenderer=e.error=e.finalize=e.merge=e.markup=e.getSeparator=e.setSeparator=void 0;const n=r(5897),o=r(4440),i=r(4196),s=r(8639),a=r(8990),l=r(6660),c=r(9536),u=r(7504),p=r(3757),h=r(4032),f=r(2456),d=new u.SsmlRenderer,m=new Map([[o.Markup.NONE,new h.StringRenderer],[o.Markup.PUNCTUATION,new a.PunctuationRenderer],[o.Markup.LAYOUT,new s.LayoutRenderer],[o.Markup.ACSS,new i.AcssRenderer],[o.Markup.SABLE,new l.SableRenderer],[o.Markup.VOICEXML,d],[o.Markup.SSML,d],[o.Markup.SSML_STEP,new p.SsmlStepRenderer]]);e.setSeparator=function(t){const e=m.get(n.default.getInstance().markup);e&&e.setSeparator(t)},e.getSeparator=function(){const t=m.get(n.default.getInstance().markup);return t?t.getSeparator():""},e.markup=function(t){const e=m.get(n.default.getInstance().markup);return e?e.markup(t):""},e.merge=function(t){const e=t.map((t=>"string"==typeof t?new c.Span(t,{}):t)),r=m.get(n.default.getInstance().markup);return r?r.merge(e):t.join()},e.finalize=function(t){const e=m.get(n.default.getInstance().markup);return e?e.finalize(t):t},e.error=function(t){const e=m.get(n.default.getInstance().markup);return e?e.error(t):""},e.registerRenderer=function(t,e){m.set(t,e)},e.isXml=function(){return m.get(n.default.getInstance().markup)instanceof f.XmlRenderer}},8639:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.LayoutRenderer=void 0;const n=r(2057),o=r(5740),i=r(4440),s=r(3706),a=r(2456);class l extends a.XmlRenderer{finalize(t){return function(t){c="";const e=o.parseInput(`<all>${t}</all>`);return n.Debugger.getInstance().output(o.formatXml(e.toString())),c=f(e),c}(t)}pause(t){return""}prosodyElement(t,e){return t===i.personalityProps.LAYOUT?`<${e}>`:""}closeTag(t){return`</${t}>`}markup(t){const e=[];let r=[];for(const n of t){if(!n.layout){r.push(n);continue}e.push(this.processContent(r)),r=[];const t=n.layout;t.match(/^begin/)?e.push("<"+t.replace(/^begin/,"")+">"):t.match(/^end/)?e.push("</"+t.replace(/^end/,"")+">"):console.warn("Something went wrong with layout markup: "+t)}return e.push(this.processContent(r)),e.join("")}processContent(t){const e=[],r=s.personalityMarkup(t);for(let t,n=0;t=r[n];n++)t.span?e.push(this.merge(t.span)):s.isPauseElement(t);return e.join("")}}e.LayoutRenderer=l;let c="";const u={TABLE:function(t){let e=g(t);e.forEach((t=>{t.cells=t.cells.slice(1).slice(0,-1),t.width=t.width.slice(1).slice(0,-1)}));const[r,n]=b(e);return e=v(e,n),_(e,r)},CASES:function(t){let e=g(t);e.forEach((t=>{t.cells=t.cells.slice(0,-1),t.width=t.width.slice(0,-1)}));const[r,n]=b(e);return e=v(e,n),_(e,r)},CAYLEY:function(t){let e=g(t);e.forEach((t=>{t.cells=t.cells.slice(1).slice(0,-1),t.width=t.width.slice(1).slice(0,-1),t.sep=t.sep+t.sep}));const[r,n]=b(e),o={lfence:"",rfence:"",cells:n.map((t=>"\u2810"+new Array(t).join("\u2812"))),width:n,height:1,sep:e[0].sep};return e.splice(1,0,o),e=v(e,n),_(e,r)},MATRIX:function(t){let e=g(t);const[r,n]=b(e);return e=v(e,n),_(e,r)},CELL:f,FENCE:f,ROW:f,FRACTION:function(t){const[e,r,,n,o]=Array.from(t.childNodes),i=p(r),s=p(n),a=m(i),l=m(s);let c=Math.max(a,l);const u=e+new Array(c+1).join("\u2812")+o;return c=u.length,`${x(i,c)}\n${u}\n${x(s,c)}`},NUMERATOR:E,DENOMINATOR:E};function p(t){const e=o.tagName(t),r=u[e];return r?r(t):t.textContent}function h(t,e){if(!t||!e)return t+e;const r=d(t),n=d(e),o=r-n;t=o<0?y(t,n,m(t)):t,e=o>0?y(e,r,m(e)):e;const i=t.split(/\r\n|\r|\n/),s=e.split(/\r\n|\r|\n/),a=[];for(let t=0;t<i.length;t++)a.push(i[t]+s[t]);return a.join("\n")}function f(t){let e="";for(const r of Array.from(t.childNodes))e=r.nodeType!==o.NodeType.TEXT_NODE?h(e,p(r)):h(e,r.textContent);return e}function d(t){return t.split(/\r\n|\r|\n/).length}function m(t){return t.split(/\r\n|\r|\n/).reduce(((t,e)=>Math.max(e.length,t)),0)}function y(t,e,r){return t=function(t,e){const r=e-d(t);return t+(r>0?new Array(r+1).join("\n"):"")}(t,e),function(t,e){const r=t.split(/\r\n|\r|\n/),n=[];for(const t of r){const r=e-t.length;n.push(t+(r>0?new Array(r+1).join("\u2800"):""))}return n.join("\n")}(t,r)}function g(t){const e=Array.from(t.childNodes),r=[];for(const t of e)t.nodeType===o.NodeType.ELEMENT_NODE&&r.push(M(t));return r}function b(t){const e=t.reduce(((t,e)=>Math.max(e.height,t)),0),r=[];for(let e=0;e<t[0].width.length;e++)r.push(t.map((t=>t.width[e])).reduce(((t,e)=>Math.max(t,e)),0));return[e,r]}function v(t,e){const r=[];for(const n of t){if(0===n.height)continue;const t=[];for(let r=0;r<n.cells.length;r++)t.push(y(n.cells[r],n.height,e[r]));n.cells=t,r.push(n)}return r}function _(t,e){if(1===e)return t.map((t=>t.lfence+t.cells.join(t.sep)+t.rfence)).join("\n");const r=[];for(const e of t){const t=S(e.sep,e.height);let n=e.cells.shift();for(;e.cells.length;)n=h(n,t),n=h(n,e.cells.shift());n=h(S(e.lfence,e.height),n),n=h(n,S(e.rfence,e.height)),r.push(n),r.push(e.lfence+new Array(m(n)-3).join(e.sep)+e.rfence)}return r.slice(0,-1).join("\n")}function S(t,e){let r="";for(;e;)r+=t+"\n",e--;return r.slice(0,-1)}function O(t){return t.nodeType===o.NodeType.ELEMENT_NODE&&"FENCE"===o.tagName(t)?p(t):""}function M(t){const e=Array.from(t.childNodes),r=O(e[0]),n=O(e[e.length-1]);r&&e.shift(),n&&e.pop();let i="";const s=[];for(const t of e){if(t.nodeType===o.NodeType.TEXT_NODE){i=t.textContent;continue}const e=p(t);s.push(e)}return{lfence:r,rfence:n,sep:i,cells:s,height:s.reduce(((t,e)=>Math.max(d(e),t)),0),width:s.map(m)}}function x(t,e){const r=(e-m(t))/2,[n,o]=Math.floor(r)===r?[r,r]:[Math.floor(r),Math.ceil(r)],i=t.split(/\r\n|\r|\n/),s=[],[a,l]=[new Array(n+1).join("\u2800"),new Array(o+1).join("\u2800")];for(const t of i)s.push(a+t+l);return s.join("\n")}function E(t){const e=t.firstChild,r=f(t);if(e&&e.nodeType===o.NodeType.ELEMENT_NODE){if("ENGLISH"===o.tagName(e))return"\u2830"+r;if("NUMBER"===o.tagName(e))return"\u283c"+r}return r}},182:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MarkupRenderer=void 0;const n=r(4440),o=r(3921);class i extends o.AbstractAudioRenderer{constructor(){super(...arguments),this.ignoreElements=[n.personalityProps.LAYOUT],this.scaleFunction=null}setScaleFunction(t,e,r,n,o=0){this.scaleFunction=i=>{const s=(i-t)/(e-t),a=r*(1-s)+n*s;return+(Math.round(a+"e+"+o)+"e-"+o)}}applyScaleFunction(t){return this.scaleFunction?this.scaleFunction(t):t}ignoreElement(t){return-1!==this.ignoreElements.indexOf(t)}}e.MarkupRenderer=i},8990:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.PunctuationRenderer=void 0;const n=r(4440),o=r(3921),i=r(3706);class s extends o.AbstractAudioRenderer{markup(t){const e=i.personalityMarkup(t);let r="",o=null,s=!1;for(let t,a=0;t=e[a];a++)i.isMarkupElement(t)||(i.isPauseElement(t)?s&&(o=i.mergePause(o,t,Math.max)):(o&&(r+=this.pause(o[n.personalityProps.PAUSE]),o=null),r+=(s?this.getSeparator():"")+this.merge(t.span),s=!0));return r}pause(t){let e;return e="number"==typeof t?t<=250?"short":t<=500?"medium":"long":t,s.PAUSE_PUNCTUATION.get(e)||""}}e.PunctuationRenderer=s,s.PAUSE_PUNCTUATION=new Map([["short",","],["medium",";"],["long","."]])},6660:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SableRenderer=void 0;const n=r(4440),o=r(2456);class i extends o.XmlRenderer{finalize(t){return'<?xml version="1.0"?><!DOCTYPE SABLE PUBLIC "-//SABLE//DTD SABLE speech mark up//EN" "Sable.v0_2.dtd" []><SABLE>'+this.getSeparator()+t+this.getSeparator()+"</SABLE>"}pause(t){return'<BREAK MSEC="'+this.pauseValue(t[n.personalityProps.PAUSE])+'"/>'}prosodyElement(t,e){switch(e=this.applyScaleFunction(e),t){case n.personalityProps.PITCH:return'<PITCH RANGE="'+e+'%">';case n.personalityProps.RATE:return'<RATE SPEED="'+e+'%">';case n.personalityProps.VOLUME:return'<VOLUME LEVEL="'+e+'%">';default:return"<"+t.toUpperCase()+' VALUE="'+e+'">'}}closeTag(t){return"</"+t.toUpperCase()+">"}}e.SableRenderer=i},9536:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Span=void 0;e.Span=class{constructor(t,e){this.speech=t,this.attributes=e}}},7504:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SsmlRenderer=void 0;const n=r(5897),o=r(4440),i=r(2456);class s extends i.XmlRenderer{finalize(t){return'<?xml version="1.0"?><speak version="1.1" xmlns="http://www.w3.org/2001/10/synthesis"><prosody rate="'+n.default.getInstance().getRate()+'%">'+this.getSeparator()+t+this.getSeparator()+"</prosody></speak>"}pause(t){return'<break time="'+this.pauseValue(t[o.personalityProps.PAUSE])+'ms"/>'}prosodyElement(t,e){const r=(e=Math.floor(this.applyScaleFunction(e)))<0?e.toString():"+"+e.toString();return"<prosody "+t.toLowerCase()+'="'+r+(t===o.personalityProps.VOLUME?">":'%">')}closeTag(t){return"</prosody>"}}e.SsmlRenderer=s},3757:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SsmlStepRenderer=void 0;const n=r(7504);class o extends n.SsmlRenderer{markup(t){return o.MARKS={},super.markup(t)}merge(t){const e=[];for(let r=0;r<t.length;r++){const n=t[r],i=n.attributes.extid;i&&!o.MARKS[i]&&(e.push('<mark name="'+i+'"/>'),o.MARKS[i]=!0),1===n.speech.length&&n.speech.match(/[a-zA-Z]/)?e.push('<say-as interpret-as="'+o.CHARACTER_ATTR+'">'+n.speech+"</say-as>"):e.push(n.speech)}return e.join(this.getSeparator())}}e.SsmlStepRenderer=o,o.CHARACTER_ATTR="character",o.MARKS={}},4032:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.StringRenderer=void 0;const n=r(3921),o=r(3706);class i extends n.AbstractAudioRenderer{markup(t){let e="";const r=(0,o.personalityMarkup)(t).filter((t=>t.span));if(!r.length)return e;const n=r.length-1;for(let t,o=0;t=r[o];o++){if(t.span&&(e+=this.merge(t.span)),o>=n)continue;const r=t.join;e+=void 0===r?this.getSeparator():r}return e}}e.StringRenderer=i},2456:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.XmlRenderer=void 0;const n=r(5897),o=r(3706),i=r(182);class s extends i.MarkupRenderer{markup(t){this.setScaleFunction(-2,2,-100,100,2);const e=o.personalityMarkup(t),r=[],i=[];for(let t,s=0;t=e[s];s++)if(t.span)r.push(this.merge(t.span));else if(o.isPauseElement(t))r.push(this.pause(t));else{if(t.close.length)for(let e=0;e<t.close.length;e++){const e=i.pop();if(-1===t.close.indexOf(e))throw new n.SREError("Unknown closing markup element: "+e);r.push(this.closeTag(e))}if(t.open.length){o.sortClose(t.open.slice(),e.slice(s+1)).forEach((e=>{r.push(this.prosodyElement(e,t[e])),i.push(e)}))}}return r.join(" ")}}e.XmlRenderer=s},707:function(t,e){function r(t,e){return t?e?t.filter((t=>e.indexOf(t)<0)):t:[]}Object.defineProperty(e,"__esModule",{value:!0}),e.union=e.setdifference=e.interleaveLists=e.removeEmpty=void 0,e.removeEmpty=function(t){return t.filter((t=>t))},e.interleaveLists=function(t,e){const r=[];for(;t.length||e.length;)t.length&&r.push(t.shift()),e.length&&r.push(e.shift());return r},e.setdifference=r,e.union=function(t,e){return t&&e?t.concat(r(e,t)):t||e||[]}},2139:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.loadScript=e.loadMapsForIE_=e.installWGXpath_=e.loadWGXpath_=e.mapsForIE=e.detectEdge=e.detectIE=void 0;const n=r(2315),o=r(5274);function i(t){l(n.default.WGXpath),s(t)}function s(t,e){let r=e||1;"undefined"==typeof wgxpath&&r<10?setTimeout((function(){s(t,r++)}),200):r>=10||(n.default.wgxpath=wgxpath,t?n.default.wgxpath.install({document:document}):n.default.wgxpath.install(),o.xpath.evaluate=document.evaluate,o.xpath.result=XPathResult,o.xpath.createNSResolver=document.createNSResolver)}function a(){l(n.default.mathmapsIePath)}function l(t){const e=n.default.document.createElement("script");e.type="text/javascript",e.src=t,n.default.document.head?n.default.document.head.appendChild(e):n.default.document.body.appendChild(e)}e.detectIE=function(){return"undefined"!=typeof window&&"ActiveXObject"in window&&"clipboardData"in window&&(a(),i(),!0)},e.detectEdge=function(){var t;return"undefined"!=typeof window&&"MSGestureEvent"in window&&null===(null===(t=window.chrome)||void 0===t?void 0:t.loadTimes)&&(document.evaluate=null,i(!0),!0)},e.mapsForIE=null,e.loadWGXpath_=i,e.installWGXpath_=s,e.loadMapsForIE_=a,e.loadScript=l},2057:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Debugger=void 0;const n=r(2315);class o{constructor(){this.isActive_=!1,this.outputFunction_=console.info,this.stream_=null}static getInstance(){return o.instance=o.instance||new o,o.instance}init(t){t&&this.startDebugFile_(t),this.isActive_=!0}output(...t){this.isActive_&&this.output_(t)}generateOutput(t){this.isActive_&&this.output_(t.apply(t,[]))}exit(t=(()=>{})){this.isActive_&&this.stream_&&this.stream_.end("","",t)}startDebugFile_(t){this.stream_=n.default.fs.createWriteStream(t),this.outputFunction_=function(...t){this.stream_.write(t.join(" ")),this.stream_.write("\n")}.bind(this),this.stream_.on("error",function(t){console.info("Invalid log file. Debug information sent to console."),this.outputFunction_=console.info}.bind(this)),this.stream_.on("finish",(function(){console.info("Finalizing debug file.")}))}output_(t){this.outputFunction_.apply(console.info===this.outputFunction_?console:this.outputFunction_,["Speech Rule Engine Debugger:"].concat(t))}}e.Debugger=o},5740:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.serializeXml=e.cloneNode=e.tagName=e.querySelectorAll=e.querySelectorAllByAttrValue=e.querySelectorAllByAttr=e.formatXml=e.createTextNode=e.createElementNS=e.createElement=e.replaceNode=e.NodeType=e.parseInput=e.XML_ENTITIES=e.trimInput_=e.toArray=void 0;const n=r(5897),o=r(4440),i=r(2315),s=r(5274);function a(t){const e=[];for(let r=0,n=t.length;r<n;r++)e.push(t[r]);return e}function l(t){return(t=t.replace(/ /g,"\xa0")).replace(/>[ \f\n\r\t\v\u200b]+</g,"><").trim()}function c(t,e){if(!e)return[!1,""];const r=t.match(/^<([^> ]+).*>/),n=e.match(/^<\/([^>]+)>(.*)/);return r&&n&&r[1]===n[1]?[!0,n[2]]:[!1,""]}e.toArray=a,e.trimInput_=l,e.XML_ENTITIES={"<":!0,">":!0,"&":!0,""":!0,"'":!0},e.parseInput=function(t){const e=new i.default.xmldom.DOMParser,r=l(t),a=!!r.match(/&(?!lt|gt|amp|quot|apos)\w+;/g);if(!r)throw new Error("Empty input!");try{const t=e.parseFromString(r,a?"text/html":"text/xml");return n.default.getInstance().mode===o.Mode.HTTP?(s.xpath.currentDocument=t,a?t.body.childNodes[0]:t.documentElement):t.documentElement}catch(t){throw new n.SREError("Illegal input: "+t.message)}},function(t){t[t.ELEMENT_NODE=1]="ELEMENT_NODE",t[t.ATTRIBUTE_NODE=2]="ATTRIBUTE_NODE",t[t.TEXT_NODE=3]="TEXT_NODE",t[t.CDATA_SECTION_NODE=4]="CDATA_SECTION_NODE",t[t.ENTITY_REFERENCE_NODE=5]="ENTITY_REFERENCE_NODE",t[t.ENTITY_NODE=6]="ENTITY_NODE",t[t.PROCESSING_INSTRUCTION_NODE=7]="PROCESSING_INSTRUCTION_NODE",t[t.COMMENT_NODE=8]="COMMENT_NODE",t[t.DOCUMENT_NODE=9]="DOCUMENT_NODE",t[t.DOCUMENT_TYPE_NODE=10]="DOCUMENT_TYPE_NODE",t[t.DOCUMENT_FRAGMENT_NODE=11]="DOCUMENT_FRAGMENT_NODE",t[t.NOTATION_NODE=12]="NOTATION_NODE"}(e.NodeType||(e.NodeType={})),e.replaceNode=function(t,e){t.parentNode&&(t.parentNode.insertBefore(e,t),t.parentNode.removeChild(t))},e.createElement=function(t){return i.default.document.createElement(t)},e.createElementNS=function(t,e){return i.default.document.createElementNS(t,e)},e.createTextNode=function(t){return i.default.document.createTextNode(t)},e.formatXml=function(t){let e="",r=/(>)(<)(\/*)/g,n=0,o=(t=t.replace(r,"$1\r\n$2$3")).split("\r\n");for(r=/(\.)*(<)(\/*)/g,o=o.map((t=>t.replace(r,"$1\r\n$2$3").split("\r\n"))).reduce(((t,e)=>t.concat(e)),[]);o.length;){let t=o.shift();if(!t)continue;let r=0;if(t.match(/^<\w[^>/]*>[^>]+$/)){const e=c(t,o[0]);e[0]?e[1]?(t+=o.shift().slice(0,-e[1].length),e[1].trim()&&o.unshift(e[1])):t+=o.shift():r=1}else if(t.match(/^<\/\w/))0!==n&&(n-=1);else if(t.match(/^<\w[^>]*[^/]>.*$/))r=1;else if(t.match(/^<\w[^>]*\/>.+$/)){const e=t.indexOf(">")+1;t.slice(e).trim()&&o.unshift(),t=t.slice(0,e)}else r=0;e+=new Array(n+1).join(" ")+t+"\r\n",n+=r}return e},e.querySelectorAllByAttr=function(t,e){return t.querySelectorAll?a(t.querySelectorAll(`[${e}]`)):s.evalXPath(`.//*[@${e}]`,t)},e.querySelectorAllByAttrValue=function(t,e,r){return t.querySelectorAll?a(t.querySelectorAll(`[${e}="${r}"]`)):s.evalXPath(`.//*[@${e}="${r}"]`,t)},e.querySelectorAll=function(t,e){return t.querySelectorAll?a(t.querySelectorAll(e)):s.evalXPath(`.//${e}`,t)},e.tagName=function(t){return t.tagName.toUpperCase()},e.cloneNode=function(t){return t.cloneNode(!0)},e.serializeXml=function(t){return(new i.default.xmldom.XMLSerializer).serializeToString(t)}},5897:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.EnginePromise=e.SREError=void 0;const n=r(1676),o=r(4440),i=r(2057),s=r(1377);class a extends Error{constructor(t=""){super(),this.message=t,this.name="SRE Error"}}e.SREError=a;class l{constructor(){this.customLoader=null,this.parsers={},this.comparator=null,this.mode=o.Mode.SYNC,this.init=!0,this.delay=!1,this.comparators={},this.domain="mathspeak",this.style=n.DynamicCstr.DEFAULT_VALUES[n.Axis.STYLE],this._defaultLocale=n.DynamicCstr.DEFAULT_VALUES[n.Axis.LOCALE],this.locale=this.defaultLocale,this.subiso="",this.modality=n.DynamicCstr.DEFAULT_VALUES[n.Axis.MODALITY],this.speech=o.Speech.NONE,this.markup=o.Markup.NONE,this.walker="Table",this.structure=!1,this.ruleSets=[],this.strict=!1,this.isIE=!1,this.isEdge=!1,this.rate="100",this.pprint=!1,this.config=!1,this.rules="",this.prune="",this.evaluator=l.defaultEvaluator,this.defaultParser=new n.DynamicCstrParser(n.DynamicCstr.DEFAULT_ORDER),this.parser=this.defaultParser,this.dynamicCstr=n.DynamicCstr.defaultCstr()}set defaultLocale(t){this._defaultLocale=s.Variables.ensureLocale(t,this._defaultLocale)}get defaultLocale(){return this._defaultLocale}static getInstance(){return l.instance=l.instance||new l,l.instance}static defaultEvaluator(t,e){return t}static evaluateNode(t){return l.nodeEvaluator(t)}getRate(){const t=parseInt(this.rate,10);return isNaN(t)?100:t}setDynamicCstr(t){if(this.defaultLocale&&(n.DynamicCstr.DEFAULT_VALUES[n.Axis.LOCALE]=this.defaultLocale),t){const e=Object.keys(t);for(let r=0;r<e.length;r++){const o=e[r];if(-1!==n.DynamicCstr.DEFAULT_ORDER.indexOf(o)){const e=t[o];this[o]=e}}}o.DOMAIN_TO_STYLES[this.domain]=this.style;const e=[this.locale,this.modality,this.domain,this.style].join("."),r=n.DynamicProperties.createProp([n.DynamicCstr.DEFAULT_VALUES[n.Axis.LOCALE]],[n.DynamicCstr.DEFAULT_VALUES[n.Axis.MODALITY]],[n.DynamicCstr.DEFAULT_VALUES[n.Axis.DOMAIN]],[n.DynamicCstr.DEFAULT_VALUES[n.Axis.STYLE]]),i=this.comparators[this.domain],s=this.parsers[this.domain];this.parser=s||this.defaultParser,this.dynamicCstr=this.parser.parse(e),this.dynamicCstr.updateProperties(r.getProperties()),this.comparator=i?i():new n.DefaultComparator(this.dynamicCstr)}configurate(t){this.mode!==o.Mode.HTTP||this.config||(!function(t){const e=document.documentElement.querySelectorAll('script[type="text/x-sre-config"]');for(let r=0,n=e.length;r<n;r++){let n;try{n=e[r].innerHTML;const o=JSON.parse(n);for(const e in o)t[e]=o[e]}catch(t){i.Debugger.getInstance().output("Illegal configuration ",n)}}}(t),this.config=!0),function(t){if("undefined"!=typeof SREfeature)for(const[e,r]of Object.entries(SREfeature))t[e]=r}(t)}setCustomLoader(t){t&&(this.customLoader=t)}}e.default=l,l.BINARY_FEATURES=["strict","structure","pprint"],l.STRING_FEATURES=["markup","style","domain","speech","walker","defaultLocale","locale","delay","modality","rate","rules","subiso","prune"],l.nodeEvaluator=function(t){return[]};class c{static get(t=l.getInstance().locale){return c.promises[t]||Promise.resolve("")}static getall(){return Promise.all(Object.values(c.promises))}}e.EnginePromise=c,c.loaded={},c.promises={}},4440:function(t,e){var r;Object.defineProperty(e,"__esModule",{value:!0}),e.DOMAIN_TO_STYLES=e.Markup=e.Speech=e.personalityPropList=e.personalityProps=e.Mode=void 0,function(t){t.SYNC="sync",t.ASYNC="async",t.HTTP="http"}(e.Mode||(e.Mode={})),function(t){t.PITCH="pitch",t.RATE="rate",t.VOLUME="volume",t.PAUSE="pause",t.JOIN="join",t.LAYOUT="layout"}(r=e.personalityProps||(e.personalityProps={})),e.personalityPropList=[r.PITCH,r.RATE,r.VOLUME,r.PAUSE,r.JOIN],function(t){t.NONE="none",t.SHALLOW="shallow",t.DEEP="deep"}(e.Speech||(e.Speech={})),function(t){t.NONE="none",t.LAYOUT="layout",t.PUNCTUATION="punctuation",t.SSML="ssml",t.SSML_STEP="ssml_step",t.ACSS="acss",t.SABLE="sable",t.VOICEXML="voicexml"}(e.Markup||(e.Markup={})),e.DOMAIN_TO_STYLES={mathspeak:"default",clearspeak:"default"}},6828:function(t,e,r){var n=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function s(t){try{l(n.next(t))}catch(t){i(t)}}function a(t){try{l(n.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}l((n=n.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.setup=void 0;const o=r(7491),i=r(6141),s=r(2139),a=r(5897),l=r(7248),c=r(2315);e.setup=function(t){return n(this,void 0,void 0,(function*(){const e=a.default.getInstance();"default"!==t.domain||"speech"!==t.modality&&t.modality&&"speech"!==e.modality||(t.domain="mathspeak");const r=r=>{void 0!==t[r]&&(e[r]=t[r])};return r("mode"),e.configurate(t),a.default.BINARY_FEATURES.forEach((r=>{void 0!==t[r]&&(e[r]=!!t[r])})),a.default.STRING_FEATURES.forEach(r),t.json&&(c.default.jsonPath=l.makePath(t.json)),t.xpath&&(c.default.WGXpath=t.xpath),e.setCustomLoader(t.custom),function(t){t.isIE=s.detectIE(),t.isEdge=s.detectEdge()}(e),o.setLocale(),e.setDynamicCstr(),e.init?(a.EnginePromise.promises.init=new Promise(((t,e)=>{setTimeout((()=>{t("init")}),10)})),e.init=!1,a.EnginePromise.get()):e.delay?(e.delay=!1,a.EnginePromise.get()):i.loadLocale()}))}},8496:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Event=e.EventType=e.Move=e.KeyCode=void 0,function(t){t[t.ENTER=13]="ENTER",t[t.ESC=27]="ESC",t[t.SPACE=32]="SPACE",t[t.PAGE_UP=33]="PAGE_UP",t[t.PAGE_DOWN=34]="PAGE_DOWN",t[t.END=35]="END",t[t.HOME=36]="HOME",t[t.LEFT=37]="LEFT",t[t.UP=38]="UP",t[t.RIGHT=39]="RIGHT",t[t.DOWN=40]="DOWN",t[t.TAB=9]="TAB",t[t.LESS=188]="LESS",t[t.GREATER=190]="GREATER",t[t.DASH=189]="DASH",t[t.ZERO=48]="ZERO",t[t.ONE=49]="ONE",t[t.TWO=50]="TWO",t[t.THREE=51]="THREE",t[t.FOUR=52]="FOUR",t[t.FIVE=53]="FIVE",t[t.SIX=54]="SIX",t[t.SEVEN=55]="SEVEN",t[t.EIGHT=56]="EIGHT",t[t.NINE=57]="NINE",t[t.A=65]="A",t[t.B=66]="B",t[t.C=67]="C",t[t.D=68]="D",t[t.E=69]="E",t[t.F=70]="F",t[t.G=71]="G",t[t.H=72]="H",t[t.I=73]="I",t[t.J=74]="J",t[t.K=75]="K",t[t.L=76]="L",t[t.M=77]="M",t[t.N=78]="N",t[t.O=79]="O",t[t.P=80]="P",t[t.Q=81]="Q",t[t.R=82]="R",t[t.S=83]="S",t[t.T=84]="T",t[t.U=85]="U",t[t.V=86]="V",t[t.W=87]="W",t[t.X=88]="X",t[t.Y=89]="Y",t[t.Z=90]="Z"}(e.KeyCode||(e.KeyCode={})),e.Move=new Map([[13,"ENTER"],[27,"ESC"],[32,"SPACE"],[33,"PAGE_UP"],[34,"PAGE_DOWN"],[35,"END"],[36,"HOME"],[37,"LEFT"],[38,"UP"],[39,"RIGHT"],[40,"DOWN"],[9,"TAB"],[188,"LESS"],[190,"GREATER"],[189,"DASH"],[48,"ZERO"],[49,"ONE"],[50,"TWO"],[51,"THREE"],[52,"FOUR"],[53,"FIVE"],[54,"SIX"],[55,"SEVEN"],[56,"EIGHT"],[57,"NINE"],[65,"A"],[66,"B"],[67,"C"],[68,"D"],[69,"E"],[70,"F"],[71,"G"],[72,"H"],[73,"I"],[74,"J"],[75,"K"],[76,"L"],[77,"M"],[78,"N"],[79,"O"],[80,"P"],[81,"Q"],[82,"R"],[83,"S"],[84,"T"],[85,"U"],[86,"V"],[87,"W"],[88,"X"],[89,"Y"],[90,"Z"]]),function(t){t.CLICK="click",t.DBLCLICK="dblclick",t.MOUSEDOWN="mousedown",t.MOUSEUP="mouseup",t.MOUSEOVER="mouseover",t.MOUSEOUT="mouseout",t.MOUSEMOVE="mousemove",t.SELECTSTART="selectstart",t.KEYPRESS="keypress",t.KEYDOWN="keydown",t.KEYUP="keyup",t.TOUCHSTART="touchstart",t.TOUCHMOVE="touchmove",t.TOUCHEND="touchend",t.TOUCHCANCEL="touchcancel"}(e.EventType||(e.EventType={}));e.Event=class{constructor(t,e,r){this.src=t,this.type=e,this.callback=r}add(){this.src.addEventListener(this.type,this.callback)}remove(){this.src.removeEventListener(this.type,this.callback)}}},7248:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.localePath=e.makePath=void 0;const n=r(2315);function o(t){return t.match("/$")?t:t+"/"}e.makePath=o,e.localePath=function(t,e="json"){return o(n.default.jsonPath)+t+(e.match(/^\./)?e:"."+e)}},3769:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.KeyProcessor=e.Processor=void 0;const n=r(8496);class o{constructor(t,e){this.name=t,this.process=e.processor,this.postprocess=e.postprocessor||((t,e)=>t),this.processor=this.postprocess?function(t){return this.postprocess(this.process(t),t)}:this.process,this.print=e.print||o.stringify_,this.pprint=e.pprint||this.print}static stringify_(t){return t?t.toString():t}}e.Processor=o,o.LocalState={walker:null,speechGenerator:null,highlighter:null};class i extends o{constructor(t,e){super(t,e),this.key=e.key||i.getKey_}static getKey_(t){return"string"==typeof t?n.KeyCode[t.toUpperCase()]:t}}e.KeyProcessor=i},6499:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.keypress=e.output=e.print=e.process=e.set=void 0;const n=r(8290),o=r(5714),i=r(3090),s=r(4356),a=r(1414),l=r(9552),c=r(9543),u=r(3362),p=r(1204),h=r(5740),f=r(5897),d=r(4440),m=r(3769),y=r(5274),g=new Map;function b(t){g.set(t.name,t)}function v(t){const e=g.get(t);if(!e)throw new f.SREError("Unknown processor "+t);return e}function _(t,e){const r=v(t);try{return r.processor(e)}catch(t){throw new f.SREError("Processing error for expression "+e)}}function S(t,e){const r=v(t);return f.default.getInstance().pprint?r.pprint(e):r.print(e)}e.set=b,e.process=_,e.print=S,e.output=function(t,e){const r=v(t);try{const t=r.processor(e);return f.default.getInstance().pprint?r.pprint(t):r.print(t)}catch(t){throw new f.SREError("Processing error for expression "+e)}},e.keypress=function(t,e){const r=v(t),n=r instanceof m.KeyProcessor?r.key(e):e,o=r.processor(n);return f.default.getInstance().pprint?r.pprint(o):r.print(o)},b(new m.Processor("semantic",{processor:function(t){const e=h.parseInput(t);return a.xmlTree(e)},postprocessor:function(t,e){const r=f.default.getInstance().speech;if(r===d.Speech.NONE)return t;const o=h.cloneNode(t);let i=c.computeMarkup(o);if(r===d.Speech.SHALLOW)return t.setAttribute("speech",n.finalize(i)),t;const s=y.evalXPath(".//*[@id]",t),a=y.evalXPath(".//*[@id]",o);for(let t,e,r=0;t=s[r],e=a[r];r++)i=c.computeMarkup(e),t.setAttribute("speech",n.finalize(i));return t},pprint:function(t){return h.formatXml(t.toString())}})),b(new m.Processor("speech",{processor:function(t){const e=h.parseInput(t),r=a.xmlTree(e),o=c.computeSpeech(r);return n.finalize(n.markup(o))},pprint:function(t){const e=t.toString();return n.isXml()?h.formatXml(e):e}})),b(new m.Processor("json",{processor:function(t){const e=h.parseInput(t);return a.getTree(e).toJson()},postprocessor:function(t,e){const r=f.default.getInstance().speech;if(r===d.Speech.NONE)return t;const o=h.parseInput(e),i=a.xmlTree(o),s=c.computeMarkup(i);if(r===d.Speech.SHALLOW)return t.stree.speech=n.finalize(s),t;const l=t=>{const e=y.evalXPath(`.//*[@id=${t.id}]`,i)[0],r=c.computeMarkup(e);t.speech=n.finalize(r),t.children&&t.children.forEach(l)};return l(t.stree),t},print:function(t){return JSON.stringify(t)},pprint:function(t){return JSON.stringify(t,null,2)}})),b(new m.Processor("description",{processor:function(t){const e=h.parseInput(t),r=a.xmlTree(e);return c.computeSpeech(r)},print:function(t){return JSON.stringify(t)},pprint:function(t){return JSON.stringify(t,null,2)}})),b(new m.Processor("enriched",{processor:function(t){return o.semanticMathmlSync(t)},postprocessor:function(t,e){const r=p.getSemanticRoot(t);let n;switch(f.default.getInstance().speech){case d.Speech.NONE:break;case d.Speech.SHALLOW:n=l.generator("Adhoc"),n.getSpeech(r,t);break;case d.Speech.DEEP:n=l.generator("Tree"),n.getSpeech(t,t)}return t},pprint:function(t){return h.formatXml(t.toString())}})),b(new m.Processor("walker",{processor:function(t){const e=l.generator("Node");m.Processor.LocalState.speechGenerator=e,e.setOptions({modality:f.default.getInstance().modality,locale:f.default.getInstance().locale,domain:f.default.getInstance().domain,style:f.default.getInstance().style}),m.Processor.LocalState.highlighter=i.highlighter({color:"black"},{color:"white"},{renderer:"NativeMML"});const r=_("enriched",t),n=S("enriched",r);return m.Processor.LocalState.walker=u.walker(f.default.getInstance().walker,r,e,m.Processor.LocalState.highlighter,n),m.Processor.LocalState.walker},print:function(t){return m.Processor.LocalState.walker.speech()}})),b(new m.KeyProcessor("move",{processor:function(t){if(!m.Processor.LocalState.walker)return null;return!1===m.Processor.LocalState.walker.move(t)?n.error(t):m.Processor.LocalState.walker.speech()}})),b(new m.Processor("number",{processor:function(t){const e=parseInt(t,10);return isNaN(e)?"":s.LOCALE.NUMBERS.numberToWords(e)}})),b(new m.Processor("ordinal",{processor:function(t){const e=parseInt(t,10);return isNaN(e)?"":s.LOCALE.NUMBERS.wordOrdinal(e)}})),b(new m.Processor("numericOrdinal",{processor:function(t){const e=parseInt(t,10);return isNaN(e)?"":s.LOCALE.NUMBERS.numericOrdinal(e)}})),b(new m.Processor("vulgar",{processor:function(t){const[e,r]=t.split("/").map((t=>parseInt(t,10)));return isNaN(e)||isNaN(r)?"":_("speech",`<mfrac><mn>${e}</mn><mn>${r}</mn></mfrac>`)}}))},2998:function(t,e,r){var n=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function s(t){try{l(n.next(t))}catch(t){i(t)}}function a(t){try{l(n.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}l((n=n.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.localePath=e.exit=e.move=e.walk=e.processFile=e.file=e.vulgar=e.numericOrdinal=e.ordinal=e.number=e.toEnriched=e.toDescription=e.toJson=e.toSemantic=e.toSpeech=e.localeLoader=e.engineReady=e.engineSetup=e.setupEngine=e.version=void 0;const o=r(5897),i=r(6828),s=r(4440),a=r(7248),l=r(6499),c=r(2315),u=r(1377),p=r(6141);function h(t){return n(this,void 0,void 0,(function*(){return(0,i.setup)(t)}))}function f(t,e){return l.process(t,e)}function d(t,e,r){switch(o.default.getInstance().mode){case s.Mode.ASYNC:return function(t,e,r){return n(this,void 0,void 0,(function*(){const n=yield c.default.fs.promises.readFile(e,{encoding:"utf8"}),i=l.output(t,n);if(r)try{c.default.fs.promises.writeFile(r,i)}catch(t){throw new o.SREError("Can not write to file: "+r)}return i}))}(t,e,r);case s.Mode.SYNC:return function(t,e,r){const n=function(t){let e;try{e=c.default.fs.readFileSync(t,{encoding:"utf8"})}catch(e){throw new o.SREError("Can not open file: "+t)}return e}(e),i=l.output(t,n);if(r)try{c.default.fs.writeFileSync(r,i)}catch(t){throw new o.SREError("Can not write to file: "+r)}return i}(t,e,r);default:throw new o.SREError(`Can process files in ${o.default.getInstance().mode} mode`)}}e.version=u.Variables.VERSION,e.setupEngine=h,e.engineSetup=function(){const t=["mode"].concat(o.default.STRING_FEATURES,o.default.BINARY_FEATURES),e=o.default.getInstance(),r={};return t.forEach((function(t){r[t]=e[t]})),r.json=c.default.jsonPath,r.xpath=c.default.WGXpath,r.rules=e.ruleSets.slice(),r},e.engineReady=function(){return n(this,void 0,void 0,(function*(){return h({}).then((()=>o.EnginePromise.getall()))}))},e.localeLoader=p.standardLoader,e.toSpeech=function(t){return f("speech",t)},e.toSemantic=function(t){return f("semantic",t)},e.toJson=function(t){return f("json",t)},e.toDescription=function(t){return f("description",t)},e.toEnriched=function(t){return f("enriched",t)},e.number=function(t){return f("number",t)},e.ordinal=function(t){return f("ordinal",t)},e.numericOrdinal=function(t){return f("numericOrdinal",t)},e.vulgar=function(t){return f("vulgar",t)},e.file={},e.file.toSpeech=function(t,e){return d("speech",t,e)},e.file.toSemantic=function(t,e){return d("semantic",t,e)},e.file.toJson=function(t,e){return d("json",t,e)},e.file.toDescription=function(t,e){return d("description",t,e)},e.file.toEnriched=function(t,e){return d("enriched",t,e)},e.processFile=d,e.walk=function(t){return l.output("walker",t)},e.move=function(t){return l.keypress("move",t)},e.exit=function(t){const e=t||0;o.EnginePromise.getall().then((()=>process.exit(e)))},e.localePath=a.localePath,c.default.documentSupported?h({mode:s.Mode.HTTP}).then((()=>h({}))):h({mode:s.Mode.SYNC}).then((()=>h({mode:s.Mode.ASYNC})))},2315:function(__unused_webpack_module,exports,__webpack_require__){var __dirname="/";Object.defineProperty(exports,"__esModule",{value:!0});const variables_1=__webpack_require__(1377);class SystemExternal{static extRequire(library){if("undefined"!=typeof process){const nodeRequire=eval("require");return nodeRequire(library)}return null}}exports.default=SystemExternal,SystemExternal.windowSupported=!("undefined"==typeof window),SystemExternal.documentSupported=SystemExternal.windowSupported&&!(void 0===window.document),SystemExternal.xmldom=SystemExternal.documentSupported?window:SystemExternal.extRequire("xmldom-sre"),SystemExternal.document=SystemExternal.documentSupported?window.document:(new SystemExternal.xmldom.DOMImplementation).createDocument("","",0),SystemExternal.xpath=SystemExternal.documentSupported?document:function(){const t={document:{},XPathResult:{}};return SystemExternal.extRequire("wicked-good-xpath").install(t),t.document.XPathResult=t.XPathResult,t.document}(),SystemExternal.mathmapsIePath="https://cdn.jsdelivr.net/npm/sre-mathmaps-ie@"+variables_1.Variables.VERSION+"mathmaps_ie.js",SystemExternal.commander=SystemExternal.documentSupported?null:SystemExternal.extRequire("commander"),SystemExternal.fs=SystemExternal.documentSupported?null:SystemExternal.extRequire("fs"),SystemExternal.url=variables_1.Variables.url,SystemExternal.jsonPath=(SystemExternal.documentSupported?SystemExternal.url:process.env.SRE_JSON_PATH||__webpack_require__.g.SRE_JSON_PATH||__dirname+"/mathmaps")+"/",SystemExternal.WGXpath=variables_1.Variables.WGXpath,SystemExternal.wgxpath=null},1377:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Variables=void 0;class r{static ensureLocale(t,e){return r.LOCALES.get(t)?t:(console.error(`Locale ${t} does not exist! Using ${r.LOCALES.get(e)} instead.`),e)}}e.Variables=r,r.VERSION="4.0.6",r.LOCALES=new Map([["ca","Catalan"],["da","Danish"],["de","German"],["en","English"],["es","Spanish"],["fr","French"],["hi","Hindi"],["it","Italian"],["nb","Bokm\xe5l"],["nn","Nynorsk"],["sv","Swedish"],["nemeth","Nemeth"]]),r.mathjaxVersion="3.2.1",r.url="https://cdn.jsdelivr.net/npm/speech-rule-engine@"+r.VERSION+"/lib/mathmaps",r.WGXpath="https://cdn.jsdelivr.net/npm/wicked-good-xpath@1.3.0/dist/wgxpath.install.js"},5274:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.updateEvaluator=e.evaluateString=e.evaluateBoolean=e.getLeafNodes=e.evalXPath=e.resolveNameSpace=e.xpath=void 0;const n=r(5897),o=r(4440),i=r(2315);function s(){return"undefined"!=typeof XPathResult}e.xpath={currentDocument:null,evaluate:s()?document.evaluate:i.default.xpath.evaluate,result:s()?XPathResult:i.default.xpath.XPathResult,createNSResolver:s()?document.createNSResolver:i.default.xpath.createNSResolver};const a={xhtml:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",mml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function l(t){return a[t]||null}e.resolveNameSpace=l;class c{constructor(){this.lookupNamespaceURI=l}}function u(t,r,i){return n.default.getInstance().mode!==o.Mode.HTTP||n.default.getInstance().isIE||n.default.getInstance().isEdge?e.xpath.evaluate(t,r,new c,i,null):e.xpath.currentDocument.evaluate(t,r,l,i,null)}function p(t,r){let n;try{n=u(t,r,e.xpath.result.ORDERED_NODE_ITERATOR_TYPE)}catch(t){return[]}const o=[];for(let t=n.iterateNext();t;t=n.iterateNext())o.push(t);return o}e.evalXPath=p,e.getLeafNodes=function(t){return p(".//*[count(*)=0]",t)},e.evaluateBoolean=function(t,r){let n;try{n=u(t,r,e.xpath.result.BOOLEAN_TYPE)}catch(t){return!1}return n.booleanValue},e.evaluateString=function(t,r){let n;try{n=u(t,r,e.xpath.result.STRING_TYPE)}catch(t){return""}return n.stringValue},e.updateEvaluator=function(t){if(n.default.getInstance().mode!==o.Mode.HTTP)return;let r=t;for(;r&&!r.evaluate;)r=r.parentNode;r&&r.evaluate?e.xpath.currentDocument=r:t.ownerDocument&&(e.xpath.currentDocument=t.ownerDocument)}},9268:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEnrichCase=void 0;e.AbstractEnrichCase=class{constructor(t){this.semantic=t}}},6061:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseBinomial=void 0;const n=r(5740),o=r(9268),i=r(5452),s=r(2298);class a extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return!t.mathmlTree&&"line"===t.type&&"binomial"===t.role}getMathml(){if(!this.semantic.childNodes.length)return this.mml;const t=this.semantic.childNodes[0];if(this.mml=(0,i.walkTree)(t),this.mml.hasAttribute(s.Attribute.TYPE)){const t=n.createElement("mrow");t.setAttribute(s.Attribute.ADDED,"true"),n.replaceNode(this.mml,t),t.appendChild(this.mml),this.mml=t}return(0,s.setAttributes)(this.mml,this.semantic),this.mml}}e.CaseBinomial=a},5765:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseDoubleScript=void 0;const n=r(5740),o=r(9268),i=r(5452),s=r(2298);class a extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){if(!t.mathmlTree||!t.childNodes.length)return!1;const e=n.tagName(t.mathmlTree),r=t.childNodes[0].role;return"MSUBSUP"===e&&"subsup"===r||"MUNDEROVER"===e&&"underover"===r}getMathml(){const t=this.semantic.childNodes[0],e=t.childNodes[0],r=this.semantic.childNodes[1],n=t.childNodes[1],o=i.walkTree(r),a=i.walkTree(e),l=i.walkTree(n);return(0,s.setAttributes)(this.mml,this.semantic),this.mml.setAttribute(s.Attribute.CHILDREN,(0,s.makeIdList)([e,n,r])),[a,l,o].forEach((t=>i.getInnerNode(t).setAttribute(s.Attribute.PARENT,this.mml.getAttribute(s.Attribute.ID)))),this.mml.setAttribute(s.Attribute.TYPE,t.role),i.addCollapsedAttribute(this.mml,[this.semantic.id,[t.id,e.id,n.id],r.id]),this.mml}}e.CaseDoubleScript=a},7251:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseEmbellished=void 0;const n=r(5740),o=r(5952),i=r(9268),s=r(5765),a=r(7014),l=r(6887),c=r(5452),u=r(2298);class p extends i.AbstractEnrichCase{constructor(t){super(t),this.fenced=null,this.fencedMml=null,this.fencedMmlNodes=[],this.ofence=null,this.ofenceMml=null,this.ofenceMap={},this.cfence=null,this.cfenceMml=null,this.cfenceMap={},this.parentCleanup=[]}static test(t){return!(!t.mathmlTree||!t.fencePointer||t.mathmlTree.getAttribute("data-semantic-type"))}static makeEmptyNode_(t){const e=n.createElement("mrow"),r=new o.SemanticNode(t);return r.type="empty",r.mathmlTree=e,r}static fencedMap_(t,e){e[t.id]=t.mathmlTree,t.embellished&&p.fencedMap_(t.childNodes[0],e)}getMathml(){this.getFenced_(),this.fencedMml=c.walkTree(this.fenced),this.getFencesMml_(),"empty"!==this.fenced.type||this.fencedMml.parentNode||(this.fencedMml.setAttribute(u.Attribute.ADDED,"true"),this.cfenceMml.parentNode.insertBefore(this.fencedMml,this.cfenceMml)),this.getFencedMml_();return this.rewrite_()}fencedElement(t){return"fenced"===t.type||"matrix"===t.type||"vector"===t.type}getFenced_(){let t=this.semantic;for(;!this.fencedElement(t);)t=t.childNodes[0];this.fenced=t.childNodes[0],this.ofence=t.contentNodes[0],this.cfence=t.contentNodes[1],p.fencedMap_(this.ofence,this.ofenceMap),p.fencedMap_(this.cfence,this.cfenceMap)}getFencedMml_(){let t=this.ofenceMml.nextSibling;for(t=t===this.fencedMml?t:this.fencedMml;t&&t!==this.cfenceMml;)this.fencedMmlNodes.push(t),t=t.nextSibling}getFencesMml_(){let t=this.semantic;const e=Object.keys(this.ofenceMap),r=Object.keys(this.cfenceMap);for(;!(this.ofenceMml&&this.cfenceMml||t===this.fenced);)-1===e.indexOf(t.fencePointer)||this.ofenceMml||(this.ofenceMml=t.mathmlTree),-1===r.indexOf(t.fencePointer)||this.cfenceMml||(this.cfenceMml=t.mathmlTree),t=t.childNodes[0];this.ofenceMml||(this.ofenceMml=this.ofence.mathmlTree),this.cfenceMml||(this.cfenceMml=this.cfence.mathmlTree),this.ofenceMml&&(this.ofenceMml=c.ascendNewNode(this.ofenceMml)),this.cfenceMml&&(this.cfenceMml=c.ascendNewNode(this.cfenceMml))}rewrite_(){let t=this.semantic,e=null;const r=this.introduceNewLayer_();for((0,u.setAttributes)(r,this.fenced.parent);!this.fencedElement(t);){const o=t.mathmlTree,i=this.specialCase_(t,o);if(i)t=i;else{(0,u.setAttributes)(o,t);const e=[];for(let r,n=1;r=t.childNodes[n];n++)e.push(c.walkTree(r));t=t.childNodes[0]}const s=n.createElement("dummy"),a=o.childNodes[0];n.replaceNode(o,s),n.replaceNode(r,o),n.replaceNode(o.childNodes[0],r),n.replaceNode(s,a),e||(e=o)}return c.walkTree(this.ofence),c.walkTree(this.cfence),this.cleanupParents_(),e||r}specialCase_(t,e){const r=n.tagName(e);let o,i=null;if("MSUBSUP"===r?(i=t.childNodes[0],o=s.CaseDoubleScript):"MMULTISCRIPTS"===r&&("superscript"===t.type||"subscript"===t.type?o=a.CaseMultiscripts:"tensor"===t.type&&(o=l.CaseTensor),i=o&&t.childNodes[0]&&"subsup"===t.childNodes[0].role?t.childNodes[0]:t),!i)return null;const c=i.childNodes[0],u=p.makeEmptyNode_(c.id);return i.childNodes[0]=u,e=new o(t).getMathml(),i.childNodes[0]=c,this.parentCleanup.push(e),i.childNodes[0]}introduceNewLayer_(){const t=this.fullFence(this.ofenceMml),e=this.fullFence(this.cfenceMml);let r=n.createElement("mrow");if(n.replaceNode(this.fencedMml,r),this.fencedMmlNodes.forEach((t=>r.appendChild(t))),r.insertBefore(t,this.fencedMml),r.appendChild(e),!r.parentNode){const t=n.createElement("mrow");for(;r.childNodes.length>0;)t.appendChild(r.childNodes[0]);r.appendChild(t),r=t}return r}fullFence(t){const e=this.fencedMml.parentNode;let r=t;for(;r.parentNode&&r.parentNode!==e;)r=r.parentNode;return r}cleanupParents_(){this.parentCleanup.forEach((function(t){const e=t.childNodes[1].getAttribute(u.Attribute.PARENT);t.childNodes[0].setAttribute(u.Attribute.PARENT,e)}))}}e.CaseEmbellished=p},6265:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseLimit=void 0;const n=r(5740),o=r(9268),i=r(5452),s=r(2298);class a extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){if(!t.mathmlTree||!t.childNodes.length)return!1;const e=n.tagName(t.mathmlTree),r=t.type;return("limupper"===r||"limlower"===r)&&("MSUBSUP"===e||"MUNDEROVER"===e)||"limboth"===r&&("MSUB"===e||"MUNDER"===e||"MSUP"===e||"MOVER"===e)}static walkTree_(t){t&&i.walkTree(t)}getMathml(){const t=this.semantic.childNodes;return"limboth"!==this.semantic.type&&this.mml.childNodes.length>=3&&(this.mml=i.introduceNewLayer([this.mml],this.semantic)),(0,s.setAttributes)(this.mml,this.semantic),t[0].mathmlTree||(t[0].mathmlTree=this.semantic.mathmlTree),t.forEach(a.walkTree_),this.mml}}e.CaseLimit=a},6514:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseLine=void 0;const n=r(9268),o=r(5452),i=r(2298);class s extends n.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return!!t.mathmlTree&&"line"===t.type}getMathml(){return this.semantic.contentNodes.length&&o.walkTree(this.semantic.contentNodes[0]),this.semantic.childNodes.length&&o.walkTree(this.semantic.childNodes[0]),(0,i.setAttributes)(this.mml,this.semantic),this.mml}}e.CaseLine=s},6839:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseMultiindex=void 0;const n=r(5740),o=r(9268),i=r(5452),s=r(2298);class a extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static multiscriptIndex(t){return"punctuated"===t.type&&"dummy"===t.contentNodes[0].role?i.collapsePunctuated(t):(i.walkTree(t),t.id)}static createNone_(t){const e=n.createElement("none");return t&&(0,s.setAttributes)(e,t),e.setAttribute(s.Attribute.ADDED,"true"),e}completeMultiscript(t,e){const r=n.toArray(this.mml.childNodes).slice(1);let o=0;const l=t=>{for(let e,n=0;e=t[n];n++){const t=r[o];if(t&&e===parseInt(i.getInnerNode(t).getAttribute(s.Attribute.ID)))i.getInnerNode(t).setAttribute(s.Attribute.PARENT,this.semantic.id.toString()),o++;else{const r=this.semantic.querySelectorAll((t=>t.id===e));this.mml.insertBefore(a.createNone_(r[0]),t||null)}}};l(t),r[o]&&"MPRESCRIPTS"!==n.tagName(r[o])?this.mml.insertBefore(r[o],n.createElement("mprescripts")):o++,l(e)}}e.CaseMultiindex=a},7014:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseMultiscripts=void 0;const n=r(5740),o=r(5656),i=r(6839),s=r(5452),a=r(2298);class l extends i.CaseMultiindex{static test(t){if(!t.mathmlTree)return!1;return"MMULTISCRIPTS"===n.tagName(t.mathmlTree)&&("superscript"===t.type||"subscript"===t.type)}constructor(t){super(t)}getMathml(){let t,e,r;if((0,a.setAttributes)(this.mml,this.semantic),this.semantic.childNodes[0]&&"subsup"===this.semantic.childNodes[0].role){const n=this.semantic.childNodes[0];t=n.childNodes[0],e=i.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[1]),r=i.CaseMultiindex.multiscriptIndex(n.childNodes[1]);const l=[this.semantic.id,[n.id,t.id,r],e];s.addCollapsedAttribute(this.mml,l),this.mml.setAttribute(a.Attribute.TYPE,n.role),this.completeMultiscript(o.SemanticSkeleton.interleaveIds(r,e),[])}else{t=this.semantic.childNodes[0],e=i.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[1]);const r=[this.semantic.id,t.id,e];s.addCollapsedAttribute(this.mml,r)}const n=o.SemanticSkeleton.collapsedLeafs(r||[],e),l=s.walkTree(t);return s.getInnerNode(l).setAttribute(a.Attribute.PARENT,this.semantic.id.toString()),n.unshift(t.id),this.mml.setAttribute(a.Attribute.CHILDREN,n.join(",")),this.mml}}e.CaseMultiscripts=l},3416:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseProof=void 0;const n=r(9268),o=r(5452),i=r(2298);class s extends n.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return!!t.mathmlTree&&("inference"===t.type||"premises"===t.type)}getMathml(){return this.semantic.childNodes.length?(this.semantic.contentNodes.forEach((function(t){o.walkTree(t),(0,i.setAttributes)(t.mathmlTree,t)})),this.semantic.childNodes.forEach((function(t){o.walkTree(t)})),(0,i.setAttributes)(this.mml,this.semantic),this.mml.getAttribute("data-semantic-id")===this.mml.getAttribute("data-semantic-parent")&&this.mml.removeAttribute("data-semantic-parent"),this.mml):this.mml}}e.CaseProof=s},5699:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseTable=void 0;const n=r(5740),o=r(9268),i=r(5452),s=r(2298);class a extends o.AbstractEnrichCase{constructor(t){super(t),this.inner=[],this.mml=t.mathmlTree}static test(t){return"matrix"===t.type||"vector"===t.type||"cases"===t.type}getMathml(){const t=i.cloneContentNode(this.semantic.contentNodes[0]),e=this.semantic.contentNodes[1]?i.cloneContentNode(this.semantic.contentNodes[1]):null;if(this.inner=this.semantic.childNodes.map(i.walkTree),this.mml)if("MFENCED"===n.tagName(this.mml)){const r=this.mml.childNodes;this.mml.insertBefore(t,r[0]||null),e&&this.mml.appendChild(e),this.mml=i.rewriteMfenced(this.mml)}else{const r=[t,this.mml];e&&r.push(e),this.mml=i.introduceNewLayer(r,this.semantic)}else this.mml=i.introduceNewLayer([t].concat(this.inner,[e]),this.semantic);return(0,s.setAttributes)(this.mml,this.semantic),this.mml}}e.CaseTable=a},6887:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseTensor=void 0;const n=r(5656),o=r(6839),i=r(5452),s=r(2298);class a extends o.CaseMultiindex{static test(t){return!!t.mathmlTree&&"tensor"===t.type}constructor(t){super(t)}getMathml(){i.walkTree(this.semantic.childNodes[0]);const t=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[1]),e=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[2]),r=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[3]),a=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[4]);(0,s.setAttributes)(this.mml,this.semantic);const l=[this.semantic.id,this.semantic.childNodes[0].id,t,e,r,a];i.addCollapsedAttribute(this.mml,l);const c=n.SemanticSkeleton.collapsedLeafs(t,e,r,a);return c.unshift(this.semantic.childNodes[0].id),this.mml.setAttribute(s.Attribute.CHILDREN,c.join(",")),this.completeMultiscript(n.SemanticSkeleton.interleaveIds(r,a),n.SemanticSkeleton.interleaveIds(t,e)),this.mml}}e.CaseTensor=a},9236:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseText=void 0;const n=r(9268),o=r(5452),i=r(2298);class s extends n.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return"punctuated"===t.type&&("text"===t.role||t.contentNodes.every((t=>"dummy"===t.role)))}getMathml(){const t=[],e=o.collapsePunctuated(this.semantic,t);return this.mml=o.introduceNewLayer(t,this.semantic),(0,i.setAttributes)(this.mml,this.semantic),this.mml.removeAttribute(i.Attribute.CONTENT),o.addCollapsedAttribute(this.mml,e),this.mml}}e.CaseText=s},5714:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.prepareMmlString=e.testTranslation__=e.semanticMathml=e.semanticMathmlSync=e.semanticMathmlNode=void 0;const n=r(2057),o=r(5740),i=r(5897),s=r(1414),a=r(5452),l=r(2298);function c(t){const e=o.cloneNode(t),r=s.getTree(e);return a.enrich(e,r)}function u(t){return c(o.parseInput(t))}function p(t){return t.match(/^<math/)||(t="<math>"+t),t.match(/\/math>$/)||(t+="</math>"),t}r(1513),e.semanticMathmlNode=c,e.semanticMathmlSync=u,e.semanticMathml=function(t,e){i.EnginePromise.getall().then((()=>{const r=o.parseInput(t);e(c(r))}))},e.testTranslation__=function(t){n.Debugger.getInstance().init();const e=u(p(t)).toString();return(0,l.removeAttributePrefix)(e),n.Debugger.getInstance().exit(),e},e.prepareMmlString=p},2298:function(t,e){var r;function n(t){return t.map((function(t){return t.id})).join(",")}function o(t,e){const n=[];"mglyph"===e.role&&n.push("image"),e.attributes.href&&n.push("link"),n.length&&t.setAttribute(r.POSTFIX,n.join(" "))}Object.defineProperty(e,"__esModule",{value:!0}),e.addPrefix=e.removeAttributePrefix=e.setPostfix=e.setAttributes=e.makeIdList=e.EnrichAttributes=e.Attribute=e.Prefix=void 0,e.Prefix="data-semantic-",function(t){t.ADDED="data-semantic-added",t.ALTERNATIVE="data-semantic-alternative",t.CHILDREN="data-semantic-children",t.COLLAPSED="data-semantic-collapsed",t.CONTENT="data-semantic-content",t.EMBELLISHED="data-semantic-embellished",t.FENCEPOINTER="data-semantic-fencepointer",t.FONT="data-semantic-font",t.ID="data-semantic-id",t.ANNOTATION="data-semantic-annotation",t.OPERATOR="data-semantic-operator",t.OWNS="data-semantic-owns",t.PARENT="data-semantic-parent",t.POSTFIX="data-semantic-postfix",t.PREFIX="data-semantic-prefix",t.ROLE="data-semantic-role",t.SPEECH="data-semantic-speech",t.STRUCTURE="data-semantic-structure",t.TYPE="data-semantic-type"}(r=e.Attribute||(e.Attribute={})),e.EnrichAttributes=[r.ADDED,r.ALTERNATIVE,r.CHILDREN,r.COLLAPSED,r.CONTENT,r.EMBELLISHED,r.FENCEPOINTER,r.FONT,r.ID,r.ANNOTATION,r.OPERATOR,r.OWNS,r.PARENT,r.POSTFIX,r.PREFIX,r.ROLE,r.SPEECH,r.STRUCTURE,r.TYPE],e.makeIdList=n,e.setAttributes=function(t,i){t.setAttribute(r.TYPE,i.type);const s=i.allAttributes();for(let r,n=0;r=s[n];n++)t.setAttribute(e.Prefix+r[0].toLowerCase(),r[1]);i.childNodes.length&&t.setAttribute(r.CHILDREN,n(i.childNodes)),i.contentNodes.length&&t.setAttribute(r.CONTENT,n(i.contentNodes)),i.parent&&t.setAttribute(r.PARENT,i.parent.id.toString()),o(t,i)},e.setPostfix=o,e.removeAttributePrefix=function(t){return t.toString().replace(new RegExp(e.Prefix,"g"),"")},e.addPrefix=function(t){return e.Prefix+t}},3532:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.factory=e.getCase=void 0,e.getCase=function(t){for(let r,n=0;r=e.factory[n];n++)if(r.test(t))return r.constr(t);return null},e.factory=[]},1513:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(6061),o=r(5765),i=r(7251),s=r(6265),a=r(6514),l=r(7014),c=r(3416),u=r(5699),p=r(6887),h=r(9236);r(3532).factory.push({test:s.CaseLimit.test,constr:t=>new s.CaseLimit(t)},{test:i.CaseEmbellished.test,constr:t=>new i.CaseEmbellished(t)},{test:o.CaseDoubleScript.test,constr:t=>new o.CaseDoubleScript(t)},{test:p.CaseTensor.test,constr:t=>new p.CaseTensor(t)},{test:l.CaseMultiscripts.test,constr:t=>new l.CaseMultiscripts(t)},{test:a.CaseLine.test,constr:t=>new a.CaseLine(t)},{test:n.CaseBinomial.test,constr:t=>new n.CaseBinomial(t)},{test:c.CaseProof.test,constr:t=>new c.CaseProof(t)},{test:u.CaseTable.test,constr:t=>new u.CaseTable(t)},{test:h.CaseText.test,constr:t=>new h.CaseText(t)})},5452:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.printNodeList__=e.collapsePunctuated=e.formattedOutput_=e.formattedOutput=e.getInnerNode=e.setOperatorAttribute_=e.createInvisibleOperator_=e.rewriteMfenced=e.cloneContentNode=e.addCollapsedAttribute=e.parentNode_=e.isIgnorable_=e.unitChild_=e.descendNode_=e.ascendNewNode=e.validLca_=e.pathToRoot_=e.attachedElement_=e.prunePath_=e.mathmlLca_=e.lcaType=e.functionApplication_=e.isDescendant_=e.insertNewChild_=e.mergeChildren_=e.collectChildNodes_=e.collateChildNodes_=e.childrenSubset_=e.moveSemanticAttributes_=e.introduceLayerAboveLca=e.introduceNewLayer=e.walkTree=e.enrich=e.SETTINGS=void 0;const n=r(2057),o=r(5740),i=r(5897),s=r(3588),a=r(7516),l=r(5656),c=r(4795),u=r(2298),p=r(3532);function h(t){const e=(0,p.getCase)(t);let r;if(e)return r=e.getMathml(),N(r);if(1===t.mathml.length)return n.Debugger.getInstance().output("Walktree Case 0"),r=t.mathml[0],u.setAttributes(r,t),t.childNodes.length&&(n.Debugger.getInstance().output("Walktree Case 0.1"),t.childNodes.forEach((function(t){"empty"===t.type&&r.appendChild(h(t))}))),N(r);const o=t.contentNodes.map(R);B(t,o);const i=t.childNodes.map(h),s=l.SemanticSkeleton.combineContentChildren(t,o,i);if(r=t.mathmlTree,null===r)n.Debugger.getInstance().output("Walktree Case 1"),r=f(s,t);else{const t=A(s);n.Debugger.getInstance().output("Walktree Case 2"),t?(n.Debugger.getInstance().output("Walktree Case 2.1"),r=t.parentNode):(n.Debugger.getInstance().output("Walktree Case 2.2"),r=D(r))}return r=k(r),v(r,s,t),u.setAttributes(r,t),N(r)}function f(t,e){const r=x(t);let i=r.node;const s=r.type;if(s!==M.VALID||!c.hasEmptyTag(i))if(n.Debugger.getInstance().output("Walktree Case 1.1"),i=o.createElement("mrow"),s===M.PRUNED)n.Debugger.getInstance().output("Walktree Case 1.1.0"),i=d(i,r.node,t);else if(t[0]){n.Debugger.getInstance().output("Walktree Case 1.1.1");const e=A(t),r=y(e.parentNode,t);o.replaceNode(e,i),r.forEach((function(t){i.appendChild(t)}))}return e.mathmlTree||(e.mathmlTree=i),i}function d(t,e,r){let i=w(e);if(c.hasMathTag(i)){n.Debugger.getInstance().output("Walktree Case 1.1.0.0"),m(i,t),o.toArray(i.childNodes).forEach((function(e){t.appendChild(e)}));const e=t;t=i,i=e}const s=r.indexOf(e);return r[s]=i,o.replaceNode(i,t),t.appendChild(i),r.forEach((function(e){t.appendChild(e)})),t}function m(t,e){for(const r of u.EnrichAttributes)t.hasAttribute(r)&&(e.setAttribute(r,t.getAttribute(r)),t.removeAttribute(r))}function y(t,e){const r=o.toArray(t.childNodes);let n=1/0,i=-1/0;return e.forEach((function(t){const e=r.indexOf(t);-1!==e&&(n=Math.min(n,e),i=Math.max(i,e))})),r.slice(n,i+1)}function g(t,e,r){const n=[];let i=o.toArray(t.childNodes),s=!1;for(;i.length;){const t=i.shift();if(t.hasAttribute(u.Attribute.TYPE)){n.push(t);continue}const e=b(t);0!==e.length&&(1!==e.length?(s?t.setAttribute("AuxiliaryImplicit",!0):s=!0,i=e.concat(i)):n.push(t))}const a=[],l=r.childNodes.map((function(t){return t.mathmlTree}));for(;l.length;){const t=l.pop();if(t){if(-1!==n.indexOf(t))break;-1!==e.indexOf(t)&&a.unshift(t)}}return n.concat(a)}function b(t){const e=[];let r=o.toArray(t.childNodes);for(;r.length;){const t=r.shift();t.nodeType===o.NodeType.ELEMENT_NODE&&(t.hasAttribute(u.Attribute.TYPE)?e.push(t):r=o.toArray(t.childNodes).concat(r))}return e}function v(t,e,r){const n="implicit"===r.role&&a.flags.combine_juxtaposition?g(t,e,r):o.toArray(t.childNodes);if(!n.length)return void e.forEach((function(e){t.appendChild(e)}));let i=0;for(;e.length;){const r=e[0];n[i]===r||O(n[i],r)?(e.shift(),i++):n[i]&&-1===e.indexOf(n[i])?i++:(S(r,t)||_(t,n[i],r),e.shift())}}function _(t,e,r){if(!e)return void t.insertBefore(r,null);let n=e,o=P(n);for(;o&&o.firstChild===n&&!n.hasAttribute("AuxiliaryImplicit")&&o!==t;)n=o,o=P(n);o&&(o.insertBefore(r,n),n.removeAttribute("AuxiliaryImplicit"))}function S(t,e){if(!t)return!1;do{if((t=t.parentNode)===e)return!0}while(t);return!1}function O(t,e){const r=s.functionApplication();if(t&&e&&t.textContent&&e.textContent&&t.textContent===r&&e.textContent===r&&"true"===e.getAttribute(u.Attribute.ADDED)){for(let r,n=0;r=t.attributes[n];n++)e.hasAttribute(r.nodeName)||e.setAttribute(r.nodeName,r.nodeValue);return o.replaceNode(t,e),!0}return!1}var M;function x(t){const e=A(t);if(!e)return{type:M.INVALID,node:null};const r=A(t.slice().reverse());if(e===r)return{type:M.VALID,node:e};const n=C(e),o=E(n,t),i=C(r,(function(t){return-1!==o.indexOf(t)})),s=i[0],a=o.indexOf(s);return-1===a?{type:M.INVALID,node:null}:{type:o.length!==n.length?M.PRUNED:T(o[a+1],i[1])?M.VALID:M.INVALID,node:s}}function E(t,e){let r=0;for(;t[r]&&-1===e.indexOf(t[r]);)r++;return t.slice(0,r+1)}function A(t){let e=0,r=null;for(;!r&&e<t.length;)t[e].parentNode&&(r=t[e]),e++;return r}function C(t,e){const r=e||(t=>!1),n=[t];for(;!r(t)&&!c.hasMathTag(t)&&t.parentNode;)t=P(t),n.unshift(t);return n}function T(t,e){return!(!t||!e||t.previousSibling||e.nextSibling)}function N(t){for(;!c.hasMathTag(t)&&L(t);)t=P(t);return t}function w(t){const e=o.toArray(t.childNodes);if(!e)return t;const r=e.filter((function(t){return t.nodeType===o.NodeType.ELEMENT_NODE&&!c.hasIgnoreTag(t)}));return 1===r.length&&c.hasEmptyTag(r[0])&&!r[0].hasAttribute(u.Attribute.TYPE)?w(r[0]):t}function L(t){const e=P(t);return!(!e||!c.hasEmptyTag(e))&&o.toArray(e.childNodes).every((function(e){return e===t||I(e)}))}function I(t){if(t.nodeType!==o.NodeType.ELEMENT_NODE)return!0;if(!t||c.hasIgnoreTag(t))return!0;const e=o.toArray(t.childNodes);return!(!c.hasEmptyTag(t)&&e.length||c.hasDisplayTag(t)||t.hasAttribute(u.Attribute.TYPE)||c.isOrphanedGlyph(t))&&o.toArray(t.childNodes).every(I)}function P(t){return t.parentNode}function R(t){if(t.mathml.length)return h(t);const r=e.SETTINGS.implicit?j(t):o.createElement("mrow");return t.mathml=[r],r}function k(t){if("MFENCED"!==o.tagName(t))return t;const e=o.createElement("mrow");for(let r,n=0;r=t.attributes[n];n++)-1===["open","close","separators"].indexOf(r.name)&&e.setAttribute(r.name,r.value);return o.toArray(t.childNodes).forEach((function(t){e.appendChild(t)})),o.replaceNode(t,e),e}function j(t){const e=o.createElement("mo"),r=o.createTextNode(t.textContent);return e.appendChild(r),u.setAttributes(e,t),e.setAttribute(u.Attribute.ADDED,"true"),e}function B(t,e){const r=t.type+(t.textContent?","+t.textContent:"");e.forEach((function(t){D(t).setAttribute(u.Attribute.OPERATOR,r)}))}function D(t){const e=o.toArray(t.childNodes);if(!e)return t;const r=e.filter((function(t){return!I(t)})),n=[];for(let t,e=0;t=r[e];e++)if(c.hasEmptyTag(t)){const e=D(t);e&&e!==t&&n.push(e)}else n.push(t);return 1===n.length?n[0]:t}function F(t,e,r,n){const o=n||!1;H(t,"Original MathML",o),H(r,"Semantic Tree",o),H(e,"Semantically enriched MathML",o)}function H(t,e,r){const n=o.formatXml(t.toString());r?console.info(e+":\n```html\n"+u.removeAttributePrefix(n)+"\n```\n"):console.info(n)}e.SETTINGS={collapsed:!0,implicit:!0},e.enrich=function(t,e){const r=o.cloneNode(t);return h(e.root),i.default.getInstance().structure&&t.setAttribute(u.Attribute.STRUCTURE,l.SemanticSkeleton.fromStructure(t,e).toString()),n.Debugger.getInstance().generateOutput((function(){return F(r,t,e,!0),[]})),t},e.walkTree=h,e.introduceNewLayer=f,e.introduceLayerAboveLca=d,e.moveSemanticAttributes_=m,e.childrenSubset_=y,e.collateChildNodes_=g,e.collectChildNodes_=b,e.mergeChildren_=v,e.insertNewChild_=_,e.isDescendant_=S,e.functionApplication_=O,function(t){t.VALID="valid",t.INVALID="invalid",t.PRUNED="pruned"}(M=e.lcaType||(e.lcaType={})),e.mathmlLca_=x,e.prunePath_=E,e.attachedElement_=A,e.pathToRoot_=C,e.validLca_=T,e.ascendNewNode=N,e.descendNode_=w,e.unitChild_=L,e.isIgnorable_=I,e.parentNode_=P,e.addCollapsedAttribute=function(t,e){const r=new l.SemanticSkeleton(e);t.setAttribute(u.Attribute.COLLAPSED,r.toString())},e.cloneContentNode=R,e.rewriteMfenced=k,e.createInvisibleOperator_=j,e.setOperatorAttribute_=B,e.getInnerNode=D,e.formattedOutput=F,e.formattedOutput_=H,e.collapsePunctuated=function(t,e){const r=!!e,n=e||[],o=t.parent,i=t.contentNodes.map((function(t){return t.id}));i.unshift("c");const s=[t.id,i];for(let e,i=0;e=t.childNodes[i];i++){const t=h(e);n.push(t);const i=D(t);o&&!r&&i.setAttribute(u.Attribute.PARENT,o.id.toString()),s.push(e.id)}return s},e.printNodeList__=function(t,e){console.info(t),o.toArray(e).forEach((function(t){console.info(t.toString())})),console.info("<<<<<<<<<<<<<<<<<")}},5105:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractHighlighter=void 0;const n=r(5274),o=r(2298);class i{constructor(){this.color=null,this.mactionName="",this.currentHighlights=[]}highlight(t){this.currentHighlights.push(t.map((t=>{const e=this.highlightNode(t);return this.setHighlighted(t),e})))}highlightAll(t){const e=this.getMactionNodes(t);for(let t,r=0;t=e[r];r++)this.highlight([t])}unhighlight(){const t=this.currentHighlights.pop();t&&t.forEach((t=>{this.isHighlighted(t.node)&&(this.unhighlightNode(t),this.unsetHighlighted(t.node))}))}unhighlightAll(){for(;this.currentHighlights.length>0;)this.unhighlight()}setColor(t){this.color=t}colorString(){return this.color.rgba()}addEvents(t,e){const r=this.getMactionNodes(t);for(let t,n=0;t=r[n];n++)for(const r in e)t.addEventListener(r,e[r])}getMactionNodes(t){return Array.from(t.getElementsByClassName(this.mactionName))}isMactionNode(t){const e=t.className||t.getAttribute("class");return!!e&&!!e.match(new RegExp(this.mactionName))}isHighlighted(t){return t.hasAttribute(i.ATTR)}setHighlighted(t){t.setAttribute(i.ATTR,"true")}unsetHighlighted(t){t.removeAttribute(i.ATTR)}colorizeAll(t){n.evalXPath(`.//*[@${o.Attribute.ID}]`,t).forEach((t=>this.colorize(t)))}uncolorizeAll(t){n.evalXPath(`.//*[@${o.Attribute.ID}]`,t).forEach((t=>this.uncolorize(t)))}colorize(t){const e=(0,o.addPrefix)("foreground");t.hasAttribute(e)&&(t.setAttribute(e+"-old",t.style.color),t.style.color=t.getAttribute(e))}uncolorize(t){const e=(0,o.addPrefix)("foreground")+"-old";t.hasAttribute(e)&&(t.style.color=t.getAttribute(e))}}e.AbstractHighlighter=i,i.ATTR="sre-highlight"},6937:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ChtmlHighlighter=void 0;const n=r(933);class o extends n.CssHighlighter{constructor(){super()}isMactionNode(t){return t.tagName.toUpperCase()===this.mactionName.toUpperCase()}getMactionNodes(t){return Array.from(t.getElementsByTagName(this.mactionName))}}e.ChtmlHighlighter=o},8396:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.ContrastPicker=e.ColorPicker=void 0;const r={red:{red:255,green:0,blue:0},green:{red:0,green:255,blue:0},blue:{red:0,green:0,blue:255},yellow:{red:255,green:255,blue:0},cyan:{red:0,green:255,blue:255},magenta:{red:255,green:0,blue:255},white:{red:255,green:255,blue:255},black:{red:0,green:0,blue:0}};function n(t,e){const n=t||{color:e};let o=Object.prototype.hasOwnProperty.call(n,"color")?r[n.color]:n;return o||(o=r[e]),o.alpha=Object.prototype.hasOwnProperty.call(n,"alpha")?n.alpha:1,function(t){const e=t=>(t=Math.max(t,0),t=Math.min(255,t),Math.round(t));return t.red=e(t.red),t.green=e(t.green),t.blue=e(t.blue),t.alpha=Math.max(t.alpha,0),t.alpha=Math.min(1,t.alpha),t}(o)}class o{constructor(t,e){this.foreground=n(e,o.DEFAULT_FOREGROUND_),this.background=n(t,o.DEFAULT_BACKGROUND_)}static toHex(t){const e=t.toString(16);return 1===e.length?"0"+e:e}rgba(){const t=function(t){return"rgba("+t.red+","+t.green+","+t.blue+","+t.alpha+")"};return{background:t(this.background),foreground:t(this.foreground)}}rgb(){const t=function(t){return"rgb("+t.red+","+t.green+","+t.blue+")"};return{background:t(this.background),alphaback:this.background.alpha.toString(),foreground:t(this.foreground),alphafore:this.foreground.alpha.toString()}}hex(){const t=function(t){return"#"+o.toHex(t.red)+o.toHex(t.green)+o.toHex(t.blue)};return{background:t(this.background),alphaback:this.background.alpha.toString(),foreground:t(this.foreground),alphafore:this.foreground.alpha.toString()}}}e.ColorPicker=o,o.DEFAULT_BACKGROUND_="blue",o.DEFAULT_FOREGROUND_="black";e.ContrastPicker=class{constructor(){this.hue=10,this.sat=100,this.light=50,this.incr=50}generate(){return e=function(t,e,r){e=e>1?e/100:e,r=r>1?r/100:r;const n=(1-Math.abs(2*r-1))*e,o=n*(1-Math.abs(t/60%2-1)),i=r-n/2;let s=0,a=0,l=0;return 0<=t&&t<60?[s,a,l]=[n,o,0]:60<=t&&t<120?[s,a,l]=[o,n,0]:120<=t&&t<180?[s,a,l]=[0,n,o]:180<=t&&t<240?[s,a,l]=[0,o,n]:240<=t&&t<300?[s,a,l]=[o,0,n]:300<=t&&t<360&&([s,a,l]=[n,0,o]),{red:s+i,green:a+i,blue:l+i}}(this.hue,this.sat,this.light),"rgb("+(t={red:Math.round(255*e.red),green:Math.round(255*e.green),blue:Math.round(255*e.blue)}).red+","+t.green+","+t.blue+")";var t,e}increment(){this.hue=(this.hue+this.incr)%360}}},933:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CssHighlighter=void 0;const n=r(5105);class o extends n.AbstractHighlighter{constructor(){super(),this.mactionName="mjx-maction"}highlightNode(t){const e={node:t,background:t.style.backgroundColor,foreground:t.style.color},r=this.colorString();return t.style.backgroundColor=r.background,t.style.color=r.foreground,e}unhighlightNode(t){t.node.style.backgroundColor=t.background,t.node.style.color=t.foreground}}e.CssHighlighter=o},3090:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.highlighterMapping_=e.addEvents=e.highlighter=void 0;const n=r(6937),o=r(8396),i=r(933),s=r(2598),a=r(4500),l=r(7071),c=r(4346),u=r(2222);e.highlighter=function(t,r,n){const i=new o.ColorPicker(t,r),s="NativeMML"===n.renderer&&"Safari"===n.browser?"MML-CSS":"SVG"===n.renderer&&"v3"===n.browser?"SVG-V3":n.renderer,a=new(e.highlighterMapping_[s]||e.highlighterMapping_.NativeMML);return a.setColor(i),a},e.addEvents=function(t,r,n){const o=e.highlighterMapping_[n.renderer];o&&(new o).addEvents(t,r)},e.highlighterMapping_={SVG:c.SvgHighlighter,"SVG-V3":u.SvgV3Highlighter,NativeMML:l.MmlHighlighter,"HTML-CSS":s.HtmlHighlighter,"MML-CSS":a.MmlCssHighlighter,CommonHTML:i.CssHighlighter,CHTML:n.ChtmlHighlighter}},2598:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.HtmlHighlighter=void 0;const n=r(5740),o=r(5105);class i extends o.AbstractHighlighter{constructor(){super(),this.mactionName="maction"}highlightNode(t){const e={node:t,foreground:t.style.color,position:t.style.position},r=this.color.rgb();t.style.color=r.foreground,t.style.position="relative";const o=t.bbox;if(o&&o.w){const i=.05,s=0,a=n.createElement("span"),l=parseFloat(t.style.paddingLeft||"0");a.style.backgroundColor=r.background,a.style.opacity=r.alphaback.toString(),a.style.display="inline-block",a.style.height=o.h+o.d+2*i+"em",a.style.verticalAlign=-o.d+"em",a.style.marginTop=a.style.marginBottom=-i+"em",a.style.width=o.w+2*s+"em",a.style.marginLeft=l-s+"em",a.style.marginRight=-o.w-s-l+"em",t.parentNode.insertBefore(a,t),e.box=a}return e}unhighlightNode(t){const e=t.node;e.style.color=t.foreground,e.style.position=t.position,t.box&&t.box.parentNode.removeChild(t.box)}}e.HtmlHighlighter=i},4500:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlCssHighlighter=void 0;const n=r(933);class o extends n.CssHighlighter{constructor(){super(),this.mactionName="maction"}getMactionNodes(t){return Array.from(t.getElementsByTagName(this.mactionName))}isMactionNode(t){return t.tagName===this.mactionName}}e.MmlCssHighlighter=o},7071:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlHighlighter=void 0;const n=r(5105);class o extends n.AbstractHighlighter{constructor(){super(),this.mactionName="maction"}highlightNode(t){let e=t.getAttribute("style");return e+=";background-color: "+this.colorString().background,e+=";color: "+this.colorString().foreground,t.setAttribute("style",e),{node:t}}unhighlightNode(t){let e=t.node.getAttribute("style");e=e.replace(";background-color: "+this.colorString().background,""),e=e.replace(";color: "+this.colorString().foreground,""),t.node.setAttribute("style",e)}colorString(){return this.color.rgba()}getMactionNodes(t){return Array.from(t.getElementsByTagName(this.mactionName))}isMactionNode(t){return t.tagName===this.mactionName}}e.MmlHighlighter=o},4346:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SvgHighlighter=void 0;const n=r(5740),o=r(5105);class i extends o.AbstractHighlighter{constructor(){super(),this.mactionName="mjx-svg-maction"}highlightNode(t){let e;if(this.isHighlighted(t))return e={node:t.previousSibling||t,background:t.style.backgroundColor,foreground:t.style.color},e;if("svg"===t.tagName){const e={node:t,background:t.style.backgroundColor,foreground:t.style.color};return t.style.backgroundColor=this.colorString().background,t.style.color=this.colorString().foreground,e}const r=n.createElementNS("http://www.w3.org/2000/svg","rect");let i;if("use"===t.nodeName){const e=n.createElementNS("http://www.w3.org/2000/svg","g");t.parentNode.insertBefore(e,t),e.appendChild(t),i=e.getBBox(),e.parentNode.replaceChild(t,e)}else i=t.getBBox();r.setAttribute("x",(i.x-40).toString()),r.setAttribute("y",(i.y-40).toString()),r.setAttribute("width",(i.width+80).toString()),r.setAttribute("height",(i.height+80).toString());const s=t.getAttribute("transform");return s&&r.setAttribute("transform",s),r.setAttribute("fill",this.colorString().background),r.setAttribute(o.AbstractHighlighter.ATTR,"true"),t.parentNode.insertBefore(r,t),e={node:r,foreground:t.getAttribute("fill")},t.setAttribute("fill",this.colorString().foreground),e}setHighlighted(t){"svg"===t.tagName&&super.setHighlighted(t)}unhighlightNode(t){if("background"in t)return t.node.style.backgroundColor=t.background,void(t.node.style.color=t.foreground);t.foreground?t.node.nextSibling.setAttribute("fill",t.foreground):t.node.nextSibling.removeAttribute("fill"),t.node.parentNode.removeChild(t.node)}isMactionNode(t){let e=t.className||t.getAttribute("class");return e=void 0!==e.baseVal?e.baseVal:e,!!e&&!!e.match(new RegExp(this.mactionName))}}e.SvgHighlighter=i},2222:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SvgV3Highlighter=void 0;const n=r(5740),o=r(5274),i=r(5105),s=r(8396),a=r(4346);class l extends a.SvgHighlighter{constructor(){super(),this.mactionName="maction"}highlightNode(t){let e;if(this.isHighlighted(t))return e={node:t,background:this.colorString().background,foreground:this.colorString().foreground},e;if("svg"===t.tagName||"MJX-CONTAINER"===t.tagName)return e={node:t,background:t.style.backgroundColor,foreground:t.style.color},t.style.backgroundColor=this.colorString().background,t.style.color=this.colorString().foreground,e;const r=n.createElementNS("http://www.w3.org/2000/svg","rect");r.setAttribute("sre-highlighter-added","true");const o=t.getBBox();r.setAttribute("x",(o.x-40).toString()),r.setAttribute("y",(o.y-40).toString()),r.setAttribute("width",(o.width+80).toString()),r.setAttribute("height",(o.height+80).toString());const a=t.getAttribute("transform");if(a&&r.setAttribute("transform",a),r.setAttribute("fill",this.colorString().background),t.setAttribute(i.AbstractHighlighter.ATTR,"true"),t.parentNode.insertBefore(r,t),e={node:t,foreground:t.getAttribute("fill")},"rect"===t.nodeName){const e=new s.ColorPicker({alpha:0,color:"black"});t.setAttribute("fill",e.rgba().foreground)}else t.setAttribute("fill",this.colorString().foreground);return e}unhighlightNode(t){const e=t.node.previousSibling;if(e&&e.hasAttribute("sre-highlighter-added"))return t.foreground?t.node.setAttribute("fill",t.foreground):t.node.removeAttribute("fill"),void t.node.parentNode.removeChild(e);t.node.style.backgroundColor=t.background,t.node.style.color=t.foreground}isMactionNode(t){return t.getAttribute("data-mml-node")===this.mactionName}getMactionNodes(t){return Array.from(o.evalXPath(`.//*[@data-mml-node="${this.mactionName}"]`,t))}}e.SvgV3Highlighter=l},7222:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.StaticTrieNode=e.AbstractTrieNode=void 0;const n=r(2057),o=r(4391);class i{constructor(t,e){this.constraint=t,this.test=e,this.children_={},this.kind=o.TrieNodeKind.ROOT}getConstraint(){return this.constraint}getKind(){return this.kind}applyTest(t){return this.test(t)}addChild(t){const e=t.getConstraint(),r=this.children_[e];return this.children_[e]=t,r}getChild(t){return this.children_[t]}getChildren(){const t=[];for(const e in this.children_)t.push(this.children_[e]);return t}findChildren(t){const e=[];for(const r in this.children_){const n=this.children_[r];n.applyTest(t)&&e.push(n)}return e}removeChild(t){delete this.children_[t]}toString(){return this.constraint}}e.AbstractTrieNode=i;e.StaticTrieNode=class extends i{constructor(t,e){super(t,e),this.rule_=null,this.kind=o.TrieNodeKind.STATIC}getRule(){return this.rule_}setRule(t){this.rule_&&n.Debugger.getInstance().output("Replacing rule "+this.rule_+" with "+t),this.rule_=t}toString(){return this.getRule()?this.constraint+"\n==> "+this.getRule().action:this.constraint}}},4508:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Trie=void 0;const n=r(4391),o=r(9701);class i{constructor(){this.root=(0,o.getNode)(n.TrieNodeKind.ROOT,"",null)}static collectRules_(t){const e=[];let r=[t];for(;r.length;){const t=r.shift();if(t.getKind()===n.TrieNodeKind.QUERY||t.getKind()===n.TrieNodeKind.BOOLEAN){const r=t.getRule();r&&e.unshift(r)}r=r.concat(t.getChildren())}return e}static printWithDepth_(t,e,r){r+=new Array(e+2).join(e.toString())+": "+t.toString()+"\n";const n=t.getChildren();for(let t,o=0;t=n[o];o++)r=i.printWithDepth_(t,e+1,r);return r}static order_(t){const e=t.getChildren();if(!e.length)return 0;const r=Math.max.apply(null,e.map(i.order_));return Math.max(e.length,r)}addRule(t){let e=this.root;const r=t.context,o=t.dynamicCstr.getValues();for(let t=0,i=o.length;t<i;t++)e=this.addNode_(e,o[t],n.TrieNodeKind.DYNAMIC,r);e=this.addNode_(e,t.precondition.query,n.TrieNodeKind.QUERY,r);const i=t.precondition.constraints;for(let t=0,o=i.length;t<o;t++)e=this.addNode_(e,i[t],n.TrieNodeKind.BOOLEAN,r);e.setRule(t)}lookupRules(t,e){let r=[this.root];const o=[];for(;e.length;){const t=e.shift(),o=[];for(;r.length;){r.shift().getChildren().forEach((e=>{e.getKind()===n.TrieNodeKind.DYNAMIC&&-1===t.indexOf(e.getConstraint())||o.push(e)}))}r=o.slice()}for(;r.length;){const e=r.shift();if(e.getRule){const t=e.getRule();t&&o.push(t)}const n=e.findChildren(t);r=r.concat(n)}return o}hasSubtrie(t){let e=this.root;for(let r=0,n=t.length;r<n;r++){const n=t[r];if(e=e.getChild(n),!e)return!1}return!0}toString(){return i.printWithDepth_(this.root,0,"")}collectRules(){return i.collectRules_(this.root)}order(){return i.order_(this.root)}enumerate(t){return this.enumerate_(this.root,t)}byConstraint(t){let e=this.root;for(;t.length&&e;){const r=t.shift();e=e.getChild(r)}return e||null}enumerate_(t,e){e=e||{};const r=t.getChildren();for(let t,o=0;t=r[o];o++)t.kind===n.TrieNodeKind.DYNAMIC&&(e[t.getConstraint()]=this.enumerate_(t,e[t.getConstraint()]));return e}addNode_(t,e,r,n){let i=t.getChild(e);return i||(i=(0,o.getNode)(r,e,n),t.addChild(i)),i}}e.Trie=i},4391:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.TrieNodeKind=void 0,function(t){t.ROOT="root",t.DYNAMIC="dynamic",t.QUERY="query",t.BOOLEAN="boolean",t.STATIC="static"}(e.TrieNodeKind||(e.TrieNodeKind={}))},9701:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.BooleanTrieNode=e.QueryTrieNode=e.constraintTest_=e.DynamicTrieNode=e.RootTrieNode=e.getNode=void 0;const n=r(5740),o=r(5274),i=r(2105),s=r(2780),a=r(7222),l=r(7222),c=r(4391);e.getNode=function(t,e,r){switch(t){case c.TrieNodeKind.ROOT:return new u;case c.TrieNodeKind.DYNAMIC:return new p(e);case c.TrieNodeKind.QUERY:return new d(e,r);case c.TrieNodeKind.BOOLEAN:return new m(e,r);default:return null}};class u extends a.AbstractTrieNode{constructor(){super("",(()=>!0)),this.kind=c.TrieNodeKind.ROOT}}e.RootTrieNode=u;class p extends a.AbstractTrieNode{constructor(t){super(t,(e=>e===t)),this.kind=c.TrieNodeKind.DYNAMIC}}e.DynamicTrieNode=p;const h={"=":(t,e)=>t===e,"!=":(t,e)=>t!==e,"<":(t,e)=>t<e,">":(t,e)=>t>e,"<=":(t,e)=>t<=e,">=":(t,e)=>t>=e};function f(t){if(t.match(/^self::\*$/))return t=>!0;if(t.match(/^self::\w+$/)){const e=t.slice(6).toUpperCase();return t=>t.tagName&&n.tagName(t)===e}if(t.match(/^self::\w+:\w+$/)){const e=t.split(":"),r=o.resolveNameSpace(e[2]);if(!r)return null;const n=e[3].toUpperCase();return t=>t.localName&&t.localName.toUpperCase()===n&&t.namespaceURI===r}if(t.match(/^@\w+$/)){const e=t.slice(1);return t=>t.hasAttribute&&t.hasAttribute(e)}if(t.match(/^@\w+="[\w\d ]+"$/)){const e=t.split("="),r=e[0].slice(1),n=e[1].slice(1,-1);return t=>t.hasAttribute&&t.hasAttribute(r)&&t.getAttribute(r)===n}if(t.match(/^@\w+!="[\w\d ]+"$/)){const e=t.split("!="),r=e[0].slice(1),n=e[1].slice(1,-1);return t=>!t.hasAttribute||!t.hasAttribute(r)||t.getAttribute(r)!==n}if(t.match(/^contains\(\s*@grammar\s*,\s*"[\w\d ]+"\s*\)$/)){const e=t.split('"')[1];return t=>!!i.Grammar.getInstance().getParameter(e)}if(t.match(/^not\(\s*contains\(\s*@grammar\s*,\s*"[\w\d ]+"\s*\)\s*\)$/)){const e=t.split('"')[1];return t=>!i.Grammar.getInstance().getParameter(e)}if(t.match(/^name\(\.\.\/\.\.\)="\w+"$/)){const e=t.split('"')[1].toUpperCase();return t=>{var r,o;return(null===(o=null===(r=t.parentNode)||void 0===r?void 0:r.parentNode)||void 0===o?void 0:o.tagName)&&n.tagName(t.parentNode.parentNode)===e}}if(t.match(/^count\(preceding-sibling::\*\)=\d+$/)){const e=t.split("="),r=parseInt(e[1],10);return t=>{var e;return(null===(e=t.parentNode)||void 0===e?void 0:e.childNodes[r])===t}}if(t.match(/^.+\[@category!?=".+"\]$/)){let[,e,r,n]=t.match(/^(.+)\[@category(!?=)"(.+)"\]$/);const i=n.match(/^unit:(.+)$/);let a="";return i&&(n=i[1],a=":unit"),t=>{const i=o.evalXPath(e,t)[0];if(i){const t=s.lookupCategory(i.textContent+a);return"="===r?t===n:t!==n}return!1}}if(t.match(/^string-length\(.+\)\W+\d+/)){const[,e,r,n]=t.match(/^string-length\((.+)\)(\W+)(\d+)/),i=h[r]||h["="],s=parseInt(n,10);return t=>{const r=o.evalXPath(e,t)[0];return!!r&&i(Array.from(r.textContent).length,s)}}return null}e.constraintTest_=f;class d extends l.StaticTrieNode{constructor(t,e){super(t,f(t)),this.context=e,this.kind=c.TrieNodeKind.QUERY}applyTest(t){return this.test?this.test(t):this.context.applyQuery(t,this.constraint)===t}}e.QueryTrieNode=d;class m extends l.StaticTrieNode{constructor(t,e){super(t,f(t)),this.context=e,this.kind=c.TrieNodeKind.BOOLEAN}applyTest(t){return this.test?this.test(t):this.context.applyConstraint(t,this.constraint)}}e.BooleanTrieNode=m},7491:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.completeLocale=e.getLocale=e.setLocale=e.locales=void 0;const n=r(5897),o=r(1377),i=r(2105),s=r(4249),a=r(8657),l=r(173),c=r(9393),u=r(7978),p=r(5540),h=r(5218),f=r(3887),d=r(8384),m=r(7206),y=r(7734),g=r(7264),b=r(4356);function v(){const t=o.Variables.ensureLocale(n.default.getInstance().locale,n.default.getInstance().defaultLocale);return n.default.getInstance().locale=t,e.locales[t]()}e.locales={ca:s.ca,da:a.da,de:l.de,en:c.en,es:u.es,fr:p.fr,hi:h.hi,it:f.it,nb:d.nb,nn:y.nn,sv:g.sv,nemeth:m.nemeth},e.setLocale=function(){const t=v();if(function(t){const e=n.default.getInstance().subiso;-1===t.SUBISO.all.indexOf(e)&&(n.default.getInstance().subiso=t.SUBISO.default);t.SUBISO.current=n.default.getInstance().subiso}(t),t){for(const e of Object.getOwnPropertyNames(t))b.LOCALE[e]=t[e];for(const[e,r]of Object.entries(t.CORRECTIONS))i.Grammar.getInstance().setCorrection(e,r)}},e.getLocale=v,e.completeLocale=function(t){const r=e.locales[t.locale];if(!r)return void console.error("Locale "+t.locale+" does not exist!");const n=t.kind.toUpperCase(),o=t.messages;if(!o)return;const i=r();for(const[t,e]of Object.entries(o))i[n][t]=e}},4356:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.createLocale=e.LOCALE=void 0;const n=r(7549);function o(){return{FUNCTIONS:(0,n.FUNCTIONS)(),MESSAGES:(0,n.MESSAGES)(),ALPHABETS:(0,n.ALPHABETS)(),NUMBERS:(0,n.NUMBERS)(),COMBINERS:{},CORRECTIONS:{},SUBISO:(0,n.SUBISO)()}}e.LOCALE=o(),e.createLocale=o},2536:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.localeFontCombiner=e.extractString=e.localEnclose=e.localRole=e.localFont=e.combinePostfixIndex=e.nestingToString=void 0;const n=r(4356),o=r(4977);function i(t,e){return void 0===t?e:"string"==typeof t?t:t[0]}e.nestingToString=function(t){switch(t){case 1:return n.LOCALE.MESSAGES.MS.ONCE||"";case 2:return n.LOCALE.MESSAGES.MS.TWICE;default:return t.toString()}},e.combinePostfixIndex=function(t,e){return t===n.LOCALE.MESSAGES.MS.ROOTINDEX||t===n.LOCALE.MESSAGES.MS.INDEX?t:t+" "+e},e.localFont=function(t){return i(n.LOCALE.MESSAGES.font[t],t)},e.localRole=function(t){return i(n.LOCALE.MESSAGES.role[t],t)},e.localEnclose=function(t){return i(n.LOCALE.MESSAGES.enclose[t],t)},e.extractString=i,e.localeFontCombiner=function(t){return"string"==typeof t?{font:t,combiner:n.LOCALE.ALPHABETS.combiner}:{font:t[0],combiner:n.LOCALE.COMBINERS[t[1]]||o.Combiners[t[1]]||n.LOCALE.ALPHABETS.combiner}}},4249:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ca=void 0;const n=r(4356),o=r(2536),i=r(614),s=r(4977),a=function(t,e,r){return t="sans serif "+(r?r+" "+t:t),e?t+" "+e:t};let l=null;e.ca=function(){return l||(l=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.COMBINERS.sansserif=a,t.FUNCTIONS.fracNestDepth=t=>!1,t.FUNCTIONS.combineRootIndex=o.combinePostfixIndex,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>t+r,t.FUNCTIONS.fontRegexp=t=>RegExp("^"+t+" "),t.FUNCTIONS.plural=t=>/.*os$/.test(t)?t+"sos":/.*s$/.test(t)?t+"os":/.*ga$/.test(t)?t.slice(0,-2)+"gues":/.*\xe7a$/.test(t)?t.slice(0,-2)+"ces":/.*ca$/.test(t)?t.slice(0,-2)+"ques":/.*ja$/.test(t)?t.slice(0,-2)+"ges":/.*qua$/.test(t)?t.slice(0,-3)+"q\xfces":/.*a$/.test(t)?t.slice(0,-1)+"es":/.*(e|i)$/.test(t)?t+"ns":/.*\xed$/.test(t)?t.slice(0,-1)+"ins":t+"s",t.FUNCTIONS.si=(t,e)=>(e.match(/^metre/)&&(t=t.replace(/a$/,"\xe0").replace(/o$/,"\xf2").replace(/i$/,"\xed")),t+e),t.ALPHABETS.combiner=s.Combiners.prefixCombiner,t}()),l}},8657:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.da=void 0;const n=r(4356),o=r(2536),i=r(3866),s=r(4977);let a=null;e.da=function(){return a||(a=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t.FUNCTIONS.fontRegexp=e=>e===t.ALPHABETS.capPrefix.default?RegExp("^"+e+" "):RegExp(" "+e+"$"),t.ALPHABETS.combiner=s.Combiners.postfixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t}()),a}},173:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.de=void 0;const n=r(2105),o=r(2536),i=r(4356),s=r(1435),a=function(t,e,r){return"s"===r&&(e=e.split(" ").map((function(t){return t.replace(/s$/,"")})).join(" "),r=""),t=r?r+" "+t:t,e?e+" "+t:t},l=function(t,e,r){return t=r&&"s"!==r?r+" "+t:t,e?t+" "+e:t};let c=null;e.de=function(){return c||(c=function(){const t=(0,i.createLocale)();return t.NUMBERS=s.default,t.COMBINERS.germanPostfix=l,t.ALPHABETS.combiner=a,t.FUNCTIONS.radicalNestDepth=e=>e>1?t.NUMBERS.numberToWords(e)+"fach":"",t.FUNCTIONS.combineRootIndex=(t,e)=>{const r=e?e+"wurzel":"";return t.replace("Wurzel",r)},t.FUNCTIONS.combineNestedRadical=(t,e,r)=>{const n=(e?e+" ":"")+(t=r.match(/exponent$/)?t+"r":t);return r.match(/ /)?r.replace(/ /," "+n+" "):n+" "+r},t.FUNCTIONS.fontRegexp=function(t){return t=t.split(" ").map((function(t){return t.replace(/s$/,"(|s)")})).join(" "),new RegExp("((^"+t+" )|( "+t+"$))")},t.CORRECTIONS.correctOne=t=>t.replace(/^eins$/,"ein"),t.CORRECTIONS.localFontNumber=t=>(0,o.localFont)(t).split(" ").map((function(t){return t.replace(/s$/,"")})).join(" "),t.CORRECTIONS.lowercase=t=>t.toLowerCase(),t.CORRECTIONS.article=t=>{const e=n.Grammar.getInstance().getParameter("case"),r=n.Grammar.getInstance().getParameter("plural");return"dative"===e?{der:"dem",die:r?"den":"der",das:"dem"}[t]:t},t.CORRECTIONS.masculine=t=>"dative"===n.Grammar.getInstance().getParameter("case")?t+"n":t,t}()),c}},9393:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.en=void 0;const n=r(2105),o=r(4356),i=r(2536),s=r(310),a=r(4977);let l=null;e.en=function(){return l||(l=function(){const t=(0,o.createLocale)();return t.NUMBERS=s.default,t.FUNCTIONS.radicalNestDepth=i.nestingToString,t.FUNCTIONS.plural=t=>/.*s$/.test(t)?t:t+"s",t.ALPHABETS.combiner=a.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=s.default.numberToWords,t.CORRECTIONS.article=t=>n.Grammar.getInstance().getParameter("noArticle")?"":t,t}()),l}},7978:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.es=void 0;const n=r(4356),o=r(2536),i=r(4634),s=r(4977),a=function(t,e,r){return t="sans serif "+(r?r+" "+t:t),e?t+" "+e:t};let l=null;e.es=function(){return l||(l=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.COMBINERS.sansserif=a,t.FUNCTIONS.fracNestDepth=t=>!1,t.FUNCTIONS.combineRootIndex=o.combinePostfixIndex,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>t+r,t.FUNCTIONS.fontRegexp=t=>RegExp("^"+t+" "),t.FUNCTIONS.plural=t=>/.*(a|e|i|o|u)$/.test(t)?t+"s":/.*z$/.test(t)?t.slice(0,-1)+"ces":/.*c$/.test(t)?t.slice(0,-1)+"ques":/.*g$/.test(t)?t+"ues":/.*\u00f3n$/.test(t)?t.slice(0,-2)+"ones":t+"es",t.FUNCTIONS.si=(t,e)=>(e.match(/^metro/)&&(t=t.replace(/a$/,"\xe1").replace(/o$/,"\xf3").replace(/i$/,"\xed")),t+e),t.ALPHABETS.combiner=s.Combiners.prefixCombiner,t}()),l}},5540:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.fr=void 0;const n=r(2105),o=r(4356),i=r(2536),s=r(2350),a=r(4977);let l=null;e.fr=function(){return l||(l=function(){const t=(0,o.createLocale)();return t.NUMBERS=s.default,t.FUNCTIONS.radicalNestDepth=i.nestingToString,t.FUNCTIONS.combineRootIndex=i.combinePostfixIndex,t.FUNCTIONS.combineNestedFraction=(t,e,r)=>r.replace(/ $/g,"")+e+t,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>r+" "+t,t.FUNCTIONS.fontRegexp=t=>RegExp(" (en |)"+t+"$"),t.FUNCTIONS.plural=t=>/.*s$/.test(t)?t:t+"s",t.CORRECTIONS.article=t=>n.Grammar.getInstance().getParameter("noArticle")?"":t,t.ALPHABETS.combiner=a.Combiners.romanceCombiner,t.SUBISO={default:"fr",current:"fr",all:["fr","be","ch"]},t}()),l}},5218:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.hi=void 0;const n=r(4356),o=r(4438),i=r(4977),s=r(2536);let a=null;e.hi=function(){return a||(a=function(){const t=(0,n.createLocale)();return t.NUMBERS=o.default,t.ALPHABETS.combiner=i.Combiners.prefixCombiner,t.FUNCTIONS.radicalNestDepth=s.nestingToString,t}()),a}},3887:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.it=void 0;const n=r(2536),o=r(4356),i=r(8825),s=r(4977),a=function(t,e,r){return t.match(/^[a-zA-Z]$/)&&(e=e.replace("cerchiato","cerchiata")),t=r?t+" "+r:t,e?t+" "+e:t};let l=null;e.it=function(){return l||(l=function(){const t=(0,o.createLocale)();return t.NUMBERS=i.default,t.COMBINERS.italianPostfix=a,t.FUNCTIONS.radicalNestDepth=n.nestingToString,t.FUNCTIONS.combineRootIndex=n.combinePostfixIndex,t.FUNCTIONS.combineNestedFraction=(t,e,r)=>r.replace(/ $/g,"")+e+t,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>r+" "+t,t.FUNCTIONS.fontRegexp=t=>RegExp(" (en |)"+t+"$"),t.ALPHABETS.combiner=s.Combiners.romanceCombiner,t}()),l}},8384:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.nb=void 0;const n=r(4356),o=r(2536),i=r(8274),s=r(4977);let a=null;e.nb=function(){return a||(a=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.ALPHABETS.combiner=s.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t}()),a}},7206:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.nemeth=void 0;const n=r(4356),o=r(3720),i=r(4977),s=function(t){return t.match(RegExp("^"+h.ALPHABETS.languagePrefix.english))?t.slice(1):t},a=function(t,e,r){return t=s(t),e?t+e:t},l=function(t,e,r){return e+s(t)},c=function(t,e,r){return e+(r||"")+(t=s(t))+"\u283b"},u=function(t,e,r){return e+(r||"")+(t=s(t))+"\u283b\u283b"},p=function(t,e,r){return e+(t=s(t))+"\u283e"};let h=null;e.nemeth=function(){return h||(h=function(){const t=(0,n.createLocale)();return t.NUMBERS=o.default,t.COMBINERS={postfixCombiner:a,germanCombiner:l,embellishCombiner:c,doubleEmbellishCombiner:u,parensCombiner:p},t.FUNCTIONS.fracNestDepth=t=>!1,t.FUNCTIONS.fontRegexp=t=>RegExp("^"+t),t.FUNCTIONS.si=i.identityTransformer,t.ALPHABETS.combiner=(t,e,r)=>e?e+r+t:s(t),t.ALPHABETS.digitTrans={default:o.default.numberToWords},t}()),h}},7734:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.nn=void 0;const n=r(4356),o=r(2536),i=r(8274),s=r(4977);let a=null;e.nn=function(){return a||(a=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.ALPHABETS.combiner=s.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t.SUBISO={default:"",current:"",all:["","alt"]},t}()),a}},7264:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sv=void 0;const n=r(4356),o=r(2536),i=r(3898),s=r(4977);let a=null;e.sv=function(){return a||(a=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t.FUNCTIONS.fontRegexp=function(t){return new RegExp("((^"+t+" )|( "+t+"$))")},t.ALPHABETS.combiner=s.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t.CORRECTIONS.correctOne=t=>t.replace(/^ett$/,"en"),t}()),a}},7549:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SUBISO=e.FUNCTIONS=e.ALPHABETS=e.NUMBERS=e.MESSAGES=void 0;const n=r(4977);e.MESSAGES=function(){return{MS:{},MSroots:{},font:{},embellish:{},role:{},enclose:{},navigate:{},regexp:{},unitTimes:""}},e.NUMBERS=function(){return{zero:"zero",ones:[],tens:[],large:[],special:{},wordOrdinal:n.identityTransformer,numericOrdinal:n.identityTransformer,numberToWords:n.identityTransformer,numberToOrdinal:n.pluralCase,vulgarSep:" ",numSep:" "}},e.ALPHABETS=function(){return{latinSmall:[],latinCap:[],greekSmall:[],greekCap:[],capPrefix:{default:""},smallPrefix:{default:""},digitPrefix:{default:""},languagePrefix:{},digitTrans:{default:n.identityTransformer,mathspeak:n.identityTransformer,clearspeak:n.identityTransformer},letterTrans:{default:n.identityTransformer},combiner:(t,e,r)=>t}},e.FUNCTIONS=function(){return{fracNestDepth:t=>n.vulgarFractionSmall(t,10,100),radicalNestDepth:t=>"",combineRootIndex:function(t,e){return t},combineNestedFraction:n.Combiners.identityCombiner,combineNestedRadical:n.Combiners.identityCombiner,fontRegexp:function(t){return new RegExp("^"+t.split(/ |-/).join("( |-)")+"( |-)")},si:n.siCombiner,plural:n.identityTransformer}},e.SUBISO=function(){return{default:"",current:"",all:[]}}},614:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){const e=t%1e3,r=Math.floor(e/100),n=r?1===r?"cent":a.ones[r]+"-cents":"",o=function(t){const e=t%100;if(e<20)return a.ones[e];const r=Math.floor(e/10),n=a.tens[r],o=a.ones[e%10];return n&&o?n+(2===r?"-i-":"-")+o:n||o}(e%100);return n&&o?n+a.numSep+o:n||o}function i(t){if(0===t)return a.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){const n=t%(e>1?1e6:1e3);if(n){let t=a.large[e];if(e)if(1===e)r=(1===n?"":o(n)+a.numSep)+t+(r?a.numSep+r:"");else{const e=i(n);t=1===n?t:t.replace(/\u00f3$/,"ons"),r=e+a.numSep+t+(r?a.numSep+r:"")}else r=o(n)}t=Math.floor(t/(e>1?1e6:1e3)),e++}return r}function s(t){const e=n.Grammar.getInstance().getParameter("gender");return t.toString()+("f"===e?"a":"n")}const a=(0,r(7549).NUMBERS)();a.numericOrdinal=s,a.numberToWords=i,a.numberToOrdinal=function(t,e){if(t>1999)return s(t);if(t<=10)return a.special.onesOrdinals[t-1];const r=i(t);return r.match(/mil$/)?r.replace(/mil$/,"mil\xb7l\xe8sima"):r.match(/u$/)?r.replace(/u$/,"vena"):r.match(/a$/)?r.replace(/a$/,"ena"):r+(r.match(/e$/)?"na":"ena")},e.default=a},3866:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t,e=!1){return t===a.ones[1]?e?"et":"en":t}function o(t,e=!1){let r=t%1e3,o="",i=a.ones[Math.floor(r/100)];if(o+=i?n(i,!0)+" hundrede":"",r%=100,r)if(o+=o?" og ":"",i=e?a.special.smallOrdinals[r]:a.ones[r],i)o+=i;else{const t=e?a.special.tensOrdinals[Math.floor(r/10)]:a.tens[Math.floor(r/10)];i=a.ones[r%10],o+=i?n(i)+"og"+t:t}return o}function i(t,e=!1){if(0===t)return a.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,i="";for(;t>0;){const s=t%1e3;if(s){const t=o(s,e&&!r);if(r){const e=a.large[r],o=s>1?"er":"";i=n(t,r<=1)+" "+e+o+(i?" og ":"")+i}else i=n(t)+i}t=Math.floor(t/1e3),r++}return i}function s(t){if(t%100)return i(t,!0);const e=i(t);return e.match(/e$/)?e:e+"e"}const a=(0,r(7549).NUMBERS)();a.wordOrdinal=s,a.numericOrdinal=function(t){return t.toString()+"."},a.numberToWords=i,a.numberToOrdinal=function(t,e){return 1===t?e?"hel":"hele":2===t?e?"halv":"halve":s(t)+(e?"dele":"del")},e.default=a},1435:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t,e=!1){return t===a.ones[1]?e?"eine":"ein":t}function o(t){let e=t%1e3,r="",o=a.ones[Math.floor(e/100)];if(r+=o?n(o)+"hundert":"",e%=100,e)if(r+=r?a.numSep:"",o=a.ones[e],o)r+=o;else{const t=a.tens[Math.floor(e/10)];o=a.ones[e%10],r+=o?n(o)+"und"+t:t}return r}function i(t){if(0===t)return a.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){const i=t%1e3;if(i){const s=o(t%1e3);if(e){const t=a.large[e],o=e>1&&i>1?t.match(/e$/)?"n":"en":"";r=n(s,e>1)+t+o+r}else r=n(s,e>1)+r}t=Math.floor(t/1e3),e++}return r.replace(/ein$/,"eins")}function s(t){if(1===t)return"erste";if(3===t)return"dritte";if(7===t)return"siebte";if(8===t)return"achte";return i(t)+(t<19?"te":"ste")}const a=(0,r(7549).NUMBERS)();a.wordOrdinal=s,a.numericOrdinal=function(t){return t.toString()+"."},a.numberToWords=i,a.numberToOrdinal=function(t,e){return 1===t?"eintel":2===t?e?"halbe":"halb":s(t)+"l"},e.default=a},310:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t){let e=t%1e3,r="";return r+=s.ones[Math.floor(e/100)]?s.ones[Math.floor(e/100)]+s.numSep+"hundred":"",e%=100,e&&(r+=r?s.numSep:"",r+=s.ones[e]||s.tens[Math.floor(e/10)]+(e%10?s.numSep+s.ones[e%10]:"")),r}function o(t){if(0===t)return s.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){t%1e3&&(r=n(t%1e3)+(e?"-"+s.large[e]+"-":"")+r),t=Math.floor(t/1e3),e++}return r.replace(/-$/,"")}function i(t){let e=o(t);return e.match(/one$/)?e=e.slice(0,-3)+"first":e.match(/two$/)?e=e.slice(0,-3)+"second":e.match(/three$/)?e=e.slice(0,-5)+"third":e.match(/five$/)?e=e.slice(0,-4)+"fifth":e.match(/eight$/)?e=e.slice(0,-5)+"eighth":e.match(/nine$/)?e=e.slice(0,-4)+"ninth":e.match(/twelve$/)?e=e.slice(0,-6)+"twelfth":e.match(/ty$/)?e=e.slice(0,-2)+"tieth":e+="th",e}const s=(0,r(7549).NUMBERS)();s.wordOrdinal=i,s.numericOrdinal=function(t){const e=t%100,r=t.toString();if(e>10&&e<20)return r+"th";switch(t%10){case 1:return r+"st";case 2:return r+"nd";case 3:return r+"rd";default:return r+"th"}},s.numberToWords=o,s.numberToOrdinal=function(t,e){if(1===t)return e?"oneths":"oneth";if(2===t)return e?"halves":"half";const r=i(t);return e?r+"s":r},e.default=s},4634:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){const e=t%1e3,r=Math.floor(e/100),n=i.special.hundreds[r],o=function(t){const e=t%100;if(e<30)return i.ones[e];const r=i.tens[Math.floor(e/10)],n=i.ones[e%10];return r&&n?r+" y "+n:r||n}(e%100);return 1===r?o?n+"to "+o:n:n&&o?n+" "+o:n||o}const i=(0,r(7549).NUMBERS)();i.numericOrdinal=function(t){const e=n.Grammar.getInstance().getParameter("gender");return t.toString()+("f"===e?"a":"o")},i.numberToWords=function(t){if(0===t)return i.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){const n=t%1e3;if(n){let t=i.large[e];const s=o(n);e?1===n?(t=t.match("/^mil( |$)/")?t:"un "+t,r=t+(r?" "+r:"")):(t=t.replace(/\u00f3n$/,"ones"),r=o(n)+" "+t+(r?" "+r:"")):r=s}t=Math.floor(t/1e3),e++}return r},i.numberToOrdinal=function(t,e){if(t>1999)return t.toString()+"a";if(t<=12)return i.special.onesOrdinals[t-1];const r=[];if(t>=1e3&&(t-=1e3,r.push("mil\xe9sima")),!t)return r.join(" ");let n=0;return n=Math.floor(t/100),n>0&&(r.push(i.special.hundredsOrdinals[n-1]),t%=100),t<=12?r.push(i.special.onesOrdinals[t-1]):(n=Math.floor(t/10),n>0&&(r.push(i.special.tensOrdinals[n-1]),t%=10),t>0&&r.push(i.special.onesOrdinals[t-1])),r.join(" ")},e.default=i},2350:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(5897),o=r(2105),i=r(7549);function s(t){let e=t%1e3,r="";if(r+=u.ones[Math.floor(e/100)]?u.ones[Math.floor(e/100)]+"-cent":"",e%=100,e){r+=r?"-":"";let t=u.ones[e];if(t)r+=t;else{const n=u.tens[Math.floor(e/10)];n.match(/-dix$/)?(t=u.ones[e%10+10],r+=n.replace(/-dix$/,"")+"-"+t):r+=n+(e%10?"-"+u.ones[e%10]:"")}}const n=r.match(/s-\w+$/);return n?r.replace(/s-\w+$/,n[0].slice(1)):r.replace(/-un$/,"-et-un")}function a(t){if(0===t)return u.zero;if(t>=Math.pow(10,36))return t.toString();u.special["tens-"+n.default.getInstance().subiso]&&(u.tens=u.special["tens-"+n.default.getInstance().subiso]);let e=0,r="";for(;t>0;){const n=t%1e3;if(n){let t=u.large[e];const o=s(n);if(t&&t.match(/^mille /)){const n=t.replace(/^mille /,"");r=r.match(RegExp(n))?o+(e?"-mille-":"")+r:r.match(RegExp(n.replace(/s$/,"")))?o+(e?"-mille-":"")+r.replace(n.replace(/s$/,""),n):o+(e?"-"+t+"-":"")+r}else t=1===n&&t?t.replace(/s$/,""):t,r=o+(e?"-"+t+"-":"")+r}t=Math.floor(t/1e3),e++}return r.replace(/-$/,"")}const l={1:"uni\xe8me",2:"demi",3:"tiers",4:"quart"};function c(t){if(1===t)return"premi\xe8re";let e=a(t);return e.match(/^neuf$/)?e=e.slice(0,-1)+"v":e.match(/cinq$/)?e+="u":e.match(/trois$/)?e+="":(e.match(/e$/)||e.match(/s$/))&&(e=e.slice(0,-1)),e+="i\xe8me",e}const u=(0,i.NUMBERS)();u.wordOrdinal=c,u.numericOrdinal=function(t){const e=o.Grammar.getInstance().getParameter("gender");return 1===t?t.toString()+("m"===e?"er":"re"):t.toString()+"e"},u.numberToWords=a,u.numberToOrdinal=function(t,e){const r=l[t]||c(t);return 3===t?r:e?r+"s":r},e.default=u},4438:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){if(0===t)return s.zero;if(t>=Math.pow(10,32))return t.toString();let e=0,r="";const n=function(t){let e=t%1e3,r="";return r+=s.ones[Math.floor(e/100)]?s.ones[Math.floor(e/100)]+s.numSep+s.special.hundred:"",e%=100,e&&(r+=r?s.numSep:"",r+=s.ones[e]),r}(t%1e3);if(!(t=Math.floor(t/1e3)))return n;for(;t>0;){const n=t%100;n&&(r=s.ones[n]+s.numSep+s.large[e]+(r?s.numSep+r:"")),t=Math.floor(t/100),e++}return n?r+s.numSep+n:r}function i(t){const e=n.Grammar.getInstance().getParameter("gender");if(t<=0)return t.toString();if(t<10)return"f"===e?s.special.ordinalsFeminine[t]:s.special.ordinalsMasculine[t];return o(t)+("f"===e?"\u0935\u0940\u0902":"\u0935\u093e\u0901")}const s=(0,r(7549).NUMBERS)();s.wordOrdinal=i,s.numericOrdinal=function(t){const e=n.Grammar.getInstance().getParameter("gender");return t>0&&t<10?"f"===e?s.special.simpleSmallOrdinalsFeminine[t]:s.special.simpleSmallOrdinalsMasculine[t]:t.toString().split("").map((function(t){const e=parseInt(t,10);return isNaN(e)?"":s.special.simpleNumbers[e]})).join("")+("f"===e?"\u0935\u0940\u0902":"\u0935\u093e\u0901")},s.numberToWords=o,s.numberToOrdinal=function(t,e){return t<=10?s.special.smallDenominators[t]:i(t)+" \u0905\u0902\u0936"},e.default=s},8825:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){let e=t%1e3,r="";if(r+=a.ones[Math.floor(e/100)]?a.ones[Math.floor(e/100)]+a.numSep+"cento":"",e%=100,e){r+=r?a.numSep:"";const t=a.ones[e];if(t)r+=t;else{let t=a.tens[Math.floor(e/10)];const n=e%10;1!==n&&8!==n||(t=t.slice(0,-1)),r+=t,r+=n?a.numSep+a.ones[e%10]:""}}return r}function i(t){if(0===t)return a.zero;if(t>=Math.pow(10,36))return t.toString();if(1===t&&n.Grammar.getInstance().getParameter("fraction"))return"un";let e=0,r="";for(;t>0;){t%1e3&&(r=o(t%1e3)+(e?"-"+a.large[e]+"-":"")+r),t=Math.floor(t/1e3),e++}return r.replace(/-$/,"")}function s(t){const e="m"===n.Grammar.getInstance().getParameter("gender")?"o":"a";let r=a.special.onesOrdinals[t];return r?r.slice(0,-1)+e:(r=i(t),r.slice(0,-1)+"esim"+e)}const a=(0,r(7549).NUMBERS)();a.wordOrdinal=s,a.numericOrdinal=function(t){const e=n.Grammar.getInstance().getParameter("gender");return t.toString()+("m"===e?"o":"a")},a.numberToWords=i,a.numberToOrdinal=function(t,e){if(2===t)return e?"mezzi":"mezzo";const r=s(t);if(!e)return r;const n=r.match(/o$/)?"i":"e";return r.slice(0,-1)+n},e.default=a},3720:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t){return t.toString().split("").map((function(t){return o.ones[parseInt(t,10)]})).join("")}const o=(0,r(7549).NUMBERS)();o.numberToWords=n,o.numberToOrdinal=n,e.default=o},8274:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(5897);function o(t,e=!1){let r=t%1e3,n="";const o=Math.floor(r/100),s=a.ones[o];if(n+=s?(1===o?"":s)+"hundre":"",r%=100,r){if(n+=n?"og":"",e){const t=a.special.smallOrdinals[r];if(t)return n+t;if(r%10)return n+a.tens[Math.floor(r/10)]+a.special.smallOrdinals[r%10]}n+=a.ones[r]||a.tens[Math.floor(r/10)]+(r%10?a.ones[r%10]:"")}return e?i(n):n}function i(t){const e=a.special.endOrdinal[0];return"a"===e&&t.match(/en$/)?t.slice(0,-2)+a.special.endOrdinal:t.match(/(d|n)$/)||t.match(/hundre$/)?t+"de":t.match(/i$/)?t+a.special.endOrdinal:"a"===e&&t.match(/e$/)?t.slice(0,-1)+a.special.endOrdinal:(t.match(/e$/),t+"nde")}function s(t){return u(t,!0)}const a=(0,r(7549).NUMBERS)();function l(t,e=!1){return t===a.ones[1]?"ein"===t?"eitt ":e?"et":"ett":t}function c(t,e=!1){let r=t%1e3,n="",o=a.ones[Math.floor(r/100)];if(n+=o?l(o)+"hundre":"",r%=100,r){if(n+=n?"og":"",e){const t=a.special.smallOrdinals[r];if(t)return n+t}if(o=a.ones[r],o)n+=o;else{const t=a.tens[Math.floor(r/10)];o=a.ones[r%10],n+=o?o+"og"+t:t}}return e?i(n):n}function u(t,e=!1){const r="alt"===n.default.getInstance().subiso?function(t,e=!1){if(0===t)return e?a.special.smallOrdinals[0]:a.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,n="";for(;t>0;){const o=t%1e3;if(o){const i=c(t%1e3,!r&&e);!r&&e&&(e=!e),n=(1===r?l(i,!0):i)+(r>1?a.numSep:"")+(r?a.large[r]+(r>1&&o>1?"er":""):"")+(r>1&&n?a.numSep:"")+n}t=Math.floor(t/1e3),r++}return e?n+(n.match(/tusen$/)?"de":"te"):n}(t,e):function(t,e=!1){if(0===t)return e?a.special.smallOrdinals[0]:a.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,n="";for(;t>0;){const i=t%1e3;if(i){const s=o(t%1e3,!r&&e);!r&&e&&(e=!e),n=s+(r?" "+a.large[r]+(r>1&&i>1?"er":"")+(n?" ":""):"")+n}t=Math.floor(t/1e3),r++}return e?n+(n.match(/tusen$/)?"de":"te"):n}(t,e);return r}a.wordOrdinal=s,a.numericOrdinal=function(t){return t.toString()+"."},a.numberToWords=u,a.numberToOrdinal=function(t,e){return s(t)},e.default=a},3898:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t){let e=t%1e3,r="";const n=Math.floor(e/100);return r+=s.ones[n]?(1===n?"":s.ones[n]+s.numSep)+"hundra":"",e%=100,e&&(r+=r?s.numSep:"",r+=s.ones[e]||s.tens[Math.floor(e/10)]+(e%10?s.numSep+s.ones[e%10]:"")),r}function o(t,e=!1){if(0===t)return s.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,o="";for(;t>0;){const i=t%1e3;if(i){const a=s.large[r],l=i>1&&r>1&&!e?"er":"";o=(1===r&&1===i?"":(r>1&&1===i?"en":n(t%1e3))+(r>1?" ":""))+(r?a+l+(r>1?" ":""):"")+o}t=Math.floor(t/1e3),r++}return o.replace(/ $/,"")}function i(t){let e=o(t,!0);return e.match(/^noll$/)?e="nollte":e.match(/ett$/)?e=e.replace(/ett$/,"f\xf6rsta"):e.match(/tv\xe5$/)?e=e.replace(/tv\xe5$/,"andra"):e.match(/tre$/)?e=e.replace(/tre$/,"tredje"):e.match(/fyra$/)?e=e.replace(/fyra$/,"fj\xe4rde"):e.match(/fem$/)?e=e.replace(/fem$/,"femte"):e.match(/sex$/)?e=e.replace(/sex$/,"sj\xe4tte"):e.match(/sju$/)?e=e.replace(/sju$/,"sjunde"):e.match(/\xe5tta$/)?e=e.replace(/\xe5tta$/,"\xe5ttonde"):e.match(/nio$/)?e=e.replace(/nio$/,"nionde"):e.match(/tio$/)?e=e.replace(/tio$/,"tionde"):e.match(/elva$/)?e=e.replace(/elva$/,"elfte"):e.match(/tolv$/)?e=e.replace(/tolv$/,"tolfte"):e.match(/tusen$/)?e=e.replace(/tusen$/,"tusonde"):e.match(/jard$/)||e.match(/jon$/)?e+="te":e+="de",e}const s=(0,r(7549).NUMBERS)();s.wordOrdinal=i,s.numericOrdinal=function(t){const e=t.toString();return e.match(/11$|12$/)?e+":e":e+(e.match(/1$|2$/)?":a":":e")},s.numberToWords=o,s.numberToOrdinal=function(t,e){if(1===t)return"hel";if(2===t)return e?"halva":"halv";let r=i(t);return r=r.match(/de$/)?r.replace(/de$/,""):r,r+(e?"delar":"del")},e.default=s},4977:function(t,e){function r(t,e=""){if(!t.childNodes||!t.childNodes[0]||!t.childNodes[0].childNodes||t.childNodes[0].childNodes.length<2||"number"!==t.childNodes[0].childNodes[0].tagName||"integer"!==t.childNodes[0].childNodes[0].getAttribute("role")||"number"!==t.childNodes[0].childNodes[1].tagName||"integer"!==t.childNodes[0].childNodes[1].getAttribute("role"))return{convertible:!1,content:t.textContent};const r=t.childNodes[0].childNodes[1].textContent,n=t.childNodes[0].childNodes[0].textContent,o=Number(r),i=Number(n);return isNaN(o)||isNaN(i)?{convertible:!1,content:`${n} ${e} ${r}`}:{convertible:!0,enumerator:i,denominator:o}}Object.defineProperty(e,"__esModule",{value:!0}),e.vulgarFractionSmall=e.convertVulgarFraction=e.Combiners=e.siCombiner=e.identityTransformer=e.pluralCase=void 0,e.pluralCase=function(t,e){return t.toString()},e.identityTransformer=function(t){return t.toString()},e.siCombiner=function(t,e){return t+e.toLowerCase()},e.Combiners={},e.Combiners.identityCombiner=function(t,e,r){return t+e+r},e.Combiners.prefixCombiner=function(t,e,r){return t=r?r+" "+t:t,e?e+" "+t:t},e.Combiners.postfixCombiner=function(t,e,r){return t=r?r+" "+t:t,e?t+" "+e:t},e.Combiners.romanceCombiner=function(t,e,r){return t=r?t+" "+r:t,e?t+" "+e:t},e.convertVulgarFraction=r,e.vulgarFractionSmall=function(t,e,n){const o=r(t);if(o.convertible){const t=o.enumerator,r=o.denominator;return t>0&&t<e&&r>0&&r<n}return!1}},4504:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Condition=e.BaseRuleStore=void 0;const n=r(7052),o=r(1676),i=r(4650),s=r(4106);class a{constructor(){this.context=new s.SpeechRuleContext,this.parseOrder=o.DynamicCstr.DEFAULT_ORDER,this.parser=new o.DynamicCstrParser(this.parseOrder),this.locale=o.DynamicCstr.DEFAULT_VALUES[o.Axis.LOCALE],this.modality=o.DynamicCstr.DEFAULT_VALUES[o.Axis.MODALITY],this.domain="",this.initialized=!1,this.inherits=null,this.kind="standard",this.customTranscriptions={},this.preconditions=new Map,this.speechRules_=[],this.rank=0,this.parseMethods={Rule:this.defineRule,Generator:this.generateRules,Action:this.defineAction,Precondition:this.definePrecondition,Ignore:this.ignoreRules}}static compareStaticConstraints_(t,e){if(t.length!==e.length)return!1;for(let r,n=0;r=t[n];n++)if(-1===e.indexOf(r))return!1;return!0}static comparePreconditions_(t,e){const r=t.precondition,n=e.precondition;return r.query===n.query&&a.compareStaticConstraints_(r.constraints,n.constraints)}defineRule(t,e,r,n,...o){const s=this.parseAction(r),a=this.parsePrecondition(n,o),l=this.parseCstr(e);if(!(s&&a&&l))return console.error(`Rule Error: ${n}, (${e}): ${r}`),null;const c=new i.SpeechRule(t,l,a,s);return c.precondition.rank=this.rank++,this.addRule(c),c}addRule(t){t.context=this.context,this.speechRules_.unshift(t)}deleteRule(t){const e=this.speechRules_.indexOf(t);-1!==e&&this.speechRules_.splice(e,1)}findRule(t){for(let e,r=0;e=this.speechRules_[r];r++)if(t(e))return e;return null}findAllRules(t){return this.speechRules_.filter(t)}evaluateDefault(t){const e=t.textContent.slice(0);return e.match(/^\s+$/)?this.evaluateWhitespace(e):this.evaluateString(e)}evaluateWhitespace(t){return[]}evaluateCustom(t){const e=this.customTranscriptions[t];return void 0!==e?n.AuditoryDescription.create({text:e},{adjust:!0,translate:!1}):null}evaluateCharacter(t){return this.evaluateCustom(t)||n.AuditoryDescription.create({text:t},{adjust:!0,translate:!0})}removeDuplicates(t){for(let e,r=this.speechRules_.length-1;e=this.speechRules_[r];r--)e!==t&&t.dynamicCstr.equal(e.dynamicCstr)&&a.comparePreconditions_(e,t)&&this.speechRules_.splice(r,1)}getSpeechRules(){return this.speechRules_}setSpeechRules(t){this.speechRules_=t}getPreconditions(){return this.preconditions}parseCstr(t){try{return this.parser.parse(this.locale+"."+this.modality+(this.domain?"."+this.domain:"")+"."+t)}catch(e){if("RuleError"===e.name)return console.error("Rule Error ",`Illegal Dynamic Constraint: ${t}.`,e.message),null;throw e}}parsePrecondition(t,e){try{const r=this.parsePrecondition_(t);t=r[0];let n=r.slice(1);for(const t of e)n=n.concat(this.parsePrecondition_(t));return new i.Precondition(t,...n)}catch(r){if("RuleError"===r.name)return console.error("Rule Error ",`Illegal preconditions: ${t}, ${e}.`,r.message),null;throw r}}parseAction(t){try{return i.Action.fromString(t)}catch(e){if("RuleError"===e.name)return console.error("Rule Error ",`Illegal action: ${t}.`,e.message),null;throw e}}parse(t){this.modality=t.modality||this.modality,this.locale=t.locale||this.locale,this.domain=t.domain||this.domain,this.context.parse(t.functions||[]),"actions"!==t.kind&&(this.kind=t.kind||this.kind,this.inheritRules()),this.parseRules(t.rules||[])}parseRules(t){for(let e,r=0;e=t[r];r++){const t=e[0],r=this.parseMethods[t];t&&r&&r.apply(this,e.slice(1))}}generateRules(t){const e=this.context.customGenerators.lookup(t);e&&e(this)}defineAction(t,e){let r;try{r=i.Action.fromString(e)}catch(t){if("RuleError"===t.name)return void console.error("Action Error ",e,t.message);throw t}const n=this.getFullPreconditions(t);if(!n)return void console.error(`Action Error: No precondition for action ${t}`);this.ignoreRules(t);const o=new RegExp("^\\w+\\.\\w+\\."+(this.domain?"\\w+\\.":""));n.conditions.forEach((([e,n])=>{const s=this.parseCstr(e.toString().replace(o,""));this.addRule(new i.SpeechRule(t,s,n,r))}))}getFullPreconditions(t){const e=this.preconditions.get(t);return e||!this.inherits?e:this.inherits.getFullPreconditions(t)}definePrecondition(t,e,r,...n){const o=this.parsePrecondition(r,n),i=this.parseCstr(e);o&&i?(o.rank=this.rank++,this.preconditions.set(t,new l(i,o))):console.error(`Precondition Error: ${r}, (${e})`)}inheritRules(){if(!this.inherits||!this.inherits.getSpeechRules().length)return;const t=new RegExp("^\\w+\\.\\w+\\."+(this.domain?"\\w+\\.":""));this.inherits.getSpeechRules().forEach((e=>{const r=this.parseCstr(e.dynamicCstr.toString().replace(t,""));this.addRule(new i.SpeechRule(e.name,r,e.precondition,e.action))}))}ignoreRules(t,...e){let r=this.findAllRules((e=>e.name===t));if(!e.length)return void r.forEach(this.deleteRule.bind(this));let n=[];for(const t of e){const e=this.parseCstr(t);for(const t of r)e.equal(t.dynamicCstr)?this.deleteRule(t):n.push(t);r=n,n=[]}}parsePrecondition_(t){const e=this.context.customGenerators.lookup(t);return e?e():[t]}}e.BaseRuleStore=a;class l{constructor(t,e){this.base=t,this._conditions=[],this.constraints=[],this.allCstr={},this.constraints.push(t),this.addCondition(t,e)}get conditions(){return this._conditions}addConstraint(t){if(this.constraints.filter((e=>e.equal(t))).length)return;this.constraints.push(t);const e=[];for(const[r,n]of this.conditions)this.base.equal(r)&&e.push([t,n]);this._conditions=this._conditions.concat(e)}addBaseCondition(t){this.addCondition(this.base,t)}addFullCondition(t){this.constraints.forEach((e=>this.addCondition(e,t)))}addCondition(t,e){const r=t.toString()+" "+e.toString();this.allCstr.condStr||(this.allCstr[r]=!0,this._conditions.push([t,e]))}}e.Condition=l},2469:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.BrailleStore=void 0;const n=r(7630),o=r(9935);class i extends o.MathStore{constructor(){super(...arguments),this.modality="braille",this.customTranscriptions={"\u22ca":"\u2808\u2821\u2833"}}evaluateString(t){const e=[],r=Array.from(t);for(let t=0;t<r.length;t++)e.push(this.evaluateCharacter(r[t]));return e}annotations(){for(let t,e=0;t=this.annotators[e];e++)(0,n.activate)(this.locale,t)}}e.BrailleStore=i},1676:function(t,e){var r;Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultComparator=e.DynamicCstrParser=e.DynamicCstr=e.DynamicProperties=e.Axis=void 0,function(t){t.DOMAIN="domain",t.STYLE="style",t.LOCALE="locale",t.TOPIC="topic",t.MODALITY="modality"}(r=e.Axis||(e.Axis={}));class n{constructor(t,e=Object.keys(t)){this.properties=t,this.order=e}static createProp(...t){const e=o.DEFAULT_ORDER,r={};for(let n=0,o=t.length,i=e.length;n<o&&n<i;n++)r[e[n]]=t[n];return new n(r)}getProperties(){return this.properties}getOrder(){return this.order}getAxes(){return this.order}getProperty(t){return this.properties[t]}updateProperties(t){this.properties=t}allProperties(){const t=[];return this.order.forEach((e=>t.push(this.getProperty(e).slice()))),t}toString(){const t=[];return this.order.forEach((e=>t.push(e+": "+this.getProperty(e).toString()))),t.join("\n")}}e.DynamicProperties=n;class o extends n{constructor(t,e){const r={};for(const[e,n]of Object.entries(t))r[e]=[n];super(r,e),this.components=t}static createCstr(...t){const e=o.DEFAULT_ORDER,r={};for(let n=0,o=t.length,i=e.length;n<o&&n<i;n++)r[e[n]]=t[n];return new o(r)}static defaultCstr(){return o.createCstr.apply(null,o.DEFAULT_ORDER.map((function(t){return o.DEFAULT_VALUES[t]})))}static validOrder(t){const e=o.DEFAULT_ORDER.slice();return t.every((t=>{const r=e.indexOf(t);return-1!==r&&e.splice(r,1)}))}getComponents(){return this.components}getValue(t){return this.components[t]}getValues(){return this.order.map((t=>this.getValue(t)))}allProperties(){const t=super.allProperties();for(let e,r,n=0;e=t[n],r=this.order[n];n++){const t=this.getValue(r);-1===e.indexOf(t)&&e.unshift(t)}return t}toString(){return this.getValues().join(".")}equal(t){const e=t.getAxes();if(this.order.length!==e.length)return!1;for(let r,n=0;r=e[n];n++){const e=this.getValue(r);if(!e||t.getValue(r)!==e)return!1}return!0}}e.DynamicCstr=o,o.DEFAULT_ORDER=[r.LOCALE,r.MODALITY,r.DOMAIN,r.STYLE,r.TOPIC],o.BASE_LOCALE="base",o.DEFAULT_VALUE="default",o.DEFAULT_VALUES={[r.LOCALE]:"en",[r.DOMAIN]:o.DEFAULT_VALUE,[r.STYLE]:o.DEFAULT_VALUE,[r.TOPIC]:o.DEFAULT_VALUE,[r.MODALITY]:"speech"};e.DynamicCstrParser=class{constructor(t){this.order=t}parse(t){const e=t.split("."),r={};if(e.length>this.order.length)throw new Error("Invalid dynamic constraint: "+r);let n=0;for(let t,o=0;t=this.order[o],e.length;o++,n++){const n=e.shift();r[t]=n}return new o(r,this.order.slice(0,n))}};e.DefaultComparator=class{constructor(t,e=new n(t.getProperties(),t.getOrder())){this.reference=t,this.fallback=e,this.order=this.reference.getOrder()}getReference(){return this.reference}setReference(t,e){this.reference=t,this.fallback=e||new n(t.getProperties(),t.getOrder()),this.order=this.reference.getOrder()}match(t){const e=t.getAxes();return e.length===this.reference.getAxes().length&&e.every((e=>{const r=t.getValue(e);return r===this.reference.getValue(e)||-1!==this.fallback.getProperty(e).indexOf(r)}))}compare(t,e){let r=!1;for(let n,o=0;n=this.order[o];o++){const o=t.getValue(n),i=e.getValue(n);if(!r){const t=this.reference.getValue(n);if(t===o&&t!==i)return-1;if(t===i&&t!==o)return 1;if(t===o&&t===i)continue;t!==o&&t!==i&&(r=!0)}const s=this.fallback.getProperty(n),a=s.indexOf(o),l=s.indexOf(i);if(a<l)return-1;if(l<a)return 1}return 0}toString(){return this.reference.toString()+"\n"+this.fallback.toString()}}},2105:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.numbersToAlpha=e.Grammar=e.ATTRIBUTE=void 0;const n=r(5740),o=r(5897),i=r(2536),s=r(4356);e.ATTRIBUTE="grammar";class a{constructor(){this.currentFlags={},this.parameters_={},this.corrections_={},this.preprocessors_={},this.stateStack_=[]}static getInstance(){return a.instance=a.instance||new a,a.instance}static parseInput(t){const e={},r=t.split(":");for(let t=0,n=r.length;t<n;t++){const n=r[t].split("="),o=n[0].trim();n[1]?e[o]=n[1].trim():o.match(/^!/)?e[o.slice(1)]=!1:e[o]=!0}return e}static parseState(t){const e={},r=t.split(" ");for(let t=0,n=r.length;t<n;t++){const n=r[t].split(":"),o=n[0],i=n[1];e[o]=i||!0}return e}static translateString_(t){if(t.match(/:unit$/))return a.translateUnit_(t);const e=o.default.getInstance();let r=e.evaluator(t,e.dynamicCstr);return r=null===r?t:r,a.getInstance().getParameter("plural")&&(r=s.LOCALE.FUNCTIONS.plural(r)),r}static translateUnit_(t){t=a.prepareUnit_(t);const e=o.default.getInstance(),r=a.getInstance().getParameter("plural"),n=e.strict,i=`${e.locale}.${e.modality}.default`;let l,c;return e.strict=!0,r&&(l=e.defaultParser.parse(i+".plural"),c=e.evaluator(t,l)),c?(e.strict=n,c):(l=e.defaultParser.parse(i+".default"),c=e.evaluator(t,l),e.strict=n,c?(r&&(c=s.LOCALE.FUNCTIONS.plural(c)),c):a.cleanUnit_(t))}static prepareUnit_(t){const e=t.match(/:unit$/);return e?t.slice(0,e.index).replace(/\s+/g," ")+t.slice(e.index):t}static cleanUnit_(t){return t.match(/:unit$/)?t.replace(/:unit$/,""):t}clear(){this.parameters_={},this.stateStack_=[]}setParameter(t,e){const r=this.parameters_[t];return e?this.parameters_[t]=e:delete this.parameters_[t],r}getParameter(t){return this.parameters_[t]}setCorrection(t,e){this.corrections_[t]=e}setPreprocessor(t,e){this.preprocessors_[t]=e}getCorrection(t){return this.corrections_[t]}getState(){const t=[];for(const e in this.parameters_){const r=this.parameters_[e];t.push("string"==typeof r?e+":"+r:e)}return t.join(" ")}pushState(t){for(const e in t)t[e]=this.setParameter(e,t[e]);this.stateStack_.push(t)}popState(){const t=this.stateStack_.pop();for(const e in t)this.setParameter(e,t[e])}setAttribute(t){if(t&&t.nodeType===n.NodeType.ELEMENT_NODE){const r=this.getState();r&&t.setAttribute(e.ATTRIBUTE,r)}}preprocess(t){return this.runProcessors_(t,this.preprocessors_)}correct(t){return this.runProcessors_(t,this.corrections_)}apply(t,e){return this.currentFlags=e||{},t=this.currentFlags.adjust||this.currentFlags.preprocess?a.getInstance().preprocess(t):t,(this.parameters_.translate||this.currentFlags.translate)&&(t=a.translateString_(t)),t=this.currentFlags.adjust||this.currentFlags.correct?a.getInstance().correct(t):t,this.currentFlags={},t}runProcessors_(t,e){for(const r in this.parameters_){const n=e[r];if(!n)continue;const o=this.parameters_[r];t=!0===o?n(t):n(t,o)}return t}}function l(t,e){if(!e||!t)return t;const r=s.LOCALE.FUNCTIONS.fontRegexp(i.localFont(e));return t.replace(r,"")}function c(t){return t.match(/\d+/)?s.LOCALE.NUMBERS.numberToWords(parseInt(t,10)):t}e.Grammar=a,e.numbersToAlpha=c,a.getInstance().setCorrection("localFont",i.localFont),a.getInstance().setCorrection("localRole",i.localRole),a.getInstance().setCorrection("localEnclose",i.localEnclose),a.getInstance().setCorrection("ignoreFont",l),a.getInstance().setPreprocessor("annotation",(function(t,e){return t+":"+e})),a.getInstance().setPreprocessor("noTranslateText",(function(t){return t.match(new RegExp("^["+s.LOCALE.MESSAGES.regexp.TEXT+"]+$"))&&(a.getInstance().currentFlags.translate=!1),t})),a.getInstance().setCorrection("ignoreCaps",(function(t){let e=s.LOCALE.ALPHABETS.capPrefix[o.default.getInstance().domain];return void 0===e&&(e=s.LOCALE.ALPHABETS.capPrefix.default),l(t,e)})),a.getInstance().setPreprocessor("numbers2alpha",c)},2780:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.enumerate=e.lookupString=e.lookupCategory=e.lookupRule=e.addSiUnitRules=e.addUnitRules=e.addFunctionRules=e.addSymbolRules=e.defineRule=e.defineRules=e.setSiPrefixes=void 0;const n=r(2057),o=r(5897),i=r(7491),s=r(4658),a=r(1676);let l=a.DynamicCstr.DEFAULT_VALUES[a.Axis.LOCALE],c=a.DynamicCstr.DEFAULT_VALUES[a.Axis.MODALITY],u={};e.setSiPrefixes=function(t){u=t};const p={};function h(t,e,r,n){const o=_(e);S(o,r),o.defineRulesFromMappings(t,l,c,e,n)}function f(t){if(v(t))return;const e=t.names,r=t.mappings,n=t.category;for(let t,o=0;t=e[o];o++)h(t,t,n,r)}function d(t){for(const e of Object.keys(u)){const r=Object.assign({},t);r.mappings={};const n=u[e];r.key=e+r.key,r.names=r.names.map((function(t){return e+t}));for(const e of Object.keys(t.mappings)){r.mappings[e]={};for(const o of Object.keys(t.mappings[e]))r.mappings[e][o]=i.locales[l]().FUNCTIONS.si(n,t.mappings[e][o])}b(r)}b(t)}function m(t,e){const r=p[t];return r?r.lookupRule(null,e):null}function y(t,e){const r=m(t,e);return r?r.action:null}function g(t,e){return e=e||{},t.length?(e[t[0]]=g(t.slice(1),e[t[0]]),e):e}function b(t){const e=t.names;e&&(t.names=e.map((function(t){return t+":unit"}))),f(t)}function v(t){return!(!t.locale&&!t.modality)&&(l=t.locale||l,c=t.modality||c,!0)}function _(t){let e=p[t];return e?(n.Debugger.getInstance().output("Store exists! "+t),e):(e=new s.MathSimpleStore,p[t]=e,e)}function S(t,e){e&&(t.category=e)}e.defineRules=h,e.defineRule=function(t,e,r,n,o,i){const s=_(o);S(s,n),s.defineRuleFromStrings(t,l,c,e,r,o,i)},e.addSymbolRules=function(t){if(v(t))return;const e=s.MathSimpleStore.parseUnicode(t.key);h(t.key,e,t.category,t.mappings)},e.addFunctionRules=f,e.addUnitRules=function(t){v(t)||(t.si?d(t):b(t))},e.addSiUnitRules=d,e.lookupRule=m,e.lookupCategory=function(t){const e=p[t];return e?e.category:""},e.lookupString=y,o.default.getInstance().evaluator=y,e.enumerate=function(t={}){for(const e of Object.values(p))for(const[,r]of e.rules.entries())for(const{cstr:e}of r)t=g(e.getValues(),t);return t}},4658:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MathSimpleStore=void 0;const n=r(5897),o=r(1676);class i{constructor(){this.category="",this.rules=new Map}static parseUnicode(t){const e=parseInt(t,16);return String.fromCodePoint(e)}static testDynamicConstraints_(t,e){return n.default.getInstance().strict?e.cstr.equal(t):n.default.getInstance().comparator.match(e.cstr)}defineRulesFromMappings(t,e,r,n,o){for(const i in o)for(const s in o[i]){const a=o[i][s];this.defineRuleFromStrings(t,e,r,i,s,n,a)}}getRules(t){let e=this.rules.get(t);return e||(e=[],this.rules.set(t,e)),e}defineRuleFromStrings(t,e,r,o,i,s,a){let l=this.getRules(e);const c=n.default.getInstance().parsers[o]||n.default.getInstance().defaultParser,u=n.default.getInstance().comparators[o],p=`${e}.${r}.${o}.${i}`,h=c.parse(p),f=u?u():n.default.getInstance().comparator,d=f.getReference();f.setReference(h);const m={cstr:h,action:a};l=l.filter((t=>!h.equal(t.cstr))),l.push(m),this.rules.set(e,l),f.setReference(d)}lookupRule(t,e){let r=this.getRules(e.getValue(o.Axis.LOCALE));return r=r.filter((function(t){return i.testDynamicConstraints_(e,t)})),1===r.length?r[0]:r.length?r.sort(((t,e)=>n.default.getInstance().comparator.compare(t.cstr,e.cstr)))[0]:null}}e.MathSimpleStore=i},9935:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MathStore=void 0;const n=r(707),o=r(4356),i=r(7630),s=r(4504),a=r(4650);class l extends s.BaseRuleStore{constructor(){super(),this.annotators=[],this.parseMethods.Alias=this.defineAlias,this.parseMethods.SpecializedRule=this.defineSpecializedRule,this.parseMethods.Specialized=this.defineSpecialized}initialize(){this.initialized||(this.annotations(),this.initialized=!0)}annotations(){for(let t,e=0;t=this.annotators[e];e++)(0,i.activate)(this.domain,t)}defineAlias(t,e,...r){const n=this.parsePrecondition(e,r);if(!n)return void console.error(`Precondition Error: ${e} ${r}`);const o=this.preconditions.get(t);o?o.addFullCondition(n):console.error(`Alias Error: No precondition by the name of ${t}`)}defineRulesAlias(t,e,...r){const n=this.findAllRules((function(e){return e.name===t}));if(0===n.length)throw new a.OutputError("Rule with name "+t+" does not exist.");const o=[];n.forEach((t=>{(t=>{const e=t.dynamicCstr.toString(),r=t.action.toString();for(let t,n=0;t=o[n];n++)if(t.action===r&&t.cstr===e)return!1;return o.push({cstr:e,action:r}),!0})(t)&&this.addAlias_(t,e,r)}))}defineSpecializedRule(t,e,r,n){const o=this.parseCstr(e),i=this.findRule((e=>e.name===t&&o.equal(e.dynamicCstr))),s=this.parseCstr(r);if(!i&&n)throw new a.OutputError("Rule named "+t+" with style "+e+" does not exist.");const l=n?a.Action.fromString(n):i.action,c=new a.SpeechRule(i.name,s,i.precondition,l);this.addRule(c)}defineSpecialized(t,e,r){const n=this.parseCstr(r);if(!n)return void console.error(`Dynamic Constraint Error: ${r}`);const o=this.preconditions.get(t);o?o.addConstraint(n):console.error(`Alias Error: No precondition by the name of ${t}`)}evaluateString(t){const e=[];if(t.match(/^\s+$/))return e;let r=this.matchNumber_(t);if(r&&r.length===t.length)return e.push(this.evaluateCharacter(r.number)),e;const i=n.removeEmpty(t.replace(/\s/g," ").split(" "));for(let t,n=0;t=i[n];n++)if(1===t.length)e.push(this.evaluateCharacter(t));else if(t.match(new RegExp("^["+o.LOCALE.MESSAGES.regexp.TEXT+"]+$")))e.push(this.evaluateCharacter(t));else{let n=t;for(;n;){r=this.matchNumber_(n);const t=n.match(new RegExp("^["+o.LOCALE.MESSAGES.regexp.TEXT+"]+"));if(r)e.push(this.evaluateCharacter(r.number)),n=n.substring(r.length);else if(t)e.push(this.evaluateCharacter(t[0])),n=n.substring(t[0].length);else{const t=Array.from(n),r=t[0];e.push(this.evaluateCharacter(r)),n=t.slice(1).join("")}}}return e}parse(t){super.parse(t),this.annotators=t.annotators||[]}addAlias_(t,e,r){const n=this.parsePrecondition(e,r),o=new a.SpeechRule(t.name,t.dynamicCstr,n,t.action);o.name=t.name,this.addRule(o)}matchNumber_(t){const e=t.match(new RegExp("^"+o.LOCALE.MESSAGES.regexp.NUMBER)),r=t.match(new RegExp("^"+l.regexp.NUMBER));if(!e&&!r)return null;const n=r&&r[0]===t;if(e&&e[0]===t||!n)return e?{number:e[0],length:e[0].length}:null;return{number:r[0].replace(new RegExp(l.regexp.DIGIT_GROUP,"g"),"X").replace(new RegExp(l.regexp.DECIMAL_MARK,"g"),o.LOCALE.MESSAGES.regexp.DECIMAL_MARK).replace(/X/g,o.LOCALE.MESSAGES.regexp.DIGIT_GROUP.replace(/\\/g,"")),length:r[0].length}}}e.MathStore=l,l.regexp={NUMBER:"((\\d{1,3})(?=(,| ))((,| )\\d{3})*(\\.\\d+)?)|^\\d*\\.\\d+|^\\d+",DECIMAL_MARK:"\\.",DIGIT_GROUP:","}},4650:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.OutputError=e.Precondition=e.Action=e.Component=e.ActionType=e.SpeechRule=void 0;const n=r(5897),o=r(2105);var i;function s(t){switch(t){case"[n]":return i.NODE;case"[m]":return i.MULTI;case"[t]":return i.TEXT;case"[p]":return i.PERSONALITY;default:throw"Parse error: "+t}}e.SpeechRule=class{constructor(t,e,r,n){this.name=t,this.dynamicCstr=e,this.precondition=r,this.action=n,this.context=null}toString(){return this.name+" | "+this.dynamicCstr.toString()+" | "+this.precondition.toString()+" ==> "+this.action.toString()}},function(t){t.NODE="NODE",t.MULTI="MULTI",t.TEXT="TEXT",t.PERSONALITY="PERSONALITY"}(i=e.ActionType||(e.ActionType={}));class a{constructor({type:t,content:e,attributes:r,grammar:n}){this.type=t,this.content=e,this.attributes=r,this.grammar=n}static grammarFromString(t){return o.Grammar.parseInput(t)}static fromString(t){const e={type:s(t.substring(0,3))};let r=t.slice(3).trim();if(!r)throw new u("Missing content.");switch(e.type){case i.TEXT:if('"'===r[0]){const t=p(r,"\\(")[0].trim();if('"'!==t.slice(-1))throw new u("Invalid string syntax.");e.content=t,r=r.slice(t.length).trim(),-1===r.indexOf("(")&&(r="");break}case i.NODE:case i.MULTI:{const t=r.indexOf(" (");if(-1===t){e.content=r.trim(),r="";break}e.content=r.substring(0,t).trim(),r=r.slice(t).trim()}}if(r){const t=a.attributesFromString(r);t.grammar&&(e.grammar=t.grammar,delete t.grammar),Object.keys(t).length&&(e.attributes=t)}return new a(e)}static attributesFromString(t){if("("!==t[0]||")"!==t.slice(-1))throw new u("Invalid attribute expression: "+t);const e={},r=p(t.slice(1,-1),",");for(let t=0,n=r.length;t<n;t++){const n=r[t],i=n.indexOf(":");if(-1===i)e[n.trim()]="true";else{const t=n.substring(0,i).trim(),r=n.slice(i+1).trim();e[t]=t===o.ATTRIBUTE?a.grammarFromString(r):r}}return e}toString(){let t="";t+=function(t){switch(t){case i.NODE:return"[n]";case i.MULTI:return"[m]";case i.TEXT:return"[t]";case i.PERSONALITY:return"[p]";default:throw"Unknown type error: "+t}}(this.type),t+=this.content?" "+this.content:"";const e=this.attributesToString();return t+=e?" "+e:"",t}grammarToString(){return this.getGrammar().join(":")}getGrammar(){const t=[];for(const e in this.grammar)!0===this.grammar[e]?t.push(e):!1===this.grammar[e]?t.push("!"+e):t.push(e+"="+this.grammar[e]);return t}attributesToString(){const t=this.getAttributes(),e=this.grammarToString();return e&&t.push("grammar:"+e),t.length>0?"("+t.join(", ")+")":""}getAttributes(){const t=[];for(const e in this.attributes){const r=this.attributes[e];"true"===r?t.push(e):t.push(e+":"+r)}return t}}e.Component=a;class l{constructor(t){this.components=t}static fromString(t){const e=p(t,";").filter((function(t){return t.match(/\S/)})).map((function(t){return t.trim()})),r=[];for(let t=0,n=e.length;t<n;t++){const n=a.fromString(e[t]);n&&r.push(n)}return new l(r)}toString(){return this.components.map((function(t){return t.toString()})).join("; ")}}e.Action=l;class c{constructor(t,...e){this.query=t,this.constraints=e;const[r,n]=this.presetPriority();this.priority=r?n:this.calculatePriority()}static constraintValue(t,e){for(let r,n=0;r=e[n];n++)if(t.match(r))return++n;return 0}toString(){const t=this.constraints.join(", ");return`${this.query}, ${t} (${this.priority}, ${this.rank})`}calculatePriority(){const t=c.constraintValue(this.query,c.queryPriorities);if(!t)return 0;const e=this.query.match(/^self::.+\[(.+)\]/)[1];return 100*t+10*c.constraintValue(e,c.attributePriorities)}presetPriority(){if(!this.constraints.length)return[!1,0];const t=this.constraints[this.constraints.length-1].match(/^priority=(.*$)/);if(!t)return[!1,0];this.constraints.pop();const e=parseFloat(t[1]);return[!0,isNaN(e)?0:e]}}e.Precondition=c,c.queryPriorities=[/^self::\*\[.+\]$/,/^self::[\w-]+\[.+\]$/],c.attributePriorities=[/^@[\w-]+$/,/^@[\w-]+!=".+"$/,/^not\(contains\(@[\w-]+,\s*".+"\)\)$/,/^contains\(@[\w-]+,".+"\)$/,/^@[\w-]+=".+"$/];class u extends n.SREError{constructor(t){super(t),this.name="RuleError"}}function p(t,e){const r=[];let n="";for(;""!==t;){const o=t.search(e);if(-1===o){if((t.match(/"/g)||[]).length%2!=0)throw new u("Invalid string in expression: "+t);r.push(n+t),n="",t=""}else if((t.substring(0,o).match(/"/g)||[]).length%2==0)r.push(n+t.substring(0,o)),n="",t=t.substring(o+1);else{const e=t.substring(o).search('"');if(-1===e)throw new u("Invalid string in expression: "+t);n+=t.substring(0,o+e+1),t=t.substring(o+e+1)}}return n&&r.push(n),r}e.OutputError=u},4106:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SpeechRuleContext=void 0;const n=r(5274),o=r(5662);e.SpeechRuleContext=class{constructor(){this.customQueries=new o.CustomQueries,this.customStrings=new o.CustomStrings,this.contextFunctions=new o.ContextFunctions,this.customGenerators=new o.CustomGenerators}applyCustomQuery(t,e){const r=this.customQueries.lookup(e);return r?r(t):null}applySelector(t,e){return this.applyCustomQuery(t,e)||n.evalXPath(e,t)}applyQuery(t,e){const r=this.applySelector(t,e);return r.length>0?r[0]:null}applyConstraint(t,e){return!!this.applyQuery(t,e)||n.evaluateBoolean(e,t)}constructString(t,e){if(!e)return"";if('"'===e.charAt(0))return e.slice(1,-1);const r=this.customStrings.lookup(e);return r?r(t):n.evaluateString(e,t)}parse(t){const e=Array.isArray(t)?t:Object.entries(t);for(let t,r=0;t=e[r];r++){switch(t[0].slice(0,3)){case"CQF":this.customQueries.add(t[0],t[1]);break;case"CSF":this.customStrings.add(t[0],t[1]);break;case"CTF":this.contextFunctions.add(t[0],t[1]);break;case"CGF":this.customGenerators.add(t[0],t[1]);break;default:console.error("FunctionError: Invalid function name "+t[0])}}}}},2362:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.storeFactory=e.SpeechRuleEngine=void 0;const n=r(7052),o=r(2057),i=r(5740),s=r(5897),a=r(4440),l=r(5274),c=r(7283),u=r(7599),p=r(2469),h=r(1676),f=r(2105),d=r(9935),m=r(4650),y=r(4508);class g{constructor(){this.trie=null,this.evaluators_={},this.trie=new y.Trie}static getInstance(){return g.instance=g.instance||new g,g.instance}static debugSpeechRule(t,e){const r=t.precondition,n=t.context.applyQuery(e,r.query);o.Debugger.getInstance().output(r.query,n?n.toString():n),r.constraints.forEach((r=>o.Debugger.getInstance().output(r,t.context.applyConstraint(e,r))))}static debugNamedSpeechRule(t,e){const r=g.getInstance().trie.collectRules().filter((e=>e.name==t));for(let n,i=0;n=r[i];i++)o.Debugger.getInstance().output("Rule",t,"DynamicCstr:",n.dynamicCstr.toString(),"number",i),g.debugSpeechRule(n,e)}evaluateNode(t){(0,l.updateEvaluator)(t);const e=(new Date).getTime();let r=[];try{r=this.evaluateNode_(t)}catch(t){console.error("Something went wrong computing speech."),o.Debugger.getInstance().output(t)}const n=(new Date).getTime();return o.Debugger.getInstance().output("Time:",n-e),r}toString(){return this.trie.collectRules().map((t=>t.toString())).join("\n")}runInSetting(t,e){const r=s.default.getInstance(),n={};for(const e in t)n[e]=r[e],r[e]=t[e];r.setDynamicCstr();const o=e();for(const t in n)r[t]=n[t];return r.setDynamicCstr(),o}addStore(t){const e=v(t);"abstract"!==e.kind&&e.getSpeechRules().forEach((t=>this.trie.addRule(t))),this.addEvaluator(e)}processGrammar(t,e,r){const n={};for(const o in r){const i=r[o];n[o]="string"==typeof i?t.constructString(e,i):i}f.Grammar.getInstance().pushState(n)}addEvaluator(t){const e=t.evaluateDefault.bind(t),r=this.evaluators_[t.locale];if(r)return void(r[t.modality]=e);const n={};n[t.modality]=e,this.evaluators_[t.locale]=n}getEvaluator(t,e){const r=this.evaluators_[t]||this.evaluators_[h.DynamicCstr.DEFAULT_VALUES[h.Axis.LOCALE]];return r[e]||r[h.DynamicCstr.DEFAULT_VALUES[h.Axis.MODALITY]]}enumerate(t){return this.trie.enumerate(t)}evaluateNode_(t){return t?(this.updateConstraint_(),this.evaluateTree_(t)):[]}evaluateTree_(t){const e=s.default.getInstance();let r;o.Debugger.getInstance().output(e.mode!==a.Mode.HTTP?t.toString():t),f.Grammar.getInstance().setAttribute(t);const i=this.lookupRule(t,e.dynamicCstr);if(!i)return e.strict?[]:(r=this.getEvaluator(e.locale,e.modality)(t),t.attributes&&this.addPersonality_(r,{},!1,t),r);o.Debugger.getInstance().generateOutput((()=>["Apply Rule:",i.name,i.dynamicCstr.toString(),(e.mode,a.Mode.HTTP,t).toString()]));const c=i.context,u=i.action.components;r=[];for(let e,o=0;e=u[o];o++){let o=[];const i=e.content||"",a=e.attributes||{};let u=!1;e.grammar&&this.processGrammar(c,t,e.grammar);let p=null;if(a.engine){p=s.default.getInstance().dynamicCstr.getComponents();const t=f.Grammar.parseInput(a.engine);s.default.getInstance().setDynamicCstr(t)}switch(e.type){case m.ActionType.NODE:{const e=c.applyQuery(t,i);e&&(o=this.evaluateTree_(e))}break;case m.ActionType.MULTI:{u=!0;const e=c.applySelector(t,i);e.length>0&&(o=this.evaluateNodeList_(c,e,a.sepFunc,c.constructString(t,a.separator),a.ctxtFunc,c.constructString(t,a.context)))}break;case m.ActionType.TEXT:{const e=a.span,r={};if(e){const n=(0,l.evalXPath)(e,t);n.length&&(r.extid=n[0].getAttribute("extid"))}const s=c.constructString(t,i);(s||""===s)&&(o=Array.isArray(s)?s.map((function(t){return n.AuditoryDescription.create({text:t.speech,attributes:t.attributes},{adjust:!0})})):[n.AuditoryDescription.create({text:s,attributes:r},{adjust:!0})])}break;case m.ActionType.PERSONALITY:default:o=[n.AuditoryDescription.create({text:i})]}o[0]&&!u&&(a.context&&(o[0].context=c.constructString(t,a.context)+(o[0].context||"")),a.annotation&&(o[0].annotation=a.annotation)),this.addLayout(o,a,u),e.grammar&&f.Grammar.getInstance().popState(),r=r.concat(this.addPersonality_(o,a,u,t)),p&&s.default.getInstance().setDynamicCstr(p)}return r}evaluateNodeList_(t,e,r,o,i,s){if(!e.length)return[];const a=o||"",l=s||"",c=t.contextFunctions.lookup(i),u=c?c(e,l):function(){return l},p=t.contextFunctions.lookup(r),h=p?p(e,a):function(){return[n.AuditoryDescription.create({text:a},{translate:!0})]};let f=[];for(let t,r=0;t=e[r];r++){const n=this.evaluateTree_(t);if(n.length>0&&(n[0].context=u()+(n[0].context||""),f=f.concat(n),r<e.length-1)){const t=h();f=f.concat(t)}}return f}addLayout(t,e,r){const o=e.layout;o&&(o.match(/^begin/)?t.unshift(new n.AuditoryDescription({text:"",layout:o})):o.match(/^end/)?t.push(new n.AuditoryDescription({text:"",layout:o})):(t.unshift(new n.AuditoryDescription({text:"",layout:`begin${o}`})),t.push(new n.AuditoryDescription({text:"",layout:`end${o}`}))))}addPersonality_(t,e,r,o){const i={};let s=null;for(const t of a.personalityPropList){const r=e[t];if(void 0===r)continue;const n=parseFloat(r),o=isNaN(n)?'"'===r.charAt(0)?r.slice(1,-1):r:n;t===a.personalityProps.PAUSE?s=o:i[t]=o}for(let e,r=0;e=t[r];r++)this.addRelativePersonality_(e,i),this.addExternalAttributes_(e,o);if(r&&t.length&&delete t[t.length-1].personality[a.personalityProps.JOIN],s&&t.length){const e=t[t.length-1];e.text||Object.keys(e.personality).length?t.push(n.AuditoryDescription.create({text:"",personality:{pause:s}})):e.personality[a.personalityProps.PAUSE]=s}return t}addExternalAttributes_(t,e){if(e.hasAttributes()){const r=e.attributes;for(let e=r.length-1;e>=0;e--){const n=r[e].name;!t.attributes[n]&&n.match(/^ext/)&&(t.attributes[n]=r[e].value)}}}addRelativePersonality_(t,e){if(!t.personality)return t.personality=e,t;const r=t.personality;for(const t in e)r[t]&&"number"==typeof r[t]&&"number"==typeof e[t]?r[t]=r[t]+e[t]:r[t]||(r[t]=e[t]);return t}updateConstraint_(){const t=s.default.getInstance().dynamicCstr,e=s.default.getInstance().strict,r=this.trie,n={};let o=t.getValue(h.Axis.LOCALE),i=t.getValue(h.Axis.MODALITY),a=t.getValue(h.Axis.DOMAIN);r.hasSubtrie([o,i,a])||(a=h.DynamicCstr.DEFAULT_VALUES[h.Axis.DOMAIN],r.hasSubtrie([o,i,a])||(i=h.DynamicCstr.DEFAULT_VALUES[h.Axis.MODALITY],r.hasSubtrie([o,i,a])||(o=h.DynamicCstr.DEFAULT_VALUES[h.Axis.LOCALE]))),n[h.Axis.LOCALE]=[o],n[h.Axis.MODALITY]=["summary"!==i?i:h.DynamicCstr.DEFAULT_VALUES[h.Axis.MODALITY]],n[h.Axis.DOMAIN]=["speech"!==i?h.DynamicCstr.DEFAULT_VALUES[h.Axis.DOMAIN]:a];const l=t.getOrder();for(let r,o=0;r=l[o];o++)if(!n[r]){const o=t.getValue(r),i=this.makeSet_(o,t.preference),s=h.DynamicCstr.DEFAULT_VALUES[r];e||o===s||i.push(s),n[r]=i}t.updateProperties(n)}makeSet_(t,e){return e&&Object.keys(e).length?t.split(":"):[t]}lookupRule(t,e){if(!t||t.nodeType!==i.NodeType.ELEMENT_NODE&&t.nodeType!==i.NodeType.TEXT_NODE)return null;const r=this.lookupRules(t,e);return r.length>0?this.pickMostConstraint_(e,r):null}lookupRules(t,e){return this.trie.lookupRules(t,e.allProperties())}pickMostConstraint_(t,e){const r=s.default.getInstance().comparator;return e.sort((function(t,e){return r.compare(t.dynamicCstr,e.dynamicCstr)||e.precondition.priority-t.precondition.priority||e.precondition.constraints.length-t.precondition.constraints.length||e.precondition.rank-t.precondition.rank})),o.Debugger.getInstance().generateOutput((()=>e.map((t=>t.name+"("+t.dynamicCstr.toString()+")"))).bind(this)),e[0]}}e.SpeechRuleEngine=g;const b=new Map;function v(t){const e=`${t.locale}.${t.modality}.${t.domain}`;if("actions"===t.kind){const r=b.get(e);return r.parse(t),r}u.init(),t&&!t.functions&&(t.functions=c.getStore(t.locale,t.modality,t.domain));const r="braille"===t.modality?new p.BrailleStore:new d.MathStore;return b.set(e,r),t.inherits&&(r.inherits=b.get(`${t.inherits}.${t.modality}.${t.domain}`)),r.parse(t),r.initialize(),r}e.storeFactory=v,s.default.nodeEvaluator=g.getInstance().evaluateNode.bind(g.getInstance())},5662:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.CustomGenerators=e.ContextFunctions=e.CustomStrings=e.CustomQueries=void 0;class r{constructor(t,e){this.prefix=t,this.store=e}add(t,e){this.checkCustomFunctionSyntax_(t)&&(this.store[t]=e)}addStore(t){const e=Object.keys(t.store);for(let r,n=0;r=e[n];n++)this.add(r,t.store[r])}lookup(t){return this.store[t]}checkCustomFunctionSyntax_(t){const e=new RegExp("^"+this.prefix);return!!t.match(e)||(console.error("FunctionError: Invalid function name. Expected prefix "+this.prefix),!1)}}e.CustomQueries=class extends r{constructor(){super("CQF",{})}};e.CustomStrings=class extends r{constructor(){super("CSF",{})}};e.ContextFunctions=class extends r{constructor(){super("CTF",{})}};e.CustomGenerators=class extends r{constructor(){super("CGF",{})}}},365:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.contentIterator=e.pauseSeparator=e.nodeCounter=void 0;const n=r(7052),o=r(5274),i=r(5897);e.nodeCounter=function(t,e){const r=t.length;let n=0,o=e;return e||(o=""),function(){return n<r&&(n+=1),o+" "+n}},e.pauseSeparator=function(t,e){const r=parseFloat(e),o=isNaN(r)?e:r;return function(){return[n.AuditoryDescription.create({text:"",personality:{pause:o}})]}},e.contentIterator=function(t,e){let r;return r=t.length>0?o.evalXPath("../../content/*",t[0]):[],function(){const t=r.shift(),o=e?[n.AuditoryDescription.create({text:e},{translate:!0})]:[];if(!t)return o;const s=i.default.evaluateNode(t);return o.concat(s)}}},1414:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.getTreeFromString=e.getTree=e.xmlTree=void 0;const n=r(5740),o=r(7075);function i(t){return new o.SemanticTree(t)}e.xmlTree=function(t){return i(t).xml()},e.getTree=i,e.getTreeFromString=function(t){return i(n.parseInput(t))}},7630:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.annotate=e.activate=e.register=e.visitors=e.annotators=void 0;const n=r(9265);e.annotators=new Map,e.visitors=new Map,e.register=function(t){const r=t.domain+":"+t.name;t instanceof n.SemanticAnnotator?e.annotators.set(r,t):e.visitors.set(r,t)},e.activate=function(t,r){const n=t+":"+r,o=e.annotators.get(n)||e.visitors.get(n);o&&(o.active=!0)},e.annotate=function(t){for(const r of e.annotators.values())r.active&&r.annotate(t);for(const r of e.visitors.values())r.active&&r.visit(t,Object.assign({},r.def))}},9265:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticVisitor=e.SemanticAnnotator=void 0;e.SemanticAnnotator=class{constructor(t,e,r){this.domain=t,this.name=e,this.func=r,this.active=!1}annotate(t){t.childNodes.forEach(this.annotate.bind(this)),t.addAnnotation(this.domain,this.func(t))}};e.SemanticVisitor=class{constructor(t,e,r,n={}){this.domain=t,this.name=e,this.func=r,this.def=n,this.active=!1}visit(t,e){let r=this.func(t,e);t.addAnnotation(this.domain,r[0]);for(let e,n=0;e=t.childNodes[n];n++)r=this.visit(e,r[1]);return r}}},3588:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.lookupSecondary=e.isEmbellishedType=e.isMatchingFence=e.functionApplication=e.invisibleComma=e.invisiblePlus=e.invisibleTimes=e.lookupMeaning=e.lookupRole=e.lookupType=e.equal=e.allLettersRegExp=void 0;const r=String.fromCodePoint(8291),n=["\uff0c","\ufe50",",",r],o=["\xaf","\u2012","\u2013","\u2014","\u2015","\ufe58","-","\u207b","\u208b","\u2212","\u2796","\ufe63","\uff0d","\u2010","\u2011","\u203e","_"],i=["~","\u0303","\u223c","\u02dc","\u223d","\u02f7","\u0334","\u0330"],s={"(":")","[":"]","{":"}","\u2045":"\u2046","\u2329":"\u232a","\u2768":"\u2769","\u276a":"\u276b","\u276c":"\u276d","\u276e":"\u276f","\u2770":"\u2771","\u2772":"\u2773","\u2774":"\u2775","\u27c5":"\u27c6","\u27e6":"\u27e7","\u27e8":"\u27e9","\u27ea":"\u27eb","\u27ec":"\u27ed","\u27ee":"\u27ef","\u2983":"\u2984","\u2985":"\u2986","\u2987":"\u2988","\u2989":"\u298a","\u298b":"\u298c","\u298d":"\u298e","\u298f":"\u2990","\u2991":"\u2992","\u2993":"\u2994","\u2995":"\u2996","\u2997":"\u2998","\u29d8":"\u29d9","\u29da":"\u29db","\u29fc":"\u29fd","\u2e22":"\u2e23","\u2e24":"\u2e25","\u2e26":"\u2e27","\u2e28":"\u2e29","\u3008":"\u3009","\u300a":"\u300b","\u300c":"\u300d","\u300e":"\u300f","\u3010":"\u3011","\u3014":"\u3015","\u3016":"\u3017","\u3018":"\u3019","\u301a":"\u301b","\u301d":"\u301e","\ufd3e":"\ufd3f","\ufe17":"\ufe18","\ufe59":"\ufe5a","\ufe5b":"\ufe5c","\ufe5d":"\ufe5e","\uff08":"\uff09","\uff3b":"\uff3d","\uff5b":"\uff5d","\uff5f":"\uff60","\uff62":"\uff63","\u2308":"\u2309","\u230a":"\u230b","\u230c":"\u230d","\u230e":"\u230f","\u231c":"\u231d","\u231e":"\u231f","\u239b":"\u239e","\u239c":"\u239f","\u239d":"\u23a0","\u23a1":"\u23a4","\u23a2":"\u23a5","\u23a3":"\u23a6","\u23a7":"\u23ab","\u23a8":"\u23ac","\u23a9":"\u23ad","\u23b0":"\u23b1","\u23b8":"\u23b9"},a={"\u23b4":"\u23b5","\u23dc":"\u23dd","\u23de":"\u23df","\u23e0":"\u23e1","\ufe35":"\ufe36","\ufe37":"\ufe38","\ufe39":"\ufe3a","\ufe3b":"\ufe3c","\ufe3d":"\ufe3e","\ufe3f":"\ufe40","\ufe41":"\ufe42","\ufe43":"\ufe44","\ufe47":"\ufe48"},l=Object.keys(s),c=Object.values(s);c.push("\u301f");const u=Object.keys(a),p=Object.values(a),h=["|","\xa6","\u2223","\u23d0","\u23b8","\u23b9","\u2758","\uff5c","\uffe4","\ufe31","\ufe32"],f=["\u2016","\u2225","\u2980","\u2af4"],d=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],m=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","\u0131","\u0237"],y=["\uff21","\uff22","\uff23","\uff24","\uff25","\uff26","\uff27","\uff28","\uff29","\uff2a","\uff2b","\uff2c","\uff2d","\uff2e","\uff2f","\uff30","\uff31","\uff32","\uff33","\uff34","\uff35","\uff36","\uff37","\uff38","\uff39","\uff3a"],g=["\uff41","\uff42","\uff43","\uff44","\uff45","\uff46","\uff47","\uff48","\uff49","\uff4a","\uff4b","\uff4c","\uff4d","\uff4e","\uff4f","\uff50","\uff51","\uff52","\uff53","\uff54","\uff55","\uff56","\uff57","\uff58","\uff59","\uff5a"],b=["\ud835\udc00","\ud835\udc01","\ud835\udc02","\ud835\udc03","\ud835\udc04","\ud835\udc05","\ud835\udc06","\ud835\udc07","\ud835\udc08","\ud835\udc09","\ud835\udc0a","\ud835\udc0b","\ud835\udc0c","\ud835\udc0d","\ud835\udc0e","\ud835\udc0f","\ud835\udc10","\ud835\udc11","\ud835\udc12","\ud835\udc13","\ud835\udc14","\ud835\udc15","\ud835\udc16","\ud835\udc17","\ud835\udc18","\ud835\udc19"],v=["\ud835\udc1a","\ud835\udc1b","\ud835\udc1c","\ud835\udc1d","\ud835\udc1e","\ud835\udc1f","\ud835\udc20","\ud835\udc21","\ud835\udc22","\ud835\udc23","\ud835\udc24","\ud835\udc25","\ud835\udc26","\ud835\udc27","\ud835\udc28","\ud835\udc29","\ud835\udc2a","\ud835\udc2b","\ud835\udc2c","\ud835\udc2d","\ud835\udc2e","\ud835\udc2f","\ud835\udc30","\ud835\udc31","\ud835\udc32","\ud835\udc33"],_=["\ud835\udc34","\ud835\udc35","\ud835\udc36","\ud835\udc37","\ud835\udc38","\ud835\udc39","\ud835\udc3a","\ud835\udc3b","\ud835\udc3c","\ud835\udc3d","\ud835\udc3e","\ud835\udc3f","\ud835\udc40","\ud835\udc41","\ud835\udc42","\ud835\udc43","\ud835\udc44","\ud835\udc45","\ud835\udc46","\ud835\udc47","\ud835\udc48","\ud835\udc49","\ud835\udc4a","\ud835\udc4b","\ud835\udc4c","\ud835\udc4d"],S=["\ud835\udc4e","\ud835\udc4f","\ud835\udc50","\ud835\udc51","\ud835\udc52","\ud835\udc53","\ud835\udc54","\u210e","\ud835\udc56","\ud835\udc57","\ud835\udc58","\ud835\udc59","\ud835\udc5a","\ud835\udc5b","\ud835\udc5c","\ud835\udc5d","\ud835\udc5e","\ud835\udc5f","\ud835\udc60","\ud835\udc61","\ud835\udc62","\ud835\udc63","\ud835\udc64","\ud835\udc65","\ud835\udc66","\ud835\udc67","\ud835\udea4","\ud835\udea5"],O=["\ud835\udc68","\ud835\udc69","\ud835\udc6a","\ud835\udc6b","\ud835\udc6c","\ud835\udc6d","\ud835\udc6e","\ud835\udc6f","\ud835\udc70","\ud835\udc71","\ud835\udc72","\ud835\udc73","\ud835\udc74","\ud835\udc75","\ud835\udc76","\ud835\udc77","\ud835\udc78","\ud835\udc79","\ud835\udc7a","\ud835\udc7b","\ud835\udc7c","\ud835\udc7d","\ud835\udc7e","\ud835\udc7f","\ud835\udc80","\ud835\udc81"],M=["\ud835\udc82","\ud835\udc83","\ud835\udc84","\ud835\udc85","\ud835\udc86","\ud835\udc87","\ud835\udc88","\ud835\udc89","\ud835\udc8a","\ud835\udc8b","\ud835\udc8c","\ud835\udc8d","\ud835\udc8e","\ud835\udc8f","\ud835\udc90","\ud835\udc91","\ud835\udc92","\ud835\udc93","\ud835\udc94","\ud835\udc95","\ud835\udc96","\ud835\udc97","\ud835\udc98","\ud835\udc99","\ud835\udc9a","\ud835\udc9b"],x=["\ud835\udc9c","\u212c","\ud835\udc9e","\ud835\udc9f","\u2130","\u2131","\ud835\udca2","\u210b","\u2110","\ud835\udca5","\ud835\udca6","\u2112","\u2133","\ud835\udca9","\ud835\udcaa","\ud835\udcab","\ud835\udcac","\u211b","\ud835\udcae","\ud835\udcaf","\ud835\udcb0","\ud835\udcb1","\ud835\udcb2","\ud835\udcb3","\ud835\udcb4","\ud835\udcb5","\u2118"],E=["\ud835\udcb6","\ud835\udcb7","\ud835\udcb8","\ud835\udcb9","\u212f","\ud835\udcbb","\u210a","\ud835\udcbd","\ud835\udcbe","\ud835\udcbf","\ud835\udcc0","\ud835\udcc1","\ud835\udcc2","\ud835\udcc3","\u2134","\ud835\udcc5","\ud835\udcc6","\ud835\udcc7","\ud835\udcc8","\ud835\udcc9","\ud835\udcca","\ud835\udccb","\ud835\udccc","\ud835\udccd","\ud835\udcce","\ud835\udccf","\u2113"],A=["\ud835\udcd0","\ud835\udcd1","\ud835\udcd2","\ud835\udcd3","\ud835\udcd4","\ud835\udcd5","\ud835\udcd6","\ud835\udcd7","\ud835\udcd8","\ud835\udcd9","\ud835\udcda","\ud835\udcdb","\ud835\udcdc","\ud835\udcdd","\ud835\udcde","\ud835\udcdf","\ud835\udce0","\ud835\udce1","\ud835\udce2","\ud835\udce3","\ud835\udce4","\ud835\udce5","\ud835\udce6","\ud835\udce7","\ud835\udce8","\ud835\udce9"],C=["\ud835\udcea","\ud835\udceb","\ud835\udcec","\ud835\udced","\ud835\udcee","\ud835\udcef","\ud835\udcf0","\ud835\udcf1","\ud835\udcf2","\ud835\udcf3","\ud835\udcf4","\ud835\udcf5","\ud835\udcf6","\ud835\udcf7","\ud835\udcf8","\ud835\udcf9","\ud835\udcfa","\ud835\udcfb","\ud835\udcfc","\ud835\udcfd","\ud835\udcfe","\ud835\udcff","\ud835\udd00","\ud835\udd01","\ud835\udd02","\ud835\udd03"],T=["\ud835\udd04","\ud835\udd05","\u212d","\ud835\udd07","\ud835\udd08","\ud835\udd09","\ud835\udd0a","\u210c","\u2111","\ud835\udd0d","\ud835\udd0e","\ud835\udd0f","\ud835\udd10","\ud835\udd11","\ud835\udd12","\ud835\udd13","\ud835\udd14","\u211c","\ud835\udd16","\ud835\udd17","\ud835\udd18","\ud835\udd19","\ud835\udd1a","\ud835\udd1b","\ud835\udd1c","\u2128"],N=["\ud835\udd1e","\ud835\udd1f","\ud835\udd20","\ud835\udd21","\ud835\udd22","\ud835\udd23","\ud835\udd24","\ud835\udd25","\ud835\udd26","\ud835\udd27","\ud835\udd28","\ud835\udd29","\ud835\udd2a","\ud835\udd2b","\ud835\udd2c","\ud835\udd2d","\ud835\udd2e","\ud835\udd2f","\ud835\udd30","\ud835\udd31","\ud835\udd32","\ud835\udd33","\ud835\udd34","\ud835\udd35","\ud835\udd36","\ud835\udd37"],w=["\ud835\udd38","\ud835\udd39","\u2102","\ud835\udd3b","\ud835\udd3c","\ud835\udd3d","\ud835\udd3e","\u210d","\ud835\udd40","\ud835\udd41","\ud835\udd42","\ud835\udd43","\ud835\udd44","\u2115","\ud835\udd46","\u2119","\u211a","\u211d","\ud835\udd4a","\ud835\udd4b","\ud835\udd4c","\ud835\udd4d","\ud835\udd4e","\ud835\udd4f","\ud835\udd50","\u2124"],L=["\ud835\udd52","\ud835\udd53","\ud835\udd54","\ud835\udd55","\ud835\udd56","\ud835\udd57","\ud835\udd58","\ud835\udd59","\ud835\udd5a","\ud835\udd5b","\ud835\udd5c","\ud835\udd5d","\ud835\udd5e","\ud835\udd5f","\ud835\udd60","\ud835\udd61","\ud835\udd62","\ud835\udd63","\ud835\udd64","\ud835\udd65","\ud835\udd66","\ud835\udd67","\ud835\udd68","\ud835\udd69","\ud835\udd6a","\ud835\udd6b"],I=["\ud835\udd6c","\ud835\udd6d","\ud835\udd6e","\ud835\udd6f","\ud835\udd70","\ud835\udd71","\ud835\udd72","\ud835\udd73","\ud835\udd74","\ud835\udd75","\ud835\udd76","\ud835\udd77","\ud835\udd78","\ud835\udd79","\ud835\udd7a","\ud835\udd7b","\ud835\udd7c","\ud835\udd7d","\ud835\udd7e","\ud835\udd7f","\ud835\udd80","\ud835\udd81","\ud835\udd82","\ud835\udd83","\ud835\udd84","\ud835\udd85"],P=["\ud835\udd86","\ud835\udd87","\ud835\udd88","\ud835\udd89","\ud835\udd8a","\ud835\udd8b","\ud835\udd8c","\ud835\udd8d","\ud835\udd8e","\ud835\udd8f","\ud835\udd90","\ud835\udd91","\ud835\udd92","\ud835\udd93","\ud835\udd94","\ud835\udd95","\ud835\udd96","\ud835\udd97","\ud835\udd98","\ud835\udd99","\ud835\udd9a","\ud835\udd9b","\ud835\udd9c","\ud835\udd9d","\ud835\udd9e","\ud835\udd9f"],R=["\ud835\udda0","\ud835\udda1","\ud835\udda2","\ud835\udda3","\ud835\udda4","\ud835\udda5","\ud835\udda6","\ud835\udda7","\ud835\udda8","\ud835\udda9","\ud835\uddaa","\ud835\uddab","\ud835\uddac","\ud835\uddad","\ud835\uddae","\ud835\uddaf","\ud835\uddb0","\ud835\uddb1","\ud835\uddb2","\ud835\uddb3","\ud835\uddb4","\ud835\uddb5","\ud835\uddb6","\ud835\uddb7","\ud835\uddb8","\ud835\uddb9"],k=["\ud835\uddba","\ud835\uddbb","\ud835\uddbc","\ud835\uddbd","\ud835\uddbe","\ud835\uddbf","\ud835\uddc0","\ud835\uddc1","\ud835\uddc2","\ud835\uddc3","\ud835\uddc4","\ud835\uddc5","\ud835\uddc6","\ud835\uddc7","\ud835\uddc8","\ud835\uddc9","\ud835\uddca","\ud835\uddcb","\ud835\uddcc","\ud835\uddcd","\ud835\uddce","\ud835\uddcf","\ud835\uddd0","\ud835\uddd1","\ud835\uddd2","\ud835\uddd3"],j=["\ud835\uddd4","\ud835\uddd5","\ud835\uddd6","\ud835\uddd7","\ud835\uddd8","\ud835\uddd9","\ud835\uddda","\ud835\udddb","\ud835\udddc","\ud835\udddd","\ud835\uddde","\ud835\udddf","\ud835\udde0","\ud835\udde1","\ud835\udde2","\ud835\udde3","\ud835\udde4","\ud835\udde5","\ud835\udde6","\ud835\udde7","\ud835\udde8","\ud835\udde9","\ud835\uddea","\ud835\uddeb","\ud835\uddec","\ud835\udded"],B=["\ud835\uddee","\ud835\uddef","\ud835\uddf0","\ud835\uddf1","\ud835\uddf2","\ud835\uddf3","\ud835\uddf4","\ud835\uddf5","\ud835\uddf6","\ud835\uddf7","\ud835\uddf8","\ud835\uddf9","\ud835\uddfa","\ud835\uddfb","\ud835\uddfc","\ud835\uddfd","\ud835\uddfe","\ud835\uddff","\ud835\ude00","\ud835\ude01","\ud835\ude02","\ud835\ude03","\ud835\ude04","\ud835\ude05","\ud835\ude06","\ud835\ude07"],D=["\ud835\ude08","\ud835\ude09","\ud835\ude0a","\ud835\ude0b","\ud835\ude0c","\ud835\ude0d","\ud835\ude0e","\ud835\ude0f","\ud835\ude10","\ud835\ude11","\ud835\ude12","\ud835\ude13","\ud835\ude14","\ud835\ude15","\ud835\ude16","\ud835\ude17","\ud835\ude18","\ud835\ude19","\ud835\ude1a","\ud835\ude1b","\ud835\ude1c","\ud835\ude1d","\ud835\ude1e","\ud835\ude1f","\ud835\ude20","\ud835\ude21"],F=["\ud835\ude22","\ud835\ude23","\ud835\ude24","\ud835\ude25","\ud835\ude26","\ud835\ude27","\ud835\ude28","\ud835\ude29","\ud835\ude2a","\ud835\ude2b","\ud835\ude2c","\ud835\ude2d","\ud835\ude2e","\ud835\ude2f","\ud835\ude30","\ud835\ude31","\ud835\ude32","\ud835\ude33","\ud835\ude34","\ud835\ude35","\ud835\ude36","\ud835\ude37","\ud835\ude38","\ud835\ude39","\ud835\ude3a","\ud835\ude3b"],H=["\ud835\ude3c","\ud835\ude3d","\ud835\ude3e","\ud835\ude3f","\ud835\ude40","\ud835\ude41","\ud835\ude42","\ud835\ude43","\ud835\ude44","\ud835\ude45","\ud835\ude46","\ud835\ude47","\ud835\ude48","\ud835\ude49","\ud835\ude4a","\ud835\ude4b","\ud835\ude4c","\ud835\ude4d","\ud835\ude4e","\ud835\ude4f","\ud835\ude50","\ud835\ude51","\ud835\ude52","\ud835\ude53","\ud835\ude54","\ud835\ude55"],U=["\ud835\ude56","\ud835\ude57","\ud835\ude58","\ud835\ude59","\ud835\ude5a","\ud835\ude5b","\ud835\ude5c","\ud835\ude5d","\ud835\ude5e","\ud835\ude5f","\ud835\ude60","\ud835\ude61","\ud835\ude62","\ud835\ude63","\ud835\ude64","\ud835\ude65","\ud835\ude66","\ud835\ude67","\ud835\ude68","\ud835\ude69","\ud835\ude6a","\ud835\ude6b","\ud835\ude6c","\ud835\ude6d","\ud835\ude6e","\ud835\ude6f"],X=["\ud835\ude70","\ud835\ude71","\ud835\ude72","\ud835\ude73","\ud835\ude74","\ud835\ude75","\ud835\ude76","\ud835\ude77","\ud835\ude78","\ud835\ude79","\ud835\ude7a","\ud835\ude7b","\ud835\ude7c","\ud835\ude7d","\ud835\ude7e","\ud835\ude7f","\ud835\ude80","\ud835\ude81","\ud835\ude82","\ud835\ude83","\ud835\ude84","\ud835\ude85","\ud835\ude86","\ud835\ude87","\ud835\ude88","\ud835\ude89"],V=["\ud835\ude8a","\ud835\ude8b","\ud835\ude8c","\ud835\ude8d","\ud835\ude8e","\ud835\ude8f","\ud835\ude90","\ud835\ude91","\ud835\ude92","\ud835\ude93","\ud835\ude94","\ud835\ude95","\ud835\ude96","\ud835\ude97","\ud835\ude98","\ud835\ude99","\ud835\ude9a","\ud835\ude9b","\ud835\ude9c","\ud835\ude9d","\ud835\ude9e","\ud835\ude9f","\ud835\udea0","\ud835\udea1","\ud835\udea2","\ud835\udea3"],q=["\u2145","\u2146","\u2147","\u2148","\u2149"],W=["\u0391","\u0392","\u0393","\u0394","\u0395","\u0396","\u0397","\u0398","\u0399","\u039a","\u039b","\u039c","\u039d","\u039e","\u039f","\u03a0","\u03a1","\u03a3","\u03a4","\u03a5","\u03a6","\u03a7","\u03a8","\u03a9"],G=["\u03b1","\u03b2","\u03b3","\u03b4","\u03b5","\u03b6","\u03b7","\u03b8","\u03b9","\u03ba","\u03bb","\u03bc","\u03bd","\u03be","\u03bf","\u03c0","\u03c1","\u03c2","\u03c3","\u03c4","\u03c5","\u03c6","\u03c7","\u03c8","\u03c9"],z=["\ud835\udea8","\ud835\udea9","\ud835\udeaa","\ud835\udeab","\ud835\udeac","\ud835\udead","\ud835\udeae","\ud835\udeaf","\ud835\udeb0","\ud835\udeb1","\ud835\udeb2","\ud835\udeb3","\ud835\udeb4","\ud835\udeb5","\ud835\udeb6","\ud835\udeb7","\ud835\udeb8","\ud835\udeba","\ud835\udebb","\ud835\udebc","\ud835\udebd","\ud835\udebe","\ud835\udebf","\ud835\udec0"],J=["\ud835\udec2","\ud835\udec3","\ud835\udec4","\ud835\udec5","\ud835\udec6","\ud835\udec7","\ud835\udec8","\ud835\udec9","\ud835\udeca","\ud835\udecb","\ud835\udecc","\ud835\udecd","\ud835\udece","\ud835\udecf","\ud835\uded0","\ud835\uded1","\ud835\uded2","\ud835\uded3","\ud835\uded4","\ud835\uded5","\ud835\uded6","\ud835\uded7","\ud835\uded8","\ud835\uded9","\ud835\udeda"],K=["\ud835\udee2","\ud835\udee3","\ud835\udee4","\ud835\udee5","\ud835\udee6","\ud835\udee7","\ud835\udee8","\ud835\udee9","\ud835\udeea","\ud835\udeeb","\ud835\udeec","\ud835\udeed","\ud835\udeee","\ud835\udeef","\ud835\udef0","\ud835\udef1","\ud835\udef2","\ud835\udef4","\ud835\udef5","\ud835\udef6","\ud835\udef7","\ud835\udef8","\ud835\udef9","\ud835\udefa"],$=["\ud835\udefc","\ud835\udefd","\ud835\udefe","\ud835\udeff","\ud835\udf00","\ud835\udf01","\ud835\udf02","\ud835\udf03","\ud835\udf04","\ud835\udf05","\ud835\udf06","\ud835\udf07","\ud835\udf08","\ud835\udf09","\ud835\udf0a","\ud835\udf0b","\ud835\udf0c","\ud835\udf0d","\ud835\udf0e","\ud835\udf0f","\ud835\udf10","\ud835\udf11","\ud835\udf12","\ud835\udf13","\ud835\udf14"],Y=["\ud835\udf1c","\ud835\udf1d","\ud835\udf1e","\ud835\udf1f","\ud835\udf20","\ud835\udf21","\ud835\udf22","\ud835\udf23","\ud835\udf24","\ud835\udf25","\ud835\udf26","\ud835\udf27","\ud835\udf28","\ud835\udf29","\ud835\udf2a","\ud835\udf2b","\ud835\udf2c","\ud835\udf2e","\ud835\udf2f","\ud835\udf30","\ud835\udf31","\ud835\udf32","\ud835\udf33","\ud835\udf34"],Z=["\ud835\udf36","\ud835\udf37","\ud835\udf38","\ud835\udf39","\ud835\udf3a","\ud835\udf3b","\ud835\udf3c","\ud835\udf3d","\ud835\udf3e","\ud835\udf3f","\ud835\udf40","\ud835\udf41","\ud835\udf42","\ud835\udf43","\ud835\udf44","\ud835\udf45","\ud835\udf46","\ud835\udf47","\ud835\udf48","\ud835\udf49","\ud835\udf4a","\ud835\udf4b","\ud835\udf4c","\ud835\udf4d","\ud835\udf4e"],Q=["\ud835\udf56","\ud835\udf57","\ud835\udf58","\ud835\udf59","\ud835\udf5a","\ud835\udf5b","\ud835\udf5c","\ud835\udf5d","\ud835\udf5e","\ud835\udf5f","\ud835\udf60","\ud835\udf61","\ud835\udf62","\ud835\udf63","\ud835\udf64","\ud835\udf65","\ud835\udf66","\ud835\udf68","\ud835\udf69","\ud835\udf6a","\ud835\udf6b","\ud835\udf6c","\ud835\udf6d","\ud835\udf6e"],tt=["\ud835\udf70","\ud835\udf71","\ud835\udf72","\ud835\udf73","\ud835\udf74","\ud835\udf75","\ud835\udf76","\ud835\udf77","\ud835\udf78","\ud835\udf79","\ud835\udf7a","\ud835\udf7b","\ud835\udf7c","\ud835\udf7d","\ud835\udf7e","\ud835\udf7f","\ud835\udf80","\ud835\udf81","\ud835\udf82","\ud835\udf83","\ud835\udf84","\ud835\udf85","\ud835\udf86","\ud835\udf87","\ud835\udf88"],et=["\ud835\udf90","\ud835\udf91","\ud835\udf92","\ud835\udf93","\ud835\udf94","\ud835\udf95","\ud835\udf96","\ud835\udf97","\ud835\udf98","\ud835\udf99","\ud835\udf9a","\ud835\udf9b","\ud835\udf9c","\ud835\udf9d","\ud835\udf9e","\ud835\udf9f","\ud835\udfa0","\ud835\udfa2","\ud835\udfa3","\ud835\udfa4","\ud835\udfa5","\ud835\udfa6","\ud835\udfa7","\ud835\udfa8"],rt=["\ud835\udfaa","\ud835\udfab","\ud835\udfac","\ud835\udfad","\ud835\udfae","\ud835\udfaf","\ud835\udfb0","\ud835\udfb1","\ud835\udfb2","\ud835\udfb3","\ud835\udfb4","\ud835\udfb5","\ud835\udfb6","\ud835\udfb7","\ud835\udfb8","\ud835\udfb9","\ud835\udfba","\ud835\udfbb","\ud835\udfbc","\ud835\udfbd","\ud835\udfbe","\ud835\udfbf","\ud835\udfc0","\ud835\udfc1","\ud835\udfc2"],nt=["\u213c","\u213d","\u213e","\u213f"],ot=["\u03d0","\u03d1","\u03d5","\u03d6","\u03d7","\u03f0","\u03f1","\u03f5","\u03f6","\u03f4"],it=["\ud835\udedc","\ud835\udedd","\ud835\udede","\ud835\udedf","\ud835\udee0","\ud835\udee1"],st=["\ud835\udf16","\ud835\udf17","\ud835\udf18","\ud835\udf19","\ud835\udf1a","\ud835\udf1b"],at=["\ud835\udf8a","\ud835\udf8b","\ud835\udf8c","\ud835\udf8d","\ud835\udf8e","\ud835\udf8f"],lt=["\u2135","\u2136","\u2137","\u2138"],ct=d.concat(m,y,g,b,v,_,O,M,S,x,E,A,C,T,N,w,L,I,P,R,k,j,B,D,F,H,U,X,V,q,W,G,z,J,K,$,Y,Z,Q,tt,nt,ot,et,rt,it,st,at,lt);e.allLettersRegExp=new RegExp(ct.join("|"));const ut=["+","\xb1","\u2213","\u2214","\u2227","\u2228","\u2229","\u222a","\u228c","\u228d","\u228e","\u2293","\u2294","\u229d","\u229e","\u22a4","\u22a5","\u22ba","\u22bb","\u22bc","\u22c4","\u22ce","\u22cf","\u22d2","\u22d3","\u2a5e","\u2295","\u22d4"],pt=String.fromCodePoint(8292);ut.push(pt);const ht=["\u2020","\u2021","\u2210","\u2217","\u2218","\u2219","\u2240","\u229a","\u229b","\u22a0","\u22a1","\u22c5","\u22c6","\u22c7","\u22c8","\u22c9","\u22ca","\u22cb","\u22cc","\u25cb","\xb7","*","\u2297","\u2299"],ft=String.fromCodePoint(8290);ht.push(ft);const dt=String.fromCodePoint(8289),mt=["\xbc","\xbd","\xbe","\u2150","\u2151","\u2152","\u2153","\u2154","\u2155","\u2156","\u2157","\u2158","\u2159","\u215a","\u215b","\u215c","\u215d","\u215e","\u215f","\u2189"],yt=["\xb2","\xb3","\xb9","\u2070","\u2074","\u2075","\u2076","\u2077","\u2078","\u2079"].concat(["\u2080","\u2081","\u2082","\u2083","\u2084","\u2085","\u2086","\u2087","\u2088","\u2089"],["\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246a","\u246b","\u246c","\u246d","\u246e","\u246f","\u2470","\u2471","\u2472","\u2473","\u24ea","\u24eb","\u24ec","\u24ed","\u24ee","\u24ef","\u24f0","\u24f1","\u24f2","\u24f3","\u24f4","\u24f5","\u24f6","\u24f7","\u24f8","\u24f9","\u24fa","\u24fb","\u24fc","\u24fd","\u24fe","\u24ff","\u2776","\u2777","\u2778","\u2779","\u277a","\u277b","\u277c","\u277d","\u277e","\u277f","\u2780","\u2781","\u2782","\u2783","\u2784","\u2785","\u2786","\u2787","\u2788","\u2789","\u278a","\u278b","\u278c","\u278d","\u278e","\u278f","\u2790","\u2791","\u2792","\u2793","\u3248","\u3249","\u324a","\u324b","\u324c","\u324d","\u324e","\u324f","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325a","\u325b","\u325c","\u325d","\u325e","\u325f","\u32b1","\u32b2","\u32b3","\u32b4","\u32b5","\u32b6","\u32b7","\u32b8","\u32b9","\u32ba","\u32bb","\u32bc","\u32bd","\u32be","\u32bf"],["\u2474","\u2475","\u2476","\u2477","\u2478","\u2479","\u247a","\u247b","\u247c","\u247d","\u247e","\u247f","\u2480","\u2481","\u2482","\u2483","\u2484","\u2485","\u2486","\u2487"],["\u2488","\u2489","\u248a","\u248b","\u248c","\u248d","\u248e","\u248f","\u2490","\u2491","\u2492","\u2493","\u2494","\u2495","\u2496","\u2497","\u2498","\u2499","\u249a","\u249b","\ud83c\udd00","\ud83c\udd01","\ud83c\udd02","\ud83c\udd03","\ud83c\udd04","\ud83c\udd05","\ud83c\udd06","\ud83c\udd07","\ud83c\udd08","\ud83c\udd09","\ud83c\udd0a"]),gt=["cos","cot","csc","sec","sin","tan","arccos","arccot","arccsc","arcsec","arcsin","arctan","arc cos","arc cot","arc csc","arc sec","arc sin","arc tan"].concat(["cosh","coth","csch","sech","sinh","tanh","arcosh","arcoth","arcsch","arsech","arsinh","artanh","arccosh","arccoth","arccsch","arcsech","arcsinh","arctanh"],["deg","det","dim","hom","ker","Tr","tr"],["log","ln","lg","exp","expt","gcd","gcd","arg","im","re","Pr"]),bt=[{set:["!",'"',"#","%","&",";","?","@","\\","\xa1","\xa7","\xb6","\xbf","\u2017","\u2020","\u2021","\u2022","\u2023","\u2024","\u2025","\u2027","\u2030","\u2031","\u2038","\u203b","\u203c","\u203d","\u203e","\u2041","\u2042","\u2043","\u2047","\u2048","\u2049","\u204b","\u204c","\u204d","\u204e","\u204f","\u2050","\u2051","\u2053","\u2055","\u2056","\u2058","\u2059","\u205a","\u205b","\u205c","\u205d","\u205e","\ufe10","\ufe14","\ufe15","\ufe16","\ufe30","\ufe45","\ufe46","\ufe49","\ufe4a","\ufe4b","\ufe4c","\ufe54","\ufe56","\ufe57","\ufe5f","\ufe60","\ufe61","\ufe68","\ufe6a","\ufe6b","\uff01","\uff02","\uff03","\uff05","\uff06","\uff07","\uff0a","\uff0f","\uff1b","\uff1f","\uff20","\uff3c"],type:"punctuation",role:"unknown"},{set:["\ufe13",":","\uff1a","\ufe55"],type:"punctuation",role:"colon"},{set:n,type:"punctuation",role:"comma"},{set:["\u2026","\u22ee","\u22ef","\u22f0","\u22f1","\ufe19"],type:"punctuation",role:"ellipsis"},{set:[".","\ufe52","\uff0e"],type:"punctuation",role:"fullstop"},{set:o,type:"operator",role:"dash"},{set:i,type:"operator",role:"tilde"},{set:["'","\u2032","\u2033","\u2034","\u2035","\u2036","\u2037","\u2057","\u02b9","\u02ba"],type:"punctuation",role:"prime"},{set:["\xb0"],type:"punctuation",role:"degree"},{set:l,type:"fence",role:"open"},{set:c,type:"fence",role:"close"},{set:u,type:"fence",role:"top"},{set:p,type:"fence",role:"bottom"},{set:h,type:"fence",role:"neutral"},{set:f,type:"fence",role:"metric"},{set:m,type:"identifier",role:"latinletter",font:"normal"},{set:d,type:"identifier",role:"latinletter",font:"normal"},{set:g,type:"identifier",role:"latinletter",font:"normal"},{set:y,type:"identifier",role:"latinletter",font:"normal"},{set:v,type:"identifier",role:"latinletter",font:"bold"},{set:b,type:"identifier",role:"latinletter",font:"bold"},{set:S,type:"identifier",role:"latinletter",font:"italic"},{set:_,type:"identifier",role:"latinletter",font:"italic"},{set:M,type:"identifier",role:"latinletter",font:"bold-italic"},{set:O,type:"identifier",role:"latinletter",font:"bold-italic"},{set:E,type:"identifier",role:"latinletter",font:"script"},{set:x,type:"identifier",role:"latinletter",font:"script"},{set:C,type:"identifier",role:"latinletter",font:"bold-script"},{set:A,type:"identifier",role:"latinletter",font:"bold-script"},{set:N,type:"identifier",role:"latinletter",font:"fraktur"},{set:T,type:"identifier",role:"latinletter",font:"fraktur"},{set:L,type:"identifier",role:"latinletter",font:"double-struck"},{set:w,type:"identifier",role:"latinletter",font:"double-struck"},{set:P,type:"identifier",role:"latinletter",font:"bold-fraktur"},{set:I,type:"identifier",role:"latinletter",font:"bold-fraktur"},{set:k,type:"identifier",role:"latinletter",font:"sans-serif"},{set:R,type:"identifier",role:"latinletter",font:"sans-serif"},{set:B,type:"identifier",role:"latinletter",font:"sans-serif-bold"},{set:j,type:"identifier",role:"latinletter",font:"sans-serif-bold"},{set:F,type:"identifier",role:"latinletter",font:"sans-serif-italic"},{set:D,type:"identifier",role:"latinletter",font:"sans-serif-italic"},{set:U,type:"identifier",role:"latinletter",font:"sans-serif-bold-italic"},{set:H,type:"identifier",role:"latinletter",font:"sans-serif-bold-italic"},{set:V,type:"identifier",role:"latinletter",font:"monospace"},{set:X,type:"identifier",role:"latinletter",font:"monospace"},{set:q,type:"identifier",role:"latinletter",font:"double-struck-italic"},{set:G,type:"identifier",role:"greekletter",font:"normal"},{set:W,type:"identifier",role:"greekletter",font:"normal"},{set:J,type:"identifier",role:"greekletter",font:"bold"},{set:z,type:"identifier",role:"greekletter",font:"bold"},{set:$,type:"identifier",role:"greekletter",font:"italic"},{set:K,type:"identifier",role:"greekletter",font:"italic"},{set:Z,type:"identifier",role:"greekletter",font:"bold-italic"},{set:Y,type:"identifier",role:"greekletter",font:"bold-italic"},{set:tt,type:"identifier",role:"greekletter",font:"sans-serif-bold"},{set:Q,type:"identifier",role:"greekletter",font:"sans-serif-bold"},{set:et,type:"identifier",role:"greekletter",font:"sans-serif-bold-italic"},{set:rt,type:"identifier",role:"greekletter",font:"sans-serif-bold-italic"},{set:nt,type:"identifier",role:"greekletter",font:"double-struck"},{set:ot,type:"identifier",role:"greekletter",font:"normal"},{set:it,type:"identifier",role:"greekletter",font:"bold"},{set:st,type:"identifier",role:"greekletter",font:"italic"},{set:at,type:"identifier",role:"greekletter",font:"sans-serif-bold"},{set:lt,type:"identifier",role:"otherletter",font:"normal"},{set:["0","1","2","3","4","5","6","7","8","9"],type:"number",role:"integer",font:"normal"},{set:["\uff10","\uff11","\uff12","\uff13","\uff14","\uff15","\uff16","\uff17","\uff18","\uff19"],type:"number",role:"integer",font:"normal"},{set:["\ud835\udfce","\ud835\udfcf","\ud835\udfd0","\ud835\udfd1","\ud835\udfd2","\ud835\udfd3","\ud835\udfd4","\ud835\udfd5","\ud835\udfd6","\ud835\udfd7"],type:"number",role:"integer",font:"bold"},{set:["\ud835\udfd8","\ud835\udfd9","\ud835\udfda","\ud835\udfdb","\ud835\udfdc","\ud835\udfdd","\ud835\udfde","\ud835\udfdf","\ud835\udfe0","\ud835\udfe1"],type:"number",role:"integer",font:"double-struck"},{set:["\ud835\udfe2","\ud835\udfe3","\ud835\udfe4","\ud835\udfe5","\ud835\udfe6","\ud835\udfe7","\ud835\udfe8","\ud835\udfe9","\ud835\udfea","\ud835\udfeb"],type:"number",role:"integer",font:"sans-serif"},{set:["\ud835\udfec","\ud835\udfed","\ud835\udfee","\ud835\udfef","\ud835\udff0","\ud835\udff1","\ud835\udff2","\ud835\udff3","\ud835\udff4","\ud835\udff5"],type:"number",role:"integer",font:"sans-serif-bold"},{set:["\ud835\udff6","\ud835\udff7","\ud835\udff8","\ud835\udff9","\ud835\udffa","\ud835\udffb","\ud835\udffc","\ud835\udffd","\ud835\udffe","\ud835\udfff"],type:"number",role:"integer",font:"monospace"},{set:mt,type:"number",role:"float"},{set:yt,type:"number",role:"othernumber"},{set:ut,type:"operator",role:"addition"},{set:ht,type:"operator",role:"multiplication"},{set:["\xaf","-","\u2052","\u207b","\u208b","\u2212","\u2216","\u2238","\u2242","\u2296","\u229f","\u2796","\u2a29","\u2a2a","\u2a2b","\u2a2c","\u2a3a","\u2a41","\ufe63","\uff0d","\u2010","\u2011"],type:"operator",role:"subtraction"},{set:["/","\xf7","\u2044","\u2215","\u2298","\u27cc","\u29bc","\u2a38"],type:"operator",role:"division"},{set:["\u2200","\u2203","\u2206","\u2207","\u2202","\u2201","\u2204"],type:"operator",role:"prefix operator"},{set:["\ud835\udec1","\ud835\udedb","\ud835\udfca","\ud835\udfcb"],type:"operator",role:"prefix operator",font:"bold"},{set:["\ud835\udefb","\ud835\udf15"],type:"operator",role:"prefix operator",font:"italic"},{set:["\ud835\udf6f","\ud835\udf89"],type:"operator",role:"prefix operator",font:"sans-serif-bold"},{set:["=","~","\u207c","\u208c","\u223c","\u223d","\u2243","\u2245","\u2248","\u224a","\u224b","\u224c","\u224d","\u224e","\u2251","\u2252","\u2253","\u2254","\u2255","\u2256","\u2257","\u2258","\u2259","\u225a","\u225b","\u225c","\u225d","\u225e","\u225f","\u2261","\u2263","\u29e4","\u2a66","\u2a6e","\u2a6f","\u2a70","\u2a71","\u2a72","\u2a73","\u2a74","\u2a75","\u2a76","\u2a77","\u2a78","\u22d5","\u2a6d","\u2a6a","\u2a6b","\u2a6c","\ufe66","\uff1d","\u2a6c","\u229c","\u2237"],type:"relation",role:"equality"},{set:["<",">","\u2241","\u2242","\u2244","\u2246","\u2247","\u2249","\u224f","\u2250","\u2260","\u2262","\u2264","\u2265","\u2266","\u2267","\u2268","\u2269","\u226a","\u226b","\u226c","\u226d","\u226e","\u226f","\u2270","\u2271","\u2272","\u2273","\u2274","\u2275","\u2276","\u2277","\u2278","\u2279","\u227a","\u227b","\u227c","\u227d","\u227e","\u227f","\u2280","\u2281","\u22d6","\u22d7","\u22d8","\u22d9","\u22da","\u22db","\u22dc","\u22dd","\u22de","\u22df","\u22e0","\u22e1","\u22e6","\u22e7","\u22e8","\u22e9","\u2a79","\u2a7a","\u2a7b","\u2a7c","\u2a7d","\u2a7e","\u2a7f","\u2a80","\u2a81","\u2a82","\u2a83","\u2a84","\u2a85","\u2a86","\u2a87","\u2a88","\u2a89","\u2a8a","\u2a8b","\u2a8c","\u2a8d","\u2a8e","\u2a8f","\u2a90","\u2a91","\u2a92","\u2a93","\u2a94","\u2a95","\u2a96","\u2a97","\u2a98","\u2a99","\u2a9a","\u2a9b","\u2a9c","\u2a9d","\u2a9e","\u2a9f","\u2aa0","\u2aa1","\u2aa2","\u2aa3","\u2aa4","\u2aa5","\u2aa6","\u2aa7","\u2aa8","\u2aa9","\u2aaa","\u2aab","\u2aac","\u2aad","\u2aae","\u2aaf","\u2ab0","\u2ab1","\u2ab2","\u2ab3","\u2ab4","\u2ab5","\u2ab6","\u2ab7","\u2ab8","\u2ab9","\u2aba","\u2abb","\u2abc","\u2af7","\u2af8","\u2af9","\u2afa","\u29c0","\u29c1","\ufe64","\ufe65","\uff1c","\uff1e"],type:"relation",role:"inequality"},{set:["\u22e2","\u22e3","\u22e4","\u22e5","\u2282","\u2283","\u2284","\u2285","\u2286","\u2287","\u2288","\u2289","\u228a","\u228b","\u228f","\u2290","\u2291","\u2292","\u2abd","\u2abe","\u2abf","\u2ac0","\u2ac1","\u2ac2","\u2ac3","\u2ac4","\u2ac5","\u2ac6","\u2ac7","\u2ac8","\u2ac9","\u2aca","\u2acb","\u2acc","\u2acd","\u2ace","\u2acf","\u2ad0","\u2ad1","\u2ad2","\u2ad3","\u2ad4","\u2ad5","\u2ad6","\u2ad7","\u2ad8","\u22d0","\u22d1","\u22ea","\u22eb","\u22ec","\u22ed","\u22b2","\u22b3","\u22b4","\u22b5"],type:"relation",role:"set"},{set:["\u22a2","\u22a3","\u22a6","\u22a7","\u22a8","\u22a9","\u22aa","\u22ab","\u22ac","\u22ad","\u22ae","\u22af","\u2ade","\u2adf","\u2ae0","\u2ae1","\u2ae2","\u2ae3","\u2ae4","\u2ae5","\u2ae6","\u2ae7","\u2ae8","\u2ae9","\u2aea","\u2aeb","\u2aec","\u2aed"],type:"relation",role:"unknown"},{set:["\u2190","\u2191","\u2192","\u2193","\u2194","\u2195","\u2196","\u2197","\u2198","\u2199","\u219a","\u219b","\u219c","\u219d","\u219e","\u219f","\u21a0","\u21a1","\u21a2","\u21a3","\u21a4","\u21a5","\u21a6","\u21a7","\u21a8","\u21a9","\u21aa","\u21ab","\u21ac","\u21ad","\u21ae","\u21af","\u21b0","\u21b1","\u21b2","\u21b3","\u21b4","\u21b5","\u21b6","\u21b7","\u21b8","\u21b9","\u21ba","\u21bb","\u21c4","\u21c5","\u21c6","\u21c7","\u21c8","\u21c9","\u21ca","\u21cd","\u21ce","\u21cf","\u21d0","\u21d1","\u21d2","\u21d3","\u21d4","\u21d5","\u21d6","\u21d7","\u21d8","\u21d9","\u21da","\u21db","\u21dc","\u21dd","\u21de","\u21df","\u21e0","\u21e1","\u21e2","\u21e3","\u21e4","\u21e5","\u21e6","\u21e7","\u21e8","\u21e9","\u21ea","\u21eb","\u21ec","\u21ed","\u21ee","\u21ef","\u21f0","\u21f1","\u21f2","\u21f3","\u21f4","\u21f5","\u21f6","\u21f7","\u21f8","\u21f9","\u21fa","\u21fb","\u21fc","\u21fd","\u21fe","\u21ff","\u2301","\u2303","\u2304","\u2324","\u238b","\u2794","\u2798","\u2799","\u279a","\u279b","\u279c","\u279d","\u279e","\u279f","\u27a0","\u27a1","\u27a2","\u27a3","\u27a4","\u27a5","\u27a6","\u27a7","\u27a8","\u27a9","\u27aa","\u27ab","\u27ac","\u27ad","\u27ae","\u27af","\u27b1","\u27b2","\u27b3","\u27b4","\u27b5","\u27b6","\u27b7","\u27b8","\u27b9","\u27ba","\u27bb","\u27bc","\u27bd","\u27be","\u27f0","\u27f1","\u27f2","\u27f3","\u27f4","\u27f5","\u27f6","\u27f7","\u27f8","\u27f9","\u27fa","\u27fb","\u27fc","\u27fd","\u27fe","\u27ff","\u2900","\u2901","\u2902","\u2903","\u2904","\u2905","\u2906","\u2907","\u2908","\u2909","\u290a","\u290b","\u290c","\u290d","\u290e","\u290f","\u2910","\u2911","\u2912","\u2913","\u2914","\u2915","\u2916","\u2917","\u2918","\u2919","\u291a","\u291b","\u291c","\u291d","\u291e","\u291f","\u2920","\u2921","\u2922","\u2923","\u2924","\u2925","\u2926","\u2927","\u2928","\u2929","\u292a","\u292d","\u292e","\u292f","\u2930","\u2931","\u2932","\u2933","\u2934","\u2935","\u2936","\u2937","\u2938","\u2939","\u293a","\u293b","\u293c","\u293d","\u293e","\u293f","\u2940","\u2941","\u2942","\u2943","\u2944","\u2945","\u2946","\u2947","\u2948","\u2949","\u2970","\u2971","\u2972","\u2973","\u2974","\u2975","\u2976","\u2977","\u2978","\u2979","\u297a","\u297b","\u29b3","\u29b4","\u29bd","\u29ea","\u29ec","\u29ed","\u2a17","\u2b00","\u2b01","\u2b02","\u2b03","\u2b04","\u2b05","\u2b06","\u2b07","\u2b08","\u2b09","\u2b0a","\u2b0b","\u2b0c","\u2b0d","\u2b0e","\u2b0f","\u2b10","\u2b11","\u2b30","\u2b31","\u2b32","\u2b33","\u2b34","\u2b35","\u2b36","\u2b37","\u2b38","\u2b39","\u2b3a","\u2b3b","\u2b3c","\u2b3d","\u2b3e","\u2b3f","\u2b40","\u2b41","\u2b42","\u2b43","\u2b44","\u2b45","\u2b46","\u2b47","\u2b48","\u2b49","\u2b4a","\u2b4b","\u2b4c","\uffe9","\uffea","\uffeb","\uffec","\u21bc","\u21bd","\u21be","\u21bf","\u21c0","\u21c1","\u21c2","\u21c3","\u21cb","\u21cc","\u294a","\u294b","\u294c","\u294d","\u294e","\u294f","\u2950","\u2951","\u2952","\u2953","\u2954","\u2955","\u2956","\u2957","\u2958","\u2959","\u295a","\u295b","\u295c","\u295d","\u295e","\u295f","\u2960","\u2961","\u2962","\u2963","\u2964","\u2965","\u2966","\u2967","\u2968","\u2969","\u296a","\u296b","\u296c","\u296d","\u296e","\u296f","\u297c","\u297d","\u297e","\u297f"],type:"relation",role:"arrow"},{set:["\u2208","\u220a","\u22f2","\u22f3","\u22f4","\u22f5","\u22f6","\u22f7","\u22f8","\u22f9","\u22ff"],type:"operator",role:"element"},{set:["\u2209"],type:"operator",role:"nonelement"},{set:["\u220b","\u220d","\u22fa","\u22fb","\u22fc","\u22fd","\u22fe"],type:"operator",role:"reelement"},{set:["\u220c"],type:"operator",role:"renonelement"},{set:["\u2140","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a03","\u2a04","\u2a05","\u2a06","\u2a07","\u2a08","\u2a09","\u2a0a","\u2a0b","\u2afc","\u2aff"],type:"largeop",role:"sum"},{set:["\u222b","\u222c","\u222d","\u222e","\u222f","\u2230","\u2231","\u2232","\u2233","\u2a0c","\u2a0d","\u2a0e","\u2a0f","\u2a10","\u2a11","\u2a12","\u2a13","\u2a14","\u2a15","\u2a16","\u2a17","\u2a18","\u2a19","\u2a1a","\u2a1b","\u2a1c"],type:"largeop",role:"integral"},{set:["\u221f","\u2220","\u2221","\u2222","\u22be","\u22bf","\u25b3","\u25b7","\u25bd","\u25c1"],type:"operator",role:"geometry"},{set:["inf","lim","liminf","limsup","max","min","sup","injlim","projlim","inj lim","proj lim"],type:"function",role:"limit function"},{set:gt,type:"function",role:"prefix function"},{set:["mod","rem"],type:"operator",role:"prefix function"}],vt=function(){const t={};for(let e,r=0;e=bt[r];r++)e.set.forEach((function(r){t[r]={role:e.role||"unknown",type:e.type||"unknown",font:e.font||"unknown"}}));return t}();e.equal=function(t,e){return t.type===e.type&&t.role===e.role&&t.font===e.font},e.lookupType=function(t){var e;return(null===(e=vt[t])||void 0===e?void 0:e.type)||"unknown"},e.lookupRole=function(t){var e;return(null===(e=vt[t])||void 0===e?void 0:e.role)||"unknown"},e.lookupMeaning=function(t){return vt[t]||{role:"unknown",type:"unknown",font:"unknown"}},e.invisibleTimes=function(){return ft},e.invisiblePlus=function(){return pt},e.invisibleComma=function(){return r},e.functionApplication=function(){return dt},e.isMatchingFence=function(t,e){return-1!==h.indexOf(t)||-1!==f.indexOf(t)?t===e:s[t]===e||a[t]===e},e.isEmbellishedType=function(t){return"operator"===t||"relation"===t||"fence"===t||"punctuation"===t};const _t=new Map;function St(t,e){return`${t} ${e}`}function Ot(t,e,r=""){for(const n of e)_t.set(St(t,n),r||t)}Ot("d",["d","\u2146","\uff44","\ud835\udc1d","\ud835\udc51","\ud835\udcb9","\ud835\udced","\ud835\udd21","\ud835\udd55","\ud835\udd89","\ud835\uddbd","\ud835\uddf1","\ud835\ude25","\ud835\ude8d"]),Ot("bar",o),Ot("tilde",i),e.lookupSecondary=function(t,e){return _t.get(St(t,e))}},8158:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticMeaningCollator=e.SemanticNodeCollator=e.SemanticDefault=void 0;const n=r(3588),o=r(3882);class i{constructor(){this.map={}}static key(t,e){return e?t+":"+e:t}add(t,e){this.map[i.key(t,e.font)]=e}addNode(t){this.add(t.textContent,t.meaning())}retrieve(t,e){return this.map[i.key(t,e)]}retrieveNode(t){return this.retrieve(t.textContent,t.font)}size(){return Object.keys(this.map).length}}e.SemanticDefault=i;class s{constructor(){this.map={}}add(t,e){const r=this.map[t];r?r.push(e):this.map[t]=[e]}retrieve(t,e){return this.map[i.key(t,e)]}retrieveNode(t){return this.retrieve(t.textContent,t.font)}copy(){const t=this.copyCollator();for(const e in this.map)t.map[e]=this.map[e];return t}minimize(){for(const t in this.map)1===this.map[t].length&&delete this.map[t]}minimalCollator(){const t=this.copy();for(const e in t.map)1===t.map[e].length&&delete t.map[e];return t}isMultiValued(){for(const t in this.map)if(this.map[t].length>1)return!0;return!1}isEmpty(){return!Object.keys(this.map).length}}class a extends s{copyCollator(){return new a}add(t,e){const r=i.key(t,e.font);super.add(r,e)}addNode(t){this.add(t.textContent,t)}toString(){const t=[];for(const e in this.map){const r=Array(e.length+3).join(" "),n=this.map[e],o=[];for(let t,e=0;t=n[e];e++)o.push(t.toString());t.push(e+": "+o.join("\n"+r))}return t.join("\n")}collateMeaning(){const t=new l;for(const e in this.map)t.map[e]=this.map[e].map((function(t){return t.meaning()}));return t}}e.SemanticNodeCollator=a;class l extends s{copyCollator(){return new l}add(t,e){const r=this.retrieve(t,e.font);if(!r||!r.find((function(t){return n.equal(t,e)}))){const r=i.key(t,e.font);super.add(r,e)}}addNode(t){this.add(t.textContent,t.meaning())}toString(){const t=[];for(const e in this.map){const r=Array(e.length+3).join(" "),n=this.map[e],o=[];for(let t,e=0;t=n[e];e++)o.push("{type: "+t.type+", role: "+t.role+", font: "+t.font+"}");t.push(e+": "+o.join("\n"+r))}return t.join("\n")}reduce(){for(const t in this.map)1!==this.map[t].length&&(this.map[t]=(0,o.reduce)(this.map[t]))}default(){const t=new i;for(const e in this.map)1===this.map[e].length&&(t.map[e]=this.map[e][0]);return t}newDefault(){const t=this.default();this.reduce();const e=this.default();return t.size()!==e.size()?e:null}}e.SemanticMeaningCollator=l},9911:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticMultiHeuristic=e.SemanticTreeHeuristic=e.SemanticAbstractHeuristic=void 0;class r{constructor(t,e,r=(t=>!1)){this.name=t,this.apply=e,this.applicable=r}}e.SemanticAbstractHeuristic=r;e.SemanticTreeHeuristic=class extends r{};e.SemanticMultiHeuristic=class extends r{}},7516:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.lookup=e.run=e.add=e.blacklist=e.flags=e.updateFactory=e.factory=void 0,e.factory=null,e.updateFactory=function(t){e.factory=t};const r=new Map;function n(t){return r.get(t)}e.flags={combine_juxtaposition:!0,convert_juxtaposition:!0,multioperator:!0},e.blacklist={},e.add=function(t){const n=t.name;r.set(n,t),e.flags[n]||(e.flags[n]=!1)},e.run=function(t,r,o){const i=n(t);return i&&!e.blacklist[t]&&(e.flags[t]||i.applicable(r))?i.apply(r):o?o(r):r},e.lookup=n},94:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2057),o=r(5897),i=r(3588),s=r(7516),a=r(9911),l=r(5609),c=r(3308),u=r(4795);function p(t,e,r){let n=null;if(!t.length)return n;const o=r[r.length-1],i=o&&o.length,s=e&&e.length,a=c.default.getInstance();if(i&&s){if("infixop"===e[0].type&&"implicit"===e[0].role)return n=t.pop(),o.push(a.postfixNode_(o.pop(),t)),n;n=t.shift();const r=a.prefixNode_(e.shift(),t);return e.unshift(r),n}return i?(o.push(a.postfixNode_(o.pop(),t)),n):(s&&e.unshift(a.prefixNode_(e.shift(),t)),n)}function h(t,e,r){if(!e.length)return t;const o=t.pop(),i=e.shift(),a=r.shift();if(l.isImplicitOp(i)){n.Debugger.getInstance().output("Juxta Heuristic Case 2");const s=(o?[o,i]:[i]).concat(a);return h(t.concat(s),e,r)}if(!o)return n.Debugger.getInstance().output("Juxta Heuristic Case 3"),h([i].concat(a),e,r);const c=a.shift();if(!c){n.Debugger.getInstance().output("Juxta Heuristic Case 9");const a=s.factory.makeBranchNode("infixop",[o,e.shift()],[i],i.textContent);return a.role="implicit",s.run("combine_juxtaposition",a),e.unshift(a),h(t,e,r)}if(l.isOperator(o)||l.isOperator(c))return n.Debugger.getInstance().output("Juxta Heuristic Case 4"),h(t.concat([o,i,c]).concat(a),e,r);let u=null;return l.isImplicitOp(o)&&l.isImplicitOp(c)?(n.Debugger.getInstance().output("Juxta Heuristic Case 5"),o.contentNodes.push(i),o.contentNodes=o.contentNodes.concat(c.contentNodes),o.childNodes.push(c),o.childNodes=o.childNodes.concat(c.childNodes),c.childNodes.forEach((t=>t.parent=o)),i.parent=o,o.addMathmlNodes(i.mathml),o.addMathmlNodes(c.mathml),u=o):l.isImplicitOp(o)?(n.Debugger.getInstance().output("Juxta Heuristic Case 6"),o.contentNodes.push(i),o.childNodes.push(c),c.parent=o,i.parent=o,o.addMathmlNodes(i.mathml),o.addMathmlNodes(c.mathml),u=o):l.isImplicitOp(c)?(n.Debugger.getInstance().output("Juxta Heuristic Case 7"),c.contentNodes.unshift(i),c.childNodes.unshift(o),o.parent=c,i.parent=c,c.addMathmlNodes(i.mathml),c.addMathmlNodes(o.mathml),u=c):(n.Debugger.getInstance().output("Juxta Heuristic Case 8"),u=s.factory.makeBranchNode("infixop",[o,c],[i],i.textContent),u.role="implicit"),t.push(u),h(t.concat(a),e,r)}s.add(new a.SemanticTreeHeuristic("combine_juxtaposition",(function(t){for(let e,r=t.childNodes.length-1;e=t.childNodes[r];r--)l.isImplicitOp(e)&&!e.nobreaking&&(t.childNodes.splice(r,1,...e.childNodes),t.contentNodes.splice(r,0,...e.contentNodes),e.childNodes.concat(e.contentNodes).forEach((function(e){e.parent=t})),t.addMathmlNodes(e.mathml));return t}))),s.add(new a.SemanticTreeHeuristic("propagateSimpleFunction",(t=>("infixop"!==t.type&&"fraction"!==t.type||!t.childNodes.every(l.isSimpleFunction)||(t.role="composed function"),t)),(t=>"clearspeak"===o.default.getInstance().domain))),s.add(new a.SemanticTreeHeuristic("simpleNamedFunction",(t=>("unit"!==t.role&&-1!==["f","g","h","F","G","H"].indexOf(t.textContent)&&(t.role="simple function"),t)),(t=>"clearspeak"===o.default.getInstance().domain))),s.add(new a.SemanticTreeHeuristic("propagateComposedFunction",(t=>("fenced"===t.type&&"composed function"===t.childNodes[0].role&&(t.role="composed function"),t)),(t=>"clearspeak"===o.default.getInstance().domain))),s.add(new a.SemanticTreeHeuristic("multioperator",(t=>{if("unknown"!==t.role||t.textContent.length<=1)return;const e=[...t.textContent].map(i.lookupMeaning).reduce((function(t,e){return t&&e.role&&"unknown"!==e.role&&e.role!==t?"unknown"===t?e.role:null:t}),"unknown");e&&(t.role=e)}))),s.add(new a.SemanticMultiHeuristic("convert_juxtaposition",(t=>{let e=u.partitionNodes(t,(function(t){return t.textContent===i.invisibleTimes()&&"operator"===t.type}));e=e.rel.length?function(t){const e=[],r=[];let n=t.comp.shift(),o=null,i=[];for(;t.comp.length;)if(i=[],n.length)o&&e.push(o),r.push(n),o=t.rel.shift(),n=t.comp.shift();else{for(o&&i.push(o);!n.length&&t.comp.length;)n=t.comp.shift(),i.push(t.rel.shift());o=p(i,n,r)}i.length||n.length?(e.push(o),r.push(n)):(i.push(o),p(i,n,r));return{rel:e,comp:r}}(e):e,t=e.comp[0];for(let r,n,o=1;r=e.comp[o],n=e.rel[o-1];o++)t.push(n),t=t.concat(r);return e=u.partitionNodes(t,(function(t){return t.textContent===i.invisibleTimes()&&("operator"===t.type||"infixop"===t.type)})),e.rel.length?h(e.comp.shift(),e.rel,e.comp):t}))),s.add(new a.SemanticTreeHeuristic("simple2prefix",(t=>(t.textContent.length>1&&!t.textContent[0].match(/[A-Z]/)&&(t.role="prefix function"),t)),(t=>"braille"===o.default.getInstance().modality&&"identifier"===t.type))),s.add(new a.SemanticTreeHeuristic("detect_cycle",(t=>{t.type="matrix",t.role="cycle";const e=t.childNodes[0];return e.type="row",e.role="cycle",e.textContent="",e.contentNodes=[],t}),(t=>"fenced"===t.type&&"infixop"===t.childNodes[0].type&&"implicit"===t.childNodes[0].role&&t.childNodes[0].childNodes.every((function(t){return"number"===t.type}))&&t.childNodes[0].contentNodes.every((function(t){return"space"===t.role})))))},7228:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticMathml=void 0;const n=r(5740),o=r(5250),i=r(5609),s=r(3308),a=r(4795);class l extends o.SemanticAbstractParser{constructor(){super("MathML"),this.parseMap_={SEMANTICS:this.semantics_.bind(this),MATH:this.rows_.bind(this),MROW:this.rows_.bind(this),MPADDED:this.rows_.bind(this),MSTYLE:this.rows_.bind(this),MFRAC:this.fraction_.bind(this),MSUB:this.limits_.bind(this),MSUP:this.limits_.bind(this),MSUBSUP:this.limits_.bind(this),MOVER:this.limits_.bind(this),MUNDER:this.limits_.bind(this),MUNDEROVER:this.limits_.bind(this),MROOT:this.root_.bind(this),MSQRT:this.sqrt_.bind(this),MTABLE:this.table_.bind(this),MLABELEDTR:this.tableLabeledRow_.bind(this),MTR:this.tableRow_.bind(this),MTD:this.tableCell_.bind(this),MS:this.text_.bind(this),MTEXT:this.text_.bind(this),MSPACE:this.space_.bind(this),"ANNOTATION-XML":this.text_.bind(this),MI:this.identifier_.bind(this),MN:this.number_.bind(this),MO:this.operator_.bind(this),MFENCED:this.fenced_.bind(this),MENCLOSE:this.enclosed_.bind(this),MMULTISCRIPTS:this.multiscripts_.bind(this),ANNOTATION:this.empty_.bind(this),NONE:this.empty_.bind(this),MACTION:this.action_.bind(this)};const t={type:"identifier",role:"numbersetletter",font:"double-struck"};["C","H","N","P","Q","R","Z","\u2102","\u210d","\u2115","\u2119","\u211a","\u211d","\u2124"].forEach((e=>this.getFactory().defaultMap.add(e,t)).bind(this))}static getAttribute_(t,e,r){if(!t.hasAttribute(e))return r;const n=t.getAttribute(e);return n.match(/^\s*$/)?null:n}parse(t){s.default.getInstance().setNodeFactory(this.getFactory());const e=n.toArray(t.childNodes),r=n.tagName(t),o=this.parseMap_[r],i=(o||this.dummy_.bind(this))(t,e);return a.addAttributes(i,t),-1!==["MATH","MROW","MPADDED","MSTYLE","SEMANTICS"].indexOf(r)||(i.mathml.unshift(t),i.mathmlTree=t),i}semantics_(t,e){return e.length?this.parse(e[0]):this.getFactory().makeEmptyNode()}rows_(t,e){const r=t.getAttribute("semantics");if(r&&r.match("bspr_"))return s.default.proof(t,r,this.parseList.bind(this));let n;return 1===(e=a.purgeNodes(e)).length?(n=this.parse(e[0]),"empty"!==n.type||n.mathmlTree||(n.mathmlTree=t)):n=s.default.getInstance().row(this.parseList(e)),n.mathml.unshift(t),n}fraction_(t,e){if(!e.length)return this.getFactory().makeEmptyNode();const r=this.parse(e[0]),n=e[1]?this.parse(e[1]):this.getFactory().makeEmptyNode();return s.default.getInstance().fractionLikeNode(r,n,t.getAttribute("linethickness"),"true"===t.getAttribute("bevelled"))}limits_(t,e){return s.default.getInstance().limitNode(n.tagName(t),this.parseList(e))}root_(t,e){return e[1]?this.getFactory().makeBranchNode("root",[this.parse(e[1]),this.parse(e[0])],[]):this.sqrt_(t,e)}sqrt_(t,e){const r=this.parseList(a.purgeNodes(e));return this.getFactory().makeBranchNode("sqrt",[s.default.getInstance().row(r)],[])}table_(t,e){const r=t.getAttribute("semantics");if(r&&r.match("bspr_"))return s.default.proof(t,r,this.parseList.bind(this));const n=this.getFactory().makeBranchNode("table",this.parseList(e),[]);return n.mathmlTree=t,s.default.tableToMultiline(n),n}tableRow_(t,e){const r=this.getFactory().makeBranchNode("row",this.parseList(e),[]);return r.role="table",r}tableLabeledRow_(t,e){if(!e.length)return this.tableRow_(t,e);const r=this.parse(e[0]);r.role="label";const n=this.getFactory().makeBranchNode("row",this.parseList(e.slice(1)),[r]);return n.role="table",n}tableCell_(t,e){const r=this.parseList(a.purgeNodes(e));let n;n=r.length?1===r.length&&i.isType(r[0],"empty")?r:[s.default.getInstance().row(r)]:[];const o=this.getFactory().makeBranchNode("cell",n,[]);return o.role="table",o}space_(t,e){const r=t.getAttribute("width"),o=r&&r.match(/[a-z]*$/);if(!o)return this.empty_(t,e);const i=o[0],a=parseFloat(r.slice(0,o.index)),l={cm:.4,pc:.5,em:.5,ex:1,in:.15,pt:5,mm:5}[i];if(!l||isNaN(a)||a<l)return this.empty_(t,e);const c=this.getFactory().makeUnprocessed(t);return s.default.getInstance().text(c,n.tagName(t))}text_(t,e){const r=this.leaf_(t,e);return t.textContent?(r.updateContent(t.textContent,!0),s.default.getInstance().text(r,n.tagName(t))):r}identifier_(t,e){const r=this.leaf_(t,e);return s.default.getInstance().identifierNode(r,s.default.getInstance().font(t.getAttribute("mathvariant")),t.getAttribute("class"))}number_(t,e){const r=this.leaf_(t,e);return s.default.number(r),r}operator_(t,e){const r=this.leaf_(t,e);return s.default.getInstance().operatorNode(r),r}fenced_(t,e){const r=this.parseList(a.purgeNodes(e)),n=l.getAttribute_(t,"separators",","),o=l.getAttribute_(t,"open","("),i=l.getAttribute_(t,"close",")"),c=s.default.getInstance().mfenced(o,i,n,r);return s.default.getInstance().tablesInRow([c])[0]}enclosed_(t,e){const r=this.parseList(a.purgeNodes(e)),n=this.getFactory().makeBranchNode("enclose",[s.default.getInstance().row(r)],[]);return n.role=t.getAttribute("notation")||"unknown",n}multiscripts_(t,e){if(!e.length)return this.getFactory().makeEmptyNode();const r=this.parse(e.shift());if(!e.length)return r;const o=[],i=[],l=[],c=[];let u=!1,p=0;for(let t,r=0;t=e[r];r++)"MPRESCRIPTS"!==n.tagName(t)?(u?1&p?o.push(t):i.push(t):1&p?l.push(t):c.push(t),p++):(u=!0,p=0);return a.purgeNodes(o).length||a.purgeNodes(i).length?s.default.getInstance().tensor(r,this.parseList(i),this.parseList(o),this.parseList(c),this.parseList(l)):s.default.getInstance().pseudoTensor(r,this.parseList(c),this.parseList(l))}empty_(t,e){return this.getFactory().makeEmptyNode()}action_(t,e){return e.length>1?this.parse(e[1]):this.getFactory().makeUnprocessed(t)}dummy_(t,e){const r=this.getFactory().makeUnprocessed(t);return r.role=t.tagName,r.textContent=t.textContent,r}leaf_(t,e){if(1===e.length&&e[0].nodeType!==n.NodeType.TEXT_NODE){const r=this.getFactory().makeUnprocessed(t);return r.role=e[0].tagName,a.addAttributes(r,e[0]),r}return this.getFactory().makeLeafNode(t.textContent,s.default.getInstance().font(t.getAttribute("mathvariant")))}}e.SemanticMathml=l},5952:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticNode=void 0;const n=r(5740),o=r(3588),i=r(4795);class s{constructor(t){this.id=t,this.mathml=[],this.parent=null,this.type="unknown",this.role="unknown",this.font="unknown",this.embellished=null,this.fencePointer="",this.childNodes=[],this.textContent="",this.mathmlTree=null,this.contentNodes=[],this.annotation={},this.attributes={},this.nobreaking=!1}static fromXml(t){const e=parseInt(t.getAttribute("id"),10),r=new s(e);return r.type=t.tagName,s.setAttribute(r,t,"role"),s.setAttribute(r,t,"font"),s.setAttribute(r,t,"embellished"),s.setAttribute(r,t,"fencepointer","fencePointer"),t.getAttribute("annotation")&&r.parseAnnotation(t.getAttribute("annotation")),i.addAttributes(r,t),s.processChildren(r,t),r}static setAttribute(t,e,r,n){n=n||r;const o=e.getAttribute(r);o&&(t[n]=o)}static processChildren(t,e){for(const r of n.toArray(e.childNodes)){if(r.nodeType===n.NodeType.TEXT_NODE){t.textContent=r.textContent;continue}const e=n.toArray(r.childNodes).map(s.fromXml);e.forEach((e=>e.parent=t)),"CONTENT"===n.tagName(r)?t.contentNodes=e:t.childNodes=e}}querySelectorAll(t){let e=[];for(let r,n=0;r=this.childNodes[n];n++)e=e.concat(r.querySelectorAll(t));for(let r,n=0;r=this.contentNodes[n];n++)e=e.concat(r.querySelectorAll(t));return t(this)&&e.unshift(this),e}xml(t,e){const r=function(r,n){const o=n.map((function(r){return r.xml(t,e)})),i=t.createElementNS("",r);for(let t,e=0;t=o[e];e++)i.appendChild(t);return i},n=t.createElementNS("",this.type);return e||this.xmlAttributes(n),n.textContent=this.textContent,this.contentNodes.length>0&&n.appendChild(r("content",this.contentNodes)),this.childNodes.length>0&&n.appendChild(r("children",this.childNodes)),n}toString(t=!1){const e=n.parseInput("<snode/>");return n.serializeXml(this.xml(e,t))}allAttributes(){const t=[];return t.push(["role",this.role]),"unknown"!==this.font&&t.push(["font",this.font]),Object.keys(this.annotation).length&&t.push(["annotation",this.xmlAnnotation()]),this.embellished&&t.push(["embellished",this.embellished]),this.fencePointer&&t.push(["fencepointer",this.fencePointer]),t.push(["id",this.id.toString()]),t}xmlAnnotation(){const t=[];for(const e in this.annotation)this.annotation[e].forEach((function(r){t.push(e+":"+r)}));return t.join(";")}toJson(){const t={};t.type=this.type;const e=this.allAttributes();for(let r,n=0;r=e[n];n++)t[r[0]]=r[1].toString();return this.textContent&&(t.$t=this.textContent),this.childNodes.length&&(t.children=this.childNodes.map((function(t){return t.toJson()}))),this.contentNodes.length&&(t.content=this.contentNodes.map((function(t){return t.toJson()}))),t}updateContent(t,e){const r=e?t.replace(/^[ \f\n\r\t\v\u200b]*/,"").replace(/[ \f\n\r\t\v\u200b]*$/,""):t.trim();if(t=t&&!r?t:r,this.textContent===t)return;const n=(0,o.lookupMeaning)(t);this.textContent=t,this.role=n.role,this.type=n.type,this.font=n.font}addMathmlNodes(t){for(let e,r=0;e=t[r];r++)-1===this.mathml.indexOf(e)&&this.mathml.push(e)}appendChild(t){this.childNodes.push(t),this.addMathmlNodes(t.mathml),t.parent=this}replaceChild(t,e){const r=this.childNodes.indexOf(t);if(-1===r)return;t.parent=null,e.parent=this,this.childNodes[r]=e;const n=t.mathml.filter((function(t){return-1===e.mathml.indexOf(t)})),o=e.mathml.filter((function(e){return-1===t.mathml.indexOf(e)}));this.removeMathmlNodes(n),this.addMathmlNodes(o)}appendContentNode(t){t&&(this.contentNodes.push(t),this.addMathmlNodes(t.mathml),t.parent=this)}removeContentNode(t){if(t){const e=this.contentNodes.indexOf(t);-1!==e&&this.contentNodes.slice(e,1)}}equals(t){if(!t)return!1;if(this.type!==t.type||this.role!==t.role||this.textContent!==t.textContent||this.childNodes.length!==t.childNodes.length||this.contentNodes.length!==t.contentNodes.length)return!1;for(let e,r,n=0;e=this.childNodes[n],r=t.childNodes[n];n++)if(!e.equals(r))return!1;for(let e,r,n=0;e=this.contentNodes[n],r=t.contentNodes[n];n++)if(!e.equals(r))return!1;return!0}displayTree(){console.info(this.displayTree_(0))}addAnnotation(t,e){e&&this.addAnnotation_(t,e)}getAnnotation(t){const e=this.annotation[t];return e||[]}hasAnnotation(t,e){const r=this.annotation[t];return!!r&&-1!==r.indexOf(e)}parseAnnotation(t){const e=t.split(";");for(let t=0,r=e.length;t<r;t++){const r=e[t].split(":");this.addAnnotation(r[0],r[1])}}meaning(){return{type:this.type,role:this.role,font:this.font}}xmlAttributes(t){const e=this.allAttributes();for(let r,n=0;r=e[n];n++)t.setAttribute(r[0],r[1]);this.addExternalAttributes(t)}addExternalAttributes(t){for(const e in this.attributes)t.setAttribute(e,this.attributes[e])}removeMathmlNodes(t){const e=this.mathml;for(let r,n=0;r=t[n];n++){const t=e.indexOf(r);-1!==t&&e.splice(t,1)}this.mathml=e}displayTree_(t){t++;const e=Array(t).join(" ");let r="";r+="\n"+e+this.toString(),r+="\n"+e+"MathmlTree:",r+="\n"+e+this.mathmlTreeString(),r+="\n"+e+"MathML:";for(let t,n=0;t=this.mathml[n];n++)r+="\n"+e+t.toString();return r+="\n"+e+"Begin Content",this.contentNodes.forEach((function(e){r+=e.displayTree_(t)})),r+="\n"+e+"End Content",r+="\n"+e+"Begin Children",this.childNodes.forEach((function(e){r+=e.displayTree_(t)})),r+="\n"+e+"End Children",r}mathmlTreeString(){return this.mathmlTree?this.mathmlTree.toString():"EMPTY"}addAnnotation_(t,e){const r=this.annotation[t];r?r.push(e):this.annotation[t]=[e]}}e.SemanticNode=s},6537:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticNodeFactory=void 0;const n=r(8158),o=r(8158),i=r(5952);e.SemanticNodeFactory=class{constructor(){this.leafMap=new o.SemanticNodeCollator,this.defaultMap=new n.SemanticDefault,this.idCounter_=-1}makeNode(t){return this.createNode_(t)}makeUnprocessed(t){const e=this.createNode_();return e.mathml=[t],e.mathmlTree=t,e}makeEmptyNode(){const t=this.createNode_();return t.type="empty",t}makeContentNode(t){const e=this.createNode_();return e.updateContent(t),e}makeMultipleContentNodes(t,e){const r=[];for(let n=0;n<t;n++)r.push(this.makeContentNode(e));return r}makeLeafNode(t,e){if(!t)return this.makeEmptyNode();const r=this.makeContentNode(t);r.font=e||r.font;const n=this.defaultMap.retrieveNode(r);return n&&(r.type=n.type,r.role=n.role,r.font=n.font),this.leafMap.addNode(r),r}makeBranchNode(t,e,r,n){const o=this.createNode_();return n&&o.updateContent(n),o.type=t,o.childNodes=e,o.contentNodes=r,e.concat(r).forEach((function(t){t.parent=o,o.addMathmlNodes(t.mathml)})),o}createNode_(t){return void 0!==t?this.idCounter_=Math.max(this.idCounter_,t):t=++this.idCounter_,new i.SemanticNode(t)}}},3882:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticComparator=e.reduce=e.sort=e.apply=e.add=void 0;const r=[];function n(t){r.push(t)}function o(t,e){for(let n,o=0;n=r[o];o++){const r=n.compare(t,e);if(0!==r)return r}return 0}function i(t){t.sort(o)}e.add=n,e.apply=o,e.sort=i,e.reduce=function(t){if(t.length<=1)return t;const e=t.slice();i(e);const r=[];let n;do{n=e.pop(),r.push(n)}while(n&&e.length&&0===o(e[e.length-1],n));return r};class s{constructor(t,e=null){this.comparator=t,this.type=e,n(this)}compare(t,e){return this.type&&this.type===t.type&&this.type===e.type?this.comparator(t,e):0}}e.SemanticComparator=s,new s((function(t,e){return"simple function"===t.role?1:"simple function"===e.role?-1:0}),"identifier")},5250:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticAbstractParser=void 0;const n=r(6537);e.SemanticAbstractParser=class{constructor(t){this.type=t,this.factory_=new n.SemanticNodeFactory}getFactory(){return this.factory_}setFactory(t){this.factory_=t}getType(){return this.type}parseList(t){const e=[];for(let r,n=0;r=t[n];n++)e.push(this.parse(r));return e}}},5609:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.isMembership=e.elligibleRightNeutral=e.elligibleLeftNeutral=e.compareNeutralFences=e.isNeutralFence=e.isImplicitOp=e.isImplicit=e.isPureUnit=e.isUnitCounter=e.isNumber=e.isSingletonSetContent=e.scriptedElement_=e.illegalSingleton_=e.isSetNode=e.isRightBrace=e.isLeftBrace=e.isSimpleFunction=e.singlePunctAtPosition=e.isSimpleFunctionHead=e.isLimitBase=e.isBinomial=e.lineIsLabelled=e.tableIsMultiline=e.tableIsCases=e.isFencedElement=e.tableIsMatrixOrVector=e.isTableOrMultiline=e.isElligibleEmbellishedFence=e.isFence=e.isPunctuation=e.isRelation=e.isOperator=e.isEmbellished=e.isGeneralFunctionBoundary=e.isIntegralDxBoundarySingle=e.isIntegralDxBoundary=e.isBigOpBoundary=e.isPrefixFunctionBoundary=e.isSimpleFunctionScope=e.isAccent=e.isRole=e.embellishedType=e.isType=void 0;const n=r(3588),o=r(4795);function i(t,e){return t.type===e}function s(t,e){return t.embellished===e}function a(t,e){return t.role===e}function l(t){return u(t)||p(t)}function c(t){return i(t,"operator")||s(t,"operator")}function u(t){return i(t,"relation")||s(t,"relation")}function p(t){return i(t,"punctuation")||s(t,"punctuation")}function h(t){return i(t,"fence")||s(t,"fence")}function f(t){return!t.embellished||!function(t){return i(t,"tensor")&&(!i(t.childNodes[1],"empty")||!i(t.childNodes[2],"empty"))&&(!i(t.childNodes[3],"empty")||!i(t.childNodes[4],"empty"))}(t)&&((!a(t,"close")||!i(t,"tensor"))&&((!a(t,"open")||!i(t,"subscript")&&!i(t,"superscript"))&&f(t.childNodes[0])))}function d(t){return!!t&&(i(t,"table")||i(t,"multiline"))}function m(t){return!!t&&i(t,"fenced")&&(a(t,"leftright")||v(t))&&1===t.childNodes.length}function y(t){return!!t&&-1!==["{","\ufe5b","\uff5b"].indexOf(t.textContent)}function g(t){return!!t&&-1!==["}","\ufe5c","\uff5d"].indexOf(t.textContent)}function b(t){return"number"===t.type&&("integer"===t.role||"float"===t.role)}function v(t){return"neutral"===t.role||"metric"===t.role}e.isType=i,e.embellishedType=s,e.isRole=a,e.isAccent=function(t){const e=new RegExp("\u221e|\u1ab2");return i(t,"fence")||i(t,"punctuation")||i(t,"operator")&&!t.textContent.match(e)||i(t,"relation")||i(t,"identifier")&&a(t,"unknown")&&!t.textContent.match(n.allLettersRegExp)&&!t.textContent.match(e)},e.isSimpleFunctionScope=function(t){const e=t.childNodes;if(0===e.length)return!0;if(e.length>1)return!1;const r=e[0];if("infixop"===r.type){if("implicit"!==r.role)return!1;if(r.childNodes.some((t=>i(t,"infixop"))))return!1}return!0},e.isPrefixFunctionBoundary=function(t){return c(t)&&!a(t,"division")||i(t,"appl")||l(t)},e.isBigOpBoundary=function(t){return c(t)||l(t)},e.isIntegralDxBoundary=function(t,e){return!!e&&i(e,"identifier")&&n.lookupSecondary("d",t.textContent)},e.isIntegralDxBoundarySingle=function(t){if(i(t,"identifier")){const e=t.textContent[0];return e&&t.textContent[1]&&n.lookupSecondary("d",e)}return!1},e.isGeneralFunctionBoundary=l,e.isEmbellished=function(t){return t.embellished?t.embellished:n.isEmbellishedType(t.type)?t.type:null},e.isOperator=c,e.isRelation=u,e.isPunctuation=p,e.isFence=h,e.isElligibleEmbellishedFence=function(t){return!(!t||!h(t))&&(!t.embellished||f(t))},e.isTableOrMultiline=d,e.tableIsMatrixOrVector=function(t){return!!t&&m(t)&&d(t.childNodes[0])},e.isFencedElement=m,e.tableIsCases=function(t,e){return e.length>0&&a(e[e.length-1],"openfence")},e.tableIsMultiline=function(t){return t.childNodes.every((function(t){return t.childNodes.length<=1}))},e.lineIsLabelled=function(t){return i(t,"line")&&t.contentNodes.length&&a(t.contentNodes[0],"label")},e.isBinomial=function(t){return 2===t.childNodes.length},e.isLimitBase=function t(e){return i(e,"largeop")||i(e,"limboth")||i(e,"limlower")||i(e,"limupper")||i(e,"function")&&a(e,"limit function")||(i(e,"overscore")||i(e,"underscore"))&&t(e.childNodes[0])},e.isSimpleFunctionHead=function(t){return"identifier"===t.type||"latinletter"===t.role||"greekletter"===t.role||"otherletter"===t.role},e.singlePunctAtPosition=function(t,e,r){return 1===e.length&&("punctuation"===t[r].type||"punctuation"===t[r].embellished)&&t[r]===e[0]},e.isSimpleFunction=function(t){return i(t,"identifier")&&a(t,"simple function")},e.isLeftBrace=y,e.isRightBrace=g,e.isSetNode=function(t){return y(t.contentNodes[0])&&g(t.contentNodes[1])},e.illegalSingleton_=["punctuation","punctuated","relseq","multirel","table","multiline","cases","inference"],e.scriptedElement_=["limupper","limlower","limboth","subscript","superscript","underscore","overscore","tensor"],e.isSingletonSetContent=function t(r){const n=r.type;return-1===e.illegalSingleton_.indexOf(n)&&("infixop"!==n||"implicit"===r.role)&&("fenced"===n?"leftright"!==r.role||t(r.childNodes[0]):-1===e.scriptedElement_.indexOf(n)||t(r.childNodes[0]))},e.isNumber=b,e.isUnitCounter=function(t){return b(t)||"vulgar"===t.role||"mixed"===t.role},e.isPureUnit=function(t){const e=t.childNodes;return"unit"===t.role&&(!e.length||"unit"===e[0].role)},e.isImplicit=function(t){return"implicit"===t.role||"unit"===t.role&&!!t.contentNodes.length&&t.contentNodes[0].textContent===n.invisibleTimes()},e.isImplicitOp=function(t){return"infixop"===t.type&&"implicit"===t.role},e.isNeutralFence=v,e.compareNeutralFences=function(t,e){return v(t)&&v(e)&&(0,o.getEmbellishedInner)(t).textContent===(0,o.getEmbellishedInner)(e).textContent},e.elligibleLeftNeutral=function(t){return!!v(t)&&(!t.embellished||"superscript"!==t.type&&"subscript"!==t.type&&("tensor"!==t.type||"empty"===t.childNodes[3].type&&"empty"===t.childNodes[4].type))},e.elligibleRightNeutral=function(t){return!!v(t)&&(!t.embellished||("tensor"!==t.type||"empty"===t.childNodes[1].type&&"empty"===t.childNodes[2].type))},e.isMembership=function(t){return["element","nonelement","reelement","renonelement"].includes(t.role)}},3308:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(5740),o=r(3588),i=r(7516),s=r(6537),a=r(5609),l=r(4795);class c{constructor(){this.funcAppls={},this.factory_=new s.SemanticNodeFactory,i.updateFactory(this.factory_)}static getInstance(){return c.instance=c.instance||new c,c.instance}static tableToMultiline(t){if(a.tableIsMultiline(t)){t.type="multiline";for(let e,r=0;e=t.childNodes[r];r++)c.rowToLine_(e,"multiline");1===t.childNodes.length&&!a.lineIsLabelled(t.childNodes[0])&&a.isFencedElement(t.childNodes[0].childNodes[0])&&c.tableToMatrixOrVector_(c.rewriteFencedLine_(t)),c.binomialForm_(t),c.classifyMultiline(t)}else c.classifyTable(t)}static number(t){"unknown"!==t.type&&"identifier"!==t.type||(t.type="number"),c.numberRole_(t),c.exprFont_(t)}static classifyMultiline(t){let e=0;const r=t.childNodes.length;let n;for(;e<r&&(!(n=t.childNodes[e])||!n.childNodes.length);)e++;if(e>=r)return;const o=n.childNodes[0].role;"unknown"!==o&&t.childNodes.every((function(t){const e=t.childNodes[0];return!e||e.role===o&&(a.isType(e,"relation")||a.isType(e,"relseq"))}))&&(t.role=o)}static classifyTable(t){const e=c.computeColumns_(t);c.classifyByColumns_(t,e,"equality")||c.classifyByColumns_(t,e,"inequality",["equality"])||c.classifyByColumns_(t,e,"arrow")||c.detectCaleyTable(t)}static detectCaleyTable(t){if(!t.mathmlTree)return!1;const e=t.mathmlTree,r=e.getAttribute("columnlines"),n=e.getAttribute("rowlines");return!(!r||!n)&&(!(!c.cayleySpacing(r)||!c.cayleySpacing(n))&&(t.role="cayley",!0))}static cayleySpacing(t){const e=t.split(" ");return("solid"===e[0]||"dashed"===e[0])&&e.slice(1).every((t=>"none"===t))}static proof(t,e,r){const n=c.separateSemantics(e);return c.getInstance().proof(t,n,r)}static findSemantics(t,e,r){const n=null==r?null:r,o=c.getSemantics(t);return!!o&&(!!o[e]&&(null==n||o[e]===n))}static getSemantics(t){const e=t.getAttribute("semantics");return e?c.separateSemantics(e):null}static removePrefix(t){const[,...e]=t.split("_");return e.join("_")}static separateSemantics(t){const e={};return t.split(";").forEach((function(t){const[r,n]=t.split(":");e[c.removePrefix(r)]=n})),e}static matchSpaces_(t,e){for(let r,n=0;r=e[n];n++){const e=t[n].mathmlTree,o=t[n+1].mathmlTree;if(!e||!o)continue;const i=e.nextSibling;if(!i||i===o)continue;const s=c.getSpacer_(i);s&&(r.mathml.push(s),r.mathmlTree=s,r.role="space")}}static getSpacer_(t){if("MSPACE"===n.tagName(t))return t;for(;l.hasEmptyTag(t)&&1===t.childNodes.length;)if(t=t.childNodes[0],"MSPACE"===n.tagName(t))return t;return null}static fenceToPunct_(t){const e=c.FENCE_TO_PUNCT_[t.role];if(e){for(;t.embellished;)t.embellished="punctuation",a.isRole(t,"subsup")||a.isRole(t,"underover")||(t.role=e),t=t.childNodes[0];t.type="punctuation",t.role=e}}static classifyFunction_(t,e){if("appl"===t.type||"bigop"===t.type||"integral"===t.type)return"";if(e[0]&&e[0].textContent===o.functionApplication()){c.getInstance().funcAppls[t.id]=e.shift();let r="simple function";return i.run("simple2prefix",t),"prefix function"!==t.role&&"limit function"!==t.role||(r=t.role),c.propagateFunctionRole_(t,r),"prefix"}const r=c.CLASSIFY_FUNCTION_[t.role];return r||(a.isSimpleFunctionHead(t)?"simple":"")}static propagateFunctionRole_(t,e){if(t){if("infixop"===t.type)return;a.isRole(t,"subsup")||a.isRole(t,"underover")||(t.role=e),c.propagateFunctionRole_(t.childNodes[0],e)}}static getFunctionOp_(t,e){if(e(t))return t;for(let r,n=0;r=t.childNodes[n];n++){const t=c.getFunctionOp_(r,e);if(t)return t}return null}static tableToMatrixOrVector_(t){const e=t.childNodes[0];a.isType(e,"multiline")?c.tableToVector_(t):c.tableToMatrix_(t),t.contentNodes.forEach(e.appendContentNode.bind(e));for(let t,r=0;t=e.childNodes[r];r++)c.assignRoleToRow_(t,c.getComponentRoles_(e));return e.parent=null,e}static tableToVector_(t){const e=t.childNodes[0];e.type="vector",1!==e.childNodes.length?c.binomialForm_(e):c.tableToSquare_(t)}static binomialForm_(t){a.isBinomial(t)&&(t.role="binomial",t.childNodes[0].role="binomial",t.childNodes[1].role="binomial")}static tableToMatrix_(t){const e=t.childNodes[0];e.type="matrix",e.childNodes&&e.childNodes.length>0&&e.childNodes[0].childNodes&&e.childNodes.length===e.childNodes[0].childNodes.length?c.tableToSquare_(t):e.childNodes&&1===e.childNodes.length&&(e.role="rowvector")}static tableToSquare_(t){const e=t.childNodes[0];a.isNeutralFence(t)?e.role="determinant":e.role="squarematrix"}static getComponentRoles_(t){const e=t.role;return e&&"unknown"!==e?e:t.type.toLowerCase()||"unknown"}static tableToCases_(t,e){for(let e,r=0;e=t.childNodes[r];r++)c.assignRoleToRow_(e,"cases");return t.type="cases",t.appendContentNode(e),a.tableIsMultiline(t)&&c.binomialForm_(t),t}static rewriteFencedLine_(t){const e=t.childNodes[0],r=t.childNodes[0].childNodes[0],n=t.childNodes[0].childNodes[0].childNodes[0];return r.parent=t.parent,t.parent=r,n.parent=e,r.childNodes=[t],e.childNodes=[n],r}static rowToLine_(t,e){const r=e||"unknown";a.isType(t,"row")&&(t.type="line",t.role=r,1===t.childNodes.length&&a.isType(t.childNodes[0],"cell")&&(t.childNodes=t.childNodes[0].childNodes,t.childNodes.forEach((function(e){e.parent=t}))))}static assignRoleToRow_(t,e){a.isType(t,"line")?t.role=e:a.isType(t,"row")&&(t.role=e,t.childNodes.forEach((function(t){a.isType(t,"cell")&&(t.role=e)})))}static nextSeparatorFunction_(t){let e;if(t){if(t.match(/^\s+$/))return null;e=t.replace(/\s/g,"").split("").filter((function(t){return t}))}else e=[","];return function(){return e.length>1?e.shift():e[0]}}static numberRole_(t){if("unknown"!==t.role)return;const e=[...t.textContent].filter((t=>t.match(/[^\s]/))),r=e.map(o.lookupMeaning);if(r.every((function(t){return"number"===t.type&&"integer"===t.role||"punctuation"===t.type&&"comma"===t.role})))return t.role="integer",void("0"===e[0]&&t.addAnnotation("general","basenumber"));r.every((function(t){return"number"===t.type&&"integer"===t.role||"punctuation"===t.type}))?t.role="float":t.role="othernumber"}static exprFont_(t){if("unknown"!==t.font)return;const e=[...t.textContent].map(o.lookupMeaning).reduce((function(t,e){return t&&e.font&&"unknown"!==e.font&&e.font!==t?"unknown"===t?e.font:null:t}),"unknown");e&&(t.font=e)}static purgeFences_(t){const e=t.rel,r=t.comp,n=[],o=[];for(;e.length>0;){const t=e.shift();let i=r.shift();a.isElligibleEmbellishedFence(t)?(n.push(t),o.push(i)):(c.fenceToPunct_(t),i.push(t),i=i.concat(r.shift()),r.unshift(i))}return o.push(r.shift()),{rel:n,comp:o}}static rewriteFencedNode_(t){const e=t.contentNodes[0],r=t.contentNodes[1];let n=c.rewriteFence_(t,e);return t.contentNodes[0]=n.fence,n=c.rewriteFence_(n.node,r),t.contentNodes[1]=n.fence,t.contentNodes[0].parent=t,t.contentNodes[1].parent=t,n.node.parent=null,n.node}static rewriteFence_(t,e){if(!e.embellished)return{node:t,fence:e};const r=e.childNodes[0],n=c.rewriteFence_(t,r);return a.isType(e,"superscript")||a.isType(e,"subscript")||a.isType(e,"tensor")?(a.isRole(e,"subsup")||(e.role=t.role),r!==n.node&&(e.replaceChild(r,n.node),r.parent=t),c.propagateFencePointer_(e,r),{node:e,fence:n.fence}):(e.replaceChild(r,n.fence),e.mathmlTree&&-1===e.mathml.indexOf(e.mathmlTree)&&e.mathml.push(e.mathmlTree),{node:n.node,fence:e})}static propagateFencePointer_(t,e){t.fencePointer=e.fencePointer||e.id.toString(),t.embellished=null}static classifyByColumns_(t,e,r,n){return!!(3===e.length&&c.testColumns_(e,1,(t=>c.isPureRelation_(t,r)))||2===e.length&&(c.testColumns_(e,1,(t=>c.isEndRelation_(t,r)||c.isPureRelation_(t,r)))||c.testColumns_(e,0,(t=>c.isEndRelation_(t,r,!0)||c.isPureRelation_(t,r)))))&&(t.role=r,!0)}static isEndRelation_(t,e,r){const n=r?t.childNodes.length-1:0;return a.isType(t,"relseq")&&a.isRole(t,e)&&a.isType(t.childNodes[n],"empty")}static isPureRelation_(t,e){return a.isType(t,"relation")&&a.isRole(t,e)}static computeColumns_(t){const e=[];for(let r,n=0;r=t.childNodes[n];n++)for(let t,n=0;t=r.childNodes[n];n++){e[n]?e[n].push(t):e[n]=[t]}return e}static testColumns_(t,e,r){const n=t[e];return!!n&&(n.some((function(t){return t.childNodes.length&&r(t.childNodes[0])}))&&n.every((function(t){return!t.childNodes.length||r(t.childNodes[0])})))}setNodeFactory(t){c.getInstance().factory_=t,i.updateFactory(c.getInstance().factory_)}getNodeFactory(){return c.getInstance().factory_}identifierNode(t,e,r){if("MathML-Unit"===r)t.type="identifier",t.role="unit";else if(!e&&1===t.textContent.length&&("integer"===t.role||"latinletter"===t.role||"greekletter"===t.role)&&"normal"===t.font)return t.font="italic",i.run("simpleNamedFunction",t);return"unknown"===t.type&&(t.type="identifier"),c.exprFont_(t),i.run("simpleNamedFunction",t)}implicitNode(t){if(t=c.getInstance().getMixedNumbers_(t),1===(t=c.getInstance().combineUnits_(t)).length)return t[0];const e=c.getInstance().implicitNode_(t);return i.run("combine_juxtaposition",e)}text(t,e){return c.exprFont_(t),t.type="text","MS"===e?(t.role="string",t):"MSPACE"===e||t.textContent.match(/^\s*$/)?(t.role="space",t):t}row(t){return 0===(t=t.filter((function(t){return!a.isType(t,"empty")}))).length?c.getInstance().factory_.makeEmptyNode():(t=c.getInstance().getFencesInRow_(t),t=c.getInstance().tablesInRow(t),t=c.getInstance().getPunctuationInRow_(t),t=c.getInstance().getTextInRow_(t),t=c.getInstance().getFunctionsInRow_(t),c.getInstance().relationsInRow_(t))}limitNode(t,e){if(!e.length)return c.getInstance().factory_.makeEmptyNode();let r,n=e[0],o="unknown";if(!e[1])return n;if(a.isLimitBase(n)){r=c.MML_TO_LIMIT_[t];const i=r.length;if(o=r.type,e=e.slice(0,r.length+1),1===i&&a.isAccent(e[1])||2===i&&a.isAccent(e[1])&&a.isAccent(e[2]))return r=c.MML_TO_BOUNDS_[t],c.getInstance().accentNode_(n,e,r.type,r.length,r.accent);if(2===i){if(a.isAccent(e[1]))return n=c.getInstance().accentNode_(n,[n,e[1]],{MSUBSUP:"subscript",MUNDEROVER:"underscore"}[t],1,!0),e[2]?c.getInstance().makeLimitNode_(n,[n,e[2]],null,"limupper"):n;if(e[2]&&a.isAccent(e[2]))return n=c.getInstance().accentNode_(n,[n,e[2]],{MSUBSUP:"superscript",MUNDEROVER:"overscore"}[t],1,!0),c.getInstance().makeLimitNode_(n,[n,e[1]],null,"limlower");e[i]||(o="limlower")}return c.getInstance().makeLimitNode_(n,e,null,o)}return r=c.MML_TO_BOUNDS_[t],c.getInstance().accentNode_(n,e,r.type,r.length,r.accent)}tablesInRow(t){let e=l.partitionNodes(t,a.tableIsMatrixOrVector),r=[];for(let t,n=0;t=e.rel[n];n++)r=r.concat(e.comp.shift()),r.push(c.tableToMatrixOrVector_(t));r=r.concat(e.comp.shift()),e=l.partitionNodes(r,a.isTableOrMultiline),r=[];for(let t,n=0;t=e.rel[n];n++){const n=e.comp.shift();a.tableIsCases(t,n)&&c.tableToCases_(t,n.pop()),r=r.concat(n),r.push(t)}return r.concat(e.comp.shift())}mfenced(t,e,r,n){if(r&&n.length>0){const t=c.nextSeparatorFunction_(r),e=[n.shift()];n.forEach((r=>{e.push(c.getInstance().factory_.makeContentNode(t())),e.push(r)})),n=e}return t&&e?c.getInstance().horizontalFencedNode_(c.getInstance().factory_.makeContentNode(t),c.getInstance().factory_.makeContentNode(e),n):(t&&n.unshift(c.getInstance().factory_.makeContentNode(t)),e&&n.push(c.getInstance().factory_.makeContentNode(e)),c.getInstance().row(n))}fractionLikeNode(t,e,r,n){let o;if(!n&&l.isZeroLength(r)){const r=c.getInstance().factory_.makeBranchNode("line",[t],[]),n=c.getInstance().factory_.makeBranchNode("line",[e],[]);return o=c.getInstance().factory_.makeBranchNode("multiline",[r,n],[]),c.binomialForm_(o),c.classifyMultiline(o),o}return o=c.getInstance().fractionNode_(t,e),n&&o.addAnnotation("general","bevelled"),o}tensor(t,e,r,n,o){const i=c.getInstance().factory_.makeBranchNode("tensor",[t,c.getInstance().scriptNode_(e,"leftsub"),c.getInstance().scriptNode_(r,"leftsuper"),c.getInstance().scriptNode_(n,"rightsub"),c.getInstance().scriptNode_(o,"rightsuper")],[]);return i.role=t.role,i.embellished=a.isEmbellished(t),i}pseudoTensor(t,e,r){const n=t=>!a.isType(t,"empty"),o=e.filter(n).length,i=r.filter(n).length;if(!o&&!i)return t;const s=o?i?"MSUBSUP":"MSUB":"MSUP",l=[t];return o&&l.push(c.getInstance().scriptNode_(e,"rightsub",!0)),i&&l.push(c.getInstance().scriptNode_(r,"rightsuper",!0)),c.getInstance().limitNode(s,l)}font(t){const e=c.MATHJAX_FONTS[t];return e||t}proof(t,e,r){if(e.inference||e.axiom||console.log("Noise"),e.axiom){const e=c.getInstance().cleanInference(t.childNodes),n=e.length?c.getInstance().factory_.makeBranchNode("inference",r(e),[]):c.getInstance().factory_.makeEmptyNode();return n.role="axiom",n.mathmlTree=t,n}const n=c.getInstance().inference(t,e,r);return e.proof&&(n.role="proof",n.childNodes[0].role="final"),n}inference(t,e,r){if(e.inferenceRule){const e=c.getInstance().getFormulas(t,[],r);return c.getInstance().factory_.makeBranchNode("inference",[e.conclusion,e.premises],[])}const o=e.labelledRule,i=n.toArray(t.childNodes),s=[];"left"!==o&&"both"!==o||s.push(c.getInstance().getLabel(t,i,r,"left")),"right"!==o&&"both"!==o||s.push(c.getInstance().getLabel(t,i,r,"right"));const a=c.getInstance().getFormulas(t,i,r),l=c.getInstance().factory_.makeBranchNode("inference",[a.conclusion,a.premises],s);return l.mathmlTree=t,l}getLabel(t,e,r,o){const i=c.getInstance().findNestedRow(e,"prooflabel",o),s=c.getInstance().factory_.makeBranchNode("rulelabel",r(n.toArray(i.childNodes)),[]);return s.role=o,s.mathmlTree=i,s}getFormulas(t,e,r){const o=e.length?c.getInstance().findNestedRow(e,"inferenceRule"):t,i="up"===c.getSemantics(o).inferenceRule,s=i?o.childNodes[1]:o.childNodes[0],a=i?o.childNodes[0]:o.childNodes[1],l=s.childNodes[0].childNodes[0],u=n.toArray(l.childNodes[0].childNodes),p=[];let h=1;for(const t of u)h%2&&p.push(t.childNodes[0]),h++;const f=r(p),d=r(n.toArray(a.childNodes[0].childNodes))[0],m=c.getInstance().factory_.makeBranchNode("premises",f,[]);m.mathmlTree=l;const y=c.getInstance().factory_.makeBranchNode("conclusion",[d],[]);return y.mathmlTree=a.childNodes[0].childNodes[0],{conclusion:y,premises:m}}findNestedRow(t,e,r){return c.getInstance().findNestedRow_(t,e,0,r)}cleanInference(t){return n.toArray(t).filter((function(t){return"MSPACE"!==n.tagName(t)}))}operatorNode(t){return"unknown"===t.type&&(t.type="operator"),i.run("multioperator",t)}implicitNode_(t){const e=c.getInstance().factory_.makeMultipleContentNodes(t.length-1,o.invisibleTimes());c.matchSpaces_(t,e);const r=c.getInstance().infixNode_(t,e[0]);return r.role="implicit",e.forEach((function(t){t.parent=r})),r.contentNodes=e,r}infixNode_(t,e){const r=c.getInstance().factory_.makeBranchNode("infixop",t,[e],l.getEmbellishedInner(e).textContent);return r.role=e.role,i.run("propagateSimpleFunction",r)}explicitMixed_(t){const e=l.partitionNodes(t,(function(t){return t.textContent===o.invisiblePlus()}));if(!e.rel.length)return t;let r=[];for(let t,n=0;t=e.rel[n];n++){const o=e.comp[n],i=e.comp[n+1],s=o.length-1;if(o[s]&&i[0]&&a.isType(o[s],"number")&&!a.isRole(o[s],"mixed")&&a.isType(i[0],"fraction")){const t=c.getInstance().factory_.makeBranchNode("number",[o[s],i[0]],[]);t.role="mixed",r=r.concat(o.slice(0,s)),r.push(t),i.shift()}else r=r.concat(o),r.push(t)}return r.concat(e.comp[e.comp.length-1])}concatNode_(t,e,r){if(0===e.length)return t;const n=e.map((function(t){return l.getEmbellishedInner(t).textContent})).join(" "),o=c.getInstance().factory_.makeBranchNode(r,[t],e,n);return e.length>1&&(o.role="multiop"),o}prefixNode_(t,e){const r=l.partitionNodes(e,(t=>a.isRole(t,"subtraction")));let n=c.getInstance().concatNode_(t,r.comp.pop(),"prefixop");for(1===n.contentNodes.length&&"addition"===n.contentNodes[0].role&&"+"===n.contentNodes[0].textContent&&(n.role="positive");r.rel.length>0;)n=c.getInstance().concatNode_(n,[r.rel.pop()],"prefixop"),n.role="negative",n=c.getInstance().concatNode_(n,r.comp.pop(),"prefixop");return n}postfixNode_(t,e){return e.length?c.getInstance().concatNode_(t,e,"postfixop"):t}combineUnits_(t){const e=l.partitionNodes(t,(function(t){return!a.isRole(t,"unit")}));if(t.length===e.rel.length)return e.rel;const r=[];let n,o;do{const t=e.comp.shift();n=e.rel.shift();let i=null;o=r.pop(),o&&(t.length&&a.isUnitCounter(o)?t.unshift(o):r.push(o)),1===t.length&&(i=t.pop()),t.length>1&&(i=c.getInstance().implicitNode_(t),i.role="unit"),i&&r.push(i),n&&r.push(n)}while(n);return r}getMixedNumbers_(t){const e=l.partitionNodes(t,(function(t){return a.isType(t,"fraction")&&a.isRole(t,"vulgar")}));if(!e.rel.length)return t;let r=[];for(let t,n=0;t=e.rel[n];n++){const o=e.comp[n],i=o.length-1;if(o[i]&&a.isType(o[i],"number")&&(a.isRole(o[i],"integer")||a.isRole(o[i],"float"))){const e=c.getInstance().factory_.makeBranchNode("number",[o[i],t],[]);e.role="mixed",r=r.concat(o.slice(0,i)),r.push(e)}else r=r.concat(o),r.push(t)}return r.concat(e.comp[e.comp.length-1])}getTextInRow_(t){if(t.length<=1)return t;const e=l.partitionNodes(t,(t=>a.isType(t,"text")));if(0===e.rel.length)return t;const r=[];let n=e.comp[0];n.length>0&&r.push(c.getInstance().row(n));for(let t,o=0;t=e.rel[o];o++)r.push(t),n=e.comp[o+1],n.length>0&&r.push(c.getInstance().row(n));return[c.getInstance().dummyNode_(r)]}relationsInRow_(t){const e=l.partitionNodes(t,a.isRelation),r=e.rel[0];if(!r)return c.getInstance().operationsInRow_(t);if(1===t.length)return t[0];const n=e.comp.map(c.getInstance().operationsInRow_);let o;return e.rel.some((function(t){return!t.equals(r)}))?(o=c.getInstance().factory_.makeBranchNode("multirel",n,e.rel),e.rel.every((function(t){return t.role===r.role}))&&(o.role=r.role),o):(o=c.getInstance().factory_.makeBranchNode("relseq",n,e.rel,l.getEmbellishedInner(r).textContent),o.role=r.role,o)}operationsInRow_(t){if(0===t.length)return c.getInstance().factory_.makeEmptyNode();if(1===(t=c.getInstance().explicitMixed_(t)).length)return t[0];const e=[];for(;t.length>0&&a.isOperator(t[0]);)e.push(t.shift());if(0===t.length)return c.getInstance().prefixNode_(e.pop(),e);if(1===t.length)return c.getInstance().prefixNode_(t[0],e);t=i.run("convert_juxtaposition",t);const r=l.sliceNodes(t,a.isOperator),n=c.getInstance().prefixNode_(c.getInstance().implicitNode(r.head),e);return r.div?c.getInstance().operationsTree_(r.tail,n,r.div):n}operationsTree_(t,e,r,n){const o=n||[];if(0===t.length){if(o.unshift(r),"infixop"===e.type){const t=c.getInstance().postfixNode_(e.childNodes.pop(),o);return e.appendChild(t),e}return c.getInstance().postfixNode_(e,o)}const i=l.sliceNodes(t,a.isOperator);if(0===i.head.length)return o.push(i.div),c.getInstance().operationsTree_(i.tail,e,r,o);const s=c.getInstance().prefixNode_(c.getInstance().implicitNode(i.head),o),u=c.getInstance().appendOperand_(e,r,s);return i.div?c.getInstance().operationsTree_(i.tail,u,i.div,[]):u}appendOperand_(t,e,r){if("infixop"!==t.type)return c.getInstance().infixNode_([t,r],e);const n=c.getInstance().appendDivisionOp_(t,e,r);return n||(c.getInstance().appendExistingOperator_(t,e,r)?t:"multiplication"===e.role?c.getInstance().appendMultiplicativeOp_(t,e,r):c.getInstance().appendAdditiveOp_(t,e,r))}appendDivisionOp_(t,e,r){return"division"===e.role?a.isImplicit(t)?c.getInstance().infixNode_([t,r],e):c.getInstance().appendLastOperand_(t,e,r):"division"===t.role?c.getInstance().infixNode_([t,r],e):null}appendLastOperand_(t,e,r){let n=t,o=t.childNodes[t.childNodes.length-1];for(;o&&"infixop"===o.type&&!a.isImplicit(o);)n=o,o=n.childNodes[t.childNodes.length-1];const i=c.getInstance().infixNode_([n.childNodes.pop(),r],e);return n.appendChild(i),t}appendMultiplicativeOp_(t,e,r){if(a.isImplicit(t))return c.getInstance().infixNode_([t,r],e);let n=t,o=t.childNodes[t.childNodes.length-1];for(;o&&"infixop"===o.type&&!a.isImplicit(o);)n=o,o=n.childNodes[t.childNodes.length-1];const i=c.getInstance().infixNode_([n.childNodes.pop(),r],e);return n.appendChild(i),t}appendAdditiveOp_(t,e,r){return c.getInstance().infixNode_([t,r],e)}appendExistingOperator_(t,e,r){return!(!t||"infixop"!==t.type||a.isImplicit(t))&&(t.contentNodes[0].equals(e)?(t.appendContentNode(e),t.appendChild(r),!0):c.getInstance().appendExistingOperator_(t.childNodes[t.childNodes.length-1],e,r))}getFencesInRow_(t){let e=l.partitionNodes(t,a.isFence);e=c.purgeFences_(e);const r=e.comp.shift();return c.getInstance().fences_(e.rel,e.comp,[],[r])}fences_(t,e,r,n){if(0===t.length&&0===r.length)return n[0];const o=t=>a.isRole(t,"open");if(0===t.length){const t=n.shift();for(;r.length>0;){if(o(r[0])){const e=r.shift();c.fenceToPunct_(e),t.push(e)}else{const e=l.sliceNodes(r,o),i=e.head.length-1,s=c.getInstance().neutralFences_(e.head,n.slice(0,i));n=n.slice(i),t.push(...s),e.div&&e.tail.unshift(e.div),r=e.tail}t.push(...n.shift())}return t}const i=r[r.length-1],s=t[0].role;if("open"===s||a.isNeutralFence(t[0])&&(!i||!a.compareNeutralFences(t[0],i))){r.push(t.shift());const o=e.shift();return o&&n.push(o),c.getInstance().fences_(t,e,r,n)}if(i&&"close"===s&&"open"===i.role){const o=c.getInstance().horizontalFencedNode_(r.pop(),t.shift(),n.pop());return n.push(n.pop().concat([o],e.shift())),c.getInstance().fences_(t,e,r,n)}if(i&&a.compareNeutralFences(t[0],i)){if(!a.elligibleLeftNeutral(i)||!a.elligibleRightNeutral(t[0])){r.push(t.shift());const o=e.shift();return o&&n.push(o),c.getInstance().fences_(t,e,r,n)}const o=c.getInstance().horizontalFencedNode_(r.pop(),t.shift(),n.pop());return n.push(n.pop().concat([o],e.shift())),c.getInstance().fences_(t,e,r,n)}if(i&&"close"===s&&a.isNeutralFence(i)&&r.some(o)){const i=l.sliceNodes(r,o,!0),s=n.pop(),a=n.length-i.tail.length+1,u=c.getInstance().neutralFences_(i.tail,n.slice(a));n=n.slice(0,a);const p=c.getInstance().horizontalFencedNode_(i.div,t.shift(),n.pop().concat(u,s));return n.push(n.pop().concat([p],e.shift())),c.getInstance().fences_(t,e,i.head,n)}const u=t.shift();return c.fenceToPunct_(u),n.push(n.pop().concat([u],e.shift())),c.getInstance().fences_(t,e,r,n)}neutralFences_(t,e){if(0===t.length)return t;if(1===t.length)return c.fenceToPunct_(t[0]),t;const r=t.shift();if(!a.elligibleLeftNeutral(r)){c.fenceToPunct_(r);const n=e.shift();return n.unshift(r),n.concat(c.getInstance().neutralFences_(t,e))}const n=l.sliceNodes(t,(function(t){return a.compareNeutralFences(t,r)}));if(!n.div){c.fenceToPunct_(r);const n=e.shift();return n.unshift(r),n.concat(c.getInstance().neutralFences_(t,e))}if(!a.elligibleRightNeutral(n.div))return c.fenceToPunct_(n.div),t.unshift(r),c.getInstance().neutralFences_(t,e);const o=c.getInstance().combineFencedContent_(r,n.div,n.head,e);if(n.tail.length>0){const t=o.shift(),e=c.getInstance().neutralFences_(n.tail,o);return t.concat(e)}return o[0]}combineFencedContent_(t,e,r,n){if(0===r.length){const r=c.getInstance().horizontalFencedNode_(t,e,n.shift());return n.length>0?n[0].unshift(r):n=[[r]],n}const o=n.shift(),i=r.length-1,s=n.slice(0,i),a=(n=n.slice(i)).shift(),l=c.getInstance().neutralFences_(r,s);o.push(...l),o.push(...a);const u=c.getInstance().horizontalFencedNode_(t,e,o);return n.length>0?n[0].unshift(u):n=[[u]],n}horizontalFencedNode_(t,e,r){const n=c.getInstance().row(r);let o=c.getInstance().factory_.makeBranchNode("fenced",[n],[t,e]);return"open"===t.role?(c.getInstance().classifyHorizontalFence_(o),o=i.run("propagateComposedFunction",o)):o.role=t.role,o=i.run("detect_cycle",o),c.rewriteFencedNode_(o)}classifyHorizontalFence_(t){t.role="leftright";const e=t.childNodes;if(!a.isSetNode(t)||e.length>1)return;if(0===e.length||"empty"===e[0].type)return void(t.role="set empty");const r=e[0].type;if(1===e.length&&a.isSingletonSetContent(e[0]))return void(t.role="set singleton");const n=e[0].role;if("punctuated"===r&&"sequence"===n){if("comma"!==e[0].contentNodes[0].role)return 1!==e[0].contentNodes.length||"vbar"!==e[0].contentNodes[0].role&&"colon"!==e[0].contentNodes[0].role?void 0:(t.role="set extended",void c.getInstance().setExtension_(t));t.role="set collection"}}setExtension_(t){const e=t.childNodes[0].childNodes[0];e&&"infixop"===e.type&&1===e.contentNodes.length&&a.isMembership(e.contentNodes[0])&&(e.addAnnotation("set","intensional"),e.contentNodes[0].addAnnotation("set","intensional"))}getPunctuationInRow_(t){if(t.length<=1)return t;const e=t=>{const e=t.type;return"punctuation"===e||"text"===e||"operator"===e||"relation"===e},r=l.partitionNodes(t,(function(r){if(!a.isPunctuation(r))return!1;if(a.isPunctuation(r)&&!a.isRole(r,"ellipsis"))return!0;const n=t.indexOf(r);if(0===n)return!t[1]||!e(t[1]);const o=t[n-1];if(n===t.length-1)return!e(o);const i=t[n+1];return!e(o)||!e(i)}));if(0===r.rel.length)return t;const n=[];let o=r.comp.shift();o.length>0&&n.push(c.getInstance().row(o));let i=0;for(;r.comp.length>0;)n.push(r.rel[i++]),o=r.comp.shift(),o.length>0&&n.push(c.getInstance().row(o));return[c.getInstance().punctuatedNode_(n,r.rel)]}punctuatedNode_(t,e){const r=c.getInstance().factory_.makeBranchNode("punctuated",t,e);if(e.length===t.length){const t=e[0].role;if("unknown"!==t&&e.every((function(e){return e.role===t})))return r.role=t,r}return a.singlePunctAtPosition(t,e,0)?r.role="startpunct":a.singlePunctAtPosition(t,e,t.length-1)?r.role="endpunct":e.every((t=>a.isRole(t,"dummy")))?r.role="text":e.every((t=>a.isRole(t,"space")))?r.role="space":r.role="sequence",r}dummyNode_(t){const e=c.getInstance().factory_.makeMultipleContentNodes(t.length-1,o.invisibleComma());return e.forEach((function(t){t.role="dummy"})),c.getInstance().punctuatedNode_(t,e)}accentRole_(t,e){if(!a.isAccent(t))return!1;const r=t.textContent,n=o.lookupSecondary("bar",r)||o.lookupSecondary("tilde",r)||t.role;return t.role="underscore"===e?"underaccent":"overaccent",t.addAnnotation("accent",n),!0}accentNode_(t,e,r,n,o){const i=(e=e.slice(0,n+1))[1],s=e[2];let a;if(!o&&s&&(a=c.getInstance().factory_.makeBranchNode("subscript",[t,i],[]),a.role="subsup",e=[a,s],r="superscript"),o){const n=c.getInstance().accentRole_(i,r);if(s){c.getInstance().accentRole_(s,"overscore")&&!n?(a=c.getInstance().factory_.makeBranchNode("overscore",[t,s],[]),e=[a,i],r="underscore"):(a=c.getInstance().factory_.makeBranchNode("underscore",[t,i],[]),e=[a,s],r="overscore"),a.role="underover"}}return c.getInstance().makeLimitNode_(t,e,a,r)}makeLimitNode_(t,e,r,n){if("limupper"===n&&"limlower"===t.type)return t.childNodes.push(e[1]),e[1].parent=t,t.type="limboth",t;if("limlower"===n&&"limupper"===t.type)return t.childNodes.splice(1,-1,e[1]),e[1].parent=t,t.type="limboth",t;const o=c.getInstance().factory_.makeBranchNode(n,e,[]),i=a.isEmbellished(t);return r&&(r.embellished=i),o.embellished=i,o.role=t.role,o}getFunctionsInRow_(t,e){const r=e||[];if(0===t.length)return r;const n=t.shift(),o=c.classifyFunction_(n,t);if(!o)return r.push(n),c.getInstance().getFunctionsInRow_(t,r);const i=c.getInstance().getFunctionsInRow_(t,[]),s=c.getInstance().getFunctionArgs_(n,i,o);return r.concat(s)}getFunctionArgs_(t,e,r){let n,o,i;switch(r){case"integral":{const r=c.getInstance().getIntegralArgs_(e);if(!r.intvar&&!r.integrand.length)return r.rest.unshift(t),r.rest;const n=c.getInstance().row(r.integrand);return i=c.getInstance().integralNode_(t,n,r.intvar),r.rest.unshift(i),r.rest}case"prefix":if(e[0]&&"fenced"===e[0].type){const r=e.shift();return a.isNeutralFence(r)||(r.role="leftright"),i=c.getInstance().functionNode_(t,r),e.unshift(i),e}if(n=l.sliceNodes(e,a.isPrefixFunctionBoundary),n.head.length)o=c.getInstance().row(n.head),n.div&&n.tail.unshift(n.div);else{if(!n.div||!a.isType(n.div,"appl"))return e.unshift(t),e;o=n.div}return i=c.getInstance().functionNode_(t,o),n.tail.unshift(i),n.tail;case"bigop":return n=l.sliceNodes(e,a.isBigOpBoundary),n.head.length?(o=c.getInstance().row(n.head),i=c.getInstance().bigOpNode_(t,o),n.div&&n.tail.unshift(n.div),n.tail.unshift(i),n.tail):(e.unshift(t),e);default:{if(0===e.length)return[t];const r=e[0];return"fenced"===r.type&&!a.isNeutralFence(r)&&a.isSimpleFunctionScope(r)?(r.role="leftright",c.propagateFunctionRole_(t,"simple function"),i=c.getInstance().functionNode_(t,e.shift()),e.unshift(i),e):(e.unshift(t),e)}}}getIntegralArgs_(t,e=[]){if(0===t.length)return{integrand:e,intvar:null,rest:t};const r=t[0];if(a.isGeneralFunctionBoundary(r))return{integrand:e,intvar:null,rest:t};if(a.isIntegralDxBoundarySingle(r))return r.role="integral",{integrand:e,intvar:r,rest:t.slice(1)};if(t[1]&&a.isIntegralDxBoundary(r,t[1])){const n=c.getInstance().prefixNode_(t[1],[r]);return n.role="integral",{integrand:e,intvar:n,rest:t.slice(2)}}return e.push(t.shift()),c.getInstance().getIntegralArgs_(t,e)}functionNode_(t,e){const r=c.getInstance().factory_.makeContentNode(o.functionApplication()),n=c.getInstance().funcAppls[t.id];n&&(r.mathmlTree=n.mathmlTree,r.mathml=n.mathml,r.annotation=n.annotation,r.attributes=n.attributes,delete c.getInstance().funcAppls[t.id]),r.type="punctuation",r.role="application";const i=c.getFunctionOp_(t,(function(t){return a.isType(t,"function")||a.isType(t,"identifier")&&a.isRole(t,"simple function")}));return c.getInstance().functionalNode_("appl",[t,e],i,[r])}bigOpNode_(t,e){const r=c.getFunctionOp_(t,(t=>a.isType(t,"largeop")));return c.getInstance().functionalNode_("bigop",[t,e],r,[])}integralNode_(t,e,r){e=e||c.getInstance().factory_.makeEmptyNode(),r=r||c.getInstance().factory_.makeEmptyNode();const n=c.getFunctionOp_(t,(t=>a.isType(t,"largeop")));return c.getInstance().functionalNode_("integral",[t,e,r],n,[])}functionalNode_(t,e,r,n){const o=e[0];let i;r&&(i=r.parent,n.push(r));const s=c.getInstance().factory_.makeBranchNode(t,e,n);return s.role=o.role,i&&(r.parent=i),s}fractionNode_(t,e){const r=c.getInstance().factory_.makeBranchNode("fraction",[t,e],[]);return r.role=r.childNodes.every((function(t){return a.isType(t,"number")&&a.isRole(t,"integer")}))?"vulgar":r.childNodes.every(a.isPureUnit)?"unit":"division",i.run("propagateSimpleFunction",r)}scriptNode_(t,e,r){let n;switch(t.length){case 0:n=c.getInstance().factory_.makeEmptyNode();break;case 1:if(n=t[0],r)return n;break;default:n=c.getInstance().dummyNode_(t)}return n.role=e,n}findNestedRow_(t,e,r,o){if(r>3)return null;for(let i,s=0;i=t[s];s++){const t=n.tagName(i);if("MSPACE"!==t){if("MROW"===t)return c.getInstance().findNestedRow_(n.toArray(i.childNodes),e,r+1,o);if(c.findSemantics(i,e,o))return i}}return null}}e.default=c,c.FENCE_TO_PUNCT_={metric:"metric",neutral:"vbar",open:"openfence",close:"closefence"},c.MML_TO_LIMIT_={MSUB:{type:"limlower",length:1},MUNDER:{type:"limlower",length:1},MSUP:{type:"limupper",length:1},MOVER:{type:"limupper",length:1},MSUBSUP:{type:"limboth",length:2},MUNDEROVER:{type:"limboth",length:2}},c.MML_TO_BOUNDS_={MSUB:{type:"subscript",length:1,accent:!1},MSUP:{type:"superscript",length:1,accent:!1},MSUBSUP:{type:"subscript",length:2,accent:!1},MUNDER:{type:"underscore",length:1,accent:!0},MOVER:{type:"overscore",length:1,accent:!0},MUNDEROVER:{type:"underscore",length:2,accent:!0}},c.CLASSIFY_FUNCTION_={integral:"integral",sum:"bigop","prefix function":"prefix","limit function":"prefix","simple function":"prefix","composed function":"prefix"},c.MATHJAX_FONTS={"-tex-caligraphic":"caligraphic","-tex-caligraphic-bold":"caligraphic-bold","-tex-calligraphic":"caligraphic","-tex-calligraphic-bold":"caligraphic-bold","-tex-oldstyle":"oldstyle","-tex-oldstyle-bold":"oldstyle-bold","-tex-mathit":"italic"}},5656:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticSkeleton=void 0;const n=r(707),o=r(5274),i=r(2298);class s{constructor(t){this.parents=null,this.levelsMap=null,t=0===t?t:t||[],this.array=t}static fromTree(t){return s.fromNode(t.root)}static fromNode(t){return new s(s.fromNode_(t))}static fromString(t){return new s(s.fromString_(t))}static simpleCollapseStructure(t){return"number"==typeof t}static contentCollapseStructure(t){return!!t&&!s.simpleCollapseStructure(t)&&"c"===t[0]}static interleaveIds(t,e){return n.interleaveLists(s.collapsedLeafs(t),s.collapsedLeafs(e))}static collapsedLeafs(...t){return t.reduce(((t,e)=>{return t.concat((r=e,s.simpleCollapseStructure(r)?[r]:(r=r,s.contentCollapseStructure(r[1])?r.slice(2):r.slice(1))));var r}),[])}static fromStructure(t,e){return new s(s.tree_(t,e.root))}static combineContentChildren(t,e,r){switch(t.type){case"relseq":case"infixop":case"multirel":return n.interleaveLists(r,e);case"prefixop":return e.concat(r);case"postfixop":return r.concat(e);case"fenced":return r.unshift(e[0]),r.push(e[1]),r;case"appl":return[r[0],e[0],r[1]];case"root":return[r[1],r[0]];case"row":case"line":return e.length&&r.unshift(e[0]),r;default:return r}}static makeSexp_(t){return s.simpleCollapseStructure(t)?t.toString():s.contentCollapseStructure(t)?"(c "+t.slice(1).map(s.makeSexp_).join(" ")+")":"("+t.map(s.makeSexp_).join(" ")+")"}static fromString_(t){let e=t.replace(/\(/g,"[");return e=e.replace(/\)/g,"]"),e=e.replace(/ /g,","),e=e.replace(/c/g,'"c"'),JSON.parse(e)}static fromNode_(t){if(!t)return[];const e=t.contentNodes;let r;e.length&&(r=e.map(s.fromNode_),r.unshift("c"));const n=t.childNodes;if(!n.length)return e.length?[t.id,r]:t.id;const o=n.map(s.fromNode_);return e.length&&o.unshift(r),o.unshift(t.id),o}static tree_(t,e){if(!e)return[];if(!e.childNodes.length)return e.id;const r=e.id,n=[r],a=o.evalXPath(`.//self::*[@${i.Attribute.ID}=${r}]`,t)[0],l=s.combineContentChildren(e,e.contentNodes.map((function(t){return t})),e.childNodes.map((function(t){return t})));a&&s.addOwns_(a,l);for(let e,r=0;e=l[r];r++)n.push(s.tree_(t,e));return n}static addOwns_(t,e){const r=t.getAttribute(i.Attribute.COLLAPSED),n=r?s.realLeafs_(s.fromString(r).array):e.map((t=>t.id));t.setAttribute(i.Attribute.OWNS,n.join(" "))}static realLeafs_(t){if(s.simpleCollapseStructure(t))return[t];if(s.contentCollapseStructure(t))return[];t=t;let e=[];for(let r=1;r<t.length;r++)e=e.concat(s.realLeafs_(t[r]));return e}populate(){this.parents&&this.levelsMap||(this.parents={},this.levelsMap={},this.populate_(this.array,this.array,[]))}toString(){return s.makeSexp_(this.array)}populate_(t,e,r){if(s.simpleCollapseStructure(t))return t=t,this.levelsMap[t]=e,void(this.parents[t]=t===r[0]?r.slice(1):r);const n=s.contentCollapseStructure(t)?t.slice(1):t,o=[n[0]].concat(r);for(let e=0,r=n.length;e<r;e++){const r=n[e];this.populate_(r,t,o)}}isRoot(t){return t===this.levelsMap[t][0]}directChildren(t){if(!this.isRoot(t))return[];return this.levelsMap[t].slice(1).map((t=>s.simpleCollapseStructure(t)?t:s.contentCollapseStructure(t)?t[1]:t[0]))}subtreeNodes(t){if(!this.isRoot(t))return[];const e=(t,r)=>{s.simpleCollapseStructure(t)?r.push(t):(t=t,s.contentCollapseStructure(t)&&(t=t.slice(1)),t.forEach((t=>e(t,r))))},r=this.levelsMap[t],n=[];return e(r.slice(1),n),n}}e.SemanticSkeleton=s},7075:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticTree=void 0;const n=r(5740),o=r(7630),i=r(9265),s=r(7228),a=r(5952),l=r(5609);r(94);class c{constructor(t){this.mathml=t,this.parser=new s.SemanticMathml,this.root=this.parser.parse(t),this.collator=this.parser.getFactory().leafMap.collateMeaning();const e=this.collator.newDefault();e&&(this.parser=new s.SemanticMathml,this.parser.getFactory().defaultMap=e,this.root=this.parser.parse(t)),u.visit(this.root,{}),(0,o.annotate)(this.root)}static empty(){const t=n.parseInput("<math/>"),e=new c(t);return e.mathml=t,e}static fromNode(t,e){const r=c.empty();return r.root=t,e&&(r.mathml=e),r}static fromRoot(t,e){let r=t;for(;r.parent;)r=r.parent;const n=c.fromNode(r);return e&&(n.mathml=e),n}static fromXml(t){const e=c.empty();return t.childNodes[0]&&(e.root=a.SemanticNode.fromXml(t.childNodes[0])),e}xml(t){const e=n.parseInput("<stree></stree>"),r=this.root.xml(e.ownerDocument,t);return e.appendChild(r),e}toString(t){return n.serializeXml(this.xml(t))}formatXml(t){const e=this.toString(t);return n.formatXml(e)}displayTree(){this.root.displayTree()}replaceNode(t,e){const r=t.parent;r?r.replaceChild(t,e):this.root=e}toJson(){const t={};return t.stree=this.root.toJson(),t}}e.SemanticTree=c;const u=new i.SemanticVisitor("general","unit",((t,e)=>{if("infixop"===t.type&&("multiplication"===t.role||"implicit"===t.role)){const e=t.childNodes;e.length&&(l.isPureUnit(e[0])||l.isUnitCounter(e[0]))&&t.childNodes.slice(1).every(l.isPureUnit)&&(t.role="unit")}return!1}))},4795:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.partitionNodes=e.sliceNodes=e.getEmbellishedInner=e.addAttributes=e.isZeroLength=e.purgeNodes=e.isOrphanedGlyph=e.hasDisplayTag=e.hasEmptyTag=e.hasIgnoreTag=e.hasLeafTag=e.hasMathTag=e.directSpeechKeys=e.DISPLAYTAGS=e.EMPTYTAGS=e.IGNORETAGS=e.LEAFTAGS=void 0;const n=r(5740);function o(t){return!!t&&-1!==e.LEAFTAGS.indexOf(n.tagName(t))}function i(t,e,r){r&&t.reverse();const n=[];for(let o,i=0;o=t[i];i++){if(e(o))return r?{head:t.slice(i+1).reverse(),div:o,tail:n.reverse()}:{head:n,div:o,tail:t.slice(i+1)};n.push(o)}return r?{head:[],div:null,tail:n.reverse()}:{head:n,div:null,tail:[]}}e.LEAFTAGS=["MO","MI","MN","MTEXT","MS","MSPACE"],e.IGNORETAGS=["MERROR","MPHANTOM","MALIGNGROUP","MALIGNMARK","MPRESCRIPTS","ANNOTATION","ANNOTATION-XML"],e.EMPTYTAGS=["MATH","MROW","MPADDED","MACTION","NONE","MSTYLE","SEMANTICS"],e.DISPLAYTAGS=["MROOT","MSQRT"],e.directSpeechKeys=["aria-label","exact-speech","alt"],e.hasMathTag=function(t){return!!t&&"MATH"===n.tagName(t)},e.hasLeafTag=o,e.hasIgnoreTag=function(t){return!!t&&-1!==e.IGNORETAGS.indexOf(n.tagName(t))},e.hasEmptyTag=function(t){return!!t&&-1!==e.EMPTYTAGS.indexOf(n.tagName(t))},e.hasDisplayTag=function(t){return!!t&&-1!==e.DISPLAYTAGS.indexOf(n.tagName(t))},e.isOrphanedGlyph=function(t){return!!t&&"MGLYPH"===n.tagName(t)&&!o(t.parentNode)},e.purgeNodes=function(t){const r=[];for(let o,i=0;o=t[i];i++){if(o.nodeType!==n.NodeType.ELEMENT_NODE)continue;const t=n.tagName(o);-1===e.IGNORETAGS.indexOf(t)&&(-1!==e.EMPTYTAGS.indexOf(t)&&0===o.childNodes.length||r.push(o))}return r},e.isZeroLength=function(t){if(!t)return!1;if(-1!==["negativeveryverythinmathspace","negativeverythinmathspace","negativethinmathspace","negativemediummathspace","negativethickmathspace","negativeverythickmathspace","negativeveryverythickmathspace"].indexOf(t))return!0;const e=t.match(/[0-9.]+/);return!!e&&0===parseFloat(e[0])},e.addAttributes=function(t,r){if(r.hasAttributes()){const n=r.attributes;for(let r=n.length-1;r>=0;r--){const o=n[r].name;o.match(/^ext/)&&(t.attributes[o]=n[r].value,t.nobreaking=!0),-1!==e.directSpeechKeys.indexOf(o)&&(t.attributes["ext-speech"]=n[r].value,t.nobreaking=!0),o.match(/texclass$/)&&(t.attributes.texclass=n[r].value),"href"===o&&(t.attributes.href=n[r].value,t.nobreaking=!0)}}},e.getEmbellishedInner=function t(e){return e&&e.embellished&&e.childNodes.length>0?t(e.childNodes[0]):e},e.sliceNodes=i,e.partitionNodes=function(t,e){let r=t;const n=[],o=[];let s=null;do{s=i(r,e),o.push(s.head),n.push(s.div),r=s.tail}while(s.div);return n.pop(),{rel:n,comp:o}}},6278:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractSpeechGenerator=void 0;const n=r(6828),o=r(2298),i=r(1214),s=r(9543);e.AbstractSpeechGenerator=class{constructor(){this.modality=o.addPrefix("speech"),this.rebuilt_=null,this.options_={}}getRebuilt(){return this.rebuilt_}setRebuilt(t){this.rebuilt_=t}setOptions(t){this.options_=t||{},this.modality=o.addPrefix(this.options_.modality||"speech")}getOptions(){return this.options_}start(){}end(){}generateSpeech(t,e){return this.rebuilt_||(this.rebuilt_=new i.RebuildStree(e)),(0,n.setup)(this.options_),s.computeMarkup(this.getRebuilt().xml)}}},1452:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AdhocSpeechGenerator=void 0;const n=r(6278);class o extends n.AbstractSpeechGenerator{getSpeech(t,e){const r=this.generateSpeech(t,e);return t.setAttribute(this.modality,r),r}}e.AdhocSpeechGenerator=o},5152:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ColorGenerator=void 0;const n=r(2298),o=r(8396),i=r(1214),s=r(1204),a=r(6278);class l extends a.AbstractSpeechGenerator{constructor(){super(...arguments),this.modality=(0,n.addPrefix)("foreground"),this.contrast=new o.ContrastPicker}static visitStree_(t,e,r){if(t.childNodes.length){if(t.contentNodes.length&&("punctuated"===t.type&&t.contentNodes.forEach((t=>r[t.id]=!0)),"implicit"!==t.role&&e.push(t.contentNodes.map((t=>t.id)))),t.childNodes.length){if("implicit"===t.role){const n=[];let o=[];for(const e of t.childNodes){const t=[];l.visitStree_(e,t,r),t.length<=2&&n.push(t.shift()),o=o.concat(t)}return e.push(n),void o.forEach((t=>e.push(t)))}t.childNodes.forEach((t=>l.visitStree_(t,e,r)))}}else r[t.id]||e.push(t.id)}getSpeech(t,e){return s.getAttribute(t,this.modality)}generateSpeech(t,e){return this.getRebuilt()||this.setRebuilt(new i.RebuildStree(t)),this.colorLeaves_(t),s.getAttribute(t,this.modality)}colorLeaves_(t){const e=[];l.visitStree_(this.getRebuilt().streeRoot,e,{});for(const r of e){const e=this.contrast.generate();let n=!1;n=Array.isArray(r)?r.map((r=>this.colorLeave_(t,r,e))).reduce(((t,e)=>t||e),!1):this.colorLeave_(t,r.toString(),e),n&&this.contrast.increment()}}colorLeave_(t,e,r){const n=s.getBySemanticId(t,e);return!!n&&(n.setAttribute(this.modality,r),!0)}}e.ColorGenerator=l},6604:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DirectSpeechGenerator=void 0;const n=r(1204),o=r(6278);class i extends o.AbstractSpeechGenerator{getSpeech(t,e){return n.getAttribute(t,this.modality)}}e.DirectSpeechGenerator=i},3123:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DummySpeechGenerator=void 0;const n=r(6278);class o extends n.AbstractSpeechGenerator{getSpeech(t,e){return""}}e.DummySpeechGenerator=o},5858:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.NodeSpeechGenerator=void 0;const n=r(1204),o=r(4598);class i extends o.TreeSpeechGenerator{getSpeech(t,e){return super.getSpeech(t,e),n.getAttribute(t,this.modality)}}e.NodeSpeechGenerator=i},9552:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.generatorMapping_=e.generator=void 0;const n=r(1452),o=r(5152),i=r(6604),s=r(3123),a=r(5858),l=r(597),c=r(4598);e.generator=function(t){return(e.generatorMapping_[t]||e.generatorMapping_.Direct)()},e.generatorMapping_={Adhoc:()=>new n.AdhocSpeechGenerator,Color:()=>new o.ColorGenerator,Direct:()=>new i.DirectSpeechGenerator,Dummy:()=>new s.DummySpeechGenerator,Node:()=>new a.NodeSpeechGenerator,Summary:()=>new l.SummarySpeechGenerator,Tree:()=>new c.TreeSpeechGenerator}},9543:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.computeSummary_=e.retrieveSummary=e.connectAllMactions=e.connectMactions=e.nodeAtPosition_=e.computePrefix_=e.retrievePrefix=e.addPrefix=e.addModality=e.addSpeech=e.recomputeMarkup=e.computeMarkup=e.recomputeSpeech=e.computeSpeech=void 0;const n=r(8290),o=r(5740),i=r(5274),s=r(2298),a=r(2362),l=r(7075),c=r(1204);function u(t){return a.SpeechRuleEngine.getInstance().evaluateNode(t)}function p(t){return u(l.SemanticTree.fromNode(t).xml())}function h(t){const e=p(t);return n.markup(e)}function f(t){const e=d(t);return n.markup(e)}function d(t){const e=l.SemanticTree.fromRoot(t),r=i.evalXPath('.//*[@id="'+t.id+'"]',e.xml());let n=r[0];return r.length>1&&(n=m(t,r)||n),n?a.SpeechRuleEngine.getInstance().runInSetting({modality:"prefix",domain:"default",style:"default",strict:!0,speech:!0},(function(){return a.SpeechRuleEngine.getInstance().evaluateNode(n)})):[]}function m(t,e){const r=e[0];if(!t.parent)return r;const n=[];for(;t;)n.push(t.id),t=t.parent;const o=function(t,e){for(;e.length&&e.shift().toString()===t.getAttribute("id")&&t.parentNode&&t.parentNode.parentNode;)t=t.parentNode.parentNode;return!e.length};for(let t,r=0;t=e[r];r++)if(o(t,n.slice()))return t;return r}function y(t){return t?a.SpeechRuleEngine.getInstance().runInSetting({modality:"summary",strict:!1,speech:!0},(function(){return a.SpeechRuleEngine.getInstance().evaluateNode(t)})):[]}e.computeSpeech=u,e.recomputeSpeech=p,e.computeMarkup=function(t){const e=u(t);return n.markup(e)},e.recomputeMarkup=h,e.addSpeech=function(t,e,r){const i=o.querySelectorAllByAttrValue(r,"id",e.id.toString())[0],a=i?n.markup(u(i)):h(e);t.setAttribute(s.Attribute.SPEECH,a)},e.addModality=function(t,e,r){const n=h(e);t.setAttribute(r,n)},e.addPrefix=function(t,e){const r=f(e);r&&t.setAttribute(s.Attribute.PREFIX,r)},e.retrievePrefix=f,e.computePrefix_=d,e.nodeAtPosition_=m,e.connectMactions=function(t,e,r){const n=o.querySelectorAll(e,"maction");for(let e,i=0;e=n[i];i++){const n=e.getAttribute("id"),i=o.querySelectorAllByAttrValue(t,"id",n)[0];if(!i)continue;const a=e.childNodes[1],l=a.getAttribute(s.Attribute.ID);let u=c.getBySemanticId(t,l);if(u&&"dummy"!==u.getAttribute(s.Attribute.TYPE))continue;if(u=i.childNodes[0],u.getAttribute("sre-highlighter-added"))continue;const p=a.getAttribute(s.Attribute.PARENT);p&&u.setAttribute(s.Attribute.PARENT,p),u.setAttribute(s.Attribute.TYPE,"dummy"),u.setAttribute(s.Attribute.ID,l);o.querySelectorAllByAttrValue(r,"id",l)[0].setAttribute("alternative",l)}},e.connectAllMactions=function(t,e){const r=o.querySelectorAll(t,"maction");for(let t,n=0;t=r[n];n++){const r=t.childNodes[1].getAttribute(s.Attribute.ID);o.querySelectorAllByAttrValue(e,"id",r)[0].setAttribute("alternative",r)}},e.retrieveSummary=function(t){const e=y(t);return n.markup(e)},e.computeSummary_=y},597:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SummarySpeechGenerator=void 0;const n=r(6278),o=r(9543);class i extends n.AbstractSpeechGenerator{getSpeech(t,e){return o.connectAllMactions(e,this.getRebuilt().xml),this.generateSpeech(t,e)}}e.SummarySpeechGenerator=i},4598:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.TreeSpeechGenerator=void 0;const n=r(2298),o=r(1204),i=r(6278),s=r(9543);class a extends i.AbstractSpeechGenerator{getSpeech(t,e){const r=this.generateSpeech(t,e),i=this.getRebuilt().nodeDict;for(const r in i){const a=i[r],l=o.getBySemanticId(e,r),c=o.getBySemanticId(t,r);l&&c&&(this.modality&&this.modality!==n.Attribute.SPEECH?s.addModality(c,a,this.modality):s.addSpeech(c,a,this.getRebuilt().xml),this.modality===n.Attribute.SPEECH&&s.addPrefix(c,a))}return r}}e.TreeSpeechGenerator=a},313:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.INTERVALS=e.makeLetter=e.numberRules=e.alphabetRules=e.getFont=e.makeInterval=e.generate=e.makeDomains_=e.Domains_=e.Base=e.Embellish=e.Font=void 0;const n=r(5897),o=r(7491),i=r(4356),s=r(2536),a=r(2780);var l,c,u;function p(){const t=i.LOCALE.ALPHABETS,r=(t,e)=>{const r={};return Object.keys(t).forEach((t=>r[t]=!0)),Object.keys(e).forEach((t=>r[t]=!0)),Object.keys(r)};e.Domains_.small=r(t.smallPrefix,t.letterTrans),e.Domains_.capital=r(t.capPrefix,t.letterTrans),e.Domains_.digit=r(t.digitPrefix,t.digitTrans)}function h(t){const e=t.toString(16).toUpperCase();return e.length>3?e:("000"+e).slice(-4)}function f([t,e],r){const n=parseInt(t,16),o=parseInt(e,16),i=[];for(let t=n;t<=o;t++){let e=h(t);!1!==r[e]&&(e=r[e]||e,i.push(e))}return i}function d(t){const e="normal"===t||"fullwidth"===t?"":i.LOCALE.MESSAGES.font[t]||i.LOCALE.MESSAGES.embellish[t]||"";return(0,s.localeFontCombiner)(e)}function m(t,r,n,o,s,a){const l=d(o);for(let o,c,u,p=0;o=t[p],c=r[p],u=n[p];p++){const t=a?i.LOCALE.ALPHABETS.capPrefix:i.LOCALE.ALPHABETS.smallPrefix,r=a?e.Domains_.capital:e.Domains_.small;g(l.combiner,o,c,u,l.font,t,s,i.LOCALE.ALPHABETS.letterTrans,r)}}function y(t,r,n,o,s){const a=d(n);for(let n,l,c=0;n=t[c],l=r[c];c++){const t=i.LOCALE.ALPHABETS.digitPrefix,r=c+s;g(a.combiner,n,l,r,a.font,t,o,i.LOCALE.ALPHABETS.digitTrans,e.Domains_.digit)}}function g(t,e,r,n,o,i,s,l,c){for(let u,p=0;u=c[p];p++){const c=u in l?l[u]:l.default,p=u in i?i[u]:i.default;a.defineRule(e.toString(),u,"default",s,r,t(c(n),o,p))}}!function(t){t.BOLD="bold",t.BOLDFRAKTUR="bold-fraktur",t.BOLDITALIC="bold-italic",t.BOLDSCRIPT="bold-script",t.DOUBLESTRUCK="double-struck",t.FULLWIDTH="fullwidth",t.FRAKTUR="fraktur",t.ITALIC="italic",t.MONOSPACE="monospace",t.NORMAL="normal",t.SCRIPT="script",t.SANSSERIF="sans-serif",t.SANSSERIFITALIC="sans-serif-italic",t.SANSSERIFBOLD="sans-serif-bold",t.SANSSERIFBOLDITALIC="sans-serif-bold-italic"}(l=e.Font||(e.Font={})),function(t){t.SUPER="super",t.SUB="sub",t.CIRCLED="circled",t.PARENTHESIZED="parenthesized",t.PERIOD="period",t.NEGATIVECIRCLED="negative-circled",t.DOUBLECIRCLED="double-circled",t.CIRCLEDSANSSERIF="circled-sans-serif",t.NEGATIVECIRCLEDSANSSERIF="negative-circled-sans-serif",t.COMMA="comma",t.SQUARED="squared",t.NEGATIVESQUARED="negative-squared"}(c=e.Embellish||(e.Embellish={})),function(t){t.LATINCAP="latinCap",t.LATINSMALL="latinSmall",t.GREEKCAP="greekCap",t.GREEKSMALL="greekSmall",t.DIGIT="digit"}(u=e.Base||(e.Base={})),e.Domains_={small:["default"],capital:["default"],digit:["default"]},e.makeDomains_=p,e.generate=function(t){const r=n.default.getInstance().locale;n.default.getInstance().locale=t,o.setLocale(),a.addSymbolRules({locale:t}),p();const s=e.INTERVALS;for(let t,e=0;t=s[e];e++){const e=f(t.interval,t.subst),r=e.map((function(t){return String.fromCodePoint(parseInt(t,16))}));if("offset"in t)y(e,r,t.font,t.category,t.offset||0);else{m(e,r,i.LOCALE.ALPHABETS[t.base],t.font,t.category,!!t.capital)}}n.default.getInstance().locale=r,o.setLocale()},e.makeInterval=f,e.getFont=d,e.alphabetRules=m,e.numberRules=y,e.makeLetter=g,e.INTERVALS=[{interval:["1D400","1D419"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.BOLD},{interval:["1D41A","1D433"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLD},{interval:["1D56C","1D585"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.BOLDFRAKTUR},{interval:["1D586","1D59F"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLDFRAKTUR},{interval:["1D468","1D481"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.BOLDITALIC},{interval:["1D482","1D49B"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLDITALIC},{interval:["1D4D0","1D4E9"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.BOLDSCRIPT},{interval:["1D4EA","1D503"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLDSCRIPT},{interval:["1D538","1D551"],base:u.LATINCAP,subst:{"1D53A":"2102","1D53F":"210D","1D545":"2115","1D547":"2119","1D548":"211A","1D549":"211D","1D551":"2124"},capital:!0,category:"Lu",font:l.DOUBLESTRUCK},{interval:["1D552","1D56B"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.DOUBLESTRUCK},{interval:["1D504","1D51D"],base:u.LATINCAP,subst:{"1D506":"212D","1D50B":"210C","1D50C":"2111","1D515":"211C","1D51D":"2128"},capital:!0,category:"Lu",font:l.FRAKTUR},{interval:["1D51E","1D537"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.FRAKTUR},{interval:["FF21","FF3A"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.FULLWIDTH},{interval:["FF41","FF5A"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.FULLWIDTH},{interval:["1D434","1D44D"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.ITALIC},{interval:["1D44E","1D467"],base:u.LATINSMALL,subst:{"1D455":"210E"},capital:!1,category:"Ll",font:l.ITALIC},{interval:["1D670","1D689"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.MONOSPACE},{interval:["1D68A","1D6A3"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.MONOSPACE},{interval:["0041","005A"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.NORMAL},{interval:["0061","007A"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.NORMAL},{interval:["1D49C","1D4B5"],base:u.LATINCAP,subst:{"1D49D":"212C","1D4A0":"2130","1D4A1":"2131","1D4A3":"210B","1D4A4":"2110","1D4A7":"2112","1D4A8":"2133","1D4AD":"211B"},capital:!0,category:"Lu",font:l.SCRIPT},{interval:["1D4B6","1D4CF"],base:u.LATINSMALL,subst:{"1D4BA":"212F","1D4BC":"210A","1D4C4":"2134"},capital:!1,category:"Ll",font:l.SCRIPT},{interval:["1D5A0","1D5B9"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIF},{interval:["1D5BA","1D5D3"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIF},{interval:["1D608","1D621"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIFITALIC},{interval:["1D622","1D63B"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIFITALIC},{interval:["1D5D4","1D5ED"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIFBOLD},{interval:["1D5EE","1D607"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIFBOLD},{interval:["1D63C","1D655"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIFBOLDITALIC},{interval:["1D656","1D66F"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIFBOLDITALIC},{interval:["0391","03A9"],base:u.GREEKCAP,subst:{"03A2":"03F4"},capital:!0,category:"Lu",font:l.NORMAL},{interval:["03B0","03D0"],base:u.GREEKSMALL,subst:{"03B0":"2207","03CA":"2202","03CB":"03F5","03CC":"03D1","03CD":"03F0","03CE":"03D5","03CF":"03F1","03D0":"03D6"},capital:!1,category:"Ll",font:l.NORMAL},{interval:["1D6A8","1D6C0"],base:u.GREEKCAP,subst:{},capital:!0,category:"Lu",font:l.BOLD},{interval:["1D6C1","1D6E1"],base:u.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLD},{interval:["1D6E2","1D6FA"],base:u.GREEKCAP,subst:{},capital:!0,category:"Lu",font:l.ITALIC},{interval:["1D6FB","1D71B"],base:u.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:l.ITALIC},{interval:["1D71C","1D734"],base:u.GREEKCAP,subst:{},capital:!0,category:"Lu",font:l.BOLDITALIC},{interval:["1D735","1D755"],base:u.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLDITALIC},{interval:["1D756","1D76E"],base:u.GREEKCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIFBOLD},{interval:["1D76F","1D78F"],base:u.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIFBOLD},{interval:["1D790","1D7A8"],base:u.GREEKCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIFBOLDITALIC},{interval:["1D7A9","1D7C9"],base:u.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIFBOLDITALIC},{interval:["0030","0039"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.NORMAL},{interval:["2070","2079"],base:u.DIGIT,subst:{2071:"00B9",2072:"00B2",2073:"00B3"},offset:0,category:"No",font:c.SUPER},{interval:["2080","2089"],base:u.DIGIT,subst:{},offset:0,category:"No",font:c.SUB},{interval:["245F","2473"],base:u.DIGIT,subst:{"245F":"24EA"},offset:0,category:"No",font:c.CIRCLED},{interval:["3251","325F"],base:u.DIGIT,subst:{},offset:21,category:"No",font:c.CIRCLED},{interval:["32B1","32BF"],base:u.DIGIT,subst:{},offset:36,category:"No",font:c.CIRCLED},{interval:["2474","2487"],base:u.DIGIT,subst:{},offset:1,category:"No",font:c.PARENTHESIZED},{interval:["2487","249B"],base:u.DIGIT,subst:{2487:"1F100"},offset:0,category:"No",font:c.PERIOD},{interval:["2775","277F"],base:u.DIGIT,subst:{2775:"24FF"},offset:0,category:"No",font:c.NEGATIVECIRCLED},{interval:["24EB","24F4"],base:u.DIGIT,subst:{},offset:11,category:"No",font:c.NEGATIVECIRCLED},{interval:["24F5","24FE"],base:u.DIGIT,subst:{},offset:1,category:"No",font:c.DOUBLECIRCLED},{interval:["277F","2789"],base:u.DIGIT,subst:{"277F":"1F10B"},offset:0,category:"No",font:c.CIRCLEDSANSSERIF},{interval:["2789","2793"],base:u.DIGIT,subst:{2789:"1F10C"},offset:0,category:"No",font:c.NEGATIVECIRCLEDSANSSERIF},{interval:["FF10","FF19"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.FULLWIDTH},{interval:["1D7CE","1D7D7"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.BOLD},{interval:["1D7D8","1D7E1"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.DOUBLESTRUCK},{interval:["1D7E2","1D7EB"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.SANSSERIF},{interval:["1D7EC","1D7F5"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.SANSSERIFBOLD},{interval:["1D7F6","1D7FF"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.MONOSPACE},{interval:["1F101","1F10A"],base:u.DIGIT,subst:{},offset:0,category:"No",font:c.COMMA},{interval:["24B6","24CF"],base:u.LATINCAP,subst:{},capital:!0,category:"So",font:c.CIRCLED},{interval:["24D0","24E9"],base:u.LATINSMALL,subst:{},capital:!1,category:"So",font:c.CIRCLED},{interval:["1F110","1F129"],base:u.LATINCAP,subst:{},capital:!0,category:"So",font:c.PARENTHESIZED},{interval:["249C","24B5"],base:u.LATINSMALL,subst:{},capital:!1,category:"So",font:c.PARENTHESIZED},{interval:["1F130","1F149"],base:u.LATINCAP,subst:{},capital:!0,category:"So",font:c.SQUARED},{interval:["1F170","1F189"],base:u.LATINCAP,subst:{},capital:!0,category:"So",font:c.NEGATIVESQUARED},{interval:["1F150","1F169"],base:u.LATINCAP,subst:{},capital:!0,category:"So",font:c.NEGATIVECIRCLED}]},8504:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Parser=e.Comparator=e.ClearspeakPreferences=void 0;const n=r(5897),o=r(4440),i=r(1676),s=r(1676),a=r(2780),l=r(2362);class c extends i.DynamicCstr{constructor(t,e){super(t),this.preference=e}static comparator(){return new p(n.default.getInstance().dynamicCstr,s.DynamicProperties.createProp([i.DynamicCstr.DEFAULT_VALUES[s.Axis.LOCALE]],[i.DynamicCstr.DEFAULT_VALUES[s.Axis.MODALITY]],[i.DynamicCstr.DEFAULT_VALUES[s.Axis.DOMAIN]],[i.DynamicCstr.DEFAULT_VALUES[s.Axis.STYLE]]))}static fromPreference(t){const e=t.split(":"),r={},n=u.getProperties(),o=Object.keys(n);for(let t,i=0;t=e[i];i++){const e=t.split("_");if(-1===o.indexOf(e[0]))continue;const i=e[1];i&&i!==c.AUTO&&-1!==n[e[0]].indexOf(i)&&(r[e[0]]=e[1])}return r}static toPreference(t){const e=Object.keys(t),r=[];for(let n=0;n<e.length;n++)r.push(e[n]+"_"+t[e[n]]);return r.length?r.join(":"):i.DynamicCstr.DEFAULT_VALUE}static getLocalePreferences(t){const e=t||a.enumerate(l.SpeechRuleEngine.getInstance().enumerate());return c.getLocalePreferences_(e)}static smartPreferences(t,e){const r=c.getLocalePreferences()[e];if(!r)return[];const n=t.explorers.speech,i=c.relevantPreferences(n.walker.getFocus().getSemanticPrimary()),s=o.DOMAIN_TO_STYLES.clearspeak;return[{type:"radio",content:"No Preferences",id:"clearspeak-default",variable:"speechRules"},{type:"radio",content:"Current Preferences",id:"clearspeak-"+s,variable:"speechRules"},{type:"rule"},{type:"label",content:"Preferences for "+i},{type:"rule"}].concat(r[i].map((function(t){const e=t.split("_");return{type:"radio",content:e[1],id:"clearspeak-"+c.addPreference(s,e[0],e[1]),variable:"speechRules"}})))}static relevantPreferences(t){const e=d[t.type];return e&&(e[t.role]||e[""])||"ImpliedTimes"}static findPreference(t,e){if("default"===t)return c.AUTO;return c.fromPreference(t)[e]||c.AUTO}static addPreference(t,e,r){if("default"===t)return e+"_"+r;const n=c.fromPreference(t);return n[e]=r,c.toPreference(n)}static getLocalePreferences_(t){const e={};for(const r in t){if(!t[r].speech||!t[r].speech.clearspeak)continue;const n=Object.keys(t[r].speech.clearspeak),o=e[r]={};for(const t in u.getProperties()){const e=u.getProperties()[t],r=[t+"_Auto"];if(e)for(const o of e)-1!==n.indexOf(t+"_"+o)&&r.push(t+"_"+o);o[t]=r}}return e}equal(t){if(!super.equal(t))return!1;const e=Object.keys(this.preference),r=t.preference;if(e.length!==Object.keys(r).length)return!1;for(let t,n=0;t=e[n];n++)if(this.preference[t]!==r[t])return!1;return!0}}e.ClearspeakPreferences=c,c.AUTO="Auto";const u=new s.DynamicProperties({AbsoluteValue:["Auto","AbsEnd","Cardinality","Determinant"],Bar:["Auto","Conjugate"],Caps:["Auto","SayCaps"],CombinationPermutation:["Auto","ChoosePermute"],Currency:["Auto","Position","Prefix"],Ellipses:["Auto","AndSoOn"],Enclosed:["Auto","EndEnclose"],Exponent:["Auto","AfterPower","Ordinal","OrdinalPower","Exponent"],Fraction:["Auto","EndFrac","FracOver","General","GeneralEndFrac","Ordinal","Over","OverEndFrac","Per"],Functions:["Auto","None","Reciprocal"],ImpliedTimes:["Auto","MoreImpliedTimes","None"],Log:["Auto","LnAsNaturalLog"],Matrix:["Auto","Combinatoric","EndMatrix","EndVector","SilentColNum","SpeakColNum","Vector"],MultiLineLabel:["Auto","Case","Constraint","Equation","Line","None","Row","Step"],MultiLineOverview:["Auto","None"],MultiLinePausesBetweenColumns:["Auto","Long","Short"],MultsymbolDot:["Auto","Dot"],MultsymbolX:["Auto","By","Cross"],Paren:["Auto","CoordPoint","Interval","Silent","Speak","SpeakNestingLevel"],Prime:["Auto","Angle","Length"],Roots:["Auto","PosNegSqRoot","PosNegSqRootEnd","RootEnd"],SetMemberSymbol:["Auto","Belongs","Element","Member","In"],Sets:["Auto","SilentBracket","woAll"],TriangleSymbol:["Auto","Delta"],Trig:["Auto","ArcTrig","TrigInverse","Reciprocal"],VerticalLine:["Auto","Divides","Given","SuchThat"]});class p extends s.DefaultComparator{constructor(t,e){super(t,e),this.preference=t instanceof c?t.preference:{}}match(t){if(!(t instanceof c))return super.match(t);if("default"===t.getComponents()[s.Axis.STYLE])return!0;const e=Object.keys(t.preference);for(let r,n=0;r=e[n];n++)if(this.preference[r]!==t.preference[r])return!1;return!0}compare(t,e){const r=super.compare(t,e);if(0!==r)return r;const n=t instanceof c,o=e instanceof c;if(!n&&o)return 1;if(n&&!o)return-1;if(!n&&!o)return 0;const i=Object.keys(t.preference).length,s=Object.keys(e.preference).length;return i>s?-1:i<s?1:0}}e.Comparator=p;class h extends s.DynamicCstrParser{constructor(){super([s.Axis.LOCALE,s.Axis.MODALITY,s.Axis.DOMAIN,s.Axis.STYLE])}parse(t){const e=super.parse(t);let r=e.getValue(s.Axis.STYLE);const n=e.getValue(s.Axis.LOCALE),o=e.getValue(s.Axis.MODALITY);let a={};return r!==i.DynamicCstr.DEFAULT_VALUE&&(a=this.fromPreference(r),r=this.toPreference(a)),new c({locale:n,modality:o,domain:"clearspeak",style:r},a)}fromPreference(t){return c.fromPreference(t)}toPreference(t){return c.toPreference(t)}}e.Parser=h;const f=[["AbsoluteValue","fenced","neutral","metric"],["Bar","overscore","overaccent"],["Caps","identifier","latinletter"],["CombinationPermutation","appl","unknown"],["Ellipses","punctuation","ellipsis"],["Exponent","superscript",""],["Fraction","fraction",""],["Functions","appl","simple function"],["ImpliedTimes","operator","implicit"],["Log","appl","prefix function"],["Matrix","matrix",""],["Matrix","vector",""],["MultiLineLabel","multiline","label"],["MultiLineOverview","multiline","table"],["MultiLinePausesBetweenColumns","multiline","table"],["MultiLineLabel","table","label"],["MultiLineOverview","table","table"],["MultiLinePausesBetweenColumns","table","table"],["MultiLineLabel","cases","label"],["MultiLineOverview","cases","table"],["MultiLinePausesBetweenColumns","cases","table"],["MultsymbolDot","operator","multiplication"],["MultsymbolX","operator","multiplication"],["Paren","fenced","leftright"],["Prime","superscript","prime"],["Roots","root",""],["Roots","sqrt",""],["SetMemberSymbol","relation","element"],["Sets","fenced","set extended"],["TriangleSymbol","identifier","greekletter"],["Trig","appl","prefix function"],["VerticalLine","punctuated","vbar"]],d=function(){const t={};for(let e,r=0;e=f[r];r++){const r=e[0];let n=t[e[1]];n||(n={},t[e[1]]=n),n[e[2]]=r}return t}();n.default.getInstance().comparators.clearspeak=c.comparator,n.default.getInstance().parsers.clearspeak=new h},5425:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ClearspeakRules=void 0;const n=r(1676),o=r(365),i=r(9912),s=r(1378),a=r(8437),l=r(7283);e.ClearspeakRules=function(){l.addStore(n.DynamicCstr.BASE_LOCALE+".speech.clearspeak","",{CTFpauseSeparator:o.pauseSeparator,CTFnodeCounter:i.nodeCounter,CTFcontentIterator:o.contentIterator,CSFvulgarFraction:a.vulgarFraction,CQFvulgarFractionSmall:i.isSmallVulgarFraction,CQFcellsSimple:i.allCellsSimple,CSFordinalExponent:i.ordinalExponent,CSFwordOrdinal:i.wordOrdinal,CQFmatchingFences:i.matchingFences,CSFnestingDepth:i.nestingDepth,CQFfencedArguments:i.fencedArguments,CQFsimpleArguments:i.simpleArguments,CQFspaceoutNumber:s.spaceoutNumber})}},9912:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.wordOrdinal=e.layoutFactor_=e.fencedFactor_=e.simpleFactor_=e.simpleArguments=e.fencedArguments=e.insertNesting=e.matchingFences=e.nestingDepth=e.NESTING_DEPTH=e.ordinalExponent=e.allTextLastContent_=e.isUnitExpression=e.isSmallVulgarFraction=e.allCellsSimple=e.allIndices_=e.isInteger_=e.simpleCell_=e.simpleNode=e.hasPreference=e.isSimpleFraction_=e.isSimpleNumber_=e.isNumber_=e.isLetter_=e.isSimple_=e.isSimpleLetters_=e.isSimpleDegree_=e.isSimpleNegative_=e.isSimpleFunction_=e.isSimpleExpression=e.nodeCounter=void 0;const n=r(5740),o=r(5897),i=r(5274),s=r(4356),a=r(4977),l=r(2105),c=r(365),u=r(7630),p=r(9265),h=r(3588);function f(t){return S(t)||g(t)||y(t)||m(t)||d(t)}function d(t){return"appl"===t.type&&("prefix function"===t.childNodes[0].role||"simple function"===t.childNodes[0].role)&&(b(t.childNodes[1])||"fenced"===t.childNodes[1].type&&b(t.childNodes[1].childNodes[0]))}function m(t){return"prefixop"===t.type&&"negative"===t.role&&b(t.childNodes[0])&&"prefixop"!==t.childNodes[0].type&&"appl"!==t.childNodes[0].type&&"punctuated"!==t.childNodes[0].type}function y(t){return"punctuated"===t.type&&"endpunct"===t.role&&2===t.childNodes.length&&"degree"===t.childNodes[1].role&&(v(t.childNodes[0])||_(t.childNodes[0])||"prefixop"===t.childNodes[0].type&&"negative"===t.childNodes[0].role&&(v(t.childNodes[0].childNodes[0])||_(t.childNodes[0].childNodes[0])))}function g(t){return v(t)||"infixop"===t.type&&"implicit"===t.role&&(2===t.childNodes.length&&(v(t.childNodes[0])||S(t.childNodes[0]))&&v(t.childNodes[1])||3===t.childNodes.length&&S(t.childNodes[0])&&v(t.childNodes[1])&&v(t.childNodes[2]))}function b(t){return t.hasAnnotation("clearspeak","simple")}function v(t){return"identifier"===t.type&&("latinletter"===t.role||"greekletter"===t.role||"otherletter"===t.role||"simple function"===t.role)}function _(t){return"number"===t.type&&("integer"===t.role||"float"===t.role)}function S(t){return _(t)||O(t)}function O(t){if(M("Fraction_Over")||M("Fraction_FracOver"))return!1;if("fraction"!==t.type||"vulgar"!==t.role)return!1;if(M("Fraction_Ordinal"))return!0;const e=parseInt(t.childNodes[0].textContent,10),r=parseInt(t.childNodes[1].textContent,10);return e>0&&e<20&&r>0&&r<11}function M(t){return o.default.getInstance().style===t}function x(t){if(!t.hasAttribute("annotation"))return!1;const e=t.getAttribute("annotation");return!!/clearspeak:simple$|clearspeak:simple;/.exec(e)}function E(t){if(x(t))return!0;if("subscript"!==t.tagName)return!1;const e=t.childNodes[0].childNodes,r=e[1];return"identifier"===e[0].tagName&&(A(r)||"infixop"===r.tagName&&r.hasAttribute("role")&&"implicit"===r.getAttribute("role")&&C(r))}function A(t){return"number"===t.tagName&&t.hasAttribute("role")&&"integer"===t.getAttribute("role")}function C(t){return i.evalXPath("children/*",t).every((t=>A(t)||"identifier"===t.tagName))}function T(t){return"text"===t.type||"punctuated"===t.type&&"text"===t.role&&_(t.childNodes[0])&&N(t.childNodes.slice(1))||"identifier"===t.type&&"unit"===t.role||"infixop"===t.type&&("implicit"===t.role||"unit"===t.role)}function N(t){for(let e=0;e<t.length-1;e++)if("text"!==t[e].type||""!==t[e].textContent)return!1;return"text"===t[t.length-1].type}function w(t,e){if(!e||!t)return t;const r=t.match(/^(open|close) /);return r?r[0]+e+" "+t.substring(r[0].length):e+" "+t}function L(t){return!!t&&("number"===t.tagName||"identifier"===t.tagName||"function"===t.tagName||"appl"===t.tagName||"fraction"===t.tagName)}function I(t){return t&&("fenced"===t.tagName||t.hasAttribute("role")&&"leftright"===t.getAttribute("role")||P(t))}function P(t){return!!t&&("matrix"===t.tagName||"vector"===t.tagName)}e.nodeCounter=function(t,e){const r=e.split("-"),n=c.nodeCounter(t,r[0]||""),o=r[1]||"",i=r[2]||"";let s=!0;return function(){const t=n();return s?(s=!1,i+t+o):t+o}},e.isSimpleExpression=f,e.isSimpleFunction_=d,e.isSimpleNegative_=m,e.isSimpleDegree_=y,e.isSimpleLetters_=g,e.isSimple_=b,e.isLetter_=v,e.isNumber_=_,e.isSimpleNumber_=S,e.isSimpleFraction_=O,e.hasPreference=M,(0,u.register)(new p.SemanticAnnotator("clearspeak","simple",(function(t){return f(t)?"simple":""}))),e.simpleNode=x,e.simpleCell_=E,e.isInteger_=A,e.allIndices_=C,e.allCellsSimple=function(t){const e="matrix"===t.tagName?"children/row/children/cell/children/*":"children/line/children/*";return i.evalXPath(e,t).every(E)?[t]:[]},e.isSmallVulgarFraction=function(t){return(0,a.vulgarFractionSmall)(t,20,11)?[t]:[]},e.isUnitExpression=T,e.allTextLastContent_=N,(0,u.register)(new p.SemanticAnnotator("clearspeak","unit",(function(t){return T(t)?"unit":""}))),e.ordinalExponent=function(t){const e=parseInt(t.textContent,10);return isNaN(e)?t.textContent:e>10?s.LOCALE.NUMBERS.numericOrdinal(e):s.LOCALE.NUMBERS.wordOrdinal(e)},e.NESTING_DEPTH=null,e.nestingDepth=function(t){let r=0;const n=t.textContent,o="open"===t.getAttribute("role")?0:1;let i=t.parentNode;for(;i;)"fenced"===i.tagName&&i.childNodes[0].childNodes[o].textContent===n&&r++,i=i.parentNode;return e.NESTING_DEPTH=r>1?s.LOCALE.NUMBERS.wordOrdinal(r):"",e.NESTING_DEPTH},e.matchingFences=function(t){const e=t.previousSibling;let r,n;return e?(r=e,n=t):(r=t,n=t.nextSibling),n&&(0,h.isMatchingFence)(r.textContent,n.textContent)?[t]:[]},e.insertNesting=w,l.Grammar.getInstance().setCorrection("insertNesting",w),e.fencedArguments=function(t){const e=n.toArray(t.parentNode.childNodes),r=i.evalXPath("../../children/*",t),o=e.indexOf(t);return I(r[o])||I(r[o+1])?[t]:[]},e.simpleArguments=function(t){const e=n.toArray(t.parentNode.childNodes),r=i.evalXPath("../../children/*",t),o=e.indexOf(t);return L(r[o])&&r[o+1]&&(L(r[o+1])||"root"===r[o+1].tagName||"sqrt"===r[o+1].tagName||"superscript"===r[o+1].tagName&&r[o+1].childNodes[0].childNodes[0]&&("number"===r[o+1].childNodes[0].childNodes[0].tagName||"identifier"===r[o+1].childNodes[0].childNodes[0].tagName)&&("2"===r[o+1].childNodes[0].childNodes[1].textContent||"3"===r[o+1].childNodes[0].childNodes[1].textContent))?[t]:[]},e.simpleFactor_=L,e.fencedFactor_=I,e.layoutFactor_=P,e.wordOrdinal=function(t){return s.LOCALE.NUMBERS.wordOrdinal(parseInt(t.textContent,10))}},6141:function(t,e,r){var n=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function s(t){try{l(n.next(t))}catch(t){i(t)}}function a(t){try{l(n.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}l((n=n.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.loadAjax=e.loadFileSync=e.loadFile=e.parseMaps=e.retrieveFiles=e.standardLoader=e.loadLocale=e.store=void 0;const o=r(2139),i=r(5897),s=r(4440),a=r(7248),l=r(2315),c=r(1676),u=r(2780),p=r(2362),h=r(7491),f=r(313);e.store=u;const d={functions:u.addFunctionRules,symbols:u.addSymbolRules,units:u.addUnitRules,si:u.setSiPrefixes};let m=!1;function y(t=i.default.getInstance().locale){i.EnginePromise.loaded[t]||(i.EnginePromise.loaded[t]=[!1,!1],function(t){if(i.default.getInstance().isIE&&i.default.getInstance().mode===s.Mode.HTTP)return void S(t);b(t)}(t))}function g(){switch(i.default.getInstance().mode){case s.Mode.ASYNC:return O;case s.Mode.HTTP:return x;case s.Mode.SYNC:default:return M}}function b(t){const e=i.default.getInstance().customLoader?i.default.getInstance().customLoader:g(),r=new Promise((r=>{e(t).then((e=>{v(e),i.EnginePromise.loaded[t]=[!0,!0],r(t)}),(e=>{i.EnginePromise.loaded[t]=[!0,!1],console.error(`Unable to load locale: ${t}`),i.default.getInstance().locale=i.default.getInstance().defaultLocale,r(t)}))}));i.EnginePromise.promises[t]=r}function v(t){_(JSON.parse(t))}function _(t,e){let r=!0;for(let n,o=0;n=Object.keys(t)[o];o++){const o=n.split("/");e&&e!==o[0]||("rules"===o[1]?p.SpeechRuleEngine.getInstance().addStore(t[n]):"messages"===o[1]?(0,h.completeLocale)(t[n]):(r&&(f.generate(o[0]),r=!1),t[n].forEach(d[o[1]])))}}function S(t,e){let r=e||1;o.mapsForIE?_(o.mapsForIE,t):r<=5&&setTimeout((()=>S(t,r++)).bind(this),300)}function O(t){const e=a.localePath(t);return new Promise(((t,r)=>{l.default.fs.readFile(e,"utf8",((e,n)=>{if(e)return r(e);t(n)}))}))}function M(t){const e=a.localePath(t);return new Promise(((t,r)=>{let n="{}";try{n=l.default.fs.readFileSync(e,"utf8")}catch(t){return r(t)}t(n)}))}function x(t){const e=a.localePath(t),r=new XMLHttpRequest;return new Promise(((t,n)=>{r.onreadystatechange=function(){if(4===r.readyState){const e=r.status;0===e||e>=200&&e<400?t(r.responseText):n(e)}},r.open("GET",e,!0),r.send()}))}e.loadLocale=function(t=i.default.getInstance().locale){return n(this,void 0,void 0,(function*(){return m||(y(c.DynamicCstr.BASE_LOCALE),m=!0),i.EnginePromise.promises[c.DynamicCstr.BASE_LOCALE].then((()=>n(this,void 0,void 0,(function*(){const e=i.default.getInstance().defaultLocale;return e?(y(e),i.EnginePromise.promises[e].then((()=>n(this,void 0,void 0,(function*(){return y(t),i.EnginePromise.promises[t]}))))):(y(t),i.EnginePromise.promises[t])}))))}))},e.standardLoader=g,e.retrieveFiles=b,e.parseMaps=v,e.loadFile=O,e.loadFileSync=M,e.loadAjax=x},7088:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.leftSubscriptBrief=e.leftSuperscriptBrief=e.leftSubscriptVerbose=e.leftSuperscriptVerbose=e.baselineBrief=e.baselineVerbose=void 0;const n=r(1378);e.baselineVerbose=function(t){return n.baselineVerbose(t).replace(/-$/,"")},e.baselineBrief=function(t){return n.baselineBrief(t).replace(/-$/,"")},e.leftSuperscriptVerbose=function(t){return n.superscriptVerbose(t).replace(/^exposant/,"exposant gauche")},e.leftSubscriptVerbose=function(t){return n.subscriptVerbose(t).replace(/^indice/,"indice gauche")},e.leftSuperscriptBrief=function(t){return n.superscriptBrief(t).replace(/^sup/,"sup gauche")},e.leftSubscriptBrief=function(t){return n.subscriptBrief(t).replace(/^sub/,"sub gauche")}},9577:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MathspeakRules=void 0;const n=r(1676),o=r(365),i=r(7088),s=r(1378),a=r(8437),l=r(7283),c=r(7598);e.MathspeakRules=function(){l.addStore(n.DynamicCstr.BASE_LOCALE+".speech.mathspeak","",{CQFspaceoutNumber:s.spaceoutNumber,CQFspaceoutIdentifier:s.spaceoutIdentifier,CSFspaceoutText:s.spaceoutText,CSFopenFracVerbose:s.openingFractionVerbose,CSFcloseFracVerbose:s.closingFractionVerbose,CSFoverFracVerbose:s.overFractionVerbose,CSFopenFracBrief:s.openingFractionBrief,CSFcloseFracBrief:s.closingFractionBrief,CSFopenFracSbrief:s.openingFractionSbrief,CSFcloseFracSbrief:s.closingFractionSbrief,CSFoverFracSbrief:s.overFractionSbrief,CSFvulgarFraction:a.vulgarFraction,CQFvulgarFractionSmall:s.isSmallVulgarFraction,CSFopenRadicalVerbose:s.openingRadicalVerbose,CSFcloseRadicalVerbose:s.closingRadicalVerbose,CSFindexRadicalVerbose:s.indexRadicalVerbose,CSFopenRadicalBrief:s.openingRadicalBrief,CSFcloseRadicalBrief:s.closingRadicalBrief,CSFindexRadicalBrief:s.indexRadicalBrief,CSFopenRadicalSbrief:s.openingRadicalSbrief,CSFindexRadicalSbrief:s.indexRadicalSbrief,CQFisSmallRoot:s.smallRoot,CSFsuperscriptVerbose:s.superscriptVerbose,CSFsuperscriptBrief:s.superscriptBrief,CSFsubscriptVerbose:s.subscriptVerbose,CSFsubscriptBrief:s.subscriptBrief,CSFbaselineVerbose:s.baselineVerbose,CSFbaselineBrief:s.baselineBrief,CSFleftsuperscriptVerbose:s.superscriptVerbose,CSFleftsubscriptVerbose:s.subscriptVerbose,CSFrightsuperscriptVerbose:s.superscriptVerbose,CSFrightsubscriptVerbose:s.subscriptVerbose,CSFleftsuperscriptBrief:s.superscriptBrief,CSFleftsubscriptBrief:s.subscriptBrief,CSFrightsuperscriptBrief:s.superscriptBrief,CSFrightsubscriptBrief:s.subscriptBrief,CSFunderscript:s.nestedUnderscript,CSFoverscript:s.nestedOverscript,CSFendscripts:s.endscripts,CTFordinalCounter:a.ordinalCounter,CTFwordCounter:a.wordCounter,CTFcontentIterator:o.contentIterator,CQFdetIsSimple:s.determinantIsSimple,CSFRemoveParens:s.removeParens,CQFresetNesting:s.resetNestingDepth,CGFbaselineConstraint:s.generateBaselineConstraint,CGFtensorRules:s.generateTensorRules}),l.addStore("es.speech.mathspeak",n.DynamicCstr.BASE_LOCALE+".speech.mathspeak",{CTFunitMultipliers:c.unitMultipliers,CQFoneLeft:c.oneLeft}),l.addStore("fr.speech.mathspeak",n.DynamicCstr.BASE_LOCALE+".speech.mathspeak",{CSFbaselineVerbose:i.baselineVerbose,CSFbaselineBrief:i.baselineBrief,CSFleftsuperscriptVerbose:i.leftSuperscriptVerbose,CSFleftsubscriptVerbose:i.leftSubscriptVerbose,CSFleftsuperscriptBrief:i.leftSuperscriptBrief,CSFleftsubscriptBrief:i.leftSubscriptBrief})}},1378:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.smallRoot=e.generateTensorRules=e.removeParens=e.generateBaselineConstraint=e.determinantIsSimple=e.nestedOverscript=e.endscripts=e.overscoreNestingDepth=e.nestedUnderscript=e.underscoreNestingDepth=e.indexRadicalSbrief=e.openingRadicalSbrief=e.indexRadicalBrief=e.closingRadicalBrief=e.openingRadicalBrief=e.indexRadicalVerbose=e.closingRadicalVerbose=e.openingRadicalVerbose=e.getRootIndex=e.nestedRadical=e.radicalNestingDepth=e.baselineBrief=e.baselineVerbose=e.superscriptBrief=e.superscriptVerbose=e.subscriptBrief=e.subscriptVerbose=e.nestedSubSuper=e.isSmallVulgarFraction=e.overFractionSbrief=e.closingFractionSbrief=e.openingFractionSbrief=e.closingFractionBrief=e.openingFractionBrief=e.overFractionVerbose=e.closingFractionVerbose=e.openingFractionVerbose=e.nestedFraction=e.fractionNestingDepth=e.computeNestingDepth_=e.containsAttr=e.getNestingDepth=e.resetNestingDepth=e.nestingBarriers=e.spaceoutIdentifier=e.spaceoutNumber=e.spaceoutNodes=e.spaceoutText=void 0;const n=r(707),o=r(5740),i=r(5274),s=r(4356),a=r(3308);let l={};function c(t,e){const r=Array.from(t.textContent),n=[],o=a.default.getInstance(),i=t.ownerDocument;for(let t,s=0;t=r[s];s++){const r=o.getNodeFactory().makeLeafNode(t,"unknown"),s=o.identifierNode(r,"unknown","");e(s),n.push(s.xml(i))}return n}function u(t,r,i,s,a,c){s=s||e.nestingBarriers,a=a||{},c=c||function(t){return!1};const u=o.serializeXml(r);if(l[t]||(l[t]={}),l[t][u])return l[t][u];if(c(r)||i.indexOf(r.tagName)<0)return 0;const p=h(r,i,n.setdifference(s,i),a,c,0);return l[t][u]=p,p}function p(t,e){if(!t.attributes)return!1;const r=o.toArray(t.attributes);for(let t,n=0;t=r[n];n++)if(e[t.nodeName]===t.nodeValue)return!0;return!1}function h(t,e,r,n,i,s){if(i(t)||r.indexOf(t.tagName)>-1||p(t,n))return s;if(e.indexOf(t.tagName)>-1&&s++,!t.childNodes||0===t.childNodes.length)return s;const a=o.toArray(t.childNodes);return Math.max.apply(null,a.map((function(t){return h(t,e,r,n,i,s)})))}function f(t){return u("fraction",t,["fraction"],e.nestingBarriers,{},s.LOCALE.FUNCTIONS.fracNestDepth)}function d(t,e,r){const n=f(t),o=Array(n).fill(e);return r&&o.push(r),o.join(s.LOCALE.MESSAGES.regexp.JOINER_FRAC)}function m(t,e,r){for(;t.parentNode;){const n=t.parentNode,o=n.parentNode;if(!o)break;const i=t.getAttribute&&t.getAttribute("role");("subscript"===o.tagName&&t===n.childNodes[1]||"tensor"===o.tagName&&i&&("leftsub"===i||"rightsub"===i))&&(e=r.sub+s.LOCALE.MESSAGES.regexp.JOINER_SUBSUPER+e),("superscript"===o.tagName&&t===n.childNodes[1]||"tensor"===o.tagName&&i&&("leftsuper"===i||"rightsuper"===i))&&(e=r.sup+s.LOCALE.MESSAGES.regexp.JOINER_SUBSUPER+e),t=o}return e.trim()}function y(t){return u("radical",t,["sqrt","root"],e.nestingBarriers,{})}function g(t,e,r){const n=y(t),o=b(t);return r=o?s.LOCALE.FUNCTIONS.combineRootIndex(r,o):r,1===n?r:s.LOCALE.FUNCTIONS.combineNestedRadical(e,s.LOCALE.FUNCTIONS.radicalNestDepth(n-1),r)}function b(t){const e="sqrt"===t.tagName?"2":i.evalXPath("children/*[1]",t)[0].textContent.trim();return s.LOCALE.MESSAGES.MSroots[e]||""}function v(t){return u("underscore",t,["underscore"],e.nestingBarriers,{},(function(t){return t.tagName&&"underscore"===t.tagName&&"underaccent"===t.childNodes[0].childNodes[1].getAttribute("role")}))}function _(t){return u("overscore",t,["overscore"],e.nestingBarriers,{},(function(t){return t.tagName&&"overscore"===t.tagName&&"overaccent"===t.childNodes[0].childNodes[1].getAttribute("role")}))}e.spaceoutText=function(t){return Array.from(t.textContent).join(" ")},e.spaceoutNodes=c,e.spaceoutNumber=function(t){return c(t,(function(t){t.textContent.match(/\W/)||(t.type="number")}))},e.spaceoutIdentifier=function(t){return c(t,(function(t){t.font="unknown",t.type="identifier"}))},e.nestingBarriers=["cases","cell","integral","line","matrix","multiline","overscore","root","row","sqrt","subscript","superscript","table","underscore","vector"],e.resetNestingDepth=function(t){return l={},[t]},e.getNestingDepth=u,e.containsAttr=p,e.computeNestingDepth_=h,e.fractionNestingDepth=f,e.nestedFraction=d,e.openingFractionVerbose=function(t){return d(t,s.LOCALE.MESSAGES.MS.START,s.LOCALE.MESSAGES.MS.FRAC_V)},e.closingFractionVerbose=function(t){return d(t,s.LOCALE.MESSAGES.MS.END,s.LOCALE.MESSAGES.MS.FRAC_V)},e.overFractionVerbose=function(t){return d(t,s.LOCALE.MESSAGES.MS.FRAC_OVER)},e.openingFractionBrief=function(t){return d(t,s.LOCALE.MESSAGES.MS.START,s.LOCALE.MESSAGES.MS.FRAC_B)},e.closingFractionBrief=function(t){return d(t,s.LOCALE.MESSAGES.MS.END,s.LOCALE.MESSAGES.MS.FRAC_B)},e.openingFractionSbrief=function(t){const e=f(t);return 1===e?s.LOCALE.MESSAGES.MS.FRAC_S:s.LOCALE.FUNCTIONS.combineNestedFraction(s.LOCALE.MESSAGES.MS.NEST_FRAC,s.LOCALE.FUNCTIONS.radicalNestDepth(e-1),s.LOCALE.MESSAGES.MS.FRAC_S)},e.closingFractionSbrief=function(t){const e=f(t);return 1===e?s.LOCALE.MESSAGES.MS.ENDFRAC:s.LOCALE.FUNCTIONS.combineNestedFraction(s.LOCALE.MESSAGES.MS.NEST_FRAC,s.LOCALE.FUNCTIONS.radicalNestDepth(e-1),s.LOCALE.MESSAGES.MS.ENDFRAC)},e.overFractionSbrief=function(t){const e=f(t);return 1===e?s.LOCALE.MESSAGES.MS.FRAC_OVER:s.LOCALE.FUNCTIONS.combineNestedFraction(s.LOCALE.MESSAGES.MS.NEST_FRAC,s.LOCALE.FUNCTIONS.radicalNestDepth(e-1),s.LOCALE.MESSAGES.MS.FRAC_OVER)},e.isSmallVulgarFraction=function(t){return s.LOCALE.FUNCTIONS.fracNestDepth(t)?[t]:[]},e.nestedSubSuper=m,e.subscriptVerbose=function(t){return m(t,s.LOCALE.MESSAGES.MS.SUBSCRIPT,{sup:s.LOCALE.MESSAGES.MS.SUPER,sub:s.LOCALE.MESSAGES.MS.SUB})},e.subscriptBrief=function(t){return m(t,s.LOCALE.MESSAGES.MS.SUB,{sup:s.LOCALE.MESSAGES.MS.SUP,sub:s.LOCALE.MESSAGES.MS.SUB})},e.superscriptVerbose=function(t){return m(t,s.LOCALE.MESSAGES.MS.SUPERSCRIPT,{sup:s.LOCALE.MESSAGES.MS.SUPER,sub:s.LOCALE.MESSAGES.MS.SUB})},e.superscriptBrief=function(t){return m(t,s.LOCALE.MESSAGES.MS.SUP,{sup:s.LOCALE.MESSAGES.MS.SUP,sub:s.LOCALE.MESSAGES.MS.SUB})},e.baselineVerbose=function(t){const e=m(t,"",{sup:s.LOCALE.MESSAGES.MS.SUPER,sub:s.LOCALE.MESSAGES.MS.SUB});return e?e.replace(new RegExp(s.LOCALE.MESSAGES.MS.SUB+"$"),s.LOCALE.MESSAGES.MS.SUBSCRIPT).replace(new RegExp(s.LOCALE.MESSAGES.MS.SUPER+"$"),s.LOCALE.MESSAGES.MS.SUPERSCRIPT):s.LOCALE.MESSAGES.MS.BASELINE},e.baselineBrief=function(t){return m(t,"",{sup:s.LOCALE.MESSAGES.MS.SUP,sub:s.LOCALE.MESSAGES.MS.SUB})||s.LOCALE.MESSAGES.MS.BASE},e.radicalNestingDepth=y,e.nestedRadical=g,e.getRootIndex=b,e.openingRadicalVerbose=function(t){return g(t,s.LOCALE.MESSAGES.MS.NESTED,s.LOCALE.MESSAGES.MS.STARTROOT)},e.closingRadicalVerbose=function(t){return g(t,s.LOCALE.MESSAGES.MS.NESTED,s.LOCALE.MESSAGES.MS.ENDROOT)},e.indexRadicalVerbose=function(t){return g(t,s.LOCALE.MESSAGES.MS.NESTED,s.LOCALE.MESSAGES.MS.ROOTINDEX)},e.openingRadicalBrief=function(t){return g(t,s.LOCALE.MESSAGES.MS.NEST_ROOT,s.LOCALE.MESSAGES.MS.STARTROOT)},e.closingRadicalBrief=function(t){return g(t,s.LOCALE.MESSAGES.MS.NEST_ROOT,s.LOCALE.MESSAGES.MS.ENDROOT)},e.indexRadicalBrief=function(t){return g(t,s.LOCALE.MESSAGES.MS.NEST_ROOT,s.LOCALE.MESSAGES.MS.ROOTINDEX)},e.openingRadicalSbrief=function(t){return g(t,s.LOCALE.MESSAGES.MS.NEST_ROOT,s.LOCALE.MESSAGES.MS.ROOT)},e.indexRadicalSbrief=function(t){return g(t,s.LOCALE.MESSAGES.MS.NEST_ROOT,s.LOCALE.MESSAGES.MS.INDEX)},e.underscoreNestingDepth=v,e.nestedUnderscript=function(t){const e=v(t);return Array(e).join(s.LOCALE.MESSAGES.MS.UNDER)+s.LOCALE.MESSAGES.MS.UNDERSCRIPT},e.overscoreNestingDepth=_,e.endscripts=function(t){return s.LOCALE.MESSAGES.MS.ENDSCRIPTS},e.nestedOverscript=function(t){const e=_(t);return Array(e).join(s.LOCALE.MESSAGES.MS.OVER)+s.LOCALE.MESSAGES.MS.OVERSCRIPT},e.determinantIsSimple=function(t){if("matrix"!==t.tagName||"determinant"!==t.getAttribute("role"))return[];const e=i.evalXPath("children/row/children/cell/children/*",t);for(let t,r=0;t=e[r];r++)if("number"!==t.tagName){if("identifier"===t.tagName){const e=t.getAttribute("role");if("latinletter"===e||"greekletter"===e||"otherletter"===e)continue}return[]}return[t]},e.generateBaselineConstraint=function(){const t=t=>t.map((t=>"ancestor::"+t)),e=t=>"not("+t+")",r=e(t(["subscript","superscript","tensor"]).join(" or ")),n=t(["relseq","multrel"]),o=t(["fraction","punctuation","fenced","sqrt","root"]);let i=[];for(let t,e=0;t=o[e];e++)i=i.concat(n.map((function(e){return t+"/"+e})));return[["ancestor::*/following-sibling::*",r,e(i.join(" | "))].join(" and ")]},e.removeParens=function(t){if(!t.childNodes.length||!t.childNodes[0].childNodes.length||!t.childNodes[0].childNodes[0].childNodes.length)return"";const e=t.childNodes[0].childNodes[0].childNodes[0].textContent;return e.match(/^\(.+\)$/)?e.slice(1,-1):e};const S=new Map([[3,"CSFleftsuperscript"],[4,"CSFleftsubscript"],[2,"CSFbaseline"],[1,"CSFrightsubscript"],[0,"CSFrightsuperscript"]]),O=new Map([[4,2],[3,3],[2,1],[1,4],[0,5]]);function M(t){const e=[];let r="",n="",o=parseInt(t,2);for(let t=0;t<5;t++){const i="children/*["+O.get(t)+"]";if(1&o){const e=S.get(t%5);r="[t] "+e+"Verbose; [n] "+i+";"+r,n="[t] "+e+"Brief; [n] "+i+";"+n}else e.unshift("name("+i+')="empty"');o>>=1}return[e,r,n]}e.generateTensorRules=function(t,e=!0){const r=["11111","11110","11101","11100","10111","10110","10101","10100","01111","01110","01101","01100"];for(let n,o=0;n=r[o];o++){let r="tensor"+n,[o,i,s]=M(n);t.defineRule(r,"default",i,"self::tensor",...o),e&&(t.defineRule(r,"brief",s,"self::tensor",...o),t.defineRule(r,"sbrief",s,"self::tensor",...o));const a=S.get(2);i+="; [t]"+a+"Verbose",s+="; [t]"+a+"Brief",r+="-baseline";const l="((.//*[not(*)])[last()]/@id)!=(((.//ancestor::fraction|ancestor::root|ancestor::sqrt|ancestor::cell|ancestor::line|ancestor::stree)[1]//*[not(*)])[last()]/@id)";t.defineRule(r,"default",i,"self::tensor",l,...o),e&&(t.defineRule(r,"brief",s,"self::tensor",l,...o),t.defineRule(r,"sbrief",s,"self::tensor",l,...o))}},e.smallRoot=function(t){let e=Object.keys(s.LOCALE.MESSAGES.MSroots).length;if(!e)return[];if(e++,!t.childNodes||0===t.childNodes.length||!t.childNodes[0].childNodes)return[];const r=t.childNodes[0].childNodes[0].textContent;if(!/^\d+$/.test(r))return[];const n=parseInt(r,10);return n>1&&n<=e?[t]:[]}},6922:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.implicitIterator=e.relationIterator=e.propagateNumber=e.checkParent_=e.NUMBER_INHIBITORS_=e.NUMBER_PROPAGATORS_=e.enlargeFence=e.indexRadical=e.closingRadical=e.openingRadical=e.radicalNestingDepth=e.nestedRadical=e.overBevelledFraction=e.overFraction=e.closingFraction=e.openingFraction=void 0;const n=r(7052),o=r(5740),i=r(5274),s=r(2105),a=r(5897),l=r(7630),c=r(9265),u=r(4356),p=r(1378);function h(t,e){const r=f(t);return 1===r?e:new Array(r).join(u.LOCALE.MESSAGES.MS.NESTED)+e}function f(t,e){const r=e||0;return t.parentNode?f(t.parentNode,"root"===t.tagName||"sqrt"===t.tagName?r+1:r):r}function d(t){const e="\u2820";if(1===t.length)return e+t;const r=t.split("");return r.every((function(t){return"\u2833"===t}))?e+r.join(e):t.slice(0,-1)+e+t.slice(-1)}function m(t,r){const n=t.parent;if(!n)return!1;const o=n.type;return-1!==e.NUMBER_PROPAGATORS_.indexOf(o)||"prefixop"===o&&"negative"===n.role&&!r.script||"prefixop"===o&&"geometry"===n.role||!("punctuated"!==o||r.enclosed&&"text"!==n.role)}function y(t,r){return t.childNodes.length?(-1!==e.NUMBER_INHIBITORS_.indexOf(t.type)&&(r.script=!0),"fenced"===t.type?(r.number=!1,r.enclosed=!0,["",r]):(m(t,r)&&(r.number=!0,r.enclosed=!1),["",r])):(m(t,r)&&(r.number=!0,r.script=!1,r.enclosed=!1),[r.number?"number":"",{number:!1,enclosed:r.enclosed,script:r.script}])}e.openingFraction=function(t){const e=p.fractionNestingDepth(t);return new Array(e).join(u.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+u.LOCALE.MESSAGES.MS.FRACTION_START},e.closingFraction=function(t){const e=p.fractionNestingDepth(t);return new Array(e).join(u.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+u.LOCALE.MESSAGES.MS.FRACTION_END},e.overFraction=function(t){const e=p.fractionNestingDepth(t);return new Array(e).join(u.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+u.LOCALE.MESSAGES.MS.FRACTION_OVER},e.overBevelledFraction=function(t){const e=p.fractionNestingDepth(t);return new Array(e).join(u.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+"\u2838"+u.LOCALE.MESSAGES.MS.FRACTION_OVER},e.nestedRadical=h,e.radicalNestingDepth=f,e.openingRadical=function(t){return h(t,u.LOCALE.MESSAGES.MS.STARTROOT)},e.closingRadical=function(t){return h(t,u.LOCALE.MESSAGES.MS.ENDROOT)},e.indexRadical=function(t){return h(t,u.LOCALE.MESSAGES.MS.ROOTINDEX)},e.enlargeFence=d,s.Grammar.getInstance().setCorrection("enlargeFence",d),e.NUMBER_PROPAGATORS_=["multirel","relseq","appl","row","line"],e.NUMBER_INHIBITORS_=["subscript","superscript","overscore","underscore"],e.checkParent_=m,e.propagateNumber=y,(0,l.register)(new c.SemanticVisitor("nemeth","number",y,{number:!0})),e.relationIterator=function(t,e){const r=t.slice(0);let s,l=!0;return s=t.length>0?i.evalXPath("../../content/*",t[0]):[],function(){const t=s.shift(),i=r.shift(),c=r[0],h=e?[n.AuditoryDescription.create({text:e},{translate:!0})]:[];if(!t)return h;const f=i?p.nestedSubSuper(i,"",{sup:u.LOCALE.MESSAGES.MS.SUPER,sub:u.LOCALE.MESSAGES.MS.SUB}):"",d=i&&"EMPTY"!==o.tagName(i)||l&&t.parentNode.parentNode&&t.parentNode.parentNode.previousSibling?[n.AuditoryDescription.create({text:"\u2800"+f},{})]:[],m=c&&"EMPTY"!==o.tagName(c)||!s.length&&t.parentNode.parentNode&&t.parentNode.parentNode.nextSibling?[n.AuditoryDescription.create({text:"\u2800"},{})]:[],y=a.default.evaluateNode(t);return l=!1,h.concat(d,y,m)}},e.implicitIterator=function(t,e){const r=t.slice(0);let s;return s=t.length>0?i.evalXPath("../../content/*",t[0]):[],function(){const t=r.shift(),i=r[0],a=s.shift(),l=e?[n.AuditoryDescription.create({text:e},{translate:!0})]:[];if(!a)return l;const c=t&&"NUMBER"===o.tagName(t),u=i&&"NUMBER"===o.tagName(i);return l.concat(c&&u&&"space"===a.getAttribute("role")?[n.AuditoryDescription.create({text:"\u2800"},{})]:[])}}},8437:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ordinalPosition=e.vulgarFraction=e.wordCounter=e.ordinalCounter=void 0;const n=r(9536),o=r(5740),i=r(4356),s=r(4977);e.ordinalCounter=function(t,e){let r=0;return function(){return i.LOCALE.NUMBERS.numericOrdinal(++r)+" "+e}},e.wordCounter=function(t,e){let r=0;return function(){return i.LOCALE.NUMBERS.numberToOrdinal(++r,!1)+" "+e}},e.vulgarFraction=function(t){const e=(0,s.convertVulgarFraction)(t,i.LOCALE.MESSAGES.MS.FRAC_OVER);return e.convertible&&e.enumerator&&e.denominator?[new n.Span(i.LOCALE.NUMBERS.numberToWords(e.enumerator),{extid:t.childNodes[0].childNodes[0].getAttribute("extid"),separator:""}),new n.Span(i.LOCALE.NUMBERS.vulgarSep,{separator:""}),new n.Span(i.LOCALE.NUMBERS.numberToOrdinal(e.denominator,1!==e.enumerator),{extid:t.childNodes[0].childNodes[1].getAttribute("extid")})]:[new n.Span(e.content||"",{extid:t.getAttribute("extid")})]},e.ordinalPosition=function(t){const e=o.toArray(t.parentNode.childNodes);return i.LOCALE.NUMBERS.numericOrdinal(e.indexOf(t)+1).toString()}},9284:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.BrailleRules=e.OtherRules=e.PrefixRules=void 0;const n=r(1676),o=r(365),i=r(1378),s=r(6922),a=r(8437),l=r(7283);e.PrefixRules=function(){l.addStore("en.prefix.default","",{CSFordinalPosition:a.ordinalPosition})},e.OtherRules=function(){l.addStore("en.speech.chromevox","",{CTFnodeCounter:o.nodeCounter,CTFcontentIterator:o.contentIterator}),l.addStore("en.speech.emacspeak","en.speech.chromevox",{CQFvulgarFractionSmall:i.isSmallVulgarFraction,CSFvulgarFraction:a.vulgarFraction})},e.BrailleRules=function(){l.addStore("nemeth.braille.default",n.DynamicCstr.BASE_LOCALE+".speech.mathspeak",{CSFopenFraction:s.openingFraction,CSFcloseFraction:s.closingFraction,CSFoverFraction:s.overFraction,CSFoverBevFraction:s.overBevelledFraction,CSFopenRadical:s.openingRadical,CSFcloseRadical:s.closingRadical,CSFindexRadical:s.indexRadical,CSFsubscript:i.subscriptVerbose,CSFsuperscript:i.superscriptVerbose,CSFbaseline:i.baselineVerbose,CGFtensorRules:t=>i.generateTensorRules(t,!1),CTFrelationIterator:s.relationIterator,CTFimplicitIterator:s.implicitIterator})}},7599:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.init=e.INIT_=void 0;const n=r(5425),o=r(9577),i=r(9284);e.INIT_=!1,e.init=function(){e.INIT_||((0,o.MathspeakRules)(),(0,n.ClearspeakRules)(),(0,i.PrefixRules)(),(0,i.OtherRules)(),(0,i.BrailleRules)(),e.INIT_=!0)}},7283:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.getStore=e.addStore=e.funcStore=void 0;const n=r(1676);e.funcStore=new Map,e.addStore=function(t,r,n){const o={};if(r){const t=e.funcStore.get(r)||{};Object.assign(o,t)}e.funcStore.set(t,Object.assign(o,n))},e.getStore=function(t,r,o){return e.funcStore.get([t,r,o].join("."))||e.funcStore.get([n.DynamicCstr.DEFAULT_VALUES[n.Axis.LOCALE],r,o].join("."))||e.funcStore.get([n.DynamicCstr.BASE_LOCALE,r,o].join("."))||{}}},7598:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.oneLeft=e.leftMostUnit=e.rightMostUnit=e.unitMultipliers=void 0;const n=r(7052),o=r(5274),i=r(4356);e.unitMultipliers=function(t,e){const r=t;let o=0;return function(){const t=n.AuditoryDescription.create({text:a(r[o])&&l(r[o+1])?i.LOCALE.MESSAGES.unitTimes:""},{});return o++,[t]}};const s=["superscript","subscript","overscore","underscore"];function a(t){for(;t;){if("unit"===t.getAttribute("role"))return!0;const e=t.tagName,r=o.evalXPath("children/*",t);t=-1!==s.indexOf(e)?r[0]:r[r.length-1]}return!1}function l(t){for(;t;){if("unit"===t.getAttribute("role"))return!0;t=o.evalXPath("children/*",t)[0]}return!1}e.rightMostUnit=a,e.leftMostUnit=l,e.oneLeft=function(t){for(;t;){if("number"===t.tagName&&"1"===t.textContent)return[t];if("infixop"!==t.tagName||"multiplication"!==t.getAttribute("role")&&"implicit"!==t.getAttribute("role"))return[];t=o.evalXPath("children/*",t)[0]}return[]}},3284:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractWalker=void 0;const n=r(7052),o=r(8290),i=r(5740),s=r(4440),a=r(6828),l=r(8496),c=r(2298),u=r(4356),p=r(2105),h=r(5656),f=r(9552),d=r(9543),m=r(8504),y=r(7730),g=r(1214),b=r(179),v=r(1204),_=r(5274);class S{constructor(t,e,r,n){this.node=t,this.generator=e,this.highlighter=r,this.modifier=!1,this.keyMapping=new Map([[l.KeyCode.UP,this.up.bind(this)],[l.KeyCode.DOWN,this.down.bind(this)],[l.KeyCode.RIGHT,this.right.bind(this)],[l.KeyCode.LEFT,this.left.bind(this)],[l.KeyCode.TAB,this.repeat.bind(this)],[l.KeyCode.DASH,this.expand.bind(this)],[l.KeyCode.SPACE,this.depth.bind(this)],[l.KeyCode.HOME,this.home.bind(this)],[l.KeyCode.X,this.summary.bind(this)],[l.KeyCode.Z,this.detail.bind(this)],[l.KeyCode.V,this.virtualize.bind(this)],[l.KeyCode.P,this.previous.bind(this)],[l.KeyCode.U,this.undo.bind(this)],[l.KeyCode.LESS,this.previousRules.bind(this)],[l.KeyCode.GREATER,this.nextRules.bind(this)]]),this.cursors=[],this.xml_=null,this.rebuilt_=null,this.focus_=null,this.active_=!1,this.node.id?this.id=this.node.id:this.node.hasAttribute(S.SRE_ID_ATTR)?this.id=this.node.getAttribute(S.SRE_ID_ATTR):(this.node.setAttribute(S.SRE_ID_ATTR,S.ID_COUNTER.toString()),this.id=S.ID_COUNTER++),this.rootNode=v.getSemanticRoot(t),this.rootId=this.rootNode.getAttribute(c.Attribute.ID),this.xmlString_=n,this.moved=b.WalkerMoves.ENTER}getXml(){return this.xml_||(this.xml_=i.parseInput(this.xmlString_)),this.xml_}getRebuilt(){return this.rebuilt_||this.rebuildStree(),this.rebuilt_}isActive(){return this.active_}activate(){this.isActive()||(this.generator.start(),this.toggleActive_())}deactivate(){this.isActive()&&(b.WalkerState.setState(this.id,this.primaryId()),this.generator.end(),this.toggleActive_())}getFocus(t=!1){return this.focus_||(this.focus_=this.singletonFocus(this.rootId)),t&&this.updateFocus(),this.focus_}setFocus(t){this.focus_=t}getDepth(){return this.levels.depth()-1}isSpeech(){return this.generator.modality===c.Attribute.SPEECH}focusDomNodes(){return this.getFocus().getDomNodes()}focusSemanticNodes(){return this.getFocus().getSemanticNodes()}speech(){const t=this.focusDomNodes();if(!t.length)return"";const e=this.specialMove();if(null!==e)return e;switch(this.moved){case b.WalkerMoves.DEPTH:return this.depth_();case b.WalkerMoves.SUMMARY:return this.summary_();case b.WalkerMoves.DETAIL:return this.detail_();default:{const e=[],r=this.focusSemanticNodes();for(let n=0,o=t.length;n<o;n++){const o=t[n],i=r[n];e.push(o?this.generator.getSpeech(o,this.getXml()):d.recomputeMarkup(i))}return this.mergePrefix_(e)}}}move(t){const e=this.keyMapping.get(t);if(!e)return null;const r=e();return!(!r||r===this.getFocus())&&(this.setFocus(r),this.moved===b.WalkerMoves.HOME&&(this.levels=this.initLevels()),!0)}up(){return this.moved=b.WalkerMoves.UP,this.getFocus()}down(){return this.moved=b.WalkerMoves.DOWN,this.getFocus()}left(){return this.moved=b.WalkerMoves.LEFT,this.getFocus()}right(){return this.moved=b.WalkerMoves.RIGHT,this.getFocus()}repeat(){return this.moved=b.WalkerMoves.REPEAT,this.getFocus().clone()}depth(){return this.moved=this.isSpeech()?b.WalkerMoves.DEPTH:b.WalkerMoves.REPEAT,this.getFocus().clone()}home(){this.moved=b.WalkerMoves.HOME;return this.singletonFocus(this.rootId)}getBySemanticId(t){return v.getBySemanticId(this.node,t)}primaryId(){return this.getFocus().getSemanticPrimary().id.toString()}expand(){const t=this.getFocus().getDomPrimary(),e=this.actionable_(t);return e?(this.moved=b.WalkerMoves.EXPAND,e.dispatchEvent(new Event("click")),this.getFocus().clone()):this.getFocus()}expandable(t){return!!this.actionable_(t)&&0===t.childNodes.length}collapsible(t){return!!this.actionable_(t)&&t.childNodes.length>0}restoreState(){if(!this.highlighter)return;const t=b.WalkerState.getState(this.id);if(!t)return;let e=this.getRebuilt().nodeDict[t];const r=[];for(;e;)r.push(e.id),e=e.parent;for(r.pop();r.length>0;){this.down();const t=r.pop(),e=this.findFocusOnLevel(t);if(!e)break;this.setFocus(e)}this.moved=b.WalkerMoves.ENTER}updateFocus(){this.setFocus(y.Focus.factory(this.getFocus().getSemanticPrimary().id.toString(),this.getFocus().getSemanticNodes().map((t=>t.id.toString())),this.getRebuilt(),this.node))}rebuildStree(){this.rebuilt_=new g.RebuildStree(this.getXml()),this.rootId=this.rebuilt_.stree.root.id.toString(),this.generator.setRebuilt(this.rebuilt_),this.skeleton=h.SemanticSkeleton.fromTree(this.rebuilt_.stree),this.skeleton.populate(),this.focus_=this.singletonFocus(this.rootId),this.levels=this.initLevels(),d.connectMactions(this.node,this.getXml(),this.rebuilt_.xml)}previousLevel(){const t=this.getFocus().getDomPrimary();return t?v.getAttribute(t,c.Attribute.PARENT):this.getFocus().getSemanticPrimary().parent.id.toString()}nextLevel(){const t=this.getFocus().getDomPrimary();let e,r;if(t){e=v.splitAttribute(v.getAttribute(t,c.Attribute.CHILDREN)),r=v.splitAttribute(v.getAttribute(t,c.Attribute.CONTENT));const n=v.getAttribute(t,c.Attribute.TYPE),o=v.getAttribute(t,c.Attribute.ROLE);return this.combineContentChildren(n,o,r,e)}const n=t=>t.id.toString(),o=this.getRebuilt().nodeDict[this.primaryId()];return e=o.childNodes.map(n),r=o.contentNodes.map(n),0===e.length?[]:this.combineContentChildren(o.type,o.role,r,e)}singletonFocus(t){this.getRebuilt();const e=this.retrieveVisuals(t);return this.focusFromId(t,e)}retrieveVisuals(t){if(!this.skeleton)return[t];const e=parseInt(t,10),r=this.skeleton.subtreeNodes(e);if(!r.length)return[t];r.unshift(e);const n={},o=[];_.updateEvaluator(this.getXml());for(const t of r)n[t]||(o.push(t.toString()),n[t]=!0,this.subtreeIds(t,n));return o}subtreeIds(t,e){const r=_.evalXPath(`//*[@data-semantic-id="${t}"]`,this.getXml());_.evalXPath("*//@data-semantic-id",r[0]).forEach((t=>e[parseInt(t.textContent,10)]=!0))}focusFromId(t,e){return y.Focus.factory(t,e,this.getRebuilt(),this.node)}summary(){return this.moved=this.isSpeech()?b.WalkerMoves.SUMMARY:b.WalkerMoves.REPEAT,this.getFocus().clone()}detail(){return this.moved=this.isSpeech()?b.WalkerMoves.DETAIL:b.WalkerMoves.REPEAT,this.getFocus().clone()}specialMove(){return null}virtualize(t){return this.cursors.push({focus:this.getFocus(),levels:this.levels,undo:t||!this.cursors.length}),this.levels=this.levels.clone(),this.getFocus().clone()}previous(){const t=this.cursors.pop();return t?(this.levels=t.levels,t.focus):this.getFocus()}undo(){let t;do{t=this.cursors.pop()}while(t&&!t.undo);return t?(this.levels=t.levels,t.focus):this.getFocus()}update(t){this.generator.setOptions(t),(0,a.setup)(t).then((()=>f.generator("Tree").getSpeech(this.node,this.getXml())))}nextRules(){const t=this.generator.getOptions();return"speech"!==t.modality?this.getFocus():(s.DOMAIN_TO_STYLES[t.domain]=t.style,t.domain="mathspeak"===t.domain?"clearspeak":"mathspeak",t.style=s.DOMAIN_TO_STYLES[t.domain],this.update(t),this.moved=b.WalkerMoves.REPEAT,this.getFocus().clone())}nextStyle(t,e){if("mathspeak"===t){const t=["default","brief","sbrief"],r=t.indexOf(e);return-1===r?e:r>=t.length-1?t[0]:t[r+1]}if("clearspeak"===t){const t=m.ClearspeakPreferences.getLocalePreferences().en;if(!t)return"default";const r=m.ClearspeakPreferences.relevantPreferences(this.getFocus().getSemanticPrimary()),n=m.ClearspeakPreferences.findPreference(e,r),o=t[r].map((function(t){return t.split("_")[1]})),i=o.indexOf(n);if(-1===i)return e;const s=i>=o.length-1?o[0]:o[i+1];return m.ClearspeakPreferences.addPreference(e,r,s)}return e}previousRules(){const t=this.generator.getOptions();return"speech"!==t.modality?this.getFocus():(t.style=this.nextStyle(t.domain,t.style),this.update(t),this.moved=b.WalkerMoves.REPEAT,this.getFocus().clone())}refocus(){let t,e=this.getFocus();for(;!e.getNodes().length;){t=this.levels.peek();const r=this.up();if(!r)break;this.setFocus(r),e=this.getFocus(!0)}this.levels.push(t),this.setFocus(e)}toggleActive_(){this.active_=!this.active_}mergePrefix_(t,e=[]){const r=this.isSpeech()?this.prefix_():"";r&&t.unshift(r);const n=this.isSpeech()?this.postfix_():"";return n&&t.push(n),o.finalize(o.merge(e.concat(t)))}prefix_(){const t=this.getFocus().getDomNodes(),e=this.getFocus().getSemanticNodes();return t[0]?v.getAttribute(t[0],c.Attribute.PREFIX):d.retrievePrefix(e[0])}postfix_(){const t=this.getFocus().getDomNodes();return t[0]?v.getAttribute(t[0],c.Attribute.POSTFIX):""}depth_(){const t=p.Grammar.getInstance().getParameter("depth");p.Grammar.getInstance().setParameter("depth",!0);const e=this.getFocus().getDomPrimary(),r=this.expandable(e)?u.LOCALE.MESSAGES.navigate.EXPANDABLE:this.collapsible(e)?u.LOCALE.MESSAGES.navigate.COLLAPSIBLE:"",i=u.LOCALE.MESSAGES.navigate.LEVEL+" "+this.getDepth(),s=this.getFocus().getSemanticNodes(),a=d.retrievePrefix(s[0]),l=[new n.AuditoryDescription({text:i,personality:{}}),new n.AuditoryDescription({text:a,personality:{}}),new n.AuditoryDescription({text:r,personality:{}})];return p.Grammar.getInstance().setParameter("depth",t),o.finalize(o.markup(l))}actionable_(t){const e=null==t?void 0:t.parentNode;return e&&this.highlighter.isMactionNode(e)?e:null}summary_(){const t=this.getFocus().getSemanticPrimary().id.toString(),e=this.getRebuilt().xml.getAttribute("id")===t?this.getRebuilt().xml:i.querySelectorAllByAttrValue(this.getRebuilt().xml,"id",t)[0],r=d.retrieveSummary(e);return this.mergePrefix_([r])}detail_(){const t=this.getFocus().getSemanticPrimary().id.toString(),e=this.getRebuilt().xml.getAttribute("id")===t?this.getRebuilt().xml:i.querySelectorAllByAttrValue(this.getRebuilt().xml,"id",t)[0],r=e.getAttribute("alternative");e.removeAttribute("alternative");const n=d.computeMarkup(e),o=this.mergePrefix_([n]);return e.setAttribute("alternative",r),o}}e.AbstractWalker=S,S.ID_COUNTER=0,S.SRE_ID_ATTR="sre-explorer-id"},162:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DummyWalker=void 0;const n=r(3284);class o extends n.AbstractWalker{up(){return null}down(){return null}left(){return null}right(){return null}repeat(){return null}depth(){return null}home(){return null}getDepth(){return 0}initLevels(){return null}combineContentChildren(t,e,r,n){return[]}findFocusOnLevel(t){return null}}e.DummyWalker=o},7730:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Focus=void 0;const n=r(1204);class o{constructor(t,e){this.nodes=t,this.primary=e,this.domNodes=[],this.domPrimary_=null,this.allNodes=[]}static factory(t,e,r,i){const s=t=>n.getBySemanticId(i,t),a=r.nodeDict,l=s(t),c=e.map(s),u=e.map((function(t){return a[t]})),p=new o(u,a[t]);return p.domNodes=c,p.domPrimary_=l,p.allNodes=o.generateAllVisibleNodes_(e,c,a,i),p}static generateAllVisibleNodes_(t,e,r,i){const s=t=>n.getBySemanticId(i,t);let a=[];for(let n=0,l=t.length;n<l;n++){if(e[n]){a.push(e[n]);continue}const l=r[t[n]];if(!l)continue;const c=l.childNodes.map((function(t){return t.id.toString()})),u=c.map(s);a=a.concat(o.generateAllVisibleNodes_(c,u,r,i))}return a}getSemanticPrimary(){return this.primary}getSemanticNodes(){return this.nodes}getNodes(){return this.allNodes}getDomNodes(){return this.domNodes}getDomPrimary(){return this.domPrimary_}toString(){return"Primary:"+this.domPrimary_+" Nodes:"+this.domNodes}clone(){const t=new o(this.nodes,this.primary);return t.domNodes=this.domNodes,t.domPrimary_=this.domPrimary_,t.allNodes=this.allNodes,t}}e.Focus=o},9797:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Levels=void 0;class r{constructor(){this.level_=[]}push(t){this.level_.push(t)}pop(){return this.level_.pop()}peek(){return this.level_[this.level_.length-1]||null}indexOf(t){const e=this.peek();return e?e.indexOf(t):null}find(t){const e=this.peek();if(!e)return null;for(let r=0,n=e.length;r<n;r++)if(t(e[r]))return e[r];return null}get(t){const e=this.peek();return!e||t<0||t>=e.length?null:e[t]}depth(){return this.level_.length}clone(){const t=new r;return t.level_=this.level_.slice(0),t}toString(){let t="";for(let e,r=0;e=this.level_[r];r++)t+="\n"+e.map((function(t){return t.toString()}));return t}}e.Levels=r},1214:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.RebuildStree=void 0;const n=r(5740),o=r(2298),i=r(3588),s=r(6537),a=r(3308),l=r(5656),c=r(7075),u=r(4795),p=r(1204);class h{constructor(t){this.mathml=t,this.factory=new s.SemanticNodeFactory,this.nodeDict={},this.mmlRoot=p.getSemanticRoot(t),this.streeRoot=this.assembleTree(this.mmlRoot),this.stree=c.SemanticTree.fromNode(this.streeRoot,this.mathml),this.xml=this.stree.xml(),a.default.getInstance().setNodeFactory(this.factory)}static addAttributes(t,e,r){r&&1===e.childNodes.length&&e.childNodes[0].nodeType!==n.NodeType.TEXT_NODE&&u.addAttributes(t,e.childNodes[0]),u.addAttributes(t,e)}static textContent(t,e,r){if(!r&&e.textContent)return void(t.textContent=e.textContent);const n=p.splitAttribute(p.getAttribute(e,o.Attribute.OPERATOR));n.length>1&&(t.textContent=n[1])}static isPunctuated(t){return!l.SemanticSkeleton.simpleCollapseStructure(t)&&t[1]&&l.SemanticSkeleton.contentCollapseStructure(t[1])}getTree(){return this.stree}assembleTree(t){const e=this.makeNode(t),r=p.splitAttribute(p.getAttribute(t,o.Attribute.CHILDREN)),n=p.splitAttribute(p.getAttribute(t,o.Attribute.CONTENT));if(h.addAttributes(e,t,!(r.length||n.length)),0===n.length&&0===r.length)return h.textContent(e,t),e;if(n.length>0){const t=p.getBySemanticId(this.mathml,n[0]);t&&h.textContent(e,t,!0)}e.contentNodes=n.map((t=>this.setParent(t,e))),e.childNodes=r.map((t=>this.setParent(t,e)));const i=p.getAttribute(t,o.Attribute.COLLAPSED);return i?this.postProcess(e,i):e}makeNode(t){const e=p.getAttribute(t,o.Attribute.TYPE),r=p.getAttribute(t,o.Attribute.ROLE),n=p.getAttribute(t,o.Attribute.FONT),i=p.getAttribute(t,o.Attribute.ANNOTATION)||"",s=p.getAttribute(t,o.Attribute.ID),a=p.getAttribute(t,o.Attribute.EMBELLISHED),l=p.getAttribute(t,o.Attribute.FENCEPOINTER),c=this.createNode(parseInt(s,10));return c.type=e,c.role=r,c.font=n||"unknown",c.parseAnnotation(i),l&&(c.fencePointer=l),a&&(c.embellished=a),c}makePunctuation(t){const e=this.createNode(t);return e.updateContent((0,i.invisibleComma)()),e.role="dummy",e}makePunctuated(t,e,r){const n=this.createNode(e[0]);n.type="punctuated",n.embellished=t.embellished,n.fencePointer=t.fencePointer,n.role=r;const o=e.splice(1,1)[0].slice(1);n.contentNodes=o.map(this.makePunctuation.bind(this)),this.collapsedChildren_(e)}makeEmpty(t,e,r){const n=this.createNode(e);n.type="empty",n.embellished=t.embellished,n.fencePointer=t.fencePointer,n.role=r}makeIndex(t,e,r){if(h.isPunctuated(e))return this.makePunctuated(t,e,r),void(e=e[0]);l.SemanticSkeleton.simpleCollapseStructure(e)&&!this.nodeDict[e.toString()]&&this.makeEmpty(t,e,r)}postProcess(t,e){const r=l.SemanticSkeleton.fromString(e).array;if("subsup"===t.type){const e=this.createNode(r[1][0]);return e.type="subscript",e.role="subsup",t.type="superscript",e.embellished=t.embellished,e.fencePointer=t.fencePointer,this.makeIndex(t,r[1][2],"rightsub"),this.makeIndex(t,r[2],"rightsuper"),this.collapsedChildren_(r),t}if("subscript"===t.type)return this.makeIndex(t,r[2],"rightsub"),this.collapsedChildren_(r),t;if("superscript"===t.type)return this.makeIndex(t,r[2],"rightsuper"),this.collapsedChildren_(r),t;if("tensor"===t.type)return this.makeIndex(t,r[2],"leftsub"),this.makeIndex(t,r[3],"leftsuper"),this.makeIndex(t,r[4],"rightsub"),this.makeIndex(t,r[5],"rightsuper"),this.collapsedChildren_(r),t;if("punctuated"===t.type){if(h.isPunctuated(r)){const e=r.splice(1,1)[0].slice(1);t.contentNodes=e.map(this.makePunctuation.bind(this))}return t}if("underover"===t.type){const e=this.createNode(r[1][0]);return"overaccent"===t.childNodes[1].role?(e.type="overscore",t.type="underscore"):(e.type="underscore",t.type="overscore"),e.role="underover",e.embellished=t.embellished,e.fencePointer=t.fencePointer,this.collapsedChildren_(r),t}return t}createNode(t){const e=this.factory.makeNode(t);return this.nodeDict[t.toString()]=e,e}collapsedChildren_(t){const e=t=>{const r=this.nodeDict[t[0]];r.childNodes=[];for(let n=1,o=t.length;n<o;n++){const o=t[n];r.childNodes.push(l.SemanticSkeleton.simpleCollapseStructure(o)?this.nodeDict[o]:e(o))}return r};e(t)}setParent(t,e){const r=p.getBySemanticId(this.mathml,t),n=this.assembleTree(r);return n.parent=e,n}}e.RebuildStree=h},6295:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticWalker=void 0;const n=r(3284),o=r(9797);class i extends n.AbstractWalker{constructor(t,e,r,n){super(t,e,r,n),this.node=t,this.generator=e,this.highlighter=r,this.levels=null,this.restoreState()}initLevels(){const t=new o.Levels;return t.push([this.getFocus()]),t}up(){super.up();const t=this.previousLevel();if(!t)return null;this.levels.pop();return this.levels.find((function(e){return e.getSemanticNodes().some((function(e){return e.id.toString()===t}))}))}down(){super.down();const t=this.nextLevel();return 0===t.length?null:(this.levels.push(t),t[0])}combineContentChildren(t,e,r,n){switch(t){case"relseq":case"infixop":case"multirel":return this.makePairList(n,r);case"prefixop":return[this.focusFromId(n[0],r.concat(n))];case"postfixop":return[this.focusFromId(n[0],n.concat(r))];case"matrix":case"vector":case"fenced":return[this.focusFromId(n[0],[r[0],n[0],r[1]])];case"cases":return[this.focusFromId(n[0],[r[0],n[0]])];case"punctuated":return"text"===e?n.map(this.singletonFocus.bind(this)):n.length===r.length?r.map(this.singletonFocus.bind(this)):this.combinePunctuations(n,r,[],[]);case"appl":return[this.focusFromId(n[0],[n[0],r[0]]),this.singletonFocus(n[1])];case"root":return[this.singletonFocus(n[1]),this.singletonFocus(n[0])];default:return n.map(this.singletonFocus.bind(this))}}combinePunctuations(t,e,r,n){if(0===t.length)return n;const o=t.shift(),i=e.shift();return o===i?(r.push(i),this.combinePunctuations(t,e,r,n)):(e.unshift(i),r.push(o),t.length===e.length?(n.push(this.focusFromId(o,r.concat(e))),n):(n.push(this.focusFromId(o,r)),this.combinePunctuations(t,e,[],n)))}makePairList(t,e){if(0===t.length)return[];if(1===t.length)return[this.singletonFocus(t[0])];const r=[this.singletonFocus(t.shift())];for(let n=0,o=t.length;n<o;n++)r.push(this.focusFromId(t[n],[e[n],t[n]]));return r}left(){super.left();const t=this.levels.indexOf(this.getFocus());if(null===t)return null;const e=this.levels.get(t-1);return e||null}right(){super.right();const t=this.levels.indexOf(this.getFocus());if(null===t)return null;const e=this.levels.get(t+1);return e||null}findFocusOnLevel(t){return this.levels.find((e=>e.getSemanticPrimary().id===t))}}e.SemanticWalker=i},9806:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SyntaxWalker=void 0;const n=r(707),o=r(3284),i=r(9797);class s extends o.AbstractWalker{constructor(t,e,r,n){super(t,e,r,n),this.node=t,this.generator=e,this.highlighter=r,this.levels=null,this.restoreState()}initLevels(){const t=new i.Levels;return t.push([this.primaryId()]),t}up(){super.up();const t=this.previousLevel();return t?(this.levels.pop(),this.singletonFocus(t)):null}down(){super.down();const t=this.nextLevel();if(0===t.length)return null;const e=this.singletonFocus(t[0]);return e&&this.levels.push(t),e}combineContentChildren(t,e,r,o){switch(t){case"relseq":case"infixop":case"multirel":return(0,n.interleaveLists)(o,r);case"prefixop":return r.concat(o);case"postfixop":return o.concat(r);case"matrix":case"vector":case"fenced":return o.unshift(r[0]),o.push(r[1]),o;case"cases":return o.unshift(r[0]),o;case"punctuated":return"text"===e?(0,n.interleaveLists)(o,r):o;case"appl":return[o[0],r[0],o[1]];case"root":return[o[1],o[0]];default:return o}}left(){super.left();const t=this.levels.indexOf(this.primaryId());if(null===t)return null;const e=this.levels.get(t-1);return e?this.singletonFocus(e):null}right(){super.right();const t=this.levels.indexOf(this.primaryId());if(null===t)return null;const e=this.levels.get(t+1);return e?this.singletonFocus(e):null}findFocusOnLevel(t){return this.singletonFocus(t.toString())}focusDomNodes(){return[this.getFocus().getDomPrimary()]}focusSemanticNodes(){return[this.getFocus().getSemanticPrimary()]}}e.SyntaxWalker=s},1799:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.TableWalker=void 0;const n=r(5740),o=r(8496),i=r(9806),s=r(179);class a extends i.SyntaxWalker{constructor(t,e,r,n){super(t,e,r,n),this.node=t,this.generator=e,this.highlighter=r,this.firstJump=null,this.key_=null,this.row_=0,this.currentTable_=null,this.keyMapping.set(o.KeyCode.ZERO,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.ONE,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.TWO,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.THREE,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.FOUR,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.FIVE,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.SIX,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.SEVEN,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.EIGHT,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.NINE,this.jumpCell.bind(this))}move(t){this.key_=t;const e=super.move(t);return this.modifier=!1,e}up(){return this.moved=s.WalkerMoves.UP,this.eligibleCell_()?this.verticalMove_(!1):super.up()}down(){return this.moved=s.WalkerMoves.DOWN,this.eligibleCell_()?this.verticalMove_(!0):super.down()}jumpCell(){if(!this.isInTable_()||null===this.key_)return this.getFocus();if(this.moved===s.WalkerMoves.ROW){this.moved=s.WalkerMoves.CELL;const t=this.key_-o.KeyCode.ZERO;return this.isLegalJump_(this.row_,t)?this.jumpCell_(this.row_,t):this.getFocus()}const t=this.key_-o.KeyCode.ZERO;return t>this.currentTable_.childNodes.length?this.getFocus():(this.row_=t,this.moved=s.WalkerMoves.ROW,this.getFocus().clone())}undo(){const t=super.undo();return t===this.firstJump&&(this.firstJump=null),t}eligibleCell_(){const t=this.getFocus().getSemanticPrimary();return this.modifier&&"cell"===t.type&&-1!==a.ELIGIBLE_CELL_ROLES.indexOf(t.role)}verticalMove_(t){const e=this.previousLevel();if(!e)return null;const r=this.getFocus(),n=this.levels.indexOf(this.primaryId()),o=this.levels.pop(),i=this.levels.indexOf(e),s=this.levels.get(t?i+1:i-1);if(!s)return this.levels.push(o),null;this.setFocus(this.singletonFocus(s));const a=this.nextLevel();return a[n]?(this.levels.push(a),this.singletonFocus(a[n])):(this.setFocus(r),this.levels.push(o),null)}jumpCell_(t,e){this.firstJump?this.virtualize(!1):(this.firstJump=this.getFocus(),this.virtualize(!0));const r=this.currentTable_.id.toString();let n;do{n=this.levels.pop()}while(-1===n.indexOf(r));this.levels.push(n),this.setFocus(this.singletonFocus(r)),this.levels.push(this.nextLevel());const o=this.currentTable_.childNodes[t-1];return this.setFocus(this.singletonFocus(o.id.toString())),this.levels.push(this.nextLevel()),this.singletonFocus(o.childNodes[e-1].id.toString())}isLegalJump_(t,e){const r=n.querySelectorAllByAttrValue(this.getRebuilt().xml,"id",this.currentTable_.id.toString())[0];if(!r||r.hasAttribute("alternative"))return!1;const o=this.currentTable_.childNodes[t-1];if(!o)return!1;const i=n.querySelectorAllByAttrValue(r,"id",o.id.toString())[0];return!(!i||i.hasAttribute("alternative"))&&!(!o||!o.childNodes[e-1])}isInTable_(){let t=this.getFocus().getSemanticPrimary();for(;t;){if(-1!==a.ELIGIBLE_TABLE_TYPES.indexOf(t.type))return this.currentTable_=t,!0;t=t.parent}return!1}}e.TableWalker=a,a.ELIGIBLE_CELL_ROLES=["determinant","rowvector","binomial","squarematrix","multiline","matrix","vector","cases","table"],a.ELIGIBLE_TABLE_TYPES=["multiline","matrix","vector","cases","table"]},179:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.WalkerState=e.WalkerMoves=void 0,function(t){t.UP="up",t.DOWN="down",t.LEFT="left",t.RIGHT="right",t.REPEAT="repeat",t.DEPTH="depth",t.ENTER="enter",t.EXPAND="expand",t.HOME="home",t.SUMMARY="summary",t.DETAIL="detail",t.ROW="row",t.CELL="cell"}(e.WalkerMoves||(e.WalkerMoves={}));class r{static resetState(t){delete r.STATE[t]}static setState(t,e){r.STATE[t]=e}static getState(t){return r.STATE[t]}}e.WalkerState=r,r.STATE={}},3362:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.walkerMapping_=e.walker=void 0;const n=r(162),o=r(6295),i=r(9806),s=r(1799);e.walker=function(t,r,n,o,i){return(e.walkerMapping_[t.toLowerCase()]||e.walkerMapping_.dummy)(r,n,o,i)},e.walkerMapping_={dummy:(t,e,r,o)=>new n.DummyWalker(t,e,r,o),semantic:(t,e,r,n)=>new o.SemanticWalker(t,e,r,n),syntax:(t,e,r,n)=>new i.SyntaxWalker(t,e,r,n),table:(t,e,r,n)=>new s.TableWalker(t,e,r,n)}},1204:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.getBySemanticId=e.getSemanticRoot=e.getAttribute=e.splitAttribute=void 0;const n=r(5740),o=r(2298);e.splitAttribute=function(t){return t?t.split(/,/):[]},e.getAttribute=function(t,e){return t.getAttribute(e)},e.getSemanticRoot=function(t){if(t.hasAttribute(o.Attribute.TYPE)&&!t.hasAttribute(o.Attribute.PARENT))return t;const e=n.querySelectorAllByAttr(t,o.Attribute.TYPE);for(let t,r=0;t=e[r];r++)if(!t.hasAttribute(o.Attribute.PARENT))return t;return t},e.getBySemanticId=function(t,e){return t.getAttribute(o.Attribute.ID)===e?t:n.querySelectorAllByAttrValue(t,o.Attribute.ID,e)[0]}}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var r=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t].call(r.exports,r,r.exports,__webpack_require__),r.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var __webpack_exports__={};!function(){var t=__webpack_require__(9515),e=__webpack_require__(3282),r=__webpack_require__(235),n=__webpack_require__(265),o=__webpack_require__(2388);function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}MathJax.loader&&MathJax.loader.checkVersion("startup",e.VERSION,"startup"),(0,t.combineWithMathJax)({_:{components:{loader:r,package:n,startup:o}}});var s,a={"a11y/semantic-enrich":["input/mml","a11y/sre"],"a11y/complexity":["a11y/semantic-enrich"],"a11y/explorer":["a11y/semantic-enrich","ui/menu"],"[mml]/mml3":["input/mml"],"[tex]/all-packages":["input/tex-base"],"[tex]/action":["input/tex-base","[tex]/newcommand"],"[tex]/autoload":["input/tex-base","[tex]/require"],"[tex]/ams":["input/tex-base"],"[tex]/amscd":["input/tex-base"],"[tex]/bbox":["input/tex-base","[tex]/ams","[tex]/newcommand"],"[tex]/boldsymbol":["input/tex-base"],"[tex]/braket":["input/tex-base"],"[tex]/bussproofs":["input/tex-base"],"[tex]/cancel":["input/tex-base","[tex]/enclose"],"[tex]/centernot":["input/tex-base"],"[tex]/color":["input/tex-base"],"[tex]/colorv2":["input/tex-base"],"[tex]/colortbl":["input/tex-base","[tex]/color"],"[tex]/configmacros":["input/tex-base","[tex]/newcommand"],"[tex]/enclose":["input/tex-base"],"[tex]/extpfeil":["input/tex-base","[tex]/newcommand","[tex]/ams"],"[tex]/html":["input/tex-base"],"[tex]/mathtools":["input/tex-base","[tex]/newcommand","[tex]/ams"],"[tex]/mhchem":["input/tex-base","[tex]/ams"],"[tex]/newcommand":["input/tex-base"],"[tex]/noerrors":["input/tex-base"],"[tex]/noundefined":["input/tex-base"],"[tex]/physics":["input/tex-base"],"[tex]/require":["input/tex-base"],"[tex]/setoptions":["input/tex-base"],"[tex]/tagformat":["input/tex-base"],"[tex]/textcomp":["input/tex-base","[tex]/textmacros"],"[tex]/textmacros":["input/tex-base"],"[tex]/unicode":["input/tex-base"],"[tex]/verb":["input/tex-base"],"[tex]/cases":["[tex]/empheq"],"[tex]/empheq":["input/tex-base","[tex]/ams"]},l=Array.from(Object.keys(a)).filter((function(t){return"[tex]"===t.substr(0,5)&&"[tex]/autoload"!==t&&"[tex]/colorv2"!==t&&"[tex]/all-packages"!==t})),c={startup:["loader"],"input/tex":["input/tex-base","[tex]/ams","[tex]/newcommand","[tex]/noundefined","[tex]/require","[tex]/autoload","[tex]/configmacros"],"input/tex-full":["input/tex-base","[tex]/all-packages"].concat((s=l,function(t){if(Array.isArray(t))return i(t)}(s)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(s)||function(t,e){if(t){if("string"==typeof t)return i(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,e):void 0}}(s)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())),"[tex]/all-packages":l};(0,t.combineDefaults)(MathJax.config.loader,"dependencies",a),(0,t.combineDefaults)(MathJax.config.loader,"paths",{tex:"[mathjax]/input/tex/extensions",mml:"[mathjax]/input/mml/extensions",sre:"[mathjax]/sre/mathmaps"}),(0,t.combineDefaults)(MathJax.config.loader,"provides",c),(0,t.combineDefaults)(MathJax.config.loader,"source",{"[tex]/amsCd":"[tex]/amscd","[tex]/colorV2":"[tex]/colorv2","[tex]/configMacros":"[tex]/configmacros","[tex]/tagFormat":"[tex]/tagformat"}),r.Loader.preLoad("loader","startup","core","input/tex","output/chtml","output/chtml/fonts/tex.js","ui/menu","a11y/assistive-mml");var u=__webpack_require__(444),p=__webpack_require__(6191),h=__webpack_require__(5009),f=__webpack_require__(3494),d=__webpack_require__(3670),m=__webpack_require__(805),y=__webpack_require__(9206),g=__webpack_require__(5722),b=__webpack_require__(4474),v=__webpack_require__(9e3),_=__webpack_require__(91),S=__webpack_require__(6336),O=__webpack_require__(1759),M=__webpack_require__(3909),x=__webpack_require__(9007),E=__webpack_require__(3948),A=__webpack_require__(9145),C=__webpack_require__(142),T=__webpack_require__(7590),N=__webpack_require__(3233),w=__webpack_require__(1334),L=__webpack_require__(6661),I=__webpack_require__(1581),P=__webpack_require__(5410),R=__webpack_require__(6850),k=__webpack_require__(3985),j=__webpack_require__(450),B=__webpack_require__(6405),D=__webpack_require__(3050),F=__webpack_require__(2756),H=__webpack_require__(7238),U=__webpack_require__(5741),X=__webpack_require__(6145),V=__webpack_require__(9878),q=__webpack_require__(7265),W=__webpack_require__(6030),G=__webpack_require__(7131),z=__webpack_require__(1314),J=__webpack_require__(4461),K=__webpack_require__(1349),$=__webpack_require__(4359),Y=__webpack_require__(4770),Z=__webpack_require__(5022),Q=__webpack_require__(5184),tt=__webpack_require__(9102),et=__webpack_require__(6325),rt=__webpack_require__(4082),nt=__webpack_require__(9259),ot=__webpack_require__(2975),it=__webpack_require__(4574),st=__webpack_require__(4596),at=__webpack_require__(7860),lt=__webpack_require__(8823),ct=__webpack_require__(8912),ut=__webpack_require__(3811),pt=__webpack_require__(6272),ht=__webpack_require__(3683),ft=__webpack_require__(5138),dt=__webpack_require__(3726),mt=__webpack_require__(3363),yt=__webpack_require__(3335),gt=__webpack_require__(5713),bt=__webpack_require__(9923),vt=__webpack_require__(6469),_t=__webpack_require__(6751),St=__webpack_require__(5368),Ot=__webpack_require__(7525),Mt=__webpack_require__(103),xt=__webpack_require__(7233),Et=__webpack_require__(8666),At=__webpack_require__(4542),Ct=__webpack_require__(4139),Tt=__webpack_require__(8054),Nt=__webpack_require__(6010),wt=__webpack_require__(7875),Lt=__webpack_require__(505);MathJax.loader&&MathJax.loader.checkVersion("core",e.VERSION,"core"),(0,t.combineWithMathJax)({_:{adaptors:{HTMLAdaptor:u,browserAdaptor:p},components:{global:t},core:{DOMAdaptor:h,FindMath:f,Handler:d,HandlerList:m,InputJax:y,MathDocument:g,MathItem:b,MathList:v,MmlTree:{Attributes:_,MML:S,MathMLVisitor:O,MmlFactory:M,MmlNode:x,MmlNodes:{TeXAtom:E,maction:A,maligngroup:C,malignmark:T,math:N,mathchoice:w,menclose:L,merror:I,mfenced:P,mfrac:R,mglyph:k,mi:j,mmultiscripts:B,mn:D,mo:F,mpadded:H,mphantom:U,mroot:X,mrow:V,ms:q,mspace:W,msqrt:G,mstyle:z,msubsup:J,mtable:K,mtd:$,mtext:Y,mtr:Z,munderover:Q,semantics:tt},MmlVisitor:et,OperatorDictionary:rt,SerializedMmlVisitor:nt},OutputJax:ot,Tree:{Factory:it,Node:st,NodeFactory:at,Visitor:lt,Wrapper:ct,WrapperFactory:ut}},handlers:{html_ts:pt,html:{HTMLDocument:ht,HTMLDomStrings:ft,HTMLHandler:dt,HTMLMathItem:mt,HTMLMathList:yt}},mathjax:gt,util:{AsyncLoad:bt,BBox:vt,BitField:_t,Entities:St,FunctionList:Ot,LinkedList:Mt,Options:xt,PrioritizedList:Et,Retries:At,StyleList:Ct,Styles:Tt,lengths:Nt,numeric:wt,string:Lt}}}),MathJax.startup&&(MathJax.startup.registerConstructor("HTMLHandler",dt.HTMLHandler),MathJax.startup.registerConstructor("browserAdaptor",p.browserAdaptor),MathJax.startup.useHandler("HTMLHandler"),MathJax.startup.useAdaptor("browserAdaptor")),MathJax.loader&&(MathJax._.mathjax.mathjax.asyncLoad=function(t){return MathJax.loader.load(t)});var It=__webpack_require__(8462),Pt=__webpack_require__(9899),Rt=__webpack_require__(4676),kt=__webpack_require__(7073),jt=__webpack_require__(2947),Bt=__webpack_require__(8929),Dt=__webpack_require__(1256),Ft=__webpack_require__(5450),Ht=__webpack_require__(8562),Ut=__webpack_require__(1130),Xt=__webpack_require__(9497),Vt=__webpack_require__(8292),qt=__webpack_require__(5453),Wt=__webpack_require__(8803),Gt=__webpack_require__(9140),zt=__webpack_require__(6521),Jt=__webpack_require__(8317),Kt=__webpack_require__(3971),$t=__webpack_require__(8417),Yt=__webpack_require__(8021),Zt=__webpack_require__(2790),Qt=__webpack_require__(4387),te=__webpack_require__(1275),ee=__webpack_require__(2942),re=__webpack_require__(1181),ne=__webpack_require__(7693),oe=__webpack_require__(8458),ie=__webpack_require__(1496),se=__webpack_require__(6793),ae=__webpack_require__(1110),le=__webpack_require__(5579),ce=__webpack_require__(4898),ue=__webpack_require__(7741);MathJax.loader&&MathJax.loader.checkVersion("input/tex",e.VERSION,"input"),(0,t.combineWithMathJax)({_:{input:{tex_ts:It,tex:{Configuration:Pt,FilterUtil:Rt,FindTeX:kt,MapHandler:jt,NodeFactory:Bt,NodeUtil:Dt,ParseMethods:Ft,ParseOptions:Ht,ParseUtil:Ut,Stack:Xt,StackItem:Vt,StackItemFactory:qt,Symbol:Wt,SymbolMap:Gt,Tags:zt,TexConstants:Jt,TexError:Kt,TexParser:$t,ams:{AmsConfiguration:Yt,AmsItems:Zt,AmsMethods:Qt},autoload:{AutoloadConfiguration:te},base:{BaseConfiguration:ee,BaseItems:re,BaseMethods:ne},configmacros:{ConfigMacrosConfiguration:oe},newcommand:{NewcommandConfiguration:ie,NewcommandItems:se,NewcommandMethods:ae,NewcommandUtil:le},noundefined:{NoUndefinedConfiguration:ce},require:{RequireConfiguration:ue}}}}}),r.Loader.preLoad("input/tex-base","[tex]/ams","[tex]/newcommand","[tex]/noundefined","[tex]/require","[tex]/autoload","[tex]/configmacros"),function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(MathJax.startup){e&&(MathJax.startup.registerConstructor("tex",MathJax._.input.tex_ts.TeX),MathJax.startup.useInput("tex")),MathJax.config.tex||(MathJax.config.tex={});var r=MathJax.config.tex.packages;MathJax.config.tex.packages=t,r&&(0,xt.insert)(MathJax.config.tex,{packages:r})}}(["base","ams","newcommand","noundefined","require","autoload","configmacros"]);var pe=__webpack_require__(50),he=__webpack_require__(8042),fe=__webpack_require__(8270),de=__webpack_require__(6797),me=__webpack_require__(5355),ye=__webpack_require__(9261),ge=__webpack_require__(9086),be=__webpack_require__(95),ve=__webpack_require__(1148),_e=__webpack_require__(8102),Se=__webpack_require__(804),Oe=__webpack_require__(8147),Me=__webpack_require__(2275),xe=__webpack_require__(9063),Ee=__webpack_require__(6911),Ae=__webpack_require__(1653),Ce=__webpack_require__(6781),Te=__webpack_require__(6460),Ne=__webpack_require__(6287),we=__webpack_require__(5964),Le=__webpack_require__(8776),Ie=__webpack_require__(4798),Pe=__webpack_require__(4597),Re=__webpack_require__(2970),ke=__webpack_require__(5610),je=__webpack_require__(4300),Be=__webpack_require__(8002),De=__webpack_require__(7056),Fe=__webpack_require__(1259),He=__webpack_require__(3571),Ue=__webpack_require__(6590),Xe=__webpack_require__(8650),Ve=__webpack_require__(421),qe=__webpack_require__(5884),We=__webpack_require__(5552),Ge=__webpack_require__(3055),ze=__webpack_require__(7519),Je=__webpack_require__(4420),Ke=__webpack_require__(9800),$e=__webpack_require__(1160),Ye=__webpack_require__(1956),Ze=__webpack_require__(7490),Qe=__webpack_require__(7313),tr=__webpack_require__(7555),er=__webpack_require__(2688),rr=__webpack_require__(5636),nr=__webpack_require__(5723),or=__webpack_require__(8009),ir=__webpack_require__(5023),sr=__webpack_require__(7096),ar=__webpack_require__(6898),lr=__webpack_require__(6991),cr=__webpack_require__(8411),ur=__webpack_require__(4126),pr=__webpack_require__(258),hr=__webpack_require__(4093),fr=__webpack_require__(905),dr=__webpack_require__(6237),mr=__webpack_require__(5164),yr=__webpack_require__(6319),gr=__webpack_require__(5766),br=__webpack_require__(1971),vr=__webpack_require__(167),_r=__webpack_require__(5806);MathJax.loader&&MathJax.loader.checkVersion("output/chtml",e.VERSION,"output"),(0,t.combineWithMathJax)({_:{output:{chtml_ts:pe,chtml:{FontData:he,Notation:fe,Usage:de,Wrapper:me,WrapperFactory:ye,Wrappers_ts:ge,Wrappers:{TeXAtom:be,TextNode:ve,maction:_e,math:Se,menclose:Oe,mfenced:Me,mfrac:xe,mglyph:Ee,mi:Ae,mmultiscripts:Ce,mn:Te,mo:Ne,mpadded:we,mroot:Le,mrow:Ie,ms:Pe,mspace:Re,msqrt:ke,msubsup:je,mtable:Be,mtd:De,mtext:Fe,mtr:He,munderover:Ue,scriptbase:Xe,semantics:Ve}},common:{FontData:qe,Notation:We,OutputJax:Ge,Wrapper:ze,WrapperFactory:Je,Wrappers:{TeXAtom:Ke,TextNode:$e,maction:Ye,math:Ze,menclose:Qe,mfenced:tr,mfrac:er,mglyph:rr,mi:nr,mmultiscripts:or,mn:ir,mo:sr,mpadded:ar,mroot:lr,mrow:cr,ms:ur,mspace:pr,msqrt:hr,msubsup:fr,mtable:dr,mtd:mr,mtext:yr,mtr:gr,munderover:br,scriptbase:vr,semantics:_r}}}}}),MathJax.loader&&(0,t.combineDefaults)(MathJax.config.loader,"output/chtml",{checkReady:function(){return MathJax.loader.load("output/chtml/fonts/tex")}}),MathJax.startup&&(MathJax.startup.registerConstructor("chtml",pe.CHTML),MathJax.startup.useOutput("chtml"));var Sr=__webpack_require__(2760),Or=__webpack_require__(4005),Mr=__webpack_require__(1015),xr=__webpack_require__(6555),Er=__webpack_require__(2183),Ar=__webpack_require__(3490),Cr=__webpack_require__(9056),Tr=__webpack_require__(3019),Nr=__webpack_require__(2713),wr=__webpack_require__(7517),Lr=__webpack_require__(4182),Ir=__webpack_require__(2679),Pr=__webpack_require__(5469),Rr=__webpack_require__(775),kr=__webpack_require__(9551),jr=__webpack_require__(6530),Br=__webpack_require__(4409),Dr=__webpack_require__(5292),Fr=__webpack_require__(3980),Hr=__webpack_require__(1103),Ur=__webpack_require__(9124),Xr=__webpack_require__(6001),Vr=__webpack_require__(3696),qr=__webpack_require__(9587),Wr=__webpack_require__(8348),Gr=__webpack_require__(1376),zr=__webpack_require__(1439),Jr=__webpack_require__(331),Kr=__webpack_require__(4886),$r=__webpack_require__(4471),Yr=__webpack_require__(5181),Zr=__webpack_require__(3526),Qr=__webpack_require__(5649),tn=__webpack_require__(7153),en=__webpack_require__(5745),rn=__webpack_require__(1411),nn=__webpack_require__(6384),on=__webpack_require__(6041),sn=__webpack_require__(8199),an=__webpack_require__(9848),ln=__webpack_require__(7906),cn=__webpack_require__(2644),un=__webpack_require__(4926);if(MathJax.loader&&MathJax.loader.checkVersion("output/chtml/fonts/tex",e.VERSION,"chtml-font"),(0,t.combineWithMathJax)({_:{output:{chtml:{fonts:{tex_ts:Sr,tex:{"bold-italic":Or,bold:Mr,"fraktur-bold":xr,fraktur:Er,italic:Ar,largeop:Cr,monospace:Tr,normal:Nr,"sans-serif-bold-italic":wr,"sans-serif-bold":Lr,"sans-serif-italic":Ir,"sans-serif":Pr,smallop:Rr,"tex-calligraphic-bold":kr,"tex-size3":jr,"tex-size4":Br,"tex-variant":Dr}}},common:{fonts:{tex:{"bold-italic":Fr,bold:Hr,delimiters:Ur,"double-struck":Xr,"fraktur-bold":Vr,fraktur:qr,italic:Wr,largeop:Gr,monospace:zr,normal:Jr,"sans-serif-bold-italic":Kr,"sans-serif-bold":$r,"sans-serif-italic":Yr,"sans-serif":Zr,"script-bold":Qr,script:tn,smallop:en,"tex-calligraphic-bold":rn,"tex-calligraphic":nn,"tex-mathit":on,"tex-oldstyle-bold":sn,"tex-oldstyle":an,"tex-size3":ln,"tex-size4":cn,"tex-variant":un}}}}}}),MathJax.startup){(0,t.combineDefaults)(MathJax.config,"chtml",{fontURL:n.Package.resolvePath("output/chtml/fonts/woff-v2",!1)});var pn=(0,xt.selectOptionsFromKeys)(MathJax.config.chtml||{},Sr.TeXFont.OPTIONS);(0,t.combineDefaults)(MathJax.config,"chtml",{font:new Sr.TeXFont(pn)})}var hn=__webpack_require__(5865),fn=__webpack_require__(8310),dn=__webpack_require__(4001),mn=__webpack_require__(473),yn=__webpack_require__(4414);MathJax.loader&&MathJax.loader.checkVersion("ui/menu",e.VERSION,"ui"),(0,t.combineWithMathJax)({_:{ui:{menu:{MJContextMenu:hn,Menu:fn,MenuHandler:dn,MmlVisitor:mn,SelectableInfo:yn}}}}),MathJax.startup&&"undefined"!=typeof window&&MathJax.startup.extendHandler((function(t){return(0,dn.MenuHandler)(t)}),20);var gn=__webpack_require__(351);function bn(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}MathJax.loader&&MathJax.loader.checkVersion("a11y/assistive-mml",e.VERSION,"a11y"),(0,t.combineWithMathJax)({_:{a11y:{"assistive-mml":gn}}}),MathJax.startup&&MathJax.startup.extendHandler((function(t){return(0,gn.AssistiveMmlHandler)(t)})),r.Loader.preLoad("loader"),r.Loader.load.apply(r.Loader,function(t){return function(t){if(Array.isArray(t))return bn(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(!t)return;if("string"==typeof t)return bn(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);"Object"===r&&t.constructor&&(r=t.constructor.name);if("Map"===r||"Set"===r)return Array.from(t);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return bn(t,e)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(r.CONFIG.load)).then((function(){return r.CONFIG.ready()})).catch((function(t){return r.CONFIG.failed(t)}))}()})(); ================================================ FILE: assets/vendors/mp3/load-mp3.js ================================================ var loadAPlayer = function () { var len = APlayerOptions.length; for(var i=0;i<len;i++){ APlayers[i] = new APlayer({ element: document.getElementById('player' + APlayerOptions[i]['id']), narrow: false, preload: APlayerOptions[i]['preload'], mutex: APlayerOptions[i]['mutex'], autoplay: APlayerOptions[i]['autoplay'], showlrc: APlayerOptions[i]['showlrc'], music: APlayerOptions[i]['music'], theme: APlayerOptions[i]['theme'] }); APlayers[i].init(); } }; document.addEventListener('DOMContentLoaded', loadAPlayer, !1); ================================================ FILE: assets/vendors/player/load-player.js ================================================ var dPlayers = []; var loadDPlayer = function () { var load = function (d, conf) { conf.container = d; dPlayers.push(new DPlayer(conf)); }; for (var i = 0; i < dPlayers.length; i++) { dPlayers[i].destroy(); } dPlayers = []; for (var j = 0, k = document.querySelectorAll('.dplayer'); j < k.length; j++) { load(k[j], JSON.parse(k[j].dataset.config)); } }; document.addEventListener('DOMContentLoaded', loadDPlayer, !1); ================================================ FILE: assets/vendors/translate/translate.js ================================================ /*:致谢原作者:管雷鸣 */ var translate={version:"2.7.0.20230901",useVersion:"v1",setUseVersion2:function(){translate.useVersion="v2"},translate:null,includedLanguages:"zh-CN,zh-TW,en",resourcesUrl:"//res.zvo.cn/translate",selectLanguageTag:{show:!0,languages:"",alreadyRender:!1,selectOnChange:function(e){var t=e.target.value;translate.changeLanguage(t)},render:function(){if(!translate.selectLanguageTag.alreadyRender&&(translate.selectLanguageTag.alreadyRender=!0,translate.selectLanguageTag.show)){if(null==document.getElementById("translate")){var e=document.getElementsByTagName("body")[0],t=document.createElement("div");t.id="translate",e.appendChild(t)}else if(null!=document.getElementById("translateSelectLanguage"))return;translate.request.post(translate.request.api.host+translate.request.api.language+"?v="+translate.version,{},function(e){if(0!=e.result){var t=function(e){translate.selectLanguageTag.selectOnChange(e)},a=document.createElement("select");a.id="translateSelectLanguage",a.className="translateSelectLanguage";for(var n=0;n<e.list.length;n++){var r=document.createElement("option");if(r.setAttribute("value",e.list[n].id),translate.selectLanguageTag.languages.length>0){var l=(","+translate.selectLanguageTag.languages+",").toLowerCase();if(console.log(l),l.indexOf(","+e.list[n].id.toLowerCase()+",")<0)continue}null!=translate.to&&void 0!==translate.to&&translate.to.length>0?translate.to==e.list[n].id&&r.setAttribute("selected","selected"):e.list[n].id==translate.language.getLocal()&&r.setAttribute("selected","selected"),r.appendChild(document.createTextNode(e.list[n].name)),a.appendChild(r)}window.addEventListener?a.addEventListener("change",t,!1):a.attachEvent("onchange",t),document.getElementById("translate").appendChild(a)}else console.log("load language list error : "+e.info)})}}},localLanguage:"zh-CN",googleTranslateElementInit:function(){var e="";null!=document.getElementById("translate")&&(e="translate"),translate.translate=new google.translate.TranslateElement({pageLanguage:"zh-CN",includedLanguages:translate.selectLanguageTag.languages,layout:0},e)},init:function(){var e=window.location.protocol;"file:"==window.location.protocol&&(e="http:"),-1==this.resourcesUrl.indexOf("://")&&(this.resourcesUrl=e+this.resourcesUrl)},execute_v1:function(){if(null==document.getElementById("translate")&&translate.selectLanguageTag.show){var e=document.getElementsByTagName("body")[0],t=document.createElement("div");t.id="translate",e.appendChild(t)}""==translate.includedLanguages&&(translate.selectLanguageTag.languages=translate.includedLanguages),console.log("translate.js tip: translate.includedLanguages obsolete, please use the translate.selectLanguageTag.languages are set");var a=document.getElementsByTagName("head")[0],n=document.createElement("script");n.type="text/javascript",n.src=this.resourcesUrl+"/js/element.js",a.appendChild(n)},setCookie:function(e,t){var a=e+"="+escape(t);document.cookie=a},getCookie:function(e){for(var t=document.cookie.split("; "),a=0;a<t.length;a++){var n=t[a].split("=");if(n[0]==e)return unescape(n[1])}return""},currentLanguage:function(){var e=translate.getCookie("googtrans");return e.length>0?e.substr(e.lastIndexOf("/")+1,e.length-1):translate.localLanguage},changeLanguage:function(e){if(",en,de,hi,lt,hr,lv,ht,hu,zh-CN,hy,uk,mg,id,ur,mk,ml,mn,af,mr,uz,ms,el,mt,is,it,my,es,et,eu,ar,pt-PT,ja,ne,az,fa,ro,nl,en-GB,no,be,fi,ru,bg,fr,bs,sd,se,si,sk,sl,ga,sn,so,gd,ca,sq,sr,kk,st,km,kn,sv,ko,sw,gl,zh-TW,pt-BR,co,ta,gu,ky,cs,pa,te,tg,th,la,cy,pl,da,tr,".indexOf(","+e+",")>-1){console.log("您使用的是v1版本的切换语种方式,v1已在2021年就以废弃,请更换为v2,参考文档: http://translate.zvo.cn/41549.html"),translate.check();var t="/"+translate.localLanguage+"/"+e,a=document.location.host.split(".");if(a.length>2){var n=a[a.length-2]+"."+a[a.length-1];document.cookie="googtrans=;expires="+new Date(1)+";domain="+n+";path=/",document.cookie="googtrans="+t+";domain="+n+";path=/"}return translate.setCookie("googtrans",""+t),void location.reload()}if(translate.setUseVersion2(),null!=translate.to&&translate.to.length>0&&translate.to!=translate.language.getLocal())var r=!0;translate.to=e,translate.storage.set("to",e),r?location.reload():translate.execute()},check:function(){"file:"==window.location.protocol&&console.log("\r\n---WARNING----\r\ntranslate.js 主动翻译组件自检异常,当前协议是file协议,翻译组件要在正常的线上http、https协议下才能正常使用翻译功能\r\n------------")},to:"",autoDiscriminateLocalLanguage:!1,documents:[],ignore:{tag:["style","script","link","pre","code"],class:["ignore","translateSelectLanguage"],id:[],isIgnore:function(e){if(null==e||void 0===e)return!1;for(var t=e,a=100;a-- >0;){if(null==t||void 0===t)return!1;var n=translate.element.getNodeName(t).toLowerCase();if(n.length>0){if("body"==n||"html"==n||"#document"==n)return!1;if(translate.ignore.tag.indexOf(n)>-1)return!0}if(null!=t.className){var r=t.className;if(null==r||"string"!=typeof r)continue;r=r.trim().split(" ");for(var l=0;l<r.length;l++)if(null!=r[l]&&r[l].trim().length>0&&translate.ignore.class.indexOf(r[l])>-1)return!0}if(null!=t.id&&void 0!==t.id&&translate.ignore.id.indexOf(t.id)>-1)return!0;t=t.parentNode}return!1}},nomenclature:{data:new Array,old_Data:[],set:function(e){alert("请将 translate.nomenclature.set 更换为 append,具体使用可参考: https://github.com/xnx3/translate ")},append:function(e,t,a){void 0===translate.nomenclature.data[e]&&(translate.nomenclature.data[e]=new Array),void 0===translate.nomenclature.data[e][t]&&(translate.nomenclature.data[e][t]=new Array);for(var n=a.split("\n"),r=0;r<n.length;r++){var l=n[r].trim();if(!(l.length<1)){var s=l.split("=");if(2==s.length){var o=s[0].trim(),u=s[1].trim();0!=o.length&&0!=u.length&&(translate.nomenclature.data[e][t][o]=u)}}}translate.nomenclature.data[e][t]=translate.util.objSort(translate.nomenclature.data[e][t])},get:function(){return translate.nomenclature.data},dispose:function(e){if(null==e||0==e.length)return e;if(void 0===translate.nomenclature.data[translate.language.getLocal()]||void 0===translate.nomenclature.data[translate.language.getLocal()][translate.to])return e;for(var t in translate.nomenclature.data[translate.language.getLocal()][translate.to]){var a=translate.nomenclature.data[translate.language.getLocal()][translate.to][t];if("function"!=typeof a){var n=e.indexOf(t);if(n>-1)if("english"==translate.language.getLocal()){var r="";if(0==n);else if(r=e.substr(n-1,1),"english"==translate.language.getCharLanguage(r))continue;var l="";if(n+t.length==e.length);else if(l=e.substr(n+t.length,1),"english"==translate.language.getCharLanguage(l))continue;e=e.replace(new RegExp(r+t+l,"g"),r+a+l)}else e=e.replace(new RegExp(t,"g"),a)}}return e}},office:{export:function(){if(translate.language.getLocal()!=translate.language.getCurrent()){var e="";for(var t in translate.nodeQueue){translate.nodeQueue[t];for(var a in translate.nodeQueue[t].list)if(!("string"!=typeof a||a.length<1))for(var n in translate.nodeQueue[t].list[a])e=e+"\n"+translate.nodeQueue[t].list[a][n].original+"="+translate.storage.get("hash_"+translate.language.getCurrent()+"_"+n)}e.length>0?(e="translate.office.append('"+translate.language.getCurrent()+"',`"+e+"\n`);",translate.util.loadMsgJs(),msg.popups({text:'<textarea id="msgPopupsTextarea" style="width:100%; height:100%;">loaing...</textarea>',width:"750px",height:"600px",padding:"1px"}),document.getElementById("msgPopupsTextarea").value=e):msg.alert("无有效内容")}else alert("本地语种跟要翻译的语种一致,无需导出")},showPanel:function(){let e=document.createElement("div");e.setAttribute("id","translate_export"),e.setAttribute("class","ignore");let t=document.createElement("button");t.onclick=function(){translate.office.export()},t.innerHTML="导出配置信息",t.setAttribute("style","margin-left: 72px; margin-top: 30px; margin-bottom: 20px; font-size: 25px;"),e.appendChild(t);let a=document.createElement("div");a.innerHTML='1. 首先将当前语种切换为你要翻译的语种<br/>2. 点击导出按钮,将翻译的配置信息导出<br/>3. 将导出的配置信息粘贴到代码中,即可完成<br/><a href="asd" target="_black" style="color: aliceblue;">点此进行查阅详细使用说明</a>',a.setAttribute("style","font-size: 14px; padding: 12px;"),e.appendChild(a),e.setAttribute("style","background-color: black; color: #fff; width: 320px; height: 200px; position: fixed; bottom: 50px; right: 50px;"),document.body.appendChild(e),translate.util.loadMsgJs()},append:function(e,t){for(var a=t.split("\n"),n=0;n<a.length;n++){var r=a[n].trim();if(!(r.length<1)){var l=r.split("=");if(2==l.length){var s=l[0],o=l[1];0!=s.length&&0!=o.length&&translate.storage.set("hash_"+e+"_"+translate.util.hash(s),o)}}}}},setAutoDiscriminateLocalLanguage:function(){translate.autoDiscriminateLocalLanguage=!0},nodeQueue:{},setDocuments:function(e){null!=e&&void 0!==e&&(void 0===e.length?translate.documents[0]=e:translate.documents=e,translate.nodeQueue={},console.log("set documents , clear translate.nodeQueue"))},getDocuments:function(){return null!=translate.documents&&void 0!==translate.documents&&translate.documents.length>0?translate.documents:document.all},listener:{isStart:!1,start:function(){translate.temp_linstenerStartInterval=setInterval(function(){"complete"==document.readyState&&(clearInterval(translate.temp_linstenerStartInterval),translate.listener.addListener())},300)},addListener:function(){translate.listener.isStart=!0;const e={attributes:!0,childList:!0,subtree:!0},t=new MutationObserver(function(e,t){var a=[];for(let t of e)"childList"===t.type&&t.addedNodes.length>0&&a.push.apply(a,t.addedNodes);a.length>0&&setTimeout(function(){translate.execute(a)},10)});for(var a=translate.getDocuments(),n=0;n<a.length;n++){var r=a[n];null!=r&&t.observe(r,e)}},renderTaskFinish:function(e){}},renderTask:class{constructor(){this.taskQueue=[],this.nodes=[]}add(e,t,a,n){var r=translate.element.nodeAnalyse.get(e,n),l=translate.util.hash(r.text);void 0===this.nodes[l]&&(this.nodes[l]=new Array),this.nodes[l].push(e);var s=this.taskQueue[l];null!=s&&void 0!==s||(s=new Array);var o=new Array;" "==t.substr(0,1)&&" "!=a.substr(0,1)&&(a=" "+a)," "===t.substr(t.length-1,1)&&" "!=a.substr(0,1)&&(a+=" "),o.originalText=t,o.resultText=a,o.attribute=n,s.push(o),this.taskQueue[l]=s}execute(){for(var e in this.taskQueue){"function"!=typeof(t=this.taskQueue[e])&&(t.sort((e,t)=>t.originalText.length-e.originalText.length),this.taskQueue[e]=t)}for(var e in this.nodes)for(var t=this.taskQueue[e],a=0;a<this.nodes[e].length;a++)for(var n=0;n<t.length;n++){var r=t[n];"function"!=typeof t&&translate.element.nodeAnalyse.set(this.nodes[e][n],r.originalText,r.resultText,r.attribute)}if(void 0!==this.taskQueue&&Object.keys(this.taskQueue).length>0){var l=this;setTimeout(function(){for(var e in l.nodes)for(var t in l.nodes[e]){var a=translate.element.nodeAnalyse.get(l.nodes[e][0]),n=nodeuuid.uuid(a.node);0!=n.length&&(translate.nodeHistory[n]={},translate.nodeHistory[n].node=a.node,translate.nodeHistory[n].translateText=a.text)}translate.listener.renderTaskFinish(l)},50)}}},execute:function(e){"undefined"!=typeof doc&&(translate.useVersion="v2"),"v1"==translate.useVersion&&(console.log("提示:https://github.com/xnx3/translate 在 v2.5 版本之后,由于谷歌翻译调整,免费翻译通道不再支持,所以v1版本的翻译接口不再被支持,v1全线下架。考虑到v1已不能使用,当前已自动切换到v2版本。如果您使用中发现什么异常,请针对v2版本进行适配。"),translate.useVersion="v2");var t=translate.util.uuid();if(null==translate.to||""==translate.to){var a=translate.storage.get("to");null!=a&&void 0!==a&&a.length>0&&(translate.to=a)}try{translate.selectLanguageTag.render()}catch(e){console.log(e)}if(null!=translate.to&&void 0!==translate.to&&0!=translate.to.length){if(translate.to!=translate.language.getLocal()){var n;if(translate.images.execute(),void 0!==e){if(null==e)return void console.log("translate.execute(...) 中传入的要翻译的目标区域不存在。");void 0===e.length?(n=new Array)[0]=e:n=e}else n=translate.getDocuments();for(var r=0;r<n.length&r<20;r++){var l=n[r];translate.element.whileNodes(t,l)}for(var s in translate.nodeQueue[t].list){for(var o in translate.nodeQueue[t].list[s]){for(var u=translate.nodeQueue[t].list[s][o].nodes.length-1;u>-1;u--){var i=translate.element.nodeAnalyse.get(translate.nodeQueue[t].list[s][o].nodes[u].node),g=nodeuuid.uuid(i.node);void 0!==translate.nodeHistory[g]&&translate.nodeHistory[g].translateText==i.text&&translate.nodeQueue[t].list[s][o].nodes.splice(u,1)}0==translate.nodeQueue[t].list[s][o].nodes.length&&delete translate.nodeQueue[t].list[s][o]}0==Object.keys(translate.nodeQueue[t].list[s]).length&&delete translate.nodeQueue[t].list[s]}var d={},c={},f={};for(var s in translate.nodeQueue[t].list){if(null==s||void 0===s||0==s.length||"undefined"==s)continue;d[s]=[],c[s]=[];let e=new translate.renderTask;for(var o in f[s]=[],translate.nodeQueue[t].list[s])if("function"!=typeof translate.nodeQueue[t].list[s][o]){var h=translate.nodeQueue[t].list[s][o].original,p=translate.nodeQueue[t].list[s][o].translateText,v=h==p?o:translate.util.hash(p);translate.nodeQueue[t].list[s][o].cacheHash=v;var m=translate.storage.get("hash_"+translate.to+"_"+v);if(null!=m&&m.length>0)for(var x=0;x<translate.nodeQueue[t].list[s][o].nodes.length;x++){e.add(translate.nodeQueue[t].list[s][o].nodes[x].node,h,translate.nodeQueue[t].list[s][o].nodes[x].beforeText+m+translate.nodeQueue[t].list[s][o].nodes[x].afterText,translate.nodeQueue[t].list[s][o].nodes[x].attribute);var y=-1;for(r=0;r<f[s].length;r++)translate.nodeQueue[t].list[s][o].nodes[x].node.isSameNode(f[s][r].node)&&(y=r);-1==y&&(y=f[s].length,f[s][y]={},f[s][y].node=translate.nodeQueue[t].list[s][o].nodes[x].node,f[s][y].array=[]);var T=f[s][y].array.length;f[s][y].array[T]=translate.nodeQueue[t].list[s][o].nodes[x].beforeText+m+translate.nodeQueue[t].list[s][o].nodes[x].afterText}else d[s].push(p),c[s].push(o)}e.execute()}for(var s in f){var w=Object.keys(translate.nodeQueue[t].list[s]),b=w.length;for(r=0;r<f[s].length;r++){f[s][r].array.sort(function(e,t){return t.length-e.length});for(var L=translate.element.nodeAnalyse.get(f[s][r].node),Q=L.text,E=0;E<f[s][r].array.length;E++)f[s][r].array[E]<1;for(var N=Q.split("\n"),A=0;A<N.length;A++)N[A]<1||translate.addNodeToQueue(t,L.node,N[A])}var C=Object.keys(translate.nodeQueue[t].list[s]);if(b-C.length!=0)for(var k=0;k<C.length;k++)if(twoHash=C[k],-1==w.indexOf(twoHash)){var R=translate.nodeQueue[t].list[s][twoHash];v=R.original==R.translateText?twoHash:translate.util.hash(R.translateText);translate.nodeQueue[t].list[s][twoHash].cacheHash=v,d[s].push(R.translateText),c[s].push(twoHash)}}var F=[];for(var s in translate.nodeQueue[t].list)void 0!==d[s]&&(d[s].length<1||F.push(s));if(0!=F.length)for(var _ in F){s=F[_];if(void 0===d[s]||d[s].length<1)return;var O=translate.request.api.host+translate.request.api.translate+"?v="+translate.version,S={from:s,to:translate.to,text:encodeURIComponent(JSON.stringify(d[s]))};translate.request.post(O,S,function(e){if(0==e.result)return console.log("=======ERROR START======="),console.log(d[e.from]),console.log("response : "+e.info),void console.log("=======ERROR END =======");let a=new translate.renderTask;for(var n=0;n<c[e.from].length;n++){var r=e.from,l=e.text[n],s=c[e.from][n],o=translate.nodeQueue[t].list[r][s].cacheHash,u="";try{u=translate.nodeQueue[t].list[r][s].original}catch(e){console.log("uuid:"+t+", originalWord:"+u+", lang:"+r+", hash:"+s+", text:"+l+", queue:"+translate.nodeQueue[t]),console.log(e);continue}for(var i=0;i<translate.nodeQueue[t].list[r][s].nodes.length;i++)a.add(translate.nodeQueue[t].list[r][s].nodes[i].node,u,translate.nodeQueue[t].list[r][s].nodes[i].beforeText+l+translate.nodeQueue[t].list[r][s].nodes[i].afterText,translate.nodeQueue[t].list[r][s].nodes[i].attribute);translate.storage.set("hash_"+e.to+"_"+o,l)}a.execute()})}}}else translate.autoDiscriminateLocalLanguage&&translate.executeByLocalLanguage()},nodeHistory:{},element:{nodeAnalyse:{get:function(e,t){return translate.element.nodeAnalyse.analyse(e,"","",t)},set:function(e,t,a,n){translate.element.nodeAnalyse.analyse(e,t,a,n)},analyse:function(e,t,a,n){var r=new Array;r.node=e,r.text="";var l=translate.element.getNodeName(e);if(null!=n&&"string"==typeof n&&n.length>0)return r.text=e[n],void 0!==t&&t.length>0&&(void 0!==e[n]?e[n]=e[n].replace(new RegExp(translate.util.regExp.pattern(t),"g"),translate.util.regExp.resultText(a)):console.log(e)),r;"#text"==l&&(void 0!==e.parentNode&&"TEXTAREA"==translate.element.getNodeName(e.parentNode)&&(l="TEXTAREA",e=e.parentNode));if("INPUT"==l||"TEXTAREA"==l){if(null==e.attributes||void 0===e.attributes)return r.text="",r;if("INPUT"==l&&void 0!==e.attributes.type&&null!=typeof e.attributes.type.nodeValue&&("button"==e.attributes.type.nodeValue.toLowerCase()||"submit"==e.attributes.type.nodeValue.toLowerCase())){var s=e.attributes.value;if(null!=s&&void 0!==s&&void 0!==s.nodeValue&&s.nodeValue.length>0)return void 0!==t&&t.length>0&&(s.nodeValue=s.nodeValue.replace(new RegExp(translate.util.regExp.pattern(t),"g"),translate.util.regExp.resultText(a))),r.text=s.nodeValue,r.node=s,r}return void 0!==e.attributes.placeholder?(void 0!==t&&t.length>0&&(e.attributes.placeholder.nodeValue=e.attributes.placeholder.nodeValue.replace(new RegExp(translate.util.regExp.pattern(t),"g"),translate.util.regExp.resultText(a))),r.text=e.attributes.placeholder.nodeValue,r.node=e.attributes.placeholder,r):(r.text="",r)}if("META"==l){if(void 0!==e.name&&null!=e.name){var o=e.name.toLowerCase();if("keywords"==o||"description"==o)return void 0!==t&&null!=t&&t.length>0&&(e.content=e.content.replace(new RegExp(translate.util.regExp.pattern(t),"g"),translate.util.regExp.resultText(a))),r.text=e.content,r}return r.text="",r}return"IMG"==l?void 0===e.alt||null==e.alt?(r.text="",r):(void 0!==t&&t.length>0&&(e.alt=e.alt.replace(new RegExp(translate.util.regExp.pattern(t),"g"),translate.util.regExp.resultText(a))),r.text=e.alt,r):(null==e.nodeValue||void 0===e.nodeValue?r.text="":0==e.nodeValue.trim().length?r.text="":(void 0!==t&&null!=t&&t.length>0&&(e.nodeValue=e.nodeValue.replace(new RegExp(translate.util.regExp.pattern(t),"g"),translate.util.regExp.resultText(a))),r.text=e.nodeValue),r)}},getNodeName:function(e){return null==e||void 0===e?"":null==e.nodeName||void 0===e.nodeName?"":e.nodeName},whileNodes:function(e,t){if(null!=t&&void 0!==t){void 0!==translate.nodeQueue[e]&&null!=translate.nodeQueue[e]||(translate.nodeQueue[e]=new Array,translate.nodeQueue[e].expireTime=Date.now()+12e4,translate.nodeQueue[e].list=new Array),"object"==typeof t&&"string"==typeof t.title&&t.title.length>0&&(translate.ignore.isIgnore(t)||translate.addNodeToQueue(e,t,t.title,"title"));var a=t.childNodes;if(a.length>0)for(var n=0;n<a.length;n++)translate.element.whileNodes(e,a[n]);else translate.element.findNode(e,t)}},findNode:function(e,t){if(null!=t&&void 0!==t&&null!=t.parentNode){var a=translate.element.getNodeName(t.parentNode);if(""!=a&&!(translate.ignore.tag.indexOf(a.toLowerCase())>-1||translate.ignore.isIgnore(t))){var n=translate.element.nodeAnalyse.get(t);n.text.length>0&&translate.addNodeToQueue(e,n.node,n.text)}}}},addNodeToQueue:function(e,t,a,n){if(null!=t&&null!=a&&0!=a.length&&"#comment"!=translate.element.getNodeName(t).toLowerCase()){translate.util.hash(a);if(translate.util.findTag(a)){if(null==t.parentNode)return;var r=translate.element.getNodeName(t.parentNode);if("SCRIPT"==r||"STYLE"==r)return}var l=translate.language.get(a);for(var s in void 0!==l[translate.to]&&delete l[translate.to],l){null!=translate.nodeQueue[e].list[s]&&void 0!==translate.nodeQueue[e].list[s]||(translate.nodeQueue[e].list[s]=new Array);for(var o=0;o<l[s].length;o++)if(void 0!==l[s][o]&&void 0!==l[s][o].text){var u=l[s][o].text,i=l[s][o].beforeText,g=l[s][o].afterText,d=translate.util.hash(u);null!=translate.nodeQueue[e].list[s][d]&&void 0!==translate.nodeQueue[e].list[s][d]||(translate.nodeQueue[e].list[s][d]=new Array,translate.nodeQueue[e].list[s][d].nodes=new Array,translate.nodeQueue[e].list[s][d].original=u,translate.nodeQueue[e].list[s][d].translateText=translate.nomenclature.dispose(u));var c=!1;if(void 0!==t.isSameNode)for(var f=0;f<translate.nodeQueue[e].list[s][d].nodes.length;f++)t.isSameNode(translate.nodeQueue[e].list[s][d].nodes[f].node)&&(c=!0);if(!c){var h=translate.nodeQueue[e].list[s][d].nodes.length;translate.nodeQueue[e].list[s][d].nodes[h]=new Array,translate.nodeQueue[e].list[s][d].nodes[h].node=t,translate.nodeQueue[e].list[s][d].nodes[h].attribute=n,translate.nodeQueue[e].list[s][d].nodes[h].beforeText=i,translate.nodeQueue[e].list[s][d].nodes[h].afterText=g}}}}},language:{local:"",setLocal:function(e){translate.setUseVersion2(),translate.language.local=e},getLocal:function(){return(null==translate.language.local||translate.language.local.length<1)&&translate.language.autoRecognitionLocalLanguage(),translate.language.local},getCurrent:function(){var e=translate.storage.get("to");return null!=e&&void 0!==e&&e.length>0?e:translate.language.getLocal()},setDefaultTo:function(e){var t=translate.storage.get("to");null!=t&&void 0!==t&&t.length>0||(translate.storage.set("to",e),translate.to=e)},setUrlParamControl:function(e){(void 0===e||e.length<1)&&(e="language");var t=translate.util.getUrlParam(e);void 0!==t&&""!=t&&"null"!=t&&"undefined"!=t&&(translate.storage.set("to",t),translate.to=t)},autoRecognitionLocalLanguage:function(){if(!(null!=translate.language.local&&translate.language.local.length>2)){var e=document.body.outerText;if(null==e||void 0===e||e.length<1)translate.language.local="chinese_simplified";else{e=e.replace(/\n|\t|\r/g,"");for(var t=new Array,a=0;a<e.length;a++){var n=e.charAt(a),r=translate.language.getCharLanguage(n);""==r&&(r="unidentification"),t.push(r)}var l=translate.util.arrayFindMaxNumber(t),s=l.indexOf("specialCharacter");s>-1&&l.splice(s,1),l.length>0?translate.language.local=l[0]:translate.language.local="chinese_simplified"}}},get:function(e){for(var t=new Array,a=new Array,n=[],r=[],l=0;l<e.length;l++){var s=e.charAt(l),o=translate.language.getCharLanguage(s);""==o&&(o="unidentification");var u=translate.language.analyse(o,a,n,r,s);a=u.langStrs,void 0!==n.language&&(r.language=n.language,r.charstr=n.charstr,r.storage_language=n.storage_language),n.language=u.storage_language,n.charstr=s,n.storage_language=u.storage_language,t.push(o)}return void 0!==a.unidentification&&delete a.unidentification,void 0!==a.specialCharacter&&delete a.specialCharacter,void 0!==a.number&&delete a.number,a},getCharLanguage:function(e){return null==e||void 0===e?"":this.english(e)?"english":this.specialCharacter(e)?"specialCharacter":this.number(e)?"number":this.chinese_simplified(e)?"chinese_simplified":this.japanese(e)?"japanese":this.korean(e)?"korean":(console.log("not find is language , char : "+e+", unicode: "+e.charCodeAt(0).toString(16)),"")},analyse:function(e,t,a,n,r){void 0===t[e]&&(t[e]=new Array);var l=0;void 0===a.storage_language||(translate.language.connector(r)&&(e=a.storage_language),l=a.storage_language==e?t[e].length-1:t[e].length),void 0===t[e][l]&&(t[e][l]=new Array,t[e][l].beforeText="",t[e][l].afterText="",t[e][l].text=""),t[e][l].text=t[e][l].text+r,0==translate.language.wordBlankConnector(translate.language.getLocal())&&translate.language.wordBlankConnector(translate.to)&&null!=a.storage_language&&void 0!==a.storage_language&&a.storage_language.length>0&&"specialCharacter"!=a.storage_language&&(0==translate.language.wordBlankConnector(a.storage_language)&&translate.language.wordBlankConnector(e)?t[a.storage_language][t[a.storage_language].length-1].afterText=" ":"english"==a.storage_language&&"english"!=e&&(t[e][l].beforeText=" "));var s=new Array;return s.langStrs=t,s.storage_language=e,s},connector:function(e){return!!/.*[\u0020\u00A0\u202F\u205F\u3000]+.*$/.test(e)||(!!/.*[\u0030-\u0039]+.*$/.test(e)||(!!/.*[\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u002C\u002D\u002E\u003A\u003B\u003F\u0040]+.*$/.test(e)||!!/.*[\u3002\uFF1F\uFF01\uFF0C\u3001\uFF1B\uFF1A\u300C\u300D\u300E\u300F\u2018\u2019\u201C\u201D\uFF08\uFF09\u3014\u3015\u3010\u3011\u2014\u2026\u2013\uFF0E\u300A\u300B\u3008\u3009\u00b7]+.*$/.test(e)))},wordBlankConnector:function(e){if(null==e||void 0===e)return!0;switch(e.trim().toLowerCase()){case"chinese_simplified":case"chinese_traditional":case"korean":case"japanese":return!1}return!0},chinese_simplified:function(e){return!!/.*[\u4e00-\u9fa5]+.*$/.test(e)},english:function(e){return!!/.*[\u0041-\u005a]+.*$/.test(e)||!!/.*[\u0061-\u007a]+.*$/.test(e)},japanese:function(e){return!!/.*[\u0800-\u4e00]+.*$/.test(e)},korean:function(e){return!!/.*[\uAC00-\uD7AF]+.*$/.test(e)},number:function(e){return!!/.*[\u0030-\u0039]+.*$/.test(e)},specialCharacter:function(e){return!!/.*[\u2460-\u24E9]+.*$/.test(e)||(!!/.*[\u2500-\u25FF]+.*$/.test(e)||(!!/.*[\u3200-\u33FF]+.*$/.test(e)||(!!/.*[\uFF00-\uFF5E]+.*$/.test(e)||(!!/.*[\u2000-\u22FF]+.*$/.test(e)||(!!/.*[\u3001-\u3036]+.*$/.test(e)||(!!/.*[\u0020-\u002F]+.*$/.test(e)||(!!/.*[\u003A-\u007E]+.*$/.test(e)||(!!/.*[\u0009\u000a\u0020\u00A0\u1680\u180E\u202F\u205F\u3000\uFEFF]+.*$/.test(e)||(!!/.*[\u2000-\u200B]+.*$/.test(e)||(!!/.*[\u00A1-\u0105]+.*$/.test(e)||!!/.*[\u2C60-\u2C77]+.*$/.test(e)))))))))))}},executeByLocalLanguage:function(){translate.request.post(translate.request.api.host+translate.request.api.ip+"?v="+translate.version,{},function(e){0==e.result?(console.log("==== ERROR 获取当前用户所在区域异常 ===="),console.log(e.info),console.log("==== ERROR END ====")):(translate.setUseVersion2(),translate.storage.set("to",e.language),translate.to=e.language,translate.selectLanguageTag,translate.execute())})},util:{uuid:function(){var e=(new Date).getTime();return window.performance&&"function"==typeof window.performance.now&&(e+=performance.now()),"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".replace(/[xy]/g,function(t){var a=(e+16*Math.random())%16|0;return e=Math.floor(e/16),("x"==t?a:3&a|8).toString(16)})},findTag:function(e){return/<[^>]+>/g.test(e)},arrayFindMaxNumber:function(e){for(var t={},a=[],n=0,r=0,l=e.length;r<l;r++)t[e[r]]?t[e[r]]++:t[e[r]]=1,t[e[r]]>n&&(n=t[e[r]]);for(var s in t)t[s]===n&&a.push(s);return a},hash:function(e){if(null==e||void 0===e)return e;var t,a=0;if(0===e.length)return a;for(t=0;t<e.length;t++)a=(a<<5)-a+e.charCodeAt(t),a|=0;return a+""},charReplace:function(e){return null==e?"":e=(e=e.trim()).replace(/\t|\n|\v|\r|\f/g,"")},regExp:{pattern:function(e){return e=(e=(e=e.replace(/\"/g,'\\"')).replace(/\?/g,"\\?")).replace(/\$/g,"\\$")},resultText:function(e){return e}},getUrlParam:function(e){var t=new RegExp("(^|&)"+e+"=([^&]*)(&|$)"),a=window.location.search.substr(1).match(t);return null!=a?unescape(a[2]):""},synchronizesLoadJs:function(e){var t=null;if(window.ActiveXObject)try{t=new ActiveXObject("Msxml2.XMLHTTP")}catch(e){t=new ActiveXObject("Microsoft.XMLHTTP")}else window.XMLHttpRequest&&(t=new XMLHttpRequest);if(t.open("GET",e,!1),t.send(null),4==t.readyState){if(t.status>=200&&t.status<300||0==t.status||304==t.status){var a=document.getElementsByTagName("HTML")[0],n=document.createElement("script");n.language="javascript",n.type="text/javascript";try{n.appendChild(document.createTextNode(t.responseText))}catch(e){n.text=t.responseText}return a.appendChild(n),!0}return!1}return!1},loadMsgJs:function(){"undefined"==typeof msg&&translate.util.synchronizesLoadJs("http://res.zvo.cn/msg/msg.js")},objSort:function(e){var t=Array.from(Object.keys(e));t.sort(function(e,t){return t.length-e.length});var a=new Array;for(var n of t)a[n]=e[n];return a}},request:{api:{host:"https://api.translate.zvo.cn/",language:"language.json",translate:"translate.json",ip:"ip.json"},post:function(e,t,a){this.send(e,t,a,"post",!0,{"content-type":"application/x-www-form-urlencoded"},null)},send:function(e,t,a,n,r,l,s){var o="";if(null!=t)for(var u in t)o.length>0&&(o+="&"),o=o+u+"="+t[u];var i=null;try{i=new XMLHttpRequest}catch(e){i=new ActiveXObject("Microsoft.XMLHTTP")}if(i.open(n,e,r),null!=l)for(var u in l)i.setRequestHeader(u,l[u]);i.send(o),i.onreadystatechange=function(){if(4==i.readyState)if(200==i.status){var r=null;try{r=JSON.parse(i.responseText)}catch(e){console.log(e)}a(null==r?i.responseText:r)}else console.log("------- translate.js service api response error --------"),console.log(" http code : "+i.status),console.log(" response : "+i.response),console.log(" request url : "+e),console.log(" request data : "+JSON.stringify(t)),console.log(" request method : "+n),console.log("---------------------- end ----------------------"),null!=s&&s(i)}},translateText:function(e,t){"string"==typeof e&&(e=[e]);var a=translate.request.api.host+translate.request.api.translate+"?v="+translate.version,n={from:translate.language.getLocal(),to:translate.language.getCurrent(),text:encodeURIComponent(JSON.stringify(e))};translate.request.post(a,n,function(a){0==a.result&&(console.log("=======ERROR START======="),console.log("from : "+a.from),console.log("to : "+a.to),console.log("translate text array : "+e),console.log("response : "+a.info),console.log("=======ERROR END =======")),t(a)})}},storage:{set:function(e,t){localStorage.setItem(e,t)},get:function(e){return localStorage.getItem(e)}},images:{queues:[],add:function(e){for(var t in e)translate.images.queues[t]=e[t]},execute:function(){if(!(Object.keys(translate.images.queues).length<1))for(var e=document.getElementsByTagName("img"),t=0;t<e.length;t++){var a=e[t];if(void 0!==a.src&&null!=a.src&&0!=a.src.length)for(var n in translate.images.queues){var r=n,l=translate.images.queues[n];r==a.src&&(a.src=l.replace(new RegExp("{language}","g"),translate.to))}}}},reset:function(){var e=translate.language.getCurrent();for(var t in translate.nodeQueue)for(var a in translate.nodeQueue[t].list)for(var n in translate.nodeQueue[t].list[a]){var r=translate.nodeQueue[t].list[a][n];for(var l in r.nodes){var s=translate.storage.get("hash_"+e+"_"+n);void 0!==s&&(null!=s&&0!=s.length&&translate.element.nodeAnalyse.analyse(r.nodes[l].node,s,r.original,r.nodes[l].node.attribute))}}translate.storage.set("to",""),translate.to=null,translate.selectLanguageTag.render()},selectionTranslate:{selectionX:0,selectionY:0,callTranslate:function(e){let t=window.getSelection();if(t.anchorOffset==t.focusOffset)return;let a=window.getSelection().toString();var n=translate.request.api.host+translate.request.api.translate+"?v="+translate.version,r={from:translate.language.getLocal(),to:translate.to,text:encodeURIComponent(JSON.stringify([a]))};translate.request.post(n,r,function(e){if(0==e.result)return;let t=document.querySelector("#translateTooltip");t.innerText=e.text[0],t.style.top=selectionY+20+"px",t.style.left=selectionX+50+"px",t.style.display=""})},start:function(){let e=document.createElement("span");e.innerText="",e.setAttribute("id","translateTooltip"),e.setAttribute("style","background-color:black;color:#fff;text-align:center;border-radius:6px;padding:5px;position:absolute;z-index:999;top:150%;left:50%; "),document.body.appendChild(e),document.addEventListener("mousedown",e=>{selectionX=e.pageX,selectionY=e.pageY},!1),document.addEventListener("mouseup",translate.selectionTranslate.callTranslate,!1),document.addEventListener("click",e=>{document.querySelector("#translateTooltip").style.display="none"},!1)}}},nodeuuid={index:function(e){var t,a=e.parentNode;if(null==a)return"";t=void 0===e.tagName?a.childNodes:a.querySelectorAll(e.tagName);var n=Array.prototype.indexOf.call(t,e);return e.nodeName+""+(n+1)},uuid:function(e){for(var t="",a=e;null!=a;){var n=nodeuuid.index(a);""!=n&&(""!=t&&(t="_"+t),t=n+t),a=a.parentNode}return t}};try{translate.init()}catch(e){console.log(e)} ================================================ FILE: assets/vendors/watermark/watermark.js ================================================ class Watermark { // 默认配置 static DEFAULTS = { type: 'text', // text/image container: 'body', // 作用区域选择器 content: 'Watermark', // 文字内容或图片URL width: 160, // 水印宽度 fontSize: 14, // 文字尺寸 color: '#000000', // 文字颜色 bgColor: '#FFFFFF80', // 文字背景色 position: 'center', // 位置: top-left, top-center... opacity: 0.5, // 透明度 0-1 margin: 20, // 边距(px) format: 'original', // jpg/png/webp/original quality: 0.92, // 图片质量 0-1 observeDOM: true, // 自动检测DOM变化 pjax: false, // Pjax兼容模式 onSuccess: null, // 成功回调 onError: null // 错误回调 }; constructor(options = {}) { this.config = { ...Watermark.DEFAULTS, ...options }; this.observer = null; this.init(); } // 初始化 init() { this.processExistingImages(); if (this.config.observeDOM) this.setupObserver(); if (this.config.pjax) this.setupPjax(); } // 处理现有图片 processExistingImages() { document.querySelectorAll(`${this.config.container} img:not([data-watermarked])`) .forEach(img => { if (this.isLazyImage(img)) return; this.applyWatermark(img); }); } // 创建观察者 setupObserver() { this.observer = new MutationObserver(mutations => { mutations.forEach(mutation => { if (mutation.type === 'childList') { this.processExistingImages(); } }); }); this.observer.observe(document.querySelector(this.config.container), { childList: true, subtree: true }); } // Pjax支持 setupPjax() { document.addEventListener('pjax:complete', () => { this.processExistingImages(); }); } // 应用水印 async applyWatermark(img) { try { // 跳过已处理图片 if (img.dataset.watermarked) return; img.dataset.watermarked = 'processing'; // 创建画布 const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); // 等待图片加载 await this.loadImage(img); // 设置画布尺寸 [canvas.width, canvas.height] = [img.naturalWidth, img.naturalHeight]; // 绘制原图 ctx.drawImage(img, 0, 0); // 应用水印 if (this.config.type === 'text') { this.applyTextWatermark(ctx); } else { await this.applyImageWatermark(ctx); } // 转换格式 const mimeType = this.getMimeType(img.src); const newSrc = canvas.toDataURL(mimeType, this.config.quality); // 更新图片 img.src = newSrc; img.dataset.watermarked = 'true'; // 回调 this.config.onSuccess?.(img); } catch (error) { this.handleError(error, img); } } // 应用文字水印 applyTextWatermark(ctx) { ctx.save(); ctx.globalAlpha = this.config.opacity; // 计算位置 const { x, y } = this.calculatePosition(ctx); // 绘制背景 ctx.fillStyle = this.config.bgColor; const textMetrics = ctx.measureText(this.config.content); ctx.fillRect( x - 5, y - parseInt(this.config.fontSize) - 2, textMetrics.width + 10, parseInt(this.config.fontSize) + 4 ); // 绘制文字 ctx.fillStyle = this.config.color; ctx.font = `${this.config.fontSize}px Arial`; ctx.fillText(this.config.content, x, y); ctx.restore(); } // 应用图片水印 async applyImageWatermark(ctx) { const watermarkImg = await this.loadImage(this.config.content); // 计算缩放比例 const scale = Math.min( this.config.width / watermarkImg.width, this.config.width / watermarkImg.height ); // 计算位置 const { x, y } = this.calculatePosition(ctx, watermarkImg.width * scale, watermarkImg.height * scale ); // 绘制水印 ctx.save(); ctx.globalAlpha = this.config.opacity; ctx.drawImage( watermarkImg, x, y, watermarkImg.width * scale, watermarkImg.height * scale ); ctx.restore(); } // 计算水印位置 calculatePosition(ctx, wmWidth = 0, wmHeight = 0) { const { width: imgWidth, height: imgHeight } = ctx.canvas; const margin = this.config.margin; const positions = { 'top-left': [margin, margin], 'top-center': [(imgWidth - wmWidth)/2, margin], 'top-right': [imgWidth - wmWidth - margin, margin], 'center-left': [margin, (imgHeight - wmHeight)/2], 'center': [(imgWidth - wmWidth)/2, (imgHeight - wmHeight)/2], 'center-right': [imgWidth - wmWidth - margin, (imgHeight - wmHeight)/2], 'bottom-left': [margin, imgHeight - wmHeight - margin], 'bottom-center': [(imgWidth - wmWidth)/2, imgHeight - wmHeight - margin], 'bottom-right': [imgWidth - wmWidth - margin, imgHeight - wmHeight - margin] }; return { x: positions[this.config.position][0], y: positions[this.config.position][1] + (this.config.type === 'text' ? 0 : wmHeight) }; } // 辅助方法 getMimeType(originalSrc) { if (this.config.format !== 'original') { return `image/${this.config.format}`; } return originalSrc.match(/data:([^;]+);/)?.[1] || 'image/png'; } loadImage(img) { return new Promise((resolve, reject) => { if (img.complete && img.naturalWidth !== 0) { resolve(img); return; } img.onload = () => resolve(img); img.onerror = (e) => reject(new Error('图片加载失败')); }); } isLazyImage(img) { return img.loading === 'lazy' || img.getAttribute('loading') === 'lazy' || img.dataset.lazy; } handleError(error, img) { console.error('水印处理失败:', error); img.dataset.watermarked = 'error'; this.config.onError?.(error, img); } // 销毁实例 destroy() { this.observer?.disconnect(); document.removeEventListener('pjax:complete', this.processExistingImages); } } ================================================ FILE: comments.php ================================================ <?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; $parameter= array( 'parentId' => $this->hidden ? 0 : $this->cid, 'parentContent' => $this->row, 'respondId' => $this->respondId, 'commentPage' => $this->request->filter('int')->commentPage, 'allowComment' => $this->allow('comment') ); $this->widget('Bearsimple_Widget_Comments_Archive',$parameter)->to($comments); ?> <div class="comment-card"> <h3 class="ui header"> <i class="comment alternate outline icon"></i>评论区(<?php $this->commentsNum(_t('暂无评论'), _t('1条评论'), _t('%d条评论')); ?>) </h3> <div id="comments-con"> <div id="comments"> <?php if(Bsoptions('CommentDesc')== true):?> <div id="bscommen"> <?php if ($comments->have()): ?> <?php ob_start(); $comments->listComments(); $comments_content = ob_get_contents(); ob_end_clean(); $comments_content = preg_replace("/<ol class=\"comment-list\">/sm", '', $comments_content); $comments_content = preg_replace("/<\/ol>/sm", '', $comments_content); echo $comments_content; ?> <?php ob_start(); $comments->pageNav('«','»', 1, ''); $content = ob_get_contents(); ob_end_clean(); if(Bsoptions('pagination_style')== '2'){ $content = preg_replace("/<ol class=\"(.*?)\">/sm", '<nav class="page-navigator">', $content); $content = preg_replace("/<li><span>(.*?)<\/span><\/li>/sm", '<span class="page-number">...</span>', $content); $content = preg_replace("/<li class=\"current\"><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="page-number current" href="$1">$2</a>', $content); $content = preg_replace("/<li><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="page-number" href="$1">$2</a>', $content); $content = preg_replace("/<li [class=\"prev\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="extend prev" href="$1"><i class="arrow left icon"></i>上一页</a>', $content); $content = preg_replace("/<li [class=\"next\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="extend next" href="$1"><i class="arrow right icon"></i>下一页</a>', $content); //适配旧版本 $content = preg_replace("/<li class=\"current\"><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="page-number current" href="$1">$2</a>', $content); $content = preg_replace("/<li><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="page-number" href="$1">$2</a>', $content); $content = preg_replace("/<li [class=\"prev\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="extend prev" href="$1"><i class="arrow left icon"></i>上一页</a>', $content); $content = preg_replace("/<li [class=\"next\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="extend next" href="$1"><i class="arrow right icon"></i>下一页</a>', $content); ///---> $content = preg_replace("/<\/ol>/sm", '</nav>', $content); } if(empty(Bsoptions('pagination_style ')) || Bsoptions('pagination_style') == '1'){ $content = preg_replace("/<ol class=\"(.*?)\">/sm", '<div class="ui labels" style="margin-top:30px"><div style="text-align:center">', $content); $content = preg_replace("/<li><span>(.*?)<\/span><\/li>/sm", '<a class="ui large label">...</a>', $content); $content = preg_replace("/<li class=\"current\"><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="ui black large label" href="$1">$2</a>', $content); $content = preg_replace("/<li><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="ui large label" href="$1">$2</a>', $content); $content = preg_replace("/<li [class=\"prev\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="ui large label" href="$1">上一页</a>', $content); $content = preg_replace("/<li [class=\"next\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="ui large label" style="margin-top:5px" href="$1">下一页</a>', $content); //旧版本兼容 $content = preg_replace("/<li class=\"current\"><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="ui black large label" href="$1">$2</a>', $content); $content = preg_replace("/<li><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="ui large label" href="$1">$2</a>', $content); $content = preg_replace("/<li [class=\"prev\"]+><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="ui large label" href="$1">上一页</a>', $content); $content = preg_replace("/<li [class=\"next\"]+><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="ui large label" style="margin-top:5px" href="$1">下一页</a>', $content); $content = preg_replace("/<\/ol>/sm", '</div></div>', $content); } echo $content; ?> <?php endif; ?> </div> <?php endif; ?> <?php if ($this->allow('comment') && Bsoptions('CommentClose') == true): ?> <div id="<?php $this->respondId(); ?>" class="respond"> <?php $comments->cancelReply(); ?> <h3 id="response"><?php _e('我要评论'); ?><?php if(Bsoptions('Comment_tips') == true || Bsoptions('Comment_tips') == ''):?><span class="bstooltip bstooltip--right bstooltips--right" data-bstooltip="<?php if(Bsoptions('Comment_tips_text') == ''):?>本博客使用Cookie技术保留您的个人信息以方便您能够在下一次快速评论,继续评论表示您已同意该条款<?php else:?><?php echo Bsoptions('Comment_tips_text'); ?><?php endif; ?>"><i class="question circle outline icon"></i></span><?php endif; ?></h3> <form method="post" action="<?php editurl($this->commentUrl) ?>" id="commentform" role="form" class="ui form"> <div id="forminput"> <!-- 已登录 --> <?php if(Bsoptions('Comment_islogin') == true || Bsoptions('Comment_islogin') == ''):?> <div id="loginshowlabel" style="display:none"> <div class="ui image label"> <img src="<?php echo imgravatarq($this->user->mail); ?>"> <name id="authorname"></name> </div> </div> <?php endif; ?> <!-- 未登录 --> <div class="<?php if(Helper::options()->commentsRequireURL == true || Bsoptions('Comment_showmail') == true):?>three<?php else: ?>two<?php endif; ?> fields" id="nologinshow" style="display:none"> <div class="field"> <label class="required">您的昵称</label> <div class="ui icon input"> <input type="text" name="author" id="author" placeholder="填写您的昵称" required> <i id="randname" class="circular dice link icon"></i> </div> </div> <?php if(Helper::options()->commentsRequireMail == true || Bsoptions('Comment_showmail') == false):?> <div class="field"> <label <?php if(Helper::options()->commentsRequireMail == true):?>class="required"<?php endif; ?>>您的邮箱</label> <input type="email" name="mail" id="mail" placeholder="填写您的电邮地址" <?php if(Helper::options()->commentsRequireMail == true):?>required<?php endif; ?>> </div> <?php endif; ?> <?php if(Helper::options()->commentsRequireMail == false && Bsoptions('Comment_showmail') == true):?> <div class="field" style="display:none;"> <label class="required">您的邮箱</label> <input type="email" name="mail" id="mail" placeholder="填写您的电邮地址" disabled=""> </div> <?php endif; ?> <?php if(Helper::options()->commentsRequireURL == true || Bsoptions('Comment_showurl') == false):?> <div class="field"> <label <?php if(Helper::options()->commentsRequireURL == true):?>class="required"<?php endif; ?>>您的博客网址</label> <input type="text" name="url" id="url" placeholder="填写您的博客网站网址" <?php if(Helper::options()->commentsRequireURL == true):?>required<?php endif; ?>> </div> <?php endif; ?> <?php if(Helper::options()->commentsRequireURL == false && Bsoptions('Comment_showurl') == true):?> <div class="field" style="display:none;"> <label <?php if(Helper::options()->commentsRequireURL == true):?>class="required"<?php endif; ?>>您的博客网址</label> <input type="text" name="url" id="url" placeholder="填写您的博客网站网址" <?php if(Helper::options()->commentsRequireURL == true):?>required<?php endif; ?>> </div> <?php endif; ?> </div> <!-- end --> <div class="field"> <label class="required">评论内容</label> <?php if(Bsoptions('Comment_private') == true):?> <div class="ui slider checkbox" style="margin:5px 0 7px 0"> <input type="checkbox" name="privatecomment" id="privatecomment"> <label>私密评论</label> </div> <?php endif; ?> <textarea name="text" id="textarea" <?php if(Bsoptions('Emoji') == true) :?>class="emotion"<?php endif; ?> placeholder="<?php if(Bsoptions('Comment_placeholder') == '') :?>嘿~ 大神,别默默的看了,快来点评一下吧<?php else:?><?php echo Bsoptions('Comment_placeholder'); ?><?php endif; ?>"><?php $this->remember('text'); ?></textarea> </div> <?php if(Bsoptions('Emoji') == true) :?> <div class="circular ui icon button" id="face"> <i class="smile beam outline icon"></i> </div> <div class="ignore emoemo" style="margin-top:-7px;margin-bottom:6px" translate="no"></div> <?php endif; ?> <?php if(Bsoptions('CommentNotify__Open') == true) :?> <div class="ui checkbox" style="margin:-7px 0 5px 0"> <input type="checkbox" name="accept"> <label>不接收来自本博客的回复邮件</label> </div> <?php endif; ?> <?php switch(Bsoptions('VerifyChoose')) :?> <?php case '1' :?> <?php \BsCore\Plugin::spam_protection_mathjia();?> </div> <button type="button" id="commentsubmit" class="ui button" style="float:left;"> 提交评论 </button> <?php break; ?> <?php case '11' :?> <?php \BsCore\Plugin::spam_protection_mathjian();?> </div> <button type="button" id="commentsubmit" class="ui button" style="float:left;"> 提交评论 </button> <?php break; ?> <?php case '22-2' :?> <?php \BsCore\Plugin::spam_protection_question();?> </div> <button type="button" id="commentsubmit" class="ui button" style="float:left;"> 提交评论 </button> <?php break; ?> <?php case '2' :?> </div> <?php $this->need('modules/Verify/BearCaptcha/Vaptcha/Vaptcha.php'); ?> <button type="button" id="commentsubmit" class="ui button" style="float:left;margin-top:5px" disabled=""> 提交评论 </button> <?php break; ?> <?php case '2-1' :?> </div> <?php $this->need('modules/Verify/BearCaptcha/Dingxiang/DX_Captcha.php'); ?> <button type="button" id="commentsubmit" class="ui button" style="float:left;margin-top:5px" disabled=""> 提交评论 </button> <?php break; ?> <?php case '2-2' :?> </div> <?php $this->need('modules/Verify/BearCaptcha/Turnstile/Turnstile.php'); ?> <button type="button" id="commentsubmit" class="ui button" style="float:left;margin-top:5px" disabled=""> 提交评论 </button> <?php break; ?> <?php case '2-3' :?> </div> <?php $this->need('modules/Verify/BearCaptcha/Geetest/Geetest.php'); ?> <button type="button" id="commentsubmit" class="ui button" style="float:left;margin-top:5px" disabled=""> 提交评论 </button> <?php break; ?> <?php case '22' :?> </div> <p> <span class="ui button" id="bsverify" onclick="verify();" style="float:left;" disabled><i class="cloudversify icon"></i><?php if(empty(Bsoptions('Verify22_Buttontext'))){echo '人机验证';}else{ echo Bsoptions('Verify22_Buttontext');} ?></span> <button type="button" id="commentsubmit" class="ui button" style="float:left;" disabled=""> 提交评论 </button> </p> <?php $this->need('modules/Verify/BearCaptcha/Captcha/Captcha.php'); ?> <?php break; ?> <?php case '3' || '' :?> </div><p> <button type="button" id="commentsubmit" class="ui button" style="float:left;"> 提交评论 </button> </p> <?php break; ?> <?php endswitch; ?> </form> <div style="height:30px"></div> </div> <?php if($this->commentsNum == 0) :?> <h3 class="ui icon header" style="display: grid;place-items: center;" id="nocomment"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="174" viewBox="0 0 480 456"><defs><linearGradient id="a" x1="1.128" y1="0.988" x2="0.364" y2="1" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#e0e5ef" stop-opacity="0"/><stop offset="1" stop-color="#e0e5ef"/></linearGradient><linearGradient id="c" x1="-0.566" y1="0.5" x2="0.944" y2="0.771" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#fff" stop-opacity="0"/><stop offset="1" stop-color="#909aa9"/></linearGradient><linearGradient id="d" x1="-0.392" y1="1.114" x2="0.5" y2="0.396" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#fff" stop-opacity="0"/><stop offset="1" stop-color="#ebedf5"/></linearGradient><linearGradient id="e" x1="-0.906" y1="1.646" x2="0.636" y2="0.061" xlink:href="#d"/><linearGradient id="f" x1="-0.109" y1="1.931" x2="0.736" y2="0.141" xlink:href="#d"/></defs><g transform="translate(0 -24)"><circle cx="184" cy="184" r="184" transform="translate(56 68)" fill="#f3f3fa"/><path d="M2920,292h0c-6.075,0-11-26.535-11-59.269s4.925-59.269,11-59.269c.026,0,8.121.387,12.89-6.2s6.188-11.924,6.188-20.142c0-28.2,10.094-48.237,19.422-52.117,2.688-.567,6.875.673,11-3.584s5.5-7.715,5.5-13.445C2975,47.061,2983.619,22,2994.25,22s19.25,25.062,19.25,55.976c0,5.73-.458,8.5,3.667,12.759s10.148,3.7,12.834,4.27c9.329,3.881,16.5,27.21,16.5,55.409a98.941,98.941,0,0,0,1.6,16.464s3.083,9.748,7.563,4.527,6.277-12.253,7.047-18.827c2.189-18.691,6.894-31.8,11.287-31.8,4.482,0,8.337,13.637,10.069,33.393.51,5.816,1.514,9.666,4.483,14.489s7.393,4.8,7.393,4.8H3096c4.46,0,8.3,13.507,10.049,33.18.346,3.889.676,6.259,3.643,9.489s8.227,3.429,8.227,3.429h.08c1.485,0,2.926,1.48,4.282,4.4a54.782,54.782,0,0,1,3.5,12c2.078,10.573,3.222,24.63,3.222,39.581,0,5.612-.163,11.151-.483,16.463H2920Zm208.516,0h0Z" transform="translate(-2852.515 76.334)" fill="url(#a)"/><path d="M117,208H.7c-.466-6.453-.7-13.181-.7-20,0-18.163,1.664-35.24,4.686-48.083a58.6,58.6,0,0,1,5.086-14.573C11.745,121.8,13.84,120,16,120l.116,0s7.651-.242,11.967-4.166,4.8-6.8,5.3-11.527C35.927,80.408,41.513,64,48,64a16.6,16.6,0,0,0,3.3-1.014A6.153,6.153,0,0,0,53.365,61.5c6.515-6.342,9.13-14.884,10.25-22.871C66.8,15.924,73.642,0,80.032,0,86.55,0,92.158,16.566,94.676,40.567c.742,7.065,2.2,11.742,6.521,17.6A14.3,14.3,0,0,0,111.951,64h.081c6.487,0,12.073,16.409,14.617,40.307.5,4.725.983,7.6,5.3,11.527S143.915,120,143.915,120l.116,0c2.16,0,4.255,1.8,6.228,5.344a58.6,58.6,0,0,1,5.086,14.573c3.022,12.844,4.686,29.921,4.686,48.083,0,6.818-.237,13.546-.7,20H117Zm42.328,0h0ZM.7,208h0Z" transform="translate(215.969 164)" fill="url(#a)"/><g transform="translate(-1760 63.19)" opacity="0.65"><path d="M395.676,66.185h5.813A37.112,37.112,0,0,0,400.805,72c0,2.394.257,8.064.627,10.772h-5.813a94.459,94.459,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,66.185Zm0,18.209h5.813a37.111,37.111,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.463,94.463,0,0,0,.741-10.9A52.723,52.723,0,0,0,395.676,84.394Zm0,18.124h5.813a37.113,37.113,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.464,94.464,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,102.518Zm-8.207,0h5.813a37.108,37.108,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.488,94.488,0,0,0,.741-10.9,52.739,52.739,0,0,0-.684-5.685ZM387.3,88.982h5.984a19.589,19.589,0,0,0-.684,4.175,50.871,50.871,0,0,0,.57,7.708h-5.642a74.975,74.975,0,0,0,.456-7.922A25.3,25.3,0,0,0,387.3,88.982Zm22.911,7.181s.741-4.56,4.046-6.383,6.9-4.047,6.9-4.047a14.183,14.183,0,0,1-4.616,7.808C412.489,97.189,410.209,96.163,410.209,96.163Zm-4.046,3.021a12.006,12.006,0,0,1,4.616-.855c1.881.228,7.181,2.451,7.694,2.679,0,0-4.731,2.337-9.176.684s-3.134-2.508-3.134-2.508Zm1.083-13.108s-1.539,6.155-1.71,7.637a5.9,5.9,0,0,0,1.881,4.274s2.28-1.2,1.938-4.73a17.507,17.507,0,0,0-2.109-7.181Z" transform="translate(1450.818 65.815)" fill="#909aa9"/><path d="M395.676,66.185h5.813A37.112,37.112,0,0,0,400.805,72c0,2.394.257,8.064.627,10.772h-5.813a94.459,94.459,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,66.185Zm0,18.209h5.813a37.111,37.111,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.463,94.463,0,0,0,.741-10.9A52.723,52.723,0,0,0,395.676,84.394Zm0,18.124h5.813a37.113,37.113,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.464,94.464,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,102.518Zm-8.207,0h5.813a37.108,37.108,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.488,94.488,0,0,0,.741-10.9,52.739,52.739,0,0,0-.684-5.685ZM387.3,88.982h5.984a19.589,19.589,0,0,0-.684,4.175,50.871,50.871,0,0,0,.57,7.708h-5.642a74.975,74.975,0,0,0,.456-7.922A25.3,25.3,0,0,0,387.3,88.982Zm22.911,7.181s.741-4.56,4.046-6.383,6.9-4.047,6.9-4.047a14.183,14.183,0,0,1-4.616,7.808C412.489,97.189,410.209,96.163,410.209,96.163Zm-4.046,3.021a12.006,12.006,0,0,1,4.616-.855c1.881.228,7.181,2.451,7.694,2.679,0,0-4.731,2.337-9.176.684s-3.134-2.508-3.134-2.508Zm1.083-13.108s-1.539,6.155-1.71,7.637a5.9,5.9,0,0,0,1.881,4.274s2.28-1.2,1.938-4.73a17.507,17.507,0,0,0-2.109-7.181Z" transform="translate(1450.818 120.319)" fill="#909aa9"/><path d="M395.676,66.185h5.813A37.112,37.112,0,0,0,400.805,72c0,2.394.257,8.064.627,10.772h-5.813a94.459,94.459,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,66.185Zm0,18.209h5.813a37.111,37.111,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.463,94.463,0,0,0,.741-10.9A52.723,52.723,0,0,0,395.676,84.394Zm0,18.124h5.813a37.113,37.113,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.464,94.464,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,102.518Zm-8.207,0h5.813a37.108,37.108,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.488,94.488,0,0,0,.741-10.9,52.739,52.739,0,0,0-.684-5.685ZM387.3,88.982h5.984a19.589,19.589,0,0,0-.684,4.175,50.871,50.871,0,0,0,.57,7.708h-5.642a74.975,74.975,0,0,0,.456-7.922A25.3,25.3,0,0,0,387.3,88.982Zm22.911,7.181s.741-4.56,4.046-6.383,6.9-4.047,6.9-4.047a14.183,14.183,0,0,1-4.616,7.808C412.489,97.189,410.209,96.163,410.209,96.163Zm-4.046,3.021a12.006,12.006,0,0,1,4.616-.855c1.881.228,7.181,2.451,7.694,2.679,0,0-4.731,2.337-9.176.684s-3.134-2.508-3.134-2.508Zm1.083-13.108s-1.539,6.155-1.71,7.637a5.9,5.9,0,0,0,1.881,4.274s2.28-1.2,1.938-4.73a17.507,17.507,0,0,0-2.109-7.181Z" transform="translate(1450.818 174.466)" fill="#909aa9"/><path d="M226.243,103.946l9.539-6.2.442.314-9.6,6.355ZM211.87,79.175s-.548-4.587-3.774-6.548-6.72-4.333-6.72-4.333a14.183,14.183,0,0,0,4.284,8c3.889,3.815,6.21,2.886,6.21,2.886Zm3.916,3.188a12.009,12.009,0,0,0-4.576-1.049c-1.889.149-7.278,2.146-7.8,2.352,0,0,4.628,2.534,9.139,1.07S215.785,82.364,215.785,82.364Zm-.53-13.142s1.278,6.215,1.387,7.7a5.9,5.9,0,0,1-2.059,4.191s-2.227-1.292-1.737-4.808A17.51,17.51,0,0,1,215.255,69.221Z" transform="translate(1625.701 63.831)" fill="#909aa9"/><path d="M93.583,251.743l-10.121-7.215-.454.295,10.215,7.326ZM75.949,265.767s-1.211-3.774-4.25-4.9-6.369-2.552-6.369-2.552a12.171,12.171,0,0,0,4.915,6.036c3.9,2.578,5.7,1.416,5.7,1.416Zm3.82,2.046a10.307,10.307,0,0,0-4.027-.136,41.677,41.677,0,0,0-6.187,3.256s4.313,1.378,7.874-.592S79.768,267.813,79.768,267.813Zm-2.594-10.985s2.092,5.027,2.427,6.262a5.062,5.062,0,0,1-1.05,3.867s-2.087-.724-2.249-3.767a15.026,15.026,0,0,1,.872-6.363Z" transform="translate(1753.67 -101.939)" fill="#758095"/><path d="M241.2,601.955l-9.705-4.424-.335.323,9.8,4.5Z" transform="translate(1597.682 -433.984)" fill="#909aa9"/><path d="M527.5,66.185h5.813a58.721,58.721,0,0,0-.684,7.347c0,3.025.257,10.192.627,13.613h-5.813s.8-7.784.741-13.775C528.166,71.074,527.5,66.185,527.5,66.185Z" transform="translate(1310.678 120.319)" fill="#909aa9"/><path d="M527.5,66.185h5.813a58.721,58.721,0,0,0-.684,7.347c0,3.025.257,10.192.627,13.613h-5.813s.8-7.784.741-13.775C528.166,71.074,527.5,66.185,527.5,66.185Z" transform="translate(1310.678 174.704)" fill="#909aa9"/></g><g transform="translate(44.8 -59.145) rotate(9)"><path d="M1.5,0c.828,0,6.214,4.6,6.214,5.429S2.328,3,1.5,3a1.5,1.5,0,0,1,0-3Z" transform="matrix(0.914, 0.407, -0.407, 0.914, 329.465, 183.672)" fill="#909aa9"/><path d="M.924,0c.511,0,3.83,2.835,3.83,3.345s-3.319-1.5-3.83-1.5A.924.924,0,0,1,.924,0Z" transform="translate(327.543 190.966) rotate(-21)" fill="#909aa9"/><path d="M-2600.714,1269s36.715,15.428,34.429-1.857-26.714,7.714,7.857,17" transform="translate(2955 -1062)" fill="none" stroke="#909aa9" stroke-width="1" stroke-dasharray="4"/><ellipse cx="0.5" cy="1.5" rx="0.5" ry="1.5" transform="translate(334 200)" fill="#909aa9"/><ellipse cx="0.5" cy="1.5" rx="0.5" ry="1.5" transform="translate(346 205)" fill="#909aa9"/><ellipse cx="12" cy="8" rx="12" ry="8" transform="matrix(0.966, 0.259, -0.259, 0.966, 334.781, 187.285)" fill="#fff"/><path d="M2916.12-980.2a9.513,9.513,0,0,0,4.88-8.3,9.516,9.516,0,0,0-1.169-4.571,14.933,14.933,0,0,1,2.072-.141,17.071,17.071,0,0,1,3.713.417A9.466,9.466,0,0,1,2928-986.5a9.5,9.5,0,0,1-6.683,9.075A16.172,16.172,0,0,1,2916.12-980.2Z" transform="translate(-2580 1183)" fill="#909aa9"/><path d="M2924.351-979.013v0A9.448,9.448,0,0,0,2928-986.5a9.479,9.479,0,0,0-1.407-4.978,12.326,12.326,0,0,1,1.369,1.328c1.8,2.045,2.483,4.309,1.931,6.374a6.307,6.307,0,0,1-3.21,3.83A10.408,10.408,0,0,1,2924.351-979.013Z" transform="translate(-2574 1185)" fill="#909aa9"/><ellipse cx="4" cy="6" rx="4" ry="6" transform="translate(338 180)" fill="#ebedf5"/><ellipse cx="5.5" cy="8" rx="5.5" ry="8" transform="translate(350.254 178.598) rotate(51)" fill="#ced1d5"/><ellipse cx="0.5" cy="1.5" rx="0.5" ry="1.5" transform="translate(349 202)" fill="#909aa9"/><ellipse cx="0.5" cy="1.5" rx="0.5" ry="1.5" transform="translate(340 200)" fill="#dae8e6"/></g><g transform="translate(322 263.987)" opacity="0.45"><path d="M387.469,102.518h5.813a37.108,37.108,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.488,94.488,0,0,0,.741-10.9,52.739,52.739,0,0,0-.684-5.685ZM387.3,88.982h5.984a19.589,19.589,0,0,0-.684,4.175,50.871,50.871,0,0,0,.57,7.708h-5.642a74.975,74.975,0,0,0,.456-7.922A25.3,25.3,0,0,0,387.3,88.982Z" transform="translate(-368.182 -88.982)" fill="#909aa9"/><path d="M395.676,66.185h5.813A37.112,37.112,0,0,0,400.805,72c0,2.394.257,8.064.627,10.772h-5.813a94.459,94.459,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,66.185Zm0,18.209h5.813a37.111,37.111,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.463,94.463,0,0,0,.741-10.9A52.723,52.723,0,0,0,395.676,84.394Zm0,18.124h5.813a37.113,37.113,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.464,94.464,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,102.518Zm-8.207,0h5.813a37.108,37.108,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.488,94.488,0,0,0,.741-10.9,52.739,52.739,0,0,0-.684-5.685ZM387.3,88.982h5.984a19.589,19.589,0,0,0-.684,4.175,50.871,50.871,0,0,0,.57,7.708h-5.642a74.975,74.975,0,0,0,.456-7.922A25.3,25.3,0,0,0,387.3,88.982Z" transform="translate(-368.182 -34.479)" fill="#909aa9"/><path d="M75.949,265.767s-1.211-3.774-4.25-4.9-6.369-2.552-6.369-2.552a12.171,12.171,0,0,0,4.915,6.036c3.9,2.578,5.7,1.416,5.7,1.416Zm3.82,2.046a10.307,10.307,0,0,0-4.027-.136,41.678,41.678,0,0,0-6.187,3.256s4.313,1.378,7.874-.592S79.768,267.813,79.768,267.813Zm-2.594-10.985s2.092,5.027,2.427,6.262a5.062,5.062,0,0,1-1.05,3.867s-2.087-.724-2.249-3.767a15.026,15.026,0,0,1,.872-6.363Z" transform="translate(-65.33 -256.737)" fill="#758095"/><path d="M527.5,66.185h5.813a58.721,58.721,0,0,0-.684,7.347c0,3.025.257,10.192.627,13.613h-5.813s.8-7.784.741-13.775C528.166,71.074,527.5,66.185,527.5,66.185Z" transform="translate(-508.322 -34.479)" fill="#909aa9"/><path d="M241.2,601.955l-9.705-4.424-.335.323,9.8,4.5Z" transform="translate(-221.318 -588.781)" fill="#909aa9"/></g><g transform="translate(185 234.987)" opacity="0.65"><path d="M393.111,102.518H387.3a37.108,37.108,0,0,1,.684,5.813c0,2.394-.257,8.064-.627,10.772h5.813a94.488,94.488,0,0,1-.741-10.9,52.739,52.739,0,0,1,.684-5.685Zm.171-13.536H387.3a19.589,19.589,0,0,1,.684,4.175,50.871,50.871,0,0,1-.57,7.708h5.642a74.975,74.975,0,0,1-.456-7.922A25.3,25.3,0,0,1,393.282,88.982Z" transform="translate(-379.091 -88.982)" fill="#909aa9"/><path d="M393.111,66.185H387.3A37.112,37.112,0,0,1,387.982,72c0,2.394-.257,8.064-.627,10.772h5.813a94.459,94.459,0,0,1-.741-10.9A52.725,52.725,0,0,1,393.111,66.185Zm0,18.209H387.3a37.111,37.111,0,0,1,.684,5.813c0,2.394-.257,8.064-.627,10.772h5.813a94.463,94.463,0,0,1-.741-10.9A52.723,52.723,0,0,1,393.111,84.394Zm0,18.124H387.3a37.113,37.113,0,0,1,.684,5.813c0,2.394-.257,8.064-.627,10.772h5.813a94.464,94.464,0,0,1-.741-10.9A52.725,52.725,0,0,1,393.111,102.518Zm8.207,0H395.5a37.108,37.108,0,0,1,.684,5.813c0,2.394-.257,8.064-.627,10.772h5.813a94.488,94.488,0,0,1-.741-10.9,52.739,52.739,0,0,1,.684-5.685Zm.171-13.536H395.5a19.589,19.589,0,0,1,.684,4.175,50.871,50.871,0,0,1-.57,7.708h5.642a74.975,74.975,0,0,1-.456-7.922A25.3,25.3,0,0,1,401.489,88.982Z" transform="translate(-387.298 -34.479)" fill="#909aa9"/><path d="M69.352,265.767s1.211-3.774,4.25-4.9,6.369-2.552,6.369-2.552a12.171,12.171,0,0,1-4.915,6.036c-3.9,2.578-5.7,1.416-5.7,1.416Zm-3.82,2.046a10.307,10.307,0,0,1,4.027-.136,41.677,41.677,0,0,1,6.187,3.256s-4.313,1.378-7.874-.592S65.532,267.813,65.532,267.813Zm2.594-10.985s-2.092,5.027-2.427,6.262a5.062,5.062,0,0,0,1.05,3.867s2.087-.724,2.249-3.767a15.026,15.026,0,0,0-.872-6.363Z" transform="translate(-46.663 -256.737)" fill="#758095"/><path d="M231.164,601.955l9.705-4.424.335.323-9.8,4.5Z" transform="translate(-217.742 -588.781)" fill="#909aa9"/><path d="M393.111,66.185H387.3A37.112,37.112,0,0,1,387.982,72c0,2.394-.257,8.064-.627,10.772h5.813a94.459,94.459,0,0,1-.741-10.9A52.725,52.725,0,0,1,393.111,66.185Zm0,18.209H387.3a37.111,37.111,0,0,1,.684,5.813c0,2.394-.257,8.064-.627,10.772h5.813a94.463,94.463,0,0,1-.741-10.9A52.723,52.723,0,0,1,393.111,84.394Zm0,18.124H387.3a37.113,37.113,0,0,1,.684,5.813c0,2.394-.257,8.064-.627,10.772h5.813a94.464,94.464,0,0,1-.741-10.9A52.725,52.725,0,0,1,393.111,102.518Zm8.207,0H395.5a37.108,37.108,0,0,1,.684,5.813c0,2.394-.257,8.064-.627,10.772h5.813a94.488,94.488,0,0,1-.741-10.9,52.739,52.739,0,0,1,.684-5.685Zm.171-13.536H395.5a19.589,19.589,0,0,1,.684,4.175,50.871,50.871,0,0,1-.57,7.708h5.642a74.975,74.975,0,0,1-.456-7.922A25.3,25.3,0,0,1,401.489,88.982Z" transform="translate(-387.298 19.669)" fill="#909aa9"/><path d="M533.26,66.185h-5.813a58.721,58.721,0,0,1,.684,7.347c0,3.025-.257,10.192-.627,13.613h5.813s-.8-7.784-.741-13.775C532.6,71.074,533.26,66.185,533.26,66.185Z" transform="translate(-519.135 -34.479)" fill="#909aa9"/><path d="M533.26,66.185h-5.813a58.721,58.721,0,0,1,.684,7.347c0,3.025-.257,10.192-.627,13.613h5.813s-.8-7.784-.741-13.775C532.6,71.074,533.26,66.185,533.26,66.185Z" transform="translate(-519.135 19.907)" fill="#909aa9"/></g><g transform="translate(2998 -1388)"><path d="M395.676,66.185h5.813A37.112,37.112,0,0,0,400.805,72c0,2.394.257,8.064.627,10.772h-5.813a94.459,94.459,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,66.185Zm0,18.209h5.813a37.111,37.111,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.463,94.463,0,0,0,.741-10.9A52.723,52.723,0,0,0,395.676,84.394Zm0,18.124h5.813a37.113,37.113,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.464,94.464,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,102.518Zm-8.207,0h5.813a37.108,37.108,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.488,94.488,0,0,0,.741-10.9,52.739,52.739,0,0,0-.684-5.685ZM387.3,88.982h5.984a19.589,19.589,0,0,0-.684,4.175,50.871,50.871,0,0,0,.57,7.708h-5.642a74.975,74.975,0,0,0,.456-7.922A25.3,25.3,0,0,0,387.3,88.982Zm22.911,7.181s.741-4.56,4.046-6.383,6.9-4.047,6.9-4.047a14.183,14.183,0,0,1-4.616,7.808C412.489,97.189,410.209,96.163,410.209,96.163Zm-4.046,3.021a12.006,12.006,0,0,1,4.616-.855c1.881.228,7.181,2.451,7.694,2.679,0,0-4.731,2.337-9.176.684s-3.134-2.508-3.134-2.508Zm1.083-13.108s-1.539,6.155-1.71,7.637a5.9,5.9,0,0,0,1.881,4.274s2.28-1.2,1.938-4.73a17.507,17.507,0,0,0-2.109-7.181Z" transform="translate(-3225.182 1457.005)" fill="#909aa9"/><path d="M395.676,66.185h5.813A37.112,37.112,0,0,0,400.805,72c0,2.394.257,8.064.627,10.772h-5.813a94.459,94.459,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,66.185Zm0,18.209h5.813a37.111,37.111,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.463,94.463,0,0,0,.741-10.9A52.723,52.723,0,0,0,395.676,84.394Zm0,18.124h5.813a37.113,37.113,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.464,94.464,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,102.518Zm-8.207,0h5.813a37.108,37.108,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.488,94.488,0,0,0,.741-10.9,52.739,52.739,0,0,0-.684-5.685ZM387.3,88.982h5.984a19.589,19.589,0,0,0-.684,4.175,50.871,50.871,0,0,0,.57,7.708h-5.642a74.975,74.975,0,0,0,.456-7.922A25.3,25.3,0,0,0,387.3,88.982Zm22.911,7.181s.741-4.56,4.046-6.383,6.9-4.047,6.9-4.047a14.183,14.183,0,0,1-4.616,7.808C412.489,97.189,410.209,96.163,410.209,96.163Zm-4.046,3.021a12.006,12.006,0,0,1,4.616-.855c1.881.228,7.181,2.451,7.694,2.679,0,0-4.731,2.337-9.176.684s-3.134-2.508-3.134-2.508Zm1.083-13.108s-1.539,6.155-1.71,7.637a5.9,5.9,0,0,0,1.881,4.274s2.28-1.2,1.938-4.73a17.507,17.507,0,0,0-2.109-7.181Z" transform="translate(-3225.182 1511.509)" fill="#909aa9"/><path d="M226.243,103.946l9.539-6.2.442.314-9.6,6.355ZM211.87,79.175s-.548-4.587-3.774-6.548-6.72-4.333-6.72-4.333a14.183,14.183,0,0,0,4.284,8c3.889,3.815,6.21,2.886,6.21,2.886Zm3.916,3.188a12.009,12.009,0,0,0-4.576-1.049c-1.889.149-7.278,2.146-7.8,2.352,0,0,4.628,2.534,9.139,1.07S215.785,82.364,215.785,82.364Zm-.53-13.142s1.278,6.215,1.387,7.7a5.9,5.9,0,0,1-2.059,4.191s-2.227-1.292-1.737-4.808A17.51,17.51,0,0,1,215.255,69.221Z" transform="translate(-3050.299 1455.021)" fill="#909aa9"/><path d="M93.583,251.743l-10.121-7.215-.454.295,10.215,7.326ZM75.949,265.767s-1.211-3.774-4.25-4.9-6.369-2.552-6.369-2.552a12.171,12.171,0,0,0,4.915,6.036c3.9,2.578,5.7,1.416,5.7,1.416Zm3.82,2.046a10.307,10.307,0,0,0-4.027-.136,41.677,41.677,0,0,0-6.187,3.256s4.313,1.378,7.874-.592S79.768,267.813,79.768,267.813Zm-2.594-10.985s2.092,5.027,2.427,6.262a5.062,5.062,0,0,1-1.05,3.867s-2.087-.724-2.249-3.767a15.026,15.026,0,0,1,.872-6.363Z" transform="translate(-2922.33 1289.25)" fill="#909aa9"/><path d="M241.2,601.955l-9.705-4.424-.335.323,9.8,4.5Z" transform="translate(-3078.318 957.206)" fill="#909aa9"/><path d="M527.5,66.185h5.813a58.721,58.721,0,0,0-.684,7.347c0,3.025.257,10.192.627,13.613h-5.813s.8-7.784.741-13.775C528.166,71.074,527.5,66.185,527.5,66.185Z" transform="translate(-3365.322 1511.509)" fill="#909aa9"/><path d="M395.676,66.185h5.813A37.112,37.112,0,0,0,400.805,72c0,2.394.257,8.064.627,10.772h-5.813a94.459,94.459,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,66.185Zm0,18.209h5.813a37.111,37.111,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.463,94.463,0,0,0,.741-10.9A52.723,52.723,0,0,0,395.676,84.394Zm0,18.124h5.813a37.113,37.113,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.464,94.464,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,102.518Zm-8.207,0h5.813a37.108,37.108,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.488,94.488,0,0,0,.741-10.9,52.739,52.739,0,0,0-.684-5.685ZM387.3,88.982h5.984a19.589,19.589,0,0,0-.684,4.175,50.871,50.871,0,0,0,.57,7.708h-5.642a74.975,74.975,0,0,0,.456-7.922A25.3,25.3,0,0,0,387.3,88.982Z" transform="translate(-3225.182 1565.656)" fill="#909aa9"/><path d="M527.5,66.185h5.813a58.721,58.721,0,0,0-.684,7.347c0,3.025.257,10.192.627,13.613h-5.813s.8-7.784.741-13.775C528.166,71.074,527.5,66.185,527.5,66.185Z" transform="translate(-3365.322 1565.894)" fill="#909aa9"/><g transform="translate(0 55)"><path d="M395.676,66.185h5.813A37.112,37.112,0,0,0,400.805,72c0,2.394.257,8.064.627,10.772h-5.813a94.459,94.459,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,66.185Zm0,18.209h5.813a37.111,37.111,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.463,94.463,0,0,0,.741-10.9A52.723,52.723,0,0,0,395.676,84.394Zm0,18.124h5.813a37.113,37.113,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.464,94.464,0,0,0,.741-10.9A52.725,52.725,0,0,0,395.676,102.518Zm-8.207,0h5.813a37.108,37.108,0,0,0-.684,5.813c0,2.394.257,8.064.627,10.772h-5.813a94.488,94.488,0,0,0,.741-10.9,52.739,52.739,0,0,0-.684-5.685ZM387.3,88.982h5.984a19.589,19.589,0,0,0-.684,4.175,50.871,50.871,0,0,0,.57,7.708h-5.642a74.975,74.975,0,0,0,.456-7.922A25.3,25.3,0,0,0,387.3,88.982Z" transform="translate(-3225.182 1565.656)" fill="#909aa9"/><path d="M527.5,66.185h5.813a58.721,58.721,0,0,0-.684,7.347c0,3.025.257,10.192.627,13.613h-5.813s.8-7.784.741-13.775C528.166,71.074,527.5,66.185,527.5,66.185Z" transform="translate(-3365.322 1565.894)" fill="#909aa9"/></g></g><path d="M2989,62c-10.838-4.087-16.3,0-32,0-26.51,0-48-8.954-48-20s21.49-20,48-20h286c8.836,0-14,7.164-14,16s-5.914,13.75-14.75,13.75c0,0-16.75,2.251-28.75,5.251S3165,68.714,3165,68.714,3127.392,110,3081,110c-38.041,0-70.176-13.246-80.647-31.653C2998.219,74.6,2999.838,66.087,2989,62Z" transform="translate(-2841 324)" fill="#d1d6e2"/><path d="M525.021,66.584a31.23,31.23,0,0,1,7.085,10.425c2.772,6.6,5.877,13.459,8.386,14.78s3.695,10.033-8.053,8.185S525.021,66.584,525.021,66.584Z" transform="translate(-377.752 244.966)" fill="#fff"/><ellipse cx="49" cy="12" rx="49" ry="12" transform="translate(66 350)" opacity="0.15" fill="url(#c)"/><path d="M525.494,68.3a32.341,32.341,0,0,1,6.953,16.851c.847,8.628,2.933,13.332,5.151,13.016a12.659,12.659,0,0,1-5.991-.025C528.092,97.37,524.074,68.412,525.494,68.3Z" transform="translate(-377.273 245.91)" fill="url(#d)"/><path d="M537.949,131.675a34.415,34.415,0,0,0,14.137,1.09c6.9-.975,8.727-13.747-.647-15.059-7.267-1.02-6.026-12.167-7.366-22.433s-3.56-18.848-4.364-23.026,9.689-.719,11.73-4.892,3.525-6.606-1.228-10.6-5.391-10-12.341-13.4-11.791-2.618-17.8-1.4-5.492.829-9.4,8.2-2.687,4.347-6.236,21.283-6.694,39.223-6.56,49.062,6.426,16.715,19.952,18.467,19.419-.606,19.856-4.448c.279-2.443,1.905-11.053-7.8-12.535-4.83-.74-7.363-1.347-7.363-1.347" transform="translate(-392.871 232.445)" fill="#fff"/><path d="M0,1.694S1.095.017,1.966,0a3.688,3.688,0,0,1,2.35.5A6.164,6.164,0,0,1,5.8,2.478S.049,3.576,0,1.694Z" transform="translate(162.167 293.909) rotate(99)" fill="#757f95"/><path d="M522.077,37.922c-2.054-.536-2.278,2.085-2.278,2.085s-2.89-.313-2.6,1.743c.357,2.566,5.831,2.443,5.831,2.443S524.583,38.578,522.077,37.922Z" transform="matrix(0.695, 0.719, -0.719, 0.695, -201.115, -137.626)" fill="#757f95"/><path d="M503.084,74.624s-1.45,17.9,1.1,22.385c1.511,2.657,5.744,3.472,10.6,4.365.776.143,1.036,1.451,2.714,1.808s2.7-.271,4-.38c2.039-.168,3.7-1.786,5.451-2.409,6.068-2.157,2.831-6.2,0-8.893s-3.738-10.346-8.593-14.5" transform="translate(-388.501 249.626)" fill="url(#e)"/><path d="M531.516,76.393c-3.6-3.507-6.766.555-6.766.555s-6.2-4.888-8.5.26C513.373,83.63,528.051,94,528.051,94S535.2,79.982,531.516,76.393Z" transform="translate(-382.216 249.516)" fill="url(#f)"/><path d="M132,344s-6,6-4,8,7-4,7-4,20.506-23.944,40.506-43.444A283.9,283.9,0,0,1,216,272a383.479,383.479,0,0,0-39.776,29.3C154.724,319.3,132,344,132,344Z" transform="translate(1 -1)" fill="#909aa9"/><path d="M504.118,75.051s5.02,15.274,7.571,19.76c3.236,5.688,9.468,8.51,15.533,6.355s2.831-5.527,0-8.223S523.148,81.155,518.293,77" transform="translate(-389.497 248.564)" fill="#fff"/><path d="M505.743,52.715s-6.088-1.338-6.755,3.318,4.181,7.509,7.656.6" transform="translate(-74.387 -191.14) rotate(61)" fill="#fff"/><ellipse cx="61" cy="7.5" rx="61" ry="7.5" transform="translate(218 346)" fill="#c8cede"/><path d="M513.708,48.635a.553.553,0,0,0-.481.286h0l-.009.013a4.434,4.434,0,0,1-2.973,2.139h-.017v0a.548.548,0,0,0-.469.457l-.01,0-.374.993s.314-.013.775-.081l.053-.283.1-.538v.8c.173-.029.359-.067.556-.111v-.688l.059.418.034.247a5.168,5.168,0,0,0,2.2-1.048,3.762,3.762,0,0,0,1.061-1.821c.037-.143.05-.229.05-.229A.556.556,0,0,0,513.708,48.635Z" transform="matrix(0.978, 0.208, -0.208, 0.978, -346.634, 127.608)" fill="#757f95"/><ellipse cx="74" cy="8" rx="74" ry="8" transform="translate(276 363)" fill="#d1d6e2"/><path d="M524.909,37.964c-3.242-.846-3.594,3.291-3.594,3.291s-4.56-.494-4.105,2.75c.563,4.049,9.2,3.856,9.2,3.856S528.862,39,524.909,37.964Z" transform="translate(-393.505 211.484)" fill="#757f95" opacity="0.6"/><path d="M528.781,38.021c-4.865-1.27-5.394,4.938-5.394,4.938s-6.844-.742-6.161,4.127c.845,6.076,13.809,5.786,13.809,5.786S534.714,39.574,528.781,38.021Z" transform="translate(-168.768 -198.46) rotate(51)" fill="#757f95" opacity="0.2"/><ellipse cx="100" cy="10" rx="100" ry="10" transform="translate(176 351)" fill="#c0c9db"/><path d="M-2693,1268s15.6.8,10.6,16,10.4,17,13.4,24,0,42.6,0,42.6" transform="translate(2909 -996)" fill="none" stroke="#909aa9" stroke-width="0.2"/><path d="M3,0H6l.5,3.961L7,8H6L4.658,4.422Z" transform="translate(220.059 346.2) rotate(-30)" fill="#909aa9"/><path d="M0,0H3l.5,3.961L4,8H3L1.658,4.422Z" transform="translate(222.683 356.208) rotate(-60)" fill="#909aa9"/><path d="M7,0H4L3.5,3.961,3,8H4L5.342,4.422Z" transform="translate(248.549 341.2) rotate(30)" fill="#909aa9"/><path d="M0,8H3l.5-3.961L4,0H3L1.658,3.578Z" transform="translate(247.657 360.208) rotate(-120)" fill="#909aa9"/><path d="M4.725,0H3.431L3.218,1.708,3,3.45h.431L4.01,1.907Z" transform="matrix(0.966, 0.259, -0.259, 0.966, 240.235, 347.541)" fill="#fff"/><path d="M0,3.45H1.294l.213-1.708L1.725,0H1.294L.715,1.543Z" transform="translate(243.633 356) rotate(-135)" fill="#fff"/><path d="M1.725,3.45H.431L.218,1.742,0,0H.431L1.01,1.543Z" transform="matrix(-0.966, 0.259, -0.259, -0.966, 236.193, 351.65)" fill="#fff"/><path d="M0,0H1.294l.214,1.708L1.725,3.45H1.294L.715,1.907Z" transform="translate(232.36 353.561) rotate(-45)" fill="#fff"/><ellipse cx="39.5" cy="11" rx="39.5" ry="11" transform="translate(289 363)" fill="#c8cede"/></g></svg> <div class="content"> 这里空空如也,快来评论吧~ </div> </h3> <?php endif; ?> <?php else: ?> <center> <h3 class="ui icon header"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200" viewBox="0 0 480 480"><defs><linearGradient id="a" x1="0.5" y1="1" x2="0.564" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#e0e5ef" stop-opacity="0"/><stop offset="1" stop-color="#e0e5ef"/></linearGradient><linearGradient id="b" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#d5d5d5"/><stop offset="1" stop-color="#6b6b6b" stop-opacity="0.059"/></linearGradient><linearGradient id="c" x1="0.222" y1="1.105" x2="0.681" y2="0.152" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#fff" stop-opacity="0"/><stop offset="1" stop-color="#909aa9"/></linearGradient><linearGradient id="d" x1="-0.392" y1="1.144" x2="0.636" y2="0.061" xlink:href="#c"/><linearGradient id="e" x1="0.027" y1="1.117" x2="0.736" y2="0.141" xlink:href="#c"/></defs><g transform="translate(-135 -375)"><ellipse cx="184" cy="184" rx="184" ry="184" transform="translate(191 431)" fill="#f3f3fa"/><path d="M112,259.243V96h64V259.243a187.037,187.037,0,0,1-64,0ZM0,192.931V0H88V253.371A184.268,184.268,0,0,1,0,192.931ZM208,24h96V169.434a184.369,184.369,0,0,1-96,81.193Z" transform="translate(230 536.999)" fill="url(#a)"/><g transform="translate(267.046 592.758) rotate(-25)"><rect width="156" height="200" rx="8" transform="translate(24 0)" fill="#78818e"/><path d="M8,0H144a8,8,0,0,1,8,8V192a8,8,0,0,1-8,8H8a8,8,0,0,1-8-8V8A8,8,0,0,1,8,0Z" transform="translate(24 0)" fill="#a1a7af"/><rect width="136" height="184" rx="4" transform="translate(32 8)" fill="#dae8e6"/><path d="M36,0H164a4.065,4.065,0,0,1,4,4.127c-7,174.567-15.744,174.717-15.744,174.717s-42.41.678-80.745-3.834A527.118,527.118,0,0,1-1.085,160.8S16,150.623,24,132.053s8-49.52,8-49.52V4.127A4.065,4.065,0,0,1,36,0Z" transform="translate(0 8)" fill="url(#b)"/><path d="M36,0H164a4,4,0,0,1,4,4c-7,169.209-11,171-11,171s-47.75-1.25-85-7A628,628,0,0,1,0,152a47.176,47.176,0,0,0,24-24c8-18,8-48,8-48V4A4,4,0,0,1,36,0Z" transform="translate(0 8)" fill="#fff"/><rect width="40" height="40" rx="2" transform="translate(48 40)" fill="#ebedf5"/><rect width="48" height="16" rx="2" transform="translate(104 40)" fill="#ebedf5"/><rect width="48" height="16" rx="2" transform="translate(104 64)" fill="#ebedf5"/><path d="M1,0S27,2,53,2s52-2,52-2l-1,12s-21.25,2-47,2S0,12,0,12Z" transform="translate(47 96)" fill="#ebedf5"/><path d="M2.5,0s14,2.438,40,2.75,63-1.5,63-1.5l-2,14S68,17.5,42.5,17.5,0,13.25,0,13.25Z" transform="translate(45.5 114.75)" fill="#ebedf5"/><path d="M4.5,0A254.823,254.823,0,0,0,40,3.333C60,3.833,108,2,108,2l-3,17s-38.417,2.75-65,2S0,16,0,16Z" transform="translate(40 136)" fill="#ebedf5"/></g><g transform="matrix(0.966, 0.259, -0.259, 0.966, 397.282, 500.051)"><rect width="6" height="32" rx="2" transform="translate(1)" fill="#b5b9be"/><rect width="6" height="32" rx="2" fill="#dddfe6"/></g><circle cx="1.5" cy="1.5" r="1.5" transform="translate(397 513.452)" fill="#909aa9"/><path d="M-3331,1132c188.947,26.75,289.45-16,289.45-16" transform="translate(3555.8 -620.625)" fill="none" stroke="#909aa9" stroke-linecap="round" stroke-width="2"/><g transform="translate(389 497.405)"><rect width="8" height="40" rx="2" transform="translate(1)" fill="#b5b9be"/><rect width="8" height="40" rx="2" fill="#cdd3df"/></g><g transform="matrix(0.839, 0.545, -0.545, 0.839, 437.927, -8.055)"><path d="M1585.106,53.028a7,7,0,0,1-6.618-4.723l-5.209-15.128a7,7,0,1,1,13.237-4.558l5.209,15.128a7,7,0,0,1-6.619,9.281ZM1580,28.462a2.5,2.5,0,1,0,2.5,2.5A2.5,2.5,0,0,0,1580,28.462Z" transform="translate(-1421.502 512.538)" fill="#909aa9"/><g transform="translate(145.469 536.589)"><path d="M21.951,107.445C7.073,105.525.152,97.989,0,87.2S3.6,54.89,6.22,41.423c1.093-6.458,1.453-6.148,0-6.02S0,31.09,1.866,26.884C2.356,23.48,5.5,23,7.535,23.056a4.1,4.1,0,0,1,.717-1.737s5.013-5.761,10.315-8.273a16.5,16.5,0,0,1,8.1-1.366,10.154,10.154,0,0,0,4.121-.409c2.8-1.181,2.558-2.36,4.769-2.8s10.6.936,11.317,10.872c.7,9.679-4.572,14.545-3.687,19.125.421,2.181.861,3.139,2.5,7.188A36.867,36.867,0,0,1,52.564,56.34c3.049,7.235,5.116,12.177,7.875,13.625s6.04,14.584-6.882,12.558l-.065-.011c5.463-1.532,1.439-.386,4.2,0,8.188.64,8.587,17.883,1,18.952-5.937,2.063-14.9,0-14.9,0v-1c-.04,1.317.078,1.422,0,2.1-.371,3.243-4.3,5.521-12.878,5.521A70.728,70.728,0,0,1,21.951,107.445ZM29.876,5.84A2.986,2.986,0,0,1,33.5,2.9S33.189-.785,36.876.153c4.25.875,2.25,8.625,2.25,8.625s-1.483.875-1.567.875C36.683,9.653,29.814,10.278,29.876,5.84Z" transform="translate(0 0)" fill="#909aa9" stroke="rgba(0,0,0,0)" stroke-width="1"/><g transform="translate(2.001 2.09)"><g transform="translate(40.489 44.55)"><path d="M.779,0A31.23,31.23,0,0,1,7.865,10.425c2.772,6.6,5.877,13.459,8.386,14.78S19.945,35.237,8.2,33.389.779,0,.779,0Z" fill="#fff"/><path d="M.293,0A32.341,32.341,0,0,1,7.246,16.851c.847,8.628,2.933,13.332,5.151,13.016a12.659,12.659,0,0,1-5.991-.025C2.891,29.071-1.127.113.293,0Z" transform="translate(1.438 2.659)" fill="url(#c)"/></g><path d="M40.077,87.626a34.415,34.415,0,0,0,14.137,1.09c6.9-.975,8.727-13.747-.647-15.059C46.3,72.636,47.541,61.489,46.2,51.224S39.641,32.376,38.837,28.2s4.251-9.233,3.614-18.062C41.8,1.07,36.15-.344,34.143.061s-3.609,2.392-6.154,3.47S21.7,2.858,16.878,5.149,7.5,12.7,7.5,12.7c-2.009,2.561.4,10.648-.938,14.691S-.132,66.612,0,76.45,6.429,93.165,19.954,94.917s19.419-.606,19.856-4.448c.279-2.443,1.905-11.053-7.8-12.535-4.83-.74-7.363-1.347-7.363-1.347" transform="translate(0 8.494)" fill="#fff"/><path d="M0,1.594S.961.016,1.726,0c1.313-.026,2.7,1.631,2.7,1.631S.043,3.365,0,1.594Z" transform="translate(32.843 8.554)" fill="#757f95"/><path d="M4.9.072C2.845-.464,2.622,2.158,2.622,2.158S-.268,1.844.02,3.9C.377,6.466,5.851,6.344,5.851,6.344S7.4.728,4.9.072Z" transform="translate(29.714 0)" fill="#757f95"/><path d="M6.817.178S.728-1.16.062,3.5,4.243,11,7.718,4.1" transform="translate(1.634 22.772)" fill="#fff"/><path d="M.411,0s-1.45,17.9,1.1,22.385c2.3,4.044,10.662,5.138,16.755,4.63a25.038,25.038,0,0,0,6.013-1.246c6.068-2.157,2.831-6.2,0-8.893S20.54,6.531,15.686,2.375" transform="translate(8.172 57.25)" fill="url(#d)"/><path d="M4.7,0A.6.6,0,0,0,4.18.31v0L4.17.322A4.814,4.814,0,0,1,.943,2.645l-.019,0,0,0a.6.6,0,0,0-.509.5l-.011,0L0,4.226s.341-.014.842-.088L.9,3.831l.11-.584v.865c.188-.031.389-.073.6-.121V3.243l.064.454.037.268A5.609,5.609,0,0,0,4.1,2.828,4.083,4.083,0,0,0,5.251.851C5.291.7,5.305.6,5.305.6A.6.6,0,0,0,4.7,0Z" transform="translate(17.708 16.722)" fill="#757f95"/><path d="M15.643,1.542c-3.6-3.507-6.766.555-6.766.555s-6.2-4.888-8.5.26c-2.873,6.422,11.8,16.794,11.8,16.794S19.326,5.132,15.643,1.542Z" transform="translate(27.658 57.366)" fill="url(#e)"/><path d="M0,0S5.02,15.274,7.571,19.76c3.236,5.688,9.468,8.51,15.533,6.355s2.831-5.527,0-8.223S19.03,6.1,14.175,1.947" transform="translate(8.621 56.615)" fill="#fff"/></g></g></g><g transform="translate(239.735 501.489)"><g transform="matrix(0.755, -0.656, 0.656, 0.755, 6.82, 4.592)"><rect width="6" height="32" rx="2" transform="translate(1)" fill="#b5b9be"/><rect width="6" height="32" rx="2" fill="#dddfe6"/></g><circle cx="1.5" cy="1.5" r="1.5" transform="translate(17.738 12.298) rotate(-56)" fill="#909aa9"/><g transform="translate(0 9.983) rotate(-56)"><rect width="8" height="40" rx="2" transform="translate(1)" fill="#b5b9be"/><rect width="8" height="40" rx="2" fill="#cdd3df"/></g></g><g transform="translate(359.323 650.849) rotate(-47)"><rect width="68.62" height="15.248" transform="translate(4.222 26.682)" fill="#ffcc43"/><rect width="68.616" height="15.248" transform="translate(45.744) rotate(90)" fill="#ffcc43"/></g><path d="M134.011,161.88l-6.667,23.833,8.833,8.667,25.5-5.833,28.738-30.229L164.264,131.88Z" transform="translate(300.156 434.287)" fill="#78818e"/><path d="M135.344,155.3l-6.5,23.845,4.286,4.143,24.214-5.488,25.333-25.583L160.511,129.88Z" transform="translate(302.156 442.287)" fill="#e5e2e2"/><path d="M182.7,150.552l4.6-4.6a6.537,6.537,0,0,0,0-9.192l-13.148-13.148a6.537,6.537,0,0,0-9.192,0l-4.6,4.6Zm-18.983-14.068,10.671,10.671,5.835,5.835-22.74,22.74c-5.4,1.159-6.554-1.479-5.835-5.835-5.475-.759-9.552-3.2-10.511-9.432L156.487,145.6l-1.4-1.4-15.746,15.266c-3.956.32-4.8-2.238-4.2-6.075l22.74-22.74Z" transform="translate(302.156 444.132)" fill="#909aa9"/><path d="M182.7,150.552l4.6-4.6a6.537,6.537,0,0,0,0-9.192l-13.148-13.148a6.537,6.537,0,0,0-9.192,0l-4.6,4.6Z" transform="translate(302.156 444.067)" fill="#78818e"/><path d="M131.844,167.63l-3.332,11.577,4.476,4.476,12.356-2.8Z" transform="translate(302.156 442.287)" fill="#78818e"/><path d="M186.977,155.3l5.475-5.353a7.493,7.493,0,0,0,0-10.706l-15.663-15.314a7.914,7.914,0,0,0-10.95,0l-5.475,5.353Z" transform="translate(299.156 441.701)" fill="#78818e"/><path d="M182.7,150.552l4.6-4.6a6.537,6.537,0,0,0,0-9.192l-13.148-13.148a6.537,6.537,0,0,0-9.192,0l-4.6,4.6Z" transform="translate(301.156 444.995)" fill="#a1a7af"/></g></svg> <div class="content"> 啊哦,评论功能已关闭~ </div> </h3> </center> <?php endif; ?> <?php if(Bsoptions('CommentDesc')== '' || Bsoptions('CommentDesc') == false):?> <br> <div id="bscommen"> <?php if ($comments->have()): ?> <?php ob_start(); $comments->listComments(); $comments_content = ob_get_contents(); ob_end_clean(); $comments_content = preg_replace("/<ol class=\"comment-list\">/sm", '', $comments_content); $comments_content = preg_replace("/<\/ol>/sm", '', $comments_content); echo $comments_content; ?> <?php ob_start(); $comments->pageNav('«','»', 1, ''); $content = ob_get_contents(); ob_end_clean(); if(Bsoptions('pagination_style')== '2'){ $content = preg_replace("/<ol class=\"(.*?)\">/sm", '<nav class="page-navigator">', $content); $content = preg_replace("/<li><span>(.*?)<\/span><\/li>/sm", '<span class="page-number">...</span>', $content); $content = preg_replace("/<li class=\"current\"><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="page-number current" href="$1">$2</a>', $content); $content = preg_replace("/<li><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="page-number" href="$1">$2</a>', $content); $content = preg_replace("/<li [class=\"prev\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="extend prev" href="$1"><i class="arrow left icon"></i>上一页</a>', $content); $content = preg_replace("/<li [class=\"next\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="extend next" href="$1"><i class="arrow right icon"></i>下一页</a>', $content); //适配旧版本 $content = preg_replace("/<li class=\"current\"><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="page-number current" href="$1">$2</a>', $content); $content = preg_replace("/<li><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="page-number" href="$1">$2</a>', $content); $content = preg_replace("/<li [class=\"prev\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="extend prev" href="$1"><i class="arrow left icon"></i>上一页</a>', $content); $content = preg_replace("/<li [class=\"next\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="extend next" href="$1"><i class="arrow right icon"></i>下一页</a>', $content); ///---> $content = preg_replace("/<\/ol>/sm", '</nav>', $content); } if(empty(Bsoptions('pagination_style ')) || Bsoptions('pagination_style') == '1'){ $content = preg_replace("/<ol class=\"(.*?)\">/sm", '<div class="ui labels" style="margin-top:30px"><div style="text-align:center">', $content); $content = preg_replace("/<li><span>(.*?)<\/span><\/li>/sm", '<a class="ui large label">...</a>', $content); $content = preg_replace("/<li class=\"current\"><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="ui black large label" href="$1">$2</a>', $content); $content = preg_replace("/<li><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="ui large label" href="$1">$2</a>', $content); $content = preg_replace("/<li [class=\"prev\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="ui large label" href="$1">上一页</a>', $content); $content = preg_replace("/<li [class=\"next\"]+><a href=\"(.*?)\">(.*?)<\/a><\/li>/sm", '<a class="ui large label" style="margin-top:5px" href="$1">下一页</a>', $content); //旧版本兼容 $content = preg_replace("/<li class=\"current\"><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="ui black large label" href="$1">$2</a>', $content); $content = preg_replace("/<li><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="ui large label" href="$1">$2</a>', $content); $content = preg_replace("/<li [class=\"prev\"]+><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="ui large label" href="$1">上一页</a>', $content); $content = preg_replace("/<li [class=\"next\"]+><a href=\"(.*?)\" >(.*?)<\/a><\/li>/sm", '<a class="ui large label" style="margin-top:5px" href="$1">下一页</a>', $content); $content = preg_replace("/<\/ol>/sm", '</div></div>', $content); } echo $content; ?> <?php endif; ?> </div> <?php endif; ?> </div> </div></div> </div> <script> $(function(){ getCommentInfo(); }); function getCookie(name){ const strcookie = document.cookie; const arrcookie = strcookie.split("; "); for (let i = 0; i < arrcookie.length; i++) { const arr = arrcookie[i].split("="); if (arr[0] === name){ return arr[1]; } } return ""; } function getCommentInfo(){ let nick = document.getElementById('author'); let mail = document.getElementById('mail'); let url = document.getElementById('url'); let nick_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_author')); let mail_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_mail')); let url_value = decodeURIComponent(getCookie('<?php echo Typecho_Cookie::getPrefix()?>__typecho_remember_url')); if (nick && nick_value!== 'null') nick.value = nick_value; if (mail && mail_value!== 'null') mail.value = mail_value; if (url && url_value!== 'null') url.value = url_value; $.post('<?php getIsLogin(); ?>',{action:'find'},function (res) { res = JSON.parse(res); switch(res.code){ case 0 : $('#loginshowlabel').hide(); $('#nologinshow').show(); break; case 1 : $('#loginshowlabel').show(); $('#nologinshow').hide(); $('#authorname').html(res.name); break; } }); $.post('<?php getCommentAction(); ?>',{action:'getCommentToken'},function (res) { res = JSON.parse(res); if(res.code == 1){ $("#SecurityToken").remove(); var tokenInput=$("<input type=\"hidden\" name=\"SecurityToken\" id=\"SecurityToken\">"); tokenInput.attr("value", res.token); $("#commentform").append(tokenInput); } }) } </script> </div> ================================================ FILE: compoment/foot.php ================================================ <?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?> </div> <?php if(Bsoptions('Popup') == true) :?> <script src="<?php AssetsDir();?>assets/vendors/bs-announcement/bs-announcement.min.js?v=1" type="text/javascript"></script> <div id="announcement-root" data-announcements='<?= htmlspecialchars(json_encode(Bsoptions('Popup_Value')), ENT_QUOTES, 'UTF-8') ?>' data-settings='<?= json_encode([ 'storageKey' => Bsoptions('PopupKey') ?: 'announcement', 'popupTitle' => Bsoptions('PopupTitle') ?: '最新公告' ]) ?>'> </div> <?php endif; ?> </div> <?php if(Bsoptions('RewardOpen') == true):?> <?php $payment_config = [ 'alipay' => [ 'enabled' => !empty(Bsoptions('RewardOpenAlipay')), 'label' => '支付宝', 'type' => 'qrcode', 'src' => Bsoptions('RewardOpenAlipayText') ], 'wechat' => [ 'enabled' => !empty(Bsoptions('RewardOpenWechat')), 'label' => '微信', 'type' => 'qrcode', 'src' => Bsoptions('RewardOpenWechatText') ], 'qq' => [ 'enabled' => !empty(Bsoptions('RewardOpenQQ')), 'label' => 'QQ', 'type' => 'qrcode', 'src' => Bsoptions('RewardOpenQQText') ], 'afdian' => [ 'enabled' => !empty(Bsoptions('RewardOpenAfdian')), 'label' => '爱发电', 'type' => 'link', 'href' => Bsoptions('RewardOpenAfdianText') ], 'paypal' => [ 'enabled' => !empty(Bsoptions('RewardOpenPaypal')), 'label' => 'PayPal', 'type' => 'link', 'href' => Bsoptions('RewardOpenPaypalText') ] ]; $active_methods = array_filter($payment_config, function($item) { return $item['enabled'] === true; }); $first_key = null; if (!empty($active_methods)) { $first_key = array_key_first($active_methods); } ?> <div class="donate-modal__mask"> <div class="donate-modal__container"> <div class="donate-modal__header"> <h3>赞赏支持作者</h3> <span class="donate-modal__close">×</span> </div> <?php if (!empty($active_methods)) : ?> <div class="donate-modal__nav"> <?php foreach ($active_methods as $key => $method) : ?> <div class="donate-tab <?= $key === $first_key ? 'active' : '' ?>" data-target="<?= $key ?>"> <?= htmlspecialchars($method['label']) ?> </div> <?php endforeach; ?> </div> <div class="donate-content"> <?php foreach ($active_methods as $key => $method) : ?> <div class="donate-pane <?= $key === $first_key ? 'active' : '' ?>" id="<?= $key ?>"> <?php if($method['type'] === 'qrcode') : ?> <img src="<?= htmlspecialchars($method['src']) ?>" alt="<?= htmlspecialchars($method['label']) ?>二维码" style="max-width:200px;max-height:200px;"> <?php elseif($method['type'] === 'link') : ?> <a href="<?= htmlspecialchars($method['href']) ?>" target="_blank" rel="noopener noreferrer" class="donate-paypal-link"> 前往<?= htmlspecialchars($method['label']) ?> </a> <?php endif; ?> </div> <?php endforeach; ?> </div> <?php else : ?> <div class="donate-empty"> 当前暂无可用支付方式 </div> <?php endif; ?> </div> </div> <?php endif; ?> <?php if(Bsoptions('Top') == true) :?> <button id="back-to-top" class="fixed-button"> <i class="<?php if(empty(Bsoptions('TopSrc'))){echo 'fas fa-chevron-up';}else{echo Bsoptions('TopSrc');}; ?>"></i> </button> <?php endif;?> <?php if(Bsoptions('Control_Panel') == true) :?> <!-- 设置按钮 --> <button id="foot-settings-button" class="fixed-button"> <i class="fas fa-cogs"></i> </button> <!-- 设置面板 --> <div id="foot-settings-panel" class="foot-settings-panel ignore"> <div class="foot-panel-header"> <h3>设置</h3> <button id="foot-close-panel" class="foot-close-button"> <i class="fas fa-times"></i> </button> </div> <div class="foot-panel-content"> <!-- 黑暗模式切换 --> <div class="foot-setting-item"> <div class="foot-setting-label"> <i class="fas fa-moon"></i> <span>黑暗模式</span> </div> <div class="bstheme-control-dark"> <div class="switch-check"> <input type="checkbox" id="darkmode" value="true" name="darkmode"> <label class="label" for="darkmode"> <span class="slider-check"></span> </label> </div> </div> </div> <?php if (Bsoptions('Translate') == "1"): ?> <!-- 简繁体切换 --> <div class="foot-setting-item"> <div class="foot-setting-label"> <i class="fas fa-language"></i> <span>简繁体切换</span> </div> <div class="language-buttons"> <button id="translateLink" class="language-btn active" onclick="translatePage(); return false;">简体</button> </div> </div> <?php endif; ?> <?php if (Bsoptions('Translate') == "11"): ?><?php $this->need('modules/translate.php'); ?> <?php endif; ?> </div> </div> <?php endif;?> <script> $(document).ready(function () { const backToTopButton = $('#back-to-top'); backToTopButton.on('click', function () { $('html, body').animate({ scrollTop: 0 }, 'smooth'); }); $(window).on('scroll', function () { if ($(window).scrollTop() > 100) { backToTopButton.css('display', 'flex'); } else { backToTopButton.css('display', 'none'); } }); const settingsButton = $('#foot-settings-button'); const settingsPanel = $('#foot-settings-panel'); const closePanelButton = $('#foot-close-panel'); settingsButton.on('click', function () { settingsPanel.css('display', 'block'); }); closePanelButton.on('click', function () { settingsPanel.css('display', 'none'); }); $(window).on('click', function (event) { if ( !$(event.target).closest('#foot-settings-button').length && !settingsPanel.has(event.target).length ) { settingsPanel.css('display', 'none'); } }); }); </script> <footer id="footer" role="contentinfo" class="break"> <?php if(Bsoptions('FriendLinkChoose') == true && Bsoptions('FriendLinkFoot') == true) :?> <?php if((Bsoptions('FriendLink_place') == '1') || (Bsoptions('FriendLink_place') == '2' && $this->is('index'))) :?> <?php if(!empty(Bsoptions('FriendLink'))) :?> <div class="ui small horizontal divided list"> 友情链接: <?php foreach (getFriendLink() as $FriendLinks): ?> <div class="item"> <div class="content"> <div><a href="<?php echo $FriendLinks[2]; ?>" title="<?php echo $FriendLinks[1]; ?>"<?php echo parselink($FriendLinks[2]); ?>><?php echo $FriendLinks[0]; ?></a></div> </div> </div> <?php endforeach;?> </div> <br> <?php endif;?> <?php endif;?><?php endif;?> <?php if(Bsoptions('CustomizationFooterCode')): ?><?php echo Bsoptions('CustomizationFooterCode'); ?><br><?php endif; ?> © <?php echo date('Y'); ?> <a href="<?php $this->options->siteUrl(); ?>"><?php $this->options->title(); ?></a><?php if(Bsoptions('allOfCharacters') == true): ?> (<i class="pencil alternate icon"></i>本站总字数:<?php echo allOfCharacters(); ?>字)<?php endif; ?> <br> <?php _e('Powered by <a href="http://www.typecho.org" target="_blank">Typecho</a> & <a href="https://github.com/whitebearcode/typecho-bearsimple" target="_blank"> BearSimple</a> '); ?> <?php if (Bsoptions('IcpBa') || Bsoptions('PoliceBa')): ?><br><?php endif; ?> <?php if (Bsoptions('PoliceBa')): ?><img style="vertical-align: middle;" src="<?php AssetsDir();?>assets/images/beian.png"> <a href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=<?php echo parseNumber(Bsoptions('PoliceBa')); ?>" target="_blank"><?php echo Bsoptions('PoliceBa'); ?></a><?php endif; ?><?php if (Bsoptions('IcpBa') && Bsoptions('PoliceBa')): ?> | <?php endif; ?><?php if (Bsoptions('IcpBa')): ?><img style="vertical-align: middle;" src="<?php AssetsDir();?>assets/images/icp.png"> <a href="https://beian.miit.gov.cn/" target="_blank"><?php echo Bsoptions('IcpBa'); ?></a><?php endif; ?> <?php if(Bsoptions('load_Time') == '1'): ?><br><?php echo loadtime();?><?php endif; ?> <?php if(Bsoptions('blogsclub_shuttle') == true): ?> <br><a href="https://www.blogsclub.org/go"> <img src="<?php AssetsDir();?>assets/images/blogsclub-shuttle.svg" loading="lazy"></a> <?php endif;?> </footer> </div> </div> </div> <?php if(Bsoptions('Pjax') == true) :?> <div class="bs-pjax bs-pjax-mask"></div> <div class="bs-pjax bs-pjax-anim"> <div> <span class="bs-pjax-1"></span> <span class="bs-pjax-2"></span> <span class="bs-pjax-3"></span> <span class="bs-pjax-4"></span> <span class="bs-pjax-5"></span> <span class="bs-pjax-6"></span> <span class="bs-pjax-7"></span> </div> </div> <?php endif; ?> <?php if(!empty(Bsoptions('ServiceWorker')) && ishttps() == true): ?> <script> var serviceWorkerUri = '/<?php echo Bsoptions('ServiceWorker'); ?>'; if ('serviceWorker' in navigator) { navigator.serviceWorker.register(serviceWorkerUri).then(function() { if (navigator.serviceWorker.controller) { console.log('Service worker 已经成功运行。'); } else { console.log('Service worker 当前存在缓存需要更新。'); } }).catch(function(error) { console.log('错误: ' + error); }); } else { console.log('Service worker 无法支持当前浏览器.'); } </script> <?php else: ?> <script> if ('serviceWorker' in navigator) { navigator.serviceWorker.getRegistrations().then(function(registrations) { for(let registration of registrations) { registration.unregister() }}).catch(function(err) { console.log('Service worker 注册失败: ', err); }); } </script> <?php endif; ?> <script> function checkAuth() { $.ajax({ type: "POST", url: "<?php getIsLogin(); ?>", data: { action: 'find' }, dataType: "json", success: function(res) { $('.need-login').toggle(res.code === 1); <?php if(Bsoptions('Login_hidden') == true): ?> if(res.code === 1) { if(res.group === 'administrator' || res.group === 'editor') { $('#bs-islogin').html( `<a href="${res.url}" class="sm-nav-link" pjax="no"> <?php _e('进入管理中心'); ?> </a>` ).fadeIn(); } <?php if(Bsoptions('UserCenterOpen')): ?> $('#bs-islogin2').html( `<a href="<?= $this->options->siteUrl() ?>usercenter" class="sm-nav-link" pjax="no"> <?php _e('进入用户中心'); ?> </a>` ).fadeIn(); <?php endif; ?> $('#bs-login').hide(); } else { $('#bs-islogin, #bs-islogin2').hide(); $('#bs-login').fadeIn(); } <?php endif;?> }, error: function() { toastr.warning('状态检测失败'); } }); } $(document).on('pjax:complete', checkAuth); $(function() { checkAuth(); const interval = 300000; let timer = setInterval(checkAuth, interval); $(window).blur(() => clearInterval(timer)); $(window).focus(() => { checkAuth(); timer = setInterval(checkAuth, interval); }); }); window.article_element = '<?php switch(Bsoptions('Article_forma')){ case '1': default: echo '.pic-article-card'; break; case '2': echo '.simple-article-item'; break; }?> '; </script> <?php if((Bsoptions('menu_style') !== "3") && Bsoptions('menu_tem') == "2" || Bsoptions('menu_tem') == ""):?> <script src="<?php AssetsDir();?>assets/vendors/menu/menu.min.js"></script> <script> const bearnavbar = new SmartMenus(document.querySelector('#bearnavbar'), { dropdownsShowTrigger: 'mouseover', dropdownsHideTrigger: 'mouseout', dropdownsHideTimeout: '200' }); <?php if(Bsoptions('menu_NewtemSticky') == true):?> window.addEventListener('scroll', function() { var navbar = document.getElementById('bearnavbar'); var scroll = window.scrollY; if (scroll > 0) { navbar.classList.add('fixed-top'); } else { navbar.classList.remove('fixed-top'); } }); <?php endif; ?> </script> <?php endif; ?> <?php if(Bsoptions('Scroll') == true): ?> <!--目录树TOC--> <script src="<?php AssetsDir();?>assets/vendors/bs-toc/bs-toc.min.js" type="text/javascript"></script> <?php if(Bsoptions('Readmode') == true): ?> <script src="<?php AssetsDir();?>assets/vendors/bs-toc/bs-toc2.min.js" type="text/javascript"></script> <?php endif; ?> <script> window.tocManager.displayDisableTocTips = false; window.tocManager.generateToc(); <?php if(Bsoptions('Readmode') == true): ?> window.tocManagerRead.displayDisableTocTips2 = true; window.tocManagerRead.generateToc2(); <?php endif; ?> </script> <!-- end --> <?php endif; ?> <?php if(Bsoptions('Lightbox') == true) :?> <script src="<?php AssetsDir();?>assets/vendors/fancybox/fancybox.umd.min.js"></script> <?php endif; ?> <?php if(Bsoptions('MathJax') == true):?> <script src="<?php AssetsDir();?>assets/vendors/mathjax-v3/tex-chtml.js" defer></script> <script> MathJax = { tex: { inlineMath: [['$', '$'], ['\$', '\$']] }, options: { enableFontLoading: true, enableMenu: false, skipHtmlTags: ['script', 'noscript', 'style', 'textarea', 'pre'], ignoreHtmlClass: 'tex2jax_ignore' }, startup: { pageReady: () => MathJax.startup.defaultPageReady() } }; </script> <?php endif; ?> <?php if (Bsoptions('Mermaid') == true): ?> <style id="mermaid-loading-style"> .mermaid-loading { position: relative; min-height: 100px; background: #f8f9fa; border-radius: 4px; margin: 1rem 0; } .mermaid-loading::before { content: "图表加载中..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: 6c757d; font-size: 0.9em; } @keyframes ripplePulse { 0% { transform: translate(-50%, -50%) scale(0.8); opacity: 0.6; } 50% { transform: translate(-50%, -50%) scale(1.2); opacity: 1; } 100% { transform: translate(-50%, -50%) scale(0.8); opacity: 0.6; } } </style> <script> (function() { var mermaidAsset = '<?php AssetsDir(); ?>assets/vendors/mermaid/mermaid.min.js'; var isLoaded = false; var styleAdded = false; function addLoadingState() { if (!styleAdded) { document.getElementById('mermaid-loading-style').disabled = false; styleAdded = true; } document.querySelectorAll('.mermaid').forEach(el => { if (!el.classList.contains('processing')) { el.classList.add('mermaid-loading', 'processing'); } }); } function removeLoadingState() { document.querySelectorAll('.mermaid.processing').forEach(el => { el.classList.remove('mermaid-loading', 'processing'); el.removeAttribute('aria-live'); el.removeAttribute('aria-label'); }); } function initMermaid() { try { mermaid.init(undefined, document.querySelectorAll('.mermaid')); document.dispatchEvent(new CustomEvent('mermaidRendered')); } catch(e) { console.error('Mermaid initialization failed:', e); document.querySelectorAll('.mermaid.processing').forEach(el => { el.innerHTML = '<div class="mermaid-error">图表渲染失败,请刷新页面</div>'; }); } } function loadMermaid() { if (isLoaded) { initMermaid(); return; } addLoadingState(); var script = document.createElement('script'); script.src = mermaidAsset; script.onload = function() { mermaid.initialize({ startOnLoad: false, securityLevel: 'loose' }); initMermaid(); removeLoadingState(); isLoaded = true; }; script.onerror = function() { removeLoadingState(); document.querySelectorAll('.mermaid').forEach(el => { el.innerHTML = '<div class="mermaid-error">图表库加载失败,请检查网络</div>'; }); }; document.head.appendChild(script); } function checkMermaid() { if (document.querySelector('.mermaid')) { loadMermaid(); } else { document.getElementById('mermaid-loading-style').disabled = true; } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', checkMermaid); } else { setTimeout(checkMermaid, 100); } <?php if (Bsoptions('Pjax') == true) : ?> $(document) .on('pjax:send', function() { removeLoadingState(); }) .on('pjax:complete', function() { setTimeout(() => { checkMermaid(); document.addEventListener('mermaidRendered', () => { window.scrollBy(0, 1); }); }, 200); }); <?php endif; ?> })(); </script> <?php endif; ?> <!-- 引入Pjax --> <?php if(Bsoptions('Pjax') == true) :?> <script src="<?php AssetsDir();?>assets/js/jquery.pjax.js"></script> <?php endif;?> <script src="<?php AssetsDir();?>assets/js/qrcode.min.js"></script> <!-- 引入全局控制 --> <script type="text/javascript" src="<?php AssetsDir();?>assets/vendors/fomantic-ui/semantic.min.js?v=4" defer></script> <script src="<?php AssetsDir();?>assets/js/funlazy.min.js?v=1"></script> <script type="text/javascript" src="<?php AssetsDir();?>assets/js/app.bundle.min.js?v=<?php echo themeVersion(); ?>" defer></script> <?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== ''): ?> <script src="<?php AssetsDir();?>assets/vendors/aiTool/ai.min.js" defer></script> <?php endif;?> <script type="module" src="<?php AssetsDir();?>assets/js/emaction.js?v=1" defer></script> <?php if(Bsoptions('Codehightlight') == 1) : ?> <script type="text/javascript"> if (!window.prismLoaded) { window.prismLoaded = true; var script = document.createElement('script'); script.src = '<?= $this->options->themeUrl ?>/modules/codehightlight/static/prism.js?v=3'; script.onload = initPrism; document.head.appendChild(script); } else if (window.Prism) { initPrism(); } function initPrism() { const showLineNumber = <?= Bsoptions('showLineNumber') == 1 ? 'true' : 'false' ?>; const preElements = document.querySelectorAll('pre'); preElements.forEach(pre => { let code = pre.querySelector('code'); if (!code) return; const hasLanguageClass = pre.className.match(/\blanguage-\w+\b/) || code.className.match(/\blanguage-\w+\b/); if (!hasLanguageClass) { pre.classList.add('language-plaintext'); } pre.className = pre.className.replace(/\b(line-numbers)\b/g, '').trim(); if (showLineNumber) { pre.classList.add('line-numbers'); } pre.classList.add('prism'); code.classList.add('prism'); }); if (typeof Prism !== 'undefined') { Prism.highlightAll(); } } $(document).on('pjax:complete', initPrism); </script> <?php endif; ?> <?php if(Bsoptions('Pjax') == true) :?> <script> $(document).on('pjax:complete', function () { <?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== '' && (Bsoptions('AIService_Blacklist') == '' || Bsoptions('AIService_Blacklist_Page') == '')): ?> if ($('#post-content').length) { tianliGPT(!0); } <?php endif;?> <?php if((Bsoptions('menu_style') !== "3") && Bsoptions('menu_tem') == "2" || Bsoptions('menu_tem') == ""):?> const bearnavbar = new SmartMenus(document.querySelector('#bearnavbar'), { dropdownsShowTrigger: 'mouseover', dropdownsHideTrigger: 'mouseout', dropdownsHideTimeout: '200' }); <?php if(Bsoptions('AIService') == true && Bsoptions('AIService_Key') !== '' && (Bsoptions('AIService_Blacklist') == '' || Bsoptions('AIService_Blacklist_Page') == '')): ?> if ($('#post-content').length) { $(document).on('pjax:success', function () { tianliGPTIsRunning=!1; }); } window.history.onpushstate=function(t){tianliGPT(!0)}; <?php endif;?> <?php endif;?> if (document.getElementById('echarts_pie')) EchartsInit(); <?php if(Bsoptions('CustomizationFooterJsPjaxCode')): ?><?php echo Bsoptions('CustomizationFooterJsPjaxCode'); ?><?php endif; ?> <?php if(Bsoptions('Scroll') == true): ?> window.tocManager.displayDisableTocTips = false; window.tocManager.generateToc(); <?php if(Bsoptions('Readmode') == true): ?> window.tocManagerRead.displayDisableTocTips2 = true; window.tocManagerRead.generateToc2(); <?php endif; ?> <?php endif; ?> }); </script> <?php endif; ?> <?php if(Bsoptions('CommentTyping') == true) :?> <script type="text/javascript" src="<?php AssetsDir();?>assets/js/commentTyping.js"></script> <?php endif; ?> <?php $this->footer(); ?> <?php if(Bsoptions('CustomizationFooterJsCode')): ?><?php echo Bsoptions('CustomizationFooterJsCode'); ?><?php endif; ?> <script src="<?php AssetsDir();?>assets/js/instantPage.js" type="module"></script> </body> <!-- 微信二维码弹窗 --> <div id="wechat-popup" class="popup-overlay"> <div class="popup-card"> <span class="popup-close">×</span> <img src="<?php echo Bsoptions('Wechat_QRCODE') ?>" alt="微信二维码" class="popup-qr"> <p>微信扫码联系我</p> </div> </div> <!-- QQ二维码弹窗 --> <div id="qq-popup" class="popup-overlay"> <div class="popup-card"> <span class="popup-close">×</span> <img src="<?php echo Bsoptions('QQ_QRCODE') ?>" alt="QQ二维码" class="popup-qr"> <p>QQ扫码联系我</p> </div> </div> </html> <?php if(Bsoptions('Compress') == true) :?> <?php $html_source = ob_get_contents(); ob_clean(); print compressHtml($html_source); ob_end_flush(); ?> <?php endif; ?> ================================================ FILE: compoment/head.php ================================================ <?php if (!defined('__TYPECHO_ROOT_DIR__')) exit;?> <?php ob_clean(); $seo_description = ''; $keywords = ''; $seo_description = Helper::options()->description; if($this->is('single') && $this->fields->seo_dec !== ''){ $seo_description = $this->fields->seo_dec; } if($this->is('category') && $this->getDescription() !== NULL){ $seo_description = $this->getDescription(); } if(Bsoptions('keywords_hide') == true){ $keywords = '&keywords=0'; } if(empty(Bsoptions('IframeProtect')) || Bsoptions('IframeProtect') !== '1'){ switch(Bsoptions('IframeProtect')){ case '2': header('X-Frame-Options:SAMEORIGIN'); break; case '3': header('X-Frame-Options:DENY'); break; } } session_start(); ?> <!DOCTYPE html> <html lang="zh-CN" data-theme="light"<?php if (Bsoptions('Mournmode') == true): ?> class="gray"<?php endif; ?>> <head> <meta name="referrer" content="unsafe-url"> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1"> <?php if(is_https()):?> <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> <?php endif; ?> <meta name="renderer" content="webkit"> <?php if (Bsoptions('DNSYJX') == true): ?> <meta http-equiv="x-dns-prefetch-control" content="on"> <?php foreach(Bsoptions('DNSYJX_AR') as $dnsyjx): ?> <?php if($dnsyjx['DNSADDRESS_Preconnect'] == true):?> <link rel="preconnect" href="<?php echo $dnsyjx['DNSADDRESS'] ?>" <?php if($dnsyjx['DNSADDRESS_Crossorign'] == true):?>crossorign<?php endif; ?>> <?php endif; ?> <link rel="dns-prefetch" href="<?php echo $dnsyjx['DNSADDRESS'] ?>"> <?php endforeach; ?> <?php endif; ?> <?php if (Bsoptions('DNSYJX') == '' || Bsoptions('DNSYJX') == false): ?> <meta http-equiv="x-dns-prefetch-control" content="off"> <?php endif; ?> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no, viewport-fit=cover" /> <?php if(Bsoptions('favicon') !== ''): ?> <link rel="shortcut icon" href="<?php echo Bsoptions('favicon') ?>" /> <?php endif; ?> <title><?php getTitle($this); ?> is('post') || $this->is('page')): ?> is('index')): ?> options->siteUrl . ltrim($_SERVER['REQUEST_URI'], '/'); $currentUrl = preg_replace('/([^:])\/\//', '$1/', $currentUrl); ?> header('commentReply=1&description='.$keywords.'&pingback=0&xmlrpc=0&wlw=0&generator=&template=&atom='); ?> oncontextmenu='return false' ondragstart='return false' onselectstart ='return false' onselect='document.selection.empty()' oncopy='document.selection.empty()' onbeforecopy='return false' data-instant-allow-external-links>
    header('commentReply=1&description=0&keywords=0&generator=0&template=0&pingback=0&xmlrpc=0&wlw=0&rss2=0&rss1=0&antiSpam=0&atom'); ?>
    ================================================ FILE: compoment/sidebar.php ================================================ need('pages/sidebar.php'); ?> is('single')): ?> ================================================ FILE: core/assetsdir.php ================================================ themeUrl.'/'; } else if($options1['Assets'] == '2'){ $dir = 'https://deliver.application.pub/gh/whitebearcode/typecho-bearsimple@v'.themeVersionOnly().'/'; } else{ $dir = $options1['Assets_Custom']; } echo $dir; } function AssetsDir2(){ $options = Helper::options(); $dir = $options->themeUrl.'/'; echo $dir; } function AssetsDir_Backend(){ $options1 = bsOptions::getInstance()::get_option( 'bearsimple' ); $options = Helper::options(); if($options1['Assets'] == '1' || $options1['Assets'] == null){ $dir = $options->themeUrl.'/'; } else if($options1['Assets'] == '2'){ $dir = 'https://deliver.application.pub/gh/whitebearcode/typecho-bearsimple@v'.themeVersionOnly().'/'; } else{ $dir = $options1['Assets_Custom']; } return $dir; } ================================================ FILE: core/compresshtml.php ================================================ -->.*?|.*?<\/nocompress>||||
    .*?<\/div>)/msi', $html_source, -1, PREG_SPLIT_DELIM_CAPTURE); $compress = ''; foreach ($chunks as $c) { if (strtolower(substr($c, 0, 19)) == '') { $c = substr($c, 19, strlen($c) - 19 - 20); $compress .= $c; continue; } else if (strtolower(substr($c, 0, 12)) == '') { $c = substr($c, 12, strlen($c) - 12 - 13); $compress .= $c; continue; } else if (strtolower(substr($c, 0, 4)) == ' $char) { if ($char == '"' && $chars[$key - 1] != '\\' && !$is_apos) { $is_quot = !$is_quot; } else if ($char == '\'' && $chars[$key - 1] != '\\' && !$is_quot) { $is_apos = !$is_apos; } else if ($char == '/' && $chars[$key + 1] == '/' && !$is_quot && !$is_apos) { $tmp = substr($tmp, 0, $key); break; } } } $c .= $tmp; } } $c = preg_replace('/[\\n\\r\\t]+/', ' ', $c); $c = preg_replace('/\\s{2,}/', ' ', $c); $c = preg_replace('/>\\s <', $c); $c = preg_replace('/\\/\\*.*?\\*\\//i', '', $c); $c = preg_replace('//', '', $c); $compress .= $c; } return $compress; } ================================================ FILE: core/curl.php ================================================ cookie_jar = mb_convert_encoding(__DIR__, "GBK", "UTF-8") . DIRECTORY_SEPARATOR . 'cookie.txt'; $this->options= [ CURLOPT_HEADER => true, // 输出响应头 CURLOPT_TIMEOUT=> 5,// 超时 秒 CURLOPT_RETURNTRANSFER => true, // 输出数据流 CURLOPT_FOLLOWLOCATION => true, // 自动跳转追踪 CURLOPT_AUTOREFERER=> true, // 自动设置来路信息 CURLOPT_SSL_VERIFYPEER => false,// 认证证书检查 CURLOPT_SSL_VERIFYHOST => false,// 检查SSL加密算法 CURLOPT_NOSIGNAL => true, // 忽略所有传递的信号 CURLOPT_HTTPHEADER => [], // 请求头 CURLINFO_HEADER_OUT=> true, // 获取请求头 CURLOPT_ENCODING => 'gzip' ]; } public static function __callStatic ($method, $args) { if (self::$instance === null) self::$instance = new self(); return self::$instance->$method(...$args); } public function __call ($method, $args) { switch ($method) { case 'autoCookie': // Cookie自动化,默认关闭 if (@$args[0]) { $this->options[CURLOPT_COOKIEFILE] = $this->cookie_jar; $this->options[CURLOPT_COOKIEJAR]= $this->cookie_jar; } break; case 'timeout': if (isset($args[0])) $this->options[CURLOPT_TIMEOUT] = $args[0]; break; case 'location': // 自动重定向,默认开启 if (isset($args[0])) $this->options[CURLOPT_FOLLOWLOCATION] = $args[0]; break; case 'get': if (isset($args[0])) { $data = isset($args[1]) ? is_array($args[1]) ? http_build_query($args[1], '', '&', PHP_QUERY_RFC3986) : $args[1] : false; $this->options[CURLOPT_URL] = $data !== false ? $args[0] . (preg_match('/\?/', $args[0]) ? '&' : '?') . $data : $args[0]; } break; case 'upload': if (isset($args[0])) { $this->options[CURLOPT_URL]= $args[0]; $this->options[CURLOPT_POST] = true; if (isset($args[1])) $this->options[CURLOPT_POSTFIELDS] = $args[1]; } break; case 'post': if (isset($args[0])) { $this->options[CURLOPT_URL]= $args[0]; $this->options[CURLOPT_POST] = true; if (isset($args[1])) $this->options[CURLOPT_POSTFIELDS] = is_array($args[1]) ? http_build_query($args[1], '', '&', PHP_QUERY_RFC3986) : $args[1]; } break; case 'json': if (isset($args[0])) { $this->options[CURLOPT_URL]= $args[0]; $this->options[CURLOPT_POST] = true; $this->options[CURLOPT_HTTPHEADER][] = 'Content-Type: application/json; charset=utf-8'; if (!empty(@$args[1])) $this->options[CURLOPT_POSTFIELDS] = is_array($args[1]) ? json_encode($args[1], 256) : $args[1]; } break; case 'ua': if (isset($args[0])) { if (in_array(strtolower($args[0]), ['m', 'wap', 'android'])) $args[0] = self::ua_android; else if (strtolower($args[0]) === 'pc') $args[0] = self::ua_pc; else if (strtolower($args[0]) === 'audo') $args[0] = @$_SERVER['HTTP_USER_AGENT']; $this->options[CURLOPT_USERAGENT] = $args[0]; } break; case 'referer': if (isset($args[0])) $this->options[CURLOPT_REFERER] = $args[0] === true && !empty(@$this->options[CURLOPT_URL]) ? $this->options[CURLOPT_URL] : $args[0]; break; case 'header': // 来路 if (isset($args[0])) { if (is_array($args[0])) { // 数组键值对形式 foreach ($args[0] as $k => $v) $this->options[CURLOPT_HTTPHEADER][] = $k . ': ' . $v; } else if (isset($args[1])) { // 双参数键值形式 $this->options[CURLOPT_HTTPHEADER][] = $args[0] . ': ' . $args[1]; } else { // 单参数形式 $arr = preg_match_all('/([^:]*?)\s*:\s*(.*)\s*/', $args[0], $m) > 0 ? array_combine($m[1], $m[2]) : []; foreach ($arr as $k => $v) $this->options[CURLOPT_HTTPHEADER][] = $k . ': ' . $v; } } break; case 'cookie': if (isset($args[0])) { if (is_array($args[0])) { // 数组键值对形式 $arr = []; foreach ($args[0] as $k => $v) $arr[] = $k . '=' . $v; $cookie = implode('; ', $arr); } else if (isset($args[1])) // 双参数键值形式 $cookie = $args[0] . '=' . $args[1] . ';'; else // 单参数形式 $cookie = $args[0]; $this->options[CURLOPT_COOKIE] = !empty(@$this->options[CURLOPT_COOKIE]) ? $this->options[CURLOPT_COOKIE] . (preg_match('/;\s*$/', $this->options[CURLOPT_COOKIE]) ? '' : '; ') . $cookie : $cookie; } break; case 'ajax': if (isset($args[0]) && $args[0] === true) $this->options[CURLOPT_HTTPHEADER][] = 'X-Requested-With: XMLHttpRequest'; break; case 'getCookie': // 读取Cookie文件中的cookie $url= isset($args[0]) && filter_var($args[0], FILTER_VALIDATE_URL) ? $args[0] : $this->options[CURLOPT_URL]; $cookie = @file_get_contents($this->cookie_jar); $arr= parse_url($url); $host = preg_replace('/.*?\.(?=.+\..+$)/', '', $arr['host']); $p= preg_match_all('/' . preg_quote($host, '/') . '(?:\s+([^\s\r\n]+))(?:\s+([^\s\r\n]+))(?:\s+([^\s\r\n]+))(?:\s+([^\s\r\n]+))(?:\s+([^\s\r\n]+))(?:\s+([^\s\r\n]+))(?:\r*\n|$)/', rawurldecode($cookie), $m); return $p > 0 ? array_combine($m[5], $m[6]) : []; case 'head': // 获取响应头,默认不需要响应体,false表示需要 $this->options[CURLOPT_HEADER] = true; $this->options[CURLOPT_NOBODY] = true; return $this->request($method, $args); case 'html': case 'obj': case 'xml': case 'text': case 'body': case 'arrayobject': case 'jsonobject': case 'response': case 'all': return $this->request($method, $args); case 'down': $this->options[CURLOPT_HEADER] = false; $this->options[CURLOPT_NOBODY] = false; $this->options[CURLOPT_FOLLOWLOCATION] = true; return $this->request($method, $args); default: exit("错误:不支持{$method}方法!"); } return $this; } //执行请求(get, post)并返回数据 private function request ($method, $args) { $ch = curl_init(); curl_setopt_array($ch, $this->options); $data = curl_exec($ch); $info = curl_getinfo($ch); curl_close($ch); if ($method === 'down') { if (isset($args[1])) $file = trim($args[0]) . DIRECTORY_SEPARATOR . trim($args[1]); else if (isset($args[0])) $file = trim($args[0]); else $file = './' . pathinfo($this->options[CURLOPT_URL], PATHINFO_BASENAME); try { $fo = fopen($file, 'a'); fwrite($fo, $data); fclose($fo); return true; } catch (\Exception $e) { return $e->getMessage(); } } $info['header'] = trim(substr($data, 0, $info['header_size'])); $info['response'] = substr($data, $info['header_size']); $headers = [$info['http_code']]; $p = preg_match_all('/(?<=^|[\r\n])\s*([^:]+)\s*:\s*(.+?)\s*(?=[\r\n]|$)/', $info['header'], $n); $info['headers'] = $p > 0 ? array_merge_recursive($headers, $this->array_combine_recursive($n[1], $n[2])) : []; $cookies = isset($info['headers']['Set-Cookie']) ? $info['headers']['Set-Cookie'] : @$info['headers']['set-cookie']; $info['cookies'] = !empty($cookies) ? $this->parse_cookie(is_array($cookies) ? $cookies : [$cookies]) : []; $info['cookie']= !empty($info['cookies']) ? array_column($info['cookies'], 'value', 'key') : []; $info['obj'] = ($obj = json_decode($info['response'])) && is_object($obj) ? $obj : null; $result = $info['response']; switch ($method) { case 'head': $result = $info[@$args[0] ? 'header' : 'headers']; break; case 'getCookie': $result = $info['cookie']; break; case 'text': case 'body': case 'response': case 'html': $result = $info['response']; if (isset($args[0])) $result = mb_convert_encoding($result, 'UTF-8', $args[0]); if ($method === 'html') $result = html_entity_decode($result); break; case 'obj': $result = json_decode($info['response'], @$args[0] === true); break; case 'jsonobject': case 'arrayobject': $result = json_decode($info['response'],true); break; case 'xml': $result = simplexml_load_string($info['response'], 'SimpleXMLElement', LIBXML_NOCDATA); break; case 'all': $result = isset($args[0]) ? @$info[$args[0]] : $info; break; } self::$instance = null; return $result; } private function array_combine_recursive ($keys, $values) { $arr = []; foreach ($keys as $i => $key) { $value = isset($values[$i]) ? $values[$i] : null; if (!isset($arr[$key])) $arr[$key] = $value; else if (is_array($arr[$key])) $arr[$key][] = $value; else $arr[$key] = [$arr[$key], $value]; } return $arr; } private function parse_cookie ($header) { $parse_cookie_str = function ($str) { $p= preg_match_all('/(?<=^|;)\s*([^=]+?)\s*=\s*(.*?)\s*(?=;|$)/', $str, $m); $i= 0; $cookie = []; while ($i < $p) { if ($i === 0) { $cookie['key'] = $m[1][$i]; $cookie['value'] = $m[2][$i]; } else if ($m[1][$i] === 'expires') { $d = date_create($m[2][$i], timezone_open("Asia/Shanghai")); $timestamp = $d->getTimestamp(); $cookie[$m[1][$i]] = $timestamp; } else $cookie[$m[1][$i]] = $m[2][$i]; $i++; } return $cookie; }; $cookies = []; if (is_array($header)) { foreach ($header as $cookie) { $cookie = $parse_cookie_str($cookie); if (!empty($cookie)) $cookies[$cookie['key']] = $cookie; } } else if (is_string($header)) { $p = preg_match_all('/(?<=^|[\r\n])\s*Set-Cookie\s*:\s*(.+?)(?=[\r\n]|$)/i', $header, $m); $i = 0; while ($i < $p) { $cookie = $parse_cookie_str($m[1][$i]); if (!empty($cookie)) $cookies[$cookie['key']] = $cookie; $i++; } } return $cookies; } } ================================================ FILE: core/extend/ChinesePinyin.class.php ================================================ ChineseCharacters = file_get_contents(dirname(__FILE__).'/pinyin.lang'); } public function TransformWithTone($input_char,$delimiter=' ',$outside_ignore=false){ $input_len = mb_strlen($input_char,$this->charset); $output_char = ''; for($i=0;$i<$input_len;$i++){ $word = mb_substr($input_char,$i,1,$this->charset); if(preg_match('/^[\x{4e00}-\x{9fa5}]$/u',$word) && preg_match('/\,'.preg_quote($word).'(.*?)\,/',$this->ChineseCharacters,$matches) ){ $output_char.=$matches[1].$delimiter; }else if(!$outside_ignore){ $output_char.=$word; } } return $output_char; } } ================================================ FILE: core/extend/Comments.php ================================================ parameter->setDefault('parentId=0&commentPage=0&commentsNum=0&allowComment=1'); Typecho_Widget::widget('Widget_Security')->to($this->_security); /** 初始化回调函数 */ if (function_exists('threadedComments')) { $this->_customThreadedCommentsCallback = true; } } public static function formatProvince(string $province) : string { if(empty($province)) { return ''; } $checkArr = ["省","市","自治区","特别行政区"]; for($i = 0; $i < count($checkArr); $i++) { if(strpos($province, $checkArr[$i]) === false) { continue; } else { $province = mb_strcut($province, 0, strrpos($province, $checkArr[$i])); } } return $province; } public static function GetAddress($ip){ $IPlo = new IpLocation; if(empty($IPlo::getLocation($ip)['province'])){ return $IPlo::getLocation($ip)['country']; } else{ return self::formatProvince($IPlo::getLocation($ip)['province']); } } public static function getIpInfo($ip){ $url = 'https://ip.zxinc.org/api.php?type=json&ip='.$ip; $headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0'; foreach( $headers as $n => $v ) { $headerArr[] = $n .':' . $v; } $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,3); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt ($ch, CURLOPT_HTTPHEADER , $headerArr ); $handles = curl_exec($ch); curl_close($ch); $info = json_decode($handles,true)['data']['country']; return $info; } public static function getLocation($comments) { $databaseFile = __DIR__.'/vendor/maxmind-db/GeoLite2-City.mmdb'; $db = \Typecho\Db::get(); $prefix = $db->getPrefix(); $coid = $comments->coid; $data = $db->fetchRow($db->select()->from('table.bscore_iplocation_data')->where('coid = ?', $coid)); if(!$data['location']){ if (!filter_var($comments->ip, FILTER_VALIDATE_IP)) { $location = "外星来客"; } else{ $reader = new Reader($databaseFile); $ipAddress = $comments->ip; $record = $reader->get($ipAddress); $location = ($record['country']['names']['zh-CN'] ?? '未知').($record['subdivisions'][0]['names']['zh-CN'] ?? '').($record['city']['names']['zh-CN'] ?? ''); $reader->close(); } } else{ $location = $data['location']; } echo $location; } public static function updateLocation(int $coid, $location,$type) { $db = \Typecho\Db::get(); $location = is_array($location) ? serialize($location) : $location; $result = $db->fetchAll($db->select('coid')->from('table.comments')->where('table.comments.coid = ?', $coid)); if (is_array($result) && count($result) && $type== 'ipv6') { $updateQuery = $db->update('table.comments')->rows(array('ipv6_location' => $location))->where('coid = ?', $coid); return $db->query($updateQuery) > 0; } if (is_array($result) && count($result) && $type== 'ipv4') { $updateQuery = $db->update('table.comments')->rows(array('ipv4_location' => $location))->where('coid = ?', $coid); return $db->query($updateQuery) > 0; } return false; } public function commentRank($i){ $db=\Typecho\Db::get(); $mail=$db->fetchAll($db->select(array('COUNT(cid)'=>'all'))->from('table.comments')->where('mail = ?', $i->mail)->where('authorId = ?','0')); foreach ($mail as $sl){ $all=$sl['all'];} if($i->authorId == $i->ownerId){ echo '
    博主
    '; } else if($all<10 && $all>0) { echo '
    LV1
    '; }elseif ($all<20 && $all>=10) { echo '
    LV2
    '; }elseif ($all<40 && $all>=20) { echo '
    LV3
    '; }elseif ($all<80 && $all>=40) { echo '
    LV4
    '; }elseif ($all<100 && $all>=80) { echo '
    LV5
    '; }elseif ($all>=100) { echo '
    LV6
    '; } } /** * 评论回调函数 * * @access private * @return void */ private function threadedCommentsCallback() { $singleCommentOptions = $this->_singleCommentOptions; if (function_exists('threadedComments')) { return threadedComments($this, $singleCommentOptions); } if(Bsoptions('emaction_Openplace') && in_array('2',Bsoptions('emaction_Openplace'))&& Bsoptions('emaction_Closelike') == true){ $emaction = true; } else{ $emaction = false; } ?>
    user->hasLogin() && $this->status == 'waiting') { echo '
    待审核
    '; }?>
    style="margin-left:10px">
    commentRank($this); ?> agent,'comment'); ?> getParent(); ?>
    content,'comment'); ?>
    content,'comment'); ?>
    style="margin-left:-40px"> reply($singleCommentOptions->replyWord); ?> children) { ?>展开子评论(children);?>条) hidden?array('agree' => 0, 'recording' => true):agreeNumforcomment($this->coid);?>
    children) { ?>
    fetchRow($db->select('parent')->from('table.comments')->where('coid = ?', $this->coid)); $parentID=$parentID['parent']; if($parentID=='0'){ return '';} else { $author=$db->fetchRow($db->select()->from('table.comments')->where('coid = ?', $parentID)); if (empty($author['author']) ||!array_key_exists('author', $author) ) $author['author'] = '已删除的评论'; return ' '.$author['author'].' '; } } /** * 获取当前评论链接 * * @access protected * @return string */ protected function ___permalink() : string { if ($this->options->commentsPageBreak) { $pageRow = array('permalink' => $this->parentContent['pathinfo'], 'commentPage' => $this->_currentPage); return Typecho_Router::url('comment_page', $pageRow, $this->options->index) . '#' . $this->theId; } return $this->parentContent['permalink'] . '#' . $this->theId; } /** * 子评论 * * @access protected * @return array */ protected function ___children() { return $this->options->commentsThreaded && !$this->isTopLevel && isset($this->_threadedComments[$this->coid]) ? $this->_threadedComments[$this->coid] : array(); } /** * 是否到达顶层 * * @access protected * @return boolean */ protected function ___isTopLevel() { return $this->levels > 0; } /** * 重载内容获取 * * @access protected * @return void */ protected function ___parentContent(): Array { return $this->parameter->parentContent; } /** * 输出文章评论数 * * @access public * @param string $string 评论数格式化数据 * @return void */ public function num() { $args = func_get_args(); if (!$args) { $args[] = '%d'; } $num = intval($this->_total); echo sprintf(isset($args[$num]) ? $args[$num] : array_pop($args), $num); } /** * 执行函数 * * @access public * @return void */ public function execute() { if (!$this->parameter->parentId) { return; } $commentsAuthor = Typecho_Cookie::get('__typecho_remember_author'); $commentsMail = Typecho_Cookie::get('__typecho_remember_mail'); // 对已登录用户显示待审核评论,方便前台管理 if ($this->user->hasLogin()) { $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId) ->where('table.comments.status = ? OR table.comments.status = ?', 'approved', 'waiting'); } else { $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId) ->where('table.comments.status = ? OR (table.comments.author = ? AND table.comments.mail = ? AND table.comments.status = ?)', 'approved', $commentsAuthor, $commentsMail, 'waiting'); } $threadedSelect = NULL; if ($this->options->commentsShowCommentOnly) { $select->where('table.comments.type = ?', 'comment'); } $select->order('table.comments.coid', 'ASC'); $this->db->fetchAll($select, array($this, 'push')); /** 需要输出的评论列表 */ $outputComments = array(); /** 如果开启评论回复 */ if ($this->options->commentsThreaded) { foreach ($this->stack as $coid => &$comment) { /** 取出父节点 */ $parent = $comment['parent']; /** 如果存在父节点 */ if (0 != $parent && isset($this->stack[$parent])) { /** 如果当前节点深度大于最大深度, 则将其挂接在父节点上 */ if ($comment['levels'] >= 2) { $comment['levels'] = $this->stack[$parent]['levels']; $parent = $this->stack[$parent]['parent']; // 上上层节点 $comment['parent'] = $parent; } /** 计算子节点顺序 */ $comment['order'] = isset($this->_threadedComments[$parent]) ? count($this->_threadedComments[$parent]) + 1 : 1; /** 如果是子节点 */ $this->_threadedComments[$parent][$coid] = $comment; } else { $outputComments[$coid] = $comment; } } $this->stack = $outputComments; } /** 评论排序 */ if ('DESC' == $this->options->commentsOrder) { $this->stack = array_reverse($this->stack, true); } /** 评论总数 */ $this->_total = count($this->stack); /** 对评论进行分页 */ if ($this->options->commentsPageBreak) { if ('last' == $this->options->commentsPageDisplay && !$this->parameter->commentPage) { $this->_currentPage = ceil($this->_total / $this->options->commentsPageSize); } else { $this->_currentPage = $this->parameter->commentPage ? $this->parameter->commentPage : 1; } /** 截取评论 */ $this->stack = array_slice($this->stack, ($this->_currentPage - 1) * $this->options->commentsPageSize, $this->options->commentsPageSize); /** 评论置位 */ $this->row = current($this->stack); $this->length = count($this->stack); } reset($this->stack); } /** * 将每行的值压入堆栈 * * @access public * @param array $value 每行的值 * @return array */ public function push(array $value) : array { $value = $this->filter($value); /** 计算深度 */ if (0 != $value['parent'] && isset($this->stack[$value['parent']]['levels'])) { $value['levels'] = $this->stack[$value['parent']]['levels'] + 1; } else { $value['levels'] = 0; } $value['realParent'] = $value['parent']; /** 重载push函数,使用coid作为数组键值,便于索引 */ $this->stack[$value['coid']] = $value; $this->_commentAuthors[$value['coid']] = $value['author']; $this->length ++; return $value; } /** * 输出分页 * * @access public * @param string $prev 上一页文字 * @param string $next 下一页文字 * @param int $splitPage 分割范围 * @param string $splitWord 分割字符 * @param string $template 展现配置信息 * @return void */ public function pageNav($prev = '«', $next = '»', $splitPage = 3, $splitWord = '...', $template = '') { if ($this->options->commentsPageBreak && $this->_total > $this->options->commentsPageSize) { $default = array( 'wrapTag' => 'ol', 'wrapClass' => 'page-navigator' ); if (is_string($template)) { parse_str($template, $config); } else { $config = $template; } $template = array_merge($default, $config); $pageRow = $this->parameter->parentContent; $pageRow['permalink'] = $pageRow['pathinfo']; $query = Typecho_Router::url('comment_page', $pageRow, $this->options->index); /** 使用盒状分页 */ $nav = new Typecho_Widget_Helper_PageNavigator_Box($this->_total, $this->_currentPage, $this->options->commentsPageSize, $query); $nav->setPageHolder('commentPage'); $nav->setAnchor('comments'); echo '<' . $template['wrapTag'] . (empty($template['wrapClass']) ? '' : ' class="' . $template['wrapClass'] . '"') . '>'; $nav->render($prev, $next, $splitPage, $splitWord, $template); echo ''; } } /** * 递归输出评论 * * @access protected * @return void */ public function threadedComments() { $children = $this->children; if ($children) { //缓存变量便于还原 $tmp = $this->row; $this->sequence ++; //在子评论之前输出 echo $this->_singleCommentOptions->before; foreach ($children as $child) { $this->row = $child; $this->threadedCommentsCallback(); $this->row = $tmp; } //在子评论之后输出 echo $this->_singleCommentOptions->after; $this->sequence --; } } /** * 列出评论 * * @access private * @param mixed $singleCommentOptions 单个评论自定义选项 * @return void */ public function listComments($singleCommentOptions = NULL) { //初始化一些变量 $this->_singleCommentOptions = Typecho_Config::factory($singleCommentOptions); $this->_singleCommentOptions->setDefault(array( 'before' => '
      ', 'after' => '
    ', 'beforeAuthor' => '', 'afterAuthor' => '', 'beforeDate' => '', 'afterDate' => '', 'dateFormat' => $this->options->commentDateFormat, 'replyWord' => '回复', 'commentStatus' => '评论正等待审核!', 'avatarSize' => 32, 'defaultAvatar' => NULL )); $this->pluginHandle()->trigger($plugged)->listComments($this->_singleCommentOptions, $this); if (!$plugged) { if ($this->have()) { echo $this->_singleCommentOptions->before; while ($this->next()) { $this->threadedCommentsCallback(); } echo $this->_singleCommentOptions->after; } } } /** * 重载alt函数,以适应多级评论 * * @access public * @return void */ public function alt(...$args) { $args = func_get_args(); $num = func_num_args(); $sequence = $this->levels <= 0 ? $this->sequence : $this->order; $split = $sequence % $num; echo $args[(0 == $split ? $num : $split) -1]; } /** * 根据深度余数输出 * * @access public * @param string $param 需要输出的值 * @return void */ public function levelsAlt() { $args = func_get_args(); $num = func_num_args(); $split = $this->levels % $num; echo $args[(0 == $split ? $num : $split) -1]; } /** * 评论回复链接 * * @access public * @param string $word 回复链接文字 * @return void */ public function reply($word = '') { if ($this->options->commentsThreaded && $this->parameter->allowComment) { $word = empty($word) ? '回复' : $word; $this->pluginHandle()->trigger($plugged)->reply($word, $this); if (!$plugged) { echo '' . $word . ''; } } } /** * 取消评论回复链接 * * @access public * @param string $word 取消回复链接文字 * @return void */ public function cancelReply($word = '') { if ($this->options->commentsThreaded) { $word = empty($word) ? ' 取消回复' : $word; $this->pluginHandle()->trigger($plugged)->cancelReply($word, $this); if (!$plugged) { $replyId = $this->request->filter('int')->replyTo; echo ''; } } } } ================================================ FILE: core/extend/Comments_n.php ================================================ parameter->setDefault('parentId=0&commentPage=0&commentsNum=0&allowComment=1'); Typecho_Widget::widget('Widget_Security')->to($this->_security); /** 初始化回调函数 */ if (function_exists('threadedComments')) { $this->_customThreadedCommentsCallback = true; } } public static function formatProvince(string $province) : string { if(empty($province)) { return ''; } $checkArr = ["省","市","自治区","特别行政区"]; for($i = 0; $i < count($checkArr); $i++) { if(strpos($province, $checkArr[$i]) === false) { continue; } else { $province = mb_strcut($province, 0, strrpos($province, $checkArr[$i])); } } return $province; } public static function GetAddress($ip){ $IPlo = new IpLocation; if(empty($IPlo::getLocation($ip)['province'])){ return $IPlo::getLocation($ip)['country']; } else{ return self::formatProvince($IPlo::getLocation($ip)['province']); } } public function getIpInfo($ip){ $url = 'https://ip.zxinc.org/api.php?type=json&ip='.$ip; $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,3); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $handles = curl_exec($ch); curl_close($ch); $info = explode("\t",json_decode($handles,true)['data']['country']); $total = count($info); switch($total){ case 1: $info = self::formatProvince($info[0]); break; case 2: $info = self::formatProvince($info[1]); break; case 3: $info = self::formatProvince($info[1]); break; case 4: $info = self::formatProvince($info[1]); break; default:$info = self::formatProvince($info[0]); } return $info; } public static function getLocation($comments) { $databaseFile = __DIR__.'/vendor/maxmind-db/GeoLite2-City.mmdb'; $db = \Typecho\Db::get(); $prefix = $db->getPrefix(); $coid = $comments->coid; $data = $db->fetchRow($db->select()->from('table.bscore_iplocation_data')->where('coid = ?', $coid)); if(!$data['location']){ if (!filter_var($comments->ip, FILTER_VALIDATE_IP)) { $location = "外星来客"; } else{ $reader = new Reader($databaseFile); $ipAddress = $comments->ip; $record = $reader->get($ipAddress); $location = ($record['country']['names']['zh-CN'] ?? '未知').($record['subdivisions'][0]['names']['zh-CN'] ?? '').($record['city']['names']['zh-CN'] ?? ''); $reader->close(); } } else{ $location = $data['location']; } echo $location; } public static function updateLocation(int $coid, $location,$type) { $db = \Typecho\Db::get(); $location = is_array($location) ? serialize($location) : $location; $result = $db->fetchAll($db->select('coid')->from('table.comments')->where('table.comments.coid = ?', $coid)); if (is_array($result) && count($result) && $type== 'ipv6') { $updateQuery = $db->update('table.comments')->rows(array('ipv6_location' => $location))->where('coid = ?', $coid); return $db->query($updateQuery) > 0; } if (is_array($result) && count($result) && $type== 'ipv4') { $updateQuery = $db->update('table.comments')->rows(array('ipv4_location' => $location))->where('coid = ?', $coid); return $db->query($updateQuery) > 0; } return false; } public function commentRank($i){ $db=\Typecho\Db::get(); $mail=$db->fetchAll($db->select(array('COUNT(cid)'=>'all'))->from('table.comments')->where('mail = ?', $i->mail)->where('authorId = ?','0')); foreach ($mail as $sl){ $all=$sl['all'];} if($i->authorId == $i->ownerId){ echo '
    博主
    '; } else if($all<10 && $all>0) { echo '
    LV1
    '; }elseif ($all<20 && $all>=10) { echo '
    LV2
    '; }elseif ($all<40 && $all>=20) { echo '
    LV3
    '; }elseif ($all<80 && $all>=40) { echo '
    LV4
    '; }elseif ($all<100 && $all>=80) { echo '
    LV5
    '; }elseif ($all>=100) { echo '
    LV6
    '; } } /** * 评论回调函数 * * @access private * @return void */ private function threadedCommentsCallback() { $singleCommentOptions = $this->_singleCommentOptions; if (function_exists('threadedComments')) { return threadedComments($this, $singleCommentOptions); } if(Bsoptions('emaction_Openplace') && in_array('2',Bsoptions('emaction_Openplace'))&& Bsoptions('emaction_Closelike') == true){ $emaction = true; } else{ $emaction = false; } ?>
    user->hasLogin() && $this->status == 'waiting') { echo '
    待审核
    '; }?>
    style="margin-left:10px">
    commentRank($this); ?> agent,'comment'); ?> getParent(); ?>
    content,'comment'); ?>
    content,'comment'); ?>
    style="margin-left:-40px"> reply($singleCommentOptions->replyWord); ?> children) { ?>收起子评论 hidden?array('agree' => 0, 'recording' => true):agreeNumforcomment($this->coid);?>
    children) { ?>
    threadedComments(); ?>
    fetchRow($db->select('parent')->from('table.comments')->where('coid = ?', $this->coid)); $parentID=$parentID['parent']; if($parentID=='0'){ return '';} else { $author=$db->fetchRow($db->select()->from('table.comments')->where('coid = ?', $parentID)); if (empty($author['author']) ||!array_key_exists('author', $author) ) $author['author'] = '已删除的评论'; return ' '.$author['author'].' '; } } /** * 获取当前评论链接 * * @access protected * @return string */ protected function ___permalink(): string { if ($this->options->commentsPageBreak) { return Router::url( 'comment_page', $this, $this->options->index ) . '#' . $this->theId; } return $this->parentContent->permalink . '#' . $this->theId; } /** * 子评论 * * @access protected * @return array */ protected function ___children() { return $this->options->commentsThreaded && !$this->isTopLevel && isset($this->_threadedComments[$this->coid]) ? $this->_threadedComments[$this->coid] : array(); } /** * 是否到达顶层 * * @access protected * @return boolean */ protected function ___isTopLevel() { return $this->levels > 0; } /** * 重载内容获取 * * @access protected * @return void */ protected function ___parentContent(): Contents { return From::allocWithAlias($this->cid, ['cid' => $this->cid]); } /** * 输出文章评论数 * * @access public * @param string $string 评论数格式化数据 * @return void */ public function num() { $args = func_get_args(); if (!$args) { $args[] = '%d'; } $num = intval($this->_total); echo sprintf(isset($args[$num]) ? $args[$num] : array_pop($args), $num); } /** * 执行函数 * * @access public * @return void */ public function execute() { if (!$this->parameter->parentId) { return; } $commentsAuthor = Typecho_Cookie::get('__typecho_remember_author'); $commentsMail = Typecho_Cookie::get('__typecho_remember_mail'); // 对已登录用户显示待审核评论,方便前台管理 if ($this->user->hasLogin()) { $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId) ->where('table.comments.status = ? OR table.comments.status = ?', 'approved', 'waiting'); } else { $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId) ->where('table.comments.status = ? OR (table.comments.author = ? AND table.comments.mail = ? AND table.comments.status = ?)', 'approved', $commentsAuthor, $commentsMail, 'waiting'); } $threadedSelect = NULL; if ($this->options->commentsShowCommentOnly) { $select->where('table.comments.type = ?', 'comment'); } $select->order('table.comments.coid', 'ASC'); $this->db->fetchAll($select, array($this, 'push')); /** 需要输出的评论列表 */ $outputComments = array(); /** 如果开启评论回复 */ if ($this->options->commentsThreaded) { foreach ($this->stack as $coid => &$comment) { /** 取出父节点 */ $parent = $comment['parent']; /** 如果存在父节点 */ if (0 != $parent && isset($this->stack[$parent])) { /** 如果当前节点深度大于最大深度, 则将其挂接在父节点上 */ if ($comment['levels'] >= 2) { $comment['levels'] = $this->stack[$parent]['levels']; $parent = $this->stack[$parent]['parent']; // 上上层节点 $comment['parent'] = $parent; } /** 计算子节点顺序 */ $comment['order'] = isset($this->_threadedComments[$parent]) ? count($this->_threadedComments[$parent]) + 1 : 1; /** 如果是子节点 */ $this->_threadedComments[$parent][$coid] = $comment; } else { $outputComments[$coid] = $comment; } } $this->stack = $outputComments; } /** 评论排序 */ if ('DESC' == $this->options->commentsOrder) { $this->stack = array_reverse($this->stack, true); } /** 评论总数 */ $this->_total = count($this->stack); /** 对评论进行分页 */ if ($this->options->commentsPageBreak) { if ('last' == $this->options->commentsPageDisplay && !$this->parameter->commentPage) { $this->_currentPage = ceil($this->_total / $this->options->commentsPageSize); } else { $this->_currentPage = $this->parameter->commentPage ? $this->parameter->commentPage : 1; } /** 截取评论 */ $this->stack = array_slice($this->stack, ($this->_currentPage - 1) * $this->options->commentsPageSize, $this->options->commentsPageSize); /** 评论置位 */ $this->row = current($this->stack); $this->length = count($this->stack); } reset($this->stack); } /** * 将每行的值压入堆栈 * * @access public * @param array $value 每行的值 * @return array */ public function push(array $value) : array { $value = $this->filter($value); /** 计算深度 */ if (0 != $value['parent'] && isset($this->stack[$value['parent']]['levels'])) { $value['levels'] = $this->stack[$value['parent']]['levels'] + 1; } else { $value['levels'] = 0; } $value['realParent'] = $value['parent']; /** 重载push函数,使用coid作为数组键值,便于索引 */ $this->stack[$value['coid']] = $value; $this->_commentAuthors[$value['coid']] = $value['author']; $this->length ++; return $value; } /** * 输出分页 * * @access public * @param string $prev 上一页文字 * @param string $next 下一页文字 * @param int $splitPage 分割范围 * @param string $splitWord 分割字符 * @param string $template 展现配置信息 * @return void */ public function pageNav($prev = '«', $next = '»', $splitPage = 3, $splitWord = '...', $template = '') { if ($this->options->commentsPageBreak && $this->_total > $this->options->commentsPageSize) { $default = array( 'wrapTag' => 'ol', 'wrapClass' => 'page-navigator' ); if (is_string($template)) { parse_str($template, $config); } else { $config = $template; } $template = array_merge($default, $config); $pageRow = $this->parameter->parentContent; $pageRow['permalink'] = $pageRow['pathinfo']; $query = Typecho_Router::url('comment_page', $pageRow, $this->options->index); /** 使用盒状分页 */ $nav = new Typecho_Widget_Helper_PageNavigator_Box($this->_total, $this->_currentPage, $this->options->commentsPageSize, $query); $nav->setPageHolder('commentPage'); $nav->setAnchor('comments'); echo '<' . $template['wrapTag'] . (empty($template['wrapClass']) ? '' : ' class="' . $template['wrapClass'] . '"') . '>'; $nav->render($prev, $next, $splitPage, $splitWord, $template); echo ''; } } /** * 递归输出评论 * * @access protected * @return void */ public function threadedComments() { $children = $this->children; if ($children) { //缓存变量便于还原 $tmp = $this->row; $this->sequence ++; //在子评论之前输出 echo $this->_singleCommentOptions->before; foreach ($children as $child) { $this->row = $child; $this->threadedCommentsCallback(); $this->row = $tmp; } //在子评论之后输出 echo $this->_singleCommentOptions->after; $this->sequence --; } } /** * 列出评论 * * @access private * @param mixed $singleCommentOptions 单个评论自定义选项 * @return void */ public function listComments($singleCommentOptions = NULL) { //初始化一些变量 $this->_singleCommentOptions = Typecho_Config::factory($singleCommentOptions); $this->_singleCommentOptions->setDefault(array( 'before' => '
      ', 'after' => '
    ', 'beforeAuthor' => '', 'afterAuthor' => '', 'beforeDate' => '', 'afterDate' => '', 'dateFormat' => $this->options->commentDateFormat, 'replyWord' => '回复', 'commentStatus' => '评论正等待审核!', 'avatarSize' => 32, 'defaultAvatar' => NULL )); $this->pluginHandle()->trigger($plugged)->listComments($this->_singleCommentOptions, $this); if (!$plugged) { if ($this->have()) { echo $this->_singleCommentOptions->before; while ($this->next()) { $this->threadedCommentsCallback(); } echo $this->_singleCommentOptions->after; } } } /** * 重载alt函数,以适应多级评论 * * @access public * @return void */ public function alt(...$args) { $args = func_get_args(); $num = func_num_args(); $sequence = $this->levels <= 0 ? $this->sequence : $this->order; $split = $sequence % $num; echo $args[(0 == $split ? $num : $split) -1]; } /** * 根据深度余数输出 * * @access public * @param string $param 需要输出的值 * @return void */ public function levelsAlt() { $args = func_get_args(); $num = func_num_args(); $split = $this->levels % $num; echo $args[(0 == $split ? $num : $split) -1]; } /** * 评论回复链接 * * @access public * @param string $word 回复链接文字 * @return void */ public function reply(string $word = '') { if ($this->options->commentsThreaded && $this->parameter->allowComment) { $word = empty($word) ? _t('回复') : $word; self::pluginHandle()->trigger($plugged)->call('reply', $word, $this); if (!$plugged) { echo '' . $word . ''; } } } /** * 取消评论回复链接 * * @access public * @param string $word 取消回复链接文字 * @return void */ public function cancelReply($word = '') { if ($this->options->commentsThreaded) { $word = empty($word) ? ' 取消回复' : $word; $this->pluginHandle()->trigger($plugged)->cancelReply($word, $this); if (!$plugged) { $replyId = $this->request->filter('int')->replyTo; echo ''; } } } } ================================================ FILE: core/extend/FriendCircle.php ================================================ parameter->setDefault('parentId=0&commentPage=0&commentsNum=0&allowComment=1'); Typecho_Widget::widget('Widget_Security')->to($this->_security); /** 初始化回调函数 */ if (function_exists('threadedComments')) { $this->_customThreadedCommentsCallback = true; } } public static function updateLocation(int $coid, $location,$type) { $db = \Typecho\Db::get(); $location = is_array($location) ? serialize($location) : $location; $result = $db->fetchAll($db->select('coid')->from('table.comments')->where('table.comments.coid = ?', $coid)); if (is_array($result) && count($result) && $type== 'ipv6') { $updateQuery = $db->update('table.comments')->rows(array('ipv6_location' => $location))->where('coid = ?', $coid); return $db->query($updateQuery) > 0; } if (is_array($result) && count($result) && $type== 'ipv4') { $updateQuery = $db->update('table.comments')->rows(array('ipv4_location' => $location))->where('coid = ?', $coid); return $db->query($updateQuery) > 0; } return false; } public static function commentRank($i){ $db=\Typecho\Db::get(); $mail=$db->fetchAll($db->select(array('COUNT(cid)'=>'all'))->from('table.comments')->where('mail = ?', $i->mail)->where('authorId = ?','0')); foreach ($mail as $sl){ $all=$sl['all'];} if($i->authorId == $i->ownerId){ echo '
    博主
    '; } else if($all<10 && $all>0) { echo '
    LV1
    '; }elseif ($all<20 && $all>=10) { echo '
    LV2
    '; }elseif ($all<40 && $all>=20) { echo '
    LV3
    '; }elseif ($all<80 && $all>=40) { echo '
    LV4
    '; }elseif ($all<100 && $all>=80) { echo '
    LV5
    '; }elseif ($all>=100) { echo '
    LV6
    '; } } public static function circle_getInfo($obj){ $db=\Typecho\Db::get(); $info=$db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $obj->coid)); return $info; } public static function circle_getTime($time) { $rtime = date("Y年m月d日 H:i", $time); $htime = date("H:i", $time); $time = time() - $time; if ($time < 60) { $str = '刚刚'; } elseif ($time < 60 * 60) { $min = floor($time / 60); $str = $min . '分钟前'; } elseif ($time < 60 * 60 * 24) { $h = floor($time / (60 * 60)); $str = $h . '小时前 ' . $htime; } elseif ($time < 60 * 60 * 24 * 3) { $d = floor($time / (60 * 60 * 24)); if ($d == 1){ $ztime = time() - $time; $zztime = date("H:i", $ztime); $str = '昨天 ' . $zztime; }else{ $qtime = time() - $time; $qqtime = date("H:i", $qtime); $str = '前天 ' . $qqtime; }} else { $str = $rtime; } return $str; } /** * 评论回调函数 * * @access private * @return void */ private function threadedCommentsCallback() { $singleCommentOptions = $this->_singleCommentOptions; if (function_exists('threadedComments')) { return threadedComments($this, $singleCommentOptions); } if(Bsoptions('Lazyload') == true){ $lazyload = 'class="lazy" data-'; } $db = \Typecho\Db::get(); Typecho_Widget::widget('Widget_User')->to($user); $circle_data = $db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $this->coid)); if(($circle_data['private'] == 1 && (!$this->user->hasLogin() && $this->user->uid !== $this->authorId))){ $hidden = 'style="display:none;"'; } if($circle_data['likeVisitor']){ $likeVisitor = $circle_data['likeVisitor'].'位访客'; } if($circle_data['likeUser'] && $circle_data['likeVisitor']){ $likeVisitor = ','.$likeVisitor; } if(Bsoptions('fcircle_Avatar') == null){ $avatar = Helper::options()->themeUrl.'/assets/images/circle_defaultAvatar.jpg'; } else{ $avatar = Bsoptions('fcircle_Avatar'); } ?>
  • >

    author; ?>

    content,"circle"); ?>
    /@13211813,2842867.25,12z?querytype=s&da_src=shareurl&wd=&c=134&src=0&pn=0&sug=0&l=13&b=(13187863,2814974;13242487,2843710)&from=webmap&biz_forward=%7B"scaler":2,"styles":"pl"%7D&device_ratio=2' target="_blank"> beforeDate(); echo self::circle_getTime($this->created); $singleCommentOptions->afterDate(); ?>
    children || $circle_data['likeUser'] || $circle_data['likeVisitor']) { ?>
    children):?>
    threadedComments(); ?>
  • fetchRow($db->select('parent')->from('table.comments')->where('coid = ?', $this->coid)); $parentID=$parentID['parent']; if($parentID=='0'){ return '';} else { $author=$db->fetchRow($db->select()->from('table.comments')->where('coid = ?', $parentID)); if (empty($author['author']) ||!array_key_exists('author', $author) ) $author['author'] = '已删除的评论'; return ' 回复 '.$author['author'].' '; } } /** * 获取当前评论链接 * * @access protected * @return string */ protected function ___permalink() : string { if ($this->options->commentsPageBreak) { $pageRow = array('permalink' => $this->parentContent['pathinfo'], 'commentPage' => $this->_currentPage); return Typecho_Router::url('comment_page', $pageRow, $this->options->index) . '#' . $this->theId; } return $this->parentContent['permalink'] . '#' . $this->theId; } /** * 子评论 * * @access protected * @return array */ protected function ___children() { return $this->options->commentsThreaded && !$this->isTopLevel && isset($this->_threadedComments[$this->coid]) ? $this->_threadedComments[$this->coid] : array(); } /** * 是否到达顶层 * * @access protected * @return boolean */ protected function ___isTopLevel() { return $this->levels > 0; } /** * 重载内容获取 * * @access protected * @return void */ protected function ___parentContent(): Array { return $this->parameter->parentContent; } /** * 输出文章评论数 * * @access public * @param string $string 评论数格式化数据 * @return void */ public function num() { $args = func_get_args(); if (!$args) { $args[] = '%d'; } $num = intval($this->_total); echo sprintf(isset($args[$num]) ? $args[$num] : array_pop($args), $num); } /** * 执行函数 * * @access public * @return void */ public function execute() { if (!$this->parameter->parentId) { return; } $commentsAuthor = Typecho_Cookie::get('__typecho_remember_author'); $commentsMail = Typecho_Cookie::get('__typecho_remember_mail'); // 对已登录用户显示待审核评论,方便前台管理 if ($this->user->hasLogin()) { $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId) ->where('table.comments.status = ? OR table.comments.status = ?', 'approved', 'waiting'); } else { $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId) ->where('table.comments.status = ? OR (table.comments.author = ? AND table.comments.mail = ? AND table.comments.status = ?)', 'approved', $commentsAuthor, $commentsMail, 'waiting'); } $threadedSelect = NULL; if ($this->options->commentsShowCommentOnly) { $select->where('table.comments.type = ?', 'comment'); } $select->order('table.comments.coid', 'ASC'); $this->db->fetchAll($select, array($this, 'push')); /** 需要输出的评论列表 */ $outputComments = array(); /** 如果开启评论回复 */ if ($this->options->commentsThreaded) { foreach ($this->stack as $coid => &$comment) { /** 取出父节点 */ $parent = $comment['parent']; /** 如果存在父节点 */ if (0 != $parent && isset($this->stack[$parent])) { /** 如果当前节点深度大于最大深度, 则将其挂接在父节点上 */ if ($comment['levels'] >= 2) { $comment['levels'] = $this->stack[$parent]['levels']; $parent = $this->stack[$parent]['parent']; // 上上层节点 $comment['parent'] = $parent; } /** 计算子节点顺序 */ $comment['order'] = isset($this->_threadedComments[$parent]) ? count($this->_threadedComments[$parent]) + 1 : 1; /** 如果是子节点 */ $this->_threadedComments[$parent][$coid] = $comment; } else { $outputComments[$coid] = $comment; } } $this->stack = $outputComments; } /** 评论排序 */ if ('DESC' == $this->options->commentsOrder) { $this->stack = array_reverse($this->stack, true); } /** 评论总数 */ $this->_total = count($this->stack); /** 对评论进行分页 */ if ($this->options->commentsPageBreak) { if ('last' == $this->options->commentsPageDisplay && !$this->parameter->commentPage) { $this->_currentPage = ceil($this->_total / $this->options->commentsPageSize); } else { $this->_currentPage = $this->parameter->commentPage ? $this->parameter->commentPage : 1; } /** 截取评论 */ $this->stack = array_slice($this->stack, ($this->_currentPage - 1) * $this->options->commentsPageSize, $this->options->commentsPageSize); /** 评论置位 */ $this->row = current($this->stack); $this->length = count($this->stack); } reset($this->stack); } /** * 将每行的值压入堆栈 * * @access public * @param array $value 每行的值 * @return array */ public function push(array $value) : array { $value = $this->filter($value); /** 计算深度 */ if (0 != $value['parent'] && isset($this->stack[$value['parent']]['levels'])) { $value['levels'] = $this->stack[$value['parent']]['levels'] + 1; } else { $value['levels'] = 0; } $value['realParent'] = $value['parent']; /** 重载push函数,使用coid作为数组键值,便于索引 */ $this->stack[$value['coid']] = $value; $this->_commentAuthors[$value['coid']] = $value['author']; $this->length ++; return $value; } /** * 输出分页 * * @access public * @param string $prev 上一页文字 * @param string $next 下一页文字 * @param int $splitPage 分割范围 * @param string $splitWord 分割字符 * @param string $template 展现配置信息 * @return void */ public function pageNav($prev = '«', $next = '»', $splitPage = 3, $splitWord = '...', $template = '') { if ($this->options->commentsPageBreak && $this->_total > $this->options->commentsPageSize) { $default = array( 'wrapTag' => 'ol', 'wrapClass' => 'page-navigator' ); if (is_string($template)) { parse_str($template, $config); } else { $config = $template; } $template = array_merge($default, $config); $pageRow = $this->parameter->parentContent; $pageRow['permalink'] = $pageRow['pathinfo']; $query = Typecho_Router::url('comment_page', $pageRow, $this->options->index); /** 使用盒状分页 */ $nav = new Typecho_Widget_Helper_PageNavigator_Box($this->_total, $this->_currentPage, $this->options->commentsPageSize, $query); $nav->setPageHolder('commentPage'); $nav->setAnchor('comments'); echo '<' . $template['wrapTag'] . (empty($template['wrapClass']) ? '' : ' class="' . $template['wrapClass'] . '"') . '>'; $nav->render($prev, $next, $splitPage, $splitWord, $template); echo ''; } } /** * 递归输出评论 * * @access protected * @return void */ public function threadedComments() { $children = $this->children; if ($children) { //缓存变量便于还原 $tmp = $this->row; $this->sequence ++; //在子评论之前输出 //echo $this->_singleCommentOptions->before; foreach ($children as $child) { $this->row = $child; echo '
    '.$this->author.$this->getParent().' : '.reEmo($this->text,"circle").'
    '; $this->row = $tmp; } //在子评论之后输出 //echo $this->_singleCommentOptions->after; $this->sequence --; } } /** * 列出评论 * * @access private * @param mixed $singleCommentOptions 单个评论自定义选项 * @return void */ public function listComments($singleCommentOptions = NULL) { //初始化一些变量 $this->_singleCommentOptions = Typecho_Config::factory($singleCommentOptions); $this->_singleCommentOptions->setDefault(array( 'before' => '
      ', 'after' => '
    ', 'beforeAuthor' => '', 'afterAuthor' => '', 'beforeDate' => '', 'afterDate' => '', 'dateFormat' => $this->options->commentDateFormat, 'replyWord' => '回复', 'commentStatus' => '评论正等待审核!', 'avatarSize' => 32, 'defaultAvatar' => NULL )); $this->pluginHandle()->trigger($plugged)->listComments($this->_singleCommentOptions, $this); if (!$plugged) { if ($this->have()) { echo $this->_singleCommentOptions->before; while ($this->next()) { $this->threadedCommentsCallback(); } echo $this->_singleCommentOptions->after; } } } /** * 重载alt函数,以适应多级评论 * * @access public * @return void */ public function alt(...$args) { $args = func_get_args(); $num = func_num_args(); $sequence = $this->levels <= 0 ? $this->sequence : $this->order; $split = $sequence % $num; echo $args[(0 == $split ? $num : $split) -1]; } /** * 根据深度余数输出 * * @access public * @param string $param 需要输出的值 * @return void */ public function levelsAlt() { $args = func_get_args(); $num = func_num_args(); $split = $this->levels % $num; echo $args[(0 == $split ? $num : $split) -1]; } /** * 评论回复链接 * * @access public * @param string $word 回复链接文字 * @return void */ public function reply($word = '') { if ($this->options->commentsThreaded && $this->parameter->allowComment) { $word = empty($word) ? '回复' : $word; $this->pluginHandle()->trigger($plugged)->reply($word, $this); if (!$plugged) { echo '' . $word . ''; } } } /** * 取消评论回复链接 * * @access public * @param string $word 取消回复链接文字 * @return void */ public function cancelReply($word = '') { if ($this->options->commentsThreaded) { $word = empty($word) ? ' 取消回复' : $word; $this->pluginHandle()->trigger($plugged)->cancelReply($word, $this); if (!$plugged) { $replyId = $this->request->filter('int')->replyTo; echo ''; } } } } ================================================ FILE: core/extend/FriendCircle_n.php ================================================ parameter->setDefault('parentId=0&commentPage=0&commentsNum=0&allowComment=1'); Typecho_Widget::widget('Widget_Security')->to($this->_security); /** 初始化回调函数 */ if (function_exists('threadedComments')) { $this->_customThreadedCommentsCallback = true; } } public static function updateLocation(int $coid, $location,$type) { $db = \Typecho\Db::get(); $location = is_array($location) ? serialize($location) : $location; $result = $db->fetchAll($db->select('coid')->from('table.comments')->where('table.comments.coid = ?', $coid)); if (is_array($result) && count($result) && $type== 'ipv6') { $updateQuery = $db->update('table.comments')->rows(array('ipv6_location' => $location))->where('coid = ?', $coid); return $db->query($updateQuery) > 0; } if (is_array($result) && count($result) && $type== 'ipv4') { $updateQuery = $db->update('table.comments')->rows(array('ipv4_location' => $location))->where('coid = ?', $coid); return $db->query($updateQuery) > 0; } return false; } public static function commentRank($i){ $db=\Typecho\Db::get(); $mail=$db->fetchAll($db->select(array('COUNT(cid)'=>'all'))->from('table.comments')->where('mail = ?', $i->mail)->where('authorId = ?','0')); foreach ($mail as $sl){ $all=$sl['all'];} if($i->authorId == $i->ownerId){ echo '
    博主
    '; } else if($all<10 && $all>0) { echo '
    LV1
    '; }elseif ($all<20 && $all>=10) { echo '
    LV2
    '; }elseif ($all<40 && $all>=20) { echo '
    LV3
    '; }elseif ($all<80 && $all>=40) { echo '
    LV4
    '; }elseif ($all<100 && $all>=80) { echo '
    LV5
    '; }elseif ($all>=100) { echo '
    LV6
    '; } } public static function circle_getInfo($obj){ $db=\Typecho\Db::get(); $info=$db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $obj->coid)); return $info; } public static function circle_getTime($time) { $rtime = date("Y年m月d日 H:i", $time); $htime = date("H:i", $time); $time = time() - $time; if ($time < 60) { $str = '刚刚'; } elseif ($time < 60 * 60) { $min = floor($time / 60); $str = $min . '分钟前'; } elseif ($time < 60 * 60 * 24) { $h = floor($time / (60 * 60)); $str = $h . '小时前 ' . $htime; } elseif ($time < 60 * 60 * 24 * 3) { $d = floor($time / (60 * 60 * 24)); if ($d == 1){ $ztime = time() - $time; $zztime = date("H:i", $ztime); $str = '昨天 ' . $zztime; }else{ $qtime = time() - $time; $qqtime = date("H:i", $qtime); $str = '前天 ' . $qqtime; }} else { $str = $rtime; } return $str; } /** * 评论回调函数 * * @access private * @return void */ private function threadedCommentsCallback() { $singleCommentOptions = $this->_singleCommentOptions; if (function_exists('threadedComments')) { return threadedComments($this, $singleCommentOptions); } if(Bsoptions('Lazyload') == true){ $lazyload = 'class="lazy" data-'; } $db = \Typecho\Db::get(); Typecho_Widget::widget('Widget_User')->to($user); $circle_data = $db->fetchRow($db->select()->from('table.bscore_friendcircle_data')->where('coid = ?', $this->coid)); if(($circle_data['private'] == 1 && (!$this->user->hasLogin() && $this->user->uid !== $this->authorId))){ $hidden = 'style="display:none;"'; } if($circle_data['likeVisitor']){ $likeVisitor = $circle_data['likeVisitor'].'位访客'; } if($circle_data['likeUser'] && $circle_data['likeVisitor']){ $likeVisitor = ','.$likeVisitor; } if(Bsoptions('fcircle_Avatar') == null){ $avatar = Helper::options()->themeUrl.'/assets/images/circle_defaultAvatar.jpg'; } else{ $avatar = Bsoptions('fcircle_Avatar'); } ?>
  • >

    author; ?>

    content,"circle"); ?>
    /@13211813,2842867.25,12z?querytype=s&da_src=shareurl&wd=&c=134&src=0&pn=0&sug=0&l=13&b=(13187863,2814974;13242487,2843710)&from=webmap&biz_forward=%7B"scaler":2,"styles":"pl"%7D&device_ratio=2' target="_blank"> beforeDate(); echo self::circle_getTime($this->created); $singleCommentOptions->afterDate(); ?>
    children || $circle_data['likeUser'] || $circle_data['likeVisitor']) { ?>
    children):?>
    threadedComments(); ?>
  • fetchRow($db->select('parent')->from('table.comments')->where('coid = ?', $this->coid)); $parentID=$parentID['parent']; if($parentID=='0'){ return '';} else { $author=$db->fetchRow($db->select()->from('table.comments')->where('coid = ?', $parentID)); if (empty($author['author']) ||!array_key_exists('author', $author) ) $author['author'] = '已删除的评论'; return ' 回复 '.$author['author'].' '; } } /** * 获取当前评论链接 * * @access protected * @return string */ protected function ___permalink() : string { if ($this->options->commentsPageBreak) { $pageRow = array('permalink' => $this->parentContent['pathinfo'], 'commentPage' => $this->_currentPage); return Typecho_Router::url('comment_page', $pageRow, $this->options->index) . '#' . $this->theId; } return $this->parentContent['permalink'] . '#' . $this->theId; } /** * 子评论 * * @access protected * @return array */ protected function ___children() { return $this->options->commentsThreaded && !$this->isTopLevel && isset($this->_threadedComments[$this->coid]) ? $this->_threadedComments[$this->coid] : array(); } /** * 是否到达顶层 * * @access protected * @return boolean */ protected function ___isTopLevel() { return $this->levels > 0; } /** * 重载内容获取 * * @access protected * @return void */ protected function ___parentContent(): Contents { return From::allocWithAlias($this->cid, ['cid' => $this->cid]); } /** * 输出文章评论数 * * @access public * @param string $string 评论数格式化数据 * @return void */ public function num() { $args = func_get_args(); if (!$args) { $args[] = '%d'; } $num = intval($this->_total); echo sprintf(isset($args[$num]) ? $args[$num] : array_pop($args), $num); } /** * 执行函数 * * @access public * @return void */ public function execute() { if (!$this->parameter->parentId) { return; } $commentsAuthor = Typecho_Cookie::get('__typecho_remember_author'); $commentsMail = Typecho_Cookie::get('__typecho_remember_mail'); // 对已登录用户显示待审核评论,方便前台管理 if ($this->user->hasLogin()) { $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId) ->where('table.comments.status = ? OR table.comments.status = ?', 'approved', 'waiting'); } else { $select = $this->select()->where('table.comments.cid = ?', $this->parameter->parentId) ->where('table.comments.status = ? OR (table.comments.author = ? AND table.comments.mail = ? AND table.comments.status = ?)', 'approved', $commentsAuthor, $commentsMail, 'waiting'); } $threadedSelect = NULL; if ($this->options->commentsShowCommentOnly) { $select->where('table.comments.type = ?', 'comment'); } $select->order('table.comments.coid', 'ASC'); $this->db->fetchAll($select, array($this, 'push')); /** 需要输出的评论列表 */ $outputComments = array(); /** 如果开启评论回复 */ if ($this->options->commentsThreaded) { foreach ($this->stack as $coid => &$comment) { /** 取出父节点 */ $parent = $comment['parent']; /** 如果存在父节点 */ if (0 != $parent && isset($this->stack[$parent])) { /** 如果当前节点深度大于最大深度, 则将其挂接在父节点上 */ if ($comment['levels'] >= 2) { $comment['levels'] = $this->stack[$parent]['levels']; $parent = $this->stack[$parent]['parent']; // 上上层节点 $comment['parent'] = $parent; } /** 计算子节点顺序 */ $comment['order'] = isset($this->_threadedComments[$parent]) ? count($this->_threadedComments[$parent]) + 1 : 1; /** 如果是子节点 */ $this->_threadedComments[$parent][$coid] = $comment; } else { $outputComments[$coid] = $comment; } } $this->stack = $outputComments; } /** 评论排序 */ if ('DESC' == $this->options->commentsOrder) { $this->stack = array_reverse($this->stack, true); } /** 评论总数 */ $this->_total = count($this->stack); /** 对评论进行分页 */ if ($this->options->commentsPageBreak) { if ('last' == $this->options->commentsPageDisplay && !$this->parameter->commentPage) { $this->_currentPage = ceil($this->_total / $this->options->commentsPageSize); } else { $this->_currentPage = $this->parameter->commentPage ? $this->parameter->commentPage : 1; } /** 截取评论 */ $this->stack = array_slice($this->stack, ($this->_currentPage - 1) * $this->options->commentsPageSize, $this->options->commentsPageSize); /** 评论置位 */ $this->row = current($this->stack); $this->length = count($this->stack); } reset($this->stack); } /** * 将每行的值压入堆栈 * * @access public * @param array $value 每行的值 * @return array */ public function push(array $value) : array { $value = $this->filter($value); /** 计算深度 */ if (0 != $value['parent'] && isset($this->stack[$value['parent']]['levels'])) { $value['levels'] = $this->stack[$value['parent']]['levels'] + 1; } else { $value['levels'] = 0; } $value['realParent'] = $value['parent']; /** 重载push函数,使用coid作为数组键值,便于索引 */ $this->stack[$value['coid']] = $value; $this->_commentAuthors[$value['coid']] = $value['author']; $this->length ++; return $value; } /** * 输出分页 * * @access public * @param string $prev 上一页文字 * @param string $next 下一页文字 * @param int $splitPage 分割范围 * @param string $splitWord 分割字符 * @param string $template 展现配置信息 * @return void */ public function pageNav($prev = '«', $next = '»', $splitPage = 3, $splitWord = '...', $template = '') { if ($this->options->commentsPageBreak && $this->_total > $this->options->commentsPageSize) { $default = array( 'wrapTag' => 'ol', 'wrapClass' => 'page-navigator' ); if (is_string($template)) { parse_str($template, $config); } else { $config = $template; } $template = array_merge($default, $config); $pageRow = $this->parameter->parentContent; $pageRow['permalink'] = $pageRow['pathinfo']; $query = Typecho_Router::url('comment_page', $pageRow, $this->options->index); /** 使用盒状分页 */ $nav = new Typecho_Widget_Helper_PageNavigator_Box($this->_total, $this->_currentPage, $this->options->commentsPageSize, $query); $nav->setPageHolder('commentPage'); $nav->setAnchor('comments'); echo '<' . $template['wrapTag'] . (empty($template['wrapClass']) ? '' : ' class="' . $template['wrapClass'] . '"') . '>'; $nav->render($prev, $next, $splitPage, $splitWord, $template); echo ''; } } /** * 递归输出评论 * * @access protected * @return void */ public function threadedComments() { $children = $this->children; if ($children) { //缓存变量便于还原 $tmp = $this->row; $this->sequence ++; //在子评论之前输出 //echo $this->_singleCommentOptions->before; foreach ($children as $child) { $this->row = $child; echo '
    '.$this->author.$this->getParent().' : '.reEmo($this->text,"circle").'
    '; $this->row = $tmp; } //在子评论之后输出 //echo $this->_singleCommentOptions->after; $this->sequence --; } } /** * 列出评论 * * @access private * @param mixed $singleCommentOptions 单个评论自定义选项 * @return void */ public function listComments($singleCommentOptions = NULL) { //初始化一些变量 $this->_singleCommentOptions = Typecho_Config::factory($singleCommentOptions); $this->_singleCommentOptions->setDefault(array( 'before' => '
      ', 'after' => '
    ', 'beforeAuthor' => '', 'afterAuthor' => '', 'beforeDate' => '', 'afterDate' => '', 'dateFormat' => $this->options->commentDateFormat, 'replyWord' => '回复', 'commentStatus' => '评论正等待审核!', 'avatarSize' => 32, 'defaultAvatar' => NULL )); $this->pluginHandle()->trigger($plugged)->listComments($this->_singleCommentOptions, $this); if (!$plugged) { if ($this->have()) { echo $this->_singleCommentOptions->before; while ($this->next()) { $this->threadedCommentsCallback(); } echo $this->_singleCommentOptions->after; } } } /** * 重载alt函数,以适应多级评论 * * @access public * @return void */ public function alt(...$args) { $args = func_get_args(); $num = func_num_args(); $sequence = $this->levels <= 0 ? $this->sequence : $this->order; $split = $sequence % $num; echo $args[(0 == $split ? $num : $split) -1]; } /** * 根据深度余数输出 * * @access public * @param string $param 需要输出的值 * @return void */ public function levelsAlt() { $args = func_get_args(); $num = func_num_args(); $split = $this->levels % $num; echo $args[(0 == $split ? $num : $split) -1]; } /** * 评论回复链接 * * @access public * @param string $word 回复链接文字 * @return void */ public function reply(string $word = '') { if ($this->options->commentsThreaded && $this->parameter->allowComment) { $word = empty($word) ? _t('回复') : $word; self::pluginHandle()->trigger($plugged)->call('reply', $word, $this); if (!$plugged) { echo '' . $word . ''; } } } /** * 取消评论回复链接 * * @access public * @param string $word 取消回复链接文字 * @return void */ public function cancelReply($word = '') { if ($this->options->commentsThreaded) { $word = empty($word) ? ' 取消回复' : $word; $this->pluginHandle()->trigger($plugged)->cancelReply($word, $this); if (!$plugged) { $replyId = $this->request->filter('int')->replyTo; echo ''; } } } } ================================================ FILE: core/extend/UserAgent.class.php ================================================ themeUrl.'/assets/images/UserAgent'; require_once dirname(__FILE__).'/get_os.php'; $ua_os = get_os($agent); $ua_os_img = self::img("/os/", $ua_os['code'], $ua_os['title'],$ctype); require_once dirname(__FILE__).'/get_browser.php'; $ua_browser = get_browser_name($agent); $ua_browser_img = self::img("/browser/", $ua_browser['code'], $ua_browser['title'],$ctype); if($agents == 'weixin'){ $ua = $ua_os_img; } else{ $ua = " " . $ua_os_img . " " . $ua_browser_img; } echo $ua; } public static function img($code, $type, $title,$ctype) { global $imgurl; global $agents; if(empty($code)){ $code = 'android'; } if($code == 'U'){ $code = 'chrome'; } if($ctype == 'comment'){ if($agents == 'weixin'){ $img = ''; } else{ $img = ""; } } else{ if($agents == 'weixin'){ $img = ' 发自微信公众号'; } else{ $img = "" . $title . ""; } } return $img; } } ================================================ FILE: core/extend/get_browser.php ================================================ -1) { $version = substr($version, 0, strpos($version, ';')); } // Beautify version format $version = str_replace('_', '.', $version); } elseif (preg_match('/Darwin/i', $ua)) { $title = 'Mac OS Darwin'; } else { $title = 'Macintosh'; } } elseif (preg_match('/[^A-Za-z]Arch/i', $ua)) { $title = 'Arch Linux'; $code = 'Arch-Linux'; } elseif (preg_match('/BlackBerry/i', $ua)) { $title = 'BlackBerryOS'; } elseif (preg_match('/CentOS/i', $ua)) { $title = 'CentOS'; if (preg_match('/.el([.0-9a-zA-Z]+).centos/i', $ua, $regmatch)) { $version = $regmatch[1]; } } elseif (preg_match('/CrOS/i', $ua)) { $title = 'Google Chrome OS'; $code = 'Chrome-OS'; } elseif (preg_match('/Debian/i', $ua)) { $title = 'Debian GNU/Linux'; $code = 'Debian'; } elseif (preg_match('/Fedora/i', $ua)) { $title = 'Fedora'; if (preg_match('/.fc([.0-9a-zA-Z]+)/i', $ua, $regmatch)) { $version = $regmatch[1]; } } elseif (preg_match('/FreeBSD/i', $ua)) { $title = 'FreeBSD'; } elseif (preg_match('/OpenBSD/i', $ua)) { $title = 'OpenBSD'; } elseif (preg_match('/Oracle/i', $ua)) { $title = 'Oracle'; $code = 'Oracle-Linux'; if (preg_match('/.el([._0-9a-zA-Z]+)/i', $ua, $regmatch)) { $title .= ' Enterprise Linux'; $version = str_replace('_', '.', $regmatch[1]); } else { $title .= ' Linux'; } } elseif (preg_match('/Red\ Hat/i', $ua) || preg_match('/RedHat/i', $ua)) { $title = 'Red Hat'; $code = 'Red-Hat'; if (preg_match('/.el([._0-9a-zA-Z]+)/i', $ua, $regmatch)) { $title .= ' Enterprise Linux'; $version = str_replace('_', '.', $regmatch[1]); } } elseif (preg_match('/Solaris/i', $ua) || preg_match('/SunOS/i', $ua)) { $title = 'Solaris'; } elseif (preg_match('/Symb[ian]?[OS]?/i', $ua)) { $title = 'SymbianOS'; if (preg_match('/Symb[ian]?[OS]?\/([.0-9a-zA-Z]+)/i', $ua, $regmatch)) { $version = $regmatch[1]; } } elseif (preg_match('/Ubuntu/i', $ua)) { $title = 'Ubuntu'; if (preg_match('/Ubuntu[\/|\ ]([.0-9]+[.0-9a-zA-Z]+)/i', $ua, $regmatch)) { $version = $regmatch[1]; } } elseif (preg_match('/Linux/i', $ua)) { $title = 'GNU/Linux'; $code = 'Linux'; } elseif (preg_match('/J2ME\/MIDP/i', $ua)) { $title = 'J2ME/MIDP Device'; $code = 'Java'; } // No OS match else { $title = 'Other System'; $code = 'Others'; } // Check x64 architecture if (preg_match('/x86_64/i', $ua)) { // If version isn't null append 64 bit, otherwise set it to x64 $version = (is_null($version)) ? 'x64' : "$version x64"; } elseif ((preg_match('/Windows/i', $ua) || preg_match('/WinNT/i', $ua) || preg_match('/Win32/i', $ua)) && (preg_match('/Win64/i', $ua) || preg_match('/x64/i', $ua) || preg_match('/WOW64/i', $ua)) ) { $version .= ' x64 Edition'; } if (is_null($code)) { $code = $title; } // Append version to title if (isset($version)) { $title .= " $version"; } $result['code'] = $code; $result['title'] = $title; return $result; } ================================================ FILE: core/extend/otherFunc.php ================================================ $v) { if(is_array($v)) { $array_data.="[".$k."]:".text($v,true)."\n"; } else { if($two) { $array_data.="[".$k."]:".$v."\n"; } else { $array_data.="[".$k."]:".$v."\n"; } } } if($two) { $array_data.="]"; } else { $array_data.="/"; } return $array_data; } function xml($data, $root = true) { $str=""; if($root)$str .= ""; foreach($data as $key => $val) { if(is_array($val)) { $child = xml($val, false); $str .= "<$key>$child"; } else { $str.= "<$key>$val"; } } if($root)$str .= ""; return $str; } function Back($array=array(),$types=false) { if($types=="print") { print_r($array); } else if($types=="die") { die($array); } else if($types=="echo") { echo($array); } else { $type=$_REQUEST["format"]?:"json"; switch($type) { case "text": header('Content-Type: text/html; charset=utf-8'); echo text($array); break; case "xml": header("Content-type: text/xml"); $xml = new Array_to_Xml(); //实例化类 echo $xml->toXml($array); //转为数组 break; default: header('Content-type: application/json'); echo json_encode($array,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); break; } } } function curl($url,$data=0,$header_array=0,$referer=0,$time=30,$code=0) { if($header_array==0) { $header=array("CLIENT-IP: ".getip_user(),"X-FORWARDED-FOR: ".getip_user(),'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36'); } else { $header=array("CLIENT-IP: ".getip_user(),"X-FORWARDED-FOR: ".getip_user()); $header=array_merge($header_array,$header); } //print_r($header); $curl=curl_init(); curl_setopt($curl,CURLOPT_URL,$url); curl_setopt($curl,CURLOPT_HTTPHEADER,$header); if($data) { curl_setopt($curl,CURLOPT_POST,1); curl_setopt($curl,CURLOPT_POSTFIELDS,$data); } if($referer) { curl_setopt($curl,CURLOPT_REFERER,$referer); } curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3); //设置等待时间 curl_setopt($curl,CURLOPT_TIMEOUT,$time); curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1); curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($curl,CURLOPT_ENCODING,'gzip,deflate'); if($code) { curl_setopt($curl, CURLOPT_HEADER, 1); $return=curl_exec($curl); $code_code=curl_getinfo($curl); curl_close($curl); $code_int['exec']=substr($return,$code_code["header_size"]); $code_int['code']=$code_code["http_code"]; $code_int['content_type']=$code_code["content_type"]; $code_int['header']=substr($return,0,$code_code["header_size"]); return $code_int; } else { $return=curl_exec($curl); curl_close($curl); return $return; } } function str_Intercept($txt1,$q1,$h1) { $txt1=strstr($txt1,$q1); $cd=strlen($q1); $txt1=substr($txt1,$cd); $txt1=strstr($txt1,$h1,"TRUE"); return $txt1; } class Array_to_Xml { private $version = '1.0'; private $encoding = 'UTF-8'; private $root = 'xml'; private $xml = null; function __construct() { $this->xml = new XmlWriter(); } function toXml($data, $eIsArray=FALSE) { if(!$eIsArray) { $this->xml->openMemory(); $this->xml->startDocument($this->version, $this->encoding); $this->xml->startElement($this->root); } foreach($data as $key => $value) { if(is_array($value)) { $this->xml->startElement($key); $this->toXml($value, TRUE); $this->xml->endElement(); continue; } $this->xml->writeElement($key, $value); } if(!$eIsArray) { $this->xml->endElement(); return $this->xml->outputMemory(true); } } } function charCodeAt($str, $index) { $char = mb_substr($str, $index, 1, 'UTF-8'); $value = null; if (mb_check_encoding($char, 'UTF-8')) { $ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8'); $value = hexdec(bin2hex($ret)); } return $value; } function cache_get_contents($list, $name, $type = "text") { clearstatcache(); $fp_name = ApiRun."cache/". $list . ".txt"; $fp = fopen($fp_name, "r"); flock($fp, LOCK_EX); $fp_open = fread($fp, filesize($fp_name)); if ($type != "text") { return $fp_open; } else { $encode = base64_encode($name); $json = json_decode($fp_open, true); return $json[$encode]; } flock($fp, LOCK_UN); fclose($fp); } function cache_put_contents($list,$name,$msg) { clearstatcache(); $encode = base64_encode($name); $fp_name = ApiRun."cache/". $list . ".txt"; $dir = dirname($fp_name); if(!is_dir($dir)) { mkdir($dir, 0777, true); } $read = cache_get_contents($list,$name,"json"); if(!$read) { $json = array(); } else { $json = json_decode($read, true); } $now_array = array($encode => $msg); $new_array = array_merge($json, $now_array); $new_json = json_encode($new_array); $fp = fopen($fp_name, "w"); flock($fp, LOCK_EX); fwrite($fp, $new_json); flock($fp, LOCK_UN); fclose($fp); } function GetCookie() { $skey=$_REQUEST["skey"]?:$_COOKIE["skey"]; $pskey=$_REQUEST["pskey"]?:$_REQUEST["p_skey"]?:$_COOKIE["pskey"]; $uin=$_REQUEST["uin"]; if(!empty($_COOKIE["skey"])) { $cookie=""; foreach($_COOKIE as $key=>$value) { $cookie.=$key."=".$value.";"; } } else { if(!$skey|!$uin) { return false; } $cookie="skey=".$skey."; uin=o".$uin."; p_skey=".$pskey."; p_uin=o".$uin.""; } return $cookie; } ================================================ FILE: core/extend/pinyin.lang ================================================ 吖ā,阿ā,啊ā,锕ā,錒ā,嗄á,厑ae,哎āi,哀āi,唉āi,埃āi,挨āi,溾āi,锿āi,鎄āi,啀ái,捱ái,皑ái,凒ái,嵦á,溰ái,嘊ái,敱ái,敳ái,皚ái,癌ái,娾ái,隑ái,剴ái,騃ái,毐ǎi,昹ǎi,矮ǎi,蔼ǎi,躷ǎi,濭ǎi,藹ǎi,譪ǎi,霭ǎi,靄ǎi,鯦ǎi,噯ài,艾ài,伌ài,爱ài,砹ài,硋ài,隘ài,嗌ài,塧ài,嫒ài,愛ài,碍ài,叆ài,暧ài,瑷ài,僾ài,壒ài,嬡ài,懓ài,薆ài,懝ài,曖ài,賹ài,餲ài,鴱ài,皧ài,瞹ài,馤ài,礙ài,譺ài,鑀ài,鱫ài,靉ài,閡ài,欬ài,焥ài,堨ài,乂ài,嗳ài,璦ài,安ān,侒ān,峖ān,桉ān,氨ān,庵ān,谙ān,媕ān,萻ān,葊ān,痷ān,腤ān,鹌ān,蓭ān,誝ān,鞌ān,鞍ān,盦ān,闇ān,馣ān,鮟ān,盫ān,鵪ān,韽ān,鶕ān,啽ān,厰ān,鴳ān,諳ān,玵án,雸án,儑án,垵ǎn,俺ǎn,唵ǎn,埯ǎn,铵ǎn,隌ǎn,揞ǎn,晻ǎn,罯ǎn,銨ǎn,碪ǎn,犴àn,岸àn,按àn,洝àn,荌àn,案àn,胺àn,豻àn,堓àn,婩àn,貋àn,錌àn,黯àn,頇àn,屽àn,垾àn,遃àn,暗àn,肮āng,骯āng,岇áng,昂áng,昻áng,卬áng,枊àng,盎àng,醠àng,凹āo,垇āo,柪āo,軪āo,爊āo,熝āo,眑āo,泑āo,梎āo,敖áo,厫áo,隞áo,嗷áo,嗸áo,嶅áo,廒áo,滶áo,獒áo,獓áo,遨áo,摮áo,璈áo,蔜áo,磝áo,翱áo,聱áo,螯áo,翶áo,謷áo,翺áo,鳌áo,鏖áo,鰲áo,鷔áo,鼇áo,慠áo,鏕áo,嚻áo,熬áo,抝ǎo,芺ǎo,袄ǎo,媪ǎo,镺ǎo,媼ǎo,襖ǎo,郩ǎo,鴁ǎo,蝹ǎo,坳ào,岙ào,扷ào,岰ào,傲ào,奡ào,奥ào,嫯ào,奧ào,澚ào,墺ào,嶴ào,澳ào,懊ào,擙ào,謸ào,鏊ào,驁ào,骜ào,吧ba,八bā,仈bā,巴bā,叭bā,扒bā,朳bā,玐bā,夿bā,岜bā,芭bā,疤bā,哵bā,捌bā,笆bā,粑bā,紦bā,羓bā,蚆bā,釟bā,鲃bā,魞bā,鈀bā,柭bā,丷bā,峇bā,豝bā,叐bá,犮bá,抜bá,坺bá,妭bá,拔bá,茇bá,炦bá,癹bá,胈bá,釛bá,菝bá,詙bá,跋bá,軷bá,颰bá,魃bá,墢bá,鼥bá,把bǎ,钯bǎ,靶bǎ,坝bà,弝bà,爸bà,罢bà,鲅bà,罷bà,鮁bà,覇bà,矲bà,霸bà,壩bà,灞bà,欛bà,鲌bà,鮊bà,皅bà,挀bāi,掰bāi,白bái,百bǎi,佰bǎi,柏bǎi,栢bǎi,捭bǎi,竡bǎi,粨bǎi,絔bǎi,摆bǎi,擺bǎi,襬bǎi,庍bài,拝bài,败bài,拜bài,敗bài,稗bài,粺bài,鞁bài,薭bài,贁bài,韛bài,扳bān,攽bān,朌bān,班bān,般bān,颁bān,斑bān,搬bān,斒bān,頒bān,瘢bān,螁bān,螌bān,褩bān,癍bān,辬bān,籓bān,肦bān,鳻bān,搫bān,阪bǎn,坂bǎn,岅bǎn,昄bǎn,板bǎn,版bǎn,钣bǎn,粄bǎn,舨bǎn,鈑bǎn,蝂bǎn,魬bǎn,覂bǎn,瓪bǎn,办bàn,半bàn,伴bàn,扮bàn,姅bàn,怑bàn,拌bàn,绊bàn,秚bàn,湴bàn,絆bàn,鉡bàn,靽bàn,辦bàn,瓣bàn,跘bàn,邦bāng,峀bāng,垹bāng,帮bāng,捠bāng,梆bāng,浜bāng,邫bāng,幚bāng,縍bāng,幫bāng,鞤bāng,幇bāng,绑bǎng,綁bǎng,榜bǎng,牓bǎng,膀bǎng,騯bǎng,玤bàng,蚌bàng,傍bàng,棒bàng,棓bàng,硥bàng,谤bàng,塝bàng,徬bàng,稖bàng,蒡bàng,蜯bàng,镑bàng,艕bàng,謗bàng,鎊bàng,埲bàng,蚄bàng,蛖bàng,嫎bàng,勹bāo,包bāo,佨bāo,孢bāo,胞bāo,剝bāo,笣bāo,煲bāo,龅bāo,蕔bāo,褒bāo,闁bāo,襃bāo,齙bāo,剥bāo,枹bāo,裦bāo,苞bāo,窇báo,嫑báo,雹báo,铇báo,薄báo,宝bǎo,怉bǎo,饱bǎo,保bǎo,鸨bǎo,珤bǎo,堡bǎo,堢bǎo,媬bǎo,葆bǎo,寚bǎo,飹bǎo,飽bǎo,褓bǎo,駂bǎo,鳵bǎo,緥bǎo,賲bǎo,藵bǎo,寳bǎo,寶bǎo,靌bǎo,宀bǎo,鴇bǎo,勽bào,报bào,抱bào,豹bào,菢bào,袌bào,報bào,鉋bào,鲍bào,靤bào,骲bào,暴bào,髱bào,虣bào,鮑bào,儤bào,曓bào,爆bào,忁bào,鑤bào,蚫bào,瀑bào,萡be,呗bei,唄bei,陂bēi,卑bēi,盃bēi,桮bēi,悲bēi,揹bēi,碑bēi,鹎bēi,藣bēi,鵯bēi,柸bēi,錍bēi,椑bēi,諀bēi,杯bēi,喺béi,北běi,鉳běi,垻bèi,贝bèi,狈bèi,貝bèi,邶bèi,备bèi,昁bèi,牬bèi,苝bèi,背bèi,钡bèi,俻bèi,倍bèi,悖bèi,狽bèi,被bèi,偝bèi,偹bèi,梖bèi,珼bèi,備bèi,僃bèi,惫bèi,焙bèi,琲bèi,軰bèi,辈bèi,愂bèi,碚bèi,禙bèi,蓓bèi,蛽bèi,犕bèi,褙bèi,誖bèi,骳bèi,輩bèi,鋇bèi,憊bèi,糒bèi,鞴bèi,鐾bèi,鐴bèi,杮bèi,韝bèi,棑bèi,哱bèi,鄁bèi,奔bēn,泍bēn,贲bēn,倴bēn,渀bēn,逩bēn,犇bēn,賁bēn,錛bēn,喯bēn,锛bēn,本běn,苯běn,奙běn,畚běn,楍běn,翉běn,夲běn,坌bèn,捹bèn,桳bèn,笨bèn,撪bèn,獖bèn,輽bèn,炃bèn,燌bèn,夯bèn,伻bēng,祊bēng,奟bēng,崩bēng,绷bēng,絣bēng,閍bēng,嵭bēng,痭bēng,嘣bēng,綳bēng,繃bēng,嗙bēng,挷bēng,傰bēng,搒bēng,甭béng,埄běng,菶běng,琣běng,鞛běng,琫běng,泵bèng,迸bèng,逬bèng,跰bèng,塴bèng,甏bèng,镚bèng,蹦bèng,鏰bèng,錋bèng,皀bī,屄bī,偪bī,毴bī,逼bī,豍bī,螕bī,鲾bī,鎞bī,鵖bī,鰏bī,悂bī,鈚bī,柲bí,荸bí,鼻bí,嬶bí,匕bǐ,比bǐ,夶bǐ,朼bǐ,佊bǐ,妣bǐ,沘bǐ,疕bǐ,彼bǐ,柀bǐ,秕bǐ,俾bǐ,笔bǐ,粃bǐ,粊bǐ,舭bǐ,啚bǐ,筆bǐ,鄙bǐ,聛bǐ,貏bǐ,箄bǐ,崥bǐ,魮bǐ,娝bǐ,箃bǐ,吡bǐ,匂bì,币bì,必bì,毕bì,闭bì,佖bì,坒bì,庇bì,诐bì,邲bì,妼bì,怭bì,枈bì,畀bì,苾bì,哔bì,毖bì,珌bì,疪bì,胇bì,荜bì,陛bì,毙bì,狴bì,畢bì,袐bì,铋bì,婢bì,庳bì,敝bì,梐bì,萆bì,萞bì,閇bì,閉bì,堛bì,弻bì,弼bì,愊bì,愎bì,湢bì,皕bì,禆bì,筚bì,貱bì,赑bì,嗶bì,彃bì,楅bì,滗bì,滭bì,煏bì,痹bì,痺bì,腷bì,蓖bì,蓽bì,蜌bì,裨bì,跸bì,鉍bì,閟bì,飶bì,幣bì,弊bì,熚bì,獙bì,碧bì,稫bì,箅bì,箆bì,綼bì,蔽bì,馝bì,幤bì,潷bì,獘bì,罼bì,襅bì,駜bì,髲bì,壁bì,嬖bì,廦bì,篦bì,篳bì,縪bì,薜bì,觱bì,避bì,鮅bì,斃bì,濞bì,臂bì,蹕bì,鞞bì,髀bì,奰bì,璧bì,鄨bì,饆bì,繴bì,襞bì,鏎bì,鞸bì,韠bì,躃bì,躄bì,魓bì,贔bì,驆bì,鷝bì,鷩bì,鼊bì,咇bì,鮩bì,畐bì,踾bì,鶝bì,闬bì,閈bì,祕bì,鴓bì,怶bì,旇bì,翍bì,肶bì,笓bì,鸊bì,肸bì,畁bì,詖bì,鄪bì,襣bì,边biān,砭biān,笾biān,猵biān,编biān,萹biān,煸biān,牑biān,甂biān,箯biān,編biān,蝙biān,獱biān,邉biān,鍽biān,鳊biān,邊biān,鞭biān,鯿biān,籩biān,糄biān,揙biān,臱biān,鯾biān,炞biǎn,贬biǎn,扁biǎn,窆biǎn,匾biǎn,貶biǎn,惼biǎn,碥biǎn,稨biǎn,褊biǎn,鴘biǎn,藊biǎn,釆biǎn,辧biǎn,疺biǎn,覵biǎn,鶣biǎn,卞biàn,弁biàn,忭biàn,抃biàn,汳biàn,汴biàn,苄biàn,峅biàn,便biàn,变biàn,変biàn,昪biàn,覍biàn,缏biàn,遍biàn,閞biàn,辡biàn,緶biàn,艑biàn,辨biàn,辩biàn,辫biàn,辮biàn,辯biàn,變biàn,彪biāo,标biāo,飑biāo,骉biāo,髟biāo,淲biāo,猋biāo,脿biāo,墂biāo,幖biāo,滮biāo,蔈biāo,骠biāo,標biāo,熛biāo,膘biāo,麃biāo,瘭biāo,镖biāo,飙biāo,飚biāo,儦biāo,颷biāo,瀌biāo,藨biāo,謤biāo,爂biāo,臕biāo,贆biāo,鏢biāo,穮biāo,镳biāo,飆biāo,飇biāo,飈biāo,飊biāo,驃biāo,鑣biāo,驫biāo,摽biāo,膔biāo,篻biāo,僄biāo,徱biāo,表biǎo,婊biǎo,裱biǎo,褾biǎo,錶biǎo,檦biǎo,諘biǎo,俵biào,鳔biào,鰾biào,憋biē,鳖biē,鱉biē,鼈biē,虌biē,龞biē,蟞biē,別bié,别bié,莂bié,蛂bié,徶bié,襒bié,蹩bié,穪bié,瘪biě,癟biě,彆biè,汃bīn,邠bīn,砏bīn,宾bīn,彬bīn,斌bīn,椕bīn,滨bīn,缤bīn,槟bīn,瑸bīn,豩bīn,賓bīn,賔bīn,镔bīn,儐bīn,濒bīn,濱bīn,濵bīn,虨bīn,豳bīn,璸bīn,瀕bīn,霦bīn,繽bīn,蠙bīn,鑌bīn,顮bīn,檳bīn,玢bīn,訜bīn,傧bīn,氞bìn,摈bìn,殡bìn,膑bìn,髩bìn,擯bìn,鬂bìn,臏bìn,髌bìn,鬓bìn,髕bìn,鬢bìn,殯bìn,仌bīng,氷bīng,冰bīng,兵bīng,栟bīng,掤bīng,梹bīng,鋲bīng,幷bīng,丙bǐng,邴bǐng,陃bǐng,怲bǐng,抦bǐng,秉bǐng,苪bǐng,昞bǐng,昺bǐng,柄bǐng,炳bǐng,饼bǐng,眪bǐng,窉bǐng,蛃bǐng,禀bǐng,鈵bǐng,鉼bǐng,鞆bǐng,餅bǐng,餠bǐng,燷bǐng,庰bǐng,偋bǐng,寎bǐng,綆bǐng,稟bǐng,癛bǐng,癝bǐng,琕bǐng,棅bǐng,并bìng,並bìng,併bìng,垪bìng,倂bìng,栤bìng,病bìng,竝bìng,傡bìng,摒bìng,誁bìng,靐bìng,疒bìng,啵bo,蔔bo,卜bo,噃bo,趵bō,癶bō,拨bō,波bō,玻bō,袚bō,袯bō,钵bō,饽bō,紴bō,缽bō,菠bō,碆bō,鉢bō,僠bō,嶓bō,撥bō,播bō,餑bō,磻bō,蹳bō,驋bō,鱍bō,帗bō,盋bō,脖bó,仢bó,伯bó,孛bó,犻bó,驳bó,帛bó,泊bó,狛bó,苩bó,侼bó,勃bó,胉bó,郣bó,亳bó,挬bó,浡bó,瓟bó,秡bó,钹bó,铂bó,桲bó,淿bó,舶bó,博bó,渤bó,湐bó,葧bó,鹁bó,愽bó,搏bó,猼bó,鈸bó,鉑bó,馎bó,僰bó,煿bó,箔bó,膊bó,艊bó,馛bó,駁bó,踣bó,鋍bó,镈bó,壆bó,馞bó,駮bó,豰bó,嚗bó,懪bó,礡bó,簙bó,鎛bó,餺bó,鵓bó,犦bó,髆bó,髉bó,欂bó,襮bó,礴bó,鑮bó,肑bó,茀bó,袹bó,穛bó,彴bó,瓝bó,牔bó,蚾bǒ,箥bǒ,跛bǒ,簸bò,孹bò,擘bò,檗bò,糪bò,譒bò,蘗bò,襎bò,檘bò,蔢bò,峬bū,庯bū,逋bū,钸bū,晡bū,鈽bū,誧bū,餔bū,鵏bū,秿bū,陠bū,鯆bū,轐bú,醭bú,不bú,輹bú,卟bǔ,补bǔ,哺bǔ,捕bǔ,補bǔ,鳪bǔ,獛bǔ,鸔bǔ,擈bǔ,佈bù,吥bù,步bù,咘bù,怖bù,歨bù,歩bù,钚bù,勏bù,埗bù,悑bù,捗bù,荹bù,部bù,埠bù,瓿bù,鈈bù,廍bù,蔀bù,踄bù,郶bù,篰bù,餢bù,簿bù,尃bù,箁bù,抪bù,柨bù,布bù,擦cā,攃cā,礤cǎ,礸cǎ,遪cà,偲cāi,猜cāi,揌cāi,才cái,材cái,财cái,財cái,戝cái,裁cái,采cǎi,倸cǎi,埰cǎi,婇cǎi,寀cǎi,彩cǎi,採cǎi,睬cǎi,跴cǎi,綵cǎi,踩cǎi,菜cài,棌cài,蔡cài,縩cài,乲cal,参cān,參cān,飡cān,骖cān,喰cān,湌cān,傪cān,嬠cān,餐cān,驂cān,嵾cān,飱cān,残cán,蚕cán,惭cán,殘cán,慚cán,蝅cán,慙cán,蠶cán,蠺cán,惨cǎn,慘cǎn,噆cǎn,憯cǎn,黪cǎn,黲cǎn,灿càn,粲càn,儏càn,澯càn,薒càn,燦càn,璨càn,爘càn,謲càn,仓cāng,沧cāng,苍cāng,倉cāng,舱cāng,凔cāng,嵢cāng,滄cāng,獊cāng,蒼cāng,濸cāng,艙cāng,螥cāng,罉cāng,藏cáng,欌cáng,鑶cáng,賶càng,撡cāo,操cāo,糙cāo,曺cáo,嘈cáo,嶆cáo,漕cáo,蓸cáo,槽cáo,褿cáo,艚cáo,螬cáo,鏪cáo,慒cáo,曹cáo,艹cǎo,艸cǎo,草cǎo,愺cǎo,懆cǎo,騲cǎo,慅cǎo,肏cào,鄵cào,襙cào,冊cè,册cè,侧cè,厕cè,恻cè,拺cè,测cè,荝cè,敇cè,側cè,粣cè,萗cè,廁cè,惻cè,測cè,策cè,萴cè,筞cè,蓛cè,墄cè,箣cè,憡cè,刂cè,厠cè,膥cēn,岑cén,梣cén,涔cén,硶cén,噌cēng,层céng,層céng,竲céng,驓céng,曾céng,蹭cèng,硛ceok,硳ceok,岾ceom,猠ceon,乽ceor,嚓chā,叉chā,扠chā,芆chā,杈chā,肞chā,臿chā,訍chā,偛chā,嗏chā,插chā,銟chā,锸chā,艖chā,疀chā,鍤chā,鎈chā,垞chá,查chá,査chá,茬chá,茶chá,嵖chá,猹chá,靫chá,槎chá,察chá,碴chá,褨chá,檫chá,搽chá,衩chǎ,镲chǎ,鑔chǎ,奼chà,汊chà,岔chà,侘chà,诧chà,剎chà,姹chà,差chà,紁chà,詫chà,拆chāi,钗chāi,釵chāi,犲chái,侪chái,柴chái,祡chái,豺chái,儕chái,喍chái,虿chài,袃chài,瘥chài,蠆chài,囆chài,辿chān,觇chān,梴chān,掺chān,搀chān,覘chān,裧chān,摻chān,鋓chān,幨chān,襜chān,攙chān,嚵chān,脠chān,婵chán,谗chán,孱chán,棎chán,湹chán,禅chán,馋chán,嬋chán,煘chán,缠chán,獑chán,蝉chán,誗chán,鋋chán,儃chán,廛chán,潹chán,潺chán,緾chán,磛chán,禪chán,毚chán,鄽chán,瀍chán,蟬chán,儳chán,劖chán,蟾chán,酁chán,壥chán,巉chán,瀺chán,纏chán,纒chán,躔chán,艬chán,讒chán,鑱chán,饞chán,繟chán,澶chán,镵chán,产chǎn,刬chǎn,旵chǎn,丳chǎn,浐chǎn,剗chǎn,谄chǎn,產chǎn,産chǎn,铲chǎn,阐chǎn,蒇chǎn,剷chǎn,嵼chǎn,摌chǎn,滻chǎn,幝chǎn,蕆chǎn,諂chǎn,閳chǎn,燀chǎn,簅chǎn,冁chǎn,醦chǎn,闡chǎn,囅chǎn,灛chǎn,讇chǎn,墠chǎn,骣chǎn,鏟chǎn,忏chàn,硟chàn,摲chàn,懴chàn,颤chàn,懺chàn,羼chàn,韂chàn,顫chàn,伥chāng,昌chāng,倀chāng,娼chāng,淐chāng,猖chāng,菖chāng,阊chāng,晿chāng,椙chāng,琩chāng,裮chāng,锠chāng,錩chāng,閶chāng,鲳chāng,鯧chāng,鼚chāng,兏cháng,肠cháng,苌cháng,尝cháng,偿cháng,常cháng,徜cháng,瓺cháng,萇cháng,甞cháng,腸cháng,嘗cháng,嫦cháng,瑺cháng,膓cháng,鋿cháng,償cháng,嚐cháng,蟐cháng,鲿cháng,鏛cháng,鱨cháng,棖cháng,尙cháng,厂chǎng,场chǎng,昶chǎng,場chǎng,敞chǎng,僘chǎng,廠chǎng,氅chǎng,鋹chǎng,惝chǎng,怅chàng,玚chàng,畅chàng,倡chàng,鬯chàng,唱chàng,悵chàng,暢chàng,畼chàng,誯chàng,韔chàng,抄chāo,弨chāo,怊chāo,欩chāo,钞chāo,焯chāo,超chāo,鈔chāo,繛chāo,樔chāo,绰chāo,綽chāo,綤chāo,牊cháo,巢cháo,巣cháo,朝cháo,鄛cháo,漅cháo,嘲cháo,潮cháo,窲cháo,罺cháo,轈cháo,晁cháo,吵chǎo,炒chǎo,眧chǎo,煼chǎo,麨chǎo,巐chǎo,粆chǎo,仦chào,耖chào,觘chào,趠chào,车chē,車chē,砗chē,唓chē,硨chē,蛼chē,莗chē,扯chě,偖chě,撦chě,彻chè,坼chè,迠chè,烢chè,聅chè,掣chè,硩chè,頙chè,徹chè,撤chè,澈chè,勶chè,瞮chè,爡chè,喢chè,賝chen,伧chen,傖chen,抻chēn,郴chēn,棽chēn,琛chēn,嗔chēn,綝chēn,諃chēn,尘chén,臣chén,忱chén,沉chén,辰chén,陈chén,茞chén,宸chén,烥chén,莐chén,陳chén,敐chén,晨chén,訦chén,谌chén,揨chén,煁chén,蔯chén,塵chén,樄chén,瘎chén,霃chén,螴chén,諶chén,麎chén,曟chén,鷐chén,薼chén,趻chěn,碜chěn,墋chěn,夦chěn,磣chěn,踸chěn,贂chěn,衬chèn,疢chèn,龀chèn,趁chèn,榇chèn,齓chèn,齔chèn,嚫chèn,谶chèn,襯chèn,讖chèn,瀋chèn,称chēng,稱chēng,阷chēng,泟chēng,柽chēng,爯chēng,棦chēng,浾chēng,偁chēng,蛏chēng,铛chēng,牚chēng,琤chēng,赪chēng,憆chēng,摚chēng,靗chēng,撐chēng,撑chēng,緽chēng,橕chēng,瞠chēng,赬chēng,頳chēng,檉chēng,竀chēng,蟶chēng,鏳chēng,鏿chēng,饓chēng,鐺chēng,丞chéng,成chéng,呈chéng,承chéng,枨chéng,诚chéng,郕chéng,乗chéng,城chéng,娍chéng,宬chéng,峸chéng,洆chéng,荿chéng,乘chéng,埕chéng,挰chéng,珹chéng,掁chéng,窚chéng,脭chéng,铖chéng,堘chéng,惩chéng,椉chéng,程chéng,筬chéng,絾chéng,裎chéng,塖chéng,溗chéng,碀chéng,誠chéng,畻chéng,酲chéng,鋮chéng,澄chéng,橙chéng,檙chéng,鯎chéng,瀓chéng,懲chéng,騬chéng,塍chéng,悜chěng,逞chěng,骋chěng,庱chěng,睈chěng,騁chěng,秤chèng,吃chī,妛chī,杘chī,侙chī,哧chī,蚩chī,鸱chī,瓻chī,眵chī,笞chī,訵chī,嗤chī,媸chī,摛chī,痴chī,瞝chī,螭chī,鴟chī,鵄chī,癡chī,魑chī,齝chī,攡chī,麶chī,彲chī,黐chī,蚳chī,摴chī,彨chī,弛chí,池chí,驰chí,迟chí,岻chí,茌chí,持chí,竾chí,淔chí,筂chí,貾chí,遅chí,馳chí,墀chí,踟chí,遲chí,篪chí,謘chí,尺chǐ,叺chǐ,呎chǐ,肔chǐ,卶chǐ,齿chǐ,垑chǐ,胣chǐ,恥chǐ,耻chǐ,蚇chǐ,豉chǐ,欼chǐ,歯chǐ,裭chǐ,鉹chǐ,褫chǐ,齒chǐ,侈chǐ,彳chì,叱chì,斥chì,灻chì,赤chì,饬chì,抶chì,勅chì,恜chì,炽chì,翄chì,翅chì,烾chì,痓chì,啻chì,湁chì,飭chì,傺chì,痸chì,腟chì,鉓chì,雴chì,憏chì,翤chì,遫chì,慗chì,瘛chì,翨chì,熾chì,懘chì,趩chì,饎chì,鶒chì,鷘chì,餝chì,歗chì,敕chì,充chōng,冲chōng,忡chōng,茺chōng,珫chōng,翀chōng,舂chōng,嘃chōng,摏chōng,憃chōng,憧chōng,衝chōng,罿chōng,艟chōng,蹖chōng,褈chōng,傭chōng,浺chōng,虫chóng,崇chóng,崈chóng,隀chóng,蟲chóng,宠chǒng,埫chǒng,寵chǒng,沖chòng,铳chòng,銃chòng,抽chōu,紬chōu,瘳chōu,篘chōu,犨chōu,犫chōu,跾chōu,掫chōu,仇chóu,俦chóu,栦chóu,惆chóu,绸chóu,菗chóu,畴chóu,絒chóu,愁chóu,皗chóu,稠chóu,筹chóu,酧chóu,酬chóu,綢chóu,踌chóu,儔chóu,雔chóu,嬦chóu,懤chóu,雠chóu,疇chóu,籌chóu,躊chóu,讎chóu,讐chóu,擣chóu,燽chóu,丑chǒu,丒chǒu,吜chǒu,杽chǒu,侴chǒu,瞅chǒu,醜chǒu,矁chǒu,魗chǒu,臭chòu,遚chòu,殠chòu,榋chu,橻chu,屮chū,出chū,岀chū,初chū,樗chū,貙chū,齣chū,刍chú,除chú,厨chú,滁chú,蒢chú,豠chú,锄chú,耡chú,蒭chú,蜍chú,趎chú,鉏chú,雏chú,犓chú,廚chú,篨chú,鋤chú,橱chú,懨chú,幮chú,櫉chú,蟵chú,躇chú,雛chú,櫥chú,蹰chú,鶵chú,躕chú,媰chú,杵chǔ,础chǔ,储chǔ,楮chǔ,禇chǔ,楚chǔ,褚chǔ,濋chǔ,儲chǔ,檚chǔ,璴chǔ,礎chǔ,齭chǔ,齼chǔ,処chǔ,椘chǔ,亍chù,处chù,竌chù,怵chù,拀chù,绌chù,豖chù,竐chù,俶chù,敊chù,珿chù,絀chù,處chù,傗chù,琡chù,搐chù,触chù,踀chù,閦chù,儊chù,憷chù,斶chù,歜chù,臅chù,黜chù,觸chù,矗chù,觕chù,畜chù,鄐chù,搋chuāi,揣chuāi,膗chuái,嘬chuài,踹chuài,膪chuài,巛chuān,川chuān,氚chuān,穿chuān,剶chuān,瑏chuān,传chuán,舡chuán,船chuán,猭chuán,遄chuán,傳chuán,椽chuán,歂chuán,暷chuán,輲chuán,甎chuán,舛chuǎn,荈chuǎn,喘chuǎn,僢chuǎn,堾chuǎn,踳chuǎn,汌chuàn,串chuàn,玔chuàn,钏chuàn,釧chuàn,賗chuàn,刅chuāng,炊chuī,龡chuī,圌chuí,垂chuí,桘chuí,陲chuí,捶chuí,菙chuí,棰chuí,槌chuí,锤chuí,箠chuí,顀chuí,錘chuí,鰆chun,旾chūn,杶chūn,春chūn,萅chūn,媋chūn,暙chūn,椿chūn,槆chūn,瑃chūn,箺chūn,蝽chūn,橁chūn,輴chūn,櫄chūn,鶞chūn,纯chún,陙chún,唇chún,浱chún,純chún,莼chún,淳chún,脣chún,犉chún,滣chún,鹑chún,漘chún,醇chún,醕chún,鯙chún,鶉chún,蒓chún,偆chǔn,萶chǔn,惷chǔn,睶chǔn,賰chǔn,蠢chǔn,踔chuō,戳chuō,啜chuò,辵chuò,娕chuò,娖chuò,惙chuò,涰chuò,逴chuò,辍chuò,酫chuò,龊chuò,擉chuò,磭chuò,歠chuò,嚽chuò,齪chuò,鑡chuò,齱chuò,婼chuò,鋜chuò,輟chuò,呲cī,玼cī,疵cī,趀cī,偨cī,縒cī,跐cī,髊cī,齹cī,枱cī,词cí,珁cí,垐cí,柌cí,祠cí,茨cí,瓷cí,詞cí,辝cí,慈cí,甆cí,辞cí,鈶cí,雌cí,鹚cí,糍cí,辤cí,飺cí,餈cí,嬨cí,濨cí,鴜cí,礠cí,辭cí,鶿cí,鷀cí,磁cí,此cǐ,佌cǐ,皉cǐ,朿cì,次cì,佽cì,刺cì,刾cì,庛cì,茦cì,栨cì,莿cì,絘cì,赐cì,螆cì,賜cì,蛓cì,嗭cis,囱cōng,匆cōng,囪cōng,苁cōng,忩cōng,枞cōng,茐cōng,怱cōng,悤cōng,棇cōng,焧cōng,葱cōng,楤cōng,漗cōng,聡cōng,蔥cōng,骢cōng,暰cōng,樅cōng,樬cōng,瑽cōng,璁cōng,聪cōng,瞛cōng,篵cōng,聰cōng,蟌cōng,繱cōng,鏦cōng,騘cōng,驄cōng,聦cōng,从cóng,從cóng,丛cóng,従cóng,婃cóng,孮cóng,徖cóng,悰cóng,淙cóng,琮cóng,漎cóng,誴cóng,賨cóng,賩cóng,樷cóng,藂cóng,叢cóng,灇cóng,欉cóng,爜cóng,憁còng,謥còng,凑còu,湊còu,楱còu,腠còu,辏còu,輳còu,粗cū,麁cū,麄cū,麤cū,徂cú,殂cú,蔖cǔ,促cù,猝cù,媨cù,瘄cù,蔟cù,誎cù,趗cù,憱cù,醋cù,瘯cù,簇cù,縬cù,鼀cù,蹴cù,蹵cù,顣cù,蹙cù,汆cuān,撺cuān,镩cuān,蹿cuān,攛cuān,躥cuān,鑹cuān,攅cuán,櫕cuán,巑cuán,攢cuán,窜cuàn,熶cuàn,篡cuàn,殩cuàn,篹cuàn,簒cuàn,竄cuàn,爨cuàn,乼cui,崔cuī,催cuī,凗cuī,墔cuī,摧cuī,榱cuī,獕cuī,磪cuī,鏙cuī,漼cuī,慛cuī,璀cuǐ,皠cuǐ,熣cuǐ,繀cuǐ,忰cuì,疩cuì,翆cuì,脃cuì,脆cuì,啐cuì,啛cuì,悴cuì,淬cuì,萃cuì,毳cuì,焠cuì,瘁cuì,粹cuì,膵cuì,膬cuì,竁cuì,臎cuì,琗cuì,粋cuì,脺cuì,翠cuì,邨cūn,村cūn,皴cūn,澊cūn,竴cūn,存cún,刌cǔn,忖cǔn,寸cùn,籿cùn,襊cuō,搓cuō,瑳cuō,遳cuō,磋cuō,撮cuō,蹉cuō,醝cuō,虘cuó,嵯cuó,痤cuó,矬cuó,蒫cuó,鹾cuó,鹺cuó,嵳cuó,脞cuǒ,剉cuò,剒cuò,厝cuò,夎cuò,挫cuò,莝cuò,莡cuò,措cuò,逪cuò,棤cuò,锉cuò,蓌cuò,错cuò,銼cuò,錯cuò,疸da,咑dā,哒dā,耷dā,畣dā,搭dā,嗒dā,噠dā,撘dā,鎝dā,笚dā,矺dā,褡dā,墶dá,达dá,迏dá,迖dá,妲dá,怛dá,垯dá,炟dá,羍dá,荅dá,荙dá,剳dá,匒dá,笪dá,逹dá,溚dá,答dá,詚dá,達dá,跶dá,瘩dá,靼dá,薘dá,鞑dá,燵dá,蟽dá,鎉dá,躂dá,鐽dá,韃dá,龖dá,龘dá,搨dá,繨dá,打dǎ,觰dǎ,大dà,亣dà,眔dà,橽dà,汏dà,呆dāi,獃dāi,懛dāi,歹dǎi,傣dǎi,逮dǎi,代dài,轪dài,侢dài,垈dài,岱dài,帒dài,甙dài,绐dài,迨dài,带dài,待dài,柋dài,殆dài,玳dài,贷dài,帯dài,軑dài,埭dài,帶dài,紿dài,蚮dài,袋dài,軚dài,貸dài,軩dài,瑇dài,廗dài,叇dài,曃dài,緿dài,鮘dài,鴏dài,戴dài,艜dài,黛dài,簤dài,蹛dài,瀻dài,霴dài,襶dài,靆dài,螮dài,蝳dài,跢dài,箉dài,骀dài,怠dài,黱dài,愖dān,丹dān,妉dān,单dān,担dān,単dān,眈dān,砃dān,耼dān,耽dān,郸dān,聃dān,躭dān,酖dān,單dān,媅dān,殚dān,瘅dān,匰dān,箪dān,褝dān,鄲dān,頕dān,儋dān,勯dān,擔dān,殫dān,癉dān,襌dān,簞dān,瓭dān,卩dān,亻dān,娊dān,噡dān,聸dān,伔dǎn,刐dǎn,狚dǎn,玬dǎn,胆dǎn,衴dǎn,紞dǎn,掸dǎn,亶dǎn,馾dǎn,撣dǎn,澸dǎn,黕dǎn,膽dǎn,丼dǎn,抌dǎn,赕dǎn,賧dǎn,黵dǎn,黮dǎn,繵dàn,譂dàn,旦dàn,但dàn,帎dàn,沊dàn,泹dàn,诞dàn,柦dàn,疍dàn,啖dàn,啗dàn,弹dàn,惮dàn,淡dàn,蛋dàn,啿dàn,氮dàn,腅dàn,蜑dàn,觛dàn,窞dàn,誕dàn,僤dàn,噉dàn,髧dàn,嘾dàn,彈dàn,憚dàn,憺dàn,澹dàn,禫dàn,餤dàn,駳dàn,鴠dàn,甔dàn,癚dàn,嚪dàn,贉dàn,霮dàn,饏dàn,蟺dàn,倓dàn,惔dàn,弾dàn,醈dàn,撢dàn,萏dàn,当dāng,珰dāng,裆dāng,筜dāng,儅dāng,噹dāng,澢dāng,璫dāng,襠dāng,簹dāng,艡dāng,蟷dāng,當dāng,挡dǎng,党dǎng,谠dǎng,擋dǎng,譡dǎng,黨dǎng,灙dǎng,欓dǎng,讜dǎng,氹dàng,凼dàng,圵dàng,宕dàng,砀dàng,垱dàng,荡dàng,档dàng,菪dàng,瓽dàng,逿dàng,潒dàng,碭dàng,瞊dàng,蕩dàng,趤dàng,壋dàng,檔dàng,璗dàng,盪dàng,礑dàng,簜dàng,蘯dàng,闣dàng,愓dàng,嵣dàng,偒dàng,雼dàng,裯dāo,刀dāo,叨dāo,屶dāo,忉dāo,氘dāo,舠dāo,釖dāo,鱽dāo,魛dāo,虭dāo,捯dáo,导dǎo,岛dǎo,陦dǎo,倒dǎo,宲dǎo,捣dǎo,祷dǎo,禂dǎo,搗dǎo,隝dǎo,嶋dǎo,嶌dǎo,槝dǎo,導dǎo,隯dǎo,壔dǎo,嶹dǎo,蹈dǎo,禱dǎo,菿dǎo,島dǎo,帱dào,幬dào,到dào,悼dào,盗dào,椡dào,盜dào,道dào,稲dào,翢dào,噵dào,稻dào,衜dào,檤dào,衟dào,翿dào,軇dào,瓙dào,纛dào,箌dào,的de,嘚dē,恴dé,得dé,淂dé,悳dé,惪dé,锝dé,徳dé,德dé,鍀dé,棏dé,揼dem,扥den,扽den,灯dēng,登dēng,豋dēng,噔dēng,嬁dēng,燈dēng,璒dēng,竳dēng,簦dēng,艠dēng,覴dēng,蹬dēng,墱dēng,戥děng,等děng,澂dèng,邓dèng,僜dèng,凳dèng,鄧dèng,隥dèng,嶝dèng,瞪dèng,磴dèng,镫dèng,櫈dèng,鐙dèng,仾dī,低dī,奃dī,彽dī,袛dī,啲dī,埞dī,羝dī,隄dī,堤dī,趆dī,嘀dī,滴dī,磾dī,鍉dī,鞮dī,氐dī,牴dī,碮dī,踧dí,镝dí,廸dí,狄dí,籴dí,苖dí,迪dí,唙dí,敌dí,涤dí,荻dí,梑dí,笛dí,觌dí,靮dí,滌dí,髢dí,嫡dí,蔋dí,蔐dí,頔dí,魡dí,敵dí,篴dí,嚁dí,藡dí,豴dí,糴dí,覿dí,鸐dí,藋dí,鬄dí,樀dí,蹢dí,鏑dí,泜dǐ,诋dǐ,邸dǐ,阺dǐ,呧dǐ,坻dǐ,底dǐ,弤dǐ,抵dǐ,拞dǐ,柢dǐ,砥dǐ,掋dǐ,菧dǐ,詆dǐ,軧dǐ,聜dǐ,骶dǐ,鯳dǐ,坘dǐ,厎dǐ,赿dì,地dì,弚dì,坔dì,弟dì,旳dì,杕dì,玓dì,怟dì,枤dì,苐dì,帝dì,埊dì,娣dì,递dì,逓dì,偙dì,啇dì,梊dì,焍dì,眱dì,祶dì,第dì,菂dì,谛dì,釱dì,媂dì,棣dì,睇dì,缔dì,蒂dì,僀dì,禘dì,腣dì,遞dì,鉪dì,馰dì,墑dì,墬dì,摕dì,碲dì,蝃dì,遰dì,慸dì,甋dì,締dì,嶳dì,諦dì,踶dì,弔dì,嵽dì,諟dì,珶dì,渧dì,蹏dì,揥dì,墆dì,疐dì,俤dì,蔕dì,嗲diǎ,敁diān,掂diān,傎diān,厧diān,嵮diān,滇diān,槙diān,瘨diān,颠diān,蹎diān,巅diān,顚diān,顛diān,癫diān,巓diān,巔diān,攧diān,癲diān,齻diān,槇diān,典diǎn,点diǎn,婰diǎn,敟diǎn,椣diǎn,碘diǎn,蒧diǎn,蕇diǎn,踮diǎn,點diǎn,痶diǎn,丶diǎn,奌diǎn,电diàn,佃diàn,甸diàn,坫diàn,店diàn,垫diàn,扂diàn,玷diàn,钿diàn,唸diàn,婝diàn,惦diàn,淀diàn,奠diàn,琔diàn,殿diàn,蜔diàn,鈿diàn,電diàn,墊diàn,橂diàn,澱diàn,靛diàn,磹diàn,癜diàn,簟diàn,驔diàn,腍diàn,橝diàn,壂diàn,刁diāo,叼diāo,汈diāo,刟diāo,凋diāo,奝diāo,弴diāo,彫diāo,蛁diāo,琱diāo,貂diāo,碉diāo,鳭diāo,殦diāo,雕diāo,鮉diāo,鲷diāo,簓diāo,鼦diāo,鯛diāo,鵰diāo,颩diāo,矵diāo,錭diāo,淍diāo,屌diǎo,鸼diǎo,鵃diǎo,扚diǎo,伄diào,吊diào,钓diào,窎diào,訋diào,调diào,掉diào,釣diào,铞diào,鈟diào,竨diào,銱diào,雿diào,調diào,瘹diào,窵diào,鋽diào,鑃diào,誂diào,嬥diào,絩diào,爹diē,跌diē,褺diē,跮dié,苵dié,迭dié,垤dié,峌dié,恎dié,绖dié,胅dié,瓞dié,眣dié,耊dié,啑dié,戜dié,谍dié,喋dié,堞dié,幉dié,惵dié,揲dié,畳dié,絰dié,耋dié,臷dié,詄dié,趃dié,叠dié,殜dié,牃dié,牒dié,镻dié,碟dié,蜨dié,褋dié,艓dié,蝶dié,諜dié,蹀dié,鲽dié,曡dié,鰈dié,疉dié,疊dié,氎dié,渉dié,崼dié,鮙dié,跕dié,鐡dié,怢dié,槢dié,挃dié,柣dié,螲dié,疂dié,眰diè,嚸dim,丁dīng,仃dīng,叮dīng,帄dīng,玎dīng,甼dīng,疔dīng,盯dīng,耵dīng,靪dīng,奵dīng,町dīng,虰dīng,酊dǐng,顶dǐng,頂dǐng,鼎dǐng,鼑dǐng,薡dǐng,鐤dǐng,顁dǐng,艼dǐng,濎dǐng,嵿dǐng,钉dìng,釘dìng,订dìng,忊dìng,饤dìng,矴dìng,定dìng,訂dìng,飣dìng,啶dìng,萣dìng,椗dìng,腚dìng,碇dìng,锭dìng,碠dìng,聢dìng,錠dìng,磸dìng,铤dìng,鋌dìng,掟dìng,丟diū,丢diū,铥diū,銩diū,东dōng,冬dōng,咚dōng,東dōng,苳dōng,昸dōng,氡dōng,倲dōng,鸫dōng,埬dōng,娻dōng,崬dōng,涷dōng,笗dōng,菄dōng,氭dōng,蝀dōng,鮗dōng,鼕dōng,鯟dōng,鶇dōng,鶫dōng,徚dōng,夂dōng,岽dōng,揰dǒng,董dǒng,墥dǒng,嬞dǒng,懂dǒng,箽dǒng,蕫dǒng,諌dǒng,湩dǒng,动dòng,冻dòng,侗dòng,垌dòng,峒dòng,峝dòng,恫dòng,挏dòng,栋dòng,洞dòng,胨dòng,迵dòng,凍dòng,戙dòng,胴dòng,動dòng,崠dòng,硐dòng,棟dòng,腖dòng,働dòng,詷dòng,駧dòng,霘dòng,狫dòng,烔dòng,絧dòng,衕dòng,勭dòng,騆dòng,姛dòng,瞗dōu,吺dōu,剅dōu,唗dōu,都dōu,兜dōu,兠dōu,蔸dōu,橷dōu,篼dōu,侸dōu,艔dóu,乧dǒu,阧dǒu,抖dǒu,枓dǒu,陡dǒu,蚪dǒu,鈄dǒu,斗dòu,豆dòu,郖dòu,浢dòu,荳dòu,逗dòu,饾dòu,鬥dòu,梪dòu,毭dòu,脰dòu,酘dòu,痘dòu,閗dòu,窦dòu,鬦dòu,鋀dòu,餖dòu,斣dòu,闘dòu,竇dòu,鬪dòu,鬭dòu,凟dòu,鬬dòu,剢dū,阇dū,嘟dū,督dū,醏dū,闍dū,厾dū,毒dú,涜dú,读dú,渎dú,椟dú,牍dú,犊dú,裻dú,読dú,獨dú,錖dú,匵dú,嬻dú,瀆dú,櫝dú,殰dú,牘dú,犢dú,瓄dú,皾dú,騳dú,讀dú,豄dú,贕dú,韣dú,髑dú,鑟dú,韇dú,韥dú,黷dú,讟dú,独dú,樚dú,襡dú,襩dú,黩dú,笃dǔ,堵dǔ,帾dǔ,琽dǔ,赌dǔ,睹dǔ,覩dǔ,賭dǔ,篤dǔ,暏dǔ,笁dǔ,陼dǔ,芏dù,妒dù,杜dù,肚dù,妬dù,度dù,荰dù,秺dù,渡dù,镀dù,螙dù,殬dù,鍍dù,蠧dù,蠹dù,剫dù,晵dù,靯dù,篅duān,偳duān,媏duān,端duān,褍duān,鍴duān,剬duān,短duǎn,段duàn,断duàn,塅duàn,缎duàn,葮duàn,椴duàn,煅duàn,瑖duàn,腶duàn,碫duàn,锻duàn,緞duàn,毈duàn,簖duàn,鍛duàn,斷duàn,躖duàn,煆duàn,籪duàn,叾dug,搥duī,鎚duī,垖duī,堆duī,塠duī,嵟duī,痽duī,磓duī,頧duī,鴭duī,鐜duī,埻duī,謉duǐ,錞duì,队duì,对duì,兊duì,兌duì,兑duì,対duì,祋duì,怼duì,陮duì,隊duì,碓duì,綐duì,對duì,憝duì,濧duì,薱duì,镦duì,懟duì,瀩duì,譈duì,譵duì,憞duì,鋭duì,杸duì,吨dūn,惇dūn,敦dūn,蜳dūn,墩dūn,墪dūn,壿dūn,撴dūn,獤dūn,噸dūn,撉dūn,橔dūn,犜dūn,礅dūn,蹲dūn,蹾dūn,驐dūn,鐓dūn,盹dǔn,趸dǔn,躉dǔn,伅dùn,囤dùn,庉dùn,沌dùn,炖dùn,盾dùn,砘dùn,逇dùn,钝dùn,遁dùn,鈍dùn,腞dùn,頓dùn,碷dùn,遯dùn,潡dùn,燉dùn,踲dùn,楯dùn,腯dùn,顿dùn,多duō,夛duō,咄duō,哆duō,茤duō,剟duō,崜duō,敠duō,毲duō,裰duō,嚉duō,掇duō,仛duó,夺duó,铎duó,敓duó,敚duó,喥duó,敪duó,鈬duó,奪duó,凙duó,踱duó,鮵duó,鐸duó,跿duó,沰duó,痥duó,奲duǒ,朵duǒ,朶duǒ,哚duǒ,垛duǒ,挅duǒ,挆duǒ,埵duǒ,缍duǒ,椯duǒ,趓duǒ,躱duǒ,躲duǒ,綞duǒ,亸duǒ,鬌duǒ,嚲duǒ,垜duǒ,橢duǒ,硾duǒ,吋duò,刴duò,剁duò,沲duò,陊duò,陏duò,饳duò,柮duò,桗duò,堕duò,舵duò,惰duò,跥duò,跺duò,飿duò,墮duò,嶞duò,憜duò,墯duò,鵽duò,隓duò,貀duò,詑duò,駄duò,媠duò,嫷duò,尮duò,呃e,妸ē,妿ē,娿ē,婀ē,匼ē,讹é,吪é,囮é,迗é,俄é,娥é,峨é,峩é,涐é,莪é,珴é,訛é,睋é,鈋é,锇é,鹅é,蛾é,磀é,誐é,鋨é,頟é,额é,魤é,額é,鵝é,鵞é,譌é,騀é,佮é,鰪é,皒é,欸ě,枙ě,砈ě,鵈ě,玀ě,閜ě,砵è,惡è,厄è,歺è,屵è,戹è,岋è,阨è,扼è,阸è,呝è,砐è,轭è,咢è,咹è,垩è,姶è,峉è,匎è,恶è,砨è,蚅è,饿è,偔è,卾è,堊è,悪è,硆è,谔è,軛è,鄂è,阏è,堮è,崿è,愕è,湂è,萼è,豟è,軶è,遏è,廅è,搤è,搹è,琧è,腭è,詻è,僫è,蝁è,锷è,鹗è,蕚è,遻è,頞è,颚è,餓è,噩è,擜è,覨è,諤è,餩è,鍔è,鳄è,歞è,顎è,櫮è,鰐è,鶚è,讍è,齶è,鱷è,齃è,啈è,搕è,礘è,魥è,蘁è,齾è,苊è,遌è,鑩è,诶ēi,誒ēi,奀ēn,恩ēn,蒽ēn,煾ēn,唔én,峎ěn,摁èn,嗯èn,鞥eng,仒eo,乻eol,旕eos,儿ér,而ér,児ér,侕ér,兒ér,陑ér,峏ér,洏ér,耏ér,荋ér,栭ér,胹ér,唲ér,袻ér,鸸ér,粫ér,聏ér,輀ér,隭ér,髵ér,鮞ér,鴯ér,轜ér,咡ér,杒ér,陾ér,輭ér,鲕ér,尒ěr,尓ěr,尔ěr,耳ěr,迩ěr,洱ěr,饵ěr,栮ěr,毦ěr,珥ěr,铒ěr,爾ěr,鉺ěr,餌ěr,駬ěr,薾ěr,邇ěr,趰ěr,嬭ěr,二èr,弍èr,弐èr,佴èr,刵èr,贰èr,衈èr,貳èr,誀èr,樲èr,髶èr,貮èr,发fā,沷fā,発fā,發fā,彂fā,髪fā,橃fā,醗fā,乏fá,伐fá,姂fá,垡fá,罚fá,阀fá,栰fá,傠fá,筏fá,瞂fá,罰fá,閥fá,罸fá,藅fá,汎fá,佱fǎ,法fǎ,鍅fǎ,灋fǎ,砝fǎ,珐fà,琺fà,髮fà,蕟fà,帆fān,忛fān,犿fān,番fān,勫fān,墦fān,嬏fān,幡fān,憣fān,旙fān,旛fān,翻fān,藩fān,轓fān,颿fān,飜fān,鱕fān,蕃fān,凡fán,凢fán,凣fán,匥fán,杋fán,柉fán,籵fán,钒fán,舤fán,烦fán,舧fán,笲fán,釩fán,棥fán,煩fán,緐fán,樊fán,橎fán,燔fán,璠fán,薠fán,繁fán,繙fán,羳fán,蹯fán,瀿fán,礬fán,蘩fán,鐇fán,蠜fán,鷭fán,氾fán,瀪fán,渢fán,伋fán,舩fán,矾fán,反fǎn,仮fǎn,辺fǎn,返fǎn,攵fǎn,犭fǎn,払fǎn,犯fàn,奿fàn,泛fàn,饭fàn,范fàn,贩fàn,畈fàn,訉fàn,軓fàn,梵fàn,盕fàn,笵fàn,販fàn,軬fàn,飯fàn,飰fàn,滼fàn,嬎fàn,範fàn,嬔fàn,婏fàn,方fāng,邡fāng,坊fāng,芳fāng,牥fāng,钫fāng,淓fāng,堏fāng,鈁fāng,錺fāng,鴋fāng,埅fāng,枋fāng,防fáng,妨fáng,房fáng,肪fáng,鲂fáng,魴fáng,仿fǎng,访fǎng,纺fǎng,昉fǎng,昘fǎng,瓬fǎng,眆fǎng,倣fǎng,旊fǎng,紡fǎng,舫fǎng,訪fǎng,髣fǎng,鶭fǎng,放fàng,飞fēi,妃fēi,非fēi,飛fēi,啡fēi,婓fēi,婔fēi,渄fēi,绯fēi,菲fēi,扉fēi,猆fēi,靟fēi,裶fēi,緋fēi,蜚fēi,霏fēi,鲱fēi,餥fēi,馡fēi,騑fēi,騛fēi,鯡fēi,飝fēi,奜fēi,肥féi,淝féi,暃féi,腓féi,蜰féi,棐féi,萉féi,蟦féi,朏fěi,胐fěi,匪fěi,诽fěi,悱fěi,斐fěi,榧fěi,翡fěi,蕜fěi,誹fěi,篚fěi,襏fèi,吠fèi,废fèi,沸fèi,狒fèi,肺fèi,昲fèi,费fèi,俷fèi,剕fèi,厞fèi,疿fèi,屝fèi,廃fèi,費fèi,痱fèi,廢fèi,曊fèi,癈fèi,鼣fèi,濷fèi,櫠fèi,鐨fèi,靅fèi,蕡fèi,芾fèi,笰fèi,紼fèi,髴fèi,柹fèi,胏fèi,镄fèi,吩fēn,帉fēn,纷fēn,芬fēn,昐fēn,氛fēn,竕fēn,紛fēn,翂fēn,棻fēn,躮fēn,酚fēn,鈖fēn,雰fēn,朆fēn,餴fēn,饙fēn,錀fēn,坟fén,妢fén,岎fén,汾fén,枌fén,梤fén,羒fén,蚠fén,蚡fén,棼fén,焚fén,蒶fén,馚fén,隫fén,墳fén,幩fén,魵fén,橨fén,燓fén,豮fén,鼢fén,羵fén,鼖fén,豶fén,轒fén,馩fén,黂fén,鐼fén,粉fěn,瞓fěn,黺fěn,分fèn,份fèn,坋fèn,弅fèn,奋fèn,忿fèn,秎fèn,偾fèn,愤fèn,粪fèn,僨fèn,憤fèn,奮fèn,膹fèn,糞fèn,鲼fèn,瀵fèn,鱝fèn,丰fēng,风fēng,仹fēng,凨fēng,凬fēng,妦fēng,沣fēng,沨fēng,枫fēng,封fēng,疯fēng,盽fēng,砜fēng,風fēng,峯fēng,峰fēng,偑fēng,桻fēng,烽fēng,琒fēng,崶fēng,溄fēng,猦fēng,葑fēng,锋fēng,楓fēng,犎fēng,蜂fēng,瘋fēng,碸fēng,僼fēng,篈fēng,鄷fēng,鋒fēng,檒fēng,豐fēng,鎽fēng,酆fēng,寷fēng,灃fēng,蘴fēng,靊fēng,飌fēng,麷fēng,豊fēng,凮fēng,鏠fēng,冯féng,捀féng,浲féng,逢féng,堸féng,馮féng,綘féng,缝féng,艂féng,縫féng,讽fěng,唪fěng,諷fěng,凤fèng,奉fèng,甮fèng,俸fèng,湗fèng,焨fèng,煈fèng,鳯fèng,鳳fèng,鴌fèng,賵fèng,蘕fèng,赗fèng,覅fiao,仏fó,佛fó,坲fó,梻fó,垺fóu,紑fóu,缶fǒu,否fǒu,缹fǒu,缻fǒu,雬fǒu,鴀fǒu,芣fǒu,夫fū,邞fū,呋fū,姇fū,枎fū,玞fū,肤fū,怤fū,砆fū,胕fū,荂fū,衭fū,娐fū,荴fū,旉fū,紨fū,趺fū,酜fū,麸fū,稃fū,跗fū,鈇fū,筟fū,綒fū,鄜fū,孵fū,豧fū,敷fū,膚fū,鳺fū,麩fū,糐fū,麬fū,麱fū,懯fū,烰fū,琈fū,粰fū,璷fū,伕fú,乀fú,伏fú,凫fú,甶fú,冹fú,刜fú,孚fú,扶fú,芙fú,咈fú,岪fú,彿fú,怫fú,拂fú,服fú,泭fú,绂fú,绋fú,苻fú,俘fú,垘fú,柫fú,氟fú,洑fú,炥fú,玸fú,祓fú,罘fú,茯fú,郛fú,韨fú,鳬fú,哹fú,栿fú,浮fú,畗fú,砩fú,蚨fú,匐fú,桴fú,涪fú,符fú,紱fú,翇fú,艴fú,菔fú,虙fú,袱fú,幅fú,棴fú,罦fú,葍fú,福fú,綍fú,艀fú,蜉fú,辐fú,鉘fú,鉜fú,颫fú,鳧fú,榑fú,稪fú,箙fú,複fú,韍fú,幞fú,澓fú,蝠fú,鴔fú,諨fú,輻fú,鮄fú,癁fú,鮲fú,黻fú,鵩fú,坿fú,汱fú,酻fú,弗fú,畉fú,絥fú,抚fǔ,甫fǔ,府fǔ,弣fǔ,拊fǔ,斧fǔ,俌fǔ,郙fǔ,俯fǔ,釜fǔ,釡fǔ,捬fǔ,辅fǔ,椨fǔ,焤fǔ,盙fǔ,腑fǔ,滏fǔ,腐fǔ,輔fǔ,撫fǔ,鬴fǔ,簠fǔ,黼fǔ,蚥fǔ,窗chuāng,窻chuāng,傸chuǎng,创chuàng,創chuàng,庄zhuāng,妝zhuāng,荘zhuāng,娤zhuāng,桩zhuāng,讣fù,付fù,妇fù,负fù,附fù,咐fù,竎fù,阜fù,驸fù,复fù,峊fù,祔fù,訃fù,負fù,赴fù,袝fù,偩fù,冨fù,副fù,婦fù,蚹fù,傅fù,媍fù,富fù,復fù,蛗fù,覄fù,詂fù,赋fù,椱fù,缚fù,腹fù,鲋fù,禣fù,褔fù,赙fù,緮fù,蕧fù,蝜fù,蝮fù,賦fù,駙fù,縛fù,鮒fù,賻fù,鍑fù,鍢fù,鳆fù,覆fù,馥fù,鰒fù,軵fù,邚fù,柎fù,父fù,萯fù,旮gā,伽gā,嘎gā,夾gā,呷gā,钆gá,尜gá,釓gá,噶gá,錷gá,嘠gá,尕gǎ,玍gǎ,尬gà,魀gà,侅gāi,该gāi,郂gāi,陔gāi,垓gāi,姟gāi,峐gāi,荄gāi,晐gāi,赅gāi,畡gāi,祴gāi,絯gāi,該gāi,豥gāi,賅gāi,賌gāi,忋gǎi,改gǎi,鎅gǎi,絠gǎi,丐gài,乢gài,匃gài,匄gài,钙gài,盖gài,摡gài,溉gài,葢gài,鈣gài,戤gài,概gài,蓋gài,槩gài,槪gài,漑gài,瓂gài,甘gān,忓gān,芉gān,迀gān,攼gān,玕gān,肝gān,坩gān,泔gān,柑gān,竿gān,疳gān,酐gān,粓gān,亁gān,凲gān,尲gān,尴gān,筸gān,漧gān,鳱gān,尶gān,尷gān,魐gān,矸gān,虷gān,釬gān,乹gān,諴gān,飦gān,苷gān,杆gǎn,仠gǎn,皯gǎn,秆gǎn,衦gǎn,赶gǎn,敢gǎn,桿gǎn,笴gǎn,稈gǎn,感gǎn,澉gǎn,趕gǎn,橄gǎn,擀gǎn,簳gǎn,鱤gǎn,篢gǎn,豃gǎn,扞gǎn,鰔gǎn,扜gǎn,鳡gǎn,干gàn,旰gàn,汵gàn,盰gàn,绀gàn,倝gàn,凎gàn,淦gàn,紺gàn,詌gàn,骭gàn,幹gàn,檊gàn,赣gàn,贛gàn,灨gàn,贑gàn,佄gàn,錎gàn,棡gang,冈gāng,罓gāng,冮gāng,刚gāng,阬gāng,纲gāng,肛gāng,岡gāng,牨gāng,疘gāng,矼gāng,钢gāng,剛gāng,罡gāng,堈gāng,釭gāng,犅gāng,堽gāng,綱gāng,罁gāng,鋼gāng,鎠gāng,頏gāng,缸gāng,岗gǎng,崗gǎng,港gǎng,犺gǎng,掆gàng,杠gàng,焵gàng,筻gàng,槓gàng,戆gàng,戇gàng,戅gàng,皋gāo,羔gāo,高gāo,皐gāo,髙gāo,臯gāo,滜gāo,睾gāo,膏gāo,槹gāo,橰gāo,篙gāo,糕gāo,餻gāo,櫜gāo,韟gāo,鷎gāo,鼛gāo,鷱gāo,獋gāo,槔gāo,夰gǎo,杲gǎo,菒gǎo,稁gǎo,搞gǎo,缟gǎo,槀gǎo,槁gǎo,獔gǎo,稾gǎo,稿gǎo,镐gǎo,縞gǎo,藁gǎo,檺gǎo,藳gǎo,鎬gǎo,筶gǎo,澔gǎo,吿gào,勂gào,诰gào,郜gào,峼gào,祮gào,祰gào,锆gào,暠gào,禞gào,誥gào,鋯gào,告gào,戈gē,圪gē,犵gē,纥gē,戓gē,肐gē,牫gē,疙gē,牱gē,紇gē,哥gē,胳gē,袼gē,鸽gē,割gē,搁gē,彁gē,歌gē,戨gē,鴐gē,鴚gē,擱gē,謌gē,鴿gē,鎶gē,咯gē,滒gē,杚gé,呄gé,匌gé,挌gé,阁gé,革gé,敋gé,格gé,鬲gé,愅gé,臵gé,裓gé,隔gé,嗝gé,塥gé,滆gé,觡gé,搿gé,膈gé,閣gé,镉gé,鞈gé,韐gé,骼gé,諽gé,鮯gé,櫊gé,鎘gé,韚gé,轕gé,鞷gé,騔gé,秴gé,詥gé,佫gé,嘅gé,猲gé,槅gé,閤gě,葛gě,哿gě,舸gě,鲄gě,个gè,各gè,虼gè,個gè,硌gè,铬gè,箇gè,鉻gè,獦gè,吤gè,给gěi,給gěi,根gēn,跟gēn,哏gén,亘gèn,艮gèn,茛gèn,揯gèn,搄gèn,亙gèn,刯gēng,庚gēng,畊gēng,浭gēng,耕gēng,掶gēng,菮gēng,椩gēng,焿gēng,絚gēng,赓gēng,鹒gēng,緪gēng,縆gēng,賡gēng,羹gēng,鶊gēng,絙gēng,郠gěng,哽gěng,埂gěng,峺gěng,挭gěng,耿gěng,莄gěng,梗gěng,鲠gěng,骾gěng,鯁gěng,郉gěng,绠gěng,更gèng,堩gèng,暅gèng,啹geu,喼gib,嗰go,工gōng,弓gōng,公gōng,厷gōng,功gōng,攻gōng,杛gōng,糼gōng,肱gōng,宫gōng,宮gōng,恭gōng,蚣gōng,躬gōng,龚gōng,匑gōng,塨gōng,愩gōng,觥gōng,躳gōng,匔gōng,碽gōng,髸gōng,觵gōng,龔gōng,魟gōng,幊gōng,巩gǒng,汞gǒng,拱gǒng,唝gǒng,拲gǒng,栱gǒng,珙gǒng,輁gǒng,鞏gǒng,嗊gǒng,銾gǒng,供gòng,共gòng,贡gòng,羾gòng,貢gòng,慐gòng,熕gòng,渱gòng,勾gōu,沟gōu,钩gōu,袧gōu,缑gōu,鈎gōu,溝gōu,鉤gōu,緱gōu,褠gōu,篝gōu,簼gōu,鞲gōu,冓gōu,搆gōu,抅gōu,泃gōu,軥gōu,鴝gōu,鸜gōu,佝gōu,岣gǒu,狗gǒu,苟gǒu,枸gǒu,玽gǒu,耇gǒu,耉gǒu,笱gǒu,耈gǒu,蚼gǒu,豿gǒu,坸gòu,构gòu,诟gòu,购gòu,垢gòu,姤gòu,够gòu,夠gòu,訽gòu,媾gòu,彀gòu,詬gòu,遘gòu,雊gòu,構gòu,煹gòu,觏gòu,撀gòu,覯gòu,購gòu,傋gòu,茩gòu,估gū,咕gū,姑gū,孤gū,沽gū,泒gū,柧gū,轱gū,唂gū,唃gū,罛gū,鸪gū,笟gū,菇gū,蛄gū,蓇gū,觚gū,軱gū,軲gū,辜gū,酤gū,毂gū,箍gū,箛gū,嫴gū,篐gū,橭gū,鮕gū,鴣gū,轂gū,苽gū,菰gū,鶻gú,鹘gǔ,古gǔ,扢gǔ,汩gǔ,诂gǔ,谷gǔ,股gǔ,峠gǔ,牯gǔ,骨gǔ,罟gǔ,逧gǔ,钴gǔ,傦gǔ,啒gǔ,淈gǔ,脵gǔ,蛊gǔ,蛌gǔ,尳gǔ,愲gǔ,焸gǔ,硲gǔ,詁gǔ,馉gǔ,榾gǔ,鈷gǔ,鼓gǔ,鼔gǔ,嘏gǔ,榖gǔ,皷gǔ,縎gǔ,糓gǔ,薣gǔ,濲gǔ,臌gǔ,餶gǔ,瀔gǔ,瞽gǔ,抇gǔ,嗀gǔ,羖gǔ,固gù,怘gù,故gù,凅gù,顾gù,堌gù,崓gù,崮gù,梏gù,牿gù,棝gù,祻gù,雇gù,痼gù,稒gù,锢gù,頋gù,僱gù,錮gù,鲴gù,鯝gù,顧gù,盬gù,瓜guā,刮guā,胍guā,鸹guā,焻guā,煱guā,颪guā,趏guā,劀guā,緺guā,銽guā,鴰guā,騧guā,呱guā,諣guā,栝guā,歄guā,冎guǎ,叧guǎ,剐guǎ,剮guǎ,啩guǎ,寡guǎ,卦guà,坬guà,诖guà,挂guà,掛guà,罣guà,絓guà,罫guà,褂guà,詿guà,乖guāi,拐guǎi,枴guǎi,柺guǎi,夬guài,叏guài,怪guài,恠guài,关guān,观guān,官guān,覌guān,倌guān,萖guān,棺guān,蒄guān,窤guān,瘝guān,癏guān,観guān,鳏guān,關guān,鰥guān,觀guān,鱞guān,馆guǎn,痯guǎn,筦guǎn,管guǎn,舘guǎn,錧guǎn,館guǎn,躀guǎn,鳤guǎn,輨guǎn,冠guàn,卝guàn,毌guàn,丱guàn,贯guàn,泴guàn,悺guàn,惯guàn,掼guàn,涫guàn,貫guàn,悹guàn,祼guàn,慣guàn,摜guàn,潅guàn,遦guàn,樌guàn,盥guàn,罆guàn,雚guàn,鏆guàn,灌guàn,爟guàn,瓘guàn,矔guàn,鹳guàn,罐guàn,鑵guàn,鸛guàn,鱹guàn,懽guàn,礶guàn,光guāng,灮guāng,侊guāng,炗guāng,炚guāng,炛guāng,咣guāng,垙guāng,姯guāng,洸guāng,茪guāng,桄guāng,烡guāng,珖guāng,胱guāng,硄guāng,僙guāng,輄guāng,銧guāng,黆guāng,欟guāng,趪guāng,挄guāng,广guǎng,広guǎng,犷guǎng,廣guǎng,臩guǎng,獷guǎng,俇guàng,逛guàng,臦guàng,撗guàng,櫎guàng,归guī,圭guī,妫guī,龟guī,规guī,邽guī,皈guī,茥guī,闺guī,帰guī,珪guī,胿guī,亀guī,硅guī,袿guī,規guī,椝guī,瑰guī,郌guī,嫢guī,摫guī,閨guī,鲑guī,嶲guī,槻guī,槼guī,璝guī,瞡guī,膭guī,鮭guī,龜guī,巂guī,歸guī,鬶guī,瓌guī,鬹guī,櫷guī,佹guī,櫰guī,螝guī,槣guī,鴂guī,鴃guī,傀guī,潙guī,雟guī,嬀guī,宄guǐ,氿guǐ,轨guǐ,庋guǐ,匦guǐ,诡guǐ,陒guǐ,垝guǐ,癸guǐ,軌guǐ,鬼guǐ,庪guǐ,匭guǐ,晷guǐ,湀guǐ,蛫guǐ,觤guǐ,詭guǐ,厬guǐ,簋guǐ,蟡guǐ,攱guǐ,朹guǐ,祪guǐ,猤guì,媯guì,刽guì,刿guì,攰guì,昋guì,柜guì,炅guì,贵guì,桂guì,椢guì,筀guì,貴guì,蓕guì,跪guì,瞆guì,劊guì,劌guì,撌guì,槶guì,瞶guì,櫃guì,襘guì,鳜guì,鞼guì,鱖guì,鱥guì,桧guì,絵guì,檜guì,赽guì,趹guì,嶡guì,禬guì,衮gǔn,惃gǔn,绲gǔn,袞gǔn,辊gǔn,滚gǔn,蓘gǔn,滾gǔn,緄gǔn,蔉gǔn,磙gǔn,輥gǔn,鲧gǔn,鮌gǔn,鯀gǔn,琯gùn,棍gùn,棞gùn,睔gùn,睴gùn,璭gùn,謴gùn,呙guō,埚guō,郭guō,啯guō,崞guō,楇guō,聒guō,鈛guō,锅guō,墎guō,瘑guō,嘓guō,彉guō,蝈guō,鍋guō,彍guō,鐹guō,矌guō,簂guó,囯guó,囶guó,囻guó,国guó,圀guó,國guó,帼guó,掴guó,腘guó,幗guó,摑guó,漍guó,聝guó,蔮guó,膕guó,虢guó,馘guó,慖guó,果guǒ,惈guǒ,淉guǒ,猓guǒ,菓guǒ,馃guǒ,椁guǒ,褁guǒ,槨guǒ,粿guǒ,綶guǒ,蜾guǒ,裹guǒ,輠guǒ,餜guǒ,錁guǒ,过guò,過guò,妎hā,铪hā,鉿hā,哈hā,蛤há,孩hái,骸hái,還hái,还hái,海hǎi,胲hǎi,烸hǎi,塰hǎi,酼hǎi,醢hǎi,亥hài,骇hài,害hài,氦hài,嗐hài,餀hài,駭hài,駴hài,嚡hài,饚hài,乤hal,兯han,爳han,顸hān,哻hān,蚶hān,酣hān,谽hān,馠hān,魽hān,鼾hān,欦hān,憨hān,榦hán,邗hán,含hán,邯hán,函hán,咁hán,肣hán,凾hán,唅hán,圅hán,娢hán,浛hán,崡hán,晗hán,梒hán,涵hán,焓hán,寒hán,嵅hán,韩hán,甝hán,筨hán,蜬hán,澏hán,鋡hán,韓hán,馯hán,椷hán,罕hǎn,浫hǎn,喊hǎn,蔊hǎn,鬫hǎn,糮hǎn,厈hǎn,汉hàn,汗hàn,旱hàn,悍hàn,捍hàn,晘hàn,涆hàn,猂hàn,莟hàn,晥hàn,焊hàn,琀hàn,菡hàn,皔hàn,睅hàn,傼hàn,蛿hàn,撖hàn,漢hàn,蜭hàn,暵hàn,熯hàn,銲hàn,鋎hàn,憾hàn,撼hàn,翰hàn,螒hàn,頷hàn,顄hàn,駻hàn,譀hàn,雗hàn,瀚hàn,鶾hàn,澣hàn,颔hàn,魧hāng,苀háng,迒háng,斻háng,杭háng,垳háng,绗háng,笐háng,蚢háng,颃háng,貥háng,筕háng,絎háng,行háng,航háng,沆hàng,茠hāo,蒿hāo,嚆hāo,薅hāo,竓háo,蚝háo,毫háo,椃háo,嗥háo,獆háo,噑háo,豪háo,嘷háo,儫háo,曍háo,嚎háo,壕háo,濠háo,籇háo,蠔háo,譹háo,虠háo,諕háo,呺háo,郝hǎo,好hǎo,号hào,昊hào,昦hào,哠hào,恏hào,悎hào,浩hào,耗hào,晧hào,淏hào,傐hào,皓hào,滈hào,聕hào,號hào,暤hào,暭hào,皜hào,皞hào,皡hào,薃hào,皥hào,颢hào,灏hào,顥hào,鰝hào,灝hào,鄗hào,藃hào,诃hē,呵hē,抲hē,欱hē,喝hē,訶hē,嗬hē,蠚hē,禾hé,合hé,何hé,劾hé,咊hé,和hé,姀hé,河hé,峆hé,曷hé,柇hé,盇hé,籺hé,阂hé,饸hé,哬hé,敆hé,核hé,盉hé,盍hé,啝hé,涸hé,渮hé,盒hé,菏hé,萂hé,龁hé,惒hé,粭hé,訸hé,颌hé,楁hé,鉌hé,阖hé,熆hé,鹖hé,麧hé,澕hé,頜hé,篕hé,翮hé,螛hé,礉hé,闔hé,鞨hé,齕hé,覈hé,鶡hé,皬hé,鑉hé,龢hé,餄hé,荷hé,魺hé,垎hè,贺hè,隺hè,寉hè,焃hè,湼hè,賀hè,嗃hè,煂hè,碋hè,熇hè,褐hè,赫hè,鹤hè,翯hè,壑hè,癋hè,燺hè,爀hè,靍hè,靎hè,鸖hè,靏hè,鶮hè,謞hè,鶴hè,嗨hēi,黒hēi,黑hēi,嘿hēi,潶hēi,嬒hèi,噷hēn,拫hén,痕hén,鞎hén,佷hěn,很hěn,狠hěn,詪hěn,恨hèn,亨hēng,哼hēng,悙hēng,涥hēng,脝hēng,姮héng,恆héng,恒héng,桁héng,烆héng,珩héng,胻héng,横héng,橫héng,衡héng,鴴héng,鵆héng,蘅héng,鑅héng,鸻héng,堼hèng,叿hōng,灴hōng,轰hōng,訇hōng,烘hōng,軣hōng,揈hōng,渹hōng,焢hōng,硡hōng,薨hōng,輷hōng,嚝hōng,鍧hōng,轟hōng,仜hóng,妅hóng,红hóng,吰hóng,宏hóng,汯hóng,玒hóng,纮hóng,闳hóng,宖hóng,泓hóng,玜hóng,苰hóng,垬hóng,娂hóng,洪hóng,竑hóng,紅hóng,荭hóng,虹hóng,浤hóng,紘hóng,翃hóng,耾hóng,硔hóng,紭hóng,谹hóng,鸿hóng,竤hóng,粠hóng,葓hóng,鈜hóng,閎hóng,綋hóng,翝hóng,谼hóng,潂hóng,鉷hóng,鞃hóng,篊hóng,鋐hóng,彋hóng,蕻hóng,霐hóng,黉hóng,霟hóng,鴻hóng,黌hóng,舼hóng,瓨hóng,弘hóng,葒hóng,哄hǒng,晎hǒng,讧hòng,訌hòng,閧hòng,撔hòng,澋hòng,澒hòng,闀hòng,闂hòng,腄hóu,侯hóu,矦hóu,喉hóu,帿hóu,猴hóu,葔hóu,瘊hóu,睺hóu,銗hóu,篌hóu,糇hóu,翭hóu,骺hóu,鍭hóu,餱hóu,鯸hóu,翵hóu,吼hǒu,犼hǒu,呴hǒu,后hòu,郈hòu,厚hòu,垕hòu,後hòu,洉hòu,逅hòu,候hòu,鄇hòu,堠hòu,鲎hòu,鲘hòu,鮜hòu,鱟hòu,豞hòu,鋘hu,乎hū,匢hū,呼hū,垀hū,忽hū,昒hū,曶hū,泘hū,苸hū,烀hū,轷hū,匫hū,唿hū,惚hū,淴hū,虖hū,軤hū,雽hū,嘑hū,寣hū,滹hū,雐hū,歑hū,謼hū,芔hū,戯hū,戱hū,鹄hú,鵠hú,囫hú,弧hú,狐hú,瓳hú,胡hú,壶hú,壷hú,斛hú,焀hú,喖hú,壺hú,媩hú,湖hú,猢hú,絗hú,葫hú,楜hú,煳hú,瑚hú,嘝hú,蔛hú,鹕hú,槲hú,箶hú,糊hú,蝴hú,衚hú,縠hú,螜hú,醐hú,頶hú,觳hú,鍸hú,餬hú,瀫hú,鬍hú,鰗hú,鶘hú,鶦hú,沍hú,礐hú,瓡hú,俿hǔ,虍hǔ,乕hǔ,汻hǔ,虎hǔ,浒hǔ,唬hǔ,萀hǔ,琥hǔ,虝hǔ,滸hǔ,箎hǔ,錿hǔ,鯱hǔ,互hù,弖hù,戶hù,户hù,戸hù,冴hù,芐hù,帍hù,护hù,沪hù,岵hù,怙hù,戽hù,昈hù,枑hù,祜hù,笏hù,粐hù,婟hù,扈hù,瓠hù,綔hù,鄠hù,嫭hù,嫮hù,摢hù,滬hù,蔰hù,槴hù,熩hù,鳸hù,簄hù,鍙hù,護hù,鳠hù,韄hù,頀hù,鱯hù,鸌hù,濩hù,穫hù,觷hù,魱hù,冱hù,鹱hù,花huā,芲huā,埖huā,婲huā,椛huā,硴huā,糀huā,誮huā,錵huā,蘤huā,蕐huā,砉huā,华huá,哗huá,姡huá,骅huá,華huá,铧huá,滑huá,猾huá,嘩huá,撶huá,璍huá,螖huá,鏵huá,驊huá,鷨huá,划huá,化huà,杹huà,画huà,话huà,崋huà,桦huà,婳huà,畫huà,嬅huà,畵huà,觟huà,話huà,劃huà,摦huà,槬huà,樺huà,嫿huà,澅huà,諙huà,黊huà,繣huà,舙huà,蘳huà,譮huà,檴huà,怀huái,淮huái,槐huái,褢huái,踝huái,懐huái,褱huái,懷huái,耲huái,蘹huái,佪huái,徊huái,坏huài,咶huài,壊huài,壞huài,蘾huài,欢huān,歓huān,鴅huān,懁huān,鵍huān,酄huān,嚾huān,獾huān,歡huān,貛huān,讙huān,驩huān,貆huān,环huán,峘huán,洹huán,狟huán,荁huán,桓huán,萈huán,萑huán,堚huán,寏huán,雈huán,綄huán,羦huán,锾huán,阛huán,寰huán,澴huán,缳huán,環huán,豲huán,鍰huán,镮huán,鹮huán,糫huán,繯huán,轘huán,鐶huán,鬟huán,瞏huán,鉮huán,圜huán,闤huán,睆huǎn,缓huǎn,緩huǎn,攌huǎn,幻huàn,奂huàn,肒huàn,奐huàn,宦huàn,唤huàn,换huàn,浣huàn,涣huàn,烉huàn,患huàn,梙huàn,焕huàn,逭huàn,喚huàn,嵈huàn,愌huàn,換huàn,渙huàn,痪huàn,煥huàn,豢huàn,漶huàn,瘓huàn,槵huàn,鲩huàn,擐huàn,瞣huàn,藧huàn,鯇huàn,鯶huàn,鰀huàn,圂huàn,蠸huàn,瑍huàn,巟huāng,肓huāng,荒huāng,衁huāng,塃huāng,慌huāng,皇huáng,偟huáng,凰huáng,隍huáng,黃huáng,黄huáng,喤huáng,堭huáng,媓huáng,崲huáng,徨huáng,湟huáng,葟huáng,遑huáng,楻huáng,煌huáng,瑝huáng,墴huáng,潢huáng,獚huáng,锽huáng,熿huáng,璜huáng,篁huáng,艎huáng,蝗huáng,癀huáng,磺huáng,穔huáng,諻huáng,簧huáng,蟥huáng,鍠huáng,餭huáng,鳇huáng,鐄huáng,騜huáng,鰉huáng,鷬huáng,惶huáng,鱑huáng,怳huǎng,恍huǎng,炾huǎng,宺huǎng,晃huǎng,晄huǎng,奛huǎng,谎huǎng,幌huǎng,愰huǎng,詤huǎng,縨huǎng,謊huǎng,皩huǎng,兤huǎng,滉huàng,榥huàng,曂huàng,皝huàng,鎤huàng,鰴hui,灰huī,灳huī,诙huī,咴huī,恢huī,拻huī,挥huī,虺huī,晖huī,烣huī,珲huī,豗huī,婎huī,媈huī,揮huī,翚huī,辉huī,暉huī,楎huī,琿huī,禈huī,詼huī,幑huī,睳huī,噅huī,噕huī,翬huī,輝huī,麾huī,徽huī,隳huī,瀈huī,洃huī,煇huí,囘huí,回huí,囬huí,廻huí,廽huí,恛huí,洄huí,茴huí,迴huí,烠huí,逥huí,痐huí,蛔huí,蛕huí,蜖huí,鮰huí,藱huí,悔huǐ,毇huǐ,檓huǐ,燬huǐ,譭huǐ,泋huǐ,毁huǐ,烜huǐ,卉huì,屷huì,汇huì,会huì,讳huì,浍huì,绘huì,荟huì,诲huì,恚huì,恵huì,烩huì,贿huì,彗huì,晦huì,秽huì,喙huì,惠huì,缋huì,翙huì,阓huì,匯huì,彙huì,彚huì,會huì,毀huì,滙huì,詯huì,賄huì,嘒huì,蔧huì,誨huì,圚huì,寭huì,慧huì,憓huì,暳huì,槥huì,潓huì,蕙huì,徻huì,橞huì,澮huì,獩huì,璤huì,薈huì,薉huì,諱huì,檅huì,燴huì,篲huì,餯huì,嚖huì,瞺huì,穢huì,繢huì,蟪huì,櫘huì,繪huì,翽huì,譓huì,儶huì,鏸huì,闠huì,孈huì,鐬huì,靧huì,韢huì,譿huì,顪huì,銊huì,叀huì,僡huì,懳huì,昏hūn,昬hūn,荤hūn,婚hūn,惛hūn,涽hūn,阍hūn,惽hūn,棔hūn,葷hūn,睧hūn,閽hūn,焄hūn,蔒hūn,睯hūn,忶hún,浑hún,馄hún,渾hún,魂hún,餛hún,繉hún,轋hún,鼲hún,混hún,梱hún,湷hún,诨hùn,俒hùn,倱hùn,掍hùn,焝hùn,溷hùn,慁hùn,觨hùn,諢hùn,吙huō,耠huō,锪huō,劐huō,鍃huō,豁huō,攉huō,騞huō,搉huō,佸huó,秮huó,活huó,火huǒ,伙huǒ,邩huǒ,钬huǒ,鈥huǒ,夥huǒ,沎huò,或huò,货huò,咟huò,俰huò,捇huò,眓huò,获huò,閄huò,剨huò,掝huò,祸huò,貨huò,惑huò,旤huò,湱huò,禍huò,奯huò,獲huò,霍huò,謋huò,镬huò,嚯huò,瀖huò,耯huò,藿huò,蠖huò,嚿huò,曤huò,臛huò,癨huò,矐huò,鑊huò,靃huò,謔huò,篧huò,擭huò,夻hwa,丌jī,讥jī,击jī,刉jī,叽jī,饥jī,乩jī,圾jī,机jī,玑jī,肌jī,芨jī,矶jī,鸡jī,枅jī,咭jī,剞jī,唧jī,姬jī,屐jī,积jī,笄jī,飢jī,基jī,喞jī,嵆jī,嵇jī,攲jī,敧jī,犄jī,筓jī,缉jī,赍jī,嗘jī,稘jī,跻jī,鳮jī,僟jī,毄jī,箕jī,銈jī,嘰jī,撃jī,樭jī,畿jī,稽jī,緝jī,觭jī,賫jī,躸jī,齑jī,墼jī,憿jī,機jī,激jī,璣jī,禨jī,積jī,錤jī,隮jī,擊jī,磯jī,簊jī,羁jī,賷jī,鄿jī,櫅jī,耭jī,雞jī,譏jī,韲jī,鶏jī,譤jī,鐖jī,癪jī,躋jī,鞿jī,鷄jī,齎jī,羇jī,虀jī,鑇jī,覉jī,鑙jī,齏jī,羈jī,鸄jī,覊jī,庴jī,垍jī,諅jī,踦jī,璂jī,踑jī,谿jī,刏jī,畸jī,簎jí,諔jí,堲jí,蠀jí,亼jí,及jí,吉jí,彶jí,忣jí,汲jí,级jí,即jí,极jí,亟jí,佶jí,郆jí,卽jí,叝jí,姞jí,急jí,狤jí,皍jí,笈jí,級jí,揤jí,疾jí,觙jí,偮jí,卙jí,楖jí,焏jí,脨jí,谻jí,戢jí,棘jí,極jí,湒jí,集jí,塉jí,嫉jí,愱jí,楫jí,蒺jí,蝍jí,趌jí,辑jí,槉jí,耤jí,膌jí,銡jí,嶯jí,潗jí,瘠jí,箿jí,蕀jí,蕺jí,踖jí,鞊jí,鹡jí,橶jí,檝jí,濈jí,螏jí,輯jí,襋jí,蹐jí,艥jí,籍jí,轚jí,鏶jí,霵jí,鶺jí,鷑jí,躤jí,雦jí,雧jí,嵴jí,尐jí,淁jí,吇jí,莋jí,岌jí,殛jí,鍓jí,颳jǐ,几jǐ,己jǐ,丮jǐ,妀jǐ,犱jǐ,泲jǐ,虮jǐ,挤jǐ,脊jǐ,掎jǐ,鱾jǐ,幾jǐ,戟jǐ,麂jǐ,魢jǐ,撠jǐ,擠jǐ,穖jǐ,蟣jǐ,済jǐ,畟jì,迹jì,绩jì,勣jì,彑jì,旡jì,计jì,记jì,伎jì,纪jì,坖jì,妓jì,忌jì,技jì,芰jì,芶jì,际jì,剂jì,季jì,哜jì,峜jì,既jì,洎jì,济jì,紀jì,茍jì,計jì,剤jì,紒jì,继jì,觊jì,記jì,偈jì,寄jì,徛jì,悸jì,旣jì,梞jì,祭jì,萕jì,惎jì,臮jì,葪jì,蔇jì,兾jì,痵jì,継jì,蓟jì,裚jì,跡jì,際jì,墍jì,暨jì,漃jì,漈jì,禝jì,稩jì,穊jì,誋jì,跽jì,霁jì,鲚jì,稷jì,鲫jì,冀jì,劑jì,曁jì,穄jì,縘jì,薊jì,襀jì,髻jì,嚌jì,檕jì,濟jì,繋jì,罽jì,覬jì,鮆jì,檵jì,璾jì,蹟jì,鯽jì,鵋jì,齌jì,廭jì,懻jì,癠jì,穧jì,糭jì,繫jì,骥jì,鯚jì,瀱jì,繼jì,蘮jì,鱀jì,蘻jì,霽jì,鰶jì,鰿jì,鱭jì,驥jì,訐jì,魝jì,櫭jì,帺jì,褀jì,鬾jì,懠jì,蟿jì,汥jì,鯯jì,齍jì,績jì,寂jì,暩jì,蘎jì,筴jiā,加jiā,抸jiā,佳jiā,泇jiā,迦jiā,枷jiā,毠jiā,浃jiā,珈jiā,埉jiā,家jiā,浹jiā,痂jiā,梜jiā,耞jiā,袈jiā,猳jiā,葭jiā,跏jiā,犌jiā,腵jiā,鉫jiā,嘉jiā,镓jiā,糘jiā,豭jiā,貑jiā,鎵jiā,麚jiā,椵jiā,挟jiā,挾jiā,笳jiā,夹jiá,袷jiá,裌jiá,圿jiá,扴jiá,郏jiá,荚jiá,郟jiá,唊jiá,恝jiá,莢jiá,戛jiá,脥jiá,铗jiá,蛱jiá,颊jiá,蛺jiá,跲jiá,鋏jiá,頬jiá,頰jiá,鴶jiá,鵊jiá,忦jiá,戞jiá,岬jiǎ,甲jiǎ,叚jiǎ,玾jiǎ,胛jiǎ,斚jiǎ,贾jiǎ,钾jiǎ,婽jiǎ,徦jiǎ,斝jiǎ,賈jiǎ,鉀jiǎ,榎jiǎ,槚jiǎ,瘕jiǎ,檟jiǎ,夓jiǎ,假jiǎ,价jià,驾jià,架jià,嫁jià,幏jià,榢jià,價jià,稼jià,駕jià,戋jiān,奸jiān,尖jiān,幵jiān,坚jiān,歼jiān,间jiān,冿jiān,戔jiān,肩jiān,艰jiān,姦jiān,姧jiān,兼jiān,监jiān,堅jiān,惤jiān,猏jiān,笺jiān,菅jiān,菺jiān,牋jiān,犍jiān,缄jiān,葌jiān,葏jiān,間jiān,靬jiān,搛jiān,椾jiān,煎jiān,瑊jiān,睷jiān,碊jiān,缣jiān,蒹jiān,監jiān,箋jiān,樫jiān,熞jiān,緘jiān,蕑jiān,蕳jiān,鲣jiān,鳽jiān,鹣jiān,熸jiān,篯jiān,縑jiān,艱jiān,鞬jiān,餰jiān,馢jiān,麉jiān,瀐jiān,鞯jiān,鳒jiān,殱jiān,礛jiān,覸jiān,鵳jiān,瀸jiān,櫼jiān,殲jiān,譼jiān,鰜jiān,鶼jiān,籛jiān,韀jiān,鰹jiān,囏jiān,虃jiān,鑯jiān,韉jiān,揃jiān,鐗jiān,鐧jiān,閒jiān,黚jiān,傔jiān,攕jiān,纎jiān,钘jiān,鈃jiān,銒jiān,籈jiān,湔jiān,囝jiǎn,拣jiǎn,枧jiǎn,俭jiǎn,茧jiǎn,倹jiǎn,挸jiǎn,捡jiǎn,笕jiǎn,减jiǎn,剪jiǎn,帴jiǎn,梘jiǎn,检jiǎn,湕jiǎn,趼jiǎn,揀jiǎn,検jiǎn,減jiǎn,睑jiǎn,硷jiǎn,裥jiǎn,詃jiǎn,锏jiǎn,弿jiǎn,瑐jiǎn,筧jiǎn,简jiǎn,絸jiǎn,谫jiǎn,彅jiǎn,戩jiǎn,碱jiǎn,儉jiǎn,翦jiǎn,撿jiǎn,檢jiǎn,藆jiǎn,襇jiǎn,襉jiǎn,謇jiǎn,蹇jiǎn,瞼jiǎn,礆jiǎn,簡jiǎn,繭jiǎn,謭jiǎn,鬋jiǎn,鰎jiǎn,鹸jiǎn,瀽jiǎn,蠒jiǎn,鹻jiǎn,譾jiǎn,襺jiǎn,鹼jiǎn,堿jiǎn,偂jiǎn,銭jiǎn,醎jiǎn,鹹jiǎn,涀jiǎn,橏jiǎn,柬jiǎn,戬jiǎn,见jiàn,件jiàn,見jiàn,侟jiàn,饯jiàn,剑jiàn,洊jiàn,牮jiàn,荐jiàn,贱jiàn,俴jiàn,健jiàn,剣jiàn,栫jiàn,涧jiàn,珔jiàn,舰jiàn,剱jiàn,徤jiàn,渐jiàn,袸jiàn,谏jiàn,釼jiàn,寋jiàn,旔jiàn,楗jiàn,毽jiàn,溅jiàn,腱jiàn,臶jiàn,葥jiàn,践jiàn,鉴jiàn,键jiàn,僭jiàn,榗jiàn,漸jiàn,劍jiàn,劎jiàn,墹jiàn,澗jiàn,箭jiàn,糋jiàn,諓jiàn,賤jiàn,趝jiàn,踐jiàn,踺jiàn,劒jiàn,劔jiàn,橺jiàn,薦jiàn,諫jiàn,鍵jiàn,餞jiàn,瞯jiàn,瞷jiàn,磵jiàn,礀jiàn,螹jiàn,鍳jiàn,濺jiàn,繝jiàn,瀳jiàn,鏩jiàn,艦jiàn,轞jiàn,鑑jiàn,鑒jiàn,鑬jiàn,鑳jiàn,鐱jiàn,揵jiàn,蔪jiàn,橌jiàn,廴jiàn,譖jiàn,鋻jiàn,建jiàn,賎jiàn,擶jiàn,江jiāng,姜jiāng,将jiāng,茳jiāng,浆jiāng,畕jiāng,豇jiāng,葁jiāng,摪jiāng,翞jiāng,僵jiāng,漿jiāng,螀jiāng,壃jiāng,彊jiāng,缰jiāng,薑jiāng,殭jiāng,螿jiāng,鳉jiāng,疅jiāng,礓jiāng,疆jiāng,繮jiāng,韁jiāng,鱂jiāng,將jiāng,畺jiāng,糡jiāng,橿jiāng,讲jiǎng,奖jiǎng,桨jiǎng,蒋jiǎng,勥jiǎng,奨jiǎng,奬jiǎng,蔣jiǎng,槳jiǎng,獎jiǎng,耩jiǎng,膙jiǎng,講jiǎng,顜jiǎng,塂jiǎng,匞jiàng,匠jiàng,夅jiàng,弜jiàng,杢jiàng,降jiàng,绛jiàng,弶jiàng,袶jiàng,絳jiàng,酱jiàng,摾jiàng,滰jiàng,嵹jiàng,犟jiàng,醤jiàng,糨jiàng,醬jiàng,櫤jiàng,謽jiàng,蔃jiàng,洚jiàng,艽jiāo,芁jiāo,交jiāo,郊jiāo,姣jiāo,娇jiāo,峧jiāo,浇jiāo,茭jiāo,骄jiāo,胶jiāo,椒jiāo,焳jiāo,蛟jiāo,跤jiāo,僬jiāo,嘄jiāo,鲛jiāo,嬌jiāo,嶕jiāo,嶣jiāo,憍jiāo,澆jiāo,膠jiāo,蕉jiāo,燋jiāo,膲jiāo,礁jiāo,穚jiāo,鮫jiāo,鹪jiāo,簥jiāo,蟭jiāo,轇jiāo,鐎jiāo,驕jiāo,鷦jiāo,鷮jiāo,儌jiāo,撟jiāo,挍jiāo,教jiāo,骹jiāo,嫶jiāo,萩jiāo,嘐jiāo,憢jiāo,焦jiāo,櫵jiáo,嚼jiáo,臫jiǎo,佼jiǎo,挢jiǎo,狡jiǎo,绞jiǎo,饺jiǎo,晈jiǎo,笅jiǎo,皎jiǎo,矫jiǎo,脚jiǎo,铰jiǎo,搅jiǎo,筊jiǎo,絞jiǎo,剿jiǎo,勦jiǎo,敫jiǎo,湬jiǎo,煍jiǎo,腳jiǎo,賋jiǎo,摷jiǎo,暞jiǎo,踋jiǎo,鉸jiǎo,劋jiǎo,撹jiǎo,徼jiǎo,敽jiǎo,敿jiǎo,缴jiǎo,曒jiǎo,璬jiǎo,矯jiǎo,皦jiǎo,蟜jiǎo,鵤jiǎo,繳jiǎo,譑jiǎo,孂jiǎo,纐jiǎo,攪jiǎo,灚jiǎo,鱎jiǎo,潐jiǎo,糸jiǎo,蹻jiǎo,釥jiǎo,纟jiǎo,恔jiǎo,角jiǎo,餃jiǎo,叫jiào,呌jiào,訆jiào,珓jiào,轿jiào,较jiào,窖jiào,滘jiào,較jiào,嘂jiào,嘦jiào,斠jiào,漖jiào,酵jiào,噍jiào,噭jiào,嬓jiào,獥jiào,藠jiào,趭jiào,轎jiào,醮jiào,譥jiào,皭jiào,釂jiào,觉jiào,覐jiào,覚jiào,覺jiào,趫jiào,敎jiào,阶jiē,疖jiē,皆jiē,接jiē,掲jiē,痎jiē,秸jiē,菨jiē,喈jiē,嗟jiē,堦jiē,媘jiē,嫅jiē,揭jiē,椄jiē,湝jiē,脻jiē,街jiē,煯jiē,稭jiē,鞂jiē,蝔jiē,擑jiē,癤jiē,鶛jiē,节jiē,節jiē,袓jiē,謯jiē,階jiē,卪jié,孑jié,讦jié,刦jié,刧jié,劫jié,岊jié,昅jié,刼jié,劼jié,疌jié,衱jié,诘jié,拮jié,洁jié,结jié,迼jié,倢jié,桀jié,桝jié,莭jié,偼jié,婕jié,崨jié,捷jié,袺jié,傑jié,媫jié,結jié,蛣jié,颉jié,嵥jié,楬jié,楶jié,滐jié,睫jié,蜐jié,詰jié,截jié,榤jié,碣jié,竭jié,蓵jié,鲒jié,潔jié,羯jié,誱jié,踕jié,頡jié,幯jié,擳jié,嶻jié,擮jié,礍jié,鍻jié,鮚jié,巀jié,蠞jié,蠘jié,蠽jié,洯jié,絜jié,搩jié,杰jié,鉣jié,姐jiě,毑jiě,媎jiě,解jiě,觧jiě,檞jiě,飷jiě,丯jiè,介jiè,岕jiè,庎jiè,戒jiè,芥jiè,屆jiè,届jiè,斺jiè,玠jiè,界jiè,畍jiè,疥jiè,砎jiè,衸jiè,诫jiè,借jiè,蚧jiè,徣jiè,堺jiè,楐jiè,琾jiè,蛶jiè,骱jiè,犗jiè,誡jiè,魪jiè,藉jiè,繲jiè,雃jiè,嶰jiè,唶jiè,褯jiè,巾jīn,今jīn,斤jīn,钅jīn,兓jīn,金jīn,釒jīn,津jīn,矜jīn,砛jīn,荕jīn,衿jīn,觔jīn,埐jīn,珒jīn,紟jīn,惍jīn,琎jīn,堻jīn,琻jīn,筋jīn,嶜jīn,璡jīn,鹶jīn,黅jīn,襟jīn,濜jīn,仅jǐn,巹jǐn,紧jǐn,堇jǐn,菫jǐn,僅jǐn,厪jǐn,谨jǐn,锦jǐn,嫤jǐn,廑jǐn,漌jǐn,緊jǐn,蓳jǐn,馑jǐn,槿jǐn,瑾jǐn,錦jǐn,謹jǐn,饉jǐn,儘jǐn,婜jǐn,斳jǐn,卺jǐn,笒jìn,盡jìn,劤jìn,尽jìn,劲jìn,妗jìn,近jìn,进jìn,侭jìn,枃jìn,勁jìn,荩jìn,晉jìn,晋jìn,浸jìn,烬jìn,赆jìn,祲jìn,進jìn,煡jìn,缙jìn,寖jìn,搢jìn,溍jìn,禁jìn,靳jìn,墐jìn,慬jìn,瑨jìn,僸jìn,凚jìn,歏jìn,殣jìn,觐jìn,噤jìn,濅jìn,縉jìn,賮jìn,嚍jìn,壗jìn,藎jìn,燼jìn,璶jìn,覲jìn,贐jìn,齽jìn,馸jìn,臸jìn,浕jìn,嬧jìn,坕jīng,坙jīng,巠jīng,京jīng,泾jīng,经jīng,茎jīng,亰jīng,秔jīng,荆jīng,荊jīng,涇jīng,莖jīng,婛jīng,惊jīng,旌jīng,旍jīng,猄jīng,経jīng,菁jīng,晶jīng,稉jīng,腈jīng,粳jīng,經jīng,兢jīng,精jīng,聙jīng,橸jīng,鲸jīng,鵛jīng,鯨jīng,鶁jīng,麖jīng,鼱jīng,驚jīng,麠jīng,徑jīng,仱jīng,靑jīng,睛jīng,井jǐng,阱jǐng,刭jǐng,坓jǐng,宑jǐng,汫jǐng,汬jǐng,肼jǐng,剄jǐng,穽jǐng,颈jǐng,景jǐng,儆jǐng,幜jǐng,璄jǐng,憼jǐng,暻jǐng,燝jǐng,璟jǐng,璥jǐng,頸jǐng,蟼jǐng,警jǐng,擏jǐng,憬jǐng,妌jìng,净jìng,弪jìng,径jìng,迳jìng,浄jìng,胫jìng,凈jìng,弳jìng,痉jìng,竞jìng,逕jìng,婙jìng,婧jìng,桱jìng,梷jìng,淨jìng,竫jìng,脛jìng,敬jìng,痙jìng,竧jìng,傹jìng,靖jìng,境jìng,獍jìng,誩jìng,静jìng,頚jìng,曔jìng,镜jìng,靜jìng,瀞jìng,鏡jìng,競jìng,竸jìng,葝jìng,儬jìng,陘jìng,竟jìng,冋jiōng,扃jiōng,埛jiōng,絅jiōng,駉jiōng,駫jiōng,冏jiōng,浻jiōng,扄jiōng,銄jiōng,囧jiǒng,迥jiǒng,侰jiǒng,炯jiǒng,逈jiǒng,烱jiǒng,煚jiǒng,窘jiǒng,颎jiǒng,綗jiǒng,僒jiǒng,煛jiǒng,熲jiǒng,澃jiǒng,燛jiǒng,褧jiǒng,顈jiǒng,蘔jiǒng,宭jiǒng,蘏jiǒng,丩jiū,勼jiū,纠jiū,朻jiū,究jiū,糺jiū,鸠jiū,赳jiū,阄jiū,萛jiū,啾jiū,揪jiū,揫jiū,鳩jiū,摎jiū,鬏jiū,鬮jiū,稵jiū,糾jiū,九jiǔ,久jiǔ,乆jiǔ,乣jiǔ,奺jiǔ,汣jiǔ,杦jiǔ,灸jiǔ,玖jiǔ,舏jiǔ,韭jiǔ,紤jiǔ,酒jiǔ,镹jiǔ,韮jiǔ,匛jiù,旧jiù,臼jiù,疚jiù,柩jiù,柾jiù,倃jiù,桕jiù,厩jiù,救jiù,就jiù,廄jiù,匓jiù,舅jiù,僦jiù,廏jiù,廐jiù,慦jiù,殧jiù,舊jiù,鹫jiù,麔jiù,匶jiù,齨jiù,鷲jiù,咎jiù,欍jou,鶪ju,伡jū,俥jū,凥jū,匊jū,居jū,狙jū,苴jū,驹jū,倶jū,挶jū,捄jū,疽jū,痀jū,眗jū,砠jū,罝jū,陱jū,娵jū,婅jū,婮jū,崌jū,掬jū,梮jū,涺jū,椐jū,琚jū,腒jū,趄jū,跔jū,锔jū,裾jū,雎jū,艍jū,蜛jū,踘jū,鋦jū,駒jū,鮈jū,鴡jū,鞠jū,鞫jū,鶋jū,臄jū,揟jū,拘jū,諊jū,局jú,泦jú,侷jú,狊jú,桔jú,毩jú,淗jú,焗jú,菊jú,郹jú,椈jú,毱jú,湨jú,犑jú,輂jú,粷jú,蓻jú,趜jú,躹jú,閰jú,檋jú,駶jú,鵙jú,蹫jú,鵴jú,巈jú,蘜jú,鼰jú,鼳jú,驧jú,趉jú,郥jú,橘jú,咀jǔ,弆jǔ,沮jǔ,举jǔ,矩jǔ,莒jǔ,挙jǔ,椇jǔ,筥jǔ,榉jǔ,榘jǔ,蒟jǔ,龃jǔ,聥jǔ,舉jǔ,踽jǔ,擧jǔ,櫸jǔ,齟jǔ,襷jǔ,籧jǔ,郰jǔ,欅jǔ,句jù,巨jù,讵jù,姖jù,岠jù,怇jù,拒jù,洰jù,苣jù,邭jù,具jù,怚jù,拠jù,昛jù,歫jù,炬jù,秬jù,钜jù,俱jù,倨jù,冣jù,剧jù,粔jù,耟jù,蚷jù,埧jù,埾jù,惧jù,詎jù,距jù,焣jù,犋jù,跙jù,鉅jù,飓jù,虡jù,豦jù,锯jù,愳jù,窭jù,聚jù,駏jù,劇jù,勮jù,屦jù,踞jù,鮔jù,壉jù,懅jù,據jù,澽jù,遽jù,鋸jù,屨jù,颶jù,簴jù,躆jù,醵jù,懼jù,鐻jù,爠jù,坥jù,螶jù,忂jù,葅jù,蒩jù,珇jù,据jù,姢juān,娟juān,捐juān,涓juān,脧juān,裐juān,鹃juān,勬juān,鋑juān,鋗juān,镌juān,鎸juān,鵑juān,鐫juān,蠲juān,勌juān,瓹juān,梋juān,鞙juān,朘juān,呟juǎn,帣juǎn,埍juǎn,捲juǎn,菤juǎn,锩juǎn,臇juǎn,錈juǎn,埢juǎn,踡juǎn,蕋juǎn,卷juàn,劵juàn,弮juàn,倦juàn,桊juàn,狷juàn,绢juàn,淃juàn,眷juàn,鄄juàn,睊juàn,絭juàn,罥juàn,睠juàn,絹juàn,慻juàn,蔨juàn,餋juàn,獧juàn,羂juàn,圏juàn,棬juàn,惓juàn,韏juàn,讂juàn,縳juàn,襈juàn,奆juàn,噘juē,撅juē,撧juē,屩juē,屫juē,繑juē,亅jué,孓jué,决jué,刔jué,氒jué,诀jué,抉jué,決jué,芵jué,泬jué,玦jué,玨jué,挗jué,珏jué,砄jué,绝jué,虳jué,捔jué,欮jué,蚗jué,崛jué,掘jué,斍jué,桷jué,殌jué,焆jué,觖jué,逫jué,傕jué,厥jué,絕jué,絶jué,鈌jué,劂jué,勪jué,瑴jué,谲jué,嶥jué,憰jué,潏jué,熦jué,爴jué,獗jué,瘚jué,蕝jué,蕨jué,憠jué,橛jué,镼jué,爵jué,镢jué,蟨jué,蟩jué,爑jué,譎jué,蹷jué,鶌jué,矍jué,鐝jué,灍jué,爝jué,觼jué,彏jué,戄jué,攫jué,玃jué,鷢jué,欔jué,矡jué,龣jué,貜jué,躩jué,钁jué,璚jué,匷jué,啳jué,吷jué,疦jué,弡jué,穱jué,孒jué,訣jué,橜jué,蹶juě,倔juè,誳juè,君jun1,均jun1,汮jun1,姰jun1,袀jun1,軍jun1,钧jun1,莙jun1,蚐jun1,桾jun1,皲jun1,菌jun1,鈞jun1,碅jun1,筠jun1,皸jun1,皹jun1,覠jun1,銁jun1,銞jun1,鲪jun1,麇jun1,鍕jun1,鮶jun1,麏jun1,麕jun1,军jun1,隽jun4,雋jun4,呁jun4,俊jun4,郡jun4,陖jun4,峻jun4,捃jun4,晙jun4,馂jun4,骏jun4,焌jun4,珺jun4,畯jun4,竣jun4,箘jun4,箟jun4,蜠jun4,儁jun4,寯jun4,懏jun4,餕jun4,燇jun4,駿jun4,鵔jun4,鵕jun4,鵘jun4,葰jun4,埈jun4,咔kā,咖kā,喀kā,衉kā,哢kā,呿kā,卡kǎ,佧kǎ,垰kǎ,裃kǎ,鉲kǎ,胩kǎ,开kāi,奒kāi,揩kāi,锎kāi,開kāi,鐦kāi,凯kǎi,剀kǎi,垲kǎi,恺kǎi,闿kǎi,铠kǎi,凱kǎi,慨kǎi,蒈kǎi,塏kǎi,愷kǎi,楷kǎi,輆kǎi,暟kǎi,锴kǎi,鍇kǎi,鎧kǎi,闓kǎi,颽kǎi,喫kài,噄kài,忾kài,烗kài,勓kài,愾kài,鎎kài,愒kài,欯kài,炌kài,乫kal,刊kān,栞kān,勘kān,龛kān,堪kān,嵁kān,戡kān,龕kān,槛kǎn,檻kǎn,冚kǎn,坎kǎn,侃kǎn,砍kǎn,莰kǎn,偘kǎn,埳kǎn,惂kǎn,欿kǎn,塪kǎn,輡kǎn,竷kǎn,轗kǎn,衎kǎn,看kàn,崁kàn,墈kàn,阚kàn,瞰kàn,磡kàn,闞kàn,矙kàn,輱kàn,忼kāng,砊kāng,粇kāng,康kāng,嫝kāng,嵻kāng,慷kāng,漮kāng,槺kāng,穅kāng,糠kāng,躿kāng,鏮kāng,鱇kāng,闶kāng,閌kāng,扛káng,摃káng,亢kàng,伉kàng,匟kàng,囥kàng,抗kàng,炕kàng,钪kàng,鈧kàng,邟kàng,尻kāo,髛kāo,嵪kāo,訄kāo,薧kǎo,攷kǎo,考kǎo,拷kǎo,洘kǎo,栲kǎo,烤kǎo,铐kào,犒kào,銬kào,鲓kào,靠kào,鮳kào,鯌kào,焅kào,屙kē,蚵kē,苛kē,柯kē,牁kē,珂kē,胢kē,轲kē,疴kē,趷kē,钶kē,嵙kē,棵kē,痾kē,萪kē,軻kē,颏kē,犐kē,稞kē,窠kē,鈳kē,榼kē,薖kē,颗kē,樖kē,瞌kē,磕kē,蝌kē,頦kē,醘kē,顆kē,髁kē,礚kē,嗑kē,窼kē,簻kē,科kē,壳ké,咳ké,揢ké,翗ké,嶱ké,殼ké,毼kě,磆kě,坷kě,可kě,岢kě,炣kě,渇kě,嵑kě,敤kě,渴kě,袔kè,悈kè,歁kè,克kè,刻kè,剋kè,勀kè,勊kè,客kè,恪kè,娔kè,尅kè,课kè,堁kè,氪kè,骒kè,缂kè,愙kè,溘kè,锞kè,碦kè,課kè,礊kè,騍kè,硞kè,艐kè,緙kè,肎kěn,肯kěn,肻kěn,垦kěn,恳kěn,啃kěn,豤kěn,貇kěn,墾kěn,錹kěn,懇kěn,頎kěn,掯kèn,裉kèn,褃kèn,硍kèn,妔kēng,踁kēng,劥kēng,吭kēng,坈kēng,坑kēng,挳kēng,硁kēng,牼kēng,硜kēng,铿kēng,硻kēng,誙kēng,銵kēng,鏗kēng,摼kēng,殸kēng,揁kēng,鍞kēng,巪keo,乬keol,唟keos,厼keum,怾ki,空kōng,倥kōng,埪kōng,崆kōng,悾kōng,硿kōng,箜kōng,躻kōng,錓kōng,鵼kōng,椌kōng,宆kōng,孔kǒng,恐kǒng,控kòng,鞚kòng,羫kòng,廤kos,抠kōu,芤kōu,眍kōu,剾kōu,彄kōu,摳kōu,瞘kōu,劶kǒu,竘kǒu,口kǒu,叩kòu,扣kòu,怐kòu,敂kòu,冦kòu,宼kòu,寇kòu,釦kòu,窛kòu,筘kòu,滱kòu,蔲kòu,蔻kòu,瞉kòu,簆kòu,鷇kòu,搰kū,刳kū,矻kū,郀kū,枯kū,哭kū,桍kū,堀kū,崫kū,圐kū,跍kū,窟kū,骷kū,泏kū,窋kū,狜kǔ,苦kǔ,楛kǔ,齁kù,捁kù,库kù,俈kù,绔kù,庫kù,秙kù,袴kù,喾kù,絝kù,裤kù,瘔kù,酷kù,褲kù,嚳kù,鮬kù,恗kuā,夸kuā,姱kuā,晇kuā,舿kuā,誇kuā,侉kuǎ,咵kuǎ,垮kuǎ,銙kuǎ,顝kuǎ,挎kuà,胯kuà,跨kuà,骻kuà,擓kuai,蒯kuǎi,璯kuài,駃kuài,巜kuài,凷kuài,圦kuài,块kuài,快kuài,侩kuài,郐kuài,哙kuài,狯kuài,脍kuài,塊kuài,筷kuài,鲙kuài,儈kuài,鄶kuài,噲kuài,廥kuài,獪kuài,膾kuài,旝kuài,糩kuài,鱠kuài,蕢kuài,宽kuān,寛kuān,寬kuān,髋kuān,鑧kuān,髖kuān,欵kuǎn,款kuǎn,歀kuǎn,窽kuǎn,窾kuǎn,梡kuǎn,匡kuāng,劻kuāng,诓kuāng,邼kuāng,匩kuāng,哐kuāng,恇kuāng,洭kuāng,筐kuāng,筺kuāng,誆kuāng,軭kuāng,狂kuáng,狅kuáng,诳kuáng,軖kuáng,軠kuáng,誑kuáng,鵟kuáng,夼kuǎng,儣kuǎng,懭kuǎng,爌kuǎng,邝kuàng,圹kuàng,况kuàng,旷kuàng,岲kuàng,況kuàng,矿kuàng,昿kuàng,贶kuàng,框kuàng,眖kuàng,砿kuàng,眶kuàng,絋kuàng,絖kuàng,貺kuàng,軦kuàng,鉱kuàng,鋛kuàng,鄺kuàng,壙kuàng,黋kuàng,懬kuàng,曠kuàng,礦kuàng,穬kuàng,纊kuàng,鑛kuàng,纩kuàng,亏kuī,刲kuī,悝kuī,盔kuī,窥kuī,聧kuī,窺kuī,虧kuī,闚kuī,巋kuī,蘬kuī,岿kuī,奎kuí,晆kuí,逵kuí,鄈kuí,頄kuí,馗kuí,喹kuí,揆kuí,葵kuí,骙kuí,戣kuí,暌kuí,楏kuí,楑kuí,魁kuí,睽kuí,蝰kuí,頯kuí,櫆kuí,藈kuí,鍷kuí,騤kuí,夔kuí,蘷kuí,虁kuí,躨kuí,鍨kuí,卼kuǐ,煃kuǐ,跬kuǐ,頍kuǐ,蹞kuǐ,尯kuǐ,匮kuì,欳kuì,喟kuì,媿kuì,愦kuì,愧kuì,溃kuì,蒉kuì,馈kuì,匱kuì,嘳kuì,嬇kuì,憒kuì,潰kuì,聩kuì,聭kuì,樻kuì,殨kuì,餽kuì,簣kuì,聵kuì,籄kuì,鐀kuì,饋kuì,鑎kuì,篑kuì,坤kūn,昆kūn,晜kūn,堃kūn,堒kūn,婫kūn,崐kūn,崑kūn,猑kūn,菎kūn,裈kūn,焜kūn,琨kūn,髠kūn,裩kūn,锟kūn,髡kūn,尡kūn,潉kūn,蜫kūn,褌kūn,髨kūn,熴kūn,瑻kūn,醌kūn,錕kūn,鲲kūn,臗kūn,騉kūn,鯤kūn,鵾kūn,鶤kūn,鹍kūn,悃kǔn,捆kǔn,阃kǔn,壸kǔn,祵kǔn,硱kǔn,稇kǔn,裍kǔn,壼kǔn,稛kǔn,綑kǔn,閫kǔn,閸kǔn,困kùn,睏kùn,涃kùn,秳kuò,漷kuò,扩kuò,拡kuò,括kuò,桰kuò,筈kuò,萿kuò,葀kuò,蛞kuò,阔kuò,廓kuò,頢kuò,擴kuò,濶kuò,闊kuò,鞟kuò,韕kuò,懖kuò,霩kuò,鞹kuò,鬠kuò,穒kweok,鞡la,垃lā,拉lā,柆lā,啦lā,菈lā,搚lā,邋lā,磖lā,翋lā,旯lá,砬lá,揦lá,喇lǎ,藞lǎ,嚹lǎ,剌là,溂là,腊là,揧là,楋là,瘌là,牎chuāng,床chuáng,漺chuǎng,怆chuàng,愴chuàng,莊zhuāng,粧zhuāng,装zhuāng,裝zhuāng,樁zhuāng,蜡là,蝋là,辢là,辣là,蝲là,臈là,攋là,爉là,臘là,鬎là,櫴là,瓎là,镴là,鯻là,鑞là,儠là,擸là,鱲là,蠟là,来lái,來lái,俫lái,倈lái,崃lái,徕lái,涞lái,莱lái,郲lái,婡lái,崍lái,庲lái,徠lái,梾lái,淶lái,猍lái,萊lái,逨lái,棶lái,琜lái,筙lái,铼lái,箂lái,錸lái,騋lái,鯠lái,鶆lái,麳lái,顂lái,勑lài,誺lài,赉lài,睐lài,睞lài,赖lài,賚lài,濑lài,賴lài,頼lài,癞lài,鵣lài,瀨lài,瀬lài,籁lài,藾lài,癩lài,襰lài,籟lài,唻lài,暕lán,兰lán,岚lán,拦lán,栏lán,婪lán,嵐lán,葻lán,阑lán,蓝lán,谰lán,厱lán,褴lán,儖lán,斓lán,篮lán,懢lán,燣lán,藍lán,襕lán,镧lán,闌lán,璼lán,襤lán,譋lán,幱lán,攔lán,瀾lán,灆lán,籃lán,繿lán,蘭lán,斕lán,欄lán,礷lán,襴lán,囒lán,灡lán,籣lán,欗lán,讕lán,躝lán,鑭lán,钄lán,韊lán,惏lán,澜lán,襽lán,览lǎn,浨lǎn,揽lǎn,缆lǎn,榄lǎn,漤lǎn,罱lǎn,醂lǎn,壈lǎn,懒lǎn,覧lǎn,擥lǎn,懶lǎn,孄lǎn,覽lǎn,孏lǎn,攬lǎn,欖lǎn,爦lǎn,纜lǎn,灠lǎn,顲lǎn,蘫làn,嬾làn,烂làn,滥làn,燗làn,嚂làn,壏làn,濫làn,爛làn,爤làn,瓓làn,糷làn,湅làn,煉làn,爁làn,唥lang,啷lāng,羮láng,勆láng,郎láng,郞láng,欴láng,狼láng,嫏láng,廊láng,桹láng,琅láng,蓈láng,榔láng,瑯láng,硠láng,稂láng,锒láng,筤láng,艆láng,蜋láng,郒láng,螂láng,躴láng,鋃láng,鎯láng,阆láng,閬láng,哴láng,悢lǎng,朗lǎng,朖lǎng,烺lǎng,塱lǎng,蓢lǎng,樃lǎng,誏lǎng,朤lǎng,俍lǎng,脼lǎng,莨làng,埌làng,浪làng,蒗làng,捞lāo,粩lāo,撈lāo,劳láo,労láo,牢láo,窂láo,哰láo,崂láo,浶láo,勞láo,痨láo,僗láo,嶗láo,憥láo,朥láo,癆láo,磱láo,簩láo,蟧láo,醪láo,鐒láo,顟láo,髝láo,轑láo,嫪láo,憦láo,铹láo,耂lǎo,老lǎo,佬lǎo,咾lǎo,姥lǎo,恅lǎo,荖lǎo,栳lǎo,珯lǎo,硓lǎo,铑lǎo,蛯lǎo,銠lǎo,橑lǎo,鮱lǎo,唠lào,嘮lào,烙lào,嗠lào,耢lào,酪lào,澇lào,橯lào,耮lào,軂lào,涝lào,饹le,了le,餎le,牞lè,仂lè,阞lè,乐lè,叻lè,忇lè,扐lè,氻lè,艻lè,玏lè,泐lè,竻lè,砳lè,勒lè,楽lè,韷lè,樂lè,簕lè,鳓lè,鰳lè,頛lei,嘞lei,雷léi,嫘léi,缧léi,蔂léi,樏léi,畾léi,檑léi,縲léi,镭léi,櫑léi,瓃léi,羸léi,礧léi,罍léi,蘲léi,鐳léi,轠léi,壨léi,鑘léi,靁léi,虆léi,鱩léi,欙léi,纝léi,鼺léi,磥léi,攂léi,腂lěi,瘣lěi,厽lěi,耒lěi,诔lěi,垒lěi,絫lěi,傫lěi,誄lěi,磊lěi,蕌lěi,蕾lěi,儡lěi,壘lěi,癗lěi,藟lěi,櫐lěi,矋lěi,礨lěi,灅lěi,蠝lěi,蘽lěi,讄lěi,儽lěi,鑸lěi,鸓lěi,洡lěi,礌lěi,塁lěi,纍lèi,肋lèi,泪lèi,类lèi,涙lèi,淚lèi,累lèi,酹lèi,銇lèi,頪lèi,擂lèi,錑lèi,颣lèi,類lèi,纇lèi,蘱lèi,禷lèi,祱lèi,塄léng,棱léng,楞léng,碐léng,稜léng,踜léng,薐léng,輘léng,冷lěng,倰lèng,堎lèng,愣lèng,睖lèng,瓈li,唎lī,粚lí,刕lí,厘lí,剓lí,梨lí,狸lí,荲lí,骊lí,悡lí,梸lí,犁lí,菞lí,喱lí,棃lí,犂lí,鹂lí,剺lí,漓lí,睝lí,筣lí,缡lí,艃lí,蓠lí,蜊lí,嫠lí,孷lí,樆lí,璃lí,盠lí,竰lí,氂lí,犛lí,糎lí,蔾lí,鋫lí,鲡lí,黎lí,篱lí,縭lí,罹lí,錅lí,蟍lí,謧lí,醨lí,嚟lí,藜lí,邌lí,釐lí,離lí,鯏lí,鏫lí,鯬lí,鵹lí,黧lí,囄lí,灕lí,蘺lí,蠡lí,蠫lí,孋lí,廲lí,劙lí,鑗lí,籬lí,驪lí,鱺lí,鸝lí,婯lí,儷lí,矖lí,纚lí,离lí,褵lí,穲lí,礼lǐ,李lǐ,里lǐ,俚lǐ,峛lǐ,哩lǐ,娌lǐ,峲lǐ,浬lǐ,逦lǐ,理lǐ,裡lǐ,锂lǐ,粴lǐ,裏lǐ,鋰lǐ,鲤lǐ,澧lǐ,禮lǐ,鯉lǐ,蟸lǐ,醴lǐ,鳢lǐ,邐lǐ,鱧lǐ,欐lǐ,欚lǐ,銐lì,脷lì,莉lì,力lì,历lì,厉lì,屴lì,立lì,吏lì,朸lì,丽lì,利lì,励lì,呖lì,坜lì,沥lì,苈lì,例lì,岦lì,戾lì,枥lì,沴lì,疠lì,苙lì,隶lì,俐lì,俪lì,栃lì,栎lì,疬lì,砅lì,茘lì,荔lì,轹lì,郦lì,娳lì,悧lì,栗lì,栛lì,栵lì,涖lì,猁lì,珕lì,砺lì,砾lì,秝lì,莅lì,唳lì,悷lì,琍lì,笠lì,粒lì,粝lì,蚸lì,蛎lì,傈lì,凓lì,厤lì,棙lì,痢lì,蛠lì,詈lì,雳lì,塛lì,慄lì,搮lì,溧lì,蒚lì,蒞lì,鉝lì,鳨lì,厯lì,厲lì,暦lì,歴lì,瑮lì,綟lì,蜧lì,勵lì,曆lì,歷lì,篥lì,隷lì,鴗lì,巁lì,檪lì,濿lì,癘lì,磿lì,隸lì,鬁lì,儮lì,櫔lì,爄lì,犡lì,禲lì,蠇lì,嚦lì,壢lì,攊lì,櫟lì,瀝lì,瓅lì,礪lì,藶lì,麗lì,櫪lì,爏lì,瓑lì,皪lì,盭lì,礫lì,糲lì,蠣lì,癧lì,礰lì,酈lì,鷅lì,麜lì,囇lì,攦lì,轢lì,讈lì,轣lì,攭lì,瓥lì,靂lì,鱱lì,靋lì,觻lì,鱳lì,叓lì,蝷lì,赲lì,曞lì,嫾liān,奁lián,连lián,帘lián,怜lián,涟lián,莲lián,連lián,梿lián,联lián,裢lián,亷lián,嗹lián,廉lián,慩lián,溓lián,漣lián,蓮lián,奩lián,熑lián,覝lián,劆lián,匳lián,噒lián,憐lián,磏lián,聨lián,聫lián,褳lián,鲢lián,濂lián,濓lián,縺lián,翴lián,聮lián,薕lián,螊lián,櫣lián,燫lián,聯lián,臁lián,蹥lián,謰lián,鎌lián,镰lián,簾lián,蠊lián,譧lián,鐮lián,鰱lián,籢lián,籨lián,槤lián,僆lián,匲lián,鬑lián,敛liǎn,琏liǎn,脸liǎn,裣liǎn,摙liǎn,璉liǎn,蔹liǎn,嬚liǎn,斂liǎn,歛liǎn,臉liǎn,鄻liǎn,襝liǎn,羷liǎn,蘝liǎn,蘞liǎn,薟liǎn,练liàn,炼liàn,恋liàn,浰liàn,殓liàn,堜liàn,媡liàn,链liàn,楝liàn,瑓liàn,潋liàn,稴liàn,練liàn,澰liàn,錬liàn,殮liàn,鍊liàn,鏈liàn,瀲liàn,鰊liàn,戀liàn,纞liàn,孌liàn,攣liàn,萰liàn,簗liāng,良liáng,凉liáng,梁liáng,涼liáng,椋liáng,辌liáng,粮liáng,粱liáng,墚liáng,綡liáng,輬liáng,糧liáng,駺liáng,樑liáng,冫liǎng,俩liǎng,倆liǎng,両liǎng,两liǎng,兩liǎng,唡liǎng,啢liǎng,掚liǎng,裲liǎng,緉liǎng,蜽liǎng,魉liǎng,魎liǎng,倞liàng,靓liàng,靚liàng,踉liàng,亮liàng,谅liàng,辆liàng,喨liàng,晾liàng,湸liàng,量liàng,煷liàng,輌liàng,諒liàng,輛liàng,鍄liàng,蹽liāo,樛liáo,潦liáo,辽liáo,疗liáo,僚liáo,寥liáo,嵺liáo,憀liáo,漻liáo,膋liáo,嘹liáo,嫽liáo,寮liáo,嶚liáo,嶛liáo,憭liáo,撩liáo,敹liáo,獠liáo,缭liáo,遼liáo,暸liáo,燎liáo,璙liáo,窷liáo,膫liáo,療liáo,竂liáo,鹩liáo,屪liáo,廫liáo,簝liáo,蟟liáo,豂liáo,賿liáo,蹘liáo,爎liáo,髎liáo,飉liáo,鷯liáo,镽liáo,尞liáo,镠liáo,鏐liáo,僇liáo,聊liáo,繚liáo,钌liǎo,釕liǎo,鄝liǎo,蓼liǎo,爒liǎo,瞭liǎo,廖liào,镣liào,鐐liào,尥liào,炓liào,料liào,撂liào,蟉liào,鴷lie,咧liě,毟liě,挘liě,埓liě,忚liě,列liè,劣liè,冽liè,姴liè,峢liè,挒liè,洌liè,茢liè,迾liè,埒liè,浖liè,烈liè,烮liè,捩liè,猎liè,猟liè,脟liè,蛚liè,裂liè,煭liè,睙liè,聗liè,趔liè,巤liè,颲liè,鮤liè,獵liè,犣liè,躐liè,鬛liè,哷liè,劦liè,奊liè,劽liè,鬣liè,拎līn,邻lín,林lín,临lín,啉lín,崊lín,淋lín,晽lín,琳lín,粦lín,痳lín,碄lín,箖lín,粼lín,鄰lín,隣lín,嶙lín,潾lín,獜lín,遴lín,斴lín,暽lín,燐lín,璘lín,辚lín,霖lín,瞵lín,磷lín,繗lín,翷lín,麐lín,轔lín,壣lín,瀶lín,鏻lín,鳞lín,驎lín,麟lín,鱗lín,疄lín,蹸lín,魿lín,涁lín,臨lín,菻lǐn,亃lǐn,僯lǐn,凛lǐn,凜lǐn,撛lǐn,廩lǐn,廪lǐn,懍lǐn,懔lǐn,澟lǐn,檁lǐn,檩lǐn,伈lǐn,吝lìn,恡lìn,赁lìn,焛lìn,賃lìn,蔺lìn,橉lìn,甐lìn,膦lìn,閵lìn,藺lìn,躏lìn,躙lìn,躪lìn,轥lìn,悋lìn,伶líng,刢líng,灵líng,囹líng,坽líng,夌líng,姈líng,岺líng,彾líng,泠líng,狑líng,苓líng,昤líng,柃líng,玲líng,瓴líng,凌líng,皊líng,砱líng,秢líng,竛líng,铃líng,陵líng,鸰líng,婈líng,崚líng,掕líng,棂líng,淩líng,琌líng,笭líng,紷líng,绫líng,羚líng,翎líng,聆líng,舲líng,菱líng,蛉líng,衑líng,祾líng,詅líng,跉líng,蓤líng,裬líng,鈴líng,閝líng,零líng,龄líng,綾líng,蔆líng,霊líng,駖líng,澪líng,蕶líng,錂líng,霗líng,鲮líng,鴒líng,鹷líng,燯líng,霛líng,霝líng,齢líng,瀮líng,酃líng,鯪líng,孁líng,蘦líng,齡líng,櫺líng,靈líng,欞líng,爧líng,麢líng,龗líng,阾líng,袊líng,靇líng,朎líng,軨líng,醽líng,岭lǐng,领lǐng,領lǐng,嶺lǐng,令lìng,另lìng,呤lìng,炩lìng,溜liū,熘liū,澑liū,蹓liū,刘liú,沠liú,畄liú,浏liú,流liú,留liú,旈liú,琉liú,畱liú,硫liú,裗liú,媹liú,嵧liú,旒liú,蓅liú,遛liú,馏liú,骝liú,榴liú,瑠liú,飗liú,劉liú,瑬liú,瘤liú,磂liú,镏liú,駠liú,鹠liú,橊liú,璢liú,疁liú,癅liú,駵liú,嚠liú,懰liú,瀏liú,藰liú,鎏liú,鎦liú,餾liú,麍liú,鐂liú,騮liú,飅liú,鰡liú,鶹liú,驑liú,蒥liú,飀liú,柳liǔ,栁liǔ,桞liǔ,珋liǔ,桺liǔ,绺liǔ,锍liǔ,綹liǔ,熮liǔ,罶liǔ,鋶liǔ,橮liǔ,羀liǔ,嬼liǔ,畂liù,六liù,翏liù,塯liù,廇liù,磟liù,鹨liù,霤liù,雡liù,鬸liù,鷚liù,飂liù,囖lō,谾lóng,龙lóng,屸lóng,咙lóng,泷lóng,茏lóng,昽lóng,栊lóng,珑lóng,胧lóng,眬lóng,砻lóng,笼lóng,聋lóng,隆lóng,湰lóng,嶐lóng,槞lóng,漋lóng,蕯lóng,癃lóng,窿lóng,篭lóng,龍lóng,巃lóng,巄lóng,瀧lóng,蘢lóng,鏧lóng,霳lóng,曨lóng,櫳lóng,爖lóng,瓏lóng,矓lóng,礱lóng,礲lóng,襱lóng,籠lóng,聾lóng,蠪lóng,蠬lóng,龓lóng,豅lóng,躘lóng,鑨lóng,驡lóng,鸗lóng,滝lóng,嚨lóng,朧lǒng,陇lǒng,垄lǒng,垅lǒng,儱lǒng,隴lǒng,壟lǒng,壠lǒng,攏lǒng,竉lǒng,徿lǒng,拢lǒng,梇lòng,衖lòng,贚lòng,喽lou,嘍lou,窶lóu,娄lóu,婁lóu,溇lóu,蒌lóu,楼lóu,廔lóu,慺lóu,蔞lóu,遱lóu,樓lóu,熡lóu,耧lóu,蝼lóu,艛lóu,螻lóu,謱lóu,軁lóu,髅lóu,鞻lóu,髏lóu,漊lóu,屚lóu,膢lóu,耬lóu,嵝lǒu,搂lǒu,塿lǒu,嶁lǒu,摟lǒu,甊lǒu,篓lǒu,簍lǒu,陋lòu,漏lòu,瘘lòu,镂lòu,瘺lòu,鏤lòu,氌lu,氇lu,噜lū,撸lū,嚕lū,擼lū,卢lú,芦lú,垆lú,枦lú,泸lú,炉lú,栌lú,胪lú,轳lú,舮lú,鸬lú,玈lú,舻lú,颅lú,鈩lú,鲈lú,魲lú,盧lú,嚧lú,壚lú,廬lú,攎lú,瀘lú,獹lú,蘆lú,櫨lú,爐lú,瓐lú,臚lú,矑lú,纑lú,罏lú,艫lú,蠦lú,轤lú,鑪lú,顱lú,髗lú,鱸lú,鸕lú,黸lú,鹵lú,塷lú,庐lú,籚lú,卤lǔ,虏lǔ,挔lǔ,捛lǔ,掳lǔ,硵lǔ,鲁lǔ,虜lǔ,滷lǔ,蓾lǔ,樐lǔ,澛lǔ,魯lǔ,擄lǔ,橹lǔ,磠lǔ,镥lǔ,櫓lǔ,艣lǔ,鏀lǔ,艪lǔ,鐪lǔ,鑥lǔ,瀂lǔ,露lù,圥lù,甪lù,陆lù,侓lù,坴lù,彔lù,录lù,峍lù,勎lù,赂lù,辂lù,陸lù,娽lù,淕lù,淥lù,渌lù,硉lù,菉lù,逯lù,鹿lù,椂lù,琭lù,祿lù,剹lù,勠lù,盝lù,睩lù,碌lù,稑lù,賂lù,路lù,輅lù,塶lù,廘lù,摝lù,漉lù,箓lù,粶lù,蔍lù,戮lù,膟lù,觮lù,趢lù,踛lù,辘lù,醁lù,潞lù,穋lù,錄lù,録lù,錴lù,璐lù,簏lù,螰lù,鴼lù,簶lù,蹗lù,轆lù,騄lù,鹭lù,簬lù,簵lù,鯥lù,鵦lù,鵱lù,麓lù,鏴lù,騼lù,籙lù,虂lù,鷺lù,緑lù,攄lù,禄lù,蕗lù,娈luán,孪luán,峦luán,挛luán,栾luán,鸾luán,脔luán,滦luán,銮luán,鵉luán,奱luán,孿luán,巒luán,曫luán,欒luán,灓luán,羉luán,臠luán,圞luán,灤luán,虊luán,鑾luán,癴luán,癵luán,鸞luán,圝luán,卵luǎn,乱luàn,釠luàn,亂luàn,乿luàn,掠luě,稤luě,略luè,畧luè,锊luè,圙luè,鋝luè,鋢luè,剠luè,擽luè,抡lún,掄lún,仑lún,伦lún,囵lún,沦lún,纶lún,轮lún,倫lún,陯lún,圇lún,婨lún,崘lún,崙lún,惀lún,淪lún,菕lún,棆lún,腀lún,碖lún,綸lún,蜦lún,踚lún,輪lún,磮lún,鯩lún,耣lún,稐lǔn,埨lǔn,侖lùn,溣lùn,論lùn,论lùn,頱luō,囉luō,啰luō,罗luó,猡luó,脶luó,萝luó,逻luó,椤luó,腡luó,锣luó,箩luó,骡luó,镙luó,螺luó,羅luó,覶luó,鏍luó,儸luó,覼luó,騾luó,蘿luó,邏luó,欏luó,鸁luó,鑼luó,饠luó,驘luó,攞luó,籮luó,剆luǒ,倮luǒ,砢luǒ,蓏luǒ,裸luǒ,躶luǒ,瘰luǒ,蠃luǒ,臝luǒ,曪luǒ,癳luǒ,茖luò,蛒luò,硦luò,泺luò,峈luò,洛luò,络luò,荦luò,骆luò,洜luò,珞luò,笿luò,絡luò,落luò,摞luò,漯luò,犖luò,雒luò,鮥luò,鵅luò,濼luò,纙luò,挼luò,跞luò,駱luò,瞜lǘ,瘻lǘ,驴lǘ,闾lǘ,榈lǘ,馿lǘ,氀lǘ,櫚lǘ,藘lǘ,曥lǘ,鷜lǘ,驢lǘ,閭lǘ,偻lǚ,僂lǚ,吕lǚ,呂lǚ,侣lǚ,郘lǚ,侶lǚ,旅lǚ,梠lǚ,焒lǚ,祣lǚ,稆lǚ,铝lǚ,屡lǚ,絽lǚ,缕lǚ,屢lǚ,膂lǚ,膐lǚ,褛lǚ,鋁lǚ,履lǚ,褸lǚ,儢lǚ,縷lǚ,穭lǚ,捋lǚ,穞lǚ,寠lǜ,滤lǜ,濾lǜ,寽lǜ,垏lǜ,律lǜ,虑lǜ,率lǜ,绿lǜ,嵂lǜ,氯lǜ,葎lǜ,綠lǜ,慮lǜ,箻lǜ,勴lǜ,繂lǜ,櫖lǜ,爈lǜ,鑢lǜ,卛lǜ,亇ma,吗ma,嗎ma,嘛ma,妈mā,媽mā,痲mā,孖mā,麻má,嫲má,蔴má,犘má,蟆má,蟇má,尛má,马mǎ,犸mǎ,玛mǎ,码mǎ,蚂mǎ,馬mǎ,溤mǎ,獁mǎ,遤mǎ,瑪mǎ,碼mǎ,螞mǎ,鷌mǎ,鰢mǎ,傌mǎ,榪mǎ,鎷mǎ,杩mà,祃mà,閁mà,骂mà,睰mà,嘜mà,禡mà,罵mà,駡mà,礣mà,鬕mà,貍mái,埋mái,霾mái,买mǎi,荬mǎi,買mǎi,嘪mǎi,蕒mǎi,鷶mǎi,唛mài,劢mài,佅mài,売mài,麦mài,卖mài,脈mài,麥mài,衇mài,勱mài,賣mài,邁mài,霡mài,霢mài,迈mài,颟mān,顢mān,姏mán,悗mán,蛮mán,慲mán,摱mán,馒mán,槾mán,樠mán,瞒mán,瞞mán,鞔mán,饅mán,鳗mán,鬗mán,鬘mán,蠻mán,矕mán,僈mán,屘mǎn,満mǎn,睌mǎn,满mǎn,滿mǎn,螨mǎn,襔mǎn,蟎mǎn,鏋mǎn,曼màn,谩màn,墁màn,幔màn,慢màn,漫màn,獌màn,缦màn,蔄màn,蔓màn,熳màn,澷màn,镘màn,縵màn,蟃màn,鏝màn,蘰màn,鰻màn,謾màn,牤māng,朚máng,龒máng,邙máng,吂máng,忙máng,汒máng,芒máng,尨máng,杗máng,杧máng,盲máng,厖máng,恾máng,笀máng,茫máng,哤máng,娏máng,浝máng,狵máng,牻máng,硭máng,釯máng,铓máng,痝máng,鋩máng,駹máng,蘉máng,氓máng,甿máng,庬máng,鹲máng,鸏máng,莽mǎng,茻mǎng,壾mǎng,漭mǎng,蟒mǎng,蠎mǎng,莾mǎng,匁mangmi,猫māo,貓māo,毛máo,矛máo,枆máo,牦máo,茅máo,旄máo,渵máo,軞máo,酕máo,堥máo,锚máo,緢máo,髦máo,髳máo,錨máo,蟊máo,鶜máo,茆máo,罞máo,鉾máo,冇mǎo,戼mǎo,峁mǎo,泖mǎo,昴mǎo,铆mǎo,笷mǎo,蓩mǎo,鉚mǎo,卯mǎo,秏mào,冃mào,皃mào,芼mào,冐mào,茂mào,冒mào,贸mào,耄mào,袤mào,覒mào,媢mào,帽mào,貿mào,鄚mào,愗mào,暓mào,楙mào,毷mào,瑁mào,貌mào,鄮mào,蝐mào,懋mào,霿mào,獏mào,毣mào,萺mào,瞀mào,唜mas,么me,嚜me,麼me,麽me,庅mē,嚒mē,孭mē,濹mè,嚰mè,沒méi,没méi,枚méi,玫méi,苺méi,栂méi,眉méi,脄méi,莓méi,梅méi,珻méi,脢méi,郿méi,堳méi,媒méi,嵋méi,湄méi,湈méi,睂méi,葿méi,楣méi,楳méi,煤méi,瑂méi,禖méi,腜méi,塺méi,槑méi,酶méi,镅méi,鹛méi,鋂méi,霉méi,徾méi,鎇méi,矀méi,攗méi,蘪méi,鶥méi,攟méi,黴méi,坆méi,猸méi,羙měi,毎měi,每měi,凂měi,美měi,挴měi,浼měi,媄měi,渼měi,媺měi,镁měi,嬍měi,燘měi,躾měi,鎂měi,黣měi,嵄měi,眊mèi,妹mèi,抺mèi,沬mèi,昧mèi,祙mèi,袂mèi,眛mèi,媚mèi,寐mèi,痗mèi,跊mèi,鬽mèi,煝mèi,睸mèi,魅mèi,篃mèi,蝞mèi,櫗mèi,氼mèi,们men,們men,椚mēn,门mén,扪mén,钔mén,門mén,閅mén,捫mén,菛mén,璊mén,穈mén,鍆mén,虋mén,怋mén,玣mén,殙mèn,闷mèn,焖mèn,悶mèn,暪mèn,燜mèn,懑mèn,懣mèn,掹mēng,擝mēng,懞mēng,虻méng,冡méng,莔méng,萌méng,萠méng,盟méng,甍méng,儚méng,橗méng,瞢méng,蕄méng,蝱méng,鄳méng,鄸méng,幪méng,濛méng,獴méng,曚méng,朦méng,檬méng,氋méng,礞méng,鯍méng,艨méng,矒méng,靀méng,饛méng,顭méng,蒙méng,鼆méng,夣méng,懜méng,溕méng,矇měng,勐měng,猛měng,锰měng,艋měng,蜢měng,錳měng,懵měng,蠓měng,鯭měng,黽měng,瓾měng,夢mèng,孟mèng,梦mèng,霥mèng,踎meo,咪mī,瞇mī,眯mī,冞mí,弥mí,祢mí,迷mí,袮mí,猕mí,谜mí,蒾mí,詸mí,謎mí,醚mí,彌mí,糜mí,縻mí,麊mí,麋mí,禰mí,靡mí,獼mí,麛mí,爢mí,瓕mí,蘼mí,镾mí,醾mí,醿mí,鸍mí,釄mí,檷mí,籋mí,罙mí,擟mí,米mǐ,羋mǐ,芈mǐ,侎mǐ,沵mǐ,弭mǐ,洣mǐ,敉mǐ,粎mǐ,脒mǐ,葞mǐ,蝆mǐ,蔝mǐ,銤mǐ,瀰mǐ,孊mǐ,灖mǐ,渳mǐ,哋mì,汨mì,沕mì,宓mì,泌mì,觅mì,峚mì,宻mì,秘mì,密mì,淧mì,覓mì,覔mì,幂mì,谧mì,塓mì,幎mì,覛mì,嘧mì,榓mì,漞mì,熐mì,蔤mì,蜜mì,鼏mì,冪mì,樒mì,幦mì,濗mì,藌mì,謐mì,櫁mì,簚mì,羃mì,鑖mì,蓂mì,滵mì,芇mián,眠mián,婂mián,绵mián,媔mián,棉mián,綿mián,緜mián,蝒mián,嬵mián,檰mián,櫋mián,矈mián,矊mián,蠠mián,矏mián,厸miǎn,丏miǎn,汅miǎn,免miǎn,沔miǎn,黾miǎn,俛miǎn,勉miǎn,眄miǎn,娩miǎn,偭miǎn,冕miǎn,勔miǎn,喕miǎn,愐miǎn,湎miǎn,缅miǎn,葂miǎn,腼miǎn,緬miǎn,鮸miǎn,渑miǎn,澠miǎn,靦miǎn,靣miàn,面miàn,糆miàn,麪miàn,麫miàn,麺miàn,麵miàn,喵miāo,苗miáo,媌miáo,瞄miáo,鹋miáo,嫹miáo,鶓miáo,鱙miáo,描miáo,訬miǎo,仯miǎo,杪miǎo,眇miǎo,秒miǎo,淼miǎo,渺miǎo,缈miǎo,篎miǎo,緲miǎo,藐miǎo,邈miǎo,妙miào,庙miào,竗miào,庿miào,廟miào,吀miē,咩miē,哶miē,灭miè,搣miè,滅miè,薎miè,幭miè,懱miè,篾miè,蠛miè,衊miè,鱴miè,蔑miè,民mín,垊mín,姄mín,岷mín,旻mín,旼mín,玟mín,苠mín,珉mín,盿mín,冧mín,罠mín,崏mín,捪mín,琘mín,琝mín,暋mín,瑉mín,痻mín,碈mín,鈱mín,賯mín,錉mín,鍲mín,缗mín,湏mǐn,緍mǐn,緡mǐn,皿mǐn,冺mǐn,刡mǐn,闵mǐn,抿mǐn,泯mǐn,勄mǐn,敃mǐn,闽mǐn,悯mǐn,敏mǐn,笢mǐn,笽mǐn,湣mǐn,閔mǐn,愍mǐn,敯mǐn,閩mǐn,慜mǐn,憫mǐn,潣mǐn,簢mǐn,鳘mǐn,鰵mǐn,僶mǐn,名míng,明míng,鸣míng,洺míng,眀míng,茗míng,冥míng,朙míng,眳míng,铭míng,鄍míng,嫇míng,溟míng,猽míng,暝míng,榠míng,銘míng,鳴míng,瞑míng,螟míng,覭míng,佲mǐng,凕mǐng,慏mǐng,酩mǐng,姳mǐng,命mìng,掵mìng,詺mìng,谬miù,缪miù,繆miù,謬miù,摸mō,嚤mō,嬤mó,嬷mó,戂mó,攠mó,谟mó,嫫mó,馍mó,摹mó,模mó,膜mó,摩mó,魹mó,橅mó,磨mó,糢mó,謨mó,謩mó,擵mó,饃mó,蘑mó,髍mó,魔mó,劘mó,饝mó,嚩mó,懡mǒ,麿mǒ,狢mò,貈mò,貉mò,脉mò,瀎mò,抹mò,末mò,劰mò,圽mò,妺mò,怽mò,歿mò,殁mò,沫mò,茉mò,陌mò,帞mò,昩mò,枺mò,皌mò,眜mò,眿mò,砞mò,秣mò,莈mò,眽mò,粖mò,絈mò,蛨mò,貃mò,嗼mò,塻mò,寞mò,漠mò,蓦mò,貊mò,銆mò,墨mò,嫼mò,暯mò,瘼mò,瞐mò,瞙mò,镆mò,魩mò,黙mò,縸mò,默mò,貘mò,藦mò,蟔mò,鏌mò,爅mò,礳mò,纆mò,耱mò,艒mò,莫mò,驀mò,乮mol,哞mōu,呣móu,蛑móu,蝥móu,牟móu,侔móu,劺móu,恈móu,洠móu,眸móu,谋móu,謀móu,鍪móu,鴾móu,麰móu,鞪móu,某mǒu,呒mú,嘸mú,毪mú,氁mú,母mǔ,亩mǔ,牡mǔ,姆mǔ,拇mǔ,牳mǔ,畆mǔ,畒mǔ,胟mǔ,畝mǔ,畞mǔ,砪mǔ,畮mǔ,鉧mǔ,踇mǔ,坶mǔ,峔mǔ,朷mù,木mù,仫mù,目mù,凩mù,沐mù,狇mù,炑mù,牧mù,苜mù,莯mù,蚞mù,钼mù,募mù,雮mù,墓mù,幕mù,慔mù,楘mù,睦mù,鉬mù,慕mù,暮mù,樢mù,霂mù,穆mù,幙mù,旀myeo,椧myeong,秅ná,拏ná,拿ná,挐ná,誽ná,镎ná,鎿ná,乸ná,詉ná,蒘ná,訤ná,哪nǎ,雫nǎ,郍nǎ,那nà,吶nà,妠nà,纳nà,肭nà,娜nà,钠nà,納nà,袦nà,捺nà,笝nà,豽nà,軜nà,鈉nà,嗱nà,蒳nà,靹nà,魶nà,呐nà,內nà,篛nà,衲nà,腉nái,熋nái,摨nái,孻nái,螚nái,搱nái,乃nǎi,奶nǎi,艿nǎi,氖nǎi,疓nǎi,妳nǎi,廼nǎi,迺nǎi,倷nǎi,釢nǎi,奈nài,柰nài,萘nài,渿nài,鼐nài,褦nài,錼nài,耐nài,囡nān,男nán,抩nán,枏nán,枬nán,侽nán,南nán,柟nán,娚nán,畘nán,莮nán,难nán,喃nán,遖nán,暔nán,楠nán,煵nán,諵nán,難nán,萳nán,嫨nǎn,赧nǎn,揇nǎn,湳nǎn,腩nǎn,戁nǎn,蝻nǎn,婻nàn,囔nāng,涳náng,乪náng,嚢náng,囊náng,蠰náng,鬞náng,馕náng,欜náng,饢náng,搑náng,崀nǎng,擃nǎng,曩nǎng,攮nǎng,灢nǎng,瀼nǎng,儾nàng,齉nàng,孬nāo,檂nāo,巙náo,呶náo,怓náo,挠náo,峱náo,硇náo,铙náo,猱náo,蛲náo,碙náo,撓náo,獶náo,蟯náo,夒náo,譊náo,鐃náo,巎náo,獿náo,憹náo,蝚náo,嶩náo,垴nǎo,恼nǎo,悩nǎo,脑nǎo,匘nǎo,脳nǎo,堖nǎo,惱nǎo,嫐nǎo,瑙nǎo,腦nǎo,碯nǎo,闹nào,婥nào,淖nào,閙nào,鬧nào,臑nào,呢ne,讷nè,抐nè,眲nè,訥nè,娞něi,馁něi,腇něi,餒něi,鮾něi,鯘něi,浽něi,内nèi,氝nèi,焾nem,嫩nèn,媆nèn,嫰nèn,竜néng,能néng,莻neus,鈪ngag,銰ngai,啱ngam,妮nī,尼ní,坭ní,怩ní,泥ní,籾ní,倪ní,屔ní,秜ní,郳ní,铌ní,埿ní,婗ní,猊ní,蚭ní,棿ní,跜ní,鈮ní,蜺ní,觬ní,貎ní,霓ní,鲵ní,鯢ní,麑ní,齯ní,臡ní,抳ní,蛪ní,腝ní,淣ní,聻nǐ,濔nǐ,伱nǐ,你nǐ,拟nǐ,狔nǐ,苨nǐ,柅nǐ,旎nǐ,晲nǐ,孴nǐ,鉨nǐ,馜nǐ,隬nǐ,擬nǐ,薿nǐ,鑈nǐ,儞nǐ,伲nì,迡nì,昵nì,胒nì,逆nì,匿nì,痆nì,眤nì,堄nì,惄nì,嫟nì,愵nì,溺nì,睨nì,腻nì,暱nì,縌nì,膩nì,嬺nì,灄nì,孨nì,拈niān,蔫niān,年nián,秊nián,哖nián,秥nián,鮎nián,鲶nián,鵇nián,黏nián,鯰nián,姩nián,鲇nián,跈niǎn,涊niǎn,捻niǎn,淰niǎn,辇niǎn,撚niǎn,撵niǎn,碾niǎn,輦niǎn,簐niǎn,攆niǎn,蹨niǎn,躎niǎn,辗niǎn,輾niǎn,卄niàn,廿niàn,念niàn,埝niàn,艌niàn,娘niáng,嬢niáng,醸niáng,酿niàng,釀niàng,茮niǎo,尦niǎo,鸟niǎo,袅niǎo,鳥niǎo,嫋niǎo,裊niǎo,蔦niǎo,嬝niǎo,褭niǎo,嬲niǎo,茑niǎo,尿niào,脲niào,捏niē,揑niē,乜niè,帇niè,圼niè,苶niè,枿niè,陧niè,涅niè,聂niè,臬niè,啮niè,惗niè,菍niè,隉niè,喦niè,敜niè,嗫niè,嵲niè,踂niè,摰niè,槷niè,踗niè,踙niè,镊niè,镍niè,嶭niè,篞niè,臲niè,錜niè,颞niè,蹑niè,嚙niè,聶niè,鎳niè,闑niè,孼niè,孽niè,櫱niè,蘖niè,囁niè,齧niè,巕niè,糱niè,糵niè,蠥niè,囓niè,躡niè,鑷niè,顳niè,諗niè,囐niè,銸niè,鋷niè,讘niè,脌nīn,囜nín,您nín,恁nín,拰nǐn,宁níng,咛níng,狞níng,柠níng,聍níng,寍níng,寕níng,寜níng,寧níng,儜níng,凝níng,嚀níng,嬣níng,獰níng,薴níng,檸níng,聹níng,鑏níng,鬡níng,鸋níng,甯níng,濘níng,鬤níng,拧nǐng,擰nǐng,矃nǐng,橣nǐng,佞nìng,侫nìng,泞nìng,寗nìng,澝nìng,妞niū,牛niú,牜niú,忸niǔ,扭niǔ,沑niǔ,狃niǔ,纽niǔ,杻niǔ,炄niǔ,钮niǔ,紐niǔ,莥niǔ,鈕niǔ,靵niǔ,拗niù,莀nóng,农nóng,侬nóng,哝nóng,浓nóng,脓nóng,秾nóng,儂nóng,辳nóng,噥nóng,濃nóng,蕽nóng,禯nóng,膿nóng,穠nóng,襛nóng,醲nóng,欁nóng,癑nóng,農nóng,繷nǒng,廾nòng,弄nòng,挊nòng,挵nòng,齈nòng,羺nóu,譨nóu,啂nǒu,槈nòu,耨nòu,獳nòu,檽nòu,鎒nòu,鐞nòu,譳nòu,嬬nòu,奴nú,驽nú,笯nú,駑nú,砮nú,孥nú,伮nǔ,努nǔ,弩nǔ,胬nǔ,怒nù,傉nù,搙nù,奻nuán,渜nuán,暖nuǎn,煗nuǎn,餪nuǎn,疟nuè,虐nuè,瘧nuè,硸nuè,黁nun,燶nung,挪nuó,梛nuó,傩nuó,搻nuó,儺nuó,橠nuó,袲nuǒ,诺nuò,喏nuò,掿nuò,逽nuò,搦nuò,锘nuò,榒nuò,稬nuò,諾nuò,蹃nuò,糑nuò,懦nuò,懧nuò,糥nuò,穤nuò,糯nuò,堧nuò,耎nuò,愞nuò,女nǚ,钕nǚ,籹nǚ,釹nǚ,衂nǜ,恧nǜ,朒nǜ,衄nǜ,筽o,噢ō,哦ò,夞oes,乯ol,鞰on,吽ōu,讴ōu,欧ōu,殴ōu,瓯ōu,鸥ōu,塸ōu,歐ōu,毆ōu,熰ōu,甌ōu,膒ōu,鴎ōu,櫙ōu,藲ōu,謳ōu,鏂ōu,鷗ōu,沤ōu,蓲ōu,敺ōu,醧ōu,漚ōu,齵óu,澫ǒu,吘ǒu,呕ǒu,偶ǒu,腢ǒu,嘔ǒu,耦ǒu,蕅ǒu,藕ǒu,怄òu,慪òu,妑pā,趴pā,舥pā,啪pā,葩pā,帊pā,杷pá,爬pá,耙pá,掱pá,琶pá,筢pá,潖pá,跁pá,帕pà,怕pà,袙pà,拍pāi,俳pái,徘pái,排pái,猅pái,牌pái,輫pái,簰pái,犤pái,哌pài,派pài,蒎pài,鎃pài,湃pài,磗pak,眅pān,畨pān,潘pān,攀pān,膰pán,爿pán,柈pán,盘pán,媻pán,幋pán,蒰pán,槃pán,盤pán,磐pán,縏pán,蹒pán,瀊pán,蟠pán,蹣pán,鎜pán,鞶pán,踫pán,宷pán,洀pán,闆pǎn,坢pǎn,盻pǎn,眫pàn,冸pàn,判pàn,沜pàn,泮pàn,叛pàn,牉pàn,盼pàn,畔pàn,袢pàn,詊pàn,溿pàn,頖pàn,鋬pàn,鵥pàn,襻pàn,鑻pàn,炍pàn,乓pāng,汸pāng,沗pāng,肨pāng,胮pāng,雱pāng,滂pāng,膖pāng,霶pāng,磅páng,趽páng,彷páng,夆páng,厐páng,庞páng,逄páng,旁páng,舽páng,篣páng,螃páng,鳑páng,龐páng,鰟páng,蠭páng,髈páng,龎páng,耪pǎng,覫pǎng,炐pàng,胖pàng,抛pāo,拋pāo,脬pāo,刨páo,咆páo,垉páo,庖páo,狍páo,炰páo,爮páo,袍páo,匏páo,軳páo,鞄páo,褜páo,麅páo,颮páo,跑pǎo,窌pào,炮pào,奅pào,泡pào,皰pào,砲pào,萢pào,麭pào,礟pào,礮pào,犥pào,疱pào,妚pēi,呸pēi,怌pēi,肧pēi,胚pēi,衃pēi,醅pēi,抷pēi,阫péi,陪péi,陫péi,培péi,毰péi,赔péi,锫péi,裴péi,裵péi,賠péi,錇péi,駍péi,婄péi,俖pěi,茷pèi,攈pèi,伂pèi,沛pèi,佩pèi,帔pèi,姵pèi,旆pèi,浿pèi,珮pèi,配pèi,笩pèi,蓜pèi,辔pèi,馷pèi,嶏pèi,霈pèi,轡pèi,斾pèi,喷pēn,噴pēn,濆pēn,歕pēn,衯pén,瓫pén,盆pén,湓pén,葐pén,呠pěn,翸pěn,匉pēng,怦pēng,抨pēng,泙pēng,恲pēng,胓pēng,砰pēng,烹pēng,硑pēng,軯pēng,閛pēng,漰pēng,嘭pēng,磞pēng,弸pēng,荓pēng,軿pēng,輧pēng,梈pēng,芃péng,朋péng,竼péng,倗péng,莑péng,堋péng,彭péng,棚péng,椖péng,塜péng,塳péng,漨péng,硼péng,稝péng,蓬péng,鹏péng,槰péng,樥péng,憉péng,澎péng,輣péng,篷péng,膨péng,韸péng,髼péng,蟚péng,蟛péng,鬅péng,纄péng,韼péng,鵬péng,鬔péng,鑝péng,淜péng,熢péng,摓pěng,捧pěng,淎pěng,皏pěng,剻pěng,掽pèng,椪pèng,碰pèng,浌peol,巼phas,闏phdeng,乶phoi,喸phos,榌pi,伓pī,伾pī,批pī,纰pī,邳pī,坯pī,披pī,炋pī,狉pī,狓pī,砒pī,秛pī,秠pī,紕pī,耚pī,豾pī,釽pī,鉟pī,銔pī,劈pī,磇pī,駓pī,噼pī,錃pī,魾pī,憵pī,礔pī,礕pī,霹pī,鲏pī,鮍pī,丕pī,髬pī,铍pí,鈹pí,皮pí,阰pí,芘pí,岯pí,枇pí,毞pí,毗pí,毘pí,疲pí,蚍pí,郫pí,陴pí,啤pí,埤pí,蚽pí,豼pí,焷pí,脾pí,腗pí,罴pí,膍pí,蜱pí,隦pí,壀pí,篺pí,螷pí,貔pí,簲pí,羆pí,鵧pí,朇pí,鼙pí,蠯pí,猈pí,琵pí,匹pǐ,庀pǐ,仳pǐ,圮pǐ,苉pǐ,脴pǐ,痞pǐ,銢pǐ,鴄pǐ,噽pǐ,癖pǐ,嚭pǐ,顖pǐ,擗pǐ,辟pì,鈲pì,闢pì,屁pì,淠pì,渒pì,揊pì,媲pì,嫓pì,睤pì,睥pì,潎pì,僻pì,澼pì,嚊pì,甓pì,疈pì,譬pì,鷿pì,囨piān,偏piān,媥piān,犏piān,篇piān,翩piān,骈pián,胼pián,楄pián,楩pián,賆pián,諚pián,骿pián,蹁pián,駢pián,騈pián,徧pián,腁pián,覑piǎn,谝piǎn,貵piǎn,諞piǎn,片piàn,骗piàn,魸piàn,騗piàn,騙piàn,剽piāo,彯piāo,漂piāo,缥piāo,飘piāo,磦piāo,旚piāo,縹piāo,翲piāo,螵piāo,飄piāo,魒piāo,薸piáo,闝piáo,嫖piáo,瓢piáo,莩piǎo,殍piǎo,瞟piǎo,醥piǎo,皫piǎo,顠piǎo,飃piào,票piào,勡piào,嘌piào,慓piào,覕piē,氕piē,撆piē,暼piē,瞥piē,撇piě,丿piě,苤piě,鐅piě,嫳piè,拚pīn,姘pīn,拼pīn,礗pīn,穦pīn,馪pīn,驞pīn,贫pín,貧pín,嫔pín,频pín,頻pín,嬪pín,薲pín,嚬pín,矉pín,颦pín,顰pín,蘋pín,玭pín,品pǐn,榀pǐn,朩pìn,牝pìn,汖pìn,聘pìn,娉pīng,乒pīng,甹pīng,俜pīng,涄pīng,砯pīng,艵pīng,竮pīng,頩pīng,冖píng,平píng,评píng,凭píng,坪píng,岼píng,苹píng,郱píng,屏píng,帡píng,枰píng,洴píng,玶píng,娦píng,瓶píng,屛píng,帲píng,萍píng,蚲píng,塀píng,幈píng,焩píng,甁píng,缾píng,聠píng,蓱píng,蛢píng,評píng,鲆píng,凴píng,慿píng,憑píng,鮃píng,簈píng,呯píng,箳píng,鏺po,钋pō,坡pō,岥pō,泼pō,釙pō,颇pō,溌pō,酦pō,潑pō,醱pō,頗pō,攴pō,巿pó,婆pó,嘙pó,鄱pó,皤pó,謈pó,櫇pó,叵pǒ,尀pǒ,钷pǒ,笸pǒ,鉕pǒ,駊pǒ,屰pò,廹pò,岶pò,迫pò,敀pò,昢pò,洦pò,珀pò,烞pò,破pò,砶pò,粕pò,奤pò,蒪pò,魄pò,皛pò,頮pōu,剖pōu,颒pōu,抙pōu,捊pōu,抔póu,掊póu,裒póu,咅pǒu,哣pǒu,犃pǒu,兺ppun,哛ppun,巬pu,巭pu,扑pū,炇pū,痡pū,駇pū,噗pū,撲pū,鋪pū,潽pū,襆pú,脯pú,蜅pú,仆pú,圤pú,匍pú,莆pú,菩pú,菐pú,葡pú,蒱pú,蒲pú,僕pú,酺pú,墣pú,璞pú,瞨pú,穙pú,镤pú,贌pú,纀pú,鏷pú,襥pú,濮pú,朴pǔ,圃pǔ,埔pǔ,浦pǔ,烳pǔ,普pǔ,圑pǔ,溥pǔ,暜pǔ,谱pǔ,樸pǔ,氆pǔ,諩pǔ,檏pǔ,镨pǔ,譜pǔ,蹼pǔ,鐠pǔ,铺pù,舖pù,舗pù,曝pù,七qī,沏qī,妻qī,恓qī,柒qī,倛qī,凄qī,栖qī,桤qī,缼qī,郪qī,娸qī,戚qī,捿qī,桼qī,淒qī,萋qī,朞qī,期qī,棲qī,欺qī,紪qī,褄qī,僛qī,嘁qī,慽qī,榿qī,漆qī,緀qī,磎qī,諆qī,諿qī,霋qī,蹊qī,魌qī,鏚qī,鶈qī,碕qī,螇qī,傶qī,迉qī,軙qí,荎qí,饑qí,亓qí,祁qí,齐qí,圻qí,岐qí,岓qí,忯qí,芪qí,亝qí,其qí,奇qí,斉qí,歧qí,祇qí,祈qí,肵qí,疧qí,竒qí,剘qí,斊qí,旂qí,脐qí,蚑qí,蚔qí,蚚qí,颀qí,埼qí,崎qí,掑qí,淇qí,渏qí,猉qí,畦qí,萁qí,跂qí,軝qí,釮qí,骐qí,骑qí,嵜qí,棊qí,棋qí,琦qí,琪qí,祺qí,蛴qí,愭qí,碁qí,鬿qí,旗qí,粸qí,綥qí,綦qí,綨qí,緕qí,蜝qí,蜞qí,齊qí,禥qí,蕲qí,螧qí,鲯qí,濝qí,藄qí,檱qí,櫀qí,簱qí,臍qí,騎qí,騏qí,鳍qí,蘄qí,鵸qí,鶀qí,麒qí,籏qí,纃qí,艩qí,蠐qí,鬐qí,騹qí,魕qí,鰭qí,玂qí,麡qí,荠qí,薺qí,扺qí,耆qí,鯕qí,袳qǐ,乞qǐ,邔qǐ,企qǐ,屺qǐ,岂qǐ,芑qǐ,启qǐ,呇qǐ,杞qǐ,玘qǐ,盀qǐ,唘qǐ,豈qǐ,起qǐ,啓qǐ,啔qǐ,啟qǐ,绮qǐ,棨qǐ,綮qǐ,綺qǐ,諬qǐ,簯qǐ,闙qǐ,梩qǐ,婍qǐ,鼜qì,悽qì,槭qì,气qì,讫qì,気qì,汔qì,迄qì,弃qì,汽qì,芞qì,呮qì,泣qì,炁qì,盵qì,咠qì,契qì,砌qì,栔qì,氣qì,訖qì,唭qì,夡qì,棄qì,湆qì,湇qì,葺qì,碛qì,摖qì,暣qì,甈qì,碶qì,噐qì,憇qì,器qì,憩qì,磜qì,磧qì,磩qì,罊qì,趞qì,洓qì,慼qì,欫qì,掐qiā,葜qiā,愘qiā,搳qiā,拤qiá,跒qiǎ,酠qiǎ,鞐qiǎ,圶qià,冾qià,恰qià,洽qià,殎qià,硈qià,髂qià,磍qià,帢qià,千qiān,仟qiān,阡qiān,圱qiān,圲qiān,奷qiān,扦qiān,汘qiān,芊qiān,迁qiān,佥qiān,岍qiān,杄qiān,汧qiān,茾qiān,竏qiān,臤qiān,钎qiān,拪qiān,牵qiān,粁qiān,悭qiān,蚈qiān,铅qiān,牽qiān,釺qiān,谦qiān,鈆qiān,僉qiān,愆qiān,签qiān,鉛qiān,骞qiān,鹐qiān,慳qiān,搴qiān,撁qiān,箞qiān,諐qiān,遷qiān,褰qiān,謙qiān,顅qiān,檶qiān,攐qiān,攑qiān,櫏qiān,簽qiān,鵮qiān,攓qiān,騫qiān,鬜qiān,鬝qiān,籤qiān,韆qiān,鋟qiān,扡qiān,杴qiān,孅qiān,藖qiān,谸qiān,鏲qiān,朁qián,岒qián,忴qián,扲qián,拑qián,前qián,荨qián,钤qián,歬qián,虔qián,钱qián,钳qián,乾qián,掮qián,軡qián,媊qián,鈐qián,鉗qián,榩qián,箝qián,潜qián,羬qián,橬qián,錢qián,黔qián,鎆qián,騝qián,濳qián,騚qián,灊qián,籖qián,鰬qián,潛qián,蚙qián,煔qián,燂qián,葴qián,鍼qián,墘qián,浅qiǎn,肷qiǎn,淺qiǎn,嵰qiǎn,遣qiǎn,槏qiǎn,膁qiǎn,蜸qiǎn,谴qiǎn,缱qiǎn,譴qiǎn,鑓qiǎn,繾qiǎn,欠qiàn,刋qiàn,伣qiàn,芡qiàn,俔qiàn,茜qiàn,倩qiàn,悓qiàn,堑qiàn,嵌qiàn,棈qiàn,椠qiàn,嗛qiàn,皘qiàn,蒨qiàn,塹qiàn,歉qiàn,綪qiàn,蔳qiàn,儙qiàn,槧qiàn,篏qiàn,輤qiàn,篟qiàn,壍qiàn,嬱qiàn,縴qiàn,廞qiàn,鸧qiāng,鶬qiāng,羌qiāng,戕qiāng,戗qiāng,斨qiāng,枪qiāng,玱qiāng,猐qiāng,琷qiāng,跄qiāng,嗴qiāng,獇qiāng,腔qiāng,溬qiāng,蜣qiāng,锖qiāng,嶈qiāng,戧qiāng,槍qiāng,牄qiāng,瑲qiāng,锵qiāng,篬qiāng,錆qiāng,蹌qiāng,镪qiāng,蹡qiāng,鏘qiāng,鏹qiāng,啌qiāng,鎗qiāng,強qiáng,强qiáng,墙qiáng,嫱qiáng,蔷qiáng,樯qiáng,漒qiáng,墻qiáng,嬙qiáng,廧qiáng,薔qiáng,檣qiáng,牆qiáng,謒qiáng,艢qiáng,蘠qiáng,抢qiǎng,羟qiǎng,搶qiǎng,羥qiǎng,墏qiǎng,摤qiǎng,繈qiǎng,襁qiǎng,繦qiǎng,嗆qiàng,炝qiàng,唴qiàng,羻qiàng,呛qiàng,熗qiàng,悄qiāo,硗qiāo,郻qiāo,跷qiāo,鄡qiāo,鄥qiāo,劁qiāo,敲qiāo,踍qiāo,锹qiāo,碻qiāo,頝qiāo,墽qiāo,幧qiāo,橇qiāo,燆qiāo,缲qiāo,鍫qiāo,鍬qiāo,繰qiāo,趬qiāo,鐰qiāo,鞽qiāo,塙qiāo,毃qiāo,鏒qiāo,橾qiāo,喿qiāo,蹺qiāo,峤qiáo,嶠qiáo,乔qiáo,侨qiáo,荍qiáo,荞qiáo,桥qiáo,硚qiáo,菬qiáo,喬qiáo,睄qiáo,僑qiáo,槗qiáo,谯qiáo,嘺qiáo,憔qiáo,蕎qiáo,鞒qiáo,樵qiáo,橋qiáo,犞qiáo,癄qiáo,瞧qiáo,礄qiáo,藮qiáo,譙qiáo,鐈qiáo,墧qiáo,顦qiáo,磽qiǎo,巧qiǎo,愀qiǎo,髜qiǎo,偢qiào,墝qiào,俏qiào,诮qiào,陗qiào,峭qiào,帩qiào,窍qiào,翘qiào,誚qiào,髚qiào,僺qiào,撬qiào,鞘qiào,韒qiào,竅qiào,翹qiào,鞩qiào,躈qiào,踃qiào,切qiē,苆qiē,癿qié,茄qié,聺qié,且qiě,詧qiè,慊qiè,厒qiè,怯qiè,匧qiè,窃qiè,倿qiè,悏qiè,挈qiè,惬qiè,笡qiè,愜qiè,朅qiè,箧qiè,緁qiè,锲qiè,篋qiè,踥qiè,穕qiè,藒qiè,鍥qiè,鯜qiè,鐑qiè,竊qiè,籡qiè,帹qiè,郄qiè,郤qiè,稧qiè,妾qiè,亲qīn,侵qīn,钦qīn,衾qīn,菳qīn,媇qīn,嵚qīn,綅qīn,誛qīn,嶔qīn,親qīn,顉qīn,駸qīn,鮼qīn,寴qīn,欽qīn,骎qīn,鈂qín,庈qín,芩qín,芹qín,埁qín,珡qín,矝qín,秦qín,耹qín,菦qín,捦qín,琴qín,琹qín,禽qín,鈙qín,雂qín,勤qín,嗪qín,嫀qín,靲qín,噙qín,擒qín,鳹qín,懄qín,檎qín,澿qín,瘽qín,螓qín,懃qín,蠄qín,鬵qín,溱qín,坅qǐn,昑qǐn,笉qǐn,梫qǐn,赾qǐn,寑qǐn,锓qǐn,寝qǐn,寢qǐn,螼qǐn,儭qìn,櫬qìn,吢qìn,吣qìn,抋qìn,沁qìn,唚qìn,菣qìn,搇qìn,撳qìn,瀙qìn,藽qìn,鈊qìn,揿qìn,鶄qīng,青qīng,氢qīng,轻qīng,倾qīng,卿qīng,郬qīng,圊qīng,埥qīng,氫qīng,淸qīng,清qīng,軽qīng,傾qīng,廎qīng,蜻qīng,輕qīng,鲭qīng,鯖qīng,鑋qīng,庼qīng,漀qīng,靘qīng,夝qíng,甠qíng,勍qíng,情qíng,硘qíng,晴qíng,棾qíng,氰qíng,暒qíng,樈qíng,擎qíng,檠qíng,黥qíng,殑qíng,苘qǐng,顷qǐng,请qǐng,頃qǐng,請qǐng,檾qǐng,謦qǐng,庆qìng,摐chuāng,牀chuáng,磢chuǎng,刱chuàng,吹chuī,糚zhuāng,庒zhuāng,漴zhuàng,丬zhuàng,壮zhuàng,凊qìng,掅qìng,碃qìng,箐qìng,慶qìng,磬qìng,罄qìng,櫦qìng,濪qìng,藭qiong,跫qióng,銎qióng,卭qióng,邛qióng,穷qióng,穹qióng,茕qióng,桏qióng,笻qióng,筇qióng,赹qióng,惸qióng,焪qióng,焭qióng,琼qióng,蛩qióng,蛬qióng,煢qióng,熍qióng,睘qióng,窮qióng,儝qióng,憌qióng,橩qióng,瓊qióng,竆qióng,嬛qióng,琁qióng,藑qióng,湫qiū,丘qiū,丠qiū,邱qiū,坵qiū,恘qiū,秋qiū,秌qiū,寈qiū,蚯qiū,媝qiū,楸qiū,鹙qiū,篍qiū,緧qiū,蝵qiū,穐qiū,趥qiū,鳅qiū,蟗qiū,鞦qiū,鞧qiū,蘒qiū,鰌qiū,鰍qiū,鱃qiū,龝qiū,逎qiū,櫹qiū,鶖qiū,叴qiú,囚qiú,扏qiú,犰qiú,玌qiú,肍qiú,求qiú,虬qiú,泅qiú,虯qiú,俅qiú,觓qiú,訅qiú,酋qiú,唒qiú,浗qiú,紌qiú,莍qiú,逑qiú,釚qiú,梂qiú,殏qiú,毬qiú,球qiú,釻qiú,崷qiú,巯qiú,湭qiú,皳qiú,盚qiú,遒qiú,煪qiú,絿qiú,蛷qiú,裘qiú,巰qiú,觩qiú,賕qiú,璆qiú,銶qiú,醔qiú,鮂qiú,鼽qiú,鯄qiú,鵭qiú,蠤qiú,鰽qiú,厹qiú,赇qiú,搝qiǔ,糗qiǔ,趍qū,匚qū,区qū,伹qū,匤qū,岖qū,诎qū,阹qū,驱qū,屈qū,岨qū,岴qū,抾qū,浀qū,祛qū,胠qū,袪qū,區qū,蛆qū,躯qū,筁qū,粬qū,蛐qū,詘qū,趋qū,嶇qū,駆qū,憈qū,駈qū,麹qū,髷qū,趨qū,麯qū,軀qū,麴qū,黢qū,驅qū,鰸qū,鱋qū,紶qū,厺qū,佉qū,跼qú,瞿qú,佢qú,劬qú,斪qú,朐qú,胊qú,菃qú,衐qú,鸲qú,淭qú,渠qú,絇qú,葋qú,蕖qú,璖qú,磲qú,璩qú,鼩qú,蘧qú,灈qú,戵qú,欋qú,氍qú,臞qú,癯qú,蠷qú,衢qú,躣qú,蠼qú,鑺qú,臒qú,蟝qú,曲qǔ,取qǔ,娶qǔ,詓qǔ,竬qǔ,龋qǔ,齲qǔ,去qù,刞qù,耝qù,阒qù,觑qù,趣qù,閴qù,麮qù,闃qù,覰qù,覷qù,鼁qù,覻qù,迲qù,峑quān,恮quān,悛quān,圈quān,駩quān,騡quān,鐉quān,腃quān,全quán,权quán,佺quán,诠quán,姾quán,泉quán,洤quán,荃quán,拳quán,辁quán,婘quán,痊quán,硂quán,铨quán,湶quán,犈quán,筌quán,絟quán,葲quán,搼quán,楾quán,瑔quán,觠quán,詮quán,跧quán,輇quán,蜷quán,銓quán,権quán,縓quán,醛quán,闎quán,鳈quán,鬈quán,巏quán,鰁quán,權quán,齤quán,颧quán,顴quán,灥quán,譔quán,牷quán,孉quán,犬quǎn,甽quǎn,畎quǎn,烇quǎn,绻quǎn,綣quǎn,虇quǎn,劝quàn,券quàn,巻quàn,牶quàn,椦quàn,勧quàn,勸quàn,炔quē,缺quē,蒛quē,瘸qué,却què,卻què,崅què,悫què,雀què,确què,阕què,皵què,碏què,阙què,鹊què,愨què,榷què,慤què,確què,燩què,闋què,闕què,鵲què,礭què,殻què,埆què,踆qūn,夋qūn,囷qūn,峮qūn,逡qūn,帬qún,裙qún,羣qún,群qún,裠qún,亽ra,罖ra,囕ram,呥rán,肰rán,衻rán,袇rán,蚦rán,袡rán,蚺rán,然rán,髥rán,嘫rán,髯rán,燃rán,繎rán,冄rán,冉rǎn,姌rǎn,苒rǎn,染rǎn,珃rǎn,媣rǎn,蒅rǎn,孃ráng,穣ráng,獽ráng,禳ráng,瓤ráng,穰ráng,躟ráng,壌rǎng,嚷rǎng,壤rǎng,攘rǎng,爙rǎng,让ràng,懹ràng,譲ràng,讓ràng,荛ráo,饶ráo,桡ráo,橈ráo,襓ráo,饒ráo,犪ráo,嬈ráo,娆ráo,扰rǎo,隢rǎo,擾rǎo,遶rǎo,绕rào,繞rào,惹rě,热rè,熱rè,渃rè,綛ren,人rén,仁rén,壬rén,忈rén,朲rén,忎rén,秂rén,芢rén,鈓rén,魜rén,銋rén,鵀rén,姙rén,忍rěn,荏rěn,栠rěn,栣rěn,荵rěn,秹rěn,稔rěn,躵rěn,刃rèn,刄rèn,认rèn,仞rèn,仭rèn,讱rèn,任rèn,屻rèn,扨rèn,纫rèn,妊rèn,牣rèn,纴rèn,肕rèn,轫rèn,韧rèn,饪rèn,紉rèn,衽rèn,紝rèn,訒rèn,軔rèn,梕rèn,袵rèn,絍rèn,靭rèn,靱rèn,韌rèn,飪rèn,認rèn,餁rèn,扔rēng,仍réng,辸réng,礽réng,芿réng,日rì,驲rì,囸rì,釰rì,鈤rì,馹rì,戎róng,肜róng,栄róng,狨róng,绒róng,茙róng,茸róng,荣róng,容róng,峵róng,毧róng,烿róng,嵘róng,絨róng,羢róng,嫆róng,搈róng,摉róng,榵róng,溶róng,蓉róng,榕róng,榮róng,熔róng,瑢róng,穁róng,蝾róng,褣róng,镕róng,氄róng,縙róng,融róng,螎róng,駥róng,嬫róng,嶸róng,爃róng,鎔róng,瀜róng,蠑róng,媶róng,曧róng,冗rǒng,宂rǒng,傇rǒng,穃ròng,禸róu,柔róu,粈róu,媃róu,揉róu,渘róu,葇róu,瑈róu,腬róu,糅róu,蹂róu,輮róu,鍒róu,鞣róu,瓇róu,騥róu,鰇róu,鶔róu,楺rǒu,煣rǒu,韖rǒu,肉ròu,宍ròu,嶿rū,如rú,侞rú,帤rú,茹rú,桇rú,袽rú,铷rú,渪rú,筎rú,銣rú,蕠rú,儒rú,鴑rú,嚅rú,孺rú,濡rú,薷rú,鴽rú,曘rú,燸rú,襦rú,蠕rú,颥rú,醹rú,顬rú,偄rú,鱬rú,汝rǔ,肗rǔ,乳rǔ,辱rǔ,鄏rǔ,擩rǔ,入rù,扖rù,込rù,杁rù,洳rù,嗕rù,媷rù,溽rù,缛rù,蓐rù,鳰rù,褥rù,縟rù,壖ruán,阮ruǎn,朊ruǎn,软ruǎn,軟ruǎn,碝ruǎn,緛ruǎn,蝡ruǎn,瓀ruǎn,礝ruǎn,瑌ruǎn,撋ruí,桵ruí,甤ruí,緌ruí,蕤ruí,蕊ruǐ,橤ruǐ,繠ruǐ,蘂ruǐ,蘃ruǐ,惢ruǐ,芮ruì,枘ruì,蚋ruì,锐ruì,瑞ruì,睿ruì,銳ruì,叡ruì,壡ruì,润rùn,閏rùn,閠rùn,潤rùn,橍rùn,闰rùn,叒ruò,若ruò,偌ruò,弱ruò,鄀ruò,焫ruò,楉ruò,嵶ruò,蒻ruò,箬ruò,爇ruò,鰙ruò,鰯ruò,鶸ruò,仨sā,桬sā,撒sā,洒sǎ,訯sǎ,靸sǎ,灑sǎ,卅sà,飒sà,脎sà,萨sà,隡sà,馺sà,颯sà,薩sà,櫒sà,栍saeng,毢sāi,塞sāi,毸sāi,腮sāi,嘥sāi,噻sāi,鳃sāi,顋sāi,鰓sāi,嗮sǎi,赛sài,僿sài,賽sài,簺sài,虄sal,厁san,壭san,三sān,弎sān,叁sān,毵sān,毶sān,毿sān,犙sān,鬖sān,糂sān,糝sān,糣sān,彡sān,氵sān,伞sǎn,傘sǎn,馓sǎn,橵sǎn,糤sǎn,繖sǎn,饊sǎn,散sàn,俕sàn,閐sàn,潵sàn,桒sāng,桑sāng,槡sāng,嗓sǎng,搡sǎng,褬sǎng,颡sǎng,鎟sǎng,顙sǎng,磉sǎng,丧sàng,喪sàng,掻sāo,搔sāo,溞sāo,骚sāo,缫sāo,繅sāo,鳋sāo,颾sāo,騒sāo,騷sāo,鰠sāo,鱢sāo,扫sǎo,掃sǎo,嫂sǎo,臊sào,埽sào,瘙sào,氉sào,矂sào,髞sào,色sè,涩sè,啬sè,渋sè,铯sè,歮sè,嗇sè,瑟sè,歰sè,銫sè,澁sè,懎sè,擌sè,濇sè,濏sè,瘷sè,穑sè,澀sè,璱sè,瀒sè,穡sè,繬sè,穯sè,轖sè,鏼sè,譅sè,飋sè,愬sè,鎍sè,溹sè,栜sè,裇sed,聓sei,森sēn,僧sēng,鬙sēng,閪seo,縇seon,杀shā,沙shā,纱shā,乷shā,刹shā,砂shā,唦shā,挱shā,殺shā,猀shā,紗shā,莎shā,铩shā,痧shā,硰shā,蔱shā,裟shā,樧shā,魦shā,鲨shā,閷shā,鯊shā,鯋shā,繺shā,賖shā,啥shá,傻shǎ,儍shǎ,繌shǎ,倽shà,唼shà,萐shà,歃shà,煞shà,翜shà,翣shà,閯shà,霎shà,厦shà,廈shà,筛shāi,篩shāi,簁shāi,簛shāi,酾shāi,釃shāi,摋shǎi,晒shài,曬shài,纔shān,穇shān,凵shān,襂shān,山shān,邖shān,圸shān,删shān,杉shān,杣shān,芟shān,姍shān,姗shān,衫shān,钐shān,埏shān,狦shān,珊shān,舢shān,痁shān,軕shān,笘shān,釤shān,閊shān,跚shān,剼shān,搧shān,嘇shān,幓shān,煽shān,潸shān,澘shān,曑shān,檆shān,膻shān,鯅shān,羴shān,羶shān,炶shān,苫shān,柵shān,栅shān,刪shān,闪shǎn,陕shǎn,陝shǎn,閃shǎn,晱shǎn,睒shǎn,熌shǎn,覢shǎn,曏shǎn,笧shàn,讪shàn,汕shàn,疝shàn,扇shàn,訕shàn,赸shàn,傓shàn,善shàn,椫shàn,銏shàn,骟shàn,僐shàn,鄯shàn,缮shàn,嬗shàn,擅shàn,敾shàn,樿shàn,膳shàn,磰shàn,謆shàn,赡shàn,繕shàn,蟮shàn,譱shàn,贍shàn,鐥shàn,饍shàn,騸shàn,鳝shàn,灗shàn,鱔shàn,鱣shàn,墡shàn,裳shang,塲shāng,伤shāng,殇shāng,商shāng,觞shāng,傷shāng,墒shāng,慯shāng,滳shāng,蔏shāng,殤shāng,熵shāng,螪shāng,觴shāng,謪shāng,鬺shāng,坰shǎng,垧shǎng,晌shǎng,赏shǎng,賞shǎng,鑜shǎng,丄shàng,上shàng,仩shàng,尚shàng,恦shàng,绱shàng,緔shàng,弰shāo,捎shāo,梢shāo,烧shāo,焼shāo,稍shāo,筲shāo,艄shāo,蛸shāo,輎shāo,蕱shāo,燒shāo,髾shāo,鮹shāo,娋shāo,旓shāo,杓sháo,勺sháo,芍sháo,柖sháo,玿sháo,韶sháo,少shǎo,劭shào,卲shào,邵shào,绍shào,哨shào,袑shào,紹shào,潲shào,奢shē,猞shē,赊shē,輋shē,賒shē,檨shē,畲shē,舌shé,佘shé,蛇shé,蛥shé,磼shé,折shé,舍shě,捨shě,厍shè,设shè,社shè,舎shè,厙shè,射shè,涉shè,涻shè,設shè,赦shè,弽shè,慑shè,摄shè,滠shè,慴shè,摵shè,蔎shè,韘shè,騇shè,懾shè,攝shè,麝shè,欇shè,挕shè,蠂shè,堔shen,叄shēn,糁shēn,申shēn,屾shēn,扟shēn,伸shēn,身shēn,侁shēn,呻shēn,妽shēn,籶shēn,绅shēn,诜shēn,柛shēn,氠shēn,珅shēn,穼shēn,籸shēn,娠shēn,峷shēn,甡shēn,眒shēn,砷shēn,深shēn,紳shēn,兟shēn,椮shēn,葠shēn,裑shēn,訷shēn,罧shēn,蓡shēn,詵shēn,甧shēn,蔘shēn,燊shēn,薓shēn,駪shēn,鲹shēn,鯓shēn,鵢shēn,鯵shēn,鰺shēn,莘shēn,叅shēn,神shén,榊shén,鰰shén,棯shěn,槮shěn,邥shěn,弞shěn,沈shěn,审shěn,矤shěn,矧shěn,谂shěn,谉shěn,婶shěn,渖shěn,訠shěn,審shěn,頣shěn,魫shěn,曋shěn,瞫shěn,嬸shěn,覾shěn,讅shěn,哂shěn,肾shèn,侺shèn,昚shèn,甚shèn,胂shèn,眘shèn,渗shèn,祳shèn,脤shèn,腎shèn,愼shèn,慎shèn,瘆shèn,蜃shèn,滲shèn,鋠shèn,瘮shèn,葚shèn,升shēng,生shēng,阩shēng,呏shēng,声shēng,斘shēng,昇shēng,枡shēng,泩shēng,苼shēng,殅shēng,牲shēng,珄shēng,竔shēng,陞shēng,曻shēng,陹shēng,笙shēng,湦shēng,焺shēng,甥shēng,鉎shēng,聲shēng,鍟shēng,鵿shēng,鼪shēng,绳shéng,縄shéng,憴shéng,繩shéng,譝shéng,省shěng,眚shěng,偗shěng,渻shěng,胜shèng,圣shèng,晟shèng,晠shèng,剰shèng,盛shèng,剩shèng,勝shèng,貹shèng,嵊shèng,聖shèng,墭shèng,榺shèng,蕂shèng,橳shèng,賸shèng,鳾shi,觢shi,尸shī,师shī,呞shī,虱shī,诗shī,邿shī,鸤shī,屍shī,施shī,浉shī,狮shī,師shī,絁shī,湤shī,湿shī,葹shī,溮shī,溼shī,獅shī,蒒shī,蓍shī,詩shī,瑡shī,鳲shī,蝨shī,鲺shī,濕shī,鍦shī,鯴shī,鰤shī,鶳shī,襹shī,籭shī,魳shī,失shī,褷shī,匙shí,十shí,什shí,石shí,辻shí,佦shí,时shí,竍shí,识shí,实shí,実shí,旹shí,飠shí,峕shí,拾shí,炻shí,祏shí,蚀shí,食shí,埘shí,寔shí,湜shí,遈shí,塒shí,嵵shí,溡shí,鉐shí,實shí,榯shí,蝕shí,鉽shí,篒shí,鲥shí,鮖shí,鼫shí,識shí,鼭shí,鰣shí,時shí,史shǐ,矢shǐ,乨shǐ,豕shǐ,使shǐ,始shǐ,驶shǐ,兘shǐ,屎shǐ,榁shǐ,鉂shǐ,駛shǐ,笶shǐ,饣shì,莳shì,蒔shì,士shì,氏shì,礻shì,世shì,丗shì,仕shì,市shì,示shì,卋shì,式shì,事shì,侍shì,势shì,呩shì,视shì,试shì,饰shì,冟shì,室shì,恀shì,恃shì,拭shì,枾shì,柿shì,眂shì,贳shì,适shì,栻shì,烒shì,眎shì,眡shì,舐shì,轼shì,逝shì,铈shì,視shì,釈shì,弑shì,揓shì,谥shì,貰shì,释shì,勢shì,嗜shì,弒shì,煶shì,睗shì,筮shì,試shì,軾shì,鈰shì,鉃shì,飾shì,舓shì,誓shì,適shì,奭shì,噬shì,嬕shì,澨shì,諡shì,遾shì,螫shì,簭shì,籂shì,襫shì,釋shì,鰘shì,佀shì,鎩shì,是shì,収shōu,收shōu,手shǒu,守shǒu,垨shǒu,首shǒu,艏shǒu,醻shòu,寿shòu,受shòu,狩shòu,兽shòu,售shòu,授shòu,绶shòu,痩shòu,膄shòu,壽shòu,瘦shòu,綬shòu,夀shòu,獣shòu,獸shòu,鏉shòu,书shū,殳shū,抒shū,纾shū,叔shū,枢shū,姝shū,柕shū,倏shū,倐shū,書shū,殊shū,紓shū,掓shū,梳shū,淑shū,焂shū,菽shū,軗shū,鄃shū,疎shū,疏shū,舒shū,摅shū,毹shū,毺shū,綀shū,输shū,踈shū,樞shū,蔬shū,輸shū,鮛shū,瀭shū,鵨shū,陎shū,尗shú,秫shú,婌shú,孰shú,赎shú,塾shú,熟shú,璹shú,贖shú,暑shǔ,黍shǔ,署shǔ,鼠shǔ,鼡shǔ,蜀shǔ,潻shǔ,薯shǔ,曙shǔ,癙shǔ,糬shǔ,籔shǔ,蠴shǔ,鱰shǔ,属shǔ,屬shǔ,鱪shǔ,丨shù,术shù,戍shù,束shù,沭shù,述shù,怷shù,树shù,竖shù,荗shù,恕shù,庶shù,庻shù,絉shù,蒁shù,術shù,裋shù,数shù,竪shù,腧shù,墅shù,漱shù,潄shù,數shù,豎shù,樹shù,濖shù,錰shù,鏣shù,鶐shù,虪shù,捒shù,忄shù,澍shù,刷shuā,唰shuā,耍shuǎ,誜shuà,缞shuāi,縗shuāi,衰shuāi,摔shuāi,甩shuǎi,帅shuài,帥shuài,蟀shuài,闩shuān,拴shuān,閂shuān,栓shuān,涮shuàn,腨shuàn,双shuāng,脽shuí,誰shuí,水shuǐ,氺shuǐ,閖shuǐ,帨shuì,涗shuì,涚shuì,稅shuì,税shuì,裞shuì,説shuì,睡shuì,吮shǔn,顺shùn,舜shùn,順shùn,蕣shùn,橓shùn,瞚shùn,瞤shùn,瞬shùn,鬊shùn,说shuō,說shuō,妁shuò,烁shuò,朔shuò,铄shuò,欶shuò,硕shuò,矟shuò,搠shuò,蒴shuò,槊shuò,碩shuò,爍shuò,鑠shuò,洬shuò,燿shuò,鎙shuò,愢sī,厶sī,丝sī,司sī,糹sī,私sī,咝sī,泀sī,俬sī,思sī,恖sī,鸶sī,媤sī,斯sī,絲sī,缌sī,蛳sī,楒sī,禗sī,鉰sī,飔sī,凘sī,厮sī,榹sī,禠sī,罳sī,锶sī,嘶sī,噝sī,廝sī,撕sī,澌sī,緦sī,蕬sī,螄sī,鍶sī,蟖sī,蟴sī,颸sī,騦sī,鐁sī,鷥sī,鼶sī,鷉sī,銯sī,死sǐ,灬sì,巳sì,亖sì,四sì,罒sì,寺sì,汜sì,伺sì,似sì,姒sì,泤sì,祀sì,価sì,孠sì,泗sì,饲sì,驷sì,俟sì,娰sì,柶sì,牭sì,洍sì,涘sì,肂sì,飤sì,笥sì,耜sì,釲sì,竢sì,覗sì,嗣sì,肆sì,貄sì,鈻sì,飼sì,禩sì,駟sì,儩sì,瀃sì,兕sì,蕼sì,螦so,乺sol,忪sōng,松sōng,枀sōng,枩sōng,娀sōng,柗sōng,倯sōng,凇sōng,梥sōng,崧sōng,庺sōng,淞sōng,菘sōng,嵩sōng,硹sōng,蜙sōng,憽sōng,檧sōng,濍sōng,怂sǒng,悚sǒng,耸sǒng,竦sǒng,愯sǒng,嵷sǒng,慫sǒng,聳sǒng,駷sǒng,鬆sòng,讼sòng,宋sòng,诵sòng,送sòng,颂sòng,訟sòng,頌sòng,誦sòng,餸sòng,鎹sòng,凁sōu,捜sōu,鄋sōu,嗖sōu,廀sōu,廋sōu,搜sōu,溲sōu,獀sōu,蒐sōu,蓃sōu,馊sōu,飕sōu,摗sōu,锼sōu,螋sōu,醙sōu,鎪sōu,餿sōu,颼sōu,騪sōu,叜sōu,艘sōu,叟sǒu,傁sǒu,嗾sǒu,瞍sǒu,擞sǒu,薮sǒu,擻sǒu,藪sǒu,櫢sǒu,嗽sòu,瘶sòu,苏sū,甦sū,酥sū,稣sū,窣sū,穌sū,鯂sū,蘇sū,蘓sū,櫯sū,囌sū,卹sū,俗sú,玊sù,诉sù,泝sù,肃sù,涑sù,珟sù,素sù,速sù,殐sù,粛sù,骕sù,傃sù,粟sù,訴sù,谡sù,嗉sù,塐sù,塑sù,嫊sù,愫sù,溯sù,溸sù,肅sù,遡sù,鹔sù,僳sù,榡sù,蔌sù,觫sù,趚sù,遬sù,憟sù,樎sù,樕sù,潥sù,鋉sù,餗sù,縤sù,璛sù,簌sù,藗sù,謖sù,蹜sù,驌sù,鱐sù,鷫sù,埣sù,夙sù,膆sù,狻suān,痠suān,酸suān,匴suǎn,祘suàn,笇suàn,筭suàn,蒜suàn,算suàn,夊suī,芕suī,虽suī,倠suī,哸suī,荽suī,荾suī,眭suī,滖suī,睢suī,濉suī,鞖suī,雖suī,簑suī,绥suí,隋suí,随suí,遀suí,綏suí,隨suí,瓍suí,遂suí,瀡suǐ,髄suǐ,髓suǐ,亗suì,岁suì,砕suì,谇suì,歲suì,歳suì,煫suì,碎suì,隧suì,嬘suì,澻suì,穂suì,誶suì,賥suì,檖suì,燧suì,璲suì,禭suì,穗suì,穟suì,襚suì,邃suì,旞suì,繐suì,繸suì,鐆suì,鐩suì,祟suì,譢suì,孙sūn,狲sūn,荪sūn,孫sūn,飧sūn,搎sūn,猻sūn,蓀sūn,槂sūn,蕵sūn,薞sūn,畃sún,损sǔn,笋sǔn,隼sǔn,筍sǔn,損sǔn,榫sǔn,箰sǔn,鎨sǔn,巺sùn,潠sùn,嗍suō,唆suō,娑suō,莏suō,傞suō,桫suō,梭suō,睃suō,嗦suō,羧suō,蓑suō,摍suō,缩suō,趖suō,簔suō,縮suō,髿suō,鮻suō,挲suō,所suǒ,唢suǒ,索suǒ,琐suǒ,琑suǒ,锁suǒ,嗩suǒ,暛suǒ,溑suǒ,瑣suǒ,鎖suǒ,鎻suǒ,鏁suǒ,嵗suò,蜶suò,逤suò,侤ta,澾ta,她tā,他tā,它tā,祂tā,咜tā,趿tā,铊tā,塌tā,榙tā,溻tā,鉈tā,褟tā,遢tā,蹹tá,塔tǎ,墖tǎ,獭tǎ,鳎tǎ,獺tǎ,鰨tǎ,沓tà,挞tà,狧tà,闼tà,崉tà,涾tà,遝tà,阘tà,榻tà,毾tà,禢tà,撻tà,誻tà,踏tà,嚃tà,錔tà,嚺tà,濌tà,蹋tà,鞜tà,闒tà,鞳tà,闥tà,譶tà,躢tà,傝tà,襨tae,漦tāi,咍tāi,囼tāi,孡tāi,胎tāi,駘tāi,檯tāi,斄tái,台tái,邰tái,坮tái,苔tái,炱tái,炲tái,菭tái,跆tái,鲐tái,箈tái,臺tái,颱tái,儓tái,鮐tái,嬯tái,擡tái,薹tái,籉tái,抬tái,呔tǎi,忕tài,太tài,冭tài,夳tài,忲tài,汰tài,态tài,肽tài,钛tài,泰tài,粏tài,舦tài,酞tài,鈦tài,溙tài,燤tài,態tài,坍tān,贪tān,怹tān,啴tān,痑tān,舑tān,貪tān,摊tān,滩tān,嘽tān,潬tān,瘫tān,擹tān,攤tān,灘tān,癱tān,镡tán,蕁tán,坛tán,昙tán,谈tán,郯tán,婒tán,覃tán,榃tán,痰tán,锬tán,谭tán,墵tán,憛tán,潭tán,談tán,壇tán,曇tán,錟tán,檀tán,顃tán,罈tán,藫tán,壜tán,譚tán,貚tán,醰tán,譠tán,罎tán,鷤tán,埮tán,鐔tán,墰tán,忐tǎn,坦tǎn,袒tǎn,钽tǎn,菼tǎn,毯tǎn,鉭tǎn,嗿tǎn,憳tǎn,憻tǎn,醓tǎn,璮tǎn,襢tǎn,緂tǎn,暺tǎn,叹tàn,炭tàn,探tàn,湠tàn,僋tàn,嘆tàn,碳tàn,舕tàn,歎tàn,汤tāng,铴tāng,湯tāng,嘡tāng,劏tāng,羰tāng,蝪tāng,薚tāng,蹚tāng,鐋tāng,鞺tāng,闛tāng,耥tāng,鼞tāng,镗táng,鏜táng,饧táng,坣táng,唐táng,堂táng,傏táng,啺táng,棠táng,鄌táng,塘táng,搪táng,溏táng,蓎táng,隚táng,榶táng,漟táng,煻táng,瑭táng,禟táng,膅táng,樘táng,磄táng,糃táng,膛táng,橖táng,篖táng,糖táng,螗táng,踼táng,糛táng,赯táng,醣táng,餳táng,鎕táng,餹táng,饄táng,鶶táng,螳táng,攩tǎng,伖tǎng,帑tǎng,倘tǎng,淌tǎng,傥tǎng,躺tǎng,镋tǎng,鎲tǎng,儻tǎng,戃tǎng,曭tǎng,爣tǎng,矘tǎng,钂tǎng,烫tàng,摥tàng,趟tàng,燙tàng,漡tàng,焘tāo,轁tāo,涭tāo,仐tāo,弢tāo,绦tāo,掏tāo,絛tāo,詜tāo,嫍tāo,幍tāo,慆tāo,搯tāo,滔tāo,槄tāo,瑫tāo,韬tāo,飸tāo,縚tāo,縧tāo,濤tāo,謟tāo,鞱tāo,韜tāo,饕tāo,饀tāo,燾tāo,涛tāo,迯táo,咷táo,洮táo,逃táo,桃táo,陶táo,啕táo,梼táo,淘táo,萄táo,祹táo,裪táo,綯táo,蜪táo,鞀táo,醄táo,鞉táo,鋾táo,駣táo,檮táo,騊táo,鼗táo,绹táo,讨tǎo,討tǎo,套tào,畓tap,忑tè,特tè,貣tè,脦tè,犆tè,铽tè,慝tè,鋱tè,蟘tè,螣tè,鰧teng,膯tēng,鼟tēng,疼téng,痋téng,幐téng,腾téng,誊téng,漛téng,滕téng,邆téng,縢téng,駦téng,謄téng,儯téng,藤téng,騰téng,籐téng,籘téng,虅téng,驣téng,霯tèng,唞teo,朰teul,剔tī,梯tī,锑tī,踢tī,銻tī,鷈tī,鵜tī,躰tī,骵tī,軆tī,擿tī,姼tí,褆tí,扌tí,虒tí,磃tí,绨tí,偍tí,啼tí,媞tí,崹tí,惿tí,提tí,稊tí,缇tí,罤tí,遆tí,鹈tí,嗁tí,瑅tí,綈tí,徲tí,漽tí,緹tí,蕛tí,蝭tí,题tí,趧tí,蹄tí,醍tí,謕tí,鍗tí,題tí,鮷tí,騠tí,鯷tí,鶗tí,鶙tí,穉tí,厗tí,鳀tí,徥tǐ,体tǐ,挮tǐ,體tǐ,衹tǐ,戻tì,屉tì,剃tì,洟tì,倜tì,悌tì,涕tì,逖tì,屜tì,悐tì,惕tì,掦tì,逷tì,惖tì,替tì,裼tì,褅tì,歒tì,殢tì,髰tì,薙tì,嚏tì,鬀tì,嚔tì,瓋tì,籊tì,鐟tì,楴tì,天tiān,兲tiān,婖tiān,添tiān,酟tiān,靔tiān,黇tiān,靝tiān,呑tiān,瞋tián,田tián,屇tián,沺tián,恬tián,畋tián,畑tián,盷tián,胋tián,甛tián,甜tián,菾tián,湉tián,塡tián,填tián,搷tián,阗tián,碵tián,磌tián,窴tián,鴫tián,璳tián,闐tián,鷆tián,鷏tián,餂tián,寘tián,畠tián,鍩tiǎn,忝tiǎn,殄tiǎn,倎tiǎn,唺tiǎn,悿tiǎn,捵tiǎn,淟tiǎn,晪tiǎn,琠tiǎn,腆tiǎn,觍tiǎn,睓tiǎn,覥tiǎn,賟tiǎn,錪tiǎn,娗tiǎn,铦tiǎn,銛tiǎn,紾tiǎn,舔tiǎn,掭tiàn,瑱tiàn,睼tiàn,舚tiàn,旫tiāo,佻tiāo,庣tiāo,挑tiāo,祧tiāo,聎tiāo,苕tiáo,萔tiáo,芀tiáo,条tiáo,岧tiáo,岹tiáo,迢tiáo,祒tiáo,條tiáo,笤tiáo,蓚tiáo,蓨tiáo,龆tiáo,樤tiáo,蜩tiáo,鋚tiáo,髫tiáo,鲦tiáo,螩tiáo,鯈tiáo,鎥tiáo,齠tiáo,鰷tiáo,趒tiáo,銚tiáo,儵tiáo,鞗tiáo,宨tiǎo,晀tiǎo,朓tiǎo,脁tiǎo,窕tiǎo,窱tiǎo,眺tiào,粜tiào,覜tiào,跳tiào,頫tiào,糶tiào,怗tiē,贴tiē,萜tiē,聑tiē,貼tiē,帖tiē,蛈tiě,僣tiě,鴩tiě,鐵tiě,驖tiě,铁tiě,呫tiè,飻tiè,餮tiè,厅tīng,庁tīng,汀tīng,听tīng,耓tīng,厛tīng,烃tīng,烴tīng,綎tīng,鞓tīng,聴tīng,聼tīng,廰tīng,聽tīng,渟tīng,廳tīng,邒tíng,廷tíng,亭tíng,庭tíng,莛tíng,停tíng,婷tíng,嵉tíng,筳tíng,葶tíng,蜓tíng,楟tíng,榳tíng,閮tíng,霆tíng,聤tíng,蝏tíng,諪tíng,鼮tíng,珵tǐng,侱tǐng,圢tǐng,侹tǐng,挺tǐng,涏tǐng,梃tǐng,烶tǐng,珽tǐng,脡tǐng,颋tǐng,誔tǐng,頲tǐng,艇tǐng,乭tol,囲tōng,炵tōng,通tōng,痌tōng,嗵tōng,蓪tōng,樋tōng,熥tōng,爞tóng,冂tóng,燑tóng,仝tóng,同tóng,佟tóng,彤tóng,峂tóng,庝tóng,哃tóng,狪tóng,茼tóng,晍tóng,桐tóng,浵tóng,砼tóng,蚒tóng,秱tóng,铜tóng,童tóng,粡tóng,赨tóng,酮tóng,鉖tóng,僮tóng,鉵tóng,銅tóng,餇tóng,鲖tóng,潼tóng,獞tóng,曈tóng,朣tóng,橦tóng,氃tóng,犝tóng,膧tóng,瞳tóng,穜tóng,鮦tóng,眮tóng,统tǒng,捅tǒng,桶tǒng,筒tǒng,綂tǒng,統tǒng,恸tòng,痛tòng,慟tòng,憅tòng,偷tōu,偸tōu,鍮tōu,头tóu,投tóu,骰tóu,緰tóu,頭tóu,钭tǒu,妵tǒu,紏tǒu,敨tǒu,斢tǒu,黈tǒu,蘣tǒu,埱tòu,透tòu,綉tòu,宊tū,瑹tū,凸tū,禿tū,秃tū,突tū,涋tū,捸tū,堗tū,湥tū,痜tū,葖tū,嶀tū,鋵tū,鵚tū,鼵tū,唋tū,図tú,图tú,凃tú,峹tú,庩tú,徒tú,捈tú,涂tú,荼tú,途tú,屠tú,梌tú,揬tú,稌tú,塗tú,嵞tú,瘏tú,筡tú,鈯tú,圖tú,圗tú,廜tú,潳tú,酴tú,馟tú,鍎tú,駼tú,鵌tú,鶟tú,鷋tú,鷵tú,兎tú,菟tú,蒤tú,土tǔ,圡tǔ,吐tǔ,汢tǔ,钍tǔ,釷tǔ,迌tù,兔tù,莵tù,堍tù,鵵tù,湍tuān,猯tuān,煓tuān,蓴tuán,团tuán,団tuán,抟tuán,剸tuán,團tuán,塼tuán,慱tuán,摶tuán,槫tuán,漙tuán,篿tuán,檲tuán,鏄tuán,糰tuán,鷒tuán,鷻tuán,嫥tuán,鱄tuán,圕tuǎn,疃tuǎn,畽tuǎn,彖tuàn,湪tuàn,褖tuàn,貒tuàn,忒tuī,推tuī,蓷tuī,藬tuī,焞tuī,騩tuí,墤tuí,颓tuí,隤tuí,尵tuí,頹tuí,頺tuí,魋tuí,穨tuí,蘈tuí,蹪tuí,僓tuí,頽tuí,俀tuǐ,脮tuǐ,腿tuǐ,蹆tuǐ,骽tuǐ,退tuì,娧tuì,煺tuì,蛻tuì,蜕tuì,褪tuì,駾tuì,噋tūn,汭tūn,吞tūn,旽tūn,啍tūn,朜tūn,暾tūn,黗tūn,屯tún,忳tún,芚tún,饨tún,豚tún,軘tún,飩tún,鲀tún,魨tún,霕tún,臀tún,臋tún,坉tún,豘tún,氽tǔn,舃tuō,乇tuō,讬tuō,托tuō,汑tuō,饦tuō,杔tuō,侂tuō,咃tuō,拕tuō,拖tuō,侻tuō,挩tuō,捝tuō,莌tuō,袥tuō,託tuō,涶tuō,脱tuō,飥tuō,馲tuō,魠tuō,驝tuō,棁tuō,脫tuō,鱓tuó,鋖tuó,牠tuó,驮tuó,佗tuó,陀tuó,陁tuó,坨tuó,岮tuó,沱tuó,驼tuó,柁tuó,砣tuó,砤tuó,袉tuó,鸵tuó,紽tuó,堶tuó,跎tuó,酡tuó,碢tuó,馱tuó,槖tuó,踻tuó,駞tuó,橐tuó,鮀tuó,鴕tuó,鼧tuó,騨tuó,鼍tuó,驒tuó,鼉tuó,迆tuó,駝tuó,軃tuǒ,妥tuǒ,毤tuǒ,庹tuǒ,椭tuǒ,楕tuǒ,鵎tuǒ,拓tuò,柝tuò,唾tuò,萚tuò,跅tuò,毻tuò,箨tuò,蘀tuò,籜tuò,哇wa,窐wā,劸wā,徍wā,挖wā,洼wā,娲wā,畖wā,窊wā,媧wā,嗗wā,蛙wā,搲wā,溛wā,漥wā,窪wā,鼃wā,攨wā,屲wā,姽wá,譁wá,娃wá,瓦wǎ,佤wǎ,邷wǎ,咓wǎ,瓲wǎ,砙wǎ,韎wà,帓wà,靺wà,袜wà,聉wà,嗢wà,腽wà,膃wà,韈wà,韤wà,襪wà,咼wāi,瀤wāi,歪wāi,喎wāi,竵wāi,崴wǎi,外wài,顡wài,関wān,闗wān,夘wān,乛wān,弯wān,剜wān,婠wān,帵wān,塆wān,湾wān,睕wān,蜿wān,潫wān,豌wān,彎wān,壪wān,灣wān,埦wān,捥wān,丸wán,刓wán,汍wán,纨wán,芄wán,完wán,岏wán,忨wán,玩wán,笂wán,紈wán,捖wán,顽wán,烷wán,琓wán,貦wán,頑wán,蚖wán,抏wán,邜wǎn,宛wǎn,倇wǎn,唍wǎn,挽wǎn,晚wǎn,盌wǎn,莞wǎn,婉wǎn,惋wǎn,晩wǎn,梚wǎn,绾wǎn,脘wǎn,菀wǎn,晼wǎn,椀wǎn,琬wǎn,皖wǎn,碗wǎn,綩wǎn,綰wǎn,輓wǎn,鋔wǎn,鍐wǎn,莬wǎn,惌wǎn,魭wǎn,夗wǎn,畹wǎn,輐wàn,鄤wàn,孯wàn,掔wàn,万wàn,卍wàn,卐wàn,妧wàn,杤wàn,腕wàn,萬wàn,翫wàn,鋄wàn,薍wàn,錽wàn,贃wàn,鎫wàn,贎wàn,脕wàn,尩wāng,尪wāng,尫wāng,汪wāng,瀇wāng,亡wáng,仼wáng,彺wáng,莣wáng,蚟wáng,王wáng,抂wǎng,网wǎng,忹wǎng,往wǎng,徃wǎng,枉wǎng,罔wǎng,惘wǎng,菵wǎng,暀wǎng,棢wǎng,焹wǎng,蛧wǎng,辋wǎng,網wǎng,蝄wǎng,誷wǎng,輞wǎng,魍wǎng,迬wǎng,琞wàng,妄wàng,忘wàng,迋wàng,旺wàng,盳wàng,望wàng,朢wàng,威wēi,烓wēi,偎wēi,逶wēi,隇wēi,隈wēi,喴wēi,媁wēi,媙wēi,愄wēi,揋wēi,揻wēi,渨wēi,煀wēi,葨wēi,葳wēi,微wēi,椳wēi,楲wēi,溦wēi,煨wēi,詴wēi,縅wēi,蝛wēi,覣wēi,嶶wēi,薇wēi,燰wēi,鳂wēi,癐wēi,鰃wēi,鰄wēi,嵔wēi,蜲wēi,危wēi,巍wēi,恑wéi,撝wéi,囗wéi,为wéi,韦wéi,围wéi,帏wéi,沩wéi,违wéi,闱wéi,峗wéi,峞wéi,洈wéi,為wéi,韋wéi,桅wéi,涠wéi,唯wéi,帷wéi,惟wéi,维wéi,喡wéi,圍wéi,嵬wéi,幃wéi,湋wéi,溈wéi,琟wéi,潍wéi,維wéi,蓶wéi,鄬wéi,潿wéi,醀wéi,濰wéi,鍏wéi,闈wéi,鮠wéi,癓wéi,覹wéi,犩wéi,霺wéi,僞wéi,寪wéi,觹wéi,觽wéi,觿wéi,欈wéi,違wéi,趡wěi,磈wěi,瓗wěi,膸wěi,撱wěi,鰖wěi,伟wěi,伪wěi,尾wěi,纬wěi,芛wěi,苇wěi,委wěi,炜wěi,玮wěi,洧wěi,娓wěi,捤wěi,浘wěi,诿wěi,偉wěi,偽wěi,崣wěi,梶wěi,硊wěi,萎wěi,隗wěi,骩wěi,廆wěi,徫wěi,愇wěi,猥wěi,葦wěi,蒍wěi,骪wěi,骫wěi,暐wěi,椲wěi,煒wěi,瑋wěi,痿wěi,腲wěi,艉wěi,韪wěi,碨wěi,鲔wěi,緯wěi,蔿wěi,諉wěi,踓wěi,韑wěi,頠wěi,薳wěi,儰wěi,濻wěi,鍡wěi,鮪wěi,壝wěi,韙wěi,颹wěi,瀢wěi,韡wěi,亹wěi,斖wěi,茟wěi,蜹wèi,爲wèi,卫wèi,未wèi,位wèi,味wèi,苿wèi,畏wèi,胃wèi,叞wèi,軎wèi,尉wèi,菋wèi,谓wèi,喂wèi,媦wèi,渭wèi,猬wèi,煟wèi,墛wèi,蔚wèi,慰wèi,熭wèi,犚wèi,磑wèi,緭wèi,蝟wèi,衛wèi,懀wèi,濊wèi,璏wèi,罻wèi,衞wèi,謂wèi,錗wèi,餧wèi,鮇wèi,螱wèi,褽wèi,餵wèi,魏wèi,藯wèi,鏏wèi,霨wèi,鳚wèi,蘶wèi,饖wèi,讆wèi,躗wèi,讏wèi,躛wèi,荱wèi,蜼wèi,硙wèi,轊wèi,昷wēn,塭wēn,温wēn,榅wēn,殟wēn,溫wēn,瑥wēn,辒wēn,榲wēn,瘟wēn,豱wēn,輼wēn,鳁wēn,鎾wēn,饂wēn,鰛wēn,鰮wēn,褞wēn,缊wēn,緼wēn,蕰wēn,縕wēn,薀wēn,藴wēn,鴖wén,亠wén,文wén,彣wén,纹wén,炆wén,砇wén,闻wén,紋wén,蚉wén,蚊wén,珳wén,阌wén,鈫wén,雯wén,瘒wén,聞wén,馼wén,魰wén,鳼wén,鴍wén,螡wén,閺wén,閿wén,蟁wén,闅wén,鼤wén,闦wén,芠wén,呅wěn,忞wěn,歾wěn,刎wěn,吻wěn,呚wěn,忟wěn,抆wěn,呡wěn,紊wěn,桽wěn,脗wěn,稳wěn,穏wěn,穩wěn,肳wěn,问wèn,妏wèn,汶wèn,問wèn,渂wèn,搵wèn,絻wèn,顐wèn,璺wèn,翁wēng,嗡wēng,鹟wēng,螉wēng,鎓wēng,鶲wēng,滃wēng,奣wěng,塕wěng,嵡wěng,蓊wěng,瞈wěng,聬wěng,暡wěng,瓮wèng,蕹wèng,甕wèng,罋wèng,齆wèng,堝wō,濄wō,薶wō,捼wō,挝wō,倭wō,涡wō,莴wō,唩wō,涹wō,渦wō,猧wō,萵wō,喔wō,窝wō,窩wō,蜗wō,撾wō,蝸wō,踒wō,涴wó,我wǒ,婐wǒ,婑wǒ,捰wǒ,龏wò,蒦wò,嚄wò,雘wò,艧wò,踠wò,仴wò,沃wò,肟wò,臥wò,偓wò,捾wò,媉wò,幄wò,握wò,渥wò,硪wò,楃wò,腛wò,斡wò,瞃wò,濣wò,瓁wò,龌wò,齷wò,枂wò,馧wò,卧wò,扝wū,乌wū,圬wū,弙wū,污wū,邬wū,呜wū,杇wū,巫wū,屋wū,洿wū,钨wū,烏wū,趶wū,剭wū,窏wū,釫wū,鄔wū,嗚wū,誈wū,誣wū,箼wū,螐wū,鴮wū,鎢wū,鰞wū,兀wū,杅wū,诬wū,幠wú,譕wú,蟱wú,墲wú,亾wú,兦wú,无wú,毋wú,吳wú,吴wú,吾wú,呉wú,芜wú,郚wú,娪wú,梧wú,洖wú,浯wú,茣wú,珸wú,祦wú,鹀wú,無wú,禑wú,蜈wú,蕪wú,璑wú,鵐wú,鯃wú,鼯wú,鷡wú,俉wú,憮wú,橆wú,铻wú,鋙wú,莁wú,陚wǔ,瞴wǔ,娒wǔ,乄wǔ,五wǔ,午wǔ,仵wǔ,伍wǔ,妩wǔ,庑wǔ,忤wǔ,怃wǔ,迕wǔ,旿wǔ,武wǔ,玝wǔ,侮wǔ,倵wǔ,捂wǔ,娬wǔ,牾wǔ,珷wǔ,摀wǔ,熓wǔ,碔wǔ,鹉wǔ,瑦wǔ,舞wǔ,嫵wǔ,廡wǔ,潕wǔ,錻wǔ,儛wǔ,甒wǔ,鵡wǔ,躌wǔ,逜wǔ,膴wǔ,啎wǔ,噁wù,雺wù,渞wù,揾wù,坞wù,塢wù,勿wù,务wù,戊wù,阢wù,伆wù,屼wù,扤wù,岉wù,杌wù,忢wù,物wù,矹wù,敄wù,误wù,務wù,悞wù,悟wù,悮wù,粅wù,晤wù,焐wù,婺wù,嵍wù,痦wù,隖wù,靰wù,骛wù,奦wù,嵨wù,溩wù,雾wù,寤wù,熃wù,誤wù,鹜wù,鋈wù,窹wù,鼿wù,霧wù,齀wù,騖wù,鶩wù,芴wù,霚wù,扱xī,糦xī,宩xī,獡xī,蜤xī,燍xī,夕xī,兮xī,汐xī,西xī,覀xī,吸xī,希xī,扸xī,卥xī,昔xī,析xī,矽xī,穸xī,肹xī,俙xī,徆xī,怸xī,郗xī,饻xī,唏xī,奚xī,屖xī,息xī,悕xī,晞xī,氥xī,浠xī,牺xī,狶xī,莃xī,唽xī,悉xī,惜xī,桸xī,欷xī,淅xī,渓xī,烯xī,焁xī,焈xī,琋xī,硒xī,菥xī,赥xī,釸xī,傒xī,惁xī,晰xī,晳xī,焟xī,犀xī,睎xī,稀xī,粞xī,翕xī,翖xī,舾xī,鄎xī,厀xī,嵠xī,徯xī,溪xī,煕xī,皙xī,蒠xī,锡xī,僖xī,榽xī,熄xī,熙xī,緆xī,蜥xī,豨xī,餏xī,嘻xī,噏xī,嬆xī,嬉xī,膝xī,餙xī,凞xī,樨xī,橀xī,歙xī,熹xī,熺xī,熻xī,窸xī,羲xī,螅xī,錫xī,燨xī,犠xī,瞦xī,礂xī,蟋xī,豀xī,豯xī,貕xī,繥xī,鯑xī,鵗xī,譆xī,鏭xī,隵xī,巇xī,曦xī,爔xī,犧xī,酅xī,鼷xī,蠵xī,鸂xī,鑴xī,憘xī,暿xī,鱚xī,咥xī,訢xī,娭xī,瘜xī,醯xī,雭xí,习xí,郋xí,席xí,習xí,袭xí,觋xí,媳xí,椺xí,蒵xí,蓆xí,嶍xí,漝xí,覡xí,趘xí,薂xí,檄xí,謵xí,鎴xí,霫xí,鳛xí,飁xí,騱xí,騽xí,襲xí,鰼xí,驨xí,隰xí,囍xǐ,杫xǐ,枲xǐ,洗xǐ,玺xǐ,徙xǐ,铣xǐ,喜xǐ,葈xǐ,葸xǐ,鈢xǐ,屣xǐ,漇xǐ,蓰xǐ,銑xǐ,憙xǐ,橲xǐ,禧xǐ,諰xǐ,壐xǐ,縰xǐ,謑xǐ,蟢xǐ,蹝xǐ,璽xǐ,躧xǐ,鉩xǐ,欪xì,钑xì,鈒xì,匸xì,卌xì,戏xì,屃xì,系xì,饩xì,呬xì,忥xì,怬xì,细xì,係xì,恄xì,绤xì,釳xì,阋xì,塈xì,椞xì,舄xì,趇xì,隙xì,慀xì,滊xì,禊xì,綌xì,赩xì,隟xì,熂xì,犔xì,潟xì,澙xì,蕮xì,覤xì,黖xì,戲xì,磶xì,虩xì,餼xì,鬩xì,嚱xì,霼xì,衋xì,細xì,闟xì,虾xiā,谺xiā,傄xiā,閕xiā,敮xiā,颬xiā,瞎xiā,蝦xiā,鰕xiā,魻xiā,郃xiá,匣xiá,侠xiá,狎xiá,俠xiá,峡xiá,柙xiá,炠xiá,狭xiá,陜xiá,峽xiá,烚xiá,狹xiá,珨xiá,祫xiá,硖xiá,舺xiá,陿xiá,溊xiá,硤xiá,遐xiá,暇xiá,瑕xiá,筪xiá,碬xiá,舝xiá,辖xiá,縀xiá,蕸xiá,縖xiá,赮xiá,轄xiá,鍜xiá,霞xiá,鎋xiá,黠xiá,騢xiá,鶷xiá,睱xiá,翈xiá,昰xià,丅xià,下xià,吓xià,圷xià,夏xià,梺xià,嚇xià,懗xià,罅xià,鏬xià,疜xià,姺xiān,仙xiān,仚xiān,屳xiān,先xiān,奾xiān,纤xiān,佡xiān,忺xiān,氙xiān,祆xiān,秈xiān,苮xiān,枮xiān,籼xiān,珗xiān,莶xiān,掀xiān,酰xiān,锨xiān,僊xiān,僲xiān,嘕xiān,鲜xiān,暹xiān,韯xiān,憸xiān,鍁xiān,繊xiān,褼xiān,韱xiān,鮮xiān,馦xiān,蹮xiān,廯xiān,譣xiān,鶱xiān,襳xiān,躚xiān,纖xiān,鱻xiān,縿xiān,跹xiān,咞xián,闲xián,妶xián,弦xián,贤xián,咸xián,挦xián,涎xián,胘xián,娴xián,娹xián,婱xián,舷xián,蚿xián,衔xián,啣xián,痫xián,蛝xián,閑xián,鹇xián,嫌xián,甉xián,銜xián,嫺xián,嫻xián,憪xián,澖xián,誸xián,賢xián,癇xián,癎xián,礥xián,贒xián,鑦xián,鷳xián,鷴xián,鷼xián,伭xián,冼xiǎn,狝xiǎn,显xiǎn,险xiǎn,毨xiǎn,烍xiǎn,猃xiǎn,蚬xiǎn,険xiǎn,赻xiǎn,筅xiǎn,尟xiǎn,尠xiǎn,禒xiǎn,蜆xiǎn,跣xiǎn,箲xiǎn,險xiǎn,獫xiǎn,獮xiǎn,藓xiǎn,鍌xiǎn,燹xiǎn,顕xiǎn,幰xiǎn,攇xiǎn,櫶xiǎn,蘚xiǎn,玁xiǎn,韅xiǎn,顯xiǎn,灦xiǎn,搟xiǎn,县xiàn,岘xiàn,苋xiàn,现xiàn,线xiàn,臽xiàn,限xiàn,姭xiàn,宪xiàn,陥xiàn,哯xiàn,垷xiàn,娨xiàn,峴xiàn,晛xiàn,莧xiàn,陷xiàn,現xiàn,馅xiàn,睍xiàn,絤xiàn,缐xiàn,羡xiàn,献xiàn,粯xiàn,羨xiàn,腺xiàn,僩xiàn,僴xiàn,綫xiàn,誢xiàn,撊xiàn,線xiàn,鋧xiàn,憲xiàn,餡xiàn,豏xiàn,瀗xiàn,臔xiàn,獻xiàn,鏾xiàn,霰xiàn,鼸xiàn,脇xiàn,軐xiàn,県xiàn,縣xiàn,儴xiāng,勷xiāng,蘘xiāng,纕xiāng,乡xiāng,芗xiāng,香xiāng,郷xiāng,厢xiāng,鄉xiāng,鄊xiāng,廂xiāng,湘xiāng,缃xiāng,葙xiāng,鄕xiāng,楿xiāng,薌xiāng,箱xiāng,緗xiāng,膷xiāng,忀xiāng,骧xiāng,麘xiāng,欀xiāng,瓖xiāng,镶xiāng,鱜xiāng,鑲xiāng,驤xiāng,襄xiāng,佭xiáng,详xiáng,庠xiáng,栙xiáng,祥xiáng,絴xiáng,翔xiáng,詳xiáng,跭xiáng,享xiǎng,亯xiǎng,响xiǎng,蚃xiǎng,饷xiǎng,晑xiǎng,飨xiǎng,想xiǎng,餉xiǎng,鲞xiǎng,蠁xiǎng,鮝xiǎng,鯗xiǎng,響xiǎng,饗xiǎng,饟xiǎng,鱶xiǎng,傢xiàng,相xiàng,向xiàng,姠xiàng,巷xiàng,项xiàng,珦xiàng,象xiàng,缿xiàng,萫xiàng,項xiàng,像xiàng,勨xiàng,嶑xiàng,橡xiàng,襐xiàng,蟓xiàng,鐌xiàng,鱌xiàng,鋞xiàng,鬨xiàng,嚮xiàng,鵁xiāo,莦xiāo,颵xiāo,箾xiāo,潚xiāo,橚xiāo,灱xiāo,灲xiāo,枭xiāo,侾xiāo,哓xiāo,枵xiāo,骁xiāo,宯xiāo,宵xiāo,庨xiāo,恷xiāo,消xiāo,绡xiāo,虓xiāo,逍xiāo,鸮xiāo,啋xiāo,婋xiāo,梟xiāo,焇xiāo,猇xiāo,萧xiāo,痚xiāo,痟xiāo,硝xiāo,硣xiāo,窙xiāo,翛xiāo,萷xiāo,销xiāo,揱xiāo,綃xiāo,歊xiāo,箫xiāo,嘵xiāo,撨xiāo,獢xiāo,銷xiāo,霄xiāo,彇xiāo,膮xiāo,蕭xiāo,魈xiāo,鴞xiāo,穘xiāo,簘xiāo,蟂xiāo,蟏xiāo,鴵xiāo,嚣xiāo,瀟xiāo,簫xiāo,蟰xiāo,髇xiāo,囂xiāo,髐xiāo,鷍xiāo,驍xiāo,毊xiāo,虈xiāo,肖xiāo,哮xiāo,烋xiāo,潇xiāo,蠨xiāo,洨xiáo,崤xiáo,淆xiáo,誵xiáo,笹xiǎo,小xiǎo,晓xiǎo,暁xiǎo,筱xiǎo,筿xiǎo,曉xiǎo,篠xiǎo,謏xiǎo,皢xiǎo,孝xiào,効xiào,咲xiào,俲xiào,效xiào,校xiào,涍xiào,笑xiào,傚xiào,敩xiào,滧xiào,詨xiào,嘋xiào,嘨xiào,誟xiào,嘯xiào,熽xiào,斅xiào,斆xiào,澩xiào,啸xiào,些xiē,楔xiē,歇xiē,蝎xiē,蠍xiē,协xié,旪xié,邪xié,協xié,胁xié,垥xié,恊xié,拹xié,脋xié,衺xié,偕xié,斜xié,谐xié,翓xié,嗋xié,愶xié,携xié,瑎xié,綊xié,熁xié,膎xié,勰xié,撷xié,擕xié,緳xié,缬xié,蝢xié,鞋xié,諧xié,燲xié,擷xié,鞵xié,襭xié,攜xié,讗xié,龤xié,魼xié,脅xié,纈xié,写xiě,冩xiě,寫xiě,藛xiě,烲xiè,榝xiè,齛xiè,碿xiè,伳xiè,灺xiè,泄xiè,泻xiè,祄xiè,绁xiè,缷xiè,卸xiè,洩xiè,炧xiè,炨xiè,卨xiè,娎xiè,屑xiè,屓xiè,偰xiè,徢xiè,械xiè,焎xiè,禼xiè,亵xiè,媟xiè,屟xiè,渫xiè,絬xiè,谢xiè,僁xiè,塮xiè,榍xiè,榭xiè,褉xiè,噧xiè,屧xiè,暬xiè,韰xiè,廨xiè,懈xiè,澥xiè,獬xiè,糏xiè,薢xiè,薤xiè,邂xiè,燮xiè,褻xiè,謝xiè,夑xiè,瀉xiè,鞢xiè,瀣xiè,蟹xiè,蠏xiè,齘xiè,齥xiè,齂xiè,躠xiè,屭xiè,躞xiè,蝑xiè,揳xiè,爕xiè,噺xin,心xīn,邤xīn,妡xīn,忻xīn,芯xīn,辛xīn,昕xīn,杺xīn,欣xīn,盺xīn,俽xīn,惞xīn,锌xīn,新xīn,歆xīn,鋅xīn,嬜xīn,薪xīn,馨xīn,鑫xīn,馫xīn,枔xín,襑xín,潃xǐn,阠xìn,伩xìn,囟xìn,孞xìn,炘xìn,信xìn,脪xìn,衅xìn,訫xìn,焮xìn,舋xìn,釁xìn,狌xīng,星xīng,垶xīng,骍xīng,猩xīng,煋xīng,鷞shuāng,骦shuāng,縔shuǎng,艭shuāng,塽shuǎng,壯zhuàng,状zhuàng,狀zhuàng,壵zhuàng,梉zhuàng,瑆xīng,腥xīng,蛵xīng,觪xīng,箵xīng,篂xīng,謃xīng,鮏xīng,曐xīng,觲xīng,騂xīng,皨xīng,鯹xīng,嬹xīng,惺xīng,刑xíng,邢xíng,形xíng,陉xíng,侀xíng,哘xíng,型xíng,洐xíng,娙xíng,硎xíng,铏xíng,鉶xíng,裄xíng,睲xǐng,醒xǐng,擤xǐng,兴xìng,興xìng,杏xìng,姓xìng,幸xìng,性xìng,荇xìng,倖xìng,莕xìng,婞xìng,悻xìng,涬xìng,緈xìng,臖xìng,凶xiōng,兄xiōng,兇xiōng,匈xiōng,芎xiōng,讻xiōng,忷xiōng,汹xiōng,恟xiōng,洶xiōng,胷xiōng,胸xiōng,訩xiōng,詾xiōng,哅xiōng,雄xióng,熊xióng,诇xiòng,詗xiòng,敻xiòng,休xiū,俢xiū,修xiū,咻xiū,庥xiū,烌xiū,羞xiū,脙xiū,鸺xiū,臹xiū,貅xiū,馐xiū,樇xiū,銝xiū,髤xiū,髹xiū,鮴xiū,鵂xiū,饈xiū,鏅xiū,飍xiū,鎀xiū,苬xiú,宿xiǔ,朽xiǔ,綇xiǔ,滫xiǔ,糔xiǔ,臰xiù,秀xiù,岫xiù,珛xiù,绣xiù,袖xiù,琇xiù,锈xiù,溴xiù,璓xiù,螑xiù,繍xiù,繡xiù,鏥xiù,鏽xiù,齅xiù,嗅xiù,蓿xu,繻xū,圩xū,旴xū,疞xū,盱xū,欨xū,胥xū,须xū,顼xū,虗xū,虚xū,谞xū,媭xū,幁xū,欻xū,虛xū,須xū,楈xū,窢xū,頊xū,嘘xū,稰xū,需xū,魆xū,噓xū,墟xū,嬃xū,歔xū,縃xū,歘xū,諝xū,譃xū,魖xū,驉xū,鑐xū,鬚xū,姁xū,偦xū,戌xū,蕦xū,俆xú,徐xú,蒣xú,訏xǔ,许xǔ,诩xǔ,冔xǔ,栩xǔ,珝xǔ,許xǔ,湑xǔ,暊xǔ,詡xǔ,鄦xǔ,糈xǔ,醑xǔ,盨xǔ,滀xù,嘼xù,鉥xù,旭xù,伵xù,序xù,侐xù,沀xù,叙xù,恤xù,昫xù,洫xù,垿xù,欰xù,殈xù,烅xù,珬xù,勖xù,勗xù,敍xù,敘xù,烼xù,绪xù,续xù,酗xù,喣xù,壻xù,婿xù,朂xù,溆xù,絮xù,訹xù,慉xù,続xù,蓄xù,賉xù,槒xù,漵xù,潊xù,盢xù,瞁xù,緒xù,聟xù,稸xù,緖xù,瞲xù,藚xù,續xù,怴xù,芧xù,汿xù,煦xù,煖xuān,吅xuān,轩xuān,昍xuān,咺xuān,宣xuān,晅xuān,軒xuān,谖xuān,喧xuān,媗xuān,愃xuān,愋xuān,揎xuān,萱xuān,萲xuān,暄xuān,煊xuān,瑄xuān,蓒xuān,睻xuān,儇xuān,禤xuān,箮xuān,翧xuān,蝖xuān,蕿xuān,諠xuān,諼xuān,鍹xuān,駽xuān,矎xuān,翾xuān,藼xuān,蘐xuān,蠉xuān,譞xuān,鰚xuān,塇xuān,玹xuán,痃xuán,悬xuán,旋xuán,蜁xuán,嫙xuán,漩xuán,暶xuán,璇xuán,檈xuán,璿xuán,懸xuán,玆xuán,玄xuán,选xuǎn,選xuǎn,癣xuǎn,癬xuǎn,絃xuàn,夐xuàn,怰xuàn,泫xuàn,昡xuàn,炫xuàn,绚xuàn,眩xuàn,袨xuàn,铉xuàn,琄xuàn,眴xuàn,衒xuàn,絢xuàn,楦xuàn,鉉xuàn,碹xuàn,蔙xuàn,镟xuàn,颴xuàn,縼xuàn,繏xuàn,鏇xuàn,贙xuàn,駨xuàn,渲xuàn,疶xuē,蒆xuē,靴xuē,薛xuē,鞾xuē,削xuē,噱xué,穴xué,斈xué,乴xué,坹xué,学xué,岤xué,峃xué,茓xué,泶xué,袕xué,鸴xué,學xué,嶨xué,燢xué,雤xué,鷽xué,踅xué,雪xuě,樰xuě,膤xuě,艝xuě,轌xuě,鳕xuě,鱈xuě,血xuè,泧xuè,狘xuè,桖xuè,烕xuè,谑xuè,趐xuè,瀥xuè,坃xūn,勋xūn,埙xūn,塤xūn,熏xūn,窨xūn,勲xūn,勳xūn,薫xūn,嚑xūn,壎xūn,獯xūn,薰xūn,曛xūn,燻xūn,臐xūn,矄xūn,蘍xūn,壦xūn,爋xūn,纁xūn,醺xūn,勛xūn,郇xún,咰xún,寻xún,巡xún,旬xún,杊xún,询xún,峋xún,恂xún,浔xún,紃xún,荀xún,栒xún,桪xún,毥xún,珣xún,偱xún,尋xún,循xún,揗xún,詢xún,鄩xún,鲟xún,噚xún,潯xún,攳xún,樳xún,燅xún,燖xún,璕xún,蟳xún,鱏xún,鱘xún,侚xún,彐xún,撏xún,洵xún,浚xùn,濬xùn,鶽xùn,驯xùn,馴xùn,卂xùn,训xùn,伨xùn,汛xùn,迅xùn,徇xùn,狥xùn,迿xùn,逊xùn,殉xùn,訊xùn,訓xùn,訙xùn,奞xùn,巽xùn,殾xùn,遜xùn,愻xùn,賐xùn,噀xùn,蕈xùn,顨xùn,鑂xùn,稄xùn,讯xùn,呀ya,圧yā,丫yā,压yā,庘yā,押yā,鸦yā,桠yā,鸭yā,铔yā,椏yā,鴉yā,錏yā,鴨yā,壓yā,鵶yā,鐚yā,唖yā,亜yā,垭yā,俹yā,埡yā,孲yā,拁yá,疨yá,牙yá,伢yá,岈yá,芽yá,厓yá,枒yá,琊yá,笌yá,蚜yá,堐yá,崕yá,崖yá,涯yá,猚yá,瑘yá,睚yá,衙yá,漄yá,齖yá,庌yá,顔yá,釾yá,疋yǎ,厊yǎ,啞yǎ,痖yǎ,雅yǎ,瘂yǎ,蕥yǎ,挜yǎ,掗yǎ,哑yǎ,呾yà,輵yà,潝yà,劜yà,圠yà,亚yà,穵yà,襾yà,讶yà,犽yà,迓yà,亞yà,玡yà,娅yà,砑yà,氩yà,婭yà,訝yà,揠yà,氬yà,猰yà,圔yà,稏yà,窫yà,椻yà,鼼yà,聐yà,淊yān,咽yān,恹yān,剦yān,烟yān,珚yān,胭yān,偣yān,崦yān,淹yān,焉yān,菸yān,阉yān,湮yān,腌yān,傿yān,煙yān,鄢yān,嫣yān,漹yān,嶖yān,樮yān,醃yān,閹yān,嬮yān,篶yān,臙yān,黫yān,弇yān,硽yān,慇yān,黰yān,橪yān,阽yán,炏yán,挻yán,厃yán,唌yán,廵yán,讠yán,円yán,延yán,闫yán,严yán,妍yán,言yán,訁yán,岩yán,昖yán,沿yán,炎yán,郔yán,姸yán,娫yán,狿yán,研yán,莚yán,娮yán,盐yán,琂yán,硏yán,訮yán,閆yán,阎yán,嵒yán,嵓yán,綖yán,蜒yán,塩yán,揅yán,楌yán,詽yán,碞yán,蔅yán,颜yán,虤yán,閻yán,厳yán,檐yán,顏yán,嚴yán,壛yán,巌yán,簷yán,櫩yán,麙yán,壧yán,孍yán,巖yán,巗yán,巚yán,欕yán,礹yán,鹽yán,麣yán,黬yán,偐yán,贗yán,菴yǎn,剡yǎn,嬐yǎn,崄yǎn,嶮yǎn,抁yǎn,沇yǎn,乵yǎn,兖yǎn,奄yǎn,俨yǎn,兗yǎn,匽yǎn,衍yǎn,偃yǎn,厣yǎn,掩yǎn,眼yǎn,萒yǎn,郾yǎn,酓yǎn,嵃yǎn,愝yǎn,扊yǎn,揜yǎn,棪yǎn,渰yǎn,渷yǎn,琰yǎn,隒yǎn,椼yǎn,罨yǎn,演yǎn,褗yǎn,蝘yǎn,魇yǎn,噞yǎn,躽yǎn,檿yǎn,黡yǎn,厴yǎn,甗yǎn,鰋yǎn,鶠yǎn,黤yǎn,齞yǎn,儼yǎn,黭yǎn,顩yǎn,鼴yǎn,巘yǎn,曮yǎn,魘yǎn,鼹yǎn,齴yǎn,黶yǎn,掞yǎn,隁yǎn,喭yǎn,酀yǎn,龂yǎn,齗yǎn,阭yǎn,夵yǎn,裺yǎn,溎yàn,豜yàn,豣yàn,烻yàn,湺yàn,麲yàn,厌yàn,妟yàn,牪yàn,姲yàn,彥yàn,彦yàn,砚yàn,唁yàn,宴yàn,晏yàn,艳yàn,覎yàn,验yàn,焔yàn,谚yàn,堰yàn,敥yàn,焰yàn,焱yàn,猒yàn,硯yàn,葕yàn,雁yàn,滟yàn,鳫yàn,厭yàn,墕yàn,熖yàn,酽yàn,嬊yàn,谳yàn,餍yàn,鴈yàn,燄yàn,燕yàn,諺yàn,赝yàn,鬳yàn,曕yàn,騐yàn,験yàn,嚥yàn,嬿yàn,艶yàn,贋yàn,軅yàn,爓yàn,醶yàn,騴yàn,鷃yàn,灔yàn,觾yàn,讌yàn,饜yàn,驗yàn,鷰yàn,艷yàn,灎yàn,釅yàn,驠yàn,灧yàn,讞yàn,豓yàn,豔yàn,灩yàn,顑yàn,懕yàn,筵yàn,觃yàn,暥yàn,醼yàn,歍yāng,央yāng,咉yāng,姎yāng,抰yāng,泱yāng,殃yāng,胦yāng,眏yāng,秧yāng,鸯yāng,鉠yāng,雵yāng,鞅yāng,鍈yāng,鴦yāng,佒yāng,霙yāng,瑒yáng,婸yáng,扬yáng,羊yáng,阦yáng,旸yáng,杨yáng,炀yáng,佯yáng,劷yáng,氜yáng,疡yáng,钖yáng,飏yáng,垟yáng,徉yáng,昜yáng,洋yáng,羏yáng,烊yáng,珜yáng,眻yáng,陽yáng,崵yáng,崸yáng,揚yáng,蛘yáng,敭yáng,暘yáng,楊yáng,煬yáng,禓yáng,瘍yáng,諹yáng,輰yáng,鴹yáng,颺yáng,鐊yáng,鰑yáng,霷yáng,鸉yáng,阳yáng,鍚yáng,飬yǎng,勜yǎng,仰yǎng,坱yǎng,奍yǎng,岟yǎng,养yǎng,炴yǎng,氧yǎng,痒yǎng,紻yǎng,傟yǎng,楧yǎng,軮yǎng,慃yǎng,氱yǎng,羪yǎng,養yǎng,駚yǎng,懩yǎng,攁yǎng,瀁yǎng,癢yǎng,礢yǎng,柍yǎng,恙yàng,样yàng,羕yàng,詇yàng,様yàng,漾yàng,樣yàng,怏yàng,玅yāo,撽yāo,幺yāo,夭yāo,吆yāo,妖yāo,枖yāo,祅yāo,訞yāo,喓yāo,葽yāo,楆yāo,腰yāo,邀yāo,宎yāo,侥yáo,僥yáo,蕘yáo,匋yáo,恌yáo,铫yáo,爻yáo,尧yáo,尭yáo,肴yáo,垚yáo,姚yáo,峣yáo,轺yáo,倄yáo,珧yáo,窑yáo,傜yáo,堯yáo,揺yáo,殽yáo,谣yáo,軺yáo,嗂yáo,媱yáo,徭yáo,愮yáo,搖yáo,摇yáo,猺yáo,遙yáo,遥yáo,摿yáo,暚yáo,榣yáo,瑤yáo,瑶yáo,飖yáo,餆yáo,嶢yáo,嶤yáo,徺yáo,磘yáo,窯yáo,餚yáo,繇yáo,謠yáo,謡yáo,鎐yáo,鳐yáo,颻yáo,蘨yáo,顤yáo,鰩yáo,鷂yáo,踰yáo,烑yáo,窰yáo,噛yǎo,仸yǎo,岆yǎo,抭yǎo,杳yǎo,殀yǎo,狕yǎo,苭yǎo,咬yǎo,柼yǎo,窅yǎo,窈yǎo,舀yǎo,偠yǎo,婹yǎo,崾yǎo,溔yǎo,蓔yǎo,榚yǎo,闄yǎo,騕yǎo,齩yǎo,鷕yǎo,穾yǎo,鴢yǎo,烄yào,药yào,要yào,袎yào,窔yào,筄yào,葯yào,詏yào,熎yào,覞yào,靿yào,獟yào,鹞yào,薬yào,曜yào,艞yào,藥yào,矅yào,曣yào,耀yào,纅yào,讑yào,鑰yào,怮yào,箹yào,钥yào,籥yào,亪ye,椰yē,暍yē,噎yē,潱yē,蠮yē,耶yē,吔yē,倻yē,峫yé,爷yé,捓yé,揶yé,铘yé,爺yé,鋣yé,鎁yé,擨yé,蠱yě,虵yě,也yě,冶yě,埜yě,野yě,嘢yě,漜yě,壄yě,瓛yè,熀yè,殕yè,啘yè,鐷yè,緤yè,业yè,叶yè,曳yè,页yè,邺yè,夜yè,亱yè,枼yè,洂yè,頁yè,捙yè,晔yè,枽yè,烨yè,偞yè,掖yè,液yè,谒yè,殗yè,腋yè,葉yè,鄓yè,墷yè,楪yè,業yè,馌yè,僷yè,曄yè,曅yè,歋yè,燁yè,擖yè,擛yè,皣yè,瞱yè,靥yè,嶪yè,嶫yè,澲yè,謁yè,餣yè,嚈yè,擫yè,曗yè,瞸yè,鍱yè,擪yè,爗yè,礏yè,鎑yè,饁yè,鵺yè,靨yè,驜yè,鸈yè,黦yè,煠yè,抴yè,鄴yè,膶yen,岃yen,袆yī,褘yī,一yī,弌yī,辷yī,衤yī,伊yī,衣yī,医yī,吚yī,依yī,祎yī,咿yī,洢yī,猗yī,畩yī,郼yī,铱yī,壹yī,揖yī,欹yī,蛜yī,禕yī,嫛yī,漪yī,稦yī,銥yī,嬄yī,噫yī,夁yī,瑿yī,鹥yī,繄yī,檹yī,毉yī,醫yī,黟yī,譩yī,鷖yī,黳yī,悘yī,壱yī,耛yí,拸yí,訑yí,釶yí,鉇yí,箷yí,戺yí,珆yí,鴺yí,銕yí,狏yí,迱yí,彵yí,熈yí,仪yí,匜yí,圯yí,夷yí,冝yí,宐yí,杝yí,沂yí,诒yí,侇yí,宜yí,怡yí,沶yí,狋yí,衪yí,饴yí,咦yí,姨yí,峓yí,弬yí,恞yí,柂yí,瓵yí,荑yí,贻yí,迻yí,宧yí,巸yí,扅yí,桋yí,眙yí,胰yí,袘yí,痍yí,移yí,萓yí,媐yí,椬yí,羠yí,蛦yí,詒yí,貽yí,遗yí,暆yí,椸yí,誃yí,跠yí,頉yí,颐yí,飴yí,疑yí,儀yí,熪yí,遺yí,嶬yí,彛yí,彜yí,螔yí,頥yí,寲yí,嶷yí,簃yí,顊yí,鮧yí,彝yí,彞yí,謻yí,鏔yí,籎yí,觺yí,讉yí,鸃yí,貤yí,乁yí,栘yí,頤yí,钀yǐ,錡yǐ,裿yǐ,迤yǐ,酏yǐ,乙yǐ,已yǐ,以yǐ,钇yǐ,佁yǐ,攺yǐ,矣yǐ,苡yǐ,苢yǐ,庡yǐ,舣yǐ,蚁yǐ,釔yǐ,倚yǐ,扆yǐ,逘yǐ,偯yǐ,崺yǐ,旑yǐ,椅yǐ,鈘yǐ,鉯yǐ,鳦yǐ,旖yǐ,輢yǐ,敼yǐ,螘yǐ,檥yǐ,礒yǐ,艤yǐ,蟻yǐ,顗yǐ,轙yǐ,齮yǐ,肊yǐ,陭yǐ,嬟yǐ,醷yǐ,阤yǐ,叕yǐ,锜yǐ,歖yǐ,笖yǐ,昳yì,睪yì,欥yì,輗yì,掜yì,儗yì,謚yì,紲yì,絏yì,辥yì,义yì,亿yì,弋yì,刈yì,忆yì,艺yì,仡yì,匇yì,议yì,亦yì,伇yì,屹yì,异yì,忔yì,芅yì,伿yì,佚yì,劮yì,呓yì,坄yì,役yì,抑yì,曵yì,杙yì,耴yì,苅yì,译yì,邑yì,佾yì,呭yì,呹yì,妷yì,峄yì,怈yì,怿yì,易yì,枍yì,泆yì,炈yì,绎yì,诣yì,驿yì,俋yì,奕yì,帟yì,帠yì,弈yì,枻yì,浂yì,玴yì,疫yì,羿yì,衵yì,轶yì,唈yì,垼yì,悒yì,挹yì,栧yì,栺yì,欭yì,浥yì,浳yì,益yì,袣yì,谊yì,勚yì,埸yì,悥yì,殹yì,異yì,羛yì,翊yì,翌yì,萟yì,訲yì,訳yì,豙yì,豛yì,逸yì,釴yì,隿yì,幆yì,敡yì,晹yì,棭yì,殔yì,湙yì,焲yì,蛡yì,詍yì,跇yì,軼yì,鈠yì,骮yì,亄yì,意yì,溢yì,獈yì,痬yì,竩yì,缢yì,義yì,肄yì,裔yì,裛yì,詣yì,勩yì,嫕yì,廙yì,榏yì,潩yì,瘗yì,膉yì,蓺yì,蜴yì,靾yì,駅yì,億yì,撎yì,槸yì,毅yì,熠yì,熤yì,熼yì,瘞yì,镒yì,鹝yì,鹢yì,黓yì,劓yì,圛yì,墿yì,嬑yì,嶧yì,憶yì,懌yì,曀yì,殪yì,澺yì,燚yì,瘱yì,瞖yì,穓yì,縊yì,艗yì,薏yì,螠yì,褹yì,寱yì,斁yì,曎yì,檍yì,歝yì,燡yì,翳yì,翼yì,臆yì,貖yì,鮨yì,癔yì,藙yì,藝yì,贀yì,鎰yì,镱yì,繶yì,繹yì,豷yì,霬yì,鯣yì,鶂yì,鶃yì,鶍yì,瀷yì,蘙yì,譯yì,議yì,醳yì,饐yì,囈yì,鐿yì,鷁yì,鷊yì,襼yì,驛yì,鷧yì,虉yì,鷾yì,讛yì,齸yì,襗yì,樴yì,癦yì,焬yì,阣yì,兿yì,誼yì,燱yì,懿yì,鮣yin,乚yīn,囙yīn,因yīn,阥yīn,阴yīn,侌yīn,垔yīn,姻yīn,洇yīn,茵yīn,荫yīn,音yīn,骃yīn,栶yīn,殷yīn,氤yīn,陰yīn,凐yīn,秵yīn,裀yīn,铟yīn,陻yīn,堙yīn,婣yīn,愔yīn,筃yīn,絪yīn,歅yīn,溵yīn,禋yīn,蒑yīn,蔭yīn,瘖yīn,銦yīn,磤yīn,緸yīn,鞇yīn,諲yīn,霒yīn,駰yīn,噾yīn,濦yīn,闉yīn,霠yīn,韾yīn,喑yīn,玪yín,伒yín,乑yín,吟yín,犾yín,苂yín,斦yín,泿yín,圁yín,峾yín,烎yín,狺yín,珢yín,粌yín,荶yín,訔yín,唫yín,婬yín,寅yín,崟yín,崯yín,淫yín,訡yín,银yín,鈝yín,滛yín,碒yín,鄞yín,夤yín,蔩yín,訚yín,誾yín,銀yín,龈yín,噖yín,殥yín,嚚yín,檭yín,蟫yín,霪yín,齦yín,鷣yín,螾yín,垠yín,璌yín,赺yǐn,縯yǐn,尹yǐn,引yǐn,吲yǐn,饮yǐn,蚓yǐn,隐yǐn,淾yǐn,釿yǐn,鈏yǐn,飲yǐn,隠yǐn,靷yǐn,飮yǐn,朄yǐn,趛yǐn,檃yǐn,瘾yǐn,隱yǐn,嶾yǐn,濥yǐn,蘟yǐn,癮yǐn,讔yǐn,輑yǐn,櫽yǐn,堷yìn,梀yìn,隂yìn,印yìn,茚yìn,洕yìn,胤yìn,垽yìn,湚yìn,猌yìn,廕yìn,酳yìn,慭yìn,癊yìn,憖yìn,憗yìn,懚yìn,檼yìn,韹yīng,焽yīng,旲yīng,应yīng,応yīng,英yīng,偀yīng,桜yīng,珱yīng,莺yīng,啨yīng,婴yīng,媖yīng,愥yīng,渶yīng,朠yīng,煐yīng,瑛yīng,嫈yīng,碤yīng,锳yīng,嘤yīng,撄yīng,甇yīng,緓yīng,缨yīng,罂yīng,蝧yīng,賏yīng,樱yīng,璎yīng,噟yīng,罃yīng,褮yīng,鴬yīng,鹦yīng,嬰yīng,應yīng,膺yīng,韺yīng,甖yīng,鹰yīng,嚶yīng,孆yīng,孾yīng,攖yīng,瀴yīng,罌yīng,蘡yīng,櫻yīng,瓔yīng,礯yīng,譻yīng,鶯yīng,鑍yīng,纓yīng,蠳yīng,鷪yīng,軈yīng,鷹yīng,鸎yīng,鸚yīng,謍yīng,譍yīng,绬yīng,鶧yīng,夃yíng,俓yíng,泂yíng,嵤yíng,桯yíng,滎yíng,鎣yíng,盁yíng,迎yíng,茔yíng,盈yíng,荥yíng,荧yíng,莹yíng,萤yíng,营yíng,萦yíng,営yíng,溁yíng,溋yíng,萾yíng,僌yíng,塋yíng,楹yíng,滢yíng,蓥yíng,潆yíng,熒yíng,蝇yíng,瑩yíng,蝿yíng,嬴yíng,營yíng,縈yíng,螢yíng,濙yíng,濚yíng,濴yíng,藀yíng,覮yíng,赢yíng,巆yíng,攍yíng,攚yíng,瀛yíng,瀠yíng,蠅yíng,櫿yíng,灐yíng,籝yíng,灜yíng,贏yíng,籯yíng,耺yíng,蛍yíng,瀯yíng,瀅yíng,矨yǐng,郢yǐng,浧yǐng,梬yǐng,颍yǐng,颕yǐng,颖yǐng,摬yǐng,影yǐng,潁yǐng,瘿yǐng,穎yǐng,頴yǐng,巊yǐng,廮yǐng,鐛yǐng,癭yǐng,鱦yìng,映yìng,暎yìng,硬yìng,媵yìng,膡yìng,鞕yìng,嚛yo,哟yō,唷yō,喲yō,拥yōng,痈yōng,邕yōng,庸yōng,嗈yōng,鄘yōng,雍yōng,墉yōng,嫞yōng,慵yōng,滽yōng,槦yōng,牅yōng,銿yōng,噰yōng,壅yōng,擁yōng,澭yōng,郺yōng,镛yōng,臃yōng,癕yōng,雝yōng,鏞yōng,廱yōng,灉yōng,饔yōng,鱅yōng,鷛yōng,癰yōng,鳙yōng,揘yóng,喁yóng,鰫yóng,嵱yóng,筩yǒng,永yǒng,甬yǒng,咏yǒng,怺yǒng,泳yǒng,俑yǒng,勇yǒng,勈yǒng,栐yǒng,埇yǒng,悀yǒng,柡yǒng,涌yǒng,恿yǒng,傛yǒng,惥yǒng,愑yǒng,湧yǒng,硧yǒng,詠yǒng,彮yǒng,愹yǒng,蛹yǒng,慂yǒng,踊yǒng,禜yǒng,鲬yǒng,踴yǒng,鯒yǒng,塎yǒng,佣yòng,用yòng,苚yòng,砽yòng,醟yòng,妋yōu,优yōu,忧yōu,攸yōu,呦yōu,幽yōu,悠yōu,麀yōu,滺yōu,憂yōu,優yōu,鄾yōu,嚘yōu,懮yōu,瀀yōu,纋yōu,耰yōu,逌yōu,泈yōu,櫌yōu,蓧yóu,蚘yóu,揂yóu,汼yóu,汓yóu,蝤yóu,尣yóu,冘yóu,尢yóu,尤yóu,由yóu,沋yóu,犹yóu,邮yóu,怞yóu,油yóu,肬yóu,怣yóu,斿yóu,疣yóu,峳yóu,浟yóu,秞yóu,莜yóu,莤yóu,莸yóu,郵yóu,铀yóu,偤yóu,蚰yóu,訧yóu,逰yóu,游yóu,猶yóu,鱿yóu,楢yóu,猷yóu,鈾yóu,鲉yóu,輏yóu,駀yóu,蕕yóu,蝣yóu,魷yóu,輶yóu,鮋yóu,櫾yóu,邎yóu,庮yóu,甴yóu,遊yóu,羗yǒu,脩yǒu,戭yǒu,友yǒu,有yǒu,丣yǒu,卣yǒu,苃yǒu,酉yǒu,羑yǒu,羐yǒu,莠yǒu,梄yǒu,聈yǒu,脜yǒu,铕yǒu,湵yǒu,蒏yǒu,蜏yǒu,銪yǒu,槱yǒu,牖yǒu,牗yǒu,黝yǒu,栯yǒu,禉yǒu,痏yòu,褎yòu,褏yòu,銹yòu,柚yòu,又yòu,右yòu,幼yòu,佑yòu,侑yòu,孧yòu,狖yòu,糿yòu,哊yòu,囿yòu,姷yòu,宥yòu,峟yòu,牰yòu,祐yòu,诱yòu,迶yòu,唀yòu,蚴yòu,亴yòu,貁yòu,釉yòu,酭yòu,鼬yòu,誘yòu,纡yū,迂yū,迃yū,穻yū,陓yū,紆yū,虶yū,唹yū,淤yū,盓yū,瘀yū,箊yū,亐yū,丂yú,桙yú,婾yú,媮yú,悇yú,汙yú,汚yú,鱮yú,颙yú,顒yú,渝yú,于yú,邘yú,伃yú,余yú,妤yú,扵yú,欤yú,玗yú,玙yú,於yú,盂yú,臾yú,鱼yú,俞yú,兪yú,禺yú,竽yú,舁yú,茰yú,荢yú,娛yú,娯yú,娱yú,狳yú,谀yú,酑yú,馀yú,渔yú,萸yú,釪yú,隃yú,隅yú,雩yú,魚yú,堣yú,堬yú,崳yú,嵎yú,嵛yú,愉yú,揄yú,楰yú,畬yú,畭yú,硢yú,腴yú,逾yú,骬yú,愚yú,楡yú,榆yú,歈yú,牏yú,瑜yú,艅yú,虞yú,觎yú,漁yú,睮yú,窬yú,舆yú,褕yú,歶yú,羭yú,蕍yú,蝓yú,諛yú,雓yú,餘yú,魣yú,嬩yú,懙yú,覦yú,歟yú,璵yú,螸yú,輿yú,鍝yú,礖yú,謣yú,髃yú,鮽yú,旟yú,籅yú,騟yú,鯲yú,鰅yú,鷠yú,鸆yú,萮yú,芌yú,喩yú,媀yú,貗yú,衧yú,湡yú,澞yú,頨yǔ,蝺yǔ,藇yǔ,予yǔ,与yǔ,伛yǔ,宇yǔ,屿yǔ,羽yǔ,雨yǔ,俁yǔ,俣yǔ,挧yǔ,禹yǔ,语yǔ,圄yǔ,祤yǔ,偊yǔ,匬yǔ,圉yǔ,庾yǔ,敔yǔ,鄅yǔ,萭yǔ,傴yǔ,寙yǔ,斞yǔ,楀yǔ,瑀yǔ,瘐yǔ,與yǔ,語yǔ,窳yǔ,龉yǔ,噳yǔ,嶼yǔ,貐yǔ,斔yǔ,麌yǔ,蘌yǔ,齬yǔ,穥yǔ,峿yǔ,閼yù,穀yù,蟈yù,僪yù,鐍yù,肀yù,翑yù,衘yù,獝yù,玉yù,驭yù,圫yù,聿yù,芋yù,妪yù,忬yù,饫yù,育yù,郁yù,彧yù,昱yù,狱yù,秗yù,俼yù,峪yù,浴yù,砡yù,钰yù,预yù,喐yù,域yù,堉yù,悆yù,惐yù,欲yù,淢yù,淯yù,袬yù,逳yù,阈yù,喅yù,喻yù,寓yù,庽yù,御yù,棛yù,棜yù,棫yù,焴yù,琙yù,矞yù,裕yù,遇yù,飫yù,馭yù,鹆yù,愈yù,滪yù,煜yù,稢yù,罭yù,蒮yù,蓣yù,誉yù,鈺yù,預yù,嶎yù,戫yù,毓yù,獄yù,瘉yù,緎yù,蜟yù,蜮yù,輍yù,銉yù,隩yù,噊yù,慾yù,稶yù,蓹yù,薁yù,豫yù,遹yù,鋊yù,鳿yù,澦yù,燏yù,燠yù,蕷yù,諭yù,錥yù,閾yù,鴥yù,鴧yù,鴪yù,礇yù,禦yù,魊yù,鹬yù,癒yù,礜yù,篽yù,繘yù,鵒yù,櫲yù,饇yù,蘛yù,譽yù,轝yù,鐭yù,霱yù,欎yù,驈yù,鬻yù,籞yù,鱊yù,鷸yù,鸒yù,欝yù,軉yù,鬰yù,鬱yù,灪yù,爩yù,灹yù,吁yù,谕yù,嫗yù,儥yù,籲yù,裷yuān,嫚yuān,囦yuān,鸢yuān,剈yuān,冤yuān,弲yuān,悁yuān,眢yuān,鸳yuān,寃yuān,渁yuān,渆yuān,渊yuān,渕yuān,淵yuān,葾yuān,棩yuān,蒬yuān,蜎yuān,鹓yuān,箢yuān,鳶yuān,蜵yuān,駌yuān,鋺yuān,鴛yuān,嬽yuān,鵷yuān,灁yuān,鼝yuān,蝝yuān,鼘yuān,喛yuán,楥yuán,芫yuán,元yuán,贠yuán,邧yuán,员yuán,园yuán,沅yuán,杬yuán,垣yuán,爰yuán,貟yuán,原yuán,員yuán,圆yuán,笎yuán,袁yuán,厡yuán,酛yuán,圎yuán,援yuán,湲yuán,猨yuán,缘yuán,鈨yuán,鼋yuán,園yuán,圓yuán,塬yuán,媴yuán,源yuán,溒yuán,猿yuán,獂yuán,蒝yuán,榞yuán,榬yuán,辕yuán,緣yuán,縁yuán,蝯yuán,橼yuán,羱yuán,薗yuán,螈yuán,謜yuán,轅yuán,黿yuán,鎱yuán,櫞yuán,邍yuán,騵yuán,鶢yuán,鶰yuán,厵yuán,傆yuán,媛yuán,褑yuán,褤yuán,嫄yuán,远yuǎn,盶yuǎn,遠yuǎn,逺yuǎn,肙yuàn,妴yuàn,苑yuàn,怨yuàn,院yuàn,垸yuàn,衏yuàn,掾yuàn,瑗yuàn,禐yuàn,愿yuàn,裫yuàn,噮yuàn,願yuàn,哕yue,噦yuē,曰yuē,曱yuē,约yuē,約yuē,矱yuē,彟yuē,彠yuē,矆yuè,妜yuè,髺yuè,哾yuè,趯yuè,月yuè,戉yuè,汋yuè,岄yuè,抈yuè,礿yuè,岳yuè,玥yuè,恱yuè,悅yuè,悦yuè,蚎yuè,蚏yuè,軏yuè,钺yuè,阅yuè,捳yuè,跀yuè,跃yuè,粤yuè,越yuè,鈅yuè,粵yuè,鉞yuè,閱yuè,閲yuè,嬳yuè,樾yuè,篗yuè,嶽yuè,籆yuè,瀹yuè,蘥yuè,爚yuè,禴yuè,躍yuè,鸑yuè,籰yuè,龥yuè,鸙yuè,躒yuè,刖yuè,龠yuè,涒yūn,轀yūn,蒀yūn,煴yūn,蒕yūn,熅yūn,奫yūn,赟yūn,頵yūn,贇yūn,氲yūn,氳yūn,晕yūn,暈yūn,云yún,勻yún,匀yún,伝yún,呍yún,囩yún,妘yún,抣yún,纭yún,芸yún,昀yún,畇yún,眃yún,秐yún,郧yún,涢yún,紜yún,耘yún,鄖yún,雲yún,愪yún,溳yún,筼yún,蒷yún,熉yún,澐yún,蕓yún,鋆yún,橒yún,篔yún,縜yún,繧yún,荺yún,沄yún,允yǔn,夽yǔn,狁yǔn,玧yǔn,陨yǔn,殒yǔn,喗yǔn,鈗yǔn,隕yǔn,殞yǔn,馻yǔn,磒yǔn,霣yǔn,齫yǔn,齳yǔn,抎yǔn,緷yùn,孕yùn,运yùn,枟yùn,郓yùn,恽yùn,鄆yùn,酝yùn,傊yùn,惲yùn,愠yùn,運yùn,慍yùn,韫yùn,韵yùn,熨yùn,蕴yùn,賱yùn,醖yùn,醞yùn,餫yùn,韗yùn,韞yùn,蘊yùn,韻yùn,腪yùn,噈zā,帀zā,匝zā,沞zā,咂zā,拶zā,沯zā,桚zā,紮zā,鉔zā,臜zā,臢zā,砸zá,韴zá,雑zá,襍zá,雜zá,雥zá,囋zá,杂zá,咋zǎ,災zāi,灾zāi,甾zāi,哉zāi,栽zāi,烖zāi,渽zāi,溨zāi,睵zāi,賳zāi,宰zǎi,载zǎi,崽zǎi,載zǎi,仔zǎi,再zài,在zài,扗zài,洅zài,傤zài,酨zài,儎zài,篸zān,兂zān,糌zān,簪zān,簮zān,鐕zān,撍zān,咱zán,偺zán,喒zǎn,昝zǎn,寁zǎn,儧zǎn,攒zǎn,儹zǎn,趱zǎn,趲zǎn,揝zǎn,穳zàn,暂zàn,暫zàn,賛zàn,赞zàn,錾zàn,鄼zàn,濽zàn,蹔zàn,酂zàn,瓉zàn,贊zàn,鏨zàn,瓒zàn,灒zàn,讃zàn,瓚zàn,禶zàn,襸zàn,讚zàn,饡zàn,酇zàn,匨zāng,蔵zāng,牂zāng,羘zāng,赃zāng,賍zāng,臧zāng,賘zāng,贓zāng,髒zāng,贜zāng,脏zāng,驵zǎng,駔zǎng,奘zàng,弉zàng,塟zàng,葬zàng,銺zàng,臓zàng,臟zàng,傮zāo,遭zāo,糟zāo,醩zāo,蹧zāo,凿záo,鑿záo,早zǎo,枣zǎo,栆zǎo,蚤zǎo,棗zǎo,璅zǎo,澡zǎo,璪zǎo,薻zǎo,藻zǎo,灶zào,皁zào,皂zào,唕zào,唣zào,造zào,梍zào,慥zào,煰zào,艁zào,噪zào,簉zào,燥zào,竃zào,譟zào,趮zào,竈zào,躁zào,啫zē,伬zé,则zé,択zé,沢zé,择zé,泎zé,泽zé,责zé,迮zé,則zé,啧zé,帻zé,笮zé,舴zé,責zé,溭zé,嘖zé,嫧zé,幘zé,箦zé,蔶zé,樍zé,歵zé,諎zé,赜zé,擇zé,皟zé,瞔zé,礋zé,謮zé,賾zé,蠌zé,齚zé,齰zé,鸅zé,讁zé,葃zé,澤zé,仄zè,夨zè,庂zè,汄zè,昃zè,昗zè,捑zè,崱zè,贼zéi,賊zéi,鲗zéi,蠈zéi,鰂zéi,鱡zéi,怎zěn,谮zèn,囎zèn,譛zèn,曽zēng,増zēng,鄫zēng,增zēng,憎zēng,缯zēng,橧zēng,熷zēng,璔zēng,矰zēng,磳zēng,罾zēng,繒zēng,譄zēng,鱛zēng,縡zēng,鬷zěng,锃zèng,鋥zèng,甑zèng,赠zèng,贈zèng,馇zha,餷zha,蹅zhā,紥zhā,迊zhā,抯zhā,挓zhā,柤zhā,哳zhā,偧zhā,揸zhā,渣zhā,溠zhā,楂zhā,劄zhā,皶zhā,箚zhā,樝zhā,皻zhā,譇zhā,齄zhā,齇zhā,扎zhā,摣zhā,藸zhā,囃zhā,喳zhā,箑zhá,耫zhá,札zhá,轧zhá,軋zhá,闸zhá,蚻zhá,铡zhá,牐zhá,閘zhá,霅zhá,鍘zhá,譗zhá,挿zhǎ,揷zhǎ,厏zhǎ,苲zhǎ,砟zhǎ,鲊zhǎ,鲝zhǎ,踷zhǎ,鮓zhǎ,鮺zhǎ,眨zhǎ,吒zhà,乍zhà,诈zhà,咤zhà,奓zhà,炸zhà,宱zhà,痄zhà,蚱zhà,詐zhà,搾zhà,榨zhà,醡zhà,拃zhà,柞zhà,夈zhāi,粂zhāi,捚zhāi,斋zhāi,斎zhāi,榸zhāi,齋zhāi,摘zhāi,檡zhái,宅zhái,翟zhái,窄zhǎi,鉙zhǎi,骴zhài,簀zhài,债zhài,砦zhài,債zhài,寨zhài,瘵zhài,沾zhān,毡zhān,旃zhān,栴zhān,粘zhān,蛅zhān,惉zhān,詀zhān,趈zhān,詹zhān,閚zhān,谵zhān,嶦zhān,薝zhān,邅zhān,霑zhān,氊zhān,瞻zhān,鹯zhān,旜zhān,譫zhān,饘zhān,鳣zhān,驙zhān,魙zhān,鸇zhān,覱zhān,氈zhān,讝zhán,斩zhǎn,飐zhǎn,展zhǎn,盏zhǎn,崭zhǎn,斬zhǎn,琖zhǎn,搌zhǎn,盞zhǎn,嶃zhǎn,嶄zhǎn,榐zhǎn,颭zhǎn,嫸zhǎn,醆zhǎn,蹍zhǎn,欃zhàn,占zhàn,佔zhàn,战zhàn,栈zhàn,桟zhàn,站zhàn,偡zhàn,绽zhàn,菚zhàn,棧zhàn,湛zhàn,戦zhàn,綻zhàn,嶘zhàn,輚zhàn,戰zhàn,虥zhàn,虦zhàn,轏zhàn,蘸zhàn,驏zhàn,张zhāng,張zhāng,章zhāng,鄣zhāng,嫜zhāng,彰zhāng,慞zhāng,漳zhāng,獐zhāng,粻zhāng,蔁zhāng,遧zhāng,暲zhāng,樟zhāng,璋zhāng,餦zhāng,蟑zhāng,鏱zhāng,騿zhāng,鱆zhāng,麞zhāng,涱zhāng,傽zhāng,长zhǎng,仧zhǎng,長zhǎng,镸zhǎng,仉zhǎng,涨zhǎng,掌zhǎng,漲zhǎng,幥zhǎng,礃zhǎng,鞝zhǎng,鐣zhǎng,丈zhàng,仗zhàng,扙zhàng,杖zhàng,胀zhàng,账zhàng,粀zhàng,帳zhàng,脹zhàng,痮zhàng,障zhàng,墇zhàng,嶂zhàng,幛zhàng,賬zhàng,瘬zhàng,瘴zhàng,瞕zhàng,帐zhàng,鼌zhāo,鼂zhāo,謿zhāo,皽zhāo,佋zhāo,钊zhāo,妱zhāo,巶zhāo,招zhāo,昭zhāo,炤zhāo,盄zhāo,釗zhāo,鉊zhāo,駋zhāo,鍣zhāo,爫zhǎo,沼zhǎo,瑵zhǎo,爪zhǎo,找zhǎo,召zhào,兆zhào,诏zhào,枛zhào,垗zhào,狣zhào,赵zhào,笊zhào,肁zhào,旐zhào,棹zhào,罀zhào,詔zhào,照zhào,罩zhào,肇zhào,肈zhào,趙zhào,曌zhào,燳zhào,鮡zhào,櫂zhào,瞾zhào,羄zhào,啅zhào,龑yan,著zhe,着zhe,蜇zhē,嫬zhē,遮zhē,嗻zhē,摂zhé,歽zhé,砓zhé,籷zhé,虴zhé,哲zhé,埑zhé,粍zhé,袩zhé,啠zhé,悊zhé,晢zhé,晣zhé,辄zhé,喆zhé,蛰zhé,詟zhé,谪zhé,摺zhé,輒zhé,磔zhé,輙zhé,辙zhé,蟄zhé,嚞zhé,謫zhé,鮿zhé,轍zhé,襵zhé,讋zhé,厇zhé,謺zhé,者zhě,锗zhě,赭zhě,褶zhě,鍺zhě,这zhè,柘zhè,浙zhè,這zhè,淛zhè,蔗zhè,樜zhè,鹧zhè,蟅zhè,鷓zhè,趂zhēn,贞zhēn,针zhēn,侦zhēn,浈zhēn,珍zhēn,珎zhēn,貞zhēn,帪zhēn,栕zhēn,眞zhēn,真zhēn,砧zhēn,祯zhēn,針zhēn,偵zhēn,敒zhēn,桭zhēn,酙zhēn,寊zhēn,湞zhēn,遉zhēn,搸zhēn,斟zhēn,楨zhēn,獉zhēn,甄zhēn,禎zhēn,蒖zhēn,蓁zhēn,鉁zhēn,靕zhēn,榛zhēn,殝zhēn,瑧zhēn,禛zhēn,潧zhēn,樼zhēn,澵zhēn,臻zhēn,薽zhēn,錱zhēn,轃zhēn,鍖zhēn,鱵zhēn,胗zhēn,侲zhēn,揕zhēn,鎭zhēn,帧zhēn,幀zhēn,朾zhēn,椹zhēn,桢zhēn,箴zhēn,屒zhén,诊zhěn,抮zhěn,枕zhěn,姫zhěn,弫zhěn,昣zhěn,轸zhěn,畛zhěn,疹zhěn,眕zhěn,袗zhěn,聄zhěn,萙zhěn,裖zhěn,覙zhěn,診zhěn,軫zhěn,缜zhěn,稹zhěn,駗zhěn,縝zhěn,縥zhěn,辴zhěn,鬒zhěn,嫃zhěn,謓zhèn,迧zhèn,圳zhèn,阵zhèn,纼zhèn,挋zhèn,陣zhèn,鸩zhèn,振zhèn,朕zhèn,栚zhèn,紖zhèn,眹zhèn,赈zhèn,塦zhèn,絼zhèn,蜄zhèn,敶zhèn,誫zhèn,賑zhèn,鋴zhèn,镇zhèn,鴆zhèn,鎮zhèn,震zhèn,嶒zhēng,脀zhēng,凧zhēng,争zhēng,佂zhēng,姃zhēng,征zhēng,怔zhēng,爭zhēng,峥zhēng,炡zhēng,狰zhēng,烝zhēng,眐zhēng,钲zhēng,埩zhēng,崝zhēng,崢zhēng,猙zhēng,睁zhēng,聇zhēng,铮zhēng,媜zhēng,筝zhēng,徰zhēng,蒸zhēng,鉦zhēng,箏zhēng,徵zhēng,踭zhēng,篜zhēng,錚zhēng,鬇zhēng,癥zhēng,糽zhēng,睜zhēng,氶zhěng,抍zhěng,拯zhěng,塣zhěng,晸zhěng,愸zhěng,撜zhěng,整zhěng,憕zhèng,徎zhèng,挣zhèng,掙zhèng,正zhèng,证zhèng,诤zhèng,郑zhèng,政zhèng,症zhèng,証zhèng,鄭zhèng,鴊zhèng,證zhèng,諍zhèng,之zhī,支zhī,卮zhī,汁zhī,芝zhī,巵zhī,枝zhī,知zhī,织zhī,肢zhī,徔zhī,栀zhī,祗zhī,秓zhī,秖zhī,胑zhī,胝zhī,衼zhī,倁zhī,疷zhī,祬zhī,秪zhī,脂zhī,隻zhī,梔zhī,椥zhī,搘zhī,禔zhī,綕zhī,榰zhī,蜘zhī,馶zhī,鳷zhī,謢zhī,鴲zhī,織zhī,蘵zhī,鼅zhī,禵zhī,只zhī,鉄zhí,执zhí,侄zhí,坧zhí,直zhí,姪zhí,値zhí,值zhí,聀zhí,釞zhí,埴zhí,執zhí,职zhí,植zhí,殖zhí,絷zhí,跖zhí,墌zhí,摭zhí,馽zhí,嬂zhí,慹zhí,漐zhí,踯zhí,膱zhí,縶zhí,職zhí,蟙zhí,蹠zhí,軄zhí,躑zhí,秇zhí,埶zhí,戠zhí,禃zhí,茝zhǐ,絺zhǐ,觝zhǐ,徴zhǐ,止zhǐ,凪zhǐ,劧zhǐ,旨zhǐ,阯zhǐ,址zhǐ,坁zhǐ,帋zhǐ,沚zhǐ,纸zhǐ,芷zhǐ,抧zhǐ,祉zhǐ,茋zhǐ,咫zhǐ,恉zhǐ,指zhǐ,枳zhǐ,洔zhǐ,砋zhǐ,轵zhǐ,淽zhǐ,疻zhǐ,紙zhǐ,訨zhǐ,趾zhǐ,軹zhǐ,黹zhǐ,酯zhǐ,藢zhǐ,襧zhǐ,汦zhǐ,胵zhì,歭zhì,遟zhì,迣zhì,鶨zhì,亊zhì,銴zhì,至zhì,芖zhì,志zhì,忮zhì,扻zhì,豸zhì,厔zhì,垁zhì,帙zhì,帜zhì,治zhì,炙zhì,质zhì,郅zhì,俧zhì,峙zhì,庢zhì,庤zhì,栉zhì,洷zhì,祑zhì,陟zhì,娡zhì,徏zhì,挚zhì,晊zhì,桎zhì,狾zhì,秩zhì,致zhì,袟zhì,贽zhì,轾zhì,徝zhì,掷zhì,梽zhì,猘zhì,畤zhì,痔zhì,秲zhì,秷zhì,窒zhì,紩zhì,翐zhì,袠zhì,觗zhì,貭zhì,铚zhì,鸷zhì,傂zhì,崻zhì,彘zhì,智zhì,滞zhì,痣zhì,蛭zhì,骘zhì,廌zhì,滍zhì,稙zhì,稚zhì,置zhì,跱zhì,輊zhì,锧zhì,雉zhì,槜zhì,滯zhì,潌zhì,瘈zhì,製zhì,覟zhì,誌zhì,銍zhì,幟zhì,憄zhì,摯zhì,潪zhì,熫zhì,稺zhì,膣zhì,觯zhì,質zhì,踬zhì,鋕zhì,旘zhì,瀄zhì,緻zhì,隲zhì,鴙zhì,儨zhì,劕zhì,懥zhì,擲zhì,櫛zhì,懫zhì,贄zhì,櫍zhì,瓆zhì,觶zhì,騭zhì,礩zhì,豑zhì,騺zhì,驇zhì,躓zhì,鷙zhì,鑕zhì,豒zhì,制zhì,偫zhì,筫zhì,駤zhì,徸zhōng,蝩zhōng,中zhōng,伀zhōng,汷zhōng,刣zhōng,妐zhōng,彸zhōng,忠zhōng,炂zhōng,终zhōng,柊zhōng,盅zhōng,衳zhōng,钟zhōng,舯zhōng,衷zhōng,終zhōng,鈡zhōng,幒zhōng,蔠zhōng,锺zhōng,螤zhōng,鴤zhōng,螽zhōng,鍾zhōng,鼨zhōng,蹱zhōng,鐘zhōng,籦zhōng,衆zhōng,迚zhōng,肿zhǒng,种zhǒng,冢zhǒng,喠zhǒng,尰zhǒng,塚zhǒng,歱zhǒng,腫zhǒng,瘇zhǒng,種zhǒng,踵zhǒng,煄zhǒng,緟zhòng,仲zhòng,众zhòng,妕zhòng,狆zhòng,祌zhòng,茽zhòng,衶zhòng,重zhòng,蚛zhòng,偅zhòng,眾zhòng,堹zhòng,媑zhòng,筗zhòng,諥zhòng,啁zhōu,州zhōu,舟zhōu,诌zhōu,侜zhōu,周zhōu,洲zhōu,炿zhōu,诪zhōu,珘zhōu,辀zhōu,郮zhōu,婤zhōu,徟zhōu,矪zhōu,週zhōu,喌zhōu,粥zhōu,赒zhōu,輈zhōu,銂zhōu,賙zhōu,輖zhōu,霌zhōu,駲zhōu,嚋zhōu,盩zhōu,謅zhōu,譸zhōu,僽zhōu,諏zhōu,烐zhōu,妯zhóu,轴zhóu,軸zhóu,碡zhóu,肘zhǒu,帚zhǒu,菷zhǒu,晭zhǒu,睭zhǒu,箒zhǒu,鯞zhǒu,疛zhǒu,椆zhòu,詶zhòu,薵zhòu,纣zhòu,伷zhòu,呪zhòu,咒zhòu,宙zhòu,绉zhòu,冑zhòu,咮zhòu,昼zhòu,紂zhòu,胄zhòu,荮zhòu,晝zhòu,皱zhòu,酎zhòu,粙zhòu,葤zhòu,詋zhòu,甃zhòu,皺zhòu,駎zhòu,噣zhòu,縐zhòu,骤zhòu,籕zhòu,籒zhòu,驟zhòu,籀zhòu,蕏zhū,藷zhū,朱zhū,劯zhū,侏zhū,诛zhū,邾zhū,洙zhū,茱zhū,株zhū,珠zhū,诸zhū,猪zhū,硃zhū,袾zhū,铢zhū,絑zhū,蛛zhū,誅zhū,跦zhū,槠zhū,潴zhū,蝫zhū,銖zhū,橥zhū,諸zhū,豬zhū,駯zhū,鮢zhū,瀦zhū,櫧zhū,櫫zhū,鼄zhū,鯺zhū,蠩zhū,秼zhū,騶zhū,鴸zhū,薥zhú,鸀zhú,朮zhú,竹zhú,竺zhú,炢zhú,茿zhú,烛zhú,逐zhú,笜zhú,舳zhú,瘃zhú,蓫zhú,燭zhú,蠋zhú,躅zhú,鱁zhú,劚zhú,孎zhú,灟zhú,斸zhú,曯zhú,欘zhú,蠾zhú,钃zhú,劅zhú,斀zhú,爥zhú,主zhǔ,宔zhǔ,拄zhǔ,砫zhǔ,罜zhǔ,渚zhǔ,煑zhǔ,煮zhǔ,詝zhǔ,嘱zhǔ,濐zhǔ,麈zhǔ,瞩zhǔ,囑zhǔ,矚zhǔ,尌zhù,伫zhù,佇zhù,住zhù,助zhù,纻zhù,苎zhù,坾zhù,杼zhù,苧zhù,贮zhù,驻zhù,壴zhù,柱zhù,柷zhù,殶zhù,炷zhù,祝zhù,疰zhù,眝zhù,祩zhù,竚zhù,莇zhù,紵zhù,紸zhù,羜zhù,蛀zhù,嵀zhù,筑zhù,註zhù,貯zhù,跓zhù,軴zhù,铸zhù,筯zhù,鉒zhù,馵zhù,墸zhù,箸zhù,翥zhù,樦zhù,鋳zhù,駐zhù,築zhù,篫zhù,霔zhù,麆zhù,鑄zhù,櫡zhù,注zhù,飳zhù,抓zhuā,檛zhuā,膼zhuā,髽zhuā,跩zhuǎi,睉zhuài,拽zhuài,耑zhuān,专zhuān,専zhuān,砖zhuān,專zhuān,鄟zhuān,瑼zhuān,膞zhuān,磚zhuān,諯zhuān,蟤zhuān,顓zhuān,颛zhuān,转zhuǎn,転zhuǎn,竱zhuǎn,轉zhuǎn,簨zhuàn,灷zhuàn,啭zhuàn,堟zhuàn,蒃zhuàn,瑑zhuàn,僎zhuàn,撰zhuàn,篆zhuàn,馔zhuàn,饌zhuàn,囀zhuàn,籑zhuàn,僝zhuàn,妆zhuāng,追zhuī,骓zhuī,椎zhuī,锥zhuī,錐zhuī,騅zhuī,鵻zhuī,沝zhuǐ,倕zhuì,埀zhuì,腏zhuì,笍zhuì,娷zhuì,缀zhuì,惴zhuì,甀zhuì,缒zhuì,畷zhuì,膇zhuì,墜zhuì,綴zhuì,赘zhuì,縋zhuì,諈zhuì,醊zhuì,錣zhuì,餟zhuì,礈zhuì,贅zhuì,轛zhuì,鑆zhuì,坠zhuì,湻zhūn,宒zhūn,迍zhūn,肫zhūn,窀zhūn,谆zhūn,諄zhūn,衠zhūn,訰zhūn,准zhǔn,準zhǔn,綧zhǔn,稕zhǔn,凖zhǔn,鐯zhuo,拙zhuō,炪zhuō,倬zhuō,捉zhuō,桌zhuō,涿zhuō,棳zhuō,琸zhuō,窧zhuō,槕zhuō,蠿zhuō,矠zhuó,卓zhuó,圴zhuó,犳zhuó,灼zhuó,妰zhuó,茁zhuó,斫zhuó,浊zhuó,丵zhuó,浞zhuó,诼zhuó,酌zhuó,啄zhuó,娺zhuó,梲zhuó,斮zhuó,晫zhuó,椓zhuó,琢zhuó,斱zhuó,硺zhuó,窡zhuó,罬zhuó,撯zhuó,擆zhuó,斲zhuó,禚zhuó,諁zhuó,諑zhuó,濁zhuó,擢zhuó,斵zhuó,濯zhuó,镯zhuó,鵫zhuó,灂zhuó,蠗zhuó,鐲zhuó,籗zhuó,鷟zhuó,籱zhuó,烵zhuó,謶zhuó,薋zī,菑zī,吱zī,孜zī,茊zī,兹zī,咨zī,姕zī,姿zī,茲zī,栥zī,紎zī,赀zī,资zī,崰zī,淄zī,秶zī,缁zī,谘zī,赼zī,嗞zī,嵫zī,椔zī,湽zī,滋zī,粢zī,葘zī,辎zī,鄑zī,孶zī,禌zī,觜zī,貲zī,資zī,趑zī,锱zī,緇zī,鈭zī,镃zī,龇zī,輜zī,鼒zī,澬zī,諮zī,趦zī,輺zī,錙zī,髭zī,鲻zī,鍿zī,頾zī,頿zī,鯔zī,鶅zī,鰦zī,齜zī,訾zī,訿zī,芓zī,孳zī,鎡zī,茈zǐ,泚zǐ,籽zǐ,子zǐ,姉zǐ,姊zǐ,杍zǐ,矷zǐ,秄zǐ,呰zǐ,秭zǐ,耔zǐ,虸zǐ,笫zǐ,梓zǐ,釨zǐ,啙zǐ,紫zǐ,滓zǐ,榟zǐ,橴zǐ,自zì,茡zì,倳zì,剚zì,恣zì,牸zì,渍zì,眥zì,眦zì,胔zì,胾zì,漬zì,字zì,唨zo,潨zōng,宗zōng,倧zōng,综zōng,骔zōng,堫zōng,嵏zōng,嵕zōng,惾zōng,棕zōng,猣zōng,腙zōng,葼zōng,朡zōng,椶zōng,嵸zōng,稯zōng,緃zōng,熧zōng,緵zōng,翪zōng,蝬zōng,踨zōng,踪zōng,磫zōng,豵zōng,蹤zōng,騌zōng,鬃zōng,騣zōng,鬉zōng,鯮zōng,鯼zōng,鑁zōng,綜zōng,潀zóng,潈zóng,蓯zǒng,熜zǒng,緫zǒng,总zǒng,偬zǒng,捴zǒng,惣zǒng,愡zǒng,揔zǒng,搃zǒng,傯zǒng,蓗zǒng,摠zǒng,総zǒng,燪zǒng,總zǒng,鍯zǒng,鏓zǒng,縦zǒng,縂zǒng,纵zòng,昮zòng,疭zòng,倊zòng,猔zòng,碂zòng,粽zòng,糉zòng,瘲zòng,錝zòng,縱zòng,邹zōu,驺zōu,诹zōu,陬zōu,菆zōu,棷zōu,棸zōu,鄒zōu,緅zōu,鄹zōu,鯫zōu,黀zōu,齺zōu,芻zōu,鲰zōu,辶zǒu,赱zǒu,走zǒu,鯐zǒu,搊zǒu,奏zòu,揍zòu,租zū,菹zū,錊zū,伜zú,倅zú,紣zú,綷zú,顇zú,卆zú,足zú,卒zú,哫zú,崒zú,崪zú,族zú,稡zú,箤zú,踤zú,踿zú,镞zú,鏃zú,诅zǔ,阻zǔ,俎zǔ,爼zǔ,祖zǔ,組zǔ,詛zǔ,靻zǔ,鎺zǔ,组zǔ,鉆zuān,劗zuān,躜zuān,鑚zuān,躦zuān,繤zuǎn,缵zuǎn,纂zuǎn,纉zuǎn,籫zuǎn,纘zuǎn,欑zuàn,赚zuàn,賺zuàn,鑽zuàn,钻zuàn,攥zuàn,厜zuī,嗺zuī,樶zuī,蟕zuī,纗zuī,嶉zuǐ,槯zuǐ,嶊zuǐ,噿zuǐ,濢zuǐ,璻zuǐ,嘴zuǐ,睟zuì,枠zuì,栬zuì,絊zuì,酔zuì,晬zuì,最zuì,祽zuì,罪zuì,辠zuì,蕞zuì,醉zuì,嶵zuì,檇zuì,檌zuì,穝zuì,墫zūn,尊zūn,嶟zūn,遵zūn,樽zūn,繜zūn,罇zūn,鶎zūn,鐏zūn,鱒zūn,鷷zūn,鳟zūn,僔zǔn,噂zǔn,撙zǔn,譐zǔn,拵zùn,捘zùn,銌zùn,咗zuo,昨zuó,秨zuó,捽zuó,椊zuó,稓zuó,筰zuó,鈼zuó,阝zuǒ,左zuǒ,佐zuǒ,繓zuǒ,酢zuò,作zuò,坐zuò,阼zuò,岝zuò,岞zuò,怍zuò,侳zuò,祚zuò,胙zuò,唑zuò,座zuò,袏zuò,做zuò,葄zuò,蓙zuò,飵zuò,糳zuò,疮chuāng,牕chuāng,噇chuáng,闖chuǎng,剏chuàng,霜shuāng,欆shuāng,驦shuāng,慡shuǎng,灀shuàng,窓chuāng,瘡chuāng,闯chuǎng,仺chuàng,剙chuàng,雙shuāng,礵shuāng,鸘shuāng,樉shuǎng,谁shuí,鹴shuāng,爽shuǎng,鏯shuǎng,孀shuāng,孇shuāng,騻shuāng,焋zhuàng,幢zhuàng,撞zhuàng,隹zhuī,傱shuǎn ================================================ FILE: core/extend/vendor/autoload_538.php ================================================ * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { private $vendorDir; // PSR-4 private $prefixLengthsPsr4 = array(); private $prefixDirsPsr4 = array(); private $fallbackDirsPsr4 = array(); // PSR-0 private $prefixesPsr0 = array(); private $fallbackDirsPsr0 = array(); private $useIncludePath = false; private $classMap = array(); private $classMapAuthoritative = false; private $missingClasses = array(); private $apcuPrefix; private static $registeredLoaders = array(); public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; } public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } public function getFallbackDirs() { return $this->fallbackDirsPsr0; } public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } public function getClassMap() { return $this->classMap; } /** * @param array $classMap Class to filename map */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 base directories */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return bool|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders indexed by their corresponding vendor directories. * * @return self[] */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. */ function includeFile($file) { include $file; } ================================================ FILE: core/extend/vendor/composer/InstalledVersions.php ================================================ array ( 'pretty_version' => '1.0.0+no-version-set', 'version' => '1.0.0.0', 'aliases' => array ( ), 'reference' => NULL, 'name' => '__root__', ), 'versions' => array ( '__root__' => array ( 'pretty_version' => '1.0.0+no-version-set', 'version' => '1.0.0.0', 'aliases' => array ( ), 'reference' => NULL, ), 'maxmind-db/reader' => array ( 'pretty_version' => 'v1.12.0', 'version' => '1.12.0.0', 'aliases' => array ( ), 'reference' => '5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90', ), ), ); private static $canGetVendors; private static $installedByVendor = array(); public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); } public static function isInstalled($packageName) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return true; } } return false; } public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints($constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); } return implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } public static function getRawData() { @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); return self::$installed; } public static function getAllRawData() { return self::getInstalled(); } public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); } private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); if (self::$canGetVendors) { foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; } } } $installed[] = self::$installed; return $installed; } } ================================================ FILE: core/extend/vendor/composer/LICENSE ================================================ Copyright (c) Nils Adermann, Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/extend/vendor/composer/autoload_classmap.php ================================================ $vendorDir . '/composer/InstalledVersions.php', ); ================================================ FILE: core/extend/vendor/composer/autoload_namespaces.php ================================================ array($vendorDir . '/maxmind-db/reader/src/MaxMind/Db'), ); ================================================ FILE: core/extend/vendor/composer/autoload_real_538.php ================================================ = 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit02c6cf0724d02c2d58870d6c38bf7129::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } $loader->register(true); return $loader; } } ================================================ FILE: core/extend/vendor/composer/autoload_static.php ================================================ array ( 'MaxMind\\Db\\' => 11, ), ); public static $prefixDirsPsr4 = array ( 'MaxMind\\Db\\' => array ( 0 => __DIR__ . '/..' . '/maxmind-db/reader/src/MaxMind/Db', ), ); public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit02c6cf0724d02c2d58870d6c38bf7129::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit02c6cf0724d02c2d58870d6c38bf7129::$prefixDirsPsr4; $loader->classMap = ComposerStaticInit02c6cf0724d02c2d58870d6c38bf7129::$classMap; }, null, ClassLoader::class); } } ================================================ FILE: core/extend/vendor/composer/installed.json ================================================ { "packages": [ { "name": "maxmind-db/reader", "version": "v1.12.0", "version_normalized": "1.12.0.0", "source": { "type": "git", "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git", "reference": "5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90", "reference": "5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90", "shasum": "" }, "require": { "php": ">=7.2" }, "conflict": { "ext-maxminddb": "<1.11.1 || >=2.0.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "3.*", "phpstan/phpstan": "*", "phpunit/phpunit": ">=8.0.0,<10.0.0", "squizlabs/php_codesniffer": "3.*" }, "suggest": { "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups" }, "time": "2024-11-14T22:43:47+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "MaxMind\\Db\\": "src/MaxMind/Db" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], "authors": [ { "name": "Gregory J. Oschwald", "email": "goschwald@maxmind.com", "homepage": "https://www.maxmind.com/" } ], "description": "MaxMind DB Reader API", "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php", "keywords": [ "database", "geoip", "geoip2", "geolocation", "maxmind" ], "support": { "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues", "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.12.0" }, "install-path": "../maxmind-db/reader" } ], "dev": true, "dev-package-names": [] } ================================================ FILE: core/extend/vendor/composer/installed.php ================================================ array ( 'pretty_version' => '1.0.0+no-version-set', 'version' => '1.0.0.0', 'aliases' => array ( ), 'reference' => NULL, 'name' => '__root__', ), 'versions' => array ( '__root__' => array ( 'pretty_version' => '1.0.0+no-version-set', 'version' => '1.0.0.0', 'aliases' => array ( ), 'reference' => NULL, ), 'maxmind-db/reader' => array ( 'pretty_version' => 'v1.12.0', 'version' => '1.12.0.0', 'aliases' => array ( ), 'reference' => '5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90', ), ), ); ================================================ FILE: core/extend/vendor/composer/platform_check.php ================================================ = 70200)) { $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.0". You are running ' . PHP_VERSION . '.'; } if ($issues) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } if (!ini_get('display_errors')) { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); } elseif (!headers_sent()) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } trigger_error( 'Composer detected issues in your platform: ' . implode(' ', $issues), E_USER_ERROR ); } ================================================ FILE: core/extend/vendor/maxmind-db/reader/CHANGELOG.md ================================================ CHANGELOG ========= 1.12.0 (2024-11-14) ------------------- * Improve the error handling when the user tries to open a directory with the pure PHP reader. * Improve the typehints on arrays in the PHPDocs. 1.11.1 (2023-12-01) ------------------- * Resolve warnings when compiling the C extension. * Fix various type issues detected by PHPStan level. Pull request by LauraTaylorUK. GitHub #160. 1.11.0 (2021-10-18) ------------------- * Replace runtime define of a constant to facilitate opcache preloading. Reported by vedadkajtaz. GitHub #134. * Resolve minor issue found by the Clang static analyzer in the C extension. 1.10.1 (2021-04-14) ------------------- * Fix a `TypeError` exception in the pure PHP reader when using large databases on 32-bit PHP builds with the `bcmath` extension. Reported by dodo1708. GitHub #124. 1.10.0 (2021-02-09) ------------------- * When using the pure PHP reader, unsigned integers up to PHP_MAX_INT will now be integers in PHP rather than strings. Previously integers greater than 2^24 on 32-bit platforms and 2^56 on 64-bit platforms would be strings due to the use of `gmp` or `bcmath` to decode them. Reported by Alejandro Celaya. GitHub #119. 1.9.0 (2021-01-07) ------------------ * The `maxminddb` extension is now buildable on Windows. Pull request by Jan Ehrhardt. GitHub #115. 1.8.0 (2020-10-01) ------------------ * Fixes for PHP 8.0. Pull Request by Remi Collet. GitHub #108. 1.7.0 (2020-08-07) ------------------ * IMPORTANT: PHP 7.2 or greater is now required. * The extension no longer depends on the pure PHP classes in `maxmind-db/reader`. You can use it independently. * Type hints have been added to both the pure PHP implementation and the extension. * The `metadata` method on the reader now returns a new copy of the metadata object rather than the actual object used by the reader. * Work around PHP `is_readable()` bug. Reported by Ben Roberts. GitHub #92. * This is the first release of the extension as a PECL package. GitHub #34. 1.6.0 (2019-12-19) ------------------ * 1.5.0 and 1.5.1 contained a possible memory corruptions when using `getWithPrefixLen`. This has been fixed. Reported by proton-ab. GitHub #96. * The `composer.json` file now conflicts with all versions of the `maxminddb` C extension less than the Composer version. This is to reduce the chance of having an older, conflicting version of the extension installed. You will need to upgrade the extension before running `composer update`. Pull request by Benoît Burnichon. GitHub #97. 1.5.1 (2019-12-12) ------------------ * Minor performance improvements. * Make tests pass with older versions of libmaxminddb. PR by Remi Collet. GitHub #90. * Test enhancements. PR by Chun-Sheng, Li. GitHub #91. 1.5.0 (2019-09-30) ------------------ * PHP 5.6 or greater is now required. * The C extension now supports PHP 8. Pull request by John Boehr. GitHub #87. * A new method, `getWithPrefixLen`, was added to the `Reader` class. This method returns an array containing the record and the prefix length for that record. GitHub #89. 1.4.1 (2019-01-04) ------------------ * The `maxminddb` extension now returns a string when a `uint32` value is greater than `LONG_MAX`. Previously, the value would overflow. This generally only affects 32-bit machines. Reported by Remi Collet. GitHub #79. * For `uint64` values, the `maxminddb` extension now returns an integer rather than a string when the value is less than or equal to `LONG_MAX`. This more closely matches the behavior of the pure PHP reader. 1.4.0 (2018-11-20) ------------------ * The `maxminddb` extension now has the arginfo when using reflection. PR by Remi Collet. GitHub #75. * The `maxminddb` extension now provides `MINFO()` function that displays the extension version and the libmaxminddb version. PR by Remi Collet. GitHub #74. * The `maxminddb` `configure` script now uses `pkg-config` when available to get libmaxmindb build info. PR by Remi Collet. GitHub #73. * The pure PHP reader now correctly decodes integers on 32-bit platforms. Previously, large integers would overflow. Reported by Remi Collet. GitHub #77. * There are small performance improvements for the pure PHP reader. 1.3.0 (2018-02-21) ------------------ * IMPORTANT: The `maxminddb` extension now obeys `open_basedir`. If `open_basedir` is set, you _must_ store the database within the specified directory. Placing the file outside of this directory will result in an exception. Please test your integration before upgrading the extension. This does not affect the pure PHP implementation, which has always had this restriction. Reported by Benoît Burnichon. GitHub #61. * A custom `autoload.php` file is provided for installations without Composer. GitHub #56. 1.2.0 (2017-10-27) ------------------ * PHP 5.4 or greater is now required. * The `Reader` class for the `maxminddb` extension is no longer final. This was change to match the behavior of the pure PHP class. Reported and fixed by venyii. GitHub #52 & #54. 1.1.3 (2017-01-19) ------------------ * Fix incorrect version in `ext/php_maxminddb.h`. GitHub #48. 1.1.2 (2016-11-22) ------------------ * Searching for database metadata only occurs within the last 128KB (128 * 1024 bytes) of the file, speeding detection of corrupt datafiles. Reported by Eric Teubert. GitHub #42. * Suggest relevant extensions when installing with Composer. GitHub #37. 1.1.1 (2016-09-15) ------------------ * Development files were added to the `.gitattributes` as `export-ignore` so that they are not part of the Composer release. Pull request by Michele Locati. GitHub #39. 1.1.0 (2016-01-04) ------------------ * The MaxMind DB extension now supports PHP 7. Pull request by John Boehr. GitHub #27. 1.0.3 (2015-03-13) ------------------ * All uses of `strlen` were removed. This should prevent issues in situations where the function is overloaded or otherwise broken. 1.0.2 (2015-01-19) ------------------ * Previously the MaxMind DB extension would cause a segfault if the Reader object's destructor was called without first having called the constructor. (Reported by Matthias Saou & Juan Peri. GitHub #20.) 1.0.1 (2015-01-12) ------------------ * In the last several releases, the version number in the extension was incorrect. This release is being done to correct it. No other code changes are included. 1.0.0 (2014-09-22) ------------------ * First production release. * In the pure PHP reader, a string length test after `fread()` was replaced with the difference between the start pointer and the end pointer. This provided a 15% speed increase. 0.3.3 (2014-09-15) ------------------ * Clarified behavior of 128-bit type in documentation. * Updated phpunit and fixed some test breakage from the newer version. 0.3.2 (2014-09-10) ------------------ * Fixed invalid reference to global class RuntimeException from namespaced code. Fixed by Steven Don. GitHub issue #15. * Additional documentation of `Metadata` class as well as misc. documentation cleanup. 0.3.1 (2014-05-01) ------------------ * The API now works when `mbstring.func_overload` is set. * BCMath is no longer required. If the decoder encounters a big integer, it will try to use GMP and then BCMath. If both of those fail, it will throw an exception. No databases released by MaxMind currently use big integers. * The API now officially supports HHVM when using the pure PHP reader. 0.3.0 (2014-02-19) ------------------ * This API is now licensed under the Apache License, Version 2.0. * The code for the C extension was cleaned up, fixing several potential issues. 0.2.0 (2013-10-21) ------------------ * Added optional C extension for using libmaxminddb in place of the pure PHP reader. * Significantly improved error handling in pure PHP reader. * Improved performance for IPv4 lookups in an IPv6 database. 0.1.0 (2013-07-16) ------------------ * Initial release ================================================ FILE: core/extend/vendor/maxmind-db/reader/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: core/extend/vendor/maxmind-db/reader/README.md ================================================ # MaxMind DB Reader PHP API # ## Description ## This is the PHP API for reading MaxMind DB files. MaxMind DB is a binary file format that stores data indexed by IP address subnets (IPv4 or IPv6). ## Installation (Composer) ## We recommend installing this package with [Composer](https://getcomposer.org/). ### Download Composer ### To download Composer, run in the root directory of your project: ```bash curl -sS https://getcomposer.org/installer | php ``` You should now have the file `composer.phar` in your project directory. ### Install Dependencies ### Run in your project root: ``` php composer.phar require maxmind-db/reader:~1.0 ``` You should now have the files `composer.json` and `composer.lock` as well as the directory `vendor` in your project directory. If you use a version control system, `composer.json` should be added to it. ### Require Autoloader ### After installing the dependencies, you need to require the Composer autoloader from your code: ```php require 'vendor/autoload.php'; ``` ## Installation (Standalone) ## If you don't want to use Composer for some reason, a custom `autoload.php` is provided for you in the project root. To use the library, simply include that file, ```php require('/path/to/MaxMind-DB-Reader-php/autoload.php'); ``` and then instantiate the reader class normally: ```php use MaxMind\Db\Reader; $reader = new Reader('example.mmdb'); ``` ## Installation (RPM) RPMs are available in the [official Fedora repository](https://apps.fedoraproject.org/packages/php-maxminddb). To install on Fedora, run: ```bash dnf install php-maxminddb ``` To install on CentOS or RHEL 7, first [enable the EPEL repository](https://fedoraproject.org/wiki/EPEL) and then run: ```bash yum install php-maxminddb ``` Please note that these packages are *not* maintained by MaxMind. ## Usage ## ## Example ## ```php get($ipAddress)); // getWithPrefixLen returns an array containing the record and the // associated prefix length for that record. print_r($reader->getWithPrefixLen($ipAddress)); $reader->close(); ``` ## Optional PHP C Extension ## MaxMind provides an optional C extension that is a drop-in replacement for `MaxMind\Db\Reader`. In order to use this extension, you must install the Reader API as described above and install the extension as described below. If you are using an autoloader, no changes to your code should be necessary. ### Installing Extension ### First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as described in its [README.md file](https://github.com/maxmind/libmaxminddb/blob/main/README.md#installing-from-a-tarball). After successfully installing libmaxmindb, you may install the extension from [pecl](https://pecl.php.net/package/maxminddb): ``` pecl install maxminddb ``` Alternatively, you may install it from the source. To do so, run the following commands from the top-level directory of this distribution: ``` cd ext phpize ./configure make make test sudo make install ``` You then must load your extension. The recommended method is to add the following to your `php.ini` file: ``` extension=maxminddb.so ``` Note: You may need to install the PHP development package on your OS such as php5-dev for Debian-based systems or php-devel for RedHat/Fedora-based ones. ## 128-bit Integer Support ## The MaxMind DB format includes 128-bit unsigned integer as a type. Although no MaxMind-distributed database currently makes use of this type, both the pure PHP reader and the C extension support this type. The pure PHP reader requires gmp or bcmath to read databases with 128-bit unsigned integers. The integer is currently returned as a hexadecimal string (prefixed with "0x") by the C extension and a decimal string (no prefix) by the pure PHP reader. Any change to make the reader implementations always return either a hexadecimal or decimal representation of the integer will NOT be considered a breaking change. ## Support ## Please report all issues with this code using the [GitHub issue tracker](https://github.com/maxmind/MaxMind-DB-Reader-php/issues). If you are having an issue with a MaxMind service that is not specific to the client API, please see [our support page](https://www.maxmind.com/en/support). ## Requirements ## This library requires PHP 7.2 or greater. The GMP or BCMath extension may be required to read some databases using the pure PHP API. ## Contributing ## Patches and pull requests are encouraged. All code should follow the PSR-1 and PSR-2 style guidelines. Please include unit tests whenever possible. ## Versioning ## The MaxMind DB Reader PHP API uses [Semantic Versioning](https://semver.org/). ## Copyright and License ## This software is Copyright (c) 2014-2024 by MaxMind, Inc. This is free software, licensed under the Apache License, Version 2.0. ================================================ FILE: core/extend/vendor/maxmind-db/reader/autoload.php ================================================ class. * * @param string $class * the name of the class to load */ function mmdb_autoload($class): void { /* * A project-specific mapping between the namespaces and where * they're located. By convention, we include the trailing * slashes. The one-element array here simply makes things easy * to extend in the future if (for example) the test classes * begin to use one another. */ $namespace_map = ['MaxMind\Db\\' => __DIR__ . '/src/MaxMind/Db/']; foreach ($namespace_map as $prefix => $dir) { // First swap out the namespace prefix with a directory... $path = str_replace($prefix, $dir, $class); // replace the namespace separator with a directory separator... $path = str_replace('\\', '/', $path); // and finally, add the PHP file extension to the result. $path .= '.php'; // $path should now contain the path to a PHP file defining $class if (file_exists($path)) { include $path; } } } spl_autoload_register('mmdb_autoload'); ================================================ FILE: core/extend/vendor/maxmind-db/reader/composer.json ================================================ { "name": "maxmind-db/reader", "description": "MaxMind DB Reader API", "keywords": ["database", "geoip", "geoip2", "geolocation", "maxmind"], "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php", "type": "library", "license": "Apache-2.0", "authors": [ { "name": "Gregory J. Oschwald", "email": "goschwald@maxmind.com", "homepage": "https://www.maxmind.com/" } ], "require": { "php": ">=7.2" }, "suggest": { "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups" }, "conflict": { "ext-maxminddb": "<1.11.1 || >=2.0.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "3.*", "phpunit/phpunit": ">=8.0.0,<10.0.0", "squizlabs/php_codesniffer": "3.*", "phpstan/phpstan": "*" }, "autoload": { "psr-4": { "MaxMind\\Db\\": "src/MaxMind/Db" } }, "autoload-dev": { "psr-4": { "MaxMind\\Db\\Test\\Reader\\": "tests/MaxMind/Db/Test/Reader" } } } ================================================ FILE: core/extend/vendor/maxmind-db/reader/ext/config.m4 ================================================ PHP_ARG_WITH(maxminddb, [Whether to enable the MaxMind DB Reader extension], [ --with-maxminddb Enable MaxMind DB Reader extension support]) PHP_ARG_ENABLE(maxminddb-debug, for MaxMind DB debug support, [ --enable-maxminddb-debug Enable MaxMind DB debug support], no, no) if test $PHP_MAXMINDDB != "no"; then AC_PATH_PROG(PKG_CONFIG, pkg-config, no) AC_MSG_CHECKING(for libmaxminddb) if test -x "$PKG_CONFIG" && $PKG_CONFIG --exists libmaxminddb; then dnl retrieve build options from pkg-config if $PKG_CONFIG libmaxminddb --atleast-version 1.0.0; then LIBMAXMINDDB_INC=`$PKG_CONFIG libmaxminddb --cflags` LIBMAXMINDDB_LIB=`$PKG_CONFIG libmaxminddb --libs` LIBMAXMINDDB_VER=`$PKG_CONFIG libmaxminddb --modversion` AC_MSG_RESULT(found version $LIBMAXMINDDB_VER) else AC_MSG_ERROR(system libmaxminddb must be upgraded to version >= 1.0.0) fi PHP_EVAL_LIBLINE($LIBMAXMINDDB_LIB, MAXMINDDB_SHARED_LIBADD) PHP_EVAL_INCLINE($LIBMAXMINDDB_INC) else AC_MSG_RESULT(pkg-config information missing) AC_MSG_WARN(will use libmaxmxinddb from compiler default path) PHP_CHECK_LIBRARY(maxminddb, MMDB_open) PHP_ADD_LIBRARY(maxminddb, 1, MAXMINDDB_SHARED_LIBADD) fi if test $PHP_MAXMINDDB_DEBUG != "no"; then CFLAGS="$CFLAGS -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror" fi PHP_SUBST(MAXMINDDB_SHARED_LIBADD) PHP_NEW_EXTENSION(maxminddb, maxminddb.c, $ext_shared) fi ================================================ FILE: core/extend/vendor/maxmind-db/reader/ext/config.w32 ================================================ ARG_WITH("maxminddb", "Enable MaxMind DB Reader extension support", "no"); if (PHP_MAXMINDDB == "yes") { if (CHECK_HEADER_ADD_INCLUDE("maxminddb.h", "CFLAGS_MAXMINDDB", PHP_MAXMINDDB + ";" + PHP_PHP_BUILD + "\\include\\maxminddb") && CHECK_LIB("libmaxminddb.lib", "maxminddb", PHP_MAXMINDDB)) { EXTENSION("maxminddb", "maxminddb.c"); } else { WARNING('Could not find maxminddb.h or libmaxminddb.lib; skipping'); } } ================================================ FILE: core/extend/vendor/maxmind-db/reader/ext/maxminddb.c ================================================ /* MaxMind, Inc., licenses this file to you under the Apache License, Version * 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include "php_maxminddb.h" #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "Zend/zend_exceptions.h" #include "Zend/zend_types.h" #include "ext/spl/spl_exceptions.h" #include "ext/standard/info.h" #include #ifdef ZTS #include #endif #define __STDC_FORMAT_MACROS #include #define PHP_MAXMINDDB_NS ZEND_NS_NAME("MaxMind", "Db") #define PHP_MAXMINDDB_READER_NS ZEND_NS_NAME(PHP_MAXMINDDB_NS, "Reader") #define PHP_MAXMINDDB_METADATA_NS \ ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "Metadata") #define PHP_MAXMINDDB_READER_EX_NS \ ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "InvalidDatabaseException") #define Z_MAXMINDDB_P(zv) php_maxminddb_fetch_object(Z_OBJ_P(zv)) typedef size_t strsize_t; typedef zend_object free_obj_t; /* For PHP 8 compatibility */ #if PHP_VERSION_ID < 80000 #define PROP_OBJ(zv) (zv) #else #define PROP_OBJ(zv) Z_OBJ_P(zv) #define TSRMLS_C #define TSRMLS_CC #define TSRMLS_DC /* End PHP 8 compatibility */ #endif #ifndef ZEND_ACC_CTOR #define ZEND_ACC_CTOR 0 #endif /* IS_MIXED was added in 2020 */ #ifndef IS_MIXED #define IS_MIXED IS_UNDEF #endif /* ZEND_THIS was added in 7.4 */ #ifndef ZEND_THIS #define ZEND_THIS (&EX(This)) #endif typedef struct _maxminddb_obj { MMDB_s *mmdb; zend_object std; } maxminddb_obj; PHP_FUNCTION(maxminddb); static int get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len); static const MMDB_entry_data_list_s * handle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC); static const MMDB_entry_data_list_s * handle_array(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC); static const MMDB_entry_data_list_s * handle_map(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC); static void handle_uint128(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC); static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC); static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC); #define CHECK_ALLOCATED(val) \ if (!val) { \ zend_error(E_ERROR, "Out of memory"); \ return; \ } static zend_object_handlers maxminddb_obj_handlers; static zend_class_entry *maxminddb_ce, *maxminddb_exception_ce, *metadata_ce; static inline maxminddb_obj * php_maxminddb_fetch_object(zend_object *obj TSRMLS_DC) { return (maxminddb_obj *)((char *)(obj)-XtOffsetOf(maxminddb_obj, std)); } ZEND_BEGIN_ARG_INFO_EX(arginfo_maxminddbreader_construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, db_file, IS_STRING, 0) ZEND_END_ARG_INFO() PHP_METHOD(MaxMind_Db_Reader, __construct) { char *db_file = NULL; strsize_t name_len; zval *_this_zval = NULL; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &_this_zval, maxminddb_ce, &db_file, &name_len) == FAILURE) { return; } if (0 != php_check_open_basedir(db_file TSRMLS_CC) || 0 != access(db_file, R_OK)) { zend_throw_exception_ex( spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "The file \"%s\" does not exist or is not readable.", db_file); return; } MMDB_s *mmdb = (MMDB_s *)ecalloc(1, sizeof(MMDB_s)); int const status = MMDB_open(db_file, MMDB_MODE_MMAP, mmdb); if (MMDB_SUCCESS != status) { zend_throw_exception_ex( maxminddb_exception_ce, 0 TSRMLS_CC, "Error opening database file (%s). Is this a valid " "MaxMind DB file?", db_file); efree(mmdb); return; } maxminddb_obj *mmdb_obj = Z_MAXMINDDB_P(ZEND_THIS); mmdb_obj->mmdb = mmdb; } ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_maxminddbreader_get, 0, 1, IS_MIXED, 1) ZEND_ARG_TYPE_INFO(0, ip_address, IS_STRING, 0) ZEND_END_ARG_INFO() PHP_METHOD(MaxMind_Db_Reader, get) { int prefix_len = 0; get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, return_value, &prefix_len); } ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_maxminddbreader_getWithPrefixLen, 0, 1, IS_ARRAY, 1) ZEND_ARG_TYPE_INFO(0, ip_address, IS_STRING, 0) ZEND_END_ARG_INFO() PHP_METHOD(MaxMind_Db_Reader, getWithPrefixLen) { zval record, z_prefix_len; int prefix_len = 0; if (get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, &record, &prefix_len) == FAILURE) { return; } array_init(return_value); add_next_index_zval(return_value, &record); ZVAL_LONG(&z_prefix_len, prefix_len); add_next_index_zval(return_value, &z_prefix_len); } static int get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) { char *ip_address = NULL; strsize_t name_len; zval *this_zval = NULL; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &this_zval, maxminddb_ce, &ip_address, &name_len) == FAILURE) { return FAILURE; } const maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(ZEND_THIS); MMDB_s *mmdb = mmdb_obj->mmdb; if (NULL == mmdb) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Attempt to read from a closed MaxMind DB."); return FAILURE; } struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_flags = AI_NUMERICHOST, /* We set ai_socktype so that we only get one result back */ .ai_socktype = SOCK_STREAM}; struct addrinfo *addresses = NULL; int gai_status = getaddrinfo(ip_address, NULL, &hints, &addresses); if (gai_status) { zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "The value \"%s\" is not a valid IP address.", ip_address); return FAILURE; } if (!addresses || !addresses->ai_addr) { zend_throw_exception_ex( spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "getaddrinfo was successful but failed to set the addrinfo"); return FAILURE; } int sa_family = addresses->ai_addr->sa_family; int mmdb_error = MMDB_SUCCESS; MMDB_lookup_result_s result = MMDB_lookup_sockaddr(mmdb, addresses->ai_addr, &mmdb_error); freeaddrinfo(addresses); if (MMDB_SUCCESS != mmdb_error) { zend_class_entry *ex; if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) { ex = spl_ce_InvalidArgumentException; } else { ex = maxminddb_exception_ce; } zend_throw_exception_ex(ex, 0 TSRMLS_CC, "Error looking up %s. %s", ip_address, MMDB_strerror(mmdb_error)); return FAILURE; } *prefix_len = result.netmask; if (sa_family == AF_INET && mmdb->metadata.ip_version == 6) { /* We return the prefix length given the IPv4 address. If there is no IPv4 subtree, we return a prefix length of 0. */ *prefix_len = *prefix_len >= 96 ? *prefix_len - 96 : 0; } if (!result.found_entry) { ZVAL_NULL(record); return SUCCESS; } MMDB_entry_data_list_s *entry_data_list = NULL; int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list); if (MMDB_SUCCESS != status) { zend_throw_exception_ex(maxminddb_exception_ce, 0 TSRMLS_CC, "Error while looking up data for %s. %s", ip_address, MMDB_strerror(status)); MMDB_free_entry_data_list(entry_data_list); return FAILURE; } else if (NULL == entry_data_list) { zend_throw_exception_ex( maxminddb_exception_ce, 0 TSRMLS_CC, "Error while looking up data for %s. Your database may " "be corrupt or you have found a bug in libmaxminddb.", ip_address); return FAILURE; } const MMDB_entry_data_list_s *rv = handle_entry_data_list(entry_data_list, record TSRMLS_CC); if (rv == NULL) { /* We should have already thrown the exception in handle_entry_data_list */ return FAILURE; } MMDB_free_entry_data_list(entry_data_list); return SUCCESS; } ZEND_BEGIN_ARG_INFO_EX(arginfo_maxminddbreader_void, 0, 0, 0) ZEND_END_ARG_INFO() PHP_METHOD(MaxMind_Db_Reader, metadata) { zval *this_zval = NULL; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &this_zval, maxminddb_ce) == FAILURE) { return; } const maxminddb_obj *const mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(this_zval); if (NULL == mmdb_obj->mmdb) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Attempt to read from a closed MaxMind DB."); return; } object_init_ex(return_value, metadata_ce); MMDB_entry_data_list_s *entry_data_list; MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list); zval metadata_array; const MMDB_entry_data_list_s *rv = handle_entry_data_list(entry_data_list, &metadata_array TSRMLS_CC); if (rv == NULL) { return; } MMDB_free_entry_data_list(entry_data_list); zend_call_method_with_1_params(PROP_OBJ(return_value), metadata_ce, &metadata_ce->constructor, ZEND_CONSTRUCTOR_FUNC_NAME, NULL, &metadata_array); zval_ptr_dtor(&metadata_array); } PHP_METHOD(MaxMind_Db_Reader, close) { zval *this_zval = NULL; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &this_zval, maxminddb_ce) == FAILURE) { return; } maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(this_zval); if (NULL == mmdb_obj->mmdb) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Attempt to close a closed MaxMind DB."); return; } MMDB_close(mmdb_obj->mmdb); efree(mmdb_obj->mmdb); mmdb_obj->mmdb = NULL; } static const MMDB_entry_data_list_s * handle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC) { switch (entry_data_list->entry_data.type) { case MMDB_DATA_TYPE_MAP: return handle_map(entry_data_list, z_value TSRMLS_CC); case MMDB_DATA_TYPE_ARRAY: return handle_array(entry_data_list, z_value TSRMLS_CC); case MMDB_DATA_TYPE_UTF8_STRING: ZVAL_STRINGL(z_value, entry_data_list->entry_data.utf8_string, entry_data_list->entry_data.data_size); break; case MMDB_DATA_TYPE_BYTES: ZVAL_STRINGL(z_value, (char const *)entry_data_list->entry_data.bytes, entry_data_list->entry_data.data_size); break; case MMDB_DATA_TYPE_DOUBLE: ZVAL_DOUBLE(z_value, entry_data_list->entry_data.double_value); break; case MMDB_DATA_TYPE_FLOAT: ZVAL_DOUBLE(z_value, entry_data_list->entry_data.float_value); break; case MMDB_DATA_TYPE_UINT16: ZVAL_LONG(z_value, entry_data_list->entry_data.uint16); break; case MMDB_DATA_TYPE_UINT32: handle_uint32(entry_data_list, z_value TSRMLS_CC); break; case MMDB_DATA_TYPE_BOOLEAN: ZVAL_BOOL(z_value, entry_data_list->entry_data.boolean); break; case MMDB_DATA_TYPE_UINT64: handle_uint64(entry_data_list, z_value TSRMLS_CC); break; case MMDB_DATA_TYPE_UINT128: handle_uint128(entry_data_list, z_value TSRMLS_CC); break; case MMDB_DATA_TYPE_INT32: ZVAL_LONG(z_value, entry_data_list->entry_data.int32); break; default: zend_throw_exception_ex(maxminddb_exception_ce, 0 TSRMLS_CC, "Invalid data type arguments: %d", entry_data_list->entry_data.type); return NULL; } return entry_data_list; } static const MMDB_entry_data_list_s * handle_map(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC) { array_init(z_value); const uint32_t map_size = entry_data_list->entry_data.data_size; uint32_t i; for (i = 0; i < map_size && entry_data_list; i++) { entry_data_list = entry_data_list->next; char *key = estrndup(entry_data_list->entry_data.utf8_string, entry_data_list->entry_data.data_size); if (NULL == key) { zend_throw_exception_ex(maxminddb_exception_ce, 0 TSRMLS_CC, "Invalid data type arguments"); return NULL; } entry_data_list = entry_data_list->next; zval new_value; entry_data_list = handle_entry_data_list(entry_data_list, &new_value TSRMLS_CC); if (entry_data_list != NULL) { add_assoc_zval(z_value, key, &new_value); } efree(key); } return entry_data_list; } static const MMDB_entry_data_list_s * handle_array(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC) { const uint32_t size = entry_data_list->entry_data.data_size; array_init(z_value); uint32_t i; for (i = 0; i < size && entry_data_list; i++) { entry_data_list = entry_data_list->next; zval new_value; entry_data_list = handle_entry_data_list(entry_data_list, &new_value TSRMLS_CC); if (entry_data_list != NULL) { add_next_index_zval(z_value, &new_value); } } return entry_data_list; } static void handle_uint128(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC) { uint64_t high = 0; uint64_t low = 0; #if MMDB_UINT128_IS_BYTE_ARRAY int i; for (i = 0; i < 8; i++) { high = (high << 8) | entry_data_list->entry_data.uint128[i]; } for (i = 8; i < 16; i++) { low = (low << 8) | entry_data_list->entry_data.uint128[i]; } #else high = entry_data_list->entry_data.uint128 >> 64; low = (uint64_t)entry_data_list->entry_data.uint128; #endif char *num_str; spprintf(&num_str, 0, "0x%016" PRIX64 "%016" PRIX64, high, low); CHECK_ALLOCATED(num_str); ZVAL_STRING(z_value, num_str); efree(num_str); } static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC) { uint32_t val = entry_data_list->entry_data.uint32; #if LONG_MAX >= UINT32_MAX ZVAL_LONG(z_value, val); return; #else if (val <= LONG_MAX) { ZVAL_LONG(z_value, val); return; } char *int_str; spprintf(&int_str, 0, "%" PRIu32, val); CHECK_ALLOCATED(int_str); ZVAL_STRING(z_value, int_str); efree(int_str); #endif } static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list, zval *z_value TSRMLS_DC) { uint64_t val = entry_data_list->entry_data.uint64; #if LONG_MAX >= UINT64_MAX ZVAL_LONG(z_value, val); return; #else if (val <= LONG_MAX) { ZVAL_LONG(z_value, val); return; } char *int_str; spprintf(&int_str, 0, "%" PRIu64, val); CHECK_ALLOCATED(int_str); ZVAL_STRING(z_value, int_str); efree(int_str); #endif } static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) { maxminddb_obj *obj = php_maxminddb_fetch_object((zend_object *)object TSRMLS_CC); if (obj->mmdb != NULL) { MMDB_close(obj->mmdb); efree(obj->mmdb); } zend_object_std_dtor(&obj->std TSRMLS_CC); } static zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) { maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj)); zend_object_std_init(&obj->std, type TSRMLS_CC); object_properties_init(&(obj->std), type); obj->std.handlers = &maxminddb_obj_handlers; return &obj->std; } /* clang-format off */ static zend_function_entry maxminddb_methods[] = { PHP_ME(MaxMind_Db_Reader, __construct, arginfo_maxminddbreader_construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) PHP_ME(MaxMind_Db_Reader, close, arginfo_maxminddbreader_void, ZEND_ACC_PUBLIC) PHP_ME(MaxMind_Db_Reader, get, arginfo_maxminddbreader_get, ZEND_ACC_PUBLIC) PHP_ME(MaxMind_Db_Reader, getWithPrefixLen, arginfo_maxminddbreader_getWithPrefixLen, ZEND_ACC_PUBLIC) PHP_ME(MaxMind_Db_Reader, metadata, arginfo_maxminddbreader_void, ZEND_ACC_PUBLIC) { NULL, NULL, NULL } }; /* clang-format on */ ZEND_BEGIN_ARG_INFO_EX(arginfo_metadata_construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, metadata, IS_ARRAY, 0) ZEND_END_ARG_INFO() PHP_METHOD(MaxMind_Db_Reader_Metadata, __construct) { zval *object = NULL; zval *metadata_array = NULL; zend_long node_count = 0; zend_long record_size = 0; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oa", &object, metadata_ce, &metadata_array) == FAILURE) { return; } zval *tmp = NULL; if ((tmp = zend_hash_str_find(HASH_OF(metadata_array), "binary_format_major_version", sizeof("binary_format_major_version") - 1))) { zend_update_property(metadata_ce, PROP_OBJ(object), "binaryFormatMajorVersion", sizeof("binaryFormatMajorVersion") - 1, tmp); } if ((tmp = zend_hash_str_find(HASH_OF(metadata_array), "binary_format_minor_version", sizeof("binary_format_minor_version") - 1))) { zend_update_property(metadata_ce, PROP_OBJ(object), "binaryFormatMinorVersion", sizeof("binaryFormatMinorVersion") - 1, tmp); } if ((tmp = zend_hash_str_find(HASH_OF(metadata_array), "build_epoch", sizeof("build_epoch") - 1))) { zend_update_property(metadata_ce, PROP_OBJ(object), "buildEpoch", sizeof("buildEpoch") - 1, tmp); } if ((tmp = zend_hash_str_find(HASH_OF(metadata_array), "database_type", sizeof("database_type") - 1))) { zend_update_property(metadata_ce, PROP_OBJ(object), "databaseType", sizeof("databaseType") - 1, tmp); } if ((tmp = zend_hash_str_find(HASH_OF(metadata_array), "description", sizeof("description") - 1))) { zend_update_property(metadata_ce, PROP_OBJ(object), "description", sizeof("description") - 1, tmp); } if ((tmp = zend_hash_str_find(HASH_OF(metadata_array), "ip_version", sizeof("ip_version") - 1))) { zend_update_property(metadata_ce, PROP_OBJ(object), "ipVersion", sizeof("ipVersion") - 1, tmp); } if ((tmp = zend_hash_str_find( HASH_OF(metadata_array), "languages", sizeof("languages") - 1))) { zend_update_property(metadata_ce, PROP_OBJ(object), "languages", sizeof("languages") - 1, tmp); } if ((tmp = zend_hash_str_find(HASH_OF(metadata_array), "record_size", sizeof("record_size") - 1))) { zend_update_property(metadata_ce, PROP_OBJ(object), "recordSize", sizeof("recordSize") - 1, tmp); if (Z_TYPE_P(tmp) == IS_LONG) { record_size = Z_LVAL_P(tmp); } } if (record_size != 0) { zend_update_property_long(metadata_ce, PROP_OBJ(object), "nodeByteSize", sizeof("nodeByteSize") - 1, record_size / 4); } if ((tmp = zend_hash_str_find(HASH_OF(metadata_array), "node_count", sizeof("node_count") - 1))) { zend_update_property(metadata_ce, PROP_OBJ(object), "nodeCount", sizeof("nodeCount") - 1, tmp); if (Z_TYPE_P(tmp) == IS_LONG) { node_count = Z_LVAL_P(tmp); } } if (record_size != 0) { zend_update_property_long(metadata_ce, PROP_OBJ(object), "searchTreeSize", sizeof("searchTreeSize") - 1, record_size * node_count / 4); } } // clang-format off static zend_function_entry metadata_methods[] = { PHP_ME(MaxMind_Db_Reader_Metadata, __construct, arginfo_metadata_construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) {NULL, NULL, NULL} }; // clang-format on PHP_MINIT_FUNCTION(maxminddb) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_EX_NS, NULL); maxminddb_exception_ce = zend_register_internal_class_ex(&ce, zend_ce_exception); INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_NS, maxminddb_methods); maxminddb_ce = zend_register_internal_class(&ce TSRMLS_CC); maxminddb_ce->create_object = maxminddb_create_handler; INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_METADATA_NS, metadata_methods); metadata_ce = zend_register_internal_class(&ce TSRMLS_CC); zend_declare_property_null(metadata_ce, "binaryFormatMajorVersion", sizeof("binaryFormatMajorVersion") - 1, ZEND_ACC_PUBLIC); zend_declare_property_null(metadata_ce, "binaryFormatMinorVersion", sizeof("binaryFormatMinorVersion") - 1, ZEND_ACC_PUBLIC); zend_declare_property_null( metadata_ce, "buildEpoch", sizeof("buildEpoch") - 1, ZEND_ACC_PUBLIC); zend_declare_property_null(metadata_ce, "databaseType", sizeof("databaseType") - 1, ZEND_ACC_PUBLIC); zend_declare_property_null( metadata_ce, "description", sizeof("description") - 1, ZEND_ACC_PUBLIC); zend_declare_property_null( metadata_ce, "ipVersion", sizeof("ipVersion") - 1, ZEND_ACC_PUBLIC); zend_declare_property_null( metadata_ce, "languages", sizeof("languages") - 1, ZEND_ACC_PUBLIC); zend_declare_property_null(metadata_ce, "nodeByteSize", sizeof("nodeByteSize") - 1, ZEND_ACC_PUBLIC); zend_declare_property_null( metadata_ce, "nodeCount", sizeof("nodeCount") - 1, ZEND_ACC_PUBLIC); zend_declare_property_null( metadata_ce, "recordSize", sizeof("recordSize") - 1, ZEND_ACC_PUBLIC); zend_declare_property_null(metadata_ce, "searchTreeSize", sizeof("searchTreeSize") - 1, ZEND_ACC_PUBLIC); memcpy(&maxminddb_obj_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); maxminddb_obj_handlers.clone_obj = NULL; maxminddb_obj_handlers.offset = XtOffsetOf(maxminddb_obj, std); maxminddb_obj_handlers.free_obj = maxminddb_free_storage; zend_declare_class_constant_string(maxminddb_ce, "MMDB_LIB_VERSION", sizeof("MMDB_LIB_VERSION") - 1, MMDB_lib_version() TSRMLS_CC); return SUCCESS; } static PHP_MINFO_FUNCTION(maxminddb) { php_info_print_table_start(); php_info_print_table_row(2, "MaxMind DB Reader", "enabled"); php_info_print_table_row( 2, "maxminddb extension version", PHP_MAXMINDDB_VERSION); php_info_print_table_row( 2, "libmaxminddb library version", MMDB_lib_version()); php_info_print_table_end(); } zend_module_entry maxminddb_module_entry = {STANDARD_MODULE_HEADER, PHP_MAXMINDDB_EXTNAME, NULL, PHP_MINIT(maxminddb), NULL, NULL, NULL, PHP_MINFO(maxminddb), PHP_MAXMINDDB_VERSION, STANDARD_MODULE_PROPERTIES}; #ifdef COMPILE_DL_MAXMINDDB ZEND_GET_MODULE(maxminddb) #endif ================================================ FILE: core/extend/vendor/maxmind-db/reader/ext/php_maxminddb.h ================================================ /* MaxMind, Inc., licenses this file to you under the Apache License, Version * 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include #ifndef PHP_MAXMINDDB_H #define PHP_MAXMINDDB_H 1 #define PHP_MAXMINDDB_VERSION "1.12.0" #define PHP_MAXMINDDB_EXTNAME "maxminddb" extern zend_module_entry maxminddb_module_entry; #define phpext_maxminddb_ptr &maxminddb_module_entry #endif ================================================ FILE: core/extend/vendor/maxmind-db/reader/ext/tests/001-load.phpt ================================================ --TEST-- Check for maxminddb presence --SKIPIF-- --FILE-- --EXPECT-- maxminddb extension is available ================================================ FILE: core/extend/vendor/maxmind-db/reader/ext/tests/002-final.phpt ================================================ --TEST-- Check that Reader class is not final --SKIPIF-- --FILE-- isFinal()); ?> --EXPECT-- bool(false) ================================================ FILE: core/extend/vendor/maxmind-db/reader/ext/tests/003-open-basedir.phpt ================================================ --TEST-- openbase_dir is followed --INI-- open_basedir=/--dne-- --FILE-- --EXPECTREGEX-- .*open_basedir restriction in effect.* ================================================ FILE: core/extend/vendor/maxmind-db/reader/package.xml ================================================ maxminddb pecl.php.net Reader for the MaxMind DB file format This is the PHP extension for reading MaxMind DB files. MaxMind DB is a binary file format that stores data indexed by IP address subnets (IPv4 or IPv6). Greg Oschwald oschwald goschwald@maxmind.com yes 2024-11-14 1.12.0 1.12.0 stable stable Apache License 2.0 * Improve the error handling when the user tries to open a directory with the pure PHP reader. * Improve the typehints on arrays in the PHPDocs. 7.2.0 1.10.0 maxminddb ================================================ FILE: core/extend/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php ================================================ fileStream = $fileStream; $this->pointerBase = $pointerBase; $this->pointerTestHack = $pointerTestHack; $this->switchByteOrder = $this->isPlatformLittleEndian(); } /** * @return array */ public function decode(int $offset): array { $ctrlByte = \ord(Util::read($this->fileStream, $offset, 1)); ++$offset; $type = $ctrlByte >> 5; // Pointers are a special case, we don't read the next $size bytes, we // use the size to determine the length of the pointer and then follow // it. if ($type === self::_POINTER) { [$pointer, $offset] = $this->decodePointer($ctrlByte, $offset); // for unit testing if ($this->pointerTestHack) { return [$pointer]; } [$result] = $this->decode($pointer); return [$result, $offset]; } if ($type === self::_EXTENDED) { $nextByte = \ord(Util::read($this->fileStream, $offset, 1)); $type = $nextByte + 7; if ($type < 8) { throw new InvalidDatabaseException( 'Something went horribly wrong in the decoder. An extended type ' . 'resolved to a type number < 8 (' . $type . ')' ); } ++$offset; } [$size, $offset] = $this->sizeFromCtrlByte($ctrlByte, $offset); return $this->decodeByType($type, $offset, $size); } /** * @param int<0, max> $size * * @return array{0:mixed, 1:int} */ private function decodeByType(int $type, int $offset, int $size): array { switch ($type) { case self::_MAP: return $this->decodeMap($size, $offset); case self::_ARRAY: return $this->decodeArray($size, $offset); case self::_BOOLEAN: return [$this->decodeBoolean($size), $offset]; } $newOffset = $offset + $size; $bytes = Util::read($this->fileStream, $offset, $size); switch ($type) { case self::_BYTES: case self::_UTF8_STRING: return [$bytes, $newOffset]; case self::_DOUBLE: $this->verifySize(8, $size); return [$this->decodeDouble($bytes), $newOffset]; case self::_FLOAT: $this->verifySize(4, $size); return [$this->decodeFloat($bytes), $newOffset]; case self::_INT32: return [$this->decodeInt32($bytes, $size), $newOffset]; case self::_UINT16: case self::_UINT32: case self::_UINT64: case self::_UINT128: return [$this->decodeUint($bytes, $size), $newOffset]; default: throw new InvalidDatabaseException( 'Unknown or unexpected type: ' . $type ); } } private function verifySize(int $expected, int $actual): void { if ($expected !== $actual) { throw new InvalidDatabaseException( "The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)" ); } } /** * @return array{0:array, 1:int} */ private function decodeArray(int $size, int $offset): array { $array = []; for ($i = 0; $i < $size; ++$i) { [$value, $offset] = $this->decode($offset); $array[] = $value; } return [$array, $offset]; } private function decodeBoolean(int $size): bool { return $size !== 0; } private function decodeDouble(string $bytes): float { // This assumes IEEE 754 doubles, but most (all?) modern platforms // use them. $rc = unpack('E', $bytes); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack a double value from the given bytes.' ); } [, $double] = $rc; return $double; } private function decodeFloat(string $bytes): float { // This assumes IEEE 754 floats, but most (all?) modern platforms // use them. $rc = unpack('G', $bytes); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack a float value from the given bytes.' ); } [, $float] = $rc; return $float; } private function decodeInt32(string $bytes, int $size): int { switch ($size) { case 0: return 0; case 1: case 2: case 3: $bytes = str_pad($bytes, 4, "\x00", \STR_PAD_LEFT); break; case 4: break; default: throw new InvalidDatabaseException( "The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)" ); } $rc = unpack('l', $this->maybeSwitchByteOrder($bytes)); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack a 32bit integer value from the given bytes.' ); } [, $int] = $rc; return $int; } /** * @return array{0:array, 1:int} */ private function decodeMap(int $size, int $offset): array { $map = []; for ($i = 0; $i < $size; ++$i) { [$key, $offset] = $this->decode($offset); [$value, $offset] = $this->decode($offset); $map[$key] = $value; } return [$map, $offset]; } /** * @return array{0:int, 1:int} */ private function decodePointer(int $ctrlByte, int $offset): array { $pointerSize = (($ctrlByte >> 3) & 0x3) + 1; $buffer = Util::read($this->fileStream, $offset, $pointerSize); $offset += $pointerSize; switch ($pointerSize) { case 1: $packed = \chr($ctrlByte & 0x7) . $buffer; $rc = unpack('n', $packed); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack an unsigned short value from the given bytes (pointerSize is 1).' ); } [, $pointer] = $rc; $pointer += $this->pointerBase; break; case 2: $packed = "\x00" . \chr($ctrlByte & 0x7) . $buffer; $rc = unpack('N', $packed); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack an unsigned long value from the given bytes (pointerSize is 2).' ); } [, $pointer] = $rc; $pointer += $this->pointerBase + 2048; break; case 3: $packed = \chr($ctrlByte & 0x7) . $buffer; // It is safe to use 'N' here, even on 32 bit machines as the // first bit is 0. $rc = unpack('N', $packed); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack an unsigned long value from the given bytes (pointerSize is 3).' ); } [, $pointer] = $rc; $pointer += $this->pointerBase + 526336; break; case 4: // We cannot use unpack here as we might overflow on 32 bit // machines $pointerOffset = $this->decodeUint($buffer, $pointerSize); $pointerBase = $this->pointerBase; if (\PHP_INT_MAX - $pointerBase >= $pointerOffset) { $pointer = $pointerOffset + $pointerBase; } else { throw new \RuntimeException( 'The database offset is too large to be represented on your platform.' ); } break; default: throw new InvalidDatabaseException( 'Unexpected pointer size ' . $pointerSize ); } return [$pointer, $offset]; } // @phpstan-ignore-next-line private function decodeUint(string $bytes, int $byteLength) { if ($byteLength === 0) { return 0; } // PHP integers are signed. PHP_INT_SIZE - 1 is the number of // complete bytes that can be converted to an integer. However, // we can convert another byte if the leading bit is zero. $useRealInts = $byteLength <= \PHP_INT_SIZE - 1 || ($byteLength === \PHP_INT_SIZE && (\ord($bytes[0]) & 0x80) === 0); if ($useRealInts) { $integer = 0; for ($i = 0; $i < $byteLength; ++$i) { $part = \ord($bytes[$i]); $integer = ($integer << 8) + $part; } return $integer; } // We only use gmp or bcmath if the final value is too big $integerAsString = '0'; for ($i = 0; $i < $byteLength; ++$i) { $part = \ord($bytes[$i]); if (\extension_loaded('gmp')) { $integerAsString = gmp_strval(gmp_add(gmp_mul($integerAsString, '256'), $part)); } elseif (\extension_loaded('bcmath')) { $integerAsString = bcadd(bcmul($integerAsString, '256'), (string) $part); } else { throw new \RuntimeException( 'The gmp or bcmath extension must be installed to read this database.' ); } } return $integerAsString; } /** * @return array{0:int, 1:int} */ private function sizeFromCtrlByte(int $ctrlByte, int $offset): array { $size = $ctrlByte & 0x1F; if ($size < 29) { return [$size, $offset]; } $bytesToRead = $size - 28; $bytes = Util::read($this->fileStream, $offset, $bytesToRead); if ($size === 29) { $size = 29 + \ord($bytes); } elseif ($size === 30) { $rc = unpack('n', $bytes); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack an unsigned short value from the given bytes.' ); } [, $adjust] = $rc; $size = 285 + $adjust; } else { $rc = unpack('N', "\x00" . $bytes); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack an unsigned long value from the given bytes.' ); } [, $adjust] = $rc; $size = $adjust + 65821; } return [$size, $offset + $bytesToRead]; } private function maybeSwitchByteOrder(string $bytes): string { return $this->switchByteOrder ? strrev($bytes) : $bytes; } private function isPlatformLittleEndian(): bool { $testint = 0x00FF; $packed = pack('S', $testint); $rc = unpack('v', $packed); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack an unsigned short value from the given bytes.' ); } return $testint === current($rc); } } ================================================ FILE: core/extend/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php ================================================ */ public $description; /** * This is an unsigned 16-bit integer which is always 4 or 6. It indicates * whether the database contains IPv4 or IPv6 address data. * * @var int */ public $ipVersion; /** * An array of strings, each of which is a language code. A given record * may contain data items that have been localized to some or all of * these languages. This may be undefined. * * @var array */ public $languages; /** * @var int */ public $nodeByteSize; /** * This is an unsigned 32-bit integer indicating the number of nodes in * the search tree. * * @var int */ public $nodeCount; /** * This is an unsigned 16-bit integer. It indicates the number of bits in a * record in the search tree. Note that each node consists of two records. * * @var int */ public $recordSize; /** * @var int */ public $searchTreeSize; /** * @param array $metadata */ public function __construct(array $metadata) { if (\func_num_args() !== 1) { throw new \ArgumentCountError( \sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args()) ); } $this->binaryFormatMajorVersion = $metadata['binary_format_major_version']; $this->binaryFormatMinorVersion = $metadata['binary_format_minor_version']; $this->buildEpoch = $metadata['build_epoch']; $this->databaseType = $metadata['database_type']; $this->languages = $metadata['languages']; $this->description = $metadata['description']; $this->ipVersion = $metadata['ip_version']; $this->nodeCount = $metadata['node_count']; $this->recordSize = $metadata['record_size']; $this->nodeByteSize = $this->recordSize / 4; $this->searchTreeSize = $this->nodeCount * $this->nodeByteSize; } } ================================================ FILE: core/extend/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php ================================================ $numberOfBytes */ public static function read($stream, int $offset, int $numberOfBytes): string { if ($numberOfBytes === 0) { return ''; } if (fseek($stream, $offset) === 0) { $value = fread($stream, $numberOfBytes); // We check that the number of bytes read is equal to the number // asked for. We use ftell as getting the length of $value is // much slower. if ($value !== false && ftell($stream) - $offset === $numberOfBytes) { return $value; } } throw new InvalidDatabaseException( 'The MaxMind DB file contains bad data' ); } } ================================================ FILE: core/extend/vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php ================================================ */ private static $METADATA_START_MARKER_LENGTH = 14; /** * @var int */ private static $METADATA_MAX_SIZE = 131072; // 128 * 1024 = 128KiB /** * @var Decoder */ private $decoder; /** * @var resource */ private $fileHandle; /** * @var int */ private $fileSize; /** * @var int */ private $ipV4Start; /** * @var Metadata */ private $metadata; /** * Constructs a Reader for the MaxMind DB format. The file passed to it must * be a valid MaxMind DB file such as a GeoIp2 database file. * * @param string $database the MaxMind DB file to use * * @throws \InvalidArgumentException for invalid database path or unknown arguments * @throws InvalidDatabaseException * if the database is invalid or there is an error reading * from it */ public function __construct(string $database) { if (\func_num_args() !== 1) { throw new \ArgumentCountError( \sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args()) ); } if (is_dir($database)) { // This matches the error that the C extension throws. throw new InvalidDatabaseException( "Error opening database file ($database). Is this a valid MaxMind DB file?" ); } $fileHandle = @fopen($database, 'rb'); if ($fileHandle === false) { throw new \InvalidArgumentException( "The file \"$database\" does not exist or is not readable." ); } $this->fileHandle = $fileHandle; $fileSize = @filesize($database); if ($fileSize === false) { throw new \UnexpectedValueException( "Error determining the size of \"$database\"." ); } $this->fileSize = $fileSize; $start = $this->findMetadataStart($database); $metadataDecoder = new Decoder($this->fileHandle, $start); [$metadataArray] = $metadataDecoder->decode($start); $this->metadata = new Metadata($metadataArray); $this->decoder = new Decoder( $this->fileHandle, $this->metadata->searchTreeSize + self::$DATA_SECTION_SEPARATOR_SIZE ); $this->ipV4Start = $this->ipV4StartNode(); } /** * Retrieves the record for the IP address. * * @param string $ipAddress the IP address to look up * * @throws \BadMethodCallException if this method is called on a closed database * @throws \InvalidArgumentException if something other than a single IP address is passed to the method * @throws InvalidDatabaseException * if the database is invalid or there is an error reading * from it * * @return mixed the record for the IP address */ public function get(string $ipAddress) { if (\func_num_args() !== 1) { throw new \ArgumentCountError( \sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args()) ); } [$record] = $this->getWithPrefixLen($ipAddress); return $record; } /** * Retrieves the record for the IP address and its associated network prefix length. * * @param string $ipAddress the IP address to look up * * @throws \BadMethodCallException if this method is called on a closed database * @throws \InvalidArgumentException if something other than a single IP address is passed to the method * @throws InvalidDatabaseException * if the database is invalid or there is an error reading * from it * * @return array{0:mixed, 1:int} an array where the first element is the record and the * second the network prefix length for the record */ public function getWithPrefixLen(string $ipAddress): array { if (\func_num_args() !== 1) { throw new \ArgumentCountError( \sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args()) ); } if (!\is_resource($this->fileHandle)) { throw new \BadMethodCallException( 'Attempt to read from a closed MaxMind DB.' ); } [$pointer, $prefixLen] = $this->findAddressInTree($ipAddress); if ($pointer === 0) { return [null, $prefixLen]; } return [$this->resolveDataPointer($pointer), $prefixLen]; } /** * @return array{0:int, 1:int} */ private function findAddressInTree(string $ipAddress): array { $packedAddr = @inet_pton($ipAddress); if ($packedAddr === false) { throw new \InvalidArgumentException( "The value \"$ipAddress\" is not a valid IP address." ); } $rawAddress = unpack('C*', $packedAddr); if ($rawAddress === false) { throw new InvalidDatabaseException( 'Could not unpack the unsigned char of the packed in_addr representation.' ); } $bitCount = \count($rawAddress) * 8; // The first node of the tree is always node 0, at the beginning of the // value $node = 0; $metadata = $this->metadata; // Check if we are looking up an IPv4 address in an IPv6 tree. If this // is the case, we can skip over the first 96 nodes. if ($metadata->ipVersion === 6) { if ($bitCount === 32) { $node = $this->ipV4Start; } } elseif ($metadata->ipVersion === 4 && $bitCount === 128) { throw new \InvalidArgumentException( "Error looking up $ipAddress. You attempted to look up an" . ' IPv6 address in an IPv4-only database.' ); } $nodeCount = $metadata->nodeCount; for ($i = 0; $i < $bitCount && $node < $nodeCount; ++$i) { $tempBit = 0xFF & $rawAddress[($i >> 3) + 1]; $bit = 1 & ($tempBit >> 7 - ($i % 8)); $node = $this->readNode($node, $bit); } if ($node === $nodeCount) { // Record is empty return [0, $i]; } if ($node > $nodeCount) { // Record is a data pointer return [$node, $i]; } throw new InvalidDatabaseException( 'Invalid or corrupt database. Maximum search depth reached without finding a leaf node' ); } private function ipV4StartNode(): int { // If we have an IPv4 database, the start node is the first node if ($this->metadata->ipVersion === 4) { return 0; } $node = 0; for ($i = 0; $i < 96 && $node < $this->metadata->nodeCount; ++$i) { $node = $this->readNode($node, 0); } return $node; } private function readNode(int $nodeNumber, int $index): int { $baseOffset = $nodeNumber * $this->metadata->nodeByteSize; switch ($this->metadata->recordSize) { case 24: $bytes = Util::read($this->fileHandle, $baseOffset + $index * 3, 3); $rc = unpack('N', "\x00" . $bytes); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack the unsigned long of the node.' ); } [, $node] = $rc; return $node; case 28: $bytes = Util::read($this->fileHandle, $baseOffset + 3 * $index, 4); if ($index === 0) { $middle = (0xF0 & \ord($bytes[3])) >> 4; } else { $middle = 0x0F & \ord($bytes[0]); } $rc = unpack('N', \chr($middle) . substr($bytes, $index, 3)); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack the unsigned long of the node.' ); } [, $node] = $rc; return $node; case 32: $bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 4); $rc = unpack('N', $bytes); if ($rc === false) { throw new InvalidDatabaseException( 'Could not unpack the unsigned long of the node.' ); } [, $node] = $rc; return $node; default: throw new InvalidDatabaseException( 'Unknown record size: ' . $this->metadata->recordSize ); } } /** * @return mixed */ private function resolveDataPointer(int $pointer) { $resolved = $pointer - $this->metadata->nodeCount + $this->metadata->searchTreeSize; if ($resolved >= $this->fileSize) { throw new InvalidDatabaseException( "The MaxMind DB file's search tree is corrupt" ); } [$data] = $this->decoder->decode($resolved); return $data; } /* * This is an extremely naive but reasonably readable implementation. There * are much faster algorithms (e.g., Boyer-Moore) for this if speed is ever * an issue, but I suspect it won't be. */ private function findMetadataStart(string $filename): int { $handle = $this->fileHandle; $fstat = fstat($handle); if ($fstat === false) { throw new InvalidDatabaseException( "Error getting file information ($filename)." ); } $fileSize = $fstat['size']; $marker = self::$METADATA_START_MARKER; $markerLength = self::$METADATA_START_MARKER_LENGTH; $minStart = $fileSize - min(self::$METADATA_MAX_SIZE, $fileSize); for ($offset = $fileSize - $markerLength; $offset >= $minStart; --$offset) { if (fseek($handle, $offset) !== 0) { break; } $value = fread($handle, $markerLength); if ($value === $marker) { return $offset + $markerLength; } } throw new InvalidDatabaseException( "Error opening database file ($filename). " . 'Is this a valid MaxMind DB file?' ); } /** * @throws \InvalidArgumentException if arguments are passed to the method * @throws \BadMethodCallException if the database has been closed * * @return Metadata object for the database */ public function metadata(): Metadata { if (\func_num_args()) { throw new \ArgumentCountError( \sprintf('%s() expects exactly 0 parameters, %d given', __METHOD__, \func_num_args()) ); } // Not technically required, but this makes it consistent with // C extension and it allows us to change our implementation later. if (!\is_resource($this->fileHandle)) { throw new \BadMethodCallException( 'Attempt to read from a closed MaxMind DB.' ); } return clone $this->metadata; } /** * Closes the MaxMind DB and returns resources to the system. * * @throws \Exception * if an I/O error occurs */ public function close(): void { if (\func_num_args()) { throw new \ArgumentCountError( \sprintf('%s() expects exactly 0 parameters, %d given', __METHOD__, \func_num_args()) ); } if (!\is_resource($this->fileHandle)) { throw new \BadMethodCallException( 'Attempt to close a closed MaxMind DB.' ); } fclose($this->fileHandle); } } ================================================ FILE: core/func.php ================================================ to($security); require_once('general.php'); require_once('assetsdir.php'); require_once('compresshtml.php'); require_once('getcheck.php'); require_once('gravatar.php'); require_once('replyview.php'); require_once('tongji.php'); require_once('parse.php'); require_once('extend/UserAgent.class.php'); if(Helper::options()->version >= '1.3.0'){ require_once('extend/Comments_n.php'); } else{ require_once('extend/Comments.php'); } if(Helper::options()->version >= '1.3.0'){ require_once('extend/FriendCircle_n.php'); } else{ require_once('extend/FriendCircle.php'); } require_once('usercenter.php'); function syncDb(){ $db = \Typecho\Db::get(); $prefix = $db->getPrefix(); $table = $db->getPrefix() . 'bscore_cron_data'; $table1 = $db->getPrefix() . 'bscore_iplocation_data'; $table2 = $db->getPrefix() . 'bscore_friendcircle_data'; $table3 = $db->getPrefix() . 'bscore_emaction_data'; $table4 = $db->getPrefix() . 'bscore_wechat_data'; $table5 = $db->getPrefix() . 'bscore_wechat_msgids'; $adapter = $db->getAdapterName(); if ("Pdo_SQLite" === $adapter || "SQLite" === $adapter) { //cron表初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table . " ( id INTEGER PRIMARY KEY, type TEXT, checktotal TEXT, checksuccess TEXT, checkfailed TEXT, checktime TEXT)"); //IP地理位置表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table1 . " ( id INTEGER PRIMARY KEY, coid TEXT, location TEXT)"); //朋友圈表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table2 . " ( id INTEGER PRIMARY KEY, coid TEXT, private TEXT, resources TEXT, location TEXT)"); //Emaction表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table3 . " ( id INTEGER PRIMARY KEY, target_id TEXT, reaction_name TEXT, diff TEXT)"); //Wechat表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table4 . " ( id INTEGER PRIMARY KEY, openid TEXT, msg_type TEXT, content TEXT)"); $db->query(" CREATE TABLE IF NOT EXISTS " . $table5 . " ( id INTEGER PRIMARY KEY, msgid TEXT)"); } if ("pgsql" === $adapter || "Pdo_Pgsql" === $adapter) { //cron表初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table . " ( id SERIAL PRIMARY KEY, type TEXT, checktotal TEXT, checksuccess TEXT, checkfailed TEXT, checktime TEXT)"); //IP地理位置表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table1 . " ( id SERIAL PRIMARY KEY, coid TEXT, location TEXT)"); //朋友圈表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table2 . " ( id SERIAL PRIMARY KEY, coid TEXT, private TEXT, resources TEXT, location TEXT)"); //Emaction表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table3 . " ( id SERIAL PRIMARY KEY, target_id TEXT, reaction_name TEXT, diff TEXT)"); //Wechat表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table4 . " ( id SERIAL PRIMARY KEY, openid TEXT, msg_type TEXT, content TEXT)"); $db->query(" CREATE TABLE IF NOT EXISTS " . $table5 . " ( id SERIAL PRIMARY KEY, msgid TEXT)"); } if ("Pdo_Mysql" === $adapter || "Mysql" === $adapter || "Mysqli" === $adapter) { $dbConfig = null; if (class_exists('\Typecho\Db')) { $dbConfig = $db->getConfig($db::READ); } else { $dbConfig = $db->getConfig()[0]; } $charset = $dbConfig->charset; //cron表初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table . " ( `id` int(10) NOT NULL AUTO_INCREMENT, `type` varchar(150) NOT NULL, `checktotal` varchar(1000) NOT NULL, `checksuccess` varchar(1000) NOT NULL, `checkfailed` varchar(1000) NOT NULL, `checktime` varchar(1000) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); //IP地理位置表初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table1 . " ( `id` int(10) NOT NULL AUTO_INCREMENT, `coid` varchar(150) NOT NULL, `location` varchar(1000) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); //朋友圈表初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table2 . " ( `id` int(10) NOT NULL AUTO_INCREMENT, `coid` varchar(150) NOT NULL, `private` varchar(1000) NULL DEFAULT NULL, `resources` LONGTEXT NULL DEFAULT NULL, `location` varchar(1000) NULL DEFAULT NULL, `likeUser` LONGTEXT NULL DEFAULT NULL, `likeVisitor` LONGTEXT NULL DEFAULT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); //Emaction表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table3 . " ( `id` int(11) NOT NULL AUTO_INCREMENT, `target_id` varchar(255) NOT NULL, `reaction_name` varchar(255) NOT NULL, `diff` int(11) NOT NULL DEFAULT '1', PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); //Wechat表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table4 . " ( `id` int(11) NOT NULL AUTO_INCREMENT, `openid` varchar(255) NOT NULL, `msg_type` varchar(255) NOT NULL, `content` LONGTEXT NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); $db->query(" CREATE TABLE IF NOT EXISTS " . $table5 . " ( `id` int(11) NOT NULL AUTO_INCREMENT, `msgid` LONGTEXT NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); } $select = $db->fetchRow($db->select()->from('table.options') ->where('name = ?', 'cronKey')); if (empty($select)) { $db->query($db->insert('table.options') ->rows([ 'name' => 'cronKey', 'value' => md5(uniqid()), 'user' => 0 ])); } $select2 = $db->fetchRow($db->select()->from('table.options') ->where('name = ?', 'openId')); if (empty($select2)) { $db->query($db->insert('table.options') ->rows([ 'name' => 'openId', 'value' => null, 'user' => 0 ])); } } function get_hito(){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'https://v1.hitokoto.cn/'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_POST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); $data = curl_exec($curl); curl_close($curl); $datas = json_decode($data,true); return $datas['hitokoto']; } function get_friendlink($type = NULL){ $db = \Typecho\Db::get(); $options = bsOptions::getInstance()::get_option('bearsimple'); if($type == NULL){ $adapter = $db->getAdapterName(); if ("Pdo_SQLite" === $adapter || "SQLite" === $adapter || "pgsql" === $adapter || "Pdo_Pgsql" === $adapter) { $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'approved')->order('RANDOM()')); } else{ $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'approved')->order('RAND()')); } } else{ if($options['FriendLinkRejectShowAll'] == false){ $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'reject')->where('rejectreason != ?','NULL')); } else{ $links = $db->fetchAll($db->select()->from('table.bscore_friendlinks')->where('status = ?', 'reject')); } } if(empty($links)){ $links = NULL ; } return $links; } function billboard($ads,$type){ $options = bsOptions::getInstance()::get_option('bearsimple'); if($type == 'sidebar1'){ switch($ads){ case '1': $str = explode("|",$options['AdControl1Src']); $target = parselink($str[1]); echo ' '; break; case '2': echo ''; break; default: $str = explode("|",$options['AdControl1Src']); $target = parselink($str[1]); echo ' '; } } elseif($type == 'sidebar2'){ switch($ads){ case '1': $str = explode("|",$options['AdControl2Src']); $target = parselink($str[1]); echo ' '; break; case '2': echo ''; break; default: $str = explode("|",$options['AdControl2Src']); $target = parselink($str[1]); echo ' '; } } elseif($type == 'index'){ switch($ads){ case '1': $str = explode("|",$options['AdControl3Src']); $target = parselink($str[1]); echo ' '; break; case '2': echo ''; break; default: $str = explode("|",$options['AdControl3Src']); $target = parselink($str[1]); echo ' '; } } elseif($type == 'other'){ switch($ads){ case '1': $str = explode("|",$options['AdControl4Src']); $target = parselink($str[1]); echo ' '; break; case '2': echo ''; break; default: $str = explode("|",$options['AdControl4Src']); $target = parselink($str[1]); echo ' '; } } } function parseMultilineData($str, $columnCount) { $result = array(); if (!empty($str)) { $data = explode("\n", $str); foreach ($data as $item) { $item = trim($item); if (!empty($item)) { $itemData = explode('|', $item, $columnCount); if (count($itemData) == $columnCount) { foreach ($itemData as $k => $v) { $itemData[$k] = trim($v); } $result[] = $itemData; } } } } return $result; } function getMenu() { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); return parseMultilineData($options['Menu'], 2); } function getLink() { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); return parseMultilineData($options['WebLink'], 2); } function announmentget(){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $announment = explode('|',$options['PopupText']); return $announment; } function sliderget(){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); return parseMultilineData($options['SliderPics'], 3); } function getFriendLink() { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); return parseMultilineData($options['FriendLink'], 3); } function getDoubanId($id) { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $DoubanId = explode(',',$id); return $DoubanId; } function getBookTag() { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $DoubanTag = explode(',',$options['douban_tag']); return $DoubanTag; } function getMovieTag() { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $DoubanTag = explode(',',$options['douban_movie_tag']); return $DoubanTag; } function getMusicTag() { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $DoubanTag = explode(',',$options['douban_music_tag']); return $DoubanTag; } function curl_func($url){ $ch = curl_init (); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, 200); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_NOBODY, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); curl_exec($ch); $httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE); return $httpCode; } //主题开启后的设定 function themeInit($self){ if (strpos($_SERVER['REQUEST_URI'], '/attachment/') !== false) { $self->response->setStatus(404); } if ($self->hidden){ $self->response->setStatus(200); header('HTTP/1.1 200 OK'); } $options1 = bsOptions::getInstance()::get_option( 'bearsimple' ); $options = Helper::options(); $removeChar = ["https://", "http://"]; $nonList = \BsCore\Plugin::textareaToArrs($options1['safeRedirectionNonList']); if ($options1['safeRedirection'] == '1') { if (isset($_SERVER['HTTP_REFERER']) && stripos($_SERVER['HTTP_REFERER'], str_replace($removeChar, "", $options->siteUrl)) == false && strpos($_SERVER['HTTP_REFERER'], 'google.com') == false && strpos($_SERVER['HTTP_REFERER'], 'bing.com') == false && strpos($_SERVER['HTTP_REFERER'], 'baidu.com') == false && \BsCore\Plugin::checkDomains($_SERVER['HTTP_REFERER'], $nonList) == false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/safeRedirection.php"); } } if($options1['infinite_scroll'] == true){ $self->parameter->pageSize = $options1['infinite_pageSize']; if($self->is('category') && !empty(CategoryAlbum(categeid($self->getArchiveSlug())))){ $self->parameter->pageSize = CategoryAlbum(categeid($self->getArchiveSlug()))['Cate_Album_Number']; } } $options->commentsOrder = 'DESC'; $options->commentsAntiSpam = false; if($options1['Pjax'] == true){ $options->commentsCheckReferer = false; } //bsOptions::getInstance()::get_option( 'bearsimple' )->commentsMaxNestingLevels = 999; \Typecho\Widget::widget('Widget_User')->to($user); //Sitemap if (bsOptions::getInstance()::get_option( 'bearsimple' )['SiteMap'] && bsOptions::getInstance()::get_option( 'bearsimple' )['SiteMap'] !== 'close') { if (strpos($_SERVER['REQUEST_URI'], 'sitemap.xml') !== false) { $self->response->setStatus(200); $self->setThemeFile("modules/SiteMap/sitemap.php"); } } if (strpos($_SERVER['REQUEST_URI'], 'searchcross') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/searchcross.php"); } //用户中心 if (strpos($_SERVER['REQUEST_URI'], 'usercenter') !== false && $user->hasLogin() && $options1['UserCenterOpen'] == true) { $self->response->setStatus(200); $self->setThemeFile("modules/UserCenter/user.php"); } //追番获取 if (strpos($_SERVER['REQUEST_URI'], 'getacg') !== false) { $self->response->setStatus(200); $self->setThemeFile("vendors/Bilibili/getData.php"); } //追番获取 if (strpos($_SERVER['REQUEST_URI'], 'bs-pagecontent') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/pageContent.php"); } //豆瓣获取 if (strpos($_SERVER['REQUEST_URI'], 'getdouban') !== false) { $self->response->setStatus(200); $self->setThemeFile("vendors/Douban/getData.php"); } //编辑器附件插入 if (strpos($_SERVER['REQUEST_URI'], 'write') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/write.php"); } //签到 if (strpos($_SERVER['REQUEST_URI'], 'bgetSign') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getsign.php"); } //获取豆瓣 if (strpos($_SERVER['REQUEST_URI'], 'getDouban') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getDouban.php"); } //获取Bangumi if (strpos($_SERVER['REQUEST_URI'], 'getBangumi') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getBangumi.php"); } //获取标签 if (strpos($_SERVER['REQUEST_URI'], 'getTags') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getTags.php"); } if($_SERVER['REQUEST_METHOD'] === 'POST' && strpos($_SERVER['REQUEST_URI'], 'bs-pagecontent') == false && strpos($_SERVER['REQUEST_URI'], 'getacg') == false && strpos($_SERVER['REQUEST_URI'], 'getdouban') == false && strpos($_SERVER['REQUEST_URI'], 'write') == false && strpos($_SERVER['REQUEST_URI'], 'uploadimages') == false && strpos($_SERVER['REQUEST_URI'], 'upgrade') == false && strpos($_SERVER['REQUEST_URI'], 'bsfrienddata') == false && strpos($_SERVER['REQUEST_URI'], 'bsfriendaction') == false && strpos($_SERVER['REQUEST_URI'], 'jsonapi/getarticle') == false && strpos($_SERVER['REQUEST_URI'], 'bsoptions/ajax') == false && strpos($_SERVER['REQUEST_URI'], 'commentlike') == false && strpos($_SERVER['REQUEST_URI'], 'postlike') == false && strpos($_SERVER['REQUEST_URI'], 'getPosterInfo') == false && strpos($_SERVER['REQUEST_URI'], 'getgithub') == false && strpos($_SERVER['REQUEST_URI'], 'friendajax') == false&& strpos($_SERVER['REQUEST_URI'], 'getIsLogin') == false){ $self->response->setStatus(200); $self->setThemeFile("core/widget/getLoginAction.php"); } //同步 if (strpos($_SERVER['REQUEST_URI'], 'syncData') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/syncData.php"); } //发送通知 if (strpos($_SERVER['REQUEST_URI'], 'bs-usernotify') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/usernotify.php"); } //memos if (strpos($_SERVER['REQUEST_URI'], 'getMemosAction') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getMemosAction.php"); } //aitools if (strpos($_SERVER['REQUEST_URI'], 'getAiTools') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/aiTools.php"); } //评论动作 if (strpos($_SERVER['REQUEST_URI'], 'getCommentAction') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getCommentAction.php"); } //用户动作 if (strpos($_SERVER['REQUEST_URI'], 'bUserAction') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/UserAction.php"); } if (strpos($_SERVER['REQUEST_URI'], 'bsBackendAction') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/bsBackendAction.php"); } //上传图片API if (strpos($_SERVER['REQUEST_URI'], 'uploadimages') !== false) { $self->response->setStatus(200); $self->setThemeFile("upload/upload_img.php"); } //升级API if (strpos($_SERVER['REQUEST_URI'], 'bs-upgrade') !== false) { $self->response->setStatus(200); $self->setThemeFile("modules/Upgrade/Upgrade.php"); } //获取友链数据 if (strpos($_SERVER['REQUEST_URI'], 'bsfrienddata') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/friendlinkData.php"); } //友链数据操作 if (strpos($_SERVER['REQUEST_URI'], 'bsfriendaction') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/friendlinkAction.php"); } //全站&分类加密提交操作 if (strpos($_SERVER['REQUEST_URI'], 'getencrypt') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/encrypt.php"); } //获取文章数据 if (strpos($_SERVER['REQUEST_URI'], 'jsonapi/getarticle') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getarticle.php"); } //评论点赞 if (strpos($_SERVER['REQUEST_URI'], 'commentlike') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/commentlike.php"); } //文章点赞 if (strpos($_SERVER['REQUEST_URI'], 'postlike') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/postlike.php"); } //获取Github仓库 if (strpos($_SERVER['REQUEST_URI'], 'getgithub') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getgithub.php"); } //获取用户 if (strpos($_SERVER['REQUEST_URI'], 'getUsers') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getUsers.php"); } //提交友链 if (strpos($_SERVER['REQUEST_URI'], 'friendajax') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/friendlink.php"); } //判断登录 if (strpos($_SERVER['REQUEST_URI'], 'getIsLogin') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getLogin.php"); } //cron if (strpos($_SERVER['REQUEST_URI'], 'bearCron') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/cron.php"); } //Emoji if (strpos($_SERVER['REQUEST_URI'], 'bearEmoji') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getEmoji.php"); } //Circle if (strpos($_SERVER['REQUEST_URI'], 'getCircleAction') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/circleAction.php"); } //emaction if (strpos($_SERVER['REQUEST_URI'], 'getEmaction') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/getEmaction.php"); } //emaction if (strpos($_SERVER['REQUEST_URI'], 'wechatServer') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/wechatServer/wechatServer.php"); } //feed if (strpos($_SERVER['REQUEST_URI'], 'feed') !== false) { $self->response->setStatus(200); ob_clean(); header('Content-Type: text/xml;charset=UTF-8'); } //获取文章数据 if (strpos($_SERVER['REQUEST_URI'], 'bsoptions/ajax') !== false) { $self->response->setStatus(200); $self->setThemeFile("core/widget/bsajax.php"); } if ($self->request->isPost()){ if ($self->request->postview){ addPostView($self,$self->request->postview,$self->request->postType); exit; } } } function getCustom($cid, $key){ $field=Typecho_Widget::widget('Widget_Archive@'.$cid,'pageSize=1&type=post', 'cid='.$cid); return $field->fields->$key; } function setFields(string $name, string $type, string $value, int $cid) { $db = \Typecho\Db::get(); if ( empty($name) || !in_array($type, ['str', 'int', 'float']) ) { return false; } $exist = $db->fetchRow($db->select('cid')->from('table.fields') ->where('cid = ? AND name = ?', $cid, $name)); if (empty($exist)) { return $db->query($db->insert('table.fields') ->rows([ 'cid' => $cid, 'name' => $name, 'type' => $type, 'str_value' => 'str' == $type ? $value : null, 'int_value' => 'int' == $type ? intval($value) : 0, 'float_value' => 'float' == $type ? floatval($value) : 0 ])); } else { return $db->query($db->update('table.fields') ->rows([ 'type' => $type, 'str_value' => 'str' == $type ? $value : null, 'int_value' => 'int' == $type ? intval($value) : 0, 'float_value' => 'float' == $type ? floatval($value) : 0 ]) ->where('cid = ? AND name = ?', $cid, $name)); } } function addPostView($widget,$post_id,$post_type){ $db = Typecho_Db::get(); if (!$post_id) $widget->response->throwJson([ 'code'=> 0, 'msg' => '缺少参数', ]); $views=Typecho_Widget::widget('Widget_Archive@'.$post_id,'pageSize=1&type='.$post_type, 'cid='.$post_id); $views = (!empty(getCustom($post_id, 'views'))) ? intval(getCustom($post_id, 'views')) : 0; //增加浏览次数 $vieweds = Typecho_Cookie::get('contents_viewed'); if (empty($vieweds)) $vieweds = array(); else $vieweds = explode(',', $vieweds); if (!in_array($post_id, $vieweds)) { $views = $views + 1; setFields('views', 'str', strval($views), $post_id); $vieweds[] = $post_id; $vieweds = implode(',', $vieweds); Typecho_Cookie::set("contents_viewed",$vieweds); } $widget->response->throwJson([ 'code'=> 1, 'msg' => '获取成功', 'data' => number_format($views) ]); } function page_fetch(String $type, Array $ids,String $cachetype, Int $page = 1, Int $limit = 6){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $cache_name = ''; if($type=='movie'){ $cache_name = 'movie_'; $cache_name2 = 'movie_'; } elseif($type=='book'){ $cache_name = 'book_'; $cache_name2 = 'book_'; } elseif($type=='music'){ $cache_name = 'music_'; $cache_name2 = 'music_'; } $cache_dir = __TYPECHO_ROOT_DIR__.__TYPECHO_THEME_DIR__.'/bearsimple/vendors/Douban/'; if(!is_dir($cache_dir)) @mkdir($cache_dir); $cache_dir .= 'cache/'; if(!is_dir($cache_dir)) @mkdir($cache_dir); $neelde = []; $offset = ($page - 1) * $limit; $end = $offset + $limit; $total = count($ids); $end > $total && $end = $total; $stars = []; switch($type){ case 'movie': $rating_ch = $options['douban_movie_rating']; switch($cachetype){ case '1': $cachetypenr = $options['douban_movie1']; break; case '2': $cachetypenr = $options['douban_movie2']; break; case '3': $cachetypenr = $options['douban_movie3']; break; } break; case 'book': $rating_ch = $options['douban_rating']; switch($cachetype){ case '1': $cachetypenr = $options['douban_book1']; break; case '2': $cachetypenr = $options['douban_book2']; break; case '3': $cachetypenr = $options['douban_book3']; break; } break; case 'music': $rating_ch = $options['douban_music_rating']; switch($cachetype){ case '1': $cachetypenr = $options['douban_music1']; break; case '2': $cachetypenr = $options['douban_music2']; break; case '3': $cachetypenr = $options['douban_music3']; break; } break; default:; } for($i = $offset; $i < $end; $i++){ $id = explode('*', $ids[$i]); $neelde[] = $id[0]; if(!empty($id[1])){ $stars[$id[0]] = $id[1]; }else{ $stars[$id[0]] = 0; } } $cache_name .= md5(implode(',', $neelde)) . '.json'; $cache_name2 .= $cachetype.'.config'; $cache_file = $cache_dir . $cache_name; $cache_file2 = $cache_dir . $cache_name2; if(file_exists($cache_file) && filectime($cache_file) + (5 * 24 * 3600) >= time() && $cachetypenr == @file_get_contents($cache_file2)){ // 5天时间 $result = json_decode(@file_get_contents($cache_file), true); }else{ unlink($cache_file2); switch($type){ case 'movie': foreach($neelde as $k => $v){ $Getdata = douban_getdata($v, 'movie'); $result[$v] = [ 'url' => $Getdata["url"], 'cover' => $Getdata['cover'], 'title' => $Getdata['moviename'], 'summary' => $Getdata['summary'], 'episode' => $Getdata['episode'], 'duration' => $Getdata['movie_duration'], ]; } break; case 'book': foreach($neelde as $k => $v){ $Getdata = douban_getdata($v, 'book'); $result[$v] = [ 'url' => $Getdata["url"], 'cover' => $Getdata['cover'], 'title' => $Getdata['bookname'], 'author' => $Getdata['author'], ]; } break; case 'music': foreach($neelde as $k => $v){ $Getdata = douban_getdata($v, 'music'); $result[$v] = [ 'url' => $Getdata["url"], 'cover' => $Getdata['cover'], 'title' => $Getdata['musicname'], 'singer' => $Getdata['singer'], ]; } break; default:; } file_put_contents($cache_file, json_encode($result)); file_put_contents($cache_file2, $cachetypenr); } $results = []; foreach ($result as $k=>$v){ if(!empty($stars[$k])){ $result[$k]['rating'] = $stars[$k]; }else{ $result[$k]['rating'] = 0; } $results[] = $result[$k]; } return $results; } function douban_getdata($id,$type){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $Apikey = array('apikey'=>'0df993c66c0c636e29ecbb5344252a4a'); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'https://api.douban.com/v2/'.$type.'/'.$id); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_POST, TRUE); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($curl, CURLOPT_POSTFIELDS, $Apikey); $data = curl_exec($curl); curl_close($curl); $datas = json_decode($data,true); $result = []; switch($type){ case 'book': $result['url'] = $datas['alt']; $result['cover'] = $datas['image']; $result['bookname'] = $datas['title']; $result['author'] = $datas['author'][0]; break; case 'movie': $result['url'] = str_replace('/movie/', '/subject/', $datas['alt']); $result['cover'] = $datas['image']; $result['moviename'] = $datas['title']; $result['summary'] = $datas['alt_title']; $result['episode'] = !empty($datas['attrs']['episodes'])?(is_array($datas['attrs']['episodes'])?$datas['attrs']['episodes'][0]:$datas['attrs']['episodes']):1; // var_dump($datas);exit; $result['movie_duration'] = !empty($datas['attrs']['movie_duration'])?$datas['attrs']['movie_duration'][0]:'120'; break; case 'music': $result['url'] = $datas['alt']; $result['cover'] = $datas['image']; $result['musicname'] = $datas['title']; if(count($datas['attrs']['singer'])>1){ $result['singer'] = $datas['attrs']['singer'][0].'...等'.count($datas['attrs']['singer']).'位'; } else{ $result['singer'] = $datas['attrs']['singer'][0]; } break; } return $result; } function bilibili_getpage(){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $status = json_decode(file_get_contents('https://api.bilibili.com/x/space/bangumi/follow/list?vmid='.$options['bilibili_accountid'].'&type=1&follow_status=0&pn=1&ps=15'),true); return $status['data']['total']; } function bilibili_getlist(){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $status = json_decode(file_get_contents('https://api.bilibili.com/x/space/bangumi/follow/list?vmid='.$options['bilibili_accountid'].'&type=1&follow_status=0&pn=1&ps=15'),true); return $status['data']['list']; } function bilibili_getdata($i){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'https://api.bilibili.com/x/space/bangumi/follow/list?vmid='.$options['bilibili_accountid'].'&type=1&follow_status=0&pn='.$i.'&ps=15'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_POST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); $data = curl_exec($curl); curl_close($curl); $datas = json_decode($data,true); return $datas; } function cut_str($sourcestr,$cutlength){ $returnstr=''; $i=0; $n=0; $str_length=strlen($sourcestr); while (($n<$cutlength) and ($i<=$str_length)) { $temp_str=substr($sourcestr,$i,1); $ascnum=Ord($temp_str); if ($ascnum>=224) { $returnstr=$returnstr.substr($sourcestr,$i,3); $i=$i+3; $n++; } elseif ($ascnum>=192) { $returnstr=$returnstr.substr($sourcestr,$i,2); $i=$i+2; $n++; } elseif ($ascnum>=65 && $ascnum<=90) { $returnstr=$returnstr.substr($sourcestr,$i,1); $i=$i+1; $n++; } else { $returnstr=$returnstr.substr($sourcestr,$i,1); $i=$i+1; $n=$n+0.5; } } if ($str_length>$cutlength){ $returnstr = $returnstr."..."; } return $returnstr; } function getCommentHF($coid){ $parser = new HyperDown(); $db = Typecho_Db::get(); $prow = $db->fetchRow($db->select('parent') ->from('table.comments') ->where('coid = ? AND status = ?', $coid, 'approved')); if (isset($prow['parent'])){ $parent = $prow['parent']; if ($parent != "0") { $arow = $db->fetchRow($db->select('text','author','status') ->from('table.comments') ->where('coid = ?', $parent)); $text = '回复'.$arow['author'].':'.$arow['text']; $author = $arow['author']; $status = $arow['status']; if($author){ if($status=='approved'){ $href = '
    '.reEmo($parser->makeHtml(cut_str($text, 30)),'reply').'
    '; }else if($status=='waiting'){ $href = '
    评论正在审核中...
    '; } } echo $href; } else { echo ""; } } } /** * 文章自定义字段 */ function themeFields(Typecho_Widget_Helper_Layout $layout) { $excerpt = new Typecho_Widget_Helper_Form_Element_Textarea('excerpt', null, null, '文章摘要', '输入自定义摘要。留空自动从文章截取。'); $layout->addItem($excerpt); $seo_dec = new Typecho_Widget_Helper_Form_Element_Textarea('seo_dec', null, null, '文章SEO描述', '输入文章SEO描述。留空自动从文章截取。'); $layout->addItem($seo_dec); $Bsoptions = new Typecho_Widget_Helper_Form_Element_Select('ArticleType', array('common_Mode' => '普通文章模式', 'pic_Mode' => '图片模式'),' common_Mode', '选择文章内容展现模式', '普通文章模式会显示所有内容,而图片模式则不显示除图片以外的其他内容。'); $layout->addItem($Bsoptions->multiMode()); $cover = new Typecho_Widget_Helper_Form_Element_Text('cover', null, null, '文章封面', '输入文章封面图片直链'); $layout->addItem($cover); if(Bsoptions('article_hotopen') == true || Bsoptions('article_hotopen') == ''){ $article_hotopen = '1'; } else{ $article_hotopen = '2'; } $Hot = new Typecho_Widget_Helper_Form_Element_Select('Hot', array('1' => '开启文章热度', '2' => '关闭文章热度'), $article_hotopen, '是否开启文章热度', '若选择开启,则文章页面将显示文章热度值。'); $layout->addItem($Hot->multiMode()); if(Bsoptions('article_copyrightopen') == true){ $article_copyrightopen = '1'; } else{ $article_copyrightopen = '2'; } $copyright = new Typecho_Widget_Helper_Form_Element_Select('copyright', array('1' => '开启版权声明', '2' => '关闭版权声明'), $article_copyrightopen, '本文是否开启版权声明', '开启后在文章页面会显示版权声明。'); $layout->addItem($copyright->multiMode()); if(Bsoptions('article_copyrightopen_type') !== ''){ $article_copyrightname = Bsoptions('article_copyrightopen_type'); } else{ $article_copyrightname = 'one'; } $copyright_cc = new Typecho_Widget_Helper_Form_Element_Select('copyright_cc', array( 'zero' => '不指定', 'one' => '知识共享署名协议', 'two' => '非商业性使用协议', 'three' => '禁止演绎协议', 'four' => '非商业性使用-禁止演绎协议', 'five' => '相同方式共享协议', 'six' => '非商业性使用-相同方式共享协议', ), $article_copyrightname, '知识共享协议', '当版权声明为开启状态时本项有效,请指定本文内容适用的知识共享协议'); $layout->addItem($copyright_cc->multiMode()); if(Bsoptions('article_tagopen') == true){ $article_tagopen = '1'; } else{ $article_tagopen = '2'; } $tags = new Typecho_Widget_Helper_Form_Element_Select('tags', array('1' => '开启文章标签', '2' => '关闭文章标签'), $article_tagopen, '本文是否开启标签', '开启后在文章末尾会显示文章标签,若文章不添加标签的情况下建议关闭。'); $layout->addItem($tags->multiMode()); $articleplo = new Typecho_Widget_Helper_Form_Element_Select('articleplo', array('1' => '关闭文章提示', '2' => '展现文章提示'), '1', '是否展现文章提示', '开启后阅读本篇文章时会展现文章提示'); $layout->addItem($articleplo->multiMode()); $articleplonr = new Typecho_Widget_Helper_Form_Element_Textarea('articleplonr', null, null, '文章提示内容', '文章提示功能非关闭状态时本栏有效,输入文章提示内容。留空则不显示'); $layout->addItem($articleplonr); $Overdue = new Typecho_Widget_Helper_Form_Element_Select( 'Overdue', array( 'close' => '关闭', '30' => '大于30天', '60' => '大于60天', '90' => '大于90天', '120' => '大于120天', '180' => '大于180天' ), 'off', '是否开启文章时效性提示', '开启后如果文章在多少天内无任何修改,则显示文章时效性提示' ); $layout->addItem($Overdue->multiMode()); } ================================================ FILE: core/general.php ================================================ fetchRow($db->select() ->from('table.contents') ->where('table.contents.cid=?', $cid) ->limit(1)); $content = $md::convert($post['text']); preg_match_all("/\]*>/i", $content, $pic); //通过正则式获取图片地址 $img_src = $pic[1][0]; // 获取文章封面 $cover = getCustomx($cid, 'cover'); if($cover){ $thumb = $cover[0]; }else if($img_src){ $thumb = $img_src; } else{ $thumb = $options['Poster__AttUrl']; } if(!$cover && $options['Poster__AttChoose'] == true){ $thumb = $options['Poster__AttUrl']; } return $thumb; } function getCustomx($cid, $key){ $db = Typecho_Db::get(); $rows = $db->fetchAll($db->select('table.fields.str_value')->from('table.fields') ->where('table.fields.cid = ?', $cid) ->where('table.fields.name = ?', $key) ); // 如果有多个值则存入数组 foreach ($rows as $row) { $img = $row['str_value']; if (!empty($img)) { $values[] = $img; } } return $values; } //获取Bangumi信息 function getBangumi(){ $headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0'; foreach( $headers as $n => $v ) { $headerArr[] = $n .':' . $v; } $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'https://api.bgm.tv/v0/users/'.BsOptions('bangumi_accountid').'/collections?limit=99&offset=0'); curl_setopt($curl, CURLOPT_USERAGENT, $headerArr); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, false); $content = curl_exec($curl); curl_close($curl); return json_decode($content,true)['data']; } function getTitle(\Widget\Archive $var) { $var->archiveTitle(array( 'category' => _t('分类「%s」下的文章'), 'search' => _t('包含关键字「%s」的文章'), 'tag' => _t('标签「%s」下的文章'), 'author' => _t('作者「%s」的个人主页') ), '', ' - '); Helper::options()->title(); } function getDescription($var) { if($var->is('post')){ if($var->fields->excerpt){ echo $var->fields->excerpt; } else{ if(excerpt($var->excerpt,50) == ''){ echo getTitle($var); } else{ echo excerpt($var->excerpt,50); } } } else{ echo getTitle($var); } } //获取读者墙信息 function getReaders(){ $result = Typecho_Cookie::get('readerdata'); if($result){ $result = json_decode($result,true); } else{ $db = Typecho_Db::get(); $sql = $db->select('COUNT(author) AS num', 'author', 'url', 'mail') ->from('table.comments') ->where('status = ?', 'approved') ->where('type = ?', 'comment') ->where('authorId = ?', '0') ->group('author') ->order('num', Typecho_Db::SORT_DESC); $result = $db->fetchAll($sql); Typecho_Cookie::set('readerdata',json_encode($result)); } return $result; } //获取标签 function getTags(){ $db = Typecho_Db::get(); $select = $db->fetchAll($db->select()->from('table.metas')->where('type = ?', 'tag')->order('mid', Typecho_Db::SORT_DESC)); $arr = array(); foreach($select as $value){ $val = \Typecho\Widget::widget('Widget\Base\Metas')->push($value); $arr[] = $val; } return $arr; } //获取作者指定字段 function getAuthorInfo($uid,$value){ $db = Typecho_Db::get(); $result = $db->fetchAll($db->select()->from('table.users') ->where('uid = ?',$uid) ); return $result[0][$value]; } if (!function_exists('is_https')) { function is_https() { if(!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') { return true; } elseif(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) { return true; } elseif(!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') { return true; } return false; } } //修改网址 function editurl($url){ $options = Helper::options(); if (strpos($options->siteUrl, "https://") !== false) { echo str_replace('http://','https://',$url); } else { echo $url; } } //通过分类mid获取到分类名字 function getCategoryName($category) { $db = Typecho_Db::get(); $prefix = $db->getPrefix(); $rs = $db->fetchRow($db->select()->from($prefix.'metas')->where('mid = ?', $category)->limit(1)); return $rs['name']; } //输出日期和周几 function monweek(){ $arr = array("日","一","二","三","四","五","六"); echo date(' Y年m月d日',time()). " 星期".$arr[date("w")]; } // 获取所有分类和分类文章数量 function getPostAndNum(){ $db = Typecho_Db::get(); $a = array(); $result = $db->fetchAll($db->select() ->from('table.metas') ->where('table.metas.type = ?', 'category')); foreach($result as $post){ $a[] = array( 'value'=>$post['count'], 'name'=>$post['name'], ); } return json_encode($a); } // 获取所有标签和标签文章数量 function getTagAndNum($type){ $db = Typecho_Db::get(); $arr = array(); $result = $db->fetchAll($db->select() ->from('table.metas') ->where('table.metas.type = ?', 'tag') ->where('table.metas.count != ?', 0) ->limit(5) ); if($type == 'name'){ foreach($result as $tag){ $arr[] = $tag['name']; } } elseif($type == 'num'){ foreach($result as $tag){ $arr[] = $tag['count']; } } return json_encode($arr); } //获取随机文章 function getArchived(){ $db = Typecho_Db::get(); $result = $db->fetchAll($db->select() ->from('table.contents') ->where('table.contents.status = ?', 'publish') ->where('table.contents.created < ?', Helper::options()->time) ->where('table.contents.type = ?', 'post') ->order('table.contents.created', Typecho_Db::SORT_DESC)); return $result; } //获取随机文章 function getRandomPosts($cid = 0){ $db = \Typecho\Db::get(); $adapter = $db->getAdapterName(); if ("Pdo_SQLite" === $adapter || "SQLite" === $adapter || "pgsql" === $adapter || "Pdo_Pgsql" === $adapter) { $result = $db->fetchAll($db->select()->from('table.contents') ->where('status = ?','publish') ->where('type = ?', 'post') ->where('cid != ?', $cid) ->where('created < ?', Helper::options()->time) ->limit(6) ->order('RANDOM()') ); } else{ $result = $db->fetchAll($db->select()->from('table.contents') ->where('status = ?','publish') ->where('type = ?', 'post') ->where('cid != ?', $cid) ->where('created < ?', Helper::options()->time) ->limit(6) ->order('RAND()') ); } if($result){ $i = 1; foreach($result as $val){ $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val); if(!$val['hidden']){ $post_title = htmlspecialchars($val['title']); $permalink = $val['permalink']; $date = date('Y年m月d日',$val['created']); $md = new Markdown(); $targetSummary = excerpt($md::convert($val['text']), 10); $expert = getCustomFields($val['cid'], 'excerpt'); if($expert){ $targetSummary = $expert[0]; } $targetSummary = trim( strip_tags($targetSummary)); $targetSummary = preg_replace('/\\s+/',' ',$targetSummary); if(!$targetSummary){ $targetSummary = '本篇文章暂无摘要~'; } if(strpos($targetSummary, '{bs-hide') !== false || strpos($targetSummary, '[bs-hide') !== false || strpos($targetSummary, '[bshide') !== false || strpos($targetSummary, '[bslogin') !== false){ $targetSummary = '文章包含隐藏内容,请进入文章内页查看~'; } echo '

    '.$post_title.'

    '.$targetSummary.'
    '.$date.'
    '; } $i++; } } } //获取文章标签 function tags($widget, $split = '', $default = NULL) { if ($widget->tags) { $result = array(); $result[] = '
    '; foreach ($widget->tags as $tag) { $result[] .= '#'.$tag['name'].''; } $result[] .= '
    '; echo implode($split,$result); } else { echo $default; } } //获取分类ID function categeid($slug){ $db = Typecho_Db::get(); $postnum=$db->fetchRow($db->select()->from ('table.metas')->where ('slug=?',$slug)->where('type=?', 'category')); return $postnum['mid']; } //Md5加密 function md5Encode($data){ return md5("bearsimplev2!@#$%^&*()-=+@#$%$".$data."bearsimplev2!@#$%^&*()-=+@#$%$"); } function seacharr_by_value($array, $index, $value){ $newarray = array(); if(is_array($array) && count($array)>0) { foreach(array_keys($array) as $key){ $temp[$key] = $array[$key][$index]; if ($temp[$key] == $value){ $newarray[$key] = $array[$key]; } } } return $newarray; } function getDiyLinkToArray($data){ $res = array(); foreach($data as $k=>$v){ $res[]= array( 'url' => $v[1], 'key'=>$v[0] ); } return $res; } //获取自定义内链 function getDiyLink($key){ $options = bsOptions::getInstance()::get_option('bearsimple'); $data = parseMultilineData(BsOptions('goLinkList'),2); $result = seacharr_by_value(getDiyLinkToArray($data),'key',$key); $res = array(); foreach($result as $k=>$v){ foreach ($v as $key=>$value) { $res[$key] = $value; } } return $res; } //分类密码 function CategoryEncrypt($id){ $options = bsOptions::getInstance()::get_option('bearsimple'); $data = BsOptions('Cate_Encrypt'); $result = seacharr_by_value($data,'Cate_Encrypt_Id',$id); $res = array(); if($result){ foreach($result as $k=>$v){ foreach ($v as $key=>$value) { $res[$key] = $value; } } } return $res; } //分类相册 function CategoryAlbum($id){ $options = bsOptions::getInstance()::get_option('bearsimple'); $data = BsOptions('Cate_Album'); $result = seacharr_by_value($data,'Cate_Album_Id',$id); $res = array(); foreach($result as $k=>$v){ foreach ($v as $key=>$value) { $res[$key] = $value; } } return $res; } //统计全站字数 function allOfCharacters() { $Characters = Typecho_Cookie::get('site_Characters'); if(!$Characters){ $chars = 0; $db = Typecho_Db::get(); $select = $db ->select('text')->from('table.contents'); $rows = $db->fetchAll($select); foreach ($rows as $row) { $chars += mb_strlen(trim($row['text']), 'UTF-8'); } $unit = ''; if($chars >= 10000) { $chars /= 10000; $unit = '万'; } else if($chars >= 1000) { $chars /= 1000; $unit = '千'; } $out = sprintf('%.2lf %s',$chars, $unit); Typecho_Cookie::set('site_Characters',$out); $Characters = $out; } return $Characters; } function historyToday($created) { $date = date('m/d', $created); $date_m = date('m月', $created); $date_d = date('d日', $created); $time = time(); $db = Typecho_Db::get(); $prefix = $db->getPrefix(); $options = bsOptions::getInstance()::get_option( 'bearsimple' ); if(empty($options['history_Today_Limit'])){ $limit = 5; } else{ $limit = $options['history_Today_Limit']; } $adapter = $db->getAdapterName(); if ("Pdo_SQLite" === $adapter || "SQLite" === $adapter) { $sql = "SELECT * FROM `{$prefix}contents` WHERE strftime('%m-%d',datetime(datetime(created, 'unixepoch'))) = '{$date}' and created <= {$time} and created != {$created} and type = 'post' and status = 'publish' and (password is NULL or password = '') LIMIT ".$limit; } if ("pgsql" === $adapter || "Pdo_Pgsql" === $adapter) { $sql = "SELECT * FROM {$prefix}contents WHERE to_char(created, 'M/D') = '{$date}' and created <= {$time} and created != {$created} and type = 'post' and status = 'publish' and (password is NULL or password = '') LIMIT ".$limit; } if ("Pdo_Mysql" === $adapter || "Mysql" === $adapter || "Mysqli" === $adapter) { $sql = "SELECT * FROM `{$prefix}contents` WHERE DATE_FORMAT(FROM_UNIXTIME(created), '%m/%d') = '{$date}' and created <= {$time} and created != {$created} and type = 'post' and status = 'publish' and (password is NULL or password = '') LIMIT ".$limit; } $result = $db->query($sql); $historyTodaylist = []; if ($result instanceof Traversable) { foreach ($result as $item) { $item = Typecho_Widget::widget('Widget_Abstract_Contents')->push($item); $title = htmlspecialchars($item['title']); $permalink = $item['permalink']; $date = date('Y年m月d日',$created); $historydate = date('Y年m月d日',$item['created']); $historyTodaylist[] = array( "title" => $title, "permalink" => $permalink, "date" => $historydate ); } } if (count($historyTodaylist) > 0){ echo "
    那年今日
    {$date_m}
    {$date_d}
      "; foreach ($historyTodaylist as $item){ echo "
    • {$item['date']}{$item['title']}
    • "; } echo "
    "; } } function ishttps() { if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') { return true; } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { return true; } elseif (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') { return true; } return false; } function imgtobase64($img='', $imgHtmlCode=true){ $imageInfo = getimagesize($img); $base64 = "" . chunk_split(base64_encode(file_get_contents($img))); return 'data:' . $imageInfo['mime'] . ';base64,' . chunk_split(base64_encode(file_get_contents($img))); } function CommentAuthor($obj, $autoLink = NULL, $noFollow = NULL) { $options = Helper::options(); $autoLink = $autoLink ? $autoLink : $options->commentsShowUrl; $noFollow = $noFollow ? $noFollow : $options->commentsUrlNofollow; if ($obj->url && $autoLink) { echo 'url, $options->index) == $obj->url ? NULL : ' target="_blank"').'>'.$obj->author.''; } else { echo $obj->author; } } function categorynum($id){ $db = Typecho_Db::get(); $num=$db->fetchRow($db->select()->from('table.metas') ->where('mid = ?',$id)); return $num['count']; } function categoryid($slug){ //获取栏目id $db = Typecho_Db::get(); $postnum=$db->fetchRow($db->select()->from ('table.metas')->where ('slug=?',$slug)->where('type=?', 'category')); return $postnum['mid']; } //截断文字 function cutexpert($string, $length='20', $dot = '…') { $_lenth = mb_strlen($string, "utf-8"); $text_str = preg_replace(array("/
    /si","//si"),"",$string);
        $text_lenth = mb_strlen($text_str, "utf-8") - 1;
        if($text_lenth <= $length) {
            return strip_tags(stripcslashes($text_str));
        }
        else{
            $res = mb_substr($text_str, 0, $length, 'UTF-8');
            return strip_tags(stripcslashes($res)).$dot;
        }
    }
    
    //截断文本,主要用于侧边栏最新评论,保留img标签
    function bearcutword($string, $length='20', $dot = '…') {
        $_lenth = mb_strlen($string, "utf-8");
        $text_str = preg_replace("//si","",$string);
        $text_lenth = mb_strlen($text_str, "utf-8") - 1;
         
        if($text_lenth <= $length) {
            return stripcslashes($string);
        }
         
        if(strpos($string, '') / 3);
         
        if($length < $html_start) {
            $res = mb_substr($string, 0, $length, 'UTF-8');
            return stripcslashes($res).$dot;
        }
         
        if($length > $html_start) {
             
            $res_html = mb_substr($text_str, 0, $length-1, 'UTF-8');
             
            preg_match('/]*\>/',$string,$result_html);
            $before = mb_substr($res_html, 0, $html_start, 'UTF-8');
            $after = mb_substr($res_html, $html_start, mb_strlen($res_html, "utf-8"), 'UTF-8');
            $res = $before.$result_html[0].$after;
            return stripcslashes($res).$dot;
        }
         
    }
    
    function strFilter($str){
        $str = str_replace('`', '', $str);
        $str = str_replace('·', '', $str);
        $str = str_replace('~', '', $str);
        $str = str_replace('!', '', $str);
        $str = str_replace('!', '', $str);
        $str = str_replace('@', '', $str);
        $str = str_replace('#', '', $str);
        $str = str_replace('$', '', $str);
        $str = str_replace('¥', '', $str);
        $str = str_replace('%', '', $str);
        $str = str_replace('^', '', $str);
        $str = str_replace('……', '', $str);
        $str = str_replace('&', '', $str);
        $str = str_replace('*', '', $str);
        $str = str_replace('(', '', $str);
        $str = str_replace(')', '', $str);
        $str = str_replace('(', '', $str);
        $str = str_replace(')', '', $str);
        $str = str_replace('-', '', $str);
        $str = str_replace('_', '', $str);
        $str = str_replace('——', '', $str);
        $str = str_replace('+', '', $str);
        $str = str_replace('=', '', $str);
        $str = str_replace('|', '', $str);
        $str = str_replace('\\', '', $str);
        $str = str_replace('[', '', $str);
        $str = str_replace(']', '', $str);
        $str = str_replace('【', '', $str);
        $str = str_replace('】', '', $str);
        $str = str_replace('{', '', $str);
        $str = str_replace('}', '', $str);
        $str = str_replace(';', '', $str);
        $str = str_replace(';', '', $str);
        $str = str_replace(':', '', $str);
        $str = str_replace(':', '', $str);
        $str = str_replace('\'', '', $str);
        $str = str_replace('"', '', $str);
        $str = str_replace('“', '', $str);
        $str = str_replace('”', '', $str);
        $str = str_replace(',', '', $str);
        $str = str_replace(',', '', $str);
        $str = str_replace('<', '', $str);
        $str = str_replace('>', '', $str);
        $str = str_replace('《', '', $str);
        $str = str_replace('》', '', $str);
        $str = str_replace('.', '', $str);
        $str = str_replace('。', '', $str);
        $str = str_replace('/', '', $str);
        $str = str_replace('、', '', $str);
        $str = str_replace('?', '', $str);
        $str = str_replace('?', '', $str);
        return trim($str);
    }
    
    function strtitle(){
        $title = bsOptions::getInstance()::get_option( 'bearsimple' )->title;
        $title = strFilter($title);
        return $title;
    }
    
    function readModeContent($th,$content){
     $author = $th->author->screenName;
    $date = date("Y年 m月 d 日",$th->date->timeStamp);
    $title = $th->title;
    $avatar = imgravatarq($th->author->mail);
                return <<
      

    {$title}

    阅读选项

    {$content}
    EOF; } function agreeNum($cid) { $db = Typecho_Db::get(); $prefix = $db->getPrefix(); $adapter = $db->getAdapterName(); if (!array_key_exists('agree', $db->fetchRow($db->select()->from('table.contents')))) { if("pgsql" === $adapter || "Pdo_Pgsql" === $adapter){ $db->query('ALTER TABLE ' . $prefix . 'contents ADD agree TEXT NOT NULL DEFAULT 0;'); } else{ $db->query('ALTER TABLE `' . $prefix . 'contents` ADD `agree` INT(10) NOT NULL DEFAULT 0;'); } } $agree = $db->fetchRow($db->select('table.contents.agree')->from('table.contents')->where('cid = ?', $cid)); return array( 'agree' => $agree['agree'], ); } function agree($cid) { $db = Typecho_Db::get(); $agree = $db->fetchRow($db->select('table.contents.agree')->from('table.contents')->where('cid = ?', $cid)); $db->query($db->update('table.contents')->rows(array('agree' => (int)$agree['agree'] + 1))->where('cid = ?', $cid)); $agree = $db->fetchRow($db->select('table.contents.agree')->from('table.contents')->where('cid = ?', $cid)); return $agree['agree']; } function agreeNumforcomment($coid) { $db = Typecho_Db::get(); $prefix = $db->getPrefix(); $adapter = $db->getAdapterName(); if (!array_key_exists('agree', $db->fetchRow($db->select()->from('table.comments')))) { if("pgsql" === $adapter || "Pdo_Pgsql" === $adapter){ $db->query('ALTER TABLE ' . $prefix . 'comments ADD agree INT(10) NOT NULL DEFAULT 0;'); } else{ $db->query('ALTER TABLE `' . $prefix . 'comments` ADD `agree` INT(10) NOT NULL DEFAULT 0;'); } } $agree = $db->fetchRow($db->select('table.comments.agree')->from('table.comments')->where('coid = ?', $coid)); return array( 'agree' => $agree['agree'], ); } function agreeforcomment($coid) { $db = Typecho_Db::get(); $agree = $db->fetchRow($db->select('table.comments.agree')->from('table.comments')->where('coid = ?', $coid)); $db->query($db->update('table.comments')->rows(array('agree' => (int)$agree['agree'] + 1))->where('coid = ?', $coid)); $agree = $db->fetchRow($db->select('table.comments.agree')->from('table.comments')->where('coid = ?', $coid)); return $agree['agree']; } function theAllViews() { $db = Typecho_Db::get(); $prefix = $db->getPrefix(); $row = $db->fetchAll('SELECT SUM(VIEWS) FROM `' . $prefix . 'contents`'); echo number_format($row[0]['SUM(VIEWS)']); } //输出样式 function bs_style(){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); echo ' '; } //黑暗模式 function darkmode(){ echo '
    '; } //文章组件输出 function article_module_output($thi) { $options = bsOptions::getInstance()::get_option('bearsimple'); $agree = $thi->hidden ? array('agree' => 0, 'recording' => true) : agreeNum($thi->cid); if ($options['Share'] || $options['RewardOpen'] || $options['Like']) { echo ' '; echo '
    '; if ($options['Like'] == true) { echo '
    赞 ('.$agree['agree'].')
    '; } if ($options['Share'] == true) { echo '
    分享
    '; if (!empty($options['Shares'][0]) && @in_array('qq', $options['Shares'])) { echo '
    QQ
    '; } if (!empty($options['Shares'][0]) && @in_array('qzone', $options['Shares'])) { echo '
    QQ空间
    '; } if (!empty($options['Shares'][0]) && @in_array('wechat', $options['Shares'])) { echo '
    微信
    '; } if (!empty($options['Shares'][0]) && @in_array('weibo', $options['Shares'])) { echo '
    微博
    '; } if (!empty($options['Shares'][0]) && @in_array('facebook', $options['Shares'])) { echo '
    Facebook
    '; } if (!empty($options['Shares'][0]) && @in_array('twitter', $options['Shares'])) { echo '
    Twitter
    '; } if (!empty($options['Shares'][0]) && @in_array('google', $options['Shares'])) { echo '
    Google
    '; } if (!empty($options['Shares'][0]) && @in_array('linkedin', $options['Shares'])) { echo '
    Linkedin
    '; } echo '
    '; } // 赞赏按钮 if ($options['RewardOpen'] == true) { if ($options['RewardOpen_tepass'] == true) { echo '
    赞赏
    '; } else { echo '
    赞赏
    '; } } echo '
    '; echo ' '; } } function poster_inx($cid,$content,$excerpt,$type,$excerpt_length=240){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $agent = strtolower($_SERVER['HTTP_USER_AGENT']); $is_iphone = (strpos($agent, 'iphone')) ? true : false; $is_ipad = (strpos($agent, 'ipad')) ? true : false; //判断苹果设备访问,经测试苹果设备在某些情况下可能无法下载海报 if($is_iphone || $is_ipad){ $download = '长按图片保存海报'; } else{ $download = '下载海报'; } $post_excerpt = $excerpt; if($excerpt == ''){ $post_content = $content; if (strpos($post_content, '[bspost') !== false) { $post_content = preg_replace('/\[bspost (.*?)\]/sm', '', $post_content); } if (strpos($post_content, '[bshide') !== false) { $pattern = get_shortcode_regex(array('bshide')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bslogin') !== false) { $pattern = get_shortcode_regex(array('bslogin')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bsprog') !== false) { $pattern = get_shortcode_regex(array('bsprog')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bsgallery') !== false) { $pattern = get_shortcode_regex(array('bsgallery')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[todo-t') !== false) { $pattern = get_shortcode_regex(array('todo-t')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[todo-f') !== false) { $pattern = get_shortcode_regex(array('todo-f')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bsgit') !== false) { $pattern = get_shortcode_regex(array('bsgit')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bseva') !== false) { $pattern = get_shortcode_regex(array('bseva')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bsaudio') !== false) { $pattern = get_shortcode_regex(array('bsaudio')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bspost') !== false) { $pattern = get_shortcode_regex(array('bspost')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bsplayer') !== false) { $pattern = get_shortcode_regex(array('bsplayer')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bsmp3') !== false) { $pattern = get_shortcode_regex(array('bsplayer')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bsruby') !== false) { $pattern = get_shortcode_regex(array('bsruby')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bsmark') !== false) { $pattern = get_shortcode_regex(array('bsmark')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bsbtn') !== false) { $pattern = get_shortcode_regex(array('bsbtn')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bsmessage') !== false) { $pattern = get_shortcode_regex(array('bsmessage')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '{bs-todo') !== false) { $pattern = get_shortcode_regex2(array('bs-todo')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '{bs-accord') !== false) { $pattern = get_shortcode_regex2(array('bs-accord')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '{bs-font') !== false) { $pattern = get_shortcode_regex2(array('bs-font')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '{bs-iframe') !== false) { $pattern = get_shortcode_regex2(array('bs-iframe')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '{bs-card') !== false) { $pattern = get_shortcode_regex2(array('bs-card')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '{bs-audio') !== false) { $pattern = get_shortcode_regex2(array('bs-audio')); $post_content = preg_replace("/$pattern/", '', $post_content); } if (strpos($post_content, '[bspaper') !== false) { $pattern = get_shortcode_regex2(array('bspaper')); $post_content = preg_replace("/$pattern/", '', $post_content); } $post_content = strip_tags( $post_content ); $post_excerpt = mb_strimwidth($post_content,0,$excerpt_length,'…','utf-8'); } $post_excerpt = strip_tags( $post_excerpt ); $post_excerpt = trim( preg_replace( "/[\n\r\t ]+/", ' ', $post_excerpt ), ' ' ); switch($type){ case '1': echo '
    '; case '2': return $post_excerpt; } } //输出文章标题字数 function articletitlenum(){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); if(empty($options['articletitlenum'])){ return '20'; } else{ return $options['articletitlenum']; } } //输出文章描述字数 function articledecnum(){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); if(empty($options['articleexcerptnum'])){ return '40'; } else{ return $options['articleexcerptnum']; } } //自动分页方法 function autoPage($array,$pagesize,$current){ if(!$array){ return; } $_return = array(); $total=ceil(count($array)/$pagesize); $prev=(($current-1)<=0 ? "1":($current-1)); $next=(($current+1)>=$total ? $total:$current+1); $current=($current>($total)?($total):$current); $start=($current-1)*$pagesize; $end=($start+$pagesize)上一页'; for($i=1;$i<=$total;$i++){ if($i==$current){ $page .= ''.$i.''; } else{ $page .= ''.$i.''; } } $page .= '下一页'; $page .= '尾页
    '; $pagearray["page"] = $page; if($total == 1){ $pagearray["page"] = ''; } return $pagearray; } //输出标签云个数 function tagcloudnum(){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); if(empty($options['tagcloudnum'])){ return '20'; } else{ return $options['tagcloudnum']; } } // 简洁图文获取图片 function thumb($obj) { //获取附件首张图片 $attach = $obj->attachments(1)->attachment; //获取文章首张图片 preg_match_all("/\]*>/i", $obj->content, $thumbUrl); $img_src = $thumbUrl[1][0]; // 获取自定义随机图片 $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $thumbs = explode("|",$options['Article_forma_pic']); // 获取文章封面 $cover = $obj->fields->cover; //---------------> if($options['Article_forma_randapi'] == 1){ $rand = '?'.mt_rand(1,1000); } if($options['Article_forma_randchoose'] == false || $options['Article_forma_randchoose'] == ''){ if($cover){ $thumb = $cover; }elseif(isset($attach->isImage) && $attach->isImage == 1){ $thumb = $attach->url; }else if($img_src){ $thumb = $img_src; }else if(!empty($options['Article_forma_pic']) && count($thumbs)>0){ $thumb = $thumbs[rand(0,count($thumbs)-1)].$rand; } else{ $thumb = ''; } } else{ if(!empty($options['Article_forma_pic']) && count($thumbs)>0){ $thumb = $thumbs[rand(0,count($thumbs)-1)].$rand; } elseif($cover){ $thumb = $cover; }elseif(isset($attach->isImage) && $attach->isImage == 1){ $thumb = $attach->url; }else if($img_src){ $thumb = $img_src; } else{ $thumb = ''; } } return $thumb; } // 图底文字获取图片 function thumb2($obj,$type = 'default') { //获取附件首张图片 $attach = $obj->attachments(1)->attachment; //获取文章首张图片 preg_match_all("/\]*>/i", $obj->content, $thumbUrl); $img_src = $thumbUrl[1][0]; // 获取自定义随机图片 $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $thumbs = explode("|",$options['Article_forma_pic']); // 获取文章封面 $cover = $obj->fields->cover; //---------------> if($options['Article_forma_randapi'] == 1){ $rand = '?'.mt_rand(1,1000); } if($options['Article_forma_randchoose'] == false || $options['Article_forma_randchoose'] == ''){ if($cover){ $thumb = $cover; }elseif(isset($attach->isImage) && $attach->isImage == 1){ $thumb = $attach->url; }else if($img_src){ $thumb = $img_src; }else if(!empty($options['Article_forma_pic']) && count($thumbs)>0){ $thumb = $thumbs[rand(0,count($thumbs)-1)].$rand; } else if($type == 'album'){ $thumb = Helper::options()->themeUrl.'/assets/images/mountain.webp'; } else{ $thumb = ''; } } else{ if(!empty($options['Article_forma_pic']) && count($thumbs)>0){ $thumb = $thumbs[rand(0,count($thumbs)-1)].$rand; } elseif($cover){ $thumb = $cover; }elseif(isset($attach->isImage) && $attach->isImage == 1){ $thumb = $attach->url; }else if($img_src){ $thumb = $img_src; } else{ $thumb = ''; } } return $thumb; } function thumb3($obj) { //获取附件首张图片 $attach = $obj->attachments(1)->attachment; //获取文章首张图片 preg_match_all("/\]*>/i", $obj->content, $thumbUrl); $img_src = $thumbUrl[1][0]; // 获取自定义随机图片 $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $thumbs = explode("|",$options['Article_forma_pic']); // 获取文章封面 $cover = $obj->fields->cover; //---------------> if($options['Article_forma_randapi'] == 1){ $rand = '?'.mt_rand(1,1000); } if($options['Article_forma_randchoose'] == false || $options['Article_forma_randchoose'] == ''){ if($cover){ $thumb = $cover; }elseif(isset($attach->isImage) && $attach->isImage == 1){ $thumb = $attach->url; }else if($img_src){ $thumb = $img_src; }else if(!empty($options['Article_forma_pic']) && count($thumbs)>0){ $thumb = $thumbs[rand(0,count($thumbs)-1)].$rand; } else{ $thumb = ''; } } else{ if(!empty($options['Article_forma_pic']) && count($thumbs)>0){ $thumb = $thumbs[rand(0,count($thumbs)-1)].$rand; } elseif($cover){ $thumb = $cover; }elseif(isset($attach->isImage) && $attach->isImage == 1){ $thumb = $attach->url; }else if($img_src){ $thumb = $img_src; } else{ $thumb = ''; } } return $thumb; } /**简单的标签转换**/ function BearSimpleChange($article){ $article = str_replace('[bs-style=', '
    ', $article); return $article; } function BearSimpleFriendLinkBr($friendlink){ $friendlink = str_replace('', '
      ', $friendlink); $friendlink = str_replace(',', '
        ', $friendlink); return $friendlink; } /** 获取操作系统信息 */ function getOs($agent) { $os = false; if (preg_match('/win/i', $agent)) { if (preg_match('/nt 6.0/i', $agent)) { $os = 'Windows Vista'; } else if (preg_match('/nt 6.1/i', $agent)) { $os = 'Windows 7'; } else if (preg_match('/nt 5.1/i', $agent)) { $os = 'Windows XP'; } else if (preg_match('/nt 5/i', $agent)) { $os = 'Windows 2000'; } else { $os = 'Windows'; } } else if (preg_match('/android/i', $agent)) { $os = 'Android'; } else if (preg_match('/ubuntu/i', $agent)) { $os = 'Ubuntu'; } else if (preg_match('/linux/i', $agent)) { $os = 'Linux'; } else if (preg_match('/mac/i', $agent)) { $os = 'Mac OS X'; } else if (preg_match('/unix/i', $agent)) { $os = 'Unix'; } else if (preg_match('/symbian/i', $agent)) { $os = 'Nokia SymbianOS'; } else { $os = '其它操作系统'; } echo $os; } //**字数统计**/ function art_count ($cid){ $db=Typecho_Db::get (); $rs=$db->fetchRow ($db->select ('table.contents.text')->from ('table.contents')->where ('table.contents.cid=?',$cid)->order ('table.contents.cid',Typecho_Db::SORT_ASC)->limit (1)); $text = preg_replace("/[^\x{4e00}-\x{9fa5}]/u", "", $rs['text']); echo mb_strlen($text,'UTF-8'); } // 统计阅读数 function get_post_view($archive){ $cid = $archive->cid; $db = Typecho_Db::get(); $prefix = $db->getPrefix(); if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) { $db->query('ALTER TABLE `' . $prefix . 'contents` ADD `views` INT(10) DEFAULT 0;'); echo 0; return; } $row = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid)); if ($archive->is('single')) { $views = Typecho_Cookie::get('extend_contents_views'); if(empty($views)){ $views = array(); }else{ $views = explode(',', $views); } if(!in_array($cid,$views)){ $db->query($db->update('table.contents')->rows(array('views' => (int) $row['views'] + 1))->where('cid = ?', $cid)); array_push($views, $cid); $views = implode(',', $views); Typecho_Cookie::set('extend_contents_views', $views); //记录查看cookie } } echo $row['views']; } // 留言加@ function getPermalinkFromCoid($coid) { $db = Typecho_Db::get(); $row = $db->fetchRow($db->select('author')->from('table.comments')->where('coid = ? AND status = ?', $coid, 'approved')); if (empty($row)) return ''; return '@'.$row['author'].''; } //获取文章标题 function get_article_title($cid){ $db = Typecho_Db::get(); $row = $db->fetchRow($db->select('title')->from('table.contents')->where('cid = ?', $cid)); return $row['title']; } //获取文章URL function get_article_link($cid){ $db = Typecho_Db::get(); $result = $db->fetchAll($db->select()->from('table.contents') ->where('status = ?','publish') ->where('type = ?', 'post') ->where('created <= unix_timestamp(now())', 'post') ->where('cid = ?', $cid)); if($result){ foreach($result as $val){ $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val); $post_title = htmlspecialchars($val['title']); $permalink = $val['permalink']; return $permalink; } } } //懒加载输出 function lazyload($haveClass = 0,$url = ''){ $themeurl = Helper::options()->themeUrl; $loader_open = bsOptions::getInstance()::get_option('bearsimple')['Lazyload']; $loader = bsOptions::getInstance()::get_option('bearsimple')['Lazyload_style']; if($loader_open == 1){ if($haveClass == 1){ return ' src="data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+" data-'; } elseif($haveClass == 'auto' && !empty($url)){ return ' class="lazyload lazyload-style-'.$loader.'" src="data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+" data-'; } elseif($haveClass == 'auto' && empty($url)){ return ' class="lazyload lazyload-style-'.$loader.'" src="data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+" data-'; } elseif($haveClass == 'auto-other' && !empty($url)){ return ' src="'.$url.'" data-'; } else{ return ' class="lazyload lazyload-style-'.$loader.'" src="data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+" data-'; } } } //侧边栏最新回复 function lastComments(){ $db = Typecho_Db::get(); $options = Helper::options(); $search_Crosspage = $db->fetchAll($db->select('cid')->from('table.contents') ->where('status = ?','publish') ->where('type = ?', 'page') ->where('template = ?','cross.php') ->orwhere('template = ?','friendcircle.php') ); $ids = array_column($search_Crosspage, 'cid'); if($search_Crosspage[0]['cid']){ $result = $db->select()->from('table.comments'); $result = $result->where('status = ?','approved') ->where('type = ?', 'comment'); foreach ($ids as $k => $v) { $result = $result->where('cid != '.intval($ids[$k])); } $result = $db->fetchAll($result->order('created', Typecho_Db::SORT_DESC) ->limit(5)); } else{ $result = $db->fetchAll($db->select()->from('table.comments') ->where('status = ?','approved') ->where('type = ?', 'comment') ->order('created', Typecho_Db::SORT_DESC) ->limit(5) ); } echo '
          '; foreach($result as $comment){ $post = $db->fetchAll($db->select()->from('table.contents') ->where('status = ?','publish') ->where('type = ?', 'post') ->where('cid = ?',$comment['cid']) ->order('cid', Typecho_Db::SORT_DESC) ); if($post){ $i=1; foreach($post as $val){ $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val); $post_title = htmlspecialchars($val['title']); $permalink = $val['permalink']; $post_url = '
          评论于:'.$post_title.'
          '; } } if(strip_tags(excerpt_content(bearcutword(reEmo($comment['text'],'reply')))) == ''){ $comment_text = '该内容无法显示'; } else{ $comment_text = strip_tags(excerpt_content(bearcutword(reEmo($comment['text'],'reply')))); } echo '
        • '.$comment['author'].'
          '; if(!Typecho_Widget::widget('Widget_User')->hasLogin()){ if(Bsoptions('Comment_private') == true && strpos($comment['text'],'@私密@') !== false ){ echo '
          此评论为私密评论

          '; } else{ echo '
          '.$comment_text.'

          '; } } else{ echo '
          '.$comment_text.'

          '; } echo $post_url.'
          '.date('Y-m-d',$comment['created']).'
        • '; } echo '
        '; } //获取动态数目 function crossnum(){ $db = Typecho_Db::get(); $crossnum = $db->fetchAll($db->select('commentsNum')->from('table.contents') ->where('status = ?','publish') ->where('type = ?', 'page') ->where('template = ?','cross.php') ->limit(1) ); return $crossnum[0]['commentsNum']; } //版权声明 function copyright_cc($field){ if($field == 'one'){ $output = '知识共享署名许可协议'; } else if($field == 'two'){ $output = '知识署名-非商业性使用许可协议'; } else if($field == 'three'){ $output = '知识共享署名-禁止演绎许可协议'; } else if($field == 'four'){ $output = '知识共享署名-非商业性使用-禁止演绎许可协议'; } else if($field == 'five'){ $output = '知识共享署名-相同方式共享许可协议'; } else if($field == 'six'){ $output = '知识共享署名-非商业性使用-相同方式共享许可协议'; } return $output; } function msec_to_sec($timestamp,$type='msec'){ if($type=='msec'){ return sprintf('%.0f', $timestamp*1000); }else{ return sprintf('%.0f', $timestamp/1000); } } function time_start() { global $timestart; $mtime = explode( ' ', microtime() ); $timestart = $mtime[1] + $mtime[0]; return true; } time_start(); function loadtime( $display = 0, $precision = 3 ) { global $timestart, $timeend; $mtime = explode( ' ', microtime() ); $timeend = $mtime[1] + $mtime[0]; $timetotal = number_format( $timeend - $timestart, $precision ); $r = $timetotal < 1 ? $timetotal . " millisecond(s)" : $timetotal . " second(s)"; if ( $display ) { echo $r; } return 'Processed in '.$r; } class Widget_Post_hot extends Widget_Abstract_Contents { public function __construct($request, $response, $params = NULL) { parent::__construct($request, $response, $params); $this->parameter->setDefault(array('pageSize' => $this->options->commentsListSize, 'parentId' => 0, 'ignoreAuthor' => false)); } public function execute() { $ret = array(); $options = bsOptions::getInstance()::get_option('bearsimple'); $data = $options['Cate_Encrypt']; $arr = $data; $col = 'Cate_Encrypt_Id'; foreach ($arr as $row) { if (isset($row[$col])) { $ret[] = $row[$col]; } } $db = \Typecho\Db::get(); $adapter = $db->getAdapterName(); if ("Pdo_SQLite" === $adapter || "SQLite" === $adapter || "pgsql" === $adapter || "Pdo_Pgsql" === $adapter) { $db_query = 'left'; } if ("Pdo_Mysql" === $adapter || "Mysql" === $adapter) { $db_query = 'right'; } $mid = array_unique($ret); Typecho_Widget::widget('Widget_User')->to($user); if(empty($mid) || ($user->hasLogin())){ $select = $this->select()->from('table.contents') ->where("table.contents.password IS NULL OR table.contents.password = ''") ->where('table.contents.status = ?','publish') ->where('table.contents.created <= ?', time()) ->where('table.contents.type = ?', 'post') ->limit($this->parameter->pageSize) ->order('table.contents.created', Typecho_Db::SORT_DESC); } else{ $select = $this->select()->from('table.contents') ->join('table.relationships','table.relationships.cid = table.contents.cid',''.$db_query.'') ->join('table.metas','table.relationships.mid = table.metas.mid',''.$db_query.'') ->where('table.metas.type=?','category') ->where("table.contents.password IS NULL OR table.contents.password = ''") ->where('table.contents.status = ?','publish') ->where('table.contents.created <= ?', time()) ->where('table.contents.type = ?', 'post') ->limit($this->parameter->pageSize) ->order('table.contents.created', Typecho_Db::SORT_DESC) ->group('table.contents.cid'); foreach ($mid as $k=>$v) { $select->where('table.relationships.mid != '.intval($mid[$k]));//确保每个值都是数字 } } $this->db->fetchAll($select, array($this, 'push')); } } ================================================ FILE: core/getcheck.php ================================================ 连接成功,该自定义储存库可用!'; } else{ return '连接失败,该自定义储存库不可用!若已更改为正确的地址,请刷新页面后查看检测结果'; } } ================================================ FILE: core/gravatar.php ================================================ 4){ $email = md5($email); return "//weavatar.com/avatar/" . $email . "?"; } else{ $email = md5($email); if($options['Gravatar'] == '1'){ return "//cn.gravatar.com/gravatar/" . $email . "?"; } else if($options['Gravatar'] == '3'){ return "//cdn.v2ex.com/gravatar/" . $email . "?"; } else if($options['Gravatar'] == '4'){ return "//gravatar.loli.net/avatar/" . $email . "?"; } else if($options['Gravatar'] == '7'){ return "//".$options['GravatarUrl'] . $email . "?"; } } break; default: $email = md5($email); return "//weavatar.com/avatar/" . $email . "?"; } } ================================================ FILE: core/parse.php ================================================ ]*+>[^<]*+)*+$/', $value)) { $value = ''; } } } } else { $atts = ltrim($text); } return $atts; } function get_shortcode_regex($tagnames = null) { global $shortcode_tags; if (empty($tagnames)) { $tagnames = array_keys($shortcode_tags); } $tagregexp = join('|', array_map('preg_quote', $tagnames)); return '\\[' . '(\\[?)' . "($tagregexp)" . '(?![\\w-])' . '(' . '[^\\]\\/]*' . '(?:' . '\\/(?!\\])' . '[^\\]\\/]*' . ')*?' . ')' . '(?:' . '(\\/)' . '\\]' . '|' . '\\]' . '(?:' . '(' . '[^\\[]*+' . '(?:' . '\\[(?!\\/\\2\\])' . '[^\\[]*+' . ')*+' . ')' . '\\[\\/\\2\\]' . ')?' . ')' . '(\\]?)'; } function get_shortcode_regex2($tagnames = null) { global $shortcode_tags; if (empty($tagnames)) { $tagnames = array_keys($shortcode_tags); } $tagregexp = join('|', array_map('preg_quote', $tagnames)); return '\\{' . '(\\[?)' . "($tagregexp)" . '(?![\\w-])' . '(' . '[^\\]\\/]*' . '(?:' . '\\/(?!\\])' . '[^\\]\\/]*' . ')*?' . ')' . '(?:' . '(\\/)' . '\\}' . '|' . '\\}' . '(?:' . '(' . '[^\\[]*+' . '(?:' . '\\[(?!\\/\\2\\])' . '[^\\[]*+' . ')*+' . ')' . '\\[\\/\\2\\}' . ')?' . ')' . '(\\]?)'; } //60S function quotebspaperCallback($matches){ if($matches[3]){ $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); } $date=strtotime(date("Y-m-d",time())); $arr = array("7","1","2","3","4","5","6"); $week = $arr[date("w")]; $news = ''; $data = Curl::ua('android')->get('https://top.baidu.com/board')->html(); $data = json_decode(str_Intercept($data, ''), true); for($i=0;$i!=10;$i++) { $new = ($i+1)."、".$data['cards'][0]['content'][$i]['query'] . ' ' . str_replace(' ','',$data['cards'][0]['content'][$i]['desc']); $news.= '

        '.chunkSplit($new,27,"")."

        "; } $content = $news; if(Typecho_Cookie::get('yiyan') == ''){ Typecho_Cookie::set('yiyan', json_decode(file_get_contents('https://v1.hitokoto.cn/'),true)['hitokoto']); } $yiyan = Typecho_Cookie::get('yiyan'); if($attrs['image'] == 'true'){ $img = ''; } return <<fetchAll($db->select('table.fields.str_value')->from('table.fields') ->where('table.fields.cid = ?', $cid) ->where('table.fields.name = ?', $key) ); foreach ($rows as $row) { $value = $row['str_value']; if (!empty($value)) { $values[] = $value; } } return $values; } //引用文章回调 function quotePostCallback($matches){ $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); $cid = @$attrs["cid"]; $url = @$attrs['url']; $targetTitle = ""; $targetUrl = ""; $targetSummary = ""; $targetDate = ""; $expert = getCustomFields($cid, 'excerpt'); if (!empty($cid)){ $db = Typecho_Db::get(); $prefix = $db->getPrefix(); $posts = $db->fetchAll($db ->select()->from('table.contents') ->orWhere('table.contents.cid = ?', $cid) ->where('table.contents.type = ? AND table.contents.status = ? AND table.contents.password IS NULL', 'post', 'publish')); if (count($posts) == 0) { $targetTitle = "文章不存在或文章存在密码"; $targetUrl = '#'; $targetDate = ''; }else{ $result = Typecho_Widget::widget('Widget_Abstract_Contents')->push($posts[0]); $targetSummary = preg_replace(['/#+/', '/-+/', '/\n(>|\\>)/', '/^>{1}/'], '', excerpt($result['text'], 60)); $targetTitle = $result['title']; $targetUrl = $result['permalink']; $targetDate = date('Y-m-d H:m:s',$result['created']); if($expert){ $targetSummary = $expert[0]; } } }else { $targetTitle = "文章不存在"; $targetUrl = '#'; $targetDate =''; } return <<
        {$targetTitle}
        {$targetDate}
        {$targetSummary}
        EOF; } //按钮回调 function parseButtonCallback($matches) { $matches[3] = preg_replace("/(.*?)<\/a>/",'$1',$matches[3]); $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); $type = ""; $color = "primary"; $icon = ""; $linkUrl = ""; if (@$attrs['type'] == "common") { $type = "button"; } elseif (@$attrs['type'] == "basic") { $type = "basic button"; } elseif (@$attrs['type'] == "animated") { $type = "animated fade button"; $name = explode('|',$matches[5]); $name1 = $name[0]; $name2 = $name[1]; } if (@$attrs['url'] != "") { $linkUrl = 'window.open("' . $attrs['url'] . '","_blank")'; } if (@$attrs['color'] != "") { $color = $attrs['color']; } if (@$attrs['icon'] != "") { $icon = ''; } if (@$attrs['type'] == "animated") { return <<
        {$icon}{$name1}
        EOF; } else{ return <<{$icon}{$matches[5]} EOF; } } function parseTabsCallback($matches) { if ($matches[1] == '[' && $matches[6] == ']') { return substr($matches[0], 1, -1); } $content = $matches[5]; $pattern = get_shortcode_regex(array('bstab')); preg_match_all("/$pattern/", $content, $matches); $tabs = ""; $tabContents = ""; for ($i = 0; $i < count($matches[3]); $i++) { $item = $matches[3][$i]; $text = $matches[5][$i]; $id = "bstabs-" . md5(uniqid()) . rand(0, 100) . $i; $attr = htmlspecialchars_decode($item); $attrs = shortcode_parse_atts($attr); $name = @$attrs['name']; $active = @$attrs['active']; if ($active == "true") { $active = "active"; $in = "in"; } else { $active = ""; } if (strpos($text, ']+)>/i', function($imgMatches) { $attrs = $imgMatches[1]; $specificSrc = 'src="data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+"'; $attrs = str_replace($specificSrc, '', $attrs); if (preg_match('/\bdata-src\s*=\s*["\'][^"\']*["\']/i', $attrs)) { $attrs = preg_replace('/(?"; }, $text); $text = preg_replace('/
        .*?<\/div>/s', '', $text); } $tabs .= "$name"; $tabContents .= "
        $text
        "; } return << $tabContents
        EOF; } //信息提示框回调 function parseMessageCallback($matches) { $matches[3] = preg_replace("/(.*?)<\/a>/",'$1',$matches[3]); $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); $type = ""; $color = ""; $icon = ""; if (@$attrs['type'] == "commonclose" || @$attrs['type'] == 'basicclose') { $close = ''; } if (@$attrs['type'] == "basic" || @$attrs['type'] == "basicclose") { $type = 'floating'; } if (@$attrs['icon'] != "") { $types = 'icon'; $att = '
        '; $atts = '
        '; } if (@$attrs['title'] != "") { $title = '
        '.$attrs['title'].'
        '; } if (@$attrs['color'] != "") { $color = $attrs['color']; } if (@$attrs['color'] == "primary") { $color = 'blue'; } if (@$attrs['icon'] != "") { $icon = ''; } return << {$icon} {$close} {$att} {$title}
        {$matches[5]}
        {$atts} EOF; } function parseRubyCallback($matches){ $Pinyin = new ChinesePinyin(); $arr = preg_split("//u", $matches[5], -1,PREG_SPLIT_NO_EMPTY); $results = ''; foreach($arr as $po){ $results .= $po.'('.$Pinyin->TransformWithTone($po).')'; } $results .= ''; return $results; } function Rand_IP(){ $ip2id= round(rand(600000, 2550000) / 10000); //第一种方法,直接生成 $ip3id= round(rand(600000, 2550000) / 10000); $ip4id= round(rand(600000, 2550000) / 10000); //下面是第二种方法,在以下数据中随机抽取 $arr_1 = array("218","218","66","66","218","218","60","60","202","204","66","66","66","59","61","60","222","221","66","59","60","60","66","218","218","62","63","64","66","66","122","211"); $randarr= mt_rand(0,count($arr_1)-1); $ip1id = $arr_1[$randarr]; return $ip1id.".".$ip2id.".".$ip3id.".".$ip4id; } function curl_get($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); $result = curl_exec($ch); return $result; } //Github仓库回调 function parseGithubCallback($matches) { $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); $gh_result_cookie_name = '__gh_result_cookie_'.$attrs['user'].'_'.$matches[5]; $gh_result_cookie = Typecho_Cookie::get($gh_result_cookie_name); if(!$gh_result_cookie){ $result = json_decode(curl_get('https://api.github.com/repos/'.$attrs['user'].'/'.$matches[5]),true); $result['pushed_at'] = date('Y-m-d H:m:s',strtotime($result['pushed_at'])); $result_arr = array($result['full_name'],$attrs['user'],$matches[5],$result['pushed_at'],$result['stargazers_count'],$result['forks_count'],$result['html_url'],$result['description'], ); Typecho_Cookie::set($gh_result_cookie_name, implode(",",$result_arr)); } else{ $result = explode(",",$gh_result_cookie); $result['full_name'] = $result[0]; $result['pushed_at'] = $result[3]; $result['stargazers_count'] = $result[4]; $result['description'] = $result[7]; $result['html_url'] = $result[6]; } if(@$result['full_name'] == ''){ $result['full_name'] = '未获取到Github信息'; } if($result['pushed_at'] == ''){ $result['pushed_at'] = '未获取到Github项目更新日期'; } else{ $result['pushed_at'] = '更新于'.$result['pushed_at']; } if($result['stargazers_count']){ $star = ''.$result['stargazers_count']; } $fork = ''.$result['forks_count']; return <<
        {$result['full_name']}
        {$star} {$result['pushed_at']}
        EOF; } //点击复制内容回调 function parseCopyCallback($matches) { $matches[3] = preg_replace("/(.*?)<\/a>/",'$1',$matches[3]); $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($matches[3]); $content = $attrs['text']; return <<{$matches[5]} EOF; } //Tag回调 function parseTagCallback($matches) { $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); $db = Typecho_Db::get(); $tag=$db->fetchRow($db->select()->from ('table.metas')->where('type=?', 'tag')->where ('name=?',$matches[5])); $url = Helper::options()->siteUrl.'index.php/tag/'; if($tag){ return <<{$matches[5]} EOF; } else{ return <<themeUrl.'/assets/images/placeholder.png'; } else{ $image = $attrs['image']; } if(@$attrs['url'] == ''){ $url = Helper::options()->siteUrl; } else{ $url = $attrs['url']; } return <<
        EOF; } //Bsplayer回调 function parsePlayerCallback($matches) { $matches[3] = preg_replace("/(.*?)<\/a>/",'$1',$matches[3]); $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); $config = [ 'live' => false, 'autoplay' => false, 'theme' => '#FADFA3', 'loop' => 'true', 'screenshot' => false, 'hotkey' => true, 'preload' => 'metadata', 'lang' => 'zh-cn', 'logo' => null, 'volume' => 0.7, 'mutex' => true, 'video' => [ 'url' => isset($attrs['url']) ? $attrs['url'] : null, 'pic' => isset($attrs['image']) ? $attrs['image'] : Helper::options()->themeUrl.'/assets/images/placeholder.png', 'type' => 'auto', 'thumbnails' => null, ], ]; $json = json_encode($config,JSON_UNESCAPED_SLASHES); return <<
        EOF; } //Bsmp3回调 function parseMp3Callback($matches) { $playerID = 0; $matches[3] = preg_replace("/(.*?)<\/a>/",'$1',$matches[3]); $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); $id = getUniqueId(); $result = array(); if ($matches[4] != '/' && $matches[5]){ $regex = get_shortcode_regex(array('mp3')); $content = htmlspecialchars_decode(strip_tags($matches[5])); if ( ( false !== strpos( $content, '[' ) ) && preg_match_all("/$regex/", $content , $all)){ foreach ($all[0] as $k=>$v){ $a = shortcode_parse_atts($all[3][$k]); $r = parsebsMp3MultiFunc(trim($all[5][$k]), $a); if ($r) $result = array_merge($result, $r); } $config = [ 'id' => $id, "autoplay"=>false, "theme"=>"#e6d0b2", "mutex"=>true, "preload"=>'auto', "loop"=>'all', "order"=> 'list', "url"=>isset($attrs['url']) ? $attrs['url'] : null, "artist"=>isset($attrs['singer']) ? $attrs['singer'] : '佚名', "title"=>isset($attrs['name']) ? $attrs['name'] : '未知歌曲', "showlrc"=>0, "cover"=>isset($attrs['image']) ? $attrs['image'] : null, 'music' => $result, ]; } } else{ $config = [ 'id' => $id, "autoplay"=>false, "theme"=>"#e6d0b2", "mutex"=>true, "preload"=>"auto", "url"=>isset($attrs['url']) ? $attrs['url'] : null, "artist"=>isset($attrs['singer']) ? $attrs['singer'] : '佚名', "title"=>isset($attrs['name']) ? $attrs['name'] : '未知歌曲', "showlrc"=>0, "cover"=>isset($attrs['image']) ? $attrs['image'] : null, 'music' => [ "url"=>isset($attrs['url']) ? $attrs['url'] : null, "title"=>isset($attrs['name']) ? $attrs['name'] : '未知歌曲', "showlrc"=>"false", "author"=>isset($attrs['singer']) ? $attrs['singer'] : '佚名', "pic"=>isset($attrs['image']) ? $attrs['image'] : null, "lrc"=>"[00:00.00]\u627e\u4e0d\u5230\u6b4c\u8bcd\n[99:00.00] " ], ]; } $playerCode = '
        '; $js = json_encode($config,JSON_UNESCAPED_SLASHES); $playerCode .= <<APlayerOptions.push({$js}); EOF; return $playerCode; } function parsebsMp3MultiFunc($content = '',$atts = array()) { $content = strip_tags($content); $return = array(); $atts['lyric'] = "false"; if (isset($atts['singer'])) { $atts['singer'] = $atts['singer']; }elseif ( ! isset($atts['id']) && isset($atts['url'])) { $atts['singer'] = 'Unknown'; } if (! isset($atts['name']) && ! isset($atts['id']) && isset($atts['url'])) { $atts['name'] = 'Unknown'; } $atts['pic'] = $atts['image']; $atts['title'] = $atts['name']; $atts['author'] = $atts['singer']; $atts['lrc'] = "[00:00.00]\u627e\u4e0d\u5230\u6b4c\u8bcd\n[99:00.00] "; unset($atts['singer']); unset($atts['name']); unset($atts['image']); $return[] = $atts; return $return; } //日期倒计时回调 function parseDateProgressCallback($matches) { $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); if(@$attrs['color'] == ''){ $color = 'blue'; } else{ $color = $attrs['color']; } if(@$attrs['end'] == ''){ $end = '2099-01-03 21:23:23'; } else{ $end = $attrs['end']; } return <<{$matches[5]} EOF; } //进度条回调 function parseProgressCallback($matches) { $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); $progress = ''; if(@$attrs['number'] !== ''){ $progress = $attrs['number']; } if(@$attrs['color'] !== ''){ $color = 'bsprogress-bar-'.$attrs['color']; } return <<
        {$progress}%
        EOF; } //Audio回调 function parseAudioCallback($matches) { $matches[5] = preg_replace("/
        (.*?)<\/a>/",'$1',$matches[5]); return <<您的浏览器不支持播放此音频 EOF; } //KBD回调 function parseKbdCallback($matches) { $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); $style = 'ui label'; if($attrs){ if(@$attrs['style'] == 'dark'){ $style = 'ui inverted label'; } elseif(@$attrs['style'] == 'white'){ $style = 'ui basic label'; } } $matches[5] = preg_replace("/(.*?)<\/a>/",'$1',$matches[5]); return <<{$matches[5]} EOF; } //文字显隐回调 function parseOpcCallback($matches) { $matches[5] = preg_replace("/(.*?)<\/a>/",'$1',$matches[5]); return <<{$matches[5]} EOF; } //文字提示回调 function parseTipCallback($matches) { $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); $text = $attrs['text']; $matches[5] = preg_replace("/(.*?)<\/a>/",'$1',$matches[5]); return <<{$matches[5]} EOF; } //音乐歌单回调 function parseMusicCallback($matches) { return << EOF; } //音乐歌单回调 function parseMusicRdCallback($matches) { return << EOF; } //评星回调 function parseEvaluationCallback($matches) { $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); if($matches[5] > 5){ $matches[5] = '5'; } else{ $matches[5] = $matches[5]; } return << EOF; } //时间计划 function parseTimePlanCallback($matches){ $matches[5] = preg_replace("/(.*?)<\/a>/",'$1',$matches[5]); $matches[3] = preg_replace("/(.*?)<\/a>/",'$1',$matches[3]); $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); if(empty($attrs['title'])){ $attrs['title'] = '我的时间计划表'; } $matches[5] = preg_replace("/\[bstime time=\"(.*?)\"\](.*?)\[\/bstime\]/sm",'$1$2',$matches[5]); $matches[5] = str_replace("
        ",'',$matches[5]); $matches[5] = preg_replace("/\
        /sm",'',$matches[5]); return <<
        {$attrs['title']}
        {$matches[5]}
        时间 安排内容
        EOF; } //相册回调 function parseGalleryCallback($matches) { $matches[5] = preg_replace("/
        (.*?)<\/a>/",'$1',$matches[5]); $matches[3] = preg_replace("/(.*?)<\/a>/",'$1',$matches[3]); $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); if(@$attrs['title'] == ''){ $attrs['title'] = '新建相册'; } else{ $attrs['title'] = $attrs['title']; } $matches[5] = preg_replace("/\[bsimg title=\"(.*?)\"\](.*?)\[\/bsimg\]/sm",'
        $1
        $1
        ',$matches[5]); $matches[5] = preg_replace("/\
        /sm",'',$matches[5]); return <<{$attrs['title']}
        {$matches[5]}
        EOF; } //相册回调2 function parseGallery2Callback($matches) { $matches[5] = preg_replace("/
        (.*?)<\/a>/",'$1',$matches[5]); $matches[3] = preg_replace("/(.*?)<\/a>/",'$1',$matches[3]); $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); if(@$attrs['title'] == ''){ $attrs['title'] = '新建相册'; } else{ $attrs['title'] = $attrs['title']; } $matches[5] = preg_replace("/\[bsimg title=\"(.*?)\"\](.*?)\[\/bsimg\]/sm",'
        $1
        ',$matches[5]); $matches[5] = preg_replace("/\
        /sm",'',$matches[5]); return <<{$attrs['title']}
        {$matches[5]}
        EOF; } //关于我历程解析标题 function parseTimelineCallbackTitle($matches) { return <<(.*?)<\/a>/",'$1',$matches[5]); $matches[3] = preg_replace("/
        (.*?)<\/a>/",'$1',$matches[3]); $attr = htmlspecialchars_decode($matches[3]); $attrs = shortcode_parse_atts($attr); if(@$attrs['year'] == ''){ $attrs['year'] = '2023'; } else{ $attrs['year'] = $attrs['year']; } if (strpos($matches[5], '[title') !== false) { $pattern = get_shortcode_regex(array('title')); $matches1 = preg_replace_callback("/$pattern/", 'parseTimelineCallbackTitle', $matches[5]); $pattern = get_shortcode_regex(array('desc')); $matches1 = preg_replace("/$pattern/", '', $matches1); } if (strpos($matches[5], '[desc') !== false) { $pattern = get_shortcode_regex(array('desc')); $matches2 = preg_replace_callback("/$pattern/", 'parseTimelineCallbackDesc', $matches[5]); $pattern = get_shortcode_regex(array('title')); $matches2 = preg_replace("/$pattern/", '', $matches2); } return <<

        {$matches1}

        {$matches2}

        EOF; } function ParseAboutMe($type = null){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); if($type == 'plan'){ $content = $options['aboutme_gh']; } else{ $content = $options['aboutme_lc']; } if (strpos($content, '[timeline') !== false) { $pattern = get_shortcode_regex(array('timeline')); $content = preg_replace_callback("/$pattern/", 'parseTimelineCallback', $content); } return $content; } function ParseCross($content){ $content = preg_replace('/\
        (.*?)\<\/div\>/sm', '$1', $content); $content = preg_replace('/\
        (.*?)\<\/div\>/sm', '$1', $content); if (strpos($content, '[bsimg') !== false) { $content = preg_replace('/\[bsimg\](.*?)\[\/bsimg\]/sm', '', $content); } //标注 if (strpos($content, '[bsmark') !== false) { $content = preg_replace('/\[bsmark\](.*?)\[\/bsmark\]/sm', '$1', $content); } //拼音 if (strpos($content, '[bsruby') !== false) { $pattern = get_shortcode_regex(array('bsruby')); $content = preg_replace_callback("/$pattern/", 'parseRubyCallback', $content); } //相册 if (strpos($content, '[bsgallery') !== false) { $pattern = get_shortcode_regex(array('bsgallery')); $content = preg_replace_callback("/$pattern/", 'parseGallery2Callback', $content); } //时间计划表 if (strpos($content, '[bstimes') !== false) { $pattern = get_shortcode_regex(array('bstimes')); $content = preg_replace_callback("/$pattern/", 'parseTimePlanCallback', $content); } return $content; } function ShortCodePage($post,$title,$remember,$cid,$login,$articletype,$modetype='noreadmode'){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $requireModeration = Helper::options()->commentsRequireModeration; $content = $post; $alt = ''; if($options['article_imgalt'] == '1'){ $alt = '
        $2
        '; } if($articletype == 'common_Mode' || empty($articletype)){ //相册 if (strpos($content, '[bsgallery') !== false) { $pattern = get_shortcode_regex(array('bsgallery')); $content = preg_replace_callback("/$pattern/", 'parseGalleryCallback', $content); } else{ if ($options['Lightbox'] == '1' || $options['Watermark'] == '1'){ $pattern = '/\]*>/i'; $replacement = ' '.$title.''.$alt; $content = preg_replace($pattern, $replacement, $content); } } if (strpos($content, '[e') !== false) { $content = str_replace('[e]', "", $content); } //进度条 if (strpos($content, '[bsprog') !== false) { $pattern = get_shortcode_regex(array('bsprog')); $content = preg_replace_callback("/$pattern/", 'parseProgressCallback', $content); } //日期倒计时进度条 if (strpos($content, '[bsdate') !== false) { $pattern = get_shortcode_regex(array('bsdate')); $content = preg_replace_callback("/$pattern/", 'parseDateProgressCallback', $content); } //Audio if (strpos($content, '[bsaudio') !== false) { $pattern = get_shortcode_regex(array('bsaudio')); $content = preg_replace_callback("/$pattern/", 'parseAudioCallback', $content); } //tag if (strpos($content, '[bstag') !== false || strpos($content, '[tag') !== false) { $pattern = get_shortcode_regex(array('bstag','tag')); $content = preg_replace_callback("/$pattern/", 'parseTagCallback', $content); } //音乐歌单 if (strpos($content, '[bsmusic') !== false) { if($modetype == 'noreadmode'){ $pattern = get_shortcode_regex(array('bsmusic')); $content = preg_replace_callback("/$pattern/", 'parseMusicCallback', $content); } else{ $pattern = get_shortcode_regex(array('bsmusic')); $content = preg_replace_callback("/$pattern/", 'parseMusicRdCallback', $content); } } //opc if (strpos($content, '[bsopc') !== false) { $pattern = get_shortcode_regex(array('bsopc')); $content = preg_replace_callback("/$pattern/", 'parseOpcCallback', $content); } //kbd if (strpos($content, '[bskbd') !== false) { $pattern = get_shortcode_regex(array('bskbd')); $content = preg_replace_callback("/$pattern/", 'parseKbdCallback', $content); } //tabs if (strpos($content, '[bstabs') !== false) { $pattern = get_shortcode_regex(array('bstabs')); $content = preg_replace_callback("/$pattern/", 'parseTabsCallback', $content); } //评星 if (strpos($content, '[bseva') !== false) { $pattern = get_shortcode_regex(array('bseva')); $content = preg_replace_callback("/$pattern/", 'parseEvaluationCallback', $content); } //文字提示 if (strpos($content, '[bstip') !== false) { $pattern = get_shortcode_regex(array('bstip')); $content = preg_replace_callback("/$pattern/", 'parseTipCallback', $content); } //Bframe if (strpos($content, '[bsfra') !== false) { $pattern = get_shortcode_regex(array('bsfra')); $content = preg_replace_callback("/$pattern/", 'parseBsfraCallback', $content); } //Bplayer if (strpos($content, '[bsplayer') !== false) { $pattern = get_shortcode_regex(array('bsplayer')); $content = preg_replace_callback("/$pattern/", 'parsePlayerCallback', $content); } //Bmp3 if (strpos($content, '[bsplayer') !== false) { $pattern = get_shortcode_regex(array('bsmp3')); $content = preg_replace_callback("/$pattern/", 'parseMp3Callback', $content); } //Github库 if (strpos($content, '[bsgit') !== false) { $pattern = get_shortcode_regex(array('bsgit')); $content = preg_replace_callback("/$pattern/", 'parseGithubCallback', $content); } //拼音 if (strpos($content, '[bsruby') !== false) { $pattern = get_shortcode_regex(array('bsruby')); $content = preg_replace_callback("/$pattern/", 'parseRubyCallback', $content); } //标注 if (strpos($content, '[bsmark') !== false) { $content = preg_replace('/\[bsmark\](.*?)\[\/bsmark\]/sm', '$1', $content); } //TOC if ($options['Scroll'] == true){ $pattern = "/^

        (.*?)<\/h1>$/"; $replacement = '

        $1

        '; $pattern = "/^

        (.*?)<\/h2>$/"; $replacement = '

        $1

        '; $pattern = "/^

        (.*?)<\/h3>$/"; $replacement = '

        $1

        '; $pattern = "/^

        (.*?)<\/h4>$/"; $replacement = '

        $1

        '; $pattern = "/^
        (.*?)<\/h5>$/"; $replacement = '
        $1
        '; $pattern = "/^
        (.*?)<\/h6>$/"; $replacement = '
        $1
        '; $content = preg_replace($pattern, $replacement, $content); } //解析显示按钮短代码 if (strpos($content, '[bsbtn') !== false) { $pattern = get_shortcode_regex(array('bsbtn')); $content = preg_replace_callback("/$pattern/", 'parseButtonCallback', $content); } //解析显示信息提示框短代码 if (strpos($content, '[bsmessage') !== false) { $pattern = get_shortcode_regex(array('bsmessage')); $content = preg_replace_callback("/$pattern/", 'parseMessageCallback', $content); } //引用文章 if (strpos($content, '[bspost') !== false) { $pattern = get_shortcode_regex(array('bspost')); $content = preg_replace_callback("/$pattern/", 'quotePostCallback', $content); } //点击复制内容 if (strpos($content, '[bscopy') !== false) { $pattern = get_shortcode_regex(array('bscopy')); $content = preg_replace_callback("/$pattern/", 'parseCopyCallback', $content); } //60s if (strpos($content, '[bspaper') !== false) { $pattern = get_shortcode_regex(array('bspaper')); $content = preg_replace_callback("/$pattern/", 'quotebspaperCallback', $content); } //登录可见 if (strpos($content, '[bslogin') !== false) { $pattern = get_shortcode_regex(array('bslogin')); $content = preg_replace_callback("/$pattern/", function ($matches) use ($login,$options) { if ($matches[1] == '[' && $matches[6] == ']') { return substr($matches[0], 1, -1); } if ($login) { return '
        '.$matches[5].'
        '; } else { $r = empty($options['globalTips']['articleHideAfterLogin_Tip'])? '
        此处内容需要登录后方可阅读。
        ' : '
        '.$options['globalTips']['articleHideAfterLogin_Tip'].'
        '; return $r; } }, $content); } //登录或回复后可见 if (strpos($content, '[bshide') !== false) { $pattern = get_shortcode_regex(array('bshide')); $db = Typecho_Db::get(); $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $cid)->where('status = ?', 'approved')->where('mail = ?', $remember)->limit(1)); if(count($hasComment) !== 0){ $hasComments = count($hasComment); } else{ $hasComments = 0; } $content = preg_replace_callback("/$pattern/", function ($matches) use ($login,$hasComments,$options,$requireModeration) { if ($matches[1] == '[' && $matches[6] == ']') { return substr($matches[0], 1, -1); } if ($login || $hasComments !== 0) { return '
        '.$matches[5].'
        '; } if(!$options['globalTips']['articleHideAfterComment_Tip'] && $requireModeration == true){ return '
        此处内容需要登录或评论(审核通过)后方可阅读。
        '; } if(!$options['globalTips']['articleHideAfterComment_Tip'] && $requireModeration == false){ return '
        此处内容需要登录或评论后方可阅读。
        '; } if(!empty($options['globalTips']['articleHideAfterComment_Tip'])){ return '
        '.$options['globalTips']['articleHideAfterComment_Tip'].'
        '; } }, $content); } //回复可见 if (strpos($content, '{bs-hide') !== false) { $db = Typecho_Db::get(); $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $cid)->where('mail = ?', $remember)->limit(1)); if ($hasComment||$login) { $content = preg_replace("/\{bs-hide\}(.*?)\{\/bs-hide\}/sm",'
        $1
        ',$post); } else { $content = preg_replace("/\{bs-hide\}(.*?)\{\/bs-hide\}/sm",'
        此处内容需要登录或评论后方可阅读。
        ',$post); } } //兼容1.6.3版本前的回复可见短代码 if (strpos($content, '[bs-hide') !== false) { $db = Typecho_Db::get(); $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $cid)->where('mail = ?', $remember)->limit(1)); if ($hasComment||$login) { $content = preg_replace("/\[bs-hide\](.*?)\[\/bs-hide\]/sm",'
        $1
        ',$post); } else { $content = preg_replace("/\[bs-hide\](.*?)\[\/bs-hide\]/sm",'
        此处内容需要登录或评论后方可阅读。
        ',$post); } } //Todolist if (strpos($content, '{bs-todo') !== false) { if (strpos($content, '{bs-todo type=true') !== false) { $content = preg_replace('/\{bs-todo type=true\}(.*?)\{\/bs-todo\}/sm', '
        ', $content); } if (strpos($content, '{bs-todo type=false') !== false) { $content = preg_replace('/\{bs-todo type=false\}(.*?)\{\/bs-todo\}/sm', '
        ', $content); } } //Todolist New if (strpos($content, '[todo') !== false) { if (strpos($content, '[todo-t') !== false) { $content = preg_replace('/\[todo-t\](.*?)\[\/todo-t\]/sm', '
        ', $content); } if (strpos($content, '[todo-f') !== false) { $content = preg_replace('/\[todo-f\](.*?)\[\/todo-f\]/sm', '
        ', $content); } } //手风琴 if (strpos($content, '{bs-accord') !== false) { if (strpos($content, '{bs-accord style=line') !== false) { $content = preg_replace('/\{bs-accord style=line title=(.*?)\}(.*?)\{\/bs-accord\}/sm', '
        $1
        ', $content); } if (strpos($content, '{bs-accord style=common') !== false) { $content = preg_replace('/\{bs-accord style=common title=(.*?)\}(.*?)\{\/bs-accord\}/sm', '
        $1
        ', $content); } } //Github卡片 if (strpos($content, '{bs-card') !== false) { if (strpos($content, '{bs-card type=github') !== false) { $url = preg_replace('/\{bs-card type=github projectname=(.*?) projectdec=(.*?) projecturl=(.*?)\}{\/bs-card\}/sm', '$3', $content); $content = preg_replace('/\{bs-card type=github projectname=(.*?) projectdec=(.*?) projecturl=(.*?)\}{\/bs-card\}/sm', '
        $1
        $2
        ', $content); } } //字体颜色 if (strpos($content, '{bs-font') !== false) { $content = preg_replace('/\{bs-font color=(.*?)\}(.*?)\{\/bs-font\}/sm', '$2', $content); } //iframe if (strpos($content, '{bs-iframe') !== false) { $content = preg_replace('/\{bs-iframe\}(.*?)\{\/bs-iframe\}/sm', '
        ', $content); $content = preg_replace('/\', $content); } if(strpos($content,'- [x]')!==false||strpos($content,'- [ ]')!==false){ $attributes = array("style"=>"list-style: none;"); $content = str_replace(array('- [x]','- [ ]'), array( '', '', ), $content); } if(strpos($content,'-[x]')!==false||strpos($content,'-[ ]')!==false){ $attributes = array("style"=>"list-style: none;"); $content = str_replace(array('-[x]','-[ ]'), array( '', '', ), $content); } if(strpos($content,'[x]')!==false||strpos($content,'[ ]')!==false){ $attributes = array("style"=>"list-style: none;"); $content = str_replace(array('[x]','[ ]'), array( '', '', ), $content); } //判断是否为外链并判断是否新窗口打开 $content = preg_replace_callback("/(.*?)<\/a>/is", function ($matches){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $optionss = Helper::options(); if (strpos($matches[1],$optionss->siteUrl) !== false || strpos(substr($matches[1],0,6),"http") === false){ return ''.$matches[2].''; }else{ if ($options['Link_blank']== '2'){ return ''.$matches[2].""; } else{ return ''.$matches[2].""; } } }, $content); } else{ if ($options['Lightbox'] == '1' || $options['Watermark'] == '1'){ $pattern = '/<\s*img[\s\S]+?(?:src=[\'"]([\S\s]*?)[\'"]\s*|alt=[\'"]([\S\s]*?)[\'"]\s*|[a-z]+=[\'"][\S\s]*?[\'"]\s*)+[\s\S]*?>/i'; $replacement = '
        $2
        '; $content = preg_replace($pattern, $replacement, $content); } else{ $pattern = '/<\s*img[\s\S]+?(?:src=[\'"]([\S\s]*?)[\'"]\s*|alt=[\'"]([\S\s]*?)[\'"]\s*|[a-z]+=[\'"][\S\s]*?[\'"]\s*)+[\s\S]*?>/i'; $replacement = '
        $2
        '; $content = preg_replace($pattern, $replacement, $content); } } if($articletype == 'pic_Mode'){ $content = "
        ".preg_replace("/|<\/p>|/is","", $content)."
        "; } if($modetype == 'noreadmode'){ $content = "
        ".$content."
        "; } else{ $content = "
        ".$content."
        "; } /**添加目录树识别(弃用) if(preg_match('/(.*?)<\/h\1>/i',$content)){ } **/ return $content; } function ShortCode($post,$t,$login,$articletype,$modetype='noreadmode'){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $requireModeration = Helper::options()->commentsRequireModeration; $content = $post; $alt = ''; if($options['article_imgalt'] == '1'){ $alt = '
        $2
        '; } if($modetype == 'noreadmode'){ $mark = 'bearmark'; $content = preg_replace_callback('/\bfn(ref|)-(\d+)\b/', function($matches) { return 'bs' . ($matches[1] ? 'fnref' : 'fn') . '-' . $matches[2]; }, $content); $content = preg_replace( ['/href="#fn(ref|)-(\d+)"/', '/href="\/?[^"]*#fn(ref|)-(\d+)"/'], 'href="#bsfn${1}-${2}"', $content ); } else{ $content = preg_replace_callback('/\bfn(ref|)-(\d+)\b/', function($matches) { return 'bsread' . ($matches[1] ? 'fnref' : 'fn') . '-' . $matches[2]; }, $content); $content = preg_replace( ['/href="#fn(ref|)-(\d+)"/', '/href="\/?[^"]*#fn(ref|)-(\d+)"/'], 'href="#bsreadfn${1}-${2}"', $content ); $mark = 'bearmarkread'; } if($articletype == 'common_Mode' || empty($articletype)){ //相册 if (strpos($content, '[bsgallery') !== false) { $pattern = get_shortcode_regex(array('bsgallery')); $content = preg_replace_callback("/$pattern/", 'parseGalleryCallback', $content); } else{ if ($options['Lightbox'] == '1' || $options['Watermark'] == '1'){ $pattern = '/<\s*img[\s\S]+?(?:src=[\'"]([\S\s]*?)[\'"]\s*|alt=[\'"]([\S\s]*?)[\'"]\s*|[a-z]+=[\'"][\S\s]*?[\'"]\s*)+[\s\S]*?>/i'; $replacement = ' $2'.$alt; $content = preg_replace($pattern, $replacement, $content); } else{ $pattern = '/<\s*img[\s\S]+?(?:src=[\'"]([\S\s]*?)[\'"]\s*|alt=[\'"]([\S\s]*?)[\'"]\s*|[a-z]+=[\'"][\S\s]*?[\'"]\s*)+[\s\S]*?>/i'; $replacement = ' $2'.$alt; $content = preg_replace($pattern, $replacement, $content); } } //TOC 正则H标签替换,有点懒直接这样写快一点 if ($options['Scroll'] == true){ $pattern = "/^

        (.*?)<\/h1>$/"; $replacement = '

        $1

        '; $pattern = "/^

        (.*?)<\/h2>$/"; $replacement = '

        $1

        '; $pattern = "/^

        (.*?)<\/h3>$/"; $replacement = '

        $1

        '; $pattern = "/^

        (.*?)<\/h4>$/"; $replacement = '

        $1

        '; $pattern = "/^
        (.*?)<\/h5>$/"; $replacement = '
        $1
        '; $pattern = "/^
        (.*?)<\/h6>$/"; $replacement = '
        $1
        '; $content = preg_replace($pattern, $replacement, $content); } if (strpos($content, '[e') !== false) { $content = str_replace('[e]', "", $content); } //时间计划表 if (strpos($content, '[bstimes') !== false) { $pattern = get_shortcode_regex(array('bstimes')); $content = preg_replace_callback("/$pattern/", 'parseTimePlanCallback', $content); } //进度条 if (strpos($content, '[bsprog') !== false) { $pattern = get_shortcode_regex(array('bsprog')); $content = preg_replace_callback("/$pattern/", 'parseProgressCallback', $content); } //日期倒计时进度条 if (strpos($content, '[bsdate') !== false) { $pattern = get_shortcode_regex(array('bsdate')); $content = preg_replace_callback("/$pattern/", 'parseDateProgressCallback', $content); } //Audio if (strpos($content, '[bsaudio') !== false) { $pattern = get_shortcode_regex(array('bsaudio')); $content = preg_replace_callback("/$pattern/", 'parseAudioCallback', $content); } //tag if (strpos($content, '[bstag') !== false || strpos($content, '[tag') !== false) { $pattern = get_shortcode_regex(array('bstag','tag')); $content = preg_replace_callback("/$pattern/", 'parseTagCallback', $content); } //音乐歌单 if (strpos($content, '[bsmusic') !== false) { if($modetype == 'noreadmode'){ $pattern = get_shortcode_regex(array('bsmusic')); $content = preg_replace_callback("/$pattern/", 'parseMusicCallback', $content); } else{ $pattern = get_shortcode_regex(array('bsmusic')); $content = preg_replace_callback("/$pattern/", 'parseMusicRdCallback', $content); } } //opc if (strpos($content, '[bsopc') !== false) { $pattern = get_shortcode_regex(array('bsopc')); $content = preg_replace_callback("/$pattern/", 'parseOpcCallback', $content); } //kbd if (strpos($content, '[bskbd') !== false) { $pattern = get_shortcode_regex(array('bskbd')); $content = preg_replace_callback("/$pattern/", 'parseKbdCallback', $content); } //文字提示 if (strpos($content, '[bstip') !== false) { $pattern = get_shortcode_regex(array('bstip')); $content = preg_replace_callback("/$pattern/", 'parseTipCallback', $content); } //tabs if (strpos($content, '[bstabs') !== false) { $pattern = get_shortcode_regex(array('bstabs')); $content = preg_replace_callback("/$pattern/", 'parseTabsCallback', $content); } //评星 if (strpos($content, '[bseva') !== false) { $pattern = get_shortcode_regex(array('bseva')); $content = preg_replace_callback("/$pattern/", 'parseEvaluationCallback', $content); } //Bframe if (strpos($content, '[bsfra') !== false) { $pattern = get_shortcode_regex(array('bsfra')); $content = preg_replace_callback("/$pattern/", 'parseBsfraCallback', $content); } //Bplayer if (strpos($content, '[bsplayer') !== false) { $pattern = get_shortcode_regex(array('bsplayer')); $content = preg_replace_callback("/$pattern/", 'parsePlayerCallback', $content); } //Bmp3 if (strpos($content, '[bsmp3') !== false) { $pattern = get_shortcode_regex(array('bsmp3')); $content = preg_replace_callback("/$pattern/", 'parseMp3Callback', $content); } //Github库 if (strpos($content, '[bsgit') !== false) { $pattern = get_shortcode_regex(array('bsgit')); $content = preg_replace_callback("/$pattern/", 'parseGithubCallback', $content); } //拼音 if (strpos($content, '[bsruby') !== false) { $pattern = get_shortcode_regex(array('bsruby')); $content = preg_replace_callback("/$pattern/", 'parseRubyCallback', $content); } //60s if (strpos($content, '[bspaper') !== false) { $pattern = get_shortcode_regex(array('bspaper')); $content = preg_replace_callback("/$pattern/", 'quotebspaperCallback', $content); } //标注 if (strpos($content, '[bsmark') !== false) { $content = preg_replace('/\[bsmark\](.*?)\[\/bsmark\]/sm', '$1', $content); } //点击复制内容 if (strpos($content, '[bscopy') !== false) { $pattern = get_shortcode_regex(array('bscopy')); $content = preg_replace_callback("/$pattern/", 'parseCopyCallback', $content); } //解析显示按钮短代码 if (strpos($content, '[bsbtn') !== false) { $pattern = get_shortcode_regex(array('bsbtn')); $content = preg_replace_callback("/$pattern/", 'parseButtonCallback', $content); } //解析显示信息提示框短代码 if (strpos($content, '[bsmessage') !== false) { $pattern = get_shortcode_regex(array('bsmessage')); $content = preg_replace_callback("/$pattern/", 'parseMessageCallback', $content); } //引用文章 if (strpos($content, '[bspost') !== false) { $pattern = get_shortcode_regex(array('bspost')); $content = preg_replace_callback("/$pattern/", 'quotePostCallback', $content); } //登录可见 if (strpos($content, '[bslogin') !== false) { $pattern = get_shortcode_regex(array('bslogin')); $content = preg_replace_callback("/$pattern/", function ($matches) use ($login,$options) { if ($matches[1] == '[' && $matches[6] == ']') { return substr($matches[0], 1, -1); } if ($login) { return '
        '.$matches[5].'
        '; } else { $r = empty($options['globalTips']['articleHideAfterLogin_Tip'])? '
        此处内容需要登录后方可阅读。
        ' : '
        '.$options['globalTips']['articleHideAfterLogin_Tip'].'
        '; return $r; } }, $content); } //登录或回复后可见 if (strpos($content, '[bshide') !== false) { $pattern = get_shortcode_regex(array('bshide')); $db = Typecho_Db::get(); $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $t->cid)->where('status = ?', 'approved')->where('mail = ?', $t->remember('mail', true))->limit(1)); if(count($hasComment) !== 0){ $hasComments = count($hasComment); } else{ $hasComments = 0; } $content = preg_replace_callback("/$pattern/", function ($matches) use ($login,$hasComments,$options,$requireModeration) { if ($matches[1] == '[' && $matches[6] == ']') { return substr($matches[0], 1, -1); } if ($login || $hasComments !== 0) { return '
        '.$matches[5].'
        '; } if(!$options['globalTips']['articleHideAfterComment_Tip'] && $requireModeration == true){ return '
        此处内容需要登录或评论(审核通过)后方可阅读。
        '; } if(!$options['globalTips']['articleHideAfterComment_Tip'] && $requireModeration == false){ return '
        此处内容需要登录或评论后方可阅读。
        '; } if(!empty($options['globalTips']['articleHideAfterComment_Tip'])){ return '
        '.$options['globalTips']['articleHideAfterComment_Tip'].'
        '; } }, $content); } //回复可见 if (strpos($content, '{bs-hide') !== false) { $db = Typecho_Db::get(); $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $t->cid)->where('mail = ?', $t->remember('mail', true))->limit(1)); if ($hasComment||$login) { $content = preg_replace("/\{bs-hide\}(.*?)\{\/bs-hide\}/sm",'
        $1
        ',$post); } else { $content = preg_replace("/\{bs-hide\}(.*?)\{\/bs-hide\}/sm",'
        此处内容需要登录或评论后方可阅读。
        ',$post); } } //兼容1.6.3版本前的回复可见短代码 if (strpos($content, '[bs-hide') !== false) { $db = Typecho_Db::get(); $hasComment = $db->fetchAll($db->select()->from('table.comments')->where('cid = ?', $t->cid)->where('mail = ?', $t->remember('mail', true))->limit(1)); if ($hasComment||$login) { $content = preg_replace("/\[bs-hide\](.*?)\[\/bs-hide\]/sm",'
        $1
        ',$post); } else { $content = preg_replace("/\[bs-hide\](.*?)\[\/bs-hide\]/sm",'
        此处内容需要登录或评论后方可阅读。
        ',$post); } } //Todolist if (strpos($content, '{bs-todo') !== false) { if (strpos($content, '{bs-todo type=true') !== false) { $content = preg_replace('/\{bs-todo type=true\}(.*?)\{\/bs-todo\}/sm', '
        ', $content); } if (strpos($content, '{bs-todo type=false') !== false) { $content = preg_replace('/\{bs-todo type=false\}(.*?)\{\/bs-todo\}/sm', '
        ', $content); } } //Todolist New if (strpos($content, '[todo') !== false) { if (strpos($content, '[todo-t') !== false) { $content = preg_replace('/\[todo-t\](.*?)\[\/todo-t\]/sm', '
        ', $content); } if (strpos($content, '[todo-f') !== false) { $content = preg_replace('/\[todo-f\](.*?)\[\/todo-f\]/sm', '
        ', $content); } } //手风琴 if (strpos($content, '{bs-accord') !== false) { if (strpos($content, '{bs-accord style=line') !== false) { $content = preg_replace('/\{bs-accord style=line title=(.*?)\}(.*?)\{\/bs-accord\}/sm', '
        $1
        ', $content); } if (strpos($content, '{bs-accord style=common') !== false) { $content = preg_replace('/\{bs-accord style=common title=(.*?)\}(.*?)\{\/bs-accord\}/sm', '
        $1
        ', $content); } } //Github卡片 if (strpos($content, '{bs-card') !== false) { if (strpos($content, '{bs-card type=github') !== false) { $url = preg_replace('/\{bs-card type=github projectname=(.*?) projectdec=(.*?) projecturl=(.*?)\}{\/bs-card\}/sm', '$3', $content); $content = preg_replace('/\{bs-card type=github projectname=(.*?) projectdec=(.*?) projecturl=(.*?)\}{\/bs-card\}/sm', '
        $1
        $2
        ', $content); } } //字体颜色 if (strpos($content, '{bs-font') !== false) { $content = preg_replace('/\{bs-font color=(.*?)\}(.*?)\{\/bs-font\}/sm', '$2', $content); } //iframe if (strpos($content, '{bs-iframe') !== false) { $content = preg_replace('/\{bs-iframe\}(.*?)\{\/bs-iframe\}/sm', '
        ', $content); $content = preg_replace('/\', $content); } if(strpos($content,'- [x]')!==false||strpos($content,'- [ ]')!==false){ $attributes = array("style"=>"list-style: none;"); $content = str_replace(array('- [x]','- [ ]'), array( '', '', ), $content); } if(strpos($content,'-[x]')!==false||strpos($content,'-[ ]')!==false){ $attributes = array("style"=>"list-style: none;"); $content = str_replace(array('-[x]','-[ ]'), array( '', '', ), $content); } if(strpos($content,'[x]')!==false||strpos($content,'[ ]')!==false){ $attributes = array("style"=>"list-style: none;"); $content = str_replace(array('[x]','[ ]'), array( '', '', ), $content); } //判断是否为外链并判断是否新窗口打开 $content = preg_replace_callback("/(.*?)<\/a>/is", function ($matches){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $optionss = Helper::options(); if (strpos($matches[1],$optionss->siteUrl) !== false || strpos(substr($matches[1],0,6),"http") === false){ return ''.$matches[2].''; }else{ if ($options['Link_blank']== '2'){ return ''.$matches[2].""; } else{ return ''.$matches[2].""; } } }, $content); } else{ if ($options['Lightbox'] == '1' || $options['Watermark'] == '1'){ $pattern = '/<\s*img[\s\S]+?(?:src=[\'"]([\S\s]*?)[\'"]\s*|alt=[\'"]([\S\s]*?)[\'"]\s*|[a-z]+=[\'"][\S\s]*?[\'"]\s*)+[\s\S]*?>/i'; if($modetype == 'noreadmode'){ $mark = 'bearmark'; } else{ $mark = 'bearmarkread'; } $replacement = '
        $2
        '; $content = preg_replace($pattern, $replacement, $content); } else{ $pattern = '/<\s*img[\s\S]+?(?:src=[\'"]([\S\s]*?)[\'"]\s*|alt=[\'"]([\S\s]*?)[\'"]\s*|[a-z]+=[\'"][\S\s]*?[\'"]\s*)+[\s\S]*?>/i'; $replacement = '
        $2
        '; $content = preg_replace($pattern, $replacement, $content); } } if($articletype == 'pic_Mode'){ $content = "
        ".preg_replace("/|<\/p>|/is","", $content)."
        "; } if($modetype == 'noreadmode'){ $content = "
        ".$content."
        "; } else{ $content = "
        ".$content."
        "; } /**添加目录树识别(弃用) if(preg_match('/(.*?)<\/h\1>/i',$content)){ } **/ return $content; } function parselink($link){ //判断是否为外链并判断是否新窗口打开 $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $optionss = Helper::options(); if (strpos($link,$optionss->siteUrl) !== false || strpos(substr($link,0,6),"http") === false){ $link = ''; }else{ if ($options['Link_blank'] == '2'){ $link = ' target="_blank"'; } else{ $link = ''; } } return $link; } function getUniqueId() { global $playerID; $playerID++; return $playerID; } function getAcgFile(){ $getAcgFile = Helper::options()->siteUrl.'index.php/getacg'; echo $getAcgFile; } function getGhFile(){ $getGhFile =Helper::options()->siteUrl.'index.php/getgithub'; echo $getGhFile; } function getCrossFile(){ $getGhFile =Helper::options()->siteUrl.'index.php/searchcross'; echo $getGhFile; } function getDoubanFile(){ $getDoubanFile = Helper::options()->siteUrl.'index.php/getdouban'; echo $getDoubanFile; } function getAttachFile(){ $getAttachFile = Helper::options()->siteUrl.'index.php/write'; echo $getAttachFile; } function getCommentLikeFile(){ $getCommentLikeFile = Helper::options()->siteUrl.'index.php/commentlike'; echo $getCommentLikeFile; } function getPostLikeFile(){ $getPostLikeFile = Helper::options()->siteUrl.'index.php/postlike'; echo $getPostLikeFile; } function getFriendFile(){ $getFriendFile = Helper::options()->siteUrl.'index.php/friendajax'; echo $getFriendFile; } function getEncrypt(){ $getEncrypt = Helper::options()->siteUrl.'index.php/getencrypt'; echo $getEncrypt; } function getPoster(){ $getPoster = Helper::options()->siteUrl.'index.php/getPosterInfo'; echo $getPoster; } function getIsLogin(){ $getIsLogin = Helper::options()->siteUrl.'index.php/getIsLogin'; echo $getIsLogin; } function getSign(){ $getSign = Helper::options()->siteUrl.'index.php/bgetSign'; echo $getSign; } function getUserAction(){ $getUserAction = Helper::options()->siteUrl.'index.php/bUserAction'; echo $getUserAction; } function getCommentAction(){ $getCommentAction = Helper::options()->siteUrl.'index.php/getCommentAction'; echo $getCommentAction; } function getMemosAction(){ $getMemosAction = Helper::options()->siteUrl.'index.php/getMemosAction'; echo $getMemosAction; } function getCircleAction(){ $getCircleAction = Helper::options()->siteUrl.'index.php/getCircleAction'; echo $getCircleAction; } function getEmactionAction(){ $getEmactionAction = Helper::options()->siteUrl.'index.php/getEmaction'; echo $getEmactionAction; } function getAiTools(){ $getAiTools = Helper::options()->siteUrl.'index.php/getAiTools'; echo $getAiTools; } function getTagsApi(){ $getTags = Helper::options()->siteUrl.'index.php/getTags'; echo $getTags; } ================================================ FILE: core/replyview.php ================================================ excerptEx = array('BearToolOne','one'); Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = array('BearToolOne','one'); class BearToolOne { public static function get_shortcode_regex($tagnames = null) { global $shortcode_tags; if (empty($tagnames)) { $tagnames = array_keys($shortcode_tags); } $tagregexp = join('|', array_map('preg_quote', $tagnames)); return '\\[' . '(\\[?)' . "($tagregexp)" . '(?![\\w-])' . '(' . '[^\\]\\/]*' . '(?:' . '\\/(?!\\])' . '[^\\]\\/]*' . ')*?' . ')' . '(?:' . '(\\/)' . '\\]' . '|' . '\\]' . '(?:' . '(' . '[^\\[]*+' . '(?:' . '\\[(?!\\/\\2\\])' . '[^\\[]*+' . ')*+' . ')' . '\\[\\/\\2\\]' . ')?' . ')' . '(\\]?)'; } public static function get_shortcode_regex2($tagnames = null) { global $shortcode_tags; if (empty($tagnames)) { $tagnames = array_keys($shortcode_tags); } $tagregexp = join('|', array_map('preg_quote', $tagnames)); return '\\{' . '(\\[?)' . "($tagregexp)" . '(?![\\w-])' . '(' . '[^\\]\\/]*' . '(?:' . '\\/(?!\\])' . '[^\\]\\/]*' . ')*?' . ')' . '(?:' . '(\\/)' . '\\}' . '|' . '\\}' . '(?:' . '(' . '[^\\[]*+' . '(?:' . '\\[(?!\\/\\2\\])' . '[^\\[]*+' . ')*+' . ')' . '\\[\\/\\2\\}' . ')?' . ')' . '(\\]?)'; } public static function excerpt_text($content) { if (strpos($content, '[bsgallery') !== false) { $pattern = self::get_shortcode_regex(array('bsgallery')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bstimes') !== false) { $pattern = self::get_shortcode_regex(array('bstimes')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsgit') !== false) { $pattern = self::get_shortcode_regex(array('bsgit')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bscopy') !== false) { $pattern = self::get_shortcode_regex(array('bscopy')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsmusic') !== false) { $pattern = self::get_shortcode_regex(array('bsmusic')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[todo-t') !== false) { $pattern = self::get_shortcode_regex(array('todo-t')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[todo-f') !== false) { $pattern = self::get_shortcode_regex(array('todo-f')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bstabs') !== false) { $pattern = self::get_shortcode_regex(array('bstabs')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bseva') !== false) { $pattern = self::get_shortcode_regex(array('bseva')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsaudio') !== false) { $pattern = self::get_shortcode_regex(array('bsaudio')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bspost') !== false) { $pattern = self::get_shortcode_regex(array('bspost')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsplayer') !== false) { $pattern = self::get_shortcode_regex(array('bsplayer')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsmp3') !== false) { $pattern = self::get_shortcode_regex(array('bsmp3')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsruby') !== false) { $pattern = self::get_shortcode_regex(array('bsruby')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsprog') !== false) { $pattern = self::get_shortcode_regex(array('bsprog')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsdate') !== false) { $pattern = self::get_shortcode_regex(array('bsdate')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bspaper') !== false) { $pattern = self::get_shortcode_regex(array('bspaper')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsmark') !== false) { $pattern = self::get_shortcode_regex(array('bsmark')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsmermaid') !== false) { $pattern = self::get_shortcode_regex(array('bsmermaid')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsbtn') !== false) { $pattern = self::get_shortcode_regex(array('bsbtn')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsmessage') !== false) { $pattern = self::get_shortcode_regex(array('bsmessage')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '{bs-hide') !== false) { $pattern = self::get_shortcode_regex2(array('bs-hide')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '{bs-todo') !== false) { $pattern = self::get_shortcode_regex2(array('bs-todo')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '{bs-accord') !== false) { $pattern = self::get_shortcode_regex2(array('bs-accord')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '{bs-font') !== false) { $pattern = self::get_shortcode_regex2(array('bs-font')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '{bs-iframe') !== false) { $pattern = self::get_shortcode_regex2(array('bs-iframe')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsfra') !== false) { $pattern = self::get_shortcode_regex2(array('bsfra')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '{bs-card') !== false) { $pattern = self::get_shortcode_regex2(array('bs-card')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '{bs-audio') !== false) { $pattern = self::get_shortcode_regex2(array('bs-audio')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bstag') !== false || strpos($content, '[tag') !== false) { $pattern = self::get_shortcode_regex(array('bstag','tag')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bsopc') !== false) { $pattern = self::get_shortcode_regex(array('bsopc')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bstip') !== false) { $pattern = self::get_shortcode_regex(array('bstip')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[bskbd') !== false) { $pattern = self::get_shortcode_regex(array('bskbd')); $content = preg_replace("/$pattern/", '', $content); } if (strpos($content, '[e') !== false) { $pattern = self::get_shortcode_regex(array('e')); $content = preg_replace("/$pattern/", '', $content); } if (Bsoptions('article_textindent') == true) { $content = str_replace(' ', '', $content); } return $content; } public static function one($con,$obj,$text) { $text = empty($text)?$con:$text; if(!$obj->is('single') && strpos($text, '{bs-hide') !== false){ $text = '文章包含隐藏内容,请进入文章内页查看~'; } if(!$obj->is('single') && strpos($text, '[bs-hide') !== false){ $text = '文章包含隐藏内容,请进入文章内页查看~'; } if(!$obj->is('single') && strpos($text, '[bshide') !== false){ $text = '文章包含隐藏内容,请进入文章内页查看~'; } if(!$obj->is('single') && strpos($text, '[bslogin') !== false){ $text = '文章包含隐藏内容,请进入文章内页查看~'; } if(!$obj->is('single')){ $text = self::excerpt_text($text); } return $text; } } ================================================ FILE: core/tongji.php ================================================ fields); if (array_key_exists('views', $fields)) $views = (!empty($fields['views'])) ? intval($fields['views']) : 0; else $views = 0; //增加浏览次数 if ($widget->is('single')) { $vieweds = Typecho_Cookie::get('contents_viewed'); if (empty($vieweds)) $vieweds = array(); else $vieweds = explode(',', $vieweds); if (!in_array($widget->cid, $vieweds)) { $views = $views + 1; $widget->setField('views', 'str', strval($views), $widget->cid); $vieweds[] = $widget->cid; $vieweds = implode(',', $vieweds); Typecho_Cookie::set("contents_viewed",$vieweds); } } return $views; } ================================================ FILE: core/usercenter.php ================================================ fetchAll($db->select()->from('table.bscore_sign_data') ->where('signuid = ?',$uid) ->where('signtime = ?', $today) ->limit(1) ); if(!$result){ echo '
        今日尚未签到,点击这里签到
        '; } else{ echo '
        今日已签到
        '; } } //输出用户文章总数 function allpostnum($id){ $db = Typecho_Db::get(); $postnum=$db->fetchRow($db->select(array('COUNT(authorId)'=>'allpostnum'))->from ('table.contents')->where ('table.contents.authorId=?',$id)->where('table.contents.type=?', 'post')->where('table.contents.status = ?', 'publish')->where('table.contents.created < ?', Helper::options()->time)); $postnum = $postnum['allpostnum']; return $postnum; } //输出用户所投稿的文章 function authorPosts($id){ if($id){ $limit = 6; $db = Typecho_Db::get(); $result = $db->fetchAll($db->select()->from('table.contents') ->where('authorId = ?',$id) ->where('type = ?', 'post') ->limit($limit) ->order('cid', Typecho_Db::SORT_DESC) ); if($result){ foreach($result as $val){ $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val); $post_title = htmlspecialchars($val['title']); $permalink = $val['permalink']; if($val['status'] == 'publish'){ $post_title = ''.$post_title.''; } switch($val['status']){ case 'publish': $val['status'] = '审核通过'; break; case 'hidden': $val['status'] = '已被隐藏'; break; case 'password': $val['status'] = '密码保护'; break; case 'private': $val['status'] = '私密不公开'; break; case 'waiting': $val['status'] = '等待审核'; break; } echo ' '.$post_title.' '.date('Y年m月d日',$val['created']).' '.getCategoryName(categeid($val['category'])).' '.$val['status'].' '; } } }else{ echo ''; } } //用户等级判断 function user_tier($coin){ $options = bsOptions::getInstance()::get_option('bearsimple'); if($options['UserCenter_tab']['UserCenter_rank'][0] !== ''){ foreach(Bsoptions('UserCenter_tab')['UserCenter_rank'] as $rank){ if($coin >= $rank['UserCenter_rank_min'] && $rank['UserCenter_rank_max'] >= $coin){ $res = $rank['UserCenter_rank_Name']; if($rank['UserCenter_rank_Pic']){ $res .= ''; } return $res; } } if($res == ''){ $res = '暂未定义等级'; return $res; } } } //用户通知 function userNotify($id){ if($id){ $db = Typecho_Db::get(); $result = $db->fetchAll($db->select()->from('table.bscore_notify_data') ->where('notifyuid = ?',$id) ->order('notifytime', Typecho_Db::SORT_DESC) ); return $result; } } ================================================ FILE: core/widget/Dom.php ================================================ $maxLen) { $dom->clear(); return false; } return $dom->load($contents, $lowercase, $stripRN); } function str_get_html( $str, $lowercase = true, $forceTagsClosed = true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN = true, $defaultBRText = DEFAULT_BR_TEXT, $defaultSpanText = DEFAULT_SPAN_TEXT) { $dom = new simple_html_dom( null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText ); if (empty($str) || strlen($str) > MAX_FILE_SIZE) { $dom->clear(); return false; } return $dom->load($str, $lowercase, $stripRN); } function dump_html_tree($node, $show_attr = true, $deep = 0) { $node->dump($node); } class simple_html_dom_node { public $nodetype = HDOM_TYPE_TEXT; public $tag = 'text'; public $attr = array(); public $children = array(); public $nodes = array(); public $parent = null; public $_ = array(); public $tag_start = 0; private $dom = null; function __construct($dom) { $this->dom = $dom; $dom->nodes[] = $this; } function __destruct() { $this->clear(); } function __toString() { return $this->outertext(); } function clear() { $this->dom = null; $this->nodes = null; $this->parent = null; $this->children = null; } function dump($show_attr = true, $depth = 0) { echo str_repeat("\t", $depth) . $this->tag; if ($show_attr && count($this->attr) > 0) { echo '('; foreach ($this->attr as $k => $v) { echo "[$k]=>\"$v\", "; } echo ')'; } echo "\n"; if ($this->nodes) { foreach ($this->nodes as $node) { $node->dump($show_attr, $depth + 1); } } } function dump_node($echo = true) { $string = $this->tag; if (count($this->attr) > 0) { $string .= '('; foreach ($this->attr as $k => $v) { $string .= "[$k]=>\"$v\", "; } $string .= ')'; } if (count($this->_) > 0) { $string .= ' $_ ('; foreach ($this->_ as $k => $v) { if (is_array($v)) { $string .= "[$k]=>("; foreach ($v as $k2 => $v2) { $string .= "[$k2]=>\"$v2\", "; } $string .= ')'; } else { $string .= "[$k]=>\"$v\", "; } } $string .= ')'; } if (isset($this->text)) { $string .= " text: ({$this->text})"; } $string .= ' HDOM_INNER_INFO: '; if (isset($node->_[HDOM_INFO_INNER])) { $string .= "'" . $node->_[HDOM_INFO_INNER] . "'"; } else { $string .= ' NULL '; } $string .= ' children: ' . count($this->children); $string .= ' nodes: ' . count($this->nodes); $string .= ' tag_start: ' . $this->tag_start; $string .= "\n"; if ($echo) { echo $string; return; } else { return $string; } } function parent($parent = null) { // I am SURE that this doesn't work properly. // It fails to unset the current node from it's current parents nodes or // children list first. if ($parent !== null) { $this->parent = $parent; $this->parent->nodes[] = $this; $this->parent->children[] = $this; } return $this->parent; } function has_child() { return !empty($this->children); } function children($idx = -1) { if ($idx === -1) { return $this->children; } if (isset($this->children[$idx])) { return $this->children[$idx]; } return null; } function first_child() { if (count($this->children) > 0) { return $this->children[0]; } return null; } function last_child() { if (count($this->children) > 0) { return end($this->children); } return null; } function next_sibling() { if ($this->parent === null) { return null; } $idx = array_search($this, $this->parent->children, true); if ($idx !== false && isset($this->parent->children[$idx + 1])) { return $this->parent->children[$idx + 1]; } return null; } function prev_sibling() { if ($this->parent === null) { return null; } $idx = array_search($this, $this->parent->children, true); if ($idx !== false && $idx > 0) { return $this->parent->children[$idx - 1]; } return null; } function find_ancestor_tag($tag) { global $debug_object; if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } if ($this->parent === null) { return null; } $ancestor = $this->parent; while (!is_null($ancestor)) { if (is_object($debug_object)) { $debug_object->debug_log(2, 'Current tag is: ' . $ancestor->tag); } if ($ancestor->tag === $tag) { break; } $ancestor = $ancestor->parent; } return $ancestor; } function innertext() { if (isset($this->_[HDOM_INFO_INNER])) { return $this->_[HDOM_INFO_INNER]; } if (isset($this->_[HDOM_INFO_TEXT])) { return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); } $ret = ''; foreach ($this->nodes as $n) { $ret .= $n->outertext(); } return $ret; } function outertext() { global $debug_object; if (is_object($debug_object)) { $text = ''; if ($this->tag === 'text') { if (!empty($this->text)) { $text = ' with text: ' . $this->text; } } $debug_object->debug_log(1, 'Innertext of tag: ' . $this->tag . $text); } if ($this->tag === 'root') { return $this->innertext(); } // todo: What is the use of this callback? Remove? if ($this->dom && $this->dom->callback !== null) { call_user_func_array($this->dom->callback, array($this)); } if (isset($this->_[HDOM_INFO_OUTER])) { return $this->_[HDOM_INFO_OUTER]; } if (isset($this->_[HDOM_INFO_TEXT])) { return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); } $ret = ''; if ($this->dom && $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]) { $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup(); } if (isset($this->_[HDOM_INFO_INNER])) { // todo:
        should either never have HDOM_INFO_INNER or always if ($this->tag !== 'br') { $ret .= $this->_[HDOM_INFO_INNER]; } } elseif ($this->nodes) { foreach ($this->nodes as $n) { $ret .= $this->convert_text($n->outertext()); } } if (isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END] != 0) { $ret .= 'tag . '>'; } return $ret; } function text() { if (isset($this->_[HDOM_INFO_INNER])) { return $this->_[HDOM_INFO_INNER]; } switch ($this->nodetype) { case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); case HDOM_TYPE_COMMENT: return ''; case HDOM_TYPE_UNKNOWN: return ''; } if (strcasecmp($this->tag, 'script') === 0) { return ''; } if (strcasecmp($this->tag, 'style') === 0) { return ''; } $ret = ''; // In rare cases, (always node type 1 or HDOM_TYPE_ELEMENT - observed // for some span tags, and some p tags) $this->nodes is set to NULL. // NOTE: This indicates that there is a problem where it's set to NULL // without a clear happening. // WHY is this happening? if (!is_null($this->nodes)) { foreach ($this->nodes as $n) { // Start paragraph after a blank line if ($n->tag === 'p') { $ret = trim($ret) . "\n\n"; } $ret .= $this->convert_text($n->text()); // If this node is a span... add a space at the end of it so // multiple spans don't run into each other. This is plaintext // after all. if ($n->tag === 'span') { $ret .= $this->dom->default_span_text; } } } return $ret; } function xmltext() { $ret = $this->innertext(); $ret = str_ireplace('', '', $ret); return $ret; } function makeup() { // text, comment, unknown if (isset($this->_[HDOM_INFO_TEXT])) { return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); } $ret = '<' . $this->tag; $i = -1; foreach ($this->attr as $key => $val) { ++$i; // skip removed attribute if ($val === null || $val === false) { continue; } $ret .= $this->_[HDOM_INFO_SPACE][$i][0]; //no value attr: nowrap, checked selected... if ($val === true) { $ret .= $key; } else { switch ($this->_[HDOM_INFO_QUOTE][$i]) { case HDOM_QUOTE_DOUBLE: $quote = '"'; break; case HDOM_QUOTE_SINGLE: $quote = '\''; break; default: $quote = ''; } $ret .= $key . $this->_[HDOM_INFO_SPACE][$i][1] . '=' . $this->_[HDOM_INFO_SPACE][$i][2] . $quote . $val . $quote; } } $ret = $this->dom->restore_noise($ret); return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>'; } function find($selector, $idx = null, $lowercase = false) { $selectors = $this->parse_selector($selector); if (($count = count($selectors)) === 0) { return array(); } $found_keys = array(); // find each selector for ($c = 0; $c < $count; ++$c) { // The change on the below line was documented on the sourceforge // code tracker id 2788009 // used to be: if (($levle=count($selectors[0]))===0) return array(); if (($levle = count($selectors[$c])) === 0) { return array(); } if (!isset($this->_[HDOM_INFO_BEGIN])) { return array(); } $head = array($this->_[HDOM_INFO_BEGIN] => 1); $cmd = ' '; // Combinator // handle descendant selectors, no recursive! for ($l = 0; $l < $levle; ++$l) { $ret = array(); foreach ($head as $k => $v) { $n = ($k === -1) ? $this->dom->root : $this->dom->nodes[$k]; //PaperG - Pass this optional parameter on to the seek function. $n->seek($selectors[$c][$l], $ret, $cmd, $lowercase); } $head = $ret; $cmd = $selectors[$c][$l][4]; // Next Combinator } foreach ($head as $k => $v) { if (!isset($found_keys[$k])) { $found_keys[$k] = 1; } } } // sort keys ksort($found_keys); $found = array(); foreach ($found_keys as $k => $v) { $found[] = $this->dom->nodes[$k]; } // return nth-element or array if (is_null($idx)) { return $found; } elseif ($idx < 0) { $idx = count($found) + $idx; } return (isset($found[$idx])) ? $found[$idx] : null; } protected function seek($selector, &$ret, $parent_cmd, $lowercase = false) { global $debug_object; if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } list($tag, $id, $class, $attributes, $cmb) = $selector; $nodes = array(); if ($parent_cmd === ' ') { // Descendant Combinator // Find parent closing tag if the current element doesn't have a closing // tag (i.e. void element) $end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0; if ($end == 0) { $parent = $this->parent; while (!isset($parent->_[HDOM_INFO_END]) && $parent !== null) { $end -= 1; $parent = $parent->parent; } $end += $parent->_[HDOM_INFO_END]; } // Get list of target nodes $nodes_start = $this->_[HDOM_INFO_BEGIN] + 1; $nodes_count = $end - $nodes_start; $nodes = array_slice($this->dom->nodes, $nodes_start, $nodes_count, true); } elseif ($parent_cmd === '>') { // Child Combinator $nodes = $this->children; } elseif ($parent_cmd === '+' && $this->parent && in_array($this, $this->parent->children)) { // Next-Sibling Combinator $index = array_search($this, $this->parent->children, true) + 1; if ($index < count($this->parent->children)) $nodes[] = $this->parent->children[$index]; } elseif ($parent_cmd === '~' && $this->parent && in_array($this, $this->parent->children)) { // Subsequent Sibling Combinator $index = array_search($this, $this->parent->children, true); $nodes = array_slice($this->parent->children, $index); } // Go throgh each element starting at this element until the end tag // Note: If this element is a void tag, any previous void element is // skipped. foreach($nodes as $node) { $pass = true; // Skip root nodes if(!$node->parent) { $pass = false; } // Skip if node isn't a child node (i.e. text nodes) if($pass && !in_array($node, $node->parent->children, true)) { $pass = false; } // Skip if tag doesn't match if ($pass && $tag !== '' && $tag !== $node->tag && $tag !== '*') { $pass = false; } // Skip if ID doesn't exist if ($pass && $id !== '' && !isset($node->attr['id'])) { $pass = false; } // Check if ID matches if ($pass && $id !== '' && isset($node->attr['id'])) { // Note: Only consider the first ID (as browsers do) $node_id = explode(' ', trim($node->attr['id']))[0]; if($id !== $node_id) { $pass = false; } } // Check if all class(es) exist if ($pass && $class !== '' && is_array($class) && !empty($class)) { if (isset($node->attr['class'])) { $node_classes = explode(' ', $node->attr['class']); if ($lowercase) { $node_classes = array_map('strtolower', $node_classes); } foreach($class as $c) { if(!in_array($c, $node_classes)) { $pass = false; break; } } } else { $pass = false; } } // Check attributes if ($pass && $attributes !== '' && is_array($attributes) && !empty($attributes)) { foreach($attributes as $a) { list ( $att_name, $att_expr, $att_val, $att_inv, $att_case_sensitivity ) = $a; // Handle indexing attributes (i.e. "[2]") /** * Note: This is not supported by the CSS Standard but adds * the ability to select items compatible to XPath (i.e. * the 3rd element within it's parent). * * Note: This doesn't conflict with the CSS Standard which * doesn't work on numeric attributes anyway. */ if (is_numeric($att_name) && $att_expr === '' && $att_val === '') { $count = 0; // Find index of current element in parent foreach ($node->parent->children as $c) { if ($c->tag === $node->tag) ++$count; if ($c === $node) break; } // If this is the correct node, continue with next // attribute if ($count === (int)$att_name) continue; } // Check attribute availability if ($att_inv) { // Attribute should NOT be set if (isset($node->attr[$att_name])) { $pass = false; break; } } else { // Attribute should be set // todo: "plaintext" is not a valid CSS selector! if ($att_name !== 'plaintext' && !isset($node->attr[$att_name])) { $pass = false; break; } } // Continue with next attribute if expression isn't defined if ($att_expr === '') continue; // If they have told us that this is a "plaintext" // search then we want the plaintext of the node - right? // todo "plaintext" is not a valid CSS selector! if ($att_name === 'plaintext') { $nodeKeyValue = $node->text(); } else { $nodeKeyValue = $node->attr[$att_name]; } if (is_object($debug_object)) { $debug_object->debug_log(2, 'testing node: ' . $node->tag . ' for attribute: ' . $att_name . $att_expr . $att_val . ' where nodes value is: ' . $nodeKeyValue ); } // If lowercase is set, do a case insensitive test of // the value of the selector. if ($lowercase) { $check = $this->match( $att_expr, strtolower($att_val), strtolower($nodeKeyValue), $att_case_sensitivity ); } else { $check = $this->match( $att_expr, $att_val, $nodeKeyValue, $att_case_sensitivity ); } if (is_object($debug_object)) { $debug_object->debug_log(2, 'after match: ' . ($check ? 'true' : 'false') ); } if (!$check) { $pass = false; break; } } } // Found a match. Add to list and clear node if ($pass) $ret[$node->_[HDOM_INFO_BEGIN]] = 1; unset($node); } // It's passed by reference so this is actually what this function returns. if (is_object($debug_object)) { $debug_object->debug_log(1, 'EXIT - ret: ', $ret); } } protected function match($exp, $pattern, $value, $case_sensitivity) { global $debug_object; if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} if ($case_sensitivity === 'i') { $pattern = strtolower($pattern); $value = strtolower($value); } switch ($exp) { case '=': return ($value === $pattern); case '!=': return ($value !== $pattern); case '^=': return preg_match('/^' . preg_quote($pattern, '/') . '/', $value); case '$=': return preg_match('/' . preg_quote($pattern, '/') . '$/', $value); case '*=': return preg_match('/' . preg_quote($pattern, '/') . '/', $value); case '|=': /** * [att|=val] * * Represents an element with the att attribute, its value * either being exactly "val" or beginning with "val" * immediately followed by "-" (U+002D). */ return strpos($value, $pattern) === 0; case '~=': /** * [att~=val] * * Represents an element with the att attribute whose value is a * whitespace-separated list of words, one of which is exactly * "val". If "val" contains whitespace, it will never represent * anything (since the words are separated by spaces). Also if * "val" is the empty string, it will never represent anything. */ return in_array($pattern, explode(' ', trim($value)), true); } return false; } protected function parse_selector($selector_string) { global $debug_object; if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } /** * Pattern of CSS selectors, modified from mootools (https://mootools.net/) * * Paperg: Add the colon to the attribute, so that it properly finds * like google does. * * Note: if you try to look at this attribute, you MUST use getAttribute * since $dom->x:y will fail the php syntax check. * * Notice the \[ starting the attribute? and the @? following? This * implies that an attribute can begin with an @ sign that is not * captured. This implies that an html attribute specifier may start * with an @ sign that is NOT captured by the expression. Farther study * is required to determine of this should be documented or removed. * * Matches selectors in this order: * * [0] - full match * * [1] - tag name * ([\w:\*-]*) * Matches the tag name consisting of zero or more words, colons, * asterisks and hyphens. * * [2] - id name * (?:\#([\w-]+)) * Optionally matches a id name, consisting of an "#" followed by * the id name (one or more words and hyphens). * * [3] - class names (including dots) * (?:\.([\w\.-]+))? * Optionally matches a list of classs, consisting of an "." * followed by the class name (one or more words and hyphens) * where multiple classes can be chained (i.e. ".foo.bar.baz") * * [4] - attributes * ((?:\[@?(?:!?[\w:-]+)(?:(?:[!*^$|~]?=)[\"']?(?:.*?)[\"']?)?(?:\s*?(?:[iIsS])?)?\])+)? * Optionally matches the attributes list * * [5] - separator * ([\/, >+~]+) * Matches the selector list separator */ // phpcs:ignore Generic.Files.LineLength $pattern = "/([\w:\*-]*)(?:\#([\w-]+))?(?:|\.([\w\.-]+))?((?:\[@?(?:!?[\w:-]+)(?:(?:[!*^$|~]?=)[\"']?(?:.*?)[\"']?)?(?:\s*?(?:[iIsS])?)?\])+)?([\/, >+~]+)/is"; preg_match_all( $pattern, trim($selector_string) . ' ', // Add final ' ' as pseudo separator $matches, PREG_SET_ORDER ); if (is_object($debug_object)) { $debug_object->debug_log(2, 'Matches Array: ', $matches); } $selectors = array(); $result = array(); foreach ($matches as $m) { $m[0] = trim($m[0]); // Skip NoOps if ($m[0] === '' || $m[0] === '/' || $m[0] === '//') { continue; } // Convert to lowercase if ($this->dom->lowercase) { $m[1] = strtolower($m[1]); } // Extract classes if ($m[3] !== '') { $m[3] = explode('.', $m[3]); } /* Extract attributes (pattern based on the pattern above!) * [0] - full match * [1] - attribute name * [2] - attribute expression * [3] - attribute value * [4] - case sensitivity * * Note: Attributes can be negated with a "!" prefix to their name */ if($m[4] !== '') { preg_match_all( "/\[@?(!?[\w:-]+)(?:([!*^$|~]?=)[\"']?(.*?)[\"']?)?(?:\s+?([iIsS])?)?\]/is", trim($m[4]), $attributes, PREG_SET_ORDER ); // Replace element by array $m[4] = array(); foreach($attributes as $att) { // Skip empty matches if(trim($att[0]) === '') { continue; } $inverted = (isset($att[1][0]) && $att[1][0] === '!'); $m[4][] = array( $inverted ? substr($att[1], 1) : $att[1], // Name (isset($att[2])) ? $att[2] : '', // Expression (isset($att[3])) ? $att[3] : '', // Value $inverted, // Inverted Flag (isset($att[4])) ? strtolower($att[4]) : '', // Case-Sensitivity ); } } // Sanitize Separator if ($m[5] !== '' && trim($m[5]) === '') { // Descendant Separator $m[5] = ' '; } else { // Other Separator $m[5] = trim($m[5]); } // Clear Separator if it's a Selector List if ($is_list = ($m[5] === ',')) { $m[5] = ''; } // Remove full match before adding to results array_shift($m); $result[] = $m; if ($is_list) { // Selector List $selectors[] = $result; $result = array(); } } if (count($result) > 0) { $selectors[] = $result; } return $selectors; } function __get($name) { if (isset($this->attr[$name])) { return $this->convert_text($this->attr[$name]); } switch ($name) { case 'outertext': return $this->outertext(); case 'innertext': return $this->innertext(); case 'plaintext': return $this->text(); case 'xmltext': return $this->xmltext(); default: return array_key_exists($name, $this->attr); } } function __set($name, $value) { global $debug_object; if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } switch ($name) { case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value; case 'innertext': if (isset($this->_[HDOM_INFO_TEXT])) { return $this->_[HDOM_INFO_TEXT] = $value; } return $this->_[HDOM_INFO_INNER] = $value; } if (!isset($this->attr[$name])) { $this->_[HDOM_INFO_SPACE][] = array(' ', '', ''); $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE; } $this->attr[$name] = $value; } function __isset($name) { switch ($name) { case 'outertext': return true; case 'innertext': return true; case 'plaintext': return true; } //no value attr: nowrap, checked selected... return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]); } function __unset($name) { if (isset($this->attr[$name])) { unset($this->attr[$name]); } } function convert_text($text) { global $debug_object; if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } $converted_text = $text; $sourceCharset = ''; $targetCharset = ''; if ($this->dom) { $sourceCharset = strtoupper($this->dom->_charset); $targetCharset = strtoupper($this->dom->_target_charset); } if (is_object($debug_object)) { $debug_object->debug_log(3, 'source charset: ' . $sourceCharset . ' target charaset: ' . $targetCharset ); } if (!empty($sourceCharset) && !empty($targetCharset) && (strcasecmp($sourceCharset, $targetCharset) != 0)) { // Check if the reported encoding could have been incorrect and the text is actually already UTF-8 if ((strcasecmp($targetCharset, 'UTF-8') == 0) && ($this->is_utf8($text))) { $converted_text = $text; } else { $converted_text = iconv($sourceCharset, $targetCharset, $text); } } // Lets make sure that we don't have that silly BOM issue with any of the utf-8 text we output. if ($targetCharset === 'UTF-8') { if (substr($converted_text, 0, 3) === "\xef\xbb\xbf") { $converted_text = substr($converted_text, 3); } if (substr($converted_text, -3) === "\xef\xbb\xbf") { $converted_text = substr($converted_text, 0, -3); } } return $converted_text; } static function is_utf8($str) { $c = 0; $b = 0; $bits = 0; $len = strlen($str); for($i = 0; $i < $len; $i++) { $c = ord($str[$i]); if($c > 128) { if(($c >= 254)) { return false; } elseif($c >= 252) { $bits = 6; } elseif($c >= 248) { $bits = 5; } elseif($c >= 240) { $bits = 4; } elseif($c >= 224) { $bits = 3; } elseif($c >= 192) { $bits = 2; } else { return false; } if(($i + $bits) > $len) { return false; } while($bits > 1) { $i++; $b = ord($str[$i]); if($b < 128 || $b > 191) { return false; } $bits--; } } } return true; } function get_display_size() { global $debug_object; $width = -1; $height = -1; if ($this->tag !== 'img') { return false; } // See if there is aheight or width attribute in the tag itself. if (isset($this->attr['width'])) { $width = $this->attr['width']; } if (isset($this->attr['height'])) { $height = $this->attr['height']; } // Now look for an inline style. if (isset($this->attr['style'])) { // Thanks to user gnarf from stackoverflow for this regular expression. $attributes = array(); preg_match_all( '/([\w-]+)\s*:\s*([^;]+)\s*;?/', $this->attr['style'], $matches, PREG_SET_ORDER ); foreach ($matches as $match) { $attributes[$match[1]] = $match[2]; } // If there is a width in the style attributes: if (isset($attributes['width']) && $width == -1) { // check that the last two characters are px (pixels) if (strtolower(substr($attributes['width'], -2)) === 'px') { $proposed_width = substr($attributes['width'], 0, -2); // Now make sure that it's an integer and not something stupid. if (filter_var($proposed_width, FILTER_VALIDATE_INT)) { $width = $proposed_width; } } } // If there is a width in the style attributes: if (isset($attributes['height']) && $height == -1) { // check that the last two characters are px (pixels) if (strtolower(substr($attributes['height'], -2)) == 'px') { $proposed_height = substr($attributes['height'], 0, -2); // Now make sure that it's an integer and not something stupid. if (filter_var($proposed_height, FILTER_VALIDATE_INT)) { $height = $proposed_height; } } } } // Future enhancement: // Look in the tag to see if there is a class or id specified that has // a height or width attribute to it. // Far future enhancement // Look at all the parent tags of this image to see if they specify a // class or id that has an img selector that specifies a height or width // Note that in this case, the class or id will have the img subselector // for it to apply to the image. // ridiculously far future development // If the class or id is specified in a SEPARATE css file thats not on // the page, go get it and do what we were just doing for the ones on // the page. $result = array( 'height' => $height, 'width' => $width ); return $result; } function save($filepath = '') { $ret = $this->outertext(); if ($filepath !== '') { file_put_contents($filepath, $ret, LOCK_EX); } return $ret; } function addClass($class) { if (is_string($class)) { $class = explode(' ', $class); } if (is_array($class)) { foreach($class as $c) { if (isset($this->class)) { if ($this->hasClass($c)) { continue; } else { $this->class .= ' ' . $c; } } else { $this->class = $c; } } } else { if (is_object($debug_object)) { $debug_object->debug_log(2, 'Invalid type: ', gettype($class)); } } } function hasClass($class) { if (is_string($class)) { if (isset($this->class)) { return in_array($class, explode(' ', $this->class), true); } } else { if (is_object($debug_object)) { $debug_object->debug_log(2, 'Invalid type: ', gettype($class)); } } return false; } function removeClass($class = null) { if (!isset($this->class)) { return; } if (is_null($class)) { $this->removeAttribute('class'); return; } if (is_string($class)) { $class = explode(' ', $class); } if (is_array($class)) { $class = array_diff(explode(' ', $this->class), $class); if (empty($class)) { $this->removeAttribute('class'); } else { $this->class = implode(' ', $class); } } } function getAllAttributes() { return $this->attr; } function getAttribute($name) { return $this->__get($name); } function setAttribute($name, $value) { $this->__set($name, $value); } function hasAttribute($name) { return $this->__isset($name); } function removeAttribute($name) { $this->__set($name, null); } function remove() { if ($this->parent) { $this->parent->removeChild($this); } } function removeChild($node) { $nidx = array_search($node, $this->nodes, true); $cidx = array_search($node, $this->children, true); $didx = array_search($node, $this->dom->nodes, true); if ($nidx !== false && $cidx !== false && $didx !== false) { foreach($node->children as $child) { $node->removeChild($child); } foreach($node->nodes as $entity) { $enidx = array_search($entity, $node->nodes, true); $edidx = array_search($entity, $node->dom->nodes, true); if ($enidx !== false && $edidx !== false) { unset($node->nodes[$enidx]); unset($node->dom->nodes[$edidx]); } } unset($this->nodes[$nidx]); unset($this->children[$cidx]); unset($this->dom->nodes[$didx]); $node->clear(); } } function getElementById($id) { return $this->find("#$id", 0); } function getElementsById($id, $idx = null) { return $this->find("#$id", $idx); } function getElementByTagName($name) { return $this->find($name, 0); } function getElementsByTagName($name, $idx = null) { return $this->find($name, $idx); } function parentNode() { return $this->parent(); } function childNodes($idx = -1) { return $this->children($idx); } function firstChild() { return $this->first_child(); } function lastChild() { return $this->last_child(); } function nextSibling() { return $this->next_sibling(); } function previousSibling() { return $this->prev_sibling(); } function hasChildNodes() { return $this->has_child(); } function nodeName() { return $this->tag; } function appendChild($node) { $node->parent($this); return $node; } } class simple_html_dom { public $root = null; public $nodes = array(); public $callback = null; public $lowercase = false; public $original_size; public $size; protected $pos; protected $doc; protected $char; protected $cursor; protected $parent; protected $noise = array(); protected $token_blank = " \t\r\n"; protected $token_equal = ' =/>'; protected $token_slash = " />\r\n\t"; protected $token_attr = ' >'; public $_charset = ''; public $_target_charset = ''; protected $default_br_text = ''; public $default_span_text = ''; protected $self_closing_tags = array( 'area' => 1, 'base' => 1, 'br' => 1, 'col' => 1, 'embed' => 1, 'hr' => 1, 'img' => 1, 'input' => 1, 'link' => 1, 'meta' => 1, 'param' => 1, 'source' => 1, 'track' => 1, 'wbr' => 1 ); protected $block_tags = array( 'body' => 1, 'div' => 1, 'form' => 1, 'root' => 1, 'span' => 1, 'table' => 1 ); protected $optional_closing_tags = array( // Not optional, see // https://www.w3.org/TR/html/textlevel-semantics.html#the-b-element 'b' => array('b' => 1), 'dd' => array('dd' => 1, 'dt' => 1), // Not optional, see // https://www.w3.org/TR/html/grouping-content.html#the-dl-element 'dl' => array('dd' => 1, 'dt' => 1), 'dt' => array('dd' => 1, 'dt' => 1), 'li' => array('li' => 1), 'optgroup' => array('optgroup' => 1, 'option' => 1), 'option' => array('optgroup' => 1, 'option' => 1), 'p' => array('p' => 1), 'rp' => array('rp' => 1, 'rt' => 1), 'rt' => array('rp' => 1, 'rt' => 1), 'td' => array('td' => 1, 'th' => 1), 'th' => array('td' => 1, 'th' => 1), 'tr' => array('td' => 1, 'th' => 1, 'tr' => 1), ); function __construct( $str = null, $lowercase = true, $forceTagsClosed = true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN = true, $defaultBRText = DEFAULT_BR_TEXT, $defaultSpanText = DEFAULT_SPAN_TEXT, $options = 0) { if ($str) { if (preg_match('/^http:\/\//i', $str) || is_file($str)) { $this->load_file($str); } else { $this->load( $str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText, $options ); } } // Forcing tags to be closed implies that we don't trust the html, but // it can lead to parsing errors if we SHOULD trust the html. if (!$forceTagsClosed) { $this->optional_closing_array = array(); } $this->_target_charset = $target_charset; } function __destruct() { $this->clear(); } function load( $str, $lowercase = true, $stripRN = true, $defaultBRText = DEFAULT_BR_TEXT, $defaultSpanText = DEFAULT_SPAN_TEXT, $options = 0) { global $debug_object; // prepare $this->prepare($str, $lowercase, $defaultBRText, $defaultSpanText); // Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037 // Script tags removal now preceeds style tag removal. // strip out '); } else { // js format static::writeOutput(self::generateScript()); } static::resetStatic(); } } public function close(): void { self::resetStatic(); } public function reset(): void { parent::reset(); self::resetStatic(); } /** * Forget all logged records */ public static function resetStatic(): void { static::$records = []; } /** * Wrapper for register_shutdown_function to allow overriding */ protected function registerShutdownFunction(): void { if (PHP_SAPI !== 'cli') { register_shutdown_function(['Monolog\Handler\BrowserConsoleHandler', 'send']); } } /** * Wrapper for echo to allow overriding */ protected static function writeOutput(string $str): void { echo $str; } /** * Checks the format of the response * * If Content-Type is set to application/javascript or text/javascript -> js * If Content-Type is set to text/html, or is unset -> html * If Content-Type is anything else -> unknown * * @return string One of 'js', 'html' or 'unknown' * @phpstan-return self::FORMAT_* */ protected static function getResponseFormat(): string { // Check content type foreach (headers_list() as $header) { if (stripos($header, 'content-type:') === 0) { return static::getResponseFormatFromContentType($header); } } return self::FORMAT_HTML; } /** * @return string One of 'js', 'html' or 'unknown' * @phpstan-return self::FORMAT_* */ protected static function getResponseFormatFromContentType(string $contentType): string { // This handler only works with HTML and javascript outputs // text/javascript is obsolete in favour of application/javascript, but still used if (stripos($contentType, 'application/javascript') !== false || stripos($contentType, 'text/javascript') !== false) { return self::FORMAT_JS; } if (stripos($contentType, 'text/html') !== false) { return self::FORMAT_HTML; } return self::FORMAT_UNKNOWN; } private static function generateScript(): string { $script = []; foreach (static::$records as $record) { $context = self::dump('Context', $record->context); $extra = self::dump('Extra', $record->extra); if (\count($context) === 0 && \count($extra) === 0) { $script[] = self::call_array(self::getConsoleMethodForLevel($record->level), self::handleStyles($record->formatted)); } else { $script = array_merge( $script, [self::call_array('groupCollapsed', self::handleStyles($record->formatted))], $context, $extra, [self::call('groupEnd')] ); } } return "(function (c) {if (c && c.groupCollapsed) {\n" . implode("\n", $script) . "\n}})(console);"; } private static function getConsoleMethodForLevel(Level $level): string { return match ($level) { Level::Debug => 'debug', Level::Info, Level::Notice => 'info', Level::Warning => 'warn', Level::Error, Level::Critical, Level::Alert, Level::Emergency => 'error', }; } /** * @return string[] */ private static function handleStyles(string $formatted): array { $args = []; $format = '%c' . $formatted; preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); foreach (array_reverse($matches) as $match) { $args[] = '"font-weight: normal"'; $args[] = self::quote(self::handleCustomStyles($match[2][0], $match[1][0])); $pos = $match[0][1]; $format = Utils::substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . Utils::substr($format, $pos + strlen($match[0][0])); } $args[] = self::quote('font-weight: normal'); $args[] = self::quote($format); return array_reverse($args); } private static function handleCustomStyles(string $style, string $string): string { static $colors = ['blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey']; static $labels = []; $style = preg_replace_callback('/macro\s*:(.*?)(?:;|$)/', function (array $m) use ($string, &$colors, &$labels) { if (trim($m[1]) === 'autolabel') { // Format the string as a label with consistent auto assigned background color if (!isset($labels[$string])) { $labels[$string] = $colors[count($labels) % count($colors)]; } $color = $labels[$string]; return "background-color: $color; color: white; border-radius: 3px; padding: 0 2px 0 2px"; } return $m[1]; }, $style); if (null === $style) { $pcreErrorCode = preg_last_error(); throw new \RuntimeException('Failed to run preg_replace_callback: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); } return $style; } /** * @param mixed[] $dict * @return mixed[] */ private static function dump(string $title, array $dict): array { $script = []; $dict = array_filter($dict); if (\count($dict) === 0) { return $script; } $script[] = self::call('log', self::quote('%c%s'), self::quote('font-weight: bold'), self::quote($title)); foreach ($dict as $key => $value) { $value = json_encode($value); if (false === $value) { $value = self::quote(''); } $script[] = self::call('log', self::quote('%s: %o'), self::quote((string) $key), $value); } return $script; } private static function quote(string $arg): string { return '"' . addcslashes($arg, "\"\n\\") . '"'; } /** * @param mixed $args */ private static function call(...$args): string { $method = array_shift($args); if (!is_string($method)) { throw new \UnexpectedValueException('Expected the first arg to be a string, got: '.var_export($method, true)); } return self::call_array($method, $args); } /** * @param mixed[] $args */ private static function call_array(string $method, array $args): string { return 'c.' . $method . '(' . implode(', ', $args) . ');'; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\ResettableInterface; use Monolog\Formatter\FormatterInterface; use Monolog\LogRecord; /** * Buffers all records until closing the handler and then pass them as batch. * * This is useful for a MailHandler to send only one mail per request instead of * sending one per log message. * * @author Christophe Coevoet */ class BufferHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface { use ProcessableHandlerTrait; protected HandlerInterface $handler; protected int $bufferSize = 0; protected int $bufferLimit; protected bool $flushOnOverflow; /** @var LogRecord[] */ protected array $buffer = []; protected bool $initialized = false; /** * @param HandlerInterface $handler Handler. * @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. * @param bool $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded */ public function __construct(HandlerInterface $handler, int $bufferLimit = 0, int|string|Level $level = Level::Debug, bool $bubble = true, bool $flushOnOverflow = false) { parent::__construct($level, $bubble); $this->handler = $handler; $this->bufferLimit = $bufferLimit; $this->flushOnOverflow = $flushOnOverflow; } /** * @inheritDoc */ public function handle(LogRecord $record): bool { if ($record->level->isLowerThan($this->level)) { return false; } if (!$this->initialized) { // __destructor() doesn't get called on Fatal errors register_shutdown_function([$this, 'close']); $this->initialized = true; } if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) { if ($this->flushOnOverflow) { $this->flush(); } else { array_shift($this->buffer); $this->bufferSize--; } } if (\count($this->processors) > 0) { $record = $this->processRecord($record); } $this->buffer[] = $record; $this->bufferSize++; return false === $this->bubble; } public function flush(): void { if ($this->bufferSize === 0) { return; } $this->handler->handleBatch($this->buffer); $this->clear(); } public function __destruct() { // suppress the parent behavior since we already have register_shutdown_function() // to call close(), and the reference contained there will prevent this from being // GC'd until the end of the request } /** * @inheritDoc */ public function close(): void { $this->flush(); $this->handler->close(); } /** * Clears the buffer without flushing any messages down to the wrapped handler. */ public function clear(): void { $this->bufferSize = 0; $this->buffer = []; } public function reset(): void { $this->flush(); parent::reset(); $this->resetProcessors(); if ($this->handler instanceof ResettableInterface) { $this->handler->reset(); } } /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($this->handler instanceof FormattableHandlerInterface) { $this->handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); } /** * @inheritDoc */ public function getFormatter(): FormatterInterface { if ($this->handler instanceof FormattableHandlerInterface) { return $this->handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\ChromePHPFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Level; use Monolog\Utils; use Monolog\LogRecord; use Monolog\DateTimeImmutable; /** * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/) * * This also works out of the box with Firefox 43+ * * @author Christophe Coevoet */ class ChromePHPHandler extends AbstractProcessingHandler { use WebRequestRecognizerTrait; /** * Version of the extension */ protected const VERSION = '4.0'; /** * Header name */ protected const HEADER_NAME = 'X-ChromeLogger-Data'; /** * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+) */ protected const USER_AGENT_REGEX = '{\b(?:Chrome/\d+(?:\.\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\d|\d{3,})(?:\.\d)*)\b}'; protected static bool $initialized = false; /** * Tracks whether we sent too much data * * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending */ protected static bool $overflowed = false; /** @var mixed[] */ protected static array $json = [ 'version' => self::VERSION, 'columns' => ['label', 'log', 'backtrace', 'type'], 'rows' => [], ]; protected static bool $sendHeaders = true; /** * @throws \RuntimeException If the function json_encode does not exist */ public function __construct(int|string|Level $level = Level::Debug, bool $bubble = true) { parent::__construct($level, $bubble); if (!function_exists('json_encode')) { throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s ChromePHPHandler'); } } /** * @inheritDoc */ public function handleBatch(array $records): void { if (!$this->isWebRequest()) { return; } $messages = []; foreach ($records as $record) { if ($record->level < $this->level) { continue; } $message = $this->processRecord($record); $messages[] = $message; } if (\count($messages) > 0) { $messages = $this->getFormatter()->formatBatch($messages); self::$json['rows'] = array_merge(self::$json['rows'], $messages); $this->send(); } } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new ChromePHPFormatter(); } /** * Creates & sends header for a record * * @see sendHeader() * @see send() */ protected function write(LogRecord $record): void { if (!$this->isWebRequest()) { return; } self::$json['rows'][] = $record->formatted; $this->send(); } /** * Sends the log header * * @see sendHeader() */ protected function send(): void { if (self::$overflowed || !self::$sendHeaders) { return; } if (!self::$initialized) { self::$initialized = true; self::$sendHeaders = $this->headersAccepted(); if (!self::$sendHeaders) { return; } self::$json['request_uri'] = $_SERVER['REQUEST_URI'] ?? ''; } $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true); $data = base64_encode($json); if (strlen($data) > 3 * 1024) { self::$overflowed = true; $record = new LogRecord( message: 'Incomplete logs, chrome header size limit reached', level: Level::Warning, channel: 'monolog', datetime: new DateTimeImmutable(true), ); self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true); $data = base64_encode($json); } if (trim($data) !== '') { $this->sendHeader(static::HEADER_NAME, $data); } } /** * Send header string to the client */ protected function sendHeader(string $header, string $content): void { if (!headers_sent() && self::$sendHeaders) { header(sprintf('%s: %s', $header, $content)); } } /** * Verifies if the headers are accepted by the current user agent */ protected function headersAccepted(): bool { if (!isset($_SERVER['HTTP_USER_AGENT'])) { return false; } return preg_match(static::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']) === 1; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\JsonFormatter; use Monolog\Level; use Monolog\LogRecord; /** * CouchDB handler * * @author Markus Bachmann * @phpstan-type Options array{ * host: string, * port: int, * dbname: string, * username: string|null, * password: string|null * } * @phpstan-type InputOptions array{ * host?: string, * port?: int, * dbname?: string, * username?: string|null, * password?: string|null * } */ class CouchDBHandler extends AbstractProcessingHandler { /** * @var mixed[] * @phpstan-var Options */ private array $options; /** * @param mixed[] $options * * @phpstan-param InputOptions $options */ public function __construct(array $options = [], int|string|Level $level = Level::Debug, bool $bubble = true) { $this->options = array_merge([ 'host' => 'localhost', 'port' => 5984, 'dbname' => 'logger', 'username' => null, 'password' => null, ], $options); parent::__construct($level, $bubble); } /** * @inheritDoc */ protected function write(LogRecord $record): void { $basicAuth = null; if (null !== $this->options['username'] && null !== $this->options['password']) { $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']); } $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname']; $context = stream_context_create([ 'http' => [ 'method' => 'POST', 'content' => $record->formatted, 'ignore_errors' => true, 'max_redirects' => 0, 'header' => 'Content-type: application/json', ], ]); if (false === @file_get_contents($url, false, $context)) { throw new \RuntimeException(sprintf('Could not connect to %s', $url)); } } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Utils; use Monolog\LogRecord; /** * Logs to Cube. * * @link https://github.com/square/cube/wiki * @author Wan Chen * @deprecated Since 2.8.0 and 3.2.0, Cube appears abandoned and thus we will drop this handler in Monolog 4 */ class CubeHandler extends AbstractProcessingHandler { private ?\Socket $udpConnection = null; private ?\CurlHandle $httpConnection = null; private string $scheme; private string $host; private int $port; /** @var string[] */ private array $acceptedSchemes = ['http', 'udp']; /** * Create a Cube handler * * @throws \UnexpectedValueException when given url is not a valid url. * A valid url must consist of three parts : protocol://host:port * Only valid protocols used by Cube are http and udp */ public function __construct(string $url, int|string|Level $level = Level::Debug, bool $bubble = true) { $urlInfo = parse_url($url); if ($urlInfo === false || !isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) { throw new \UnexpectedValueException('URL "'.$url.'" is not valid'); } if (!in_array($urlInfo['scheme'], $this->acceptedSchemes, true)) { throw new \UnexpectedValueException( 'Invalid protocol (' . $urlInfo['scheme'] . ').' . ' Valid options are ' . implode(', ', $this->acceptedSchemes) ); } $this->scheme = $urlInfo['scheme']; $this->host = $urlInfo['host']; $this->port = $urlInfo['port']; parent::__construct($level, $bubble); } /** * Establish a connection to an UDP socket * * @throws \LogicException when unable to connect to the socket * @throws MissingExtensionException when there is no socket extension */ protected function connectUdp(): void { if (!extension_loaded('sockets')) { throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler'); } $udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0); if (false === $udpConnection) { throw new \LogicException('Unable to create a socket'); } $this->udpConnection = $udpConnection; if (!socket_connect($this->udpConnection, $this->host, $this->port)) { throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port); } } /** * Establish a connection to an http server * * @throws \LogicException when unable to connect to the socket * @throws MissingExtensionException when no curl extension */ protected function connectHttp(): void { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is required to use http URLs with the CubeHandler'); } $httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put'); if (false === $httpConnection) { throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port); } $this->httpConnection = $httpConnection; curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true); } /** * @inheritDoc */ protected function write(LogRecord $record): void { $date = $record->datetime; $data = ['time' => $date->format('Y-m-d\TH:i:s.uO')]; $context = $record->context; if (isset($context['type'])) { $data['type'] = $context['type']; unset($context['type']); } else { $data['type'] = $record->channel; } $data['data'] = $context; $data['data']['level'] = $record->level; if ($this->scheme === 'http') { $this->writeHttp(Utils::jsonEncode($data)); } else { $this->writeUdp(Utils::jsonEncode($data)); } } private function writeUdp(string $data): void { if (null === $this->udpConnection) { $this->connectUdp(); } if (null === $this->udpConnection) { throw new \LogicException('No UDP socket could be opened'); } socket_send($this->udpConnection, $data, strlen($data), 0); } private function writeHttp(string $data): void { if (null === $this->httpConnection) { $this->connectHttp(); } if (null === $this->httpConnection) { throw new \LogicException('No connection could be established'); } curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']'); curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen('['.$data.']'), ]); Curl\Util::execute($this->httpConnection, 5, false); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\Curl; use CurlHandle; /** * This class is marked as internal and it is not under the BC promise of the package. * * @internal */ final class Util { /** @var array */ private static array $retriableErrorCodes = [ CURLE_COULDNT_RESOLVE_HOST, CURLE_COULDNT_CONNECT, CURLE_HTTP_NOT_FOUND, CURLE_READ_ERROR, CURLE_OPERATION_TIMEOUTED, CURLE_HTTP_POST_ERROR, CURLE_SSL_CONNECT_ERROR, ]; /** * Executes a CURL request with optional retries and exception on failure * * @param CurlHandle $ch curl handler * @return bool|string @see curl_exec */ public static function execute(CurlHandle $ch, int $retries = 5, bool $closeAfterDone = true) { while ($retries--) { $curlResponse = curl_exec($ch); if ($curlResponse === false) { $curlErrno = curl_errno($ch); if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || $retries === 0) { $curlError = curl_error($ch); if ($closeAfterDone) { curl_close($ch); } throw new \RuntimeException(sprintf('Curl error (code %d): %s', $curlErrno, $curlError)); } continue; } if ($closeAfterDone) { curl_close($ch); } return $curlResponse; } return false; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Logger; use Psr\Log\LogLevel; use Monolog\LogRecord; /** * Simple handler wrapper that deduplicates log records across multiple requests * * It also includes the BufferHandler functionality and will buffer * all messages until the end of the request or flush() is called. * * This works by storing all log records' messages above $deduplicationLevel * to the file specified by $deduplicationStore. When further logs come in at the end of the * request (or when flush() is called), all those above $deduplicationLevel are checked * against the existing stored logs. If they match and the timestamps in the stored log is * not older than $time seconds, the new log record is discarded. If no log record is new, the * whole data set is discarded. * * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers * that send messages to people, to avoid spamming with the same message over and over in case of * a major component failure like a database server being down which makes all requests fail in the * same way. * * @author Jordi Boggiano */ class DeduplicationHandler extends BufferHandler { protected string $deduplicationStore; protected Level $deduplicationLevel; protected int $time; protected bool $gc = false; /** * @param HandlerInterface $handler Handler. * @param string|null $deduplicationStore The file/path where the deduplication log should be kept * @param int|string|Level|LogLevel::* $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes * @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * * @phpstan-param value-of|value-of|Level|LogLevel::* $deduplicationLevel */ public function __construct(HandlerInterface $handler, ?string $deduplicationStore = null, int|string|Level $deduplicationLevel = Level::Error, int $time = 60, bool $bubble = true) { parent::__construct($handler, 0, Level::Debug, $bubble, false); $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore; $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel); $this->time = $time; } public function flush(): void { if ($this->bufferSize === 0) { return; } $store = null; if (file_exists($this->deduplicationStore)) { $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); } $passthru = null; foreach ($this->buffer as $record) { if ($record->level->value >= $this->deduplicationLevel->value) { $passthru = $passthru === true || !is_array($store) || !$this->isDuplicate($store, $record); if ($passthru) { $line = $this->buildDeduplicationStoreEntry($record); file_put_contents($this->deduplicationStore, $line . "\n", FILE_APPEND); if (!is_array($store)) { $store = []; } $store[] = $line; } } } // default of null is valid as well as if no record matches duplicationLevel we just pass through if ($passthru === true || $passthru === null) { $this->handler->handleBatch($this->buffer); } $this->clear(); if ($this->gc) { $this->collectLogs(); } } /** * If there is a store entry older than e.g. a day, this method should set `$this->gc` to `true` to trigger garbage collection. * @param string[] $store The deduplication store */ protected function isDuplicate(array $store, LogRecord $record): bool { $timestampValidity = $record->datetime->getTimestamp() - $this->time; $expectedMessage = preg_replace('{[\r\n].*}', '', $record->message); $yesterday = time() - 86400; for ($i = count($store) - 1; $i >= 0; $i--) { list($timestamp, $level, $message) = explode(':', $store[$i], 3); if ($level === $record->level->getName() && $message === $expectedMessage && $timestamp > $timestampValidity) { return true; } if ($timestamp < $yesterday) { $this->gc = true; } } return false; } /** * @return string The given record serialized as a single line of text */ protected function buildDeduplicationStoreEntry(LogRecord $record): string { return $record->datetime->getTimestamp() . ':' . $record->level->getName() . ':' . preg_replace('{[\r\n].*}', '', $record->message); } private function collectLogs(): void { if (!file_exists($this->deduplicationStore)) { return; } $handle = fopen($this->deduplicationStore, 'rw+'); if (false === $handle) { throw new \RuntimeException('Failed to open file for reading and writing: ' . $this->deduplicationStore); } flock($handle, LOCK_EX); $validLogs = []; $timestampValidity = time() - $this->time; while (!feof($handle)) { $log = fgets($handle); if (is_string($log) && '' !== $log && substr($log, 0, 10) >= $timestampValidity) { $validLogs[] = $log; } } ftruncate($handle, 0); rewind($handle); foreach ($validLogs as $log) { fwrite($handle, $log); } flock($handle, LOCK_UN); fclose($handle); $this->gc = false; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Formatter\NormalizerFormatter; use Monolog\Formatter\FormatterInterface; use Doctrine\CouchDB\CouchDBClient; use Monolog\LogRecord; /** * CouchDB handler for Doctrine CouchDB ODM * * @author Markus Bachmann */ class DoctrineCouchDBHandler extends AbstractProcessingHandler { private CouchDBClient $client; public function __construct(CouchDBClient $client, int|string|Level $level = Level::Debug, bool $bubble = true) { $this->client = $client; parent::__construct($level, $bubble); } /** * @inheritDoc */ protected function write(LogRecord $record): void { $this->client->postDocument($record->formatted); } protected function getDefaultFormatter(): FormatterInterface { return new NormalizerFormatter; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Aws\Sdk; use Aws\DynamoDb\DynamoDbClient; use Monolog\Formatter\FormatterInterface; use Aws\DynamoDb\Marshaler; use Monolog\Formatter\ScalarFormatter; use Monolog\Level; use Monolog\LogRecord; /** * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/) * * @link https://github.com/aws/aws-sdk-php/ * @author Andrew Lawson */ class DynamoDbHandler extends AbstractProcessingHandler { public const DATE_FORMAT = 'Y-m-d\TH:i:s.uO'; protected DynamoDbClient $client; protected string $table; protected Marshaler $marshaler; public function __construct(DynamoDbClient $client, string $table, int|string|Level $level = Level::Debug, bool $bubble = true) { $this->marshaler = new Marshaler; $this->client = $client; $this->table = $table; parent::__construct($level, $bubble); } /** * @inheritDoc */ protected function write(LogRecord $record): void { $filtered = $this->filterEmptyFields($record->formatted); $formatted = $this->marshaler->marshalItem($filtered); $this->client->putItem([ 'TableName' => $this->table, 'Item' => $formatted, ]); } /** * @param mixed[] $record * @return mixed[] */ protected function filterEmptyFields(array $record): array { return array_filter($record, function ($value) { return [] !== $value; }); } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new ScalarFormatter(self::DATE_FORMAT); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Elastica\Document; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\ElasticaFormatter; use Monolog\Level; use Elastica\Client; use Elastica\Exception\ExceptionInterface; use Monolog\LogRecord; /** * Elastic Search handler * * Usage example: * * $client = new \Elastica\Client(); * $options = array( * 'index' => 'elastic_index_name', * 'type' => 'elastic_doc_type', Types have been removed in Elastica 7 * ); * $handler = new ElasticaHandler($client, $options); * $log = new Logger('application'); * $log->pushHandler($handler); * * @author Jelle Vink * @phpstan-type Options array{ * index: string, * type: string, * ignore_error: bool * } * @phpstan-type InputOptions array{ * index?: string, * type?: string, * ignore_error?: bool * } */ class ElasticaHandler extends AbstractProcessingHandler { protected Client $client; /** * @var mixed[] Handler config options * @phpstan-var Options */ protected array $options; /** * @param Client $client Elastica Client object * @param mixed[] $options Handler configuration * * @phpstan-param InputOptions $options */ public function __construct(Client $client, array $options = [], int|string|Level $level = Level::Debug, bool $bubble = true) { parent::__construct($level, $bubble); $this->client = $client; $this->options = array_merge( [ 'index' => 'monolog', // Elastic index name 'type' => 'record', // Elastic document type 'ignore_error' => false, // Suppress Elastica exceptions ], $options ); } /** * @inheritDoc */ protected function write(LogRecord $record): void { $this->bulkSend([$record->formatted]); } /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($formatter instanceof ElasticaFormatter) { return parent::setFormatter($formatter); } throw new \InvalidArgumentException('ElasticaHandler is only compatible with ElasticaFormatter'); } /** * @return mixed[] * * @phpstan-return Options */ public function getOptions(): array { return $this->options; } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new ElasticaFormatter($this->options['index'], $this->options['type']); } /** * @inheritDoc */ public function handleBatch(array $records): void { $documents = $this->getFormatter()->formatBatch($records); $this->bulkSend($documents); } /** * Use Elasticsearch bulk API to send list of documents * * @param Document[] $documents * * @throws \RuntimeException */ protected function bulkSend(array $documents): void { try { $this->client->addDocuments($documents); } catch (ExceptionInterface $e) { if (!$this->options['ignore_error']) { throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e); } } } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Elastic\Elasticsearch\Response\Elasticsearch; use Throwable; use RuntimeException; use Monolog\Level; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\ElasticsearchFormatter; use InvalidArgumentException; use Elasticsearch\Common\Exceptions\RuntimeException as ElasticsearchRuntimeException; use Elasticsearch\Client; use Monolog\LogRecord; use Elastic\Elasticsearch\Exception\InvalidArgumentException as ElasticInvalidArgumentException; use Elastic\Elasticsearch\Client as Client8; /** * Elasticsearch handler * * @link https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html * * Simple usage example: * * $client = \Elasticsearch\ClientBuilder::create() * ->setHosts($hosts) * ->build(); * * $options = array( * 'index' => 'elastic_index_name', * 'type' => 'elastic_doc_type', * ); * $handler = new ElasticsearchHandler($client, $options); * $log = new Logger('application'); * $log->pushHandler($handler); * * @author Avtandil Kikabidze * @phpstan-type Options array{ * index: string, * type: string, * ignore_error: bool, * op_type: 'index'|'create' * } * @phpstan-type InputOptions array{ * index?: string, * type?: string, * ignore_error?: bool, * op_type?: 'index'|'create' * } */ class ElasticsearchHandler extends AbstractProcessingHandler { protected Client|Client8 $client; /** * @var mixed[] Handler config options * @phpstan-var Options */ protected array $options; /** * @var bool */ private $needsType; /** * @param Client|Client8 $client Elasticsearch Client object * @param mixed[] $options Handler configuration * * @phpstan-param InputOptions $options */ public function __construct(Client|Client8 $client, array $options = [], int|string|Level $level = Level::Debug, bool $bubble = true) { parent::__construct($level, $bubble); $this->client = $client; $this->options = array_merge( [ 'index' => 'monolog', // Elastic index name 'type' => '_doc', // Elastic document type 'ignore_error' => false, // Suppress Elasticsearch exceptions 'op_type' => 'index', // Elastic op_type (index or create) (https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#docs-index-api-op_type) ], $options ); if ($client instanceof Client8 || $client::VERSION[0] === '7') { $this->needsType = false; // force the type to _doc for ES8/ES7 $this->options['type'] = '_doc'; } else { $this->needsType = true; } } /** * @inheritDoc */ protected function write(LogRecord $record): void { $this->bulkSend([$record->formatted]); } /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($formatter instanceof ElasticsearchFormatter) { return parent::setFormatter($formatter); } throw new InvalidArgumentException('ElasticsearchHandler is only compatible with ElasticsearchFormatter'); } /** * Getter options * * @return mixed[] * * @phpstan-return Options */ public function getOptions(): array { return $this->options; } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new ElasticsearchFormatter($this->options['index'], $this->options['type']); } /** * @inheritDoc */ public function handleBatch(array $records): void { $documents = $this->getFormatter()->formatBatch($records); $this->bulkSend($documents); } /** * Use Elasticsearch bulk API to send list of documents * * @param array> $records Records + _index/_type keys * @throws \RuntimeException */ protected function bulkSend(array $records): void { try { $params = [ 'body' => [], ]; foreach ($records as $record) { $params['body'][] = [ $this->options['op_type'] => $this->needsType ? [ '_index' => $record['_index'], '_type' => $record['_type'], ] : [ '_index' => $record['_index'], ], ]; unset($record['_index'], $record['_type']); $params['body'][] = $record; } /** @var Elasticsearch */ $responses = $this->client->bulk($params); if ($responses['errors'] === true) { throw $this->createExceptionFromResponses($responses); } } catch (Throwable $e) { if (! $this->options['ignore_error']) { throw new RuntimeException('Error sending messages to Elasticsearch', 0, $e); } } } /** * Creates elasticsearch exception from responses array * * Only the first error is converted into an exception. * * @param mixed[]|Elasticsearch $responses returned by $this->client->bulk() */ protected function createExceptionFromResponses($responses): Throwable { foreach ($responses['items'] ?? [] as $item) { if (isset($item['index']['error'])) { return $this->createExceptionFromError($item['index']['error']); } } if (class_exists(ElasticInvalidArgumentException::class)) { return new ElasticInvalidArgumentException('Elasticsearch failed to index one or more records.'); } return new ElasticsearchRuntimeException('Elasticsearch failed to index one or more records.'); } /** * Creates elasticsearch exception from error array * * @param mixed[] $error */ protected function createExceptionFromError(array $error): Throwable { $previous = isset($error['caused_by']) ? $this->createExceptionFromError($error['caused_by']) : null; if (class_exists(ElasticInvalidArgumentException::class)) { return new ElasticInvalidArgumentException($error['type'] . ': ' . $error['reason'], 0, $previous); } return new ElasticsearchRuntimeException($error['type'] . ': ' . $error['reason'], 0, $previous); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Level; use Monolog\Utils; use Monolog\LogRecord; /** * Stores to PHP error_log() handler. * * @author Elan Ruusamäe */ class ErrorLogHandler extends AbstractProcessingHandler { public const OPERATING_SYSTEM = 0; public const SAPI = 4; protected int $messageType; protected bool $expandNewlines; /** * @param int $messageType Says where the error should go. * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries * * @throws \InvalidArgumentException If an unsupported message type is set */ public function __construct(int $messageType = self::OPERATING_SYSTEM, int|string|Level $level = Level::Debug, bool $bubble = true, bool $expandNewlines = false) { parent::__construct($level, $bubble); if (false === in_array($messageType, self::getAvailableTypes(), true)) { $message = sprintf('The given message type "%s" is not supported', print_r($messageType, true)); throw new \InvalidArgumentException($message); } $this->messageType = $messageType; $this->expandNewlines = $expandNewlines; } /** * @return int[] With all available types */ public static function getAvailableTypes(): array { return [ self::OPERATING_SYSTEM, self::SAPI, ]; } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%'); } /** * @inheritDoc */ protected function write(LogRecord $record): void { if (!$this->expandNewlines) { error_log((string) $record->formatted, $this->messageType); return; } $lines = preg_split('{[\r\n]+}', (string) $record->formatted); if ($lines === false) { $pcreErrorCode = preg_last_error(); throw new \RuntimeException('Failed to preg_split formatted string: ' . $pcreErrorCode . ' / '. Utils::pcreLastErrorMessage($pcreErrorCode)); } foreach ($lines as $line) { error_log($line, $this->messageType); } } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Throwable; use Monolog\LogRecord; /** * Forwards records to at most one handler * * If a handler fails, the exception is suppressed and the record is forwarded to the next handler. * * As soon as one handler handles a record successfully, the handling stops there. */ class FallbackGroupHandler extends GroupHandler { /** * @inheritDoc */ public function handle(LogRecord $record): bool { if (\count($this->processors) > 0) { $record = $this->processRecord($record); } foreach ($this->handlers as $handler) { try { $handler->handle(clone $record); break; } catch (Throwable $e) { // What throwable? } } return false === $this->bubble; } /** * @inheritDoc */ public function handleBatch(array $records): void { if (\count($this->processors) > 0) { $processed = []; foreach ($records as $record) { $processed[] = $this->processRecord($record); } $records = $processed; } foreach ($this->handlers as $handler) { try { $handler->handleBatch(array_map(fn ($record) => clone $record, $records)); break; } catch (Throwable $e) { // What throwable? } } } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Closure; use Monolog\Level; use Monolog\Logger; use Monolog\ResettableInterface; use Monolog\Formatter\FormatterInterface; use Psr\Log\LogLevel; use Monolog\LogRecord; /** * Simple handler wrapper that filters records based on a list of levels * * It can be configured with an exact list of levels to allow, or a min/max level. * * @author Hennadiy Verkh * @author Jordi Boggiano */ class FilterHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface { use ProcessableHandlerTrait; /** * Handler or factory Closure($record, $this) * * @phpstan-var (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface */ protected Closure|HandlerInterface $handler; /** * Minimum level for logs that are passed to handler * * @var bool[] Map of Level value => true * @phpstan-var array, true> */ protected array $acceptedLevels; /** * Whether the messages that are handled can bubble up the stack or not */ protected bool $bubble; /** * @phpstan-param (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface $handler * * @param Closure|HandlerInterface $handler Handler or factory Closure($record|null, $filterHandler). * @param int|string|Level|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided * @param int|string|Level|LogLevel::* $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * * @phpstan-param value-of|value-of|Level|LogLevel::*|array|value-of|Level|LogLevel::*> $minLevelOrList * @phpstan-param value-of|value-of|Level|LogLevel::* $maxLevel */ public function __construct(Closure|HandlerInterface $handler, int|string|Level|array $minLevelOrList = Level::Debug, int|string|Level $maxLevel = Level::Emergency, bool $bubble = true) { $this->handler = $handler; $this->bubble = $bubble; $this->setAcceptedLevels($minLevelOrList, $maxLevel); } /** * @phpstan-return list List of levels */ public function getAcceptedLevels(): array { return array_map(fn (int $level) => Level::from($level), array_keys($this->acceptedLevels)); } /** * @param int|string|Level|LogLevel::*|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided * @param int|string|Level|LogLevel::* $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array * @return $this * * @phpstan-param value-of|value-of|Level|LogLevel::*|array|value-of|Level|LogLevel::*> $minLevelOrList * @phpstan-param value-of|value-of|Level|LogLevel::* $maxLevel */ public function setAcceptedLevels(int|string|Level|array $minLevelOrList = Level::Debug, int|string|Level $maxLevel = Level::Emergency): self { if (is_array($minLevelOrList)) { $acceptedLevels = array_map(Logger::toMonologLevel(...), $minLevelOrList); } else { $minLevelOrList = Logger::toMonologLevel($minLevelOrList); $maxLevel = Logger::toMonologLevel($maxLevel); $acceptedLevels = array_values(array_filter(Level::cases(), fn (Level $level) => $level->value >= $minLevelOrList->value && $level->value <= $maxLevel->value)); } $this->acceptedLevels = []; foreach ($acceptedLevels as $level) { $this->acceptedLevels[$level->value] = true; } return $this; } /** * @inheritDoc */ public function isHandling(LogRecord $record): bool { return isset($this->acceptedLevels[$record->level->value]); } /** * @inheritDoc */ public function handle(LogRecord $record): bool { if (!$this->isHandling($record)) { return false; } if (\count($this->processors) > 0) { $record = $this->processRecord($record); } $this->getHandler($record)->handle($record); return false === $this->bubble; } /** * @inheritDoc */ public function handleBatch(array $records): void { $filtered = []; foreach ($records as $record) { if ($this->isHandling($record)) { $filtered[] = $record; } } if (count($filtered) > 0) { $this->getHandler($filtered[count($filtered) - 1])->handleBatch($filtered); } } /** * Return the nested handler * * If the handler was provided as a factory, this will trigger the handler's instantiation. */ public function getHandler(LogRecord|null $record = null): HandlerInterface { if (!$this->handler instanceof HandlerInterface) { $handler = ($this->handler)($record, $this); if (!$handler instanceof HandlerInterface) { throw new \RuntimeException("The factory Closure should return a HandlerInterface"); } $this->handler = $handler; } return $this->handler; } /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { $handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } /** * @inheritDoc */ public function getFormatter(): FormatterInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { return $handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } public function reset(): void { $this->resetProcessors(); if ($this->getHandler() instanceof ResettableInterface) { $this->getHandler()->reset(); } } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\FingersCrossed; use Monolog\LogRecord; /** * Interface for activation strategies for the FingersCrossedHandler. * * @author Johannes M. Schmitt */ interface ActivationStrategyInterface { /** * Returns whether the given record activates the handler. */ public function isHandlerActivated(LogRecord $record): bool; } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\FingersCrossed; use Monolog\Level; use Monolog\Logger; use Psr\Log\LogLevel; use Monolog\LogRecord; /** * Channel and Error level based monolog activation strategy. Allows to trigger activation * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except * for records of the 'sql' channel; those should trigger activation on level 'WARN'. * * Example: * * * $activationStrategy = new ChannelLevelActivationStrategy( * Level::Critical, * array( * 'request' => Level::Alert, * 'sensitive' => Level::Error, * ) * ); * $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy); * * * @author Mike Meessen */ class ChannelLevelActivationStrategy implements ActivationStrategyInterface { private Level $defaultActionLevel; /** * @var array */ private array $channelToActionLevel; /** * @param int|string|Level|LogLevel::* $defaultActionLevel The default action level to be used if the record's category doesn't match any * @param array $channelToActionLevel An array that maps channel names to action levels. * * @phpstan-param value-of|value-of|Level|LogLevel::* $defaultActionLevel * @phpstan-param array|value-of|Level|LogLevel::*> $channelToActionLevel */ public function __construct(int|string|Level $defaultActionLevel, array $channelToActionLevel = []) { $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel); $this->channelToActionLevel = array_map(Logger::toMonologLevel(...), $channelToActionLevel); } public function isHandlerActivated(LogRecord $record): bool { if (isset($this->channelToActionLevel[$record->channel])) { return $record->level->value >= $this->channelToActionLevel[$record->channel]->value; } return $record->level->value >= $this->defaultActionLevel->value; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\FingersCrossed; use Monolog\Level; use Monolog\LogRecord; use Monolog\Logger; use Psr\Log\LogLevel; /** * Error level based activation strategy. * * @author Johannes M. Schmitt */ class ErrorLevelActivationStrategy implements ActivationStrategyInterface { private Level $actionLevel; /** * @param int|string|Level $actionLevel Level or name or value * * @phpstan-param value-of|value-of|Level|LogLevel::* $actionLevel */ public function __construct(int|string|Level $actionLevel) { $this->actionLevel = Logger::toMonologLevel($actionLevel); } public function isHandlerActivated(LogRecord $record): bool { return $record->level->value >= $this->actionLevel->value; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Closure; use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; use Monolog\Handler\FingersCrossed\ActivationStrategyInterface; use Monolog\Level; use Monolog\Logger; use Monolog\ResettableInterface; use Monolog\Formatter\FormatterInterface; use Psr\Log\LogLevel; use Monolog\LogRecord; /** * Buffers all records until a certain level is reached * * The advantage of this approach is that you don't get any clutter in your log files. * Only requests which actually trigger an error (or whatever your actionLevel is) will be * in the logs, but they will contain all records, not only those above the level threshold. * * You can then have a passthruLevel as well which means that at the end of the request, * even if it did not get activated, it will still send through log records of e.g. at least a * warning level. * * You can find the various activation strategies in the * Monolog\Handler\FingersCrossed\ namespace. * * @author Jordi Boggiano */ class FingersCrossedHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface { use ProcessableHandlerTrait; /** * Handler or factory Closure($record, $this) * * @phpstan-var (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface */ protected Closure|HandlerInterface $handler; protected ActivationStrategyInterface $activationStrategy; protected bool $buffering = true; protected int $bufferSize; /** @var LogRecord[] */ protected array $buffer = []; protected bool $stopBuffering; protected Level|null $passthruLevel = null; protected bool $bubble; /** * @phpstan-param (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface $handler * * @param Closure|HandlerInterface $handler Handler or factory Closure($record|null, $fingersCrossedHandler). * @param int|string|Level|LogLevel::* $activationStrategy Strategy which determines when this handler takes action, or a level name/value at which the handler is activated * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param bool $stopBuffering Whether the handler should stop buffering after being triggered (default true) * @param int|string|Level|LogLevel::*|null $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered * * @phpstan-param value-of|value-of|Level|LogLevel::*|ActivationStrategyInterface $activationStrategy * @phpstan-param value-of|value-of|Level|LogLevel::* $passthruLevel */ public function __construct(Closure|HandlerInterface $handler, int|string|Level|ActivationStrategyInterface $activationStrategy = null, int $bufferSize = 0, bool $bubble = true, bool $stopBuffering = true, int|string|Level|null $passthruLevel = null) { if (null === $activationStrategy) { $activationStrategy = new ErrorLevelActivationStrategy(Level::Warning); } // convert simple int activationStrategy to an object if (!$activationStrategy instanceof ActivationStrategyInterface) { $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy); } $this->handler = $handler; $this->activationStrategy = $activationStrategy; $this->bufferSize = $bufferSize; $this->bubble = $bubble; $this->stopBuffering = $stopBuffering; if ($passthruLevel !== null) { $this->passthruLevel = Logger::toMonologLevel($passthruLevel); } } /** * @inheritDoc */ public function isHandling(LogRecord $record): bool { return true; } /** * Manually activate this logger regardless of the activation strategy */ public function activate(): void { if ($this->stopBuffering) { $this->buffering = false; } $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer); $this->buffer = []; } /** * @inheritDoc */ public function handle(LogRecord $record): bool { if (\count($this->processors) > 0) { $record = $this->processRecord($record); } if ($this->buffering) { $this->buffer[] = $record; if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) { array_shift($this->buffer); } if ($this->activationStrategy->isHandlerActivated($record)) { $this->activate(); } } else { $this->getHandler($record)->handle($record); } return false === $this->bubble; } /** * @inheritDoc */ public function close(): void { $this->flushBuffer(); $this->getHandler()->close(); } public function reset(): void { $this->flushBuffer(); $this->resetProcessors(); if ($this->getHandler() instanceof ResettableInterface) { $this->getHandler()->reset(); } } /** * Clears the buffer without flushing any messages down to the wrapped handler. * * It also resets the handler to its initial buffering state. */ public function clear(): void { $this->buffer = []; $this->reset(); } /** * Resets the state of the handler. Stops forwarding records to the wrapped handler. */ private function flushBuffer(): void { if (null !== $this->passthruLevel) { $passthruLevel = $this->passthruLevel; $this->buffer = array_filter($this->buffer, static function ($record) use ($passthruLevel) { return $passthruLevel->includes($record->level); }); if (count($this->buffer) > 0) { $this->getHandler(end($this->buffer))->handleBatch($this->buffer); } } $this->buffer = []; $this->buffering = true; } /** * Return the nested handler * * If the handler was provided as a factory, this will trigger the handler's instantiation. */ public function getHandler(LogRecord|null $record = null): HandlerInterface { if (!$this->handler instanceof HandlerInterface) { $handler = ($this->handler)($record, $this); if (!$handler instanceof HandlerInterface) { throw new \RuntimeException("The factory Closure should return a HandlerInterface"); } $this->handler = $handler; } return $this->handler; } /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { $handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } /** * @inheritDoc */ public function getFormatter(): FormatterInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { return $handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\WildfireFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\LogRecord; /** * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol. * * @author Eric Clemmons (@ericclemmons) */ class FirePHPHandler extends AbstractProcessingHandler { use WebRequestRecognizerTrait; /** * WildFire JSON header message format */ protected const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; /** * FirePHP structure for parsing messages & their presentation */ protected const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; /** * Must reference a "known" plugin, otherwise headers won't display in FirePHP */ protected const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3'; /** * Header prefix for Wildfire to recognize & parse headers */ protected const HEADER_PREFIX = 'X-Wf'; /** * Whether or not Wildfire vendor-specific headers have been generated & sent yet */ protected static bool $initialized = false; /** * Shared static message index between potentially multiple handlers */ protected static int $messageIndex = 1; protected static bool $sendHeaders = true; /** * Base header creation function used by init headers & record headers * * @param array $meta Wildfire Plugin, Protocol & Structure Indexes * @param string $message Log message * * @return array Complete header string ready for the client as key and message as value * * @phpstan-return non-empty-array */ protected function createHeader(array $meta, string $message): array { $header = sprintf('%s-%s', static::HEADER_PREFIX, join('-', $meta)); return [$header => $message]; } /** * Creates message header from record * * @return array * * @phpstan-return non-empty-array * * @see createHeader() */ protected function createRecordHeader(LogRecord $record): array { // Wildfire is extensible to support multiple protocols & plugins in a single request, // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake. return $this->createHeader( [1, 1, 1, self::$messageIndex++], $record->formatted ); } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new WildfireFormatter(); } /** * Wildfire initialization headers to enable message parsing * * @see createHeader() * @see sendHeader() * * @return array */ protected function getInitHeaders(): array { // Initial payload consists of required headers for Wildfire return array_merge( $this->createHeader(['Protocol', 1], static::PROTOCOL_URI), $this->createHeader([1, 'Structure', 1], static::STRUCTURE_URI), $this->createHeader([1, 'Plugin', 1], static::PLUGIN_URI) ); } /** * Send header string to the client */ protected function sendHeader(string $header, string $content): void { if (!headers_sent() && self::$sendHeaders) { header(sprintf('%s: %s', $header, $content)); } } /** * Creates & sends header for a record, ensuring init headers have been sent prior * * @see sendHeader() * @see sendInitHeaders() */ protected function write(LogRecord $record): void { if (!self::$sendHeaders || !$this->isWebRequest()) { return; } // WildFire-specific headers must be sent prior to any messages if (!self::$initialized) { self::$initialized = true; self::$sendHeaders = $this->headersAccepted(); if (!self::$sendHeaders) { return; } foreach ($this->getInitHeaders() as $header => $content) { $this->sendHeader($header, $content); } } $header = $this->createRecordHeader($record); if (trim(current($header)) !== '') { $this->sendHeader(key($header), current($header)); } } /** * Verifies if the headers are accepted by the current user agent */ protected function headersAccepted(): bool { if (isset($_SERVER['HTTP_USER_AGENT']) && 1 === preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])) { return true; } return isset($_SERVER['HTTP_X_FIREPHP_VERSION']); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; use Monolog\Level; use Monolog\LogRecord; /** * Sends logs to Fleep.io using Webhook integrations * * You'll need a Fleep.io account to use this handler. * * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation * @author Ando Roots */ class FleepHookHandler extends SocketHandler { protected const FLEEP_HOST = 'fleep.io'; protected const FLEEP_HOOK_URI = '/hook/'; /** * @var string Webhook token (specifies the conversation where logs are sent) */ protected string $token; /** * Construct a new Fleep.io Handler. * * For instructions on how to create a new web hook in your conversations * see https://fleep.io/integrations/webhooks/ * * @param string $token Webhook token * @throws MissingExtensionException if OpenSSL is missing */ public function __construct( string $token, $level = Level::Debug, bool $bubble = true, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler'); } $this->token = $token; $connectionString = 'ssl://' . static::FLEEP_HOST . ':443'; parent::__construct( $connectionString, $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); } /** * Returns the default formatter to use with this handler * * Overloaded to remove empty context and extra arrays from the end of the log message. * * @return LineFormatter */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter(null, null, true, true); } /** * Handles a log record */ public function write(LogRecord $record): void { parent::write($record); $this->closeSocket(); } /** * @inheritDoc */ protected function generateDataStream(LogRecord $record): string { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the header of the API Call */ private function buildHeader(string $content): string { $header = "POST " . static::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n"; $header .= "Host: " . static::FLEEP_HOST . "\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } /** * Builds the body of API call */ private function buildContent(LogRecord $record): string { $dataArray = [ 'message' => $record->formatted, ]; return http_build_query($dataArray); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Utils; use Monolog\Formatter\FlowdockFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\LogRecord; /** * Sends notifications through the Flowdock push API * * This must be configured with a FlowdockFormatter instance via setFormatter() * * Notes: * API token - Flowdock API token * * @author Dominik Liebler * @see https://www.flowdock.com/api/push * @deprecated Since 2.9.0 and 3.3.0, Flowdock was shutdown we will thus drop this handler in Monolog 4 */ class FlowdockHandler extends SocketHandler { protected string $apiToken; /** * @throws MissingExtensionException if OpenSSL is missing */ public function __construct( string $apiToken, $level = Level::Debug, bool $bubble = true, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler'); } parent::__construct( 'ssl://api.flowdock.com:443', $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->apiToken = $apiToken; } /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if (!$formatter instanceof FlowdockFormatter) { throw new \InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); } return parent::setFormatter($formatter); } /** * Gets the default formatter. */ protected function getDefaultFormatter(): FormatterInterface { throw new \InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); } /** * @inheritDoc */ protected function write(LogRecord $record): void { parent::write($record); $this->closeSocket(); } /** * @inheritDoc */ protected function generateDataStream(LogRecord $record): string { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the body of API call */ private function buildContent(LogRecord $record): string { return Utils::jsonEncode($record->formatted); } /** * Builds the header of the API Call */ private function buildHeader(string $content): string { $header = "POST /v1/messages/team_inbox/" . $this->apiToken . " HTTP/1.1\r\n"; $header .= "Host: api.flowdock.com\r\n"; $header .= "Content-Type: application/json\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; /** * Interface to describe loggers that have a formatter * * @author Jordi Boggiano */ interface FormattableHandlerInterface { /** * Sets the formatter. * * @return HandlerInterface self */ public function setFormatter(FormatterInterface $formatter): HandlerInterface; /** * Gets the formatter. */ public function getFormatter(): FormatterInterface; } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; /** * Helper trait for implementing FormattableInterface * * @author Jordi Boggiano */ trait FormattableHandlerTrait { protected FormatterInterface|null $formatter = null; /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { $this->formatter = $formatter; return $this; } /** * @inheritDoc */ public function getFormatter(): FormatterInterface { if (null === $this->formatter) { $this->formatter = $this->getDefaultFormatter(); } return $this->formatter; } /** * Gets the default formatter. * * Overwrite this if the LineFormatter is not a good default for your handler. */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter(); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Gelf\PublisherInterface; use Monolog\Level; use Monolog\Formatter\GelfMessageFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\LogRecord; /** * Handler to send messages to a Graylog2 (http://www.graylog2.org) server * * @author Matt Lehner * @author Benjamin Zikarsky */ class GelfHandler extends AbstractProcessingHandler { /** * @var PublisherInterface the publisher object that sends the message to the server */ protected PublisherInterface $publisher; /** * @param PublisherInterface $publisher a gelf publisher object */ public function __construct(PublisherInterface $publisher, int|string|Level $level = Level::Debug, bool $bubble = true) { parent::__construct($level, $bubble); $this->publisher = $publisher; } /** * @inheritDoc */ protected function write(LogRecord $record): void { $this->publisher->publish($record->formatted); } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new GelfMessageFormatter(); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\ResettableInterface; use Monolog\LogRecord; /** * Forwards records to multiple handlers * * @author Lenar Lõhmus */ class GroupHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface { use ProcessableHandlerTrait; /** @var HandlerInterface[] */ protected array $handlers; protected bool $bubble; /** * @param HandlerInterface[] $handlers Array of Handlers. * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * * @throws \InvalidArgumentException if an unsupported handler is set */ public function __construct(array $handlers, bool $bubble = true) { foreach ($handlers as $handler) { if (!$handler instanceof HandlerInterface) { throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.'); } } $this->handlers = $handlers; $this->bubble = $bubble; } /** * @inheritDoc */ public function isHandling(LogRecord $record): bool { foreach ($this->handlers as $handler) { if ($handler->isHandling($record)) { return true; } } return false; } /** * @inheritDoc */ public function handle(LogRecord $record): bool { if (\count($this->processors) > 0) { $record = $this->processRecord($record); } foreach ($this->handlers as $handler) { $handler->handle(clone $record); } return false === $this->bubble; } /** * @inheritDoc */ public function handleBatch(array $records): void { if (\count($this->processors) > 0) { $processed = []; foreach ($records as $record) { $processed[] = $this->processRecord($record); } $records = $processed; } foreach ($this->handlers as $handler) { $handler->handleBatch(array_map(fn ($record) => clone $record, $records)); } } public function reset(): void { $this->resetProcessors(); foreach ($this->handlers as $handler) { if ($handler instanceof ResettableInterface) { $handler->reset(); } } } public function close(): void { parent::close(); foreach ($this->handlers as $handler) { $handler->close(); } } /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { foreach ($this->handlers as $handler) { if ($handler instanceof FormattableHandlerInterface) { $handler->setFormatter($formatter); } } return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/Handler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Base Handler class providing basic close() support as well as handleBatch * * @author Jordi Boggiano */ abstract class Handler implements HandlerInterface { /** * @inheritDoc */ public function handleBatch(array $records): void { foreach ($records as $record) { $this->handle($record); } } /** * @inheritDoc */ public function close(): void { } public function __destruct() { try { $this->close(); } catch (\Throwable $e) { // do nothing } } public function __sleep() { $this->close(); $reflClass = new \ReflectionClass($this); $keys = []; foreach ($reflClass->getProperties() as $reflProp) { if (!$reflProp->isStatic()) { $keys[] = $reflProp->getName(); } } return $keys; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\LogRecord; /** * Interface that all Monolog Handlers must implement * * @author Jordi Boggiano */ interface HandlerInterface { /** * Checks whether the given record will be handled by this handler. * * This is mostly done for performance reasons, to avoid calling processors for nothing. * * Handlers should still check the record levels within handle(), returning false in isHandling() * is no guarantee that handle() will not be called, and isHandling() might not be called * for a given record. * * @param LogRecord $record Partial log record having only a level initialized */ public function isHandling(LogRecord $record): bool; /** * Handles a record. * * All records may be passed to this method, and the handler should discard * those that it does not want to handle. * * The return value of this function controls the bubbling process of the handler stack. * Unless the bubbling is interrupted (by returning true), the Logger class will keep on * calling further handlers in the stack with a given log record. * * @param LogRecord $record The record to handle * @return bool true means that this handler handled the record, and that bubbling is not permitted. * false means the record was either not processed or that this handler allows bubbling. */ public function handle(LogRecord $record): bool; /** * Handles a set of records at once. * * @param array $records The records to handle */ public function handleBatch(array $records): void; /** * Closes the handler. * * Ends a log cycle and frees all resources used by the handler. * * Closing a Handler means flushing all buffers and freeing any open resources/handles. * * Implementations have to be idempotent (i.e. it should be possible to call close several times without breakage) * and ideally handlers should be able to reopen themselves on handle() after they have been closed. * * This is useful at the end of a request and will be called automatically when the object * is destroyed if you extend Monolog\Handler\Handler. * * If you are thinking of calling this method yourself, most likely you should be * calling ResettableInterface::reset instead. Have a look. */ public function close(): void; } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\ResettableInterface; use Monolog\Formatter\FormatterInterface; use Monolog\LogRecord; /** * This simple wrapper class can be used to extend handlers functionality. * * Example: A custom filtering that can be applied to any handler. * * Inherit from this class and override handle() like this: * * public function handle(LogRecord $record) * { * if ($record meets certain conditions) { * return false; * } * return $this->handler->handle($record); * } * * @author Alexey Karapetov */ class HandlerWrapper implements HandlerInterface, ProcessableHandlerInterface, FormattableHandlerInterface, ResettableInterface { protected HandlerInterface $handler; public function __construct(HandlerInterface $handler) { $this->handler = $handler; } /** * @inheritDoc */ public function isHandling(LogRecord $record): bool { return $this->handler->isHandling($record); } /** * @inheritDoc */ public function handle(LogRecord $record): bool { return $this->handler->handle($record); } /** * @inheritDoc */ public function handleBatch(array $records): void { $this->handler->handleBatch($records); } /** * @inheritDoc */ public function close(): void { $this->handler->close(); } /** * @inheritDoc */ public function pushProcessor(callable $callback): HandlerInterface { if ($this->handler instanceof ProcessableHandlerInterface) { $this->handler->pushProcessor($callback); return $this; } throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class); } /** * @inheritDoc */ public function popProcessor(): callable { if ($this->handler instanceof ProcessableHandlerInterface) { return $this->handler->popProcessor(); } throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class); } /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($this->handler instanceof FormattableHandlerInterface) { $this->handler->setFormatter($formatter); return $this; } throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class); } /** * @inheritDoc */ public function getFormatter(): FormatterInterface { if ($this->handler instanceof FormattableHandlerInterface) { return $this->handler->getFormatter(); } throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class); } public function reset(): void { if ($this->handler instanceof ResettableInterface) { $this->handler->reset(); } } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Utils; use Monolog\LogRecord; /** * IFTTTHandler uses cURL to trigger IFTTT Maker actions * * Register a secret key and trigger/event name at https://ifttt.com/maker * * value1 will be the channel from monolog's Logger constructor, * value2 will be the level name (ERROR, WARNING, ..) * value3 will be the log record's message * * @author Nehal Patel */ class IFTTTHandler extends AbstractProcessingHandler { private string $eventName; private string $secretKey; /** * @param string $eventName The name of the IFTTT Maker event that should be triggered * @param string $secretKey A valid IFTTT secret key * * @throws MissingExtensionException If the curl extension is missing */ public function __construct(string $eventName, string $secretKey, int|string|Level $level = Level::Error, bool $bubble = true) { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the IFTTTHandler'); } $this->eventName = $eventName; $this->secretKey = $secretKey; parent::__construct($level, $bubble); } /** * @inheritDoc */ public function write(LogRecord $record): void { $postData = [ "value1" => $record->channel, "value2" => $record["level_name"], "value3" => $record->message, ]; $postString = Utils::jsonEncode($postData); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postString); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/json", ]); Curl\Util::execute($ch); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\LogRecord; /** * Inspired on LogEntriesHandler. * * @author Robert Kaufmann III * @author Gabriel Machado */ class InsightOpsHandler extends SocketHandler { protected string $logToken; /** * @param string $token Log token supplied by InsightOps * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'. * @param bool $useSSL Whether or not SSL encryption should be used * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ public function __construct( string $token, string $region = 'us', bool $useSSL = true, $level = Level::Debug, bool $bubble = true, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler'); } $endpoint = $useSSL ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443' : $region . '.data.logs.insight.rapid7.com:80'; parent::__construct( $endpoint, $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->logToken = $token; } /** * @inheritDoc */ protected function generateDataStream(LogRecord $record): string { return $this->logToken . ' ' . $record->formatted; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\LogRecord; /** * @author Robert Kaufmann III */ class LogEntriesHandler extends SocketHandler { protected string $logToken; /** * @param string $token Log token supplied by LogEntries * @param bool $useSSL Whether or not SSL encryption should be used. * @param string $host Custom hostname to send the data to if needed * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ public function __construct( string $token, bool $useSSL = true, $level = Level::Debug, bool $bubble = true, string $host = 'data.logentries.com', bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); } $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80'; parent::__construct( $endpoint, $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->logToken = $token; } /** * @inheritDoc */ protected function generateDataStream(LogRecord $record): string { return $this->logToken . ' ' . $record->formatted; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LogglyFormatter; use function array_key_exists; use CurlHandle; use Monolog\LogRecord; /** * Sends errors to Loggly. * * @author Przemek Sobstel * @author Adam Pancutt * @author Gregory Barchard */ class LogglyHandler extends AbstractProcessingHandler { protected const HOST = 'logs-01.loggly.com'; protected const ENDPOINT_SINGLE = 'inputs'; protected const ENDPOINT_BATCH = 'bulk'; /** * Caches the curl handlers for every given endpoint. * * @var CurlHandle[] */ protected array $curlHandlers = []; protected string $token; /** @var string[] */ protected array $tag = []; /** * @param string $token API token supplied by Loggly * * @throws MissingExtensionException If the curl extension is missing */ public function __construct(string $token, int|string|Level $level = Level::Debug, bool $bubble = true) { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the LogglyHandler'); } $this->token = $token; parent::__construct($level, $bubble); } /** * Loads and returns the shared curl handler for the given endpoint. */ protected function getCurlHandler(string $endpoint): CurlHandle { if (!array_key_exists($endpoint, $this->curlHandlers)) { $this->curlHandlers[$endpoint] = $this->loadCurlHandle($endpoint); } return $this->curlHandlers[$endpoint]; } /** * Starts a fresh curl session for the given endpoint and returns its handler. */ private function loadCurlHandle(string $endpoint): CurlHandle { $url = sprintf("https://%s/%s/%s/", static::HOST, $endpoint, $this->token); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); return $ch; } /** * @param string[]|string $tag * @return $this */ public function setTag(string|array $tag): self { if ('' === $tag || [] === $tag) { $this->tag = []; } else { $this->tag = is_array($tag) ? $tag : [$tag]; } return $this; } /** * @param string[]|string $tag * @return $this */ public function addTag(string|array $tag): self { if ('' !== $tag) { $tag = is_array($tag) ? $tag : [$tag]; $this->tag = array_unique(array_merge($this->tag, $tag)); } return $this; } protected function write(LogRecord $record): void { $this->send($record->formatted, static::ENDPOINT_SINGLE); } public function handleBatch(array $records): void { $level = $this->level; $records = array_filter($records, function ($record) use ($level) { return ($record->level->value >= $level->value); }); if (\count($records) > 0) { $this->send($this->getFormatter()->formatBatch($records), static::ENDPOINT_BATCH); } } protected function send(string $data, string $endpoint): void { $ch = $this->getCurlHandler($endpoint); $headers = ['Content-Type: application/json']; if (\count($this->tag) > 0) { $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag); } curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); Curl\Util::execute($ch, 5, false); } protected function getDefaultFormatter(): FormatterInterface { return new LogglyFormatter(); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LogmaticFormatter; use Monolog\LogRecord; /** * @author Julien Breux */ class LogmaticHandler extends SocketHandler { private string $logToken; private string $hostname; private string $appName; /** * @param string $token Log token supplied by Logmatic. * @param string $hostname Host name supplied by Logmatic. * @param string $appName Application name supplied by Logmatic. * @param bool $useSSL Whether or not SSL encryption should be used. * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ public function __construct( string $token, string $hostname = '', string $appName = '', bool $useSSL = true, $level = Level::Debug, bool $bubble = true, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use SSL encrypted connection for LogmaticHandler'); } $endpoint = $useSSL ? 'ssl://api.logmatic.io:10515' : 'api.logmatic.io:10514'; $endpoint .= '/v1/'; parent::__construct( $endpoint, $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->logToken = $token; $this->hostname = $hostname; $this->appName = $appName; } /** * @inheritDoc */ protected function generateDataStream(LogRecord $record): string { return $this->logToken . ' ' . $record->formatted; } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { $formatter = new LogmaticFormatter(); if ($this->hostname !== '') { $formatter->setHostname($this->hostname); } if ($this->appName !== '') { $formatter->setAppName($this->appName); } return $formatter; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\HtmlFormatter; use Monolog\LogRecord; /** * Base class for all mail handlers * * @author Gyula Sallai */ abstract class MailHandler extends AbstractProcessingHandler { /** * @inheritDoc */ public function handleBatch(array $records): void { $messages = []; foreach ($records as $record) { if ($record->level->isLowerThan($this->level)) { continue; } $message = $this->processRecord($record); $messages[] = $message; } if (\count($messages) > 0) { $this->send((string) $this->getFormatter()->formatBatch($messages), $messages); } } /** * Send a mail with the given content * * @param string $content formatted email body to be sent * @param array $records the array of log records that formed this content * * @phpstan-param non-empty-array $records */ abstract protected function send(string $content, array $records): void; /** * @inheritDoc */ protected function write(LogRecord $record): void { $this->send((string) $record->formatted, [$record]); } /** * @phpstan-param non-empty-array $records */ protected function getHighestRecord(array $records): LogRecord { $highestRecord = null; foreach ($records as $record) { if ($highestRecord === null || $record->level->isHigherThan($highestRecord->level)) { $highestRecord = $record; } } return $highestRecord; } protected function isHtmlBody(string $body): bool { return ($body[0] ?? null) === '<'; } /** * Gets the default formatter. */ protected function getDefaultFormatter(): FormatterInterface { return new HtmlFormatter(); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Swift; use Swift_Message; /** * MandrillHandler uses cURL to send the emails to the Mandrill API * * @author Adam Nicholson */ class MandrillHandler extends MailHandler { protected Swift_Message $message; protected string $apiKey; /** * @phpstan-param (Swift_Message|callable(): Swift_Message) $message * * @param string $apiKey A valid Mandrill API key * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced * * @throws \InvalidArgumentException if not a Swift Message is set */ public function __construct(string $apiKey, callable|Swift_Message $message, int|string|Level $level = Level::Error, bool $bubble = true) { parent::__construct($level, $bubble); if (!$message instanceof Swift_Message) { $message = $message(); } if (!$message instanceof Swift_Message) { throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it'); } $this->message = $message; $this->apiKey = $apiKey; } /** * @inheritDoc */ protected function send(string $content, array $records): void { $mime = 'text/plain'; if ($this->isHtmlBody($content)) { $mime = 'text/html'; } $message = clone $this->message; $message->setBody($content, $mime); /** @phpstan-ignore-next-line */ if (version_compare(Swift::VERSION, '6.0.0', '>=')) { $message->setDate(new \DateTimeImmutable()); } else { /** @phpstan-ignore-next-line */ $message->setDate(time()); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'key' => $this->apiKey, 'raw_message' => (string) $message, 'async' => false, ])); Curl\Util::execute($ch); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Exception can be thrown if an extension for a handler is missing * * @author Christian Bergau */ class MissingExtensionException extends \Exception { } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use MongoDB\Driver\BulkWrite; use MongoDB\Driver\Manager; use MongoDB\Client; use Monolog\Level; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\MongoDBFormatter; use Monolog\LogRecord; /** * Logs to a MongoDB database. * * Usage example: * * $log = new \Monolog\Logger('application'); * $client = new \MongoDB\Client('mongodb://localhost:27017'); * $mongodb = new \Monolog\Handler\MongoDBHandler($client, 'logs', 'prod'); * $log->pushHandler($mongodb); * * The above examples uses the MongoDB PHP library's client class; however, the * MongoDB\Driver\Manager class from ext-mongodb is also supported. */ class MongoDBHandler extends AbstractProcessingHandler { private \MongoDB\Collection $collection; private Client|Manager $manager; private string|null $namespace = null; /** * Constructor. * * @param Client|Manager $mongodb MongoDB library or driver client * @param string $database Database name * @param string $collection Collection name */ public function __construct(Client|Manager $mongodb, string $database, string $collection, int|string|Level $level = Level::Debug, bool $bubble = true) { if ($mongodb instanceof Client) { $this->collection = $mongodb->selectCollection($database, $collection); } else { $this->manager = $mongodb; $this->namespace = $database . '.' . $collection; } parent::__construct($level, $bubble); } protected function write(LogRecord $record): void { if (isset($this->collection)) { $this->collection->insertOne($record->formatted); } if (isset($this->manager, $this->namespace)) { $bulk = new BulkWrite; $bulk->insert($record->formatted); $this->manager->executeBulkWrite($this->namespace, $bulk); } } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new MongoDBFormatter; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Formatter\LineFormatter; /** * NativeMailerHandler uses the mail() function to send the emails * * @author Christophe Coevoet * @author Mark Garrett */ class NativeMailerHandler extends MailHandler { /** * The email addresses to which the message will be sent * @var string[] */ protected array $to; /** * The subject of the email */ protected string $subject; /** * Optional headers for the message * @var string[] */ protected array $headers = []; /** * Optional parameters for the message * @var string[] */ protected array $parameters = []; /** * The wordwrap length for the message */ protected int $maxColumnWidth; /** * The Content-type for the message */ protected string|null $contentType = null; /** * The encoding for the message */ protected string $encoding = 'utf-8'; /** * @param string|string[] $to The receiver of the mail * @param string $subject The subject of the mail * @param string $from The sender of the mail * @param int $maxColumnWidth The maximum column width that the message lines will have */ public function __construct(string|array $to, string $subject, string $from, int|string|Level $level = Level::Error, bool $bubble = true, int $maxColumnWidth = 70) { parent::__construct($level, $bubble); $this->to = (array) $to; $this->subject = $subject; $this->addHeader(sprintf('From: %s', $from)); $this->maxColumnWidth = $maxColumnWidth; } /** * Add headers to the message * * @param string|string[] $headers Custom added headers * @return $this */ public function addHeader($headers): self { foreach ((array) $headers as $header) { if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) { throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); } $this->headers[] = $header; } return $this; } /** * Add parameters to the message * * @param string|string[] $parameters Custom added parameters * @return $this */ public function addParameter($parameters): self { $this->parameters = array_merge($this->parameters, (array) $parameters); return $this; } /** * @inheritDoc */ protected function send(string $content, array $records): void { $contentType = $this->getContentType() ?? ($this->isHtmlBody($content) ? 'text/html' : 'text/plain'); if ($contentType !== 'text/html') { $content = wordwrap($content, $this->maxColumnWidth); } $headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n"); $headers .= 'Content-type: ' . $contentType . '; charset=' . $this->getEncoding() . "\r\n"; if ($contentType === 'text/html' && false === strpos($headers, 'MIME-Version:')) { $headers .= 'MIME-Version: 1.0' . "\r\n"; } $subjectFormatter = new LineFormatter($this->subject); $subject = $subjectFormatter->format($this->getHighestRecord($records)); $parameters = implode(' ', $this->parameters); foreach ($this->to as $to) { mail($to, $subject, $content, $headers, $parameters); } } public function getContentType(): ?string { return $this->contentType; } public function getEncoding(): string { return $this->encoding; } /** * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML messages. * @return $this */ public function setContentType(string $contentType): self { if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) { throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection'); } $this->contentType = $contentType; return $this; } /** * @return $this */ public function setEncoding(string $encoding): self { if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) { throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection'); } $this->encoding = $encoding; return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Utils; use Monolog\Formatter\NormalizerFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\LogRecord; /** * Class to record a log on a NewRelic application. * Enabling New Relic High Security mode may prevent capture of useful information. * * This handler requires a NormalizerFormatter to function and expects an array in $record->formatted * * @see https://docs.newrelic.com/docs/agents/php-agent * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security */ class NewRelicHandler extends AbstractProcessingHandler { /** * @inheritDoc */ public function __construct( int|string|Level $level = Level::Error, bool $bubble = true, /** * Name of the New Relic application that will receive logs from this handler. */ protected string|null $appName = null, /** * Some context and extra data is passed into the handler as arrays of values. Do we send them as is * (useful if we are using the API), or explode them for display on the NewRelic RPM website? */ protected bool $explodeArrays = false, /** * Name of the current transaction */ protected string|null $transactionName = null ) { parent::__construct($level, $bubble); } /** * @inheritDoc */ protected function write(LogRecord $record): void { if (!$this->isNewRelicEnabled()) { throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler'); } if (null !== ($appName = $this->getAppName($record->context))) { $this->setNewRelicAppName($appName); } if (null !== ($transactionName = $this->getTransactionName($record->context))) { $this->setNewRelicTransactionName($transactionName); unset($record->formatted['context']['transaction_name']); } if (isset($record->context['exception']) && $record->context['exception'] instanceof \Throwable) { newrelic_notice_error($record->message, $record->context['exception']); unset($record->formatted['context']['exception']); } else { newrelic_notice_error($record->message); } if (isset($record->formatted['context']) && is_array($record->formatted['context'])) { foreach ($record->formatted['context'] as $key => $parameter) { if (is_array($parameter) && $this->explodeArrays) { foreach ($parameter as $paramKey => $paramValue) { $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue); } } else { $this->setNewRelicParameter('context_' . $key, $parameter); } } } if (isset($record->formatted['extra']) && is_array($record->formatted['extra'])) { foreach ($record->formatted['extra'] as $key => $parameter) { if (is_array($parameter) && $this->explodeArrays) { foreach ($parameter as $paramKey => $paramValue) { $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue); } } else { $this->setNewRelicParameter('extra_' . $key, $parameter); } } } } /** * Checks whether the NewRelic extension is enabled in the system. */ protected function isNewRelicEnabled(): bool { return extension_loaded('newrelic'); } /** * Returns the appname where this log should be sent. Each log can override the default appname, set in this * handler's constructor, by providing the appname in it's context. * * @param mixed[] $context */ protected function getAppName(array $context): ?string { if (isset($context['appname'])) { return $context['appname']; } return $this->appName; } /** * Returns the name of the current transaction. Each log can override the default transaction name, set in this * handler's constructor, by providing the transaction_name in it's context * * @param mixed[] $context */ protected function getTransactionName(array $context): ?string { if (isset($context['transaction_name'])) { return $context['transaction_name']; } return $this->transactionName; } /** * Sets the NewRelic application that should receive this log. */ protected function setNewRelicAppName(string $appName): void { newrelic_set_appname($appName); } /** * Overwrites the name of the current transaction */ protected function setNewRelicTransactionName(string $transactionName): void { newrelic_name_transaction($transactionName); } /** * @param mixed $value */ protected function setNewRelicParameter(string $key, $value): void { if (null === $value || is_scalar($value)) { newrelic_add_custom_parameter($key, $value); } else { newrelic_add_custom_parameter($key, Utils::jsonEncode($value, null, true)); } } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new NormalizerFormatter(); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\LogRecord; /** * No-op * * This handler handles anything, but does nothing, and does not stop bubbling to the rest of the stack. * This can be used for testing, or to disable a handler when overriding a configuration without * influencing the rest of the stack. * * @author Roel Harbers */ class NoopHandler extends Handler { /** * @inheritDoc */ public function isHandling(LogRecord $record): bool { return true; } /** * @inheritDoc */ public function handle(LogRecord $record): bool { return false; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Psr\Log\LogLevel; use Monolog\Logger; use Monolog\LogRecord; /** * Blackhole * * Any record it can handle will be thrown away. This can be used * to put on top of an existing stack to override it temporarily. * * @author Jordi Boggiano */ class NullHandler extends Handler { private Level $level; /** * @param string|int|Level $level The minimum logging level at which this handler will be triggered * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ public function __construct(string|int|Level $level = Level::Debug) { $this->level = Logger::toMonologLevel($level); } /** * @inheritDoc */ public function isHandling(LogRecord $record): bool { return $record->level->value >= $this->level->value; } /** * @inheritDoc */ public function handle(LogRecord $record): bool { return $record->level->value >= $this->level->value; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Formatter\FormatterInterface; use Monolog\LogRecord; /** * Handler to only pass log messages when a certain threshold of number of messages is reached. * * This can be useful in cases of processing a batch of data, but you're for example only interested * in case it fails catastrophically instead of a warning for 1 or 2 events. Worse things can happen, right? * * Usage example: * * ``` * $log = new Logger('application'); * $handler = new SomeHandler(...) * * // Pass all warnings to the handler when more than 10 & all error messages when more then 5 * $overflow = new OverflowHandler($handler, [Level::Warning->value => 10, Level::Error->value => 5]); * * $log->pushHandler($overflow); *``` * * @author Kris Buist */ class OverflowHandler extends AbstractHandler implements FormattableHandlerInterface { private HandlerInterface $handler; /** @var array */ private array $thresholdMap = []; /** * Buffer of all messages passed to the handler before the threshold was reached * * @var mixed[][] */ private array $buffer = []; /** * @param array $thresholdMap Dictionary of log level value => threshold */ public function __construct( HandlerInterface $handler, array $thresholdMap = [], $level = Level::Debug, bool $bubble = true ) { $this->handler = $handler; foreach ($thresholdMap as $thresholdLevel => $threshold) { $this->thresholdMap[$thresholdLevel] = $threshold; } parent::__construct($level, $bubble); } /** * Handles a record. * * All records may be passed to this method, and the handler should discard * those that it does not want to handle. * * The return value of this function controls the bubbling process of the handler stack. * Unless the bubbling is interrupted (by returning true), the Logger class will keep on * calling further handlers in the stack with a given log record. * * @inheritDoc */ public function handle(LogRecord $record): bool { if ($record->level->isLowerThan($this->level)) { return false; } $level = $record->level->value; if (!isset($this->thresholdMap[$level])) { $this->thresholdMap[$level] = 0; } if ($this->thresholdMap[$level] > 0) { // The overflow threshold is not yet reached, so we're buffering the record and lowering the threshold by 1 $this->thresholdMap[$level]--; $this->buffer[$level][] = $record; return false === $this->bubble; } if ($this->thresholdMap[$level] == 0) { // This current message is breaking the threshold. Flush the buffer and continue handling the current record foreach ($this->buffer[$level] ?? [] as $buffered) { $this->handler->handle($buffered); } $this->thresholdMap[$level]--; unset($this->buffer[$level]); } $this->handler->handle($record); return false === $this->bubble; } /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($this->handler instanceof FormattableHandlerInterface) { $this->handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); } /** * @inheritDoc */ public function getFormatter(): FormatterInterface { if ($this->handler instanceof FormattableHandlerInterface) { return $this->handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Level; use Monolog\Utils; use PhpConsole\Connector; use PhpConsole\Handler as VendorPhpConsoleHandler; use PhpConsole\Helper; use Monolog\LogRecord; use PhpConsole\Storage; /** * Monolog handler for Google Chrome extension "PHP Console" * * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely * * Usage: * 1. Install Google Chrome extension [now dead and removed from the chrome store] * 2. See overview https://github.com/barbushin/php-console#overview * 3. Install PHP Console library https://github.com/barbushin/php-console#installation * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png) * * $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler())); * \Monolog\ErrorHandler::register($logger); * echo $undefinedVar; * $logger->debug('SELECT * FROM users', array('db', 'time' => 0.012)); * PC::debug($_SERVER); // PHP Console debugger for any type of vars * * @author Sergey Barbushin https://www.linkedin.com/in/barbushin * @phpstan-type Options array{ * enabled: bool, * classesPartialsTraceIgnore: string[], * debugTagsKeysInContext: array, * useOwnErrorsHandler: bool, * useOwnExceptionsHandler: bool, * sourcesBasePath: string|null, * registerHelper: bool, * serverEncoding: string|null, * headersLimit: int|null, * password: string|null, * enableSslOnlyMode: bool, * ipMasks: string[], * enableEvalListener: bool, * dumperDetectCallbacks: bool, * dumperLevelLimit: int, * dumperItemsCountLimit: int, * dumperItemSizeLimit: int, * dumperDumpSizeLimit: int, * detectDumpTraceAndSource: bool, * dataStorage: Storage|null * } * @phpstan-type InputOptions array{ * enabled?: bool, * classesPartialsTraceIgnore?: string[], * debugTagsKeysInContext?: array, * useOwnErrorsHandler?: bool, * useOwnExceptionsHandler?: bool, * sourcesBasePath?: string|null, * registerHelper?: bool, * serverEncoding?: string|null, * headersLimit?: int|null, * password?: string|null, * enableSslOnlyMode?: bool, * ipMasks?: string[], * enableEvalListener?: bool, * dumperDetectCallbacks?: bool, * dumperLevelLimit?: int, * dumperItemsCountLimit?: int, * dumperItemSizeLimit?: int, * dumperDumpSizeLimit?: int, * detectDumpTraceAndSource?: bool, * dataStorage?: Storage|null * } * * @deprecated Since 2.8.0 and 3.2.0, PHPConsole is abandoned and thus we will drop this handler in Monolog 4 */ class PHPConsoleHandler extends AbstractProcessingHandler { /** * @phpstan-var Options */ private array $options = [ 'enabled' => true, // bool Is PHP Console server enabled 'classesPartialsTraceIgnore' => ['Monolog\\'], // array Hide calls of classes started with... 'debugTagsKeysInContext' => [0, 'tag'], // bool Is PHP Console server enabled 'useOwnErrorsHandler' => false, // bool Enable errors handling 'useOwnExceptionsHandler' => false, // bool Enable exceptions handling 'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths 'registerHelper' => true, // bool Register PhpConsole\Helper that allows short debug calls like PC::debug($var, 'ta.g.s') 'serverEncoding' => null, // string|null Server internal encoding 'headersLimit' => null, // int|null Set headers size limit for your web-server 'password' => null, // string|null Protect PHP Console connection by password 'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed 'ipMasks' => [], // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1') 'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required) 'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings 'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level 'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number 'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item 'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON 'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug 'dataStorage' => null, // \PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ) ]; private Connector $connector; /** * @param array $options See \Monolog\Handler\PHPConsoleHandler::$options for more details * @param Connector|null $connector Instance of \PhpConsole\Connector class (optional) * @throws \RuntimeException * @phpstan-param InputOptions $options */ public function __construct(array $options = [], ?Connector $connector = null, int|string|Level $level = Level::Debug, bool $bubble = true) { if (!class_exists('PhpConsole\Connector')) { throw new \RuntimeException('PHP Console library not found. See https://github.com/barbushin/php-console#installation'); } parent::__construct($level, $bubble); $this->options = $this->initOptions($options); $this->connector = $this->initConnector($connector); } /** * @param array $options * @return array * * @phpstan-param InputOptions $options * @phpstan-return Options */ private function initOptions(array $options): array { $wrongOptions = array_diff(array_keys($options), array_keys($this->options)); if (\count($wrongOptions) > 0) { throw new \RuntimeException('Unknown options: ' . implode(', ', $wrongOptions)); } return array_replace($this->options, $options); } private function initConnector(?Connector $connector = null): Connector { if (null === $connector) { if ($this->options['dataStorage'] instanceof Storage) { Connector::setPostponeStorage($this->options['dataStorage']); } $connector = Connector::getInstance(); } if ($this->options['registerHelper'] && !Helper::isRegistered()) { Helper::register(); } if ($this->options['enabled'] && $connector->isActiveClient()) { if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) { $handler = VendorPhpConsoleHandler::getInstance(); $handler->setHandleErrors($this->options['useOwnErrorsHandler']); $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']); $handler->start(); } if (null !== $this->options['sourcesBasePath']) { $connector->setSourcesBasePath($this->options['sourcesBasePath']); } if (null !== $this->options['serverEncoding']) { $connector->setServerEncoding($this->options['serverEncoding']); } if (null !== $this->options['password']) { $connector->setPassword($this->options['password']); } if ($this->options['enableSslOnlyMode']) { $connector->enableSslOnlyMode(); } if (\count($this->options['ipMasks']) > 0) { $connector->setAllowedIpMasks($this->options['ipMasks']); } if (null !== $this->options['headersLimit'] && $this->options['headersLimit'] > 0) { $connector->setHeadersLimit($this->options['headersLimit']); } if ($this->options['detectDumpTraceAndSource']) { $connector->getDebugDispatcher()->detectTraceAndSource = true; } $dumper = $connector->getDumper(); $dumper->levelLimit = $this->options['dumperLevelLimit']; $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit']; $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit']; $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit']; $dumper->detectCallbacks = $this->options['dumperDetectCallbacks']; if ($this->options['enableEvalListener']) { $connector->startEvalRequestsListener(); } } return $connector; } public function getConnector(): Connector { return $this->connector; } /** * @return array */ public function getOptions(): array { return $this->options; } public function handle(LogRecord $record): bool { if ($this->options['enabled'] && $this->connector->isActiveClient()) { return parent::handle($record); } return !$this->bubble; } /** * Writes the record down to the log of the implementing handler */ protected function write(LogRecord $record): void { if ($record->level->isLowerThan(Level::Notice)) { $this->handleDebugRecord($record); } elseif (isset($record->context['exception']) && $record->context['exception'] instanceof \Throwable) { $this->handleExceptionRecord($record); } else { $this->handleErrorRecord($record); } } private function handleDebugRecord(LogRecord $record): void { [$tags, $filteredContext] = $this->getRecordTags($record); $message = $record->message; if (\count($filteredContext) > 0) { $message .= ' ' . Utils::jsonEncode($this->connector->getDumper()->dump(array_filter($filteredContext)), null, true); } $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']); } private function handleExceptionRecord(LogRecord $record): void { $this->connector->getErrorsDispatcher()->dispatchException($record->context['exception']); } private function handleErrorRecord(LogRecord $record): void { $context = $record->context; $this->connector->getErrorsDispatcher()->dispatchError( $context['code'] ?? null, $context['message'] ?? $record->message, $context['file'] ?? null, $context['line'] ?? null, $this->options['classesPartialsTraceIgnore'] ); } /** * @return array{string, mixed[]} */ private function getRecordTags(LogRecord $record): array { $tags = null; $filteredContext = []; if ($record->context !== []) { $filteredContext = $record->context; foreach ($this->options['debugTagsKeysInContext'] as $key) { if (isset($filteredContext[$key])) { $tags = $filteredContext[$key]; if ($key === 0) { array_shift($filteredContext); } else { unset($filteredContext[$key]); } break; } } } return [$tags ?? $record->level->toPsrLogLevel(), $filteredContext]; } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter('%message%'); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\LogRecord; /** * Stores to STDIN of any process, specified by a command. * * Usage example: *
         * $log = new Logger('myLogger');
         * $log->pushHandler(new ProcessHandler('/usr/bin/php /var/www/monolog/someScript.php'));
         * 
        * * @author Kolja Zuelsdorf */ class ProcessHandler extends AbstractProcessingHandler { /** * Holds the process to receive data on its STDIN. * * @var resource|bool|null */ private $process; private string $command; private ?string $cwd; /** * @var resource[] */ private array $pipes = []; /** * @var array */ protected const DESCRIPTOR_SPEC = [ 0 => ['pipe', 'r'], // STDIN is a pipe that the child will read from 1 => ['pipe', 'w'], // STDOUT is a pipe that the child will write to 2 => ['pipe', 'w'], // STDERR is a pipe to catch the any errors ]; /** * @param string $command Command for the process to start. Absolute paths are recommended, * especially if you do not use the $cwd parameter. * @param string|null $cwd "Current working directory" (CWD) for the process to be executed in. * @throws \InvalidArgumentException */ public function __construct(string $command, int|string|Level $level = Level::Debug, bool $bubble = true, ?string $cwd = null) { if ($command === '') { throw new \InvalidArgumentException('The command argument must be a non-empty string.'); } if ($cwd === '') { throw new \InvalidArgumentException('The optional CWD argument must be a non-empty string or null.'); } parent::__construct($level, $bubble); $this->command = $command; $this->cwd = $cwd; } /** * Writes the record down to the log of the implementing handler * * @throws \UnexpectedValueException */ protected function write(LogRecord $record): void { $this->ensureProcessIsStarted(); $this->writeProcessInput($record->formatted); $errors = $this->readProcessErrors(); if ($errors !== '') { throw new \UnexpectedValueException(sprintf('Errors while writing to process: %s', $errors)); } } /** * Makes sure that the process is actually started, and if not, starts it, * assigns the stream pipes, and handles startup errors, if any. */ private function ensureProcessIsStarted(): void { if (is_resource($this->process) === false) { $this->startProcess(); $this->handleStartupErrors(); } } /** * Starts the actual process and sets all streams to non-blocking. */ private function startProcess(): void { $this->process = proc_open($this->command, static::DESCRIPTOR_SPEC, $this->pipes, $this->cwd); foreach ($this->pipes as $pipe) { stream_set_blocking($pipe, false); } } /** * Selects the STDERR stream, handles upcoming startup errors, and throws an exception, if any. * * @throws \UnexpectedValueException */ private function handleStartupErrors(): void { $selected = $this->selectErrorStream(); if (false === $selected) { throw new \UnexpectedValueException('Something went wrong while selecting a stream.'); } $errors = $this->readProcessErrors(); if (is_resource($this->process) === false || $errors !== '') { throw new \UnexpectedValueException( sprintf('The process "%s" could not be opened: ' . $errors, $this->command) ); } } /** * Selects the STDERR stream. * * @return int|bool */ protected function selectErrorStream() { $empty = []; $errorPipes = [$this->pipes[2]]; return stream_select($errorPipes, $empty, $empty, 1); } /** * Reads the errors of the process, if there are any. * * @codeCoverageIgnore * @return string Empty string if there are no errors. */ protected function readProcessErrors(): string { return (string) stream_get_contents($this->pipes[2]); } /** * Writes to the input stream of the opened process. * * @codeCoverageIgnore */ protected function writeProcessInput(string $string): void { fwrite($this->pipes[0], $string); } /** * @inheritDoc */ public function close(): void { if (is_resource($this->process)) { foreach ($this->pipes as $pipe) { fclose($pipe); } proc_close($this->process); $this->process = null; } } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Processor\ProcessorInterface; use Monolog\LogRecord; /** * Interface to describe loggers that have processors * * @author Jordi Boggiano */ interface ProcessableHandlerInterface { /** * Adds a processor in the stack. * * @phpstan-param ProcessorInterface|(callable(LogRecord): LogRecord) $callback * * @param ProcessorInterface|callable $callback * @return HandlerInterface self */ public function pushProcessor(callable $callback): HandlerInterface; /** * Removes the processor on top of the stack and returns it. * * @phpstan-return ProcessorInterface|(callable(LogRecord): LogRecord) $callback * * @throws \LogicException In case the processor stack is empty * @return callable|ProcessorInterface */ public function popProcessor(): callable; } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\ResettableInterface; use Monolog\Processor\ProcessorInterface; use Monolog\LogRecord; /** * Helper trait for implementing ProcessableInterface * * @author Jordi Boggiano */ trait ProcessableHandlerTrait { /** * @var callable[] * @phpstan-var array<(callable(LogRecord): LogRecord)|ProcessorInterface> */ protected array $processors = []; /** * @inheritDoc */ public function pushProcessor(callable $callback): HandlerInterface { array_unshift($this->processors, $callback); return $this; } /** * @inheritDoc */ public function popProcessor(): callable { if (\count($this->processors) === 0) { throw new \LogicException('You tried to pop from an empty processor stack.'); } return array_shift($this->processors); } protected function processRecord(LogRecord $record): LogRecord { foreach ($this->processors as $processor) { $record = $processor($record); } return $record; } protected function resetProcessors(): void { foreach ($this->processors as $processor) { if ($processor instanceof ResettableInterface) { $processor->reset(); } } } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Psr\Log\LoggerInterface; use Monolog\Formatter\FormatterInterface; use Monolog\LogRecord; /** * Proxies log messages to an existing PSR-3 compliant logger. * * If a formatter is configured, the formatter's output MUST be a string and the * formatted message will be fed to the wrapped PSR logger instead of the original * log record's message. * * @author Michael Moussa */ class PsrHandler extends AbstractHandler implements FormattableHandlerInterface { /** * PSR-3 compliant logger */ protected LoggerInterface $logger; protected FormatterInterface|null $formatter = null; private bool $includeExtra; /** * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied */ public function __construct(LoggerInterface $logger, int|string|Level $level = Level::Debug, bool $bubble = true, bool $includeExtra = false) { parent::__construct($level, $bubble); $this->logger = $logger; $this->includeExtra = $includeExtra; } /** * @inheritDoc */ public function handle(LogRecord $record): bool { if (!$this->isHandling($record)) { return false; } $message = $this->formatter !== null ? (string) $this->formatter->format($record) : $record->message; $context = $this->includeExtra ? [...$record->extra, ...$record->context] : $record->context; $this->logger->log($record->level->toPsrLogLevel(), $message, $context); return false === $this->bubble; } /** * Sets the formatter. */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { $this->formatter = $formatter; return $this; } /** * Gets the formatter. */ public function getFormatter(): FormatterInterface { if ($this->formatter === null) { throw new \LogicException('No formatter has been set and this handler does not have a default formatter'); } return $this->formatter; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Logger; use Monolog\Utils; use Psr\Log\LogLevel; use Monolog\LogRecord; /** * Sends notifications through the pushover api to mobile phones * * @author Sebastian Göttschkes * @see https://www.pushover.net/api */ class PushoverHandler extends SocketHandler { private string $token; /** @var array */ private array $users; private string $title; private string|int|null $user = null; private int $retry; private int $expire; private Level $highPriorityLevel; private Level $emergencyLevel; private bool $useFormattedMessage = false; /** * All parameters that can be sent to Pushover * @see https://pushover.net/api * @var array */ private array $parameterNames = [ 'token' => true, 'user' => true, 'message' => true, 'device' => true, 'title' => true, 'url' => true, 'url_title' => true, 'priority' => true, 'timestamp' => true, 'sound' => true, 'retry' => true, 'expire' => true, 'callback' => true, ]; /** * Sounds the api supports by default * @see https://pushover.net/api#sounds * @var string[] */ private array $sounds = [ 'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming', 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb', 'persistent', 'echo', 'updown', 'none', ]; /** * @param string $token Pushover api token * @param string|array $users Pushover user id or array of ids the message will be sent to * @param string|null $title Title sent to the Pushover API * @param bool $useSSL Whether to connect via SSL. Required when pushing messages to users that are not * the pushover.net app owner. OpenSSL is required for this option. * @param int $retry The retry parameter specifies how often (in seconds) the Pushover servers will * send the same notification to the user. * @param int $expire The expire parameter specifies how many seconds your notification will continue * to be retried for (every retry seconds). * * @param int|string|Level|LogLevel::* $highPriorityLevel The minimum logging level at which this handler will start * sending "high priority" requests to the Pushover API * @param int|string|Level|LogLevel::* $emergencyLevel The minimum logging level at which this handler will start * sending "emergency" requests to the Pushover API * * * @phpstan-param string|array $users * @phpstan-param value-of|value-of|Level|LogLevel::* $highPriorityLevel * @phpstan-param value-of|value-of|Level|LogLevel::* $emergencyLevel */ public function __construct( string $token, $users, ?string $title = null, int|string|Level $level = Level::Critical, bool $bubble = true, bool $useSSL = true, int|string|Level $highPriorityLevel = Level::Critical, int|string|Level $emergencyLevel = Level::Emergency, int $retry = 30, int $expire = 25200, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80'; parent::__construct( $connectionString, $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->token = $token; $this->users = (array) $users; $this->title = $title ?? (string) gethostname(); $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel); $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel); $this->retry = $retry; $this->expire = $expire; } protected function generateDataStream(LogRecord $record): string { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } private function buildContent(LogRecord $record): string { // Pushover has a limit of 512 characters on title and message combined. $maxMessageLength = 512 - strlen($this->title); $message = ($this->useFormattedMessage) ? $record->formatted : $record->message; $message = Utils::substr($message, 0, $maxMessageLength); $timestamp = $record->datetime->getTimestamp(); $dataArray = [ 'token' => $this->token, 'user' => $this->user, 'message' => $message, 'title' => $this->title, 'timestamp' => $timestamp, ]; if ($record->level->value >= $this->emergencyLevel->value) { $dataArray['priority'] = 2; $dataArray['retry'] = $this->retry; $dataArray['expire'] = $this->expire; } elseif ($record->level->value >= $this->highPriorityLevel->value) { $dataArray['priority'] = 1; } // First determine the available parameters $context = array_intersect_key($record->context, $this->parameterNames); $extra = array_intersect_key($record->extra, $this->parameterNames); // Least important info should be merged with subsequent info $dataArray = array_merge($extra, $context, $dataArray); // Only pass sounds that are supported by the API if (isset($dataArray['sound']) && !in_array($dataArray['sound'], $this->sounds, true)) { unset($dataArray['sound']); } return http_build_query($dataArray); } private function buildHeader(string $content): string { $header = "POST /1/messages.json HTTP/1.1\r\n"; $header .= "Host: api.pushover.net\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } protected function write(LogRecord $record): void { foreach ($this->users as $user) { $this->user = $user; parent::write($record); $this->closeSocket(); } $this->user = null; } /** * @param int|string|Level|LogLevel::* $level * @return $this * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ public function setHighPriorityLevel(int|string|Level $level): self { $this->highPriorityLevel = Logger::toMonologLevel($level); return $this; } /** * @param int|string|Level|LogLevel::* $level * @return $this * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ public function setEmergencyLevel(int|string|Level $level): self { $this->emergencyLevel = Logger::toMonologLevel($level); return $this; } /** * Use the formatted message? * * @return $this */ public function useFormattedMessage(bool $useFormattedMessage): self { $this->useFormattedMessage = $useFormattedMessage; return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Level; use Monolog\LogRecord; use Predis\Client as Predis; use Redis; /** * Logs to a Redis key using rpush * * usage example: * * $log = new Logger('application'); * $redis = new RedisHandler(new Predis\Client("tcp://localhost:6379"), "logs", "prod"); * $log->pushHandler($redis); * * @author Thomas Tourlourat */ class RedisHandler extends AbstractProcessingHandler { /** @var Predis|Redis */ private Predis|Redis $redisClient; private string $redisKey; protected int $capSize; /** * @param Predis|Redis $redis The redis instance * @param string $key The key name to push records to * @param int $capSize Number of entries to limit list size to, 0 = unlimited */ public function __construct(Predis|Redis $redis, string $key, int|string|Level $level = Level::Debug, bool $bubble = true, int $capSize = 0) { $this->redisClient = $redis; $this->redisKey = $key; $this->capSize = $capSize; parent::__construct($level, $bubble); } /** * @inheritDoc */ protected function write(LogRecord $record): void { if ($this->capSize > 0) { $this->writeCapped($record); } else { $this->redisClient->rpush($this->redisKey, $record->formatted); } } /** * Write and cap the collection * Writes the record to the redis list and caps its */ protected function writeCapped(LogRecord $record): void { if ($this->redisClient instanceof Redis) { $mode = defined('Redis::MULTI') ? Redis::MULTI : 1; $this->redisClient->multi($mode) ->rPush($this->redisKey, $record->formatted) ->lTrim($this->redisKey, -$this->capSize, -1) ->exec(); } else { $redisKey = $this->redisKey; $capSize = $this->capSize; $this->redisClient->transaction(function ($tx) use ($record, $redisKey, $capSize) { $tx->rpush($redisKey, $record->formatted); $tx->ltrim($redisKey, -$capSize, -1); }); } } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter(); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Level; use Monolog\LogRecord; use Predis\Client as Predis; use Redis; /** * Sends the message to a Redis Pub/Sub channel using PUBLISH * * usage example: * * $log = new Logger('application'); * $redis = new RedisPubSubHandler(new Predis\Client("tcp://localhost:6379"), "logs", Level::Warning); * $log->pushHandler($redis); * * @author Gaëtan Faugère */ class RedisPubSubHandler extends AbstractProcessingHandler { /** @var Predis|Redis */ private Predis|Redis $redisClient; private string $channelKey; /** * @param Predis|Redis $redis The redis instance * @param string $key The channel key to publish records to */ public function __construct(Predis|Redis $redis, string $key, int|string|Level $level = Level::Debug, bool $bubble = true) { $this->redisClient = $redis; $this->channelKey = $key; parent::__construct($level, $bubble); } /** * @inheritDoc */ protected function write(LogRecord $record): void { $this->redisClient->publish($this->channelKey, $record->formatted); } /** * @inheritDoc */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter(); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Rollbar\RollbarLogger; use Throwable; use Monolog\LogRecord; /** * Sends errors to Rollbar * * If the context data contains a `payload` key, that is used as an array * of payload options to RollbarLogger's log method. * * Rollbar's context info will contain the context + extra keys from the log record * merged, and then on top of that a few keys: * * - level (rollbar level name) * - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8) * - channel * - datetime (unix timestamp) * * @author Paul Statezny */ class RollbarHandler extends AbstractProcessingHandler { protected RollbarLogger $rollbarLogger; /** * Records whether any log records have been added since the last flush of the rollbar notifier */ private bool $hasRecords = false; protected bool $initialized = false; /** * @param RollbarLogger $rollbarLogger RollbarLogger object constructed with valid token */ public function __construct(RollbarLogger $rollbarLogger, int|string|Level $level = Level::Error, bool $bubble = true) { $this->rollbarLogger = $rollbarLogger; parent::__construct($level, $bubble); } /** * Translates Monolog log levels to Rollbar levels. * * @return 'debug'|'info'|'warning'|'error'|'critical' */ protected function toRollbarLevel(Level $level): string { return match ($level) { Level::Debug => 'debug', Level::Info => 'info', Level::Notice => 'info', Level::Warning => 'warning', Level::Error => 'error', Level::Critical => 'critical', Level::Alert => 'critical', Level::Emergency => 'critical', }; } /** * @inheritDoc */ protected function write(LogRecord $record): void { if (!$this->initialized) { // __destructor() doesn't get called on Fatal errors register_shutdown_function([$this, 'close']); $this->initialized = true; } $context = $record->context; $context = array_merge($context, $record->extra, [ 'level' => $this->toRollbarLevel($record->level), 'monolog_level' => $record->level->getName(), 'channel' => $record->channel, 'datetime' => $record->datetime->format('U'), ]); if (isset($context['exception']) && $context['exception'] instanceof Throwable) { $exception = $context['exception']; unset($context['exception']); $toLog = $exception; } else { $toLog = $record->message; } // @phpstan-ignore-next-line $this->rollbarLogger->log($context['level'], $toLog, $context); $this->hasRecords = true; } public function flush(): void { if ($this->hasRecords) { $this->rollbarLogger->flush(); $this->hasRecords = false; } } /** * @inheritDoc */ public function close(): void { $this->flush(); } /** * @inheritDoc */ public function reset(): void { $this->flush(); parent::reset(); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use InvalidArgumentException; use Monolog\Level; use Monolog\Utils; use Monolog\LogRecord; /** * Stores logs to files that are rotated every day and a limited number of files are kept. * * This rotation is only intended to be used as a workaround. Using logrotate to * handle the rotation is strongly encouraged when you can use it. * * @author Christophe Coevoet * @author Jordi Boggiano */ class RotatingFileHandler extends StreamHandler { public const FILE_PER_DAY = 'Y-m-d'; public const FILE_PER_MONTH = 'Y-m'; public const FILE_PER_YEAR = 'Y'; protected string $filename; protected int $maxFiles; protected bool|null $mustRotate = null; protected \DateTimeImmutable $nextRotation; protected string $filenameFormat; protected string $dateFormat; /** * @param int $maxFiles The maximal amount of files to keep (0 means unlimited) * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) * @param bool $useLocking Try to lock log file before doing any writes */ public function __construct(string $filename, int $maxFiles = 0, int|string|Level $level = Level::Debug, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false, string $dateFormat = self::FILE_PER_DAY, string $filenameFormat = '{filename}-{date}') { $this->filename = Utils::canonicalizePath($filename); $this->maxFiles = $maxFiles; $this->setFilenameFormat($filenameFormat, $dateFormat); $this->nextRotation = $this->getNextRotation(); parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking); } /** * @inheritDoc */ public function close(): void { parent::close(); if (true === $this->mustRotate) { $this->rotate(); } } /** * @inheritDoc */ public function reset(): void { parent::reset(); if (true === $this->mustRotate) { $this->rotate(); } } /** * @return $this */ public function setFilenameFormat(string $filenameFormat, string $dateFormat): self { $this->setDateFormat($dateFormat); if (substr_count($filenameFormat, '{date}') === 0) { throw new InvalidArgumentException( 'Invalid filename format - format must contain at least `{date}`, because otherwise rotating is impossible.' ); } $this->filenameFormat = $filenameFormat; $this->url = $this->getTimedFilename(); $this->close(); return $this; } /** * @inheritDoc */ protected function write(LogRecord $record): void { // on the first record written, if the log is new, we should rotate (once per day) if (null === $this->mustRotate) { $this->mustRotate = null === $this->url || !file_exists($this->url); } if ($this->nextRotation <= $record->datetime) { $this->mustRotate = true; $this->close(); } parent::write($record); } /** * Rotates the files. */ protected function rotate(): void { // update filename $this->url = $this->getTimedFilename(); $this->nextRotation = $this->getNextRotation(); // skip GC of old logs if files are unlimited if (0 === $this->maxFiles) { return; } $logFiles = glob($this->getGlobPattern()); if (false === $logFiles) { // failed to glob return; } if ($this->maxFiles >= count($logFiles)) { // no files to remove return; } // Sorting the files by name to remove the older ones usort($logFiles, function ($a, $b) { return strcmp($b, $a); }); foreach (array_slice($logFiles, $this->maxFiles) as $file) { if (is_writable($file)) { // suppress errors here as unlink() might fail if two processes // are cleaning up/rotating at the same time set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline): bool { return false; }); unlink($file); restore_error_handler(); } } $this->mustRotate = false; } protected function getTimedFilename(): string { $fileInfo = pathinfo($this->filename); $timedFilename = str_replace( ['{filename}', '{date}'], [$fileInfo['filename'], date($this->dateFormat)], ($fileInfo['dirname'] ?? '') . '/' . $this->filenameFormat ); if (isset($fileInfo['extension'])) { $timedFilename .= '.'.$fileInfo['extension']; } return $timedFilename; } protected function getGlobPattern(): string { $fileInfo = pathinfo($this->filename); $glob = str_replace( ['{filename}', '{date}'], [$fileInfo['filename'], str_replace( ['Y', 'y', 'm', 'd'], ['[0-9][0-9][0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]'], $this->dateFormat) ], ($fileInfo['dirname'] ?? '') . '/' . $this->filenameFormat ); if (isset($fileInfo['extension'])) { $glob .= '.'.$fileInfo['extension']; } return $glob; } protected function setDateFormat(string $dateFormat): void { if (0 === preg_match('{^[Yy](([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) { throw new InvalidArgumentException( 'Invalid date format - format must be one of '. 'RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), RotatingFileHandler::FILE_PER_MONTH ("Y-m") '. 'or RotatingFileHandler::FILE_PER_YEAR ("Y"), or you can set one of the '. 'date formats using slashes, underscores and/or dots instead of dashes.' ); } $this->dateFormat = $dateFormat; } protected function getNextRotation(): \DateTimeImmutable { return match (str_replace(['/','_','.'], '-', $this->dateFormat)) { self::FILE_PER_MONTH => (new \DateTimeImmutable('first day of next month'))->setTime(0, 0, 0), self::FILE_PER_YEAR => (new \DateTimeImmutable('first day of January next year'))->setTime(0, 0, 0), default => (new \DateTimeImmutable('tomorrow'))->setTime(0, 0, 0), }; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Closure; use Monolog\Formatter\FormatterInterface; use Monolog\LogRecord; /** * Sampling handler * * A sampled event stream can be useful for logging high frequency events in * a production environment where you only need an idea of what is happening * and are not concerned with capturing every occurrence. Since the decision to * handle or not handle a particular event is determined randomly, the * resulting sampled log is not guaranteed to contain 1/N of the events that * occurred in the application, but based on the Law of large numbers, it will * tend to be close to this ratio with a large number of attempts. * * @author Bryan Davis * @author Kunal Mehta */ class SamplingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface { use ProcessableHandlerTrait; /** * Handler or factory Closure($record, $this) * * @phpstan-var (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface */ protected Closure|HandlerInterface $handler; protected int $factor; /** * @phpstan-param (Closure(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface $handler * * @param Closure|HandlerInterface $handler Handler or factory Closure($record|null, $samplingHandler). * @param int $factor Sample factor (e.g. 10 means every ~10th record is sampled) */ public function __construct(Closure|HandlerInterface $handler, int $factor) { parent::__construct(); $this->handler = $handler; $this->factor = $factor; } public function isHandling(LogRecord $record): bool { return $this->getHandler($record)->isHandling($record); } public function handle(LogRecord $record): bool { if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) { if (\count($this->processors) > 0) { $record = $this->processRecord($record); } $this->getHandler($record)->handle($record); } return false === $this->bubble; } /** * Return the nested handler * * If the handler was provided as a factory, this will trigger the handler's instantiation. */ public function getHandler(LogRecord|null $record = null): HandlerInterface { if (!$this->handler instanceof HandlerInterface) { $handler = ($this->handler)($record, $this); if (!$handler instanceof HandlerInterface) { throw new \RuntimeException("The factory Closure should return a HandlerInterface"); } $this->handler = $handler; } return $this->handler; } /** * @inheritDoc */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { $handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } /** * @inheritDoc */ public function getFormatter(): FormatterInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { return $handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; /** * SendGridrHandler uses the SendGrid API v2 function to send Log emails, more information in https://sendgrid.com/docs/API_Reference/Web_API/mail.html * * @author Ricardo Fontanelli */ class SendGridHandler extends MailHandler { /** * The SendGrid API User */ protected string $apiUser; /** * The SendGrid API Key */ protected string $apiKey; /** * The email addresses to which the message will be sent */ protected string $from; /** * The email addresses to which the message will be sent * @var string[] */ protected array $to; /** * The subject of the email */ protected string $subject; /** * @param string $apiUser The SendGrid API User * @param string $apiKey The SendGrid API Key * @param string $from The sender of the email * @param string|string[] $to The recipients of the email * @param string $subject The subject of the mail * * @throws MissingExtensionException If the curl extension is missing */ public function __construct(string $apiUser, string $apiKey, string $from, string|array $to, string $subject, int|string|Level $level = Level::Error, bool $bubble = true) { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the SendGridHandler'); } parent::__construct($level, $bubble); $this->apiUser = $apiUser; $this->apiKey = $apiKey; $this->from = $from; $this->to = (array) $to; $this->subject = $subject; } /** * @inheritDoc */ protected function send(string $content, array $records): void { $message = []; $message['api_user'] = $this->apiUser; $message['api_key'] = $this->apiKey; $message['from'] = $this->from; foreach ($this->to as $recipient) { $message['to[]'] = $recipient; } $message['subject'] = $this->subject; $message['date'] = date('r'); if ($this->isHtmlBody($content)) { $message['html'] = $content; } else { $message['text'] = $content; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.sendgrid.com/api/mail.send.json'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($message)); Curl\Util::execute($ch, 2); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\Slack; use Monolog\Level; use Monolog\Utils; use Monolog\Formatter\NormalizerFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\LogRecord; /** * Slack record utility helping to log to Slack webhooks or API. * * @author Greg Kedzierski * @author Haralan Dobrev * @see https://api.slack.com/incoming-webhooks * @see https://api.slack.com/docs/message-attachments */ class SlackRecord { public const COLOR_DANGER = 'danger'; public const COLOR_WARNING = 'warning'; public const COLOR_GOOD = 'good'; public const COLOR_DEFAULT = '#e3e4e6'; /** * Slack channel (encoded ID or name) */ private string|null $channel; /** * Name of a bot */ private string|null $username; /** * User icon e.g. 'ghost', 'http://example.com/user.png' */ private string|null $userIcon; /** * Whether the message should be added to Slack as attachment (plain text otherwise) */ private bool $useAttachment; /** * Whether the the context/extra messages added to Slack as attachments are in a short style */ private bool $useShortAttachment; /** * Whether the attachment should include context and extra data */ private bool $includeContextAndExtra; /** * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] * @var string[] */ private array $excludeFields; private FormatterInterface|null $formatter; private NormalizerFormatter $normalizerFormatter; /** * @param string[] $excludeFields */ public function __construct( ?string $channel = null, ?string $username = null, bool $useAttachment = true, ?string $userIcon = null, bool $useShortAttachment = false, bool $includeContextAndExtra = false, array $excludeFields = [], FormatterInterface|null $formatter = null ) { $this ->setChannel($channel) ->setUsername($username) ->useAttachment($useAttachment) ->setUserIcon($userIcon) ->useShortAttachment($useShortAttachment) ->includeContextAndExtra($includeContextAndExtra) ->excludeFields($excludeFields) ->setFormatter($formatter); if ($this->includeContextAndExtra) { $this->normalizerFormatter = new NormalizerFormatter(); } } /** * Returns required data in format that Slack * is expecting. * * @phpstan-return mixed[] */ public function getSlackData(LogRecord $record): array { $dataArray = []; if ($this->username !== null) { $dataArray['username'] = $this->username; } if ($this->channel !== null) { $dataArray['channel'] = $this->channel; } if ($this->formatter !== null && !$this->useAttachment) { $message = $this->formatter->format($record); } else { $message = $record->message; } $recordData = $this->removeExcludedFields($record); if ($this->useAttachment) { $attachment = [ 'fallback' => $message, 'text' => $message, 'color' => $this->getAttachmentColor($record->level), 'fields' => [], 'mrkdwn_in' => ['fields'], 'ts' => $recordData['datetime']->getTimestamp(), 'footer' => $this->username, 'footer_icon' => $this->userIcon, ]; if ($this->useShortAttachment) { $attachment['title'] = $recordData['level_name']; } else { $attachment['title'] = 'Message'; $attachment['fields'][] = $this->generateAttachmentField('Level', $recordData['level_name']); } if ($this->includeContextAndExtra) { foreach (['extra', 'context'] as $key) { if (!isset($recordData[$key]) || \count($recordData[$key]) === 0) { continue; } if ($this->useShortAttachment) { $attachment['fields'][] = $this->generateAttachmentField( $key, $recordData[$key] ); } else { // Add all extra fields as individual fields in attachment $attachment['fields'] = array_merge( $attachment['fields'], $this->generateAttachmentFields($recordData[$key]) ); } } } $dataArray['attachments'] = [$attachment]; } else { $dataArray['text'] = $message; } if ($this->userIcon !== null) { if (false !== ($iconUrl = filter_var($this->userIcon, FILTER_VALIDATE_URL))) { $dataArray['icon_url'] = $iconUrl; } else { $dataArray['icon_emoji'] = ":{$this->userIcon}:"; } } return $dataArray; } /** * Returns a Slack message attachment color associated with * provided level. */ public function getAttachmentColor(Level $level): string { return match ($level) { Level::Error, Level::Critical, Level::Alert, Level::Emergency => static::COLOR_DANGER, Level::Warning => static::COLOR_WARNING, Level::Info, Level::Notice => static::COLOR_GOOD, Level::Debug => static::COLOR_DEFAULT }; } /** * Stringifies an array of key/value pairs to be used in attachment fields * * @param mixed[] $fields */ public function stringify(array $fields): string { /** @var array $normalized */ $normalized = $this->normalizerFormatter->normalizeValue($fields); $hasSecondDimension = \count(array_filter($normalized, 'is_array')) > 0; $hasOnlyNonNumericKeys = \count(array_filter(array_keys($normalized), 'is_numeric')) === 0; return $hasSecondDimension || $hasOnlyNonNumericKeys ? Utils::jsonEncode($normalized, JSON_PRETTY_PRINT|Utils::DEFAULT_JSON_FLAGS) : Utils::jsonEncode($normalized, Utils::DEFAULT_JSON_FLAGS); } /** * Channel used by the bot when posting * * @param ?string $channel * @return $this */ public function setChannel(?string $channel = null): self { $this->channel = $channel; return $this; } /** * Username used by the bot when posting * * @param ?string $username * @return $this */ public function setUsername(?string $username = null): self { $this->username = $username; return $this; } /** * @return $this */ public function useAttachment(bool $useAttachment = true): self { $this->useAttachment = $useAttachment; return $this; } /** * @return $this */ public function setUserIcon(?string $userIcon = null): self { $this->userIcon = $userIcon; if (\is_string($userIcon)) { $this->userIcon = trim($userIcon, ':'); } return $this; } /** * @return $this */ public function useShortAttachment(bool $useShortAttachment = false): self { $this->useShortAttachment = $useShortAttachment; return $this; } /** * @return $this */ public function includeContextAndExtra(bool $includeContextAndExtra = false): self { $this->includeContextAndExtra = $includeContextAndExtra; if ($this->includeContextAndExtra) { $this->normalizerFormatter = new NormalizerFormatter(); } return $this; } /** * @param string[] $excludeFields * @return $this */ public function excludeFields(array $excludeFields = []): self { $this->excludeFields = $excludeFields; return $this; } /** * @return $this */ public function setFormatter(?FormatterInterface $formatter = null): self { $this->formatter = $formatter; return $this; } /** * Generates attachment field * * @param string|mixed[] $value * * @return array{title: string, value: string, short: false} */ private function generateAttachmentField(string $title, $value): array { $value = is_array($value) ? sprintf('```%s```', substr($this->stringify($value), 0, 1990)) : $value; return [ 'title' => ucfirst($title), 'value' => $value, 'short' => false, ]; } /** * Generates a collection of attachment fields from array * * @param mixed[] $data * * @return array */ private function generateAttachmentFields(array $data): array { /** @var array $normalized */ $normalized = $this->normalizerFormatter->normalizeValue($data); $fields = []; foreach ($normalized as $key => $value) { $fields[] = $this->generateAttachmentField((string) $key, $value); } return $fields; } /** * Get a copy of record with fields excluded according to $this->excludeFields * * @return mixed[] */ private function removeExcludedFields(LogRecord $record): array { $recordData = $record->toArray(); foreach ($this->excludeFields as $field) { $keys = explode('.', $field); $node = &$recordData; $lastKey = end($keys); foreach ($keys as $key) { if (!isset($node[$key])) { break; } if ($lastKey === $key) { unset($node[$key]); break; } $node = &$node[$key]; } } return $recordData; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Level; use Monolog\Utils; use Monolog\Handler\Slack\SlackRecord; use Monolog\LogRecord; /** * Sends notifications through Slack API * * @author Greg Kedzierski * @see https://api.slack.com/ */ class SlackHandler extends SocketHandler { /** * Slack API token */ private string $token; /** * Instance of the SlackRecord util class preparing data for Slack API. */ private SlackRecord $slackRecord; /** * @param string $token Slack API token * @param string $channel Slack channel (encoded ID or name) * @param string|null $username Name of a bot * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) * @param string|null $iconEmoji The emoji name to use (or null) * @param bool $useShortAttachment Whether the context/extra messages added to Slack as attachments are in a short style * @param bool $includeContextAndExtra Whether the attachment should include context and extra data * @param string[] $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] * @throws MissingExtensionException If no OpenSSL PHP extension configured */ public function __construct( string $token, string $channel, ?string $username = null, bool $useAttachment = true, ?string $iconEmoji = null, $level = Level::Critical, bool $bubble = true, bool $useShortAttachment = false, bool $includeContextAndExtra = false, array $excludeFields = [], bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler'); } parent::__construct( 'ssl://slack.com:443', $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->slackRecord = new SlackRecord( $channel, $username, $useAttachment, $iconEmoji, $useShortAttachment, $includeContextAndExtra, $excludeFields ); $this->token = $token; } public function getSlackRecord(): SlackRecord { return $this->slackRecord; } public function getToken(): string { return $this->token; } /** * @inheritDoc */ protected function generateDataStream(LogRecord $record): string { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the body of API call */ private function buildContent(LogRecord $record): string { $dataArray = $this->prepareContentData($record); return http_build_query($dataArray); } /** * @return string[] */ protected function prepareContentData(LogRecord $record): array { $dataArray = $this->slackRecord->getSlackData($record); $dataArray['token'] = $this->token; if (isset($dataArray['attachments']) && is_array($dataArray['attachments']) && \count($dataArray['attachments']) > 0) { $dataArray['attachments'] = Utils::jsonEncode($dataArray['attachments']); } return $dataArray; } /** * Builds the header of the API Call */ private function buildHeader(string $content): string { $header = "POST /api/chat.postMessage HTTP/1.1\r\n"; $header .= "Host: slack.com\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } /** * @inheritDoc */ protected function write(LogRecord $record): void { parent::write($record); $this->finalizeWrite(); } /** * Finalizes the request by reading some bytes and then closing the socket * * If we do not read some but close the socket too early, slack sometimes * drops the request entirely. */ protected function finalizeWrite(): void { $res = $this->getResource(); if (is_resource($res)) { @fread($res, 2048); } $this->closeSocket(); } public function setFormatter(FormatterInterface $formatter): HandlerInterface { parent::setFormatter($formatter); $this->slackRecord->setFormatter($formatter); return $this; } public function getFormatter(): FormatterInterface { $formatter = parent::getFormatter(); $this->slackRecord->setFormatter($formatter); return $formatter; } /** * Channel used by the bot when posting * * @return $this */ public function setChannel(string $channel): self { $this->slackRecord->setChannel($channel); return $this; } /** * Username used by the bot when posting * * @return $this */ public function setUsername(string $username): self { $this->slackRecord->setUsername($username); return $this; } /** * @return $this */ public function useAttachment(bool $useAttachment): self { $this->slackRecord->useAttachment($useAttachment); return $this; } /** * @return $this */ public function setIconEmoji(string $iconEmoji): self { $this->slackRecord->setUserIcon($iconEmoji); return $this; } /** * @return $this */ public function useShortAttachment(bool $useShortAttachment): self { $this->slackRecord->useShortAttachment($useShortAttachment); return $this; } /** * @return $this */ public function includeContextAndExtra(bool $includeContextAndExtra): self { $this->slackRecord->includeContextAndExtra($includeContextAndExtra); return $this; } /** * @param string[] $excludeFields * @return $this */ public function excludeFields(array $excludeFields): self { $this->slackRecord->excludeFields($excludeFields); return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Level; use Monolog\Utils; use Monolog\Handler\Slack\SlackRecord; use Monolog\LogRecord; /** * Sends notifications through Slack Webhooks * * @author Haralan Dobrev * @see https://api.slack.com/incoming-webhooks */ class SlackWebhookHandler extends AbstractProcessingHandler { /** * Slack Webhook token */ private string $webhookUrl; /** * Instance of the SlackRecord util class preparing data for Slack API. */ private SlackRecord $slackRecord; /** * @param string $webhookUrl Slack Webhook URL * @param string|null $channel Slack channel (encoded ID or name) * @param string|null $username Name of a bot * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) * @param string|null $iconEmoji The emoji name to use (or null) * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style * @param bool $includeContextAndExtra Whether the attachment should include context and extra data * @param string[] $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] * * @throws MissingExtensionException If the curl extension is missing */ public function __construct( string $webhookUrl, ?string $channel = null, ?string $username = null, bool $useAttachment = true, ?string $iconEmoji = null, bool $useShortAttachment = false, bool $includeContextAndExtra = false, $level = Level::Critical, bool $bubble = true, array $excludeFields = [] ) { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the SlackWebhookHandler'); } parent::__construct($level, $bubble); $this->webhookUrl = $webhookUrl; $this->slackRecord = new SlackRecord( $channel, $username, $useAttachment, $iconEmoji, $useShortAttachment, $includeContextAndExtra, $excludeFields ); } public function getSlackRecord(): SlackRecord { return $this->slackRecord; } public function getWebhookUrl(): string { return $this->webhookUrl; } /** * @inheritDoc */ protected function write(LogRecord $record): void { $postData = $this->slackRecord->getSlackData($record); $postString = Utils::jsonEncode($postData); $ch = curl_init(); $options = [ CURLOPT_URL => $this->webhookUrl, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Content-type: application/json'], CURLOPT_POSTFIELDS => $postString, ]; curl_setopt_array($ch, $options); Curl\Util::execute($ch); } public function setFormatter(FormatterInterface $formatter): HandlerInterface { parent::setFormatter($formatter); $this->slackRecord->setFormatter($formatter); return $this; } public function getFormatter(): FormatterInterface { $formatter = parent::getFormatter(); $this->slackRecord->setFormatter($formatter); return $formatter; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\LogRecord; /** * Stores to any socket - uses fsockopen() or pfsockopen(). * * @author Pablo de Leon Belloc * @see http://php.net/manual/en/function.fsockopen.php */ class SocketHandler extends AbstractProcessingHandler { private string $connectionString; private float $connectionTimeout; /** @var resource|null */ private $resource; private float $timeout; private float $writingTimeout; private int|null $lastSentBytes = null; private int|null $chunkSize; private bool $persistent; private int|null $errno = null; private string|null $errstr = null; private float|null $lastWritingAt = null; /** * @param string $connectionString Socket connection string * @param bool $persistent Flag to enable/disable persistent connections * @param float $timeout Socket timeout to wait until the request is being aborted * @param float $writingTimeout Socket timeout to wait until the request should've been sent/written * @param float|null $connectionTimeout Socket connect timeout to wait until the connection should've been * established * @param int|null $chunkSize Sets the chunk size. Only has effect during connection in the writing cycle * * @throws \InvalidArgumentException If an invalid timeout value (less than 0) is passed. */ public function __construct( string $connectionString, $level = Level::Debug, bool $bubble = true, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { parent::__construct($level, $bubble); $this->connectionString = $connectionString; if ($connectionTimeout !== null) { $this->validateTimeout($connectionTimeout); } $this->connectionTimeout = $connectionTimeout ?? (float) ini_get('default_socket_timeout'); $this->persistent = $persistent; $this->validateTimeout($timeout); $this->timeout = $timeout; $this->validateTimeout($writingTimeout); $this->writingTimeout = $writingTimeout; $this->chunkSize = $chunkSize; } /** * Connect (if necessary) and write to the socket * * @inheritDoc * * @throws \UnexpectedValueException * @throws \RuntimeException */ protected function write(LogRecord $record): void { $this->connectIfNotConnected(); $data = $this->generateDataStream($record); $this->writeToSocket($data); } /** * We will not close a PersistentSocket instance so it can be reused in other requests. */ public function close(): void { if (!$this->isPersistent()) { $this->closeSocket(); } } /** * Close socket, if open */ public function closeSocket(): void { if (is_resource($this->resource)) { fclose($this->resource); $this->resource = null; } } /** * Set socket connection to be persistent. It only has effect before the connection is initiated. * * @return $this */ public function setPersistent(bool $persistent): self { $this->persistent = $persistent; return $this; } /** * Set connection timeout. Only has effect before we connect. * * @see http://php.net/manual/en/function.fsockopen.php * @return $this */ public function setConnectionTimeout(float $seconds): self { $this->validateTimeout($seconds); $this->connectionTimeout = $seconds; return $this; } /** * Set write timeout. Only has effect before we connect. * * @see http://php.net/manual/en/function.stream-set-timeout.php * @return $this */ public function setTimeout(float $seconds): self { $this->validateTimeout($seconds); $this->timeout = $seconds; return $this; } /** * Set writing timeout. Only has effect during connection in the writing cycle. * * @param float $seconds 0 for no timeout * @return $this */ public function setWritingTimeout(float $seconds): self { $this->validateTimeout($seconds); $this->writingTimeout = $seconds; return $this; } /** * Set chunk size. Only has effect during connection in the writing cycle. * * @return $this */ public function setChunkSize(int $bytes): self { $this->chunkSize = $bytes; return $this; } /** * Get current connection string */ public function getConnectionString(): string { return $this->connectionString; } /** * Get persistent setting */ public function isPersistent(): bool { return $this->persistent; } /** * Get current connection timeout setting */ public function getConnectionTimeout(): float { return $this->connectionTimeout; } /** * Get current in-transfer timeout */ public function getTimeout(): float { return $this->timeout; } /** * Get current local writing timeout */ public function getWritingTimeout(): float { return $this->writingTimeout; } /** * Get current chunk size */ public function getChunkSize(): ?int { return $this->chunkSize; } /** * Check to see if the socket is currently available. * * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details. */ public function isConnected(): bool { return is_resource($this->resource) && !feof($this->resource); // on TCP - other party can close connection. } /** * Wrapper to allow mocking * * @return resource|false */ protected function pfsockopen() { return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); } /** * Wrapper to allow mocking * * @return resource|false */ protected function fsockopen() { return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); } /** * Wrapper to allow mocking * * @see http://php.net/manual/en/function.stream-set-timeout.php */ protected function streamSetTimeout(): bool { $seconds = floor($this->timeout); $microseconds = round(($this->timeout - $seconds) * 1e6); if (!is_resource($this->resource)) { throw new \LogicException('streamSetTimeout called but $this->resource is not a resource'); } return stream_set_timeout($this->resource, (int) $seconds, (int) $microseconds); } /** * Wrapper to allow mocking * * @see http://php.net/manual/en/function.stream-set-chunk-size.php * * @return int|false */ protected function streamSetChunkSize(): int|bool { if (!is_resource($this->resource)) { throw new \LogicException('streamSetChunkSize called but $this->resource is not a resource'); } if (null === $this->chunkSize) { throw new \LogicException('streamSetChunkSize called but $this->chunkSize is not set'); } return stream_set_chunk_size($this->resource, $this->chunkSize); } /** * Wrapper to allow mocking * * @return int|false */ protected function fwrite(string $data): int|bool { if (!is_resource($this->resource)) { throw new \LogicException('fwrite called but $this->resource is not a resource'); } return @fwrite($this->resource, $data); } /** * Wrapper to allow mocking * * @return mixed[]|bool */ protected function streamGetMetadata(): array|bool { if (!is_resource($this->resource)) { throw new \LogicException('streamGetMetadata called but $this->resource is not a resource'); } return stream_get_meta_data($this->resource); } private function validateTimeout(float $value): void { if ($value < 0) { throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got $value)"); } } private function connectIfNotConnected(): void { if ($this->isConnected()) { return; } $this->connect(); } protected function generateDataStream(LogRecord $record): string { return (string) $record->formatted; } /** * @return resource|null */ protected function getResource() { return $this->resource; } private function connect(): void { $this->createSocketResource(); $this->setSocketTimeout(); $this->setStreamChunkSize(); } private function createSocketResource(): void { if ($this->isPersistent()) { $resource = $this->pfsockopen(); } else { $resource = $this->fsockopen(); } if (is_bool($resource)) { throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)"); } $this->resource = $resource; } private function setSocketTimeout(): void { if (!$this->streamSetTimeout()) { throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()"); } } private function setStreamChunkSize(): void { if (null !== $this->chunkSize && false === $this->streamSetChunkSize()) { throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()"); } } private function writeToSocket(string $data): void { $length = strlen($data); $sent = 0; $this->lastSentBytes = $sent; while ($this->isConnected() && $sent < $length) { if (0 == $sent) { $chunk = $this->fwrite($data); } else { $chunk = $this->fwrite(substr($data, $sent)); } if ($chunk === false) { throw new \RuntimeException("Could not write to socket"); } $sent += $chunk; $socketInfo = $this->streamGetMetadata(); if (is_array($socketInfo) && (bool) $socketInfo['timed_out']) { throw new \RuntimeException("Write timed-out"); } if ($this->writingIsTimedOut($sent)) { throw new \RuntimeException("Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent $sent of $length)"); } } if (!$this->isConnected() && $sent < $length) { throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)"); } } private function writingIsTimedOut(int $sent): bool { // convert to ms if (0.0 == $this->writingTimeout) { return false; } if ($sent !== $this->lastSentBytes) { $this->lastWritingAt = microtime(true); $this->lastSentBytes = $sent; return false; } else { usleep(100); } if ((microtime(true) - (float) $this->lastWritingAt) >= $this->writingTimeout) { $this->closeSocket(); return true; } return false; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Aws\Sqs\SqsClient; use Monolog\Level; use Monolog\Utils; use Monolog\LogRecord; /** * Writes to any sqs queue. * * @author Martijn van Calker */ class SqsHandler extends AbstractProcessingHandler { /** 256 KB in bytes - maximum message size in SQS */ protected const MAX_MESSAGE_SIZE = 262144; /** 100 KB in bytes - head message size for new error log */ protected const HEAD_MESSAGE_SIZE = 102400; private SqsClient $client; private string $queueUrl; public function __construct(SqsClient $sqsClient, string $queueUrl, int|string|Level $level = Level::Debug, bool $bubble = true) { parent::__construct($level, $bubble); $this->client = $sqsClient; $this->queueUrl = $queueUrl; } /** * @inheritDoc */ protected function write(LogRecord $record): void { if (!isset($record->formatted) || 'string' !== gettype($record->formatted)) { throw new \InvalidArgumentException('SqsHandler accepts only formatted records as a string' . Utils::getRecordMessageForException($record)); } $messageBody = $record->formatted; if (strlen($messageBody) >= static::MAX_MESSAGE_SIZE) { $messageBody = Utils::substr($messageBody, 0, static::HEAD_MESSAGE_SIZE); } $this->client->sendMessage([ 'QueueUrl' => $this->queueUrl, 'MessageBody' => $messageBody, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Utils; use Monolog\LogRecord; /** * Stores to any stream resource * * Can be used to store into php://stderr, remote and local files, etc. * * @author Jordi Boggiano */ class StreamHandler extends AbstractProcessingHandler { protected const MAX_CHUNK_SIZE = 2147483647; /** 10MB */ protected const DEFAULT_CHUNK_SIZE = 10 * 1024 * 1024; protected int $streamChunkSize; /** @var resource|null */ protected $stream; protected string|null $url = null; private string|null $errorMessage = null; protected int|null $filePermission; protected bool $useLocking; /** @var true|null */ private bool|null $dirCreated = null; /** * @param resource|string $stream If a missing path can't be created, an UnexpectedValueException will be thrown on first write * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) * @param bool $useLocking Try to lock log file before doing any writes * * @throws \InvalidArgumentException If stream is not a resource or string */ public function __construct($stream, int|string|Level $level = Level::Debug, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false) { parent::__construct($level, $bubble); if (($phpMemoryLimit = Utils::expandIniShorthandBytes(ini_get('memory_limit'))) !== false) { if ($phpMemoryLimit > 0) { // use max 10% of allowed memory for the chunk size, and at least 100KB $this->streamChunkSize = min(static::MAX_CHUNK_SIZE, max((int) ($phpMemoryLimit / 10), 100 * 1024)); } else { // memory is unlimited, set to the default 10MB $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE; } } else { // no memory limit information, set to the default 10MB $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE; } if (is_resource($stream)) { $this->stream = $stream; stream_set_chunk_size($this->stream, $this->streamChunkSize); } elseif (is_string($stream)) { $this->url = Utils::canonicalizePath($stream); } else { throw new \InvalidArgumentException('A stream must either be a resource or a string.'); } $this->filePermission = $filePermission; $this->useLocking = $useLocking; } /** * @inheritDoc */ public function close(): void { if (null !== $this->url && is_resource($this->stream)) { fclose($this->stream); } $this->stream = null; $this->dirCreated = null; } /** * Return the currently active stream if it is open * * @return resource|null */ public function getStream() { return $this->stream; } /** * Return the stream URL if it was configured with a URL and not an active resource */ public function getUrl(): ?string { return $this->url; } public function getStreamChunkSize(): int { return $this->streamChunkSize; } /** * @inheritDoc */ protected function write(LogRecord $record): void { if (!is_resource($this->stream)) { $url = $this->url; if (null === $url || '' === $url) { throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().' . Utils::getRecordMessageForException($record)); } $this->createDir($url); $this->errorMessage = null; set_error_handler([$this, 'customErrorHandler']); try { $stream = fopen($url, 'a'); if ($this->filePermission !== null) { @chmod($url, $this->filePermission); } } finally { restore_error_handler(); } if (!is_resource($stream)) { $this->stream = null; throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened in append mode: '.$this->errorMessage, $url) . Utils::getRecordMessageForException($record)); } stream_set_chunk_size($stream, $this->streamChunkSize); $this->stream = $stream; } $stream = $this->stream; if ($this->useLocking) { // ignoring errors here, there's not much we can do about them flock($stream, LOCK_EX); } $this->streamWrite($stream, $record); if ($this->useLocking) { flock($stream, LOCK_UN); } } /** * Write to stream * @param resource $stream */ protected function streamWrite($stream, LogRecord $record): void { fwrite($stream, (string) $record->formatted); } private function customErrorHandler(int $code, string $msg): bool { $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg); return true; } private function getDirFromStream(string $stream): ?string { $pos = strpos($stream, '://'); if ($pos === false) { return dirname($stream); } if ('file://' === substr($stream, 0, 7)) { return dirname(substr($stream, 7)); } return null; } private function createDir(string $url): void { // Do not try to create dir if it has already been tried. if (true === $this->dirCreated) { return; } $dir = $this->getDirFromStream($url); if (null !== $dir && !is_dir($dir)) { $this->errorMessage = null; set_error_handler([$this, 'customErrorHandler']); $status = mkdir($dir, 0777, true); restore_error_handler(); if (false === $status && !is_dir($dir) && strpos((string) $this->errorMessage, 'File exists') === false) { throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and it could not be created: '.$this->errorMessage, $dir)); } } $this->dirCreated = true; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Closure; use Monolog\Level; use Monolog\Logger; use Monolog\LogRecord; use Monolog\Utils; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mailer\Transport\TransportInterface; use Symfony\Component\Mime\Email; /** * SymfonyMailerHandler uses Symfony's Mailer component to send the emails * * @author Jordi Boggiano */ class SymfonyMailerHandler extends MailHandler { protected MailerInterface|TransportInterface $mailer; /** @var Email|Closure(string, LogRecord[]): Email */ private Email|Closure $emailTemplate; /** * @phpstan-param Email|Closure(string, LogRecord[]): Email $email * * @param MailerInterface|TransportInterface $mailer The mailer to use * @param Closure|Email $email An email template, the subject/body will be replaced */ public function __construct($mailer, Email|Closure $email, int|string|Level $level = Level::Error, bool $bubble = true) { parent::__construct($level, $bubble); $this->mailer = $mailer; $this->emailTemplate = $email; } /** * {@inheritDoc} */ protected function send(string $content, array $records): void { $this->mailer->send($this->buildMessage($content, $records)); } /** * Gets the formatter for the Swift_Message subject. * * @param string|null $format The format of the subject */ protected function getSubjectFormatter(?string $format): FormatterInterface { return new LineFormatter($format); } /** * Creates instance of Email to be sent * * @param string $content formatted email body to be sent * @param LogRecord[] $records Log records that formed the content */ protected function buildMessage(string $content, array $records): Email { $message = null; if ($this->emailTemplate instanceof Email) { $message = clone $this->emailTemplate; } elseif (is_callable($this->emailTemplate)) { $message = ($this->emailTemplate)($content, $records); } if (!$message instanceof Email) { $record = reset($records); throw new \InvalidArgumentException('Could not resolve message as instance of Email or a callable returning it' . ($record instanceof LogRecord ? Utils::getRecordMessageForException($record) : '')); } if (\count($records) > 0) { $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); $message->subject($subjectFormatter->format($this->getHighestRecord($records))); } if ($this->isHtmlBody($content)) { if (null !== ($charset = $message->getHtmlCharset())) { $message->html($content, $charset); } else { $message->html($content); } } else { if (null !== ($charset = $message->getTextCharset())) { $message->text($content, $charset); } else { $message->text($content); } } return $message->date(new \DateTimeImmutable()); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Utils; use Monolog\LogRecord; /** * Logs to syslog service. * * usage example: * * $log = new Logger('application'); * $syslog = new SyslogHandler('myfacility', 'local6'); * $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%"); * $syslog->setFormatter($formatter); * $log->pushHandler($syslog); * * @author Sven Paulus */ class SyslogHandler extends AbstractSyslogHandler { protected string $ident; protected int $logopts; /** * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID */ public function __construct(string $ident, string|int $facility = LOG_USER, int|string|Level $level = Level::Debug, bool $bubble = true, int $logopts = LOG_PID) { parent::__construct($facility, $level, $bubble); $this->ident = $ident; $this->logopts = $logopts; } /** * @inheritDoc */ public function close(): void { closelog(); } /** * @inheritDoc */ protected function write(LogRecord $record): void { openlog($this->ident, $this->logopts, $this->facility); syslog($this->toSyslogPriority($record->level), (string) $record->formatted); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\SyslogUdp; use Monolog\Utils; use Socket; class UdpSocket { protected const DATAGRAM_MAX_LENGTH = 65023; protected string $ip; protected int $port; protected ?Socket $socket = null; public function __construct(string $ip, int $port = 514) { $this->ip = $ip; $this->port = $port; } public function write(string $line, string $header = ""): void { $this->send($this->assembleMessage($line, $header)); } public function close(): void { if ($this->socket instanceof Socket) { socket_close($this->socket); $this->socket = null; } } protected function getSocket(): Socket { if (null !== $this->socket) { return $this->socket; } $domain = AF_INET; $protocol = SOL_UDP; // Check if we are using unix sockets. if ($this->port === 0) { $domain = AF_UNIX; $protocol = IPPROTO_IP; } $socket = socket_create($domain, SOCK_DGRAM, $protocol); if ($socket instanceof Socket) { return $this->socket = $socket; } throw new \RuntimeException('The UdpSocket to '.$this->ip.':'.$this->port.' could not be opened via socket_create'); } protected function send(string $chunk): void { socket_sendto($this->getSocket(), $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); } protected function assembleMessage(string $line, string $header): string { $chunkSize = static::DATAGRAM_MAX_LENGTH - strlen($header); return $header . Utils::substr($line, 0, $chunkSize); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use DateTimeInterface; use Monolog\Handler\SyslogUdp\UdpSocket; use Monolog\Level; use Monolog\LogRecord; use Monolog\Utils; /** * A Handler for logging to a remote syslogd server. * * @author Jesper Skovgaard Nielsen * @author Dominik Kukacka */ class SyslogUdpHandler extends AbstractSyslogHandler { const RFC3164 = 0; const RFC5424 = 1; const RFC5424e = 2; /** @var array */ private array $dateFormats = [ self::RFC3164 => 'M d H:i:s', self::RFC5424 => \DateTime::RFC3339, self::RFC5424e => \DateTime::RFC3339_EXTENDED, ]; protected UdpSocket $socket; protected string $ident; /** @var self::RFC* */ protected int $rfc; /** * @param string $host Either IP/hostname or a path to a unix socket (port must be 0 then) * @param int $port Port number, or 0 if $host is a unix socket * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param string $ident Program name or tag for each log message. * @param int $rfc RFC to format the message for. * @throws MissingExtensionException when there is no socket extension * * @phpstan-param self::RFC* $rfc */ public function __construct(string $host, int $port = 514, string|int $facility = LOG_USER, int|string|Level $level = Level::Debug, bool $bubble = true, string $ident = 'php', int $rfc = self::RFC5424) { if (!extension_loaded('sockets')) { throw new MissingExtensionException('The sockets extension is required to use the SyslogUdpHandler'); } parent::__construct($facility, $level, $bubble); $this->ident = $ident; $this->rfc = $rfc; $this->socket = new UdpSocket($host, $port); } protected function write(LogRecord $record): void { $lines = $this->splitMessageIntoLines($record->formatted); $header = $this->makeCommonSyslogHeader($this->toSyslogPriority($record->level), $record->datetime); foreach ($lines as $line) { $this->socket->write($line, $header); } } public function close(): void { $this->socket->close(); } /** * @param string|string[] $message * @return string[] */ private function splitMessageIntoLines($message): array { if (is_array($message)) { $message = implode("\n", $message); } $lines = preg_split('/$\R?^/m', (string) $message, -1, PREG_SPLIT_NO_EMPTY); if (false === $lines) { $pcreErrorCode = preg_last_error(); throw new \RuntimeException('Could not preg_split: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); } return $lines; } /** * Make common syslog header (see rfc5424 or rfc3164) */ protected function makeCommonSyslogHeader(int $severity, DateTimeInterface $datetime): string { $priority = $severity + $this->facility; $pid = getmypid(); if (false === $pid) { $pid = '-'; } $hostname = gethostname(); if (false === $hostname) { $hostname = '-'; } if ($this->rfc === self::RFC3164) { // see https://github.com/phpstan/phpstan/issues/5348 // @phpstan-ignore-next-line $dateNew = $datetime->setTimezone(new \DateTimeZone('UTC')); $date = $dateNew->format($this->dateFormats[$this->rfc]); return "<$priority>" . $date . " " . $hostname . " " . $this->ident . "[" . $pid . "]: "; } $date = $datetime->format($this->dateFormats[$this->rfc]); return "<$priority>1 " . $date . " " . $hostname . " " . $this->ident . " " . $pid . " - - "; } /** * Inject your own socket, mainly used for testing * * @return $this */ public function setSocket(UdpSocket $socket): self { $this->socket = $socket; return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use RuntimeException; use Monolog\Level; use Monolog\Utils; use Monolog\LogRecord; /** * Handler sends logs to Telegram using Telegram Bot API. * * How to use: * 1) Create a Telegram bot with https://telegram.me/BotFather; * 2) Create a Telegram channel or a group where logs will be recorded; * 3) Add the created bot from step 1 to the created channel/group from step 2. * * In order to create an instance of TelegramBotHandler use * 1. The Telegram bot API key from step 1 * 2. The channel name with the `@` prefix if you created a public channel (e.g. `@my_public_channel`), * or the channel ID with the `-100` prefix if you created a private channel (e.g. `-1001234567890`), * or the group ID from step 2 (e.g. `-1234567890`). * * @link https://core.telegram.org/bots/api * * @author Mazur Alexandr */ class TelegramBotHandler extends AbstractProcessingHandler { private const BOT_API = 'https://api.telegram.org/bot'; /** * The available values of parseMode according to the Telegram api documentation */ private const AVAILABLE_PARSE_MODES = [ 'HTML', 'MarkdownV2', 'Markdown', // legacy mode without underline and strikethrough, use MarkdownV2 instead ]; /** * The maximum number of characters allowed in a message according to the Telegram api documentation */ private const MAX_MESSAGE_LENGTH = 4096; /** * Telegram bot access token provided by BotFather. * Create telegram bot with https://telegram.me/BotFather and use access token from it. */ private string $apiKey; /** * Telegram channel name. * Since to start with '@' symbol as prefix. */ private string $channel; /** * The kind of formatting that is used for the message. * See available options at https://core.telegram.org/bots/api#formatting-options * or in AVAILABLE_PARSE_MODES */ private string|null $parseMode; /** * Disables link previews for links in the message. */ private bool|null $disableWebPagePreview; /** * Sends the message silently. Users will receive a notification with no sound. */ private bool|null $disableNotification; /** * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages. * False - truncates a message that is too long. */ private bool $splitLongMessages; /** * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests). */ private bool $delayBetweenMessages; /** * Telegram message thread id, unique identifier for the target message thread (topic) of the forum; for forum supergroups only * See how to get the `message_thread_id` https://stackoverflow.com/a/75178418 */ private int|null $topic; /** * @param string $apiKey Telegram bot access token provided by BotFather * @param string $channel Telegram channel name * @param bool $splitLongMessages Split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages * @param bool $delayBetweenMessages Adds delay between sending a split message according to Telegram API * @param int $topic Telegram message thread id, unique identifier for the target message thread (topic) of the forum * @throws MissingExtensionException If the curl extension is missing */ public function __construct( string $apiKey, string $channel, $level = Level::Debug, bool $bubble = true, ?string $parseMode = null, ?bool $disableWebPagePreview = null, ?bool $disableNotification = null, bool $splitLongMessages = false, bool $delayBetweenMessages = false, int $topic = null ) { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the TelegramBotHandler'); } parent::__construct($level, $bubble); $this->apiKey = $apiKey; $this->channel = $channel; $this->setParseMode($parseMode); $this->disableWebPagePreview($disableWebPagePreview); $this->disableNotification($disableNotification); $this->splitLongMessages($splitLongMessages); $this->delayBetweenMessages($delayBetweenMessages); $this->setTopic($topic); } /** * @return $this */ public function setParseMode(string|null $parseMode = null): self { if ($parseMode !== null && !in_array($parseMode, self::AVAILABLE_PARSE_MODES, true)) { throw new \InvalidArgumentException('Unknown parseMode, use one of these: ' . implode(', ', self::AVAILABLE_PARSE_MODES) . '.'); } $this->parseMode = $parseMode; return $this; } /** * @return $this */ public function disableWebPagePreview(bool|null $disableWebPagePreview = null): self { $this->disableWebPagePreview = $disableWebPagePreview; return $this; } /** * @return $this */ public function disableNotification(bool|null $disableNotification = null): self { $this->disableNotification = $disableNotification; return $this; } /** * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages. * False - truncates a message that is too long. * * @return $this */ public function splitLongMessages(bool $splitLongMessages = false): self { $this->splitLongMessages = $splitLongMessages; return $this; } /** * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests). * * @return $this */ public function delayBetweenMessages(bool $delayBetweenMessages = false): self { $this->delayBetweenMessages = $delayBetweenMessages; return $this; } /** * @return $this */ public function setTopic(int $topic = null): self { $this->topic = $topic; return $this; } /** * @inheritDoc */ public function handleBatch(array $records): void { $messages = []; foreach ($records as $record) { if (!$this->isHandling($record)) { continue; } if (\count($this->processors) > 0) { $record = $this->processRecord($record); } $messages[] = $record; } if (\count($messages) > 0) { $this->send((string) $this->getFormatter()->formatBatch($messages)); } } /** * @inheritDoc */ protected function write(LogRecord $record): void { $this->send($record->formatted); } /** * Send request to @link https://api.telegram.org/bot on SendMessage action. */ protected function send(string $message): void { $messages = $this->handleMessageLength($message); foreach ($messages as $key => $msg) { if ($this->delayBetweenMessages && $key > 0) { sleep(1); } $this->sendCurl($msg); } } protected function sendCurl(string $message): void { $ch = curl_init(); $url = self::BOT_API . $this->apiKey . '/SendMessage'; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); $params = [ 'text' => $message, 'chat_id' => $this->channel, 'parse_mode' => $this->parseMode, 'disable_web_page_preview' => $this->disableWebPagePreview, 'disable_notification' => $this->disableNotification, ]; if ($this->topic !== null) { $params['message_thread_id'] = $this->topic; } curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); $result = Curl\Util::execute($ch); if (!is_string($result)) { throw new RuntimeException('Telegram API error. Description: No response'); } $result = json_decode($result, true); if ($result['ok'] === false) { throw new RuntimeException('Telegram API error. Description: ' . $result['description']); } } /** * Handle a message that is too long: truncates or splits into several * @return string[] */ private function handleMessageLength(string $message): array { $truncatedMarker = ' (...truncated)'; if (!$this->splitLongMessages && strlen($message) > self::MAX_MESSAGE_LENGTH) { return [Utils::substr($message, 0, self::MAX_MESSAGE_LENGTH - strlen($truncatedMarker)) . $truncatedMarker]; } return str_split($message, self::MAX_MESSAGE_LENGTH); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Level; use Monolog\Logger; use Psr\Log\LogLevel; use Monolog\LogRecord; /** * Used for testing purposes. * * It records all records and gives you access to them for verification. * * @author Jordi Boggiano * * @method bool hasEmergency(string|array $recordAssertions) * @method bool hasAlert(string|array $recordAssertions) * @method bool hasCritical(string|array $recordAssertions) * @method bool hasError(string|array $recordAssertions) * @method bool hasWarning(string|array $recordAssertions) * @method bool hasNotice(string|array $recordAssertions) * @method bool hasInfo(string|array $recordAssertions) * @method bool hasDebug(string|array $recordAssertions) * * @method bool hasEmergencyRecords() * @method bool hasAlertRecords() * @method bool hasCriticalRecords() * @method bool hasErrorRecords() * @method bool hasWarningRecords() * @method bool hasNoticeRecords() * @method bool hasInfoRecords() * @method bool hasDebugRecords() * * @method bool hasEmergencyThatContains(string $message) * @method bool hasAlertThatContains(string $message) * @method bool hasCriticalThatContains(string $message) * @method bool hasErrorThatContains(string $message) * @method bool hasWarningThatContains(string $message) * @method bool hasNoticeThatContains(string $message) * @method bool hasInfoThatContains(string $message) * @method bool hasDebugThatContains(string $message) * * @method bool hasEmergencyThatMatches(string $regex) * @method bool hasAlertThatMatches(string $regex) * @method bool hasCriticalThatMatches(string $regex) * @method bool hasErrorThatMatches(string $regex) * @method bool hasWarningThatMatches(string $regex) * @method bool hasNoticeThatMatches(string $regex) * @method bool hasInfoThatMatches(string $regex) * @method bool hasDebugThatMatches(string $regex) * * @method bool hasEmergencyThatPasses(callable $predicate) * @method bool hasAlertThatPasses(callable $predicate) * @method bool hasCriticalThatPasses(callable $predicate) * @method bool hasErrorThatPasses(callable $predicate) * @method bool hasWarningThatPasses(callable $predicate) * @method bool hasNoticeThatPasses(callable $predicate) * @method bool hasInfoThatPasses(callable $predicate) * @method bool hasDebugThatPasses(callable $predicate) */ class TestHandler extends AbstractProcessingHandler { /** @var LogRecord[] */ protected array $records = []; /** @phpstan-var array, LogRecord[]> */ protected array $recordsByLevel = []; private bool $skipReset = false; /** * @return array */ public function getRecords(): array { return $this->records; } public function clear(): void { $this->records = []; $this->recordsByLevel = []; } public function reset(): void { if (!$this->skipReset) { $this->clear(); } } public function setSkipReset(bool $skipReset): void { $this->skipReset = $skipReset; } /** * @param int|string|Level|LogLevel::* $level Logging level value or name * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ public function hasRecords(int|string|Level $level): bool { return isset($this->recordsByLevel[Logger::toMonologLevel($level)->value]); } /** * @param string|array $recordAssertions Either a message string or an array containing message and optionally context keys that will be checked against all records * * @phpstan-param array{message: string, context?: mixed[]}|string $recordAssertions */ public function hasRecord(string|array $recordAssertions, Level $level): bool { if (is_string($recordAssertions)) { $recordAssertions = ['message' => $recordAssertions]; } return $this->hasRecordThatPasses(function (LogRecord $rec) use ($recordAssertions) { if ($rec->message !== $recordAssertions['message']) { return false; } if (isset($recordAssertions['context']) && $rec->context !== $recordAssertions['context']) { return false; } return true; }, $level); } public function hasRecordThatContains(string $message, Level $level): bool { return $this->hasRecordThatPasses(fn (LogRecord $rec) => str_contains($rec->message, $message), $level); } public function hasRecordThatMatches(string $regex, Level $level): bool { return $this->hasRecordThatPasses(fn (LogRecord $rec) => preg_match($regex, $rec->message) > 0, $level); } /** * @phpstan-param callable(LogRecord, int): mixed $predicate */ public function hasRecordThatPasses(callable $predicate, Level $level): bool { $level = Logger::toMonologLevel($level); if (!isset($this->recordsByLevel[$level->value])) { return false; } foreach ($this->recordsByLevel[$level->value] as $i => $rec) { if ((bool) $predicate($rec, $i)) { return true; } } return false; } /** * @inheritDoc */ protected function write(LogRecord $record): void { $this->recordsByLevel[$record->level->value][] = $record; $this->records[] = $record; } /** * @param mixed[] $args */ public function __call(string $method, array $args): bool { if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; $level = constant(Level::class.'::' . $matches[2]); $callback = [$this, $genericMethod]; if (is_callable($callback)) { $args[] = $level; return call_user_func_array($callback, $args); } } throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; trait WebRequestRecognizerTrait { /** * Checks if PHP's serving a web request */ protected function isWebRequest(): bool { return 'cli' !== \PHP_SAPI && 'phpdbg' !== \PHP_SAPI; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\LogRecord; use Throwable; /** * Forwards records to multiple handlers suppressing failures of each handler * and continuing through to give every handler a chance to succeed. * * @author Craig D'Amelio */ class WhatFailureGroupHandler extends GroupHandler { /** * @inheritDoc */ public function handle(LogRecord $record): bool { if (\count($this->processors) > 0) { $record = $this->processRecord($record); } foreach ($this->handlers as $handler) { try { $handler->handle(clone $record); } catch (Throwable) { // What failure? } } return false === $this->bubble; } /** * @inheritDoc */ public function handleBatch(array $records): void { if (\count($this->processors) > 0) { $processed = []; foreach ($records as $record) { $processed[] = $this->processRecord($record); } $records = $processed; } foreach ($this->handlers as $handler) { try { $handler->handleBatch(array_map(fn ($record) => clone $record, $records)); } catch (Throwable) { // What failure? } } } /** * {@inheritDoc} */ public function close(): void { foreach ($this->handlers as $handler) { try { $handler->close(); } catch (\Throwable $e) { // What failure? } } } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\NormalizerFormatter; use Monolog\Level; use Monolog\LogRecord; /** * Handler sending logs to Zend Monitor * * @author Christian Bergau * @author Jason Davis */ class ZendMonitorHandler extends AbstractProcessingHandler { /** * @throws MissingExtensionException */ public function __construct(int|string|Level $level = Level::Debug, bool $bubble = true) { if (!function_exists('zend_monitor_custom_event')) { throw new MissingExtensionException( 'You must have Zend Server installed with Zend Monitor enabled in order to use this handler' ); } parent::__construct($level, $bubble); } /** * Translates Monolog log levels to ZendMonitor levels. */ protected function toZendMonitorLevel(Level $level): int { return match ($level) { Level::Debug => \ZEND_MONITOR_EVENT_SEVERITY_INFO, Level::Info => \ZEND_MONITOR_EVENT_SEVERITY_INFO, Level::Notice => \ZEND_MONITOR_EVENT_SEVERITY_INFO, Level::Warning => \ZEND_MONITOR_EVENT_SEVERITY_WARNING, Level::Error => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, Level::Critical => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, Level::Alert => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, Level::Emergency => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, }; } /** * @inheritDoc */ protected function write(LogRecord $record): void { $this->writeZendMonitorCustomEvent( $record->level->getName(), $record->message, $record->formatted, $this->toZendMonitorLevel($record->level) ); } /** * Write to Zend Monitor Events * @param string $type Text displayed in "Class Name (custom)" field * @param string $message Text displayed in "Error String" * @param array $formatted Displayed in Custom Variables tab * @param int $severity Set the event severity level (-1,0,1) */ protected function writeZendMonitorCustomEvent(string $type, string $message, array $formatted, int $severity): void { zend_monitor_custom_event($type, $message, $formatted, $severity); } /** * @inheritDoc */ public function getDefaultFormatter(): FormatterInterface { return new NormalizerFormatter(); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Level.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use Psr\Log\LogLevel; /** * Represents the log levels * * Monolog supports the logging levels described by RFC 5424 {@see https://datatracker.ietf.org/doc/html/rfc5424} * but due to BC the severity values used internally are not 0-7. * * To get the level name/value out of a Level there are several options: * * - Use ->getName() to get the standard Monolog name which is full uppercased (e.g. "DEBUG") * - Use ->toPsrLogLevel() to get the standard PSR-3 name which is full lowercased (e.g. "debug") * - Use ->toRFC5424Level() to get the standard RFC 5424 value (e.g. 7 for debug, 0 for emergency) * - Use ->name to get the enum case's name which is capitalized (e.g. "Debug") * * To get the internal value for filtering, if the includes/isLowerThan/isHigherThan methods are * not enough, you can use ->value to get the enum case's integer value. */ enum Level: int { /** * Detailed debug information */ case Debug = 100; /** * Interesting events * * Examples: User logs in, SQL logs. */ case Info = 200; /** * Uncommon events */ case Notice = 250; /** * Exceptional occurrences that are not errors * * Examples: Use of deprecated APIs, poor use of an API, * undesirable things that are not necessarily wrong. */ case Warning = 300; /** * Runtime errors */ case Error = 400; /** * Critical conditions * * Example: Application component unavailable, unexpected exception. */ case Critical = 500; /** * Action must be taken immediately * * Example: Entire website down, database unavailable, etc. * This should trigger the SMS alerts and wake you up. */ case Alert = 550; /** * Urgent alert. */ case Emergency = 600; /** * @param value-of|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name * @return static */ public static function fromName(string $name): self { return match ($name) { 'debug', 'Debug', 'DEBUG' => self::Debug, 'info', 'Info', 'INFO' => self::Info, 'notice', 'Notice', 'NOTICE' => self::Notice, 'warning', 'Warning', 'WARNING' => self::Warning, 'error', 'Error', 'ERROR' => self::Error, 'critical', 'Critical', 'CRITICAL' => self::Critical, 'alert', 'Alert', 'ALERT' => self::Alert, 'emergency', 'Emergency', 'EMERGENCY' => self::Emergency, }; } /** * @param value-of $value * @return static */ public static function fromValue(int $value): self { return self::from($value); } /** * Returns true if the passed $level is higher or equal to $this */ public function includes(Level $level): bool { return $this->value <= $level->value; } public function isHigherThan(Level $level): bool { return $this->value > $level->value; } public function isLowerThan(Level $level): bool { return $this->value < $level->value; } /** * Returns the monolog standardized all-capitals name of the level * * Use this instead of $level->name which returns the enum case name (e.g. Debug vs DEBUG if you use getName()) * * @return value-of */ public function getName(): string { return match ($this) { self::Debug => 'DEBUG', self::Info => 'INFO', self::Notice => 'NOTICE', self::Warning => 'WARNING', self::Error => 'ERROR', self::Critical => 'CRITICAL', self::Alert => 'ALERT', self::Emergency => 'EMERGENCY', }; } /** * Returns the PSR-3 level matching this instance * * @phpstan-return \Psr\Log\LogLevel::* */ public function toPsrLogLevel(): string { return match ($this) { self::Debug => LogLevel::DEBUG, self::Info => LogLevel::INFO, self::Notice => LogLevel::NOTICE, self::Warning => LogLevel::WARNING, self::Error => LogLevel::ERROR, self::Critical => LogLevel::CRITICAL, self::Alert => LogLevel::ALERT, self::Emergency => LogLevel::EMERGENCY, }; } /** * Returns the RFC 5424 level matching this instance * * @phpstan-return int<0, 7> */ public function toRFC5424Level(): int { return match ($this) { self::Debug => 7, self::Info => 6, self::Notice => 5, self::Warning => 4, self::Error => 3, self::Critical => 2, self::Alert => 1, self::Emergency => 0, }; } public const VALUES = [ 100, 200, 250, 300, 400, 500, 550, 600, ]; public const NAMES = [ 'DEBUG', 'INFO', 'NOTICE', 'WARNING', 'ERROR', 'CRITICAL', 'ALERT', 'EMERGENCY', ]; } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/LogRecord.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use ArrayAccess; /** * Monolog log record * * @author Jordi Boggiano * @template-implements ArrayAccess<'message'|'level'|'context'|'level_name'|'channel'|'datetime'|'extra', int|string|\DateTimeImmutable|array> */ class LogRecord implements ArrayAccess { private const MODIFIABLE_FIELDS = [ 'extra' => true, 'formatted' => true, ]; public function __construct( public readonly \DateTimeImmutable $datetime, public readonly string $channel, public readonly Level $level, public readonly string $message, /** @var array */ public readonly array $context = [], /** @var array */ public array $extra = [], public mixed $formatted = null, ) { } public function offsetSet(mixed $offset, mixed $value): void { if ($offset === 'extra') { if (!is_array($value)) { throw new \InvalidArgumentException('extra must be an array'); } $this->extra = $value; return; } if ($offset === 'formatted') { $this->formatted = $value; return; } throw new \LogicException('Unsupported operation: setting '.$offset); } public function offsetExists(mixed $offset): bool { if ($offset === 'level_name') { return true; } return isset($this->{$offset}); } public function offsetUnset(mixed $offset): void { throw new \LogicException('Unsupported operation'); } public function &offsetGet(mixed $offset): mixed { if ($offset === 'level_name' || $offset === 'level') { // avoid returning readonly props by ref as this is illegal if ($offset === 'level_name') { $copy = $this->level->getName(); } else { $copy = $this->level->value; } return $copy; } if (isset(self::MODIFIABLE_FIELDS[$offset])) { return $this->{$offset}; } // avoid returning readonly props by ref as this is illegal $copy = $this->{$offset}; return $copy; } /** * @phpstan-return array{message: string, context: mixed[], level: value-of, level_name: value-of, channel: string, datetime: \DateTimeImmutable, extra: mixed[]} */ public function toArray(): array { return [ 'message' => $this->message, 'context' => $this->context, 'level' => $this->level->value, 'level_name' => $this->level->getName(), 'channel' => $this->channel, 'datetime' => $this->datetime, 'extra' => $this->extra, ]; } public function with(mixed ...$args): self { foreach (['message', 'context', 'level', 'channel', 'datetime', 'extra'] as $prop) { $args[$prop] ??= $this->{$prop}; } return new self(...$args); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Logger.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use Closure; use DateTimeZone; use Fiber; use Monolog\Handler\HandlerInterface; use Monolog\Processor\ProcessorInterface; use Psr\Log\LoggerInterface; use Psr\Log\InvalidArgumentException; use Psr\Log\LogLevel; use Throwable; use Stringable; use WeakMap; /** * Monolog log channel * * It contains a stack of Handlers and a stack of Processors, * and uses them to store records that are added to it. * * @author Jordi Boggiano * @final */ class Logger implements LoggerInterface, ResettableInterface { /** * Detailed debug information * * @deprecated Use \Monolog\Level::Debug */ public const DEBUG = 100; /** * Interesting events * * Examples: User logs in, SQL logs. * * @deprecated Use \Monolog\Level::Info */ public const INFO = 200; /** * Uncommon events * * @deprecated Use \Monolog\Level::Notice */ public const NOTICE = 250; /** * Exceptional occurrences that are not errors * * Examples: Use of deprecated APIs, poor use of an API, * undesirable things that are not necessarily wrong. * * @deprecated Use \Monolog\Level::Warning */ public const WARNING = 300; /** * Runtime errors * * @deprecated Use \Monolog\Level::Error */ public const ERROR = 400; /** * Critical conditions * * Example: Application component unavailable, unexpected exception. * * @deprecated Use \Monolog\Level::Critical */ public const CRITICAL = 500; /** * Action must be taken immediately * * Example: Entire website down, database unavailable, etc. * This should trigger the SMS alerts and wake you up. * * @deprecated Use \Monolog\Level::Alert */ public const ALERT = 550; /** * Urgent alert. * * @deprecated Use \Monolog\Level::Emergency */ public const EMERGENCY = 600; /** * Monolog API version * * This is only bumped when API breaks are done and should * follow the major version of the library */ public const API = 3; /** * Mapping between levels numbers defined in RFC 5424 and Monolog ones * * @phpstan-var array $rfc_5424_levels */ private const RFC_5424_LEVELS = [ 7 => Level::Debug, 6 => Level::Info, 5 => Level::Notice, 4 => Level::Warning, 3 => Level::Error, 2 => Level::Critical, 1 => Level::Alert, 0 => Level::Emergency, ]; protected string $name; /** * The handler stack * * @var list */ protected array $handlers; /** * Processors that will process all log records * * To process records of a single handler instead, add the processor on that specific handler * * @var array<(callable(LogRecord): LogRecord)|ProcessorInterface> */ protected array $processors; protected bool $microsecondTimestamps = true; protected DateTimeZone $timezone; protected Closure|null $exceptionHandler = null; /** * Keeps track of depth to prevent infinite logging loops */ private int $logDepth = 0; /** * @var WeakMap, int> Keeps track of depth inside fibers to prevent infinite logging loops */ private WeakMap $fiberLogDepth; /** * Whether to detect infinite logging loops * This can be disabled via {@see useLoggingLoopDetection} if you have async handlers that do not play well with this */ private bool $detectCycles = true; /** * @param string $name The logging channel, a simple descriptive name that is attached to all log records * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. * @param callable[] $processors Optional array of processors * @param DateTimeZone|null $timezone Optional timezone, if not provided date_default_timezone_get() will be used * * @phpstan-param array<(callable(LogRecord): LogRecord)|ProcessorInterface> $processors */ public function __construct(string $name, array $handlers = [], array $processors = [], DateTimeZone|null $timezone = null) { $this->name = $name; $this->setHandlers($handlers); $this->processors = $processors; $this->timezone = $timezone ?? new DateTimeZone(date_default_timezone_get()); $this->fiberLogDepth = new \WeakMap(); } public function getName(): string { return $this->name; } /** * Return a new cloned instance with the name changed * * @return static */ public function withName(string $name): self { $new = clone $this; $new->name = $name; return $new; } /** * Pushes a handler on to the stack. * * @return $this */ public function pushHandler(HandlerInterface $handler): self { array_unshift($this->handlers, $handler); return $this; } /** * Pops a handler from the stack * * @throws \LogicException If empty handler stack */ public function popHandler(): HandlerInterface { if (0 === \count($this->handlers)) { throw new \LogicException('You tried to pop from an empty handler stack.'); } return array_shift($this->handlers); } /** * Set handlers, replacing all existing ones. * * If a map is passed, keys will be ignored. * * @param list $handlers * @return $this */ public function setHandlers(array $handlers): self { $this->handlers = []; foreach (array_reverse($handlers) as $handler) { $this->pushHandler($handler); } return $this; } /** * @return list */ public function getHandlers(): array { return $this->handlers; } /** * Adds a processor on to the stack. * * @phpstan-param ProcessorInterface|(callable(LogRecord): LogRecord) $callback * @return $this */ public function pushProcessor(ProcessorInterface|callable $callback): self { array_unshift($this->processors, $callback); return $this; } /** * Removes the processor on top of the stack and returns it. * * @phpstan-return ProcessorInterface|(callable(LogRecord): LogRecord) * @throws \LogicException If empty processor stack */ public function popProcessor(): callable { if (0 === \count($this->processors)) { throw new \LogicException('You tried to pop from an empty processor stack.'); } return array_shift($this->processors); } /** * @return callable[] * @phpstan-return array */ public function getProcessors(): array { return $this->processors; } /** * Control the use of microsecond resolution timestamps in the 'datetime' * member of new records. * * As of PHP7.1 microseconds are always included by the engine, so * there is no performance penalty and Monolog 2 enabled microseconds * by default. This function lets you disable them though in case you want * to suppress microseconds from the output. * * @param bool $micro True to use microtime() to create timestamps * @return $this */ public function useMicrosecondTimestamps(bool $micro): self { $this->microsecondTimestamps = $micro; return $this; } /** * @return $this */ public function useLoggingLoopDetection(bool $detectCycles): self { $this->detectCycles = $detectCycles; return $this; } /** * Adds a log record. * * @param int $level The logging level (a Monolog or RFC 5424 level) * @param string $message The log message * @param mixed[] $context The log context * @param DateTimeImmutable|null $datetime Optional log date to log into the past or future * @return bool Whether the record has been processed * * @phpstan-param value-of|Level $level */ public function addRecord(int|Level $level, string $message, array $context = [], DateTimeImmutable|null $datetime = null): bool { if (is_int($level) && isset(self::RFC_5424_LEVELS[$level])) { $level = self::RFC_5424_LEVELS[$level]; } if ($this->detectCycles) { if (null !== ($fiber = Fiber::getCurrent())) { $logDepth = $this->fiberLogDepth[$fiber] = ($this->fiberLogDepth[$fiber] ?? 0) + 1; } else { $logDepth = ++$this->logDepth; } } else { $logDepth = 0; } if ($logDepth === 3) { $this->warning('A possible infinite logging loop was detected and aborted. It appears some of your handler code is triggering logging, see the previous log record for a hint as to what may be the cause.'); return false; } elseif ($logDepth >= 5) { // log depth 4 is let through, so we can log the warning above return false; } try { $recordInitialized = count($this->processors) === 0; $record = new LogRecord( datetime: $datetime ?? new DateTimeImmutable($this->microsecondTimestamps, $this->timezone), channel: $this->name, level: self::toMonologLevel($level), message: $message, context: $context, extra: [], ); $handled = false; foreach ($this->handlers as $handler) { if (false === $recordInitialized) { // skip initializing the record as long as no handler is going to handle it if (!$handler->isHandling($record)) { continue; } try { foreach ($this->processors as $processor) { $record = $processor($record); } $recordInitialized = true; } catch (Throwable $e) { $this->handleException($e, $record); return true; } } // once the record is initialized, send it to all handlers as long as the bubbling chain is not interrupted try { $handled = true; if (true === $handler->handle(clone $record)) { break; } } catch (Throwable $e) { $this->handleException($e, $record); return true; } } return $handled; } finally { if ($this->detectCycles) { if (isset($fiber)) { $this->fiberLogDepth[$fiber]--; } else { $this->logDepth--; } } } } /** * Ends a log cycle and frees all resources used by handlers. * * Closing a Handler means flushing all buffers and freeing any open resources/handles. * Handlers that have been closed should be able to accept log records again and re-open * themselves on demand, but this may not always be possible depending on implementation. * * This is useful at the end of a request and will be called automatically on every handler * when they get destructed. */ public function close(): void { foreach ($this->handlers as $handler) { $handler->close(); } } /** * Ends a log cycle and resets all handlers and processors to their initial state. * * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal * state, and getting it back to a state in which it can receive log records again. * * This is useful in case you want to avoid logs leaking between two requests or jobs when you * have a long running process like a worker or an application server serving multiple requests * in one process. */ public function reset(): void { foreach ($this->handlers as $handler) { if ($handler instanceof ResettableInterface) { $handler->reset(); } } foreach ($this->processors as $processor) { if ($processor instanceof ResettableInterface) { $processor->reset(); } } } /** * Gets the name of the logging level as a string. * * This still returns a string instead of a Level for BC, but new code should not rely on this method. * * @throws \Psr\Log\InvalidArgumentException If level is not defined * * @phpstan-param value-of|Level $level * @phpstan-return value-of * * @deprecated Since 3.0, use {@see toMonologLevel} or {@see \Monolog\Level->getName()} instead */ public static function getLevelName(int|Level $level): string { return self::toMonologLevel($level)->getName(); } /** * Converts PSR-3 levels to Monolog ones if necessary * * @param int|string|Level|LogLevel::* $level Level number (monolog) or name (PSR-3) * @throws \Psr\Log\InvalidArgumentException If level is not defined * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ public static function toMonologLevel(string|int|Level $level): Level { if ($level instanceof Level) { return $level; } if (\is_string($level)) { if (\is_numeric($level)) { $levelEnum = Level::tryFrom((int) $level); if ($levelEnum === null) { throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', Level::NAMES + Level::VALUES)); } return $levelEnum; } // Contains first char of all log levels and avoids using strtoupper() which may have // strange results depending on locale (for example, "i" will become "İ" in Turkish locale) $upper = strtr(substr($level, 0, 1), 'dinweca', 'DINWECA') . strtolower(substr($level, 1)); if (defined(Level::class.'::'.$upper)) { return constant(Level::class . '::' . $upper); } throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', Level::NAMES + Level::VALUES)); } $levelEnum = Level::tryFrom($level); if ($levelEnum === null) { throw new InvalidArgumentException('Level "'.var_export($level, true).'" is not defined, use one of: '.implode(', ', Level::NAMES + Level::VALUES)); } return $levelEnum; } /** * Checks whether the Logger has a handler that listens on the given level * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ public function isHandling(int|string|Level $level): bool { $record = new LogRecord( datetime: new DateTimeImmutable($this->microsecondTimestamps, $this->timezone), channel: $this->name, message: '', level: self::toMonologLevel($level), ); foreach ($this->handlers as $handler) { if ($handler->isHandling($record)) { return true; } } return false; } /** * Set a custom exception handler that will be called if adding a new record fails * * The Closure will receive an exception object and the record that failed to be logged * * @return $this */ public function setExceptionHandler(Closure|null $callback): self { $this->exceptionHandler = $callback; return $this; } public function getExceptionHandler(): Closure|null { return $this->exceptionHandler; } /** * Adds a log record at an arbitrary level. * * This method allows for compatibility with common interfaces. * * @param mixed $level The log level (a Monolog, PSR-3 or RFC 5424 level) * @param string|Stringable $message The log message * @param mixed[] $context The log context * * @phpstan-param Level|LogLevel::* $level */ public function log($level, string|\Stringable $message, array $context = []): void { if (!$level instanceof Level) { if (!is_string($level) && !is_int($level)) { throw new \InvalidArgumentException('$level is expected to be a string, int or '.Level::class.' instance'); } if (isset(self::RFC_5424_LEVELS[$level])) { $level = self::RFC_5424_LEVELS[$level]; } $level = static::toMonologLevel($level); } $this->addRecord($level, (string) $message, $context); } /** * Adds a log record at the DEBUG level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function debug(string|\Stringable $message, array $context = []): void { $this->addRecord(Level::Debug, (string) $message, $context); } /** * Adds a log record at the INFO level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function info(string|\Stringable $message, array $context = []): void { $this->addRecord(Level::Info, (string) $message, $context); } /** * Adds a log record at the NOTICE level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function notice(string|\Stringable $message, array $context = []): void { $this->addRecord(Level::Notice, (string) $message, $context); } /** * Adds a log record at the WARNING level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function warning(string|\Stringable $message, array $context = []): void { $this->addRecord(Level::Warning, (string) $message, $context); } /** * Adds a log record at the ERROR level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function error(string|\Stringable $message, array $context = []): void { $this->addRecord(Level::Error, (string) $message, $context); } /** * Adds a log record at the CRITICAL level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function critical(string|\Stringable $message, array $context = []): void { $this->addRecord(Level::Critical, (string) $message, $context); } /** * Adds a log record at the ALERT level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function alert(string|\Stringable $message, array $context = []): void { $this->addRecord(Level::Alert, (string) $message, $context); } /** * Adds a log record at the EMERGENCY level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function emergency(string|\Stringable $message, array $context = []): void { $this->addRecord(Level::Emergency, (string) $message, $context); } /** * Sets the timezone to be used for the timestamp of log records. * * @return $this */ public function setTimezone(DateTimeZone $tz): self { $this->timezone = $tz; return $this; } /** * Returns the timezone to be used for the timestamp of log records. */ public function getTimezone(): DateTimeZone { return $this->timezone; } /** * Delegates exception management to the custom exception handler, * or throws the exception if no custom handler is set. */ protected function handleException(Throwable $e, LogRecord $record): void { if (null === $this->exceptionHandler) { throw $e; } ($this->exceptionHandler)($e, $record); } /** * @return array */ public function __serialize(): array { return [ 'name' => $this->name, 'handlers' => $this->handlers, 'processors' => $this->processors, 'microsecondTimestamps' => $this->microsecondTimestamps, 'timezone' => $this->timezone, 'exceptionHandler' => $this->exceptionHandler, 'logDepth' => $this->logDepth, 'detectCycles' => $this->detectCycles, ]; } /** * @param array $data */ public function __unserialize(array $data): void { foreach (['name', 'handlers', 'processors', 'microsecondTimestamps', 'timezone', 'exceptionHandler', 'logDepth', 'detectCycles'] as $property) { if (isset($data[$property])) { $this->$property = $data[$property]; } } $this->fiberLogDepth = new \WeakMap(); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/ClosureContextProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\LogRecord; /** * Generates a context from a Closure if the Closure is the only value * in the context * * It helps reduce the performance impact of debug logs if they do * need to create lots of context information. If this processor is added * on the correct handler the context data will only be generated * when the logs are actually logged to that handler, which is useful when * using FingersCrossedHandler or other filtering handlers to conditionally * log records. */ class ClosureContextProcessor implements ProcessorInterface { public function __invoke(LogRecord $record): LogRecord { $context = $record->context; if (isset($context[0]) && 1 === \count($context) && $context[0] instanceof \Closure) { try { $context = $context[0](); } catch (\Throwable $e) { $context = [ 'error_on_context_generation' => $e->getMessage(), 'exception' => $e, ]; } if (!\is_array($context)) { $context = [$context]; } $record = $record->with(context: $context); } return $record; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Level; use Monolog\Logger; use Psr\Log\LogLevel; use Monolog\LogRecord; /** * Injects Git branch and Git commit SHA in all records * * @author Nick Otter * @author Jordi Boggiano */ class GitProcessor implements ProcessorInterface { private Level $level; /** @var array{branch: string, commit: string}|array|null */ private static $cache = null; /** * @param int|string|Level|LogLevel::* $level The minimum logging level at which this Processor will be triggered * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ public function __construct(int|string|Level $level = Level::Debug) { $this->level = Logger::toMonologLevel($level); } /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { // return if the level is not high enough if ($record->level->isLowerThan($this->level)) { return $record; } $record->extra['git'] = self::getGitInfo(); return $record; } /** * @return array{branch: string, commit: string}|array */ private static function getGitInfo(): array { if (self::$cache !== null) { return self::$cache; } $branches = shell_exec('git branch -v --no-abbrev'); if (is_string($branches) && 1 === preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { return self::$cache = [ 'branch' => $matches[1], 'commit' => $matches[2], ]; } return self::$cache = []; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\LogRecord; /** * Injects value of gethostname in all records */ class HostnameProcessor implements ProcessorInterface { private static string $host; public function __construct() { self::$host = (string) gethostname(); } /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { $record->extra['hostname'] = self::$host; return $record; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Level; use Monolog\Logger; use Psr\Log\LogLevel; use Monolog\LogRecord; /** * Injects line/file:class/function where the log message came from * * Warning: This only works if the handler processes the logs directly. * If you put the processor on a handler that is behind a FingersCrossedHandler * for example, the processor will only be called once the trigger level is reached, * and all the log records will have the same file/line/.. data from the call that * triggered the FingersCrossedHandler. * * @author Jordi Boggiano */ class IntrospectionProcessor implements ProcessorInterface { private Level $level; /** @var string[] */ private array $skipClassesPartials; private int $skipStackFramesCount; private const SKIP_FUNCTIONS = [ 'call_user_func', 'call_user_func_array', ]; /** * @param string|int|Level $level The minimum logging level at which this Processor will be triggered * @param string[] $skipClassesPartials * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ public function __construct(int|string|Level $level = Level::Debug, array $skipClassesPartials = [], int $skipStackFramesCount = 0) { $this->level = Logger::toMonologLevel($level); $this->skipClassesPartials = array_merge(['Monolog\\'], $skipClassesPartials); $this->skipStackFramesCount = $skipStackFramesCount; } /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { // return if the level is not high enough if ($record->level->isLowerThan($this->level)) { return $record; } $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); // skip first since it's always the current method array_shift($trace); // the call_user_func call is also skipped array_shift($trace); $i = 0; while ($this->isTraceClassOrSkippedFunction($trace, $i)) { if (isset($trace[$i]['class'])) { foreach ($this->skipClassesPartials as $part) { if (strpos($trace[$i]['class'], $part) !== false) { $i++; continue 2; } } } elseif (in_array($trace[$i]['function'], self::SKIP_FUNCTIONS, true)) { $i++; continue; } break; } $i += $this->skipStackFramesCount; // we should have the call source now $record->extra = array_merge( $record->extra, [ 'file' => $trace[$i - 1]['file'] ?? null, 'line' => $trace[$i - 1]['line'] ?? null, 'class' => $trace[$i]['class'] ?? null, 'callType' => $trace[$i]['type'] ?? null, 'function' => $trace[$i]['function'] ?? null, ] ); return $record; } /** * @param array $trace */ private function isTraceClassOrSkippedFunction(array $trace, int $index): bool { if (!isset($trace[$index])) { return false; } return isset($trace[$index]['class']) || in_array($trace[$index]['function'], self::SKIP_FUNCTIONS, true); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/LoadAverageProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\LogRecord; /** * Injects sys_getloadavg in all records @see https://www.php.net/manual/en/function.sys-getloadavg.php * * @author Johan Vlaar */ class LoadAverageProcessor implements ProcessorInterface { public const LOAD_1_MINUTE = 0; public const LOAD_5_MINUTE = 1; public const LOAD_15_MINUTE = 2; private const AVAILABLE_LOAD = [ self::LOAD_1_MINUTE, self::LOAD_5_MINUTE, self::LOAD_15_MINUTE, ]; /** * @var int */ protected $avgSystemLoad; /** * @param self::LOAD_* $avgSystemLoad */ public function __construct(int $avgSystemLoad = self::LOAD_1_MINUTE) { if (!in_array($avgSystemLoad, self::AVAILABLE_LOAD, true)) { throw new \InvalidArgumentException(sprintf('Invalid average system load: `%s`', $avgSystemLoad)); } $this->avgSystemLoad = $avgSystemLoad; } /** * {@inheritDoc} */ public function __invoke(LogRecord $record): LogRecord { if (!function_exists('sys_getloadavg')) { return $record; } $usage = sys_getloadavg(); if (false === $usage) { return $record; } $record->extra['load_average'] = $usage[$this->avgSystemLoad]; return $record; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\LogRecord; /** * Injects memory_get_peak_usage in all records * * @see Monolog\Processor\MemoryProcessor::__construct() for options * @author Rob Jensen */ class MemoryPeakUsageProcessor extends MemoryProcessor { /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { $usage = memory_get_peak_usage($this->realUsage); if ($this->useFormatting) { $usage = $this->formatBytes($usage); } $record->extra['memory_peak_usage'] = $usage; return $record; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Some methods that are common for all memory processors * * @author Rob Jensen */ abstract class MemoryProcessor implements ProcessorInterface { /** * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported. */ protected bool $realUsage; /** * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size) */ protected bool $useFormatting; /** * @param bool $realUsage Set this to true to get the real size of memory allocated from system. * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size) */ public function __construct(bool $realUsage = true, bool $useFormatting = true) { $this->realUsage = $realUsage; $this->useFormatting = $useFormatting; } /** * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is * * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as int */ protected function formatBytes(int $bytes) { if (!$this->useFormatting) { return $bytes; } if ($bytes > 1024 * 1024) { return round($bytes / 1024 / 1024, 2).' MB'; } elseif ($bytes > 1024) { return round($bytes / 1024, 2).' KB'; } return $bytes . ' B'; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\LogRecord; /** * Injects memory_get_usage in all records * * @see Monolog\Processor\MemoryProcessor::__construct() for options * @author Rob Jensen */ class MemoryUsageProcessor extends MemoryProcessor { /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { $usage = memory_get_usage($this->realUsage); if ($this->useFormatting) { $usage = $this->formatBytes($usage); } $record->extra['memory_usage'] = $usage; return $record; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Level; use Monolog\Logger; use Psr\Log\LogLevel; use Monolog\LogRecord; /** * Injects Hg branch and Hg revision number in all records * * @author Jonathan A. Schweder */ class MercurialProcessor implements ProcessorInterface { private Level $level; /** @var array{branch: string, revision: string}|array|null */ private static $cache = null; /** * @param int|string|Level $level The minimum logging level at which this Processor will be triggered * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ public function __construct(int|string|Level $level = Level::Debug) { $this->level = Logger::toMonologLevel($level); } /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { // return if the level is not high enough if ($record->level->isLowerThan($this->level)) { return $record; } $record->extra['hg'] = self::getMercurialInfo(); return $record; } /** * @return array{branch: string, revision: string}|array */ private static function getMercurialInfo(): array { if (self::$cache !== null) { return self::$cache; } $result = explode(' ', trim((string) shell_exec('hg id -nb'))); if (count($result) >= 3) { return self::$cache = [ 'branch' => $result[1], 'revision' => $result[2], ]; } return self::$cache = []; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\LogRecord; /** * Adds value of getmypid into records * * @author Andreas Hörnicke */ class ProcessIdProcessor implements ProcessorInterface { /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { $record->extra['process_id'] = getmypid(); return $record; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\LogRecord; /** * An optional interface to allow labelling Monolog processors. * * @author Nicolas Grekas */ interface ProcessorInterface { /** * @return LogRecord The processed record */ public function __invoke(LogRecord $record); } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Utils; use Monolog\LogRecord; /** * Processes a record's message according to PSR-3 rules * * It replaces {foo} with the value from $context['foo'] * * @author Jordi Boggiano */ class PsrLogMessageProcessor implements ProcessorInterface { public const SIMPLE_DATE = "Y-m-d\TH:i:s.uP"; private ?string $dateFormat; private bool $removeUsedContextFields; /** * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format * @param bool $removeUsedContextFields If set to true the fields interpolated into message gets unset */ public function __construct(?string $dateFormat = null, bool $removeUsedContextFields = false) { $this->dateFormat = $dateFormat; $this->removeUsedContextFields = $removeUsedContextFields; } /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { if (false === strpos($record->message, '{')) { return $record; } $replacements = []; $context = $record->context; foreach ($context as $key => $val) { $placeholder = '{' . $key . '}'; if (strpos($record->message, $placeholder) === false) { continue; } if (null === $val || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) { $replacements[$placeholder] = $val; } elseif ($val instanceof \DateTimeInterface) { if (null === $this->dateFormat && $val instanceof \Monolog\DateTimeImmutable) { // handle monolog dates using __toString if no specific dateFormat was asked for // so that it follows the useMicroseconds flag $replacements[$placeholder] = (string) $val; } else { $replacements[$placeholder] = $val->format($this->dateFormat ?? static::SIMPLE_DATE); } } elseif ($val instanceof \UnitEnum) { $replacements[$placeholder] = $val instanceof \BackedEnum ? $val->value : $val->name; } elseif (is_object($val)) { $replacements[$placeholder] = '[object '.Utils::getClass($val).']'; } elseif (is_array($val)) { $replacements[$placeholder] = 'array'.Utils::jsonEncode($val, null, true); } else { $replacements[$placeholder] = '['.gettype($val).']'; } if ($this->removeUsedContextFields) { unset($context[$key]); } } return $record->with(message: strtr($record->message, $replacements), context: $context); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\LogRecord; /** * Adds a tags array into record * * @author Martijn Riemers */ class TagProcessor implements ProcessorInterface { /** @var string[] */ private array $tags; /** * @param string[] $tags */ public function __construct(array $tags = []) { $this->setTags($tags); } /** * @param string[] $tags * @return $this */ public function addTags(array $tags = []): self { $this->tags = array_merge($this->tags, $tags); return $this; } /** * @param string[] $tags * @return $this */ public function setTags(array $tags = []): self { $this->tags = $tags; return $this; } /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { $record->extra['tags'] = $this->tags; return $record; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\ResettableInterface; use Monolog\LogRecord; /** * Adds a unique identifier into records * * @author Simon Mönch */ class UidProcessor implements ProcessorInterface, ResettableInterface { /** @var non-empty-string */ private string $uid; /** * @param int<1, 32> $length */ public function __construct(int $length = 7) { if ($length > 32 || $length < 1) { throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32'); } $this->uid = $this->generateUid($length); } /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { $record->extra['uid'] = $this->uid; return $record; } public function getUid(): string { return $this->uid; } public function reset(): void { $this->uid = $this->generateUid(strlen($this->uid)); } /** * @param positive-int $length * @return non-empty-string */ private function generateUid(int $length): string { return substr(bin2hex(random_bytes((int) ceil($length / 2))), 0, $length); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use ArrayAccess; use Monolog\LogRecord; /** * Injects url/method and remote IP of the current web request in all records * * @author Jordi Boggiano */ class WebProcessor implements ProcessorInterface { /** * @var array|ArrayAccess */ protected array|ArrayAccess $serverData; /** * Default fields * * Array is structured as [key in record.extra => key in $serverData] * * @var array */ protected array $extraFields = [ 'url' => 'REQUEST_URI', 'ip' => 'REMOTE_ADDR', 'http_method' => 'REQUEST_METHOD', 'server' => 'SERVER_NAME', 'referrer' => 'HTTP_REFERER', 'user_agent' => 'HTTP_USER_AGENT', ]; /** * @param array|ArrayAccess|null $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data * @param array|array|null $extraFields Field names and the related key inside $serverData to be added (or just a list of field names to use the default configured $serverData mapping). If not provided it defaults to: [url, ip, http_method, server, referrer] + unique_id if present in server data */ public function __construct(array|ArrayAccess|null $serverData = null, array|null $extraFields = null) { if (null === $serverData) { $this->serverData = &$_SERVER; } else { $this->serverData = $serverData; } $defaultEnabled = ['url', 'ip', 'http_method', 'server', 'referrer']; if (isset($this->serverData['UNIQUE_ID'])) { $this->extraFields['unique_id'] = 'UNIQUE_ID'; $defaultEnabled[] = 'unique_id'; } if (null === $extraFields) { $extraFields = $defaultEnabled; } if (isset($extraFields[0])) { foreach (array_keys($this->extraFields) as $fieldName) { if (!in_array($fieldName, $extraFields, true)) { unset($this->extraFields[$fieldName]); } } } else { $this->extraFields = $extraFields; } } /** * @inheritDoc */ public function __invoke(LogRecord $record): LogRecord { // skip processing if for some reason request data // is not present (CLI or wonky SAPIs) if (!isset($this->serverData['REQUEST_URI'])) { return $record; } $record->extra = $this->appendExtraFields($record->extra); return $record; } /** * @return $this */ public function addExtraField(string $extraName, string $serverName): self { $this->extraFields[$extraName] = $serverName; return $this; } /** * @param mixed[] $extra * @return mixed[] */ private function appendExtraFields(array $extra): array { foreach ($this->extraFields as $extraName => $serverName) { $extra[$extraName] = $this->serverData[$serverName] ?? null; } return $extra; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Registry.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use InvalidArgumentException; /** * Monolog log registry * * Allows to get `Logger` instances in the global scope * via static method calls on this class. * * * $application = new Monolog\Logger('application'); * $api = new Monolog\Logger('api'); * * Monolog\Registry::addLogger($application); * Monolog\Registry::addLogger($api); * * function testLogger() * { * Monolog\Registry::api()->error('Sent to $api Logger instance'); * Monolog\Registry::application()->error('Sent to $application Logger instance'); * } * * * @author Tomas Tatarko */ class Registry { /** * List of all loggers in the registry (by named indexes) * * @var Logger[] */ private static array $loggers = []; /** * Adds new logging channel to the registry * * @param Logger $logger Instance of the logging channel * @param string|null $name Name of the logging channel ($logger->getName() by default) * @param bool $overwrite Overwrite instance in the registry if the given name already exists? * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists */ public static function addLogger(Logger $logger, ?string $name = null, bool $overwrite = false): void { $name = $name ?? $logger->getName(); if (isset(self::$loggers[$name]) && !$overwrite) { throw new InvalidArgumentException('Logger with the given name already exists'); } self::$loggers[$name] = $logger; } /** * Checks if such logging channel exists by name or instance * * @param string|Logger $logger Name or logger instance */ public static function hasLogger($logger): bool { if ($logger instanceof Logger) { $index = array_search($logger, self::$loggers, true); return false !== $index; } return isset(self::$loggers[$logger]); } /** * Removes instance from registry by name or instance * * @param string|Logger $logger Name or logger instance */ public static function removeLogger($logger): void { if ($logger instanceof Logger) { if (false !== ($idx = array_search($logger, self::$loggers, true))) { unset(self::$loggers[$idx]); } } else { unset(self::$loggers[$logger]); } } /** * Clears the registry */ public static function clear(): void { self::$loggers = []; } /** * Gets Logger instance from the registry * * @param string $name Name of the requested Logger instance * @throws \InvalidArgumentException If named Logger instance is not in the registry */ public static function getInstance(string $name): Logger { if (!isset(self::$loggers[$name])) { throw new InvalidArgumentException(sprintf('Requested "%s" logger instance is not in the registry', $name)); } return self::$loggers[$name]; } /** * Gets Logger instance from the registry via static method call * * @param string $name Name of the requested Logger instance * @param mixed[] $arguments Arguments passed to static method call * @throws \InvalidArgumentException If named Logger instance is not in the registry * @return Logger Requested instance of Logger */ public static function __callStatic(string $name, array $arguments): Logger { return self::getInstance($name); } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/ResettableInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; /** * Handler or Processor implementing this interface will be reset when Logger::reset() is called. * * Resetting ends a log cycle gets them back to their initial state. * * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal * state, and getting it back to a state in which it can receive log records again. * * This is useful in case you want to avoid logs leaking between two requests or jobs when you * have a long running process like a worker or an application server serving multiple requests * in one process. * * @author Grégoire Pineau */ interface ResettableInterface { public function reset(): void; } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/SignalHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; use ReflectionExtension; /** * Monolog POSIX signal handler * * @author Robert Gust-Bardon */ class SignalHandler { private LoggerInterface $logger; /** @var array SIG_DFL, SIG_IGN or previous callable */ private array $previousSignalHandler = []; /** @var array */ private array $signalLevelMap = []; /** @var array */ private array $signalRestartSyscalls = []; public function __construct(LoggerInterface $logger) { $this->logger = $logger; } /** * @param int|string|Level $level Level or level name * @return $this * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ public function registerSignalHandler(int $signo, int|string|Level $level = LogLevel::CRITICAL, bool $callPrevious = true, bool $restartSyscalls = true, ?bool $async = true): self { if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) { return $this; } $level = Logger::toMonologLevel($level)->toPsrLogLevel(); if ($callPrevious) { $handler = pcntl_signal_get_handler($signo); $this->previousSignalHandler[$signo] = $handler; } else { unset($this->previousSignalHandler[$signo]); } $this->signalLevelMap[$signo] = $level; $this->signalRestartSyscalls[$signo] = $restartSyscalls; if ($async !== null) { pcntl_async_signals($async); } pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls); return $this; } /** * @param mixed $siginfo */ public function handleSignal(int $signo, $siginfo = null): void { /** @var array $signals */ static $signals = []; if (\count($signals) === 0 && extension_loaded('pcntl')) { $pcntl = new ReflectionExtension('pcntl'); foreach ($pcntl->getConstants() as $name => $value) { if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) { $signals[$value] = $name; } } } $level = $this->signalLevelMap[$signo] ?? LogLevel::CRITICAL; $signal = $signals[$signo] ?? $signo; $context = $siginfo ?? []; $this->logger->log($level, sprintf('Program received signal %s', $signal), $context); if (!isset($this->previousSignalHandler[$signo])) { return; } if ($this->previousSignalHandler[$signo] === SIG_DFL) { if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch') && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill') ) { $restartSyscalls = $this->signalRestartSyscalls[$signo] ?? true; pcntl_signal($signo, SIG_DFL, $restartSyscalls); pcntl_sigprocmask(SIG_UNBLOCK, [$signo], $oldset); posix_kill(posix_getpid(), $signo); pcntl_signal_dispatch(); pcntl_sigprocmask(SIG_SETMASK, $oldset); pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls); } } elseif (is_callable($this->previousSignalHandler[$signo])) { $this->previousSignalHandler[$signo]($signo, $siginfo); } } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Test/TestCase.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Test; use Monolog\Level; use Monolog\Logger; use Monolog\LogRecord; use Monolog\DateTimeImmutable; use Monolog\Formatter\FormatterInterface; use Psr\Log\LogLevel; /** * Lets you easily generate log records and a dummy formatter for testing purposes * * @author Jordi Boggiano * * @internal feel free to reuse this to test your own handlers, this is marked internal to avoid issues with PHPStorm https://github.com/Seldaek/monolog/issues/1677 */ class TestCase extends \PHPUnit\Framework\TestCase { public function tearDown(): void { parent::tearDown(); if (isset($this->handler)) { unset($this->handler); } } /** * @param array $context * @param array $extra * * @phpstan-param value-of|value-of|Level|LogLevel::* $level */ protected function getRecord(int|string|Level $level = Level::Warning, string|\Stringable $message = 'test', array $context = [], string $channel = 'test', \DateTimeImmutable $datetime = new DateTimeImmutable(true), array $extra = []): LogRecord { return new LogRecord( message: (string) $message, context: $context, level: Logger::toMonologLevel($level), channel: $channel, datetime: $datetime, extra: $extra, ); } /** * @phpstan-return list */ protected function getMultipleRecords(): array { return [ $this->getRecord(Level::Debug, 'debug message 1'), $this->getRecord(Level::Debug, 'debug message 2'), $this->getRecord(Level::Info, 'information'), $this->getRecord(Level::Warning, 'warning'), $this->getRecord(Level::Error, 'error'), ]; } protected function getIdentityFormatter(): FormatterInterface { $formatter = $this->createMock(FormatterInterface::class); $formatter->expects(self::any()) ->method('format') ->willReturnCallback(function ($record) { return $record->message; }); return $formatter; } } ================================================ FILE: core/widget/wechatServer/vendor/monolog/monolog/src/Monolog/Utils.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; final class Utils { const DEFAULT_JSON_FLAGS = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION | JSON_INVALID_UTF8_SUBSTITUTE | JSON_PARTIAL_OUTPUT_ON_ERROR; public static function getClass(object $object): string { $class = \get_class($object); if (false === ($pos = \strpos($class, "@anonymous\0"))) { return $class; } if (false === ($parent = \get_parent_class($class))) { return \substr($class, 0, $pos + 10); } return $parent . '@anonymous'; } public static function substr(string $string, int $start, ?int $length = null): string { if (extension_loaded('mbstring')) { return mb_strcut($string, $start, $length); } return substr($string, $start, (null === $length) ? strlen($string) : $length); } /** * Makes sure if a relative path is passed in it is turned into an absolute path * * @param string $streamUrl stream URL or path without protocol */ public static function canonicalizePath(string $streamUrl): string { $prefix = ''; if ('file://' === substr($streamUrl, 0, 7)) { $streamUrl = substr($streamUrl, 7); $prefix = 'file://'; } // other type of stream, not supported if (false !== strpos($streamUrl, '://')) { return $streamUrl; } // already absolute if (substr($streamUrl, 0, 1) === '/' || substr($streamUrl, 1, 1) === ':' || substr($streamUrl, 0, 2) === '\\\\') { return $prefix.$streamUrl; } $streamUrl = getcwd() . '/' . $streamUrl; return $prefix.$streamUrl; } /** * Return the JSON representation of a value * * @param mixed $data * @param int $encodeFlags flags to pass to json encode, defaults to DEFAULT_JSON_FLAGS * @param bool $ignoreErrors whether to ignore encoding errors or to throw on error, when ignored and the encoding fails, "null" is returned which is valid json for null * @throws \RuntimeException if encoding fails and errors are not ignored * @return string when errors are ignored and the encoding fails, "null" is returned which is valid json for null */ public static function jsonEncode($data, ?int $encodeFlags = null, bool $ignoreErrors = false): string { if (null === $encodeFlags) { $encodeFlags = self::DEFAULT_JSON_FLAGS; } if ($ignoreErrors) { $json = @json_encode($data, $encodeFlags); if (false === $json) { return 'null'; } return $json; } $json = json_encode($data, $encodeFlags); if (false === $json) { $json = self::handleJsonError(json_last_error(), $data); } return $json; } /** * Handle a json_encode failure. * * If the failure is due to invalid string encoding, try to clean the * input and encode again. If the second encoding attempt fails, the * initial error is not encoding related or the input can't be cleaned then * raise a descriptive exception. * * @param int $code return code of json_last_error function * @param mixed $data data that was meant to be encoded * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION * @throws \RuntimeException if failure can't be corrected * @return string JSON encoded data after error correction */ public static function handleJsonError(int $code, $data, ?int $encodeFlags = null): string { if ($code !== JSON_ERROR_UTF8) { self::throwEncodeError($code, $data); } if (is_string($data)) { self::detectAndCleanUtf8($data); } elseif (is_array($data)) { array_walk_recursive($data, ['Monolog\Utils', 'detectAndCleanUtf8']); } else { self::throwEncodeError($code, $data); } if (null === $encodeFlags) { $encodeFlags = self::DEFAULT_JSON_FLAGS; } $json = json_encode($data, $encodeFlags); if ($json === false) { self::throwEncodeError(json_last_error(), $data); } return $json; } /** * @internal */ public static function pcreLastErrorMessage(int $code): string { if (PHP_VERSION_ID >= 80000) { return preg_last_error_msg(); } $constants = (get_defined_constants(true))['pcre']; $constants = array_filter($constants, function ($key) { return substr($key, -6) == '_ERROR'; }, ARRAY_FILTER_USE_KEY); $constants = array_flip($constants); return $constants[$code] ?? 'UNDEFINED_ERROR'; } /** * Throws an exception according to a given code with a customized message * * @param int $code return code of json_last_error function * @param mixed $data data that was meant to be encoded * @throws \RuntimeException */ private static function throwEncodeError(int $code, $data): never { $msg = match ($code) { JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', JSON_ERROR_STATE_MISMATCH => 'Underflow or the modes mismatch', JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded', default => 'Unknown error', }; throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true)); } /** * Detect invalid UTF-8 string characters and convert to valid UTF-8. * * Valid UTF-8 input will be left unmodified, but strings containing * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed * original encoding of ISO-8859-15. This conversion may result in * incorrect output if the actual encoding was not ISO-8859-15, but it * will be clean UTF-8 output and will not rely on expensive and fragile * detection algorithms. * * Function converts the input in place in the passed variable so that it * can be used as a callback for array_walk_recursive. * * @param mixed $data Input to check and convert if needed, passed by ref */ private static function detectAndCleanUtf8(&$data): void { if (is_string($data) && preg_match('//u', $data) !== 1) { $data = preg_replace_callback( '/[\x80-\xFF]+/', function (array $m): string { return function_exists('mb_convert_encoding') ? mb_convert_encoding($m[0], 'UTF-8', 'ISO-8859-1') : utf8_encode($m[0]); }, $data ); if (!is_string($data)) { $pcreErrorCode = preg_last_error(); throw new \RuntimeException('Failed to preg_replace_callback: ' . $pcreErrorCode . ' / ' . self::pcreLastErrorMessage($pcreErrorCode)); } $data = str_replace( ['¤', '¦', '¨', '´', '¸', '¼', '½', '¾'], ['€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'], $data ); } } /** * Converts a string with a valid 'memory_limit' format, to bytes. * * @param string|false $val * @return int|false Returns an integer representing bytes. Returns FALSE in case of error. */ public static function expandIniShorthandBytes($val) { if (!is_string($val)) { return false; } // support -1 if ((int) $val < 0) { return (int) $val; } if (preg_match('/^\s*(?\d+)(?:\.\d+)?\s*(?[gmk]?)\s*$/i', $val, $match) !== 1) { return false; } $val = (int) $match['val']; switch (strtolower($match['unit'] ?? '')) { case 'g': $val *= 1024; // no break case 'm': $val *= 1024; // no break case 'k': $val *= 1024; } return $val; } public static function getRecordMessageForException(LogRecord $record): string { $context = ''; $extra = ''; try { if (\count($record->context) > 0) { $context = "\nContext: " . json_encode($record->context, JSON_THROW_ON_ERROR); } if (\count($record->extra) > 0) { $extra = "\nExtra: " . json_encode($record->extra, JSON_THROW_ON_ERROR); } } catch (\Throwable $e) { // noop } return "\nThe exception occurred while attempting to log: " . $record->message . $context . $extra; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/.github/FUNDING.yml ================================================ github: [overtrue] ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/.github/dependabot.yml ================================================ # To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "composer" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "daily" ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/.github/workflows/lint.yml ================================================ name: Lint on: [push, pull_request] jobs: phpstan: name: PHPStan runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - run: composer validate --strict - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT id: composer-cache - uses: actions/cache@v3 with: path: ${{ steps.composer-cache.outputs.dir }} key: dependencies-caches-php-${{ hashFiles('**/composer.lock') }} restore-keys: dependencies-caches-php- - run: composer install --no-progress - run: composer phpstan php_cs_fixer: name: PHP-CS-Fxier runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT id: composer-cache - uses: actions/cache@v3 with: path: ${{ steps.composer-cache.outputs.dir }} key: dependencies-caches-php-${{ hashFiles('**/composer.lock') }} restore-keys: dependencies-caches-php- - run: composer install --no-progress - run: composer check-style ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/.github/workflows/test.yml ================================================ name: Test on: [push, pull_request] jobs: phpunit: name: PHP-${{ matrix.php_version }}-${{ matrix.perfer }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: php_version: - 8.0 - 8.1 perfer: - stable - lowest steps: - uses: actions/checkout@v3 - run: composer validate --strict - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT id: composer-cache - uses: actions/cache@v3 with: path: ${{ steps.composer-cache.outputs.dir }} key: dependencies-caches-php-${{ hashFiles('**/composer.lock') }} restore-keys: dependencies-caches-php- - run: composer update --prefer-dist --no-interaction --no-suggest --prefer-${{ matrix.perfer }} - run: ./vendor/bin/phpunit ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/.gitignore ================================================ /vendor composer.phar composer.lock .DS_Store /.idea Thumbs.db /*.php sftp-config.json *.cache.phpunit.result.cache .phpunit.result.cache .php-cs-fixer.cache ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/LICENSE ================================================ The MIT License (MIT) Copyright (c) 2021 overtrue Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/README.md ================================================ # Socialite Socialite 是一个 [OAuth2](https://oauth.net/2/) 认证工具。 它的灵感来源于 [laravel/socialite](https://github.com/laravel/socialite) , 你可以很轻易的在任何 PHP 项目中使用它。[英文文档](/README_EN.md) [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/overtrue/socialite?style=flat-square)](https://github.com/overtrue/socialite/releases) [![GitHub License](https://img.shields.io/github/license/overtrue/socialite?style=flat-square)](https://github.com/overtrue/socialite/blob/master/LICENSE) [![Packagist Downloads](https://img.shields.io/packagist/dt/overtrue/socialite?style=flat-square)](https://packagist.org/packages/overtrue/socialite) [![Sponsor me](https://github.com/overtrue/overtrue/blob/master/sponsor-me-button-s.svg?raw=true)](https://github.com/sponsors/overtrue) 该工具现已支持平台有:Facebook,Github,Google,Linkedin,Outlook,QQ,TAPD,支付宝,淘宝,百度,钉钉,微博,微信,抖音,飞书,Lark,豆瓣,企业微信,腾讯云,Line,Gitee,Coding。 如果你喜欢我的项目并想支持我,[点击这里 :heart:](https://github.com/sponsors/overtrue) # 版本要求 ``` PHP >= 8.0.2 ``` # 安装 ```shell $ composer require "overtrue/socialite" -vvv ``` # 使用指南 用户只需要创建相应配置变量,然后通过工具为各个平台创建认证应用,并轻松获取该平台的 access_token 和用户相关信息。工具实现逻辑详见参照各大平台 OAuth2 文档。 工具使用大致分为以下几步: 1. 配置平台设置 2. 创建对应平台应用 3. 让用户跳转至平台认证 4. 服务器收到平台回调 Code,使用 Code 换取平台处用户信息(包括 access_token) 为 Laravel 用户创建的更方便的整合的包: [overtrue/laravel-socialite](https://github.com/overtrue/laravel-socialite) `authorize.php`: 让用户跳转至平台认证 ```php [ 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $socialite = new SocialiteManager($config); $url = $socialite->create('github')->redirect(); return redirect($url); ``` `callback.php`: ```php [ 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $socialite = new SocialiteManager($config); $code = request()->query('code'); $user = $socialite->create('github')->userFromCode($code); $user->getId(); // 1472352 $user->getNickname(); // "overtrue" $user->getUsername(); // "overtrue" $user->getName(); // "安正超" $user->getEmail(); // "anzhengchao@gmail.com" ... ``` ## 配置 为每个平台设置相同的键值对后就能开箱即用:`client_id`, `client_secret`, `redirect`. 示例: ```php $config = [ 'weibo' => [ 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], 'facebook' => [ 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; ``` ### 自定义应用名 你可以使用任意你喜欢的名字对每个平台进行命名,比如说 `foo`, 采用别名的方法后需要在配置中多设置一个 `provider` 键,这样才能告诉工具包如何正确找到你想要的程序: ```php $config = [ // 为 github 应用起别名为 foo 'foo' => [ 'provider' => 'github', // <-- provider name 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], // 另外一个名字叫做 bar 的 github 应用 'bar' => [ 'provider' => 'github', // <-- provider name 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], //... ]; $socialite = new SocialiteManager($config); $appFoo = $socialite->create('foo'); $appBar = $socialite->create('bar'); ``` ### 扩展自定义服务提供程序 你可以很容易的从自定义的服务提供中创建应用,只需要遵循如下两点: 1. 使用自定义创建器 如下代码所示,为 foo 应用定义了服务提供名,但是工具本身还未支持,所以使用创建器 `extend()`,以闭包函数的形式为该服务提供创建一个实例。 ```php $config = [ 'foo' => [ 'provider' => 'myprovider', // <-- 一个工具还未支持的服务提供程序 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $socialite = new SocialiteManager($config); $socialite->extend('myprovider', function(array $config) { return new MyCustomProvider($config); }); $app = $socialite->create('foo'); ``` 2. 使用服务提供类 >👋🏻 你的自定义服务提供类必须实现`Overtrue\Socialite\Contracts\ProviderInterface` 接口 ```php class MyCustomProvider implements \Overtrue\Socialite\Contracts\ProviderInterface { //... } ``` 接下来为 `provider` 设置该类名让工具可以找到该类并实例化: ```php $config = [ 'foo' => [ 'provider' => MyCustomProvider::class, // <-- 类名 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $socialite = new SocialiteManager($config); $app = $socialite->create('foo'); ``` ## 平台 不同的平台有不同的配置方法,为了确保工具的正常运行,所以请确保你所使用的平台的配置都是如期设置的。 ### [支付宝](https://opendocs.alipay.com/open/200/105310#s2) 请按如下方式配置 ```php $config = [ 'alipay' => [ // 这个键名还能像官方文档那样叫做 'app_id' 'client_id' => 'your-app-id', // 请根据官方文档,在官方管理后台配置 RSA2 // 注意: 这是你自己的私钥 // 注意: 不允许私钥内容有其他字符 // 建议: 为了保证安全,你可以将文本信息从磁盘文件中读取,而不是在这里明文 'rsa_private_key' => 'your-rsa-private-key', // 确保这里的值与你在服务后台绑定的地址值一致 // 这个键名还能像官方文档那样叫做 'redirect_url' 'redirect' => 'http://localhost/socialite/callback.php', // 沙箱模式接入地址见 https://opendocs.alipay.com/open/220/105337#%E5%85%B3%E4%BA%8E%E6%B2%99%E7%AE%B1 'sandbox' => false, ] ... ]; $socialite = new SocialiteManager($config); $user = $socialite->create('alipay')->userFromCode('here is auth code'); // 详见文档后面 "User interface" $user->getId(); // 1472352 $user->getNickname(); // "overtrue" $user->getUsername(); // "overtrue" $user->getName(); // "安正超" ... ``` 本工具暂时只支持 RSA2 个人私钥认证方式。 ### [钉钉](https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3) 如文档所示 > 注意:该工具仅支持 QR code 连接到第三方网站,用来获取用户信息(opeid, unionid 和 nickname) ```php $config = [ 'dingtalk' => [ // or 'app_id' 'client_id' => 'your app id', // or 'app_secret' 'client_secret' => 'your app secret', // or 'redirect_url' 'redirect' => 'redirect URL' ] ]; $socialite = new SocialiteManager($config); $user = $socialite->create('dingtalk')->userFromCode('here is auth code'); // 详见文档后面 "User interface" $user->getId(); // 1472352 $user->getNickname(); // "overtrue" $user->getUsername(); // "overtrue" $user->getName(); // "安正超" ... ``` ### [抖音](https://open.douyin.com/platform/doc/OpenAPI-oauth2) > 注意: 使用抖音服务提供的时候,如果你想直接使用 access_token 获取用户信息时,请先设置 openid。 先调用 `withOpenId()` 再调用 `userFromToken()` ```php $config = [ 'douyin' => [ 'client_id' => 'your app id', 'client_secret' => 'your app secret', 'redirect' => 'redirect URL' ] ]; $socialite = new SocialiteManager($config); $user = $socialite->create('douyin')->userFromCode('here is auth code'); $user = $socialite->create('douyin')->withOpenId('openId')->userFromToken('here is the access token'); ``` ### [头条](https://open.douyin.com/platform/resource/docs/develop/permission/toutiao-or-xigua/OAuth2.0/) > 注意: 使用`头条`服务提供的时候,如果你想直接使用 access_token 获取用户信息时,请先设置 openid。 先调用 `withOpenId()` 再调用 `userFromToken()` ```php $config = [ 'toutiao' => [ 'client_id' => 'your app id', 'client_secret' => 'your app secret', 'redirect' => 'redirect URL' ] ]; $socialite = new SocialiteManager($config); $user = $socialite->create('toutiao')->userFromCode('here is auth code'); $user = $socialite->create('toutiao')->withOpenId('openId')->userFromToken('here is the access token'); ``` ### [西瓜](https://open.douyin.com/platform/resource/docs/develop/permission/toutiao-or-xigua/OAuth2.0/) > 注意: 使用`西瓜`服务提供的时候,如果你想直接使用 access_token 获取用户信息时,请先设置 openid。 先调用 `withOpenId()` 再调用 `userFromToken()` ```php $config = [ 'xigua' => [ 'client_id' => 'your app id', 'client_secret' => 'your app secret', 'redirect' => 'redirect URL' ] ]; $socialite = new SocialiteManager($config); $user = $socialite->create('xigua')->userFromCode('here is auth code'); $user = $socialite->create('xigua')->withOpenId('openId')->userFromToken('here is the access token'); ``` ### [百度](https://developer.baidu.com/wiki/index.php?title=docs/oauth) 其他配置没啥区别,在用法上,可以很轻易的选择重定向登录页面的模式,通过 `withDisplay()` - **page:**全屏形式的授权页面 (默认),适用于 web 应用。 - **popup:** 弹框形式的授权页面,适用于桌面软件应用和 web 应用。 - **dialog:** 浮层形式的授权页面,只能用于站内 web 应用。 - **mobile:** Iphone/Android 等智能移动终端上用的授权页面,适用于 Iphone/Android 等智能移动终端上的应用。 - **tv:** 电视等超大显示屏使用的授权页面。 - **pad:** IPad/Android 等智能平板电脑使用的授权页面。 ```php $authUrl = $socialite->create('baidu')->withDisplay('mobile')->redirect(); ``` `popup` 模式是工具内默认的使用模式。`basic` 是默认使用的 scopes 值。 ### [飞书](https://open.feishu.cn/document/ukTMukTMukTM/uITNz4iM1MjLyUzM) 通过一些简单的方法配置 app_ticket 就能使用内部应用模式 ```php $config = [ 'feishu' => [ // or 'app_id' 'client_id' => 'your app id', // or 'app_secret' 'client_secret' => 'your app secret', // or 'redirect_url' 'redirect' => 'redirect URL', // 如果你想使用使用内部应用的方式获取 app_access_token // 对这个键设置了 'internal' 值那么你已经开启了内部应用模式 'app_mode' => 'internal' ] ]; $socialite = new SocialiteManager($config); $feishuDriver = $socialite->create('feishu'); $feishuDriver->withInternalAppMode()->userFromCode('here is code'); $feishuDriver->withDefaultMode()->withAppTicket('app_ticket')->userFromCode('here is code'); ``` ### [Lark](https://open.larksuite.com/document/ukTMukTMukTM/uITNz4iM1MjLyUzM) 通过一些简单的方法配置 app_ticket 就能使用内部应用模式 ```php $config = [ 'lark' => [ // or 'app_id' 'client_id' => 'your app id', // or 'app_secret' 'client_secret' => 'your app secret', // or 'redirect_url' 'redirect' => 'redirect URL', // 如果你想使用使用内部应用的方式获取 app_access_token // 对这个键设置了 'internal' 值那么你已经开启了内部应用模式 'app_mode' => 'internal' ] ]; $socialite = new SocialiteManager($config); $larkDriver = $socialite->create('lark'); $larkDriver->withInternalAppMode()->userFromCode('here is code'); $larkDriver->withDefaultMode()->withAppTicket('app_ticket')->userFromCode('here is code'); ``` ### [淘宝](https://open.taobao.com/doc.htm?docId=102635&docType=1&source=search) 其他配置与其他平台的一样,你能选择你想要展示的重定向页面类型通过使用 `withView()` ```php $authUrl = $socialite->create('taobao')->withView('wap')->redirect(); ``` `web` 模式是工具默认使用的展示方式, `user_info` 是默认使用的 scopes 范围值。 ### [微信](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Official_Accounts/official_account_website_authorization.html) 我们支持开放平台代表公众号进行第三方平台网页授权。 你只需要像下面这样输入你的配置。官方账号不需要授权。 ```php ... [ 'wechat' => [ 'client_id' => 'client_id', 'client_secret' => 'client_secret', 'redirect' => 'redirect-url', // 开放平台 - 第三方平台所需 'component' => [ // or 'app_id', 'component_app_id' as key 'id' => 'component-app-id', // or 'app_token', 'access_token', 'component_access_token' as key 'token' => 'component-access-token', ] ] ], ... ``` ### [Coding](https://coding.net/help/openapi#oauth) 您需要额外配置 `team_url` 为您的团队域名,例如: ```php $config = [ 'coding' => [ 'team_url' => 'https://{your-team}.coding.net', 'client_id' => 'your app id', 'client_secret' => 'your app secret', 'redirect' => 'redirect URL', ] ]; ``` ## 其他一些技巧 ### Scopes 在重定向用户之前,您还可以使用 `scopes()` 方法在请求上设置 “范围”。此方法将覆盖所有现有的作用域: ```php $response = $socialite->create('github') ->scopes(['scope1', 'scope2'])->redirect(); ``` ### Redirect URL 你也可以动态设置' redirect_uri ',你可以使用以下方法来改变 `redirect_uri` URL: ```php $url = 'your callback url.'; $socialite->redirect($url); // or $socialite->withRedirectUrl($url)->redirect(); ``` ### State 你的应用程序可以使用一个状态参数来确保响应属于同一个用户发起的请求,从而防止跨站请求伪造 (CSFR) 攻击。当恶意攻击者欺骗用户执行不需要的操作 (只有用户有权在受信任的 web 应用程序上执行) 时,就会发生 CSFR 攻击,所有操作都将在不涉及或警告用户的情况下完成。 这里有一个最简单的例子,说明了如何提供状态可以让你的应用程序更安全。在本例中,我们使用会话 ID 作为状态参数,但是您可以使用您想要为状态创建值的任何逻辑。 ### 带着 `state` 参数的重定向 ```php create('github')->withState($state)->redirect(); return redirect($url); ``` ### 检验回调的 `state` 一旦用户授权你的应用程序,用户将被重定向回你的应用程序的 redirect_uri。OAuth 服务器将不加修改地返回状态参数。检查 redirect_uri 中提供的状态是否与应用程序生成的状态相匹配: ```php query('state'); $code = request()->query('code'); // Check the state received with current session id if ($state != hash('sha256', session_id())) { exit('State does not match!'); } $user = $socialite->create('github')->userFromCode($code); // authorized ``` [查看更多关于 `state` 参数的文档](https://auth0.com/docs/protocols/oauth2/oauth-state) ### 其他的一些参数 要在请求中包含任何可选参数,调用 `with()` 方法传入一个你想要设置的关联数组: ```php $response = $socialite->create('google') ->with(['hd' => 'example.com'])->redirect(); ``` ## User interface ### 标准的 user api: ```php $user = $socialite->create('github')->userFromCode($code); ``` ```json { "id": 1472352, "nickname": "overtrue", "name": "安正超", "email": "anzhengchao@gmail.com", "avatar": "https://avatars.githubusercontent.com/u/1472352?v=3", "raw": { "login": "overtrue", "id": 1472352, "avatar_url": "https://avatars.githubusercontent.com/u/1472352?v=3", "gravatar_id": "", "url": "https://api.github.com/users/overtrue", "html_url": "https://github.com/overtrue", ... }, "token_response": { "access_token": "5b1dc56d64fffbd052359f032716cc4e0a1cb9a0", "token_type": "bearer", "scope": "user:email" } } ``` 你可以像这样以数组键的形式获取 user 属性: ```php $user['id']; // 1472352 $user['nickname']; // "overtrue" $user['name']; // "安正超" $user['email']; // "anzhengchao@gmail.com" ... ``` 或者使用该 `User` 对象的方法: ```php mixed $user->getId(); ?string $user->getNickname(); ?string $user->getName(); ?string $user->getEmail(); ?string $user->getAvatar(); ?string $user->getRaw(); ?string $user->getAccessToken(); ?string $user->getRefreshToken(); ?int $user->getExpiresIn(); ?array $user->getTokenResponse(); ``` ### 从 OAuth API 响应中取得原始数据 `$user->getRaw()` 方法会返回一个 **array**。 ### 当你使用 userFromCode() 想要获取 token 响应的原始数据 `$user->getTokenResponse()` 方法会返回一个 **array** 里面是响应从获取 token 时候 API 返回的响应。 > 注意:当你使用 `userFromCode()` 时,这个方法只返回一个 **有效的数组**,否则将返回 **null**,因为 `userFromToken() ` 没有 token 的 HTTP 响应。 ### 通过 access token 获取用户信息 ```php $accessToken = 'xxxxxxxxxxx'; $user = $socialite->userFromToken($accessToken); ``` # Enjoy it! :heart: # 参照 - [Alipay - 用户信息授权](https://opendocs.alipay.com/open/289/105656) - [DingTalk - 扫码登录第三方网站](https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3) - [Google - OpenID Connect](https://developers.google.com/identity/protocols/OpenIDConnect) - [Github - Authorizing OAuth Apps](https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/) - [Facebook - Graph API](https://developers.facebook.com/docs/graph-api) - [Linkedin - Authenticating with OAuth 2.0](https://developer.linkedin.com/docs/oauth2) - [微博 - OAuth 2.0 授权机制说明](http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E) - [QQ - OAuth 2.0 登录 QQ](http://wiki.connect.qq.com/oauth2-0%E7%AE%80%E4%BB%8B) - [腾讯云 - OAuth2.0](https://cloud.tencent.com/document/product/306/37730#.E6.8E.A5.E5.85.A5.E8.85.BE.E8.AE.AF.E4.BA.91-oauth) - [微信公众平台 - OAuth 文档](http://mp.weixin.qq.com/wiki/9/01f711493b5a02f24b04365ac5d8fd95.html) - [微信开放平台 - 网站应用微信登录开发指南](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN) - [微信开放平台 - 代公众号发起网页授权](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318590&token=&lang=zh_CN) - [企业微信 - OAuth 文档](https://open.work.weixin.qq.com/api/doc/90000/90135/91020) - [企业微信第三方应用 - OAuth 文档](https://open.work.weixin.qq.com/api/doc/90001/90143/91118) - [豆瓣 - OAuth 2.0 授权机制说明](http://developers.douban.com/wiki/?title=oauth2) - [抖音 - 网站应用开发指南](http://open.douyin.com/platform/doc) - [飞书 - 授权说明](https://open.feishu.cn/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM) - [Lark - 授权说明](https://open.larksuite.com/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM) - [Tapd - 用户授权说明](https://www.tapd.cn/help/show#1120003271001000093) - [Line - OAuth 2.0](https://developers.line.biz/en/docs/line-login/integrate-line-login/) - [Gitee - OAuth文档](https://gitee.com/api/v5/oauth_doc#/) # PHP 扩展包开发 > 想知道如何从零开始构建 PHP 扩展包? > > 请关注我的实战课程,我会在此课程中分享一些扩展开发经验 —— [《PHP 扩展包实战教程 - 从入门到发布》](https://learnku.com/courses/creating-package) # License MIT ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/README_EN.md ================================================ # Socialite Socialite is an [OAuth2](https://oauth.net/2/) Authentication tool. It is inspired by [laravel/socialite](https://github.com/laravel/socialite), You can easily use it in any PHP project. [中文文档](/README.md) [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/overtrue/socialite?style=flat-square)](https://github.com/overtrue/socialite/releases) [![GitHub License](https://img.shields.io/github/license/overtrue/socialite?style=flat-square)](https://github.com/overtrue/socialite/blob/master/LICENSE) [![Packagist Downloads](https://img.shields.io/packagist/dt/overtrue/socialite?style=flat-square)](https://packagist.org/packages/overtrue/socialite) [![Sponsor me](https://github.com/overtrue/overtrue/blob/master/sponsor-me-button-s.svg?raw=true)](https://github.com/sponsors/overtrue) This tool now supports platforms such as Facebook, GitHub, Google, Figma, LinkedIn, Outlook, QQ, Tapd, Alipay, Taobao, Baidu, DingTalk, Weibo, WeChat, Douyin, Feishu, Lark, Douban, WeWork, Tencent Cloud, Line, Gitee and Coding. 如果你喜欢我的项目并想支持我,[点击这里 :heart:](https://github.com/sponsors/overtrue) # Requirement ``` PHP >= 8.0.2 ``` # Installation ```shell $ composer require "overtrue/socialite" -vvv ``` # Usage Users just need to create the corresponding configuration variables, then create the authentication application for each platform through the tool, and easily obtain the access_token and user information for that platform. The implementation logic of the tool is referred to OAuth2 documents of major platforms for details. The tool is used in the following steps: 1. Configurate platform config 2. Use this tool to create a platform application 3. Let the user redirect to platform authentication 4. The server receives a Code callback from the platform, and uses the Code to exchange the user information on the platform (including access_token). Packages created for Laravel users are easier to integrate: [overtrue/laravel-socialite](https://github.com/overtrue/laravel-socialite) `authorize.php`: ```php [ 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $socialite = new SocialiteManager($config); $url = $socialite->create('github')->redirect(); return redirect($url); ``` `callback.php`: ```php [ 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $socialite = new SocialiteManager($config); $code = request()->query('code'); $user = $socialite->create('github')->userFromCode($code); $user->getId(); // 1472352 $user->getNickname(); // "overtrue" $user->getUsername(); // "overtrue" $user->getName(); // "安正超" $user->getEmail(); // "anzhengchao@gmail.com" ... ``` ## Configuration Each create uses the same configuration keys: `client_id`, `client_secret`, `redirect`. Example: ```php $config = [ 'weibo' => [ 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], 'facebook' => [ 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; ``` ### Custom app name You can use any name you like as the name of the application, such as `foo`, and set provider using `provider` key: ```php $config = [ 'foo' => [ 'provider' => 'github', // <-- provider name 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], // another github app 'bar' => [ 'provider' => 'github', // <-- provider name 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], //... ]; ``` ### Extends custom provider You can create application from you custom provider easily,you have to ways to do this: 1. Using custom creator: As shown in the following code, the service provider name is defined for the Foo application, but the tool itself does not support it, so use the creator `extend()` to create an instance of the service provider as a closure function. ```php $config = [ 'foo' => [ 'provider' => 'myprovider', // <-- provider name 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $socialite = new SocialiteManager($config); $socialite->extend('myprovider', function(array $config) { return new MyCustomProvider($config); }); $app = $socialite->create('foo'); ``` 2. Using provider: >👋🏻 Your custom provider class must be implements of `Overtrue\Socialite\Contracts\ProviderInterface`. ```php class MyCustomProvider implements \Overtrue\Socialite\Contracts\ProviderInterface { //... } ``` then set `provider` with the class name: ```php $config = [ 'foo' => [ 'provider' => MyCustomProvider::class, // <-- class name 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $socialite = new SocialiteManager($config); $app = $socialite->create('foo'); ``` ## Platform Different platforms have different configuration methods, so please check the platform Settings you are using. ### [Alipay](https://opendocs.alipay.com/open/200/105310#s2) You must have the following configuration. ```php $config = [ 'alipay' => [ // This can also be named as 'app_id' like the official documentation. 'client_id' => 'your-app-id', // Please refer to the official documentation, in the official management background configuration RSA2. // Note: This is your own private key. // Note: Do not allow the private key content to have extra characters. // Recommendation: For security, you can read directly from the file. But here as long as the value, please remember to remove the head and tail of the decoration. 'rsa_private_key' => 'your-rsa-private-key', // Be sure to set this value and make sure that it is the same address value as set in the official admin system. // This can also be named as 'redirect_url' like the official documentation. 'redirect' => 'http://localhost/socialite/callback.php', ] ... ]; $socialite = new SocialiteManager($config); $user = $socialite->create('alipay')->userFromCode('here is auth code'); // See this documents "User interface" $user->getId(); // 1472352 $user->getNickname(); // "overtrue" $user->getUsername(); // "overtrue" $user->getName(); // "安正超" ... ``` Only RSA2 personal private keys are supported, so stay tuned if you want to log in with a certificate. ### [DingTalk](https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3) Follow the documentation and configure it like following. > Note: It only supported QR code access to third-part websites. i.e exchange for user information(opendid, unionid and nickname) ```php $config = [ 'dingtalk' => [ // or 'app_id' 'client_id' => 'your app id', // or 'app_secret' 'client_secret' => 'your app secret', // or 'redirect_url' 'redirect' => 'redirect URL' ] ]; $socialite = new SocialiteManager($config); $user = $socialite->create('dingtalk')->userFromCode('here is auth code'); // See this documents "User interface" $user->getId(); // 1472352 $user->getNickname(); // "overtrue" $user->getUsername(); // "overtrue" $user->getName(); // "安正超" ... ``` ### [Douyin](https://open.douyin.com/platform/doc/OpenAPI-oauth2) > Note: using the Douyin create that if you get user information directly using access token, set up the openid first. the openid can be obtained by code when access is obtained, so call `userFromCode()` automatically configured for you openid, if call `userFromToken()` first call `withOpenId()` ```php $config = [ 'douyin' => [ 'client_id' => 'your app id', 'client_secret' => 'your app secret', 'redirect' => 'redirect URL' ] ]; $socialite = new SocialiteManager($config); $user = $socialite->create('douyin')->userFromCode('here is auth code'); $user = $socialite->create('douyin')->withOpenId('openId')->userFromToken('here is the access token'); ``` ### [TouTiao](https://open.douyin.com/platform/resource/docs/develop/permission/toutiao-or-xigua/OAuth2.0/) > Note: using the `toutiao` create that if you get user information directly using access token, set up the openid first. the openid can be obtained by code when access is obtained, so call `userFromCode()` automatically configured for you openid, if call `userFromToken()` first call `withOpenId()` ```php $config = [ 'toutiao' => [ 'client_id' => 'your app id', 'client_secret' => 'your app secret', 'redirect' => 'redirect URL' ] ]; $socialite = new SocialiteManager($config); $user = $socialite->create('toutiao')->userFromCode('here is auth code'); $user = $socialite->create('toutiao')->withOpenId('openId')->userFromToken('here is the access token'); ``` ### [XiGua](https://open.douyin.com/platform/resource/docs/develop/permission/toutiao-or-xigua/OAuth2.0/) > Note: using the `xigua` create that if you get user information directly using access token, set up the openid first. the openid can be obtained by code when access is obtained, so call `userFromCode()` automatically configured for you openid, if call `userFromToken()` first call `withOpenId()` ```php $config = [ 'xigua' => [ 'client_id' => 'your app id', 'client_secret' => 'your app secret', 'redirect' => 'redirect URL' ] ]; $socialite = new SocialiteManager($config); $user = $socialite->create('xigua')->userFromCode('here is auth code'); $user = $socialite->create('xigua')->withOpenId('openId')->userFromToken('here is the access token'); ``` ### [Baidu](https://developer.baidu.com/wiki/index.php?title=docs/oauth) You can choose the form you want display by using `withDisplay()`. - **page** - **popup** - **dialog** - **mobile** - **tv** - **pad** ```php $authUrl = $socialite->create('baidu')->withDisplay('mobile')->redirect(); ``` `popup` mode is the default setting with display. `basic` is the default with scopes. ### [Feishu](https://open.feishu.cn/document/ukTMukTMukTM/uITNz4iM1MjLyUzM) Some simple way to use by internal app mode and config app_ticket. ```php $config = [ 'feishu' => [ // or 'app_id' 'client_id' => 'your app id', // or 'app_secret' 'client_secret' => 'your app secret', // or 'redirect_url' 'redirect' => 'redirect URL', // if you want to use internal way to get app_access_token // set this key by 'internal' then you already turn on the internal app mode 'app_mode' => 'internal' ] ]; $socialite = new SocialiteManager($config); $feishuDriver = $socialite->create('feishu'); $feishuDriver->withInternalAppMode()->userFromCode('here is code'); $feishuDriver->withDefaultMode()->withAppTicket('app_ticket')->userFromCode('here is code'); ``` ### [Lark](https://open.larksuite.com/document/ukTMukTMukTM/uITNz4iM1MjLyUzM) Some simple way to use by internal app mode and config app_ticket. ```php $config = [ 'lark' => [ // or 'app_id' 'client_id' => 'your app id', // or 'app_secret' 'client_secret' => 'your app secret', // or 'redirect_url' 'redirect' => 'redirect URL', // if you want to use internal way to get app_access_token // set this key by 'internal' then you already turn on the internal app mode 'app_mode' => 'internal' ] ]; $socialite = new SocialiteManager($config); $larkDriver = $socialite->create('lark'); $larkDriver->withInternalAppMode()->userFromCode('here is code'); $larkDriver->withDefaultMode()->withAppTicket('app_ticket')->userFromCode('here is code'); ``` ### [Taobao](https://open.taobao.com/doc.htm?docId=102635&docType=1&source=search) You can choose the form you want display by using `withView()`. ```php $authUrl = $socialite->create('taobao')->withView('wap')->redirect(); ``` `web` mode is the default setting with display. `user_info` is the default with scopes. ### [WeChat](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Official_Accounts/official_account_website_authorization.html) We support Open Platform Third-party Platform webpage authorizations on behalf of Official Account. You just need input your config like below config. Official Accounts authorizations only doesn't need. ```php ... [ 'wechat' => [ 'client_id' => 'client_id', 'client_secret' => 'client_secret', 'redirect' => 'redirect-url', // Open Platform - Third-party Platform Need 'component' => [ 'id' => 'component-app-id', 'token' => 'component-access-token', // or Using a callable as value. ] ] ], ... ``` ### [Coding](https://coding.net/help/openapi#oauth) Please add the `team_url` parameter to the configuration file to specify the team domain name as follows: ```php $config = [ 'coding' => [ 'team_url' => 'https://{your-team}.coding.net', 'client_id' => 'your app id', 'client_secret' => 'your app secret', 'redirect' => 'redirect URL', ] ]; ``` ## Some Skill ### Scopes Before redirecting the user, you may also set "scopes" on the request using the `scopes()` method. This method will overwrite all existing scopes: ```php $response = $socialite->create('github') ->scopes(['scope1', 'scope2'])->redirect(); ``` ### Redirect URL You may also want to dynamically set `redirect_uri`,you can use the following methods to change the `redirect_uri` URL: ```php $url = 'your callback url.'; $socialite->redirect($url); // or $socialite->withRedirectUrl($url)->redirect(); ``` ### State Your app can use a state parameter for making sure the response belongs to a request initiated by the same user, therefore preventing cross-site request forgery (CSFR) attacks. A CSFR attack occurs when a malicious attacker tricks the user into performing unwanted actions that only the user is authorized to perform on a trusted web application, and all will be done without involving or alerting the user. Here's the simplest example of how providing the state can make your app more secure. in this example, we use the session ID as the state parameter, but you can use whatever logic you want to create value for the state. ### Redirect with `state` parameter ```php create('github')->withState($state)->redirect(); return redirect($url); ``` ### Validate the callback `state` Once the user has authorized your app, the user will be redirected back to your app's redirect_uri. The OAuth server will return the state parameter unchanged. Check if the state provided in the redirect_uri matches the state generated by your app: ```php query('state'); $code = request()->query('code'); // Check the state received with current session id if ($state != hash('sha256', session_id())) { exit('State does not match!'); } $user = $socialite->create('github')->userFromCode($code); // authorized ``` [Read more about `state` parameter](https://auth0.com/docs/protocols/oauth2/oauth-state) ### Additional parameters To include any optional parameters in the request, call the `with()` method with an associative array: ```php $response = $socialite->create('google') ->with(['hd' => 'example.com'])->redirect(); ``` ## User interface ### Standard user api: ```php $user = $socialite->create('github')->userFromCode($code); ``` ```json { "id": 1472352, "nickname": "overtrue", "name": "安正超", "email": "anzhengchao@gmail.com", "avatar": "https://avatars.githubusercontent.com/u/1472352?v=3", "raw": { "login": "overtrue", "id": 1472352, "avatar_url": "https://avatars.githubusercontent.com/u/1472352?v=3", "gravatar_id": "", "url": "https://api.github.com/users/overtrue", "html_url": "https://github.com/overtrue", ... }, "token_response": { "access_token": "5b1dc56d64fffbd052359f032716cc4e0a1cb9a0", "token_type": "bearer", "scope": "user:email" } } ``` You can fetch the user attribute as a array keys like these: ```php $user['id']; // 1472352 $user['nickname']; // "overtrue" $user['name']; // "安正超" $user['email']; // "anzhengchao@gmail.com" ... ``` Or using the method: ```php mixed $user->getId(); ?string $user->getNickname(); ?string $user->getName(); ?string $user->getEmail(); ?string $user->getAvatar(); ?string $user->getRaw(); ?string $user->getAccessToken(); ?string $user->getRefreshToken(); ?int $user->getExpiresIn(); ?array $user->getTokenResponse(); ``` ### Get raw response from OAuth API The `$user->getRaw()` method will return an **array** of the API raw response. ### Get the token response when you use userFromCode() The `$user->getTokenResponse()` method will return an **array** of the get token(access token) API response. > Note: This method only return a **valid array** when you use `userFromCode()`, else will return **null** because use `userFromToken()` have no token response. ### Get user with access token ```php $accessToken = 'xxxxxxxxxxx'; $user = $socialite->userFromToken($accessToken); ``` # Enjoy it! :heart: # Reference - [Alipay - 用户信息授权](https://opendocs.alipay.com/open/289/105656) - [DingTalk - 扫码登录第三方网站](https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3) - [Google - OpenID Connect](https://developers.google.com/identity/protocols/OpenIDConnect) - [GitHub - Authorizing OAuth Apps](https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/) - [Figma - OAuth 2](https://www.figma.com/developers/api#auth-oauth2) - [Facebook - Graph API](https://developers.facebook.com/docs/graph-api) - [Linkedin - Authenticating with OAuth 2.0](https://developer.linkedin.com/docs/oauth2) - [微博 - OAuth 2.0 授权机制说明](http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E) - [QQ - OAuth 2.0 登录 QQ](http://wiki.connect.qq.com/oauth2-0%E7%AE%80%E4%BB%8B) - [腾讯云 - OAuth2.0](https://cloud.tencent.com/document/product/306/37730#.E6.8E.A5.E5.85.A5.E8.85.BE.E8.AE.AF.E4.BA.91-oauth) - [微信公众平台 - OAuth 文档](http://mp.weixin.qq.com/wiki/9/01f711493b5a02f24b04365ac5d8fd95.html) - [微信开放平台 - 网站应用微信登录开发指南](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN) - [微信开放平台 - 代公众号发起网页授权](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318590&token=&lang=zh_CN) - [企业微信 - OAuth 文档](https://open.work.weixin.qq.com/api/doc/90000/90135/91020) - [企业微信第三方应用 - OAuth 文档](https://open.work.weixin.qq.com/api/doc/90001/90143/91118) - [豆瓣 - OAuth 2.0 授权机制说明](http://developers.douban.com/wiki/?title=oauth2) - [抖音 - 网站应用开发指南](http://open.douyin.com/platform/doc) - [飞书 - 授权说明](https://open.feishu.cn/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM) - [Lark - 授权说明](https://open.larksuite.com/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM) - [Tapd - 用户授权说明](https://www.tapd.cn/help/show#1120003271001000093) - [Line - OAuth 2.0](https://developers.line.biz/en/docs/line-login/integrate-line-login/) - [Gitee - OAuth文档](https://gitee.com/api/v5/oauth_doc#/) [![Sponsor me](https://github.com/overtrue/overtrue/blob/master/sponsor-me.svg?raw=true)](https://github.com/sponsors/overtrue) ## Project supported by JetBrains Many thanks to Jetbrains for kindly providing a license for me to work on this and other open-source projects. [![](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](https://www.jetbrains.com/?from=https://github.com/overtrue) # PHP 扩展包开发 > 想知道如何从零开始构建 PHP 扩展包? > > 请关注我的实战课程,我会在此课程中分享一些扩展开发经验 —— [《PHP 扩展包实战教程 - 从入门到发布》](https://learnku.com/courses/creating-package) # License MIT ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/composer.json ================================================ { "name": "overtrue/socialite", "description": "A collection of OAuth 2 packages.", "keywords": [ "oauth", "social", "login", "weibo", "wechat", "qq", "feishu", "qcloud" ], "autoload": { "files": [ "src/Contracts/FactoryInterface.php", "src/Contracts/UserInterface.php", "src/Contracts/ProviderInterface.php" ], "psr-4": { "Overtrue\\Socialite\\": "src/" } }, "require": { "php": ">=8.0.2", "ext-json": "*", "ext-openssl": "*", "guzzlehttp/guzzle": "^7.0", "symfony/psr-http-message-bridge": "^2.1|^6.0" }, "require-dev": { "mockery/mockery": "^1.3", "phpunit/phpunit": "^9.0", "jetbrains/phpstorm-attributes": "^1.0", "phpstan/phpstan": "^1.7", "laravel/pint": "^1.2" }, "license": "MIT", "authors": [ { "name": "overtrue", "email": "anzhengchao@gmail.com" } ], "scripts": { "check-style": "@php vendor/bin/pint --test", "fix-style": "@php vendor/bin/pint", "test": "@php vendor/bin/phpunit --colors=always", "phpstan": "@php vendor/bin/phpstan analyse src" } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/phpstan.neon.dist ================================================ parameters: checkMissingIterableValueType: false checkGenericClassInNonGenericObjectType: false level: 8 paths: - src ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/phpunit.xml ================================================ ./tests/ ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Config.php ================================================ config = $config; } public function get(string $key, mixed $default = null): mixed { $config = $this->config; if (isset($config[$key])) { return $config[$key]; } foreach (\explode('.', $key) as $segment) { if (! \is_array($config) || ! \array_key_exists($segment, $config)) { return $default; } $config = $config[$segment]; } return $config; } public function set(string $key, mixed $value): array { $keys = \explode('.', $key); $config = &$this->config; while (\count($keys) > 1) { $key = \array_shift($keys); if (! isset($config[$key]) || ! \is_array($config[$key])) { $config[$key] = []; } $config = &$config[$key]; } $config[\array_shift($keys)] = $value; return $config; } public function has(string $key): bool { return (bool) $this->get($key); } public function offsetExists(mixed $offset): bool { \is_string($offset) || throw new Exceptions\InvalidArgumentException('The $offset must be type of string here.'); return \array_key_exists($offset, $this->config); } public function offsetGet(mixed $offset): mixed { \is_string($offset) || throw new Exceptions\InvalidArgumentException('The $offset must be type of string here.'); return $this->get($offset); } public function offsetSet(mixed $offset, mixed $value): void { \is_string($offset) || throw new Exceptions\InvalidArgumentException('The $offset must be type of string here.'); $this->set($offset, $value); } public function offsetUnset(mixed $offset): void { \is_string($offset) || throw new Exceptions\InvalidArgumentException('The $offset must be type of string here.'); $this->set($offset, null); } public function jsonSerialize(): array { return $this->config; } public function __toString(): string { return \json_encode($this, \JSON_UNESCAPED_UNICODE) ?: ''; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Contracts/FactoryInterface.php ================================================ body = (array) $body; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Exceptions/BadRequestException.php ================================================ token = $token; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Exceptions/MethodDoesNotSupportException.php ================================================ sandbox = (bool) $this->config->get('sandbox', false); if ($this->sandbox) { $this->baseUrl = 'https://openapi.alipaydev.com/gateway.do'; $this->authUrl = 'https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm'; } } protected function getAuthUrl(): string { return $this->buildAuthUrlFromBase($this->authUrl); } protected function getTokenUrl(): string { return $this->baseUrl; } /** * @throws Exceptions\BadRequestException */ protected function getUserByToken(string $token): array { $params = $this->getPublicFields('alipay.user.info.share'); $params += ['auth_token' => $token]; $params['sign'] = $this->generateSign($params); $responseInstance = $this->getHttpClient()->post( $this->baseUrl, [ 'form_params' => $params, 'headers' => [ 'Content-Type' => 'application/x-www-form-urlencoded;charset=utf-8', ], ] ); $response = $this->fromJsonBody($responseInstance); if (! empty($response['error_response'] ?? null) || empty($response['alipay_user_info_share_response'] ?? [])) { throw new Exceptions\BadRequestException((string) $responseInstance->getBody()); } return $response['alipay_user_info_share_response']; } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user['user_id'] ?? null, Contracts\ABNF_NAME => $user['nick_name'] ?? null, Contracts\ABNF_AVATAR => $user[Contracts\ABNF_AVATAR] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, ]); } /** * @throws Exceptions\BadRequestException */ public function tokenFromCode(string $code): array { $responseInstance = $this->getHttpClient()->post( $this->getTokenUrl(), [ 'form_params' => $this->getTokenFields($code), 'headers' => [ 'Content-Type' => 'application/x-www-form-urlencoded;charset=utf-8', ], ] ); $response = $this->fromJsonBody($responseInstance); if (! empty($response['error_response'])) { throw new Exceptions\BadRequestException((string) $responseInstance->getBody()); } return $this->normalizeAccessTokenResponse($response['alipay_system_oauth_token_response']); } /** * @throws Exceptions\InvalidArgumentException */ protected function getCodeFields(): array { if (empty($this->redirectUrl)) { throw new Exceptions\InvalidArgumentException('Please set the correct redirect URL refer which was on the Alipay Official Admin pannel.'); } $fields = \array_merge( [ Contracts\ABNF_APP_ID => $this->getConfig()->get(Contracts\RFC6749_ABNF_CLIENT_ID) ?? $this->getConfig()->get(Contracts\ABNF_APP_ID), Contracts\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator), Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, ], $this->parameters ); return $fields; } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { $params = $this->getPublicFields('alipay.system.oauth.token'); $params += [ Contracts\RFC6749_ABNF_CODE => $code, Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, ]; $params['sign'] = $this->generateSign($params); return $params; } #[ArrayShape([ Contracts\ABNF_APP_ID => 'string', 'format' => 'string', 'charset' => 'string', 'sign_type' => 'string', 'method' => 'string', 'timestamp' => 'string', 'version' => 'string', ])] public function getPublicFields(string $method): array { return [ Contracts\ABNF_APP_ID => $this->getConfig()->get(Contracts\RFC6749_ABNF_CLIENT_ID) ?? $this->getConfig()->get(Contracts\ABNF_APP_ID), 'format' => $this->format, 'charset' => $this->postCharset, 'sign_type' => $this->signType, 'method' => $method, 'timestamp' => (new \DateTime('now', new \DateTimeZone('Asia/Shanghai')))->format('Y-m-d H:i:s'), 'version' => $this->apiVersion, ]; } /** * @see https://opendocs.alipay.com/open/289/105656 */ protected function generateSign(array $params): string { \ksort($params); return $this->signWithSHA256RSA($this->buildParams($params), $this->getConfig()->get('rsa_private_key')); } /** * @throws Exceptions\InvalidArgumentException */ protected function signWithSHA256RSA(string $signContent, string $key): string { if (empty($key)) { throw new Exceptions\InvalidArgumentException('no RSA private key set.'); } $key = "-----BEGIN RSA PRIVATE KEY-----\n". \chunk_split($key, 64, "\n"). '-----END RSA PRIVATE KEY-----'; \openssl_sign($signContent, $signValue, $key, \OPENSSL_ALGO_SHA256); return \base64_encode($signValue); } public static function buildParams(array $params, bool $urlencode = false, array $except = ['sign']): string { $param_str = ''; foreach ($params as $k => $v) { if (\in_array($k, $except)) { continue; } $param_str .= $k.'='; $param_str .= $urlencode ? \rawurlencode($v) : $v; $param_str .= '&'; } return \rtrim($param_str, '&'); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Azure.php ================================================ buildAuthUrlFromBase($this->getBaseUrl().'/oauth2/v2.0/authorize'); } protected function getBaseUrl(): string { return 'https://login.microsoftonline.com/'.$this->config['tenant']; } protected function getTokenUrl(): string { return $this->getBaseUrl().'/oauth2/v2.0/token'; } protected function getUserByToken(string $token, ?array $query = []): array { $response = $this->getHttpClient()->get( 'https://graph.microsoft.com/v1.0/me', ['headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$token, ], ] ); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, Contracts\ABNF_NICKNAME => null, Contracts\ABNF_NAME => $user['displayName'] ?? null, Contracts\ABNF_EMAIL => $user['userPrincipalName'] ?? null, Contracts\ABNF_AVATAR => null, ]); } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [ Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, ]; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Baidu.php ================================================ display = $display; return $this; } public function withScopes(array $scopes): self { $this->scopes = $scopes; return $this; } protected function getAuthUrl(): string { return $this->buildAuthUrlFromBase($this->baseUrl.'/oauth/'.$this->version.'/authorize'); } protected function getCodeFields(): array { return [ Contracts\RFC6749_ABNF_RESPONSE_TYPE => Contracts\RFC6749_ABNF_CODE, Contracts\RFC6749_ABNF_CLIENT_ID => $this->getClientId(), Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator), 'display' => $this->display, ] + $this->parameters; } protected function getTokenUrl(): string { return $this->baseUrl.'/oauth/'.$this->version.'/token'; } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [ Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, ]; } protected function getUserByToken(string $token): array { $response = $this->getHttpClient()->get( $this->baseUrl.'/rest/'.$this->version.'/passport/users/getInfo', [ 'query' => [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $token, ], 'headers' => [ 'Accept' => 'application/json', ], ] ); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user['userid'] ?? null, Contracts\ABNF_NICKNAME => $user['realname'] ?? null, Contracts\ABNF_NAME => $user['username'] ?? null, Contracts\ABNF_EMAIL => '', Contracts\ABNF_AVATAR => $user['portrait'] ? 'http://tb.himg.baidu.com/sys/portraitn/item/'.$user['portrait'] : null, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Base.php ================================================ config = new Config($config); // set scopes if ($this->config->has('scopes') && is_array($this->config->get('scopes'))) { $this->scopes = $this->getConfig()->get('scopes'); } elseif ($this->config->has(Contracts\RFC6749_ABNF_SCOPE) && is_string($this->getConfig()->get(Contracts\RFC6749_ABNF_SCOPE))) { $this->scopes = [$this->getConfig()->get(Contracts\RFC6749_ABNF_SCOPE)]; } // normalize Contracts\RFC6749_ABNF_CLIENT_ID if (! $this->config->has(Contracts\RFC6749_ABNF_CLIENT_ID)) { $id = $this->config->get(Contracts\ABNF_APP_ID); if (null != $id) { $this->config->set(Contracts\RFC6749_ABNF_CLIENT_ID, $id); } } // normalize Contracts\RFC6749_ABNF_CLIENT_SECRET if (! $this->config->has(Contracts\RFC6749_ABNF_CLIENT_SECRET)) { $secret = $this->config->get(Contracts\ABNF_APP_SECRET); if (null != $secret) { $this->config->set(Contracts\RFC6749_ABNF_CLIENT_SECRET, $secret); } } // normalize 'redirect_url' if (! $this->config->has('redirect_url')) { $this->config->set('redirect_url', $this->config->get('redirect')); } $this->redirectUrl = $this->config->get('redirect_url'); } abstract protected function getAuthUrl(): string; abstract protected function getTokenUrl(): string; abstract protected function getUserByToken(string $token): array; abstract protected function mapUserToObject(array $user): Contracts\UserInterface; public function redirect(?string $redirectUrl = null): string { if (! empty($redirectUrl)) { $this->withRedirectUrl($redirectUrl); } return $this->getAuthUrl(); } public function userFromCode(string $code): Contracts\UserInterface { $tokenResponse = $this->tokenFromCode($code); $user = $this->userFromToken($tokenResponse[$this->accessTokenKey]); return $user->setRefreshToken($tokenResponse[$this->refreshTokenKey] ?? null) ->setExpiresIn($tokenResponse[$this->expiresInKey] ?? null) ->setTokenResponse($tokenResponse); } public function userFromToken(string $token): Contracts\UserInterface { $user = $this->getUserByToken($token); return $this->mapUserToObject($user)->setProvider($this)->setRaw($user)->setAccessToken($token); } public function tokenFromCode(string $code): array { $response = $this->getHttpClient()->post( $this->getTokenUrl(), [ 'form_params' => $this->getTokenFields($code), 'headers' => [ 'Accept' => 'application/json', ], ] ); return $this->normalizeAccessTokenResponse((string) $response->getBody()); } /** * @throws Exceptions\MethodDoesNotSupportException */ public function refreshToken(string $refreshToken): mixed { throw new Exceptions\MethodDoesNotSupportException('refreshToken does not support.'); } public function withRedirectUrl(string $redirectUrl): Contracts\ProviderInterface { $this->redirectUrl = $redirectUrl; return $this; } public function withState(string $state): Contracts\ProviderInterface { $this->state = $state; return $this; } public function scopes(array $scopes): Contracts\ProviderInterface { $this->scopes = $scopes; return $this; } public function with(array $parameters): Contracts\ProviderInterface { $this->parameters = $parameters; return $this; } public function getConfig(): Config { return $this->config; } public function withScopeSeparator(string $scopeSeparator): Contracts\ProviderInterface { $this->scopeSeparator = $scopeSeparator; return $this; } public function getClientId(): ?string { return $this->config->get(Contracts\RFC6749_ABNF_CLIENT_ID); } public function getClientSecret(): ?string { return $this->config->get(Contracts\RFC6749_ABNF_CLIENT_SECRET); } public function getHttpClient(): GuzzleClient { return $this->httpClient ?? new GuzzleClient($this->guzzleOptions); } public function setGuzzleOptions(array $config): Contracts\ProviderInterface { $this->guzzleOptions = $config; return $this; } public function getGuzzleOptions(): array { return $this->guzzleOptions; } protected function formatScopes(array $scopes, string $scopeSeparator): string { return \implode($scopeSeparator, $scopes); } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', ])] protected function getTokenFields(string $code): array { return [ Contracts\RFC6749_ABNF_CLIENT_ID => $this->getClientId(), Contracts\RFC6749_ABNF_CLIENT_SECRET => $this->getClientSecret(), Contracts\RFC6749_ABNF_CODE => $code, Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, ]; } protected function buildAuthUrlFromBase(string $url): string { $query = $this->getCodeFields() + ($this->state ? [Contracts\RFC6749_ABNF_STATE => $this->state] : []); return $url.'?'.\http_build_query($query, '', '&', $this->encodingType); } protected function getCodeFields(): array { $fields = \array_merge( [ Contracts\RFC6749_ABNF_CLIENT_ID => $this->getClientId(), Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator), Contracts\RFC6749_ABNF_RESPONSE_TYPE => Contracts\RFC6749_ABNF_CODE, ], $this->parameters ); if ($this->state) { $fields[Contracts\RFC6749_ABNF_STATE] = $this->state; } return $fields; } /** * @throws Exceptions\AuthorizeFailedException */ protected function normalizeAccessTokenResponse(mixed $response): array { if ($response instanceof StreamInterface) { $response->tell() && $response->rewind(); $response = (string) $response; } if (\is_string($response)) { $response = Utils::jsonDecode($response, true); } if (! \is_array($response)) { throw new Exceptions\AuthorizeFailedException('Invalid token response', [$response]); } if (empty($response[$this->accessTokenKey])) { throw new Exceptions\AuthorizeFailedException('Authorize Failed: '.Utils::jsonEncode($response, \JSON_UNESCAPED_UNICODE), $response); } return $response + [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $response[$this->accessTokenKey], Contracts\RFC6749_ABNF_REFRESH_TOKEN => $response[$this->refreshTokenKey] ?? null, Contracts\RFC6749_ABNF_EXPIRES_IN => \intval($response[$this->expiresInKey] ?? 0), ]; } protected function fromJsonBody(MessageInterface $response): array { $result = Utils::jsonDecode((string) $response->getBody(), true); \is_array($result) || throw new Exceptions\InvalidArgumentException('Decoded the given response payload failed.'); return $result; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Coding.php ================================================ config->get('team_url'); if (! $teamUrl) { throw new InvalidArgumentException('Missing required config [team_url]'); } // validate team_url if (filter_var($teamUrl, FILTER_VALIDATE_URL) === false) { throw new InvalidArgumentException('Invalid team_url'); } $this->teamUrl = rtrim($teamUrl, '/'); } protected function getAuthUrl(): string { return $this->buildAuthUrlFromBase("$this->teamUrl/oauth_authorize.html"); } protected function getTokenUrl(): string { return "$this->teamUrl/api/oauth/access_token"; } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'null|string', ])] protected function getTokenFields(string $code): array { return [ Contracts\RFC6749_ABNF_CLIENT_ID => $this->getClientId(), Contracts\RFC6749_ABNF_CLIENT_SECRET => $this->getClientSecret(), Contracts\RFC6749_ABNF_CODE => $code, Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, ]; } /** * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Overtrue\Socialite\Exceptions\BadRequestException */ protected function getUserByToken(string $token): array { $responseInstance = $this->getHttpClient()->get( "$this->teamUrl/api/me", [ 'query' => [ 'access_token' => $token, ], ] ); $response = $this->fromJsonBody($responseInstance); if (empty($response[Contracts\ABNF_ID])) { throw new Exceptions\BadRequestException((string) $responseInstance->getBody()); } return $response; } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, Contracts\ABNF_NICKNAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, Contracts\ABNF_AVATAR => $user[Contracts\ABNF_AVATAR] ?? null, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/DingTalk.php ================================================ buildAuthUrlFromBase('https://oapi.dingtalk.com/connect/qrconnect'); } /** * @throws Exceptions\InvalidArgumentException */ protected function getTokenUrl(): string { throw new Exceptions\InvalidArgumentException('not supported to get access token.'); } /** * @throws Exceptions\InvalidArgumentException */ protected function getUserByToken(string $token): array { throw new Exceptions\InvalidArgumentException('Unable to use token get User.'); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_NAME => $user['nick'] ?? null, Contracts\ABNF_NICKNAME => $user['nick'] ?? null, Contracts\ABNF_ID => $user[Contracts\ABNF_OPEN_ID] ?? null, Contracts\ABNF_EMAIL => null, Contracts\ABNF_AVATAR => null, ]); } protected function getCodeFields(): array { return array_merge( [ 'appid' => $this->getClientId(), Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, Contracts\RFC6749_ABNF_CODE => $this->formatScopes($this->scopes, $this->scopeSeparator), Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, ], $this->parameters ); } public function getClientId(): ?string { return $this->getConfig()->get(Contracts\ABNF_APP_ID) ?? $this->getConfig()->get('appid') ?? $this->getConfig()->get('appId') ?? $this->getConfig()->get(Contracts\RFC6749_ABNF_CLIENT_ID); } public function getClientSecret(): ?string { return $this->getConfig()->get(Contracts\ABNF_APP_SECRET) ?? $this->getConfig()->get('appSecret') ?? $this->getConfig()->get(Contracts\RFC6749_ABNF_CLIENT_SECRET); } protected function createSignature(int $time): string { return \base64_encode(\hash_hmac('sha256', (string) $time, (string) $this->getClientSecret(), true)); } /** * @see https://ding-doc.dingtalk.com/doc#/personnal/tmudue * * @throws Exceptions\BadRequestException */ public function userFromCode(string $code): Contracts\UserInterface { $time = (int) \microtime(true) * 1000; $responseInstance = $this->getHttpClient()->post($this->getUserByCode, [ 'query' => [ 'accessKey' => $this->getClientId(), 'timestamp' => $time, 'signature' => $this->createSignature($time), ], 'json' => ['tmp_auth_code' => $code], ]); $response = $this->fromJsonBody($responseInstance); if (0 != ($response['errcode'] ?? 1)) { throw new Exceptions\BadRequestException((string) $responseInstance->getBody()); } return new User([ Contracts\ABNF_NAME => $response['user_info']['nick'], Contracts\ABNF_NICKNAME => $response['user_info']['nick'], Contracts\ABNF_ID => $response['user_info'][Contracts\ABNF_OPEN_ID], ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/DouYin.php ================================================ buildAuthUrlFromBase($this->baseUrl.'/platform/oauth/connect/'); } #[ArrayShape([ 'client_key' => 'null|string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_SCOPE => 'string', Contracts\RFC6749_ABNF_RESPONSE_TYPE => 'string', ])] public function getCodeFields(): array { return [ 'client_key' => $this->getClientId(), Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator), Contracts\RFC6749_ABNF_RESPONSE_TYPE => Contracts\RFC6749_ABNF_CODE, ]; } protected function getTokenUrl(): string { return $this->baseUrl.'/oauth/access_token/'; } /** * @throws Exceptions\AuthorizeFailedException */ public function tokenFromCode(string $code): array { $response = $this->getHttpClient()->get( $this->getTokenUrl(), [ 'query' => $this->getTokenFields($code), ] ); $body = $this->fromJsonBody($response); if (empty($body['data'] ?? null) || ($body['data']['error_code'] ?? -1) != 0) { throw new Exceptions\AuthorizeFailedException('Invalid token response', $body); } $this->withOpenId($body['data'][Contracts\ABNF_OPEN_ID]); return $this->normalizeAccessTokenResponse($body['data']); } #[ArrayShape([ 'client_key' => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return [ 'client_key' => $this->getClientId(), Contracts\RFC6749_ABNF_CLIENT_SECRET => $this->getClientSecret(), Contracts\RFC6749_ABNF_CODE => $code, Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, ]; } /** * @throws Exceptions\InvalidArgumentException */ protected function getUserByToken(string $token): array { $userUrl = $this->baseUrl.'/oauth/userinfo/'; if (empty($this->openId)) { throw new Exceptions\InvalidArgumentException('please set the `open_id` before issue the API request.'); } $response = $this->getHttpClient()->get( $userUrl, [ 'query' => [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $token, Contracts\ABNF_OPEN_ID => $this->openId, ], ] ); $body = $this->fromJsonBody($response); return $body['data'] ?? []; } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_OPEN_ID] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NICKNAME] ?? null, Contracts\ABNF_NICKNAME => $user[Contracts\ABNF_NICKNAME] ?? null, Contracts\ABNF_AVATAR => $user[Contracts\ABNF_AVATAR] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, ]); } public function withOpenId(string $openId): self { $this->openId = $openId; return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Douban.php ================================================ buildAuthUrlFromBase('https://www.douban.com/service/auth2/auth'); } protected function getTokenUrl(): string { return 'https://www.douban.com/service/auth2/token'; } /** * @param string $token * @param ?array $query */ protected function getUserByToken(string $token, ?array $query = []): array { $response = $this->getHttpClient()->get('https://api.douban.com/v2/user/~me', [ 'headers' => [ 'Authorization' => 'Bearer '.$token, ], ]); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, Contracts\ABNF_NICKNAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_AVATAR => $user[Contracts\ABNF_AVATAR] ?? null, Contracts\ABNF_EMAIL => null, ]); } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE]; } public function tokenFromCode(string $code): array { $response = $this->getHttpClient()->post($this->getTokenUrl(), [ 'form_params' => $this->getTokenFields($code), ]); return $this->normalizeAccessTokenResponse($response->getBody()); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Facebook.php ================================================ buildAuthUrlFromBase('https://www.facebook.com/'.$this->version.'/dialog/oauth'); } protected function getTokenUrl(): string { return $this->graphUrl.'/oauth/access_token'; } public function tokenFromCode(string $code): array { $response = $this->getHttpClient()->get($this->getTokenUrl(), [ 'query' => $this->getTokenFields($code), ]); return $this->normalizeAccessTokenResponse($response->getBody()); } protected function getUserByToken(string $token, ?array $query = []): array { $appSecretProof = \hash_hmac('sha256', $token, $this->getConfig()->get(Contracts\RFC6749_ABNF_CLIENT_SECRET)); $response = $this->getHttpClient()->get($this->graphUrl.'/'.$this->version.'/me', [ 'query' => [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $token, 'appsecret_proof' => $appSecretProof, 'fields' => $this->formatScopes($this->fields, $this->scopeSeparator), ], 'headers' => [ 'Accept' => 'application/json', ], ]); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { $userId = $user[Contracts\ABNF_ID] ?? null; $avatarUrl = $this->graphUrl.'/'.$this->version.'/'.$userId.'/picture'; $firstName = $user['first_name'] ?? null; $lastName = $user['last_name'] ?? null; return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, Contracts\ABNF_NICKNAME => null, Contracts\ABNF_NAME => $firstName.' '.$lastName, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, Contracts\ABNF_AVATAR => $userId ? $avatarUrl.'?type=normal' : null, 'avatar_original' => $userId ? $avatarUrl.'?width=1920' : null, ]); } protected function getCodeFields(): array { $fields = parent::getCodeFields(); if ($this->popup) { $fields['display'] = 'popup'; } return $fields; } public function fields(array $fields): self { $this->fields = $fields; return $this; } public function asPopup(): self { $this->popup = true; return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/FeiShu.php ================================================ isInternalApp = ($this->config->get('app_mode') ?? $this->config->get('mode')) == 'internal'; } protected function getAuthUrl(): string { return $this->buildAuthUrlFromBase($this->baseUrl.'/authen/v1/index'); } #[ArrayShape([Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\ABNF_APP_ID => 'null|string'])] protected function getCodeFields(): array { return [ Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\ABNF_APP_ID => $this->getClientId(), ]; } protected function getTokenUrl(): string { return $this->baseUrl.'/authen/v1/access_token'; } public function tokenFromCode(string $code): array { return $this->normalizeAccessTokenResponse($this->getTokenFromCode($code)); } /** * @throws Exceptions\AuthorizeFailedException */ protected function getTokenFromCode(string $code): array { $this->configAppAccessToken(); $responseInstance = $this->getHttpClient()->post($this->getTokenUrl(), [ 'json' => [ 'app_access_token' => $this->config->get('app_access_token'), Contracts\RFC6749_ABNF_CODE => $code, Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, ], ]); $response = $this->fromJsonBody($responseInstance); if (empty($response['data'] ?? null)) { throw new Exceptions\AuthorizeFailedException('Invalid token response', $response); } return $this->normalizeAccessTokenResponse($response['data']); } protected function getRefreshTokenUrl(): string { return $this->baseUrl.'/authen/v1/refresh_access_token'; } /** * @see https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/authen-v1/authen/refresh_access_token */ public function refreshToken(string $refreshToken): array { $this->configAppAccessToken(); $responseInstance = $this->getHttpClient()->post($this->getRefreshTokenUrl(), [ 'json' => [ 'app_access_token' => $this->config->get('app_access_token'), Contracts\RFC6749_ABNF_REFRESH_TOKEN => $refreshToken, Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_REFRESH_TOKEN, ], ]); $response = $this->fromJsonBody($responseInstance); if (empty($response['data'] ?? null)) { throw new Exceptions\AuthorizeFailedException('Invalid token response', $response); } return $this->normalizeAccessTokenResponse($response['data']); } /** * @throws Exceptions\BadRequestException */ protected function getUserByToken(string $token): array { $responseInstance = $this->getHttpClient()->get($this->baseUrl.'/authen/v1/user_info', [ 'headers' => [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer '.$token, ], 'query' => \array_filter( [ 'user_access_token' => $token, ] ), ]); $response = $this->fromJsonBody($responseInstance); if (empty($response['data'] ?? null)) { throw new Exceptions\BadRequestException((string) $responseInstance->getBody()); } return $response['data']; } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user['user_id'] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_NICKNAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_AVATAR => $user['avatar_url'] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, ]); } public function withInternalAppMode(): self { $this->isInternalApp = true; return $this; } public function withDefaultMode(): self { $this->isInternalApp = false; return $this; } /** * set self::APP_TICKET in config attribute */ public function withAppTicket(string $appTicket): self { $this->config->set(self::APP_TICKET, $appTicket); return $this; } /** * 设置 app_access_token 到 config 设置中 * 应用维度授权凭证,开放平台可据此识别调用方的应用身份 * 分内建和自建 * * @throws Exceptions\FeiShu\InvalidTicketException * @throws Exceptions\InvalidTokenException */ protected function configAppAccessToken(): self { $url = $this->baseUrl.'/auth/v3/app_access_token/'; $params = [ 'json' => [ Contracts\ABNF_APP_ID => $this->config->get(Contracts\RFC6749_ABNF_CLIENT_ID), Contracts\ABNF_APP_SECRET => $this->config->get(Contracts\RFC6749_ABNF_CLIENT_SECRET), self::APP_TICKET => $this->config->get(self::APP_TICKET), ], ]; if ($this->isInternalApp) { $url = $this->baseUrl.'/auth/v3/app_access_token/internal/'; $params = [ 'json' => [ Contracts\ABNF_APP_ID => $this->config->get(Contracts\RFC6749_ABNF_CLIENT_ID), Contracts\ABNF_APP_SECRET => $this->config->get(Contracts\RFC6749_ABNF_CLIENT_SECRET), ], ]; } if (! $this->isInternalApp && ! $this->config->has(self::APP_TICKET)) { throw new Exceptions\FeiShu\InvalidTicketException('You are using default mode, please config \'app_ticket\' first'); } $responseInstance = $this->getHttpClient()->post($url, $params); $response = $this->fromJsonBody($responseInstance); if (empty($response['app_access_token'] ?? null)) { throw new Exceptions\InvalidTokenException('Invalid \'app_access_token\' response', (string) $responseInstance->getBody()); } $this->config->set('app_access_token', $response['app_access_token']); return $this; } /** * 设置 tenant_access_token 到 config 属性中 * 应用的企业授权凭证,开放平台据此识别调用方的应用身份和企业身份 * 分内建和自建 * * @throws Exceptions\BadRequestException * @throws Exceptions\AuthorizeFailedException */ protected function configTenantAccessToken(): self { $url = $this->baseUrl.'/auth/v3/tenant_access_token/'; $params = [ 'json' => [ Contracts\ABNF_APP_ID => $this->config->get(Contracts\RFC6749_ABNF_CLIENT_ID), Contracts\ABNF_APP_SECRET => $this->config->get(Contracts\RFC6749_ABNF_CLIENT_SECRET), self::APP_TICKET => $this->config->get(self::APP_TICKET), ], ]; if ($this->isInternalApp) { $url = $this->baseUrl.'/auth/v3/tenant_access_token/internal/'; $params = [ 'json' => [ Contracts\ABNF_APP_ID => $this->config->get(Contracts\RFC6749_ABNF_CLIENT_ID), Contracts\ABNF_APP_SECRET => $this->config->get(Contracts\RFC6749_ABNF_CLIENT_SECRET), ], ]; } if (! $this->isInternalApp && ! $this->config->has(self::APP_TICKET)) { throw new Exceptions\BadRequestException('You are using default mode, please config \'app_ticket\' first'); } $response = $this->getHttpClient()->post($url, $params); $response = $this->fromJsonBody($response); if (empty($response['tenant_access_token'])) { throw new Exceptions\AuthorizeFailedException('Invalid tenant_access_token response', $response); } $this->config->set('tenant_access_token', $response['tenant_access_token']); return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Figma.php ================================================ buildAuthUrlFromBase('https://www.figma.com/oauth'); } protected function getTokenUrl(): string { return 'https://www.figma.com/api/oauth/token'; } public function tokenFromCode(string $code): array { $response = $this->getHttpClient()->post($this->getTokenUrl(), [ 'form_params' => $this->getTokenFields($code), ]); return $this->normalizeAccessTokenResponse($response->getBody()); } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE]; } protected function getCodeFields(): array { return parent::getCodeFields() + [Contracts\RFC6749_ABNF_STATE => \md5(\uniqid('state_', true))]; } protected function getUserByToken(string $token, ?array $query = []): array { $response = $this->getHttpClient()->get('https://api.figma.com/v1/me', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$token, ], ]); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, 'username' => $user[Contracts\ABNF_EMAIL] ?? null, Contracts\ABNF_NICKNAME => $user['handle'] ?? null, Contracts\ABNF_NAME => $user['handle'] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, Contracts\ABNF_AVATAR => $user['img_url'] ?? null, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/GitHub.php ================================================ buildAuthUrlFromBase('https://github.com/login/oauth/authorize'); } protected function getTokenUrl(): string { return 'https://github.com/login/oauth/access_token'; } protected function getUserByToken(string $token): array { $userUrl = 'https://api.github.com/user'; $response = $this->getHttpClient()->get( $userUrl, $this->createAuthorizationHeaders($token) ); $user = $this->fromJsonBody($response); if (\in_array('user:email', $this->scopes)) { $user[Contracts\ABNF_EMAIL] = $this->getEmailByToken($token); } return $user; } protected function getEmailByToken(string $token): string { $emailsUrl = 'https://api.github.com/user/emails'; try { $response = $this->getHttpClient()->get( $emailsUrl, $this->createAuthorizationHeaders($token) ); } catch (\Throwable $e) { return ''; } foreach ($this->fromJsonBody($response) as $email) { if ($email['primary'] && $email['verified']) { return $email[Contracts\ABNF_EMAIL]; } } return ''; } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, Contracts\ABNF_NICKNAME => $user['login'] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, Contracts\ABNF_AVATAR => $user['avatar_url'] ?? null, ]); } #[ArrayShape(['headers' => 'array'])] protected function createAuthorizationHeaders(string $token): array { return [ 'headers' => [ 'Accept' => 'application/vnd.github.v3+json', 'Authorization' => \sprintf('token %s', $token), ], ]; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Gitee.php ================================================ buildAuthUrlFromBase('https://gitee.com/oauth/authorize'); } protected function getTokenUrl(): string { return 'https://gitee.com/oauth/token'; } protected function getUserByToken(string $token): array { $userUrl = 'https://gitee.com/api/v5/user'; $response = $this->getHttpClient()->get($userUrl, [ 'query' => [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $token, ], ]); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, Contracts\ABNF_NICKNAME => $user['login'] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, Contracts\ABNF_AVATAR => $user['avatar_url'] ?? null, ]); } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return [ Contracts\RFC6749_ABNF_CLIENT_ID => $this->getClientId(), Contracts\RFC6749_ABNF_CLIENT_SECRET => $this->getClientSecret(), Contracts\RFC6749_ABNF_CODE => $code, Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, ]; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Google.php ================================================ buildAuthUrlFromBase('https://accounts.google.com/o/oauth2/v2/auth'); } protected function getTokenUrl(): string { return 'https://www.googleapis.com/oauth2/v4/token'; } public function tokenFromCode(string $code): array { $response = $this->getHttpClient()->post($this->getTokenUrl(), [ 'form_params' => $this->getTokenFields($code), ]); return $this->normalizeAccessTokenResponse($response->getBody()); } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE]; } protected function getUserByToken(string $token, ?array $query = []): array { $response = $this->getHttpClient()->get('https://www.googleapis.com/userinfo/v2/me', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$token, ], ]); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, 'username' => $user[Contracts\ABNF_EMAIL] ?? null, Contracts\ABNF_NICKNAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, Contracts\ABNF_AVATAR => $user['picture'] ?? null, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Lark.php ================================================ state = $this->state ?: \md5(\uniqid(Contracts\RFC6749_ABNF_STATE, true)); return $this->buildAuthUrlFromBase('https://access.line.me/oauth2/'.$this->version.'/authorize'); } protected function getTokenUrl(): string { return $this->baseUrl.$this->version.'/token'; } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE]; } protected function getUserByToken(string $token): array { $response = $this->getHttpClient()->get( 'https://api.line.me/v2/profile', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$token, ], ] ); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user['userId'] ?? null, Contracts\ABNF_NAME => $user['displayName'] ?? null, Contracts\ABNF_NICKNAME => $user['displayName'] ?? null, Contracts\ABNF_AVATAR => $user['pictureUrl'] ?? null, Contracts\ABNF_EMAIL => null, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Linkedin.php ================================================ buildAuthUrlFromBase('https://www.linkedin.com/oauth/v2/authorization'); } protected function getTokenUrl(): string { return 'https://www.linkedin.com/oauth/v2/accessToken'; } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE]; } protected function getUserByToken(string $token, ?array $query = []): array { $basicProfile = $this->getBasicProfile($token); $emailAddress = $this->getEmailAddress($token); return \array_merge($basicProfile, $emailAddress); } protected function getBasicProfile(string $token): array { $url = 'https://api.linkedin.com/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams))'; $response = $this->getHttpClient()->get($url, [ 'headers' => [ 'Authorization' => 'Bearer ' . $token, 'X-RestLi-Protocol-Version' => '2.0.0', ], ]); return $this->fromJsonBody($response); } protected function getEmailAddress(string $token): array { $url = 'https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))'; $response = $this->getHttpClient()->get($url, [ 'headers' => [ 'Authorization' => 'Bearer ' . $token, 'X-RestLi-Protocol-Version' => '2.0.0', ], ]); return $this->fromJsonBody($response)['elements'][0]['handle~'] ?? []; } protected function mapUserToObject(array $user): Contracts\UserInterface { $preferredLocale = ($user['firstName']['preferredLocale']['language'] ?? null) . '_' . ($user['firstName']['preferredLocale']['country'] ?? null); $firstName = $user['firstName']['localized'][$preferredLocale] ?? null; $lastName = $user['lastName']['localized'][$preferredLocale] ?? null; $name = $firstName . ' ' . $lastName; $images = $user['profilePicture']['displayImage~']['elements'] ?? []; $avatars = \array_filter($images, static fn ($image) => ($image['data']['com.linkedin.digitalmedia.mediaartifact.StillImage']['storageSize']['width'] ?? 0) === 100); $avatar = \array_shift($avatars); $originalAvatars = \array_filter($images, static fn ($image) => ($image['data']['com.linkedin.digitalmedia.mediaartifact.StillImage']['storageSize']['width'] ?? 0) === 800); $originalAvatar = \array_shift($originalAvatars); return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, Contracts\ABNF_NICKNAME => $name, Contracts\ABNF_NAME => $name, Contracts\ABNF_EMAIL => $user['emailAddress'] ?? null, Contracts\ABNF_AVATAR => $avatar['identifiers']['0']['identifier'] ?? null, 'avatar_original' => $originalAvatar['identifiers']['0']['identifier'] ?? null, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/OpenWeWork.php ================================================ getConfig()->has('base_url')) { $this->baseUrl = $this->getConfig()->get('base_url'); } } public function withAgentId(int $agentId): self { $this->agentId = $agentId; return $this; } public function detailed(): self { $this->detailed = true; return $this; } public function asQrcode(): self { $this->asQrcode = true; return $this; } public function withUserType(string $userType): self { $this->userType = $userType; return $this; } public function withLang(string $lang): self { $this->lang = $lang; return $this; } /** * @throws GuzzleException * @throws AuthorizeFailedException */ public function userFromCode(string $code): Contracts\UserInterface { $user = $this->getUser($this->getSuiteAccessToken(), $code); if ($this->detailed) { $user = \array_merge($user, $this->getUserByTicket($user['user_ticket'])); } return $this->mapUserToObject($user)->setProvider($this)->setRaw($user); } public function withSuiteTicket(string $suiteTicket): self { $this->suiteTicket = $suiteTicket; return $this; } public function withSuiteAccessToken(string $suiteAccessToken): self { $this->suiteAccessToken = $suiteAccessToken; return $this; } /** * @throws Exceptions\InvalidArgumentException */ public function getAuthUrl(): string { $queries = \array_filter([ 'appid' => $this->getClientId(), Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\RFC6749_ABNF_RESPONSE_TYPE => Contracts\RFC6749_ABNF_CODE, Contracts\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator), Contracts\RFC6749_ABNF_STATE => $this->state, 'agentid' => $this->agentId, ]); if ($this->asQrcode) { $queries = array_filter([ 'appid' => $queries['appid'] ?? $this->getClientId(), 'redirect_uri' => $queries['redirect_uri'] ?? $this->redirectUrl, 'usertype' => $this->userType, 'lang' => $this->lang, 'state' => $this->state, ]); return \sprintf('https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?%s', http_build_query($queries)); } return \sprintf('https://open.weixin.qq.com/connect/oauth2/authorize?%s#wechat_redirect', \http_build_query($queries)); } /** * @throws Exceptions\MethodDoesNotSupportException */ protected function getUserByToken(string $token): array { throw new Exceptions\MethodDoesNotSupportException('Open WeWork doesn\'t support access_token mode'); } protected function getSuiteAccessToken(): string { return $this->suiteAccessToken ?? $this->suiteAccessToken = $this->requestSuiteAccessToken(); } /** * @throws Exceptions\AuthorizeFailedException|GuzzleException */ protected function getUser(string $token, string $code): array { $responseInstance = $this->getHttpClient()->get( $this->baseUrl.'/cgi-bin/service/getuserinfo3rd', [ 'query' => \array_filter( [ 'suite_access_token' => $token, Contracts\RFC6749_ABNF_CODE => $code, ] ), ] ); $response = $this->fromJsonBody($responseInstance); if (($response['errcode'] ?? 1) > 0 || (empty($response['UserId']) && empty($response['openid']))) { throw new Exceptions\AuthorizeFailedException((string) $responseInstance->getBody(), $response); } elseif (empty($response['user_ticket'])) { $this->detailed = false; } return $response; } /** * @throws Exceptions\AuthorizeFailedException * @throws GuzzleException */ protected function getUserByTicket(string $userTicket): array { $responseInstance = $this->getHttpClient()->post( $this->baseUrl.'/cgi-bin/service/auth/getuserdetail3rd', [ 'query' => [ 'suite_access_token' => $this->getSuiteAccessToken(), ], 'json' => [ 'user_ticket' => $userTicket, ], ], ); $response = $this->fromJsonBody($responseInstance); if (($response['errcode'] ?? 1) > 0 || empty($response['userid'])) { throw new Exceptions\AuthorizeFailedException((string) $responseInstance->getBody(), $response); } return $response; } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User($this->detailed ? [ Contracts\ABNF_ID => $user['userid'] ?? $user['UserId'] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_AVATAR => $user[Contracts\ABNF_AVATAR] ?? null, 'gender' => $user['gender'] ?? null, 'corpid' => $user['corpid'] ?? $user['CorpId'] ?? null, 'open_userid' => $user['open_userid'] ?? null, 'qr_code' => $user['qr_code'] ?? null, ] : [ Contracts\ABNF_ID => $user['userid'] ?? $user['UserId'] ?? $user['OpenId'] ?? $user['openid'] ?? null, 'corpid' => $user['CorpId'] ?? null, 'open_userid' => $user['open_userid'] ?? null, ]); } /** * @throws Exceptions\AuthorizeFailedException * @throws GuzzleException */ protected function requestSuiteAccessToken(): string { $responseInstance = $this->getHttpClient()->post( $this->baseUrl.'/cgi-bin/service/get_suite_token', [ 'json' => [ 'suite_id' => $this->config->get('suite_id') ?? $this->config->get('client_id'), 'suite_secret' => $this->config->get('suite_secret') ?? $this->config->get('client_secret'), 'suite_ticket' => $this->suiteTicket, ], ] ); $response = $this->fromJsonBody($responseInstance); if (isset($response['errcode']) && $response['errcode'] > 0) { throw new Exceptions\AuthorizeFailedException((string) $responseInstance->getBody(), $response); } return $response['suite_access_token']; } protected function getTokenUrl(): string { return ''; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Outlook.php ================================================ buildAuthUrlFromBase('https://login.microsoftonline.com/common/oauth2/v2.0/authorize'); } protected function getTokenUrl(): string { return 'https://login.microsoftonline.com/common/oauth2/v2.0/token'; } protected function getUserByToken(string $token, ?array $query = []): array { $response = $this->getHttpClient()->get( 'https://graph.microsoft.com/v1.0/me', ['headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$token, ], ] ); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, Contracts\ABNF_NICKNAME => null, Contracts\ABNF_NAME => $user['displayName'] ?? null, Contracts\ABNF_EMAIL => $user['userPrincipalName'] ?? null, Contracts\ABNF_AVATAR => null, ]); } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE]; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/QCloud.php ================================================ buildAuthUrlFromBase('https://cloud.tencent.com/open/authorize'); } protected function getTokenUrl(): string { return ''; } protected function getAppId(): string { return $this->config->get(Contracts\ABNF_APP_ID) ?? $this->getClientId(); } protected function getSecretId(): string { return $this->config->get('secret_id'); } protected function getSecretKey(): string { return $this->config->get('secret_key'); } public function TokenFromCode(string $code): array { $response = $this->performRequest( 'GET', 'open.tencentcloudapi.com', 'GetUserAccessToken', '2018-12-25', [ 'query' => [ 'UserAuthCode' => $code, ], ] ); return $this->parseAccessToken($response); } /** * @throws Exceptions\AuthorizeFailedException */ protected function getUserByToken(string $token): array { $secret = $this->getFederationToken($token); return $this->performRequest( 'GET', 'open.tencentcloudapi.com', 'GetUserBaseInfo', '2018-12-25', [ 'headers' => [ 'X-TC-Token' => $secret['Token'], ], ], $secret['TmpSecretId'], $secret['TmpSecretKey'], ); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $this->openId ?? null, Contracts\ABNF_NAME => $user['Nickname'] ?? null, Contracts\ABNF_NICKNAME => $user['Nickname'] ?? null, ]); } /** * @throws Exceptions\AuthorizeFailedException */ public function performRequest(string $method, string $host, string $action, string $version, array $options = [], ?string $secretId = null, ?string $secretKey = null): array { $method = \strtoupper($method); $timestamp = \time(); $credential = \sprintf('%s/%s/tc3_request', \gmdate('Y-m-d', $timestamp), $this->getServiceFromHost($host)); $options['headers'] = \array_merge( $options['headers'] ?? [], [ 'X-TC-Action' => $action, 'X-TC-Timestamp' => $timestamp, 'X-TC-Version' => $version, 'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8', ] ); $signature = $this->sign($method, $host, $options['query'] ?? [], '', $options['headers'], $credential, $secretKey); $options['headers']['Authorization'] = \sprintf( 'TC3-HMAC-SHA256 Credential=%s/%s, SignedHeaders=content-type;host, Signature=%s', $secretId ?? $this->getSecretId(), $credential, $signature ); $response = $this->getHttpClient()->get("https://{$host}/", $options); $response = $this->fromJsonBody($response); if (! empty($response['Response']['Error'])) { throw new Exceptions\AuthorizeFailedException( \sprintf('%s: %s', $response['Response']['Error']['Code'], $response['Response']['Error']['Message']), $response ); } return $response['Response'] ?? []; } protected function sign(string $requestMethod, string $host, array $query, string $payload, array $headers, string $credential, ?string $secretKey = null): bool|string { $canonicalRequestString = \implode( "\n", [ $requestMethod, '/', \http_build_query($query), "content-type:{$headers['Content-Type']}\nhost:{$host}\n", 'content-type;host', \hash('SHA256', $payload), ] ); $signString = \implode( "\n", [ 'TC3-HMAC-SHA256', $headers['X-TC-Timestamp'], $credential, \hash('SHA256', $canonicalRequestString), ] ); $secretKey = $secretKey ?? $this->getSecretKey(); $secretDate = \hash_hmac('SHA256', \gmdate('Y-m-d', $headers['X-TC-Timestamp']), "TC3{$secretKey}", true); $secretService = \hash_hmac('SHA256', $this->getServiceFromHost($host), $secretDate, true); $secretSigning = \hash_hmac('SHA256', 'tc3_request', $secretService, true); return \hash_hmac('SHA256', $signString, $secretSigning); } /** * @throws Exceptions\AuthorizeFailedException */ protected function parseAccessToken(array|string $body): array { if (! \is_array($body)) { $body = \json_decode($body, true); } if (empty($body['UserOpenId'] ?? null)) { throw new Exceptions\AuthorizeFailedException('Authorize Failed: '.\json_encode($body, JSON_UNESCAPED_UNICODE), $body); } $this->openId = $body['UserOpenId'] ?? null; $this->unionId = $body['UserUnionId'] ?? null; return $body; } /** * @throws Exceptions\AuthorizeFailedException */ protected function getFederationToken(string $accessToken): array { $response = $this->performRequest( 'GET', 'sts.tencentcloudapi.com', 'GetThirdPartyFederationToken', '2018-08-13', [ 'query' => [ 'UserAccessToken' => $accessToken, 'Duration' => 7200, 'ApiAppId' => 0, ], 'headers' => [ 'X-TC-Region' => 'ap-guangzhou', // 官方人员说写死 ], ] ); if (empty($response['Credentials'] ?? null)) { throw new Exceptions\AuthorizeFailedException('Get Federation Token failed.', $response); } return $response['Credentials']; } protected function getCodeFields(): array { $fields = \array_merge( [ Contracts\ABNF_APP_ID => $this->getAppId(), Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator), Contracts\RFC6749_ABNF_RESPONSE_TYPE => Contracts\RFC6749_ABNF_CODE, ], $this->parameters ); if ($this->state) { $fields[Contracts\RFC6749_ABNF_STATE] = $this->state; } return $fields; } protected function getServiceFromHost(string $host): string { return \explode('.', $host)[0] ?? ''; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/QQ.php ================================================ buildAuthUrlFromBase($this->baseUrl.'/oauth2.0/authorize'); } protected function getTokenUrl(): string { return $this->baseUrl.'/oauth2.0/token'; } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE]; } public function tokenFromCode(string $code): array { $response = $this->getHttpClient()->get($this->getTokenUrl(), [ 'query' => $this->getTokenFields($code), ]); \parse_str((string) $response->getBody(), $token); return $this->normalizeAccessTokenResponse($token); } public function withUnionId(): self { $this->withUnionId = true; return $this; } /** * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Overtrue\Socialite\Exceptions\AuthorizeFailedException */ protected function getUserByToken(string $token): array { $response = $this->getHttpClient()->get($this->baseUrl.'/oauth2.0/me', [ 'query' => [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $token, 'fmt' => 'json', ] + ($this->withUnionId ? ['unionid' => 1] : []), ]); $me = $this->fromJsonBody($response); $response = $this->getHttpClient()->get($this->baseUrl.'/user/get_user_info', [ 'query' => [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $token, 'fmt' => 'json', 'openid' => $me['openid'], 'oauth_consumer_key' => $this->getClientId(), ], ]); $user = $this->fromJsonBody($response); if (! array_key_exists('ret', $user) || $user['ret'] !== 0) { throw new AuthorizeFailedException('Authorize Failed: '.Utils::jsonEncode($user, \JSON_UNESCAPED_UNICODE), $user); } return $user + [ 'unionid' => $me['unionid'] ?? null, 'openid' => $me['openid'] ?? null, ]; } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user['openid'] ?? null, Contracts\ABNF_NAME => $user['nickname'] ?? null, Contracts\ABNF_NICKNAME => $user['nickname'] ?? null, Contracts\ABNF_EMAIL => $user['email'] ?? null, Contracts\ABNF_AVATAR => $user['figureurl_qq_2'] ?? null, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Taobao.php ================================================ view = $view; return $this; } protected function getAuthUrl(): string { return $this->buildAuthUrlFromBase($this->baseUrl.'/authorize'); } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', 'view' => 'string', Contracts\RFC6749_ABNF_RESPONSE_TYPE => 'string', ])] public function getCodeFields(): array { return [ Contracts\RFC6749_ABNF_CLIENT_ID => $this->getClientId(), Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, 'view' => $this->view, Contracts\RFC6749_ABNF_RESPONSE_TYPE => Contracts\RFC6749_ABNF_CODE, ]; } protected function getTokenUrl(): string { return $this->baseUrl.'/token'; } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', 'view' => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [ Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, 'view' => $this->view, ]; } public function tokenFromCode(string $code): array { $response = $this->getHttpClient()->post($this->getTokenUrl(), [ 'query' => $this->getTokenFields($code), ]); return $this->normalizeAccessTokenResponse($response->getBody()); } protected function getUserByToken(string $token, ?array $query = []): array { $response = $this->getHttpClient()->post($this->getUserInfoUrl($this->gatewayUrl, $token)); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_OPEN_ID] ?? null, Contracts\ABNF_NICKNAME => $user['nick'] ?? null, Contracts\ABNF_NAME => $user['nick'] ?? null, Contracts\ABNF_AVATAR => $user[Contracts\ABNF_AVATAR] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, ]); } protected function generateSign(array $params): string { \ksort($params); $stringToBeSigned = $this->getConfig()->get(Contracts\RFC6749_ABNF_CLIENT_SECRET); foreach ($params as $k => $v) { if (! \is_array($v) && ! \str_starts_with($v, '@')) { $stringToBeSigned .= "$k$v"; } } $stringToBeSigned .= $this->getConfig()->get(Contracts\RFC6749_ABNF_CLIENT_SECRET); return \strtoupper(\md5($stringToBeSigned)); } protected function getPublicFields(string $token, array $apiFields = []): array { $fields = [ 'app_key' => $this->getClientId(), 'sign_method' => 'md5', 'session' => $token, 'timestamp' => (new \DateTime('now', new \DateTimeZone('Asia/Shanghai')))->format('Y-m-d H:i:s'), 'v' => '2.0', 'format' => 'json', ]; $fields = \array_merge($apiFields, $fields); $fields['sign'] = $this->generateSign($fields); return $fields; } protected function getUserInfoUrl(string $url, string $token): string { $apiFields = ['method' => 'taobao.miniapp.userInfo.get']; $query = \http_build_query($this->getPublicFields($token, $apiFields), '', '&', $this->encodingType); return $url.'?'.$query; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Tapd.php ================================================ buildAuthUrlFromBase($this->baseUrl.'/quickstart/testauth'); } protected function getTokenUrl(): string { return $this->baseUrl.'/tokens/request_token'; } protected function getRefreshTokenUrl(): string { return $this->baseUrl.'/tokens/refresh_token'; } public function tokenFromCode(string $code): array { $response = $this->getHttpClient()->post($this->getTokenUrl(), [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Basic '.\base64_encode(\sprintf('%s:%s', $this->getClientId(), $this->getClientSecret())), ], 'form_params' => $this->getTokenFields($code), ]); return $this->normalizeAccessTokenResponse($response->getBody()); } #[ArrayShape([ Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', ])] protected function getTokenFields(string $code): array { return [ Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\RFC6749_ABNF_CODE => $code, ]; } #[ArrayShape([ Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_REFRESH_TOKEN => 'string', ])] protected function getRefreshTokenFields(string $refreshToken): array { return [ Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_REFRESH_TOKEN, Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\RFC6749_ABNF_REFRESH_TOKEN => $refreshToken, ]; } public function tokenFromRefreshToken(string $refreshToken): array { $response = $this->getHttpClient()->post($this->getRefreshTokenUrl(), [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Basic '.\base64_encode(\sprintf('%s:%s', $this->getClientId(), $this->getClientSecret())), ], 'form_params' => $this->getRefreshTokenFields($refreshToken), ]); return $this->normalizeAccessTokenResponse((string) $response->getBody()); } protected function getUserByToken(string $token): array { $response = $this->getHttpClient()->get($this->baseUrl.'/users/info', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$token, ], ]); return $this->fromJsonBody($response); } /** * @throws Exceptions\BadRequestException */ protected function mapUserToObject(array $user): Contracts\UserInterface { if (! isset($user['status']) && $user['status'] != 1) { throw new Exceptions\BadRequestException('用户信息获取失败'); } return new User([ Contracts\ABNF_ID => $user['data'][Contracts\ABNF_ID] ?? null, Contracts\ABNF_NICKNAME => $user['data']['nick'] ?? null, Contracts\ABNF_NAME => $user['data'][Contracts\ABNF_NAME] ?? null, Contracts\ABNF_EMAIL => $user['data'][Contracts\ABNF_EMAIL] ?? null, Contracts\ABNF_AVATAR => $user['data'][Contracts\ABNF_AVATAR] ?? null, ]); } /** * @throws Exceptions\AuthorizeFailedException */ protected function normalizeAccessTokenResponse(mixed $response): array { if ($response instanceof StreamInterface) { $response->rewind(); $response = (string) $response; } if (\is_string($response)) { $response = \json_decode($response, true) ?? []; } if (! \is_array($response)) { throw new Exceptions\AuthorizeFailedException('Invalid token response', [$response]); } if (empty($response['data'][$this->accessTokenKey] ?? null)) { throw new Exceptions\AuthorizeFailedException('Authorize Failed: '.\json_encode($response, JSON_UNESCAPED_UNICODE), $response); } return $response + [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $response['data'][$this->accessTokenKey], Contracts\RFC6749_ABNF_REFRESH_TOKEN => $response['data'][$this->refreshTokenKey] ?? null, Contracts\RFC6749_ABNF_EXPIRES_IN => \intval($response['data'][$this->expiresInKey] ?? 0), ]; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/TouTiao.php ================================================ buildAuthUrlFromBase($this->baseUrl.'/oauth/authorize/'); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_OPEN_ID] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NICKNAME] ?? null, Contracts\ABNF_NICKNAME => $user[Contracts\ABNF_NICKNAME] ?? null, Contracts\ABNF_AVATAR => $user[Contracts\ABNF_AVATAR] ?? null, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/WeChat.php ================================================ getConfig()->has('component')) { $this->prepareForComponent((array) $this->getConfig()->get('component')); } } public function withOpenid(string $openid): self { $this->openid = $openid; return $this; } public function withCountryCode(): self { $this->withCountryCode = true; return $this; } public function tokenFromCode(string $code): array { $response = $this->getTokenFromCode($code); return $this->normalizeAccessTokenResponse($response->getBody()); } /** * @param array $componentConfig [Contracts\ABNF_ID => xxx, Contracts\ABNF_TOKEN => xxx] */ public function withComponent(array $componentConfig): self { $this->prepareForComponent($componentConfig); return $this; } public function getComponent(): ?array { return $this->component; } protected function getAuthUrl(): string { $path = 'oauth2/authorize'; if (\in_array('snsapi_login', $this->scopes)) { $path = 'qrconnect'; } return $this->buildAuthUrlFromBase("https://open.weixin.qq.com/connect/{$path}"); } protected function buildAuthUrlFromBase(string $url): string { $query = \http_build_query($this->getCodeFields(), '', '&', $this->encodingType); return $url.'?'.$query.'#wechat_redirect'; } protected function getCodeFields(): array { if (! empty($this->component)) { $this->with(\array_merge($this->parameters, ['component_appid' => $this->component[Contracts\ABNF_ID]])); } return \array_merge([ 'appid' => $this->getClientId(), Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\RFC6749_ABNF_RESPONSE_TYPE => Contracts\RFC6749_ABNF_CODE, Contracts\RFC6749_ABNF_SCOPE => $this->formatScopes($this->scopes, $this->scopeSeparator), Contracts\RFC6749_ABNF_STATE => $this->state ?: \md5(\uniqid(Contracts\RFC6749_ABNF_STATE, true)), 'connect_redirect' => 1, ], $this->parameters); } protected function getTokenUrl(): string { return \sprintf($this->baseUrl.'/oauth2%s/access_token', empty($this->component) ? '' : '/component'); } public function userFromCode(string $code): Contracts\UserInterface { if (\in_array('snsapi_base', $this->scopes)) { return $this->mapUserToObject($this->fromJsonBody($this->getTokenFromCode($code))); } $token = $this->tokenFromCode($code); $this->withOpenid($token['openid']); $user = $this->userFromToken($token[$this->accessTokenKey]); return $user->setRefreshToken($token[Contracts\RFC6749_ABNF_REFRESH_TOKEN]) ->setExpiresIn($token[Contracts\RFC6749_ABNF_EXPIRES_IN]) ->setTokenResponse($token); } protected function getUserByToken(string $token): array { $language = $this->withCountryCode ? null : (isset($this->parameters['lang']) ? $this->parameters['lang'] : 'zh_CN'); $response = $this->getHttpClient()->get($this->baseUrl.'/userinfo', [ 'query' => \array_filter([ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $token, 'openid' => $this->openid, 'lang' => $language, ]), ]); return $this->fromJsonBody($response); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user['openid'] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NICKNAME] ?? null, Contracts\ABNF_NICKNAME => $user[Contracts\ABNF_NICKNAME] ?? null, Contracts\ABNF_AVATAR => $user['headimgurl'] ?? null, Contracts\ABNF_EMAIL => null, ]); } protected function getTokenFields(string $code): array { return empty($this->component) ? [ 'appid' => $this->getClientId(), 'secret' => $this->getClientSecret(), Contracts\RFC6749_ABNF_CODE => $code, Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, ] : [ 'appid' => $this->getClientId(), 'component_appid' => $this->component[Contracts\ABNF_ID], 'component_access_token' => $this->component[Contracts\ABNF_TOKEN], Contracts\RFC6749_ABNF_CODE => $code, Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, ]; } protected function getTokenFromCode(string $code): ResponseInterface { return $this->getHttpClient()->get($this->getTokenUrl(), [ 'headers' => ['Accept' => 'application/json'], 'query' => $this->getTokenFields($code), ]); } /** * @throws Exceptions\InvalidArgumentException */ protected function prepareForComponent(array $component): void { $config = []; foreach ($component as $key => $value) { if (\is_callable($value)) { $value = \call_user_func($value, $this); } switch ($key) { case Contracts\ABNF_ID: case Contracts\ABNF_APP_ID: case 'component_app_id': $config[Contracts\ABNF_ID] = $value; break; case Contracts\ABNF_TOKEN: case Contracts\RFC6749_ABNF_ACCESS_TOKEN: case 'app_token': case 'component_access_token': $config[Contracts\ABNF_TOKEN] = $value; break; } } if (2 !== \count($config)) { throw new Exceptions\InvalidArgumentException('Please check your config arguments were available.'); } if (1 === \count($this->scopes) && \in_array('snsapi_login', $this->scopes)) { $this->scopes = ['snsapi_base']; } $this->component = $config; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/WeWork.php ================================================ getConfig()->has('base_url')) { $this->baseUrl = $this->getConfig()->get('base_url'); } if ($this->getConfig()->has('agent_id')) { $this->agentId = $this->getConfig()->get('agent_id'); } } public function getBaseUrl(): ?string { return $this->baseUrl; } public function userFromCode(string $code): Contracts\UserInterface { $token = $this->getApiAccessToken(); $user = $this->getUser($token, $code); if ($this->detailed) { $user = $this->getUserById($user['UserId']); } return $this->mapUserToObject($user)->setProvider($this)->setRaw($user); } public function withAgentId(int $agentId): self { $this->agentId = $agentId; return $this; } public function detailed(): self { $this->detailed = true; return $this; } public function asQrcode(): self { $this->asQrcode = true; return $this; } public function withApiAccessToken(string $apiAccessToken): self { $this->apiAccessToken = $apiAccessToken; return $this; } public function getAuthUrl(): string { $scopes = $this->formatScopes($this->scopes, $this->scopeSeparator); $queries = array_filter([ 'appid' => $this->getClientId(), 'agentid' => $this->agentId, Contracts\RFC6749_ABNF_REDIRECT_URI => $this->redirectUrl, Contracts\RFC6749_ABNF_RESPONSE_TYPE => Contracts\RFC6749_ABNF_CODE, Contracts\RFC6749_ABNF_SCOPE => $scopes, Contracts\RFC6749_ABNF_STATE => $this->state, ]); if (! $this->agentId && (str_contains($scopes, 'snsapi_privateinfo') || $this->asQrcode)) { throw new Exceptions\InvalidArgumentException("agent_id is require when qrcode mode or scopes is 'snsapi_privateinfo'"); } if ($this->asQrcode) { unset($queries[Contracts\RFC6749_ABNF_SCOPE]); return \sprintf('https://open.work.weixin.qq.com/wwopen/sso/qrConnect?%s', http_build_query($queries)); } return \sprintf('https://open.weixin.qq.com/connect/oauth2/authorize?%s#wechat_redirect', \http_build_query($queries)); } /** * @throws Exceptions\MethodDoesNotSupportException */ protected function getUserByToken(string $token): array { throw new Exceptions\MethodDoesNotSupportException('WeWork doesn\'t support access_token mode'); } protected function getApiAccessToken(): string { return $this->apiAccessToken ?? $this->apiAccessToken = $this->requestApiAccessToken(); } protected function getUser(string $token, string $code): array { $responseInstance = $this->getHttpClient()->get( $this->baseUrl.'/cgi-bin/user/getuserinfo', [ 'query' => \array_filter( [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $token, Contracts\RFC6749_ABNF_CODE => $code, ] ), ] ); $response = $this->fromJsonBody($responseInstance); if (($response['errcode'] ?? 1) > 0 || (empty($response['UserId']) && empty($response['OpenId']))) { throw new Exceptions\AuthorizeFailedException((string) $responseInstance->getBody(), $response); } elseif (empty($response['UserId'])) { $this->detailed = false; } return $response; } /** * @throws Exceptions\AuthorizeFailedException */ protected function getUserById(string $userId): array { $responseInstance = $this->getHttpClient()->post($this->baseUrl.'/cgi-bin/user/get', [ 'query' => [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $this->getApiAccessToken(), 'userid' => $userId, ], ]); $response = $this->fromJsonBody($responseInstance); if (($response['errcode'] ?? 1) > 0 || empty($response['userid'])) { throw new Exceptions\AuthorizeFailedException((string) $responseInstance->getBody(), $response); } return $response; } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User($this->detailed ? [ Contracts\ABNF_ID => $user['userid'] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_AVATAR => $user[Contracts\ABNF_AVATAR] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, ] : [ Contracts\ABNF_ID => $user['UserId'] ?? null ?: $user['OpenId'] ?? null, ]); } /** * @throws Exceptions\AuthorizeFailedException */ protected function requestApiAccessToken(): string { $responseInstance = $this->getHttpClient()->get($this->baseUrl.'/cgi-bin/gettoken', [ 'query' => \array_filter( [ 'corpid' => $this->config->get('corp_id') ?? $this->config->get('corpid') ?? $this->config->get(Contracts\RFC6749_ABNF_CLIENT_ID), 'corpsecret' => $this->config->get('corp_secret') ?? $this->config->get('corpsecret') ?? $this->config->get(Contracts\RFC6749_ABNF_CLIENT_SECRET), ] ), ]); $response = $this->fromJsonBody($responseInstance); if (($response['errcode'] ?? 1) > 0) { throw new Exceptions\AuthorizeFailedException((string) $responseInstance->getBody(), $response); } return $response[Contracts\RFC6749_ABNF_ACCESS_TOKEN]; } protected function getTokenUrl(): string { return ''; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/Weibo.php ================================================ buildAuthUrlFromBase($this->baseUrl.'/oauth2/authorize'); } protected function getTokenUrl(): string { return $this->baseUrl.'/2/oauth2/access_token'; } #[ArrayShape([ Contracts\RFC6749_ABNF_CLIENT_ID => 'null|string', Contracts\RFC6749_ABNF_CLIENT_SECRET => 'null|string', Contracts\RFC6749_ABNF_CODE => 'string', Contracts\RFC6749_ABNF_REDIRECT_URI => 'null|string', Contracts\RFC6749_ABNF_GRANT_TYPE => 'string', ])] protected function getTokenFields(string $code): array { return parent::getTokenFields($code) + [ Contracts\RFC6749_ABNF_GRANT_TYPE => Contracts\RFC6749_ABNF_AUTHORATION_CODE, ]; } /** * @throws Exceptions\InvalidTokenException */ protected function getUserByToken(string $token): array { $uid = $this->getTokenPayload($token)['uid'] ?? null; if (empty($uid)) { throw new Exceptions\InvalidTokenException('Invalid token.', $token); } $response = $this->getHttpClient()->get($this->baseUrl.'/2/users/show.json', [ 'query' => [ 'uid' => $uid, Contracts\RFC6749_ABNF_ACCESS_TOKEN => $token, ], 'headers' => [ 'Accept' => 'application/json', ], ]); return $this->fromJsonBody($response); } /** * @throws Exceptions\InvalidTokenException */ protected function getTokenPayload(string $token): array { $response = $this->getHttpClient()->post($this->baseUrl.'/oauth2/get_token_info', [ 'query' => [ Contracts\RFC6749_ABNF_ACCESS_TOKEN => $token, ], 'headers' => [ 'Accept' => 'application/json', ], ]); $response = $this->fromJsonBody($response); if (empty($response['uid'] ?? null)) { throw new Exceptions\InvalidTokenException(\sprintf('Invalid token %s', $token), $token); } return $response; } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_ID] ?? null, Contracts\ABNF_NICKNAME => $user['screen_name'] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NAME] ?? null, Contracts\ABNF_EMAIL => $user[Contracts\ABNF_EMAIL] ?? null, Contracts\ABNF_AVATAR => $user['avatar_large'] ?? null, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Providers/XiGua.php ================================================ buildAuthUrlFromBase($this->baseUrl.'/oauth/connect'); } #[Pure] protected function mapUserToObject(array $user): Contracts\UserInterface { return new User([ Contracts\ABNF_ID => $user[Contracts\ABNF_OPEN_ID] ?? null, Contracts\ABNF_NAME => $user[Contracts\ABNF_NICKNAME] ?? null, Contracts\ABNF_NICKNAME => $user[Contracts\ABNF_NICKNAME] ?? null, Contracts\ABNF_AVATAR => $user[Contracts\ABNF_AVATAR] ?? null, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/SocialiteManager.php ================================================ Providers\Alipay::class, Providers\Azure::NAME => Providers\Azure::class, Providers\Coding::NAME => Providers\Coding::class, Providers\DingTalk::NAME => Providers\DingTalk::class, Providers\DouYin::NAME => Providers\DouYin::class, Providers\Douban::NAME => Providers\Douban::class, Providers\Facebook::NAME => Providers\Facebook::class, Providers\FeiShu::NAME => Providers\FeiShu::class, Providers\Figma::NAME => Providers\Figma::class, Providers\GitHub::NAME => Providers\GitHub::class, Providers\Gitee::NAME => Providers\Gitee::class, Providers\Google::NAME => Providers\Google::class, Providers\Lark::NAME => Providers\Lark::class, Providers\Line::NAME => Providers\Line::class, Providers\Linkedin::NAME => Providers\Linkedin::class, Providers\OpenWeWork::NAME => Providers\OpenWeWork::class, Providers\Outlook::NAME => Providers\Outlook::class, Providers\QCloud::NAME => Providers\QCloud::class, Providers\QQ::NAME => Providers\QQ::class, Providers\Taobao::NAME => Providers\Taobao::class, Providers\Tapd::NAME => Providers\Tapd::class, Providers\TouTiao::NAME => Providers\TouTiao::class, Providers\WeChat::NAME => Providers\WeChat::class, Providers\WeWork::NAME => Providers\WeWork::class, Providers\Weibo::NAME => Providers\Weibo::class, Providers\XiGua::NAME => Providers\XiGua::class, ]; #[Pure] public function __construct(array $config) { $this->config = new Config($config); } public function config(Config $config): self { $this->config = $config; return $this; } public function create(string $name): Contracts\ProviderInterface { $name = \strtolower($name); if (! isset($this->resolved[$name])) { $this->resolved[$name] = $this->createProvider($name); } return $this->resolved[$name]; } public function extend(string $name, Closure $callback): self { self::$customCreators[\strtolower($name)] = $callback; return $this; } public function getResolvedProviders(): array { return $this->resolved; } public function buildProvider(string $provider, array $config): Contracts\ProviderInterface { $instance = new $provider($config); $instance instanceof Contracts\ProviderInterface || throw new Exceptions\InvalidArgumentException("The {$provider} must be instanceof ProviderInterface."); return $instance; } /** * @throws Exceptions\InvalidArgumentException */ protected function createProvider(string $name): Contracts\ProviderInterface { $config = $this->config->get($name, []); $provider = $config['provider'] ?? $name; if (isset(self::$customCreators[$provider])) { return $this->callCustomCreator($provider, $config); } if (! $this->isValidProvider($provider)) { throw new Exceptions\InvalidArgumentException("Provider [{$name}] not supported."); } return $this->buildProvider(self::PROVIDERS[$provider] ?? $provider, $config); } protected function callCustomCreator(string $name, array $config): Contracts\ProviderInterface { return self::$customCreators[$name]($config); } protected function isValidProvider(string $provider): bool { return isset(self::PROVIDERS[$provider]) || \is_subclass_of($provider, Contracts\ProviderInterface::class); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/Traits/HasAttributes.php ================================================ attributes; } public function getAttribute(string $name, mixed $default = null): mixed { return $this->attributes[$name] ?? $default; } public function setAttribute(string $name, mixed $value): self { $this->attributes[$name] = $value; return $this; } public function merge(array $attributes): self { $this->attributes = \array_merge($this->attributes, $attributes); return $this; } public function offsetExists(mixed $offset): bool { return \array_key_exists($offset, $this->attributes); } public function offsetGet(mixed $offset): mixed { return $this->getAttribute($offset); } public function offsetSet(mixed $offset, mixed $value): void { $this->setAttribute($offset, $value); } public function offsetUnset(mixed $offset): void { unset($this->attributes[$offset]); } public function __get(string $property): mixed { return $this->getAttribute($property); } #[Pure] public function toArray(): array { return $this->getAttributes(); } public function toJSON(): string { $result = \json_encode($this->getAttributes(), JSON_UNESCAPED_UNICODE); false === $result && throw new Exceptions\Exception('Cannot Processing this instance as JSON stringify.'); return $result; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/src/User.php ================================================ attributes = $attributes; } public function getId(): mixed { return $this->getAttribute(Contracts\ABNF_ID) ?? $this->getEmail(); } public function getNickname(): ?string { return $this->getAttribute(Contracts\ABNF_NICKNAME) ?? $this->getName(); } public function getName(): ?string { return $this->getAttribute(Contracts\ABNF_NAME); } public function getEmail(): ?string { return $this->getAttribute(Contracts\ABNF_EMAIL); } public function getAvatar(): ?string { return $this->getAttribute(Contracts\ABNF_AVATAR); } public function setAccessToken(string $value): self { $this->setAttribute(Contracts\RFC6749_ABNF_ACCESS_TOKEN, $value); return $this; } public function getAccessToken(): ?string { return $this->getAttribute(Contracts\RFC6749_ABNF_ACCESS_TOKEN); } public function setRefreshToken(?string $value): self { $this->setAttribute(Contracts\RFC6749_ABNF_REFRESH_TOKEN, $value); return $this; } public function getRefreshToken(): ?string { return $this->getAttribute(Contracts\RFC6749_ABNF_REFRESH_TOKEN); } public function setExpiresIn(int $value): self { $this->setAttribute(Contracts\RFC6749_ABNF_EXPIRES_IN, $value); return $this; } public function getExpiresIn(): ?int { return $this->getAttribute(Contracts\RFC6749_ABNF_EXPIRES_IN); } public function setRaw(array $user): self { $this->setAttribute('raw', $user); return $this; } public function getRaw(): array { return $this->getAttribute('raw', []); } public function setTokenResponse(array $response): self { $this->setAttribute('token_response', $response); return $this; } public function getTokenResponse(): mixed { return $this->getAttribute('token_response'); } public function jsonSerialize(): array { return $this->attributes; } public function __serialize(): array { return $this->attributes; } public function __unserialize(array $serialized): void { $this->attributes = $serialized ?: []; } public function getProvider(): Contracts\ProviderInterface { return $this->provider ?? throw new Exceptions\Exception('The provider instance doesn\'t initialized correctly.'); } public function setProvider(Contracts\ProviderInterface $provider): self { $this->provider = $provider; return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/tests/OAuthTest.php ================================================ 'fake_client_id', 'client_secret' => 'fake_client_secret', ]; $provider = new OAuthTestProviderStub($config); $this->assertSame('http://auth.url?client_id=fake_client_id&scope=info&response_type=code', $provider->redirect()); } public function test_it_can_get_auth_url_with_redirect() { // 手动配置 $config = [ 'client_id' => 'fake_client_id', 'client_secret' => 'fake_client_secret', ]; $provider = new OAuthTestProviderStub($config); $this->assertSame('http://auth.url?client_id=fake_client_id&redirect_uri=fake_redirect&scope=info&response_type=code', $provider->redirect('fake_redirect')); // 用配置属性配置 $config += ['redirect_url' => 'fake_redirect']; $provider = new OAuthTestProviderStub($config); $this->assertSame('http://auth.url?client_id=fake_client_id&redirect_uri=fake_redirect&scope=info&response_type=code', $provider->redirect('fake_redirect')); } public function test_it_can_get_auth_url_with_scopes() { $config = [ 'client_id' => 'fake_client_id', 'client_secret' => 'fake_client_secret', ]; $provider = new OAuthTestProviderStub($config); $url = $provider->scopes(['test_info', 'test_email'])->redirect(); $this->assertSame('http://auth.url?client_id=fake_client_id&scope=test_info%2Ctest_email&response_type=code', $url); // 切换scope分割符 $url = $provider->scopes(['test_info', 'test_email'])->withScopeSeparator(' ')->redirect(); $this->assertSame('http://auth.url?client_id=fake_client_id&scope=test_info%20test_email&response_type=code', $url); } public function test_it_can_get_auth_url_with_state() { $config = [ 'client_id' => 'fake_client_id', 'client_secret' => 'fake_client_secret', ]; $provider = new OAuthTestProviderStub($config); $url = $provider->withState(123456)->redirect(); $this->assertSame('http://auth.url?client_id=fake_client_id&scope=info&response_type=code&state=123456', $url); } public function test_it_can_get_token() { $config = [ 'client_id' => 'fake_client_id', 'client_secret' => 'fake_client_secret', ]; $provider = new OAuthTestProviderStub($config); $response = m::mock(\Psr\Http\Message\ResponseInterface::class); $response->shouldReceive('getBody')->andReturn($response); $response->shouldReceive('__toString')->andReturn(\json_encode([ 'access_token' => 'fake_access_token', 'refresh_token' => 'fake_refresh_token', 'expires_in' => 123456, ])); $provider->getHttpClient()->shouldReceive('post')->with('http://token.url', [ 'form_params' => [ 'client_id' => 'fake_client_id', 'client_secret' => 'fake_client_secret', 'code' => 'fake_code', 'redirect_uri' => null, ], 'headers' => [ 'Accept' => 'application/json', ], ])->andReturn($response); $this->assertSame([ 'access_token' => 'fake_access_token', 'refresh_token' => 'fake_refresh_token', 'expires_in' => 123456, ], $provider->tokenFromCode('fake_code')); } public function test_it_can_get_user_by_token() { $config = [ 'client_id' => 'fake_client_id', 'client_secret' => 'fake_client_secret', ]; $provider = new OAuthTestProviderStub($config); $user = $provider->userFromToken('fake_access_token'); $this->assertSame('foo', $user->getId()); $this->assertSame(['id' => 'foo'], $user->getRaw()); $this->assertSame('fake_access_token', $user->getAccessToken()); } public function test_it_can_get_user_by_code() { $config = [ 'client_id' => 'fake_client_id', 'client_secret' => 'fake_client_secret', ]; $provider = new OAuthTestProviderStub($config); $response = m::mock(\Psr\Http\Message\ResponseInterface::class); $response->shouldReceive('getBody')->andReturn($response); $response->shouldReceive('__toString')->andReturn(\json_encode([ 'access_token' => 'fake_access_token', 'refresh_token' => 'fake_refresh_token', 'expires_in' => 123456, ])); $provider->getHttpClient()->shouldReceive('post')->with('http://token.url', [ 'form_params' => [ 'client_id' => 'fake_client_id', 'client_secret' => 'fake_client_secret', 'code' => 'fake_code', 'redirect_uri' => null, ], 'headers' => [ 'Accept' => 'application/json', ], ])->andReturn($response); $this->assertSame([ 'access_token' => 'fake_access_token', 'refresh_token' => 'fake_refresh_token', 'expires_in' => 123456, ], $provider->tokenFromCode('fake_code')); $user = $provider->userFromCode('fake_code'); $tokenResponse = [ 'access_token' => 'fake_access_token', 'refresh_token' => 'fake_refresh_token', 'expires_in' => 123456, ]; $this->assertSame('foo', $user->getId()); $this->assertSame($tokenResponse, $user->getTokenResponse()); $this->assertSame('fake_access_token', $user->getAccessToken()); $this->assertSame('fake_refresh_token', $user->getRefreshToken()); } } class OAuthTestProviderStub extends Base { public $http; protected array $scopes = ['info']; protected int $encodingType = PHP_QUERY_RFC3986; protected function getAuthUrl(): string { $url = 'http://auth.url'; return $this->buildAuthUrlFromBase($url); } protected function getTokenUrl(): string { return 'http://token.url'; } protected function getUserByToken(string $token): array { return ['id' => 'foo']; } protected function mapUserToObject(array $user): User { return new User(['id' => $user['id']]); } /** * Get a fresh instance of the Guzzle HTTP client. * * @return \GuzzleHttp\Client */ public function getHttpClient(): GuzzleHttp\Client { if ($this->http) { return $this->http; } return $this->http = m::mock(\GuzzleHttp\Client::class); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/tests/Providers/FeiShuTest.php ================================================ 'xxxxx', 'app_secret' => 'yyyyy', 'app_mode' => 'internal', ]; $f = new FeiShu($config); $rf = new \ReflectionObject($f); $this->assertEquals('xxxxx', $f->getClientId()); $this->assertEquals('yyyyy', $f->getClientSecret()); $rfProperty = $rf->getProperty('isInternalApp'); $rfProperty->setAccessible(true); $this->assertEquals(true, $rfProperty->getValue($f)); // diff filed way $config = [ 'client_id' => 'xxxxx', 'client_secret' => 'yyyyy', 'mode' => 'internal', ]; $f = new FeiShu($config); $rf = new \ReflectionObject($f); $this->assertEquals('xxxxx', $f->getClientId()); $this->assertEquals('yyyyy', $f->getClientSecret()); $rfProperty = $rf->getProperty('isInternalApp'); $rfProperty->setAccessible(true); $this->assertEquals(true, $rfProperty->getValue($f)); // no mode config way $config = [ 'client_id' => 'xxxxx', 'client_secret' => 'yyyyy', ]; $f = new FeiShu($config); $rf = new \ReflectionObject($f); $this->assertEquals('xxxxx', $f->getClientId()); $this->assertEquals('yyyyy', $f->getClientSecret()); $rfProperty = $rf->getProperty('isInternalApp'); $rfProperty->setAccessible(true); $this->assertEquals(false, $rfProperty->getValue($f)); } public function testProviderWithInternalAppModeWork() { $config = [ 'client_id' => 'xxxxx', 'client_secret' => 'yyyyy', ]; $f = new FeiShu($config); $rf = new \ReflectionObject($f); $rfProperty = $rf->getProperty('isInternalApp'); $rfProperty->setAccessible(true); $f->withInternalAppMode(); $this->assertEquals(true, $rfProperty->getValue($f)); $f->withDefaultMode(); $this->assertEquals(false, $rfProperty->getValue($f)); } public function testProviderWithAppTicketWork() { $config = [ 'client_id' => 'xxxxx', 'client_secret' => 'yyyyy', ]; $f = new FeiShu($config); $f->withAppTicket('app_ticket'); $this->assertEquals('app_ticket', $f->getConfig()->get('app_ticket')); } public function testConfigAppAccessTokenWithDefaultModeNoAppTicketWork() { $config = [ 'client_id' => 'xxxxx', 'client_secret' => 'yyyyy', ]; $f = new FeiShu($config); $fr = new \ReflectionObject($f); $frClient = $fr->getProperty('httpClient'); $frClient->setAccessible(true); $ff = new \ReflectionMethod(FeiShu::class, 'configAppAccessToken'); $mock = new MockHandler([ new Response(403, []), new Response(200, [], \json_encode([ 'app_access_token' => 'app_access_token', ])), ]); $handler = HandlerStack::create($mock); $client = new Client(['handler' => $handler]); $frClient->setValue($f, $client); $ff->setAccessible(true); // 默认模式下没有 app_ticket $this->expectException(InvalidTicketException::class); $ff->invoke($f); $ff->invoke($f); $f->withAppTicket('app_ticket'); $this->assertEquals('app_access_token', $f->getConfig()->get('app_access_token')); $this->expectException(InvalidTokenException::class); $ff->invoke($f); } public function testConfigAppAccessTokenWithDefaultModeAndAppTicketWorkInBadResponse() { $config = [ 'client_id' => 'xxxxx', 'client_secret' => 'yyyyy', ]; $f = new FeiShu($config); $fr = new \ReflectionObject($f); $frClient = $fr->getProperty('httpClient'); $frClient->setAccessible(true); $ff = new \ReflectionMethod(FeiShu::class, 'configAppAccessToken'); $mock = new MockHandler([ new Response(200, [], '{}'), ]); $handler = HandlerStack::create($mock); $client = new Client(['handler' => $handler]); $frClient->setValue($f, $client); $ff->setAccessible(true); $this->expectException(InvalidTokenException::class); $ff->invoke($f->withAppTicket('app_ticket')); } public function testConfigAppAccessTokenWithDefaultModeAndAppTicketWorkInGoodResponse() { $config = [ 'client_id' => 'xxxxx', 'client_secret' => 'yyyyy', ]; $f = new FeiShu($config); $fr = new \ReflectionObject($f); $frClient = $fr->getProperty('httpClient'); $frClient->setAccessible(true); $ff = new \ReflectionMethod(FeiShu::class, 'configAppAccessToken'); $mock = new MockHandler([ new Response(200, [], \json_encode([ 'app_access_token' => 'app_access_token', ])), ]); $handler = HandlerStack::create($mock); $client = new Client(['handler' => $handler]); $frClient->setValue($f, $client); $ff->setAccessible(true); $this->assertEquals(null, $f->getConfig()->get('app_access_token')); $ff->invoke($f->withAppTicket('app_ticket')); $this->assertEquals('app_access_token', $f->getConfig()->get('app_access_token')); } public function testConfigAppAccessTokenWithInternalInBadResponse() { $config = [ 'client_id' => 'xxxxx', 'client_secret' => 'yyyyy', 'mode' => 'internal', ]; $f = new FeiShu($config); $fr = new \ReflectionObject($f); $frClient = $fr->getProperty('httpClient'); $frClient->setAccessible(true); $ff = new \ReflectionMethod(FeiShu::class, 'configAppAccessToken'); $mock = new MockHandler([ new Response(200, [], '{}'), ]); $handler = HandlerStack::create($mock); $client = new Client(['handler' => $handler]); $frClient->setValue($f, $client); $ff->setAccessible(true); $this->expectException(InvalidTokenException::class); $ff->invoke($f); } public function testConfigAppAccessTokenWithInternalInGoodResponse() { $config = [ 'client_id' => 'xxxxx', 'client_secret' => 'yyyyy', 'mode' => 'internal', ]; $f = new FeiShu($config); $fr = new \ReflectionObject($f); $frClient = $fr->getProperty('httpClient'); $frClient->setAccessible(true); $ff = new \ReflectionMethod(FeiShu::class, 'configAppAccessToken'); $mock = new MockHandler([ new Response(200, [], \json_encode([ 'app_access_token' => 'app_access_token', ])), ]); $handler = HandlerStack::create($mock); $client = new Client(['handler' => $handler]); $frClient->setValue($f, $client); $ff->setAccessible(true); $this->assertEquals(null, $f->getConfig()->get('app_access_token')); $ff->invoke($f); $this->assertEquals('app_access_token', $f->getConfig()->get('app_access_token')); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/tests/Providers/WeWorkTest.php ================================================ 'CORPID', 'client_secret' => 'client_secret', 'redirect' => 'REDIRECT_URI', ])) ->scopes(['snsapi_base']) ->redirect(); $this->assertSame('https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base#wechat_redirect', $response); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/tests/Providers/WechatTest.php ================================================ 'client_id', 'client_secret' => 'client_secret', 'redirect_url' => 'http://localhost/socialite/callback.php', ]))->redirect(); $this->assertStringStartsWith('https://open.weixin.qq.com/connect/qrconnect', $response); $this->assertMatchesRegularExpression('/redirect_uri=http%3A%2F%2Flocalhost%2Fsocialite%2Fcallback.php/', $response); } public function testWeChatProviderTokenUrlAndRequestFields() { $provider = new WeChat([ 'client_id' => 'client_id', 'client_secret' => 'client_secret', 'redirect_url' => 'http://localhost/socialite/callback.php', ]); $getTokenUrl = new ReflectionMethod(WeChat::class, 'getTokenUrl'); $getTokenUrl->setAccessible(true); $getTokenFields = new ReflectionMethod(WeChat::class, 'getTokenFields'); $getTokenFields->setAccessible(true); $getCodeFields = new ReflectionMethod(WeChat::class, 'getCodeFields'); $getCodeFields->setAccessible(true); $this->assertSame('https://api.weixin.qq.com/sns/oauth2/access_token', $getTokenUrl->invoke($provider)); $this->assertSame([ 'appid' => 'client_id', 'secret' => 'client_secret', 'code' => 'iloveyou', 'grant_type' => 'authorization_code', ], $getTokenFields->invoke($provider, 'iloveyou')); $this->assertSame([ 'appid' => 'client_id', 'redirect_uri' => 'http://localhost/socialite/callback.php', 'response_type' => 'code', 'scope' => 'snsapi_login', 'state' => 'wechat-state', 'connect_redirect' => 1, ], $getCodeFields->invoke($provider->withState('wechat-state'))); } public function testOpenPlatformComponent() { $provider = new WeChat([ 'client_id' => 'client_id', 'client_secret' => null, 'redirect' => 'redirect-url', 'component' => [ 'id' => 'component-app-id', 'token' => 'token', ], ]); $getTokenUrl = new ReflectionMethod(WeChat::class, 'getTokenUrl'); $getTokenUrl->setAccessible(true); $getTokenFields = new ReflectionMethod(WeChat::class, 'getTokenFields'); $getTokenFields->setAccessible(true); $getCodeFields = new ReflectionMethod(WeChat::class, 'getCodeFields'); $getCodeFields->setAccessible(true); $this->assertSame([ 'appid' => 'client_id', 'redirect_uri' => 'redirect-url', 'response_type' => 'code', 'scope' => 'snsapi_base', 'state' => 'state', 'connect_redirect' => 1, 'component_appid' => 'component-app-id', ], $getCodeFields->invoke($provider->withState('state'))); $this->assertSame([ 'appid' => 'client_id', 'component_appid' => 'component-app-id', 'component_access_token' => 'token', 'code' => 'simcode', 'grant_type' => 'authorization_code', ], $getTokenFields->invoke($provider, 'simcode')); $this->assertSame('https://api.weixin.qq.com/sns/oauth2/component/access_token', $getTokenUrl->invoke($provider)); } public function testOpenPlatformComponentWithCustomParameters() { $provider = new WeChat([ 'client_id' => 'client_id', 'client_secret' => null, 'redirect' => 'redirect-url', 'component' => [ 'id' => 'component-app-id', 'token' => 'token', ], ]); $getCodeFields = new ReflectionMethod(WeChat::class, 'getCodeFields'); $getCodeFields->setAccessible(true); $provider->with(['foo' => 'bar']); $fields = $getCodeFields->invoke($provider->withState('wechat-state')); $this->assertArrayHasKey('foo', $fields); $this->assertSame('bar', $fields['foo']); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/tests/SocialiteManagerTest.php ================================================ [ 'provider' => 'github', 'client_id' => 'foo-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], 'bar' => [ 'provider' => 'github', 'client_id' => 'bar-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $manager = new SocialiteManager($config); $this->assertInstanceOf(GitHub::class, $manager->create('foo')); $this->assertSame('foo-app-id', $manager->create('foo')->getClientId()); $this->assertInstanceOf(GitHub::class, $manager->create('bar')); $this->assertSame('bar-app-id', $manager->create('bar')->getClientId()); // from name $config = [ 'github' => [ 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $manager = new SocialiteManager($config); $this->assertInstanceOf(GitHub::class, $manager->create('github')); $this->assertSame('your-app-id', $manager->create('github')->getClientId()); } public function test_it_can_create_from_custom_creator() { $config = [ 'foo' => [ 'provider' => 'myprovider', 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $manager = new SocialiteManager($config); $manager->extend('myprovider', function ($config) { return new DummyProviderForCustomProviderTest($config); }); $this->assertInstanceOf(DummyProviderForCustomProviderTest::class, $manager->create('foo')); } public function test_it_can_create_from_custom_provider_class() { $config = [ 'foo' => [ 'provider' => DummyProviderForCustomProviderTest::class, 'client_id' => 'your-app-id', 'client_secret' => 'your-app-secret', 'redirect' => 'http://localhost/socialite/callback.php', ], ]; $manager = new SocialiteManager($config); $this->assertInstanceOf(DummyProviderForCustomProviderTest::class, $manager->create('foo')); } } class DummyProviderForCustomProviderTest extends Base { protected function getAuthUrl(): string { return ''; } protected function getTokenUrl(): string { return ''; } protected function getUserByToken(string $token): array { return []; } protected function mapUserToObject(array $user): User { return new User([]); } } ================================================ FILE: core/widget/wechatServer/vendor/overtrue/socialite/tests/UserTest.php ================================================ assertSame('[]', json_encode(new User([]))); $this->assertSame('{"access_token":"mock-token"}', json_encode(new User(['access_token' => 'mock-token']))); } public function test_it_can_get_refresh_token() { $user = new User([ 'name' => 'fake_name', 'access_token' => 'mock-token', 'refresh_token' => 'fake_refresh', ]); // 能通过用 User 对象获取 refresh token $this->assertSame('fake_refresh', $user->getRefreshToken()); $this->assertSame('{"name":"fake_name","access_token":"mock-token","refresh_token":"fake_refresh"}', json_encode($user)); // 无 refresh_token 属性返回 null $user = new User([]); $this->assertSame(null, $user->getRefreshToken()); // 能通过 setRefreshToken() 设置 $user->setRefreshToken('fake_refreshToken'); $this->assertSame('fake_refreshToken', $user->getRefreshToken()); $this->assertSame('{"refresh_token":"fake_refreshToken"}', json_encode($user)); } public function test_it_can_set_raw_data() { $user = new User([]); $data = ['data' => 'raw']; $user->setRaw($data); $this->assertSame($data, $user->getRaw()); $this->assertSame(json_encode(['raw' => ['data' => 'raw']]), json_encode($user)); } public function test_ie_can_get_attribute_by_magic_method() { $user = new User(['xx' => 'data']); $this->assertSame('data', $user->xx); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/.github/workflows/tests.yml ================================================ name: "Tests" on: - pull_request - push jobs: test: name: PHP ${{ matrix.php }} - ${{ matrix.dependencies }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: php: - "7.2" - "7.3" - "7.4" - "8.0" - "8.1" dependencies: - "psr/container:^1.1" - "psr/container:^2.0" steps: - name: Checkout Code uses: actions/checkout@v2 - name: Setup PHP ${{ matrix.php }} uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} ini-values: display_errors=off, log_errors=on extensions: :xdebug env: # https://github.com/shivammathur/setup-php/issues/407#issuecomment-773675741 fail-fast: true - name: Validate composer.json run: composer validate --strict --no-check-lock - name: Install dependencies +${{ matrix.dependencies }} run: | composer require --no-update ${{ matrix.dependencies }} composer update --prefer-dist --no-progress - name: Run PHPUnit tests run: vendor/bin/simple-phpunit --verbose ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/.gitignore ================================================ phpunit.xml .phpunit.result.cache composer.lock /vendor/ ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/.php_cs.dist ================================================ setRules([ '@Symfony' => true, '@Symfony:risky' => true, '@PHPUnit75Migration:risky' => true, 'php_unit_dedicate_assert' => true, 'array_syntax' => ['syntax' => 'short'], 'php_unit_fqcn_annotation' => true, 'no_unreachable_default_argument_value' => false, 'braces' => ['allow_single_line_closure' => true], 'heredoc_to_nowdoc' => false, 'ordered_imports' => true, 'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'], 'native_function_invocation' => ['include' => ['@compiler_optimized'], 'scope' => 'all'], ]) ->setRiskyAllowed(true) ->setFinder(PhpCsFixer\Finder::create()->in(__DIR__.'/src')) ; ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/CHANGELOG ================================================ * 3.4.0 (2021-03-06) * Implement version 1.1 of PSR-11 * 3.3.1 (2020-11-24) * Add support for PHP 8 * 3.3.0 (2020-03-03) * Drop PHP extension * Bump min PHP version to 7.2.5 * 3.2.3 (2018-01-21) * prefixed all function calls with \ for extra speed * 3.2.2 (2017-07-23) * reverted extending a protected closure throws an exception (deprecated it instead) * 3.2.1 (2017-07-17) * fixed PHP error * 3.2.0 (2017-07-17) * added a PSR-11 service locator * added a PSR-11 wrapper * added ServiceIterator * fixed extending a protected closure (now throws InvalidServiceIdentifierException) * 3.1.0 (2017-07-03) * deprecated the C extension * added support for PSR-11 exceptions * 3.0.2 (2015-09-11) * refactored the C extension * minor non-significant changes * 3.0.1 (2015-07-30) * simplified some code * fixed a segfault in the C extension * 3.0.0 (2014-07-24) * removed the Pimple class alias (use Pimple\Container instead) * 2.1.1 (2014-07-24) * fixed compiler warnings for the C extension * fixed code when dealing with circular references * 2.1.0 (2014-06-24) * moved the Pimple to Pimple\Container (with a BC layer -- Pimple is now a deprecated alias which will be removed in Pimple 3.0) * added Pimple\ServiceProviderInterface (and Pimple::register()) * 2.0.0 (2014-02-10) * changed extend to automatically re-assign the extended service and keep it as shared or factory (to keep BC, extend still returns the extended service) * changed services to be shared by default (use factory() for factory services) * 1.0.0 * initial version ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/LICENSE ================================================ Copyright (c) 2009-2020 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/README.rst ================================================ Pimple ====== .. caution:: Pimple is now closed for changes. No new features will be added and no cosmetic changes will be accepted either. The only accepted changes are compatibility with newer PHP versions and security issue fixes. .. caution:: This is the documentation for Pimple 3.x. If you are using Pimple 1.x, read the `Pimple 1.x documentation`_. Reading the Pimple 1.x code is also a good way to learn more about how to create a simple Dependency Injection Container (recent versions of Pimple are more focused on performance). Pimple is a small Dependency Injection Container for PHP. Installation ------------ Before using Pimple in your project, add it to your ``composer.json`` file: .. code-block:: bash $ ./composer.phar require pimple/pimple "^3.0" Usage ----- Creating a container is a matter of creating a ``Container`` instance: .. code-block:: php use Pimple\Container; $container = new Container(); As many other dependency injection containers, Pimple manages two different kind of data: **services** and **parameters**. Defining Services ~~~~~~~~~~~~~~~~~ A service is an object that does something as part of a larger system. Examples of services: a database connection, a templating engine, or a mailer. Almost any **global** object can be a service. Services are defined by **anonymous functions** that return an instance of an object: .. code-block:: php // define some services $container['session_storage'] = function ($c) { return new SessionStorage('SESSION_ID'); }; $container['session'] = function ($c) { return new Session($c['session_storage']); }; Notice that the anonymous function has access to the current container instance, allowing references to other services or parameters. As objects are only created when you get them, the order of the definitions does not matter. Using the defined services is also very easy: .. code-block:: php // get the session object $session = $container['session']; // the above call is roughly equivalent to the following code: // $storage = new SessionStorage('SESSION_ID'); // $session = new Session($storage); Defining Factory Services ~~~~~~~~~~~~~~~~~~~~~~~~~ By default, each time you get a service, Pimple returns the **same instance** of it. If you want a different instance to be returned for all calls, wrap your anonymous function with the ``factory()`` method .. code-block:: php $container['session'] = $container->factory(function ($c) { return new Session($c['session_storage']); }); Now, each call to ``$container['session']`` returns a new instance of the session. Defining Parameters ~~~~~~~~~~~~~~~~~~~ Defining a parameter allows to ease the configuration of your container from the outside and to store global values: .. code-block:: php // define some parameters $container['cookie_name'] = 'SESSION_ID'; $container['session_storage_class'] = 'SessionStorage'; If you change the ``session_storage`` service definition like below: .. code-block:: php $container['session_storage'] = function ($c) { return new $c['session_storage_class']($c['cookie_name']); }; You can now easily change the cookie name by overriding the ``cookie_name`` parameter instead of redefining the service definition. Protecting Parameters ~~~~~~~~~~~~~~~~~~~~~ Because Pimple sees anonymous functions as service definitions, you need to wrap anonymous functions with the ``protect()`` method to store them as parameters: .. code-block:: php $container['random_func'] = $container->protect(function () { return rand(); }); Modifying Services after Definition ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In some cases you may want to modify a service definition after it has been defined. You can use the ``extend()`` method to define additional code to be run on your service just after it is created: .. code-block:: php $container['session_storage'] = function ($c) { return new $c['session_storage_class']($c['cookie_name']); }; $container->extend('session_storage', function ($storage, $c) { $storage->...(); return $storage; }); The first argument is the name of the service to extend, the second a function that gets access to the object instance and the container. Extending a Container ~~~~~~~~~~~~~~~~~~~~~ If you use the same libraries over and over, you might want to reuse some services from one project to the next one; package your services into a **provider** by implementing ``Pimple\ServiceProviderInterface``: .. code-block:: php use Pimple\Container; class FooProvider implements Pimple\ServiceProviderInterface { public function register(Container $pimple) { // register some services and parameters // on $pimple } } Then, register the provider on a Container: .. code-block:: php $pimple->register(new FooProvider()); Fetching the Service Creation Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When you access an object, Pimple automatically calls the anonymous function that you defined, which creates the service object for you. If you want to get raw access to this function, you can use the ``raw()`` method: .. code-block:: php $container['session'] = function ($c) { return new Session($c['session_storage']); }; $sessionFunction = $container->raw('session'); PSR-11 compatibility -------------------- For historical reasons, the ``Container`` class does not implement the PSR-11 ``ContainerInterface``. However, Pimple provides a helper class that will let you decouple your code from the Pimple container class. The PSR-11 container class ~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``Pimple\Psr11\Container`` class lets you access the content of an underlying Pimple container using ``Psr\Container\ContainerInterface`` methods: .. code-block:: php use Pimple\Container; use Pimple\Psr11\Container as PsrContainer; $container = new Container(); $container['service'] = function ($c) { return new Service(); }; $psr11 = new PsrContainer($container); $controller = function (PsrContainer $container) { $service = $container->get('service'); }; $controller($psr11); Using the PSR-11 ServiceLocator ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sometimes, a service needs access to several other services without being sure that all of them will actually be used. In those cases, you may want the instantiation of the services to be lazy. The traditional solution is to inject the entire service container to get only the services really needed. However, this is not recommended because it gives services a too broad access to the rest of the application and it hides their actual dependencies. The ``ServiceLocator`` is intended to solve this problem by giving access to a set of predefined services while instantiating them only when actually needed. It also allows you to make your services available under a different name than the one used to register them. For instance, you may want to use an object that expects an instance of ``EventDispatcherInterface`` to be available under the name ``event_dispatcher`` while your event dispatcher has been registered under the name ``dispatcher``: .. code-block:: php use Monolog\Logger; use Pimple\Psr11\ServiceLocator; use Psr\Container\ContainerInterface; use Symfony\Component\EventDispatcher\EventDispatcher; class MyService { /** * "logger" must be an instance of Psr\Log\LoggerInterface * "event_dispatcher" must be an instance of Symfony\Component\EventDispatcher\EventDispatcherInterface */ private $services; public function __construct(ContainerInterface $services) { $this->services = $services; } } $container['logger'] = function ($c) { return new Monolog\Logger(); }; $container['dispatcher'] = function () { return new EventDispatcher(); }; $container['service'] = function ($c) { $locator = new ServiceLocator($c, array('logger', 'event_dispatcher' => 'dispatcher')); return new MyService($locator); }; Referencing a Collection of Services Lazily ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Passing a collection of services instances in an array may prove inefficient if the class that consumes the collection only needs to iterate over it at a later stage, when one of its method is called. It can also lead to problems if there is a circular dependency between one of the services stored in the collection and the class that consumes it. The ``ServiceIterator`` class helps you solve these issues. It receives a list of service names during instantiation and will retrieve the services when iterated over: .. code-block:: php use Pimple\Container; use Pimple\ServiceIterator; class AuthorizationService { private $voters; public function __construct($voters) { $this->voters = $voters; } public function canAccess($resource) { foreach ($this->voters as $voter) { if (true === $voter->canAccess($resource)) { return true; } } return false; } } $container = new Container(); $container['voter1'] = function ($c) { return new SomeVoter(); } $container['voter2'] = function ($c) { return new SomeOtherVoter($c['auth']); } $container['auth'] = function ($c) { return new AuthorizationService(new ServiceIterator($c, array('voter1', 'voter2')); } .. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1 ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/composer.json ================================================ { "name": "pimple/pimple", "type": "library", "description": "Pimple, a simple Dependency Injection Container", "keywords": ["dependency injection", "container"], "homepage": "https://pimple.symfony.com", "license": "MIT", "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" } ], "require": { "php": ">=7.2.5", "psr/container": "^1.1 || ^2.0" }, "require-dev": { "symfony/phpunit-bridge": "^5.4@dev" }, "autoload": { "psr-0": { "Pimple": "src/" } }, "extra": { "branch-alias": { "dev-master": "3.4.x-dev" } } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/phpunit.xml.dist ================================================ ./src/Pimple/Tests ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Container.php ================================================ factories = new \SplObjectStorage(); $this->protected = new \SplObjectStorage(); foreach ($values as $key => $value) { $this->offsetSet($key, $value); } } /** * Sets a parameter or an object. * * Objects must be defined as Closures. * * Allowing any PHP callable leads to difficult to debug problems * as function names (strings) are callable (creating a function with * the same name as an existing parameter would break your container). * * @param string $id The unique identifier for the parameter or object * @param mixed $value The value of the parameter or a closure to define an object * * @return void * * @throws FrozenServiceException Prevent override of a frozen service */ #[\ReturnTypeWillChange] public function offsetSet($id, $value) { if (isset($this->frozen[$id])) { throw new FrozenServiceException($id); } $this->values[$id] = $value; $this->keys[$id] = true; } /** * Gets a parameter or an object. * * @param string $id The unique identifier for the parameter or object * * @return mixed The value of the parameter or an object * * @throws UnknownIdentifierException If the identifier is not defined */ #[\ReturnTypeWillChange] public function offsetGet($id) { if (!isset($this->keys[$id])) { throw new UnknownIdentifierException($id); } if ( isset($this->raw[$id]) || !\is_object($this->values[$id]) || isset($this->protected[$this->values[$id]]) || !\method_exists($this->values[$id], '__invoke') ) { return $this->values[$id]; } if (isset($this->factories[$this->values[$id]])) { return $this->values[$id]($this); } $raw = $this->values[$id]; $val = $this->values[$id] = $raw($this); $this->raw[$id] = $raw; $this->frozen[$id] = true; return $val; } /** * Checks if a parameter or an object is set. * * @param string $id The unique identifier for the parameter or object * * @return bool */ #[\ReturnTypeWillChange] public function offsetExists($id) { return isset($this->keys[$id]); } /** * Unsets a parameter or an object. * * @param string $id The unique identifier for the parameter or object * * @return void */ #[\ReturnTypeWillChange] public function offsetUnset($id) { if (isset($this->keys[$id])) { if (\is_object($this->values[$id])) { unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]); } unset($this->values[$id], $this->frozen[$id], $this->raw[$id], $this->keys[$id]); } } /** * Marks a callable as being a factory service. * * @param callable $callable A service definition to be used as a factory * * @return callable The passed callable * * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object */ public function factory($callable) { if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { throw new ExpectedInvokableException('Service definition is not a Closure or invokable object.'); } $this->factories->attach($callable); return $callable; } /** * Protects a callable from being interpreted as a service. * * This is useful when you want to store a callable as a parameter. * * @param callable $callable A callable to protect from being evaluated * * @return callable The passed callable * * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object */ public function protect($callable) { if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { throw new ExpectedInvokableException('Callable is not a Closure or invokable object.'); } $this->protected->attach($callable); return $callable; } /** * Gets a parameter or the closure defining an object. * * @param string $id The unique identifier for the parameter or object * * @return mixed The value of the parameter or the closure defining an object * * @throws UnknownIdentifierException If the identifier is not defined */ public function raw($id) { if (!isset($this->keys[$id])) { throw new UnknownIdentifierException($id); } if (isset($this->raw[$id])) { return $this->raw[$id]; } return $this->values[$id]; } /** * Extends an object definition. * * Useful when you want to extend an existing object definition, * without necessarily loading that object. * * @param string $id The unique identifier for the object * @param callable $callable A service definition to extend the original * * @return callable The wrapped callable * * @throws UnknownIdentifierException If the identifier is not defined * @throws FrozenServiceException If the service is frozen * @throws InvalidServiceIdentifierException If the identifier belongs to a parameter * @throws ExpectedInvokableException If the extension callable is not a closure or an invokable object */ public function extend($id, $callable) { if (!isset($this->keys[$id])) { throw new UnknownIdentifierException($id); } if (isset($this->frozen[$id])) { throw new FrozenServiceException($id); } if (!\is_object($this->values[$id]) || !\method_exists($this->values[$id], '__invoke')) { throw new InvalidServiceIdentifierException($id); } if (isset($this->protected[$this->values[$id]])) { @\trigger_error(\sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), E_USER_DEPRECATED); } if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { throw new ExpectedInvokableException('Extension service definition is not a Closure or invokable object.'); } $factory = $this->values[$id]; $extended = function ($c) use ($callable, $factory) { return $callable($factory($c), $c); }; if (isset($this->factories[$factory])) { $this->factories->detach($factory); $this->factories->attach($extended); } return $this[$id] = $extended; } /** * Returns all defined value names. * * @return array An array of value names */ public function keys() { return \array_keys($this->values); } /** * Registers a service provider. * * @param array $values An array of values that customizes the provider * * @return static */ public function register(ServiceProviderInterface $provider, array $values = []) { $provider->register($this); foreach ($values as $key => $value) { $this[$key] = $value; } return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php ================================================ */ class ExpectedInvokableException extends \InvalidArgumentException implements ContainerExceptionInterface { } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php ================================================ */ class FrozenServiceException extends \RuntimeException implements ContainerExceptionInterface { /** * @param string $id Identifier of the frozen service */ public function __construct($id) { parent::__construct(\sprintf('Cannot override frozen service "%s".', $id)); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php ================================================ */ class InvalidServiceIdentifierException extends \InvalidArgumentException implements NotFoundExceptionInterface { /** * @param string $id The invalid identifier */ public function __construct($id) { parent::__construct(\sprintf('Identifier "%s" does not contain an object definition.', $id)); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php ================================================ */ class UnknownIdentifierException extends \InvalidArgumentException implements NotFoundExceptionInterface { /** * @param string $id The unknown identifier */ public function __construct($id) { parent::__construct(\sprintf('Identifier "%s" is not defined.', $id)); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Psr11/Container.php ================================================ */ final class Container implements ContainerInterface { private $pimple; public function __construct(PimpleContainer $pimple) { $this->pimple = $pimple; } public function get(string $id) { return $this->pimple[$id]; } public function has(string $id): bool { return isset($this->pimple[$id]); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php ================================================ */ class ServiceLocator implements ContainerInterface { private $container; private $aliases = []; /** * @param PimpleContainer $container The Container instance used to locate services * @param array $ids Array of service ids that can be located. String keys can be used to define aliases */ public function __construct(PimpleContainer $container, array $ids) { $this->container = $container; foreach ($ids as $key => $id) { $this->aliases[\is_int($key) ? $id : $key] = $id; } } /** * {@inheritdoc} */ public function get(string $id) { if (!isset($this->aliases[$id])) { throw new UnknownIdentifierException($id); } return $this->container[$this->aliases[$id]]; } /** * {@inheritdoc} */ public function has(string $id): bool { return isset($this->aliases[$id]) && isset($this->container[$this->aliases[$id]]); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/ServiceIterator.php ================================================ */ final class ServiceIterator implements \Iterator { private $container; private $ids; public function __construct(Container $container, array $ids) { $this->container = $container; $this->ids = $ids; } /** * @return void */ #[\ReturnTypeWillChange] public function rewind() { \reset($this->ids); } /** * @return mixed */ #[\ReturnTypeWillChange] public function current() { return $this->container[\current($this->ids)]; } /** * @return mixed */ #[\ReturnTypeWillChange] public function key() { return \current($this->ids); } /** * @return void */ #[\ReturnTypeWillChange] public function next() { \next($this->ids); } /** * @return bool */ #[\ReturnTypeWillChange] public function valid() { return null !== \key($this->ids); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php ================================================ value = $value; return $service; } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php ================================================ factory(function () { return new Service(); }); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php ================================================ */ class Service { public $value; } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php ================================================ */ class PimpleServiceProviderInterfaceTest extends TestCase { public function testProvider() { $pimple = new Container(); $pimpleServiceProvider = new Fixtures\PimpleServiceProvider(); $pimpleServiceProvider->register($pimple); $this->assertEquals('value', $pimple['param']); $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']); $serviceOne = $pimple['factory']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); $serviceTwo = $pimple['factory']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); $this->assertNotSame($serviceOne, $serviceTwo); } public function testProviderWithRegisterMethod() { $pimple = new Container(); $pimple->register(new Fixtures\PimpleServiceProvider(), [ 'anotherParameter' => 'anotherValue', ]); $this->assertEquals('value', $pimple['param']); $this->assertEquals('anotherValue', $pimple['anotherParameter']); $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']); $serviceOne = $pimple['factory']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); $serviceTwo = $pimple['factory']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); $this->assertNotSame($serviceOne, $serviceTwo); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php ================================================ */ class PimpleTest extends TestCase { public function testWithString() { $pimple = new Container(); $pimple['param'] = 'value'; $this->assertEquals('value', $pimple['param']); } public function testWithClosure() { $pimple = new Container(); $pimple['service'] = function () { return new Fixtures\Service(); }; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']); } public function testServicesShouldBeDifferent() { $pimple = new Container(); $pimple['service'] = $pimple->factory(function () { return new Fixtures\Service(); }); $serviceOne = $pimple['service']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); $serviceTwo = $pimple['service']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); $this->assertNotSame($serviceOne, $serviceTwo); } public function testShouldPassContainerAsParameter() { $pimple = new Container(); $pimple['service'] = function () { return new Fixtures\Service(); }; $pimple['container'] = function ($container) { return $container; }; $this->assertNotSame($pimple, $pimple['service']); $this->assertSame($pimple, $pimple['container']); } public function testIsset() { $pimple = new Container(); $pimple['param'] = 'value'; $pimple['service'] = function () { return new Fixtures\Service(); }; $pimple['null'] = null; $this->assertTrue(isset($pimple['param'])); $this->assertTrue(isset($pimple['service'])); $this->assertTrue(isset($pimple['null'])); $this->assertFalse(isset($pimple['non_existent'])); } public function testConstructorInjection() { $params = ['param' => 'value']; $pimple = new Container($params); $this->assertSame($params['param'], $pimple['param']); } public function testOffsetGetValidatesKeyIsPresent() { $this->expectException(\Pimple\Exception\UnknownIdentifierException::class); $this->expectExceptionMessage('Identifier "foo" is not defined.'); $pimple = new Container(); echo $pimple['foo']; } /** * @group legacy */ public function testLegacyOffsetGetValidatesKeyIsPresent() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Identifier "foo" is not defined.'); $pimple = new Container(); echo $pimple['foo']; } public function testOffsetGetHonorsNullValues() { $pimple = new Container(); $pimple['foo'] = null; $this->assertNull($pimple['foo']); } public function testUnset() { $pimple = new Container(); $pimple['param'] = 'value'; $pimple['service'] = function () { return new Fixtures\Service(); }; unset($pimple['param'], $pimple['service']); $this->assertFalse(isset($pimple['param'])); $this->assertFalse(isset($pimple['service'])); } /** * @dataProvider serviceDefinitionProvider */ public function testShare($service) { $pimple = new Container(); $pimple['shared_service'] = $service; $serviceOne = $pimple['shared_service']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); $serviceTwo = $pimple['shared_service']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); $this->assertSame($serviceOne, $serviceTwo); } /** * @dataProvider serviceDefinitionProvider */ public function testProtect($service) { $pimple = new Container(); $pimple['protected'] = $pimple->protect($service); $this->assertSame($service, $pimple['protected']); } public function testGlobalFunctionNameAsParameterValue() { $pimple = new Container(); $pimple['global_function'] = 'strlen'; $this->assertSame('strlen', $pimple['global_function']); } public function testRaw() { $pimple = new Container(); $pimple['service'] = $definition = $pimple->factory(function () { return 'foo'; }); $this->assertSame($definition, $pimple->raw('service')); } public function testRawHonorsNullValues() { $pimple = new Container(); $pimple['foo'] = null; $this->assertNull($pimple->raw('foo')); } public function testFluentRegister() { $pimple = new Container(); $this->assertSame($pimple, $pimple->register($this->getMockBuilder('Pimple\ServiceProviderInterface')->getMock())); } public function testRawValidatesKeyIsPresent() { $this->expectException(\Pimple\Exception\UnknownIdentifierException::class); $this->expectExceptionMessage('Identifier "foo" is not defined.'); $pimple = new Container(); $pimple->raw('foo'); } /** * @group legacy */ public function testLegacyRawValidatesKeyIsPresent() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Identifier "foo" is not defined.'); $pimple = new Container(); $pimple->raw('foo'); } /** * @dataProvider serviceDefinitionProvider */ public function testExtend($service) { $pimple = new Container(); $pimple['shared_service'] = function () { return new Fixtures\Service(); }; $pimple['factory_service'] = $pimple->factory(function () { return new Fixtures\Service(); }); $pimple->extend('shared_service', $service); $serviceOne = $pimple['shared_service']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); $serviceTwo = $pimple['shared_service']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); $this->assertSame($serviceOne, $serviceTwo); $this->assertSame($serviceOne->value, $serviceTwo->value); $pimple->extend('factory_service', $service); $serviceOne = $pimple['factory_service']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); $serviceTwo = $pimple['factory_service']; $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); $this->assertNotSame($serviceOne, $serviceTwo); $this->assertNotSame($serviceOne->value, $serviceTwo->value); } public function testExtendDoesNotLeakWithFactories() { if (\extension_loaded('pimple')) { $this->markTestSkipped('Pimple extension does not support this test'); } $pimple = new Container(); $pimple['foo'] = $pimple->factory(function () { return; }); $pimple['foo'] = $pimple->extend('foo', function ($foo, $pimple) { return; }); unset($pimple['foo']); $p = new \ReflectionProperty($pimple, 'values'); $p->setAccessible(true); $this->assertEmpty($p->getValue($pimple)); $p = new \ReflectionProperty($pimple, 'factories'); $p->setAccessible(true); $this->assertCount(0, $p->getValue($pimple)); } public function testExtendValidatesKeyIsPresent() { $this->expectException(\Pimple\Exception\UnknownIdentifierException::class); $this->expectExceptionMessage('Identifier "foo" is not defined.'); $pimple = new Container(); $pimple->extend('foo', function () { }); } /** * @group legacy */ public function testLegacyExtendValidatesKeyIsPresent() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Identifier "foo" is not defined.'); $pimple = new Container(); $pimple->extend('foo', function () { }); } public function testKeys() { $pimple = new Container(); $pimple['foo'] = 123; $pimple['bar'] = 123; $this->assertEquals(['foo', 'bar'], $pimple->keys()); } /** @test */ public function settingAnInvokableObjectShouldTreatItAsFactory() { $pimple = new Container(); $pimple['invokable'] = new Fixtures\Invokable(); $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['invokable']); } /** @test */ public function settingNonInvokableObjectShouldTreatItAsParameter() { $pimple = new Container(); $pimple['non_invokable'] = new Fixtures\NonInvokable(); $this->assertInstanceOf('Pimple\Tests\Fixtures\NonInvokable', $pimple['non_invokable']); } /** * @dataProvider badServiceDefinitionProvider */ public function testFactoryFailsForInvalidServiceDefinitions($service) { $this->expectException(\Pimple\Exception\ExpectedInvokableException::class); $this->expectExceptionMessage('Service definition is not a Closure or invokable object.'); $pimple = new Container(); $pimple->factory($service); } /** * @group legacy * @dataProvider badServiceDefinitionProvider */ public function testLegacyFactoryFailsForInvalidServiceDefinitions($service) { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Service definition is not a Closure or invokable object.'); $pimple = new Container(); $pimple->factory($service); } /** * @dataProvider badServiceDefinitionProvider */ public function testProtectFailsForInvalidServiceDefinitions($service) { $this->expectException(\Pimple\Exception\ExpectedInvokableException::class); $this->expectExceptionMessage('Callable is not a Closure or invokable object.'); $pimple = new Container(); $pimple->protect($service); } /** * @group legacy * @dataProvider badServiceDefinitionProvider */ public function testLegacyProtectFailsForInvalidServiceDefinitions($service) { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Callable is not a Closure or invokable object.'); $pimple = new Container(); $pimple->protect($service); } /** * @dataProvider badServiceDefinitionProvider */ public function testExtendFailsForKeysNotContainingServiceDefinitions($service) { $this->expectException(\Pimple\Exception\InvalidServiceIdentifierException::class); $this->expectExceptionMessage('Identifier "foo" does not contain an object definition.'); $pimple = new Container(); $pimple['foo'] = $service; $pimple->extend('foo', function () { }); } /** * @group legacy * @dataProvider badServiceDefinitionProvider */ public function testLegacyExtendFailsForKeysNotContainingServiceDefinitions($service) { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Identifier "foo" does not contain an object definition.'); $pimple = new Container(); $pimple['foo'] = $service; $pimple->extend('foo', function () { }); } /** * @group legacy * @expectedDeprecation How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "foo" should be protected? */ public function testExtendingProtectedClosureDeprecation() { $pimple = new Container(); $pimple['foo'] = $pimple->protect(function () { return 'bar'; }); $pimple->extend('foo', function ($value) { return $value.'-baz'; }); $this->assertSame('bar-baz', $pimple['foo']); } /** * @dataProvider badServiceDefinitionProvider */ public function testExtendFailsForInvalidServiceDefinitions($service) { $this->expectException(\Pimple\Exception\ExpectedInvokableException::class); $this->expectExceptionMessage('Extension service definition is not a Closure or invokable object.'); $pimple = new Container(); $pimple['foo'] = function () { }; $pimple->extend('foo', $service); } /** * @group legacy * @dataProvider badServiceDefinitionProvider */ public function testLegacyExtendFailsForInvalidServiceDefinitions($service) { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Extension service definition is not a Closure or invokable object.'); $pimple = new Container(); $pimple['foo'] = function () { }; $pimple->extend('foo', $service); } public function testExtendFailsIfFrozenServiceIsNonInvokable() { $this->expectException(\Pimple\Exception\FrozenServiceException::class); $this->expectExceptionMessage('Cannot override frozen service "foo".'); $pimple = new Container(); $pimple['foo'] = function () { return new Fixtures\NonInvokable(); }; $foo = $pimple['foo']; $pimple->extend('foo', function () { }); } public function testExtendFailsIfFrozenServiceIsInvokable() { $this->expectException(\Pimple\Exception\FrozenServiceException::class); $this->expectExceptionMessage('Cannot override frozen service "foo".'); $pimple = new Container(); $pimple['foo'] = function () { return new Fixtures\Invokable(); }; $foo = $pimple['foo']; $pimple->extend('foo', function () { }); } /** * Provider for invalid service definitions. */ public function badServiceDefinitionProvider() { return [ [123], [new Fixtures\NonInvokable()], ]; } /** * Provider for service definitions. */ public function serviceDefinitionProvider() { return [ [function ($value) { $service = new Fixtures\Service(); $service->value = $value; return $service; }], [new Fixtures\Invokable()], ]; } public function testDefiningNewServiceAfterFreeze() { $pimple = new Container(); $pimple['foo'] = function () { return 'foo'; }; $foo = $pimple['foo']; $pimple['bar'] = function () { return 'bar'; }; $this->assertSame('bar', $pimple['bar']); } public function testOverridingServiceAfterFreeze() { $this->expectException(\Pimple\Exception\FrozenServiceException::class); $this->expectExceptionMessage('Cannot override frozen service "foo".'); $pimple = new Container(); $pimple['foo'] = function () { return 'foo'; }; $foo = $pimple['foo']; $pimple['foo'] = function () { return 'bar'; }; } /** * @group legacy */ public function testLegacyOverridingServiceAfterFreeze() { $this->expectException(\RuntimeException::class); $this->expectExceptionMessage('Cannot override frozen service "foo".'); $pimple = new Container(); $pimple['foo'] = function () { return 'foo'; }; $foo = $pimple['foo']; $pimple['foo'] = function () { return 'bar'; }; } public function testRemovingServiceAfterFreeze() { $pimple = new Container(); $pimple['foo'] = function () { return 'foo'; }; $foo = $pimple['foo']; unset($pimple['foo']); $pimple['foo'] = function () { return 'bar'; }; $this->assertSame('bar', $pimple['foo']); } public function testExtendingService() { $pimple = new Container(); $pimple['foo'] = function () { return 'foo'; }; $pimple['foo'] = $pimple->extend('foo', function ($foo, $app) { return "$foo.bar"; }); $pimple['foo'] = $pimple->extend('foo', function ($foo, $app) { return "$foo.baz"; }); $this->assertSame('foo.bar.baz', $pimple['foo']); } public function testExtendingServiceAfterOtherServiceFreeze() { $pimple = new Container(); $pimple['foo'] = function () { return 'foo'; }; $pimple['bar'] = function () { return 'bar'; }; $foo = $pimple['foo']; $pimple['bar'] = $pimple->extend('bar', function ($bar, $app) { return "$bar.baz"; }); $this->assertSame('bar.baz', $pimple['bar']); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php ================================================ assertSame($pimple['service'], $psr->get('service')); } public function testGetThrowsExceptionIfServiceIsNotFound() { $this->expectException(\Psr\Container\NotFoundExceptionInterface::class); $this->expectExceptionMessage('Identifier "service" is not defined.'); $pimple = new Container(); $psr = new PsrContainer($pimple); $psr->get('service'); } public function testHasReturnsTrueIfServiceExists() { $pimple = new Container(); $pimple['service'] = function () { return new Service(); }; $psr = new PsrContainer($pimple); $this->assertTrue($psr->has('service')); } public function testHasReturnsFalseIfServiceDoesNotExist() { $pimple = new Container(); $psr = new PsrContainer($pimple); $this->assertFalse($psr->has('service')); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php ================================================ */ class ServiceLocatorTest extends TestCase { public function testCanAccessServices() { $pimple = new Container(); $pimple['service'] = function () { return new Fixtures\Service(); }; $locator = new ServiceLocator($pimple, ['service']); $this->assertSame($pimple['service'], $locator->get('service')); } public function testCanAccessAliasedServices() { $pimple = new Container(); $pimple['service'] = function () { return new Fixtures\Service(); }; $locator = new ServiceLocator($pimple, ['alias' => 'service']); $this->assertSame($pimple['service'], $locator->get('alias')); } public function testCannotAccessAliasedServiceUsingRealIdentifier() { $this->expectException(\Pimple\Exception\UnknownIdentifierException::class); $this->expectExceptionMessage('Identifier "service" is not defined.'); $pimple = new Container(); $pimple['service'] = function () { return new Fixtures\Service(); }; $locator = new ServiceLocator($pimple, ['alias' => 'service']); $service = $locator->get('service'); } public function testGetValidatesServiceCanBeLocated() { $this->expectException(\Pimple\Exception\UnknownIdentifierException::class); $this->expectExceptionMessage('Identifier "foo" is not defined.'); $pimple = new Container(); $pimple['service'] = function () { return new Fixtures\Service(); }; $locator = new ServiceLocator($pimple, ['alias' => 'service']); $service = $locator->get('foo'); } public function testGetValidatesTargetServiceExists() { $this->expectException(\Pimple\Exception\UnknownIdentifierException::class); $this->expectExceptionMessage('Identifier "invalid" is not defined.'); $pimple = new Container(); $pimple['service'] = function () { return new Fixtures\Service(); }; $locator = new ServiceLocator($pimple, ['alias' => 'invalid']); $service = $locator->get('alias'); } public function testHasValidatesServiceCanBeLocated() { $pimple = new Container(); $pimple['service1'] = function () { return new Fixtures\Service(); }; $pimple['service2'] = function () { return new Fixtures\Service(); }; $locator = new ServiceLocator($pimple, ['service1']); $this->assertTrue($locator->has('service1')); $this->assertFalse($locator->has('service2')); } public function testHasChecksIfTargetServiceExists() { $pimple = new Container(); $pimple['service'] = function () { return new Fixtures\Service(); }; $locator = new ServiceLocator($pimple, ['foo' => 'service', 'bar' => 'invalid']); $this->assertTrue($locator->has('foo')); $this->assertFalse($locator->has('bar')); } } ================================================ FILE: core/widget/wechatServer/vendor/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php ================================================ assertSame(['service1' => $pimple['service1'], 'service2' => $pimple['service2']], iterator_to_array($iterator)); } } ================================================ FILE: core/widget/wechatServer/vendor/psr/cache/CHANGELOG.md ================================================ # Changelog All notable changes to this project will be documented in this file, in reverse chronological order by release. ## 1.0.1 - 2016-08-06 ### Fixed - Make spacing consistent in phpdoc annotations php-fig/cache#9 - chalasr - Fix grammar in phpdoc annotations php-fig/cache#10 - chalasr - Be more specific in docblocks that `getItems()` and `deleteItems()` take an array of strings (`string[]`) compared to just `array` php-fig/cache#8 - GrahamCampbell - For `expiresAt()` and `expiresAfter()` in CacheItemInterface fix docblock to specify null as a valid parameters as well as an implementation of DateTimeInterface php-fig/cache#7 - GrahamCampbell ## 1.0.0 - 2015-12-11 Initial stable release; reflects accepted PSR-6 specification ================================================ FILE: core/widget/wechatServer/vendor/psr/cache/LICENSE.txt ================================================ Copyright (c) 2015 PHP Framework Interoperability Group Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/psr/cache/README.md ================================================ Caching Interface ============== This repository holds all interfaces related to [PSR-6 (Caching Interface)][psr-url]. Note that this is not a Caching implementation of its own. It is merely interfaces that describe the components of a Caching mechanism. The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. [psr-url]: https://www.php-fig.org/psr/psr-6/ [package-url]: https://packagist.org/packages/psr/cache [implementation-url]: https://packagist.org/providers/psr/cache-implementation ================================================ FILE: core/widget/wechatServer/vendor/psr/cache/composer.json ================================================ { "name": "psr/cache", "description": "Common interface for caching libraries", "keywords": ["psr", "psr-6", "cache"], "license": "MIT", "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "require": { "php": ">=8.0.0" }, "autoload": { "psr-4": { "Psr\\Cache\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } } } ================================================ FILE: core/widget/wechatServer/vendor/psr/cache/src/CacheException.php ================================================ =7.4.0" }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } } } ================================================ FILE: core/widget/wechatServer/vendor/psr/container/src/ContainerExceptionInterface.php ================================================ =7.2.0" }, "autoload": { "psr-4": { "Psr\\EventDispatcher\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } } } ================================================ FILE: core/widget/wechatServer/vendor/psr/event-dispatcher/src/EventDispatcherInterface.php ================================================ =7.1", "psr/http-message": "^1.0 || ^2.0" }, "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } } } ================================================ FILE: core/widget/wechatServer/vendor/psr/http-factory/src/RequestFactoryInterface.php ================================================ `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface` because the `Request` and the `Response` are `HTTP Messages`. > When using `ServerRequestInterface`, both `RequestInterface` and `Psr\Http\Message\MessageInterface` methods are considered. ================================================ FILE: core/widget/wechatServer/vendor/psr/http-message/docs/PSR7-Usage.md ================================================ ### PSR-7 Usage All PSR-7 applications comply with these interfaces They were created to establish a standard between middleware implementations. > `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface` because the `Request` and the `Response` are `HTTP Messages`. > When using `ServerRequestInterface`, both `RequestInterface` and `Psr\Http\Message\MessageInterface` methods are considered. The following examples will illustrate how basic operations are done in PSR-7. ##### Examples For this examples to work (at least) a PSR-7 implementation package is required. (eg: zendframework/zend-diactoros, guzzlehttp/psr7, slim/slim, etc) All PSR-7 implementations should have the same behaviour. The following will be assumed: `$request` is an object of `Psr\Http\Message\RequestInterface` and `$response` is an object implementing `Psr\Http\Message\RequestInterface` ### Working with HTTP Headers #### Adding headers to response: ```php $response->withHeader('My-Custom-Header', 'My Custom Message'); ``` #### Appending values to headers ```php $response->withAddedHeader('My-Custom-Header', 'The second message'); ``` #### Checking if header exists: ```php $request->hasHeader('My-Custom-Header'); // will return false $response->hasHeader('My-Custom-Header'); // will return true ``` > Note: My-Custom-Header was only added in the Response #### Getting comma-separated values from a header (also applies to request) ```php // getting value from request headers $request->getHeaderLine('Content-Type'); // will return: "text/html; charset=UTF-8" // getting value from response headers $response->getHeaderLine('My-Custom-Header'); // will return: "My Custom Message; The second message" ``` #### Getting array of value from a header (also applies to request) ```php // getting value from request headers $request->getHeader('Content-Type'); // will return: ["text/html", "charset=UTF-8"] // getting value from response headers $response->getHeader('My-Custom-Header'); // will return: ["My Custom Message", "The second message"] ``` #### Removing headers from HTTP Messages ```php // removing a header from Request, removing deprecated "Content-MD5" header $request->withoutHeader('Content-MD5'); // removing a header from Response // effect: the browser won't know the size of the stream // the browser will download the stream till it ends $response->withoutHeader('Content-Length'); ``` ### Working with HTTP Message Body When working with the PSR-7 there are two methods of implementation: #### 1. Getting the body separately > This method makes the body handling easier to understand and is useful when repeatedly calling body methods. (You only call `getBody()` once). Using this method mistakes like `$response->write()` are also prevented. ```php $body = $response->getBody(); // operations on body, eg. read, write, seek // ... // replacing the old body $response->withBody($body); // this last statement is optional as we working with objects // in this case the "new" body is same with the "old" one // the $body variable has the same value as the one in $request, only the reference is passed ``` #### 2. Working directly on response > This method is useful when only performing few operations as the `$request->getBody()` statement fragment is required ```php $response->getBody()->write('hello'); ``` ### Getting the body contents The following snippet gets the contents of a stream contents. > Note: Streams must be rewinded, if content was written into streams, it will be ignored when calling `getContents()` because the stream pointer is set to the last character, which is `\0` - meaning end of stream. ```php $body = $response->getBody(); $body->rewind(); // or $body->seek(0); $bodyText = $body->getContents(); ``` > Note: If `$body->seek(1)` is called before `$body->getContents()`, the first character will be ommited as the starting pointer is set to `1`, not `0`. This is why using `$body->rewind()` is recommended. ### Append to body ```php $response->getBody()->write('Hello'); // writing directly $body = $request->getBody(); // which is a `StreamInterface` $body->write('xxxxx'); ``` ### Prepend to body Prepending is different when it comes to streams. The content must be copied before writing the content to be prepended. The following example will explain the behaviour of streams. ```php // assuming our response is initially empty $body = $repsonse->getBody(); // writing the string "abcd" $body->write('abcd'); // seeking to start of stream $body->seek(0); // writing 'ef' $body->write('ef'); // at this point the stream contains "efcd" ``` #### Prepending by rewriting separately ```php // assuming our response body stream only contains: "abcd" $body = $response->getBody(); $body->rewind(); $contents = $body->getContents(); // abcd // seeking the stream to beginning $body->rewind(); $body->write('ef'); // stream contains "efcd" $body->write($contents); // stream contains "efabcd" ``` > Note: `getContents()` seeks the stream while reading it, therefore if the second `rewind()` method call was not present the stream would have resulted in `abcdefabcd` because the `write()` method appends to stream if not preceeded by `rewind()` or `seek(0)`. #### Prepending by using contents as a string ```php $body = $response->getBody(); $body->rewind(); $contents = $body->getContents(); // efabcd $contents = 'ef'.$contents; $body->rewind(); $body->write($contents); ``` ================================================ FILE: core/widget/wechatServer/vendor/psr/http-message/src/MessageInterface.php ================================================ getHeaders() as $name => $values) { * echo $name . ": " . implode(", ", $values); * } * * // Emit headers iteratively: * foreach ($message->getHeaders() as $name => $values) { * foreach ($values as $value) { * header(sprintf('%s: %s', $name, $value), false); * } * } * * While header names are not case-sensitive, getHeaders() will preserve the * exact case in which headers were originally specified. * * @return string[][] Returns an associative array of the message's headers. Each * key MUST be a header name, and each value MUST be an array of strings * for that header. */ public function getHeaders(): array; /** * Checks if a header exists by the given case-insensitive name. * * @param string $name Case-insensitive header field name. * @return bool Returns true if any header names match the given header * name using a case-insensitive string comparison. Returns false if * no matching header name is found in the message. */ public function hasHeader(string $name): bool; /** * Retrieves a message header value by the given case-insensitive name. * * This method returns an array of all the header values of the given * case-insensitive header name. * * If the header does not appear in the message, this method MUST return an * empty array. * * @param string $name Case-insensitive header field name. * @return string[] An array of string values as provided for the given * header. If the header does not appear in the message, this method MUST * return an empty array. */ public function getHeader(string $name): array; /** * Retrieves a comma-separated string of the values for a single header. * * This method returns all of the header values of the given * case-insensitive header name as a string concatenated together using * a comma. * * NOTE: Not all header values may be appropriately represented using * comma concatenation. For such headers, use getHeader() instead * and supply your own delimiter when concatenating. * * If the header does not appear in the message, this method MUST return * an empty string. * * @param string $name Case-insensitive header field name. * @return string A string of values as provided for the given header * concatenated together using a comma. If the header does not appear in * the message, this method MUST return an empty string. */ public function getHeaderLine(string $name): string; /** * Return an instance with the provided value replacing the specified header. * * While header names are case-insensitive, the casing of the header will * be preserved by this function, and returned from getHeaders(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new and/or updated header and value. * * @param string $name Case-insensitive header field name. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withHeader(string $name, $value): MessageInterface; /** * Return an instance with the specified header appended with the given value. * * Existing values for the specified header will be maintained. The new * value(s) will be appended to the existing list. If the header did not * exist previously, it will be added. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new header and/or value. * * @param string $name Case-insensitive header field name to add. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withAddedHeader(string $name, $value): MessageInterface; /** * Return an instance without the specified header. * * Header resolution MUST be done without case-sensitivity. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the named header. * * @param string $name Case-insensitive header field name to remove. * @return static */ public function withoutHeader(string $name): MessageInterface; /** * Gets the body of the message. * * @return StreamInterface Returns the body as a stream. */ public function getBody(): StreamInterface; /** * Return an instance with the specified message body. * * The body MUST be a StreamInterface object. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return a new instance that has the * new body stream. * * @param StreamInterface $body Body. * @return static * @throws \InvalidArgumentException When the body is not valid. */ public function withBody(StreamInterface $body): MessageInterface; } ================================================ FILE: core/widget/wechatServer/vendor/psr/http-message/src/RequestInterface.php ================================================ getQuery()` * or from the `QUERY_STRING` server param. * * @return array */ public function getQueryParams(): array; /** * Return an instance with the specified query string arguments. * * These values SHOULD remain immutable over the course of the incoming * request. They MAY be injected during instantiation, such as from PHP's * $_GET superglobal, or MAY be derived from some other value such as the * URI. In cases where the arguments are parsed from the URI, the data * MUST be compatible with what PHP's parse_str() would return for * purposes of how duplicate query parameters are handled, and how nested * sets are handled. * * Setting query string arguments MUST NOT change the URI stored by the * request, nor the values in the server params. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated query string arguments. * * @param array $query Array of query string arguments, typically from * $_GET. * @return static */ public function withQueryParams(array $query): ServerRequestInterface; /** * Retrieve normalized file upload data. * * This method returns upload metadata in a normalized tree, with each leaf * an instance of Psr\Http\Message\UploadedFileInterface. * * These values MAY be prepared from $_FILES or the message body during * instantiation, or MAY be injected via withUploadedFiles(). * * @return array An array tree of UploadedFileInterface instances; an empty * array MUST be returned if no data is present. */ public function getUploadedFiles(): array; /** * Create a new instance with the specified uploaded files. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param array $uploadedFiles An array tree of UploadedFileInterface instances. * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface; /** * Retrieve any parameters provided in the request body. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, this method MUST * return the contents of $_POST. * * Otherwise, this method may return any results of deserializing * the request body content; as parsing returns structured content, the * potential types MUST be arrays or objects only. A null value indicates * the absence of body content. * * @return null|array|object The deserialized body parameters, if any. * These will typically be an array or object. */ public function getParsedBody(); /** * Return an instance with the specified body parameters. * * These MAY be injected during instantiation. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, use this method * ONLY to inject the contents of $_POST. * * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of * deserializing the request body content. Deserialization/parsing returns * structured data, and, as such, this method ONLY accepts arrays or objects, * or a null value if nothing was available to parse. * * As an example, if content negotiation determines that the request data * is a JSON payload, this method could be used to create a request * instance with the deserialized parameters. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ public function withParsedBody($data): ServerRequestInterface; /** * Retrieve attributes derived from the request. * * The request "attributes" may be used to allow injection of any * parameters derived from the request: e.g., the results of path * match operations; the results of decrypting cookies; the results of * deserializing non-form-encoded message bodies; etc. Attributes * will be application and request specific, and CAN be mutable. * * @return array Attributes derived from the request. */ public function getAttributes(): array; /** * Retrieve a single derived request attribute. * * Retrieves a single derived request attribute as described in * getAttributes(). If the attribute has not been previously set, returns * the default value as provided. * * This method obviates the need for a hasAttribute() method, as it allows * specifying a default value to return if the attribute is not found. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $default Default value to return if the attribute does not exist. * @return mixed */ public function getAttribute(string $name, $default = null); /** * Return an instance with the specified derived request attribute. * * This method allows setting a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated attribute. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. * @return static */ public function withAttribute(string $name, $value): ServerRequestInterface; /** * Return an instance that removes the specified derived request attribute. * * This method allows removing a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the attribute. * * @see getAttributes() * @param string $name The attribute name. * @return static */ public function withoutAttribute(string $name): ServerRequestInterface; } ================================================ FILE: core/widget/wechatServer/vendor/psr/http-message/src/StreamInterface.php ================================================ * [user-info@]host[:port] * * * If the port component is not set or is the standard port for the current * scheme, it SHOULD NOT be included. * * @see https://tools.ietf.org/html/rfc3986#section-3.2 * @return string The URI authority, in "[user-info@]host[:port]" format. */ public function getAuthority(): string; /** * Retrieve the user information component of the URI. * * If no user information is present, this method MUST return an empty * string. * * If a user is present in the URI, this will return that value; * additionally, if the password is also present, it will be appended to the * user value, with a colon (":") separating the values. * * The trailing "@" character is not part of the user information and MUST * NOT be added. * * @return string The URI user information, in "username[:password]" format. */ public function getUserInfo(): string; /** * Retrieve the host component of the URI. * * If no host is present, this method MUST return an empty string. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.2.2. * * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 * @return string The URI host. */ public function getHost(): string; /** * Retrieve the port component of the URI. * * If a port is present, and it is non-standard for the current scheme, * this method MUST return it as an integer. If the port is the standard port * used with the current scheme, this method SHOULD return null. * * If no port is present, and no scheme is present, this method MUST return * a null value. * * If no port is present, but a scheme is present, this method MAY return * the standard port for that scheme, but SHOULD return null. * * @return null|int The URI port. */ public function getPort(): ?int; /** * Retrieve the path component of the URI. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Normally, the empty path "" and absolute path "/" are considered equal as * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically * do this normalization because in contexts with a trimmed base path, e.g. * the front controller, this difference becomes significant. It's the task * of the user to handle both "" and "/". * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.3. * * As an example, if the value should include a slash ("/") not intended as * delimiter between path segments, that value MUST be passed in encoded * form (e.g., "%2F") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.3 * @return string The URI path. */ public function getPath(): string; /** * Retrieve the query string of the URI. * * If no query string is present, this method MUST return an empty string. * * The leading "?" character is not part of the query and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.4. * * As an example, if a value in a key/value pair of the query string should * include an ampersand ("&") not intended as a delimiter between values, * that value MUST be passed in encoded form (e.g., "%26") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.4 * @return string The URI query string. */ public function getQuery(): string; /** * Retrieve the fragment component of the URI. * * If no fragment is present, this method MUST return an empty string. * * The leading "#" character is not part of the fragment and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.5. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.5 * @return string The URI fragment. */ public function getFragment(): string; /** * Return an instance with the specified scheme. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified scheme. * * Implementations MUST support the schemes "http" and "https" case * insensitively, and MAY accommodate other schemes if required. * * An empty scheme is equivalent to removing the scheme. * * @param string $scheme The scheme to use with the new instance. * @return static A new instance with the specified scheme. * @throws \InvalidArgumentException for invalid or unsupported schemes. */ public function withScheme(string $scheme): UriInterface; /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; an empty string for the user is equivalent to removing user * information. * * @param string $user The user name to use for authority. * @param null|string $password The password associated with $user. * @return static A new instance with the specified user information. */ public function withUserInfo(string $user, ?string $password = null): UriInterface; /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * An empty host value is equivalent to removing the host. * * @param string $host The hostname to use with the new instance. * @return static A new instance with the specified host. * @throws \InvalidArgumentException for invalid hostnames. */ public function withHost(string $host): UriInterface; /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * Implementations MUST raise an exception for ports outside the * established TCP and UDP port ranges. * * A null value provided for the port is equivalent to removing the port * information. * * @param null|int $port The port to use with the new instance; a null value * removes the port information. * @return static A new instance with the specified port. * @throws \InvalidArgumentException for invalid ports. */ public function withPort(?int $port): UriInterface; /** * Return an instance with the specified path. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified path. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * If the path is intended to be domain-relative rather than path relative then * it must begin with a slash ("/"). Paths not starting with a slash ("/") * are assumed to be relative to some base path known to the application or * consumer. * * Users can provide both encoded and decoded path characters. * Implementations ensure the correct encoding as outlined in getPath(). * * @param string $path The path to use with the new instance. * @return static A new instance with the specified path. * @throws \InvalidArgumentException for invalid paths. */ public function withPath(string $path): UriInterface; /** * Return an instance with the specified query string. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified query string. * * Users can provide both encoded and decoded query characters. * Implementations ensure the correct encoding as outlined in getQuery(). * * An empty query string value is equivalent to removing the query string. * * @param string $query The query string to use with the new instance. * @return static A new instance with the specified query string. * @throws \InvalidArgumentException for invalid query strings. */ public function withQuery(string $query): UriInterface; /** * Return an instance with the specified URI fragment. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified URI fragment. * * Users can provide both encoded and decoded fragment characters. * Implementations ensure the correct encoding as outlined in getFragment(). * * An empty fragment value is equivalent to removing the fragment. * * @param string $fragment The fragment to use with the new instance. * @return static A new instance with the specified fragment. */ public function withFragment(string $fragment): UriInterface; /** * Return the string representation as a URI reference. * * Depending on which components of the URI are present, the resulting * string is either a full URI or relative reference according to RFC 3986, * Section 4.1. The method concatenates the various components of the URI, * using the appropriate delimiters: * * - If a scheme is present, it MUST be suffixed by ":". * - If an authority is present, it MUST be prefixed by "//". * - The path can be concatenated without delimiters. But there are two * cases where the path has to be adjusted to make the URI reference * valid as PHP does not allow to throw an exception in __toString(): * - If the path is rootless and an authority is present, the path MUST * be prefixed by "/". * - If the path is starting with more than one "/" and no authority is * present, the starting slashes MUST be reduced to one. * - If a query is present, it MUST be prefixed by "?". * - If a fragment is present, it MUST be prefixed by "#". * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @return string */ public function __toString(): string; } ================================================ FILE: core/widget/wechatServer/vendor/psr/log/LICENSE ================================================ Copyright (c) 2012 PHP Framework Interoperability Group Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/psr/log/README.md ================================================ PSR Log ======= This repository holds all interfaces/classes/traits related to [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md). Note that this is not a logger of its own. It is merely an interface that describes a logger. See the specification for more details. Installation ------------ ```bash composer require psr/log ``` Usage ----- If you need a logger, you can use the interface like this: ```php logger = $logger; } public function doSomething() { if ($this->logger) { $this->logger->info('Doing work'); } try { $this->doSomethingElse(); } catch (Exception $exception) { $this->logger->error('Oh no!', array('exception' => $exception)); } // do something useful } } ``` You can then pick one of the implementations of the interface to get a logger. If you want to implement the interface, you can require this package and implement `Psr\Log\LoggerInterface` in your code. Please read the [specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) for details. ================================================ FILE: core/widget/wechatServer/vendor/psr/log/composer.json ================================================ { "name": "psr/log", "description": "Common interface for logging libraries", "keywords": ["psr", "psr-3", "log"], "homepage": "https://github.com/php-fig/log", "license": "MIT", "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "require": { "php": ">=8.0.0" }, "autoload": { "psr-4": { "Psr\\Log\\": "src" } }, "extra": { "branch-alias": { "dev-master": "3.x-dev" } } } ================================================ FILE: core/widget/wechatServer/vendor/psr/log/src/AbstractLogger.php ================================================ logger = $logger; } } ================================================ FILE: core/widget/wechatServer/vendor/psr/log/src/LoggerInterface.php ================================================ log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string|\Stringable $message * @param array $context * * @return void */ public function alert(string|\Stringable $message, array $context = []): void { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string|\Stringable $message * @param array $context * * @return void */ public function critical(string|\Stringable $message, array $context = []): void { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string|\Stringable $message * @param array $context * * @return void */ public function error(string|\Stringable $message, array $context = []): void { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string|\Stringable $message * @param array $context * * @return void */ public function warning(string|\Stringable $message, array $context = []): void { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string|\Stringable $message * @param array $context * * @return void */ public function notice(string|\Stringable $message, array $context = []): void { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string|\Stringable $message * @param array $context * * @return void */ public function info(string|\Stringable $message, array $context = []): void { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string|\Stringable $message * @param array $context * * @return void */ public function debug(string|\Stringable $message, array $context = []): void { $this->log(LogLevel::DEBUG, $message, $context); } /** * Logs with an arbitrary level. * * @param mixed $level * @param string|\Stringable $message * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ abstract public function log($level, string|\Stringable $message, array $context = []): void; } ================================================ FILE: core/widget/wechatServer/vendor/psr/log/src/NullLogger.php ================================================ logger) { }` * blocks. */ class NullLogger extends AbstractLogger { /** * Logs with an arbitrary level. * * @param mixed $level * @param string|\Stringable $message * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ public function log($level, string|\Stringable $message, array $context = []): void { // noop } } ================================================ FILE: core/widget/wechatServer/vendor/psr/simple-cache/.editorconfig ================================================ ; This file is for unifying the coding style for different editors and IDEs. ; More information at http://editorconfig.org root = true [*] charset = utf-8 indent_size = 4 indent_style = space end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true ================================================ FILE: core/widget/wechatServer/vendor/psr/simple-cache/LICENSE.md ================================================ # The MIT License (MIT) Copyright (c) 2016 PHP Framework Interoperability Group > Permission is hereby granted, free of charge, to any person obtaining a copy > of this software and associated documentation files (the "Software"), to deal > in the Software without restriction, including without limitation the rights > to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > copies of the Software, and to permit persons to whom the Software is > furnished to do so, subject to the following conditions: > > The above copyright notice and this permission notice shall be included in > all copies or substantial portions of the Software. > > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/psr/simple-cache/README.md ================================================ PHP FIG Simple Cache PSR ======================== This repository holds all interfaces related to PSR-16. Note that this is not a cache implementation of its own. It is merely an interface that describes a cache implementation. See [the specification](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-16-simple-cache.md) for more details. You can find implementations of the specification by looking for packages providing the [psr/simple-cache-implementation](https://packagist.org/providers/psr/simple-cache-implementation) virtual package. ================================================ FILE: core/widget/wechatServer/vendor/psr/simple-cache/composer.json ================================================ { "name": "psr/simple-cache", "description": "Common interfaces for simple caching", "keywords": ["psr", "psr-16", "cache", "simple-cache", "caching"], "license": "MIT", "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "require": { "php": ">=8.0.0" }, "autoload": { "psr-4": { "Psr\\SimpleCache\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "3.0.x-dev" } } } ================================================ FILE: core/widget/wechatServer/vendor/psr/simple-cache/src/CacheException.php ================================================ $keys A list of keys that can be obtained in a single operation. * @param mixed $default Default value to return for keys that do not exist. * * @return iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. * * @throws \Psr\SimpleCache\InvalidArgumentException * MUST be thrown if $keys is neither an array nor a Traversable, * or if any of the $keys are not a legal value. */ public function getMultiple(iterable $keys, mixed $default = null): iterable; /** * Persists a set of key => value pairs in the cache, with an optional TTL. * * @param iterable $values A list of key => value pairs for a multiple-set operation. * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and * the driver supports TTL then the library may set a default value * for it or let the driver take care of that. * * @return bool True on success and false on failure. * * @throws \Psr\SimpleCache\InvalidArgumentException * MUST be thrown if $values is neither an array nor a Traversable, * or if any of the $values are not a legal value. */ public function setMultiple(iterable $values, null|int|\DateInterval $ttl = null): bool; /** * Deletes multiple cache items in a single operation. * * @param iterable $keys A list of string-based keys to be deleted. * * @return bool True if the items were successfully removed. False if there was an error. * * @throws \Psr\SimpleCache\InvalidArgumentException * MUST be thrown if $keys is neither an array nor a Traversable, * or if any of the $keys are not a legal value. */ public function deleteMultiple(iterable $keys): bool; /** * Determines whether an item is present in the cache. * * NOTE: It is recommended that has() is only to be used for cache warming type purposes * and not to be used within your live applications operations for get/set, as this method * is subject to a race condition where your has() will return true and immediately after, * another script can remove it making the state of your app out of date. * * @param string $key The cache item key. * * @return bool * * @throws \Psr\SimpleCache\InvalidArgumentException * MUST be thrown if the $key string is not a legal value. */ public function has(string $key): bool; } ================================================ FILE: core/widget/wechatServer/vendor/psr/simple-cache/src/InvalidArgumentException.php ================================================ = 5.3. [![Build Status](https://travis-ci.org/ralouphie/getallheaders.svg?branch=master)](https://travis-ci.org/ralouphie/getallheaders) [![Coverage Status](https://coveralls.io/repos/ralouphie/getallheaders/badge.png?branch=master)](https://coveralls.io/r/ralouphie/getallheaders?branch=master) [![Latest Stable Version](https://poser.pugx.org/ralouphie/getallheaders/v/stable.png)](https://packagist.org/packages/ralouphie/getallheaders) [![Latest Unstable Version](https://poser.pugx.org/ralouphie/getallheaders/v/unstable.png)](https://packagist.org/packages/ralouphie/getallheaders) [![License](https://poser.pugx.org/ralouphie/getallheaders/license.png)](https://packagist.org/packages/ralouphie/getallheaders) This is a simple polyfill for [`getallheaders()`](http://www.php.net/manual/en/function.getallheaders.php). ## Install For PHP version **`>= 5.6`**: ``` composer require ralouphie/getallheaders ``` For PHP version **`< 5.6`**: ``` composer require ralouphie/getallheaders "^2" ``` ================================================ FILE: core/widget/wechatServer/vendor/ralouphie/getallheaders/composer.json ================================================ { "name": "ralouphie/getallheaders", "description": "A polyfill for getallheaders.", "license": "MIT", "authors": [ { "name": "Ralph Khattar", "email": "ralph.khattar@gmail.com" } ], "require": { "php": ">=5.6" }, "require-dev": { "phpunit/phpunit": "^5 || ^6.5", "php-coveralls/php-coveralls": "^2.1" }, "autoload": { "files": ["src/getallheaders.php"] }, "autoload-dev": { "psr-4": { "getallheaders\\Tests\\": "tests/" } } } ================================================ FILE: core/widget/wechatServer/vendor/ralouphie/getallheaders/src/getallheaders.php ================================================ 'Content-Type', 'CONTENT_LENGTH' => 'Content-Length', 'CONTENT_MD5' => 'Content-Md5', ); foreach ($_SERVER as $key => $value) { if (substr($key, 0, 5) === 'HTTP_') { $key = substr($key, 5); if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) { $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key)))); $headers[$key] = $value; } } elseif (isset($copy_server[$key])) { $headers[$copy_server[$key]] = $value; } } if (!isset($headers['Authorization'])) { if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; } elseif (isset($_SERVER['PHP_AUTH_USER'])) { $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass); } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) { $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST']; } } return $headers; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/AbstractAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\ResettableInterface; use Symfony\Component\Cache\Traits\AbstractAdapterTrait; use Symfony\Component\Cache\Traits\ContractsTrait; use Symfony\Contracts\Cache\CacheInterface; /** * @author Nicolas Grekas */ abstract class AbstractAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface { use AbstractAdapterTrait; use ContractsTrait; /** * @internal */ protected const NS_SEPARATOR = ':'; private static bool $apcuSupported; protected function __construct(string $namespace = '', int $defaultLifetime = 0) { $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).static::NS_SEPARATOR; $this->defaultLifetime = $defaultLifetime; if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) { throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given ("%s").', $this->maxIdLength - 24, \strlen($namespace), $namespace)); } self::$createCacheItem ??= \Closure::bind( static function ($key, $value, $isHit) { $item = new CacheItem(); $item->key = $key; $item->value = $value; $item->isHit = $isHit; $item->unpack(); return $item; }, null, CacheItem::class ); self::$mergeByLifetime ??= \Closure::bind( static function ($deferred, $namespace, &$expiredIds, $getId, $defaultLifetime) { $byLifetime = []; $now = microtime(true); $expiredIds = []; foreach ($deferred as $key => $item) { $key = (string) $key; if (null === $item->expiry) { $ttl = 0 < $defaultLifetime ? $defaultLifetime : 0; } elseif (!$item->expiry) { $ttl = 0; } elseif (0 >= $ttl = (int) (0.1 + $item->expiry - $now)) { $expiredIds[] = $getId($key); continue; } $byLifetime[$ttl][$getId($key)] = $item->pack(); } return $byLifetime; }, null, CacheItem::class ); } /** * Returns the best possible adapter that your runtime supports. * * Using ApcuAdapter makes system caches compatible with read-only filesystems. */ public static function createSystemCache(string $namespace, int $defaultLifetime, string $version, string $directory, ?LoggerInterface $logger = null): AdapterInterface { $opcache = new PhpFilesAdapter($namespace, $defaultLifetime, $directory, true); if (null !== $logger) { $opcache->setLogger($logger); } if (!self::$apcuSupported ??= ApcuAdapter::isSupported()) { return $opcache; } if ('cli' === \PHP_SAPI && !filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOL)) { return $opcache; } $apcu = new ApcuAdapter($namespace, intdiv($defaultLifetime, 5), $version); if (null !== $logger) { $apcu->setLogger($logger); } return new ChainAdapter([$apcu, $opcache]); } public static function createConnection(#[\SensitiveParameter] string $dsn, array $options = []): mixed { if (str_starts_with($dsn, 'redis:') || str_starts_with($dsn, 'rediss:')) { return RedisAdapter::createConnection($dsn, $options); } if (str_starts_with($dsn, 'memcached:')) { return MemcachedAdapter::createConnection($dsn, $options); } if (str_starts_with($dsn, 'couchbase:')) { if (CouchbaseBucketAdapter::isSupported()) { return CouchbaseBucketAdapter::createConnection($dsn, $options); } return CouchbaseCollectionAdapter::createConnection($dsn, $options); } throw new InvalidArgumentException('Unsupported DSN: it does not start with "redis[s]:", "memcached:" nor "couchbase:".'); } public function commit(): bool { $ok = true; $byLifetime = (self::$mergeByLifetime)($this->deferred, $this->namespace, $expiredIds, $this->getId(...), $this->defaultLifetime); $retry = $this->deferred = []; if ($expiredIds) { try { $this->doDelete($expiredIds); } catch (\Exception $e) { $ok = false; CacheItem::log($this->logger, 'Failed to delete expired items: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]); } } foreach ($byLifetime as $lifetime => $values) { try { $e = $this->doSave($values, $lifetime); } catch (\Exception $e) { } if (true === $e || [] === $e) { continue; } if (\is_array($e) || 1 === \count($values)) { foreach (\is_array($e) ? $e : array_keys($values) as $id) { $ok = false; $v = $values[$id]; $type = get_debug_type($v); $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.'); CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); } } else { foreach ($values as $id => $v) { $retry[$lifetime][] = $id; } } } // When bulk-save failed, retry each item individually foreach ($retry as $lifetime => $ids) { foreach ($ids as $id) { try { $v = $byLifetime[$lifetime][$id]; $e = $this->doSave([$id => $v], $lifetime); } catch (\Exception $e) { } if (true === $e || [] === $e) { continue; } $ok = false; $type = get_debug_type($v); $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.'); CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); } } return $ok; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Log\LoggerAwareInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\ResettableInterface; use Symfony\Component\Cache\Traits\AbstractAdapterTrait; use Symfony\Component\Cache\Traits\ContractsTrait; use Symfony\Contracts\Cache\TagAwareCacheInterface; /** * Abstract for native TagAware adapters. * * To keep info on tags, the tags are both serialized as part of cache value and provided as tag ids * to Adapters on operations when needed for storage to doSave(), doDelete() & doInvalidate(). * * @author Nicolas Grekas * @author André Rømcke * * @internal */ abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, LoggerAwareInterface, ResettableInterface { use AbstractAdapterTrait; use ContractsTrait; private const TAGS_PREFIX = "\1tags\1"; protected function __construct(string $namespace = '', int $defaultLifetime = 0) { $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).':'; $this->defaultLifetime = $defaultLifetime; if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) { throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given ("%s").', $this->maxIdLength - 24, \strlen($namespace), $namespace)); } self::$createCacheItem ??= \Closure::bind( static function ($key, $value, $isHit) { $item = new CacheItem(); $item->key = $key; $item->isTaggable = true; // If structure does not match what we expect return item as is (no value and not a hit) if (!\is_array($value) || !\array_key_exists('value', $value)) { return $item; } $item->isHit = $isHit; // Extract value, tags and meta data from the cache value $item->value = $value['value']; $item->metadata[CacheItem::METADATA_TAGS] = isset($value['tags']) ? array_combine($value['tags'], $value['tags']) : []; if (isset($value['meta'])) { // For compactness these values are packed, & expiry is offset to reduce size $v = unpack('Ve/Nc', $value['meta']); $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET; $item->metadata[CacheItem::METADATA_CTIME] = $v['c']; } return $item; }, null, CacheItem::class ); self::$mergeByLifetime ??= \Closure::bind( static function ($deferred, &$expiredIds, $getId, $tagPrefix, $defaultLifetime) { $byLifetime = []; $now = microtime(true); $expiredIds = []; foreach ($deferred as $key => $item) { $key = (string) $key; if (null === $item->expiry) { $ttl = 0 < $defaultLifetime ? $defaultLifetime : 0; } elseif (!$item->expiry) { $ttl = 0; } elseif (0 >= $ttl = (int) (0.1 + $item->expiry - $now)) { $expiredIds[] = $getId($key); continue; } // Store Value and Tags on the cache value if (isset(($metadata = $item->newMetadata)[CacheItem::METADATA_TAGS])) { $value = ['value' => $item->value, 'tags' => $metadata[CacheItem::METADATA_TAGS]]; unset($metadata[CacheItem::METADATA_TAGS]); } else { $value = ['value' => $item->value, 'tags' => []]; } if ($metadata) { // For compactness, expiry and creation duration are packed, using magic numbers as separators $value['meta'] = pack('VN', (int) (0.1 + $metadata[CacheItem::METADATA_EXPIRY] - CacheItem::METADATA_EXPIRY_OFFSET), $metadata[CacheItem::METADATA_CTIME]); } // Extract tag changes, these should be removed from values in doSave() $value['tag-operations'] = ['add' => [], 'remove' => []]; $oldTags = $item->metadata[CacheItem::METADATA_TAGS] ?? []; foreach (array_diff_key($value['tags'], $oldTags) as $addedTag) { $value['tag-operations']['add'][] = $getId($tagPrefix.$addedTag); } foreach (array_diff_key($oldTags, $value['tags']) as $removedTag) { $value['tag-operations']['remove'][] = $getId($tagPrefix.$removedTag); } $value['tags'] = array_keys($value['tags']); $byLifetime[$ttl][$getId($key)] = $value; $item->metadata = $item->newMetadata; } return $byLifetime; }, null, CacheItem::class ); } /** * Persists several cache items immediately. * * @param array $values The values to cache, indexed by their cache identifier * @param int $lifetime The lifetime of the cached values, 0 for persisting until manual cleaning * @param array[] $addTagData Hash where key is tag id, and array value is list of cache id's to add to tag * @param array[] $removeTagData Hash where key is tag id, and array value is list of cache id's to remove to tag * * @return array The identifiers that failed to be cached or a boolean stating if caching succeeded or not */ abstract protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []): array; /** * Removes multiple items from the pool and their corresponding tags. * * @param array $ids An array of identifiers that should be removed from the pool */ abstract protected function doDelete(array $ids): bool; /** * Removes relations between tags and deleted items. * * @param array $tagData Array of tag => key identifiers that should be removed from the pool */ abstract protected function doDeleteTagRelations(array $tagData): bool; /** * Invalidates cached items using tags. * * @param string[] $tagIds An array of tags to invalidate, key is tag and value is tag id */ abstract protected function doInvalidate(array $tagIds): bool; /** * Delete items and yields the tags they were bound to. */ protected function doDeleteYieldTags(array $ids): iterable { foreach ($this->doFetch($ids) as $id => $value) { yield $id => \is_array($value) && \is_array($value['tags'] ?? null) ? $value['tags'] : []; } $this->doDelete($ids); } public function commit(): bool { $ok = true; $byLifetime = (self::$mergeByLifetime)($this->deferred, $expiredIds, $this->getId(...), self::TAGS_PREFIX, $this->defaultLifetime); $retry = $this->deferred = []; if ($expiredIds) { // Tags are not cleaned up in this case, however that is done on invalidateTags(). try { $this->doDelete($expiredIds); } catch (\Exception $e) { $ok = false; CacheItem::log($this->logger, 'Failed to delete expired items: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]); } } foreach ($byLifetime as $lifetime => $values) { try { $values = $this->extractTagData($values, $addTagData, $removeTagData); $e = $this->doSave($values, $lifetime, $addTagData, $removeTagData); } catch (\Exception $e) { } if (true === $e || [] === $e) { continue; } if (\is_array($e) || 1 === \count($values)) { foreach (\is_array($e) ? $e : array_keys($values) as $id) { $ok = false; $v = $values[$id]; $type = get_debug_type($v); $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.'); CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); } } else { foreach ($values as $id => $v) { $retry[$lifetime][] = $id; } } } // When bulk-save failed, retry each item individually foreach ($retry as $lifetime => $ids) { foreach ($ids as $id) { try { $v = $byLifetime[$lifetime][$id]; $values = $this->extractTagData([$id => $v], $addTagData, $removeTagData); $e = $this->doSave($values, $lifetime, $addTagData, $removeTagData); } catch (\Exception $e) { } if (true === $e || [] === $e) { continue; } $ok = false; $type = get_debug_type($v); $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.'); CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); } } return $ok; } public function deleteItems(array $keys): bool { if (!$keys) { return true; } $ok = true; $ids = []; $tagData = []; foreach ($keys as $key) { $ids[$key] = $this->getId($key); unset($this->deferred[$key]); } try { foreach ($this->doDeleteYieldTags(array_values($ids)) as $id => $tags) { foreach ($tags as $tag) { $tagData[$this->getId(self::TAGS_PREFIX.$tag)][] = $id; } } } catch (\Exception) { $ok = false; } try { if ((!$tagData || $this->doDeleteTagRelations($tagData)) && $ok) { return true; } } catch (\Exception) { } // When bulk-delete failed, retry each item individually foreach ($ids as $key => $id) { try { $e = null; if ($this->doDelete([$id])) { continue; } } catch (\Exception $e) { } $message = 'Failed to delete key "{key}"'.($e instanceof \Exception ? ': '.$e->getMessage() : '.'); CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); $ok = false; } return $ok; } public function invalidateTags(array $tags): bool { if (!$tags) { return false; } $tagIds = []; foreach (array_unique($tags) as $tag) { $tagIds[] = $this->getId(self::TAGS_PREFIX.$tag); } try { if ($this->doInvalidate($tagIds)) { return true; } } catch (\Exception $e) { CacheItem::log($this->logger, 'Failed to invalidate tags: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]); } return false; } /** * Extracts tags operation data from $values set in mergeByLifetime, and returns values without it. */ private function extractTagData(array $values, ?array &$addTagData, ?array &$removeTagData): array { $addTagData = $removeTagData = []; foreach ($values as $id => $value) { foreach ($value['tag-operations']['add'] as $tag => $tagId) { $addTagData[$tagId][] = $id; } foreach ($value['tag-operations']['remove'] as $tag => $tagId) { $removeTagData[$tagId][] = $id; } unset($values[$id]['tag-operations']); } return $values; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/AdapterInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Cache\CacheItemPoolInterface; use Symfony\Component\Cache\CacheItem; // Help opcache.preload discover always-needed symbols class_exists(CacheItem::class); /** * Interface for adapters managing instances of Symfony's CacheItem. * * @author Kévin Dunglas */ interface AdapterInterface extends CacheItemPoolInterface { public function getItem(mixed $key): CacheItem; /** * @return iterable */ public function getItems(array $keys = []): iterable; public function clear(string $prefix = ''): bool; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/ApcuAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\Exception\CacheException; use Symfony\Component\Cache\Marshaller\MarshallerInterface; /** * @author Nicolas Grekas */ class ApcuAdapter extends AbstractAdapter { private ?MarshallerInterface $marshaller; /** * @throws CacheException if APCu is not enabled */ public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $version = null, ?MarshallerInterface $marshaller = null) { if (!static::isSupported()) { throw new CacheException('APCu is not enabled.'); } if ('cli' === \PHP_SAPI) { ini_set('apc.use_request_time', 0); } parent::__construct($namespace, $defaultLifetime); if (null !== $version) { CacheItem::validateKey($version); if (!apcu_exists($version.'@'.$namespace)) { $this->doClear($namespace); apcu_add($version.'@'.$namespace, null); } } $this->marshaller = $marshaller; } /** * @return bool */ public static function isSupported() { return \function_exists('apcu_fetch') && filter_var(\ini_get('apc.enabled'), \FILTER_VALIDATE_BOOL); } protected function doFetch(array $ids): iterable { $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback'); try { $values = []; foreach (apcu_fetch($ids, $ok) ?: [] as $k => $v) { if (null !== $v || $ok) { $values[$k] = null !== $this->marshaller ? $this->marshaller->unmarshall($v) : $v; } } return $values; } catch (\Error $e) { throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); } finally { ini_set('unserialize_callback_func', $unserializeCallbackHandler); } } protected function doHave(string $id): bool { return apcu_exists($id); } protected function doClear(string $namespace): bool { return isset($namespace[0]) && class_exists(\APCUIterator::class, false) && ('cli' !== \PHP_SAPI || filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOL)) ? apcu_delete(new \APCUIterator(sprintf('/^%s/', preg_quote($namespace, '/')), \APC_ITER_KEY)) : apcu_clear_cache(); } protected function doDelete(array $ids): bool { foreach ($ids as $id) { apcu_delete($id); } return true; } protected function doSave(array $values, int $lifetime): array|bool { if (null !== $this->marshaller && (!$values = $this->marshaller->marshall($values, $failed))) { return $failed; } try { if (false === $failures = apcu_store($values, null, $lifetime)) { $failures = $values; } return array_keys($failures); } catch (\Throwable $e) { if (1 === \count($values)) { // Workaround https://github.com/krakjoe/apcu/issues/170 apcu_delete(array_key_first($values)); } throw $e; } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/ArrayAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Cache\CacheItemInterface; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerAwareTrait; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\ResettableInterface; use Symfony\Contracts\Cache\CacheInterface; /** * An in-memory cache storage. * * Acts as a least-recently-used (LRU) storage when configured with a maximum number of items. * * @author Nicolas Grekas */ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface { use LoggerAwareTrait; private bool $storeSerialized; private array $values = []; private array $tags = []; private array $expiries = []; private int $defaultLifetime; private float $maxLifetime; private int $maxItems; private static \Closure $createCacheItem; /** * @param bool $storeSerialized Disabling serialization can lead to cache corruptions when storing mutable values but increases performance otherwise */ public function __construct(int $defaultLifetime = 0, bool $storeSerialized = true, float $maxLifetime = 0, int $maxItems = 0) { if (0 > $maxLifetime) { throw new InvalidArgumentException(sprintf('Argument $maxLifetime must be positive, %F passed.', $maxLifetime)); } if (0 > $maxItems) { throw new InvalidArgumentException(sprintf('Argument $maxItems must be a positive integer, %d passed.', $maxItems)); } $this->defaultLifetime = $defaultLifetime; $this->storeSerialized = $storeSerialized; $this->maxLifetime = $maxLifetime; $this->maxItems = $maxItems; self::$createCacheItem ??= \Closure::bind( static function ($key, $value, $isHit, $tags) { $item = new CacheItem(); $item->key = $key; $item->value = $value; $item->isHit = $isHit; if (null !== $tags) { $item->metadata[CacheItem::METADATA_TAGS] = $tags; } return $item; }, null, CacheItem::class ); } public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed { $item = $this->getItem($key); $metadata = $item->getMetadata(); // ArrayAdapter works in memory, we don't care about stampede protection if (\INF === $beta || !$item->isHit()) { $save = true; $item->set($callback($item, $save)); if ($save) { $this->save($item); } } return $item->get(); } public function delete(string $key): bool { return $this->deleteItem($key); } public function hasItem(mixed $key): bool { if (\is_string($key) && isset($this->expiries[$key]) && $this->expiries[$key] > microtime(true)) { if ($this->maxItems) { // Move the item last in the storage $value = $this->values[$key]; unset($this->values[$key]); $this->values[$key] = $value; } return true; } \assert('' !== CacheItem::validateKey($key)); return isset($this->expiries[$key]) && !$this->deleteItem($key); } public function getItem(mixed $key): CacheItem { if (!$isHit = $this->hasItem($key)) { $value = null; if (!$this->maxItems) { // Track misses in non-LRU mode only $this->values[$key] = null; } } else { $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key]; } return (self::$createCacheItem)($key, $value, $isHit, $this->tags[$key] ?? null); } public function getItems(array $keys = []): iterable { \assert(self::validateKeys($keys)); return $this->generateItems($keys, microtime(true), self::$createCacheItem); } public function deleteItem(mixed $key): bool { \assert('' !== CacheItem::validateKey($key)); unset($this->values[$key], $this->tags[$key], $this->expiries[$key]); return true; } public function deleteItems(array $keys): bool { foreach ($keys as $key) { $this->deleteItem($key); } return true; } public function save(CacheItemInterface $item): bool { if (!$item instanceof CacheItem) { return false; } $item = (array) $item; $key = $item["\0*\0key"]; $value = $item["\0*\0value"]; $expiry = $item["\0*\0expiry"]; $now = microtime(true); if (null !== $expiry) { if (!$expiry) { $expiry = \PHP_INT_MAX; } elseif ($expiry <= $now) { $this->deleteItem($key); return true; } } if ($this->storeSerialized && null === $value = $this->freeze($value, $key)) { return false; } if (null === $expiry && 0 < $this->defaultLifetime) { $expiry = $this->defaultLifetime; $expiry = $now + ($expiry > ($this->maxLifetime ?: $expiry) ? $this->maxLifetime : $expiry); } elseif ($this->maxLifetime && (null === $expiry || $expiry > $now + $this->maxLifetime)) { $expiry = $now + $this->maxLifetime; } if ($this->maxItems) { unset($this->values[$key], $this->tags[$key]); // Iterate items and vacuum expired ones while we are at it foreach ($this->values as $k => $v) { if ($this->expiries[$k] > $now && \count($this->values) < $this->maxItems) { break; } unset($this->values[$k], $this->tags[$k], $this->expiries[$k]); } } $this->values[$key] = $value; $this->expiries[$key] = $expiry ?? \PHP_INT_MAX; if (null === $this->tags[$key] = $item["\0*\0newMetadata"][CacheItem::METADATA_TAGS] ?? null) { unset($this->tags[$key]); } return true; } public function saveDeferred(CacheItemInterface $item): bool { return $this->save($item); } public function commit(): bool { return true; } public function clear(string $prefix = ''): bool { if ('' !== $prefix) { $now = microtime(true); foreach ($this->values as $key => $value) { if (!isset($this->expiries[$key]) || $this->expiries[$key] <= $now || str_starts_with($key, $prefix)) { unset($this->values[$key], $this->tags[$key], $this->expiries[$key]); } } if ($this->values) { return true; } } $this->values = $this->tags = $this->expiries = []; return true; } /** * Returns all cached values, with cache miss as null. */ public function getValues(): array { if (!$this->storeSerialized) { return $this->values; } $values = $this->values; foreach ($values as $k => $v) { if (null === $v || 'N;' === $v) { continue; } if (!\is_string($v) || !isset($v[2]) || ':' !== $v[1]) { $values[$k] = serialize($v); } } return $values; } /** * @return void */ public function reset() { $this->clear(); } private function generateItems(array $keys, float $now, \Closure $f): \Generator { foreach ($keys as $i => $key) { if (!$isHit = isset($this->expiries[$key]) && ($this->expiries[$key] > $now || !$this->deleteItem($key))) { $value = null; if (!$this->maxItems) { // Track misses in non-LRU mode only $this->values[$key] = null; } } else { if ($this->maxItems) { // Move the item last in the storage $value = $this->values[$key]; unset($this->values[$key]); $this->values[$key] = $value; } $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key]; } unset($keys[$i]); yield $key => $f($key, $value, $isHit, $this->tags[$key] ?? null); } foreach ($keys as $key) { yield $key => $f($key, null, false); } } private function freeze($value, string $key): string|int|float|bool|array|\UnitEnum|null { if (null === $value) { return 'N;'; } if (\is_string($value)) { // Serialize strings if they could be confused with serialized objects or arrays if ('N;' === $value || (isset($value[2]) && ':' === $value[1])) { return serialize($value); } } elseif (!\is_scalar($value)) { try { $serialized = serialize($value); } catch (\Exception $e) { unset($this->values[$key], $this->tags[$key]); $type = get_debug_type($value); $message = sprintf('Failed to save key "{key}" of type %s: %s', $type, $e->getMessage()); CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); return null; } // Keep value serialized if it contains any objects or any internal references if ('C' === $serialized[0] || 'O' === $serialized[0] || preg_match('/;[OCRr]:[1-9]/', $serialized)) { return $serialized; } } return $value; } private function unfreeze(string $key, bool &$isHit): mixed { if ('N;' === $value = $this->values[$key]) { return null; } if (\is_string($value) && isset($value[2]) && ':' === $value[1]) { try { $value = unserialize($value); } catch (\Exception $e) { CacheItem::log($this->logger, 'Failed to unserialize key "{key}": '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); $value = false; } if (false === $value) { $value = null; $isHit = false; if (!$this->maxItems) { $this->values[$key] = null; } } } return $value; } private function validateKeys(array $keys): bool { foreach ($keys as $key) { if (!\is_string($key) || !isset($this->expiries[$key])) { CacheItem::validateKey($key); } } return true; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/ChainAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Cache\CacheItemInterface; use Psr\Cache\CacheItemPoolInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\ResettableInterface; use Symfony\Component\Cache\Traits\ContractsTrait; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Contracts\Service\ResetInterface; /** * Chains several adapters together. * * Cached items are fetched from the first adapter having them in its data store. * They are saved and deleted in all adapters at once. * * @author Kévin Dunglas */ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface { use ContractsTrait; private array $adapters = []; private int $adapterCount; private int $defaultLifetime; private static \Closure $syncItem; /** * @param CacheItemPoolInterface[] $adapters The ordered list of adapters used to fetch cached items * @param int $defaultLifetime The default lifetime of items propagated from lower adapters to upper ones */ public function __construct(array $adapters, int $defaultLifetime = 0) { if (!$adapters) { throw new InvalidArgumentException('At least one adapter must be specified.'); } foreach ($adapters as $adapter) { if (!$adapter instanceof CacheItemPoolInterface) { throw new InvalidArgumentException(sprintf('The class "%s" does not implement the "%s" interface.', get_debug_type($adapter), CacheItemPoolInterface::class)); } if ('cli' === \PHP_SAPI && $adapter instanceof ApcuAdapter && !filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOL)) { continue; // skip putting APCu in the chain when the backend is disabled } if ($adapter instanceof AdapterInterface) { $this->adapters[] = $adapter; } else { $this->adapters[] = new ProxyAdapter($adapter); } } $this->adapterCount = \count($this->adapters); $this->defaultLifetime = $defaultLifetime; self::$syncItem ??= \Closure::bind( static function ($sourceItem, $item, $defaultLifetime, $sourceMetadata = null) { $sourceItem->isTaggable = false; $sourceMetadata ??= $sourceItem->metadata; $item->value = $sourceItem->value; $item->isHit = $sourceItem->isHit; $item->metadata = $item->newMetadata = $sourceItem->metadata = $sourceMetadata; if (isset($item->metadata[CacheItem::METADATA_EXPIRY])) { $item->expiresAt(\DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', $item->metadata[CacheItem::METADATA_EXPIRY]))); } elseif (0 < $defaultLifetime) { $item->expiresAfter($defaultLifetime); } return $item; }, null, CacheItem::class ); } public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed { $doSave = true; $callback = static function (CacheItem $item, bool &$save) use ($callback, &$doSave) { $value = $callback($item, $save); $doSave = $save; return $value; }; $wrap = function (?CacheItem $item = null, bool &$save = true) use ($key, $callback, $beta, &$wrap, &$doSave, &$metadata) { static $lastItem; static $i = 0; $adapter = $this->adapters[$i]; if (isset($this->adapters[++$i])) { $callback = $wrap; $beta = \INF === $beta ? \INF : 0; } if ($adapter instanceof CacheInterface) { $value = $adapter->get($key, $callback, $beta, $metadata); } else { $value = $this->doGet($adapter, $key, $callback, $beta, $metadata); } if (null !== $item) { (self::$syncItem)($lastItem ??= $item, $item, $this->defaultLifetime, $metadata); } $save = $doSave; return $value; }; return $wrap(); } public function getItem(mixed $key): CacheItem { $syncItem = self::$syncItem; $misses = []; foreach ($this->adapters as $i => $adapter) { $item = $adapter->getItem($key); if ($item->isHit()) { while (0 <= --$i) { $this->adapters[$i]->save($syncItem($item, $misses[$i], $this->defaultLifetime)); } return $item; } $misses[$i] = $item; } return $item; } public function getItems(array $keys = []): iterable { return $this->generateItems($this->adapters[0]->getItems($keys), 0); } private function generateItems(iterable $items, int $adapterIndex): \Generator { $missing = []; $misses = []; $nextAdapterIndex = $adapterIndex + 1; $nextAdapter = $this->adapters[$nextAdapterIndex] ?? null; foreach ($items as $k => $item) { if (!$nextAdapter || $item->isHit()) { yield $k => $item; } else { $missing[] = $k; $misses[$k] = $item; } } if ($missing) { $syncItem = self::$syncItem; $adapter = $this->adapters[$adapterIndex]; $items = $this->generateItems($nextAdapter->getItems($missing), $nextAdapterIndex); foreach ($items as $k => $item) { if ($item->isHit()) { $adapter->save($syncItem($item, $misses[$k], $this->defaultLifetime)); } yield $k => $item; } } } public function hasItem(mixed $key): bool { foreach ($this->adapters as $adapter) { if ($adapter->hasItem($key)) { return true; } } return false; } public function clear(string $prefix = ''): bool { $cleared = true; $i = $this->adapterCount; while ($i--) { if ($this->adapters[$i] instanceof AdapterInterface) { $cleared = $this->adapters[$i]->clear($prefix) && $cleared; } else { $cleared = $this->adapters[$i]->clear() && $cleared; } } return $cleared; } public function deleteItem(mixed $key): bool { $deleted = true; $i = $this->adapterCount; while ($i--) { $deleted = $this->adapters[$i]->deleteItem($key) && $deleted; } return $deleted; } public function deleteItems(array $keys): bool { $deleted = true; $i = $this->adapterCount; while ($i--) { $deleted = $this->adapters[$i]->deleteItems($keys) && $deleted; } return $deleted; } public function save(CacheItemInterface $item): bool { $saved = true; $i = $this->adapterCount; while ($i--) { $saved = $this->adapters[$i]->save($item) && $saved; } return $saved; } public function saveDeferred(CacheItemInterface $item): bool { $saved = true; $i = $this->adapterCount; while ($i--) { $saved = $this->adapters[$i]->saveDeferred($item) && $saved; } return $saved; } public function commit(): bool { $committed = true; $i = $this->adapterCount; while ($i--) { $committed = $this->adapters[$i]->commit() && $committed; } return $committed; } public function prune(): bool { $pruned = true; foreach ($this->adapters as $adapter) { if ($adapter instanceof PruneableInterface) { $pruned = $adapter->prune() && $pruned; } } return $pruned; } /** * @return void */ public function reset() { foreach ($this->adapters as $adapter) { if ($adapter instanceof ResetInterface) { $adapter->reset(); } } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Symfony\Component\Cache\Exception\CacheException; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; /** * @author Antonio Jose Cerezo Aranda */ class CouchbaseBucketAdapter extends AbstractAdapter { private const THIRTY_DAYS_IN_SECONDS = 2592000; private const MAX_KEY_LENGTH = 250; private const KEY_NOT_FOUND = 13; private const VALID_DSN_OPTIONS = [ 'operationTimeout', 'configTimeout', 'configNodeTimeout', 'n1qlTimeout', 'httpTimeout', 'configDelay', 'htconfigIdleTimeout', 'durabilityInterval', 'durabilityTimeout', ]; private \CouchbaseBucket $bucket; private MarshallerInterface $marshaller; public function __construct(\CouchbaseBucket $bucket, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null) { if (!static::isSupported()) { throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.'); } $this->maxIdLength = static::MAX_KEY_LENGTH; $this->bucket = $bucket; parent::__construct($namespace, $defaultLifetime); $this->enableVersioning(); $this->marshaller = $marshaller ?? new DefaultMarshaller(); } public static function createConnection(#[\SensitiveParameter] array|string $servers, array $options = []): \CouchbaseBucket { if (\is_string($servers)) { $servers = [$servers]; } if (!static::isSupported()) { throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.'); } set_error_handler(static fn ($type, $msg, $file, $line) => throw new \ErrorException($msg, 0, $type, $file, $line)); $dsnPattern = '/^(?couchbase(?:s)?)\:\/\/(?:(?[^\:]+)\:(?[^\@]{6,})@)?' .'(?[^\:]+(?:\:\d+)?)(?:\/(?[^\?]+))(?:\?(?.*))?$/i'; $newServers = []; $protocol = 'couchbase'; try { $options = self::initOptions($options); $username = $options['username']; $password = $options['password']; foreach ($servers as $dsn) { if (!str_starts_with($dsn, 'couchbase:')) { throw new InvalidArgumentException('Invalid Couchbase DSN: it does not start with "couchbase:".'); } preg_match($dsnPattern, $dsn, $matches); $username = $matches['username'] ?: $username; $password = $matches['password'] ?: $password; $protocol = $matches['protocol'] ?: $protocol; if (isset($matches['options'])) { $optionsInDsn = self::getOptions($matches['options']); foreach ($optionsInDsn as $parameter => $value) { $options[$parameter] = $value; } } $newServers[] = $matches['host']; } $connectionString = $protocol.'://'.implode(',', $newServers); $client = new \CouchbaseCluster($connectionString); $client->authenticateAs($username, $password); $bucket = $client->openBucket($matches['bucketName']); unset($options['username'], $options['password']); foreach ($options as $option => $value) { if (!empty($value)) { $bucket->$option = $value; } } return $bucket; } finally { restore_error_handler(); } } public static function isSupported(): bool { return \extension_loaded('couchbase') && version_compare(phpversion('couchbase'), '2.6.0', '>=') && version_compare(phpversion('couchbase'), '3.0', '<'); } private static function getOptions(string $options): array { $results = []; $optionsInArray = explode('&', $options); foreach ($optionsInArray as $option) { [$key, $value] = explode('=', $option); if (\in_array($key, static::VALID_DSN_OPTIONS, true)) { $results[$key] = $value; } } return $results; } private static function initOptions(array $options): array { $options['username'] ??= ''; $options['password'] ??= ''; $options['operationTimeout'] ??= 0; $options['configTimeout'] ??= 0; $options['configNodeTimeout'] ??= 0; $options['n1qlTimeout'] ??= 0; $options['httpTimeout'] ??= 0; $options['configDelay'] ??= 0; $options['htconfigIdleTimeout'] ??= 0; $options['durabilityInterval'] ??= 0; $options['durabilityTimeout'] ??= 0; return $options; } protected function doFetch(array $ids): iterable { $resultsCouchbase = $this->bucket->get($ids); $results = []; foreach ($resultsCouchbase as $key => $value) { if (null !== $value->error) { continue; } $results[$key] = $this->marshaller->unmarshall($value->value); } return $results; } protected function doHave(string $id): bool { return false !== $this->bucket->get($id); } protected function doClear(string $namespace): bool { if ('' === $namespace) { $this->bucket->manager()->flush(); return true; } return false; } protected function doDelete(array $ids): bool { $results = $this->bucket->remove(array_values($ids)); foreach ($results as $key => $result) { if (null !== $result->error && static::KEY_NOT_FOUND !== $result->error->getCode()) { continue; } unset($results[$key]); } return 0 === \count($results); } protected function doSave(array $values, int $lifetime): array|bool { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; } $lifetime = $this->normalizeExpiry($lifetime); $ko = []; foreach ($values as $key => $value) { $result = $this->bucket->upsert($key, $value, ['expiry' => $lifetime]); if (null !== $result->error) { $ko[$key] = $result; } } return [] === $ko ? true : $ko; } private function normalizeExpiry(int $expiry): int { if ($expiry && $expiry > static::THIRTY_DAYS_IN_SECONDS) { $expiry += time(); } return $expiry; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Couchbase\Bucket; use Couchbase\Cluster; use Couchbase\ClusterOptions; use Couchbase\Collection; use Couchbase\DocumentNotFoundException; use Couchbase\UpsertOptions; use Symfony\Component\Cache\Exception\CacheException; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; /** * @author Antonio Jose Cerezo Aranda */ class CouchbaseCollectionAdapter extends AbstractAdapter { private const MAX_KEY_LENGTH = 250; private Collection $connection; private MarshallerInterface $marshaller; public function __construct(Collection $connection, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null) { if (!static::isSupported()) { throw new CacheException('Couchbase >= 3.0.5 < 4.0.0 is required.'); } $this->maxIdLength = static::MAX_KEY_LENGTH; $this->connection = $connection; parent::__construct($namespace, $defaultLifetime); $this->enableVersioning(); $this->marshaller = $marshaller ?? new DefaultMarshaller(); } public static function createConnection(#[\SensitiveParameter] array|string $dsn, array $options = []): Bucket|Collection { if (\is_string($dsn)) { $dsn = [$dsn]; } if (!static::isSupported()) { throw new CacheException('Couchbase >= 3.0.5 < 4.0.0 is required.'); } set_error_handler(static fn ($type, $msg, $file, $line) => throw new \ErrorException($msg, 0, $type, $file, $line)); $dsnPattern = '/^(?couchbase(?:s)?)\:\/\/(?:(?[^\:]+)\:(?[^\@]{6,})@)?' .'(?[^\:]+(?:\:\d+)?)(?:\/(?[^\/\?]+))(?:(?:\/(?[^\/]+))' .'(?:\/(?[^\/\?]+)))?(?:\/)?(?:\?(?.*))?$/i'; $newServers = []; $protocol = 'couchbase'; try { $username = $options['username'] ?? ''; $password = $options['password'] ?? ''; foreach ($dsn as $server) { if (!str_starts_with($server, 'couchbase:')) { throw new InvalidArgumentException('Invalid Couchbase DSN: it does not start with "couchbase:".'); } preg_match($dsnPattern, $server, $matches); $username = $matches['username'] ?: $username; $password = $matches['password'] ?: $password; $protocol = $matches['protocol'] ?: $protocol; if (isset($matches['options'])) { $optionsInDsn = self::getOptions($matches['options']); foreach ($optionsInDsn as $parameter => $value) { $options[$parameter] = $value; } } $newServers[] = $matches['host']; } $option = isset($matches['options']) ? '?'.$matches['options'] : ''; $connectionString = $protocol.'://'.implode(',', $newServers).$option; $clusterOptions = new ClusterOptions(); $clusterOptions->credentials($username, $password); $client = new Cluster($connectionString, $clusterOptions); $bucket = $client->bucket($matches['bucketName']); $collection = $bucket->defaultCollection(); if (!empty($matches['scopeName'])) { $scope = $bucket->scope($matches['scopeName']); $collection = $scope->collection($matches['collectionName']); } return $collection; } finally { restore_error_handler(); } } public static function isSupported(): bool { return \extension_loaded('couchbase') && version_compare(phpversion('couchbase'), '3.0.5', '>=') && version_compare(phpversion('couchbase'), '4.0', '<'); } private static function getOptions(string $options): array { $results = []; $optionsInArray = explode('&', $options); foreach ($optionsInArray as $option) { [$key, $value] = explode('=', $option); $results[$key] = $value; } return $results; } protected function doFetch(array $ids): array { $results = []; foreach ($ids as $id) { try { $resultCouchbase = $this->connection->get($id); } catch (DocumentNotFoundException) { continue; } $content = $resultCouchbase->value ?? $resultCouchbase->content(); $results[$id] = $this->marshaller->unmarshall($content); } return $results; } protected function doHave($id): bool { return $this->connection->exists($id)->exists(); } protected function doClear($namespace): bool { return false; } protected function doDelete(array $ids): bool { $idsErrors = []; foreach ($ids as $id) { try { $result = $this->connection->remove($id); if (null === $result->mutationToken()) { $idsErrors[] = $id; } } catch (DocumentNotFoundException) { } } return 0 === \count($idsErrors); } protected function doSave(array $values, $lifetime): array|bool { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; } $upsertOptions = new UpsertOptions(); $upsertOptions->expiry($lifetime); $ko = []; foreach ($values as $key => $value) { try { $this->connection->upsert($key, $value, $upsertOptions); } catch (\Exception) { $ko[$key] = ''; } } return [] === $ko ? true : $ko; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Doctrine\DBAL\ArrayParameterType; use Doctrine\DBAL\Configuration; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Driver\ServerInfoAwareConnection; use Doctrine\DBAL\DriverManager; use Doctrine\DBAL\Exception as DBALException; use Doctrine\DBAL\Exception\TableNotFoundException; use Doctrine\DBAL\ParameterType; use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory; use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\ServerVersionProvider; use Doctrine\DBAL\Tools\DsnParser; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; use Symfony\Component\Cache\PruneableInterface; class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface { private const MAX_KEY_LENGTH = 255; private MarshallerInterface $marshaller; private Connection $conn; private string $platformName; private string $serverVersion; private string $table = 'cache_items'; private string $idCol = 'item_id'; private string $dataCol = 'item_data'; private string $lifetimeCol = 'item_lifetime'; private string $timeCol = 'item_time'; private string $namespace; /** * You can either pass an existing database Doctrine DBAL Connection or * a DSN string that will be used to connect to the database. * * The cache table is created automatically when possible. * Otherwise, use the createTable() method. * * List of available options: * * db_table: The name of the table [default: cache_items] * * db_id_col: The column where to store the cache id [default: item_id] * * db_data_col: The column where to store the cache data [default: item_data] * * db_lifetime_col: The column where to store the lifetime [default: item_lifetime] * * db_time_col: The column where to store the timestamp [default: item_time] * * @throws InvalidArgumentException When namespace contains invalid characters */ public function __construct(Connection|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], ?MarshallerInterface $marshaller = null) { if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) { throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0])); } if ($connOrDsn instanceof Connection) { $this->conn = $connOrDsn; } else { if (!class_exists(DriverManager::class)) { throw new InvalidArgumentException('Failed to parse DSN. Try running "composer require doctrine/dbal".'); } if (class_exists(DsnParser::class)) { $params = (new DsnParser([ 'db2' => 'ibm_db2', 'mssql' => 'pdo_sqlsrv', 'mysql' => 'pdo_mysql', 'mysql2' => 'pdo_mysql', 'postgres' => 'pdo_pgsql', 'postgresql' => 'pdo_pgsql', 'pgsql' => 'pdo_pgsql', 'sqlite' => 'pdo_sqlite', 'sqlite3' => 'pdo_sqlite', ]))->parse($connOrDsn); } else { $params = ['url' => $connOrDsn]; } $config = new Configuration(); if (class_exists(DefaultSchemaManagerFactory::class)) { $config->setSchemaManagerFactory(new DefaultSchemaManagerFactory()); } $this->conn = DriverManager::getConnection($params, $config); } $this->maxIdLength = self::MAX_KEY_LENGTH; $this->table = $options['db_table'] ?? $this->table; $this->idCol = $options['db_id_col'] ?? $this->idCol; $this->dataCol = $options['db_data_col'] ?? $this->dataCol; $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol; $this->timeCol = $options['db_time_col'] ?? $this->timeCol; $this->namespace = $namespace; $this->marshaller = $marshaller ?? new DefaultMarshaller(); parent::__construct($namespace, $defaultLifetime); } /** * Creates the table to store cache items which can be called once for setup. * * Cache ID are saved in a column of maximum length 255. Cache data is * saved in a BLOB. * * @throws DBALException When the table already exists */ public function createTable(): void { $schema = new Schema(); $this->addTableToSchema($schema); foreach ($schema->toSql($this->conn->getDatabasePlatform()) as $sql) { $this->conn->executeStatement($sql); } } /** * @param \Closure $isSameDatabase */ public function configureSchema(Schema $schema, Connection $forConnection/* , \Closure $isSameDatabase */): void { if ($schema->hasTable($this->table)) { return; } $isSameDatabase = 2 < \func_num_args() ? func_get_arg(2) : static fn () => false; if ($forConnection !== $this->conn && !$isSameDatabase($this->conn->executeStatement(...))) { return; } $this->addTableToSchema($schema); } public function prune(): bool { $deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ?"; $params = [time()]; $paramTypes = [ParameterType::INTEGER]; if ('' !== $this->namespace) { $deleteSql .= " AND $this->idCol LIKE ?"; $params[] = sprintf('%s%%', $this->namespace); $paramTypes[] = ParameterType::STRING; } try { $this->conn->executeStatement($deleteSql, $params, $paramTypes); } catch (TableNotFoundException) { } return true; } protected function doFetch(array $ids): iterable { $now = time(); $expired = []; $sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN (?)"; $result = $this->conn->executeQuery($sql, [ $now, $ids, ], [ ParameterType::INTEGER, class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY, ])->iterateNumeric(); foreach ($result as $row) { if (null === $row[1]) { $expired[] = $row[0]; } else { yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]); } } if ($expired) { $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN (?)"; $this->conn->executeStatement($sql, [ $now, $expired, ], [ ParameterType::INTEGER, class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY, ]); } } protected function doHave(string $id): bool { $sql = "SELECT 1 FROM $this->table WHERE $this->idCol = ? AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ?)"; $result = $this->conn->executeQuery($sql, [ $id, time(), ], [ ParameterType::STRING, ParameterType::INTEGER, ]); return (bool) $result->fetchOne(); } protected function doClear(string $namespace): bool { if ('' === $namespace) { $sql = $this->conn->getDatabasePlatform()->getTruncateTableSQL($this->table); } else { $sql = "DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'"; } try { $this->conn->executeStatement($sql); } catch (TableNotFoundException) { } return true; } protected function doDelete(array $ids): bool { $sql = "DELETE FROM $this->table WHERE $this->idCol IN (?)"; try { $this->conn->executeStatement($sql, [array_values($ids)], [class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY]); } catch (TableNotFoundException) { } return true; } protected function doSave(array $values, int $lifetime): array|bool { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; } $platformName = $this->getPlatformName(); $insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?)"; switch (true) { case 'mysql' === $platformName: $sql = $insertSql." ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)"; break; case 'oci' === $platformName: // DUAL is Oracle specific dummy table $sql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ". "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?"; break; case 'sqlsrv' === $platformName && version_compare($this->getServerVersion(), '10', '>='): // MERGE is only available since SQL Server 2008 and must be terminated by semicolon // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx $sql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ". "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;"; break; case 'sqlite' === $platformName: $sql = 'INSERT OR REPLACE'.substr($insertSql, 6); break; case 'pgsql' === $platformName && version_compare($this->getServerVersion(), '9.5', '>='): $sql = $insertSql." ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)"; break; default: $platformName = null; $sql = "UPDATE $this->table SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ? WHERE $this->idCol = ?"; break; } $now = time(); $lifetime = $lifetime ?: null; try { $stmt = $this->conn->prepare($sql); } catch (TableNotFoundException) { if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) { $this->createTable(); } $stmt = $this->conn->prepare($sql); } if ('sqlsrv' === $platformName || 'oci' === $platformName) { $bind = static function ($id, $data) use ($stmt) { $stmt->bindValue(1, $id); $stmt->bindValue(2, $id); $stmt->bindValue(3, $data, ParameterType::LARGE_OBJECT); $stmt->bindValue(6, $data, ParameterType::LARGE_OBJECT); }; $stmt->bindValue(4, $lifetime, ParameterType::INTEGER); $stmt->bindValue(5, $now, ParameterType::INTEGER); $stmt->bindValue(7, $lifetime, ParameterType::INTEGER); $stmt->bindValue(8, $now, ParameterType::INTEGER); } elseif (null !== $platformName) { $bind = static function ($id, $data) use ($stmt) { $stmt->bindValue(1, $id); $stmt->bindValue(2, $data, ParameterType::LARGE_OBJECT); }; $stmt->bindValue(3, $lifetime, ParameterType::INTEGER); $stmt->bindValue(4, $now, ParameterType::INTEGER); } else { $stmt->bindValue(2, $lifetime, ParameterType::INTEGER); $stmt->bindValue(3, $now, ParameterType::INTEGER); $insertStmt = $this->conn->prepare($insertSql); $insertStmt->bindValue(3, $lifetime, ParameterType::INTEGER); $insertStmt->bindValue(4, $now, ParameterType::INTEGER); $bind = static function ($id, $data) use ($stmt, $insertStmt) { $stmt->bindValue(1, $data, ParameterType::LARGE_OBJECT); $stmt->bindValue(4, $id); $insertStmt->bindValue(1, $id); $insertStmt->bindValue(2, $data, ParameterType::LARGE_OBJECT); }; } foreach ($values as $id => $data) { $bind($id, $data); try { $rowCount = $stmt->executeStatement(); } catch (TableNotFoundException) { if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) { $this->createTable(); } $rowCount = $stmt->executeStatement(); } if (null === $platformName && 0 === $rowCount) { try { $insertStmt->executeStatement(); } catch (DBALException) { // A concurrent write won, let it be } } } return $failed; } /** * @internal */ protected function getId(mixed $key): string { if ('pgsql' !== $this->platformName ??= $this->getPlatformName()) { return parent::getId($key); } if (str_contains($key, "\0") || str_contains($key, '%') || !preg_match('//u', $key)) { $key = rawurlencode($key); } return parent::getId($key); } private function getPlatformName(): string { if (isset($this->platformName)) { return $this->platformName; } $platform = $this->conn->getDatabasePlatform(); return $this->platformName = match (true) { $platform instanceof \Doctrine\DBAL\Platforms\MySQLPlatform, $platform instanceof \Doctrine\DBAL\Platforms\MySQL57Platform => 'mysql', $platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform => 'sqlite', $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform, $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQL94Platform => 'pgsql', $platform instanceof \Doctrine\DBAL\Platforms\OraclePlatform => 'oci', $platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform, $platform instanceof \Doctrine\DBAL\Platforms\SQLServer2012Platform => 'sqlsrv', default => $platform::class, }; } private function getServerVersion(): string { if (isset($this->serverVersion)) { return $this->serverVersion; } if ($this->conn instanceof ServerVersionProvider || $this->conn instanceof ServerInfoAwareConnection) { return $this->serverVersion = $this->conn->getServerVersion(); } // The condition should be removed once support for DBAL <3.3 is dropped $conn = method_exists($this->conn, 'getNativeConnection') ? $this->conn->getNativeConnection() : $this->conn->getWrappedConnection(); return $this->serverVersion = $conn->getAttribute(\PDO::ATTR_SERVER_VERSION); } private function addTableToSchema(Schema $schema): void { $types = [ 'mysql' => 'binary', 'sqlite' => 'text', ]; $table = $schema->createTable($this->table); $table->addColumn($this->idCol, $types[$this->getPlatformName()] ?? 'string', ['length' => 255]); $table->addColumn($this->dataCol, 'blob', ['length' => 16777215]); $table->addColumn($this->lifetimeCol, 'integer', ['unsigned' => true, 'notnull' => false]); $table->addColumn($this->timeCol, 'integer', ['unsigned' => true]); $table->setPrimaryKey([$this->idCol]); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/FilesystemAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\Traits\FilesystemTrait; class FilesystemAdapter extends AbstractAdapter implements PruneableInterface { use FilesystemTrait; public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $directory = null, ?MarshallerInterface $marshaller = null) { $this->marshaller = $marshaller ?? new DefaultMarshaller(); parent::__construct('', $defaultLifetime); $this->init($namespace, $directory); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Symfony\Component\Cache\Marshaller\MarshallerInterface; use Symfony\Component\Cache\Marshaller\TagAwareMarshaller; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\Traits\FilesystemTrait; /** * Stores tag id <> cache id relationship as a symlink, and lookup on invalidation calls. * * @author Nicolas Grekas * @author André Rømcke */ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements PruneableInterface { use FilesystemTrait { prune as private doPrune; doClear as private doClearCache; doSave as private doSaveCache; } /** * Folder used for tag symlinks. */ private const TAG_FOLDER = 'tags'; public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $directory = null, ?MarshallerInterface $marshaller = null) { $this->marshaller = new TagAwareMarshaller($marshaller); parent::__construct('', $defaultLifetime); $this->init($namespace, $directory); } public function prune(): bool { $ok = $this->doPrune(); set_error_handler(static function () {}); $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; try { foreach ($this->scanHashDir($this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR) as $dir) { $dir .= \DIRECTORY_SEPARATOR; $keepDir = false; for ($i = 0; $i < 38; ++$i) { if (!is_dir($dir.$chars[$i])) { continue; } for ($j = 0; $j < 38; ++$j) { if (!is_dir($d = $dir.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) { continue; } foreach (scandir($d, \SCANDIR_SORT_NONE) ?: [] as $link) { if ('.' === $link || '..' === $link) { continue; } if ('_' !== $dir[-2] && realpath($d.\DIRECTORY_SEPARATOR.$link)) { $keepDir = true; } else { unlink($d.\DIRECTORY_SEPARATOR.$link); } } $keepDir ?: rmdir($d); } $keepDir ?: rmdir($dir.$chars[$i]); } $keepDir ?: rmdir($dir); } } finally { restore_error_handler(); } return $ok; } protected function doClear(string $namespace): bool { $ok = $this->doClearCache($namespace); if ('' !== $namespace) { return $ok; } set_error_handler(static function () {}); $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $this->tmpSuffix ??= str_replace('/', '-', base64_encode(random_bytes(6))); try { foreach ($this->scanHashDir($this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR) as $dir) { if (rename($dir, $renamed = substr_replace($dir, $this->tmpSuffix.'_', -9))) { $dir = $renamed.\DIRECTORY_SEPARATOR; } else { $dir .= \DIRECTORY_SEPARATOR; $renamed = null; } for ($i = 0; $i < 38; ++$i) { if (!is_dir($dir.$chars[$i])) { continue; } for ($j = 0; $j < 38; ++$j) { if (!is_dir($d = $dir.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) { continue; } foreach (scandir($d, \SCANDIR_SORT_NONE) ?: [] as $link) { if ('.' !== $link && '..' !== $link && (null !== $renamed || !realpath($d.\DIRECTORY_SEPARATOR.$link))) { unlink($d.\DIRECTORY_SEPARATOR.$link); } } null === $renamed ?: rmdir($d); } null === $renamed ?: rmdir($dir.$chars[$i]); } null === $renamed ?: rmdir($renamed); } } finally { restore_error_handler(); } return $ok; } protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []): array { $failed = $this->doSaveCache($values, $lifetime); // Add Tags as symlinks foreach ($addTagData as $tagId => $ids) { $tagFolder = $this->getTagFolder($tagId); foreach ($ids as $id) { if ($failed && \in_array($id, $failed, true)) { continue; } $file = $this->getFile($id); if (!@symlink($file, $tagLink = $this->getFile($id, true, $tagFolder)) && !is_link($tagLink)) { @unlink($file); $failed[] = $id; } } } // Unlink removed Tags foreach ($removeTagData as $tagId => $ids) { $tagFolder = $this->getTagFolder($tagId); foreach ($ids as $id) { if ($failed && \in_array($id, $failed, true)) { continue; } @unlink($this->getFile($id, false, $tagFolder)); } } return $failed; } protected function doDeleteYieldTags(array $ids): iterable { foreach ($ids as $id) { $file = $this->getFile($id); if (!is_file($file) || !$h = @fopen($file, 'r')) { continue; } if (!@unlink($file)) { fclose($h); continue; } $meta = explode("\n", fread($h, 4096), 3)[2] ?? ''; // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F if (13 < \strlen($meta) && "\x9D" === $meta[0] && "\0" === $meta[5] && "\x5F" === $meta[9]) { $meta[9] = "\0"; $tagLen = unpack('Nlen', $meta, 9)['len']; $meta = substr($meta, 13, $tagLen); if (0 < $tagLen -= \strlen($meta)) { $meta .= fread($h, $tagLen); } try { yield $id => '' === $meta ? [] : $this->marshaller->unmarshall($meta); } catch (\Exception) { yield $id => []; } } fclose($h); } } protected function doDeleteTagRelations(array $tagData): bool { foreach ($tagData as $tagId => $idList) { $tagFolder = $this->getTagFolder($tagId); foreach ($idList as $id) { @unlink($this->getFile($id, false, $tagFolder)); } } return true; } protected function doInvalidate(array $tagIds): bool { foreach ($tagIds as $tagId) { if (!is_dir($tagFolder = $this->getTagFolder($tagId))) { continue; } $this->tmpSuffix ??= str_replace('/', '-', base64_encode(random_bytes(6))); set_error_handler(static function () {}); try { if (rename($tagFolder, $renamed = substr_replace($tagFolder, $this->tmpSuffix.'_', -10))) { $tagFolder = $renamed.\DIRECTORY_SEPARATOR; } else { $renamed = null; } foreach ($this->scanHashDir($tagFolder) as $itemLink) { unlink(realpath($itemLink) ?: $itemLink); unlink($itemLink); } if (null === $renamed) { continue; } $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; for ($i = 0; $i < 38; ++$i) { for ($j = 0; $j < 38; ++$j) { rmdir($tagFolder.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j]); } rmdir($tagFolder.$chars[$i]); } rmdir($renamed); } finally { restore_error_handler(); } } return true; } private function getTagFolder(string $tagId): string { return $this->getFile($tagId, false, $this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR).\DIRECTORY_SEPARATOR; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/MemcachedAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Symfony\Component\Cache\Exception\CacheException; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; /** * @author Rob Frawley 2nd * @author Nicolas Grekas */ class MemcachedAdapter extends AbstractAdapter { /** * We are replacing characters that are illegal in Memcached keys with reserved characters from * {@see \Symfony\Contracts\Cache\ItemInterface::RESERVED_CHARACTERS} that are legal in Memcached. * Note: don’t use {@see \Symfony\Component\Cache\Adapter\AbstractAdapter::NS_SEPARATOR}. */ private const RESERVED_MEMCACHED = " \n\r\t\v\f\0"; private const RESERVED_PSR6 = '@()\{}/'; private const MAX_KEY_LENGTH = 250; private MarshallerInterface $marshaller; private \Memcached $client; private \Memcached $lazyClient; /** * Using a MemcachedAdapter with a TagAwareAdapter for storing tags is discouraged. * Using a RedisAdapter is recommended instead. If you cannot do otherwise, be aware that: * - the Memcached::OPT_BINARY_PROTOCOL must be enabled * (that's the default when using MemcachedAdapter::createConnection()); * - tags eviction by Memcached's LRU algorithm will break by-tags invalidation; * your Memcached memory should be large enough to never trigger LRU. * * Using a MemcachedAdapter as a pure items store is fine. */ public function __construct(\Memcached $client, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null) { if (!static::isSupported()) { throw new CacheException('Memcached > 3.1.5 is required.'); } $this->maxIdLength = self::MAX_KEY_LENGTH; if ('Memcached' === $client::class) { $opt = $client->getOption(\Memcached::OPT_SERIALIZER); if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) { throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".'); } $this->maxIdLength -= \strlen($client->getOption(\Memcached::OPT_PREFIX_KEY)); $this->client = $client; } else { $this->lazyClient = $client; } parent::__construct($namespace, $defaultLifetime); $this->enableVersioning(); $this->marshaller = $marshaller ?? new DefaultMarshaller(); } /** * @return bool */ public static function isSupported() { return \extension_loaded('memcached') && version_compare(phpversion('memcached'), '3.1.6', '>='); } /** * Creates a Memcached instance. * * By default, the binary protocol, no block, and libketama compatible options are enabled. * * Examples for servers: * - 'memcached://user:pass@localhost?weight=33' * - [['localhost', 11211, 33]] * * @param array[]|string|string[] $servers An array of servers, a DSN, or an array of DSNs * * @throws \ErrorException When invalid options or servers are provided */ public static function createConnection(#[\SensitiveParameter] array|string $servers, array $options = []): \Memcached { if (\is_string($servers)) { $servers = [$servers]; } if (!static::isSupported()) { throw new CacheException('Memcached > 3.1.5 is required.'); } set_error_handler(static fn ($type, $msg, $file, $line) => throw new \ErrorException($msg, 0, $type, $file, $line)); try { $client = new \Memcached($options['persistent_id'] ?? null); $username = $options['username'] ?? null; $password = $options['password'] ?? null; // parse any DSN in $servers foreach ($servers as $i => $dsn) { if (\is_array($dsn)) { continue; } if (!str_starts_with($dsn, 'memcached:')) { throw new InvalidArgumentException('Invalid Memcached DSN: it does not start with "memcached:".'); } $params = preg_replace_callback('#^memcached:(//)?(?:([^@]*+)@)?#', function ($m) use (&$username, &$password) { if (!empty($m[2])) { [$username, $password] = explode(':', $m[2], 2) + [1 => null]; $username = rawurldecode($username); $password = null !== $password ? rawurldecode($password) : null; } return 'file:'.($m[1] ?? ''); }, $dsn); if (false === $params = parse_url($params)) { throw new InvalidArgumentException('Invalid Memcached DSN.'); } $query = $hosts = []; if (isset($params['query'])) { parse_str($params['query'], $query); if (isset($query['host'])) { if (!\is_array($hosts = $query['host'])) { throw new InvalidArgumentException('Invalid Memcached DSN: query parameter "host" must be an array.'); } foreach ($hosts as $host => $weight) { if (false === $port = strrpos($host, ':')) { $hosts[$host] = [$host, 11211, (int) $weight]; } else { $hosts[$host] = [substr($host, 0, $port), (int) substr($host, 1 + $port), (int) $weight]; } } $hosts = array_values($hosts); unset($query['host']); } if ($hosts && !isset($params['host']) && !isset($params['path'])) { unset($servers[$i]); $servers = array_merge($servers, $hosts); continue; } } if (!isset($params['host']) && !isset($params['path'])) { throw new InvalidArgumentException('Invalid Memcached DSN: missing host or path.'); } if (isset($params['path']) && preg_match('#/(\d+)$#', $params['path'], $m)) { $params['weight'] = $m[1]; $params['path'] = substr($params['path'], 0, -\strlen($m[0])); } $params += [ 'host' => $params['host'] ?? $params['path'], 'port' => isset($params['host']) ? 11211 : null, 'weight' => 0, ]; if ($query) { $params += $query; $options = $query + $options; } $servers[$i] = [$params['host'], $params['port'], $params['weight']]; if ($hosts) { $servers = array_merge($servers, $hosts); } } // set client's options unset($options['persistent_id'], $options['username'], $options['password'], $options['weight'], $options['lazy']); $options = array_change_key_case($options, \CASE_UPPER); $client->setOption(\Memcached::OPT_BINARY_PROTOCOL, true); $client->setOption(\Memcached::OPT_NO_BLOCK, true); $client->setOption(\Memcached::OPT_TCP_NODELAY, true); if (!\array_key_exists('LIBKETAMA_COMPATIBLE', $options) && !\array_key_exists(\Memcached::OPT_LIBKETAMA_COMPATIBLE, $options)) { $client->setOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE, true); } foreach ($options as $name => $value) { if (\is_int($name)) { continue; } if ('HASH' === $name || 'SERIALIZER' === $name || 'DISTRIBUTION' === $name) { $value = \constant('Memcached::'.$name.'_'.strtoupper($value)); } unset($options[$name]); if (\defined('Memcached::OPT_'.$name)) { $options[\constant('Memcached::OPT_'.$name)] = $value; } } $client->setOptions($options + [\Memcached::OPT_SERIALIZER => \Memcached::SERIALIZER_PHP]); // set client's servers, taking care of persistent connections if (!$client->isPristine()) { $oldServers = []; foreach ($client->getServerList() as $server) { $oldServers[] = [$server['host'], $server['port']]; } $newServers = []; foreach ($servers as $server) { if (1 < \count($server)) { $server = array_values($server); unset($server[2]); $server[1] = (int) $server[1]; } $newServers[] = $server; } if ($oldServers !== $newServers) { $client->resetServerList(); $client->addServers($servers); } } else { $client->addServers($servers); } if (null !== $username || null !== $password) { if (!method_exists($client, 'setSaslAuthData')) { trigger_error('Missing SASL support: the memcached extension must be compiled with --enable-memcached-sasl.'); } $client->setSaslAuthData($username, $password); } return $client; } finally { restore_error_handler(); } } protected function doSave(array $values, int $lifetime): array|bool { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; } if ($lifetime && $lifetime > 30 * 86400) { $lifetime += time(); } $encodedValues = []; foreach ($values as $key => $value) { $encodedValues[self::encodeKey($key)] = $value; } return $this->checkResultCode($this->getClient()->setMulti($encodedValues, $lifetime)) ? $failed : false; } protected function doFetch(array $ids): iterable { try { $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids); $encodedResult = $this->checkResultCode($this->getClient()->getMulti($encodedIds)); $result = []; foreach ($encodedResult as $key => $value) { $result[self::decodeKey($key)] = $this->marshaller->unmarshall($value); } return $result; } catch (\Error $e) { throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); } } protected function doHave(string $id): bool { return false !== $this->getClient()->get(self::encodeKey($id)) || $this->checkResultCode(\Memcached::RES_SUCCESS === $this->client->getResultCode()); } protected function doDelete(array $ids): bool { $ok = true; $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids); foreach ($this->checkResultCode($this->getClient()->deleteMulti($encodedIds)) as $result) { if (\Memcached::RES_SUCCESS !== $result && \Memcached::RES_NOTFOUND !== $result) { $ok = false; } } return $ok; } protected function doClear(string $namespace): bool { return '' === $namespace && $this->getClient()->flush(); } private function checkResultCode(mixed $result): mixed { $code = $this->client->getResultCode(); if (\Memcached::RES_SUCCESS === $code || \Memcached::RES_NOTFOUND === $code) { return $result; } throw new CacheException('MemcachedAdapter client error: '.strtolower($this->client->getResultMessage())); } private function getClient(): \Memcached { if (isset($this->client)) { return $this->client; } $opt = $this->lazyClient->getOption(\Memcached::OPT_SERIALIZER); if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) { throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".'); } if ('' !== $prefix = (string) $this->lazyClient->getOption(\Memcached::OPT_PREFIX_KEY)) { throw new CacheException(sprintf('MemcachedAdapter: "prefix_key" option must be empty when using proxified connections, "%s" given.', $prefix)); } return $this->client = $this->lazyClient; } private static function encodeKey(string $key): string { return strtr($key, self::RESERVED_MEMCACHED, self::RESERVED_PSR6); } private static function decodeKey(string $key): string { return strtr($key, self::RESERVED_PSR6, self::RESERVED_MEMCACHED); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/NullAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Cache\CacheItemInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Contracts\Cache\CacheInterface; /** * @author Titouan Galopin */ class NullAdapter implements AdapterInterface, CacheInterface { private static \Closure $createCacheItem; public function __construct() { self::$createCacheItem ??= \Closure::bind( static function ($key) { $item = new CacheItem(); $item->key = $key; $item->isHit = false; return $item; }, null, CacheItem::class ); } public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed { $save = true; return $callback((self::$createCacheItem)($key), $save); } public function getItem(mixed $key): CacheItem { return (self::$createCacheItem)($key); } public function getItems(array $keys = []): iterable { return $this->generateItems($keys); } public function hasItem(mixed $key): bool { return false; } public function clear(string $prefix = ''): bool { return true; } public function deleteItem(mixed $key): bool { return true; } public function deleteItems(array $keys): bool { return true; } public function save(CacheItemInterface $item): bool { return true; } public function saveDeferred(CacheItemInterface $item): bool { return true; } public function commit(): bool { return true; } public function delete(string $key): bool { return $this->deleteItem($key); } private function generateItems(array $keys): \Generator { $f = self::$createCacheItem; foreach ($keys as $key) { yield $key => $f($key); } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/ParameterNormalizer.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; /** * @author Lars Strojny */ final class ParameterNormalizer { public static function normalizeDuration(string $duration): int { if (is_numeric($duration)) { return $duration; } if (false !== $time = strtotime($duration, 0)) { return $time; } try { return \DateTimeImmutable::createFromFormat('U', 0)->add(new \DateInterval($duration))->getTimestamp(); } catch (\Exception $e) { throw new \InvalidArgumentException(sprintf('Cannot parse date interval "%s".', $duration), 0, $e); } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/PdoAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; use Symfony\Component\Cache\PruneableInterface; class PdoAdapter extends AbstractAdapter implements PruneableInterface { private const MAX_KEY_LENGTH = 255; private MarshallerInterface $marshaller; private \PDO $conn; private string $dsn; private string $driver; private string $serverVersion; private string $table = 'cache_items'; private string $idCol = 'item_id'; private string $dataCol = 'item_data'; private string $lifetimeCol = 'item_lifetime'; private string $timeCol = 'item_time'; private ?string $username = null; private ?string $password = null; private array $connectionOptions = []; private string $namespace; /** * You can either pass an existing database connection as PDO instance or * a DSN string that will be used to lazy-connect to the database when the * cache is actually used. * * List of available options: * * db_table: The name of the table [default: cache_items] * * db_id_col: The column where to store the cache id [default: item_id] * * db_data_col: The column where to store the cache data [default: item_data] * * db_lifetime_col: The column where to store the lifetime [default: item_lifetime] * * db_time_col: The column where to store the timestamp [default: item_time] * * db_username: The username when lazy-connect [default: ''] * * db_password: The password when lazy-connect [default: ''] * * db_connection_options: An array of driver-specific connection options [default: []] * * @throws InvalidArgumentException When first argument is not PDO nor Connection nor string * @throws InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION * @throws InvalidArgumentException When namespace contains invalid characters */ public function __construct(#[\SensitiveParameter] \PDO|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], ?MarshallerInterface $marshaller = null) { if (\is_string($connOrDsn) && str_contains($connOrDsn, '://')) { throw new InvalidArgumentException(sprintf('Usage of Doctrine DBAL URL with "%s" is not supported. Use a PDO DSN or "%s" instead.', __CLASS__, DoctrineDbalAdapter::class)); } if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) { throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0])); } if ($connOrDsn instanceof \PDO) { if (\PDO::ERRMODE_EXCEPTION !== $connOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) { throw new InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)).', __CLASS__)); } $this->conn = $connOrDsn; } else { $this->dsn = $connOrDsn; } $this->maxIdLength = self::MAX_KEY_LENGTH; $this->table = $options['db_table'] ?? $this->table; $this->idCol = $options['db_id_col'] ?? $this->idCol; $this->dataCol = $options['db_data_col'] ?? $this->dataCol; $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol; $this->timeCol = $options['db_time_col'] ?? $this->timeCol; $this->username = $options['db_username'] ?? $this->username; $this->password = $options['db_password'] ?? $this->password; $this->connectionOptions = $options['db_connection_options'] ?? $this->connectionOptions; $this->namespace = $namespace; $this->marshaller = $marshaller ?? new DefaultMarshaller(); parent::__construct($namespace, $defaultLifetime); } /** * Creates the table to store cache items which can be called once for setup. * * Cache ID are saved in a column of maximum length 255. Cache data is * saved in a BLOB. * * @return void * * @throws \PDOException When the table already exists * @throws \DomainException When an unsupported PDO driver is used */ public function createTable() { $sql = match ($driver = $this->getDriver()) { // We use varbinary for the ID column because it prevents unwanted conversions: // - character set conversions between server and client // - trailing space removal // - case-insensitivity // - language processing like é == e 'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB", 'sqlite' => "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", 'pgsql' => "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", 'oci' => "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", 'sqlsrv' => "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", default => throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $driver)), }; $this->getConnection()->exec($sql); } public function prune(): bool { $deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= :time"; if ('' !== $this->namespace) { $deleteSql .= " AND $this->idCol LIKE :namespace"; } $connection = $this->getConnection(); try { $delete = $connection->prepare($deleteSql); } catch (\PDOException) { return true; } $delete->bindValue(':time', time(), \PDO::PARAM_INT); if ('' !== $this->namespace) { $delete->bindValue(':namespace', sprintf('%s%%', $this->namespace), \PDO::PARAM_STR); } try { return $delete->execute(); } catch (\PDOException) { return true; } } protected function doFetch(array $ids): iterable { $connection = $this->getConnection(); $now = time(); $expired = []; $sql = str_pad('', (\count($ids) << 1) - 1, '?,'); $sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN ($sql)"; $stmt = $connection->prepare($sql); $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT); foreach ($ids as $id) { $stmt->bindValue(++$i, $id); } $result = $stmt->execute(); if (\is_object($result)) { $result = $result->iterateNumeric(); } else { $stmt->setFetchMode(\PDO::FETCH_NUM); $result = $stmt; } foreach ($result as $row) { if (null === $row[1]) { $expired[] = $row[0]; } else { yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]); } } if ($expired) { $sql = str_pad('', (\count($expired) << 1) - 1, '?,'); $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN ($sql)"; $stmt = $connection->prepare($sql); $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT); foreach ($expired as $id) { $stmt->bindValue(++$i, $id); } $stmt->execute(); } } protected function doHave(string $id): bool { $connection = $this->getConnection(); $sql = "SELECT 1 FROM $this->table WHERE $this->idCol = :id AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > :time)"; $stmt = $connection->prepare($sql); $stmt->bindValue(':id', $id); $stmt->bindValue(':time', time(), \PDO::PARAM_INT); $stmt->execute(); return (bool) $stmt->fetchColumn(); } protected function doClear(string $namespace): bool { $conn = $this->getConnection(); if ('' === $namespace) { if ('sqlite' === $this->getDriver()) { $sql = "DELETE FROM $this->table"; } else { $sql = "TRUNCATE TABLE $this->table"; } } else { $sql = "DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'"; } try { $conn->exec($sql); } catch (\PDOException) { } return true; } protected function doDelete(array $ids): bool { $sql = str_pad('', (\count($ids) << 1) - 1, '?,'); $sql = "DELETE FROM $this->table WHERE $this->idCol IN ($sql)"; try { $stmt = $this->getConnection()->prepare($sql); $stmt->execute(array_values($ids)); } catch (\PDOException) { } return true; } protected function doSave(array $values, int $lifetime): array|bool { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; } $conn = $this->getConnection(); $driver = $this->getDriver(); $insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)"; switch (true) { case 'mysql' === $driver: $sql = $insertSql." ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)"; break; case 'oci' === $driver: // DUAL is Oracle specific dummy table $sql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ". "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?"; break; case 'sqlsrv' === $driver && version_compare($this->getServerVersion(), '10', '>='): // MERGE is only available since SQL Server 2008 and must be terminated by semicolon // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx $sql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ". "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;"; break; case 'sqlite' === $driver: $sql = 'INSERT OR REPLACE'.substr($insertSql, 6); break; case 'pgsql' === $driver && version_compare($this->getServerVersion(), '9.5', '>='): $sql = $insertSql." ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)"; break; default: $driver = null; $sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id"; break; } $now = time(); $lifetime = $lifetime ?: null; try { $stmt = $conn->prepare($sql); } catch (\PDOException $e) { if ($this->isTableMissing($e) && (!$conn->inTransaction() || \in_array($driver, ['pgsql', 'sqlite', 'sqlsrv'], true))) { $this->createTable(); } $stmt = $conn->prepare($sql); } // $id and $data are defined later in the loop. Binding is done by reference, values are read on execution. if ('sqlsrv' === $driver || 'oci' === $driver) { $stmt->bindParam(1, $id); $stmt->bindParam(2, $id); $stmt->bindParam(3, $data, \PDO::PARAM_LOB); $stmt->bindValue(4, $lifetime, \PDO::PARAM_INT); $stmt->bindValue(5, $now, \PDO::PARAM_INT); $stmt->bindParam(6, $data, \PDO::PARAM_LOB); $stmt->bindValue(7, $lifetime, \PDO::PARAM_INT); $stmt->bindValue(8, $now, \PDO::PARAM_INT); } else { $stmt->bindParam(':id', $id); $stmt->bindParam(':data', $data, \PDO::PARAM_LOB); $stmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT); $stmt->bindValue(':time', $now, \PDO::PARAM_INT); } if (null === $driver) { $insertStmt = $conn->prepare($insertSql); $insertStmt->bindParam(':id', $id); $insertStmt->bindParam(':data', $data, \PDO::PARAM_LOB); $insertStmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT); $insertStmt->bindValue(':time', $now, \PDO::PARAM_INT); } foreach ($values as $id => $data) { try { $stmt->execute(); } catch (\PDOException $e) { if ($this->isTableMissing($e) && (!$conn->inTransaction() || \in_array($driver, ['pgsql', 'sqlite', 'sqlsrv'], true))) { $this->createTable(); } $stmt->execute(); } if (null === $driver && !$stmt->rowCount()) { try { $insertStmt->execute(); } catch (\PDOException) { // A concurrent write won, let it be } } } return $failed; } /** * @internal */ protected function getId(mixed $key): string { if ('pgsql' !== $this->getDriver()) { return parent::getId($key); } if (str_contains($key, "\0") || str_contains($key, '%') || !preg_match('//u', $key)) { $key = rawurlencode($key); } return parent::getId($key); } private function getConnection(): \PDO { if (!isset($this->conn)) { $this->conn = new \PDO($this->dsn, $this->username, $this->password, $this->connectionOptions); $this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); } return $this->conn; } private function getDriver(): string { return $this->driver ??= $this->getConnection()->getAttribute(\PDO::ATTR_DRIVER_NAME); } private function getServerVersion(): string { return $this->serverVersion ??= $this->getConnection()->getAttribute(\PDO::ATTR_SERVER_VERSION); } private function isTableMissing(\PDOException $exception): bool { $driver = $this->getDriver(); [$sqlState, $code] = $exception->errorInfo ?? [null, $exception->getCode()]; return match ($driver) { 'pgsql' => '42P01' === $sqlState, 'sqlite' => str_contains($exception->getMessage(), 'no such table:'), 'oci' => 942 === $code, 'sqlsrv' => 208 === $code, 'mysql' => 1146 === $code, default => false, }; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/PhpArrayAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Cache\CacheItemInterface; use Psr\Cache\CacheItemPoolInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\ResettableInterface; use Symfony\Component\Cache\Traits\ContractsTrait; use Symfony\Component\Cache\Traits\ProxyTrait; use Symfony\Component\VarExporter\VarExporter; use Symfony\Contracts\Cache\CacheInterface; /** * Caches items at warm up time using a PHP array that is stored in shared memory by OPCache since PHP 7.0. * Warmed up items are read-only and run-time discovered items are cached using a fallback adapter. * * @author Titouan Galopin * @author Nicolas Grekas */ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface { use ContractsTrait; use ProxyTrait; private string $file; private array $keys; private array $values; private static \Closure $createCacheItem; private static array $valuesCache = []; /** * @param string $file The PHP file were values are cached * @param AdapterInterface $fallbackPool A pool to fallback on when an item is not hit */ public function __construct(string $file, AdapterInterface $fallbackPool) { $this->file = $file; $this->pool = $fallbackPool; self::$createCacheItem ??= \Closure::bind( static function ($key, $value, $isHit) { $item = new CacheItem(); $item->key = $key; $item->value = $value; $item->isHit = $isHit; return $item; }, null, CacheItem::class ); } /** * This adapter takes advantage of how PHP stores arrays in its latest versions. * * @param string $file The PHP file were values are cached * @param CacheItemPoolInterface $fallbackPool A pool to fallback on when an item is not hit */ public static function create(string $file, CacheItemPoolInterface $fallbackPool): CacheItemPoolInterface { if (!$fallbackPool instanceof AdapterInterface) { $fallbackPool = new ProxyAdapter($fallbackPool); } return new static($file, $fallbackPool); } public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed { if (!isset($this->values)) { $this->initialize(); } if (!isset($this->keys[$key])) { get_from_pool: if ($this->pool instanceof CacheInterface) { return $this->pool->get($key, $callback, $beta, $metadata); } return $this->doGet($this->pool, $key, $callback, $beta, $metadata); } $value = $this->values[$this->keys[$key]]; if ('N;' === $value) { return null; } try { if ($value instanceof \Closure) { return $value(); } } catch (\Throwable) { unset($this->keys[$key]); goto get_from_pool; } return $value; } public function getItem(mixed $key): CacheItem { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } if (!isset($this->values)) { $this->initialize(); } if (!isset($this->keys[$key])) { return $this->pool->getItem($key); } $value = $this->values[$this->keys[$key]]; $isHit = true; if ('N;' === $value) { $value = null; } elseif ($value instanceof \Closure) { try { $value = $value(); } catch (\Throwable) { $value = null; $isHit = false; } } return (self::$createCacheItem)($key, $value, $isHit); } public function getItems(array $keys = []): iterable { foreach ($keys as $key) { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } } if (!isset($this->values)) { $this->initialize(); } return $this->generateItems($keys); } public function hasItem(mixed $key): bool { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } if (!isset($this->values)) { $this->initialize(); } return isset($this->keys[$key]) || $this->pool->hasItem($key); } public function deleteItem(mixed $key): bool { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } if (!isset($this->values)) { $this->initialize(); } return !isset($this->keys[$key]) && $this->pool->deleteItem($key); } public function deleteItems(array $keys): bool { $deleted = true; $fallbackKeys = []; foreach ($keys as $key) { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } if (isset($this->keys[$key])) { $deleted = false; } else { $fallbackKeys[] = $key; } } if (!isset($this->values)) { $this->initialize(); } if ($fallbackKeys) { $deleted = $this->pool->deleteItems($fallbackKeys) && $deleted; } return $deleted; } public function save(CacheItemInterface $item): bool { if (!isset($this->values)) { $this->initialize(); } return !isset($this->keys[$item->getKey()]) && $this->pool->save($item); } public function saveDeferred(CacheItemInterface $item): bool { if (!isset($this->values)) { $this->initialize(); } return !isset($this->keys[$item->getKey()]) && $this->pool->saveDeferred($item); } public function commit(): bool { return $this->pool->commit(); } public function clear(string $prefix = ''): bool { $this->keys = $this->values = []; $cleared = @unlink($this->file) || !file_exists($this->file); unset(self::$valuesCache[$this->file]); if ($this->pool instanceof AdapterInterface) { return $this->pool->clear($prefix) && $cleared; } return $this->pool->clear() && $cleared; } /** * Store an array of cached values. * * @param array $values The cached values * * @return string[] A list of classes to preload on PHP 7.4+ */ public function warmUp(array $values): array { if (file_exists($this->file)) { if (!is_file($this->file)) { throw new InvalidArgumentException(sprintf('Cache path exists and is not a file: "%s".', $this->file)); } if (!is_writable($this->file)) { throw new InvalidArgumentException(sprintf('Cache file is not writable: "%s".', $this->file)); } } else { $directory = \dirname($this->file); if (!is_dir($directory) && !@mkdir($directory, 0777, true)) { throw new InvalidArgumentException(sprintf('Cache directory does not exist and cannot be created: "%s".', $directory)); } if (!is_writable($directory)) { throw new InvalidArgumentException(sprintf('Cache directory is not writable: "%s".', $directory)); } } $preload = []; $dumpedValues = ''; $dumpedMap = []; $dump = <<<'EOF' $value) { CacheItem::validateKey(\is_int($key) ? (string) $key : $key); $isStaticValue = true; if (null === $value) { $value = "'N;'"; } elseif (\is_object($value) || \is_array($value)) { try { $value = VarExporter::export($value, $isStaticValue, $preload); } catch (\Exception $e) { throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)), 0, $e); } } elseif (\is_string($value)) { // Wrap "N;" in a closure to not confuse it with an encoded `null` if ('N;' === $value) { $isStaticValue = false; } $value = var_export($value, true); } elseif (!\is_scalar($value)) { throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value))); } else { $value = var_export($value, true); } if (!$isStaticValue) { $value = str_replace("\n", "\n ", $value); $value = "static function () {\n return {$value};\n}"; } $hash = hash('xxh128', $value); if (null === $id = $dumpedMap[$hash] ?? null) { $id = $dumpedMap[$hash] = \count($dumpedMap); $dumpedValues .= "{$id} => {$value},\n"; } $dump .= var_export($key, true)." => {$id},\n"; } $dump .= "\n], [\n\n{$dumpedValues}\n]];\n"; $tmpFile = uniqid($this->file, true); file_put_contents($tmpFile, $dump); @chmod($tmpFile, 0666 & ~umask()); unset($serialized, $value, $dump); @rename($tmpFile, $this->file); unset(self::$valuesCache[$this->file]); $this->initialize(); return $preload; } /** * Load the cache file. */ private function initialize(): void { if (isset(self::$valuesCache[$this->file])) { $values = self::$valuesCache[$this->file]; } elseif (!is_file($this->file)) { $this->keys = $this->values = []; return; } else { $values = self::$valuesCache[$this->file] = (include $this->file) ?: [[], []]; } if (2 !== \count($values) || !isset($values[0], $values[1])) { $this->keys = $this->values = []; } else { [$this->keys, $this->values] = $values; } } private function generateItems(array $keys): \Generator { $f = self::$createCacheItem; $fallbackKeys = []; foreach ($keys as $key) { if (isset($this->keys[$key])) { $value = $this->values[$this->keys[$key]]; if ('N;' === $value) { yield $key => $f($key, null, true); } elseif ($value instanceof \Closure) { try { yield $key => $f($key, $value(), true); } catch (\Throwable) { yield $key => $f($key, null, false); } } else { yield $key => $f($key, $value, true); } } else { $fallbackKeys[] = $key; } } if ($fallbackKeys) { yield from $this->pool->getItems($fallbackKeys); } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/PhpFilesAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Symfony\Component\Cache\Exception\CacheException; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\Traits\FilesystemCommonTrait; use Symfony\Component\VarExporter\VarExporter; /** * @author Piotr Stankowski * @author Nicolas Grekas * @author Rob Frawley 2nd */ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface { use FilesystemCommonTrait { doClear as private doCommonClear; doDelete as private doCommonDelete; } private \Closure $includeHandler; private bool $appendOnly; private array $values = []; private array $files = []; private static int $startTime; private static array $valuesCache = []; /** * @param $appendOnly Set to `true` to gain extra performance when the items stored in this pool never expire. * Doing so is encouraged because it fits perfectly OPcache's memory model. * * @throws CacheException if OPcache is not enabled */ public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $directory = null, bool $appendOnly = false) { $this->appendOnly = $appendOnly; self::$startTime ??= $_SERVER['REQUEST_TIME'] ?? time(); parent::__construct('', $defaultLifetime); $this->init($namespace, $directory); $this->includeHandler = static function ($type, $msg, $file, $line) { throw new \ErrorException($msg, 0, $type, $file, $line); }; } /** * @return bool */ public static function isSupported() { self::$startTime ??= $_SERVER['REQUEST_TIME'] ?? time(); return \function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOL) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) || filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOL)); } public function prune(): bool { $time = time(); $pruned = true; $getExpiry = true; set_error_handler($this->includeHandler); try { foreach ($this->scanHashDir($this->directory) as $file) { try { if (\is_array($expiresAt = include $file)) { $expiresAt = $expiresAt[0]; } } catch (\ErrorException $e) { $expiresAt = $time; } if ($time >= $expiresAt) { $pruned = ($this->doUnlink($file) || !file_exists($file)) && $pruned; } } } finally { restore_error_handler(); } return $pruned; } protected function doFetch(array $ids): iterable { if ($this->appendOnly) { $now = 0; $missingIds = []; } else { $now = time(); $missingIds = $ids; $ids = []; } $values = []; begin: $getExpiry = false; foreach ($ids as $id) { if (null === $value = $this->values[$id] ?? null) { $missingIds[] = $id; } elseif ('N;' === $value) { $values[$id] = null; } elseif (!\is_object($value)) { $values[$id] = $value; } elseif (!$value instanceof LazyValue) { $values[$id] = $value(); } elseif (false === $values[$id] = include $value->file) { unset($values[$id], $this->values[$id]); $missingIds[] = $id; } if (!$this->appendOnly) { unset($this->values[$id]); } } if (!$missingIds) { return $values; } set_error_handler($this->includeHandler); try { $getExpiry = true; foreach ($missingIds as $k => $id) { try { $file = $this->files[$id] ??= $this->getFile($id); if (isset(self::$valuesCache[$file])) { [$expiresAt, $this->values[$id]] = self::$valuesCache[$file]; } elseif (\is_array($expiresAt = include $file)) { if ($this->appendOnly) { self::$valuesCache[$file] = $expiresAt; } [$expiresAt, $this->values[$id]] = $expiresAt; } elseif ($now < $expiresAt) { $this->values[$id] = new LazyValue($file); } if ($now >= $expiresAt) { unset($this->values[$id], $missingIds[$k], self::$valuesCache[$file]); } } catch (\ErrorException $e) { unset($missingIds[$k]); } } } finally { restore_error_handler(); } $ids = $missingIds; $missingIds = []; goto begin; } protected function doHave(string $id): bool { if ($this->appendOnly && isset($this->values[$id])) { return true; } set_error_handler($this->includeHandler); try { $file = $this->files[$id] ??= $this->getFile($id); $getExpiry = true; if (isset(self::$valuesCache[$file])) { [$expiresAt, $value] = self::$valuesCache[$file]; } elseif (\is_array($expiresAt = include $file)) { if ($this->appendOnly) { self::$valuesCache[$file] = $expiresAt; } [$expiresAt, $value] = $expiresAt; } elseif ($this->appendOnly) { $value = new LazyValue($file); } } catch (\ErrorException) { return false; } finally { restore_error_handler(); } if ($this->appendOnly) { $now = 0; $this->values[$id] = $value; } else { $now = time(); } return $now < $expiresAt; } protected function doSave(array $values, int $lifetime): array|bool { $ok = true; $expiry = $lifetime ? time() + $lifetime : 'PHP_INT_MAX'; $allowCompile = self::isSupported(); foreach ($values as $key => $value) { unset($this->values[$key]); $isStaticValue = true; if (null === $value) { $value = "'N;'"; } elseif (\is_object($value) || \is_array($value)) { try { $value = VarExporter::export($value, $isStaticValue); } catch (\Exception $e) { throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)), 0, $e); } } elseif (\is_string($value)) { // Wrap "N;" in a closure to not confuse it with an encoded `null` if ('N;' === $value) { $isStaticValue = false; } $value = var_export($value, true); } elseif (!\is_scalar($value)) { throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value))); } else { $value = var_export($value, true); } $encodedKey = rawurlencode($key); if ($isStaticValue) { $value = "return [{$expiry}, {$value}];"; } elseif ($this->appendOnly) { $value = "return [{$expiry}, static fn () => {$value}];"; } else { // We cannot use a closure here because of https://bugs.php.net/76982 $value = str_replace('\Symfony\Component\VarExporter\Internal\\', '', $value); $value = "namespace Symfony\Component\VarExporter\Internal;\n\nreturn \$getExpiry ? {$expiry} : {$value};"; } $file = $this->files[$key] = $this->getFile($key, true); // Since OPcache only compiles files older than the script execution start, set the file's mtime in the past $ok = $this->write($file, "directory)) { throw new CacheException(sprintf('Cache directory is not writable (%s).', $this->directory)); } return $ok; } protected function doClear(string $namespace): bool { $this->values = []; return $this->doCommonClear($namespace); } protected function doDelete(array $ids): bool { foreach ($ids as $id) { unset($this->values[$id]); } return $this->doCommonDelete($ids); } /** * @return bool */ protected function doUnlink(string $file) { unset(self::$valuesCache[$file]); if (self::isSupported()) { @opcache_invalidate($file, true); } return @unlink($file); } private function getFileKey(string $file): string { if (!$h = @fopen($file, 'r')) { return ''; } $encodedKey = substr(fgets($h), 8); fclose($h); return rawurldecode(rtrim($encodedKey)); } } /** * @internal */ class LazyValue { public string $file; public function __construct(string $file) { $this->file = $file; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/ProxyAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Cache\CacheItemInterface; use Psr\Cache\CacheItemPoolInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\ResettableInterface; use Symfony\Component\Cache\Traits\ContractsTrait; use Symfony\Component\Cache\Traits\ProxyTrait; use Symfony\Contracts\Cache\CacheInterface; /** * @author Nicolas Grekas */ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface { use ContractsTrait; use ProxyTrait; private string $namespace = ''; private int $namespaceLen; private string $poolHash; private int $defaultLifetime; private static \Closure $createCacheItem; private static \Closure $setInnerItem; public function __construct(CacheItemPoolInterface $pool, string $namespace = '', int $defaultLifetime = 0) { $this->pool = $pool; $this->poolHash = spl_object_hash($pool); if ('' !== $namespace) { \assert('' !== CacheItem::validateKey($namespace)); $this->namespace = $namespace; } $this->namespaceLen = \strlen($namespace); $this->defaultLifetime = $defaultLifetime; self::$createCacheItem ??= \Closure::bind( static function ($key, $innerItem, $poolHash) { $item = new CacheItem(); $item->key = $key; if (null === $innerItem) { return $item; } $item->value = $innerItem->get(); $item->isHit = $innerItem->isHit(); $item->innerItem = $innerItem; $item->poolHash = $poolHash; if (!$item->unpack() && $innerItem instanceof CacheItem) { $item->metadata = $innerItem->metadata; } $innerItem->set(null); return $item; }, null, CacheItem::class ); self::$setInnerItem ??= \Closure::bind( static function (CacheItemInterface $innerItem, CacheItem $item, $expiry = null) { $innerItem->set($item->pack()); $innerItem->expiresAt(($expiry ?? $item->expiry) ? \DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', $expiry ?? $item->expiry)) : null); }, null, CacheItem::class ); } public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed { if (!$this->pool instanceof CacheInterface) { return $this->doGet($this, $key, $callback, $beta, $metadata); } return $this->pool->get($this->getId($key), function ($innerItem, bool &$save) use ($key, $callback) { $item = (self::$createCacheItem)($key, $innerItem, $this->poolHash); $item->set($value = $callback($item, $save)); (self::$setInnerItem)($innerItem, $item); return $value; }, $beta, $metadata); } public function getItem(mixed $key): CacheItem { $item = $this->pool->getItem($this->getId($key)); return (self::$createCacheItem)($key, $item, $this->poolHash); } public function getItems(array $keys = []): iterable { if ($this->namespaceLen) { foreach ($keys as $i => $key) { $keys[$i] = $this->getId($key); } } return $this->generateItems($this->pool->getItems($keys)); } public function hasItem(mixed $key): bool { return $this->pool->hasItem($this->getId($key)); } public function clear(string $prefix = ''): bool { if ($this->pool instanceof AdapterInterface) { return $this->pool->clear($this->namespace.$prefix); } return $this->pool->clear(); } public function deleteItem(mixed $key): bool { return $this->pool->deleteItem($this->getId($key)); } public function deleteItems(array $keys): bool { if ($this->namespaceLen) { foreach ($keys as $i => $key) { $keys[$i] = $this->getId($key); } } return $this->pool->deleteItems($keys); } public function save(CacheItemInterface $item): bool { return $this->doSave($item, __FUNCTION__); } public function saveDeferred(CacheItemInterface $item): bool { return $this->doSave($item, __FUNCTION__); } public function commit(): bool { return $this->pool->commit(); } private function doSave(CacheItemInterface $item, string $method): bool { if (!$item instanceof CacheItem) { return false; } $castItem = (array) $item; if (null === $castItem["\0*\0expiry"] && 0 < $this->defaultLifetime) { $castItem["\0*\0expiry"] = microtime(true) + $this->defaultLifetime; } if ($castItem["\0*\0poolHash"] === $this->poolHash && $castItem["\0*\0innerItem"]) { $innerItem = $castItem["\0*\0innerItem"]; } elseif ($this->pool instanceof AdapterInterface) { // this is an optimization specific for AdapterInterface implementations // so we can save a round-trip to the backend by just creating a new item $innerItem = (self::$createCacheItem)($this->namespace.$castItem["\0*\0key"], null, $this->poolHash); } else { $innerItem = $this->pool->getItem($this->namespace.$castItem["\0*\0key"]); } (self::$setInnerItem)($innerItem, $item, $castItem["\0*\0expiry"]); return $this->pool->$method($innerItem); } private function generateItems(iterable $items): \Generator { $f = self::$createCacheItem; foreach ($items as $key => $item) { if ($this->namespaceLen) { $key = substr($key, $this->namespaceLen); } yield $key => $f($key, $item, $this->poolHash); } } private function getId(mixed $key): string { \assert('' !== CacheItem::validateKey($key)); return $this->namespace.$key; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/Psr16Adapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\SimpleCache\CacheInterface; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\ResettableInterface; use Symfony\Component\Cache\Traits\ProxyTrait; /** * Turns a PSR-16 cache into a PSR-6 one. * * @author Nicolas Grekas */ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, ResettableInterface { use ProxyTrait; /** * @internal */ protected const NS_SEPARATOR = '_'; private object $miss; public function __construct(CacheInterface $pool, string $namespace = '', int $defaultLifetime = 0) { parent::__construct($namespace, $defaultLifetime); $this->pool = $pool; $this->miss = new \stdClass(); } protected function doFetch(array $ids): iterable { foreach ($this->pool->getMultiple($ids, $this->miss) as $key => $value) { if ($this->miss !== $value) { yield $key => $value; } } } protected function doHave(string $id): bool { return $this->pool->has($id); } protected function doClear(string $namespace): bool { return $this->pool->clear(); } protected function doDelete(array $ids): bool { return $this->pool->deleteMultiple($ids); } protected function doSave(array $values, int $lifetime): array|bool { return $this->pool->setMultiple($values, 0 === $lifetime ? null : $lifetime); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/RedisAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Symfony\Component\Cache\Marshaller\MarshallerInterface; use Symfony\Component\Cache\Traits\RedisTrait; class RedisAdapter extends AbstractAdapter { use RedisTrait; public function __construct(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|\Relay\Relay $redis, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null) { $this->init($redis, $namespace, $defaultLifetime, $marshaller); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Predis\Connection\Aggregate\ClusterInterface; use Predis\Connection\Aggregate\PredisCluster; use Predis\Connection\Aggregate\ReplicationInterface; use Predis\Response\ErrorInterface; use Predis\Response\Status; use Relay\Relay; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Exception\LogicException; use Symfony\Component\Cache\Marshaller\DeflateMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; use Symfony\Component\Cache\Marshaller\TagAwareMarshaller; use Symfony\Component\Cache\Traits\RedisTrait; /** * Stores tag id <> cache id relationship as a Redis Set. * * Set (tag relation info) is stored without expiry (non-volatile), while cache always gets an expiry (volatile) even * if not set by caller. Thus if you configure redis with the right eviction policy you can be safe this tag <> cache * relationship survives eviction (cache cleanup when Redis runs out of memory). * * Redis server 2.8+ with any `volatile-*` eviction policy, OR `noeviction` if you're sure memory will NEVER fill up * * Design limitations: * - Max 4 billion cache keys per cache tag as limited by Redis Set datatype. * E.g. If you use a "all" items tag for expiry instead of clear(), that limits you to 4 billion cache items also. * * @see https://redis.io/topics/lru-cache#eviction-policies Documentation for Redis eviction policies. * @see https://redis.io/topics/data-types#sets Documentation for Redis Set datatype. * * @author Nicolas Grekas * @author André Rømcke */ class RedisTagAwareAdapter extends AbstractTagAwareAdapter { use RedisTrait; /** * On cache items without a lifetime set, we set it to 100 days. This is to make sure cache items are * preferred to be evicted over tag Sets, if eviction policy is configured according to requirements. */ private const DEFAULT_CACHE_TTL = 8640000; /** * detected eviction policy used on Redis server. */ private string $redisEvictionPolicy; private string $namespace; public function __construct(\Redis|Relay|\RedisArray|\RedisCluster|\Predis\ClientInterface $redis, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null) { if ($redis instanceof \Predis\ClientInterface && $redis->getConnection() instanceof ClusterInterface && !$redis->getConnection() instanceof PredisCluster) { throw new InvalidArgumentException(sprintf('Unsupported Predis cluster connection: only "%s" is, "%s" given.', PredisCluster::class, get_debug_type($redis->getConnection()))); } $isRelay = $redis instanceof Relay; if ($isRelay || \defined('Redis::OPT_COMPRESSION') && \in_array($redis::class, [\Redis::class, \RedisArray::class, \RedisCluster::class], true)) { $compression = $redis->getOption($isRelay ? Relay::OPT_COMPRESSION : \Redis::OPT_COMPRESSION); foreach (\is_array($compression) ? $compression : [$compression] as $c) { if ($isRelay ? Relay::COMPRESSION_NONE : \Redis::COMPRESSION_NONE !== $c) { throw new InvalidArgumentException(sprintf('redis compression must be disabled when using "%s", use "%s" instead.', static::class, DeflateMarshaller::class)); } } } $this->init($redis, $namespace, $defaultLifetime, new TagAwareMarshaller($marshaller)); $this->namespace = $namespace; } protected function doSave(array $values, int $lifetime, array $addTagData = [], array $delTagData = []): array { $eviction = $this->getRedisEvictionPolicy(); if ('noeviction' !== $eviction && !str_starts_with($eviction, 'volatile-')) { throw new LogicException(sprintf('Redis maxmemory-policy setting "%s" is *not* supported by RedisTagAwareAdapter, use "noeviction" or "volatile-*" eviction policies.', $eviction)); } // serialize values if (!$serialized = $this->marshaller->marshall($values, $failed)) { return $failed; } // While pipeline isn't supported on RedisCluster, other setups will at least benefit from doing this in one op $results = $this->pipeline(static function () use ($serialized, $lifetime, $addTagData, $delTagData, $failed) { // Store cache items, force a ttl if none is set, as there is no MSETEX we need to set each one foreach ($serialized as $id => $value) { yield 'setEx' => [ $id, 0 >= $lifetime ? self::DEFAULT_CACHE_TTL : $lifetime, $value, ]; } // Add and Remove Tags foreach ($addTagData as $tagId => $ids) { if (!$failed || $ids = array_diff($ids, $failed)) { yield 'sAdd' => array_merge([$tagId], $ids); } } foreach ($delTagData as $tagId => $ids) { if (!$failed || $ids = array_diff($ids, $failed)) { yield 'sRem' => array_merge([$tagId], $ids); } } }); foreach ($results as $id => $result) { // Skip results of SADD/SREM operations, they'll be 1 or 0 depending on if set value already existed or not if (is_numeric($result)) { continue; } // setEx results if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) { $failed[] = $id; } } return $failed; } protected function doDeleteYieldTags(array $ids): iterable { $lua = <<<'EOLUA' local v = redis.call('GET', KEYS[1]) local e = redis.pcall('UNLINK', KEYS[1]) if type(e) ~= 'number' then redis.call('DEL', KEYS[1]) end if not v or v:len() <= 13 or v:byte(1) ~= 0x9D or v:byte(6) ~= 0 or v:byte(10) ~= 0x5F then return '' end return v:sub(14, 13 + v:byte(13) + v:byte(12) * 256 + v:byte(11) * 65536) EOLUA; $results = $this->pipeline(function () use ($ids, $lua) { foreach ($ids as $id) { yield 'eval' => $this->redis instanceof \Predis\ClientInterface ? [$lua, 1, $id] : [$lua, [$id], 1]; } }); foreach ($results as $id => $result) { if ($result instanceof \RedisException || $result instanceof \Relay\Exception || $result instanceof ErrorInterface) { CacheItem::log($this->logger, 'Failed to delete key "{key}": '.$result->getMessage(), ['key' => substr($id, \strlen($this->namespace)), 'exception' => $result]); continue; } try { yield $id => !\is_string($result) || '' === $result ? [] : $this->marshaller->unmarshall($result); } catch (\Exception) { yield $id => []; } } } protected function doDeleteTagRelations(array $tagData): bool { $results = $this->pipeline(static function () use ($tagData) { foreach ($tagData as $tagId => $idList) { array_unshift($idList, $tagId); yield 'sRem' => $idList; } }); foreach ($results as $result) { // no-op } return true; } protected function doInvalidate(array $tagIds): bool { // This script scans the set of items linked to tag: it empties the set // and removes the linked items. When the set is still not empty after // the scan, it means we're in cluster mode and that the linked items // are on other nodes: we move the links to a temporary set and we // garbage collect that set from the client side. $lua = <<<'EOLUA' redis.replicate_commands() local cursor = '0' local id = KEYS[1] repeat local result = redis.call('SSCAN', id, cursor, 'COUNT', 5000); cursor = result[1]; local rems = {} for _, v in ipairs(result[2]) do local ok, _ = pcall(redis.call, 'DEL', ARGV[1]..v) if ok then table.insert(rems, v) end end if 0 < #rems then redis.call('SREM', id, unpack(rems)) end until '0' == cursor; redis.call('SUNIONSTORE', '{'..id..'}'..id, id) redis.call('DEL', id) return redis.call('SSCAN', '{'..id..'}'..id, '0', 'COUNT', 5000) EOLUA; $results = $this->pipeline(function () use ($tagIds, $lua) { if ($this->redis instanceof \Predis\ClientInterface) { $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : ''; } elseif (\is_array($prefix = $this->redis->getOption($this->redis instanceof Relay ? Relay::OPT_PREFIX : \Redis::OPT_PREFIX) ?? '')) { $prefix = current($prefix); } foreach ($tagIds as $id) { yield 'eval' => $this->redis instanceof \Predis\ClientInterface ? [$lua, 1, $id, $prefix] : [$lua, [$id, $prefix], 1]; } }); $lua = <<<'EOLUA' redis.replicate_commands() local id = KEYS[1] local cursor = table.remove(ARGV) redis.call('SREM', '{'..id..'}'..id, unpack(ARGV)) return redis.call('SSCAN', '{'..id..'}'..id, cursor, 'COUNT', 5000) EOLUA; $success = true; foreach ($results as $id => $values) { if ($values instanceof \RedisException || $values instanceof \Relay\Exception || $values instanceof ErrorInterface) { CacheItem::log($this->logger, 'Failed to invalidate key "{key}": '.$values->getMessage(), ['key' => substr($id, \strlen($this->namespace)), 'exception' => $values]); $success = false; continue; } [$cursor, $ids] = $values; while ($ids || '0' !== $cursor) { $this->doDelete($ids); $evalArgs = [$id, $cursor]; array_splice($evalArgs, 1, 0, $ids); if ($this->redis instanceof \Predis\ClientInterface) { array_unshift($evalArgs, $lua, 1); } else { $evalArgs = [$lua, $evalArgs, 1]; } $results = $this->pipeline(function () use ($evalArgs) { yield 'eval' => $evalArgs; }); foreach ($results as [$cursor, $ids]) { // no-op } } } return $success; } private function getRedisEvictionPolicy(): string { if (isset($this->redisEvictionPolicy)) { return $this->redisEvictionPolicy; } $hosts = $this->getHosts(); $host = reset($hosts); if ($host instanceof \Predis\Client && $host->getConnection() instanceof ReplicationInterface) { // Predis supports info command only on the master in replication environments $hosts = [$host->getClientFor('master')]; } foreach ($hosts as $host) { $info = $host->info('Memory'); if (false === $info || null === $info || $info instanceof ErrorInterface) { continue; } $info = $info['Memory'] ?? $info; return $this->redisEvictionPolicy = $info['maxmemory_policy'] ?? ''; } return $this->redisEvictionPolicy = ''; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/TagAwareAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Cache\CacheItemInterface; use Psr\Cache\InvalidArgumentException; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerAwareTrait; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\ResettableInterface; use Symfony\Component\Cache\Traits\ContractsTrait; use Symfony\Contracts\Cache\TagAwareCacheInterface; /** * Implements simple and robust tag-based invalidation suitable for use with volatile caches. * * This adapter works by storing a version for each tags. When saving an item, it is stored together with its tags and * their corresponding versions. When retrieving an item, those tag versions are compared to the current version of * each tags. Invalidation is achieved by deleting tags, thereby ensuring that their versions change even when the * storage is out of space. When versions of non-existing tags are requested for item commits, this adapter assigns a * new random version to them. * * @author Nicolas Grekas * @author Sergey Belyshkin */ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, PruneableInterface, ResettableInterface, LoggerAwareInterface { use ContractsTrait; use LoggerAwareTrait; public const TAGS_PREFIX = "\1tags\1"; private array $deferred = []; private AdapterInterface $pool; private AdapterInterface $tags; private array $knownTagVersions = []; private float $knownTagVersionsTtl; private static \Closure $setCacheItemTags; private static \Closure $setTagVersions; private static \Closure $getTagsByKey; private static \Closure $saveTags; public function __construct(AdapterInterface $itemsPool, ?AdapterInterface $tagsPool = null, float $knownTagVersionsTtl = 0.15) { $this->pool = $itemsPool; $this->tags = $tagsPool ?? $itemsPool; $this->knownTagVersionsTtl = $knownTagVersionsTtl; self::$setCacheItemTags ??= \Closure::bind( static function (array $items, array $itemTags) { foreach ($items as $key => $item) { $item->isTaggable = true; if (isset($itemTags[$key])) { $tags = array_keys($itemTags[$key]); $item->metadata[CacheItem::METADATA_TAGS] = array_combine($tags, $tags); } else { $item->value = null; $item->isHit = false; $item->metadata = []; } } return $items; }, null, CacheItem::class ); self::$setTagVersions ??= \Closure::bind( static function (array $items, array $tagVersions) { foreach ($items as $item) { $item->newMetadata[CacheItem::METADATA_TAGS] = array_intersect_key($tagVersions, $item->newMetadata[CacheItem::METADATA_TAGS] ?? []); } }, null, CacheItem::class ); self::$getTagsByKey ??= \Closure::bind( static function ($deferred) { $tagsByKey = []; foreach ($deferred as $key => $item) { $tagsByKey[$key] = $item->newMetadata[CacheItem::METADATA_TAGS] ?? []; $item->metadata = $item->newMetadata; } return $tagsByKey; }, null, CacheItem::class ); self::$saveTags ??= \Closure::bind( static function (AdapterInterface $tagsAdapter, array $tags) { ksort($tags); foreach ($tags as $v) { $v->expiry = 0; $tagsAdapter->saveDeferred($v); } return $tagsAdapter->commit(); }, null, CacheItem::class ); } public function invalidateTags(array $tags): bool { $ids = []; foreach ($tags as $tag) { \assert('' !== CacheItem::validateKey($tag)); unset($this->knownTagVersions[$tag]); $ids[] = $tag.static::TAGS_PREFIX; } return !$tags || $this->tags->deleteItems($ids); } public function hasItem(mixed $key): bool { return $this->getItem($key)->isHit(); } public function getItem(mixed $key): CacheItem { foreach ($this->getItems([$key]) as $item) { return $item; } } public function getItems(array $keys = []): iterable { $tagKeys = []; $commit = false; foreach ($keys as $key) { if ('' !== $key && \is_string($key)) { $commit = $commit || isset($this->deferred[$key]); } } if ($commit) { $this->commit(); } try { $items = $this->pool->getItems($keys); } catch (InvalidArgumentException $e) { $this->pool->getItems($keys); // Should throw an exception throw $e; } $bufferedItems = $itemTags = []; foreach ($items as $key => $item) { if (null !== $tags = $item->getMetadata()[CacheItem::METADATA_TAGS] ?? null) { $itemTags[$key] = $tags; } $bufferedItems[$key] = $item; if (null === $tags) { $key = "\0tags\0".$key; $tagKeys[$key] = $key; // BC with pools populated before v6.1 } } if ($tagKeys) { foreach ($this->pool->getItems($tagKeys) as $key => $item) { if ($item->isHit()) { $itemTags[substr($key, \strlen("\0tags\0"))] = $item->get() ?: []; } } } $tagVersions = $this->getTagVersions($itemTags, false); foreach ($itemTags as $key => $tags) { foreach ($tags as $tag => $version) { if ($tagVersions[$tag] !== $version) { unset($itemTags[$key]); continue 2; } } } $tagVersions = null; return (self::$setCacheItemTags)($bufferedItems, $itemTags); } public function clear(string $prefix = ''): bool { if ('' !== $prefix) { foreach ($this->deferred as $key => $item) { if (str_starts_with($key, $prefix)) { unset($this->deferred[$key]); } } } else { $this->deferred = []; } if ($this->pool instanceof AdapterInterface) { return $this->pool->clear($prefix); } return $this->pool->clear(); } public function deleteItem(mixed $key): bool { return $this->deleteItems([$key]); } public function deleteItems(array $keys): bool { foreach ($keys as $key) { if ('' !== $key && \is_string($key)) { $keys[] = "\0tags\0".$key; // BC with pools populated before v6.1 } } return $this->pool->deleteItems($keys); } public function save(CacheItemInterface $item): bool { if (!$item instanceof CacheItem) { return false; } $this->deferred[$item->getKey()] = $item; return $this->commit(); } public function saveDeferred(CacheItemInterface $item): bool { if (!$item instanceof CacheItem) { return false; } $this->deferred[$item->getKey()] = $item; return true; } public function commit(): bool { if (!$items = $this->deferred) { return true; } $tagVersions = $this->getTagVersions((self::$getTagsByKey)($items), true); (self::$setTagVersions)($items, $tagVersions); $ok = true; foreach ($items as $key => $item) { if ($this->pool->saveDeferred($item)) { unset($this->deferred[$key]); } else { $ok = false; } } $ok = $this->pool->commit() && $ok; $tagVersions = array_keys($tagVersions); (self::$setTagVersions)($items, array_combine($tagVersions, $tagVersions)); return $ok; } public function prune(): bool { return $this->pool instanceof PruneableInterface && $this->pool->prune(); } /** * @return void */ public function reset() { $this->commit(); $this->knownTagVersions = []; $this->pool instanceof ResettableInterface && $this->pool->reset(); $this->tags instanceof ResettableInterface && $this->tags->reset(); } public function __sleep(): array { throw new \BadMethodCallException('Cannot serialize '.__CLASS__); } /** * @return void */ public function __wakeup() { throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); } public function __destruct() { $this->commit(); } private function getTagVersions(array $tagsByKey, bool $persistTags): array { $tagVersions = []; $fetchTagVersions = $persistTags; foreach ($tagsByKey as $tags) { $tagVersions += $tags; if ($fetchTagVersions) { continue; } foreach ($tags as $tag => $version) { if ($tagVersions[$tag] !== $version) { $fetchTagVersions = true; } } } if (!$tagVersions) { return []; } $now = microtime(true); $tags = []; foreach ($tagVersions as $tag => $version) { $tags[$tag.static::TAGS_PREFIX] = $tag; $knownTagVersion = $this->knownTagVersions[$tag] ?? [0, null]; if ($fetchTagVersions || $now > $knownTagVersion[0] || $knownTagVersion[1] !== $version) { // reuse previously fetched tag versions until the expiration $fetchTagVersions = true; } } if (!$fetchTagVersions) { return $tagVersions; } $newTags = []; $newVersion = null; $expiration = $now + $this->knownTagVersionsTtl; foreach ($this->tags->getItems(array_keys($tags)) as $tag => $version) { unset($this->knownTagVersions[$tag = $tags[$tag]]); // update FIFO if (null !== $tagVersions[$tag] = $version->get()) { $this->knownTagVersions[$tag] = [$expiration, $tagVersions[$tag]]; } elseif ($persistTags) { $newTags[$tag] = $version->set($newVersion ??= random_bytes(6)); $tagVersions[$tag] = $newVersion; $this->knownTagVersions[$tag] = [$expiration, $newVersion]; } } if ($newTags) { (self::$saveTags)($this->tags, $newTags); } while ($now > ($this->knownTagVersions[$tag = array_key_first($this->knownTagVersions)][0] ?? \INF)) { unset($this->knownTagVersions[$tag]); } return $tagVersions; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Cache\InvalidArgumentException; /** * Interface for invalidating cached items using tags. * * @author Nicolas Grekas */ interface TagAwareAdapterInterface extends AdapterInterface { /** * Invalidates cached items using tags. * * @param string[] $tags An array of tags to invalidate * * @throws InvalidArgumentException When $tags is not valid */ public function invalidateTags(array $tags): bool; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/TraceableAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Psr\Cache\CacheItemInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\ResettableInterface; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Contracts\Service\ResetInterface; /** * An adapter that collects data about all cache calls. * * @author Aaron Scherer * @author Tobias Nyholm * @author Nicolas Grekas */ class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface { protected $pool; private array $calls = []; public function __construct(AdapterInterface $pool) { $this->pool = $pool; } public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed { if (!$this->pool instanceof CacheInterface) { throw new \BadMethodCallException(sprintf('Cannot call "%s::get()": this class doesn\'t implement "%s".', get_debug_type($this->pool), CacheInterface::class)); } $isHit = true; $callback = function (CacheItem $item, bool &$save) use ($callback, &$isHit) { $isHit = $item->isHit(); return $callback($item, $save); }; $event = $this->start(__FUNCTION__); try { $value = $this->pool->get($key, $callback, $beta, $metadata); $event->result[$key] = get_debug_type($value); } finally { $event->end = microtime(true); } if ($isHit) { ++$event->hits; } else { ++$event->misses; } return $value; } public function getItem(mixed $key): CacheItem { $event = $this->start(__FUNCTION__); try { $item = $this->pool->getItem($key); } finally { $event->end = microtime(true); } if ($event->result[$key] = $item->isHit()) { ++$event->hits; } else { ++$event->misses; } return $item; } public function hasItem(mixed $key): bool { $event = $this->start(__FUNCTION__); try { return $event->result[$key] = $this->pool->hasItem($key); } finally { $event->end = microtime(true); } } public function deleteItem(mixed $key): bool { $event = $this->start(__FUNCTION__); try { return $event->result[$key] = $this->pool->deleteItem($key); } finally { $event->end = microtime(true); } } public function save(CacheItemInterface $item): bool { $event = $this->start(__FUNCTION__); try { return $event->result[$item->getKey()] = $this->pool->save($item); } finally { $event->end = microtime(true); } } public function saveDeferred(CacheItemInterface $item): bool { $event = $this->start(__FUNCTION__); try { return $event->result[$item->getKey()] = $this->pool->saveDeferred($item); } finally { $event->end = microtime(true); } } public function getItems(array $keys = []): iterable { $event = $this->start(__FUNCTION__); try { $result = $this->pool->getItems($keys); } finally { $event->end = microtime(true); } $f = function () use ($result, $event) { $event->result = []; foreach ($result as $key => $item) { if ($event->result[$key] = $item->isHit()) { ++$event->hits; } else { ++$event->misses; } yield $key => $item; } }; return $f(); } public function clear(string $prefix = ''): bool { $event = $this->start(__FUNCTION__); try { if ($this->pool instanceof AdapterInterface) { return $event->result = $this->pool->clear($prefix); } return $event->result = $this->pool->clear(); } finally { $event->end = microtime(true); } } public function deleteItems(array $keys): bool { $event = $this->start(__FUNCTION__); $event->result['keys'] = $keys; try { return $event->result['result'] = $this->pool->deleteItems($keys); } finally { $event->end = microtime(true); } } public function commit(): bool { $event = $this->start(__FUNCTION__); try { return $event->result = $this->pool->commit(); } finally { $event->end = microtime(true); } } public function prune(): bool { if (!$this->pool instanceof PruneableInterface) { return false; } $event = $this->start(__FUNCTION__); try { return $event->result = $this->pool->prune(); } finally { $event->end = microtime(true); } } /** * @return void */ public function reset() { if ($this->pool instanceof ResetInterface) { $this->pool->reset(); } $this->clearCalls(); } public function delete(string $key): bool { $event = $this->start(__FUNCTION__); try { return $event->result[$key] = $this->pool->deleteItem($key); } finally { $event->end = microtime(true); } } /** * @return array */ public function getCalls() { return $this->calls; } /** * @return void */ public function clearCalls() { $this->calls = []; } public function getPool(): AdapterInterface { return $this->pool; } /** * @return TraceableAdapterEvent */ protected function start(string $name) { $this->calls[] = $event = new TraceableAdapterEvent(); $event->name = $name; $event->start = microtime(true); return $event; } } /** * @internal */ class TraceableAdapterEvent { public string $name; public float $start; public float $end; public array|bool $result; public int $hits = 0; public int $misses = 0; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Adapter; use Symfony\Contracts\Cache\TagAwareCacheInterface; /** * @author Robin Chalas */ class TraceableTagAwareAdapter extends TraceableAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface { public function __construct(TagAwareAdapterInterface $pool) { parent::__construct($pool); } public function invalidateTags(array $tags): bool { $event = $this->start(__FUNCTION__); try { return $event->result = $this->pool->invalidateTags($tags); } finally { $event->end = microtime(true); } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/CHANGELOG.md ================================================ CHANGELOG ========= 6.4 --- * `EarlyExpirationHandler` no longer implements `MessageHandlerInterface`, rely on `AsMessageHandler` instead 6.3 --- * Add support for Relay PHP extension for Redis * Updates to allow Redis cluster connections using predis/predis:^2.0 * Add optional parameter `$isSameDatabase` to `DoctrineDbalAdapter::configureSchema()` 6.1 --- * Add support for ACL auth in RedisAdapter * Improve reliability and performance of `TagAwareAdapter` by making tag versions an integral part of item value 6.0 --- * Remove `DoctrineProvider` and `DoctrineAdapter` * Remove support of Doctrine DBAL in `PdoAdapter` 5.4 --- * Deprecate `DoctrineProvider` and `DoctrineAdapter` because these classes have been added to the `doctrine/cache` package * Add `DoctrineDbalAdapter` identical to `PdoAdapter` for `Doctrine\DBAL\Connection` or DBAL URL * Deprecate usage of `PdoAdapter` with `Doctrine\DBAL\Connection` or DBAL URL 5.3 --- * added support for connecting to Redis Sentinel clusters when using the Redis PHP extension * add support for a custom serializer to the `ApcuAdapter` class 5.2.0 ----- * added integration with Messenger to allow computing cached values in a worker * allow ISO 8601 time intervals to specify default lifetime 5.1.0 ----- * added max-items + LRU + max-lifetime capabilities to `ArrayCache` * added `CouchbaseBucketAdapter` * added context `cache-adapter` to log messages 5.0.0 ----- * removed all PSR-16 implementations in the `Simple` namespace * removed `SimpleCacheAdapter` * removed `AbstractAdapter::unserialize()` * removed `CacheItem::getPreviousTags()` 4.4.0 ----- * added support for connecting to Redis Sentinel clusters * added argument `$prefix` to `AdapterInterface::clear()` * improved `RedisTagAwareAdapter` to support Redis server >= 2.8 and up to 4B items per tag * added `TagAwareMarshaller` for optimized data storage when using `AbstractTagAwareAdapter` * added `DeflateMarshaller` to compress serialized values * removed support for phpredis 4 `compression` * [BC BREAK] `RedisTagAwareAdapter` is not compatible with `RedisCluster` from `Predis` anymore, use `phpredis` instead * Marked the `CacheDataCollector` class as `@final`. * added `SodiumMarshaller` to encrypt/decrypt values using libsodium 4.3.0 ----- * removed `psr/simple-cache` dependency, run `composer require psr/simple-cache` if you need it * deprecated all PSR-16 adapters, use `Psr16Cache` or `Symfony\Contracts\Cache\CacheInterface` implementations instead * deprecated `SimpleCacheAdapter`, use `Psr16Adapter` instead 4.2.0 ----- * added support for connecting to Redis clusters via DSN * added support for configuring multiple Memcached servers via DSN * added `MarshallerInterface` and `DefaultMarshaller` to allow changing the serializer and provide one that automatically uses igbinary when available * implemented `CacheInterface`, which provides stampede protection via probabilistic early expiration and should become the preferred way to use a cache * added sub-second expiry accuracy for backends that support it * added support for phpredis 4 `compression` and `tcp_keepalive` options * added automatic table creation when using Doctrine DBAL with PDO-based backends * throw `LogicException` when `CacheItem::tag()` is called on an item coming from a non tag-aware pool * deprecated `CacheItem::getPreviousTags()`, use `CacheItem::getMetadata()` instead * deprecated the `AbstractAdapter::unserialize()` and `AbstractCache::unserialize()` methods * added `CacheCollectorPass` (originally in `FrameworkBundle`) * added `CachePoolClearerPass` (originally in `FrameworkBundle`) * added `CachePoolPass` (originally in `FrameworkBundle`) * added `CachePoolPrunerPass` (originally in `FrameworkBundle`) 3.4.0 ----- * added using options from Memcached DSN * added PruneableInterface so PSR-6 or PSR-16 cache implementations can declare support for manual stale cache pruning * added prune logic to FilesystemTrait, PhpFilesTrait, PdoTrait, TagAwareAdapter and ChainTrait * now FilesystemAdapter, PhpFilesAdapter, FilesystemCache, PhpFilesCache, PdoAdapter, PdoCache, ChainAdapter, and ChainCache implement PruneableInterface and support manual stale cache pruning 3.3.0 ----- * added CacheItem::getPreviousTags() to get bound tags coming from the pool storage if any * added PSR-16 "Simple Cache" implementations for all existing PSR-6 adapters * added Psr6Cache and SimpleCacheAdapter for bidirectional interoperability between PSR-6 and PSR-16 * added MemcachedAdapter (PSR-6) and MemcachedCache (PSR-16) * added TraceableAdapter (PSR-6) and TraceableCache (PSR-16) 3.2.0 ----- * added TagAwareAdapter for tags-based invalidation * added PdoAdapter with PDO and Doctrine DBAL support * added PhpArrayAdapter and PhpFilesAdapter for OPcache-backed shared memory storage (PHP 7+ only) * added NullAdapter 3.1.0 ----- * added the component with strict PSR-6 implementations * added ApcuAdapter, ArrayAdapter, FilesystemAdapter and RedisAdapter * added AbstractAdapter, ChainAdapter and ProxyAdapter * added DoctrineAdapter and DoctrineProvider for bidirectional interoperability with Doctrine Cache ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/CacheItem.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache; use Psr\Log\LoggerInterface; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Exception\LogicException; use Symfony\Contracts\Cache\ItemInterface; /** * @author Nicolas Grekas */ final class CacheItem implements ItemInterface { private const METADATA_EXPIRY_OFFSET = 1527506807; private const VALUE_WRAPPER = "\xA9"; protected string $key; protected mixed $value = null; protected bool $isHit = false; protected float|int|null $expiry = null; protected array $metadata = []; protected array $newMetadata = []; protected ?ItemInterface $innerItem = null; protected ?string $poolHash = null; protected bool $isTaggable = false; public function getKey(): string { return $this->key; } public function get(): mixed { return $this->value; } public function isHit(): bool { return $this->isHit; } /** * @return $this */ public function set($value): static { $this->value = $value; return $this; } /** * @return $this */ public function expiresAt(?\DateTimeInterface $expiration): static { $this->expiry = null !== $expiration ? (float) $expiration->format('U.u') : null; return $this; } /** * @return $this */ public function expiresAfter(mixed $time): static { if (null === $time) { $this->expiry = null; } elseif ($time instanceof \DateInterval) { $this->expiry = microtime(true) + \DateTimeImmutable::createFromFormat('U', 0)->add($time)->format('U.u'); } elseif (\is_int($time)) { $this->expiry = $time + microtime(true); } else { throw new InvalidArgumentException(sprintf('Expiration date must be an integer, a DateInterval or null, "%s" given.', get_debug_type($time))); } return $this; } public function tag(mixed $tags): static { if (!$this->isTaggable) { throw new LogicException(sprintf('Cache item "%s" comes from a non tag-aware pool: you cannot tag it.', $this->key)); } if (!\is_array($tags) && !$tags instanceof \Traversable) { // don't use is_iterable(), it's slow $tags = [$tags]; } foreach ($tags as $tag) { if (!\is_string($tag) && !$tag instanceof \Stringable) { throw new InvalidArgumentException(sprintf('Cache tag must be string or object that implements __toString(), "%s" given.', get_debug_type($tag))); } $tag = (string) $tag; if (isset($this->newMetadata[self::METADATA_TAGS][$tag])) { continue; } if ('' === $tag) { throw new InvalidArgumentException('Cache tag length must be greater than zero.'); } if (false !== strpbrk($tag, self::RESERVED_CHARACTERS)) { throw new InvalidArgumentException(sprintf('Cache tag "%s" contains reserved characters "%s".', $tag, self::RESERVED_CHARACTERS)); } $this->newMetadata[self::METADATA_TAGS][$tag] = $tag; } return $this; } public function getMetadata(): array { return $this->metadata; } /** * Validates a cache key according to PSR-6. * * @param mixed $key The key to validate * * @throws InvalidArgumentException When $key is not valid */ public static function validateKey($key): string { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } if ('' === $key) { throw new InvalidArgumentException('Cache key length must be greater than zero.'); } if (false !== strpbrk($key, self::RESERVED_CHARACTERS)) { throw new InvalidArgumentException(sprintf('Cache key "%s" contains reserved characters "%s".', $key, self::RESERVED_CHARACTERS)); } return $key; } /** * Internal logging helper. * * @internal */ public static function log(?LoggerInterface $logger, string $message, array $context = []): void { if ($logger) { $logger->warning($message, $context); } else { $replace = []; foreach ($context as $k => $v) { if (\is_scalar($v)) { $replace['{'.$k.'}'] = $v; } } @trigger_error(strtr($message, $replace), \E_USER_WARNING); } } private function pack(): mixed { if (!$m = $this->newMetadata) { return $this->value; } $valueWrapper = self::VALUE_WRAPPER; return new $valueWrapper($this->value, $m + ['expiry' => $this->expiry]); } private function unpack(): bool { $v = $this->value; $valueWrapper = self::VALUE_WRAPPER; if ($v instanceof $valueWrapper) { $this->value = $v->value; $this->metadata = $v->metadata; return true; } if (!\is_array($v) || 1 !== \count($v) || 10 !== \strlen($k = (string) array_key_first($v)) || "\x9D" !== $k[0] || "\0" !== $k[5] || "\x5F" !== $k[9]) { return false; } // BC with pools populated before v6.1 $this->value = $v[$k]; $this->metadata = unpack('Vexpiry/Nctime', substr($k, 1, -1)); $this->metadata['expiry'] += self::METADATA_EXPIRY_OFFSET; return true; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/DataCollector/CacheDataCollector.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\DataCollector; use Symfony\Component\Cache\Adapter\TraceableAdapter; use Symfony\Component\Cache\Adapter\TraceableAdapterEvent; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\DataCollector\DataCollector; use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; /** * @author Aaron Scherer * @author Tobias Nyholm * * @final */ class CacheDataCollector extends DataCollector implements LateDataCollectorInterface { /** * @var TraceableAdapter[] */ private array $instances = []; public function addInstance(string $name, TraceableAdapter $instance): void { $this->instances[$name] = $instance; } public function collect(Request $request, Response $response, ?\Throwable $exception = null): void { $empty = ['calls' => [], 'adapters' => [], 'config' => [], 'options' => [], 'statistics' => []]; $this->data = ['instances' => $empty, 'total' => $empty]; foreach ($this->instances as $name => $instance) { $this->data['instances']['calls'][$name] = $instance->getCalls(); $this->data['instances']['adapters'][$name] = get_debug_type($instance->getPool()); } $this->data['instances']['statistics'] = $this->calculateStatistics(); $this->data['total']['statistics'] = $this->calculateTotalStatistics(); } public function reset(): void { $this->data = []; foreach ($this->instances as $instance) { $instance->clearCalls(); } } public function lateCollect(): void { $this->data['instances']['calls'] = $this->cloneVar($this->data['instances']['calls']); } public function getName(): string { return 'cache'; } /** * Method returns amount of logged Cache reads: "get" calls. */ public function getStatistics(): array { return $this->data['instances']['statistics']; } /** * Method returns the statistic totals. */ public function getTotals(): array { return $this->data['total']['statistics']; } /** * Method returns all logged Cache call objects. */ public function getCalls(): mixed { return $this->data['instances']['calls']; } /** * Method returns all logged Cache adapter classes. */ public function getAdapters(): array { return $this->data['instances']['adapters']; } private function calculateStatistics(): array { $statistics = []; foreach ($this->data['instances']['calls'] as $name => $calls) { $statistics[$name] = [ 'calls' => 0, 'time' => 0, 'reads' => 0, 'writes' => 0, 'deletes' => 0, 'hits' => 0, 'misses' => 0, ]; /** @var TraceableAdapterEvent $call */ foreach ($calls as $call) { ++$statistics[$name]['calls']; $statistics[$name]['time'] += ($call->end ?? microtime(true)) - $call->start; if ('get' === $call->name) { ++$statistics[$name]['reads']; if ($call->hits) { ++$statistics[$name]['hits']; } else { ++$statistics[$name]['misses']; ++$statistics[$name]['writes']; } } elseif ('getItem' === $call->name) { ++$statistics[$name]['reads']; if ($call->hits) { ++$statistics[$name]['hits']; } else { ++$statistics[$name]['misses']; } } elseif ('getItems' === $call->name) { $statistics[$name]['reads'] += $call->hits + $call->misses; $statistics[$name]['hits'] += $call->hits; $statistics[$name]['misses'] += $call->misses; } elseif ('hasItem' === $call->name) { ++$statistics[$name]['reads']; foreach ($call->result ?? [] as $result) { ++$statistics[$name][$result ? 'hits' : 'misses']; } } elseif ('save' === $call->name) { ++$statistics[$name]['writes']; } elseif ('deleteItem' === $call->name) { ++$statistics[$name]['deletes']; } } if ($statistics[$name]['reads']) { $statistics[$name]['hit_read_ratio'] = round(100 * $statistics[$name]['hits'] / $statistics[$name]['reads'], 2); } else { $statistics[$name]['hit_read_ratio'] = null; } } return $statistics; } private function calculateTotalStatistics(): array { $statistics = $this->getStatistics(); $totals = [ 'calls' => 0, 'time' => 0, 'reads' => 0, 'writes' => 0, 'deletes' => 0, 'hits' => 0, 'misses' => 0, ]; foreach ($statistics as $name => $values) { foreach ($totals as $key => $value) { $totals[$key] += $statistics[$name][$key]; } } if ($totals['reads']) { $totals['hit_read_ratio'] = round(100 * $totals['hits'] / $totals['reads'], 2); } else { $totals['hit_read_ratio'] = null; } return $totals; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\DependencyInjection; use Symfony\Component\Cache\Adapter\TagAwareAdapterInterface; use Symfony\Component\Cache\Adapter\TraceableAdapter; use Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; /** * Inject a data collector to all the cache services to be able to get detailed statistics. * * @author Tobias Nyholm */ class CacheCollectorPass implements CompilerPassInterface { /** * @return void */ public function process(ContainerBuilder $container) { if (!$container->hasDefinition('data_collector.cache')) { return; } foreach ($container->findTaggedServiceIds('cache.pool') as $id => $attributes) { $poolName = $attributes[0]['name'] ?? $id; $this->addToCollector($id, $poolName, $container); } } private function addToCollector(string $id, string $name, ContainerBuilder $container): void { $definition = $container->getDefinition($id); if ($definition->isAbstract()) { return; } $collectorDefinition = $container->getDefinition('data_collector.cache'); $recorder = new Definition(is_subclass_of($definition->getClass(), TagAwareAdapterInterface::class) ? TraceableTagAwareAdapter::class : TraceableAdapter::class); $recorder->setTags($definition->getTags()); if (!$definition->isPublic() || !$definition->isPrivate()) { $recorder->setPublic($definition->isPublic()); } $recorder->setArguments([new Reference($innerId = $id.'.recorder_inner')]); foreach ($definition->getMethodCalls() as [$method, $args]) { if ('setCallbackWrapper' !== $method || !$args[0] instanceof Definition || !($args[0]->getArguments()[2] ?? null) instanceof Definition) { continue; } if ([new Reference($id), 'setCallbackWrapper'] == $args[0]->getArguments()[2]->getFactory()) { $args[0]->getArguments()[2]->setFactory([new Reference($innerId), 'setCallbackWrapper']); } } $definition->setTags([]); $definition->setPublic(false); $container->setDefinition($innerId, $definition); $container->setDefinition($id, $recorder); // Tell the collector to add the new instance $collectorDefinition->addMethodCall('addInstance', [$name, new Reference($id)]); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\DependencyInjection; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; /** * @author Nicolas Grekas */ class CachePoolClearerPass implements CompilerPassInterface { /** * @return void */ public function process(ContainerBuilder $container) { $container->getParameterBag()->remove('cache.prefix.seed'); foreach ($container->findTaggedServiceIds('cache.pool.clearer') as $id => $attr) { $clearer = $container->getDefinition($id); $pools = []; foreach ($clearer->getArgument(0) as $name => $ref) { if ($container->hasDefinition($ref)) { $pools[$name] = new Reference($ref); } } $clearer->replaceArgument(0, $pools); } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/DependencyInjection/CachePoolPass.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\DependencyInjection; use Symfony\Component\Cache\Adapter\AbstractAdapter; use Symfony\Component\Cache\Adapter\ArrayAdapter; use Symfony\Component\Cache\Adapter\ChainAdapter; use Symfony\Component\Cache\Adapter\NullAdapter; use Symfony\Component\Cache\Adapter\ParameterNormalizer; use Symfony\Component\Cache\Messenger\EarlyExpirationDispatcher; use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; use Symfony\Component\DependencyInjection\Reference; /** * @author Nicolas Grekas */ class CachePoolPass implements CompilerPassInterface { /** * @return void */ public function process(ContainerBuilder $container) { if ($container->hasParameter('cache.prefix.seed')) { $seed = $container->getParameterBag()->resolveValue($container->getParameter('cache.prefix.seed')); } else { $seed = '_'.$container->getParameter('kernel.project_dir'); $seed .= '.'.$container->getParameter('kernel.container_class'); } $needsMessageHandler = false; $allPools = []; $clearers = []; $attributes = [ 'provider', 'name', 'namespace', 'default_lifetime', 'early_expiration_message_bus', 'reset', ]; foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) { $adapter = $pool = $container->getDefinition($id); if ($pool->isAbstract()) { continue; } $class = $adapter->getClass(); while ($adapter instanceof ChildDefinition) { $adapter = $container->findDefinition($adapter->getParent()); $class = $class ?: $adapter->getClass(); if ($t = $adapter->getTag('cache.pool')) { $tags[0] += $t[0]; } } $name = $tags[0]['name'] ?? $id; if (!isset($tags[0]['namespace'])) { $namespaceSeed = $seed; if (null !== $class) { $namespaceSeed .= '.'.$class; } $tags[0]['namespace'] = $this->getNamespace($namespaceSeed, $name); } if (isset($tags[0]['clearer'])) { $clearer = $tags[0]['clearer']; while ($container->hasAlias($clearer)) { $clearer = (string) $container->getAlias($clearer); } } else { $clearer = null; } unset($tags[0]['clearer'], $tags[0]['name']); if (isset($tags[0]['provider'])) { $tags[0]['provider'] = new Reference(static::getServiceProvider($container, $tags[0]['provider'])); } if (ChainAdapter::class === $class) { $adapters = []; foreach ($adapter->getArgument(0) as $provider => $adapter) { if ($adapter instanceof ChildDefinition) { $chainedPool = $adapter; } else { $chainedPool = $adapter = new ChildDefinition($adapter); } $chainedTags = [\is_int($provider) ? [] : ['provider' => $provider]]; $chainedClass = ''; while ($adapter instanceof ChildDefinition) { $adapter = $container->findDefinition($adapter->getParent()); $chainedClass = $chainedClass ?: $adapter->getClass(); if ($t = $adapter->getTag('cache.pool')) { $chainedTags[0] += $t[0]; } } if (ChainAdapter::class === $chainedClass) { throw new InvalidArgumentException(sprintf('Invalid service "%s": chain of adapters cannot reference another chain, found "%s".', $id, $chainedPool->getParent())); } $i = 0; if (isset($chainedTags[0]['provider'])) { $chainedPool->replaceArgument($i++, new Reference(static::getServiceProvider($container, $chainedTags[0]['provider']))); } if (isset($tags[0]['namespace']) && !\in_array($adapter->getClass(), [ArrayAdapter::class, NullAdapter::class], true)) { $chainedPool->replaceArgument($i++, $tags[0]['namespace']); } if (isset($tags[0]['default_lifetime'])) { $chainedPool->replaceArgument($i++, $tags[0]['default_lifetime']); } $adapters[] = $chainedPool; } $pool->replaceArgument(0, $adapters); unset($tags[0]['provider'], $tags[0]['namespace']); $i = 1; } else { $i = 0; } foreach ($attributes as $attr) { if (!isset($tags[0][$attr])) { // no-op } elseif ('reset' === $attr) { if ($tags[0][$attr]) { $pool->addTag('kernel.reset', ['method' => $tags[0][$attr]]); } } elseif ('early_expiration_message_bus' === $attr) { $needsMessageHandler = true; $pool->addMethodCall('setCallbackWrapper', [(new Definition(EarlyExpirationDispatcher::class)) ->addArgument(new Reference($tags[0]['early_expiration_message_bus'])) ->addArgument(new Reference('reverse_container')) ->addArgument((new Definition('callable')) ->setFactory([new Reference($id), 'setCallbackWrapper']) ->addArgument(null) ), ]); $pool->addTag('container.reversible'); } elseif ('namespace' !== $attr || !\in_array($class, [ArrayAdapter::class, NullAdapter::class], true)) { $argument = $tags[0][$attr]; if ('default_lifetime' === $attr && !is_numeric($argument)) { $argument = (new Definition('int', [$argument])) ->setFactory([ParameterNormalizer::class, 'normalizeDuration']); } $pool->replaceArgument($i++, $argument); } unset($tags[0][$attr]); } if (!empty($tags[0])) { throw new InvalidArgumentException(sprintf('Invalid "cache.pool" tag for service "%s": accepted attributes are "clearer", "provider", "name", "namespace", "default_lifetime", "early_expiration_message_bus" and "reset", found "%s".', $id, implode('", "', array_keys($tags[0])))); } if (null !== $clearer) { $clearers[$clearer][$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE); } $allPools[$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE); } if (!$needsMessageHandler) { $container->removeDefinition('cache.early_expiration_handler'); } $notAliasedCacheClearerId = 'cache.global_clearer'; while ($container->hasAlias($notAliasedCacheClearerId)) { $notAliasedCacheClearerId = (string) $container->getAlias($notAliasedCacheClearerId); } if ($container->hasDefinition($notAliasedCacheClearerId)) { $clearers[$notAliasedCacheClearerId] = $allPools; } foreach ($clearers as $id => $pools) { $clearer = $container->getDefinition($id); if ($clearer instanceof ChildDefinition) { $clearer->replaceArgument(0, $pools); } else { $clearer->setArgument(0, $pools); } $clearer->addTag('cache.pool.clearer'); if ('cache.system_clearer' === $id) { $clearer->addTag('kernel.cache_clearer'); } } $allPoolsKeys = array_keys($allPools); if ($container->hasDefinition('console.command.cache_pool_list')) { $container->getDefinition('console.command.cache_pool_list')->replaceArgument(0, $allPoolsKeys); } if ($container->hasDefinition('console.command.cache_pool_clear')) { $container->getDefinition('console.command.cache_pool_clear')->addArgument($allPoolsKeys); } if ($container->hasDefinition('console.command.cache_pool_delete')) { $container->getDefinition('console.command.cache_pool_delete')->addArgument($allPoolsKeys); } } private function getNamespace(string $seed, string $id): string { return substr(str_replace('/', '-', base64_encode(hash('sha256', $id.$seed, true))), 0, 10); } /** * @internal */ public static function getServiceProvider(ContainerBuilder $container, string $name): string { $container->resolveEnvPlaceholders($name, null, $usedEnvs); if ($usedEnvs || preg_match('#^[a-z]++:#', $name)) { $dsn = $name; if (!$container->hasDefinition($name = '.cache_connection.'.ContainerBuilder::hash($dsn))) { $definition = new Definition(AbstractAdapter::class); $definition->setFactory([AbstractAdapter::class, 'createConnection']); $definition->setArguments([$dsn, ['lazy' => true]]); $container->setDefinition($name, $definition); } } return $name; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\DependencyInjection; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\DependencyInjection\Argument\IteratorArgument; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; use Symfony\Component\DependencyInjection\Reference; /** * @author Rob Frawley 2nd */ class CachePoolPrunerPass implements CompilerPassInterface { /** * @return void */ public function process(ContainerBuilder $container) { if (!$container->hasDefinition('console.command.cache_pool_prune')) { return; } $services = []; foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) { $class = $container->getParameterBag()->resolveValue($container->getDefinition($id)->getClass()); if (!$reflection = $container->getReflectionClass($class)) { throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); } if ($reflection->implementsInterface(PruneableInterface::class)) { $services[$id] = new Reference($id); } } $container->getDefinition('console.command.cache_pool_prune')->replaceArgument(0, new IteratorArgument($services)); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Exception/CacheException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Exception; use Psr\Cache\CacheException as Psr6CacheInterface; use Psr\SimpleCache\CacheException as SimpleCacheInterface; if (interface_exists(SimpleCacheInterface::class)) { class CacheException extends \Exception implements Psr6CacheInterface, SimpleCacheInterface { } } else { class CacheException extends \Exception implements Psr6CacheInterface { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Exception/InvalidArgumentException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Exception; use Psr\Cache\InvalidArgumentException as Psr6CacheInterface; use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInterface; if (interface_exists(SimpleCacheInterface::class)) { class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface, SimpleCacheInterface { } } else { class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Exception/LogicException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Exception; use Psr\Cache\CacheException as Psr6CacheInterface; use Psr\SimpleCache\CacheException as SimpleCacheInterface; if (interface_exists(SimpleCacheInterface::class)) { class LogicException extends \LogicException implements Psr6CacheInterface, SimpleCacheInterface { } } else { class LogicException extends \LogicException implements Psr6CacheInterface { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/LICENSE ================================================ Copyright (c) 2016-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/LockRegistry.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache; use Psr\Log\LoggerInterface; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Contracts\Cache\ItemInterface; /** * LockRegistry is used internally by existing adapters to protect against cache stampede. * * It does so by wrapping the computation of items in a pool of locks. * Foreach each apps, there can be at most 20 concurrent processes that * compute items at the same time and only one per cache-key. * * @author Nicolas Grekas */ final class LockRegistry { private static array $openedFiles = []; private static ?array $lockedFiles = null; private static \Exception $signalingException; private static \Closure $signalingCallback; /** * The number of items in this list controls the max number of concurrent processes. */ private static array $files = [ __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AbstractAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AbstractTagAwareAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AdapterInterface.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ApcuAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ArrayAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ChainAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseBucketAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseCollectionAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'DoctrineDbalAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemTagAwareAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'MemcachedAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'NullAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ParameterNormalizer.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PdoAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PhpArrayAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PhpFilesAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ProxyAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'Psr16Adapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'RedisAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'RedisTagAwareAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TagAwareAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TagAwareAdapterInterface.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TraceableAdapter.php', __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TraceableTagAwareAdapter.php', ]; /** * Defines a set of existing files that will be used as keys to acquire locks. * * @return array The previously defined set of files */ public static function setFiles(array $files): array { $previousFiles = self::$files; self::$files = $files; foreach (self::$openedFiles as $file) { if ($file) { flock($file, \LOCK_UN); fclose($file); } } self::$openedFiles = self::$lockedFiles = []; return $previousFiles; } public static function compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, ?\Closure $setMetadata = null, ?LoggerInterface $logger = null): mixed { if ('\\' === \DIRECTORY_SEPARATOR && null === self::$lockedFiles) { // disable locking on Windows by default self::$files = self::$lockedFiles = []; } $key = self::$files ? abs(crc32($item->getKey())) % \count(self::$files) : -1; if ($key < 0 || self::$lockedFiles || !$lock = self::open($key)) { return $callback($item, $save); } self::$signalingException ??= unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}"); self::$signalingCallback ??= fn () => throw self::$signalingException; while (true) { try { // race to get the lock in non-blocking mode $locked = flock($lock, \LOCK_EX | \LOCK_NB, $wouldBlock); if ($locked || !$wouldBlock) { $logger?->info(sprintf('Lock %s, now computing item "{key}"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]); self::$lockedFiles[$key] = true; $value = $callback($item, $save); if ($save) { if ($setMetadata) { $setMetadata($item); } $pool->save($item->set($value)); $save = false; } return $value; } // if we failed the race, retry locking in blocking mode to wait for the winner $logger?->info('Item "{key}" is locked, waiting for it to be released', ['key' => $item->getKey()]); flock($lock, \LOCK_SH); } finally { flock($lock, \LOCK_UN); unset(self::$lockedFiles[$key]); } try { $value = $pool->get($item->getKey(), self::$signalingCallback, 0); $logger?->info('Item "{key}" retrieved after lock was released', ['key' => $item->getKey()]); $save = false; return $value; } catch (\Exception $e) { if (self::$signalingException !== $e) { throw $e; } $logger?->info('Item "{key}" not found while lock was released, now retrying', ['key' => $item->getKey()]); } } return null; } /** * @return resource|false */ private static function open(int $key) { if (null !== $h = self::$openedFiles[$key] ?? null) { return $h; } set_error_handler(static fn () => null); try { $h = fopen(self::$files[$key], 'r+'); } finally { restore_error_handler(); } return self::$openedFiles[$key] = $h ?: @fopen(self::$files[$key], 'r'); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Marshaller/DefaultMarshaller.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Marshaller; use Symfony\Component\Cache\Exception\CacheException; /** * Serializes/unserializes values using igbinary_serialize() if available, serialize() otherwise. * * @author Nicolas Grekas */ class DefaultMarshaller implements MarshallerInterface { private bool $useIgbinarySerialize = true; private bool $throwOnSerializationFailure = false; public function __construct(?bool $useIgbinarySerialize = null, bool $throwOnSerializationFailure = false) { if (null === $useIgbinarySerialize) { $useIgbinarySerialize = \extension_loaded('igbinary') && version_compare('3.1.6', phpversion('igbinary'), '<='); } elseif ($useIgbinarySerialize && (!\extension_loaded('igbinary') || version_compare('3.1.6', phpversion('igbinary'), '>'))) { throw new CacheException(\extension_loaded('igbinary') ? 'Please upgrade the "igbinary" PHP extension to v3.1.6 or higher.' : 'The "igbinary" PHP extension is not loaded.'); } $this->useIgbinarySerialize = $useIgbinarySerialize; $this->throwOnSerializationFailure = $throwOnSerializationFailure; } public function marshall(array $values, ?array &$failed): array { $serialized = $failed = []; foreach ($values as $id => $value) { try { if ($this->useIgbinarySerialize) { $serialized[$id] = igbinary_serialize($value); } else { $serialized[$id] = serialize($value); } } catch (\Exception $e) { if ($this->throwOnSerializationFailure) { throw new \ValueError($e->getMessage(), 0, $e); } $failed[] = $id; } } return $serialized; } public function unmarshall(string $value): mixed { if ('b:0;' === $value) { return false; } if ('N;' === $value) { return null; } static $igbinaryNull; if ($value === $igbinaryNull ??= \extension_loaded('igbinary') ? igbinary_serialize(null) : false) { return null; } $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback'); try { if (':' === ($value[1] ?? ':')) { if (false !== $value = unserialize($value)) { return $value; } } elseif (false === $igbinaryNull) { throw new \RuntimeException('Failed to unserialize values, did you forget to install the "igbinary" extension?'); } elseif (null !== $value = igbinary_unserialize($value)) { return $value; } throw new \DomainException(error_get_last() ? error_get_last()['message'] : 'Failed to unserialize values.'); } catch (\Error $e) { throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); } finally { ini_set('unserialize_callback_func', $unserializeCallbackHandler); } } /** * @internal */ public static function handleUnserializeCallback(string $class): never { throw new \DomainException('Class not found: '.$class); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Marshaller/DeflateMarshaller.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Marshaller; use Symfony\Component\Cache\Exception\CacheException; /** * Compresses values using gzdeflate(). * * @author Nicolas Grekas */ class DeflateMarshaller implements MarshallerInterface { private MarshallerInterface $marshaller; public function __construct(MarshallerInterface $marshaller) { if (!\function_exists('gzdeflate')) { throw new CacheException('The "zlib" PHP extension is not loaded.'); } $this->marshaller = $marshaller; } public function marshall(array $values, ?array &$failed): array { return array_map('gzdeflate', $this->marshaller->marshall($values, $failed)); } public function unmarshall(string $value): mixed { if (false !== $inflatedValue = @gzinflate($value)) { $value = $inflatedValue; } return $this->marshaller->unmarshall($value); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Marshaller/MarshallerInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Marshaller; /** * Serializes/unserializes PHP values. * * Implementations of this interface MUST deal with errors carefully. They MUST * also deal with forward and backward compatibility at the storage format level. * * @author Nicolas Grekas */ interface MarshallerInterface { /** * Serializes a list of values. * * When serialization fails for a specific value, no exception should be * thrown. Instead, its key should be listed in $failed. */ public function marshall(array $values, ?array &$failed): array; /** * Unserializes a single value and throws an exception if anything goes wrong. * * @throws \Exception Whenever unserialization fails */ public function unmarshall(string $value): mixed; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Marshaller/SodiumMarshaller.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Marshaller; use Symfony\Component\Cache\Exception\CacheException; use Symfony\Component\Cache\Exception\InvalidArgumentException; /** * Encrypt/decrypt values using Libsodium. * * @author Ahmed TAILOULOUTE */ class SodiumMarshaller implements MarshallerInterface { private MarshallerInterface $marshaller; private array $decryptionKeys; /** * @param string[] $decryptionKeys The key at index "0" is required and is used to decrypt and encrypt values; * more rotating keys can be provided to decrypt values; * each key must be generated using sodium_crypto_box_keypair() */ public function __construct(array $decryptionKeys, ?MarshallerInterface $marshaller = null) { if (!self::isSupported()) { throw new CacheException('The "sodium" PHP extension is not loaded.'); } if (!isset($decryptionKeys[0])) { throw new InvalidArgumentException('At least one decryption key must be provided at index "0".'); } $this->marshaller = $marshaller ?? new DefaultMarshaller(); $this->decryptionKeys = $decryptionKeys; } public static function isSupported(): bool { return \function_exists('sodium_crypto_box_seal'); } public function marshall(array $values, ?array &$failed): array { $encryptionKey = sodium_crypto_box_publickey($this->decryptionKeys[0]); $encryptedValues = []; foreach ($this->marshaller->marshall($values, $failed) as $k => $v) { $encryptedValues[$k] = sodium_crypto_box_seal($v, $encryptionKey); } return $encryptedValues; } public function unmarshall(string $value): mixed { foreach ($this->decryptionKeys as $k) { if (false !== $decryptedValue = @sodium_crypto_box_seal_open($value, $k)) { $value = $decryptedValue; break; } } return $this->marshaller->unmarshall($value); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Marshaller; /** * A marshaller optimized for data structures generated by AbstractTagAwareAdapter. * * @author Nicolas Grekas */ class TagAwareMarshaller implements MarshallerInterface { private MarshallerInterface $marshaller; public function __construct(?MarshallerInterface $marshaller = null) { $this->marshaller = $marshaller ?? new DefaultMarshaller(); } public function marshall(array $values, ?array &$failed): array { $failed = $notSerialized = $serialized = []; foreach ($values as $id => $value) { if (\is_array($value) && \is_array($value['tags'] ?? null) && \array_key_exists('value', $value) && \count($value) === 2 + (\is_string($value['meta'] ?? null) && 8 === \strlen($value['meta']))) { // if the value is an array with keys "tags", "value" and "meta", use a compact serialization format // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F allow detecting this format quickly in unmarshall() $v = $this->marshaller->marshall($value, $f); if ($f) { $f = []; $failed[] = $id; } else { if ([] === $value['tags']) { $v['tags'] = ''; } $serialized[$id] = "\x9D".($value['meta'] ?? "\0\0\0\0\0\0\0\0").pack('N', \strlen($v['tags'])).$v['tags'].$v['value']; $serialized[$id][9] = "\x5F"; } } else { // other arbitrary values are serialized using the decorated marshaller below $notSerialized[$id] = $value; } } if ($notSerialized) { $serialized += $this->marshaller->marshall($notSerialized, $f); $failed = array_merge($failed, $f); } return $serialized; } public function unmarshall(string $value): mixed { // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F if (13 >= \strlen($value) || "\x9D" !== $value[0] || "\0" !== $value[5] || "\x5F" !== $value[9]) { return $this->marshaller->unmarshall($value); } // data consists of value, tags and metadata which we need to unpack $meta = substr($value, 1, 12); $meta[8] = "\0"; $tagLen = unpack('Nlen', $meta, 8)['len']; $meta = substr($meta, 0, 8); return [ 'value' => $this->marshaller->unmarshall(substr($value, 13 + $tagLen)), 'tags' => $tagLen ? $this->marshaller->unmarshall(substr($value, 13, $tagLen)) : [], 'meta' => "\0\0\0\0\0\0\0\0" === $meta ? null : $meta, ]; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Messenger; use Psr\Log\LoggerInterface; use Symfony\Component\Cache\Adapter\AdapterInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Component\DependencyInjection\ReverseContainer; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\Stamp\HandledStamp; /** * Sends the computation of cached values to a message bus. */ class EarlyExpirationDispatcher { private MessageBusInterface $bus; private ReverseContainer $reverseContainer; private ?\Closure $callbackWrapper; public function __construct(MessageBusInterface $bus, ReverseContainer $reverseContainer, ?callable $callbackWrapper = null) { $this->bus = $bus; $this->reverseContainer = $reverseContainer; $this->callbackWrapper = null === $callbackWrapper ? null : $callbackWrapper(...); } /** * @return mixed */ public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger = null) { if (!$item->isHit() || null === $message = EarlyExpirationMessage::create($this->reverseContainer, $callback, $item, $pool)) { // The item is stale or the callback cannot be reversed: we must compute the value now $logger?->info('Computing item "{key}" online: '.($item->isHit() ? 'callback cannot be reversed' : 'item is stale'), ['key' => $item->getKey()]); return null !== $this->callbackWrapper ? ($this->callbackWrapper)($callback, $item, $save, $pool, $setMetadata, $logger) : $callback($item, $save); } $envelope = $this->bus->dispatch($message); if ($logger) { if ($envelope->last(HandledStamp::class)) { $logger->info('Item "{key}" was computed online', ['key' => $item->getKey()]); } else { $logger->info('Item "{key}" sent for recomputation', ['key' => $item->getKey()]); } } // The item's value is not stale, no need to write it to the backend $save = false; return $message->getItem()->get() ?? $item->get(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Messenger; use Symfony\Component\Cache\CacheItem; use Symfony\Component\DependencyInjection\ReverseContainer; use Symfony\Component\Messenger\Attribute\AsMessageHandler; /** * Computes cached values sent to a message bus. */ #[AsMessageHandler] class EarlyExpirationHandler { private ReverseContainer $reverseContainer; private array $processedNonces = []; public function __construct(ReverseContainer $reverseContainer) { $this->reverseContainer = $reverseContainer; } /** * @return void */ public function __invoke(EarlyExpirationMessage $message) { $item = $message->getItem(); $metadata = $item->getMetadata(); $expiry = $metadata[CacheItem::METADATA_EXPIRY] ?? 0; $ctime = $metadata[CacheItem::METADATA_CTIME] ?? 0; if ($expiry && $ctime) { // skip duplicate or expired messages $processingNonce = [$expiry, $ctime]; $pool = $message->getPool(); $key = $item->getKey(); if (($this->processedNonces[$pool][$key] ?? null) === $processingNonce) { return; } if (microtime(true) >= $expiry) { return; } $this->processedNonces[$pool] = [$key => $processingNonce] + ($this->processedNonces[$pool] ?? []); if (\count($this->processedNonces[$pool]) > 100) { array_pop($this->processedNonces[$pool]); } } static $setMetadata; $setMetadata ??= \Closure::bind( function (CacheItem $item, float $startTime) { if ($item->expiry > $endTime = microtime(true)) { $item->newMetadata[CacheItem::METADATA_EXPIRY] = $item->expiry; $item->newMetadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime)); } }, null, CacheItem::class ); $startTime = microtime(true); $pool = $message->findPool($this->reverseContainer); $callback = $message->findCallback($this->reverseContainer); $save = true; $value = $callback($item, $save); $setMetadata($item, $startTime); $pool->save($item->set($value)); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Messenger; use Symfony\Component\Cache\Adapter\AdapterInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Component\DependencyInjection\ReverseContainer; /** * Conveys a cached value that needs to be computed. */ final class EarlyExpirationMessage { private CacheItem $item; private string $pool; private string|array $callback; public static function create(ReverseContainer $reverseContainer, callable $callback, CacheItem $item, AdapterInterface $pool): ?self { try { $item = clone $item; $item->set(null); } catch (\Exception) { return null; } $pool = $reverseContainer->getId($pool); if (\is_object($callback)) { if (null === $id = $reverseContainer->getId($callback)) { return null; } $callback = '@'.$id; } elseif (!\is_array($callback)) { $callback = (string) $callback; } elseif (!\is_object($callback[0])) { $callback = [(string) $callback[0], (string) $callback[1]]; } else { if (null === $id = $reverseContainer->getId($callback[0])) { return null; } $callback = ['@'.$id, (string) $callback[1]]; } return new self($item, $pool, $callback); } public function getItem(): CacheItem { return $this->item; } public function getPool(): string { return $this->pool; } /** * @return string|string[] */ public function getCallback(): string|array { return $this->callback; } public function findPool(ReverseContainer $reverseContainer): AdapterInterface { return $reverseContainer->getService($this->pool); } public function findCallback(ReverseContainer $reverseContainer): callable { if (\is_string($callback = $this->callback)) { return '@' === $callback[0] ? $reverseContainer->getService(substr($callback, 1)) : $callback; } if ('@' === $callback[0][0]) { $callback[0] = $reverseContainer->getService(substr($callback[0], 1)); } return $callback; } private function __construct(CacheItem $item, string $pool, string|array $callback) { $this->item = $item; $this->pool = $pool; $this->callback = $callback; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/PruneableInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache; /** * Interface extends psr-6 and psr-16 caches to allow for pruning (deletion) of all expired cache items. */ interface PruneableInterface { public function prune(): bool; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Psr16Cache.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache; use Psr\Cache\CacheException as Psr6CacheException; use Psr\Cache\CacheItemPoolInterface; use Psr\SimpleCache\CacheException as SimpleCacheException; use Psr\SimpleCache\CacheInterface; use Symfony\Component\Cache\Adapter\AdapterInterface; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Traits\ProxyTrait; /** * Turns a PSR-6 cache into a PSR-16 one. * * @author Nicolas Grekas */ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterface { use ProxyTrait; private ?\Closure $createCacheItem = null; private ?CacheItem $cacheItemPrototype = null; private static \Closure $packCacheItem; public function __construct(CacheItemPoolInterface $pool) { $this->pool = $pool; if (!$pool instanceof AdapterInterface) { return; } $cacheItemPrototype = &$this->cacheItemPrototype; $createCacheItem = \Closure::bind( static function ($key, $value, $allowInt = false) use (&$cacheItemPrototype) { $item = clone $cacheItemPrototype; $item->poolHash = $item->innerItem = null; if ($allowInt && \is_int($key)) { $item->key = (string) $key; } else { \assert('' !== CacheItem::validateKey($key)); $item->key = $key; } $item->value = $value; $item->isHit = false; return $item; }, null, CacheItem::class ); $this->createCacheItem = function ($key, $value, $allowInt = false) use ($createCacheItem) { if (null === $this->cacheItemPrototype) { $this->get($allowInt && \is_int($key) ? (string) $key : $key); } $this->createCacheItem = $createCacheItem; return $createCacheItem($key, null, $allowInt)->set($value); }; self::$packCacheItem ??= \Closure::bind( static function (CacheItem $item) { $item->newMetadata = $item->metadata; return $item->pack(); }, null, CacheItem::class ); } public function get($key, $default = null): mixed { try { $item = $this->pool->getItem($key); } catch (SimpleCacheException $e) { throw $e; } catch (Psr6CacheException $e) { throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); } if (null === $this->cacheItemPrototype) { $this->cacheItemPrototype = clone $item; $this->cacheItemPrototype->set(null); } return $item->isHit() ? $item->get() : $default; } public function set($key, $value, $ttl = null): bool { try { if (null !== $f = $this->createCacheItem) { $item = $f($key, $value); } else { $item = $this->pool->getItem($key)->set($value); } } catch (SimpleCacheException $e) { throw $e; } catch (Psr6CacheException $e) { throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); } if (null !== $ttl) { $item->expiresAfter($ttl); } return $this->pool->save($item); } public function delete($key): bool { try { return $this->pool->deleteItem($key); } catch (SimpleCacheException $e) { throw $e; } catch (Psr6CacheException $e) { throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); } } public function clear(): bool { return $this->pool->clear(); } public function getMultiple($keys, $default = null): iterable { if ($keys instanceof \Traversable) { $keys = iterator_to_array($keys, false); } elseif (!\is_array($keys)) { throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given.', get_debug_type($keys))); } try { $items = $this->pool->getItems($keys); } catch (SimpleCacheException $e) { throw $e; } catch (Psr6CacheException $e) { throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); } $values = []; if (!$this->pool instanceof AdapterInterface) { foreach ($items as $key => $item) { $values[$key] = $item->isHit() ? $item->get() : $default; } return $values; } foreach ($items as $key => $item) { $values[$key] = $item->isHit() ? (self::$packCacheItem)($item) : $default; } return $values; } public function setMultiple($values, $ttl = null): bool { $valuesIsArray = \is_array($values); if (!$valuesIsArray && !$values instanceof \Traversable) { throw new InvalidArgumentException(sprintf('Cache values must be array or Traversable, "%s" given.', get_debug_type($values))); } $items = []; try { if (null !== $f = $this->createCacheItem) { $valuesIsArray = false; foreach ($values as $key => $value) { $items[$key] = $f($key, $value, true); } } elseif ($valuesIsArray) { $items = []; foreach ($values as $key => $value) { $items[] = (string) $key; } $items = $this->pool->getItems($items); } else { foreach ($values as $key => $value) { if (\is_int($key)) { $key = (string) $key; } $items[$key] = $this->pool->getItem($key)->set($value); } } } catch (SimpleCacheException $e) { throw $e; } catch (Psr6CacheException $e) { throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); } $ok = true; foreach ($items as $key => $item) { if ($valuesIsArray) { $item->set($values[$key]); } if (null !== $ttl) { $item->expiresAfter($ttl); } $ok = $this->pool->saveDeferred($item) && $ok; } return $this->pool->commit() && $ok; } public function deleteMultiple($keys): bool { if ($keys instanceof \Traversable) { $keys = iterator_to_array($keys, false); } elseif (!\is_array($keys)) { throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given.', get_debug_type($keys))); } try { return $this->pool->deleteItems($keys); } catch (SimpleCacheException $e) { throw $e; } catch (Psr6CacheException $e) { throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); } } public function has($key): bool { try { return $this->pool->hasItem($key); } catch (SimpleCacheException $e) { throw $e; } catch (Psr6CacheException $e) { throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/README.md ================================================ Symfony PSR-6 implementation for caching ======================================== The Cache component provides extended [PSR-6](https://www.php-fig.org/psr/psr-6/) implementations for adding cache to your applications. It is designed to have a low overhead so that caching is fastest. It ships with adapters for the most widespread caching backends. It also provides a [PSR-16](https://www.php-fig.org/psr/psr-16/) adapter, and implementations for [symfony/cache-contracts](https://github.com/symfony/cache-contracts)' `CacheInterface` and `TagAwareCacheInterface`. Resources --------- * [Documentation](https://symfony.com/doc/current/components/cache.html) * [Contributing](https://symfony.com/doc/current/contributing/index.html) * [Report issues](https://github.com/symfony/symfony/issues) and [send Pull Requests](https://github.com/symfony/symfony/pulls) in the [main Symfony repository](https://github.com/symfony/symfony) ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/ResettableInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache; use Symfony\Contracts\Service\ResetInterface; /** * Resets a pool's local state. */ interface ResettableInterface extends ResetInterface { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/AbstractAdapterTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Psr\Cache\CacheItemInterface; use Psr\Log\LoggerAwareTrait; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\Exception\InvalidArgumentException; /** * @author Nicolas Grekas * * @internal */ trait AbstractAdapterTrait { use LoggerAwareTrait; /** * needs to be set by class, signature is function(string , mixed , bool ). */ private static \Closure $createCacheItem; /** * needs to be set by class, signature is function(array , string , array <&expiredIds>). */ private static \Closure $mergeByLifetime; private string $namespace = ''; private int $defaultLifetime; private string $namespaceVersion = ''; private bool $versioningIsEnabled = false; private array $deferred = []; private array $ids = []; /** * @var int|null The maximum length to enforce for identifiers or null when no limit applies */ protected $maxIdLength; /** * Fetches several cache items. * * @param array $ids The cache identifiers to fetch */ abstract protected function doFetch(array $ids): iterable; /** * Confirms if the cache contains specified cache item. * * @param string $id The identifier for which to check existence */ abstract protected function doHave(string $id): bool; /** * Deletes all items in the pool. * * @param string $namespace The prefix used for all identifiers managed by this pool */ abstract protected function doClear(string $namespace): bool; /** * Removes multiple items from the pool. * * @param array $ids An array of identifiers that should be removed from the pool */ abstract protected function doDelete(array $ids): bool; /** * Persists several cache items immediately. * * @param array $values The values to cache, indexed by their cache identifier * @param int $lifetime The lifetime of the cached values, 0 for persisting until manual cleaning * * @return array|bool The identifiers that failed to be cached or a boolean stating if caching succeeded or not */ abstract protected function doSave(array $values, int $lifetime): array|bool; public function hasItem(mixed $key): bool { $id = $this->getId($key); if (isset($this->deferred[$key])) { $this->commit(); } try { return $this->doHave($id); } catch (\Exception $e) { CacheItem::log($this->logger, 'Failed to check if key "{key}" is cached: '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); return false; } } public function clear(string $prefix = ''): bool { $this->deferred = []; if ($cleared = $this->versioningIsEnabled) { if ('' === $namespaceVersionToClear = $this->namespaceVersion) { foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) { $namespaceVersionToClear = $v; } } $namespaceToClear = $this->namespace.$namespaceVersionToClear; $namespaceVersion = self::formatNamespaceVersion(mt_rand()); try { $e = $this->doSave([static::NS_SEPARATOR.$this->namespace => $namespaceVersion], 0); } catch (\Exception $e) { } if (true !== $e && [] !== $e) { $cleared = false; $message = 'Failed to save the new namespace'.($e instanceof \Exception ? ': '.$e->getMessage() : '.'); CacheItem::log($this->logger, $message, ['exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); } else { $this->namespaceVersion = $namespaceVersion; $this->ids = []; } } else { $namespaceToClear = $this->namespace.$prefix; } try { return $this->doClear($namespaceToClear) || $cleared; } catch (\Exception $e) { CacheItem::log($this->logger, 'Failed to clear the cache: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]); return false; } } public function deleteItem(mixed $key): bool { return $this->deleteItems([$key]); } public function deleteItems(array $keys): bool { $ids = []; foreach ($keys as $key) { $ids[$key] = $this->getId($key); unset($this->deferred[$key]); } try { if ($this->doDelete($ids)) { return true; } } catch (\Exception) { } $ok = true; // When bulk-delete failed, retry each item individually foreach ($ids as $key => $id) { try { $e = null; if ($this->doDelete([$id])) { continue; } } catch (\Exception $e) { } $message = 'Failed to delete key "{key}"'.($e instanceof \Exception ? ': '.$e->getMessage() : '.'); CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); $ok = false; } return $ok; } public function getItem(mixed $key): CacheItem { $id = $this->getId($key); if (isset($this->deferred[$key])) { $this->commit(); } $isHit = false; $value = null; try { foreach ($this->doFetch([$id]) as $value) { $isHit = true; } return (self::$createCacheItem)($key, $value, $isHit); } catch (\Exception $e) { CacheItem::log($this->logger, 'Failed to fetch key "{key}": '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); } return (self::$createCacheItem)($key, null, false); } public function getItems(array $keys = []): iterable { $ids = []; $commit = false; foreach ($keys as $key) { $ids[] = $this->getId($key); $commit = $commit || isset($this->deferred[$key]); } if ($commit) { $this->commit(); } try { $items = $this->doFetch($ids); } catch (\Exception $e) { CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => $keys, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); $items = []; } $ids = array_combine($ids, $keys); return $this->generateItems($items, $ids); } public function save(CacheItemInterface $item): bool { if (!$item instanceof CacheItem) { return false; } $this->deferred[$item->getKey()] = $item; return $this->commit(); } public function saveDeferred(CacheItemInterface $item): bool { if (!$item instanceof CacheItem) { return false; } $this->deferred[$item->getKey()] = $item; return true; } /** * Enables/disables versioning of items. * * When versioning is enabled, clearing the cache is atomic and doesn't require listing existing keys to proceed, * but old keys may need garbage collection and extra round-trips to the back-end are required. * * Calling this method also clears the memoized namespace version and thus forces a resynchronization of it. * * @return bool the previous state of versioning */ public function enableVersioning(bool $enable = true): bool { $wasEnabled = $this->versioningIsEnabled; $this->versioningIsEnabled = $enable; $this->namespaceVersion = ''; $this->ids = []; return $wasEnabled; } public function reset(): void { if ($this->deferred) { $this->commit(); } $this->namespaceVersion = ''; $this->ids = []; } public function __sleep(): array { throw new \BadMethodCallException('Cannot serialize '.__CLASS__); } /** * @return void */ public function __wakeup() { throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); } public function __destruct() { if ($this->deferred) { $this->commit(); } } private function generateItems(iterable $items, array &$keys): \Generator { $f = self::$createCacheItem; try { foreach ($items as $id => $value) { if (!isset($keys[$id])) { throw new InvalidArgumentException(sprintf('Could not match value id "%s" to keys "%s".', $id, implode('", "', $keys))); } $key = $keys[$id]; unset($keys[$id]); yield $key => $f($key, $value, true); } } catch (\Exception $e) { CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => array_values($keys), 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); } foreach ($keys as $key) { yield $key => $f($key, null, false); } } /** * @internal */ protected function getId(mixed $key): string { if ($this->versioningIsEnabled && '' === $this->namespaceVersion) { $this->ids = []; $this->namespaceVersion = '1'.static::NS_SEPARATOR; try { foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) { $this->namespaceVersion = $v; } $e = true; if ('1'.static::NS_SEPARATOR === $this->namespaceVersion) { $this->namespaceVersion = self::formatNamespaceVersion(time()); $e = $this->doSave([static::NS_SEPARATOR.$this->namespace => $this->namespaceVersion], 0); } } catch (\Exception $e) { } if (true !== $e && [] !== $e) { $message = 'Failed to save the new namespace'.($e instanceof \Exception ? ': '.$e->getMessage() : '.'); CacheItem::log($this->logger, $message, ['exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); } } if (\is_string($key) && isset($this->ids[$key])) { return $this->namespace.$this->namespaceVersion.$this->ids[$key]; } \assert('' !== CacheItem::validateKey($key)); $this->ids[$key] = $key; if (\count($this->ids) > 1000) { $this->ids = \array_slice($this->ids, 500, null, true); // stop memory leak if there are many keys } if (null === $this->maxIdLength) { return $this->namespace.$this->namespaceVersion.$key; } if (\strlen($id = $this->namespace.$this->namespaceVersion.$key) > $this->maxIdLength) { // Use xxh128 to favor speed over security, which is not an issue here $this->ids[$key] = $id = substr_replace(base64_encode(hash('xxh128', $key, true)), static::NS_SEPARATOR, -(\strlen($this->namespaceVersion) + 2)); $id = $this->namespace.$this->namespaceVersion.$id; } return $id; } /** * @internal */ public static function handleUnserializeCallback(string $class): never { throw new \DomainException('Class not found: '.$class); } private static function formatNamespaceVersion(int $value): string { return strtr(substr_replace(base64_encode(pack('V', $value)), static::NS_SEPARATOR, 5), '/', '_'); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/ContractsTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Psr\Log\LoggerInterface; use Symfony\Component\Cache\Adapter\AdapterInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\LockRegistry; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Contracts\Cache\CacheTrait; use Symfony\Contracts\Cache\ItemInterface; /** * @author Nicolas Grekas * * @internal */ trait ContractsTrait { use CacheTrait { doGet as private contractsGet; } private \Closure $callbackWrapper; private array $computing = []; /** * Wraps the callback passed to ->get() in a callable. * * @return callable the previous callback wrapper */ public function setCallbackWrapper(?callable $callbackWrapper): callable { if (!isset($this->callbackWrapper)) { $this->callbackWrapper = LockRegistry::compute(...); if (\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { $this->setCallbackWrapper(null); } } if (null !== $callbackWrapper && !$callbackWrapper instanceof \Closure) { $callbackWrapper = $callbackWrapper(...); } $previousWrapper = $this->callbackWrapper; $this->callbackWrapper = $callbackWrapper ?? static fn (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger) => $callback($item, $save); return $previousWrapper; } private function doGet(AdapterInterface $pool, string $key, callable $callback, ?float $beta, ?array &$metadata = null): mixed { if (0 > $beta ??= 1.0) { throw new InvalidArgumentException(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)); } static $setMetadata; $setMetadata ??= \Closure::bind( static function (CacheItem $item, float $startTime, ?array &$metadata) { if ($item->expiry > $endTime = microtime(true)) { $item->newMetadata[CacheItem::METADATA_EXPIRY] = $metadata[CacheItem::METADATA_EXPIRY] = $item->expiry; $item->newMetadata[CacheItem::METADATA_CTIME] = $metadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime)); } else { unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::METADATA_CTIME], $metadata[CacheItem::METADATA_TAGS]); } }, null, CacheItem::class ); $this->callbackWrapper ??= LockRegistry::compute(...); return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata, &$metadata, $key) { // don't wrap nor save recursive calls if (isset($this->computing[$key])) { $value = $callback($item, $save); $save = false; return $value; } $this->computing[$key] = $key; $startTime = microtime(true); if (!isset($this->callbackWrapper)) { $this->setCallbackWrapper($this->setCallbackWrapper(null)); } try { $value = ($this->callbackWrapper)($callback, $item, $save, $pool, function (CacheItem $item) use ($setMetadata, $startTime, &$metadata) { $setMetadata($item, $startTime, $metadata); }, $this->logger ?? null); $setMetadata($item, $startTime, $metadata); return $value; } finally { unset($this->computing[$key]); } }, $beta, $metadata, $this->logger ?? null); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/FilesystemCommonTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Symfony\Component\Cache\Exception\InvalidArgumentException; /** * @author Nicolas Grekas * * @internal */ trait FilesystemCommonTrait { private string $directory; private string $tmpSuffix; private function init(string $namespace, ?string $directory): void { if (!isset($directory[0])) { $directory = sys_get_temp_dir().\DIRECTORY_SEPARATOR.'symfony-cache'; } else { $directory = realpath($directory) ?: $directory; } if (isset($namespace[0])) { if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) { throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0])); } $directory .= \DIRECTORY_SEPARATOR.$namespace; } else { $directory .= \DIRECTORY_SEPARATOR.'@'; } if (!is_dir($directory)) { @mkdir($directory, 0777, true); } $directory .= \DIRECTORY_SEPARATOR; // On Windows the whole path is limited to 258 chars if ('\\' === \DIRECTORY_SEPARATOR && \strlen($directory) > 234) { throw new InvalidArgumentException(sprintf('Cache directory too long (%s).', $directory)); } $this->directory = $directory; } protected function doClear(string $namespace): bool { $ok = true; foreach ($this->scanHashDir($this->directory) as $file) { if ('' !== $namespace && !str_starts_with($this->getFileKey($file), $namespace)) { continue; } $ok = ($this->doUnlink($file) || !file_exists($file)) && $ok; } return $ok; } protected function doDelete(array $ids): bool { $ok = true; foreach ($ids as $id) { $file = $this->getFile($id); $ok = (!is_file($file) || $this->doUnlink($file) || !file_exists($file)) && $ok; } return $ok; } /** * @return bool */ protected function doUnlink(string $file) { return @unlink($file); } private function write(string $file, string $data, ?int $expiresAt = null): bool { $unlink = false; set_error_handler(static fn ($type, $message, $file, $line) => throw new \ErrorException($message, 0, $type, $file, $line)); try { $tmp = $this->directory.$this->tmpSuffix ??= str_replace('/', '-', base64_encode(random_bytes(6))); try { $h = fopen($tmp, 'x'); } catch (\ErrorException $e) { if (!str_contains($e->getMessage(), 'File exists')) { throw $e; } $tmp = $this->directory.$this->tmpSuffix = str_replace('/', '-', base64_encode(random_bytes(6))); $h = fopen($tmp, 'x'); } fwrite($h, $data); fclose($h); $unlink = true; if (null !== $expiresAt) { touch($tmp, $expiresAt ?: time() + 31556952); // 1 year in seconds } $success = rename($tmp, $file); $unlink = !$success; return $success; } finally { restore_error_handler(); if ($unlink) { @unlink($tmp); } } } private function getFile(string $id, bool $mkdir = false, ?string $directory = null): string { // Use xxh128 to favor speed over security, which is not an issue here $hash = str_replace('/', '-', base64_encode(hash('xxh128', static::class.$id, true))); $dir = ($directory ?? $this->directory).strtoupper($hash[0].\DIRECTORY_SEPARATOR.$hash[1].\DIRECTORY_SEPARATOR); if ($mkdir && !is_dir($dir)) { @mkdir($dir, 0777, true); } return $dir.substr($hash, 2, 20); } private function getFileKey(string $file): string { return ''; } private function scanHashDir(string $directory): \Generator { if (!is_dir($directory)) { return; } $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; for ($i = 0; $i < 38; ++$i) { if (!is_dir($directory.$chars[$i])) { continue; } for ($j = 0; $j < 38; ++$j) { if (!is_dir($dir = $directory.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) { continue; } foreach (@scandir($dir, \SCANDIR_SORT_NONE) ?: [] as $file) { if ('.' !== $file && '..' !== $file) { yield $dir.\DIRECTORY_SEPARATOR.$file; } } } } } public function __sleep(): array { throw new \BadMethodCallException('Cannot serialize '.__CLASS__); } /** * @return void */ public function __wakeup() { throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); } public function __destruct() { if (method_exists(parent::class, '__destruct')) { parent::__destruct(); } if (isset($this->tmpSuffix) && is_file($this->directory.$this->tmpSuffix)) { unlink($this->directory.$this->tmpSuffix); } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/FilesystemTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Symfony\Component\Cache\Exception\CacheException; use Symfony\Component\Cache\Marshaller\MarshallerInterface; /** * @author Nicolas Grekas * @author Rob Frawley 2nd * * @internal */ trait FilesystemTrait { use FilesystemCommonTrait; private MarshallerInterface $marshaller; public function prune(): bool { $time = time(); $pruned = true; foreach ($this->scanHashDir($this->directory) as $file) { if (!$h = @fopen($file, 'r')) { continue; } if (($expiresAt = (int) fgets($h)) && $time >= $expiresAt) { fclose($h); $pruned = (@unlink($file) || !file_exists($file)) && $pruned; } else { fclose($h); } } return $pruned; } protected function doFetch(array $ids): iterable { $values = []; $now = time(); foreach ($ids as $id) { $file = $this->getFile($id); if (!is_file($file) || !$h = @fopen($file, 'r')) { continue; } if (($expiresAt = (int) fgets($h)) && $now >= $expiresAt) { fclose($h); @unlink($file); } else { $i = rawurldecode(rtrim(fgets($h))); $value = stream_get_contents($h); fclose($h); if ($i === $id) { $values[$id] = $this->marshaller->unmarshall($value); } } } return $values; } protected function doHave(string $id): bool { $file = $this->getFile($id); return is_file($file) && (@filemtime($file) > time() || $this->doFetch([$id])); } protected function doSave(array $values, int $lifetime): array|bool { $expiresAt = $lifetime ? (time() + $lifetime) : 0; $values = $this->marshaller->marshall($values, $failed); foreach ($values as $id => $value) { if (!$this->write($this->getFile($id, true), $expiresAt."\n".rawurlencode($id)."\n".$value, $expiresAt)) { $failed[] = $id; } } if ($failed && !is_writable($this->directory)) { throw new CacheException(sprintf('Cache directory is not writable (%s).', $this->directory)); } return $failed; } private function getFileKey(string $file): string { if (!$h = @fopen($file, 'r')) { return ''; } fgets($h); // expiry $encodedKey = fgets($h); fclose($h); return rawurldecode(rtrim($encodedKey)); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/ProxyTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Symfony\Component\Cache\PruneableInterface; use Symfony\Contracts\Service\ResetInterface; /** * @author Nicolas Grekas * * @internal */ trait ProxyTrait { private object $pool; public function prune(): bool { return $this->pool instanceof PruneableInterface && $this->pool->prune(); } public function reset(): void { if ($this->pool instanceof ResetInterface) { $this->pool->reset(); } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/Redis5Proxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Symfony\Component\VarExporter\LazyObjectInterface; use Symfony\Component\VarExporter\LazyProxyTrait; use Symfony\Contracts\Service\ResetInterface; // Help opcache.preload discover always-needed symbols class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class); /** * @internal */ class Redis5Proxy extends \Redis implements ResetInterface, LazyObjectInterface { use LazyProxyTrait { resetLazyObject as reset; } private const LAZY_OBJECT_PROPERTY_SCOPES = []; public function __construct() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args()); } public function _prefix($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\func_get_args()); } public function _serialize($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\func_get_args()); } public function _unserialize($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\func_get_args()); } public function _pack($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\func_get_args()); } public function _unpack($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\func_get_args()); } public function _compress($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\func_get_args()); } public function _uncompress($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\func_get_args()); } public function acl($subcmd, ...$args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\func_get_args()); } public function append($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args()); } public function auth(#[\SensitiveParameter] $auth) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\func_get_args()); } public function bgSave() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgSave(...\func_get_args()); } public function bgrewriteaof() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args()); } public function bitcount($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args()); } public function bitop($operation, $ret_key, $key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\func_get_args()); } public function bitpos($key, $bit, $start = null, $end = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\func_get_args()); } public function blPop($key, $timeout_or_key, ...$extra_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blPop(...\func_get_args()); } public function brPop($key, $timeout_or_key, ...$extra_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brPop(...\func_get_args()); } public function brpoplpush($src, $dst, $timeout) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\func_get_args()); } public function bzPopMax($key, $timeout_or_key, ...$extra_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMax(...\func_get_args()); } public function bzPopMin($key, $timeout_or_key, ...$extra_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMin(...\func_get_args()); } public function clearLastError() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearLastError(...\func_get_args()); } public function client($cmd, ...$args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\func_get_args()); } public function close() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\func_get_args()); } public function command(...$args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\func_get_args()); } public function config($cmd, $key, $value = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\func_get_args()); } public function connect($host, $port = null, $timeout = null, $retry_interval = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->connect(...\func_get_args()); } public function dbSize() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbSize(...\func_get_args()); } public function debug($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->debug(...\func_get_args()); } public function decr($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\func_get_args()); } public function decrBy($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrBy(...\func_get_args()); } public function del($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\func_get_args()); } public function discard() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\func_get_args()); } public function dump($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args()); } public function echo($msg) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\func_get_args()); } public function eval($script, $args = null, $num_keys = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\func_get_args()); } public function evalsha($script_sha, $args = null, $num_keys = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\func_get_args()); } public function exec() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\func_get_args()); } public function exists($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\func_get_args()); } public function expire($key, $timeout) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\func_get_args()); } public function expireAt($key, $timestamp) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireAt(...\func_get_args()); } public function flushAll($async = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushAll(...\func_get_args()); } public function flushDB($async = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushDB(...\func_get_args()); } public function geoadd($key, $lng, $lat, $member, ...$other_triples) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args()); } public function geodist($key, $src, $dst, $unit = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args()); } public function geohash($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args()); } public function geopos($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\func_get_args()); } public function georadius($key, $lng, $lan, $radius, $unit, $opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\func_get_args()); } public function georadius_ro($key, $lng, $lan, $radius, $unit, $opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args()); } public function georadiusbymember($key, $member, $radius, $unit, $opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\func_get_args()); } public function georadiusbymember_ro($key, $member, $radius, $unit, $opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\func_get_args()); } public function get($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\func_get_args()); } public function getAuth() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getAuth(...\func_get_args()); } public function getBit($key, $offset) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getBit(...\func_get_args()); } public function getDBNum() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDBNum(...\func_get_args()); } public function getHost() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getHost(...\func_get_args()); } public function getLastError() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getLastError(...\func_get_args()); } public function getMode() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMode(...\func_get_args()); } public function getOption($option) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getOption(...\func_get_args()); } public function getPersistentID() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPersistentID(...\func_get_args()); } public function getPort() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPort(...\func_get_args()); } public function getRange($key, $start, $end) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getRange(...\func_get_args()); } public function getReadTimeout() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getReadTimeout(...\func_get_args()); } public function getSet($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getSet(...\func_get_args()); } public function getTimeout() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTimeout(...\func_get_args()); } public function hDel($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hDel(...\func_get_args()); } public function hExists($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hExists(...\func_get_args()); } public function hGet($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGet(...\func_get_args()); } public function hGetAll($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGetAll(...\func_get_args()); } public function hIncrBy($key, $member, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrBy(...\func_get_args()); } public function hIncrByFloat($key, $member, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrByFloat(...\func_get_args()); } public function hKeys($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hKeys(...\func_get_args()); } public function hLen($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hLen(...\func_get_args()); } public function hMget($key, $keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMget(...\func_get_args()); } public function hMset($key, $pairs) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMset(...\func_get_args()); } public function hSet($key, $member, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSet(...\func_get_args()); } public function hSetNx($key, $member, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSetNx(...\func_get_args()); } public function hStrLen($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hStrLen(...\func_get_args()); } public function hVals($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hVals(...\func_get_args()); } public function hscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2)); } public function incr($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\func_get_args()); } public function incrBy($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrBy(...\func_get_args()); } public function incrByFloat($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrByFloat(...\func_get_args()); } public function info($option = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\func_get_args()); } public function isConnected() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->isConnected(...\func_get_args()); } public function keys($pattern) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\func_get_args()); } public function lInsert($key, $position, $pivot, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lInsert(...\func_get_args()); } public function lLen($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lLen(...\func_get_args()); } public function lPop($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPop(...\func_get_args()); } public function lPush($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPush(...\func_get_args()); } public function lPushx($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPushx(...\func_get_args()); } public function lSet($key, $index, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lSet(...\func_get_args()); } public function lastSave() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastSave(...\func_get_args()); } public function lindex($key, $index) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\func_get_args()); } public function lrange($key, $start, $end) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args()); } public function lrem($key, $value, $count) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\func_get_args()); } public function ltrim($key, $start, $stop) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\func_get_args()); } public function mget($keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args()); } public function migrate($host, $port, $key, $db, $timeout, $copy = null, $replace = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->migrate(...\func_get_args()); } public function move($key, $dbindex) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->move(...\func_get_args()); } public function mset($pairs) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\func_get_args()); } public function msetnx($pairs) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\func_get_args()); } public function multi($mode = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\func_get_args()); } public function object($field, $key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\func_get_args()); } public function pconnect($host, $port = null, $timeout = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pconnect(...\func_get_args()); } public function persist($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\func_get_args()); } public function pexpire($key, $timestamp) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\func_get_args()); } public function pexpireAt($key, $timestamp) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireAt(...\func_get_args()); } public function pfadd($key, $elements) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args()); } public function pfcount($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args()); } public function pfmerge($dstkey, $keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args()); } public function ping() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\func_get_args()); } public function pipeline() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pipeline(...\func_get_args()); } public function psetex($key, $expire, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\func_get_args()); } public function psubscribe($patterns, $callback) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\func_get_args()); } public function pttl($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\func_get_args()); } public function publish($channel, $message) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args()); } public function pubsub($cmd, ...$args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\func_get_args()); } public function punsubscribe($pattern, ...$other_patterns) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\func_get_args()); } public function rPop($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPop(...\func_get_args()); } public function rPush($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPush(...\func_get_args()); } public function rPushx($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPushx(...\func_get_args()); } public function randomKey() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomKey(...\func_get_args()); } public function rawcommand($cmd, ...$args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\func_get_args()); } public function rename($key, $newkey) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\func_get_args()); } public function renameNx($key, $newkey) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renameNx(...\func_get_args()); } public function restore($ttl, $key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\func_get_args()); } public function role() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\func_get_args()); } public function rpoplpush($src, $dst) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\func_get_args()); } public function sAdd($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAdd(...\func_get_args()); } public function sAddArray($key, $options) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAddArray(...\func_get_args()); } public function sDiff($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiff(...\func_get_args()); } public function sDiffStore($dst, $key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiffStore(...\func_get_args()); } public function sInter($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInter(...\func_get_args()); } public function sInterStore($dst, $key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInterStore(...\func_get_args()); } public function sMembers($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMembers(...\func_get_args()); } public function sMisMember($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMisMember(...\func_get_args()); } public function sMove($src, $dst, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMove(...\func_get_args()); } public function sPop($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sPop(...\func_get_args()); } public function sRandMember($key, $count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sRandMember(...\func_get_args()); } public function sUnion($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnion(...\func_get_args()); } public function sUnionStore($dst, $key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnionStore(...\func_get_args()); } public function save() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\func_get_args()); } public function scan(&$i_iterator, $str_pattern = null, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($i_iterator, ...\array_slice(\func_get_args(), 1)); } public function scard($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\func_get_args()); } public function script($cmd, ...$args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\func_get_args()); } public function select($dbindex) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->select(...\func_get_args()); } public function set($key, $value, $opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\func_get_args()); } public function setBit($key, $offset, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setBit(...\func_get_args()); } public function setOption($option, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setOption(...\func_get_args()); } public function setRange($key, $offset, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setRange(...\func_get_args()); } public function setex($key, $expire, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\func_get_args()); } public function setnx($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\func_get_args()); } public function sismember($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\func_get_args()); } public function slaveof($host = null, $port = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slaveof(...\func_get_args()); } public function slowlog($arg, $option = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\func_get_args()); } public function sort($key, $options = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\func_get_args()); } public function sortAsc($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAsc(...\func_get_args()); } public function sortAscAlpha($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAscAlpha(...\func_get_args()); } public function sortDesc($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDesc(...\func_get_args()); } public function sortDescAlpha($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDescAlpha(...\func_get_args()); } public function srem($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\func_get_args()); } public function sscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2)); } public function strlen($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\func_get_args()); } public function subscribe($channels, $callback) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\func_get_args()); } public function swapdb($srcdb, $dstdb) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->swapdb(...\func_get_args()); } public function time() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\func_get_args()); } public function ttl($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\func_get_args()); } public function type($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args()); } public function unlink($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\func_get_args()); } public function unsubscribe($channel, ...$other_channels) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\func_get_args()); } public function unwatch() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\func_get_args()); } public function wait($numslaves, $timeout) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->wait(...\func_get_args()); } public function watch($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args()); } public function xack($str_key, $str_group, $arr_ids) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args()); } public function xadd($str_key, $str_id, $arr_fields, $i_maxlen = null, $boo_approximate = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args()); } public function xclaim($str_key, $str_group, $str_consumer, $i_min_idle, $arr_ids, $arr_opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args()); } public function xdel($str_key, $arr_ids) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\func_get_args()); } public function xgroup($str_operation, $str_key = null, $str_arg1 = null, $str_arg2 = null, $str_arg3 = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\func_get_args()); } public function xinfo($str_cmd, $str_key = null, $str_group = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\func_get_args()); } public function xlen($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\func_get_args()); } public function xpending($str_key, $str_group, $str_start = null, $str_end = null, $i_count = null, $str_consumer = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\func_get_args()); } public function xrange($str_key, $str_start, $str_end, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\func_get_args()); } public function xread($arr_streams, $i_count = null, $i_block = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\func_get_args()); } public function xreadgroup($str_group, $str_consumer, $arr_streams, $i_count = null, $i_block = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\func_get_args()); } public function xrevrange($str_key, $str_start, $str_end, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\func_get_args()); } public function xtrim($str_key, $i_maxlen, $boo_approximate = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\func_get_args()); } public function zAdd($key, $score, $value, ...$extra_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zAdd(...\func_get_args()); } public function zCard($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCard(...\func_get_args()); } public function zCount($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCount(...\func_get_args()); } public function zIncrBy($key, $value, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zIncrBy(...\func_get_args()); } public function zLexCount($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zLexCount(...\func_get_args()); } public function zPopMax($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMax(...\func_get_args()); } public function zPopMin($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMin(...\func_get_args()); } public function zRange($key, $start, $end, $scores = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRange(...\func_get_args()); } public function zRangeByLex($key, $min, $max, $offset = null, $limit = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByLex(...\func_get_args()); } public function zRangeByScore($key, $start, $end, $options = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByScore(...\func_get_args()); } public function zRank($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRank(...\func_get_args()); } public function zRem($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRem(...\func_get_args()); } public function zRemRangeByLex($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByLex(...\func_get_args()); } public function zRemRangeByRank($key, $start, $end) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByRank(...\func_get_args()); } public function zRemRangeByScore($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByScore(...\func_get_args()); } public function zRevRange($key, $start, $end, $scores = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRange(...\func_get_args()); } public function zRevRangeByLex($key, $min, $max, $offset = null, $limit = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByLex(...\func_get_args()); } public function zRevRangeByScore($key, $start, $end, $options = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByScore(...\func_get_args()); } public function zRevRank($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRank(...\func_get_args()); } public function zScore($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zScore(...\func_get_args()); } public function zinterstore($key, $keys, $weights = null, $aggregate = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\func_get_args()); } public function zscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2)); } public function zunionstore($key, $keys, $weights = null, $aggregate = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\func_get_args()); } public function delete($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->delete(...\func_get_args()); } public function evaluate($script, $args = null, $num_keys = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evaluate(...\func_get_args()); } public function evaluateSha($script_sha, $args = null, $num_keys = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evaluateSha(...\func_get_args()); } public function getKeys($pattern) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getKeys(...\func_get_args()); } public function getMultiple($keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMultiple(...\func_get_args()); } public function lGet($key, $index) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lGet(...\func_get_args()); } public function lGetRange($key, $start, $end) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lGetRange(...\func_get_args()); } public function lRemove($key, $value, $count) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lRemove(...\func_get_args()); } public function lSize($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lSize(...\func_get_args()); } public function listTrim($key, $start, $stop) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->listTrim(...\func_get_args()); } public function open($host, $port = null, $timeout = null, $retry_interval = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->open(...\func_get_args()); } public function popen($host, $port = null, $timeout = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->popen(...\func_get_args()); } public function renameKey($key, $newkey) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renameKey(...\func_get_args()); } public function sContains($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sContains(...\func_get_args()); } public function sGetMembers($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sGetMembers(...\func_get_args()); } public function sRemove($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sRemove(...\func_get_args()); } public function sSize($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sSize(...\func_get_args()); } public function sendEcho($msg) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sendEcho(...\func_get_args()); } public function setTimeout($key, $timeout) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setTimeout(...\func_get_args()); } public function substr($key, $start, $end) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->substr(...\func_get_args()); } public function zDelete($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zDelete(...\func_get_args()); } public function zDeleteRangeByRank($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zDeleteRangeByRank(...\func_get_args()); } public function zDeleteRangeByScore($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zDeleteRangeByScore(...\func_get_args()); } public function zInter($key, $keys, $weights = null, $aggregate = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zInter(...\func_get_args()); } public function zRemove($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemove(...\func_get_args()); } public function zRemoveRangeByScore($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemoveRangeByScore(...\func_get_args()); } public function zReverseRange($key, $start, $end, $scores = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zReverseRange(...\func_get_args()); } public function zSize($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zSize(...\func_get_args()); } public function zUnion($key, $keys, $weights = null, $aggregate = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zUnion(...\func_get_args()); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/Redis6Proxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Symfony\Component\VarExporter\LazyObjectInterface; use Symfony\Component\VarExporter\LazyProxyTrait; use Symfony\Contracts\Service\ResetInterface; // Help opcache.preload discover always-needed symbols class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class); /** * @internal */ class Redis6Proxy extends \Redis implements ResetInterface, LazyObjectInterface { use LazyProxyTrait { resetLazyObject as reset; } private const LAZY_OBJECT_PROPERTY_SCOPES = []; public function __construct($options = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args()); } public function _compress($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\func_get_args()); } public function _uncompress($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\func_get_args()); } public function _prefix($key): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\func_get_args()); } public function _serialize($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\func_get_args()); } public function _unserialize($value): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\func_get_args()); } public function _pack($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\func_get_args()); } public function _unpack($value): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\func_get_args()); } public function acl($subcmd, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\func_get_args()); } public function append($key, $value): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args()); } public function auth(#[\SensitiveParameter] $credentials): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\func_get_args()); } public function bgSave(): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgSave(...\func_get_args()); } public function bgrewriteaof(): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args()); } public function bitcount($key, $start = 0, $end = -1, $bybit = false): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args()); } public function bitop($operation, $deskey, $srckey, ...$other_keys): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\func_get_args()); } public function bitpos($key, $bit, $start = 0, $end = -1, $bybit = false): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\func_get_args()); } public function blPop($key_or_keys, $timeout_or_key, ...$extra_args): \Redis|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blPop(...\func_get_args()); } public function brPop($key_or_keys, $timeout_or_key, ...$extra_args): \Redis|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brPop(...\func_get_args()); } public function brpoplpush($src, $dst, $timeout): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\func_get_args()); } public function bzPopMax($key, $timeout_or_key, ...$extra_args): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMax(...\func_get_args()); } public function bzPopMin($key, $timeout_or_key, ...$extra_args): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMin(...\func_get_args()); } public function bzmpop($timeout, $keys, $from, $count = 1): \Redis|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzmpop(...\func_get_args()); } public function zmpop($keys, $from, $count = 1): \Redis|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmpop(...\func_get_args()); } public function blmpop($timeout, $keys, $from, $count = 1): \Redis|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmpop(...\func_get_args()); } public function lmpop($keys, $from, $count = 1): \Redis|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmpop(...\func_get_args()); } public function clearLastError(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearLastError(...\func_get_args()); } public function client($opt, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\func_get_args()); } public function close(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\func_get_args()); } public function command($opt = null, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\func_get_args()); } public function config($operation, $key_or_settings = null, $value = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\func_get_args()); } public function connect($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->connect(...\func_get_args()); } public function copy($src, $dst, $options = null): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args()); } public function dbSize(): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbSize(...\func_get_args()); } public function debug($key): \Redis|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->debug(...\func_get_args()); } public function decr($key, $by = 1): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\func_get_args()); } public function decrBy($key, $value): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrBy(...\func_get_args()); } public function del($key, ...$other_keys): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\func_get_args()); } public function delete($key, ...$other_keys): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->delete(...\func_get_args()); } public function discard(): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\func_get_args()); } public function dump($key): \Redis|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args()); } public function echo($str): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\func_get_args()); } public function eval($script, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\func_get_args()); } public function eval_ro($script_sha, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval_ro(...\func_get_args()); } public function evalsha($sha1, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\func_get_args()); } public function evalsha_ro($sha1, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha_ro(...\func_get_args()); } public function exec(): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\func_get_args()); } public function exists($key, ...$other_keys): \Redis|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\func_get_args()); } public function expire($key, $timeout, $mode = null): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\func_get_args()); } public function expireAt($key, $timestamp, $mode = null): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireAt(...\func_get_args()); } public function failover($to = null, $abort = false, $timeout = 0): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->failover(...\func_get_args()); } public function expiretime($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expiretime(...\func_get_args()); } public function pexpiretime($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpiretime(...\func_get_args()); } public function fcall($fn, $keys = [], $args = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall(...\func_get_args()); } public function fcall_ro($fn, $keys = [], $args = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall_ro(...\func_get_args()); } public function flushAll($sync = null): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushAll(...\func_get_args()); } public function flushDB($sync = null): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushDB(...\func_get_args()); } public function function($operation, ...$args): \Redis|array|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->function(...\func_get_args()); } public function geoadd($key, $lng, $lat, $member, ...$other_triples_and_options): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args()); } public function geodist($key, $src, $dst, $unit = null): \Redis|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args()); } public function geohash($key, $member, ...$other_members): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args()); } public function geopos($key, $member, ...$other_members): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\func_get_args()); } public function georadius($key, $lng, $lat, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\func_get_args()); } public function georadius_ro($key, $lng, $lat, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args()); } public function georadiusbymember($key, $member, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\func_get_args()); } public function georadiusbymember_ro($key, $member, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\func_get_args()); } public function geosearch($key, $position, $shape, $unit, $options = []): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\func_get_args()); } public function geosearchstore($dst, $src, $position, $shape, $unit, $options = []): \Redis|array|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearchstore(...\func_get_args()); } public function get($key): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\func_get_args()); } public function getAuth(): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getAuth(...\func_get_args()); } public function getBit($key, $idx): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getBit(...\func_get_args()); } public function getEx($key, $options = []): \Redis|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getEx(...\func_get_args()); } public function getDBNum(): int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDBNum(...\func_get_args()); } public function getDel($key): \Redis|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDel(...\func_get_args()); } public function getHost(): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getHost(...\func_get_args()); } public function getLastError(): ?string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getLastError(...\func_get_args()); } public function getMode(): int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMode(...\func_get_args()); } public function getOption($option): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getOption(...\func_get_args()); } public function getPersistentID(): ?string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPersistentID(...\func_get_args()); } public function getPort(): int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPort(...\func_get_args()); } public function getRange($key, $start, $end): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getRange(...\func_get_args()); } public function lcs($key1, $key2, $options = null): \Redis|array|false|int|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lcs(...\func_get_args()); } public function getReadTimeout(): float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getReadTimeout(...\func_get_args()); } public function getset($key, $value): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\func_get_args()); } public function getTimeout(): false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTimeout(...\func_get_args()); } public function getTransferredBytes(): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTransferredBytes(...\func_get_args()); } public function clearTransferredBytes(): void { ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearTransferredBytes(...\func_get_args()); } public function hDel($key, $field, ...$other_fields): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hDel(...\func_get_args()); } public function hExists($key, $field): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hExists(...\func_get_args()); } public function hGet($key, $member): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGet(...\func_get_args()); } public function hGetAll($key): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGetAll(...\func_get_args()); } public function hIncrBy($key, $field, $value): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrBy(...\func_get_args()); } public function hIncrByFloat($key, $field, $value): \Redis|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrByFloat(...\func_get_args()); } public function hKeys($key): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hKeys(...\func_get_args()); } public function hLen($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hLen(...\func_get_args()); } public function hMget($key, $fields): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMget(...\func_get_args()); } public function hMset($key, $fieldvals): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMset(...\func_get_args()); } public function hRandField($key, $options = null): \Redis|array|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hRandField(...\func_get_args()); } public function hSet($key, $member, $value): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSet(...\func_get_args()); } public function hSetNx($key, $field, $value): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSetNx(...\func_get_args()); } public function hStrLen($key, $field): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hStrLen(...\func_get_args()); } public function hVals($key): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hVals(...\func_get_args()); } public function hscan($key, &$iterator, $pattern = null, $count = 0): \Redis|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($key, $iterator, ...\array_slice(\func_get_args(), 2)); } public function incr($key, $by = 1): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\func_get_args()); } public function incrBy($key, $value): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrBy(...\func_get_args()); } public function incrByFloat($key, $value): \Redis|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrByFloat(...\func_get_args()); } public function info(...$sections): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\func_get_args()); } public function isConnected(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->isConnected(...\func_get_args()); } public function keys($pattern) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\func_get_args()); } public function lInsert($key, $pos, $pivot, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lInsert(...\func_get_args()); } public function lLen($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lLen(...\func_get_args()); } public function lMove($src, $dst, $wherefrom, $whereto): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lMove(...\func_get_args()); } public function blmove($src, $dst, $wherefrom, $whereto, $timeout): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\func_get_args()); } public function lPop($key, $count = 0): \Redis|array|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPop(...\func_get_args()); } public function lPos($key, $value, $options = null): \Redis|array|bool|int|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPos(...\func_get_args()); } public function lPush($key, ...$elements): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPush(...\func_get_args()); } public function rPush($key, ...$elements): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPush(...\func_get_args()); } public function lPushx($key, $value): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPushx(...\func_get_args()); } public function rPushx($key, $value): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPushx(...\func_get_args()); } public function lSet($key, $index, $value): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lSet(...\func_get_args()); } public function lastSave(): int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastSave(...\func_get_args()); } public function lindex($key, $index): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\func_get_args()); } public function lrange($key, $start, $end): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args()); } public function lrem($key, $value, $count = 0): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\func_get_args()); } public function ltrim($key, $start, $end): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\func_get_args()); } public function mget($keys): \Redis|array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args()); } public function migrate($host, $port, $key, $dstdb, $timeout, $copy = false, $replace = false, #[\SensitiveParameter] $credentials = null): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->migrate(...\func_get_args()); } public function move($key, $index): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->move(...\func_get_args()); } public function mset($key_values): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\func_get_args()); } public function msetnx($key_values): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\func_get_args()); } public function multi($value = \Redis::MULTI): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\func_get_args()); } public function object($subcommand, $key): \Redis|false|int|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\func_get_args()); } public function open($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->open(...\func_get_args()); } public function pconnect($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pconnect(...\func_get_args()); } public function persist($key): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\func_get_args()); } public function pexpire($key, $timeout, $mode = null): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\func_get_args()); } public function pexpireAt($key, $timestamp, $mode = null): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireAt(...\func_get_args()); } public function pfadd($key, $elements): \Redis|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args()); } public function pfcount($key_or_keys): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args()); } public function pfmerge($dst, $srckeys): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args()); } public function ping($message = null): \Redis|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\func_get_args()); } public function pipeline(): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pipeline(...\func_get_args()); } public function popen($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->popen(...\func_get_args()); } public function psetex($key, $expire, $value): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\func_get_args()); } public function psubscribe($patterns, $cb): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\func_get_args()); } public function pttl($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\func_get_args()); } public function publish($channel, $message): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args()); } public function pubsub($command, $arg = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\func_get_args()); } public function punsubscribe($patterns): \Redis|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\func_get_args()); } public function rPop($key, $count = 0): \Redis|array|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPop(...\func_get_args()); } public function randomKey(): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomKey(...\func_get_args()); } public function rawcommand($command, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\func_get_args()); } public function rename($old_name, $new_name): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\func_get_args()); } public function renameNx($key_src, $key_dst): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renameNx(...\func_get_args()); } public function restore($key, $ttl, $value, $options = null): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\func_get_args()); } public function role(): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\func_get_args()); } public function rpoplpush($srckey, $dstkey): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\func_get_args()); } public function sAdd($key, $value, ...$other_values): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAdd(...\func_get_args()); } public function sAddArray($key, $values): int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAddArray(...\func_get_args()); } public function sDiff($key, ...$other_keys): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiff(...\func_get_args()); } public function sDiffStore($dst, $key, ...$other_keys): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiffStore(...\func_get_args()); } public function sInter($key, ...$other_keys): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInter(...\func_get_args()); } public function sintercard($keys, $limit = -1): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sintercard(...\func_get_args()); } public function sInterStore($key, ...$other_keys): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInterStore(...\func_get_args()); } public function sMembers($key): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMembers(...\func_get_args()); } public function sMisMember($key, $member, ...$other_members): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMisMember(...\func_get_args()); } public function sMove($src, $dst, $value): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMove(...\func_get_args()); } public function sPop($key, $count = 0): \Redis|array|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sPop(...\func_get_args()); } public function sRandMember($key, $count = 0): \Redis|array|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sRandMember(...\func_get_args()); } public function sUnion($key, ...$other_keys): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnion(...\func_get_args()); } public function sUnionStore($dst, $key, ...$other_keys): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnionStore(...\func_get_args()); } public function save(): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\func_get_args()); } public function scan(&$iterator, $pattern = null, $count = 0, $type = null): array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($iterator, ...\array_slice(\func_get_args(), 1)); } public function scard($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\func_get_args()); } public function script($command, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\func_get_args()); } public function select($db): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->select(...\func_get_args()); } public function set($key, $value, $options = null): \Redis|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\func_get_args()); } public function setBit($key, $idx, $value): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setBit(...\func_get_args()); } public function setRange($key, $index, $value): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setRange(...\func_get_args()); } public function setOption($option, $value): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setOption(...\func_get_args()); } public function setex($key, $expire, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\func_get_args()); } public function setnx($key, $value): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\func_get_args()); } public function sismember($key, $value): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\func_get_args()); } public function slaveof($host = null, $port = 6379): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slaveof(...\func_get_args()); } public function replicaof($host = null, $port = 6379): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->replicaof(...\func_get_args()); } public function touch($key_or_array, ...$more_keys): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->touch(...\func_get_args()); } public function slowlog($operation, $length = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\func_get_args()); } public function sort($key, $options = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\func_get_args()); } public function sort_ro($key, $options = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort_ro(...\func_get_args()); } public function sortAsc($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAsc(...\func_get_args()); } public function sortAscAlpha($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAscAlpha(...\func_get_args()); } public function sortDesc($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDesc(...\func_get_args()); } public function sortDescAlpha($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDescAlpha(...\func_get_args()); } public function srem($key, $value, ...$other_values): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\func_get_args()); } public function sscan($key, &$iterator, $pattern = null, $count = 0): array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($key, $iterator, ...\array_slice(\func_get_args(), 2)); } public function ssubscribe($channels, $cb): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ssubscribe(...\func_get_args()); } public function strlen($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\func_get_args()); } public function subscribe($channels, $cb): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\func_get_args()); } public function sunsubscribe($channels): \Redis|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunsubscribe(...\func_get_args()); } public function swapdb($src, $dst): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->swapdb(...\func_get_args()); } public function time(): \Redis|array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\func_get_args()); } public function ttl($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\func_get_args()); } public function type($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args()); } public function unlink($key, ...$other_keys): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\func_get_args()); } public function unsubscribe($channels): \Redis|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\func_get_args()); } public function unwatch(): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\func_get_args()); } public function watch($key, ...$other_keys): \Redis|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args()); } public function wait($numreplicas, $timeout): false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->wait(...\func_get_args()); } public function xack($key, $group, $ids): false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args()); } public function xadd($key, $id, $values, $maxlen = 0, $approx = false, $nomkstream = false): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args()); } public function xautoclaim($key, $group, $consumer, $min_idle, $start, $count = -1, $justid = false): \Redis|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xautoclaim(...\func_get_args()); } public function xclaim($key, $group, $consumer, $min_idle, $ids, $options): \Redis|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args()); } public function xdel($key, $ids): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\func_get_args()); } public function xgroup($operation, $key = null, $group = null, $id_or_consumer = null, $mkstream = false, $entries_read = -2): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\func_get_args()); } public function xinfo($operation, $arg1 = null, $arg2 = null, $count = -1): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\func_get_args()); } public function xlen($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\func_get_args()); } public function xpending($key, $group, $start = null, $end = null, $count = -1, $consumer = null): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\func_get_args()); } public function xrange($key, $start, $end, $count = -1): \Redis|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\func_get_args()); } public function xread($streams, $count = -1, $block = -1): \Redis|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\func_get_args()); } public function xreadgroup($group, $consumer, $streams, $count = 1, $block = 1): \Redis|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\func_get_args()); } public function xrevrange($key, $end, $start, $count = -1): \Redis|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\func_get_args()); } public function xtrim($key, $threshold, $approx = false, $minid = false, $limit = -1): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\func_get_args()); } public function zAdd($key, $score_or_options, ...$more_scores_and_mems): \Redis|false|float|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zAdd(...\func_get_args()); } public function zCard($key): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCard(...\func_get_args()); } public function zCount($key, $start, $end): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCount(...\func_get_args()); } public function zIncrBy($key, $value, $member): \Redis|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zIncrBy(...\func_get_args()); } public function zLexCount($key, $min, $max): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zLexCount(...\func_get_args()); } public function zMscore($key, $member, ...$other_members): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zMscore(...\func_get_args()); } public function zPopMax($key, $count = null): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMax(...\func_get_args()); } public function zPopMin($key, $count = null): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMin(...\func_get_args()); } public function zRange($key, $start, $end, $options = null): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRange(...\func_get_args()); } public function zRangeByLex($key, $min, $max, $offset = -1, $count = -1): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByLex(...\func_get_args()); } public function zRangeByScore($key, $start, $end, $options = []): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByScore(...\func_get_args()); } public function zrangestore($dstkey, $srckey, $start, $end, $options = null): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangestore(...\func_get_args()); } public function zRandMember($key, $options = null): \Redis|array|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRandMember(...\func_get_args()); } public function zRank($key, $member): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRank(...\func_get_args()); } public function zRem($key, $member, ...$other_members): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRem(...\func_get_args()); } public function zRemRangeByLex($key, $min, $max): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByLex(...\func_get_args()); } public function zRemRangeByRank($key, $start, $end): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByRank(...\func_get_args()); } public function zRemRangeByScore($key, $start, $end): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByScore(...\func_get_args()); } public function zRevRange($key, $start, $end, $scores = null): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRange(...\func_get_args()); } public function zRevRangeByLex($key, $max, $min, $offset = -1, $count = -1): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByLex(...\func_get_args()); } public function zRevRangeByScore($key, $max, $min, $options = []): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByScore(...\func_get_args()); } public function zRevRank($key, $member): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRank(...\func_get_args()); } public function zScore($key, $member): \Redis|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zScore(...\func_get_args()); } public function zdiff($keys, $options = null): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiff(...\func_get_args()); } public function zdiffstore($dst, $keys): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiffstore(...\func_get_args()); } public function zinter($keys, $weights = null, $options = null): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinter(...\func_get_args()); } public function zintercard($keys, $limit = -1): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zintercard(...\func_get_args()); } public function zinterstore($dst, $keys, $weights = null, $aggregate = null): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\func_get_args()); } public function zscan($key, &$iterator, $pattern = null, $count = 0): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($key, $iterator, ...\array_slice(\func_get_args(), 2)); } public function zunion($keys, $weights = null, $options = null): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunion(...\func_get_args()); } public function zunionstore($dst, $keys, $weights = null, $aggregate = null): \Redis|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\func_get_args()); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/RedisCluster5Proxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Symfony\Component\VarExporter\LazyObjectInterface; use Symfony\Component\VarExporter\LazyProxyTrait; use Symfony\Contracts\Service\ResetInterface; // Help opcache.preload discover always-needed symbols class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class); /** * @internal */ class RedisCluster5Proxy extends \RedisCluster implements ResetInterface, LazyObjectInterface { use LazyProxyTrait { resetLazyObject as reset; } private const LAZY_OBJECT_PROPERTY_SCOPES = []; public function __construct($name, $seeds = null, $timeout = null, $read_timeout = null, $persistent = null, #[\SensitiveParameter] $auth = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args()); } public function _masters() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_masters(...\func_get_args()); } public function _prefix($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\func_get_args()); } public function _redir() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_redir(...\func_get_args()); } public function _serialize($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\func_get_args()); } public function _unserialize($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\func_get_args()); } public function _compress($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\func_get_args()); } public function _uncompress($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\func_get_args()); } public function _pack($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\func_get_args()); } public function _unpack($value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\func_get_args()); } public function acl($key_or_address, $subcmd, ...$args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\func_get_args()); } public function append($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args()); } public function bgrewriteaof($key_or_address) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args()); } public function bgsave($key_or_address) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args()); } public function bitcount($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args()); } public function bitop($operation, $ret_key, $key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\func_get_args()); } public function bitpos($key, $bit, $start = null, $end = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\func_get_args()); } public function blpop($key, $timeout_or_key, ...$extra_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blpop(...\func_get_args()); } public function brpop($key, $timeout_or_key, ...$extra_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpop(...\func_get_args()); } public function brpoplpush($src, $dst, $timeout) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\func_get_args()); } public function clearlasterror() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearlasterror(...\func_get_args()); } public function bzpopmax($key, $timeout_or_key, ...$extra_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmax(...\func_get_args()); } public function bzpopmin($key, $timeout_or_key, ...$extra_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmin(...\func_get_args()); } public function client($key_or_address, $arg = null, ...$other_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\func_get_args()); } public function close() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\func_get_args()); } public function cluster($key_or_address, $arg = null, ...$other_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cluster(...\func_get_args()); } public function command(...$args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\func_get_args()); } public function config($key_or_address, $arg = null, ...$other_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\func_get_args()); } public function dbsize($key_or_address) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbsize(...\func_get_args()); } public function decr($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\func_get_args()); } public function decrby($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrby(...\func_get_args()); } public function del($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\func_get_args()); } public function discard() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\func_get_args()); } public function dump($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args()); } public function echo($msg) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\func_get_args()); } public function eval($script, $args = null, $num_keys = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\func_get_args()); } public function evalsha($script_sha, $args = null, $num_keys = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\func_get_args()); } public function exec() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\func_get_args()); } public function exists($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\func_get_args()); } public function expire($key, $timeout) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\func_get_args()); } public function expireat($key, $timestamp) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireat(...\func_get_args()); } public function flushall($key_or_address, $async = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushall(...\func_get_args()); } public function flushdb($key_or_address, $async = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushdb(...\func_get_args()); } public function geoadd($key, $lng, $lat, $member, ...$other_triples) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args()); } public function geodist($key, $src, $dst, $unit = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args()); } public function geohash($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args()); } public function geopos($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\func_get_args()); } public function georadius($key, $lng, $lan, $radius, $unit, $opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\func_get_args()); } public function georadius_ro($key, $lng, $lan, $radius, $unit, $opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args()); } public function georadiusbymember($key, $member, $radius, $unit, $opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\func_get_args()); } public function georadiusbymember_ro($key, $member, $radius, $unit, $opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\func_get_args()); } public function get($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\func_get_args()); } public function getbit($key, $offset) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getbit(...\func_get_args()); } public function getlasterror() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getlasterror(...\func_get_args()); } public function getmode() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getmode(...\func_get_args()); } public function getoption($option) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getoption(...\func_get_args()); } public function getrange($key, $start, $end) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\func_get_args()); } public function getset($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\func_get_args()); } public function hdel($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hdel(...\func_get_args()); } public function hexists($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexists(...\func_get_args()); } public function hget($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hget(...\func_get_args()); } public function hgetall($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetall(...\func_get_args()); } public function hincrby($key, $member, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrby(...\func_get_args()); } public function hincrbyfloat($key, $member, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrbyfloat(...\func_get_args()); } public function hkeys($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hkeys(...\func_get_args()); } public function hlen($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hlen(...\func_get_args()); } public function hmget($key, $keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmget(...\func_get_args()); } public function hmset($key, $pairs) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmset(...\func_get_args()); } public function hscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2)); } public function hset($key, $member, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\func_get_args()); } public function hsetnx($key, $member, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetnx(...\func_get_args()); } public function hstrlen($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hstrlen(...\func_get_args()); } public function hvals($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hvals(...\func_get_args()); } public function incr($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\func_get_args()); } public function incrby($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrby(...\func_get_args()); } public function incrbyfloat($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrbyfloat(...\func_get_args()); } public function info($key_or_address, $option = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\func_get_args()); } public function keys($pattern) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\func_get_args()); } public function lastsave($key_or_address) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastsave(...\func_get_args()); } public function lget($key, $index) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lget(...\func_get_args()); } public function lindex($key, $index) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\func_get_args()); } public function linsert($key, $position, $pivot, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->linsert(...\func_get_args()); } public function llen($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->llen(...\func_get_args()); } public function lpop($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpop(...\func_get_args()); } public function lpush($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpush(...\func_get_args()); } public function lpushx($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpushx(...\func_get_args()); } public function lrange($key, $start, $end) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args()); } public function lrem($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\func_get_args()); } public function lset($key, $index, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lset(...\func_get_args()); } public function ltrim($key, $start, $stop) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\func_get_args()); } public function mget($keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args()); } public function mset($pairs) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\func_get_args()); } public function msetnx($pairs) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\func_get_args()); } public function multi() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\func_get_args()); } public function object($field, $key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\func_get_args()); } public function persist($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\func_get_args()); } public function pexpire($key, $timestamp) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\func_get_args()); } public function pexpireat($key, $timestamp) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireat(...\func_get_args()); } public function pfadd($key, $elements) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args()); } public function pfcount($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args()); } public function pfmerge($dstkey, $keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args()); } public function ping($key_or_address) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\func_get_args()); } public function psetex($key, $expire, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\func_get_args()); } public function psubscribe($patterns, $callback) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\func_get_args()); } public function pttl($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\func_get_args()); } public function publish($channel, $message) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args()); } public function pubsub($key_or_address, $arg = null, ...$other_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\func_get_args()); } public function punsubscribe($pattern, ...$other_patterns) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\func_get_args()); } public function randomkey($key_or_address) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomkey(...\func_get_args()); } public function rawcommand($cmd, ...$args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\func_get_args()); } public function rename($key, $newkey) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\func_get_args()); } public function renamenx($key, $newkey) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renamenx(...\func_get_args()); } public function restore($ttl, $key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\func_get_args()); } public function role() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\func_get_args()); } public function rpop($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpop(...\func_get_args()); } public function rpoplpush($src, $dst) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\func_get_args()); } public function rpush($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpush(...\func_get_args()); } public function rpushx($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpushx(...\func_get_args()); } public function sadd($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sadd(...\func_get_args()); } public function saddarray($key, $options) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->saddarray(...\func_get_args()); } public function save($key_or_address) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\func_get_args()); } public function scan(&$i_iterator, $str_node, $str_pattern = null, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($i_iterator, ...\array_slice(\func_get_args(), 1)); } public function scard($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\func_get_args()); } public function script($key_or_address, $arg = null, ...$other_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\func_get_args()); } public function sdiff($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiff(...\func_get_args()); } public function sdiffstore($dst, $key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiffstore(...\func_get_args()); } public function set($key, $value, $opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\func_get_args()); } public function setbit($key, $offset, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setbit(...\func_get_args()); } public function setex($key, $expire, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\func_get_args()); } public function setnx($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\func_get_args()); } public function setoption($option, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setoption(...\func_get_args()); } public function setrange($key, $offset, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setrange(...\func_get_args()); } public function sinter($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinter(...\func_get_args()); } public function sinterstore($dst, $key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinterstore(...\func_get_args()); } public function sismember($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\func_get_args()); } public function slowlog($key_or_address, $arg = null, ...$other_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\func_get_args()); } public function smembers($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smembers(...\func_get_args()); } public function smove($src, $dst, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smove(...\func_get_args()); } public function sort($key, $options = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\func_get_args()); } public function spop($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spop(...\func_get_args()); } public function srandmember($key, $count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srandmember(...\func_get_args()); } public function srem($key, $value) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\func_get_args()); } public function sscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2)); } public function strlen($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\func_get_args()); } public function subscribe($channels, $callback) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\func_get_args()); } public function sunion($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunion(...\func_get_args()); } public function sunionstore($dst, $key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunionstore(...\func_get_args()); } public function time() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\func_get_args()); } public function ttl($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\func_get_args()); } public function type($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args()); } public function unsubscribe($channel, ...$other_channels) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\func_get_args()); } public function unlink($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\func_get_args()); } public function unwatch() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\func_get_args()); } public function watch($key, ...$other_keys) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args()); } public function xack($str_key, $str_group, $arr_ids) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args()); } public function xadd($str_key, $str_id, $arr_fields, $i_maxlen = null, $boo_approximate = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args()); } public function xclaim($str_key, $str_group, $str_consumer, $i_min_idle, $arr_ids, $arr_opts = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args()); } public function xdel($str_key, $arr_ids) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\func_get_args()); } public function xgroup($str_operation, $str_key = null, $str_arg1 = null, $str_arg2 = null, $str_arg3 = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\func_get_args()); } public function xinfo($str_cmd, $str_key = null, $str_group = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\func_get_args()); } public function xlen($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\func_get_args()); } public function xpending($str_key, $str_group, $str_start = null, $str_end = null, $i_count = null, $str_consumer = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\func_get_args()); } public function xrange($str_key, $str_start, $str_end, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\func_get_args()); } public function xread($arr_streams, $i_count = null, $i_block = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\func_get_args()); } public function xreadgroup($str_group, $str_consumer, $arr_streams, $i_count = null, $i_block = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\func_get_args()); } public function xrevrange($str_key, $str_start, $str_end, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\func_get_args()); } public function xtrim($str_key, $i_maxlen, $boo_approximate = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\func_get_args()); } public function zadd($key, $score, $value, ...$extra_args) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zadd(...\func_get_args()); } public function zcard($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcard(...\func_get_args()); } public function zcount($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcount(...\func_get_args()); } public function zincrby($key, $value, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zincrby(...\func_get_args()); } public function zinterstore($key, $keys, $weights = null, $aggregate = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\func_get_args()); } public function zlexcount($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zlexcount(...\func_get_args()); } public function zpopmax($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmax(...\func_get_args()); } public function zpopmin($key) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmin(...\func_get_args()); } public function zrange($key, $start, $end, $scores = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrange(...\func_get_args()); } public function zrangebylex($key, $min, $max, $offset = null, $limit = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebylex(...\func_get_args()); } public function zrangebyscore($key, $start, $end, $options = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebyscore(...\func_get_args()); } public function zrank($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\func_get_args()); } public function zrem($key, $member, ...$other_members) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrem(...\func_get_args()); } public function zremrangebylex($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebylex(...\func_get_args()); } public function zremrangebyrank($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyrank(...\func_get_args()); } public function zremrangebyscore($key, $min, $max) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyscore(...\func_get_args()); } public function zrevrange($key, $start, $end, $scores = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrange(...\func_get_args()); } public function zrevrangebylex($key, $min, $max, $offset = null, $limit = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebylex(...\func_get_args()); } public function zrevrangebyscore($key, $start, $end, $options = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebyscore(...\func_get_args()); } public function zrevrank($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\func_get_args()); } public function zscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2)); } public function zscore($key, $member) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\func_get_args()); } public function zunionstore($key, $keys, $weights = null, $aggregate = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\func_get_args()); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/RedisCluster6Proxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Symfony\Component\VarExporter\LazyObjectInterface; use Symfony\Component\VarExporter\LazyProxyTrait; use Symfony\Contracts\Service\ResetInterface; // Help opcache.preload discover always-needed symbols class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class); /** * @internal */ class RedisCluster6Proxy extends \RedisCluster implements ResetInterface, LazyObjectInterface { use LazyProxyTrait { resetLazyObject as reset; } private const LAZY_OBJECT_PROPERTY_SCOPES = []; public function __construct($name, $seeds = null, $timeout = 0, $read_timeout = 0, $persistent = false, #[\SensitiveParameter] $auth = null, $context = null) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args()); } public function _compress($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\func_get_args()); } public function _uncompress($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\func_get_args()); } public function _serialize($value): bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\func_get_args()); } public function _unserialize($value): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\func_get_args()); } public function _pack($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\func_get_args()); } public function _unpack($value): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\func_get_args()); } public function _prefix($key): bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\func_get_args()); } public function _masters(): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_masters(...\func_get_args()); } public function _redir(): ?string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_redir(...\func_get_args()); } public function acl($key_or_address, $subcmd, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\func_get_args()); } public function append($key, $value): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args()); } public function bgrewriteaof($key_or_address): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args()); } public function bgsave($key_or_address): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args()); } public function bitcount($key, $start = 0, $end = -1, $bybit = false): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args()); } public function bitop($operation, $deskey, $srckey, ...$otherkeys): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\func_get_args()); } public function bitpos($key, $bit, $start = 0, $end = -1, $bybit = false): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\func_get_args()); } public function blpop($key, $timeout_or_key, ...$extra_args): \RedisCluster|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blpop(...\func_get_args()); } public function brpop($key, $timeout_or_key, ...$extra_args): \RedisCluster|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpop(...\func_get_args()); } public function brpoplpush($srckey, $deskey, $timeout): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\func_get_args()); } public function lmove($src, $dst, $wherefrom, $whereto): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmove(...\func_get_args()); } public function blmove($src, $dst, $wherefrom, $whereto, $timeout): \Redis|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\func_get_args()); } public function bzpopmax($key, $timeout_or_key, ...$extra_args): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmax(...\func_get_args()); } public function bzpopmin($key, $timeout_or_key, ...$extra_args): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmin(...\func_get_args()); } public function bzmpop($timeout, $keys, $from, $count = 1): \RedisCluster|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzmpop(...\func_get_args()); } public function zmpop($keys, $from, $count = 1): \RedisCluster|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmpop(...\func_get_args()); } public function blmpop($timeout, $keys, $from, $count = 1): \RedisCluster|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmpop(...\func_get_args()); } public function lmpop($keys, $from, $count = 1): \RedisCluster|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmpop(...\func_get_args()); } public function clearlasterror(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearlasterror(...\func_get_args()); } public function client($key_or_address, $subcommand, $arg = null): array|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\func_get_args()); } public function close(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\func_get_args()); } public function cluster($key_or_address, $command, ...$extra_args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cluster(...\func_get_args()); } public function command(...$extra_args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\func_get_args()); } public function config($key_or_address, $subcommand, ...$extra_args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\func_get_args()); } public function dbsize($key_or_address): \RedisCluster|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbsize(...\func_get_args()); } public function copy($src, $dst, $options = null): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args()); } public function decr($key, $by = 1): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\func_get_args()); } public function decrby($key, $value): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrby(...\func_get_args()); } public function decrbyfloat($key, $value): float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrbyfloat(...\func_get_args()); } public function del($key, ...$other_keys): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\func_get_args()); } public function discard(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\func_get_args()); } public function dump($key): \RedisCluster|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args()); } public function echo($key_or_address, $msg): \RedisCluster|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\func_get_args()); } public function eval($script, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\func_get_args()); } public function eval_ro($script, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval_ro(...\func_get_args()); } public function evalsha($script_sha, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\func_get_args()); } public function evalsha_ro($script_sha, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha_ro(...\func_get_args()); } public function exec(): array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\func_get_args()); } public function exists($key, ...$other_keys): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\func_get_args()); } public function touch($key, ...$other_keys): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->touch(...\func_get_args()); } public function expire($key, $timeout, $mode = null): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\func_get_args()); } public function expireat($key, $timestamp, $mode = null): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireat(...\func_get_args()); } public function expiretime($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expiretime(...\func_get_args()); } public function pexpiretime($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpiretime(...\func_get_args()); } public function flushall($key_or_address, $async = false): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushall(...\func_get_args()); } public function flushdb($key_or_address, $async = false): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushdb(...\func_get_args()); } public function geoadd($key, $lng, $lat, $member, ...$other_triples_and_options): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args()); } public function geodist($key, $src, $dest, $unit = null): \RedisCluster|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args()); } public function geohash($key, $member, ...$other_members): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args()); } public function geopos($key, $member, ...$other_members): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\func_get_args()); } public function georadius($key, $lng, $lat, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\func_get_args()); } public function georadius_ro($key, $lng, $lat, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args()); } public function georadiusbymember($key, $member, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\func_get_args()); } public function georadiusbymember_ro($key, $member, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\func_get_args()); } public function geosearch($key, $position, $shape, $unit, $options = []): \RedisCluster|array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\func_get_args()); } public function geosearchstore($dst, $src, $position, $shape, $unit, $options = []): \RedisCluster|array|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearchstore(...\func_get_args()); } public function get($key): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\func_get_args()); } public function getbit($key, $value): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getbit(...\func_get_args()); } public function getlasterror(): ?string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getlasterror(...\func_get_args()); } public function getmode(): int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getmode(...\func_get_args()); } public function getoption($option): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getoption(...\func_get_args()); } public function getrange($key, $start, $end): \RedisCluster|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\func_get_args()); } public function lcs($key1, $key2, $options = null): \RedisCluster|array|false|int|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lcs(...\func_get_args()); } public function getset($key, $value): \RedisCluster|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\func_get_args()); } public function gettransferredbytes(): array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->gettransferredbytes(...\func_get_args()); } public function cleartransferredbytes(): void { ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cleartransferredbytes(...\func_get_args()); } public function hdel($key, $member, ...$other_members): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hdel(...\func_get_args()); } public function hexists($key, $member): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexists(...\func_get_args()); } public function hget($key, $member): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hget(...\func_get_args()); } public function hgetall($key): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetall(...\func_get_args()); } public function hincrby($key, $member, $value): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrby(...\func_get_args()); } public function hincrbyfloat($key, $member, $value): \RedisCluster|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrbyfloat(...\func_get_args()); } public function hkeys($key): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hkeys(...\func_get_args()); } public function hlen($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hlen(...\func_get_args()); } public function hmget($key, $keys): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmget(...\func_get_args()); } public function hmset($key, $key_values): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmset(...\func_get_args()); } public function hscan($key, &$iterator, $pattern = null, $count = 0): array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($key, $iterator, ...\array_slice(\func_get_args(), 2)); } public function hrandfield($key, $options = null): \RedisCluster|array|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hrandfield(...\func_get_args()); } public function hset($key, $member, $value): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\func_get_args()); } public function hsetnx($key, $member, $value): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetnx(...\func_get_args()); } public function hstrlen($key, $field): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hstrlen(...\func_get_args()); } public function hvals($key): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hvals(...\func_get_args()); } public function incr($key, $by = 1): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\func_get_args()); } public function incrby($key, $value): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrby(...\func_get_args()); } public function incrbyfloat($key, $value): \RedisCluster|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrbyfloat(...\func_get_args()); } public function info($key_or_address, ...$sections): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\func_get_args()); } public function keys($pattern): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\func_get_args()); } public function lastsave($key_or_address): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastsave(...\func_get_args()); } public function lget($key, $index): \RedisCluster|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lget(...\func_get_args()); } public function lindex($key, $index): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\func_get_args()); } public function linsert($key, $pos, $pivot, $value): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->linsert(...\func_get_args()); } public function llen($key): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->llen(...\func_get_args()); } public function lpop($key, $count = 0): \RedisCluster|array|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpop(...\func_get_args()); } public function lpos($key, $value, $options = null): \Redis|array|bool|int|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpos(...\func_get_args()); } public function lpush($key, $value, ...$other_values): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpush(...\func_get_args()); } public function lpushx($key, $value): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpushx(...\func_get_args()); } public function lrange($key, $start, $end): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args()); } public function lrem($key, $value, $count = 0): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\func_get_args()); } public function lset($key, $index, $value): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lset(...\func_get_args()); } public function ltrim($key, $start, $end): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\func_get_args()); } public function mget($keys): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args()); } public function mset($key_values): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\func_get_args()); } public function msetnx($key_values): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\func_get_args()); } public function multi($value = \Redis::MULTI): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\func_get_args()); } public function object($subcommand, $key): \RedisCluster|false|int|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\func_get_args()); } public function persist($key): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\func_get_args()); } public function pexpire($key, $timeout, $mode = null): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\func_get_args()); } public function pexpireat($key, $timestamp, $mode = null): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireat(...\func_get_args()); } public function pfadd($key, $elements): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args()); } public function pfcount($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args()); } public function pfmerge($key, $keys): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args()); } public function ping($key_or_address, $message = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\func_get_args()); } public function psetex($key, $timeout, $value): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\func_get_args()); } public function psubscribe($patterns, $callback): void { ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\func_get_args()); } public function pttl($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\func_get_args()); } public function publish($channel, $message): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args()); } public function pubsub($key_or_address, ...$values): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\func_get_args()); } public function punsubscribe($pattern, ...$other_patterns): array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\func_get_args()); } public function randomkey($key_or_address): \RedisCluster|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomkey(...\func_get_args()); } public function rawcommand($key_or_address, $command, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\func_get_args()); } public function rename($key_src, $key_dst): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\func_get_args()); } public function renamenx($key, $newkey): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renamenx(...\func_get_args()); } public function restore($key, $timeout, $value, $options = null): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\func_get_args()); } public function role($key_or_address): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\func_get_args()); } public function rpop($key, $count = 0): \RedisCluster|array|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpop(...\func_get_args()); } public function rpoplpush($src, $dst): \RedisCluster|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\func_get_args()); } public function rpush($key, ...$elements): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpush(...\func_get_args()); } public function rpushx($key, $value): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpushx(...\func_get_args()); } public function sadd($key, $value, ...$other_values): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sadd(...\func_get_args()); } public function saddarray($key, $values): \RedisCluster|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->saddarray(...\func_get_args()); } public function save($key_or_address): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\func_get_args()); } public function scan(&$iterator, $key_or_address, $pattern = null, $count = 0): array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($iterator, ...\array_slice(\func_get_args(), 1)); } public function scard($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\func_get_args()); } public function script($key_or_address, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\func_get_args()); } public function sdiff($key, ...$other_keys): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiff(...\func_get_args()); } public function sdiffstore($dst, $key, ...$other_keys): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiffstore(...\func_get_args()); } public function set($key, $value, $options = null): \RedisCluster|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\func_get_args()); } public function setbit($key, $offset, $onoff): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setbit(...\func_get_args()); } public function setex($key, $expire, $value): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\func_get_args()); } public function setnx($key, $value): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\func_get_args()); } public function setoption($option, $value): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setoption(...\func_get_args()); } public function setrange($key, $offset, $value): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setrange(...\func_get_args()); } public function sinter($key, ...$other_keys): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinter(...\func_get_args()); } public function sintercard($keys, $limit = -1): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sintercard(...\func_get_args()); } public function sinterstore($key, ...$other_keys): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinterstore(...\func_get_args()); } public function sismember($key, $value): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\func_get_args()); } public function smismember($key, $member, ...$other_members): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smismember(...\func_get_args()); } public function slowlog($key_or_address, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\func_get_args()); } public function smembers($key): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smembers(...\func_get_args()); } public function smove($src, $dst, $member): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smove(...\func_get_args()); } public function sort($key, $options = null): \RedisCluster|array|bool|int|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\func_get_args()); } public function sort_ro($key, $options = null): \RedisCluster|array|bool|int|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort_ro(...\func_get_args()); } public function spop($key, $count = 0): \RedisCluster|array|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spop(...\func_get_args()); } public function srandmember($key, $count = 0): \RedisCluster|array|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srandmember(...\func_get_args()); } public function srem($key, $value, ...$other_values): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\func_get_args()); } public function sscan($key, &$iterator, $pattern = null, $count = 0): array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($key, $iterator, ...\array_slice(\func_get_args(), 2)); } public function strlen($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\func_get_args()); } public function subscribe($channels, $cb): void { ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\func_get_args()); } public function sunion($key, ...$other_keys): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunion(...\func_get_args()); } public function sunionstore($dst, $key, ...$other_keys): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunionstore(...\func_get_args()); } public function time($key_or_address): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\func_get_args()); } public function ttl($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\func_get_args()); } public function type($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args()); } public function unsubscribe($channels): array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\func_get_args()); } public function unlink($key, ...$other_keys): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\func_get_args()); } public function unwatch(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\func_get_args()); } public function watch($key, ...$other_keys): \RedisCluster|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args()); } public function xack($key, $group, $ids): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args()); } public function xadd($key, $id, $values, $maxlen = 0, $approx = false): \RedisCluster|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args()); } public function xclaim($key, $group, $consumer, $min_iddle, $ids, $options): \RedisCluster|array|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args()); } public function xdel($key, $ids): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\func_get_args()); } public function xgroup($operation, $key = null, $group = null, $id_or_consumer = null, $mkstream = false, $entries_read = -2): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\func_get_args()); } public function xautoclaim($key, $group, $consumer, $min_idle, $start, $count = -1, $justid = false): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xautoclaim(...\func_get_args()); } public function xinfo($operation, $arg1 = null, $arg2 = null, $count = -1): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\func_get_args()); } public function xlen($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\func_get_args()); } public function xpending($key, $group, $start = null, $end = null, $count = -1, $consumer = null): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\func_get_args()); } public function xrange($key, $start, $end, $count = -1): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\func_get_args()); } public function xread($streams, $count = -1, $block = -1): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\func_get_args()); } public function xreadgroup($group, $consumer, $streams, $count = 1, $block = 1): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\func_get_args()); } public function xrevrange($key, $start, $end, $count = -1): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\func_get_args()); } public function xtrim($key, $maxlen, $approx = false, $minid = false, $limit = -1): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\func_get_args()); } public function zadd($key, $score_or_options, ...$more_scores_and_mems): \RedisCluster|false|float|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zadd(...\func_get_args()); } public function zcard($key): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcard(...\func_get_args()); } public function zcount($key, $start, $end): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcount(...\func_get_args()); } public function zincrby($key, $value, $member): \RedisCluster|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zincrby(...\func_get_args()); } public function zinterstore($dst, $keys, $weights = null, $aggregate = null): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\func_get_args()); } public function zintercard($keys, $limit = -1): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zintercard(...\func_get_args()); } public function zlexcount($key, $min, $max): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zlexcount(...\func_get_args()); } public function zpopmax($key, $value = null): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmax(...\func_get_args()); } public function zpopmin($key, $value = null): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmin(...\func_get_args()); } public function zrange($key, $start, $end, $options = null): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrange(...\func_get_args()); } public function zrangestore($dstkey, $srckey, $start, $end, $options = null): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangestore(...\func_get_args()); } public function zrandmember($key, $options = null): \RedisCluster|array|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrandmember(...\func_get_args()); } public function zrangebylex($key, $min, $max, $offset = -1, $count = -1): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebylex(...\func_get_args()); } public function zrangebyscore($key, $start, $end, $options = []): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebyscore(...\func_get_args()); } public function zrank($key, $member): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\func_get_args()); } public function zrem($key, $value, ...$other_values): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrem(...\func_get_args()); } public function zremrangebylex($key, $min, $max): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebylex(...\func_get_args()); } public function zremrangebyrank($key, $min, $max): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyrank(...\func_get_args()); } public function zremrangebyscore($key, $min, $max): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyscore(...\func_get_args()); } public function zrevrange($key, $min, $max, $options = null): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrange(...\func_get_args()); } public function zrevrangebylex($key, $min, $max, $options = null): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebylex(...\func_get_args()); } public function zrevrangebyscore($key, $min, $max, $options = null): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebyscore(...\func_get_args()); } public function zrevrank($key, $member): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\func_get_args()); } public function zscan($key, &$iterator, $pattern = null, $count = 0): \RedisCluster|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($key, $iterator, ...\array_slice(\func_get_args(), 2)); } public function zscore($key, $member): \RedisCluster|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\func_get_args()); } public function zmscore($key, $member, ...$other_members): \Redis|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmscore(...\func_get_args()); } public function zunionstore($dst, $keys, $weights = null, $aggregate = null): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\func_get_args()); } public function zinter($keys, $weights = null, $options = null): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinter(...\func_get_args()); } public function zdiffstore($dst, $keys): \RedisCluster|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiffstore(...\func_get_args()); } public function zunion($keys, $weights = null, $options = null): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunion(...\func_get_args()); } public function zdiff($keys, $options = null): \RedisCluster|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiff(...\func_get_args()); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; /** * This file acts as a wrapper to the \RedisCluster implementation so it can accept the same type of calls as * individual \Redis objects. * * Calls are made to individual nodes via: RedisCluster->{method}($host, ...args)' * according to https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#directed-node-commands * * @author Jack Thomas * * @internal */ class RedisClusterNodeProxy { public function __construct( private array $host, private \RedisCluster $redis, ) { } public function __call(string $method, array $args) { return $this->redis->{$method}($this->host, ...$args); } public function scan(&$iIterator, $strPattern = null, $iCount = null) { return $this->redis->scan($iIterator, $this->host, $strPattern, $iCount); } public function getOption($name) { return $this->redis->getOption($name); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/RedisClusterProxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; class_alias(6.0 <= (float) phpversion('redis') ? RedisCluster6Proxy::class : RedisCluster5Proxy::class, RedisClusterProxy::class); if (false) { /** * @internal */ class RedisClusterProxy extends \RedisCluster { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/RedisProxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; class_alias(6.0 <= (float) phpversion('redis') ? Redis6Proxy::class : Redis5Proxy::class, RedisProxy::class); if (false) { /** * @internal */ class RedisProxy extends \Redis { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/RedisTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Predis\Command\Redis\UNLINK; use Predis\Connection\Aggregate\ClusterInterface; use Predis\Connection\Aggregate\RedisCluster; use Predis\Connection\Aggregate\ReplicationInterface; use Predis\Connection\Cluster\ClusterInterface as Predis2ClusterInterface; use Predis\Connection\Cluster\RedisCluster as Predis2RedisCluster; use Predis\Response\ErrorInterface; use Predis\Response\Status; use Relay\Relay; use Relay\Sentinel; use Symfony\Component\Cache\Exception\CacheException; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; /** * @author Aurimas Niekis * @author Nicolas Grekas * * @internal */ trait RedisTrait { private static array $defaultConnectionOptions = [ 'class' => null, 'persistent' => 0, 'persistent_id' => null, 'timeout' => 30, 'read_timeout' => 0, 'retry_interval' => 0, 'tcp_keepalive' => 0, 'lazy' => null, 'redis_cluster' => false, 'redis_sentinel' => null, 'dbindex' => 0, 'failover' => 'none', 'ssl' => null, // see https://php.net/context.ssl ]; private \Redis|Relay|\RedisArray|\RedisCluster|\Predis\ClientInterface $redis; private MarshallerInterface $marshaller; private function init(\Redis|Relay|\RedisArray|\RedisCluster|\Predis\ClientInterface $redis, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller): void { parent::__construct($namespace, $defaultLifetime); if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) { throw new InvalidArgumentException(sprintf('RedisAdapter namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0])); } if ($redis instanceof \Predis\ClientInterface && $redis->getOptions()->exceptions) { $options = clone $redis->getOptions(); \Closure::bind(function () { $this->options['exceptions'] = false; }, $options, $options)(); $redis = new $redis($redis->getConnection(), $options); } $this->redis = $redis; $this->marshaller = $marshaller ?? new DefaultMarshaller(); } /** * Creates a Redis connection using a DSN configuration. * * Example DSN: * - redis://localhost * - redis://example.com:1234 * - redis://secret@example.com/13 * - redis:///var/run/redis.sock * - redis://secret@/var/run/redis.sock/13 * * @param array $options See self::$defaultConnectionOptions * * @throws InvalidArgumentException when the DSN is invalid */ public static function createConnection(#[\SensitiveParameter] string $dsn, array $options = []): \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|Relay { if (str_starts_with($dsn, 'redis:')) { $scheme = 'redis'; } elseif (str_starts_with($dsn, 'rediss:')) { $scheme = 'rediss'; } else { throw new InvalidArgumentException('Invalid Redis DSN: it does not start with "redis[s]:".'); } if (!\extension_loaded('redis') && !class_exists(\Predis\Client::class)) { throw new CacheException('Cannot find the "redis" extension nor the "predis/predis" package.'); } $params = preg_replace_callback('#^'.$scheme.':(//)?(?:(?:(?[^:@]*+):)?(?[^@]*+)@)?#', function ($m) use (&$auth) { if (isset($m['password'])) { if (\in_array($m['user'], ['', 'default'], true)) { $auth = rawurldecode($m['password']); } else { $auth = [rawurldecode($m['user']), rawurldecode($m['password'])]; } if ('' === $auth) { $auth = null; } } return 'file:'.($m[1] ?? ''); }, $dsn); if (false === $params = parse_url($params)) { throw new InvalidArgumentException('Invalid Redis DSN.'); } $query = $hosts = []; $tls = 'rediss' === $scheme; $tcpScheme = $tls ? 'tls' : 'tcp'; if (isset($params['query'])) { parse_str($params['query'], $query); if (isset($query['host'])) { if (!\is_array($hosts = $query['host'])) { throw new InvalidArgumentException('Invalid Redis DSN: query parameter "host" must be an array.'); } foreach ($hosts as $host => $parameters) { if (\is_string($parameters)) { parse_str($parameters, $parameters); } if (false === $i = strrpos($host, ':')) { $hosts[$host] = ['scheme' => $tcpScheme, 'host' => $host, 'port' => 6379] + $parameters; } elseif ($port = (int) substr($host, 1 + $i)) { $hosts[$host] = ['scheme' => $tcpScheme, 'host' => substr($host, 0, $i), 'port' => $port] + $parameters; } else { $hosts[$host] = ['scheme' => 'unix', 'path' => substr($host, 0, $i)] + $parameters; } } $hosts = array_values($hosts); } } if (isset($params['host']) || isset($params['path'])) { if (!isset($params['dbindex']) && isset($params['path'])) { if (preg_match('#/(\d+)?$#', $params['path'], $m)) { $params['dbindex'] = $m[1] ?? '0'; $params['path'] = substr($params['path'], 0, -\strlen($m[0])); } elseif (isset($params['host'])) { throw new InvalidArgumentException('Invalid Redis DSN: query parameter "dbindex" must be a number.'); } } if (isset($params['host'])) { array_unshift($hosts, ['scheme' => $tcpScheme, 'host' => $params['host'], 'port' => $params['port'] ?? 6379]); } else { array_unshift($hosts, ['scheme' => 'unix', 'path' => $params['path']]); } } if (!$hosts) { throw new InvalidArgumentException('Invalid Redis DSN: missing host.'); } $params += $query + $options + self::$defaultConnectionOptions; if (isset($params['redis_sentinel']) && !class_exists(\Predis\Client::class) && !class_exists(\RedisSentinel::class) && !class_exists(Sentinel::class)) { throw new CacheException('Redis Sentinel support requires one of: "predis/predis", "ext-redis >= 5.2", "ext-relay".'); } if (isset($params['lazy'])) { $params['lazy'] = filter_var($params['lazy'], \FILTER_VALIDATE_BOOLEAN); } $params['redis_cluster'] = filter_var($params['redis_cluster'], \FILTER_VALIDATE_BOOLEAN); if ($params['redis_cluster'] && isset($params['redis_sentinel'])) { throw new InvalidArgumentException('Cannot use both "redis_cluster" and "redis_sentinel" at the same time.'); } $class = $params['class'] ?? match (true) { $params['redis_cluster'] => \extension_loaded('redis') ? \RedisCluster::class : \Predis\Client::class, isset($params['redis_sentinel']) => match (true) { \extension_loaded('redis') => \Redis::class, \extension_loaded('relay') => Relay::class, default => \Predis\Client::class, }, 1 < \count($hosts) && \extension_loaded('redis') => 1 < \count($hosts) ? \RedisArray::class : \Redis::class, \extension_loaded('redis') => \Redis::class, \extension_loaded('relay') => Relay::class, default => \Predis\Client::class, }; if (isset($params['redis_sentinel']) && !is_a($class, \Predis\Client::class, true) && !class_exists(\RedisSentinel::class) && !class_exists(Sentinel::class)) { throw new CacheException(sprintf('Cannot use Redis Sentinel: class "%s" does not extend "Predis\Client" and neither ext-redis >= 5.2 nor ext-relay have been found.', $class)); } $isRedisExt = is_a($class, \Redis::class, true); $isRelayExt = !$isRedisExt && is_a($class, Relay::class, true); if ($isRedisExt || $isRelayExt) { $connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect'; $initializer = static function () use ($class, $isRedisExt, $connect, $params, $auth, $hosts, $tls) { $sentinelClass = $isRedisExt ? \RedisSentinel::class : Sentinel::class; $redis = new $class(); $hostIndex = 0; do { $host = $hosts[$hostIndex]['host'] ?? $hosts[$hostIndex]['path']; $port = $hosts[$hostIndex]['port'] ?? 0; $passAuth = isset($params['auth']) && (!$isRedisExt || \defined('Redis::OPT_NULL_MULTIBULK_AS_NULL')); $address = false; if (isset($hosts[$hostIndex]['host']) && $tls) { $host = 'tls://'.$host; } if (!isset($params['redis_sentinel'])) { break; } try { if (version_compare(phpversion('redis'), '6.0.0', '>=') && $isRedisExt) { $options = [ 'host' => $host, 'port' => $port, 'connectTimeout' => $params['timeout'], 'persistent' => $params['persistent_id'], 'retryInterval' => $params['retry_interval'], 'readTimeout' => $params['read_timeout'], ]; if ($passAuth) { $options['auth'] = $params['auth']; } $sentinel = new \RedisSentinel($options); } else { $extra = $passAuth ? [$params['auth']] : []; $sentinel = new $sentinelClass($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...$extra); } if ($address = $sentinel->getMasterAddrByName($params['redis_sentinel'])) { [$host, $port] = $address; } } catch (\RedisException|\Relay\Exception $redisException) { } } while (++$hostIndex < \count($hosts) && !$address); if (isset($params['redis_sentinel']) && !$address) { throw new InvalidArgumentException(sprintf('Failed to retrieve master information from sentinel "%s".', $params['redis_sentinel']), previous: $redisException ?? null); } try { $extra = [ 'stream' => $params['ssl'] ?? null, ]; $booleanStreamOptions = [ 'allow_self_signed', 'capture_peer_cert', 'capture_peer_cert_chain', 'disable_compression', 'SNI_enabled', 'verify_peer', 'verify_peer_name', ]; foreach ($extra['stream'] ?? [] as $streamOption => $value) { if (\in_array($streamOption, $booleanStreamOptions, true) && \is_string($value)) { $extra['stream'][$streamOption] = filter_var($value, \FILTER_VALIDATE_BOOL); } } if (isset($params['auth'])) { $extra['auth'] = $params['auth']; } @$redis->{$connect}($host, $port, (float) $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...\defined('Redis::SCAN_PREFIX') || !$isRedisExt ? [$extra] : []); set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); try { $isConnected = $redis->isConnected(); } finally { restore_error_handler(); } if (!$isConnected) { $error = preg_match('/^Redis::p?connect\(\): (.*)/', $error ?? $redis->getLastError() ?? '', $error) ? sprintf(' (%s)', $error[1]) : ''; throw new InvalidArgumentException('Redis connection failed: '.$error.'.'); } if ((null !== $auth && !$redis->auth($auth)) // Due to a bug in phpredis we must always select the dbindex if persistent pooling is enabled // @see https://github.com/phpredis/phpredis/issues/1920 // @see https://github.com/symfony/symfony/issues/51578 || (($params['dbindex'] || ('pconnect' === $connect && '0' !== \ini_get('redis.pconnect.pooling_enabled'))) && !$redis->select($params['dbindex'])) ) { $e = preg_replace('/^ERR /', '', $redis->getLastError()); throw new InvalidArgumentException('Redis connection failed: '.$e.'.'); } if (0 < $params['tcp_keepalive'] && (!$isRedisExt || \defined('Redis::OPT_TCP_KEEPALIVE'))) { $redis->setOption($isRedisExt ? \Redis::OPT_TCP_KEEPALIVE : Relay::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']); } } catch (\RedisException|\Relay\Exception $e) { throw new InvalidArgumentException('Redis connection failed: '.$e->getMessage()); } return $redis; }; if ($params['lazy']) { $redis = $isRedisExt ? RedisProxy::createLazyProxy($initializer) : RelayProxy::createLazyProxy($initializer); } else { $redis = $initializer(); } } elseif (is_a($class, \RedisArray::class, true)) { foreach ($hosts as $i => $host) { $hosts[$i] = match ($host['scheme']) { 'tcp' => $host['host'].':'.$host['port'], 'tls' => 'tls://'.$host['host'].':'.$host['port'], default => $host['path'], }; } $params['lazy_connect'] = $params['lazy'] ?? true; $params['connect_timeout'] = $params['timeout']; try { $redis = new $class($hosts, $params); } catch (\RedisClusterException $e) { throw new InvalidArgumentException('Redis connection failed: '.$e->getMessage()); } if (0 < $params['tcp_keepalive'] && (!$isRedisExt || \defined('Redis::OPT_TCP_KEEPALIVE'))) { $redis->setOption($isRedisExt ? \Redis::OPT_TCP_KEEPALIVE : Relay::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']); } } elseif (is_a($class, \RedisCluster::class, true)) { $initializer = static function () use ($isRedisExt, $class, $params, $hosts) { foreach ($hosts as $i => $host) { $hosts[$i] = match ($host['scheme']) { 'tcp' => $host['host'].':'.$host['port'], 'tls' => 'tls://'.$host['host'].':'.$host['port'], default => $host['path'], }; } try { $redis = new $class(null, $hosts, $params['timeout'], $params['read_timeout'], (bool) $params['persistent'], $params['auth'] ?? '', ...\defined('Redis::SCAN_PREFIX') ? [$params['ssl'] ?? null] : []); } catch (\RedisClusterException $e) { throw new InvalidArgumentException('Redis connection failed: '.$e->getMessage()); } if (0 < $params['tcp_keepalive'] && (!$isRedisExt || \defined('Redis::OPT_TCP_KEEPALIVE'))) { $redis->setOption($isRedisExt ? \Redis::OPT_TCP_KEEPALIVE : Relay::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']); } $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, match ($params['failover']) { 'error' => \RedisCluster::FAILOVER_ERROR, 'distribute' => \RedisCluster::FAILOVER_DISTRIBUTE, 'slaves' => \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES, 'none' => \RedisCluster::FAILOVER_NONE, }); return $redis; }; $redis = $params['lazy'] ? RedisClusterProxy::createLazyProxy($initializer) : $initializer(); } elseif (is_a($class, \Predis\ClientInterface::class, true)) { if ($params['redis_cluster']) { $params['cluster'] = 'redis'; } elseif (isset($params['redis_sentinel'])) { $params['replication'] = 'sentinel'; $params['service'] = $params['redis_sentinel']; } $params += ['parameters' => []]; $params['parameters'] += [ 'persistent' => $params['persistent'], 'timeout' => $params['timeout'], 'read_write_timeout' => $params['read_timeout'], 'tcp_nodelay' => true, ]; if ($params['dbindex']) { $params['parameters']['database'] = $params['dbindex']; } if (null !== $auth) { if (\is_array($auth)) { // ACL $params['parameters']['username'] = $auth[0]; $params['parameters']['password'] = $auth[1]; } else { $params['parameters']['password'] = $auth; } } if (isset($params['ssl'])) { foreach ($hosts as $i => $host) { $hosts[$i]['ssl'] ??= $params['ssl']; } } if (1 === \count($hosts) && !($params['redis_cluster'] || $params['redis_sentinel'])) { $hosts = $hosts[0]; } elseif (\in_array($params['failover'], ['slaves', 'distribute'], true) && !isset($params['replication'])) { $params['replication'] = true; $hosts[0] += ['alias' => 'master']; } $params['exceptions'] = false; $redis = new $class($hosts, array_diff_key($params, self::$defaultConnectionOptions)); if (isset($params['redis_sentinel'])) { $redis->getConnection()->setSentinelTimeout($params['timeout']); } } elseif (class_exists($class, false)) { throw new InvalidArgumentException(sprintf('"%s" is not a subclass of "Redis", "RedisArray", "RedisCluster", "Relay\Relay" nor "Predis\ClientInterface".', $class)); } else { throw new InvalidArgumentException(sprintf('Class "%s" does not exist.', $class)); } return $redis; } protected function doFetch(array $ids): iterable { if (!$ids) { return []; } $result = []; if ($this->redis instanceof \Predis\ClientInterface && ($this->redis->getConnection() instanceof ClusterInterface || $this->redis->getConnection() instanceof Predis2ClusterInterface)) { $values = $this->pipeline(function () use ($ids) { foreach ($ids as $id) { yield 'get' => [$id]; } }); } else { $values = $this->redis->mget($ids); if (!\is_array($values) || \count($values) !== \count($ids)) { return []; } $values = array_combine($ids, $values); } foreach ($values as $id => $v) { if ($v) { $result[$id] = $this->marshaller->unmarshall($v); } } return $result; } protected function doHave(string $id): bool { return (bool) $this->redis->exists($id); } protected function doClear(string $namespace): bool { if ($this->redis instanceof \Predis\ClientInterface) { $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : ''; $prefixLen = \strlen($prefix ?? ''); } $cleared = true; $hosts = $this->getHosts(); $host = reset($hosts); if ($host instanceof \Predis\Client && $host->getConnection() instanceof ReplicationInterface) { // Predis supports info command only on the master in replication environments $hosts = [$host->getClientFor('master')]; } foreach ($hosts as $host) { if (!isset($namespace[0])) { $cleared = $host->flushDb() && $cleared; continue; } $info = $host->info('Server'); $info = !$info instanceof ErrorInterface ? $info['Server'] ?? $info : ['redis_version' => '2.0']; if ($host instanceof Relay) { $prefix = Relay::SCAN_PREFIX & $host->getOption(Relay::OPT_SCAN) ? '' : $host->getOption(Relay::OPT_PREFIX); $prefixLen = \strlen($host->getOption(Relay::OPT_PREFIX) ?? ''); } elseif (!$host instanceof \Predis\ClientInterface) { $prefix = \defined('Redis::SCAN_PREFIX') && (\Redis::SCAN_PREFIX & $host->getOption(\Redis::OPT_SCAN)) ? '' : $host->getOption(\Redis::OPT_PREFIX); $prefixLen = \strlen($host->getOption(\Redis::OPT_PREFIX) ?? ''); } $pattern = $prefix.$namespace.'*'; if (!version_compare($info['redis_version'], '2.8', '>=')) { // As documented in Redis documentation (http://redis.io/commands/keys) using KEYS // can hang your server when it is executed against large databases (millions of items). // Whenever you hit this scale, you should really consider upgrading to Redis 2.8 or above. $unlink = version_compare($info['redis_version'], '4.0', '>=') ? 'UNLINK' : 'DEL'; $args = $this->redis instanceof \Predis\ClientInterface ? [0, $pattern] : [[$pattern], 0]; $cleared = $host->eval("local keys=redis.call('KEYS',ARGV[1]) for i=1,#keys,5000 do redis.call('$unlink',unpack(keys,i,math.min(i+4999,#keys))) end return 1", $args[0], $args[1]) && $cleared; continue; } $cursor = null; do { $keys = $host instanceof \Predis\ClientInterface ? $host->scan($cursor, 'MATCH', $pattern, 'COUNT', 1000) : $host->scan($cursor, $pattern, 1000); if (isset($keys[1]) && \is_array($keys[1])) { $cursor = $keys[0]; $keys = $keys[1]; } if ($keys) { if ($prefixLen) { foreach ($keys as $i => $key) { $keys[$i] = substr($key, $prefixLen); } } $this->doDelete($keys); } } while ($cursor = (int) $cursor); } return $cleared; } protected function doDelete(array $ids): bool { if (!$ids) { return true; } if ($this->redis instanceof \Predis\ClientInterface && ($this->redis->getConnection() instanceof ClusterInterface || $this->redis->getConnection() instanceof Predis2ClusterInterface)) { static $del; $del ??= (class_exists(UNLINK::class) ? 'unlink' : 'del'); $this->pipeline(function () use ($ids, $del) { foreach ($ids as $id) { yield $del => [$id]; } })->rewind(); } else { static $unlink = true; if ($unlink) { try { $unlink = false !== $this->redis->unlink($ids); } catch (\Throwable) { $unlink = false; } } if (!$unlink) { $this->redis->del($ids); } } return true; } protected function doSave(array $values, int $lifetime): array|bool { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; } $results = $this->pipeline(function () use ($values, $lifetime) { foreach ($values as $id => $value) { if (0 >= $lifetime) { yield 'set' => [$id, $value]; } else { yield 'setEx' => [$id, $lifetime, $value]; } } }); foreach ($results as $id => $result) { if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) { $failed[] = $id; } } return $failed; } private function pipeline(\Closure $generator, ?object $redis = null): \Generator { $ids = []; $redis ??= $this->redis; if ($redis instanceof \RedisCluster || ($redis instanceof \Predis\ClientInterface && ($redis->getConnection() instanceof RedisCluster || $redis->getConnection() instanceof Predis2RedisCluster))) { // phpredis & predis don't support pipelining with RedisCluster // see https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#pipelining // see https://github.com/nrk/predis/issues/267#issuecomment-123781423 $results = []; foreach ($generator() as $command => $args) { $results[] = $redis->{$command}(...$args); $ids[] = 'eval' === $command ? ($redis instanceof \Predis\ClientInterface ? $args[2] : $args[1][0]) : $args[0]; } } elseif ($redis instanceof \Predis\ClientInterface) { $results = $redis->pipeline(static function ($redis) use ($generator, &$ids) { foreach ($generator() as $command => $args) { $redis->{$command}(...$args); $ids[] = 'eval' === $command ? $args[2] : $args[0]; } }); } elseif ($redis instanceof \RedisArray) { $connections = $results = $ids = []; foreach ($generator() as $command => $args) { $id = 'eval' === $command ? $args[1][0] : $args[0]; if (!isset($connections[$h = $redis->_target($id)])) { $connections[$h] = [$redis->_instance($h), -1]; $connections[$h][0]->multi(\Redis::PIPELINE); } $connections[$h][0]->{$command}(...$args); $results[] = [$h, ++$connections[$h][1]]; $ids[] = $id; } foreach ($connections as $h => $c) { $connections[$h] = $c[0]->exec(); } foreach ($results as $k => [$h, $c]) { $results[$k] = $connections[$h][$c]; } } else { $redis->multi($redis instanceof Relay ? Relay::PIPELINE : \Redis::PIPELINE); foreach ($generator() as $command => $args) { $redis->{$command}(...$args); $ids[] = 'eval' === $command ? $args[1][0] : $args[0]; } $results = $redis->exec(); } if (!$redis instanceof \Predis\ClientInterface && 'eval' === $command && $redis->getLastError()) { $e = $redis instanceof Relay ? new \Relay\Exception($redis->getLastError()) : new \RedisException($redis->getLastError()); $results = array_map(fn ($v) => false === $v ? $e : $v, (array) $results); } if (\is_bool($results)) { return; } foreach ($ids as $k => $id) { yield $id => $results[$k]; } } private function getHosts(): array { $hosts = [$this->redis]; if ($this->redis instanceof \Predis\ClientInterface) { $connection = $this->redis->getConnection(); if (($connection instanceof ClusterInterface || $connection instanceof Predis2ClusterInterface) && $connection instanceof \Traversable) { $hosts = []; foreach ($connection as $c) { $hosts[] = new \Predis\Client($c); } } } elseif ($this->redis instanceof \RedisArray) { $hosts = []; foreach ($this->redis->_hosts() as $host) { $hosts[] = $this->redis->_instance($host); } } elseif ($this->redis instanceof \RedisCluster) { $hosts = []; foreach ($this->redis->_masters() as $host) { $hosts[] = new RedisClusterNodeProxy($host, $this->redis); } } return $hosts; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/RelayProxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Traits; use Symfony\Component\VarExporter\LazyObjectInterface; use Symfony\Component\VarExporter\LazyProxyTrait; use Symfony\Contracts\Service\ResetInterface; // Help opcache.preload discover always-needed symbols class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class); /** * @internal */ class RelayProxy extends \Relay\Relay implements ResetInterface, LazyObjectInterface { use LazyProxyTrait { resetLazyObject as reset; } private const LAZY_OBJECT_PROPERTY_SCOPES = []; public function __construct($host = null, $port = 6379, $connect_timeout = 0.0, $command_timeout = 0.0, #[\SensitiveParameter] $context = [], $database = 0) { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args()); } public function connect($host, $port = 6379, $timeout = 0.0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0.0, #[\SensitiveParameter] $context = [], $database = 0): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->connect(...\func_get_args()); } public function pconnect($host, $port = 6379, $timeout = 0.0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0.0, #[\SensitiveParameter] $context = [], $database = 0): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pconnect(...\func_get_args()); } public function close(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\func_get_args()); } public function pclose(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pclose(...\func_get_args()); } public function listen($callback): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->listen(...\func_get_args()); } public function onFlushed($callback): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->onFlushed(...\func_get_args()); } public function onInvalidated($callback, $pattern = null): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->onInvalidated(...\func_get_args()); } public function dispatchEvents(): false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dispatchEvents(...\func_get_args()); } public function getOption($option): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getOption(...\func_get_args()); } public function option($option, $value = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->option(...\func_get_args()); } public function setOption($option, $value): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setOption(...\func_get_args()); } public function addIgnorePatterns(...$pattern): int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->addIgnorePatterns(...\func_get_args()); } public function addAllowPatterns(...$pattern): int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->addAllowPatterns(...\func_get_args()); } public function getTimeout(): false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTimeout(...\func_get_args()); } public function timeout(): false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->timeout(...\func_get_args()); } public function getReadTimeout(): false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getReadTimeout(...\func_get_args()); } public function readTimeout(): false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->readTimeout(...\func_get_args()); } public function getBytes(): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getBytes(...\func_get_args()); } public function bytes(): array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bytes(...\func_get_args()); } public function getHost(): false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getHost(...\func_get_args()); } public function isConnected(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->isConnected(...\func_get_args()); } public function getPort(): false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPort(...\func_get_args()); } public function getAuth(): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getAuth(...\func_get_args()); } public function getDbNum(): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDbNum(...\func_get_args()); } public function _serialize($value): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\func_get_args()); } public function _unserialize($value): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\func_get_args()); } public function _compress($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\func_get_args()); } public function _uncompress($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\func_get_args()); } public function _pack($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\func_get_args()); } public function _unpack($value): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\func_get_args()); } public function _prefix($value): string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\func_get_args()); } public function getLastError(): ?string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getLastError(...\func_get_args()); } public function clearLastError(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearLastError(...\func_get_args()); } public function endpointId(): false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->endpointId(...\func_get_args()); } public function getPersistentID(): false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPersistentID(...\func_get_args()); } public function socketId(): false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->socketId(...\func_get_args()); } public function rawCommand($cmd, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawCommand(...\func_get_args()); } public function select($db): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->select(...\func_get_args()); } public function auth(#[\SensitiveParameter] $auth): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\func_get_args()); } public function info(...$sections): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\func_get_args()); } public function flushdb($sync = null): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushdb(...\func_get_args()); } public function flushall($sync = null): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushall(...\func_get_args()); } public function fcall($name, $keys = [], $argv = [], $handler = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall(...\func_get_args()); } public function fcall_ro($name, $keys = [], $argv = [], $handler = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall_ro(...\func_get_args()); } public function function($op, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->function(...\func_get_args()); } public function dbsize(): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbsize(...\func_get_args()); } public function dump($key): \Relay\Relay|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args()); } public function replicaof($host = null, $port = 0): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->replicaof(...\func_get_args()); } public function restore($key, $ttl, $value, $options = null): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\func_get_args()); } public function migrate($host, $port, $key, $dstdb, $timeout, $copy = false, $replace = false, #[\SensitiveParameter] $credentials = null): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->migrate(...\func_get_args()); } public function copy($src, $dst, $options = null): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args()); } public function echo($arg): \Relay\Relay|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\func_get_args()); } public function ping($arg = null): \Relay\Relay|bool|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\func_get_args()); } public function idleTime(): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->idleTime(...\func_get_args()); } public function randomkey(): \Relay\Relay|bool|null|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomkey(...\func_get_args()); } public function time(): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\func_get_args()); } public function bgrewriteaof(): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args()); } public function lastsave(): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastsave(...\func_get_args()); } public function lcs($key1, $key2, $options = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lcs(...\func_get_args()); } public function bgsave($schedule = false): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args()); } public function save(): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\func_get_args()); } public function role(): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\func_get_args()); } public function ttl($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\func_get_args()); } public function pttl($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\func_get_args()); } public function exists(...$keys): \Relay\Relay|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\func_get_args()); } public function eval($script, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\func_get_args()); } public function eval_ro($script, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval_ro(...\func_get_args()); } public function evalsha($sha, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\func_get_args()); } public function evalsha_ro($sha, $args = [], $num_keys = 0): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha_ro(...\func_get_args()); } public function client($operation, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\func_get_args()); } public function geoadd($key, $lng, $lat, $member, ...$other_triples_and_options): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args()); } public function geodist($key, $src, $dst, $unit = null): \Relay\Relay|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args()); } public function geohash($key, $member, ...$other_members): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args()); } public function georadius($key, $lng, $lat, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\func_get_args()); } public function georadiusbymember($key, $member, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\func_get_args()); } public function georadiusbymember_ro($key, $member, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\func_get_args()); } public function georadius_ro($key, $lng, $lat, $radius, $unit, $options = []): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args()); } public function geosearch($key, $position, $shape, $unit, $options = []): \Relay\Relay|array { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\func_get_args()); } public function geosearchstore($dst, $src, $position, $shape, $unit, $options = []): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearchstore(...\func_get_args()); } public function get($key): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\func_get_args()); } public function getset($key, $value): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\func_get_args()); } public function getrange($key, $start, $end): \Relay\Relay|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\func_get_args()); } public function setrange($key, $start, $value): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setrange(...\func_get_args()); } public function getbit($key, $pos): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getbit(...\func_get_args()); } public function bitcount($key, $start = 0, $end = -1, $by_bit = false): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args()); } public function bitfield($key, ...$args): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitfield(...\func_get_args()); } public function config($operation, $key = null, $value = null): \Relay\Relay|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\func_get_args()); } public function command(...$args): \Relay\Relay|array|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\func_get_args()); } public function bitop($operation, $dstkey, $srckey, ...$other_keys): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\func_get_args()); } public function bitpos($key, $bit, $start = null, $end = null, $bybit = false): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\func_get_args()); } public function setbit($key, $pos, $val): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setbit(...\func_get_args()); } public function acl($cmd, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\func_get_args()); } public function append($key, $value): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args()); } public function set($key, $value, $options = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\func_get_args()); } public function getex($key, $options = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getex(...\func_get_args()); } public function getdel($key): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getdel(...\func_get_args()); } public function setex($key, $seconds, $value): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\func_get_args()); } public function pfadd($key, $elements): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args()); } public function pfcount($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args()); } public function pfmerge($dst, $srckeys): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args()); } public function psetex($key, $milliseconds, $value): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\func_get_args()); } public function publish($channel, $message): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args()); } public function pubsub($operation, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\func_get_args()); } public function spublish($channel, $message): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spublish(...\func_get_args()); } public function setnx($key, $value): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\func_get_args()); } public function mget($keys): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args()); } public function move($key, $db): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->move(...\func_get_args()); } public function mset($kvals): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\func_get_args()); } public function msetnx($kvals): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\func_get_args()); } public function rename($key, $newkey): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\func_get_args()); } public function renamenx($key, $newkey): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renamenx(...\func_get_args()); } public function del(...$keys): \Relay\Relay|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\func_get_args()); } public function unlink(...$keys): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\func_get_args()); } public function expire($key, $seconds, $mode = null): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\func_get_args()); } public function pexpire($key, $milliseconds): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\func_get_args()); } public function expireat($key, $timestamp): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireat(...\func_get_args()); } public function expiretime($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expiretime(...\func_get_args()); } public function pexpireat($key, $timestamp_ms): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireat(...\func_get_args()); } public function pexpiretime($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpiretime(...\func_get_args()); } public function persist($key): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\func_get_args()); } public function type($key): \Relay\Relay|bool|int|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args()); } public function lmove($srckey, $dstkey, $srcpos, $dstpos): \Relay\Relay|false|null|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmove(...\func_get_args()); } public function blmove($srckey, $dstkey, $srcpos, $dstpos, $timeout): \Relay\Relay|false|null|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\func_get_args()); } public function lrange($key, $start, $stop): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args()); } public function lpush($key, $mem, ...$mems): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpush(...\func_get_args()); } public function rpush($key, $mem, ...$mems): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpush(...\func_get_args()); } public function lpushx($key, $mem, ...$mems): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpushx(...\func_get_args()); } public function rpushx($key, $mem, ...$mems): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpushx(...\func_get_args()); } public function lset($key, $index, $mem): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lset(...\func_get_args()); } public function lpop($key, $count = 1): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpop(...\func_get_args()); } public function lpos($key, $value, $options = null): \Relay\Relay|array|false|int|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpos(...\func_get_args()); } public function rpop($key, $count = 1): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpop(...\func_get_args()); } public function rpoplpush($source, $dest): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\func_get_args()); } public function brpoplpush($source, $dest, $timeout): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\func_get_args()); } public function blpop($key, $timeout_or_key, ...$extra_args): \Relay\Relay|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blpop(...\func_get_args()); } public function blmpop($timeout, $keys, $from, $count = 1): \Relay\Relay|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmpop(...\func_get_args()); } public function bzmpop($timeout, $keys, $from, $count = 1): \Relay\Relay|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzmpop(...\func_get_args()); } public function lmpop($keys, $from, $count = 1): \Relay\Relay|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmpop(...\func_get_args()); } public function zmpop($keys, $from, $count = 1): \Relay\Relay|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmpop(...\func_get_args()); } public function brpop($key, $timeout_or_key, ...$extra_args): \Relay\Relay|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpop(...\func_get_args()); } public function bzpopmax($key, $timeout_or_key, ...$extra_args): \Relay\Relay|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmax(...\func_get_args()); } public function bzpopmin($key, $timeout_or_key, ...$extra_args): \Relay\Relay|array|false|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmin(...\func_get_args()); } public function object($op, $key): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\func_get_args()); } public function geopos($key, ...$members): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\func_get_args()); } public function lrem($key, $mem, $count = 0): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\func_get_args()); } public function lindex($key, $index): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\func_get_args()); } public function linsert($key, $op, $pivot, $element): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->linsert(...\func_get_args()); } public function ltrim($key, $start, $end): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\func_get_args()); } public function hget($hash, $member): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hget(...\func_get_args()); } public function hstrlen($hash, $member): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hstrlen(...\func_get_args()); } public function hgetall($hash): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetall(...\func_get_args()); } public function hkeys($hash): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hkeys(...\func_get_args()); } public function hvals($hash): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hvals(...\func_get_args()); } public function hmget($hash, $members): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmget(...\func_get_args()); } public function hrandfield($hash, $options = null): \Relay\Relay|array|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hrandfield(...\func_get_args()); } public function hmset($hash, $members): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmset(...\func_get_args()); } public function hexists($hash, $member): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexists(...\func_get_args()); } public function hsetnx($hash, $member, $value): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetnx(...\func_get_args()); } public function hset($key, $mem, $val, ...$kvals): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\func_get_args()); } public function hdel($key, $mem, ...$mems): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hdel(...\func_get_args()); } public function hincrby($key, $mem, $value): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrby(...\func_get_args()); } public function hincrbyfloat($key, $mem, $value): \Relay\Relay|bool|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrbyfloat(...\func_get_args()); } public function incr($key, $by = 1): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\func_get_args()); } public function decr($key, $by = 1): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\func_get_args()); } public function incrby($key, $value): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrby(...\func_get_args()); } public function decrby($key, $value): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrby(...\func_get_args()); } public function incrbyfloat($key, $value): \Relay\Relay|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrbyfloat(...\func_get_args()); } public function sdiff($key, ...$other_keys): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiff(...\func_get_args()); } public function sdiffstore($key, ...$other_keys): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiffstore(...\func_get_args()); } public function sinter($key, ...$other_keys): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinter(...\func_get_args()); } public function sintercard($keys, $limit = -1): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sintercard(...\func_get_args()); } public function sinterstore($key, ...$other_keys): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinterstore(...\func_get_args()); } public function sunion($key, ...$other_keys): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunion(...\func_get_args()); } public function sunionstore($key, ...$other_keys): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunionstore(...\func_get_args()); } public function subscribe($channels, $callback): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\func_get_args()); } public function unsubscribe($channels = []): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\func_get_args()); } public function psubscribe($patterns, $callback): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\func_get_args()); } public function punsubscribe($patterns = []): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\func_get_args()); } public function ssubscribe($channels, $callback): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ssubscribe(...\func_get_args()); } public function sunsubscribe($channels = []): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunsubscribe(...\func_get_args()); } public function touch($key_or_array, ...$more_keys): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->touch(...\func_get_args()); } public function pipeline(): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pipeline(...\func_get_args()); } public function multi($mode = 0): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\func_get_args()); } public function exec(): \Relay\Relay|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\func_get_args()); } public function wait($replicas, $timeout): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->wait(...\func_get_args()); } public function watch($key, ...$other_keys): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args()); } public function unwatch(): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\func_get_args()); } public function discard(): bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\func_get_args()); } public function getMode($masked = false): int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMode(...\func_get_args()); } public function clearBytes(): void { ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearBytes(...\func_get_args()); } public function scan(&$iterator, $match = null, $count = 0, $type = null): array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($iterator, ...\array_slice(\func_get_args(), 1)); } public function hscan($key, &$iterator, $match = null, $count = 0): array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($key, $iterator, ...\array_slice(\func_get_args(), 2)); } public function sscan($key, &$iterator, $match = null, $count = 0): array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($key, $iterator, ...\array_slice(\func_get_args(), 2)); } public function zscan($key, &$iterator, $match = null, $count = 0): array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($key, $iterator, ...\array_slice(\func_get_args(), 2)); } public function keys($pattern): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\func_get_args()); } public function slowlog($operation, ...$extra_args): \Relay\Relay|array|bool|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\func_get_args()); } public function smembers($set): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smembers(...\func_get_args()); } public function sismember($set, $member): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\func_get_args()); } public function smismember($set, ...$members): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smismember(...\func_get_args()); } public function srem($set, $member, ...$members): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\func_get_args()); } public function sadd($set, $member, ...$members): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sadd(...\func_get_args()); } public function sort($key, $options = []): \Relay\Relay|array|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\func_get_args()); } public function sort_ro($key, $options = []): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort_ro(...\func_get_args()); } public function smove($srcset, $dstset, $member): \Relay\Relay|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smove(...\func_get_args()); } public function spop($set, $count = 1): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spop(...\func_get_args()); } public function srandmember($set, $count = 1): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srandmember(...\func_get_args()); } public function scard($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\func_get_args()); } public function script($command, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\func_get_args()); } public function strlen($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\func_get_args()); } public function hlen($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hlen(...\func_get_args()); } public function llen($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->llen(...\func_get_args()); } public function xack($key, $group, $ids): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args()); } public function xadd($key, $id, $values, $maxlen = 0, $approx = false, $nomkstream = false): \Relay\Relay|false|string { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args()); } public function xclaim($key, $group, $consumer, $min_idle, $ids, $options): \Relay\Relay|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args()); } public function xautoclaim($key, $group, $consumer, $min_idle, $start, $count = -1, $justid = false): \Relay\Relay|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xautoclaim(...\func_get_args()); } public function xlen($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\func_get_args()); } public function xgroup($operation, $key = null, $group = null, $id_or_consumer = null, $mkstream = false, $entries_read = -2): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\func_get_args()); } public function xdel($key, $ids): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\func_get_args()); } public function xinfo($operation, $arg1 = null, $arg2 = null, $count = -1): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\func_get_args()); } public function xpending($key, $group, $start = null, $end = null, $count = -1, $consumer = null, $idle = 0): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\func_get_args()); } public function xrange($key, $start, $end, $count = -1): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\func_get_args()); } public function xrevrange($key, $end, $start, $count = -1): \Relay\Relay|array|bool { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\func_get_args()); } public function xread($streams, $count = -1, $block = -1): \Relay\Relay|array|bool|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\func_get_args()); } public function xreadgroup($group, $consumer, $streams, $count = 1, $block = 1): \Relay\Relay|array|bool|null { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\func_get_args()); } public function xtrim($key, $threshold, $approx = false, $minid = false, $limit = -1): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\func_get_args()); } public function zadd($key, ...$args): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zadd(...\func_get_args()); } public function zrandmember($key, $options = null): mixed { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrandmember(...\func_get_args()); } public function zrange($key, $start, $end, $options = null): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrange(...\func_get_args()); } public function zrevrange($key, $start, $end, $options = null): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrange(...\func_get_args()); } public function zrangebyscore($key, $start, $end, $options = null): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebyscore(...\func_get_args()); } public function zrevrangebyscore($key, $start, $end, $options = null): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebyscore(...\func_get_args()); } public function zrangestore($dst, $src, $start, $end, $options = null): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangestore(...\func_get_args()); } public function zrangebylex($key, $min, $max, $offset = -1, $count = -1): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebylex(...\func_get_args()); } public function zrevrangebylex($key, $max, $min, $offset = -1, $count = -1): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebylex(...\func_get_args()); } public function zrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\func_get_args()); } public function zrevrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\func_get_args()); } public function zrem($key, ...$args): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrem(...\func_get_args()); } public function zremrangebylex($key, $min, $max): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebylex(...\func_get_args()); } public function zremrangebyrank($key, $start, $end): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyrank(...\func_get_args()); } public function zremrangebyscore($key, $min, $max): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyscore(...\func_get_args()); } public function zcard($key): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcard(...\func_get_args()); } public function zcount($key, $min, $max): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcount(...\func_get_args()); } public function zdiff($keys, $options = null): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiff(...\func_get_args()); } public function zdiffstore($dst, $keys): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiffstore(...\func_get_args()); } public function zincrby($key, $score, $mem): \Relay\Relay|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zincrby(...\func_get_args()); } public function zlexcount($key, $min, $max): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zlexcount(...\func_get_args()); } public function zmscore($key, ...$mems): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmscore(...\func_get_args()); } public function zscore($key, $member): \Relay\Relay|false|float { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\func_get_args()); } public function zinter($keys, $weights = null, $options = null): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinter(...\func_get_args()); } public function zintercard($keys, $limit = -1): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zintercard(...\func_get_args()); } public function zinterstore($dst, $keys, $weights = null, $options = null): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\func_get_args()); } public function zunion($keys, $weights = null, $options = null): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunion(...\func_get_args()); } public function zunionstore($dst, $keys, $weights = null, $options = null): \Relay\Relay|false|int { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\func_get_args()); } public function zpopmin($key, $count = 1): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmin(...\func_get_args()); } public function zpopmax($key, $count = 1): \Relay\Relay|array|false { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmax(...\func_get_args()); } public function _getKeys() { return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_getKeys(...\func_get_args()); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/Traits/ValueWrapper.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * A short namespace-less class to serialize items with metadata. * * @author Nicolas Grekas * * @internal */ class { private const EXPIRY_OFFSET = 1648206727; private const INT32_MAX = 2147483647; public readonly mixed $value; public readonly array $metadata; public function __construct(mixed $value, array $metadata) { $this->value = $value; $this->metadata = $metadata; } public function __serialize(): array { // pack 31-bits ctime into 14bits $c = $this->metadata['ctime'] ?? 0; $c = match (true) { $c > self::INT32_MAX - 2 => self::INT32_MAX, $c > 0 => 1 + $c, default => 1, }; $e = 0; while (!(0x40000000 & $c)) { $c <<= 1; ++$e; } $c = (0x7FE0 & ($c >> 16)) | $e; $pack = pack('Vn', (int) (0.1 + ($this->metadata['expiry'] ?: self::INT32_MAX + self::EXPIRY_OFFSET) - self::EXPIRY_OFFSET), $c); if (isset($this->metadata['tags'])) { $pack[4] = $pack[4] | "\x80"; } return [$pack => $this->value] + ($this->metadata['tags'] ?? []); } public function __unserialize(array $data): void { $pack = array_key_first($data); $this->value = $data[$pack]; if ($hasTags = "\x80" === ($pack[4] & "\x80")) { unset($data[$pack]); $pack[4] = $pack[4] & "\x7F"; } $metadata = unpack('Vexpiry/nctime', $pack); $metadata['expiry'] += self::EXPIRY_OFFSET; if (!$metadata['ctime'] = ((0x4000 | $metadata['ctime']) << 16 >> (0x1F & $metadata['ctime'])) - 1) { unset($metadata['ctime']); } if ($hasTags) { $metadata['tags'] = $data; } $this->metadata = $metadata; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache/composer.json ================================================ { "name": "symfony/cache", "type": "library", "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", "keywords": ["caching", "psr6"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "provide": { "psr/cache-implementation": "2.0|3.0", "psr/simple-cache-implementation": "1.0|2.0|3.0", "symfony/cache-implementation": "1.1|2.0|3.0" }, "require": { "php": ">=8.1", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", "symfony/cache-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3", "symfony/var-exporter": "^6.3.6|^7.0" }, "require-dev": { "cache/integration-tests": "dev-master", "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", "symfony/config": "^5.4|^6.0|^7.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/filesystem": "^5.4|^6.0|^7.0", "symfony/http-kernel": "^5.4|^6.0|^7.0", "symfony/messenger": "^5.4|^6.0|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "conflict": { "doctrine/dbal": "<2.13.1", "symfony/dependency-injection": "<5.4", "symfony/http-kernel": "<5.4", "symfony/var-dumper": "<5.4" }, "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" }, "classmap": [ "Traits/ValueWrapper.php" ], "exclude-from-classmap": [ "/Tests/" ] }, "minimum-stability": "dev" } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache-contracts/CHANGELOG.md ================================================ CHANGELOG ========= The changelog is maintained for all Symfony contracts at the following URL: https://github.com/symfony/contracts/blob/main/CHANGELOG.md ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache-contracts/CacheInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Cache; use Psr\Cache\CacheItemInterface; use Psr\Cache\InvalidArgumentException; /** * Covers most simple to advanced caching needs. * * @author Nicolas Grekas */ interface CacheInterface { /** * Fetches a value from the pool or computes it if not found. * * On cache misses, a callback is called that should return the missing value. * This callback is given a PSR-6 CacheItemInterface instance corresponding to the * requested key, that could be used e.g. for expiration control. It could also * be an ItemInterface instance when its additional features are needed. * * @template T * * @param string $key The key of the item to retrieve from the cache * @param (callable(CacheItemInterface,bool):T)|(callable(ItemInterface,bool):T)|CallbackInterface $callback * @param float|null $beta A float that, as it grows, controls the likeliness of triggering * early expiration. 0 disables it, INF forces immediate expiration. * The default (or providing null) is implementation dependent but should * typically be 1.0, which should provide optimal stampede protection. * See https://en.wikipedia.org/wiki/Cache_stampede#Probabilistic_early_expiration * @param array &$metadata The metadata of the cached item {@see ItemInterface::getMetadata()} * * @return T * * @throws InvalidArgumentException When $key is not valid or when $beta is negative */ public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed; /** * Removes an item from the pool. * * @param string $key The key to delete * * @return bool True if the item was successfully removed, false if there was any error * * @throws InvalidArgumentException When $key is not valid */ public function delete(string $key): bool; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache-contracts/CacheTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Cache; use Psr\Cache\CacheItemPoolInterface; use Psr\Cache\InvalidArgumentException; use Psr\Log\LoggerInterface; // Help opcache.preload discover always-needed symbols class_exists(InvalidArgumentException::class); /** * An implementation of CacheInterface for PSR-6 CacheItemPoolInterface classes. * * @author Nicolas Grekas */ trait CacheTrait { public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed { return $this->doGet($this, $key, $callback, $beta, $metadata); } public function delete(string $key): bool { return $this->deleteItem($key); } private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, ?array &$metadata = null, ?LoggerInterface $logger = null): mixed { if (0 > $beta ??= 1.0) { throw new class(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)) extends \InvalidArgumentException implements InvalidArgumentException {}; } $item = $pool->getItem($key); $recompute = !$item->isHit() || \INF === $beta; $metadata = $item instanceof ItemInterface ? $item->getMetadata() : []; if (!$recompute && $metadata) { $expiry = $metadata[ItemInterface::METADATA_EXPIRY] ?? false; $ctime = $metadata[ItemInterface::METADATA_CTIME] ?? false; if ($recompute = $ctime && $expiry && $expiry <= ($now = microtime(true)) - $ctime / 1000 * $beta * log(random_int(1, \PHP_INT_MAX) / \PHP_INT_MAX)) { // force applying defaultLifetime to expiry $item->expiresAt(null); $logger?->info('Item "{key}" elected for early recomputation {delta}s before its expiration', [ 'key' => $key, 'delta' => sprintf('%.1f', $expiry - $now), ]); } } if ($recompute) { $save = true; $item->set($callback($item, $save)); if ($save) { $pool->save($item); } } return $item->get(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache-contracts/CallbackInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Cache; use Psr\Cache\CacheItemInterface; /** * Computes and returns the cached value of an item. * * @author Nicolas Grekas * * @template T */ interface CallbackInterface { /** * @param CacheItemInterface|ItemInterface $item The item to compute the value for * @param bool &$save Should be set to false when the value should not be saved in the pool * * @return T The computed value for the passed item */ public function __invoke(CacheItemInterface $item, bool &$save): mixed; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache-contracts/ItemInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Cache; use Psr\Cache\CacheException; use Psr\Cache\CacheItemInterface; use Psr\Cache\InvalidArgumentException; /** * Augments PSR-6's CacheItemInterface with support for tags and metadata. * * @author Nicolas Grekas */ interface ItemInterface extends CacheItemInterface { /** * References the Unix timestamp stating when the item will expire. */ public const METADATA_EXPIRY = 'expiry'; /** * References the time the item took to be created, in milliseconds. */ public const METADATA_CTIME = 'ctime'; /** * References the list of tags that were assigned to the item, as string[]. */ public const METADATA_TAGS = 'tags'; /** * Reserved characters that cannot be used in a key or tag. */ public const RESERVED_CHARACTERS = '{}()/\@:'; /** * Adds a tag to a cache item. * * Tags are strings that follow the same validation rules as keys. * * @param string|string[] $tags A tag or array of tags * * @return $this * * @throws InvalidArgumentException When $tag is not valid * @throws CacheException When the item comes from a pool that is not tag-aware */ public function tag(string|iterable $tags): static; /** * Returns a list of metadata info that were saved alongside with the cached value. * * See ItemInterface::METADATA_* consts for keys potentially found in the returned array. */ public function getMetadata(): array; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache-contracts/LICENSE ================================================ Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache-contracts/README.md ================================================ Symfony Cache Contracts ======================= A set of abstractions extracted out of the Symfony components. Can be used to build on semantics that the Symfony components proved useful and that already have battle tested implementations. See https://github.com/symfony/contracts/blob/main/README.md for more information. ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache-contracts/TagAwareCacheInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Cache; use Psr\Cache\InvalidArgumentException; /** * Allows invalidating cached items using tags. * * @author Nicolas Grekas */ interface TagAwareCacheInterface extends CacheInterface { /** * Invalidates cached items using tags. * * When implemented on a PSR-6 pool, invalidation should not apply * to deferred items. Instead, they should be committed as usual. * This allows replacing old tagged values by new ones without * race conditions. * * @param string[] $tags An array of tags to invalidate * * @return bool True on success * * @throws InvalidArgumentException When $tags is not valid */ public function invalidateTags(array $tags): bool; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/cache-contracts/composer.json ================================================ { "name": "symfony/cache-contracts", "type": "library", "description": "Generic abstractions related to caching", "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=8.1", "psr/cache": "^3.0" }, "autoload": { "psr-4": { "Symfony\\Contracts\\Cache\\": "" } }, "minimum-stability": "dev", "extra": { "branch-alias": { "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", "url": "https://github.com/symfony/contracts" } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/deprecation-contracts/CHANGELOG.md ================================================ CHANGELOG ========= The changelog is maintained for all Symfony contracts at the following URL: https://github.com/symfony/contracts/blob/main/CHANGELOG.md ================================================ FILE: core/widget/wechatServer/vendor/symfony/deprecation-contracts/LICENSE ================================================ Copyright (c) 2020-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/deprecation-contracts/README.md ================================================ Symfony Deprecation Contracts ============================= A generic function and convention to trigger deprecation notices. This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices. By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component, the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments. The function requires at least 3 arguments: - the name of the Composer package that is triggering the deprecation - the version of the package that introduced the deprecation - the message of the deprecation - more arguments can be provided: they will be inserted in the message using `printf()` formatting Example: ```php trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin'); ``` This will generate the following message: `Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.` While not recommended, the deprecation notices can be completely ignored by declaring an empty `function trigger_deprecation() {}` in your application. ================================================ FILE: core/widget/wechatServer/vendor/symfony/deprecation-contracts/composer.json ================================================ { "name": "symfony/deprecation-contracts", "type": "library", "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=8.1" }, "autoload": { "files": [ "function.php" ] }, "minimum-stability": "dev", "extra": { "branch-alias": { "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", "url": "https://github.com/symfony/contracts" } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/deprecation-contracts/function.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (!function_exists('trigger_deprecation')) { /** * Triggers a silenced deprecation notice. * * @param string $package The name of the Composer package that is triggering the deprecation * @param string $version The version of the package that introduced the deprecation * @param string $message The message of the deprecation * @param mixed ...$args Values to insert in the message using printf() formatting * * @author Nicolas Grekas */ function trigger_deprecation(string $package, string $version, string $message, mixed ...$args): void { @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/Attribute/AsEventListener.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\EventDispatcher\Attribute; /** * Service tag to autoconfigure event listeners. * * @author Alexander M. Turek */ #[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] class AsEventListener { public function __construct( public ?string $event = null, public ?string $method = null, public int $priority = 0, public ?string $dispatcher = null, ) { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/CHANGELOG.md ================================================ CHANGELOG ========= 6.0 --- * Remove `LegacyEventDispatcherProxy` 5.4 --- * Allow `#[AsEventListener]` attribute on methods 5.3 --- * Add `#[AsEventListener]` attribute for declaring listeners on PHP 8 5.1.0 ----- * The `LegacyEventDispatcherProxy` class has been deprecated. * Added an optional `dispatcher` attribute to the listener and subscriber tags in `RegisterListenerPass`. 5.0.0 ----- * The signature of the `EventDispatcherInterface::dispatch()` method has been changed to `dispatch($event, string $eventName = null): object`. * The `Event` class has been removed in favor of `Symfony\Contracts\EventDispatcher\Event`. * The `TraceableEventDispatcherInterface` has been removed. * The `WrappedListener` class is now final. 4.4.0 ----- * `AddEventAliasesPass` has been added, allowing applications and bundles to extend the event alias mapping used by `RegisterListenersPass`. * Made the `event` attribute of the `kernel.event_listener` tag optional for FQCN events. 4.3.0 ----- * The signature of the `EventDispatcherInterface::dispatch()` method should be updated to `dispatch($event, string $eventName = null)`, not doing so is deprecated * deprecated the `Event` class, use `Symfony\Contracts\EventDispatcher\Event` instead 4.1.0 ----- * added support for invokable event listeners tagged with `kernel.event_listener` by default * The `TraceableEventDispatcher::getOrphanedEvents()` method has been added. * The `TraceableEventDispatcherInterface` has been deprecated. 4.0.0 ----- * removed the `ContainerAwareEventDispatcher` class * added the `reset()` method to the `TraceableEventDispatcherInterface` 3.4.0 ----- * Implementing `TraceableEventDispatcherInterface` without the `reset()` method has been deprecated. 3.3.0 ----- * The ContainerAwareEventDispatcher class has been deprecated. Use EventDispatcher with closure factories instead. 3.0.0 ----- * The method `getListenerPriority($eventName, $listener)` has been added to the `EventDispatcherInterface`. * The methods `Event::setDispatcher()`, `Event::getDispatcher()`, `Event::setName()` and `Event::getName()` have been removed. The event dispatcher and the event name are passed to the listener call. 2.5.0 ----- * added Debug\TraceableEventDispatcher (originally in HttpKernel) * changed Debug\TraceableEventDispatcherInterface to extend EventDispatcherInterface * added RegisterListenersPass (originally in HttpKernel) 2.1.0 ----- * added TraceableEventDispatcherInterface * added ContainerAwareEventDispatcher * added a reference to the EventDispatcher on the Event * added a reference to the Event name on the event * added fluid interface to the dispatch() method which now returns the Event object * added GenericEvent event class * added the possibility for subscribers to subscribe several times for the same event * added ImmutableEventDispatcher ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\EventDispatcher\Debug; use Psr\EventDispatcher\StoppableEventInterface; use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Stopwatch\Stopwatch; use Symfony\Contracts\Service\ResetInterface; /** * Collects some data about event listeners. * * This event dispatcher delegates the dispatching to another one. * * @author Fabien Potencier */ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterface { protected $logger; protected $stopwatch; /** * @var \SplObjectStorage|null */ private ?\SplObjectStorage $callStack = null; private EventDispatcherInterface $dispatcher; private array $wrappedListeners = []; private array $orphanedEvents = []; private ?RequestStack $requestStack; private string $currentRequestHash = ''; public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, ?LoggerInterface $logger = null, ?RequestStack $requestStack = null) { $this->dispatcher = $dispatcher; $this->stopwatch = $stopwatch; $this->logger = $logger; $this->requestStack = $requestStack; } /** * @return void */ public function addListener(string $eventName, callable|array $listener, int $priority = 0) { $this->dispatcher->addListener($eventName, $listener, $priority); } /** * @return void */ public function addSubscriber(EventSubscriberInterface $subscriber) { $this->dispatcher->addSubscriber($subscriber); } /** * @return void */ public function removeListener(string $eventName, callable|array $listener) { if (isset($this->wrappedListeners[$eventName])) { foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) { $listener = $wrappedListener; unset($this->wrappedListeners[$eventName][$index]); break; } } } $this->dispatcher->removeListener($eventName, $listener); } /** * @return void */ public function removeSubscriber(EventSubscriberInterface $subscriber) { $this->dispatcher->removeSubscriber($subscriber); } public function getListeners(?string $eventName = null): array { return $this->dispatcher->getListeners($eventName); } public function getListenerPriority(string $eventName, callable|array $listener): ?int { // we might have wrapped listeners for the event (if called while dispatching) // in that case get the priority by wrapper if (isset($this->wrappedListeners[$eventName])) { foreach ($this->wrappedListeners[$eventName] as $wrappedListener) { if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) { return $this->dispatcher->getListenerPriority($eventName, $wrappedListener); } } } return $this->dispatcher->getListenerPriority($eventName, $listener); } public function hasListeners(?string $eventName = null): bool { return $this->dispatcher->hasListeners($eventName); } public function dispatch(object $event, ?string $eventName = null): object { $eventName ??= $event::class; $this->callStack ??= new \SplObjectStorage(); $currentRequestHash = $this->currentRequestHash = $this->requestStack && ($request = $this->requestStack->getCurrentRequest()) ? spl_object_hash($request) : ''; if (null !== $this->logger && $event instanceof StoppableEventInterface && $event->isPropagationStopped()) { $this->logger->debug(sprintf('The "%s" event is already stopped. No listeners have been called.', $eventName)); } $this->preProcess($eventName); try { $this->beforeDispatch($eventName, $event); try { $e = $this->stopwatch->start($eventName, 'section'); try { $this->dispatcher->dispatch($event, $eventName); } finally { if ($e->isStarted()) { $e->stop(); } } } finally { $this->afterDispatch($eventName, $event); } } finally { $this->currentRequestHash = $currentRequestHash; $this->postProcess($eventName); } return $event; } public function getCalledListeners(?Request $request = null): array { if (null === $this->callStack) { return []; } $hash = $request ? spl_object_hash($request) : null; $called = []; foreach ($this->callStack as $listener) { [$eventName, $requestHash] = $this->callStack->getInfo(); if (null === $hash || $hash === $requestHash) { $called[] = $listener->getInfo($eventName); } } return $called; } public function getNotCalledListeners(?Request $request = null): array { try { $allListeners = $this->dispatcher instanceof EventDispatcher ? $this->getListenersWithPriority() : $this->getListenersWithoutPriority(); } catch (\Exception $e) { $this->logger?->info('An exception was thrown while getting the uncalled listeners.', ['exception' => $e]); // unable to retrieve the uncalled listeners return []; } $hash = $request ? spl_object_hash($request) : null; $calledListeners = []; if (null !== $this->callStack) { foreach ($this->callStack as $calledListener) { [, $requestHash] = $this->callStack->getInfo(); if (null === $hash || $hash === $requestHash) { $calledListeners[] = $calledListener->getWrappedListener(); } } } $notCalled = []; foreach ($allListeners as $eventName => $listeners) { foreach ($listeners as [$listener, $priority]) { if (!\in_array($listener, $calledListeners, true)) { if (!$listener instanceof WrappedListener) { $listener = new WrappedListener($listener, null, $this->stopwatch, $this, $priority); } $notCalled[] = $listener->getInfo($eventName); } } } uasort($notCalled, $this->sortNotCalledListeners(...)); return $notCalled; } public function getOrphanedEvents(?Request $request = null): array { if ($request) { return $this->orphanedEvents[spl_object_hash($request)] ?? []; } if (!$this->orphanedEvents) { return []; } return array_merge(...array_values($this->orphanedEvents)); } /** * @return void */ public function reset() { $this->callStack = null; $this->orphanedEvents = []; $this->currentRequestHash = ''; } /** * Proxies all method calls to the original event dispatcher. * * @param string $method The method name * @param array $arguments The method arguments */ public function __call(string $method, array $arguments): mixed { return $this->dispatcher->{$method}(...$arguments); } /** * Called before dispatching the event. * * @return void */ protected function beforeDispatch(string $eventName, object $event) { } /** * Called after dispatching the event. * * @return void */ protected function afterDispatch(string $eventName, object $event) { } private function preProcess(string $eventName): void { if (!$this->dispatcher->hasListeners($eventName)) { $this->orphanedEvents[$this->currentRequestHash][] = $eventName; return; } foreach ($this->dispatcher->getListeners($eventName) as $listener) { $priority = $this->getListenerPriority($eventName, $listener); $wrappedListener = new WrappedListener($listener instanceof WrappedListener ? $listener->getWrappedListener() : $listener, null, $this->stopwatch, $this); $this->wrappedListeners[$eventName][] = $wrappedListener; $this->dispatcher->removeListener($eventName, $listener); $this->dispatcher->addListener($eventName, $wrappedListener, $priority); $this->callStack->attach($wrappedListener, [$eventName, $this->currentRequestHash]); } } private function postProcess(string $eventName): void { unset($this->wrappedListeners[$eventName]); $skipped = false; foreach ($this->dispatcher->getListeners($eventName) as $listener) { if (!$listener instanceof WrappedListener) { // #12845: a new listener was added during dispatch. continue; } // Unwrap listener $priority = $this->getListenerPriority($eventName, $listener); $this->dispatcher->removeListener($eventName, $listener); $this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority); if (null !== $this->logger) { $context = ['event' => $eventName, 'listener' => $listener->getPretty()]; } if ($listener->wasCalled()) { $this->logger?->debug('Notified event "{event}" to listener "{listener}".', $context); } else { $this->callStack->detach($listener); } if (null !== $this->logger && $skipped) { $this->logger->debug('Listener "{listener}" was not called for event "{event}".', $context); } if ($listener->stoppedPropagation()) { $this->logger?->debug('Listener "{listener}" stopped propagation of the event "{event}".', $context); $skipped = true; } } } private function sortNotCalledListeners(array $a, array $b): int { if (0 !== $cmp = strcmp($a['event'], $b['event'])) { return $cmp; } if (\is_int($a['priority']) && !\is_int($b['priority'])) { return 1; } if (!\is_int($a['priority']) && \is_int($b['priority'])) { return -1; } if ($a['priority'] === $b['priority']) { return 0; } if ($a['priority'] > $b['priority']) { return -1; } return 1; } private function getListenersWithPriority(): array { $result = []; $allListeners = new \ReflectionProperty(EventDispatcher::class, 'listeners'); foreach ($allListeners->getValue($this->dispatcher) as $eventName => $listenersByPriority) { foreach ($listenersByPriority as $priority => $listeners) { foreach ($listeners as $listener) { $result[$eventName][] = [$listener, $priority]; } } } return $result; } private function getListenersWithoutPriority(): array { $result = []; foreach ($this->getListeners() as $eventName => $listeners) { foreach ($listeners as $listener) { $result[$eventName][] = [$listener, null]; } } return $result; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/Debug/WrappedListener.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\EventDispatcher\Debug; use Psr\EventDispatcher\StoppableEventInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\Stopwatch\Stopwatch; use Symfony\Component\VarDumper\Caster\ClassStub; /** * @author Fabien Potencier */ final class WrappedListener { private string|array|object $listener; private ?\Closure $optimizedListener; private string $name; private bool $called = false; private bool $stoppedPropagation = false; private Stopwatch $stopwatch; private ?EventDispatcherInterface $dispatcher; private string $pretty; private string $callableRef; private ClassStub|string $stub; private ?int $priority = null; private static bool $hasClassStub; public function __construct(callable|array $listener, ?string $name, Stopwatch $stopwatch, ?EventDispatcherInterface $dispatcher = null, ?int $priority = null) { $this->listener = $listener; $this->optimizedListener = $listener instanceof \Closure ? $listener : (\is_callable($listener) ? $listener(...) : null); $this->stopwatch = $stopwatch; $this->dispatcher = $dispatcher; $this->priority = $priority; if (\is_array($listener)) { [$this->name, $this->callableRef] = $this->parseListener($listener); $this->pretty = $this->name.'::'.$listener[1]; $this->callableRef .= '::'.$listener[1]; } elseif ($listener instanceof \Closure) { $r = new \ReflectionFunction($listener); if (str_contains($r->name, '{closure')) { $this->pretty = $this->name = 'closure'; } elseif ($class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass()) { $this->name = $class->name; $this->pretty = $this->name.'::'.$r->name; } else { $this->pretty = $this->name = $r->name; } } elseif (\is_string($listener)) { $this->pretty = $this->name = $listener; } else { $this->name = get_debug_type($listener); $this->pretty = $this->name.'::__invoke'; $this->callableRef = $listener::class.'::__invoke'; } if (null !== $name) { $this->name = $name; } self::$hasClassStub ??= class_exists(ClassStub::class); } public function getWrappedListener(): callable|array { return $this->listener; } public function wasCalled(): bool { return $this->called; } public function stoppedPropagation(): bool { return $this->stoppedPropagation; } public function getPretty(): string { return $this->pretty; } public function getInfo(string $eventName): array { $this->stub ??= self::$hasClassStub ? new ClassStub($this->pretty.'()', $this->callableRef ?? $this->listener) : $this->pretty.'()'; return [ 'event' => $eventName, 'priority' => $this->priority ??= $this->dispatcher?->getListenerPriority($eventName, $this->listener), 'pretty' => $this->pretty, 'stub' => $this->stub, ]; } public function __invoke(object $event, string $eventName, EventDispatcherInterface $dispatcher): void { $dispatcher = $this->dispatcher ?: $dispatcher; $this->called = true; $this->priority ??= $dispatcher->getListenerPriority($eventName, $this->listener); $e = $this->stopwatch->start($this->name, 'event_listener'); try { ($this->optimizedListener ?? $this->listener)($event, $eventName, $dispatcher); } finally { if ($e->isStarted()) { $e->stop(); } } if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) { $this->stoppedPropagation = true; } } private function parseListener(array $listener): array { if ($listener[0] instanceof \Closure) { foreach ((new \ReflectionFunction($listener[0]))->getAttributes(\Closure::class) as $attribute) { if ($name = $attribute->getArguments()['name'] ?? false) { return [$name, $attribute->getArguments()['class'] ?? $name]; } } } if (\is_object($listener[0])) { return [get_debug_type($listener[0]), $listener[0]::class]; } return [$listener[0], $listener[0]]; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\EventDispatcher\DependencyInjection; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; /** * This pass allows bundles to extend the list of event aliases. * * @author Alexander M. Turek */ class AddEventAliasesPass implements CompilerPassInterface { private array $eventAliases; public function __construct(array $eventAliases) { $this->eventAliases = $eventAliases; } public function process(ContainerBuilder $container): void { $eventAliases = $container->hasParameter('event_dispatcher.event_aliases') ? $container->getParameter('event_dispatcher.event_aliases') : []; $container->setParameter( 'event_dispatcher.event_aliases', array_merge($eventAliases, $this->eventAliases) ); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\EventDispatcher\DependencyInjection; use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Contracts\EventDispatcher\Event; /** * Compiler pass to register tagged services for an event dispatcher. */ class RegisterListenersPass implements CompilerPassInterface { private array $hotPathEvents = []; private array $noPreloadEvents = []; /** * @return $this */ public function setHotPathEvents(array $hotPathEvents): static { $this->hotPathEvents = array_flip($hotPathEvents); return $this; } /** * @return $this */ public function setNoPreloadEvents(array $noPreloadEvents): static { $this->noPreloadEvents = array_flip($noPreloadEvents); return $this; } /** * @return void */ public function process(ContainerBuilder $container) { if (!$container->hasDefinition('event_dispatcher') && !$container->hasAlias('event_dispatcher')) { return; } $aliases = []; if ($container->hasParameter('event_dispatcher.event_aliases')) { $aliases = $container->getParameter('event_dispatcher.event_aliases'); } $globalDispatcherDefinition = $container->findDefinition('event_dispatcher'); foreach ($container->findTaggedServiceIds('kernel.event_listener', true) as $id => $events) { $noPreload = 0; foreach ($events as $event) { $priority = $event['priority'] ?? 0; if (!isset($event['event'])) { if ($container->getDefinition($id)->hasTag('kernel.event_subscriber')) { continue; } $event['method'] ??= '__invoke'; $event['event'] = $this->getEventFromTypeDeclaration($container, $id, $event['method']); } $event['event'] = $aliases[$event['event']] ?? $event['event']; if (!isset($event['method'])) { $event['method'] = 'on'.preg_replace_callback([ '/(?<=\b|_)[a-z]/i', '/[^a-z0-9]/i', ], fn ($matches) => strtoupper($matches[0]), $event['event']); $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']); if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method'])) { if (!$r->hasMethod('__invoke')) { throw new InvalidArgumentException(sprintf('None of the "%s" or "__invoke" methods exist for the service "%s". Please define the "method" attribute on "kernel.event_listener" tags.', $event['method'], $id)); } $event['method'] = '__invoke'; } } $dispatcherDefinition = $globalDispatcherDefinition; if (isset($event['dispatcher'])) { $dispatcherDefinition = $container->findDefinition($event['dispatcher']); } $dispatcherDefinition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]); if (isset($this->hotPathEvents[$event['event']])) { $container->getDefinition($id)->addTag('container.hot_path'); } elseif (isset($this->noPreloadEvents[$event['event']])) { ++$noPreload; } } if ($noPreload && \count($events) === $noPreload) { $container->getDefinition($id)->addTag('container.no_preload'); } } $extractingDispatcher = new ExtractingEventDispatcher(); foreach ($container->findTaggedServiceIds('kernel.event_subscriber', true) as $id => $tags) { $def = $container->getDefinition($id); // We must assume that the class value has been correctly filled, even if the service is created by a factory $class = $def->getClass(); if (!$r = $container->getReflectionClass($class)) { throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); } if (!$r->isSubclassOf(EventSubscriberInterface::class)) { throw new InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, EventSubscriberInterface::class)); } $class = $r->name; $dispatcherDefinitions = []; foreach ($tags as $attributes) { if (!isset($attributes['dispatcher']) || isset($dispatcherDefinitions[$attributes['dispatcher']])) { continue; } $dispatcherDefinitions[$attributes['dispatcher']] = $container->findDefinition($attributes['dispatcher']); } if (!$dispatcherDefinitions) { $dispatcherDefinitions = [$globalDispatcherDefinition]; } $noPreload = 0; ExtractingEventDispatcher::$aliases = $aliases; ExtractingEventDispatcher::$subscriber = $class; $extractingDispatcher->addSubscriber($extractingDispatcher); foreach ($extractingDispatcher->listeners as $args) { $args[1] = [new ServiceClosureArgument(new Reference($id)), $args[1]]; foreach ($dispatcherDefinitions as $dispatcherDefinition) { $dispatcherDefinition->addMethodCall('addListener', $args); } if (isset($this->hotPathEvents[$args[0]])) { $container->getDefinition($id)->addTag('container.hot_path'); } elseif (isset($this->noPreloadEvents[$args[0]])) { ++$noPreload; } } if ($noPreload && \count($extractingDispatcher->listeners) === $noPreload) { $container->getDefinition($id)->addTag('container.no_preload'); } $extractingDispatcher->listeners = []; ExtractingEventDispatcher::$aliases = []; } } private function getEventFromTypeDeclaration(ContainerBuilder $container, string $id, string $method): string { if ( null === ($class = $container->getDefinition($id)->getClass()) || !($r = $container->getReflectionClass($class, false)) || !$r->hasMethod($method) || 1 > ($m = $r->getMethod($method))->getNumberOfParameters() || !($type = $m->getParameters()[0]->getType()) instanceof \ReflectionNamedType || $type->isBuiltin() || Event::class === ($name = $type->getName()) ) { throw new InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "kernel.event_listener" tags.', $id)); } return $name; } } /** * @internal */ class ExtractingEventDispatcher extends EventDispatcher implements EventSubscriberInterface { public array $listeners = []; public static array $aliases = []; public static string $subscriber; public function addListener(string $eventName, callable|array $listener, int $priority = 0): void { $this->listeners[] = [$eventName, $listener[1], $priority]; } public static function getSubscribedEvents(): array { $events = []; foreach ([self::$subscriber, 'getSubscribedEvents']() as $eventName => $params) { $events[self::$aliases[$eventName] ?? $eventName] = $params; } return $events; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/EventDispatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\EventDispatcher; use Psr\EventDispatcher\StoppableEventInterface; use Symfony\Component\EventDispatcher\Debug\WrappedListener; /** * The EventDispatcherInterface is the central point of Symfony's event listener system. * * Listeners are registered on the manager and events are dispatched through the * manager. * * @author Guilherme Blanco * @author Jonathan Wage * @author Roman Borschel * @author Bernhard Schussek * @author Fabien Potencier * @author Jordi Boggiano * @author Jordan Alliot * @author Nicolas Grekas */ class EventDispatcher implements EventDispatcherInterface { private array $listeners = []; private array $sorted = []; private array $optimized; public function __construct() { if (__CLASS__ === static::class) { $this->optimized = []; } } public function dispatch(object $event, ?string $eventName = null): object { $eventName ??= $event::class; if (isset($this->optimized)) { $listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName]) ? [] : $this->optimizeListeners($eventName)); } else { $listeners = $this->getListeners($eventName); } if ($listeners) { $this->callListeners($listeners, $eventName, $event); } return $event; } public function getListeners(?string $eventName = null): array { if (null !== $eventName) { if (empty($this->listeners[$eventName])) { return []; } if (!isset($this->sorted[$eventName])) { $this->sortListeners($eventName); } return $this->sorted[$eventName]; } foreach ($this->listeners as $eventName => $eventListeners) { if (!isset($this->sorted[$eventName])) { $this->sortListeners($eventName); } } return array_filter($this->sorted); } public function getListenerPriority(string $eventName, callable|array $listener): ?int { if (empty($this->listeners[$eventName])) { return null; } if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { $listener[0] = $listener[0](); $listener[1] ??= '__invoke'; } foreach ($this->listeners[$eventName] as $priority => &$listeners) { foreach ($listeners as &$v) { if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { $v[0] = $v[0](); $v[1] ??= '__invoke'; } if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) { return $priority; } } } return null; } public function hasListeners(?string $eventName = null): bool { if (null !== $eventName) { return !empty($this->listeners[$eventName]); } foreach ($this->listeners as $eventListeners) { if ($eventListeners) { return true; } } return false; } /** * @return void */ public function addListener(string $eventName, callable|array $listener, int $priority = 0) { $this->listeners[$eventName][$priority][] = $listener; unset($this->sorted[$eventName], $this->optimized[$eventName]); } /** * @return void */ public function removeListener(string $eventName, callable|array $listener) { if (empty($this->listeners[$eventName])) { return; } if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { $listener[0] = $listener[0](); $listener[1] ??= '__invoke'; } foreach ($this->listeners[$eventName] as $priority => &$listeners) { foreach ($listeners as $k => &$v) { if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { $v[0] = $v[0](); $v[1] ??= '__invoke'; } if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) { unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]); } } if (!$listeners) { unset($this->listeners[$eventName][$priority]); } } } /** * @return void */ public function addSubscriber(EventSubscriberInterface $subscriber) { foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { if (\is_string($params)) { $this->addListener($eventName, [$subscriber, $params]); } elseif (\is_string($params[0])) { $this->addListener($eventName, [$subscriber, $params[0]], $params[1] ?? 0); } else { foreach ($params as $listener) { $this->addListener($eventName, [$subscriber, $listener[0]], $listener[1] ?? 0); } } } } /** * @return void */ public function removeSubscriber(EventSubscriberInterface $subscriber) { foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { if (\is_array($params) && \is_array($params[0])) { foreach ($params as $listener) { $this->removeListener($eventName, [$subscriber, $listener[0]]); } } else { $this->removeListener($eventName, [$subscriber, \is_string($params) ? $params : $params[0]]); } } } /** * Triggers the listeners of an event. * * This method can be overridden to add functionality that is executed * for each listener. * * @param callable[] $listeners The event listeners * @param string $eventName The name of the event to dispatch * @param object $event The event object to pass to the event handlers/listeners * * @return void */ protected function callListeners(iterable $listeners, string $eventName, object $event) { $stoppable = $event instanceof StoppableEventInterface; foreach ($listeners as $listener) { if ($stoppable && $event->isPropagationStopped()) { break; } $listener($event, $eventName, $this); } } /** * Sorts the internal list of listeners for the given event by priority. */ private function sortListeners(string $eventName): void { krsort($this->listeners[$eventName]); $this->sorted[$eventName] = []; foreach ($this->listeners[$eventName] as &$listeners) { foreach ($listeners as &$listener) { if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { $listener[0] = $listener[0](); $listener[1] ??= '__invoke'; } $this->sorted[$eventName][] = $listener; } } } /** * Optimizes the internal list of listeners for the given event by priority. */ private function optimizeListeners(string $eventName): array { krsort($this->listeners[$eventName]); $this->optimized[$eventName] = []; foreach ($this->listeners[$eventName] as &$listeners) { foreach ($listeners as &$listener) { $closure = &$this->optimized[$eventName][]; if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { $closure = static function (...$args) use (&$listener, &$closure) { if ($listener[0] instanceof \Closure) { $listener[0] = $listener[0](); $listener[1] ??= '__invoke'; } ($closure = $listener(...))(...$args); }; } else { $closure = $listener instanceof WrappedListener ? $listener : $listener(...); } } } return $this->optimized[$eventName]; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/EventDispatcherInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\EventDispatcher; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface as ContractsEventDispatcherInterface; /** * The EventDispatcherInterface is the central point of Symfony's event listener system. * Listeners are registered on the manager and events are dispatched through the * manager. * * @author Bernhard Schussek */ interface EventDispatcherInterface extends ContractsEventDispatcherInterface { /** * Adds an event listener that listens on the specified events. * * @param int $priority The higher this value, the earlier an event * listener will be triggered in the chain (defaults to 0) * * @return void */ public function addListener(string $eventName, callable $listener, int $priority = 0); /** * Adds an event subscriber. * * The subscriber is asked for all the events it is * interested in and added as a listener for these events. * * @return void */ public function addSubscriber(EventSubscriberInterface $subscriber); /** * Removes an event listener from the specified events. * * @return void */ public function removeListener(string $eventName, callable $listener); /** * @return void */ public function removeSubscriber(EventSubscriberInterface $subscriber); /** * Gets the listeners of a specific event or all listeners sorted by descending priority. * * @return array */ public function getListeners(?string $eventName = null): array; /** * Gets the listener priority for a specific event. * * Returns null if the event or the listener does not exist. */ public function getListenerPriority(string $eventName, callable $listener): ?int; /** * Checks whether an event has any registered listeners. */ public function hasListeners(?string $eventName = null): bool; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/EventSubscriberInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\EventDispatcher; /** * An EventSubscriber knows itself what events it is interested in. * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes * {@link getSubscribedEvents} and registers the subscriber as a listener for all * returned events. * * @author Guilherme Blanco * @author Jonathan Wage * @author Roman Borschel * @author Bernhard Schussek */ interface EventSubscriberInterface { /** * Returns an array of event names this subscriber wants to listen to. * * The array keys are event names and the value can be: * * * The method name to call (priority defaults to 0) * * An array composed of the method name to call and the priority * * An array of arrays composed of the method names to call and respective * priorities, or 0 if unset * * For instance: * * * ['eventName' => 'methodName'] * * ['eventName' => ['methodName', $priority]] * * ['eventName' => [['methodName1', $priority], ['methodName2']]] * * The code must not depend on runtime state as it will only be called at compile time. * All logic depending on runtime state must be put into the individual methods handling the events. * * @return array> */ public static function getSubscribedEvents(); } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/GenericEvent.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\EventDispatcher; use Symfony\Contracts\EventDispatcher\Event; /** * Event encapsulation class. * * Encapsulates events thus decoupling the observer from the subject they encapsulate. * * @author Drak * * @implements \ArrayAccess * @implements \IteratorAggregate */ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate { protected $subject; protected $arguments; /** * Encapsulate an event with $subject and $arguments. * * @param mixed $subject The subject of the event, usually an object or a callable * @param array $arguments Arguments to store in the event */ public function __construct(mixed $subject = null, array $arguments = []) { $this->subject = $subject; $this->arguments = $arguments; } /** * Getter for subject property. */ public function getSubject(): mixed { return $this->subject; } /** * Get argument by key. * * @throws \InvalidArgumentException if key is not found */ public function getArgument(string $key): mixed { if ($this->hasArgument($key)) { return $this->arguments[$key]; } throw new \InvalidArgumentException(sprintf('Argument "%s" not found.', $key)); } /** * Add argument to event. * * @return $this */ public function setArgument(string $key, mixed $value): static { $this->arguments[$key] = $value; return $this; } /** * Getter for all arguments. */ public function getArguments(): array { return $this->arguments; } /** * Set args property. * * @return $this */ public function setArguments(array $args = []): static { $this->arguments = $args; return $this; } /** * Has argument. */ public function hasArgument(string $key): bool { return \array_key_exists($key, $this->arguments); } /** * ArrayAccess for argument getter. * * @param string $key Array key * * @throws \InvalidArgumentException if key does not exist in $this->args */ public function offsetGet(mixed $key): mixed { return $this->getArgument($key); } /** * ArrayAccess for argument setter. * * @param string $key Array key to set */ public function offsetSet(mixed $key, mixed $value): void { $this->setArgument($key, $value); } /** * ArrayAccess for unset argument. * * @param string $key Array key */ public function offsetUnset(mixed $key): void { if ($this->hasArgument($key)) { unset($this->arguments[$key]); } } /** * ArrayAccess has argument. * * @param string $key Array key */ public function offsetExists(mixed $key): bool { return $this->hasArgument($key); } /** * IteratorAggregate for iterating over the object like an array. * * @return \ArrayIterator */ public function getIterator(): \ArrayIterator { return new \ArrayIterator($this->arguments); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\EventDispatcher; /** * A read-only proxy for an event dispatcher. * * @author Bernhard Schussek */ class ImmutableEventDispatcher implements EventDispatcherInterface { private EventDispatcherInterface $dispatcher; public function __construct(EventDispatcherInterface $dispatcher) { $this->dispatcher = $dispatcher; } public function dispatch(object $event, ?string $eventName = null): object { return $this->dispatcher->dispatch($event, $eventName); } /** * @return never */ public function addListener(string $eventName, callable|array $listener, int $priority = 0) { throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); } /** * @return never */ public function addSubscriber(EventSubscriberInterface $subscriber) { throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); } /** * @return never */ public function removeListener(string $eventName, callable|array $listener) { throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); } /** * @return never */ public function removeSubscriber(EventSubscriberInterface $subscriber) { throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); } public function getListeners(?string $eventName = null): array { return $this->dispatcher->getListeners($eventName); } public function getListenerPriority(string $eventName, callable|array $listener): ?int { return $this->dispatcher->getListenerPriority($eventName, $listener); } public function hasListeners(?string $eventName = null): bool { return $this->dispatcher->hasListeners($eventName); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/LICENSE ================================================ Copyright (c) 2004-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/README.md ================================================ EventDispatcher Component ========================= The EventDispatcher component provides tools that allow your application components to communicate with each other by dispatching events and listening to them. Resources --------- * [Documentation](https://symfony.com/doc/current/components/event_dispatcher.html) * [Contributing](https://symfony.com/doc/current/contributing/index.html) * [Report issues](https://github.com/symfony/symfony/issues) and [send Pull Requests](https://github.com/symfony/symfony/pulls) in the [main Symfony repository](https://github.com/symfony/symfony) ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher/composer.json ================================================ { "name": "symfony/event-dispatcher", "type": "library", "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "keywords": [], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=8.1", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "require-dev": { "symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/config": "^5.4|^6.0|^7.0", "symfony/error-handler": "^5.4|^6.0|^7.0", "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", "symfony/stopwatch": "^5.4|^6.0|^7.0", "psr/log": "^1|^2|^3" }, "conflict": { "symfony/dependency-injection": "<5.4", "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", "symfony/event-dispatcher-implementation": "2.0|3.0" }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "minimum-stability": "dev" } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/CHANGELOG.md ================================================ CHANGELOG ========= The changelog is maintained for all Symfony contracts at the following URL: https://github.com/symfony/contracts/blob/main/CHANGELOG.md ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/Event.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\EventDispatcher; use Psr\EventDispatcher\StoppableEventInterface; /** * Event is the base class for classes containing event data. * * This class contains no event data. It is used by events that do not pass * state information to an event handler when an event is raised. * * You can call the method stopPropagation() to abort the execution of * further listeners in your event listener. * * @author Guilherme Blanco * @author Jonathan Wage * @author Roman Borschel * @author Bernhard Schussek * @author Nicolas Grekas */ class Event implements StoppableEventInterface { private bool $propagationStopped = false; public function isPropagationStopped(): bool { return $this->propagationStopped; } /** * Stops the propagation of the event to further event listeners. * * If multiple event listeners are connected to the same event, no * further event listener will be triggered once any trigger calls * stopPropagation(). */ public function stopPropagation(): void { $this->propagationStopped = true; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\EventDispatcher; use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface; /** * Allows providing hooks on domain-specific lifecycles by dispatching events. */ interface EventDispatcherInterface extends PsrEventDispatcherInterface { /** * Dispatches an event to all registered listeners. * * @template T of object * * @param T $event The event to pass to the event handlers/listeners * @param string|null $eventName The name of the event to dispatch. If not supplied, * the class of $event should be used instead. * * @return T The passed $event MUST be returned */ public function dispatch(object $event, ?string $eventName = null): object; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/LICENSE ================================================ Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/README.md ================================================ Symfony EventDispatcher Contracts ================================= A set of abstractions extracted out of the Symfony components. Can be used to build on semantics that the Symfony components proved useful and that already have battle tested implementations. See https://github.com/symfony/contracts/blob/main/README.md for more information. ================================================ FILE: core/widget/wechatServer/vendor/symfony/event-dispatcher-contracts/composer.json ================================================ { "name": "symfony/event-dispatcher-contracts", "type": "library", "description": "Generic abstractions related to dispatching event", "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, "autoload": { "psr-4": { "Symfony\\Contracts\\EventDispatcher\\": "" } }, "minimum-stability": "dev", "extra": { "branch-alias": { "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", "url": "https://github.com/symfony/contracts" } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/AcceptHeader.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; // Help opcache.preload discover always-needed symbols class_exists(AcceptHeaderItem::class); /** * Represents an Accept-* header. * * An accept header is compound with a list of items, * sorted by descending quality. * * @author Jean-François Simon */ class AcceptHeader { /** * @var AcceptHeaderItem[] */ private array $items = []; private bool $sorted = true; /** * @param AcceptHeaderItem[] $items */ public function __construct(array $items) { foreach ($items as $item) { $this->add($item); } } /** * Builds an AcceptHeader instance from a string. */ public static function fromString(?string $headerValue): self { $parts = HeaderUtils::split($headerValue ?? '', ',;='); return new self(array_map(function ($subParts) { static $index = 0; $part = array_shift($subParts); $attributes = HeaderUtils::combine($subParts); $item = new AcceptHeaderItem($part[0], $attributes); $item->setIndex($index++); return $item; }, $parts)); } /** * Returns header value's string representation. */ public function __toString(): string { return implode(',', $this->items); } /** * Tests if header has given value. */ public function has(string $value): bool { return isset($this->items[$value]); } /** * Returns given value's item, if exists. */ public function get(string $value): ?AcceptHeaderItem { return $this->items[$value] ?? $this->items[explode('/', $value)[0].'/*'] ?? $this->items['*/*'] ?? $this->items['*'] ?? null; } /** * Adds an item. * * @return $this */ public function add(AcceptHeaderItem $item): static { $this->items[$item->getValue()] = $item; $this->sorted = false; return $this; } /** * Returns all items. * * @return AcceptHeaderItem[] */ public function all(): array { $this->sort(); return $this->items; } /** * Filters items on their value using given regex. */ public function filter(string $pattern): self { return new self(array_filter($this->items, fn (AcceptHeaderItem $item) => preg_match($pattern, $item->getValue()))); } /** * Returns first item. */ public function first(): ?AcceptHeaderItem { $this->sort(); return $this->items ? reset($this->items) : null; } /** * Sorts items by descending quality. */ private function sort(): void { if (!$this->sorted) { uasort($this->items, function (AcceptHeaderItem $a, AcceptHeaderItem $b) { $qA = $a->getQuality(); $qB = $b->getQuality(); if ($qA === $qB) { return $a->getIndex() > $b->getIndex() ? 1 : -1; } return $qA > $qB ? -1 : 1; }); $this->sorted = true; } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/AcceptHeaderItem.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * Represents an Accept-* header item. * * @author Jean-François Simon */ class AcceptHeaderItem { private string $value; private float $quality = 1.0; private int $index = 0; private array $attributes = []; public function __construct(string $value, array $attributes = []) { $this->value = $value; foreach ($attributes as $name => $value) { $this->setAttribute($name, $value); } } /** * Builds an AcceptHeaderInstance instance from a string. */ public static function fromString(?string $itemValue): self { $parts = HeaderUtils::split($itemValue ?? '', ';='); $part = array_shift($parts); $attributes = HeaderUtils::combine($parts); return new self($part[0], $attributes); } /** * Returns header value's string representation. */ public function __toString(): string { $string = $this->value.($this->quality < 1 ? ';q='.$this->quality : ''); if (\count($this->attributes) > 0) { $string .= '; '.HeaderUtils::toString($this->attributes, ';'); } return $string; } /** * Set the item value. * * @return $this */ public function setValue(string $value): static { $this->value = $value; return $this; } /** * Returns the item value. */ public function getValue(): string { return $this->value; } /** * Set the item quality. * * @return $this */ public function setQuality(float $quality): static { $this->quality = $quality; return $this; } /** * Returns the item quality. */ public function getQuality(): float { return $this->quality; } /** * Set the item index. * * @return $this */ public function setIndex(int $index): static { $this->index = $index; return $this; } /** * Returns the item index. */ public function getIndex(): int { return $this->index; } /** * Tests if an attribute exists. */ public function hasAttribute(string $name): bool { return isset($this->attributes[$name]); } /** * Returns an attribute by its name. */ public function getAttribute(string $name, mixed $default = null): mixed { return $this->attributes[$name] ?? $default; } /** * Returns all attributes. */ public function getAttributes(): array { return $this->attributes; } /** * Set an attribute. * * @return $this */ public function setAttribute(string $name, string $value): static { if ('q' === $name) { $this->quality = (float) $value; } else { $this->attributes[$name] = $value; } return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/BinaryFileResponse.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; use Symfony\Component\HttpFoundation\File\Exception\FileException; use Symfony\Component\HttpFoundation\File\File; /** * BinaryFileResponse represents an HTTP response delivering a file. * * @author Niklas Fiekas * @author stealth35 * @author Igor Wiedler * @author Jordan Alliot * @author Sergey Linnik */ class BinaryFileResponse extends Response { protected static $trustXSendfileTypeHeader = false; /** * @var File */ protected $file; protected $offset = 0; protected $maxlen = -1; protected $deleteFileAfterSend = false; protected $chunkSize = 16 * 1024; /** * @param \SplFileInfo|string $file The file to stream * @param int $status The response status code (200 "OK" by default) * @param array $headers An array of response headers * @param bool $public Files are public by default * @param string|null $contentDisposition The type of Content-Disposition to set automatically with the filename * @param bool $autoEtag Whether the ETag header should be automatically set * @param bool $autoLastModified Whether the Last-Modified header should be automatically set */ public function __construct(\SplFileInfo|string $file, int $status = 200, array $headers = [], bool $public = true, ?string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true) { parent::__construct(null, $status, $headers); $this->setFile($file, $contentDisposition, $autoEtag, $autoLastModified); if ($public) { $this->setPublic(); } } /** * Sets the file to stream. * * @return $this * * @throws FileException */ public function setFile(\SplFileInfo|string $file, ?string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true): static { if (!$file instanceof File) { if ($file instanceof \SplFileInfo) { $file = new File($file->getPathname()); } else { $file = new File((string) $file); } } if (!$file->isReadable()) { throw new FileException('File must be readable.'); } $this->file = $file; if ($autoEtag) { $this->setAutoEtag(); } if ($autoLastModified) { $this->setAutoLastModified(); } if ($contentDisposition) { $this->setContentDisposition($contentDisposition); } return $this; } /** * Gets the file. */ public function getFile(): File { return $this->file; } /** * Sets the response stream chunk size. * * @return $this */ public function setChunkSize(int $chunkSize): static { if ($chunkSize < 1 || $chunkSize > \PHP_INT_MAX) { throw new \LogicException('The chunk size of a BinaryFileResponse cannot be less than 1 or greater than PHP_INT_MAX.'); } $this->chunkSize = $chunkSize; return $this; } /** * Automatically sets the Last-Modified header according the file modification date. * * @return $this */ public function setAutoLastModified(): static { $this->setLastModified(\DateTimeImmutable::createFromFormat('U', $this->file->getMTime())); return $this; } /** * Automatically sets the ETag header according to the checksum of the file. * * @return $this */ public function setAutoEtag(): static { $this->setEtag(base64_encode(hash_file('sha256', $this->file->getPathname(), true))); return $this; } /** * Sets the Content-Disposition header with the given filename. * * @param string $disposition ResponseHeaderBag::DISPOSITION_INLINE or ResponseHeaderBag::DISPOSITION_ATTACHMENT * @param string $filename Optionally use this UTF-8 encoded filename instead of the real name of the file * @param string $filenameFallback A fallback filename, containing only ASCII characters. Defaults to an automatically encoded filename * * @return $this */ public function setContentDisposition(string $disposition, string $filename = '', string $filenameFallback = ''): static { if ('' === $filename) { $filename = $this->file->getFilename(); } if ('' === $filenameFallback && (!preg_match('/^[\x20-\x7e]*$/', $filename) || str_contains($filename, '%'))) { $encoding = mb_detect_encoding($filename, null, true) ?: '8bit'; for ($i = 0, $filenameLength = mb_strlen($filename, $encoding); $i < $filenameLength; ++$i) { $char = mb_substr($filename, $i, 1, $encoding); if ('%' === $char || \ord($char) < 32 || \ord($char) > 126) { $filenameFallback .= '_'; } else { $filenameFallback .= $char; } } } $dispositionHeader = $this->headers->makeDisposition($disposition, $filename, $filenameFallback); $this->headers->set('Content-Disposition', $dispositionHeader); return $this; } public function prepare(Request $request): static { if ($this->isInformational() || $this->isEmpty()) { parent::prepare($request); $this->maxlen = 0; return $this; } if (!$this->headers->has('Content-Type')) { $this->headers->set('Content-Type', $this->file->getMimeType() ?: 'application/octet-stream'); } parent::prepare($request); $this->offset = 0; $this->maxlen = -1; if (false === $fileSize = $this->file->getSize()) { return $this; } $this->headers->remove('Transfer-Encoding'); $this->headers->set('Content-Length', $fileSize); if (!$this->headers->has('Accept-Ranges')) { // Only accept ranges on safe HTTP methods $this->headers->set('Accept-Ranges', $request->isMethodSafe() ? 'bytes' : 'none'); } if (self::$trustXSendfileTypeHeader && $request->headers->has('X-Sendfile-Type')) { // Use X-Sendfile, do not send any content. $type = $request->headers->get('X-Sendfile-Type'); $path = $this->file->getRealPath(); // Fall back to scheme://path for stream wrapped locations. if (false === $path) { $path = $this->file->getPathname(); } if ('x-accel-redirect' === strtolower($type)) { // Do X-Accel-Mapping substitutions. // @link https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/#x-accel-redirect $parts = HeaderUtils::split($request->headers->get('X-Accel-Mapping', ''), ',='); foreach ($parts as $part) { [$pathPrefix, $location] = $part; if (str_starts_with($path, $pathPrefix)) { $path = $location.substr($path, \strlen($pathPrefix)); // Only set X-Accel-Redirect header if a valid URI can be produced // as nginx does not serve arbitrary file paths. $this->headers->set($type, $path); $this->maxlen = 0; break; } } } else { $this->headers->set($type, $path); $this->maxlen = 0; } } elseif ($request->headers->has('Range') && $request->isMethod('GET')) { // Process the range headers. if (!$request->headers->has('If-Range') || $this->hasValidIfRangeHeader($request->headers->get('If-Range'))) { $range = $request->headers->get('Range'); if (str_starts_with($range, 'bytes=')) { [$start, $end] = explode('-', substr($range, 6), 2) + [1 => 0]; $end = ('' === $end) ? $fileSize - 1 : (int) $end; if ('' === $start) { $start = $fileSize - $end; $end = $fileSize - 1; } else { $start = (int) $start; } if ($start <= $end) { $end = min($end, $fileSize - 1); if ($start < 0 || $start > $end) { $this->setStatusCode(416); $this->headers->set('Content-Range', sprintf('bytes */%s', $fileSize)); } elseif ($end - $start < $fileSize - 1) { $this->maxlen = $end < $fileSize ? $end - $start + 1 : -1; $this->offset = $start; $this->setStatusCode(206); $this->headers->set('Content-Range', sprintf('bytes %s-%s/%s', $start, $end, $fileSize)); $this->headers->set('Content-Length', $end - $start + 1); } } } } } if ($request->isMethod('HEAD')) { $this->maxlen = 0; } return $this; } private function hasValidIfRangeHeader(?string $header): bool { if ($this->getEtag() === $header) { return true; } if (null === $lastModified = $this->getLastModified()) { return false; } return $lastModified->format('D, d M Y H:i:s').' GMT' === $header; } public function sendContent(): static { try { if (!$this->isSuccessful()) { return $this; } if (0 === $this->maxlen) { return $this; } $out = fopen('php://output', 'w'); $file = fopen($this->file->getPathname(), 'r'); ignore_user_abort(true); if (0 !== $this->offset) { fseek($file, $this->offset); } $length = $this->maxlen; while ($length && !feof($file)) { $read = $length > $this->chunkSize || 0 > $length ? $this->chunkSize : $length; if (false === $data = fread($file, $read)) { break; } while ('' !== $data) { $read = fwrite($out, $data); if (false === $read || connection_aborted()) { break 2; } if (0 < $length) { $length -= $read; } $data = substr($data, $read); } } fclose($out); fclose($file); } finally { if ($this->deleteFileAfterSend && is_file($this->file->getPathname())) { unlink($this->file->getPathname()); } } return $this; } /** * @throws \LogicException when the content is not null */ public function setContent(?string $content): static { if (null !== $content) { throw new \LogicException('The content cannot be set on a BinaryFileResponse instance.'); } return $this; } public function getContent(): string|false { return false; } /** * Trust X-Sendfile-Type header. * * @return void */ public static function trustXSendfileTypeHeader() { self::$trustXSendfileTypeHeader = true; } /** * If this is set to true, the file will be unlinked after the request is sent * Note: If the X-Sendfile header is used, the deleteFileAfterSend setting will not be used. * * @return $this */ public function deleteFileAfterSend(bool $shouldDelete = true): static { $this->deleteFileAfterSend = $shouldDelete; return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/CHANGELOG.md ================================================ CHANGELOG ========= 6.4 --- * Make `HeaderBag::getDate()`, `Response::getDate()`, `getExpires()` and `getLastModified()` return a `DateTimeImmutable` * Support root-level `Generator` in `StreamedJsonResponse` * Add `UriSigner` from the HttpKernel component * Add `partitioned` flag to `Cookie` (CHIPS Cookie) * Add argument `bool $flush = true` to `Response::send()` * Make `MongoDbSessionHandler` instantiable with the mongodb extension directly 6.3 --- * Calling `ParameterBag::getDigit()`, `getAlnum()`, `getAlpha()` on an `array` throws a `UnexpectedValueException` instead of a `TypeError` * Add `ParameterBag::getString()` to convert a parameter into string and throw an exception if the value is invalid * Add `ParameterBag::getEnum()` * Create migration for session table when pdo handler is used * Add support for Relay PHP extension for Redis * The `Response::sendHeaders()` method now takes an optional HTTP status code as parameter, allowing to send informational responses such as Early Hints responses (103 status code) * Add `IpUtils::isPrivateIp()` * Add `Request::getPayload(): InputBag` * Deprecate conversion of invalid values in `ParameterBag::getInt()` and `ParameterBag::getBoolean()`, * Deprecate ignoring invalid values when using `ParameterBag::filter()`, unless flag `FILTER_NULL_ON_FAILURE` is set 6.2 --- * Add `StreamedJsonResponse` class for efficient JSON streaming * The HTTP cache store uses the `xxh128` algorithm * Deprecate calling `JsonResponse::setCallback()`, `Response::setExpires/setLastModified/setEtag()`, `MockArraySessionStorage/NativeSessionStorage::setMetadataBag()`, `NativeSessionStorage::setSaveHandler()` without arguments * Add request matchers under the `Symfony\Component\HttpFoundation\RequestMatcher` namespace * Deprecate `RequestMatcher` in favor of `ChainRequestMatcher` * Deprecate `Symfony\Component\HttpFoundation\ExpressionRequestMatcher` in favor of `Symfony\Component\HttpFoundation\RequestMatcher\ExpressionRequestMatcher` 6.1 --- * Add stale while revalidate and stale if error cache header * Allow dynamic session "ttl" when using a remote storage * Deprecate `Request::getContentType()`, use `Request::getContentTypeFormat()` instead 6.0 --- * Remove the `NamespacedAttributeBag` class * Removed `Response::create()`, `JsonResponse::create()`, `RedirectResponse::create()`, `StreamedResponse::create()` and `BinaryFileResponse::create()` methods (use `__construct()` instead) * Not passing a `Closure` together with `FILTER_CALLBACK` to `ParameterBag::filter()` throws an `\InvalidArgumentException`; wrap your filter in a closure instead * Not passing a `Closure` together with `FILTER_CALLBACK` to `InputBag::filter()` throws an `\InvalidArgumentException`; wrap your filter in a closure instead * Removed the `Request::HEADER_X_FORWARDED_ALL` constant, use either `Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO` or `Request::HEADER_X_FORWARDED_AWS_ELB` or `Request::HEADER_X_FORWARDED_TRAEFIK`constants instead * Rename `RequestStack::getMasterRequest()` to `getMainRequest()` * Not passing `FILTER_REQUIRE_ARRAY` or `FILTER_FORCE_ARRAY` flags to `InputBag::filter()` when filtering an array will throw `BadRequestException` * Removed the `Request::HEADER_X_FORWARDED_ALL` constant * Retrieving non-scalar values using `InputBag::get()` will throw `BadRequestException` (use `InputBad::all()` instead to retrieve an array) * Passing non-scalar default value as the second argument `InputBag::get()` will throw `\InvalidArgumentException` * Passing non-scalar, non-array value as the second argument `InputBag::set()` will throw `\InvalidArgumentException` * Passing `null` as `$requestIp` to `IpUtils::__checkIp()`, `IpUtils::__checkIp4()` or `IpUtils::__checkIp6()` is not supported anymore. 5.4 --- * Deprecate passing `null` as `$requestIp` to `IpUtils::__checkIp()`, `IpUtils::__checkIp4()` or `IpUtils::__checkIp6()`, pass an empty string instead. * Add the `litespeed_finish_request` method to work with Litespeed * Deprecate `upload_progress.*` and `url_rewriter.tags` session options * Allow setting session options via DSN 5.3 --- * Add the `SessionFactory`, `NativeSessionStorageFactory`, `PhpBridgeSessionStorageFactory` and `MockFileSessionStorageFactory` classes * Calling `Request::getSession()` when there is no available session throws a `SessionNotFoundException` * Add the `RequestStack::getSession` method * Deprecate the `NamespacedAttributeBag` class * Add `ResponseFormatSame` PHPUnit constraint * Deprecate the `RequestStack::getMasterRequest()` method and add `getMainRequest()` as replacement 5.2.0 ----- * added support for `X-Forwarded-Prefix` header * added `HeaderUtils::parseQuery()`: it does the same as `parse_str()` but preserves dots in variable names * added `File::getContent()` * added ability to use comma separated ip addresses for `RequestMatcher::matchIps()` * added `Request::toArray()` to parse a JSON request body to an array * added `RateLimiter\RequestRateLimiterInterface` and `RateLimiter\AbstractRequestRateLimiter` * deprecated not passing a `Closure` together with `FILTER_CALLBACK` to `ParameterBag::filter()`; wrap your filter in a closure instead. * Deprecated the `Request::HEADER_X_FORWARDED_ALL` constant, use either `HEADER_X_FORWARDED_FOR | HEADER_X_FORWARDED_HOST | HEADER_X_FORWARDED_PORT | HEADER_X_FORWARDED_PROTO` or `HEADER_X_FORWARDED_AWS_ELB` or `HEADER_X_FORWARDED_TRAEFIK` constants instead. * Deprecated `BinaryFileResponse::create()`, use `__construct()` instead 5.1.0 ----- * added `Cookie::withValue`, `Cookie::withDomain`, `Cookie::withExpires`, `Cookie::withPath`, `Cookie::withSecure`, `Cookie::withHttpOnly`, `Cookie::withRaw`, `Cookie::withSameSite` * Deprecate `Response::create()`, `JsonResponse::create()`, `RedirectResponse::create()`, and `StreamedResponse::create()` methods (use `__construct()` instead) * added `Request::preferSafeContent()` and `Response::setContentSafe()` to handle "safe" HTTP preference according to [RFC 8674](https://tools.ietf.org/html/rfc8674) * made the Mime component an optional dependency * added `MarshallingSessionHandler`, `IdentityMarshaller` * made `Session` accept a callback to report when the session is being used * Add support for all core cache control directives * Added `Symfony\Component\HttpFoundation\InputBag` * Deprecated retrieving non-string values using `InputBag::get()`, use `InputBag::all()` if you need access to the collection of values 5.0.0 ----- * made `Cookie` auto-secure and lax by default * removed classes in the `MimeType` namespace, use the Symfony Mime component instead * removed method `UploadedFile::getClientSize()` and the related constructor argument * made `Request::getSession()` throw if the session has not been set before * removed `Response::HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL` * passing a null url when instantiating a `RedirectResponse` is not allowed 4.4.0 ----- * passing arguments to `Request::isMethodSafe()` is deprecated. * `ApacheRequest` is deprecated, use the `Request` class instead. * passing a third argument to `HeaderBag::get()` is deprecated, use method `all()` instead * [BC BREAK] `PdoSessionHandler` with MySQL changed the type of the lifetime column, make sure to run `ALTER TABLE sessions MODIFY sess_lifetime INTEGER UNSIGNED NOT NULL` to update your database. * `PdoSessionHandler` now precalculates the expiry timestamp in the lifetime column, make sure to run `CREATE INDEX expiry ON sessions (sess_lifetime)` to update your database to speed up garbage collection of expired sessions. * added `SessionHandlerFactory` to create session handlers with a DSN * added `IpUtils::anonymize()` to help with GDPR compliance. 4.3.0 ----- * added PHPUnit constraints: `RequestAttributeValueSame`, `ResponseCookieValueSame`, `ResponseHasCookie`, `ResponseHasHeader`, `ResponseHeaderSame`, `ResponseIsRedirected`, `ResponseIsSuccessful`, and `ResponseStatusCodeSame` * deprecated `MimeTypeGuesserInterface` and `ExtensionGuesserInterface` in favor of `Symfony\Component\Mime\MimeTypesInterface`. * deprecated `MimeType` and `MimeTypeExtensionGuesser` in favor of `Symfony\Component\Mime\MimeTypes`. * deprecated `FileBinaryMimeTypeGuesser` in favor of `Symfony\Component\Mime\FileBinaryMimeTypeGuesser`. * deprecated `FileinfoMimeTypeGuesser` in favor of `Symfony\Component\Mime\FileinfoMimeTypeGuesser`. * added `UrlHelper` that allows to get an absolute URL and a relative path for a given path 4.2.0 ----- * the default value of the "$secure" and "$samesite" arguments of Cookie's constructor will respectively change from "false" to "null" and from "null" to "lax" in Symfony 5.0, you should define their values explicitly or use "Cookie::create()" instead. * added `matchPort()` in RequestMatcher 4.1.3 ----- * [BC BREAK] Support for the IIS-only `X_ORIGINAL_URL` and `X_REWRITE_URL` HTTP headers has been dropped for security reasons. 4.1.0 ----- * Query string normalization uses `parse_str()` instead of custom parsing logic. * Passing the file size to the constructor of the `UploadedFile` class is deprecated. * The `getClientSize()` method of the `UploadedFile` class is deprecated. Use `getSize()` instead. * added `RedisSessionHandler` to use Redis as a session storage * The `get()` method of the `AcceptHeader` class now takes into account the `*` and `*/*` default values (if they are present in the Accept HTTP header) when looking for items. * deprecated `Request::getSession()` when no session has been set. Use `Request::hasSession()` instead. * added `CannotWriteFileException`, `ExtensionFileException`, `FormSizeFileException`, `IniSizeFileException`, `NoFileException`, `NoTmpDirFileException`, `PartialFileException` to handle failed `UploadedFile`. * added `MigratingSessionHandler` for migrating between two session handlers without losing sessions * added `HeaderUtils`. 4.0.0 ----- * the `Request::setTrustedHeaderName()` and `Request::getTrustedHeaderName()` methods have been removed * the `Request::HEADER_CLIENT_IP` constant has been removed, use `Request::HEADER_X_FORWARDED_FOR` instead * the `Request::HEADER_CLIENT_HOST` constant has been removed, use `Request::HEADER_X_FORWARDED_HOST` instead * the `Request::HEADER_CLIENT_PROTO` constant has been removed, use `Request::HEADER_X_FORWARDED_PROTO` instead * the `Request::HEADER_CLIENT_PORT` constant has been removed, use `Request::HEADER_X_FORWARDED_PORT` instead * checking for cacheable HTTP methods using the `Request::isMethodSafe()` method (by not passing `false` as its argument) is not supported anymore and throws a `\BadMethodCallException` * the `WriteCheckSessionHandler`, `NativeSessionHandler` and `NativeProxy` classes have been removed * setting session save handlers that do not implement `\SessionHandlerInterface` in `NativeSessionStorage::setSaveHandler()` is not supported anymore and throws a `\TypeError` 3.4.0 ----- * implemented PHP 7.0's `SessionUpdateTimestampHandlerInterface` with a new `AbstractSessionHandler` base class and a new `StrictSessionHandler` wrapper * deprecated the `WriteCheckSessionHandler`, `NativeSessionHandler` and `NativeProxy` classes * deprecated setting session save handlers that do not implement `\SessionHandlerInterface` in `NativeSessionStorage::setSaveHandler()` * deprecated using `MongoDbSessionHandler` with the legacy mongo extension; use it with the mongodb/mongodb package and ext-mongodb instead * deprecated `MemcacheSessionHandler`; use `MemcachedSessionHandler` instead 3.3.0 ----- * the `Request::setTrustedProxies()` method takes a new `$trustedHeaderSet` argument, see https://symfony.com/doc/current/deployment/proxies.html for more info, * deprecated the `Request::setTrustedHeaderName()` and `Request::getTrustedHeaderName()` methods, * added `File\Stream`, to be passed to `BinaryFileResponse` when the size of the served file is unknown, disabling `Range` and `Content-Length` handling, switching to chunked encoding instead * added the `Cookie::fromString()` method that allows to create a cookie from a raw header string 3.1.0 ----- * Added support for creating `JsonResponse` with a string of JSON data 3.0.0 ----- * The precedence of parameters returned from `Request::get()` changed from "GET, PATH, BODY" to "PATH, GET, BODY" 2.8.0 ----- * Finding deep items in `ParameterBag::get()` is deprecated since version 2.8 and will be removed in 3.0. 2.6.0 ----- * PdoSessionHandler changes - implemented different session locking strategies to prevent loss of data by concurrent access to the same session - [BC BREAK] save session data in a binary column without base64_encode - [BC BREAK] added lifetime column to the session table which allows to have different lifetimes for each session - implemented lazy connections that are only opened when a session is used by either passing a dsn string explicitly or falling back to session.save_path ini setting - added a createTable method that initializes a correctly defined table depending on the database vendor 2.5.0 ----- * added `JsonResponse::setEncodingOptions()` & `JsonResponse::getEncodingOptions()` for easier manipulation of the options used while encoding data to JSON format. 2.4.0 ----- * added RequestStack * added Request::getEncodings() * added accessors methods to session handlers 2.3.0 ----- * added support for ranges of IPs in trusted proxies * `UploadedFile::isValid` now returns false if the file was not uploaded via HTTP (in a non-test mode) * Improved error-handling of `\Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler` to ensure the supplied PDO handler throws Exceptions on error (as the class expects). Added related test cases to verify that Exceptions are properly thrown when the PDO queries fail. 2.2.0 ----- * fixed the Request::create() precedence (URI information always take precedence now) * added Request::getTrustedProxies() * deprecated Request::isProxyTrusted() * [BC BREAK] JsonResponse does not turn a top level empty array to an object anymore, use an ArrayObject to enforce objects * added a IpUtils class to check if an IP belongs to a CIDR * added Request::getRealMethod() to get the "real" HTTP method (getMethod() returns the "intended" HTTP method) * disabled _method request parameter support by default (call Request::enableHttpMethodParameterOverride() to enable it, and Request::getHttpMethodParameterOverride() to check if it is supported) * Request::splitHttpAcceptHeader() method is deprecated and will be removed in 2.3 * Deprecated Flashbag::count() and \Countable interface, will be removed in 2.3 2.1.0 ----- * added Request::getSchemeAndHttpHost() and Request::getUserInfo() * added a fluent interface to the Response class * added Request::isProxyTrusted() * added JsonResponse * added a getTargetUrl method to RedirectResponse * added support for streamed responses * made Response::prepare() method the place to enforce HTTP specification * [BC BREAK] moved management of the locale from the Session class to the Request class * added a generic access to the PHP built-in filter mechanism: ParameterBag::filter() * made FileBinaryMimeTypeGuesser command configurable * added Request::getUser() and Request::getPassword() * added support for the PATCH method in Request * removed the ContentTypeMimeTypeGuesser class as it is deprecated and never used on PHP 5.3 * added ResponseHeaderBag::makeDisposition() (implements RFC 6266) * made mimetype to extension conversion configurable * [BC BREAK] Moved all session related classes and interfaces into own namespace, as `Symfony\Component\HttpFoundation\Session` and renamed classes accordingly. Session handlers are located in the subnamespace `Symfony\Component\HttpFoundation\Session\Handler`. * SessionHandlers must implement `\SessionHandlerInterface` or extend from the `Symfony\Component\HttpFoundation\Storage\Handler\NativeSessionHandler` base class. * Added internal storage driver proxy mechanism for forward compatibility with PHP 5.4 `\SessionHandler` class. * Added session handlers for custom Memcache, Memcached and Null session save handlers. * [BC BREAK] Removed `NativeSessionStorage` and replaced with `NativeFileSessionHandler`. * [BC BREAK] `SessionStorageInterface` methods removed: `write()`, `read()` and `remove()`. Added `getBag()`, `registerBag()`. The `NativeSessionStorage` class is a mediator for the session storage internals including the session handlers which do the real work of participating in the internal PHP session workflow. * [BC BREAK] Introduced mock implementations of `SessionStorage` to enable unit and functional testing without starting real PHP sessions. Removed `ArraySessionStorage`, and replaced with `MockArraySessionStorage` for unit tests; removed `FilesystemSessionStorage`, and replaced with`MockFileSessionStorage` for functional tests. These do not interact with global session ini configuration values, session functions or `$_SESSION` superglobal. This means they can be configured directly allowing multiple instances to work without conflicting in the same PHP process. * [BC BREAK] Removed the `close()` method from the `Session` class, as this is now redundant. * Deprecated the following methods from the Session class: `setFlash()`, `setFlashes()` `getFlash()`, `hasFlash()`, and `removeFlash()`. Use `getFlashBag()` instead which returns a `FlashBagInterface`. * `Session->clear()` now only clears session attributes as before it cleared flash messages and attributes. `Session->getFlashBag()->all()` clears flashes now. * Session data is now managed by `SessionBagInterface` to better encapsulate session data. * Refactored session attribute and flash messages system to their own `SessionBagInterface` implementations. * Added `FlashBag`. Flashes expire when retrieved by `get()` or `all()`. This implementation is ESI compatible. * Added `AutoExpireFlashBag` (default) to replicate Symfony 2.0.x auto expire behavior of messages auto expiring after one page page load. Messages must be retrieved by `get()` or `all()`. * Added `Symfony\Component\HttpFoundation\Attribute\AttributeBag` to replicate attributes storage behavior from 2.0.x (default). * Added `Symfony\Component\HttpFoundation\Attribute\NamespacedAttributeBag` for namespace session attributes. * Flash API can stores messages in an array so there may be multiple messages per flash type. The old `Session` class API remains without BC break as it will allow single messages as before. * Added basic session meta-data to the session to record session create time, last updated time, and the lifetime of the session cookie that was provided to the client. * Request::getClientIp() method doesn't take a parameter anymore but bases itself on the trustProxy parameter. * Added isMethod() to Request object. * [BC BREAK] The methods `getPathInfo()`, `getBaseUrl()` and `getBasePath()` of a `Request` now all return a raw value (vs a urldecoded value before). Any call to one of these methods must be checked and wrapped in a `rawurldecode()` if needed. ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/ChainRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * ChainRequestMatcher verifies that all checks match against a Request instance. * * @author Fabien Potencier */ class ChainRequestMatcher implements RequestMatcherInterface { /** * @param iterable $matchers */ public function __construct(private iterable $matchers) { } public function matches(Request $request): bool { foreach ($this->matchers as $matcher) { if (!$matcher->matches($request)) { return false; } } return true; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Cookie.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * Represents a cookie. * * @author Johannes M. Schmitt */ class Cookie { public const SAMESITE_NONE = 'none'; public const SAMESITE_LAX = 'lax'; public const SAMESITE_STRICT = 'strict'; protected $name; protected $value; protected $domain; protected $expire; protected $path; protected $secure; protected $httpOnly; private bool $raw; private ?string $sameSite = null; private bool $partitioned = false; private bool $secureDefault = false; private const RESERVED_CHARS_LIST = "=,; \t\r\n\v\f"; private const RESERVED_CHARS_FROM = ['=', ',', ';', ' ', "\t", "\r", "\n", "\v", "\f"]; private const RESERVED_CHARS_TO = ['%3D', '%2C', '%3B', '%20', '%09', '%0D', '%0A', '%0B', '%0C']; /** * Creates cookie from raw header string. */ public static function fromString(string $cookie, bool $decode = false): static { $data = [ 'expires' => 0, 'path' => '/', 'domain' => null, 'secure' => false, 'httponly' => false, 'raw' => !$decode, 'samesite' => null, 'partitioned' => false, ]; $parts = HeaderUtils::split($cookie, ';='); $part = array_shift($parts); $name = $decode ? urldecode($part[0]) : $part[0]; $value = isset($part[1]) ? ($decode ? urldecode($part[1]) : $part[1]) : null; $data = HeaderUtils::combine($parts) + $data; $data['expires'] = self::expiresTimestamp($data['expires']); if (isset($data['max-age']) && ($data['max-age'] > 0 || $data['expires'] > time())) { $data['expires'] = time() + (int) $data['max-age']; } return new static($name, $value, $data['expires'], $data['path'], $data['domain'], $data['secure'], $data['httponly'], $data['raw'], $data['samesite'], $data['partitioned']); } /** * @see self::__construct * * @param self::SAMESITE_*|''|null $sameSite * @param bool $partitioned */ public static function create(string $name, ?string $value = null, int|string|\DateTimeInterface $expire = 0, ?string $path = '/', ?string $domain = null, ?bool $secure = null, bool $httpOnly = true, bool $raw = false, ?string $sameSite = self::SAMESITE_LAX /* , bool $partitioned = false */): self { $partitioned = 9 < \func_num_args() ? func_get_arg(9) : false; return new self($name, $value, $expire, $path, $domain, $secure, $httpOnly, $raw, $sameSite, $partitioned); } /** * @param string $name The name of the cookie * @param string|null $value The value of the cookie * @param int|string|\DateTimeInterface $expire The time the cookie expires * @param string|null $path The path on the server in which the cookie will be available on * @param string|null $domain The domain that the cookie is available to * @param bool|null $secure Whether the client should send back the cookie only over HTTPS or null to auto-enable this when the request is already using HTTPS * @param bool $httpOnly Whether the cookie will be made accessible only through the HTTP protocol * @param bool $raw Whether the cookie value should be sent with no url encoding * @param self::SAMESITE_*|''|null $sameSite Whether the cookie will be available for cross-site requests * * @throws \InvalidArgumentException */ public function __construct(string $name, ?string $value = null, int|string|\DateTimeInterface $expire = 0, ?string $path = '/', ?string $domain = null, ?bool $secure = null, bool $httpOnly = true, bool $raw = false, ?string $sameSite = self::SAMESITE_LAX, bool $partitioned = false) { // from PHP source code if ($raw && false !== strpbrk($name, self::RESERVED_CHARS_LIST)) { throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $name)); } if (empty($name)) { throw new \InvalidArgumentException('The cookie name cannot be empty.'); } $this->name = $name; $this->value = $value; $this->domain = $domain; $this->expire = self::expiresTimestamp($expire); $this->path = empty($path) ? '/' : $path; $this->secure = $secure; $this->httpOnly = $httpOnly; $this->raw = $raw; $this->sameSite = $this->withSameSite($sameSite)->sameSite; $this->partitioned = $partitioned; } /** * Creates a cookie copy with a new value. */ public function withValue(?string $value): static { $cookie = clone $this; $cookie->value = $value; return $cookie; } /** * Creates a cookie copy with a new domain that the cookie is available to. */ public function withDomain(?string $domain): static { $cookie = clone $this; $cookie->domain = $domain; return $cookie; } /** * Creates a cookie copy with a new time the cookie expires. */ public function withExpires(int|string|\DateTimeInterface $expire = 0): static { $cookie = clone $this; $cookie->expire = self::expiresTimestamp($expire); return $cookie; } /** * Converts expires formats to a unix timestamp. */ private static function expiresTimestamp(int|string|\DateTimeInterface $expire = 0): int { // convert expiration time to a Unix timestamp if ($expire instanceof \DateTimeInterface) { $expire = $expire->format('U'); } elseif (!is_numeric($expire)) { $expire = strtotime($expire); if (false === $expire) { throw new \InvalidArgumentException('The cookie expiration time is not valid.'); } } return 0 < $expire ? (int) $expire : 0; } /** * Creates a cookie copy with a new path on the server in which the cookie will be available on. */ public function withPath(string $path): static { $cookie = clone $this; $cookie->path = '' === $path ? '/' : $path; return $cookie; } /** * Creates a cookie copy that only be transmitted over a secure HTTPS connection from the client. */ public function withSecure(bool $secure = true): static { $cookie = clone $this; $cookie->secure = $secure; return $cookie; } /** * Creates a cookie copy that be accessible only through the HTTP protocol. */ public function withHttpOnly(bool $httpOnly = true): static { $cookie = clone $this; $cookie->httpOnly = $httpOnly; return $cookie; } /** * Creates a cookie copy that uses no url encoding. */ public function withRaw(bool $raw = true): static { if ($raw && false !== strpbrk($this->name, self::RESERVED_CHARS_LIST)) { throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $this->name)); } $cookie = clone $this; $cookie->raw = $raw; return $cookie; } /** * Creates a cookie copy with SameSite attribute. * * @param self::SAMESITE_*|''|null $sameSite */ public function withSameSite(?string $sameSite): static { if ('' === $sameSite) { $sameSite = null; } elseif (null !== $sameSite) { $sameSite = strtolower($sameSite); } if (!\in_array($sameSite, [self::SAMESITE_LAX, self::SAMESITE_STRICT, self::SAMESITE_NONE, null], true)) { throw new \InvalidArgumentException('The "sameSite" parameter value is not valid.'); } $cookie = clone $this; $cookie->sameSite = $sameSite; return $cookie; } /** * Creates a cookie copy that is tied to the top-level site in cross-site context. */ public function withPartitioned(bool $partitioned = true): static { $cookie = clone $this; $cookie->partitioned = $partitioned; return $cookie; } /** * Returns the cookie as a string. */ public function __toString(): string { if ($this->isRaw()) { $str = $this->getName(); } else { $str = str_replace(self::RESERVED_CHARS_FROM, self::RESERVED_CHARS_TO, $this->getName()); } $str .= '='; if ('' === (string) $this->getValue()) { $str .= 'deleted; expires='.gmdate('D, d M Y H:i:s T', time() - 31536001).'; Max-Age=0'; } else { $str .= $this->isRaw() ? $this->getValue() : rawurlencode($this->getValue()); if (0 !== $this->getExpiresTime()) { $str .= '; expires='.gmdate('D, d M Y H:i:s T', $this->getExpiresTime()).'; Max-Age='.$this->getMaxAge(); } } if ($this->getPath()) { $str .= '; path='.$this->getPath(); } if ($this->getDomain()) { $str .= '; domain='.$this->getDomain(); } if ($this->isSecure()) { $str .= '; secure'; } if ($this->isHttpOnly()) { $str .= '; httponly'; } if (null !== $this->getSameSite()) { $str .= '; samesite='.$this->getSameSite(); } if ($this->isPartitioned()) { $str .= '; partitioned'; } return $str; } /** * Gets the name of the cookie. */ public function getName(): string { return $this->name; } /** * Gets the value of the cookie. */ public function getValue(): ?string { return $this->value; } /** * Gets the domain that the cookie is available to. */ public function getDomain(): ?string { return $this->domain; } /** * Gets the time the cookie expires. */ public function getExpiresTime(): int { return $this->expire; } /** * Gets the max-age attribute. */ public function getMaxAge(): int { $maxAge = $this->expire - time(); return 0 >= $maxAge ? 0 : $maxAge; } /** * Gets the path on the server in which the cookie will be available on. */ public function getPath(): string { return $this->path; } /** * Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client. */ public function isSecure(): bool { return $this->secure ?? $this->secureDefault; } /** * Checks whether the cookie will be made accessible only through the HTTP protocol. */ public function isHttpOnly(): bool { return $this->httpOnly; } /** * Whether this cookie is about to be cleared. */ public function isCleared(): bool { return 0 !== $this->expire && $this->expire < time(); } /** * Checks if the cookie value should be sent with no url encoding. */ public function isRaw(): bool { return $this->raw; } /** * Checks whether the cookie should be tied to the top-level site in cross-site context. */ public function isPartitioned(): bool { return $this->partitioned; } /** * @return self::SAMESITE_*|null */ public function getSameSite(): ?string { return $this->sameSite; } /** * @param bool $default The default value of the "secure" flag when it is set to null */ public function setSecureDefault(bool $default): void { $this->secureDefault = $default; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Exception/BadRequestException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Exception; /** * Raised when a user sends a malformed request. */ class BadRequestException extends UnexpectedValueException implements RequestExceptionInterface { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Exception; /** * The HTTP request contains headers with conflicting information. * * @author Magnus Nordlander */ class ConflictingHeadersException extends UnexpectedValueException implements RequestExceptionInterface { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Exception/JsonException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Exception; /** * Thrown by Request::toArray() when the content cannot be JSON-decoded. * * @author Tobias Nyholm */ final class JsonException extends UnexpectedValueException implements RequestExceptionInterface { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Exception; /** * Interface for Request exceptions. * * Exceptions implementing this interface should trigger an HTTP 400 response in the application code. */ interface RequestExceptionInterface { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Exception/SessionNotFoundException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Exception; /** * Raised when a session does not exist. This happens in the following cases: * - the session is not enabled * - attempt to read a session outside a request context (ie. cli script). * * @author Jérémy Derussé */ class SessionNotFoundException extends \LogicException implements RequestExceptionInterface { public function __construct(string $message = 'There is currently no session available.', int $code = 0, ?\Throwable $previous = null) { parent::__construct($message, $code, $previous); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Exception; /** * Raised when a user has performed an operation that should be considered * suspicious from a security perspective. */ class SuspiciousOperationException extends UnexpectedValueException implements RequestExceptionInterface { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Exception/UnexpectedValueException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Exception; class UnexpectedValueException extends \UnexpectedValueException { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/ExpressionRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; use Symfony\Component\ExpressionLanguage\Expression; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; use Symfony\Component\HttpFoundation\RequestMatcher\ExpressionRequestMatcher as NewExpressionRequestMatcher; trigger_deprecation('symfony/http-foundation', '6.2', 'The "%s" class is deprecated, use "%s" instead.', ExpressionRequestMatcher::class, NewExpressionRequestMatcher::class); /** * ExpressionRequestMatcher uses an expression to match a Request. * * @author Fabien Potencier * * @deprecated since Symfony 6.2, use "Symfony\Component\HttpFoundation\RequestMatcher\ExpressionRequestMatcher" instead */ class ExpressionRequestMatcher extends RequestMatcher { private ExpressionLanguage $language; private Expression|string $expression; /** * @return void */ public function setExpression(ExpressionLanguage $language, Expression|string $expression) { $this->language = $language; $this->expression = $expression; } public function matches(Request $request): bool { if (!isset($this->language)) { throw new \LogicException('Unable to match the request as the expression language is not available. Try running "composer require symfony/expression-language".'); } return $this->language->evaluate($this->expression, [ 'request' => $request, 'method' => $request->getMethod(), 'path' => rawurldecode($request->getPathInfo()), 'host' => $request->getHost(), 'ip' => $request->getClientIp(), 'attributes' => $request->attributes->all(), ]) && parent::matches($request); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when the access on a file was denied. * * @author Bernhard Schussek */ class AccessDeniedException extends FileException { public function __construct(string $path) { parent::__construct(sprintf('The file %s could not be accessed', $path)); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when an UPLOAD_ERR_CANT_WRITE error occurred with UploadedFile. * * @author Florent Mata */ class CannotWriteFileException extends FileException { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when an UPLOAD_ERR_EXTENSION error occurred with UploadedFile. * * @author Florent Mata */ class ExtensionFileException extends FileException { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/FileException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when an error occurred in the component File. * * @author Bernhard Schussek */ class FileException extends \RuntimeException { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when a file was not found. * * @author Bernhard Schussek */ class FileNotFoundException extends FileException { public function __construct(string $path) { parent::__construct(sprintf('The file "%s" does not exist', $path)); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when an UPLOAD_ERR_FORM_SIZE error occurred with UploadedFile. * * @author Florent Mata */ class FormSizeFileException extends FileException { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when an UPLOAD_ERR_INI_SIZE error occurred with UploadedFile. * * @author Florent Mata */ class IniSizeFileException extends FileException { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/NoFileException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when an UPLOAD_ERR_NO_FILE error occurred with UploadedFile. * * @author Florent Mata */ class NoFileException extends FileException { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when an UPLOAD_ERR_NO_TMP_DIR error occurred with UploadedFile. * * @author Florent Mata */ class NoTmpDirFileException extends FileException { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/PartialFileException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when an UPLOAD_ERR_PARTIAL error occurred with UploadedFile. * * @author Florent Mata */ class PartialFileException extends FileException { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; class UnexpectedTypeException extends FileException { public function __construct(mixed $value, string $expectedType) { parent::__construct(sprintf('Expected argument of type %s, %s given', $expectedType, get_debug_type($value))); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Exception/UploadException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File\Exception; /** * Thrown when an error occurred during file upload. * * @author Bernhard Schussek */ class UploadException extends FileException { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/File.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File; use Symfony\Component\HttpFoundation\File\Exception\FileException; use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; use Symfony\Component\Mime\MimeTypes; /** * A file in the file system. * * @author Bernhard Schussek */ class File extends \SplFileInfo { /** * Constructs a new file from the given path. * * @param string $path The path to the file * @param bool $checkPath Whether to check the path or not * * @throws FileNotFoundException If the given path is not a file */ public function __construct(string $path, bool $checkPath = true) { if ($checkPath && !is_file($path)) { throw new FileNotFoundException($path); } parent::__construct($path); } /** * Returns the extension based on the mime type. * * If the mime type is unknown, returns null. * * This method uses the mime type as guessed by getMimeType() * to guess the file extension. * * @see MimeTypes * @see getMimeType() */ public function guessExtension(): ?string { if (!class_exists(MimeTypes::class)) { throw new \LogicException('You cannot guess the extension as the Mime component is not installed. Try running "composer require symfony/mime".'); } return MimeTypes::getDefault()->getExtensions($this->getMimeType())[0] ?? null; } /** * Returns the mime type of the file. * * The mime type is guessed using a MimeTypeGuesserInterface instance, * which uses finfo_file() then the "file" system binary, * depending on which of those are available. * * @see MimeTypes */ public function getMimeType(): ?string { if (!class_exists(MimeTypes::class)) { throw new \LogicException('You cannot guess the mime type as the Mime component is not installed. Try running "composer require symfony/mime".'); } return MimeTypes::getDefault()->guessMimeType($this->getPathname()); } /** * Moves the file to a new location. * * @throws FileException if the target file could not be created */ public function move(string $directory, ?string $name = null): self { $target = $this->getTargetFile($directory, $name); set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); try { $renamed = rename($this->getPathname(), $target); } finally { restore_error_handler(); } if (!$renamed) { throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error))); } @chmod($target, 0666 & ~umask()); return $target; } public function getContent(): string { $content = file_get_contents($this->getPathname()); if (false === $content) { throw new FileException(sprintf('Could not get the content of the file "%s".', $this->getPathname())); } return $content; } protected function getTargetFile(string $directory, ?string $name = null): self { if (!is_dir($directory)) { if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) { throw new FileException(sprintf('Unable to create the "%s" directory.', $directory)); } } elseif (!is_writable($directory)) { throw new FileException(sprintf('Unable to write in the "%s" directory.', $directory)); } $target = rtrim($directory, '/\\').\DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name)); return new self($target, false); } /** * Returns locale independent base name of the given path. */ protected function getName(string $name): string { $originalName = str_replace('\\', '/', $name); $pos = strrpos($originalName, '/'); $originalName = false === $pos ? $originalName : substr($originalName, $pos + 1); return $originalName; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/Stream.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File; /** * A PHP stream of unknown size. * * @author Nicolas Grekas */ class Stream extends File { public function getSize(): int|false { return false; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/File/UploadedFile.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\File; use Symfony\Component\HttpFoundation\File\Exception\CannotWriteFileException; use Symfony\Component\HttpFoundation\File\Exception\ExtensionFileException; use Symfony\Component\HttpFoundation\File\Exception\FileException; use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; use Symfony\Component\HttpFoundation\File\Exception\FormSizeFileException; use Symfony\Component\HttpFoundation\File\Exception\IniSizeFileException; use Symfony\Component\HttpFoundation\File\Exception\NoFileException; use Symfony\Component\HttpFoundation\File\Exception\NoTmpDirFileException; use Symfony\Component\HttpFoundation\File\Exception\PartialFileException; use Symfony\Component\Mime\MimeTypes; /** * A file uploaded through a form. * * @author Bernhard Schussek * @author Florian Eckerstorfer * @author Fabien Potencier */ class UploadedFile extends File { private bool $test; private string $originalName; private string $mimeType; private int $error; /** * Accepts the information of the uploaded file as provided by the PHP global $_FILES. * * The file object is only created when the uploaded file is valid (i.e. when the * isValid() method returns true). Otherwise the only methods that could be called * on an UploadedFile instance are: * * * getClientOriginalName, * * getClientMimeType, * * isValid, * * getError. * * Calling any other method on an non-valid instance will cause an unpredictable result. * * @param string $path The full temporary path to the file * @param string $originalName The original file name of the uploaded file * @param string|null $mimeType The type of the file as provided by PHP; null defaults to application/octet-stream * @param int|null $error The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants); null defaults to UPLOAD_ERR_OK * @param bool $test Whether the test mode is active * Local files are used in test mode hence the code should not enforce HTTP uploads * * @throws FileException If file_uploads is disabled * @throws FileNotFoundException If the file does not exist */ public function __construct(string $path, string $originalName, ?string $mimeType = null, ?int $error = null, bool $test = false) { $this->originalName = $this->getName($originalName); $this->mimeType = $mimeType ?: 'application/octet-stream'; $this->error = $error ?: \UPLOAD_ERR_OK; $this->test = $test; parent::__construct($path, \UPLOAD_ERR_OK === $this->error); } /** * Returns the original file name. * * It is extracted from the request from which the file has been uploaded. * This should not be considered as a safe value to use for a file name on your servers. */ public function getClientOriginalName(): string { return $this->originalName; } /** * Returns the original file extension. * * It is extracted from the original file name that was uploaded. * This should not be considered as a safe value to use for a file name on your servers. */ public function getClientOriginalExtension(): string { return pathinfo($this->originalName, \PATHINFO_EXTENSION); } /** * Returns the file mime type. * * The client mime type is extracted from the request from which the file * was uploaded, so it should not be considered as a safe value. * * For a trusted mime type, use getMimeType() instead (which guesses the mime * type based on the file content). * * @see getMimeType() */ public function getClientMimeType(): string { return $this->mimeType; } /** * Returns the extension based on the client mime type. * * If the mime type is unknown, returns null. * * This method uses the mime type as guessed by getClientMimeType() * to guess the file extension. As such, the extension returned * by this method cannot be trusted. * * For a trusted extension, use guessExtension() instead (which guesses * the extension based on the guessed mime type for the file). * * @see guessExtension() * @see getClientMimeType() */ public function guessClientExtension(): ?string { if (!class_exists(MimeTypes::class)) { throw new \LogicException('You cannot guess the extension as the Mime component is not installed. Try running "composer require symfony/mime".'); } return MimeTypes::getDefault()->getExtensions($this->getClientMimeType())[0] ?? null; } /** * Returns the upload error. * * If the upload was successful, the constant UPLOAD_ERR_OK is returned. * Otherwise one of the other UPLOAD_ERR_XXX constants is returned. */ public function getError(): int { return $this->error; } /** * Returns whether the file has been uploaded with HTTP and no error occurred. */ public function isValid(): bool { $isOk = \UPLOAD_ERR_OK === $this->error; return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname()); } /** * Moves the file to a new location. * * @throws FileException if, for any reason, the file could not have been moved */ public function move(string $directory, ?string $name = null): File { if ($this->isValid()) { if ($this->test) { return parent::move($directory, $name); } $target = $this->getTargetFile($directory, $name); set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); try { $moved = move_uploaded_file($this->getPathname(), $target); } finally { restore_error_handler(); } if (!$moved) { throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error))); } @chmod($target, 0666 & ~umask()); return $target; } switch ($this->error) { case \UPLOAD_ERR_INI_SIZE: throw new IniSizeFileException($this->getErrorMessage()); case \UPLOAD_ERR_FORM_SIZE: throw new FormSizeFileException($this->getErrorMessage()); case \UPLOAD_ERR_PARTIAL: throw new PartialFileException($this->getErrorMessage()); case \UPLOAD_ERR_NO_FILE: throw new NoFileException($this->getErrorMessage()); case \UPLOAD_ERR_CANT_WRITE: throw new CannotWriteFileException($this->getErrorMessage()); case \UPLOAD_ERR_NO_TMP_DIR: throw new NoTmpDirFileException($this->getErrorMessage()); case \UPLOAD_ERR_EXTENSION: throw new ExtensionFileException($this->getErrorMessage()); } throw new FileException($this->getErrorMessage()); } /** * Returns the maximum size of an uploaded file as configured in php.ini. * * @return int|float The maximum size of an uploaded file in bytes (returns float if size > PHP_INT_MAX) */ public static function getMaxFilesize(): int|float { $sizePostMax = self::parseFilesize(\ini_get('post_max_size')); $sizeUploadMax = self::parseFilesize(\ini_get('upload_max_filesize')); return min($sizePostMax ?: \PHP_INT_MAX, $sizeUploadMax ?: \PHP_INT_MAX); } private static function parseFilesize(string $size): int|float { if ('' === $size) { return 0; } $size = strtolower($size); $max = ltrim($size, '+'); if (str_starts_with($max, '0x')) { $max = \intval($max, 16); } elseif (str_starts_with($max, '0')) { $max = \intval($max, 8); } else { $max = (int) $max; } switch (substr($size, -1)) { case 't': $max *= 1024; // no break case 'g': $max *= 1024; // no break case 'm': $max *= 1024; // no break case 'k': $max *= 1024; } return $max; } /** * Returns an informative upload error message. */ public function getErrorMessage(): string { static $errors = [ \UPLOAD_ERR_INI_SIZE => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d KiB).', \UPLOAD_ERR_FORM_SIZE => 'The file "%s" exceeds the upload limit defined in your form.', \UPLOAD_ERR_PARTIAL => 'The file "%s" was only partially uploaded.', \UPLOAD_ERR_NO_FILE => 'No file was uploaded.', \UPLOAD_ERR_CANT_WRITE => 'The file "%s" could not be written on disk.', \UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.', \UPLOAD_ERR_EXTENSION => 'File upload was stopped by a PHP extension.', ]; $errorCode = $this->error; $maxFilesize = \UPLOAD_ERR_INI_SIZE === $errorCode ? self::getMaxFilesize() / 1024 : 0; $message = $errors[$errorCode] ?? 'The file "%s" was not uploaded due to an unknown error.'; return sprintf($message, $this->getClientOriginalName(), $maxFilesize); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/FileBag.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; use Symfony\Component\HttpFoundation\File\UploadedFile; /** * FileBag is a container for uploaded files. * * @author Fabien Potencier * @author Bulat Shakirzyanov */ class FileBag extends ParameterBag { private const FILE_KEYS = ['error', 'name', 'size', 'tmp_name', 'type']; /** * @param array|UploadedFile[] $parameters An array of HTTP files */ public function __construct(array $parameters = []) { $this->replace($parameters); } /** * @return void */ public function replace(array $files = []) { $this->parameters = []; $this->add($files); } /** * @return void */ public function set(string $key, mixed $value) { if (!\is_array($value) && !$value instanceof UploadedFile) { throw new \InvalidArgumentException('An uploaded file must be an array or an instance of UploadedFile.'); } parent::set($key, $this->convertFileInformation($value)); } /** * @return void */ public function add(array $files = []) { foreach ($files as $key => $file) { $this->set($key, $file); } } /** * Converts uploaded files to UploadedFile instances. * * @return UploadedFile[]|UploadedFile|null */ protected function convertFileInformation(array|UploadedFile $file): array|UploadedFile|null { if ($file instanceof UploadedFile) { return $file; } $file = $this->fixPhpFilesArray($file); $keys = array_keys($file); sort($keys); if (self::FILE_KEYS == $keys) { if (\UPLOAD_ERR_NO_FILE == $file['error']) { $file = null; } else { $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['error'], false); } } else { $file = array_map(fn ($v) => $v instanceof UploadedFile || \is_array($v) ? $this->convertFileInformation($v) : $v, $file); if (array_keys($keys) === $keys) { $file = array_filter($file); } } return $file; } /** * Fixes a malformed PHP $_FILES array. * * PHP has a bug that the format of the $_FILES array differs, depending on * whether the uploaded file fields had normal field names or array-like * field names ("normal" vs. "parent[child]"). * * This method fixes the array to look like the "normal" $_FILES array. * * It's safe to pass an already converted array, in which case this method * just returns the original array unmodified. */ protected function fixPhpFilesArray(array $data): array { // Remove extra key added by PHP 8.1. unset($data['full_path']); $keys = array_keys($data); sort($keys); if (self::FILE_KEYS != $keys || !isset($data['name']) || !\is_array($data['name'])) { return $data; } $files = $data; foreach (self::FILE_KEYS as $k) { unset($files[$k]); } foreach ($data['name'] as $key => $name) { $files[$key] = $this->fixPhpFilesArray([ 'error' => $data['error'][$key], 'name' => $name, 'type' => $data['type'][$key], 'tmp_name' => $data['tmp_name'][$key], 'size' => $data['size'][$key], ]); } return $files; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/HeaderBag.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * HeaderBag is a container for HTTP headers. * * @author Fabien Potencier * * @implements \IteratorAggregate> */ class HeaderBag implements \IteratorAggregate, \Countable, \Stringable { protected const UPPER = '_ABCDEFGHIJKLMNOPQRSTUVWXYZ'; protected const LOWER = '-abcdefghijklmnopqrstuvwxyz'; /** * @var array> */ protected $headers = []; protected $cacheControl = []; public function __construct(array $headers = []) { foreach ($headers as $key => $values) { $this->set($key, $values); } } /** * Returns the headers as a string. */ public function __toString(): string { if (!$headers = $this->all()) { return ''; } ksort($headers); $max = max(array_map('strlen', array_keys($headers))) + 1; $content = ''; foreach ($headers as $name => $values) { $name = ucwords($name, '-'); foreach ($values as $value) { $content .= sprintf("%-{$max}s %s\r\n", $name.':', $value); } } return $content; } /** * Returns the headers. * * @param string|null $key The name of the headers to return or null to get them all * * @return ($key is null ? array> : list) */ public function all(?string $key = null): array { if (null !== $key) { return $this->headers[strtr($key, self::UPPER, self::LOWER)] ?? []; } return $this->headers; } /** * Returns the parameter keys. * * @return string[] */ public function keys(): array { return array_keys($this->all()); } /** * Replaces the current HTTP headers by a new set. * * @return void */ public function replace(array $headers = []) { $this->headers = []; $this->add($headers); } /** * Adds new headers the current HTTP headers set. * * @return void */ public function add(array $headers) { foreach ($headers as $key => $values) { $this->set($key, $values); } } /** * Returns the first header by name or the default one. */ public function get(string $key, ?string $default = null): ?string { $headers = $this->all($key); if (!$headers) { return $default; } if (null === $headers[0]) { return null; } return (string) $headers[0]; } /** * Sets a header by name. * * @param string|string[]|null $values The value or an array of values * @param bool $replace Whether to replace the actual value or not (true by default) * * @return void */ public function set(string $key, string|array|null $values, bool $replace = true) { $key = strtr($key, self::UPPER, self::LOWER); if (\is_array($values)) { $values = array_values($values); if (true === $replace || !isset($this->headers[$key])) { $this->headers[$key] = $values; } else { $this->headers[$key] = array_merge($this->headers[$key], $values); } } else { if (true === $replace || !isset($this->headers[$key])) { $this->headers[$key] = [$values]; } else { $this->headers[$key][] = $values; } } if ('cache-control' === $key) { $this->cacheControl = $this->parseCacheControl(implode(', ', $this->headers[$key])); } } /** * Returns true if the HTTP header is defined. */ public function has(string $key): bool { return \array_key_exists(strtr($key, self::UPPER, self::LOWER), $this->all()); } /** * Returns true if the given HTTP header contains the given value. */ public function contains(string $key, string $value): bool { return \in_array($value, $this->all($key)); } /** * Removes a header. * * @return void */ public function remove(string $key) { $key = strtr($key, self::UPPER, self::LOWER); unset($this->headers[$key]); if ('cache-control' === $key) { $this->cacheControl = []; } } /** * Returns the HTTP header value converted to a date. * * @return \DateTimeImmutable|null * * @throws \RuntimeException When the HTTP header is not parseable */ public function getDate(string $key, ?\DateTimeInterface $default = null): ?\DateTimeInterface { if (null === $value = $this->get($key)) { return null !== $default ? \DateTimeImmutable::createFromInterface($default) : null; } if (false === $date = \DateTimeImmutable::createFromFormat(\DATE_RFC2822, $value)) { throw new \RuntimeException(sprintf('The "%s" HTTP header is not parseable (%s).', $key, $value)); } return $date; } /** * Adds a custom Cache-Control directive. * * @return void */ public function addCacheControlDirective(string $key, bool|string $value = true) { $this->cacheControl[$key] = $value; $this->set('Cache-Control', $this->getCacheControlHeader()); } /** * Returns true if the Cache-Control directive is defined. */ public function hasCacheControlDirective(string $key): bool { return \array_key_exists($key, $this->cacheControl); } /** * Returns a Cache-Control directive value by name. */ public function getCacheControlDirective(string $key): bool|string|null { return $this->cacheControl[$key] ?? null; } /** * Removes a Cache-Control directive. * * @return void */ public function removeCacheControlDirective(string $key) { unset($this->cacheControl[$key]); $this->set('Cache-Control', $this->getCacheControlHeader()); } /** * Returns an iterator for headers. * * @return \ArrayIterator> */ public function getIterator(): \ArrayIterator { return new \ArrayIterator($this->headers); } /** * Returns the number of headers. */ public function count(): int { return \count($this->headers); } /** * @return string */ protected function getCacheControlHeader() { ksort($this->cacheControl); return HeaderUtils::toString($this->cacheControl, ','); } /** * Parses a Cache-Control HTTP header. */ protected function parseCacheControl(string $header): array { $parts = HeaderUtils::split($header, ',='); return HeaderUtils::combine($parts); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/HeaderUtils.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * HTTP header utility functions. * * @author Christian Schmidt */ class HeaderUtils { public const DISPOSITION_ATTACHMENT = 'attachment'; public const DISPOSITION_INLINE = 'inline'; /** * This class should not be instantiated. */ private function __construct() { } /** * Splits an HTTP header by one or more separators. * * Example: * * HeaderUtils::split('da, en-gb;q=0.8', ',;') * // => ['da'], ['en-gb', 'q=0.8']] * * @param string $separators List of characters to split on, ordered by * precedence, e.g. ',', ';=', or ',;=' * * @return array Nested array with as many levels as there are characters in * $separators */ public static function split(string $header, string $separators): array { if ('' === $separators) { throw new \InvalidArgumentException('At least one separator must be specified.'); } $quotedSeparators = preg_quote($separators, '/'); preg_match_all(' / (?!\s) (?: # quoted-string "(?:[^"\\\\]|\\\\.)*(?:"|\\\\|$) | # token [^"'.$quotedSeparators.']+ )+ (?['.$quotedSeparators.']) \s* /x', trim($header), $matches, \PREG_SET_ORDER); return self::groupParts($matches, $separators); } /** * Combines an array of arrays into one associative array. * * Each of the nested arrays should have one or two elements. The first * value will be used as the keys in the associative array, and the second * will be used as the values, or true if the nested array only contains one * element. Array keys are lowercased. * * Example: * * HeaderUtils::combine([['foo', 'abc'], ['bar']]) * // => ['foo' => 'abc', 'bar' => true] */ public static function combine(array $parts): array { $assoc = []; foreach ($parts as $part) { $name = strtolower($part[0]); $value = $part[1] ?? true; $assoc[$name] = $value; } return $assoc; } /** * Joins an associative array into a string for use in an HTTP header. * * The key and value of each entry are joined with '=', and all entries * are joined with the specified separator and an additional space (for * readability). Values are quoted if necessary. * * Example: * * HeaderUtils::toString(['foo' => 'abc', 'bar' => true, 'baz' => 'a b c'], ',') * // => 'foo=abc, bar, baz="a b c"' */ public static function toString(array $assoc, string $separator): string { $parts = []; foreach ($assoc as $name => $value) { if (true === $value) { $parts[] = $name; } else { $parts[] = $name.'='.self::quote($value); } } return implode($separator.' ', $parts); } /** * Encodes a string as a quoted string, if necessary. * * If a string contains characters not allowed by the "token" construct in * the HTTP specification, it is backslash-escaped and enclosed in quotes * to match the "quoted-string" construct. */ public static function quote(string $s): string { if (preg_match('/^[a-z0-9!#$%&\'*.^_`|~-]+$/i', $s)) { return $s; } return '"'.addcslashes($s, '"\\"').'"'; } /** * Decodes a quoted string. * * If passed an unquoted string that matches the "token" construct (as * defined in the HTTP specification), it is passed through verbatim. */ public static function unquote(string $s): string { return preg_replace('/\\\\(.)|"/', '$1', $s); } /** * Generates an HTTP Content-Disposition field-value. * * @param string $disposition One of "inline" or "attachment" * @param string $filename A unicode string * @param string $filenameFallback A string containing only ASCII characters that * is semantically equivalent to $filename. If the filename is already ASCII, * it can be omitted, or just copied from $filename * * @throws \InvalidArgumentException * * @see RFC 6266 */ public static function makeDisposition(string $disposition, string $filename, string $filenameFallback = ''): string { if (!\in_array($disposition, [self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE])) { throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE)); } if ('' === $filenameFallback) { $filenameFallback = $filename; } // filenameFallback is not ASCII. if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) { throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.'); } // percent characters aren't safe in fallback. if (str_contains($filenameFallback, '%')) { throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.'); } // path separators aren't allowed in either. if (str_contains($filename, '/') || str_contains($filename, '\\') || str_contains($filenameFallback, '/') || str_contains($filenameFallback, '\\')) { throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.'); } $params = ['filename' => $filenameFallback]; if ($filename !== $filenameFallback) { $params['filename*'] = "utf-8''".rawurlencode($filename); } return $disposition.'; '.self::toString($params, ';'); } /** * Like parse_str(), but preserves dots in variable names. */ public static function parseQuery(string $query, bool $ignoreBrackets = false, string $separator = '&'): array { $q = []; foreach (explode($separator, $query) as $v) { if (false !== $i = strpos($v, "\0")) { $v = substr($v, 0, $i); } if (false === $i = strpos($v, '=')) { $k = urldecode($v); $v = ''; } else { $k = urldecode(substr($v, 0, $i)); $v = substr($v, $i); } if (false !== $i = strpos($k, "\0")) { $k = substr($k, 0, $i); } $k = ltrim($k, ' '); if ($ignoreBrackets) { $q[$k][] = urldecode(substr($v, 1)); continue; } if (false === $i = strpos($k, '[')) { $q[] = bin2hex($k).$v; } else { $q[] = bin2hex(substr($k, 0, $i)).rawurlencode(substr($k, $i)).$v; } } if ($ignoreBrackets) { return $q; } parse_str(implode('&', $q), $q); $query = []; foreach ($q as $k => $v) { if (false !== $i = strpos($k, '_')) { $query[substr_replace($k, hex2bin(substr($k, 0, $i)).'[', 0, 1 + $i)] = $v; } else { $query[hex2bin($k)] = $v; } } return $query; } private static function groupParts(array $matches, string $separators, bool $first = true): array { $separator = $separators[0]; $separators = substr($separators, 1) ?: ''; $i = 0; if ('' === $separators && !$first) { $parts = ['']; foreach ($matches as $match) { if (!$i && isset($match['separator'])) { $i = 1; $parts[1] = ''; } else { $parts[$i] .= self::unquote($match[0]); } } return $parts; } $parts = []; $partMatches = []; foreach ($matches as $match) { if (($match['separator'] ?? null) === $separator) { ++$i; } else { $partMatches[$i][] = $match; } } foreach ($partMatches as $matches) { $parts[] = '' === $separators ? self::unquote($matches[0][0]) : self::groupParts($matches, $separators, false); } return $parts; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/InputBag.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; use Symfony\Component\HttpFoundation\Exception\BadRequestException; use Symfony\Component\HttpFoundation\Exception\UnexpectedValueException; /** * InputBag is a container for user input values such as $_GET, $_POST, $_REQUEST, and $_COOKIE. * * @author Saif Eddin Gmati */ final class InputBag extends ParameterBag { /** * Returns a scalar input value by name. * * @param string|int|float|bool|null $default The default value if the input key does not exist */ public function get(string $key, mixed $default = null): string|int|float|bool|null { if (null !== $default && !\is_scalar($default) && !$default instanceof \Stringable) { throw new \InvalidArgumentException(sprintf('Expected a scalar value as a 2nd argument to "%s()", "%s" given.', __METHOD__, get_debug_type($default))); } $value = parent::get($key, $this); if (null !== $value && $this !== $value && !\is_scalar($value) && !$value instanceof \Stringable) { throw new BadRequestException(sprintf('Input value "%s" contains a non-scalar value.', $key)); } return $this === $value ? $default : $value; } /** * Replaces the current input values by a new set. */ public function replace(array $inputs = []): void { $this->parameters = []; $this->add($inputs); } /** * Adds input values. */ public function add(array $inputs = []): void { foreach ($inputs as $input => $value) { $this->set($input, $value); } } /** * Sets an input by name. * * @param string|int|float|bool|array|null $value */ public function set(string $key, mixed $value): void { if (null !== $value && !\is_scalar($value) && !\is_array($value) && !$value instanceof \Stringable) { throw new \InvalidArgumentException(sprintf('Expected a scalar, or an array as a 2nd argument to "%s()", "%s" given.', __METHOD__, get_debug_type($value))); } $this->parameters[$key] = $value; } /** * Returns the parameter value converted to an enum. * * @template T of \BackedEnum * * @param class-string $class * @param ?T $default * * @return ?T */ public function getEnum(string $key, string $class, ?\BackedEnum $default = null): ?\BackedEnum { try { return parent::getEnum($key, $class, $default); } catch (UnexpectedValueException $e) { throw new BadRequestException($e->getMessage(), $e->getCode(), $e); } } /** * Returns the parameter value converted to string. */ public function getString(string $key, string $default = ''): string { // Shortcuts the parent method because the validation on scalar is already done in get(). return (string) $this->get($key, $default); } public function filter(string $key, mixed $default = null, int $filter = \FILTER_DEFAULT, mixed $options = []): mixed { $value = $this->has($key) ? $this->all()[$key] : $default; // Always turn $options into an array - this allows filter_var option shortcuts. if (!\is_array($options) && $options) { $options = ['flags' => $options]; } if (\is_array($value) && !(($options['flags'] ?? 0) & (\FILTER_REQUIRE_ARRAY | \FILTER_FORCE_ARRAY))) { throw new BadRequestException(sprintf('Input value "%s" contains an array, but "FILTER_REQUIRE_ARRAY" or "FILTER_FORCE_ARRAY" flags were not set.', $key)); } if ((\FILTER_CALLBACK & $filter) && !(($options['options'] ?? null) instanceof \Closure)) { throw new \InvalidArgumentException(sprintf('A Closure must be passed to "%s()" when FILTER_CALLBACK is used, "%s" given.', __METHOD__, get_debug_type($options['options'] ?? null))); } $options['flags'] ??= 0; $nullOnFailure = $options['flags'] & \FILTER_NULL_ON_FAILURE; $options['flags'] |= \FILTER_NULL_ON_FAILURE; $value = filter_var($value, $filter, $options); if (null !== $value || $nullOnFailure) { return $value; } $method = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS | \DEBUG_BACKTRACE_PROVIDE_OBJECT, 2)[1]; $method = ($method['object'] ?? null) === $this ? $method['function'] : 'filter'; $hint = 'filter' === $method ? 'pass' : 'use method "filter()" with'; trigger_deprecation('symfony/http-foundation', '6.3', 'Ignoring invalid values when using "%s::%s(\'%s\')" is deprecated and will throw a "%s" in 7.0; '.$hint.' flag "FILTER_NULL_ON_FAILURE" to keep ignoring them.', $this::class, $method, $key, BadRequestException::class); return false; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/IpUtils.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * Http utility functions. * * @author Fabien Potencier */ class IpUtils { public const PRIVATE_SUBNETS = [ '127.0.0.0/8', // RFC1700 (Loopback) '10.0.0.0/8', // RFC1918 '192.168.0.0/16', // RFC1918 '172.16.0.0/12', // RFC1918 '169.254.0.0/16', // RFC3927 '0.0.0.0/8', // RFC5735 '240.0.0.0/4', // RFC1112 '::1/128', // Loopback 'fc00::/7', // Unique Local Address 'fe80::/10', // Link Local Address '::ffff:0:0/96', // IPv4 translations '::/128', // Unspecified address ]; private static array $checkedIps = []; /** * This class should not be instantiated. */ private function __construct() { } /** * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets. * * @param string|array $ips List of IPs or subnets (can be a string if only a single one) */ public static function checkIp(string $requestIp, string|array $ips): bool { if (!\is_array($ips)) { $ips = [$ips]; } $method = substr_count($requestIp, ':') > 1 ? 'checkIp6' : 'checkIp4'; foreach ($ips as $ip) { if (self::$method($requestIp, $ip)) { return true; } } return false; } /** * Compares two IPv4 addresses. * In case a subnet is given, it checks if it contains the request IP. * * @param string $ip IPv4 address or subnet in CIDR notation * * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet */ public static function checkIp4(string $requestIp, string $ip): bool { $cacheKey = $requestIp.'-'.$ip.'-v4'; if (null !== $cacheValue = self::getCacheResult($cacheKey)) { return $cacheValue; } if (!filter_var($requestIp, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { return self::setCacheResult($cacheKey, false); } if (str_contains($ip, '/')) { [$address, $netmask] = explode('/', $ip, 2); if ('0' === $netmask) { return self::setCacheResult($cacheKey, false !== filter_var($address, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)); } if ($netmask < 0 || $netmask > 32) { return self::setCacheResult($cacheKey, false); } } else { $address = $ip; $netmask = 32; } if (false === ip2long($address)) { return self::setCacheResult($cacheKey, false); } return self::setCacheResult($cacheKey, 0 === substr_compare(sprintf('%032b', ip2long($requestIp)), sprintf('%032b', ip2long($address)), 0, $netmask)); } /** * Compares two IPv6 addresses. * In case a subnet is given, it checks if it contains the request IP. * * @author David Soria Parra * * @see https://github.com/dsp/v6tools * * @param string $ip IPv6 address or subnet in CIDR notation * * @throws \RuntimeException When IPV6 support is not enabled */ public static function checkIp6(string $requestIp, string $ip): bool { $cacheKey = $requestIp.'-'.$ip.'-v6'; if (null !== $cacheValue = self::getCacheResult($cacheKey)) { return $cacheValue; } if (!((\extension_loaded('sockets') && \defined('AF_INET6')) || @inet_pton('::1'))) { throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".'); } // Check to see if we were given a IP4 $requestIp or $ip by mistake if (!filter_var($requestIp, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { return self::setCacheResult($cacheKey, false); } if (str_contains($ip, '/')) { [$address, $netmask] = explode('/', $ip, 2); if (!filter_var($address, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { return self::setCacheResult($cacheKey, false); } if ('0' === $netmask) { return (bool) unpack('n*', @inet_pton($address)); } if ($netmask < 1 || $netmask > 128) { return self::setCacheResult($cacheKey, false); } } else { if (!filter_var($ip, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { return self::setCacheResult($cacheKey, false); } $address = $ip; $netmask = 128; } $bytesAddr = unpack('n*', @inet_pton($address)); $bytesTest = unpack('n*', @inet_pton($requestIp)); if (!$bytesAddr || !$bytesTest) { return self::setCacheResult($cacheKey, false); } for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; ++$i) { $left = $netmask - 16 * ($i - 1); $left = ($left <= 16) ? $left : 16; $mask = ~(0xFFFF >> $left) & 0xFFFF; if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) { return self::setCacheResult($cacheKey, false); } } return self::setCacheResult($cacheKey, true); } /** * Anonymizes an IP/IPv6. * * Removes the last byte for v4 and the last 8 bytes for v6 IPs */ public static function anonymize(string $ip): string { $wrappedIPv6 = false; if (str_starts_with($ip, '[') && str_ends_with($ip, ']')) { $wrappedIPv6 = true; $ip = substr($ip, 1, -1); } $packedAddress = inet_pton($ip); if (4 === \strlen($packedAddress)) { $mask = '255.255.255.0'; } elseif ($ip === inet_ntop($packedAddress & inet_pton('::ffff:ffff:ffff'))) { $mask = '::ffff:ffff:ff00'; } elseif ($ip === inet_ntop($packedAddress & inet_pton('::ffff:ffff'))) { $mask = '::ffff:ff00'; } else { $mask = 'ffff:ffff:ffff:ffff:0000:0000:0000:0000'; } $ip = inet_ntop($packedAddress & inet_pton($mask)); if ($wrappedIPv6) { $ip = '['.$ip.']'; } return $ip; } /** * Checks if an IPv4 or IPv6 address is contained in the list of private IP subnets. */ public static function isPrivateIp(string $requestIp): bool { return self::checkIp($requestIp, self::PRIVATE_SUBNETS); } private static function getCacheResult(string $cacheKey): ?bool { if (isset(self::$checkedIps[$cacheKey])) { // Move the item last in cache (LRU) $value = self::$checkedIps[$cacheKey]; unset(self::$checkedIps[$cacheKey]); self::$checkedIps[$cacheKey] = $value; return self::$checkedIps[$cacheKey]; } return null; } private static function setCacheResult(string $cacheKey, bool $result): bool { if (1000 < \count(self::$checkedIps)) { // stop memory leak if there are many keys self::$checkedIps = \array_slice(self::$checkedIps, 500, null, true); } return self::$checkedIps[$cacheKey] = $result; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/JsonResponse.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * Response represents an HTTP response in JSON format. * * Note that this class does not force the returned JSON content to be an * object. It is however recommended that you do return an object as it * protects yourself against XSSI and JSON-JavaScript Hijacking. * * @see https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/AJAX_Security_Cheat_Sheet.md#always-return-json-with-an-object-on-the-outside * * @author Igor Wiedler */ class JsonResponse extends Response { protected $data; protected $callback; // Encode <, >, ', &, and " characters in the JSON, making it also safe to be embedded into HTML. // 15 === JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT public const DEFAULT_ENCODING_OPTIONS = 15; protected $encodingOptions = self::DEFAULT_ENCODING_OPTIONS; /** * @param bool $json If the data is already a JSON string */ public function __construct(mixed $data = null, int $status = 200, array $headers = [], bool $json = false) { parent::__construct('', $status, $headers); if ($json && !\is_string($data) && !is_numeric($data) && !\is_callable([$data, '__toString'])) { throw new \TypeError(sprintf('"%s": If $json is set to true, argument $data must be a string or object implementing __toString(), "%s" given.', __METHOD__, get_debug_type($data))); } $data ??= new \ArrayObject(); $json ? $this->setJson($data) : $this->setData($data); } /** * Factory method for chainability. * * Example: * * return JsonResponse::fromJsonString('{"key": "value"}') * ->setSharedMaxAge(300); * * @param string $data The JSON response string * @param int $status The response status code (200 "OK" by default) * @param array $headers An array of response headers */ public static function fromJsonString(string $data, int $status = 200, array $headers = []): static { return new static($data, $status, $headers, true); } /** * Sets the JSONP callback. * * @param string|null $callback The JSONP callback or null to use none * * @return $this * * @throws \InvalidArgumentException When the callback name is not valid */ public function setCallback(?string $callback = null): static { if (1 > \func_num_args()) { trigger_deprecation('symfony/http-foundation', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); } if (null !== $callback) { // partially taken from https://geekality.net/2011/08/03/valid-javascript-identifier/ // partially taken from https://github.com/willdurand/JsonpCallbackValidator // JsonpCallbackValidator is released under the MIT License. See https://github.com/willdurand/JsonpCallbackValidator/blob/v1.1.0/LICENSE for details. // (c) William Durand $pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*(?:\[(?:"(?:\\\.|[^"\\\])*"|\'(?:\\\.|[^\'\\\])*\'|\d+)\])*?$/u'; $reserved = [ 'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while', 'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum', 'extends', 'super', 'const', 'export', 'import', 'implements', 'let', 'private', 'public', 'yield', 'interface', 'package', 'protected', 'static', 'null', 'true', 'false', ]; $parts = explode('.', $callback); foreach ($parts as $part) { if (!preg_match($pattern, $part) || \in_array($part, $reserved, true)) { throw new \InvalidArgumentException('The callback name is not valid.'); } } } $this->callback = $callback; return $this->update(); } /** * Sets a raw string containing a JSON document to be sent. * * @return $this */ public function setJson(string $json): static { $this->data = $json; return $this->update(); } /** * Sets the data to be sent as JSON. * * @return $this * * @throws \InvalidArgumentException */ public function setData(mixed $data = []): static { try { $data = json_encode($data, $this->encodingOptions); } catch (\Exception $e) { if ('Exception' === $e::class && str_starts_with($e->getMessage(), 'Failed calling ')) { throw $e->getPrevious() ?: $e; } throw $e; } if (\JSON_THROW_ON_ERROR & $this->encodingOptions) { return $this->setJson($data); } if (\JSON_ERROR_NONE !== json_last_error()) { throw new \InvalidArgumentException(json_last_error_msg()); } return $this->setJson($data); } /** * Returns options used while encoding data to JSON. */ public function getEncodingOptions(): int { return $this->encodingOptions; } /** * Sets options used while encoding data to JSON. * * @return $this */ public function setEncodingOptions(int $encodingOptions): static { $this->encodingOptions = $encodingOptions; return $this->setData(json_decode($this->data)); } /** * Updates the content and headers according to the JSON data and callback. * * @return $this */ protected function update(): static { if (null !== $this->callback) { // Not using application/javascript for compatibility reasons with older browsers. $this->headers->set('Content-Type', 'text/javascript'); return $this->setContent(sprintf('/**/%s(%s);', $this->callback, $this->data)); } // Only set the header when there is none or when it equals 'text/javascript' (from a previous update with callback) // in order to not overwrite a custom definition. if (!$this->headers->has('Content-Type') || 'text/javascript' === $this->headers->get('Content-Type')) { $this->headers->set('Content-Type', 'application/json'); } return $this->setContent($this->data); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/LICENSE ================================================ Copyright (c) 2004-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/ParameterBag.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; use Symfony\Component\HttpFoundation\Exception\BadRequestException; use Symfony\Component\HttpFoundation\Exception\UnexpectedValueException; /** * ParameterBag is a container for key/value pairs. * * @author Fabien Potencier * * @implements \IteratorAggregate */ class ParameterBag implements \IteratorAggregate, \Countable { /** * Parameter storage. */ protected $parameters; public function __construct(array $parameters = []) { $this->parameters = $parameters; } /** * Returns the parameters. * * @param string|null $key The name of the parameter to return or null to get them all */ public function all(?string $key = null): array { if (null === $key) { return $this->parameters; } if (!\is_array($value = $this->parameters[$key] ?? [])) { throw new BadRequestException(sprintf('Unexpected value for parameter "%s": expecting "array", got "%s".', $key, get_debug_type($value))); } return $value; } /** * Returns the parameter keys. */ public function keys(): array { return array_keys($this->parameters); } /** * Replaces the current parameters by a new set. * * @return void */ public function replace(array $parameters = []) { $this->parameters = $parameters; } /** * Adds parameters. * * @return void */ public function add(array $parameters = []) { $this->parameters = array_replace($this->parameters, $parameters); } public function get(string $key, mixed $default = null): mixed { return \array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default; } /** * @return void */ public function set(string $key, mixed $value) { $this->parameters[$key] = $value; } /** * Returns true if the parameter is defined. */ public function has(string $key): bool { return \array_key_exists($key, $this->parameters); } /** * Removes a parameter. * * @return void */ public function remove(string $key) { unset($this->parameters[$key]); } /** * Returns the alphabetic characters of the parameter value. */ public function getAlpha(string $key, string $default = ''): string { return preg_replace('/[^[:alpha:]]/', '', $this->getString($key, $default)); } /** * Returns the alphabetic characters and digits of the parameter value. */ public function getAlnum(string $key, string $default = ''): string { return preg_replace('/[^[:alnum:]]/', '', $this->getString($key, $default)); } /** * Returns the digits of the parameter value. */ public function getDigits(string $key, string $default = ''): string { return preg_replace('/[^[:digit:]]/', '', $this->getString($key, $default)); } /** * Returns the parameter as string. */ public function getString(string $key, string $default = ''): string { $value = $this->get($key, $default); if (!\is_scalar($value) && !$value instanceof \Stringable) { throw new UnexpectedValueException(sprintf('Parameter value "%s" cannot be converted to "string".', $key)); } return (string) $value; } /** * Returns the parameter value converted to integer. */ public function getInt(string $key, int $default = 0): int { // In 7.0 remove the fallback to 0, in case of failure an exception will be thrown return $this->filter($key, $default, \FILTER_VALIDATE_INT, ['flags' => \FILTER_REQUIRE_SCALAR]) ?: 0; } /** * Returns the parameter value converted to boolean. */ public function getBoolean(string $key, bool $default = false): bool { return $this->filter($key, $default, \FILTER_VALIDATE_BOOL, ['flags' => \FILTER_REQUIRE_SCALAR]); } /** * Returns the parameter value converted to an enum. * * @template T of \BackedEnum * * @param class-string $class * @param ?T $default * * @return ?T */ public function getEnum(string $key, string $class, ?\BackedEnum $default = null): ?\BackedEnum { $value = $this->get($key); if (null === $value) { return $default; } try { return $class::from($value); } catch (\ValueError|\TypeError $e) { throw new UnexpectedValueException(sprintf('Parameter "%s" cannot be converted to enum: %s.', $key, $e->getMessage()), $e->getCode(), $e); } } /** * Filter key. * * @param int $filter FILTER_* constant * @param int|array{flags?: int, options?: array} $options Flags from FILTER_* constants * * @see https://php.net/filter-var */ public function filter(string $key, mixed $default = null, int $filter = \FILTER_DEFAULT, mixed $options = []): mixed { $value = $this->get($key, $default); // Always turn $options into an array - this allows filter_var option shortcuts. if (!\is_array($options) && $options) { $options = ['flags' => $options]; } // Add a convenience check for arrays. if (\is_array($value) && !isset($options['flags'])) { $options['flags'] = \FILTER_REQUIRE_ARRAY; } if (\is_object($value) && !$value instanceof \Stringable) { throw new UnexpectedValueException(sprintf('Parameter value "%s" cannot be filtered.', $key)); } if ((\FILTER_CALLBACK & $filter) && !(($options['options'] ?? null) instanceof \Closure)) { throw new \InvalidArgumentException(sprintf('A Closure must be passed to "%s()" when FILTER_CALLBACK is used, "%s" given.', __METHOD__, get_debug_type($options['options'] ?? null))); } $options['flags'] ??= 0; $nullOnFailure = $options['flags'] & \FILTER_NULL_ON_FAILURE; $options['flags'] |= \FILTER_NULL_ON_FAILURE; $value = filter_var($value, $filter, $options); if (null !== $value || $nullOnFailure) { return $value; } $method = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS | \DEBUG_BACKTRACE_PROVIDE_OBJECT, 2)[1]; $method = ($method['object'] ?? null) === $this ? $method['function'] : 'filter'; $hint = 'filter' === $method ? 'pass' : 'use method "filter()" with'; trigger_deprecation('symfony/http-foundation', '6.3', 'Ignoring invalid values when using "%s::%s(\'%s\')" is deprecated and will throw an "%s" in 7.0; '.$hint.' flag "FILTER_NULL_ON_FAILURE" to keep ignoring them.', $this::class, $method, $key, UnexpectedValueException::class); return false; } /** * Returns an iterator for parameters. * * @return \ArrayIterator */ public function getIterator(): \ArrayIterator { return new \ArrayIterator($this->parameters); } /** * Returns the number of parameters. */ public function count(): int { return \count($this->parameters); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/README.md ================================================ HttpFoundation Component ======================== The HttpFoundation component defines an object-oriented layer for the HTTP specification. Resources --------- * [Documentation](https://symfony.com/doc/current/components/http_foundation.html) * [Contributing](https://symfony.com/doc/current/contributing/index.html) * [Report issues](https://github.com/symfony/symfony/issues) and [send Pull Requests](https://github.com/symfony/symfony/pulls) in the [main Symfony repository](https://github.com/symfony/symfony) ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RateLimiter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\RateLimiter\LimiterInterface; use Symfony\Component\RateLimiter\Policy\NoLimiter; use Symfony\Component\RateLimiter\RateLimit; /** * An implementation of PeekableRequestRateLimiterInterface that * fits most use-cases. * * @author Wouter de Jong */ abstract class AbstractRequestRateLimiter implements PeekableRequestRateLimiterInterface { public function consume(Request $request): RateLimit { return $this->doConsume($request, 1); } public function peek(Request $request): RateLimit { return $this->doConsume($request, 0); } private function doConsume(Request $request, int $tokens): RateLimit { $limiters = $this->getLimiters($request); if (0 === \count($limiters)) { $limiters = [new NoLimiter()]; } $minimalRateLimit = null; foreach ($limiters as $limiter) { $rateLimit = $limiter->consume($tokens); $minimalRateLimit = $minimalRateLimit ? self::getMinimalRateLimit($minimalRateLimit, $rateLimit) : $rateLimit; } return $minimalRateLimit; } public function reset(Request $request): void { foreach ($this->getLimiters($request) as $limiter) { $limiter->reset(); } } /** * @return LimiterInterface[] a set of limiters using keys extracted from the request */ abstract protected function getLimiters(Request $request): array; private static function getMinimalRateLimit(RateLimit $first, RateLimit $second): RateLimit { if ($first->isAccepted() !== $second->isAccepted()) { return $first->isAccepted() ? $second : $first; } $firstRemainingTokens = $first->getRemainingTokens(); $secondRemainingTokens = $second->getRemainingTokens(); if ($firstRemainingTokens === $secondRemainingTokens) { return $first->getRetryAfter() < $second->getRetryAfter() ? $second : $first; } return $firstRemainingTokens > $secondRemainingTokens ? $second : $first; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RateLimiter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\RateLimiter\RateLimit; /** * A request limiter which allows peeking ahead. * * This is valuable to reduce the cache backend load in scenarios * like a login when we only want to consume a token on login failure, * and where the majority of requests will be successful and thus not * need to consume a token. * * This way we can peek ahead before allowing the request through, and * only consume if the request failed (1 backend op). This is compared * to always consuming and then resetting the limit if the request * is successful (2 backend ops). * * @author Jordi Boggiano */ interface PeekableRequestRateLimiterInterface extends RequestRateLimiterInterface { public function peek(Request $request): RateLimit; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RateLimiter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\RateLimiter\RateLimit; /** * A special type of limiter that deals with requests. * * This allows to limit on different types of information * from the requests. * * @author Wouter de Jong */ interface RequestRateLimiterInterface { public function consume(Request $request): RateLimit; public function reset(Request $request): void; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RedirectResponse.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * RedirectResponse represents an HTTP response doing a redirect. * * @author Fabien Potencier */ class RedirectResponse extends Response { protected $targetUrl; /** * Creates a redirect response so that it conforms to the rules defined for a redirect status code. * * @param string $url The URL to redirect to. The URL should be a full URL, with schema etc., * but practically every browser redirects on paths only as well * @param int $status The HTTP status code (302 "Found" by default) * @param array $headers The headers (Location is always set to the given URL) * * @throws \InvalidArgumentException * * @see https://tools.ietf.org/html/rfc2616#section-10.3 */ public function __construct(string $url, int $status = 302, array $headers = []) { parent::__construct('', $status, $headers); $this->setTargetUrl($url); if (!$this->isRedirect()) { throw new \InvalidArgumentException(sprintf('The HTTP status code is not a redirect ("%s" given).', $status)); } if (301 == $status && !\array_key_exists('cache-control', array_change_key_case($headers, \CASE_LOWER))) { $this->headers->remove('cache-control'); } } /** * Returns the target URL. */ public function getTargetUrl(): string { return $this->targetUrl; } /** * Sets the redirect target of this response. * * @return $this * * @throws \InvalidArgumentException */ public function setTargetUrl(string $url): static { if ('' === $url) { throw new \InvalidArgumentException('Cannot redirect to an empty URL.'); } $this->targetUrl = $url; $this->setContent( sprintf(' Redirecting to %1$s Redirecting to %1$s. ', htmlspecialchars($url, \ENT_QUOTES, 'UTF-8'))); $this->headers->set('Location', $url); $this->headers->set('Content-Type', 'text/html; charset=utf-8'); return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Request.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException; use Symfony\Component\HttpFoundation\Exception\JsonException; use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException; use Symfony\Component\HttpFoundation\Exception\SuspiciousOperationException; use Symfony\Component\HttpFoundation\Session\SessionInterface; // Help opcache.preload discover always-needed symbols class_exists(AcceptHeader::class); class_exists(FileBag::class); class_exists(HeaderBag::class); class_exists(HeaderUtils::class); class_exists(InputBag::class); class_exists(ParameterBag::class); class_exists(ServerBag::class); /** * Request represents an HTTP request. * * The methods dealing with URL accept / return a raw path (% encoded): * * getBasePath * * getBaseUrl * * getPathInfo * * getRequestUri * * getUri * * getUriForPath * * @author Fabien Potencier */ class Request { public const HEADER_FORWARDED = 0b000001; // When using RFC 7239 public const HEADER_X_FORWARDED_FOR = 0b000010; public const HEADER_X_FORWARDED_HOST = 0b000100; public const HEADER_X_FORWARDED_PROTO = 0b001000; public const HEADER_X_FORWARDED_PORT = 0b010000; public const HEADER_X_FORWARDED_PREFIX = 0b100000; public const HEADER_X_FORWARDED_AWS_ELB = 0b0011010; // AWS ELB doesn't send X-Forwarded-Host public const HEADER_X_FORWARDED_TRAEFIK = 0b0111110; // All "X-Forwarded-*" headers sent by Traefik reverse proxy public const METHOD_HEAD = 'HEAD'; public const METHOD_GET = 'GET'; public const METHOD_POST = 'POST'; public const METHOD_PUT = 'PUT'; public const METHOD_PATCH = 'PATCH'; public const METHOD_DELETE = 'DELETE'; public const METHOD_PURGE = 'PURGE'; public const METHOD_OPTIONS = 'OPTIONS'; public const METHOD_TRACE = 'TRACE'; public const METHOD_CONNECT = 'CONNECT'; /** * @var string[] */ protected static $trustedProxies = []; /** * @var string[] */ protected static $trustedHostPatterns = []; /** * @var string[] */ protected static $trustedHosts = []; protected static $httpMethodParameterOverride = false; /** * Custom parameters. * * @var ParameterBag */ public $attributes; /** * Request body parameters ($_POST). * * @see getPayload() for portability between content types * * @var InputBag */ public $request; /** * Query string parameters ($_GET). * * @var InputBag */ public $query; /** * Server and execution environment parameters ($_SERVER). * * @var ServerBag */ public $server; /** * Uploaded files ($_FILES). * * @var FileBag */ public $files; /** * Cookies ($_COOKIE). * * @var InputBag */ public $cookies; /** * Headers (taken from the $_SERVER). * * @var HeaderBag */ public $headers; /** * @var string|resource|false|null */ protected $content; /** * @var string[]|null */ protected $languages; /** * @var string[]|null */ protected $charsets; /** * @var string[]|null */ protected $encodings; /** * @var string[]|null */ protected $acceptableContentTypes; /** * @var string|null */ protected $pathInfo; /** * @var string|null */ protected $requestUri; /** * @var string|null */ protected $baseUrl; /** * @var string|null */ protected $basePath; /** * @var string|null */ protected $method; /** * @var string|null */ protected $format; /** * @var SessionInterface|callable():SessionInterface|null */ protected $session; /** * @var string|null */ protected $locale; /** * @var string */ protected $defaultLocale = 'en'; /** * @var array|null */ protected static $formats; protected static $requestFactory; private ?string $preferredFormat = null; private bool $isHostValid = true; private bool $isForwardedValid = true; private bool $isSafeContentPreferred; private array $trustedValuesCache = []; private static int $trustedHeaderSet = -1; private const FORWARDED_PARAMS = [ self::HEADER_X_FORWARDED_FOR => 'for', self::HEADER_X_FORWARDED_HOST => 'host', self::HEADER_X_FORWARDED_PROTO => 'proto', self::HEADER_X_FORWARDED_PORT => 'host', ]; /** * Names for headers that can be trusted when * using trusted proxies. * * The FORWARDED header is the standard as of rfc7239. * * The other headers are non-standard, but widely used * by popular reverse proxies (like Apache mod_proxy or Amazon EC2). */ private const TRUSTED_HEADERS = [ self::HEADER_FORWARDED => 'FORWARDED', self::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR', self::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST', self::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO', self::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT', self::HEADER_X_FORWARDED_PREFIX => 'X_FORWARDED_PREFIX', ]; /** @var bool */ private $isIisRewrite = false; /** * @param array $query The GET parameters * @param array $request The POST parameters * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) * @param array $cookies The COOKIE parameters * @param array $files The FILES parameters * @param array $server The SERVER parameters * @param string|resource|null $content The raw body data */ public function __construct(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null) { $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content); } /** * Sets the parameters for this request. * * This method also re-initializes all properties. * * @param array $query The GET parameters * @param array $request The POST parameters * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) * @param array $cookies The COOKIE parameters * @param array $files The FILES parameters * @param array $server The SERVER parameters * @param string|resource|null $content The raw body data * * @return void */ public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null) { $this->request = new InputBag($request); $this->query = new InputBag($query); $this->attributes = new ParameterBag($attributes); $this->cookies = new InputBag($cookies); $this->files = new FileBag($files); $this->server = new ServerBag($server); $this->headers = new HeaderBag($this->server->getHeaders()); $this->content = $content; $this->languages = null; $this->charsets = null; $this->encodings = null; $this->acceptableContentTypes = null; $this->pathInfo = null; $this->requestUri = null; $this->baseUrl = null; $this->basePath = null; $this->method = null; $this->format = null; } /** * Creates a new request with values from PHP's super globals. */ public static function createFromGlobals(): static { $request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER); if (str_starts_with($request->headers->get('CONTENT_TYPE', ''), 'application/x-www-form-urlencoded') && \in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH']) ) { parse_str($request->getContent(), $data); $request->request = new InputBag($data); } return $request; } /** * Creates a Request based on a given URI and configuration. * * The information contained in the URI always take precedence * over the other information (server and parameters). * * @param string $uri The URI * @param string $method The HTTP method * @param array $parameters The query (GET) or request (POST) parameters * @param array $cookies The request cookies ($_COOKIE) * @param array $files The request files ($_FILES) * @param array $server The server parameters ($_SERVER) * @param string|resource|null $content The raw body data */ public static function create(string $uri, string $method = 'GET', array $parameters = [], array $cookies = [], array $files = [], array $server = [], $content = null): static { $server = array_replace([ 'SERVER_NAME' => 'localhost', 'SERVER_PORT' => 80, 'HTTP_HOST' => 'localhost', 'HTTP_USER_AGENT' => 'Symfony', 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5', 'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'REMOTE_ADDR' => '127.0.0.1', 'SCRIPT_NAME' => '', 'SCRIPT_FILENAME' => '', 'SERVER_PROTOCOL' => 'HTTP/1.1', 'REQUEST_TIME' => time(), 'REQUEST_TIME_FLOAT' => microtime(true), ], $server); $server['PATH_INFO'] = ''; $server['REQUEST_METHOD'] = strtoupper($method); $components = parse_url($uri); if (false === $components) { trigger_deprecation('symfony/http-foundation', '6.3', 'Calling "%s()" with an invalid URI is deprecated.', __METHOD__); $components = []; } if (isset($components['host'])) { $server['SERVER_NAME'] = $components['host']; $server['HTTP_HOST'] = $components['host']; } if (isset($components['scheme'])) { if ('https' === $components['scheme']) { $server['HTTPS'] = 'on'; $server['SERVER_PORT'] = 443; } else { unset($server['HTTPS']); $server['SERVER_PORT'] = 80; } } if (isset($components['port'])) { $server['SERVER_PORT'] = $components['port']; $server['HTTP_HOST'] .= ':'.$components['port']; } if (isset($components['user'])) { $server['PHP_AUTH_USER'] = $components['user']; } if (isset($components['pass'])) { $server['PHP_AUTH_PW'] = $components['pass']; } if (!isset($components['path'])) { $components['path'] = '/'; } switch (strtoupper($method)) { case 'POST': case 'PUT': case 'DELETE': if (!isset($server['CONTENT_TYPE'])) { $server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; } // no break case 'PATCH': $request = $parameters; $query = []; break; default: $request = []; $query = $parameters; break; } $queryString = ''; if (isset($components['query'])) { parse_str(html_entity_decode($components['query']), $qs); if ($query) { $query = array_replace($qs, $query); $queryString = http_build_query($query, '', '&'); } else { $query = $qs; $queryString = $components['query']; } } elseif ($query) { $queryString = http_build_query($query, '', '&'); } $server['REQUEST_URI'] = $components['path'].('' !== $queryString ? '?'.$queryString : ''); $server['QUERY_STRING'] = $queryString; return self::createRequestFromFactory($query, $request, [], $cookies, $files, $server, $content); } /** * Sets a callable able to create a Request instance. * * This is mainly useful when you need to override the Request class * to keep BC with an existing system. It should not be used for any * other purpose. * * @return void */ public static function setFactory(?callable $callable) { self::$requestFactory = $callable; } /** * Clones a request and overrides some of its parameters. * * @param array|null $query The GET parameters * @param array|null $request The POST parameters * @param array|null $attributes The request attributes (parameters parsed from the PATH_INFO, ...) * @param array|null $cookies The COOKIE parameters * @param array|null $files The FILES parameters * @param array|null $server The SERVER parameters */ public function duplicate(?array $query = null, ?array $request = null, ?array $attributes = null, ?array $cookies = null, ?array $files = null, ?array $server = null): static { $dup = clone $this; if (null !== $query) { $dup->query = new InputBag($query); } if (null !== $request) { $dup->request = new InputBag($request); } if (null !== $attributes) { $dup->attributes = new ParameterBag($attributes); } if (null !== $cookies) { $dup->cookies = new InputBag($cookies); } if (null !== $files) { $dup->files = new FileBag($files); } if (null !== $server) { $dup->server = new ServerBag($server); $dup->headers = new HeaderBag($dup->server->getHeaders()); } $dup->languages = null; $dup->charsets = null; $dup->encodings = null; $dup->acceptableContentTypes = null; $dup->pathInfo = null; $dup->requestUri = null; $dup->baseUrl = null; $dup->basePath = null; $dup->method = null; $dup->format = null; if (!$dup->get('_format') && $this->get('_format')) { $dup->attributes->set('_format', $this->get('_format')); } if (!$dup->getRequestFormat(null)) { $dup->setRequestFormat($this->getRequestFormat(null)); } return $dup; } /** * Clones the current request. * * Note that the session is not cloned as duplicated requests * are most of the time sub-requests of the main one. */ public function __clone() { $this->query = clone $this->query; $this->request = clone $this->request; $this->attributes = clone $this->attributes; $this->cookies = clone $this->cookies; $this->files = clone $this->files; $this->server = clone $this->server; $this->headers = clone $this->headers; } public function __toString(): string { $content = $this->getContent(); $cookieHeader = ''; $cookies = []; foreach ($this->cookies as $k => $v) { $cookies[] = \is_array($v) ? http_build_query([$k => $v], '', '; ', \PHP_QUERY_RFC3986) : "$k=$v"; } if ($cookies) { $cookieHeader = 'Cookie: '.implode('; ', $cookies)."\r\n"; } return sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n". $this->headers. $cookieHeader."\r\n". $content; } /** * Overrides the PHP global variables according to this request instance. * * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE. * $_FILES is never overridden, see rfc1867 * * @return void */ public function overrideGlobals() { $this->server->set('QUERY_STRING', static::normalizeQueryString(http_build_query($this->query->all(), '', '&'))); $_GET = $this->query->all(); $_POST = $this->request->all(); $_SERVER = $this->server->all(); $_COOKIE = $this->cookies->all(); foreach ($this->headers->all() as $key => $value) { $key = strtoupper(str_replace('-', '_', $key)); if (\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true)) { $_SERVER[$key] = implode(', ', $value); } else { $_SERVER['HTTP_'.$key] = implode(', ', $value); } } $request = ['g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE]; $requestOrder = \ini_get('request_order') ?: \ini_get('variables_order'); $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp'; $_REQUEST = [[]]; foreach (str_split($requestOrder) as $order) { $_REQUEST[] = $request[$order]; } $_REQUEST = array_merge(...$_REQUEST); } /** * Sets a list of trusted proxies. * * You should only list the reverse proxies that you manage directly. * * @param array $proxies A list of trusted proxies, the string 'REMOTE_ADDR' will be replaced with $_SERVER['REMOTE_ADDR'] * @param int $trustedHeaderSet A bit field of Request::HEADER_*, to set which headers to trust from your proxies * * @return void */ public static function setTrustedProxies(array $proxies, int $trustedHeaderSet) { self::$trustedProxies = array_reduce($proxies, function ($proxies, $proxy) { if ('REMOTE_ADDR' !== $proxy) { $proxies[] = $proxy; } elseif (isset($_SERVER['REMOTE_ADDR'])) { $proxies[] = $_SERVER['REMOTE_ADDR']; } return $proxies; }, []); self::$trustedHeaderSet = $trustedHeaderSet; } /** * Gets the list of trusted proxies. * * @return string[] */ public static function getTrustedProxies(): array { return self::$trustedProxies; } /** * Gets the set of trusted headers from trusted proxies. * * @return int A bit field of Request::HEADER_* that defines which headers are trusted from your proxies */ public static function getTrustedHeaderSet(): int { return self::$trustedHeaderSet; } /** * Sets a list of trusted host patterns. * * You should only list the hosts you manage using regexs. * * @param array $hostPatterns A list of trusted host patterns * * @return void */ public static function setTrustedHosts(array $hostPatterns) { self::$trustedHostPatterns = array_map(fn ($hostPattern) => sprintf('{%s}i', $hostPattern), $hostPatterns); // we need to reset trusted hosts on trusted host patterns change self::$trustedHosts = []; } /** * Gets the list of trusted host patterns. * * @return string[] */ public static function getTrustedHosts(): array { return self::$trustedHostPatterns; } /** * Normalizes a query string. * * It builds a normalized query string, where keys/value pairs are alphabetized, * have consistent escaping and unneeded delimiters are removed. */ public static function normalizeQueryString(?string $qs): string { if ('' === ($qs ?? '')) { return ''; } $qs = HeaderUtils::parseQuery($qs); ksort($qs); return http_build_query($qs, '', '&', \PHP_QUERY_RFC3986); } /** * Enables support for the _method request parameter to determine the intended HTTP method. * * Be warned that enabling this feature might lead to CSRF issues in your code. * Check that you are using CSRF tokens when required. * If the HTTP method parameter override is enabled, an html-form with method "POST" can be altered * and used to send a "PUT" or "DELETE" request via the _method request parameter. * If these methods are not protected against CSRF, this presents a possible vulnerability. * * The HTTP method can only be overridden when the real HTTP method is POST. * * @return void */ public static function enableHttpMethodParameterOverride() { self::$httpMethodParameterOverride = true; } /** * Checks whether support for the _method request parameter is enabled. */ public static function getHttpMethodParameterOverride(): bool { return self::$httpMethodParameterOverride; } /** * Gets a "parameter" value from any bag. * * This method is mainly useful for libraries that want to provide some flexibility. If you don't need the * flexibility in controllers, it is better to explicitly get request parameters from the appropriate * public property instead (attributes, query, request). * * Order of precedence: PATH (routing placeholders or custom attributes), GET, POST * * @internal use explicit input sources instead */ public function get(string $key, mixed $default = null): mixed { if ($this !== $result = $this->attributes->get($key, $this)) { return $result; } if ($this->query->has($key)) { return $this->query->all()[$key]; } if ($this->request->has($key)) { return $this->request->all()[$key]; } return $default; } /** * Gets the Session. * * @throws SessionNotFoundException When session is not set properly */ public function getSession(): SessionInterface { $session = $this->session; if (!$session instanceof SessionInterface && null !== $session) { $this->setSession($session = $session()); } if (null === $session) { throw new SessionNotFoundException('Session has not been set.'); } return $session; } /** * Whether the request contains a Session which was started in one of the * previous requests. */ public function hasPreviousSession(): bool { // the check for $this->session avoids malicious users trying to fake a session cookie with proper name return $this->hasSession() && $this->cookies->has($this->getSession()->getName()); } /** * Whether the request contains a Session object. * * This method does not give any information about the state of the session object, * like whether the session is started or not. It is just a way to check if this Request * is associated with a Session instance. * * @param bool $skipIfUninitialized When true, ignores factories injected by `setSessionFactory` */ public function hasSession(bool $skipIfUninitialized = false): bool { return null !== $this->session && (!$skipIfUninitialized || $this->session instanceof SessionInterface); } /** * @return void */ public function setSession(SessionInterface $session) { $this->session = $session; } /** * @internal * * @param callable(): SessionInterface $factory */ public function setSessionFactory(callable $factory): void { $this->session = $factory(...); } /** * Returns the client IP addresses. * * In the returned array the most trusted IP address is first, and the * least trusted one last. The "real" client IP address is the last one, * but this is also the least trusted one. Trusted proxies are stripped. * * Use this method carefully; you should use getClientIp() instead. * * @see getClientIp() */ public function getClientIps(): array { $ip = $this->server->get('REMOTE_ADDR'); if (!$this->isFromTrustedProxy()) { return [$ip]; } return $this->getTrustedValues(self::HEADER_X_FORWARDED_FOR, $ip) ?: [$ip]; } /** * Returns the client IP address. * * This method can read the client IP address from the "X-Forwarded-For" header * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For" * header value is a comma+space separated list of IP addresses, the left-most * being the original client, and each successive proxy that passed the request * adding the IP address where it received the request from. * * If your reverse proxy uses a different header name than "X-Forwarded-For", * ("Client-Ip" for instance), configure it via the $trustedHeaderSet * argument of the Request::setTrustedProxies() method instead. * * @see getClientIps() * @see https://wikipedia.org/wiki/X-Forwarded-For */ public function getClientIp(): ?string { $ipAddresses = $this->getClientIps(); return $ipAddresses[0]; } /** * Returns current script name. */ public function getScriptName(): string { return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME', '')); } /** * Returns the path being requested relative to the executed script. * * The path info always starts with a /. * * Suppose this request is instantiated from /mysite on localhost: * * * http://localhost/mysite returns an empty string * * http://localhost/mysite/about returns '/about' * * http://localhost/mysite/enco%20ded returns '/enco%20ded' * * http://localhost/mysite/about?var=1 returns '/about' * * @return string The raw path (i.e. not urldecoded) */ public function getPathInfo(): string { return $this->pathInfo ??= $this->preparePathInfo(); } /** * Returns the root path from which this request is executed. * * Suppose that an index.php file instantiates this request object: * * * http://localhost/index.php returns an empty string * * http://localhost/index.php/page returns an empty string * * http://localhost/web/index.php returns '/web' * * http://localhost/we%20b/index.php returns '/we%20b' * * @return string The raw path (i.e. not urldecoded) */ public function getBasePath(): string { return $this->basePath ??= $this->prepareBasePath(); } /** * Returns the root URL from which this request is executed. * * The base URL never ends with a /. * * This is similar to getBasePath(), except that it also includes the * script filename (e.g. index.php) if one exists. * * @return string The raw URL (i.e. not urldecoded) */ public function getBaseUrl(): string { $trustedPrefix = ''; // the proxy prefix must be prepended to any prefix being needed at the webserver level if ($this->isFromTrustedProxy() && $trustedPrefixValues = $this->getTrustedValues(self::HEADER_X_FORWARDED_PREFIX)) { $trustedPrefix = rtrim($trustedPrefixValues[0], '/'); } return $trustedPrefix.$this->getBaseUrlReal(); } /** * Returns the real base URL received by the webserver from which this request is executed. * The URL does not include trusted reverse proxy prefix. * * @return string The raw URL (i.e. not urldecoded) */ private function getBaseUrlReal(): string { return $this->baseUrl ??= $this->prepareBaseUrl(); } /** * Gets the request's scheme. */ public function getScheme(): string { return $this->isSecure() ? 'https' : 'http'; } /** * Returns the port on which the request is made. * * This method can read the client port from the "X-Forwarded-Port" header * when trusted proxies were set via "setTrustedProxies()". * * The "X-Forwarded-Port" header must contain the client port. * * @return int|string|null Can be a string if fetched from the server bag */ public function getPort(): int|string|null { if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_PORT)) { $host = $host[0]; } elseif ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) { $host = $host[0]; } elseif (!$host = $this->headers->get('HOST')) { return $this->server->get('SERVER_PORT'); } if ('[' === $host[0]) { $pos = strpos($host, ':', strrpos($host, ']')); } else { $pos = strrpos($host, ':'); } if (false !== $pos && $port = substr($host, $pos + 1)) { return (int) $port; } return 'https' === $this->getScheme() ? 443 : 80; } /** * Returns the user. */ public function getUser(): ?string { return $this->headers->get('PHP_AUTH_USER'); } /** * Returns the password. */ public function getPassword(): ?string { return $this->headers->get('PHP_AUTH_PW'); } /** * Gets the user info. * * @return string|null A user name if any and, optionally, scheme-specific information about how to gain authorization to access the server */ public function getUserInfo(): ?string { $userinfo = $this->getUser(); $pass = $this->getPassword(); if ('' != $pass) { $userinfo .= ":$pass"; } return $userinfo; } /** * Returns the HTTP host being requested. * * The port name will be appended to the host if it's non-standard. */ public function getHttpHost(): string { $scheme = $this->getScheme(); $port = $this->getPort(); if (('http' === $scheme && 80 == $port) || ('https' === $scheme && 443 == $port)) { return $this->getHost(); } return $this->getHost().':'.$port; } /** * Returns the requested URI (path and query string). * * @return string The raw URI (i.e. not URI decoded) */ public function getRequestUri(): string { return $this->requestUri ??= $this->prepareRequestUri(); } /** * Gets the scheme and HTTP host. * * If the URL was called with basic authentication, the user * and the password are not added to the generated string. */ public function getSchemeAndHttpHost(): string { return $this->getScheme().'://'.$this->getHttpHost(); } /** * Generates a normalized URI (URL) for the Request. * * @see getQueryString() */ public function getUri(): string { if (null !== $qs = $this->getQueryString()) { $qs = '?'.$qs; } return $this->getSchemeAndHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs; } /** * Generates a normalized URI for the given path. * * @param string $path A path to use instead of the current one */ public function getUriForPath(string $path): string { return $this->getSchemeAndHttpHost().$this->getBaseUrl().$path; } /** * Returns the path as relative reference from the current Request path. * * Only the URIs path component (no schema, host etc.) is relevant and must be given. * Both paths must be absolute and not contain relative parts. * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives. * Furthermore, they can be used to reduce the link size in documents. * * Example target paths, given a base path of "/a/b/c/d": * - "/a/b/c/d" -> "" * - "/a/b/c/" -> "./" * - "/a/b/" -> "../" * - "/a/b/c/other" -> "other" * - "/a/x/y" -> "../../x/y" */ public function getRelativeUriForPath(string $path): string { // be sure that we are dealing with an absolute path if (!isset($path[0]) || '/' !== $path[0]) { return $path; } if ($path === $basePath = $this->getPathInfo()) { return ''; } $sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath); $targetDirs = explode('/', substr($path, 1)); array_pop($sourceDirs); $targetFile = array_pop($targetDirs); foreach ($sourceDirs as $i => $dir) { if (isset($targetDirs[$i]) && $dir === $targetDirs[$i]) { unset($sourceDirs[$i], $targetDirs[$i]); } else { break; } } $targetDirs[] = $targetFile; $path = str_repeat('../', \count($sourceDirs)).implode('/', $targetDirs); // A reference to the same base directory or an empty subdirectory must be prefixed with "./". // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used // as the first segment of a relative-path reference, as it would be mistaken for a scheme name // (see https://tools.ietf.org/html/rfc3986#section-4.2). return !isset($path[0]) || '/' === $path[0] || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos) ? "./$path" : $path; } /** * Generates the normalized query string for the Request. * * It builds a normalized query string, where keys/value pairs are alphabetized * and have consistent escaping. */ public function getQueryString(): ?string { $qs = static::normalizeQueryString($this->server->get('QUERY_STRING')); return '' === $qs ? null : $qs; } /** * Checks whether the request is secure or not. * * This method can read the client protocol from the "X-Forwarded-Proto" header * when trusted proxies were set via "setTrustedProxies()". * * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http". */ public function isSecure(): bool { if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_X_FORWARDED_PROTO)) { return \in_array(strtolower($proto[0]), ['https', 'on', 'ssl', '1'], true); } $https = $this->server->get('HTTPS'); return !empty($https) && 'off' !== strtolower($https); } /** * Returns the host name. * * This method can read the client host name from the "X-Forwarded-Host" header * when trusted proxies were set via "setTrustedProxies()". * * The "X-Forwarded-Host" header must contain the client host name. * * @throws SuspiciousOperationException when the host name is invalid or not trusted */ public function getHost(): string { if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) { $host = $host[0]; } elseif (!$host = $this->headers->get('HOST')) { if (!$host = $this->server->get('SERVER_NAME')) { $host = $this->server->get('SERVER_ADDR', ''); } } // trim and remove port number from host // host is lowercase as per RFC 952/2181 $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); // as the host can come from the user (HTTP_HOST and depending on the configuration, SERVER_NAME too can come from the user) // check that it does not contain forbidden characters (see RFC 952 and RFC 2181) // use preg_replace() instead of preg_match() to prevent DoS attacks with long host names if ($host && '' !== preg_replace('/(?:^\[)?[a-zA-Z0-9-:\]_]+\.?/', '', $host)) { if (!$this->isHostValid) { return ''; } $this->isHostValid = false; throw new SuspiciousOperationException(sprintf('Invalid Host "%s".', $host)); } if (\count(self::$trustedHostPatterns) > 0) { // to avoid host header injection attacks, you should provide a list of trusted host patterns if (\in_array($host, self::$trustedHosts)) { return $host; } foreach (self::$trustedHostPatterns as $pattern) { if (preg_match($pattern, $host)) { self::$trustedHosts[] = $host; return $host; } } if (!$this->isHostValid) { return ''; } $this->isHostValid = false; throw new SuspiciousOperationException(sprintf('Untrusted Host "%s".', $host)); } return $host; } /** * Sets the request method. * * @return void */ public function setMethod(string $method) { $this->method = null; $this->server->set('REQUEST_METHOD', $method); } /** * Gets the request "intended" method. * * If the X-HTTP-Method-Override header is set, and if the method is a POST, * then it is used to determine the "real" intended HTTP method. * * The _method request parameter can also be used to determine the HTTP method, * but only if enableHttpMethodParameterOverride() has been called. * * The method is always an uppercased string. * * @see getRealMethod() */ public function getMethod(): string { if (null !== $this->method) { return $this->method; } $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET')); if ('POST' !== $this->method) { return $this->method; } $method = $this->headers->get('X-HTTP-METHOD-OVERRIDE'); if (!$method && self::$httpMethodParameterOverride) { $method = $this->request->get('_method', $this->query->get('_method', 'POST')); } if (!\is_string($method)) { return $this->method; } $method = strtoupper($method); if (\in_array($method, ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'PATCH', 'PURGE', 'TRACE'], true)) { return $this->method = $method; } if (!preg_match('/^[A-Z]++$/D', $method)) { throw new SuspiciousOperationException(sprintf('Invalid method override "%s".', $method)); } return $this->method = $method; } /** * Gets the "real" request method. * * @see getMethod() */ public function getRealMethod(): string { return strtoupper($this->server->get('REQUEST_METHOD', 'GET')); } /** * Gets the mime type associated with the format. */ public function getMimeType(string $format): ?string { if (null === static::$formats) { static::initializeFormats(); } return isset(static::$formats[$format]) ? static::$formats[$format][0] : null; } /** * Gets the mime types associated with the format. * * @return string[] */ public static function getMimeTypes(string $format): array { if (null === static::$formats) { static::initializeFormats(); } return static::$formats[$format] ?? []; } /** * Gets the format associated with the mime type. */ public function getFormat(?string $mimeType): ?string { $canonicalMimeType = null; if ($mimeType && false !== $pos = strpos($mimeType, ';')) { $canonicalMimeType = trim(substr($mimeType, 0, $pos)); } if (null === static::$formats) { static::initializeFormats(); } foreach (static::$formats as $format => $mimeTypes) { if (\in_array($mimeType, (array) $mimeTypes)) { return $format; } if (null !== $canonicalMimeType && \in_array($canonicalMimeType, (array) $mimeTypes)) { return $format; } } return null; } /** * Associates a format with mime types. * * @param string|string[] $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type) * * @return void */ public function setFormat(?string $format, string|array $mimeTypes) { if (null === static::$formats) { static::initializeFormats(); } static::$formats[$format] = \is_array($mimeTypes) ? $mimeTypes : [$mimeTypes]; } /** * Gets the request format. * * Here is the process to determine the format: * * * format defined by the user (with setRequestFormat()) * * _format request attribute * * $default * * @see getPreferredFormat */ public function getRequestFormat(?string $default = 'html'): ?string { $this->format ??= $this->attributes->get('_format'); return $this->format ?? $default; } /** * Sets the request format. * * @return void */ public function setRequestFormat(?string $format) { $this->format = $format; } /** * Gets the usual name of the format associated with the request's media type (provided in the Content-Type header). * * @deprecated since Symfony 6.2, use getContentTypeFormat() instead */ public function getContentType(): ?string { trigger_deprecation('symfony/http-foundation', '6.2', 'The "%s()" method is deprecated, use "getContentTypeFormat()" instead.', __METHOD__); return $this->getContentTypeFormat(); } /** * Gets the usual name of the format associated with the request's media type (provided in the Content-Type header). * * @see Request::$formats */ public function getContentTypeFormat(): ?string { return $this->getFormat($this->headers->get('CONTENT_TYPE', '')); } /** * Sets the default locale. * * @return void */ public function setDefaultLocale(string $locale) { $this->defaultLocale = $locale; if (null === $this->locale) { $this->setPhpDefaultLocale($locale); } } /** * Get the default locale. */ public function getDefaultLocale(): string { return $this->defaultLocale; } /** * Sets the locale. * * @return void */ public function setLocale(string $locale) { $this->setPhpDefaultLocale($this->locale = $locale); } /** * Get the locale. */ public function getLocale(): string { return $this->locale ?? $this->defaultLocale; } /** * Checks if the request method is of specified type. * * @param string $method Uppercase request method (GET, POST etc) */ public function isMethod(string $method): bool { return $this->getMethod() === strtoupper($method); } /** * Checks whether or not the method is safe. * * @see https://tools.ietf.org/html/rfc7231#section-4.2.1 */ public function isMethodSafe(): bool { return \in_array($this->getMethod(), ['GET', 'HEAD', 'OPTIONS', 'TRACE']); } /** * Checks whether or not the method is idempotent. */ public function isMethodIdempotent(): bool { return \in_array($this->getMethod(), ['HEAD', 'GET', 'PUT', 'DELETE', 'TRACE', 'OPTIONS', 'PURGE']); } /** * Checks whether the method is cacheable or not. * * @see https://tools.ietf.org/html/rfc7231#section-4.2.3 */ public function isMethodCacheable(): bool { return \in_array($this->getMethod(), ['GET', 'HEAD']); } /** * Returns the protocol version. * * If the application is behind a proxy, the protocol version used in the * requests between the client and the proxy and between the proxy and the * server might be different. This returns the former (from the "Via" header) * if the proxy is trusted (see "setTrustedProxies()"), otherwise it returns * the latter (from the "SERVER_PROTOCOL" server parameter). */ public function getProtocolVersion(): ?string { if ($this->isFromTrustedProxy()) { preg_match('~^(HTTP/)?([1-9]\.[0-9]) ~', $this->headers->get('Via') ?? '', $matches); if ($matches) { return 'HTTP/'.$matches[2]; } } return $this->server->get('SERVER_PROTOCOL'); } /** * Returns the request body content. * * @param bool $asResource If true, a resource will be returned * * @return string|resource * * @psalm-return ($asResource is true ? resource : string) */ public function getContent(bool $asResource = false) { $currentContentIsResource = \is_resource($this->content); if (true === $asResource) { if ($currentContentIsResource) { rewind($this->content); return $this->content; } // Content passed in parameter (test) if (\is_string($this->content)) { $resource = fopen('php://temp', 'r+'); fwrite($resource, $this->content); rewind($resource); return $resource; } $this->content = false; return fopen('php://input', 'r'); } if ($currentContentIsResource) { rewind($this->content); return stream_get_contents($this->content); } if (null === $this->content || false === $this->content) { $this->content = file_get_contents('php://input'); } return $this->content; } /** * Gets the decoded form or json request body. * * @throws JsonException When the body cannot be decoded to an array */ public function getPayload(): InputBag { if ($this->request->count()) { return clone $this->request; } if ('' === $content = $this->getContent()) { return new InputBag([]); } try { $content = json_decode($content, true, 512, \JSON_BIGINT_AS_STRING | \JSON_THROW_ON_ERROR); } catch (\JsonException $e) { throw new JsonException('Could not decode request body.', $e->getCode(), $e); } if (!\is_array($content)) { throw new JsonException(sprintf('JSON content was expected to decode to an array, "%s" returned.', get_debug_type($content))); } return new InputBag($content); } /** * Gets the request body decoded as array, typically from a JSON payload. * * @see getPayload() for portability between content types * * @throws JsonException When the body cannot be decoded to an array */ public function toArray(): array { if ('' === $content = $this->getContent()) { throw new JsonException('Request body is empty.'); } try { $content = json_decode($content, true, 512, \JSON_BIGINT_AS_STRING | \JSON_THROW_ON_ERROR); } catch (\JsonException $e) { throw new JsonException('Could not decode request body.', $e->getCode(), $e); } if (!\is_array($content)) { throw new JsonException(sprintf('JSON content was expected to decode to an array, "%s" returned.', get_debug_type($content))); } return $content; } /** * Gets the Etags. */ public function getETags(): array { return preg_split('/\s*,\s*/', $this->headers->get('If-None-Match', ''), -1, \PREG_SPLIT_NO_EMPTY); } public function isNoCache(): bool { return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma'); } /** * Gets the preferred format for the response by inspecting, in the following order: * * the request format set using setRequestFormat; * * the values of the Accept HTTP header. * * Note that if you use this method, you should send the "Vary: Accept" header * in the response to prevent any issues with intermediary HTTP caches. */ public function getPreferredFormat(?string $default = 'html'): ?string { if ($this->preferredFormat ??= $this->getRequestFormat(null)) { return $this->preferredFormat; } foreach ($this->getAcceptableContentTypes() as $mimeType) { if ($this->preferredFormat = $this->getFormat($mimeType)) { return $this->preferredFormat; } } return $default; } /** * Returns the preferred language. * * @param string[] $locales An array of ordered available locales */ public function getPreferredLanguage(?array $locales = null): ?string { $preferredLanguages = $this->getLanguages(); if (empty($locales)) { return $preferredLanguages[0] ?? null; } if (!$preferredLanguages) { return $locales[0]; } $extendedPreferredLanguages = []; foreach ($preferredLanguages as $language) { $extendedPreferredLanguages[] = $language; if (false !== $position = strpos($language, '_')) { $superLanguage = substr($language, 0, $position); if (!\in_array($superLanguage, $preferredLanguages)) { $extendedPreferredLanguages[] = $superLanguage; } } } $preferredLanguages = array_values(array_intersect($extendedPreferredLanguages, $locales)); return $preferredLanguages[0] ?? $locales[0]; } /** * Gets a list of languages acceptable by the client browser ordered in the user browser preferences. * * @return string[] */ public function getLanguages(): array { if (null !== $this->languages) { return $this->languages; } $languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all(); $this->languages = []; foreach ($languages as $acceptHeaderItem) { $lang = $acceptHeaderItem->getValue(); if (str_contains($lang, '-')) { $codes = explode('-', $lang); if ('i' === $codes[0]) { // Language not listed in ISO 639 that are not variants // of any listed language, which can be registered with the // i-prefix, such as i-cherokee if (\count($codes) > 1) { $lang = $codes[1]; } } else { for ($i = 0, $max = \count($codes); $i < $max; ++$i) { if (0 === $i) { $lang = strtolower($codes[0]); } else { $lang .= '_'.strtoupper($codes[$i]); } } } } $this->languages[] = $lang; } return $this->languages; } /** * Gets a list of charsets acceptable by the client browser in preferable order. * * @return string[] */ public function getCharsets(): array { return $this->charsets ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept-Charset'))->all())); } /** * Gets a list of encodings acceptable by the client browser in preferable order. * * @return string[] */ public function getEncodings(): array { return $this->encodings ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept-Encoding'))->all())); } /** * Gets a list of content types acceptable by the client browser in preferable order. * * @return string[] */ public function getAcceptableContentTypes(): array { return $this->acceptableContentTypes ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept'))->all())); } /** * Returns true if the request is an XMLHttpRequest. * * It works if your JavaScript library sets an X-Requested-With HTTP header. * It is known to work with common JavaScript frameworks: * * @see https://wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript */ public function isXmlHttpRequest(): bool { return 'XMLHttpRequest' == $this->headers->get('X-Requested-With'); } /** * Checks whether the client browser prefers safe content or not according to RFC8674. * * @see https://tools.ietf.org/html/rfc8674 */ public function preferSafeContent(): bool { if (isset($this->isSafeContentPreferred)) { return $this->isSafeContentPreferred; } if (!$this->isSecure()) { // see https://tools.ietf.org/html/rfc8674#section-3 return $this->isSafeContentPreferred = false; } return $this->isSafeContentPreferred = AcceptHeader::fromString($this->headers->get('Prefer'))->has('safe'); } /* * The following methods are derived from code of the Zend Framework (1.10dev - 2010-01-24) * * Code subject to the new BSD license (https://framework.zend.com/license). * * Copyright (c) 2005-2010 Zend Technologies USA Inc. (https://www.zend.com/) */ /** * @return string */ protected function prepareRequestUri() { $requestUri = ''; if ($this->isIisRewrite() && '' != $this->server->get('UNENCODED_URL')) { // IIS7 with URL Rewrite: make sure we get the unencoded URL (double slash problem) $requestUri = $this->server->get('UNENCODED_URL'); $this->server->remove('UNENCODED_URL'); } elseif ($this->server->has('REQUEST_URI')) { $requestUri = $this->server->get('REQUEST_URI'); if ('' !== $requestUri && '/' === $requestUri[0]) { // To only use path and query remove the fragment. if (false !== $pos = strpos($requestUri, '#')) { $requestUri = substr($requestUri, 0, $pos); } } else { // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, // only use URL path. $uriComponents = parse_url($requestUri); if (isset($uriComponents['path'])) { $requestUri = $uriComponents['path']; } if (isset($uriComponents['query'])) { $requestUri .= '?'.$uriComponents['query']; } } } elseif ($this->server->has('ORIG_PATH_INFO')) { // IIS 5.0, PHP as CGI $requestUri = $this->server->get('ORIG_PATH_INFO'); if ('' != $this->server->get('QUERY_STRING')) { $requestUri .= '?'.$this->server->get('QUERY_STRING'); } $this->server->remove('ORIG_PATH_INFO'); } // normalize the request URI to ease creating sub-requests from this request $this->server->set('REQUEST_URI', $requestUri); return $requestUri; } /** * Prepares the base URL. */ protected function prepareBaseUrl(): string { $filename = basename($this->server->get('SCRIPT_FILENAME', '')); if (basename($this->server->get('SCRIPT_NAME', '')) === $filename) { $baseUrl = $this->server->get('SCRIPT_NAME'); } elseif (basename($this->server->get('PHP_SELF', '')) === $filename) { $baseUrl = $this->server->get('PHP_SELF'); } elseif (basename($this->server->get('ORIG_SCRIPT_NAME', '')) === $filename) { $baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); // 1and1 shared hosting compatibility } else { // Backtrack up the script_filename to find the portion matching // php_self $path = $this->server->get('PHP_SELF', ''); $file = $this->server->get('SCRIPT_FILENAME', ''); $segs = explode('/', trim($file, '/')); $segs = array_reverse($segs); $index = 0; $last = \count($segs); $baseUrl = ''; do { $seg = $segs[$index]; $baseUrl = '/'.$seg.$baseUrl; ++$index; } while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos); } // Does the baseUrl have anything in common with the request_uri? $requestUri = $this->getRequestUri(); if ('' !== $requestUri && '/' !== $requestUri[0]) { $requestUri = '/'.$requestUri; } if ($baseUrl && null !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) { // full $baseUrl matches return $prefix; } if ($baseUrl && null !== $prefix = $this->getUrlencodedPrefix($requestUri, rtrim(\dirname($baseUrl), '/'.\DIRECTORY_SEPARATOR).'/')) { // directory portion of $baseUrl matches return rtrim($prefix, '/'.\DIRECTORY_SEPARATOR); } $truncatedRequestUri = $requestUri; if (false !== $pos = strpos($requestUri, '?')) { $truncatedRequestUri = substr($requestUri, 0, $pos); } $basename = basename($baseUrl ?? ''); if (empty($basename) || !strpos(rawurldecode($truncatedRequestUri), $basename)) { // no match whatsoever; set it blank return ''; } // If using mod_rewrite or ISAPI_Rewrite strip the script filename // out of baseUrl. $pos !== 0 makes sure it is not matching a value // from PATH_INFO or QUERY_STRING if (\strlen($requestUri) >= \strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && 0 !== $pos) { $baseUrl = substr($requestUri, 0, $pos + \strlen($baseUrl)); } return rtrim($baseUrl, '/'.\DIRECTORY_SEPARATOR); } /** * Prepares the base path. */ protected function prepareBasePath(): string { $baseUrl = $this->getBaseUrl(); if (empty($baseUrl)) { return ''; } $filename = basename($this->server->get('SCRIPT_FILENAME')); if (basename($baseUrl) === $filename) { $basePath = \dirname($baseUrl); } else { $basePath = $baseUrl; } if ('\\' === \DIRECTORY_SEPARATOR) { $basePath = str_replace('\\', '/', $basePath); } return rtrim($basePath, '/'); } /** * Prepares the path info. */ protected function preparePathInfo(): string { if (null === ($requestUri = $this->getRequestUri())) { return '/'; } // Remove the query string from REQUEST_URI if (false !== $pos = strpos($requestUri, '?')) { $requestUri = substr($requestUri, 0, $pos); } if ('' !== $requestUri && '/' !== $requestUri[0]) { $requestUri = '/'.$requestUri; } if (null === ($baseUrl = $this->getBaseUrlReal())) { return $requestUri; } $pathInfo = substr($requestUri, \strlen($baseUrl)); if (false === $pathInfo || '' === $pathInfo) { // If substr() returns false then PATH_INFO is set to an empty string return '/'; } return $pathInfo; } /** * Initializes HTTP request formats. * * @return void */ protected static function initializeFormats() { static::$formats = [ 'html' => ['text/html', 'application/xhtml+xml'], 'txt' => ['text/plain'], 'js' => ['application/javascript', 'application/x-javascript', 'text/javascript'], 'css' => ['text/css'], 'json' => ['application/json', 'application/x-json'], 'jsonld' => ['application/ld+json'], 'xml' => ['text/xml', 'application/xml', 'application/x-xml'], 'rdf' => ['application/rdf+xml'], 'atom' => ['application/atom+xml'], 'rss' => ['application/rss+xml'], 'form' => ['application/x-www-form-urlencoded', 'multipart/form-data'], ]; } private function setPhpDefaultLocale(string $locale): void { // if either the class Locale doesn't exist, or an exception is thrown when // setting the default locale, the intl module is not installed, and // the call can be ignored: try { if (class_exists(\Locale::class, false)) { \Locale::setDefault($locale); } } catch (\Exception) { } } /** * Returns the prefix as encoded in the string when the string starts with * the given prefix, null otherwise. */ private function getUrlencodedPrefix(string $string, string $prefix): ?string { if ($this->isIisRewrite()) { // ISS with UrlRewriteModule might report SCRIPT_NAME/PHP_SELF with wrong case // see https://github.com/php/php-src/issues/11981 if (0 !== stripos(rawurldecode($string), $prefix)) { return null; } } elseif (!str_starts_with(rawurldecode($string), $prefix)) { return null; } $len = \strlen($prefix); if (preg_match(sprintf('#^(%%[[:xdigit:]]{2}|.){%d}#', $len), $string, $match)) { return $match[0]; } return null; } private static function createRequestFromFactory(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): static { if (self::$requestFactory) { $request = (self::$requestFactory)($query, $request, $attributes, $cookies, $files, $server, $content); if (!$request instanceof self) { throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.'); } return $request; } return new static($query, $request, $attributes, $cookies, $files, $server, $content); } /** * Indicates whether this request originated from a trusted proxy. * * This can be useful to determine whether or not to trust the * contents of a proxy-specific header. */ public function isFromTrustedProxy(): bool { return self::$trustedProxies && IpUtils::checkIp($this->server->get('REMOTE_ADDR', ''), self::$trustedProxies); } /** * This method is rather heavy because it splits and merges headers, and it's called by many other methods such as * getPort(), isSecure(), getHost(), getClientIps(), getBaseUrl() etc. Thus, we try to cache the results for * best performance. */ private function getTrustedValues(int $type, ?string $ip = null): array { $cacheKey = $type."\0".((self::$trustedHeaderSet & $type) ? $this->headers->get(self::TRUSTED_HEADERS[$type]) : ''); $cacheKey .= "\0".$ip."\0".$this->headers->get(self::TRUSTED_HEADERS[self::HEADER_FORWARDED]); if (isset($this->trustedValuesCache[$cacheKey])) { return $this->trustedValuesCache[$cacheKey]; } $clientValues = []; $forwardedValues = []; if ((self::$trustedHeaderSet & $type) && $this->headers->has(self::TRUSTED_HEADERS[$type])) { foreach (explode(',', $this->headers->get(self::TRUSTED_HEADERS[$type])) as $v) { $clientValues[] = (self::HEADER_X_FORWARDED_PORT === $type ? '0.0.0.0:' : '').trim($v); } } if ((self::$trustedHeaderSet & self::HEADER_FORWARDED) && (isset(self::FORWARDED_PARAMS[$type])) && $this->headers->has(self::TRUSTED_HEADERS[self::HEADER_FORWARDED])) { $forwarded = $this->headers->get(self::TRUSTED_HEADERS[self::HEADER_FORWARDED]); $parts = HeaderUtils::split($forwarded, ',;='); $param = self::FORWARDED_PARAMS[$type]; foreach ($parts as $subParts) { if (null === $v = HeaderUtils::combine($subParts)[$param] ?? null) { continue; } if (self::HEADER_X_FORWARDED_PORT === $type) { if (str_ends_with($v, ']') || false === $v = strrchr($v, ':')) { $v = $this->isSecure() ? ':443' : ':80'; } $v = '0.0.0.0'.$v; } $forwardedValues[] = $v; } } if (null !== $ip) { $clientValues = $this->normalizeAndFilterClientIps($clientValues, $ip); $forwardedValues = $this->normalizeAndFilterClientIps($forwardedValues, $ip); } if ($forwardedValues === $clientValues || !$clientValues) { return $this->trustedValuesCache[$cacheKey] = $forwardedValues; } if (!$forwardedValues) { return $this->trustedValuesCache[$cacheKey] = $clientValues; } if (!$this->isForwardedValid) { return $this->trustedValuesCache[$cacheKey] = null !== $ip ? ['0.0.0.0', $ip] : []; } $this->isForwardedValid = false; throw new ConflictingHeadersException(sprintf('The request has both a trusted "%s" header and a trusted "%s" header, conflicting with each other. You should either configure your proxy to remove one of them, or configure your project to distrust the offending one.', self::TRUSTED_HEADERS[self::HEADER_FORWARDED], self::TRUSTED_HEADERS[$type])); } private function normalizeAndFilterClientIps(array $clientIps, string $ip): array { if (!$clientIps) { return []; } $clientIps[] = $ip; // Complete the IP chain with the IP the request actually came from $firstTrustedIp = null; foreach ($clientIps as $key => $clientIp) { if (strpos($clientIp, '.')) { // Strip :port from IPv4 addresses. This is allowed in Forwarded // and may occur in X-Forwarded-For. $i = strpos($clientIp, ':'); if ($i) { $clientIps[$key] = $clientIp = substr($clientIp, 0, $i); } } elseif (str_starts_with($clientIp, '[')) { // Strip brackets and :port from IPv6 addresses. $i = strpos($clientIp, ']', 1); $clientIps[$key] = $clientIp = substr($clientIp, 1, $i - 1); } if (!filter_var($clientIp, \FILTER_VALIDATE_IP)) { unset($clientIps[$key]); continue; } if (IpUtils::checkIp($clientIp, self::$trustedProxies)) { unset($clientIps[$key]); // Fallback to this when the client IP falls into the range of trusted proxies $firstTrustedIp ??= $clientIp; } } // Now the IP chain contains only untrusted proxies and the client IP return $clientIps ? array_reverse($clientIps) : [$firstTrustedIp]; } /** * Is this IIS with UrlRewriteModule? * * This method consumes, caches and removed the IIS_WasUrlRewritten env var, * so we don't inherit it to sub-requests. */ private function isIisRewrite(): bool { if (1 === $this->server->getInt('IIS_WasUrlRewritten')) { $this->isIisRewrite = true; $this->server->remove('IIS_WasUrlRewritten'); } return $this->isIisRewrite; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; /** * Checks the Request attributes matches all regular expressions. * * @author Fabien Potencier */ class AttributesRequestMatcher implements RequestMatcherInterface { /** * @param array $regexps */ public function __construct(private array $regexps) { } public function matches(Request $request): bool { foreach ($this->regexps as $key => $regexp) { $attribute = $request->attributes->get($key); if (!\is_string($attribute)) { return false; } if (!preg_match('{'.$regexp.'}', $attribute)) { return false; } } return true; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\ExpressionLanguage\Expression; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; /** * ExpressionRequestMatcher uses an expression to match a Request. * * @author Fabien Potencier */ class ExpressionRequestMatcher implements RequestMatcherInterface { public function __construct( private ExpressionLanguage $language, private Expression|string $expression, ) { } public function matches(Request $request): bool { return $this->language->evaluate($this->expression, [ 'request' => $request, 'method' => $request->getMethod(), 'path' => rawurldecode($request->getPathInfo()), 'host' => $request->getHost(), 'ip' => $request->getClientIp(), 'attributes' => $request->attributes->all(), ]); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; /** * Checks the Request URL host name matches a regular expression. * * @author Fabien Potencier */ class HostRequestMatcher implements RequestMatcherInterface { public function __construct(private string $regexp) { } public function matches(Request $request): bool { return preg_match('{'.$this->regexp.'}i', $request->getHost()); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\HttpFoundation\IpUtils; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; /** * Checks the client IP of a Request. * * @author Fabien Potencier */ class IpsRequestMatcher implements RequestMatcherInterface { private array $ips; /** * @param string[]|string $ips A specific IP address or a range specified using IP/netmask like 192.168.1.0/24 * Strings can contain a comma-delimited list of IPs/ranges */ public function __construct(array|string $ips) { $this->ips = array_reduce((array) $ips, static fn (array $ips, string $ip) => array_merge($ips, preg_split('/\s*,\s*/', $ip)), []); } public function matches(Request $request): bool { if (!$this->ips) { return true; } return IpUtils::checkIp($request->getClientIp() ?? '', $this->ips); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; /** * Checks the Request content is valid JSON. * * @author Fabien Potencier */ class IsJsonRequestMatcher implements RequestMatcherInterface { public function matches(Request $request): bool { return json_validate($request->getContent()); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; /** * Checks the HTTP method of a Request. * * @author Fabien Potencier */ class MethodRequestMatcher implements RequestMatcherInterface { /** * @var string[] */ private array $methods = []; /** * @param string[]|string $methods An HTTP method or an array of HTTP methods * Strings can contain a comma-delimited list of methods */ public function __construct(array|string $methods) { $this->methods = array_reduce(array_map('strtoupper', (array) $methods), static fn (array $methods, string $method) => array_merge($methods, preg_split('/\s*,\s*/', $method)), []); } public function matches(Request $request): bool { if (!$this->methods) { return true; } return \in_array($request->getMethod(), $this->methods, true); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; /** * Checks the Request URL path info matches a regular expression. * * @author Fabien Potencier */ class PathRequestMatcher implements RequestMatcherInterface { public function __construct(private string $regexp) { } public function matches(Request $request): bool { return preg_match('{'.$this->regexp.'}', rawurldecode($request->getPathInfo())); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; /** * Checks the HTTP port of a Request. * * @author Fabien Potencier */ class PortRequestMatcher implements RequestMatcherInterface { public function __construct(private int $port) { } public function matches(Request $request): bool { return $request->getPort() === $this->port; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; /** * Checks the HTTP scheme of a Request. * * @author Fabien Potencier */ class SchemeRequestMatcher implements RequestMatcherInterface { /** * @var string[] */ private array $schemes; /** * @param string[]|string $schemes A scheme or a list of schemes * Strings can contain a comma-delimited list of schemes */ public function __construct(array|string $schemes) { $this->schemes = array_reduce(array_map('strtolower', (array) $schemes), static fn (array $schemes, string $scheme) => array_merge($schemes, preg_split('/\s*,\s*/', $scheme)), []); } public function matches(Request $request): bool { if (!$this->schemes) { return true; } return \in_array($request->getScheme(), $this->schemes, true); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; trigger_deprecation('symfony/http-foundation', '6.2', 'The "%s" class is deprecated, use "%s" instead.', RequestMatcher::class, ChainRequestMatcher::class); /** * RequestMatcher compares a pre-defined set of checks against a Request instance. * * @author Fabien Potencier * * @deprecated since Symfony 6.2, use ChainRequestMatcher instead */ class RequestMatcher implements RequestMatcherInterface { private ?string $path = null; private ?string $host = null; private ?int $port = null; /** * @var string[] */ private array $methods = []; /** * @var string[] */ private array $ips = []; /** * @var string[] */ private array $attributes = []; /** * @var string[] */ private array $schemes = []; /** * @param string|string[]|null $methods * @param string|string[]|null $ips * @param string|string[]|null $schemes */ public function __construct(?string $path = null, ?string $host = null, string|array|null $methods = null, string|array|null $ips = null, array $attributes = [], string|array|null $schemes = null, ?int $port = null) { $this->matchPath($path); $this->matchHost($host); $this->matchMethod($methods); $this->matchIps($ips); $this->matchScheme($schemes); $this->matchPort($port); foreach ($attributes as $k => $v) { $this->matchAttribute($k, $v); } } /** * Adds a check for the HTTP scheme. * * @param string|string[]|null $scheme An HTTP scheme or an array of HTTP schemes * * @return void */ public function matchScheme(string|array|null $scheme) { $this->schemes = null !== $scheme ? array_map('strtolower', (array) $scheme) : []; } /** * Adds a check for the URL host name. * * @return void */ public function matchHost(?string $regexp) { $this->host = $regexp; } /** * Adds a check for the URL port. * * @param int|null $port The port number to connect to * * @return void */ public function matchPort(?int $port) { $this->port = $port; } /** * Adds a check for the URL path info. * * @return void */ public function matchPath(?string $regexp) { $this->path = $regexp; } /** * Adds a check for the client IP. * * @param string $ip A specific IP address or a range specified using IP/netmask like 192.168.1.0/24 * * @return void */ public function matchIp(string $ip) { $this->matchIps($ip); } /** * Adds a check for the client IP. * * @param string|string[]|null $ips A specific IP address or a range specified using IP/netmask like 192.168.1.0/24 * * @return void */ public function matchIps(string|array|null $ips) { $ips = null !== $ips ? (array) $ips : []; $this->ips = array_reduce($ips, static fn (array $ips, string $ip) => array_merge($ips, preg_split('/\s*,\s*/', $ip)), []); } /** * Adds a check for the HTTP method. * * @param string|string[]|null $method An HTTP method or an array of HTTP methods * * @return void */ public function matchMethod(string|array|null $method) { $this->methods = null !== $method ? array_map('strtoupper', (array) $method) : []; } /** * Adds a check for request attribute. * * @return void */ public function matchAttribute(string $key, string $regexp) { $this->attributes[$key] = $regexp; } public function matches(Request $request): bool { if ($this->schemes && !\in_array($request->getScheme(), $this->schemes, true)) { return false; } if ($this->methods && !\in_array($request->getMethod(), $this->methods, true)) { return false; } foreach ($this->attributes as $key => $pattern) { $requestAttribute = $request->attributes->get($key); if (!\is_string($requestAttribute)) { return false; } if (!preg_match('{'.$pattern.'}', $requestAttribute)) { return false; } } if (null !== $this->path && !preg_match('{'.$this->path.'}', rawurldecode($request->getPathInfo()))) { return false; } if (null !== $this->host && !preg_match('{'.$this->host.'}i', $request->getHost())) { return false; } if (null !== $this->port && 0 < $this->port && $request->getPort() !== $this->port) { return false; } if (IpUtils::checkIp($request->getClientIp() ?? '', $this->ips)) { return true; } // Note to future implementors: add additional checks above the // foreach above or else your check might not be run! return 0 === \count($this->ips); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestMatcherInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * RequestMatcherInterface is an interface for strategies to match a Request. * * @author Fabien Potencier */ interface RequestMatcherInterface { /** * Decides whether the rule(s) implemented by the strategy matches the supplied request. */ public function matches(Request $request): bool; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/RequestStack.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException; use Symfony\Component\HttpFoundation\Session\SessionInterface; /** * Request stack that controls the lifecycle of requests. * * @author Benjamin Eberlei */ class RequestStack { /** * @var Request[] */ private array $requests = []; /** * Pushes a Request on the stack. * * This method should generally not be called directly as the stack * management should be taken care of by the application itself. * * @return void */ public function push(Request $request) { $this->requests[] = $request; } /** * Pops the current request from the stack. * * This operation lets the current request go out of scope. * * This method should generally not be called directly as the stack * management should be taken care of by the application itself. */ public function pop(): ?Request { if (!$this->requests) { return null; } return array_pop($this->requests); } public function getCurrentRequest(): ?Request { return end($this->requests) ?: null; } /** * Gets the main request. * * Be warned that making your code aware of the main request * might make it un-compatible with other features of your framework * like ESI support. */ public function getMainRequest(): ?Request { if (!$this->requests) { return null; } return $this->requests[0]; } /** * Returns the parent request of the current. * * Be warned that making your code aware of the parent request * might make it un-compatible with other features of your framework * like ESI support. * * If current Request is the main request, it returns null. */ public function getParentRequest(): ?Request { $pos = \count($this->requests) - 2; return $this->requests[$pos] ?? null; } /** * Gets the current session. * * @throws SessionNotFoundException */ public function getSession(): SessionInterface { if ((null !== $request = end($this->requests) ?: null) && $request->hasSession()) { return $request->getSession(); } throw new SessionNotFoundException(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Response.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; // Help opcache.preload discover always-needed symbols class_exists(ResponseHeaderBag::class); /** * Response represents an HTTP response. * * @author Fabien Potencier */ class Response { public const HTTP_CONTINUE = 100; public const HTTP_SWITCHING_PROTOCOLS = 101; public const HTTP_PROCESSING = 102; // RFC2518 public const HTTP_EARLY_HINTS = 103; // RFC8297 public const HTTP_OK = 200; public const HTTP_CREATED = 201; public const HTTP_ACCEPTED = 202; public const HTTP_NON_AUTHORITATIVE_INFORMATION = 203; public const HTTP_NO_CONTENT = 204; public const HTTP_RESET_CONTENT = 205; public const HTTP_PARTIAL_CONTENT = 206; public const HTTP_MULTI_STATUS = 207; // RFC4918 public const HTTP_ALREADY_REPORTED = 208; // RFC5842 public const HTTP_IM_USED = 226; // RFC3229 public const HTTP_MULTIPLE_CHOICES = 300; public const HTTP_MOVED_PERMANENTLY = 301; public const HTTP_FOUND = 302; public const HTTP_SEE_OTHER = 303; public const HTTP_NOT_MODIFIED = 304; public const HTTP_USE_PROXY = 305; public const HTTP_RESERVED = 306; public const HTTP_TEMPORARY_REDIRECT = 307; public const HTTP_PERMANENTLY_REDIRECT = 308; // RFC7238 public const HTTP_BAD_REQUEST = 400; public const HTTP_UNAUTHORIZED = 401; public const HTTP_PAYMENT_REQUIRED = 402; public const HTTP_FORBIDDEN = 403; public const HTTP_NOT_FOUND = 404; public const HTTP_METHOD_NOT_ALLOWED = 405; public const HTTP_NOT_ACCEPTABLE = 406; public const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407; public const HTTP_REQUEST_TIMEOUT = 408; public const HTTP_CONFLICT = 409; public const HTTP_GONE = 410; public const HTTP_LENGTH_REQUIRED = 411; public const HTTP_PRECONDITION_FAILED = 412; public const HTTP_REQUEST_ENTITY_TOO_LARGE = 413; public const HTTP_REQUEST_URI_TOO_LONG = 414; public const HTTP_UNSUPPORTED_MEDIA_TYPE = 415; public const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416; public const HTTP_EXPECTATION_FAILED = 417; public const HTTP_I_AM_A_TEAPOT = 418; // RFC2324 public const HTTP_MISDIRECTED_REQUEST = 421; // RFC7540 public const HTTP_UNPROCESSABLE_ENTITY = 422; // RFC4918 public const HTTP_LOCKED = 423; // RFC4918 public const HTTP_FAILED_DEPENDENCY = 424; // RFC4918 public const HTTP_TOO_EARLY = 425; // RFC-ietf-httpbis-replay-04 public const HTTP_UPGRADE_REQUIRED = 426; // RFC2817 public const HTTP_PRECONDITION_REQUIRED = 428; // RFC6585 public const HTTP_TOO_MANY_REQUESTS = 429; // RFC6585 public const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431; // RFC6585 public const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451; // RFC7725 public const HTTP_INTERNAL_SERVER_ERROR = 500; public const HTTP_NOT_IMPLEMENTED = 501; public const HTTP_BAD_GATEWAY = 502; public const HTTP_SERVICE_UNAVAILABLE = 503; public const HTTP_GATEWAY_TIMEOUT = 504; public const HTTP_VERSION_NOT_SUPPORTED = 505; public const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506; // RFC2295 public const HTTP_INSUFFICIENT_STORAGE = 507; // RFC4918 public const HTTP_LOOP_DETECTED = 508; // RFC5842 public const HTTP_NOT_EXTENDED = 510; // RFC2774 public const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511; // RFC6585 /** * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control */ private const HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES = [ 'must_revalidate' => false, 'no_cache' => false, 'no_store' => false, 'no_transform' => false, 'public' => false, 'private' => false, 'proxy_revalidate' => false, 'max_age' => true, 's_maxage' => true, 'stale_if_error' => true, // RFC5861 'stale_while_revalidate' => true, // RFC5861 'immutable' => false, 'last_modified' => true, 'etag' => true, ]; /** * @var ResponseHeaderBag */ public $headers; /** * @var string */ protected $content; /** * @var string */ protected $version; /** * @var int */ protected $statusCode; /** * @var string */ protected $statusText; /** * @var string */ protected $charset; /** * Status codes translation table. * * The list of codes is complete according to the * {@link https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml Hypertext Transfer Protocol (HTTP) Status Code Registry} * (last updated 2021-10-01). * * Unless otherwise noted, the status code is defined in RFC2616. * * @var array */ public static $statusTexts = [ 100 => 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', // RFC2518 103 => 'Early Hints', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-Status', // RFC4918 208 => 'Already Reported', // RFC5842 226 => 'IM Used', // RFC3229 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 308 => 'Permanent Redirect', // RFC7238 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Content Too Large', // RFC-ietf-httpbis-semantics 414 => 'URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Range Not Satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', // RFC2324 421 => 'Misdirected Request', // RFC7540 422 => 'Unprocessable Content', // RFC-ietf-httpbis-semantics 423 => 'Locked', // RFC4918 424 => 'Failed Dependency', // RFC4918 425 => 'Too Early', // RFC-ietf-httpbis-replay-04 426 => 'Upgrade Required', // RFC2817 428 => 'Precondition Required', // RFC6585 429 => 'Too Many Requests', // RFC6585 431 => 'Request Header Fields Too Large', // RFC6585 451 => 'Unavailable For Legal Reasons', // RFC7725 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 506 => 'Variant Also Negotiates', // RFC2295 507 => 'Insufficient Storage', // RFC4918 508 => 'Loop Detected', // RFC5842 510 => 'Not Extended', // RFC2774 511 => 'Network Authentication Required', // RFC6585 ]; /** * Tracks headers already sent in informational responses. */ private array $sentHeaders; /** * @param int $status The HTTP status code (200 "OK" by default) * * @throws \InvalidArgumentException When the HTTP status code is not valid */ public function __construct(?string $content = '', int $status = 200, array $headers = []) { $this->headers = new ResponseHeaderBag($headers); $this->setContent($content); $this->setStatusCode($status); $this->setProtocolVersion('1.0'); } /** * Returns the Response as an HTTP string. * * The string representation of the Response is the same as the * one that will be sent to the client only if the prepare() method * has been called before. * * @see prepare() */ public function __toString(): string { return sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n". $this->headers."\r\n". $this->getContent(); } /** * Clones the current Response instance. */ public function __clone() { $this->headers = clone $this->headers; } /** * Prepares the Response before it is sent to the client. * * This method tweaks the Response to ensure that it is * compliant with RFC 2616. Most of the changes are based on * the Request that is "associated" with this Response. * * @return $this */ public function prepare(Request $request): static { $headers = $this->headers; if ($this->isInformational() || $this->isEmpty()) { $this->setContent(null); $headers->remove('Content-Type'); $headers->remove('Content-Length'); // prevent PHP from sending the Content-Type header based on default_mimetype ini_set('default_mimetype', ''); } else { // Content-type based on the Request if (!$headers->has('Content-Type')) { $format = $request->getRequestFormat(null); if (null !== $format && $mimeType = $request->getMimeType($format)) { $headers->set('Content-Type', $mimeType); } } // Fix Content-Type $charset = $this->charset ?: 'UTF-8'; if (!$headers->has('Content-Type')) { $headers->set('Content-Type', 'text/html; charset='.$charset); } elseif (0 === stripos($headers->get('Content-Type') ?? '', 'text/') && false === stripos($headers->get('Content-Type') ?? '', 'charset')) { // add the charset $headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset); } // Fix Content-Length if ($headers->has('Transfer-Encoding')) { $headers->remove('Content-Length'); } if ($request->isMethod('HEAD')) { // cf. RFC2616 14.13 $length = $headers->get('Content-Length'); $this->setContent(null); if ($length) { $headers->set('Content-Length', $length); } } } // Fix protocol if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) { $this->setProtocolVersion('1.1'); } // Check if we need to send extra expire info headers if ('1.0' == $this->getProtocolVersion() && str_contains($headers->get('Cache-Control', ''), 'no-cache')) { $headers->set('pragma', 'no-cache'); $headers->set('expires', -1); } $this->ensureIEOverSSLCompatibility($request); if ($request->isSecure()) { foreach ($headers->getCookies() as $cookie) { $cookie->setSecureDefault(true); } } return $this; } /** * Sends HTTP headers. * * @param positive-int|null $statusCode The status code to use, override the statusCode property if set and not null * * @return $this */ public function sendHeaders(/* int $statusCode = null */): static { // headers have already been sent by the developer if (headers_sent()) { return $this; } $statusCode = \func_num_args() > 0 ? func_get_arg(0) : null; $informationalResponse = $statusCode >= 100 && $statusCode < 200; if ($informationalResponse && !\function_exists('headers_send')) { // skip informational responses if not supported by the SAPI return $this; } // headers foreach ($this->headers->allPreserveCaseWithoutCookies() as $name => $values) { $newValues = $values; $replace = false; // As recommended by RFC 8297, PHP automatically copies headers from previous 103 responses, we need to deal with that if headers changed $previousValues = $this->sentHeaders[$name] ?? null; if ($previousValues === $values) { // Header already sent in a previous response, it will be automatically copied in this response by PHP continue; } $replace = 0 === strcasecmp($name, 'Content-Type'); if (null !== $previousValues && array_diff($previousValues, $values)) { header_remove($name); $previousValues = null; } $newValues = null === $previousValues ? $values : array_diff($values, $previousValues); foreach ($newValues as $value) { header($name.': '.$value, $replace, $this->statusCode); } if ($informationalResponse) { $this->sentHeaders[$name] = $values; } } // cookies foreach ($this->headers->getCookies() as $cookie) { header('Set-Cookie: '.$cookie, false, $this->statusCode); } if ($informationalResponse) { headers_send($statusCode); return $this; } $statusCode ??= $this->statusCode; // status header(sprintf('HTTP/%s %s %s', $this->version, $statusCode, $this->statusText), true, $statusCode); return $this; } /** * Sends content for the current web response. * * @return $this */ public function sendContent(): static { echo $this->content; return $this; } /** * Sends HTTP headers and content. * * @param bool $flush Whether output buffers should be flushed * * @return $this */ public function send(/* bool $flush = true */): static { $this->sendHeaders(); $this->sendContent(); $flush = 1 <= \func_num_args() ? func_get_arg(0) : true; if (!$flush) { return $this; } if (\function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } elseif (\function_exists('litespeed_finish_request')) { litespeed_finish_request(); } elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { static::closeOutputBuffers(0, true); flush(); } return $this; } /** * Sets the response content. * * @return $this */ public function setContent(?string $content): static { $this->content = $content ?? ''; return $this; } /** * Gets the current response content. */ public function getContent(): string|false { return $this->content; } /** * Sets the HTTP protocol version (1.0 or 1.1). * * @return $this * * @final */ public function setProtocolVersion(string $version): static { $this->version = $version; return $this; } /** * Gets the HTTP protocol version. * * @final */ public function getProtocolVersion(): string { return $this->version; } /** * Sets the response status code. * * If the status text is null it will be automatically populated for the known * status codes and left empty otherwise. * * @return $this * * @throws \InvalidArgumentException When the HTTP status code is not valid * * @final */ public function setStatusCode(int $code, ?string $text = null): static { $this->statusCode = $code; if ($this->isInvalid()) { throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code)); } if (null === $text) { $this->statusText = self::$statusTexts[$code] ?? 'unknown status'; return $this; } $this->statusText = $text; return $this; } /** * Retrieves the status code for the current web response. * * @final */ public function getStatusCode(): int { return $this->statusCode; } /** * Sets the response charset. * * @return $this * * @final */ public function setCharset(string $charset): static { $this->charset = $charset; return $this; } /** * Retrieves the response charset. * * @final */ public function getCharset(): ?string { return $this->charset; } /** * Returns true if the response may safely be kept in a shared (surrogate) cache. * * Responses marked "private" with an explicit Cache-Control directive are * considered uncacheable. * * Responses with neither a freshness lifetime (Expires, max-age) nor cache * validator (Last-Modified, ETag) are considered uncacheable because there is * no way to tell when or how to remove them from the cache. * * Note that RFC 7231 and RFC 7234 possibly allow for a more permissive implementation, * for example "status codes that are defined as cacheable by default [...] * can be reused by a cache with heuristic expiration unless otherwise indicated" * (https://tools.ietf.org/html/rfc7231#section-6.1) * * @final */ public function isCacheable(): bool { if (!\in_array($this->statusCode, [200, 203, 300, 301, 302, 404, 410])) { return false; } if ($this->headers->hasCacheControlDirective('no-store') || $this->headers->getCacheControlDirective('private')) { return false; } return $this->isValidateable() || $this->isFresh(); } /** * Returns true if the response is "fresh". * * Fresh responses may be served from cache without any interaction with the * origin. A response is considered fresh when it includes a Cache-Control/max-age * indicator or Expires header and the calculated age is less than the freshness lifetime. * * @final */ public function isFresh(): bool { return $this->getTtl() > 0; } /** * Returns true if the response includes headers that can be used to validate * the response with the origin server using a conditional GET request. * * @final */ public function isValidateable(): bool { return $this->headers->has('Last-Modified') || $this->headers->has('ETag'); } /** * Marks the response as "private". * * It makes the response ineligible for serving other clients. * * @return $this * * @final */ public function setPrivate(): static { $this->headers->removeCacheControlDirective('public'); $this->headers->addCacheControlDirective('private'); return $this; } /** * Marks the response as "public". * * It makes the response eligible for serving other clients. * * @return $this * * @final */ public function setPublic(): static { $this->headers->addCacheControlDirective('public'); $this->headers->removeCacheControlDirective('private'); return $this; } /** * Marks the response as "immutable". * * @return $this * * @final */ public function setImmutable(bool $immutable = true): static { if ($immutable) { $this->headers->addCacheControlDirective('immutable'); } else { $this->headers->removeCacheControlDirective('immutable'); } return $this; } /** * Returns true if the response is marked as "immutable". * * @final */ public function isImmutable(): bool { return $this->headers->hasCacheControlDirective('immutable'); } /** * Returns true if the response must be revalidated by shared caches once it has become stale. * * This method indicates that the response must not be served stale by a * cache in any circumstance without first revalidating with the origin. * When present, the TTL of the response should not be overridden to be * greater than the value provided by the origin. * * @final */ public function mustRevalidate(): bool { return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->hasCacheControlDirective('proxy-revalidate'); } /** * Returns the Date header as a DateTime instance. * * @throws \RuntimeException When the header is not parseable * * @final */ public function getDate(): ?\DateTimeImmutable { return $this->headers->getDate('Date'); } /** * Sets the Date header. * * @return $this * * @final */ public function setDate(\DateTimeInterface $date): static { $date = \DateTimeImmutable::createFromInterface($date); $date = $date->setTimezone(new \DateTimeZone('UTC')); $this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT'); return $this; } /** * Returns the age of the response in seconds. * * @final */ public function getAge(): int { if (null !== $age = $this->headers->get('Age')) { return (int) $age; } return max(time() - (int) $this->getDate()->format('U'), 0); } /** * Marks the response stale by setting the Age header to be equal to the maximum age of the response. * * @return $this */ public function expire(): static { if ($this->isFresh()) { $this->headers->set('Age', $this->getMaxAge()); $this->headers->remove('Expires'); } return $this; } /** * Returns the value of the Expires header as a DateTime instance. * * @final */ public function getExpires(): ?\DateTimeImmutable { try { return $this->headers->getDate('Expires'); } catch (\RuntimeException) { // according to RFC 2616 invalid date formats (e.g. "0" and "-1") must be treated as in the past return \DateTimeImmutable::createFromFormat('U', time() - 172800); } } /** * Sets the Expires HTTP header with a DateTime instance. * * Passing null as value will remove the header. * * @return $this * * @final */ public function setExpires(?\DateTimeInterface $date = null): static { if (1 > \func_num_args()) { trigger_deprecation('symfony/http-foundation', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); } if (null === $date) { $this->headers->remove('Expires'); return $this; } $date = \DateTimeImmutable::createFromInterface($date); $date = $date->setTimezone(new \DateTimeZone('UTC')); $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT'); return $this; } /** * Returns the number of seconds after the time specified in the response's Date * header when the response should no longer be considered fresh. * * First, it checks for a s-maxage directive, then a max-age directive, and then it falls * back on an expires header. It returns null when no maximum age can be established. * * @final */ public function getMaxAge(): ?int { if ($this->headers->hasCacheControlDirective('s-maxage')) { return (int) $this->headers->getCacheControlDirective('s-maxage'); } if ($this->headers->hasCacheControlDirective('max-age')) { return (int) $this->headers->getCacheControlDirective('max-age'); } if (null !== $expires = $this->getExpires()) { $maxAge = (int) $expires->format('U') - (int) $this->getDate()->format('U'); return max($maxAge, 0); } return null; } /** * Sets the number of seconds after which the response should no longer be considered fresh. * * This methods sets the Cache-Control max-age directive. * * @return $this * * @final */ public function setMaxAge(int $value): static { $this->headers->addCacheControlDirective('max-age', $value); return $this; } /** * Sets the number of seconds after which the response should no longer be returned by shared caches when backend is down. * * This method sets the Cache-Control stale-if-error directive. * * @return $this * * @final */ public function setStaleIfError(int $value): static { $this->headers->addCacheControlDirective('stale-if-error', $value); return $this; } /** * Sets the number of seconds after which the response should no longer return stale content by shared caches. * * This method sets the Cache-Control stale-while-revalidate directive. * * @return $this * * @final */ public function setStaleWhileRevalidate(int $value): static { $this->headers->addCacheControlDirective('stale-while-revalidate', $value); return $this; } /** * Sets the number of seconds after which the response should no longer be considered fresh by shared caches. * * This methods sets the Cache-Control s-maxage directive. * * @return $this * * @final */ public function setSharedMaxAge(int $value): static { $this->setPublic(); $this->headers->addCacheControlDirective('s-maxage', $value); return $this; } /** * Returns the response's time-to-live in seconds. * * It returns null when no freshness information is present in the response. * * When the response's TTL is 0, the response may not be served from cache without first * revalidating with the origin. * * @final */ public function getTtl(): ?int { $maxAge = $this->getMaxAge(); return null !== $maxAge ? max($maxAge - $this->getAge(), 0) : null; } /** * Sets the response's time-to-live for shared caches in seconds. * * This method adjusts the Cache-Control/s-maxage directive. * * @return $this * * @final */ public function setTtl(int $seconds): static { $this->setSharedMaxAge($this->getAge() + $seconds); return $this; } /** * Sets the response's time-to-live for private/client caches in seconds. * * This method adjusts the Cache-Control/max-age directive. * * @return $this * * @final */ public function setClientTtl(int $seconds): static { $this->setMaxAge($this->getAge() + $seconds); return $this; } /** * Returns the Last-Modified HTTP header as a DateTime instance. * * @throws \RuntimeException When the HTTP header is not parseable * * @final */ public function getLastModified(): ?\DateTimeImmutable { return $this->headers->getDate('Last-Modified'); } /** * Sets the Last-Modified HTTP header with a DateTime instance. * * Passing null as value will remove the header. * * @return $this * * @final */ public function setLastModified(?\DateTimeInterface $date = null): static { if (1 > \func_num_args()) { trigger_deprecation('symfony/http-foundation', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); } if (null === $date) { $this->headers->remove('Last-Modified'); return $this; } $date = \DateTimeImmutable::createFromInterface($date); $date = $date->setTimezone(new \DateTimeZone('UTC')); $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT'); return $this; } /** * Returns the literal value of the ETag HTTP header. * * @final */ public function getEtag(): ?string { return $this->headers->get('ETag'); } /** * Sets the ETag value. * * @param string|null $etag The ETag unique identifier or null to remove the header * @param bool $weak Whether you want a weak ETag or not * * @return $this * * @final */ public function setEtag(?string $etag = null, bool $weak = false): static { if (1 > \func_num_args()) { trigger_deprecation('symfony/http-foundation', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); } if (null === $etag) { $this->headers->remove('Etag'); } else { if (!str_starts_with($etag, '"')) { $etag = '"'.$etag.'"'; } $this->headers->set('ETag', (true === $weak ? 'W/' : '').$etag); } return $this; } /** * Sets the response's cache headers (validation and/or expiration). * * Available options are: must_revalidate, no_cache, no_store, no_transform, public, private, proxy_revalidate, max_age, s_maxage, immutable, last_modified and etag. * * @return $this * * @throws \InvalidArgumentException * * @final */ public function setCache(array $options): static { if ($diff = array_diff(array_keys($options), array_keys(self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES))) { throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', $diff))); } if (isset($options['etag'])) { $this->setEtag($options['etag']); } if (isset($options['last_modified'])) { $this->setLastModified($options['last_modified']); } if (isset($options['max_age'])) { $this->setMaxAge($options['max_age']); } if (isset($options['s_maxage'])) { $this->setSharedMaxAge($options['s_maxage']); } if (isset($options['stale_while_revalidate'])) { $this->setStaleWhileRevalidate($options['stale_while_revalidate']); } if (isset($options['stale_if_error'])) { $this->setStaleIfError($options['stale_if_error']); } foreach (self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES as $directive => $hasValue) { if (!$hasValue && isset($options[$directive])) { if ($options[$directive]) { $this->headers->addCacheControlDirective(str_replace('_', '-', $directive)); } else { $this->headers->removeCacheControlDirective(str_replace('_', '-', $directive)); } } } if (isset($options['public'])) { if ($options['public']) { $this->setPublic(); } else { $this->setPrivate(); } } if (isset($options['private'])) { if ($options['private']) { $this->setPrivate(); } else { $this->setPublic(); } } return $this; } /** * Modifies the response so that it conforms to the rules defined for a 304 status code. * * This sets the status, removes the body, and discards any headers * that MUST NOT be included in 304 responses. * * @return $this * * @see https://tools.ietf.org/html/rfc2616#section-10.3.5 * * @final */ public function setNotModified(): static { $this->setStatusCode(304); $this->setContent(null); // remove headers that MUST NOT be included with 304 Not Modified responses foreach (['Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified'] as $header) { $this->headers->remove($header); } return $this; } /** * Returns true if the response includes a Vary header. * * @final */ public function hasVary(): bool { return null !== $this->headers->get('Vary'); } /** * Returns an array of header names given in the Vary header. * * @final */ public function getVary(): array { if (!$vary = $this->headers->all('Vary')) { return []; } $ret = []; foreach ($vary as $item) { $ret[] = preg_split('/[\s,]+/', $item); } return array_merge([], ...$ret); } /** * Sets the Vary header. * * @param bool $replace Whether to replace the actual value or not (true by default) * * @return $this * * @final */ public function setVary(string|array $headers, bool $replace = true): static { $this->headers->set('Vary', $headers, $replace); return $this; } /** * Determines if the Response validators (ETag, Last-Modified) match * a conditional value specified in the Request. * * If the Response is not modified, it sets the status code to 304 and * removes the actual content by calling the setNotModified() method. * * @final */ public function isNotModified(Request $request): bool { if (!$request->isMethodCacheable()) { return false; } $notModified = false; $lastModified = $this->headers->get('Last-Modified'); $modifiedSince = $request->headers->get('If-Modified-Since'); if (($ifNoneMatchEtags = $request->getETags()) && (null !== $etag = $this->getEtag())) { if (0 == strncmp($etag, 'W/', 2)) { $etag = substr($etag, 2); } // Use weak comparison as per https://tools.ietf.org/html/rfc7232#section-3.2. foreach ($ifNoneMatchEtags as $ifNoneMatchEtag) { if (0 == strncmp($ifNoneMatchEtag, 'W/', 2)) { $ifNoneMatchEtag = substr($ifNoneMatchEtag, 2); } if ($ifNoneMatchEtag === $etag || '*' === $ifNoneMatchEtag) { $notModified = true; break; } } } // Only do If-Modified-Since date comparison when If-None-Match is not present as per https://tools.ietf.org/html/rfc7232#section-3.3. elseif ($modifiedSince && $lastModified) { $notModified = strtotime($modifiedSince) >= strtotime($lastModified); } if ($notModified) { $this->setNotModified(); } return $notModified; } /** * Is response invalid? * * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html * * @final */ public function isInvalid(): bool { return $this->statusCode < 100 || $this->statusCode >= 600; } /** * Is response informative? * * @final */ public function isInformational(): bool { return $this->statusCode >= 100 && $this->statusCode < 200; } /** * Is response successful? * * @final */ public function isSuccessful(): bool { return $this->statusCode >= 200 && $this->statusCode < 300; } /** * Is the response a redirect? * * @final */ public function isRedirection(): bool { return $this->statusCode >= 300 && $this->statusCode < 400; } /** * Is there a client error? * * @final */ public function isClientError(): bool { return $this->statusCode >= 400 && $this->statusCode < 500; } /** * Was there a server side error? * * @final */ public function isServerError(): bool { return $this->statusCode >= 500 && $this->statusCode < 600; } /** * Is the response OK? * * @final */ public function isOk(): bool { return 200 === $this->statusCode; } /** * Is the response forbidden? * * @final */ public function isForbidden(): bool { return 403 === $this->statusCode; } /** * Is the response a not found error? * * @final */ public function isNotFound(): bool { return 404 === $this->statusCode; } /** * Is the response a redirect of some form? * * @final */ public function isRedirect(?string $location = null): bool { return \in_array($this->statusCode, [201, 301, 302, 303, 307, 308]) && (null === $location ?: $location == $this->headers->get('Location')); } /** * Is the response empty? * * @final */ public function isEmpty(): bool { return \in_array($this->statusCode, [204, 304]); } /** * Cleans or flushes output buffers up to target level. * * Resulting level can be greater than target level if a non-removable buffer has been encountered. * * @final */ public static function closeOutputBuffers(int $targetLevel, bool $flush): void { $status = ob_get_status(true); $level = \count($status); $flags = \PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? \PHP_OUTPUT_HANDLER_FLUSHABLE : \PHP_OUTPUT_HANDLER_CLEANABLE); while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s['del']) ? !isset($s['flags']) || ($s['flags'] & $flags) === $flags : $s['del'])) { if ($flush) { ob_end_flush(); } else { ob_end_clean(); } } } /** * Marks a response as safe according to RFC8674. * * @see https://tools.ietf.org/html/rfc8674 */ public function setContentSafe(bool $safe = true): void { if ($safe) { $this->headers->set('Preference-Applied', 'safe'); } elseif ('safe' === $this->headers->get('Preference-Applied')) { $this->headers->remove('Preference-Applied'); } $this->setVary('Prefer', false); } /** * Checks if we need to remove Cache-Control for SSL encrypted downloads when using IE < 9. * * @see http://support.microsoft.com/kb/323308 * * @final */ protected function ensureIEOverSSLCompatibility(Request $request): void { if (false !== stripos($this->headers->get('Content-Disposition') ?? '', 'attachment') && 1 == preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT') ?? '', $match) && true === $request->isSecure()) { if ((int) preg_replace('/(MSIE )(.*?);/', '$2', $match[0]) < 9) { $this->headers->remove('Cache-Control'); } } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/ResponseHeaderBag.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * ResponseHeaderBag is a container for Response HTTP headers. * * @author Fabien Potencier */ class ResponseHeaderBag extends HeaderBag { public const COOKIES_FLAT = 'flat'; public const COOKIES_ARRAY = 'array'; public const DISPOSITION_ATTACHMENT = 'attachment'; public const DISPOSITION_INLINE = 'inline'; protected $computedCacheControl = []; protected $cookies = []; protected $headerNames = []; public function __construct(array $headers = []) { parent::__construct($headers); if (!isset($this->headers['cache-control'])) { $this->set('Cache-Control', ''); } /* RFC2616 - 14.18 says all Responses need to have a Date */ if (!isset($this->headers['date'])) { $this->initDate(); } } /** * Returns the headers, with original capitalizations. */ public function allPreserveCase(): array { $headers = []; foreach ($this->all() as $name => $value) { $headers[$this->headerNames[$name] ?? $name] = $value; } return $headers; } /** * @return array */ public function allPreserveCaseWithoutCookies() { $headers = $this->allPreserveCase(); if (isset($this->headerNames['set-cookie'])) { unset($headers[$this->headerNames['set-cookie']]); } return $headers; } /** * @return void */ public function replace(array $headers = []) { $this->headerNames = []; parent::replace($headers); if (!isset($this->headers['cache-control'])) { $this->set('Cache-Control', ''); } if (!isset($this->headers['date'])) { $this->initDate(); } } public function all(?string $key = null): array { $headers = parent::all(); if (null !== $key) { $key = strtr($key, self::UPPER, self::LOWER); return 'set-cookie' !== $key ? $headers[$key] ?? [] : array_map('strval', $this->getCookies()); } foreach ($this->getCookies() as $cookie) { $headers['set-cookie'][] = (string) $cookie; } return $headers; } /** * @return void */ public function set(string $key, string|array|null $values, bool $replace = true) { $uniqueKey = strtr($key, self::UPPER, self::LOWER); if ('set-cookie' === $uniqueKey) { if ($replace) { $this->cookies = []; } foreach ((array) $values as $cookie) { $this->setCookie(Cookie::fromString($cookie)); } $this->headerNames[$uniqueKey] = $key; return; } $this->headerNames[$uniqueKey] = $key; parent::set($key, $values, $replace); // ensure the cache-control header has sensible defaults if (\in_array($uniqueKey, ['cache-control', 'etag', 'last-modified', 'expires'], true) && '' !== $computed = $this->computeCacheControlValue()) { $this->headers['cache-control'] = [$computed]; $this->headerNames['cache-control'] = 'Cache-Control'; $this->computedCacheControl = $this->parseCacheControl($computed); } } /** * @return void */ public function remove(string $key) { $uniqueKey = strtr($key, self::UPPER, self::LOWER); unset($this->headerNames[$uniqueKey]); if ('set-cookie' === $uniqueKey) { $this->cookies = []; return; } parent::remove($key); if ('cache-control' === $uniqueKey) { $this->computedCacheControl = []; } if ('date' === $uniqueKey) { $this->initDate(); } } public function hasCacheControlDirective(string $key): bool { return \array_key_exists($key, $this->computedCacheControl); } public function getCacheControlDirective(string $key): bool|string|null { return $this->computedCacheControl[$key] ?? null; } /** * @return void */ public function setCookie(Cookie $cookie) { $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie; $this->headerNames['set-cookie'] = 'Set-Cookie'; } /** * Removes a cookie from the array, but does not unset it in the browser. * * @return void */ public function removeCookie(string $name, ?string $path = '/', ?string $domain = null) { $path ??= '/'; unset($this->cookies[$domain][$path][$name]); if (empty($this->cookies[$domain][$path])) { unset($this->cookies[$domain][$path]); if (empty($this->cookies[$domain])) { unset($this->cookies[$domain]); } } if (empty($this->cookies)) { unset($this->headerNames['set-cookie']); } } /** * Returns an array with all cookies. * * @return Cookie[] * * @throws \InvalidArgumentException When the $format is invalid */ public function getCookies(string $format = self::COOKIES_FLAT): array { if (!\in_array($format, [self::COOKIES_FLAT, self::COOKIES_ARRAY])) { throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', [self::COOKIES_FLAT, self::COOKIES_ARRAY]))); } if (self::COOKIES_ARRAY === $format) { return $this->cookies; } $flattenedCookies = []; foreach ($this->cookies as $path) { foreach ($path as $cookies) { foreach ($cookies as $cookie) { $flattenedCookies[] = $cookie; } } } return $flattenedCookies; } /** * Clears a cookie in the browser. * * @param bool $partitioned * * @return void */ public function clearCookie(string $name, ?string $path = '/', ?string $domain = null, bool $secure = false, bool $httpOnly = true, ?string $sameSite = null /* , bool $partitioned = false */) { $partitioned = 6 < \func_num_args() ? \func_get_arg(6) : false; $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly, false, $sameSite, $partitioned)); } /** * @see HeaderUtils::makeDisposition() * * @return string */ public function makeDisposition(string $disposition, string $filename, string $filenameFallback = '') { return HeaderUtils::makeDisposition($disposition, $filename, $filenameFallback); } /** * Returns the calculated value of the cache-control header. * * This considers several other headers and calculates or modifies the * cache-control header to a sensible, conservative value. */ protected function computeCacheControlValue(): string { if (!$this->cacheControl) { if ($this->has('Last-Modified') || $this->has('Expires')) { return 'private, must-revalidate'; // allows for heuristic expiration (RFC 7234 Section 4.2.2) in the case of "Last-Modified" } // conservative by default return 'no-cache, private'; } $header = $this->getCacheControlHeader(); if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) { return $header; } // public if s-maxage is defined, private otherwise if (!isset($this->cacheControl['s-maxage'])) { return $header.', private'; } return $header; } private function initDate(): void { $this->set('Date', gmdate('D, d M Y H:i:s').' GMT'); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/ServerBag.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * ServerBag is a container for HTTP headers from the $_SERVER variable. * * @author Fabien Potencier * @author Bulat Shakirzyanov * @author Robert Kiss */ class ServerBag extends ParameterBag { /** * Gets the HTTP headers. */ public function getHeaders(): array { $headers = []; foreach ($this->parameters as $key => $value) { if (str_starts_with($key, 'HTTP_')) { $headers[substr($key, 5)] = $value; } elseif (\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true) && '' !== $value) { $headers[$key] = $value; } } if (isset($this->parameters['PHP_AUTH_USER'])) { $headers['PHP_AUTH_USER'] = $this->parameters['PHP_AUTH_USER']; $headers['PHP_AUTH_PW'] = $this->parameters['PHP_AUTH_PW'] ?? ''; } else { /* * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default * For this workaround to work, add these lines to your .htaccess file: * RewriteCond %{HTTP:Authorization} .+ * RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] * * A sample .htaccess file: * RewriteEngine On * RewriteCond %{HTTP:Authorization} .+ * RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] * RewriteCond %{REQUEST_FILENAME} !-f * RewriteRule ^(.*)$ index.php [QSA,L] */ $authorizationHeader = null; if (isset($this->parameters['HTTP_AUTHORIZATION'])) { $authorizationHeader = $this->parameters['HTTP_AUTHORIZATION']; } elseif (isset($this->parameters['REDIRECT_HTTP_AUTHORIZATION'])) { $authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION']; } if (null !== $authorizationHeader) { if (0 === stripos($authorizationHeader, 'basic ')) { // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)), 2); if (2 == \count($exploded)) { [$headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']] = $exploded; } } elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader, 'digest '))) { // In some circumstances PHP_AUTH_DIGEST needs to be set $headers['PHP_AUTH_DIGEST'] = $authorizationHeader; $this->parameters['PHP_AUTH_DIGEST'] = $authorizationHeader; } elseif (0 === stripos($authorizationHeader, 'bearer ')) { /* * XXX: Since there is no PHP_AUTH_BEARER in PHP predefined variables, * I'll just set $headers['AUTHORIZATION'] here. * https://php.net/reserved.variables.server */ $headers['AUTHORIZATION'] = $authorizationHeader; } } } if (isset($headers['AUTHORIZATION'])) { return $headers; } // PHP_AUTH_USER/PHP_AUTH_PW if (isset($headers['PHP_AUTH_USER'])) { $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.($headers['PHP_AUTH_PW'] ?? '')); } elseif (isset($headers['PHP_AUTH_DIGEST'])) { $headers['AUTHORIZATION'] = $headers['PHP_AUTH_DIGEST']; } return $headers; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Attribute; /** * This class relates to session attribute storage. * * @implements \IteratorAggregate */ class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable { private string $name = 'attributes'; private string $storageKey; protected $attributes = []; /** * @param string $storageKey The key used to store attributes in the session */ public function __construct(string $storageKey = '_sf2_attributes') { $this->storageKey = $storageKey; } public function getName(): string { return $this->name; } /** * @return void */ public function setName(string $name) { $this->name = $name; } /** * @return void */ public function initialize(array &$attributes) { $this->attributes = &$attributes; } public function getStorageKey(): string { return $this->storageKey; } public function has(string $name): bool { return \array_key_exists($name, $this->attributes); } public function get(string $name, mixed $default = null): mixed { return \array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default; } /** * @return void */ public function set(string $name, mixed $value) { $this->attributes[$name] = $value; } public function all(): array { return $this->attributes; } /** * @return void */ public function replace(array $attributes) { $this->attributes = []; foreach ($attributes as $key => $value) { $this->set($key, $value); } } public function remove(string $name): mixed { $retval = null; if (\array_key_exists($name, $this->attributes)) { $retval = $this->attributes[$name]; unset($this->attributes[$name]); } return $retval; } public function clear(): mixed { $return = $this->attributes; $this->attributes = []; return $return; } /** * Returns an iterator for attributes. * * @return \ArrayIterator */ public function getIterator(): \ArrayIterator { return new \ArrayIterator($this->attributes); } /** * Returns the number of attributes. */ public function count(): int { return \count($this->attributes); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Attribute; use Symfony\Component\HttpFoundation\Session\SessionBagInterface; /** * Attributes store. * * @author Drak */ interface AttributeBagInterface extends SessionBagInterface { /** * Checks if an attribute is defined. */ public function has(string $name): bool; /** * Returns an attribute. */ public function get(string $name, mixed $default = null): mixed; /** * Sets an attribute. * * @return void */ public function set(string $name, mixed $value); /** * Returns attributes. * * @return array */ public function all(): array; /** * @return void */ public function replace(array $attributes); /** * Removes an attribute. * * @return mixed The removed value or null when it does not exist */ public function remove(string $name): mixed; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Flash; /** * AutoExpireFlashBag flash message container. * * @author Drak */ class AutoExpireFlashBag implements FlashBagInterface { private string $name = 'flashes'; private array $flashes = ['display' => [], 'new' => []]; private string $storageKey; /** * @param string $storageKey The key used to store flashes in the session */ public function __construct(string $storageKey = '_symfony_flashes') { $this->storageKey = $storageKey; } public function getName(): string { return $this->name; } /** * @return void */ public function setName(string $name) { $this->name = $name; } /** * @return void */ public function initialize(array &$flashes) { $this->flashes = &$flashes; // The logic: messages from the last request will be stored in new, so we move them to previous // This request we will show what is in 'display'. What is placed into 'new' this time round will // be moved to display next time round. $this->flashes['display'] = \array_key_exists('new', $this->flashes) ? $this->flashes['new'] : []; $this->flashes['new'] = []; } /** * @return void */ public function add(string $type, mixed $message) { $this->flashes['new'][$type][] = $message; } public function peek(string $type, array $default = []): array { return $this->has($type) ? $this->flashes['display'][$type] : $default; } public function peekAll(): array { return \array_key_exists('display', $this->flashes) ? $this->flashes['display'] : []; } public function get(string $type, array $default = []): array { $return = $default; if (!$this->has($type)) { return $return; } if (isset($this->flashes['display'][$type])) { $return = $this->flashes['display'][$type]; unset($this->flashes['display'][$type]); } return $return; } public function all(): array { $return = $this->flashes['display']; $this->flashes['display'] = []; return $return; } /** * @return void */ public function setAll(array $messages) { $this->flashes['new'] = $messages; } /** * @return void */ public function set(string $type, string|array $messages) { $this->flashes['new'][$type] = (array) $messages; } public function has(string $type): bool { return \array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type]; } public function keys(): array { return array_keys($this->flashes['display']); } public function getStorageKey(): string { return $this->storageKey; } public function clear(): mixed { return $this->all(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Flash/FlashBag.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Flash; /** * FlashBag flash message container. * * @author Drak */ class FlashBag implements FlashBagInterface { private string $name = 'flashes'; private array $flashes = []; private string $storageKey; /** * @param string $storageKey The key used to store flashes in the session */ public function __construct(string $storageKey = '_symfony_flashes') { $this->storageKey = $storageKey; } public function getName(): string { return $this->name; } /** * @return void */ public function setName(string $name) { $this->name = $name; } /** * @return void */ public function initialize(array &$flashes) { $this->flashes = &$flashes; } /** * @return void */ public function add(string $type, mixed $message) { $this->flashes[$type][] = $message; } public function peek(string $type, array $default = []): array { return $this->has($type) ? $this->flashes[$type] : $default; } public function peekAll(): array { return $this->flashes; } public function get(string $type, array $default = []): array { if (!$this->has($type)) { return $default; } $return = $this->flashes[$type]; unset($this->flashes[$type]); return $return; } public function all(): array { $return = $this->peekAll(); $this->flashes = []; return $return; } /** * @return void */ public function set(string $type, string|array $messages) { $this->flashes[$type] = (array) $messages; } /** * @return void */ public function setAll(array $messages) { $this->flashes = $messages; } public function has(string $type): bool { return \array_key_exists($type, $this->flashes) && $this->flashes[$type]; } public function keys(): array { return array_keys($this->flashes); } public function getStorageKey(): string { return $this->storageKey; } public function clear(): mixed { return $this->all(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Flash; use Symfony\Component\HttpFoundation\Session\SessionBagInterface; /** * FlashBagInterface. * * @author Drak */ interface FlashBagInterface extends SessionBagInterface { /** * Adds a flash message for the given type. * * @return void */ public function add(string $type, mixed $message); /** * Registers one or more messages for a given type. * * @return void */ public function set(string $type, string|array $messages); /** * Gets flash messages for a given type. * * @param string $type Message category type * @param array $default Default value if $type does not exist */ public function peek(string $type, array $default = []): array; /** * Gets all flash messages. */ public function peekAll(): array; /** * Gets and clears flash from the stack. * * @param array $default Default value if $type does not exist */ public function get(string $type, array $default = []): array; /** * Gets and clears flashes from the stack. */ public function all(): array; /** * Sets all flash messages. * * @return void */ public function setAll(array $messages); /** * Has flash messages for a given type? */ public function has(string $type): bool; /** * Returns a list of all defined types. */ public function keys(): array; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session; use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; /** * Interface for session with a flashbag. */ interface FlashBagAwareSessionInterface extends SessionInterface { public function getFlashBag(): FlashBagInterface; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Session.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session; use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface; use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface; // Help opcache.preload discover always-needed symbols class_exists(AttributeBag::class); class_exists(FlashBag::class); class_exists(SessionBagProxy::class); /** * @author Fabien Potencier * @author Drak * * @implements \IteratorAggregate */ class Session implements FlashBagAwareSessionInterface, \IteratorAggregate, \Countable { protected $storage; private string $flashName; private string $attributeName; private array $data = []; private int $usageIndex = 0; private ?\Closure $usageReporter; public function __construct(?SessionStorageInterface $storage = null, ?AttributeBagInterface $attributes = null, ?FlashBagInterface $flashes = null, ?callable $usageReporter = null) { $this->storage = $storage ?? new NativeSessionStorage(); $this->usageReporter = null === $usageReporter ? null : $usageReporter(...); $attributes ??= new AttributeBag(); $this->attributeName = $attributes->getName(); $this->registerBag($attributes); $flashes ??= new FlashBag(); $this->flashName = $flashes->getName(); $this->registerBag($flashes); } public function start(): bool { return $this->storage->start(); } public function has(string $name): bool { return $this->getAttributeBag()->has($name); } public function get(string $name, mixed $default = null): mixed { return $this->getAttributeBag()->get($name, $default); } /** * @return void */ public function set(string $name, mixed $value) { $this->getAttributeBag()->set($name, $value); } public function all(): array { return $this->getAttributeBag()->all(); } /** * @return void */ public function replace(array $attributes) { $this->getAttributeBag()->replace($attributes); } public function remove(string $name): mixed { return $this->getAttributeBag()->remove($name); } /** * @return void */ public function clear() { $this->getAttributeBag()->clear(); } public function isStarted(): bool { return $this->storage->isStarted(); } /** * Returns an iterator for attributes. * * @return \ArrayIterator */ public function getIterator(): \ArrayIterator { return new \ArrayIterator($this->getAttributeBag()->all()); } /** * Returns the number of attributes. */ public function count(): int { return \count($this->getAttributeBag()->all()); } public function &getUsageIndex(): int { return $this->usageIndex; } /** * @internal */ public function isEmpty(): bool { if ($this->isStarted()) { ++$this->usageIndex; if ($this->usageReporter && 0 <= $this->usageIndex) { ($this->usageReporter)(); } } foreach ($this->data as &$data) { if (!empty($data)) { return false; } } return true; } public function invalidate(?int $lifetime = null): bool { $this->storage->clear(); return $this->migrate(true, $lifetime); } public function migrate(bool $destroy = false, ?int $lifetime = null): bool { return $this->storage->regenerate($destroy, $lifetime); } /** * @return void */ public function save() { $this->storage->save(); } public function getId(): string { return $this->storage->getId(); } /** * @return void */ public function setId(string $id) { if ($this->storage->getId() !== $id) { $this->storage->setId($id); } } public function getName(): string { return $this->storage->getName(); } /** * @return void */ public function setName(string $name) { $this->storage->setName($name); } public function getMetadataBag(): MetadataBag { ++$this->usageIndex; if ($this->usageReporter && 0 <= $this->usageIndex) { ($this->usageReporter)(); } return $this->storage->getMetadataBag(); } /** * @return void */ public function registerBag(SessionBagInterface $bag) { $this->storage->registerBag(new SessionBagProxy($bag, $this->data, $this->usageIndex, $this->usageReporter)); } public function getBag(string $name): SessionBagInterface { $bag = $this->storage->getBag($name); return method_exists($bag, 'getBag') ? $bag->getBag() : $bag; } /** * Gets the flashbag interface. */ public function getFlashBag(): FlashBagInterface { return $this->getBag($this->flashName); } /** * Gets the attributebag interface. * * Note that this method was added to help with IDE autocompletion. */ private function getAttributeBag(): AttributeBagInterface { return $this->getBag($this->attributeName); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionBagInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session; /** * Session Bag store. * * @author Drak */ interface SessionBagInterface { /** * Gets this bag's name. */ public function getName(): string; /** * Initializes the Bag. * * @return void */ public function initialize(array &$array); /** * Gets the storage key for this bag. */ public function getStorageKey(): string; /** * Clears out data from bag. * * @return mixed Whatever data was contained */ public function clear(): mixed; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionBagProxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session; /** * @author Nicolas Grekas * * @internal */ final class SessionBagProxy implements SessionBagInterface { private SessionBagInterface $bag; private array $data; private ?int $usageIndex; private ?\Closure $usageReporter; public function __construct(SessionBagInterface $bag, array &$data, ?int &$usageIndex, ?callable $usageReporter) { $this->bag = $bag; $this->data = &$data; $this->usageIndex = &$usageIndex; $this->usageReporter = null === $usageReporter ? null : $usageReporter(...); } public function getBag(): SessionBagInterface { ++$this->usageIndex; if ($this->usageReporter && 0 <= $this->usageIndex) { ($this->usageReporter)(); } return $this->bag; } public function isEmpty(): bool { if (!isset($this->data[$this->bag->getStorageKey()])) { return true; } ++$this->usageIndex; if ($this->usageReporter && 0 <= $this->usageIndex) { ($this->usageReporter)(); } return empty($this->data[$this->bag->getStorageKey()]); } public function getName(): string { return $this->bag->getName(); } public function initialize(array &$array): void { ++$this->usageIndex; if ($this->usageReporter && 0 <= $this->usageIndex) { ($this->usageReporter)(); } $this->data[$this->bag->getStorageKey()] = &$array; $this->bag->initialize($array); } public function getStorageKey(): string { return $this->bag->getStorageKey(); } public function clear(): mixed { return $this->bag->clear(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionFactory.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageFactoryInterface; // Help opcache.preload discover always-needed symbols class_exists(Session::class); /** * @author Jérémy Derussé */ class SessionFactory implements SessionFactoryInterface { private RequestStack $requestStack; private SessionStorageFactoryInterface $storageFactory; private ?\Closure $usageReporter; public function __construct(RequestStack $requestStack, SessionStorageFactoryInterface $storageFactory, ?callable $usageReporter = null) { $this->requestStack = $requestStack; $this->storageFactory = $storageFactory; $this->usageReporter = null === $usageReporter ? null : $usageReporter(...); } public function createSession(): SessionInterface { return new Session($this->storageFactory->createStorage($this->requestStack->getMainRequest()), null, null, $this->usageReporter); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionFactoryInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session; /** * @author Kevin Bond */ interface SessionFactoryInterface { public function createSession(): SessionInterface; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session; use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; /** * Interface for the session. * * @author Drak */ interface SessionInterface { /** * Starts the session storage. * * @throws \RuntimeException if session fails to start */ public function start(): bool; /** * Returns the session ID. */ public function getId(): string; /** * Sets the session ID. * * @return void */ public function setId(string $id); /** * Returns the session name. */ public function getName(): string; /** * Sets the session name. * * @return void */ public function setName(string $name); /** * Invalidates the current session. * * Clears all session attributes and flashes and regenerates the * session and deletes the old session from persistence. * * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value * will leave the system settings unchanged, 0 sets the cookie * to expire with browser session. Time is in seconds, and is * not a Unix timestamp. */ public function invalidate(?int $lifetime = null): bool; /** * Migrates the current session to a new session id while maintaining all * session attributes. * * @param bool $destroy Whether to delete the old session or leave it to garbage collection * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value * will leave the system settings unchanged, 0 sets the cookie * to expire with browser session. Time is in seconds, and is * not a Unix timestamp. */ public function migrate(bool $destroy = false, ?int $lifetime = null): bool; /** * Force the session to be saved and closed. * * This method is generally not required for real sessions as * the session will be automatically saved at the end of * code execution. * * @return void */ public function save(); /** * Checks if an attribute is defined. */ public function has(string $name): bool; /** * Returns an attribute. */ public function get(string $name, mixed $default = null): mixed; /** * Sets an attribute. * * @return void */ public function set(string $name, mixed $value); /** * Returns attributes. */ public function all(): array; /** * Sets attributes. * * @return void */ public function replace(array $attributes); /** * Removes an attribute. * * @return mixed The removed value or null when it does not exist */ public function remove(string $name): mixed; /** * Clears all attributes. * * @return void */ public function clear(); /** * Checks if the session was started. */ public function isStarted(): bool; /** * Registers a SessionBagInterface with the session. * * @return void */ public function registerBag(SessionBagInterface $bag); /** * Gets a bag instance by name. */ public function getBag(string $name): SessionBagInterface; /** * Gets session meta. */ public function getMetadataBag(): MetadataBag; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/SessionUtils.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session; /** * Session utility functions. * * @author Nicolas Grekas * @author Rémon van de Kamp * * @internal */ final class SessionUtils { /** * Finds the session header amongst the headers that are to be sent, removes it, and returns * it so the caller can process it further. */ public static function popSessionCookie(string $sessionName, #[\SensitiveParameter] string $sessionId): ?string { $sessionCookie = null; $sessionCookiePrefix = sprintf(' %s=', urlencode($sessionName)); $sessionCookieWithId = sprintf('%s%s;', $sessionCookiePrefix, urlencode($sessionId)); $otherCookies = []; foreach (headers_list() as $h) { if (0 !== stripos($h, 'Set-Cookie:')) { continue; } if (11 === strpos($h, $sessionCookiePrefix, 11)) { $sessionCookie = $h; if (11 !== strpos($h, $sessionCookieWithId, 11)) { $otherCookies[] = $h; } } else { $otherCookies[] = $h; } } if (null === $sessionCookie) { return null; } header_remove('Set-Cookie'); foreach ($otherCookies as $h) { header($h, false); } return $sessionCookie; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; use Symfony\Component\HttpFoundation\Session\SessionUtils; /** * This abstract session handler provides a generic implementation * of the PHP 7.0 SessionUpdateTimestampHandlerInterface, * enabling strict and lazy session handling. * * @author Nicolas Grekas */ abstract class AbstractSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface { private string $sessionName; private string $prefetchId; private string $prefetchData; private ?string $newSessionId = null; private string $igbinaryEmptyData; public function open(string $savePath, string $sessionName): bool { $this->sessionName = $sessionName; if (!headers_sent() && !\ini_get('session.cache_limiter') && '0' !== \ini_get('session.cache_limiter')) { header(sprintf('Cache-Control: max-age=%d, private, must-revalidate', 60 * (int) \ini_get('session.cache_expire'))); } return true; } abstract protected function doRead(#[\SensitiveParameter] string $sessionId): string; abstract protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool; abstract protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool; public function validateId(#[\SensitiveParameter] string $sessionId): bool { $this->prefetchData = $this->read($sessionId); $this->prefetchId = $sessionId; return '' !== $this->prefetchData; } public function read(#[\SensitiveParameter] string $sessionId): string { if (isset($this->prefetchId)) { $prefetchId = $this->prefetchId; $prefetchData = $this->prefetchData; unset($this->prefetchId, $this->prefetchData); if ($prefetchId === $sessionId || '' === $prefetchData) { $this->newSessionId = '' === $prefetchData ? $sessionId : null; return $prefetchData; } } $data = $this->doRead($sessionId); $this->newSessionId = '' === $data ? $sessionId : null; return $data; } public function write(#[\SensitiveParameter] string $sessionId, string $data): bool { // see https://github.com/igbinary/igbinary/issues/146 $this->igbinaryEmptyData ??= \function_exists('igbinary_serialize') ? igbinary_serialize([]) : ''; if ('' === $data || $this->igbinaryEmptyData === $data) { return $this->destroy($sessionId); } $this->newSessionId = null; return $this->doWrite($sessionId, $data); } public function destroy(#[\SensitiveParameter] string $sessionId): bool { if (!headers_sent() && filter_var(\ini_get('session.use_cookies'), \FILTER_VALIDATE_BOOL)) { if (!isset($this->sessionName)) { throw new \LogicException(sprintf('Session name cannot be empty, did you forget to call "parent::open()" in "%s"?.', static::class)); } $cookie = SessionUtils::popSessionCookie($this->sessionName, $sessionId); /* * We send an invalidation Set-Cookie header (zero lifetime) * when either the session was started or a cookie with * the session name was sent by the client (in which case * we know it's invalid as a valid session cookie would've * started the session). */ if (null === $cookie || isset($_COOKIE[$this->sessionName])) { $params = session_get_cookie_params(); unset($params['lifetime']); setcookie($this->sessionName, '', $params); } } return $this->newSessionId === $sessionId || $this->doDestroy($sessionId); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; use Symfony\Component\Cache\Marshaller\MarshallerInterface; /** * @author Ahmed TAILOULOUTE */ class IdentityMarshaller implements MarshallerInterface { public function marshall(array $values, ?array &$failed): array { foreach ($values as $key => $value) { if (!\is_string($value)) { throw new \LogicException(sprintf('%s accepts only string as data.', __METHOD__)); } } return $values; } public function unmarshall(string $value): string { return $value; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; use Symfony\Component\Cache\Marshaller\MarshallerInterface; /** * @author Ahmed TAILOULOUTE */ class MarshallingSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface { private AbstractSessionHandler $handler; private MarshallerInterface $marshaller; public function __construct(AbstractSessionHandler $handler, MarshallerInterface $marshaller) { $this->handler = $handler; $this->marshaller = $marshaller; } public function open(string $savePath, string $name): bool { return $this->handler->open($savePath, $name); } public function close(): bool { return $this->handler->close(); } public function destroy(#[\SensitiveParameter] string $sessionId): bool { return $this->handler->destroy($sessionId); } public function gc(int $maxlifetime): int|false { return $this->handler->gc($maxlifetime); } public function read(#[\SensitiveParameter] string $sessionId): string { return $this->marshaller->unmarshall($this->handler->read($sessionId)); } public function write(#[\SensitiveParameter] string $sessionId, string $data): bool { $failed = []; $marshalledData = $this->marshaller->marshall(['data' => $data], $failed); if (isset($failed['data'])) { return false; } return $this->handler->write($sessionId, $marshalledData['data']); } public function validateId(#[\SensitiveParameter] string $sessionId): bool { return $this->handler->validateId($sessionId); } public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool { return $this->handler->updateTimestamp($sessionId, $data); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; /** * Memcached based session storage handler based on the Memcached class * provided by the PHP memcached extension. * * @see https://php.net/memcached * * @author Drak */ class MemcachedSessionHandler extends AbstractSessionHandler { private \Memcached $memcached; /** * Time to live in seconds. */ private int|\Closure|null $ttl; /** * Key prefix for shared environments. */ private string $prefix; /** * Constructor. * * List of available options: * * prefix: The prefix to use for the memcached keys in order to avoid collision * * ttl: The time to live in seconds. * * @throws \InvalidArgumentException When unsupported options are passed */ public function __construct(\Memcached $memcached, array $options = []) { $this->memcached = $memcached; if ($diff = array_diff(array_keys($options), ['prefix', 'expiretime', 'ttl'])) { throw new \InvalidArgumentException(sprintf('The following options are not supported "%s".', implode(', ', $diff))); } $this->ttl = $options['expiretime'] ?? $options['ttl'] ?? null; $this->prefix = $options['prefix'] ?? 'sf2s'; } public function close(): bool { return $this->memcached->quit(); } protected function doRead(#[\SensitiveParameter] string $sessionId): string { return $this->memcached->get($this->prefix.$sessionId) ?: ''; } public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool { $this->memcached->touch($this->prefix.$sessionId, $this->getCompatibleTtl()); return true; } protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool { return $this->memcached->set($this->prefix.$sessionId, $data, $this->getCompatibleTtl()); } private function getCompatibleTtl(): int { $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); // If the relative TTL that is used exceeds 30 days, memcached will treat the value as Unix time. // We have to convert it to an absolute Unix time at this point, to make sure the TTL is correct. if ($ttl > 60 * 60 * 24 * 30) { $ttl += time(); } return $ttl; } protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool { $result = $this->memcached->delete($this->prefix.$sessionId); return $result || \Memcached::RES_NOTFOUND == $this->memcached->getResultCode(); } public function gc(int $maxlifetime): int|false { // not required here because memcached will auto expire the records anyhow. return 0; } /** * Return a Memcached instance. */ protected function getMemcached(): \Memcached { return $this->memcached; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; /** * Migrating session handler for migrating from one handler to another. It reads * from the current handler and writes both the current and new ones. * * It ignores errors from the new handler. * * @author Ross Motley * @author Oliver Radwell */ class MigratingSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface { private \SessionHandlerInterface&\SessionUpdateTimestampHandlerInterface $currentHandler; private \SessionHandlerInterface&\SessionUpdateTimestampHandlerInterface $writeOnlyHandler; public function __construct(\SessionHandlerInterface $currentHandler, \SessionHandlerInterface $writeOnlyHandler) { if (!$currentHandler instanceof \SessionUpdateTimestampHandlerInterface) { $currentHandler = new StrictSessionHandler($currentHandler); } if (!$writeOnlyHandler instanceof \SessionUpdateTimestampHandlerInterface) { $writeOnlyHandler = new StrictSessionHandler($writeOnlyHandler); } $this->currentHandler = $currentHandler; $this->writeOnlyHandler = $writeOnlyHandler; } public function close(): bool { $result = $this->currentHandler->close(); $this->writeOnlyHandler->close(); return $result; } public function destroy(#[\SensitiveParameter] string $sessionId): bool { $result = $this->currentHandler->destroy($sessionId); $this->writeOnlyHandler->destroy($sessionId); return $result; } public function gc(int $maxlifetime): int|false { $result = $this->currentHandler->gc($maxlifetime); $this->writeOnlyHandler->gc($maxlifetime); return $result; } public function open(string $savePath, string $sessionName): bool { $result = $this->currentHandler->open($savePath, $sessionName); $this->writeOnlyHandler->open($savePath, $sessionName); return $result; } public function read(#[\SensitiveParameter] string $sessionId): string { // No reading from new handler until switch-over return $this->currentHandler->read($sessionId); } public function write(#[\SensitiveParameter] string $sessionId, string $sessionData): bool { $result = $this->currentHandler->write($sessionId, $sessionData); $this->writeOnlyHandler->write($sessionId, $sessionData); return $result; } public function validateId(#[\SensitiveParameter] string $sessionId): bool { // No reading from new handler until switch-over return $this->currentHandler->validateId($sessionId); } public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $sessionData): bool { $result = $this->currentHandler->updateTimestamp($sessionId, $sessionData); $this->writeOnlyHandler->updateTimestamp($sessionId, $sessionData); return $result; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; use MongoDB\BSON\Binary; use MongoDB\BSON\UTCDateTime; use MongoDB\Client; use MongoDB\Driver\BulkWrite; use MongoDB\Driver\Manager; use MongoDB\Driver\Query; /** * Session handler using the MongoDB driver extension. * * @author Markus Bachmann * @author Jérôme Tamarelle * * @see https://php.net/mongodb */ class MongoDbSessionHandler extends AbstractSessionHandler { private Manager $manager; private string $namespace; private array $options; private int|\Closure|null $ttl; /** * Constructor. * * List of available options: * * database: The name of the database [required] * * collection: The name of the collection [required] * * id_field: The field name for storing the session id [default: _id] * * data_field: The field name for storing the session data [default: data] * * time_field: The field name for storing the timestamp [default: time] * * expiry_field: The field name for storing the expiry-timestamp [default: expires_at] * * ttl: The time to live in seconds. * * It is strongly recommended to put an index on the `expiry_field` for * garbage-collection. Alternatively it's possible to automatically expire * the sessions in the database as described below: * * A TTL collections can be used on MongoDB 2.2+ to cleanup expired sessions * automatically. Such an index can for example look like this: * * db..createIndex( * { "": 1 }, * { "expireAfterSeconds": 0 } * ) * * More details on: https://docs.mongodb.org/manual/tutorial/expire-data/ * * If you use such an index, you can drop `gc_probability` to 0 since * no garbage-collection is required. * * @throws \InvalidArgumentException When "database" or "collection" not provided */ public function __construct(Client|Manager $mongo, array $options) { if (!isset($options['database']) || !isset($options['collection'])) { throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler.'); } if ($mongo instanceof Client) { $mongo = $mongo->getManager(); } $this->manager = $mongo; $this->namespace = $options['database'].'.'.$options['collection']; $this->options = array_merge([ 'id_field' => '_id', 'data_field' => 'data', 'time_field' => 'time', 'expiry_field' => 'expires_at', ], $options); $this->ttl = $this->options['ttl'] ?? null; } public function close(): bool { return true; } protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool { $write = new BulkWrite(); $write->delete( [$this->options['id_field'] => $sessionId], ['limit' => 1] ); $this->manager->executeBulkWrite($this->namespace, $write); return true; } public function gc(int $maxlifetime): int|false { $write = new BulkWrite(); $write->delete( [$this->options['expiry_field'] => ['$lt' => $this->getUTCDateTime()]], ); $result = $this->manager->executeBulkWrite($this->namespace, $write); return $result->getDeletedCount() ?? false; } protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool { $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); $expiry = $this->getUTCDateTime($ttl); $fields = [ $this->options['time_field'] => $this->getUTCDateTime(), $this->options['expiry_field'] => $expiry, $this->options['data_field'] => new Binary($data, Binary::TYPE_GENERIC), ]; $write = new BulkWrite(); $write->update( [$this->options['id_field'] => $sessionId], ['$set' => $fields], ['upsert' => true] ); $this->manager->executeBulkWrite($this->namespace, $write); return true; } public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool { $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); $expiry = $this->getUTCDateTime($ttl); $write = new BulkWrite(); $write->update( [$this->options['id_field'] => $sessionId], ['$set' => [ $this->options['time_field'] => $this->getUTCDateTime(), $this->options['expiry_field'] => $expiry, ]], ['multi' => false], ); $this->manager->executeBulkWrite($this->namespace, $write); return true; } protected function doRead(#[\SensitiveParameter] string $sessionId): string { $cursor = $this->manager->executeQuery($this->namespace, new Query([ $this->options['id_field'] => $sessionId, $this->options['expiry_field'] => ['$gte' => $this->getUTCDateTime()], ], [ 'projection' => [ '_id' => false, $this->options['data_field'] => true, ], 'limit' => 1, ])); foreach ($cursor as $document) { return (string) $document->{$this->options['data_field']} ?? ''; } // Not found return ''; } private function getUTCDateTime(int $additionalSeconds = 0): UTCDateTime { return new UTCDateTime((time() + $additionalSeconds) * 1000); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; /** * Native session handler using PHP's built in file storage. * * @author Drak */ class NativeFileSessionHandler extends \SessionHandler { /** * @param string|null $savePath Path of directory to save session files * Default null will leave setting as defined by PHP. * '/path', 'N;/path', or 'N;octal-mode;/path * * @see https://php.net/session.configuration#ini.session.save-path for further details. * * @throws \InvalidArgumentException On invalid $savePath * @throws \RuntimeException When failing to create the save directory */ public function __construct(?string $savePath = null) { $baseDir = $savePath ??= \ini_get('session.save_path'); if ($count = substr_count($savePath, ';')) { if ($count > 2) { throw new \InvalidArgumentException(sprintf('Invalid argument $savePath \'%s\'.', $savePath)); } // characters after last ';' are the path $baseDir = ltrim(strrchr($savePath, ';'), ';'); } if ($baseDir && !is_dir($baseDir) && !@mkdir($baseDir, 0777, true) && !is_dir($baseDir)) { throw new \RuntimeException(sprintf('Session Storage was not able to create directory "%s".', $baseDir)); } if ($savePath !== \ini_get('session.save_path')) { ini_set('session.save_path', $savePath); } if ('files' !== \ini_get('session.save_handler')) { ini_set('session.save_handler', 'files'); } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; /** * Can be used in unit testing or in a situations where persisted sessions are not desired. * * @author Drak */ class NullSessionHandler extends AbstractSessionHandler { public function close(): bool { return true; } public function validateId(#[\SensitiveParameter] string $sessionId): bool { return true; } protected function doRead(#[\SensitiveParameter] string $sessionId): string { return ''; } public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool { return true; } protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool { return true; } protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool { return true; } public function gc(int $maxlifetime): int|false { return 0; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Types\Types; /** * Session handler using a PDO connection to read and write data. * * It works with MySQL, PostgreSQL, Oracle, SQL Server and SQLite and implements * different locking strategies to handle concurrent access to the same session. * Locking is necessary to prevent loss of data due to race conditions and to keep * the session data consistent between read() and write(). With locking, requests * for the same session will wait until the other one finished writing. For this * reason it's best practice to close a session as early as possible to improve * concurrency. PHPs internal files session handler also implements locking. * * Attention: Since SQLite does not support row level locks but locks the whole database, * it means only one session can be accessed at a time. Even different sessions would wait * for another to finish. So saving session in SQLite should only be considered for * development or prototypes. * * Session data is a binary string that can contain non-printable characters like the null byte. * For this reason it must be saved in a binary column in the database like BLOB in MySQL. * Saving it in a character column could corrupt the data. You can use createTable() * to initialize a correctly defined table. * * @see https://php.net/sessionhandlerinterface * * @author Fabien Potencier * @author Michael Williams * @author Tobias Schultze */ class PdoSessionHandler extends AbstractSessionHandler { /** * No locking is done. This means sessions are prone to loss of data due to * race conditions of concurrent requests to the same session. The last session * write will win in this case. It might be useful when you implement your own * logic to deal with this like an optimistic approach. */ public const LOCK_NONE = 0; /** * Creates an application-level lock on a session. The disadvantage is that the * lock is not enforced by the database and thus other, unaware parts of the * application could still concurrently modify the session. The advantage is it * does not require a transaction. * This mode is not available for SQLite and not yet implemented for oci and sqlsrv. */ public const LOCK_ADVISORY = 1; /** * Issues a real row lock. Since it uses a transaction between opening and * closing a session, you have to be careful when you use same database connection * that you also use for your application logic. This mode is the default because * it's the only reliable solution across DBMSs. */ public const LOCK_TRANSACTIONAL = 2; private \PDO $pdo; /** * DSN string or null for session.save_path or false when lazy connection disabled. */ private string|false|null $dsn = false; private string $driver; private string $table = 'sessions'; private string $idCol = 'sess_id'; private string $dataCol = 'sess_data'; private string $lifetimeCol = 'sess_lifetime'; private string $timeCol = 'sess_time'; /** * Time to live in seconds. */ private int|\Closure|null $ttl; /** * Username when lazy-connect. */ private ?string $username = null; /** * Password when lazy-connect. */ private ?string $password = null; /** * Connection options when lazy-connect. */ private array $connectionOptions = []; /** * The strategy for locking, see constants. */ private int $lockMode = self::LOCK_TRANSACTIONAL; /** * It's an array to support multiple reads before closing which is manual, non-standard usage. * * @var \PDOStatement[] An array of statements to release advisory locks */ private array $unlockStatements = []; /** * True when the current session exists but expired according to session.gc_maxlifetime. */ private bool $sessionExpired = false; /** * Whether a transaction is active. */ private bool $inTransaction = false; /** * Whether gc() has been called. */ private bool $gcCalled = false; /** * You can either pass an existing database connection as PDO instance or * pass a DSN string that will be used to lazy-connect to the database * when the session is actually used. Furthermore it's possible to pass null * which will then use the session.save_path ini setting as PDO DSN parameter. * * List of available options: * * db_table: The name of the table [default: sessions] * * db_id_col: The column where to store the session id [default: sess_id] * * db_data_col: The column where to store the session data [default: sess_data] * * db_lifetime_col: The column where to store the lifetime [default: sess_lifetime] * * db_time_col: The column where to store the timestamp [default: sess_time] * * db_username: The username when lazy-connect [default: ''] * * db_password: The password when lazy-connect [default: ''] * * db_connection_options: An array of driver-specific connection options [default: []] * * lock_mode: The strategy for locking, see constants [default: LOCK_TRANSACTIONAL] * * ttl: The time to live in seconds. * * @param \PDO|string|null $pdoOrDsn A \PDO instance or DSN string or URL string or null * * @throws \InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION */ public function __construct(#[\SensitiveParameter] \PDO|string|null $pdoOrDsn = null, #[\SensitiveParameter] array $options = []) { if ($pdoOrDsn instanceof \PDO) { if (\PDO::ERRMODE_EXCEPTION !== $pdoOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) { throw new \InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)).', __CLASS__)); } $this->pdo = $pdoOrDsn; $this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME); } elseif (\is_string($pdoOrDsn) && str_contains($pdoOrDsn, '://')) { $this->dsn = $this->buildDsnFromUrl($pdoOrDsn); } else { $this->dsn = $pdoOrDsn; } $this->table = $options['db_table'] ?? $this->table; $this->idCol = $options['db_id_col'] ?? $this->idCol; $this->dataCol = $options['db_data_col'] ?? $this->dataCol; $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol; $this->timeCol = $options['db_time_col'] ?? $this->timeCol; $this->username = $options['db_username'] ?? $this->username; $this->password = $options['db_password'] ?? $this->password; $this->connectionOptions = $options['db_connection_options'] ?? $this->connectionOptions; $this->lockMode = $options['lock_mode'] ?? $this->lockMode; $this->ttl = $options['ttl'] ?? null; } /** * Adds the Table to the Schema if it doesn't exist. */ public function configureSchema(Schema $schema, ?\Closure $isSameDatabase = null): void { if ($schema->hasTable($this->table) || ($isSameDatabase && !$isSameDatabase($this->getConnection()->exec(...)))) { return; } $table = $schema->createTable($this->table); switch ($this->driver) { case 'mysql': $table->addColumn($this->idCol, Types::BINARY)->setLength(128)->setNotnull(true); $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true); $table->addColumn($this->lifetimeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true); $table->addColumn($this->timeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true); $table->addOption('collate', 'utf8mb4_bin'); $table->addOption('engine', 'InnoDB'); break; case 'sqlite': $table->addColumn($this->idCol, Types::TEXT)->setNotnull(true); $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true); $table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true); $table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true); break; case 'pgsql': $table->addColumn($this->idCol, Types::STRING)->setLength(128)->setNotnull(true); $table->addColumn($this->dataCol, Types::BINARY)->setNotnull(true); $table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true); $table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true); break; case 'oci': $table->addColumn($this->idCol, Types::STRING)->setLength(128)->setNotnull(true); $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true); $table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true); $table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true); break; case 'sqlsrv': $table->addColumn($this->idCol, Types::TEXT)->setLength(128)->setNotnull(true); $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true); $table->addColumn($this->lifetimeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true); $table->addColumn($this->timeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true); break; default: throw new \DomainException(sprintf('Creating the session table is currently not implemented for PDO driver "%s".', $this->driver)); } $table->setPrimaryKey([$this->idCol]); $table->addIndex([$this->lifetimeCol], $this->lifetimeCol.'_idx'); } /** * Creates the table to store sessions which can be called once for setup. * * Session ID is saved in a column of maximum length 128 because that is enough even * for a 512 bit configured session.hash_function like Whirlpool. Session data is * saved in a BLOB. One could also use a shorter inlined varbinary column * if one was sure the data fits into it. * * @return void * * @throws \PDOException When the table already exists * @throws \DomainException When an unsupported PDO driver is used */ public function createTable() { // connect if we are not yet $this->getConnection(); $sql = match ($this->driver) { // We use varbinary for the ID column because it prevents unwanted conversions: // - character set conversions between server and client // - trailing space removal // - case-insensitivity // - language processing like é == e 'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED NOT NULL, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB", 'sqlite' => "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", 'pgsql' => "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", 'oci' => "CREATE TABLE $this->table ($this->idCol VARCHAR2(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", 'sqlsrv' => "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", default => throw new \DomainException(sprintf('Creating the session table is currently not implemented for PDO driver "%s".', $this->driver)), }; try { $this->pdo->exec($sql); $this->pdo->exec("CREATE INDEX {$this->lifetimeCol}_idx ON $this->table ($this->lifetimeCol)"); } catch (\PDOException $e) { $this->rollback(); throw $e; } } /** * Returns true when the current session exists but expired according to session.gc_maxlifetime. * * Can be used to distinguish between a new session and one that expired due to inactivity. */ public function isSessionExpired(): bool { return $this->sessionExpired; } public function open(string $savePath, string $sessionName): bool { $this->sessionExpired = false; if (!isset($this->pdo)) { $this->connect($this->dsn ?: $savePath); } return parent::open($savePath, $sessionName); } public function read(#[\SensitiveParameter] string $sessionId): string { try { return parent::read($sessionId); } catch (\PDOException $e) { $this->rollback(); throw $e; } } public function gc(int $maxlifetime): int|false { // We delay gc() to close() so that it is executed outside the transactional and blocking read-write process. // This way, pruning expired sessions does not block them from being started while the current session is used. $this->gcCalled = true; return 0; } protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool { // delete the record associated with this id $sql = "DELETE FROM $this->table WHERE $this->idCol = :id"; try { $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); $stmt->execute(); } catch (\PDOException $e) { $this->rollback(); throw $e; } return true; } protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool { $maxlifetime = (int) (($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime')); try { // We use a single MERGE SQL query when supported by the database. $mergeStmt = $this->getMergeStatement($sessionId, $data, $maxlifetime); if (null !== $mergeStmt) { $mergeStmt->execute(); return true; } $updateStmt = $this->getUpdateStatement($sessionId, $data, $maxlifetime); $updateStmt->execute(); // When MERGE is not supported, like in Postgres < 9.5, we have to use this approach that can result in // duplicate key errors when the same session is written simultaneously (given the LOCK_NONE behavior). // We can just catch such an error and re-execute the update. This is similar to a serializable // transaction with retry logic on serialization failures but without the overhead and without possible // false positives due to longer gap locking. if (!$updateStmt->rowCount()) { try { $insertStmt = $this->getInsertStatement($sessionId, $data, $maxlifetime); $insertStmt->execute(); } catch (\PDOException $e) { // Handle integrity violation SQLSTATE 23000 (or a subclass like 23505 in Postgres) for duplicate keys if (str_starts_with($e->getCode(), '23')) { $updateStmt->execute(); } else { throw $e; } } } } catch (\PDOException $e) { $this->rollback(); throw $e; } return true; } public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool { $expiry = time() + (int) (($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime')); try { $updateStmt = $this->pdo->prepare( "UPDATE $this->table SET $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id" ); $updateStmt->bindValue(':id', $sessionId, \PDO::PARAM_STR); $updateStmt->bindValue(':expiry', $expiry, \PDO::PARAM_INT); $updateStmt->bindValue(':time', time(), \PDO::PARAM_INT); $updateStmt->execute(); } catch (\PDOException $e) { $this->rollback(); throw $e; } return true; } public function close(): bool { $this->commit(); while ($unlockStmt = array_shift($this->unlockStatements)) { $unlockStmt->execute(); } if ($this->gcCalled) { $this->gcCalled = false; // delete the session records that have expired $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol < :time"; $stmt = $this->pdo->prepare($sql); $stmt->bindValue(':time', time(), \PDO::PARAM_INT); $stmt->execute(); } if (false !== $this->dsn) { unset($this->pdo, $this->driver); // only close lazy-connection } return true; } /** * Lazy-connects to the database. */ private function connect(#[\SensitiveParameter] string $dsn): void { $this->pdo = new \PDO($dsn, $this->username, $this->password, $this->connectionOptions); $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME); } /** * Builds a PDO DSN from a URL-like connection string. * * @todo implement missing support for oci DSN (which look totally different from other PDO ones) */ private function buildDsnFromUrl(#[\SensitiveParameter] string $dsnOrUrl): string { // (pdo_)?sqlite3?:///... => (pdo_)?sqlite3?://localhost/... or else the URL will be invalid $url = preg_replace('#^((?:pdo_)?sqlite3?):///#', '$1://localhost/', $dsnOrUrl); $params = parse_url($url); if (false === $params) { return $dsnOrUrl; // If the URL is not valid, let's assume it might be a DSN already. } $params = array_map('rawurldecode', $params); // Override the default username and password. Values passed through options will still win over these in the constructor. if (isset($params['user'])) { $this->username = $params['user']; } if (isset($params['pass'])) { $this->password = $params['pass']; } if (!isset($params['scheme'])) { throw new \InvalidArgumentException('URLs without scheme are not supported to configure the PdoSessionHandler.'); } $driverAliasMap = [ 'mssql' => 'sqlsrv', 'mysql2' => 'mysql', // Amazon RDS, for some weird reason 'postgres' => 'pgsql', 'postgresql' => 'pgsql', 'sqlite3' => 'sqlite', ]; $driver = $driverAliasMap[$params['scheme']] ?? $params['scheme']; // Doctrine DBAL supports passing its internal pdo_* driver names directly too (allowing both dashes and underscores). This allows supporting the same here. if (str_starts_with($driver, 'pdo_') || str_starts_with($driver, 'pdo-')) { $driver = substr($driver, 4); } $dsn = null; switch ($driver) { case 'mysql': $dsn = 'mysql:'; if ('' !== ($params['query'] ?? '')) { $queryParams = []; parse_str($params['query'], $queryParams); if ('' !== ($queryParams['charset'] ?? '')) { $dsn .= 'charset='.$queryParams['charset'].';'; } if ('' !== ($queryParams['unix_socket'] ?? '')) { $dsn .= 'unix_socket='.$queryParams['unix_socket'].';'; if (isset($params['path'])) { $dbName = substr($params['path'], 1); // Remove the leading slash $dsn .= 'dbname='.$dbName.';'; } return $dsn; } } // If "unix_socket" is not in the query, we continue with the same process as pgsql // no break case 'pgsql': $dsn ??= 'pgsql:'; if (isset($params['host']) && '' !== $params['host']) { $dsn .= 'host='.$params['host'].';'; } if (isset($params['port']) && '' !== $params['port']) { $dsn .= 'port='.$params['port'].';'; } if (isset($params['path'])) { $dbName = substr($params['path'], 1); // Remove the leading slash $dsn .= 'dbname='.$dbName.';'; } return $dsn; case 'sqlite': return 'sqlite:'.substr($params['path'], 1); case 'sqlsrv': $dsn = 'sqlsrv:server='; if (isset($params['host'])) { $dsn .= $params['host']; } if (isset($params['port']) && '' !== $params['port']) { $dsn .= ','.$params['port']; } if (isset($params['path'])) { $dbName = substr($params['path'], 1); // Remove the leading slash $dsn .= ';Database='.$dbName; } return $dsn; default: throw new \InvalidArgumentException(sprintf('The scheme "%s" is not supported by the PdoSessionHandler URL configuration. Pass a PDO DSN directly.', $params['scheme'])); } } /** * Helper method to begin a transaction. * * Since SQLite does not support row level locks, we have to acquire a reserved lock * on the database immediately. Because of https://bugs.php.net/42766 we have to create * such a transaction manually which also means we cannot use PDO::commit or * PDO::rollback or PDO::inTransaction for SQLite. * * Also MySQLs default isolation, REPEATABLE READ, causes deadlock for different sessions * due to https://percona.com/blog/2013/12/12/one-more-innodb-gap-lock-to-avoid/ . * So we change it to READ COMMITTED. */ private function beginTransaction(): void { if (!$this->inTransaction) { if ('sqlite' === $this->driver) { $this->pdo->exec('BEGIN IMMEDIATE TRANSACTION'); } else { if ('mysql' === $this->driver) { $this->pdo->exec('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); } $this->pdo->beginTransaction(); } $this->inTransaction = true; } } /** * Helper method to commit a transaction. */ private function commit(): void { if ($this->inTransaction) { try { // commit read-write transaction which also releases the lock if ('sqlite' === $this->driver) { $this->pdo->exec('COMMIT'); } else { $this->pdo->commit(); } $this->inTransaction = false; } catch (\PDOException $e) { $this->rollback(); throw $e; } } } /** * Helper method to rollback a transaction. */ private function rollback(): void { // We only need to rollback if we are in a transaction. Otherwise the resulting // error would hide the real problem why rollback was called. We might not be // in a transaction when not using the transactional locking behavior or when // two callbacks (e.g. destroy and write) are invoked that both fail. if ($this->inTransaction) { if ('sqlite' === $this->driver) { $this->pdo->exec('ROLLBACK'); } else { $this->pdo->rollBack(); } $this->inTransaction = false; } } /** * Reads the session data in respect to the different locking strategies. * * We need to make sure we do not return session data that is already considered garbage according * to the session.gc_maxlifetime setting because gc() is called after read() and only sometimes. */ protected function doRead(#[\SensitiveParameter] string $sessionId): string { if (self::LOCK_ADVISORY === $this->lockMode) { $this->unlockStatements[] = $this->doAdvisoryLock($sessionId); } $selectSql = $this->getSelectSql(); $selectStmt = $this->pdo->prepare($selectSql); $selectStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); $insertStmt = null; while (true) { $selectStmt->execute(); $sessionRows = $selectStmt->fetchAll(\PDO::FETCH_NUM); if ($sessionRows) { $expiry = (int) $sessionRows[0][1]; if ($expiry < time()) { $this->sessionExpired = true; return ''; } return \is_resource($sessionRows[0][0]) ? stream_get_contents($sessionRows[0][0]) : $sessionRows[0][0]; } if (null !== $insertStmt) { $this->rollback(); throw new \RuntimeException('Failed to read session: INSERT reported a duplicate id but next SELECT did not return any data.'); } if (!filter_var(\ini_get('session.use_strict_mode'), \FILTER_VALIDATE_BOOL) && self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) { // In strict mode, session fixation is not possible: new sessions always start with a unique // random id, so that concurrency is not possible and this code path can be skipped. // Exclusive-reading of non-existent rows does not block, so we need to do an insert to block // until other connections to the session are committed. try { $insertStmt = $this->getInsertStatement($sessionId, '', 0); $insertStmt->execute(); } catch (\PDOException $e) { // Catch duplicate key error because other connection created the session already. // It would only not be the case when the other connection destroyed the session. if (str_starts_with($e->getCode(), '23')) { // Retrieve finished session data written by concurrent connection by restarting the loop. // We have to start a new transaction as a failed query will mark the current transaction as // aborted in PostgreSQL and disallow further queries within it. $this->rollback(); $this->beginTransaction(); continue; } throw $e; } } return ''; } } /** * Executes an application-level lock on the database. * * @return \PDOStatement The statement that needs to be executed later to release the lock * * @throws \DomainException When an unsupported PDO driver is used * * @todo implement missing advisory locks * - for oci using DBMS_LOCK.REQUEST * - for sqlsrv using sp_getapplock with LockOwner = Session */ private function doAdvisoryLock(#[\SensitiveParameter] string $sessionId): \PDOStatement { switch ($this->driver) { case 'mysql': // MySQL 5.7.5 and later enforces a maximum length on lock names of 64 characters. Previously, no limit was enforced. $lockId = substr($sessionId, 0, 64); // should we handle the return value? 0 on timeout, null on error // we use a timeout of 50 seconds which is also the default for innodb_lock_wait_timeout $stmt = $this->pdo->prepare('SELECT GET_LOCK(:key, 50)'); $stmt->bindValue(':key', $lockId, \PDO::PARAM_STR); $stmt->execute(); $releaseStmt = $this->pdo->prepare('DO RELEASE_LOCK(:key)'); $releaseStmt->bindValue(':key', $lockId, \PDO::PARAM_STR); return $releaseStmt; case 'pgsql': // Obtaining an exclusive session level advisory lock requires an integer key. // When session.sid_bits_per_character > 4, the session id can contain non-hex-characters. // So we cannot just use hexdec(). if (4 === \PHP_INT_SIZE) { $sessionInt1 = $this->convertStringToInt($sessionId); $sessionInt2 = $this->convertStringToInt(substr($sessionId, 4, 4)); $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key1, :key2)'); $stmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT); $stmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT); $stmt->execute(); $releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key1, :key2)'); $releaseStmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT); $releaseStmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT); } else { $sessionBigInt = $this->convertStringToInt($sessionId); $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key)'); $stmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT); $stmt->execute(); $releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key)'); $releaseStmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT); } return $releaseStmt; case 'sqlite': throw new \DomainException('SQLite does not support advisory locks.'); default: throw new \DomainException(sprintf('Advisory locks are currently not implemented for PDO driver "%s".', $this->driver)); } } /** * Encodes the first 4 (when PHP_INT_SIZE == 4) or 8 characters of the string as an integer. * * Keep in mind, PHP integers are signed. */ private function convertStringToInt(string $string): int { if (4 === \PHP_INT_SIZE) { return (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]); } $int1 = (\ord($string[7]) << 24) + (\ord($string[6]) << 16) + (\ord($string[5]) << 8) + \ord($string[4]); $int2 = (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]); return $int2 + ($int1 << 32); } /** * Return a locking or nonlocking SQL query to read session information. * * @throws \DomainException When an unsupported PDO driver is used */ private function getSelectSql(): string { if (self::LOCK_TRANSACTIONAL === $this->lockMode) { $this->beginTransaction(); switch ($this->driver) { case 'mysql': case 'oci': case 'pgsql': return "SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WHERE $this->idCol = :id FOR UPDATE"; case 'sqlsrv': return "SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WITH (UPDLOCK, ROWLOCK) WHERE $this->idCol = :id"; case 'sqlite': // we already locked when starting transaction break; default: throw new \DomainException(sprintf('Transactional locks are currently not implemented for PDO driver "%s".', $this->driver)); } } return "SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WHERE $this->idCol = :id"; } /** * Returns an insert statement supported by the database for writing session data. */ private function getInsertStatement(#[\SensitiveParameter] string $sessionId, string $sessionData, int $maxlifetime): \PDOStatement { switch ($this->driver) { case 'oci': $data = fopen('php://memory', 'r+'); fwrite($data, $sessionData); rewind($data); $sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, EMPTY_BLOB(), :expiry, :time) RETURNING $this->dataCol into :data"; break; default: $data = $sessionData; $sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)"; break; } $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); $stmt->bindParam(':data', $data, \PDO::PARAM_LOB); $stmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT); $stmt->bindValue(':time', time(), \PDO::PARAM_INT); return $stmt; } /** * Returns an update statement supported by the database for writing session data. */ private function getUpdateStatement(#[\SensitiveParameter] string $sessionId, string $sessionData, int $maxlifetime): \PDOStatement { switch ($this->driver) { case 'oci': $data = fopen('php://memory', 'r+'); fwrite($data, $sessionData); rewind($data); $sql = "UPDATE $this->table SET $this->dataCol = EMPTY_BLOB(), $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id RETURNING $this->dataCol into :data"; break; default: $data = $sessionData; $sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id"; break; } $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); $stmt->bindParam(':data', $data, \PDO::PARAM_LOB); $stmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT); $stmt->bindValue(':time', time(), \PDO::PARAM_INT); return $stmt; } /** * Returns a merge/upsert (i.e. insert or update) statement when supported by the database for writing session data. */ private function getMergeStatement(#[\SensitiveParameter] string $sessionId, string $data, int $maxlifetime): ?\PDOStatement { switch (true) { case 'mysql' === $this->driver: $mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time) ". "ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)"; break; case 'sqlsrv' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '10', '>='): // MERGE is only available since SQL Server 2008 and must be terminated by semicolon // It also requires HOLDLOCK according to https://weblogs.sqlteam.com/dang/2009/01/31/upsert-race-condition-with-merge/ $mergeSql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ". "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;"; break; case 'sqlite' === $this->driver: $mergeSql = "INSERT OR REPLACE INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)"; break; case 'pgsql' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '9.5', '>='): $mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time) ". "ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)"; break; default: // MERGE is not supported with LOBs: https://oracle.com/technetwork/articles/fuecks-lobs-095315.html return null; } $mergeStmt = $this->pdo->prepare($mergeSql); if ('sqlsrv' === $this->driver) { $mergeStmt->bindParam(1, $sessionId, \PDO::PARAM_STR); $mergeStmt->bindParam(2, $sessionId, \PDO::PARAM_STR); $mergeStmt->bindParam(3, $data, \PDO::PARAM_LOB); $mergeStmt->bindValue(4, time() + $maxlifetime, \PDO::PARAM_INT); $mergeStmt->bindValue(5, time(), \PDO::PARAM_INT); $mergeStmt->bindParam(6, $data, \PDO::PARAM_LOB); $mergeStmt->bindValue(7, time() + $maxlifetime, \PDO::PARAM_INT); $mergeStmt->bindValue(8, time(), \PDO::PARAM_INT); } else { $mergeStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); $mergeStmt->bindParam(':data', $data, \PDO::PARAM_LOB); $mergeStmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT); $mergeStmt->bindValue(':time', time(), \PDO::PARAM_INT); } return $mergeStmt; } /** * Return a PDO instance. */ protected function getConnection(): \PDO { if (!isset($this->pdo)) { $this->connect($this->dsn ?: \ini_get('session.save_path')); } return $this->pdo; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; use Predis\Response\ErrorInterface; use Relay\Relay; /** * Redis based session storage handler based on the Redis class * provided by the PHP redis extension. * * @author Dalibor Karlović */ class RedisSessionHandler extends AbstractSessionHandler { /** * Key prefix for shared environments. */ private string $prefix; /** * Time to live in seconds. */ private int|\Closure|null $ttl; /** * List of available options: * * prefix: The prefix to use for the keys in order to avoid collision on the Redis server * * ttl: The time to live in seconds. * * @throws \InvalidArgumentException When unsupported client or options are passed */ public function __construct( private \Redis|Relay|\RedisArray|\RedisCluster|\Predis\ClientInterface $redis, array $options = [], ) { if ($diff = array_diff(array_keys($options), ['prefix', 'ttl'])) { throw new \InvalidArgumentException(sprintf('The following options are not supported "%s".', implode(', ', $diff))); } $this->prefix = $options['prefix'] ?? 'sf_s'; $this->ttl = $options['ttl'] ?? null; } protected function doRead(#[\SensitiveParameter] string $sessionId): string { return $this->redis->get($this->prefix.$sessionId) ?: ''; } protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool { $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); $result = $this->redis->setEx($this->prefix.$sessionId, (int) $ttl, $data); return $result && !$result instanceof ErrorInterface; } protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool { static $unlink = true; if ($unlink) { try { $unlink = false !== $this->redis->unlink($this->prefix.$sessionId); } catch (\Throwable) { $unlink = false; } } if (!$unlink) { $this->redis->del($this->prefix.$sessionId); } return true; } #[\ReturnTypeWillChange] public function close(): bool { return true; } public function gc(int $maxlifetime): int|false { return 0; } public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool { $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); return $this->redis->expire($this->prefix.$sessionId, (int) $ttl); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; use Doctrine\DBAL\Configuration; use Doctrine\DBAL\DriverManager; use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory; use Doctrine\DBAL\Tools\DsnParser; use Relay\Relay; use Symfony\Component\Cache\Adapter\AbstractAdapter; /** * @author Nicolas Grekas */ class SessionHandlerFactory { public static function createHandler(object|string $connection, array $options = []): AbstractSessionHandler { if ($query = \is_string($connection) ? parse_url($connection) : false) { parse_str($query['query'] ?? '', $query); if (($options['ttl'] ?? null) instanceof \Closure) { $query['ttl'] = $options['ttl']; } } $options = ($query ?: []) + $options; switch (true) { case $connection instanceof \Redis: case $connection instanceof Relay: case $connection instanceof \RedisArray: case $connection instanceof \RedisCluster: case $connection instanceof \Predis\ClientInterface: return new RedisSessionHandler($connection); case $connection instanceof \Memcached: return new MemcachedSessionHandler($connection); case $connection instanceof \PDO: return new PdoSessionHandler($connection); case !\is_string($connection): throw new \InvalidArgumentException(sprintf('Unsupported Connection: "%s".', get_debug_type($connection))); case str_starts_with($connection, 'file://'): $savePath = substr($connection, 7); return new StrictSessionHandler(new NativeFileSessionHandler('' === $savePath ? null : $savePath)); case str_starts_with($connection, 'redis:'): case str_starts_with($connection, 'rediss:'): case str_starts_with($connection, 'memcached:'): if (!class_exists(AbstractAdapter::class)) { throw new \InvalidArgumentException('Unsupported Redis or Memcached DSN. Try running "composer require symfony/cache".'); } $handlerClass = str_starts_with($connection, 'memcached:') ? MemcachedSessionHandler::class : RedisSessionHandler::class; $connection = AbstractAdapter::createConnection($connection, ['lazy' => true]); return new $handlerClass($connection, array_intersect_key($options, ['prefix' => 1, 'ttl' => 1])); case str_starts_with($connection, 'pdo_oci://'): if (!class_exists(DriverManager::class)) { throw new \InvalidArgumentException('Unsupported PDO OCI DSN. Try running "composer require doctrine/dbal".'); } $connection[3] = '-'; $params = class_exists(DsnParser::class) ? (new DsnParser())->parse($connection) : ['url' => $connection]; $config = new Configuration(); if (class_exists(DefaultSchemaManagerFactory::class)) { $config->setSchemaManagerFactory(new DefaultSchemaManagerFactory()); } $connection = DriverManager::getConnection($params, $config); // The condition should be removed once support for DBAL <3.3 is dropped $connection = method_exists($connection, 'getNativeConnection') ? $connection->getNativeConnection() : $connection->getWrappedConnection(); // no break; case str_starts_with($connection, 'mssql://'): case str_starts_with($connection, 'mysql://'): case str_starts_with($connection, 'mysql2://'): case str_starts_with($connection, 'pgsql://'): case str_starts_with($connection, 'postgres://'): case str_starts_with($connection, 'postgresql://'): case str_starts_with($connection, 'sqlsrv://'): case str_starts_with($connection, 'sqlite://'): case str_starts_with($connection, 'sqlite3://'): return new PdoSessionHandler($connection, $options); } throw new \InvalidArgumentException(sprintf('Unsupported Connection: "%s".', $connection)); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; /** * Adds basic `SessionUpdateTimestampHandlerInterface` behaviors to another `SessionHandlerInterface`. * * @author Nicolas Grekas */ class StrictSessionHandler extends AbstractSessionHandler { private \SessionHandlerInterface $handler; private bool $doDestroy; public function __construct(\SessionHandlerInterface $handler) { if ($handler instanceof \SessionUpdateTimestampHandlerInterface) { throw new \LogicException(sprintf('"%s" is already an instance of "SessionUpdateTimestampHandlerInterface", you cannot wrap it with "%s".', get_debug_type($handler), self::class)); } $this->handler = $handler; } /** * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. * * @internal */ public function isWrapper(): bool { return $this->handler instanceof \SessionHandler; } public function open(string $savePath, string $sessionName): bool { parent::open($savePath, $sessionName); return $this->handler->open($savePath, $sessionName); } protected function doRead(#[\SensitiveParameter] string $sessionId): string { return $this->handler->read($sessionId); } public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool { return $this->write($sessionId, $data); } protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool { return $this->handler->write($sessionId, $data); } public function destroy(#[\SensitiveParameter] string $sessionId): bool { $this->doDestroy = true; $destroyed = parent::destroy($sessionId); return $this->doDestroy ? $this->doDestroy($sessionId) : $destroyed; } protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool { $this->doDestroy = false; return $this->handler->destroy($sessionId); } public function close(): bool { return $this->handler->close(); } public function gc(int $maxlifetime): int|false { return $this->handler->gc($maxlifetime); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage; use Symfony\Component\HttpFoundation\Session\SessionBagInterface; /** * Metadata container. * * Adds metadata to the session. * * @author Drak */ class MetadataBag implements SessionBagInterface { public const CREATED = 'c'; public const UPDATED = 'u'; public const LIFETIME = 'l'; private string $name = '__metadata'; private string $storageKey; /** * @var array */ protected $meta = [self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0]; /** * Unix timestamp. */ private int $lastUsed; private int $updateThreshold; /** * @param string $storageKey The key used to store bag in the session * @param int $updateThreshold The time to wait between two UPDATED updates */ public function __construct(string $storageKey = '_sf2_meta', int $updateThreshold = 0) { $this->storageKey = $storageKey; $this->updateThreshold = $updateThreshold; } /** * @return void */ public function initialize(array &$array) { $this->meta = &$array; if (isset($array[self::CREATED])) { $this->lastUsed = $this->meta[self::UPDATED]; $timeStamp = time(); if ($timeStamp - $array[self::UPDATED] >= $this->updateThreshold) { $this->meta[self::UPDATED] = $timeStamp; } } else { $this->stampCreated(); } } /** * Gets the lifetime that the session cookie was set with. */ public function getLifetime(): int { return $this->meta[self::LIFETIME]; } /** * Stamps a new session's metadata. * * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value * will leave the system settings unchanged, 0 sets the cookie * to expire with browser session. Time is in seconds, and is * not a Unix timestamp. * * @return void */ public function stampNew(?int $lifetime = null) { $this->stampCreated($lifetime); } public function getStorageKey(): string { return $this->storageKey; } /** * Gets the created timestamp metadata. * * @return int Unix timestamp */ public function getCreated(): int { return $this->meta[self::CREATED]; } /** * Gets the last used metadata. * * @return int Unix timestamp */ public function getLastUsed(): int { return $this->lastUsed; } public function clear(): mixed { // nothing to do return null; } public function getName(): string { return $this->name; } /** * Sets name. * * @return void */ public function setName(string $name) { $this->name = $name; } private function stampCreated(?int $lifetime = null): void { $timeStamp = time(); $this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp; $this->meta[self::LIFETIME] = $lifetime ?? (int) \ini_get('session.cookie_lifetime'); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage; use Symfony\Component\HttpFoundation\Session\SessionBagInterface; /** * MockArraySessionStorage mocks the session for unit tests. * * No PHP session is actually started since a session can be initialized * and shutdown only once per PHP execution cycle. * * When doing functional testing, you should use MockFileSessionStorage instead. * * @author Fabien Potencier * @author Bulat Shakirzyanov * @author Drak */ class MockArraySessionStorage implements SessionStorageInterface { /** * @var string */ protected $id = ''; /** * @var string */ protected $name; /** * @var bool */ protected $started = false; /** * @var bool */ protected $closed = false; /** * @var array */ protected $data = []; /** * @var MetadataBag */ protected $metadataBag; /** * @var array|SessionBagInterface[] */ protected $bags = []; public function __construct(string $name = 'MOCKSESSID', ?MetadataBag $metaBag = null) { $this->name = $name; $this->setMetadataBag($metaBag); } /** * @return void */ public function setSessionData(array $array) { $this->data = $array; } public function start(): bool { if ($this->started) { return true; } if (empty($this->id)) { $this->id = $this->generateId(); } $this->loadSession(); return true; } public function regenerate(bool $destroy = false, ?int $lifetime = null): bool { if (!$this->started) { $this->start(); } $this->metadataBag->stampNew($lifetime); $this->id = $this->generateId(); return true; } public function getId(): string { return $this->id; } /** * @return void */ public function setId(string $id) { if ($this->started) { throw new \LogicException('Cannot set session ID after the session has started.'); } $this->id = $id; } public function getName(): string { return $this->name; } /** * @return void */ public function setName(string $name) { $this->name = $name; } /** * @return void */ public function save() { if (!$this->started || $this->closed) { throw new \RuntimeException('Trying to save a session that was not started yet or was already closed.'); } // nothing to do since we don't persist the session data $this->closed = false; $this->started = false; } /** * @return void */ public function clear() { // clear out the bags foreach ($this->bags as $bag) { $bag->clear(); } // clear out the session $this->data = []; // reconnect the bags to the session $this->loadSession(); } /** * @return void */ public function registerBag(SessionBagInterface $bag) { $this->bags[$bag->getName()] = $bag; } public function getBag(string $name): SessionBagInterface { if (!isset($this->bags[$name])) { throw new \InvalidArgumentException(sprintf('The SessionBagInterface "%s" is not registered.', $name)); } if (!$this->started) { $this->start(); } return $this->bags[$name]; } public function isStarted(): bool { return $this->started; } /** * @return void */ public function setMetadataBag(?MetadataBag $bag = null) { if (1 > \func_num_args()) { trigger_deprecation('symfony/http-foundation', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); } $this->metadataBag = $bag ?? new MetadataBag(); } /** * Gets the MetadataBag. */ public function getMetadataBag(): MetadataBag { return $this->metadataBag; } /** * Generates a session ID. * * This doesn't need to be particularly cryptographically secure since this is just * a mock. */ protected function generateId(): string { return hash('sha256', uniqid('ss_mock_', true)); } /** * @return void */ protected function loadSession() { $bags = array_merge($this->bags, [$this->metadataBag]); foreach ($bags as $bag) { $key = $bag->getStorageKey(); $this->data[$key] ??= []; $bag->initialize($this->data[$key]); } $this->started = true; $this->closed = false; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage; /** * MockFileSessionStorage is used to mock sessions for * functional testing where you may need to persist session data * across separate PHP processes. * * No PHP session is actually started since a session can be initialized * and shutdown only once per PHP execution cycle and this class does * not pollute any session related globals, including session_*() functions * or session.* PHP ini directives. * * @author Drak */ class MockFileSessionStorage extends MockArraySessionStorage { private string $savePath; /** * @param string|null $savePath Path of directory to save session files */ public function __construct(?string $savePath = null, string $name = 'MOCKSESSID', ?MetadataBag $metaBag = null) { $savePath ??= sys_get_temp_dir(); if (!is_dir($savePath) && !@mkdir($savePath, 0777, true) && !is_dir($savePath)) { throw new \RuntimeException(sprintf('Session Storage was not able to create directory "%s".', $savePath)); } $this->savePath = $savePath; parent::__construct($name, $metaBag); } public function start(): bool { if ($this->started) { return true; } if (!$this->id) { $this->id = $this->generateId(); } $this->read(); $this->started = true; return true; } public function regenerate(bool $destroy = false, ?int $lifetime = null): bool { if (!$this->started) { $this->start(); } if ($destroy) { $this->destroy(); } return parent::regenerate($destroy, $lifetime); } /** * @return void */ public function save() { if (!$this->started) { throw new \RuntimeException('Trying to save a session that was not started yet or was already closed.'); } $data = $this->data; foreach ($this->bags as $bag) { if (empty($data[$key = $bag->getStorageKey()])) { unset($data[$key]); } } if ([$key = $this->metadataBag->getStorageKey()] === array_keys($data)) { unset($data[$key]); } try { if ($data) { $path = $this->getFilePath(); $tmp = $path.bin2hex(random_bytes(6)); file_put_contents($tmp, serialize($data)); rename($tmp, $path); } else { $this->destroy(); } } finally { $this->data = $data; } // this is needed when the session object is re-used across multiple requests // in functional tests. $this->started = false; } /** * Deletes a session from persistent storage. * Deliberately leaves session data in memory intact. */ private function destroy(): void { set_error_handler(static function () {}); try { unlink($this->getFilePath()); } finally { restore_error_handler(); } } /** * Calculate path to file. */ private function getFilePath(): string { return $this->savePath.'/'.$this->id.'.mocksess'; } /** * Reads session from storage and loads session. */ private function read(): void { set_error_handler(static function () {}); try { $data = file_get_contents($this->getFilePath()); } finally { restore_error_handler(); } $this->data = $data ? unserialize($data) : []; $this->loadSession(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage; use Symfony\Component\HttpFoundation\Request; // Help opcache.preload discover always-needed symbols class_exists(MockFileSessionStorage::class); /** * @author Jérémy Derussé */ class MockFileSessionStorageFactory implements SessionStorageFactoryInterface { private ?string $savePath; private string $name; private ?MetadataBag $metaBag; /** * @see MockFileSessionStorage constructor. */ public function __construct(?string $savePath = null, string $name = 'MOCKSESSID', ?MetadataBag $metaBag = null) { $this->savePath = $savePath; $this->name = $name; $this->metaBag = $metaBag; } public function createStorage(?Request $request): SessionStorageInterface { return new MockFileSessionStorage($this->savePath, $this->name, $this->metaBag); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage; use Symfony\Component\HttpFoundation\Session\SessionBagInterface; use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler; use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy; // Help opcache.preload discover always-needed symbols class_exists(MetadataBag::class); class_exists(StrictSessionHandler::class); class_exists(SessionHandlerProxy::class); /** * This provides a base class for session attribute storage. * * @author Drak */ class NativeSessionStorage implements SessionStorageInterface { /** * @var SessionBagInterface[] */ protected $bags = []; /** * @var bool */ protected $started = false; /** * @var bool */ protected $closed = false; /** * @var AbstractProxy|\SessionHandlerInterface */ protected $saveHandler; /** * @var MetadataBag */ protected $metadataBag; /** * Depending on how you want the storage driver to behave you probably * want to override this constructor entirely. * * List of options for $options array with their defaults. * * @see https://php.net/session.configuration for options * but we omit 'session.' from the beginning of the keys for convenience. * * ("auto_start", is not supported as it tells PHP to start a session before * PHP starts to execute user-land code. Setting during runtime has no effect). * * cache_limiter, "" (use "0" to prevent headers from being sent entirely). * cache_expire, "0" * cookie_domain, "" * cookie_httponly, "" * cookie_lifetime, "0" * cookie_path, "/" * cookie_secure, "" * cookie_samesite, null * gc_divisor, "100" * gc_maxlifetime, "1440" * gc_probability, "1" * lazy_write, "1" * name, "PHPSESSID" * referer_check, "" * serialize_handler, "php" * use_strict_mode, "1" * use_cookies, "1" * use_only_cookies, "1" * use_trans_sid, "0" * sid_length, "32" * sid_bits_per_character, "5" * trans_sid_hosts, $_SERVER['HTTP_HOST'] * trans_sid_tags, "a=href,area=href,frame=src,form=" */ public function __construct(array $options = [], AbstractProxy|\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null) { if (!\extension_loaded('session')) { throw new \LogicException('PHP extension "session" is required.'); } $options += [ 'cache_limiter' => '', 'cache_expire' => 0, 'use_cookies' => 1, 'lazy_write' => 1, 'use_strict_mode' => 1, ]; session_register_shutdown(); $this->setMetadataBag($metaBag); $this->setOptions($options); $this->setSaveHandler($handler); } /** * Gets the save handler instance. */ public function getSaveHandler(): AbstractProxy|\SessionHandlerInterface { return $this->saveHandler; } public function start(): bool { if ($this->started) { return true; } if (\PHP_SESSION_ACTIVE === session_status()) { throw new \RuntimeException('Failed to start the session: already started by PHP.'); } if (filter_var(\ini_get('session.use_cookies'), \FILTER_VALIDATE_BOOL) && headers_sent($file, $line)) { throw new \RuntimeException(sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line)); } $sessionId = $_COOKIE[session_name()] ?? null; /* * Explanation of the session ID regular expression: `/^[a-zA-Z0-9,-]{22,250}$/`. * * ---------- Part 1 * * The part `[a-zA-Z0-9,-]` is related to the PHP ini directive `session.sid_bits_per_character` defined as 6. * See https://www.php.net/manual/en/session.configuration.php#ini.session.sid-bits-per-character. * Allowed values are integers such as: * - 4 for range `a-f0-9` * - 5 for range `a-v0-9` * - 6 for range `a-zA-Z0-9,-` * * ---------- Part 2 * * The part `{22,250}` is related to the PHP ini directive `session.sid_length`. * See https://www.php.net/manual/en/session.configuration.php#ini.session.sid-length. * Allowed values are integers between 22 and 256, but we use 250 for the max. * * Where does the 250 come from? * - The length of Windows and Linux filenames is limited to 255 bytes. Then the max must not exceed 255. * - The session filename prefix is `sess_`, a 5 bytes string. Then the max must not exceed 255 - 5 = 250. * * ---------- Conclusion * * The parts 1 and 2 prevent the warning below: * `PHP Warning: SessionHandler::read(): Session ID is too long or contains illegal characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed.` * * The part 2 prevents the warning below: * `PHP Warning: SessionHandler::read(): open(filepath, O_RDWR) failed: No such file or directory (2).` */ if ($sessionId && $this->saveHandler instanceof AbstractProxy && 'files' === $this->saveHandler->getSaveHandlerName() && !preg_match('/^[a-zA-Z0-9,-]{22,250}$/', $sessionId)) { // the session ID in the header is invalid, create a new one session_id(session_create_id()); } // ok to try and start the session if (!session_start()) { throw new \RuntimeException('Failed to start the session.'); } $this->loadSession(); return true; } public function getId(): string { return $this->saveHandler->getId(); } /** * @return void */ public function setId(string $id) { $this->saveHandler->setId($id); } public function getName(): string { return $this->saveHandler->getName(); } /** * @return void */ public function setName(string $name) { $this->saveHandler->setName($name); } public function regenerate(bool $destroy = false, ?int $lifetime = null): bool { // Cannot regenerate the session ID for non-active sessions. if (\PHP_SESSION_ACTIVE !== session_status()) { return false; } if (headers_sent()) { return false; } if (null !== $lifetime && $lifetime != \ini_get('session.cookie_lifetime')) { $this->save(); ini_set('session.cookie_lifetime', $lifetime); $this->start(); } if ($destroy) { $this->metadataBag->stampNew(); } return session_regenerate_id($destroy); } /** * @return void */ public function save() { // Store a copy so we can restore the bags in case the session was not left empty $session = $_SESSION; foreach ($this->bags as $bag) { if (empty($_SESSION[$key = $bag->getStorageKey()])) { unset($_SESSION[$key]); } } if ($_SESSION && [$key = $this->metadataBag->getStorageKey()] === array_keys($_SESSION)) { unset($_SESSION[$key]); } // Register error handler to add information about the current save handler $previousHandler = set_error_handler(function ($type, $msg, $file, $line) use (&$previousHandler) { if (\E_WARNING === $type && str_starts_with($msg, 'session_write_close():')) { $handler = $this->saveHandler instanceof SessionHandlerProxy ? $this->saveHandler->getHandler() : $this->saveHandler; $msg = sprintf('session_write_close(): Failed to write session data with "%s" handler', $handler::class); } return $previousHandler ? $previousHandler($type, $msg, $file, $line) : false; }); try { session_write_close(); } finally { restore_error_handler(); // Restore only if not empty if ($_SESSION) { $_SESSION = $session; } } $this->closed = true; $this->started = false; } /** * @return void */ public function clear() { // clear out the bags foreach ($this->bags as $bag) { $bag->clear(); } // clear out the session $_SESSION = []; // reconnect the bags to the session $this->loadSession(); } /** * @return void */ public function registerBag(SessionBagInterface $bag) { if ($this->started) { throw new \LogicException('Cannot register a bag when the session is already started.'); } $this->bags[$bag->getName()] = $bag; } public function getBag(string $name): SessionBagInterface { if (!isset($this->bags[$name])) { throw new \InvalidArgumentException(sprintf('The SessionBagInterface "%s" is not registered.', $name)); } if (!$this->started && $this->saveHandler->isActive()) { $this->loadSession(); } elseif (!$this->started) { $this->start(); } return $this->bags[$name]; } /** * @return void */ public function setMetadataBag(?MetadataBag $metaBag = null) { if (1 > \func_num_args()) { trigger_deprecation('symfony/http-foundation', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); } $this->metadataBag = $metaBag ?? new MetadataBag(); } /** * Gets the MetadataBag. */ public function getMetadataBag(): MetadataBag { return $this->metadataBag; } public function isStarted(): bool { return $this->started; } /** * Sets session.* ini variables. * * For convenience we omit 'session.' from the beginning of the keys. * Explicitly ignores other ini keys. * * @param array $options Session ini directives [key => value] * * @see https://php.net/session.configuration * * @return void */ public function setOptions(array $options) { if (headers_sent() || \PHP_SESSION_ACTIVE === session_status()) { return; } $validOptions = array_flip([ 'cache_expire', 'cache_limiter', 'cookie_domain', 'cookie_httponly', 'cookie_lifetime', 'cookie_path', 'cookie_secure', 'cookie_samesite', 'gc_divisor', 'gc_maxlifetime', 'gc_probability', 'lazy_write', 'name', 'referer_check', 'serialize_handler', 'use_strict_mode', 'use_cookies', 'use_only_cookies', 'use_trans_sid', 'sid_length', 'sid_bits_per_character', 'trans_sid_hosts', 'trans_sid_tags', ]); foreach ($options as $key => $value) { if (isset($validOptions[$key])) { if ('cookie_secure' === $key && 'auto' === $value) { continue; } ini_set('session.'.$key, $value); } } } /** * Registers session save handler as a PHP session handler. * * To use internal PHP session save handlers, override this method using ini_set with * session.save_handler and session.save_path e.g. * * ini_set('session.save_handler', 'files'); * ini_set('session.save_path', '/tmp'); * * or pass in a \SessionHandler instance which configures session.save_handler in the * constructor, for a template see NativeFileSessionHandler. * * @see https://php.net/session-set-save-handler * @see https://php.net/sessionhandlerinterface * @see https://php.net/sessionhandler * * @return void * * @throws \InvalidArgumentException */ public function setSaveHandler(AbstractProxy|\SessionHandlerInterface|null $saveHandler = null) { if (1 > \func_num_args()) { trigger_deprecation('symfony/http-foundation', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); } // Wrap $saveHandler in proxy and prevent double wrapping of proxy if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) { $saveHandler = new SessionHandlerProxy($saveHandler); } elseif (!$saveHandler instanceof AbstractProxy) { $saveHandler = new SessionHandlerProxy(new StrictSessionHandler(new \SessionHandler())); } $this->saveHandler = $saveHandler; if (headers_sent() || \PHP_SESSION_ACTIVE === session_status()) { return; } if ($this->saveHandler instanceof SessionHandlerProxy) { session_set_save_handler($this->saveHandler, false); } } /** * Load the session with attributes. * * After starting the session, PHP retrieves the session from whatever handlers * are set to (either PHP's internal, or a custom save handler set with session_set_save_handler()). * PHP takes the return value from the read() handler, unserializes it * and populates $_SESSION with the result automatically. * * @return void */ protected function loadSession(?array &$session = null) { if (null === $session) { $session = &$_SESSION; } $bags = array_merge($this->bags, [$this->metadataBag]); foreach ($bags as $bag) { $key = $bag->getStorageKey(); $session[$key] = isset($session[$key]) && \is_array($session[$key]) ? $session[$key] : []; $bag->initialize($session[$key]); } $this->started = true; $this->closed = false; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; // Help opcache.preload discover always-needed symbols class_exists(NativeSessionStorage::class); /** * @author Jérémy Derussé */ class NativeSessionStorageFactory implements SessionStorageFactoryInterface { private array $options; private AbstractProxy|\SessionHandlerInterface|null $handler; private ?MetadataBag $metaBag; private bool $secure; /** * @see NativeSessionStorage constructor. */ public function __construct(array $options = [], AbstractProxy|\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null, bool $secure = false) { $this->options = $options; $this->handler = $handler; $this->metaBag = $metaBag; $this->secure = $secure; } public function createStorage(?Request $request): SessionStorageInterface { $storage = new NativeSessionStorage($this->options, $this->handler, $this->metaBag); if ($this->secure && $request?->isSecure()) { $storage->setOptions(['cookie_secure' => true]); } return $storage; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage; use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; /** * Allows session to be started by PHP and managed by Symfony. * * @author Drak */ class PhpBridgeSessionStorage extends NativeSessionStorage { public function __construct(AbstractProxy|\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null) { if (!\extension_loaded('session')) { throw new \LogicException('PHP extension "session" is required.'); } $this->setMetadataBag($metaBag); $this->setSaveHandler($handler); } public function start(): bool { if ($this->started) { return true; } $this->loadSession(); return true; } /** * @return void */ public function clear() { // clear out the bags and nothing else that may be set // since the purpose of this driver is to share a handler foreach ($this->bags as $bag) { $bag->clear(); } // reconnect the bags to the session $this->loadSession(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; // Help opcache.preload discover always-needed symbols class_exists(PhpBridgeSessionStorage::class); /** * @author Jérémy Derussé */ class PhpBridgeSessionStorageFactory implements SessionStorageFactoryInterface { private AbstractProxy|\SessionHandlerInterface|null $handler; private ?MetadataBag $metaBag; private bool $secure; public function __construct(AbstractProxy|\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null, bool $secure = false) { $this->handler = $handler; $this->metaBag = $metaBag; $this->secure = $secure; } public function createStorage(?Request $request): SessionStorageInterface { $storage = new PhpBridgeSessionStorage($this->handler, $this->metaBag); if ($this->secure && $request?->isSecure()) { $storage->setOptions(['cookie_secure' => true]); } return $storage; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; /** * @author Drak */ abstract class AbstractProxy { /** * Flag if handler wraps an internal PHP session handler (using \SessionHandler). * * @var bool */ protected $wrapper = false; /** * @var string */ protected $saveHandlerName; /** * Gets the session.save_handler name. */ public function getSaveHandlerName(): ?string { return $this->saveHandlerName; } /** * Is this proxy handler and instance of \SessionHandlerInterface. */ public function isSessionHandlerInterface(): bool { return $this instanceof \SessionHandlerInterface; } /** * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. */ public function isWrapper(): bool { return $this->wrapper; } /** * Has a session started? */ public function isActive(): bool { return \PHP_SESSION_ACTIVE === session_status(); } /** * Gets the session ID. */ public function getId(): string { return session_id(); } /** * Sets the session ID. * * @return void * * @throws \LogicException */ public function setId(string $id) { if ($this->isActive()) { throw new \LogicException('Cannot change the ID of an active session.'); } session_id($id); } /** * Gets the session name. */ public function getName(): string { return session_name(); } /** * Sets the session name. * * @return void * * @throws \LogicException */ public function setName(string $name) { if ($this->isActive()) { throw new \LogicException('Cannot change the name of an active session.'); } session_name($name); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler; /** * @author Drak */ class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface { protected $handler; public function __construct(\SessionHandlerInterface $handler) { $this->handler = $handler; $this->wrapper = $handler instanceof \SessionHandler; $this->saveHandlerName = $this->wrapper || ($handler instanceof StrictSessionHandler && $handler->isWrapper()) ? \ini_get('session.save_handler') : 'user'; } public function getHandler(): \SessionHandlerInterface { return $this->handler; } // \SessionHandlerInterface public function open(string $savePath, string $sessionName): bool { return $this->handler->open($savePath, $sessionName); } public function close(): bool { return $this->handler->close(); } public function read(#[\SensitiveParameter] string $sessionId): string|false { return $this->handler->read($sessionId); } public function write(#[\SensitiveParameter] string $sessionId, string $data): bool { return $this->handler->write($sessionId, $data); } public function destroy(#[\SensitiveParameter] string $sessionId): bool { return $this->handler->destroy($sessionId); } public function gc(int $maxlifetime): int|false { return $this->handler->gc($maxlifetime); } public function validateId(#[\SensitiveParameter] string $sessionId): bool { return !$this->handler instanceof \SessionUpdateTimestampHandlerInterface || $this->handler->validateId($sessionId); } public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool { return $this->handler instanceof \SessionUpdateTimestampHandlerInterface ? $this->handler->updateTimestamp($sessionId, $data) : $this->write($sessionId, $data); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage; use Symfony\Component\HttpFoundation\Request; /** * @author Jérémy Derussé */ interface SessionStorageFactoryInterface { /** * Creates a new instance of SessionStorageInterface. */ public function createStorage(?Request $request): SessionStorageInterface; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Session\Storage; use Symfony\Component\HttpFoundation\Session\SessionBagInterface; /** * StorageInterface. * * @author Fabien Potencier * @author Drak */ interface SessionStorageInterface { /** * Starts the session. * * @throws \RuntimeException if something goes wrong starting the session */ public function start(): bool; /** * Checks if the session is started. */ public function isStarted(): bool; /** * Returns the session ID. */ public function getId(): string; /** * Sets the session ID. * * @return void */ public function setId(string $id); /** * Returns the session name. */ public function getName(): string; /** * Sets the session name. * * @return void */ public function setName(string $name); /** * Regenerates id that represents this storage. * * This method must invoke session_regenerate_id($destroy) unless * this interface is used for a storage object designed for unit * or functional testing where a real PHP session would interfere * with testing. * * Note regenerate+destroy should not clear the session data in memory * only delete the session data from persistent storage. * * Care: When regenerating the session ID no locking is involved in PHP's * session design. See https://bugs.php.net/61470 for a discussion. * So you must make sure the regenerated session is saved BEFORE sending the * headers with the new ID. Symfony's HttpKernel offers a listener for this. * See Symfony\Component\HttpKernel\EventListener\SaveSessionListener. * Otherwise session data could get lost again for concurrent requests with the * new ID. One result could be that you get logged out after just logging in. * * @param bool $destroy Destroy session when regenerating? * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value * will leave the system settings unchanged, 0 sets the cookie * to expire with browser session. Time is in seconds, and is * not a Unix timestamp. * * @throws \RuntimeException If an error occurs while regenerating this storage */ public function regenerate(bool $destroy = false, ?int $lifetime = null): bool; /** * Force the session to be saved and closed. * * This method must invoke session_write_close() unless this interface is * used for a storage object design for unit or functional testing where * a real PHP session would interfere with testing, in which case * it should actually persist the session data if required. * * @return void * * @throws \RuntimeException if the session is saved without being started, or if the session * is already closed */ public function save(); /** * Clear all session data in memory. * * @return void */ public function clear(); /** * Gets a SessionBagInterface by name. * * @throws \InvalidArgumentException If the bag does not exist */ public function getBag(string $name): SessionBagInterface; /** * Registers a SessionBagInterface for use. * * @return void */ public function registerBag(SessionBagInterface $bag); public function getMetadataBag(): MetadataBag; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/StreamedJsonResponse.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * StreamedJsonResponse represents a streamed HTTP response for JSON. * * A StreamedJsonResponse uses a structure and generics to create an * efficient resource-saving JSON response. * * It is recommended to use flush() function after a specific number of items to directly stream the data. * * @see flush() * * @author Alexander Schranz * * Example usage: * * function loadArticles(): \Generator * // some streamed loading * yield ['title' => 'Article 1']; * yield ['title' => 'Article 2']; * yield ['title' => 'Article 3']; * // recommended to use flush() after every specific number of items * }), * * $response = new StreamedJsonResponse( * // json structure with generators in which will be streamed * [ * '_embedded' => [ * 'articles' => loadArticles(), // any generator which you want to stream as list of data * ], * ], * ); */ class StreamedJsonResponse extends StreamedResponse { private const PLACEHOLDER = '__symfony_json__'; /** * @param mixed[] $data JSON Data containing PHP generators which will be streamed as list of data or a Generator * @param int $status The HTTP status code (200 "OK" by default) * @param array $headers An array of HTTP headers * @param int $encodingOptions Flags for the json_encode() function */ public function __construct( private readonly iterable $data, int $status = 200, array $headers = [], private int $encodingOptions = JsonResponse::DEFAULT_ENCODING_OPTIONS, ) { parent::__construct($this->stream(...), $status, $headers); if (!$this->headers->get('Content-Type')) { $this->headers->set('Content-Type', 'application/json'); } } private function stream(): void { $jsonEncodingOptions = \JSON_THROW_ON_ERROR | $this->encodingOptions; $keyEncodingOptions = $jsonEncodingOptions & ~\JSON_NUMERIC_CHECK; $this->streamData($this->data, $jsonEncodingOptions, $keyEncodingOptions); } private function streamData(mixed $data, int $jsonEncodingOptions, int $keyEncodingOptions): void { if (\is_array($data)) { $this->streamArray($data, $jsonEncodingOptions, $keyEncodingOptions); return; } if (is_iterable($data) && !$data instanceof \JsonSerializable) { $this->streamIterable($data, $jsonEncodingOptions, $keyEncodingOptions); return; } echo json_encode($data, $jsonEncodingOptions); } private function streamArray(array $data, int $jsonEncodingOptions, int $keyEncodingOptions): void { $generators = []; array_walk_recursive($data, function (&$item, $key) use (&$generators) { if (self::PLACEHOLDER === $key) { // if the placeholder is already in the structure it should be replaced with a new one that explode // works like expected for the structure $generators[] = $key; } // generators should be used but for better DX all kind of Traversable and objects are supported if (\is_object($item)) { $generators[] = $item; $item = self::PLACEHOLDER; } elseif (self::PLACEHOLDER === $item) { // if the placeholder is already in the structure it should be replaced with a new one that explode // works like expected for the structure $generators[] = $item; } }); $jsonParts = explode('"'.self::PLACEHOLDER.'"', json_encode($data, $jsonEncodingOptions)); foreach ($generators as $index => $generator) { // send first and between parts of the structure echo $jsonParts[$index]; $this->streamData($generator, $jsonEncodingOptions, $keyEncodingOptions); } // send last part of the structure echo $jsonParts[array_key_last($jsonParts)]; } private function streamIterable(iterable $iterable, int $jsonEncodingOptions, int $keyEncodingOptions): void { $isFirstItem = true; $startTag = '['; foreach ($iterable as $key => $item) { if ($isFirstItem) { $isFirstItem = false; // depending on the first elements key the generator is detected as a list or map // we can not check for a whole list or map because that would hurt the performance // of the streamed response which is the main goal of this response class if (0 !== $key) { $startTag = '{'; } echo $startTag; } else { // if not first element of the generic, a separator is required between the elements echo ','; } if ('{' === $startTag) { echo json_encode((string) $key, $keyEncodingOptions).':'; } $this->streamData($item, $jsonEncodingOptions, $keyEncodingOptions); } if ($isFirstItem) { // indicates that the generator was empty echo '['; } echo '[' === $startTag ? ']' : '}'; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/StreamedResponse.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * StreamedResponse represents a streamed HTTP response. * * A StreamedResponse uses a callback for its content. * * The callback should use the standard PHP functions like echo * to stream the response back to the client. The flush() function * can also be used if needed. * * @see flush() * * @author Fabien Potencier */ class StreamedResponse extends Response { protected $callback; protected $streamed; private bool $headersSent; /** * @param int $status The HTTP status code (200 "OK" by default) */ public function __construct(?callable $callback = null, int $status = 200, array $headers = []) { parent::__construct(null, $status, $headers); if (null !== $callback) { $this->setCallback($callback); } $this->streamed = false; $this->headersSent = false; } /** * Sets the PHP callback associated with this Response. * * @return $this */ public function setCallback(callable $callback): static { $this->callback = $callback(...); return $this; } public function getCallback(): ?\Closure { if (!isset($this->callback)) { return null; } return ($this->callback)(...); } /** * This method only sends the headers once. * * @param positive-int|null $statusCode The status code to use, override the statusCode property if set and not null * * @return $this */ public function sendHeaders(/* int $statusCode = null */): static { if ($this->headersSent) { return $this; } $statusCode = \func_num_args() > 0 ? func_get_arg(0) : null; if ($statusCode < 100 || $statusCode >= 200) { $this->headersSent = true; } return parent::sendHeaders($statusCode); } /** * This method only sends the content once. * * @return $this */ public function sendContent(): static { if ($this->streamed) { return $this; } $this->streamed = true; if (!isset($this->callback)) { throw new \LogicException('The Response callback must be set.'); } ($this->callback)(); return $this; } /** * @return $this * * @throws \LogicException when the content is not null */ public function setContent(?string $content): static { if (null !== $content) { throw new \LogicException('The content cannot be set on a StreamedResponse instance.'); } $this->streamed = true; return $this; } public function getContent(): string|false { return false; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Request; final class RequestAttributeValueSame extends Constraint { private string $name; private string $value; public function __construct(string $name, string $value) { $this->name = $name; $this->value = $value; } public function toString(): string { return sprintf('has attribute "%s" with value "%s"', $this->name, $this->value); } /** * @param Request $request */ protected function matches($request): bool { return $this->value === $request->attributes->get($this->name); } /** * @param Request $request */ protected function failureDescription($request): string { return 'the Request '.$this->toString(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Cookie; use Symfony\Component\HttpFoundation\Response; final class ResponseCookieValueSame extends Constraint { private string $name; private string $value; private string $path; private ?string $domain; public function __construct(string $name, string $value, string $path = '/', ?string $domain = null) { $this->name = $name; $this->value = $value; $this->path = $path; $this->domain = $domain; } public function toString(): string { $str = sprintf('has cookie "%s"', $this->name); if ('/' !== $this->path) { $str .= sprintf(' with path "%s"', $this->path); } if ($this->domain) { $str .= sprintf(' for domain "%s"', $this->domain); } $str .= sprintf(' with value "%s"', $this->value); return $str; } /** * @param Response $response */ protected function matches($response): bool { $cookie = $this->getCookie($response); if (!$cookie) { return false; } return $this->value === (string) $cookie->getValue(); } /** * @param Response $response */ protected function failureDescription($response): string { return 'the Response '.$this->toString(); } protected function getCookie(Response $response): ?Cookie { $cookies = $response->headers->getCookies(); $filteredCookies = array_filter($cookies, fn (Cookie $cookie) => $cookie->getName() === $this->name && $cookie->getPath() === $this->path && $cookie->getDomain() === $this->domain); return reset($filteredCookies) ?: null; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; /** * Asserts that the response is in the given format. * * @author Kévin Dunglas */ final class ResponseFormatSame extends Constraint { private Request $request; private ?string $format; public function __construct(Request $request, ?string $format) { $this->request = $request; $this->format = $format; } public function toString(): string { return 'format is '.($this->format ?? 'null'); } /** * @param Response $response */ protected function matches($response): bool { return $this->format === $this->request->getFormat($response->headers->get('Content-Type')); } /** * @param Response $response */ protected function failureDescription($response): string { return 'the Response '.$this->toString(); } /** * @param Response $response */ protected function additionalFailureDescription($response): string { return (string) $response; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Cookie; use Symfony\Component\HttpFoundation\Response; final class ResponseHasCookie extends Constraint { private string $name; private string $path; private ?string $domain; public function __construct(string $name, string $path = '/', ?string $domain = null) { $this->name = $name; $this->path = $path; $this->domain = $domain; } public function toString(): string { $str = sprintf('has cookie "%s"', $this->name); if ('/' !== $this->path) { $str .= sprintf(' with path "%s"', $this->path); } if ($this->domain) { $str .= sprintf(' for domain "%s"', $this->domain); } return $str; } /** * @param Response $response */ protected function matches($response): bool { return null !== $this->getCookie($response); } /** * @param Response $response */ protected function failureDescription($response): string { return 'the Response '.$this->toString(); } private function getCookie(Response $response): ?Cookie { $cookies = $response->headers->getCookies(); $filteredCookies = array_filter($cookies, fn (Cookie $cookie) => $cookie->getName() === $this->name && $cookie->getPath() === $this->path && $cookie->getDomain() === $this->domain); return reset($filteredCookies) ?: null; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Response; final class ResponseHasHeader extends Constraint { private string $headerName; public function __construct(string $headerName) { $this->headerName = $headerName; } public function toString(): string { return sprintf('has header "%s"', $this->headerName); } /** * @param Response $response */ protected function matches($response): bool { return $response->headers->has($this->headerName); } /** * @param Response $response */ protected function failureDescription($response): string { return 'the Response '.$this->toString(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; final class ResponseHeaderLocationSame extends Constraint { public function __construct(private Request $request, private string $expectedValue) { } public function toString(): string { return sprintf('has header "Location" matching "%s"', $this->expectedValue); } protected function matches($other): bool { if (!$other instanceof Response) { return false; } $location = $other->headers->get('Location'); if (null === $location) { return false; } return $this->toFullUrl($this->expectedValue) === $this->toFullUrl($location); } protected function failureDescription($other): string { return 'the Response '.$this->toString(); } private function toFullUrl(string $url): string { if (null === parse_url($url, \PHP_URL_PATH)) { $url .= '/'; } if (str_starts_with($url, '//')) { return sprintf('%s:%s', $this->request->getScheme(), $url); } if (str_starts_with($url, '/')) { return $this->request->getSchemeAndHttpHost().$url; } return $url; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Response; final class ResponseHeaderSame extends Constraint { private string $headerName; private string $expectedValue; public function __construct(string $headerName, string $expectedValue) { $this->headerName = $headerName; $this->expectedValue = $expectedValue; } public function toString(): string { return sprintf('has header "%s" with value "%s"', $this->headerName, $this->expectedValue); } /** * @param Response $response */ protected function matches($response): bool { return $this->expectedValue === $response->headers->get($this->headerName, null); } /** * @param Response $response */ protected function failureDescription($response): string { return 'the Response '.$this->toString(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Response; final class ResponseIsRedirected extends Constraint { public function toString(): string { return 'is redirected'; } /** * @param Response $response */ protected function matches($response): bool { return $response->isRedirect(); } /** * @param Response $response */ protected function failureDescription($response): string { return 'the Response '.$this->toString(); } /** * @param Response $response */ protected function additionalFailureDescription($response): string { return (string) $response; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Response; final class ResponseIsSuccessful extends Constraint { public function toString(): string { return 'is successful'; } /** * @param Response $response */ protected function matches($response): bool { return $response->isSuccessful(); } /** * @param Response $response */ protected function failureDescription($response): string { return 'the Response '.$this->toString(); } /** * @param Response $response */ protected function additionalFailureDescription($response): string { return (string) $response; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Response; final class ResponseIsUnprocessable extends Constraint { public function toString(): string { return 'is unprocessable'; } /** * @param Response $other */ protected function matches($other): bool { return Response::HTTP_UNPROCESSABLE_ENTITY === $other->getStatusCode(); } /** * @param Response $other */ protected function failureDescription($other): string { return 'the Response '.$this->toString(); } /** * @param Response $other */ protected function additionalFailureDescription($other): string { return (string) $other; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation\Test\Constraint; use PHPUnit\Framework\Constraint\Constraint; use Symfony\Component\HttpFoundation\Response; final class ResponseStatusCodeSame extends Constraint { private int $statusCode; public function __construct(int $statusCode) { $this->statusCode = $statusCode; } public function toString(): string { return 'status code is '.$this->statusCode; } /** * @param Response $response */ protected function matches($response): bool { return $this->statusCode === $response->getStatusCode(); } /** * @param Response $response */ protected function failureDescription($response): string { return 'the Response '.$this->toString(); } /** * @param Response $response */ protected function additionalFailureDescription($response): string { return (string) $response; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/UriSigner.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * @author Fabien Potencier */ class UriSigner { private string $secret; private string $parameter; /** * @param string $parameter Query string parameter to use */ public function __construct(#[\SensitiveParameter] string $secret, string $parameter = '_hash') { if (!$secret) { throw new \InvalidArgumentException('A non-empty secret is required.'); } $this->secret = $secret; $this->parameter = $parameter; } /** * Signs a URI. * * The given URI is signed by adding the query string parameter * which value depends on the URI and the secret. */ public function sign(string $uri): string { $url = parse_url($uri); $params = []; if (isset($url['query'])) { parse_str($url['query'], $params); } $uri = $this->buildUrl($url, $params); $params[$this->parameter] = $this->computeHash($uri); return $this->buildUrl($url, $params); } /** * Checks that a URI contains the correct hash. */ public function check(string $uri): bool { $url = parse_url($uri); $params = []; if (isset($url['query'])) { parse_str($url['query'], $params); } if (empty($params[$this->parameter])) { return false; } $hash = $params[$this->parameter]; unset($params[$this->parameter]); return hash_equals($this->computeHash($this->buildUrl($url, $params)), $hash); } public function checkRequest(Request $request): bool { $qs = ($qs = $request->server->get('QUERY_STRING')) ? '?'.$qs : ''; // we cannot use $request->getUri() here as we want to work with the original URI (no query string reordering) return $this->check($request->getSchemeAndHttpHost().$request->getBaseUrl().$request->getPathInfo().$qs); } private function computeHash(string $uri): string { return base64_encode(hash_hmac('sha256', $uri, $this->secret, true)); } private function buildUrl(array $url, array $params = []): string { ksort($params, \SORT_STRING); $url['query'] = http_build_query($params, '', '&'); $scheme = isset($url['scheme']) ? $url['scheme'].'://' : ''; $host = $url['host'] ?? ''; $port = isset($url['port']) ? ':'.$url['port'] : ''; $user = $url['user'] ?? ''; $pass = isset($url['pass']) ? ':'.$url['pass'] : ''; $pass = ($user || $pass) ? "$pass@" : ''; $path = $url['path'] ?? ''; $query = $url['query'] ? '?'.$url['query'] : ''; $fragment = isset($url['fragment']) ? '#'.$url['fragment'] : ''; return $scheme.$user.$pass.$host.$port.$path.$query.$fragment; } } if (!class_exists(\Symfony\Component\HttpKernel\UriSigner::class, false)) { class_alias(UriSigner::class, \Symfony\Component\HttpKernel\UriSigner::class); } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/UrlHelper.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; use Symfony\Component\Routing\RequestContext; use Symfony\Component\Routing\RequestContextAwareInterface; /** * A helper service for manipulating URLs within and outside the request scope. * * @author Valentin Udaltsov */ final class UrlHelper { public function __construct( private RequestStack $requestStack, private RequestContextAwareInterface|RequestContext|null $requestContext = null, ) { } public function getAbsoluteUrl(string $path): string { if (str_contains($path, '://') || str_starts_with($path, '//')) { return $path; } if (null === $request = $this->requestStack->getMainRequest()) { return $this->getAbsoluteUrlFromContext($path); } if ('#' === $path[0]) { $path = $request->getRequestUri().$path; } elseif ('?' === $path[0]) { $path = $request->getPathInfo().$path; } if (!$path || '/' !== $path[0]) { $prefix = $request->getPathInfo(); $last = \strlen($prefix) - 1; if ($last !== $pos = strrpos($prefix, '/')) { $prefix = substr($prefix, 0, $pos).'/'; } return $request->getUriForPath($prefix.$path); } return $request->getSchemeAndHttpHost().$path; } public function getRelativePath(string $path): string { if (str_contains($path, '://') || str_starts_with($path, '//')) { return $path; } if (null === $request = $this->requestStack->getMainRequest()) { return $path; } return $request->getRelativeUriForPath($path); } private function getAbsoluteUrlFromContext(string $path): string { if (null === $context = $this->requestContext) { return $path; } if ($context instanceof RequestContextAwareInterface) { $context = $context->getContext(); } if ('' === $host = $context->getHost()) { return $path; } $scheme = $context->getScheme(); $port = ''; if ('http' === $scheme && 80 !== $context->getHttpPort()) { $port = ':'.$context->getHttpPort(); } elseif ('https' === $scheme && 443 !== $context->getHttpsPort()) { $port = ':'.$context->getHttpsPort(); } if ('#' === $path[0]) { $queryString = $context->getQueryString(); $path = $context->getPathInfo().($queryString ? '?'.$queryString : '').$path; } elseif ('?' === $path[0]) { $path = $context->getPathInfo().$path; } if ('/' !== $path[0]) { $path = rtrim($context->getBaseUrl(), '/').'/'.$path; } return $scheme.'://'.$host.$port.$path; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/http-foundation/composer.json ================================================ { "name": "symfony/http-foundation", "type": "library", "description": "Defines an object-oriented layer for the HTTP specification", "keywords": [], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, "require-dev": { "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.3|^7.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", "symfony/mime": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/cache": "<6.3" }, "autoload": { "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "minimum-stability": "dev" } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-mbstring/LICENSE ================================================ Copyright (c) 2015-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-mbstring/Mbstring.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Mbstring; /** * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. * * Implemented: * - mb_chr - Returns a specific character from its Unicode code point * - mb_convert_encoding - Convert character encoding * - mb_convert_variables - Convert character code in variable(s) * - mb_decode_mimeheader - Decode string in MIME header field * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED * - mb_decode_numericentity - Decode HTML numeric string reference to character * - mb_encode_numericentity - Encode character to HTML numeric string reference * - mb_convert_case - Perform case folding on a string * - mb_detect_encoding - Detect character encoding * - mb_get_info - Get internal settings of mbstring * - mb_http_input - Detect HTTP input character encoding * - mb_http_output - Set/Get HTTP output character encoding * - mb_internal_encoding - Set/Get internal character encoding * - mb_list_encodings - Returns an array of all supported encodings * - mb_ord - Returns the Unicode code point of a character * - mb_output_handler - Callback function converts character encoding in output buffer * - mb_scrub - Replaces ill-formed byte sequences with substitute characters * - mb_strlen - Get string length * - mb_strpos - Find position of first occurrence of string in a string * - mb_strrpos - Find position of last occurrence of a string in a string * - mb_str_split - Convert a string to an array * - mb_strtolower - Make a string lowercase * - mb_strtoupper - Make a string uppercase * - mb_substitute_character - Set/Get substitution character * - mb_substr - Get part of string * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive * - mb_stristr - Finds first occurrence of a string within another, case insensitive * - mb_strrchr - Finds the last occurrence of a character in a string within another * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive * - mb_strstr - Finds first occurrence of a string within another * - mb_strwidth - Return width of string * - mb_substr_count - Count the number of substring occurrences * * Not implemented: * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) * - mb_ereg_* - Regular expression with multibyte support * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable * - mb_preferred_mime_name - Get MIME charset string * - mb_regex_encoding - Returns current encoding for multibyte regex as string * - mb_regex_set_options - Set/Get the default options for mbregex functions * - mb_send_mail - Send encoded mail * - mb_split - Split multibyte string using regular expression * - mb_strcut - Get part of string * - mb_strimwidth - Get truncated string with specified width * * @author Nicolas Grekas * * @internal */ final class Mbstring { public const MB_CASE_FOLD = \PHP_INT_MAX; private const SIMPLE_CASE_FOLD = [ ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"], ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'], ]; private static $encodingList = ['ASCII', 'UTF-8']; private static $language = 'neutral'; private static $internalEncoding = 'UTF-8'; public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) { if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) { $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); } else { $fromEncoding = self::getEncoding($fromEncoding); } $toEncoding = self::getEncoding($toEncoding); if ('BASE64' === $fromEncoding) { $s = base64_decode($s); $fromEncoding = $toEncoding; } if ('BASE64' === $toEncoding) { return base64_encode($s); } if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { $fromEncoding = 'Windows-1252'; } if ('UTF-8' !== $fromEncoding) { $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); } return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); } if ('HTML-ENTITIES' === $fromEncoding) { $s = html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); $fromEncoding = 'UTF-8'; } return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); } public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) { $ok = true; array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { $ok = false; } }); return $ok ? $fromEncoding : false; } public static function mb_decode_mimeheader($s) { return iconv_mime_decode($s, 2, self::$internalEncoding); } public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) { trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); } public static function mb_decode_numericentity($s, $convmap, $encoding = null) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; } if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { return false; } if (null !== $encoding && !\is_scalar($encoding)) { trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); return ''; // Instead of null (cf. mb_encode_numericentity). } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = iconv($encoding, 'UTF-8//IGNORE', $s); } $cnt = floor(\count($convmap) / 4) * 4; for ($i = 0; $i < $cnt; $i += 4) { // collector_decode_htmlnumericentity ignores $convmap[$i + 3] $convmap[$i] += $convmap[$i + 2]; $convmap[$i + 1] += $convmap[$i + 2]; } $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; for ($i = 0; $i < $cnt; $i += 4) { if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { return self::mb_chr($c - $convmap[$i + 2]); } } return $m[0]; }, $s); if (null === $encoding) { return $s; } return iconv('UTF-8', $encoding.'//IGNORE', $s); } public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; } if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { return false; } if (null !== $encoding && !\is_scalar($encoding)) { trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; // Instead of '' (cf. mb_decode_numericentity). } if (null !== $is_hex && !\is_scalar($is_hex)) { trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); return null; } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = iconv($encoding, 'UTF-8//IGNORE', $s); } static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; $cnt = floor(\count($convmap) / 4) * 4; $i = 0; $len = \strlen($s); $result = ''; while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; $uchr = substr($s, $i, $ulen); $i += $ulen; $c = self::mb_ord($uchr); for ($j = 0; $j < $cnt; $j += 4) { if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; continue 2; } } $result .= $uchr; } if (null === $encoding) { return $result; } return iconv('UTF-8', $encoding.'//IGNORE', $result); } public static function mb_convert_case($s, $mode, $encoding = null) { $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = iconv($encoding, 'UTF-8//IGNORE', $s); } if (\MB_CASE_TITLE == $mode) { static $titleRegexp = null; if (null === $titleRegexp) { $titleRegexp = self::getData('titleCaseRegexp'); } $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); } else { if (\MB_CASE_UPPER == $mode) { static $upper = null; if (null === $upper) { $upper = self::getData('upperCase'); } $map = $upper; } else { if (self::MB_CASE_FOLD === $mode) { static $caseFolding = null; if (null === $caseFolding) { $caseFolding = self::getData('caseFolding'); } $s = strtr($s, $caseFolding); } static $lower = null; if (null === $lower) { $lower = self::getData('lowerCase'); } $map = $lower; } static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; $i = 0; $len = \strlen($s); while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; $uchr = substr($s, $i, $ulen); $i += $ulen; if (isset($map[$uchr])) { $uchr = $map[$uchr]; $nlen = \strlen($uchr); if ($nlen == $ulen) { $nlen = $i; do { $s[--$nlen] = $uchr[--$ulen]; } while ($ulen); } else { $s = substr_replace($s, $uchr, $i - $ulen, $ulen); $len += $nlen - $ulen; $i += $nlen - $ulen; } } } } if (null === $encoding) { return $s; } return iconv('UTF-8', $encoding.'//IGNORE', $s); } public static function mb_internal_encoding($encoding = null) { if (null === $encoding) { return self::$internalEncoding; } $normalizedEncoding = self::getEncoding($encoding); if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) { self::$internalEncoding = $normalizedEncoding; return true; } if (80000 > \PHP_VERSION_ID) { return false; } throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); } public static function mb_language($lang = null) { if (null === $lang) { return self::$language; } switch ($normalizedLang = strtolower($lang)) { case 'uni': case 'neutral': self::$language = $normalizedLang; return true; } if (80000 > \PHP_VERSION_ID) { return false; } throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); } public static function mb_list_encodings() { return ['UTF-8']; } public static function mb_encoding_aliases($encoding) { switch (strtoupper($encoding)) { case 'UTF8': case 'UTF-8': return ['utf8']; } return false; } public static function mb_check_encoding($var = null, $encoding = null) { if (PHP_VERSION_ID < 70200 && \is_array($var)) { trigger_error('mb_check_encoding() expects parameter 1 to be string, array given', \E_USER_WARNING); return null; } if (null === $encoding) { if (null === $var) { return false; } $encoding = self::$internalEncoding; } if (!\is_array($var)) { return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); } foreach ($var as $key => $value) { if (!self::mb_check_encoding($key, $encoding)) { return false; } if (!self::mb_check_encoding($value, $encoding)) { return false; } } return true; } public static function mb_detect_encoding($str, $encodingList = null, $strict = false) { if (null === $encodingList) { $encodingList = self::$encodingList; } else { if (!\is_array($encodingList)) { $encodingList = array_map('trim', explode(',', $encodingList)); } $encodingList = array_map('strtoupper', $encodingList); } foreach ($encodingList as $enc) { switch ($enc) { case 'ASCII': if (!preg_match('/[\x80-\xFF]/', $str)) { return $enc; } break; case 'UTF8': case 'UTF-8': if (preg_match('//u', $str)) { return 'UTF-8'; } break; default: if (0 === strncmp($enc, 'ISO-8859-', 9)) { return $enc; } } } return false; } public static function mb_detect_order($encodingList = null) { if (null === $encodingList) { return self::$encodingList; } if (!\is_array($encodingList)) { $encodingList = array_map('trim', explode(',', $encodingList)); } $encodingList = array_map('strtoupper', $encodingList); foreach ($encodingList as $enc) { switch ($enc) { default: if (strncmp($enc, 'ISO-8859-', 9)) { return false; } // no break case 'ASCII': case 'UTF8': case 'UTF-8': } } self::$encodingList = $encodingList; return true; } public static function mb_strlen($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strlen($s); } return @iconv_strlen($s, $encoding); } public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return strpos($haystack, $needle, $offset); } $needle = (string) $needle; if ('' === $needle) { if (80000 > \PHP_VERSION_ID) { trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING); return false; } return 0; } return iconv_strpos($haystack, $needle, $offset, $encoding); } public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return strrpos($haystack, $needle, $offset); } if ($offset != (int) $offset) { $offset = 0; } elseif ($offset = (int) $offset) { if ($offset < 0) { if (0 > $offset += self::mb_strlen($needle)) { $haystack = self::mb_substr($haystack, 0, $offset, $encoding); } $offset = 0; } else { $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); } } $pos = '' !== $needle || 80000 > \PHP_VERSION_ID ? iconv_strrpos($haystack, $needle, $encoding) : self::mb_strlen($haystack, $encoding); return false !== $pos ? $offset + $pos : false; } public static function mb_str_split($string, $split_length = 1, $encoding = null) { if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); return null; } if (1 > $split_length = (int) $split_length) { if (80000 > \PHP_VERSION_ID) { trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); return false; } throw new \ValueError('Argument #2 ($length) must be greater than 0'); } if (null === $encoding) { $encoding = mb_internal_encoding(); } if ('UTF-8' === $encoding = self::getEncoding($encoding)) { $rx = '/('; while (65535 < $split_length) { $rx .= '.{65535}'; $split_length -= 65535; } $rx .= '.{'.$split_length.'})/us'; return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); } $result = []; $length = mb_strlen($string, $encoding); for ($i = 0; $i < $length; $i += $split_length) { $result[] = mb_substr($string, $i, $split_length, $encoding); } return $result; } public static function mb_strtolower($s, $encoding = null) { return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); } public static function mb_strtoupper($s, $encoding = null) { return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); } public static function mb_substitute_character($c = null) { if (null === $c) { return 'none'; } if (0 === strcasecmp($c, 'none')) { return true; } if (80000 > \PHP_VERSION_ID) { return false; } if (\is_int($c) || 'long' === $c || 'entity' === $c) { return false; } throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); } public static function mb_substr($s, $start, $length = null, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return (string) substr($s, $start, null === $length ? 2147483647 : $length); } if ($start < 0) { $start = iconv_strlen($s, $encoding) + $start; if ($start < 0) { $start = 0; } } if (null === $length) { $length = 2147483647; } elseif ($length < 0) { $length = iconv_strlen($s, $encoding) + $length - $start; if ($length < 0) { return ''; } } return (string) iconv_substr($s, $start, $length, $encoding); } public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { [$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [ self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding), self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding), ]); return self::mb_strpos($haystack, $needle, $offset, $encoding); } public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) { $pos = self::mb_stripos($haystack, $needle, 0, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { $pos = strrpos($haystack, $needle); } else { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = iconv_strrpos($haystack, $needle, $encoding); } return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = self::mb_strripos($haystack, $needle, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { $haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding); $needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding); $haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack); $needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle); return self::mb_strrpos($haystack, $needle, $offset, $encoding); } public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) { $pos = strpos($haystack, $needle); if (false === $pos) { return false; } if ($part) { return substr($haystack, 0, $pos); } return substr($haystack, $pos); } public static function mb_get_info($type = 'all') { $info = [ 'internal_encoding' => self::$internalEncoding, 'http_output' => 'pass', 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', 'func_overload' => 0, 'func_overload_list' => 'no overload', 'mail_charset' => 'UTF-8', 'mail_header_encoding' => 'BASE64', 'mail_body_encoding' => 'BASE64', 'illegal_chars' => 0, 'encoding_translation' => 'Off', 'language' => self::$language, 'detect_order' => self::$encodingList, 'substitute_character' => 'none', 'strict_detection' => 'Off', ]; if ('all' === $type) { return $info; } if (isset($info[$type])) { return $info[$type]; } return false; } public static function mb_http_input($type = '') { return false; } public static function mb_http_output($encoding = null) { return null !== $encoding ? 'pass' === $encoding : 'pass'; } public static function mb_strwidth($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('UTF-8' !== $encoding) { $s = iconv($encoding, 'UTF-8//IGNORE', $s); } $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); return ($wide << 1) + iconv_strlen($s, 'UTF-8'); } public static function mb_substr_count($haystack, $needle, $encoding = null) { return substr_count($haystack, $needle); } public static function mb_output_handler($contents, $status) { return $contents; } public static function mb_chr($code, $encoding = null) { if (0x80 > $code %= 0x200000) { $s = \chr($code); } elseif (0x800 > $code) { $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); } elseif (0x10000 > $code) { $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); } else { $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); } if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { $s = mb_convert_encoding($s, $encoding, 'UTF-8'); } return $s; } public static function mb_ord($s, $encoding = null) { if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { $s = mb_convert_encoding($s, 'UTF-8', $encoding); } if (1 === \strlen($s)) { return \ord($s); } $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; if (0xF0 <= $code) { return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; } if (0xE0 <= $code) { return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; } if (0xC0 <= $code) { return (($code - 0xC0) << 6) + $s[2] - 0x80; } return $code; } public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, string $encoding = null): string { if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); } if (null === $encoding) { $encoding = self::mb_internal_encoding(); } try { $validEncoding = @self::mb_check_encoding('', $encoding); } catch (\ValueError $e) { throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); } // BC for PHP 7.3 and lower if (!$validEncoding) { throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); } if (self::mb_strlen($pad_string, $encoding) <= 0) { throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); } $paddingRequired = $length - self::mb_strlen($string, $encoding); if ($paddingRequired < 1) { return $string; } switch ($pad_type) { case \STR_PAD_LEFT: return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string; case \STR_PAD_RIGHT: return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); default: $leftPaddingLength = floor($paddingRequired / 2); $rightPaddingLength = $paddingRequired - $leftPaddingLength; return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); } } private static function getSubpart($pos, $part, $haystack, $encoding) { if (false === $pos) { return false; } if ($part) { return self::mb_substr($haystack, 0, $pos, $encoding); } return self::mb_substr($haystack, $pos, null, $encoding); } private static function html_encoding_callback(array $m) { $i = 1; $entities = ''; $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); while (isset($m[$i])) { if (0x80 > $m[$i]) { $entities .= \chr($m[$i++]); continue; } if (0xF0 <= $m[$i]) { $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; } elseif (0xE0 <= $m[$i]) { $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; } else { $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; } $entities .= '&#'.$c.';'; } return $entities; } private static function title_case(array $s) { return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); } private static function getData($file) { if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { return require $file; } return false; } private static function getEncoding($encoding) { if (null === $encoding) { return self::$internalEncoding; } if ('UTF-8' === $encoding) { return 'UTF-8'; } $encoding = strtoupper($encoding); if ('8BIT' === $encoding || 'BINARY' === $encoding) { return 'CP850'; } if ('UTF8' === $encoding) { return 'UTF-8'; } return $encoding; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-mbstring/README.md ================================================ Symfony Polyfill / Mbstring =========================== This component provides a partial, native PHP implementation for the [Mbstring](https://php.net/mbstring) extension. More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= This library is released under the [MIT license](LICENSE). ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php ================================================ 'i̇', 'µ' => 'μ', 'ſ' => 's', 'ͅ' => 'ι', 'ς' => 'σ', 'ϐ' => 'β', 'ϑ' => 'θ', 'ϕ' => 'φ', 'ϖ' => 'π', 'ϰ' => 'κ', 'ϱ' => 'ρ', 'ϵ' => 'ε', 'ẛ' => 'ṡ', 'ι' => 'ι', 'ß' => 'ss', 'ʼn' => 'ʼn', 'ǰ' => 'ǰ', 'ΐ' => 'ΐ', 'ΰ' => 'ΰ', 'և' => 'եւ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'ẘ', 'ẙ' => 'ẙ', 'ẚ' => 'aʾ', 'ẞ' => 'ss', 'ὐ' => 'ὐ', 'ὒ' => 'ὒ', 'ὔ' => 'ὔ', 'ὖ' => 'ὖ', 'ᾀ' => 'ἀι', 'ᾁ' => 'ἁι', 'ᾂ' => 'ἂι', 'ᾃ' => 'ἃι', 'ᾄ' => 'ἄι', 'ᾅ' => 'ἅι', 'ᾆ' => 'ἆι', 'ᾇ' => 'ἇι', 'ᾈ' => 'ἀι', 'ᾉ' => 'ἁι', 'ᾊ' => 'ἂι', 'ᾋ' => 'ἃι', 'ᾌ' => 'ἄι', 'ᾍ' => 'ἅι', 'ᾎ' => 'ἆι', 'ᾏ' => 'ἇι', 'ᾐ' => 'ἠι', 'ᾑ' => 'ἡι', 'ᾒ' => 'ἢι', 'ᾓ' => 'ἣι', 'ᾔ' => 'ἤι', 'ᾕ' => 'ἥι', 'ᾖ' => 'ἦι', 'ᾗ' => 'ἧι', 'ᾘ' => 'ἠι', 'ᾙ' => 'ἡι', 'ᾚ' => 'ἢι', 'ᾛ' => 'ἣι', 'ᾜ' => 'ἤι', 'ᾝ' => 'ἥι', 'ᾞ' => 'ἦι', 'ᾟ' => 'ἧι', 'ᾠ' => 'ὠι', 'ᾡ' => 'ὡι', 'ᾢ' => 'ὢι', 'ᾣ' => 'ὣι', 'ᾤ' => 'ὤι', 'ᾥ' => 'ὥι', 'ᾦ' => 'ὦι', 'ᾧ' => 'ὧι', 'ᾨ' => 'ὠι', 'ᾩ' => 'ὡι', 'ᾪ' => 'ὢι', 'ᾫ' => 'ὣι', 'ᾬ' => 'ὤι', 'ᾭ' => 'ὥι', 'ᾮ' => 'ὦι', 'ᾯ' => 'ὧι', 'ᾲ' => 'ὰι', 'ᾳ' => 'αι', 'ᾴ' => 'άι', 'ᾶ' => 'ᾶ', 'ᾷ' => 'ᾶι', 'ᾼ' => 'αι', 'ῂ' => 'ὴι', 'ῃ' => 'ηι', 'ῄ' => 'ήι', 'ῆ' => 'ῆ', 'ῇ' => 'ῆι', 'ῌ' => 'ηι', 'ῒ' => 'ῒ', 'ῖ' => 'ῖ', 'ῗ' => 'ῗ', 'ῢ' => 'ῢ', 'ῤ' => 'ῤ', 'ῦ' => 'ῦ', 'ῧ' => 'ῧ', 'ῲ' => 'ὼι', 'ῳ' => 'ωι', 'ῴ' => 'ώι', 'ῶ' => 'ῶ', 'ῷ' => 'ῶι', 'ῼ' => 'ωι', 'ff' => 'ff', 'fi' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'մն', 'ﬔ' => 'մե', 'ﬕ' => 'մի', 'ﬖ' => 'վն', 'ﬗ' => 'մխ', ]; ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php ================================================ 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', 'À' => 'à', 'Á' => 'á', 'Â' => 'â', 'Ã' => 'ã', 'Ä' => 'ä', 'Å' => 'å', 'Æ' => 'æ', 'Ç' => 'ç', 'È' => 'è', 'É' => 'é', 'Ê' => 'ê', 'Ë' => 'ë', 'Ì' => 'ì', 'Í' => 'í', 'Î' => 'î', 'Ï' => 'ï', 'Ð' => 'ð', 'Ñ' => 'ñ', 'Ò' => 'ò', 'Ó' => 'ó', 'Ô' => 'ô', 'Õ' => 'õ', 'Ö' => 'ö', 'Ø' => 'ø', 'Ù' => 'ù', 'Ú' => 'ú', 'Û' => 'û', 'Ü' => 'ü', 'Ý' => 'ý', 'Þ' => 'þ', 'Ā' => 'ā', 'Ă' => 'ă', 'Ą' => 'ą', 'Ć' => 'ć', 'Ĉ' => 'ĉ', 'Ċ' => 'ċ', 'Č' => 'č', 'Ď' => 'ď', 'Đ' => 'đ', 'Ē' => 'ē', 'Ĕ' => 'ĕ', 'Ė' => 'ė', 'Ę' => 'ę', 'Ě' => 'ě', 'Ĝ' => 'ĝ', 'Ğ' => 'ğ', 'Ġ' => 'ġ', 'Ģ' => 'ģ', 'Ĥ' => 'ĥ', 'Ħ' => 'ħ', 'Ĩ' => 'ĩ', 'Ī' => 'ī', 'Ĭ' => 'ĭ', 'Į' => 'į', 'İ' => 'i̇', 'IJ' => 'ij', 'Ĵ' => 'ĵ', 'Ķ' => 'ķ', 'Ĺ' => 'ĺ', 'Ļ' => 'ļ', 'Ľ' => 'ľ', 'Ŀ' => 'ŀ', 'Ł' => 'ł', 'Ń' => 'ń', 'Ņ' => 'ņ', 'Ň' => 'ň', 'Ŋ' => 'ŋ', 'Ō' => 'ō', 'Ŏ' => 'ŏ', 'Ő' => 'ő', 'Œ' => 'œ', 'Ŕ' => 'ŕ', 'Ŗ' => 'ŗ', 'Ř' => 'ř', 'Ś' => 'ś', 'Ŝ' => 'ŝ', 'Ş' => 'ş', 'Š' => 'š', 'Ţ' => 'ţ', 'Ť' => 'ť', 'Ŧ' => 'ŧ', 'Ũ' => 'ũ', 'Ū' => 'ū', 'Ŭ' => 'ŭ', 'Ů' => 'ů', 'Ű' => 'ű', 'Ų' => 'ų', 'Ŵ' => 'ŵ', 'Ŷ' => 'ŷ', 'Ÿ' => 'ÿ', 'Ź' => 'ź', 'Ż' => 'ż', 'Ž' => 'ž', 'Ɓ' => 'ɓ', 'Ƃ' => 'ƃ', 'Ƅ' => 'ƅ', 'Ɔ' => 'ɔ', 'Ƈ' => 'ƈ', 'Ɖ' => 'ɖ', 'Ɗ' => 'ɗ', 'Ƌ' => 'ƌ', 'Ǝ' => 'ǝ', 'Ə' => 'ə', 'Ɛ' => 'ɛ', 'Ƒ' => 'ƒ', 'Ɠ' => 'ɠ', 'Ɣ' => 'ɣ', 'Ɩ' => 'ɩ', 'Ɨ' => 'ɨ', 'Ƙ' => 'ƙ', 'Ɯ' => 'ɯ', 'Ɲ' => 'ɲ', 'Ɵ' => 'ɵ', 'Ơ' => 'ơ', 'Ƣ' => 'ƣ', 'Ƥ' => 'ƥ', 'Ʀ' => 'ʀ', 'Ƨ' => 'ƨ', 'Ʃ' => 'ʃ', 'Ƭ' => 'ƭ', 'Ʈ' => 'ʈ', 'Ư' => 'ư', 'Ʊ' => 'ʊ', 'Ʋ' => 'ʋ', 'Ƴ' => 'ƴ', 'Ƶ' => 'ƶ', 'Ʒ' => 'ʒ', 'Ƹ' => 'ƹ', 'Ƽ' => 'ƽ', 'DŽ' => 'dž', 'Dž' => 'dž', 'LJ' => 'lj', 'Lj' => 'lj', 'NJ' => 'nj', 'Nj' => 'nj', 'Ǎ' => 'ǎ', 'Ǐ' => 'ǐ', 'Ǒ' => 'ǒ', 'Ǔ' => 'ǔ', 'Ǖ' => 'ǖ', 'Ǘ' => 'ǘ', 'Ǚ' => 'ǚ', 'Ǜ' => 'ǜ', 'Ǟ' => 'ǟ', 'Ǡ' => 'ǡ', 'Ǣ' => 'ǣ', 'Ǥ' => 'ǥ', 'Ǧ' => 'ǧ', 'Ǩ' => 'ǩ', 'Ǫ' => 'ǫ', 'Ǭ' => 'ǭ', 'Ǯ' => 'ǯ', 'DZ' => 'dz', 'Dz' => 'dz', 'Ǵ' => 'ǵ', 'Ƕ' => 'ƕ', 'Ƿ' => 'ƿ', 'Ǹ' => 'ǹ', 'Ǻ' => 'ǻ', 'Ǽ' => 'ǽ', 'Ǿ' => 'ǿ', 'Ȁ' => 'ȁ', 'Ȃ' => 'ȃ', 'Ȅ' => 'ȅ', 'Ȇ' => 'ȇ', 'Ȉ' => 'ȉ', 'Ȋ' => 'ȋ', 'Ȍ' => 'ȍ', 'Ȏ' => 'ȏ', 'Ȑ' => 'ȑ', 'Ȓ' => 'ȓ', 'Ȕ' => 'ȕ', 'Ȗ' => 'ȗ', 'Ș' => 'ș', 'Ț' => 'ț', 'Ȝ' => 'ȝ', 'Ȟ' => 'ȟ', 'Ƞ' => 'ƞ', 'Ȣ' => 'ȣ', 'Ȥ' => 'ȥ', 'Ȧ' => 'ȧ', 'Ȩ' => 'ȩ', 'Ȫ' => 'ȫ', 'Ȭ' => 'ȭ', 'Ȯ' => 'ȯ', 'Ȱ' => 'ȱ', 'Ȳ' => 'ȳ', 'Ⱥ' => 'ⱥ', 'Ȼ' => 'ȼ', 'Ƚ' => 'ƚ', 'Ⱦ' => 'ⱦ', 'Ɂ' => 'ɂ', 'Ƀ' => 'ƀ', 'Ʉ' => 'ʉ', 'Ʌ' => 'ʌ', 'Ɇ' => 'ɇ', 'Ɉ' => 'ɉ', 'Ɋ' => 'ɋ', 'Ɍ' => 'ɍ', 'Ɏ' => 'ɏ', 'Ͱ' => 'ͱ', 'Ͳ' => 'ͳ', 'Ͷ' => 'ͷ', 'Ϳ' => 'ϳ', 'Ά' => 'ά', 'Έ' => 'έ', 'Ή' => 'ή', 'Ί' => 'ί', 'Ό' => 'ό', 'Ύ' => 'ύ', 'Ώ' => 'ώ', 'Α' => 'α', 'Β' => 'β', 'Γ' => 'γ', 'Δ' => 'δ', 'Ε' => 'ε', 'Ζ' => 'ζ', 'Η' => 'η', 'Θ' => 'θ', 'Ι' => 'ι', 'Κ' => 'κ', 'Λ' => 'λ', 'Μ' => 'μ', 'Ν' => 'ν', 'Ξ' => 'ξ', 'Ο' => 'ο', 'Π' => 'π', 'Ρ' => 'ρ', 'Σ' => 'σ', 'Τ' => 'τ', 'Υ' => 'υ', 'Φ' => 'φ', 'Χ' => 'χ', 'Ψ' => 'ψ', 'Ω' => 'ω', 'Ϊ' => 'ϊ', 'Ϋ' => 'ϋ', 'Ϗ' => 'ϗ', 'Ϙ' => 'ϙ', 'Ϛ' => 'ϛ', 'Ϝ' => 'ϝ', 'Ϟ' => 'ϟ', 'Ϡ' => 'ϡ', 'Ϣ' => 'ϣ', 'Ϥ' => 'ϥ', 'Ϧ' => 'ϧ', 'Ϩ' => 'ϩ', 'Ϫ' => 'ϫ', 'Ϭ' => 'ϭ', 'Ϯ' => 'ϯ', 'ϴ' => 'θ', 'Ϸ' => 'ϸ', 'Ϲ' => 'ϲ', 'Ϻ' => 'ϻ', 'Ͻ' => 'ͻ', 'Ͼ' => 'ͼ', 'Ͽ' => 'ͽ', 'Ѐ' => 'ѐ', 'Ё' => 'ё', 'Ђ' => 'ђ', 'Ѓ' => 'ѓ', 'Є' => 'є', 'Ѕ' => 'ѕ', 'І' => 'і', 'Ї' => 'ї', 'Ј' => 'ј', 'Љ' => 'љ', 'Њ' => 'њ', 'Ћ' => 'ћ', 'Ќ' => 'ќ', 'Ѝ' => 'ѝ', 'Ў' => 'ў', 'Џ' => 'џ', 'А' => 'а', 'Б' => 'б', 'В' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'М' => 'м', 'Н' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'р', 'С' => 'с', 'Т' => 'т', 'У' => 'у', 'Ф' => 'ф', 'Х' => 'х', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ъ' => 'ъ', 'Ы' => 'ы', 'Ь' => 'ь', 'Э' => 'э', 'Ю' => 'ю', 'Я' => 'я', 'Ѡ' => 'ѡ', 'Ѣ' => 'ѣ', 'Ѥ' => 'ѥ', 'Ѧ' => 'ѧ', 'Ѩ' => 'ѩ', 'Ѫ' => 'ѫ', 'Ѭ' => 'ѭ', 'Ѯ' => 'ѯ', 'Ѱ' => 'ѱ', 'Ѳ' => 'ѳ', 'Ѵ' => 'ѵ', 'Ѷ' => 'ѷ', 'Ѹ' => 'ѹ', 'Ѻ' => 'ѻ', 'Ѽ' => 'ѽ', 'Ѿ' => 'ѿ', 'Ҁ' => 'ҁ', 'Ҋ' => 'ҋ', 'Ҍ' => 'ҍ', 'Ҏ' => 'ҏ', 'Ґ' => 'ґ', 'Ғ' => 'ғ', 'Ҕ' => 'ҕ', 'Җ' => 'җ', 'Ҙ' => 'ҙ', 'Қ' => 'қ', 'Ҝ' => 'ҝ', 'Ҟ' => 'ҟ', 'Ҡ' => 'ҡ', 'Ң' => 'ң', 'Ҥ' => 'ҥ', 'Ҧ' => 'ҧ', 'Ҩ' => 'ҩ', 'Ҫ' => 'ҫ', 'Ҭ' => 'ҭ', 'Ү' => 'ү', 'Ұ' => 'ұ', 'Ҳ' => 'ҳ', 'Ҵ' => 'ҵ', 'Ҷ' => 'ҷ', 'Ҹ' => 'ҹ', 'Һ' => 'һ', 'Ҽ' => 'ҽ', 'Ҿ' => 'ҿ', 'Ӏ' => 'ӏ', 'Ӂ' => 'ӂ', 'Ӄ' => 'ӄ', 'Ӆ' => 'ӆ', 'Ӈ' => 'ӈ', 'Ӊ' => 'ӊ', 'Ӌ' => 'ӌ', 'Ӎ' => 'ӎ', 'Ӑ' => 'ӑ', 'Ӓ' => 'ӓ', 'Ӕ' => 'ӕ', 'Ӗ' => 'ӗ', 'Ә' => 'ә', 'Ӛ' => 'ӛ', 'Ӝ' => 'ӝ', 'Ӟ' => 'ӟ', 'Ӡ' => 'ӡ', 'Ӣ' => 'ӣ', 'Ӥ' => 'ӥ', 'Ӧ' => 'ӧ', 'Ө' => 'ө', 'Ӫ' => 'ӫ', 'Ӭ' => 'ӭ', 'Ӯ' => 'ӯ', 'Ӱ' => 'ӱ', 'Ӳ' => 'ӳ', 'Ӵ' => 'ӵ', 'Ӷ' => 'ӷ', 'Ӹ' => 'ӹ', 'Ӻ' => 'ӻ', 'Ӽ' => 'ӽ', 'Ӿ' => 'ӿ', 'Ԁ' => 'ԁ', 'Ԃ' => 'ԃ', 'Ԅ' => 'ԅ', 'Ԇ' => 'ԇ', 'Ԉ' => 'ԉ', 'Ԋ' => 'ԋ', 'Ԍ' => 'ԍ', 'Ԏ' => 'ԏ', 'Ԑ' => 'ԑ', 'Ԓ' => 'ԓ', 'Ԕ' => 'ԕ', 'Ԗ' => 'ԗ', 'Ԙ' => 'ԙ', 'Ԛ' => 'ԛ', 'Ԝ' => 'ԝ', 'Ԟ' => 'ԟ', 'Ԡ' => 'ԡ', 'Ԣ' => 'ԣ', 'Ԥ' => 'ԥ', 'Ԧ' => 'ԧ', 'Ԩ' => 'ԩ', 'Ԫ' => 'ԫ', 'Ԭ' => 'ԭ', 'Ԯ' => 'ԯ', 'Ա' => 'ա', 'Բ' => 'բ', 'Գ' => 'գ', 'Դ' => 'դ', 'Ե' => 'ե', 'Զ' => 'զ', 'Է' => 'է', 'Ը' => 'ը', 'Թ' => 'թ', 'Ժ' => 'ժ', 'Ի' => 'ի', 'Լ' => 'լ', 'Խ' => 'խ', 'Ծ' => 'ծ', 'Կ' => 'կ', 'Հ' => 'հ', 'Ձ' => 'ձ', 'Ղ' => 'ղ', 'Ճ' => 'ճ', 'Մ' => 'մ', 'Յ' => 'յ', 'Ն' => 'ն', 'Շ' => 'շ', 'Ո' => 'ո', 'Չ' => 'չ', 'Պ' => 'պ', 'Ջ' => 'ջ', 'Ռ' => 'ռ', 'Ս' => 'ս', 'Վ' => 'վ', 'Տ' => 'տ', 'Ր' => 'ր', 'Ց' => 'ց', 'Ւ' => 'ւ', 'Փ' => 'փ', 'Ք' => 'ք', 'Օ' => 'օ', 'Ֆ' => 'ֆ', 'Ⴀ' => 'ⴀ', 'Ⴁ' => 'ⴁ', 'Ⴂ' => 'ⴂ', 'Ⴃ' => 'ⴃ', 'Ⴄ' => 'ⴄ', 'Ⴅ' => 'ⴅ', 'Ⴆ' => 'ⴆ', 'Ⴇ' => 'ⴇ', 'Ⴈ' => 'ⴈ', 'Ⴉ' => 'ⴉ', 'Ⴊ' => 'ⴊ', 'Ⴋ' => 'ⴋ', 'Ⴌ' => 'ⴌ', 'Ⴍ' => 'ⴍ', 'Ⴎ' => 'ⴎ', 'Ⴏ' => 'ⴏ', 'Ⴐ' => 'ⴐ', 'Ⴑ' => 'ⴑ', 'Ⴒ' => 'ⴒ', 'Ⴓ' => 'ⴓ', 'Ⴔ' => 'ⴔ', 'Ⴕ' => 'ⴕ', 'Ⴖ' => 'ⴖ', 'Ⴗ' => 'ⴗ', 'Ⴘ' => 'ⴘ', 'Ⴙ' => 'ⴙ', 'Ⴚ' => 'ⴚ', 'Ⴛ' => 'ⴛ', 'Ⴜ' => 'ⴜ', 'Ⴝ' => 'ⴝ', 'Ⴞ' => 'ⴞ', 'Ⴟ' => 'ⴟ', 'Ⴠ' => 'ⴠ', 'Ⴡ' => 'ⴡ', 'Ⴢ' => 'ⴢ', 'Ⴣ' => 'ⴣ', 'Ⴤ' => 'ⴤ', 'Ⴥ' => 'ⴥ', 'Ⴧ' => 'ⴧ', 'Ⴭ' => 'ⴭ', 'Ꭰ' => 'ꭰ', 'Ꭱ' => 'ꭱ', 'Ꭲ' => 'ꭲ', 'Ꭳ' => 'ꭳ', 'Ꭴ' => 'ꭴ', 'Ꭵ' => 'ꭵ', 'Ꭶ' => 'ꭶ', 'Ꭷ' => 'ꭷ', 'Ꭸ' => 'ꭸ', 'Ꭹ' => 'ꭹ', 'Ꭺ' => 'ꭺ', 'Ꭻ' => 'ꭻ', 'Ꭼ' => 'ꭼ', 'Ꭽ' => 'ꭽ', 'Ꭾ' => 'ꭾ', 'Ꭿ' => 'ꭿ', 'Ꮀ' => 'ꮀ', 'Ꮁ' => 'ꮁ', 'Ꮂ' => 'ꮂ', 'Ꮃ' => 'ꮃ', 'Ꮄ' => 'ꮄ', 'Ꮅ' => 'ꮅ', 'Ꮆ' => 'ꮆ', 'Ꮇ' => 'ꮇ', 'Ꮈ' => 'ꮈ', 'Ꮉ' => 'ꮉ', 'Ꮊ' => 'ꮊ', 'Ꮋ' => 'ꮋ', 'Ꮌ' => 'ꮌ', 'Ꮍ' => 'ꮍ', 'Ꮎ' => 'ꮎ', 'Ꮏ' => 'ꮏ', 'Ꮐ' => 'ꮐ', 'Ꮑ' => 'ꮑ', 'Ꮒ' => 'ꮒ', 'Ꮓ' => 'ꮓ', 'Ꮔ' => 'ꮔ', 'Ꮕ' => 'ꮕ', 'Ꮖ' => 'ꮖ', 'Ꮗ' => 'ꮗ', 'Ꮘ' => 'ꮘ', 'Ꮙ' => 'ꮙ', 'Ꮚ' => 'ꮚ', 'Ꮛ' => 'ꮛ', 'Ꮜ' => 'ꮜ', 'Ꮝ' => 'ꮝ', 'Ꮞ' => 'ꮞ', 'Ꮟ' => 'ꮟ', 'Ꮠ' => 'ꮠ', 'Ꮡ' => 'ꮡ', 'Ꮢ' => 'ꮢ', 'Ꮣ' => 'ꮣ', 'Ꮤ' => 'ꮤ', 'Ꮥ' => 'ꮥ', 'Ꮦ' => 'ꮦ', 'Ꮧ' => 'ꮧ', 'Ꮨ' => 'ꮨ', 'Ꮩ' => 'ꮩ', 'Ꮪ' => 'ꮪ', 'Ꮫ' => 'ꮫ', 'Ꮬ' => 'ꮬ', 'Ꮭ' => 'ꮭ', 'Ꮮ' => 'ꮮ', 'Ꮯ' => 'ꮯ', 'Ꮰ' => 'ꮰ', 'Ꮱ' => 'ꮱ', 'Ꮲ' => 'ꮲ', 'Ꮳ' => 'ꮳ', 'Ꮴ' => 'ꮴ', 'Ꮵ' => 'ꮵ', 'Ꮶ' => 'ꮶ', 'Ꮷ' => 'ꮷ', 'Ꮸ' => 'ꮸ', 'Ꮹ' => 'ꮹ', 'Ꮺ' => 'ꮺ', 'Ꮻ' => 'ꮻ', 'Ꮼ' => 'ꮼ', 'Ꮽ' => 'ꮽ', 'Ꮾ' => 'ꮾ', 'Ꮿ' => 'ꮿ', 'Ᏸ' => 'ᏸ', 'Ᏹ' => 'ᏹ', 'Ᏺ' => 'ᏺ', 'Ᏻ' => 'ᏻ', 'Ᏼ' => 'ᏼ', 'Ᏽ' => 'ᏽ', 'Ა' => 'ა', 'Ბ' => 'ბ', 'Გ' => 'გ', 'Დ' => 'დ', 'Ე' => 'ე', 'Ვ' => 'ვ', 'Ზ' => 'ზ', 'Თ' => 'თ', 'Ი' => 'ი', 'Კ' => 'კ', 'Ლ' => 'ლ', 'Მ' => 'მ', 'Ნ' => 'ნ', 'Ო' => 'ო', 'Პ' => 'პ', 'Ჟ' => 'ჟ', 'Რ' => 'რ', 'Ს' => 'ს', 'Ტ' => 'ტ', 'Უ' => 'უ', 'Ფ' => 'ფ', 'Ქ' => 'ქ', 'Ღ' => 'ღ', 'Ყ' => 'ყ', 'Შ' => 'შ', 'Ჩ' => 'ჩ', 'Ც' => 'ც', 'Ძ' => 'ძ', 'Წ' => 'წ', 'Ჭ' => 'ჭ', 'Ხ' => 'ხ', 'Ჯ' => 'ჯ', 'Ჰ' => 'ჰ', 'Ჱ' => 'ჱ', 'Ჲ' => 'ჲ', 'Ჳ' => 'ჳ', 'Ჴ' => 'ჴ', 'Ჵ' => 'ჵ', 'Ჶ' => 'ჶ', 'Ჷ' => 'ჷ', 'Ჸ' => 'ჸ', 'Ჹ' => 'ჹ', 'Ჺ' => 'ჺ', 'Ჽ' => 'ჽ', 'Ჾ' => 'ჾ', 'Ჿ' => 'ჿ', 'Ḁ' => 'ḁ', 'Ḃ' => 'ḃ', 'Ḅ' => 'ḅ', 'Ḇ' => 'ḇ', 'Ḉ' => 'ḉ', 'Ḋ' => 'ḋ', 'Ḍ' => 'ḍ', 'Ḏ' => 'ḏ', 'Ḑ' => 'ḑ', 'Ḓ' => 'ḓ', 'Ḕ' => 'ḕ', 'Ḗ' => 'ḗ', 'Ḙ' => 'ḙ', 'Ḛ' => 'ḛ', 'Ḝ' => 'ḝ', 'Ḟ' => 'ḟ', 'Ḡ' => 'ḡ', 'Ḣ' => 'ḣ', 'Ḥ' => 'ḥ', 'Ḧ' => 'ḧ', 'Ḩ' => 'ḩ', 'Ḫ' => 'ḫ', 'Ḭ' => 'ḭ', 'Ḯ' => 'ḯ', 'Ḱ' => 'ḱ', 'Ḳ' => 'ḳ', 'Ḵ' => 'ḵ', 'Ḷ' => 'ḷ', 'Ḹ' => 'ḹ', 'Ḻ' => 'ḻ', 'Ḽ' => 'ḽ', 'Ḿ' => 'ḿ', 'Ṁ' => 'ṁ', 'Ṃ' => 'ṃ', 'Ṅ' => 'ṅ', 'Ṇ' => 'ṇ', 'Ṉ' => 'ṉ', 'Ṋ' => 'ṋ', 'Ṍ' => 'ṍ', 'Ṏ' => 'ṏ', 'Ṑ' => 'ṑ', 'Ṓ' => 'ṓ', 'Ṕ' => 'ṕ', 'Ṗ' => 'ṗ', 'Ṙ' => 'ṙ', 'Ṛ' => 'ṛ', 'Ṝ' => 'ṝ', 'Ṟ' => 'ṟ', 'Ṡ' => 'ṡ', 'Ṣ' => 'ṣ', 'Ṥ' => 'ṥ', 'Ṧ' => 'ṧ', 'Ṩ' => 'ṩ', 'Ṫ' => 'ṫ', 'Ṭ' => 'ṭ', 'Ṯ' => 'ṯ', 'Ṱ' => 'ṱ', 'Ṳ' => 'ṳ', 'Ṵ' => 'ṵ', 'Ṷ' => 'ṷ', 'Ṹ' => 'ṹ', 'Ṻ' => 'ṻ', 'Ṽ' => 'ṽ', 'Ṿ' => 'ṿ', 'Ẁ' => 'ẁ', 'Ẃ' => 'ẃ', 'Ẅ' => 'ẅ', 'Ẇ' => 'ẇ', 'Ẉ' => 'ẉ', 'Ẋ' => 'ẋ', 'Ẍ' => 'ẍ', 'Ẏ' => 'ẏ', 'Ẑ' => 'ẑ', 'Ẓ' => 'ẓ', 'Ẕ' => 'ẕ', 'ẞ' => 'ß', 'Ạ' => 'ạ', 'Ả' => 'ả', 'Ấ' => 'ấ', 'Ầ' => 'ầ', 'Ẩ' => 'ẩ', 'Ẫ' => 'ẫ', 'Ậ' => 'ậ', 'Ắ' => 'ắ', 'Ằ' => 'ằ', 'Ẳ' => 'ẳ', 'Ẵ' => 'ẵ', 'Ặ' => 'ặ', 'Ẹ' => 'ẹ', 'Ẻ' => 'ẻ', 'Ẽ' => 'ẽ', 'Ế' => 'ế', 'Ề' => 'ề', 'Ể' => 'ể', 'Ễ' => 'ễ', 'Ệ' => 'ệ', 'Ỉ' => 'ỉ', 'Ị' => 'ị', 'Ọ' => 'ọ', 'Ỏ' => 'ỏ', 'Ố' => 'ố', 'Ồ' => 'ồ', 'Ổ' => 'ổ', 'Ỗ' => 'ỗ', 'Ộ' => 'ộ', 'Ớ' => 'ớ', 'Ờ' => 'ờ', 'Ở' => 'ở', 'Ỡ' => 'ỡ', 'Ợ' => 'ợ', 'Ụ' => 'ụ', 'Ủ' => 'ủ', 'Ứ' => 'ứ', 'Ừ' => 'ừ', 'Ử' => 'ử', 'Ữ' => 'ữ', 'Ự' => 'ự', 'Ỳ' => 'ỳ', 'Ỵ' => 'ỵ', 'Ỷ' => 'ỷ', 'Ỹ' => 'ỹ', 'Ỻ' => 'ỻ', 'Ỽ' => 'ỽ', 'Ỿ' => 'ỿ', 'Ἀ' => 'ἀ', 'Ἁ' => 'ἁ', 'Ἂ' => 'ἂ', 'Ἃ' => 'ἃ', 'Ἄ' => 'ἄ', 'Ἅ' => 'ἅ', 'Ἆ' => 'ἆ', 'Ἇ' => 'ἇ', 'Ἐ' => 'ἐ', 'Ἑ' => 'ἑ', 'Ἒ' => 'ἒ', 'Ἓ' => 'ἓ', 'Ἔ' => 'ἔ', 'Ἕ' => 'ἕ', 'Ἠ' => 'ἠ', 'Ἡ' => 'ἡ', 'Ἢ' => 'ἢ', 'Ἣ' => 'ἣ', 'Ἤ' => 'ἤ', 'Ἥ' => 'ἥ', 'Ἦ' => 'ἦ', 'Ἧ' => 'ἧ', 'Ἰ' => 'ἰ', 'Ἱ' => 'ἱ', 'Ἲ' => 'ἲ', 'Ἳ' => 'ἳ', 'Ἴ' => 'ἴ', 'Ἵ' => 'ἵ', 'Ἶ' => 'ἶ', 'Ἷ' => 'ἷ', 'Ὀ' => 'ὀ', 'Ὁ' => 'ὁ', 'Ὂ' => 'ὂ', 'Ὃ' => 'ὃ', 'Ὄ' => 'ὄ', 'Ὅ' => 'ὅ', 'Ὑ' => 'ὑ', 'Ὓ' => 'ὓ', 'Ὕ' => 'ὕ', 'Ὗ' => 'ὗ', 'Ὠ' => 'ὠ', 'Ὡ' => 'ὡ', 'Ὢ' => 'ὢ', 'Ὣ' => 'ὣ', 'Ὤ' => 'ὤ', 'Ὥ' => 'ὥ', 'Ὦ' => 'ὦ', 'Ὧ' => 'ὧ', 'ᾈ' => 'ᾀ', 'ᾉ' => 'ᾁ', 'ᾊ' => 'ᾂ', 'ᾋ' => 'ᾃ', 'ᾌ' => 'ᾄ', 'ᾍ' => 'ᾅ', 'ᾎ' => 'ᾆ', 'ᾏ' => 'ᾇ', 'ᾘ' => 'ᾐ', 'ᾙ' => 'ᾑ', 'ᾚ' => 'ᾒ', 'ᾛ' => 'ᾓ', 'ᾜ' => 'ᾔ', 'ᾝ' => 'ᾕ', 'ᾞ' => 'ᾖ', 'ᾟ' => 'ᾗ', 'ᾨ' => 'ᾠ', 'ᾩ' => 'ᾡ', 'ᾪ' => 'ᾢ', 'ᾫ' => 'ᾣ', 'ᾬ' => 'ᾤ', 'ᾭ' => 'ᾥ', 'ᾮ' => 'ᾦ', 'ᾯ' => 'ᾧ', 'Ᾰ' => 'ᾰ', 'Ᾱ' => 'ᾱ', 'Ὰ' => 'ὰ', 'Ά' => 'ά', 'ᾼ' => 'ᾳ', 'Ὲ' => 'ὲ', 'Έ' => 'έ', 'Ὴ' => 'ὴ', 'Ή' => 'ή', 'ῌ' => 'ῃ', 'Ῐ' => 'ῐ', 'Ῑ' => 'ῑ', 'Ὶ' => 'ὶ', 'Ί' => 'ί', 'Ῠ' => 'ῠ', 'Ῡ' => 'ῡ', 'Ὺ' => 'ὺ', 'Ύ' => 'ύ', 'Ῥ' => 'ῥ', 'Ὸ' => 'ὸ', 'Ό' => 'ό', 'Ὼ' => 'ὼ', 'Ώ' => 'ώ', 'ῼ' => 'ῳ', 'Ω' => 'ω', 'K' => 'k', 'Å' => 'å', 'Ⅎ' => 'ⅎ', 'Ⅰ' => 'ⅰ', 'Ⅱ' => 'ⅱ', 'Ⅲ' => 'ⅲ', 'Ⅳ' => 'ⅳ', 'Ⅴ' => 'ⅴ', 'Ⅵ' => 'ⅵ', 'Ⅶ' => 'ⅶ', 'Ⅷ' => 'ⅷ', 'Ⅸ' => 'ⅸ', 'Ⅹ' => 'ⅹ', 'Ⅺ' => 'ⅺ', 'Ⅻ' => 'ⅻ', 'Ⅼ' => 'ⅼ', 'Ⅽ' => 'ⅽ', 'Ⅾ' => 'ⅾ', 'Ⅿ' => 'ⅿ', 'Ↄ' => 'ↄ', 'Ⓐ' => 'ⓐ', 'Ⓑ' => 'ⓑ', 'Ⓒ' => 'ⓒ', 'Ⓓ' => 'ⓓ', 'Ⓔ' => 'ⓔ', 'Ⓕ' => 'ⓕ', 'Ⓖ' => 'ⓖ', 'Ⓗ' => 'ⓗ', 'Ⓘ' => 'ⓘ', 'Ⓙ' => 'ⓙ', 'Ⓚ' => 'ⓚ', 'Ⓛ' => 'ⓛ', 'Ⓜ' => 'ⓜ', 'Ⓝ' => 'ⓝ', 'Ⓞ' => 'ⓞ', 'Ⓟ' => 'ⓟ', 'Ⓠ' => 'ⓠ', 'Ⓡ' => 'ⓡ', 'Ⓢ' => 'ⓢ', 'Ⓣ' => 'ⓣ', 'Ⓤ' => 'ⓤ', 'Ⓥ' => 'ⓥ', 'Ⓦ' => 'ⓦ', 'Ⓧ' => 'ⓧ', 'Ⓨ' => 'ⓨ', 'Ⓩ' => 'ⓩ', 'Ⰰ' => 'ⰰ', 'Ⰱ' => 'ⰱ', 'Ⰲ' => 'ⰲ', 'Ⰳ' => 'ⰳ', 'Ⰴ' => 'ⰴ', 'Ⰵ' => 'ⰵ', 'Ⰶ' => 'ⰶ', 'Ⰷ' => 'ⰷ', 'Ⰸ' => 'ⰸ', 'Ⰹ' => 'ⰹ', 'Ⰺ' => 'ⰺ', 'Ⰻ' => 'ⰻ', 'Ⰼ' => 'ⰼ', 'Ⰽ' => 'ⰽ', 'Ⰾ' => 'ⰾ', 'Ⰿ' => 'ⰿ', 'Ⱀ' => 'ⱀ', 'Ⱁ' => 'ⱁ', 'Ⱂ' => 'ⱂ', 'Ⱃ' => 'ⱃ', 'Ⱄ' => 'ⱄ', 'Ⱅ' => 'ⱅ', 'Ⱆ' => 'ⱆ', 'Ⱇ' => 'ⱇ', 'Ⱈ' => 'ⱈ', 'Ⱉ' => 'ⱉ', 'Ⱊ' => 'ⱊ', 'Ⱋ' => 'ⱋ', 'Ⱌ' => 'ⱌ', 'Ⱍ' => 'ⱍ', 'Ⱎ' => 'ⱎ', 'Ⱏ' => 'ⱏ', 'Ⱐ' => 'ⱐ', 'Ⱑ' => 'ⱑ', 'Ⱒ' => 'ⱒ', 'Ⱓ' => 'ⱓ', 'Ⱔ' => 'ⱔ', 'Ⱕ' => 'ⱕ', 'Ⱖ' => 'ⱖ', 'Ⱗ' => 'ⱗ', 'Ⱘ' => 'ⱘ', 'Ⱙ' => 'ⱙ', 'Ⱚ' => 'ⱚ', 'Ⱛ' => 'ⱛ', 'Ⱜ' => 'ⱜ', 'Ⱝ' => 'ⱝ', 'Ⱞ' => 'ⱞ', 'Ⱡ' => 'ⱡ', 'Ɫ' => 'ɫ', 'Ᵽ' => 'ᵽ', 'Ɽ' => 'ɽ', 'Ⱨ' => 'ⱨ', 'Ⱪ' => 'ⱪ', 'Ⱬ' => 'ⱬ', 'Ɑ' => 'ɑ', 'Ɱ' => 'ɱ', 'Ɐ' => 'ɐ', 'Ɒ' => 'ɒ', 'Ⱳ' => 'ⱳ', 'Ⱶ' => 'ⱶ', 'Ȿ' => 'ȿ', 'Ɀ' => 'ɀ', 'Ⲁ' => 'ⲁ', 'Ⲃ' => 'ⲃ', 'Ⲅ' => 'ⲅ', 'Ⲇ' => 'ⲇ', 'Ⲉ' => 'ⲉ', 'Ⲋ' => 'ⲋ', 'Ⲍ' => 'ⲍ', 'Ⲏ' => 'ⲏ', 'Ⲑ' => 'ⲑ', 'Ⲓ' => 'ⲓ', 'Ⲕ' => 'ⲕ', 'Ⲗ' => 'ⲗ', 'Ⲙ' => 'ⲙ', 'Ⲛ' => 'ⲛ', 'Ⲝ' => 'ⲝ', 'Ⲟ' => 'ⲟ', 'Ⲡ' => 'ⲡ', 'Ⲣ' => 'ⲣ', 'Ⲥ' => 'ⲥ', 'Ⲧ' => 'ⲧ', 'Ⲩ' => 'ⲩ', 'Ⲫ' => 'ⲫ', 'Ⲭ' => 'ⲭ', 'Ⲯ' => 'ⲯ', 'Ⲱ' => 'ⲱ', 'Ⲳ' => 'ⲳ', 'Ⲵ' => 'ⲵ', 'Ⲷ' => 'ⲷ', 'Ⲹ' => 'ⲹ', 'Ⲻ' => 'ⲻ', 'Ⲽ' => 'ⲽ', 'Ⲿ' => 'ⲿ', 'Ⳁ' => 'ⳁ', 'Ⳃ' => 'ⳃ', 'Ⳅ' => 'ⳅ', 'Ⳇ' => 'ⳇ', 'Ⳉ' => 'ⳉ', 'Ⳋ' => 'ⳋ', 'Ⳍ' => 'ⳍ', 'Ⳏ' => 'ⳏ', 'Ⳑ' => 'ⳑ', 'Ⳓ' => 'ⳓ', 'Ⳕ' => 'ⳕ', 'Ⳗ' => 'ⳗ', 'Ⳙ' => 'ⳙ', 'Ⳛ' => 'ⳛ', 'Ⳝ' => 'ⳝ', 'Ⳟ' => 'ⳟ', 'Ⳡ' => 'ⳡ', 'Ⳣ' => 'ⳣ', 'Ⳬ' => 'ⳬ', 'Ⳮ' => 'ⳮ', 'Ⳳ' => 'ⳳ', 'Ꙁ' => 'ꙁ', 'Ꙃ' => 'ꙃ', 'Ꙅ' => 'ꙅ', 'Ꙇ' => 'ꙇ', 'Ꙉ' => 'ꙉ', 'Ꙋ' => 'ꙋ', 'Ꙍ' => 'ꙍ', 'Ꙏ' => 'ꙏ', 'Ꙑ' => 'ꙑ', 'Ꙓ' => 'ꙓ', 'Ꙕ' => 'ꙕ', 'Ꙗ' => 'ꙗ', 'Ꙙ' => 'ꙙ', 'Ꙛ' => 'ꙛ', 'Ꙝ' => 'ꙝ', 'Ꙟ' => 'ꙟ', 'Ꙡ' => 'ꙡ', 'Ꙣ' => 'ꙣ', 'Ꙥ' => 'ꙥ', 'Ꙧ' => 'ꙧ', 'Ꙩ' => 'ꙩ', 'Ꙫ' => 'ꙫ', 'Ꙭ' => 'ꙭ', 'Ꚁ' => 'ꚁ', 'Ꚃ' => 'ꚃ', 'Ꚅ' => 'ꚅ', 'Ꚇ' => 'ꚇ', 'Ꚉ' => 'ꚉ', 'Ꚋ' => 'ꚋ', 'Ꚍ' => 'ꚍ', 'Ꚏ' => 'ꚏ', 'Ꚑ' => 'ꚑ', 'Ꚓ' => 'ꚓ', 'Ꚕ' => 'ꚕ', 'Ꚗ' => 'ꚗ', 'Ꚙ' => 'ꚙ', 'Ꚛ' => 'ꚛ', 'Ꜣ' => 'ꜣ', 'Ꜥ' => 'ꜥ', 'Ꜧ' => 'ꜧ', 'Ꜩ' => 'ꜩ', 'Ꜫ' => 'ꜫ', 'Ꜭ' => 'ꜭ', 'Ꜯ' => 'ꜯ', 'Ꜳ' => 'ꜳ', 'Ꜵ' => 'ꜵ', 'Ꜷ' => 'ꜷ', 'Ꜹ' => 'ꜹ', 'Ꜻ' => 'ꜻ', 'Ꜽ' => 'ꜽ', 'Ꜿ' => 'ꜿ', 'Ꝁ' => 'ꝁ', 'Ꝃ' => 'ꝃ', 'Ꝅ' => 'ꝅ', 'Ꝇ' => 'ꝇ', 'Ꝉ' => 'ꝉ', 'Ꝋ' => 'ꝋ', 'Ꝍ' => 'ꝍ', 'Ꝏ' => 'ꝏ', 'Ꝑ' => 'ꝑ', 'Ꝓ' => 'ꝓ', 'Ꝕ' => 'ꝕ', 'Ꝗ' => 'ꝗ', 'Ꝙ' => 'ꝙ', 'Ꝛ' => 'ꝛ', 'Ꝝ' => 'ꝝ', 'Ꝟ' => 'ꝟ', 'Ꝡ' => 'ꝡ', 'Ꝣ' => 'ꝣ', 'Ꝥ' => 'ꝥ', 'Ꝧ' => 'ꝧ', 'Ꝩ' => 'ꝩ', 'Ꝫ' => 'ꝫ', 'Ꝭ' => 'ꝭ', 'Ꝯ' => 'ꝯ', 'Ꝺ' => 'ꝺ', 'Ꝼ' => 'ꝼ', 'Ᵹ' => 'ᵹ', 'Ꝿ' => 'ꝿ', 'Ꞁ' => 'ꞁ', 'Ꞃ' => 'ꞃ', 'Ꞅ' => 'ꞅ', 'Ꞇ' => 'ꞇ', 'Ꞌ' => 'ꞌ', 'Ɥ' => 'ɥ', 'Ꞑ' => 'ꞑ', 'Ꞓ' => 'ꞓ', 'Ꞗ' => 'ꞗ', 'Ꞙ' => 'ꞙ', 'Ꞛ' => 'ꞛ', 'Ꞝ' => 'ꞝ', 'Ꞟ' => 'ꞟ', 'Ꞡ' => 'ꞡ', 'Ꞣ' => 'ꞣ', 'Ꞥ' => 'ꞥ', 'Ꞧ' => 'ꞧ', 'Ꞩ' => 'ꞩ', 'Ɦ' => 'ɦ', 'Ɜ' => 'ɜ', 'Ɡ' => 'ɡ', 'Ɬ' => 'ɬ', 'Ɪ' => 'ɪ', 'Ʞ' => 'ʞ', 'Ʇ' => 'ʇ', 'Ʝ' => 'ʝ', 'Ꭓ' => 'ꭓ', 'Ꞵ' => 'ꞵ', 'Ꞷ' => 'ꞷ', 'Ꞹ' => 'ꞹ', 'Ꞻ' => 'ꞻ', 'Ꞽ' => 'ꞽ', 'Ꞿ' => 'ꞿ', 'Ꟃ' => 'ꟃ', 'Ꞔ' => 'ꞔ', 'Ʂ' => 'ʂ', 'Ᶎ' => 'ᶎ', 'Ꟈ' => 'ꟈ', 'Ꟊ' => 'ꟊ', 'Ꟶ' => 'ꟶ', 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', '𐐀' => '𐐨', '𐐁' => '𐐩', '𐐂' => '𐐪', '𐐃' => '𐐫', '𐐄' => '𐐬', '𐐅' => '𐐭', '𐐆' => '𐐮', '𐐇' => '𐐯', '𐐈' => '𐐰', '𐐉' => '𐐱', '𐐊' => '𐐲', '𐐋' => '𐐳', '𐐌' => '𐐴', '𐐍' => '𐐵', '𐐎' => '𐐶', '𐐏' => '𐐷', '𐐐' => '𐐸', '𐐑' => '𐐹', '𐐒' => '𐐺', '𐐓' => '𐐻', '𐐔' => '𐐼', '𐐕' => '𐐽', '𐐖' => '𐐾', '𐐗' => '𐐿', '𐐘' => '𐑀', '𐐙' => '𐑁', '𐐚' => '𐑂', '𐐛' => '𐑃', '𐐜' => '𐑄', '𐐝' => '𐑅', '𐐞' => '𐑆', '𐐟' => '𐑇', '𐐠' => '𐑈', '𐐡' => '𐑉', '𐐢' => '𐑊', '𐐣' => '𐑋', '𐐤' => '𐑌', '𐐥' => '𐑍', '𐐦' => '𐑎', '𐐧' => '𐑏', '𐒰' => '𐓘', '𐒱' => '𐓙', '𐒲' => '𐓚', '𐒳' => '𐓛', '𐒴' => '𐓜', '𐒵' => '𐓝', '𐒶' => '𐓞', '𐒷' => '𐓟', '𐒸' => '𐓠', '𐒹' => '𐓡', '𐒺' => '𐓢', '𐒻' => '𐓣', '𐒼' => '𐓤', '𐒽' => '𐓥', '𐒾' => '𐓦', '𐒿' => '𐓧', '𐓀' => '𐓨', '𐓁' => '𐓩', '𐓂' => '𐓪', '𐓃' => '𐓫', '𐓄' => '𐓬', '𐓅' => '𐓭', '𐓆' => '𐓮', '𐓇' => '𐓯', '𐓈' => '𐓰', '𐓉' => '𐓱', '𐓊' => '𐓲', '𐓋' => '𐓳', '𐓌' => '𐓴', '𐓍' => '𐓵', '𐓎' => '𐓶', '𐓏' => '𐓷', '𐓐' => '𐓸', '𐓑' => '𐓹', '𐓒' => '𐓺', '𐓓' => '𐓻', '𐲀' => '𐳀', '𐲁' => '𐳁', '𐲂' => '𐳂', '𐲃' => '𐳃', '𐲄' => '𐳄', '𐲅' => '𐳅', '𐲆' => '𐳆', '𐲇' => '𐳇', '𐲈' => '𐳈', '𐲉' => '𐳉', '𐲊' => '𐳊', '𐲋' => '𐳋', '𐲌' => '𐳌', '𐲍' => '𐳍', '𐲎' => '𐳎', '𐲏' => '𐳏', '𐲐' => '𐳐', '𐲑' => '𐳑', '𐲒' => '𐳒', '𐲓' => '𐳓', '𐲔' => '𐳔', '𐲕' => '𐳕', '𐲖' => '𐳖', '𐲗' => '𐳗', '𐲘' => '𐳘', '𐲙' => '𐳙', '𐲚' => '𐳚', '𐲛' => '𐳛', '𐲜' => '𐳜', '𐲝' => '𐳝', '𐲞' => '𐳞', '𐲟' => '𐳟', '𐲠' => '𐳠', '𐲡' => '𐳡', '𐲢' => '𐳢', '𐲣' => '𐳣', '𐲤' => '𐳤', '𐲥' => '𐳥', '𐲦' => '𐳦', '𐲧' => '𐳧', '𐲨' => '𐳨', '𐲩' => '𐳩', '𐲪' => '𐳪', '𐲫' => '𐳫', '𐲬' => '𐳬', '𐲭' => '𐳭', '𐲮' => '𐳮', '𐲯' => '𐳯', '𐲰' => '𐳰', '𐲱' => '𐳱', '𐲲' => '𐳲', '𑢠' => '𑣀', '𑢡' => '𑣁', '𑢢' => '𑣂', '𑢣' => '𑣃', '𑢤' => '𑣄', '𑢥' => '𑣅', '𑢦' => '𑣆', '𑢧' => '𑣇', '𑢨' => '𑣈', '𑢩' => '𑣉', '𑢪' => '𑣊', '𑢫' => '𑣋', '𑢬' => '𑣌', '𑢭' => '𑣍', '𑢮' => '𑣎', '𑢯' => '𑣏', '𑢰' => '𑣐', '𑢱' => '𑣑', '𑢲' => '𑣒', '𑢳' => '𑣓', '𑢴' => '𑣔', '𑢵' => '𑣕', '𑢶' => '𑣖', '𑢷' => '𑣗', '𑢸' => '𑣘', '𑢹' => '𑣙', '𑢺' => '𑣚', '𑢻' => '𑣛', '𑢼' => '𑣜', '𑢽' => '𑣝', '𑢾' => '𑣞', '𑢿' => '𑣟', '𖹀' => '𖹠', '𖹁' => '𖹡', '𖹂' => '𖹢', '𖹃' => '𖹣', '𖹄' => '𖹤', '𖹅' => '𖹥', '𖹆' => '𖹦', '𖹇' => '𖹧', '𖹈' => '𖹨', '𖹉' => '𖹩', '𖹊' => '𖹪', '𖹋' => '𖹫', '𖹌' => '𖹬', '𖹍' => '𖹭', '𖹎' => '𖹮', '𖹏' => '𖹯', '𖹐' => '𖹰', '𖹑' => '𖹱', '𖹒' => '𖹲', '𖹓' => '𖹳', '𖹔' => '𖹴', '𖹕' => '𖹵', '𖹖' => '𖹶', '𖹗' => '𖹷', '𖹘' => '𖹸', '𖹙' => '𖹹', '𖹚' => '𖹺', '𖹛' => '𖹻', '𖹜' => '𖹼', '𖹝' => '𖹽', '𖹞' => '𖹾', '𖹟' => '𖹿', '𞤀' => '𞤢', '𞤁' => '𞤣', '𞤂' => '𞤤', '𞤃' => '𞤥', '𞤄' => '𞤦', '𞤅' => '𞤧', '𞤆' => '𞤨', '𞤇' => '𞤩', '𞤈' => '𞤪', '𞤉' => '𞤫', '𞤊' => '𞤬', '𞤋' => '𞤭', '𞤌' => '𞤮', '𞤍' => '𞤯', '𞤎' => '𞤰', '𞤏' => '𞤱', '𞤐' => '𞤲', '𞤑' => '𞤳', '𞤒' => '𞤴', '𞤓' => '𞤵', '𞤔' => '𞤶', '𞤕' => '𞤷', '𞤖' => '𞤸', '𞤗' => '𞤹', '𞤘' => '𞤺', '𞤙' => '𞤻', '𞤚' => '𞤼', '𞤛' => '𞤽', '𞤜' => '𞤾', '𞤝' => '𞤿', '𞤞' => '𞥀', '𞤟' => '𞥁', '𞤠' => '𞥂', '𞤡' => '𞥃', ); ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php ================================================ 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', 'µ' => 'Μ', 'à' => 'À', 'á' => 'Á', 'â' => 'Â', 'ã' => 'Ã', 'ä' => 'Ä', 'å' => 'Å', 'æ' => 'Æ', 'ç' => 'Ç', 'è' => 'È', 'é' => 'É', 'ê' => 'Ê', 'ë' => 'Ë', 'ì' => 'Ì', 'í' => 'Í', 'î' => 'Î', 'ï' => 'Ï', 'ð' => 'Ð', 'ñ' => 'Ñ', 'ò' => 'Ò', 'ó' => 'Ó', 'ô' => 'Ô', 'õ' => 'Õ', 'ö' => 'Ö', 'ø' => 'Ø', 'ù' => 'Ù', 'ú' => 'Ú', 'û' => 'Û', 'ü' => 'Ü', 'ý' => 'Ý', 'þ' => 'Þ', 'ÿ' => 'Ÿ', 'ā' => 'Ā', 'ă' => 'Ă', 'ą' => 'Ą', 'ć' => 'Ć', 'ĉ' => 'Ĉ', 'ċ' => 'Ċ', 'č' => 'Č', 'ď' => 'Ď', 'đ' => 'Đ', 'ē' => 'Ē', 'ĕ' => 'Ĕ', 'ė' => 'Ė', 'ę' => 'Ę', 'ě' => 'Ě', 'ĝ' => 'Ĝ', 'ğ' => 'Ğ', 'ġ' => 'Ġ', 'ģ' => 'Ģ', 'ĥ' => 'Ĥ', 'ħ' => 'Ħ', 'ĩ' => 'Ĩ', 'ī' => 'Ī', 'ĭ' => 'Ĭ', 'į' => 'Į', 'ı' => 'I', 'ij' => 'IJ', 'ĵ' => 'Ĵ', 'ķ' => 'Ķ', 'ĺ' => 'Ĺ', 'ļ' => 'Ļ', 'ľ' => 'Ľ', 'ŀ' => 'Ŀ', 'ł' => 'Ł', 'ń' => 'Ń', 'ņ' => 'Ņ', 'ň' => 'Ň', 'ŋ' => 'Ŋ', 'ō' => 'Ō', 'ŏ' => 'Ŏ', 'ő' => 'Ő', 'œ' => 'Œ', 'ŕ' => 'Ŕ', 'ŗ' => 'Ŗ', 'ř' => 'Ř', 'ś' => 'Ś', 'ŝ' => 'Ŝ', 'ş' => 'Ş', 'š' => 'Š', 'ţ' => 'Ţ', 'ť' => 'Ť', 'ŧ' => 'Ŧ', 'ũ' => 'Ũ', 'ū' => 'Ū', 'ŭ' => 'Ŭ', 'ů' => 'Ů', 'ű' => 'Ű', 'ų' => 'Ų', 'ŵ' => 'Ŵ', 'ŷ' => 'Ŷ', 'ź' => 'Ź', 'ż' => 'Ż', 'ž' => 'Ž', 'ſ' => 'S', 'ƀ' => 'Ƀ', 'ƃ' => 'Ƃ', 'ƅ' => 'Ƅ', 'ƈ' => 'Ƈ', 'ƌ' => 'Ƌ', 'ƒ' => 'Ƒ', 'ƕ' => 'Ƕ', 'ƙ' => 'Ƙ', 'ƚ' => 'Ƚ', 'ƞ' => 'Ƞ', 'ơ' => 'Ơ', 'ƣ' => 'Ƣ', 'ƥ' => 'Ƥ', 'ƨ' => 'Ƨ', 'ƭ' => 'Ƭ', 'ư' => 'Ư', 'ƴ' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'ƿ' => 'Ƿ', 'Dž' => 'DŽ', 'dž' => 'DŽ', 'Lj' => 'LJ', 'lj' => 'LJ', 'Nj' => 'NJ', 'nj' => 'NJ', 'ǎ' => 'Ǎ', 'ǐ' => 'Ǐ', 'ǒ' => 'Ǒ', 'ǔ' => 'Ǔ', 'ǖ' => 'Ǖ', 'ǘ' => 'Ǘ', 'ǚ' => 'Ǚ', 'ǜ' => 'Ǜ', 'ǝ' => 'Ǝ', 'ǟ' => 'Ǟ', 'ǡ' => 'Ǡ', 'ǣ' => 'Ǣ', 'ǥ' => 'Ǥ', 'ǧ' => 'Ǧ', 'ǩ' => 'Ǩ', 'ǫ' => 'Ǫ', 'ǭ' => 'Ǭ', 'ǯ' => 'Ǯ', 'Dz' => 'DZ', 'dz' => 'DZ', 'ǵ' => 'Ǵ', 'ǹ' => 'Ǹ', 'ǻ' => 'Ǻ', 'ǽ' => 'Ǽ', 'ǿ' => 'Ǿ', 'ȁ' => 'Ȁ', 'ȃ' => 'Ȃ', 'ȅ' => 'Ȅ', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'ȋ' => 'Ȋ', 'ȍ' => 'Ȍ', 'ȏ' => 'Ȏ', 'ȑ' => 'Ȑ', 'ȓ' => 'Ȓ', 'ȕ' => 'Ȕ', 'ȗ' => 'Ȗ', 'ș' => 'Ș', 'ț' => 'Ț', 'ȝ' => 'Ȝ', 'ȟ' => 'Ȟ', 'ȣ' => 'Ȣ', 'ȥ' => 'Ȥ', 'ȧ' => 'Ȧ', 'ȩ' => 'Ȩ', 'ȫ' => 'Ȫ', 'ȭ' => 'Ȭ', 'ȯ' => 'Ȯ', 'ȱ' => 'Ȱ', 'ȳ' => 'Ȳ', 'ȼ' => 'Ȼ', 'ȿ' => 'Ȿ', 'ɀ' => 'Ɀ', 'ɂ' => 'Ɂ', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'ɋ' => 'Ɋ', 'ɍ' => 'Ɍ', 'ɏ' => 'Ɏ', 'ɐ' => 'Ɐ', 'ɑ' => 'Ɑ', 'ɒ' => 'Ɒ', 'ɓ' => 'Ɓ', 'ɔ' => 'Ɔ', 'ɖ' => 'Ɖ', 'ɗ' => 'Ɗ', 'ə' => 'Ə', 'ɛ' => 'Ɛ', 'ɜ' => 'Ɜ', 'ɠ' => 'Ɠ', 'ɡ' => 'Ɡ', 'ɣ' => 'Ɣ', 'ɥ' => 'Ɥ', 'ɦ' => 'Ɦ', 'ɨ' => 'Ɨ', 'ɩ' => 'Ɩ', 'ɪ' => 'Ɪ', 'ɫ' => 'Ɫ', 'ɬ' => 'Ɬ', 'ɯ' => 'Ɯ', 'ɱ' => 'Ɱ', 'ɲ' => 'Ɲ', 'ɵ' => 'Ɵ', 'ɽ' => 'Ɽ', 'ʀ' => 'Ʀ', 'ʂ' => 'Ʂ', 'ʃ' => 'Ʃ', 'ʇ' => 'Ʇ', 'ʈ' => 'Ʈ', 'ʉ' => 'Ʉ', 'ʊ' => 'Ʊ', 'ʋ' => 'Ʋ', 'ʌ' => 'Ʌ', 'ʒ' => 'Ʒ', 'ʝ' => 'Ʝ', 'ʞ' => 'Ʞ', 'ͅ' => 'Ι', 'ͱ' => 'Ͱ', 'ͳ' => 'Ͳ', 'ͷ' => 'Ͷ', 'ͻ' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ͽ', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Β', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Μ', 'ν' => 'Ν', 'ξ' => 'Ξ', 'ο' => 'Ο', 'π' => 'Π', 'ρ' => 'Ρ', 'ς' => 'Σ', 'σ' => 'Σ', 'τ' => 'Τ', 'υ' => 'Υ', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ϊ' => 'Ϊ', 'ϋ' => 'Ϋ', 'ό' => 'Ό', 'ύ' => 'Ύ', 'ώ' => 'Ώ', 'ϐ' => 'Β', 'ϑ' => 'Θ', 'ϕ' => 'Φ', 'ϖ' => 'Π', 'ϗ' => 'Ϗ', 'ϙ' => 'Ϙ', 'ϛ' => 'Ϛ', 'ϝ' => 'Ϝ', 'ϟ' => 'Ϟ', 'ϡ' => 'Ϡ', 'ϣ' => 'Ϣ', 'ϥ' => 'Ϥ', 'ϧ' => 'Ϧ', 'ϩ' => 'Ϩ', 'ϫ' => 'Ϫ', 'ϭ' => 'Ϭ', 'ϯ' => 'Ϯ', 'ϰ' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Ϳ', 'ϵ' => 'Ε', 'ϸ' => 'Ϸ', 'ϻ' => 'Ϻ', 'а' => 'А', 'б' => 'Б', 'в' => 'В', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'М', 'н' => 'Н', 'о' => 'О', 'п' => 'П', 'р' => 'Р', 'с' => 'С', 'т' => 'Т', 'у' => 'У', 'ф' => 'Ф', 'х' => 'Х', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ъ' => 'Ъ', 'ы' => 'Ы', 'ь' => 'Ь', 'э' => 'Э', 'ю' => 'Ю', 'я' => 'Я', 'ѐ' => 'Ѐ', 'ё' => 'Ё', 'ђ' => 'Ђ', 'ѓ' => 'Ѓ', 'є' => 'Є', 'ѕ' => 'Ѕ', 'і' => 'І', 'ї' => 'Ї', 'ј' => 'Ј', 'љ' => 'Љ', 'њ' => 'Њ', 'ћ' => 'Ћ', 'ќ' => 'Ќ', 'ѝ' => 'Ѝ', 'ў' => 'Ў', 'џ' => 'Џ', 'ѡ' => 'Ѡ', 'ѣ' => 'Ѣ', 'ѥ' => 'Ѥ', 'ѧ' => 'Ѧ', 'ѩ' => 'Ѩ', 'ѫ' => 'Ѫ', 'ѭ' => 'Ѭ', 'ѯ' => 'Ѯ', 'ѱ' => 'Ѱ', 'ѳ' => 'Ѳ', 'ѵ' => 'Ѵ', 'ѷ' => 'Ѷ', 'ѹ' => 'Ѹ', 'ѻ' => 'Ѻ', 'ѽ' => 'Ѽ', 'ѿ' => 'Ѿ', 'ҁ' => 'Ҁ', 'ҋ' => 'Ҋ', 'ҍ' => 'Ҍ', 'ҏ' => 'Ҏ', 'ґ' => 'Ґ', 'ғ' => 'Ғ', 'ҕ' => 'Ҕ', 'җ' => 'Җ', 'ҙ' => 'Ҙ', 'қ' => 'Қ', 'ҝ' => 'Ҝ', 'ҟ' => 'Ҟ', 'ҡ' => 'Ҡ', 'ң' => 'Ң', 'ҥ' => 'Ҥ', 'ҧ' => 'Ҧ', 'ҩ' => 'Ҩ', 'ҫ' => 'Ҫ', 'ҭ' => 'Ҭ', 'ү' => 'Ү', 'ұ' => 'Ұ', 'ҳ' => 'Ҳ', 'ҵ' => 'Ҵ', 'ҷ' => 'Ҷ', 'ҹ' => 'Ҹ', 'һ' => 'Һ', 'ҽ' => 'Ҽ', 'ҿ' => 'Ҿ', 'ӂ' => 'Ӂ', 'ӄ' => 'Ӄ', 'ӆ' => 'Ӆ', 'ӈ' => 'Ӈ', 'ӊ' => 'Ӊ', 'ӌ' => 'Ӌ', 'ӎ' => 'Ӎ', 'ӏ' => 'Ӏ', 'ӑ' => 'Ӑ', 'ӓ' => 'Ӓ', 'ӕ' => 'Ӕ', 'ӗ' => 'Ӗ', 'ә' => 'Ә', 'ӛ' => 'Ӛ', 'ӝ' => 'Ӝ', 'ӟ' => 'Ӟ', 'ӡ' => 'Ӡ', 'ӣ' => 'Ӣ', 'ӥ' => 'Ӥ', 'ӧ' => 'Ӧ', 'ө' => 'Ө', 'ӫ' => 'Ӫ', 'ӭ' => 'Ӭ', 'ӯ' => 'Ӯ', 'ӱ' => 'Ӱ', 'ӳ' => 'Ӳ', 'ӵ' => 'Ӵ', 'ӷ' => 'Ӷ', 'ӹ' => 'Ӹ', 'ӻ' => 'Ӻ', 'ӽ' => 'Ӽ', 'ӿ' => 'Ӿ', 'ԁ' => 'Ԁ', 'ԃ' => 'Ԃ', 'ԅ' => 'Ԅ', 'ԇ' => 'Ԇ', 'ԉ' => 'Ԉ', 'ԋ' => 'Ԋ', 'ԍ' => 'Ԍ', 'ԏ' => 'Ԏ', 'ԑ' => 'Ԑ', 'ԓ' => 'Ԓ', 'ԕ' => 'Ԕ', 'ԗ' => 'Ԗ', 'ԙ' => 'Ԙ', 'ԛ' => 'Ԛ', 'ԝ' => 'Ԝ', 'ԟ' => 'Ԟ', 'ԡ' => 'Ԡ', 'ԣ' => 'Ԣ', 'ԥ' => 'Ԥ', 'ԧ' => 'Ԧ', 'ԩ' => 'Ԩ', 'ԫ' => 'Ԫ', 'ԭ' => 'Ԭ', 'ԯ' => 'Ԯ', 'ա' => 'Ա', 'բ' => 'Բ', 'գ' => 'Գ', 'դ' => 'Դ', 'ե' => 'Ե', 'զ' => 'Զ', 'է' => 'Է', 'ը' => 'Ը', 'թ' => 'Թ', 'ժ' => 'Ժ', 'ի' => 'Ի', 'լ' => 'Լ', 'խ' => 'Խ', 'ծ' => 'Ծ', 'կ' => 'Կ', 'հ' => 'Հ', 'ձ' => 'Ձ', 'ղ' => 'Ղ', 'ճ' => 'Ճ', 'մ' => 'Մ', 'յ' => 'Յ', 'ն' => 'Ն', 'շ' => 'Շ', 'ո' => 'Ո', 'չ' => 'Չ', 'պ' => 'Պ', 'ջ' => 'Ջ', 'ռ' => 'Ռ', 'ս' => 'Ս', 'վ' => 'Վ', 'տ' => 'Տ', 'ր' => 'Ր', 'ց' => 'Ց', 'ւ' => 'Ւ', 'փ' => 'Փ', 'ք' => 'Ք', 'օ' => 'Օ', 'ֆ' => 'Ֆ', 'ა' => 'Ა', 'ბ' => 'Ბ', 'გ' => 'Გ', 'დ' => 'Დ', 'ე' => 'Ე', 'ვ' => 'Ვ', 'ზ' => 'Ზ', 'თ' => 'Თ', 'ი' => 'Ი', 'კ' => 'Კ', 'ლ' => 'Ლ', 'მ' => 'Მ', 'ნ' => 'Ნ', 'ო' => 'Ო', 'პ' => 'Პ', 'ჟ' => 'Ჟ', 'რ' => 'Რ', 'ს' => 'Ს', 'ტ' => 'Ტ', 'უ' => 'Უ', 'ფ' => 'Ფ', 'ქ' => 'Ქ', 'ღ' => 'Ღ', 'ყ' => 'Ყ', 'შ' => 'Შ', 'ჩ' => 'Ჩ', 'ც' => 'Ც', 'ძ' => 'Ძ', 'წ' => 'Წ', 'ჭ' => 'Ჭ', 'ხ' => 'Ხ', 'ჯ' => 'Ჯ', 'ჰ' => 'Ჰ', 'ჱ' => 'Ჱ', 'ჲ' => 'Ჲ', 'ჳ' => 'Ჳ', 'ჴ' => 'Ჴ', 'ჵ' => 'Ჵ', 'ჶ' => 'Ჶ', 'ჷ' => 'Ჷ', 'ჸ' => 'Ჸ', 'ჹ' => 'Ჹ', 'ჺ' => 'Ჺ', 'ჽ' => 'Ჽ', 'ჾ' => 'Ჾ', 'ჿ' => 'Ჿ', 'ᏸ' => 'Ᏸ', 'ᏹ' => 'Ᏹ', 'ᏺ' => 'Ᏺ', 'ᏻ' => 'Ᏻ', 'ᏼ' => 'Ᏼ', 'ᏽ' => 'Ᏽ', 'ᲀ' => 'В', 'ᲁ' => 'Д', 'ᲂ' => 'О', 'ᲃ' => 'С', 'ᲄ' => 'Т', 'ᲅ' => 'Т', 'ᲆ' => 'Ъ', 'ᲇ' => 'Ѣ', 'ᲈ' => 'Ꙋ', 'ᵹ' => 'Ᵹ', 'ᵽ' => 'Ᵽ', 'ᶎ' => 'Ᶎ', 'ḁ' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'ḍ' => 'Ḍ', 'ḏ' => 'Ḏ', 'ḑ' => 'Ḑ', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'ḝ' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'ṁ' => 'Ṁ', 'ṃ' => 'Ṃ', 'ṅ' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'ṍ' => 'Ṍ', 'ṏ' => 'Ṏ', 'ṑ' => 'Ṑ', 'ṓ' => 'Ṓ', 'ṕ' => 'Ṕ', 'ṗ' => 'Ṗ', 'ṙ' => 'Ṙ', 'ṛ' => 'Ṛ', 'ṝ' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'Ṡ', 'ṣ' => 'Ṣ', 'ṥ' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'ṭ' => 'Ṭ', 'ṯ' => 'Ṯ', 'ṱ' => 'Ṱ', 'ṳ' => 'Ṳ', 'ṵ' => 'Ṵ', 'ṷ' => 'Ṷ', 'ṹ' => 'Ṹ', 'ṻ' => 'Ṻ', 'ṽ' => 'Ṽ', 'ṿ' => 'Ṿ', 'ẁ' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'ẍ' => 'Ẍ', 'ẏ' => 'Ẏ', 'ẑ' => 'Ẑ', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'Ṡ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'ề' => 'Ề', 'ể' => 'Ể', 'ễ' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'ọ' => 'Ọ', 'ỏ' => 'Ỏ', 'ố' => 'Ố', 'ồ' => 'Ồ', 'ổ' => 'Ổ', 'ỗ' => 'Ỗ', 'ộ' => 'Ộ', 'ớ' => 'Ớ', 'ờ' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'Ỡ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'ử' => 'Ử', 'ữ' => 'Ữ', 'ự' => 'Ự', 'ỳ' => 'Ỳ', 'ỵ' => 'Ỵ', 'ỷ' => 'Ỷ', 'ỹ' => 'Ỹ', 'ỻ' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'ἀ' => 'Ἀ', 'ἁ' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'ἅ' => 'Ἅ', 'ἆ' => 'Ἆ', 'ἇ' => 'Ἇ', 'ἐ' => 'Ἐ', 'ἑ' => 'Ἑ', 'ἒ' => 'Ἒ', 'ἓ' => 'Ἓ', 'ἔ' => 'Ἔ', 'ἕ' => 'Ἕ', 'ἠ' => 'Ἠ', 'ἡ' => 'Ἡ', 'ἢ' => 'Ἢ', 'ἣ' => 'Ἣ', 'ἤ' => 'Ἤ', 'ἥ' => 'Ἥ', 'ἦ' => 'Ἦ', 'ἧ' => 'Ἧ', 'ἰ' => 'Ἰ', 'ἱ' => 'Ἱ', 'ἲ' => 'Ἲ', 'ἳ' => 'Ἳ', 'ἴ' => 'Ἴ', 'ἵ' => 'Ἵ', 'ἶ' => 'Ἶ', 'ἷ' => 'Ἷ', 'ὀ' => 'Ὀ', 'ὁ' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'ὅ' => 'Ὅ', 'ὑ' => 'Ὑ', 'ὓ' => 'Ὓ', 'ὕ' => 'Ὕ', 'ὗ' => 'Ὗ', 'ὠ' => 'Ὠ', 'ὡ' => 'Ὡ', 'ὢ' => 'Ὢ', 'ὣ' => 'Ὣ', 'ὤ' => 'Ὤ', 'ὥ' => 'Ὥ', 'ὦ' => 'Ὦ', 'ὧ' => 'Ὧ', 'ὰ' => 'Ὰ', 'ά' => 'Ά', 'ὲ' => 'Ὲ', 'έ' => 'Έ', 'ὴ' => 'Ὴ', 'ή' => 'Ή', 'ὶ' => 'Ὶ', 'ί' => 'Ί', 'ὸ' => 'Ὸ', 'ό' => 'Ό', 'ὺ' => 'Ὺ', 'ύ' => 'Ύ', 'ὼ' => 'Ὼ', 'ώ' => 'Ώ', 'ᾀ' => 'ἈΙ', 'ᾁ' => 'ἉΙ', 'ᾂ' => 'ἊΙ', 'ᾃ' => 'ἋΙ', 'ᾄ' => 'ἌΙ', 'ᾅ' => 'ἍΙ', 'ᾆ' => 'ἎΙ', 'ᾇ' => 'ἏΙ', 'ᾐ' => 'ἨΙ', 'ᾑ' => 'ἩΙ', 'ᾒ' => 'ἪΙ', 'ᾓ' => 'ἫΙ', 'ᾔ' => 'ἬΙ', 'ᾕ' => 'ἭΙ', 'ᾖ' => 'ἮΙ', 'ᾗ' => 'ἯΙ', 'ᾠ' => 'ὨΙ', 'ᾡ' => 'ὩΙ', 'ᾢ' => 'ὪΙ', 'ᾣ' => 'ὫΙ', 'ᾤ' => 'ὬΙ', 'ᾥ' => 'ὭΙ', 'ᾦ' => 'ὮΙ', 'ᾧ' => 'ὯΙ', 'ᾰ' => 'Ᾰ', 'ᾱ' => 'Ᾱ', 'ᾳ' => 'ΑΙ', 'ι' => 'Ι', 'ῃ' => 'ΗΙ', 'ῐ' => 'Ῐ', 'ῑ' => 'Ῑ', 'ῠ' => 'Ῠ', 'ῡ' => 'Ῡ', 'ῥ' => 'Ῥ', 'ῳ' => 'ΩΙ', 'ⅎ' => 'Ⅎ', 'ⅰ' => 'Ⅰ', 'ⅱ' => 'Ⅱ', 'ⅲ' => 'Ⅲ', 'ⅳ' => 'Ⅳ', 'ⅴ' => 'Ⅴ', 'ⅵ' => 'Ⅵ', 'ⅶ' => 'Ⅶ', 'ⅷ' => 'Ⅷ', 'ⅸ' => 'Ⅸ', 'ⅹ' => 'Ⅹ', 'ⅺ' => 'Ⅺ', 'ⅻ' => 'Ⅻ', 'ⅼ' => 'Ⅼ', 'ⅽ' => 'Ⅽ', 'ⅾ' => 'Ⅾ', 'ⅿ' => 'Ⅿ', 'ↄ' => 'Ↄ', 'ⓐ' => 'Ⓐ', 'ⓑ' => 'Ⓑ', 'ⓒ' => 'Ⓒ', 'ⓓ' => 'Ⓓ', 'ⓔ' => 'Ⓔ', 'ⓕ' => 'Ⓕ', 'ⓖ' => 'Ⓖ', 'ⓗ' => 'Ⓗ', 'ⓘ' => 'Ⓘ', 'ⓙ' => 'Ⓙ', 'ⓚ' => 'Ⓚ', 'ⓛ' => 'Ⓛ', 'ⓜ' => 'Ⓜ', 'ⓝ' => 'Ⓝ', 'ⓞ' => 'Ⓞ', 'ⓟ' => 'Ⓟ', 'ⓠ' => 'Ⓠ', 'ⓡ' => 'Ⓡ', 'ⓢ' => 'Ⓢ', 'ⓣ' => 'Ⓣ', 'ⓤ' => 'Ⓤ', 'ⓥ' => 'Ⓥ', 'ⓦ' => 'Ⓦ', 'ⓧ' => 'Ⓧ', 'ⓨ' => 'Ⓨ', 'ⓩ' => 'Ⓩ', 'ⰰ' => 'Ⰰ', 'ⰱ' => 'Ⰱ', 'ⰲ' => 'Ⰲ', 'ⰳ' => 'Ⰳ', 'ⰴ' => 'Ⰴ', 'ⰵ' => 'Ⰵ', 'ⰶ' => 'Ⰶ', 'ⰷ' => 'Ⰷ', 'ⰸ' => 'Ⰸ', 'ⰹ' => 'Ⰹ', 'ⰺ' => 'Ⰺ', 'ⰻ' => 'Ⰻ', 'ⰼ' => 'Ⰼ', 'ⰽ' => 'Ⰽ', 'ⰾ' => 'Ⰾ', 'ⰿ' => 'Ⰿ', 'ⱀ' => 'Ⱀ', 'ⱁ' => 'Ⱁ', 'ⱂ' => 'Ⱂ', 'ⱃ' => 'Ⱃ', 'ⱄ' => 'Ⱄ', 'ⱅ' => 'Ⱅ', 'ⱆ' => 'Ⱆ', 'ⱇ' => 'Ⱇ', 'ⱈ' => 'Ⱈ', 'ⱉ' => 'Ⱉ', 'ⱊ' => 'Ⱊ', 'ⱋ' => 'Ⱋ', 'ⱌ' => 'Ⱌ', 'ⱍ' => 'Ⱍ', 'ⱎ' => 'Ⱎ', 'ⱏ' => 'Ⱏ', 'ⱐ' => 'Ⱐ', 'ⱑ' => 'Ⱑ', 'ⱒ' => 'Ⱒ', 'ⱓ' => 'Ⱓ', 'ⱔ' => 'Ⱔ', 'ⱕ' => 'Ⱕ', 'ⱖ' => 'Ⱖ', 'ⱗ' => 'Ⱗ', 'ⱘ' => 'Ⱘ', 'ⱙ' => 'Ⱙ', 'ⱚ' => 'Ⱚ', 'ⱛ' => 'Ⱛ', 'ⱜ' => 'Ⱜ', 'ⱝ' => 'Ⱝ', 'ⱞ' => 'Ⱞ', 'ⱡ' => 'Ⱡ', 'ⱥ' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'ⱳ' => 'Ⱳ', 'ⱶ' => 'Ⱶ', 'ⲁ' => 'Ⲁ', 'ⲃ' => 'Ⲃ', 'ⲅ' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'ⲍ' => 'Ⲍ', 'ⲏ' => 'Ⲏ', 'ⲑ' => 'Ⲑ', 'ⲓ' => 'Ⲓ', 'ⲕ' => 'Ⲕ', 'ⲗ' => 'Ⲗ', 'ⲙ' => 'Ⲙ', 'ⲛ' => 'Ⲛ', 'ⲝ' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'Ⲡ', 'ⲣ' => 'Ⲣ', 'ⲥ' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'ⲭ' => 'Ⲭ', 'ⲯ' => 'Ⲯ', 'ⲱ' => 'Ⲱ', 'ⲳ' => 'Ⲳ', 'ⲵ' => 'Ⲵ', 'ⲷ' => 'Ⲷ', 'ⲹ' => 'Ⲹ', 'ⲻ' => 'Ⲻ', 'ⲽ' => 'Ⲽ', 'ⲿ' => 'Ⲿ', 'ⳁ' => 'Ⳁ', 'ⳃ' => 'Ⳃ', 'ⳅ' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'ⳍ' => 'Ⳍ', 'ⳏ' => 'Ⳏ', 'ⳑ' => 'Ⳑ', 'ⳓ' => 'Ⳓ', 'ⳕ' => 'Ⳕ', 'ⳗ' => 'Ⳗ', 'ⳙ' => 'Ⳙ', 'ⳛ' => 'Ⳛ', 'ⳝ' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'Ⳡ', 'ⳣ' => 'Ⳣ', 'ⳬ' => 'Ⳬ', 'ⳮ' => 'Ⳮ', 'ⳳ' => 'Ⳳ', 'ⴀ' => 'Ⴀ', 'ⴁ' => 'Ⴁ', 'ⴂ' => 'Ⴂ', 'ⴃ' => 'Ⴃ', 'ⴄ' => 'Ⴄ', 'ⴅ' => 'Ⴅ', 'ⴆ' => 'Ⴆ', 'ⴇ' => 'Ⴇ', 'ⴈ' => 'Ⴈ', 'ⴉ' => 'Ⴉ', 'ⴊ' => 'Ⴊ', 'ⴋ' => 'Ⴋ', 'ⴌ' => 'Ⴌ', 'ⴍ' => 'Ⴍ', 'ⴎ' => 'Ⴎ', 'ⴏ' => 'Ⴏ', 'ⴐ' => 'Ⴐ', 'ⴑ' => 'Ⴑ', 'ⴒ' => 'Ⴒ', 'ⴓ' => 'Ⴓ', 'ⴔ' => 'Ⴔ', 'ⴕ' => 'Ⴕ', 'ⴖ' => 'Ⴖ', 'ⴗ' => 'Ⴗ', 'ⴘ' => 'Ⴘ', 'ⴙ' => 'Ⴙ', 'ⴚ' => 'Ⴚ', 'ⴛ' => 'Ⴛ', 'ⴜ' => 'Ⴜ', 'ⴝ' => 'Ⴝ', 'ⴞ' => 'Ⴞ', 'ⴟ' => 'Ⴟ', 'ⴠ' => 'Ⴠ', 'ⴡ' => 'Ⴡ', 'ⴢ' => 'Ⴢ', 'ⴣ' => 'Ⴣ', 'ⴤ' => 'Ⴤ', 'ⴥ' => 'Ⴥ', 'ⴧ' => 'Ⴧ', 'ⴭ' => 'Ⴭ', 'ꙁ' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ꙅ' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ꙍ' => 'Ꙍ', 'ꙏ' => 'Ꙏ', 'ꙑ' => 'Ꙑ', 'ꙓ' => 'Ꙓ', 'ꙕ' => 'Ꙕ', 'ꙗ' => 'Ꙗ', 'ꙙ' => 'Ꙙ', 'ꙛ' => 'Ꙛ', 'ꙝ' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'Ꙡ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ꙭ' => 'Ꙭ', 'ꚁ' => 'Ꚁ', 'ꚃ' => 'Ꚃ', 'ꚅ' => 'Ꚅ', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'ꚋ' => 'Ꚋ', 'ꚍ' => 'Ꚍ', 'ꚏ' => 'Ꚏ', 'ꚑ' => 'Ꚑ', 'ꚓ' => 'Ꚓ', 'ꚕ' => 'Ꚕ', 'ꚗ' => 'Ꚗ', 'ꚙ' => 'Ꚙ', 'ꚛ' => 'Ꚛ', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ꝁ' => 'Ꝁ', 'ꝃ' => 'Ꝃ', 'ꝅ' => 'Ꝅ', 'ꝇ' => 'Ꝇ', 'ꝉ' => 'Ꝉ', 'ꝋ' => 'Ꝋ', 'ꝍ' => 'Ꝍ', 'ꝏ' => 'Ꝏ', 'ꝑ' => 'Ꝑ', 'ꝓ' => 'Ꝓ', 'ꝕ' => 'Ꝕ', 'ꝗ' => 'Ꝗ', 'ꝙ' => 'Ꝙ', 'ꝛ' => 'Ꝛ', 'ꝝ' => 'Ꝝ', 'ꝟ' => 'Ꝟ', 'ꝡ' => 'Ꝡ', 'ꝣ' => 'Ꝣ', 'ꝥ' => 'Ꝥ', 'ꝧ' => 'Ꝧ', 'ꝩ' => 'Ꝩ', 'ꝫ' => 'Ꝫ', 'ꝭ' => 'Ꝭ', 'ꝯ' => 'Ꝯ', 'ꝺ' => 'Ꝺ', 'ꝼ' => 'Ꝼ', 'ꝿ' => 'Ꝿ', 'ꞁ' => 'Ꞁ', 'ꞃ' => 'Ꞃ', 'ꞅ' => 'Ꞅ', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'Ꞌ', 'ꞑ' => 'Ꞑ', 'ꞓ' => 'Ꞓ', 'ꞔ' => 'Ꞔ', 'ꞗ' => 'Ꞗ', 'ꞙ' => 'Ꞙ', 'ꞛ' => 'Ꞛ', 'ꞝ' => 'Ꞝ', 'ꞟ' => 'Ꞟ', 'ꞡ' => 'Ꞡ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'ꞩ' => 'Ꞩ', 'ꞵ' => 'Ꞵ', 'ꞷ' => 'Ꞷ', 'ꞹ' => 'Ꞹ', 'ꞻ' => 'Ꞻ', 'ꞽ' => 'Ꞽ', 'ꞿ' => 'Ꞿ', 'ꟃ' => 'Ꟃ', 'ꟈ' => 'Ꟈ', 'ꟊ' => 'Ꟊ', 'ꟶ' => 'Ꟶ', 'ꭓ' => 'Ꭓ', 'ꭰ' => 'Ꭰ', 'ꭱ' => 'Ꭱ', 'ꭲ' => 'Ꭲ', 'ꭳ' => 'Ꭳ', 'ꭴ' => 'Ꭴ', 'ꭵ' => 'Ꭵ', 'ꭶ' => 'Ꭶ', 'ꭷ' => 'Ꭷ', 'ꭸ' => 'Ꭸ', 'ꭹ' => 'Ꭹ', 'ꭺ' => 'Ꭺ', 'ꭻ' => 'Ꭻ', 'ꭼ' => 'Ꭼ', 'ꭽ' => 'Ꭽ', 'ꭾ' => 'Ꭾ', 'ꭿ' => 'Ꭿ', 'ꮀ' => 'Ꮀ', 'ꮁ' => 'Ꮁ', 'ꮂ' => 'Ꮂ', 'ꮃ' => 'Ꮃ', 'ꮄ' => 'Ꮄ', 'ꮅ' => 'Ꮅ', 'ꮆ' => 'Ꮆ', 'ꮇ' => 'Ꮇ', 'ꮈ' => 'Ꮈ', 'ꮉ' => 'Ꮉ', 'ꮊ' => 'Ꮊ', 'ꮋ' => 'Ꮋ', 'ꮌ' => 'Ꮌ', 'ꮍ' => 'Ꮍ', 'ꮎ' => 'Ꮎ', 'ꮏ' => 'Ꮏ', 'ꮐ' => 'Ꮐ', 'ꮑ' => 'Ꮑ', 'ꮒ' => 'Ꮒ', 'ꮓ' => 'Ꮓ', 'ꮔ' => 'Ꮔ', 'ꮕ' => 'Ꮕ', 'ꮖ' => 'Ꮖ', 'ꮗ' => 'Ꮗ', 'ꮘ' => 'Ꮘ', 'ꮙ' => 'Ꮙ', 'ꮚ' => 'Ꮚ', 'ꮛ' => 'Ꮛ', 'ꮜ' => 'Ꮜ', 'ꮝ' => 'Ꮝ', 'ꮞ' => 'Ꮞ', 'ꮟ' => 'Ꮟ', 'ꮠ' => 'Ꮠ', 'ꮡ' => 'Ꮡ', 'ꮢ' => 'Ꮢ', 'ꮣ' => 'Ꮣ', 'ꮤ' => 'Ꮤ', 'ꮥ' => 'Ꮥ', 'ꮦ' => 'Ꮦ', 'ꮧ' => 'Ꮧ', 'ꮨ' => 'Ꮨ', 'ꮩ' => 'Ꮩ', 'ꮪ' => 'Ꮪ', 'ꮫ' => 'Ꮫ', 'ꮬ' => 'Ꮬ', 'ꮭ' => 'Ꮭ', 'ꮮ' => 'Ꮮ', 'ꮯ' => 'Ꮯ', 'ꮰ' => 'Ꮰ', 'ꮱ' => 'Ꮱ', 'ꮲ' => 'Ꮲ', 'ꮳ' => 'Ꮳ', 'ꮴ' => 'Ꮴ', 'ꮵ' => 'Ꮵ', 'ꮶ' => 'Ꮶ', 'ꮷ' => 'Ꮷ', 'ꮸ' => 'Ꮸ', 'ꮹ' => 'Ꮹ', 'ꮺ' => 'Ꮺ', 'ꮻ' => 'Ꮻ', 'ꮼ' => 'Ꮼ', 'ꮽ' => 'Ꮽ', 'ꮾ' => 'Ꮾ', 'ꮿ' => 'Ꮿ', 'a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', '𐐨' => '𐐀', '𐐩' => '𐐁', '𐐪' => '𐐂', '𐐫' => '𐐃', '𐐬' => '𐐄', '𐐭' => '𐐅', '𐐮' => '𐐆', '𐐯' => '𐐇', '𐐰' => '𐐈', '𐐱' => '𐐉', '𐐲' => '𐐊', '𐐳' => '𐐋', '𐐴' => '𐐌', '𐐵' => '𐐍', '𐐶' => '𐐎', '𐐷' => '𐐏', '𐐸' => '𐐐', '𐐹' => '𐐑', '𐐺' => '𐐒', '𐐻' => '𐐓', '𐐼' => '𐐔', '𐐽' => '𐐕', '𐐾' => '𐐖', '𐐿' => '𐐗', '𐑀' => '𐐘', '𐑁' => '𐐙', '𐑂' => '𐐚', '𐑃' => '𐐛', '𐑄' => '𐐜', '𐑅' => '𐐝', '𐑆' => '𐐞', '𐑇' => '𐐟', '𐑈' => '𐐠', '𐑉' => '𐐡', '𐑊' => '𐐢', '𐑋' => '𐐣', '𐑌' => '𐐤', '𐑍' => '𐐥', '𐑎' => '𐐦', '𐑏' => '𐐧', '𐓘' => '𐒰', '𐓙' => '𐒱', '𐓚' => '𐒲', '𐓛' => '𐒳', '𐓜' => '𐒴', '𐓝' => '𐒵', '𐓞' => '𐒶', '𐓟' => '𐒷', '𐓠' => '𐒸', '𐓡' => '𐒹', '𐓢' => '𐒺', '𐓣' => '𐒻', '𐓤' => '𐒼', '𐓥' => '𐒽', '𐓦' => '𐒾', '𐓧' => '𐒿', '𐓨' => '𐓀', '𐓩' => '𐓁', '𐓪' => '𐓂', '𐓫' => '𐓃', '𐓬' => '𐓄', '𐓭' => '𐓅', '𐓮' => '𐓆', '𐓯' => '𐓇', '𐓰' => '𐓈', '𐓱' => '𐓉', '𐓲' => '𐓊', '𐓳' => '𐓋', '𐓴' => '𐓌', '𐓵' => '𐓍', '𐓶' => '𐓎', '𐓷' => '𐓏', '𐓸' => '𐓐', '𐓹' => '𐓑', '𐓺' => '𐓒', '𐓻' => '𐓓', '𐳀' => '𐲀', '𐳁' => '𐲁', '𐳂' => '𐲂', '𐳃' => '𐲃', '𐳄' => '𐲄', '𐳅' => '𐲅', '𐳆' => '𐲆', '𐳇' => '𐲇', '𐳈' => '𐲈', '𐳉' => '𐲉', '𐳊' => '𐲊', '𐳋' => '𐲋', '𐳌' => '𐲌', '𐳍' => '𐲍', '𐳎' => '𐲎', '𐳏' => '𐲏', '𐳐' => '𐲐', '𐳑' => '𐲑', '𐳒' => '𐲒', '𐳓' => '𐲓', '𐳔' => '𐲔', '𐳕' => '𐲕', '𐳖' => '𐲖', '𐳗' => '𐲗', '𐳘' => '𐲘', '𐳙' => '𐲙', '𐳚' => '𐲚', '𐳛' => '𐲛', '𐳜' => '𐲜', '𐳝' => '𐲝', '𐳞' => '𐲞', '𐳟' => '𐲟', '𐳠' => '𐲠', '𐳡' => '𐲡', '𐳢' => '𐲢', '𐳣' => '𐲣', '𐳤' => '𐲤', '𐳥' => '𐲥', '𐳦' => '𐲦', '𐳧' => '𐲧', '𐳨' => '𐲨', '𐳩' => '𐲩', '𐳪' => '𐲪', '𐳫' => '𐲫', '𐳬' => '𐲬', '𐳭' => '𐲭', '𐳮' => '𐲮', '𐳯' => '𐲯', '𐳰' => '𐲰', '𐳱' => '𐲱', '𐳲' => '𐲲', '𑣀' => '𑢠', '𑣁' => '𑢡', '𑣂' => '𑢢', '𑣃' => '𑢣', '𑣄' => '𑢤', '𑣅' => '𑢥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', '𑣍' => '𑢭', '𑣎' => '𑢮', '𑣏' => '𑢯', '𑣐' => '𑢰', '𑣑' => '𑢱', '𑣒' => '𑢲', '𑣓' => '𑢳', '𑣔' => '𑢴', '𑣕' => '𑢵', '𑣖' => '𑢶', '𑣗' => '𑢷', '𑣘' => '𑢸', '𑣙' => '𑢹', '𑣚' => '𑢺', '𑣛' => '𑢻', '𑣜' => '𑢼', '𑣝' => '𑢽', '𑣞' => '𑢾', '𑣟' => '𑢿', '𖹠' => '𖹀', '𖹡' => '𖹁', '𖹢' => '𖹂', '𖹣' => '𖹃', '𖹤' => '𖹄', '𖹥' => '𖹅', '𖹦' => '𖹆', '𖹧' => '𖹇', '𖹨' => '𖹈', '𖹩' => '𖹉', '𖹪' => '𖹊', '𖹫' => '𖹋', '𖹬' => '𖹌', '𖹭' => '𖹍', '𖹮' => '𖹎', '𖹯' => '𖹏', '𖹰' => '𖹐', '𖹱' => '𖹑', '𖹲' => '𖹒', '𖹳' => '𖹓', '𖹴' => '𖹔', '𖹵' => '𖹕', '𖹶' => '𖹖', '𖹷' => '𖹗', '𖹸' => '𖹘', '𖹹' => '𖹙', '𖹺' => '𖹚', '𖹻' => '𖹛', '𖹼' => '𖹜', '𖹽' => '𖹝', '𖹾' => '𖹞', '𖹿' => '𖹟', '𞤢' => '𞤀', '𞤣' => '𞤁', '𞤤' => '𞤂', '𞤥' => '𞤃', '𞤦' => '𞤄', '𞤧' => '𞤅', '𞤨' => '𞤆', '𞤩' => '𞤇', '𞤪' => '𞤈', '𞤫' => '𞤉', '𞤬' => '𞤊', '𞤭' => '𞤋', '𞤮' => '𞤌', '𞤯' => '𞤍', '𞤰' => '𞤎', '𞤱' => '𞤏', '𞤲' => '𞤐', '𞤳' => '𞤑', '𞤴' => '𞤒', '𞤵' => '𞤓', '𞤶' => '𞤔', '𞤷' => '𞤕', '𞤸' => '𞤖', '𞤹' => '𞤗', '𞤺' => '𞤘', '𞤻' => '𞤙', '𞤼' => '𞤚', '𞤽' => '𞤛', '𞤾' => '𞤜', '𞤿' => '𞤝', '𞥀' => '𞤞', '𞥁' => '𞤟', '𞥂' => '𞤠', '𞥃' => '𞤡', 'ß' => 'SS', 'ff' => 'FF', 'fi' => 'FI', 'fl' => 'FL', 'ffi' => 'FFI', 'ffl' => 'FFL', 'ſt' => 'ST', 'st' => 'ST', 'և' => 'ԵՒ', 'ﬓ' => 'ՄՆ', 'ﬔ' => 'ՄԵ', 'ﬕ' => 'ՄԻ', 'ﬖ' => 'ՎՆ', 'ﬗ' => 'ՄԽ', 'ʼn' => 'ʼN', 'ΐ' => 'Ϊ́', 'ΰ' => 'Ϋ́', 'ǰ' => 'J̌', 'ẖ' => 'H̱', 'ẗ' => 'T̈', 'ẘ' => 'W̊', 'ẙ' => 'Y̊', 'ẚ' => 'Aʾ', 'ὐ' => 'Υ̓', 'ὒ' => 'Υ̓̀', 'ὔ' => 'Υ̓́', 'ὖ' => 'Υ̓͂', 'ᾶ' => 'Α͂', 'ῆ' => 'Η͂', 'ῒ' => 'Ϊ̀', 'ΐ' => 'Ϊ́', 'ῖ' => 'Ι͂', 'ῗ' => 'Ϊ͂', 'ῢ' => 'Ϋ̀', 'ΰ' => 'Ϋ́', 'ῤ' => 'Ρ̓', 'ῦ' => 'Υ͂', 'ῧ' => 'Ϋ͂', 'ῶ' => 'Ω͂', 'ᾈ' => 'ἈΙ', 'ᾉ' => 'ἉΙ', 'ᾊ' => 'ἊΙ', 'ᾋ' => 'ἋΙ', 'ᾌ' => 'ἌΙ', 'ᾍ' => 'ἍΙ', 'ᾎ' => 'ἎΙ', 'ᾏ' => 'ἏΙ', 'ᾘ' => 'ἨΙ', 'ᾙ' => 'ἩΙ', 'ᾚ' => 'ἪΙ', 'ᾛ' => 'ἫΙ', 'ᾜ' => 'ἬΙ', 'ᾝ' => 'ἭΙ', 'ᾞ' => 'ἮΙ', 'ᾟ' => 'ἯΙ', 'ᾨ' => 'ὨΙ', 'ᾩ' => 'ὩΙ', 'ᾪ' => 'ὪΙ', 'ᾫ' => 'ὫΙ', 'ᾬ' => 'ὬΙ', 'ᾭ' => 'ὭΙ', 'ᾮ' => 'ὮΙ', 'ᾯ' => 'ὯΙ', 'ᾼ' => 'ΑΙ', 'ῌ' => 'ΗΙ', 'ῼ' => 'ΩΙ', 'ᾲ' => 'ᾺΙ', 'ᾴ' => 'ΆΙ', 'ῂ' => 'ῊΙ', 'ῄ' => 'ΉΙ', 'ῲ' => 'ῺΙ', 'ῴ' => 'ΏΙ', 'ᾷ' => 'Α͂Ι', 'ῇ' => 'Η͂Ι', 'ῷ' => 'Ω͂Ι', ); ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-mbstring/bootstrap.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Mbstring as p; if (\PHP_VERSION_ID >= 80000) { return require __DIR__.'/bootstrap80.php'; } if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } } if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } } if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } } if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } } if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } } if (!function_exists('mb_convert_case')) { function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } } if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } } if (!function_exists('mb_language')) { function mb_language($language = null) { return p\Mbstring::mb_language($language); } } if (!function_exists('mb_list_encodings')) { function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } } if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } } if (!function_exists('mb_check_encoding')) { function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } } if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } } if (!function_exists('mb_detect_order')) { function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } } if (!function_exists('mb_parse_str')) { function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; } } if (!function_exists('mb_strlen')) { function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } } if (!function_exists('mb_strpos')) { function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } } if (!function_exists('mb_strtolower')) { function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } } if (!function_exists('mb_strtoupper')) { function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } } if (!function_exists('mb_substitute_character')) { function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } } if (!function_exists('mb_substr')) { function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } } if (!function_exists('mb_stripos')) { function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } } if (!function_exists('mb_stristr')) { function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } } if (!function_exists('mb_strrchr')) { function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } } if (!function_exists('mb_strrichr')) { function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } } if (!function_exists('mb_strripos')) { function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } } if (!function_exists('mb_strrpos')) { function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } } if (!function_exists('mb_strstr')) { function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } } if (!function_exists('mb_get_info')) { function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } } if (!function_exists('mb_http_output')) { function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } } if (!function_exists('mb_strwidth')) { function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } } if (!function_exists('mb_substr_count')) { function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } } if (!function_exists('mb_output_handler')) { function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } } if (!function_exists('mb_http_input')) { function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); } } if (!function_exists('mb_convert_variables')) { function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } } if (!function_exists('mb_ord')) { function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } } if (!function_exists('mb_chr')) { function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } } if (!function_exists('mb_scrub')) { function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } } if (!function_exists('mb_str_split')) { function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } } if (!function_exists('mb_str_pad')) { function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } } if (extension_loaded('mbstring')) { return; } if (!defined('MB_CASE_UPPER')) { define('MB_CASE_UPPER', 0); } if (!defined('MB_CASE_LOWER')) { define('MB_CASE_LOWER', 1); } if (!defined('MB_CASE_TITLE')) { define('MB_CASE_TITLE', 2); } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-mbstring/bootstrap80.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Mbstring as p; if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); } } if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); } } if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); } } if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); } } if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); } } if (!function_exists('mb_convert_case')) { function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); } } if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); } } if (!function_exists('mb_language')) { function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); } } if (!function_exists('mb_list_encodings')) { function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); } } if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); } } if (!function_exists('mb_check_encoding')) { function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); } } if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); } } if (!function_exists('mb_detect_order')) { function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); } } if (!function_exists('mb_parse_str')) { function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; } } if (!function_exists('mb_strlen')) { function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); } } if (!function_exists('mb_strpos')) { function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_strtolower')) { function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); } } if (!function_exists('mb_strtoupper')) { function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); } } if (!function_exists('mb_substitute_character')) { function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); } } if (!function_exists('mb_substr')) { function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); } } if (!function_exists('mb_stripos')) { function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_stristr')) { function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_strrchr')) { function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_strrichr')) { function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_strripos')) { function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_strrpos')) { function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_strstr')) { function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_get_info')) { function mb_get_info(?string $type = 'all'): array|string|int|false { return p\Mbstring::mb_get_info((string) $type); } } if (!function_exists('mb_http_output')) { function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); } } if (!function_exists('mb_strwidth')) { function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); } } if (!function_exists('mb_substr_count')) { function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); } } if (!function_exists('mb_output_handler')) { function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); } } if (!function_exists('mb_http_input')) { function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); } } if (!function_exists('mb_convert_variables')) { function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); } } if (!function_exists('mb_ord')) { function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); } } if (!function_exists('mb_chr')) { function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } } if (!function_exists('mb_scrub')) { function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); } } if (!function_exists('mb_str_split')) { function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } } if (!function_exists('mb_str_pad')) { function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } } if (extension_loaded('mbstring')) { return; } if (!defined('MB_CASE_UPPER')) { define('MB_CASE_UPPER', 0); } if (!defined('MB_CASE_LOWER')) { define('MB_CASE_LOWER', 1); } if (!defined('MB_CASE_TITLE')) { define('MB_CASE_TITLE', 2); } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-mbstring/composer.json ================================================ { "name": "symfony/polyfill-mbstring", "type": "library", "description": "Symfony polyfill for the Mbstring extension", "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=7.1" }, "provide": { "ext-mbstring": "*" }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, "files": [ "bootstrap.php" ] }, "suggest": { "ext-mbstring": "For best performance" }, "minimum-stability": "dev", "extra": { "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/LICENSE ================================================ Copyright (c) 2020-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/Php80.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Php80; /** * @author Ion Bazan * @author Nico Oelgart * @author Nicolas Grekas * * @internal */ final class Php80 { public static function fdiv(float $dividend, float $divisor): float { return @($dividend / $divisor); } public static function get_debug_type($value): string { switch (true) { case null === $value: return 'null'; case \is_bool($value): return 'bool'; case \is_string($value): return 'string'; case \is_array($value): return 'array'; case \is_int($value): return 'int'; case \is_float($value): return 'float'; case \is_object($value): break; case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; default: if (null === $type = @get_resource_type($value)) { return 'unknown'; } if ('Unknown' === $type) { $type = 'closed'; } return "resource ($type)"; } $class = \get_class($value); if (false === strpos($class, '@')) { return $class; } return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; } public static function get_resource_id($res): int { if (!\is_resource($res) && null === @get_resource_type($res)) { throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); } return (int) $res; } public static function preg_last_error_msg(): string { switch (preg_last_error()) { case \PREG_INTERNAL_ERROR: return 'Internal error'; case \PREG_BAD_UTF8_ERROR: return 'Malformed UTF-8 characters, possibly incorrectly encoded'; case \PREG_BAD_UTF8_OFFSET_ERROR: return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; case \PREG_BACKTRACK_LIMIT_ERROR: return 'Backtrack limit exhausted'; case \PREG_RECURSION_LIMIT_ERROR: return 'Recursion limit exhausted'; case \PREG_JIT_STACKLIMIT_ERROR: return 'JIT stack limit exhausted'; case \PREG_NO_ERROR: return 'No error'; default: return 'Unknown error'; } } public static function str_contains(string $haystack, string $needle): bool { return '' === $needle || false !== strpos($haystack, $needle); } public static function str_starts_with(string $haystack, string $needle): bool { return 0 === strncmp($haystack, $needle, \strlen($needle)); } public static function str_ends_with(string $haystack, string $needle): bool { if ('' === $needle || $needle === $haystack) { return true; } if ('' === $haystack) { return false; } $needleLength = \strlen($needle); return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/PhpToken.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Php80; /** * @author Fedonyuk Anton * * @internal */ class PhpToken implements \Stringable { /** * @var int */ public $id; /** * @var string */ public $text; /** * @var int */ public $line; /** * @var int */ public $pos; public function __construct(int $id, string $text, int $line = -1, int $position = -1) { $this->id = $id; $this->text = $text; $this->line = $line; $this->pos = $position; } public function getTokenName(): ?string { if ('UNKNOWN' === $name = token_name($this->id)) { $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text; } return $name; } /** * @param int|string|array $kind */ public function is($kind): bool { foreach ((array) $kind as $value) { if (\in_array($value, [$this->id, $this->text], true)) { return true; } } return false; } public function isIgnorable(): bool { return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true); } public function __toString(): string { return (string) $this->text; } /** * @return static[] */ public static function tokenize(string $code, int $flags = 0): array { $line = 1; $position = 0; $tokens = token_get_all($code, $flags); foreach ($tokens as $index => $token) { if (\is_string($token)) { $id = \ord($token); $text = $token; } else { [$id, $text, $line] = $token; } $tokens[$index] = new static($id, $text, $line, $position); $position += \strlen($text); } return $tokens; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/README.md ================================================ Symfony Polyfill / Php80 ======================== This component provides features added to PHP 8.0 core: - [`Stringable`](https://php.net/stringable) interface - [`fdiv`](https://php.net/fdiv) - [`ValueError`](https://php.net/valueerror) class - [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class - `FILTER_VALIDATE_BOOL` constant - [`get_debug_type`](https://php.net/get_debug_type) - [`PhpToken`](https://php.net/phptoken) class - [`preg_last_error_msg`](https://php.net/preg_last_error_msg) - [`str_contains`](https://php.net/str_contains) - [`str_starts_with`](https://php.net/str_starts_with) - [`str_ends_with`](https://php.net/str_ends_with) - [`get_resource_id`](https://php.net/get_resource_id) More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= This library is released under the [MIT license](LICENSE). ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ #[Attribute(Attribute::TARGET_CLASS)] final class Attribute { public const TARGET_CLASS = 1; public const TARGET_FUNCTION = 2; public const TARGET_METHOD = 4; public const TARGET_PROPERTY = 8; public const TARGET_CLASS_CONSTANT = 16; public const TARGET_PARAMETER = 32; public const TARGET_ALL = 63; public const IS_REPEATABLE = 64; /** @var int */ public $flags; public function __construct(int $flags = self::TARGET_ALL) { $this->flags = $flags; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) { class PhpToken extends Symfony\Polyfill\Php80\PhpToken { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80000) { interface Stringable { /** * @return string */ public function __toString(); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80000) { class UnhandledMatchError extends Error { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80000) { class ValueError extends Error { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/bootstrap.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Php80 as p; if (\PHP_VERSION_ID >= 80000) { return; } if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) { define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN); } if (!function_exists('fdiv')) { function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); } } if (!function_exists('preg_last_error_msg')) { function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); } } if (!function_exists('str_contains')) { function str_contains(?string $haystack, ?string $needle): bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); } } if (!function_exists('str_starts_with')) { function str_starts_with(?string $haystack, ?string $needle): bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); } } if (!function_exists('str_ends_with')) { function str_ends_with(?string $haystack, ?string $needle): bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); } } if (!function_exists('get_debug_type')) { function get_debug_type($value): string { return p\Php80::get_debug_type($value); } } if (!function_exists('get_resource_id')) { function get_resource_id($resource): int { return p\Php80::get_resource_id($resource); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php80/composer.json ================================================ { "name": "symfony/polyfill-php80", "type": "library", "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "keywords": ["polyfill", "shim", "compatibility", "portable"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Ion Bazan", "email": "ion.bazan@gmail.com" }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=7.1" }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, "files": [ "bootstrap.php" ], "classmap": [ "Resources/stubs" ] }, "minimum-stability": "dev", "extra": { "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/LICENSE ================================================ Copyright (c) 2022-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Php83.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Php83; /** * @author Ion Bazan * @author Pierre Ambroise * * @internal */ final class Php83 { private const JSON_MAX_DEPTH = 0x7FFFFFFF; // see https://www.php.net/manual/en/function.json-decode.php public static function json_validate(string $json, int $depth = 512, int $flags = 0): bool { if (0 !== $flags && \defined('JSON_INVALID_UTF8_IGNORE') && \JSON_INVALID_UTF8_IGNORE !== $flags) { throw new \ValueError('json_validate(): Argument #3 ($flags) must be a valid flag (allowed flags: JSON_INVALID_UTF8_IGNORE)'); } if ($depth <= 0) { throw new \ValueError('json_validate(): Argument #2 ($depth) must be greater than 0'); } if ($depth > self::JSON_MAX_DEPTH) { throw new \ValueError(sprintf('json_validate(): Argument #2 ($depth) must be less than %d', self::JSON_MAX_DEPTH)); } json_decode($json, null, $depth, $flags); return \JSON_ERROR_NONE === json_last_error(); } public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, string $encoding = null): string { if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); } if (null === $encoding) { $encoding = mb_internal_encoding(); } try { $validEncoding = @mb_check_encoding('', $encoding); } catch (\ValueError $e) { throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); } // BC for PHP 7.3 and lower if (!$validEncoding) { throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); } if (mb_strlen($pad_string, $encoding) <= 0) { throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); } $paddingRequired = $length - mb_strlen($string, $encoding); if ($paddingRequired < 1) { return $string; } switch ($pad_type) { case \STR_PAD_LEFT: return mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string; case \STR_PAD_RIGHT: return $string.mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); default: $leftPaddingLength = floor($paddingRequired / 2); $rightPaddingLength = $paddingRequired - $leftPaddingLength; return mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); } } public static function str_increment(string $string): string { if ('' === $string) { throw new \ValueError('str_increment(): Argument #1 ($string) cannot be empty'); } if (!\preg_match("/^[a-zA-Z0-9]+$/", $string)) { throw new \ValueError('str_increment(): Argument #1 ($string) must be composed only of alphanumeric ASCII characters'); } if (\is_numeric($string)) { $offset = stripos($string, 'e'); if ($offset !== false) { $char = $string[$offset]; $char++; $string[$offset] = $char; $string++; switch ($string[$offset]) { case 'f': $string[$offset] = 'e'; break; case 'F': $string[$offset] = 'E'; break; case 'g': $string[$offset] = 'f'; break; case 'G': $string[$offset] = 'F'; break; } return $string; } } return ++$string; } public static function str_decrement(string $string): string { if ('' === $string) { throw new \ValueError('str_decrement(): Argument #1 ($string) cannot be empty'); } if (!\preg_match("/^[a-zA-Z0-9]+$/", $string)) { throw new \ValueError('str_decrement(): Argument #1 ($string) must be composed only of alphanumeric ASCII characters'); } if (\preg_match('/\A(?:0[aA0]?|[aA])\z/', $string)) { throw new \ValueError(sprintf('str_decrement(): Argument #1 ($string) "%s" is out of decrement range', $string)); } if (!\in_array(substr($string, -1), ['A', 'a', '0'], true)) { return join('', array_slice(str_split($string), 0, -1)) . chr(ord(substr($string, -1)) - 1); } $carry = ''; $decremented = ''; for ($i = strlen($string) - 1; $i >= 0; $i--) { $char = $string[$i]; switch ($char) { case 'A': if ('' !== $carry) { $decremented = $carry . $decremented; $carry = ''; } $carry = 'Z'; break; case 'a': if ('' !== $carry) { $decremented = $carry . $decremented; $carry = ''; } $carry = 'z'; break; case '0': if ('' !== $carry) { $decremented = $carry . $decremented; $carry = ''; } $carry = '9'; break; case '1': if ('' !== $carry) { $decremented = $carry . $decremented; $carry = ''; } break; default: if ('' !== $carry) { $decremented = $carry . $decremented; $carry = ''; } if (!\in_array($char, ['A', 'a', '0'], true)) { $decremented = chr(ord($char) - 1) . $decremented; } } } return $decremented; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/README.md ================================================ Symfony Polyfill / Php83 ======================== This component provides features added to PHP 8.3 core: - [`json_validate`](https://wiki.php.net/rfc/json_validate) - [`Override`](https://wiki.php.net/rfc/marking_overriden_methods) - [`mb_str_pad`](https://wiki.php.net/rfc/mb_str_pad) - [`ldap_exop_sync`](https://wiki.php.net/rfc/deprecate_functions_with_overloaded_signatures) - [`ldap_connect_wallet`](https://wiki.php.net/rfc/deprecate_functions_with_overloaded_signatures) - [`stream_context_set_options`](https://wiki.php.net/rfc/deprecate_functions_with_overloaded_signatures) - [`str_increment` and `str_decrement`](https://wiki.php.net/rfc/saner-inc-dec-operators) - [`Date*Exception/Error classes`](https://wiki.php.net/rfc/datetime-exceptions) - [`SQLite3Exception`](https://wiki.php.net/rfc/sqlite3_exceptions) More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= This library is released under the [MIT license](LICENSE). ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { class DateError extends Error { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { class DateException extends Exception { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { class DateInvalidOperationException extends DateException { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { class DateInvalidTimeZoneException extends DateException { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { class DateMalformedIntervalStringException extends DateException { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { class DateMalformedPeriodStringException extends DateException { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { class DateMalformedStringException extends DateException { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { class DateObjectError extends DateError { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { class DateRangeError extends DateError { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/Override.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { #[Attribute(Attribute::TARGET_METHOD)] final class Override { public function __construct() { } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80300) { class SQLite3Exception extends Exception { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/bootstrap.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Php83 as p; if (\PHP_VERSION_ID >= 80300) { return; } if (!function_exists('json_validate')) { function json_validate(string $json, int $depth = 512, int $flags = 0): bool { return p\Php83::json_validate($json, $depth, $flags); } } if (!function_exists('mb_str_pad') && function_exists('mb_substr')) { function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Php83::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } } if (!function_exists('stream_context_set_options')) { function stream_context_set_options($context, array $options): bool { return stream_context_set_option($context, $options); } } if (!function_exists('str_increment')) { function str_increment(string $string): string { return p\Php83::str_increment($string); } } if (!function_exists('str_decrement')) { function str_decrement(string $string): string { return p\Php83::str_decrement($string); } } if (\PHP_VERSION_ID >= 80100) { return require __DIR__.'/bootstrap81.php'; } if (!function_exists('ldap_exop_sync') && function_exists('ldap_exop')) { function ldap_exop_sync($ldap, string $request_oid, string $request_data = null, array $controls = null, &$response_data = null, &$response_oid = null): bool { return ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid); } } if (!function_exists('ldap_connect_wallet') && function_exists('ldap_connect')) { function ldap_connect_wallet(?string $uri, string $wallet, string $password, int $auth_mode = \GSLC_SSL_NO_AUTH) { return ldap_connect($uri, $wallet, $password, $auth_mode); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/bootstrap81.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID >= 80300) { return; } if (!function_exists('ldap_exop_sync') && function_exists('ldap_exop')) { function ldap_exop_sync(\LDAP\Connection $ldap, string $request_oid, string $request_data = null, array $controls = null, &$response_data = null, &$response_oid = null): bool { return ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid); } } if (!function_exists('ldap_connect_wallet') && function_exists('ldap_connect')) { function ldap_connect_wallet(?string $uri, string $wallet, #[\SensitiveParameter] string $password, int $auth_mode = \GSLC_SSL_NO_AUTH): \LDAP\Connection|false { return ldap_connect($uri, $wallet, $password, $auth_mode); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/polyfill-php83/composer.json ================================================ { "name": "symfony/polyfill-php83", "type": "library", "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "keywords": ["polyfill", "shim", "compatibility", "portable"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=7.1", "symfony/polyfill-php80": "^1.14" }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Php83\\": "" }, "files": [ "bootstrap.php" ], "classmap": [ "Resources/stubs" ] }, "minimum-stability": "dev", "extra": { "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/.php-cs-fixer.dist.php ================================================ setRules([ '@Symfony' => true, '@Symfony:risky' => true, '@PHPUnit48Migration:risky' => true, 'php_unit_no_expectation_annotation' => false, // part of `PHPUnitXYMigration:risky` ruleset, to be enabled when PHPUnit 4.x support will be dropped, as we don't want to rewrite exceptions handling twice 'array_syntax' => ['syntax' => 'short'], 'fopen_flags' => false, 'ordered_imports' => true, 'protected_to_private' => false, // Part of @Symfony:risky in PHP-CS-Fixer 2.13.0. To be removed from the config file once upgrading 'native_function_invocation' => ['include' => ['@compiler_optimized'], 'scope' => 'namespaced'], // Part of future @Symfony ruleset in PHP-CS-Fixer To be removed from the config file once upgrading 'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'], ]) ->setRiskyAllowed(true) ->setFinder( (new PhpCsFixer\Finder()) ->in(__DIR__) ->exclude('vendor') ->name('*.php') ) ; ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/ArgumentValueResolver/PsrServerRequestResolver.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bridge\PsrHttpMessage\ArgumentValueResolver; use Psr\Http\Message\MessageInterface; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; use Symfony\Component\HttpKernel\Controller\ValueResolverInterface as BaseValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; /** * Injects the RequestInterface, MessageInterface or ServerRequestInterface when requested. * * @author Iltar van der Berg * @author Alexander M. Turek */ final class PsrServerRequestResolver implements ArgumentValueResolverInterface, ValueResolverInterface { private const SUPPORTED_TYPES = [ ServerRequestInterface::class => true, RequestInterface::class => true, MessageInterface::class => true, ]; private $httpMessageFactory; public function __construct(HttpMessageFactoryInterface $httpMessageFactory) { $this->httpMessageFactory = $httpMessageFactory; } /** * {@inheritdoc} */ public function supports(Request $request, ArgumentMetadata $argument): bool { if ($this instanceof BaseValueResolverInterface) { trigger_deprecation('symfony/psr-http-message-bridge', '2.3', 'Method "%s" is deprecated, call "resolve()" without calling "supports()" first.', __METHOD__); } return self::SUPPORTED_TYPES[$argument->getType()] ?? false; } /** * {@inheritdoc} */ public function resolve(Request $request, ArgumentMetadata $argument): \Traversable { if (!isset(self::SUPPORTED_TYPES[$argument->getType()])) { return; } yield $this->httpMessageFactory->createRequest($request); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/ArgumentValueResolver/ValueResolverInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bridge\PsrHttpMessage\ArgumentValueResolver; use Symfony\Component\HttpKernel\Controller\ValueResolverInterface as BaseValueResolverInterface; if (interface_exists(BaseValueResolverInterface::class)) { /** @internal */ interface ValueResolverInterface extends BaseValueResolverInterface { } } else { /** @internal */ interface ValueResolverInterface { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/CHANGELOG.md ================================================ CHANGELOG ========= # 2.3.1 (2023-07-26) * Don't rely on `Request::getPayload()` to populate the parsed body # 2.3.0 (2023-07-25) * Leverage `Request::getPayload()` to populate the parsed body of PSR-7 requests * Implement `ValueResolverInterface` introduced with Symfony 6.2 # 2.2.0 (2023-04-21) * Drop support for Symfony 4 * Bump minimum version of PHP to 7.2 * Support version 2 of the psr/http-message contracts # 2.1.3 (2022-09-05) * Ignore invalid HTTP headers when creating PSR7 objects * Fix for wrong type passed to `moveTo()` # 2.1.2 (2021-11-05) * Allow Symfony 6 # 2.1.0 (2021-02-17) * Added a `PsrResponseListener` to automatically convert PSR-7 responses returned by controllers * Added a `PsrServerRequestResolver` that allows injecting PSR-7 request objects into controllers # 2.0.2 (2020-09-29) * Fix populating server params from URI in HttpFoundationFactory * Create cookies as raw in HttpFoundationFactory * Fix BinaryFileResponse with Content-Range PsrHttpFactory # 2.0.1 (2020-06-25) * Don't normalize query string in PsrHttpFactory * Fix conversion for HTTPS requests * Fix populating default port and headers in HttpFoundationFactory # 2.0.0 (2020-01-02) * Remove DiactorosFactory # 1.3.0 (2019-11-25) * Added support for streamed requests * Added support for Symfony 5.0+ * Fixed bridging UploadedFile objects * Bumped minimum version of Symfony to 4.4 # 1.2.0 (2019-03-11) * Added new documentation links * Bumped minimum version of PHP to 7.1 * Added support for streamed responses # 1.1.2 (2019-04-03) * Fixed createResponse # 1.1.1 (2019-03-11) * Deprecated DiactorosFactory, use PsrHttpFactory instead * Removed triggering of deprecation # 1.1.0 (2018-08-30) * Added support for creating PSR-7 messages using PSR-17 factories # 1.0.2 (2017-12-19) * Fixed request target in PSR7 Request (mtibben) # 1.0.1 (2017-12-04) * Added support for Symfony 4 (dunglas) # 1.0.0 (2016-09-14) * Initial release ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/EventListener/PsrResponseListener.php ================================================ * @author Alexander M. Turek */ final class PsrResponseListener implements EventSubscriberInterface { private $httpFoundationFactory; public function __construct(HttpFoundationFactoryInterface $httpFoundationFactory = null) { $this->httpFoundationFactory = $httpFoundationFactory ?? new HttpFoundationFactory(); } /** * Do the conversion if applicable and update the response of the event. */ public function onKernelView(ViewEvent $event): void { $controllerResult = $event->getControllerResult(); if (!$controllerResult instanceof ResponseInterface) { return; } $event->setResponse($this->httpFoundationFactory->createResponse($controllerResult)); } /** * {@inheritdoc} */ public static function getSubscribedEvents(): array { return [ KernelEvents::VIEW => 'onKernelView', ]; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/Factory/HttpFoundationFactory.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bridge\PsrHttpMessage\Factory; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\StreamInterface; use Psr\Http\Message\UploadedFileInterface; use Psr\Http\Message\UriInterface; use Symfony\Bridge\PsrHttpMessage\HttpFoundationFactoryInterface; use Symfony\Component\HttpFoundation\Cookie; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\StreamedResponse; /** * {@inheritdoc} * * @author Kévin Dunglas */ class HttpFoundationFactory implements HttpFoundationFactoryInterface { /** * @var int The maximum output buffering size for each iteration when sending the response */ private $responseBufferMaxLength; public function __construct(int $responseBufferMaxLength = 16372) { $this->responseBufferMaxLength = $responseBufferMaxLength; } /** * {@inheritdoc} * * @return Request */ public function createRequest(ServerRequestInterface $psrRequest, bool $streamed = false) { $server = []; $uri = $psrRequest->getUri(); if ($uri instanceof UriInterface) { $server['SERVER_NAME'] = $uri->getHost(); $server['SERVER_PORT'] = $uri->getPort() ?: ('https' === $uri->getScheme() ? 443 : 80); $server['REQUEST_URI'] = $uri->getPath(); $server['QUERY_STRING'] = $uri->getQuery(); if ('' !== $server['QUERY_STRING']) { $server['REQUEST_URI'] .= '?'.$server['QUERY_STRING']; } if ('https' === $uri->getScheme()) { $server['HTTPS'] = 'on'; } } $server['REQUEST_METHOD'] = $psrRequest->getMethod(); $server = array_replace($psrRequest->getServerParams(), $server); $parsedBody = $psrRequest->getParsedBody(); $parsedBody = \is_array($parsedBody) ? $parsedBody : []; $request = new Request( $psrRequest->getQueryParams(), $parsedBody, $psrRequest->getAttributes(), $psrRequest->getCookieParams(), $this->getFiles($psrRequest->getUploadedFiles()), $server, $streamed ? $psrRequest->getBody()->detach() : $psrRequest->getBody()->__toString() ); $request->headers->add($psrRequest->getHeaders()); return $request; } /** * Converts to the input array to $_FILES structure. */ private function getFiles(array $uploadedFiles): array { $files = []; foreach ($uploadedFiles as $key => $value) { if ($value instanceof UploadedFileInterface) { $files[$key] = $this->createUploadedFile($value); } else { $files[$key] = $this->getFiles($value); } } return $files; } /** * Creates Symfony UploadedFile instance from PSR-7 ones. */ private function createUploadedFile(UploadedFileInterface $psrUploadedFile): UploadedFile { return new UploadedFile($psrUploadedFile, function () { return $this->getTemporaryPath(); }); } /** * Gets a temporary file path. * * @return string */ protected function getTemporaryPath() { return tempnam(sys_get_temp_dir(), uniqid('symfony', true)); } /** * {@inheritdoc} * * @return Response */ public function createResponse(ResponseInterface $psrResponse, bool $streamed = false) { $cookies = $psrResponse->getHeader('Set-Cookie'); $psrResponse = $psrResponse->withoutHeader('Set-Cookie'); if ($streamed) { $response = new StreamedResponse( $this->createStreamedResponseCallback($psrResponse->getBody()), $psrResponse->getStatusCode(), $psrResponse->getHeaders() ); } else { $response = new Response( $psrResponse->getBody()->__toString(), $psrResponse->getStatusCode(), $psrResponse->getHeaders() ); } $response->setProtocolVersion($psrResponse->getProtocolVersion()); foreach ($cookies as $cookie) { $response->headers->setCookie($this->createCookie($cookie)); } return $response; } /** * Creates a Cookie instance from a cookie string. * * Some snippets have been taken from the Guzzle project: https://github.com/guzzle/guzzle/blob/5.3/src/Cookie/SetCookie.php#L34 * * @throws \InvalidArgumentException */ private function createCookie(string $cookie): Cookie { foreach (explode(';', $cookie) as $part) { $part = trim($part); $data = explode('=', $part, 2); $name = $data[0]; $value = isset($data[1]) ? trim($data[1], " \n\r\t\0\x0B\"") : null; if (!isset($cookieName)) { $cookieName = $name; $cookieValue = $value; continue; } if ('expires' === strtolower($name) && null !== $value) { $cookieExpire = new \DateTime($value); continue; } if ('path' === strtolower($name) && null !== $value) { $cookiePath = $value; continue; } if ('domain' === strtolower($name) && null !== $value) { $cookieDomain = $value; continue; } if ('secure' === strtolower($name)) { $cookieSecure = true; continue; } if ('httponly' === strtolower($name)) { $cookieHttpOnly = true; continue; } if ('samesite' === strtolower($name) && null !== $value) { $samesite = $value; continue; } } if (!isset($cookieName)) { throw new \InvalidArgumentException('The value of the Set-Cookie header is malformed.'); } return new Cookie( $cookieName, $cookieValue, $cookieExpire ?? 0, $cookiePath ?? '/', $cookieDomain ?? null, isset($cookieSecure), isset($cookieHttpOnly), true, $samesite ?? null ); } private function createStreamedResponseCallback(StreamInterface $body): callable { return function () use ($body) { if ($body->isSeekable()) { $body->rewind(); } if (!$body->isReadable()) { echo $body; return; } while (!$body->eof()) { echo $body->read($this->responseBufferMaxLength); } }; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/Factory/PsrHttpFactory.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bridge\PsrHttpMessage\Factory; use Psr\Http\Message\ResponseFactoryInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestFactoryInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\StreamFactoryInterface; use Psr\Http\Message\UploadedFileFactoryInterface; use Psr\Http\Message\UploadedFileInterface; use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\StreamedResponse; /** * Builds Psr\HttpMessage instances using a PSR-17 implementation. * * @author Antonio J. García Lagar * @author Aurélien Pillevesse */ class PsrHttpFactory implements HttpMessageFactoryInterface { private $serverRequestFactory; private $streamFactory; private $uploadedFileFactory; private $responseFactory; public function __construct(ServerRequestFactoryInterface $serverRequestFactory, StreamFactoryInterface $streamFactory, UploadedFileFactoryInterface $uploadedFileFactory, ResponseFactoryInterface $responseFactory) { $this->serverRequestFactory = $serverRequestFactory; $this->streamFactory = $streamFactory; $this->uploadedFileFactory = $uploadedFileFactory; $this->responseFactory = $responseFactory; } /** * {@inheritdoc} * * @return ServerRequestInterface */ public function createRequest(Request $symfonyRequest) { $uri = $symfonyRequest->server->get('QUERY_STRING', ''); $uri = $symfonyRequest->getSchemeAndHttpHost().$symfonyRequest->getBaseUrl().$symfonyRequest->getPathInfo().('' !== $uri ? '?'.$uri : ''); $request = $this->serverRequestFactory->createServerRequest( $symfonyRequest->getMethod(), $uri, $symfonyRequest->server->all() ); foreach ($symfonyRequest->headers->all() as $name => $value) { try { $request = $request->withHeader($name, $value); } catch (\InvalidArgumentException $e) { // ignore invalid header } } $body = $this->streamFactory->createStreamFromResource($symfonyRequest->getContent(true)); if (method_exists(Request::class, 'getContentTypeFormat')) { $format = $symfonyRequest->getContentTypeFormat(); } else { $format = $symfonyRequest->getContentType(); } if ('json' === $format) { $parsedBody = json_decode($symfonyRequest->getContent(), true, 512, \JSON_BIGINT_AS_STRING); if (!\is_array($parsedBody)) { $parsedBody = null; } } else { $parsedBody = $symfonyRequest->request->all(); } $request = $request ->withBody($body) ->withUploadedFiles($this->getFiles($symfonyRequest->files->all())) ->withCookieParams($symfonyRequest->cookies->all()) ->withQueryParams($symfonyRequest->query->all()) ->withParsedBody($parsedBody) ; foreach ($symfonyRequest->attributes->all() as $key => $value) { $request = $request->withAttribute($key, $value); } return $request; } /** * Converts Symfony uploaded files array to the PSR one. */ private function getFiles(array $uploadedFiles): array { $files = []; foreach ($uploadedFiles as $key => $value) { if (null === $value) { $files[$key] = $this->uploadedFileFactory->createUploadedFile($this->streamFactory->createStream(), 0, \UPLOAD_ERR_NO_FILE); continue; } if ($value instanceof UploadedFile) { $files[$key] = $this->createUploadedFile($value); } else { $files[$key] = $this->getFiles($value); } } return $files; } /** * Creates a PSR-7 UploadedFile instance from a Symfony one. */ private function createUploadedFile(UploadedFile $symfonyUploadedFile): UploadedFileInterface { return $this->uploadedFileFactory->createUploadedFile( $this->streamFactory->createStreamFromFile( $symfonyUploadedFile->getRealPath() ), (int) $symfonyUploadedFile->getSize(), $symfonyUploadedFile->getError(), $symfonyUploadedFile->getClientOriginalName(), $symfonyUploadedFile->getClientMimeType() ); } /** * {@inheritdoc} * * @return ResponseInterface */ public function createResponse(Response $symfonyResponse) { $response = $this->responseFactory->createResponse($symfonyResponse->getStatusCode(), Response::$statusTexts[$symfonyResponse->getStatusCode()] ?? ''); if ($symfonyResponse instanceof BinaryFileResponse && !$symfonyResponse->headers->has('Content-Range')) { $stream = $this->streamFactory->createStreamFromFile( $symfonyResponse->getFile()->getPathname() ); } else { $stream = $this->streamFactory->createStreamFromFile('php://temp', 'wb+'); if ($symfonyResponse instanceof StreamedResponse || $symfonyResponse instanceof BinaryFileResponse) { ob_start(function ($buffer) use ($stream) { $stream->write($buffer); return ''; }, 1); $symfonyResponse->sendContent(); ob_end_clean(); } else { $stream->write($symfonyResponse->getContent()); } } $response = $response->withBody($stream); $headers = $symfonyResponse->headers->all(); $cookies = $symfonyResponse->headers->getCookies(); if (!empty($cookies)) { $headers['Set-Cookie'] = []; foreach ($cookies as $cookie) { $headers['Set-Cookie'][] = $cookie->__toString(); } } foreach ($headers as $name => $value) { try { $response = $response->withHeader($name, $value); } catch (\InvalidArgumentException $e) { // ignore invalid header } } $protocolVersion = $symfonyResponse->getProtocolVersion(); $response = $response->withProtocolVersion($protocolVersion); return $response; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/Factory/UploadedFile.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bridge\PsrHttpMessage\Factory; use Psr\Http\Message\UploadedFileInterface; use Symfony\Component\HttpFoundation\File\Exception\FileException; use Symfony\Component\HttpFoundation\File\File; use Symfony\Component\HttpFoundation\File\UploadedFile as BaseUploadedFile; /** * @author Nicolas Grekas */ class UploadedFile extends BaseUploadedFile { private $psrUploadedFile; private $test = false; public function __construct(UploadedFileInterface $psrUploadedFile, callable $getTemporaryPath) { $error = $psrUploadedFile->getError(); $path = ''; if (\UPLOAD_ERR_NO_FILE !== $error) { $path = $psrUploadedFile->getStream()->getMetadata('uri') ?? ''; if ($this->test = !\is_string($path) || !is_uploaded_file($path)) { $path = $getTemporaryPath(); $psrUploadedFile->moveTo($path); } } parent::__construct( $path, (string) $psrUploadedFile->getClientFilename(), $psrUploadedFile->getClientMediaType(), $psrUploadedFile->getError(), $this->test ); $this->psrUploadedFile = $psrUploadedFile; } /** * {@inheritdoc} */ public function move(string $directory, string $name = null): File { if (!$this->isValid() || $this->test) { return parent::move($directory, $name); } $target = $this->getTargetFile($directory, $name); try { $this->psrUploadedFile->moveTo((string) $target); } catch (\RuntimeException $e) { throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, $e->getMessage()), 0, $e); } @chmod($target, 0666 & ~umask()); return $target; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/HttpFoundationFactoryInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bridge\PsrHttpMessage; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; /** * Creates Symfony Request and Response instances from PSR-7 ones. * * @author Kévin Dunglas */ interface HttpFoundationFactoryInterface { /** * Creates a Symfony Request instance from a PSR-7 one. * * @return Request */ public function createRequest(ServerRequestInterface $psrRequest, bool $streamed = false); /** * Creates a Symfony Response instance from a PSR-7 one. * * @return Response */ public function createResponse(ResponseInterface $psrResponse, bool $streamed = false); } ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/HttpMessageFactoryInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bridge\PsrHttpMessage; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; /** * Creates PSR HTTP Request and Response instances from Symfony ones. * * @author Kévin Dunglas */ interface HttpMessageFactoryInterface { /** * Creates a PSR-7 Request instance from a Symfony one. * * @return ServerRequestInterface */ public function createRequest(Request $symfonyRequest); /** * Creates a PSR-7 Response instance from a Symfony one. * * @return ResponseInterface */ public function createResponse(Response $symfonyResponse); } ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/LICENSE ================================================ Copyright (c) 2004-2021 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/README.md ================================================ PSR-7 Bridge ============ Provides integration for PSR7. Resources --------- * [Documentation](https://symfony.com/doc/current/components/psr7.html) Running the tests ----------------- If you want to run the unit tests, install dev dependencies before running PHPUnit: $ cd path/to/Symfony/Bridge/PsrHttpMessage/ $ composer.phar install $ phpunit ================================================ FILE: core/widget/wechatServer/vendor/symfony/psr-http-message-bridge/composer.json ================================================ { "name": "symfony/psr-http-message-bridge", "type": "symfony-bridge", "description": "PSR HTTP message bridge", "keywords": ["http", "psr-7", "psr-17", "http-message"], "homepage": "http://symfony.com", "license": "MIT", "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "require": { "php": ">=7.2.5", "psr/http-message": "^1.0 || ^2.0", "symfony/deprecation-contracts": "^2.5 || ^3.0", "symfony/http-foundation": "^5.4 || ^6.0" }, "require-dev": { "symfony/browser-kit": "^5.4 || ^6.0", "symfony/config": "^5.4 || ^6.0", "symfony/event-dispatcher": "^5.4 || ^6.0", "symfony/framework-bundle": "^5.4 || ^6.0", "symfony/http-kernel": "^5.4 || ^6.0", "symfony/phpunit-bridge": "^6.2", "nyholm/psr7": "^1.1", "psr/log": "^1.1 || ^2 || ^3" }, "suggest": { "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" }, "autoload": { "psr-4": { "Symfony\\Bridge\\PsrHttpMessage\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "extra": { "branch-alias": { "dev-main": "2.3-dev" } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/Attribute/Required.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service\Attribute; /** * A required dependency. * * This attribute indicates that a property holds a required dependency. The annotated property or method should be * considered during the instantiation process of the containing class. * * @author Alexander M. Turek */ #[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY)] final class Required { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/Attribute/SubscribedService.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service\Attribute; use Symfony\Contracts\Service\ServiceMethodsSubscriberTrait; use Symfony\Contracts\Service\ServiceSubscriberInterface; /** * For use as the return value for {@see ServiceSubscriberInterface}. * * @example new SubscribedService('http_client', HttpClientInterface::class, false, new Target('githubApi')) * * Use with {@see ServiceMethodsSubscriberTrait} to mark a method's return type * as a subscribed service. * * @author Kevin Bond */ #[\Attribute(\Attribute::TARGET_METHOD)] final class SubscribedService { /** @var object[] */ public array $attributes; /** * @param string|null $key The key to use for the service * @param class-string|null $type The service class * @param bool $nullable Whether the service is optional * @param object|object[] $attributes One or more dependency injection attributes to use */ public function __construct( public ?string $key = null, public ?string $type = null, public bool $nullable = false, array|object $attributes = [], ) { $this->attributes = \is_array($attributes) ? $attributes : [$attributes]; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/CHANGELOG.md ================================================ CHANGELOG ========= The changelog is maintained for all Symfony contracts at the following URL: https://github.com/symfony/contracts/blob/main/CHANGELOG.md ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/LICENSE ================================================ Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/README.md ================================================ Symfony Service Contracts ========================= A set of abstractions extracted out of the Symfony components. Can be used to build on semantics that the Symfony components proved useful and that already have battle tested implementations. See https://github.com/symfony/contracts/blob/main/README.md for more information. ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/ResetInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service; /** * Provides a way to reset an object to its initial state. * * When calling the "reset()" method on an object, it should be put back to its * initial state. This usually means clearing any internal buffers and forwarding * the call to internal dependencies. All properties of the object should be put * back to the same state it had when it was first ready to use. * * This method could be called, for example, to recycle objects that are used as * services, so that they can be used to handle several requests in the same * process loop (note that we advise making your services stateless instead of * implementing this interface when possible.) */ interface ResetInterface { /** * @return void */ public function reset(); } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/ServiceCollectionInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service; /** * A ServiceProviderInterface that is also countable and iterable. * * @author Kevin Bond * * @template-covariant T of mixed * * @extends ServiceProviderInterface * @extends \IteratorAggregate */ interface ServiceCollectionInterface extends ServiceProviderInterface, \Countable, \IteratorAggregate { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/ServiceLocatorTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; // Help opcache.preload discover always-needed symbols class_exists(ContainerExceptionInterface::class); class_exists(NotFoundExceptionInterface::class); /** * A trait to help implement ServiceProviderInterface. * * @author Robin Chalas * @author Nicolas Grekas */ trait ServiceLocatorTrait { private array $factories; private array $loading = []; private array $providedTypes; /** * @param array $factories */ public function __construct(array $factories) { $this->factories = $factories; } public function has(string $id): bool { return isset($this->factories[$id]); } public function get(string $id): mixed { if (!isset($this->factories[$id])) { throw $this->createNotFoundException($id); } if (isset($this->loading[$id])) { $ids = array_values($this->loading); $ids = \array_slice($this->loading, array_search($id, $ids)); $ids[] = $id; throw $this->createCircularReferenceException($id, $ids); } $this->loading[$id] = $id; try { return $this->factories[$id]($this); } finally { unset($this->loading[$id]); } } public function getProvidedServices(): array { if (!isset($this->providedTypes)) { $this->providedTypes = []; foreach ($this->factories as $name => $factory) { if (!\is_callable($factory)) { $this->providedTypes[$name] = '?'; } else { $type = (new \ReflectionFunction($factory))->getReturnType(); $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?'; } } } return $this->providedTypes; } private function createNotFoundException(string $id): NotFoundExceptionInterface { if (!$alternatives = array_keys($this->factories)) { $message = 'is empty...'; } else { $last = array_pop($alternatives); if ($alternatives) { $message = sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last); } else { $message = sprintf('only knows about the "%s" service.', $last); } } if ($this->loading) { $message = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message); } else { $message = sprintf('Service "%s" not found: the current service locator %s', $id, $message); } return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface { }; } private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface { return new class(sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface { }; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service; use Psr\Container\ContainerInterface; use Symfony\Contracts\Service\Attribute\Required; use Symfony\Contracts\Service\Attribute\SubscribedService; /** * Implementation of ServiceSubscriberInterface that determines subscribed services * from methods that have the #[SubscribedService] attribute. * * Service ids are available as "ClassName::methodName" so that the implementation * of subscriber methods can be just `return $this->container->get(__METHOD__);`. * * @author Kevin Bond */ trait ServiceMethodsSubscriberTrait { protected ContainerInterface $container; public static function getSubscribedServices(): array { $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { if (self::class !== $method->getDeclaringClass()->name) { continue; } if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) { continue; } if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { throw new \LogicException(sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name)); } if (!$returnType = $method->getReturnType()) { throw new \LogicException(sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class)); } /* @var SubscribedService $attribute */ $attribute = $attribute->newInstance(); $attribute->key ??= self::class.'::'.$method->name; $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; $attribute->nullable = $returnType->allowsNull(); if ($attribute->attributes) { $services[] = $attribute; } else { $services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type; } } return $services; } #[Required] public function setContainer(ContainerInterface $container): ?ContainerInterface { $ret = null; if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) { $ret = parent::setContainer($container); } $this->container = $container; return $ret; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/ServiceProviderInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service; use Psr\Container\ContainerInterface; /** * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container. * * @author Nicolas Grekas * @author Mateusz Sip * * @template-covariant T of mixed */ interface ServiceProviderInterface extends ContainerInterface { /** * @return T */ public function get(string $id): mixed; public function has(string $id): bool; /** * Returns an associative array of service types keyed by the identifiers provided by the current container. * * Examples: * * * ['logger' => 'Psr\Log\LoggerInterface'] means the object provides a service named "logger" that implements Psr\Log\LoggerInterface * * ['foo' => '?'] means the container provides service name "foo" of unspecified type * * ['bar' => '?Bar\Baz'] means the container provides a service "bar" of type Bar\Baz|null * * @return array The provided service types, keyed by service names */ public function getProvidedServices(): array; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/ServiceSubscriberInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service; use Symfony\Contracts\Service\Attribute\SubscribedService; /** * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. * * The getSubscribedServices method returns an array of service types required by such instances, * optionally keyed by the service names used internally. Service types that start with an interrogation * mark "?" are optional, while the other ones are mandatory service dependencies. * * The injected service locators SHOULD NOT allow access to any other services not specified by the method. * * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally. * This interface does not dictate any injection method for these service locators, although constructor * injection is recommended. * * @author Nicolas Grekas */ interface ServiceSubscriberInterface { /** * Returns an array of service types (or {@see SubscribedService} objects) required * by such instances, optionally keyed by the service names used internally. * * For mandatory dependencies: * * * ['logger' => 'Psr\Log\LoggerInterface'] means the objects use the "logger" name * internally to fetch a service which must implement Psr\Log\LoggerInterface. * * ['loggers' => 'Psr\Log\LoggerInterface[]'] means the objects use the "loggers" name * internally to fetch an iterable of Psr\Log\LoggerInterface instances. * * ['Psr\Log\LoggerInterface'] is a shortcut for * * ['Psr\Log\LoggerInterface' => 'Psr\Log\LoggerInterface'] * * otherwise: * * * ['logger' => '?Psr\Log\LoggerInterface'] denotes an optional dependency * * ['loggers' => '?Psr\Log\LoggerInterface[]'] denotes an optional iterable dependency * * ['?Psr\Log\LoggerInterface'] is a shortcut for * * ['Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface'] * * additionally, an array of {@see SubscribedService}'s can be returned: * * * [new SubscribedService('logger', Psr\Log\LoggerInterface::class)] * * [new SubscribedService(type: Psr\Log\LoggerInterface::class, nullable: true)] * * [new SubscribedService('http_client', HttpClientInterface::class, attributes: new Target('githubApi'))] * * @return string[]|SubscribedService[] The required service types, optionally keyed by service names */ public static function getSubscribedServices(): array; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/ServiceSubscriberTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service; use Psr\Container\ContainerInterface; use Symfony\Contracts\Service\Attribute\Required; use Symfony\Contracts\Service\Attribute\SubscribedService; trigger_deprecation('symfony/contracts', 'v3.5', '"%s" is deprecated, use "ServiceMethodsSubscriberTrait" instead.', ServiceSubscriberTrait::class); /** * Implementation of ServiceSubscriberInterface that determines subscribed services * from methods that have the #[SubscribedService] attribute. * * Service ids are available as "ClassName::methodName" so that the implementation * of subscriber methods can be just `return $this->container->get(__METHOD__);`. * * @property ContainerInterface $container * * @author Kevin Bond * * @deprecated since symfony/contracts v3.5, use ServiceMethodsSubscriberTrait instead */ trait ServiceSubscriberTrait { public static function getSubscribedServices(): array { $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { if (self::class !== $method->getDeclaringClass()->name) { continue; } if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) { continue; } if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { throw new \LogicException(sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name)); } if (!$returnType = $method->getReturnType()) { throw new \LogicException(sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class)); } /* @var SubscribedService $attribute */ $attribute = $attribute->newInstance(); $attribute->key ??= self::class.'::'.$method->name; $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; $attribute->nullable = $returnType->allowsNull(); if ($attribute->attributes) { $services[] = $attribute; } else { $services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type; } } return $services; } #[Required] public function setContainer(ContainerInterface $container): ?ContainerInterface { $ret = null; if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) { $ret = parent::setContainer($container); } $this->container = $container; return $ret; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service\Test; class_alias(ServiceLocatorTestCase::class, ServiceLocatorTest::class); if (false) { /** * @deprecated since PHPUnit 9.6 */ class ServiceLocatorTest { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Contracts\Service\Test; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; use Symfony\Contracts\Service\ServiceLocatorTrait; abstract class ServiceLocatorTestCase extends TestCase { protected function getServiceLocator(array $factories): ContainerInterface { return new class($factories) implements ContainerInterface { use ServiceLocatorTrait; }; } public function testHas() { $locator = $this->getServiceLocator([ 'foo' => fn () => 'bar', 'bar' => fn () => 'baz', fn () => 'dummy', ]); $this->assertTrue($locator->has('foo')); $this->assertTrue($locator->has('bar')); $this->assertFalse($locator->has('dummy')); } public function testGet() { $locator = $this->getServiceLocator([ 'foo' => fn () => 'bar', 'bar' => fn () => 'baz', ]); $this->assertSame('bar', $locator->get('foo')); $this->assertSame('baz', $locator->get('bar')); } public function testGetDoesNotMemoize() { $i = 0; $locator = $this->getServiceLocator([ 'foo' => function () use (&$i) { ++$i; return 'bar'; }, ]); $this->assertSame('bar', $locator->get('foo')); $this->assertSame('bar', $locator->get('foo')); $this->assertSame(2, $i); } public function testThrowsOnUndefinedInternalService() { $locator = $this->getServiceLocator([ 'foo' => function () use (&$locator) { return $locator->get('bar'); }, ]); if (!$this->getExpectedException()) { $this->expectException(NotFoundExceptionInterface::class); $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); } $locator->get('foo'); } public function testThrowsOnCircularReference() { $locator = $this->getServiceLocator([ 'foo' => function () use (&$locator) { return $locator->get('bar'); }, 'bar' => function () use (&$locator) { return $locator->get('baz'); }, 'baz' => function () use (&$locator) { return $locator->get('bar'); }, ]); $this->expectException(ContainerExceptionInterface::class); $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); $locator->get('foo'); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/service-contracts/composer.json ================================================ { "name": "symfony/service-contracts", "type": "library", "description": "Generic abstractions related to writing services", "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=8.1", "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" }, "exclude-from-classmap": [ "/Test/" ] }, "minimum-stability": "dev", "extra": { "branch-alias": { "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", "url": "https://github.com/symfony/contracts" } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/CHANGELOG.md ================================================ CHANGELOG ========= 6.4 --- * Deprecate per-property lazy-initializers 6.2 --- * Add support for lazy ghost objects and virtual proxies * Add `Hydrator::hydrate()` * Preserve PHP references also when using `Hydrator::hydrate()` or `Instantiator::instantiate()` * Add support for hydrating from native (array) casts 5.1.0 ----- * added argument `array &$foundClasses` to `VarExporter::export()` to ease with preloading exported values 4.2.0 ----- * added the component ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Exception; class ClassNotFoundException extends \Exception implements ExceptionInterface { public function __construct(string $class, ?\Throwable $previous = null) { parent::__construct(sprintf('Class "%s" not found.', $class), 0, $previous); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Exception/ExceptionInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Exception; interface ExceptionInterface extends \Throwable { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Exception/LogicException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Exception; class LogicException extends \LogicException implements ExceptionInterface { } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Exception; class NotInstantiableTypeException extends \Exception implements ExceptionInterface { public function __construct(string $type, ?\Throwable $previous = null) { parent::__construct(sprintf('Type "%s" is not instantiable.', $type), 0, $previous); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Hydrator.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter; use Symfony\Component\VarExporter\Internal\Hydrator as InternalHydrator; /** * Utility class to hydrate the properties of an object. * * @author Nicolas Grekas */ final class Hydrator { /** * Sets the properties of an object, including private and protected ones. * * For example: * * // Sets the public or protected $object->propertyName property * Hydrator::hydrate($object, ['propertyName' => $propertyValue]); * * // Sets a private property defined on its parent Bar class: * Hydrator::hydrate($object, ["\0Bar\0privateBarProperty" => $propertyValue]); * * // Alternative way to set the private $object->privateBarProperty property * Hydrator::hydrate($object, [], [ * Bar::class => ['privateBarProperty' => $propertyValue], * ]); * * Instances of ArrayObject, ArrayIterator and SplObjectStorage can be hydrated * by using the special "\0" property name to define their internal value: * * // Hydrates an SplObjectStorage where $info1 is attached to $obj1, etc. * Hydrator::hydrate($object, ["\0" => [$obj1, $info1, $obj2, $info2...]]); * * // Hydrates an ArrayObject populated with $inputArray * Hydrator::hydrate($object, ["\0" => [$inputArray]]); * * @template T of object * * @param T $instance The object to hydrate * @param array $properties The properties to set on the instance * @param array> $scopedProperties The properties to set on the instance, * keyed by their declaring class * * @return T */ public static function hydrate(object $instance, array $properties = [], array $scopedProperties = []): object { if ($properties) { $class = $instance::class; $propertyScopes = InternalHydrator::$propertyScopes[$class] ??= InternalHydrator::getPropertyScopes($class); foreach ($properties as $name => &$value) { [$scope, $name, $readonlyScope] = $propertyScopes[$name] ?? [$class, $name, $class]; $scopedProperties[$readonlyScope ?? $scope][$name] = &$value; } unset($value); } foreach ($scopedProperties as $scope => $properties) { if ($properties) { (InternalHydrator::$simpleHydrators[$scope] ??= InternalHydrator::getSimpleHydrator($scope))($properties, $instance); } } return $instance; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Instantiator.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter; use Symfony\Component\VarExporter\Exception\ExceptionInterface; use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; use Symfony\Component\VarExporter\Internal\Registry; /** * A utility class to create objects without calling their constructor. * * @author Nicolas Grekas */ final class Instantiator { /** * Creates an object and sets its properties without calling its constructor nor any other methods. * * @see Hydrator::hydrate() for examples * * @template T of object * * @param class-string $class The class of the instance to create * @param array $properties The properties to set on the instance * @param array> $scopedProperties The properties to set on the instance, * keyed by their declaring class * * @return T * * @throws ExceptionInterface When the instance cannot be created */ public static function instantiate(string $class, array $properties = [], array $scopedProperties = []): object { $reflector = Registry::$reflectors[$class] ??= Registry::getClassReflector($class); if (Registry::$cloneable[$class]) { $instance = clone Registry::$prototypes[$class]; } elseif (Registry::$instantiableWithoutConstructor[$class]) { $instance = $reflector->newInstanceWithoutConstructor(); } elseif (null === Registry::$prototypes[$class]) { throw new NotInstantiableTypeException($class); } elseif ($reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize')) { $instance = unserialize('C:'.\strlen($class).':"'.$class.'":0:{}'); } else { $instance = unserialize('O:'.\strlen($class).':"'.$class.'":0:{}'); } return $properties || $scopedProperties ? Hydrator::hydrate($instance, $properties, $scopedProperties) : $instance; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Internal/Exporter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Internal; use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; /** * @author Nicolas Grekas * * @internal */ class Exporter { /** * Prepares an array of values for VarExporter. * * For performance this method is public and has no type-hints. * * @param array &$values * @param \SplObjectStorage $objectsPool * @param array &$refsPool * @param int &$objectsCount * @param bool &$valuesAreStatic * * @return array * * @throws NotInstantiableTypeException When a value cannot be serialized */ public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount, &$valuesAreStatic) { $refs = $values; foreach ($values as $k => $value) { if (\is_resource($value)) { throw new NotInstantiableTypeException(get_resource_type($value).' resource'); } $refs[$k] = $objectsPool; if ($isRef = !$valueIsStatic = $values[$k] !== $objectsPool) { $values[$k] = &$value; // Break hard references to make $values completely unset($value); // independent from the original structure $refs[$k] = $value = $values[$k]; if ($value instanceof Reference && 0 > $value->id) { $valuesAreStatic = false; ++$value->count; continue; } $refsPool[] = [&$refs[$k], $value, &$value]; $refs[$k] = $values[$k] = new Reference(-\count($refsPool), $value); } if (\is_array($value)) { if ($value) { $value = self::prepare($value, $objectsPool, $refsPool, $objectsCount, $valueIsStatic); } goto handle_value; } elseif (!\is_object($value) || $value instanceof \UnitEnum) { goto handle_value; } $valueIsStatic = false; if (isset($objectsPool[$value])) { ++$objectsCount; $value = new Reference($objectsPool[$value][0]); goto handle_value; } $class = $value::class; $reflector = Registry::$reflectors[$class] ??= Registry::getClassReflector($class); $properties = []; if ($reflector->hasMethod('__serialize')) { if (!$reflector->getMethod('__serialize')->isPublic()) { throw new \Error(sprintf('Call to %s method "%s::__serialize()".', $reflector->getMethod('__serialize')->isProtected() ? 'protected' : 'private', $class)); } if (!\is_array($serializeProperties = $value->__serialize())) { throw new \TypeError($class.'::__serialize() must return an array'); } if ($reflector->hasMethod('__unserialize')) { $properties = $serializeProperties; } else { foreach ($serializeProperties as $n => $v) { $c = $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass'; $properties[$c][$n] = $v; } } goto prepare_value; } $sleep = null; $proto = Registry::$prototypes[$class]; if (($value instanceof \ArrayIterator || $value instanceof \ArrayObject) && null !== $proto) { // ArrayIterator and ArrayObject need special care because their "flags" // option changes the behavior of the (array) casting operator. [$arrayValue, $properties] = self::getArrayObjectProperties($value, $proto); // populates Registry::$prototypes[$class] with a new instance Registry::getClassReflector($class, Registry::$instantiableWithoutConstructor[$class], Registry::$cloneable[$class]); } elseif ($value instanceof \SplObjectStorage && Registry::$cloneable[$class] && null !== $proto) { // By implementing Serializable, SplObjectStorage breaks // internal references; let's deal with it on our own. foreach (clone $value as $v) { $properties[] = $v; $properties[] = $value[$v]; } $properties = ['SplObjectStorage' => ["\0" => $properties]]; $arrayValue = (array) $value; } elseif ($value instanceof \Serializable || $value instanceof \__PHP_Incomplete_Class ) { ++$objectsCount; $objectsPool[$value] = [$id = \count($objectsPool), serialize($value), [], 0]; $value = new Reference($id); goto handle_value; } else { if (method_exists($class, '__sleep')) { if (!\is_array($sleep = $value->__sleep())) { trigger_error('serialize(): __sleep should return an array only containing the names of instance-variables to serialize', \E_USER_NOTICE); $value = null; goto handle_value; } $sleep = array_flip($sleep); } $arrayValue = (array) $value; } $proto = (array) $proto; foreach ($arrayValue as $name => $v) { $i = 0; $n = (string) $name; if ('' === $n || "\0" !== $n[0]) { $c = $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass'; } elseif ('*' === $n[1]) { $n = substr($n, 3); $c = $reflector->getProperty($n)->class; if ('Error' === $c) { $c = 'TypeError'; } elseif ('Exception' === $c) { $c = 'ErrorException'; } } else { $i = strpos($n, "\0", 2); $c = substr($n, 1, $i - 1); $n = substr($n, 1 + $i); } if (null !== $sleep) { if (!isset($sleep[$name]) && (!isset($sleep[$n]) || ($i && $c !== $class))) { unset($arrayValue[$name]); continue; } unset($sleep[$name], $sleep[$n]); } if (!\array_key_exists($name, $proto) || $proto[$name] !== $v || "\x00Error\x00trace" === $name || "\x00Exception\x00trace" === $name) { $properties[$c][$n] = $v; } } if ($sleep) { foreach ($sleep as $n => $v) { trigger_error(sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $n), \E_USER_NOTICE); } } if (method_exists($class, '__unserialize')) { $properties = $arrayValue; } prepare_value: $objectsPool[$value] = [$id = \count($objectsPool)]; $properties = self::prepare($properties, $objectsPool, $refsPool, $objectsCount, $valueIsStatic); ++$objectsCount; $objectsPool[$value] = [$id, $class, $properties, method_exists($class, '__unserialize') ? -$objectsCount : (method_exists($class, '__wakeup') ? $objectsCount : 0)]; $value = new Reference($id); handle_value: if ($isRef) { unset($value); // Break the hard reference created above } elseif (!$valueIsStatic) { $values[$k] = $value; } $valuesAreStatic = $valueIsStatic && $valuesAreStatic; } return $values; } public static function export($value, $indent = '') { switch (true) { case \is_int($value) || \is_float($value): return var_export($value, true); case [] === $value: return '[]'; case false === $value: return 'false'; case true === $value: return 'true'; case null === $value: return 'null'; case '' === $value: return "''"; case $value instanceof \UnitEnum: return '\\'.ltrim(var_export($value, true), '\\'); } if ($value instanceof Reference) { if (0 <= $value->id) { return '$o['.$value->id.']'; } if (!$value->count) { return self::export($value->value, $indent); } $value = -$value->id; return '&$r['.$value.']'; } $subIndent = $indent.' '; if (\is_string($value)) { $code = sprintf("'%s'", addcslashes($value, "'\\")); $code = preg_replace_callback("/((?:[\\0\\r\\n]|\u{202A}|\u{202B}|\u{202D}|\u{202E}|\u{2066}|\u{2067}|\u{2068}|\u{202C}|\u{2069})++)(.)/", function ($m) use ($subIndent) { $m[1] = sprintf('\'."%s".\'', str_replace( ["\0", "\r", "\n", "\u{202A}", "\u{202B}", "\u{202D}", "\u{202E}", "\u{2066}", "\u{2067}", "\u{2068}", "\u{202C}", "\u{2069}", '\n\\'], ['\0', '\r', '\n', '\u{202A}', '\u{202B}', '\u{202D}', '\u{202E}', '\u{2066}', '\u{2067}', '\u{2068}', '\u{202C}', '\u{2069}', '\n"'."\n".$subIndent.'."\\'], $m[1] )); if ("'" === $m[2]) { return substr($m[1], 0, -2); } if (str_ends_with($m[1], 'n".\'')) { return substr_replace($m[1], "\n".$subIndent.".'".$m[2], -2); } return $m[1].$m[2]; }, $code, -1, $count); if ($count && str_starts_with($code, "''.")) { $code = substr($code, 3); } return $code; } if (\is_array($value)) { $j = -1; $code = ''; foreach ($value as $k => $v) { $code .= $subIndent; if (!\is_int($k) || 1 !== $k - $j) { $code .= self::export($k, $subIndent).' => '; } if (\is_int($k) && $k > $j) { $j = $k; } $code .= self::export($v, $subIndent).",\n"; } return "[\n".$code.$indent.']'; } if ($value instanceof Values) { $code = $subIndent."\$r = [],\n"; foreach ($value->values as $k => $v) { $code .= $subIndent.'$r['.$k.'] = '.self::export($v, $subIndent).",\n"; } return "[\n".$code.$indent.']'; } if ($value instanceof Registry) { return self::exportRegistry($value, $indent, $subIndent); } if ($value instanceof Hydrator) { return self::exportHydrator($value, $indent, $subIndent); } throw new \UnexpectedValueException(sprintf('Cannot export value of type "%s".', get_debug_type($value))); } private static function exportRegistry(Registry $value, string $indent, string $subIndent): string { $code = ''; $serializables = []; $seen = []; $prototypesAccess = 0; $factoriesAccess = 0; $r = '\\'.Registry::class; $j = -1; foreach ($value->classes as $k => $class) { if (':' === ($class[1] ?? null)) { $serializables[$k] = $class; continue; } if (!Registry::$instantiableWithoutConstructor[$class]) { if (is_subclass_of($class, 'Serializable') && !method_exists($class, '__unserialize')) { $serializables[$k] = 'C:'.\strlen($class).':"'.$class.'":0:{}'; } else { $serializables[$k] = 'O:'.\strlen($class).':"'.$class.'":0:{}'; } if (is_subclass_of($class, 'Throwable')) { $eol = is_subclass_of($class, 'Error') ? "\0Error\0" : "\0Exception\0"; $serializables[$k] = substr_replace($serializables[$k], '1:{s:'.(5 + \strlen($eol)).':"'.$eol.'trace";a:0:{}}', -4); } continue; } $code .= $subIndent.(1 !== $k - $j ? $k.' => ' : ''); $j = $k; $eol = ",\n"; $c = '['.self::export($class).']'; if ($seen[$class] ?? false) { if (Registry::$cloneable[$class]) { ++$prototypesAccess; $code .= 'clone $p'.$c; } else { ++$factoriesAccess; $code .= '$f'.$c.'()'; } } else { $seen[$class] = true; if (Registry::$cloneable[$class]) { $code .= 'clone ('.($prototypesAccess++ ? '$p' : '($p = &'.$r.'::$prototypes)').$c.' ?? '.$r.'::p'; } else { $code .= '('.($factoriesAccess++ ? '$f' : '($f = &'.$r.'::$factories)').$c.' ?? '.$r.'::f'; $eol = '()'.$eol; } $code .= '('.substr($c, 1, -1).'))'; } $code .= $eol; } if (1 === $prototypesAccess) { $code = str_replace('($p = &'.$r.'::$prototypes)', $r.'::$prototypes', $code); } if (1 === $factoriesAccess) { $code = str_replace('($f = &'.$r.'::$factories)', $r.'::$factories', $code); } if ('' !== $code) { $code = "\n".$code.$indent; } if ($serializables) { $code = $r.'::unserialize(['.$code.'], '.self::export($serializables, $indent).')'; } else { $code = '['.$code.']'; } return '$o = '.$code; } private static function exportHydrator(Hydrator $value, string $indent, string $subIndent): string { $code = ''; foreach ($value->properties as $class => $properties) { $code .= $subIndent.' '.self::export($class).' => '.self::export($properties, $subIndent.' ').",\n"; } $code = [ self::export($value->registry, $subIndent), self::export($value->values, $subIndent), '' !== $code ? "[\n".$code.$subIndent.']' : '[]', self::export($value->value, $subIndent), self::export($value->wakeups, $subIndent), ]; return '\\'.$value::class."::hydrate(\n".$subIndent.implode(",\n".$subIndent, $code)."\n".$indent.')'; } /** * @param \ArrayIterator|\ArrayObject $value * @param \ArrayIterator|\ArrayObject $proto */ private static function getArrayObjectProperties($value, $proto): array { $reflector = $value instanceof \ArrayIterator ? 'ArrayIterator' : 'ArrayObject'; $reflector = Registry::$reflectors[$reflector] ??= Registry::getClassReflector($reflector); $properties = [ $arrayValue = (array) $value, $reflector->getMethod('getFlags')->invoke($value), $value instanceof \ArrayObject ? $reflector->getMethod('getIteratorClass')->invoke($value) : 'ArrayIterator', ]; $reflector = $reflector->getMethod('setFlags'); $reflector->invoke($proto, \ArrayObject::STD_PROP_LIST); if ($properties[1] & \ArrayObject::STD_PROP_LIST) { $reflector->invoke($value, 0); $properties[0] = (array) $value; } else { $reflector->invoke($value, \ArrayObject::STD_PROP_LIST); $arrayValue = (array) $value; } $reflector->invoke($value, $properties[1]); if ([[], 0, 'ArrayIterator'] === $properties) { $properties = []; } else { if ('ArrayIterator' === $properties[2]) { unset($properties[2]); } $properties = [$reflector->class => ["\0" => $properties]]; } return [$arrayValue, $properties]; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Internal/Hydrator.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Internal; use Symfony\Component\VarExporter\Exception\ClassNotFoundException; /** * @author Nicolas Grekas * * @internal */ class Hydrator { public static array $hydrators = []; public static array $simpleHydrators = []; public static array $propertyScopes = []; public function __construct( public readonly Registry $registry, public readonly ?Values $values, public readonly array $properties, public readonly mixed $value, public readonly array $wakeups, ) { } public static function hydrate($objects, $values, $properties, $value, $wakeups) { foreach ($properties as $class => $vars) { (self::$hydrators[$class] ??= self::getHydrator($class))($vars, $objects); } foreach ($wakeups as $k => $v) { if (\is_array($v)) { $objects[-$k]->__unserialize($v); } else { $objects[$v]->__wakeup(); } } return $value; } public static function getHydrator($class) { $baseHydrator = self::$hydrators['stdClass'] ??= static function ($properties, $objects) { foreach ($properties as $name => $values) { foreach ($values as $i => $v) { $objects[$i]->$name = $v; } } }; switch ($class) { case 'stdClass': return $baseHydrator; case 'ErrorException': return $baseHydrator->bindTo(null, new class() extends \ErrorException { }); case 'TypeError': return $baseHydrator->bindTo(null, new class() extends \Error { }); case 'SplObjectStorage': return static function ($properties, $objects) { foreach ($properties as $name => $values) { if ("\0" === $name) { foreach ($values as $i => $v) { for ($j = 0; $j < \count($v); ++$j) { $objects[$i]->attach($v[$j], $v[++$j]); } } continue; } foreach ($values as $i => $v) { $objects[$i]->$name = $v; } } }; } if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) { throw new ClassNotFoundException($class); } $classReflector = new \ReflectionClass($class); switch ($class) { case 'ArrayIterator': case 'ArrayObject': $constructor = $classReflector->getConstructor()->invokeArgs(...); return static function ($properties, $objects) use ($constructor) { foreach ($properties as $name => $values) { if ("\0" !== $name) { foreach ($values as $i => $v) { $objects[$i]->$name = $v; } } } foreach ($properties["\0"] ?? [] as $i => $v) { $constructor($objects[$i], $v); } }; } if (!$classReflector->isInternal()) { return $baseHydrator->bindTo(null, $class); } if ($classReflector->name !== $class) { return self::$hydrators[$classReflector->name] ??= self::getHydrator($classReflector->name); } $propertySetters = []; foreach ($classReflector->getProperties() as $propertyReflector) { if (!$propertyReflector->isStatic()) { $propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...); } } if (!$propertySetters) { return $baseHydrator; } return static function ($properties, $objects) use ($propertySetters) { foreach ($properties as $name => $values) { if ($setValue = $propertySetters[$name] ?? null) { foreach ($values as $i => $v) { $setValue($objects[$i], $v); } continue; } foreach ($values as $i => $v) { $objects[$i]->$name = $v; } } }; } public static function getSimpleHydrator($class) { $baseHydrator = self::$simpleHydrators['stdClass'] ??= (function ($properties, $object) { $readonly = (array) $this; foreach ($properties as $name => &$value) { $object->$name = $value; if (!($readonly[$name] ?? false)) { $object->$name = &$value; } } })->bindTo(new \stdClass()); switch ($class) { case 'stdClass': return $baseHydrator; case 'ErrorException': return $baseHydrator->bindTo(new \stdClass(), new class() extends \ErrorException { }); case 'TypeError': return $baseHydrator->bindTo(new \stdClass(), new class() extends \Error { }); case 'SplObjectStorage': return static function ($properties, $object) { foreach ($properties as $name => &$value) { if ("\0" !== $name) { $object->$name = $value; $object->$name = &$value; continue; } for ($i = 0; $i < \count($value); ++$i) { $object->attach($value[$i], $value[++$i]); } } }; } if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) { throw new ClassNotFoundException($class); } $classReflector = new \ReflectionClass($class); switch ($class) { case 'ArrayIterator': case 'ArrayObject': $constructor = $classReflector->getConstructor()->invokeArgs(...); return static function ($properties, $object) use ($constructor) { foreach ($properties as $name => &$value) { if ("\0" === $name) { $constructor($object, $value); } else { $object->$name = $value; $object->$name = &$value; } } }; } if (!$classReflector->isInternal()) { $readonly = new \stdClass(); foreach ($classReflector->getProperties(\ReflectionProperty::IS_READONLY) as $propertyReflector) { if ($class === $propertyReflector->class) { $readonly->{$propertyReflector->name} = true; } } return $baseHydrator->bindTo($readonly, $class); } if ($classReflector->name !== $class) { return self::$simpleHydrators[$classReflector->name] ??= self::getSimpleHydrator($classReflector->name); } $propertySetters = []; foreach ($classReflector->getProperties() as $propertyReflector) { if (!$propertyReflector->isStatic()) { $propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...); } } if (!$propertySetters) { return $baseHydrator; } return static function ($properties, $object) use ($propertySetters) { foreach ($properties as $name => &$value) { if ($setValue = $propertySetters[$name] ?? null) { $setValue($object, $value); } else { $object->$name = $value; $object->$name = &$value; } } }; } public static function getPropertyScopes($class): array { $propertyScopes = []; $r = new \ReflectionClass($class); foreach ($r->getProperties() as $property) { $flags = $property->getModifiers(); if (\ReflectionProperty::IS_STATIC & $flags) { continue; } $name = $property->name; if (\ReflectionProperty::IS_PRIVATE & $flags) { $readonlyScope = null; if ($flags & \ReflectionProperty::IS_READONLY) { $readonlyScope = $class; } $propertyScopes["\0$class\0$name"] = $propertyScopes[$name] = [$class, $name, $readonlyScope, $property]; continue; } $readonlyScope = null; if ($flags & \ReflectionProperty::IS_READONLY) { $readonlyScope = $property->class; } $propertyScopes[$name] = [$class, $name, $readonlyScope, $property]; if (\ReflectionProperty::IS_PROTECTED & $flags) { $propertyScopes["\0*\0$name"] = $propertyScopes[$name]; } } while ($r = $r->getParentClass()) { $class = $r->name; foreach ($r->getProperties(\ReflectionProperty::IS_PRIVATE) as $property) { if (!$property->isStatic()) { $name = $property->name; $readonlyScope = $property->isReadOnly() ? $class : null; $propertyScopes["\0$class\0$name"] = [$class, $name, $readonlyScope, $property]; $propertyScopes[$name] ??= [$class, $name, $readonlyScope, $property]; } } } return $propertyScopes; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Internal/LazyObjectRegistry.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Internal; /** * Stores the state of lazy objects and caches related reflection information. * * As a micro-optimization, this class uses no type declarations. * * @internal */ class LazyObjectRegistry { /** * @var array */ public static array $classReflectors = []; /** * @var array> */ public static array $defaultProperties = []; /** * @var array> */ public static array $classResetters = []; /** * @var array */ public static array $classAccessors = []; /** * @var array */ public static array $parentMethods = []; public static ?\Closure $noInitializerState = null; public static function getClassResetters($class) { $classProperties = []; if ((self::$classReflectors[$class] ??= new \ReflectionClass($class))->isInternal()) { $propertyScopes = []; } else { $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); } foreach ($propertyScopes as $key => [$scope, $name, $readonlyScope]) { $propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name; if ($k === $key && "\0$class\0lazyObjectState" !== $k) { $classProperties[$readonlyScope ?? $scope][$name] = $key; } } $resetters = []; foreach ($classProperties as $scope => $properties) { $resetters[] = \Closure::bind(static function ($instance, $skippedProperties) use ($properties) { foreach ($properties as $name => $key) { if (!\array_key_exists($key, $skippedProperties)) { unset($instance->$name); } } }, null, $scope); } $resetters[] = static function ($instance, $skippedProperties) { foreach ((array) $instance as $name => $value) { if ("\0" !== ($name[0] ?? '') && !\array_key_exists($name, $skippedProperties)) { unset($instance->$name); } } }; return $resetters; } public static function getClassAccessors($class) { return \Closure::bind(static fn () => [ 'get' => static function &($instance, $name, $readonly) { if (!$readonly) { return $instance->$name; } $value = $instance->$name; return $value; }, 'set' => static function ($instance, $name, $value) { $instance->$name = $value; }, 'isset' => static fn ($instance, $name) => isset($instance->$name), 'unset' => static function ($instance, $name) { unset($instance->$name); }, ], null, \Closure::class === $class ? null : $class)(); } public static function getParentMethods($class) { $parent = get_parent_class($class); $methods = []; foreach (['set', 'isset', 'unset', 'clone', 'serialize', 'unserialize', 'sleep', 'wakeup', 'destruct', 'get'] as $method) { if (!$parent || !method_exists($parent, '__'.$method)) { $methods[$method] = false; } else { $m = new \ReflectionMethod($parent, '__'.$method); $methods[$method] = !$m->isAbstract() && !$m->isPrivate(); } } $methods['get'] = $methods['get'] ? ($m->returnsReference() ? 2 : 1) : 0; return $methods; } public static function getScope($propertyScopes, $class, $property, $readonlyScope = null) { if (null === $readonlyScope && !isset($propertyScopes[$k = "\0$class\0$property"]) && !isset($propertyScopes[$k = "\0*\0$property"])) { return null; } $frame = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]; if (\ReflectionProperty::class === $scope = $frame['class'] ?? \Closure::class) { $scope = $frame['object']->class; } if (null === $readonlyScope && '*' === $k[1] && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) { return null; } return $scope; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Internal/LazyObjectState.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Internal; use Symfony\Component\VarExporter\Hydrator as PublicHydrator; /** * Keeps the state of lazy objects. * * As a micro-optimization, this class uses no type declarations. * * @internal */ class LazyObjectState { public const STATUS_UNINITIALIZED_FULL = 1; public const STATUS_UNINITIALIZED_PARTIAL = 2; public const STATUS_INITIALIZED_FULL = 3; public const STATUS_INITIALIZED_PARTIAL = 4; /** * @var array */ public readonly array $skippedProperties; /** * @var self::STATUS_* */ public int $status = 0; public object $realInstance; public function __construct(public readonly \Closure $initializer, $skippedProperties = []) { $this->skippedProperties = $skippedProperties; $this->status = self::STATUS_UNINITIALIZED_FULL; } public function initialize($instance, $propertyName, $propertyScope) { if (self::STATUS_UNINITIALIZED_FULL !== $this->status) { return $this->status; } $this->status = self::STATUS_INITIALIZED_PARTIAL; try { if ($defaultProperties = array_diff_key(LazyObjectRegistry::$defaultProperties[$instance::class], $this->skippedProperties)) { PublicHydrator::hydrate($instance, $defaultProperties); } ($this->initializer)($instance); } catch (\Throwable $e) { $this->status = self::STATUS_UNINITIALIZED_FULL; $this->reset($instance); throw $e; } return $this->status = self::STATUS_INITIALIZED_FULL; } public function reset($instance): void { $class = $instance::class; $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); $skippedProperties = $this->skippedProperties; $properties = (array) $instance; foreach ($propertyScopes as $key => [$scope, $name, $readonlyScope]) { $propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name; if ($k === $key && (null !== $readonlyScope || !\array_key_exists($k, $properties))) { $skippedProperties[$k] = true; } } foreach (LazyObjectRegistry::$classResetters[$class] as $reset) { $reset($instance, $skippedProperties); } $this->status = self::STATUS_UNINITIALIZED_FULL; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Internal/LazyObjectTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Internal; use Symfony\Component\Serializer\Attribute\Ignore; if (\PHP_VERSION_ID >= 80300) { /** * @internal */ trait LazyObjectTrait { #[Ignore] private readonly LazyObjectState $lazyObjectState; } } else { /** * @internal */ trait LazyObjectTrait { #[Ignore] private LazyObjectState $lazyObjectState; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Internal/Reference.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Internal; /** * @author Nicolas Grekas * * @internal */ class Reference { public int $count = 0; public function __construct( public readonly int $id, public readonly mixed $value = null, ) { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Internal/Registry.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Internal; use Symfony\Component\VarExporter\Exception\ClassNotFoundException; use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; /** * @author Nicolas Grekas * * @internal */ class Registry { public static array $reflectors = []; public static array $prototypes = []; public static array $factories = []; public static array $cloneable = []; public static array $instantiableWithoutConstructor = []; public function __construct( public readonly array $classes, ) { } public static function unserialize($objects, $serializables) { $unserializeCallback = ini_set('unserialize_callback_func', __CLASS__.'::getClassReflector'); try { foreach ($serializables as $k => $v) { $objects[$k] = unserialize($v); } } finally { ini_set('unserialize_callback_func', $unserializeCallback); } return $objects; } public static function p($class) { self::getClassReflector($class, true, true); return self::$prototypes[$class]; } public static function f($class) { $reflector = self::$reflectors[$class] ??= self::getClassReflector($class, true, false); return self::$factories[$class] = [$reflector, 'newInstanceWithoutConstructor'](...); } public static function getClassReflector($class, $instantiableWithoutConstructor = false, $cloneable = null) { if (!($isClass = class_exists($class)) && !interface_exists($class, false) && !trait_exists($class, false)) { throw new ClassNotFoundException($class); } $reflector = new \ReflectionClass($class); if ($instantiableWithoutConstructor) { $proto = $reflector->newInstanceWithoutConstructor(); } elseif (!$isClass || $reflector->isAbstract()) { throw new NotInstantiableTypeException($class); } elseif ($reflector->name !== $class) { $reflector = self::$reflectors[$name = $reflector->name] ??= self::getClassReflector($name, false, $cloneable); self::$cloneable[$class] = self::$cloneable[$name]; self::$instantiableWithoutConstructor[$class] = self::$instantiableWithoutConstructor[$name]; self::$prototypes[$class] = self::$prototypes[$name]; return $reflector; } else { try { $proto = $reflector->newInstanceWithoutConstructor(); $instantiableWithoutConstructor = true; } catch (\ReflectionException) { $proto = $reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize') ? 'C:' : 'O:'; if ('C:' === $proto && !$reflector->getMethod('unserialize')->isInternal()) { $proto = null; } else { try { $proto = @unserialize($proto.\strlen($class).':"'.$class.'":0:{}'); } catch (\Exception $e) { if (__FILE__ !== $e->getFile()) { throw $e; } throw new NotInstantiableTypeException($class, $e); } if (false === $proto) { throw new NotInstantiableTypeException($class); } } } if (null !== $proto && !$proto instanceof \Throwable && !$proto instanceof \Serializable && !method_exists($class, '__sleep') && !method_exists($class, '__serialize')) { try { serialize($proto); } catch (\Exception $e) { throw new NotInstantiableTypeException($class, $e); } } } if (null === $cloneable) { if (($proto instanceof \Reflector || $proto instanceof \ReflectionGenerator || $proto instanceof \ReflectionType || $proto instanceof \IteratorIterator || $proto instanceof \RecursiveIteratorIterator) && (!$proto instanceof \Serializable && !method_exists($proto, '__wakeup') && !method_exists($class, '__unserialize'))) { throw new NotInstantiableTypeException($class); } $cloneable = $reflector->isCloneable() && !$reflector->hasMethod('__clone'); } self::$cloneable[$class] = $cloneable; self::$instantiableWithoutConstructor[$class] = $instantiableWithoutConstructor; self::$prototypes[$class] = $proto; if ($proto instanceof \Throwable) { static $setTrace; if (null === $setTrace) { $setTrace = [ new \ReflectionProperty(\Error::class, 'trace'), new \ReflectionProperty(\Exception::class, 'trace'), ]; $setTrace[0] = $setTrace[0]->setValue(...); $setTrace[1] = $setTrace[1]->setValue(...); } $setTrace[$proto instanceof \Exception]($proto, []); } return $reflector; } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/Internal/Values.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter\Internal; /** * @author Nicolas Grekas * * @internal */ class Values { public function __construct( public readonly array $values, ) { } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/LICENSE ================================================ Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/LazyGhostTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter; use Symfony\Component\Serializer\Attribute\Ignore; use Symfony\Component\VarExporter\Internal\Hydrator; use Symfony\Component\VarExporter\Internal\LazyObjectRegistry as Registry; use Symfony\Component\VarExporter\Internal\LazyObjectState; use Symfony\Component\VarExporter\Internal\LazyObjectTrait; trait LazyGhostTrait { use LazyObjectTrait; /** * Creates a lazy-loading ghost instance. * * Skipped properties should be indexed by their array-cast identifier, see * https://php.net/manual/language.types.array#language.types.array.casting * * @param (\Closure(static):void $initializer The closure should initialize the object it receives as argument * @param array|null $skippedProperties An array indexed by the properties to skip, a.k.a. the ones * that the initializer doesn't initialize, if any * @param static|null $instance */ public static function createLazyGhost(\Closure $initializer, ?array $skippedProperties = null, ?object $instance = null): static { if (self::class !== $class = $instance ? $instance::class : static::class) { $skippedProperties["\0".self::class."\0lazyObjectState"] = true; } elseif (\defined($class.'::LAZY_OBJECT_PROPERTY_SCOPES')) { Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES; } $instance ??= (Registry::$classReflectors[$class] ??= new \ReflectionClass($class))->newInstanceWithoutConstructor(); Registry::$defaultProperties[$class] ??= (array) $instance; $instance->lazyObjectState = new LazyObjectState($initializer, $skippedProperties ??= []); foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) { $reset($instance, $skippedProperties); } return $instance; } /** * Returns whether the object is initialized. * * @param $partial Whether partially initialized objects should be considered as initialized */ #[Ignore] public function isLazyObjectInitialized(bool $partial = false): bool { if (!$state = $this->lazyObjectState ?? null) { return true; } return LazyObjectState::STATUS_INITIALIZED_FULL === $state->status; } /** * Forces initialization of a lazy object and returns it. */ public function initializeLazyObject(): static { if (!$state = $this->lazyObjectState ?? null) { return $this; } if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { $state->initialize($this, '', null); } return $this; } /** * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object */ public function resetLazyObject(): bool { if (!$state = $this->lazyObjectState ?? null) { return false; } if (LazyObjectState::STATUS_UNINITIALIZED_FULL !== $state->status) { $state->reset($this); } return true; } public function &__get($name): mixed { $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { $scope = Registry::getScope($propertyScopes, $class, $name); $state = $this->lazyObjectState ?? null; if ($state && (null === $scope || isset($propertyScopes["\0$scope\0$name"]))) { if (LazyObjectState::STATUS_INITIALIZED_FULL === $state->status) { // Work around php/php-src#12695 $property = null === $scope ? $name : "\0$scope\0$name"; $property = $propertyScopes[$property][3] ?? Hydrator::$propertyScopes[$this::class][$property][3] = new \ReflectionProperty($scope ?? $class, $name); } else { $property = null; } if ($property?->isInitialized($this) ?? LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $readonlyScope ?? $scope)) { goto get_in_scope; } } } if ($parent = (Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['get']) { if (2 === $parent) { return parent::__get($name); } $value = parent::__get($name); return $value; } if (null === $class) { $frame = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0]; trigger_error(sprintf('Undefined property: %s::$%s in %s on line %s', $this::class, $name, $frame['file'], $frame['line']), \E_USER_NOTICE); } get_in_scope: try { if (null === $scope) { if (null === $readonlyScope) { return $this->$name; } $value = $this->$name; return $value; } $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); return $accessor['get']($this, $name, null !== $readonlyScope); } catch (\Error $e) { if (\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) { throw $e; } try { if (null === $scope) { $this->$name = []; return $this->$name; } $accessor['set']($this, $name, []); return $accessor['get']($this, $name, null !== $readonlyScope); } catch (\Error) { if (preg_match('/^Cannot access uninitialized non-nullable property ([^ ]++) by reference$/', $e->getMessage(), $matches)) { throw new \Error('Typed property '.$matches[1].' must not be accessed before initialization', $e->getCode(), $e->getPrevious()); } throw $e; } } } public function __set($name, $value): void { $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); $state = $this->lazyObjectState ?? null; if ($state && ($readonlyScope === $scope || isset($propertyScopes["\0$scope\0$name"])) && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status ) { if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { $state->initialize($this, $name, $readonlyScope ?? $scope); } goto set_in_scope; } } if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['set']) { parent::__set($name, $value); return; } set_in_scope: if (null === $scope) { $this->$name = $value; } else { $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); $accessor['set']($this, $name, $value); } } public function __isset($name): bool { $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { $scope = Registry::getScope($propertyScopes, $class, $name); $state = $this->lazyObjectState ?? null; if ($state && (null === $scope || isset($propertyScopes["\0$scope\0$name"])) && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status && LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $readonlyScope ?? $scope) ) { goto isset_in_scope; } } if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['isset']) { return parent::__isset($name); } isset_in_scope: if (null === $scope) { return isset($this->$name); } $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); return $accessor['isset']($this, $name); } public function __unset($name): void { $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); $state = $this->lazyObjectState ?? null; if ($state && ($readonlyScope === $scope || isset($propertyScopes["\0$scope\0$name"])) && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status ) { if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { $state->initialize($this, $name, $readonlyScope ?? $scope); } goto unset_in_scope; } } if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['unset']) { parent::__unset($name); return; } unset_in_scope: if (null === $scope) { unset($this->$name); } else { $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); $accessor['unset']($this, $name); } } public function __clone(): void { if ($state = $this->lazyObjectState ?? null) { $this->lazyObjectState = clone $state; } if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['clone']) { parent::__clone(); } } public function __serialize(): array { $class = self::class; if ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['serialize']) { $properties = parent::__serialize(); } else { $this->initializeLazyObject(); $properties = (array) $this; } unset($properties["\0$class\0lazyObjectState"]); if (Registry::$parentMethods[$class]['serialize'] || !Registry::$parentMethods[$class]['sleep']) { return $properties; } $scope = get_parent_class($class); $data = []; foreach (parent::__sleep() as $name) { $value = $properties[$k = $name] ?? $properties[$k = "\0*\0$name"] ?? $properties[$k = "\0$class\0$name"] ?? $properties[$k = "\0$scope\0$name"] ?? $k = null; if (null === $k) { trigger_error(sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $name), \E_USER_NOTICE); } else { $data[$k] = $value; } } return $data; } public function __destruct() { $state = $this->lazyObjectState ?? null; if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state?->status) { return; } if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['destruct']) { parent::__destruct(); } } #[Ignore] private function setLazyObjectAsInitialized(bool $initialized): void { if ($state = $this->lazyObjectState ?? null) { $state->status = $initialized ? LazyObjectState::STATUS_INITIALIZED_FULL : LazyObjectState::STATUS_UNINITIALIZED_FULL; } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/LazyObjectInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter; interface LazyObjectInterface { /** * Returns whether the object is initialized. * * @param $partial Whether partially initialized objects should be considered as initialized */ public function isLazyObjectInitialized(bool $partial = false): bool; /** * Forces initialization of a lazy object and returns it. */ public function initializeLazyObject(): object; /** * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object */ public function resetLazyObject(): bool; } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/LazyProxyTrait.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter; use Symfony\Component\Serializer\Attribute\Ignore; use Symfony\Component\VarExporter\Hydrator as PublicHydrator; use Symfony\Component\VarExporter\Internal\Hydrator; use Symfony\Component\VarExporter\Internal\LazyObjectRegistry as Registry; use Symfony\Component\VarExporter\Internal\LazyObjectState; use Symfony\Component\VarExporter\Internal\LazyObjectTrait; trait LazyProxyTrait { use LazyObjectTrait; /** * Creates a lazy-loading virtual proxy. * * @param \Closure():object $initializer Returns the proxied object * @param static|null $instance */ public static function createLazyProxy(\Closure $initializer, ?object $instance = null): static { if (self::class !== $class = $instance ? $instance::class : static::class) { $skippedProperties = ["\0".self::class."\0lazyObjectState" => true]; } elseif (\defined($class.'::LAZY_OBJECT_PROPERTY_SCOPES')) { Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES; } $instance ??= (Registry::$classReflectors[$class] ??= new \ReflectionClass($class))->newInstanceWithoutConstructor(); $instance->lazyObjectState = new LazyObjectState($initializer); foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) { $reset($instance, $skippedProperties ??= []); } return $instance; } /** * Returns whether the object is initialized. * * @param $partial Whether partially initialized objects should be considered as initialized */ #[Ignore] public function isLazyObjectInitialized(bool $partial = false): bool { return !isset($this->lazyObjectState) || isset($this->lazyObjectState->realInstance) || Registry::$noInitializerState === $this->lazyObjectState->initializer; } /** * Forces initialization of a lazy object and returns it. */ public function initializeLazyObject(): parent { if ($state = $this->lazyObjectState ?? null) { return $state->realInstance ??= ($state->initializer)(); } return $this; } /** * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object */ public function resetLazyObject(): bool { if (!isset($this->lazyObjectState) || Registry::$noInitializerState === $this->lazyObjectState->initializer) { return false; } unset($this->lazyObjectState->realInstance); return true; } public function &__get($name): mixed { $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; $instance = $this; if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { $scope = Registry::getScope($propertyScopes, $class, $name); if (null === $scope || isset($propertyScopes["\0$scope\0$name"])) { if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } $parent = 2; goto get_in_scope; } } $parent = (Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['get']; if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } else { if (2 === $parent) { return parent::__get($name); } $value = parent::__get($name); return $value; } if (!$parent && null === $class && !\array_key_exists($name, (array) $instance)) { $frame = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0]; trigger_error(sprintf('Undefined property: %s::$%s in %s on line %s', $instance::class, $name, $frame['file'], $frame['line']), \E_USER_NOTICE); } get_in_scope: try { if (null === $scope) { if (null === $readonlyScope && 1 !== $parent) { return $instance->$name; } $value = $instance->$name; return $value; } $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); return $accessor['get']($instance, $name, null !== $readonlyScope || 1 === $parent); } catch (\Error $e) { if (\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) { throw $e; } try { if (null === $scope) { $instance->$name = []; return $instance->$name; } $accessor['set']($instance, $name, []); return $accessor['get']($instance, $name, null !== $readonlyScope || 1 === $parent); } catch (\Error) { throw $e; } } } public function __set($name, $value): void { $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; $instance = $this; if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); if ($readonlyScope === $scope || isset($propertyScopes["\0$scope\0$name"])) { if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } goto set_in_scope; } } if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['set']) { parent::__set($name, $value); return; } set_in_scope: if (null === $scope) { $instance->$name = $value; } else { $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); $accessor['set']($instance, $name, $value); } } public function __isset($name): bool { $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; $instance = $this; if ([$class] = $propertyScopes[$name] ?? null) { $scope = Registry::getScope($propertyScopes, $class, $name); if (null === $scope || isset($propertyScopes["\0$scope\0$name"])) { if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } goto isset_in_scope; } } if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['isset']) { return parent::__isset($name); } isset_in_scope: if (null === $scope) { return isset($instance->$name); } $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); return $accessor['isset']($instance, $name); } public function __unset($name): void { $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; $instance = $this; if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); if ($readonlyScope === $scope || isset($propertyScopes["\0$scope\0$name"])) { if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } goto unset_in_scope; } } if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['unset']) { parent::__unset($name); return; } unset_in_scope: if (null === $scope) { unset($instance->$name); } else { $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); $accessor['unset']($instance, $name); } } public function __clone(): void { if (!isset($this->lazyObjectState)) { if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['clone']) { parent::__clone(); } return; } $this->lazyObjectState = clone $this->lazyObjectState; if (isset($this->lazyObjectState->realInstance)) { $this->lazyObjectState->realInstance = clone $this->lazyObjectState->realInstance; } } public function __serialize(): array { $class = self::class; $state = $this->lazyObjectState ?? null; if (!$state && (Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['serialize']) { $properties = parent::__serialize(); } else { $properties = (array) $this; if ($state) { unset($properties["\0$class\0lazyObjectState"]); $properties["\0$class\0lazyObjectReal"] = $state->realInstance ??= ($state->initializer)(); } } if ($state || Registry::$parentMethods[$class]['serialize'] || !Registry::$parentMethods[$class]['sleep']) { return $properties; } $scope = get_parent_class($class); $data = []; foreach (parent::__sleep() as $name) { $value = $properties[$k = $name] ?? $properties[$k = "\0*\0$name"] ?? $properties[$k = "\0$class\0$name"] ?? $properties[$k = "\0$scope\0$name"] ?? $k = null; if (null === $k) { trigger_error(sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $name), \E_USER_NOTICE); } else { $data[$k] = $value; } } return $data; } public function __unserialize(array $data): void { $class = self::class; if ($instance = $data["\0$class\0lazyObjectReal"] ?? null) { unset($data["\0$class\0lazyObjectReal"]); foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) { $reset($this, $data); } if ($data) { PublicHydrator::hydrate($this, $data); } $this->lazyObjectState = new LazyObjectState(Registry::$noInitializerState ??= static fn () => throw new \LogicException('Lazy proxy has no initializer.')); $this->lazyObjectState->realInstance = $instance; } elseif ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['unserialize']) { parent::__unserialize($data); } else { PublicHydrator::hydrate($this, $data); if (Registry::$parentMethods[$class]['wakeup']) { parent::__wakeup(); } } } public function __destruct() { if (isset($this->lazyObjectState)) { return; } if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['destruct']) { parent::__destruct(); } } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/ProxyHelper.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter; use Symfony\Component\VarExporter\Exception\LogicException; use Symfony\Component\VarExporter\Internal\Hydrator; use Symfony\Component\VarExporter\Internal\LazyObjectRegistry; /** * @author Nicolas Grekas */ final class ProxyHelper { /** * Helps generate lazy-loading ghost objects. * * @throws LogicException When the class is incompatible with ghost objects */ public static function generateLazyGhost(\ReflectionClass $class): string { if (\PHP_VERSION_ID < 80300 && $class->isReadOnly()) { throw new LogicException(sprintf('Cannot generate lazy ghost with PHP < 8.3: class "%s" is readonly.', $class->name)); } if ($class->isFinal()) { throw new LogicException(sprintf('Cannot generate lazy ghost: class "%s" is final.', $class->name)); } if ($class->isInterface() || $class->isAbstract()) { throw new LogicException(sprintf('Cannot generate lazy ghost: "%s" is not a concrete class.', $class->name)); } if (\stdClass::class !== $class->name && $class->isInternal()) { throw new LogicException(sprintf('Cannot generate lazy ghost: class "%s" is internal.', $class->name)); } if ($class->hasMethod('__get') && 'mixed' !== (self::exportType($class->getMethod('__get')) ?? 'mixed')) { throw new LogicException(sprintf('Cannot generate lazy ghost: return type of method "%s::__get()" should be "mixed".', $class->name)); } static $traitMethods; $traitMethods ??= (new \ReflectionClass(LazyGhostTrait::class))->getMethods(); foreach ($traitMethods as $method) { if ($class->hasMethod($method->name) && $class->getMethod($method->name)->isFinal()) { throw new LogicException(sprintf('Cannot generate lazy ghost: method "%s::%s()" is final.', $class->name, $method->name)); } } $parent = $class; while ($parent = $parent->getParentClass()) { if (\stdClass::class !== $parent->name && $parent->isInternal()) { throw new LogicException(sprintf('Cannot generate lazy ghost: class "%s" extends "%s" which is internal.', $class->name, $parent->name)); } } $propertyScopes = self::exportPropertyScopes($class->name); return <<name} implements \Symfony\Component\VarExporter\LazyObjectInterface { use \Symfony\Component\VarExporter\LazyGhostTrait; private const LAZY_OBJECT_PROPERTY_SCOPES = {$propertyScopes}; } // Help opcache.preload discover always-needed symbols class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class); class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class); EOPHP; } /** * Helps generate lazy-loading virtual proxies. * * @param \ReflectionClass[] $interfaces * * @throws LogicException When the class is incompatible with virtual proxies */ public static function generateLazyProxy(?\ReflectionClass $class, array $interfaces = []): string { if (!class_exists($class?->name ?? \stdClass::class, false)) { throw new LogicException(sprintf('Cannot generate lazy proxy: "%s" is not a class.', $class->name)); } if ($class?->isFinal()) { throw new LogicException(sprintf('Cannot generate lazy proxy: class "%s" is final.', $class->name)); } if (\PHP_VERSION_ID < 80300 && $class?->isReadOnly()) { throw new LogicException(sprintf('Cannot generate lazy proxy with PHP < 8.3: class "%s" is readonly.', $class->name)); } $methodReflectors = [$class?->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) ?? []]; foreach ($interfaces as $interface) { if (!$interface->isInterface()) { throw new LogicException(sprintf('Cannot generate lazy proxy: "%s" is not an interface.', $interface->name)); } $methodReflectors[] = $interface->getMethods(); } $methodReflectors = array_merge(...$methodReflectors); $extendsInternalClass = false; if ($parent = $class) { do { $extendsInternalClass = \stdClass::class !== $parent->name && $parent->isInternal(); } while (!$extendsInternalClass && $parent = $parent->getParentClass()); } $methodsHaveToBeProxied = $extendsInternalClass; $methods = []; foreach ($methodReflectors as $method) { if ('__get' !== strtolower($method->name) || 'mixed' === ($type = self::exportType($method) ?? 'mixed')) { continue; } $methodsHaveToBeProxied = true; $trait = new \ReflectionMethod(LazyProxyTrait::class, '__get'); $body = \array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine()); $body[0] = str_replace('): mixed', '): '.$type, $body[0]); $methods['__get'] = strtr(implode('', $body).' }', [ 'Hydrator' => '\\'.Hydrator::class, 'Registry' => '\\'.LazyObjectRegistry::class, ]); break; } foreach ($methodReflectors as $method) { if (($method->isStatic() && !$method->isAbstract()) || isset($methods[$lcName = strtolower($method->name)])) { continue; } if ($method->isFinal()) { if ($extendsInternalClass || $methodsHaveToBeProxied || method_exists(LazyProxyTrait::class, $method->name)) { throw new LogicException(sprintf('Cannot generate lazy proxy: method "%s::%s()" is final.', $class->name, $method->name)); } continue; } if (method_exists(LazyProxyTrait::class, $method->name) || ($method->isProtected() && !$method->isAbstract())) { continue; } $signature = self::exportSignature($method, true, $args); $parentCall = $method->isAbstract() ? "throw new \BadMethodCallException('Cannot forward abstract method \"{$method->class}::{$method->name}()\".')" : "parent::{$method->name}({$args})"; if ($method->isStatic()) { $body = " $parentCall;"; } elseif (str_ends_with($signature, '): never') || str_ends_with($signature, '): void')) { $body = <<lazyObjectState)) { (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$method->name}({$args}); } else { {$parentCall}; } EOPHP; } else { if (!$methodsHaveToBeProxied && !$method->isAbstract()) { // Skip proxying methods that might return $this foreach (preg_split('/[()|&]++/', self::exportType($method) ?? 'static') as $type) { if (\in_array($type = ltrim($type, '?'), ['static', 'object'], true)) { continue 2; } foreach ([$class, ...$interfaces] as $r) { if ($r && is_a($r->name, $type, true)) { continue 3; } } } } $body = <<lazyObjectState)) { return (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$method->name}({$args}); } return {$parentCall}; EOPHP; } $methods[$lcName] = " {$signature}\n {\n{$body}\n }"; } $types = $interfaces = array_unique(array_column($interfaces, 'name')); $interfaces[] = LazyObjectInterface::class; $interfaces = implode(', \\', $interfaces); $parent = $class ? ' extends \\'.$class->name : ''; array_unshift($types, $class ? 'parent' : ''); $type = ltrim(implode('&\\', $types), '&'); if (!$class) { $trait = new \ReflectionMethod(LazyProxyTrait::class, 'initializeLazyObject'); $body = \array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine()); $body[0] = str_replace('): parent', '): '.$type, $body[0]); $methods = ['initializeLazyObject' => implode('', $body).' }'] + $methods; } $body = $methods ? "\n".implode("\n\n", $methods)."\n" : ''; $propertyScopes = $class ? self::exportPropertyScopes($class->name) : '[]'; return <<getParameters() as $param) { $parameters[] = ($param->getAttributes(\SensitiveParameter::class) ? '#[\SensitiveParameter] ' : '') .($withParameterTypes && $param->hasType() ? self::exportType($param).' ' : '') .($param->isPassedByReference() ? '&' : '') .($param->isVariadic() ? '...' : '').'$'.$param->name .($param->isOptional() && !$param->isVariadic() ? ' = '.self::exportDefault($param) : ''); if ($param->isPassedByReference()) { $byRefIndex = 1 + $param->getPosition(); } $args .= ($param->isVariadic() ? '...$' : '$').$param->name.', '; } if (!$param || !$byRefIndex) { $args = '...\func_get_args()'; } elseif ($param->isVariadic()) { $args = substr($args, 0, -2); } else { $args = explode(', ', $args, 1 + $byRefIndex); $args[$byRefIndex] = sprintf('...\array_slice(\func_get_args(), %d)', $byRefIndex); $args = implode(', ', $args); } $signature = 'function '.($function->returnsReference() ? '&' : '') .($function->isClosure() ? '' : $function->name).'('.implode(', ', $parameters).')'; if ($function instanceof \ReflectionMethod) { $signature = ($function->isPublic() ? 'public ' : ($function->isProtected() ? 'protected ' : 'private ')) .($function->isStatic() ? 'static ' : '').$signature; } if ($function->hasReturnType()) { $signature .= ': '.self::exportType($function); } static $getPrototype; $getPrototype ??= (new \ReflectionMethod(\ReflectionMethod::class, 'getPrototype'))->invoke(...); while ($function) { if ($function->hasTentativeReturnType()) { return '#[\ReturnTypeWillChange] '.$signature; } try { $function = $function instanceof \ReflectionMethod && $function->isAbstract() ? false : $getPrototype($function); } catch (\ReflectionException) { break; } } return $signature; } public static function exportType(\ReflectionFunctionAbstract|\ReflectionProperty|\ReflectionParameter $owner, bool $noBuiltin = false, ?\ReflectionType $type = null): ?string { if (!$type ??= $owner instanceof \ReflectionFunctionAbstract ? $owner->getReturnType() : $owner->getType()) { return null; } $class = null; $types = []; if ($type instanceof \ReflectionUnionType) { $reflectionTypes = $type->getTypes(); $glue = '|'; } elseif ($type instanceof \ReflectionIntersectionType) { $reflectionTypes = $type->getTypes(); $glue = '&'; } else { $reflectionTypes = [$type]; $glue = null; } foreach ($reflectionTypes as $type) { if ($type instanceof \ReflectionIntersectionType) { if ('' !== $name = '('.self::exportType($owner, $noBuiltin, $type).')') { $types[] = $name; } continue; } $name = $type->getName(); if ($noBuiltin && $type->isBuiltin()) { continue; } if (\in_array($name, ['parent', 'self'], true) && $class ??= $owner->getDeclaringClass()) { $name = 'parent' === $name ? ($class->getParentClass() ?: null)?->name ?? 'parent' : $class->name; } $types[] = ($noBuiltin || $type->isBuiltin() || 'static' === $name ? '' : '\\').$name; } if (!$types) { return ''; } if (null === $glue) { return (!$noBuiltin && $type->allowsNull() && 'mixed' !== $name ? '?' : '').$types[0]; } sort($types); return implode($glue, $types); } private static function exportPropertyScopes(string $parent): string { $propertyScopes = Hydrator::$propertyScopes[$parent] ??= Hydrator::getPropertyScopes($parent); uksort($propertyScopes, 'strnatcmp'); foreach ($propertyScopes as $k => $v) { unset($propertyScopes[$k][3]); } $propertyScopes = VarExporter::export($propertyScopes); $propertyScopes = str_replace(VarExporter::export($parent), 'parent::class', $propertyScopes); $propertyScopes = preg_replace("/(?|(,)\n( ) |\n |,\n (\]))/", '$1$2', $propertyScopes); $propertyScopes = str_replace("\n", "\n ", $propertyScopes); return $propertyScopes; } private static function exportDefault(\ReflectionParameter $param): string { $default = rtrim(substr(explode('$'.$param->name.' = ', (string) $param, 2)[1] ?? '', 0, -2)); if (\in_array($default, ['', 'NULL'], true)) { return 'null'; } if (str_ends_with($default, "...'") && preg_match("/^'(?:[^'\\\\]*+(?:\\\\.)*+)*+'$/", $default)) { return VarExporter::export($param->getDefaultValue()); } $regexp = "/(\"(?:[^\"\\\\]*+(?:\\\\.)*+)*+\"|'(?:[^'\\\\]*+(?:\\\\.)*+)*+')/"; $parts = preg_split($regexp, $default, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); $regexp = '/([\[\( ]|^)([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z0-9_\x7f-\xff]++)*+)(?!: )/'; $callback = (false !== strpbrk($default, "\\:('") && $class = $param->getDeclaringClass()) ? fn ($m) => $m[1].match ($m[2]) { 'new', 'false', 'true', 'null' => $m[2], 'NULL' => 'null', 'self' => '\\'.$class->name, 'namespace\\parent', 'parent' => ($parent = $class->getParentClass()) ? '\\'.$parent->name : 'parent', default => '\\'.$m[2], } : fn ($m) => $m[1].match ($m[2]) { 'new', 'false', 'true', 'null', 'self', 'parent' => $m[2], 'NULL' => 'null', default => '\\'.$m[2], }; return implode('', array_map(fn ($part) => match ($part[0]) { '"' => $part, // for internal classes only "'" => false !== strpbrk($part, "\\\0\r\n") ? '"'.substr(str_replace(['$', "\0", "\r", "\n"], ['\$', '\0', '\r', '\n'], $part), 1, -1).'"' : $part, default => preg_replace_callback($regexp, $callback, $part), }, $parts)); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/README.md ================================================ VarExporter Component ===================== The VarExporter component provides various tools to deal with the internal state of objects: - `VarExporter::export()` allows exporting any serializable PHP data structure to plain PHP code. While doing so, it preserves all the semantics associated with the serialization mechanism of PHP (`__wakeup`, `__sleep`, `Serializable`, `__serialize`, `__unserialize`); - `Instantiator::instantiate()` creates an object and sets its properties without calling its constructor nor any other methods; - `Hydrator::hydrate()` can set the properties of an existing object; - `Lazy*Trait` can make a class behave as a lazy-loading ghost or virtual proxy. VarExporter::export() --------------------- The reason to use `VarExporter::export()` *vs* `serialize()` or [igbinary](https://github.com/igbinary/igbinary) is performance: thanks to OPcache, the resulting code is significantly faster and more memory efficient than using `unserialize()` or `igbinary_unserialize()`. Unlike `var_export()`, this works on any serializable PHP value. It also provides a few improvements over `var_export()`/`serialize()`: * the output is PSR-2 compatible; * the output can be re-indented without messing up with `\r` or `\n` in the data; * missing classes throw a `ClassNotFoundException` instead of being unserialized to `PHP_Incomplete_Class` objects; * references involving `SplObjectStorage`, `ArrayObject` or `ArrayIterator` instances are preserved; * `Reflection*`, `IteratorIterator` and `RecursiveIteratorIterator` classes throw an exception when being serialized (their unserialized version is broken anyway, see https://bugs.php.net/76737). Instantiator and Hydrator ------------------------- `Instantiator::instantiate($class)` creates an object of the given class without calling its constructor nor any other methods. `Hydrator::hydrate()` sets the properties of an existing object, including private and protected ones. For example: ```php // Sets the public or protected $object->propertyName property Hydrator::hydrate($object, ['propertyName' => $propertyValue]); // Sets a private property defined on its parent Bar class: Hydrator::hydrate($object, ["\0Bar\0privateBarProperty" => $propertyValue]); // Alternative way to set the private $object->privateBarProperty property Hydrator::hydrate($object, [], [ Bar::class => ['privateBarProperty' => $propertyValue], ]); ``` `Lazy*Trait` ------------ The component provides two lazy-loading patterns: ghost objects and virtual proxies (see https://martinfowler.com/eaaCatalog/lazyLoad.html for reference). Ghost objects work only with concrete and non-internal classes. In the generic case, they are not compatible with using factories in their initializer. Virtual proxies work with concrete, abstract or internal classes. They provide an API that looks like the actual objects and forward calls to them. They can cause identity problems because proxies might not be seen as equivalents to the actual objects they proxy. Because of this identity problem, ghost objects should be preferred when possible. Exceptions thrown by the `ProxyHelper` class can help decide when it can be used or not. Ghost objects and virtual proxies both provide implementations for the `LazyObjectInterface` which allows resetting them to their initial state or to forcibly initialize them when needed. Note that resetting a ghost object skips its read-only properties. You should use a virtual proxy to reset read-only properties. ### `LazyGhostTrait` By using `LazyGhostTrait` either directly in your classes or by using `ProxyHelper::generateLazyGhost()`, you can make their instances lazy-loadable. This works by creating these instances empty and by computing their state only when accessing a property. ```php class FooLazyGhost extends Foo { use LazyGhostTrait; } $foo = FooLazyGhost::createLazyGhost(initializer: function (Foo $instance): void { // [...] Use whatever heavy logic you need here // to compute the $dependencies of the $instance $instance->__construct(...$dependencies); // [...] Call setters, etc. if needed }); // $foo is now a lazy-loading ghost object. The initializer will // be called only when and if a *property* is accessed. ``` ### `LazyProxyTrait` Alternatively, `LazyProxyTrait` can be used to create virtual proxies: ```php $proxyCode = ProxyHelper::generateLazyProxy(new ReflectionClass(Foo::class)); // $proxyCode contains the reference to LazyProxyTrait // and should be dumped into a file in production envs eval('class FooLazyProxy'.$proxyCode); $foo = FooLazyProxy::createLazyProxy(initializer: function (): Foo { // [...] Use whatever heavy logic you need here // to compute the $dependencies of the $instance $instance = new Foo(...$dependencies); // [...] Call setters, etc. if needed return $instance; }); // $foo is now a lazy-loading virtual proxy object. The initializer will // be called only when and if a *method* is called. ``` Resources --------- * [Documentation](https://symfony.com/doc/current/components/var_exporter.html) * [Contributing](https://symfony.com/doc/current/contributing/index.html) * [Report issues](https://github.com/symfony/symfony/issues) and [send Pull Requests](https://github.com/symfony/symfony/pulls) in the [main Symfony repository](https://github.com/symfony/symfony) ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/VarExporter.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\VarExporter; use Symfony\Component\VarExporter\Exception\ExceptionInterface; use Symfony\Component\VarExporter\Internal\Exporter; use Symfony\Component\VarExporter\Internal\Hydrator; use Symfony\Component\VarExporter\Internal\Registry; use Symfony\Component\VarExporter\Internal\Values; /** * Exports serializable PHP values to PHP code. * * VarExporter allows serializing PHP data structures to plain PHP code (like var_export()) * while preserving all the semantics associated with serialize() (unlike var_export()). * * By leveraging OPcache, the generated PHP code is faster than doing the same with unserialize(). * * @author Nicolas Grekas */ final class VarExporter { /** * Exports a serializable PHP value to PHP code. * * @param bool &$isStaticValue Set to true after execution if the provided value is static, false otherwise * @param array &$foundClasses Classes found in the value are added to this list as both keys and values * * @throws ExceptionInterface When the provided value cannot be serialized */ public static function export(mixed $value, ?bool &$isStaticValue = null, array &$foundClasses = []): string { $isStaticValue = true; if (!\is_object($value) && !(\is_array($value) && $value) && !\is_resource($value) || $value instanceof \UnitEnum) { return Exporter::export($value); } $objectsPool = new \SplObjectStorage(); $refsPool = []; $objectsCount = 0; try { $value = Exporter::prepare([$value], $objectsPool, $refsPool, $objectsCount, $isStaticValue)[0]; } finally { $references = []; foreach ($refsPool as $i => $v) { if ($v[0]->count) { $references[1 + $i] = $v[2]; } $v[0] = $v[1]; } } if ($isStaticValue) { return Exporter::export($value); } $classes = []; $values = []; $states = []; foreach ($objectsPool as $i => $v) { [, $class, $values[], $wakeup] = $objectsPool[$v]; $foundClasses[$class] = $classes[] = $class; if (0 < $wakeup) { $states[$wakeup] = $i; } elseif (0 > $wakeup) { $states[-$wakeup] = [$i, array_pop($values)]; $values[] = []; } } ksort($states); $wakeups = [null]; foreach ($states as $v) { if (\is_array($v)) { $wakeups[-$v[0]] = $v[1]; } else { $wakeups[] = $v; } } if (null === $wakeups[0]) { unset($wakeups[0]); } $properties = []; foreach ($values as $i => $vars) { foreach ($vars as $class => $values) { foreach ($values as $name => $v) { $properties[$class][$name][$i] = $v; } } } if ($classes || $references) { $value = new Hydrator(new Registry($classes), $references ? new Values($references) : null, $properties, $value, $wakeups); } else { $isStaticValue = true; } return Exporter::export($value); } } ================================================ FILE: core/widget/wechatServer/vendor/symfony/var-exporter/composer.json ================================================ { "name": "symfony/var-exporter", "type": "library", "description": "Allows exporting any serializable PHP data structure to plain PHP code", "keywords": ["export", "serialize", "instantiate", "hydrate", "construct", "clone", "lazy-loading", "proxy"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=8.2" }, "require-dev": { "symfony/property-access": "^6.4|^7.0", "symfony/serializer": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0" }, "autoload": { "psr-4": { "Symfony\\Component\\VarExporter\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "minimum-stability": "dev" } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/CHANGELOG.md ================================================ # Change Log ## [Unreleased](https://github.com/overtrue/wechat/tree/HEAD) [Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0...HEAD) **Closed issues:** - 能否增加对symfony4的支持 [\#1044](https://github.com/overtrue/wechat/issues/1044) ## [4.0.0](https://github.com/overtrue/wechat/tree/4.0.0) (2017-12-11) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.21...4.0.0) **Closed issues:** - filecache.php 文件 createPathIfNeeded\(string $path\) : bool [\#1046](https://github.com/overtrue/wechat/issues/1046) - 沙箱模式的Notify总是出错:Invalid request payloads. [\#1045](https://github.com/overtrue/wechat/issues/1045) - 你好我是SwooleDistributed框架的作者 [\#1040](https://github.com/overtrue/wechat/issues/1040) ## [3.3.21](https://github.com/overtrue/wechat/tree/3.3.21) (2017-12-10) [Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-beta.4...3.3.21) **Closed issues:** - 开启开放平台自动路由后报错 [\#1042](https://github.com/overtrue/wechat/issues/1042) - 关于3.x升级4.x的问题 [\#1041](https://github.com/overtrue/wechat/issues/1041) - 获取不了unionid [\#1038](https://github.com/overtrue/wechat/issues/1038) - authorizer\_refresh\_token刷新问题 [\#1033](https://github.com/overtrue/wechat/issues/1033) - lumen+swoole无法获取request信息。 [\#1032](https://github.com/overtrue/wechat/issues/1032) - 上传素材报错, empty post data hint [\#1031](https://github.com/overtrue/wechat/issues/1031) - 开放平台不支持全网发布接入检测(第三方) [\#1029](https://github.com/overtrue/wechat/issues/1029) - 公众号模板消息不兼容跳转小程序 [\#1025](https://github.com/overtrue/wechat/issues/1025) - swoole下无法使用 [\#1017](https://github.com/overtrue/wechat/issues/1017) - 请教有没有高清素材下载方法? [\#997](https://github.com/overtrue/wechat/issues/997) - 自动回复多图文素材,错误 [\#996](https://github.com/overtrue/wechat/issues/996) - xml解释失败 [\#989](https://github.com/overtrue/wechat/issues/989) - Curl error 77 [\#982](https://github.com/overtrue/wechat/issues/982) - 3.1.10 H5支付不晓得算不算BUG的BUG [\#968](https://github.com/overtrue/wechat/issues/968) - 请问是否有遇到微信扫码或内部打开外部网站出现请求2次的情况 [\#963](https://github.com/overtrue/wechat/issues/963) - 请问4.0何时正式发布? [\#962](https://github.com/overtrue/wechat/issues/962) - dev-master 不能用于laravel5.1 [\#952](https://github.com/overtrue/wechat/issues/952) - 请教小程序的模板消息是否支持 [\#920](https://github.com/overtrue/wechat/issues/920) - 模板消息的颜色设置问题 [\#914](https://github.com/overtrue/wechat/issues/914) - 英文文档跳转问题 [\#854](https://github.com/overtrue/wechat/issues/854) - \[4.0\] 功能测试 [\#849](https://github.com/overtrue/wechat/issues/849) - \[4.0\] 命名变更 [\#743](https://github.com/overtrue/wechat/issues/743) **Merged pull requests:** - Scrutinizer Auto-Fixes [\#1043](https://github.com/overtrue/wechat/pull/1043) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - 修复解密小程序转发信息数据\(wx.getShareInfo\)失败的问题 [\#1037](https://github.com/overtrue/wechat/pull/1037) ([yyqqing](https://github.com/yyqqing)) - 修復微信支付沙盒模式的通知結果本地校驗失敗錯誤。 [\#1036](https://github.com/overtrue/wechat/pull/1036) ([amyuki](https://github.com/amyuki)) - 修复 verifyTicket 使用不了自定义缓存的问题 [\#1034](https://github.com/overtrue/wechat/pull/1034) ([mingyoung](https://github.com/mingyoung)) - 🚧 Auto discover extensions. [\#1027](https://github.com/overtrue/wechat/pull/1027) ([mingyoung](https://github.com/mingyoung)) ## [4.0.0-beta.4](https://github.com/overtrue/wechat/tree/4.0.0-beta.4) (2017-11-21) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.20...4.0.0-beta.4) **Closed issues:** - Order对象的$attributes中不能传入device\_info参数 [\#1030](https://github.com/overtrue/wechat/issues/1030) - 默认文件缓存的路径是否可以简单修改? [\#1023](https://github.com/overtrue/wechat/issues/1023) - 3.3.17 版本获取 token 的问题 [\#1022](https://github.com/overtrue/wechat/issues/1022) - \[V3\] AccessToken.php:243 [\#1021](https://github.com/overtrue/wechat/issues/1021) **Merged pull requests:** - more detailed cache key. [\#1028](https://github.com/overtrue/wechat/pull/1028) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#1026](https://github.com/overtrue/wechat/pull/1026) ([mingyoung](https://github.com/mingyoung)) - Specify the request instance. [\#1024](https://github.com/overtrue/wechat/pull/1024) ([mingyoung](https://github.com/mingyoung)) ## [3.3.20](https://github.com/overtrue/wechat/tree/3.3.20) (2017-11-13) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.18...3.3.20) ## [3.3.18](https://github.com/overtrue/wechat/tree/3.3.18) (2017-11-11) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.17...3.3.18) **Closed issues:** - 临时二维码接口无法生成以字符串为参数的二维码 [\#1020](https://github.com/overtrue/wechat/issues/1020) - 现金红包出现了500错误,跟进显示http\_error:true [\#1016](https://github.com/overtrue/wechat/issues/1016) - 4.0 企业微信agent OA的错误 [\#1015](https://github.com/overtrue/wechat/issues/1015) - 求thinkphp框架demo [\#1010](https://github.com/overtrue/wechat/issues/1010) - 沙箱模式获取验签 key 时产生无限循环 , 无法正常获取 [\#1009](https://github.com/overtrue/wechat/issues/1009) - JSSDK里面url导致的invalid signature错误 [\#1002](https://github.com/overtrue/wechat/issues/1002) - 微信支付沙箱模式下,回调验签错误 [\#998](https://github.com/overtrue/wechat/issues/998) - 有微信退款回调接口吗? [\#985](https://github.com/overtrue/wechat/issues/985) - 希望兼容新出的微信H5支付 [\#966](https://github.com/overtrue/wechat/issues/966) - 小程序生成无限量二维码接口缺少参数 [\#965](https://github.com/overtrue/wechat/issues/965) **Merged pull requests:** - 查询企业付款接口参数调整,加入企业付款到银行卡接口(RSA 参数加密待完成) [\#1019](https://github.com/overtrue/wechat/pull/1019) ([tianyong90](https://github.com/tianyong90)) - Token AESKey can be null. [\#1013](https://github.com/overtrue/wechat/pull/1013) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#1012](https://github.com/overtrue/wechat/pull/1012) ([mingyoung](https://github.com/mingyoung)) - Add Mini-program tester's binding/unbinding feature [\#1011](https://github.com/overtrue/wechat/pull/1011) ([caikeal](https://github.com/caikeal)) - Apply fixes from StyleCI [\#1008](https://github.com/overtrue/wechat/pull/1008) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#1007](https://github.com/overtrue/wechat/pull/1007) ([overtrue](https://github.com/overtrue)) - Added open-platform's mini-program code management [\#1003](https://github.com/overtrue/wechat/pull/1003) ([caikeal](https://github.com/caikeal)) - Cleanup payment [\#1001](https://github.com/overtrue/wechat/pull/1001) ([mingyoung](https://github.com/mingyoung)) - Unify get stream. [\#995](https://github.com/overtrue/wechat/pull/995) ([mingyoung](https://github.com/mingyoung)) - Add appCode `page` param. [\#991](https://github.com/overtrue/wechat/pull/991) ([mingyoung](https://github.com/mingyoung)) ## [3.3.17](https://github.com/overtrue/wechat/tree/3.3.17) (2017-10-27) [Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-beta.3...3.3.17) **Closed issues:** - open platform component\_verify\_ticket 错误 [\#984](https://github.com/overtrue/wechat/issues/984) - 请教下载语音后的文件不完整怎么处理? [\#980](https://github.com/overtrue/wechat/issues/980) - 微信支付 API 调用下单解析缓缓 [\#977](https://github.com/overtrue/wechat/issues/977) - 是否可以加入微信收款(个人转账版)服务接口 [\#970](https://github.com/overtrue/wechat/issues/970) - 微信公众号消息加解密方式‘兼容模式’也需要填写‘aes\_key’参数,不能为空 [\#967](https://github.com/overtrue/wechat/issues/967) - 第三方平台 接收消息一直报错 但是能回复消息 也会提示错误 [\#961](https://github.com/overtrue/wechat/issues/961) - 中文官网无法访问 [\#960](https://github.com/overtrue/wechat/issues/960) - laravel队列中使用了SDK报Component verify ticket does not exists. [\#958](https://github.com/overtrue/wechat/issues/958) - 接口调用次数每日限额清零方法没有? [\#953](https://github.com/overtrue/wechat/issues/953) - 获取access\_toekn失败之后抛出异常的地方,能够与其他地方统一使用下述这个 resolveResponse 返回数据 [\#951](https://github.com/overtrue/wechat/issues/951) - 官网挂了 [\#950](https://github.com/overtrue/wechat/issues/950) - 无法接收到菜单点击事件推送的消息 [\#949](https://github.com/overtrue/wechat/issues/949) - 请教这个sdk是否可用于android 或者ios 登录? [\#948](https://github.com/overtrue/wechat/issues/948) - 关于access token 后端分布式部署的中控服务器的问题 [\#947](https://github.com/overtrue/wechat/issues/947) - 4.0 不支持laravel 5.2? [\#946](https://github.com/overtrue/wechat/issues/946) - log不能打印出来 [\#945](https://github.com/overtrue/wechat/issues/945) - EasyWeChat.org域名挂了?? [\#940](https://github.com/overtrue/wechat/issues/940) - 微信静默授权的时候,页面上老是会显示一段很长的英文Redirecting to http://xxxx,很影响用户体验,有没有什么方法可以去掉,保留空白页,或者允许自定义显示内容 [\#939](https://github.com/overtrue/wechat/issues/939) - 微信小程序生成二维码(接口B)微信扫描不出来结果 [\#938](https://github.com/overtrue/wechat/issues/938) - 官网可否支持看老版本的文档? [\#937](https://github.com/overtrue/wechat/issues/937) - 客服发送消息 收到的中文信息被unicode 编码 [\#935](https://github.com/overtrue/wechat/issues/935) - 有多个商户时,订单通知的 $payment 怎么创建 [\#934](https://github.com/overtrue/wechat/issues/934) - console中使用$app-\>user-\>get报错 [\#932](https://github.com/overtrue/wechat/issues/932) - PC端扫描登录的问题 [\#930](https://github.com/overtrue/wechat/issues/930) - 关于小程序支付的疑问 [\#912](https://github.com/overtrue/wechat/issues/912) - 服务商api模式使用可以更加详细吗 [\#653](https://github.com/overtrue/wechat/issues/653) **Merged pull requests:** - 修正 微信公众号要求 所有接口使用 HTTPS 方式访问 [\#988](https://github.com/overtrue/wechat/pull/988) ([drogjh](https://github.com/drogjh)) - Apply fixes from StyleCI [\#987](https://github.com/overtrue/wechat/pull/987) ([mingyoung](https://github.com/mingyoung)) - 修复微信收款(个人转账版)商户添加、查询含有多余字段导致签名失败的问题 [\#986](https://github.com/overtrue/wechat/pull/986) ([chenhaizano](https://github.com/chenhaizano)) - Add merchant client. [\#983](https://github.com/overtrue/wechat/pull/983) ([mingyoung](https://github.com/mingyoung)) - Fix PKCS7 unpad issue. [\#981](https://github.com/overtrue/wechat/pull/981) ([mingyoung](https://github.com/mingyoung)) - 💯 Add unit tests. [\#979](https://github.com/overtrue/wechat/pull/979) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#978](https://github.com/overtrue/wechat/pull/978) ([overtrue](https://github.com/overtrue)) - Add sub-merchant support. [\#976](https://github.com/overtrue/wechat/pull/976) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#974](https://github.com/overtrue/wechat/pull/974) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#973](https://github.com/overtrue/wechat/pull/973) ([mingyoung](https://github.com/mingyoung)) - Refactoring payment [\#972](https://github.com/overtrue/wechat/pull/972) ([mingyoung](https://github.com/mingyoung)) - Fix request method. [\#964](https://github.com/overtrue/wechat/pull/964) ([mingyoung](https://github.com/mingyoung)) - MiniProgram template. [\#959](https://github.com/overtrue/wechat/pull/959) ([mingyoung](https://github.com/mingyoung)) - 企业微信 jssdk ticket [\#954](https://github.com/overtrue/wechat/pull/954) ([mingyoung](https://github.com/mingyoung)) - Scrutinizer Auto-Fixes [\#944](https://github.com/overtrue/wechat/pull/944) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - 简化子商户js config [\#943](https://github.com/overtrue/wechat/pull/943) ([HanSon](https://github.com/HanSon)) - Apply fixes from StyleCI [\#942](https://github.com/overtrue/wechat/pull/942) ([overtrue](https://github.com/overtrue)) - 支持子商户JS CONFIG生成 [\#941](https://github.com/overtrue/wechat/pull/941) ([HanSon](https://github.com/HanSon)) ## [4.0.0-beta.3](https://github.com/overtrue/wechat/tree/4.0.0-beta.3) (2017-09-23) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.16...4.0.0-beta.3) **Closed issues:** - 退款结果通知 [\#858](https://github.com/overtrue/wechat/issues/858) **Merged pull requests:** - Update Application.php [\#936](https://github.com/overtrue/wechat/pull/936) ([HanSon](https://github.com/HanSon)) ## [3.3.16](https://github.com/overtrue/wechat/tree/3.3.16) (2017-09-20) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.15...3.3.16) **Closed issues:** - 希望能增加获取回复数据的方法 [\#929](https://github.com/overtrue/wechat/issues/929) - 3.3 版本 数据类型不对导致无法运行 [\#928](https://github.com/overtrue/wechat/issues/928) **Merged pull requests:** - 增加退款回调处理 [\#931](https://github.com/overtrue/wechat/pull/931) ([leo108](https://github.com/leo108)) ## [3.3.15](https://github.com/overtrue/wechat/tree/3.3.15) (2017-09-13) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.14...3.3.15) **Closed issues:** - 微信 for windows 发送文件的时候报错 [\#927](https://github.com/overtrue/wechat/issues/927) ## [3.3.14](https://github.com/overtrue/wechat/tree/3.3.14) (2017-09-13) [Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-beta.2...3.3.14) **Closed issues:** - 请教授权的时候什么方法拿到用户是否关注了本公众号? [\#926](https://github.com/overtrue/wechat/issues/926) ## [4.0.0-beta.2](https://github.com/overtrue/wechat/tree/4.0.0-beta.2) (2017-09-12) [Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-beta.1...4.0.0-beta.2) **Closed issues:** - readme.md写错了? [\#923](https://github.com/overtrue/wechat/issues/923) - token验证成功,但还是回复暂时不可用,困扰1个星期多了,真心求助!!!有偿都可以!! [\#922](https://github.com/overtrue/wechat/issues/922) - 条件判断错了,stripos返回的是“返回在字符串 haystack 中 needle 首次出现的数字位置。”,所以不能直接作为条件判断 [\#915](https://github.com/overtrue/wechat/issues/915) - README中的链接是否错误 [\#913](https://github.com/overtrue/wechat/issues/913) - 测试公众号无法接受用户信息 [\#911](https://github.com/overtrue/wechat/issues/911) - ReadMe文件过期 [\#910](https://github.com/overtrue/wechat/issues/910) - 开放平台服务,取消授权会有哪些参数过来? [\#909](https://github.com/overtrue/wechat/issues/909) - token无法验证 [\#908](https://github.com/overtrue/wechat/issues/908) - laravel 5.4 composer 失败 [\#907](https://github.com/overtrue/wechat/issues/907) - 开放平台:组件ticket无法通过 [\#904](https://github.com/overtrue/wechat/issues/904) - 官方网站一直登陆不了,浙江丽水地区 [\#903](https://github.com/overtrue/wechat/issues/903) - \[4.0\] Pimple\Exception\UnknownIdentifierException [\#901](https://github.com/overtrue/wechat/issues/901) - 4.0 报错“Your requirements could not be resolved to an installable set of packages.” [\#898](https://github.com/overtrue/wechat/issues/898) **Merged pull requests:** - 修改通过ticket换取二维码图片地址的逻辑 [\#925](https://github.com/overtrue/wechat/pull/925) ([Gwill](https://github.com/Gwill)) - make domain more flexible [\#924](https://github.com/overtrue/wechat/pull/924) ([HanSon](https://github.com/HanSon)) - add code & domain comment [\#921](https://github.com/overtrue/wechat/pull/921) ([HanSon](https://github.com/HanSon)) - Apply fixes from StyleCI [\#919](https://github.com/overtrue/wechat/pull/919) ([overtrue](https://github.com/overtrue)) - \[3.1\] Custom PreAuthCode Support [\#918](https://github.com/overtrue/wechat/pull/918) ([freyo](https://github.com/freyo)) - 修改acess\_token无效时微信返回错误码的判断 [\#916](https://github.com/overtrue/wechat/pull/916) ([blackjune](https://github.com/blackjune)) - \[4.0\] Add optional 'request' parameter to notify handler methods [\#905](https://github.com/overtrue/wechat/pull/905) ([edwardaa](https://github.com/edwardaa)) - Apply fixes from StyleCI [\#902](https://github.com/overtrue/wechat/pull/902) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#897](https://github.com/overtrue/wechat/pull/897) ([overtrue](https://github.com/overtrue)) - 增加OAuth中Guzzle\Client的配置项的设置 [\#893](https://github.com/overtrue/wechat/pull/893) ([khsing](https://github.com/khsing)) - Apply fixes from StyleCI [\#887](https://github.com/overtrue/wechat/pull/887) ([overtrue](https://github.com/overtrue)) - Scrutinizer Auto-Fixes [\#884](https://github.com/overtrue/wechat/pull/884) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) ## [4.0.0-beta.1](https://github.com/overtrue/wechat/tree/4.0.0-beta.1) (2017-08-31) [Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-alpha.2...4.0.0-beta.1) **Closed issues:** - http://easywechat.org/ 网站访问不了了? [\#896](https://github.com/overtrue/wechat/issues/896) - 关于缓存,请问为什么key中包含appId \* 2,有什么讲究吗? [\#892](https://github.com/overtrue/wechat/issues/892) - 小程序调用解密程序报-41003错误 [\#891](https://github.com/overtrue/wechat/issues/891) - 小程序调用加密数据解密时报错,不存在方法 [\#890](https://github.com/overtrue/wechat/issues/890) - 有关4.0使用文档的问题 [\#883](https://github.com/overtrue/wechat/issues/883) - \[4.0\] PHP最低版本能否降到7.0 [\#880](https://github.com/overtrue/wechat/issues/880) **Merged pull requests:** - \[4.0\] Pass proper arguments to the Response constructor [\#895](https://github.com/overtrue/wechat/pull/895) ([edwardaa](https://github.com/edwardaa)) - Fix baseUrl and json issues. [\#894](https://github.com/overtrue/wechat/pull/894) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#889](https://github.com/overtrue/wechat/pull/889) ([overtrue](https://github.com/overtrue)) - Scrutinizer Auto-Fixes [\#885](https://github.com/overtrue/wechat/pull/885) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - Apply fixes from StyleCI [\#882](https://github.com/overtrue/wechat/pull/882) ([overtrue](https://github.com/overtrue)) - 补充通用卡接口 [\#881](https://github.com/overtrue/wechat/pull/881) ([XiaoLer](https://github.com/XiaoLer)) - Apply fixes from StyleCI [\#879](https://github.com/overtrue/wechat/pull/879) ([overtrue](https://github.com/overtrue)) - \[3.1\] Payment/API 没有使用全局的 cache [\#878](https://github.com/overtrue/wechat/pull/878) ([edwardaa](https://github.com/edwardaa)) - Add JSON\_UNESCAPED\_UNICODE option. [\#874](https://github.com/overtrue/wechat/pull/874) ([mingyoung](https://github.com/mingyoung)) - update \_\_set\_state magic method to static [\#872](https://github.com/overtrue/wechat/pull/872) ([8090Lambert](https://github.com/8090Lambert)) ## [4.0.0-alpha.2](https://github.com/overtrue/wechat/tree/4.0.0-alpha.2) (2017-08-20) [Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-alpha.1...4.0.0-alpha.2) **Closed issues:** - 你好,怎么用的 [\#869](https://github.com/overtrue/wechat/issues/869) **Merged pull requests:** - Tweak dir [\#871](https://github.com/overtrue/wechat/pull/871) ([mingyoung](https://github.com/mingyoung)) - Fix mini-program guard. [\#870](https://github.com/overtrue/wechat/pull/870) ([mingyoung](https://github.com/mingyoung)) ## [4.0.0-alpha.1](https://github.com/overtrue/wechat/tree/4.0.0-alpha.1) (2017-08-14) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.13...4.0.0-alpha.1) **Closed issues:** - 对doctrine/cache依赖的版本锁定 [\#867](https://github.com/overtrue/wechat/issues/867) ## [3.3.13](https://github.com/overtrue/wechat/tree/3.3.13) (2017-08-13) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.12...3.3.13) **Closed issues:** - 文档中网页授权实例写的不明确 [\#850](https://github.com/overtrue/wechat/issues/850) - \[意见\]作者能否提供getTokenFromServer方法扩展从外部第三方获取access\_token [\#837](https://github.com/overtrue/wechat/issues/837) - invalid credential, access\_token is invalid or not latest [\#808](https://github.com/overtrue/wechat/issues/808) - \[4.0\] 重构卡券 [\#806](https://github.com/overtrue/wechat/issues/806) - \[4.0\] 重构 Broadcasting [\#805](https://github.com/overtrue/wechat/issues/805) - \[4.0\] 变更日志 [\#746](https://github.com/overtrue/wechat/issues/746) **Merged pull requests:** - Fixed open-platform authorizer server token. [\#866](https://github.com/overtrue/wechat/pull/866) ([mingyoung](https://github.com/mingyoung)) - payment\ClientTest 优化 [\#865](https://github.com/overtrue/wechat/pull/865) ([tianyong90](https://github.com/tianyong90)) - Apply fixes from StyleCI [\#864](https://github.com/overtrue/wechat/pull/864) ([overtrue](https://github.com/overtrue)) - 退款通知处理及相关单元测试 [\#863](https://github.com/overtrue/wechat/pull/863) ([tianyong90](https://github.com/tianyong90)) - Apply fixes from StyleCI [\#862](https://github.com/overtrue/wechat/pull/862) ([overtrue](https://github.com/overtrue)) - Update dependence version. [\#861](https://github.com/overtrue/wechat/pull/861) ([mingyoung](https://github.com/mingyoung)) - Add tests. [\#859](https://github.com/overtrue/wechat/pull/859) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#857](https://github.com/overtrue/wechat/pull/857) ([overtrue](https://github.com/overtrue)) - Payment 单元测试优化 [\#856](https://github.com/overtrue/wechat/pull/856) ([tianyong90](https://github.com/tianyong90)) - Apply fixes from StyleCI [\#855](https://github.com/overtrue/wechat/pull/855) ([overtrue](https://github.com/overtrue)) - lists 方法重命名为 list,相关单元测试调整 [\#853](https://github.com/overtrue/wechat/pull/853) ([tianyong90](https://github.com/tianyong90)) - Apply fixes from StyleCI [\#852](https://github.com/overtrue/wechat/pull/852) ([overtrue](https://github.com/overtrue)) - Payment 单元测试及部分问题修复 [\#851](https://github.com/overtrue/wechat/pull/851) ([tianyong90](https://github.com/tianyong90)) - Apply fixes from StyleCI [\#848](https://github.com/overtrue/wechat/pull/848) ([overtrue](https://github.com/overtrue)) - 调整 Payment\BaseClient 注入的 $app 类型 [\#847](https://github.com/overtrue/wechat/pull/847) ([tianyong90](https://github.com/tianyong90)) - array\_merge 方法参数类型转换, type hints [\#846](https://github.com/overtrue/wechat/pull/846) ([tianyong90](https://github.com/tianyong90)) - Fix oauth. [\#845](https://github.com/overtrue/wechat/pull/845) ([mingyoung](https://github.com/mingyoung)) - Text message. [\#844](https://github.com/overtrue/wechat/pull/844) ([mingyoung](https://github.com/mingyoung)) - Rename BaseService -\> BasicService. [\#843](https://github.com/overtrue/wechat/pull/843) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#842](https://github.com/overtrue/wechat/pull/842) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#841](https://github.com/overtrue/wechat/pull/841) ([overtrue](https://github.com/overtrue)) - phpdoc types。 [\#840](https://github.com/overtrue/wechat/pull/840) ([tianyong90](https://github.com/tianyong90)) - Apply fixes from StyleCI [\#839](https://github.com/overtrue/wechat/pull/839) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#836](https://github.com/overtrue/wechat/pull/836) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#835](https://github.com/overtrue/wechat/pull/835) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#833](https://github.com/overtrue/wechat/pull/833) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#831](https://github.com/overtrue/wechat/pull/831) ([overtrue](https://github.com/overtrue)) ## [3.3.12](https://github.com/overtrue/wechat/tree/3.3.12) (2017-08-01) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.11...3.3.12) **Closed issues:** - 能否整合微信开放平台在给出一套demo [\#816](https://github.com/overtrue/wechat/issues/816) - 请教这个项目的支付部分,尤其是签名和结果回调,是否支持小程序? [\#814](https://github.com/overtrue/wechat/issues/814) - 微信意图识别接口返回invalid param [\#804](https://github.com/overtrue/wechat/issues/804) - 返回param invalid [\#803](https://github.com/overtrue/wechat/issues/803) **Merged pull requests:** - change comment word [\#830](https://github.com/overtrue/wechat/pull/830) ([tianyong90](https://github.com/tianyong90)) - Fix getTicket. [\#829](https://github.com/overtrue/wechat/pull/829) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#827](https://github.com/overtrue/wechat/pull/827) ([overtrue](https://github.com/overtrue)) - 修正 HasAttributes Trait 引用错误 [\#825](https://github.com/overtrue/wechat/pull/825) ([tianyong90](https://github.com/tianyong90)) - Apply fixes from StyleCI [\#824](https://github.com/overtrue/wechat/pull/824) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#822](https://github.com/overtrue/wechat/pull/822) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#820](https://github.com/overtrue/wechat/pull/820) ([mingyoung](https://github.com/mingyoung)) - Add subscribe message. [\#819](https://github.com/overtrue/wechat/pull/819) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#818](https://github.com/overtrue/wechat/pull/818) ([mingyoung](https://github.com/mingyoung)) - 微信开放平台帐号管理 [\#817](https://github.com/overtrue/wechat/pull/817) ([XiaoLer](https://github.com/XiaoLer)) - add method in comment [\#813](https://github.com/overtrue/wechat/pull/813) ([HanSon](https://github.com/HanSon)) - fixed guzzle version [\#812](https://github.com/overtrue/wechat/pull/812) ([HanSon](https://github.com/HanSon)) - Apply fixes from StyleCI [\#811](https://github.com/overtrue/wechat/pull/811) ([mingyoung](https://github.com/mingyoung)) - Downgrade to php 7.0 [\#809](https://github.com/overtrue/wechat/pull/809) ([HanSon](https://github.com/HanSon)) ## [3.3.11](https://github.com/overtrue/wechat/tree/3.3.11) (2017-07-17) [Full Changelog](https://github.com/overtrue/wechat/compare/4.0.0-alpha1...3.3.11) **Closed issues:** - 请添加 「退款原因」 参数 [\#802](https://github.com/overtrue/wechat/issues/802) ## [4.0.0-alpha1](https://github.com/overtrue/wechat/tree/4.0.0-alpha1) (2017-07-17) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.10...4.0.0-alpha1) **Closed issues:** - Overtrue\Wechat\Media not found [\#801](https://github.com/overtrue/wechat/issues/801) - 在微信的接口配置时Token 无效,可任意输入 [\#800](https://github.com/overtrue/wechat/issues/800) ## [3.3.10](https://github.com/overtrue/wechat/tree/3.3.10) (2017-07-13) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.9...3.3.10) **Closed issues:** - 第三方平台refresh\_token的保存问题 [\#798](https://github.com/overtrue/wechat/issues/798) - 网页授权共享session已晚 [\#792](https://github.com/overtrue/wechat/issues/792) **Merged pull requests:** - 临时二维码也是支持scene\_str的,这里补充上 [\#797](https://github.com/overtrue/wechat/pull/797) ([lornewang](https://github.com/lornewang)) - Apply fixes from StyleCI [\#795](https://github.com/overtrue/wechat/pull/795) ([overtrue](https://github.com/overtrue)) - add card message type [\#794](https://github.com/overtrue/wechat/pull/794) ([IanGely](https://github.com/IanGely)) - add staff message type wxcard [\#793](https://github.com/overtrue/wechat/pull/793) ([IanGely](https://github.com/IanGely)) ## [3.3.9](https://github.com/overtrue/wechat/tree/3.3.9) (2017-07-07) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.8...3.3.9) **Closed issues:** - \[4.0\] Http 模块 [\#678](https://github.com/overtrue/wechat/issues/678) - \[4.0\] Http 请求类 [\#582](https://github.com/overtrue/wechat/issues/582) **Merged pull requests:** - Apply fixes from StyleCI [\#791](https://github.com/overtrue/wechat/pull/791) ([overtrue](https://github.com/overtrue)) - Add get user portrait method. [\#790](https://github.com/overtrue/wechat/pull/790) ([getive](https://github.com/getive)) - \[Feature\] Move directories [\#789](https://github.com/overtrue/wechat/pull/789) ([overtrue](https://github.com/overtrue)) - \[Feature\] Move traits to kernel. [\#788](https://github.com/overtrue/wechat/pull/788) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#787](https://github.com/overtrue/wechat/pull/787) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#786](https://github.com/overtrue/wechat/pull/786) ([overtrue](https://github.com/overtrue)) ## [3.3.8](https://github.com/overtrue/wechat/tree/3.3.8) (2017-07-07) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.7...3.3.8) **Closed issues:** - $temporary-\>getStream\($media\_id\) 与 file\_get\_contents\(\) 有区别??? [\#742](https://github.com/overtrue/wechat/issues/742) ## [3.3.7](https://github.com/overtrue/wechat/tree/3.3.7) (2017-07-06) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.6...3.3.7) **Closed issues:** - 多添加一个$option [\#772](https://github.com/overtrue/wechat/issues/772) - 消息群发,指定openid群发视频时,微信报错invalid message type hint: \[JUs0Oa0779ge25\] [\#757](https://github.com/overtrue/wechat/issues/757) ## [3.3.6](https://github.com/overtrue/wechat/tree/3.3.6) (2017-07-06) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.5...3.3.6) **Fixed bugs:** - 素材管理,如果media\_id不存在会保存网页返回的错误代码 [\#592](https://github.com/overtrue/wechat/issues/592) **Closed issues:** - https://easywechat.org网站证书刚过期了,知会作者一声 [\#781](https://github.com/overtrue/wechat/issues/781) - access\_token 是否能不内部主动请求微信 [\#778](https://github.com/overtrue/wechat/issues/778) - 门店创建API \($poi-\>create\) 建议返回 poi\_id / exception [\#774](https://github.com/overtrue/wechat/issues/774) - 扩展门店小程序错误 [\#762](https://github.com/overtrue/wechat/issues/762) - \[4.0\] jssdk 抽出独立模块 [\#754](https://github.com/overtrue/wechat/issues/754) - \[4.0\] 消息加密解密模块提取到 Kernel [\#753](https://github.com/overtrue/wechat/issues/753) - 网页能授权但无法获取用户信息,代码跟官方文档一样。 [\#713](https://github.com/overtrue/wechat/issues/713) **Merged pull requests:** - Feature: BaseService. [\#785](https://github.com/overtrue/wechat/pull/785) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#784](https://github.com/overtrue/wechat/pull/784) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#783](https://github.com/overtrue/wechat/pull/783) ([mingyoung](https://github.com/mingyoung)) ## [3.3.5](https://github.com/overtrue/wechat/tree/3.3.5) (2017-07-04) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.4...3.3.5) **Implemented enhancements:** - 并发下access\_token存在脏写隐患 [\#696](https://github.com/overtrue/wechat/issues/696) **Merged pull requests:** - Apply fixes from StyleCI [\#780](https://github.com/overtrue/wechat/pull/780) ([overtrue](https://github.com/overtrue)) ## [3.3.4](https://github.com/overtrue/wechat/tree/3.3.4) (2017-07-04) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.3...3.3.4) **Closed issues:** - 网页授权获取用户信息无法打开授权页面 [\#773](https://github.com/overtrue/wechat/issues/773) - Class 'EasyWechat\Foundation\Application' not found [\#769](https://github.com/overtrue/wechat/issues/769) - 获取小程序二维码报错 [\#766](https://github.com/overtrue/wechat/issues/766) - Call to undefined method EasyWeChat\Server\Guard::setRequest\(\) [\#765](https://github.com/overtrue/wechat/issues/765) - 网页授权问题,提示scopes类型错误 [\#764](https://github.com/overtrue/wechat/issues/764) - 门店小程序扩展错误问题 [\#763](https://github.com/overtrue/wechat/issues/763) - 微信开发者平台,全网发布怎么通过 [\#761](https://github.com/overtrue/wechat/issues/761) - 微信网页授权重复请求报code无效 [\#714](https://github.com/overtrue/wechat/issues/714) **Merged pull requests:** - 新版客服功能-获取聊天记录 [\#775](https://github.com/overtrue/wechat/pull/775) ([wuwenbao](https://github.com/wuwenbao)) - Fix mini-program qrcode. [\#768](https://github.com/overtrue/wechat/pull/768) ([mingyoung](https://github.com/mingyoung)) - Add code comments [\#756](https://github.com/overtrue/wechat/pull/756) ([daxiong123](https://github.com/daxiong123)) ## [3.3.3](https://github.com/overtrue/wechat/tree/3.3.3) (2017-06-22) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.2...3.3.3) **Implemented enhancements:** - \[4.0\] Trait HasHttpRequests [\#671](https://github.com/overtrue/wechat/issues/671) - \[4.0\] 缓存抽象成 trait: InteractsWithCache [\#670](https://github.com/overtrue/wechat/issues/670) - \[4.0\] 返回值类型可配置 [\#661](https://github.com/overtrue/wechat/issues/661) - \[4.0\] 报错信息可选 [\#596](https://github.com/overtrue/wechat/issues/596) - \[4.0\] 简化并完善开发者配置项 [\#584](https://github.com/overtrue/wechat/issues/584) **Fixed bugs:** - open\_platform.oauth 过早的获取 access token [\#701](https://github.com/overtrue/wechat/issues/701) **Closed issues:** - 微信网页支付配置生成 [\#751](https://github.com/overtrue/wechat/issues/751) - configForJSSDKPayment [\#744](https://github.com/overtrue/wechat/issues/744) - 发现微信上有管理公众号留言的接口,不知道是不是新出的 [\#721](https://github.com/overtrue/wechat/issues/721) - oauth能获取用户信息,再通过access\_token与用户openid去获取信息,部分用户的信息为空 [\#720](https://github.com/overtrue/wechat/issues/720) - 接入多个公众号 [\#718](https://github.com/overtrue/wechat/issues/718) - guzzle curl error28 - 去哪设置默认timeout ? [\#715](https://github.com/overtrue/wechat/issues/715) - 使用$server-\>getMessage\(\);报错 [\#712](https://github.com/overtrue/wechat/issues/712) - 怎样从数据库中调取配置 [\#711](https://github.com/overtrue/wechat/issues/711) - \[4.0\] 支持企业微信 [\#707](https://github.com/overtrue/wechat/issues/707) - defaultColor does not work. [\#703](https://github.com/overtrue/wechat/issues/703) - 是否支持H5支付 [\#694](https://github.com/overtrue/wechat/issues/694) - 生成AccessToken时,似乎没有调用自定义缓存的delete方法 [\#693](https://github.com/overtrue/wechat/issues/693) - \[4.0\] PSR-6 缓存接口 [\#692](https://github.com/overtrue/wechat/issues/692) - 微信支付沙盒模式支持配置文件配置 [\#690](https://github.com/overtrue/wechat/issues/690) - \[4.0\] 优化服务提供器结构 [\#689](https://github.com/overtrue/wechat/issues/689) - 强制项目不要自动获取AccessToken [\#688](https://github.com/overtrue/wechat/issues/688) - 小程序解密$encryptedData数据 [\#687](https://github.com/overtrue/wechat/issues/687) - 微信坑爹timestamp已经解决不需要configForJSSDKPayment改变timestamp中s大小写 [\#686](https://github.com/overtrue/wechat/issues/686) - \[4.0\] 所有 API 改名为 Client. [\#677](https://github.com/overtrue/wechat/issues/677) - sandbox\_signkey 过期 [\#675](https://github.com/overtrue/wechat/issues/675) - 接口配置失败 [\#672](https://github.com/overtrue/wechat/issues/672) - 下载语音文件偶尔报错:ErrorException: is\_readable\(\) expects parameter 1 to be a valid path [\#667](https://github.com/overtrue/wechat/issues/667) - 微信支付沙箱地址混乱 [\#665](https://github.com/overtrue/wechat/issues/665) - 开放平台自动回复出错,提示“该服务号暂时无法提供服务” [\#654](https://github.com/overtrue/wechat/issues/654) - \[4.0\]自定义微信API的区域接入点 [\#636](https://github.com/overtrue/wechat/issues/636) - 在命令行使用easywechat如何关闭日志 [\#601](https://github.com/overtrue/wechat/issues/601) - \[4.0\] PHP 版本最低要求 7.1 [\#586](https://github.com/overtrue/wechat/issues/586) - \[4.0\] 简化微信 API 请求 [\#583](https://github.com/overtrue/wechat/issues/583) - \[4.0\] 自定义 endpoint [\#521](https://github.com/overtrue/wechat/issues/521) **Merged pull requests:** - Apply fixes from StyleCI [\#750](https://github.com/overtrue/wechat/pull/750) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#749](https://github.com/overtrue/wechat/pull/749) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#747](https://github.com/overtrue/wechat/pull/747) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#745](https://github.com/overtrue/wechat/pull/745) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#740](https://github.com/overtrue/wechat/pull/740) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#737](https://github.com/overtrue/wechat/pull/737) ([mingyoung](https://github.com/mingyoung)) - 分模块静态调用 [\#734](https://github.com/overtrue/wechat/pull/734) ([mingyoung](https://github.com/mingyoung)) - Revert "Apply fixes from StyleCI" [\#731](https://github.com/overtrue/wechat/pull/731) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#730](https://github.com/overtrue/wechat/pull/730) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#729](https://github.com/overtrue/wechat/pull/729) ([overtrue](https://github.com/overtrue)) - Revert "Apply fixes from StyleCI" [\#728](https://github.com/overtrue/wechat/pull/728) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#727](https://github.com/overtrue/wechat/pull/727) ([overtrue](https://github.com/overtrue)) - 修复Https 请求判断不准 [\#726](https://github.com/overtrue/wechat/pull/726) ([xutl](https://github.com/xutl)) - Apply fixes from StyleCI [\#725](https://github.com/overtrue/wechat/pull/725) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#724](https://github.com/overtrue/wechat/pull/724) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#723](https://github.com/overtrue/wechat/pull/723) ([mingyoung](https://github.com/mingyoung)) - Correction notes [\#722](https://github.com/overtrue/wechat/pull/722) ([PersiLiao](https://github.com/PersiLiao)) - Apply fixes from StyleCI [\#717](https://github.com/overtrue/wechat/pull/717) ([mingyoung](https://github.com/mingyoung)) - 新增图文消息留言管理接口 [\#716](https://github.com/overtrue/wechat/pull/716) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#710](https://github.com/overtrue/wechat/pull/710) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#709](https://github.com/overtrue/wechat/pull/709) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#708](https://github.com/overtrue/wechat/pull/708) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#706](https://github.com/overtrue/wechat/pull/706) ([overtrue](https://github.com/overtrue)) - 命令行下不打印日志 [\#705](https://github.com/overtrue/wechat/pull/705) ([mingyoung](https://github.com/mingyoung)) - add defaultColor [\#704](https://github.com/overtrue/wechat/pull/704) ([damonto](https://github.com/damonto)) - Fix [\#702](https://github.com/overtrue/wechat/pull/702) ([mingyoung](https://github.com/mingyoung)) - Add api. [\#700](https://github.com/overtrue/wechat/pull/700) ([mingyoung](https://github.com/mingyoung)) - Rename method. [\#699](https://github.com/overtrue/wechat/pull/699) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#698](https://github.com/overtrue/wechat/pull/698) ([mingyoung](https://github.com/mingyoung)) - 修正素材管理中的返回值文档注释,正确的类型应该是集合,而不是字符串。 [\#695](https://github.com/overtrue/wechat/pull/695) ([starlight36](https://github.com/starlight36)) - Payment sandbox config. [\#691](https://github.com/overtrue/wechat/pull/691) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#684](https://github.com/overtrue/wechat/pull/684) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#683](https://github.com/overtrue/wechat/pull/683) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#682](https://github.com/overtrue/wechat/pull/682) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#681](https://github.com/overtrue/wechat/pull/681) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#680](https://github.com/overtrue/wechat/pull/680) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#679](https://github.com/overtrue/wechat/pull/679) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#676](https://github.com/overtrue/wechat/pull/676) ([mingyoung](https://github.com/mingyoung)) - checks via composer. [\#673](https://github.com/overtrue/wechat/pull/673) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#668](https://github.com/overtrue/wechat/pull/668) ([overtrue](https://github.com/overtrue)) - Correct payment sandbox endpoint and add a method to get sandbox sign key [\#666](https://github.com/overtrue/wechat/pull/666) ([skyred](https://github.com/skyred)) ## [3.3.2](https://github.com/overtrue/wechat/tree/3.3.2) (2017-04-27) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.1...3.3.2) **Implemented enhancements:** - \[4.0\] Open Platform 模块 [\#587](https://github.com/overtrue/wechat/issues/587) - \[4.0\] 微信支付 sandbox模式 [\#507](https://github.com/overtrue/wechat/issues/507) **Closed issues:** - \[4.0\] staff 模块改名为 customer service [\#585](https://github.com/overtrue/wechat/issues/585) **Merged pull requests:** - Module rename. [\#664](https://github.com/overtrue/wechat/pull/664) ([mingyoung](https://github.com/mingyoung)) - Merge branch master into branch develop. [\#663](https://github.com/overtrue/wechat/pull/663) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#662](https://github.com/overtrue/wechat/pull/662) ([mingyoung](https://github.com/mingyoung)) - Fix payment tools API [\#660](https://github.com/overtrue/wechat/pull/660) ([mingyoung](https://github.com/mingyoung)) - Avoid ambiguity [\#659](https://github.com/overtrue/wechat/pull/659) ([mingyoung](https://github.com/mingyoung)) - Support Payment Sandbox mode [\#658](https://github.com/overtrue/wechat/pull/658) ([skyred](https://github.com/skyred)) - Apply fixes from StyleCI [\#656](https://github.com/overtrue/wechat/pull/656) ([overtrue](https://github.com/overtrue)) - Mini program datacube. [\#655](https://github.com/overtrue/wechat/pull/655) ([mingyoung](https://github.com/mingyoung)) ## [3.3.1](https://github.com/overtrue/wechat/tree/3.3.1) (2017-04-16) [Full Changelog](https://github.com/overtrue/wechat/compare/3.3.0...3.3.1) **Closed issues:** - 微信第三方平台缓存位置,是否可以在配置文件中自定义 [\#648](https://github.com/overtrue/wechat/issues/648) - 微信开放平台authorizer token缓存问题 [\#644](https://github.com/overtrue/wechat/issues/644) - 微信开放平台发起网页授权bug [\#638](https://github.com/overtrue/wechat/issues/638) - 微信公众号不能回复接收到的消息,日志无报错 [\#637](https://github.com/overtrue/wechat/issues/637) - \[4.0\]黑名单管理 [\#538](https://github.com/overtrue/wechat/issues/538) **Merged pull requests:** - optimizes [\#652](https://github.com/overtrue/wechat/pull/652) ([mingyoung](https://github.com/mingyoung)) ## [3.3.0](https://github.com/overtrue/wechat/tree/3.3.0) (2017-04-13) [Full Changelog](https://github.com/overtrue/wechat/compare/3.2.7...3.3.0) **Closed issues:** - 微信接口获取openid是怎么排序的? [\#650](https://github.com/overtrue/wechat/issues/650) - 缺少网页扫码支付接口 [\#647](https://github.com/overtrue/wechat/issues/647) - 微信下的单的默认过期时间是多少啊 [\#645](https://github.com/overtrue/wechat/issues/645) - 在获取用户信息是出错 [\#643](https://github.com/overtrue/wechat/issues/643) - 调用$app =app\('wechat'\);时报错Use of undefined constant CURLOPT\_IPRESOLVE - assumed 'CURLOPT\_IPRESOLVE' [\#633](https://github.com/overtrue/wechat/issues/633) - 提示找不到EasyWeChat\Server\Guard::setRequest\(\)方法 [\#626](https://github.com/overtrue/wechat/issues/626) - 开放平台接收ComponentVerifyTicket,会出现Undefined index: FromUserName [\#623](https://github.com/overtrue/wechat/issues/623) - 美国移动网络获取不到accessToken [\#610](https://github.com/overtrue/wechat/issues/610) - 开放平台 APP 微信登录 [\#604](https://github.com/overtrue/wechat/issues/604) **Merged pull requests:** - Merge from open-platform branch. [\#651](https://github.com/overtrue/wechat/pull/651) ([mingyoung](https://github.com/mingyoung)) - Update code for open-platform [\#649](https://github.com/overtrue/wechat/pull/649) ([mingyoung](https://github.com/mingyoung)) - Code cleanup & refactoring. [\#646](https://github.com/overtrue/wechat/pull/646) ([mingyoung](https://github.com/mingyoung)) - support cash coupon [\#642](https://github.com/overtrue/wechat/pull/642) ([HanSon](https://github.com/HanSon)) - ♻️ All tests have been namespaced. [\#641](https://github.com/overtrue/wechat/pull/641) ([mingyoung](https://github.com/mingyoung)) - tweak code. [\#640](https://github.com/overtrue/wechat/pull/640) ([mingyoung](https://github.com/mingyoung)) - modify oauth property [\#639](https://github.com/overtrue/wechat/pull/639) ([jekst](https://github.com/jekst)) - Apply fixes from StyleCI [\#635](https://github.com/overtrue/wechat/pull/635) ([overtrue](https://github.com/overtrue)) - ✨ Blacklist. [\#634](https://github.com/overtrue/wechat/pull/634) ([mingyoung](https://github.com/mingyoung)) - 🔨 Refactoring for mini-program. [\#632](https://github.com/overtrue/wechat/pull/632) ([mingyoung](https://github.com/mingyoung)) ## [3.2.7](https://github.com/overtrue/wechat/tree/3.2.7) (2017-03-31) [Full Changelog](https://github.com/overtrue/wechat/compare/3.2.6...3.2.7) **Closed issues:** - 不管哪个公众号,只要填写 这个接口地址,都能配置或应用成功,实际上是不成功的,不到怎么找错。。 [\#611](https://github.com/overtrue/wechat/issues/611) **Merged pull requests:** - 修复一个创建卡券时的 bug, 添加获取微信门店类目表的api [\#631](https://github.com/overtrue/wechat/pull/631) ([Hexor](https://github.com/Hexor)) ## [3.2.6](https://github.com/overtrue/wechat/tree/3.2.6) (2017-03-31) [Full Changelog](https://github.com/overtrue/wechat/compare/3.2.5...3.2.6) **Closed issues:** - 我想大量发模板消息,但send每次都等待返回太慢,有啥解决办法吗? [\#630](https://github.com/overtrue/wechat/issues/630) - 3.2开放平台缺少authorizer\_token和authorization [\#629](https://github.com/overtrue/wechat/issues/629) - 微信开发平台接受消息报Invalid request signature bug [\#625](https://github.com/overtrue/wechat/issues/625) - 图文上传thumb\_media\_id 返回 {"errcode":40007,"errmsg":"invalid media\_id hint: \[\]"} [\#622](https://github.com/overtrue/wechat/issues/622) - Encryptor基类hack导致小程序的sessionKey base64\_decode失败 [\#614](https://github.com/overtrue/wechat/issues/614) - 是否有 2.1 升级到最新版的方案? [\#609](https://github.com/overtrue/wechat/issues/609) - laravel5.3 安装 "overtrue/wechat:~3.1 失败 [\#607](https://github.com/overtrue/wechat/issues/607) - overtrue/wechat和phpdoc包依赖冲突。 [\#605](https://github.com/overtrue/wechat/issues/605) - \[bug\]2个问题 [\#597](https://github.com/overtrue/wechat/issues/597) - 微信第三方平台开发是否只做了一部分? [\#594](https://github.com/overtrue/wechat/issues/594) - \[4.0\] ServiceProvider 移动到各自模块里 [\#588](https://github.com/overtrue/wechat/issues/588) - Cannot use EasyWeChat\OpenPlatform\Traits\VerifyTicket as VerifyTicket because the name is already in use [\#579](https://github.com/overtrue/wechat/issues/579) - 授权state值怎么设置 [\#573](https://github.com/overtrue/wechat/issues/573) - mini\_app get jscode problem, report appid & secret value is null [\#569](https://github.com/overtrue/wechat/issues/569) - 小程序生成二维码问题 [\#568](https://github.com/overtrue/wechat/issues/568) **Merged pull requests:** - Update OpenPlatform AppId [\#624](https://github.com/overtrue/wechat/pull/624) ([jeftom](https://github.com/jeftom)) - Apply fixes from StyleCI [\#621](https://github.com/overtrue/wechat/pull/621) ([overtrue](https://github.com/overtrue)) - Apply fixes from StyleCI [\#618](https://github.com/overtrue/wechat/pull/618) ([overtrue](https://github.com/overtrue)) - Compatible with php5.5 [\#617](https://github.com/overtrue/wechat/pull/617) ([mingyoung](https://github.com/mingyoung)) - Make the testcase works. [\#616](https://github.com/overtrue/wechat/pull/616) ([mingyoung](https://github.com/mingyoung)) - Fix mini-program decryptor [\#615](https://github.com/overtrue/wechat/pull/615) ([mingyoung](https://github.com/mingyoung)) - Missing message handling [\#613](https://github.com/overtrue/wechat/pull/613) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#612](https://github.com/overtrue/wechat/pull/612) ([overtrue](https://github.com/overtrue)) - 添加卡券创建二维码接口 [\#608](https://github.com/overtrue/wechat/pull/608) ([forecho](https://github.com/forecho)) - 开放平台大幅重构并且添加测试 [\#606](https://github.com/overtrue/wechat/pull/606) ([tsunamilx](https://github.com/tsunamilx)) - Update MessageBuilder.php [\#603](https://github.com/overtrue/wechat/pull/603) ([U2Fsd](https://github.com/U2Fsd)) - 生成 js添加到卡包接口 增加fixed\_begintimestamp、outer\_str字段 [\#602](https://github.com/overtrue/wechat/pull/602) ([gychg](https://github.com/gychg)) - tests for speed [\#600](https://github.com/overtrue/wechat/pull/600) ([mingyoung](https://github.com/mingyoung)) - Update test files [\#599](https://github.com/overtrue/wechat/pull/599) ([mingyoung](https://github.com/mingyoung)) - 允许自定义ticket缓存key [\#598](https://github.com/overtrue/wechat/pull/598) ([XiaoLer](https://github.com/XiaoLer)) - delete top color [\#595](https://github.com/overtrue/wechat/pull/595) ([HanSon](https://github.com/HanSon)) - Add payment scan notify handler [\#593](https://github.com/overtrue/wechat/pull/593) ([acgrid](https://github.com/acgrid)) - Apply fixes from StyleCI [\#591](https://github.com/overtrue/wechat/pull/591) ([overtrue](https://github.com/overtrue)) - Upgrade packages version to 4.0 [\#590](https://github.com/overtrue/wechat/pull/590) ([reatang](https://github.com/reatang)) - Move providers to module dir. \#588 [\#589](https://github.com/overtrue/wechat/pull/589) ([overtrue](https://github.com/overtrue)) - 把OpenPlatform中的组件依赖解耦 [\#581](https://github.com/overtrue/wechat/pull/581) ([reatang](https://github.com/reatang)) ## [3.2.5](https://github.com/overtrue/wechat/tree/3.2.5) (2017-02-04) [Full Changelog](https://github.com/overtrue/wechat/compare/3.2.4...3.2.5) **Merged pull requests:** - fix naming [\#580](https://github.com/overtrue/wechat/pull/580) ([mingyoung](https://github.com/mingyoung)) - Allow client code configure its own GuzzleHTTP handler [\#578](https://github.com/overtrue/wechat/pull/578) ([acgrid](https://github.com/acgrid)) ## [3.2.4](https://github.com/overtrue/wechat/tree/3.2.4) (2017-01-24) [Full Changelog](https://github.com/overtrue/wechat/compare/3.2.3...3.2.4) **Closed issues:** - 如何在其他框架下使用$app-\>payment-\>handleNotify [\#574](https://github.com/overtrue/wechat/issues/574) - 前后端分离单页下获取的config,认证失败 [\#565](https://github.com/overtrue/wechat/issues/565) - 支付签名错误 [\#563](https://github.com/overtrue/wechat/issues/563) **Merged pull requests:** - Update Authorizer.php [\#577](https://github.com/overtrue/wechat/pull/577) ([ww380459000](https://github.com/ww380459000)) - 补全通用卡接口 [\#575](https://github.com/overtrue/wechat/pull/575) ([XiaoLer](https://github.com/XiaoLer)) - require ext-SimpleXML [\#572](https://github.com/overtrue/wechat/pull/572) ([garveen](https://github.com/garveen)) - fix README Contribution link [\#571](https://github.com/overtrue/wechat/pull/571) ([zhwei](https://github.com/zhwei)) - Add user data decryption. [\#570](https://github.com/overtrue/wechat/pull/570) ([mingyoung](https://github.com/mingyoung)) - change request parameter [\#567](https://github.com/overtrue/wechat/pull/567) ([cloudsthere](https://github.com/cloudsthere)) - 完善小程序代码 [\#566](https://github.com/overtrue/wechat/pull/566) ([mingyoung](https://github.com/mingyoung)) - 添加小程序支持 [\#564](https://github.com/overtrue/wechat/pull/564) ([mingyoung](https://github.com/mingyoung)) ## [3.2.3](https://github.com/overtrue/wechat/tree/3.2.3) (2017-01-04) [Full Changelog](https://github.com/overtrue/wechat/compare/3.2.2...3.2.3) **Closed issues:** - 文档里的自定义菜单中,group\_id是否为tag\_id的误写? [\#561](https://github.com/overtrue/wechat/issues/561) - Open Platform有简明的使用文档吗?3ks [\#560](https://github.com/overtrue/wechat/issues/560) - 刷新access\_token有效期,未发现有相关的封装 [\#540](https://github.com/overtrue/wechat/issues/540) **Merged pull requests:** - Update Card.php [\#562](https://github.com/overtrue/wechat/pull/562) ([XiaoLer](https://github.com/XiaoLer)) - Apply fixes from StyleCI [\#559](https://github.com/overtrue/wechat/pull/559) ([overtrue](https://github.com/overtrue)) - Update API.php [\#558](https://github.com/overtrue/wechat/pull/558) ([drogjh](https://github.com/drogjh)) - optimized code [\#557](https://github.com/overtrue/wechat/pull/557) ([mingyoung](https://github.com/mingyoung)) ## [3.2.2](https://github.com/overtrue/wechat/tree/3.2.2) (2016-12-27) [Full Changelog](https://github.com/overtrue/wechat/compare/3.2.1...3.2.2) **Closed issues:** - How to get authorize url? [\#555](https://github.com/overtrue/wechat/issues/555) **Merged pull requests:** - fixed downloadBill method result [\#556](https://github.com/overtrue/wechat/pull/556) ([hidehalo](https://github.com/hidehalo)) - add config:log.permission for monolog [\#554](https://github.com/overtrue/wechat/pull/554) ([woshizoufeng](https://github.com/woshizoufeng)) - Improve open platform support. [\#553](https://github.com/overtrue/wechat/pull/553) ([mingyoung](https://github.com/mingyoung)) - Improve. [\#552](https://github.com/overtrue/wechat/pull/552) ([mingyoung](https://github.com/mingyoung)) - add $forceRefresh param to js-\>ticket\(\) method [\#551](https://github.com/overtrue/wechat/pull/551) ([leo108](https://github.com/leo108)) ## [3.2.1](https://github.com/overtrue/wechat/tree/3.2.1) (2016-12-20) [Full Changelog](https://github.com/overtrue/wechat/compare/3.2.0...3.2.1) **Merged pull requests:** - 增加小程序用jscode获取用户信息的接口 [\#550](https://github.com/overtrue/wechat/pull/550) ([soone](https://github.com/soone)) ## [3.2.0](https://github.com/overtrue/wechat/tree/3.2.0) (2016-12-19) [Full Changelog](https://github.com/overtrue/wechat/compare/3.1.9...3.2.0) **Closed issues:** - 喵喵喵 [\#545](https://github.com/overtrue/wechat/issues/545) - HttpException with uploadArticle API [\#544](https://github.com/overtrue/wechat/issues/544) - 是否有接入小程序的计划 [\#543](https://github.com/overtrue/wechat/issues/543) - "Call to undefined method Overtrue\Socialite\Providers\WeChat Provider::driver\(\) [\#536](https://github.com/overtrue/wechat/issues/536) - 服务端Server模块回复音乐消息出错 [\#533](https://github.com/overtrue/wechat/issues/533) - 用户授权出现The key "access\_token" could not be empty [\#527](https://github.com/overtrue/wechat/issues/527) **Merged pull requests:** - Apply fixes from StyleCI [\#549](https://github.com/overtrue/wechat/pull/549) ([overtrue](https://github.com/overtrue)) - 添加摇一摇周边模块 [\#548](https://github.com/overtrue/wechat/pull/548) ([allen05ren](https://github.com/allen05ren)) - Make some compatible. [\#542](https://github.com/overtrue/wechat/pull/542) ([mingyoung](https://github.com/mingyoung)) - Apply fixes from StyleCI [\#541](https://github.com/overtrue/wechat/pull/541) ([overtrue](https://github.com/overtrue)) - 改变了http 中 json 方法的接口, 从而支持 添加 添加 query参数 [\#539](https://github.com/overtrue/wechat/pull/539) ([shoaly](https://github.com/shoaly)) - 提交 [\#537](https://github.com/overtrue/wechat/pull/537) ([shoaly](https://github.com/shoaly)) - Apply fixes from StyleCI [\#535](https://github.com/overtrue/wechat/pull/535) ([overtrue](https://github.com/overtrue)) ## [3.1.9](https://github.com/overtrue/wechat/tree/3.1.9) (2016-12-01) [Full Changelog](https://github.com/overtrue/wechat/compare/3.1.8...3.1.9) **Closed issues:** - 还是不懂怎么获取unionid [\#531](https://github.com/overtrue/wechat/issues/531) - Scope 参数错误或没有 Scope 权限 [\#528](https://github.com/overtrue/wechat/issues/528) - $\_SERVER\['SERVER\_ADDR'\] 在mac php7中获取不到 [\#520](https://github.com/overtrue/wechat/issues/520) - 能否永久素材其他类型封装个download方法,跟临时一样 [\#505](https://github.com/overtrue/wechat/issues/505) - V3.1 JSSDK使用疑惑 [\#503](https://github.com/overtrue/wechat/issues/503) - 如何加入QQ群 [\#501](https://github.com/overtrue/wechat/issues/501) - 能否在下一个版本把企业的相关接口整合集成进去 [\#496](https://github.com/overtrue/wechat/issues/496) - 既然使用了monolog,那么在Application::initializeLogger只使用了文件流的特定形式来记录日志是否合理? [\#494](https://github.com/overtrue/wechat/issues/494) - configForShareAddress [\#482](https://github.com/overtrue/wechat/issues/482) - 更新微信文章的时候MatialEasyWeChat\Material,如果设置了show\_pic\_cover和content\_source\_url不会生效 [\#470](https://github.com/overtrue/wechat/issues/470) - 请问 SDK 是否支持授权接入的公众号接口调用? [\#438](https://github.com/overtrue/wechat/issues/438) - 通过unionid发送信息。 [\#411](https://github.com/overtrue/wechat/issues/411) - 【新增】设备管理 [\#77](https://github.com/overtrue/wechat/issues/77) **Merged pull requests:** - Add support wechat open platform. [\#532](https://github.com/overtrue/wechat/pull/532) ([mingyoung](https://github.com/mingyoung)) - Applied fixes from StyleCI [\#530](https://github.com/overtrue/wechat/pull/530) ([overtrue](https://github.com/overtrue)) - 新增硬件设备api [\#529](https://github.com/overtrue/wechat/pull/529) ([soone](https://github.com/soone)) ## [3.1.8](https://github.com/overtrue/wechat/tree/3.1.8) (2016-11-23) [Full Changelog](https://github.com/overtrue/wechat/compare/3.1.7...3.1.8) **Closed issues:** - SCAN 事件会出现无法提供服务 [\#525](https://github.com/overtrue/wechat/issues/525) ## [3.1.7](https://github.com/overtrue/wechat/tree/3.1.7) (2016-10-26) [Full Changelog](https://github.com/overtrue/wechat/compare/3.1.6...3.1.7) **Closed issues:** - preg\_replace unicode 的兼容问题 [\#515](https://github.com/overtrue/wechat/issues/515) **Merged pull requests:** - support psr-http-message-bridge 1.0 [\#524](https://github.com/overtrue/wechat/pull/524) ([wppd](https://github.com/wppd)) - Applied fixes from StyleCI [\#523](https://github.com/overtrue/wechat/pull/523) ([overtrue](https://github.com/overtrue)) - for \#520 [\#522](https://github.com/overtrue/wechat/pull/522) ([jinchun](https://github.com/jinchun)) ## [3.1.6](https://github.com/overtrue/wechat/tree/3.1.6) (2016-10-19) [Full Changelog](https://github.com/overtrue/wechat/compare/3.1.5...3.1.6) **Closed issues:** - PHP Fatal error: Uncaught HttpException [\#517](https://github.com/overtrue/wechat/issues/517) - 微信支付回调出错 [\#514](https://github.com/overtrue/wechat/issues/514) **Merged pull requests:** - Fix xml preg replace [\#519](https://github.com/overtrue/wechat/pull/519) ([springjk](https://github.com/springjk)) - fix the DOC [\#518](https://github.com/overtrue/wechat/pull/518) ([ac1982](https://github.com/ac1982)) ## [3.1.5](https://github.com/overtrue/wechat/tree/3.1.5) (2016-10-13) [Full Changelog](https://github.com/overtrue/wechat/compare/3.1.4...3.1.5) **Closed issues:** - wechat 在 larave l5.3 使用 passport 包下无法安装 [\#513](https://github.com/overtrue/wechat/issues/513) **Merged pull requests:** - Applied fixes from StyleCI [\#512](https://github.com/overtrue/wechat/pull/512) ([overtrue](https://github.com/overtrue)) ## [3.1.4](https://github.com/overtrue/wechat/tree/3.1.4) (2016-10-12) [Full Changelog](https://github.com/overtrue/wechat/compare/2.1.39...3.1.4) **Closed issues:** - 微信卡券特殊票券创建之后为什么无法更新卡券信息一致提示code非法。 [\#511](https://github.com/overtrue/wechat/issues/511) - 请添加 「退款方式」 参数 [\#509](https://github.com/overtrue/wechat/issues/509) - 2.1.40命名空间巨变引发的重大问题\(疑似提错版本了\) [\#508](https://github.com/overtrue/wechat/issues/508) - 卡券核销、查询建议 [\#506](https://github.com/overtrue/wechat/issues/506) - 支付重复回调问题 [\#504](https://github.com/overtrue/wechat/issues/504) **Merged pull requests:** - Changed method doc to the right accepted param type [\#510](https://github.com/overtrue/wechat/pull/510) ([marianoasselborn](https://github.com/marianoasselborn)) - 增加判断是否有人工客服帐号,避免出现无账号时候,头像为默认头像的情况 [\#502](https://github.com/overtrue/wechat/pull/502) ([hello2t](https://github.com/hello2t)) - Applied fixes from StyleCI [\#500](https://github.com/overtrue/wechat/pull/500) ([overtrue](https://github.com/overtrue)) - 为initializeLogger日志初始话函数添加判断分支 [\#499](https://github.com/overtrue/wechat/pull/499) ([403studio](https://github.com/403studio)) ## [2.1.39](https://github.com/overtrue/wechat/tree/2.1.39) (2016-09-05) [Full Changelog](https://github.com/overtrue/wechat/compare/2.1.41...2.1.39) ## [2.1.41](https://github.com/overtrue/wechat/tree/2.1.41) (2016-09-05) [Full Changelog](https://github.com/overtrue/wechat/compare/3.1.3...2.1.41) **Closed issues:** - 调用接口次数超过最大限制问题 [\#493](https://github.com/overtrue/wechat/issues/493) - 微信退款证书报错 Unable to set private key file [\#492](https://github.com/overtrue/wechat/issues/492) - 微信支付存在问题 [\#489](https://github.com/overtrue/wechat/issues/489) - 预支付下单 response body 为空 [\#488](https://github.com/overtrue/wechat/issues/488) - https check issue [\#486](https://github.com/overtrue/wechat/issues/486) **Merged pull requests:** - update composer.json [\#498](https://github.com/overtrue/wechat/pull/498) ([ac1982](https://github.com/ac1982)) - use openssl instead of mcrypt [\#497](https://github.com/overtrue/wechat/pull/497) ([ac1982](https://github.com/ac1982)) - 修复 with 方法带数据的问题 [\#491](https://github.com/overtrue/wechat/pull/491) ([XiaoLer](https://github.com/XiaoLer)) ## [3.1.3](https://github.com/overtrue/wechat/tree/3.1.3) (2016-08-08) [Full Changelog](https://github.com/overtrue/wechat/compare/3.1.2...3.1.3) **Closed issues:** - Laravel中写的最简单的例子在phpunit出错。 [\#485](https://github.com/overtrue/wechat/issues/485) - 微信的消息回复的FromUserName和ToUserName是不是对调了 [\#484](https://github.com/overtrue/wechat/issues/484) - 微信红包不能发给别的公众号的用户吗 [\#483](https://github.com/overtrue/wechat/issues/483) - 用户授权登录问题 [\#481](https://github.com/overtrue/wechat/issues/481) - cURL error 56: SSLRead\(\) return error -9806 [\#473](https://github.com/overtrue/wechat/issues/473) - 会员卡开卡字段文档有错误 [\#471](https://github.com/overtrue/wechat/issues/471) - Getting more done in GitHub with ZenHub [\#439](https://github.com/overtrue/wechat/issues/439) - 微信支付下单错误 [\#376](https://github.com/overtrue/wechat/issues/376) **Merged pull requests:** - update the File class to recognize pdf file. [\#480](https://github.com/overtrue/wechat/pull/480) ([ac1982](https://github.com/ac1982)) - update testActivateUserForm [\#478](https://github.com/overtrue/wechat/pull/478) ([wangniuniu](https://github.com/wangniuniu)) - Scrutinizer Auto-Fixes [\#477](https://github.com/overtrue/wechat/pull/477) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - Applied fixes from StyleCI [\#476](https://github.com/overtrue/wechat/pull/476) ([overtrue](https://github.com/overtrue)) - Scrutinizer Auto-Fixes [\#475](https://github.com/overtrue/wechat/pull/475) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - 开放自定义prefix和缓存键值方法 [\#474](https://github.com/overtrue/wechat/pull/474) ([XiaoLer](https://github.com/XiaoLer)) - Applied fixes from StyleCI [\#469](https://github.com/overtrue/wechat/pull/469) ([overtrue](https://github.com/overtrue)) - modify stats [\#468](https://github.com/overtrue/wechat/pull/468) ([wangniuniu](https://github.com/wangniuniu)) ## [3.1.2](https://github.com/overtrue/wechat/tree/3.1.2) (2016-07-21) [Full Changelog](https://github.com/overtrue/wechat/compare/2.1.38...3.1.2) **Closed issues:** - 素材管理中,上传图文下的上传图片,关于返回内容的差异 [\#466](https://github.com/overtrue/wechat/issues/466) - spbill\_create\_ip参数设置 [\#461](https://github.com/overtrue/wechat/issues/461) **Merged pull requests:** - 更新获取标签下粉丝列表方法 [\#467](https://github.com/overtrue/wechat/pull/467) ([dingdayu](https://github.com/dingdayu)) - Applied fixes from StyleCI [\#465](https://github.com/overtrue/wechat/pull/465) ([overtrue](https://github.com/overtrue)) - card module. [\#464](https://github.com/overtrue/wechat/pull/464) ([wangniuniu](https://github.com/wangniuniu)) - Applied fixes from StyleCI [\#463](https://github.com/overtrue/wechat/pull/463) ([overtrue](https://github.com/overtrue)) - Scrutinizer Auto-Fixes [\#462](https://github.com/overtrue/wechat/pull/462) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) ## [2.1.38](https://github.com/overtrue/wechat/tree/2.1.38) (2016-07-16) [Full Changelog](https://github.com/overtrue/wechat/compare/3.1.1...2.1.38) **Closed issues:** - 请问卡券管理功能整合上日程表了吗 [\#454](https://github.com/overtrue/wechat/issues/454) **Merged pull requests:** - Typo. [\#460](https://github.com/overtrue/wechat/pull/460) ([tianyong90](https://github.com/tianyong90)) - Applied fixes from StyleCI [\#459](https://github.com/overtrue/wechat/pull/459) ([overtrue](https://github.com/overtrue)) - add voice recognition [\#458](https://github.com/overtrue/wechat/pull/458) ([leniy](https://github.com/leniy)) - Applied fixes from StyleCI [\#457](https://github.com/overtrue/wechat/pull/457) ([overtrue](https://github.com/overtrue)) - Update API.php [\#456](https://github.com/overtrue/wechat/pull/456) ([marvin8212](https://github.com/marvin8212)) - Update XML.php [\#455](https://github.com/overtrue/wechat/pull/455) ([canon4ever](https://github.com/canon4ever)) ## [3.1.1](https://github.com/overtrue/wechat/tree/3.1.1) (2016-07-12) [Full Changelog](https://github.com/overtrue/wechat/compare/3.1.0...3.1.1) **Closed issues:** - 拿到code=CODE&state=STATE之后怎么拿到openid? [\#452](https://github.com/overtrue/wechat/issues/452) - 安装出错 [\#450](https://github.com/overtrue/wechat/issues/450) - 自定义菜单接口\(新版\)出错 [\#448](https://github.com/overtrue/wechat/issues/448) - h5上没法打开微信app授权界面 [\#447](https://github.com/overtrue/wechat/issues/447) - 重构卡券 [\#76](https://github.com/overtrue/wechat/issues/76) **Merged pull requests:** - typos. [\#453](https://github.com/overtrue/wechat/pull/453) ([tianye](https://github.com/tianye)) - edit readme.md [\#451](https://github.com/overtrue/wechat/pull/451) ([tianyong90](https://github.com/tianyong90)) - Add cache driver config. [\#449](https://github.com/overtrue/wechat/pull/449) ([dingdayu](https://github.com/dingdayu)) ## [3.1.0](https://github.com/overtrue/wechat/tree/3.1.0) (2016-06-28) [Full Changelog](https://github.com/overtrue/wechat/compare/3.0.21...3.1.0) **Merged pull requests:** - Applied fixes from StyleCI [\#446](https://github.com/overtrue/wechat/pull/446) ([overtrue](https://github.com/overtrue)) - New Staff API. [\#445](https://github.com/overtrue/wechat/pull/445) ([overtrue](https://github.com/overtrue)) - 2.1 [\#444](https://github.com/overtrue/wechat/pull/444) ([dongnanyanhai](https://github.com/dongnanyanhai)) - Fix path. [\#443](https://github.com/overtrue/wechat/pull/443) ([overtrue](https://github.com/overtrue)) ## [3.0.21](https://github.com/overtrue/wechat/tree/3.0.21) (2016-06-17) [Full Changelog](https://github.com/overtrue/wechat/compare/3.0.1...3.0.21) **Closed issues:** - scan出现公众号暂时无法服务的消息 [\#436](https://github.com/overtrue/wechat/issues/436) - scan出现公众号暂时无法服务的消息 [\#435](https://github.com/overtrue/wechat/issues/435) - 用户标签接口无法使用 [\#433](https://github.com/overtrue/wechat/issues/433) - WeChatProvider下的getAuthUrl个人觉得应该暴露出来 [\#432](https://github.com/overtrue/wechat/issues/432) - 支持二维码扫描进入公众号推送的SCAN事件 [\#431](https://github.com/overtrue/wechat/issues/431) - \[3.0\] EasyWeChat\Support\XML::parse方法会将空节点解析为空数组,而不是空字符串 [\#426](https://github.com/overtrue/wechat/issues/426) - 下载二维码, $qrcode-\>download\($ticket,$paths\); 目录参数不可加入 中文 [\#420](https://github.com/overtrue/wechat/issues/420) - \[help want\]Is hard to change default configuration of GuzzleHttp [\#415](https://github.com/overtrue/wechat/issues/415) - PHP7.0 curl\_setopt 设置问题 [\#413](https://github.com/overtrue/wechat/issues/413) - 无法通知微信支付完成 [\#412](https://github.com/overtrue/wechat/issues/412) - 如何获取用户的unionid? [\#407](https://github.com/overtrue/wechat/issues/407) - 是否支持多框架 [\#406](https://github.com/overtrue/wechat/issues/406) - fuckTheWeChatInvalidJSON [\#405](https://github.com/overtrue/wechat/issues/405) - Class 'GuzzleHttp\Middleware' not found [\#404](https://github.com/overtrue/wechat/issues/404) - 支付统一下单接口签名错误 [\#402](https://github.com/overtrue/wechat/issues/402) - payment里没有configForJSSDKPayment方法 [\#401](https://github.com/overtrue/wechat/issues/401) - 查询支付的地址多了一个空格,导致查询失败,去掉最后的那个空格后就好了 [\#393](https://github.com/overtrue/wechat/issues/393) - 网页授权过不了 [\#392](https://github.com/overtrue/wechat/issues/392) - 微信AccessToken被动更新可能会有并发更新的情况出现 [\#390](https://github.com/overtrue/wechat/issues/390) - 临时素材下载,文件名和扩展名之间会有2个\[.\] [\#389](https://github.com/overtrue/wechat/issues/389) - 有一个地方变量名对不上 [\#380](https://github.com/overtrue/wechat/issues/380) - 自定义缓存 [\#379](https://github.com/overtrue/wechat/issues/379) - https://easywechat.org/ 底部 “开始使用” url拼错 [\#378](https://github.com/overtrue/wechat/issues/378) - 在server.php里面调用yii的model,一直报错 [\#375](https://github.com/overtrue/wechat/issues/375) - overture/wechat 2.1.36\(客服消息转发错误\) [\#374](https://github.com/overtrue/wechat/issues/374) - 建议支持开发模式下禁用验证 [\#373](https://github.com/overtrue/wechat/issues/373) - https://easywechat.org/ 导航 首页 about:blank [\#370](https://github.com/overtrue/wechat/issues/370) - laravel 下session问题 [\#369](https://github.com/overtrue/wechat/issues/369) - 关于Access——toekn [\#368](https://github.com/overtrue/wechat/issues/368) - 返回支付页面时报错:"access\_token" could not be empty [\#367](https://github.com/overtrue/wechat/issues/367) - xampp下js-\>config报错 [\#366](https://github.com/overtrue/wechat/issues/366) - 官方文档有误 [\#360](https://github.com/overtrue/wechat/issues/360) - \[BUG\] 微信收货地址无法成功 [\#359](https://github.com/overtrue/wechat/issues/359) - 无法获取 $message-\>ScanCodeInfo-\>ScanType 对象 [\#358](https://github.com/overtrue/wechat/issues/358) - \[Bugs\] 项目文档首页跳转问题 [\#357](https://github.com/overtrue/wechat/issues/357) - Business和UnifiedOrder没有定义 [\#356](https://github.com/overtrue/wechat/issues/356) - 你的网站访问不了。。。。https://easywechat.org/ [\#352](https://github.com/overtrue/wechat/issues/352) - 连续多次执行微信支付退款报错 [\#348](https://github.com/overtrue/wechat/issues/348) - 客服操作 都是 -1 错误 [\#344](https://github.com/overtrue/wechat/issues/344) - 请使用openssl 而不是不安全的mcrypt来加密 [\#342](https://github.com/overtrue/wechat/issues/342) - 文本类型的通知消息 [\#341](https://github.com/overtrue/wechat/issues/341) - 服务器配置https 并且 通过阿里云 https cdn之后, 会出现 https 判断语句失效 [\#338](https://github.com/overtrue/wechat/issues/338) - 作者请问者个sdk支持企业号吗? [\#336](https://github.com/overtrue/wechat/issues/336) - laravel 5.1引入包报错 [\#331](https://github.com/overtrue/wechat/issues/331) - 申请退款有问题 [\#328](https://github.com/overtrue/wechat/issues/328) - 订单相关接口bug [\#327](https://github.com/overtrue/wechat/issues/327) - 临时素材接口无法使用 [\#319](https://github.com/overtrue/wechat/issues/319) - 使用sendNormal\(\),sendGroup\(\)发送红包时,报Undefined index: HTTP\_CLIENT\_IP [\#316](https://github.com/overtrue/wechat/issues/316) - v3中微信卡券功能缺失? [\#307](https://github.com/overtrue/wechat/issues/307) - 测试 [\#305](https://github.com/overtrue/wechat/issues/305) - \[3.0\] 永久素材上传视频无法上传问题 [\#304](https://github.com/overtrue/wechat/issues/304) - Cannot destroy active lambda function [\#296](https://github.com/overtrue/wechat/issues/296) - 微信支付-》企业付款也可以增加个类上去,跟企业红包类似 [\#232](https://github.com/overtrue/wechat/issues/232) **Merged pull requests:** - Applied fixes from StyleCI [\#442](https://github.com/overtrue/wechat/pull/442) ([overtrue](https://github.com/overtrue)) - NGINX HTTPS无法签名 [\#441](https://github.com/overtrue/wechat/pull/441) ([ares333](https://github.com/ares333)) - Develop [\#440](https://github.com/overtrue/wechat/pull/440) ([overtrue](https://github.com/overtrue)) - Develop [\#437](https://github.com/overtrue/wechat/pull/437) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#434](https://github.com/overtrue/wechat/pull/434) ([overtrue](https://github.com/overtrue)) - 修改错误提示信息,方便跟踪错误 [\#430](https://github.com/overtrue/wechat/pull/430) ([zerozh](https://github.com/zerozh)) - Develop [\#429](https://github.com/overtrue/wechat/pull/429) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#428](https://github.com/overtrue/wechat/pull/428) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#427](https://github.com/overtrue/wechat/pull/427) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#425](https://github.com/overtrue/wechat/pull/425) ([overtrue](https://github.com/overtrue)) - update annotation [\#424](https://github.com/overtrue/wechat/pull/424) ([lilocon](https://github.com/lilocon)) - Develop [\#421](https://github.com/overtrue/wechat/pull/421) ([overtrue](https://github.com/overtrue)) - Set default timeout. [\#419](https://github.com/overtrue/wechat/pull/419) ([overtrue](https://github.com/overtrue)) - Develop [\#418](https://github.com/overtrue/wechat/pull/418) ([overtrue](https://github.com/overtrue)) - Develop [\#416](https://github.com/overtrue/wechat/pull/416) ([overtrue](https://github.com/overtrue)) - better implementation for prepare oauth callback url [\#414](https://github.com/overtrue/wechat/pull/414) ([lichunqiang](https://github.com/lichunqiang)) - Develop [\#410](https://github.com/overtrue/wechat/pull/410) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#409](https://github.com/overtrue/wechat/pull/409) ([overtrue](https://github.com/overtrue)) - 增加微信支付服务商支持 [\#408](https://github.com/overtrue/wechat/pull/408) ([takatost](https://github.com/takatost)) - Develop [\#403](https://github.com/overtrue/wechat/pull/403) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#400](https://github.com/overtrue/wechat/pull/400) ([overtrue](https://github.com/overtrue)) - Scrutinizer Auto-Fixes [\#399](https://github.com/overtrue/wechat/pull/399) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - Develop [\#398](https://github.com/overtrue/wechat/pull/398) ([overtrue](https://github.com/overtrue)) - Develop [\#397](https://github.com/overtrue/wechat/pull/397) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#396](https://github.com/overtrue/wechat/pull/396) ([overtrue](https://github.com/overtrue)) - Typo & Improve code. [\#395](https://github.com/overtrue/wechat/pull/395) ([jinchun](https://github.com/jinchun)) - Develop [\#394](https://github.com/overtrue/wechat/pull/394) ([overtrue](https://github.com/overtrue)) - Bugfix close \#389 [\#391](https://github.com/overtrue/wechat/pull/391) ([overtrue](https://github.com/overtrue)) - Update NoticeNoticeTest.php [\#388](https://github.com/overtrue/wechat/pull/388) ([xiabeifeng](https://github.com/xiabeifeng)) - Update Notice.php [\#387](https://github.com/overtrue/wechat/pull/387) ([xiabeifeng](https://github.com/xiabeifeng)) - Tests for \#384 [\#386](https://github.com/overtrue/wechat/pull/386) ([xiabeifeng](https://github.com/xiabeifeng)) - Improve Notice API. [\#384](https://github.com/overtrue/wechat/pull/384) ([xiabeifeng](https://github.com/xiabeifeng)) - 对应根 版本依赖 [\#382](https://github.com/overtrue/wechat/pull/382) ([parkshinhye](https://github.com/parkshinhye)) - Develop [\#381](https://github.com/overtrue/wechat/pull/381) ([overtrue](https://github.com/overtrue)) - Develop [\#377](https://github.com/overtrue/wechat/pull/377) ([overtrue](https://github.com/overtrue)) - Fix test for \#371 [\#372](https://github.com/overtrue/wechat/pull/372) ([overtrue](https://github.com/overtrue)) - 刷卡支付不需要notify\_url参数 [\#371](https://github.com/overtrue/wechat/pull/371) ([lilocon](https://github.com/lilocon)) - Applied fixes from StyleCI [\#365](https://github.com/overtrue/wechat/pull/365) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#364](https://github.com/overtrue/wechat/pull/364) ([overtrue](https://github.com/overtrue)) - Merge Develop [\#363](https://github.com/overtrue/wechat/pull/363) ([overtrue](https://github.com/overtrue)) - Update composer.json [\#361](https://github.com/overtrue/wechat/pull/361) ([jaychan](https://github.com/jaychan)) - Applied fixes from StyleCI [\#355](https://github.com/overtrue/wechat/pull/355) ([overtrue](https://github.com/overtrue)) - \[ci skip\]fix document typo [\#354](https://github.com/overtrue/wechat/pull/354) ([lichunqiang](https://github.com/lichunqiang)) - 自定义Logger [\#353](https://github.com/overtrue/wechat/pull/353) ([lilocon](https://github.com/lilocon)) - Update Refund.php [\#351](https://github.com/overtrue/wechat/pull/351) ([jaring](https://github.com/jaring)) - Applied fixes from StyleCI [\#350](https://github.com/overtrue/wechat/pull/350) ([overtrue](https://github.com/overtrue)) - OpenSSL bugfix. [\#349](https://github.com/overtrue/wechat/pull/349) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#347](https://github.com/overtrue/wechat/pull/347) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#346](https://github.com/overtrue/wechat/pull/346) ([overtrue](https://github.com/overtrue)) - Merge Develop [\#345](https://github.com/overtrue/wechat/pull/345) ([overtrue](https://github.com/overtrue)) - 添加代码提示 [\#343](https://github.com/overtrue/wechat/pull/343) ([lilocon](https://github.com/lilocon)) - Applied fixes from StyleCI [\#340](https://github.com/overtrue/wechat/pull/340) ([overtrue](https://github.com/overtrue)) - Fix bug: Payment::downloadBill\(\) response error. [\#339](https://github.com/overtrue/wechat/pull/339) ([overtrue](https://github.com/overtrue)) - change get\_client\_ip to get\_server\_ip [\#335](https://github.com/overtrue/wechat/pull/335) ([tianyong90](https://github.com/tianyong90)) - Payment SSL. [\#334](https://github.com/overtrue/wechat/pull/334) ([overtrue](https://github.com/overtrue)) - Add a helper to get correct client ip address. fixed \#316 [\#333](https://github.com/overtrue/wechat/pull/333) ([tianyong90](https://github.com/tianyong90)) - Dependency Bugfix. overtrue/laravel-wechat\#24 [\#332](https://github.com/overtrue/wechat/pull/332) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#330](https://github.com/overtrue/wechat/pull/330) ([overtrue](https://github.com/overtrue)) - Merge Develop [\#329](https://github.com/overtrue/wechat/pull/329) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#326](https://github.com/overtrue/wechat/pull/326) ([overtrue](https://github.com/overtrue)) - Add order default notify\_url. [\#325](https://github.com/overtrue/wechat/pull/325) ([foreverglory](https://github.com/foreverglory)) - Revert "Applied fixes from StyleCI" [\#323](https://github.com/overtrue/wechat/pull/323) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#322](https://github.com/overtrue/wechat/pull/322) ([overtrue](https://github.com/overtrue)) - Develop [\#321](https://github.com/overtrue/wechat/pull/321) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#320](https://github.com/overtrue/wechat/pull/320) ([overtrue](https://github.com/overtrue)) - 模板消息添加【 获取模板列表】和【 删除模板】接口 [\#318](https://github.com/overtrue/wechat/pull/318) ([forecho](https://github.com/forecho)) - Applied fixes from StyleCI [\#314](https://github.com/overtrue/wechat/pull/314) ([overtrue](https://github.com/overtrue)) - fix Temporary upload bug [\#313](https://github.com/overtrue/wechat/pull/313) ([mani95lisa](https://github.com/mani95lisa)) - Applied fixes from StyleCI [\#312](https://github.com/overtrue/wechat/pull/312) ([overtrue](https://github.com/overtrue)) - MerchantPay Class [\#311](https://github.com/overtrue/wechat/pull/311) ([ac1982](https://github.com/ac1982)) - Applied fixes from StyleCI [\#309](https://github.com/overtrue/wechat/pull/309) ([overtrue](https://github.com/overtrue)) - Merge Develop [\#308](https://github.com/overtrue/wechat/pull/308) ([overtrue](https://github.com/overtrue)) - 删除裂变红包接口中的ip参数 [\#306](https://github.com/overtrue/wechat/pull/306) ([xjchengo](https://github.com/xjchengo)) - fix code style and some spelling mistakes [\#303](https://github.com/overtrue/wechat/pull/303) ([jinchun](https://github.com/jinchun)) - Merge Develop [\#302](https://github.com/overtrue/wechat/pull/302) ([overtrue](https://github.com/overtrue)) - Add method for app payment [\#301](https://github.com/overtrue/wechat/pull/301) ([lichunqiang](https://github.com/lichunqiang)) - Removed the return syntax [\#300](https://github.com/overtrue/wechat/pull/300) ([lichunqiang](https://github.com/lichunqiang)) - add return tag [\#299](https://github.com/overtrue/wechat/pull/299) ([lichunqiang](https://github.com/lichunqiang)) - Merge Develop [\#298](https://github.com/overtrue/wechat/pull/298) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#297](https://github.com/overtrue/wechat/pull/297) ([overtrue](https://github.com/overtrue)) - \[ci skip\]Update .gitattributes [\#295](https://github.com/overtrue/wechat/pull/295) ([lichunqiang](https://github.com/lichunqiang)) - Merge Develop [\#294](https://github.com/overtrue/wechat/pull/294) ([overtrue](https://github.com/overtrue)) ## [3.0.1](https://github.com/overtrue/wechat/tree/3.0.1) (2016-02-19) [Full Changelog](https://github.com/overtrue/wechat/compare/3.0...3.0.1) **Closed issues:** - composer 安装 3.0版本,报错如下: [\#291](https://github.com/overtrue/wechat/issues/291) - \[3.0\] 下载永久素材时,微信返回的Content-Type不正确,导致出错。 [\#290](https://github.com/overtrue/wechat/issues/290) - 挖个坑,自己跳 [\#147](https://github.com/overtrue/wechat/issues/147) **Merged pull requests:** - Applied fixes from StyleCI [\#293](https://github.com/overtrue/wechat/pull/293) ([overtrue](https://github.com/overtrue)) - Merge Develop [\#292](https://github.com/overtrue/wechat/pull/292) ([overtrue](https://github.com/overtrue)) ## [3.0](https://github.com/overtrue/wechat/tree/3.0) (2016-02-17) [Full Changelog](https://github.com/overtrue/wechat/compare/2.1.0...3.0) **Implemented enhancements:** - MIME json 格式检查优化 [\#49](https://github.com/overtrue/wechat/issues/49) - 获取 refresh\_token,access\_token [\#43](https://github.com/overtrue/wechat/issues/43) - 关于API\_TOKEN\_REFRESH [\#20](https://github.com/overtrue/wechat/issues/20) **Closed issues:** - \[3.0\] 无法获取用户分组信息 [\#285](https://github.com/overtrue/wechat/issues/285) - 新的laravel 5.2 不能兼容了 [\#284](https://github.com/overtrue/wechat/issues/284) - \[3.0\]Message/Article类的$properties内的source\_url没有正常转换为content\_source\_url. [\#281](https://github.com/overtrue/wechat/issues/281) - 3.0删除个性菜单失败 [\#280](https://github.com/overtrue/wechat/issues/280) - 也许你该给一个代码贡献规范 [\#277](https://github.com/overtrue/wechat/issues/277) - 3.0网页授权时scope为snsapi\_base得不到openid [\#276](https://github.com/overtrue/wechat/issues/276) - wechat3.0中 有2个地方的js调用参数不一样,超哥没有提供 [\#272](https://github.com/overtrue/wechat/issues/272) - 我想知道2.X和3.0有什么大的区别! [\#270](https://github.com/overtrue/wechat/issues/270) - 2.1: Link 消息类型没有实现 [\#269](https://github.com/overtrue/wechat/issues/269) - 关于模板消息换行的问题 [\#266](https://github.com/overtrue/wechat/issues/266) - easywechat Invalid request [\#265](https://github.com/overtrue/wechat/issues/265) - 40029不合法的oauth\_code [\#264](https://github.com/overtrue/wechat/issues/264) - 下载素材的一个小问题 [\#263](https://github.com/overtrue/wechat/issues/263) - \[2.1\] 微信自定义菜单结构变更导致`Menu::get\(\)` 无法读取个性化菜单 [\#262](https://github.com/overtrue/wechat/issues/262) - payment中是不是不包含H5和JS的生成配置文件的方法了? [\#261](https://github.com/overtrue/wechat/issues/261) - payment下prepare方法bug [\#260](https://github.com/overtrue/wechat/issues/260) - UserServiceProvider中似乎忘记注册user.group了 [\#256](https://github.com/overtrue/wechat/issues/256) - 2.1.X版媒体下载没有扩展名 [\#252](https://github.com/overtrue/wechat/issues/252) - 为什么所有的子模块在自己的库都是develop分支 [\#247](https://github.com/overtrue/wechat/issues/247) - 网页授权使用跳转的bug [\#246](https://github.com/overtrue/wechat/issues/246) - typo of variable [\#245](https://github.com/overtrue/wechat/issues/245) - The implementation class of ServerServiceProvider missing an important [\#244](https://github.com/overtrue/wechat/issues/244) - \[3.0\]\[payment\] 两个可能的bug [\#235](https://github.com/overtrue/wechat/issues/235) - 发送多图文 [\#233](https://github.com/overtrue/wechat/issues/233) - 自定义菜单返回应该把个性化自定义菜单也一起返回 [\#231](https://github.com/overtrue/wechat/issues/231) - 发送模板消息 CRUL 错误 [\#223](https://github.com/overtrue/wechat/issues/223) - 客服接口暂时测到有3个bug,麻烦修复 [\#222](https://github.com/overtrue/wechat/issues/222) - JSSDK access\_token missing [\#211](https://github.com/overtrue/wechat/issues/211) - Js.php/ticket [\#210](https://github.com/overtrue/wechat/issues/210) - 微信支付里有一个收货地址共享 ,超哥你这里没有,可以加一下不? [\#204](https://github.com/overtrue/wechat/issues/204) - 小问题 [\#203](https://github.com/overtrue/wechat/issues/203) - 网页授权 跳转 [\#202](https://github.com/overtrue/wechat/issues/202) - access token 重复添加的问题 [\#201](https://github.com/overtrue/wechat/issues/201) - authorize snsapi\_base 下可以获取unionid [\#198](https://github.com/overtrue/wechat/issues/198) - 网页授权 [\#189](https://github.com/overtrue/wechat/issues/189) - 一点建议 [\#188](https://github.com/overtrue/wechat/issues/188) - 接口更新-新增临时素材接口变动 [\#186](https://github.com/overtrue/wechat/issues/186) - 接入多个公众号不用id [\#185](https://github.com/overtrue/wechat/issues/185) - \[Insight\] Files should not be executable [\#184](https://github.com/overtrue/wechat/issues/184) - 建议不要写死Http [\#183](https://github.com/overtrue/wechat/issues/183) - laravel4.2安装不成功 [\#182](https://github.com/overtrue/wechat/issues/182) - 是否支持laravel4.2 [\#181](https://github.com/overtrue/wechat/issues/181) - 微信出个性化菜单了,希望支持 [\#180](https://github.com/overtrue/wechat/issues/180) - 3.0 composer依赖Symfony2.7。能不能支持Symfony3.0? [\#179](https://github.com/overtrue/wechat/issues/179) - 发送链接类消息错误 [\#175](https://github.com/overtrue/wechat/issues/175) - Throw Exception的时候 Intel server status 设置为200是不是好一些 [\#174](https://github.com/overtrue/wechat/issues/174) - 生成临时二维码时,返回EventKey不是传递的值 [\#173](https://github.com/overtrue/wechat/issues/173) - 关于素材获取的一个建议 [\#172](https://github.com/overtrue/wechat/issues/172) - 能否增加微信APP支付相关方法 [\#171](https://github.com/overtrue/wechat/issues/171) - 微信回调URL回调不到 [\#170](https://github.com/overtrue/wechat/issues/170) - 素材管理添加永久素材返回JSON/XML内容错误 [\#169](https://github.com/overtrue/wechat/issues/169) - \[消息的使用\] 中 \[上传素材文件\] 的文档示例貌似有误 [\#168](https://github.com/overtrue/wechat/issues/168) - 素材管理里的download方法不是很符合sdk一站式的解决. [\#165](https://github.com/overtrue/wechat/issues/165) - \[Wechat\]不合法的oauth\_code' in /src/Wechat/Http.php:124 [\#164](https://github.com/overtrue/wechat/issues/164) - AccessToken Expired Error Code [\#163](https://github.com/overtrue/wechat/issues/163) - 素材管理接口出错 [\#162](https://github.com/overtrue/wechat/issues/162) - 两处代码php5.4才能运行 [\#158](https://github.com/overtrue/wechat/issues/158) - extension is null when calling `download video` in wechat.media [\#157](https://github.com/overtrue/wechat/issues/157) - Payment/UnifiedOrder does not support serialize or create by array [\#155](https://github.com/overtrue/wechat/issues/155) - 没有找到"微信支付-\>查询订单"相关功能 [\#150](https://github.com/overtrue/wechat/issues/150) - 请教,Cache::setter中your\_custom\_set\_cache怎么使用 [\#149](https://github.com/overtrue/wechat/issues/149) - 发生异常时, 希望能把发送和接收的原始数据记录下来. [\#148](https://github.com/overtrue/wechat/issues/148) - 发送红包,证书错误 [\#144](https://github.com/overtrue/wechat/issues/144) - 发视频消息总返回 -1 [\#143](https://github.com/overtrue/wechat/issues/143) - 关于PHP版本 [\#141](https://github.com/overtrue/wechat/issues/141) - Server消息回复必须以事件方式吗? [\#140](https://github.com/overtrue/wechat/issues/140) - 微信支付相关文档细化 [\#138](https://github.com/overtrue/wechat/issues/138) - 好奇地问个问题,这项目的测试用例放在哪? [\#135](https://github.com/overtrue/wechat/issues/135) - 试了两次,真的不会用 [\#134](https://github.com/overtrue/wechat/issues/134) - 不知道这算不算是个BUG [\#133](https://github.com/overtrue/wechat/issues/133) - 微信小店 [\#130](https://github.com/overtrue/wechat/issues/130) - 多次遇到 accesstoken 无效的问题 [\#129](https://github.com/overtrue/wechat/issues/129) - MCH\_KEY 微信支付 [\#128](https://github.com/overtrue/wechat/issues/128) - 使用flightphp框架,验证URL的时候,在Apache下接入成功,在Nginx接入失败 [\#126](https://github.com/overtrue/wechat/issues/126) - 好东西!可惜没有我需要的微信红包 [\#125](https://github.com/overtrue/wechat/issues/125) - Cache存储部件可定制 [\#120](https://github.com/overtrue/wechat/issues/120) - 关于Bag [\#119](https://github.com/overtrue/wechat/issues/119) - 将代码部署到负载均衡上如何管理access token [\#118](https://github.com/overtrue/wechat/issues/118) - 消息接受和回复时,如果不对消息做回复,该如何做? [\#117](https://github.com/overtrue/wechat/issues/117) - 请教一个问题 [\#116](https://github.com/overtrue/wechat/issues/116) - 关于 Cache [\#115](https://github.com/overtrue/wechat/issues/115) - 如何才能获取普通的access\_token [\#113](https://github.com/overtrue/wechat/issues/113) - $HTTP\_RAW\_POST\_DATA DEPRECATED [\#111](https://github.com/overtrue/wechat/issues/111) - App支付缺少错误码 [\#109](https://github.com/overtrue/wechat/issues/109) - 当用户信息有 " 字符时系统出错 \(用户与用户组管理接口\) [\#107](https://github.com/overtrue/wechat/issues/107) - 提示错误 [\#106](https://github.com/overtrue/wechat/issues/106) - 使用企业号的时候 接入失败啊,在验证url的时候 [\#104](https://github.com/overtrue/wechat/issues/104) - 支付签名错误 [\#101](https://github.com/overtrue/wechat/issues/101) - 微信支付.$payment-\>getConfig\(\)调用时候\[Wechat\]系统繁忙,此时请开发者稍候再试. [\#96](https://github.com/overtrue/wechat/issues/96) - wechat/src/Wechat/Payment/UnifiedOrder.php 小问题 [\#94](https://github.com/overtrue/wechat/issues/94) - 请教laravel中如何在微信支付中 catch UnifiedOrder 抛出的异常? [\#93](https://github.com/overtrue/wechat/issues/93) - 是否可以增加一个第三方接口融合功能 [\#91](https://github.com/overtrue/wechat/issues/91) - 订单查询 [\#90](https://github.com/overtrue/wechat/issues/90) - 如何不下载图片,通过mediaId获取图片存储的URL [\#89](https://github.com/overtrue/wechat/issues/89) - 'Undefined index: HTTP\_HOST' [\#88](https://github.com/overtrue/wechat/issues/88) - Undefined index: HTTP\_HOST [\#87](https://github.com/overtrue/wechat/issues/87) - 不能上传gif格式的图片素材 [\#84](https://github.com/overtrue/wechat/issues/84) - OAuth重构 [\#74](https://github.com/overtrue/wechat/issues/74) - \[3.0\] Tasks [\#50](https://github.com/overtrue/wechat/issues/50) - appId 和 appSecret不要作为各个类的构造参数 [\#114](https://github.com/overtrue/wechat/issues/114) - 增加debug相关的选项 [\#112](https://github.com/overtrue/wechat/issues/112) - 好像没有获取自动回复数据接口 [\#108](https://github.com/overtrue/wechat/issues/108) - js端查看微信卡券接口 chooseCard [\#79](https://github.com/overtrue/wechat/issues/79) - 【新增】支付 [\#78](https://github.com/overtrue/wechat/issues/78) - 模板消息重构 [\#75](https://github.com/overtrue/wechat/issues/75) - 素材下载自动识别MIME生成后缀 [\#54](https://github.com/overtrue/wechat/issues/54) - \[建议\] 深度结合微信多图文与素材管理 [\#46](https://github.com/overtrue/wechat/issues/46) - 群发功能 [\#18](https://github.com/overtrue/wechat/issues/18) **Merged pull requests:** - 3.0 [\#289](https://github.com/overtrue/wechat/pull/289) ([overtrue](https://github.com/overtrue)) - Merge Develop [\#288](https://github.com/overtrue/wechat/pull/288) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#287](https://github.com/overtrue/wechat/pull/287) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#286](https://github.com/overtrue/wechat/pull/286) ([overtrue](https://github.com/overtrue)) - Fix bug in batchGet method. [\#283](https://github.com/overtrue/wechat/pull/283) ([tianyong90](https://github.com/tianyong90)) - Typo. [\#279](https://github.com/overtrue/wechat/pull/279) ([overtrue](https://github.com/overtrue)) - Add contribution guide. resolves \#277 [\#278](https://github.com/overtrue/wechat/pull/278) ([overtrue](https://github.com/overtrue)) - Develop [\#274](https://github.com/overtrue/wechat/pull/274) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#273](https://github.com/overtrue/wechat/pull/273) ([overtrue](https://github.com/overtrue)) - Develop [\#271](https://github.com/overtrue/wechat/pull/271) ([overtrue](https://github.com/overtrue)) - Merge Develop [\#268](https://github.com/overtrue/wechat/pull/268) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#267](https://github.com/overtrue/wechat/pull/267) ([overtrue](https://github.com/overtrue)) - Update QRCode.php [\#258](https://github.com/overtrue/wechat/pull/258) ([webshiyue](https://github.com/webshiyue)) - Add tests for LuckyMoney. [\#255](https://github.com/overtrue/wechat/pull/255) ([tianyong90](https://github.com/tianyong90)) - CS. [\#254](https://github.com/overtrue/wechat/pull/254) ([overtrue](https://github.com/overtrue)) - Scrutinizer Auto-Fixes [\#253](https://github.com/overtrue/wechat/pull/253) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - Applied fixes from StyleCI [\#251](https://github.com/overtrue/wechat/pull/251) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#250](https://github.com/overtrue/wechat/pull/250) ([overtrue](https://github.com/overtrue)) - Merge Develop [\#249](https://github.com/overtrue/wechat/pull/249) ([overtrue](https://github.com/overtrue)) - Merge Develop [\#248](https://github.com/overtrue/wechat/pull/248) ([overtrue](https://github.com/overtrue)) - Merge from Develop [\#243](https://github.com/overtrue/wechat/pull/243) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#242](https://github.com/overtrue/wechat/pull/242) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#241](https://github.com/overtrue/wechat/pull/241) ([overtrue](https://github.com/overtrue)) - Add Luckymoney. [\#240](https://github.com/overtrue/wechat/pull/240) ([tianyong90](https://github.com/tianyong90)) - Applied fixes from StyleCI [\#237](https://github.com/overtrue/wechat/pull/237) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#234](https://github.com/overtrue/wechat/pull/234) ([overtrue](https://github.com/overtrue)) - Multiple News Items Support [\#230](https://github.com/overtrue/wechat/pull/230) ([fanglinks](https://github.com/fanglinks)) - Applied fixes from StyleCI [\#221](https://github.com/overtrue/wechat/pull/221) ([overtrue](https://github.com/overtrue)) - \[3.0\]\[Bugfix\]发送图文消息缺少type [\#217](https://github.com/overtrue/wechat/pull/217) ([sunbiao0526](https://github.com/sunbiao0526)) - fix Js.php 获取自定义cache对象 [\#215](https://github.com/overtrue/wechat/pull/215) ([sunbiao0526](https://github.com/sunbiao0526)) - Applied fixes from StyleCI [\#197](https://github.com/overtrue/wechat/pull/197) ([overtrue](https://github.com/overtrue)) - Add alias [\#196](https://github.com/overtrue/wechat/pull/196) ([ruchengtang](https://github.com/ruchengtang)) - Applied fixes from StyleCI [\#195](https://github.com/overtrue/wechat/pull/195) ([overtrue](https://github.com/overtrue)) - Applied fixes from StyleCI [\#194](https://github.com/overtrue/wechat/pull/194) ([overtrue](https://github.com/overtrue)) - Add Broadcast. [\#193](https://github.com/overtrue/wechat/pull/193) ([ruchengtang](https://github.com/ruchengtang)) - 微信红包类优化 [\#190](https://github.com/overtrue/wechat/pull/190) ([tianyong90](https://github.com/tianyong90)) - Update ServerServiceProvider.php [\#187](https://github.com/overtrue/wechat/pull/187) ([ghost](https://github.com/ghost)) - Update README\_EN.md [\#178](https://github.com/overtrue/wechat/pull/178) ([spekulatius](https://github.com/spekulatius)) - 添加群发消息文档 [\#177](https://github.com/overtrue/wechat/pull/177) ([ruchengtang](https://github.com/ruchengtang)) - 群发消息 [\#176](https://github.com/overtrue/wechat/pull/176) ([ruchengtang](https://github.com/ruchengtang)) - Master [\#167](https://github.com/overtrue/wechat/pull/167) ([xiaohome](https://github.com/xiaohome)) - 微信小店 [\#166](https://github.com/overtrue/wechat/pull/166) ([xiaohome](https://github.com/xiaohome)) - 红包类更新 [\#161](https://github.com/overtrue/wechat/pull/161) ([overtrue](https://github.com/overtrue)) - 加入摇一摇红包类,红包类提升至Overtrue命名空间 [\#160](https://github.com/overtrue/wechat/pull/160) ([tianyong90](https://github.com/tianyong90)) - 2.1 [\#159](https://github.com/overtrue/wechat/pull/159) ([overtrue](https://github.com/overtrue)) - Update QRCode.php [\#156](https://github.com/overtrue/wechat/pull/156) ([ruchengtang](https://github.com/ruchengtang)) - 修复使用!=,来判断0 != null 的时候的一个bug [\#154](https://github.com/overtrue/wechat/pull/154) ([Liv1020](https://github.com/Liv1020)) - 调整多客服类删除客服方法 [\#151](https://github.com/overtrue/wechat/pull/151) ([tianyong90](https://github.com/tianyong90)) - 修复个bug [\#146](https://github.com/overtrue/wechat/pull/146) ([xiaohome](https://github.com/xiaohome)) - Update README.md [\#142](https://github.com/overtrue/wechat/pull/142) ([parkshinhye](https://github.com/parkshinhye)) - Fix code style to PSR-2 [\#139](https://github.com/overtrue/wechat/pull/139) ([tianyong90](https://github.com/tianyong90)) - 加入红包工具类,支持现金和裂变红包的发送及查询 [\#137](https://github.com/overtrue/wechat/pull/137) ([tianyong90](https://github.com/tianyong90)) - 卡券类批量获取卡券ID方法支持仅获取指定状态卡券 [\#132](https://github.com/overtrue/wechat/pull/132) ([tianyong90](https://github.com/tianyong90)) - 添加客服 卡券回复!!! [\#124](https://github.com/overtrue/wechat/pull/124) ([parkshinhye](https://github.com/parkshinhye)) - 调整退款类中一处异常抛出逻辑并修正单词拼写错误 [\#122](https://github.com/overtrue/wechat/pull/122) ([tianyong90](https://github.com/tianyong90)) - 加入创建卡券货架接口 [\#121](https://github.com/overtrue/wechat/pull/121) ([tianyong90](https://github.com/tianyong90)) - 增加退款类 [\#105](https://github.com/overtrue/wechat/pull/105) ([jaring](https://github.com/jaring)) - 增加获取用户已领取卡券方法 [\#103](https://github.com/overtrue/wechat/pull/103) ([tenstone](https://github.com/tenstone)) - Scrutinizer Auto-Fixes [\#100](https://github.com/overtrue/wechat/pull/100) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - 修正二维码类中生成卡券二维码方法 [\#99](https://github.com/overtrue/wechat/pull/99) ([tianyong90](https://github.com/tianyong90)) - 卡券接口加入添加测试白名单方法 [\#98](https://github.com/overtrue/wechat/pull/98) ([tianyong90](https://github.com/tianyong90)) - 依样画葫芦写了一个查询订单,更改了UnifiedOrder中Http初始化 [\#95](https://github.com/overtrue/wechat/pull/95) ([jaring](https://github.com/jaring)) - accessToken根据appId变化 [\#92](https://github.com/overtrue/wechat/pull/92) ([keepeye](https://github.com/keepeye)) - Fix payment sign bug. [\#82](https://github.com/overtrue/wechat/pull/82) ([0i](https://github.com/0i)) - \[wiki\] wechat payment [\#81](https://github.com/overtrue/wechat/pull/81) ([0i](https://github.com/0i)) ## [2.1.0](https://github.com/overtrue/wechat/tree/2.1.0) (2015-08-18) [Full Changelog](https://github.com/overtrue/wechat/compare/2.0.35...2.1.0) **Merged pull requests:** - Wechat Payment [\#80](https://github.com/overtrue/wechat/pull/80) ([0i](https://github.com/0i)) ## [2.0.35](https://github.com/overtrue/wechat/tree/2.0.35) (2015-08-11) [Full Changelog](https://github.com/overtrue/wechat/compare/2.0.1...2.0.35) **Implemented enhancements:** - Overtrue\Wechat\Http识别JSON的问题 [\#47](https://github.com/overtrue/wechat/issues/47) **Fixed bugs:** - 模板消息简单格式无效 [\#34](https://github.com/overtrue/wechat/issues/34) **Closed issues:** - $data是数组,title输出不了内容 [\#73](https://github.com/overtrue/wechat/issues/73) - 回调是如何传递外部参数的? [\#72](https://github.com/overtrue/wechat/issues/72) - 【建议】可以添加微信js的功能吗? [\#71](https://github.com/overtrue/wechat/issues/71) - Message::make\('link'\) 无效 [\#70](https://github.com/overtrue/wechat/issues/70) - 监听消息 返回Bad Request [\#65](https://github.com/overtrue/wechat/issues/65) - 微信素材管理小改版,求跟上~ [\#64](https://github.com/overtrue/wechat/issues/64) - 在新浪SAE平台上的部署问题 [\#63](https://github.com/overtrue/wechat/issues/63) - $xmlInput = file\_get\_contents\('php://input'\);貌似在某些版本的PHP有问题还是怎的 [\#57](https://github.com/overtrue/wechat/issues/57) - 卡券的 attachExtension 方法 [\#56](https://github.com/overtrue/wechat/issues/56) - 网页授权$auth-\>authorize\(\) 后还需要保存access\_token吗? [\#53](https://github.com/overtrue/wechat/issues/53) - php 5.6版本下出现错误(5.6以下版本正常) [\#51](https://github.com/overtrue/wechat/issues/51) - 消息发送后服务器无法正确返回响应 [\#48](https://github.com/overtrue/wechat/issues/48) - token验证失败 [\#45](https://github.com/overtrue/wechat/issues/45) - 微信关注自动回复问题 [\#44](https://github.com/overtrue/wechat/issues/44) - js sdk config 建议增加 beta 字段 [\#35](https://github.com/overtrue/wechat/issues/35) - 关于Util\HTTP::encode\(\)中的urlencode\(\)/urldecode\(\)成组操作的疑问 [\#31](https://github.com/overtrue/wechat/issues/31) - Media::updateNews\(\) 方法与微信API不一致 [\#29](https://github.com/overtrue/wechat/issues/29) - 希望能有一个ThinkPHP的使用示例 [\#28](https://github.com/overtrue/wechat/issues/28) - 事件消息 [\#22](https://github.com/overtrue/wechat/issues/22) - 模板消息notice [\#21](https://github.com/overtrue/wechat/issues/21) - 关于获取(接收)用户发送消息 [\#19](https://github.com/overtrue/wechat/issues/19) - 微信公众号绑定的一点问题,请教。 [\#16](https://github.com/overtrue/wechat/issues/16) - 获取素材列表错误 [\#15](https://github.com/overtrue/wechat/issues/15) **Merged pull requests:** - Scrutinizer Auto-Fixes [\#69](https://github.com/overtrue/wechat/pull/69) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - Scrutinizer Auto-Fixes [\#68](https://github.com/overtrue/wechat/pull/68) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - Scrutinizer Auto-Fixes [\#67](https://github.com/overtrue/wechat/pull/67) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) - Fixed StyleCI config [\#66](https://github.com/overtrue/wechat/pull/66) ([GrahamCampbell](https://github.com/GrahamCampbell)) - 洁癖爆发了。。。 [\#62](https://github.com/overtrue/wechat/pull/62) ([TheNorthMemory](https://github.com/TheNorthMemory)) - fix: js getUrl use Url::current\(\) [\#61](https://github.com/overtrue/wechat/pull/61) ([wdjwxh](https://github.com/wdjwxh)) - bug-fix: add x-forwarded-host for Url::current [\#60](https://github.com/overtrue/wechat/pull/60) ([wdjwxh](https://github.com/wdjwxh)) - Fix request method for User::batchGet\(\), should be POST with JSON. [\#59](https://github.com/overtrue/wechat/pull/59) ([acgrid](https://github.com/acgrid)) - optimize some code [\#58](https://github.com/overtrue/wechat/pull/58) ([tabalt](https://github.com/tabalt)) - 增加使用media id发送图文消息的功能 [\#52](https://github.com/overtrue/wechat/pull/52) ([zengohm](https://github.com/zengohm)) - fix Staff::delete, let it works [\#42](https://github.com/overtrue/wechat/pull/42) ([TheNorthMemory](https://github.com/TheNorthMemory)) - 支持自定义菜单类型:下发消息media\_id、跳转图文消息view\_limited [\#40](https://github.com/overtrue/wechat/pull/40) ([acgrid](https://github.com/acgrid)) - docline comments & fix AccessToken parameter typos [\#39](https://github.com/overtrue/wechat/pull/39) ([TheNorthMemory](https://github.com/TheNorthMemory)) - Merge from master [\#38](https://github.com/overtrue/wechat/pull/38) ([overtrue](https://github.com/overtrue)) - 客服接口Bugfix [\#37](https://github.com/overtrue/wechat/pull/37) ([overtrue](https://github.com/overtrue)) - fix Staff and AccessToken typos [\#36](https://github.com/overtrue/wechat/pull/36) ([TheNorthMemory](https://github.com/TheNorthMemory)) - Update QRCode.php [\#33](https://github.com/overtrue/wechat/pull/33) ([refear99](https://github.com/refear99)) - English Readme [\#32](https://github.com/overtrue/wechat/pull/32) ([hareluya](https://github.com/hareluya)) - 更新图文消息方法Media::updateNews\(\)与微信API不一致 [\#30](https://github.com/overtrue/wechat/pull/30) ([acgrid](https://github.com/acgrid)) - 代码之美在于不断修正 :\) [\#27](https://github.com/overtrue/wechat/pull/27) ([TheNorthMemory](https://github.com/TheNorthMemory)) - the json\_encode $depth parameter was added@5.5.0 [\#26](https://github.com/overtrue/wechat/pull/26) ([TheNorthMemory](https://github.com/TheNorthMemory)) - fix \#4 for PHP5.3 [\#25](https://github.com/overtrue/wechat/pull/25) ([TheNorthMemory](https://github.com/TheNorthMemory)) - fix \#4 for PHP5.3 [\#23](https://github.com/overtrue/wechat/pull/23) ([TheNorthMemory](https://github.com/TheNorthMemory)) - Update QRCode.php [\#17](https://github.com/overtrue/wechat/pull/17) ([gundanx10](https://github.com/gundanx10)) ## [2.0.1](https://github.com/overtrue/wechat/tree/2.0.1) (2015-05-08) [Full Changelog](https://github.com/overtrue/wechat/compare/2.0.0...2.0.1) **Closed issues:** - 2.0版本使用问题 [\#14](https://github.com/overtrue/wechat/issues/14) ## [2.0.0](https://github.com/overtrue/wechat/tree/2.0.0) (2015-05-07) [Full Changelog](https://github.com/overtrue/wechat/compare/1.0.1...2.0.0) **Closed issues:** - 素材管理 -- 部分图片下载失败 [\#13](https://github.com/overtrue/wechat/issues/13) - 素材管理 -- 图片下载失败 [\#12](https://github.com/overtrue/wechat/issues/12) - 请问这样判断Mcrypt到底准不准? [\#11](https://github.com/overtrue/wechat/issues/11) - 好奇怪啊,开发者中心的服务器配置已经提交并验证成功了,可是message不起作用 [\#10](https://github.com/overtrue/wechat/issues/10) - 网页授权一刷新页面就出现40029 不合法的oauth\_code [\#8](https://github.com/overtrue/wechat/issues/8) - mcrypt\_module\_open error [\#7](https://github.com/overtrue/wechat/issues/7) - composer update 之后报错 [\#6](https://github.com/overtrue/wechat/issues/6) - 今天开始,授权时候一直报40029,invalid code的错误 [\#5](https://github.com/overtrue/wechat/issues/5) - Using $this when not in object context [\#4](https://github.com/overtrue/wechat/issues/4) - 监听事件时不区分 $target(监听所有event和message) [\#3](https://github.com/overtrue/wechat/issues/3) - Does this support Oauth already? [\#1](https://github.com/overtrue/wechat/issues/1) **Merged pull requests:** - Fix wiki url error [\#9](https://github.com/overtrue/wechat/pull/9) ([sinoon](https://github.com/sinoon)) - Update Bag.php [\#2](https://github.com/overtrue/wechat/pull/2) ([zerozh](https://github.com/zerozh)) ## [1.0.1](https://github.com/overtrue/wechat/tree/1.0.1) (2015-03-19) [Full Changelog](https://github.com/overtrue/wechat/compare/1.0...1.0.1) ## [1.0](https://github.com/overtrue/wechat/tree/1.0) (2015-03-13) \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/CONTRIBUTING.md ================================================ # Contribute ## Introduction First, thank you for considering contributing to wechat! It's people like you that make the open source community such a great community! 😊 We welcome any type of contribution, not only code. You can help with - **QA**: file bug reports, the more details you can give the better (e.g. screenshots with the console open) - **Marketing**: writing blog posts, howto's, printing stickers, ... - **Community**: presenting the project at meetups, organizing a dedicated meetup for the local community, ... - **Code**: take a look at the [open issues](issues). Even if you can't write code, commenting on them, showing that you care about a given issue matters. It helps us triage them. - **Money**: we welcome financial contributions in full transparency on our [open collective](https://opencollective.com/wechat). ## Your First Contribution Working on your first Pull Request? You can learn how from this *free* series, [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github). ## Submitting code Any code change should be submitted as a pull request. The description should explain what the code does and give steps to execute it. The pull request should also contain tests. ## Code review process The bigger the pull request, the longer it will take to review and merge. Try to break down large pull requests in smaller chunks that are easier to review and merge. It is also always helpful to have some context for your pull request. What was the purpose? Why does it matter to you? ## Financial contributions We also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/wechat). Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed. ## Questions If you have any questions, create an [issue](issue) (protip: do a quick search first to see if someone else didn't ask the same question before!). You can also reach us at hello@wechat.opencollective.com. ## Credits ### Contributors Thank you to all the people who have already contributed to wechat! ### Backers Thank you to all our backers! [[Become a backer](https://opencollective.com/wechat#backer)] ### Sponsors Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/wechat#sponsor)) ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/LICENSE ================================================ The MIT License (MIT) Copyright (c) overtrue Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/README.md ================================================

        EasyWeChat

        📦 一个 PHP 微信开发 SDK。 [![Test Status](https://github.com/w7corp/easywechat/workflows/Test/badge.svg)](https://github.com/w7corp/easywechat/actions) [![Lint Status](https://github.com/w7corp/easywechat/workflows/Lint/badge.svg)](https://github.com/w7corp/easywechat/actions) [![Latest Stable Version](https://poser.pugx.org/w7corp/easywechat/v/stable.svg)](https://packagist.org/packages/w7corp/easywechat) [![Latest Unstable Version](https://poser.pugx.org/w7corp/easywechat/v/unstable.svg)](https://packagist.org/packages/w7corp/easywechat) [![Total Downloads](https://poser.pugx.org/w7corp/easywechat/downloads)](https://packagist.org/packages/w7corp/easywechat) [![License](https://poser.pugx.org/w7corp/easywechat/license)](https://packagist.org/packages/w7corp/easywechat) [![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev) > 📣 **公告** > > 为了更好的推进项目发展,保障项目更新迭代速度,EasyWeChat 正式并入微擎旗下,加上微擎团队的助力,将会为大家提供更强大更稳固更多元化的开源项目。 > > - 微擎与 EasyWeChat 结合,基于微擎技术资源方面的优势,将积极发展 EasyWeChat 的开源社区,将为 EasyWeChat 开源项目注入巨大活力。 > - EasyWeChat 原作者 overtrue 将继续担任开源项目的核心开发者,继续参与项目的发展规划,共同打造更强大的开源生态社区。 > - 项目从 6.0 版本开始将修改包名为 `w7corp/easywechat`,5.x 及以下版本不受影响。 > 🚨 注意:请 PR 时往 5.x 提交,感谢您的贡献! ## Requirement 1. PHP >= 7.4 2. **[Composer](https://getcomposer.org/)** 3. openssl 拓展 4. fileinfo 拓展(素材管理模块需要用到) ## Installation ```shell $ composer require "overtrue/wechat:^5.0" -vvv ``` ## Usage 基本使用(以服务端为例): ```php 'wx3cf0f39249eb0exxx', 'secret' => 'f1c242f4f28f735d4687abb469072xxx', 'token' => 'easywechat', 'log' => [ 'level' => 'debug', 'file' => '/tmp/easywechat.log', ], // ... ]; $app = Factory::officialAccount($options); $server = $app->server; $user = $app->user; $server->push(function($message) use ($user) { $fromUser = $user->get($message['FromUserName']); return "{$fromUser->nickname} 您好!欢迎关注 overtrue!"; }); $server->serve()->send(); ``` 更多请参考 [https://www.easywechat.com/](https://www.easywechat.com/)。 ## Documentation [官网](https://www.easywechat.com) · [教程](https://www.aliyundrive.com/s/6CwgtkiBqFV) · [讨论](https://github.com/w7corp/easywechat/discussions) · [微信公众平台](https://mp.weixin.qq.com/wiki) · [WeChat Official](http://admin.wechat.com/wiki) ## Integration [Laravel 5 拓展包: overtrue/laravel-wechat](https://github.com/overtrue/laravel-wechat) ## Contributors This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. ## PHP 扩展包开发 > 想知道如何从零开始构建 PHP 扩展包? > > 请关注我的实战课程,我会在此课程中分享一些扩展开发经验 —— [《PHP 扩展包实战教程 - 从入门到发布》](https://learnku.com/courses/creating-package) ## License MIT [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fovertrue%2Fwechat.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fovertrue%2Fwechat?ref=badge_large) ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/SECURITY.md ================================================ # 更新策略 从最初的稳定版本开始,EasyWeChat 的每个发行分支都会得到两年的全面支持。在这期间,被报告的错误和安全问题会被修复并发布。 在这两年的积极支持期之后,每个分支再被支持一年,只针对关键安全问题。在此期间的发布是根据需要进行的:根据报告的数量,可能有多个版本发布,也可能没有。 ## 当前支持版本情况 | 版本 | 发布日期 | 积极维护更新 | 安全性修复 | | ------- | ---------------- | -------------------- | ------------------------- | | 6.x | 2022.02.02 | 2024.02.02 | 2025.02.02 | | 5.x | 2020.07.27 | 2022.07.27 | 2023.07.27 | | 4.x | 2017.12.12 | 2019.12.12 | 2020.12.12 | | 3.x | 2016.02.19 | 2018.02.19 | 2019.02.19 | | 2.x | 2015.05.06 | 2017.05.06 | 2018.05.06 | | 1.x | 2015.02.13 | 2017.02.13 | 2017.02.13 | ## 报告安全问题 如果您发现 EasyWeChat 有安全漏洞,请发送电子邮件至 anzhengchao@gmail.com。所有的安全漏洞都会得到及时的解决。 ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/composer.json ================================================ { "name": "overtrue/wechat", "description": "微信SDK", "keywords": [ "easywechat", "wechat", "weixin", "weixin-sdk", "sdk" ], "license": "MIT", "authors": [ { "name": "overtrue", "email": "anzhengchao@gmail.com" } ], "require": { "php": ">=7.4", "ext-fileinfo": "*", "ext-openssl": "*", "ext-simplexml": "*", "easywechat-composer/easywechat-composer": "^1.1", "guzzlehttp/guzzle": "^6.2 || ^7.0", "monolog/monolog": "^1.22 || ^2.0 || ^3.0", "overtrue/socialite": "^3.2 || ^4.0", "pimple/pimple": "^3.0", "psr/simple-cache": "^1.0||^2.0||^3.0", "symfony/cache": "^3.3 || ^4.3 || ^5.0 || ^6.0", "symfony/event-dispatcher": "^4.3 || ^5.0 || ^6.0", "symfony/http-foundation": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", "symfony/psr-http-message-bridge": "^0.3 || ^1.0 || ^2.0", "ext-libxml": "*" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.5.0", "brainmaestro/composer-git-hooks": "^2.7", "mikey179/vfsstream": "^1.6", "mockery/mockery": "^1.2.3", "phpstan/phpstan": "^0.12.0", "phpunit/phpunit": "^9.3", "dms/phpunit-arraysubset-asserts": "^0.2.0" }, "autoload": { "psr-4": { "EasyWeChat\\": "src/" }, "files": [ "src/Kernel/Support/Helpers.php", "src/Kernel/Helpers.php" ] }, "autoload-dev": { "psr-4": { "EasyWeChat\\Tests\\": "tests/" } }, "extra": { "hooks": { "pre-commit": [ "composer test", "composer fix-style" ], "pre-push": [ "composer test", "composer fix-style" ] } }, "scripts": { "post-update-cmd": [ "cghooks update" ], "post-merge": "composer install", "post-install-cmd": [ "cghooks add --ignore-lock", "cghooks update" ], "phpstan": "vendor/bin/phpstan analyse", "check-style": "vendor/bin/php-cs-fixer fix --using-cache=no --diff --config=.php-cs-fixer.dist.php --dry-run --ansi", "fix-style": "vendor/bin/php-cs-fixer fix --using-cache=no --config=.php-cs-fixer.dist.php --ansi", "test": "vendor/bin/phpunit --colors=always --testdox" }, "config": { "allow-plugins": { "easywechat-composer/easywechat-composer": true } } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Application.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService; use EasyWeChat\Kernel\ServiceContainer; /** * Class Application. * * @author overtrue * * @property \EasyWeChat\BasicService\Jssdk\Client $jssdk * @property \EasyWeChat\BasicService\Media\Client $media * @property \EasyWeChat\BasicService\QrCode\Client $qrcode * @property \EasyWeChat\BasicService\Url\Client $url * @property \EasyWeChat\BasicService\ContentSecurity\Client $content_security */ class Application extends ServiceContainer { /** * @var array */ protected $providers = [ Jssdk\ServiceProvider::class, QrCode\ServiceProvider::class, Media\ServiceProvider::class, Url\ServiceProvider::class, ContentSecurity\ServiceProvider::class, ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/ContentSecurity/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService\ContentSecurity; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class Client. * * @author tianyong90 <412039588@qq.com> */ class Client extends BaseClient { /** * Text content security check. * * @param string $text * @param array $extra * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function checkText(string $text, array $extra = []) { $params = array_merge(['content' => $text], $extra); return $this->httpPostJson('wxa/msg_sec_check', $params); } /** * Image security check. * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function checkImage(string $path) { return $this->httpUpload('wxa/img_sec_check', ['media' => $path]); } /** * Media security check. * * @param string $mediaUrl * @param int $mediaType * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function checkMediaAsync(string $mediaUrl, int $mediaType) { /* * 1:音频;2:图片 */ $mediaTypes = [1, 2]; if (!in_array($mediaType, $mediaTypes, true)) { throw new InvalidArgumentException('media type must be 1 or 2'); } $params = [ 'media_url' => $mediaUrl, 'media_type' => $mediaType, ]; return $this->httpPostJson('wxa/media_check_async', $params); } /** * Image security check async. * * @param string $mediaUrl * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function checkImageAsync(string $mediaUrl) { return $this->checkMediaAsync($mediaUrl, 2); } /** * Audio security check async. * * @param string $mediaUrl * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function checkAudioAsync(string $mediaUrl) { return $this->checkMediaAsync($mediaUrl, 1); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/ContentSecurity/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService\ContentSecurity; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['content_security'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Jssdk/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService\Jssdk; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Support; use EasyWeChat\Kernel\Traits\InteractsWithCache; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { use InteractsWithCache; /** * @var string */ protected $ticketEndpoint = 'cgi-bin/ticket/getticket'; /** * Current URI. * * @var string */ protected $url; /** * Get config json for jsapi. * * @param array $jsApiList * @param bool $debug * @param bool $beta * @param bool $json * @param array $openTagList * @param string|null $url * * @return array|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \Psr\SimpleCache\InvalidArgumentException * @throws \GuzzleHttp\Exception\GuzzleException */ public function buildConfig(array $jsApiList, bool $debug = false, bool $beta = false, bool $json = true, array $openTagList = [], string $url = null) { $config = array_merge(compact('debug', 'beta', 'jsApiList', 'openTagList'), $this->configSignature($url)); return $json ? json_encode($config) : $config; } /** * Return jsapi config as a PHP array. * * @param array $apis * @param bool $debug * @param bool $beta * @param array $openTagList * @param string|null $url * * @return array|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \Psr\SimpleCache\InvalidArgumentException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getConfigArray(array $apis, bool $debug = false, bool $beta = false, array $openTagList = [], string $url = null) { return $this->buildConfig($apis, $debug, $beta, false, $openTagList, $url); } /** * Get js ticket. * * @param bool $refresh * @param string $type * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function getTicket(bool $refresh = false, string $type = 'jsapi'): array { $cacheKey = sprintf('easywechat.basic_service.jssdk.ticket.%s.%s', $type, $this->getAppId()); if (!$refresh && $this->getCache()->has($cacheKey)) { return $this->getCache()->get($cacheKey); } /** @var array $result */ $result = $this->castResponseToType( $this->requestRaw($this->ticketEndpoint, 'GET', ['query' => ['type' => $type]]), 'array' ); $this->getCache()->set($cacheKey, $result, $result['expires_in'] - 500); if (!$this->getCache()->has($cacheKey)) { throw new RuntimeException('Failed to cache jssdk ticket.'); } return $result; } /** * Build signature. * * @param string|null $url * @param string|null $nonce * @param null $timestamp * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Psr\SimpleCache\InvalidArgumentException */ protected function configSignature(string $url = null, string $nonce = null, $timestamp = null): array { $url = $url ?: $this->getUrl(); $nonce = $nonce ?: Support\Str::quickRandom(10); $timestamp = $timestamp ?: time(); return [ 'appId' => $this->getAppId(), 'nonceStr' => $nonce, 'timestamp' => $timestamp, 'url' => $url, 'signature' => $this->getTicketSignature($this->getTicket()['ticket'], $nonce, $timestamp, $url), ]; } /** * Sign the params. * * @param string $ticket * @param string $nonce * @param int $timestamp * @param string $url * * @return string */ public function getTicketSignature($ticket, $nonce, $timestamp, $url): string { return sha1(sprintf('jsapi_ticket=%s&noncestr=%s×tamp=%s&url=%s', $ticket, $nonce, $timestamp, $url)); } /** * @return string */ public function dictionaryOrderSignature() { $params = func_get_args(); sort($params, SORT_STRING); return sha1(implode('', $params)); } /** * Set current url. * * @param string $url * * @return $this */ public function setUrl(string $url) { $this->url = $url; return $this; } /** * Get current url. * * @return string */ public function getUrl(): string { if ($this->url) { return $this->url; } return Support\current_url(); } /** * @return string */ protected function getAppId() { return $this->app['config']->get('app_id'); } /** * @return string */ protected function getAgentId() { return $this->app['config']->get('agent_id'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Jssdk/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService\Jssdk; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['jssdk'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Media/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService\Media; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Http\StreamResponse; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * Allow media type. * * @var array */ protected $allowTypes = ['image', 'voice', 'video', 'thumb']; /** * Upload image. * * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadImage($path) { return $this->upload('image', $path); } /** * Upload video. * * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadVideo($path) { return $this->upload('video', $path); } /** * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadVoice($path) { return $this->upload('voice', $path); } /** * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadThumb($path) { return $this->upload('thumb', $path); } /** * Upload temporary material. * * @param string $type * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function upload(string $type, string $path) { if (!file_exists($path) || !is_readable($path)) { throw new InvalidArgumentException(sprintf("File does not exist, or the file is unreadable: '%s'", $path)); } if (!in_array($type, $this->allowTypes, true)) { throw new InvalidArgumentException(sprintf("Unsupported media type: '%s'", $type)); } return $this->httpUpload('cgi-bin/media/upload', ['media' => $path], ['type' => $type]); } /** * @param string $path * @param string $title * @param string $description * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadVideoForBroadcasting(string $path, string $title, string $description) { $response = $this->uploadVideo($path); /** @var array $arrayResponse */ $arrayResponse = $this->detectAndCastResponseToType($response, 'array'); if (!empty($arrayResponse['media_id'])) { return $this->createVideoForBroadcasting($arrayResponse['media_id'], $title, $description); } return $response; } /** * @param string $mediaId * @param string $title * @param string $description * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createVideoForBroadcasting(string $mediaId, string $title, string $description) { return $this->httpPostJson('cgi-bin/media/uploadvideo', [ 'media_id' => $mediaId, 'title' => $title, 'description' => $description, ]); } /** * Fetch item from WeChat server. * * @param string $mediaId * * @return \EasyWeChat\Kernel\Http\StreamResponse|\Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $mediaId) { $response = $this->requestRaw('cgi-bin/media/get', 'GET', [ 'query' => [ 'media_id' => $mediaId, ], ]); if (false !== stripos($response->getHeaderLine('Content-disposition'), 'attachment')) { return StreamResponse::buildFromPsrResponse($response); } return $this->castResponseToType($response, $this->app['config']->get('response_type')); } /** * @param string $mediaId * * @return array|\EasyWeChat\Kernel\Http\Response|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getJssdkMedia(string $mediaId) { $response = $this->requestRaw('cgi-bin/media/get/jssdk', 'GET', [ 'query' => [ 'media_id' => $mediaId, ], ]); if (false !== stripos($response->getHeaderLine('Content-disposition'), 'attachment')) { return StreamResponse::buildFromPsrResponse($response); } return $this->castResponseToType($response, $this->app['config']->get('response_type')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Media/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * ServiceProvider.php. * * This file is part of the wechat. * * (c) overtrue * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService\Media; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['media'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/QrCode/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService\QrCode; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { public const DAY = 86400; public const SCENE_MAX_VALUE = 100000; public const SCENE_QR_CARD = 'QR_CARD'; public const SCENE_QR_TEMPORARY = 'QR_SCENE'; public const SCENE_QR_TEMPORARY_STR = 'QR_STR_SCENE'; public const SCENE_QR_FOREVER = 'QR_LIMIT_SCENE'; public const SCENE_QR_FOREVER_STR = 'QR_LIMIT_STR_SCENE'; /** * Create forever QR code. * * @param string|int $sceneValue * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function forever($sceneValue) { if (is_int($sceneValue) && $sceneValue > 0 && $sceneValue < self::SCENE_MAX_VALUE) { $type = self::SCENE_QR_FOREVER; $sceneKey = 'scene_id'; } else { $type = self::SCENE_QR_FOREVER_STR; $sceneKey = 'scene_str'; } $scene = [$sceneKey => $sceneValue]; return $this->create($type, $scene, false); } /** * Create temporary QR code. * * @param string|int $sceneValue * @param int|null $expireSeconds * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function temporary($sceneValue, $expireSeconds = null) { if (is_int($sceneValue) && $sceneValue > 0) { $type = self::SCENE_QR_TEMPORARY; $sceneKey = 'scene_id'; } else { $type = self::SCENE_QR_TEMPORARY_STR; $sceneKey = 'scene_str'; } $scene = [$sceneKey => $sceneValue]; return $this->create($type, $scene, true, $expireSeconds); } /** * Return url for ticket. * Detail: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542 . * * @param string $ticket * * @return string */ public function url($ticket) { return sprintf('https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s', urlencode($ticket)); } /** * Create a QrCode. * * @param string $actionName * @param array $actionInfo * @param bool $temporary * @param int $expireSeconds * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function create($actionName, $actionInfo, $temporary = true, $expireSeconds = null) { null !== $expireSeconds || $expireSeconds = 7 * self::DAY; $params = [ 'action_name' => $actionName, 'action_info' => ['scene' => $actionInfo], ]; if ($temporary) { $params['expire_seconds'] = min($expireSeconds, 30 * self::DAY); } return $this->httpPostJson('cgi-bin/qrcode/create', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/QrCode/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService\QrCode; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['qrcode'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Url/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService\Url; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * Shorten the url. * * @param string $url * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function shorten(string $url) { $params = [ 'action' => 'long2short', 'long_url' => $url, ]; return $this->httpPostJson('cgi-bin/shorturl', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/BasicService/Url/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\BasicService\Url; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['url'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Factory.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat; /** * Class Factory. * * @method static \EasyWeChat\Payment\Application payment(array $config) * @method static \EasyWeChat\MiniProgram\Application miniProgram(array $config) * @method static \EasyWeChat\OpenPlatform\Application openPlatform(array $config) * @method static \EasyWeChat\OfficialAccount\Application officialAccount(array $config) * @method static \EasyWeChat\BasicService\Application basicService(array $config) * @method static \EasyWeChat\Work\Application work(array $config) * @method static \EasyWeChat\OpenWork\Application openWork(array $config) * @method static \EasyWeChat\MicroMerchant\Application microMerchant(array $config) */ class Factory { /** * @param string $name * @param array $config * * @return \EasyWeChat\Kernel\ServiceContainer */ public static function make($name, array $config) { $namespace = Kernel\Support\Str::studly($name); $application = "\\EasyWeChat\\{$namespace}\\Application"; return new $application($config); } /** * Dynamically pass methods to the application. * * @param string $name * @param array $arguments * * @return mixed */ public static function __callStatic($name, $arguments) { return self::make($name, ...$arguments); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/AccessToken.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel; use EasyWeChat\Kernel\Contracts\AccessTokenInterface; use EasyWeChat\Kernel\Exceptions\HttpException; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Traits\HasHttpRequests; use EasyWeChat\Kernel\Traits\InteractsWithCache; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; /** * Class AccessToken. * * @author overtrue */ abstract class AccessToken implements AccessTokenInterface { use HasHttpRequests; use InteractsWithCache; /** * @var \EasyWeChat\Kernel\ServiceContainer */ protected $app; /** * @var string */ protected $requestMethod = 'GET'; /** * @var string */ protected $endpointToGetToken; /** * @var string */ protected $queryName; /** * @var array */ protected $token; /** * @var string */ protected $tokenKey = 'access_token'; /** * @var string */ protected $cachePrefix = 'easywechat.kernel.access_token.'; /** * AccessToken constructor. * * @param \EasyWeChat\Kernel\ServiceContainer $app */ public function __construct(ServiceContainer $app) { $this->app = $app; } public function getLastToken(): array { return $this->token; } /** * @return array * * @throws \EasyWeChat\Kernel\Exceptions\HttpException * @throws \Psr\SimpleCache\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function getRefreshedToken(): array { return $this->getToken(true); } /** * @param bool $refresh * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\HttpException * @throws \Psr\SimpleCache\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function getToken(bool $refresh = false): array { $cacheKey = $this->getCacheKey(); $cache = $this->getCache(); if (!$refresh && $cache->has($cacheKey) && $result = $cache->get($cacheKey)) { return $result; } /** @var array $token */ $token = $this->requestToken($this->getCredentials(), true); $this->setToken($token[$this->tokenKey], $token['expires_in'] ?? 7200); $this->token = $token; $this->app->events->dispatch(new Events\AccessTokenRefreshed($this)); return $token; } /** * @param string $token * @param int $lifetime * * @return \EasyWeChat\Kernel\Contracts\AccessTokenInterface * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function setToken(string $token, int $lifetime = 7200): AccessTokenInterface { $this->getCache()->set($this->getCacheKey(), [ $this->tokenKey => $token, 'expires_in' => $lifetime, ], $lifetime); if (!$this->getCache()->has($this->getCacheKey())) { throw new RuntimeException('Failed to cache access token.'); } return $this; } /** * @return \EasyWeChat\Kernel\Contracts\AccessTokenInterface * * @throws \EasyWeChat\Kernel\Exceptions\HttpException * @throws \Psr\SimpleCache\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function refresh(): AccessTokenInterface { $this->getToken(true); return $this; } /** * @param array $credentials * @param bool $toArray * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\HttpException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function requestToken(array $credentials, $toArray = false) { $response = $this->sendRequest($credentials); $result = json_decode($response->getBody()->getContents(), true); $formatted = $this->castResponseToType($response, $this->app['config']->get('response_type')); if (empty($result[$this->tokenKey])) { throw new HttpException('Request access_token fail: '.json_encode($result, JSON_UNESCAPED_UNICODE), $response, $formatted); } return $toArray ? $result : $formatted; } /** * @param \Psr\Http\Message\RequestInterface $request * @param array $requestOptions * * @return \Psr\Http\Message\RequestInterface * * @throws \EasyWeChat\Kernel\Exceptions\HttpException * @throws \Psr\SimpleCache\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function applyToRequest(RequestInterface $request, array $requestOptions = []): RequestInterface { parse_str($request->getUri()->getQuery(), $query); $query = http_build_query(array_merge($this->getQuery(), $query)); return $request->withUri($request->getUri()->withQuery($query)); } /** * Send http request. * * @param array $credentials * * @return ResponseInterface * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function sendRequest(array $credentials): ResponseInterface { $options = [ ('GET' === $this->requestMethod) ? 'query' : 'json' => $credentials, ]; return $this->setHttpClient($this->app['http_client'])->request($this->getEndpoint(), $this->requestMethod, $options); } /** * @return string */ protected function getCacheKey() { return $this->cachePrefix.md5(json_encode($this->getCredentials())); } /** * The request query will be used to add to the request. * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\HttpException * @throws \Psr\SimpleCache\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ protected function getQuery(): array { return [$this->queryName ?? $this->tokenKey => $this->getToken()[$this->tokenKey]]; } /** * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function getEndpoint(): string { if (empty($this->endpointToGetToken)) { throw new InvalidArgumentException('No endpoint for access token request.'); } return $this->endpointToGetToken; } /** * @return string */ public function getTokenKey() { return $this->tokenKey; } /** * Credential for get token. * * @return array */ abstract protected function getCredentials(): array; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/BaseClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel; use EasyWeChat\Kernel\Contracts\AccessTokenInterface; use EasyWeChat\Kernel\Http\Response; use EasyWeChat\Kernel\Traits\HasHttpRequests; use GuzzleHttp\MessageFormatter; use GuzzleHttp\Middleware; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Log\LogLevel; /** * Class BaseClient. * * @author overtrue */ class BaseClient { use HasHttpRequests { request as performRequest; } /** * @var \EasyWeChat\Kernel\ServiceContainer */ protected $app; /** * @var \EasyWeChat\Kernel\Contracts\AccessTokenInterface|null */ protected $accessToken = null; /** * @var string */ protected $baseUri; /** * BaseClient constructor. * * @param \EasyWeChat\Kernel\ServiceContainer $app * @param \EasyWeChat\Kernel\Contracts\AccessTokenInterface|null $accessToken */ public function __construct(ServiceContainer $app, AccessTokenInterface $accessToken = null) { $this->app = $app; $this->accessToken = $accessToken ?? $this->app['access_token']; } /** * GET request. * * @param string $url * @param array $query * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function httpGet(string $url, array $query = []) { return $this->request($url, 'GET', ['query' => $query]); } /** * POST request. * * @param string $url * @param array $data * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function httpPost(string $url, array $data = []) { return $this->request($url, 'POST', ['form_params' => $data]); } /** * JSON request. * * @param string $url * @param array $data * @param array $query * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function httpPostJson(string $url, array $data = [], array $query = []) { return $this->request($url, 'POST', ['query' => $query, 'json' => $data]); } /** * Upload file. * * @param string $url * @param array $files * @param array $form * @param array $query * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function httpUpload(string $url, array $files = [], array $form = [], array $query = []) { $multipart = []; $headers = []; if (isset($form['filename'])) { $headers = [ 'Content-Disposition' => 'form-data; name="media"; filename="'.$form['filename'].'"' ]; } foreach ($files as $name => $path) { $multipart[] = [ 'name' => $name, 'contents' => fopen($path, 'r'), 'headers' => $headers ]; } foreach ($form as $name => $contents) { $multipart[] = compact('name', 'contents'); } return $this->request( $url, 'POST', ['query' => $query, 'multipart' => $multipart, 'connect_timeout' => 30, 'timeout' => 30, 'read_timeout' => 30] ); } /** * @return AccessTokenInterface */ public function getAccessToken(): AccessTokenInterface { return $this->accessToken; } /** * @param \EasyWeChat\Kernel\Contracts\AccessTokenInterface $accessToken * * @return $this */ public function setAccessToken(AccessTokenInterface $accessToken) { $this->accessToken = $accessToken; return $this; } /** * @param string $url * @param string $method * @param array $options * @param bool $returnRaw * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function request(string $url, string $method = 'GET', array $options = [], $returnRaw = false) { if (empty($this->middlewares)) { $this->registerHttpMiddlewares(); } $response = $this->performRequest($url, $method, $options); $this->app->events->dispatch(new Events\HttpResponseCreated($response)); return $returnRaw ? $response : $this->castResponseToType($response, $this->app->config->get('response_type')); } /** * @param string $url * @param string $method * @param array $options * * @return \EasyWeChat\Kernel\Http\Response * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function requestRaw(string $url, string $method = 'GET', array $options = []) { return Response::buildFromPsrResponse($this->request($url, $method, $options, true)); } /** * Register Guzzle middlewares. */ protected function registerHttpMiddlewares() { // retry $this->pushMiddleware($this->retryMiddleware(), 'retry'); // access token $this->pushMiddleware($this->accessTokenMiddleware(), 'access_token'); // log $this->pushMiddleware($this->logMiddleware(), 'log'); } /** * Attache access token to request query. * * @return \Closure */ protected function accessTokenMiddleware() { return function (callable $handler) { return function (RequestInterface $request, array $options) use ($handler) { if ($this->accessToken) { $request = $this->accessToken->applyToRequest($request, $options); } return $handler($request, $options); }; }; } /** * Log the request. * * @return \Closure */ protected function logMiddleware() { $formatter = new MessageFormatter($this->app['config']['http.log_template'] ?? MessageFormatter::DEBUG); return Middleware::log($this->app['logger'], $formatter, LogLevel::DEBUG); } /** * Return retry middleware. * * @return \Closure */ protected function retryMiddleware() { return Middleware::retry( function ( $retries, RequestInterface $request, ResponseInterface $response = null ) { // Limit the number of retries to 2 if ($retries < $this->app->config->get('http.max_retries', 1) && $response && $body = $response->getBody()) { // Retry on server errors $response = json_decode($body, true); if (!empty($response['errcode']) && in_array(abs($response['errcode']), [40001, 40014, 42001], true)) { $this->accessToken->refresh(); $this->app['logger']->debug('Retrying with refreshed access token.'); return true; } } return false; }, function () { return abs($this->app->config->get('http.retry_delay', 500)); } ); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Clauses/Clause.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Clauses; /** * Class Clause. * * @author mingyoung */ class Clause { /** * @var array */ protected $clauses = [ 'where' => [], ]; /** * @param mixed ...$args * * @return $this */ public function where(...$args) { array_push($this->clauses['where'], $args); return $this; } /** * @param mixed $payload * * @return bool */ public function intercepted($payload) { return (bool) $this->interceptWhereClause($payload); } /** * @param mixed $payload * * @return bool */ protected function interceptWhereClause($payload) { foreach ($this->clauses['where'] as $item) { list($key, $value) = $item; if (!isset($payload[$key])) { continue; } if (is_array($value) && !in_array($payload[$key], $value)) { return true; } if (!is_array($value) && $payload[$key] !== $value) { return true; } } return false; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Config.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel; use EasyWeChat\Kernel\Support\Collection; /** * Class Config. * * @author overtrue */ class Config extends Collection { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Contracts/AccessTokenInterface.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Contracts; use Psr\Http\Message\RequestInterface; /** * Interface AuthorizerAccessToken. * * @author overtrue */ interface AccessTokenInterface { /** * @return array */ public function getToken(): array; /** * @return \EasyWeChat\Kernel\Contracts\AccessTokenInterface */ public function refresh(): self; /** * @param \Psr\Http\Message\RequestInterface $request * @param array $requestOptions * * @return \Psr\Http\Message\RequestInterface */ public function applyToRequest(RequestInterface $request, array $requestOptions = []): RequestInterface; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Contracts/Arrayable.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Contracts; use ArrayAccess; /** * Interface Arrayable. * * @author overtrue */ interface Arrayable extends ArrayAccess { /** * Get the instance as an array. * * @return array */ public function toArray(); } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Contracts/EventHandlerInterface.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Contracts; /** * Interface EventHandlerInterface. * * @author mingyoung */ interface EventHandlerInterface { /** * @param mixed $payload */ public function handle($payload = null); } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Contracts/MediaInterface.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Contracts; /** * Interface MediaInterface. * * @author overtrue */ interface MediaInterface extends MessageInterface { /** * @return string */ public function getMediaId(): string; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Contracts/MessageInterface.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Contracts; /** * Interface MessageInterface. * * @author overtrue */ interface MessageInterface { /** * @return string */ public function getType(): string; /** * @return array */ public function transformForJsonRequest(): array; /** * @return string */ public function transformToXml(): string; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Decorators/FinallyResult.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Decorators; /** * Class FinallyResult. * * @author overtrue */ class FinallyResult { /** * @var mixed */ public $content; /** * FinallyResult constructor. * * @param mixed $content */ public function __construct($content) { $this->content = $content; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Decorators/TerminateResult.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Decorators; /** * Class TerminateResult. * * @author overtrue */ class TerminateResult { /** * @var mixed */ public $content; /** * FinallyResult constructor. * * @param mixed $content */ public function __construct($content) { $this->content = $content; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Encryptor.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Support\AES; use EasyWeChat\Kernel\Support\XML; use Throwable; use function EasyWeChat\Kernel\Support\str_random; /** * Class Encryptor. * * @author overtrue */ class Encryptor { public const ERROR_INVALID_SIGNATURE = -40001; // Signature verification failed public const ERROR_PARSE_XML = -40002; // Parse XML failed public const ERROR_CALC_SIGNATURE = -40003; // Calculating the signature failed public const ERROR_INVALID_AES_KEY = -40004; // Invalid AESKey public const ERROR_INVALID_APP_ID = -40005; // Check AppID failed public const ERROR_ENCRYPT_AES = -40006; // AES EncryptionInterface failed public const ERROR_DECRYPT_AES = -40007; // AES decryption failed public const ERROR_INVALID_XML = -40008; // Invalid XML public const ERROR_BASE64_ENCODE = -40009; // Base64 encoding failed public const ERROR_BASE64_DECODE = -40010; // Base64 decoding failed public const ERROR_XML_BUILD = -40011; // XML build failed public const ILLEGAL_BUFFER = -41003; // Illegal buffer /** * App id. * * @var string */ protected $appId; /** * App token. * * @var string */ protected $token; /** * @var string */ protected $aesKey; /** * Block size. * * @var int */ protected $blockSize = 32; /** * Constructor. * * @param string $appId * @param string|null $token * @param string|null $aesKey */ public function __construct(string $appId, string $token = null, string $aesKey = null) { $this->appId = $appId; $this->token = $token; $this->aesKey = base64_decode($aesKey.'=', true); } /** * Get the app token. * * @return string */ public function getToken(): string { return $this->token; } /** * Encrypt the message and return XML. * * @param string $xml * @param string $nonce * @param int $timestamp * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function encrypt($xml, $nonce = null, $timestamp = null): string { try { $xml = $this->pkcs7Pad(str_random(16).pack('N', strlen($xml)).$xml.$this->appId, $this->blockSize); $encrypted = base64_encode(AES::encrypt( $xml, $this->aesKey, substr($this->aesKey, 0, 16), OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING )); // @codeCoverageIgnoreStart } catch (Throwable $e) { throw new RuntimeException($e->getMessage(), self::ERROR_ENCRYPT_AES); } // @codeCoverageIgnoreEnd !is_null($nonce) || $nonce = substr($this->appId, 0, 10); !is_null($timestamp) || $timestamp = time(); $response = [ 'Encrypt' => $encrypted, 'MsgSignature' => $this->signature($this->token, $timestamp, $nonce, $encrypted), 'TimeStamp' => $timestamp, 'Nonce' => $nonce, ]; //生成响应xml return XML::build($response); } /** * Decrypt message. * * @param string $content * @param string $msgSignature * @param string $nonce * @param string $timestamp * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function decrypt($content, $msgSignature, $nonce, $timestamp): string { $signature = $this->signature($this->token, $timestamp, $nonce, $content); if ($signature !== $msgSignature) { throw new RuntimeException('Invalid Signature.', self::ERROR_INVALID_SIGNATURE); } $decrypted = AES::decrypt( base64_decode($content, true), $this->aesKey, substr($this->aesKey, 0, 16), OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING ); $result = $this->pkcs7Unpad($decrypted); $content = substr($result, 16, strlen($result)); $contentLen = unpack('N', substr($content, 0, 4))[1]; if (trim(substr($content, $contentLen + 4)) !== $this->appId) { throw new RuntimeException('Invalid appId.', self::ERROR_INVALID_APP_ID); } return substr($content, 4, $contentLen); } /** * Get SHA1. * * @return string */ public function signature(): string { $array = func_get_args(); sort($array, SORT_STRING); return sha1(implode($array)); } /** * PKCS#7 pad. * * @param string $text * @param int $blockSize * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function pkcs7Pad(string $text, int $blockSize): string { if ($blockSize > 256) { throw new RuntimeException('$blockSize may not be more than 256'); } $padding = $blockSize - (strlen($text) % $blockSize); $pattern = chr($padding); return $text.str_repeat($pattern, $padding); } /** * PKCS#7 unpad. * * @param string $text * * @return string */ public function pkcs7Unpad(string $text): string { $pad = ord(substr($text, -1)); if ($pad < 1 || $pad > $this->blockSize) { $pad = 0; } return substr($text, 0, (strlen($text) - $pad)); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Events/AccessTokenRefreshed.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Events; use EasyWeChat\Kernel\AccessToken; /** * Class AccessTokenRefreshed. * * @author mingyoung */ class AccessTokenRefreshed { /** * @var \EasyWeChat\Kernel\AccessToken */ public $accessToken; /** * @param \EasyWeChat\Kernel\AccessToken $accessToken */ public function __construct(AccessToken $accessToken) { $this->accessToken = $accessToken; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Events/ApplicationInitialized.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Events; use EasyWeChat\Kernel\ServiceContainer; /** * Class ApplicationInitialized. * * @author mingyoung */ class ApplicationInitialized { /** * @var \EasyWeChat\Kernel\ServiceContainer */ public $app; /** * @param \EasyWeChat\Kernel\ServiceContainer $app */ public function __construct(ServiceContainer $app) { $this->app = $app; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Events/HttpResponseCreated.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Events; use Psr\Http\Message\ResponseInterface; /** * Class HttpResponseCreated. * * @author mingyoung */ class HttpResponseCreated { /** * @var \Psr\Http\Message\ResponseInterface */ public $response; /** * @param \Psr\Http\Message\ResponseInterface $response */ public function __construct(ResponseInterface $response) { $this->response = $response; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Events/ServerGuardResponseCreated.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Events; use Symfony\Component\HttpFoundation\Response; /** * Class ServerGuardResponseCreated. * * @author mingyoung */ class ServerGuardResponseCreated { /** * @var \Symfony\Component\HttpFoundation\Response */ public $response; /** * @param \Symfony\Component\HttpFoundation\Response $response */ public function __construct(Response $response) { $this->response = $response; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/BadRequestException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Exceptions; /** * Class BadRequestException. * * @author overtrue */ class BadRequestException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/DecryptException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Exceptions; class DecryptException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/Exception.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Exceptions; use Exception as BaseException; /** * Class Exception. * * @author overtrue */ class Exception extends BaseException { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/HttpException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Exceptions; use Psr\Http\Message\ResponseInterface; /** * Class HttpException. * * @author overtrue */ class HttpException extends Exception { /** * @var \Psr\Http\Message\ResponseInterface|null */ public $response; /** * @var \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string|null */ public $formattedResponse; /** * HttpException constructor. * * @param string $message * @param \Psr\Http\Message\ResponseInterface|null $response * @param null $formattedResponse * @param int|null $code */ public function __construct($message, ResponseInterface $response = null, $formattedResponse = null, $code = null) { parent::__construct($message, $code); $this->response = $response; $this->formattedResponse = $formattedResponse; if ($response) { $response->getBody()->rewind(); } } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/InvalidArgumentException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Exceptions; /** * Class InvalidArgumentException. * * @author overtrue */ class InvalidArgumentException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/InvalidConfigException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Exceptions; /** * Class InvalidConfigException. * * @author overtrue */ class InvalidConfigException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/RuntimeException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Exceptions; /** * Class RuntimeException. * * @author overtrue */ class RuntimeException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Exceptions/UnboundServiceException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Exceptions; /** * Class InvalidConfigException. * * @author overtrue */ class UnboundServiceException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Helpers.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel; use EasyWeChat\Kernel\Contracts\Arrayable; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Support\Arr; use EasyWeChat\Kernel\Support\Collection; function data_get($data, $key, $default = null) { switch (true) { case is_array($data): return Arr::get($data, $key, $default); case $data instanceof Collection: return $data->get($key, $default); case $data instanceof Arrayable: return Arr::get($data->toArray(), $key, $default); case $data instanceof \ArrayIterator: return $data->getArrayCopy()[$key] ?? $default; case $data instanceof \ArrayAccess: return $data[$key] ?? $default; case $data instanceof \IteratorAggregate && $data->getIterator() instanceof \ArrayIterator: return $data->getIterator()->getArrayCopy()[$key] ?? $default; case is_object($data): return $data->{$key} ?? $default; default: throw new RuntimeException(sprintf('Can\'t access data with key "%s"', $key)); } } function data_to_array($data) { switch (true) { case is_array($data): return $data; case $data instanceof Collection: return $data->all(); case $data instanceof Arrayable: return $data->toArray(); case $data instanceof \IteratorAggregate && $data->getIterator() instanceof \ArrayIterator: return $data->getIterator()->getArrayCopy(); case $data instanceof \ArrayIterator: return $data->getArrayCopy(); default: throw new RuntimeException(sprintf('Can\'t transform data to array')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Http/Response.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Http; use EasyWeChat\Kernel\Support\Collection; use EasyWeChat\Kernel\Support\XML; use GuzzleHttp\Psr7\Response as GuzzleResponse; use Psr\Http\Message\ResponseInterface; /** * Class Response. * * @author overtrue */ class Response extends GuzzleResponse { /** * @return string */ public function getBodyContents() { $this->getBody()->rewind(); $contents = $this->getBody()->getContents(); $this->getBody()->rewind(); return $contents; } /** * @param \Psr\Http\Message\ResponseInterface $response * * @return \EasyWeChat\Kernel\Http\Response */ public static function buildFromPsrResponse(ResponseInterface $response) { return new static( $response->getStatusCode(), $response->getHeaders(), $response->getBody(), $response->getProtocolVersion(), $response->getReasonPhrase() ); } /** * Build to json. * * @return string */ public function toJson() { return json_encode($this->toArray()); } /** * Build to array. * * @return array */ public function toArray() { $content = $this->removeControlCharacters($this->getBodyContents()); if (false !== stripos($this->getHeaderLine('Content-Type'), 'xml') || 0 === stripos($content, 'toArray()); } /** * @return object */ public function toObject() { return json_decode($this->toJson()); } /** * @return bool|string */ public function __toString() { return $this->getBodyContents(); } /** * @param string $content * * @return string */ protected function removeControlCharacters(string $content) { return \preg_replace('/[\x00-\x1F\x80-\x9F]/u', '', \mb_convert_encoding($content, 'UTF-8', 'UTF-8')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Http/StreamResponse.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Http; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Support\File; /** * Class StreamResponse. * * @author overtrue */ class StreamResponse extends Response { /** * @param string $directory * @param string $filename * @param bool $appendSuffix * * @return bool|int * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function save(string $directory, string $filename = '', bool $appendSuffix = true) { $this->getBody()->rewind(); $directory = rtrim($directory, '/'); if (!is_dir($directory)) { mkdir($directory, 0755, true); // @codeCoverageIgnore } if (!is_writable($directory)) { throw new InvalidArgumentException(sprintf("'%s' is not writable.", $directory)); } $contents = $this->getBody()->getContents(); if (empty($contents) || '{' === $contents[0]) { throw new RuntimeException('Invalid media response content.'); } if (empty($filename)) { if (preg_match('/filename="(?.*?)"/', $this->getHeaderLine('Content-Disposition'), $match)) { $filename = $match['filename']; } else { $filename = md5($contents); } } if ($appendSuffix && empty(pathinfo($filename, PATHINFO_EXTENSION))) { $filename .= File::getStreamExt($contents); } file_put_contents($directory.'/'.$filename, $contents); return $filename; } /** * @param string $directory * @param string $filename * @param bool $appendSuffix * * @return bool|int * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function saveAs(string $directory, string $filename, bool $appendSuffix = true) { return $this->save($directory, $filename, $appendSuffix); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Log/LogManager.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Log; use EasyWeChat\Kernel\ServiceContainer; use InvalidArgumentException; use Monolog\Formatter\LineFormatter; use Monolog\Handler\ErrorLogHandler; use Monolog\Handler\FormattableHandlerInterface; use Monolog\Handler\HandlerInterface; use Monolog\Handler\RotatingFileHandler; use Monolog\Handler\SlackWebhookHandler; use Monolog\Handler\StreamHandler; use Monolog\Handler\SyslogHandler; use Monolog\Handler\WhatFailureGroupHandler; use Monolog\Logger as Monolog; use Psr\Log\LoggerInterface; /** * Class LogManager. * * @author overtrue */ class LogManager implements LoggerInterface { /** * @var \EasyWeChat\Kernel\ServiceContainer */ protected $app; /** * The array of resolved channels. * * @var array */ protected $channels = []; /** * The registered custom driver creators. * * @var array */ protected $customCreators = []; /** * The Log levels. * * @var array */ protected $levels = [ 'debug' => Monolog::DEBUG, 'info' => Monolog::INFO, 'notice' => Monolog::NOTICE, 'warning' => Monolog::WARNING, 'error' => Monolog::ERROR, 'critical' => Monolog::CRITICAL, 'alert' => Monolog::ALERT, 'emergency' => Monolog::EMERGENCY, ]; /** * LogManager constructor. * * @param \EasyWeChat\Kernel\ServiceContainer $app */ public function __construct(ServiceContainer $app) { $this->app = $app; } /** * Create a new, on-demand aggregate logger instance. * * @param array $channels * @param string|null $channel * * @return \Psr\Log\LoggerInterface * * @throws \Exception */ public function stack(array $channels, $channel = null) { return $this->createStackDriver(compact('channels', 'channel')); } /** * Get a log channel instance. * * @param string|null $channel * * @return mixed * * @throws \Exception */ public function channel($channel = null) { return $this->driver($channel); } /** * Get a log driver instance. * * @param string|null $driver * * @return mixed * * @throws \Exception */ public function driver($driver = null) { return $this->get($driver ?? $this->getDefaultDriver()); } /** * Attempt to get the log from the local cache. * * @param string $name * * @return \Psr\Log\LoggerInterface * * @throws \Exception */ protected function get($name) { try { return $this->channels[$name] ?? ($this->channels[$name] = $this->resolve($name)); } catch (\Throwable $e) { $logger = $this->createEmergencyLogger(); $logger->emergency('Unable to create configured logger. Using emergency logger.', [ 'exception' => $e, ]); return $logger; } } /** * Resolve the given log instance by name. * * @param string $name * * @return \Psr\Log\LoggerInterface * * @throws InvalidArgumentException */ protected function resolve($name) { $config = $this->app['config']->get(\sprintf('log.channels.%s', $name)); if (is_null($config)) { throw new InvalidArgumentException(\sprintf('Log [%s] is not defined.', $name)); } if (isset($this->customCreators[$config['driver']])) { return $this->callCustomCreator($config); } $driverMethod = 'create'.ucfirst($config['driver']).'Driver'; if (method_exists($this, $driverMethod)) { return $this->{$driverMethod}($config); } throw new InvalidArgumentException(\sprintf('Driver [%s] is not supported.', $config['driver'])); } /** * Create an emergency log handler to avoid white screens of death. * * @return \Monolog\Logger * * @throws \Exception */ protected function createEmergencyLogger() { return new Monolog('EasyWeChat', $this->prepareHandlers([new StreamHandler( \sys_get_temp_dir().'/easywechat/easywechat.log', $this->level(['level' => 'debug']) )])); } /** * Call a custom driver creator. * * @param array $config * * @return mixed */ protected function callCustomCreator(array $config) { return $this->customCreators[$config['driver']]($this->app, $config); } /** * Create an aggregate log driver instance. * * @param array $config * * @return \Monolog\Logger * * @throws \Exception */ protected function createStackDriver(array $config) { $handlers = []; foreach ($config['channels'] ?? [] as $channel) { $handlers = \array_merge($handlers, $this->channel($channel)->getHandlers()); } if ($config['ignore_exceptions'] ?? false) { $handlers = [new WhatFailureGroupHandler($handlers)]; } return new Monolog($this->parseChannel($config), $handlers); } /** * Create an instance of the single file log driver. * * @param array $config * * @return \Psr\Log\LoggerInterface * * @throws \Exception */ protected function createSingleDriver(array $config) { return new Monolog($this->parseChannel($config), [ $this->prepareHandler(new StreamHandler( $config['path'], $this->level($config), $config['bubble'] ?? true, $config['permission'] ?? null, $config['locking'] ?? false ), $config), ]); } /** * Create an instance of the daily file log driver. * * @param array $config * * @return \Psr\Log\LoggerInterface */ protected function createDailyDriver(array $config) { return new Monolog($this->parseChannel($config), [ $this->prepareHandler(new RotatingFileHandler( $config['path'], $config['days'] ?? 7, $this->level($config), $config['bubble'] ?? true, $config['permission'] ?? null, $config['locking'] ?? false ), $config), ]); } /** * Create an instance of the Slack log driver. * * @param array $config * * @return \Psr\Log\LoggerInterface * @throws \Monolog\Handler\MissingExtensionException */ protected function createSlackDriver(array $config) { return new Monolog($this->parseChannel($config), [ $this->prepareHandler(new SlackWebhookHandler( $config['url'], $config['channel'] ?? null, $config['username'] ?? 'EasyWeChat', $config['attachment'] ?? true, $config['emoji'] ?? ':boom:', $config['short'] ?? false, $config['context'] ?? true, $this->level($config), $config['bubble'] ?? true, $config['exclude_fields'] ?? [] ), $config), ]); } /** * Create an instance of the syslog log driver. * * @param array $config * * @return \Psr\Log\LoggerInterface */ protected function createSyslogDriver(array $config) { return new Monolog($this->parseChannel($config), [ $this->prepareHandler(new SyslogHandler( 'EasyWeChat', $config['facility'] ?? LOG_USER, $this->level($config) ), $config), ]); } /** * Create an instance of the "error log" log driver. * * @param array $config * * @return \Psr\Log\LoggerInterface */ protected function createErrorlogDriver(array $config) { return new Monolog($this->parseChannel($config), [ $this->prepareHandler( new ErrorLogHandler( $config['type'] ?? ErrorLogHandler::OPERATING_SYSTEM, $this->level($config) ) ), ]); } /** * Prepare the handlers for usage by Monolog. * * @param array $handlers * * @return array */ protected function prepareHandlers(array $handlers): array { foreach ($handlers as $key => $handler) { $handlers[$key] = $this->prepareHandler($handler); } return $handlers; } /** * Prepare the handler for usage by Monolog. * * @param \Monolog\Handler\HandlerInterface $handler * @param array $config * * @return \Monolog\Handler\HandlerInterface */ protected function prepareHandler(HandlerInterface $handler, array $config = []) { if (!isset($config['formatter'])) { if ($handler instanceof FormattableHandlerInterface) { $handler->setFormatter($this->formatter()); } } return $handler; } /** * Get a Monolog formatter instance. * * @return \Monolog\Formatter\FormatterInterface */ protected function formatter() { $formatter = new LineFormatter(null, null, true, true); $formatter->includeStacktraces(); return $formatter; } /** * Extract the log channel from the given configuration. * * @param array $config * * @return string */ protected function parseChannel(array $config): string { return $config['name'] ?? 'EasyWeChat'; } /** * Parse the string level into a Monolog constant. * * @param array $config * * @return int * * @throws InvalidArgumentException */ protected function level(array $config): int { $level = $config['level'] ?? 'debug'; if (isset($this->levels[$level])) { return $this->levels[$level]; } throw new InvalidArgumentException('Invalid log level.'); } /** * Get the default log driver name. * * @return string */ public function getDefaultDriver(): ?string { return $this->app['config']['log.default']; } /** * Set the default log driver name. * * @param string $name */ public function setDefaultDriver($name) { $this->app['config']['log.default'] = $name; } /** * Register a custom driver creator Closure. * * @param string $driver * @param \Closure $callback * * @return $this */ public function extend(string $driver, \Closure $callback): LogManager { $this->customCreators[$driver] = $callback->bindTo($this, $this); return $this; } /** * System is unusable. * * @param string $message * @param array $context * * @return void * * @throws \Exception */ public function emergency($message, array $context = []): void { $this->driver()->emergency($message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param array $context * * @return void * * @throws \Exception */ public function alert($message, array $context = []): void { $this->driver()->alert($message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param array $context * * @throws \Exception */ public function critical($message, array $context = []): void { $this->driver()->critical($message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param array $context * * @throws \Exception */ public function error($message, array $context = []): void { $this->driver()->error($message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param array $context * * @throws \Exception */ public function warning($message, array $context = []): void { $this->driver()->warning($message, $context); } /** * Normal but significant events. * * @param string $message * @param array $context * * @throws \Exception */ public function notice($message, array $context = []): void { $this->driver()->notice($message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param array $context * * @throws \Exception */ public function info($message, array $context = []): void { $this->driver()->info($message, $context); } /** * Detailed debug information. * * @param string $message * @param array $context * * @throws \Exception */ public function debug($message, array $context = []): void { $this->driver()->debug($message, $context); } /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @throws \Exception */ public function log($level, $message, array $context = []): void { $this->driver()->log($level, $message, $context); } /** * Dynamically call the default driver instance. * * @param string $method * @param array $parameters * * @throws \Exception */ public function __call($method, $parameters) { return $this->driver()->$method(...$parameters); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Article.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Article. */ class Article extends Message { /** * @var string */ protected $type = 'mpnews'; /** * Properties. * * @var array */ protected $properties = [ 'thumb_media_id', 'author', 'title', 'content', 'digest', 'source_url', 'show_cover', ]; /** * Aliases of attribute. * * @var array */ protected $jsonAliases = [ 'content_source_url' => 'source_url', 'show_cover_pic' => 'show_cover', ]; /** * @var array */ protected $required = [ 'thumb_media_id', 'title', 'content', 'show_cover', ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Card.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * Card.php. * * @author overtrue * @copyright 2015 overtrue * * @see https://github.com/overtrue * @see http://overtrue.me */ namespace EasyWeChat\Kernel\Messages; /** * Class Card. */ class Card extends Message { /** * Message type. * * @var string */ protected $type = 'wxcard'; /** * Properties. * * @var array */ protected $properties = ['card_id']; /** * Media constructor. * * @param string $cardId */ public function __construct(string $cardId) { parent::__construct(['card_id' => $cardId]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/DeviceEvent.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class DeviceEvent. * * @property string $media_id */ class DeviceEvent extends Message { /** * Messages type. * * @var string */ protected $type = 'device_event'; /** * Properties. * * @var array */ protected $properties = [ 'device_type', 'device_id', 'content', 'session_id', 'open_id', ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/DeviceText.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class DeviceText. * * @property string $content */ class DeviceText extends Message { /** * Messages type. * * @var string */ protected $type = 'device_text'; /** * Properties. * * @var array */ protected $properties = [ 'device_type', 'device_id', 'content', 'session_id', 'open_id', ]; public function toXmlArray() { return [ 'DeviceType' => $this->get('device_type'), 'DeviceID' => $this->get('device_id'), 'SessionID' => $this->get('session_id'), 'Content' => base64_encode($this->get('content')), ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/File.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Image. * * @property string $media_id */ class File extends Media { /** * @var string */ protected $type = 'file'; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Image.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Image. * * @property string $media_id */ class Image extends Media { /** * Messages type. * * @var string */ protected $type = 'image'; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/InteractiveTaskCard.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class InteractiveTaskCard. * * @description 企业微信 interactive_taskcard 任务卡片消息类型 * * @author xyj2156 * @date 2021年5月25日 15:21:03 * * @property string $title * @property string $description * @property string $url * @property string $task_id * @property array $btn */ class InteractiveTaskCard extends Message { /** * Messages type. * * @var string */ protected $type = 'interactive_taskcard'; /** * Properties. * * @var array */ protected $properties = [ 'title', 'description', 'url', 'task_id', 'btn', ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Link.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Link. */ class Link extends Message { /** * Messages type. * * @var string */ protected $type = 'link'; /** * Properties. * * @var array */ protected $properties = [ 'title', 'description', 'url', ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Location.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Location. */ class Location extends Message { /** * Messages type. * * @var string */ protected $type = 'location'; /** * Properties. * * @var array */ protected $properties = [ 'latitude', 'longitude', 'scale', 'label', 'precision', ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Media.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; use EasyWeChat\Kernel\Contracts\MediaInterface; use EasyWeChat\Kernel\Support\Str; /** * Class Media. */ class Media extends Message implements MediaInterface { /** * Properties. * * @var array */ protected $properties = ['media_id']; /** * @var array */ protected $required = [ 'media_id', ]; /** * MaterialClient constructor. * * @param string $mediaId * @param string $type * @param array $attributes */ public function __construct(string $mediaId, $type = null, array $attributes = []) { parent::__construct(array_merge(['media_id' => $mediaId], $attributes)); !empty($type) && $this->setType($type); } /** * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function getMediaId(): string { $this->checkRequiredAttributes(); return $this->get('media_id'); } public function toXmlArray() { return [ Str::studly($this->getType()) => [ 'MediaId' => $this->get('media_id'), ], ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Message.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; use EasyWeChat\Kernel\Contracts\MessageInterface; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Support\XML; use EasyWeChat\Kernel\Traits\HasAttributes; /** * Class Messages. */ abstract class Message implements MessageInterface { use HasAttributes; public const TEXT = 2; public const IMAGE = 4; public const VOICE = 8; public const VIDEO = 16; public const SHORT_VIDEO = 32; public const LOCATION = 64; public const LINK = 128; public const DEVICE_EVENT = 256; public const DEVICE_TEXT = 512; public const FILE = 1024; public const TEXT_CARD = 2048; public const TRANSFER = 4096; public const EVENT = 1048576; public const MINIPROGRAM_PAGE = 2097152; public const MINIPROGRAM_NOTICE = 4194304; public const ALL = self::TEXT | self::IMAGE | self::VOICE | self::VIDEO | self::SHORT_VIDEO | self::LOCATION | self::LINK | self::DEVICE_EVENT | self::DEVICE_TEXT | self::FILE | self::TEXT_CARD | self::TRANSFER | self::EVENT | self::MINIPROGRAM_PAGE | self::MINIPROGRAM_NOTICE; /** * @var string */ protected $type; /** * @var int */ protected $id; /** * @var string */ protected $to; /** * @var string */ protected $from; /** * @var array */ protected $properties = []; /** * @var array */ protected $jsonAliases = []; /** * Message constructor. * * @param array $attributes */ public function __construct(array $attributes = []) { $this->setAttributes($attributes); } /** * Return type name message. * * @return string */ public function getType(): string { return $this->type; } /** * @param string $type */ public function setType(string $type) { $this->type = $type; } /** * Magic getter. * * @param string $property * * @return mixed */ public function __get($property) { if (property_exists($this, $property)) { return $this->$property; } return $this->getAttribute($property); } /** * Magic setter. * * @param string $property * @param mixed $value * * @return Message */ public function __set($property, $value) { if (property_exists($this, $property)) { $this->$property = $value; } else { $this->setAttribute($property, $value); } return $this; } /** * @param array $appends * * @return array */ public function transformForJsonRequestWithoutType(array $appends = []) { return $this->transformForJsonRequest($appends, false); } /** * @param array $appends * @param bool $withType * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function transformForJsonRequest(array $appends = [], $withType = true): array { if (!$withType) { return $this->propertiesToArray([], $this->jsonAliases); } $messageType = $this->getType(); $data = array_merge(['msgtype' => $messageType], $appends); $data[$messageType] = array_merge($data[$messageType] ?? [], $this->propertiesToArray([], $this->jsonAliases)); return $data; } /** * @param array $appends * @param bool $returnAsArray * * @return string */ public function transformToXml(array $appends = [], bool $returnAsArray = false): string { $data = array_merge(['MsgType' => $this->getType()], $this->toXmlArray(), $appends); return $returnAsArray ? $data : XML::build($data); } /** * @param array $data * @param array $aliases * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function propertiesToArray(array $data, array $aliases = []): array { $this->checkRequiredAttributes(); foreach ($this->attributes as $property => $value) { if (is_null($value) && !$this->isRequired($property)) { continue; } $alias = array_search($property, $aliases, true); $data[$alias ?: $property] = $this->get($property); } return $data; } public function toXmlArray() { throw new RuntimeException(sprintf('Class "%s" cannot support transform to XML message.', __CLASS__)); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/MiniProgramPage.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class MiniProgramPage. */ class MiniProgramPage extends Message { protected $type = 'miniprogrampage'; protected $properties = [ 'title', 'appid', 'pagepath', 'thumb_media_id', ]; protected $required = [ 'thumb_media_id', 'appid', 'pagepath', ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/MiniprogramNotice.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Music. * * @property string $url * @property string $hq_url * @property string $title * @property string $description * @property string $thumb_media_id * @property string $format */ class Music extends Message { /** * Messages type. * * @var string */ protected $type = 'music'; /** * Properties. * * @var array */ protected $properties = [ 'title', 'description', 'url', 'hq_url', 'thumb_media_id', 'format', ]; /** * Aliases of attribute. * * @var array */ protected $jsonAliases = [ 'musicurl' => 'url', 'hqmusicurl' => 'hq_url', ]; public function toXmlArray() { $music = [ 'Music' => [ 'Title' => $this->get('title'), 'Description' => $this->get('description'), 'MusicUrl' => $this->get('url'), 'HQMusicUrl' => $this->get('hq_url'), ], ]; if ($thumbMediaId = $this->get('thumb_media_id')) { $music['Music']['ThumbMediaId'] = $thumbMediaId; } return $music; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/News.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class News. * * @author overtrue */ class News extends Message { /** * @var string */ protected $type = 'news'; /** * @var array */ protected $properties = [ 'items', ]; /** * News constructor. * * @param array $items */ public function __construct(array $items = []) { parent::__construct(compact('items')); } /** * @param array $data * @param array $aliases * * @return array */ public function propertiesToArray(array $data, array $aliases = []): array { return ['articles' => array_map(function ($item) { if ($item instanceof NewsItem) { return $item->toJsonArray(); } }, $this->get('items'))]; } public function toXmlArray() { $items = []; foreach ($this->get('items') as $item) { if ($item instanceof NewsItem) { $items[] = $item->toXmlArray(); } } return [ 'ArticleCount' => count($items), 'Articles' => $items, ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/NewsItem.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class NewsItem. */ class NewsItem extends Message { /** * Messages type. * * @var string */ protected $type = 'news'; /** * Properties. * * @var array */ protected $properties = [ 'title', 'description', 'url', 'image', ]; public function toJsonArray() { return [ 'title' => $this->get('title'), 'description' => $this->get('description'), 'url' => $this->get('url'), 'picurl' => $this->get('image'), ]; } public function toXmlArray() { return [ 'Title' => $this->get('title'), 'Description' => $this->get('description'), 'Url' => $this->get('url'), 'PicUrl' => $this->get('image'), ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Raw.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Raw. */ class Raw extends Message { /** * @var string */ protected $type = 'raw'; /** * Properties. * * @var array */ protected $properties = ['content']; /** * Constructor. * * @param string $content */ public function __construct(string $content) { parent::__construct(['content' => strval($content)]); } /** * @param array $appends * @param bool $withType * * @return array */ public function transformForJsonRequest(array $appends = [], $withType = true): array { return json_decode($this->content, true) ?? []; } public function __toString() { return $this->get('content') ?? ''; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/ReplyInteractiveTaskCard.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class ReplyInteractiveTaskCard * * @property array{'replace_name':string} $properties * * @description 专门为回复 InteractiveTaskCard 类型任务卡片消息而创建的类型 * @author xyj2156 * * @package App\Extend\EnterpriseApplication\BusinessWX\Message */ class ReplyInteractiveTaskCard extends Message { /** * Message Type * * @var string */ protected $type = 'update_taskcard'; /** * Properties. * * @var array */ protected $properties = [ 'replace_name', ]; /** * ReplyInteractiveTaskCard constructor. * * @param string $replace_name */ public function __construct(string $replace_name = '') { parent::__construct(compact('replace_name')); } public function toXmlArray() { return [ 'TaskCard' => [ 'ReplaceName' => $this->get('replace_name'), ], ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/ShortVideo.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class ShortVideo. * * @property string $title * @property string $media_id * @property string $description * @property string $thumb_media_id */ class ShortVideo extends Video { /** * Messages type. * * @var string */ protected $type = 'shortvideo'; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/TaskCard.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class TaskCard. * * @property string $title * @property string $description * @property string $url * @property string $task_id * @property array $btn */ class TaskCard extends Message { /** * Messages type. * * @var string */ protected $type = 'taskcard'; /** * Properties. * * @var array */ protected $properties = [ 'title', 'description', 'url', 'task_id', 'btn', ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Text.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Text. * * @property string $content */ class Text extends Message { /** * Message type. * * @var string */ protected $type = 'text'; /** * Properties. * * @var array */ protected $properties = ['content']; /** * Text constructor. * * @param string $content */ public function __construct(string $content = '') { parent::__construct(compact('content')); } /** * @return array */ public function toXmlArray() { return [ 'Content' => $this->get('content'), ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/TextCard.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Text. * * @property string $title * @property string $description * @property string $url */ class TextCard extends Message { /** * Messages type. * * @var string */ protected $type = 'textcard'; /** * Properties. * * @var array */ protected $properties = [ 'title', 'description', 'url', ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Transfer.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Transfer. * * @property string $to * @property string $account */ class Transfer extends Message { /** * Messages type. * * @var string */ protected $type = 'transfer_customer_service'; /** * Properties. * * @var array */ protected $properties = [ 'account', ]; /** * Transfer constructor. * * @param string|null $account */ public function __construct(string $account = null) { parent::__construct(compact('account')); } public function toXmlArray() { return empty($this->get('account')) ? [] : [ 'TransInfo' => [ 'KfAccount' => $this->get('account'), ], ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Video.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Video. * * @property string $video * @property string $title * @property string $media_id * @property string $description * @property string $thumb_media_id */ class Video extends Media { /** * Messages type. * * @var string */ protected $type = 'video'; /** * Properties. * * @var array */ protected $properties = [ 'title', 'description', 'media_id', 'thumb_media_id', ]; /** * Video constructor. * * @param string $mediaId * @param array $attributes */ public function __construct(string $mediaId, array $attributes = []) { parent::__construct($mediaId, 'video', $attributes); } public function toXmlArray() { return [ 'Video' => [ 'MediaId' => $this->get('media_id'), 'Title' => $this->get('title'), 'Description' => $this->get('description'), ], ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Messages/Voice.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Messages; /** * Class Voice. * * @property string $media_id */ class Voice extends Media { /** * Messages type. * * @var string */ protected $type = 'voice'; /** * Properties. * * @var array */ protected $properties = [ 'media_id', 'recognition', ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/ConfigServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Providers; use EasyWeChat\Kernel\Config; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ConfigServiceProvider. * * @author overtrue */ class ConfigServiceProvider implements ServiceProviderInterface { /** * Registers services on the given container. * * This method should only be used to configure services and parameters. * It should not get services. * * @param Container $pimple A container instance */ public function register(Container $pimple) { !isset($pimple['config']) && $pimple['config'] = function ($app) { return new Config($app->getConfig()); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/EventDispatcherServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Providers; use Pimple\Container; use Pimple\ServiceProviderInterface; use Symfony\Component\EventDispatcher\EventDispatcher; /** * Class EventDispatcherServiceProvider. * * @author mingyoung */ class EventDispatcherServiceProvider implements ServiceProviderInterface { /** * Registers services on the given container. * * This method should only be used to configure services and parameters. * It should not get services. * * @param Container $pimple A container instance */ public function register(Container $pimple) { !isset($pimple['events']) && $pimple['events'] = function ($app) { $dispatcher = new EventDispatcher(); foreach ($app->config->get('events.listen', []) as $event => $listeners) { foreach ($listeners as $listener) { $dispatcher->addListener($event, $listener); } } return $dispatcher; }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/ExtensionServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Providers; use EasyWeChatComposer\Extension; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ExtensionServiceProvider. * * @author overtrue */ class ExtensionServiceProvider implements ServiceProviderInterface { /** * Registers services on the given container. * * This method should only be used to configure services and parameters. * It should not get services. * * @param Container $pimple A container instance */ public function register(Container $pimple) { !isset($pimple['extension']) && $pimple['extension'] = function ($app) { return new Extension($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/HttpClientServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Providers; use GuzzleHttp\Client; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class HttpClientServiceProvider. * * @author overtrue */ class HttpClientServiceProvider implements ServiceProviderInterface { /** * Registers services on the given container. * * This method should only be used to configure services and parameters. * It should not get services. * * @param Container $pimple A container instance */ public function register(Container $pimple) { !isset($pimple['http_client']) && $pimple['http_client'] = function ($app) { return new Client($app['config']->get('http', [])); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/LogServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Providers; use EasyWeChat\Kernel\Log\LogManager; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class LoggingServiceProvider. * * @author overtrue */ class LogServiceProvider implements ServiceProviderInterface { /** * Registers services on the given container. * * This method should only be used to configure services and parameters. * It should not get services. * * @param Container $pimple A container instance */ public function register(Container $pimple) { !isset($pimple['log']) && $pimple['log'] = function ($app) { $config = $app['config']->get('log'); if (!empty($config)) { $app->rebind('config', $app['config']->merge($config)); } return new LogManager($app); }; !isset($pimple['logger']) && $pimple['logger'] = $pimple['log']; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Providers/RequestServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Providers; use Pimple\Container; use Pimple\ServiceProviderInterface; use Symfony\Component\HttpFoundation\Request; /** * Class RequestServiceProvider. * * @author overtrue */ class RequestServiceProvider implements ServiceProviderInterface { /** * Registers services on the given container. * * This method should only be used to configure services and parameters. * It should not get services. * * @param Container $pimple A container instance */ public function register(Container $pimple) { !isset($pimple['request']) && $pimple['request'] = function () { return Request::createFromGlobals(); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/ServerGuard.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel; use EasyWeChat\Kernel\Contracts\MessageInterface; use EasyWeChat\Kernel\Exceptions\BadRequestException; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Messages\Message; use EasyWeChat\Kernel\Messages\News; use EasyWeChat\Kernel\Messages\NewsItem; use EasyWeChat\Kernel\Messages\Raw as RawMessage; use EasyWeChat\Kernel\Messages\Text; use EasyWeChat\Kernel\Support\XML; use EasyWeChat\Kernel\Traits\Observable; use EasyWeChat\Kernel\Traits\ResponseCastable; use Symfony\Component\HttpFoundation\Response; /** * Class ServerGuard. * * 1. url 里的 signature 只是将 token+nonce+timestamp 得到的签名,只是用于验证当前请求的,在公众号环境下一直有 * 2. 企业号消息发送时是没有的,因为固定为完全模式,所以 url 里不会存在 signature, 只有 msg_signature 用于解密消息的 * * @author overtrue */ class ServerGuard { use Observable; use ResponseCastable; /** * @var bool */ protected $alwaysValidate = false; /** * Empty string. */ public const SUCCESS_EMPTY_RESPONSE = 'success'; /** * @var array */ public const MESSAGE_TYPE_MAPPING = [ 'text' => Message::TEXT, 'image' => Message::IMAGE, 'voice' => Message::VOICE, 'video' => Message::VIDEO, 'shortvideo' => Message::SHORT_VIDEO, 'location' => Message::LOCATION, 'link' => Message::LINK, 'device_event' => Message::DEVICE_EVENT, 'device_text' => Message::DEVICE_TEXT, 'event' => Message::EVENT, 'file' => Message::FILE, 'miniprogrampage' => Message::MINIPROGRAM_PAGE, ]; /** * @var \EasyWeChat\Kernel\ServiceContainer */ protected $app; /** * Constructor. * * @codeCoverageIgnore * * @param \EasyWeChat\Kernel\ServiceContainer $app */ public function __construct(ServiceContainer $app) { $this->app = $app; foreach ($this->app->extension->observers() as $observer) { call_user_func_array([$this, 'push'], $observer); } } /** * Handle and return response. * * @return Response * * @throws BadRequestException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function serve(): Response { $this->app['logger']->debug('Request received:', [ 'method' => $this->app['request']->getMethod(), 'uri' => $this->app['request']->getUri(), 'content-type' => $this->app['request']->getContentType(), 'content' => $this->app['request']->getContent(), ]); $response = $this->validate()->resolve(); $this->app['logger']->debug('Server response created:', ['content' => $response->getContent()]); return $response; } /** * @return $this * * @throws \EasyWeChat\Kernel\Exceptions\BadRequestException */ public function validate() { if (!$this->alwaysValidate && !$this->isSafeMode()) { return $this; } if ($this->app['request']->get('signature') !== $this->signature([ $this->getToken(), $this->app['request']->get('timestamp'), $this->app['request']->get('nonce'), ])) { throw new BadRequestException('Invalid request signature.', 400); } return $this; } /** * Force validate request. * * @return $this */ public function forceValidate() { $this->alwaysValidate = true; return $this; } /** * Get request message. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|string * * @throws BadRequestException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getMessage() { $message = $this->parseMessage($this->app['request']->getContent(false)); if (!is_array($message) || empty($message)) { throw new BadRequestException('No message received.'); } if ($this->isSafeMode() && !empty($message['Encrypt'])) { $message = $this->decryptMessage($message); // Handle JSON format. $dataSet = json_decode($message, true); if ($dataSet && (JSON_ERROR_NONE === json_last_error())) { return $dataSet; } $message = XML::parse($message); } return $this->detectAndCastResponseToType($message, $this->app->config->get('response_type')); } /** * Resolve server request and return the response. * * @return \Symfony\Component\HttpFoundation\Response * * @throws \EasyWeChat\Kernel\Exceptions\BadRequestException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ protected function resolve(): Response { $result = $this->handleRequest(); if ($this->shouldReturnRawResponse()) { $response = new Response($result['response']); } else { $response = new Response( $this->buildResponse($result['to'], $result['from'], $result['response']), 200, ['Content-Type' => 'application/xml'] ); } $this->app->events->dispatch(new Events\ServerGuardResponseCreated($response)); return $response; } /** * @return string|null */ protected function getToken() { return $this->app['config']['token']; } /** * @param string $to * @param string $from * @param \EasyWeChat\Kernel\Contracts\MessageInterface|string|int $message * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function buildResponse(string $to, string $from, $message) { if (empty($message) || self::SUCCESS_EMPTY_RESPONSE === $message) { return self::SUCCESS_EMPTY_RESPONSE; } if ($message instanceof RawMessage) { return $message->get('content', self::SUCCESS_EMPTY_RESPONSE); } if (is_string($message) || is_numeric($message)) { $message = new Text((string) $message); } if (is_array($message) && reset($message) instanceof NewsItem) { $message = new News($message); } if (!($message instanceof Message)) { throw new InvalidArgumentException(sprintf('Invalid Messages type "%s".', gettype($message))); } return $this->buildReply($to, $from, $message); } /** * Handle request. * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\BadRequestException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ protected function handleRequest(): array { $castedMessage = $this->getMessage(); $messageArray = $this->detectAndCastResponseToType($castedMessage, 'array'); $response = $this->dispatch(self::MESSAGE_TYPE_MAPPING[$messageArray['MsgType'] ?? $messageArray['msg_type'] ?? 'text'], $castedMessage); return [ 'to' => $messageArray['FromUserName'] ?? '', 'from' => $messageArray['ToUserName'] ?? '', 'response' => $response, ]; } /** * Build reply XML. * * @param string $to * @param string $from * @param \EasyWeChat\Kernel\Contracts\MessageInterface $message * * @return string */ protected function buildReply(string $to, string $from, MessageInterface $message): string { $prepends = [ 'ToUserName' => $to, 'FromUserName' => $from, 'CreateTime' => time(), 'MsgType' => $message->getType(), ]; $response = $message->transformToXml($prepends); if ($this->isSafeMode()) { $this->app['logger']->debug('Messages safe mode is enabled.'); $response = $this->app['encryptor']->encrypt($response); } return $response; } /** * @param array $params * * @return string */ protected function signature(array $params) { sort($params, SORT_STRING); return sha1(implode($params)); } /** * Parse message array from raw php input. * * @param string $content * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\BadRequestException */ protected function parseMessage($content) { try { if (0 === stripos($content, '<')) { $content = XML::parse($content); } else { // Handle JSON format. $dataSet = json_decode($content, true); if ($dataSet && (JSON_ERROR_NONE === json_last_error())) { $content = $dataSet; } } return (array) $content; } catch (\Exception $e) { throw new BadRequestException(sprintf('Invalid message content:(%s) %s', $e->getCode(), $e->getMessage()), $e->getCode()); } } /** * Check the request message safe mode. * * @return bool */ protected function isSafeMode(): bool { return $this->app['request']->get('signature') && 'aes' === $this->app['request']->get('encrypt_type'); } /** * @return bool */ protected function shouldReturnRawResponse(): bool { return false; } /** * @param array $message * * @return mixed */ protected function decryptMessage(array $message) { return $message = $this->app['encryptor']->decrypt( $message['Encrypt'], $this->app['request']->get('msg_signature'), $this->app['request']->get('nonce'), $this->app['request']->get('timestamp') ); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/ServiceContainer.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel; use EasyWeChat\Kernel\Providers\ConfigServiceProvider; use EasyWeChat\Kernel\Providers\EventDispatcherServiceProvider; use EasyWeChat\Kernel\Providers\ExtensionServiceProvider; use EasyWeChat\Kernel\Providers\HttpClientServiceProvider; use EasyWeChat\Kernel\Providers\LogServiceProvider; use EasyWeChat\Kernel\Providers\RequestServiceProvider; use EasyWeChatComposer\Traits\WithAggregator; use Pimple\Container; /** * Class ServiceContainer. * * @author overtrue * * @property \EasyWeChat\Kernel\Config $config * @property \Symfony\Component\HttpFoundation\Request $request * @property \GuzzleHttp\Client $http_client * @property \Monolog\Logger $logger * @property \Symfony\Component\EventDispatcher\EventDispatcher $events */ class ServiceContainer extends Container { use WithAggregator; /** * @var string */ protected $id; /** * @var array */ protected $providers = []; /** * @var array */ protected $defaultConfig = []; /** * @var array */ protected $userConfig = []; /** * Constructor. * * @param array $config * @param array $prepends * @param string|null $id */ public function __construct(array $config = [], array $prepends = [], string $id = null) { $this->userConfig = $config; parent::__construct($prepends); $this->registerProviders($this->getProviders()); $this->id = $id; $this->aggregate(); $this->events->dispatch(new Events\ApplicationInitialized($this)); } /** * @return string */ public function getId() { return $this->id ?? $this->id = md5(json_encode($this->userConfig)); } /** * @return array */ public function getConfig() { $base = [ // http://docs.guzzlephp.org/en/stable/request-options.html 'http' => [ 'timeout' => 30.0, 'base_uri' => 'https://api.weixin.qq.com/', ], ]; return array_replace_recursive($base, $this->defaultConfig, $this->userConfig); } /** * Return all providers. * * @return array */ public function getProviders() { return array_merge([ ConfigServiceProvider::class, LogServiceProvider::class, RequestServiceProvider::class, HttpClientServiceProvider::class, ExtensionServiceProvider::class, EventDispatcherServiceProvider::class, ], $this->providers); } /** * @param string $id * @param mixed $value */ public function rebind($id, $value) { $this->offsetUnset($id); $this->offsetSet($id, $value); } /** * Magic get access. * * @param string $id * * @return mixed */ public function __get($id) { if ($this->shouldDelegate($id)) { return $this->delegateTo($id); } return $this->offsetGet($id); } /** * Magic set access. * * @param string $id * @param mixed $value */ public function __set($id, $value) { $this->offsetSet($id, $value); } /** * @param array $providers */ public function registerProviders(array $providers) { foreach ($providers as $provider) { parent::register(new $provider()); } } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/AES.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Support; /** * Class AES. * * @author overtrue */ class AES { /** * @param string $text * @param string $key * @param string $iv * @param int $option * * @return string */ public static function encrypt(string $text, string $key, string $iv, int $option = OPENSSL_RAW_DATA): string { self::validateKey($key); self::validateIv($iv); return openssl_encrypt($text, self::getMode($key), $key, $option, $iv); } /** * @param string $cipherText * @param string $key * @param string $iv * @param int $option * @param string|null $method * * @return string */ public static function decrypt(string $cipherText, string $key, string $iv, int $option = OPENSSL_RAW_DATA, $method = null): string { self::validateKey($key); self::validateIv($iv); return openssl_decrypt($cipherText, $method ?: self::getMode($key), $key, $option, $iv); } /** * @param string $key * * @return string */ public static function getMode($key) { return 'aes-'.(8 * strlen($key)).'-cbc'; } /** * @param string $key */ public static function validateKey(string $key) { if (!in_array(strlen($key), [16, 24, 32], true)) { throw new \InvalidArgumentException(sprintf('Key length must be 16, 24, or 32 bytes; got key len (%s).', strlen($key))); } } /** * @param string $iv * * @throws \InvalidArgumentException */ public static function validateIv(string $iv) { if (!empty($iv) && 16 !== strlen($iv)) { throw new \InvalidArgumentException('IV length must be 16 bytes.'); } } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/Arr.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Support; /** * Array helper from Illuminate\Support\Arr. */ class Arr { /** * Add an element to an array using "dot" notation if it doesn't exist. * * @param array $array * @param string $key * @param mixed $value * * @return array */ public static function add(array $array, $key, $value) { if (is_null(static::get($array, $key))) { static::set($array, $key, $value); } return $array; } /** * Cross join the given arrays, returning all possible permutations. * * @param array ...$arrays * * @return array */ public static function crossJoin(...$arrays) { $results = [[]]; foreach ($arrays as $index => $array) { $append = []; foreach ($results as $product) { foreach ($array as $item) { $product[$index] = $item; $append[] = $product; } } $results = $append; } return $results; } /** * Divide an array into two arrays. One with keys and the other with values. * * @param array $array * * @return array */ public static function divide(array $array) { return [array_keys($array), array_values($array)]; } /** * Flatten a multi-dimensional associative array with dots. * * @param array $array * @param string $prepend * * @return array */ public static function dot(array $array, $prepend = '') { $results = []; foreach ($array as $key => $value) { if (is_array($value) && !empty($value)) { $results = array_merge($results, static::dot($value, $prepend.$key.'.')); } else { $results[$prepend.$key] = $value; } } return $results; } /** * Get all of the given array except for a specified array of items. * * @param array $array * @param array|string $keys * * @return array */ public static function except(array $array, $keys) { static::forget($array, $keys); return $array; } /** * Determine if the given key exists in the provided array. * * @param array $array * @param string|int $key * * @return bool */ public static function exists(array $array, $key) { return array_key_exists($key, $array); } /** * Return the first element in an array passing a given truth test. * * @param array $array * @param callable|null $callback * @param mixed $default * * @return mixed */ public static function first(array $array, callable $callback = null, $default = null) { if (is_null($callback)) { if (empty($array)) { return $default; } foreach ($array as $item) { return $item; } } foreach ($array as $key => $value) { if (call_user_func($callback, $value, $key)) { return $value; } } return $default; } /** * Return the last element in an array passing a given truth test. * * @param array $array * @param callable|null $callback * @param mixed $default * * @return mixed */ public static function last(array $array, callable $callback = null, $default = null) { if (is_null($callback)) { return empty($array) ? $default : end($array); } return static::first(array_reverse($array, true), $callback, $default); } /** * Flatten a multi-dimensional array into a single level. * * @param array $array * @param int $depth * * @return array */ public static function flatten(array $array, $depth = \PHP_INT_MAX) { return array_reduce($array, function ($result, $item) use ($depth) { $item = $item instanceof Collection ? $item->all() : $item; if (!is_array($item)) { return array_merge($result, [$item]); } elseif (1 === $depth) { return array_merge($result, array_values($item)); } return array_merge($result, static::flatten($item, $depth - 1)); }, []); } /** * Remove one or many array items from a given array using "dot" notation. * * @param array $array * @param array|string $keys */ public static function forget(array &$array, $keys) { $original = &$array; $keys = (array) $keys; if (0 === count($keys)) { return; } foreach ($keys as $key) { // if the exact key exists in the top-level, remove it if (static::exists($array, $key)) { unset($array[$key]); continue; } $parts = explode('.', $key); // clean up before each pass $array = &$original; while (count($parts) > 1) { $part = array_shift($parts); if (isset($array[$part]) && is_array($array[$part])) { $array = &$array[$part]; } else { continue 2; } } unset($array[array_shift($parts)]); } } /** * Get an item from an array using "dot" notation. * * @param array $array * @param string $key * @param mixed $default * * @return mixed */ public static function get(array $array, $key, $default = null) { if (is_null($key)) { return $array; } if (static::exists($array, $key)) { return $array[$key]; } foreach (explode('.', $key) as $segment) { if (static::exists($array, $segment)) { $array = $array[$segment]; } else { return $default; } } return $array; } /** * Check if an item or items exist in an array using "dot" notation. * * @param array $array * @param string|array $keys * * @return bool */ public static function has(array $array, $keys) { if (is_null($keys)) { return false; } $keys = (array) $keys; if (empty($array)) { return false; } if ($keys === []) { return false; } foreach ($keys as $key) { $subKeyArray = $array; if (static::exists($array, $key)) { continue; } foreach (explode('.', $key) as $segment) { if (static::exists($subKeyArray, $segment)) { $subKeyArray = $subKeyArray[$segment]; } else { return false; } } } return true; } /** * Determines if an array is associative. * * An array is "associative" if it doesn't have sequential numerical keys beginning with zero. * * @param array $array * * @return bool */ public static function isAssoc(array $array) { $keys = array_keys($array); return array_keys($keys) !== $keys; } /** * Get a subset of the items from the given array. * * @param array $array * @param array|string $keys * * @return array */ public static function only(array $array, $keys) { return array_intersect_key($array, array_flip((array) $keys)); } /** * Push an item onto the beginning of an array. * * @param array $array * @param mixed $value * @param mixed $key * * @return array */ public static function prepend(array $array, $value, $key = null) { if (is_null($key)) { array_unshift($array, $value); } else { $array = [$key => $value] + $array; } return $array; } /** * Get a value from the array, and remove it. * * @param array $array * @param string $key * @param mixed $default * * @return mixed */ public static function pull(array &$array, $key, $default = null) { $value = static::get($array, $key, $default); static::forget($array, $key); return $value; } /** * Get a 1 value from an array. * * @param array $array * @param int|null $amount * * @return mixed * * @throws \InvalidArgumentException */ public static function random(array $array, int $amount = null) { if (is_null($amount)) { return $array[array_rand($array)]; } $keys = array_rand($array, $amount); $results = []; foreach ((array) $keys as $key) { $results[] = $array[$key]; } return $results; } /** * Set an array item to a given value using "dot" notation. * * If no key is given to the method, the entire array will be replaced. * * @param array $array * @param string $key * @param mixed $value * * @return array */ public static function set(array &$array, string $key, $value) { $keys = explode('.', $key); while (count($keys) > 1) { $key = array_shift($keys); // If the key doesn't exist at this depth, we will just create an empty array // to hold the next value, allowing us to create the arrays to hold final // values at the correct depth. Then we'll keep digging into the array. if (!isset($array[$key]) || !is_array($array[$key])) { $array[$key] = []; } $array = &$array[$key]; } $array[array_shift($keys)] = $value; return $array; } /** * Filter the array using the given callback. * * @param array $array * @param callable $callback * * @return array */ public static function where(array $array, callable $callback) { return array_filter($array, $callback, ARRAY_FILTER_USE_BOTH); } /** * If the given value is not an array, wrap it in one. * * @param mixed $value * * @return array */ public static function wrap($value) { return !is_array($value) ? [$value] : $value; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/ArrayAccessible.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Support; use ArrayAccess; use ArrayIterator; use EasyWeChat\Kernel\Contracts\Arrayable; use IteratorAggregate; /** * Class ArrayAccessible. * * @author overtrue */ class ArrayAccessible implements ArrayAccess, IteratorAggregate, Arrayable { private $array; public function __construct(array $array = []) { $this->array = $array; } public function offsetExists($offset) { return array_key_exists($offset, $this->array); } public function offsetGet($offset) { return $this->array[$offset]; } public function offsetSet($offset, $value) { if (null === $offset) { $this->array[] = $value; } else { $this->array[$offset] = $value; } } public function offsetUnset($offset) { unset($this->array[$offset]); } public function getIterator() { return new ArrayIterator($this->array); } public function toArray() { return $this->array; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/Collection.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Support; use ArrayAccess; use ArrayIterator; use Countable; use EasyWeChat\Kernel\Contracts\Arrayable; use IteratorAggregate; use JsonSerializable; use Serializable; /** * Class Collection. */ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Serializable, Arrayable { /** * The collection data. * * @var array */ protected $items = []; /** * set data. * * @param array $items */ public function __construct(array $items = []) { foreach ($items as $key => $value) { $this->set($key, $value); } } /** * Return all items. * * @return array */ public function all() { return $this->items; } /** * Return specific items. * * @param array $keys * * @return \EasyWeChat\Kernel\Support\Collection */ public function only(array $keys) { $return = []; foreach ($keys as $key) { $value = $this->get($key); if (!is_null($value)) { $return[$key] = $value; } } return new static($return); } /** * Get all items except for those with the specified keys. * * @param mixed $keys * * @return static */ public function except($keys) { $keys = is_array($keys) ? $keys : func_get_args(); return new static(Arr::except($this->items, $keys)); } /** * Merge data. * * @param Collection|array $items * * @return \EasyWeChat\Kernel\Support\Collection */ public function merge($items) { $clone = new static($this->all()); foreach ($items as $key => $value) { $clone->set($key, $value); } return $clone; } /** * To determine Whether the specified element exists. * * @param string $key * * @return bool */ public function has($key) { return !is_null(Arr::get($this->items, $key)); } /** * Retrieve the first item. * * @return mixed */ public function first() { return reset($this->items); } /** * Retrieve the last item. * * @return bool */ public function last() { $end = end($this->items); reset($this->items); return $end; } /** * add the item value. * * @param string $key * @param mixed $value */ public function add($key, $value) { Arr::set($this->items, $key, $value); } /** * Set the item value. * * @param string $key * @param mixed $value */ public function set($key, $value) { Arr::set($this->items, $key, $value); } /** * Retrieve item from Collection. * * @param string $key * @param mixed $default * * @return mixed */ public function get($key, $default = null) { return Arr::get($this->items, $key, $default); } /** * Remove item form Collection. * * @param string $key */ public function forget($key) { Arr::forget($this->items, $key); } /** * Build to array. * * @return array */ public function toArray() { return $this->all(); } /** * Build to json. * * @param int $option * * @return string */ public function toJson($option = JSON_UNESCAPED_UNICODE) { return json_encode($this->all(), $option); } /** * To string. * * @return string */ public function __toString() { return $this->toJson(); } /** * (PHP 5 >= 5.4.0)
        * Specify data which should be serialized to JSON. * * @see http://php.net/manual/en/jsonserializable.jsonserialize.php * * @return mixed data which can be serialized by json_encode, * which is a value of any type other than a resource */ #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->items; } public function __serialize(): array { return $this->items; } /** * (PHP 5 >= 5.1.0)
        * String representation of object. * * @see http://php.net/manual/en/serializable.serialize.php * * @return string the string representation of the object or null */ public function serialize() { return serialize($this->items); } /** * (PHP 5 >= 5.0.0)
        * Retrieve an external iterator. * * @see http://php.net/manual/en/iteratoraggregate.getiterator.php * * @return \ArrayIterator An instance of an object implementing Iterator or * Traversable */ #[\ReturnTypeWillChange] public function getIterator() { return new ArrayIterator($this->items); } /** * (PHP 5 >= 5.1.0)
        * Count elements of an object. * * @see http://php.net/manual/en/countable.count.php * * @return int the custom count as an integer. *

        *

        * The return value is cast to an integer */ #[\ReturnTypeWillChange] public function count() { return count($this->items); } public function __unserialize(array $data): void { $this->items = $data; } /** * (PHP 5 >= 5.1.0)
        * Constructs the object. * * @see http://php.net/manual/en/serializable.unserialize.php * * @param string $serialized

        * The string representation of the object. *

        * * @return mixed|void */ public function unserialize($serialized) { return $this->items = unserialize($serialized); } /** * Get a data by key. * * @param string $key * * @return mixed */ public function __get($key) { return $this->get($key); } /** * Assigns a value to the specified data. * * @param string $key * @param mixed $value */ public function __set($key, $value) { $this->set($key, $value); } /** * Whether or not an data exists by key. * * @param string $key * * @return bool */ public function __isset($key) { return $this->has($key); } /** * Unset an data by key. * * @param string $key */ public function __unset($key) { $this->forget($key); } /** * var_export. * * @param array $properties * * @return array */ public static function __set_state(array $properties) { return (new static($properties))->all(); } /** * (PHP 5 >= 5.0.0)
        * Whether a offset exists. * * @see http://php.net/manual/en/arrayaccess.offsetexists.php * * @param mixed $offset

        * An offset to check for. *

        * * @return bool true on success or false on failure. * The return value will be casted to boolean if non-boolean was returned */ #[\ReturnTypeWillChange] public function offsetExists($offset) { return $this->has($offset); } /** * (PHP 5 >= 5.0.0)
        * Offset to unset. * * @see http://php.net/manual/en/arrayaccess.offsetunset.php * * @param mixed $offset

        * The offset to unset. *

        */ #[\ReturnTypeWillChange] public function offsetUnset($offset) { if ($this->offsetExists($offset)) { $this->forget($offset); } } /** * (PHP 5 >= 5.0.0)
        * Offset to retrieve. * * @see http://php.net/manual/en/arrayaccess.offsetget.php * * @param mixed $offset

        * The offset to retrieve. *

        * * @return mixed Can return all value types */ #[\ReturnTypeWillChange] public function offsetGet($offset) { return $this->offsetExists($offset) ? $this->get($offset) : null; } /** * (PHP 5 >= 5.0.0)
        * Offset to set. * * @see http://php.net/manual/en/arrayaccess.offsetset.php * * @param mixed $offset

        * The offset to assign the value to. *

        * @param mixed $value

        * The value to set. *

        */ #[\ReturnTypeWillChange] public function offsetSet($offset, $value) { $this->set($offset, $value); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/File.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Support; use finfo; /** * Class File. */ class File { /** * MIME mapping. * * @var array */ protected static $extensionMap = [ 'audio/wav' => '.wav', 'audio/x-ms-wma' => '.wma', 'video/x-ms-wmv' => '.wmv', 'video/mp4' => '.mp4', 'audio/mpeg' => '.mp3', 'audio/amr' => '.amr', 'application/vnd.rn-realmedia' => '.rm', 'audio/mid' => '.mid', 'image/bmp' => '.bmp', 'image/gif' => '.gif', 'image/png' => '.png', 'image/tiff' => '.tiff', 'image/jpeg' => '.jpg', 'application/pdf' => '.pdf', // 列举更多的文件 mime, 企业号是支持的,公众平台这边之后万一也更新了呢 'application/msword' => '.doc', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => '.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => '.dotx', 'application/vnd.ms-word.document.macroEnabled.12' => '.docm', 'application/vnd.ms-word.template.macroEnabled.12' => '.dotm', 'application/vnd.ms-excel' => '.xls', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => '.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => '.xltx', 'application/vnd.ms-excel.sheet.macroEnabled.12' => '.xlsm', 'application/vnd.ms-excel.template.macroEnabled.12' => '.xltm', 'application/vnd.ms-excel.addin.macroEnabled.12' => '.xlam', 'application/vnd.ms-excel.sheet.binary.macroEnabled.12' => '.xlsb', 'application/vnd.ms-powerpoint' => '.ppt', 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => '.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.template' => '.potx', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => '.ppsx', 'application/vnd.ms-powerpoint.addin.macroEnabled.12' => '.ppam', ]; /** * File header signatures. * * @var array */ protected static $signatures = [ 'ffd8ff' => '.jpg', '424d' => '.bmp', '47494638' => '.gif', '2f55736572732f6f7665' => '.png', '89504e47' => '.png', '494433' => '.mp3', 'fffb' => '.mp3', 'fff3' => '.mp3', '3026b2758e66cf11' => '.wma', '52494646' => '.wav', '57415645' => '.wav', '41564920' => '.avi', '000001ba' => '.mpg', '000001b3' => '.mpg', '2321414d52' => '.amr', '25504446' => '.pdf', ]; /** * Return steam extension. * * @param string $stream * * @return string|false */ public static function getStreamExt($stream) { $ext = self::getExtBySignature($stream); try { if (empty($ext) && is_readable($stream)) { $stream = file_get_contents($stream); } } catch (\Exception $e) { } $fileInfo = new finfo(FILEINFO_MIME); $mime = strstr($fileInfo->buffer($stream), ';', true); return isset(self::$extensionMap[$mime]) ? self::$extensionMap[$mime] : $ext; } /** * Get file extension by file header signature. * * @param string $stream * * @return string */ public static function getExtBySignature($stream) { $prefix = strval(bin2hex(mb_strcut($stream, 0, 10))); foreach (self::$signatures as $signature => $extension) { if (0 === strpos($prefix, strval($signature))) { return $extension; } } return ''; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/Helpers.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Support; /* * helpers. * * @author overtrue */ /** * Generate a signature. * * @param array $attributes * @param string $key * @param string $encryptMethod * * @return string */ function generate_sign(array $attributes, $key, $encryptMethod = 'md5') { ksort($attributes); $attributes['key'] = $key; return strtoupper(call_user_func_array($encryptMethod, [urldecode(http_build_query($attributes))])); } /** * @param string $signType * @param string $secretKey * * @return \Closure|string */ function get_encrypt_method(string $signType, string $secretKey = '') { if ('HMAC-SHA256' === $signType) { return function ($str) use ($secretKey) { return hash_hmac('sha256', $str, $secretKey); }; } return 'md5'; } /** * Get client ip. * * @return string */ function get_client_ip() { if (!empty($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } else { // for php-cli(phpunit etc.) $ip = defined('PHPUNIT_RUNNING') ? '127.0.0.1' : gethostbyname(gethostname()); } return filter_var($ip, FILTER_VALIDATE_IP) ?: '127.0.0.1'; } /** * Get current server ip. * * @return string */ function get_server_ip() { if (!empty($_SERVER['SERVER_ADDR'])) { $ip = $_SERVER['SERVER_ADDR']; } elseif (!empty($_SERVER['SERVER_NAME'])) { $ip = gethostbyname($_SERVER['SERVER_NAME']); } else { // for php-cli(phpunit etc.) $ip = defined('PHPUNIT_RUNNING') ? '127.0.0.1' : gethostbyname(gethostname()); } return filter_var($ip, FILTER_VALIDATE_IP) ?: '127.0.0.1'; } /** * Return current url. * * @return string */ function current_url() { $protocol = 'http://'; if ((!empty($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS']) || ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? 'http') === 'https') { $protocol = 'https://'; } return $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; } /** * Return random string. * * @param string $length * * @return string */ function str_random($length) { return Str::random($length); } /** * @param string $content * @param string $publicKey * * @return string */ function rsa_public_encrypt($content, $publicKey) { $encrypted = ''; openssl_public_encrypt($content, $encrypted, openssl_pkey_get_public($publicKey), OPENSSL_PKCS1_OAEP_PADDING); return base64_encode($encrypted); } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/Str.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Support; use EasyWeChat\Kernel\Exceptions\RuntimeException; /** * Class Str. */ class Str { /** * The cache of snake-cased words. * * @var array */ protected static $snakeCache = []; /** * The cache of camel-cased words. * * @var array */ protected static $camelCache = []; /** * The cache of studly-cased words. * * @var array */ protected static $studlyCache = []; /** * Convert a value to camel case. * * @param string $value * * @return string */ public static function camel($value) { if (isset(static::$camelCache[$value])) { return static::$camelCache[$value]; } return static::$camelCache[$value] = lcfirst(static::studly($value)); } /** * Generate a more truly "random" alpha-numeric string. * * @param int $length * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public static function random($length = 16) { $string = ''; while (($len = strlen($string)) < $length) { $size = $length - $len; $bytes = static::randomBytes($size); $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size); } return $string; } /** * Generate a more truly "random" bytes. * * @param int $length * * @return string * * @throws RuntimeException * * @codeCoverageIgnore * * @throws \Exception */ public static function randomBytes($length = 16) { if (function_exists('random_bytes')) { $bytes = random_bytes($length); } elseif (function_exists('openssl_random_pseudo_bytes')) { $bytes = openssl_random_pseudo_bytes($length, $strong); if (false === $bytes || false === $strong) { throw new RuntimeException('Unable to generate random string.'); } } else { throw new RuntimeException('OpenSSL extension is required for PHP 5 users.'); } return $bytes; } /** * Generate a "random" alpha-numeric string. * * Should not be considered sufficient for cryptography, etc. * * @param int $length * * @return string */ public static function quickRandom($length = 16) { $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; return substr(str_shuffle(str_repeat($pool, $length)), 0, $length); } /** * Convert the given string to upper-case. * * @param string $value * * @return string */ public static function upper($value) { return mb_strtoupper($value); } /** * Convert the given string to title case. * * @param string $value * * @return string */ public static function title($value) { return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8'); } /** * Convert a string to snake case. * * @param string $value * @param string $delimiter * * @return string */ public static function snake($value, $delimiter = '_') { $key = $value.$delimiter; if (isset(static::$snakeCache[$key])) { return static::$snakeCache[$key]; } if (!ctype_lower($value)) { $value = strtolower(preg_replace('/(.)(?=[A-Z])/', '$1'.$delimiter, $value)); } return static::$snakeCache[$key] = trim($value, '_'); } /** * Convert a value to studly caps case. * * @param string $value * * @return string */ public static function studly($value) { $key = $value; if (isset(static::$studlyCache[$key])) { return static::$studlyCache[$key]; } $value = ucwords(str_replace(['-', '_'], ' ', $value)); return static::$studlyCache[$key] = str_replace(' ', '', $value); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Support/XML.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Support; use SimpleXMLElement; /** * Class XML. */ class XML { /** * XML to array. * * @param string $xml XML string * * @return array */ public static function parse($xml) { $backup = PHP_MAJOR_VERSION < 8 ? libxml_disable_entity_loader(true) : null; $result = self::normalize(simplexml_load_string(self::sanitize($xml), 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_NOCDATA | LIBXML_NOBLANKS)); PHP_MAJOR_VERSION < 8 && libxml_disable_entity_loader($backup); return $result; } /** * XML encode. * * @param mixed $data * @param string $root * @param string $item * @param string $attr * @param string $id * * @return string */ public static function build( $data, $root = 'xml', $item = 'item', $attr = '', $id = 'id' ) { if (is_array($attr)) { $_attr = []; foreach ($attr as $key => $value) { $_attr[] = "{$key}=\"{$value}\""; } $attr = implode(' ', $_attr); } $attr = trim($attr); $attr = empty($attr) ? '' : " {$attr}"; $xml = "<{$root}{$attr}>"; $xml .= self::data2Xml($data, $item, $id); $xml .= ""; return $xml; } /** * Build CDATA. * * @param string $string * * @return string */ public static function cdata($string) { return sprintf('', $string); } /** * Object to array. * * * @param SimpleXMLElement $obj * * @return array */ protected static function normalize($obj) { $result = null; if (is_object($obj)) { $obj = (array) $obj; } if (is_array($obj)) { foreach ($obj as $key => $value) { $res = self::normalize($value); if (('@attributes' === $key) && ($key)) { $result = $res; // @codeCoverageIgnore } else { $result[$key] = $res; } } } else { $result = $obj; } return $result; } /** * Array to XML. * * @param array $data * @param string $item * @param string $id * * @return string */ protected static function data2Xml($data, $item = 'item', $id = 'id') { $xml = $attr = ''; foreach ($data as $key => $val) { if (is_numeric($key)) { $id && $attr = " {$id}=\"{$key}\""; $key = $item; } $xml .= "<{$key}{$attr}>"; if ((is_array($val) || is_object($val))) { $xml .= self::data2Xml((array) $val, $item, $id); } else { $xml .= is_numeric($val) ? $val : self::cdata($val); } $xml .= ""; } return $xml; } /** * Delete invalid characters in XML. * * @see https://www.w3.org/TR/2008/REC-xml-20081126/#charsets - XML charset range * @see http://php.net/manual/en/regexp.reference.escape.php - escape in UTF-8 mode * * @param string $xml * * @return string */ public static function sanitize($xml) { return preg_replace('/[^\x{9}\x{A}\x{D}\x{20}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]+/u', '', $xml); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Traits/HasAttributes.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Traits; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Support\Arr; use EasyWeChat\Kernel\Support\Str; /** * Trait Attributes. */ trait HasAttributes { /** * @var array */ protected $attributes = []; /** * @var bool */ protected $snakeable = true; /** * Set Attributes. * * @param array $attributes * * @return $this */ public function setAttributes(array $attributes = []) { $this->attributes = $attributes; return $this; } /** * Set attribute. * * @param string $attribute * @param string $value * * @return $this */ public function setAttribute($attribute, $value) { Arr::set($this->attributes, $attribute, $value); return $this; } /** * Get attribute. * * @param string $attribute * @param mixed $default * * @return mixed */ public function getAttribute($attribute, $default = null) { return Arr::get($this->attributes, $attribute, $default); } /** * @param string $attribute * * @return bool */ public function isRequired($attribute) { return in_array($attribute, $this->getRequired(), true); } /** * @return array|mixed */ public function getRequired() { return property_exists($this, 'required') ? $this->required : []; } /** * Set attribute. * * @param string $attribute * @param mixed $value * * @return $this */ public function with($attribute, $value) { $this->snakeable && $attribute = Str::snake($attribute); $this->setAttribute($attribute, $value); return $this; } /** * Override parent set() method. * * @param string $attribute * @param mixed $value * * @return $this */ public function set($attribute, $value) { $this->setAttribute($attribute, $value); return $this; } /** * Override parent get() method. * * @param string $attribute * @param mixed $default * * @return mixed */ public function get($attribute, $default = null) { return $this->getAttribute($attribute, $default); } /** * @param string $key * * @return bool */ public function has(string $key) { return Arr::has($this->attributes, $key); } /** * @param array $attributes * * @return $this */ public function merge(array $attributes) { $this->attributes = array_merge($this->attributes, $attributes); return $this; } /** * @param array|string $keys * * @return array */ public function only($keys) { return Arr::only($this->attributes, $keys); } /** * Return all items. * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function all() { $this->checkRequiredAttributes(); return $this->attributes; } /** * Magic call. * * @param string $method * @param array $args * * @return $this */ public function __call($method, $args) { if (0 === stripos($method, 'with')) { return $this->with(substr($method, 4), array_shift($args)); } throw new \BadMethodCallException(sprintf('Method "%s" does not exists.', $method)); } /** * Magic get. * * @param string $property * * @return mixed */ public function __get($property) { return $this->get($property); } /** * Magic set. * * @param string $property * @param mixed $value * * @return $this */ public function __set($property, $value) { return $this->with($property, $value); } /** * Whether or not an data exists by key. * * @param string $key * * @return bool */ public function __isset($key) { return isset($this->attributes[$key]); } /** * Check required attributes. * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function checkRequiredAttributes() { foreach ($this->getRequired() as $attribute) { if (is_null($this->get($attribute))) { throw new InvalidArgumentException(sprintf('"%s" cannot be empty.', $attribute)); } } } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Traits/HasHttpRequests.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Traits; use GuzzleHttp\Client; use GuzzleHttp\ClientInterface; use GuzzleHttp\HandlerStack; use Psr\Http\Message\ResponseInterface; /** * Trait HasHttpRequests. * * @author overtrue */ trait HasHttpRequests { use ResponseCastable; /** * @var \GuzzleHttp\ClientInterface */ protected $httpClient; /** * @var array */ protected $middlewares = []; /** * @var \GuzzleHttp\HandlerStack */ protected $handlerStack; /** * @var array */ protected static $defaults = [ 'curl' => [ CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4, ], ]; /** * Set guzzle default settings. * * @param array $defaults */ public static function setDefaultOptions($defaults = []) { self::$defaults = $defaults; } /** * Return current guzzle default settings. * * @return array */ public static function getDefaultOptions(): array { return self::$defaults; } /** * Set GuzzleHttp\Client. * * @param \GuzzleHttp\ClientInterface $httpClient * * @return $this */ public function setHttpClient(ClientInterface $httpClient) { $this->httpClient = $httpClient; return $this; } /** * Return GuzzleHttp\ClientInterface instance. * * @return ClientInterface */ public function getHttpClient(): ClientInterface { if (!($this->httpClient instanceof ClientInterface)) { if (property_exists($this, 'app') && $this->app['http_client']) { $this->httpClient = $this->app['http_client']; } else { $this->httpClient = new Client(['handler' => HandlerStack::create($this->getGuzzleHandler())]); } } return $this->httpClient; } /** * Add a middleware. * * @param callable $middleware * @param string $name * * @return $this */ public function pushMiddleware(callable $middleware, string $name = null) { if (!is_null($name)) { $this->middlewares[$name] = $middleware; } else { array_push($this->middlewares, $middleware); } return $this; } /** * Return all middlewares. * * @return array */ public function getMiddlewares(): array { return $this->middlewares; } /** * Make a request. * * @param string $url * @param string $method * @param array $options * * @return \Psr\Http\Message\ResponseInterface * * @throws \GuzzleHttp\Exception\GuzzleException */ public function request($url, $method = 'GET', $options = []): ResponseInterface { $method = strtoupper($method); $options = array_merge(self::$defaults, $options, ['handler' => $this->getHandlerStack()]); $options = $this->fixJsonIssue($options); if (property_exists($this, 'baseUri') && !is_null($this->baseUri)) { $options['base_uri'] = $this->baseUri; } $response = $this->getHttpClient()->request($method, $url, $options); $response->getBody()->rewind(); return $response; } /** * @param \GuzzleHttp\HandlerStack $handlerStack * * @return $this */ public function setHandlerStack(HandlerStack $handlerStack) { $this->handlerStack = $handlerStack; return $this; } /** * Build a handler stack. * * @return \GuzzleHttp\HandlerStack */ public function getHandlerStack(): HandlerStack { if ($this->handlerStack) { return $this->handlerStack; } $this->handlerStack = HandlerStack::create($this->getGuzzleHandler()); foreach ($this->middlewares as $name => $middleware) { $this->handlerStack->push($middleware, $name); } return $this->handlerStack; } /** * @param array $options * * @return array */ protected function fixJsonIssue(array $options): array { if (isset($options['json']) && is_array($options['json'])) { $options['headers'] = array_merge($options['headers'] ?? [], ['Content-Type' => 'application/json']); if (empty($options['json'])) { $options['body'] = \GuzzleHttp\json_encode($options['json'], JSON_FORCE_OBJECT); } else { $options['body'] = \GuzzleHttp\json_encode($options['json'], JSON_UNESCAPED_UNICODE); } unset($options['json']); } return $options; } /** * Get guzzle handler. * * @return callable */ protected function getGuzzleHandler() { if (property_exists($this, 'app') && isset($this->app['guzzle_handler'])) { return is_string($handler = $this->app->raw('guzzle_handler')) ? new $handler() : $handler; } return \GuzzleHttp\choose_handler(); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Traits/InteractsWithCache.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Traits; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\ServiceContainer; use Psr\Cache\CacheItemPoolInterface; use Psr\SimpleCache\CacheInterface as SimpleCacheInterface; use Symfony\Component\Cache\Adapter\FilesystemAdapter; use Symfony\Component\Cache\Psr16Cache; use Symfony\Component\Cache\Simple\FilesystemCache; /** * Trait InteractsWithCache. * * @author overtrue */ trait InteractsWithCache { /** * @var \Psr\SimpleCache\CacheInterface */ protected $cache; /** * Get cache instance. * * @return \Psr\SimpleCache\CacheInterface * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function getCache() { if ($this->cache) { return $this->cache; } if (property_exists($this, 'app') && $this->app instanceof ServiceContainer && isset($this->app['cache'])) { $this->setCache($this->app['cache']); // Fix PHPStan error assert($this->cache instanceof \Psr\SimpleCache\CacheInterface); return $this->cache; } return $this->cache = $this->createDefaultCache(); } /** * Set cache instance. * * @param \Psr\SimpleCache\CacheInterface|\Psr\Cache\CacheItemPoolInterface $cache * * @return $this * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function setCache($cache) { if (empty(\array_intersect([SimpleCacheInterface::class, CacheItemPoolInterface::class], \class_implements($cache)))) { throw new InvalidArgumentException(\sprintf('The cache instance must implements %s or %s interface.', SimpleCacheInterface::class, CacheItemPoolInterface::class)); } if ($cache instanceof CacheItemPoolInterface) { if (!$this->isSymfony43OrHigher()) { throw new InvalidArgumentException(sprintf('The cache instance must implements %s', SimpleCacheInterface::class)); } $cache = new Psr16Cache($cache); } $this->cache = $cache; return $this; } /** * @return \Psr\SimpleCache\CacheInterface */ protected function createDefaultCache() { if ($this->isSymfony43OrHigher()) { return new Psr16Cache(new FilesystemAdapter('easywechat', 1500)); } return new FilesystemCache(); } /** * @return bool */ protected function isSymfony43OrHigher(): bool { return \class_exists('Symfony\Component\Cache\Psr16Cache'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Traits/Observable.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Traits; use EasyWeChat\Kernel\Clauses\Clause; use EasyWeChat\Kernel\Contracts\EventHandlerInterface; use EasyWeChat\Kernel\Decorators\FinallyResult; use EasyWeChat\Kernel\Decorators\TerminateResult; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\ServiceContainer; /** * Trait Observable. * * @author overtrue */ trait Observable { /** * @var array */ protected $handlers = []; /** * @var array */ protected $clauses = []; /** * @param \Closure|EventHandlerInterface|callable|string $handler * @param \Closure|EventHandlerInterface|callable|string $condition * * @return \EasyWeChat\Kernel\Clauses\Clause * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \ReflectionException */ public function push($handler, $condition = '*') { list($handler, $condition) = $this->resolveHandlerAndCondition($handler, $condition); if (!isset($this->handlers[$condition])) { $this->handlers[$condition] = []; } array_push($this->handlers[$condition], $handler); return $this->newClause($handler); } /** * @param array $handlers * * @return $this */ public function setHandlers(array $handlers = []) { $this->handlers = $handlers; return $this; } /** * @param \Closure|EventHandlerInterface|string $handler * @param \Closure|EventHandlerInterface|string $condition * * @return \EasyWeChat\Kernel\Clauses\Clause * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \ReflectionException */ public function unshift($handler, $condition = '*') { list($handler, $condition) = $this->resolveHandlerAndCondition($handler, $condition); if (!isset($this->handlers[$condition])) { $this->handlers[$condition] = []; } array_unshift($this->handlers[$condition], $handler); return $this->newClause($handler); } /** * @param string $condition * @param \Closure|EventHandlerInterface|string $handler * * @return \EasyWeChat\Kernel\Clauses\Clause * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \ReflectionException */ public function observe($condition, $handler) { return $this->push($handler, $condition); } /** * @param string $condition * @param \Closure|EventHandlerInterface|string $handler * * @return \EasyWeChat\Kernel\Clauses\Clause * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \ReflectionException */ public function on($condition, $handler) { return $this->push($handler, $condition); } /** * @param string|int $event * @param mixed ...$payload * * @return mixed|null */ public function dispatch($event, $payload) { return $this->notify($event, $payload); } /** * @param string|int $event * @param mixed ...$payload * * @return mixed|null */ public function notify($event, $payload) { $result = null; foreach ($this->handlers as $condition => $handlers) { if ('*' === $condition || ($condition & $event) === $event) { foreach ($handlers as $handler) { if ($clause = $this->clauses[$this->getHandlerHash($handler)] ?? null) { if ($clause->intercepted($payload)) { continue; } } $response = $this->callHandler($handler, $payload); switch (true) { case $response instanceof TerminateResult: return $response->content; case true === $response: continue 2; case false === $response: break 3; case !empty($response) && !($result instanceof FinallyResult): $result = $response; } } } } return $result instanceof FinallyResult ? $result->content : $result; } /** * @return array */ public function getHandlers() { return $this->handlers; } /** * @param mixed $handler * * @return \EasyWeChat\Kernel\Clauses\Clause */ protected function newClause($handler): Clause { return $this->clauses[$this->getHandlerHash($handler)] = new Clause(); } /** * @param mixed $handler * * @return string */ protected function getHandlerHash($handler) { if (is_string($handler)) { return $handler; } if (is_array($handler)) { return is_string($handler[0]) ? $handler[0].'::'.$handler[1] : get_class($handler[0]).$handler[1]; } return spl_object_hash($handler); } /** * @param callable $handler * @param mixed $payload * * @return mixed */ protected function callHandler(callable $handler, $payload) { try { return call_user_func_array($handler, [$payload]); } catch (\Exception $e) { if (property_exists($this, 'app') && $this->app instanceof ServiceContainer) { $this->app['logger']->error($e->getCode().': '.$e->getMessage(), [ 'code' => $e->getCode(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), ]); } } } /** * @param mixed $handler * * @return \Closure * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \ReflectionException */ protected function makeClosure($handler) { if (is_callable($handler)) { return $handler; } if (is_string($handler) && '*' !== $handler) { if (!class_exists($handler)) { throw new InvalidArgumentException(sprintf('Class "%s" not exists.', $handler)); } if (!in_array(EventHandlerInterface::class, (new \ReflectionClass($handler))->getInterfaceNames(), true)) { throw new InvalidArgumentException(sprintf('Class "%s" not an instance of "%s".', $handler, EventHandlerInterface::class)); } return function ($payload) use ($handler) { return (new $handler($this->app ?? null))->handle($payload); }; } if ($handler instanceof EventHandlerInterface) { return function () use ($handler) { return $handler->handle(...func_get_args()); }; } throw new InvalidArgumentException('No valid handler is found in arguments.'); } /** * @param mixed $handler * @param mixed $condition * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \ReflectionException */ protected function resolveHandlerAndCondition($handler, $condition): array { if (is_int($handler) || (is_string($handler) && !class_exists($handler))) { list($handler, $condition) = [$condition, $handler]; } return [$this->makeClosure($handler), $condition]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Kernel/Traits/ResponseCastable.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Kernel\Traits; use EasyWeChat\Kernel\Contracts\Arrayable; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Exceptions\InvalidConfigException; use EasyWeChat\Kernel\Http\Response; use EasyWeChat\Kernel\Support\Collection; use Psr\Http\Message\ResponseInterface; /** * Trait ResponseCastable. * * @author overtrue */ trait ResponseCastable { /** * @param \Psr\Http\Message\ResponseInterface $response * @param string|null $type * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ protected function castResponseToType(ResponseInterface $response, $type = null) { $response = Response::buildFromPsrResponse($response); $response->getBody()->rewind(); switch ($type ?? 'array') { case 'collection': return $response->toCollection(); case 'array': return $response->toArray(); case 'object': return $response->toObject(); case 'raw': return $response; default: if (!is_subclass_of($type, Arrayable::class)) { throw new InvalidConfigException(sprintf('Config key "response_type" classname must be an instanceof %s', Arrayable::class)); } return new $type($response); } } /** * @param mixed $response * @param string|null $type * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ protected function detectAndCastResponseToType($response, $type = null) { switch (true) { case $response instanceof ResponseInterface: $response = Response::buildFromPsrResponse($response); break; case $response instanceof Arrayable: $response = new Response(200, [], json_encode($response->toArray())); break; case ($response instanceof Collection) || is_array($response) || is_object($response): $response = new Response(200, [], json_encode($response)); break; case is_scalar($response): $response = new Response(200, [], (string) $response); break; default: throw new InvalidArgumentException(sprintf('Unsupported response type "%s"', gettype($response))); } return $this->castResponseToType($response, $type); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Application.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\ServiceContainer; use EasyWeChat\Kernel\Support; use EasyWeChat\MicroMerchant\Kernel\Exceptions\InvalidSignException; /** * Class Application. * * @author liuml * * @property \EasyWeChat\MicroMerchant\Certficates\Client $certficates * @property \EasyWeChat\MicroMerchant\Material\Client $material * @property \EasyWeChat\MicroMerchant\MerchantConfig\Client $merchantConfig * @property \EasyWeChat\MicroMerchant\Withdraw\Client $withdraw * @property \EasyWeChat\MicroMerchant\Media\Client $media * * @method mixed submitApplication(array $params) * @method mixed getStatus(string $applymentId, string $businessCode = '') * @method mixed upgrade(array $params) * @method mixed getUpgradeStatus(string $subMchId = '') */ class Application extends ServiceContainer { /** * @var array */ protected $providers = [ // Base services Base\ServiceProvider::class, Certficates\ServiceProvider::class, MerchantConfig\ServiceProvider::class, Material\ServiceProvider::class, Withdraw\ServiceProvider::class, Media\ServiceProvider::class, ]; /** * @var array */ protected $defaultConfig = [ 'http' => [ 'base_uri' => 'https://api.mch.weixin.qq.com/', ], 'log' => [ 'default' => 'dev', // 默认使用的 channel,生产环境可以改为下面的 prod 'channels' => [ // 测试环境 'dev' => [ 'driver' => 'single', 'path' => '/tmp/easywechat.log', 'level' => 'debug', ], // 生产环境 'prod' => [ 'driver' => 'daily', 'path' => '/tmp/easywechat.log', 'level' => 'info', ], ], ], ]; /** * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function getKey() { $key = $this['config']->key; if (empty($key)) { throw new InvalidArgumentException('config key connot be empty.'); } if (32 !== strlen($key)) { throw new InvalidArgumentException(sprintf("'%s' should be 32 chars length.", $key)); } return $key; } /** * set sub-mch-id and appid. * * @param string $subMchId Identification Number of Small and Micro Businessmen Reported by Service Providers * @param string $appId Public Account ID of Service Provider * * @return $this */ public function setSubMchId(string $subMchId, string $appId = '') { $this['config']->set('sub_mch_id', $subMchId); if ($appId) { $this['config']->set('appid', $appId); } return $this; } /** * setCertificate. * * @param string $certificate * @param string $serialNo * * @return $this */ public function setCertificate(string $certificate, string $serialNo) { $this['config']->set('certificate', $certificate); $this['config']->set('serial_no', $serialNo); return $this; } /** * Returning true indicates that the verification is successful, * returning false indicates that the signature field does not exist or is empty, * and if the signature verification is wrong, the InvalidSignException will be thrown directly. * * @param array $data * * @return bool * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\InvalidSignException */ public function verifySignature(array $data) { if (!isset($data['sign']) || empty($data['sign'])) { return false; } $sign = $data['sign']; unset($data['sign']); $signType = strlen($sign) > 32 ? 'HMAC-SHA256' : 'MD5'; $secretKey = $this->getKey(); $encryptMethod = Support\get_encrypt_method($signType, $secretKey); if (Support\generate_sign($data, $secretKey, $encryptMethod) === $sign) { return true; } throw new InvalidSignException('return value signature verification error'); } /** * @param string $name * @param array $arguments * * @return mixed */ public function __call($name, $arguments) { return call_user_func_array([$this['base'], $name], $arguments); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Base/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Base; use EasyWeChat\MicroMerchant\Kernel\BaseClient; /** * Class Client. * * @author liuml * @DateTime 2019-05-30 14:19 */ class Client extends BaseClient { /** * apply to settle in to become a small micro merchant. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\EncryptException * @throws \GuzzleHttp\Exception\GuzzleException */ public function submitApplication(array $params) { $params = $this->processParams(array_merge($params, [ 'version' => '3.0', 'cert_sn' => '', 'sign_type' => 'HMAC-SHA256', 'nonce_str' => uniqid('micro'), ])); return $this->safeRequest('applyment/micro/submit', $params); } /** * query application status. * * @param string $applymentId * @param string $businessCode * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getStatus(string $applymentId, string $businessCode = '') { if (!empty($applymentId)) { $params = [ 'applyment_id' => $applymentId, ]; } else { $params = [ 'business_code' => $businessCode, ]; } $params = array_merge($params, [ 'version' => '1.0', 'sign_type' => 'HMAC-SHA256', 'nonce_str' => uniqid('micro'), ]); return $this->safeRequest('applyment/micro/getstate', $params); } /** * merchant upgrade api. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\EncryptException * @throws \GuzzleHttp\Exception\GuzzleException */ public function upgrade(array $params) { $params['sub_mch_id'] = $params['sub_mch_id'] ?? $this->app['config']->sub_mch_id; $params = $this->processParams(array_merge($params, [ 'version' => '1.0', 'cert_sn' => '', 'sign_type' => 'HMAC-SHA256', 'nonce_str' => uniqid('micro'), ])); return $this->safeRequest('applyment/micro/submitupgrade', $params); } /** * get upgrade status. * * @param string $subMchId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUpgradeStatus(string $subMchId = '') { return $this->safeRequest('applyment/micro/getupgradestate', [ 'version' => '1.0', 'sign_type' => 'HMAC-SHA256', 'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id, 'nonce_str' => uniqid('micro'), ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Base/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Base; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['base'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Certficates/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Certficates; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\MicroMerchant\Kernel\BaseClient; use EasyWeChat\MicroMerchant\Kernel\Exceptions\InvalidExtensionException; /** * Class Client. * * @author liuml * @DateTime 2019-05-30 14:19 */ class Client extends BaseClient { /** * get certficates. * * @param bool $returnRaw * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\InvalidExtensionException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(bool $returnRaw = false) { $params = [ 'sign_type' => 'HMAC-SHA256', 'nonce_str' => uniqid('micro'), ]; if (true === $returnRaw) { return $this->requestRaw('risk/getcertficates', $params); } /** @var array $response */ $response = $this->requestArray('risk/getcertficates', $params); if ('SUCCESS' !== $response['return_code']) { throw new InvalidArgumentException(sprintf('Failed to get certificate. return_code_msg: "%s" .', $response['return_code'].'('.$response['return_msg'].')')); } if ('SUCCESS' !== $response['result_code']) { throw new InvalidArgumentException(sprintf('Failed to get certificate. result_err_code_desc: "%s" .', $response['result_code'].'('.$response['err_code'].'['.$response['err_code_desc'].'])')); } $certificates = \GuzzleHttp\json_decode($response['certificates'], true)['data'][0]; $ciphertext = $this->decrypt($certificates['encrypt_certificate']); unset($certificates['encrypt_certificate']); $certificates['certificates'] = $ciphertext; return $certificates; } /** * decrypt ciphertext. * * @param array $encryptCertificate * * @return string * * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\InvalidExtensionException */ public function decrypt(array $encryptCertificate) { if (false === extension_loaded('sodium')) { throw new InvalidExtensionException('sodium extension is not installed,Reference link https://php.net/manual/zh/book.sodium.php'); } if (false === sodium_crypto_aead_aes256gcm_is_available()) { throw new InvalidExtensionException('aes256gcm is not currently supported'); } // sodium_crypto_aead_aes256gcm_decrypt function needs to open libsodium extension. // https://www.php.net/manual/zh/function.sodium-crypto-aead-aes256gcm-decrypt.php return sodium_crypto_aead_aes256gcm_decrypt( base64_decode($encryptCertificate['ciphertext'], true), $encryptCertificate['associated_data'], $encryptCertificate['nonce'], $this->app['config']->apiv3_key ); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Certficates/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Certficates; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['certficates'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Kernel/BaseClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Kernel; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Support; use EasyWeChat\MicroMerchant\Application; use EasyWeChat\MicroMerchant\Kernel\Exceptions\EncryptException; use EasyWeChat\Payment\Kernel\BaseClient as PaymentBaseClient; /** * Class BaseClient. * * @author liuml * @DateTime 2019-07-10 12:06 */ class BaseClient extends PaymentBaseClient { /** * @var string */ protected $certificates; /** * BaseClient constructor. * * @param \EasyWeChat\MicroMerchant\Application $app */ public function __construct(Application $app) { $this->app = $app; $this->setHttpClient($this->app['http_client']); } /** * Extra request params. * * @return array */ protected function prepends() { return []; } /** * httpUpload. * * @param string $url * @param array $files * @param array $form * @param array $query * @param bool $returnResponse * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\InvalidSignException * @throws \GuzzleHttp\Exception\GuzzleException */ public function httpUpload(string $url, array $files = [], array $form = [], array $query = [], $returnResponse = false) { $multipart = []; foreach ($files as $name => $path) { $multipart[] = [ 'name' => $name, 'contents' => fopen($path, 'r'), ]; } $base = [ 'mch_id' => $this->app['config']['mch_id'], ]; $form = array_merge($base, $form); $form['sign'] = $this->getSign($form); foreach ($form as $name => $contents) { $multipart[] = compact('name', 'contents'); } $options = [ 'query' => $query, 'multipart' => $multipart, 'connect_timeout' => 30, 'timeout' => 30, 'read_timeout' => 30, 'cert' => $this->app['config']->get('cert_path'), 'ssl_key' => $this->app['config']->get('key_path'), ]; $this->pushMiddleware($this->logMiddleware(), 'log'); $response = $this->performRequest($url, 'POST', $options); $result = $returnResponse ? $response : $this->castResponseToType($response, $this->app->config->get('response_type')); // auto verify signature if ($returnResponse || 'array' !== ($this->app->config->get('response_type') ?? 'array')) { $this->app->verifySignature($this->castResponseToType($response, 'array')); } else { $this->app->verifySignature($result); } return $result; } /** * request. * * @param string $endpoint * @param array $params * @param string $method * @param array $options * @param bool $returnResponse * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\InvalidSignException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function request(string $endpoint, array $params = [], $method = 'post', array $options = [], $returnResponse = false) { $base = [ 'mch_id' => $this->app['config']['mch_id'], ]; $params = array_merge($base, $this->prepends(), $params); $params['sign'] = $this->getSign($params); $options = array_merge([ 'body' => Support\XML::build($params), ], $options); $this->pushMiddleware($this->logMiddleware(), 'log'); $response = $this->performRequest($endpoint, $method, $options); $result = $returnResponse ? $response : $this->castResponseToType($response, $this->app->config->get('response_type')); // auto verify signature if ($returnResponse || 'array' !== ($this->app->config->get('response_type') ?? 'array')) { $this->app->verifySignature($this->castResponseToType($response, 'array')); } else { $this->app->verifySignature($result); } return $result; } /** * processing parameters contain fields that require sensitive information encryption. * * @param array $params * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\EncryptException */ protected function processParams(array $params) { $serial_no = $this->app['config']->get('serial_no'); if (null === $serial_no) { throw new InvalidArgumentException('config serial_no connot be empty.'); } $params['cert_sn'] = $serial_no; $sensitive_fields = $this->getSensitiveFieldsName(); foreach ($params as $k => $v) { if (in_array($k, $sensitive_fields, true)) { $params[$k] = $this->encryptSensitiveInformation($v); } } return $params; } /** * To id card, mobile phone number and other fields sensitive information encryption. * * @param string $string * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\EncryptException */ protected function encryptSensitiveInformation(string $string) { $certificates = $this->app['config']->get('certificate'); if (null === $certificates) { throw new InvalidArgumentException('config certificate connot be empty.'); } $encrypted = ''; $publicKeyResource = openssl_get_publickey($certificates); $f = openssl_public_encrypt($string, $encrypted, $publicKeyResource, OPENSSL_NO_PADDING); openssl_free_key($publicKeyResource); if ($f) { return base64_encode($encrypted); } throw new EncryptException('Encryption of sensitive information failed'); } /** * get sensitive fields name. * * @return array */ protected function getSensitiveFieldsName() { return [ 'id_card_name', 'id_card_number', 'account_name', 'account_number', 'contact', 'contact_phone', 'contact_email', 'legal_person', 'mobile_phone', 'email', ]; } /** * getSign. * * @param array $params * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function getSign(array $params) { $params = array_filter($params); $key = $this->app->getKey(); $encryptMethod = Support\get_encrypt_method(Support\Arr::get($params, 'sign_type', 'MD5'), $key); return Support\generate_sign($params, $key, $encryptMethod); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Kernel/Exceptions/EncryptException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Kernel\Exceptions; use EasyWeChat\Kernel\Exceptions\Exception; /** * Class EncryptException. * * @author liuml */ class EncryptException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Kernel/Exceptions/InvalidExtensionException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Kernel\Exceptions; use EasyWeChat\Kernel\Exceptions\Exception; /** * Class InvalidExtensionException. * * @author liuml */ class InvalidExtensionException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Kernel/Exceptions/InvalidSignException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Kernel\Exceptions; use EasyWeChat\Kernel\Exceptions\Exception; /** * Class InvalidSignException. * * @author liuml */ class InvalidSignException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Material/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Material; use EasyWeChat\MicroMerchant\Kernel\BaseClient; /** * Class Client. * * @author liuml * @DateTime 2019-05-30 14:19 */ class Client extends BaseClient { /** * update settlement card. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\EncryptException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setSettlementCard(array $params) { $params['sub_mch_id'] = $params['sub_mch_id'] ?? $this->app['config']->sub_mch_id; $params = $this->processParams(array_merge($params, [ 'version' => '1.0', 'cert_sn' => '', 'sign_type' => 'HMAC-SHA256', 'nonce_str' => uniqid('micro'), ])); return $this->safeRequest('applyment/micro/modifyarchives', $params); } /** * update contact info. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\EncryptException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateContact(array $params) { $params['sub_mch_id'] = $params['sub_mch_id'] ?? $this->app['config']->sub_mch_id; $params = $this->processParams(array_merge($params, [ 'version' => '1.0', 'cert_sn' => '', 'sign_type' => 'HMAC-SHA256', 'nonce_str' => uniqid('micro'), ])); return $this->safeRequest('applyment/micro/modifycontactinfo', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Material/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Material; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['material'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Media/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Media; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\MicroMerchant\Kernel\BaseClient; /** * Class Client. * * @author liuml * @DateTime 2019-06-10 14:50 */ class Client extends BaseClient { /** * Upload material. * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\InvalidSignException */ public function upload(string $path) { if (!file_exists($path) || !is_readable($path)) { throw new InvalidArgumentException(sprintf("File does not exist, or the file is unreadable: '%s'", $path)); } $form = [ 'media_hash' => strtolower(md5_file($path)), 'sign_type' => 'HMAC-SHA256', ]; return $this->httpUpload('secapi/mch/uploadmedia', ['media' => $path], $form); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Media/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * ServiceProvider.php. * * This file is part of the wechat. * * (c) overtrue * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Media; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['media'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/MerchantConfig/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\MerchantConfig; use EasyWeChat\MicroMerchant\Kernel\BaseClient; /** * Class Client. * * @author liuml * @DateTime 2019-05-30 14:19 */ class Client extends BaseClient { /** * Service providers configure recommendation functions for small and micro businesses. * * @param string $subAppId * @param string $subscribeAppId * @param string $receiptAppId * @param string $subMchId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setFollowConfig(string $subAppId, string $subscribeAppId, string $receiptAppId = '', string $subMchId = '') { $params = [ 'sub_appid' => $subAppId, 'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id, ]; if (!empty($subscribeAppId)) { $params['subscribe_appid'] = $subscribeAppId; } else { $params['receipt_appid'] = $receiptAppId; } return $this->safeRequest('secapi/mkt/addrecommendconf', array_merge($params, [ 'sign_type' => 'HMAC-SHA256', 'nonce_str' => uniqid('micro'), ])); } /** * Configure the new payment directory. * * @param string $jsapiPath * @param string $appId * @param string $subMchId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function addPath(string $jsapiPath, string $appId = '', string $subMchId = '') { return $this->addConfig([ 'appid' => $appId ?: $this->app['config']->appid, 'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id, 'jsapi_path' => $jsapiPath, ]); } /** * bind appid. * * @param string $subAppId * @param string $appId * @param string $subMchId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function bindAppId(string $subAppId, string $appId = '', string $subMchId = '') { return $this->addConfig([ 'appid' => $appId ?: $this->app['config']->appid, 'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id, 'sub_appid' => $subAppId, ]); } /** * add sub dev config. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ private function addConfig(array $params) { return $this->safeRequest('secapi/mch/addsubdevconfig', $params); } /** * query Sub Dev Config. * * @param string $subMchId * @param string $appId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getConfig(string $subMchId = '', string $appId = '') { return $this->safeRequest('secapi/mch/querysubdevconfig', [ 'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id, 'appid' => $appId ?: $this->app['config']->appid, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/MerchantConfig/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\MerchantConfig; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['merchantConfig'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Withdraw/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Withdraw; use EasyWeChat\MicroMerchant\Kernel\BaseClient; /** * Class Client. * * @author liuml * @DateTime 2019-05-30 14:19 */ class Client extends BaseClient { /** * Query withdrawal status. * * @param string $date * @param string $subMchId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function queryWithdrawalStatus($date, $subMchId = '') { return $this->safeRequest('fund/queryautowithdrawbydate', [ 'date' => $date, 'sign_type' => 'HMAC-SHA256', 'nonce_str' => uniqid('micro'), 'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id, ]); } /** * Re-initiation of withdrawal. * * @param string $date * @param string $subMchId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function requestWithdraw($date, $subMchId = '') { return $this->safeRequest('fund/reautowithdrawbydate', [ 'date' => $date, 'sign_type' => 'HMAC-SHA256', 'nonce_str' => uniqid('micro'), 'sub_mch_id' => $subMchId ?: $this->app['config']->sub_mch_id, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MicroMerchant/Withdraw/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MicroMerchant\Withdraw; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['withdraw'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/ActivityMessage/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\ActivityMessage; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; class Client extends BaseClient { /** * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function createActivityId() { return $this->httpGet('cgi-bin/message/wxopen/activityid/create'); } /** * @param string $activityId * @param int $state * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateMessage(string $activityId, int $state = 0, array $params = []) { if (!in_array($state, [0, 1], true)) { throw new InvalidArgumentException('"state" should be "0" or "1".'); } $params = $this->formatParameters($params); $params = [ 'activity_id' => $activityId, 'target_state' => $state, 'template_info' => ['parameter_list' => $params], ]; return $this->httpPostJson('cgi-bin/message/wxopen/updatablemsg/send', $params); } /** * @param array $params * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function formatParameters(array $params) { $formatted = []; foreach ($params as $name => $value) { if (!in_array($name, ['member_count', 'room_limit', 'path', 'version_type'], true)) { continue; } if ('version_type' === $name && !in_array($value, ['develop', 'trial', 'release'], true)) { throw new InvalidArgumentException('Invalid value of attribute "version_type".'); } $formatted[] = [ 'name' => $name, 'value' => strval($value), ]; } return $formatted; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/ActivityMessage/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\ActivityMessage; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['activity_message'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/AppCode/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\AppCode; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Http\StreamResponse; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Get AppCode. * * @param string $path * @param array $optional * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string */ public function get(string $path, array $optional = []) { $params = array_merge([ 'path' => $path, ], $optional); return $this->getStream('wxa/getwxacode', $params); } /** * Get AppCode unlimit. * * @param string $scene * @param array $optional * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string */ public function getUnlimit(string $scene, array $optional = []) { $params = array_merge([ 'scene' => $scene, ], $optional); return $this->getStream('wxa/getwxacodeunlimit', $params); } /** * Create QrCode. * * @param string $path * @param int|null $width * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string */ public function getQrCode(string $path, int $width = null) { return $this->getStream('cgi-bin/wxaapp/createwxaqrcode', compact('path', 'width')); } /** * Get stream. * * @param string $endpoint * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function getStream(string $endpoint, array $params) { $response = $this->requestRaw($endpoint, 'POST', ['json' => $params]); if (false !== stripos($response->getHeaderLine('Content-disposition'), 'attachment')) { return StreamResponse::buildFromPsrResponse($response); } return $this->castResponseToType($response, $this->app['config']->get('response_type')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/AppCode/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\AppCode; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['app_code'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Application.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram; use EasyWeChat\BasicService; use EasyWeChat\Kernel\ServiceContainer; /** * Class Application. * * @author mingyoung * * @property \EasyWeChat\MiniProgram\Auth\AccessToken $access_token * @property \EasyWeChat\MiniProgram\DataCube\Client $data_cube * @property \EasyWeChat\MiniProgram\AppCode\Client $app_code * @property \EasyWeChat\MiniProgram\Auth\Client $auth * @property \EasyWeChat\OfficialAccount\Server\Guard $server * @property \EasyWeChat\MiniProgram\Encryptor $encryptor * @property \EasyWeChat\MiniProgram\TemplateMessage\Client $template_message * @property \EasyWeChat\OfficialAccount\CustomerService\Client $customer_service * @property \EasyWeChat\MiniProgram\Plugin\Client $plugin * @property \EasyWeChat\MiniProgram\Plugin\DevClient $plugin_dev * @property \EasyWeChat\MiniProgram\UniformMessage\Client $uniform_message * @property \EasyWeChat\MiniProgram\ActivityMessage\Client $activity_message * @property \EasyWeChat\MiniProgram\Express\Client $express * @property \EasyWeChat\MiniProgram\NearbyPoi\Client $nearby_poi * @property \EasyWeChat\MiniProgram\OCR\Client $ocr * @property \EasyWeChat\MiniProgram\Soter\Client $soter * @property \EasyWeChat\BasicService\Media\Client $media * @property \EasyWeChat\BasicService\ContentSecurity\Client $content_security * @property \EasyWeChat\MiniProgram\Mall\ForwardsMall $mall * @property \EasyWeChat\MiniProgram\SubscribeMessage\Client $subscribe_message * @property \EasyWeChat\MiniProgram\RealtimeLog\Client $realtime_log * @property \EasyWeChat\MiniProgram\RiskControl\Client $risk_control * @property \EasyWeChat\MiniProgram\Search\Client $search * @property \EasyWeChat\MiniProgram\Live\Client $live * @property \EasyWeChat\MiniProgram\Broadcast\Client $broadcast * @property \EasyWeChat\MiniProgram\UrlScheme\Client $url_scheme * @property \EasyWeChat\MiniProgram\Union\Client $union * @property \EasyWeChat\MiniProgram\Shop\Register\Client $shop_register * @property \EasyWeChat\MiniProgram\Shop\Basic\Client $shop_basic * @property \EasyWeChat\MiniProgram\Shop\Account\Client $shop_account * @property \EasyWeChat\MiniProgram\Shop\Spu\Client $shop_spu * @property \EasyWeChat\MiniProgram\Shop\Order\Client $shop_order * @property \EasyWeChat\MiniProgram\Shop\Delivery\Client $shop_delivery * @property \EasyWeChat\MiniProgram\Shop\Aftersale\Client $shop_aftersale * @property \EasyWeChat\MiniProgram\Business\Client $business * @property \EasyWeChat\MiniProgram\UrlLink\Client $url_link * @property \EasyWeChat\MiniProgram\QrCode\Client $qr_code * @property \EasyWeChat\MiniProgram\PhoneNumber\Client $phone_number * @property \EasyWeChat\MiniProgram\ShortLink\Client $short_link */ class Application extends ServiceContainer { /** * @var array */ protected $providers = [ Auth\ServiceProvider::class, DataCube\ServiceProvider::class, AppCode\ServiceProvider::class, Server\ServiceProvider::class, TemplateMessage\ServiceProvider::class, CustomerService\ServiceProvider::class, UniformMessage\ServiceProvider::class, ActivityMessage\ServiceProvider::class, OpenData\ServiceProvider::class, Plugin\ServiceProvider::class, QrCode\ServiceProvider::class, Base\ServiceProvider::class, Express\ServiceProvider::class, NearbyPoi\ServiceProvider::class, OCR\ServiceProvider::class, Soter\ServiceProvider::class, Mall\ServiceProvider::class, SubscribeMessage\ServiceProvider::class, RealtimeLog\ServiceProvider::class, RiskControl\ServiceProvider::class, Search\ServiceProvider::class, Live\ServiceProvider::class, Broadcast\ServiceProvider::class, UrlScheme\ServiceProvider::class, UrlLink\ServiceProvider::class, Union\ServiceProvider::class, PhoneNumber\ServiceProvider::class, ShortLink\ServiceProvider::class, // Base services BasicService\Media\ServiceProvider::class, BasicService\ContentSecurity\ServiceProvider::class, Shop\Register\ServiceProvider::class, Shop\Basic\ServiceProvider::class, Shop\Account\ServiceProvider::class, Shop\Spu\ServiceProvider::class, Shop\Order\ServiceProvider::class, Shop\Delivery\ServiceProvider::class, Shop\Aftersale\ServiceProvider::class, Business\ServiceProvider::class, ]; /** * Handle dynamic calls. * * @param string $method * @param array $args * * @return mixed */ public function __call($method, $args) { return $this->base->$method(...$args); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Auth/AccessToken.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Auth; use EasyWeChat\Kernel\AccessToken as BaseAccessToken; /** * Class AccessToken. * * @author mingyoung */ class AccessToken extends BaseAccessToken { /** * @var string */ protected $endpointToGetToken = 'cgi-bin/token'; /** * {@inheritdoc} */ protected function getCredentials(): array { return [ 'grant_type' => 'client_credential', 'appid' => $this->app['config']['app_id'], 'secret' => $this->app['config']['secret'], ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Auth/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Auth; use EasyWeChat\Kernel\BaseClient; /** * Class Auth. * * @author mingyoung */ class Client extends BaseClient { /** * Get session info by code. * * @param string $code * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function session(string $code) { $params = [ 'appid' => $this->app['config']['app_id'], 'secret' => $this->app['config']['secret'], 'js_code' => $code, 'grant_type' => 'authorization_code', ]; return $this->httpGet('sns/jscode2session', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Auth/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Auth; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { !isset($app['access_token']) && $app['access_token'] = function ($app) { return new AccessToken($app); }; !isset($app['auth']) && $app['auth'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Base/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Base; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Get paid unionid. * * @param string $openid * @param array $options * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getPaidUnionid($openid, $options = []) { return $this->httpGet('wxa/getpaidunionid', compact('openid') + $options); } /** * Get version info * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getVersionInfo() { return $this->httpPostJson('wxa/getversioninfo'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Base/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Base; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['base'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Broadcast/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Broadcast; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author Abbotton */ class Client extends BaseClient { /** * Add broadcast goods. * * @param array $goodsInfo * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $goodsInfo) { $params = [ 'goodsInfo' => $goodsInfo, ]; return $this->httpPostJson('wxaapi/broadcast/goods/add', $params); } /** * Reset audit. * * @param int $auditId * @param int $goodsId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function resetAudit(int $auditId, int $goodsId) { $params = [ 'auditId' => $auditId, 'goodsId' => $goodsId, ]; return $this->httpPostJson('wxaapi/broadcast/goods/resetaudit', $params); } /** * Resubmit audit goods. * * @param int $goodsId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function resubmitAudit(int $goodsId) { $params = [ 'goodsId' => $goodsId, ]; return $this->httpPostJson('wxaapi/broadcast/goods/audit', $params); } /** * Delete broadcast goods. * * @param int $goodsId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(int $goodsId) { $params = [ 'goodsId' => $goodsId, ]; return $this->httpPostJson('wxaapi/broadcast/goods/delete', $params); } /** * Update goods info. * * @param array $goodsInfo * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(array $goodsInfo) { $params = [ 'goodsInfo' => $goodsInfo, ]; return $this->httpPostJson('wxaapi/broadcast/goods/update', $params); } /** * Get goods information and review status. * * @param array $goodsIdArray * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getGoodsWarehouse(array $goodsIdArray) { $params = [ 'goods_ids' => $goodsIdArray, ]; return $this->httpPostJson('wxa/business/getgoodswarehouse', $params); } /** * Get goods list based on status * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getApproved(array $params) { return $this->httpGet('wxaapi/broadcast/goods/getapproved', $params); } /** * Add goods to the designated live room. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addGoods(array $params) { return $this->httpPost('wxaapi/broadcast/room/addgoods', $params); } /** * Get Room List. * * @param int $start * @param int $limit * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @author onekb <1@1kb.ren> */ public function getRooms(int $start = 0, int $limit = 10) { $params = [ 'start' => $start, 'limit' => $limit, ]; return $this->httpPostJson('wxa/business/getliveinfo', $params); } /** * Get Playback List. * * @param int $roomId * @param int $start * @param int $limit * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @author onekb <1@1kb.ren> */ public function getPlaybacks(int $roomId, int $start = 0, int $limit = 10) { $params = [ 'action' => 'get_replay', 'room_id' => $roomId, 'start' => $start, 'limit' => $limit, ]; return $this->httpPostJson('wxa/business/getliveinfo', $params); } /** * Create a live room. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createLiveRoom(array $params) { return $this->httpPost('wxaapi/broadcast/room/create', $params); } /** * Delete a live room. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function deleteLiveRoom(array $params) { return $this->httpPost('wxaapi/broadcast/room/deleteroom', $params); } /** * Update a live room. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateLiveRoom(array $params) { return $this->httpPost('wxaapi/broadcast/room/editroom', $params); } /** * Gets the live room push stream url. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getPushUrl(array $params) { return $this->httpGet('wxaapi/broadcast/room/getpushurl', $params); } /** * Gets the live room share qrcode. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getShareQrcode(array $params) { return $this->httpGet('wxaapi/broadcast/room/getsharedcode', $params); } /** * Add a live room assistant. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function addAssistant(array $params) { return $this->httpPost('wxaapi/broadcast/room/addassistant', $params); } /** * Update a live room assistant. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateAssistant(array $params) { return $this->httpPost('wxaapi/broadcast/room/modifyassistant', $params); } /** * Delete a live room assistant. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function deleteAssistant(array $params) { return $this->httpPost('wxaapi/broadcast/room/removeassistant', $params); } /** * Gets the assistant list. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getAssistantList(array $params) { return $this->httpGet('wxaapi/broadcast/room/getassistantlist', $params); } /** * Add the sub anchor. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function addSubAnchor(array $params) { return $this->httpPost('wxaapi/broadcast/room/addsubanchor', $params); } /** * Update the sub anchor. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateSubAnchor(array $params) { return $this->httpPost('wxaapi/broadcast/room/modifysubanchor', $params); } /** * Delete the sub anchor. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function deleteSubAnchor(array $params) { return $this->httpPost('wxaapi/broadcast/room/deletesubanchor', $params); } /** * Gets the sub anchor info. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getSubAnchor(array $params) { return $this->httpGet('wxaapi/broadcast/room/getsubanchor', $params); } /** * Turn official index on/off. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateFeedPublic(array $params) { return $this->httpPost('wxaapi/broadcast/room/updatefeedpublic', $params); } /** * Turn playback status on/off. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateReplay(array $params) { return $this->httpPost('wxaapi/broadcast/room/updatereplay', $params); } /** * Turn customer service status on/off. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateKf(array $params) { return $this->httpPost('wxaapi/broadcast/room/updatekf', $params); } /** * Turn global comments status on/off. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateComment(array $params) { return $this->httpPost('wxaapi/broadcast/room/updatecomment', $params); } /** * Add member role. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function addRole(array $params) { return $this->httpPost('wxaapi/broadcast/role/addrole', $params); } /** * Delete member role. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function deleteRole(array $params) { return $this->httpPost('wxaapi/broadcast/role/deleterole', $params); } /** * Gets the role list. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getRoleList(array $params) { return $this->httpGet('wxaapi/broadcast/role/getrolelist', $params); } /** * Gets long-term subscribers. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getFollowers(array $params) { return $this->httpPost('wxa/business/get_wxa_followers', $params); } /** * Sending live broadcast start event to long-term subscribers. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function pushMessage(array $params) { return $this->httpPost('wxa/business/push_message', $params); } /** * Change the status of goods on/off shelves in room. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateGoodsInRoom(array $params) { return $this->httpPost('wxaapi/broadcast/goods/onsale', $params); } /** * Delete goods in room. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deleteGoodsInRoom(array $params) { return $this->httpPost('wxaapi/broadcast/goods/deleteInRoom', $params); } /** * Push goods in room. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function pushGoods(array $params) { return $this->httpPost('wxaapi/broadcast/goods/push', $params); } /** * Change goods sort in room. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function sortGoods(array $params) { return $this->httpPost('wxaapi/broadcast/goods/sort', $params); } /** * Download goods explanation video. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function downloadGoodsExplanationVideo(array $params) { return $this->httpPost('wxaapi/broadcast/goods/getVideo', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Broadcast/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Broadcast; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author Abbotton */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['broadcast'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Business/Client.php ================================================ */ class Client extends BaseClient { /** * Business register * @param string $accountName * @param string $nickname * @param string $iconMediaId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function register(string $accountName, string $nickname, string $iconMediaId) { $params = [ 'account_name' => $accountName, 'nickname' => $nickname, 'icon_media_id' => $iconMediaId, ]; return $this->httpPostJson('cgi-bin/business/register', $params); } /** * Get business * @param int $businessId * @param string $accountName * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getBusiness(int $businessId = 0, string $accountName = '') { if (empty($businessId) && empty($accountName)) { throw new InvalidArgumentException('Missing parameter.'); } if ($businessId) { $params = [ 'business_id' => $businessId, ]; } else { $params = [ 'account_name' => $accountName, ]; } return $this->httpPostJson('cgi-bin/business/get', $params); } /** * Get business list * @param int $offset * @param int $count * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(int $offset = 0, int $count = 10) { $params = [ 'offset' => $offset, 'count' => $count, ]; return $this->httpPostJson('cgi-bin/business/list', $params); } /** * Update business. * @param int $businessId * @param string $nickname * @param string $iconMediaId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(int $businessId, string $nickname = '', string $iconMediaId = '') { $params = [ 'business_id' => $businessId, 'nickname' => $nickname, 'icon_media_id' => $iconMediaId, ]; return $this->httpPostJson('cgi-bin/business/update', $params); } /** * Get message builder. * * @param \EasyWeChat\Kernel\Messages\Message|string $message * * @return \EasyWeChat\MiniProgram\Business\Messenger */ public function message($message) { $messageBuilder = new Messenger($this); return $messageBuilder->message($message); } /** * Send a message. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $message) { return $this->httpPostJson('cgi-bin/message/custom/business/send', $message); } /** * Typing status. * @param int $businessId * @param string $toUser openid * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function typing(int $businessId, string $toUser) { $params = [ 'business_id' => $businessId, 'touser' => $toUser, 'command' => 'Typing', ]; return $this->httpPostJson('cgi-bin/business/typing', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Business/Messenger.php ================================================ */ class Messenger { /** * Messages to send. * * @var \EasyWeChat\Kernel\Messages\Message; */ protected $message; /** * Messages target user open id. * * @var string */ protected $to; /** * Messages sender staff id. * * @var string */ protected $account; /** * Customer service instance. * * @var \EasyWeChat\MiniProgram\Business\Client */ protected $client; /** * Messages businessId * * @var int */ protected $businessId; /** * MessageBuilder constructor. * * @param \EasyWeChat\MiniProgram\Business\Client $client */ public function __construct(Client $client) { $this->client = $client; } /** * Set message to send. * * @param string|Message $message * * @return Messenger */ public function message($message) { if (is_string($message)) { $message = new Text($message); } $this->message = $message; return $this; } /** * Set staff account to send message. * * @return Messenger */ public function by(string $account) { $this->account = $account; return $this; } /** * @return Messenger */ public function from(string $account) { return $this->by($account); } /** * Set target user open id. * * @param string $openid * * @return Messenger */ public function to($openid) { $this->to = $openid; return $this; } /** * Set target business id. * * @param int $businessId * * @return Messenger */ public function business($businessId) { $this->businessId = $businessId; return $this; } /** * Send the message. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function send() { if (empty($this->message)) { throw new RuntimeException('No message to send.'); } if ($this->message instanceof RawMessage) { $message = json_decode($this->message->get('content'), true); } else { $prepends = [ 'touser' => $this->to, ]; if ($this->account) { $prepends['customservice'] = ['kf_account' => $this->account]; } if ($this->businessId) { $prepends['businessid'] = $this->businessId; } $message = $this->message->transformForJsonRequest($prepends); } return $this->client->send($message); } /** * Return property. * * @return mixed */ public function __get(string $property) { if (property_exists($this, $property)) { return $this->$property; } return null; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Business/ServiceProvider.php ================================================ */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['business'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/CustomerService/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\CustomerService; use EasyWeChat\OfficialAccount\CustomerService\Client; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['customer_service'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/DataCube/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\DataCube; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Get summary trend. * * @param string $from * @param string $to * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function summaryTrend(string $from, string $to) { return $this->query('datacube/getweanalysisappiddailysummarytrend', $from, $to); } /** * Get daily visit trend. * * @param string $from * @param string $to * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function dailyVisitTrend(string $from, string $to) { return $this->query('datacube/getweanalysisappiddailyvisittrend', $from, $to); } /** * Get weekly visit trend. * * @param string $from * @param string $to * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function weeklyVisitTrend(string $from, string $to) { return $this->query('datacube/getweanalysisappidweeklyvisittrend', $from, $to); } /** * Get monthly visit trend. * * @param string $from * @param string $to * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function monthlyVisitTrend(string $from, string $to) { return $this->query('datacube/getweanalysisappidmonthlyvisittrend', $from, $to); } /** * Get visit distribution. * * @param string $from * @param string $to * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function visitDistribution(string $from, string $to) { return $this->query('datacube/getweanalysisappidvisitdistribution', $from, $to); } /** * Get daily retain info. * * @param string $from * @param string $to * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function dailyRetainInfo(string $from, string $to) { return $this->query('datacube/getweanalysisappiddailyretaininfo', $from, $to); } /** * Get weekly retain info. * * @param string $from * @param string $to * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function weeklyRetainInfo(string $from, string $to) { return $this->query('datacube/getweanalysisappidweeklyretaininfo', $from, $to); } /** * Get monthly retain info. * * @param string $from * @param string $to * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function monthlyRetainInfo(string $from, string $to) { return $this->query('datacube/getweanalysisappidmonthlyretaininfo', $from, $to); } /** * Get visit page. * * @param string $from * @param string $to * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function visitPage(string $from, string $to) { return $this->query('datacube/getweanalysisappidvisitpage', $from, $to); } /** * Get user portrait. * * @param string $from * @param string $to * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function userPortrait(string $from, string $to) { return $this->query('datacube/getweanalysisappiduserportrait', $from, $to); } /** * get performance data * @param string $from * @param string $to * @param string $module * @param string $networktype * @param string $device_level * @param string $device * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function devicePerformanceData(string $from, string $to, string $module, string $networktype = '-1', string $device_level = '-1', string $device = '-1') { $payload = [ 'time' => [ 'end_timestamp' => strtotime($to), 'begin_timestamp' => strtotime($from), ], 'module' => $module, 'params' => [ ['field' => 'networktype', 'value' => $networktype], ['field' => 'device_level', 'value' => $device_level], ['field' => 'device', 'value' => $device], ] ]; return $this->httpPostJson('wxa/business/performance/boot', $payload); } /** * Unify query. * * @param string $api * @param string $from * @param string $to * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function query(string $api, string $from, string $to) { $params = [ 'begin_date' => $from, 'end_date' => $to, ]; return $this->httpPostJson($api, $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/DataCube/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\DataCube; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['data_cube'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Encryptor.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram; use EasyWeChat\Kernel\Encryptor as BaseEncryptor; use EasyWeChat\Kernel\Exceptions\DecryptException; use EasyWeChat\Kernel\Support\AES; /** * Class Encryptor. * * @author mingyoung */ class Encryptor extends BaseEncryptor { /** * Decrypt data. * * @param string $sessionKey * @param string $iv * @param string $encrypted * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\DecryptException */ public function decryptData(string $sessionKey, string $iv, string $encrypted): array { $decrypted = AES::decrypt( base64_decode($encrypted, false), base64_decode($sessionKey, false), base64_decode($iv, false) ); $decrypted = json_decode($decrypted, true); if (!$decrypted) { throw new DecryptException('The given payload is invalid.'); } return $decrypted; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Express/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Express; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class Client. * * @author kehuanhuan <1152018701@qq.com> */ class Client extends BaseClient { /** * 绑定、解绑物流账号 * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function bind(array $params = []) { if (empty($params['type']) || empty($params['biz_id']) || empty($params['delivery_id'])) { throw new InvalidArgumentException('Missing parameter.'); } return $this->httpPostJson('cgi-bin/express/business/account/bind', $params); } /** * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function listProviders() { return $this->httpGet('cgi-bin/express/business/delivery/getall'); } /** * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getAllAccount() { return $this->httpGet('cgi-bin/express/business/account/getall'); } /** * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createWaybill(array $params = []) { return $this->httpPostJson('cgi-bin/express/business/order/add', $params); } /** * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deleteWaybill(array $params = []) { return $this->httpPostJson('cgi-bin/express/business/order/cancel', $params); } /** * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getWaybill(array $params = []) { return $this->httpPostJson('cgi-bin/express/business/order/get', $params); } /** * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getWaybillTrack(array $params = []) { return $this->httpPostJson('cgi-bin/express/business/path/get', $params); } /** * @param string $deliveryId * @param string $bizId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getBalance(string $deliveryId, string $bizId) { return $this->httpPostJson('cgi-bin/express/business/quota/get', [ 'delivery_id' => $deliveryId, 'biz_id' => $bizId, ]); } /** * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getPrinter() { return $this->httpPostJson('cgi-bin/express/business/printer/getall'); } /** * @param string $openid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function bindPrinter(string $openid) { return $this->httpPostJson('cgi-bin/express/business/printer/update', [ 'update_type' => 'bind', 'openid' => $openid, ]); } /** * @param string $openid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function unbindPrinter(string $openid) { return $this->httpPostJson('cgi-bin/express/business/printer/update', [ 'update_type' => 'unbind', 'openid' => $openid, ]); } /** * 创建退货 ID * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function createReturn(array $params = []) { return $this->httpPostJson('cgi-bin/express/delivery/return/add', $params); } /** * 查询退货 ID 状态 * @param string $returnId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getReturn(string $returnId) { return $this->httpPostJson('cgi-bin/express/delivery/return/get', [ 'return_id' => $returnId ]); } /** * 解绑退货 ID * @param string $returnId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function unbindReturn(string $returnId) { return $this->httpPostJson('cgi-bin/express/delivery/return/unbind', [ 'return_id' => $returnId ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Express/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Express; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author kehuanhuan <1152018701@qq.com> */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['express'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Live/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Live; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author onekb <1@1kb.ren> */ class Client extends BaseClient { /** * Get Room List. * * @param int $start * @param int $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @deprecated This method has been merged into `\EasyWeChat\MiniProgram\Broadcast` */ public function getRooms(int $start = 0, int $limit = 10) { $params = [ 'start' => $start, 'limit' => $limit, ]; return $this->httpPostJson('wxa/business/getliveinfo', $params); } /** * Get Playback List. * * @param int $roomId * @param int $start * @param int $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @deprecated This method has been merged into `\EasyWeChat\MiniProgram\Broadcast` */ public function getPlaybacks(int $roomId, int $start = 0, int $limit = 10) { $params = [ 'action' => 'get_replay', 'room_id' => $roomId, 'start' => $start, 'limit' => $limit, ]; return $this->httpPostJson('wxa/business/getliveinfo', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Live/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Live; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author onekb <1@1kb.ren> */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['live'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/CartClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Mall; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class CartClient extends BaseClient { /** * 导入收藏. * * @param array $params * @param bool $isTest * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add($params, $isTest = false) { return $this->httpPostJson('mall/addshoppinglist', $params, ['is_test' => (int) $isTest]); } /** * 查询用户收藏信息. * * @param array $params * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function query($params) { return $this->httpPostJson('mall/queryshoppinglist', $params, ['type' => 'batchquery']); } /** * 查询用户收藏信息. * * @param array $params * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function queryByPage($params) { return $this->httpPostJson('mall/queryshoppinglist', $params, ['type' => 'getbypage']); } /** * 删除收藏. * * @param string $openid * @param array $products * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete($openid, array $products = []) { if (empty($products)) { return $this->httpPostJson('mall/deletebizallshoppinglist', ['user_open_id' => $openid]); } return $this->httpPostJson('mall/deleteshoppinglist', ['user_open_id' => $openid, 'sku_product_list' => $products]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/ForwardsMall.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Mall; /** * Class Application. * * @author mingyoung * * @property \EasyWeChat\MiniProgram\Mall\OrderClient $order * @property \EasyWeChat\MiniProgram\Mall\CartClient $cart * @property \EasyWeChat\MiniProgram\Mall\ProductClient $product * @property \EasyWeChat\MiniProgram\Mall\MediaClient $media */ class ForwardsMall { /** * @var \EasyWeChat\Kernel\ServiceContainer */ protected $app; /** * @param \EasyWeChat\Kernel\ServiceContainer $app */ public function __construct($app) { $this->app = $app; } /** * @param string $property * * @return mixed */ public function __get($property) { return $this->app["mall.{$property}"]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/MediaClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Mall; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class MediaClient extends BaseClient { /** * 更新或导入媒体信息. * * @param array $params * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function import($params) { return $this->httpPostJson('mall/importmedia', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/OrderClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Mall; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class OrderClient extends BaseClient { /** * 导入订单. * * @param array $params * @param bool $isHistory * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add($params, $isHistory = false) { return $this->httpPostJson('mall/importorder', $params, ['action' => 'add-order', 'is_history' => (int) $isHistory]); } /** * 导入订单. * * @param array $params * @param bool $isHistory * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update($params, $isHistory = false) { return $this->httpPostJson('mall/importorder', $params, ['action' => 'update-order', 'is_history' => (int) $isHistory]); } /** * 删除订单. * * @param string $openid * @param string $orderId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete($openid, $orderId) { $params = [ 'user_open_id' => $openid, 'order_id' => $orderId, ]; return $this->httpPostJson('mall/deleteorder', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/ProductClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Mall; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class ProductClient extends BaseClient { /** * 更新或导入物品信息. * * @param array $params * @param bool $isTest * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function import($params, $isTest = false) { return $this->httpPostJson('mall/importproduct', $params, ['is_test' => (int) $isTest]); } /** * 查询物品信息. * * @param array $params * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function query($params) { return $this->httpPostJson('mall/queryproduct', $params, ['type' => 'batchquery']); } /** * 小程序的物品是否可被搜索. * * @param bool $value * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setSearchable($value) { return $this->httpPostJson('mall/brandmanage', ['can_be_search' => $value], ['action' => 'set_biz_can_be_search']); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Mall/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Mall; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['mall'] = function ($app) { return new ForwardsMall($app); }; $app['mall.order'] = function ($app) { return new OrderClient($app); }; $app['mall.cart'] = function ($app) { return new CartClient($app); }; $app['mall.product'] = function ($app) { return new ProductClient($app); }; $app['mall.media'] = function ($app) { return new MediaClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/NearbyPoi/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\NearbyPoi; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class Client. * * @author joyeekk */ class Client extends BaseClient { /** * Add nearby poi. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(array $params) { $params = array_merge([ 'is_comm_nearby' => '1', 'poi_id' => '', ], $params); return $this->httpPostJson('wxa/addnearbypoi', $params); } /** * Update nearby poi. * * @param string $poiId * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $poiId, array $params) { $params = array_merge([ 'is_comm_nearby' => '1', 'poi_id' => $poiId, ], $params); return $this->httpPostJson('wxa/addnearbypoi', $params); } /** * Delete nearby poi. * * @param string $poiId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $poiId) { return $this->httpPostJson('wxa/delnearbypoi', [ 'poi_id' => $poiId, ]); } /** * Get nearby poi list. * * @param int $page * @param int $pageRows * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function list(int $page, int $pageRows) { return $this->httpGet('wxa/getnearbypoilist', [ 'page' => $page, 'page_rows' => $pageRows, ]); } /** * Set nearby poi show status. * * @param string $poiId * @param int $status * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setVisibility(string $poiId, int $status) { if (!in_array($status, [0, 1], true)) { throw new InvalidArgumentException('status should be 0 or 1.'); } return $this->httpPostJson('wxa/setnearbypoishowstatus', [ 'poi_id' => $poiId, 'status' => $status, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/NearbyPoi/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\NearbyPoi; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author joyeekk */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['nearby_poi'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/OCR/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\OCR; use EasyWeChat\OfficialAccount\OCR\Client; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author joyeekk */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['ocr'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/OpenData/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\OpenData; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author tianyong90 <412039588@qq.com> */ class Client extends BaseClient { /** * removeUserStorage. * * @param string $openid * @param string $sessionKey * @param array $key * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function removeUserStorage(string $openid, string $sessionKey, array $key) { $data = ['key' => $key]; $query = [ 'openid' => $openid, 'sig_method' => 'hmac_sha256', 'signature' => hash_hmac('sha256', json_encode($data), $sessionKey), ]; return $this->httpPostJson('wxa/remove_user_storage', $data, $query); } /** * setUserStorage. * * @param string $openid * @param string $sessionKey * @param array $kvList * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setUserStorage(string $openid, string $sessionKey, array $kvList) { $kvList = $this->formatKVLists($kvList); $data = ['kv_list' => $kvList]; $query = [ 'openid' => $openid, 'sig_method' => 'hmac_sha256', 'signature' => hash_hmac('sha256', json_encode($data), $sessionKey), ]; return $this->httpPostJson('wxa/set_user_storage', $data, $query); } /** * @param array $params * * @return array */ protected function formatKVLists(array $params) { $formatted = []; foreach ($params as $name => $value) { $formatted[] = [ 'key' => $name, 'value' => strval($value), ]; } return $formatted; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/OpenData/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\OpenData; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['open_data'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/PhoneNumber/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\PhoneNumber; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @package EasyWeChat\MiniProgram\PhoneNumber * * @author 读心印 */ class Client extends BaseClient { /** * 获取用户手机号. * * @see https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/phonenumber/phonenumber.getPhoneNumber.html * * @param string $code * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @author 读心印 */ public function getUserPhoneNumber(string $code) { $params = [ 'code' => $code ]; return $this->httpPostJson('wxa/business/getuserphonenumber', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/PhoneNumber/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\PhoneNumber; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['phone_number'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Plugin/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Plugin; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * @param string $appId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function apply($appId) { return $this->httpPostJson('wxa/plugin', [ 'action' => 'apply', 'plugin_appid' => $appId, ]); } /** * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list() { return $this->httpPostJson('wxa/plugin', [ 'action' => 'list', ]); } /** * @param string $appId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function unbind($appId) { return $this->httpPostJson('wxa/plugin', [ 'action' => 'unbind', 'plugin_appid' => $appId, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Plugin/DevClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Plugin; use EasyWeChat\Kernel\BaseClient; /** * Class DevClient. * * @author her-cat */ class DevClient extends BaseClient { /** * Get users. * * @param int $page * @param int $size * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUsers(int $page = 1, int $size = 10) { return $this->httpPostJson('wxa/devplugin', [ 'action' => 'dev_apply_list', 'page' => $page, 'num' => $size, ]); } /** * Agree to use plugin. * * @param string $appId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function agree(string $appId) { return $this->httpPostJson('wxa/devplugin', [ 'action' => 'dev_agree', 'appid' => $appId, ]); } /** * Refuse to use plugin. * * @param string $reason * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function refuse(string $reason) { return $this->httpPostJson('wxa/devplugin', [ 'action' => 'dev_refuse', 'reason' => $reason, ]); } /** * Delete rejected applications. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete() { return $this->httpPostJson('wxa/devplugin', [ 'action' => 'dev_delete', ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Plugin/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Plugin; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * Registers services on the given container. * * This method should only be used to configure services and parameters. * It should not get services. * * @param \Pimple\Container $app */ public function register(Container $app) { $app['plugin'] = function ($app) { return new Client($app); }; $app['plugin_dev'] = function ($app) { return new DevClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/QrCode/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\QrCode; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidConfigException; use EasyWeChat\Kernel\Support\Collection; use GuzzleHttp\Exception\GuzzleException; use Psr\Http\Message\ResponseInterface; /** * QrCode Client * * 普通链接二维码 * * @link https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/qrcode/qrcode.html * @link https://developers.weixin.qq.com/miniprogram/introduction/qrcode.html * * @author dysodeng */ class Client extends BaseClient { /** * 获取已设置的二维码规则 * * @return array|Collection|object|ResponseInterface|string * * @throws InvalidConfigException * @throws GuzzleException */ public function list() { return $this->httpPostJson('cgi-bin/wxopen/qrcodejumpget'); } /** * 获取校验文件名称及内容 * * @return array|Collection|object|ResponseInterface|string * * @throws GuzzleException * @throws InvalidConfigException */ public function getVerifyFile() { return $this->httpPostJson('cgi-bin/wxopen/qrcodejumpdownload'); } /** * 增加或修改二维码规则 * * @param array $params * * @return array|Collection|object|ResponseInterface|string * @throws GuzzleException * @throws InvalidConfigException */ public function set(array $params) { return $this->httpPostJson('cgi-bin/wxopen/qrcodejumpadd', $params); } /** * 发布已设置的二维码规则 * * @param string $prefix * * @return array|Collection|object|ResponseInterface|string * * @throws GuzzleException * @throws InvalidConfigException */ public function publish(string $prefix) { $params = [ 'prefix' => $prefix ]; return $this->httpPostJson('cgi-bin/wxopen/qrcodejumppublish', $params); } /** * 删除已设置的二维码规则 * * @param string $prefix * * @return array|Collection|object|ResponseInterface|string * * @throws GuzzleException * @throws InvalidConfigException */ public function delete(string $prefix) { $params = [ 'prefix' => $prefix ]; return $this->httpPostJson('cgi-bin/wxopen/qrcodejumpdelete', $params); } /** * 将二维码长链接转成短链接 * * @param string $long_url * * @return array|Collection|object|ResponseInterface|string * * @throws GuzzleException * @throws InvalidConfigException */ public function shortUrl(string $long_url) { $params = [ 'long_url' => $long_url, 'action' => 'long2short' ]; return $this->httpPostJson('cgi-bin/shorturl', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/QrCode/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\QrCode; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * QrCode ServiceProvider. * * @author dysodeng */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $pimple) { $pimple['qr_code'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/RealtimeLog/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\RealtimeLog; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author her-cat */ class Client extends BaseClient { /** * Real time log query. * * @param string $date * @param int $beginTime * @param int $endTime * @param array $options * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function search(string $date, int $beginTime, int $endTime, array $options = []) { $params = [ 'date' => $date, 'begintime' => $beginTime, 'endtime' => $endTime, ]; return $this->httpGet('wxaapi/userlog/userlog_search', $params + $options); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/RealtimeLog/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\RealtimeLog; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author her-cat */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} */ public function register(Container $app) { $app['realtime_log'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/RiskControl/Client.php ================================================ httpPostJson('wxa/getuserriskrank', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/RiskControl/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Search; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author her-cat */ class Client extends BaseClient { /** * Submit applet page URL and parameter information. * * @param array $pages * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function submitPage(array $pages) { return $this->httpPostJson('wxa/search/wxaapi_submitpages', compact('pages')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Search/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Search; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author her-cat */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['search'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Server/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Server; use EasyWeChat\MiniProgram\Encryptor; use EasyWeChat\OfficialAccount\Server\Guard; use EasyWeChat\OfficialAccount\Server\Handlers\EchoStrHandler; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { !isset($app['encryptor']) && $app['encryptor'] = function ($app) { return new Encryptor( $app['config']['app_id'], $app['config']['token'], $app['config']['aes_key'] ); }; !isset($app['server']) && $app['server'] = function ($app) { $guard = new Guard($app); $guard->push(new EchoStrHandler($app)); return $guard; }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Account/Client.php ================================================ */ class Client extends BaseClient { /** * 获取商家类目列表 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getCategoryList() { return $this->httpPostJson('shop/account/get_category_list'); } /** * 获取商家品牌列表 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getBrandList() { return $this->httpPostJson('shop/account/get_brand_list'); } /** * 更新商家信息 * * @param string $path 小程序path * @param string $phone 客服联系方式 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateInfo(string $path = '', string $phone = '') { return $this->httpPostJson('shop/account/update_info', [ 'service_agent_path' => $path, 'service_agent_phone' => $phone, ]); } /** * 获取商家信息 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getInfo() { return $this->httpPostJson('shop/account/get_info'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Account/ServiceProvider.php ================================================ */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} */ public function register(Container $app) { $app['shop_account'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Aftersale/Client.php ================================================ */ class Client extends BaseClient { /** * 创建售后 * * @param array $aftersale * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(array $aftersale) { return $this->httpPostJson('shop/ecaftersale/add', $aftersale); } /** * 获取订单下售后单 * * @param array $order 订单数据 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(array $order) { return $this->httpPostJson('shop/ecaftersale/get', $order); } /** * 更新售后 * * @param array $order 订单数据 * @param array $aftersale 售后数据 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(array $order, array $aftersale) { return $this->httpPostJson('shop/ecaftersale/update', array_merge($order, $aftersale)); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Aftersale/ServiceProvider.php ================================================ */ class ServiceProvider implements ServiceProviderInterface { /** * @inheritDoc */ public function register(Container $app) { $app['shop_aftersale'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Basic/Client.php ================================================ */ class Client extends BaseClient { /** * 获取商品类目 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getCat() { return $this->httpPostJson('shop/cat/get'); } /** * @param string $imageFilePath 图片文件路径 * @param int $respType 返回类型 * @param int $uploadType 上传类型,本地图片或者网络图片 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function imgUpload(string $imageFilePath, int $respType = 1, int $uploadType = 0) { if ($uploadType == 0) { return $this->httpUpload('shop/img/upload', [ 'media' => $imageFilePath, ], [ 'resp_type' => $respType, ]); } else { return $this->httpPostJson('shop/img/upload', [], [ 'img_url' => $imageFilePath, 'resp_type' => $respType, 'upload_type' => $uploadType ]); } } /** * 品牌审核 * * @param array $brand 品牌信息 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function auditBrand(array $brand) { return $this->httpPostJson('shop/audit/audit_brand', [ 'audit_req' => $brand ]); } /** * 类目审核 * * @param array $category 类目资质 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function auditCategory(array $category) { return $this->httpPostJson('shop/audit/audit_category', [ 'audit_req' => $category ]); } /** * 获取审核结果 * * @param string $auditId 提交审核时返回的id * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function auditResult(string $auditId) { return $this->httpPostJson('shop/audit/result', [ 'audit_id' => $auditId ]); } /** * 获取小程序资质 * * @param int $reqType * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getMiniAppCertificate(int $reqType = 2) { return $this->httpPostJson('shop/audit/get_miniapp_certificate', [ 'req_type' => $reqType ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Basic/ServiceProvider.php ================================================ */ class ServiceProvider implements ServiceProviderInterface { /** * @inheritDoc */ public function register(Container $app) { $app['shop_basic'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Delivery/Client.php ================================================ */ class Client extends BaseClient { /** * 获取快递公司列表 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getCompanyList() { return $this->httpPostJson('shop/delivery/get_company_list'); } /** * 订单发货 * * @param array $order * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $order) { return $this->httpPostJson('shop/delivery/send', $order); } /** * 订单确认收货 * * @param array $order * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function recieve(array $order) { return $this->httpPostJson('shop/delivery/recieve', $order); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Delivery/ServiceProvider.php ================================================ */ class ServiceProvider implements ServiceProviderInterface { /** * @inheritDoc */ public function register(Container $app) { $app['shop_delivery'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Order/Client.php ================================================ */ class Client extends BaseClient { /** * 检查场景值是否在支付校验范围内 * * @param int $scene 场景值 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function sceneCheck(int $scene) { return $this->httpPostJson('shop/scene/check', ['scene' => $scene]); } /** * 生成订单 * * @param array $order * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $order) { return $this->httpPostJson('shop/order/add', $order); } /** * 生成订单 * * @param array $order * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(array $order) { return $this->httpPostJson('shop/order/add', $order); } /** * 获取订单详情 * * @param string $openid 用户的openid * @param array $orderId 微信侧订单id (订单id二选一) * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $openid, array $orderId) { return $this->httpPostJson('shop/order/get', array_merge($orderId, ['openid' => $openid])); } /** * 关闭订单 * * @param array $params 请求参数 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function close(array $params) { return $this->httpPostJson('shop/order/close', $params); } /** * 获取订单列表 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getList(array $data) { return $this->httpPostJson('shop/order/get_list', $data); } /** * 同步订单支付结果 * * @param array $pay * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function pay(array $pay) { return $this->httpPostJson('shop/order/pay', $pay); } /** * 同步订单支付结果 * * @param array $pay * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function syncPayState(array $pay) { return $this->httpPostJson('shop/order/pay', $pay); } /** * 同步订单支付结果 * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getPayInfo(array $params) { return $this->httpPostJson('shop/order/getpaymentparams', $params); } /** * 获取推广员订单 * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getFinderOrders(array $params) { return $this->httpPostJson('shop/order/get_list_by_finder', $params); } /** * 获取分享员订单 * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getSharerOrders(array $params) { return $this->httpPostJson('shop/order/get_list_by_sharer', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Order/ServiceProvider.php ================================================ */ class ServiceProvider implements ServiceProviderInterface { /** * @inheritDoc */ public function register(Container $app) { $app['shop_order'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Register/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Shop\Register; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author her-cat */ class Client extends BaseClient { /** * 接入申请 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function apply() { return $this->httpPostJson('shop/register/apply'); } /** * 获取接入状态 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function check() { return $this->httpPostJson('shop/register/check'); } /** * 完成接入任务 * * @param int $accessInfoItem * 6:完成spu接口,7:完成订单接口,8:完成物流接口,9:完成售后接口,10:测试完成,11:发版完成 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function finishAccessInfo(int $accessInfoItem) { return $this->httpPostJson('shop/register/finish_access_info', [ 'access_info_item' => $accessInfoItem ]); } /** * 场景接入申请 * * @param int $sceneGroupId 1:视频号、公众号场景 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function applyScene(int $sceneGroupId = 1) { return $this->httpPostJson('shop/register/apply_scene', [ 'scene_group_id' => $sceneGroupId ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Register/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Shop\Register; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author her-cat */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} */ public function register(Container $app) { $app['shop_register'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Spu/Client.php ================================================ */ class Client extends BaseClient { /** * 添加商品 * * @param array $product 商品信息 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(array $product) { return $this->httpPostJson('shop/spu/add', $product); } /** * 删除商品 * * @param array $productId 商品编号信息 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function del(array $productId) { return $this->httpPostJson('shop/spu/del', $productId); } /** * 获取商品 * * @param array $productId 商品编号信息 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(array $productId) { return $this->httpPostJson('shop/spu/get', $productId); } /** * 获取商品列表 * * @param array $product 商品信息 * @param array $page 分页信息 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getList(array $product, array $page) { return $this->httpPostJson('shop/spu/get_list', array_merge($product, $page)); } /** * 撤回商品审核 * * @param array $productId 商品编号信息 交易组件平台内部商品ID,与out_product_id二选一 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delAudit(array $productId) { return $this->httpPostJson('shop/spu/del_audit', $productId); } /** * 更新商品 * * @param array $product * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(array $product) { return $this->httpPostJson('shop/spu/update', $product); } /** * 该免审更新商品 * * @param array $product * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateWithoutAudit(array $product) { return $this->httpPostJson('shop/spu/update_without_audit', $product); } /** * 上架商品 * * @param array $productId 商品编号数据 交易组件平台内部商品ID,与out_product_id二选一 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function listing(array $productId) { return $this->httpPostJson('shop/spu/listing', $productId); } /** * 下架商品 * * @param array $productId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delisting(array $productId) { return $this->httpPostJson('shop/spu/delisting', $productId); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Shop/Spu/ServiceProvider.php ================================================ * @package EasyWeChat\MiniProgram\Shop\Spu */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} */ public function register(Container $app) { $app['shop_spu'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/ShortLink/Client.php ================================================ */ class Client extends BaseClient { /** * 获取小程序 Short Link * * @param string $pageUrl * @param string $pageTitle * @param bool $isPermanent * * @return array|Collection|object|ResponseInterface|string * * @throws GuzzleException * @throws InvalidConfigException */ public function getShortLink(string $pageUrl, string $pageTitle, bool $isPermanent = false) { $params = [ 'page_url' => $pageUrl, 'page_title' => $pageTitle, 'is_permanent' => $isPermanent, ]; return $this->httpPostJson('wxa/genwxashortlink', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/ShortLink/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Soter; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author her-cat */ class Client extends BaseClient { /** * @param string $openid * @param string $json * @param string $signature * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function verifySignature(string $openid, string $json, string $signature) { return $this->httpPostJson('cgi-bin/soter/verify_signature', [ 'openid' => $openid, 'json_string' => $json, 'json_signature' => $signature, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Soter/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Soter; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author her-cat */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} */ public function register(Container $app) { $app['soter'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/SubscribeMessage/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\SubscribeMessage; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use ReflectionClass; /** * Class Client. * * @author hugo */ class Client extends BaseClient { /** * {@inheritdoc}. */ protected $message = [ 'touser' => '', 'template_id' => '', 'page' => '', 'data' => [], 'miniprogram_state' => 'formal', ]; /** * {@inheritdoc}. */ protected $required = ['touser', 'template_id', 'data']; /** * Send a template message. * * @param array $data * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $data = []) { $params = $this->formatMessage($data); $this->restoreMessage(); return $this->httpPostJson('cgi-bin/message/subscribe/send', $params); } /** * @param array $data * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function formatMessage(array $data = []) { $params = array_merge($this->message, $data); foreach ($params as $key => $value) { if (in_array($key, $this->required, true) && empty($value) && empty($this->message[$key])) { throw new InvalidArgumentException(sprintf('Attribute "%s" can not be empty!', $key)); } $params[$key] = empty($value) ? $this->message[$key] : $value; } foreach ($params['data'] as $key => $value) { if (is_array($value)) { if (\array_key_exists('value', $value)) { $params['data'][$key] = ['value' => $value['value']]; continue; } if (count($value) >= 1) { $value = [ 'value' => $value[0], // 'color' => $value[1],// color unsupported ]; } } else { $value = [ 'value' => strval($value), ]; } $params['data'][$key] = $value; } return $params; } /** * Restore message. */ protected function restoreMessage() { $this->message = (new ReflectionClass(static::class))->getDefaultProperties()['message']; } /** * Combine templates and add them to your personal template library under your account. * * @param string $tid * @param array $kidList * @param string|null $sceneDesc * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addTemplate(string $tid, array $kidList, string $sceneDesc = null) { $sceneDesc = $sceneDesc ?? ''; $data = \compact('tid', 'kidList', 'sceneDesc'); return $this->httpPost('wxaapi/newtmpl/addtemplate', $data); } /** * Delete personal template under account. * * @param string $id * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deleteTemplate(string $id) { return $this->httpPost('wxaapi/newtmpl/deltemplate', ['priTmplId' => $id]); } /** * Get keyword list under template title. * * @param string $tid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTemplateKeywords(string $tid) { return $this->httpGet('wxaapi/newtmpl/getpubtemplatekeywords', compact('tid')); } /** * Get the title of the public template under the category to which the account belongs. * * @param array $ids * @param int $start * @param int $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTemplateTitles(array $ids, int $start = 0, int $limit = 30) { $ids = \implode(',', $ids); $query = \compact('ids', 'start', 'limit'); return $this->httpGet('wxaapi/newtmpl/getpubtemplatetitles', $query); } /** * Get list of personal templates under the current account. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTemplates() { return $this->httpGet('wxaapi/newtmpl/gettemplate'); } /** * Get the category of the applet account. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getCategory() { return $this->httpGet('wxaapi/newtmpl/getcategory'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/SubscribeMessage/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\SubscribeMessage; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['subscribe_message'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/TemplateMessage/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\TemplateMessage; use EasyWeChat\OfficialAccount\TemplateMessage\Client as BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { public const API_SEND = 'cgi-bin/message/wxopen/template/send'; /** * {@inheritdoc}. */ protected $message = [ 'touser' => '', 'template_id' => '', 'page' => '', 'form_id' => '', 'data' => [], 'emphasis_keyword' => '', ]; /** * {@inheritdoc}. */ protected $required = ['touser', 'template_id', 'form_id']; /** * @param int $offset * @param int $count * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(int $offset, int $count) { return $this->httpPostJson('cgi-bin/wxopen/template/library/list', compact('offset', 'count')); } /** * @param string $id * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $id) { return $this->httpPostJson('cgi-bin/wxopen/template/library/get', compact('id')); } /** * @param string $id * @param array $keyword * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(string $id, array $keyword) { return $this->httpPostJson('cgi-bin/wxopen/template/add', [ 'id' => $id, 'keyword_id_list' => $keyword, ]); } /** * @param string $templateId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $templateId) { return $this->httpPostJson('cgi-bin/wxopen/template/del', [ 'template_id' => $templateId, ]); } /** * @param int $offset * @param int $count * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTemplates(int $offset, int $count) { return $this->httpPostJson('cgi-bin/wxopen/template/list', compact('offset', 'count')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/TemplateMessage/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\TemplateMessage; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['template_message'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UniformMessage/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\UniformMessage; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\OfficialAccount\TemplateMessage\Client as BaseClient; class Client extends BaseClient { public const API_SEND = 'cgi-bin/message/wxopen/template/uniform_send'; /** * {@inheritdoc}. * * @var array */ protected $message = [ 'touser' => '', ]; /** * Weapp Attributes. * * @var array */ protected $weappMessage = [ 'template_id' => '', 'page' => '', 'form_id' => '', 'data' => [], 'emphasis_keyword' => '', ]; /** * Official account attributes. * * @var array */ protected $mpMessage = [ 'appid' => '', 'template_id' => '', 'url' => '', 'miniprogram' => [], 'data' => [], ]; /** * Required attributes. * * @var array */ protected $required = ['touser', 'template_id', 'form_id', 'miniprogram', 'appid']; /** * @param array $data * * @return array * * @throws InvalidArgumentException */ protected function formatMessage(array $data = []) { $params = array_merge($this->message, $data); if (empty($params['touser'])) { throw new InvalidArgumentException(sprintf('Attribute "touser" can not be empty!')); } if (!empty($params['weapp_template_msg'])) { $params['weapp_template_msg'] = $this->formatWeappMessage($params['weapp_template_msg']); } if (!empty($params['mp_template_msg'])) { $params['mp_template_msg'] = $this->formatMpMessage($params['mp_template_msg']); } return $params; } /** * @param array $data * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function formatWeappMessage(array $data = []) { $params = $this->baseFormat($data, $this->weappMessage); $params['data'] = $this->formatData($params['data'] ?? []); return $params; } /** * @param array $data * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function formatMpMessage(array $data = []) { $params = $this->baseFormat($data, $this->mpMessage); if (empty($params['miniprogram']['appid'])) { $params['miniprogram']['appid'] = $this->app['config']['app_id']; } $params['data'] = $this->formatData($params['data'] ?? []); return $params; } /** * @param array $data * @param array $default * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function baseFormat($data = [], $default = []) { $params = array_merge($default, $data); foreach ($params as $key => $value) { if (in_array($key, $this->required, true) && empty($value) && empty($default[$key])) { throw new InvalidArgumentException(sprintf('Attribute "%s" can not be empty!', $key)); } $params[$key] = empty($value) ? $default[$key] : $value; } return $params; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UniformMessage/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\UniformMessage; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['uniform_message'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Union/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Union; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author Abbotton */ class Client extends BaseClient { /** * Add promotion. * * @param string $promotionSourceName * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createPromotion(string $promotionSourceName) { $params = [ 'promotionSourceName' => $promotionSourceName, ]; return $this->httpPostJson('union/promoter/promotion/add', $params); } /** * Delete promotion. * * @param string $promotionSourcePid * @param string $promotionSourceName * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deletePromotion(string $promotionSourcePid, string $promotionSourceName) { $params = [ 'promotionSourceName' => $promotionSourceName, 'promotionSourcePid' => $promotionSourcePid, ]; return $this->httpPostJson('union/promoter/promotion/del', $params); } /** * Update promotion. * * @param array $previousPromotionInfo * @param array $promotionInfo * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updatePromotion(array $previousPromotionInfo, array $promotionInfo) { $params = [ 'previousPromotionInfo' => $previousPromotionInfo, 'promotionInfo' => $promotionInfo, ]; return $this->httpPostJson('union/promoter/promotion/upd', $params); } /** * Get a list of promotion spots. * * @param int $start * @param int $limit * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getPromotionSourceList(int $start = 0, int $limit = 20) { $params = [ 'start' => $start, 'limit' => $limit ]; return $this->httpGet('union/promoter/promotion/list', $params); } /** * Get the list of affiliate product categories and category IDs. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getProductCategory() { return $this->httpGet('union/promoter/product/category'); } /** * Get the list and detail of affiliate product. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getProductList(array $params) { return $this->httpGet('union/promoter/product/list', $params); } /** * Get product promotion materials * * @param string $pid * @param array $productList * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getProductMaterial(string $pid, array $productList) { $params = [ 'pid' => $pid, 'productList' => $productList, ]; return $this->httpPostJson('union/promoter/product/generate', $params); } /** * Query order details based on order ID array. * * @param array $orderIdList * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getOrderInfo(array $orderIdList) { return $this->httpPostJson('union/promoter/order/info', $orderIdList); } /** * Query and filter the order list. * * @param int $page * @param string $startTimestamp * @param string $endTimestamp * @param string $commissionStatus * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function searchOrder(int $page = 1, $startTimestamp = '', $endTimestamp = '', $commissionStatus = '') { $params = [ 'page' => $page, 'startTimestamp' => $startTimestamp, 'endTimestamp' => $endTimestamp, 'commissionStatus' => $commissionStatus ]; return $this->httpGet('union/promoter/order/search', $params); } /** * Get featured products of union. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getFeaturedProducts(array $params) { return $this->httpGet('union/promoter/product/select', $params); } /** * Query the details of the targeted plan. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTargetPlanInfo(array $params) { return $this->httpGet('union/promoter/target/plan_info', $params); } /** * Apply to join the targeted plan. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function applyJoinTargetPlan(array $params) { return $this->httpPostJson('union/promoter/target/apply_target', $params); } /** * Query the status of the targeted plan apply. * * @param array $params * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTargetPlanStatus(array $params) { return $this->httpGet('union/promoter/target/apply_status', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/Union/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\MiniProgram\Union; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author Abbotton */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['union'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UrlLink/Client.php ================================================ httpPostJson('wxa/generate_urllink', $param); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UrlLink/ServiceProvider.php ================================================ httpPostJson('wxa/generatescheme', $param); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/MiniProgram/UrlScheme/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount; use EasyWeChat\BasicService; use EasyWeChat\Kernel\ServiceContainer; /** * Class Application. * * @author overtrue * * @property \EasyWeChat\BasicService\Media\Client $media * @property \EasyWeChat\BasicService\Url\Client $url * @property \EasyWeChat\BasicService\QrCode\Client $qrcode * @property \EasyWeChat\BasicService\Jssdk\Client $jssdk * @property \EasyWeChat\OfficialAccount\Auth\AccessToken $access_token * @property \EasyWeChat\OfficialAccount\Server\Guard $server * @property \EasyWeChat\OfficialAccount\User\UserClient $user * @property \EasyWeChat\OfficialAccount\User\TagClient $user_tag * @property \EasyWeChat\OfficialAccount\Menu\Client $menu * @property \EasyWeChat\OfficialAccount\TemplateMessage\Client $template_message * @property \EasyWeChat\OfficialAccount\SubscribeMessage\Client $subscribe_message * @property \EasyWeChat\OfficialAccount\Material\Client $material * @property \EasyWeChat\OfficialAccount\CustomerService\Client $customer_service * @property \EasyWeChat\OfficialAccount\CustomerService\SessionClient $customer_service_session * @property \EasyWeChat\OfficialAccount\Semantic\Client $semantic * @property \EasyWeChat\OfficialAccount\DataCube\Client $data_cube * @property \EasyWeChat\OfficialAccount\AutoReply\Client $auto_reply * @property \EasyWeChat\OfficialAccount\Broadcasting\Client $broadcasting * @property \EasyWeChat\OfficialAccount\Card\Card $card * @property \EasyWeChat\OfficialAccount\Device\Client $device * @property \EasyWeChat\OfficialAccount\ShakeAround\ShakeAround $shake_around * @property \EasyWeChat\OfficialAccount\POI\Client $poi * @property \EasyWeChat\OfficialAccount\Store\Client $store * @property \EasyWeChat\OfficialAccount\Base\Client $base * @property \EasyWeChat\OfficialAccount\Comment\Client $comment * @property \EasyWeChat\OfficialAccount\OCR\Client $ocr * @property \EasyWeChat\OfficialAccount\Goods\Client $goods * @property \Overtrue\Socialite\Providers\WeChat $oauth * @property \EasyWeChat\OfficialAccount\WiFi\Client $wifi * @property \EasyWeChat\OfficialAccount\WiFi\CardClient $wifi_card * @property \EasyWeChat\OfficialAccount\WiFi\DeviceClient $wifi_device * @property \EasyWeChat\OfficialAccount\WiFi\ShopClient $wifi_shop * @property \EasyWeChat\OfficialAccount\Guide\Client $guide * @property \EasyWeChat\OfficialAccount\Draft\Client $draft * @property \EasyWeChat\OfficialAccount\FreePublish\Client $free_publish */ class Application extends ServiceContainer { /** * @var array */ protected $providers = [ Auth\ServiceProvider::class, Server\ServiceProvider::class, User\ServiceProvider::class, OAuth\ServiceProvider::class, Menu\ServiceProvider::class, TemplateMessage\ServiceProvider::class, SubscribeMessage\ServiceProvider::class, Material\ServiceProvider::class, CustomerService\ServiceProvider::class, Semantic\ServiceProvider::class, DataCube\ServiceProvider::class, POI\ServiceProvider::class, AutoReply\ServiceProvider::class, Broadcasting\ServiceProvider::class, Card\ServiceProvider::class, Device\ServiceProvider::class, ShakeAround\ServiceProvider::class, Store\ServiceProvider::class, Comment\ServiceProvider::class, Base\ServiceProvider::class, OCR\ServiceProvider::class, Goods\ServiceProvider::class, WiFi\ServiceProvider::class, Draft\ServiceProvider::class, FreePublish\ServiceProvider::class, // Base services BasicService\QrCode\ServiceProvider::class, BasicService\Media\ServiceProvider::class, BasicService\Url\ServiceProvider::class, BasicService\Jssdk\ServiceProvider::class, // Append Guide Interface Guide\ServiceProvider::class, ]; } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Auth/AccessToken.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Auth; use EasyWeChat\Kernel\AccessToken as BaseAccessToken; /** * Class AuthorizerAccessToken. * * @author overtrue */ class AccessToken extends BaseAccessToken { /** * @var string */ protected $endpointToGetToken = 'cgi-bin/token'; /** * @return array */ protected function getCredentials(): array { return [ 'grant_type' => 'client_credential', 'appid' => $this->app['config']['app_id'], 'secret' => $this->app['config']['secret'], ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Auth/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Auth; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { !isset($app['access_token']) && $app['access_token'] = function ($app) { return new AccessToken($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/AutoReply/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\AutoReply; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * Get current auto reply settings. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function current() { return $this->httpGet('cgi-bin/get_current_autoreply_info'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/AutoReply/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\AutoReply; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['auto_reply'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Base/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Base; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Get api quota. * * @param string $cgiPath api cgi_path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getQuota(string $cgiPath) { $params = [ 'cgi_path' => $cgiPath, ]; return $this->httpPostJson('cgi-bin/openapi/quota/get', $params); } /** * Clear quota. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function clearQuota() { $params = [ 'appid' => $this->app['config']['app_id'], ]; return $this->httpPostJson('cgi-bin/clear_quota', $params); } /** * Get wechat callback ip. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getValidIps() { return $this->httpGet('cgi-bin/getcallbackip'); } /** * Check the callback address network. * * @param string $action * @param string $operator * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function checkCallbackUrl(string $action = 'all', string $operator = 'DEFAULT') { if (!in_array($action, ['dns', 'ping', 'all'], true)) { throw new InvalidArgumentException('The action must be dns, ping, all.'); } $operator = strtoupper($operator); if (!in_array($operator, ['CHINANET', 'UNICOM', 'CAP', 'DEFAULT'], true)) { throw new InvalidArgumentException('The operator must be CHINANET, UNICOM, CAP, DEFAULT.'); } $params = [ 'action' => $action, 'check_operator' => $operator, ]; return $this->httpPostJson('cgi-bin/callback/check', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Base/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Base; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['base'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Broadcasting/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Broadcasting; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Contracts\MessageInterface; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Messages\Card; use EasyWeChat\Kernel\Messages\Image; use EasyWeChat\Kernel\Messages\Media; use EasyWeChat\Kernel\Messages\Text; use EasyWeChat\Kernel\Support\Arr; /** * Class Client. * * @method \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string previewTextByName($text, $name); * @method \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string previewNewsByName($mediaId, $name); * @method \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string previewVoiceByName($mediaId, $name); * @method \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string previewImageByName($mediaId, $name); * @method \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string previewVideoByName($message, $name); * @method \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string previewCardByName($cardId, $name); * * @author overtrue */ class Client extends BaseClient { public const PREVIEW_BY_OPENID = 'touser'; public const PREVIEW_BY_NAME = 'towxname'; /** * Send a message. * * @param array $message * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $message) { if (empty($message['filter']) && empty($message['touser'])) { throw new RuntimeException('The message reception object is not specified'); } $api = Arr::get($message, 'touser') ? 'cgi-bin/message/mass/send' : 'cgi-bin/message/mass/sendall'; return $this->httpPostJson($api, $message); } /** * Preview a message. * * @param array $message * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function preview(array $message) { return $this->httpPostJson('cgi-bin/message/mass/preview', $message); } /** * Delete a broadcast. * * @param string $msgId * @param int $index * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $msgId, int $index = 0) { $options = [ 'msg_id' => $msgId, 'article_idx' => $index, ]; return $this->httpPostJson('cgi-bin/message/mass/delete', $options); } /** * Get a broadcast status. * * @param string $msgId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function status(string $msgId) { $options = [ 'msg_id' => $msgId, ]; return $this->httpPostJson('cgi-bin/message/mass/get', $options); } /** * Send a text message. * * @param string $message * @param mixed $reception * @param array $attributes * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function sendText(string $message, $reception = null, array $attributes = []) { return $this->sendMessage(new Text($message), $reception, $attributes); } /** * Send a news message. * * @param string $mediaId * @param mixed $reception * @param array $attributes * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function sendNews(string $mediaId, $reception = null, array $attributes = []) { return $this->sendMessage(new Media($mediaId, 'mpnews'), $reception, $attributes); } /** * Send a voice message. * * @param string $mediaId * @param mixed $reception * @param array $attributes * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function sendVoice(string $mediaId, $reception = null, array $attributes = []) { return $this->sendMessage(new Media($mediaId, 'voice'), $reception, $attributes); } /** * Send a image message. * * @param string $mediaId * @param mixed $reception * @param array $attributes * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function sendImage(string $mediaId, $reception = null, array $attributes = []) { return $this->sendMessage(new Image($mediaId), $reception, $attributes); } /** * Send a video message. * * @param string $mediaId * @param mixed $reception * @param array $attributes * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function sendVideo(string $mediaId, $reception = null, array $attributes = []) { return $this->sendMessage(new Media($mediaId, 'mpvideo'), $reception, $attributes); } /** * Send a card message. * * @param string $cardId * @param mixed $reception * @param array $attributes * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function sendCard(string $cardId, $reception = null, array $attributes = []) { return $this->sendMessage(new Card($cardId), $reception, $attributes); } /** * Preview a text message. * * @param string $message message * @param string $reception * @param string $method * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function previewText(string $message, $reception, $method = self::PREVIEW_BY_OPENID) { return $this->previewMessage(new Text($message), $reception, $method); } /** * Preview a news message. * * @param string $mediaId message * @param string $reception * @param string $method * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function previewNews(string $mediaId, $reception, $method = self::PREVIEW_BY_OPENID) { return $this->previewMessage(new Media($mediaId, 'mpnews'), $reception, $method); } /** * Preview a voice message. * * @param string $mediaId message * @param string $reception * @param string $method * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function previewVoice(string $mediaId, $reception, $method = self::PREVIEW_BY_OPENID) { return $this->previewMessage(new Media($mediaId, 'voice'), $reception, $method); } /** * Preview a image message. * * @param string $mediaId message * @param string $reception * @param string $method * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function previewImage(string $mediaId, $reception, $method = self::PREVIEW_BY_OPENID) { return $this->previewMessage(new Image($mediaId), $reception, $method); } /** * Preview a video message. * * @param string $mediaId message * @param string $reception * @param string $method * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function previewVideo(string $mediaId, $reception, $method = self::PREVIEW_BY_OPENID) { return $this->previewMessage(new Media($mediaId, 'mpvideo'), $reception, $method); } /** * Preview a card message. * * @param string $cardId message * @param string $reception * @param string $method * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function previewCard(string $cardId, $reception, $method = self::PREVIEW_BY_OPENID) { return $this->previewMessage(new Card($cardId), $reception, $method); } /** * @param \EasyWeChat\Kernel\Contracts\MessageInterface $message * @param string $reception * @param string $method * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function previewMessage(MessageInterface $message, string $reception, $method = self::PREVIEW_BY_OPENID) { $message = (new MessageBuilder())->message($message)->buildForPreview($method, $reception); return $this->preview($message); } /** * @param \EasyWeChat\Kernel\Contracts\MessageInterface $message * @param mixed $reception * @param array $attributes * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function sendMessage(MessageInterface $message, $reception = null, $attributes = []) { $message = (new MessageBuilder())->message($message)->with($attributes)->toAll(); if (\is_int($reception)) { $message->toTag($reception); } elseif (\is_array($reception)) { $message->toUsers($reception); } return $this->send($message->build()); } /** * @codeCoverageIgnore * * @param string $method * @param array $args * * @return mixed */ public function __call($method, $args) { if (strpos($method, 'ByName') > 0) { $method = strstr($method, 'ByName', true); if (method_exists($this, $method)) { array_push($args, self::PREVIEW_BY_NAME); return $this->$method(...$args); } } throw new \BadMethodCallException(sprintf('Method %s not exists.', $method)); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Broadcasting/MessageBuilder.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Broadcasting; use EasyWeChat\Kernel\Contracts\MessageInterface; use EasyWeChat\Kernel\Exceptions\RuntimeException; /** * Class MessageBuilder. * * @author overtrue */ class MessageBuilder { /** * @var array */ protected $to = []; /** * @var \EasyWeChat\Kernel\Contracts\MessageInterface */ protected $message; /** * @var array */ protected $attributes = []; /** * Set message. * * @param \EasyWeChat\Kernel\Contracts\MessageInterface $message * * @return $this */ public function message(MessageInterface $message) { $this->message = $message; return $this; } /** * Set target user or group. * * @param array $to * * @return $this */ public function to(array $to) { $this->to = $to; return $this; } /** * @param int $tagId * * @return \EasyWeChat\OfficialAccount\Broadcasting\MessageBuilder */ public function toTag(int $tagId) { $this->to([ 'filter' => [ 'is_to_all' => false, 'tag_id' => $tagId, ], ]); return $this; } /** * @param array $openids * * @return \EasyWeChat\OfficialAccount\Broadcasting\MessageBuilder */ public function toUsers(array $openids) { $this->to([ 'touser' => $openids, ]); return $this; } /** * @return $this */ public function toAll() { $this->to([ 'filter' => ['is_to_all' => true], ]); return $this; } /** * @param array $attributes * * @return \EasyWeChat\OfficialAccount\Broadcasting\MessageBuilder */ public function with(array $attributes) { $this->attributes = $attributes; return $this; } /** * Build message. * * @param array $prepends * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function build(array $prepends = []): array { if (empty($this->message)) { throw new RuntimeException('No message content to send.'); } $content = $this->message->transformForJsonRequest(); if (empty($prepends)) { $prepends = $this->to; } $message = array_merge($prepends, $content, $this->attributes); return $message; } /** * Build preview message. * * @param string $by * @param string $user * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function buildForPreview(string $by, string $user): array { return $this->build([$by => $user]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Broadcasting/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Broadcasting; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['broadcasting'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/BoardingPassClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; /** * Class BoardingPassClient. * * @author overtrue */ class BoardingPassClient extends Client { /** * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function checkin(array $params) { return $this->httpPostJson('card/boardingpass/checkin', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/Card.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class Card. * * @author overtrue * * @property \EasyWeChat\OfficialAccount\Card\CodeClient $code * @property \EasyWeChat\OfficialAccount\Card\MeetingTicketClient $meeting_ticket * @property \EasyWeChat\OfficialAccount\Card\MemberCardClient $member_card * @property \EasyWeChat\OfficialAccount\Card\GeneralCardClient $general_card * @property \EasyWeChat\OfficialAccount\Card\MovieTicketClient $movie_ticket * @property \EasyWeChat\OfficialAccount\Card\CoinClient $coin * @property \EasyWeChat\OfficialAccount\Card\SubMerchantClient $sub_merchant * @property \EasyWeChat\OfficialAccount\Card\BoardingPassClient $boarding_pass * @property \EasyWeChat\OfficialAccount\Card\JssdkClient $jssdk * @property \EasyWeChat\OfficialAccount\Card\GiftCardClient $gift_card * @property \EasyWeChat\OfficialAccount\Card\GiftCardOrderClient $gift_card_order * @property \EasyWeChat\OfficialAccount\Card\GiftCardPageClient $gift_card_page * @property \EasyWeChat\OfficialAccount\Card\InvoiceClient $invoice */ class Card extends Client { /** * @param string $property * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function __get($property) { if (isset($this->app["card.{$property}"])) { return $this->app["card.{$property}"]; } throw new InvalidArgumentException(sprintf('No card service named "%s".', $property)); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Traits\InteractsWithCache; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { use InteractsWithCache; /** * @var string */ protected $url; /** * Ticket cache key. * * @var string */ protected $ticketCacheKey; /** * Ticket cache prefix. * * @var string */ protected $ticketCachePrefix = 'easywechat.official_account.card.api_ticket.'; /** * 获取卡券颜色. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function colors() { return $this->httpGet('card/getcolors'); } /** * 卡券开放类目查询接口. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function categories() { return $this->httpGet('card/getapplyprotocol'); } /** * 创建卡券. * * @param string $cardType * @param array $attributes * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create($cardType = 'member_card', array $attributes = []) { $params = [ 'card' => [ 'card_type' => strtoupper($cardType), strtolower($cardType) => $attributes, ], ]; return $this->httpPostJson('card/create', $params); } /** * 查看卡券详情. * * @param string $cardId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get($cardId) { $params = [ 'card_id' => $cardId, ]; return $this->httpPostJson('card/get', $params); } /** * 批量查询卡列表. * * @param int $offset * @param int $count * @param string $statusList * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list($offset = 0, $count = 10, $statusList = 'CARD_STATUS_VERIFY_OK') { $params = [ 'offset' => $offset, 'count' => $count, 'status_list' => $statusList, ]; return $this->httpPostJson('card/batchget', $params); } /** * 更改卡券信息接口 and 设置跟随推荐接口. * * @param string $cardId * @param string $type * @param array $attributes * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update($cardId, $type, array $attributes = []) { $card = []; $card['card_id'] = $cardId; $card[strtolower($type)] = $attributes; return $this->httpPostJson('card/update', $card); } /** * 删除卡券接口. * * @param string $cardId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete($cardId) { $params = [ 'card_id' => $cardId, ]; return $this->httpPostJson('card/delete', $params); } /** * 创建二维码. * * @param array $cards * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createQrCode(array $cards) { return $this->httpPostJson('card/qrcode/create', $cards); } /** * ticket 换取二维码图片. * * @param string $ticket * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getQrCode($ticket) { $baseUri = 'https://mp.weixin.qq.com/cgi-bin/showqrcode'; $params = [ 'ticket' => $ticket, ]; $response = $this->requestRaw($baseUri, 'GET', $params); return [ 'status' => $response->getStatusCode(), 'reason' => $response->getReasonPhrase(), 'headers' => $response->getHeaders(), 'body' => strval($response->getBody()), 'url' => $baseUri.'?'.http_build_query($params), ]; } /** * 通过ticket换取二维码 链接. * * @param string $ticket * * @return string */ public function getQrCodeUrl($ticket) { return sprintf('https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s', $ticket); } /** * 创建货架接口. * * @param string $banner * @param string $pageTitle * @param bool $canShare * @param string $scene [SCENE_NEAR_BY 附近,SCENE_MENU 自定义菜单,SCENE_QRCODE 二维码,SCENE_ARTICLE 公众号文章, * SCENE_H5 h5页面,SCENE_IVR 自动回复,SCENE_CARD_CUSTOM_CELL 卡券自定义cell] * @param array $cardList * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createLandingPage($banner, $pageTitle, $canShare, $scene, $cardList) { $params = [ 'banner' => $banner, 'page_title' => $pageTitle, 'can_share' => $canShare, 'scene' => $scene, 'card_list' => $cardList, ]; return $this->httpPostJson('card/landingpage/create', $params); } /** * 图文消息群发卡券. * * @param string $cardId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getHtml($cardId) { $params = [ 'card_id' => $cardId, ]; return $this->httpPostJson('card/mpnews/gethtml', $params); } /** * 设置测试白名单. * * @param array $openids * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setTestWhitelist($openids) { $params = [ 'openid' => $openids, ]; return $this->httpPostJson('card/testwhitelist/set', $params); } /** * 设置测试白名单(by username). * * @param array $usernames * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setTestWhitelistByName(array $usernames) { $params = [ 'username' => $usernames, ]; return $this->httpPostJson('card/testwhitelist/set', $params); } /** * 获取用户已领取卡券接口. * * @param string $openid * @param string $cardId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUserCards($openid, $cardId = '') { $params = [ 'openid' => $openid, 'card_id' => $cardId, ]; return $this->httpPostJson('card/user/getcardlist', $params); } /** * 设置微信买单接口. * 设置买单的 card_id 必须已经配置了门店,否则会报错. * * @param string $cardId * @param bool $isOpen * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setPayCell($cardId, $isOpen = true) { $params = [ 'card_id' => $cardId, 'is_open' => $isOpen, ]; return $this->httpPostJson('card/paycell/set', $params); } /** * 设置自助核销接口 * 设置买单的 card_id 必须已经配置了门店,否则会报错. * * @param string $cardId * @param bool $isOpen * @param bool $verifyCod * @param bool $remarkAmount * * @return mixed */ public function setPayConsumeCell($cardId, $isOpen = true, $verifyCod = false, $remarkAmount = false) { $params = [ 'card_id' => $cardId, 'is_open' => $isOpen, 'need_verify_cod' => $verifyCod, 'need_remark_amount' => $remarkAmount, ]; return $this->httpPostJson('card/selfconsumecell/set', $params); } /** * 增加库存. * * @param string $cardId * @param int $amount * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function increaseStock($cardId, $amount) { return $this->updateStock($cardId, $amount, 'increase'); } /** * 减少库存. * * @param string $cardId * @param int $amount * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function reduceStock($cardId, $amount) { return $this->updateStock($cardId, $amount, 'reduce'); } /** * 修改库存接口. * * @param string $cardId * @param int $amount * @param string $action * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function updateStock($cardId, $amount, $action = 'increase') { $key = 'increase' === $action ? 'increase_stock_value' : 'reduce_stock_value'; $params = [ 'card_id' => $cardId, $key => abs($amount), ]; return $this->httpPostJson('card/modifystock', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/CodeClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use EasyWeChat\Kernel\BaseClient; /** * Class CodeClient. * * @author overtrue */ class CodeClient extends BaseClient { /** * 导入code接口. * * @param string $cardId * @param array $codes * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deposit(string $cardId, array $codes) { $params = [ 'card_id' => $cardId, 'code' => $codes, ]; return $this->httpPostJson('card/code/deposit', $params); } /** * 查询导入code数目. * * @param string $cardId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getDepositedCount(string $cardId) { $params = [ 'card_id' => $cardId, ]; return $this->httpPostJson('card/code/getdepositcount', $params); } /** * 核查code接口. * * @param string $cardId * @param array $codes * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function check(string $cardId, array $codes) { $params = [ 'card_id' => $cardId, 'code' => $codes, ]; return $this->httpPostJson('card/code/checkcode', $params); } /** * 查询 Code 接口. * * @param string $code * @param string $cardId * @param bool $checkConsume * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $code, string $cardId = '', bool $checkConsume = true) { $params = [ 'code' => $code, 'check_consume' => $checkConsume, 'card_id' => $cardId, ]; return $this->httpPostJson('card/code/get', $params); } /** * 更改Code接口. * * @param string $code * @param string $newCode * @param string $cardId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $code, string $newCode, string $cardId = '') { $params = [ 'code' => $code, 'new_code' => $newCode, 'card_id' => $cardId, ]; return $this->httpPostJson('card/code/update', $params); } /** * 设置卡券失效. * * @param string $code * @param string $cardId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function disable(string $code, string $cardId = '') { $params = [ 'code' => $code, 'card_id' => $cardId, ]; return $this->httpPostJson('card/code/unavailable', $params); } /** * 核销 Code 接口. * * @param string $code * @param string|null $cardId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function consume(string $code, string $cardId = null) { $params = [ 'code' => $code, ]; if (!is_null($cardId)) { $params['card_id'] = $cardId; } return $this->httpPostJson('card/code/consume', $params); } /** * Code解码接口. * * @param string $encryptedCode * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function decrypt(string $encryptedCode) { $params = [ 'encrypt_code' => $encryptedCode, ]; return $this->httpPostJson('card/code/decrypt', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/CoinClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use EasyWeChat\Kernel\BaseClient; /** * Class CoinClient. * * @author overtrue */ class CoinClient extends BaseClient { /** * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function activate() { return $this->httpGet('card/pay/activate'); } /** * @param string $cardId * @param int $quantity * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getPrice(string $cardId, int $quantity) { return $this->httpPostJson('card/pay/getpayprice', [ 'card_id' => $cardId, 'quantity' => $quantity, ]); } /** * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function summary() { return $this->httpGet('card/pay/getcoinsinfo'); } /** * @param int $count * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function recharge(int $count) { return $this->httpPostJson('card/pay/recharge', [ 'coin_count' => $count, ]); } /** * @param string $orderId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function order(string $orderId) { return $this->httpPostJson('card/pay/getorder', ['order_id' => $orderId]); } /** * @param array $filters * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function orders(array $filters) { return $this->httpPostJson('card/pay/getorderlist', $filters); } /** * @param string $cardId * @param string $orderId * @param int $quantity * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function confirm(string $cardId, string $orderId, int $quantity) { return $this->httpPostJson('card/pay/confirm', [ 'card_id' => $cardId, 'order_id' => $orderId, 'quantity' => $quantity, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/GeneralCardClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; /** * Class GeneralCardClient. * * @author overtrue */ class GeneralCardClient extends Client { /** * 通用卡接口激活. * * @param array $info * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function activate(array $info = []) { return $this->httpPostJson('card/generalcard/activate', $info); } /** * 通用卡撤销激活. * * @param string $cardId * @param string $code * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deactivate(string $cardId, string $code) { $params = [ 'card_id' => $cardId, 'code' => $code, ]; return $this->httpPostJson('card/generalcard/unactivate', $params); } /** * 更新会员信息. * * @param array $params * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateUser(array $params = []) { return $this->httpPostJson('card/generalcard/updateuser', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/GiftCardClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use EasyWeChat\Kernel\BaseClient; /** * Class GiftCardClient. * * @author overtrue */ class GiftCardClient extends BaseClient { /** * 申请微信支付礼品卡权限接口. * * @param string $subMchId * * @return mixed */ public function add(string $subMchId) { $params = [ 'sub_mch_id' => $subMchId, ]; return $this->httpPostJson('card/giftcard/pay/whitelist/add', $params); } /** * 绑定商户号到礼品卡小程序接口(商户号必须为公众号申请的商户号,否则报错). * * @param string $subMchId * @param string $wxaAppid * * @return mixed */ public function bind(string $subMchId, string $wxaAppid) { $params = [ 'sub_mch_id' => $subMchId, 'wxa_appid' => $wxaAppid, ]; return $this->httpPostJson('card/giftcard/pay/submch/bind', $params); } /** * 上传小程序代码. * * @param string $wxaAppid * @param string $pageId * * @return mixed */ public function set(string $wxaAppid, string $pageId) { $params = [ 'wxa_appid' => $wxaAppid, 'page_id' => $pageId, ]; return $this->httpPostJson('card/giftcard/wxa/set', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/GiftCardOrderClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use EasyWeChat\Kernel\BaseClient; /** * Class GiftCardOrderClient. * * @author overtrue */ class GiftCardOrderClient extends BaseClient { /** * 查询-单个礼品卡订单信息接口. * * @param string $orderId * * @return mixed */ public function get(string $orderId) { $params = [ 'order_id' => $orderId, ]; return $this->httpPostJson('card/giftcard/order/get', $params); } /** * 查询-批量查询礼品卡订单信息接口. * * @param int $beginTime * @param int $endTime * @param int $offset * @param int $count * @param string $sortType * * @return mixed */ public function list(int $beginTime, int $endTime, int $offset = 0, int $count = 10, string $sortType = 'ASC') { $params = [ 'begin_time' => $beginTime, 'end_time' => $endTime, 'sort_type' => $sortType, 'offset' => $offset, 'count' => $count, ]; return $this->httpPostJson('card/giftcard/order/batchget', $params); } /** * 退款接口. * * @param string $orderId * * @return mixed */ public function refund(string $orderId) { $params = [ 'order_id' => $orderId, ]; return $this->httpPostJson('card/giftcard/order/refund', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/GiftCardPageClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use EasyWeChat\Kernel\BaseClient; /** * Class GiftCardPageClient. * * @author overtrue */ class GiftCardPageClient extends BaseClient { /** * 创建-礼品卡货架接口. * * @param array $attributes * * @return mixed */ public function add(array $attributes) { $params = [ 'page' => $attributes, ]; return $this->httpPostJson('card/giftcard/page/add', $params); } /** * 查询-礼品卡货架信息接口. * * @param string $pageId * * @return mixed */ public function get(string $pageId) { $params = [ 'page_id' => $pageId, ]; return $this->httpPostJson('card/giftcard/page/get', $params); } /** * 修改-礼品卡货架信息接口. * * @param string $pageId * @param string $bannerPicUrl * @param array $themeList * * @return mixed */ public function update(string $pageId, string $bannerPicUrl, array $themeList) { $params = [ 'page' => [ 'page_id' => $pageId, 'banner_pic_url' => $bannerPicUrl, 'theme_list' => $themeList, ], ]; return $this->httpPostJson('card/giftcard/page/update', $params); } /** * 查询-礼品卡货架列表接口. * * @return mixed */ public function list() { return $this->httpPostJson('card/giftcard/page/batchget'); } /** * 下架-礼品卡货架接口(下架某一个货架或者全部货架). * * @param string $pageId * * @return mixed */ public function setMaintain(string $pageId = '') { $params = ($pageId ? ['page_id' => $pageId] : ['all' => true]) + [ 'maintain' => true, ]; return $this->httpPostJson('card/giftcard/maintain/set', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/InvoiceClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use EasyWeChat\Kernel\BaseClient; /** * Class InvoiceClient. * * @author overtrue */ class InvoiceClient extends BaseClient { /** * 设置支付后开票信息接口. * * @param string $mchid * @param string $sPappid * * @return mixed */ public function set(string $mchid, string $sPappid) { $params = [ 'paymch_info' => [ 'mchid' => $mchid, 's_pappid' => $sPappid, ], ]; return $this->setBizAttr('set_pay_mch', $params); } /** * 查询支付后开票信息接口. * * @return mixed */ public function get() { return $this->setBizAttr('get_pay_mch'); } /** * 设置授权页字段信息接口. * * @param array $userData * @param array $bizData * * @return mixed */ public function setAuthField(array $userData, array $bizData) { $params = [ 'auth_field' => [ 'user_field' => $userData, 'biz_field' => $bizData, ], ]; return $this->setBizAttr('set_auth_field', $params); } /** * 查询授权页字段信息接口. * * @return mixed */ public function getAuthField() { return $this->setBizAttr('get_auth_field'); } /** * 查询开票信息. * * @param string $orderId * @param string $appId * * @return mixed */ public function getAuthData(string $appId, string $orderId) { $params = [ 'order_id' => $orderId, 's_appid' => $appId, ]; return $this->httpPost('card/invoice/getauthdata', $params); } /** * 创建卡券发票模板 * * @param string $orderId * @param string $appId * * @return mixed */ public function createCard(array $params) { return $this->httpPostJson('/card/invoice/platform/createcard', $params); } /** * 电子发票卡券插入用户卡包 * * @param string $orderId * @param string $appId * * @return mixed */ public function insert(array $params) { return $this->httpPostJson('/card/invoice/insert', $params); } /** * 更新发票卡券状态 * * @param string $orderId * @param string $appId * * @return mixed */ public function updatestatus(array $params) { return $this->httpPostJson('/card/invoice/platform/updatestatus', $params); } /** * 设置授权页字段信息接口. * * @param array $userData * @param array $bizData * * @return mixed */ public function setContact(array $params) { return $this->setBizAttr('set_contact', $params); } /** * 获取授权页链接 * * @param string $orderId * @param string $appId * * @return mixed */ public function getauthurl(array $params) { return $this->httpPostJson('/card/invoice/getauthurl', $params); } /** * 创建卡券发票模板 * * @param string $orderId * @param string $appId * * @return mixed */ public function setUrl() { return $this->httpPostJson('/card/invoice/seturl', []); } /** * @param string $action * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ private function setBizAttr(string $action, array $params = []) { return $this->httpPostJson('card/invoice/setbizattr', $params, ['action' => $action]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/JssdkClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use EasyWeChat\BasicService\Jssdk\Client as Jssdk; use EasyWeChat\Kernel\Support\Arr; use function EasyWeChat\Kernel\Support\str_random; /** * Class Jssdk. * * @author overtrue */ class JssdkClient extends Jssdk { /** * @param bool $refresh * @param string $type * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function getTicket(bool $refresh = false, string $type = 'wx_card'): array { return parent::getTicket($refresh, $type); } /** * 微信卡券:JSAPI 卡券发放. * * @param array $cards * * @return string */ public function assign(array $cards) { return json_encode(array_map(function ($card) { return $this->attachExtension($card['card_id'], $card); }, $cards)); } /** * 生成 js添加到卡包 需要的 card_list 项. * * @param string $cardId * @param array $extension * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function attachExtension($cardId, array $extension = []) { $timestamp = time(); $nonce = str_random(6); $ticket = $this->getTicket()['ticket']; $ext = array_merge(['timestamp' => $timestamp, 'nonce_str' => $nonce], Arr::only( $extension, ['code', 'openid', 'outer_id', 'balance', 'fixed_begintimestamp', 'outer_str'] )); $ext['signature'] = $this->dictionaryOrderSignature($ticket, $timestamp, $cardId, $ext['code'] ?? '', $ext['openid'] ?? '', $nonce); return [ 'cardId' => $cardId, 'cardExt' => json_encode($ext), ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/MeetingTicketClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; /** * Class MeetingTicketClient. * * @author overtrue */ class MeetingTicketClient extends Client { /** * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateUser(array $params) { return $this->httpPostJson('card/meetingticket/updateuser', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/MemberCardClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; /** * Class MemberCardClient. * * @author overtrue */ class MemberCardClient extends Client { /** * 会员卡接口激活. * * @param array $info * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function activate(array $info = []) { return $this->httpPostJson('card/membercard/activate', $info); } /** * 设置开卡字段接口. * * @param string $cardId * @param array $settings * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setActivationForm(string $cardId, array $settings) { $params = array_merge(['card_id' => $cardId], $settings); return $this->httpPostJson('card/membercard/activateuserform/set', $params); } /** * 拉取会员信息接口. * * @param string $cardId * @param string $code * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUser(string $cardId, string $code) { $params = [ 'card_id' => $cardId, 'code' => $code, ]; return $this->httpPostJson('card/membercard/userinfo/get', $params); } /** * 更新会员信息. * * @param array $params * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateUser(array $params = []) { return $this->httpPostJson('card/membercard/updateuser', $params); } /** * 获取用户提交资料. * * @param string $activateTicket * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getActivationForm($activateTicket) { $params = [ 'activate_ticket' => $activateTicket, ]; return $this->httpPostJson('card/membercard/activatetempinfo/get', $params); } /** * 获取开卡组件链接接口. * * @param array $params 包含会员卡ID和随机字符串 * * @return string 开卡组件链接 * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getActivateUrl(array $params = []) { return $this->httpPostJson('card/membercard/activate/geturl', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/MovieTicketClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; /** * Class MovieTicketClient. * * @author overtrue */ class MovieTicketClient extends Client { /** * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateUser(array $params) { return $this->httpPostJson('card/movieticket/updateuser', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['card'] = function ($app) { return new Card($app); }; $app['card.client'] = function ($app) { return new Client($app); }; $app['card.coin'] = function ($app) { return new CoinClient($app); }; $app['card.sub_merchant'] = function ($app) { return new SubMerchantClient($app); }; $app['card.code'] = function ($app) { return new CodeClient($app); }; $app['card.movie_ticket'] = function ($app) { return new MovieTicketClient($app); }; $app['card.member_card'] = function ($app) { return new MemberCardClient($app); }; $app['card.general_card'] = function ($app) { return new GeneralCardClient($app); }; $app['card.boarding_pass'] = function ($app) { return new BoardingPassClient($app); }; $app['card.meeting_ticket'] = function ($app) { return new MeetingTicketClient($app); }; $app['card.jssdk'] = function ($app) { return new JssdkClient($app); }; $app['card.gift_card'] = function ($app) { return new GiftCardClient($app); }; $app['card.gift_card_order'] = function ($app) { return new GiftCardOrderClient($app); }; $app['card.gift_card_page'] = function ($app) { return new GiftCardPageClient($app); }; $app['card.invoice'] = function ($app) { return new InvoiceClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Card/SubMerchantClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Card; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Support\Arr; /** * Class SubMerchantClient. * * @author overtrue */ class SubMerchantClient extends BaseClient { /** * 添加子商户. * * @param array $info * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $info = []) { $params = [ 'info' => Arr::only($info, [ 'brand_name', 'logo_url', 'protocol', 'end_time', 'primary_category_id', 'secondary_category_id', 'agreement_media_id', 'operator_media_id', 'app_id', ]), ]; return $this->httpPostJson('card/submerchant/submit', $params); } /** * 更新子商户. * * @param int $merchantId * @param array $info * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(int $merchantId, array $info = []) { $params = [ 'info' => array_merge( ['merchant_id' => $merchantId], Arr::only($info, [ 'brand_name', 'logo_url', 'protocol', 'end_time', 'primary_category_id', 'secondary_category_id', 'agreement_media_id', 'operator_media_id', 'app_id', ]) ), ]; return $this->httpPostJson('card/submerchant/update', $params); } /** * 获取子商户信息. * * @param int $merchantId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(int $merchantId) { return $this->httpPostJson('card/submerchant/get', ['merchant_id' => $merchantId]); } /** * 批量获取子商户信息. * * @param int $beginId * @param int $limit * @param string $status * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(int $beginId = 0, int $limit = 50, string $status = 'CHECKING') { $params = [ 'begin_id' => $beginId, 'limit' => $limit, 'status' => $status, ]; return $this->httpPostJson('card/submerchant/batchget', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Comment/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Comment; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * Open article comment. * * @param string $msgId * @param int|null $index * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function open(string $msgId, int $index = null) { $params = [ 'msg_data_id' => $msgId, 'index' => $index, ]; return $this->httpPostJson('cgi-bin/comment/open', $params); } /** * Close comment. * * @param string $msgId * @param int|null $index * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function close(string $msgId, int $index = null) { $params = [ 'msg_data_id' => $msgId, 'index' => $index, ]; return $this->httpPostJson('cgi-bin/comment/close', $params); } /** * Get article comments. * * @param string $msgId * @param int $index * @param int $begin * @param int $count * @param int $type * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(string $msgId, int $index, int $begin, int $count, int $type = 0) { $params = [ 'msg_data_id' => $msgId, 'index' => $index, 'begin' => $begin, 'count' => $count, 'type' => $type, ]; return $this->httpPostJson('cgi-bin/comment/list', $params); } /** * Mark elect comment. * * @param string $msgId * @param int $index * @param int $commentId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function markElect(string $msgId, int $index, int $commentId) { $params = [ 'msg_data_id' => $msgId, 'index' => $index, 'user_comment_id' => $commentId, ]; return $this->httpPostJson('cgi-bin/comment/markelect', $params); } /** * Unmark elect comment. * * @param string $msgId * @param int $index * @param int $commentId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function unmarkElect(string $msgId, int $index, int $commentId) { $params = [ 'msg_data_id' => $msgId, 'index' => $index, 'user_comment_id' => $commentId, ]; return $this->httpPostJson('cgi-bin/comment/unmarkelect', $params); } /** * Delete comment. * * @param string $msgId * @param int $index * @param int $commentId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $msgId, int $index, int $commentId) { $params = [ 'msg_data_id' => $msgId, 'index' => $index, 'user_comment_id' => $commentId, ]; return $this->httpPostJson('cgi-bin/comment/delete', $params); } /** * Reply to a comment. * * @param string $msgId * @param int $index * @param int $commentId * @param string $content * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function reply(string $msgId, int $index, int $commentId, string $content) { $params = [ 'msg_data_id' => $msgId, 'index' => $index, 'user_comment_id' => $commentId, 'content' => $content, ]; return $this->httpPostJson('cgi-bin/comment/reply/add', $params); } /** * Delete a reply. * * @param string $msgId * @param int $index * @param int $commentId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deleteReply(string $msgId, int $index, int $commentId) { $params = [ 'msg_data_id' => $msgId, 'index' => $index, 'user_comment_id' => $commentId, ]; return $this->httpPostJson('cgi-bin/comment/reply/delete', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Comment/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * ServiceProvider.php. * * This file is part of the wechat. * * (c) overtrue * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Comment; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['comment'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/CustomerService/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\CustomerService; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * List all staffs. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function list() { return $this->httpGet('cgi-bin/customservice/getkflist'); } /** * List all online staffs. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function online() { return $this->httpGet('cgi-bin/customservice/getonlinekflist'); } /** * Create a staff. * * @param string $account * @param string $nickname * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(string $account, string $nickname) { $params = [ 'kf_account' => $account, 'nickname' => $nickname, ]; return $this->httpPostJson('customservice/kfaccount/add', $params); } /** * Update a staff. * * @param string $account * @param string $nickname * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $account, string $nickname) { $params = [ 'kf_account' => $account, 'nickname' => $nickname, ]; return $this->httpPostJson('customservice/kfaccount/update', $params); } /** * Delete a staff. * * @param string $account * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $account) { return $this->httpPostJson('customservice/kfaccount/del', [], ['kf_account' => $account]); } /** * Invite a staff. * * @param string $account * @param string $wechatId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function invite(string $account, string $wechatId) { $params = [ 'kf_account' => $account, 'invite_wx' => $wechatId, ]; return $this->httpPostJson('customservice/kfaccount/inviteworker', $params); } /** * Set staff avatar. * * @param string $account * @param string $path * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setAvatar(string $account, string $path) { return $this->httpUpload('customservice/kfaccount/uploadheadimg', ['media' => $path], [], ['kf_account' => $account]); } /** * Get message builder. * * @param \EasyWeChat\Kernel\Messages\Message|string $message * * @return \EasyWeChat\OfficialAccount\CustomerService\Messenger */ public function message($message) { $messageBuilder = new Messenger($this); return $messageBuilder->message($message); } /** * Send a message. * * @param array $message * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $message) { return $this->httpPostJson('cgi-bin/message/custom/send', $message); } /** * Show typing status. * * @param string $openid * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function showTypingStatusToUser(string $openid) { return $this->httpPostJson('cgi-bin/message/custom/typing', [ 'touser' => $openid, 'command' => 'Typing', ]); } /** * Hide typing status. * * @param string $openid * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function hideTypingStatusToUser(string $openid) { return $this->httpPostJson('cgi-bin/message/custom/typing', [ 'touser' => $openid, 'command' => 'CancelTyping', ]); } /** * Get messages history. * * @param int $startTime * @param int $endTime * @param int $msgId * @param int $number * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function messages($startTime, $endTime, int $msgId = 1, int $number = 10000) { $params = [ 'starttime' => is_numeric($startTime) ? $startTime : strtotime($startTime), 'endtime' => is_numeric($endTime) ? $endTime : strtotime($endTime), 'msgid' => $msgId, 'number' => $number, ]; return $this->httpPostJson('customservice/msgrecord/getmsglist', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/CustomerService/Messenger.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\CustomerService; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Messages\Message; use EasyWeChat\Kernel\Messages\Raw as RawMessage; use EasyWeChat\Kernel\Messages\Text; /** * Class MessageBuilder. * * @author overtrue */ class Messenger { /** * Messages to send. * * @var \EasyWeChat\Kernel\Messages\Message; */ protected $message; /** * Messages target user open id. * * @var string */ protected $to; /** * Messages sender staff id. * * @var string */ protected $account; /** * Customer service instance. * * @var \EasyWeChat\OfficialAccount\CustomerService\Client */ protected $client; /** * MessageBuilder constructor. * * @param \EasyWeChat\OfficialAccount\CustomerService\Client $client */ public function __construct(Client $client) { $this->client = $client; } /** * Set message to send. * * @param string|Message $message * * @return Messenger */ public function message($message) { if (is_string($message)) { $message = new Text($message); } $this->message = $message; return $this; } /** * Set staff account to send message. * * @param string $account * * @return Messenger */ public function by(string $account) { $this->account = $account; return $this; } /** * @param string $account * * @return Messenger */ public function from(string $account) { return $this->by($account); } /** * Set target user open id. * * @param string $openid * * @return Messenger */ public function to($openid) { $this->to = $openid; return $this; } /** * Send the message. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function send() { if (empty($this->message)) { throw new RuntimeException('No message to send.'); } if ($this->message instanceof RawMessage) { $message = json_decode($this->message->get('content'), true); } else { $prepends = [ 'touser' => $this->to, ]; if ($this->account) { $prepends['customservice'] = ['kf_account' => $this->account]; } $message = $this->message->transformForJsonRequest($prepends); } return $this->client->send($message); } /** * Return property. * * @param string $property * * @return mixed */ public function __get(string $property) { if (property_exists($this, $property)) { return $this->$property; } return null; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/CustomerService/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\CustomerService; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['customer_service'] = function ($app) { return new Client($app); }; $app['customer_service_session'] = function ($app) { return new SessionClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/CustomerService/SessionClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\CustomerService; use EasyWeChat\Kernel\BaseClient; /** * Class SessionClient. * * @author overtrue */ class SessionClient extends BaseClient { /** * List all sessions of $account. * * @param string $account * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function list(string $account) { return $this->httpGet('customservice/kfsession/getsessionlist', ['kf_account' => $account]); } /** * List all the people waiting. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function waiting() { return $this->httpGet('customservice/kfsession/getwaitcase'); } /** * Create a session. * * @param string $account * @param string $openid * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(string $account, string $openid) { $params = [ 'kf_account' => $account, 'openid' => $openid, ]; return $this->httpPostJson('customservice/kfsession/create', $params); } /** * Close a session. * * @param string $account * @param string $openid * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function close(string $account, string $openid) { $params = [ 'kf_account' => $account, 'openid' => $openid, ]; return $this->httpPostJson('customservice/kfsession/close', $params); } /** * Get a session. * * @param string $openid * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function get(string $openid) { return $this->httpGet('customservice/kfsession/getsession', ['openid' => $openid]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/DataCube/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\DataCube; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * 获取用户增减数据. * * @param string $from * @param string $to * * @return mixed */ public function userSummary(string $from, string $to) { return $this->query('datacube/getusersummary', $from, $to); } /** * 获取累计用户数据. * * @param string $from * @param string $to * * @return mixed */ public function userCumulate(string $from, string $to) { return $this->query('datacube/getusercumulate', $from, $to); } /** * 获取图文群发每日数据. * * @param string $from * @param string $to * * @return mixed */ public function articleSummary(string $from, string $to) { return $this->query('datacube/getarticlesummary', $from, $to); } /** * 获取图文群发总数据. * * @param string $from * @param string $to * * @return mixed */ public function articleTotal(string $from, string $to) { return $this->query('datacube/getarticletotal', $from, $to); } /** * 获取图文统计数据. * * @param string $from * @param string $to * * @return mixed */ public function userReadSummary(string $from, string $to) { return $this->query('datacube/getuserread', $from, $to); } /** * 获取图文统计分时数据. * * @param string $from * @param string $to * * @return mixed */ public function userReadHourly(string $from, string $to) { return $this->query('datacube/getuserreadhour', $from, $to); } /** * 获取图文分享转发数据. * * @param string $from * @param string $to * * @return mixed */ public function userShareSummary(string $from, string $to) { return $this->query('datacube/getusershare', $from, $to); } /** * 获取图文分享转发分时数据. * * @param string $from * @param string $to * * @return mixed */ public function userShareHourly(string $from, string $to) { return $this->query('datacube/getusersharehour', $from, $to); } /** * 获取消息发送概况数据. * * @param string $from * @param string $to * * @return mixed */ public function upstreamMessageSummary(string $from, string $to) { return $this->query('datacube/getupstreammsg', $from, $to); } /** * 获取消息分送分时数据. * * @param string $from * @param string $to * * @return mixed */ public function upstreamMessageHourly(string $from, string $to) { return $this->query('datacube/getupstreammsghour', $from, $to); } /** * 获取消息发送周数据. * * @param string $from * @param string $to * * @return mixed */ public function upstreamMessageWeekly(string $from, string $to) { return $this->query('datacube/getupstreammsgweek', $from, $to); } /** * 获取消息发送月数据. * * @param string $from * @param string $to * * @return mixed */ public function upstreamMessageMonthly(string $from, string $to) { return $this->query('datacube/getupstreammsgmonth', $from, $to); } /** * 获取消息发送分布数据. * * @param string $from * @param string $to * * @return mixed */ public function upstreamMessageDistSummary(string $from, string $to) { return $this->query('datacube/getupstreammsgdist', $from, $to); } /** * 获取消息发送分布周数据. * * @param string $from * @param string $to * * @return mixed */ public function upstreamMessageDistWeekly(string $from, string $to) { return $this->query('datacube/getupstreammsgdistweek', $from, $to); } /** * 获取消息发送分布月数据. * * @param string $from * @param string $to * * @return mixed */ public function upstreamMessageDistMonthly(string $from, string $to) { return $this->query('datacube/getupstreammsgdistmonth', $from, $to); } /** * 获取接口分析数据. * * @param string $from * @param string $to * * @return mixed */ public function interfaceSummary(string $from, string $to) { return $this->query('datacube/getinterfacesummary', $from, $to); } /** * 获取接口分析分时数据. * * @param string $from * @param string $to * * @return mixed */ public function interfaceSummaryHourly(string $from, string $to) { return $this->query('datacube/getinterfacesummaryhour', $from, $to); } /** * 拉取卡券概况数据接口. * * @param string $from * @param string $to * @param int $condSource * * @return mixed */ public function cardSummary(string $from, string $to, $condSource = 0) { $ext = [ 'cond_source' => intval($condSource), ]; return $this->query('datacube/getcardbizuininfo', $from, $to, $ext); } /** * 获取免费券数据接口. * * @param string $from * @param string $to * @param int $condSource * @param string $cardId * * @return mixed */ public function freeCardSummary(string $from, string $to, int $condSource = 0, string $cardId = '') { $ext = [ 'cond_source' => intval($condSource), 'card_id' => $cardId, ]; return $this->query('datacube/getcardcardinfo', $from, $to, $ext); } /** * 拉取会员卡数据接口. * * @param string $from * @param string $to * @param int $condSource * * @return mixed */ public function memberCardSummary(string $from, string $to, $condSource = 0) { $ext = [ 'cond_source' => intval($condSource), ]; return $this->query('datacube/getcardmembercardinfo', $from, $to, $ext); } /** * 拉取单张会员卡数据接口. * * @param string $from * @param string $to * @param string $cardId * * @return mixed */ public function memberCardSummaryById(string $from, string $to, string $cardId) { $ext = [ 'card_id' => $cardId, ]; return $this->query('datacube/getcardmembercarddetail', $from, $to, $ext); } /** * 查询数据. * * @param string $api * @param string $from * @param string $to * @param array $ext * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function query(string $api, string $from, string $to, array $ext = []) { $params = array_merge([ 'begin_date' => $from, 'end_date' => $to, ], $ext); return $this->httpPostJson($api, $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/DataCube/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\DataCube; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['data_cube'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Device/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Device; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @see http://iot.weixin.qq.com/wiki/new/index.html * * @author soone <66812590@qq.com> */ class Client extends BaseClient { /** * @param string $deviceId * @param string $openid * @param string $content * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function message(string $deviceId, string $openid, string $content) { $params = [ 'device_type' => $this->app['config']['device_type'], 'device_id' => $deviceId, 'open_id' => $openid, 'content' => base64_encode($content), ]; return $this->httpPostJson('device/transmsg', $params); } /** * Get device qrcode. * * @param array $deviceIds * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function qrCode(array $deviceIds) { $params = [ 'device_num' => count($deviceIds), 'device_id_list' => $deviceIds, ]; return $this->httpPostJson('device/create_qrcode', $params); } /** * @param array $devices * @param string $productId * @param int $opType * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function authorize(array $devices, string $productId, int $opType = 0) { $params = [ 'device_num' => count($devices), 'device_list' => $devices, 'op_type' => $opType, 'product_id' => $productId, ]; return $this->httpPostJson('device/authorize_device', $params); } /** * 获取 device id 和二维码 * * @param string $productId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function createId(string $productId) { $params = [ 'product_id' => $productId, ]; return $this->httpGet('device/getqrcode', $params); } /** * @param string $openid * @param string $deviceId * @param string $ticket * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function bind(string $openid, string $deviceId, string $ticket) { $params = [ 'ticket' => $ticket, 'device_id' => $deviceId, 'openid' => $openid, ]; return $this->httpPostJson('device/bind', $params); } /** * @param string $openid * @param string $deviceId * @param string $ticket * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function unbind(string $openid, string $deviceId, string $ticket) { $params = [ 'ticket' => $ticket, 'device_id' => $deviceId, 'openid' => $openid, ]; return $this->httpPostJson('device/unbind', $params); } /** * @param string $openid * @param string $deviceId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function forceBind(string $openid, string $deviceId) { $params = [ 'device_id' => $deviceId, 'openid' => $openid, ]; return $this->httpPostJson('device/compel_bind', $params); } /** * @param string $openid * @param string $deviceId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function forceUnbind(string $openid, string $deviceId) { $params = [ 'device_id' => $deviceId, 'openid' => $openid, ]; return $this->httpPostJson('device/compel_unbind', $params); } /** * @param string $deviceId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function status(string $deviceId) { $params = [ 'device_id' => $deviceId, ]; return $this->httpGet('device/get_stat', $params); } /** * @param string $ticket * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function verify(string $ticket) { $params = [ 'ticket' => $ticket, ]; return $this->httpPost('device/verify_qrcode', $params); } /** * @param string $deviceId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function openid(string $deviceId) { $params = [ 'device_type' => $this->app['config']['device_type'], 'device_id' => $deviceId, ]; return $this->httpGet('device/get_openid', $params); } /** * @param string $openid * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function listByOpenid(string $openid) { $params = [ 'openid' => $openid, ]; return $this->httpGet('device/get_bind_device', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Device/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Device; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author soone <66812590@qq.com */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['device'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Draft/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Draft; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Messages\Article; /** * Class Client. * * @author wangdongzhao */ class Client extends BaseClient { /** * Add new articles to the draft. * @param array $articles * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(array $articles) { return $this->httpPostJson('cgi-bin/draft/add', $articles); } /** * Get article from the draft. * @param string $mediaId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $mediaId) { return $this->httpPostJson('cgi-bin/draft/get', ['media_id' => $mediaId]); } /** * Update article * @param string $mediaId * @param int $index * @param mixed $article * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $mediaId, int $index, $article) { $params = [ 'media_id' => $mediaId, 'index' => $index, 'articles' => $article ]; return $this->httpPostJson('cgi-bin/draft/update', $params); } /** * Get draft total count * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function count() { return $this->httpPostJson('cgi-bin/draft/count'); } /** * Batch get articles from the draft. * @param int $offset * @param int $count * @param int $noContent * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function batchGet(int $offset = 0, int $count = 20, int $noContent = 0) { $params = [ 'offset' => $offset, 'count' => $count, 'no_content' => $noContent ]; return $this->httpPostJson('cgi-bin/draft/batchget', $params); } /** * Delete article. * @param string $mediaId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $mediaId) { return $this->httpPostJson('cgi-bin/draft/delete', ['media_id' => $mediaId]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Draft/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Draft; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author wangdongzhao */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['draft'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/FreePublish/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\FreePublish; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Messages\Article; /** * Class Client. * * @author wangdongzhao */ class Client extends BaseClient { /** * Get publish status. * @param string $publishId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $publishId) { return $this->httpPostJson('cgi-bin/freepublish/get', ['publish_id' => $publishId]); } /** * Submit article. * @param string $mediaId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function submit(string $mediaId) { return $this->httpPostJson('cgi-bin/freepublish/submit', ['media_id' => $mediaId]); } /** * Get article. * @param string $articleId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getArticle(string $articleId) { return $this->httpPostJson('cgi-bin/freepublish/getarticle', ['article_id' => $articleId]); } /** * Batch get articles. * @param int $offset * @param int $count * @param int $noContent * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function batchGet(int $offset = 0, int $count = 20, int $noContent = 0) { $params = [ 'offset' => $offset, 'count' => $count, 'no_content' => $noContent ]; return $this->httpPostJson('cgi-bin/freepublish/batchget', $params); } /** * Delete article * @param string $articleId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $articleId) { return $this->httpPostJson('cgi-bin/freepublish/delete', ['article_id' => $articleId]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/FreePublish/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\FreePublish; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author wangdongzhao */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['free_publish'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Goods/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Goods; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author her-cat */ class Client extends BaseClient { /** * Add the goods. * * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(array $data) { return $this->httpPostJson('scan/product/v2/add', [ 'product' => $data, ]); } /** * Update the goods. * * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(array $data) { return $this->httpPostJson('scan/product/v2/add', [ 'product' => $data, ]); } /** * Get add or update goods results. * * @param string $ticket * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function status(string $ticket) { return $this->httpPostJson('scan/product/v2/status', [ 'status_ticket' => $ticket, ]); } /** * Get goods information. * * @param string $pid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $pid) { return $this->httpPostJson('scan/product/v2/getinfo', [ 'product' => [ 'pid' => $pid, ], ]); } /** * Get a list of goods. * * @param string $context * @param int $page * @param int $size * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(string $context = '', int $page = 1, int $size = 10) { return $this->httpPostJson('scan/product/v2/getinfobypage', [ 'page_context' => $context, 'page_num' => $page, 'page_size' => $size, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Goods/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Goods; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author her-cat */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['goods'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Guide/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Guide; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidConfigException; use EasyWeChat\Kernel\Support\Collection; use Psr\Http\Message\ResponseInterface; /** * Class Client. * * @author MillsGuo */ class Client extends BaseClient { /** * 添加顾问 * @param string $guideAccount * @param string $guideOpenid * @param string $guideHeadImgUrl * @param string $guideNickname * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function createAdviser($guideAccount = '', $guideOpenid = '', $guideHeadImgUrl = '', $guideNickname = '') { $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid); if (!empty($guideHeadImgUrl)) { $params['guide_headimgurl'] = $guideHeadImgUrl; } if (!empty($guideNickname)) { $params['guide_nickname'] = $guideNickname; } return $this->httpPostJson('cgi-bin/guide/addguideacct', $params); } /** * 获取顾问信息 * @param string $guideAccount * @param string $guideOpenid * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getAdviser($guideAccount = '', $guideOpenid = '') { $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/getguideacct', $params); } /** * 修改顾问的昵称或头像 * @param string $guideAccount * @param string $guideOpenid * @param string $guideHeadImgUrl * @param string $guideNickname * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function updateAdviser($guideAccount = '', $guideOpenid = '', $guideHeadImgUrl = '', $guideNickname = '') { $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid); if (!empty($guideHeadImgUrl)) { $params['guide_headimgurl'] = $guideHeadImgUrl; } if (!empty($guideNickname)) { $params['guide_nickname'] = $guideNickname; } return $this->httpPostJson('cgi-bin/guide/updateguideacct', $params); } /** * 删除顾问 * @param string $guideAccount * @param string $guideOpenid * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function deleteAdviser($guideAccount = '', $guideOpenid = '') { $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/delguideacct', $params); } /** * 获取服务号顾问列表 * * @return mixed * * @throws InvalidConfigException */ public function getAdvisers($count, $page) { $params = [ 'page' => $page, 'num' => $count ]; return $this->httpPostJson('cgi-bin/guide/getguideacctlist', $params); } /** * 生成顾问二维码 * @param string $guideAccount * @param string $guideOpenid * @param string $qrCodeInfo * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function createQrCode($guideAccount = '', $guideOpenid = '', $qrCodeInfo = '') { $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid); if (!empty($qrCodeInfo)) { $params['qrcode_info'] = $qrCodeInfo; } return $this->httpPostJson('cgi-bin/guide/guidecreateqrcode', $params); } /** * 获取顾问聊天记录 * @param string $guideAccount * @param string $guideOpenid * @param string $openid * @param int $beginTime * @param int $endTime * @param int $page * @param int $count * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getBuyerChatRecords($guideAccount = '', $guideOpenid = '', $openid = '', $beginTime = 0, $endTime = 0, $page = 1, $count = 100) { $params = [ 'page' => $page, 'num' => $count ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); if (!empty($openid)) { $params['openid'] = $openid; } if (!empty($beginTime)) { $params['begin_time'] = $beginTime; } if (!empty($endTime)) { $params['end_time'] = $endTime; } return $this->httpPostJson('cgi-bin/guide/getguidebuyerchatrecord', $params); } /** * 设置快捷回复与关注自动回复 * @param string $guideAccount * @param string $guideOpenid * @param bool $isDelete * @param array $fastReplyListArray * @param array $guideAutoReply * @param array $guideAutoReplyPlus * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function setConfig($guideAccount = '', $guideOpenid = '', $isDelete = false, $fastReplyListArray = array(), $guideAutoReply = array(), $guideAutoReplyPlus = array()) { $params = [ 'is_delete' => $isDelete ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); if (!empty($fastReplyListArray)) { $params['guide_fast_reply_list'] = $fastReplyListArray; } if (!empty($guideAutoReply)) { $params['guide_auto_reply'] = $guideAutoReply; } if (!empty($guideAutoReplyPlus)) { $params['guide_auto_reply_plus'] = $guideAutoReplyPlus; } return $this->httpPostJson('cgi-bin/guide/setguideconfig', $params); } /** * 获取快捷回复与关注自动回复 * @param string $guideAccount * @param string $guideOpenid * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getConfig($guideAccount = '', $guideOpenid = '') { try { $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid); } catch (InvalidConfigException $e) { $params = array(); } return $this->httpPostJson('cgi-bin/guide/getguideconfig', $params); } /** * 设置离线自动回复与敏感词 * @param bool $isDelete * @param array $blackKeyword * @param array $guideAutoReply * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function setAdviserConfig(bool $isDelete, array $blackKeyword = [], array $guideAutoReply = []) { $params = [ 'is_delete' => $isDelete ]; if (!empty($blackKeyword)) { $params['black_keyword'] = $blackKeyword; } if (!empty($guideAutoReply)) { $params['guide_auto_reply'] = $guideAutoReply; } return $this->httpPostJson('cgi-bin/guide/setguideacctconfig', $params); } /** * 获取离线自动回复与敏感词 * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getAdviserConfig() { return $this->httpPostJson('cgi-bin/guide/getguideacctconfig', array()); } /** * 允许微信用户复制小程序页面路径 * @param string $wxaAppid 小程序APPID * @param string $wxUsername 微信用户的微信号 * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function allowCopyMiniAppPath(string $wxaAppid, string $wxUsername) { $params = [ 'wxa_appid' => $wxaAppid, 'wx_username' => $wxUsername ]; return $this->httpPostJson('cgi-bin/guide/pushshowwxapathmenu', $params); } /** * 传入微信号或OPENID二选一 * @param array $params * @param string $guideAccount * @param string $guideOpenid * @return array * @throws InvalidConfigException */ protected function selectAccountAndOpenid($params, $guideAccount = '', $guideOpenid = '') { if (!is_array($params)) { throw new InvalidConfigException("传入配置参数必须为数组"); } if (!empty($guideOpenid)) { $params['guide_openid'] = $guideOpenid; } elseif (!empty($guideAccount)) { $params['guide_account'] = $guideAccount; } else { throw new InvalidConfigException("微信号和OPENID不能同时为空"); } return $params; } /** * 新建顾问分组 * @param string $groupName * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function createGroup(string $groupName) { $params = [ 'group_name' => $groupName ]; return $this->httpPostJson('cgi-bin/guide/newguidegroup', $params); } /** * 获取顾问分组列表 * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getGuideGroups() { return $this->httpPostJson('cgi-bin/guide/getguidegrouplist', array()); } /** * 获取指定顾问分组信息 * @param int $groupId * @param int $page * @param int $num * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getGroups(int $groupId, int $page, int $num) { $params = [ 'group_id' => $groupId, 'page' => $page, 'num' => $num ]; return $this->httpPostJson('cgi-bin/guide/getgroupinfo', $params); } /** * 分组内添加顾问 * @param int $groupId * @param string $guideAccount * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function addGroupGuide(int $groupId, string $guideAccount) { $params = [ 'group_id' => $groupId, 'gruide_account' => $guideAccount ]; return $this->httpPostJson('cgi-bin/guide/addguide2guidegroup', $params); } /** * 分组内删除顾问 * @param int $groupId * @param string $guideAccount * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function deleteGroupGuide(int $groupId, string $guideAccount) { $params = [ 'group_id' => $groupId, 'guide_account' => $guideAccount ]; return $this->httpPostJson('cgi-bin/guide/delguide2guidegroup', $params); } /** * 获取顾问所在分组 * @param string $guideAccount * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getGuideGroup(string $guideAccount) { $params = [ 'guide_account' => $guideAccount ]; return $this->httpPostJson('cgi-bin/guide/getgroupbyguide', $params); } /** * 删除指定顾问分组 * @param int $groupId * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function deleteGroup(int $groupId) { $params = [ 'group_id' => $groupId ]; return $this->httpPostJson('cgi-bin/guide/delguidegroup', $params); } /** * 为顾问分配客户 * @param string $guideAccount * @param string $guideOpenid * @param array $buyerList * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function createBuyerRelation(string $guideAccount, string $guideOpenid, array $buyerList) { $params = [ 'buyer_list' => $buyerList ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/addguidebuyerrelation', $params); } /** * 为顾问移除客户 * @param string $guideAccount * @param string $guideOpenid * @param array $openidList * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function deleteBuyerRelation(string $guideAccount, string $guideOpenid, array $openidList) { $params = [ 'openid_list' => $openidList ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/delguidebuyerrelation', $params); } /** * 获取顾问的客户列表 * @param string $guideAccount * @param string $guideOpenid * @param int $page * @param int $num * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getBuyerRelations(string $guideAccount, string $guideOpenid, int $page, int $num) { $params = [ 'page' => $page, 'num' => $num ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/getguidebuyerrelationlist', $params); } /** * 为客户更换顾问 * @param string $oldGuideTarget * @param string $newGuideTarget * @param array $openidList * @param bool $useTargetOpenid true使用OPENID,false使用微信号 * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function rebindBuyerGuide(string $oldGuideTarget, string $newGuideTarget, array $openidList, bool $useTargetOpenid = true) { $params = [ 'openid_list' => $openidList ]; if ($useTargetOpenid) { $params['old_guide_openid'] = $oldGuideTarget; $params['new_guide_openid'] = $newGuideTarget; } else { $params['old_guide_account'] = $oldGuideTarget; $params['new_guide_account'] = $newGuideTarget; } return $this->httpPostJson('cgi-bin/guide/rebindguideacctforbuyer', $params); } /** * 修改客户昵称 * @param string $guideAccount * @param string $guideOpenid * @param string $openid * @param string $nickname * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function updateBuyerRelation(string $guideAccount, string $guideOpenid, string $openid, string $nickname) { $params = [ 'openid' => $openid, 'buyer_nickname' => $nickname ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/updateguidebuyerrelation', $params); } /** * 查询客户所属顾问 * @param string $openid * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getBuyerRelation(string $openid) { $params = [ 'openid' => $openid ]; return $this->httpPostJson('cgi-bin/guide/getguidebuyerrelationbybuyer', $params); } /** * 查询指定顾问和客户的关系 * @param string $guideAccount * @param string $guideOpenid * @param string $openid * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getBuyerRelationByGuide(string $guideAccount, string $guideOpenid, string $openid) { $params = [ 'openid' => $openid ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/getguidebuyerrelation', $params); } /** * 新建可查询的标签类型 * @param string $tagName * @param array $tagValues * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function newTagOption(string $tagName, array $tagValues) { $params = [ 'tag_name' => $tagName, 'tag_values' => $tagValues ]; return $this->httpPostJson('cgi-bin/guide/newguidetagoption', $params); } /** * 删除指定标签类型 * @param string $tagName * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function deleteTagOption(string $tagName) { $params = [ 'tag_name' => $tagName ]; return $this->httpPostJson('cgi-bin/guide/delguidetagoption', $params); } /** * 为标签添加可选值 * @param string $tagName * @param array $tagValues * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function createTagOption(string $tagName, array $tagValues) { $params = [ 'tag_name' => $tagName, 'tag_values' => $tagValues ]; return $this->httpPostJson('cgi-bin/guide/addguidetagoption', $params); } /** * 获取标签和可选值 * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getTagOption() { return $this->httpPostJson('cgi-bin/guide/getguidetagoption', array()); } /** * 为客户设置标签 * @param string $guideAccount * @param string $guideOpenid * @param array $openidList * @param string $tagValue * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function setBuyersTag(string $guideAccount, string $guideOpenid, array $openidList, string $tagValue) { $params = [ 'tag_value' => $tagValue, 'openid_list' => $openidList ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/addguidebuyertag', $params); } /** * 查询客户标签 * @param string $guideAccount * @param string $guideOpenid * @param string $openid * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getBuyerTags(string $guideAccount, string $guideOpenid, string $openid) { $params = [ 'openid' => $openid ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/getguidebuyertag', $params); } /** * 根据标签值筛选粉丝 * @param string $guideAccount * @param string $guideOpenid * @param int $pushCount * @param array $tagValues * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getBuyerByTag(string $guideAccount, string $guideOpenid, int $pushCount = 0, array $tagValues = array()) { $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid); if ($pushCount > 0) { $params['push_count'] = $pushCount; } if (count($tagValues) > 0) { $params['tag_values'] = $tagValues; } return $this->httpPostJson('cgi-bin/guide/queryguidebuyerbytag', $params); } /** * 删除客户标签 * @param string $guideAccount * @param string $guideOpenid * @param string $tagValue * @param array $openidList * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function deleteBuyerTag(string $guideAccount, string $guideOpenid, string $tagValue, array $openidList) { $params = [ 'tag_value' => $tagValue ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); if (count($openidList) > 0) { $params['openid_list'] = $openidList; } return $this->httpPostJson('cgi-bin/guide/delguidebuyertag', $params); } /** * 设置自定义客户信息 * @param string $guideAccount * @param string $guideOpenid * @param string $openid * @param array $displayTagList * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function setBuyerDisplayTags(string $guideAccount, string $guideOpenid, string $openid, array $displayTagList) { $params = [ 'openid' => $openid, 'display_tag_list' => $displayTagList ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/addguidebuyerdisplaytag', $params); } /** * 获取自定义客户信息 * @param string $guideAccount * @param string $guideOpenid * @param string $openid * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getBuyerDisplayTags(string $guideAccount, string $guideOpenid, string $openid) { $params = [ 'openid' => $openid ]; $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/getguidebuyerdisplaytag', $params); } /** * 添加小程序卡片素材 * @param string $mediaId * @param string $title * @param string $path * @param string $appid * @param int $type * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function createCardMaterial(string $mediaId, string $title, string $path, string $appid, int $type = 0) { $params = [ 'media_id' => $mediaId, 'type' => $type, 'title' => $title, 'path' => $path, 'appid' => $appid ]; return $this->httpPostJson('cgi-bin/guide/setguidecardmaterial', $params); } /** * 查询小程序卡片素材 * @param int $type * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getCardMaterial(int $type = 0) { $params = [ 'type' => $type ]; return $this->httpPostJson('cgi-bin/guide/getguidecardmaterial', $params); } /** * 删除小程序卡片素材 * @param string $title * @param string $path * @param string $appid * @param int $type * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function deleteCardMaterial(string $title, string $path, string $appid, int $type = 0) { $params = [ 'type' => $type, 'title' => $title, 'path' => $path, 'appid' => $appid ]; return $this->httpPostJson('cgi-bin/guide/delguidecardmaterial', $params); } /** * 添加图片素材 * @param string $mediaId * @param int $type * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function createImageMaterial(string $mediaId, int $type = 0) { $params = [ 'media_id' => $mediaId, 'type' => $type ]; return $this->httpPostJson('cgi-bin/guide/setguideimagematerial', $params); } /** * 查询图片素材 * @param int $type * @param int $start * @param int $num * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getImageMaterial(int $type, int $start, int $num) { $params = [ 'type' => $type, 'start' => $start, 'num' => $num ]; return $this->httpPostJson('cgi-bin/guide/getguideimagematerial', $params); } /** * 删除图片素材 * @param int $type * @param string $picUrl * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function deleteImageMaterial(int $type, string $picUrl) { $params = [ 'type' => $type, 'picurl' => $picUrl ]; return $this->httpPostJson('cgi-bin/guide/delguideimagematerial', $params); } /** * 添加文字素材 * @param int $type * @param string $word * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function createWordMaterial(int $type, string $word) { $params = [ 'type' => $type, 'word' => $word ]; return $this->httpPostJson('cgi-bin/guide/setguidewordmaterial', $params); } /** * 查询文字素材 * @param int $type * @param int $start * @param int $num * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getWordMaterial(int $type, int $start, int $num) { $params = [ 'type' => $type, 'start' => $start, 'num' => $num ]; return $this->httpPostJson('cgi-bin/guide/getguidewordmaterial', $params); } /** * 删除文字素材 * @param int $type * @param string $word * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function deleteWordMaterial(int $type, string $word) { $params = [ 'type' => $type, 'word' => $word ]; return $this->httpPostJson('cgi-bin/guide/delguidewordmaterial', $params); } /** * 添加群发任务,为指定顾问添加群发任务 * @param string $guideAccount * @param string $guideOpenid * @param string $taskName * @param string $taskRemark * @param int $pushTime * @param array $openidArray * @param array $materialArray * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function createMasSendJob(string $guideAccount, string $guideOpenid, string $taskName, string $taskRemark, int $pushTime, array $openidArray, array $materialArray) { $params = [ 'task_name' => $taskName, 'push_time' => $pushTime, 'openid' => $openidArray, 'material' => $materialArray ]; if (!empty($taskRemark)) { $params['task_remark'] = $taskRemark; } $params = $this->selectAccountAndOpenid($params, $guideAccount, $guideOpenid); return $this->httpPostJson('cgi-bin/guide/addguidemassendjob', $params); } /** * 获取群发任务列表 * @param string $guideAccount * @param string $guideOpenid * @param array $taskStatus * @param int $offset * @param int $limit * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getMasSendJobs(string $guideAccount, string $guideOpenid, array $taskStatus = [], int $offset = 0, int $limit = 50) { $params = $this->selectAccountAndOpenid(array(), $guideAccount, $guideOpenid); if (!empty($taskStatus)) { $params['task_status'] = $taskStatus; } if ($offset > 0) { $params['offset'] = $offset; } if ($limit != 50) { $params['limit'] = $limit; } return $this->httpPostJson('cgi-bin/guide/getguidemassendjoblist', $params); } /** * 获取指定群发任务信息 * @param string $taskId * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function getMasSendJob(string $taskId) { $params = [ 'task_id' => $taskId ]; return $this->httpPostJson('cgi-bin/guide/getguidemassendjob', $params); } /** * 修改群发任务 * @param string $taskId * @param string $taskName * @param string $taskRemark * @param int $pushTime * @param array $openidArray * @param array $materialArray * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function updateMasSendJob(string $taskId, string $taskName, string $taskRemark, int $pushTime, array $openidArray, array $materialArray) { $params = [ 'task_id' => $taskId ]; if (!empty($taskName)) { $params['task_name'] = $taskName; } if (!empty($taskRemark)) { $params['task_remark'] = $taskRemark; } if (!empty($pushTime)) { $params['push_time'] = $pushTime; } if (!empty($openidArray)) { $params['openid'] = $openidArray; } if (!empty($materialArray)) { $params['material'] = $materialArray; } return $this->httpPostJson('cgi-bin/guide/updateguidemassendjob', $params); } /** * 取消群发任务 * @param string $taskId * @return array|Collection|object|ResponseInterface|string * @throws InvalidConfigException */ public function cancelMasSendJob(string $taskId) { $params = [ 'task_id' => $taskId ]; return $this->httpPostJson('cgi-bin/guide/cancelguidemassendjob', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Guide/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Guide; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author millsguo */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['guide'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Material/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Material; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Http\StreamResponse; use EasyWeChat\Kernel\Messages\Article; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * Allow media type. * * @var array */ protected $allowTypes = ['image', 'voice', 'video', 'thumb', 'news_image']; /** * Upload image. * * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadImage(string $path) { return $this->upload('image', $path); } /** * Upload voice. * * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadVoice(string $path) { return $this->upload('voice', $path); } /** * Upload thumb. * * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadThumb(string $path) { return $this->upload('thumb', $path); } /** * Upload video. * * @param string $path * @param string $title * @param string $description * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadVideo(string $path, string $title, string $description) { $params = [ 'description' => json_encode( [ 'title' => $title, 'introduction' => $description, ], JSON_UNESCAPED_UNICODE ), ]; return $this->upload('video', $path, $params); } /** * Upload articles. * * @param array|Article $articles * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadArticle($articles) { if ($articles instanceof Article || !empty($articles['title'])) { $articles = [$articles]; } $params = ['articles' => array_map(function ($article) { if ($article instanceof Article) { return $article->transformForJsonRequestWithoutType(); } return $article; }, $articles)]; return $this->httpPostJson('cgi-bin/material/add_news', $params); } /** * Update article. * * @param string $mediaId * @param array|Article $article * @param int $index * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateArticle(string $mediaId, $article, int $index = 0) { if ($article instanceof Article) { $article = $article->transformForJsonRequestWithoutType(); } $params = [ 'media_id' => $mediaId, 'index' => $index, 'articles' => isset($article['title']) ? $article : (isset($article[$index]) ? $article[$index] : []), ]; return $this->httpPostJson('cgi-bin/material/update_news', $params); } /** * Upload image for article. * * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function uploadArticleImage(string $path) { return $this->upload('news_image', $path); } /** * Fetch material. * * @param string $mediaId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $mediaId) { $response = $this->requestRaw('cgi-bin/material/get_material', 'POST', ['json' => ['media_id' => $mediaId]]); if (false !== stripos($response->getHeaderLine('Content-disposition'), 'attachment')) { return StreamResponse::buildFromPsrResponse($response); } return $this->castResponseToType($response, $this->app['config']->get('response_type')); } /** * Delete material by media ID. * * @param string $mediaId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $mediaId) { return $this->httpPostJson('cgi-bin/material/del_material', ['media_id' => $mediaId]); } /** * List materials. * * example: * * { * "total_count": TOTAL_COUNT, * "item_count": ITEM_COUNT, * "item": [{ * "media_id": MEDIA_ID, * "name": NAME, * "update_time": UPDATE_TIME * }, * // more... * ] * } * * @param string $type * @param int $offset * @param int $count * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(string $type, int $offset = 0, int $count = 20) { $params = [ 'type' => $type, 'offset' => $offset, 'count' => $count, ]; return $this->httpPostJson('cgi-bin/material/batchget_material', $params); } /** * Get stats of materials. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function stats() { return $this->httpGet('cgi-bin/material/get_materialcount'); } /** * Upload material. * * @param string $type * @param string $path * @param array $form * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function upload(string $type, string $path, array $form = []) { if (!file_exists($path) || !is_readable($path)) { throw new InvalidArgumentException(sprintf('File does not exist, or the file is unreadable: "%s"', $path)); } $form['type'] = $type; return $this->httpUpload($this->getApiByType($type), ['media' => $path], $form); } /** * Get API by type. * * @param string $type * * @return string */ public function getApiByType(string $type) { switch ($type) { case 'news_image': return 'cgi-bin/media/uploadimg'; default: return 'cgi-bin/material/add_material'; } } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Material/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * ServiceProvider.php. * * This file is part of the wechat. * * (c) overtrue * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Material; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['material'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Menu/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Menu; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * Get all menus. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function list() { return $this->httpGet('cgi-bin/menu/get'); } /** * Get current menus. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function current() { return $this->httpGet('cgi-bin/get_current_selfmenu_info'); } /** * Add menu. * * @param array $buttons * @param array $matchRule * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $buttons, array $matchRule = []) { if (!empty($matchRule)) { return $this->httpPostJson('cgi-bin/menu/addconditional', [ 'button' => $buttons, 'matchrule' => $matchRule, ]); } return $this->httpPostJson('cgi-bin/menu/create', ['button' => $buttons]); } /** * Destroy menu. * * @param int $menuId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(int $menuId = null) { if (is_null($menuId)) { return $this->httpGet('cgi-bin/menu/delete'); } return $this->httpPostJson('cgi-bin/menu/delconditional', ['menuid' => $menuId]); } /** * Test conditional menu. * * @param string $userId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function match(string $userId) { return $this->httpPostJson('cgi-bin/menu/trymatch', ['user_id' => $userId]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Menu/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Menu; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['menu'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/OAuth/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\OAuth; use Overtrue\Socialite\SocialiteManager as Socialite; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['oauth'] = function ($app) { $wechat = [ 'wechat' => [ 'client_id' => $app['config']['app_id'], 'client_secret' => $app['config']['secret'], 'redirect' => $this->prepareCallbackUrl($app), ], ]; if (!empty($app['config']['component_app_id'] && !empty($app['config']['component_app_token']))) { $wechat['wechat']['component'] = [ 'id' => $app['config']['component_app_id'], 'token' => $app['config']['token'], ] ; } $socialite = (new Socialite($wechat))->create('wechat'); $scopes = (array)$app['config']->get('oauth.scopes', ['snsapi_userinfo']); if (!empty($scopes)) { $socialite->scopes($scopes); } return $socialite; }; } /** * Prepare the OAuth callback url for wechat. * * @param Container $app * * @return string */ private function prepareCallbackUrl($app) { $callback = $app['config']->get('oauth.callback'); if (0 === stripos($callback, 'http')) { return $callback; } $baseUrl = $app['request']->getSchemeAndHttpHost(); return $baseUrl . '/' . ltrim($callback, '/'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/OCR/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\OCR; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class Client. * * @author joyeekk */ class Client extends BaseClient { /** * Allow image parameter type. * * @var array */ protected $allowTypes = ['photo', 'scan']; /** * ID card OCR. * * @param string $path * @param string $type * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function idCard(string $path, string $type = 'photo') { if (!\in_array($type, $this->allowTypes, true)) { throw new InvalidArgumentException(sprintf("Unsupported type: '%s'", $type)); } return $this->httpPost('cv/ocr/idcard', [ 'type' => $type, 'img_url' => $path, ]); } /** * Bank card OCR. * * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function bankCard(string $path) { return $this->httpPost('cv/ocr/bankcard', [ 'img_url' => $path, ]); } /** * Vehicle license OCR. * * @param string $path * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function vehicleLicense(string $path) { return $this->httpPost('cv/ocr/drivinglicense', [ 'img_url' => $path, ]); } /** * Driving OCR. * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function driving(string $path) { return $this->httpPost('cv/ocr/driving', [ 'img_url' => $path, ]); } /** * Biz License OCR. * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function bizLicense(string $path) { return $this->httpPost('cv/ocr/bizlicense', [ 'img_url' => $path, ]); } /** * Common OCR. * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function common(string $path) { return $this->httpPost('cv/ocr/comm', [ 'img_url' => $path, ]); } /** * Plate Number OCR. * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function plateNumber(string $path) { return $this->httpPost('cv/ocr/platenum', [ 'img_url' => $path, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/OCR/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\OCR; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author joyeekk */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['ocr'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/POI/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\POI; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * Get POI supported categories. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function categories() { return $this->httpGet('cgi-bin/poi/getwxcategory'); } /** * Get POI by ID. * * @param int $poiId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(int $poiId) { return $this->httpPostJson('cgi-bin/poi/getpoi', ['poi_id' => $poiId]); } /** * List POI. * * @param int $offset * @param int $limit * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(int $offset = 0, int $limit = 10) { $params = [ 'begin' => $offset, 'limit' => $limit, ]; return $this->httpPostJson('cgi-bin/poi/getpoilist', $params); } /** * Create a POI. * * @param array $baseInfo * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $baseInfo) { $params = [ 'business' => [ 'base_info' => $baseInfo, ], ]; return $this->httpPostJson('cgi-bin/poi/addpoi', $params); } /** * @param array $databaseInfo * * @return int * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function createAndGetId(array $databaseInfo) { /** @var array $response */ $response = $this->detectAndCastResponseToType($this->create($databaseInfo), 'array'); return $response['poi_id']; } /** * Update a POI. * * @param int $poiId * @param array $baseInfo * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(int $poiId, array $baseInfo) { $params = [ 'business' => [ 'base_info' => array_merge($baseInfo, ['poi_id' => $poiId]), ], ]; return $this->httpPostJson('cgi-bin/poi/updatepoi', $params); } /** * Delete a POI. * * @param int $poiId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(int $poiId) { return $this->httpPostJson('cgi-bin/poi/delpoi', ['poi_id' => $poiId]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/POI/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\POI; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['poi'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Semantic/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Semantic; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * Get the semantic content of giving string. * * @param string $keyword * @param string $categories * @param array $optional * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function query(string $keyword, string $categories, array $optional = []) { $params = [ 'query' => $keyword, 'category' => $categories, 'appid' => $this->app['config']['app_id'], ]; return $this->httpPostJson('semantic/semproxy/search', array_merge($params, $optional)); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Semantic/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Semantic; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['semantic'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Server/Guard.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Server; use EasyWeChat\Kernel\ServerGuard; /** * Class Guard. * * @author overtrue */ class Guard extends ServerGuard { /** * @return bool */ protected function shouldReturnRawResponse(): bool { return !is_null($this->app['request']->get('echostr')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Server/Handlers/EchoStrHandler.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Server\Handlers; use EasyWeChat\Kernel\Contracts\EventHandlerInterface; use EasyWeChat\Kernel\Decorators\FinallyResult; use EasyWeChat\Kernel\ServiceContainer; /** * Class EchoStrHandler. * * @author overtrue */ class EchoStrHandler implements EventHandlerInterface { /** * @var ServiceContainer */ protected $app; /** * EchoStrHandler constructor. * * @param ServiceContainer $app */ public function __construct(ServiceContainer $app) { $this->app = $app; } /** * @param mixed $payload * * @return FinallyResult|null */ public function handle($payload = null) { if ($str = $this->app['request']->get('echostr')) { return new FinallyResult($str); } return null; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Server/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Server; use EasyWeChat\Kernel\Encryptor; use EasyWeChat\OfficialAccount\Server\Handlers\EchoStrHandler; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { !isset($app['encryptor']) && $app['encryptor'] = function ($app) { return new Encryptor( $app['config']['app_id'], $app['config']['token'], $app['config']['aes_key'] ); }; !isset($app['server']) && $app['server'] = function ($app) { $guard = new Guard($app); $guard->push(new EchoStrHandler($app)); return $guard; }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\ShakeAround; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function register($data) { return $this->httpPostJson('shakearound/account/register', $data); } /** * Get audit status. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function status() { return $this->httpGet('shakearound/account/auditstatus'); } /** * Get shake info. * * @param string $ticket * @param bool $needPoi * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function user(string $ticket, bool $needPoi = false) { $params = [ 'ticket' => $ticket, ]; if ($needPoi) { $params['need_poi'] = 1; } return $this->httpPostJson('shakearound/user/getshakeinfo', $params); } /** * @param string $ticket * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string */ public function userWithPoi(string $ticket) { return $this->user($ticket, true); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/DeviceClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\ShakeAround; use EasyWeChat\Kernel\BaseClient; /** * Class DeviceClient. * * @author allen05ren */ class DeviceClient extends BaseClient { /** * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function apply(array $data) { return $this->httpPostJson('shakearound/device/applyid', $data); } /** * Get audit status. * * @param int $applyId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function status(int $applyId) { $params = [ 'apply_id' => $applyId, ]; return $this->httpPostJson('shakearound/device/applystatus', $params); } /** * Update a device comment. * * @param array $deviceIdentifier * @param string $comment * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(array $deviceIdentifier, string $comment) { $params = [ 'device_identifier' => $deviceIdentifier, 'comment' => $comment, ]; return $this->httpPostJson('shakearound/device/update', $params); } /** * Bind location for device. * * @param array $deviceIdentifier * @param int $poiId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function bindPoi(array $deviceIdentifier, int $poiId) { $params = [ 'device_identifier' => $deviceIdentifier, 'poi_id' => $poiId, ]; return $this->httpPostJson('shakearound/device/bindlocation', $params); } /** * @param array $deviceIdentifier * @param int $poiId * @param string $appId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function bindThirdPoi(array $deviceIdentifier, int $poiId, string $appId) { $params = [ 'device_identifier' => $deviceIdentifier, 'poi_id' => $poiId, 'type' => 2, 'poi_appid' => $appId, ]; return $this->httpPostJson('shakearound/device/bindlocation', $params); } /** * Fetch batch of devices by deviceIds. * * @param array $deviceIdentifiers * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function listByIds(array $deviceIdentifiers) { $params = [ 'type' => 1, 'device_identifiers' => $deviceIdentifiers, ]; return $this->search($params); } /** * Pagination to get batch of devices. * * @param int $lastId * @param int $count * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function list(int $lastId, int $count) { $params = [ 'type' => 2, 'last_seen' => $lastId, 'count' => $count, ]; return $this->search($params); } /** * Fetch batch of devices by applyId. * * @param int $applyId * @param int $lastId * @param int $count * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string */ public function listByApplyId(int $applyId, int $lastId, int $count) { $params = [ 'type' => 3, 'apply_id' => $applyId, 'last_seen' => $lastId, 'count' => $count, ]; return $this->search($params); } /** * Fetch batch of devices. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function search(array $params) { return $this->httpPostJson('shakearound/device/search', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/GroupClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\ShakeAround; use EasyWeChat\Kernel\BaseClient; /** * Class GroupClient. * * @author allen05ren */ class GroupClient extends BaseClient { /** * Add device group. * * @param string $name * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(string $name) { $params = [ 'group_name' => $name, ]; return $this->httpPostJson('shakearound/device/group/add', $params); } /** * Update a device group name. * * @param int $groupId * @param string $name * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(int $groupId, string $name) { $params = [ 'group_id' => $groupId, 'group_name' => $name, ]; return $this->httpPostJson('shakearound/device/group/update', $params); } /** * Delete device group. * * @param int $groupId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(int $groupId) { $params = [ 'group_id' => $groupId, ]; return $this->httpPostJson('shakearound/device/group/delete', $params); } /** * List all device groups. * * @param int $begin * @param int $count * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(int $begin, int $count) { $params = [ 'begin' => $begin, 'count' => $count, ]; return $this->httpPostJson('shakearound/device/group/getlist', $params); } /** * Get detail of a device group. * * @param int $groupId * @param int $begin * @param int $count * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(int $groupId, int $begin, int $count) { $params = [ 'group_id' => $groupId, 'begin' => $begin, 'count' => $count, ]; return $this->httpPostJson('shakearound/device/group/getdetail', $params); } /** * Add one or more devices to a device group. * * @param int $groupId * @param array $deviceIdentifiers * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addDevices(int $groupId, array $deviceIdentifiers) { $params = [ 'group_id' => $groupId, 'device_identifiers' => $deviceIdentifiers, ]; return $this->httpPostJson('shakearound/device/group/adddevice', $params); } /** * Remove one or more devices from a device group. * * @param int $groupId * @param array $deviceIdentifiers * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function removeDevices(int $groupId, array $deviceIdentifiers) { $params = [ 'group_id' => $groupId, 'device_identifiers' => $deviceIdentifiers, ]; return $this->httpPostJson('shakearound/device/group/deletedevice', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/MaterialClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\ShakeAround; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class MaterialClient. * * @author allen05ren */ class MaterialClient extends BaseClient { /** * Upload image material. * * @param string $path * @param string $type * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadImage(string $path, string $type = 'icon') { if (!file_exists($path) || !is_readable($path)) { throw new InvalidArgumentException(sprintf('File does not exist, or the file is unreadable: "%s"', $path)); } return $this->httpUpload('shakearound/material/add', ['media' => $path], [], ['type' => strtolower($type)]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/PageClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\ShakeAround; use EasyWeChat\Kernel\BaseClient; /** * Class PageClient. * * @author allen05ren */ class PageClient extends BaseClient { /** * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $data) { return $this->httpPostJson('shakearound/page/add', $data); } /** * @param int $pageId * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(int $pageId, array $data) { return $this->httpPostJson('shakearound/page/update', array_merge(['page_id' => $pageId], $data)); } /** * Fetch batch of pages by pageIds. * * @param array $pageIds * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function listByIds(array $pageIds) { $params = [ 'type' => 1, 'page_ids' => $pageIds, ]; return $this->httpPostJson('shakearound/page/search', $params); } /** * Pagination to get batch of pages. * * @param int $begin * @param int $count * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(int $begin, int $count) { $params = [ 'type' => 2, 'begin' => $begin, 'count' => $count, ]; return $this->httpPostJson('shakearound/page/search', $params); } /** * delete a page. * * @param int $pageId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(int $pageId) { $params = [ 'page_id' => $pageId, ]; return $this->httpPostJson('shakearound/page/delete', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/RelationClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\ShakeAround; use EasyWeChat\Kernel\BaseClient; /** * Class RelationClient. * * @author allen05ren */ class RelationClient extends BaseClient { /** * Bind pages for device. * * @param array $deviceIdentifier * @param array $pageIds * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function bindPages(array $deviceIdentifier, array $pageIds) { $params = [ 'device_identifier' => $deviceIdentifier, 'page_ids' => $pageIds, ]; return $this->httpPostJson('shakearound/device/bindpage', $params); } /** * Get pageIds by deviceId. * * @param array $deviceIdentifier * * @return array|\EasyWeChat\Kernel\Support\Collection * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function listByDeviceId(array $deviceIdentifier) { $params = [ 'type' => 1, 'device_identifier' => $deviceIdentifier, ]; return $this->httpPostJson('shakearound/relation/search', $params); } /** * Get devices by pageId. * * @param int $pageId * @param int $begin * @param int $count * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function listByPageId(int $pageId, int $begin, int $count) { $params = [ 'type' => 2, 'page_id' => $pageId, 'begin' => $begin, 'count' => $count, ]; return $this->httpPostJson('shakearound/relation/search', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\ShakeAround; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author allen05ren */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['shake_around'] = function ($app) { return new ShakeAround($app); }; $app['shake_around.device'] = function ($app) { return new DeviceClient($app); }; $app['shake_around.page'] = function ($app) { return new PageClient($app); }; $app['shake_around.material'] = function ($app) { return new MaterialClient($app); }; $app['shake_around.group'] = function ($app) { return new GroupClient($app); }; $app['shake_around.relation'] = function ($app) { return new RelationClient($app); }; $app['shake_around.stats'] = function ($app) { return new StatsClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/ShakeAround.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\ShakeAround; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class Card. * * @author overtrue * * @property \EasyWeChat\OfficialAccount\ShakeAround\DeviceClient $device * @property \EasyWeChat\OfficialAccount\ShakeAround\GroupClient $group * @property \EasyWeChat\OfficialAccount\ShakeAround\MaterialClient $material * @property \EasyWeChat\OfficialAccount\ShakeAround\RelationClient $relation * @property \EasyWeChat\OfficialAccount\ShakeAround\StatsClient $stats * @property \EasyWeChat\OfficialAccount\ShakeAround\PageClient $page */ class ShakeAround extends Client { /** * @param string $property * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function __get($property) { if (isset($this->app["shake_around.{$property}"])) { return $this->app["shake_around.{$property}"]; } throw new InvalidArgumentException(sprintf('No shake_around service named "%s".', $property)); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/ShakeAround/StatsClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\ShakeAround; use EasyWeChat\Kernel\BaseClient; /** * Class StatsClient. * * @author allen05ren */ class StatsClient extends BaseClient { /** * Fetch statistics data by deviceId. * * @param array $deviceIdentifier * @param int $beginTime (Unix timestamp) * @param int $endTime (Unix timestamp) * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deviceSummary(array $deviceIdentifier, int $beginTime, int $endTime) { $params = [ 'device_identifier' => $deviceIdentifier, 'begin_date' => $beginTime, 'end_date' => $endTime, ]; return $this->httpPostJson('shakearound/statistics/device', $params); } /** * Fetch all devices statistics data by date. * * @param int $timestamp * @param int $pageIndex * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function devicesSummary(int $timestamp, int $pageIndex) { $params = [ 'date' => $timestamp, 'page_index' => $pageIndex, ]; return $this->httpPostJson('shakearound/statistics/devicelist', $params); } /** * Fetch statistics data by pageId. * * @param int $pageId * @param int $beginTime (Unix timestamp) * @param int $endTime (Unix timestamp) * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function pageSummary(int $pageId, int $beginTime, int $endTime) { $params = [ 'page_id' => $pageId, 'begin_date' => $beginTime, 'end_date' => $endTime, ]; return $this->httpPostJson('shakearound/statistics/page', $params); } /** * Fetch all pages statistics data by date. * * @param int $timestamp * @param int $pageIndex * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function pagesSummary(int $timestamp, int $pageIndex) { $params = [ 'date' => $timestamp, 'page_index' => $pageIndex, ]; return $this->httpPostJson('shakearound/statistics/pagelist', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Store/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Store; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author bigface */ class Client extends BaseClient { /** * Get WXA supported categories. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function categories() { return $this->httpGet('wxa/get_merchant_category'); } /** * Get district from tencent map . * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function districts() { return $this->httpGet('wxa/get_district'); } /** * Search store from tencent map. * * @param int $districtId * @param string $keyword * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function searchFromMap(int $districtId, string $keyword) { $params = [ 'districtid' => $districtId, 'keyword' => $keyword, ]; return $this->httpPostJson('wxa/search_map_poi', $params); } /** * Get store check status. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getStatus() { return $this->httpGet('wxa/get_merchant_audit_info'); } /** * Create a merchant. * * @param array $baseInfo * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createMerchant(array $baseInfo) { return $this->httpPostJson('wxa/apply_merchant', $baseInfo); } /** * Update a merchant. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateMerchant(array $params) { return $this->httpPostJson('wxa/modify_merchant', $params); } /** * Create a store from tencent map. * * @param array $baseInfo * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createFromMap(array $baseInfo) { return $this->httpPostJson('wxa/create_map_poi', $baseInfo); } /** * Create a store. * * @param array $baseInfo * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $baseInfo) { return $this->httpPostJson('wxa/add_store', $baseInfo); } /** * Update a store. * * @param int $poiId * @param array $baseInfo * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(int $poiId, array $baseInfo) { $params = array_merge($baseInfo, ['poi_id' => $poiId]); return $this->httpPostJson('wxa/update_store', $params); } /** * Get store by ID. * * @param int $poiId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(int $poiId) { return $this->httpPostJson('wxa/get_store_info', ['poi_id' => $poiId]); } /** * List store. * * @param int $offset * @param int $limit * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(int $offset = 0, int $limit = 10) { $params = [ 'offset' => $offset, 'limit' => $limit, ]; return $this->httpPostJson('wxa/get_store_list', $params); } /** * Delete a store. * * @param int $poiId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(int $poiId) { return $this->httpPostJson('wxa/del_store', ['poi_id' => $poiId]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/Store/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\Store; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author bigface */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['store'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/SubscribeMessage/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\SubscribeMessage; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use ReflectionClass; /** * Class Client. * * @author tegic */ class Client extends BaseClient { protected $message = [ 'touser' => '', 'template_id' => '', 'page' => '', 'miniprogram' => '', 'data' => [], ]; /** * {@inheritdoc}. */ protected $required = ['touser', 'template_id', 'data']; /** * Combine templates and add them to your personal template library under your account. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addTemplate(string $tid, array $kidList, string $sceneDesc = null) { $sceneDesc = $sceneDesc ?? ''; $data = \compact('tid', 'kidList', 'sceneDesc'); return $this->httpPost('wxaapi/newtmpl/addtemplate', $data); } /** * Delete personal template under account. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deleteTemplate(string $id) { return $this->httpPost('wxaapi/newtmpl/deltemplate', ['priTmplId' => $id]); } /** * Get the category of the applet account. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getCategory() { return $this->httpGet('wxaapi/newtmpl/getcategory'); } /** * Get keyword list under template title. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTemplateKeywords(string $tid) { return $this->httpGet('wxaapi/newtmpl/getpubtemplatekeywords', compact('tid')); } /** * Get the title of the public template under the category to which the account belongs. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTemplateTitles(array $ids, int $start = 0, int $limit = 30) { $ids = \implode(',', $ids); $query = \compact('ids', 'start', 'limit'); return $this->httpGet('wxaapi/newtmpl/getpubtemplatetitles', $query); } /** * Get list of personal templates under the current account. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTemplates() { return $this->httpGet('wxaapi/newtmpl/gettemplate'); } /** * Send a subscribe message. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $data = []) { $params = $this->formatMessage($data); $this->restoreMessage(); return $this->httpPostJson('cgi-bin/message/subscribe/bizsend', $params); } /** * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function formatMessage(array $data = []) { $params = array_merge($this->message, $data); foreach ($params as $key => $value) { if (in_array($key, $this->required, true) && empty($value) && empty($this->message[$key])) { throw new InvalidArgumentException(sprintf('Attribute "%s" can not be empty!', $key)); } $params[$key] = empty($value) ? $this->message[$key] : $value; } foreach ($params['data'] as $key => $value) { if (is_array($value)) { if (\array_key_exists('value', $value)) { $params['data'][$key] = ['value' => $value['value']]; continue; } if (count($value) >= 1) { $value = [ 'value' => $value[0], // 'color' => $value[1],// color unsupported ]; } } else { $value = [ 'value' => strval($value), ]; } $params['data'][$key] = $value; } return $params; } /** * Restore message. */ protected function restoreMessage() { $this->message = (new ReflectionClass(static::class))->getDefaultProperties()['message']; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/SubscribeMessage/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\SubscribeMessage; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['subscribe_message'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/TemplateMessage/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\TemplateMessage; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use ReflectionClass; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { public const API_SEND = 'cgi-bin/message/template/send'; /** * Attributes. * * @var array */ protected $message = [ 'touser' => '', 'template_id' => '', 'url' => '', 'data' => [], 'miniprogram' => '', ]; /** * Required attributes. * * @var array */ protected $required = ['touser', 'template_id']; /** * Set industry. * * @param int $industryOne * @param int $industryTwo * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setIndustry($industryOne, $industryTwo) { $params = [ 'industry_id1' => $industryOne, 'industry_id2' => $industryTwo, ]; return $this->httpPostJson('cgi-bin/template/api_set_industry', $params); } /** * Get industry. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getIndustry() { return $this->httpPostJson('cgi-bin/template/get_industry'); } /** * Add a template and get template ID. * * @param string $shortId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addTemplate($shortId, $keywordList = []) { $params = ['template_id_short' => $shortId]; if ($keywordList) { $params['keyword_name_list'] = $keywordList; } return $this->httpPostJson('cgi-bin/template/api_add_template', $params); } /** * Get private templates. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getPrivateTemplates() { return $this->httpPostJson('cgi-bin/template/get_all_private_template'); } /** * Delete private template. * * @param string $templateId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deletePrivateTemplate($templateId) { $params = ['template_id' => $templateId]; return $this->httpPostJson('cgi-bin/template/del_private_template', $params); } /** * Send a template message. * * @param array $data * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $data = []) { $params = $this->formatMessage($data); $this->restoreMessage(); return $this->httpPostJson(static::API_SEND, $params); } /** * Send template-message for subscription. * * @param array $data * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function sendSubscription(array $data = []) { $params = $this->formatMessage($data); $this->restoreMessage(); return $this->httpPostJson('cgi-bin/message/template/subscribe', $params); } /** * @param array $data * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function formatMessage(array $data = []) { $params = array_merge($this->message, $data); foreach ($params as $key => $value) { if (in_array($key, $this->required, true) && empty($value) && empty($this->message[$key])) { throw new InvalidArgumentException(sprintf('Attribute "%s" can not be empty!', $key)); } $params[$key] = empty($value) ? $this->message[$key] : $value; } $params['data'] = $this->formatData($params['data'] ?? []); return $params; } /** * @param array $data * * @return array */ protected function formatData(array $data) { $formatted = []; foreach ($data as $key => $value) { if (is_array($value)) { if (\array_key_exists('value', $value)) { $formatted[$key] = $value; continue; } if (count($value) >= 2) { $value = [ 'value' => $value[0], 'color' => $value[1], ]; } } else { $value = [ 'value' => strval($value), ]; } $formatted[$key] = $value; } return $formatted; } /** * Restore message. */ protected function restoreMessage() { $this->message = (new ReflectionClass(static::class))->getDefaultProperties()['message']; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/TemplateMessage/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\TemplateMessage; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['template_message'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/User/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\User; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['user'] = function ($app) { return new UserClient($app); }; $app['user_tag'] = function ($app) { return new TagClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/User/TagClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\User; use EasyWeChat\Kernel\BaseClient; /** * Class TagClient. * * @author overtrue */ class TagClient extends BaseClient { /** * Create tag. * * @param string $name * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(string $name) { $params = [ 'tag' => ['name' => $name], ]; return $this->httpPostJson('cgi-bin/tags/create', $params); } /** * List all tags. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function list() { return $this->httpGet('cgi-bin/tags/get'); } /** * Update a tag name. * * @param int $tagId * @param string $name * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(int $tagId, string $name) { $params = [ 'tag' => [ 'id' => $tagId, 'name' => $name, ], ]; return $this->httpPostJson('cgi-bin/tags/update', $params); } /** * Delete tag. * * @param int $tagId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(int $tagId) { $params = [ 'tag' => ['id' => $tagId], ]; return $this->httpPostJson('cgi-bin/tags/delete', $params); } /** * Get user tags. * * @param string $openid * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function userTags(string $openid) { $params = ['openid' => $openid]; return $this->httpPostJson('cgi-bin/tags/getidlist', $params); } /** * Get users from a tag. * * @param int $tagId * @param string $nextOpenId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function usersOfTag(int $tagId, string $nextOpenId = '') { $params = [ 'tagid' => $tagId, 'next_openid' => $nextOpenId, ]; return $this->httpPostJson('cgi-bin/user/tag/get', $params); } /** * Batch tag users. * * @param array $openids * @param int $tagId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function tagUsers(array $openids, int $tagId) { $params = [ 'openid_list' => $openids, 'tagid' => $tagId, ]; return $this->httpPostJson('cgi-bin/tags/members/batchtagging', $params); } /** * Untag users from a tag. * * @param array $openids * @param int $tagId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function untagUsers(array $openids, int $tagId) { $params = [ 'openid_list' => $openids, 'tagid' => $tagId, ]; return $this->httpPostJson('cgi-bin/tags/members/batchuntagging', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/User/UserClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\User; use EasyWeChat\Kernel\BaseClient; /** * Class UserClient. * * @author overtrue */ class UserClient extends BaseClient { /** * Fetch a user by open id. * * @param string $openid * @param string $lang * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function get(string $openid, string $lang = 'zh_CN') { $params = [ 'openid' => $openid, 'lang' => $lang, ]; return $this->httpGet('cgi-bin/user/info', $params); } /** * Batch get users. * * @param array $openids * @param string $lang * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function select(array $openids, string $lang = 'zh_CN') { return $this->httpPostJson('cgi-bin/user/info/batchget', [ 'user_list' => array_map(function ($openid) use ($lang) { return [ 'openid' => $openid, 'lang' => $lang, ]; }, $openids), ]); } /** * List users. * * @param string $nextOpenId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function list(string $nextOpenId = null) { $params = ['next_openid' => $nextOpenId]; return $this->httpGet('cgi-bin/user/get', $params); } /** * Set user remark. * * @param string $openid * @param string $remark * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function remark(string $openid, string $remark) { $params = [ 'openid' => $openid, 'remark' => $remark, ]; return $this->httpPostJson('cgi-bin/user/info/updateremark', $params); } /** * Get black list. * * @param string|null $beginOpenid * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function blacklist(string $beginOpenid = null) { $params = ['begin_openid' => $beginOpenid]; return $this->httpPostJson('cgi-bin/tags/members/getblacklist', $params); } /** * Batch block user. * * @param array|string $openidList * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function block($openidList) { $params = ['openid_list' => (array) $openidList]; return $this->httpPostJson('cgi-bin/tags/members/batchblacklist', $params); } /** * Batch unblock user. * * @param array $openidList * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function unblock($openidList) { $params = ['openid_list' => (array) $openidList]; return $this->httpPostJson('cgi-bin/tags/members/batchunblacklist', $params); } /** * @param string $oldAppId * @param array $openidList * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function changeOpenid(string $oldAppId, array $openidList) { $params = [ 'from_appid' => $oldAppId, 'openid_list' => $openidList, ]; return $this->httpPostJson('cgi-bin/changeopenid', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/WiFi/CardClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\WiFi; use EasyWeChat\Kernel\BaseClient; /** * Class CardClient. * * @author her-cat */ class CardClient extends BaseClient { /** * Set shop card coupon delivery information. * * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function set(array $data) { return $this->httpPostJson('bizwifi/couponput/set', $data); } /** * Get shop card coupon delivery information. * * @param int $shopId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(int $shopId = 0) { return $this->httpPostJson('bizwifi/couponput/get', ['shop_id' => $shopId]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/WiFi/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\WiFi; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author her-cat */ class Client extends BaseClient { /** * Get Wi-Fi statistics. * * @param string $beginDate * @param string $endDate * @param int $shopId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function summary(string $beginDate, string $endDate, int $shopId = -1) { $data = [ 'begin_date' => $beginDate, 'end_date' => $endDate, 'shop_id' => $shopId, ]; return $this->httpPostJson('bizwifi/statistics/list', $data); } /** * Get the material QR code. * * @param int $shopId * @param string $ssid * @param int $type * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getQrCodeUrl(int $shopId, string $ssid, int $type = 0) { $data = [ 'shop_id' => $shopId, 'ssid' => $ssid, 'img_id' => $type, ]; return $this->httpPostJson('bizwifi/qrcode/get', $data); } /** * Wi-Fi completion page jump applet. * * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setFinishPage(array $data) { return $this->httpPostJson('bizwifi/finishpage/set', $data); } /** * Set the top banner jump applet. * * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setHomePage(array $data) { return $this->httpPostJson('bizwifi/homepage/set', $data); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/WiFi/DeviceClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\WiFi; use EasyWeChat\Kernel\BaseClient; /** * Class DeviceClient. * * @author her-cat */ class DeviceClient extends BaseClient { /** * Add a password device. * * @param int $shopId * @param string $ssid * @param string $password * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addPasswordDevice(int $shopId, string $ssid, string $password) { $data = [ 'shop_id' => $shopId, 'ssid' => $ssid, 'password' => $password, ]; return $this->httpPostJson('bizwifi/device/add', $data); } /** * Add a portal device. * * @param int $shopId * @param string $ssid * @param bool $reset * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addPortalDevice(int $shopId, string $ssid, bool $reset = false) { $data = [ 'shop_id' => $shopId, 'ssid' => $ssid, 'reset' => $reset, ]; return $this->httpPostJson('bizwifi/apportal/register', $data); } /** * Delete device by MAC address. * * @param string $macAddress * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $macAddress) { return $this->httpPostJson('bizwifi/device/delete', ['bssid' => $macAddress]); } /** * Get a list of devices. * * @param int $page * @param int $size * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(int $page = 1, int $size = 10) { $data = [ 'pageindex' => $page, 'pagesize' => $size, ]; return $this->httpPostJson('bizwifi/device/list', $data); } /** * Get a list of devices by shop ID. * * @param int $shopId * @param int $page * @param int $size * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function listByShopId(int $shopId, int $page = 1, int $size = 10) { $data = [ 'shop_id' => $shopId, 'pageindex' => $page, 'pagesize' => $size, ]; return $this->httpPostJson('bizwifi/device/list', $data); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/WiFi/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\WiFi; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author her-cat */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} */ public function register(Container $app) { $app['wifi'] = function ($app) { return new Client($app); }; $app['wifi_card'] = function ($app) { return new CardClient($app); }; $app['wifi_device'] = function ($app) { return new DeviceClient($app); }; $app['wifi_shop'] = function ($app) { return new ShopClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OfficialAccount/WiFi/ShopClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\WiFi; use EasyWeChat\Kernel\BaseClient; /** * Class ShopClient. * * @author her-cat */ class ShopClient extends BaseClient { /** * Get shop Wi-Fi information. * * @param int $shopId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(int $shopId) { return $this->httpPostJson('bizwifi/shop/get', ['shop_id' => $shopId]); } /** * Get a list of Wi-Fi shops. * * @param int $page * @param int $size * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(int $page = 1, int $size = 10) { $data = [ 'pageindex' => $page, 'pagesize' => $size, ]; return $this->httpPostJson('bizwifi/shop/list', $data); } /** * Update shop Wi-Fi information. * * @param int $shopId * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(int $shopId, array $data) { $data = array_merge(['shop_id' => $shopId], $data); return $this->httpPostJson('bizwifi/shop/update', $data); } /** * Clear shop network and equipment. * * @param int $shopId * @param string|null $ssid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function clearDevice(int $shopId, string $ssid = null) { $data = [ 'shop_id' => $shopId, ]; if (!is_null($ssid)) { $data['ssid'] = $ssid; } return $this->httpPostJson('bizwifi/shop/clean', $data); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Application.php ================================================ [ 'timeout' => 5.0, 'base_uri' => 'https://api.weixin.qq.com/', ], ]; /** * Creates the officialAccount application. * * @param string $appId * @param string|null $refreshToken * @param \EasyWeChat\OpenPlatform\Authorizer\Auth\AccessToken|null $accessToken * * @return \EasyWeChat\OpenPlatform\Authorizer\OfficialAccount\Application */ public function officialAccount( string $appId, string $refreshToken = null, AccessToken $accessToken = null ): OfficialAccount { $application = new OfficialAccount( $this->getAuthorizerConfig($appId, $refreshToken), $this->getReplaceServices($accessToken) + [ 'encryptor' => $this['encryptor'], 'account' => function ($app) { return new AccountClient($app, $this); }, ] ); $application->extend( 'oauth', function ($socialite) { /* @var \Overtrue\Socialite\Providers\WeChat $socialite */ $socialite->withComponent( [ 'id' => $this['config']['app_id'], 'token' => fn () => $this['access_token']->getToken()['component_access_token'], ] ); return $socialite; } ); return $application; } /** * Creates the miniProgram application. * * @param string $appId * @param string|null $refreshToken * @param \EasyWeChat\OpenPlatform\Authorizer\Auth\AccessToken|null $accessToken * * @return \EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Application */ public function miniProgram( string $appId, string $refreshToken = null, AccessToken $accessToken = null ): MiniProgram { return new MiniProgram( $this->getAuthorizerConfig($appId, $refreshToken), $this->getReplaceServices($accessToken) + [ 'encryptor' => function () { return new Encryptor( $this['config']['app_id'], $this['config']['token'], $this['config']['aes_key'] ); }, 'auth' => function ($app) { return new Client($app, $this); }, ] ); } /** * Return the pre-authorization login page url. * * @param string $callbackUrl * @param string|array|null $optional * * @return string * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function getPreAuthorizationUrl(string $callbackUrl, $optional = []): string { // 兼容旧版 API 设计 if (\is_string($optional)) { $optional = [ 'pre_auth_code' => $optional, ]; } else { $optional['pre_auth_code'] = data_get($this->createPreAuthorizationCode(), 'pre_auth_code'); } $queries = \array_merge( $optional, [ 'component_appid' => $this['config']['app_id'], 'redirect_uri' => $callbackUrl, ] ); return 'https://mp.weixin.qq.com/cgi-bin/componentloginpage?'.http_build_query($queries); } /** * Return the pre-authorization login page url (mobile). * * @param string $callbackUrl * @param string|array|null $optional * * @return string * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ public function getMobilePreAuthorizationUrl(string $callbackUrl, $optional = []): string { // 兼容旧版 API 设计 if (\is_string($optional)) { $optional = [ 'pre_auth_code' => $optional, ]; } else { $optional['pre_auth_code'] = data_get($this->createPreAuthorizationCode(), 'pre_auth_code'); } $queries = \array_merge( ['auth_type' => 3], $optional, [ 'component_appid' => $this['config']['app_id'], 'redirect_uri' => $callbackUrl, 'action' => 'bindcomponent', 'no_scan' => 1, ] ); return 'https://mp.weixin.qq.com/safe/bindcomponent?'.http_build_query($queries).'#wechat_redirect'; } /** * @param string $appId * @param string|null $refreshToken * * @return array */ protected function getAuthorizerConfig(string $appId, string $refreshToken = null): array { return $this['config']->merge( [ 'component_app_id' => $this['config']['app_id'], 'component_app_token' => $this['access_token']->getToken()['component_access_token'], 'app_id' => $appId, 'refresh_token' => $refreshToken, ] )->toArray(); } /** * @param \EasyWeChat\OpenPlatform\Authorizer\Auth\AccessToken|null $accessToken * * @return array */ protected function getReplaceServices(AccessToken $accessToken = null): array { $services = [ 'access_token' => $accessToken ?: function ($app) { return new AccessToken($app, $this); }, 'server' => function ($app) { return new Guard($app); }, ]; foreach (['cache', 'http_client', 'log', 'logger', 'request'] as $reuse) { if (isset($this[$reuse])) { $services[$reuse] = $this[$reuse]; } } return $services; } /** * Handle dynamic calls. * * @param string $method * @param array $args * * @return mixed */ public function __call($method, $args) { return $this->base->$method(...$args); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Auth/AccessToken.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Auth; use EasyWeChat\Kernel\AccessToken as BaseAccessToken; /** * Class AccessToken. * * @author mingyoung */ class AccessToken extends BaseAccessToken { /** * @var string */ protected $requestMethod = 'POST'; /** * @var string */ protected $tokenKey = 'component_access_token'; /** * @var string */ protected $endpointToGetToken = 'cgi-bin/component/api_component_token'; /** * @return array */ protected function getCredentials(): array { return [ 'component_appid' => $this->app['config']['app_id'], 'component_appsecret' => $this->app['config']['secret'], 'component_verify_ticket' => $this->app['verify_ticket']->getTicket(), ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Auth/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Auth; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['verify_ticket'] = function ($app) { return new VerifyTicket($app); }; $app['access_token'] = function ($app) { return new AccessToken($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Auth/VerifyTicket.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Auth; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Traits\InteractsWithCache; use EasyWeChat\OpenPlatform\Application; /** * Class VerifyTicket. * * @author mingyoung */ class VerifyTicket { use InteractsWithCache; /** * @var \EasyWeChat\OpenPlatform\Application */ protected $app; /** * Constructor. * * @param \EasyWeChat\OpenPlatform\Application $app */ public function __construct(Application $app) { $this->app = $app; } /** * Put the credential `component_verify_ticket` in cache. * * @param string $ticket * * @return $this * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function setTicket(string $ticket) { $this->getCache()->set($this->getCacheKey(), $ticket, 3600); if (!$this->getCache()->has($this->getCacheKey())) { throw new RuntimeException('Failed to cache verify ticket.'); } return $this; } /** * Get the credential `component_verify_ticket` from cache. * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function getTicket(): string { if ($cached = $this->getCache()->get($this->getCacheKey())) { return $cached; } throw new RuntimeException('Credential "component_verify_ticket" does not exist in cache.'); } /** * Get cache key. * * @return string */ protected function getCacheKey(): string { return 'easywechat.open_platform.verify_ticket.'.$this->app['config']['app_id']; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/Aggregate/Account/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\Aggregate\Account; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author Scholer */ class Client extends BaseClient { /** * 创建开放平台帐号并绑定公众号/小程序. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create() { $params = [ 'appid' => $this->app['config']['app_id'], ]; return $this->httpPostJson('cgi-bin/open/create', $params); } /** * 将公众号/小程序绑定到开放平台帐号下. * * @param string $openAppId 开放平台帐号appid * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function bindTo(string $openAppId) { $params = [ 'appid' => $this->app['config']['app_id'], 'open_appid' => $openAppId, ]; return $this->httpPostJson('cgi-bin/open/bind', $params); } /** * 将公众号/小程序从开放平台帐号下解绑. * * @param string $openAppId 开放平台帐号appid * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function unbindFrom(string $openAppId) { $params = [ 'appid' => $this->app['config']['app_id'], 'open_appid' => $openAppId, ]; return $this->httpPostJson('cgi-bin/open/unbind', $params); } /** * 获取公众号/小程序所绑定的开放平台帐号. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getBinding() { $params = [ 'appid' => $this->app['config']['app_id'], ]; return $this->httpPostJson('cgi-bin/open/get', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/Aggregate/AggregateServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\Aggregate; use Pimple\Container; use Pimple\ServiceProviderInterface; class AggregateServiceProvider implements ServiceProviderInterface { public function register(Container $app) { } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/Auth/AccessToken.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\Auth; use EasyWeChat\Kernel\AccessToken as BaseAccessToken; use EasyWeChat\OpenPlatform\Application; use Pimple\Container; /** * Class AccessToken. * * @author mingyoung */ class AccessToken extends BaseAccessToken { /** * @var string */ protected $requestMethod = 'POST'; /** * @var string */ protected $queryName = 'access_token'; /** * {@inheritdoc}. */ protected $tokenKey = 'authorizer_access_token'; /** * @var \EasyWeChat\OpenPlatform\Application */ protected $component; /** * AuthorizerAccessToken constructor. * * @param \Pimple\Container $app * @param \EasyWeChat\OpenPlatform\Application $component */ public function __construct(Container $app, Application $component) { parent::__construct($app); $this->component = $component; } /** * {@inheritdoc}. */ protected function getCredentials(): array { return [ 'component_appid' => $this->component['config']['app_id'], 'authorizer_appid' => $this->app['config']['app_id'], 'authorizer_refresh_token' => $this->app['config']['refresh_token'], ]; } /** * @return string */ public function getEndpoint(): string { return 'cgi-bin/component/api_authorizer_token?'.http_build_query([ 'component_access_token' => $this->component['access_token']->getToken()['component_access_token'], ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Account/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Account; use EasyWeChat\OpenPlatform\Authorizer\Aggregate\Account\Client as BaseClient; /** * Class Client. * * @author ClouderSky */ class Client extends BaseClient { /** * 获取账号基本信息. */ public function getBasicInfo() { return $this->httpPostJson('cgi-bin/account/getaccountbasicinfo'); } /** * 修改头像. * * @param string $mediaId 头像素材mediaId * @param string $left 剪裁框左上角x坐标(取值范围:[0, 1]) * @param string $top 剪裁框左上角y坐标(取值范围:[0, 1]) * @param string $right 剪裁框右下角x坐标(取值范围:[0, 1]) * @param string $bottom 剪裁框右下角y坐标(取值范围:[0, 1]) * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateAvatar( string $mediaId, $left = '0.0', $top = '0.0', $right = '1.0', $bottom = '1.0' ) { $params = [ 'head_img_media_id' => $mediaId, 'x1' => \strval($left), 'y1' => \strval($top), 'x2' => \strval($right), 'y2' => \strval($bottom), ]; return $this->httpPostJson('cgi-bin/account/modifyheadimage', $params); } /** * 修改功能介绍. * * @param string $signature 功能介绍(简介) * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateSignature(string $signature) { $params = ['signature' => $signature]; return $this->httpPostJson('cgi-bin/account/modifysignature', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Account/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Account; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['account'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Application.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram; use EasyWeChat\MiniProgram\Application as MiniProgram; use EasyWeChat\OpenPlatform\Authorizer\Aggregate\AggregateServiceProvider; /** * Class Application. * * @author mingyoung * * @property \EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Account\Client $account * @property \EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Code\Client $code * @property \EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Domain\Client $domain * @property \EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Setting\Client $setting * @property \EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Tester\Client $tester * @property \EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Material\Client $material */ class Application extends MiniProgram { /** * Application constructor. * * @param array $config * @param array $prepends */ public function __construct(array $config = [], array $prepends = []) { parent::__construct($config, $prepends); $providers = [ AggregateServiceProvider::class, Code\ServiceProvider::class, Domain\ServiceProvider::class, Account\ServiceProvider::class, Setting\ServiceProvider::class, Tester\ServiceProvider::class, Material\ServiceProvider::class, Privacy\ServiceProvider::class, Security\ServiceProvider::class, ]; foreach ($providers as $provider) { $this->register(new $provider()); } } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Auth/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Auth; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\ServiceContainer; use EasyWeChat\OpenPlatform\Application; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * @var \EasyWeChat\OpenPlatform\Application */ protected $component; /** * Client constructor. * * @param \EasyWeChat\Kernel\ServiceContainer $app * @param \EasyWeChat\OpenPlatform\Application $component */ public function __construct(ServiceContainer $app, Application $component) { parent::__construct($app); $this->component = $component; } /** * Get session info by code. * * @param string $code * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function session(string $code) { $params = [ 'appid' => $this->app['config']['app_id'], 'js_code' => $code, 'grant_type' => 'authorization_code', 'component_appid' => $this->component['config']['app_id'], 'component_access_token' => $this->component['access_token']->getToken()['component_access_token'], ]; return $this->httpGet('sns/component/jscode2session', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Code/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Code; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * @param int $templateId * @param string $extJson * @param string $version * @param string $description * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function commit(int $templateId, string $extJson, string $version, string $description) { return $this->httpPostJson('wxa/commit', [ 'template_id' => $templateId, 'ext_json' => $extJson, 'user_version' => $version, 'user_desc' => $description, ]); } /** * @param string|null $path * * @return \EasyWeChat\Kernel\Http\Response * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getQrCode(string $path = null) { return $this->requestRaw('wxa/get_qrcode', 'GET', [ 'query' => ['path' => $path], ]); } /** * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getCategory() { return $this->httpGet('wxa/get_category'); } /** * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getPage() { return $this->httpGet('wxa/get_page'); } /** * @param array $data * @param string|null $feedbackInfo * @param string|null $feedbackStuff * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function submitAudit(array $data, string $feedbackInfo = null, string $feedbackStuff = null) { if (isset($data['item_list'])) { return $this->httpPostJson('wxa/submit_audit', $data); } return $this->httpPostJson('wxa/submit_audit', [ 'item_list' => $data, 'feedback_info' => $feedbackInfo, 'feedback_stuff' => $feedbackStuff, ]); } /** * @param int $auditId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getAuditStatus(int $auditId) { return $this->httpPostJson('wxa/get_auditstatus', [ 'auditid' => $auditId, ]); } /** * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getLatestAuditStatus() { return $this->httpGet('wxa/get_latest_auditstatus'); } /** * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function release() { return $this->httpPostJson('wxa/release'); } /** * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function withdrawAudit() { return $this->httpGet('wxa/undocodeaudit'); } /** * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function rollbackRelease() { return $this->httpGet('wxa/revertcoderelease'); } /** * @param string $action * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function changeVisitStatus(string $action) { return $this->httpPostJson('wxa/change_visitstatus', [ 'action' => $action, ]); } /** * 分阶段发布. * * @param int $grayPercentage * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function grayRelease(int $grayPercentage) { return $this->httpPostJson('wxa/grayrelease', [ 'gray_percentage' => $grayPercentage, ]); } /** * 取消分阶段发布. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function revertGrayRelease() { return $this->httpGet('wxa/revertgrayrelease'); } /** * 查询当前分阶段发布详情. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getGrayRelease() { return $this->httpGet('wxa/getgrayreleaseplan'); } /** * 查询当前设置的最低基础库版本及各版本用户占比. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getSupportVersion() { return $this->httpPostJson('cgi-bin/wxopen/getweappsupportversion'); } /** * 设置最低基础库版本. * * @param string $version * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setSupportVersion(string $version) { return $this->httpPostJson('cgi-bin/wxopen/setweappsupportversion', [ 'version' => $version, ]); } /** * 查询服务商的当月提审限额(quota)和加急次数. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function queryQuota() { return $this->httpGet('wxa/queryquota'); } /** * 加急审核申请. * * @param int $auditId 审核单ID * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function speedupAudit(int $auditId) { return $this->httpPostJson('wxa/speedupaudit', [ 'auditid' => $auditId, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Code/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Code; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['code'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Domain/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Domain; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function modify(array $params) { return $this->httpPostJson('wxa/modify_domain', $params); } /** * 设置小程序业务域名. * * @param array $domains * @param string $action * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setWebviewDomain(array $domains, $action = 'add') { return $this->httpPostJson('wxa/setwebviewdomain', [ 'action' => $action, 'webviewdomain' => $domains, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Domain/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Domain; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['domain'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Material/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Material; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Http\StreamResponse; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * Allow media type. * * @var array */ protected $allowTypes = ['image', 'voice', 'video', 'thumb', 'news_image']; /** * Fetch material. * * @param string $mediaId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $mediaId) { $response = $this->requestRaw('cgi-bin/material/get_material', 'POST', ['json' => ['media_id' => $mediaId]]); if (false !== stripos($response->getHeaderLine('Content-disposition'), 'attachment')) { return StreamResponse::buildFromPsrResponse($response); } return $this->castResponseToType($response, $this->app['config']->get('response_type')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Material/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * ServiceProvider.php. * * This file is part of the wechat. * * (c) overtrue * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Material; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['material'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Privacy/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Privacy; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class Client. * * @author lujunyi */ class Client extends BaseClient { /** * 查询小程序用户隐私保护指引. */ public function get() { return $this->httpPostJson('cgi-bin/component/getprivacysetting', []); } /** * 配置小程序用户隐私保护指引 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function set(array $params) { return $this->httpPostJson('cgi-bin/component/setprivacysetting', $params); } /** * 上传小程序用户隐私保护指引 * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\MicroMerchant\Kernel\Exceptions\InvalidSignException */ public function upload(string $path) { if (!file_exists($path) || !is_readable($path)) { throw new InvalidArgumentException(sprintf("File does not exist, or the file is unreadable: '%s'", $path)); } return $this->httpUpload('cgi-bin/component/uploadprivacyextfile', ['file' => $path]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Privacy/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Privacy; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['privacy'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Security/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Security; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author lujunyi */ class Client extends BaseClient { /** * 获取隐私接口列表. */ public function get() { return $this->httpGet('wxa/security/get_privacy_interface'); } /** * 申请隐私接口 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function set(array $params) { return $this->httpPostJson('wxa/security/apply_privacy_interface', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Security/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Security; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['security'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Setting/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Setting; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author ClouderSky */ class Client extends BaseClient { /** * 获取账号可以设置的所有类目. */ public function getAllCategories() { return $this->httpPostJson('cgi-bin/wxopen/getallcategories'); } /** * 添加类目. * * @param array $categories 类目数组 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addCategories(array $categories) { $params = ['categories' => $categories]; return $this->httpPostJson('cgi-bin/wxopen/addcategory', $params); } /** * 删除类目. * * @param int $firstId 一级类目ID * @param int $secondId 二级类目ID * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deleteCategories(int $firstId, int $secondId) { $params = ['first' => $firstId, 'second' => $secondId]; return $this->httpPostJson('cgi-bin/wxopen/deletecategory', $params); } /** * 获取账号已经设置的所有类目. */ public function getCategories() { return $this->httpPostJson('cgi-bin/wxopen/getcategory'); } /** * 修改类目. * * @param array $category 单个类目 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateCategory(array $category) { return $this->httpPostJson('cgi-bin/wxopen/modifycategory', $category); } /** * 小程序名称设置及改名. * * @param string $nickname 昵称 * @param string $idCardMediaId 身份证照片素材ID * @param string $licenseMediaId 组织机构代码证或营业执照素材ID * @param array $otherStuffs 其他证明材料素材ID * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setNickname( string $nickname, string $idCardMediaId = '', string $licenseMediaId = '', array $otherStuffs = [] ) { $params = [ 'nick_name' => $nickname, 'id_card' => $idCardMediaId, 'license' => $licenseMediaId, ]; for ($i = \count($otherStuffs) - 1; $i >= 0; --$i) { $params['naming_other_stuff_'.($i + 1)] = $otherStuffs[$i]; } return $this->httpPostJson('wxa/setnickname', $params); } /** * 小程序改名审核状态查询. * * @param int $auditId 审核单id * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getNicknameAuditStatus($auditId) { $params = ['audit_id' => $auditId]; return $this->httpPostJson('wxa/api_wxa_querynickname', $params); } /** * 微信认证名称检测. * * @param string $nickname 名称(昵称) * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function isAvailableNickname($nickname) { $params = ['nick_name' => $nickname]; return $this->httpPostJson( 'cgi-bin/wxverify/checkwxverifynickname', $params ); } /** * 查询小程序是否可被搜索. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getSearchStatus() { return $this->httpGet('wxa/getwxasearchstatus'); } /** * 设置小程序可被搜素. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setSearchable() { return $this->httpPostJson('wxa/changewxasearchstatus', [ 'status' => 0, ]); } /** * 设置小程序不可被搜素. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setUnsearchable() { return $this->httpPostJson('wxa/changewxasearchstatus', [ 'status' => 1, ]); } /** * 获取展示的公众号信息. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getDisplayedOfficialAccount() { return $this->httpGet('wxa/getshowwxaitem'); } /** * 设置展示的公众号. * * @param string|bool $appid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setDisplayedOfficialAccount($appid) { return $this->httpPostJson('wxa/updateshowwxaitem', [ 'appid' => $appid ?: null, 'wxa_subscribe_biz_flag' => $appid ? 1 : 0, ]); } /** * 获取可以用来设置的公众号列表. * * @param int $page * @param int $num * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getDisplayableOfficialAccounts(int $page, int $num) { return $this->httpGet('wxa/getwxamplinkforshow', [ 'page' => $page, 'num' => $num, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Setting/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Setting; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['setting'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Tester/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Tester; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author caikeal */ class Client extends BaseClient { /** * 绑定小程序体验者. * * @param string $wechatId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function bind(string $wechatId) { return $this->httpPostJson('wxa/bind_tester', [ 'wechatid' => $wechatId, ]); } /** * 解绑小程序体验者. * * @param string $wechatId * @param string $userStr * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function unbind(string $wechatId = null, string $userStr = null) { return $this->httpPostJson('wxa/unbind_tester', [ ($userStr ? 'userstr' : 'wechatid') => $userStr ?? $wechatId, ]); } public function unbindWithUserStr(string $userStr) { return $this->httpPostJson('wxa/unbind_tester', [ 'userstr' => $userStr, ]); } /** * 获取体验者列表. * * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list() { return $this->httpPostJson('wxa/memberauth', [ 'action' => 'get_experiencer', ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/MiniProgram/Tester/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Tester; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['tester'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/OfficialAccount/Account/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\OfficialAccount\Account; use EasyWeChat\Kernel\ServiceContainer; use EasyWeChat\OpenPlatform\Application; use EasyWeChat\OpenPlatform\Authorizer\Aggregate\Account\Client as BaseClient; /** * Class Client. * * @author Keal */ class Client extends BaseClient { /** * @var \EasyWeChat\OpenPlatform\Application */ protected $component; /** * Client constructor. * * @param \EasyWeChat\Kernel\ServiceContainer $app * @param \EasyWeChat\OpenPlatform\Application $component */ public function __construct(ServiceContainer $app, Application $component) { parent::__construct($app); $this->component = $component; } /** * 从第三方平台跳转至微信公众平台授权注册页面, 授权注册小程序. * * @param string $callbackUrl * @param bool $copyWxVerify * * @return string */ public function getFastRegistrationUrl(string $callbackUrl, bool $copyWxVerify = true): string { $queries = [ 'copy_wx_verify' => $copyWxVerify, 'component_appid' => $this->component['config']['app_id'], 'appid' => $this->app['config']['app_id'], 'redirect_uri' => $callbackUrl, ]; return 'https://mp.weixin.qq.com/cgi-bin/fastregisterauth?'.http_build_query($queries); } /** * 小程序快速注册. * * @param string $ticket * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function register(string $ticket) { $params = [ 'ticket' => $ticket, ]; return $this->httpPostJson('cgi-bin/account/fastregister', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/OfficialAccount/Application.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\OfficialAccount; use EasyWeChat\OfficialAccount\Application as OfficialAccount; use EasyWeChat\OpenPlatform\Authorizer\Aggregate\AggregateServiceProvider; /** * Class Application. * * @author mingyoung * * @property \EasyWeChat\OpenPlatform\Authorizer\OfficialAccount\Account\Client $account * @property \EasyWeChat\OpenPlatform\Authorizer\OfficialAccount\MiniProgram\Client $mini_program */ class Application extends OfficialAccount { /** * Application constructor. * * @param array $config * @param array $prepends */ public function __construct(array $config = [], array $prepends = []) { parent::__construct($config, $prepends); $providers = [ AggregateServiceProvider::class, MiniProgram\ServiceProvider::class, ]; foreach ($providers as $provider) { $this->register(new $provider()); } } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/OfficialAccount/MiniProgram/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\OfficialAccount\MiniProgram; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author Keal */ class Client extends BaseClient { /** * 获取公众号关联的小程序. * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list() { return $this->httpPostJson('cgi-bin/wxopen/wxamplinkget'); } /** * 关联小程序. * * @param string $appId * @param bool $notifyUsers * @param bool $showProfile * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function link(string $appId, bool $notifyUsers = true, bool $showProfile = false) { $params = [ 'appid' => $appId, 'notify_users' => (string) $notifyUsers, 'show_profile' => (string) $showProfile, ]; return $this->httpPostJson('cgi-bin/wxopen/wxamplink', $params); } /** * 解除已关联的小程序. * * @param string $appId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function unlink(string $appId) { $params = [ 'appid' => $appId, ]; return $this->httpPostJson('cgi-bin/wxopen/wxampunlink', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/OfficialAccount/MiniProgram/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\OfficialAccount\MiniProgram; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['mini_program'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Authorizer/Server/Guard.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Authorizer\Server; use EasyWeChat\Kernel\ServerGuard; /** * Class Guard. * * @author mingyoung */ class Guard extends ServerGuard { /** * Get token from OpenPlatform encryptor. * * @return string */ protected function getToken() { return $this->app['encryptor']->getToken(); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Base/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Base; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Get authorization info. * * @param string|null $authCode * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function handleAuthorize(string $authCode = null) { $params = [ 'component_appid' => $this->app['config']['app_id'], 'authorization_code' => $authCode ?? $this->app['request']->get('auth_code'), ]; return $this->httpPostJson('cgi-bin/component/api_query_auth', $params); } /** * Get authorizer info. * * @param string $appId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getAuthorizer(string $appId) { $params = [ 'component_appid' => $this->app['config']['app_id'], 'authorizer_appid' => $appId, ]; return $this->httpPostJson('cgi-bin/component/api_get_authorizer_info', $params); } /** * Get options. * * @param string $appId * @param string $name * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getAuthorizerOption(string $appId, string $name) { $params = [ 'component_appid' => $this->app['config']['app_id'], 'authorizer_appid' => $appId, 'option_name' => $name, ]; return $this->httpPostJson('cgi-bin/component/api_get_authorizer_option', $params); } /** * Set authorizer option. * * @param string $appId * @param string $name * @param string $value * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setAuthorizerOption(string $appId, string $name, string $value) { $params = [ 'component_appid' => $this->app['config']['app_id'], 'authorizer_appid' => $appId, 'option_name' => $name, 'option_value' => $value, ]; return $this->httpPostJson('cgi-bin/component/api_set_authorizer_option', $params); } /** * Get authorizer list. * * @param int $offset * @param int $count * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getAuthorizers($offset = 0, $count = 500) { $params = [ 'component_appid' => $this->app['config']['app_id'], 'offset' => $offset, 'count' => $count, ]; return $this->httpPostJson('cgi-bin/component/api_get_authorizer_list', $params); } /** * Create pre-authorization code. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createPreAuthorizationCode() { $params = [ 'component_appid' => $this->app['config']['app_id'], ]; return $this->httpPostJson('cgi-bin/component/api_create_preauthcode', $params); } /** * OpenPlatform Clear quota. * * @see https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318587 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function clearQuota() { $params = [ 'component_appid' => $this->app['config']['app_id'], ]; return $this->httpPostJson('cgi-bin/component/clear_quota', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Base/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Base; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['base'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/CodeTemplate/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\CodeTemplate; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author caikeal */ class Client extends BaseClient { /** * 获取草稿箱内的所有临时代码草稿 * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getDrafts() { return $this->httpGet('wxa/gettemplatedraftlist'); } /** * 将草稿箱的草稿选为小程序代码模版. * * @param int $draftId * @param int $templateType * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createFromDraft(int $draftId, int $templateType = 0) { $params = [ 'draft_id' => $draftId, 'template_type' => $templateType, ]; return $this->httpPostJson('wxa/addtotemplate', $params); } /** * 获取代码模版库中的所有小程序代码模版. * * @param int $templateType * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(int $templateType = null) { $params = [ 'template_type' => $templateType, ]; return $this->httpGet('wxa/gettemplatelist', $params); } /** * 删除指定小程序代码模版. * * @param string $templateId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete($templateId) { $params = [ 'template_id' => $templateId, ]; return $this->httpPostJson('wxa/deletetemplate', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/CodeTemplate/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\CodeTemplate; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['code_template'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Component/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Component; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author dudashuang */ class Client extends BaseClient { /** * 通过法人微信快速创建小程序. * * @param array $params * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function registerMiniProgram(array $params) { return $this->httpPostJson('cgi-bin/component/fastregisterweapp', $params, ['action' => 'create']); } /** * 查询创建任务状态. * * @param string $companyName * @param string $legalPersonaWechat * @param string $legalPersonaName * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getRegistrationStatus(string $companyName, string $legalPersonaWechat, string $legalPersonaName) { $params = [ 'name' => $companyName, 'legal_persona_wechat' => $legalPersonaWechat, 'legal_persona_name' => $legalPersonaName, ]; return $this->httpPostJson('cgi-bin/component/fastregisterweapp', $params, ['action' => 'search']); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Component/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Component; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['component'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/Guard.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Server; use EasyWeChat\Kernel\ServerGuard; use EasyWeChat\OpenPlatform\Server\Handlers\Authorized; use EasyWeChat\OpenPlatform\Server\Handlers\Unauthorized; use EasyWeChat\OpenPlatform\Server\Handlers\UpdateAuthorized; use EasyWeChat\OpenPlatform\Server\Handlers\VerifyTicketRefreshed; use Symfony\Component\HttpFoundation\Response; use function EasyWeChat\Kernel\data_get; /** * Class Guard. * * @author mingyoung */ class Guard extends ServerGuard { public const EVENT_AUTHORIZED = 'authorized'; public const EVENT_UNAUTHORIZED = 'unauthorized'; public const EVENT_UPDATE_AUTHORIZED = 'updateauthorized'; public const EVENT_COMPONENT_VERIFY_TICKET = 'component_verify_ticket'; public const EVENT_THIRD_FAST_REGISTERED = 'notify_third_fasteregister'; /** * @return \Symfony\Component\HttpFoundation\Response * * @throws \EasyWeChat\Kernel\Exceptions\BadRequestException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ protected function resolve(): Response { $this->registerHandlers(); $message = $this->getMessage(); if ($infoType = data_get($message, 'InfoType')) { $this->dispatch($infoType, $message); } return new Response(static::SUCCESS_EMPTY_RESPONSE); } /** * Register event handlers. */ protected function registerHandlers() { $this->on(self::EVENT_AUTHORIZED, Authorized::class); $this->on(self::EVENT_UNAUTHORIZED, Unauthorized::class); $this->on(self::EVENT_UPDATE_AUTHORIZED, UpdateAuthorized::class); $this->on(self::EVENT_COMPONENT_VERIFY_TICKET, VerifyTicketRefreshed::class); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/Handlers/Authorized.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Server\Handlers; use EasyWeChat\Kernel\Contracts\EventHandlerInterface; /** * Class Authorized. * * @author mingyoung */ class Authorized implements EventHandlerInterface { /** * {@inheritdoc}. */ public function handle($payload = null) { // Do nothing for the time being. } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/Handlers/Unauthorized.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Server\Handlers; use EasyWeChat\Kernel\Contracts\EventHandlerInterface; /** * Class Unauthorized. * * @author mingyoung */ class Unauthorized implements EventHandlerInterface { /** * {@inheritdoc}. */ public function handle($payload = null) { // Do nothing for the time being. } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/Handlers/UpdateAuthorized.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Server\Handlers; use EasyWeChat\Kernel\Contracts\EventHandlerInterface; /** * Class UpdateAuthorized. * * @author mingyoung */ class UpdateAuthorized implements EventHandlerInterface { /** * {@inheritdoc} */ public function handle($payload = null) { // Do nothing for the time being. } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/Handlers/VerifyTicketRefreshed.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Server\Handlers; use EasyWeChat\Kernel\Contracts\EventHandlerInterface; use EasyWeChat\Kernel\Traits\ResponseCastable; use EasyWeChat\OpenPlatform\Application; use function EasyWeChat\Kernel\data_get; /** * Class VerifyTicketRefreshed. * * @author mingyoung */ class VerifyTicketRefreshed implements EventHandlerInterface { use ResponseCastable; /** * @var \EasyWeChat\OpenPlatform\Application */ protected $app; /** * Constructor. * * @param \EasyWeChat\OpenPlatform\Application $app */ public function __construct(Application $app) { $this->app = $app; } /** * {@inheritdoc}. */ public function handle($payload = null) { $ticket = data_get($payload, 'ComponentVerifyTicket'); if (!empty($ticket)) { $this->app['verify_ticket']->setTicket($ticket); } } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenPlatform/Server/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenPlatform\Server; use EasyWeChat\Kernel\Encryptor; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['encryptor'] = function ($app) { return new Encryptor( $app['config']['app_id'], $app['config']['token'], $app['config']['aes_key'] ); }; $app['server'] = function ($app) { return new Guard($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Application.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork; use EasyWeChat\Kernel\ServiceContainer; use EasyWeChat\OpenWork\Work\Application as Work; /** * Application. * * @author xiaomin * * @property \EasyWeChat\OpenWork\Server\Guard $server * @property \EasyWeChat\OpenWork\Corp\Client $corp * @property \EasyWeChat\OpenWork\Provider\Client $provider * @property \EasyWeChat\OpenWork\SuiteAuth\AccessToken $suite_access_token * @property \EasyWeChat\OpenWork\Auth\AccessToken $provider_access_token * @property \EasyWeChat\OpenWork\SuiteAuth\SuiteTicket $suite_ticket * @property \EasyWeChat\OpenWork\MiniProgram\Client $mini_program * @property \EasyWeChat\OpenWork\Media\Client $media * @property \EasyWeChat\OpenWork\Contact\Client $contact * @property \EasyWeChat\OpenWork\License\Client $license_order * @property \EasyWeChat\OpenWork\License\Account $license_account * @property \EasyWeChat\OpenWork\Device\Client $device * @noinspection PhpFullyQualifiedNameUsageInspection */ class Application extends ServiceContainer { /** * @var array */ protected $providers = [ Auth\ServiceProvider::class, SuiteAuth\ServiceProvider::class, Server\ServiceProvider::class, Corp\ServiceProvider::class, Provider\ServiceProvider::class, MiniProgram\ServiceProvider::class, Media\ServiceProvider::class, Contact\ServiceProvider::class, License\ServiceProvider::class, Device\ServiceProvider::class, ]; /** * @var array */ protected $defaultConfig = [ // http://docs.guzzlephp.org/en/stable/request-options.html 'http' => [ 'base_uri' => 'https://qyapi.weixin.qq.com/', ], ]; /** * Creates the miniProgram application. * * @return \EasyWeChat\Work\MiniProgram\Application */ public function miniProgram(): \EasyWeChat\Work\MiniProgram\Application { return new \EasyWeChat\Work\MiniProgram\Application($this->getConfig()); } /** * @param string $authCorpId 企业 corp_id * @param string $permanentCode 企业永久授权码 * * @return Work */ public function work(string $authCorpId, string $permanentCode): Work { return new Work($authCorpId, $permanentCode, $this); } /** * @param string $method * @param array $arguments * * @return mixed */ public function __call($method, $arguments) { return $this['base']->$method(...$arguments); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Auth/AccessToken.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Auth; use EasyWeChat\Kernel\AccessToken as BaseAccessToken; /** * AccessToken. * * @author xiaomin */ class AccessToken extends BaseAccessToken { protected $requestMethod = 'POST'; /** * @var string */ protected $endpointToGetToken = 'cgi-bin/service/get_provider_token'; /** * @var string */ protected $tokenKey = 'provider_access_token'; /** * @var string */ protected $cachePrefix = 'easywechat.kernel.provider_access_token.'; /** * Credential for get token. * * @return array */ protected function getCredentials(): array { return [ 'corpid' => $this->app['config']['corp_id'], //服务商的corpid 'provider_secret' => $this->app['config']['secret'], ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Auth/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Auth; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. * * @author xiaomin */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { isset($app['provider_access_token']) || $app['provider_access_token'] = function ($app) { return new AccessToken($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Contact/Client.php ================================================ */ class Client extends BaseClient { public function __construct(ServiceContainer $app) { parent::__construct($app, $app['provider_access_token']); } /** * 异步通讯录id转译 * * @param string $authCorpId 授权企业corp_id * @param array $mediaIdList 需要转译的文件的media_id列表,只支持后缀名为xls/xlsx,doc/docx,csv,txt的文件。 * 不超过20个文件,获取方式使用{@see \EasyWeChat\OpenWork\Media\Client::uploadFile() 上传需要转译的文件} * * @param string|null $outputFileName 转译完打包的文件名,不需带后缀。企业微信后台会打包成zip压缩文件,并自动拼接上.zip后缀。 * 若media_id_list中文件个数大于1,则该字段必填。若media_id_list中文件个数等于1,且未填该字段,则转译完不打包成压缩文件。支持id转译 * * @param string|null $outputFileFormat 若不指定,则输出格式跟输入格式相同。若要转换输出格式,当前仅支持输出文件为pdf格式。 * 若$mediaIdList中文件存在相同前缀名的文件,则输出文件命名规则为:文件前缀名_ 文件格式后缀.pdf,例如:20200901_ xlsx.pdf * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function idTranslate(string $authCorpId, array $mediaIdList, string $outputFileName = null, string $outputFileFormat = null) { /** @noinspection SpellCheckingInspection */ return $this->httpPostJson('cgi-bin/service/contact/id_translate', [ 'auth_corpid' => $authCorpId, 'media_id_list' => $mediaIdList, 'output_file_name' => $outputFileName, 'output_file_format' => $outputFileFormat ]); } /** * 获取异步任务结果 * * @param string $jobId 异步任务id,最大长度为64字节 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function getResult(string $jobId) { /** @noinspection SpellCheckingInspection */ return $this->httpGet('cgi-bin/service/batch/getresult', [ 'jobid' => $jobId ]); } /** * 通讯录userid排序 * * @param string $authCorpId 查询的企业corp_id * @param array $userIdList 要排序的user_id列表,最多支持1000个 * @param int $sortType 排序方式 0:根据姓名拼音升序排列,返回用户userid列表 1:根据姓名拼音降序排列,返回用户userid列表 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function sort(string $authCorpId, array $userIdList, int $sortType = 0) { /** @noinspection SpellCheckingInspection */ return $this->httpPostJson('cgi-bin/service/contact/sort', [ 'auth_corpid' => $authCorpId, 'sort_type' => $sortType, 'useridlist' => $userIdList ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Contact/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Contact; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. * * @author moniang */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { !isset($app['contact']) && $app['contact'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Corp/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Corp; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\ServiceContainer; /** * Client. * * @author xiaomin */ class Client extends BaseClient { /** * Client constructor. * 三方接口有三个access_token,这里用的是suite_access_token. * * @param ServiceContainer $app */ public function __construct(ServiceContainer $app) { parent::__construct($app, $app['suite_access_token']); } /** * 企业微信安装应用授权 url. * * @param string $preAuthCode 预授权码 * @param string $redirectUri 回调地址 * @param string $state * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Exception */ public function getPreAuthorizationUrl(string $preAuthCode = '', string $redirectUri = '', string $state = '') { $redirectUri || $redirectUri = $this->app->config['redirect_uri_install']; $preAuthCode || $preAuthCode = $this->getPreAuthCode()['pre_auth_code']; $state || $state = random_bytes(64); $params = [ 'suite_id' => $this->app['config']['suite_id'], 'redirect_uri' => $redirectUri, 'pre_auth_code' => $preAuthCode, 'state' => $state, ]; return 'https://open.work.weixin.qq.com/3rdapp/install?' . http_build_query($params); } /** * 获取预授权码. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getPreAuthCode() { return $this->httpGet('cgi-bin/service/get_pre_auth_code'); } /** * 设置授权配置. * 该接口可对某次授权进行配置. * * @param string $preAuthCode * @param array $sessionInfo * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setSession(string $preAuthCode, array $sessionInfo) { $params = [ 'pre_auth_code' => $preAuthCode, 'session_info' => $sessionInfo, ]; return $this->httpPostJson('cgi-bin/service/set_session_info', $params); } /** * 获取企业永久授权码. * * @param string $authCode 临时授权码,会在授权成功时附加在redirect_uri中跳转回第三方服务商网站,或通过回调推送给服务商。长度为64至512个字节 * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getPermanentByCode(string $authCode) { $params = [ 'auth_code' => $authCode, ]; return $this->httpPostJson('cgi-bin/service/get_permanent_code', $params); } /** * 获取企业授权信息. * * @param string $authCorpId * @param string $permanentCode * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getAuthorization(string $authCorpId, string $permanentCode) { $params = [ 'auth_corpid' => $authCorpId, 'permanent_code' => $permanentCode, ]; return $this->httpPostJson('cgi-bin/service/get_auth_info', $params); } /** * 获取应用的管理员列表. * * @param string $authCorpId * @param string $agentId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getManagers(string $authCorpId, string $agentId) { $params = [ 'auth_corpid' => $authCorpId, 'agentid' => $agentId, ]; return $this->httpPostJson('cgi-bin/service/get_admin_list', $params); } /** * 获取登录url. * * @param string $redirectUri * @param string $scope * @param string|null $state * * @return string * @throws \Exception */ public function getOAuthRedirectUrl(string $redirectUri = '', string $scope = 'snsapi_userinfo', string $state = null) { $redirectUri || $redirectUri = $this->app->config['redirect_uri_oauth']; $state || $state = random_bytes(64); $params = [ 'appid' => $this->app['config']['suite_id'], 'redirect_uri' => $redirectUri, 'response_type' => 'code', 'scope' => $scope, 'state' => $state, ]; return 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query($params) . '#wechat_redirect'; } /** * 第三方根据code获取企业成员信息. * * @param string $code * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUserByCode(string $code) { $params = [ 'code' => $code, ]; return $this->httpGet('cgi-bin/service/getuserinfo3rd', $params); } /** * 第三方使用user_ticket获取成员详情. * * @param string $userTicket * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUserByTicket(string $userTicket) { $params = [ 'user_ticket' => $userTicket, ]; return $this->httpPostJson('cgi-bin/service/getuserdetail3rd', $params); } /** * 第三方根据unionid查询external_userid * * @param string $unionid 微信用户的unionid * @param string $openid 微信用户的openid * @param string $corpid 需要换取的企业corpid,不填则拉取所有企业 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @author SinyLi */ public function unionidToExternalUserid(string $unionid, string $openid, string $corpid = '') { $params = [ 'unionid' => $unionid, 'openid' => $openid, 'corpid' => $corpid ]; return $this->httpPostJson('cgi-bin/service/externalcontact/unionid_to_external_userid_3rd', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Corp/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Corp; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. * * @author xiaomin */ class ServiceProvider implements ServiceProviderInterface { /** * Registers services on the given container. * * This method should only be used to configure services and parameters. * It should not get services. * * @param \Pimple\Container $app */ public function register(Container $app) { isset($app['corp']) || $app['corp'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Device/Client.php ================================================ */ class Client extends BaseClient { public function __construct(ServiceContainer $app) { parent::__construct($app, $app['provider_access_token']); } /** * 添加设备实例 * * 该API用于添加一个设备的实例 * * @param string $modelId 设备的型号id,在服务商管理端添加设备型号之后,可以查看型号id * @param string $deviceSn 硬件序列号,只能包含数字和大小写字母,长度最大为128字节,不可与之前已导入的相同 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function add(string $modelId, string $deviceSn) { return $this->httpPostJson('cgi-bin/service/add_device', [ 'model_id' => $modelId, 'device_sn' => $deviceSn ]); } /** * 查询设备绑定信息 * * 该API用于查询设备绑定的企业信息 * * @param string $deviceSn 硬件序列号,只能包含数字和大小写字母,长度最大为128字节 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function get(string $deviceSn) { return $this->httpPostJson('cgi-bin/service/get_device_auth_info', [ 'device_sn' => $deviceSn ]); } /** * 重置设备SecretNo * * 该API用于重置所有类型设备的SecretNo,主要针对同一批次生成相同secretNo(seedSecretNo)的设备, * 可将SecretNo的状态转换为未设置状态,使设备可以重新调用get_secret_no获取新的sercretNo, * 如果对存量设备调用此接口,那么设备固件必须支持通过seed_secret_no获取secretNo。 * * @param string $deviceSn 硬件序列号,只能包含数字和大小写字母,长度最大为128字节 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function reset(string $deviceSn) { return $this->httpPostJson('cgi-bin/service/reset_secret_no', [ 'device_sn' => $deviceSn ]); } /** * 获取设备列表 * * 硬件服务商可以通过本接口获取已登记的设备信息 * * @param int $offset 用于分页拉取数据,表示偏移量 * @param int $limit 用于分页拉取数据,表示请求的数据条数 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function list(int $offset, int $limit) { return $this->httpPostJson('cgi-bin/service/list_device', [ 'offset' => $offset, 'limit' => $limit ]); } /** * 上传设备日志 * * 该API用于异步拉取某个设备的日志文件 * * @param string $deviceSn 硬件序列号,只能包含数字和大小写字母,长度最大为128字节 * @param string $hint 提示参数,企业微信后台会将此参数透传给设备,设备可根据此参数来决定要上传哪部分日志,服务商可根据实际业务需求来使用此参数,最长为128字节 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function uploadLog(string $deviceSn, string $hint) { return $this->httpPostJson('cgi-bin/service/fetch_device_log', [ 'device_sn' => $deviceSn, 'hint' => $hint ]); } /** * 获取设备自定义参数 * * @param string $deviceSn 硬件序列号,只能包含数字和大小写字母,长度最大为128字节 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function getFeature(string $deviceSn) { return $this->httpPostJson('cgi-bin/hardware/get_device_feature', [ 'device_sn' => $deviceSn ]); } /** * 删除设备实例 * * 该API用于删除一个设备的实例 * * @param string $deviceSn 硬件序列号,只能包含数字和大小写字母,长度最大为128字节 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function delete(string $deviceSn) { return $this->httpPostJson('cgi-bin/service/del_device', [ 'device_sn' => $deviceSn ]); } /** * 设置打印机支持状态 * * 该API用于设置打印盒子是否支持打印机的信息 * * @param string $deviceSn 硬件序列号,只能包含数字和大小写字母,长度最大为128字节 * @param bool $supported 是否支持打印机 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function setPrinterSupportState(string $deviceSn, bool $supported) { return $this->httpPostJson('cgi-bin/service/del_device', [ 'device_sn' => $deviceSn, 'not_supported_printer' => (int)!$supported ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Device/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Device; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. * * @author moniang */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { !isset($app['device']) && $app['device'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/License/Account.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\License; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\ServiceContainer; /** * License Account Client * * @author moniang */ class Account extends BaseClient { public function __construct(ServiceContainer $app) { parent::__construct($app, $app['provider_access_token']); } /** * 激活帐号 * * >下单购买帐号并支付完成之后,先调用{@see Client::getAccountList() 获取订单中的帐号列表}接口获取到帐号激活码, * 然后可以调用该接口将激活码绑定到某个企业员工,以对其激活相应的平台服务能力。 * * **一个userid允许激活一个基础帐号以及一个互通帐号。** * * @param string $activeCode 帐号激活码 * @param string $corpId 待绑定激活的成员所属企业corpId,只支持加密的corpId * @param string $userId 待绑定激活的企业成员userId 。只支持加密的userId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection * @noinspection SpellCheckingInspection */ public function active(string $activeCode, string $corpId, string $userId) { return $this->httpPostJson('cgi-bin/license/active_account', [ 'active_code' => $activeCode, 'corpid' => $corpId, 'userid' => $userId ]); } /** * 批量激活帐号 * * >可在一次请求里为一个企业的多个成员激活许可帐号,便于服务商批量化处理。 * * **一个userid允许激活一个基础帐号以及一个互通帐号。单次激活的员工数量不超过1000** * * @param string $corpId 待绑定激活的成员所属企业corpid,只支持加密的corpid * @param array $activeList 需要激活的帐号列表,每个数组包含active_code帐号激活码和userid待绑定激活的企业成员加密userid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection * @noinspection SpellCheckingInspection */ public function batchActive(string $corpId, array $activeList) { return $this->httpPostJson('cgi-bin/license/batch_active_account', [ 'corpid' => $corpId, 'active_list' => $activeList ]); } /** * 获取激活码详情 * * >查询某个帐号激活码的状态以及激活绑定情况。 * * @param string $corpId * @param string $activeCode * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection * @noinspection SpellCheckingInspection */ public function getActiveCodeInfo(string $corpId, string $activeCode) { return $this->httpPostJson('cgi-bin/license/get_active_info_by_code', [ 'corpid' => $corpId, 'active_code' => $activeCode ]); } /** * 批量获取激活码详情 * * >批量查询帐号激活码的状态以及激活绑定情况。 * * @param string $corpId 要查询的企业的corpid,只支持加密的corpid * @param string[] $activeCodeList 激活码列表,最多不超过1000个 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection * @noinspection SpellCheckingInspection */ public function batchGetActiveCodeInfo(string $corpId, array $activeCodeList) { return $this->httpPostJson('cgi-bin/license/batch_get_active_info_by_code', [ 'corpid' => $corpId, 'active_code_list' => $activeCodeList ]); } /** * 获取企业的帐号列表 * * >查询指定企业下的平台能力服务帐号列表。 * * @param string $corpId 企业corpId ,只支持加密的corpId * @param string|null $cursor 返回的最大记录数,整型,最大值1000,默认值500 * @param int $limit 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用可不填 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection * @noinspection SpellCheckingInspection */ public function list(string $corpId, ?string $cursor = null, int $limit = 500) { return $this->httpPostJson('cgi-bin/license/list_actived_account', [ 'corpid' => $corpId, 'limit' => $limit, 'cursor' => $cursor ]); } /** * 获取成员的激活详情 * * >查询某个企业成员的激活情况。 * * @param string $corpId 企业corpId ,只支持加密的corpId * @param string $userId 待查询员工的userid,只支持加密的userid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection * @noinspection SpellCheckingInspection */ public function getActiveAccountInfo(string $corpId, string $userId) { return $this->httpPostJson('cgi-bin/license/get_active_info_by_user', [ 'corpid' => $corpId, 'userid' => $userId ]); } /** * 帐号继承 * * >在企业员工离职或者工作范围的有变更时,允许将其许可帐号继承给其他员工。 * * **调用限制:** * - 转移成员和接收成员属于同一个企业 * - 转移成员的帐号已激活,且在有效期 * - 转移许可的成员为离职成员时,不限制下次转接的时间间隔 * - 转移许可的成员为在职成员时,转接后30天后才可进行下次转接 * - 接收成员许可不能与转移成员的许可重叠(同时拥有基础帐号或者互通帐号) * - 单次转移的帐号数限制在1000以内 * * @param string $corpId 待绑定激活的成员所属企业corpId,只支持加密的corpId * @param array $transferList 待转移成员列表,每个数组包含handover_userid转移成员的userid和takeover_userid接收成员的userid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection * @noinspection SpellCheckingInspection */ public function batchTransfer(string $corpId, array $transferList) { return $this->httpPostJson('cgi-bin/license/batch_transfer_license', [ 'corpid' => $corpId, 'transfer_list' => $transferList ]); } /** * 分配激活码给下游企业 * * >服务商可调用该接口将为上游企业购买的激活码分配给下游企业使用。 * * @param string $fromCorpid 上游企业corpid。支持明文或者密文的corpid * @param string $toCorpid 下游企业corpid。支持明文或者密文的corpid * @param array $activeCode 分享的接口许可激活码。单次分享激活码不可超过1000个,累计分享给同一下游企业的激活码总数不可超过上下游通讯录中该下游企业人数的2倍 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection * @noinspection SpellCheckingInspection */ public function share(string $fromCorpid, string $toCorpid, array $activeCode) { return $this->httpPostJson('cgi-bin/license/batch_share_active_code', [ 'from_corpid' => $fromCorpid, 'to_corpid' => $toCorpid, 'share_list' => array_map(function ($code) { return [ 'active_code' => $code, ]; }, $activeCode), ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/License/App.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\License; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\ServiceContainer; /** * License App Client * * @author keller31 */ class App extends BaseClient { public function __construct(ServiceContainer $app) { parent::__construct($app, $app['provider_access_token']); } /** * 获取应用的接口许可状态 * 服务商可获取某个授权企业的应用接口许可试用期,免费试用期为企业首次安装应用后的90天。 * * @link https://developer.work.weixin.qq.com/document/path/95844 * * @param string $corpid 企业id * @param string $suite_id 套件id * @param string $appid 旧的多应用套件中的应用id,新开发者请忽略 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $corpid, string $suite_id, string $appid = '') { return $this->httpPostJson('cgi-bin/license/get_app_license_info', [ 'corpid' => $corpid, 'suite_id' => $suite_id, 'appid' => $appid ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/License/AutoActive.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\License; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\ServiceContainer; /** * License Client * * @author keller31 */ class AutoActive extends BaseClient { public function __construct(ServiceContainer $app) { parent::__construct($app, $app['provider_access_token']); } /** * 设置企业的许可自动激活状态 * 服务商可以调用该接口设置授权企业的许可自动激活状态。设置为自动激活后,对应授权企业的员工使用服务商应用时,接口许可表现为自动激活。 * * @link https://developer.work.weixin.qq.com/document/path/95873 * * @param string $corpid 企业ID * @param integer $status 许可自动激活状态。0:关闭,1:打开 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setStatus(string $corpid, int $status) { return $this->httpPostJson('cgi-bin/license/set_auto_active_status', [ 'corpid' => $corpid, 'auto_active_status' => $status ]); } /** * 查询企业的许可自动激活状态 * 服务商可以调用该接口查询授权企业的许可自动激活状态。 * * @link https://developer.work.weixin.qq.com/document/path/95874 * * @param string $corpid 企业ID * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getStatus(string $corpid) { return $this->httpPostJson('cgi-bin/license/get_auto_active_status', [ 'corpid' => $corpid ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/License/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\License; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\ServiceContainer; /** * Order Client * * @author moniang */ class Client extends BaseClient { public function __construct(ServiceContainer $app) { parent::__construct($app, $app['provider_access_token']); } /** * 下单购买帐号 * * 服务商下单为企业购买新的帐号,可以同时购买基础帐号与互通帐号。下单之后,需要到服务商管理端发起支付,支付完成之后,订单才能生效。 * * @param string $corpId 企业id,只支持加密的corpid * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection SpellCheckingInspection * @noinspection PhpFullyQualifiedNameUsageInspection */ public function create(string $corpId, array $data) { return $this->httpPostJson('cgi-bin/license/create_new_order', array_merge([ 'corpid' => $corpId ], $data)); } /** * 创建续期任务 * * 在同一个订单里,首次创建任务无须指定jobid,后续指定同一个jobid,表示往同一个订单任务追加续期的成员。 * * @param string $corpId 企业id,只支持加密的corpid * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection SpellCheckingInspection * @noinspection PhpFullyQualifiedNameUsageInspection */ public function renew(string $corpId, array $data) { return $this->httpPostJson('cgi-bin/license/create_renew_order_job', array_merge([ 'corpid' => $corpId ], $data)); } /** * 提交续期订单 * * 创建续期任务之后,需要调用该接口,以提交订单任务。注意,提交之后,需要到服务商管理端发起支付,支付完成之后,订单才能生效。 * * @param string $jobId 任务id * @param string $buyerUserId 下单人。服务商企业内成员userid。该userid必须登录过企业微信,并且企业微信已绑定微信 * @param int $accountDurationMonths 购买的月数,每个月按照31天计算。最多购买36个月。(若企业为服务商测试企业,每次续期只能续期1个月) * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection SpellCheckingInspection * @noinspection PhpFullyQualifiedNameUsageInspection */ public function submitJob(string $jobId, string $buyerUserId, int $accountDurationMonths) { return $this->httpPostJson('cgi-bin/license/submit_order_job', [ 'jobid' => $jobId, 'buyer_userid' => $buyerUserId, 'account_duration' => [ 'months' => $accountDurationMonths ] ]); } /** * 获取订单列表 * * 服务商查询自己某段时间内的平台能力服务订单列表 * * @param string $corpId 企业id,只支持加密的corpid。若指定corpid且corpid为服务商测试企业,则返回的订单列表为测试订单列表。否则只返回正式订单列表 * @param int|null $startTime 开始时间,下单时间。可不填。但是不能单独指定该字段,startTime跟endTime必须同时指定。 * @param int|null $endTime 结束时间,下单时间。起始时间跟结束时间不能超过31天。可不填。但是不能单独指定该字段,startTime跟endTime必须同时指定。 * @param string|null $cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用可不填 * @param int $limit 返回的最大记录数,整型,最大值1000,默认值500 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection SpellCheckingInspection * @noinspection PhpFullyQualifiedNameUsageInspection */ public function list(string $corpId, ?int $startTime = null, ?int $endTime = null, ?string $cursor = null, int $limit = 500) { return $this->httpPostJson('cgi-bin/license/list_order', [ 'corpid' => $corpId, 'start_time' => $startTime, 'end_time' => $endTime, 'cursor' => $cursor, 'limit' => $limit ]); } /** * 获取订单详情 * * 查询某个订单的详情,包括订单的状态、基础帐号个数、互通帐号个数、帐号购买时长等。 * 注意,该接口不返回订单中的帐号激活码列表或者续期的帐号成员列表,请调用{@see Client::getAccountList() 获取订单中的帐号列表}接口以获取帐号列表。 * * @param string $orderId 订单id * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection SpellCheckingInspection * @noinspection PhpFullyQualifiedNameUsageInspection */ public function get(string $orderId) { return $this->httpPostJson('cgi-bin/license/get_order', [ 'order_id' => $orderId ]); } /** * 获取订单中的帐号列表 * * 查询指定订单下的平台能力服务帐号列表。若为购买帐号的订单或者存量企业的版本付费迁移订单,则返回帐号激活码列表; * 若为续期帐号的订单,则返回续期帐号的成员列表。 * * 注意,若是购买帐号的订单,则仅订单支付完成时,系统才会生成帐号,故支付完成之前,该接口不会返回帐号激活码。 * * @param string $orderId 订单号 * @param string|null $cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用可不填 * @param int $limit 返回的最大记录数,整型,最大值1000,默认值500 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection SpellCheckingInspection * @noinspection PhpFullyQualifiedNameUsageInspection */ public function getAccountList(string $orderId, ?string $cursor = null, int $limit = 500) { return $this->httpPostJson('cgi-bin/license/list_order_account', [ 'order_id' => $orderId, 'limit' => $limit, 'cursor' => $cursor ]); } /** * 取消订单 * * 取消接口许可购买和续费订单,只可取消未支付且未失效的订单。 * * @param string $corpId 企业id,只支持加密的corpid * @param string $orderId 订单号 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection SpellCheckingInspection * @noinspection PhpFullyQualifiedNameUsageInspection */ public function cancel(string $corpId, string $orderId) { return $this->httpPostJson('cgi-bin/license/cancel_order', [ 'corpid' => $corpId, 'order_id' => $orderId, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/License/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\License; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. * * @author moniang */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { !isset($app['license_order']) && $app['license_order'] = function ($app) { return new Client($app); }; !isset($app['license_account']) && $app['license_account'] = function ($app) { return new Account($app); }; !isset($app['license_app']) && $app['license_app'] = function ($app) { return new App($app); }; !isset($app['license_auto_active']) && $app['license_auto_active'] = function ($app) { return new AutoActive($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Media/Client.php ================================================ */ class Client extends BaseClient { public function __construct(ServiceContainer $app) { parent::__construct($app, $app['provider_access_token']); } /** * 上传图片文件 * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function uploadImage(string $path) { return $this->upload('image', $path); } /** * 上传语音文件 * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function uploadVoice(string $path) { return $this->upload('voice', $path); } /** * 上传视频文件 * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function uploadVideo(string $path) { return $this->upload('video', $path); } /** * 上传普通文件 * * @param string $path * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function uploadFile(string $path) { return $this->upload('file', $path); } /** * 上传文件 * * @param string $type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) * @param string $path * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function upload(string $type, string $path) { $files = [ 'media' => $path, ]; return $this->httpUpload('cgi-bin/service/media/upload', $files, [], compact('type')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Media/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Media; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. * * @author moniang */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { !isset($app['media']) && $app['media'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/MiniProgram/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\MiniProgram; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\ServiceContainer; /** * Class Client. */ class Client extends BaseClient { /** * Client constructor. * * @param \EasyWeChat\Kernel\ServiceContainer $app */ public function __construct(ServiceContainer $app) { parent::__construct($app, $app['suite_access_token']); } /** * Get session info by code. * * @param string $code * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function session(string $code) { $params = [ 'js_code' => $code, 'grant_type' => 'authorization_code', ]; return $this->httpGet('cgi-bin/service/miniprogram/jscode2session', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/MiniProgram/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\MiniProgram; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { !isset($app['mini_program']) && $app['mini_program'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Provider/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Provider; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\ServiceContainer; /** * Client. * * @author xiaomin */ class Client extends BaseClient { /** * Client constructor. * * * @param ServiceContainer $app */ public function __construct(ServiceContainer $app) { parent::__construct($app, $app['provider_access_token']); } /** * 单点登录 - 获取登录的地址. * * @param string $redirectUri * @param string $userType * @param string $state * * @return string */ public function getLoginUrl(string $redirectUri = '', string $userType = 'admin', string $state = '') { $redirectUri || $redirectUri = $this->app->config['redirect_uri_single']; $state || $state = random_bytes(64); $params = [ 'appid' => $this->app['config']['corp_id'], 'redirect_uri' => $redirectUri, 'usertype' => $userType, 'state' => $state, ]; return 'https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?'.http_build_query($params); } /** * 单点登录 - 获取登录用户信息. * * @param string $authCode * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getLoginInfo(string $authCode) { $params = [ 'auth_code' => $authCode, ]; return $this->httpPostJson('cgi-bin/service/get_login_info', $params); } /** * 获取注册定制化URL. * * @param string $registerCode * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function getRegisterUri(string $registerCode = '') { if (!$registerCode) { /** @var array $response */ $response = $this->detectAndCastResponseToType($this->getRegisterCode(), 'array'); $registerCode = $response['register_code']; } $params = ['register_code' => $registerCode]; return 'https://open.work.weixin.qq.com/3rdservice/wework/register?'.http_build_query($params); } /** * 获取注册码. * * @param string $corpName * @param string $adminName * @param string $adminMobile * @param string $state * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getRegisterCode( string $corpName = '', string $adminName = '', string $adminMobile = '', string $state = '', string $templateId = '' ) { $params = []; $params['template_id'] = $this->app['config']['reg_template_id']; !empty($corpName) && $params['corp_name'] = $corpName; !empty($adminName) && $params['admin_name'] = $adminName; !empty($adminMobile) && $params['admin_mobile'] = $adminMobile; !empty($state) && $params['state'] = $state; !empty($templateId) && $params['template_id'] = $templateId; return $this->httpPostJson('cgi-bin/service/get_register_code', $params); } /** * 查询注册状态. * * Desc:该API用于查询企业注册状态,企业注册成功返回注册信息. * * @param string $registerCode * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getRegisterInfo(string $registerCode) { $params = [ 'register_code' => $registerCode, ]; return $this->httpPostJson('cgi-bin/service/get_register_info', $params); } /** * 设置授权应用可见范围. * * Desc:调用该接口前提是开启通讯录迁移,收到授权成功通知后可调用。 * 企业注册初始化安装应用后,应用默认可见范围为根部门。 * 如需修改应用可见范围,服务商可以调用该接口设置授权应用的可见范围。 * 该接口只能使用注册完成回调事件或者查询注册状态返回的access_token。 * 调用设置通讯录同步完成后或者access_token超过30分钟失效(即解除通讯录锁定状态)则不能继续调用该接口。 * * @param string $accessToken * @param string $agentId * @param array $allowUser * @param array $allowParty * @param array $allowTag * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function setAgentScope( string $accessToken, string $agentId, array $allowUser = [], array $allowParty = [], array $allowTag = [] ) { $params = [ 'agentid' => $agentId, 'allow_user' => $allowUser, 'allow_party' => $allowParty, 'allow_tag' => $allowTag, 'access_token' => $accessToken, ]; return $this->httpGet('cgi-bin/agent/set_scope', $params); } /** * 设置通讯录同步完成. * * Desc:该API用于设置通讯录同步完成,解除通讯录锁定状态,同时使通讯录迁移access_token失效。 * * @param string $accessToken * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function contactSyncSuccess(string $accessToken) { $params = ['access_token' => $accessToken]; return $this->httpGet('cgi-bin/sync/contact_sync_success', $params); } /** * 通讯录单个搜索 * * @param string $corpId * @param string $queryWord * @param int|string $agentId * @param int $offset * @param int $limit * @param int $queryType * @param null $fullMatchField * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function searchContact( string $corpId, string $queryWord, $agentId, int $offset = 0, int $limit = 50, int $queryType = 0, $fullMatchField = null ) { $params = []; $params['auth_corpid'] = $corpId; $params['query_word'] = $queryWord; $params['query_type'] = $queryType; $params['agentid'] = $agentId; $params['offset'] = $offset; $params['limit'] = $limit; !empty($fullMatchField) && $params['full_match_field'] = $fullMatchField; return $this->httpPostJson('cgi-bin/service/contact/search', $params); } /** * 自建应用代开发获取带参授权链接 * * @see https://developer.work.weixin.qq.com/document/path/95436 * * @param array $params 请求参数 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getCustomizedAuthUrl(array $params) { return $this->httpPostJson('cgi-bin/service/get_customized_auth_url', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Provider/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. * * @author xiaomin */ class ServiceProvider implements ServiceProviderInterface { protected $app; /** * @param Container $app */ public function register(Container $app) { $this->app = $app; isset($app['provider']) || $app['provider'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Server/Guard.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Server; use EasyWeChat\Kernel\Encryptor; use EasyWeChat\Kernel\ServerGuard; /** * Guard. * * @author xiaomin */ class Guard extends ServerGuard { /** * @var bool */ protected $alwaysValidate = true; /** * @return $this */ public function validate() { return $this; } /** * @return bool */ protected function shouldReturnRawResponse(): bool { return !is_null($this->app['request']->get('echostr')); } protected function isSafeMode(): bool { return true; } /** * @param array $message * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException */ protected function decryptMessage(array $message) { $encryptor = new Encryptor($message['ToUserName'], $this->app['config']->get('token'), $this->app['config']->get('aes_key')); return $message = $encryptor->decrypt( $message['Encrypt'], $this->app['request']->get('msg_signature'), $this->app['request']->get('nonce'), $this->app['request']->get('timestamp') ); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Server/Handlers/EchoStrHandler.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Server\Handlers; use EasyWeChat\Kernel\Contracts\EventHandlerInterface; use EasyWeChat\Kernel\Decorators\FinallyResult; use EasyWeChat\Kernel\ServiceContainer; /** * EchoStrHandler. * * @author xiaomin */ class EchoStrHandler implements EventHandlerInterface { /** * @var ServiceContainer */ protected $app; /** * EchoStrHandler constructor. * * @param ServiceContainer $app */ public function __construct(ServiceContainer $app) { $this->app = $app; } /** * @param mixed $payload * * @return FinallyResult|null */ public function handle($payload = null) { if ($decrypted = $this->app['request']->get('echostr')) { $str = $this->app['encryptor_corp']->decrypt( $decrypted, $this->app['request']->get('msg_signature'), $this->app['request']->get('nonce'), $this->app['request']->get('timestamp') ); return new FinallyResult($str); } //把SuiteTicket缓存起来 if (!empty($payload['SuiteTicket'])) { $this->app['suite_ticket']->setTicket($payload['SuiteTicket']); return new FinallyResult("success"); } return null; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Server/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Server; use EasyWeChat\Kernel\Encryptor; use EasyWeChat\OpenWork\Server\Handlers\EchoStrHandler; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. * * @author xiaomin */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { //微信第三方在校验url是使用的是GET方式请求和corp_id进行加密 !isset($app['encryptor_corp']) && $app['encryptor_corp'] = function ($app) { return new Encryptor( $app['config']['corp_id'], $app['config']['token'], $app['config']['aes_key'] ); }; //微信第三方推送数据时使用的是suite_id进行加密 !isset($app['encryptor']) && $app['encryptor'] = function ($app) { return new Encryptor( $app['config']['suite_id'], $app['config']['token'], $app['config']['aes_key'] ); }; !isset($app['server']) && $app['server'] = function ($app) { $guard = new Guard($app); $guard->push(new EchoStrHandler($app)); return $guard; }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/SuiteAuth/AccessToken.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\SuiteAuth; use EasyWeChat\Kernel\AccessToken as BaseAccessToken; /** * AccessToken. * * @author xiaomin */ class AccessToken extends BaseAccessToken { /** * @var string */ protected $requestMethod = 'POST'; /** * @var string */ protected $endpointToGetToken = 'cgi-bin/service/get_suite_token'; /** * @var string */ protected $tokenKey = 'suite_access_token'; /** * @var string */ protected $cachePrefix = 'easywechat.kernel.suite_access_token.'; /** * Credential for get token. * * @return array */ protected function getCredentials(): array { return [ 'suite_id' => $this->app['config']['suite_id'], 'suite_secret' => $this->app['config']['suite_secret'], 'suite_ticket' => $this->app['suite_ticket']->getTicket(), ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/SuiteAuth/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\SuiteAuth; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. * * @author xiaomin */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['suite_ticket'] = function ($app) { return new SuiteTicket($app); }; isset($app['suite_access_token']) || $app['suite_access_token'] = function ($app) { return new AccessToken($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/SuiteAuth/SuiteTicket.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\SuiteAuth; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Traits\InteractsWithCache; use EasyWeChat\OpenWork\Application; /** * SuiteTicket. * * @author xiaomin */ class SuiteTicket { use InteractsWithCache; /** * @var Application */ protected $app; /** * SuiteTicket constructor. * * @param Application $app */ public function __construct(Application $app) { $this->app = $app; } /** * @param string $ticket * * @return $this * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function setTicket(string $ticket) { $this->getCache()->set($this->getCacheKey(), $ticket, 1800); if (!$this->getCache()->has($this->getCacheKey())) { throw new RuntimeException('Failed to cache suite ticket.'); } return $this; } /** * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function getTicket(): string { if ($cached = $this->getCache()->get($this->getCacheKey())) { return $cached; } throw new RuntimeException('Credential "suite_ticket" does not exist in cache.'); } /** * @return string */ protected function getCacheKey(): string { return 'easywechat.open_work.suite_ticket.'.$this->app['config']['suite_id']; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Work/Application.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Work; use EasyWeChat\OpenWork\Application as OpenWork; use EasyWeChat\OpenWork\Work\Auth\AccessToken; use EasyWeChat\Work\Application as Work; /** * Application. * * @author xiaomin */ class Application extends Work { /** * Application constructor. * * @param string $authCorpId * @param string $permanentCode * @param OpenWork $component * @param array $prepends */ public function __construct(string $authCorpId, string $permanentCode, OpenWork $component, array $prepends = []) { parent::__construct(\array_merge($component->getConfig(), ['corp_id' => $authCorpId]), $prepends + [ 'access_token' => function ($app) use ($authCorpId, $permanentCode, $component) { return new AccessToken($app, $authCorpId, $permanentCode, $component); }, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/OpenWork/Work/Auth/AccessToken.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OpenWork\Work\Auth; use EasyWeChat\Kernel\AccessToken as BaseAccessToken; use EasyWeChat\OpenWork\Application; use Pimple\Container; /** * AccessToken. * * @author xiaomin */ class AccessToken extends BaseAccessToken { /** * @var string */ protected $requestMethod = 'POST'; /** * @var string 授权方企业ID */ protected $authCorpid; /** * @var string 授权方企业永久授权码,通过get_permanent_code获取 */ protected $permanentCode; protected $component; /** * AccessToken constructor. * * @param Container $app * @param string $authCorpId * @param string $permanentCode * @param Application $component */ public function __construct(Container $app, string $authCorpId, string $permanentCode, Application $component) { $this->authCorpid = $authCorpId; $this->permanentCode = $permanentCode; $this->component = $component; parent::__construct($app); } /** * Credential for get token. * * @return array */ protected function getCredentials(): array { return [ 'auth_corpid' => $this->authCorpid, 'permanent_code' => $this->permanentCode, ]; } /** * @return string */ public function getEndpoint(): string { return 'cgi-bin/service/get_corp_token?'.http_build_query([ 'suite_access_token' => $this->component['suite_access_token']->getToken()['suite_access_token'], ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Application.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment; use Closure; use EasyWeChat\BasicService; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\ServiceContainer; use EasyWeChat\Kernel\Support; use EasyWeChat\OfficialAccount; /** * Class Application. * * @property \EasyWeChat\Payment\Bill\Client $bill * @property \EasyWeChat\Payment\Fundflow\Client $fundflow * @property \EasyWeChat\Payment\Jssdk\Client $jssdk * @property \EasyWeChat\Payment\Order\Client $order * @property \EasyWeChat\Payment\Refund\Client $refund * @property \EasyWeChat\Payment\Coupon\Client $coupon * @property \EasyWeChat\Payment\Reverse\Client $reverse * @property \EasyWeChat\Payment\Redpack\Client $redpack * @property \EasyWeChat\BasicService\Url\Client $url * @property \EasyWeChat\Payment\Transfer\Client $transfer * @property \EasyWeChat\Payment\Security\Client $security * @property \EasyWeChat\Payment\ProfitSharing\Client $profit_sharing * @property \EasyWeChat\Payment\Contract\Client $contract * @property \EasyWeChat\OfficialAccount\Auth\AccessToken $access_token * * @method mixed pay(array $attributes) * @method mixed authCodeToOpenid(string $authCode) */ class Application extends ServiceContainer { /** * @var array */ protected $providers = [ OfficialAccount\Auth\ServiceProvider::class, BasicService\Url\ServiceProvider::class, Base\ServiceProvider::class, Bill\ServiceProvider::class, Fundflow\ServiceProvider::class, Coupon\ServiceProvider::class, Jssdk\ServiceProvider::class, Merchant\ServiceProvider::class, Order\ServiceProvider::class, Redpack\ServiceProvider::class, Refund\ServiceProvider::class, Reverse\ServiceProvider::class, Sandbox\ServiceProvider::class, Transfer\ServiceProvider::class, Security\ServiceProvider::class, ProfitSharing\ServiceProvider::class, Contract\ServiceProvider::class, ]; /** * @var array */ protected $defaultConfig = [ 'http' => [ 'base_uri' => 'https://api.mch.weixin.qq.com/', ], ]; /** * Build payment scheme for product. * * @param string $productId * * @return string */ public function scheme(string $productId): string { $params = [ 'appid' => $this['config']->app_id, 'mch_id' => $this['config']->mch_id, 'time_stamp' => time(), 'nonce_str' => uniqid(), 'product_id' => $productId, ]; $params['sign'] = Support\generate_sign($params, $this['config']->key); return 'weixin://wxpay/bizpayurl?'.http_build_query($params); } /** * @param string $codeUrl * * @return string */ public function codeUrlScheme(string $codeUrl) { return \sprintf('weixin://wxpay/bizpayurl?sr=%s', $codeUrl); } /** * @param \Closure $closure * * @return \Symfony\Component\HttpFoundation\Response * * @codeCoverageIgnore * * @throws \EasyWeChat\Kernel\Exceptions\Exception */ public function handlePaidNotify(Closure $closure) { return (new Notify\Paid($this))->handle($closure); } /** * @param \Closure $closure * * @return \Symfony\Component\HttpFoundation\Response * * @codeCoverageIgnore * * @throws \EasyWeChat\Kernel\Exceptions\Exception */ public function handleRefundedNotify(Closure $closure) { return (new Notify\Refunded($this))->handle($closure); } /** * @param \Closure $closure * * @return \Symfony\Component\HttpFoundation\Response * * @codeCoverageIgnore * * @throws \EasyWeChat\Kernel\Exceptions\Exception */ public function handleScannedNotify(Closure $closure) { return (new Notify\Scanned($this))->handle($closure); } /** * Set sub-merchant. * * @param string $mchId * @param string|null $appId * * @return $this */ public function setSubMerchant(string $mchId, string $appId = null) { $this['config']->set('sub_mch_id', $mchId); $this['config']->set('sub_appid', $appId); return $this; } /** * @return bool */ public function inSandbox(): bool { return (bool) $this['config']->get('sandbox'); } /** * @param string|null $endpoint * * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function getKey(string $endpoint = null) { if ('sandboxnew/pay/getsignkey' === $endpoint) { return $this['config']->key; } $key = $this->inSandbox() ? $this['sandbox']->getKey() : $this['config']->key; if (empty($key)) { throw new InvalidArgumentException('config key should not empty.'); } if (32 !== strlen($key)) { throw new InvalidArgumentException(sprintf("'%s' should be 32 chars length.", $key)); } return $key; } /** * @param string $name * @param array $arguments * * @return mixed */ public function __call($name, $arguments) { return call_user_func_array([$this['base'], $name], $arguments); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Base/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Base; use EasyWeChat\Payment\Kernel\BaseClient; class Client extends BaseClient { /** * Pay the order. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function pay(array $params) { $params['appid'] = $this->app['config']->app_id; return $this->request($this->wrap('pay/micropay'), $params); } /** * Get openid by auth code. * * @param string $authCode * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function authCodeToOpenid(string $authCode) { return $this->request('tools/authcodetoopenid', [ 'appid' => $this->app['config']->app_id, 'auth_code' => $authCode, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Base/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Base; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['base'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Bill/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Bill; use EasyWeChat\Kernel\Http\StreamResponse; use EasyWeChat\Payment\Kernel\BaseClient; class Client extends BaseClient { /** * Download bill history as a table file. * * @param string $date * @param string $type * @param array $optional * * @return \EasyWeChat\Kernel\Http\StreamResponse|\Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $date, string $type = 'ALL', array $optional = []) { $params = [ 'appid' => $this->app['config']->app_id, 'bill_date' => $date, 'bill_type' => $type, ] + $optional; $response = $this->requestRaw($this->wrap('pay/downloadbill'), $params); if (0 === strpos($response->getBody()->getContents(), '')) { return $this->castResponseToType($response, $this->app['config']->get('response_type')); } return StreamResponse::buildFromPsrResponse($response); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Bill/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Bill; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['bill'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Contract/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Contract; use EasyWeChat\Payment\Kernel\BaseClient; /** * Class Client. * * @author tianyong90 <412039588@qq.com> */ class Client extends BaseClient { /** * entrust official account. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function web(array $params) { $params['appid'] = $this->app['config']->app_id; return $this->safeRequest('papay/entrustweb', $params); } /** * entrust app. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function app(array $params) { $params['appid'] = $this->app['config']->app_id; return $this->safeRequest('papay/preentrustweb', $params); } /** * entrust html 5. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function h5(array $params) { $params['appid'] = $this->app['config']->app_id; return $this->safeRequest('papay/h5entrustweb', $params); } /** * apply papay. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function apply(array $params) { $params['appid'] = $this->app['config']->app_id; return $this->safeRequest('pay/pappayapply', $params); } /** * delete papay contrace. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(array $params) { $params['appid'] = $this->app['config']->app_id; return $this->safeRequest('papay/deletecontract', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Contract/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Contract; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['contract'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Coupon/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Coupon; use EasyWeChat\Payment\Kernel\BaseClient; /** * Class Client. * * @author tianyong90 <412039588@qq.com> */ class Client extends BaseClient { /** * send a cash coupon. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $params) { $params['appid'] = $this->app['config']->app_id; $params['openid_count'] = 1; return $this->safeRequest('mmpaymkttransfers/send_coupon', $params); } /** * query a coupon stock. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function stock(array $params) { $params['appid'] = $this->app['config']->app_id; return $this->request('mmpaymkttransfers/query_coupon_stock', $params); } /** * query a info of coupon. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function info(array $params) { $params['appid'] = $this->app['config']->app_id; return $this->request('mmpaymkttransfers/querycouponsinfo', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Coupon/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Coupon; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['coupon'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Fundflow/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Fundflow; use EasyWeChat\Kernel\Http\StreamResponse; use EasyWeChat\Payment\Kernel\BaseClient; class Client extends BaseClient { /** * Download fundflow history as a table file. * * @param string $date * @param string $type * @param array $options * * @return array|\EasyWeChat\Kernel\Http\Response|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $date, string $type = 'Basic', $options = []) { $params = [ 'appid' => $this->app['config']->app_id, 'bill_date' => $date, 'account_type' => $type, 'sign_type' => 'HMAC-SHA256', 'nonce_str' => uniqid('micro'), ]; $options = array_merge( [ 'cert' => $this->app['config']->get('cert_path'), 'ssl_key' => $this->app['config']->get('key_path'), ], $options ); $response = $this->requestRaw('pay/downloadfundflow', $params, 'post', $options); if (0 === strpos($response->getBody()->getContents(), '')) { return $this->castResponseToType($response, $this->app['config']->get('response_type')); } return StreamResponse::buildFromPsrResponse($response); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Fundflow/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Fundflow; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['fundflow'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Jssdk/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Jssdk; use EasyWeChat\BasicService\Jssdk\Client as JssdkClient; use EasyWeChat\Kernel\Support; /** * Class Client. * * @author overtrue */ class Client extends JssdkClient { /** * [WeixinJSBridge] Generate js config for payment. * *
             * WeixinJSBridge.invoke(
             *  'getBrandWCPayRequest',
             *  ...
             * );
             * 
        * * @param string $prepayId * @param bool $json * * @return string|array */ public function bridgeConfig(string $prepayId, bool $json = true) { $params = [ 'appId' => $this->app['config']->sub_appid ?: $this->app['config']->app_id, 'timeStamp' => strval(time()), 'nonceStr' => uniqid(), 'package' => "prepay_id=$prepayId", 'signType' => 'MD5', ]; $params['paySign'] = Support\generate_sign($params, $this->app['config']->key, 'md5'); return $json ? json_encode($params) : $params; } /** * [JSSDK] Generate js config for payment. * *
             * wx.chooseWXPay({...});
             * 
        * * @param string $prepayId * * @return array */ public function sdkConfig(string $prepayId): array { $config = $this->bridgeConfig($prepayId, false); $config['timestamp'] = $config['timeStamp']; unset($config['timeStamp']); return $config; } /** * Generate app payment parameters. * * @param string $prepayId * * @return array */ public function appConfig(string $prepayId): array { $params = [ 'appid' => $this->app['config']->app_id, 'partnerid' => $this->app['config']->mch_id, 'prepayid' => $prepayId, 'noncestr' => uniqid(), 'timestamp' => time(), 'package' => 'Sign=WXPay', ]; $params['sign'] = Support\generate_sign($params, $this->app['config']->key); return $params; } /** * Generate js config for share user address. * * @param string $accessToken * @param bool $json * * @return string|array */ public function shareAddressConfig(string $accessToken, bool $json = true) { $params = [ 'appId' => $this->app['config']->app_id, 'scope' => 'jsapi_address', 'timeStamp' => strval(time()), 'nonceStr' => uniqid(), 'signType' => 'SHA1', ]; $signParams = [ 'appid' => $params['appId'], 'url' => $this->getUrl(), 'timestamp' => $params['timeStamp'], 'noncestr' => $params['nonceStr'], 'accesstoken' => strval($accessToken), ]; ksort($signParams); $params['addrSign'] = sha1(urldecode(http_build_query($signParams))); return $json ? json_encode($params) : $params; } /** * Generate js config for contract of mini program. * * @param array $params * * @return array */ public function contractConfig(array $params): array { $params['appid'] = $this->app['config']->app_id; $params['timestamp'] = time(); $params['sign'] = Support\generate_sign($params, $this->app['config']->key); return $params; } /** * Generate js config for biz red packet of mini program. * * @param string $package * @return array */ public function miniprogramRedpackConfig(string $package): array { $param = [ 'appId' => $this->app['config']->app_id, 'timeStamp' => '' . time(), 'nonceStr' => uniqid(), 'package' => urlencode($package), ]; ksort($param); $buff = ''; foreach ($param as $k => $v) { $buff .= $k . "=" . $v . "&"; } $param['paySign'] = md5($buff . 'key=' . $this->app['config']->key); $param['signType'] = 'MD5'; unset($param['appId']); return $param; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Jssdk/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Jssdk; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['jssdk'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Kernel/BaseClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Kernel; use EasyWeChat\Kernel\Support; use EasyWeChat\Kernel\Traits\HasHttpRequests; use EasyWeChat\Payment\Application; use GuzzleHttp\MessageFormatter; use GuzzleHttp\Middleware; use Psr\Http\Message\ResponseInterface; /** * Class BaseClient. * * @author overtrue */ class BaseClient { use HasHttpRequests { request as performRequest; } /** * @var \EasyWeChat\Payment\Application */ protected $app; /** * Constructor. * * @param \EasyWeChat\Payment\Application $app */ public function __construct(Application $app) { $this->app = $app; $this->setHttpClient($this->app['http_client']); } /** * Extra request params. * * @return array */ protected function prepends() { return []; } /** * Make a API request. * * @param string $endpoint * @param array $params * @param string $method * @param array $options * @param bool $returnResponse * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function request(string $endpoint, array $params = [], $method = 'post', array $options = [], $returnResponse = false) { $base = [ 'mch_id' => $this->app['config']['mch_id'], 'nonce_str' => uniqid(), 'sub_mch_id' => $this->app['config']['sub_mch_id'], 'sub_appid' => $this->app['config']['sub_appid'], ]; $params = array_filter(array_filter(array_merge($base, $this->prepends(), $params)), 'strlen'); $secretKey = $this->app->getKey($endpoint); $encryptMethod = Support\get_encrypt_method(Support\Arr::get($params, 'sign_type', 'MD5'), $secretKey); $params['sign'] = Support\generate_sign($params, $secretKey, $encryptMethod); $options = array_merge([ 'body' => Support\XML::build($params), ], $options); $this->pushMiddleware($this->logMiddleware(), 'log'); $response = $this->performRequest($endpoint, $method, $options); return $returnResponse ? $response : $this->castResponseToType($response, $this->app->config->get('response_type')); } /** * Log the request. * * @return \Closure */ protected function logMiddleware() { $formatter = new MessageFormatter($this->app['config']['http.log_template'] ?? MessageFormatter::DEBUG); return Middleware::log($this->app['logger'], $formatter); } /** * Make a request and return raw response. * * @param string $endpoint * @param array $params * @param string $method * @param array $options * * @return ResponseInterface * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function requestRaw(string $endpoint, array $params = [], $method = 'post', array $options = []) { /** @var ResponseInterface $response */ $response = $this->request($endpoint, $params, $method, $options, true); return $response; } /** * Make a request and return an array. * * @param string $endpoint * @param array $params * @param string $method * @param array $options * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function requestArray(string $endpoint, array $params = [], $method = 'post', array $options = []): array { $response = $this->requestRaw($endpoint, $params, $method, $options); return $this->castResponseToType($response, 'array'); } /** * Request with SSL. * * @param string $endpoint * @param array $params * @param string $method * @param array $options * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function safeRequest($endpoint, array $params, $method = 'post', array $options = []) { $options = array_merge([ 'cert' => $this->app['config']->get('cert_path'), 'ssl_key' => $this->app['config']->get('key_path'), ], $options); return $this->request($endpoint, $params, $method, $options); } /** * Wrapping an API endpoint. * * @param string $endpoint * * @return string */ protected function wrap(string $endpoint): string { return $this->app->inSandbox() ? "sandboxnew/{$endpoint}" : $endpoint; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Kernel/Exceptions/InvalidSignException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Kernel\Exceptions; use EasyWeChat\Kernel\Exceptions\Exception; class InvalidSignException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Kernel/Exceptions/SandboxException.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Kernel\Exceptions; use EasyWeChat\Kernel\Exceptions\Exception; class SandboxException extends Exception { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Merchant/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Merchant; use EasyWeChat\Payment\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Add sub-merchant. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function addSubMerchant(array $params) { return $this->manage($params, ['action' => 'add']); } /** * Query sub-merchant by merchant id. * * @param string $id * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function querySubMerchantByMerchantId(string $id) { $params = [ 'micro_mch_id' => $id, ]; return $this->manage($params, ['action' => 'query']); } /** * Query sub-merchant by wechat id. * * @param string $id * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function querySubMerchantByWeChatId(string $id) { $params = [ 'recipient_wechatid' => $id, ]; return $this->manage($params, ['action' => 'query']); } /** * @param array $params * @param array $query * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function manage(array $params, array $query) { $params = array_merge($params, [ 'appid' => $this->app['config']->app_id, 'nonce_str' => '', 'sub_mch_id' => '', 'sub_appid' => '', ]); return $this->safeRequest('secapi/mch/submchmanage', $params, 'post', compact('query')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Merchant/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Merchant; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['merchant'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Notify/Handler.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Notify; use Closure; use EasyWeChat\Kernel\Exceptions\Exception; use EasyWeChat\Kernel\Support; use EasyWeChat\Kernel\Support\XML; use EasyWeChat\Payment\Kernel\Exceptions\InvalidSignException; use Symfony\Component\HttpFoundation\Response; abstract class Handler { public const SUCCESS = 'SUCCESS'; public const FAIL = 'FAIL'; /** * @var \EasyWeChat\Payment\Application */ protected $app; /** * @var array */ protected $message; /** * @var string|null */ protected $fail; /** * @var array */ protected $attributes = []; /** * Check sign. * If failed, throws an exception. * * @var bool */ protected $check = true; /** * Respond with sign. * * @var bool */ protected $sign = false; /** * @param \EasyWeChat\Payment\Application $app */ public function __construct($app) { $this->app = $app; } /** * Handle incoming notify. * * @param \Closure $closure * * @return \Symfony\Component\HttpFoundation\Response */ abstract public function handle(Closure $closure); /** * @param string $message */ public function fail(string $message) { $this->fail = $message; } /** * @param array $attributes * @param bool $sign * * @return $this */ public function respondWith(array $attributes, bool $sign = false) { $this->attributes = $attributes; $this->sign = $sign; return $this; } /** * Build xml and return the response to WeChat. * * @return \Symfony\Component\HttpFoundation\Response * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function toResponse(): Response { $base = [ 'return_code' => is_null($this->fail) ? static::SUCCESS : static::FAIL, 'return_msg' => $this->fail, ]; $attributes = array_merge($base, $this->attributes); if ($this->sign) { $attributes['sign'] = Support\generate_sign($attributes, $this->app->getKey()); } return new Response(XML::build($attributes)); } /** * Return the notify message from request. * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\Exception */ public function getMessage(): array { if (!empty($this->message)) { return $this->message; } try { $message = XML::parse(strval($this->app['request']->getContent())); } catch (\Throwable $e) { throw new Exception('Invalid request XML: '.$e->getMessage(), 400); } if (!is_array($message) || empty($message)) { throw new Exception('Invalid request XML.', 400); } if ($this->check) { $this->validate($message); } return $this->message = $message; } /** * Decrypt message. * * @param string $key * * @return string|null * * @throws \EasyWeChat\Kernel\Exceptions\Exception */ public function decryptMessage(string $key) { $message = $this->getMessage(); if (empty($message[$key])) { return null; } return Support\AES::decrypt( base64_decode($message[$key], true), md5($this->app['config']->key), '', OPENSSL_RAW_DATA, 'AES-256-ECB' ); } /** * Validate the request params. * * @param array $message * * @throws \EasyWeChat\Payment\Kernel\Exceptions\InvalidSignException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function validate(array $message) { $sign = $message['sign']; unset($message['sign']); if (Support\generate_sign($message, $this->app->getKey()) !== $sign) { throw new InvalidSignException(); } } /** * @param mixed $result */ protected function strict($result) { if (true !== $result && is_null($this->fail)) { $this->fail(strval($result)); } } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Notify/Paid.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Notify; use Closure; class Paid extends Handler { /** * @param \Closure $closure * * @return \Symfony\Component\HttpFoundation\Response * * @throws \EasyWeChat\Kernel\Exceptions\Exception */ public function handle(Closure $closure) { $this->strict( \call_user_func($closure, $this->getMessage(), [$this, 'fail']) ); return $this->toResponse(); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Notify/Refunded.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Notify; use Closure; use EasyWeChat\Kernel\Support\XML; class Refunded extends Handler { protected $check = false; /** * @param \Closure $closure * * @return \Symfony\Component\HttpFoundation\Response * * @throws \EasyWeChat\Kernel\Exceptions\Exception */ public function handle(Closure $closure) { $this->strict( \call_user_func($closure, $this->getMessage(), $this->reqInfo(), [$this, 'fail']) ); return $this->toResponse(); } /** * Decrypt the `req_info` from request message. * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\Exception */ public function reqInfo() { return XML::parse($this->decryptMessage('req_info')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Notify/Scanned.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Notify; use Closure; class Scanned extends Handler { protected $check = false; /** * @var string|null */ protected $alert; /** * @param string $message */ public function alert(string $message) { $this->alert = $message; } /** * @param \Closure $closure * * @return \Symfony\Component\HttpFoundation\Response * * @throws \EasyWeChat\Kernel\Exceptions\Exception */ public function handle(Closure $closure) { $result = \call_user_func($closure, $this->getMessage(), [$this, 'fail'], [$this, 'alert']); $attributes = [ 'result_code' => is_null($this->alert) && is_null($this->fail) ? static::SUCCESS : static::FAIL, 'err_code_des' => $this->alert, ]; if (is_null($this->alert) && is_string($result)) { $attributes += [ 'appid' => $this->app['config']->app_id, 'mch_id' => $this->app['config']->mch_id, 'nonce_str' => uniqid(), 'prepay_id' => $result, ]; } return $this->respondWith($attributes, true)->toResponse(); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Order/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Order; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Exceptions\InvalidConfigException; use EasyWeChat\Kernel\Support; use EasyWeChat\Kernel\Support\Collection; use EasyWeChat\Payment\Kernel\BaseClient; use Psr\Http\Message\ResponseInterface; class Client extends BaseClient { /** * Unify order. * * @param array $params * @param bool $isContract * * @return ResponseInterface|Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function unify(array $params, $isContract = false) { if (empty($params['spbill_create_ip'])) { $params['spbill_create_ip'] = ('NATIVE' === $params['trade_type']) ? Support\get_server_ip() : Support\get_client_ip(); } $params['appid'] = $this->app['config']->app_id; $params['notify_url'] = $params['notify_url'] ?? $this->app['config']['notify_url']; if ($isContract) { $params['contract_appid'] = $this->app['config']['app_id']; $params['contract_mchid'] = $this->app['config']['mch_id']; $params['request_serial'] = $params['request_serial'] ?? time(); $params['contract_notify_url'] = $params['contract_notify_url'] ?? $this->app['config']['contract_notify_url']; return $this->request($this->wrap('pay/contractorder'), $params); } return $this->request($this->wrap('pay/unifiedorder'), $params); } /** * Query order by out trade number. * * @param string $number * * @return ResponseInterface|Collection|array|object|string * * @throws InvalidArgumentException * @throws InvalidConfigException */ public function queryByOutTradeNumber(string $number) { return $this->query([ 'out_trade_no' => $number, ]); } /** * Query order by transaction id. * * @param string $transactionId * * @return ResponseInterface|Collection|array|object|string * * @throws InvalidArgumentException * @throws InvalidConfigException */ public function queryByTransactionId(string $transactionId) { return $this->query([ 'transaction_id' => $transactionId, ]); } /** * @param array $params * * @return ResponseInterface|Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function query(array $params) { $params['appid'] = $this->app['config']->app_id; return $this->request($this->wrap('pay/orderquery'), $params); } /** * Close order by out_trade_no. * * @param string $tradeNo * * @return ResponseInterface|Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function close(string $tradeNo) { $params = [ 'appid' => $this->app['config']->app_id, 'out_trade_no' => $tradeNo, ]; return $this->request($this->wrap('pay/closeorder'), $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Order/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Order; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['order'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/ProfitSharing/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\ProfitSharing; use EasyWeChat\Payment\Kernel\BaseClient; /** * Class Client. * * @author ClouderSky */ class Client extends BaseClient { /** * {@inheritdoc}. */ protected function prepends() { return [ 'sign_type' => 'HMAC-SHA256', ]; } /** * Add profit sharing receiver. * 服务商代子商户发起添加分账接收方请求. * 后续可通过发起分账请求将结算后的钱分到该分账接收方. * * @param array $receiver 分账接收方对象,json格式 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addReceiver(array $receiver) { $params = [ 'appid' => $this->app['config']->app_id, 'receiver' => json_encode( $receiver, JSON_UNESCAPED_UNICODE ), ]; return $this->request( 'pay/profitsharingaddreceiver', $params ); } /** * Delete profit sharing receiver. * 服务商代子商户发起删除分账接收方请求. * 删除后不支持将结算后的钱分到该分账接收方. * * @param array $receiver 分账接收方对象,json格式 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deleteReceiver(array $receiver) { $params = [ 'appid' => $this->app['config']->app_id, 'receiver' => json_encode( $receiver, JSON_UNESCAPED_UNICODE ), ]; return $this->request( 'pay/profitsharingremovereceiver', $params ); } /** * Single profit sharing. * 请求单次分账. * * @param string $transactionId 微信支付订单号 * @param string $outOrderNo 商户系统内部的分账单号 * @param array $receivers 分账接收方列表 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function share( string $transactionId, string $outOrderNo, array $receivers ) { $params = [ 'appid' => $this->app['config']->app_id, 'transaction_id' => $transactionId, 'out_order_no' => $outOrderNo, 'receivers' => json_encode( $receivers, JSON_UNESCAPED_UNICODE ), ]; return $this->safeRequest( 'secapi/pay/profitsharing', $params ); } /** * Multi profit sharing. * 请求多次分账. * * @param string $transactionId 微信支付订单号 * @param string $outOrderNo 商户系统内部的分账单号 * @param array $receivers 分账接收方列表 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function multiShare( string $transactionId, string $outOrderNo, array $receivers ) { $params = [ 'appid' => $this->app['config']->app_id, 'transaction_id' => $transactionId, 'out_order_no' => $outOrderNo, 'receivers' => json_encode( $receivers, JSON_UNESCAPED_UNICODE ), ]; return $this->safeRequest( 'secapi/pay/multiprofitsharing', $params ); } /** * Finish profit sharing. * 完结分账. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function markOrderAsFinished(array $params) { $params['appid'] = $this->app['config']->app_id; $params['sub_appid'] = null; return $this->safeRequest( 'secapi/pay/profitsharingfinish', $params ); } /** * Query profit sharing result. * 查询分账结果. * * @param string $transactionId 微信支付订单号 * @param string $outOrderNo 商户系统内部的分账单号 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function query( string $transactionId, string $outOrderNo ) { $params = [ 'sub_appid' => null, 'transaction_id' => $transactionId, 'out_order_no' => $outOrderNo, ]; return $this->request( 'pay/profitsharingquery', $params ); } /** * Profit sharing return. * 分账回退. * * @param string $outOrderNo 商户系统内部的分账单号 * @param string $outReturnNo 商户系统内部分账回退单号 * @param int $returnAmount 回退金额 * @param string $returnAccount 回退方账号 * @param string $description 回退描述 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function returnShare( string $outOrderNo, string $outReturnNo, int $returnAmount, string $returnAccount, string $description ) { $params = [ 'appid' => $this->app['config']->app_id, 'out_order_no' => $outOrderNo, 'out_return_no' => $outReturnNo, 'return_account_type' => 'MERCHANT_ID', 'return_account' => $returnAccount, 'return_amount' => $returnAmount, 'description' => $description, ]; return $this->safeRequest( 'secapi/pay/profitsharingreturn', $params ); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/ProfitSharing/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\ProfitSharing; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author ClouderSky */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['profit_sharing'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Redpack/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Redpack; use EasyWeChat\Kernel\Support; use EasyWeChat\Payment\Kernel\BaseClient; /** * Class Client. * * @author tianyong90 <412039588@qq.com> */ class Client extends BaseClient { /** * Query redpack. * * @param mixed $mchBillno * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function info($mchBillno) { $params = is_array($mchBillno) ? $mchBillno : ['mch_billno' => $mchBillno]; $base = [ 'appid' => $this->app['config']->app_id, 'bill_type' => 'MCHT', ]; return $this->safeRequest('mmpaymkttransfers/gethbinfo', array_merge($base, $params)); } /** * Send miniprogram normal redpack. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function sendMiniprogramNormal(array $params) { $base = [ 'total_num' => 1, 'client_ip' => $params['client_ip'] ?? Support\get_server_ip(), 'wxappid' => $this->app['config']->app_id, 'notify_way' => 'MINI_PROGRAM_JSAPI', ]; return $this->safeRequest('mmpaymkttransfers/sendminiprogramhb', array_merge($base, $params)); } /** * Send normal redpack. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function sendNormal(array $params) { $base = [ 'total_num' => 1, 'client_ip' => $params['client_ip'] ?? Support\get_server_ip(), 'wxappid' => $this->app['config']->app_id, ]; return $this->safeRequest('mmpaymkttransfers/sendredpack', array_merge($base, $params)); } /** * Send group redpack. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function sendGroup(array $params) { $base = [ 'amt_type' => 'ALL_RAND', 'wxappid' => $this->app['config']->app_id, ]; return $this->safeRequest('mmpaymkttransfers/sendgroupredpack', array_merge($base, $params)); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Redpack/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Redpack; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['redpack'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Refund/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Refund; use EasyWeChat\Payment\Kernel\BaseClient; class Client extends BaseClient { /** * Refund by out trade number. * * @param string $number * @param string $refundNumber * @param int $totalFee * @param int $refundFee * @param array $optional * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function byOutTradeNumber(string $number, string $refundNumber, int $totalFee, int $refundFee, array $optional = []) { return $this->refund($refundNumber, $totalFee, $refundFee, array_merge($optional, ['out_trade_no' => $number])); } /** * Refund by transaction id. * * @param string $transactionId * @param string $refundNumber * @param int $totalFee * @param int $refundFee * @param array $optional * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function byTransactionId(string $transactionId, string $refundNumber, int $totalFee, int $refundFee, array $optional = []) { return $this->refund($refundNumber, $totalFee, $refundFee, array_merge($optional, ['transaction_id' => $transactionId])); } /** * Query refund by transaction id. * * @param string $transactionId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function queryByTransactionId(string $transactionId) { return $this->query($transactionId, 'transaction_id'); } /** * Query refund by out trade number. * * @param string $outTradeNumber * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function queryByOutTradeNumber(string $outTradeNumber) { return $this->query($outTradeNumber, 'out_trade_no'); } /** * Query refund by out refund number. * * @param string $outRefundNumber * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function queryByOutRefundNumber(string $outRefundNumber) { return $this->query($outRefundNumber, 'out_refund_no'); } /** * Query refund by refund id. * * @param string $refundId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function queryByRefundId(string $refundId) { return $this->query($refundId, 'refund_id'); } /** * Refund. * * @param string $refundNumber * @param int $totalFee * @param int $refundFee * @param array $optional * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function refund(string $refundNumber, int $totalFee, int $refundFee, $optional = []) { $params = array_merge([ 'out_refund_no' => $refundNumber, 'total_fee' => $totalFee, 'refund_fee' => $refundFee, 'appid' => $this->app['config']->app_id, ], $optional); return $this->safeRequest($this->wrap( $this->app->inSandbox() ? 'pay/refund' : 'secapi/pay/refund' ), $params); } /** * Query refund. * * @param string $number * @param string $type * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function query(string $number, string $type) { $params = [ 'appid' => $this->app['config']->app_id, $type => $number, ]; return $this->request($this->wrap('pay/refundquery'), $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Refund/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Refund; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['refund'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Reverse/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Reverse; use EasyWeChat\Payment\Kernel\BaseClient; class Client extends BaseClient { /** * Reverse order by out trade number. * * @param string $outTradeNumber * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function byOutTradeNumber(string $outTradeNumber) { return $this->reverse($outTradeNumber, 'out_trade_no'); } /** * Reverse order by transaction_id. * * @param string $transactionId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function byTransactionId(string $transactionId) { return $this->reverse($transactionId, 'transaction_id'); } /** * Reverse order. * * @param string $number * @param string $type * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function reverse(string $number, string $type) { $params = [ 'appid' => $this->app['config']->app_id, $type => $number, ]; return $this->safeRequest($this->wrap('secapi/pay/reverse'), $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Reverse/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Reverse; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['reverse'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Sandbox/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Sandbox; use EasyWeChat\Kernel\Traits\InteractsWithCache; use EasyWeChat\Payment\Kernel\BaseClient; use EasyWeChat\Payment\Kernel\Exceptions\SandboxException; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { use InteractsWithCache; /** * @return string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Payment\Kernel\Exceptions\SandboxException * @throws \Psr\SimpleCache\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getKey(): string { if ($cache = $this->getCache()->get($this->getCacheKey())) { return $cache; } $response = $this->requestArray('sandboxnew/pay/getsignkey'); if ('SUCCESS' === $response['return_code']) { $this->getCache()->set($this->getCacheKey(), $key = $response['sandbox_signkey'], 24 * 3600); return $key; } throw new SandboxException($response['retmsg'] ?? $response['return_msg']); } /** * @return string */ protected function getCacheKey(): string { return 'easywechat.payment.sandbox.'.md5($this->app['config']->app_id.$this->app['config']['mch_id']); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Sandbox/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Sandbox; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * @param \Pimple\Container $app */ public function register(Container $app) { $app['sandbox'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Security/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Security; use EasyWeChat\Payment\Kernel\BaseClient; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { /** * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getPublicKey() { $params = [ 'sign_type' => 'MD5', ]; return $this->safeRequest('https://fraud.mch.weixin.qq.com/risk/getpublickey', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Security/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Security; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['security'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Transfer/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Transfer; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Payment\Kernel\BaseClient; use function EasyWeChat\Kernel\Support\get_server_ip; use function EasyWeChat\Kernel\Support\rsa_public_encrypt; /** * Class Client. * * @author AC */ class Client extends BaseClient { /** * Query MerchantPay to balance. * * @param string $partnerTradeNo * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function queryBalanceOrder(string $partnerTradeNo) { $params = [ 'appid' => $this->app['config']->app_id, 'mch_id' => $this->app['config']->mch_id, 'partner_trade_no' => $partnerTradeNo, ]; return $this->safeRequest('mmpaymkttransfers/gettransferinfo', $params); } /** * Send MerchantPay to balance. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function toBalance(array $params) { $base = [ 'mch_id' => null, 'mchid' => $this->app['config']->mch_id, 'mch_appid' => $this->app['config']->app_id, ]; if (empty($params['spbill_create_ip'])) { $params['spbill_create_ip'] = get_server_ip(); } return $this->safeRequest('mmpaymkttransfers/promotion/transfers', array_merge($base, $params)); } /** * Query MerchantPay order to BankCard. * * @param string $partnerTradeNo * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function queryBankCardOrder(string $partnerTradeNo) { $params = [ 'mch_id' => $this->app['config']->mch_id, 'partner_trade_no' => $partnerTradeNo, ]; return $this->safeRequest('mmpaysptrans/query_bank', $params); } /** * Send MerchantPay to BankCard. * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \GuzzleHttp\Exception\GuzzleException */ public function toBankCard(array $params) { foreach (['bank_code', 'partner_trade_no', 'enc_bank_no', 'enc_true_name', 'amount'] as $key) { if (empty($params[$key])) { throw new RuntimeException(\sprintf('"%s" is required.', $key)); } } $publicKey = file_get_contents($this->app['config']->get('rsa_public_key_path')); $params['enc_bank_no'] = rsa_public_encrypt($params['enc_bank_no'], $publicKey); $params['enc_true_name'] = rsa_public_encrypt($params['enc_true_name'], $publicKey); return $this->safeRequest('mmpaysptrans/pay_bank', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Payment/Transfer/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Payment\Transfer; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['transfer'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Agent/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Agent; use EasyWeChat\Kernel\BaseClient; /** * This is WeWork Agent Client. * * @author mingyoung */ class Client extends BaseClient { /** * Get agent. * * @param int $agentId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function get(int $agentId) { $params = [ 'agentid' => $agentId, ]; return $this->httpGet('cgi-bin/agent/get', $params); } /** * Set agent. * * @param int $agentId * @param array $attributes * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function set(int $agentId, array $attributes) { return $this->httpPostJson('cgi-bin/agent/set', array_merge(['agentid' => $agentId], $attributes)); } /** * Get agent list. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function list() { return $this->httpGet('cgi-bin/agent/list'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Agent/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Agent; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['agent'] = function ($app) { return new Client($app); }; $app['agent_workbench'] = function ($app) { return new WorkbenchClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Agent/WorkbenchClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Agent; use EasyWeChat\Kernel\BaseClient; /** * This is WeWork Agent WorkbenchClient. * * @author 读心印 */ class WorkbenchClient extends BaseClient { /** * 设置应用在工作台展示的模版. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/92535#设置应用在工作台展示的模版 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function setWorkbenchTemplate(array $params) { return $this->httpPostJson('cgi-bin/agent/set_workbench_template', $params); } /** * 获取应用在工作台展示的模版. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/92535#获取应用在工作台展示的模版 * * @param int $agentId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function getWorkbenchTemplate(int $agentId) { $params = [ 'agentid' => $agentId ]; return $this->httpPostJson('cgi-bin/agent/get_workbench_template', $params); } /** * 设置应用在用户工作台展示的数据. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/92535#设置应用在用户工作台展示的数据 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function setWorkbenchData(array $params) { return $this->httpPostJson('cgi-bin/agent/set_workbench_data', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Application.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work; use EasyWeChat\Kernel\ServiceContainer; use EasyWeChat\Work\MiniProgram\Application as MiniProgram; /** * Application. * * @author mingyoung * * @property \EasyWeChat\Work\OA\Client $oa * @property \EasyWeChat\Work\Auth\AccessToken $access_token * @property \EasyWeChat\Work\Agent\Client $agent * @property \EasyWeChat\Work\Department\Client $department * @property \EasyWeChat\Work\Media\Client $media * @property \EasyWeChat\Work\Menu\Client $menu * @property \EasyWeChat\Work\Message\Client $message * @property \EasyWeChat\Work\Message\Messenger $messenger * @property \EasyWeChat\Work\User\Client $user * @property \EasyWeChat\Work\User\TagClient $tag * @property \EasyWeChat\Work\Server\Guard $server * @property \EasyWeChat\Work\Jssdk\Client $jssdk * @property \Overtrue\Socialite\Providers\WeWork $oauth * @property \EasyWeChat\Work\Invoice\Client $invoice * @property \EasyWeChat\Work\Chat\Client $chat * @property \EasyWeChat\Work\ExternalContact\Client $external_contact * @property \EasyWeChat\Work\ExternalContact\ContactWayClient $contact_way * @property \EasyWeChat\Work\ExternalContact\GroupChatWayClient $group_chat_way * @property \EasyWeChat\Work\ExternalContact\StatisticsClient $external_contact_statistics * @property \EasyWeChat\Work\ExternalContact\MessageClient $external_contact_message * @property \EasyWeChat\Work\ExternalContact\InterceptClient $intercept * @property \EasyWeChat\Work\ExternalContact\ProductClient $product * @property \EasyWeChat\Work\GroupRobot\Client $group_robot * @property \EasyWeChat\Work\GroupRobot\Messenger $group_robot_messenger * @property \EasyWeChat\Work\Calendar\Client $calendar * @property \EasyWeChat\Work\Schedule\Client $schedule * @property \EasyWeChat\Work\MsgAudit\Client $msg_audit * @property \EasyWeChat\Work\Live\Client $live * @property \EasyWeChat\Work\CorpGroup\Client $corp_group * @property \EasyWeChat\Work\ExternalContact\SchoolClient $school * @property \EasyWeChat\Work\ExternalContact\MessageTemplateClient $external_contact_message_template * @property \EasyWeChat\Work\Kf\AccountClient $kf_account * @property \EasyWeChat\Work\Kf\ServicerClient $kf_servicer * @property \EasyWeChat\Work\Kf\MessageClient $kf_message * @property \EasyWeChat\Work\GroupWelcomeTemplate\Client $group_welcome_templage * @property \EasyWeChat\Work\Wedrive\Wedrive $wedrive * * @method mixed getCallbackIp() */ class Application extends ServiceContainer { /** * @var array */ protected $providers = [ OA\ServiceProvider::class, Auth\ServiceProvider::class, Base\ServiceProvider::class, Menu\ServiceProvider::class, OAuth\ServiceProvider::class, User\ServiceProvider::class, Agent\ServiceProvider::class, Media\ServiceProvider::class, Message\ServiceProvider::class, Department\ServiceProvider::class, Server\ServiceProvider::class, Jssdk\ServiceProvider::class, Invoice\ServiceProvider::class, Chat\ServiceProvider::class, ExternalContact\ServiceProvider::class, GroupRobot\ServiceProvider::class, Calendar\ServiceProvider::class, Schedule\ServiceProvider::class, MsgAudit\ServiceProvider::class, Live\ServiceProvider::class, CorpGroup\ServiceProvider::class, Mobile\ServiceProvider::class, Kf\ServiceProvider::class, GroupWelcomeTemplate\ServiceProvider::class, Wedrive\ServiceProvider::class, ]; /** * @var array */ protected $defaultConfig = [ // http://docs.guzzlephp.org/en/stable/request-options.html 'http' => [ 'base_uri' => 'https://qyapi.weixin.qq.com/', ], ]; /** * Creates the miniProgram application. * * @return \EasyWeChat\Work\MiniProgram\Application */ public function miniProgram(): MiniProgram { return new MiniProgram($this->getConfig()); } /** * @param string $method * @param array $arguments * * @return mixed */ public function __call($method, $arguments) { return $this['base']->$method(...$arguments); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Auth/AccessToken.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Auth; use EasyWeChat\Kernel\AccessToken as BaseAccessToken; /** * Class AccessToken. * * @author mingyoung */ class AccessToken extends BaseAccessToken { /** * @var string */ protected $endpointToGetToken = 'cgi-bin/gettoken'; /** * @var int */ protected $safeSeconds = 0; /** * Credential for get token. * * @return array */ protected function getCredentials(): array { return [ 'corpid' => $this->app['config']['corp_id'], 'corpsecret' => $this->app['config']['secret'], ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Auth/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Auth; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author lujunyi */ class Client extends BaseClient { /** * 获取网页授权登录url,适用于自建应用与代开发应用。 * * @see https://developer.work.weixin.qq.com/document/path/91022 * * @param string $redirectUri * @param string $scope * @param string $agentId * @param string|null $state * * @return string * @throws \Exception */ public function getOAuthRedirectUrl(string $redirectUri = '', string $scope = 'snsapi_privateinfo', string $agentId = '', string $state = null) { $redirectUri || $redirectUri = $this->app->config['redirect_uri_oauth']; $state || $state = random_bytes(64); $params = [ 'appid' => $this->app['config']['suite_id'], 'redirect_uri' => $redirectUri, 'response_type' => 'code', 'scope' => $scope, 'state' => $state, 'agentid' => $agentId, ]; return 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query($params) . '#wechat_redirect'; } /** * 获取访问用户身份。根据code获取成员信息,适用于自建应用与代开发应用。 * * @see https://developer.work.weixin.qq.com/document/path/91023 * * @param string $code * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUserByCode(string $code) { $params = [ 'code' => $code, ]; return $this->httpGet('cgi-bin/auth/getuserinfo', $params); } /** * 获取访问用户敏感信息。自建应用与代开发应用可通过该接口获取成员授权的敏感字段。 * * @see https://developer.work.weixin.qq.com/document/path/95833 * * @param string $userTicket * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUserByTicket(string $userTicket) { $params = [ 'user_ticket' => $userTicket, ]; return $this->httpPostJson('cgi-bin/auth/getuserdetail', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Auth/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Auth; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { isset($app['access_token']) || $app['access_token'] = function ($app) { return new AccessToken($app); }; !isset($app['auth']) && $app['auth'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Base/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Base; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Get callback ip. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getCallbackIp() { return $this->httpGet('cgi-bin/getcallbackip'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Base/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Base; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * @param Container $app */ public function register(Container $app) { $app['base'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Calendar/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Calendar; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author her-cat */ class Client extends BaseClient { /** * Add a calendar. * * @param array $calendar * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(array $calendar) { return $this->httpPostJson('cgi-bin/oa/calendar/add', compact('calendar')); } /** * Update the calendar. * * @param string $id * @param array $calendar * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $id, array $calendar) { $calendar += ['cal_id' => $id]; return $this->httpPostJson('cgi-bin/oa/calendar/update', compact('calendar')); } /** * Get one or more calendars. * * @param string|array $ids * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get($ids) { return $this->httpPostJson('cgi-bin/oa/calendar/get', ['cal_id_list' => (array) $ids]); } /** * Delete a calendar. * * @param string $id * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $id) { return $this->httpPostJson('cgi-bin/oa/calendar/del', ['cal_id' => $id]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Calendar/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Calendar; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author her-cat */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} */ public function register(Container $app) { $app['calendar'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Chat/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Chat; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author XiaolonY */ class Client extends BaseClient { /** * Get chat. * * @param string $chatId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function get(string $chatId) { return $this->httpGet('cgi-bin/appchat/get', ['chatid' => $chatId]); } /** * Create chat. * * @param array $data * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $data) { return $this->httpPostJson('cgi-bin/appchat/create', $data); } /** * Update chat. * * @param string $chatId * @param array $data * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $chatId, array $data) { return $this->httpPostJson('cgi-bin/appchat/update', array_merge(['chatid' => $chatId], $data)); } /** * Send a message. * * @param array $message * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $message) { return $this->httpPostJson('cgi-bin/appchat/send', $message); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Chat/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Chat; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author XiaolonY */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['chat'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/CorpGroup/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\CorpGroup; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author 读心印 */ class Client extends BaseClient { /** * 获取应用共享信息. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93403 * * @param int $agentId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getAppShareInfo(int $agentId) { $params = [ 'agentid' => $agentId ]; return $this->httpPostJson('cgi-bin/corpgroup/corp/list_app_share_info', $params); } /** * 获取下级企业的access_token. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93359 * * @param string $corpId * @param int $agentId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getToken(string $corpId, int $agentId) { $params = [ 'corpid' => $corpId, 'agentid' => $agentId ]; return $this->httpPostJson('cgi-bin/corpgroup/corp/gettoken', $params); } /** * 获取下级企业的小程序session. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93355 * * @param string $userId * @param string $sessionKey * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getMiniProgramTransferSession(string $userId, string $sessionKey) { $params = [ 'userid' => $userId, 'session_key' => $sessionKey ]; return $this->httpPostJson('cgi-bin/miniprogram/transfer_session', $params); } /** * 将明文corpid转换为第三方应用获取的corpid(仅限第三方服务商,转换已获授权企业的corpid) * * @see https://open.work.weixin.qq.com/api/doc/90001/90143/95327#1.4%20corpid%E8%BD%AC%E6%8D%A2 * * @param string $corpId 获取到的企业ID * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getOpenCorpid(string $corpId) { return $this->httpPostJson('cgi-bin/corp/to_open_corpid', ['corpid' => $corpId]); } /** * 将自建应用获取的userid转换为第三方应用获取的userid(仅代开发自建应用或第三方应用可调用) * * @see https://open.work.weixin.qq.com/api/doc/90001/90143/95327#2.4%20userid%E7%9A%84%E8%BD%AC%E6%8D%A2 * * @param array $useridList 获取到的成员ID * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function batchUseridToOpenUserid(array $useridList) { return $this->httpPostJson('cgi-bin/batch/userid_to_openuserid', ['userid_list' => $useridList]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/CorpGroup/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\CorpGroup; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * ServiceProvider. * * @author 读心印 */ class ServiceProvider implements ServiceProviderInterface { protected $app; /** * @param Container $app */ public function register(Container $app) { $app['corp_group'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Department/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Department; use EasyWeChat\Kernel\BaseClient; /** * This is WeWork Department Client. * * @author mingyoung */ class Client extends BaseClient { /** * Create a department. * * @param array $data * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $data) { return $this->httpPostJson('cgi-bin/department/create', $data); } /** * Update a department. * * @param int $id * @param array $data * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(int $id, array $data) { return $this->httpPostJson('cgi-bin/department/update', array_merge(compact('id'), $data)); } /** * Delete a department. * * @param int $id * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function delete(int $id) { return $this->httpGet('cgi-bin/department/delete', compact('id')); } /** * Get department lists. * * @param int|null $id * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function list(?int $id = null) { return $this->httpGet('cgi-bin/department/list', compact('id')); } /** * Get sub department lists. * * @param null|int $id * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function simpleList(?int $id = null) { return $this->httpGet('cgi-bin/department/simplelist', compact('id')); } /** * Get department details. * * @param int $id * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function get(int $id) { return $this->httpGet('cgi-bin/department/get', compact('id')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Department/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Department; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['department'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * 获取配置了客户联系功能的成员列表. * * @see https://work.weixin.qq.com/api/doc#90000/90135/91554 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function getFollowUsers() { return $this->httpGet('cgi-bin/externalcontact/get_follow_user_list'); } /** * 获取外部联系人列表. * * @see https://work.weixin.qq.com/api/doc#90000/90135/91555 * * @param string $userId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function list(string $userId) { return $this->httpGet('cgi-bin/externalcontact/list', [ 'userid' => $userId, ]); } /** * 批量获取客户详情. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92994 * * @param array $userIdList * @param string $cursor * @param integer $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function batchGet(array $userIdList, string $cursor = '', int $limit = 100) { return $this->httpPostJson('cgi-bin/externalcontact/batch/get_by_user', [ 'userid_list' => $userIdList, 'cursor' => $cursor, 'limit' => $limit, ]); } /** * 获取外部联系人详情. * * @see https://work.weixin.qq.com/api/doc#90000/90135/91556 * * @param string $externalUserId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function get(string $externalUserId) { return $this->httpGet('cgi-bin/externalcontact/get', [ 'external_userid' => $externalUserId, ]); } /** * 批量获取外部联系人详情. * * @see https://work.weixin.qq.com/api/doc/90001/90143/93010 * * @param array $userIdList * @param string $cursor * @param int $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function batchGetByUser(array $userIdList, string $cursor, int $limit) { return $this->httpPostJson('cgi-bin/externalcontact/batch/get_by_user', [ 'userid_list' => $userIdList, 'cursor' => $cursor, 'limit' => $limit ]); } /** * 修改客户备注信息. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92115 * * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function remark(array $data) { return $this->httpPostJson( 'cgi-bin/externalcontact/remark', $data ); } /** * 获取离职成员的客户列表. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92124 * * @param null|int $pageId * @param null|int $pageSize * @param string $cursor * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUnassigned(?int $pageId = null, ?int $pageSize = 1000, ?string $cursor = null) { $params = [ 'page_id' => $pageId, 'page_size' => $pageSize, 'cursor' => $cursor, ]; $writableParams = array_filter($params, function (string $key) use ($params) { return !is_null($params[$key]); }, ARRAY_FILTER_USE_KEY); return $this->httpPostJson('cgi-bin/externalcontact/get_unassigned_list', $writableParams); } /** * 离职成员的外部联系人再分配. * * @see https://work.weixin.qq.com/api/doc#90000/90135/91564 * * @param string $externalUserId * @param string $handoverUserId * @param string $takeoverUserId * @param string $transferSuccessMessage * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function transfer(string $externalUserId, string $handoverUserId, string $takeoverUserId, string $transferSuccessMessage) { $params = [ 'external_userid' => $externalUserId, 'handover_userid' => $handoverUserId, 'takeover_userid' => $takeoverUserId, 'transfer_success_msg' => $transferSuccessMessage ]; return $this->httpPostJson('cgi-bin/externalcontact/transfer', $params); } /** * 分配在职成员的客户. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92125 * * @param array $externalUserId * @param string $handoverUserId * @param string $takeoverUserId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function transferCustomer(array $externalUserId, string $handoverUserId, string $takeoverUserId, string $transferSuccessMessage) { $params = [ 'external_userid' => $externalUserId, 'handover_userid' => $handoverUserId, 'takeover_userid' => $takeoverUserId, 'transfer_success_msg' => $transferSuccessMessage ]; return $this->httpPostJson('cgi-bin/externalcontact/transfer_customer', $params); } /** * 分配离职成员的客户. * * @see https://work.weixin.qq.com/api/doc/90000/90135/94081 * * @param array $externalUserId * @param string $handoverUserId * @param string $takeoverUserId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function resignedTransferCustomer(array $externalUserId, string $handoverUserId, string $takeoverUserId) { $params = [ 'external_userid' => $externalUserId, 'handover_userid' => $handoverUserId, 'takeover_userid' => $takeoverUserId, ]; return $this->httpPostJson('cgi-bin/externalcontact/resigned/transfer_customer', $params); } /** * 离职成员的群再分配. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92127 * * @param array $chatIds * @param string $newOwner * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function transferGroupChat(array $chatIds, string $newOwner) { $params = [ 'chat_id_list' => $chatIds, 'new_owner' => $newOwner ]; return $this->httpPostJson('cgi-bin/externalcontact/groupchat/transfer', $params); } /** * 查询客户接替状态. * * @see https://work.weixin.qq.com/api/doc/90000/90135/94082 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @param string $handoverUserId * @param string $takeoverUserId * @param null|string $cursor * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function transferResult(string $handoverUserId, string $takeoverUserId, ?string $cursor = null) { $params = [ 'handover_userid' => $handoverUserId, 'takeover_userid' => $takeoverUserId, 'cursor' => $cursor, ]; return $this->httpPostJson('cgi-bin/externalcontact/resigned/transfer_result', $params); } /** * 查询客户接替结果. * * @see https://work.weixin.qq.com/api/doc/90001/90143/93009 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @param string $externalUserId * @param string $handoverUserId * @param string $takeoverUserId * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTransferResult(string $externalUserId, string $handoverUserId, string $takeoverUserId) { $params = [ 'external_userid' => $externalUserId, 'handover_userid' => $handoverUserId, 'takeover_userid' => $takeoverUserId, ]; return $this->httpPostJson('cgi-bin/externalcontact/get_transfer_result', $params); } /** * 获取客户群列表. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92120 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getGroupChats(array $params) { return $this->httpPostJson('cgi-bin/externalcontact/groupchat/list', $params); } /** * 获取客户群详情. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92122 * * @param string $chatId * @param int $needName * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getGroupChat(string $chatId, int $needName = 0) { $params = [ 'chat_id' => $chatId, 'need_name' => $needName, ]; return $this->httpPostJson('cgi-bin/externalcontact/groupchat/get', $params); } /** * 获取企业标签库. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92117#获取企业标签库 * * @param array $tagIds * @param array $groupIds * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getCorpTags(array $tagIds = [], array $groupIds = []) { $params = [ 'tag_id' => $tagIds, 'group_id' => $groupIds ]; return $this->httpPostJson('cgi-bin/externalcontact/get_corp_tag_list', $params); } /** * 添加企业客户标签. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92117#添加企业客户标签 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addCorpTag(array $params) { return $this->httpPostJson('cgi-bin/externalcontact/add_corp_tag', $params); } /** * 编辑企业客户标签. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92117#编辑企业客户标签 * * @param string $id * @param string|null $name * @param int|null $order * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateCorpTag(string $id, ?string $name = null, ?int $order = null) { $params = [ "id" => $id ]; if (!\is_null($name)) { $params['name'] = $name; } if (!\is_null($order)) { $params['order'] = $order; } return $this->httpPostJson('cgi-bin/externalcontact/edit_corp_tag', $params); } /** * 删除企业客户标签. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92117#删除企业客户标签 * * @param array $tagId * @param array $groupId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deleteCorpTag(array $tagId, array $groupId) { $params = [ "tag_id" => $tagId, "group_id" => $groupId, ]; return $this->httpPostJson('cgi-bin/externalcontact/del_corp_tag', $params); } /** * 编辑客户企业标签. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92118 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function markTags(array $params) { return $this->httpPostJson('cgi-bin/externalcontact/mark_tag', $params); } /** * 外部联系人unionid转换. * * @see https://work.weixin.qq.com/api/doc/90001/90143/93274 * * @param string|null $unionid 微信客户的unionid * @param string|null $openid 微信客户的openid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function unionidToExternalUserid(?string $unionid = null, ?string $openid = null) { return $this->httpPostJson( 'cgi-bin/externalcontact/unionid_to_external_userid', [ 'unionid' => $unionid, 'openid' => $openid, ] ); } /** * 代开发应用external_userid转换. * * @see https://work.weixin.qq.com/api/doc/90001/90143/95195 * * @param string $externalUserid 代开发自建应用获取到的外部联系人ID * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function toServiceExternalUserid(string $externalUserid) { return $this->httpPostJson( 'cgi-bin/externalcontact/to_service_external_userid', [ 'external_userid' => $externalUserid, ] ); } /** * 转换external_userid * * @see https://open.work.weixin.qq.com/api/doc/90001/90143/95327 * * @param array $externalUserIds * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @author 读心印 */ public function getNewExternalUserid(array $externalUserIds) { return $this->httpPostJson('cgi-bin/externalcontact/get_new_external_userid', ['external_userid_list' => $externalUserIds]); } /** * 设置迁移完成 * * @see https://open.work.weixin.qq.com/api/doc/90001/90143/95327 * * @param string $corpid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @author 读心印 */ public function finishExternalUseridMigration(string $corpid) { return $this->httpPostJson('cgi-bin/externalcontact/finish_external_userid_migration', ['corpid' => $corpid]); } /** * unionid查询external_userid * * @param string $unionid * @param string $openid * @param string $corpid * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @deprecated 使用新方法`\EasyWeChat\OpenWork\Corp\unionidToExternalUserid` * * @see https://open.work.weixin.qq.com/api/doc/90001/90143/95327 * * @author 读心印 */ public function unionidToexternalUserid3rd(string $unionid, string $openid, string $corpid = '') { $params = [ 'unionid' => $unionid, 'openid' => $openid, 'corpid' => $corpid ]; return $this->httpPostJson('cgi-bin/externalcontact/unionid_to_external_userid_3rd', $params); } /** * 客户群opengid转换 * * @see https://work.weixin.qq.com/api/doc/90000/90135/94822 * @param string $opengid 小程序在微信获取到的群ID * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function opengidToChatid(string $opengid) { return $this->httpPostJson('cgi-bin/externalcontact/opengid_to_chatid', compact('opengid')); } /** * 上传附件资源 * * @see https://work.weixin.qq.com/api/doc/90000/90135/95098 * @param string $path 附件资源路径 * @param string $mediaType 媒体文件类型 * @param string $attachmentType 附件类型 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadAttachment(string $path, string $mediaType, string $attachmentType) { $query = [ 'media_type' => $mediaType, 'attachment_type' => $attachmentType, ]; return $this->httpUpload('cgi-bin/media/upload_attachment', ['media' => $path], [], $query); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/ContactWayClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use EasyWeChat\Kernel\BaseClient; /** * Class ContactWayClient. * * @author milkmeowo */ class ContactWayClient extends BaseClient { /** * 配置客户联系「联系我」方式. * * @param int $type * @param int $scene * @param array $config * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(int $type, int $scene, array $config = []) { $params = array_merge([ 'type' => $type, 'scene' => $scene, ], $config); return $this->httpPostJson('cgi-bin/externalcontact/add_contact_way', $params); } /** * 获取企业已配置的「联系我」方式. * * @param string $configId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $configId) { return $this->httpPostJson('cgi-bin/externalcontact/get_contact_way', [ 'config_id' => $configId, ]); } /** * 更新企业已配置的「联系我」方式. * * @param string $configId * @param array $config * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $configId, array $config = []) { $params = array_merge([ 'config_id' => $configId, ], $config); return $this->httpPostJson('cgi-bin/externalcontact/update_contact_way', $params); } /** * 删除企业已配置的「联系我」方式. * * @param string $configId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $configId) { return $this->httpPostJson('cgi-bin/externalcontact/del_contact_way', [ 'config_id' => $configId, ]); } /** * 获取企业已配置的「联系我」列表,注意,该接口仅可获取2021年7月10日以后创建的「联系我」 * * @param string $cursor 分页查询使用的游标,为上次请求返回的 next_cursor * @param int $limit 每次查询的分页大小,默认为100条,最多支持1000条 * @param int|null $startTime 「联系我」创建起始时间戳, 不传默认为90天前 * @param int|null $endTime 「联系我」创建结束时间戳, 不传默认为当前时间 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(string $cursor = '', int $limit = 100, int $startTime = null, int $endTime = null) { $data = [ 'cursor' => $cursor, 'limit' => $limit, ]; if ($startTime) { $data['start_time'] = $startTime; } if ($endTime) { $data['end_time'] = $endTime; } return $this->httpPostJson('cgi-bin/externalcontact/list_contact_way', $data); } /** * 结束临时会话 * * 将指定的企业成员和客户之前的临时会话断开,断开前会自动下发已配置的结束语。 * * 注意:请保证传入的企业成员和客户之间有仍然有效的临时会话, 通过其他方式的添加外部联系人无法通过此接口关闭会话。 * @param string $userId 企业成员的user_id * @param string $externalUserId 客户的外部联系人user_id * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection */ public function closeTempChat(string $userId, string $externalUserId) { return $this->httpPostJson('cgi-bin/externalcontact/close_temp_chat', [ 'userid' => $userId, 'external_userid' => $externalUserId ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/GroupChatWayClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use EasyWeChat\Kernel\BaseClient; /** * Class GroupChatWayClient. * * @see https://developer.work.weixin.qq.com/document/path/92229 * * @author SinyLi */ class GroupChatWayClient extends BaseClient { /** * 配置客户群进群方式 * * @param array $params 创建参数 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $params) { return $this->httpPostJson('cgi-bin/externalcontact/groupchat/add_join_way', $params); } /** * 获取客户群进群方式配置 * * @param string $configId 联系方式的配置id * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $configId) { $params = [ 'config_id' => $configId ]; return $this->httpPostJson('cgi-bin/externalcontact/groupchat/get_join_way', $params); } /** * 更新客户群进群方式配置,注意:使用覆盖的方式更新 * * @param string $configId 企业联系方式的配置id * @param array $config 更新参数 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $configId, array $config = []) { $params = array_merge([ 'config_id' => $configId, ], $config); return $this->httpPostJson('cgi-bin/externalcontact/groupchat/update_join_way', $params); } /** * 删除客户群进群方式配置 * * @param string $configId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $configId) { $params = [ 'config_id' => $configId ]; return $this->httpPostJson('cgi-bin/externalcontact/groupchat/del_join_way', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/InterceptClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use EasyWeChat\Kernel\BaseClient; /** * Class InterceptClient. * * @package EasyWeChat\Work\ExternalContact * * @author 读心印 */ class InterceptClient extends BaseClient { /** * 新建敏感词规则. * * @see https://developer.work.weixin.qq.com/document/path/95097#新建敏感词规则 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @author 读心印 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function createInterceptRule(array $params) { return $this->httpPostJson('cgi-bin/externalcontact/add_intercept_rule', $params); } /** * 获取敏感词规则列表. * * @see https://developer.work.weixin.qq.com/document/path/95097#获取敏感词规则列表 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @author 读心印 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getInterceptRules() { return $this->httpGet('cgi-bin/externalcontact/get_intercept_rule_list'); } /** * 获取敏感词规则详情. * * @see https://developer.work.weixin.qq.com/document/path/95097#获取敏感词规则详情 * * @param string $ruleId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @author 读心印 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getInterceptRuleDetails(string $ruleId) { $params = [ 'rule_id' => $ruleId ]; return $this->httpPostJson('cgi-bin/externalcontact/get_intercept_rule', $params); } /** * 删除敏感词规则. * * @see https://developer.work.weixin.qq.com/document/path/95097#删除敏感词规则 * * @param string $ruleId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @author 读心印 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function deleteInterceptRule(string $ruleId) { $params = [ 'rule_id' => $ruleId ]; return $this->httpPostJson('cgi-bin/externalcontact/del_intercept_rule', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/MessageClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class MessageClient. * * @author milkmeowo */ class MessageClient extends BaseClient { /** * Required attributes. * * @var array */ protected $required = ['content', 'title', 'url', 'pic_media_id', 'appid', 'page']; protected $textMessage = [ 'content' => '', ]; protected $imageMessage = [ ]; protected $linkMessage = [ 'title' => '', 'picurl' => '', 'desc' => '', 'url' => '', ]; protected $miniprogramMessage = [ 'title' => '', 'pic_media_id' => '', 'appid' => '', 'page' => '', ]; /** * 添加企业群发消息模板 * * @see https://work.weixin.qq.com/api/doc#90000/90135/91560 * * @param array $msg * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function submit(array $msg) { $params = $this->formatMessage($msg); return $this->httpPostJson('cgi-bin/externalcontact/add_msg_template', $params); } /** * 获取企业群发消息发送结果. * * @see https://developer.work.weixin.qq.com/document/16251 * * @param string $msgId 群发消息的id,通过{@see MessageClient::submit() 添加企业群发消息模板}接口返回 * @param int $limit 返回的最大记录数,整型,最大值10000,默认值10000 * @param string|null $cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用可不填 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @noinspection PhpFullyQualifiedNameUsageInspection * @noinspection SpellCheckingInspection */ public function get(string $msgId, int $limit = 10000, ?string $cursor = null) { return $this->httpPostJson('cgi-bin/externalcontact/get_group_msg_result', [ 'msgid' => $msgId, 'limit' => $limit, 'cursor' => $cursor ]); } /** * 获取群发记录列表. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93338#%E8%8E%B7%E5%8F%96%E7%BE%A4%E5%8F%91%E8%AE%B0%E5%BD%95%E5%88%97%E8%A1%A8 * * @param string $chatType 群发任务的类型,默认为single,表示发送给客户,group表示发送给客户群 * @param int $startTime 群发任务记录开始时间 * @param int $endTime 群发任务记录结束时间 * @param string|null $creator 群发任务创建人企业账号id * @param int|null $filterType 创建人类型。0:企业发表 1:个人发表 2:所有,包括个人创建以及企业创建,默认情况下为所有类型 * @param int|null $limit 返回的最大记录数,整型,最大值100,默认值50,超过最大值时取默认值 * @param string|null $cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用可不填 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getGroupmsgListV2(string $chatType, int $startTime, int $endTime, ?string $creator = null, ?int $filterType = null, ?int $limit = null, ?string $cursor = null) { $data = [ 'chat_type' => $chatType, 'start_time' => $startTime, 'end_time' => $endTime, 'creator' => $creator, 'filter_type' => $filterType, 'limit' => $limit, 'cursor' => $cursor, ]; $writableData = array_filter($data, function (string $key) use ($data) { return !is_null($data[$key]); }, ARRAY_FILTER_USE_KEY); return $this->httpPostJson('cgi-bin/externalcontact/get_groupmsg_list_v2', $writableData); } /** * 获取群发成员发送任务列表. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93338#%E8%8E%B7%E5%8F%96%E7%BE%A4%E5%8F%91%E6%88%90%E5%91%98%E5%8F%91%E9%80%81%E4%BB%BB%E5%8A%A1%E5%88%97%E8%A1%A8 * * @param string $msgId 群发消息的id,通过获取群发记录列表接口返回 * @param int|null $limit 返回的最大记录数,整型,最大值1000,默认值500,超过最大值时取默认值 * @param string|null $cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用可不填 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getGroupmsgTask(string $msgId, ?int $limit = null, ?string $cursor = null) { $data = [ 'msgid' => $msgId, 'limit' => $limit, 'cursor' => $cursor, ]; $writableData = array_filter($data, function (string $key) use ($data) { return !is_null($data[$key]); }, ARRAY_FILTER_USE_KEY); return $this->httpPostJson('cgi-bin/externalcontact/get_groupmsg_task', $writableData); } /** * 获取企业群发成员执行结果. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93338#%E8%8E%B7%E5%8F%96%E4%BC%81%E4%B8%9A%E7%BE%A4%E5%8F%91%E6%88%90%E5%91%98%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C * * @param string $msgId 群发消息的id,通过获取群发记录列表接口返回 * @param string $userid 发送成员userid,通过获取群发成员发送任务列表接口返回 * @param int|null $limit 返回的最大记录数,整型,最大值1000,默认值500,超过最大值时取默认值 * @param string|null $cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用可不填 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getGroupmsgSendResult(string $msgId, string $userid, ?int $limit = null, ?string $cursor = null) { $data = [ 'msgid' => $msgId, 'userid' => $userid, 'limit' => $limit, 'cursor' => $cursor, ]; $writableData = array_filter($data, function (string $key) use ($data) { return !is_null($data[$key]); }, ARRAY_FILTER_USE_KEY); return $this->httpPostJson('cgi-bin/externalcontact/get_groupmsg_send_result', $writableData); } /** * 发送新客户欢迎语. * * @see https://work.weixin.qq.com/api/doc#90000/90135/91688 * * @param string $welcomeCode * @param array $msg * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function sendWelcome(string $welcomeCode, array $msg) { $formattedMsg = $this->formatMessage($msg); $params = array_merge($formattedMsg, [ 'welcome_code' => $welcomeCode, ]); return $this->httpPostJson('cgi-bin/externalcontact/send_welcome_msg', $params); } /** * @param array $data * * @return array * * @throws InvalidArgumentException */ protected function formatMessage(array $data = []) { $params = $data; if (!empty($params['text'])) { $params['text'] = $this->formatFields($params['text'], $this->textMessage); } if (!empty($params['image'])) { $params['image'] = $this->formatFields($params['image'], $this->imageMessage); } if (!empty($params['link'])) { $params['link'] = $this->formatFields($params['link'], $this->linkMessage); } if (!empty($params['miniprogram'])) { $params['miniprogram'] = $this->formatFields($params['miniprogram'], $this->miniprogramMessage); } return $params; } /** * @param array $data * @param array $default * * @return array * * @throws InvalidArgumentException */ protected function formatFields(array $data = [], array $default = []) { $params = array_merge($default, $data); foreach ($params as $key => $value) { if (in_array($key, $this->required, true) && empty($value) && empty($default[$key])) { throw new InvalidArgumentException(sprintf('Attribute "%s" can not be empty!', $key)); } $params[$key] = empty($value) ? $default[$key] : $value; } return $params; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/MessageTemplateClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class MessageTemplateClient. * * @author ljyljy0211 */ class MessageTemplateClient extends BaseClient { /** * Required attributes. * * @var array */ protected $required = ['title', 'url', 'pic_media_id', 'appid', 'page']; protected $textMessage = [ 'content' => '', ]; protected $imageMessage = [ 'media_id' => '', 'pic_url' => '', ]; protected $linkMessage = [ 'title' => '', 'picurl' => '', 'desc' => '', 'url' => '', ]; protected $miniprogramMessage = [ 'title' => '', 'pic_media_id' => '', 'appid' => '', 'page' => '', ]; /** * 添加入群欢迎语素材. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92366 * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string */ public function create(array $msgTemplate) { $params = $this->formatMessage($msgTemplate); return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/add', $params); } /** * 编辑入群欢迎语素材. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92366 * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string */ public function update(string $templateId, array $msgTemplate) { $params = $this->formatMessage($msgTemplate); $params = array_merge([ 'template_id' => $templateId, ], $params); return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/edit', $params); } /** * 获取入群欢迎语素材. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92366 * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string */ public function get(string $templateId) { return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/get', [ 'template_id' => $templateId, ]); } /** * 删除入群欢迎语素材. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92366 * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string */ public function delete(string $templateId) { return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/del', [ 'template_id' => $templateId, ]); } /** * @throws InvalidArgumentException * @return array */ protected function formatMessage(array $data = []) { $params = $data; if (!empty($params['text'])) { $params['text'] = $this->formatFields($params['text'], $this->textMessage); } if (!empty($params['image'])) { $params['image'] = $this->formatFields($params['image'], $this->imageMessage); } if (!empty($params['link'])) { $params['link'] = $this->formatFields($params['link'], $this->linkMessage); } if (!empty($params['miniprogram'])) { $params['miniprogram'] = $this->formatFields($params['miniprogram'], $this->miniprogramMessage); } return $params; } /** * @throws InvalidArgumentException * @return array */ protected function formatFields(array $data = [], array $default = []) { $params = array_merge($default, $data); foreach ($params as $key => $value) { if (in_array($key, $this->required, true) && empty($value) && empty($default[$key])) { throw new InvalidArgumentException(sprintf('Attribute "%s" can not be empty!', $key)); } $params[$key] = empty($value) ? $default[$key] : $value; } return $params; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/MomentClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use EasyWeChat\Kernel\BaseClient; /** * Class MomentClient. * * @author 读心印 */ class MomentClient extends BaseClient { /** * 创建发表任务 * * @see https://work.weixin.qq.com/api/doc/90000/90135/95094#%E5%88%9B%E5%BB%BA%E5%8F%91%E8%A1%A8%E4%BB%BB%E5%8A%A1 * @param array $param * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createTask(array $param) { return $this->httpPostJson('cgi-bin/externalcontact/add_moment_task', $param); } /** * 获取任务创建结果 * * @see https://work.weixin.qq.com/api/doc/90000/90135/95094#%E8%8E%B7%E5%8F%96%E4%BB%BB%E5%8A%A1%E5%88%9B%E5%BB%BA%E7%BB%93%E6%9E%9C * * @param string $jobId 异步任务id * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getTask(string $jobId) { return $this->httpGet('cgi-bin/externalcontact/get_moment_task_result', ['jobid' => $jobId]); } /** * 获取企业全部的发表列表. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93333#获取企业全部的发表列表 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function list(array $params) { return $this->httpPostJson('cgi-bin/externalcontact/get_moment_list', $params); } /** * 获取客户朋友圈企业发表的列表. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93333#获取客户朋友圈企业发表的列表 * * @param string $momentId * @param string $cursor * @param int $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function getTasks(string $momentId, string $cursor = '', int $limit = 500) { $params = [ 'moment_id' => $momentId, 'cursor' => $cursor, 'limit' => $limit ]; return $this->httpPostJson('cgi-bin/externalcontact/get_moment_task', $params); } /** * 获取客户朋友圈发表时选择的可见范围. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93333#获取客户朋友圈发表时选择的可见范围 * * @param string $momentId * @param string $userId * @param string $cursor * @param int $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function getCustomers(string $momentId, string $userId, string $cursor, int $limit) { $params = [ 'moment_id' => $momentId, 'userid' => $userId, 'cursor' => $cursor, 'limit' => $limit ]; return $this->httpPostJson('cgi-bin/externalcontact/get_moment_customer_list', $params); } /** * 获取客户朋友圈发表后的可见客户列表. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93333#获取客户朋友圈发表后的可见客户列表 * * @param string $momentId * @param string $userId * @param string $cursor * @param int $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function getSendResult(string $momentId, string $userId, string $cursor, int $limit) { $params = [ 'moment_id' => $momentId, 'userid' => $userId, 'cursor' => $cursor, 'limit' => $limit ]; return $this->httpPostJson('cgi-bin/externalcontact/get_moment_send_result', $params); } /** * 获取客户朋友圈的互动数据. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93333#获取客户朋友圈的互动数据 * * @param string $momentId * @param string $userId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function getComments(string $momentId, string $userId) { $params = [ 'moment_id' => $momentId, 'userid' => $userId ]; return $this->httpPostJson('cgi-bin/externalcontact/get_moment_comments', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/ProductClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use EasyWeChat\Kernel\BaseClient; /** * Class ProductClient. * * @package EasyWeChat\Work\ExternalContact * * @author 读心印 */ class ProductClient extends BaseClient { /** * 创建商品图册. * * @see https://developer.work.weixin.qq.com/document/path/95096 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @author 读心印 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function createProductAlbum(array $params) { return $this->httpPostJson('cgi-bin/externalcontact/add_product_album', $params); } /** * 获取商品图册. * * @see https://developer.work.weixin.qq.com/document/path/95096 * * @param string $productId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @author 读心印 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getProductAlbumDetails(string $productId) { $params = [ 'product_id' => $productId ]; return $this->httpPostJson('cgi-bin/externalcontact/get_product_album', $params); } /** * 获取商品图册列表. * * @see https://developer.work.weixin.qq.com/document/path/95096 * * @param int $limit * @param string $cursor * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @author 读心印 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getProductAlbums(int $limit, string $cursor) { $params = [ 'limit' => $limit, 'cursor' => $cursor, ]; return $this->httpPostJson('cgi-bin/externalcontact/get_product_album_list', $params); } /** * 编辑商品图册. * * @see https://developer.work.weixin.qq.com/document/path/95096 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @author 读心印 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateProductAlbum(array $params) { return $this->httpPostJson('cgi-bin/externalcontact/update_product_album', $params); } /** * 删除商品图册. * * @see https://developer.work.weixin.qq.com/document/path/95096 * * @param string $productId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @author 读心印 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function deleteProductAlbum(string $productId) { $params = [ 'product_id' => $productId ]; return $this->httpPostJson('cgi-bin/externalcontact/delete_product_album', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/SchoolClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author MillsGuo */ class SchoolClient extends BaseClient { /** * 创建部门 * @see https://work.weixin.qq.com/api/doc/90000/90135/92340 * @param string $name * @param int $parentId * @param int $type * @param int $standardGrade * @param int $registerYear * @param int $order * @param array $departmentAdmins [['userid':'139','type':1],['userid':'1399','type':2]] * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function createDepartment(string $name, int $parentId, int $type, int $standardGrade, int $registerYear, int $order, array $departmentAdmins) { $params = [ 'name' => $name, 'parentid' => $parentId, 'type' => $type, 'standard_grade' => $standardGrade, 'register_year' => $registerYear, 'order' => $order, 'department_admins' => $departmentAdmins ]; return $this->httpPostJson('cgi-bin/school/department/create', $params); } /** * 更新部门 * @see https://work.weixin.qq.com/api/doc/90000/90135/92341 * @param int $id * @param string $name * @param int $parentId * @param int $type * @param int $standardGrade * @param int $registerYear * @param int $order * @param array $departmentAdmins [['op':0,'userid':'139','type':1],['op':1,'userid':'1399','type':2]] OP=0表示新增或更新,OP=1表示删除管理员 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateDepartment(int $id, string $name, int $parentId, int $type, int $standardGrade, int $registerYear, int $order, array $departmentAdmins) { $params = [ 'id' => $id, 'name' => $name, 'parentid' => $parentId, 'type' => $type, 'standard_grade' => $standardGrade, 'register_year' => $registerYear, 'order' => $order, 'department_admins' => $departmentAdmins ]; $params = $this->filterNullValue($params); return $this->httpPostJson('cgi-bin/school/department/update', $params); } /** * 删除部门 * @see https://work.weixin.qq.com/api/doc/90000/90135/92342 * @param int $id * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function deleteDepartment(int $id) { return $this->httpGet('cgi-bin/school/department/delete', [ 'id' => $id ]); } /** * 获取部门列表 * @see https://work.weixin.qq.com/api/doc/90000/90135/92343 * @param int $id 如果ID为0,则获取全量组织架构 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getDepartments(int $id) { if ($id > 0) { $params = [ 'id' => $id ]; } else { $params = []; } return $this->httpGet('cgi-bin/school/department/list', $params); } /** * 创建学生 * @see https://work.weixin.qq.com/api/doc/90000/90135/92325 * @param string $userId * @param string $name * @param array $department * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function createStudent(string $userId, string $name, array $department) { $params = [ 'student_userid' => $userId, 'name' => $name, 'department' => $department ]; return $this->httpPostJson('cgi-bin/school/user/create_student', $params); } /** * 删除学生 * @see https://work.weixin.qq.com/api/doc/90000/90135/92326 * @param string $userId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function deleteStudent(string $userId) { return $this->httpGet('cgi-bin/school/user/delete_student', [ 'userid' => $userId ]); } /** * 更新学生 * @see https://work.weixin.qq.com/api/doc/90000/90135/92327 * @param string $userId * @param string $name * @param string $newUserId * @param array $department * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateStudent(string $userId, string $name, string $newUserId, array $department) { $params = [ 'student_userid' => $userId ]; if (!empty($name)) { $params['name'] = $name; } if (!empty($newUserId)) { $params['new_student_userid'] = $newUserId; } if (!empty($department)) { $params['department'] = $department; } return $this->httpPostJson('cgi-bin/school/user/update_student', $params); } /** * 批量创建学生,学生最多100个 * @see https://work.weixin.qq.com/api/doc/90000/90135/92328 * @param array $students 学生格式:[[student_userid:'','name':'','department':[1,2]],['student_userid':'','name':'','department':[1,2]]] * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function batchCreateStudents(array $students) { $params = [ 'students' => $students ]; return $this->httpPostJson('cgi-bin/school/user/batch_create_student', $params); } /** * 批量删除学生,每次最多100个学生 * @see https://work.weixin.qq.com/api/doc/90000/90135/92329 * @param array $useridList 学生USERID,格式:['zhangsan','lisi'] * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function batchDeleteStudents(array $useridList) { return $this->httpPostJson('cgi-bin/school/user/batch_delete_student', [ 'useridlist' => $useridList ]); } /** * 批量更新学生,每次最多100个 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92042 * @param array $students 格式:[['student_userid':'lisi','new_student_userid':'lisi2','name':'','department':[1,2]],.....] * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function batchUpdateStudents(array $students) { return $this->httpPostJson('cgi-bin/school/user/batch_update_student', [ 'students' => $students ]); } /** * 创建家长 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92077 * @param string $userId * @param string $mobile * @param bool $toInvite * @param array $children * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function createParent(string $userId, string $mobile, bool $toInvite, array $children) { $params = [ 'parent_userid' => $userId, 'mobile' => $mobile, 'to_invite' => $toInvite, 'children' => $children ]; return $this->httpPostJson('cgi-bin/school/user/create_parent', $params); } /** * 删除家长 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92079 * @param string $userId * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function deleteParent(string $userId) { return $this->httpPostJson('cgi-bin/school/user/delete_parent', [ 'userid' => $userId ]); } /** * 更新家长 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92081 * @param string $userId * @param string $mobile * @param string $newUserId * @param array $children 格式:[['student_userid':'','relation':''],[]] * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function updateParent(string $userId, string $mobile, string $newUserId, array $children) { $params = [ 'parent_userid' => $userId ]; if (!empty($newUserId)) { $params['new_parent_userid'] = $newUserId; } if (!empty($mobile)) { $params['mobile'] = $mobile; } if (!empty($children)) { $params['children'] = $children; } return $this->httpPostJson('cgi-bin/school/user/update_parent', $params); } /** * 批量创建家长 每次最多100个 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92078 * @param array $parents [['parent_userid':'','mobile':'','to_invite':true,'children':['student_userid':'','relation':'']],.....] * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function batchCreateParents(array $parents) { return $this->httpPostJson('cgi-bin/school/user/batch_create_parent', [ 'parents' => $parents ]); } /** * 批量删除家长,每次最多100个 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92080 * @param array $userIdList 格式:['chang','lisi'] * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function batchDeleteParents(array $userIdList) { return $this->httpPostJson('cgi-bin/school/user/batch_delete_parent', [ 'useridlist' => $userIdList ]); } /** * 批量更新家长,每次最多100个 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92082 * @param array $parents 格式:[['parent_userid':'','new_parent_userid':'','mobile':'','children':[['student_userid':'','relation':''],...]],.....] * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function batchUpdateParents(array $parents) { return $this->httpPostJson('cgi-bin/school/user/batch_update_parent', [ 'parents' => $parents ]); } /** * 读取学生或家长 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92038 * @param string $userId 学生或家长的userid * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getUser(string $userId) { return $this->httpGet('cgi-bin/school/user/get', [ 'userid' => $userId ]); } /** * 获取部门成员详情 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92038 * @param int $departmentId * @param bool $fetchChild * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getStudents(int $departmentId, bool $fetchChild) { $params = [ 'department_id' => $departmentId ]; if ($fetchChild) { $params['fetch_child'] = 1; } else { $params['fetch_child'] = 0; } return $this->httpGet('cgi-bin/school/user/list', $params); } /** * 获取学校通知二维码 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92197 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getSubscribeQrCode() { return $this->httpGet('cgi-bin/externalcontact/get_subscribe_qr_code'); } /** * 设置关注学校通知的模式 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92290 * @param int $mode 关注模式,1可扫码填写资料加入,2禁止扫码填写资料加入 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function setSubscribeMode(int $mode) { return $this->httpPostJson('cgi-bin/externalcontact/set_subscribe_mode', [ 'subscribe_mode' => $mode ]); } /** * 获取关注学校通知的模式 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92290 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getSubscribeMode() { return $this->httpGet('cgi-bin/externalcontact/get_subscribe_mode'); } /** * 设置【老师可查看班级】的模式 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92652 * @param int $mode * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function setTeacherViewMode(int $mode) { return $this->httpPostJson('cgi-bin/school/set_teacher_view_mode', [ 'view_mode' => $mode ]); } /** * 获取【老师可查看班级】的模式 * @see https://open.work.weixin.qq.com/api/doc/90001/90143/92652 * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getTeacherViewMode() { return $this->httpGet('cgi-bin/school/get_teacher_view_mode'); } /** * 过滤数组中值为NULL的键 * @param array $data * @return array */ protected function filterNullValue(array $data) { $returnData = []; foreach ($data as $key => $value) { if ($value !== null) { $returnData[$key] = trim($value); } } return $returnData; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['external_contact'] = function ($app) { return new Client($app); }; $app['contact_way'] = function ($app) { return new ContactWayClient($app); }; $app['group_chat_way'] = function ($app) { return new GroupChatWayClient($app); }; $app['external_contact_statistics'] = function ($app) { return new StatisticsClient($app); }; $app['external_contact_message'] = function ($app) { return new MessageClient($app); }; $app['school'] = function ($app) { return new SchoolClient($app); }; $app['external_contact_moment'] = function ($app) { return new MomentClient($app); }; $app['external_contact_message_template'] = function ($app) { return new MessageTemplateClient($app); }; $app['product'] = function ($app) { return new ProductClient($app); }; $app['intercept'] = function ($app) { return new InterceptClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/ExternalContact/StatisticsClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\ExternalContact; use EasyWeChat\Kernel\BaseClient; /** * Class StatisticsClient. * * @author 读心印 */ class StatisticsClient extends BaseClient { /** * 获取「联系客户统计」数据. * * @see https://work.weixin.qq.com/api/doc/90000/90135/92132 * * @param array $userIds * @param string $from * @param string $to * @param array $partyIds * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function userBehavior(array $userIds, string $from, string $to, array $partyIds = []) { $params = [ 'userid' => $userIds, 'partyid' => $partyIds, 'start_time' => $from, 'end_time' => $to, ]; return $this->httpPostJson('cgi-bin/externalcontact/get_user_behavior_data', $params); } /** * 获取「群聊数据统计」数据. (按群主聚合的方式) * * @see https://work.weixin.qq.com/api/doc/90000/90135/92133 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function groupChatStatistic(array $params) { return $this->httpPostJson('cgi-bin/externalcontact/groupchat/statistic', $params); } /** * 获取「群聊数据统计」数据. (按自然日聚合的方式) * * @see https://work.weixin.qq.com/api/doc/90000/90135/92133 * * @param int $dayBeginTime * @param int $dayEndTime * @param array $userIds * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function groupChatStatisticGroupByDay(int $dayBeginTime, int $dayEndTime, array $userIds = []) { $params = [ 'day_begin_time' => $dayBeginTime, 'day_end_time' => $dayEndTime, 'owner_filter' => [ 'userid_list' => $userIds ] ]; return $this->httpPostJson('cgi-bin/externalcontact/groupchat/statistic_group_by_day', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupRobot; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Work\GroupRobot\Messages\Message; /** * Class Client. * * @author her-cat */ class Client extends BaseClient { /** * @param string|Message $message * * @return Messenger * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function message($message) { return (new Messenger($this))->message($message); } /** * @param string $key * @param array $message * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(string $key, array $message) { $this->accessToken = null; return $this->httpPostJson('cgi-bin/webhook/send', $message, ['key' => $key]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/Image.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupRobot\Messages; /** * Class Image. * * @author her-cat */ class Image extends Message { /** * @var string */ protected $type = 'image'; /** * @var array */ protected $properties = ['base64', 'md5']; /** * Image constructor. * * @param string $base64 * @param string $md5 */ public function __construct(string $base64, string $md5) { parent::__construct(compact('base64', 'md5')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/Markdown.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupRobot\Messages; /** * Class Markdown. * * @author her-cat */ class Markdown extends Message { /** * @var string */ protected $type = 'markdown'; /** * @var array */ protected $properties = ['content']; /** * Markdown constructor. * * @param string $content */ public function __construct(string $content) { parent::__construct(compact('content')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/Message.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupRobot\Messages; use EasyWeChat\Kernel\Messages\Message as BaseMessage; /** * Class Message. * * @author her-cat */ class Message extends BaseMessage { } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/News.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupRobot\Messages; /** * Class News. * * @author her-cat */ class News extends Message { /** * @var string */ protected $type = 'news'; /** * @var array */ protected $properties = ['items']; /** * News constructor. * * @param array $items */ public function __construct(array $items = []) { parent::__construct(compact('items')); } /** * @param array $data * @param array $aliases * * @return array */ public function propertiesToArray(array $data, array $aliases = []): array { return ['articles' => array_map(function ($item) { if ($item instanceof NewsItem) { return $item->toJsonArray(); } }, $this->get('items'))]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/NewsItem.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupRobot\Messages; /** * Class NewsItem. * * @author her-cat */ class NewsItem extends Message { /** * @var string */ protected $type = 'news'; /** * @var array */ protected $properties = [ 'title', 'description', 'url', 'image', ]; public function toJsonArray() { return [ 'title' => $this->get('title'), 'description' => $this->get('description'), 'url' => $this->get('url'), 'picurl' => $this->get('image'), ]; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messages/Text.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupRobot\Messages; /** * Class Text. * * @author her-cat */ class Text extends Message { /** * @var string */ protected $type = 'text'; /** * @var array */ protected $properties = ['content', 'mentioned_list', 'mentioned_mobile_list']; /** * Text constructor. * * @param string $content * @param string|array $userIds * @param string|array $mobiles */ public function __construct(string $content, $userIds = [], $mobiles = []) { parent::__construct([ 'content' => $content, 'mentioned_list' => (array) $userIds, 'mentioned_mobile_list' => (array) $mobiles, ]); } /** * @param array $userIds * * @return Text */ public function mention($userIds) { $this->set('mentioned_list', (array) $userIds); return $this; } /** * @param array $mobiles * * @return Text */ public function mentionByMobile($mobiles) { $this->set('mentioned_mobile_list', (array) $mobiles); return $this; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/Messenger.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupRobot; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Exceptions\InvalidConfigException; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Work\GroupRobot\Messages\Message; use EasyWeChat\Work\GroupRobot\Messages\Text; /** * Class Messenger. * * @author her-cat */ class Messenger { /** * @var Client */ protected $client; /** * @var Message|null */ protected $message; /** * @var string|null */ protected $groupKey; /** * Messenger constructor. * * @param Client $client */ public function __construct(Client $client) { $this->client = $client; } /** * @param string|Message $message * * @return Messenger * * @throws InvalidArgumentException */ public function message($message) { if (is_string($message) || is_numeric($message)) { $message = new Text($message); } if (!($message instanceof Message)) { throw new InvalidArgumentException('Invalid message.'); } $this->message = $message; return $this; } /** * @param string $groupKey * * @return Messenger */ public function toGroup(string $groupKey) { $this->groupKey = $groupKey; return $this; } /** * @param string|Message|null $message * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws RuntimeException * @throws InvalidArgumentException * @throws InvalidConfigException */ public function send($message = null) { if ($message) { $this->message($message); } if (empty($this->message)) { throw new RuntimeException('No message to send.'); } if (is_null($this->groupKey)) { throw new RuntimeException('No group key specified.'); } $message = $this->message->transformForJsonRequest(); return $this->client->send($this->groupKey, $message); } /** * @param string $property * * @return mixed * * @throws InvalidArgumentException */ public function __get($property) { if (property_exists($this, $property)) { return $this->$property; } throw new InvalidArgumentException(sprintf('No property named "%s"', $property)); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupRobot/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupRobot; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author her-cat */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} */ public function register(Container $app) { $app['group_robot'] = function ($app) { return new Client($app); }; $app['group_robot_messenger'] = function ($app) { return new Messenger($app['group_robot']); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupWelcomeTemplate/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupWelcomeTemplate; use EasyWeChat\Kernel\BaseClient; /** * 入群欢迎语素材管理 * * @package EasyWeChat\Work\GroupWelcomeTemplate\Client * @author HaoLiang */ class Client extends BaseClient { /** * 添加入群欢迎语素材 * * @description 企业可通过此API向企业的入群欢迎语素材库中添加素材。每个企业的入群欢迎语素材库中,最多容纳100个素材。 * @param array $data * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(array $data) { return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/add', $data); } /** * 编辑入群欢迎语素材 * * @description 企业可通过此API编辑入群欢迎语素材库中的素材,且仅能够编辑调用方自己创建的入群欢迎语素材。 * @param string $templateId 欢迎语素材id * @param array $data * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function edit(string $templateId, array $data) { return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/edit', array_merge( ['template_id' => $templateId], $data )); } /** * 获取入群欢迎语素材 * * @description 企业可通过此API获取入群欢迎语素材。 * @param string $templateId 欢迎语素材id * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $templateId) { return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/get', ['template_id' => $templateId]); } /** * 删除入群欢迎语素材 * * @description 企业可通过此API删除入群欢迎语素材,且仅能删除调用方自己创建的入群欢迎语素材。 * @param string $templateId 欢迎语素材id * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function del(string $templateId) { return $this->httpPostJson('cgi-bin/externalcontact/group_welcome_template/del', ['template_id' => $templateId]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/GroupWelcomeTemplate/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\GroupWelcomeTemplate; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * 入群欢迎语素材管理 * * @package EasyWeChat\Work\GroupWelcomeTemplate\ServiceProvider * @author HaoLiang */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['group_welcome_template'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Invoice/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Invoice; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * @param string $cardId * @param string $encryptCode * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $cardId, string $encryptCode) { $params = [ 'card_id' => $cardId, 'encrypt_code' => $encryptCode, ]; return $this->httpPostJson('cgi-bin/card/invoice/reimburse/getinvoiceinfo', $params); } /** * @param array $invoices * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function select(array $invoices) { $params = [ 'item_list' => $invoices, ]; return $this->httpPostJson('cgi-bin/card/invoice/reimburse/getinvoiceinfobatch', $params); } /** * @param string $cardId * @param string $encryptCode * @param string $status * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $cardId, string $encryptCode, string $status) { $params = [ 'card_id' => $cardId, 'encrypt_code' => $encryptCode, 'reimburse_status' => $status, ]; return $this->httpPostJson('cgi-bin/card/invoice/reimburse/updateinvoicestatus', $params); } /** * @param array $invoices * @param string $openid * @param string $status * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function batchUpdate(array $invoices, string $openid, string $status) { $params = [ 'openid' => $openid, 'reimburse_status' => $status, 'invoice_list' => $invoices, ]; return $this->httpPostJson('cgi-bin/card/invoice/reimburse/updatestatusbatch', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Invoice/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Invoice; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['invoice'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Jssdk/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Jssdk; use EasyWeChat\BasicService\Jssdk\Client as BaseClient; use EasyWeChat\Kernel\Contracts\AccessTokenInterface; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\ServiceContainer; use EasyWeChat\Kernel\Support; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { public function __construct(ServiceContainer $app, AccessTokenInterface $accessToken = null) { parent::__construct($app, $accessToken); $this->ticketEndpoint = \rtrim($app->config->get('http.base_uri'), '/').'/cgi-bin/get_jsapi_ticket'; } /** * @return string */ protected function getAppId() { return $this->app['config']->get('corp_id'); } /** * Return jsapi agent config as a PHP array. * * @param array $apis * @param int|string $agentId * @param bool $debug * @param bool $beta * @param array $openTagList * @param string|null $url * * @return array|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function getAgentConfigArray( array $apis, $agentId, bool $debug = false, bool $beta = false, array $openTagList = [], string $url = null ) { return $this->buildAgentConfig($apis, $agentId, $debug, $beta, false, $openTagList, $url); } /** * Get agent config json for jsapi. * * @param array $jsApiList * @param int|string $agentId * @param bool $debug * @param bool $beta * @param bool $json * @param array $openTagList * @param string|null $url * * @return array|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function buildAgentConfig( array $jsApiList, $agentId, bool $debug = false, bool $beta = false, bool $json = true, array $openTagList = [], string $url = null ) { $config = array_merge(compact('debug', 'beta', 'jsApiList', 'openTagList'), $this->agentConfigSignature($agentId, $url)); return $json ? json_encode($config) : $config; } /** * @param int|string $agentId * @param string|null $url * @param string|null $nonce * @param null $timestamp * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Psr\SimpleCache\InvalidArgumentException */ protected function agentConfigSignature($agentId, string $url = null, string $nonce = null, $timestamp = null): array { $url = $url ?: $this->getUrl(); $nonce = $nonce ?: Support\Str::quickRandom(10); $timestamp = $timestamp ?: time(); return [ 'corpid' => $this->getAppId(), 'agentid' => $agentId, 'nonceStr' => $nonce, 'timestamp' => $timestamp, 'url' => $url, 'signature' => $this->getTicketSignature($this->getAgentTicket($agentId)['ticket'], $nonce, $timestamp, $url), ]; } /** * Get js ticket. * * @param bool $refresh * @param string $type * * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function getTicket(bool $refresh = false, string $type = 'config'): array { $cacheKey = sprintf('easywechat.work.jssdk.ticket.%s.%s', $type, $this->getAppId()); if (!$refresh && $this->getCache()->has($cacheKey)) { return $this->getCache()->get($cacheKey); } /** @var array $result */ $result = $this->castResponseToType( $this->requestRaw($this->ticketEndpoint, 'GET'), 'array' ); $this->getCache()->set($cacheKey, $result, $result['expires_in'] - 500); if (!$this->getCache()->has($cacheKey)) { throw new RuntimeException('Failed to cache jssdk ticket.'); } return $result; } /** * @param int $agentId * @param bool $refresh * @param string $type * * @return array|\EasyWeChat\Kernel\Support\Collection|mixed|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \Psr\SimpleCache\InvalidArgumentException */ public function getAgentTicket($agentId, bool $refresh = false, string $type = 'agent_config') { $cacheKey = sprintf('easywechat.work.jssdk.ticket.%s.%s.%s', $agentId, $type, $this->getAppId()); if (!$refresh && $this->getCache()->has($cacheKey)) { return $this->getCache()->get($cacheKey); } /** @var array $result */ $result = $this->castResponseToType( $this->requestRaw('cgi-bin/ticket/get', 'GET', ['query' => ['type' => $type]]), 'array' ); $this->getCache()->set($cacheKey, $result, $result['expires_in'] - 500); if (!$this->getCache()->has($cacheKey)) { throw new RuntimeException('Failed to cache jssdk ticket.'); } return $result; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Jssdk/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Jssdk; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['jssdk'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Kf/AccountClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Kf; use EasyWeChat\Kernel\BaseClient; /** * Class AccountClient. * * @package EasyWeChat\Work\Kf * * @author 读心印 */ class AccountClient extends BaseClient { /** * 添加客服帐号. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94662 * * @param string $name * @param string $mediaId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(string $name, string $mediaId) { $params = [ 'name' => $name, 'media_id' => $mediaId, ]; return $this->httpPostJson('cgi-bin/kf/account/add', $params); } /** * 修改客服帐号. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94664 * * @param string $openKfId * @param string $name * @param string $mediaId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $openKfId, string $name, string $mediaId) { $params = [ 'open_kfid' => $openKfId, 'name' => $name, 'media_id' => $mediaId, ]; return $this->httpPostJson('cgi-bin/kf/account/update', $params); } /** * 删除客服帐号. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94663 * * @param string $openKfId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function del(string $openKfId) { $params = [ 'open_kfid' => $openKfId ]; return $this->httpPostJson('cgi-bin/kf/account/del', $params); } /** * 获取客服帐号列表. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94661 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list() { return $this->httpGet('cgi-bin/kf/account/list'); } /** * 获取客服帐号链接. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94665 * * @param string $openKfId * @param string $scene * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getAccountLink(string $openKfId, string $scene) { $params = [ 'open_kfid' => $openKfId, 'scene' => $scene ]; return $this->httpPostJson('cgi-bin/kf/add_contact_way', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Kf/MessageClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Kf; use EasyWeChat\Kernel\BaseClient; /** * Class MessageClient. * * @package EasyWeChat\Work\Kf * * @author 读心印 */ class MessageClient extends BaseClient { /** * 获取会话状态. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94669 * * @param string $openKfId * @param string $externalUserId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function state(string $openKfId, string $externalUserId) { $params = [ 'open_kfid' => $openKfId, 'external_userid' => $externalUserId ]; return $this->httpPostJson('cgi-bin/kf/service_state/get', $params); } /** * 变更会话状态. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94669 * * @param string $openKfId * @param string $externalUserId * @param int $serviceState * @param string $serviceUserId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateState(string $openKfId, string $externalUserId, int $serviceState, string $serviceUserId) { $params = [ 'open_kfid' => $openKfId, 'external_userid' => $externalUserId, 'service_state' => $serviceState, 'servicer_userid' => $serviceUserId ]; return $this->httpPostJson('cgi-bin/kf/service_state/trans', $params); } /** * 读取消息. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94670 * * @param string $cursor * @param string $token * @param int $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function sync(string $cursor, string $token, int $limit) { $params = [ 'cursor' => $cursor, 'token' => $token, 'limit' => $limit ]; return $this->httpPostJson('cgi-bin/kf/sync_msg', $params); } /** * 发送消息. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94677 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $params) { return $this->httpPostJson('cgi-bin/kf/send_msg', $params); } /** * 发送事件响应消息. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94677 * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function event(array $params) { return $this->httpPostJson('cgi-bin/kf/send_msg_on_event', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Kf/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Kf; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @package EasyWeChat\Work\Kf * * @author 读心印 */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['kf_account'] = function ($app) { return new AccountClient($app); }; $app['kf_servicer'] = function ($app) { return new ServicerClient($app); }; $app['kf_message'] = function ($app) { return new MessageClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Kf/ServicerClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Kf; use EasyWeChat\Kernel\BaseClient; /** * Class ServicerClient. * * @package EasyWeChat\Work\Kf * * @author 读心印 */ class ServicerClient extends BaseClient { /** * 添加接待人员. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94646 * * @param string $openKfId * @param array $userIds * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(string $openKfId, array $userIds) { $params = [ 'open_kfid' => $openKfId, 'userid_list' => $userIds ]; return $this->httpPostJson('cgi-bin/kf/servicer/add', $params); } /** * 删除接待人员. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94647 * * @param string $openKfId * @param array $userIds * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function del(string $openKfId, array $userIds) { $params = [ 'open_kfid' => $openKfId, 'userid_list' => $userIds ]; return $this->httpPostJson('cgi-bin/kf/servicer/del', $params); } /** * 获取接待人员列表. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/94645 * * @param string $openKfId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function list(string $openKfId) { $params = [ 'open_kfid' => $openKfId ]; return $this->httpGet('cgi-bin/kf/servicer/list', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Live/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Live; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author arthasking */ class Client extends BaseClient { /** * 获取成员直播ID列表 * * @see https://work.weixin.qq.com/api/doc/90000/90135/92735 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUserLivingId(string $userId, int $beginTime, int $endTime, string $nextKey = '0', int $limit = 100) { $params = [ 'userid' => $userId, 'begin_time' => $beginTime, 'end_time' => $endTime, 'next_key' => $nextKey, 'limit' => $limit ]; return $this->httpPostJson('cgi-bin/living/get_user_livingid', $params); } /** * 获取直播详情 * * @see https://work.weixin.qq.com/api/doc/90000/90135/92734 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getLiving(string $livingId) { $params = [ 'livingid' => $livingId, ]; return $this->httpGet('cgi-bin/living/get_living_info', $params); } /** * 获取看直播统计 * * @see https://work.weixin.qq.com/api/doc/90000/90135/92736 * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getWatchStat(string $livingId, string $nextKey = '0') { $params = [ 'livingid' => $livingId, 'next_key' => $nextKey, ]; return $this->httpPostJson('cgi-bin/living/get_watch_stat', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Live/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Live; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author arthasking */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['live'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Media/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Media; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Http\StreamResponse; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Get media. * * @param string $mediaId * * @return array|\EasyWeChat\Kernel\Http\Response|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get(string $mediaId) { return $this->getResources($mediaId, 'cgi-bin/media/get'); } /** * Upload Image. * * @param string $path * @param array $form * * @return mixed */ public function uploadImage(string $path, array $form = []) { return $this->upload('image', $path, $form); } /** * Upload Voice. * * @param string $path * @param array $form * * @return mixed */ public function uploadVoice(string $path, array $form = []) { return $this->upload('voice', $path, $form); } /** * Upload Video. * * @param string $path * @param array $form * * @return mixed */ public function uploadVideo(string $path, array $form = []) { return $this->upload('video', $path, $form); } /** * Upload File. * * @param string $path * @param array $form * * @return mixed */ public function uploadFile(string $path, array $form = []) { return $this->upload('file', $path, $form); } /** * Upload media. * * @param string $type * @param string $path * @param array $form * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function upload(string $type, string $path, array $form = []) { $files = [ 'media' => $path, ]; return $this->httpUpload('cgi-bin/media/upload', $files, $form, compact('type')); } /** * Upload permanently valid images * * @see https://work.weixin.qq.com/api/doc/90000/90135/90256 * @param string $path * @param array $form * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function uploadImg(string $path, array $form = []) { $files = [ 'media' => $path, ]; return $this->httpUpload('cgi-bin/media/uploadimg', $files, $form); } /** * Get HD voice material * * @see https://work.weixin.qq.com/api/doc/90000/90135/90255 * @param string $mediaId * * @return array|\EasyWeChat\Kernel\Http\Response|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getHdVoice(string $mediaId) { return $this->getResources($mediaId, 'cgi-bin/media/get/jssdk'); } /** * @param string $mediaId * @param string $uri * * @return array|\EasyWeChat\Kernel\Http\Response|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function getResources(string $mediaId, string $uri) { $response = $this->requestRaw($uri, 'GET', [ 'query' => [ 'media_id' => $mediaId, ], ]); if (false !== stripos($response->getHeaderLine('Content-Type'), 'text/plain')) { return $this->castResponseToType($response, $this->app['config']->get('response_type')); } return StreamResponse::buildFromPsrResponse($response); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Media/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Media; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['media'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Menu/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Menu; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Get menu. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function get() { return $this->httpGet('cgi-bin/menu/get', ['agentid' => $this->app['config']['agent_id']]); } /** * Create menu for the given agent. * * @param array $data * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $data) { return $this->httpPostJson('cgi-bin/menu/create', $data, ['agentid' => $this->app['config']['agent_id']]); } /** * Delete menu. * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function delete() { return $this->httpGet('cgi-bin/menu/delete', ['agentid' => $this->app['config']['agent_id']]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Menu/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Menu; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['menu'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Message/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Message; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * @param string|\EasyWeChat\Kernel\Messages\Message $message * * @return \EasyWeChat\Work\Message\Messenger * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function message($message) { return (new Messenger($this))->message($message); } /** * @param array $message * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $message) { return $this->httpPostJson('cgi-bin/message/send', $message); } /** * 更新任务卡片消息状态 * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/91579 * * @param array $userids * @param int $agentId * @param string $taskId * @param string $replaceName * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * */ public function updateTaskcard(array $userids, int $agentId, string $taskId, string $replaceName = '已收到') { $params = [ 'userids' => $userids, 'agentid' => $agentId, 'task_id' => $taskId, 'replace_name' => $replaceName ]; return $this->httpPostJson('cgi-bin/message/update_taskcard', $params); } /** * * 更新模版卡片消息状态 * * @see https://developer.work.weixin.qq.com/document/path/94888 * * @param array $userids * @param int $agentId * @param string $responseCode * @param string $replaceName * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function updateTemplateCard(array $userids, int $agentId, string $responseCode, string $replaceName = '已收到') { $params = [ 'userids' => $userids, 'agentid' => $agentId, 'response_code' => $responseCode, 'button' => [ 'replace_name' => $replaceName ] ]; return $this->httpPostJson('cgi-bin/message/update_template_card', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Message/Messenger.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Message; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Exceptions\RuntimeException; use EasyWeChat\Kernel\Messages\Message; use EasyWeChat\Kernel\Messages\Text; use EasyWeChat\Kernel\Support\Arr; /** * Class MessageBuilder. * * @author overtrue */ class Messenger { /** * @var \EasyWeChat\Kernel\Messages\Message; */ protected $message; /** * @var array */ protected $to = ['touser' => '@all']; /** * @var int */ protected $agentId; /** * @var bool */ protected $secretive = false; /** * @var \EasyWeChat\Work\Message\Client */ protected $client; /** * MessageBuilder constructor. * * @param \EasyWeChat\Work\Message\Client $client */ public function __construct(Client $client) { $this->client = $client; } /** * Set message to send. * * @param string|Message $message * * @return \EasyWeChat\Work\Message\Messenger * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function message($message) { if (is_string($message) || is_numeric($message)) { $message = new Text($message); } if (!($message instanceof Message)) { throw new InvalidArgumentException('Invalid message.'); } $this->message = $message; return $this; } /** * @param int $agentId * * @return \EasyWeChat\Work\Message\Messenger */ public function ofAgent(int $agentId) { $this->agentId = $agentId; return $this; } /** * @param array|string $userIds * * @return \EasyWeChat\Work\Message\Messenger */ public function toUser($userIds) { return $this->setRecipients($userIds, 'touser'); } /** * @param array|string $partyIds * * @return \EasyWeChat\Work\Message\Messenger */ public function toParty($partyIds) { return $this->setRecipients($partyIds, 'toparty'); } /** * @param array|string $tagIds * * @return \EasyWeChat\Work\Message\Messenger */ public function toTag($tagIds) { return $this->setRecipients($tagIds, 'totag'); } /** * Keep secret. * * @return \EasyWeChat\Work\Message\Messenger */ public function secretive() { $this->secretive = true; return $this; } /** * verify recipient is '@all' or not * * @return bool */ protected function isBroadcast(): bool { return Arr::get($this->to, 'touser') === '@all'; } /** * @param array|string $ids * @param string $key * * @return \EasyWeChat\Work\Message\Messenger */ protected function setRecipients($ids, string $key): self { if (is_array($ids)) { $ids = implode('|', $ids); } $this->to = $this->isBroadcast() ? [$key => $ids] : array_merge($this->to, [$key => $ids]); return $this; } /** * @param \EasyWeChat\Kernel\Messages\Message|string|null $message * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ public function send($message = null) { if ($message) { $this->message($message); } if (empty($this->message)) { throw new RuntimeException('No message to send.'); } if (is_null($this->agentId)) { throw new RuntimeException('No agentid specified.'); } $message = $this->message->transformForJsonRequest(array_merge([ 'agentid' => $this->agentId, 'safe' => intval($this->secretive), ], $this->to)); $this->secretive = false; return $this->client->send($message); } /** * Return property. * * @param string $property * * @return mixed * * @throws InvalidArgumentException */ public function __get($property) { if (property_exists($this, $property)) { return $this->$property; } throw new InvalidArgumentException(sprintf('No property named "%s"', $property)); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Message/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Message; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['message'] = function ($app) { return new Client($app); }; $app['messenger'] = function ($app) { $messenger = new Messenger($app['message']); if (is_numeric($app['config']['agent_id'])) { $messenger->ofAgent($app['config']['agent_id']); } return $messenger; }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/MiniProgram/Application.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\MiniProgram; use EasyWeChat\MiniProgram\Application as MiniProgram; use EasyWeChat\Work\Auth\AccessToken; use EasyWeChat\Work\MiniProgram\Auth\Client; /** * Class Application. * * @author Caikeal * * @property \EasyWeChat\Work\MiniProgram\Auth\Client $auth */ class Application extends MiniProgram { /** * Application constructor. * * @param array $config * @param array $prepends */ public function __construct(array $config = [], array $prepends = []) { parent::__construct($config, $prepends + [ 'access_token' => function ($app) { return new AccessToken($app); }, 'auth' => function ($app) { return new Client($app); }, ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/MiniProgram/Auth/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\MiniProgram\Auth; use EasyWeChat\Kernel\BaseClient; /** * Class Client. */ class Client extends BaseClient { /** * Get session info by code. * * @param string $code * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function session(string $code) { $params = [ 'js_code' => $code, 'grant_type' => 'authorization_code', ]; return $this->httpGet('cgi-bin/miniprogram/jscode2session', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Mobile/Auth/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Mobile\Auth; use EasyWeChat\Kernel\BaseClient; /** * Class Client. */ class Client extends BaseClient { /** * 通过code获取用户信息. * * @see https://open.work.weixin.qq.com/api/doc/90000/90136/91193 * * @param string $code * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getUser(string $code) { $params = [ 'code' => $code, ]; return $this->httpGet('cgi-bin/user/getuserinfo', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Mobile/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Mobile; use Pimple\Container; use Pimple\ServiceProviderInterface; use EasyWeChat\Work\Mobile\Auth\Client; /** * ServiceProvider. * * @author 读心印 */ class ServiceProvider implements ServiceProviderInterface { protected $app; /** * @param Container $app */ public function register(Container $app) { $app['mobile'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/MsgAudit/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\MsgAudit; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author ZengJJ */ class Client extends BaseClient { /** * @param string|null $type * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException|\GuzzleHttp\Exception\GuzzleException */ public function getPermitUsers(string $type = null) { return $this->httpPostJson('cgi-bin/msgaudit/get_permit_user_list', (empty($type) ? [] : ['type' => $type])); } /** * @param array $info 数组,格式: [[userid, exteranalopenid], [userid, exteranalopenid]] * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getSingleAgreeStatus(array $info) { $params = [ 'info' => $info ]; return $this->httpPostJson('cgi-bin/msgaudit/check_single_agree', $params); } /** * @param string $roomId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getRoomAgreeStatus(string $roomId) { $params = [ 'roomid' => $roomId ]; return $this->httpPostJson('cgi-bin/msgaudit/check_room_agree', $params); } /** * @param string $roomId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getRoom(string $roomId) { $params = [ 'roomid' => $roomId ]; return $this->httpPostJson('cgi-bin/msgaudit/groupchat/get', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/MsgAudit/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\MsgAudit; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author ZengJJ */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['msg_audit'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/OA/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\OA; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Get the checkin data. * * @param int $startTime * @param int $endTime * @param array $userList * @param int $type * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function checkinRecords(int $startTime, int $endTime, array $userList, int $type = 3) { $params = [ 'opencheckindatatype' => $type, 'starttime' => $startTime, 'endtime' => $endTime, 'useridlist' => $userList, ]; return $this->httpPostJson('cgi-bin/checkin/getcheckindata', $params); } /** * Get the checkin rules. * * @param int $datetime * @param array $userList * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function checkinRules(int $datetime, array $userList) { $params = [ 'datetime' => $datetime, 'useridlist' => $userList, ]; return $this->httpPostJson('cgi-bin/checkin/getcheckinoption', $params); } /** * 获取企业所有打卡规则. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93384 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @author 读心印 */ public function corpCheckinRules() { return $this->httpPostJson('cgi-bin/checkin/getcorpcheckinoption'); } /** * 获取打卡日报数据. * * @sse https://open.work.weixin.qq.com/api/doc/90000/90135/93374 * * @param int $startTime * @param int $endTime * @param array $userids * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @author 读心印 */ public function checkinDayData(int $startTime, int $endTime, array $userids) { $params = [ 'starttime' => $startTime, 'endtime' => $endTime, 'useridlist' => $userids, ]; return $this->httpPostJson('cgi-bin/checkin/getcheckin_daydata', $params); } /** * 获取打卡日报数据. * * @sse https://open.work.weixin.qq.com/api/doc/90000/90135/93387 * * @param int $startTime * @param int $endTime * @param array $userids * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @author 读心印 */ public function checkinMonthData(int $startTime, int $endTime, array $userids) { $params = [ 'starttime' => $startTime, 'endtime' => $endTime, 'useridlist' => $userids, ]; return $this->httpPostJson('cgi-bin/checkin/getcheckin_monthdata', $params); } /** * 获取打卡人员排班信息. * * @sse https://open.work.weixin.qq.com/api/doc/90000/90135/93380 * * @param int $startTime * @param int $endTime * @param array $userids * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @author 读心印 */ public function checkinSchedus(int $startTime, int $endTime, array $userids) { $params = [ 'starttime' => $startTime, 'endtime' => $endTime, 'useridlist' => $userids, ]; return $this->httpPostJson('cgi-bin/checkin/getcheckinschedulist', $params); } /** * 为打卡人员排班. * * @sse https://open.work.weixin.qq.com/api/doc/90000/90135/93385 * * @param array $params * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @author 读心印 */ public function setCheckinSchedus(array $params) { return $this->httpPostJson('cgi-bin/checkin/setcheckinschedulist', $params); } /** * 录入打卡人员人脸信息. * * @sse https://open.work.weixin.qq.com/api/doc/90000/90135/93378 * * @param string $userid * @param string $userface * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @author 读心印 */ public function addCheckinUserface(string $userid, string $userface) { $params = [ 'userid' => $userid, 'userface' => $userface ]; return $this->httpPostJson('cgi-bin/checkin/addcheckinuserface', $params); } /** * Get approval template details. * * @param string $templateId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function approvalTemplate(string $templateId) { $params = [ 'template_id' => $templateId, ]; return $this->httpPostJson('cgi-bin/oa/gettemplatedetail', $params); } /** * Submit an application for approval. * * @param array $data * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function createApproval(array $data) { return $this->httpPostJson('cgi-bin/oa/applyevent', $data); } /** * Get Approval number. * * @param int $startTime * @param int $endTime * @param int $nextCursor * @param int $size * @param array $filters * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function approvalNumbers(int $startTime, int $endTime, int $nextCursor = 0, int $size = 100, array $filters = []) { $params = [ 'starttime' => $startTime, 'endtime' => $endTime, 'cursor' => $nextCursor, 'size' => $size > 100 ? 100 : $size, 'filters' => $filters, ]; return $this->httpPostJson('cgi-bin/oa/getapprovalinfo', $params); } /** * Get approval detail. * * @param int $number * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function approvalDetail(int $number) { $params = [ 'sp_no' => $number, ]; return $this->httpPostJson('cgi-bin/oa/getapprovaldetail', $params); } /** * Get Approval Data. * * @param int $startTime * @param int $endTime * @param int $nextNumber * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function approvalRecords(int $startTime, int $endTime, int $nextNumber = null) { $params = [ 'starttime' => $startTime, 'endtime' => $endTime, 'next_spnum' => $nextNumber, ]; return $this->httpPostJson('cgi-bin/corp/getapprovaldata', $params); } /** * 获取公费电话拨打记录. * * @param int $startTime * @param int $endTime * @param int $offset * @param int $limit * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function dialRecords(int $startTime, int $endTime, int $offset = 0, $limit = 100) { $params = [ 'start_time' => $startTime, 'end_time' => $endTime, 'offset' => $offset, 'limit' => $limit ]; return $this->httpPostJson('cgi-bin/dial/get_dial_record', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/OA/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\OA; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['oa'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/OAuth/Manager.php ================================================ config = $config; $this->app = $app; } public function redirect($redirect = null) { return new RedirectResponse($this->getProvider()->redirect($redirect)); } public function user() { $this->getProvider()->withApiAccessToken($this->app['access_token']->getToken()['access_token']); return $this->getProvider()->userFromCode($this->app->request->get('code')); } protected function getProvider(): ProviderInterface { return $this->provider ?? $this->provider = (new SocialiteManager($this->config))->create('wework'); } public function __call($name, $arguments) { return \call_user_func_array([$this->getProvider(), $name], $arguments); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/OAuth/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\OAuth; use Pimple\Container; use Pimple\ServiceProviderInterface; class ServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['oauth'] = function ($app) { $socialite = (new Manager([ 'wework' => [ 'base_url' => $app['config']['http']['base_uri'], 'client_id' => $app['config']['corp_id'], 'client_secret' => null, 'corp_id' => $app['config']['corp_id'], 'corp_secret' => $app['config']['secret'], 'redirect' => $this->prepareCallbackUrl($app), ], ], $app)); $scopes = (array) $app['config']->get('oauth.scopes', ['snsapi_base']); if (!empty($scopes)) { $socialite->scopes($scopes); } else { $socialite->setAgentId($app['config']['agent_id']); } return $socialite; }; } /** * Prepare the OAuth callback url for wechat. * * @param Container $app * * @return string */ private function prepareCallbackUrl($app) { $callback = $app['config']->get('oauth.callback'); if (0 === stripos($callback, 'http')) { return $callback; } $baseUrl = $app['request']->getSchemeAndHttpHost(); return $baseUrl.'/'.ltrim($callback, '/'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Schedule/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Schedule; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author her-cat */ class Client extends BaseClient { /** * Add a schedule. * * @param array $schedule * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function add(array $schedule) { return $this->httpPostJson('cgi-bin/oa/schedule/add', compact('schedule')); } /** * Update the schedule. * * @param string $id * @param array $schedule * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $id, array $schedule) { $schedule += ['schedule_id' => $id]; return $this->httpPostJson('cgi-bin/oa/schedule/update', compact('schedule')); } /** * Get one or more schedules. * * @param string|array $ids * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function get($ids) { return $this->httpPostJson('cgi-bin/oa/schedule/get', ['schedule_id_list' => (array) $ids]); } /** * Get the list of schedules under a calendar. * * @param string $calendarId * @param int $offset * @param int $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getByCalendar(string $calendarId, int $offset = 0, int $limit = 500) { $data = compact('offset', 'limit') + ['cal_id' => $calendarId]; return $this->httpPostJson('cgi-bin/oa/schedule/get_by_calendar', $data); } /** * Delete a schedule. * * @param string $id * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete(string $id) { return $this->httpPostJson('cgi-bin/oa/schedule/del', ['schedule_id' => $id]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Schedule/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Schedule; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author her-cat */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} */ public function register(Container $app) { $app['schedule'] = function ($app) { return new Client($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Server/Guard.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Server; use EasyWeChat\Kernel\ServerGuard; /** * Class Guard. * * @author overtrue */ class Guard extends ServerGuard { /** * @return $this */ public function validate() { return $this; } /** * Check the request message safe mode. * * @return bool */ protected function isSafeMode(): bool { return true; } /** * @return bool */ protected function shouldReturnRawResponse(): bool { return !is_null($this->app['request']->get('echostr')); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Server/Handlers/EchoStrHandler.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Server\Handlers; use EasyWeChat\Kernel\Contracts\EventHandlerInterface; use EasyWeChat\Kernel\Decorators\FinallyResult; use EasyWeChat\Kernel\ServiceContainer; /** * Class EchoStrHandler. * * @author overtrue */ class EchoStrHandler implements EventHandlerInterface { /** * @var ServiceContainer */ protected $app; /** * EchoStrHandler constructor. * * @param ServiceContainer $app */ public function __construct(ServiceContainer $app) { $this->app = $app; } /** * @param mixed $payload * * @return FinallyResult|null */ public function handle($payload = null) { if ($decrypted = $this->app['request']->get('echostr')) { $str = $this->app['encryptor']->decrypt( $decrypted, $this->app['request']->get('msg_signature'), $this->app['request']->get('nonce'), $this->app['request']->get('timestamp') ); return new FinallyResult($str); } return null; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Server/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Server; use EasyWeChat\Kernel\Encryptor; use EasyWeChat\Work\Server\Handlers\EchoStrHandler; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author overtrue */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { !isset($app['encryptor']) && $app['encryptor'] = function ($app) { return new Encryptor( $app['config']['corp_id'], $app['config']['token'], $app['config']['aes_key'] ); }; !isset($app['server']) && $app['server'] = function ($app) { $guard = new Guard($app); $guard->push(new EchoStrHandler($app)); return $guard; }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/User/BatchJobsClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\User; use EasyWeChat\Kernel\BaseClient; /** * Class BatchJobsClient. * * @author 读心印 */ class BatchJobsClient extends BaseClient { /** * 增量更新成员. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/90980 * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function batchUpdateUsers(array $params) { return $this->httpPostJson('cgi-bin/batch/syncuser', $params); } /** * 全量覆盖成员. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/90981 * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function batchReplaceUsers(array $params) { return $this->httpPostJson('cgi-bin/batch/replaceuser', $params); } /** * 全量覆盖部门. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/90982 * * @param array $params * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function batchReplaceDepartments(array $params) { return $this->httpPostJson('cgi-bin/batch/replaceparty', $params); } /** * 获取异步任务结果. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93169 * * @param string $jobId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getJobStatus(string $jobId) { $params = [ 'jobid' => $jobId ]; return $this->httpGet('cgi-bin/batch/getresult', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/User/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\User; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; /** * Class Client. * * @author mingyoung */ class Client extends BaseClient { /** * Create a user. * * @param array $data * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(array $data) { return $this->httpPostJson('cgi-bin/user/create', $data); } /** * Update an exist user. * * @param string $id * @param array $data * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(string $id, array $data) { return $this->httpPostJson('cgi-bin/user/update', array_merge(['userid' => $id], $data)); } /** * Delete a user. * * @param string|array $userId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function delete($userId) { if (is_array($userId)) { return $this->batchDelete($userId); } return $this->httpGet('cgi-bin/user/delete', ['userid' => $userId]); } /** * Batch delete users. * * @param array $userIds * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function batchDelete(array $userIds) { return $this->httpPostJson('cgi-bin/user/batchdelete', ['useridlist' => $userIds]); } /** * Get user. * * @param string $userId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function get(string $userId) { return $this->httpGet('cgi-bin/user/get', ['userid' => $userId]); } /** * Get simple user list. * * @param int $departmentId * @param bool $fetchChild * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getDepartmentUsers(int $departmentId, bool $fetchChild = false) { $params = [ 'department_id' => $departmentId, 'fetch_child' => (int) $fetchChild, ]; return $this->httpGet('cgi-bin/user/simplelist', $params); } /** * Get user list. * * @param int $departmentId * @param bool $fetchChild * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getDetailedDepartmentUsers(int $departmentId, bool $fetchChild = false) { $params = [ 'department_id' => $departmentId, 'fetch_child' => (int) $fetchChild, ]; return $this->httpGet('cgi-bin/user/list', $params); } /** * Convert userId to openid. * * @param string $userId * @param int|null $agentId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function userIdToOpenid(string $userId, int $agentId = null) { $params = [ 'userid' => $userId, 'agentid' => $agentId, ]; return $this->httpPostJson('cgi-bin/user/convert_to_openid', $params); } /** * Convert openid to userId. * * @param string $openid * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function openidToUserId(string $openid) { $params = [ 'openid' => $openid, ]; return $this->httpPostJson('cgi-bin/user/convert_to_userid', $params); } /** * Convert mobile to userId. * * @param string $mobile * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function mobileToUserId(string $mobile) { $params = [ 'mobile' => $mobile, ]; return $this->httpPostJson('cgi-bin/user/getuserid', $params); } /** * @param string $userId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function accept(string $userId) { $params = [ 'userid' => $userId, ]; return $this->httpGet('cgi-bin/user/authsucc', $params); } /** * Batch invite users. * * @param array $params * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function invite(array $params) { return $this->httpPostJson('cgi-bin/batch/invite', $params); } /** * Get invitation QR code. * * @param int $sizeType * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function getInvitationQrCode(int $sizeType = 1) { if (!\in_array($sizeType, [1, 2, 3, 4], true)) { throw new InvalidArgumentException('The sizeType must be 1, 2, 3, 4.'); } return $this->httpGet('cgi-bin/corp/get_join_qrcode', ['size_type' => $sizeType]); } /** * @param string|null $cursor * @param int $limit * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getMemberAuthList(?string $cursor = null, int $limit = 1000) { return $this->httpPostJson('cgi-bin/user/list_member_auth', [ 'cursor' => $cursor, 'limit' => $limit ]); } /** * @param string $openUserId * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function checkMemberAuth(string $openUserId) { return $this->httpPostJson('cgi-bin/user/check_member_auth', [ 'open_userid' => $openUserId ]); } /** * @param string $selectedTicket * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getSelectedTicketUserList(string $selectedTicket) { return $this->httpPostJson('cgi-bin/user/list_selected_ticket_user', [ 'selected_ticket' => $selectedTicket ]); } /** * userid转换为open_userid * * @param array $user_ids * * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function userIdToOpenUserId(array $user_ids) { return $this->httpPostJson('cgi-bin/batch/userid_to_openuserid', [ 'userid_list' => $user_ids ]); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/User/LinkedCorpClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\User; use EasyWeChat\Kernel\BaseClient; /** * Class Client. * * @author 读心印 */ class LinkedCorpClient extends BaseClient { /** * 获取应用的可见范围. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93172 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getAgentPermissions() { return $this->httpPostJson('cgi-bin/linkedcorp/agent/get_perm_list'); } /** * 获取互联企业成员详细信息. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93171 * * @param string $userId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUser(string $userId) { $params = [ 'userid' => $userId ]; return $this->httpPostJson('cgi-bin/linkedcorp/user/get', $params); } /** * 获取互联企业部门成员. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93168 * * @param string $departmentId * @param bool $fetchChild * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getUsers(string $departmentId, bool $fetchChild = true) { $params = [ 'department_id' => $departmentId, 'fetch_child' => $fetchChild ]; return $this->httpPostJson('cgi-bin/linkedcorp/user/simplelist', $params); } /** * 获取互联企业部门成员详情. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93169 * * @param string $departmentId * @param bool $fetchChild * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getDetailedUsers(string $departmentId, bool $fetchChild = true) { $params = [ 'department_id' => $departmentId, 'fetch_child' => $fetchChild ]; return $this->httpPostJson('cgi-bin/linkedcorp/user/list', $params); } /** * 获取互联企业部门列表. * * @see https://open.work.weixin.qq.com/api/doc/90000/90135/93170 * * @param string $departmentId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getDepartments(string $departmentId) { $params = [ 'department_id' => $departmentId, ]; return $this->httpPostJson('cgi-bin/linkedcorp/department/list', $params); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/User/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\User; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider. * * @author mingyoung */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc}. */ public function register(Container $app) { $app['user'] = function ($app) { return new Client($app); }; $app['tag'] = function ($app) { return new TagClient($app); }; $app['linked_corp'] = function ($app) { return new LinkedCorpClient($app); }; $app['batch_jobs'] = function ($app) { return new BatchJobsClient($app); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/User/TagClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\User; use EasyWeChat\Kernel\BaseClient; /** * Class TagClient. * * @author mingyoung */ class TagClient extends BaseClient { /** * Create tag. * * @param string $tagName * @param int|null $tagId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function create(string $tagName, int $tagId = null) { $params = [ 'tagname' => $tagName, 'tagid' => $tagId, ]; return $this->httpPostJson('cgi-bin/tag/create', $params); } /** * Update tag. * * @param int $tagId * @param string $tagName * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function update(int $tagId, string $tagName) { $params = [ 'tagid' => $tagId, 'tagname' => $tagName, ]; return $this->httpPostJson('cgi-bin/tag/update', $params); } /** * Delete tag. * * @param int $tagId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function delete(int $tagId) { return $this->httpGet('cgi-bin/tag/delete', ['tagid' => $tagId]); } /** * @param int $tagId * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function get(int $tagId) { return $this->httpGet('cgi-bin/tag/get', ['tagid' => $tagId]); } /** * @param int $tagId * @param array $userList * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function tagUsers(int $tagId, array $userList = []) { return $this->tagOrUntagUsers('cgi-bin/tag/addtagusers', $tagId, $userList); } /** * @param int $tagId * @param array $partyList * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function tagDepartments(int $tagId, array $partyList = []) { return $this->tagOrUntagUsers('cgi-bin/tag/addtagusers', $tagId, [], $partyList); } /** * @param int $tagId * @param array $userList * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function untagUsers(int $tagId, array $userList = []) { return $this->tagOrUntagUsers('cgi-bin/tag/deltagusers', $tagId, $userList); } /** * @param int $tagId * @param array $partyList * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function untagDepartments(int $tagId, array $partyList = []) { return $this->tagOrUntagUsers('cgi-bin/tag/deltagusers', $tagId, [], $partyList); } /** * @param string $endpoint * @param int $tagId * @param array $userList * @param array $partyList * * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ protected function tagOrUntagUsers(string $endpoint, int $tagId, array $userList = [], array $partyList = []) { $data = [ 'tagid' => $tagId, 'userlist' => $userList, 'partylist' => $partyList, ]; return $this->httpPostJson($endpoint, $data); } /** * @return mixed * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException */ public function list() { return $this->httpGet('cgi-bin/tag/list'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Wedrive/Client.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Wedrive; use EasyWeChat\Kernel\BaseClient; /** * Class Client * * @author lio990527 */ class Client extends BaseClient { /** * 获取盘专业版信息 * * @param string $userid * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/95856#%E8%8E%B7%E5%8F%96%E7%9B%98%E4%B8%93%E4%B8%9A%E7%89%88%E4%BF%A1%E6%81%AF */ public function proInfo($userid) { return $this->httpPostJson('cgi-bin/wedrive/mng_pro_info', compact('userid')); } /** * 获取盘容量信息 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/95856#%E8%8E%B7%E5%8F%96%E7%9B%98%E5%AE%B9%E9%87%8F%E4%BF%A1%E6%81%AF */ public function capacity() { return $this->httpPostJson('cgi-bin/wedrive/mng_capacity'); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Wedrive/FileClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Wedrive; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Support\Arr; use GuzzleHttp\Cookie\CookieJar; /** * Class FileClient * * @author lio990527 */ class FileClient extends BaseClient { /** * 新建文件/文档 * * @param string $userid 操作者userid * @param string $spaceid 空间spaceid * @param string $fatherid 父目录fileid, 在根目录时为空间spaceid * @param int $fileType 文件类型, 1:文件夹 3:文档(文档) 4:文档(表格) 6:文档(幻灯片) * @param string $fileName 文件名字 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93657#%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E6%96%87%E6%A1%A3 */ public function create($userid, $spaceid, $fatherid, $fileType, $fileName) { $data = [ 'userid' => $userid, 'spaceid' => $spaceid, 'fatherid' => $fatherid, 'file_type' => $fileType, 'file_name' => $fileName ]; return $this->httpPostJson('cgi-bin/wedrive/file_create', $data); } /** * 重命名文件 * * @param string $userid 操作人userid * @param string $fileid 文件id * @param string $name 新文件名 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93657#%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6 */ public function rename($userid, $fileid, $name) { $data = [ 'userid' => $userid, 'fileid' => $fileid, 'new_name' => $name ]; return $this->httpPostJson('cgi-bin/wedrive/file_rename', $data); } /** * 移动文件 * * @param string $userid * @param string|array $fileid 文件fileid * @param string $fatherid 目标目录的fileid * @param boolean $replace 重名时,是否覆盖 false:重名文件进行冲突重命名处理(移动后文件名格式如xxx(1).txt xxx(1).doc等) * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93657#%E7%A7%BB%E5%8A%A8%E6%96%87%E4%BB%B6 */ public function move($userid, $fileid, $fatherid, $replace = false) { $fileid = (array) $fileid; return $this->httpPostJson('cgi-bin/wedrive/file_move', compact('userid', 'fatherid', 'replace', 'fileid')); } /** * 删除文件 * * @param string $userid * @param string|array $fileid * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93657#%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6 */ public function delete($userid, $fileid) { $fileid = (array) $fileid; return $this->httpPostJson('cgi-bin/wedrive/file_delete', compact('userid', 'fileid')); } /** * 获取文件列表 * * @param string $userid * @param string $spaceid 空间id * @param string $fatherid 目录id * @param integer $start 查询游标 首次填0, 后续填上一次请求返回的next_start * @param integer $limit 拉取条数 最大1000 * @param integer $sort 列表排序方式 1:名字升序;2:名字降序;3:大小升序;4:大小降序;5:修改时间升序;6:修改时间降序 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93657#%E8%8E%B7%E5%8F%96%E6%96%87%E4%BB%B6%E5%88%97%E8%A1%A8 */ public function list($userid, $spaceid, $fatherid = null, $start = 0, $limit = 1000, $sort = 1) { $data = [ 'userid' => $userid, 'spaceid' => $spaceid, 'fatherid' => $fatherid ?: $spaceid, 'start' => $start, 'limit' => min($limit, 1000), 'sort_type' => $sort ]; return $this->httpPostJson('cgi-bin/wedrive/file_list', $data); } /** * 文件信息 * * @param string $userid * @param string $fileid * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93657#%E6%96%87%E4%BB%B6%E4%BF%A1%E6%81%AF */ public function info($userid, $fileid) { return $this->httpPostJson('cgi-bin/wedrive/file_info', compact('userid', 'fileid')); } /** * 上传文件 * * @param string $userid * @param string $spaceid 空间id * @param string $fatherid 目录id * @param string $fileName 文件名 * @param string $fileContent 文件内容 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93657#%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6 */ public function upload($userid, $spaceid, $fatherid, $fileName, $fileContent) { $data = [ 'userid' => $userid, 'spaceid' => $spaceid, 'fatherid' => $fatherid, 'file_name' => $fileName, 'file_base64_content' => base64_encode($fileContent) ]; return $this->httpPostJson('cgi-bin/wedrive/file_upload', $data); } /** * 文件下载 * * @param string $userid * @param string $fileid * @param boolean $download 是否直接下载 * * @return \EasyWeChat\Kernel\Http\StreamResponse|\Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93657#%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6 */ public function download($userid, $fileid, $download = false) { $response = $this->httpPostJson('cgi-bin/wedrive/file_download', compact('userid', 'fileid')); if (!$download || 0 <> $response['errcode']) { return $response; } return $this->getHttpClient()->request('GET', $response['download_url'], [ 'cookies' => CookieJar::fromArray([ $response['cookie_name'] => $response['cookie_value'], ], parse_url($response['download_url'])['host'] ?? 'qq.com'), ]); } /** * 获取分享链接 * * @param string $userid * @param string $fileid * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93658#%E8%8E%B7%E5%8F%96%E5%88%86%E4%BA%AB%E9%93%BE%E6%8E%A5 */ public function share($userid, $fileid) { return $this->httpPostJson('cgi-bin/wedrive/file_share', compact('userid', 'fileid')); } /** * 分享设置 * * @param string $userid * @param string $fileid * @param int $authScope 权限范围:1:指定人 2:企业内 3:企业外 * @param int $auth 权限信息 权限信息 * 普通文档: 1:仅浏览(可下载) 4:仅预览(仅专业版企业可设置);如果不填充此字段为保持原有状态 * 微文档: 1:仅浏览(可下载) 2:可编辑;如果不填充此字段为保持原有状态 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93658#%E5%88%86%E4%BA%AB%E8%AE%BE%E7%BD%AE */ public function setting($userid, $fileid, $authScope, $auth = null) { $data = [ 'userid' => $userid, 'fileid' => $fileid, 'auth_scope' => $authScope, 'auth' => $auth ]; return $this->httpPostJson('cgi-bin/wedrive/file_setting', array_filter($data)); } /** * 新增成员 * * @param string $userid * @param string $fileid * @param array $authInfo 添加成员的信息 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93658#%E6%96%B0%E5%A2%9E%E6%88%90%E5%91%98 */ public function aclAdd($userid, $fileid, $authInfo) { $data = [ 'userid' => $userid, 'fileid' => $fileid, 'auth_info' => Arr::isAssoc($authInfo) ? [$authInfo] : $authInfo ]; return $this->httpPostJson('cgi-bin/wedrive/file_acl_add', $data); } /** * 删除成员 * * @param string $userid * @param string $fileid * @param array $authInfo 删除成员的信息 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93658#%E5%88%A0%E9%99%A4%E6%88%90%E5%91%98 */ public function aclDel($userid, $fileid, $authInfo) { $data = [ 'userid' => $userid, 'fileid' => $fileid, 'auth_info' => Arr::isAssoc($authInfo) ? [$authInfo] : $authInfo ]; return $this->httpPostJson('cgi-bin/wedrive/file_acl_del', $data); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Wedrive/ServiceProvider.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Wedrive; use Pimple\Container; use Pimple\ServiceProviderInterface; /** * Class ServiceProvider * * @author lio990527 */ class ServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} */ public function register(Container $app) { $app['wedrive'] = function ($app) { return new Wedrive([ 'base' => new Client($app), 'space' => new SpaceClient($app), 'file' => new FileClient($app), ]); }; } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Wedrive/SpaceClient.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Wedrive; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Support\Arr; /** * Class SpaceClient * * @author lio990527 */ class SpaceClient extends BaseClient { /** * 新建空间 * * @param string $userid 操作者userid * @param string $spaceName 空间名称 * @param array $authInfo 空间成员权限信息 * @param integer $spaceSubType 空间类型, 0:普通 1:相册 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93656#%E6%96%B0%E5%BB%BA%E7%A9%BA%E9%97%B4 */ public function create($userid, $spaceName, $authInfo = [], $spaceSubType = 0) { $data = [ 'userid' => $userid, 'space_name' => $spaceName, 'auth_info' => Arr::isAssoc($authInfo) ? [$authInfo] : $authInfo, 'space_sub_type' => $spaceSubType, ]; return $this->httpPostJson('cgi-bin/wedrive/space_create', $data); } /** * 重命名空间 * * @param string $userid * @param string $spaceid * @param string $spaceName 重命名后的空间名 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93656#%E9%87%8D%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4 */ public function rename($userid, $spaceid, $spaceName) { $data = [ 'userid' => $userid, 'spaceid' => $spaceid, 'space_name' => $spaceName ]; return $this->httpPostJson('cgi-bin/wedrive/space_rename', $data); } /** * 解散空间 * * @param string $userid * @param string $spaceid * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93656#%E8%A7%A3%E6%95%A3%E7%A9%BA%E9%97%B4 */ public function dismiss($userid, $spaceid) { return $this->httpPostJson('cgi-bin/wedrive/space_dismiss', compact('userid', 'spaceid')); } /** * 获取空间/相册信息 * * @param string $userid * @param string $spaceid * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93656#%E8%8E%B7%E5%8F%96%E7%A9%BA%E9%97%B4%E7%9B%B8%E5%86%8C%E4%BF%A1%E6%81%AF */ public function info($userid, $spaceid) { return $this->httpPostJson('cgi-bin/wedrive/space_info', compact('userid', 'spaceid')); } /** * 获取邀请链接 * * @param string $userid * @param string $spaceid * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93656#%E8%8E%B7%E5%8F%96%E9%82%80%E8%AF%B7%E9%93%BE%E6%8E%A5 */ public function share($userid, $spaceid) { return $this->httpPostJson('cgi-bin/wedrive/space_share', compact('userid', 'spaceid')); } /** * 安全设置 * * @param string $userid * @param string $spaceid * @param array $settings 设置 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93656#%E5%AE%89%E5%85%A8%E8%AE%BE%E7%BD%AE */ public function setting($userid, $spaceid, $settings) { $data = array_merge(compact('userid', 'spaceid'), $settings); return $this->httpPostJson('cgi-bin/wedrive/space_setting', $data); } /** * 添加成员/部门 * * @param string $userid * @param string $spaceid * @param array $authInfo 被添加的空间成员信息 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93656#%E6%B7%BB%E5%8A%A0%E6%88%90%E5%91%98%E9%83%A8%E9%97%A8 */ public function aclAdd($userid, $spaceid, $authInfo) { $data = [ 'userid' => $userid, 'spaceid' => $spaceid, 'auth_info' => Arr::isAssoc($authInfo) ? [$authInfo] : $authInfo ]; return $this->httpPostJson('cgi-bin/wedrive/space_acl_add', $data); } /** * 移除成员/部门 * * @param string $userid * @param string $spaceid * @param array $authInfo 被移除的空间成员信息 * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * * @see https://developer.work.weixin.qq.com/document/path/93656#%E6%B7%BB%E5%8A%A0%E6%88%90%E5%91%98%E9%83%A8%E9%97%A8 */ public function aclDel($userid, $spaceid, $authInfo) { $data = [ 'userid' => $userid, 'spaceid' => $spaceid, 'auth_info' => Arr::isAssoc($authInfo) ? [$authInfo] : $authInfo ]; return $this->httpPostJson('cgi-bin/wedrive/space_acl_del', $data); } } ================================================ FILE: core/widget/wechatServer/vendor/w7corp/easywechat/src/Work/Wedrive/Wedrive.php ================================================ * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\Work\Wedrive; use Pimple\Container; /** * Class Wedrive * * @property \EasyWeChat\Work\Wedrive\Client $base * @property \EasyWeChat\Work\Wedrive\SpaceClient $space * @property \EasyWeChat\Work\Wedrive\FileClient $file * * @author lio990527 */ class Wedrive extends Container { public function __get($key) { return $this->offsetGet($key); } } ================================================ FILE: core/widget/wechatServer/wechatServer.php ================================================ $options['wechat_appid'], 'secret' => $options['wechat_appsecret'], 'token' => $options['wechat_verifyToken'], 'aes_key' => $options['wechat_aeskey'], 'response_type' => 'array', 'log' => [ 'default' => 'prod', 'channels' => [ 'dev' => [ 'driver' => 'single', 'path' => __DIR__.'/tmp/wechat.log', 'level' => 'debug', ], 'prod' => [ 'driver' => 'single', 'path' =>__DIR__.'/tmp/wechat.log', 'level' => 'info', ], ], ], ]; $app = new Application($config); $stream = $app->media->get($mediaId); if ($stream instanceof \EasyWeChat\Kernel\Http\StreamResponse) { $stream->saveAs('usr/uploads/wechatServer',$mediaName); } return true; } function typeVoiceContent($mediaId,$mediaName,$openid) { $DIRECTORY_SEPARATOR = "/"; $childDir = $DIRECTORY_SEPARATOR.'usr'.$DIRECTORY_SEPARATOR.'uploads' . $DIRECTORY_SEPARATOR .'wechatServer' .$DIRECTORY_SEPARATOR; $options = Helper::options(); getResourcesData($mediaId,$mediaName); $url = WechatUtils::uploadFile($options->rootUrl, $childDir,$mediaName,$openid); return $url; } function typeVideoContent($mediaId,$mediaName,$openid) { $DIRECTORY_SEPARATOR = "/"; $childDir = $DIRECTORY_SEPARATOR.'usr'.$DIRECTORY_SEPARATOR.'uploads' . $DIRECTORY_SEPARATOR .'wechatServer' .$DIRECTORY_SEPARATOR; $options = Helper::options(); getResourcesData($mediaId,$mediaName); $url = WechatUtils::uploadFile($options->rootUrl, $childDir,$mediaName,$openid); return $url; } function typeImageContent($url, $b,$openid) { $c = WechatUtils::uploadPic($b, uniqid(), $url, 'web', '.jpg',$openid); $url = $c.','; return $url; } function typeTextContent($a,$c = true) { if ($c) { $a = $a .' '; } return $a; } function parseCircleContent($data, $options,$openid,$type) { $arr = json_decode($data, true); $arr = $arr['results']; $data = array(); $data['text'] = ''; $images = ''; foreach ($arr as $con2) { if($type == 'resource'){ if ($con2['type'] == 'image') { $images .= typeImageContent($con2['content'], $options->rootUrl,$openid); $filtered_arr = array_filter(explode(',', $images), function($value) { return $value !== '' && $value !== null; }); $data['resources'] = json_encode($filtered_arr); } if ($con2['type'] == 'voice') { $voice_arr = explode('!',$con2['content']); $voice_url = typeVoiceContent($voice_arr[0],$voice_arr[0].'.'.$voice_arr[1],$openid); $data['resources'] = json_encode(explode(',',$voice_url)); } if ($con2['type'] == 'video') { $voice_arr = explode('!',$con2['content']); $voice_url = typeVideoContent($voice_arr[0],$voice_arr[0].'.'.$voice_arr[1],$openid); $data['resources'] = json_encode(explode(',',$voice_url)); } } elseif($type == 'text'){ if ($con2['type'] == 'text') { $data['text'] .= typeTextContent($con2['content'], true); } } } return $data; } // 获取MD5加密后的内容 function getEncryptToken(){ $db = Typecho_Db::get(); return md5(md5("bearsimple!@#$%^&*()-=+@#$%$" . Helper::options()->openId . "bearsimple!@#$%^&*()-=+@#$%$@#$%^&*")); } switch($_POST['action']){ case 'sendCircle': $options = Helper::options(); if (!empty($_POST['content']) && !empty($_POST['postEncryptToken']) && !empty($_POST['cid']) && !empty($_POST['agent'])) { $cid = $_POST['cid']; $postEncryptToken = $_POST['postEncryptToken']; $agent = $_POST['agent']; $msg_type = $_POST['msg_type']; $encryptToken = getEncryptToken(); if (md5($postEncryptToken) == $encryptToken) { $msgid = $_POST['msgid']; $db = Typecho_Db::get(); $checkMsgidSql = $db->select()->from('table.bscore_wechat_msgids')->where('msgid = ?', $msgid); $exists = $db->fetchRow($checkMsgidSql); if ($exists) { echo "1"; exit; } else { $db->query($db->insert('table.bscore_wechat_msgids')->rows(array('msgid' => $msgid))); $getAdminSql = $db->select()->from('table.users')->limit(1); $user = $db->fetchRow($getAdminSql); $time = time(); $thisText = parseCircleContent($_POST['content'], $options,$_POST['openid'],'text')['text']; $insert = $db->insert('table.comments')->rows(array('cid' => $cid, 'created' => $time, 'author' => $user['screenName'], 'authorId' => $user['uid'], 'ownerId' => $user['uid'], 'text' => $thisText, 'url' => $user['url'], 'mail' => $user['mail'], 'agent' => $agent, 'ip' => '1.1.1.1')); $insertId = $db->query($insert); $row = $db->fetchRow($db->select('commentsNum')->from('table.contents')->where('cid = ?', $cid)); $db->query($db->update('table.contents')->rows(array('commentsNum' => (int) $row['commentsNum'] + 1))->where('cid = ?', $cid)); $queryTable = $db->fetchRow($db->select()->from('table.comments')->where('cid = ?', $cid)->where('created = ?', $time)); $circle_data = array( 'coid' => $queryTable['coid'], 'location' => '', 'private' => false, 'resources' => parseCircleContent($_POST['content'], $options,$_POST['openid'],'resource')['resources'], ); $db->query($db->insert('table.bscore_friendcircle_data')->rows($circle_data)); echo '1'; } } else { echo '-2'; } } else { echo '-3'; } break; case 'saysTalk': if (!empty($_POST['content']) && !empty($_POST['postEncryptToken']) && !empty($_POST['cid']) && !empty($_POST['agent'])) { $cid = $_POST['cid']; $thisText = $_POST['content']; $postEncryptToken = $_POST['postEncryptToken']; $agent = $_POST['agent']; $msg_type = $_POST['msg_type']; $encryptToken = getEncryptToken(); if (md5($postEncryptToken) == $encryptToken) { $db = Typecho_Db::get(); $getAdminSql = $db->select()->from('table.users')->limit(1); $user = $db->fetchRow($getAdminSql); $insert = $db->insert('table.comments')->rows(array('cid' => $cid, 'created' => time(), 'author' => $user['screenName'], 'authorId' => $user['uid'], 'ownerId' => $user['uid'], 'text' => $thisText, 'url' => $user['url'], 'mail' => $user['mail'], 'agent' => $agent, 'ip' => '1.1.1.1')); $insertId = $db->query($insert); $row = $db->fetchRow($db->select('commentsNum')->from('table.contents')->where('cid = ?', $cid)); $db->query($db->update('table.contents')->rows(array('commentsNum' => (int) $row['commentsNum'] + 1))->where('cid = ?', $cid)); echo '1'; } else { echo '-2'; } } else { echo '-3'; } break; default: $app = new Application($config); $app->server->push(BearWechatHandler::class); $response = $app->server->serve(); $response->send(); } ================================================ FILE: core/widget/write.php ================================================ to($user); if ($user->hasLogin()) { if ($_GET["url"] == 'post' || $_GET["url"] == 'page') { if ($_GET["cid"]) { Typecho_Widget::widget('Widget_Contents_Attachment_Related', 'parentId=' . $_GET["cid"])->to($attachment); } else { Typecho_Widget::widget('Widget_Contents_Attachment_Unattached')->to($attachment); } $result = array( 'code' => '1', 'list' => array() ); $imgif= array('.jpg','.gif','.png','.jpeg','.svg','.ico'); while ($attachment->next()){ if (preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $attachment->attachment->url)) { $attachtype = 'img'; }else{ $attachtype = 'other'; } $result['list'][] = array( 'title' => $attachment->title, 'cid' => $attachment->cid, 'url' => $attachment->attachment->url, 'type'=>$attachtype, ); } echo json_encode($result); } } else{ $arr['msg'] ='鉴权失败'; exit(json_encode($arr,JSON_UNESCAPED_UNICODE)); } ================================================ FILE: cross-says.php ================================================ user->hasLogin()): ?>
        to($security); if(Bsoptions('emaction_Openplace') && in_array('2',Bsoptions('emaction_Openplace'))&& Bsoptions('emaction_Closelike') == true){ $emaction = true; } else{ $emaction = false; } ?>
        date('Y-m-d H:i'); ?>

        content,'comment')); ?>


        hidden?array('agree' => 0, 'recording' => true):agreeNumforcomment($comments->coid);?>
        agent); ?>
        comments()->to($comments); ?> commentsNum == '0'):?>

        暂无动态

        listComments(); $comments_content = ob_get_contents(); ob_end_clean(); $comments_content = preg_replace("/
          /sm", '', $comments_content); $comments_content = preg_replace("/<\/ol>/sm", '', $comments_content); echo $comments_content; ?>
        pageNav('«','»', 1, ''); $content = ob_get_contents(); ob_end_clean(); if(Bsoptions('pagination_style') == '2'){ $content = preg_replace("/
          /sm", '', $content); } if(empty(Bsoptions('pagination_style')) || Bsoptions('pagination_style') == '1'){ $content = preg_replace("/
            /sm", '
            ', $content); $content = preg_replace("/
          1. (.*?)<\/span><\/li>/sm", '...', $content); $content = preg_replace("/
          2. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
          3. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
          4. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
          5. (.*?)<\/a><\/li>/sm", '下一页', $content); //旧版本兼容 $content = preg_replace("/
          6. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
          7. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
          8. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
          9. (.*?)<\/a><\/li>/sm", '下一页', $content); $content = preg_replace("/<\/ol>/sm", '
          10. ', $content); } echo $content; ?> ================================================ FILE: cross.php ================================================ need('compoment/head.php');?>

            title() ?>


            to($stat); ?>
            publishedPostsNum > '999'){echo '999+';}else{echo $stat->publishedPostsNum();} ?>
            篇文章
            publishedCommentsNum - $this->commentsNum> '999'){echo '999+';}else{echo $stat->publishedCommentsNum - $this->commentsNum;} ?>
            条评论
            commentsNum > '999'){echo '999+';}else{echo $this->commentsNum;} ?>
            条动态
            need('cross-says.php'); ?>
            is('page')):?> need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: douban.php ================================================ need('compoment/head.php');?>

            title() ?>

            影视

            读书

            音乐

            need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: friendcircle.php ================================================ need('compoment/head.php');?> $this->hidden ? 0 : $this->cid, 'parentContent' => $this->row, 'respondId' => $this->respondId, 'commentPage' => $this->request->filter('int')->commentPage, 'commentsPageSize' => '4', 'allowComment' => $this->allow('comment') ); $this->widget('BearSimple_Widget_Friendcircle_Archive',$parameter)->to($comments); ?>

            title() ?>

            神秘人 神秘人的朋友圈
            have()): ?>

            博主当前还没有朋友圈呢~

            have()): ?>
            listComments(); $comments_content = ob_get_contents(); ob_end_clean(); $comments_content = preg_replace("/
              /sm", '
                ', $comments_content); $comments_content = preg_replace("/<\/ol>/sm", '
              ', $comments_content); echo $comments_content; ?> pageNav('«','»', 1, ''); $content = ob_get_contents(); ob_end_clean(); $content = preg_replace("/
                /sm", '
                ', $content); $content = preg_replace("/
              1. (.*?)<\/span><\/li>/sm", '...', $content); $content = preg_replace("/
              2. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              3. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              4. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
              5. (.*?)<\/a><\/li>/sm", '下一页', $content); //旧版本兼容 $content = preg_replace("/
              6. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              7. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              8. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
              9. (.*?)<\/a><\/li>/sm", '下一页', $content); $content = preg_replace("/<\/ol>/sm", '
              10. ', $content); echo $content; ?>
            need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: functions.php ================================================ pluginDir('BsCore').'/bsoptions-framework.php'; } if (!class_exists('bsOptions')){ require_once \Utils\Helper::options()->pluginDir('BsCore').'/bsOptions.php'; } require_once('core/func.php'); function themeVersion() { return '2.9.9.20250803'; } function themeVersionOnly() { return '2.9.9'; } $options = bsOptions::getInstance()::get_option( 'bearsimple' ); function Bsoptions($key, $default = false){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); return $options[$key]; } /**解析表情**/ $emo = false; function reEmo($comment,$type){ global $emo; $options = Helper::options(); if(!$emo){ $opts = array( 'http'=>array( 'method' => 'GET', 'header' => 'Content-type: application/json', 'timeout' => 60, 'Connection'=>"close" ) ); $context = stream_context_create($opts); if(Bsoptions('Emoji_HideDefault') == false || Bsoptions('Emoji_HideDefault') == ''){ $res = json_decode(file_get_contents(__DIR__.'/assets/vendors/bs-emoji/bs-emoji.json', false, $context),true); $emo = $res; } if(Bsoptions('Emoji_Diy') == true && Bsoptions('Emoji_DiyUrl') !== ''){ $res2 = json_decode(file_get_contents(Bsoptions('Emoji_DiyUrl'), false, $context),true); if(Bsoptions('Emoji_HideDefault') == false || Bsoptions('Emoji_HideDefault') == ''){ $emo = array_merge($res,$res2); } else{ $emo = $res2; } } } foreach ($emo as $v){ if($v['category'] !== ''){ if($type == 'comment'){ $comment = str_replace($v['data'], '', $comment); } elseif($type == 'reply'){ $comment = str_replace($v['data'], '', $comment); } elseif($type == 'circle'){ $comment = str_replace($v['data'], '', $comment); $comment = str_replace($v['codex'], '', $comment); } else{ $comment = str_replace($v['data'], '', $comment); } } } //当评论没有私密评论时去除私密评论识别标签 $comment = str_replace('@私密@', '', $comment); return $comment; } function reEmoPost($post){ global $emo; $options = Helper::options(); if(!$emo){ $opts = array( 'http'=>array( 'method' => 'GET', 'header' => 'Content-type: application/json', 'timeout' => 60 * 10, 'Connection'=>"close" ) ); $context = stream_context_create($opts); if(Bsoptions('Emoji_HideDefault') == false || Bsoptions('Emoji_HideDefault') == ''){ $res = json_decode(file_get_contents($options->themeUrl."/assets/vendors/bs-emoji/bs-emoji.json", false, $context),true); $emo = $res; } if(Bsoptions('Emoji_Diy') == true && Bsoptions('Emoji_DiyUrl') !== ''){ $res2 = json_decode(file_get_contents(Bsoptions('Emoji_DiyUrl'), false, $context),true); if(Bsoptions('Emoji_HideDefault') == false || Bsoptions('Emoji_HideDefault') == ''){ $emo = array_merge($res,$res2); } else{ $emo = $res2; } } } foreach ($emo as $v){ if($v['category'] !== ''){ $post = str_replace($v['data'], '', $post); } } return $post; } if( class_exists( 'CSF' ) ) { $Tyoptions = Helper::options(); $db = \Typecho\Db::get(); $adapter = $db->getAdapterName(); $prefix = 'bearsimple'; syncDb(); CSF::createOptions( $prefix, array( 'menu_title' => 'Bearsimple', 'menu_slug' => 'my-bearsimple', ) ); CSF::createSection( $prefix, array( 'title' => '使用说明', 'icon' => 'fas fa-question-circle', 'description' => '欢迎使用BearSimple主题v2版本,本主题为简约式主题,适合喜欢简约类的博客站长使用,以下是本主题的使用说明。 😎 功能引导 ', 'fields' => array( array( 'type' => 'heading', 'content' => '使用说明', ), array( 'type' => 'content', 'content' => '1、使用本主题尽量少安装插件,否则可能因存在冲突导致各种各样的问题
            2、主题用户交流QQ群:561848356
            3、主题文档中心:戳这里访问
            4、若主题配置保存失败请检查是否开启了防火墙,且防火墙是否拦截了请求
            5、不懂的问题或本主题存在的问题可加群或在社区中进行反馈
            6、 BearTalk社区是为使用者提供的一个讨论交流社区,传送门:戳这里

            当前版本:v'.themeVersion().' / 最新版本:v
            ', ), array( 'type' => 'submessage', 'style' => 'info', 'content' => '在反馈本主题相关的问题时,请务必将以下内容放入您要反馈的内容中', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '
            • BearSimple主题版本:v'.themeVersion().'[更新日志]
            • PHP版本:'.PHP_VERSION.'
            • 网站服务器:'.$_SERVER['SERVER_SOFTWARE'].'
            • 数据库:'.$db->getAdapterName().'[Version:'.$db->getVersion().']
            • Typecho版本:'.$Tyoptions->version.'
            • User Agent信息:'.$_SERVER['HTTP_USER_AGENT'].'
            ', ), ) ) ); $siteMaintenance_files = glob(__DIR__ . '/modules/siteMaintenance/*.html'); $siteMaintenance_styles = array_map('basename', $siteMaintenance_files); $siteMaintenance_associative = array_combine($siteMaintenance_styles, $siteMaintenance_styles); CSF::createSection( $prefix, array( 'title' => '基础设置', 'icon' => 'fas fa-cog', 'fields' => array( array( 'id' => 'header_choose', 'type' => 'radio', 'title' => '站点LOGO类型', 'inline' => true, 'options' => array( 'text' => '文字LOGO', 'image' => '图片LOGO', ), 'default' => 'text' ), array( 'id' => 'textlogo_text', 'type' => 'text', 'title' => '站点文字LOGO', 'default' => $Tyoptions->title, 'after' => '请填入站点文字LOGO', 'dependency' => array( 'header_choose', '==', 'text' ), ), array( 'id' => 'textlogo_dec', 'type' => 'textarea', 'title' => '站点文字介绍', 'after' => '请填入站点文字介绍', 'dependency' => array( 'header_choose', '==', 'text' ), ), array( 'id' => 'imagelogo', 'title' => '站点图片LOGO', 'after' => '请上传站点图片LOGO,最佳尺寸为250X70', 'type' => 'upload', 'dependency' => array( 'header_choose', '==', 'image' ), ), array( 'id' => 'imagelogo_dark', 'title' => '站点图片LOGO[黑暗模式]', 'after' => '请上传黑暗模式时的站点图片LOGO,最佳尺寸为250X70', 'type' => 'upload', 'dependency' => array( 'header_choose', '==', 'image' ), ), array( 'id' => 'favicon', 'type' => 'upload', 'title' => '站点Favicon图标', ), array( 'id' => 'siteMaintenance_Open', 'type' => 'switcher', 'title' => '是否开启维护模式', 'subtitle' => '选择开启则前台访客访问将显示维护模式页面,仅管理员身份登录后可正常访问前台', 'default' => false, ), array( 'id' => 'siteMaintenance_templates', 'type' => 'select', 'title' => '维护模式模板', 'after' => '选择维护模式模板,邮件模板可自由DIY,目录位于/usr/themes/bearsimple/modules/siteMaintenance', 'options' => $siteMaintenance_associative, 'default' => 'default.html', 'dependency' => array( 'siteMaintenance_Open', '==', 'true' ), ), array( 'id' => 'avatar__choose', 'type' => 'radio', 'title' => '头像服务选择', 'inline' => true, 'options' => array( 'cravatar' => 'Cravatar服务', 'weavatar' => 'Weavatar服务', 'gravatar' => 'Gravatar服务', 'diyavatar' => '自定义头像', 'closeavatar' => '不显示头像', ), 'default' => 'cravatar', 'after' => 'Cravatar服务:Cravatar适合在国内使用,优先级:Cravatar头像->Gravatar头像->QQ头像
            Weavatar服务:Weavatar也适合在国内使用,优先级:Weavatar头像->Gravatar头像->QQ头像
            Gravatar服务:在国内官方源可能访问不了头像,支持了多个镜像源并支持您填写自定义镜像源
            自定义头像:您可以通过自定义头像在前台为每个用户显示出随机头像,在自定义头像栏为空时默认为Cravatar
            不显示头像:若选择不显示头像,则评论区和侧边栏最新评论都将不显示头像
            目前QQ头像调用的是Weavatar,若注册过Weavatar,则不会显示QQ头像', ), array( 'id' => 'Cravatar_default', 'type' => 'upload', 'title' => 'Cravatar默认头像', 'after' => '考虑到Cravatar默认头像略丑的问题,这里支持自定义Cravatar默认头像。', 'dependency' => array( 'avatar__choose', '==', 'cravatar' ), ), array( 'id' => 'Weavatar_default', 'type' => 'upload', 'title' => 'Weavatar默认头像', 'after' => '考虑到Weavatar默认头像略丑的问题,这里支持自定义Weavatar默认头像。', 'dependency' => array( 'avatar__choose', '==', 'weavatar' ), ), array( 'id' => 'DiyAvatar', 'type' => 'textarea', 'title' => '自定义头像', 'after' => '您可以自定义前台评论区随机头像,格式为a.png,b.png,保证每个头像图片都为直链可直接访问,多个头像图片使用英文逗号分隔,当本栏为空时默认使用Cravatar服务。', 'dependency' => array( 'avatar__choose', '==', 'diyavatar' ), ), array( 'id' => 'Gravatar', 'type' => 'select', 'title' => 'Gravatar源选择', 'after' => '因Gravatar官方在中国大陆地区被Q,导致在中国大陆访问使用Gravatar的站点时头像不显示,这里支持您自主选择合适的源,若为自定义,举例:cdn.v2ex.com/gravatar/
            本功能适配QQ,当填写的邮箱为QQ邮箱时则显示QQ头像', 'options' => array('1' => 'Gravatar官方源', '3' => 'V2EX*Gravatar镜像源','4' => 'LOLI.NET*Gravatar镜像源','7' => '自定义Gravatar镜像源'), 'default' => '5', 'dependency' => array( 'avatar__choose', '==', 'gravatar' ), ), array( 'id' => 'GravatarUrl', 'type' => 'text', 'title' => '自定义Gravatar源地址', 'after' => '请填入自定义Gravatar镜像源地址,格式:cdn.v2ex.com/gravatar/
            Tips:当您所填写的自定义地址访问时能够显示图片时则您所填写的地址是正常的', 'dependency' => array( 'Gravatar|avatar__choose', '==|==', '7|gravatar' ), ), array( 'id' => 'Assets', 'type' => 'select', 'title' => '资源CDN加速', 'placeholder' => '选择合适的CDN加速方式', 'after' => '本主题支持您选择合适的储存方式来储存样式资源文件进而达到网站加速的效果。', 'options' => array('1' => '本地储存', '3' => '自定义储存'), 'default' => '1', ), array( 'id' => 'Assets_Custom', 'type' => 'text', 'title' => '自定义CDN加速源地址', 'after' => '请填入风格文件储存源地址,例子:https://xxxx.com/,或者https://xxxx.com/xxx/,请务必将整个assets目录都放进去!!!当你填写的是https://xxxx.com/时,风格存储地址应该是https://xxxx.com/assets
            检测结果:'.GetCheck(), 'dependency' => array( 'Assets', '==', '3' ), ), array( 'id' => 'BackGround', 'type' => 'upload', 'title' => '网站背景', 'after' => '请上传网站背景图片,若为空则不显示
            提醒:图片名请勿带括号等特殊符号,如xxx(1).jpg,可能会出现无法显示的情况', ), array( 'id' => 'Diyfont', 'type' => 'upload', 'title' => '自定义字体', 'after' => '您可以自定义网站所显示的字体,请填入字体直链,或直接上传字体文件,若为空则表示使用默认字体', ), array( 'id' => 'hcsticky', 'type' => 'switcher', 'title' => '是否对侧边栏使用粘住', 'subtitle' => '若开启,则侧边栏吸顶。', 'default' => false, ), array( 'id' => 'global_shadow', 'type' => 'switcher', 'title' => '全局增加阴影效果', 'subtitle' => '阴影效果在宽屏模式下看不到效果。', 'default' => false, ), array( 'id' => 'global_transparent', 'type' => 'switcher', 'title' => '全局增加透明效果', 'subtitle' => '透明效果需设置一张背景图方可显示。', 'default' => false, ), array( 'id' => 'pagination_style', 'type' => 'select', 'title' => '分页样式选择', 'after' => '选择上一页下一页的分页样式,默认为新样式。', 'options' => array('1' => '新样式', '2' => '旧样式'), 'default' => '1', ), array( 'id' => 'site_style', 'type' => 'select', 'title' => '页面布局选择', 'after' => '选择页面布局,双栏或单栏。', 'options' => array('1' => '双栏(文章展现列表+侧边区块栏)', '2' => '单栏(仅文章展现列表)'), 'default' => '1', ), array( 'id' => 'width_Selection', 'type' => 'select', 'title' => '页面宽度模式', 'options' => array( '1' => '窄屏', '2' => '宽屏', ), 'after' => '选择前台是要宽屏模式还是窄屏模式,若为窄屏模式则为固定宽度,若为宽屏模式则跟随屏幕的宽度而变化。', 'default' => '1' ), ) ) ); CSF::createSection( $prefix, array( 'title' => '首页及分类', 'icon' => 'fas fa-list-alt', 'fields' => array( array( 'id' => 'Sticky', 'type' => 'switcher', 'title' => '是否开启文章置顶', 'default' => false, ), array( 'id' => 'Sticky_cids', 'type' => 'select', 'title' => '首页需要置顶的文章', 'chosen' => true, 'multiple' => true, 'sortable' => true, 'ajax' => true, 'options' => 'posts', 'placeholder' => '选择需要置顶的文章', 'dependency' => array( 'Sticky', '==', 'true' ), ), array( 'id' => 'Sticky_cids_pages', 'type' => 'select', 'title' => '首页需要置顶的页面', 'chosen' => true, 'multiple' => true, 'sortable' => true, 'ajax' => true, 'options' => 'pages', 'placeholder' => '选择需要置顶的页面', 'dependency' => array( 'Sticky', '==', 'true' ), ), array( 'id' => 'Sticky_cids_category', 'type' => 'select', 'title' => '分类需要置顶的文章', 'chosen' => true, 'multiple' => true, 'sortable' => true, 'ajax' => true, 'options' => 'posts', 'placeholder' => '选择需要置顶的文章', 'dependency' => array( 'Sticky', '==', 'true' ), ), array( 'id' => 'Sticky_Category', 'type' => 'switcher', 'title' => '开启后分类置顶只在文章所属分类置顶', 'default' => false, 'dependency' => array( 'Sticky', '==', 'true' ), ), array( 'id' => 'Sticky_Mod', 'type' => 'code_editor', 'title' => '文章置顶样式', 'subtitle' => '可自定义文章置顶样式,支持HTML', 'default' => '[置顶]', 'dependency' => array( 'Sticky', '==', 'true' ), ), array( 'id' => 'Cate_Encrypt_open', 'type' => 'switcher', 'title' => '是否开启文章分类加密', 'subtitle' => '您可以对一些不想显示的隐私分类设置密码,本项对已登录用户无效。', 'default' => false, ), array( 'id' => 'Cate_Encrypt_hide', 'type' => 'switcher', 'title' => '加密分类中的文章是否在首页显示', 'subtitle' => '若开启,则加密分类的所有文章均正常显示在首页中,本项对已登录用户无效。', 'default' => false, 'dependency' => array( 'Cate_Encrypt_open', '==', 'true'), ), array( 'id' => 'Cate_Encrypt', 'type' => 'group', 'title' => '分类加密', 'subtitle' => '您可以通过本项增加指定分类的加密
            若同个分类设置多个加密,则排越后面越优先。', 'dependency' => array( 'Cate_Encrypt_open', '==', 'true'), 'fields' => array( array( 'id' => 'Cate_Encrypt_Name', 'type' => 'text', 'title' => '标识', 'after' => '您可以给该分类加密加个标注,该项仅后台可见~', ), array( 'id' => 'Cate_Encrypt_Id', 'type' => 'select', 'title' => '要加密的分类选择', 'chosen' => true, 'multiple' => false, 'sortable' => true, 'ajax' => true, 'options' => 'category', 'placeholder' => '选择需要加密的分类', ), array( 'id' => 'Cate_Encrypt_Note', 'type' => 'text', 'title' => '该分类加密页面描述', 'after' => '您可以给该分类加密页面加个描述,该描述前台访客可见~', ), array( 'id' => 'Cate_Encrypt_Password', 'type' => 'text', 'title' => '该分类加密密码', 'after' => '请填写该分类加密的密码,若该项为空,则默认密码为654321', ), ), ), array( 'id' => 'Article_forma', 'type' => 'select', 'title' => '选择首页、分类等页面输出文章的展现样式', 'after' => '图文样式优先级:文章封面->附件首图->文章首图->自定义随机图片[当图文样式开启使用自定义随机图片为首选时优先级将改变],无图片时默认显示预设图片', 'options' => array('1' => '图文样式', '2' => '纯文字样式'), 'default' => '1', ), array( 'id' => 'Article_forma_randchoose', 'type' => 'switcher', 'title' => '图文样式是否使用自定义随机图片为首选', 'subtitle' => '若开启本项,自定义随机图片的优先级将上调到最高等级,优先级:自定义随机图片->文章封面->附件首图->文章首图', 'default' => false, 'dependency' => array( 'Article_forma', 'any', '1,3,5' ), ), array( 'id' => 'Article_forma_randapi', 'type' => 'switcher', 'title' => '图文样式是否使用随机图API', 'subtitle' => '若开启本项,则自定义随机图片中仅需填写一个随机图API即可', 'default' => false, 'dependency' => array( 'Article_forma', 'any', '1,3,5' ), ), array( 'id' => 'Article_forma_pic', 'type' => 'textarea', 'title' => '图文样式自定义随机图片', 'after' => '请填入图文样式自定义随机图片,多张图片使用|间隔
            当开启了随机图API选项后,若为随机图API,仅需填写一个即可,或者可以填写多个随机图API地址,也是使用|间隔
            提醒:图片地址建议不要带参数之类的,可能会出现无法显示的情况', 'dependency' => array( 'Article_forma', 'any', '1,3,5' ), ), array( 'id' => 'articletitlenum', 'type' => 'number', 'title' => '首页、分类等页面输出文章的标题字数', 'after' => '

            首页、分类等页面输出文章的标题字数, 填写数字即可', 'unit' => '个字', ), array( 'id' => 'articleexcerptnum', 'type' => 'number', 'title' => '首页、分类等页面输出文章的摘要字数', 'after' => '

            填写数字即可,该项仅应用于自动截取摘要,当文章内存在手动填写摘要时该项无效', 'unit' => '个字', ), ) ) ); $all = Typecho_Plugin::export(); if (!array_key_exists('TePass', $all['activated'])){ $Tepass_check = '当前Tepass插件未启用~'; } else{ $Tepass_check = '当前Tepass插件已启用~'; } CSF::createSection( $prefix, array( 'title' => '顶部设置', 'icon' => 'fas fa-chevron-up', 'fields' => array( array( 'id' => 'DNSYJX', 'type' => 'switcher', 'title' => 'DNS预解析', 'default' => false, ), array( 'id' => 'DNSYJX_AR', 'type' => 'repeater', 'title' => 'DNS预解析地址', 'after' => '对于某些情况而言开启能够提升访问速度,而禁用的话能节省每月100亿的DNS查询', 'dependency' => array( 'DNSYJX', '==', 'true' ), 'fields' => array( array( 'id' => 'DNSADDRESS', 'type' => 'text', 'title' => '预解析地址' ), array( 'id' => 'DNSADDRESS_Preconnect', 'type' => 'switcher', 'title' => '是否启用预连接', 'default' => false, ), array( 'id' => 'DNSADDRESS_Crossorign', 'type' => 'switcher', 'title' => '是否启用跨域资源共享(CORS)', 'default' => false, 'dependency' => array( 'DNSADDRESS_Preconnect', '==', 'true' ), ), ), ), array( 'id' => 'CustomizationCode', 'type' => 'code_editor', 'title' => '顶部自定义代码', 'subtitle' => '如百度Meta验证代码,均可以放在这里', ), array( 'id' => 'menu_style', 'type' => 'select', 'title' => '导航栏显示选择', 'after' => '选择头部导航栏的显示,默认为显示。', 'options' => array('1' => '显示', '3' => '不显示'), 'default' => '1', ), array( 'id' => 'menu_tem', 'type' => 'select', 'title' => '导航栏样式', 'after' => '选择头部导航栏的样式,默认为新样式。', 'options' => array('1' => '旧样式', '2' => '新样式'), 'default' => '2', 'dependency' => array( 'menu_style', '==', '1' ), ), array( 'id' => 'menu_NewtemSticky', 'type' => 'switcher', 'title' => '导航栏吸顶', 'dependency' => array( 'menu_style|menu_tem', '==|==', '1|2' ), ), array( 'id' => 'menu_NewtemToggle', 'type' => 'select', 'title' => '导航栏展开方向[手机端]', 'after' => '选择头部导航栏的展开方向,默认为左边。', 'options' => array('left' => '左边', 'right' => '右边', 'top' => '上边', 'bottom' => '下边'), 'default' => '1', 'dependency' => array( 'menu_style|menu_tem', '==|==', '1|2' ), ), array( 'id' => 'CategoryMenu', 'type' => 'switcher', 'title' => '导航栏显示下拉分类', 'text_on' => '显示', 'text_off' => '不显示', 'text_width' => '100', 'dependency' => array( 'menu_style', '==', '1' ), ), array( 'id' => 'PageMenu', 'type' => 'select', 'title' => '导航栏页面输出选择', 'after' => '选择集合下拉则将所有自定义页面集合为下拉列表,而横向排列则把所有自定义页面链接直接输出,隐藏则隐藏所有页面', 'options' => array('1' => '集合下拉', '2' => '横向排列', '3' => '隐藏'), 'default' => '1', 'dependency' => array( 'menu_style', '==', '1' ), ), array( 'id' => 'Menu', 'type' => 'repeater', 'title' => '自定义导航', 'after' => '自由添加前台自定义导航,且可设置是否登录可见', 'dependency' => array( 'menu_style', '==', '1' ), 'fields' => array( array( 'id' => 'Menu_Text', 'type' => 'link', 'title' => '导航链接及文字' ),array( 'id' => 'Menu_LoginShow', 'type' => 'switcher', 'title' => '是否登录可见', ), ), ), ) ) ); CSF::createSection( $prefix, array( 'title' => '底部设置', 'icon' => 'fas fa-chevron-down', 'fields' => array( array( 'id' => 'IcpBa', 'type' => 'text', 'title' => 'ICP备案号', 'after' => '请填写您网站的ICP备案号,若无ICP备案请为空', ), array( 'id' => 'PoliceBa', 'type' => 'text', 'title' => '公安备案号', 'after' => '请填写您网站的公安备案号,若无公安备案请为空', ), array( 'id' => 'allOfCharacters', 'type' => 'switcher', 'title' => '底部显示站点文章总字数', 'default' => false, ), array( 'id' => 'CustomizationFooterCode', 'type' => 'code_editor', 'title' => '底部自定义代码', 'after' => '可放置网站统计代码等
            谨慎填写,仅需填写代码即可!需注意语法,若语法错误可能会造成前台报错甚至组件动作失效!', ), array( 'id' => 'CustomizationFooterJsCode', 'type' => 'code_editor', 'title' => '底部自定义JS代码', 'after' => '可放置自定义JS代码等
            谨慎填写,仅需填写代码即可!需注意JS语法,若语法错误可能会造成前台报错甚至组件动作失效!', ), array( 'id' => 'load_Time', 'type' => 'switcher', 'title' => '显示页面加载时间', 'text_on' => '是', 'text_off' => '否', 'text_width' => '100', ), array( 'id' => 'blogsclub_shuttle', 'type' => 'switcher', 'title' => '展现BlogsClub空间穿梭传送门', 'text_on' => '是', 'text_off' => '否', 'text_width' => '100', 'after' => '

            BlogsClub是BearNotion推出的博客俱乐部项目,每一位博主都可以加入,官方网站:戳这里
            您可以开启本项来支持BlogsClub~~~', ), ) ) ); CSF::createSection( $prefix, array( 'title' => '幻灯片设置', 'icon' => 'fas fa-images', 'fields' => array( array( 'id' => 'Slidersss', 'type' => 'switcher', 'title' => '是否开启幻灯片功能', 'default' => false, ), array( 'id' => 'SliderIndexs', 'type' => 'switcher', 'title' => '首页开启幻灯片', 'default' => false, 'subtitle' => '对象:首页', 'dependency' => array( 'Slidersss', '==', 'true' ), ), array( 'id' => 'SliderOthers', 'type' => 'switcher', 'title' => '其他位置开启幻灯片', 'default' => false, 'subtitle' => ' 对象:分类、标签、搜索', 'dependency' => array( 'Slidersss', '==', 'true' ), ), array( 'id' => 'slider__content', 'type' => 'group', 'title' => '幻灯片', 'after' => '添加幻灯片需注意幻灯片图片务必为直链。', 'dependency' => array( 'Slidersss', '==', 'true' ), 'fields' => array( array( 'id' => 'slider__note', 'type' => 'text', 'title' => '幻灯片备注', 'after'=>'可以备注下该幻灯片,仅后台可见' ), array( 'id' => 'slider__pic', 'title' => '幻灯片图片', 'after' => '图片链接务必为直链', 'type' => 'upload', ), array( 'id' => 'slider__url', 'type' => 'text', 'title' => '幻灯片跳转链接', 'after'=>'链接务必带http(s)://' ), array( 'id' => 'slider__title', 'type' => 'text', 'title' => '幻灯片标题', 'after' => '留空则不显示该幻灯片的标题' ), array( 'id' => 'slider__desc', 'type' => 'text', 'title' => '幻灯片描述', 'after' => '留空则不显示该幻灯片的描述' ), array( 'id' => 'slider__window', 'type' => 'switcher', 'title' => '新窗口打开', 'default' => false, ), ), ), ) ) ); CSF::createSection( $prefix, array( 'title' => '公告栏设置', 'icon' => 'fas fa-bullhorn', 'fields' => array( array( 'id' => 'Popup', 'type' => 'switcher', 'title' => '是否开启网站公告栏', 'subtitle' => '若开启公告栏,则网站左下角会出现公告栏,可填写要向访客展示的公告。', 'default' => false, ), array( 'id' => 'PopupTitle', 'type' => 'text', 'title' => '公告栏标题', 'after' => '请填写公告栏标题,它将显示在公告栏顶部,不填写则不显示', 'dependency' => array( 'Popup', '==', 'true' ), ), array( 'id' => 'PopupKey', 'type' => 'text', 'title' => '公告栏更新识别码', 'after' => '请填写公告栏更新识别码,默认为announcement
            作用是当访客设置多久不显示公告时,只要更新识别码,公告就会再显示。
            可以作为公告更新后提醒访客使用,注意每次识别码的填写都需要与前面所填写的值不同,建议为字母+数字~', 'default'=> 'announcement', 'dependency' => array( 'Popup', '==', 'true' ), ), array( 'id' => 'Popup_Value', 'type' => 'repeater', 'title' => '创建公告', 'after' => '可添加多条公告,分别填写公告标题和内容,公告内容支持HTML', 'dependency' => array( 'Popup', '==', 'true' ), 'fields' => array( array( 'id' => 'Popup_Title_Value', 'type' => 'text', 'title' => '公告栏标题' ), array( 'id' => 'Popup_Content_Value', 'type' => 'textarea', 'title' => '公告栏内容' ), ), ), ) ) ); if(isset($Tyoptions->cronKey)){ $cronUrl = 'php '.__DIR__.'/core/widget/cron.php '.$Tyoptions->cronKey; } else{ $cronUrl = '未初始化自动检查密钥,请刷新后重新查看'; } $lastestCron = $db->fetchRow($db->select()->from('table.bscore_cron_data')->where('type =? ', 'checkLinks')->order('id',Typecho\Db::SORT_DESC)); if($lastestCron['checksuccess'] !== null){ $lastestCron_Time = '
            自动检查任务运行正常(上一次自动检查执行时间:'.date('Y年m月d日 H:i:s',$lastestCron['checktime']).')
            '; } else{ $lastestCron_Time = '
            自动检查任务运行异常(上一次自动检查执行时间:'.date('Y年m月d日 H:i:s',$lastestCron['checktime']).')
            '; } $lastestCron_Success = $lastestCron['checksuccess']; $lastestCron_Failed = $lastestCron['checkfailed']; $lastestCron_Total = $lastestCron['checktotal']; CSF::createSection( $prefix, array( 'title' => '友链设置', 'icon' => 'fas fa-link', 'fields' => array( array( 'id' => 'FriendLinkChoose', 'type' => 'switcher', 'title' => '是否开启右侧友情链接栏', 'subtitle' => '若选择开启,则站点右侧增加友情链接栏', 'default' => false, ), array( 'id' => 'FriendLink', 'type' => 'textarea', 'title' => '友链内容', 'after' => '请填入友链内容,格式:友链名称|友链简介|友链地址,多个直接换行', 'dependency' => array( 'FriendLinkChoose', '==', 'true' ), ), array( 'id' => 'FriendLink_place', 'type' => 'select', 'title' => '右侧友情链接显示场景', 'after' => '针对SEO优化考虑,这里可自主选择右侧友情链接显示场景', 'options' => array('1' => '全局显示', '2' => '仅首页显示'), 'default' => '1', 'dependency' => array( 'FriendLinkChoose', '==', 'true' ), ), array( 'id' => 'FriendLinkFoot', 'type' => 'switcher', 'title' => '是否将右侧友情链接放置到底部', 'subtitle' => '若选择开启,则站点右侧友情链接将放置到站点底部,同时右侧友情链接栏则会被移除', 'default' => false, 'dependency' => array( 'FriendLinkChoose', '==', 'true' ), ), array( 'id' => 'FriendLinkSubmit', 'type' => 'switcher', 'title' => '是否允许在独立友链页面自助提交友链', 'after' => '

            若为是,则独立友链页面将支持访客自助提交友链(仅当自定义模板选择友链[新]时本项有效)', 'default' => true, ), array( 'id' => 'FriendLinkLogomust', 'type' => 'switcher', 'title' => '自助提交友链LOGO图标是否必填', 'after' => '

            若为否,则独立友链页面提交友链时友链LOGO图标为非必填,并可以自定义设置一个默认LOGO图标(仅当自定义模板选择友链[新]时本项有效)', 'default' => true, 'text_on' => '是', 'text_off' => '否', ), array( 'id' => 'FriendLinkLogoDefault', 'type' => 'upload', 'title' => '友链默认LOGO图标', 'after' => '若设置友链LOGO图标为非必填,则可在本项填写默认LOGO图标地址或上传默认LOGO图标', 'dependency' => array( 'FriendLinkLogomust', '==', 'false' ), ), array( 'id' => 'FriendLinkEmailmust', 'type' => 'switcher', 'title' => '自助提交友链联系邮箱是否必填', 'after' => '

            若为是,则独立友链页面提交友链时需要提交者填写邮箱(仅当自定义模板选择友链[新]时本项有效)', 'default' => false, 'text_on' => '是', 'text_off' => '否', ), array( 'id' => 'FriendLinkSubmitSendMail', 'type' => 'switcher', 'title' => '友链提交后是否发送邮件给博主', 'after' => '

            若为是,则在前台提交友链申请后系统将自动发送一封邮件给博主提醒进行审核(仅当自定义模板选择友链[新]本项有效,并需要您在SMTP设置中开启SMTP服务并配置SMTP信息)', 'default' => false, 'text_on' => '是', 'text_off' => '否', ), array( 'id' => 'FriendLinkAcceptSendMail', 'type' => 'switcher', 'title' => '友链审核后是否发送邮件给提交者', 'after' => '

            若为是,则当博主审核友链后将发送审核通过或者审核不通过的邮件给提交者(仅当自定义模板选择友链[新]且提交者邮件地址存在时本项有效,并需要您在SMTP设置中开启SMTP服务并配置SMTP信息)', 'default' => false, 'text_on' => '是', 'text_off' => '否', ), array( 'id' => 'FriendLinkSkin', 'type' => 'select', 'title' => '友链样式', 'after' => '选择友链样式,分为默认和简约', 'options' => array('0' => '默认', '1' => '简约', '2' => '传统', '3' => '新版'), 'default' => '0', ), array( 'id' => 'FriendLinkRejectShow', 'type' => 'switcher', 'title' => '失效友链展示', 'after' => '

            若为是,则独立友链页面将新增失效友链列表(即已驳回的友链列表)', 'default' => false, 'text_on' => '是', 'text_off' => '否', ), array( 'id' => 'FriendLinkRejectShowAll', 'type' => 'switcher', 'title' => '展示所有失效友链', 'after' => '

            若为是,则展示所有失效友链,若为否则仅展示已填写驳回原因的失效友链', 'default' => false, 'text_on' => '是', 'text_off' => '否', 'dependency' => array( 'FriendLinkRejectShow', '==', 'true' ), ), array( 'id' => 'FriendLinkRejectNote', 'type' => 'textarea', 'title' => '失效友链说明', 'after' => '请填入失效友链说明,将显示在失效友链列表上方', 'dependency' => array( 'FriendLinkRejectShow', '==', 'true' ), ), array( 'type' => 'notice', 'style' => 'info', 'content' => '说明
            以下友链操作针对独立友链页面。', ), array( 'type' => 'content', 'content' => '新增友链', ), array( 'id' => 'friendtab', 'type' => 'tabbed', 'title' => '', 'tabs' => array( array( 'title' => '待审核', 'fields' => array( array( 'type' =>'content', 'content' => '
            友链名称 友链网址 友链图标 友链简介 联系邮箱 状态 操作
            ', ), ), ), array( 'title' => '已通过', 'fields' => array( array( 'type' =>'content', 'content' => '
            友链名称 友链网址 友链图标 友链简介 联系邮箱 状态 操作
            ', ), ), ), array( 'title' => '已驳回', 'fields' => array( array( 'type' =>'content', 'content' => '
            友链名称 友链网址 友链图标 友链简介 联系邮箱 状态 操作
            ', ), ), ), array( 'title' => '查询', 'fields' => array( array( 'type' =>'content', 'content' => '
            友链名称 友链网址 友链图标 友链简介 联系邮箱 状态 操作
            ', ), ), ), array( 'title' => '自动检查', 'fields' => array( array( 'type' => 'heading', 'content' => '自动检查设置', ), array( 'type' => 'subheading', 'content' => '自动检查仅检查友链放置页面网址项不为空的友链,该项为空的友链默认不检查。
            重建计划任务表
            ', ), array( 'id' => 'checkFailedAction', 'type' => 'switcher', 'title' => '已通过的友链若自动检查失败是否移动至已驳回', 'default' => true, ), array( 'id' => 'checkFailedActionText', 'type' => 'text', 'title' => '驳回理由', 'after' => '请填入驳回理由,若为空则默认理由为:友链检查未通过自动移动至失效友链列表', 'dependency' => array( 'checkFailedAction', '==', 'true' ), ), array( 'id' => 'checkSuccessAction', 'type' => 'switcher', 'title' => '已驳回的友链若自动检查通过是否移动至已通过', 'default' => true, ), array( 'type' => 'heading', 'content' => '自动检查结果', ), array( 'type' =>'content', 'content' => '

            自动检查依赖crontab计划任务
            请在您的服务器上运行计划任务

            检查需要耗费服务器资源,且可能因为友链的数量增多而影响检查的速度,建议执行时间为每天一次即可。
            需注意:无法自动检查如Vue、React等需浏览器配合加载的站点,这些站点可能需要手动进行检查


            添加计划任务以宝塔面板为例:在宝塔-计划任务中添加类型为Shell脚本的计划任务,脚本内容将以下命令复制粘贴进去,然后根据实际设置执行周期即可(添加完毕后建议先执行一次任务)



            '.$lastestCron_Time.'
            上一次共检查了 '.$lastestCron_Total.' 条符合条件的友链,从已通过列表移入已驳回列表共 '.$lastestCron_Failed.' 条,从已驳回列表移入已通过列表共 '.$lastestCron_Success.'
            ', ), ), ), ), ), ) ) ); $lazy_styles = array( 'none'=>'不显示','1'=>'#1','2'=>'#2','3'=>'#3','4'=>'#4','5'=>'#5','6'=>'#6','7'=>'#7','8'=>'#8','9'=>'#9','10'=>'#10','11'=>'#11','12'=>'#12' ); CSF::createSection( $prefix, array( 'title' => '加载设置', 'icon' => 'fas fa-spinner', 'fields' => array( array( 'id' => 'Pjax', 'type' => 'switcher', 'title' => 'Pjax', 'subtitle' => '若选择开启,则将同步启用Pjax加载效果', 'default' => false, ), array( 'id' => 'CustomizationFooterJsPjaxCode', 'type' => 'code_editor', 'title' => '自定义Pjax回调代码', 'after' => '谨慎填写,仅需填写代码即可!需注意JS语法,若语法错误可能会造成前台报错甚至组件动作失效!', 'dependency' => array( 'Pjax', '==', 'true' ), ), array( 'id' => 'Lazyload', 'type' => 'switcher', 'title' => '图片懒加载', 'subtitle' => '开启后站点前台全局图片将以懒加载的形式展现,可设置选择懒加载过程中显示的加载图标[设置的加载图标仅作用于文章页面,其他页面的懒加载形式以渐进式效果展现]', 'default' => false, ), array( 'id' => 'Lazyload_style', 'type' => 'select', 'title' => '选择图片加载效果', 'after' => '图片加载效果指的是图片在加载时展现出来的动效,可以戳这里进行预览所有效果。', 'options' => $lazy_styles, 'default' => 'none', 'dependency' => array( 'Lazyload', '==', '1' ), ), array( 'id' => 'Compress', 'type' => 'switcher', 'title' => 'HTML压缩', 'subtitle' => '开启后同步开启最大限度的GZIP压缩,能够加快网站访问', 'default' => false, ), array( 'id' => 'Lightbox', 'type' => 'switcher', 'title' => '图片灯箱', 'subtitle' => '使用图片灯箱效果听说有BUFF加成~', 'default' => false, ), array( 'id' => 'CommentTyping', 'type' => 'switcher', 'title' => '打字效果', 'subtitle' => '开启后在前台评论区打字就会出现小球浮现效果', 'default' => false, ), ) ) ); $mail_html = ''; $mail_api = Common::url('/action/' . BsCore_Plugin::$action, Options::alloc()->index).'?do=testMail'; $mail_html .= '邮件发送测试 '; CSF::createSection( $prefix, array( 'title' => '行为验证', 'icon' => 'fas fa-shield-alt', 'fields' => array( array( 'id' => 'VerifyChoose', 'type' => 'select', 'title' => '选择行为验证方式', 'after' => 'Cloudflare Turnstile在国内可能会频繁出现验证失败的问题,谨慎选择!
            Geetest验证使用的是Geetest 行为验第四代
            若选择关闭,则评论等关键区域将仅保留最基础的Token验证', 'options' => array('1' => '开启普通算数加法验证', '11' => '开启普通算数减法验证', '2' => '开启Vaptcha验证','2-1' => '开启顶象验证','2-2' => '开启Cloudflare Turnstile验证','2-3' => '开启极验Geetest验证', '22' => '开启拼图滑块验证', '22-2' => '开启自定义问答验证','3' => '关闭行为验证'), 'default' => '1', ), array( 'id' => 'VerifyQuestion', 'type' => 'group', 'title' => '验证问答', 'after' => '开启验证问答后请务必设定一个或一个以上的问题。', 'dependency' => array( 'VerifyChoose', '==', '22-2' ), 'fields' => array( array( 'id' => 'VerifyQuestion_key', 'type' => 'text', 'title' => '验证问题', 'after'=>'请输入问题,问题字数不要太多,言简意赅即可' ), array( 'id' => 'VerifyQuestion_answer', 'type' => 'text', 'title' => '验证问题答案', 'after'=>'请输入该问题的答案' ), array( 'id' => 'VerifyQuestion_showtip', 'type' => 'switcher', 'title' => '是否启用答案提示', 'subtitle' => '开启后前台验证问答下方不显示验证问题答案,仅显示验证问题的提示', 'default' => false, ), array( 'id' => 'VerifyQuestion_showtiptext', 'type' => 'text', 'title' => '验证问题提示', 'after'=>'请输入该问题的答案提示', 'dependency' => array( 'VerifyQuestion_showtip', '==', 'true' ), ), ), ), array( 'id' => 'Verify22_Buttontext', 'type' => 'text', 'title' => '拼图滑块验证按钮文字', 'after' => '请输入拼图滑块验证按钮文字,如人机验证', 'default' => '人机验证', 'dependency' => array( 'VerifyChoose', '==', '22' ), ), array( 'id' => 'Verify22_Paneltitle', 'type' => 'text', 'title' => '拼图滑块验证面板标题', 'after' => '请输入拼图滑块验证面板标题,如人机验证', 'default' => '人机验证', 'dependency' => array( 'VerifyChoose', '==', '22' ), ), array( 'id' => 'Verify22_Paneldec', 'type' => 'text', 'title' => '拼图滑块验证面板操作提示文字', 'after' => '请输入拼图滑块验证面板操作提示文字,如滑动滑块,使图片显示角度为正', 'default' => '使图片显示角度为正', 'dependency' => array( 'VerifyChoose', '==', '22' ), ), array( 'id' => 'Verify22_Panelimg', 'type' => 'textarea', 'title' => '拼图滑块验证使用的图片', 'after' => '请输入拼图滑块验证使用的图片直链,使用英文逗号分隔,如xxx.jpg,abc.png', 'default' => '/usr/themes/bearsimple/assets/verify/BearCaptcha/Captcha/img/t1.png,/usr/themes/bearsimple/assets/verify/BearCaptcha/Captcha/img/t2.png,/usr/themes/bearsimple/assets/verify/BearCaptcha/Captcha/img/t3.png', 'dependency' => array( 'VerifyChoose', '==', '22' ), ), //Vaptcha array( 'id' => 'vid', 'type' => 'text', 'title' => 'VID', 'after' => '验证单元vid', 'dependency' => array( 'VerifyChoose', '==', '2' ), ), array( 'id' => 'vkey', 'type' => 'text', 'title' => 'VKEY', 'after' => '验证单元key', 'dependency' => array( 'VerifyChoose', '==', '2' ), ), array( 'id' => 'backendVerify_Vaptcha', 'type' => 'switcher', 'title' => '是否启用服务端二次验证', 'after' => '

            若启用则在评论者完成验证并提交评论后,系统自动将验证成功的Token与Vaptcha进行服务端二次验证,进一步加强安全性,但因为网络因素影响,可能会导致评论提交等待时间增加。', 'default' => false, 'dependency' => array( 'VerifyChoose', '==', '2' ), ), //顶象 array( 'id' => 'dx_domain', 'type' => 'text', 'title' => '顶象API域名', 'after' => '在顶象后台->应用管理页面顶部,apiServer即API域名。', 'dependency' => array( 'VerifyChoose', '==', '2-1' ), ), array( 'id' => 'dx_appId', 'type' => 'text', 'title' => '顶象appId', 'after' => '在顶象后台->应用管理页面可看到接入应用的appId', 'dependency' => array( 'VerifyChoose', '==', '2-1' ), ), array( 'id' => 'dx_appSecret', 'type' => 'text', 'title' => '顶象appSecret', 'after' => '在顶象后台->应用管理页面可看到接入应用的appSecret', 'dependency' => array( 'VerifyChoose', '==', '2-1' ), ), array( 'id' => 'backendVerify_Dingxiang', 'type' => 'switcher', 'title' => '是否启用服务端二次验证', 'after' => '

            若启用则在评论者完成验证并提交评论后,系统自动将验证成功的Token与顶象进行服务端二次验证,进一步加强安全性,但因为网络因素影响,可能会导致评论提交等待时间增加。', 'default' => false, 'dependency' => array( 'VerifyChoose', '==', '2-1' ), ), //Turnstile array( 'id' => 'turnstile_key', 'type' => 'text', 'title' => 'Turnstile siteKey', 'after' => '请先注册Cloudflare以获取Cloudflare Turnstile siteKey', 'dependency' => array( 'VerifyChoose', '==', '2-2' ), ), array( 'id' => 'turnstile_secretkey', 'type' => 'text', 'title' => 'Turnstile secretKey', 'after' => '请先注册Cloudflare以获取Cloudflare Turnstile secretKey', 'dependency' => array( 'VerifyChoose', '==', '2-2' ), ), array( 'id' => 'turnstile_theme', 'type' => 'select', 'title' => 'Turnstile主题', 'after' => '设置Turnstile主题,默认为浅色', 'options' => array('light' => '浅色', 'dark' => '深色', 'auto' => '自动'), 'default' => 'light', 'dependency' => array( 'VerifyChoose', '==', '2-2' ), ), array( 'id' => 'turnstile_style', 'type' => 'select', 'title' => 'Turnstile布局样式', 'after' => '设置Turnstile布局样式,默认为常规型', 'options' => array('normal' => '常规型', 'compact' => '紧凑型'), 'default' => 'normal', 'dependency' => array( 'VerifyChoose', '==', '2-2' ), ), array( 'id' => 'backendVerify_Turnstile', 'type' => 'switcher', 'title' => '是否启用服务端二次验证', 'after' => '

            若启用则在评论者完成验证并提交评论后,系统自动将验证成功的Token与Turnstile进行服务端二次验证,进一步加强安全性,但因为网络因素影响,可能会导致评论提交等待时间增加。', 'default' => false, 'dependency' => array( 'VerifyChoose', '==', '2-2' ), ), //Geetest array( 'id' => 'geeid', 'type' => 'text', 'title' => 'Geetest验证ID', 'after' => 'Geetest验证ID', 'dependency' => array( 'VerifyChoose', '==', '2-3' ), ), array( 'id' => 'geekey', 'type' => 'text', 'title' => 'Geetest验证KEY', 'after' => 'Geetest验证KEY', 'dependency' => array( 'VerifyChoose', '==', '2-3' ), ), array( 'id' => 'backendVerify_Geetest', 'type' => 'switcher', 'title' => '是否启用服务端二次验证', 'after' => '

            若启用则在评论者完成验证并提交评论后,系统自动将验证成功的Token与Geetest进行服务端二次验证,进一步加强安全性,但因为网络因素影响,可能会导致评论提交等待时间增加。', 'default' => false, 'dependency' => array( 'VerifyChoose', '==', '2-3' ), ), /** array( 'id' => 'geestyle', 'type' => 'radio', 'title' => 'Geetest验证方案', 'inline' => true, 'after' => '设置Geetest验证方案,默认为滑动验证', 'options' => array('1' => '滑动验证', '2' => '多次验证', '3' => '一键通过验证', '4' => '九宫格验证', '5' => '五子棋验证', '6' => '消消乐验证', '7' => '文字点选验证', '8' => '图标验证'), 'default' => '1', 'dependency' => array( 'VerifyChoose', '==', '2-3' ), ), */ ) ) ); CSF::createSection( $prefix, array( 'title' => '存储设置', 'icon' => 'fas fa-database', 'fields' => array( array( 'id' => 'bucket_choose', 'type' => 'select', 'title' => '文件存储方式', 'after' => '选择您所上传文件的存储方式,默认为本地存储', 'options' => array('1' => '本地存储', '2' => '腾讯云COS', '3' => '阿里云OSS', '4' => '七牛云Kodo', '5' => '又拍云USS', '6' => '百度云BOS', '7' => '华为云OBS', '8' => 'LskyPro'), 'default' => '1', ), //LskyPro array( 'type' => 'submessage', 'style' => 'warning', 'content' => '该存储方式仅作用于图片类型(支持gif,jpg,jpeg,png,tiff,bmp,ico,psd,webp),其他类型会自动变成本地上传!!
            仅在 LskyPro v2.1 开源版本中测试通过,其他版本需自行测试', 'dependency' => array( 'bucket_choose', '==', '8' ) ), array( 'id' => 'lskypro_api', 'type' => 'text', 'title' => 'LskyPro Api地址', 'after' => '必填* 只需填写域名且包含 http(s)://,无需 / 结尾,如https://xxx.com
            Token需填写此项并保存后才可获取!', 'dependency' => array( 'bucket_choose', '==', '8' ), ), array( 'id' => 'lskypro_token', 'type' => 'text', 'title' => 'LskyPro Token', 'after' => '必填* 因v2.1版本无法直接获取到Token,可
            点击此处获取Token
            ', 'dependency' => array( 'bucket_choose', '==', '8' ), ), array( 'id' => 'lskypro_id', 'type' => 'text', 'title' => 'LskyPro 储存策略ID', 'after' => '非必填* 若本项为空则为默认策略', 'dependency' => array( 'bucket_choose', '==', '8' ), ), //腾讯云 array( 'id' => 'bucket_secret_id', 'type' => 'text', 'title' => '腾讯云SecretId', 'after' => '必填* 请前往腾讯云控制台-个人API密钥 获取您的SecretId', 'dependency' => array( 'bucket_choose', '==', '2' ), ), array( 'id' => 'bucket_secret_key', 'type' => 'text', 'title' => '腾讯云SecretKey', 'after' => '必填* 请前往腾讯云控制台-个人API密钥 获取您的SecretKey', 'dependency' => array( 'bucket_choose', '==', '2' ), ), array( 'id' => 'bucket_region', 'type' => 'select', 'title' => 'COS所属地域', 'after' => '必选* 选择您的腾讯云COS所属地域,请务必选择正确', 'options' => array( 'ap-beijing' => _t('北京'), 'ap-beijing-1' => _t('北京一区'), 'ap-guangzhou' => _t('广州'), 'ap-nanjing' => _t('南京'), 'ap-shanghai' => _t('上海'), 'ap-chengdu' => _t('成都'), 'ap-chongqing' => _t('重庆'), 'ap-shenzhen-fsi' => _t('深圳金融'), 'ap-shanghai-fsi' => _t('上海金融'), 'ap-beijing-fsi' => _t('北京金融'), 'ap-hongkong' => _t('香港'), 'ap-singapore' => _t('新加坡'), 'ap-mumbai' => _t('孟买'), 'ap-jakarta' => _t('雅加达'), 'ap-seoul' => _t('首尔'), 'ap-bangkok' => _t('曼谷'), 'ap-tokyo' => _t('东京'), 'na-toronto' => _t('多伦多'), 'na-siliconvalley' => _t('硅谷'), 'na-ashburn' => _t('弗吉尼亚'), 'na-toronto' => _t('多伦多'), 'sa-saopaulo' => _t('圣保罗'), 'eu-frankfurt' => _t('法兰克福'), 'eu-moscow' => _t('莫斯科'), ), 'dependency' => array( 'bucket_choose', '==', '2' ), ), array( 'id' => 'bucket_name', 'type' => 'text', 'title' => '腾讯云COS存储桶名称', 'after' => '必填* 格式为 xxxxx-xxxxxx 请前往腾讯云COS页面 获取,请务必设置为公有读私有写!', 'dependency' => array( 'bucket_choose', '==', '2' ), ), array( 'id' => 'bucket_path', 'type' => 'text', 'title' => '腾讯云COS存储路径', 'after' => '必填* 默认为 uploads/,若非必要可不修改,路径最前面不加/', 'default' =>'uploads/', 'dependency' => array( 'bucket_choose', '==', '2' ), ), array( 'id' => 'bucket_domain', 'type' => 'text', 'title' => '腾讯云COS访问域名', 'after' => '留空则为腾讯云默认域名,如:https://xxxxx.cos.ap-beijing.myqcloud.com
            若填写的为自定义CDN域名,请参考文档
            若填写的为自定义源站域名,请参考文档
            要注意的一点是若填写的为自定义CDN域名或自定义源站域名,域名需以 https:// 或 https:// 开头', 'dependency' => array( 'bucket_choose', '==', '2' ), ), array( 'id' => 'bucket_sync', 'type' => 'switcher', 'title' => '本地云端同步删除', 'subtitle' => '在文件管理删除文件时,是否同步删除COS上的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '2' ), ), array( 'id' => 'bucket_localsave', 'type' => 'switcher', 'title' => '双重储存', 'subtitle' => '在本地保存一份文件副本,这样的话会占用本地存储空间', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '2' ), ), array( 'id' => 'bucket_localdelete', 'type' => 'switcher', 'title' => '删除时同步删除本地备份', 'subtitle' => '在文件管理删除文件时,是否同步删除本地备份的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose|bucket_localsave', '==|==', '2|true' ), ), array( 'id' => 'bucket_other', 'type' => 'text', 'title' => '对象链接附带后缀', 'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户,若不需要请留空
            填写示例: ?v=1&type=webp', 'dependency' => array( 'bucket_choose', '==', '2' ), ), //阿里云 array( 'id' => 'ali_bucket_accesskey_id', 'type' => 'text', 'title' => '阿里云ACCESSKEY ID', 'after' => '必填* 请前往阿里云控制台-RAM访问控制 获取您的ACCESSKEY ID', 'dependency' => array( 'bucket_choose', '==', '3' ), ), array( 'id' => 'ali_bucket_accesskey_secret', 'type' => 'text', 'title' => '阿里云ACCESSKEY SECRET', 'after' => '必填* 请前往阿里云控制台-RAM访问控制 获取您的ACCESSKEY SECRET', 'dependency' => array( 'bucket_choose', '==', '3' ), ), array( 'id' => 'ali_bucket_region', 'type' => 'select', 'title' => 'OSS所属地域', 'after' => '必选* 选择您的阿里云OSS所属地域,请务必选择正确', 'options' => array( "oss-cn-hangzhou" => "华东1-杭州", "oss-cn-shanghai" => "华东2-上海", "oss-cn-nanjing" => "华东5-南京(本地地域)", "oss-cn-fuzhou" => "华东6-福州(本地地域)", "oss-cn-qingdao" => "华北1-青岛", "oss-cn-beijing" => "华北2-北京", "oss-cn-zhangjiakou" => "华北3-张家口", "oss-cn-huhehaote" => "华北5-呼和浩特", "oss-cn-wulanchabu" => "华北6-乌兰察布", "oss-cn-shenzhen" => "华南1-深圳", "oss-cn-heyuan" => "华南2-河源", "oss-cn-chengdu" => "西南1-成都", "oss-cn-hongkong" => "中国-香港", "oss-us-west-1" => "美国-硅谷", "oss-us-east-1" => "美国-弗吉尼亚", "oss-ap-southeast-1" =>"新加坡", "oss-ap-southeast-2" =>"澳大利亚-悉尼", "oss-ap-southeast-3" =>"马来西亚-吉隆坡", "oss-ap-southeast-5" =>"印度尼西亚-雅加达", "oss-ap-northeast-1" =>"日本-东京", "oss-ap-south-1" => "印度-孟买", "oss-eu-central-1" => "德国-法兰克福", "oss-eu-west-1" => "英国-伦敦", "oss-me-east-1" => "阿联酋-迪拜", "oss-ap-southeast-7" => "泰国-曼谷", "oss-ap-northeast-2" => "韩国-首尔", "oss-ap-southeast-6" => "菲律宾-马尼拉", "other" => '无地域属性' ), 'dependency' => array( 'bucket_choose', '==', '3' ), ), array( 'id' => 'ali_bucket_other_region', 'type' => 'text', 'title' => 'Endpoint地址', 'after' => '当非上述所可选地域时此项必填,填写完整的Endpoint地址,如oss-xx-china-xx.aliyuncs.com', 'dependency' => array( 'bucket_choose|ali_bucket_region', '==|==', '3|other' ), ), array( 'id' => 'ali_bucket_name', 'type' => 'text', 'title' => '阿里云OSS存储桶名称', 'after' => '必填* 请填写阿里云OSS存储桶名称,即Bucket名称,请务必设置为公有读私有写!', 'dependency' => array( 'bucket_choose', '==', '3' ), ), array( 'id' => 'ali_bucket_connect_type', 'type' => 'radio', 'title' => '阿里云OSS存储桶连接方式', 'after' => '选择阿里云OSS存储桶连接方式', 'options' => array('.aliyuncs.com' => '外网','-internal.aliyuncs.com' => '内网'), 'default' => '.aliyuncs.com', 'dependency' => array( 'bucket_choose', '==', '3' ), ), array( 'id' => 'ali_bucket_path', 'type' => 'text', 'title' => '阿里云OSS存储路径', 'after' => '必填* 默认为 uploads/,若非必要可不修改,路径最前面不加/', 'default' => 'uploads/', 'dependency' => array( 'bucket_choose', '==', '3' ), ), array( 'id' => 'ali_bucket_domain', 'type' => 'text', 'title' => '阿里云OSS访问域名', 'after' => '留空则为阿里云默认域名,如:https://xxxxx.oss-cn-beijing.aliyuncs.com
            若填写的为自定义CDN域名,请参考文档
            若填写的为自定义源站域名,请参考文档
            要注意的一点是若填写的为自定义CDN域名或自定义源站域名,域名需以 http:// 或 https:// 开头', 'dependency' => array( 'bucket_choose', '==', '3' ), ), array( 'id' => 'ali_bucket_sync', 'type' => 'switcher', 'title' => '本地云端同步删除', 'subtitle' => '在文件管理删除文件时,是否同步删除OSS上的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '3' ), ), array( 'id' => 'ali_bucket_localsave', 'type' => 'switcher', 'title' => '双重储存', 'subtitle' => '在本地保存一份文件副本,这样的话会占用本地存储空间', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '3' ), ), array( 'id' => 'ali_bucket_localdelete', 'type' => 'switcher', 'title' => '删除时同步删除本地备份', 'subtitle' => '在文件管理删除文件时,是否同步删除本地备份的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose|ali_bucket_localsave', '==|==', '3|true' ), ), array( 'id' => 'ali_bucket_other', 'type' => 'text', 'title' => '对象链接附带后缀', 'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户,若不需要请留空
            填写示例: ?v=1&type=webp', 'dependency' => array( 'bucket_choose', '==', '3' ), ), //七牛云 array( 'id' => 'qiniu_bucket_accesskey', 'type' => 'text', 'title' => '七牛云AccessKey', 'after' => '必填* 请前往七牛云个人中心-密钥管理 获取您的AccessKey', 'dependency' => array( 'bucket_choose', '==', '4' ), ), array( 'id' => 'qiniu_bucket_secretKey', 'type' => 'text', 'title' => '七牛云SecretKey', 'after' => '必填* 请前往七牛云个人中心-密钥管理 获取您的SecretKey', 'dependency' => array( 'bucket_choose', '==', '4' ), ), array( 'id' => 'qiniu_bucket_name', 'type' => 'text', 'title' => '七牛云Kodo空间名称', 'after' => '必填* 请填写七牛云Kodo空间名称,空间应设置为公开', 'dependency' => array( 'bucket_choose', '==', '4' ), ), array( 'id' => 'qiniu_bucket_path', 'type' => 'text', 'title' => '七牛云Kodo存储路径', 'after' => '必填* 默认为 uploads/,若非必要可不修改,路径最前面不加/', 'default' => 'uploads/', 'dependency' => array( 'bucket_choose', '==', '4' ), ), array( 'id' => 'qiniu_bucket_domain', 'type' => 'text', 'title' => '七牛云Kodo访问域名', 'after' => '切勿留空!可填写七牛测试域名/自定义CDN域名/自定义源站域名
            若填写的为自定义CDN域名、自定义源站域名,请参考文档
            要注意的一点是若填写的是自定义CDN域名或自定义源站域名,域名需以 http:// 或 https:// 开头,而测试域名则必须为http://开头(七牛的测试域名不允许https访问)', 'dependency' => array( 'bucket_choose', '==', '4' ), ), array( 'id' => 'qiniu_bucket_sync', 'type' => 'switcher', 'title' => '本地云端同步删除', 'subtitle' => '在文件管理删除文件时,是否同步删除Kodo上的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '4' ), ), array( 'id' => 'qiniu_bucket_localsave', 'type' => 'switcher', 'title' => '双重储存', 'subtitle' => '在本地保存一份文件副本,这样的话会占用本地存储空间', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '4' ), ), array( 'id' => 'qiniu_bucket_localdelete', 'type' => 'switcher', 'title' => '删除时同步删除本地备份', 'subtitle' => '在文件管理删除文件时,是否同步删除本地备份的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose|qiniu_bucket_localsave', '==|==', '4|true' ), ), array( 'id' => 'qiniu_bucket_other', 'type' => 'text', 'title' => '对象链接附带后缀', 'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户,若不需要请留空
            填写示例: ?v=1&type=webp', 'dependency' => array( 'bucket_choose', '==', '4' ), ), //又拍云 array( 'id' => 'upyun_bucket_actionUser', 'type' => 'text', 'title' => '又拍云操作员账号', 'after' => '必填* 请前往又拍云存储控制台,在云存储-进入相对应的云存储配置页面-存储管理-操作员授权中获取或新建操作员,权限为可读取、可写入、可删除', 'dependency' => array( 'bucket_choose', '==', '5' ), ), array( 'id' => 'upyun_bucket_actionKey', 'type' => 'text', 'title' => '又拍云操作员密码', 'after' => '必填* 请前往又拍云存储控制台,在云存储-进入相对应的云存储配置页面-存储管理-操作员授权中获取或新建操作员,权限为可读取、可写入、可删除', 'dependency' => array( 'bucket_choose', '==', '5' ), ), array( 'id' => 'upyun_bucket_name', 'type' => 'text', 'title' => '又拍云存储服务名称', 'after' => '必填* 请填写又拍云存储服务名称', 'dependency' => array( 'bucket_choose', '==', '5' ), ), array( 'id' => 'upyun_bucket_path', 'type' => 'text', 'title' => '又拍云存储路径', 'after' => '必填* 默认为 uploads/,若非必要可不修改,路径最前面不加/', 'default' => 'uploads/', 'dependency' => array( 'bucket_choose', '==', '5' ), ), array( 'id' => 'upyun_bucket_domain', 'type' => 'text', 'title' => '又拍云存储访问域名', 'after' => '切勿留空!可填写又拍云测试域名/加速域名
            ,域名需以 http:// 或 https:// 开头,而测试域名则必须为http://开头(又拍云的测试域名不允许https访问)', 'dependency' => array( 'bucket_choose', '==', '5' ), ), array( 'id' => 'upyun_bucket_sync', 'type' => 'switcher', 'title' => '本地云端同步删除', 'subtitle' => '在文件管理删除文件时,是否同步删除云存储上的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '5' ), ), array( 'id' => 'upyun_bucket_localsave', 'type' => 'switcher', 'title' => '双重储存', 'subtitle' => '在本地保存一份文件副本,这样的话会占用本地存储空间', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '5' ), ), array( 'id' => 'upyun_bucket_localdelete', 'type' => 'switcher', 'title' => '删除时同步删除本地备份', 'subtitle' => '在文件管理删除文件时,是否同步删除本地备份的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose|upyun_bucket_localsave', '==|==', '5|true' ), ), array( 'id' => 'upyun_bucket_other', 'type' => 'text', 'title' => '对象链接附带后缀', 'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户,若不需要请留空
            填写示例: ?v=1&type=webp', 'dependency' => array( 'bucket_choose', '==', '5' ), ), //华为云 array( 'id' => 'hw_bucket_accesskey_id', 'type' => 'text', 'title' => '华为云ACCESSKEY ID', 'after' => '必填* 请前往华为云控制台-我的凭证 获取您的ACCESSKEY ID', 'dependency' => array( 'bucket_choose', '==', '7' ), ), array( 'id' => 'hw_bucket_accesskey_secret', 'type' => 'text', 'title' => '华为云Secret AccessKey', 'after' => '必填* 请前往华为云控制台-我的凭证 获取您的SECRET ACCESS KEY', 'dependency' => array( 'bucket_choose', '==', '7' ), ), array( 'id' => 'hw_bucket_region', 'type' => 'select', 'title' => 'OBS所属地域', 'after' => '必选* 选择您的华为云OBS所属地域,请务必选择正确', 'options' => array( "obs.cn-north-4" => "华北-北京四", "obs.cn-north-1" => "华北-北京一", "obs.cn-north-9" => "华北-乌兰察布一", "obs.cn-east-2" => "华东-上海二", "obs.cn-east-3" => "华东-上海一", "obs.cn-south-1" => "华南-广州", "obs.cn-south-4" => "华南-广州-友好用户环境", "obs.cn-southwest-2" => "西南-贵阳一", "obs.ap-southeast-1" => "中国-香港", "obs.la-north-2" => "拉美-墨西哥城二", "obs.na-mexico-1" => "拉美-墨西哥城一", "obs.sa-brazil-1" => "拉美-圣保罗一", "obs.la-south-2" => "拉美-圣地亚哥", "obs.tr-west-1" => "土耳其-伊斯坦布尔", "obs.ap-southeast-2" => "亚太-曼谷", "obs.ap-southeast-3" => "亚太-新加坡", "obs.af-south-1" => "非洲-约翰内斯堡" ), 'dependency' => array( 'bucket_choose', '==', '7' ), ), array( 'id' => 'hw_bucket_name', 'type' => 'text', 'title' => '华为云OBS存储桶名称', 'after' => '必填* 请填写华为云OBS存储桶名称,即Bucket名称,请务必设置为公有读私有写!', 'dependency' => array( 'bucket_choose', '==', '7' ), ), array( 'id' => 'hw_bucket_path', 'type' => 'text', 'title' => '华为云OBS存储路径', 'after' => '必填* 默认为 uploads/,若非必要可不修改,路径最前面不加/', 'default' => 'uploads/', 'dependency' => array( 'bucket_choose', '==', '7' ), ), array( 'id' => 'hw_bucket_domain', 'type' => 'text', 'title' => '华为云OBS访问域名', 'after' => '留空则为华为云默认域名,如:https://xxxxxx.obs.cn-north-4.myhuaweicloud.com
            若填写的为自定义CDN域名,请参考文档
            若填写的为自定义源站域名,请参考文档
            要注意的一点是若填写的为自定义CDN域名或自定义源站域名,域名需以 http:// 或 https:// 开头', 'dependency' => array( 'bucket_choose', '==', '7' ), ), array( 'id' => 'hw_bucket_sync', 'type' => 'switcher', 'title' => '本地云端同步删除', 'subtitle' => '在文件管理删除文件时,是否同步删除OSS上的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '7' ), ), array( 'id' => 'hw_bucket_localsave', 'type' => 'switcher', 'title' => '双重储存', 'subtitle' => '在本地保存一份文件副本,这样的话会占用本地存储空间', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '7' ), ), array( 'id' => 'hw_bucket_localdelete', 'type' => 'switcher', 'title' => '删除时同步删除本地备份', 'subtitle' => '在文件管理删除文件时,是否同步删除本地备份的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose|hw_bucket_localsave', '==|==', '7|true' ), ), array( 'id' => 'hw_bucket_other', 'type' => 'text', 'title' => '对象链接附带后缀', 'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户,若不需要请留空
            填写示例: ?v=1&type=webp', 'dependency' => array( 'bucket_choose', '==', '7' ), ), //百度云 array( 'id' => 'bd_bucket_accesskey', 'type' => 'text', 'title' => '百度云Access Key', 'after' => '必填* 请前往百度云控制台-安全认证/ Access Key 获取您的ACCESSKEY', 'dependency' => array( 'bucket_choose', '==', '6' ), ), array( 'id' => 'bd_bucket_secretkey', 'type' => 'text', 'title' => '百度云Secret Key', 'after' => '必填* 请前往百度云控制台-安全认证/ Access Key 获取您的SECRETKEY', 'dependency' => array( 'bucket_choose', '==', '6' ), ), array( 'id' => 'bd_bucket_region', 'type' => 'select', 'title' => 'BOS所属地域', 'after' => '必选* 选择您的百度云BOS所属地域,请务必选择正确', 'options' => array( "bj.bcebos.com" => "华北-北京", "bd.bcebos.com" => "华北-保定", "su.bcebos.com" => "华东-苏州", "gz.bcebos.com" => "华南-广州", "fwh.bcebos.com" => "华中金融-武汉", "fsh.bcebos.com" => "华东-上海", "hkg.bcebos.com" => "中国-香港", ), 'dependency' => array( 'bucket_choose', '==', '6' ), ), array( 'id' => 'bd_bucket_name', 'type' => 'text', 'title' => '百度云BOS存储桶名称', 'after' => '必填* 请填写百度云BOS存储桶名称,即Bucket名称,请务必设置为公共读', 'dependency' => array( 'bucket_choose', '==', '6' ), ), array( 'id' => 'bd_bucket_path', 'type' => 'text', 'title' => '百度云BOS存储路径', 'after' => '必填* 默认为 uploads/,若非必要可不修改,路径最前面不加/', 'default' => 'uploads/', 'dependency' => array( 'bucket_choose', '==', '6' ), ), array( 'id' => 'bd_bucket_domain', 'type' => 'text', 'title' => '百度云BOS访问域名', 'after' => '留空则为百度云默认域名,如:https://xxxxxx.bj.bcebos.com
            若填写的为自定义CDN域名,请参考文档
            若填写的为自定义源站域名,请参考文档
            要注意的一点是若填写的为自定义CDN域名或自定义源站域名,域名需以 http:// 或 https:// 开头', 'dependency' => array( 'bucket_choose', '==', '6' ), ), array( 'id' => 'bd_bucket_sync', 'type' => 'switcher', 'title' => '本地云端同步删除', 'subtitle' => '在文件管理删除文件时,是否同步删除OSS上的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '6' ), ), array( 'id' => 'bd_bucket_localsave', 'type' => 'switcher', 'title' => '双重储存', 'subtitle' => '在本地保存一份文件副本,这样的话会占用本地存储空间', 'default' => false, 'dependency' => array( 'bucket_choose', '==', '6' ), ), array( 'id' => 'bd_bucket_localdelete', 'type' => 'switcher', 'title' => '删除时同步删除本地备份', 'subtitle' => '在文件管理删除文件时,是否同步删除本地备份的对应文件', 'default' => false, 'dependency' => array( 'bucket_choose|bd_bucket_localsave', '==|==', '6|true' ), ), array( 'id' => 'bd_bucket_other', 'type' => 'text', 'title' => '对象链接附带后缀', 'after' => '[针对图片处理]该项针对有需要在对象链接后面添加一些参数的用户,若不需要请留空
            填写示例: ?v=1&type=webp', 'dependency' => array( 'bucket_choose', '==', '6' ), ), ), )); $cache_html = ''; $cache_api = Common::url('clean-cache', Options::alloc()->index); $cache_html .= '清空缓存

            需要注意:当选择的是Sqlite或Flysystem缓存时请在站点根目录创建caches目录,缓存文件会存储到该目录中~ '; $tip = ''; if (!class_exists('Memcached',false)) { $tip .= '
            Memcached:检测到当前Memcached PHP扩展未安装,若开启Memcached缓存,请先安装扩展,否则会出现报错问题!';}else{$tip .= '
            Memcached:检测到扩展已安装,可开启Memcached缓存:)';} if (!class_exists('Redis',false)) { $tip .= '
            Redis:检测到当前Redis PHP扩展未安装,若开启Redis缓存,请先安装扩展,否则会出现报错问题!';}else{$tip .= '
            Redis:检测到扩展已安装,可开启Redis缓存:)';} if (!extension_loaded('apcu')) { $tip .= '
            Apcu:检测到当前Apcu PHP扩展未安装,若开启Apcu缓存,请先安装扩展,否则会出现报错问题!';}else{$tip .= '
            Apcu:检测到扩展已安装,可开启Apcu缓存:)';} if (!\Typecho\Db\Adapter\Pdo\SQLite::isAvailable() && !\Typecho\Db\Adapter\SQLite::isAvailable()) { $tip .= '
            SQLite:检测到当前SQLite PHP扩展未安装,若开启SQLite缓存,请先安装扩展,否则会出现报错问题!';}else{$tip .= '
            SQLite:检测到扩展已安装,可开启SQLite缓存:)';} if (!extension_loaded('fileinfo')) { $tip .= '
            Flysystem:检测到当前fileinfo PHP扩展未安装,若开启Flysystem缓存,请先安装fileinfo 扩展,否则会出现报错问题!';}else{$tip .= '
            Flysystem:检测到扩展已安装,可开启Flysystem缓存:)';} $tip .= '
            Memory:当前可开启Memory缓存,但仍不建议配置低的机器使用该缓存方式'; CSF::createSection( $prefix, array( 'title' => '缓存设置', 'icon' => 'fas fa-sync-alt', 'fields' => array( array( 'id' => 'Cache', 'type' => 'switcher', 'title' => '缓存功能', 'after' => '

            开启缓存功能后您需要注意:
          11. 1、行为验证中的验证问答和加减法验证可能会失效,请选择其他验证
          12. 2、我们建议您的PHP版本应为8.0及以上,否则有可能会导致报错异常
          13. ', 'default' => false, ), array( 'id' => 'Cache_choose', 'type' => 'select', 'title' => '缓存方式', 'after' => '您可以自由选择需要的缓存方式
            缓存扩展自检:'.$tip, 'options' => array('memcached' => 'Memcached缓存', 'redis' => 'Redis缓存', 'apcu' => 'Apcu缓存', 'sqlite' => 'SQLite缓存', 'memory' => 'Memory缓存','flysystem' => 'Flysystem缓存'), 'default' => '1', 'dependency' => array( 'Cache', '==', 'true' ), ), array( 'type' => 'heading', 'content' => '缓存操作', 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ), ), array( 'type' =>'content', 'content' => $cache_html, 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ), ), array( 'type' => 'heading', 'content' => 'Memcached缓存设置', 'dependency' => array( 'Cache|Cache_choose', '==|==', 'true|memcached' ), ), array( 'type' => 'heading', 'content' => 'Redis缓存设置', 'dependency' => array( 'Cache|Cache_choose', '==|==', 'true|redis' ), ), array( 'id' => 'login', 'type' => 'radio', 'title' => '是否对已登录用户失效', 'subtitle'=>'已经登录用户不会触发缓存策略', 'inline' => true, 'options' => array('关闭', '开启'), 'default' => 1, 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ), ), array( 'id' => 'expire', 'type' => 'text', 'title' => '缓存过期时间', 'after' => '86400 = 60s * 60m *24h,即一天的秒', 'default' => '86400', 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ), ), array( 'id' => 'host', 'type' => 'text', 'title' => '主机地址', 'after' => '主机地址,一般为127.0.0.1', 'default' => '127.0.0.1', 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis' ), ), array( 'id' => 'port', 'type' => 'text', 'title' => '端口号', 'after' => 'memcached默认为11211,redis默认为6379', 'default' => '11211', 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis' ), ), array( 'id' => 'rpassword', 'type' => 'text', 'title' => '密码', 'after' => 'redis密码,留空代表没有设置密码', 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|redis' ), ), //----------> array( 'type' => 'heading', 'content' => '全局缓存', 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ), ), array( 'id' => 'enable_gcache', 'type' => 'radio', 'title' => '是否开启全局缓存', 'subtitle'=>'在开启全局缓存的情况下,该页面缓存选项有效', 'inline' => true, 'options' => array('关闭', '开启'), 'default' => '1', 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ), ), array( 'id' => 'cache_page', 'type' => 'checkbox', 'title' => '需要缓存的页面', 'subtitle' => '选择需要缓存的页面', 'inline' => true, 'options' => array( 'index' => '首页', 'archive' => '归档', 'post' => '文章', 'attachment' => '附件', 'category' => '分类', 'tag' => '标签', 'author' => '作者', 'search' => '搜索', 'feed' => 'feed', 'page' => '页面' ), 'default' => array('index', 'post', 'search', 'page', 'author', 'tag'), 'dependency' => array( 'Cache|Cache_choose|enable_gcache', '==|any|==', 'true|memcached,redis,apcu,sqlite,flysystem,memory|1' ), ), array( 'type' => 'heading', 'content' => '部分缓存', 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ), ), array( 'id' => 'enable_markcache', 'type' => 'radio', 'title' => '是否开启markdown缓存', 'subtitle'=>'在全局缓存命中失效的时候是否开启 markdown 部分缓存, 选项关闭,则未命中均不缓存。选项开启后,在文章编辑界面通过 NOCACHE 标签来决定是否缓存当前文章,按钮已经集成了,插入标签就表示不缓存', 'inline' => true, 'options' => array('关闭', '开启'), 'default' => '0', 'dependency' => array( 'Cache|Cache_choose', '==|any', 'true|memcached,redis,apcu,sqlite,flysystem,memory' ), ), ) ) ); $generate_indexnow = '

            生成 IndexNow 密钥

            IndexNow 密钥

            重新生成密钥 下载密钥
            '; CSF::createSection( $prefix, array( 'title' => 'SEO管理', 'icon' => 'fas fa-search-plus', 'fields' => array( array( 'id' => 'SiteMap', 'type' => 'select', 'title' => 'Sitemap网站地图', 'after' => '开启后博客将生成sitemap
            开启了伪静态后是xxx.com/sitemap.xml
            没开启伪静态是xxx.com/index.php/sitemap.xml', 'options' => array( 'close' => '关闭', '100' => '显示最新 100 条链接', '200' => '显示最新 200 条链接', '300' => '显示最新 300 条链接', '400' => '显示最新 400 条链接', '500' => '显示最新 500 条链接', '600' => '显示最新 600 条链接', '700' => '显示最新 700 条链接', '800' => '显示最新 800 条链接', '900' => '显示最新 900 条链接', '1000' => '显示最新 1000 条链接', ), 'default' => 'close', ), array( 'id' => 'keywords_hide', 'type' => 'switcher', 'title' => '是否隐藏Meta Keywords', 'subtitle' => '当前搜索引擎已不再关注Meta Keywords标签,您可以通过本项对Meta Keywords进行隐藏/显示', 'default' => false, ), array( 'id' => 'seo_push', 'type' => 'switcher', 'title' => '收录推送', 'subtitle' => '开启后需配置推送信息
            推送动作触发:
            1、在发布文章后自动推送
            2、在访客访问文章时自动推送', 'default' => false, ), array( 'id' => 'seotabs', 'type' => 'tabbed', 'title' => '', 'dependency' => array( 'seo_push', '==', 'true' ), 'tabs' => array( array( 'title' => '百度站长推送', 'fields' => array( array( 'id' => 'baidu_token', 'type' => 'text', 'title' => '百度推送接口调用地址', 'after' => '位置:站长工具-普通收录-资源提交-API提交-接口调用地址
            填写格式:http://data.zz.baidu.com/urls?site=https://www.baidu.com&token=xxxxxxxxxxx', ), ), ), array( 'title' => '神马站长推送', 'fields' => array( array( 'id' => 'shenma_token', 'type' => 'text', 'title' => '神马推送接口调用地址', 'after' => '位置:站长平台-数据提交-MIP数据提交-接口调用地址
            填写格式:https://data.zhanzhang.sm.cn/push?site=www.xxxx.com&user_name=站长平台账号&resource_name=mip_add&token=xxxxxxxxxxx', ), ), ), array( 'title' => 'IndexNow推送', 'fields' => array( array( 'id' => 'indexnow_token', 'type' => 'text', 'title' => 'IndexNow密钥', 'after' => '因站点环境及权限等相对复杂的原因,不提供直接生成密钥到根目录,请按照以下提示进行操作:
            请将以下生成的密钥复制到本栏,并下载密钥上传到站点根目录,确保站点能够正常访问到密钥', ), array( 'type' =>'content', 'content' => $generate_indexnow, ), ), ), array( 'title' => 'Bing站长推送', 'fields' => array( array( 'id' => 'bing_token', 'type' => 'text', 'title' => 'API密钥', 'after' => '位置:站长平台-右上角齿轮-设置-API访问-API密钥,获取您的Bing ApiKey并填写到这里', ), ), ), array( 'title' => '头条站长推送', 'fields' => array( array( 'id' => 'toutiao_token', 'type' => 'text', 'title' => '头条接口Token', 'after' => '位置:站长平台-网站工具-自动收录-js提交框中的https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?xxxxxxxxxx
            填写格式:仅需填写push.js?后面那串字符串即可', ), ), ), ), ), ), )); $styles = array_map('basename', glob(dirname(__FILE__) . '/modules/codehightlight/static/styles/*.css')); $styles = array_combine($styles, $styles); $sync_html2 = ''; $sync_api2 = Common::url('syncData',Options::alloc()->index); $sync_html2 .= '
            一键同步朋友圈数据
            '; CSF::createSection( $prefix, array( 'title' => '模块管理', 'icon' => 'fas fa-cubes', 'fields' => array( array( 'type' => 'heading', 'content' => '文章优化模块', ), array( 'id' => 'Mermaid', 'type' => 'switcher', 'title' => 'Mermaid美人鱼', 'subtitle' => '开启后前台对流程图、思维导图等进行格式转换', 'default' => false, ), array( 'id' => 'MathJax', 'type' => 'switcher', 'title' => 'MathJax数学公式', 'subtitle' => '开启后前台对数学公式进行格式转换', 'default' => false, ), array( 'id' => 'Codehightlight', 'type' => 'select', 'title' => '代码高亮', 'after' => '开启后前台对代码显示高亮', 'options' => array('1' => '是', '2' => '否'), 'default' => '2', ), array( 'id' => 'code_style', 'type' => 'select', 'title' => '选择高亮主题风格', 'after' => '高亮主题风格文件在/usr/themes/bearsimple/modules/codehightlight/static/style中,您可以自行设计样式放入该目录,即可在本项选择', 'options' => $styles, 'default' => 'GrayMac.css', 'dependency' => array( 'Codehightlight', '==', '1' ), ), array( 'id' => 'showLineNumber', 'type' => 'select', 'title' => '显示行号', 'after' => '是否在代码左侧显示行号', 'options' => array('1' => '是', '2' => '否'), 'default' => '1', 'dependency' => array( 'Codehightlight', '==', '1' ), ), array( 'id' => 'Editors', 'type' => 'select', 'title' => '编辑器优化', 'after' => '若选择开启,则编辑文件、页面的时候将替换官方编辑器,更换为更加美观的编辑器。', 'options' => array('1' => '开启', '2' => '关闭'), 'default' => '2', ), array( 'id' => 'EditorsAutosave', 'type' => 'checkbox', 'title' => '编辑器自动保存方式选择', 'after' => '自动保存支持两种方式,两种方式可同时开启不受影响,全都不选代表不开启自动保存
            第一种即为浏览器保存,文章在还没点击提交的情况下均保存在浏览器中,点击其他文章,先前文章的内容仍会直接覆盖到当前文章。第二种是保存为草稿,编辑器在每隔十五秒会将文章保存为草稿。', 'inline' => true, 'options' => array( '1' => '浏览器自动保存', '11' => '自动保存为草稿', ), 'dependency' => array( 'Editors', '==', '1' ), ), array( 'type' => 'heading', 'content' => '我的追番模块', ), array( 'type' => 'subheading', 'content' => '追番模块支持Bilibili和Bangumi
            Bilibili:您需在下方填写您的Bilibili账户UID并且在空间设置中开启“公开我的追番”功能
            Bangumi:您需在下方填写您的Bangumi账户UID
            当然,您要想前台能看到的话必须新建一个独立页面,并将自定义模板选择我的追番', ), array( 'id' => 'bangumi_note', 'type' => 'text', 'title' => '追番温馨提示', 'after' => '填写追番温馨提示,将显示在追番上方', ), array( 'id' => 'acg_choose', 'type' => 'select', 'title' => '选择追番站点', 'after' => '请先选择追番站点,Bilibili或Bangumi', 'options' => array('1' => 'Bilibili', '2' => 'Bangumi'), 'default' => '2', ), array( 'id' => 'bilibili_accountid', 'type' => 'text', 'title' => 'Bilibili UID', 'after' => '填写Bilibili UID,并在空间设置中开启“公开我的追番”功能,系统将自动获取您所有的追番记录', 'dependency' => array( 'acg_choose', '==', '1' ) ), array( 'id' => 'bangumi_accountid', 'type' => 'text', 'title' => 'Bangumi UID', 'after' => '填写Bangumi UID,一般在个人中心昵称右边@xxxx,只要填写数字即可,若设置了用户名则直接填写用户名即可,系统将自动获取您所有的追番记录', 'dependency' => array( 'acg_choose', '==', '2' ) ), array( 'type' => 'heading', 'content' => '我的豆瓣模块', ), array( 'type' => 'subheading', 'content' => '您可以使用该模块来展示您在豆瓣的收藏
            当然,您要想前台能看到的话,请填写以下项,然后新建一个独立页面,并将自定义模板选择豆瓣
            豆瓣页面在第一次访问时因要生成缓存文件,所以加载会有些慢,请耐心等待,数据更新为30天一次!', ), array( 'id' => 'douban_note', 'type' => 'text', 'title' => '豆瓣温馨提示', 'after' => '填写豆瓣温馨提示,将显示在豆瓣列表上方', ), array( 'id' => 'douban_id', 'type' => 'text', 'title' => '豆瓣ID', 'after' => '请填写豆瓣ID,例如您在在豆瓣的个人首页网址是https://www.douban.com/people/123456/,那么123456就是您的豆瓣ID', ), array( 'id' => 'douban_show', 'type' => 'checkbox', 'title' => '豆瓣展示类别', 'inline' => true, 'options' => array('movie' => '豆瓣影视', 'book' => '豆瓣读书','music' => '豆瓣音乐'), 'after'=>'您可以根据您的实际情况选择所要展示的类别' ), array( 'type' => 'heading', 'content' => '我的Steam模块', ), array( 'type' => 'subheading', 'content' => '您可以使用该模块来展示您的Steam资料
            当然,您要想前台能看到的话,请填写以下项,然后新建一个独立页面,并将自定义模板选择Steam', ), array( 'id' => 'steamId', 'type' => 'text', 'title' => '您的SteamId', 'after' => '请填写您的SteamId,SteamId是一串您账户的特殊识别码,可在您的个人资料页面-SteamId中看到,SteamId那串数字复制粘贴到本项即可
            若您还是不知道SteamId在哪看,可在 https://www.steamidfinder.com 中搜索查找,steamID64 (Dec)即为您的SteamId', ), array( 'type' => 'heading', 'content' => 'Emaction表态动作模块', ), array( 'type' => 'subheading', 'content' => 'Emaction是一个仿Github表态动作的模块,访客通过点击相关Emoji表情来表示对该信息的态度,开启本模块后需要勾选开启的区域。', ), array( 'id' => 'emaction_Openplace', 'type' => 'checkbox', 'title' => 'Emaction表态动作应用范围', 'after' => '请勾选Emaction表态动作模块的应用范围,勾选后将在勾选的区域中开启。', 'inline' => true, 'options' => array( '1' => '评论[包含留言页面]', '2' => '微语时光机页面', ), ), array( 'id' => 'emaction_Closelike', 'type' => 'switcher', 'title' => '是否在勾选的范围中隐藏点赞组件', 'subtitle' => '开启后在勾选的应用范围中默认的点赞组件将自动隐藏(如评论点赞)', 'default' => false, ), array( 'type' => 'heading', 'content' => '朋友圈模块', ), array( 'type' => 'subheading', 'content' => '朋友圈和微语是一样的,只是样式不同且功能扩展也不同,遂分为两个模块
            当然,您要想前台能看到的话,请填写以下项,然后新建一个独立页面,并将自定义模板选择朋友圈', ), array( 'id' => 'fcircle_Name', 'type' => 'text', 'title' => '您的朋友圈昵称', 'after' => '填写您的朋友圈昵称,将显示在头像左边', ), array( 'id' => 'fcircle_Sign', 'type' => 'text', 'title' => '您的朋友圈个性签名', 'after' => '填写您的朋友圈个性签名,将显示在头像下方', ), array( 'id' => 'fcircle_Background', 'type' => 'upload', 'title' => '您的朋友圈顶部背景', 'after' => '上传顶部背景图片,该图片将显示在朋友圈顶部', ), array( 'id' => 'fcircle_Avatar', 'type' => 'upload', 'title' => '您的朋友圈头像', 'after' => '上传您的朋友圈头像', ), array( 'id' => 'fcircle_hiddenMode', 'type' => 'switcher', 'title' => '单栏模式', 'subtitle' => '开启后当全局为双栏模式时朋友圈页面强制显示单栏', 'default' => false, ), array( 'title' => '同步数据', 'type' =>'content', 'content' => $sync_html2, ), array( 'type' => 'heading', 'content' => 'Memos模块', ), array( 'type' => 'subheading', 'content' => 'Memos是一个具有知识管理和社交功能的自托管备忘录中心,本主题支持创建一个聚合Memos内容的独立页面,通过本模块可以将您在memos所发布的内容在本站点中呈现出来
            当然,您要想前台能看到的话,请填写以下项,然后新建一个独立页面,并将自定义模板选择Memos
            因Memos Api有改动,本模块建议使用Memos v0.24.0及以上版本,低于v0.24.0版本可能无法正常显示!', ), array( 'id' => 'memos_Url', 'type' => 'text', 'title' => '您的Memos域名', 'after' => '填写您的Memos域名,以http(s)://开头,末尾无需添加斜杠', ), array( 'id' => 'memos_Username', 'type' => 'text', 'title' => '您的Memos账户ID', 'after' => '一般填1即可,1为Memos初始管理员ID,若为其他成员可按照账户创建顺序递增ID,留空则输出所有公开的Memo', ), array( 'id' => 'memos_Autoavatar', 'type' => 'switcher', 'title' => '是否开启趣味头像', 'subtitle' => '本服务由DiceBear提供,开启后Memos列表显示的头像将根据发表Memo的作者ID来生成,不会重复', 'default' => false, ), array( 'id' => 'memos_Avatar', 'type' => 'upload', 'title' => 'Memos头像上传', 'subtitle' => 'Memos头像仅能上传一个,因此若列出的Memos列表有多个账户时都会显示一样的头像,当开启趣味头像后本项无效', 'default' => false, ), array( 'id' => 'memos_Emaction', 'type' => 'switcher', 'title' => '是否开启Emoji Emaction', 'subtitle' => '开启后Memo卡片底部会显示Emoji Emaction组件,访客可以通过点选Emoji来表明自己的态度', 'default' => false, ), array( 'type' => 'heading', 'content' => '微语模块', ), array( 'type' => 'subheading', 'content' => '您可以创建一个记录空间,记录一些自己所学的所记的,也可以自言自语胡言乱语23333
            当然,您要想前台能看到的话必须新建一个独立页面,并将自定义模板选择微语[时光机]', ), array( 'id' => 'cross_style', 'type' => 'select', 'title' => 'PC端微语样式', 'after' => '可选择PC端的微语结构样式', 'options' => array('1' => '默认样式', '2' => '树状样式'), 'default' => '1', ), array( 'type' => 'heading', 'content' => '相册模块', ), array( 'type' => 'subheading', 'content' => '本模块支持您设定一个或多个分类作为相册,设定为相册的分类将以相册样式展示~', ), array( 'id' => 'Cate_Album', 'type' => 'group', 'title' => '相册分类', 'subtitle' => '您可以通过本项增加指定分类作为相册,设置后该项指定的分类将以相册样式进行展示。', 'fields' => array( array( 'id' => 'Cate_Album_Name', 'type' => 'text', 'title' => '标识', 'after' => '您可以给该相册加个标注,该项仅后台可见~', ), array( 'id' => 'Cate_Album_Id', 'type' => 'select', 'title' => '要作为相册的分类选择', 'chosen' => true, 'multiple' => false, 'sortable' => true, 'ajax' => true, 'options' => 'category', 'placeholder' => '选择需要作为相册的分类', ), array( 'id' => 'Cate_Album_Number', 'type' => 'number', 'title' => '该分类下每页显示多少相册', 'default'=> '5', 'subtitle' => '请输入相册显示数目,填数字即可', ), ), ), array( 'type' => 'heading', 'content' => '我的Github仓库模块', ), array( 'type' => 'subheading', 'content' => '您需在下方填写您的Github账号
            仓库显示该Github账号下的所有项目,当然,您要想前台能看到的话必须新建一个独立页面,并将自定义模板选择我的Github仓库', ), array( 'id' => 'github_note', 'type' => 'text', 'title' => 'Github仓库温馨提示', 'after' => '填写Github仓库温馨提示,将显示在仓库上方', ), array( 'id' => 'github_accountid', 'type' => 'text', 'title' => 'Github账号', 'after' => '填写Github账号,系统将自动获取您账户下所有的自创项目', ), array( 'type' => 'heading', 'content' => '关于我模块', ), array( 'type' => 'subheading', 'content' => '您需在下方填写个人相关信息,当然,您要想前台能看到的话必须新建一个独立页面,并将自定义模板选择关于我', ), array( 'id' => 'aboutme_background', 'type' => 'upload', 'title' => '顶部背景', 'after' => '上传顶部背景图片,该图片将虚化后作为顶部背景显示', ), array( 'id' => 'aboutme_avatar', 'type' => 'upload', 'title' => '顶部头像', 'after' => '上传您的头像,将显示在顶部居中位置', ), array( 'id' => 'aboutme_name', 'type' => 'text', 'title' => '名字', 'after' => '填写您在自我介绍中的名字', ), array( 'id' => 'aboutme_say', 'type' => 'textarea', 'title' => '自我介绍', 'after' => '填写您的自我介绍,不求感人肺腑,只求看得过去~', ), array( 'id' => 'aboutme_job', 'type' => 'text', 'title' => '职业或者给自己颁发个头衔', 'after' => '填写您的职业或者头衔名', ), array( 'id' => 'aboutme_lc', 'type' => 'textarea', 'title' => '历程', 'after' => '填写您自己的历程,格式
            [timeline year="年份"]
            [title]历程标题[/title]
            [desc]历程内容[/desc]
            [/timeline]
            多个历程换行即可', ), array( 'id' => 'aboutme_ghOpen', 'type' => 'switcher', 'title' => '是否开启未来规划', 'subtitle' => '开启后关于我页面将显示规划栏目', 'default' => false, ), array( 'id' => 'aboutme_gh', 'type' => 'textarea', 'title' => '未来规划', 'after' => '填写您自己的未来规划,格式
            [timeline year="年份"]
            [title]规划标题[/title]
            [desc]规划内容[/desc]
            [/timeline]
            多个规划换行即可', 'dependency' => array( 'aboutme_ghOpen', '==', 'true' ) ), array( 'id' => 'aboutme_qq', 'type' => 'text', 'title' => '您的QQ', 'after' => '填写您的QQ账号,不填不显示', ), array( 'id' => 'aboutme_weibo', 'type' => 'text', 'title' => '您的微博', 'after' => '填写您的微博账号,不填不显示', ), array( 'id' => 'aboutme_weixin', 'type' => 'text', 'title' => '您的微信', 'after' => '填写您的微信号,不填不显示', ), array( 'id' => 'aboutme_mail', 'type' => 'text', 'title' => '您的邮箱', 'after' => '填写您的邮箱地址,不填不显示', ), ) ) ); if(Bsoptions('UserCenter_coin_name') !== ''):$coin_name = Bsoptions('UserCenter_coin_name');else:$coin_name = '积分';endif; CSF::createSection( $prefix, array( 'title' => '用户中心', 'icon' => 'fas fa-user-cog', 'fields' => array( array( 'id' => 'Login_hidden', 'type' => 'switcher', 'title' => '是否启用登录入口', 'text_on' => '启用', 'text_off' => '不启用', 'text_width' => '100', 'after'=>'

            开启后登录入口将显示在导航栏上。', ), array( 'id' => 'Login_Other', 'type' => 'checkbox', 'title' => '第三方社交登录', 'inline' => true, 'options' => array('qq' => 'QQ', 'wechat' => '微信','weibo' => '微博','github'=>'Github'), 'after'=>'该项针对有开启Tepass社交登录的用户['.$Tepass_check.']
            选择需要显示的社交登录按钮,它将显示在登录框底部。', 'dependency' => array( 'Login_hidden', '==', 'true' ) ), array( 'id' => 'UserCenterOpen', 'type' => 'switcher', 'title' => '是否启用用户中心', 'after' => '

            若选择开启,则前台将启用用户中心,用户中心中用户可进行修改个人资料、投稿等操作。', 'default' => false, ), array( 'id' => 'UserCenterRegister', 'type' => 'switcher', 'title' => '前台是否显示注册按钮', 'after' => '

            若选择开启,则前台将在登陆框旁显示注册按钮[在允许用户注册的前提下]
            需要注意的是仅在前台完成注册的用户才会拥有初始投稿权限,在后台完成注册的用户不具有投稿权限[初始管理员不受此影响]', 'default' => false, 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenter_tips', 'type' => 'textarea', 'title' => '用户中心首页公告', 'after' => '填写本站的用户中心首页公告,不填则不显示', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'type' => 'heading', 'content' => '投稿相关', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenter_tougaoOpen', 'type' => 'switcher', 'title' => '是否允许用户自主投稿', 'after' => '

            若选择开启,则前台用户中心将允许用户自主投稿
            拥有投稿权限不代表允许用户自主投稿,需拥有投稿权限的用户并且本项为启用状态下前台才会开放自主投稿', 'default' => false, 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenter_postcate', 'type' => 'select', 'title' => '用户可进行投稿的分类选择', 'chosen' => true, 'multiple' => true, 'sortable' => true, 'ajax' => false, 'options' => 'category', 'placeholder' => '选择用户可进行投稿的分类', 'dependency' => array( 'UserCenterOpen|UserCenter_tougaoOpen', '==|==', 'true|true' ), ), array( 'id' => 'UserCenter_tougaotips', 'type' => 'textarea', 'title' => '投稿须知', 'after' => '填写本站的投稿须知,比如让用户在投稿时需要注意些什么', 'dependency' => array( 'UserCenterOpen|UserCenter_tougaoOpen', '==|==', 'true|true' ), ), array( 'type' => 'heading', 'content' => '积分相关', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenter_coin_name', 'type' => 'text', 'title' => '用户中心积分名称', 'after' => '填写用户中心积分的名称,如金币,不填则显示为积分', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenter_coin_dw', 'type' => 'text', 'title' => '用户中心积分单位', 'after' => '填写用户中心积分的单位,如枚,一枚金币,不填则不显示单位', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenter_sign', 'type' => 'switcher', 'title' => '是否启用每日签到', 'after' => '

            若选择开启,则前台用户中心开启签到功能,可设置是否奖励积分。', 'default' => false, 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenter_sign_getCoin', 'type' => 'switcher', 'title' => '每日签到是否可获取积分', 'after' => '

            若选择开启,则前台用户中心签到功能每次签到都将获取到所设置的区间内积分。', 'default' => false, 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenter_sign_min', 'type' => 'number', 'title' => '签到获得最小积分值', 'default' => '1', 'max' => 99999, 'min' => 1, 'step' => 1, 'after' => '

            填写签到获得最小积分值,禁止为负数!', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenter_sign_max', 'type' => 'number', 'title' => '签到获得最大积分值', 'default' => '5', 'max' => 99999999, 'min' => 2, 'step' => 1, 'after' => '

            填写签到获得最大积分值,禁止为负数!', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'type' => 'heading', 'content' => '其他设置', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenterRedirect', 'type' => 'switcher', 'title' => '是否只允许管理员进入管理后台', 'after' => '

            若选择开启,则当已登录用户但非管理员身份访问后台时自动跳转至前台用户中心。', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), 'default' => true, ), array( 'type' => 'heading', 'content' => '日常管理', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'type' => 'content', 'content' => '发送个人通知', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), ), array( 'id' => 'UserCenter_tab', 'type' => 'tabbed', 'title' => '', 'dependency' => array( 'UserCenterOpen', '==', 'true' ), 'tabs' => array( array( 'title' => '头衔管理', 'fields' => array( array( 'id' => 'UserCenter_rank', 'type' => 'group', 'title' => '新增头衔', 'subtitle' => '您可以通过本项为所有注册的用户增加头衔设定,设定在两个数字区间为某个头衔,以此类推。', 'fields' => array( array( 'id' => 'UserCenter_rank_Note', 'type' => 'text', 'title' => '标识', 'after' => '您可以给该头衔加个标注,该项仅后台可见~', ), array( 'id' => 'UserCenter_rank_Name', 'type' => 'text', 'title' => '头衔名称', ), array( 'id' => 'UserCenter_rank_Pic', 'title' => '头衔图标', 'after' => '请上传或填写头衔图标直链,最佳尺寸为115x45,若该项为空,则直接显示头衔名称', 'type'=> 'upload' ), array( 'id' => 'UserCenter_rank_min', 'type' => 'number', 'title' => '头衔最小积分值', 'default' => '0', 'after' => '

            填写该头衔的最小积分值,禁止为负数!', ), array( 'id' => 'UserCenter_rank_max', 'type' => 'number', 'title' => '头衔最大积分值', 'default' => '99', 'after' => '

            填写该头衔的最大积分值,禁止为负数!', ), ), ), ), ), array( 'title' => '系统通知', 'fields' => array( array( 'id' => 'UserCenter_tongzhi', 'type' => 'group', 'title' => '系统通知', 'subtitle' => '您可以通过本项针对所有用户发送系统通知。', 'fields' => array( array( 'id' => 'UserCenter_tongzhi_Name', 'type' => 'text', 'title' => '标识', 'after' => '您可以给该通知加个标注,该项仅后台可见~', ), array( 'id' => 'UserCenter_tongzhi_title', 'type' => 'text', 'title' => '系统通知标题', ), array( 'id' => 'UserCenter_tongzhi_date', 'type' => 'date', 'title' => '系统通知时间', 'default' => date('m/d/Y',time()), 'after' => '选择系统通知时间', ), array( 'id' => 'UserCenter_tongzhi_text', 'type' => 'textarea', 'title' => '系统通知内容', 'after' => '请填写系统通知内容', ), ), ), ), ), array( 'title' => '用户查询', 'fields' => array( array( 'type' =>'content', 'content' => '
            用户UID 用户账号 用户昵称 用户邮箱 投稿文章数 用户组 '.$coin_name.' 投稿权限 操作
            ', ), ), ), ), )))); CSF::createSection( $prefix, array( 'title' => '赞赏设置', 'icon' => 'fas fa-donate', 'fields' => array( array( 'id' => 'RewardOpen', 'type' => 'switcher', 'title' => '赞赏功能', 'subtitle' => '若选择开启,则文章底部都将出现赞赏按钮用于支持作者。', 'default' => false, ), array( 'id' => 'RewardOpen_tepass', 'type' => 'switcher', 'title' => '是否兼容Tepass打赏', 'subtitle' => '本项针对开启Tepass插件的用户['.$Tepass_check.']
            若选择开启,则赞赏功能组件自动替换为Tepass插件来实现。', 'default' => false, 'dependency' => array( 'RewardOpen', '==', 'true' ), ), array( 'id' => 'RewardOpenAlipay', 'type' => 'switcher', 'title' => '支付宝赞赏', 'subtitle' => '若选择开启,则赞赏按钮将增加支付宝', 'default' => false, 'dependency' => array( 'RewardOpen', '==', 'true' ), ), array( 'id' => 'RewardOpenAlipayText', 'type' => 'upload', 'title' => '您的支付宝赞赏图片二维码', 'after' => '请上传您的支付宝赞赏图片二维码,尺寸建议300x300', 'dependency' => array( 'RewardOpen|RewardOpenAlipay', '==|==', 'true|true' ), ), array( 'id' => 'RewardOpenWechat', 'type' => 'switcher', 'title' => '微信赞赏', 'subtitle' => '若选择开启,则赞赏按钮将增加微信', 'default' => false, 'dependency' => array( 'RewardOpen', '==', 'true' ), ), array( 'id' => 'RewardOpenWechatText', 'type' => 'upload', 'title' => '您的微信赞赏图片二维码', 'after' => '请上传您的微信赞赏图片二维码,尺寸建议300x300', 'dependency' => array( 'RewardOpen|RewardOpenWechat', '==|==', 'true|true' ), ), array( 'id' => 'RewardOpenQQ', 'type' => 'switcher', 'title' => 'QQ赞赏', 'subtitle' => '若选择开启,则赞赏按钮将增加QQ', 'default' => false, 'dependency' => array( 'RewardOpen', '==', 'true' ), ), array( 'id' => 'RewardOpenQQText', 'type' => 'upload', 'title' => '您的QQ赞赏图片二维码', 'after' => '请上传您的QQ赞赏图片二维码,尺寸建议300x300', 'dependency' => array( 'RewardOpen|RewardOpenQQ', '==|==', 'true|true' ), ), array( 'id' => 'RewardOpenPaypal', 'type' => 'switcher', 'title' => 'Paypal赞赏', 'subtitle' => '若选择开启,则赞赏按钮将增加Paypal', 'default' => false, 'dependency' => array( 'RewardOpen', '==', 'true' ), ), array( 'id' => 'RewardOpenPaypalText', 'type' => 'text', 'title' => '您的Paypal赞赏链接', 'after' => '请输入您的Paypal赞赏链接', 'dependency' => array( 'RewardOpen|RewardOpenPaypal', '==|==', 'true|true' ), ), array( 'id' => 'RewardOpenAfdian', 'type' => 'switcher', 'title' => '爱发电赞赏', 'subtitle' => '若选择开启,则赞赏按钮将增加爱发电', 'default' => false, 'dependency' => array( 'RewardOpen', '==', 'true' ), ), array( 'id' => 'RewardOpenAfdianText', 'type' => 'text', 'title' => '您的爱发电赞赏链接', 'after' => '请输入您的爱发电赞赏链接', 'dependency' => array( 'RewardOpen|RewardOpenAfdian', '==|==', 'true|true' ), ), ), ) ); if(file_exists(__TYPECHO_ROOT_DIR__.'/usr/themes/bearsimple/core/extend/vendor/maxmind-db/GeoLite2-City.mmdb')){ $max_tips = 'maxmind-db目录已存在,无需下载'; } else{ $max_tips = 'maxmind-db目录不存在'; } CSF::createSection( $prefix, array( 'title' => '评论设置', 'icon' => 'fas fa-comments', 'fields' => array( array( 'id' => 'CommentClose_Hide', 'type' => 'switcher', 'title' => '隐藏评论区', 'default' => false, 'subtitle'=>'开启本项后全局隐藏评论区,非普通独立页面[如留言、朋友圈不在本项影响范围中]' ), array( 'id' => 'comment_choose', 'type' => 'select', 'title' => '选择评论系统', 'subtitle' => '您可以自由选择使用原生评论系统或第三方评论系统', 'options' => array('1' => '原生评论', '2' => 'Artalk'), 'default' => '1', ), array( 'id' => 'artalk_backend', 'type' => 'text', 'title' => 'Artalk后端地址', 'subtitle'=>'请填写Artalk后端地址,确认后端地址填写对只需访问 您填写的后端地址/dist/Artalk.css,只要能正常访问到css即填写正确~~', 'dependency' => array( 'comment_choose', '==', '2' ), ), array( 'id' => 'artalk_sitename', 'type' => 'text', 'title' => 'Artalk站点名称', 'subtitle'=>'请填写Artalk站点名称,站点名称为您在Artalk后台添加站点时所填写的站点名', 'dependency' => array( 'comment_choose', '==', '2' ), ), array( 'type' => 'notice', 'style' => 'info', 'content' => '以下为原生评论专属选项', ), array( 'id' => 'CommentClose', 'type' => 'switcher', 'title' => '文章评论全局开关', 'default' => true, 'subtitle'=>'若为禁用,则网站全局评论功能都将关闭' ), array( 'id' => 'CommentDesc', 'type' => 'switcher', 'title' => '文章评论列表是否放置在评论表单上面', 'default' => false, 'subtitle'=>'若启用,评论表单将显示在评论列表下方' ), array( 'id' => 'Emoji', 'type' => 'switcher', 'title' => '评论表情', 'default' => false, 'subtitle'=>'若开启评论表情,则前台文章评论区将显示表情按钮' ), array( 'id' => 'Emoji_Diy', 'type' => 'switcher', 'title' => '是否添加自定义表情', 'default' => false, 'subtitle'=>'开启后请填写自定义表情json文件地址', 'dependency' => array( 'Emoji', '==', 'true' ), ), array( 'id' => 'Emoji_DiyUrl', 'type' => 'text', 'title' => '自定义表情json文件地址', 'after' => '请填写自定义表情json文件地址,遵循格式:
            [
                        {
            		"icon": "图片地址",
            		"data": "输出的表情识别符,如:@(开心),每个表情一个识别符,请勿重复",
            		"text": "该表情所表达的意思,如开心",
            		"category": "表情分类名"
            	},{
            		"icon": "图片地址",
            		"data": "输出的表情识别符,如:@(生气),每个表情一个识别符,请勿重复",
            		"text": "该表情所表达的意思,如生气",
            		"category": "表情分类名"
            	},{
            		"icon": "图片地址",
            		"data": "输出的表情识别符,如:@(难过),每个表情一个识别符,请勿重复",
            		"text": "该表情所表达的意思,如难过",
            		"category": "表情分类名"
            	}
            ]
            ', 'dependency' => array( 'Emoji|Emoji_Diy', '==|==', 'true|true' ), ), array( 'id' => 'Emoji_HideDefault', 'type' => 'switcher', 'title' => '是否隐藏默认内置表情', 'default' => false, 'subtitle'=>'开启后将隐藏默认的内置表情', 'dependency' => array( 'Emoji|Emoji_Diy', '==|==', 'true|true' ), ), array( 'id' => 'Comment_like', 'type' => 'switcher', 'title' => '评论是否开启点赞', 'default' => false, 'subtitle'=>'开启点赞后评论区每条评论都将显示点赞按钮,本项应用范围包含时光机的动态' ), array( 'id' => 'Comment_useragent', 'type' => 'switcher', 'title' => '评论是否显示UserAgent', 'default' => false, 'subtitle'=>'开启后将显示评论者使用的浏览器和操作系统图标,本项应用范围包含时光机的动态' ), array( 'id' => 'Comment_ipget', 'type' => 'switcher', 'title' => '评论是否显示IP属地', 'default' => false, 'subtitle'=>'若开启,则评论区每个评论者都将显示IP属地。
            开启本功能需下载maxmind-db数据库,戳这里下载,将压缩包中的maxmind-db目录放入/usr/themes/bearsimple/core/extend/vendor/中即可
            检测:'.$max_tips ), array( 'id' => 'Comment_ipget_data', 'type' => 'switcher', 'title' => '是否使用IP属地信息最新数据', 'default' => false, 'subtitle'=>'若启用将在新评论使用IP属地信息在线数据库对访客IP地理位置进行查询,因使用的是API查询,可能因网络因素导致影响评论速度!若为禁用,则使用主题内置IP属地数据库进行查询。', 'dependency' => array( 'Comment_ipget', '==', 'true' ), ), array( 'id' => 'Comment_ipget_data_choose', 'type' => 'select', 'title' => '选择IP属地信息最新数据源', 'after' => '请选择IP属地信息最新数据源,默认为ZXINC,若选择腾讯位置服务请填写应用KEY。', 'options' => array('1' => 'ZXINC', '2' => '腾讯位置服务'), 'default' => '1', 'dependency' => array('Comment_ipget|Comment_ipget_data', '==|==', 'true|true' ), ), array( 'id' => 'Comment_ipget_data_tencent_key', 'type' => 'text', 'title' => '腾讯位置服务应用KEY', 'subtitle'=>'请填写腾讯位置服务应用KEY,请确保填写的KEY准确无误,否则将影响部分组件运行!', 'dependency' => array('Comment_ipget|Comment_ipget_data|Comment_ipget_data_choose', '==|==|==', 'true|true|2' ), ), array( 'id' => 'Comment_ipget_data_tencent_sign', 'type' => 'text', 'title' => '腾讯位置服务应用Secret key[校验签名]', 'subtitle'=>'若选择了签名校验,请填写Secret key( SK )!', 'dependency' => array('Comment_ipget|Comment_ipget_data|Comment_ipget_data_choose', '==|==|==', 'true|true|2' ), ), array( 'id' => 'Comment_islogin', 'type' => 'switcher', 'title' => '评论区显示已登录者信息', 'default' => true, 'subtitle'=>'若开启,则在登录后评论区显示已登录者信息。' ), array( 'id' => 'Comment_showmail', 'type' => 'switcher', 'title' => '当邮箱非必填时是否隐藏邮箱输入框', 'default' => false, 'subtitle'=>'若开启,则评论区隐藏邮箱输入框,需要注意的是当邮箱设置非必填时系统会自动为没填写邮箱的评论者自动生成一个邮箱,以便回复可见可正常使用。' ), array( 'id' => 'Comment_showurl', 'type' => 'switcher', 'title' => '当网址非必填时是否隐藏博客网址输入框', 'default' => false, 'subtitle'=>'若开启,则评论区隐藏博客网址输入框。' ), array( 'id' => 'Comment_private', 'type' => 'switcher', 'title' => '是否启用私密评论', 'default' => false, 'subtitle'=>'若开启,则评论区允许提交私密评论,仅登录用户和评论双方可见。' ), array( 'id' => 'Comment_tips', 'type' => 'switcher', 'title' => '是否显示评论提示', 'default' => true, 'subtitle'=>'若开启,则评论区“我要评论”字旁增加一个提示,默认提示为本博客使用Cookie技术保留信息,若继续评论则表示同意条款。' ), array( 'id' => 'Comment_tips_text', 'type' => 'textarea', 'title' => '评论提示内容', 'after' => '请输入评论提示内容', 'default' => '本博客使用Cookie技术保留您的个人信息以方便您能够在下一次快速评论,继续评论表示您已同意该条款', 'dependency' => array( 'Comment_tips', '==', 'true' ), ), array( 'id' => 'Comment_placeholder', 'type' => 'text', 'title' => '评论文本框占位符', 'after' => '请输入评论文本框占位符,即在评论区评论框在还没有文字时显示的文字,可留空,留空则显示默认占位符', 'default' => '嘿~ 大神,别默默的看了,快来点评一下吧', ), //评论电邮通知 array( 'type' => 'heading', 'content' => '评论电邮通知设置', ), array( 'type' => 'subheading', 'content' => '主题已内置评论电邮通知功能,您可以通过开启该功能实现评论后邮件推送[在此之前您需要在SMTP设置中开启SMTP服务并填写SMTP信息]', ), array( 'id' => 'CommentNotify__Open', 'type' => 'switcher', 'title' => '评论电邮通知', 'default' => false, 'subtitle'=>'若选择开启,则评论区的评论回复动作都可以通过邮件形式推送。', ), array( 'id' => 'CommentNotify__AcceptMailAddress', 'type' => 'text', 'title' => '接收邮件的地址', 'after' => '接收邮件的地址,如为空则使用文章作者个人设置中的邮件地址', 'dependency' => array( 'CommentNotify__Open', '==', 'true' ), ), array( 'id' => 'CommentNotify__TemplateContact', 'type' => 'text', 'title' => '模板中“联系我”的邮件地址', 'after' => '联系我用的邮件地址,如为空则使用文章作者个人设置中的邮件地址', 'dependency' => array( 'CommentNotify__Open', '==', 'true' ), ), array( 'id' => 'CommentNotify__NotifySetting', 'type' => 'checkbox', 'title' => '提醒设置', 'inline' => true, 'options' => array('approved' => '提醒已通过评论','waiting' => '提醒待审核评论','spam' => '提醒垃圾评论'), 'subtitle'=>'该选项仅针对博主,访客只发送已通过的评论。', 'default' => '1', 'dependency' => array( 'CommentNotify__Open', '==', 'true' ), ), array( 'id' => 'CommentNotify__OtherSetting', 'type' => 'checkbox', 'title' => '其他设置', 'options' => array('1' => '有评论及回复时,发邮件通知博主','2' => '评论被回复时,发邮件通知评论者','3' => '自己回复自己的评论时,发邮件通知。(同时针对博主和访客)','4' => '记录发送日志'), 'subtitle'=>'根据自身实际情况进行勾选,若勾选记录发送日志,日志文件在/usr/plugins/BsCore/log/,当发送邮件较多时文件体积也会随之增大。', 'default' => '1', 'dependency' => array( 'CommentNotify__Open', '==', 'true' ), ), array( 'id' => 'CommentNotify__Author', 'type' => 'text', 'title' => '博主接收邮件标题', 'after' => '{title}为可调用变量,您可以自定义博主接收邮件时的邮件标题', 'default'=> '[{title}] 一文有新的评论', 'dependency' => array( 'CommentNotify__Open', '==', 'true' ), ), array( 'id' => 'CommentNotify__Reader', 'type' => 'text', 'title' => '访客接收邮件标题', 'after' => '{title}为可调用变量,您可以自定义访客接收邮件时的邮件标题', 'default'=> '您在 [{title}] 的评论有了回复', 'dependency' => array( 'CommentNotify__Open', '==', 'true' ), ), array( 'type' => 'heading', 'content' => '评论过滤设置', ), array( 'type' => 'subheading', 'content' => '默认强制性过滤全空格评论、包含XSS危险内容评论,其余需过滤内容您可以通过开启智能过滤或开启评论过滤高级设置进行设置。', ), array( 'id' => 'BearSpam_Auto', 'type' => 'switcher', 'title' => '智能过滤[Beta]', 'default' => false, 'subtitle'=>'您可以通过开启智能过滤来对机器人评论进行拦截,不过请注意:该功能还处于Beta测试阶段,可能出现误拦截的情况', ), array( 'id' => 'BearSpam_Pro', 'type' => 'switcher', 'title' => '评论过滤高级设置', 'default' => false, 'subtitle'=>'您可以通过开启高级设置对评论区的评论提交做更深层次的过滤。' ), array( 'id' => 'BearSpam_IP', 'type' => 'textarea', 'title' => '过滤IP', 'after' => '多条IP请用换行符隔开
            支持用*号匹配IP段,如:192.168.*.*', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_EMAIL', 'type' => 'textarea', 'title' => '过滤邮箱', 'after' => '多个邮箱请用换行符隔开
            可以是邮箱的全部,或者邮箱部分关键词', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_URL', 'type' => 'textarea', 'title' => '过滤网址', 'after' => '多个网址请用换行符隔开
            可以是网址的全部,或者网址部分关键词。如果网址为空,该项不会起作用', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_ArticleTitle', 'type' => 'select', 'title' => '过滤含有文章标题的评论', 'options' => array('1' => '是', '2' => '否'), 'after' => '根据研究表明机器人发表的内容可能含有评论文章的标题', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_NAME', 'type' => 'textarea', 'title' => '过滤昵称', 'after' => '如果评论发布者的昵称含有该关键词,将执行该操作,多个请直接换行', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_NAMEMIN', 'type' => 'number', 'title' => '昵称允许的最短长度', 'unit' => '个字', 'subtitle' => '如果评论发布者的昵称小于该最短长度将拦截', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_NAMEMAX', 'type' => 'number', 'title' => '昵称允许的最长长度', 'unit' => '个字', 'subtitle' => '如果评论发布者的昵称大于该最长长度将拦截', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_NAMEURL', 'type' => 'select', 'title' => '过滤昵称为网址的评论', 'options' => array('1' => '是', '2' => '否'), 'after' => '根据研究表明机器人发表的评论,昵称很有可能为网址', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_Chinese', 'type' => 'select', 'title' => '过滤不包含中文的评论', 'options' => array('1' => '是', '2' => '否'), 'after' => '当评论内容中没有中文时进行拦截', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_MIN', 'type' => 'number', 'title' => '评论内容允许的最短长度', 'unit' => '个字', 'subtitle' => '如果评论发布者的评论内容小于该最短长度将拦截', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_MAX', 'type' => 'number', 'title' => '评论内容允许的最长长度', 'unit' => '个字', 'subtitle' => '如果评论发布者的评论内容大于该最长长度将拦截', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), array( 'id' => 'BearSpam_Words', 'type' => 'textarea', 'title' => '过滤敏感词', 'after' => '多个词汇请用换行符隔开', 'dependency' => array( 'BearSpam_Pro', '==', 'true' ), ), ) ) ); CSF::createSection( $prefix, array( 'title' => 'SMTP设置', 'icon' => 'far fa-envelope', 'fields' => array( array( 'id' => 'Smtp_open', 'type' => 'switcher', 'title' => '是否启用SMTP服务', 'after' => '

            若启用则全局开启SMTP服务,该服务用于评论电邮通知、友链提交审核通知等。另外有几点需要注意:
            1、建议使用PHP8,PHP7可能出现无法正常发送邮件的问题
            2、邮件发送若频率过高可能因所使用的邮箱服务所限制的发送频率而导致发信失败
            3、若使用了CDN且开启了部分CDN缓存规则或全局缓存也有可能(有一定几率)导致发信失败
            ', 'default' => false, ), array( 'id' => 'CommentNotify__testmail', 'type' => 'content', 'title' => '邮件发送测试', 'content'=>$mail_html, 'dependency' => array( 'Smtp_open', '==', 'true' ), ), array( 'id' => 'CommentNotify__template', 'type' => 'content', 'title' => '邮件发送模板修改', 'content'=> '戳这里修改邮件模板

            若修改邮件模板,请在后续主题版本升级前备份邮件模板,避免被覆盖!', 'dependency' => array( 'Smtp_open', '==', 'true' ), ), array( 'id' => 'CommentNotify__Sendway', 'type' => 'radio', 'title' => '发信方式', 'subtitle'=>'请选择发信方式', 'inline' => true, 'options' => array('smtp'=> 'SMTP'), 'default' => 'smtp', 'dependency' => array( 'Smtp_open', '==', 'true' ), ), array( 'id' => 'CommentNotify__Address', 'type' => 'text', 'title' => '发信服务器地址', 'after' => '请输入发信服务器地址,如smtp.qq.com', 'dependency' => array( 'Smtp_open', '==', 'true' ), ), array( 'id' => 'CommentNotify__Port', 'type' => 'text', 'title' => '发信服务器端口', 'after' => '请输入发信服务器端口,也就是SMTP服务端口,一般为465或587', 'dependency' => array( 'Smtp_open', '==', 'true' ), ), array( 'id' => 'CommentNotify__Username', 'type' => 'text', 'title' => '发信邮箱账号', 'after' => '请输入发信邮箱账号,也就是SMTP账号,一般就是邮箱地址,如xxx@xxx.com', 'dependency' => array( 'Smtp_open', '==', 'true' ), ), array( 'id' => 'CommentNotify__Password', 'type' => 'text', 'title' => '发信邮箱密码', 'after' => '请输入发信邮箱密码,也就是SMTP密码,一般就是邮箱密码,若QQ邮箱则为授权码', 'dependency' => array( 'Smtp_open', '==', 'true' ), ), array( 'id' => 'CommentNotify__Verify', 'type' => 'checkbox', 'title' => '发信验证', 'inline' => true, 'options' => array('true' => '服务器需要验证'), 'subtitle'=>'一般情况下都是勾选的。', 'default' => 'true', 'dependency' => array( 'Smtp_open', '==', 'true' ), ), array( 'id' => 'CommentNotify__VerifyWay', 'type' => 'radio', 'title' => '验证方式', 'subtitle'=>'请选择发信验证方式', 'inline' => true, 'options' => array('ssl'=> 'SSL加密验证', 'tls'=> 'TLS加密验证', 'none'=> '无验证'), 'default' => 'ssl', 'dependency' => array( 'Smtp_open', '==', 'true' ), ), array( 'id' => 'CommentNotify__SenderName', 'type' => 'text', 'title' => '发信人名称', 'after' => '发信人名称,留空则使用博客标题', 'dependency' => array( 'Smtp_open', '==', 'true' ), ), array( 'id' => 'CommentNotify__SenderForm', 'type' => 'text', 'title' => '发信人邮箱', 'after' => '发信人邮箱,为空则使用发信邮箱账号', 'dependency' => array( 'Smtp_open', '==', 'true' ), ), ) ) ); Typecho_Widget::widget('Widget_Stat')->to($stat); $sync_api = Common::url('syncData',Options::alloc()->index); $sync_htmls = '
            一键同步并启用所有文章的知识共享协议
            一键同步关闭所有文章的知识共享协议
            '; $sync_htmls2 = '
            一键同步启用所有文章的文章热度
            一键同步关闭所有文章的文章热度
            '; $sync_htmls3 = '
            一键同步启用所有文章的文章标签
            一键同步关闭所有文章的文章标签
            '; CSF::createSection( $prefix, array( 'title' => '文章设置', 'icon' => 'fas fa-file-alt', 'fields' => array( array( 'id' => 'articleMetaShows', 'type' => 'checkbox', 'title' => '文章元信息显示', 'inline' => true, 'subtitle'=>'可勾选文章页面要显示的元信息,即文章标题下方的文章信息栏(仅文章有效,独立页面不受此项影响)', 'options' => array('author' => '作者名', 'time' => '发表时间','category' => '分类'), 'default' => array('author','time','category'), ), array( 'id' => 'Share', 'type' => 'switcher', 'title' => '第三方分享', 'default' => false, 'subtitle'=>'若选择开启,则文章页面都将显示第三方分享按钮,可自定义选择显示哪个。' ), array( 'id' => 'Shares', 'type' => 'checkbox', 'title' => '选择要显示的第三方分享途径', 'inline' => true, 'options' => array('qq' => 'QQ', 'qzone' => 'QQ空间','weibo' => '微博','facebook' => 'Facebook','twitter' => 'Twitter','google' => 'Google','linkedin' => 'Linkedin','wechat'=> '微信'), 'dependency' => array( 'Share', '==', 'true' ), ), array( 'id' => 'Scroll', 'type' => 'switcher', 'title' => '文章目录树', 'default' => false, 'subtitle'=>'若选择开启,则文章页面自动识别h1-h6标签,当存在时自动生成目录树
            默认开启文章内目录树,请选择是否开启侧边栏目录树。' ), array( 'id' => 'Scroll_Sidebar', 'type' => 'switcher', 'title' => '侧边栏文章目录树', 'default' => false, 'subtitle'=>'若选择开启,则文章页面侧边栏将显示目录树,与文章内目录树不冲突,可同步开启。', 'dependency' => array( 'Scroll', '==', 'true' ), ), array( 'id' => 'articleFontDefault', 'type' => 'radio', 'title' => '文章默认字体', 'inline' => true, 'subtitle' => '前台默认允许访客自行切换字体,但在此之前可选择默认展现的字体', 'options' => array('1' => '默认', '2' => '楷体','3'=>'霞鹜文楷体'), 'default' => '1', ), array( 'id' => 'Like', 'type' => 'switcher', 'title' => '文章点赞', 'default' => false, 'subtitle'=>'选择开启则文章下方显示点赞按钮' ), array( 'id' => 'Readmode', 'type' => 'switcher', 'title' => '文章阅读模式', 'default' => false, 'subtitle'=>'选择开启则文章显示阅读模式入口,给予读者一个纯净的阅读体验' ), array( 'id' => 'Readmode_Auto', 'type' => 'switcher', 'title' => '访问文章页面是否自动进入阅读模式', 'default' => false, 'subtitle'=>'选择开启则当访问文章时自动进入阅读模式,仅文章页面有效,独立页面场景下本设置无效,需要注意的是当文章为密码文章时需验证密码后才能触发该功能', 'dependency' => array( 'Readmode', '==', 'true' ), ), array( 'id' => 'pageContent', 'type' => 'switcher', 'title' => '文章分页模式', 'default' => false, 'subtitle'=>'选择开启则文章内容适当处插入----------后进行内容分页,需要注意的是开启文章分页模式会影响SEO,请谨慎开启!' ), array( 'id' => 'infinite_scroll', 'type' => 'switcher', 'title' => '文章无限加载模式', 'default' => false, 'subtitle'=>'开启后文章列表输出页面的分页将替换为无限加载按钮,点击按钮将继续加载后面的文章。' ), array( 'id' => 'infinite_pageSize', 'type' => 'spinner', 'title' => '文章每一次的加载篇数', 'subtitle' => '您目前的文章总数为'.$stat->publishedPostsNum.'篇,加载篇数不可超过或等于文章总数。', 'max' => $stat->publishedPostsNum - 1, 'min' => 1, 'step' => 1, 'default' => Helper::options()->pageSize, 'dependency' => array( 'infinite_scroll', '==', 'true' ), ), array( 'id' => 'history_Today', 'type' => 'switcher', 'title' => '那年今日', 'default' => false, 'subtitle'=>'开启后文章页面会出现那年今日组件,显示历史上的今天或在发布时间后面的年份同月同日所发的文章,当无文章时自动隐藏[仅文章页面,独立页面不显示]。' ), array( 'id' => 'history_Today_Limit', 'type' => 'spinner', 'title' => '那年今日文章篇数', 'subtitle' => '可限制那年今日所显示的文章篇数,默认为5篇。', 'max' => '999999', 'min' => 1, 'step' => 1, 'default' => 5, 'dependency' => array( 'history_Today', '==', 'true' ), ), array( 'id' => 'more_posts', 'type' => 'switcher', 'title' => '随机文章', 'default' => false, 'subtitle'=>'开启后文章页面会出现随机文章组件,显示最多十篇随机文章[仅文章页面,独立页面不显示]。' ), array( 'id' => 'more_posts_archive', 'type' => 'switcher', 'title' => '当搜索无结果时显示本组件', 'default' => false, 'subtitle'=>'开启后除了文章页面外,在搜索关键词没有结果时也显示猜您想看。', 'dependency' => array( 'more_posts', '==', 'true' ), ), array( 'id' => 'article_blank', 'type' => 'switcher', 'title' => '文章新窗口打开', 'default' => false, 'subtitle'=>'开启后首页、分类等输出文章列表页面打开文章均为新窗口打开。' ), array( 'id' => 'article_imgalt', 'type' => 'switcher', 'title' => '文章图片描述显示', 'default' => false, 'subtitle'=>'开启后文章图片的描述将以小字样式显示在图片下方。' ), array( 'id' => 'article_copyrightopen', 'type' => 'switcher', 'title' => '文章是否默认开启知识共享协议声明', 'default' => false, 'subtitle'=>'开启后文章发布不需要再自行开启知识共享协议声明,您在设置后所发布的文章都将自动开启知识共享协议声明,下面可自行选择需要默认显示的知识共享协议类型。' ), array( 'id' => 'article_copyrightopen_type', 'type' => 'select', 'title' => '知识共享协议类型', 'options' => array( 'one' => '知识共享署名 4.0 国际许可协议', 'two' => '知识共享署名-非商业性使用 4.0 国际许可协议', 'three' => '知识共享署名-禁止演绎 4.0 国际许可协议', 'four' => '知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议', 'five' => '知识共享署名-相同方式共享 4.0 国际许可协议', 'six' => '知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议', ), 'default'=> 'one', 'dependency' => array( 'article_copyrightopen', '==', 'true' ), 'after' => '选择知识共享协议类型', ), array( 'id' => 'article_copyrightopen_sync', 'type' => 'content', 'title' => '一键同步', 'content'=>$sync_htmls, 'dependency' => array( 'article_copyrightopen', '==', 'true' ), ), array( 'id' => 'article_hotopen', 'type' => 'switcher', 'title' => '文章是否默认开启文章热度', 'default' => false, 'subtitle'=>'开启后文章发布不需要再自行开启文章热度,您在设置后所发布的文章都将自动开启文章热度。' ), array( 'id' => 'article_hotopen_sync', 'type' => 'content', 'title' => '一键同步', 'content'=>$sync_htmls2, 'dependency' => array( 'article_hotopen', '==', 'true' ), ), array( 'id' => 'article_tagopen', 'type' => 'switcher', 'title' => '文章是否默认开启文章标签', 'default' => false, 'subtitle'=>'开启后文章发布不需要再自行开启文章标签,您在设置后所发布的文章都将自动开启文章标签。' ), array( 'id' => 'article_tagopen_sync', 'type' => 'content', 'title' => '一键同步', 'content'=>$sync_htmls3, 'dependency' => array( 'article_tagopen', '==', 'true' ), ), array( 'id' => 'article_textindent', 'type' => 'switcher', 'title' => '文章是否默认自动段落首行缩进', 'default' => false, 'after'=>'

            开启后文章段落首行都将自动强制缩进。' ), array( 'id' => 'article_videoExt', 'type' => 'checkbox', 'title' => '文章播放器短代码可选扩展', 'after' => '这里支持自行选择文章播放器短代码需要开启的扩展。', 'inline' => true, 'options' => array( 'ext_hls' => 'HLS扩展支持', 'ext_flv' => 'FLV扩展支持', ), ), ) ) ); CSF::createSection( $prefix, array( 'title' => '图片设置', 'icon' => 'fas fa-image', 'fields' => array( array( 'type' => 'heading', 'content' => '图片水印', ), array( 'type' => 'subheading', 'content' => '本主题内置图片水印功能,您可以通过以下设置对前台文章输出的图片进行水印处理。', ), array( 'id' => 'Watermark', 'type' => 'switcher', 'title' => '文章图片水印', 'default' => false, 'subtitle'=>'开启后可对本功能进行详细设置,前台输出图片时自动打上水印' ), array( 'id' => 'WatermarkType', 'type' => 'select', 'title' => '水印类型', 'options' => array('1' => '文字', '2' => '图片'), 'default'=> '1', 'dependency' => array( 'Watermark', '==', 'true' ), 'after' => '选择要打上什么样式的水印,若选择图片方式的话在非当前域名下可能存在跨域方面的问题,需自行根据服务器情况设置', ), array( 'id' => 'waterMarkName', 'type' => 'text', 'title' => '水印文字/图片地址', 'subtitle' => '若水印类型选择的是文本,则填写文字,若选择的是图片,则请填写图片直链', 'dependency' => array( 'Watermark', '==', 'true' ), ), array( 'id' => 'waterMarkKd', 'type' => 'number', 'title' => '水印宽度', 'default'=> '130', 'unit' => 'px', 'subtitle' => '填写水印宽度,填写数字即可,默认则为130', 'dependency' => array( 'Watermark', '==', 'true' ), ), array( 'id' => 'waterMarkTextSize', 'type' => 'number', 'title' => '水印文字大小', 'default'=> '12', 'unit' => 'px', 'subtitle' => '[仅当水印类型为文字的时候本项有效]
            填写水印文字大小,单位是px,填写数字即可,默认则为12', 'dependency' => array( 'Watermark', '==', 'true' ), ), array( 'id' => 'waterMarkTextColor', 'type' => 'text', 'title' => '水印文字颜色', 'default'=> 'white', 'subtitle' => '[仅当水印类型为文字的时候本项有效]
            填写水印文字颜色,可以是HEX或者RGBA 颜色代码,举个最简单的例子,比如填white,则为白色,black则为黑色', 'dependency' => array( 'Watermark', '==', 'true' ), ), array( 'id' => 'waterMarkTextBackground', 'type' => 'text', 'title' => '水印文字背景颜色', 'default'=> 'black', 'subtitle' => '[仅当水印类型为文字的时候本项有效]
            填写水印文字背景颜色,可以是HEX或者RGBA 颜色代码,举个最简单的例子,比如填white,则为白色,black则为黑色', 'dependency' => array( 'Watermark', '==', 'true' ), ), array( 'id' => 'waterMarkLocation', 'type' => 'select', 'title' => '水印位置', 'options' => array('nw' => '左上角', 'n' => '正上方', 'ne' => '右上角','w' => '正左边','e' => '正右边','sw' => '左下角','s' => '正下方','se' => '右下角','c' => '正中间'), 'default'=> 'c', 'dependency' => array( 'Watermark', '==', 'true' ), 'after' => '选择水印位置', ), array( 'id' => 'waterMarkOpacity', 'type' => 'slider', 'title' => '水印透明度', 'subtitle' => '水印透明度,在0-1之间选择一个数字,默认0.7', 'min' => 0.1, 'max' => 1, 'step' => 0.1, 'default' => 0.7, 'dependency' => array( 'Watermark', '==', 'true' ), ), array( 'id' => 'waterMarkMargin', 'type' => 'number', 'title' => '水印到图片边缘的距离', 'default'=> '10', 'subtitle' => '填写水印到图片边缘的距离,填写数字即可,默认10', 'dependency' => array( 'Watermark', '==', 'true' ), ), array( 'id' => 'waterMarkOutput', 'type' => 'select', 'title' => '打上水印后的图片格式', 'options' => array('null'=>'使用原图格式','jpeg'=>'jpeg','png'=>'png','webp'=>'webp'), 'default'=> 'null', 'dependency' => array( 'Watermark', '==', 'true' ), 'after' => '选择打上水印后的图片格式,默认情况下原图啥格式,输出就啥格式', ), array( 'type' => 'heading', 'content' => '图片压缩', ), array( 'type' => 'subheading', 'content' => '本主题内置图片压缩功能,您可以通过该功能来对上传的图片进行压缩处理。
            该服务由TinyPNG提供~', ), array( 'id' => 'Tinypng_open', 'type' => 'switcher', 'title' => '是否启用图片压缩', 'default' => false, 'subtitle'=>'TinyPNG APIKEY申请地址:戳这里' ), array( 'id' => 'Tinypng_apikey', 'type' => 'text', 'title' => 'TinyPNG APIKEY', 'subtitle' => '请在这里填写TinyPNG ApiKey', 'dependency' => array( 'Tinypng_open', '==', 'true' ), ), ) ) ); CSF::createSection( $prefix, array( 'title' => '海报设置', 'icon' => 'fas fa-id-card', 'fields' => array( array( 'id' => 'Poster', 'type' => 'switcher', 'title' => '文章微海报', 'default' => false, 'after'=>'

            开启后前台文章页面会显示微海报生成按钮' ), array( 'id' => 'Poster__LogoUrl', 'type' => 'upload', 'title' => '海报底部LOGO', 'subtitle' => '上传海报底部LOGO,显示在海报底部,留空则显示博客名称
            建议使用本地图片作为底部LOGO,若使用外部图片链接,微海报可能无法正常生成~', 'dependency' => array( 'Poster', '==', 'true' ), ), array( 'id' => 'Poster__AttUrl', 'type' => 'upload', 'title' => '海报默认缩略图', 'subtitle' => '上传海报默认缩略图,显示在海报顶部,在文章没有填写文章封面栏的情况下使用缩略图
            建议使用本地图片作为默认缩略图,若使用外部图片链接,微海报可能无法正常生成~', 'dependency' => array( 'Poster', '==', 'true' ), ), array( 'id' => 'Poster__AttChoose', 'type' => 'switcher', 'title' => '当没有文章封面时默认使用以上缩略图', 'default' => false, 'after'=>'

            开启后当文章没有填写文章封面图片链接时默认使用以上默认缩略图' ), ) ) ); CSF::createSection( $prefix, array( 'title' => '区块设置', 'icon' => 'fas fa-th-large', 'fields' => array( array( 'id' => 'Cate', 'type' => 'switcher', 'title' => '右侧分类区块', 'default' => true, 'subtitle'=>'若选择开启,则网站右侧将出现分类区块,显示当前所有分类。' ), array( 'id' => 'LastArticle', 'type' => 'switcher', 'title' => '右侧最近文章区块', 'default' => true, 'subtitle'=>'若选择开启,则网站右侧将出现最近文章区块,显示最近发布的文章,可控制显示的文章数目。' ), array( 'id' => 'ClockModule', 'type' => 'switcher', 'title' => '时光沙漏区块', 'default' => false, 'subtitle'=>'若选择开启,则网站右侧将出现时光沙漏区块,动态显示今年-本月-今天的倒计时。' ), array( 'id' => 'AdControl', 'type' => 'switcher', 'title' => '广告区块', 'default' => false, 'subtitle'=>'若选择开启,则网站将出现广告位置。' ), array( 'id' => 'AdControl_Google', 'type' => 'switcher', 'title' => '启用Google广告联盟', 'default' => false, 'subtitle'=>'下方开启广告区块若填写的是Google广告联盟代码则本项需开启。', 'dependency' => array( 'AdControl', '==', 'true' ), ), array( 'id' => 'AdControl1', 'type' => 'switcher', 'title' => '右侧顶部广告', 'default' => false, 'subtitle'=>'若选择开启,则网站右侧顶部将出现广告位置。', 'dependency' => array( 'AdControl', '==', 'true' ), ), array( 'id' => 'AdControl1_style', 'type' => 'radio', 'title' => '右侧顶部广告类型', 'inline' => true, 'after' => '选择右侧顶部广告类型,图片或代码,若有谷歌广告,可选择代码类型', 'options' => array('1' => '图片', '2' => '代码'), 'default' => '1', 'dependency' => array( 'AdControl|AdControl1', '==|==', 'true|true' ), ), array( 'id' => 'AdControl1Code', 'type' => 'code_editor', 'title' => '右侧顶部广告代码', 'after' =>'若为Google广告代码,需将ins标签所有内容包括ins标签下方的js代码内容全部复制到本栏中,adsbygoogle.js不需要引用', 'dependency' => array( 'AdControl|AdControl1|AdControl1_style', '==|==|==', 'true|true|2' ), ), array( 'id' => 'AdControl1Src', 'type' => 'text', 'title' => '右侧顶部广告图片链接及指向链接', 'subtitle' => '请输入右侧顶部广告图片链接及指向链接,格式:图片链接|指向链接,使用|分隔,有且仅能存在一个', 'dependency' => array( 'AdControl|AdControl1|AdControl1_style', '==|==|==', 'true|true|1' ), ), array( 'id' => 'AdControl2', 'type' => 'switcher', 'title' => '右侧底部广告', 'default' => false, 'subtitle'=>'若选择开启,则网站右侧底部将出现广告位置。', 'dependency' => array( 'AdControl', '==', 'true' ), ), array( 'id' => 'AdControl2_style', 'type' => 'radio', 'title' => '右侧底部广告类型', 'inline' => true, 'after' => '选择右侧底部广告类型,图片或代码,若有谷歌广告,可选择JS代码类型', 'options' => array('1' => '图片', '2' => '代码'), 'default' => '1', 'dependency' => array( 'AdControl|AdControl2', '==|==', 'true|true' ), ), array( 'id' => 'AdControl2Code', 'type' => 'code_editor', 'title' => '右侧底部广告代码', 'after' =>'若为Google广告代码,需将ins标签所有内容包括ins标签下方的js代码内容全部复制到本栏中,adsbygoogle.js不需要引用', 'dependency' => array( 'AdControl|AdControl2|AdControl2_style', '==|==|==', 'true|true|2' ), ), array( 'id' => 'AdControl2Src', 'type' => 'text', 'title' => '右侧底部广告图片链接及指向链接', 'subtitle' => '请输入右侧底部广告图片链接及指向链接,格式:图片链接|指向链接,使用|分隔,有且仅能存在一个', 'dependency' => array( 'AdControl|AdControl2|AdControl2_style', '==|==|==', 'true|true|1' ), ), array( 'id' => 'AdControl3', 'type' => 'switcher', 'title' => '首页顶部广告', 'default' => false, 'subtitle'=>'若选择开启,则网站首页顶部将出现广告位置。', 'dependency' => array( 'AdControl', '==', 'true' ), ), array( 'id' => 'AdControl3_style', 'type' => 'radio', 'title' => '首页顶部广告类型', 'inline' => true, 'after' => '选择首页顶部广告类型,图片或代码,若有谷歌广告,可选择代码类型', 'options' => array('1' => '图片', '2' => '代码'), 'default' => '1', 'dependency' => array( 'AdControl|AdControl3', '==|==', 'true|true' ), ), array( 'id' => 'AdControl3Code', 'type' => 'code_editor', 'title' => '首页顶部广告代码', 'after' =>'若为Google广告代码,需将ins标签所有内容包括ins标签下方的js代码内容全部复制到本栏中,adsbygoogle.js不需要引用', 'dependency' => array( 'AdControl|AdControl3|AdControl3_style', '==|==|==', 'true|true|2' ), ), array( 'id' => 'AdControl3Src', 'type' => 'text', 'title' => '首页顶部广告图片链接及指向链接', 'subtitle' => '请输入首页顶部图片链接及指向链接,格式:图片链接|指向链接,使用|分隔,有且仅能存在一个', 'dependency' => array( 'AdControl|AdControl3|AdControl3_style', '==|==|==', 'true|true|1' ), ), array( 'id' => 'AdControl4', 'type' => 'switcher', 'title' => '分类/搜索/标签/作者文章顶部广告', 'default' => false, 'subtitle'=>'若选择开启,则分类/搜索/标签/作者文章顶部将出现广告位置。', 'dependency' => array( 'AdControl', '==', 'true' ), ), array( 'id' => 'AdControl4_style', 'type' => 'radio', 'title' => '分类/搜索/标签/作者文章顶部广告类型', 'inline' => true, 'after' => '选择首页顶部广告类型,图片或代码,若有谷歌广告,可选择代码类型', 'options' => array('1' => '图片', '2' => '代码'), 'default' => '1', 'dependency' => array( 'AdControl|AdControl4', '==|==', 'true|true' ), ), array( 'id' => 'AdControl4Code', 'type' => 'code_editor', 'title' => '分类/搜索/标签/作者文章顶部广告代码', 'after' =>'若为Google广告代码,需将ins标签所有内容包括ins标签下方的js代码内容全部复制到本栏中,adsbygoogle.js不需要引用', 'dependency' => array( 'AdControl|AdControl4|AdControl4_style', '==|==|==', 'true|true|2' ), ), array( 'id' => 'AdControl4Src', 'type' => 'text', 'title' => '分类/搜索/标签/作者文章顶部广告图片链接及指向链接', 'subtitle' => '请输入分类/搜索/标签/作者文章顶部广告图片链接及指向链接,格式:图片链接|指向链接,使用|分隔,有且仅能存在一个', 'dependency' => array( 'AdControl|AdControl4|AdControl4_style', '==|==|==', 'true|true|1' ), ), array( 'id' => 'Search', 'type' => 'checkbox', 'title' => '搜索区块', 'inline' => true, 'options' => array('sidebar' => '侧边栏', 'phone' => '手机端导航栏上面','header' => 'PC端顶部右侧'), 'subtitle'=>'选择搜索区块要显示的位置,若都不选择则都不显示。' ), array( 'id' => 'Search_Way', 'type' => 'radio', 'title' => '搜索方案', 'inline' => true, 'options' => array( '1' => '简略搜索', '2' => '精确搜索[Beta]', ), 'default' => '1', 'subtitle'=>'简略搜索仅模糊查询关键词,而精确搜索则将关键词进行中英文分词进行查询。', ), array( 'id' => 'lastcomment', 'type' => 'switcher', 'title' => '右侧最新回复区块', 'default' => true, 'subtitle'=>'开启后网站侧边栏将增加最新回复区块,显示最新的五条评论。' ), array( 'id' => 'tagcloud', 'type' => 'switcher', 'title' => '右侧标签云区块', 'default' => true, 'subtitle'=>'开启后网站侧边栏将增加标签云区块,显示添加的文章标签。' ), array( 'id' => 'tagcloudnum', 'type' => 'number', 'title' => '标签云显示的标签个数', 'default'=> '20', 'unit' => '个', 'subtitle' => '限制标签云所显示的标签个数,默认显示20个', 'dependency' => array( 'tagcloud', '==', 'true' ), ), ) ) ); CSF::createSection( $prefix, array( 'title' => '博主信息', 'icon' => 'fas fa-user-tie', 'fields' => array( array( 'id' => 'Authorz', 'type' => 'switcher', 'title' => '右侧博主区块', 'default' => false, 'subtitle'=>'若选择开启,则网站右侧将出现博主一栏。' ), array( 'id' => 'AuthorAvatar', 'type' => 'upload', 'title' => '博主头像图片', 'after' => '请上传博主头像图片', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'AuthorBackground', 'type' => 'upload', 'title' => '博主栏顶部背景图片', 'after' => '请上传博主栏顶部背景图片', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'AuthorName', 'type' => 'text', 'title' => '博主昵称', 'subtitle' => '请填写博主昵称,若为空则不显示', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'AuthorQm', 'type' => 'text', 'title' => '博主个性简介', 'subtitle' => '请填写博主个性简介,若为空则不显示', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'AuthorOneSay', 'type' => 'switcher', 'title' => '个性简介处显示一言', 'default' => false, 'subtitle'=>'若选择开启,则博主栏个性简介将显示一言,不显示所填写的个性简介。
            开启一言后可能会拖慢加载速度,请谨慎开启', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'QQ_QRCODE', 'type' => 'upload', 'title' => 'QQ二维码图片', 'after' => '请上传QQ二维码图片,建议尺寸为300px×300px,若为空则不显示', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'Wechat_QRCODE', 'type' => 'upload', 'title' => '微信二维码图片', 'after' => '请上传微信二维码图片,建议尺寸为300px×300px,若为空则不显示', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'Github_URL', 'type' => 'text', 'title' => 'Github链接', 'subtitle' => '请填写Github链接,若为空则不显示', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'Facebook_URL', 'type' => 'text', 'title' => 'Facebook链接', 'subtitle' => '请填写Facebook链接,若为空则不显示', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'Twitter_URL', 'type' => 'text', 'title' => 'Twitter链接', 'subtitle' => '请填写Twitter链接,若为空则不显示', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'Telegram_URL', 'type' => 'text', 'title' => 'Telegram链接', 'subtitle' => '请填写Telegram链接,若为空则不显示', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'Weibo_URL', 'type' => 'text', 'title' => '微博链接', 'subtitle' => '请填写微博链接,若为空则不显示', 'dependency' => array( 'Authorz', '==', 'true' ), ), array( 'id' => 'FourTotalHidden', 'type' => 'switcher', 'title' => '四项统计', 'default' => false, 'subtitle'=>'若选择开启,则博主信息栏将显示四项统计:文章、评论、分类、页面。', 'dependency' => array( 'Authorz', '==', 'true' ), ), ) ) ); CSF::createSection( $prefix, array( 'title' => '其他设置', 'icon' => 'fas fa-ellipsis-h', 'fields' => array( array( 'id' => 'ServiceWorker', 'type' => 'text', 'title' => 'ServiceWorker规则文件名', 'after' => 'ServiceWorker可为您的博客提供前端静态资源缓存,从而加快访问速度(前提是站点已开启HTTPS)
            您需要在这里填上规则文件名,规则文件在主题目录/vendors/BearSimpleCacheRules.js,将该文件复制一份到您的站点根目录,并在这里填上文件名,如为默认的BearSimpleCacheRules.js,则填BearSimpleCacheRules.js即可。
            不填则表示不开启。', ), array( 'id' => 'CopyProtect', 'type' => 'switcher', 'title' => '防复制', 'default' => false, 'subtitle'=>'若开启防复制,则禁用右键、复制、拖动等。' ), array( 'id' => 'Top', 'type' => 'switcher', 'title' => '返回顶部', 'subtitle' => '若开启,则右侧下方将增加一个返回顶部图标,可自定义', 'default' => false, ), array( 'id' => 'TopSrc', 'type' => 'icon', 'title' => '返回顶部图标', 'after' => '请选择返回顶部图标,若为空则显示默认图标', 'dependency' => array( 'Top', '==', 'true' ), ), array( 'id' => 'Mournmode', 'type' => 'switcher', 'title' => '哀悼模式', 'subtitle'=>'若开启哀悼模式,则网站全部显示灰色。', 'default' => false, ), array( 'id' => 'IframeProtect', 'type' => 'select', 'title' => 'Iframe嵌入', 'after' => '可通过本功能设置防止站点被其他站点通过iframe方式嵌入', 'options' => array('1' => '允许任何网页', '2' => '只允许同域名网页','3'=>'不允许任何网页'), 'default' => '1', ), array( 'id' => 'Link_blank', 'type' => 'select', 'title' => '外链打开方式', 'after' => '选择外链的打开方式,在当前窗口打开还是新窗口打开', 'options' => array('1' => '在当前窗口打开', '2' => '在新窗口打开'), 'default' => '1', ), array( 'id' => 'Read_Process', 'type' => 'switcher', 'title' => '阅读进度条', 'subtitle' => '选择开启则前台页面滚动时顶部显示阅读进度条', 'default' => false, ), array( 'id' => 'safeRedirection', 'type' => 'switcher', 'title' => '免责声明', 'subtitle' => '选择开启则当访客从外站访问本站页面时将显示免责声明
            免责声明Demo请戳这里', 'default' => false, ), array( 'id' => 'safeRedirectionNonList', 'type' => 'textarea', 'title' => '免责声明白名单', 'after' => '可以在这里填写白名单域名,从白名单域名访问到本站点都将不显示免责声明页面
            多个域名直接换行即可', 'dependency' => array( 'safeRedirection', '==', 'true' ), ), array( 'type' => 'heading', 'content' => '操作面板控制中心', ), array( 'type' => 'subheading', 'content' => '操作面板指的是在前台右下角增加一个能够让访客自主控制的面板,可以设置切换语言、黑暗模式等。', ), array( 'id' => 'Control_Panel', 'type' => 'switcher', 'title' => '是否开启操作面板', 'subtitle' => '选择开启则前台页面右下角显示操作面板,可从下方选择开启一些利于访客阅读的功能', 'default' => false, ), array( 'id' => 'Translate', 'type' => 'select', 'title' => '语言切换', 'after' => '选择语言切换类型,可选择开启简繁体切换或者全球几十种语言切换', 'options' => array('1' => '开启简繁体切换','11'=>'开启全球语言切换','2' => '否'), 'default' => '2', 'dependency' => array( 'Control_Panel', '==', 'true' ), ), array( 'id' => 'TranslateLanguage', 'type' => 'select', 'title' => '选择优先显示语言', 'after' => '访客访问时优先使用的语言', 'options' => array('1' => '简体中文', '2' => '繁体中文'), 'default' => '1', 'dependency' => array( 'Control_Panel|Translate', '==|==', 'true|1' ), ), array( 'id' => 'WorldLanguage', 'type' => 'checkbox', 'title' => '选择要显示的语言', 'inline' => true, 'default' => '1', 'options' => array('chinese_traditional' => '繁体中文', 'german' => '德语', 'corsican' => '科西嘉语', 'guarani' => '瓜拉尼语', 'kinyarwanda' => '卢旺达语', 'hausa' => '豪萨语', 'norwegian' => '挪威语', 'dutch' => '荷兰语', 'yoruba' => '约鲁巴语', 'english' => '英语', 'gongen' => '基刚果语', 'latin' => '拉丁语', 'nepali' => '尼泊尔语', 'french' => '法语', 'czech' => '捷克语', 'hawaiian' => '夏威夷语', 'georgian' => '格鲁吉亚语', 'russian' => '俄语', 'persian' => '波斯语', 'bhojpuri' => '波杰普里语', 'hindi' => '印度语', 'belarusian' => '白俄罗斯语', 'swahili' => '斯瓦希里语', 'icelandic' => '冰岛语', 'yiddish' => '意第绪语', 'twi' => '契维语', 'irish' => '马来语', 'gujarati' => '古吉拉特语', 'khmer' => '高棉语', 'slovak' => '斯洛伐克语', 'hebrew' => '希伯来语', 'kannada' => '卡纳达语', 'hungarian' => '匈牙利语', 'tamil' => '泰米尔语', 'arabic' => '阿拉伯语', 'bengali' => '孟加拉语', 'azerbaijani' => '孟加拉语', 'samoan' => '萨摩亚语', 'afrikaans' => '南非荷兰语', 'indonesian' => '印度尼西亚语', 'danish' => '丹麦语', 'shona' => '日耳曼语', 'bambara' => '班巴拉语', 'lithuanian' => '立陶宛语', 'vietnamese' => '越南语', 'maltese' => '马耳他语', 'turkmen' => '土库曼语', 'assamese' => '阿萨姆语', 'catalan' => '加泰罗尼亚语', 'singapore' => '新加坡语', 'cebuano' => '宿务语', 'scottish-gaelic' => '苏格兰盖尔语', 'sanskrit' => '梵语', 'polish' => '波兰语', 'galician' => '加利西亚语', 'latvian' => '拉脱维亚语', 'ukrainian' => '乌克兰语', 'tatar' => '鞑靼语','welsh' => '威尔士语', 'japanese' => '日语', 'filipino' => '菲律宾语', 'aymara' => '艾马拉语', 'lao' => '老挝语', 'telugu' => '泰卢固语', 'romanian' => '罗马尼亚语', 'haitian_creole' => '海地语', 'dogrid' => '都归语', 'swedish' => '瑞典语', 'maithili' => '迈蒂利', 'thai' => '泰语', 'armenian' => '亚美尼亚语', 'burmese' => '缅甸语', 'pashto' => '普什图语', 'hmong' => '赫蒙语', 'dhivehi' => '迪维希语', 'luxembourgish' => '卢森堡语', 'sindhi' => '信德语', 'kurdish' => '库尔德语', 'turkish' => '土耳其语', 'macedonian' => '马其顿语', 'bulgarian' => '保加利亚语', 'malay' => '马来语', 'luganda' => '卢干达语', 'marathi' => '马拉地语', 'estonian' => '爱沙尼亚语', 'malayalam' => '马拉雅拉姆语', 'slovene' => '斯洛文尼亚语', 'urdu' => '乌尔都语', 'portuguese' => '葡萄牙语', 'igbo' => '伊博语', 'kurdish_sorani' => '库尔德语', 'oromo' => '奥罗莫语', 'greek' => '希腊语', 'spanish' => '西班牙语', 'frisian' => '弗里斯兰语', 'somali' => '索马里语', 'amharic' => '阿姆哈拉语', 'nyanja' => '尼扬贾语', 'punjabi' => '旁遮普语', 'basque' => '巴斯克语', 'italian' => '意大利语', 'albanian' => '阿尔巴尼亚语', 'korean' => '韩语', 'tajik' => '塔吉克语', 'finnish' => '芬兰语', 'kyrgyz' => '吉尔吉斯语', 'ewe' => '尔未屙语', 'croatian' => '克罗地亚语', 'creole' => '克里奥尔语', 'quechua' => '奎丘亚语', 'bosnian' => '波斯尼亚语', 'maori' => '毛利语'), 'subtitle'=>'支持选择前台显示支持翻译的语言,简体中文作为默认语言所以不在其中
            要注意的一点是有很多语言对中文的翻译是不友好的,有的甚至翻译不出来,从而导致翻译后页面出现错位等问题,所以请谨慎选择', 'dependency' => array( 'Control_Panel|Translate', '==|==', 'true|11' ), ), array( 'id' => 'Darkmode', 'type' => 'switcher', 'title' => '黑暗模式', 'default' => false, 'subtitle'=>'开启后可提供黑暗模式提升访客在夜间阅读时的体验。', 'dependency' => array( 'Control_Panel', '==', 'true' ), ), array( 'id' => 'Darkmode_type', 'type' => 'checkbox', 'title' => '黑暗模式切换可选项', 'inline' => true, 'options' => array('1' => '根据白天夜晚时间段自动切换', '2' => '跟随系统'), 'subtitle'=>'默认支持手动切换黑暗模式,可勾选可选项对黑暗模式进行加强。', 'dependency' => array( 'Control_Panel|Darkmode', '==|==', 'true|true' ), ), array( 'type' => 'heading', 'content' => '全局自定义提示设置', ), array( 'type' => 'subheading', 'content' => '自定义提示指的是在一些操作或文章中所触发显示的提示,如文章内容回复可见时显示的内容、评论成功时显示的提示内容等。', ), array( 'id' => 'globalTips', 'type' => 'tabbed', 'title' => '', 'tabs' => array( array( 'title' => '文章相关', 'fields' => array( array( 'id' => 'articleHideAfterComment_Tip', 'type' => 'text', 'title' => '文章内容回复可见时的提示内容', 'after' => '填写文章内容回复可见时的提示内容。', ), array( 'id' => 'articleHideAfterLogin_Tip', 'type' => 'text', 'title' => '文章内容登录可见时的提示内容', 'after' => '填写文章内容登录可见时的提示内容。', ), array( 'id' => 'articlePwdAfterEnter_Tip', 'type' => 'text', 'title' => '文章加密时输入框下的提示内容', 'after' => '填写文章加密时输入框下的提示内容。', ), array( 'id' => 'articlePwdAfterEnterSuccess_Tip', 'type' => 'text', 'title' => '文章密码验证成功的提示内容', 'after' => '填写文章密码验证成功的提示内容(已默认三秒刷新页面)。', ), array( 'id' => 'articlePwdAfterEnterFail_Tip', 'type' => 'text', 'title' => '文章密码验证失败的提示内容', 'after' => '填写文章密码验证失败的提示内容。', ), array( 'id' => 'articlePwdAfterEnterReadMode_Tip', 'type' => 'text', 'title' => '文章密码未验证即进入阅读模式的提示内容', 'after' => '密码文章在没有验证成功密码就点击阅读模式会提示无法进入
            这里可以填写文章密码未验证即进入阅读模式的提示内容。', ), array( 'id' => 'articleAgreeSuccess_Tip', 'type' => 'text', 'title' => '文章点赞成功的提示内容', 'after' => '填写文章点赞成功的提示内容。', ), array( 'id' => 'articleAgreeFail1_Tip', 'type' => 'text', 'title' => '文章点赞失败的提示内容(重复点赞)', 'after' => '填写文章点赞失败(重复点赞)的提示内容。', ), array( 'id' => 'articleAgreeFail2_Tip', 'type' => 'text', 'title' => '文章点赞失败的提示内容(网络问题)', 'after' => '填写文章点赞失败(网络问题)的提示内容。', ), ), ), array( 'title' => '评论相关', 'fields' => array( array( 'id' => 'commentSuccess_Tip', 'type' => 'text', 'title' => '评论成功时的提示内容', 'after' => '填写评论成功时的提示内容。', ), array( 'id' => 'commentFail_Tip', 'type' => 'text', 'title' => '评论失败时的提示内容', 'after' => '填写评论失败时的提示内容。', ), array( 'id' => 'commentAgreeSuccess_Tip', 'type' => 'text', 'title' => '评论点赞成功时的提示内容', 'after' => '填写评论成功时的提示内容。', ), array( 'id' => 'commentAgreeFail1_Tip', 'type' => 'text', 'title' => '评论点赞失败[重复点赞]时的提示内容', 'after' => '填写评论点赞失败[重复点赞]时的提示内容。', ), array( 'id' => 'commentAgreeFail2_Tip', 'type' => 'text', 'title' => '评论点赞失败[网络问题]时的提示内容', 'after' => '填写评论点赞失败[网络问题]时的提示内容。', ), ), ), ), ), ) ) ); $template_files = scandir(dirname(__FILE__) . '/modules/GoLinks/templates'); $goTemplates = array('NULL' => '禁用'); foreach ($template_files as $item) { if (PATH_SEPARATOR !== ':') { $item = mb_convert_encoding($item, "UTF-8", "GBK"); } $name = mb_split("\.", $item)[0]; if (empty($name)) { continue; } $goTemplates[$name] = $name; } if($Tyoptions->openId !== NULL){ $openStatus = '已绑定'; } else{ $openStatus = '未绑定'; } $fixButton = ''; if ("Pdo_Mysql" === $adapter || "Mysql" === $adapter || "Mysqli" === $adapter) { $fixButton = '
            若使用微信公众号的朋友圈模式无法正常发表朋友圈,可尝试
            修复数据表
            '; } CSF::createSection( $prefix, array( 'title' => '实验室', 'icon' => 'fas fa-flask', 'fields' => array( array( 'type' => 'heading', 'content' => '外链转内链[Beta]', ), array( 'type' => 'subheading', 'content' => '外链转内链功能可以将站点中的外部链接转化为内链进行访问。', ), array( 'id' => 'goLinkOpen', 'type' => 'switcher', 'title' => '文章内容外链转内链', 'subtitle' => '选择开启则将自动将文章内容中的外链转换为内链,并支持跳转页面
            开启本功能请关闭所有正在使用的外链转内链插件!!否则会出现冲突报错情况', 'default' => false, ), array( 'id' => 'goLinkThemes', 'type' => 'select', 'title' => '跳转页面模板', 'after' => '选择跳转页面模板,theme1-theme5为3秒后跳转,theme6为点击跳转', 'options' => $goTemplates, 'default' => 'NULL', 'dependency' => array( 'goLinkOpen', '==', 'true' ), ), array( 'id' => 'goLinkNewWindow', 'type' => 'switcher', 'title' => '外链转内链使用新窗口打开', 'subtitle' => '选择开启则将所有转换的内链使用新窗口打开', 'default' => false, 'dependency' => array( 'goLinkOpen', '==', 'true' ), ), array( 'id' => 'goLinkNonConvertList', 'type' => 'textarea', 'title' => '转换白名单', 'after' => '可以在这里填写不转换为内链的白名单,要注意的是除了白名单内的链接外,本站域名也是排除在外,不参与外链转换~~
            多个域名直接换行即可', 'dependency' => array( 'goLinkOpen', '==', 'true' ), ), array( 'id' => 'goLinkList', 'type' => 'textarea', 'title' => '自定义跳转链接', 'after' => '可以在这里填写自定义跳转链接,需要填写的格式为:key|网站链接,key不可重复。一个链接一个key,多个请直接换行
            举个栗子,当您填写的是baidu|https://www.baidu.com/的时候,您可以通过
            未开启伪静态:您的网址/index.php/go/baidu
            已开启伪静态:您的网址/go/baidu 来访问。', 'default'=>'baidu|https://www.baidu.com/', 'dependency' => array( 'goLinkOpen', '==', 'true' ), ), array( 'type' => 'heading', 'content' => '智慧AI服务[Beta]', ), array( 'type' => 'subheading', 'content' => '智慧AI功能可为您的每一篇文章生成AI摘要等,请在下方填入您的信息。', ), array( 'id' => 'AIService', 'type' => 'switcher', 'title' => '是否开启智慧AI服务', 'subtitle' => '选择开启则请完整配置选项,智慧AI服务由TianliGPT提供', 'default' => false, ), array( 'id' => 'AIService_Key', 'type' => 'text', 'title' => '智慧AI密钥', 'after' => '本服务由TianliGPT提供,开启智慧AI服务需填写TianliGPT KEY,若还没有KEY,可 戳这里 传送购买。', 'dependency' => array( 'AIService', '==', 'true' ), ), array( 'id' => 'AIService_Name', 'type' => 'text', 'title' => '智慧AI名称', 'after' => '给您的智慧AI起个名吧。', 'dependency' => array( 'AIService', '==', 'true' ), ), array( 'id' => 'AIService_Introduce', 'type' => 'text', 'title' => '智慧AI自我介绍', 'after' => '给您的智慧AI拟一个自我介绍吧。', 'dependency' => array( 'AIService', '==', 'true' ), ), array( 'id' => 'AIService_Version', 'type' => 'text', 'title' => '智慧AI版本号', 'after' => '给您的智慧AI写一个版本号或标识,它将显示在AI框的右上角。', 'dependency' => array( 'AIService', '==', 'true' ), ), array( 'id' => 'AIService_Auto', 'type' => 'switcher', 'title' => '自动生成摘要', 'after' => '

            选择开启则将在打开文章页面后自动生成摘要,若不开启则只显示智慧AI的自我介绍', 'default' => false, 'dependency' => array( 'AIService', '==', 'true' ), ), array( 'id' => 'AIService_Blacklist', 'type' => 'select', 'title' => '不显示AI摘要的文章', 'chosen' => true, 'multiple' => true, 'sortable' => true, 'ajax' => true, 'options' => 'posts', 'placeholder' => '选择不显示AI摘要的文章', 'dependency' => array( 'AIService', '==', 'true' ), ), array( 'id' => 'AIService_Blacklist_Page', 'type' => 'select', 'title' => '不显示AI摘要的独立页面', 'chosen' => true, 'multiple' => true, 'sortable' => true, 'ajax' => true, 'options' => 'pages', 'placeholder' => '选择不显示AI摘要的独立页面', 'dependency' => array( 'AIService', '==', 'true' ), ), array( 'type' => 'heading', 'content' => '微信公众号服务[Beta]', ), array( 'type' => 'subheading', 'content' => '微信公众号服务为您的微语时光机、朋友圈模块的消息发布提供另外的形式,您可以使用自己的微信公众号来发送消息,它将自动把消息发布到您的时光机/朋友圈。
            操作说明:填写好以下信息且配置好微信公众号平台后在公众号发送绑定即可完成绑定,绑定成功后在公众号发送内容都会直接发送到微语/朋友圈页面
            当前为实验室测试阶段,仅限于指定一个微语时光机/朋友圈页面进行操作,若有问题请及时反馈
            当前状态:'.$openStatus.',OpenID:'.$Tyoptions->openId.$fixButton, ), array( 'type' => 'notice', 'style' => 'info', 'content' => '

            服务使用说明

          14. 1、当前支持发送内容至微语或朋友圈,但需注意的是请选择好下方要发送内容的页面!
          15. 2、朋友圈:若选择的是朋友圈页面,发送“发朋友圈”四个字即可开启朋友圈模式,朋友圈模式中可发送图片、语音和视频内容,媒体文件缓存临时目录:/usr/uploads/wechatServer/,该目录中的图片可以直接删除,不会造成任何影响~
          16. 3、微语:发送除了指定关键字外的任意文字都将发送到选择的微语页面
          17. 4、发送微语的方法与朋友圈是互通的,也就是说没有开启朋友圈模式下发送除了指定关键字外的任意文字也可以发送到朋友圈
          18. 5、最重要的一点:需将/usr/themes/bearsimple/vendors目录中的Upload.php放至/var/Widget目录直接覆盖原有文件,不然朋友圈模式的媒体资源无法正常上传到博客这里,切记!!!
          19. ', ), array( 'id' => 'wechat_service', 'type' => 'switcher', 'title' => '是否开启微信公众号服务', 'subtitle' => '选择开启则请完整配置选项,否则可能无法正常使用!', 'default' => false, ), array( 'id' => 'wechat_choose', 'type' => 'select', 'title' => '选择微语/朋友圈页面', 'placeholder' => '选择一个微语/朋友圈页面', 'options' => 'pages', 'dependency' => array( 'wechat_service', '==', 'true' ), ), array( 'id' => 'wechat_circleSendText', 'type' => 'text', 'title' => '发朋友圈快捷命令', 'after' => '仅上方选择的页面为朋友圈时有效
            请填写发朋友圈快捷命令,即开启朋友圈模式的快捷命令,若不填则为发送“发朋友圈”四个字开启朋友圈模式!', 'dependency' => array( 'wechat_service', '==', 'true' ), ), array( 'id' => 'wechat_appid', 'type' => 'text', 'title' => '微信公众号appID', 'after' => '请填写微信公众号appID', 'dependency' => array( 'wechat_service', '==', 'true' ), ), array( 'id' => 'wechat_appsecret', 'type' => 'text', 'title' => '微信公众号appSecret', 'after' => '请填写微信公众号appSecret', 'dependency' => array( 'wechat_service', '==', 'true' ), ), array( 'id' => 'wechat_aeskey', 'type' => 'text', 'title' => '微信公众号aesKey', 'after' => '当为安全模式时本项必填!!!
            请填写微信公众号aesKey,一般为微信平台上随机生成或自编', 'dependency' => array( 'wechat_service', '==', 'true' ), ), array( 'id' => 'wechat_verifyToken', 'type' => 'text', 'title' => '微信公众号验证Token', 'after' => '请填写微信公众号验证Token,自己编一个即可,要和微信公众号平台上输入的接口Token一致!
            接口URL:'.Helper::options()->siteUrl.'index.php/wechatServer', 'dependency' => array( 'wechat_service', '==', 'true' ), ), ) ) ); CSF::createSection( $prefix, array( 'title' => '短代码', 'icon' => 'fas fa-code', 'fields' => array( array( 'type' => 'heading', 'content' => '短代码', ), array( 'type' => 'subheading', 'content' => '本主题支持的短代码均会显示在这里,方便大家使用', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '1、登录或回复后可见
            [bshide}隐藏内容[/bshide]', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '2、仅登录后可见
            [bslogin}隐藏内容[/bslogin]', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '3、Todolist
            已完成:[todo-t]已完成的内容[/todo-t]
            未完成:[todo-f]未完成的内容[/todo-f]', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '4、代码高亮
            ```语言名称
            代码内容
            ```', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '5、字体颜色
            {bs-font color="Hex颜色代码"}内容{/bs-font}
            Hex颜色代码例如#FFFFFF', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '6、iframe
            {bs-iframe}iframe地址{/bs-iframe}
            iframe地址举个简单的例子,如B站的分享视频代码,
            <iframe src="xxxxxxxx" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> 只要xxxxxxxx这一部分就行,也就是src里边这一串链接,这个就是iframe地址', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '7、音频
            [bsaudio]音频地址[/bsaudio]
            音频地址必须直链', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '8、手风琴
            线性手风琴
            {bs-accord style=line title=线性手风琴标题}线性手风琴内容{/bs-accord}
            普通手风琴
            {bs-accord style=common title=普通手风琴标题}普通手风琴内容{/bs-accord}', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '9、Github仓库
            [bsgit user="仓库创建者,如whitebearcode"]仓库名,如typecho-bearsimple[/bsgit]', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '10、引用文章
            [bspost cid="文章CID"]
            您可以在文章中引用另外一篇文章', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '11、标记文字
            [bsmark]要标记的文字[/bsmark]
            您可以在文章中对一些重点内容进行标记,前台会显示划线效果', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '12、文字带拼音
            [bsruby]要带拼音的文字[/bsruby]
            您可以在文章中对一些文字附带拼音,前台会在要带拼音的文字上方显示拼音以及声调', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '13、按钮
            [bsbtn type="按钮类型" color="颜色" url="点击按钮跳转的网址" icon="图标名"]按钮名[/bsbtn]
            您可以在文章中添加按钮,按钮可设置跳转链接
            按钮参数:
            type:common、basic、animated
            color:standard、primary、secondary、red、orange、yellow、olive、green、teal、violet、purple、pink、brown、grey
            url:点击按钮跳转的网址,需带http(s)://,如https://www.baidu.com/
            icon:图标名,参考戳这里访问Bearsimple主题适配图标站
            注:当为动画图标时按钮名需设置两个,一个是鼠标未点击按钮时显示的文字,一个是鼠标点击按钮时显示的文字,两个按钮名使用|隔开', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '14、提示框
            [bsmessage type="提示框类型" color="提示框颜色" title="提示框标题" icon="提示框图标"]提示框内容[/bsmessage]
            您可以在文章中添加提示框
            提示框参数:
            type:common、basic、commonclose、basicclose
            color:standard、primary、secondary、red、orange、yellow、olive、green、teal、violet、purple、pink、brown、grey
            title:提示框标题
            icon:图标名,参考戳这里访问Bearsimple主题适配图标站
            注:阴影效果受到提示框颜色影响,有些颜色显示不出来阴影效果', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '15、评星
            [bseva type="star或者heart"]评星颗数[/bseva]
            您可以在文章中对一些事物进行评星', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '16、相册
            [bsgallery title="相册名"]
            [bsimg title="图片标题1"]图片地址1[/bsimg]
            [bsimg title="图片标题2"]图片地址2[/bsimg]
            [bsimg title="图片标题3"]图片地址3[/bsimg]
            [/bsgallery]
            您可以在文章中通过该短代码将多张图片集成一个相册,建议图片数量不少于四张', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '17、每日60s早报
            [bspaper image="true"]
            您可以在文章中通过该短代码调取每日60s早报文字版所有内容当做文章内容来显示
            参数:image,填写true或者false,选择是否显示60秒早报的头图,填true为显示,false或其他都为不显示', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '18、Mermaid
            ```mermaid
            Mermaid流程图内容
            ```
            您可以在文章中通过该短代码转换mermaid流程图', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '19、时间计划
            [bstimes title="时间计划名"]
            [bstime time="计划时间1"]计划内容1[/bstime]
            [bstime time="计划时间2"]计划内容2[/bstime]
            [bstime time="计划时间3"]计划内容3[/bstime]
            [/bstimes]
            您可以在文章中通过该短代码制作一个时间计划,对每日的时间进行规划', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '20、倒计时进度条
            [bsdate end="结束时间,如2022-12-12 23:12:55,年-月-日 时:分:秒,请精确到秒"]倒计时进度条标题[/bsdate]
            您可以在文章中通过该短代码制作一个倒计时进度条,可以给自己设定一个时间计划,到达结束时间后看看自己做到了没~', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '21、bframe
            [bsfra image="占位封面图直链" url="页面地址"]
            占位封面图直链为进入文章后还没进行交互操作时显示的占位封面图,要求必须直链,若不填会显示默认图片
            页面地址举个简单的例子,如B站的分享视频代码,
            <iframe src="xxxxxxxx" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> 只要xxxxxxxx这一部分就行,也就是src里边这一串链接,这个就是页面地址', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '22、点击复制文字内容
            [bscopy text="点击所复制的内容文字"]显示的内容文字[/bscopy]
            可以通过该短代码设置一段可以直接复制的内容
            text参数里边即为要点击复制的内容,仅允许全文字,禁止HTML或其他代码标签,这些标签均会被过滤掉', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '23、音乐歌单
            [bsmusic]歌单ID[/bsmusic]
            可以通过该短代码添加一个歌单列表到您的文章中,目前支持调用网易云音乐,歌单ID请填写网易云音乐的歌单ID', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '24、思维导图
            ```mermaid
            mindmap
            思维导图内容
            ```
            您可以在文章中通过该短代码转换思维导图,注意:思维导图需开启Mermaid美人鱼才可使用', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '25、标签
            [bstag]标签名[/bstag]
            您可以在文章中通过该短代码快速链接至标签文章列表
            该短代码可自动判断站点中是否存在该标签,若有则显示链接,若无将直接显示文字', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '26、插入视频
            [bsplayer url="视频文件地址" image="视频封面图地址"]
            您可以在文章中通过该短代码插入视频', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '27、插入MP3音频文件
            单个音频使用
            [bsmp3 url="音频文件地址" singer="歌手" name="歌曲名" image="歌曲封面图地址"]
            多个音频使用
            [bsmp3]
            [mp3 url="音频文件地址" singer="歌手" name="歌曲名" image="歌曲封面图地址"]
            [mp3 url="音频文件地址" singer="歌手" name="歌曲名" image="歌曲封面图地址"]
            [/bsmp3]
            您可以在文章中通过该短代码插入MP3音频文件', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '28、标签卡
            [bstabs]
            [bstab name="标签1" active="true"]第一个标签卡的内容 [/bstab]
            [bstab name="标签2"]第二个标签卡的内容 [/bstab]
            [/bstabs]
            您可以在文章中通过该短代码插入标签卡
            参数:name是标签卡标题,active是哪个标签卡要优先展示,只允许一个标签卡使用active="true"', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '29、插入文字显隐
            [bsopc]要显隐的文字内容[/bsopc]
            您可以在文章中通过该短代码插入要显隐的文字内容,只有当鼠标放在文字上时才会显示内容', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '30、插入文字提示
            [bstip text="悬浮提示文字内容"]显示的文字内容[/bstip]
            您可以在文章中通过该短代码插入点击某些文字时要提示的文字内容,当访客点击文字后会在文字顶部会显示悬浮提示', ), array( 'type' => 'notice', 'style' => 'info', 'content' => '31、插入KBD
            [bskbd style="dark"]KBD键,如CTRL[/bskbd]
            您可以在文章中添加KBD键
            参数:
            style:dark、gray、white', ), ) ) ); CSF::createSection( $prefix, array( 'title' => '数据备份', 'icon' => 'fas fa-cloud-download-alt', 'description' => '本主题支持您通过以下功能对您所填写的配置信息进行备份导出,也可以对备份的数据进行导入。', 'fields' => array( array( 'type' => 'backup', ), ) ) ); ?> window.ifcache = "'.$ifcache.'";
            检测
            升级
            完成
            您可以通过点击以下按钮进行检测是否符合在线升级的条件
            检测版本
            '; CSF::createSection( $prefix, array( 'title' => '在线升级', 'icon' => 'fa fa-cloud-upload-alt', 'fields' => array( array( 'type' => 'notice', 'style' => 'info', 'content' => '注意事项

            • 1、若您有开启缓存功能,那么在升级完成后都请关闭一次缓存功能提交保存后再启用。
            • 2、若出现在线升级卡顿无法升级,可能是您的服务器网络到升级节点之间存在异常,则需要手动覆盖升级或者稍等一会再试试。
            • 3、若升级完毕后出现报错,可尝试通过手动覆盖新版本来进行修复,下载地址:戳这里

            ', ), array( 'type' =>'content', 'content' => $htmls, ), ) ) ); } function themeConfig($form) { ?> to($security);?>

            检测到您未安装BsCore插件,主题尚处于封印状态,您需要安装启用BsCore核心插件后方能解除封印QAQ!
            若您还未下载核心插件,可戳这里进行下载并将核心插件放入/usr/plugins,当下方出现解除封印按钮时点击按钮后即可解除封印~~~ pluginDir('BsCore'))):?>

            [ 'framework_title' => 'Bearsimple v'.themeVersionOnly(), 'footer_text' => '自豪的使用BearSimple主题!', ] ]; ?> ================================================ FILE: github.php ================================================ need('compoment/head.php');?>

            title() ?>


            need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: index.php ================================================ 建议使用PHP8.2,低于PHP8可能会出现报错
            已适配Typecho v1.3,若有兼容性问题请及时反馈~
            * @package BearSimple * @author BearNotion * @version v2.9.9-release * @link https://www.bearnotion.ru/ * */ if (!defined('__TYPECHO_ROOT_DIR__')) exit; $this->need('compoment/head.php'); ?> need('pages/index-z.php'); ?> need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: links.php ================================================ need('compoment/head.php');?>

            title() ?>



            hidden): ?> need('comments.php'); ?>

            评论区已被封印~

            need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: links_new.php ================================================ need('compoment/head.php');?>

            title() ?>

            • target="_blank" rel="noopener noreferrer"> src="data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+" data-src="" alt="" loading="lazy">
            target="_blank">

            src="data:image/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+" data-src="" loading="lazy">
            友链名称 失效原因
            content,$this,$this->user->hasLogin(),$this->fields->ArticleType)); ?>
            required>
            提交
            提交
            提交
            need('modules/Verify/BearCaptcha/Vaptcha/Vaptcha_Link.php'); ?>
            提交
            need('modules/Verify/BearCaptcha/Dingxiang/DX_Captcha_Link.php'); ?>
            提交
            need('modules/Verify/BearCaptcha/Turnstile/Turnstile_Link.php'); ?>
            提交
            need('modules/Verify/BearCaptcha/Geetest/Geetest_Link.php'); ?>
            提交

            提交

            need('modules/Verify/BearCaptcha/Captcha/Captcha_Link.php'); ?>
            提交
            need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: memos.php ================================================ need('compoment/head.php');?>

            title() ?>

            need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: messages.php ================================================ need('compoment/head.php');?>

            title() ?>

            content,$this,$this->user->hasLogin(),$this->fields->ArticleType)); ?> $this->hidden ? 0 : $this->cid, 'parentContent' => $this->row, 'respondId' => $this->respondId, 'commentPage' => $this->request->filter('int')->commentPage, 'allowComment' => $this->allow('comment') ); $this->widget('BearSimple_Widget_Comments_Archive',$parameter)->to($comments); ?>

            $reader):?>
            <?php echo $reader['author'];?>的头像
            条评论

            have()): ?> listComments(); $comments_content = ob_get_contents(); ob_end_clean(); $comments_content = preg_replace("/
              /sm", '', $comments_content); $comments_content = preg_replace("/<\/ol>/sm", '', $comments_content); echo $comments_content; ?> pageNav('«','»', 1, ''); $content = ob_get_contents(); ob_end_clean(); if(Bsoptions('pagination_style')== '2'){ $content = preg_replace("/
                /sm", '', $content); } if(empty(Bsoptions('pagination_style ')) || Bsoptions('pagination_style') == '1'){ $content = preg_replace("/
                  /sm", '
                  ', $content); $content = preg_replace("/
                1. (.*?)<\/span><\/li>/sm", '...', $content); $content = preg_replace("/
                2. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
                3. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
                4. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
                5. (.*?)<\/a><\/li>/sm", '下一页', $content); //旧版本兼容 $content = preg_replace("/
                6. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
                7. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
                8. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
                9. (.*?)<\/a><\/li>/sm", '下一页', $content); $content = preg_replace("/<\/ol>/sm", '
                10. ', $content); } echo $content; ?>
            allow('comment') && Bsoptions('CommentClose') == true): ?>
            cancelReply(); ?>

            commentsRequireMail == true || Bsoptions('Comment_showmail') == false):?>
            commentsRequireMail == true):?>required>
            commentsRequireMail == false && Bsoptions('Comment_showmail') == true):?> commentsRequireURL == true || Bsoptions('Comment_showurl') == false):?>
            commentsRequireURL == true):?>required>
            commentsRequireURL == false && Bsoptions('Comment_showurl') == true):?>
            need('modules/Verify/BearCaptcha/Vaptcha/Vaptcha.php'); ?>
            need('modules/Verify/BearCaptcha/Dingxiang/DX_Captcha.php'); ?>
            need('modules/Verify/BearCaptcha/Turnstile/Turnstile.php'); ?>
            need('modules/Verify/BearCaptcha/Geetest/Geetest.php'); ?>

            need('modules/Verify/BearCaptcha/Captcha/Captcha.php'); ?>

            啊哦,评论功能已关闭~

            have()): ?>
            listComments(); $comments_content = ob_get_contents(); ob_end_clean(); $comments_content = preg_replace("/
              /sm", '', $comments_content); $comments_content = preg_replace("/<\/ol>/sm", '', $comments_content); echo $comments_content; ?> pageNav('«','»', 1, ''); $content = ob_get_contents(); ob_end_clean(); if(Bsoptions('pagination_style')== '2'){ $content = preg_replace("/
                /sm", '', $content); } if(empty(Bsoptions('pagination_style ')) || Bsoptions('pagination_style') == '1'){ $content = preg_replace("/
                  /sm", '
                  ', $content); $content = preg_replace("/
                1. (.*?)<\/span><\/li>/sm", '...', $content); $content = preg_replace("/
                2. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
                3. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
                4. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
                5. (.*?)<\/a><\/li>/sm", '下一页', $content); //旧版本兼容 $content = preg_replace("/
                6. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
                7. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
                8. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
                9. (.*?)<\/a><\/li>/sm", '下一页', $content); $content = preg_replace("/<\/ol>/sm", '
                10. ', $content); } echo $content; ?>
            need('thirdparty_comments.php'); ?>
            need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: modules/GoLinks/templates/theme1.html ================================================ 页面加载中,请稍候...

            页面加载中...

            ================================================ FILE: modules/GoLinks/templates/theme2.html ================================================ 页面加载中,请稍候...
            ================================================ FILE: modules/GoLinks/templates/theme3.html ================================================ 页面加载中,请稍候...
            L
            O
            A
            D
            I
            N
            G
            ================================================ FILE: modules/GoLinks/templates/theme4.html ================================================ 页面加载中,请稍候...
            LOADING
            ================================================ FILE: modules/GoLinks/templates/theme5.html ================================================ 页面加载中,请稍候...
            ================================================ FILE: modules/GoLinks/templates/theme6.html ================================================ {{title}} - 跳转提示
            您将要访问
            {{url}}
            温馨提示:
            该网页不属于"{{title}}",我们无法确认该网页是否安全,它可能包含未知的安全隐患,请注意保护好个人信息!
            ================================================ FILE: modules/SiteMap/sitemap.php ================================================ fetchAll( $db->select()->from('table.contents') ->where('table.contents.status = ?', 'publish') ->where('table.contents.created < ?', $options->gmtTime) ->where('table.contents.type = ?', 'page') ->limit($limit) ->order('table.contents.created', Typecho_Db::SORT_DESC) ); $articles = $db->fetchAll( $db->select()->from('table.contents') ->where('table.contents.status = ?', 'publish') ->where('table.contents.created < ?', $options->gmtTime) ->where('table.contents.type = ?', 'post') ->limit($limit) ->order('table.contents.created', Typecho_Db::SORT_DESC) ); ob_clean(); echo "\n"; echo "\n"; foreach ($pages as $page) { $tpage = Typecho_Widget::widget('Widget_Abstract_Contents')->push($page); echo "\t\n"; echo "\t\t" . $tpage['permalink'] . "\n"; echo "\t\t" . date('Y-m-d\TH:i:s\Z', $page['modified']) . "\n"; echo "\t\tmonthly\n"; echo "\t\t0.8\n"; echo "\t\n"; } foreach ($articles as $article) { $tpost = Typecho_Widget::widget('Widget_Abstract_Contents')->push($article); echo "\t\n"; echo "\t\t" . $tpost['permalink'] . "\n"; echo "\t\t" . date('Y-m-d\TH:i:s\Z', $article['modified']) . "\n"; echo "\t\tmonthly\n"; echo "\t\t0.5\n"; echo "\t\n"; } echo ""; exit; ================================================ FILE: modules/Upgrade/Upgrade.php ================================================ to($user); if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, "", $options->siteUrl)) !== false && $user->hasLogin()) { $action = @$_GET['action']; function convert($size) { $unit=array('b','kb','mb','gb','tb','pb'); return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i]; } function is_dir_writable($dir) { if (!is_dir($dir)) { return false; } if (!is_readable($dir) || !is_writable($dir)) { return false; } return true; } function remote_filesize($url) { ob_start(); $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $ok = curl_exec($ch); curl_close($ch); $head = ob_get_contents(); ob_end_clean(); $regex = '/Content-Length:\s([0-9].+?)\s/'; $count = preg_match($regex, $head, $matches); return isset($matches[1]) ? $matches[1] : "unknown"; } $file_url = 'http://upgrade.typecho.co.uk/Bearsimple/bearsimple_lastest_update.zip'; $tmp_path = __DIR__.'/bearsimple_lastest_update.zip'; switch($action){ case 'prepare-download': $directory = __TYPECHO_ROOT_DIR__.__TYPECHO_THEME_DIR__; if (!is_dir_writable($directory)) { $result = array( 'code' => 0, 'message' => '升级前置检测不通过,原因:usr/themes目录不可读或不可写,请先赋予权限后重试!' ); exit(json_encode($result)); } $file_size = convert(remote_filesize($file_url)); $data['code'] = '1'; $data['message'] = 'success'; $data['filesize'] = $file_size; echo json_encode($data, JSON_UNESCAPED_UNICODE); break; case 'getsize': if (file_exists($tmp_path)) { $total = remote_filesize($file_url); $num = filesize($tmp_path); $round=round($num/$total*100,2); if($round > 100){ $round = '100'; } clearstatcache(); $data['code'] = '1'; $data['message'] = 'success'; $data['filesize'] = $round; echo json_encode($data, JSON_UNESCAPED_UNICODE); } break; case 'download': session_write_close(); if ($fp = fopen($file_url, "rb")) { if (!$download_fp = fopen($tmp_path, "wb")) { exit; } while (!feof($fp)) { if (!file_exists($tmp_path)) { fclose($download_fp); exit; } fwrite($download_fp, fread($fp, 128), 128); } fclose($download_fp); fclose($fp); } else { exit; } break; case 'finish': $archive = new PclZip(__DIR__.'/bearsimple_lastest_update.zip'); $archive->extract(PCLZIP_OPT_PATH,'./usr/plugins',PCLZIP_OPT_BY_PREG, "/^BsCore/",PCLZIP_OPT_REPLACE_NEWER); $archive->extract(PCLZIP_OPT_PATH,'./usr/themes',PCLZIP_OPT_BY_PREG, "/^bearsimple/",PCLZIP_OPT_REPLACE_NEWER); unlink($tmp_path); $data['code'] = '1'; $data['message'] = 'success'; echo json_encode($data, JSON_UNESCAPED_UNICODE); break; } } else{ $data['code'] = '0'; $data['message'] = 'Sorry,Not authorization.'; echo json_encode($data, JSON_UNESCAPED_UNICODE); } ================================================ FILE: modules/Upgrade/pclzip.lib.php ================================================ zipname = $p_zipname; $this->zip_fd = 0; $this->magic_quotes_status = -1; // ----- Return return; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // create($p_filelist, $p_add_dir="", $p_remove_dir="") // create($p_filelist, $p_option, $p_option_value, ...) // Description : // This method supports two different synopsis. The first one is historical. // This method creates a Zip Archive. The Zip file is created in the // filesystem. The files and directories indicated in $p_filelist // are added in the archive. See the parameters description for the // supported format of $p_filelist. // When a directory is in the list, the directory and its content is added // in the archive. // In this synopsis, the function takes an optional variable list of // options. See bellow the supported options. // Parameters : // $p_filelist : An array containing file or directory names, or // a string containing one filename or one directory name, or // a string containing a list of filenames and/or directory // names separated by spaces. // $p_add_dir : A path to add before the real path of the archived file, // in order to have it memorized in the archive. // $p_remove_dir : A path to remove from the real path of the file to archive, // in order to have a shorter path memorized in the archive. // When $p_add_dir and $p_remove_dir are set, $p_remove_dir // is removed first, before $p_add_dir is added. // Options : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_OPT_COMMENT : // PCLZIP_CB_PRE_ADD : // PCLZIP_CB_POST_ADD : // Return Values : // 0 on failure, // The list of the added files, with a status of the add action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- public function create($p_filelist) { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Set default values $v_options = array(); $v_options[PCLZIP_OPT_NO_COMPRESSION] = false; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Look for arguments if ($v_size > 1) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Remove from the options list the first argument array_shift($v_arg_list); $v_size--; // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array( PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_ADD => 'optional', PCLZIP_CB_POST_ADD => 'optional', PCLZIP_OPT_NO_COMPRESSION => 'optional', PCLZIP_OPT_COMMENT => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' //, PCLZIP_OPT_CRYPT => 'optional' )); if ($v_result != 1) { return 0; } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. } else { // ----- Get the first argument $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; } elseif ($v_size > 2) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); return 0; } } } // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Init $v_string_list = array(); $v_att_list = array(); $v_filedescr_list = array(); $p_result_list = array(); // ----- Look if the $p_filelist is really an array if (is_array($p_filelist)) { // ----- Look if the first element is also an array // This will mean that this is a file description entry if (isset($p_filelist[0]) && is_array($p_filelist[0])) { $v_att_list = $p_filelist; // ----- The list is a list of string names } else { $v_string_list = $p_filelist; } // ----- Look if the $p_filelist is a string } elseif (is_string($p_filelist)) { // ----- Create a list from the string $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); // ----- Invalid variable type for $p_filelist } else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); return 0; } // ----- Reformat the string list if (sizeof($v_string_list) != 0) { foreach ($v_string_list as $v_string) { if ($v_string != '') { $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; } else { } } } // ----- For each file in the list check the attributes $v_supported_attributes = array( PCLZIP_ATT_FILE_NAME => 'mandatory', PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional', PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional', PCLZIP_ATT_FILE_MTIME => 'optional', PCLZIP_ATT_FILE_CONTENT => 'optional', PCLZIP_ATT_FILE_COMMENT => 'optional' ); foreach ($v_att_list as $v_entry) { $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes); if ($v_result != 1) { return 0; } } // ----- Expand the filelist (expand directories) $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); if ($v_result != 1) { return 0; } // ----- Call the create fct $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); if ($v_result != 1) { return 0; } // ----- Return return $p_result_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // add($p_filelist, $p_add_dir="", $p_remove_dir="") // add($p_filelist, $p_option, $p_option_value, ...) // Description : // This method supports two synopsis. The first one is historical. // This methods add the list of files in an existing archive. // If a file with the same name already exists, it is added at the end of the // archive, the first one is still present. // If the archive does not exist, it is created. // Parameters : // $p_filelist : An array containing file or directory names, or // a string containing one filename or one directory name, or // a string containing a list of filenames and/or directory // names separated by spaces. // $p_add_dir : A path to add before the real path of the archived file, // in order to have it memorized in the archive. // $p_remove_dir : A path to remove from the real path of the file to archive, // in order to have a shorter path memorized in the archive. // When $p_add_dir and $p_remove_dir are set, $p_remove_dir // is removed first, before $p_add_dir is added. // Options : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_OPT_COMMENT : // PCLZIP_OPT_ADD_COMMENT : // PCLZIP_OPT_PREPEND_COMMENT : // PCLZIP_CB_PRE_ADD : // PCLZIP_CB_POST_ADD : // Return Values : // 0 on failure, // The list of the added files, with a status of the add action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- public function add($p_filelist) { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Set default values $v_options = array(); $v_options[PCLZIP_OPT_NO_COMPRESSION] = false; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Look for arguments if ($v_size > 1) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Remove form the options list the first argument array_shift($v_arg_list); $v_size--; // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array( PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_ADD => 'optional', PCLZIP_CB_POST_ADD => 'optional', PCLZIP_OPT_NO_COMPRESSION => 'optional', PCLZIP_OPT_COMMENT => 'optional', PCLZIP_OPT_ADD_COMMENT => 'optional', PCLZIP_OPT_PREPEND_COMMENT => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' //, PCLZIP_OPT_CRYPT => 'optional' )); if ($v_result != 1) { return 0; } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. } else { // ----- Get the first argument $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; } elseif ($v_size > 2) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); // ----- Return return 0; } } } // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Init $v_string_list = array(); $v_att_list = array(); $v_filedescr_list = array(); $p_result_list = array(); // ----- Look if the $p_filelist is really an array if (is_array($p_filelist)) { // ----- Look if the first element is also an array // This will mean that this is a file description entry if (isset($p_filelist[0]) && is_array($p_filelist[0])) { $v_att_list = $p_filelist; // ----- The list is a list of string names } else { $v_string_list = $p_filelist; } // ----- Look if the $p_filelist is a string } elseif (is_string($p_filelist)) { // ----- Create a list from the string $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); // ----- Invalid variable type for $p_filelist } else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '" . gettype($p_filelist) . "' for p_filelist"); return 0; } // ----- Reformat the string list if (sizeof($v_string_list) != 0) { foreach ($v_string_list as $v_string) { $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; } } // ----- For each file in the list check the attributes $v_supported_attributes = array( PCLZIP_ATT_FILE_NAME => 'mandatory', PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional', PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional', PCLZIP_ATT_FILE_MTIME => 'optional', PCLZIP_ATT_FILE_CONTENT => 'optional', PCLZIP_ATT_FILE_COMMENT => 'optional' ); foreach ($v_att_list as $v_entry) { $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes); if ($v_result != 1) { return 0; } } // ----- Expand the filelist (expand directories) $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); if ($v_result != 1) { return 0; } // ----- Call the create fct $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); if ($v_result != 1) { return 0; } // ----- Return return $p_result_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : listContent() // Description : // This public method, gives the list of the files and directories, with their // properties. // The properties of each entries in the list are (used also in other functions) : // filename : Name of the file. For a create or add action it is the filename // given by the user. For an extract function it is the filename // of the extracted file. // stored_filename : Name of the file / directory stored in the archive. // size : Size of the stored file. // compressed_size : Size of the file's data compressed in the archive // (without the headers overhead) // mtime : Last known modification date of the file (UNIX timestamp) // comment : Comment associated with the file // folder : true | false // index : index of the file in the archive // status : status of the action (depending of the action) : // Values are : // ok : OK ! // filtered : the file / dir is not extracted (filtered by user) // already_a_directory : the file can not be extracted because a // directory with the same name already exists // write_protected : the file can not be extracted because a file // with the same name already exists and is // write protected // newer_exist : the file was not extracted because a newer file exists // path_creation_fail : the file is not extracted because the folder // does not exist and can not be created // write_error : the file was not extracted because there was a // error while writing the file // read_error : the file was not extracted because there was a error // while reading the file // invalid_header : the file was not extracted because of an archive // format error (bad file header) // Note that each time a method can continue operating when there // is an action error on a file, the error is only logged in the file status. // Return Values : // 0 on an unrecoverable failure, // The list of the files in the archive. // -------------------------------------------------------------------------------- public function listContent() { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return (0); } // ----- Call the extracting fct $p_list = array(); if (($v_result = $this->privList($p_list)) != 1) { unset($p_list); return (0); } // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // extract($p_path="./", $p_remove_path="") // extract([$p_option, $p_option_value, ...]) // Description : // This method supports two synopsis. The first one is historical. // This method extract all the files / directories from the archive to the // folder indicated in $p_path. // If you want to ignore the 'root' part of path of the memorized files // you can indicate this in the optional $p_remove_path parameter. // By default, if a newer file with the same name already exists, the // file is not extracted. // // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append // at the end of the path value of PCLZIP_OPT_PATH. // Parameters : // $p_path : Path where the files and directories are to be extracted // $p_remove_path : First part ('root' part) of the memorized path // (if any similar) to remove while extracting. // Options : // PCLZIP_OPT_PATH : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_CB_PRE_EXTRACT : // PCLZIP_CB_POST_EXTRACT : // Return Values : // 0 or a negative value on failure, // The list of the extracted files, with a status of the action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- public function extract() { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return (0); } // ----- Set default values $v_options = array(); // $v_path = "./"; $v_path = ''; $v_remove_path = ""; $v_remove_all_path = false; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Default values for option $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false; // ----- Look for arguments if ($v_size > 0) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array( PCLZIP_OPT_PATH => 'optional', PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_EXTRACT => 'optional', PCLZIP_CB_POST_EXTRACT => 'optional', PCLZIP_OPT_SET_CHMOD => 'optional', PCLZIP_OPT_BY_NAME => 'optional', PCLZIP_OPT_BY_EREG => 'optional', PCLZIP_OPT_BY_PREG => 'optional', PCLZIP_OPT_BY_INDEX => 'optional', PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', PCLZIP_OPT_REPLACE_NEWER => 'optional', PCLZIP_OPT_STOP_ON_ERROR => 'optional', PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' )); if ($v_result != 1) { return 0; } // ----- Set the arguments if (isset($v_options[PCLZIP_OPT_PATH])) { $v_path = $v_options[PCLZIP_OPT_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { // ----- Check for '/' in last path char if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { $v_path .= '/'; } $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. } else { // ----- Get the first argument $v_path = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_remove_path = $v_arg_list[1]; } elseif ($v_size > 2) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); // ----- Return return 0; } } } // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Trace // ----- Call the extracting fct $p_list = array(); $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options); if ($v_result < 1) { unset($p_list); return (0); } // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // extractByIndex($p_index, $p_path="./", $p_remove_path="") // extractByIndex($p_index, [$p_option, $p_option_value, ...]) // Description : // This method supports two synopsis. The first one is historical. // This method is doing a partial extract of the archive. // The extracted files or folders are identified by their index in the // archive (from 0 to n). // Note that if the index identify a folder, only the folder entry is // extracted, not all the files included in the archive. // Parameters : // $p_index : A single index (integer) or a string of indexes of files to // extract. The form of the string is "0,4-6,8-12" with only numbers // and '-' for range or ',' to separate ranges. No spaces or ';' // are allowed. // $p_path : Path where the files and directories are to be extracted // $p_remove_path : First part ('root' part) of the memorized path // (if any similar) to remove while extracting. // Options : // PCLZIP_OPT_PATH : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and // not as files. // The resulting content is in a new field 'content' in the file // structure. // This option must be used alone (any other options are ignored). // PCLZIP_CB_PRE_EXTRACT : // PCLZIP_CB_POST_EXTRACT : // Return Values : // 0 on failure, // The list of the extracted files, with a status of the action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- //function extractByIndex($p_index, options...) public function extractByIndex($p_index) { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return (0); } // ----- Set default values $v_options = array(); // $v_path = "./"; $v_path = ''; $v_remove_path = ""; $v_remove_all_path = false; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Default values for option $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false; // ----- Look for arguments if ($v_size > 1) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Remove form the options list the first argument array_shift($v_arg_list); $v_size--; // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array( PCLZIP_OPT_PATH => 'optional', PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_EXTRACT => 'optional', PCLZIP_CB_POST_EXTRACT => 'optional', PCLZIP_OPT_SET_CHMOD => 'optional', PCLZIP_OPT_REPLACE_NEWER => 'optional', PCLZIP_OPT_STOP_ON_ERROR => 'optional', PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' )); if ($v_result != 1) { return 0; } // ----- Set the arguments if (isset($v_options[PCLZIP_OPT_PATH])) { $v_path = $v_options[PCLZIP_OPT_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { // ----- Check for '/' in last path char if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { $v_path .= '/'; } $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; } if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false; } else { } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. } else { // ----- Get the first argument $v_path = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_remove_path = $v_arg_list[1]; } elseif ($v_size > 2) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); // ----- Return return 0; } } } // ----- Trace // ----- Trick // Here I want to reuse extractByRule(), so I need to parse the $p_index // with privParseOptions() $v_arg_trick = array( PCLZIP_OPT_BY_INDEX, $p_index ); $v_options_trick = array(); $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, array( PCLZIP_OPT_BY_INDEX => 'optional' )); if ($v_result != 1) { return 0; } $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Call the extracting fct if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { return (0); } // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // delete([$p_option, $p_option_value, ...]) // Description : // This method removes files from the archive. // If no parameters are given, then all the archive is emptied. // Parameters : // None or optional arguments. // Options : // PCLZIP_OPT_BY_INDEX : // PCLZIP_OPT_BY_NAME : // PCLZIP_OPT_BY_EREG : // PCLZIP_OPT_BY_PREG : // Return Values : // 0 on failure, // The list of the files which are still present in the archive. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- public function delete() { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return (0); } // ----- Set default values $v_options = array(); // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Look for arguments if ($v_size > 0) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array( PCLZIP_OPT_BY_NAME => 'optional', PCLZIP_OPT_BY_EREG => 'optional', PCLZIP_OPT_BY_PREG => 'optional', PCLZIP_OPT_BY_INDEX => 'optional' )); if ($v_result != 1) { return 0; } } // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Call the delete fct $v_list = array(); if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { $this->privSwapBackMagicQuotes(); unset($v_list); return (0); } // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : deleteByIndex() // Description : // ***** Deprecated ***** // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. // -------------------------------------------------------------------------------- public function deleteByIndex($p_index) { $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : properties() // Description : // This method gives the properties of the archive. // The properties are : // nb : Number of files in the archive // comment : Comment associated with the archive file // status : not_exist, ok // Parameters : // None // Return Values : // 0 on failure, // An array with the archive properties. // -------------------------------------------------------------------------------- public function properties() { // ----- Reset the error handler $this->privErrorReset(); // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Check archive if (!$this->privCheckFormat()) { $this->privSwapBackMagicQuotes(); return (0); } // ----- Default properties $v_prop = array(); $v_prop['comment'] = ''; $v_prop['nb'] = 0; $v_prop['status'] = 'not_exist'; // ----- Look if file exists if (@is_file($this->zipname)) { // ----- Open the zip file if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \'' . $this->zipname . '\' in binary read mode'); // ----- Return return 0; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privSwapBackMagicQuotes(); return 0; } // ----- Close the zip file $this->privCloseFd(); // ----- Set the user attributes $v_prop['comment'] = $v_central_dir['comment']; $v_prop['nb'] = $v_central_dir['entries']; $v_prop['status'] = 'ok'; } // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_prop; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : duplicate() // Description : // This method creates an archive by copying the content of an other one. If // the archive already exist, it is replaced by the new one without any warning. // Parameters : // $p_archive : The filename of a valid archive, or // a valid PclZip object. // Return Values : // 1 on success. // 0 or a negative value on error (error code). // -------------------------------------------------------------------------------- public function duplicate($p_archive) { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Look if the $p_archive is a PclZip object if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) { // ----- Duplicate the archive $v_result = $this->privDuplicate($p_archive->zipname); // ----- Look if the $p_archive is a string (so a filename) } elseif (is_string($p_archive)) { // ----- Check that $p_archive is a valid zip file // TBC : Should also check the archive format if (!is_file($p_archive)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '" . $p_archive . "'"); $v_result = PCLZIP_ERR_MISSING_FILE; } else { // ----- Duplicate the archive $v_result = $this->privDuplicate($p_archive); } // ----- Invalid variable } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); $v_result = PCLZIP_ERR_INVALID_PARAMETER; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : merge() // Description : // This method merge the $p_archive_to_add archive at the end of the current // one ($this). // If the archive ($this) does not exist, the merge becomes a duplicate. // If the $p_archive_to_add archive does not exist, the merge is a success. // Parameters : // $p_archive_to_add : It can be directly the filename of a valid zip archive, // or a PclZip object archive. // Return Values : // 1 on success, // 0 or negative values on error (see below). // -------------------------------------------------------------------------------- public function merge($p_archive_to_add) { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return (0); } // ----- Look if the $p_archive_to_add is a PclZip object if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) { // ----- Merge the archive $v_result = $this->privMerge($p_archive_to_add); // ----- Look if the $p_archive_to_add is a string (so a filename) } elseif (is_string($p_archive_to_add)) { // ----- Create a temporary archive $v_object_archive = new PclZip($p_archive_to_add); // ----- Merge the archive $v_result = $this->privMerge($v_object_archive); // ----- Invalid variable } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); $v_result = PCLZIP_ERR_INVALID_PARAMETER; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : errorCode() // Description : // Parameters : // -------------------------------------------------------------------------------- public function errorCode() { if (PCLZIP_ERROR_EXTERNAL == 1) { return (PclErrorCode()); } else { return ($this->error_code); } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : errorName() // Description : // Parameters : // -------------------------------------------------------------------------------- public function errorName($p_with_code = false) { $v_name = array( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' ); if (isset($v_name[$this->error_code])) { $v_value = $v_name[$this->error_code]; } else { $v_value = 'NoName'; } if ($p_with_code) { return ($v_value . ' (' . $this->error_code . ')'); } else { return ($v_value); } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : errorInfo() // Description : // Parameters : // -------------------------------------------------------------------------------- public function errorInfo($p_full = false) { if (PCLZIP_ERROR_EXTERNAL == 1) { return (PclErrorString()); } else { if ($p_full) { return ($this->errorName(true) . " : " . $this->error_string); } else { return ($this->error_string . " [code " . $this->error_code . "]"); } } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** // ***** ***** // ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCheckFormat() // Description : // This method check that the archive exists and is a valid zip archive. // Several level of check exists. (futur) // Parameters : // $p_level : Level of check. Default 0. // 0 : Check the first bytes (magic codes) (default value)) // 1 : 0 + Check the central directory (futur) // 2 : 1 + Check each file header (futur) // Return Values : // true on success, // false on error, the error code is set. // -------------------------------------------------------------------------------- public function privCheckFormat($p_level = 0) { $v_result = true; // ----- Reset the file system cache clearstatcache(); // ----- Reset the error handler $this->privErrorReset(); // ----- Look if the file exits if (!is_file($this->zipname)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '" . $this->zipname . "'"); return (false); } // ----- Check that the file is readeable if (!is_readable($this->zipname)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '" . $this->zipname . "'"); return (false); } // ----- Check the magic code // TBC // ----- Check the central header // TBC // ----- Check each file header // TBC // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privParseOptions() // Description : // This internal methods reads the variable list of arguments ($p_options_list, // $p_size) and generate an array with the options and values ($v_result_list). // $v_requested_options contains the options that can be present and those that // must be present. // $v_requested_options is an array, with the option value as key, and 'optional', // or 'mandatory' as value. // Parameters : // See above. // Return Values : // 1 on success. // 0 on failure. // -------------------------------------------------------------------------------- public function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options = false) { $v_result = 1; // ----- Read the options $i = 0; while ($i < $p_size) { // ----- Check if the option is supported if (!isset($v_requested_options[$p_options_list[$i]])) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '" . $p_options_list[$i] . "' for this method"); // ----- Return return PclZip::errorCode(); } // ----- Look for next option switch ($p_options_list[$i]) { // ----- Look for options that request a path value case PCLZIP_OPT_PATH: case PCLZIP_OPT_REMOVE_PATH: case PCLZIP_OPT_ADD_PATH: // ----- Check the number of parameters if (($i + 1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i + 1], false); $i++; break; case PCLZIP_OPT_TEMP_FILE_THRESHOLD: // ----- Check the number of parameters if (($i + 1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); return PclZip::errorCode(); } // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '" . PclZipUtilOptionText($p_options_list[$i]) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); return PclZip::errorCode(); } // ----- Check the value $v_value = $p_options_list[$i + 1]; if ((!is_integer($v_value)) || ($v_value < 0)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); return PclZip::errorCode(); } // ----- Get the value (and convert it in bytes) $v_result_list[$p_options_list[$i]] = $v_value * 1048576; $i++; break; case PCLZIP_OPT_TEMP_FILE_ON: // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '" . PclZipUtilOptionText($p_options_list[$i]) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = true; break; case PCLZIP_OPT_TEMP_FILE_OFF: // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '" . PclZipUtilOptionText($p_options_list[$i]) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); return PclZip::errorCode(); } // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '" . PclZipUtilOptionText($p_options_list[$i]) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = true; break; case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION: // ----- Check the number of parameters if (($i + 1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if (is_string($p_options_list[$i + 1]) && ($p_options_list[$i + 1] != '')) { $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i + 1], false); $i++; } else { } break; // ----- Look for options that request an array of string for value case PCLZIP_OPT_BY_NAME: // ----- Check the number of parameters if (($i + 1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if (is_string($p_options_list[$i + 1])) { $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i + 1]; } elseif (is_array($p_options_list[$i + 1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } $i++; break; // ----- Look for options that request an EREG or PREG expression case PCLZIP_OPT_BY_EREG: $p_options_list[$i] = PCLZIP_OPT_BY_PREG; // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG // to PCLZIP_OPT_BY_PREG case PCLZIP_OPT_BY_PREG: //case PCLZIP_OPT_CRYPT : // ----- Check the number of parameters if (($i + 1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if (is_string($p_options_list[$i + 1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } $i++; break; // ----- Look for options that takes a string case PCLZIP_OPT_COMMENT: case PCLZIP_OPT_ADD_COMMENT: case PCLZIP_OPT_PREPEND_COMMENT: // ----- Check the number of parameters if (($i + 1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if (is_string($p_options_list[$i + 1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } $i++; break; // ----- Look for options that request an array of index case PCLZIP_OPT_BY_INDEX: // ----- Check the number of parameters if (($i + 1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_work_list = array(); if (is_string($p_options_list[$i + 1])) { // ----- Remove spaces $p_options_list[$i + 1] = strtr($p_options_list[$i + 1], ' ', ''); // ----- Parse items $v_work_list = explode(",", $p_options_list[$i + 1]); } elseif (is_integer($p_options_list[$i + 1])) { $v_work_list[0] = $p_options_list[$i + 1] . '-' . $p_options_list[$i + 1]; } elseif (is_array($p_options_list[$i + 1])) { $v_work_list = $p_options_list[$i + 1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Reduce the index list // each index item in the list must be a couple with a start and // an end value : [0,3], [5-5], [8-10], ... // ----- Check the format of each item $v_sort_flag = false; $v_sort_value = 0; for ($j = 0; $j < sizeof($v_work_list); $j++) { // ----- Explode the item $v_item_list = explode("-", $v_work_list[$j]); $v_size_item_list = sizeof($v_item_list); // ----- TBC : Here we might check that each item is a // real integer ... // ----- Look for single value if ($v_size_item_list == 1) { // ----- Set the option value $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0]; $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0]; } elseif ($v_size_item_list == 2) { // ----- Set the option value $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0]; $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Look for list sort if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) { $v_sort_flag = true; // ----- TBC : An automatic sort should be writen ... // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start']; } // ----- Sort the items if ($v_sort_flag) { // TBC : To Be Completed } // ----- Next option $i++; break; // ----- Look for options that request no value case PCLZIP_OPT_REMOVE_ALL_PATH: case PCLZIP_OPT_EXTRACT_AS_STRING: case PCLZIP_OPT_NO_COMPRESSION: case PCLZIP_OPT_EXTRACT_IN_OUTPUT: case PCLZIP_OPT_REPLACE_NEWER: case PCLZIP_OPT_STOP_ON_ERROR: $v_result_list[$p_options_list[$i]] = true; break; // ----- Look for options that request an octal value case PCLZIP_OPT_SET_CHMOD: // ----- Check the number of parameters if (($i + 1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_result_list[$p_options_list[$i]] = $p_options_list[$i + 1]; $i++; break; // ----- Look for options that request a call-back case PCLZIP_CB_PRE_EXTRACT: case PCLZIP_CB_POST_EXTRACT: case PCLZIP_CB_PRE_ADD: case PCLZIP_CB_POST_ADD: /* for futur use case PCLZIP_CB_PRE_DELETE : case PCLZIP_CB_POST_DELETE : case PCLZIP_CB_PRE_LIST : case PCLZIP_CB_POST_LIST : */ // ----- Check the number of parameters if (($i + 1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_function_name = $p_options_list[$i + 1]; // ----- Check that the value is a valid existing function if (!function_exists($v_function_name)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '" . $v_function_name . "()' is not an existing function for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); // ----- Return return PclZip::errorCode(); } // ----- Set the attribute $v_result_list[$p_options_list[$i]] = $v_function_name; $i++; break; default: // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '" . $p_options_list[$i] . "'"); // ----- Return return PclZip::errorCode(); } // ----- Next options $i++; } // ----- Look for mandatory options if ($v_requested_options !== false) { for ($key = reset($v_requested_options); $key = key($v_requested_options); $key = next($v_requested_options)) { // ----- Look for mandatory option if ($v_requested_options[$key] == 'mandatory') { // ----- Look if present if (!isset($v_result_list[$key])) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter " . PclZipUtilOptionText($key) . "(" . $key . ")"); // ----- Return return PclZip::errorCode(); } } } } // ----- Look for default values if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privOptionDefaultThreshold() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privOptionDefaultThreshold(&$p_options) { $v_result = 1; if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { return $v_result; } // ----- Get 'memory_limit' configuration value $v_memory_limit = ini_get('memory_limit'); $v_memory_limit = trim($v_memory_limit); $last = strtolower(substr($v_memory_limit, -1)); $v_memory_limit = preg_replace('/\s*[KkMmGg]$/', '', $v_memory_limit); if ($last == 'g') { //$v_memory_limit = $v_memory_limit*1024*1024*1024; $v_memory_limit = $v_memory_limit * 1073741824; } if ($last == 'm') { //$v_memory_limit = $v_memory_limit*1024*1024; $v_memory_limit = $v_memory_limit * 1048576; } if ($last == 'k') { $v_memory_limit = $v_memory_limit * 1024; } $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit * PCLZIP_TEMPORARY_FILE_RATIO); // ----- Sanity check : No threshold if value lower than 1M if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privFileDescrParseAtt() // Description : // Parameters : // Return Values : // 1 on success. // 0 on failure. // -------------------------------------------------------------------------------- public function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options = false) { $v_result = 1; // ----- For each file in the list check the attributes foreach ($p_file_list as $v_key => $v_value) { // ----- Check if the option is supported if (!isset($v_requested_options[$v_key])) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '" . $v_key . "' for this file"); // ----- Return return PclZip::errorCode(); } // ----- Look for attribute switch ($v_key) { case PCLZIP_ATT_FILE_NAME: if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type " . gettype($v_value) . ". String expected for attribute '" . PclZipUtilOptionText($v_key) . "'"); return PclZip::errorCode(); } $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['filename'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '" . PclZipUtilOptionText($v_key) . "'"); return PclZip::errorCode(); } break; case PCLZIP_ATT_FILE_NEW_SHORT_NAME: if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type " . gettype($v_value) . ". String expected for attribute '" . PclZipUtilOptionText($v_key) . "'"); return PclZip::errorCode(); } $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['new_short_name'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '" . PclZipUtilOptionText($v_key) . "'"); return PclZip::errorCode(); } break; case PCLZIP_ATT_FILE_NEW_FULL_NAME: if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type " . gettype($v_value) . ". String expected for attribute '" . PclZipUtilOptionText($v_key) . "'"); return PclZip::errorCode(); } $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['new_full_name'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '" . PclZipUtilOptionText($v_key) . "'"); return PclZip::errorCode(); } break; // ----- Look for options that takes a string case PCLZIP_ATT_FILE_COMMENT: if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type " . gettype($v_value) . ". String expected for attribute '" . PclZipUtilOptionText($v_key) . "'"); return PclZip::errorCode(); } $p_filedescr['comment'] = $v_value; break; case PCLZIP_ATT_FILE_MTIME: if (!is_integer($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type " . gettype($v_value) . ". Integer expected for attribute '" . PclZipUtilOptionText($v_key) . "'"); return PclZip::errorCode(); } $p_filedescr['mtime'] = $v_value; break; case PCLZIP_ATT_FILE_CONTENT: $p_filedescr['content'] = $v_value; break; default: // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '" . $v_key . "'"); // ----- Return return PclZip::errorCode(); } // ----- Look for mandatory options if ($v_requested_options !== false) { for ($key = reset($v_requested_options); $key = key($v_requested_options); $key = next($v_requested_options)) { // ----- Look for mandatory option if ($v_requested_options[$key] == 'mandatory') { // ----- Look if present if (!isset($p_file_list[$key])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter " . PclZipUtilOptionText($key) . "(" . $key . ")"); return PclZip::errorCode(); } } } } // end foreach } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privFileDescrExpand() // Description : // This method look for each item of the list to see if its a file, a folder // or a string to be added as file. For any other type of files (link, other) // just ignore the item. // Then prepare the information that will be stored for that file. // When its a folder, expand the folder with all the files that are in that // folder (recursively). // Parameters : // Return Values : // 1 on success. // 0 on failure. // -------------------------------------------------------------------------------- public function privFileDescrExpand(&$p_filedescr_list, &$p_options) { $v_result = 1; // ----- Create a result list $v_result_list = array(); // ----- Look each entry for ($i = 0; $i < sizeof($p_filedescr_list); $i++) { // ----- Get filedescr $v_descr = $p_filedescr_list[$i]; // ----- Reduce the filename $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false); $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']); // ----- Look for real file or folder if (file_exists($v_descr['filename'])) { if (@is_file($v_descr['filename'])) { $v_descr['type'] = 'file'; } elseif (@is_dir($v_descr['filename'])) { $v_descr['type'] = 'folder'; } elseif (@is_link($v_descr['filename'])) { // skip continue; } else { // skip continue; } // ----- Look for string added as file } elseif (isset($v_descr['content'])) { $v_descr['type'] = 'virtual_file'; // ----- Missing file } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '" . $v_descr['filename'] . "' does not exist"); // ----- Return return PclZip::errorCode(); } // ----- Calculate the stored filename $this->privCalculateStoredFilename($v_descr, $p_options); // ----- Add the descriptor in result list $v_result_list[sizeof($v_result_list)] = $v_descr; // ----- Look for folder if ($v_descr['type'] == 'folder') { // ----- List of items in folder $v_dirlist_descr = array(); $v_dirlist_nb = 0; if ($v_folder_handler = @opendir($v_descr['filename'])) { while (($v_item_handler = @readdir($v_folder_handler)) !== false) { // ----- Skip '.' and '..' if (($v_item_handler == '.') || ($v_item_handler == '..')) { continue; } // ----- Compose the full filename $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'] . '/' . $v_item_handler; // ----- Look for different stored filename // Because the name of the folder was changed, the name of the // files/sub-folders also change if (($v_descr['stored_filename'] != $v_descr['filename']) && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { if ($v_descr['stored_filename'] != '') { $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'] . '/' . $v_item_handler; } else { $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; } } $v_dirlist_nb++; } @closedir($v_folder_handler); } else { // TBC : unable to open folder in read mode } // ----- Expand each element of the list if ($v_dirlist_nb != 0) { // ----- Expand if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { return $v_result; } // ----- Concat the resulting list $v_result_list = array_merge($v_result_list, $v_dirlist_descr); } else { } // ----- Free local array unset($v_dirlist_descr); } } // ----- Get the result list $p_filedescr_list = $v_result_list; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCreate() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privCreate($p_filedescr_list, &$p_result_list, &$p_options) { $v_result = 1; $v_list_detail = array(); // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Open the file in write mode if (($v_result = $this->privOpenFd('wb')) != 1) { // ----- Return return $v_result; } // ----- Add the list of files $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); // ----- Close $this->privCloseFd(); // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAdd() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privAdd($p_filedescr_list, &$p_result_list, &$p_options) { $v_result = 1; $v_list_detail = array(); // ----- Look if the archive exists or is empty if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) { // ----- Do a create $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); // ----- Return return $v_result; } // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Open the zip file if (($v_result = $this->privOpenFd('rb')) != 1) { // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Go to beginning of File @rewind($this->zip_fd); // ----- Creates a temporay file $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp'; // ----- Open the temporary file in write mode if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_zip_temp_name . '\' in binary write mode'); // ----- Return return PclZip::errorCode(); } // ----- Copy the files from the archive to the temporary file // TBC : Here I should better append the file and go back to erase the central dir $v_size = $v_central_dir['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Swap the file descriptor // Here is a trick : I swap the temporary fd with the zip fd, in order to use // the following methods on the temporary fil and not the real archive $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Add the files $v_header_list = array(); if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { fclose($v_zip_temp_fd); $this->privCloseFd(); @unlink($v_zip_temp_name); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // ----- Store the offset of the central dir $v_offset = @ftell($this->zip_fd); // ----- Copy the block of file headers from the old archive $v_size = $v_central_dir['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_zip_temp_fd, $v_read_size); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Create the Central Dir files header for ($i = 0, $v_count = 0; $i < sizeof($v_header_list); $i++) { // ----- Create the file header if ($v_header_list[$i]['status'] == 'ok') { if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) { fclose($v_zip_temp_fd); $this->privCloseFd(); @unlink($v_zip_temp_name); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } $v_count++; } // ----- Transform the header to a 'usable' info $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } // ----- Zip file comment $v_comment = $v_central_dir['comment']; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { $v_comment = $v_comment . $p_options[PCLZIP_OPT_ADD_COMMENT]; } if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT] . $v_comment; } // ----- Calculate the size of the central header $v_size = @ftell($this->zip_fd) - $v_offset; // ----- Create the central dir footer if (($v_result = $this->privWriteCentralHeader($v_count + $v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) { // ----- Reset the file list unset($v_header_list); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // ----- Swap back the file descriptor $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Close $this->privCloseFd(); // ----- Close the temporary file @fclose($v_zip_temp_fd); // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Delete the zip file // TBC : I should test the result ... @unlink($this->zipname); // ----- Rename the temporary file // TBC : I should test the result ... //@rename($v_zip_temp_name, $this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privOpenFd() // Description : // Parameters : // -------------------------------------------------------------------------------- public function privOpenFd($p_mode) { $v_result = 1; // ----- Look if already open if ($this->zip_fd != 0) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \'' . $this->zipname . '\' already open'); // ----- Return return PclZip::errorCode(); } // ----- Open the zip file if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \'' . $this->zipname . '\' in ' . $p_mode . ' mode'); // ----- Return return PclZip::errorCode(); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCloseFd() // Description : // Parameters : // -------------------------------------------------------------------------------- public function privCloseFd() { $v_result = 1; if ($this->zip_fd != 0) { @fclose($this->zip_fd); } $this->zip_fd = 0; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddList() // Description : // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is // different from the real path of the file. This is usefull if you want to have PclTar // running in any directory, and memorize relative path from an other directory. // Parameters : // $p_list : An array containing the file or directory names to add in the tar // $p_result_list : list of added files with their properties (specially the status field) // $p_add_dir : Path to add in the filename path archived // $p_remove_dir : Path to remove in the filename path archived // Return Values : // -------------------------------------------------------------------------------- // function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) public function privAddList($p_filedescr_list, &$p_result_list, &$p_options) { $v_result = 1; // ----- Add the files $v_header_list = array(); if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { // ----- Return return $v_result; } // ----- Store the offset of the central dir $v_offset = @ftell($this->zip_fd); // ----- Create the Central Dir files header for ($i = 0, $v_count = 0; $i < sizeof($v_header_list); $i++) { // ----- Create the file header if ($v_header_list[$i]['status'] == 'ok') { if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) { // ----- Return return $v_result; } $v_count++; } // ----- Transform the header to a 'usable' info $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } // ----- Zip file comment $v_comment = ''; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } // ----- Calculate the size of the central header $v_size = @ftell($this->zip_fd) - $v_offset; // ----- Create the central dir footer if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) { // ----- Reset the file list unset($v_header_list); // ----- Return return $v_result; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddFileList() // Description : // Parameters : // $p_filedescr_list : An array containing the file description // or directory names to add in the zip // $p_result_list : list of added files with their properties (specially the status field) // Return Values : // -------------------------------------------------------------------------------- public function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) { $v_result = 1; $v_header = array(); // ----- Recuperate the current number of elt in list $v_nb = sizeof($p_result_list); // ----- Loop on the files for ($j = 0; ($j < sizeof($p_filedescr_list)) && ($v_result == 1); $j++) { // ----- Format the filename $p_filedescr_list[$j]['filename'] = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false); // ----- Skip empty file names // TBC : Can this be possible ? not checked in DescrParseAtt ? if ($p_filedescr_list[$j]['filename'] == "") { continue; } // ----- Check the filename if (($p_filedescr_list[$j]['type'] != 'virtual_file') && (!file_exists($p_filedescr_list[$j]['filename']))) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '" . $p_filedescr_list[$j]['filename'] . "' does not exist"); return PclZip::errorCode(); } // ----- Look if it is a file or a dir with no all path remove option // or a dir with all its path removed // if ( (is_file($p_filedescr_list[$j]['filename'])) // || ( is_dir($p_filedescr_list[$j]['filename']) if (($p_filedescr_list[$j]['type'] == 'file') || ($p_filedescr_list[$j]['type'] == 'virtual_file') || (($p_filedescr_list[$j]['type'] == 'folder') && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]) || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { // ----- Add the file $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header, $p_options); if ($v_result != 1) { return $v_result; } // ----- Store the file infos $p_result_list[$v_nb++] = $v_header; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddFile() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privAddFile($p_filedescr, &$p_header, &$p_options) { $v_result = 1; // ----- Working variable $p_filename = $p_filedescr['filename']; // TBC : Already done in the fileAtt check ... ? if ($p_filename == "") { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); // ----- Return return PclZip::errorCode(); } // ----- Look for a stored different filename /* TBC : Removed if (isset($p_filedescr['stored_filename'])) { $v_stored_filename = $p_filedescr['stored_filename']; } else { $v_stored_filename = $p_filedescr['stored_filename']; } */ // ----- Set the file properties clearstatcache(); $p_header['version'] = 20; $p_header['version_extracted'] = 10; $p_header['flag'] = 0; $p_header['compression'] = 0; $p_header['crc'] = 0; $p_header['compressed_size'] = 0; $p_header['filename_len'] = strlen($p_filename); $p_header['extra_len'] = 0; $p_header['disk'] = 0; $p_header['internal'] = 0; $p_header['offset'] = 0; $p_header['filename'] = $p_filename; // TBC : Removed $p_header['stored_filename'] = $v_stored_filename; $p_header['stored_filename'] = $p_filedescr['stored_filename']; $p_header['extra'] = ''; $p_header['status'] = 'ok'; $p_header['index'] = -1; // ----- Look for regular file if ($p_filedescr['type'] == 'file') { $p_header['external'] = 0x00000000; $p_header['size'] = filesize($p_filename); // ----- Look for regular folder } elseif ($p_filedescr['type'] == 'folder') { $p_header['external'] = 0x00000010; $p_header['mtime'] = filemtime($p_filename); $p_header['size'] = filesize($p_filename); // ----- Look for virtual file } elseif ($p_filedescr['type'] == 'virtual_file') { $p_header['external'] = 0x00000000; $p_header['size'] = strlen($p_filedescr['content']); } // ----- Look for filetime if (isset($p_filedescr['mtime'])) { $p_header['mtime'] = $p_filedescr['mtime']; } elseif ($p_filedescr['type'] == 'virtual_file') { $p_header['mtime'] = time(); } else { $p_header['mtime'] = filemtime($p_filename); } // ------ Look for file comment if (isset($p_filedescr['comment'])) { $p_header['comment_len'] = strlen($p_filedescr['comment']); $p_header['comment'] = $p_filedescr['comment']; } else { $p_header['comment_len'] = 0; $p_header['comment'] = ''; } // ----- Look for pre-add callback if (isset($p_options[PCLZIP_CB_PRE_ADD])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_header, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_header['status'] = "skipped"; $v_result = 1; } // ----- Update the informations // Only some fields can be modified if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); } } // ----- Look for empty stored filename if ($p_header['stored_filename'] == "") { $p_header['status'] = "filtered"; } // ----- Check the path length if (strlen($p_header['stored_filename']) > 0xFF) { $p_header['status'] = 'filename_too_long'; } // ----- Look if no error, or file not skipped if ($p_header['status'] == 'ok') { // ----- Look for a file if ($p_filedescr['type'] == 'file') { // ----- Look for using temporary file to zip if ((!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])))) { $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); if ($v_result < PCLZIP_ERR_NO_ERROR) { return $v_result; } // ----- Use "in memory" zip algo } else { // ----- Open the source file if (($v_file = @fopen($p_filename, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); return PclZip::errorCode(); } // ----- Read the file content $v_content = @fread($v_file, $p_header['size']); // ----- Close the file @fclose($v_file); // ----- Calculate the CRC $p_header['crc'] = @crc32($v_content); // ----- Look for no compression if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { // ----- Set header parameters $p_header['compressed_size'] = $p_header['size']; $p_header['compression'] = 0; // ----- Look for normal compression } else { // ----- Compress the content $v_content = @gzdeflate($v_content); // ----- Set header parameters $p_header['compressed_size'] = strlen($v_content); $p_header['compression'] = 8; } // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { @fclose($v_file); return $v_result; } // ----- Write the compressed (or not) content @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); } // ----- Look for a virtual file (a file from string) } elseif ($p_filedescr['type'] == 'virtual_file') { $v_content = $p_filedescr['content']; // ----- Calculate the CRC $p_header['crc'] = @crc32($v_content); // ----- Look for no compression if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { // ----- Set header parameters $p_header['compressed_size'] = $p_header['size']; $p_header['compression'] = 0; // ----- Look for normal compression } else { // ----- Compress the content $v_content = @gzdeflate($v_content); // ----- Set header parameters $p_header['compressed_size'] = strlen($v_content); $p_header['compression'] = 8; } // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { @fclose($v_file); return $v_result; } // ----- Write the compressed (or not) content @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); // ----- Look for a directory } elseif ($p_filedescr['type'] == 'folder') { // ----- Look for directory last '/' if (@substr($p_header['stored_filename'], -1) != '/') { $p_header['stored_filename'] .= '/'; } // ----- Set the file properties $p_header['size'] = 0; //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked $p_header['external'] = 0x00000010; // Value for a folder : to be checked // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { return $v_result; } } } // ----- Look for post-add callback if (isset($p_options[PCLZIP_CB_POST_ADD])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_header, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); if ($v_result == 0) { // ----- Ignored $v_result = 1; } // ----- Update the informations // Nothing can be modified } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddFileUsingTempFile() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) { $v_result = PCLZIP_ERR_NO_ERROR; // ----- Working variable $p_filename = $p_filedescr['filename']; // ----- Open the source file if (($v_file = @fopen($p_filename, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); return PclZip::errorCode(); } // ----- Creates a compressed temporary file $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.gz'; if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { fclose($v_file); PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary write mode'); return PclZip::errorCode(); } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = filesize($p_filename); while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_file, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @gzputs($v_file_compressed, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Close the file @fclose($v_file); @gzclose($v_file_compressed); // ----- Check the minimum file size if (filesize($v_gzip_temp_name) < 18) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \'' . $v_gzip_temp_name . '\' has invalid filesize - should be minimum 18 bytes'); return PclZip::errorCode(); } // ----- Extract the compressed attributes if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary read mode'); return PclZip::errorCode(); } // ----- Read the gzip file header $v_binary_data = @fread($v_file_compressed, 10); $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); // ----- Check some parameters $v_data_header['os'] = bin2hex($v_data_header['os']); // ----- Read the gzip file footer @fseek($v_file_compressed, filesize($v_gzip_temp_name) - 8); $v_binary_data = @fread($v_file_compressed, 8); $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); // ----- Set the attributes $p_header['compression'] = ord($v_data_header['cm']); //$p_header['mtime'] = $v_data_header['mtime']; $p_header['crc'] = $v_data_footer['crc']; $p_header['compressed_size'] = filesize($v_gzip_temp_name) - 18; // ----- Close the file @fclose($v_file_compressed); // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { return $v_result; } // ----- Add the compressed data if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary read mode'); return PclZip::errorCode(); } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks fseek($v_file_compressed, 10); $v_size = $p_header['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_file_compressed, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Close the file @fclose($v_file_compressed); // ----- Unlink the temporary file @unlink($v_gzip_temp_name); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCalculateStoredFilename() // Description : // Based on file descriptor properties and global options, this method // calculate the filename that will be stored in the archive. // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privCalculateStoredFilename(&$p_filedescr, &$p_options) { $v_result = 1; // ----- Working variables $p_filename = $p_filedescr['filename']; if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; } else { $p_add_dir = ''; } if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; } else { $p_remove_dir = ''; } if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } else { $p_remove_all_dir = 0; } // ----- Look for full name change if (isset($p_filedescr['new_full_name'])) { // ----- Remove drive letter if any $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); // ----- Look for path and/or short name change } else { // ----- Look for short name change // Its when we cahnge just the filename but not the path if (isset($p_filedescr['new_short_name'])) { $v_path_info = pathinfo($p_filename); $v_dir = ''; if ($v_path_info['dirname'] != '') { $v_dir = $v_path_info['dirname'] . '/'; } $v_stored_filename = $v_dir . $p_filedescr['new_short_name']; } else { // ----- Calculate the stored filename $v_stored_filename = $p_filename; } // ----- Look for all path to remove if ($p_remove_all_dir) { $v_stored_filename = basename($p_filename); // ----- Look for partial path remove } elseif ($p_remove_dir != "") { if (substr($p_remove_dir, -1) != '/') { $p_remove_dir .= "/"; } if ((substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./")) { if ((substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./")) { $p_remove_dir = "./" . $p_remove_dir; } if ((substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./")) { $p_remove_dir = substr($p_remove_dir, 2); } } $v_compare = PclZipUtilPathInclusion($p_remove_dir, $v_stored_filename); if ($v_compare > 0) { if ($v_compare == 2) { $v_stored_filename = ""; } else { $v_stored_filename = substr($v_stored_filename, strlen($p_remove_dir)); } } } // ----- Remove drive letter if any $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); // ----- Look for path to add if ($p_add_dir != "") { if (substr($p_add_dir, -1) == "/") { $v_stored_filename = $p_add_dir . $v_stored_filename; } else { $v_stored_filename = $p_add_dir . "/" . $v_stored_filename; } } } // ----- Filename (reduce the path of stored name) $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); $p_filedescr['stored_filename'] = $v_stored_filename; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privWriteFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privWriteFileHeader(&$p_header) { $v_result = 1; // ----- Store the offset position of the file $p_header['offset'] = ftell($this->zip_fd); // ----- Transform UNIX mtime to DOS format mdate/mtime $v_date = getdate($p_header['mtime']); $v_mtime = ($v_date['hours'] << 11) + ($v_date['minutes'] << 5) + $v_date['seconds'] / 2; $v_mdate = (($v_date['year'] - 1980) << 9) + ($v_date['mon'] << 5) + $v_date['mday']; // ----- Packed data $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len']); // ----- Write the first 148 bytes of the header in the archive fputs($this->zip_fd, $v_binary_data, 30); // ----- Write the variable fields if (strlen($p_header['stored_filename']) != 0) { fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); } if ($p_header['extra_len'] != 0) { fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privWriteCentralFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privWriteCentralFileHeader(&$p_header) { $v_result = 1; // TBC //for (reset($p_header); $key = key($p_header); next($p_header)) { //} // ----- Transform UNIX mtime to DOS format mdate/mtime $v_date = getdate($p_header['mtime']); $v_mtime = ($v_date['hours'] << 11) + ($v_date['minutes'] << 5) + $v_date['seconds'] / 2; $v_mdate = (($v_date['year'] - 1980) << 9) + ($v_date['mon'] << 5) + $v_date['mday']; // ----- Packed data $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, $p_header['version'], $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len'], $p_header['comment_len'], $p_header['disk'], $p_header['internal'], $p_header['external'], $p_header['offset']); // ----- Write the 42 bytes of the header in the zip file fputs($this->zip_fd, $v_binary_data, 46); // ----- Write the variable fields if (strlen($p_header['stored_filename']) != 0) { fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); } if ($p_header['extra_len'] != 0) { fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); } if ($p_header['comment_len'] != 0) { fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privWriteCentralHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) { $v_result = 1; // ----- Packed data $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, $p_nb_entries, $p_size, $p_offset, strlen($p_comment)); // ----- Write the 22 bytes of the header in the zip file fputs($this->zip_fd, $v_binary_data, 22); // ----- Write the variable fields if (strlen($p_comment) != 0) { fputs($this->zip_fd, $p_comment, strlen($p_comment)); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privList() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privList(&$p_list) { $v_result = 1; // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Open the zip file if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \'' . $this->zipname . '\' in binary read mode'); // ----- Return return PclZip::errorCode(); } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Go to beginning of Central Dir @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_central_dir['offset'])) { $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read each entry for ($i = 0; $i < $v_central_dir['entries']; $i++) { // ----- Read the file header if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } $v_header['index'] = $i; // ----- Get the only interesting attributes $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); unset($v_header); } // ----- Close the zip file $this->privCloseFd(); // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privConvertHeader2FileInfo() // Description : // This function takes the file informations from the central directory // entries and extract the interesting parameters that will be given back. // The resulting file infos are set in the array $p_info // $p_info['filename'] : Filename with full path. Given by user (add), // extracted in the filesystem (extract). // $p_info['stored_filename'] : Stored filename in the archive. // $p_info['size'] = Size of the file. // $p_info['compressed_size'] = Compressed size of the file. // $p_info['mtime'] = Last modification date of the file. // $p_info['comment'] = Comment associated with the file. // $p_info['folder'] = true/false : indicates if the entry is a folder or not. // $p_info['status'] = status of the action on the file. // $p_info['crc'] = CRC of the file content. // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privConvertHeader2FileInfo($p_header, &$p_info) { $v_result = 1; // ----- Get the interesting attributes $v_temp_path = PclZipUtilPathReduction($p_header['filename']); $p_info['filename'] = $v_temp_path; $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); $p_info['stored_filename'] = $v_temp_path; $p_info['size'] = $p_header['size']; $p_info['compressed_size'] = $p_header['compressed_size']; $p_info['mtime'] = $p_header['mtime']; $p_info['comment'] = $p_header['comment']; $p_info['folder'] = (($p_header['external'] & 0x00000010) == 0x00000010); $p_info['index'] = $p_header['index']; $p_info['status'] = $p_header['status']; $p_info['crc'] = $p_header['crc']; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractByRule() // Description : // Extract a file or directory depending of rules (by index, by name, ...) // Parameters : // $p_file_list : An array where will be placed the properties of each // extracted file // $p_path : Path to add while writing the extracted files // $p_remove_path : Path to remove (from the file memorized path) while writing the // extracted files. If the path does not match the file path, // the file is extracted with its memorized path. // $p_remove_path does not apply to 'list' mode. // $p_path and $p_remove_path are commulative. // Return Values : // 1 on success,0 or less on error (see error code list) // -------------------------------------------------------------------------------- public function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) { $v_result = 1; // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Check the path if (($p_path == "") || ((substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../") && (substr($p_path, 1, 2) != ":/"))) { $p_path = "./" . $p_path; } // ----- Reduce the path last (and duplicated) '/' if (($p_path != "./") && ($p_path != "/")) { // ----- Look for the path end '/' while (substr($p_path, -1) == "/") { $p_path = substr($p_path, 0, strlen($p_path) - 1); } } // ----- Look for path to remove format (should end by /) if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) { $p_remove_path .= '/'; } $p_remove_path_size = strlen($p_remove_path); // ----- Open the zip file if (($v_result = $this->privOpenFd('rb')) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Start at beginning of Central Dir $v_pos_entry = $v_central_dir['offset']; // ----- Read each entry $j_start = 0; for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) { // ----- Read next Central dir entry @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_pos_entry)) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read the file header $v_header = array(); if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Store the index $v_header['index'] = $i; // ----- Store the file position $v_pos_entry = ftell($this->zip_fd); // ----- Look for the specific extract rules $v_extract = false; // ----- Look for extract by name rule if ((isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { // ----- Look if the filename is in the list for ($j = 0; ($j < sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) { // ----- Look for a directory if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") { // ----- Look if the directory is in the filename path if ((strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_extract = true; } // ----- Look for a filename } elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { $v_extract = true; } } // ----- Look for extract by ereg rule // ereg() is deprecated with PHP 5.3 /* elseif ( (isset($p_options[PCLZIP_OPT_BY_EREG])) && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { $v_extract = true; } } */ // ----- Look for extract by preg rule } elseif ((isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { $v_extract = true; } // ----- Look for extract by index rule } elseif ((isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { // ----- Look if the index is in the list for ($j = $j_start; ($j < sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) { if (($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i <= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { $v_extract = true; } if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { $j_start = $j + 1; } if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] > $i) { break; } } // ----- Look for no rule, which means extract all the archive } else { $v_extract = true; } // ----- Check compression method if (($v_extract) && (($v_header['compression'] != 8) && ($v_header['compression'] != 0))) { $v_header['status'] = 'unsupported_compression'; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, "Filename '" . $v_header['stored_filename'] . "' is " . "compressed by an unsupported compression " . "method (" . $v_header['compression'] . ") "); return PclZip::errorCode(); } } // ----- Check encrypted files if (($v_extract) && (($v_header['flag'] & 1) == 1)) { $v_header['status'] = 'unsupported_encryption'; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, "Unsupported encryption for " . " filename '" . $v_header['stored_filename'] . "'"); return PclZip::errorCode(); } } // ----- Look for real extraction if (($v_extract) && ($v_header['status'] != 'ok')) { $v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++]); if ($v_result != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } $v_extract = false; } // ----- Look for real extraction if ($v_extract) { // ----- Go to the file position @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_header['offset'])) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Look for extraction as string if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { $v_string = ''; // ----- Extracting the file $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } // ----- Get the only interesting attributes if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Set the file content $p_file_list[$v_nb_extracted]['content'] = $v_string; // ----- Next extracted file $v_nb_extracted++; // ----- Look for user callback abort if ($v_result1 == 2) { break; } // ----- Look for extraction in standard output } elseif ((isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { // ----- Extracting the file in standard output $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } // ----- Get the only interesting attributes if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Look for user callback abort if ($v_result1 == 2) { break; } // ----- Look for normal extraction } else { // ----- Extracting the file $v_result1 = $this->privExtractFile($v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } // ----- Get the only interesting attributes if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Look for user callback abort if ($v_result1 == 2) { break; } } } } // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFile() // Description : // Parameters : // Return Values : // // 1 : ... ? // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback // -------------------------------------------------------------------------------- public function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) { $v_result = 1; // ----- Read the file header if (($v_result = $this->privReadFileHeader($v_header)) != 1) { // ----- Return return $v_result; } // ----- Check that the file header is coherent with $p_entry info if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { // TBC } // ----- Look for all path to remove if ($p_remove_all_path == true) { // ----- Look for folder entry that not need to be extracted if (($p_entry['external'] & 0x00000010) == 0x00000010) { $p_entry['status'] = "filtered"; return $v_result; } // ----- Get the basename of the path $p_entry['filename'] = basename($p_entry['filename']); // ----- Look for path to remove } elseif ($p_remove_path != "") { if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) { // ----- Change the file status $p_entry['status'] = "filtered"; // ----- Return return $v_result; } $p_remove_path_size = strlen($p_remove_path); if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) { // ----- Remove the path $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); } } // Patch for Zip Traversal vulnerability if (strpos($p_entry['stored_filename'], '../') !== false || strpos($p_entry['stored_filename'], '..\\') !== false) { $p_entry['stored_filename'] = basename($p_entry['stored_filename']); $p_entry['filename'] = basename($p_entry['stored_filename']); } // ----- Add the path if ($p_path != '') { $p_entry['filename'] = $p_path . "/" . $p_entry['filename']; } // ----- Check a base_dir_restriction if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { $v_inclusion = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], $p_entry['filename']); if ($v_inclusion == 0) { PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, "Filename '" . $p_entry['filename'] . "' is " . "outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); return PclZip::errorCode(); } } // ----- Look for pre-extract callback if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_entry['status'] = "skipped"; $v_result = 1; } // ----- Look for abort result if ($v_result == 2) { // ----- This status is internal and will be changed in 'skipped' $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } // ----- Update the informations // Only some fields can be modified $p_entry['filename'] = $v_local_header['filename']; } // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Look for specific actions while the file exist if (file_exists($p_entry['filename'])) { // ----- Look if file is a directory if (is_dir($p_entry['filename'])) { // ----- Change the file status $p_entry['status'] = "already_a_directory"; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR // For historical reason first PclZip implementation does not stop // when this kind of error occurs. if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) { PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, "Filename '" . $p_entry['filename'] . "' is " . "already used by an existing directory"); return PclZip::errorCode(); } // ----- Look if file is write protected } elseif (!is_writeable($p_entry['filename'])) { // ----- Change the file status $p_entry['status'] = "write_protected"; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR // For historical reason first PclZip implementation does not stop // when this kind of error occurs. if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) { PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, "Filename '" . $p_entry['filename'] . "' exists " . "and is write protected"); return PclZip::errorCode(); } // ----- Look if the extracted file is older } elseif (filemtime($p_entry['filename']) > $p_entry['mtime']) { // ----- Change the file status if ((isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) && ($p_options[PCLZIP_OPT_REPLACE_NEWER] === true)) { } else { $p_entry['status'] = "newer_exist"; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR // For historical reason first PclZip implementation does not stop // when this kind of error occurs. if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) { PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, "Newer version of '" . $p_entry['filename'] . "' exists " . "and option PCLZIP_OPT_REPLACE_NEWER is not selected"); return PclZip::errorCode(); } } } else { } // ----- Check the directory availability and create it if necessary } else { if ((($p_entry['external'] & 0x00000010) == 0x00000010) || (substr($p_entry['filename'], -1) == '/')) { $v_dir_to_check = $p_entry['filename']; } elseif (!strstr($p_entry['filename'], "/")) { $v_dir_to_check = ""; } else { $v_dir_to_check = dirname($p_entry['filename']); } if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external'] & 0x00000010) == 0x00000010))) != 1) { // ----- Change the file status $p_entry['status'] = "path_creation_fail"; // ----- Return //return $v_result; $v_result = 1; } } } // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Do the extraction (if not a folder) if (!(($p_entry['external'] & 0x00000010) == 0x00000010)) { // ----- Look for not compressed file if ($p_entry['compression'] == 0) { // ----- Opening destination file if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { // ----- Change the file status $p_entry['status'] = "write_error"; // ----- Return return $v_result; } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = $p_entry['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); /* Try to speed up the code $v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($v_dest_file, $v_binary_data, $v_read_size); */ @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Closing the destination file fclose($v_dest_file); // ----- Change the file mtime touch($p_entry['filename'], $p_entry['mtime']); } else { // ----- TBC // Need to be finished if (($p_entry['flag'] & 1) == 1) { PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \'' . $p_entry['filename'] . '\' is encrypted. Encrypted files are not supported.'); return PclZip::errorCode(); } // ----- Look for using temporary file to unzip if ((!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])))) { $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); if ($v_result < PCLZIP_ERR_NO_ERROR) { return $v_result; } // ----- Look for extract in memory } else { // ----- Read the compressed file in a buffer (one shot) $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Decompress the file $v_file_content = @gzinflate($v_buffer); unset($v_buffer); if ($v_file_content === false) { // ----- Change the file status // TBC $p_entry['status'] = "error"; return $v_result; } // ----- Opening destination file if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { // ----- Change the file status $p_entry['status'] = "write_error"; return $v_result; } // ----- Write the uncompressed data @fwrite($v_dest_file, $v_file_content, $p_entry['size']); unset($v_file_content); // ----- Closing the destination file @fclose($v_dest_file); } // ----- Change the file mtime @touch($p_entry['filename'], $p_entry['mtime']); } // ----- Look for chmod option if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { // ----- Change the mode of the file @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); } } } // ----- Change abort status if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; // ----- Look for post-extract callback } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); // ----- Look for abort result if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFileUsingTempFile() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privExtractFileUsingTempFile(&$p_entry, &$p_options) { $v_result = 1; // ----- Creates a temporary file $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.gz'; if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { fclose($v_file); PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary write mode'); return PclZip::errorCode(); } // ----- Write gz file format header $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); @fwrite($v_dest_file, $v_binary_data, 10); // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = $p_entry['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Write gz file format footer $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); @fwrite($v_dest_file, $v_binary_data, 8); // ----- Close the temporary file @fclose($v_dest_file); // ----- Opening destination file if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { $p_entry['status'] = "write_error"; return $v_result; } // ----- Open the temporary gz file if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { @fclose($v_dest_file); $p_entry['status'] = "read_error"; PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary read mode'); return PclZip::errorCode(); } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = $p_entry['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($v_src_file, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } @fclose($v_dest_file); @gzclose($v_src_file); // ----- Delete the temporary file @unlink($v_gzip_temp_name); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFileInOutput() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privExtractFileInOutput(&$p_entry, &$p_options) { $v_result = 1; // ----- Read the file header if (($v_result = $this->privReadFileHeader($v_header)) != 1) { return $v_result; } // ----- Check that the file header is coherent with $p_entry info if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { // TBC } // ----- Look for pre-extract callback if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_entry['status'] = "skipped"; $v_result = 1; } // ----- Look for abort result if ($v_result == 2) { // ----- This status is internal and will be changed in 'skipped' $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } // ----- Update the informations // Only some fields can be modified $p_entry['filename'] = $v_local_header['filename']; } // ----- Trace // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Do the extraction (if not a folder) if (!(($p_entry['external'] & 0x00000010) == 0x00000010)) { // ----- Look for not compressed file if ($p_entry['compressed_size'] == $p_entry['size']) { // ----- Read the file in a buffer (one shot) $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Send the file to the output echo $v_buffer; unset($v_buffer); } else { // ----- Read the compressed file in a buffer (one shot) $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Decompress the file $v_file_content = gzinflate($v_buffer); unset($v_buffer); // ----- Send the file to the output echo $v_file_content; unset($v_file_content); } } } // ----- Change abort status if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; // ----- Look for post-extract callback } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); // ----- Look for abort result if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFileAsString() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) { $v_result = 1; // ----- Read the file header $v_header = array(); if (($v_result = $this->privReadFileHeader($v_header)) != 1) { // ----- Return return $v_result; } // ----- Check that the file header is coherent with $p_entry info if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { // TBC } // ----- Look for pre-extract callback if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_entry['status'] = "skipped"; $v_result = 1; } // ----- Look for abort result if ($v_result == 2) { // ----- This status is internal and will be changed in 'skipped' $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } // ----- Update the informations // Only some fields can be modified $p_entry['filename'] = $v_local_header['filename']; } // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Do the extraction (if not a folder) if (!(($p_entry['external'] & 0x00000010) == 0x00000010)) { // ----- Look for not compressed file // if ($p_entry['compressed_size'] == $p_entry['size']) if ($p_entry['compression'] == 0) { // ----- Reading the file $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); } else { // ----- Reading the file $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Decompress the file if (($p_string = @gzinflate($v_data)) === false) { // TBC } } // ----- Trace } else { // TBC : error : can not extract a folder in a string } } // ----- Change abort status if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; // ----- Look for post-extract callback } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Swap the content to header $v_local_header['content'] = $p_string; $p_string = ''; // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); // ----- Swap back the content to header $p_string = $v_local_header['content']; unset($v_local_header['content']); // ----- Look for abort result if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privReadFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privReadFileHeader(&$p_header) { $v_result = 1; // ----- Read the 4 bytes signature $v_binary_data = @fread($this->zip_fd, 4); $v_data = unpack('Vid', $v_binary_data); // ----- Check signature if ($v_data['id'] != 0x04034b50) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); // ----- Return return PclZip::errorCode(); } // ----- Read the first 42 bytes of the header $v_binary_data = fread($this->zip_fd, 26); // ----- Look for invalid block size if (strlen($v_binary_data) != 26) { $p_header['filename'] = ""; $p_header['status'] = "invalid_header"; // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : " . strlen($v_binary_data)); // ----- Return return PclZip::errorCode(); } // ----- Extract the values $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); // ----- Get filename $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); // ----- Get extra_fields if ($v_data['extra_len'] != 0) { $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); } else { $p_header['extra'] = ''; } // ----- Extract properties $p_header['version_extracted'] = $v_data['version']; $p_header['compression'] = $v_data['compression']; $p_header['size'] = $v_data['size']; $p_header['compressed_size'] = $v_data['compressed_size']; $p_header['crc'] = $v_data['crc']; $p_header['flag'] = $v_data['flag']; $p_header['filename_len'] = $v_data['filename_len']; // ----- Recuperate date in UNIX format $p_header['mdate'] = $v_data['mdate']; $p_header['mtime'] = $v_data['mtime']; if ($p_header['mdate'] && $p_header['mtime']) { // ----- Extract time $v_hour = ($p_header['mtime'] & 0xF800) >> 11; $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; $v_seconde = ($p_header['mtime'] & 0x001F) * 2; // ----- Extract date $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; $v_month = ($p_header['mdate'] & 0x01E0) >> 5; $v_day = $p_header['mdate'] & 0x001F; // ----- Get UNIX date format $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); } else { $p_header['mtime'] = time(); } // TBC //for (reset($v_data); $key = key($v_data); next($v_data)) { //} // ----- Set the stored filename $p_header['stored_filename'] = $p_header['filename']; // ----- Set the status field $p_header['status'] = "ok"; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privReadCentralFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privReadCentralFileHeader(&$p_header) { $v_result = 1; // ----- Read the 4 bytes signature $v_binary_data = @fread($this->zip_fd, 4); $v_data = unpack('Vid', $v_binary_data); // ----- Check signature if ($v_data['id'] != 0x02014b50) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); // ----- Return return PclZip::errorCode(); } // ----- Read the first 42 bytes of the header $v_binary_data = fread($this->zip_fd, 42); // ----- Look for invalid block size if (strlen($v_binary_data) != 42) { $p_header['filename'] = ""; $p_header['status'] = "invalid_header"; // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : " . strlen($v_binary_data)); // ----- Return return PclZip::errorCode(); } // ----- Extract the values $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); // ----- Get filename if ($p_header['filename_len'] != 0) { $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); } else { $p_header['filename'] = ''; } // ----- Get extra if ($p_header['extra_len'] != 0) { $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); } else { $p_header['extra'] = ''; } // ----- Get comment if ($p_header['comment_len'] != 0) { $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); } else { $p_header['comment'] = ''; } // ----- Extract properties // ----- Recuperate date in UNIX format //if ($p_header['mdate'] && $p_header['mtime']) // TBC : bug : this was ignoring time with 0/0/0 if (1) { // ----- Extract time $v_hour = ($p_header['mtime'] & 0xF800) >> 11; $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; $v_seconde = ($p_header['mtime'] & 0x001F) * 2; // ----- Extract date $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; $v_month = ($p_header['mdate'] & 0x01E0) >> 5; $v_day = $p_header['mdate'] & 0x001F; // ----- Get UNIX date format $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); } else { $p_header['mtime'] = time(); } // ----- Set the stored filename $p_header['stored_filename'] = $p_header['filename']; // ----- Set default status to ok $p_header['status'] = 'ok'; // ----- Look if it is a directory if (substr($p_header['filename'], -1) == '/') { //$p_header['external'] = 0x41FF0010; $p_header['external'] = 0x00000010; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCheckFileHeaders() // Description : // Parameters : // Return Values : // 1 on success, // 0 on error; // -------------------------------------------------------------------------------- public function privCheckFileHeaders(&$p_local_header, &$p_central_header) { $v_result = 1; // ----- Check the static values // TBC if ($p_local_header['filename'] != $p_central_header['filename']) { } if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { } if ($p_local_header['flag'] != $p_central_header['flag']) { } if ($p_local_header['compression'] != $p_central_header['compression']) { } if ($p_local_header['mtime'] != $p_central_header['mtime']) { } if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { } // ----- Look for flag bit 3 if (($p_local_header['flag'] & 8) == 8) { $p_local_header['size'] = $p_central_header['size']; $p_local_header['compressed_size'] = $p_central_header['compressed_size']; $p_local_header['crc'] = $p_central_header['crc']; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privReadEndCentralDir() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privReadEndCentralDir(&$p_central_dir) { $v_result = 1; // ----- Go to the end of the zip file $v_size = filesize($this->zipname); @fseek($this->zip_fd, $v_size); if (@ftell($this->zip_fd) != $v_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \'' . $this->zipname . '\''); // ----- Return return PclZip::errorCode(); } // ----- First try : look if this is an archive with no commentaries (most of the time) // in this case the end of central dir is at 22 bytes of the file end $v_found = 0; if ($v_size > 26) { @fseek($this->zip_fd, $v_size - 22); if (($v_pos = @ftell($this->zip_fd)) != ($v_size - 22)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \'' . $this->zipname . '\''); // ----- Return return PclZip::errorCode(); } // ----- Read for bytes $v_binary_data = @fread($this->zip_fd, 4); $v_data = @unpack('Vid', $v_binary_data); // ----- Check signature if ($v_data['id'] == 0x06054b50) { $v_found = 1; } $v_pos = ftell($this->zip_fd); } // ----- Go back to the maximum possible size of the Central Dir End Record if (!$v_found) { $v_maximum_size = 65557; // 0xFFFF + 22; if ($v_maximum_size > $v_size) { $v_maximum_size = $v_size; } @fseek($this->zip_fd, $v_size - $v_maximum_size); if (@ftell($this->zip_fd) != ($v_size - $v_maximum_size)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \'' . $this->zipname . '\''); // ----- Return return PclZip::errorCode(); } // ----- Read byte per byte in order to find the signature $v_pos = ftell($this->zip_fd); $v_bytes = 0x00000000; while ($v_pos < $v_size) { // ----- Read a byte $v_byte = @fread($this->zip_fd, 1); // ----- Add the byte //$v_bytes = ($v_bytes << 8) | Ord($v_byte); // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. $v_bytes = (($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); // ----- Compare the bytes if ($v_bytes == 0x504b0506) { $v_pos++; break; } $v_pos++; } // ----- Look if not found end of central dir if ($v_pos == $v_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); // ----- Return return PclZip::errorCode(); } } // ----- Read the first 18 bytes of the header $v_binary_data = fread($this->zip_fd, 18); // ----- Look for invalid block size if (strlen($v_binary_data) != 18) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : " . strlen($v_binary_data)); // ----- Return return PclZip::errorCode(); } // ----- Extract the values $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); // ----- Check the global size if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { // ----- Removed in release 2.2 see readme file // The check of the file size is a little too strict. // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. // While decrypted, zip has training 0 bytes if (0) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'The central dir is not at the end of the archive.' . ' Some trailing bytes exists after the archive.'); // ----- Return return PclZip::errorCode(); } } // ----- Get comment if ($v_data['comment_size'] != 0) { $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); } else { $p_central_dir['comment'] = ''; } $p_central_dir['entries'] = $v_data['entries']; $p_central_dir['disk_entries'] = $v_data['disk_entries']; $p_central_dir['offset'] = $v_data['offset']; $p_central_dir['size'] = $v_data['size']; $p_central_dir['disk'] = $v_data['disk']; $p_central_dir['disk_start'] = $v_data['disk_start']; // TBC //for (reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { //} // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDeleteByRule() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privDeleteByRule(&$p_result_list, &$p_options) { $v_result = 1; $v_list_detail = array(); // ----- Open the zip file if (($v_result = $this->privOpenFd('rb')) != 1) { // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); return $v_result; } // ----- Go to beginning of File @rewind($this->zip_fd); // ----- Scan all the files // ----- Start at beginning of Central Dir $v_pos_entry = $v_central_dir['offset']; @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_pos_entry)) { // ----- Close the zip file $this->privCloseFd(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read each entry $v_header_list = array(); $j_start = 0; for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) { // ----- Read the file header $v_header_list[$v_nb_extracted] = array(); if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) { // ----- Close the zip file $this->privCloseFd(); return $v_result; } // ----- Store the index $v_header_list[$v_nb_extracted]['index'] = $i; // ----- Look for the specific extract rules $v_found = false; // ----- Look for extract by name rule if ((isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { // ----- Look if the filename is in the list for ($j = 0; ($j < sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) { // ----- Look for a directory if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") { // ----- Look if the directory is in the filename path if ((strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_found = true; } elseif ((($v_header_list[$v_nb_extracted]['external'] & 0x00000010) == 0x00000010) /* Indicates a folder */ && ($v_header_list[$v_nb_extracted]['stored_filename'] . '/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_found = true; } // ----- Look for a filename } elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { $v_found = true; } } // ----- Look for extract by ereg rule // ereg() is deprecated with PHP 5.3 /* elseif ( (isset($p_options[PCLZIP_OPT_BY_EREG])) && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { $v_found = true; } } */ // ----- Look for extract by preg rule } elseif ((isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { $v_found = true; } // ----- Look for extract by index rule } elseif ((isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { // ----- Look if the index is in the list for ($j = $j_start; ($j < sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) { if (($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i <= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { $v_found = true; } if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { $j_start = $j + 1; } if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] > $i) { break; } } } else { $v_found = true; } // ----- Look for deletion if ($v_found) { unset($v_header_list[$v_nb_extracted]); } else { $v_nb_extracted++; } } // ----- Look if something need to be deleted if ($v_nb_extracted > 0) { // ----- Creates a temporay file $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp'; // ----- Creates a temporary zip archive $v_temp_zip = new PclZip($v_zip_temp_name); // ----- Open the temporary zip file in write mode if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { $this->privCloseFd(); // ----- Return return $v_result; } // ----- Look which file need to be kept for ($i = 0; $i < sizeof($v_header_list); $i++) { // ----- Calculate the position of the header @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read the file header $v_local_header = array(); if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Check that local file header is same as central file header if ($this->privCheckFileHeaders($v_local_header, $v_header_list[$i]) != 1) { // TBC } unset($v_local_header); // ----- Write the file header if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Read/write the data block if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } } // ----- Store the offset of the central dir $v_offset = @ftell($v_temp_zip->zip_fd); // ----- Re-Create the Central Dir files header for ($i = 0; $i < sizeof($v_header_list); $i++) { // ----- Create the file header if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) { $v_temp_zip->privCloseFd(); $this->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Transform the header to a 'usable' info $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } // ----- Zip file comment $v_comment = ''; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } // ----- Calculate the size of the central header $v_size = @ftell($v_temp_zip->zip_fd) - $v_offset; // ----- Create the central dir footer if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { // ----- Reset the file list unset($v_header_list); $v_temp_zip->privCloseFd(); $this->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Close $v_temp_zip->privCloseFd(); $this->privCloseFd(); // ----- Delete the zip file // TBC : I should test the result ... @unlink($this->zipname); // ----- Rename the temporary file // TBC : I should test the result ... //@rename($v_zip_temp_name, $this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); // ----- Destroy the temporary archive unset($v_temp_zip); // ----- Remove every files : reset the file } elseif ($v_central_dir['entries'] != 0) { $this->privCloseFd(); if (($v_result = $this->privOpenFd('wb')) != 1) { return $v_result; } if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { return $v_result; } $this->privCloseFd(); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDirCheck() // Description : // Check if a directory exists, if not it creates it and all the parents directory // which may be useful. // Parameters : // $p_dir : Directory path to check. // Return Values : // 1 : OK // -1 : Unable to create directory // -------------------------------------------------------------------------------- public function privDirCheck($p_dir, $p_is_dir = false) { $v_result = 1; // ----- Remove the final '/' if (($p_is_dir) && (substr($p_dir, -1) == '/')) { $p_dir = substr($p_dir, 0, strlen($p_dir) - 1); } // ----- Check the directory availability if ((is_dir($p_dir)) || ($p_dir == "")) { return 1; } // ----- Extract parent directory $p_parent_dir = dirname($p_dir); // ----- Just a check if ($p_parent_dir != $p_dir) { // ----- Look for parent directory if ($p_parent_dir != "") { if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) { return $v_result; } } } // ----- Create the directory if (!@mkdir($p_dir, 0777)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); // ----- Return return PclZip::errorCode(); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privMerge() // Description : // If $p_archive_to_add does not exist, the function exit with a success result. // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privMerge(&$p_archive_to_add) { $v_result = 1; // ----- Look if the archive_to_add exists if (!is_file($p_archive_to_add->zipname)) { // ----- Nothing to merge, so merge is a success $v_result = 1; // ----- Return return $v_result; } // ----- Look if the archive exists if (!is_file($this->zipname)) { // ----- Do a duplicate $v_result = $this->privDuplicate($p_archive_to_add->zipname); // ----- Return return $v_result; } // ----- Open the zip file if (($v_result = $this->privOpenFd('rb')) != 1) { // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); return $v_result; } // ----- Go to beginning of File @rewind($this->zip_fd); // ----- Open the archive_to_add file if (($v_result = $p_archive_to_add->privOpenFd('rb')) != 1) { $this->privCloseFd(); // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir_to_add = array(); if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); return $v_result; } // ----- Go to beginning of File @rewind($p_archive_to_add->zip_fd); // ----- Creates a temporay file $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp'; // ----- Open the temporary file in write mode if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_zip_temp_name . '\' in binary write mode'); // ----- Return return PclZip::errorCode(); } // ----- Copy the files from the archive to the temporary file // TBC : Here I should better append the file and go back to erase the central dir $v_size = $v_central_dir['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Copy the files from the archive_to_add into the temporary file $v_size = $v_central_dir_to_add['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Store the offset of the central dir $v_offset = @ftell($v_zip_temp_fd); // ----- Copy the block of file headers from the old archive $v_size = $v_central_dir['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Copy the block of file headers from the archive_to_add $v_size = $v_central_dir_to_add['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Merge the file comments $v_comment = $v_central_dir['comment'] . ' ' . $v_central_dir_to_add['comment']; // ----- Calculate the size of the (new) central header $v_size = @ftell($v_zip_temp_fd) - $v_offset; // ----- Swap the file descriptor // Here is a trick : I swap the temporary fd with the zip fd, in order to use // the following methods on the temporary fil and not the real archive fd $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Create the central dir footer if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries'] + $v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); @fclose($v_zip_temp_fd); $this->zip_fd = null; // ----- Reset the file list unset($v_header_list); // ----- Return return $v_result; } // ----- Swap back the file descriptor $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Close $this->privCloseFd(); $p_archive_to_add->privCloseFd(); // ----- Close the temporary file @fclose($v_zip_temp_fd); // ----- Delete the zip file // TBC : I should test the result ... @unlink($this->zipname); // ----- Rename the temporary file // TBC : I should test the result ... //@rename($v_zip_temp_name, $this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDuplicate() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privDuplicate($p_archive_filename) { $v_result = 1; // ----- Look if the $p_archive_filename exists if (!is_file($p_archive_filename)) { // ----- Nothing to duplicate, so duplicate is a success. $v_result = 1; // ----- Return return $v_result; } // ----- Open the zip file if (($v_result = $this->privOpenFd('wb')) != 1) { // ----- Return return $v_result; } // ----- Open the temporary file in write mode if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) { $this->privCloseFd(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \'' . $p_archive_filename . '\' in binary write mode'); // ----- Return return PclZip::errorCode(); } // ----- Copy the files from the archive to the temporary file // TBC : Here I should better append the file and go back to erase the central dir $v_size = filesize($p_archive_filename); while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($v_zip_temp_fd, $v_read_size); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Close $this->privCloseFd(); // ----- Close the temporary file @fclose($v_zip_temp_fd); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privErrorLog() // Description : // Parameters : // -------------------------------------------------------------------------------- public function privErrorLog($p_error_code = 0, $p_error_string = '') { if (PCLZIP_ERROR_EXTERNAL == 1) { PclError($p_error_code, $p_error_string); } else { $this->error_code = $p_error_code; $this->error_string = $p_error_string; } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privErrorReset() // Description : // Parameters : // -------------------------------------------------------------------------------- public function privErrorReset() { if (PCLZIP_ERROR_EXTERNAL == 1) { PclErrorReset(); } else { $this->error_code = 0; $this->error_string = ''; } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDisableMagicQuotes() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privDisableMagicQuotes() { $v_result = 1; // ----- Look if function exists if ((!function_exists("get_magic_quotes_runtime")) || (!function_exists("set_magic_quotes_runtime"))) { return $v_result; } // ----- Look if already done if ($this->magic_quotes_status != -1) { return $v_result; } // ----- Get and memorize the magic_quote value $this->magic_quotes_status = @get_magic_quotes_runtime(); // ----- Disable magic_quotes if ($this->magic_quotes_status == 1) { @set_magic_quotes_runtime(0); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privSwapBackMagicQuotes() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- public function privSwapBackMagicQuotes() { $v_result = 1; // ----- Look if function exists if ((!function_exists("get_magic_quotes_runtime")) || (!function_exists("set_magic_quotes_runtime"))) { return $v_result; } // ----- Look if something to do if ($this->magic_quotes_status != -1) { return $v_result; } // ----- Swap back magic_quotes if ($this->magic_quotes_status == 1) { @set_magic_quotes_runtime($this->magic_quotes_status); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- } // End of class // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilPathReduction() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function PclZipUtilPathReduction($p_dir) { $v_result = ""; // ----- Look for not empty path if ($p_dir != "") { // ----- Explode path by directory names $v_list = explode("/", $p_dir); // ----- Study directories from last to first $v_skip = 0; for ($i = sizeof($v_list) - 1; $i >= 0; $i--) { // ----- Look for current path if ($v_list[$i] == ".") { // ----- Ignore this directory // Should be the first $i=0, but no check is done } elseif ($v_list[$i] == "..") { $v_skip++; } elseif ($v_list[$i] == "") { // ----- First '/' i.e. root slash if ($i == 0) { $v_result = "/" . $v_result; if ($v_skip > 0) { // ----- It is an invalid path, so the path is not modified // TBC $v_result = $p_dir; $v_skip = 0; } // ----- Last '/' i.e. indicates a directory } elseif ($i == (sizeof($v_list) - 1)) { $v_result = $v_list[$i]; // ----- Double '/' inside the path } else { // ----- Ignore only the double '//' in path, // but not the first and last '/' } } else { // ----- Look for item to skip if ($v_skip > 0) { $v_skip--; } else { $v_result = $v_list[$i] . ($i != (sizeof($v_list) - 1) ? "/" . $v_result : ""); } } } // ----- Look for skip if ($v_skip > 0) { while ($v_skip > 0) { $v_result = '../' . $v_result; $v_skip--; } } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilPathInclusion() // Description : // This function indicates if the path $p_path is under the $p_dir tree. Or, // said in an other way, if the file or sub-dir $p_path is inside the dir // $p_dir. // The function indicates also if the path is exactly the same as the dir. // This function supports path with duplicated '/' like '//', but does not // support '.' or '..' statements. // Parameters : // Return Values : // 0 if $p_path is not inside directory $p_dir // 1 if $p_path is inside directory $p_dir // 2 if $p_path is exactly the same as $p_dir // -------------------------------------------------------------------------------- function PclZipUtilPathInclusion($p_dir, $p_path) { $v_result = 1; // ----- Look for path beginning by ./ if (($p_dir == '.') || ((strlen($p_dir) >= 2) && (substr($p_dir, 0, 2) == './'))) { $p_dir = PclZipUtilTranslateWinPath(getcwd(), false) . '/' . substr($p_dir, 1); } if (($p_path == '.') || ((strlen($p_path) >= 2) && (substr($p_path, 0, 2) == './'))) { $p_path = PclZipUtilTranslateWinPath(getcwd(), false) . '/' . substr($p_path, 1); } // ----- Explode dir and path by directory separator $v_list_dir = explode("/", $p_dir); $v_list_dir_size = sizeof($v_list_dir); $v_list_path = explode("/", $p_path); $v_list_path_size = sizeof($v_list_path); // ----- Study directories paths $i = 0; $j = 0; while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { // ----- Look for empty dir (path reduction) if ($v_list_dir[$i] == '') { $i++; continue; } if ($v_list_path[$j] == '') { $j++; continue; } // ----- Compare the items if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ($v_list_path[$j] != '')) { $v_result = 0; } // ----- Next items $i++; $j++; } // ----- Look if everything seems to be the same if ($v_result) { // ----- Skip all the empty items while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) { $j++; } while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) { $i++; } if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { // ----- There are exactly the same $v_result = 2; } elseif ($i < $v_list_dir_size) { // ----- The path is shorter than the dir $v_result = 0; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilCopyBlock() // Description : // Parameters : // $p_mode : read/write compression mode // 0 : src & dest normal // 1 : src gzip, dest normal // 2 : src normal, dest gzip // 3 : src & dest gzip // Return Values : // -------------------------------------------------------------------------------- function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode = 0) { $v_result = 1; if ($p_mode == 0) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_src, $v_read_size); @fwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } elseif ($p_mode == 1) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($p_src, $v_read_size); @fwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } elseif ($p_mode == 2) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_src, $v_read_size); @gzwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } elseif ($p_mode == 3) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($p_src, $v_read_size); @gzwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilRename() // Description : // This function tries to do a simple rename() function. If it fails, it // tries to copy the $p_src file in a new $p_dest file and then unlink the // first one. // Parameters : // $p_src : Old filename // $p_dest : New filename // Return Values : // 1 on success, 0 on failure. // -------------------------------------------------------------------------------- function PclZipUtilRename($p_src, $p_dest) { $v_result = 1; // ----- Try to rename the files if (!@rename($p_src, $p_dest)) { // ----- Try to copy & unlink the src if (!@copy($p_src, $p_dest)) { $v_result = 0; } elseif (!@unlink($p_src)) { $v_result = 0; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilOptionText() // Description : // Translate option value in text. Mainly for debug purpose. // Parameters : // $p_option : the option value. // Return Values : // The option text value. // -------------------------------------------------------------------------------- function PclZipUtilOptionText($p_option) { $v_list = get_defined_constants(); for (reset($v_list); $v_key = key($v_list); next($v_list)) { $v_prefix = substr($v_key, 0, 10); if ((($v_prefix == 'PCLZIP_OPT') || ($v_prefix == 'PCLZIP_CB_') || ($v_prefix == 'PCLZIP_ATT')) && ($v_list[$v_key] == $p_option)) { return $v_key; } } $v_result = 'Unknown'; return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilTranslateWinPath() // Description : // Translate windows path by replacing '\' by '/' and optionally removing // drive letter. // Parameters : // $p_path : path to translate. // $p_remove_disk_letter : true | false // Return Values : // The path translated. // -------------------------------------------------------------------------------- function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter = true) { if (stristr(php_uname(), 'windows')) { // ----- Look for potential disk letter if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { $p_path = substr($p_path, $v_position + 1); } // ----- Change potential windows directory separator if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\')) { $p_path = strtr($p_path, '\\', '/'); } } return $p_path; } // -------------------------------------------------------------------------------- ================================================ FILE: modules/UserCenter/common/head.php ================================================ description; if($this->is('single') && $this->fields->seo_dec !== ''){ $seo_description = $this->fields->seo_dec; } if($this->is('category') && $this->getDescription() !== NULL){ $seo_description = $this->getDescription(); } if(Bsoptions('keywords_hide') == true){ $keywords = '&keywords=0'; } if(empty(Bsoptions('IframeProtect')) || Bsoptions('IframeProtect') !== '1'){ switch(Bsoptions('IframeProtect')){ case '2': header('X-Frame-Options:SAMEORIGIN'); break; case '3': header('X-Frame-Options:DENY'); break; } } ?> class="gray"> crossorign> 用户中心 - <?php echo $this->options->title;?> header('commentReply=1&description='.$keywords.'&pingback=0&xmlrpc=0&wlw=0&generator=&template=&atom='); ?> oncontextmenu='return false' ondragstart='return false' onselectstart ='return false' onselect='document.selection.empty()' oncopy='document.selection.empty()' onbeforecopy='return false' data-instant-allow-external-links>
            header('commentReply=1&description=0&keywords=0&generator=0&template=0&pingback=0&xmlrpc=0&wlw=0&rss2=0&rss1=0&antiSpam=0&atom'); ?>
            ================================================ FILE: modules/UserCenter/user.php ================================================ need('modules/UserCenter/common/head.php'); ?>
            • 用户首页
            • 资料信息
            • user->group !== 'subscriber' && $this->user->submission == '1' && Bsoptions('UserCenter_tougaoOpen') == true) || $this->user->group == 'administrator'):?>
            • 我要投稿
            • 我的动态
            • 稿件列表
            • 我的通知
            • user->group == 'administrator' || $this->user->group == 'editor'):?>
            • 管理后台
            • 退出登录

            欢迎来到 title();?> 用户中心

            今天是
            user->uid); ?>
            投稿文章数
            个人主页
            user->coins; ?>
            积分
            user->coins) == ''):?> 暂无等级 user->coins); ?>
            您的等级
            user->uid); ?>
            每日签到
            继续加油吧~
            • *账号不允许更改

            • *该项为必填项,请填入您的个性昵称

            • *该项为必填项,请填入您的个人主页地址

            • *该项为必填项,请填入您的邮箱地址

            • 请填入您的个性签名

            • 投稿前请注意投稿内容不得出现违法内容以及违禁词,违者将封禁投稿权限

            • *该项为必填项,请填入投稿标题

            • *该项为必选项,请根据您所投稿的内容选择要投稿的栏目

            • *该项为必填项,请填入您的投稿内容

            • *请填入以上验证码,区分大小写

              *若提交,则表示您已阅读本站投稿须知并严格遵守本站关于投稿的相关要求
              审核通过的文章可以通过点击投稿标题进入文章页面噢~
              投稿标题 投稿时间 投稿栏目 状态
            • *发表您的每日动态,记录美好生活

              user->uid) !== ''):?> user->uid) as $usertz):?>
              -
              - format('Y年m月d日');?>
            need('compoment/foot.php'); ?> ================================================ FILE: modules/Verify/BearCaptcha/Captcha/Captcha.php ================================================ ================================================ FILE: modules/Verify/BearCaptcha/Captcha/Captcha_Link.php ================================================ ================================================ FILE: modules/Verify/BearCaptcha/Captcha/Captcha_Memo.php ================================================ ================================================ FILE: modules/Verify/BearCaptcha/Dingxiang/DX_Captcha.php ================================================
            ================================================ FILE: modules/Verify/BearCaptcha/Dingxiang/DX_Captcha_Link.php ================================================
            ================================================ FILE: modules/Verify/BearCaptcha/Dingxiang/DX_Captcha_Memo.php ================================================
            ================================================ FILE: modules/Verify/BearCaptcha/Geetest/Geetest.php ================================================
            ================================================ FILE: modules/Verify/BearCaptcha/Geetest/Geetest_Link.php ================================================
            ================================================ FILE: modules/Verify/BearCaptcha/Geetest/Geetest_Memo.php ================================================
            ================================================ FILE: modules/Verify/BearCaptcha/Geetest/Geetest_Message.php ================================================
            ================================================ FILE: modules/Verify/BearCaptcha/Turnstile/Turnstile.php ================================================
            ================================================ FILE: modules/Verify/BearCaptcha/Turnstile/Turnstile_Link.php ================================================
            ================================================ FILE: modules/Verify/BearCaptcha/Turnstile/Turnstile_Memo.php ================================================
            ================================================ FILE: modules/Verify/BearCaptcha/Vaptcha/Vaptcha.php ================================================
            Vaptcha 初始化中...
            ================================================ FILE: modules/Verify/BearCaptcha/Vaptcha/Vaptcha_Link.php ================================================
            Vaptcha 初始化中...
            ================================================ FILE: modules/Verify/BearCaptcha/Vaptcha/Vaptcha_Memo.php ================================================
            Vaptcha 初始化中...
            ================================================ FILE: modules/codehightlight/static/prism.js ================================================ /* PrismJS 1.29.0 https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+abap+abnf+actionscript+ada+agda+al+antlr4+apacheconf+apex+apl+applescript+aql+arduino+arff+armasm+arturo+asciidoc+aspnet+asm6502+asmatmel+autohotkey+autoit+avisynth+avro-idl+awk+bash+basic+batch+bbcode+bbj+bicep+birb+bison+bnf+bqn+brainfuck+brightscript+bro+bsl+c+csharp+cpp+cfscript+chaiscript+cil+cilkc+cilkcpp+clojure+cmake+cobol+coffeescript+concurnas+csp+cooklang+coq+crystal+css-extras+csv+cue+cypher+d+dart+dataweave+dax+dhall+diff+django+dns-zone-file+docker+dot+ebnf+editorconfig+eiffel+ejs+elixir+elm+etlua+erb+erlang+excel-formula+fsharp+factor+false+firestore-security-rules+flow+fortran+ftl+gml+gap+gcode+gdscript+gedcom+gettext+gherkin+git+glsl+gn+linker-script+go+go-module+gradle+graphql+groovy+haml+handlebars+haskell+haxe+hcl+hlsl+hoon+http+hpkp+hsts+ichigojam+icon+icu-message-format+idris+ignore+inform7+ini+io+j+java+javadoc+javadoclike+javastacktrace+jexl+jolie+jq+jsdoc+js-extras+json+json5+jsonp+jsstacktrace+js-templates+julia+keepalived+keyman+kotlin+kumir+kusto+latex+latte+less+lilypond+liquid+lisp+livescript+llvm+log+lolcode+lua+magma+makefile+markdown+markup-templating+mata+matlab+maxscript+mel+mermaid+metafont+mizar+mongodb+monkey+moonscript+n1ql+n4js+nand2tetris-hdl+naniscript+nasm+neon+nevod+nginx+nim+nix+nsis+objectivec+ocaml+odin+opencl+openqasm+oz+parigp+parser+pascal+pascaligo+psl+pcaxis+peoplecode+perl+php+phpdoc+php-extras+plant-uml+plsql+powerquery+powershell+processing+prolog+promql+properties+protobuf+pug+puppet+pure+purebasic+purescript+python+qsharp+q+qml+qore+r+racket+cshtml+jsx+tsx+reason+regex+rego+renpy+rescript+rest+rip+roboconf+robotframework+ruby+rust+sas+sass+scss+scala+scheme+shell-session+smali+smalltalk+smarty+sml+solidity+solution-file+soy+sparql+splunk-spl+sqf+sql+squirrel+stan+stata+iecst+stylus+supercollider+swift+systemd+t4-templating+t4-cs+t4-vb+tap+tcl+tt2+textile+toml+tremor+turtle+twig+typescript+typoscript+unrealscript+uorazor+uri+v+vala+vbnet+velocity+verilog+vhdl+vim+visual-basic+warpscript+wasm+web-idl+wgsl+wiki+wolfram+wren+xeora+xml-doc+xojo+xquery+yaml+yang+zig&plugins=line-numbers+show-language+toolbar+copy-to-clipboard */ var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; !function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; Prism.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}; !function(n){var i="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";n.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+i+"|<"+i+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}}(Prism); Prism.languages.actionscript=Prism.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),Prism.languages.actionscript["class-name"].alias="function",delete Prism.languages.actionscript.parameter,delete Prism.languages.actionscript["literal-property"],Prism.languages.markup&&Prism.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:Prism.languages.markup}}); Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}; !function(t){t.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}}(Prism); Prism.languages.al={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},function:{pattern:/(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,lookbehind:!0},keyword:[/\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,/\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i],number:/\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|LL?|U(?:LL?)?)?\b/i,boolean:/\b(?:false|true)\b/i,variable:/\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\b/,"class-name":/\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,operator:/\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,punctuation:/[()\[\]{}:.;,]/}; Prism.languages.antlr4={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,string:{pattern:/'(?:\\.|[^\\'\r\n])*'/,greedy:!0},"character-class":{pattern:/\[(?:\\.|[^\\\]\r\n])*\]/,greedy:!0,alias:"regex",inside:{range:{pattern:/([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,lookbehind:!0,alias:"punctuation"},escape:/\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,punctuation:/[\[\]]/}},action:{pattern:/\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,greedy:!0,inside:{content:{pattern:/(\{)[\s\S]+(?=\})/,lookbehind:!0},punctuation:/[{}]/}},command:{pattern:/(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,lookbehind:!0,inside:{function:/\b\w+(?=\s*(?:[,(]|$))/,punctuation:/[,()]/}},annotation:{pattern:/@\w+(?:::\w+)*/,alias:"keyword"},label:{pattern:/#[ \t]*\w+/,alias:"punctuation"},keyword:/\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,definition:[{pattern:/\b[a-z]\w*(?=\s*:)/,alias:["rule","class-name"]},{pattern:/\b[A-Z]\w*(?=\s*:)/,alias:["token","constant"]}],constant:/\b[A-Z][A-Z_]*\b/,operator:/\.\.|->|[|~]|[*+?]\??/,punctuation:/[;:()=]/},Prism.languages.g4=Prism.languages.antlr4; Prism.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/}; Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; !function(e){var t=/\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i,n="\\b(?:(?=[a-z_]\\w*\\s*[<\\[])|(?!))[A-Z_]\\w*(?:\\s*\\.\\s*[A-Z_]\\w*)*\\b(?:\\s*(?:\\[\\s*\\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*".replace(//g,(function(){return t.source}));function i(e){return RegExp(e.replace(//g,(function(){return n})),"i")}var a={keyword:t,punctuation:/[()\[\]{};,:.<>]/};e.languages.apex={comment:e.languages.clike.comment,string:e.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:e.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i("(\\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\\s+\\w+\\s+on)\\s+)"),lookbehind:!0,inside:a},{pattern:i("(\\(\\s*)(?=\\s*\\)\\s*[\\w(])"),lookbehind:!0,inside:a},{pattern:i("(?=\\s*\\w+\\s*[;=,(){:])"),inside:a}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:t,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(Prism); Prism.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:{pattern:/'(?:[^'\r\n]|'')*'/,greedy:!0},number:/¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\b/,"system-function":{pattern:/⎕[A-Z]+/i,alias:"function"},constant:/[⍬⌾#⎕⍞]/,function:/[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,"monadic-operator":{pattern:/[\\\/⌿⍀¨⍨⌶&∥]/,alias:"operator"},"dyadic-operator":{pattern:/[.⍣⍠⍤∘⌸@⌺⍥]/,alias:"operator"},assignment:{pattern:/←/,alias:"keyword"},punctuation:/[\[;\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:"builtin"}}; Prism.languages.applescript={comment:[/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,"class-name":/\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,punctuation:/[{}():,¬«»《》]/}; Prism.languages.aql={comment:/\/\/.*|\/\*[\s\S]*?\*\//,property:{pattern:/([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},identifier:{pattern:/([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},variable:/@@?\w+/,keyword:[{pattern:/(\bWITH\s+)COUNT(?=\s+INTO\b)/i,lookbehind:!0},/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,{pattern:/(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,lookbehind:!0},{pattern:/(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,lookbehind:!0},{pattern:/\bOPTIONS(?=\s*\{)/i}],function:/\b(?!\d)\w+(?=\s*\()/,boolean:/\b(?:false|true)\b/i,range:{pattern:/\.\./,alias:"operator"},number:[/\b0b[01]+/i,/\b0x[0-9a-f]+/i,/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i],operator:/\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,punctuation:/::|[?.:,;()[\]{}]/}; Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean; !function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); Prism.languages.arduino=Prism.languages.extend("cpp",{keyword:/\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,constant:/\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,builtin:/\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/}),Prism.languages.ino=Prism.languages.arduino; Prism.languages.arff={comment:/%.*/,string:{pattern:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/@(?:attribute|data|end|relation)\b/i,number:/\b\d+(?:\.\d+)?\b/,punctuation:/[{},]/}; Prism.languages.armasm={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"/,greedy:!0,inside:{variable:{pattern:/((?:^|[^$])(?:\${2})*)\$\w+/,lookbehind:!0}}},char:{pattern:/'(?:[^'\r\n]{0,4}|'')'/,greedy:!0},"version-symbol":{pattern:/\|[\w@]+\|/,greedy:!0,alias:"property"},boolean:/\b(?:FALSE|TRUE)\b/,directive:{pattern:/\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/,alias:"property"},instruction:{pattern:/((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/,lookbehind:!0,alias:"keyword"},variable:/\$\w+/,number:/(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i,register:{pattern:/\b(?:r\d|lr)\b/,alias:"symbol"},operator:/<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/,punctuation:/[()[\],]/},Prism.languages["arm-asm"]=Prism.languages.armasm; !function(e){var a=function(a,t){return{pattern:RegExp("\\{!(?:"+(t||a)+")$[^]*\\}","m"),greedy:!0,inside:{embedded:{pattern:/(^\{!\w+\b)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-"+a,inside:e.languages[a]},string:/[\s\S]+/}}};e.languages.arturo={comment:{pattern:/;.*/,greedy:!0},character:{pattern:/`.`/,alias:"char",greedy:!0},number:{pattern:/\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/},string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},regex:{pattern:/\{\/.*?\/\}/,greedy:!0},"html-string":a("html"),"css-string":a("css"),"js-string":a("js"),"md-string":a("md"),"sql-string":a("sql"),"sh-string":a("shell","sh"),multistring:{pattern:/».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m,alias:"string",greedy:!0},label:{pattern:/\w+\b\??:/,alias:"property"},literal:{pattern:/'(?:\w+\b\??:?)/,alias:"constant"},type:{pattern:/:(?:\w+\b\??:?)/,alias:"class-name"},color:/#\w+/,predicate:{pattern:/\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/,alias:"keyword"},"builtin-function":{pattern:/\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/,alias:"keyword"},sugar:{pattern:/->|=>|\||::/,alias:"operator"},punctuation:/[()[\],]/,symbol:{pattern:/<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/},boolean:{pattern:/\b(?:false|maybe|true)\b/}},e.languages.art=e.languages.arturo}(Prism); !function(t){var n={pattern:/(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\1)[^\\]|\\.)*\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\]|\\.)*'/,inside:{punctuation:/^'|'$/}},string:/"(?:[^"\\]|\\.)*"/,variable:/\w+(?==)/,punctuation:/^\[|\]$|,/,operator:/=/,"attr-value":/(?!^\s+$).+/}},i=t.languages.asciidoc={"comment-block":{pattern:/^(\/{4,})$[\s\S]*?^\1/m,alias:"comment"},table:{pattern:/^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,inside:{specifiers:{pattern:/(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})$[\s\S]*?^\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:n,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:n.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:n,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function e(t){for(var n={},e=0,a=(t=t.split(" ")).length;e>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism); Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:Prism.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/,alias:"tag"},rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,Prism.languages.insertBefore("inside","punctuation",{directive:Prism.languages.aspnet.directive},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp-script":{pattern:/(]*>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,alias:["asp","script"],inside:Prism.languages.csharp||{}}}); Prism.languages.asm6502={comment:/;.*/,directive:{pattern:/\.\w+(?= )/,alias:"property"},string:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,"op-code":{pattern:/\b(?:ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA|adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya)\b/,alias:"keyword"},"hex-number":{pattern:/#?\$[\da-f]{1,4}\b/i,alias:"number"},"binary-number":{pattern:/#?%[01]+\b/,alias:"number"},"decimal-number":{pattern:/#?\b\d+\b/,alias:"number"},register:{pattern:/\b[xya]\b/i,alias:"variable"},punctuation:/[(),:]/}; Prism.languages.asmatmel={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},constant:/\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\d|[0-2]\d|3[01]))\b/,directive:{pattern:/\.\w+(?= )/,alias:"property"},"r-register":{pattern:/\br(?:\d|[12]\d|3[01])\b/,alias:"variable"},"op-code":{pattern:/\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\b/,alias:"keyword"},"hex-number":{pattern:/#?\$[\da-f]{2,4}\b/i,alias:"number"},"binary-number":{pattern:/#?%[01]+\b/,alias:"number"},"decimal-number":{pattern:/#?\b\d+\b/,alias:"number"},register:{pattern:/\b[acznvshtixy]\b/i,alias:"variable"},operator:/>>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/,punctuation:/[(),:]/}; Prism.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,command:{pattern:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,alias:"selector"},constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,directive:{pattern:/#[a-z]+\b/i,alias:"important"},keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/}; Prism.languages.autoit={comment:[/;.*/,{pattern:/(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,lookbehind:!0}],url:{pattern:/(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,lookbehind:!0},string:{pattern:/(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,greedy:!0,inside:{variable:/([%$@])\w+\1/}},directive:{pattern:/(^[\t ]*)#[\w-]+/m,lookbehind:!0,alias:"keyword"},function:/\b\w+(?=\()/,variable:/[$@]\w+/,keyword:/\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,boolean:/\b(?:False|True)\b/i,operator:/<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,punctuation:/[\[\]().,:]/}; !function(e){function a(e,a,r){return RegExp(function(e,a){return e.replace(/<<(\d+)>>/g,(function(e,r){return a[+r]}))}(e,a),r||"")}var r="bool|clip|float|int|string|val",t=[["is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?","apply|assert|default|eval|import|nop|select|undefined","opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)","hex(?:value)?|value","abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt","a?sinh?|a?cosh?|a?tan[2h]?","(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))","average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)","getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams","chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)","isversionorgreater|version(?:number|string)","buildpixeltype|colorspacenametopixeltype","addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode"].join("|"),["has(?:audio|video)","height|width","frame(?:count|rate)|framerate(?:denominator|numerator)","getparity|is(?:field|frame)based","bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype","audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)"].join("|"),["avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource","coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv","(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract","addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)","blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen","trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)","assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?","amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch","animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?","imagewriter","blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version"].join("|")].join("|");e.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a('\\b(?:<<0>>)\\s+("?)\\w+\\1',[r],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:false|no|true|yes)\b/i,keyword:/\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,constant:/\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a("\\b(?:<<0>>)\\b",[t],"i"),alias:"function"},"type-cast":{pattern:a("\\b(?:<<0>>)(?=\\s*\\()",[r],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},e.languages.avs=e.languages.avisynth}(Prism); Prism.languages["avro-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0},annotation:{pattern:/@(?:[$\w.-]|`[^\r\n`]+`)+/,greedy:!0,alias:"function"},"function-identifier":{pattern:/`[^\r\n`]+`(?=\s*\()/,greedy:!0,alias:"function"},identifier:{pattern:/`[^\r\n`]+`/,greedy:!0},"class-name":{pattern:/(\b(?:enum|error|protocol|record|throws)\b\s+)[$\w]+/,lookbehind:!0,greedy:!0},keyword:/\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:[{pattern:/(^|[^\w.])-?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x(?:[a-f0-9]+(?:\.[a-f0-9]*)?|\.[a-f0-9]+)(?:p[+-]?\d+)?)[dfl]?(?![\w.])/i,lookbehind:!0},/-?\b(?:Infinity|NaN)\b/],operator:/=/,punctuation:/[()\[\]{}<>.:,;-]/},Prism.languages.avdl=Prism.languages["avro-idl"]; Prism.languages.awk={hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},regex:{pattern:/((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//,lookbehind:!0,greedy:!0},variable:/\$\w+/,keyword:/\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/,operator:/--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/,punctuation:/[()[\]{},;]/},Prism.languages.gawk=Prism.languages.awk; !function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i?^\w +\-.])*"/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,function:/\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/}; !function(e){var r=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;e.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:n,parameter:t,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}}(Prism); Prism.languages.bbcode={tag:{pattern:/\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,inside:{tag:{pattern:/^\[\/?[^\s=\]]+/,inside:{punctuation:/^\[\/?/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\]/,"attr-name":/[^\s=\]]+/}}},Prism.languages.shortcode=Prism.languages.bbcode; !function(e){e.languages.bbj={comment:{pattern:/(^|[^\\:])rem\s+.*/i,lookbehind:!0,greedy:!0},string:{pattern:/(['"])(?:(?!\1|\\).|\\.)*\1/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:abstract|all|argc|begin|bye|callback|case|chn|class|classend|ctl|day|declare|delete|dim|dom|dread|dsz|else|end|endif|err|exitto|extends|fi|field|for|from|gosub|goto|if|implements|interface|interfaceend|iol|iolist|let|list|load|method|methodend|methodret|on|opts|pfx|print|private|process_events|protected|psz|public|read|read_resource|release|remove_callback|repeat|restore|return|rev|seterr|setesc|sqlchn|sqlunt|ssn|start|static|swend|switch|sys|then|tim|unt|until|use|void|wend|where|while)\b/i,function:/\b\w+(?=\()/,boolean:/\b(?:BBjAPI\.TRUE|BBjAPI\.FALSE)\b/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:and|not|or|xor)\b/i,punctuation:/[.,;:()]/}}(Prism); Prism.languages.bicep={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],property:[{pattern:/([\r\n][ \t]*)[a-z_]\w*(?=[ \t]*:)/i,lookbehind:!0},{pattern:/([\r\n][ \t]*)'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'(?=[ \t]*:)/,lookbehind:!0,greedy:!0}],string:[{pattern:/'''[^'][\s\S]*?'''/,greedy:!0},{pattern:/(^|[^\\'])'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0}],"interpolated-string":{pattern:/(^|[^\\'])'(?:\\.|\$(?:(?!\{)|\{[^{}\r\n]*\})|[^'\\\r\n$])*'/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}\r\n]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0},punctuation:/^\$\{|\}$/}},string:/[\s\S]+/}},datatype:{pattern:/(\b(?:output|param)\b[ \t]+\w+[ \t]+)\w+\b/,lookbehind:!0,alias:"class-name"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\b/,decorator:/@\w+\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/,punctuation:/[{}[\];(),.:]/},Prism.languages.bicep["interpolated-string"].inside.interpolation.inside.expression.inside=Prism.languages.bicep; Prism.languages.birb=Prism.languages.extend("clike",{string:{pattern:/r?("|')(?:\\.|(?!\1)[^\\])*\1/,greedy:!0},"class-name":[/\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,/\b(?:[A-Z]\w*|(?!(?:var|void)\b)[a-z]\w*)(?=\s+\w+\s*[;,=()])/],keyword:/\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\b/,operator:/\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,variable:/\b[a-z_]\w*\b/}),Prism.languages.insertBefore("birb","function",{metadata:{pattern:/<\w+>/,greedy:!0,alias:"symbol"}}); Prism.languages.bison=Prism.languages.extend("c",{}),Prism.languages.insertBefore("bison","comment",{bison:{pattern:/^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,inside:{c:{pattern:/%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,inside:{delimiter:{pattern:/^%?\{|%?\}$/,alias:"punctuation"},"bison-variable":{pattern:/[$@](?:<[^\s>]+>)?[\w$]+/,alias:"variable",inside:{punctuation:/<|>/}},rest:Prism.languages.c}},comment:Prism.languages.c.comment,string:Prism.languages.c.string,property:/\S+(?=:)/,keyword:/%\w+/,number:{pattern:/(^|[^@])\b(?:0x[\da-f]+|\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\[\]<>]/}}}); Prism.languages.bnf={string:{pattern:/"[^\r\n"]*"|'[^\r\n']*'/},definition:{pattern:/<[^<>\r\n\t]+>(?=\s*::=)/,alias:["rule","keyword"],inside:{punctuation:/^<|>$/}},rule:{pattern:/<[^<>\r\n\t]+>/,inside:{punctuation:/^<|>$/}},operator:/::=|[|()[\]{}*+?]|\.{3}/},Prism.languages.rbnf=Prism.languages.bnf; Prism.languages.bqn={shebang:{pattern:/^#![ \t]*\/.*/,alias:"important",greedy:!0},comment:{pattern:/#.*/,greedy:!0},"string-literal":{pattern:/"(?:[^"]|"")*"/,greedy:!0,alias:"string"},"character-literal":{pattern:/'(?:[\s\S]|[\uD800-\uDBFF][\uDC00-\uDFFF])'/,greedy:!0,alias:"char"},function:/•[\w¯.∞π]+[\w¯.∞π]*/,"dot-notation-on-brackets":{pattern:/\{(?=.*\}\.)|\}\./,alias:"namespace"},"special-name":{pattern:/(?:𝕨|𝕩|𝕗|𝕘|𝕤|𝕣|𝕎|𝕏|𝔽|𝔾|𝕊|_𝕣_|_𝕣)/,alias:"keyword"},"dot-notation-on-name":{pattern:/[A-Za-z_][\w¯∞π]*\./,alias:"namespace"},"word-number-scientific":{pattern:/\d+(?:\.\d+)?[eE]¯?\d+/,alias:"number"},"word-name":{pattern:/[A-Za-z_][\w¯∞π]*/,alias:"symbol"},"word-number":{pattern:/[¯∞π]?(?:\d*\.?\b\d+(?:e[+¯]?\d+|E[+¯]?\d+)?|¯|∞|π)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+|E[+¯]?\d+)?|¯|∞|π))?/,alias:"number"},"null-literal":{pattern:/@/,alias:"char"},"primitive-functions":{pattern:/[-+×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!]/,alias:"operator"},"primitive-1-operators":{pattern:/[`˜˘¨⁼⌜´˝˙]/,alias:"operator"},"primitive-2-operators":{pattern:/[∘⊸⟜○⌾⎉⚇⍟⊘◶⎊]/,alias:"operator"},punctuation:/[←⇐↩(){}⟨⟩[\]‿·⋄,.;:?]/}; Prism.languages.brainfuck={pointer:{pattern:/<|>/,alias:"keyword"},increment:{pattern:/\+/,alias:"inserted"},decrement:{pattern:/-/,alias:"deleted"},branching:{pattern:/\[|\]/,alias:"important"},operator:/[.,]/,comment:/\S+/}; Prism.languages.brightscript={comment:/(?:\brem|').*/i,"directive-statement":{pattern:/(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,lookbehind:!0,alias:"property",inside:{"error-message":{pattern:/(^#error).+/,lookbehind:!0},directive:{pattern:/^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,alias:"keyword"},expression:{pattern:/[\s\S]+/,inside:null}}},property:{pattern:/([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},"class-name":{pattern:/(\bAs[\t ]+)\w+/i,lookbehind:!0},keyword:/\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?!\d)\w+(?=[\t ]*\()/,number:/(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,operator:/--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,punctuation:/[.,;()[\]{}]/,constant:/\b(?:LINE_NUM)\b/i},Prism.languages.brightscript["directive-statement"].inside.expression.inside=Prism.languages.brightscript; Prism.languages.bro={comment:{pattern:/(^|[^\\$])#.*/,lookbehind:!0,inside:{italic:/\b(?:FIXME|TODO|XXX)\b/}},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},boolean:/\b[TF]\b/,function:{pattern:/(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,lookbehind:!0},builtin:/(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,constant:{pattern:/(\bconst[ \t]+)\w+/i,lookbehind:!0},keyword:/\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,punctuation:/[{}[\];(),.:]/}; Prism.languages.bsl={comment:/\/\/.*/,string:[{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},{pattern:/'(?:[^'\r\n\\]|\\.)*'/}],keyword:[{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\b/i}],number:{pattern:/(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,lookbehind:!0},operator:[/[<>+\-*/]=?|[%=]/,{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:and|not|or)\b/i}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/,directive:[{pattern:/^([ \t]*)&.*/m,lookbehind:!0,greedy:!0,alias:"important"},{pattern:/^([ \t]*)#.*/gm,lookbehind:!0,greedy:!0,alias:"important"}]},Prism.languages.oscript=Prism.languages.bsl; Prism.languages.cfscript=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),Prism.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete Prism.languages.cfscript["class-name"],Prism.languages.cfc=Prism.languages.cfscript; Prism.languages.chaiscript=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,lookbehind:!0,greedy:!0},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},{pattern:/(\b(?:attr|def)\s+)\w+(?=\s*::)/,lookbehind:!0}],keyword:/\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,number:[Prism.languages.cpp.number,/\b(?:Infinity|NaN)\b/],operator:/>>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/}),Prism.languages.insertBefore("chaiscript","operator",{"parameter-type":{pattern:/([,(]\s*)\w+(?=\s+\w)/,lookbehind:!0,alias:"class-name"}}),Prism.languages.insertBefore("chaiscript","string",{"string-interpolation":{pattern:/(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,lookbehind:!0,inside:{"interpolation-expression":{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:Prism.languages.chaiscript},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"}}},string:/[\s\S]+/}}}); Prism.languages.cil={comment:/\/\/.*/,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},directive:{pattern:/(^|\W)\.[a-z]+(?=\s)/,lookbehind:!0,alias:"class-name"},variable:/\[[\w\.]+\]/,keyword:/\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,function:/\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,boolean:/\b(?:false|true)\b/,number:/\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,punctuation:/[{}[\];(),:=]|IL_[0-9A-Za-z]+/}; Prism.languages.cilkc=Prism.languages.insertBefore("c","function",{"parallel-keyword":{pattern:/\bcilk_(?:for|reducer|s(?:cope|pawn|ync))\b/,alias:"keyword"}}),Prism.languages["cilk-c"]=Prism.languages.cilkc; Prism.languages.cilkcpp=Prism.languages.insertBefore("cpp","function",{"parallel-keyword":{pattern:/\bcilk_(?:for|reducer|s(?:cope|pawn|ync))\b/,alias:"keyword"}}),Prism.languages["cilk-cpp"]=Prism.languages.cilkcpp,Prism.languages.cilk=Prism.languages.cilkcpp; Prism.languages.clojure={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},char:/\\\w+/,symbol:{pattern:/(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,lookbehind:!0},keyword:{pattern:/(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,lookbehind:!0},boolean:/\b(?:false|nil|true)\b/,number:{pattern:/(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,lookbehind:!0},function:{pattern:/((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,lookbehind:!0},operator:/[#@^`~]/,punctuation:/[{}\[\](),]/}; Prism.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}; Prism.languages.cobol={comment:{pattern:/\*>.*|(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},string:{pattern:/[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,greedy:!0},level:{pattern:/(^[ \t]*)\d+\b/m,lookbehind:!0,greedy:!0,alias:"number"},"class-name":{pattern:/(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,lookbehind:!0,inside:{number:{pattern:/(\()\d+/,lookbehind:!0},punctuation:/[()]/}},keyword:{pattern:/(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\w-])/i,lookbehind:!0},boolean:{pattern:/(^|[^\w-])(?:false|true)(?![\w-])/i,lookbehind:!0},number:{pattern:/(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,lookbehind:!0},operator:[/<>|[<>]=?|[=+*/&]/,{pattern:/(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,lookbehind:!0}],punctuation:/[.:,()]/}; !function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(Prism); Prism.languages.concurnas={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*)/,lookbehind:!0,greedy:!0},langext:{pattern:/\b\w+\s*\|\|[\s\S]+?\|\|/,greedy:!0,inside:{"class-name":/^\w+/,string:{pattern:/(^\s*\|\|)[\s\S]+(?=\|\|$)/,lookbehind:!0},punctuation:/\|\|/}},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,lookbehind:!0},keyword:/\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,boolean:/\b(?:false|true)\b/,number:/\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,punctuation:/[{}[\];(),.:]/,operator:/<==|>==|=>|->|<-|<>|&==|&<>|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|[!^~]|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,annotation:{pattern:/@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,alias:"builtin"}},Prism.languages.insertBefore("concurnas","langext",{"regex-literal":{pattern:/\br("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:Prism.languages.concurnas},regex:/[\s\S]+/}},"string-literal":{pattern:/(?:\B|\bs)("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:Prism.languages.concurnas},string:/[\s\S]+/}}}),Prism.languages.conc=Prism.languages.concurnas; !function(e){function n(e){return RegExp("([ \t])(?:"+e+")(?=[\\s;]|$)","i")}e.languages.csp={directive:{pattern:/(^|[\s;])(?:base-uri|block-all-mixed-content|(?:child|connect|default|font|frame|img|manifest|media|object|prefetch|script|style|worker)-src|disown-opener|form-action|frame-(?:ancestors|options)|input-protection(?:-(?:clip|selectors))?|navigate-to|plugin-types|policy-uri|referrer|reflected-xss|report-(?:to|uri)|require-sri-for|sandbox|(?:script|style)-src-(?:attr|elem)|upgrade-insecure-requests)(?=[\s;]|$)/i,lookbehind:!0,alias:"property"},scheme:{pattern:n("[a-z][a-z0-9.+-]*:"),lookbehind:!0},none:{pattern:n("'none'"),lookbehind:!0,alias:"keyword"},nonce:{pattern:n("'nonce-[-+/\\w=]+'"),lookbehind:!0,alias:"number"},hash:{pattern:n("'sha(?:256|384|512)-[-+/\\w=]+'"),lookbehind:!0,alias:"number"},host:{pattern:n("[a-z][a-z0-9.+-]*://[^\\s;,']*|\\*[^\\s;,']*|[a-z0-9-]+(?:\\.[a-z0-9-]+)+(?::[\\d*]+)?(?:/[^\\s;,']*)?"),lookbehind:!0,alias:"url",inside:{important:/\*/}},keyword:[{pattern:n("'unsafe-[a-z-]+'"),lookbehind:!0,alias:"unsafe"},{pattern:n("'[a-z-]+'"),lookbehind:!0,alias:"safe"}],punctuation:/;/}}(Prism); !function(e){var a="(?:(?!\\s)[\\d$+<=a-zA-Z\\x80-\\uFFFF])+",t="[^{}@#]+\\{[^}#@]*\\}";e.languages.cooklang={comment:{pattern:/\[-[\s\S]*?-\]|--.*/,greedy:!0},meta:{pattern:/>>.*:.*/,inside:{property:{pattern:/(>>\s*)[^\s:](?:[^:]*[^\s:])?/,lookbehind:!0}}},"cookware-group":{pattern:new RegExp("#(?:"+t+"|"+a+")"),inside:{cookware:{pattern:new RegExp("(^#)(?:[^{}@#]+)"),lookbehind:!0,alias:"variable"},"cookware-keyword":{pattern:/^#/,alias:"keyword"},"quantity-group":{pattern:new RegExp(/\{[^{}@#]*\}/),inside:{quantity:{pattern:new RegExp("(^\\{)[^{}@#]+"),lookbehind:!0,alias:"number"},punctuation:/[{}]/}}}},"ingredient-group":{pattern:new RegExp("@(?:"+t+"|"+a+")"),inside:{ingredient:{pattern:new RegExp("(^@)(?:[^{}@#]+)"),lookbehind:!0,alias:"variable"},"ingredient-keyword":{pattern:/^@/,alias:"keyword"},"amount-group":{pattern:/\{[^{}]*\}/,inside:{amount:{pattern:/([\{|])[^{}|*%]+/,lookbehind:!0,alias:"number"},unit:{pattern:/(%)[^}]+/,lookbehind:!0,alias:"symbol"},"servings-scaler":{pattern:/\*/,alias:"operator"},"servings-alternative-separator":{pattern:/\|/,alias:"operator"},"unit-separator":{pattern:/(?:%|(\*)%)/,lookbehind:!0,alias:"operator"},punctuation:/[{}]/}}}},"timer-group":{pattern:/~(?!\s)[^@#~{}]*\{[^{}]*\}/,inside:{timer:{pattern:/(^~)[^{]+/,lookbehind:!0,alias:"variable"},"duration-group":{pattern:/\{[^{}]*\}/,inside:{punctuation:/[{}]/,unit:{pattern:new RegExp("(%\\s*)(?:h|hours|hrs|m|min|minutes)\\b"),lookbehind:!0,alias:"symbol"},operator:/%/,duration:{pattern:/\d+/,alias:"number"}}},"timer-keyword":{pattern:/^~/,alias:"keyword"}}}}}(Prism); !function(e){for(var t="\\(\\*(?:[^(*]|\\((?!\\*)|\\*(?!\\))|)*\\*\\)",i=0;i<2;i++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,"[]"),e.languages.coq={comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp('#\\[(?:[^\\[\\]("]|"(?:[^"]|"")*"(?!")|\\((?!\\*)|)*\\]'.replace(//g,(function(){return t}))),greedy:!0,alias:"attr-name",inside:{comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}}(Prism); !function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var n={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var t="(?:"+["([^a-zA-Z0-9\\s{(\\[<=])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^]|\\((?:[^()\\\\]|\\\\[^])*\\))*\\)","\\{(?:[^{}\\\\]|\\\\[^]|\\{(?:[^{}\\\\]|\\\\[^])*\\})*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^]|\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\])*\\]","<(?:[^<>\\\\]|\\\\[^]|<(?:[^<>\\\\]|\\\\[^])*>)*>"].join("|")+")",i='(?:"(?:\\\\.|[^"\\\\\r\n])*"|(?:\\b[a-zA-Z_]\\w*|[^\\s\0-\\x7F]+)[?!]?|\\$.)';e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp("%r"+t+"[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp("(^|[^:]):"+i),lookbehind:!0,greedy:!0},{pattern:RegExp("([\r\n{(,][ \t]*)"+i+"(?=:(?!:))"),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp("%[qQiIwWs]?"+t),greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:n,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp("%x"+t),greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:n,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism); !function(e){e.languages.crystal=e.languages.extend("ruby",{keyword:[/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,{pattern:/(\.\s*)(?:is_a|responds_to)\?/,lookbehind:!0}],number:/\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,operator:[/->/,e.languages.ruby.operator],punctuation:/[(){}[\].,;\\]/}),e.languages.insertBefore("crystal","string-literal",{attribute:{pattern:/@\[.*?\]/,inside:{delimiter:{pattern:/^@\[|\]$/,alias:"punctuation"},attribute:{pattern:/^(\s*)\w+/,lookbehind:!0,alias:"class-name"},args:{pattern:/\S(?:[\s\S]*\S)?/,inside:e.languages.crystal}}},expansion:{pattern:/\{(?:\{.*?\}|%.*?%)\}/,inside:{content:{pattern:/^(\{.)[\s\S]+(?=.\}$)/,lookbehind:!0,inside:e.languages.crystal},delimiter:{pattern:/^\{[\{%]|[\}%]\}$/,alias:"operator"}}},char:{pattern:/'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,greedy:!0}})}(Prism); !function(e){var a,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:a={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=a,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:i})}(Prism); Prism.languages.csv={value:/[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,punctuation:/,/}; !function(e){var n="(?:"+"\"\"\"(?:[^\\\\\"]|\"(?!\"\"\\2)|)*\"\"\"|'''(?:[^\\\\']|'(?!''\\2)|)*'''|\"(?:[^\\\\\r\n\"]|\"(?!\\2)|)*\"|'(?:[^\\\\\r\n']|'(?!\\2)|)*'".replace(//g,"\\\\(?:(?!\\2)|\\2(?:[^()\r\n]|\\([^()]*\\)))")+")";e.languages.cue={comment:{pattern:/\/\/.*/,greedy:!0},"string-literal":{pattern:RegExp("(^|[^#\"'\\\\])(#*)"+n+"(?![\"'])\\2"),lookbehind:!0,greedy:!0,inside:{escape:{pattern:/(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/,greedy:!0,alias:"string"},interpolation:{pattern:/(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/,greedy:!0,inside:{punctuation:/^\\#*\(|\)$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:{pattern:/(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/,lookbehind:!0},boolean:{pattern:/(^|[^\w$])(?:false|true)(?![\w$])/,lookbehind:!0},builtin:{pattern:/(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/,lookbehind:!0},attribute:{pattern:/@[\w$]+(?=\s*\()/,alias:"function"},function:{pattern:/(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i,lookbehind:!0},number:{pattern:/(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/,lookbehind:!0},operator:/\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/,punctuation:/[()[\]{},.:]/},e.languages.cue["string-literal"].inside.interpolation.inside.expression.inside=e.languages.cue}(Prism); Prism.languages.cypher={comment:/\/\/.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,greedy:!0},"class-name":{pattern:/(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,lookbehind:!0,greedy:!0},relationship:{pattern:/(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,lookbehind:!0,greedy:!0,alias:"property"},identifier:{pattern:/`(?:[^`\\\r\n])*`/,greedy:!0},variable:/\$\w+/,keyword:/\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,function:/\b\w+\b(?=\s*\()/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,operator:/:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,punctuation:/[()[\]{},;.]/}; Prism.languages.d=Prism.languages.extend("clike",{comment:[{pattern:/^\s*#!.+/,greedy:!0},{pattern:RegExp("(^|[^\\\\])(?:"+["/\\+(?:/\\+(?:[^+]|\\+(?!/))*\\+/|(?!/\\+)[^])*?\\+/","//.*","/\\*[^]*?\\*/"].join("|")+")"),lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(['\\b[rx]"(?:\\\\[^]|[^\\\\"])*"[cwd]?','\\bq"(?:\\[[^]*?\\]|\\([^]*?\\)|<[^]*?>|\\{[^]*?\\})"','\\bq"((?!\\d)\\w+)$[^]*?^\\1"','\\bq"(.)[^]*?\\2"','(["`])(?:\\\\[^]|(?!\\3)[^\\\\])*\\3[cwd]?'].join("|"),"m"),greedy:!0},{pattern:/\bq\{(?:\{[^{}]*\}|[^{}])*\}/,greedy:!0,alias:"token-string"}],keyword:/\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,number:[/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,{pattern:/((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,lookbehind:!0}],operator:/\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/}),Prism.languages.insertBefore("d","string",{char:/'(?:\\(?:\W|\w+)|[^\\])'/}),Prism.languages.insertBefore("d","keyword",{property:/\B@\w*/}),Prism.languages.insertBefore("d","function",{register:{pattern:/\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,alias:"variable"}}); !function(e){var a=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};e.languages.dart=e.languages.extend("clike",{"class-name":[s,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:s.inside}],keyword:a,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),e.languages.insertBefore("dart","string",{"string-literal":{pattern:/r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,lookbehind:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:e.languages.dart}}},string:/[\s\S]+/}},string:void 0}),e.languages.insertBefore("dart","class-name",{metadata:{pattern:/@\w+/,alias:"function"}}),e.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":s,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism); !function(e){e.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},keyword:/\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:false|true)\b/}}(Prism); Prism.languages.dax={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,lookbehind:!0},"data-field":{pattern:/'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,alias:"symbol"},measure:{pattern:/\[[ \w\xA0-\uFFFF]+\]/,alias:"constant"},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},function:/\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,keyword:/\b(?:DEFINE|EVALUATE|MEASURE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,boolean:{pattern:/\b(?:FALSE|NULL|TRUE)\b/i,alias:"constant"},number:/\b\d+(?:\.\d*)?|\B\.\d+\b/,operator:/:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,punctuation:/[;\[\](){}`,.]/}; Prism.languages.dhall={comment:/--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,string:{pattern:/"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-dhall",inside:null},punctuation:/\$\{|\}/}}}},label:{pattern:/`[^`]*`/,greedy:!0},url:{pattern:/\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,greedy:!0},env:{pattern:/\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,greedy:!0,inside:{function:/^env/,operator:/^:/,variable:/[\s\S]+/}},hash:{pattern:/\bsha256:[\da-fA-F]{64}\b/,inside:{function:/sha256/,operator:/:/,number:/[\da-fA-F]{64}/}},keyword:/\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,builtin:/\b(?:None|Some)\b/,boolean:/\b(?:False|True)\b/,number:/\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,operator:/\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,punctuation:/\.\.|[{}\[\](),./]/,"class-name":/\b[A-Z]\w*\b/},Prism.languages.dhall.string.inside.interpolation.inside.expression.inside=Prism.languages.dhall; !function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var n={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(n).forEach((function(a){var i=n[a],r=[];/^\w+$/.test(a)||r.push(/\w+/.exec(a)[0]),"diff"===a&&r.push("bold"),e.languages.diff[a]={pattern:RegExp("^(?:["+i+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(a)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:n})}(Prism); !function(e){function n(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(t,a,r,o){if(t.language===a){var c=t.tokenStack=[];t.code=t.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==t.code.indexOf(r=n(a,i));)++i;return c[i]=e,r})),t.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(t,a){if(t.language===a&&t.tokenStack){t.grammar=e.languages[a];var r=0,o=Object.keys(t.tokenStack);!function c(i){for(var u=0;u=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism); !function(e){e.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var n=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=e.languages["markup-templating"];e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"django",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"django")})),e.languages.jinja2=e.languages.django,e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"jinja2",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"jinja2")}))}(Prism); Prism.languages["dns-zone-file"]={comment:/;.*/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},variable:[{pattern:/(^\$ORIGIN[ \t]+)\S+/m,lookbehind:!0},{pattern:/(^|\s)@(?=\s|$)/,lookbehind:!0}],keyword:/^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,class:{pattern:/(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,lookbehind:!0,alias:"keyword"},punctuation:/[()]/},Prism.languages["dns-zone"]=Prism.languages["dns-zone-file"]; !function(e){var n="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,(function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"})),r="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,(function(){return r})),o={pattern:RegExp(r),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,r){return e=e.replace(//g,(function(){return t})).replace(//g,(function(){return n})),RegExp(e,r)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); !function(e){var a="(?:"+["[a-zA-Z_\\x80-\\uFFFF][\\w\\x80-\\uFFFF]*","-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)",'"[^"\\\\]*(?:\\\\[^][^"\\\\]*)*"',"<(?:[^<>]|(?!\x3c!--)<(?:[^<>\"']|\"[^\"]*\"|'[^']*')+>|\x3c!--(?:[^-]|-(?!->))*--\x3e)*>"].join("|")+")",n={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:e.languages.markup}};function r(e,n){return RegExp(e.replace(//g,(function(){return a})),n)}e.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:r("(\\b(?:digraph|graph|subgraph)[ \t\r\n]+)","i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:n},"attr-value":{pattern:r("(=[ \t\r\n]*)"),lookbehind:!0,greedy:!0,inside:n},"attr-name":{pattern:r("([\\[;, \t\r\n])(?=[ \t\r\n]*=)"),lookbehind:!0,greedy:!0,inside:n},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:r("(^|[^-.\\w\\x80-\\uFFFF\\\\])"),lookbehind:!0,greedy:!0,inside:n},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},e.languages.gv=e.languages.dot}(Prism); Prism.languages.ebnf={comment:/\(\*[\s\S]*?\*\)/,string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},special:{pattern:/\?[^?\r\n]*\?/,greedy:!0,alias:"class-name"},definition:{pattern:/^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,lookbehind:!0,alias:["rule","keyword"]},rule:/\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,punctuation:/\([:/]|[:/]\)|[.,;()[\]{}]/,operator:/[-=|*/!]/}; Prism.languages.editorconfig={comment:/[;#].*/,section:{pattern:/(^[ \t]*)\[.+\]/m,lookbehind:!0,alias:"selector",inside:{regex:/\\\\[\[\]{},!?.*]/,operator:/[!?]|\.\.|\*{1,2}/,punctuation:/[\[\]{},]/}},key:{pattern:/(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/=.*/,alias:"attr-value",inside:{punctuation:/^=/}}}; Prism.languages.eiffel={comment:/--.*/,string:[{pattern:/"([^[]*)\[[\s\S]*?\]\1"/,greedy:!0},{pattern:/"([^{]*)\{[\s\S]*?\}\1"/,greedy:!0},{pattern:/"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,greedy:!0}],char:/'(?:%.|[^%'\r\n])+'/,keyword:/\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,boolean:/\b(?:False|True)\b/i,"class-name":/\b[A-Z][\dA-Z_]*\b/,number:[/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i],punctuation:/:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,operator:/\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/}; !function(a){a.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:a.languages.javascript}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"ejs",/<%(?!%)[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"ejs")})),a.languages.eta=a.languages.ejs}(Prism); Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach((function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}})); Prism.languages.elm={comment:/--.*|\{-[\s\S]*?-\}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|exposing|import)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/}; Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}; !function(a){a.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:a.languages.lua}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"etlua",/<%[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"etlua")}))}(Prism); !function(e){e.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:e.languages.ruby}},e.hooks.add("before-tokenize",(function(n){e.languages["markup-templating"].buildPlaceholders(n,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g)})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"erb")}))}(Prism); Prism.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}; Prism.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"builtin"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"selector",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"selector"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:FALSE|TRUE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},Prism.languages.xlsx=Prism.languages.xls=Prism.languages["excel-formula"]; Prism.languages.fsharp=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,greedy:!0},"class-name":{pattern:/(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,lookbehind:!0,inside:{operator:/->|\*/,punctuation:/\./}},keyword:/\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,number:[/\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,/\b0b[01]+(?:uy|y)?\b/,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,/\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/],operator:/([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/}),Prism.languages.insertBefore("fsharp","keyword",{preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(^#)\b(?:else|endif|if|light|line|nowarn)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.insertBefore("fsharp","punctuation",{"computation-expression":{pattern:/\b[_a-z]\w*(?=\s*\{)/i,alias:"keyword"}}),Prism.languages.insertBefore("fsharp","string",{annotation:{pattern:/\[<.+?>\]/,greedy:!0,inside:{punctuation:/^\[<|>\]$/,"class-name":{pattern:/^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,lookbehind:!0},"annotation-content":{pattern:/[\s\S]+/,inside:Prism.languages.fsharp}}},char:{pattern:/'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,greedy:!0}}); !function(e){var t={function:/\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},s={number:/\\[^\s']|%\w/},i={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:t},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:t}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:s.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|eval|execute)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:s}},n=function(e){return(e+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},r=function(e){return new RegExp("(^|\\s)(?:"+e.map(n).join("|")+")(?=\\s|$)")},a={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated",">>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(a).forEach((function(e){i[e].pattern=r(a[e])})),i.combinators.pattern=r(["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","inputsequence"]),e.languages.factor=i}(Prism); !function(a){a.languages.false={comment:{pattern:/\{[^}]*\}/},string:{pattern:/"[^"]*"/,greedy:!0},"character-code":{pattern:/'(?:[^\r]|\r\n?)/,alias:"number"},"assembler-code":{pattern:/\d+`/,alias:"important"},number:/\d+/,operator:/[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()!=]=?|[-+*/%]|\b(?:in|is)\b/}),delete Prism.languages["firestore-security-rules"]["class-name"],Prism.languages.insertBefore("firestore-security-rules","keyword",{path:{pattern:/(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,inside:{operator:/=/,keyword:/\*\*/,punctuation:/[.$(){}]/}},punctuation:/\//}},method:{pattern:/(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,lookbehind:!0,alias:"builtin",inside:{punctuation:/,/}}}); !function(a){a.languages.flow=a.languages.extend("javascript",{}),a.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),a.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete a.languages.flow.parameter,a.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(a.languages.flow.keyword)||(a.languages.flow.keyword=[a.languages.flow.keyword]),a.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(Prism); Prism.languages.fortran={"quoted-number":{pattern:/[BOZ](['"])[A-F0-9]+\1/i,alias:"number"},string:{pattern:/(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,inside:{comment:{pattern:/(&(?:\r\n?|\n)\s*)!.*/,lookbehind:!0}}},comment:{pattern:/!.*/,greedy:!0},boolean:/\.(?:FALSE|TRUE)\.(?:_\w+)?/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,keyword:[/\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i],operator:[/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,{pattern:/(^|(?!\().)\/(?!\))/,lookbehind:!0}],punctuation:/\(\/|\/\)|[(),;:&]/}; !function(e){for(var t="[^<()\"']|\\((?:)*\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*--\x3e|\"(?:[^\\\\\"]|\\\\.)*\"|'(?:[^\\\\']|\\\\.)*'",n=0;n<2;n++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,"[^\\s\\S]");var i={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp("(\"|')(?:(?!\\1|\\$\\{)[^\\\\]|\\\\.|\\$\\{(?:(?!\\})(?:))*\\})*\\1".replace(//g,(function(){return t}))),greedy:!0,inside:{interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\\\\\)*)\\$\\{(?:(?!\\})(?:))*\\}".replace(//g,(function(){return t}))),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};i.string[1].inside.interpolation.inside.rest=i,e.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}}},e.hooks.add("before-tokenize",(function(n){var i=RegExp("<#--[^]*?--\x3e|)*?>|\\$\\{(?:)*?\\}".replace(//g,(function(){return t})),"gi");e.languages["markup-templating"].buildPlaceholders(n,"ftl",i)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"ftl")}))}(Prism); Prism.languages.gamemakerlanguage=Prism.languages.gml=Prism.languages.extend("clike",{keyword:/\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,number:/(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,operator:/--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,constant:/\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,variable:/\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/}); Prism.languages.gap={shell:{pattern:/^gap>[\s\S]*?(?=^gap>|$(?![\s\S]))/m,greedy:!0,inside:{gap:{pattern:/^(gap>).+(?:(?:\r(?:\n|(?!\n))|\n)>.*)*/,lookbehind:!0,inside:null},punctuation:/^gap>/}},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\'"])(?:'(?:[^\r\n\\']|\\.){1,10}'|"(?:[^\r\n\\"]|\\.)*"(?!")|"""[\s\S]*?""")/,lookbehind:!0,greedy:!0,inside:{continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"}}},keyword:/\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},continuation:{pattern:/([\r\n])>/,lookbehind:!0,alias:"punctuation"},operator:/->|[-+*/^~=!]|<>|[<>]=?|:=|\.\./,punctuation:/[()[\]{},;.:]/},Prism.languages.gap.shell.inside.gap.inside=Prism.languages.gap; Prism.languages.gcode={comment:/;.*|\B\(.*?\)\B/,string:{pattern:/"(?:""|[^"])*"/,greedy:!0},keyword:/\b[GM]\d+(?:\.\d+)?\b/,property:/\b[A-Z]/,checksum:{pattern:/(\*)\d+/,lookbehind:!0,alias:"number"},punctuation:/[:*]/}; Prism.languages.gdscript={comment:/#.*/,string:{pattern:/@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,greedy:!0},"class-name":{pattern:/(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,lookbehind:!0},keyword:/\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,variable:/\$\w+/,number:[/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,/\b(?:INF|NAN|PI|TAU)\b/],constant:/\b[A-Z][A-Z_\d]*\b/,boolean:/\b(?:false|true)\b/,operator:/->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,punctuation:/[.:,;()[\]{}]/}; Prism.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},record:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"tag"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}; Prism.languages.gettext={comment:[{pattern:/# .*/,greedy:!0,alias:"translator-comment"},{pattern:/#\..*/,greedy:!0,alias:"extracted-comment"},{pattern:/#:.*/,greedy:!0,alias:"reference-comment"},{pattern:/#,.*/,greedy:!0,alias:"flag-comment"},{pattern:/#\|.*/,greedy:!0,alias:"previously-untranslated-comment"},{pattern:/#.*/,greedy:!0}],string:{pattern:/(^|[^\\])"(?:[^"\\]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/^msg(?:ctxt|id|id_plural|str)\b/m,number:/\b\d+\b/,punctuation:/[\[\]]/},Prism.languages.po=Prism.languages.gettext; !function(a){var n="(?:\r?\n|\r)[ \t]*\\|.+\\|(?:(?!\\|).)*";a.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+n+")(?:"+n+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(n),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}}(Prism); Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}; Prism.languages.glsl=Prism.languages.extend("c",{keyword:/\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/}); Prism.languages.gn={comment:{pattern:/#.*/,greedy:!0},"string-literal":{pattern:/(^|[^\\"])"(?:[^\r\n"\\]|\\.)*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[\s\S]*?\}|[a-zA-Z_]\w*|0x[a-fA-F0-9]{2})/,lookbehind:!0,inside:{number:/^\$0x[\s\S]{2}$/,variable:/^\$\w+$/,"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:/\b(?:else|if)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\s*\()/i,alias:"keyword"},function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\b/,number:/-?\b\d+\b/,operator:/[-+!=<>]=?|&&|\|\|/,punctuation:/[(){}[\],.]/},Prism.languages.gn["string-literal"].inside.interpolation.inside.expression.inside=Prism.languages.gn,Prism.languages.gni=Prism.languages.gn; Prism.languages["linker-script"]={comment:{pattern:/(^|\s)\/\*[\s\S]*?(?:$|\*\/)/,lookbehind:!0,greedy:!0},identifier:{pattern:/"[^"\r\n]*"/,greedy:!0},"location-counter":{pattern:/\B\.\B/,alias:"important"},section:{pattern:/(^|[^\w*])\.\w+\b/,lookbehind:!0,alias:"keyword"},function:/\b[A-Z][A-Z_]*(?=\s*\()/,number:/\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/,operator:/>>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/,punctuation:/[(){},;]/},Prism.languages.ld=Prism.languages["linker-script"]; Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]; Prism.languages["go-mod"]=Prism.languages["go-module"]={comment:{pattern:/\/\/.*/,greedy:!0},version:{pattern:/(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,lookbehind:!0,alias:"number"},"go-version":{pattern:/((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,lookbehind:!0,alias:"number"},keyword:{pattern:/^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,lookbehind:!0},operator:/=>/,punctuation:/[()[\],]/}; !function(e){var n={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.gradle=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("gradle","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("gradle","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("gradle","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.gradle}(Prism); Prism.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:Prism.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},Prism.hooks.add("after-tokenize",(function(n){if("graphql"===n.language)for(var t=n.tokens.filter((function(n){return"string"!=typeof n&&"comment"!==n.type&&"scalar"!==n.type})),e=0;e0)){var s=f(/^\{$/,/^\}$/);if(-1===s)continue;for(var u=e;u=0&&b(p,"variable-input")}}}}function l(n){return t[e+n]}function c(n,t){t=t||0;for(var e=0;e]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.groovy}(Prism); !function(n){n.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:n.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:n.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"symbol"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:n.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:n.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:n.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:n.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:n.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var e=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],t={},r=0,a=e.length;r@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"handlebars")})),a.languages.hbs=a.languages.handlebars,a.languages.mustache=a.languages.handlebars}(Prism); Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},Prism.languages.hs=Prism.languages.haskell; Prism.languages.haxe=Prism.languages.extend("clike",{string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},"class-name":[{pattern:/(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,function:{pattern:/\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,greedy:!0},operator:/\.{3}|\+\+|--|&&|\|\||->|=>|(?:<{1,3}|[-+*/%!=&|^])=?|[?:~]/}),Prism.languages.insertBefore("haxe","string",{"string-interpolation":{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{interpolation:{pattern:/(^|[^\\])\$(?:\w+|\{[^{}]+\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:Prism.languages.haxe}}},string:/[\s\S]+/}}}),Prism.languages.insertBefore("haxe","class-name",{regex:{pattern:/~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,greedy:!0,inside:{"regex-flags":/\b[a-z]+$/,"regex-source":{pattern:/^(~\/)[\s\S]+(?=\/$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^~\/|\/$/}}}),Prism.languages.insertBefore("haxe","keyword",{preprocessor:{pattern:/#(?:else|elseif|end|if)\b.*/,alias:"property"},metadata:{pattern:/@:?[\w.]+/,alias:"symbol"},reification:{pattern:/\$(?:\w+|(?=\{))/,alias:"important"}}); Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}; Prism.languages.hlsl=Prism.languages.extend("c",{"class-name":[Prism.languages.c["class-name"],/\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/],keyword:[/\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,/\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/],number:/(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,boolean:/\b(?:false|true)\b/}); Prism.languages.hoon={comment:{pattern:/::.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/,greedy:!0},constant:/%(?:\.[ny]|[\w-]+)/,"class-name":/@(?:[a-z0-9-]*[a-z0-9])?|\*/i,function:/(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,keyword:/\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/}; !function(t){function a(t){return RegExp("(^(?:"+t+"):[ \t]*(?![ \t]))[^]+","i")}t.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:a("Content-Security-Policy"),lookbehind:!0,alias:["csp","languages-csp"],inside:t.languages.csp},{pattern:a("Public-Key-Pins(?:-Report-Only)?"),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:t.languages.hpkp},{pattern:a("Strict-Transport-Security"),lookbehind:!0,alias:["hsts","languages-hsts"],inside:t.languages.hsts},{pattern:a("[^:]+"),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var e,n=t.languages,s={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css,"text/plain":n.plain},i={"application/json":!0,"application/xml":!0};function r(t){var a=t.replace(/^[a-z]+\//,"");return"(?:"+t+"|\\w+/(?:[\\w.-]+\\+)+"+a+"(?![+\\w.-]))"}for(var p in s)if(s[p]){e=e||{};var l=i[p]?r(p):p;e[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+l+"(?:(?:\r\n?|\n)[\\w-].*)*(?:\r(?:\n|(?!\n))|\n))[^ \t\\w-][^]*","i"),lookbehind:!0,inside:s[p]}}e&&t.languages.insertBefore("http","header",e)}(Prism); Prism.languages.hpkp={directive:{pattern:/\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}; Prism.languages.hsts={directive:{pattern:/\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,alias:"property"},operator:/=/,punctuation:/;/}; Prism.languages.ichigojam={comment:/(?:\B'|REM)(?:[^\n\r]*)/i,string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,greedy:!0},number:/\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,function:/\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,label:/(?:\B@\S+)/,operator:/<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,punctuation:/[\[,;:()\]]/}; Prism.languages.icon={comment:/#.*/,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,greedy:!0},number:/\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,"builtin-keyword":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,alias:"variable"},directive:{pattern:/\$\w+/,alias:"builtin"},keyword:/\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,function:/\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,operator:/[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,punctuation:/[\[\](){},;]/}; !function(e){function t(e,s){return s<=0?"[]":e.replace(//g,(function(){return t(e,s-1)}))}var s=/'[{}:=,](?:[^']|'')*'(?!')/,n={pattern:/''/,greedy:!0,alias:"operator"},r={pattern:s,greedy:!0,inside:{escape:n}},a=t("\\{(?:[^{}']|'(?![{},'])|''||)*\\}".replace(//g,(function(){return s.source})),8),i={pattern:RegExp(a),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};e.languages["icu-message-format"]={argument:{pattern:RegExp(a),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":i,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:few|many|one|other|two|zero)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":i,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:date|duration|number|ordinal|spellout|time)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp("(^\\s*,\\s*(?=\\S))"+t("(?:[^{}']|'[^']*'|\\{(?:)?\\})+",8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:n,string:r},i.inside.message.inside=e.languages["icu-message-format"],e.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=e.languages["icu-message-format"]}(Prism); Prism.languages.idris=Prism.languages.extend("haskell",{comment:{pattern:/(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m},keyword:/\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,builtin:void 0}),Prism.languages.insertBefore("idris","keyword",{"import-statement":{pattern:/(^\s*import\s+)(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,lookbehind:!0,inside:{punctuation:/\./}}}),Prism.languages.idr=Prism.languages.idris; !function(n){n.languages.ignore={comment:/^#.*/m,entry:{pattern:/\S(?:.*(?:(?:\\ )|\S))?/,alias:"string",inside:{operator:/^!|\*\*?|\?/,regex:{pattern:/(^|[^\\])\[[^\[\]]*\]/,lookbehind:!0},punctuation:/\//}}},n.languages.gitignore=n.languages.ignore,n.languages.hgignore=n.languages.ignore,n.languages.npmignore=n.languages.ignore}(Prism); Prism.languages.inform7={string:{pattern:/"[^"]*"/,inside:{substitution:{pattern:/\[[^\[\]]+\]/,inside:{delimiter:{pattern:/\[|\]/,alias:"punctuation"}}}}},comment:{pattern:/\[[^\[\]]+\]/,greedy:!0},title:{pattern:/^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,alias:"important"},number:{pattern:/(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,lookbehind:!0},verb:{pattern:/(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,lookbehind:!0},property:{pattern:/(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,lookbehind:!0,alias:"symbol"},position:{pattern:/(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,lookbehind:!0,alias:"variable"},punctuation:/[.,:;(){}]/},Prism.languages.inform7.string.inside.substitution.inside.rest=Prism.languages.inform7,Prism.languages.inform7.string.inside.substitution.inside.rest.text={pattern:/\S(?:\s*\S)*/,alias:"comment"}; Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}; Prism.languages.io={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,lookbehind:!0,greedy:!0},"triple-quoted-string":{pattern:/"""(?:\\[\s\S]|(?!""")[^\\])*"""/,greedy:!0,alias:"string"},string:{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},keyword:/\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,builtin:/\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,boolean:/\b(?:false|nil|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,operator:/[=!*/%+\-^&|]=|>>?=?|<+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,alias:"keyword"},number:/\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,adverb:{pattern:/[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,alias:"builtin"},operator:/[=a][.:]|_\./,conjunction:{pattern:/&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,alias:"variable"},punctuation:/[()]/}; !function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); !function(e){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(a){/<\?/.test(a.code)&&e.languages["markup-templating"].buildPlaceholders(a,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"php")}))}(Prism); !function(a){var e=a.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(e,"addSupport",{value:function(e,n){"string"==typeof e&&(e=[e]),e.forEach((function(e){!function(e,n){var t="doc-comment",r=a.languages[e];if(r){var o=r[t];if(o||(o=(r=a.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[t]),o instanceof RegExp&&(o=r[t]={pattern:o}),Array.isArray(o))for(var i=0,s=o.length;i/g,(function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"}));a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism); Prism.languages.javastacktrace={summary:{pattern:/^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,lookbehind:!0,inside:{keyword:{pattern:/^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,lookbehind:!0},string:{pattern:/^(\s*)"[^"]*"/,lookbehind:!0},exceptions:{pattern:/^(:?\s*)[\w$.]+(?=:|$)/,lookbehind:!0,inside:{"class-name":/[\w$]+$/,namespace:/\b[a-z]\w*\b/,punctuation:/\./}},message:{pattern:/(:\s*)\S.*/,lookbehind:!0,alias:"string"},punctuation:/:/}},"stack-frame":{pattern:/^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:)?\([^()]*\)/m,lookbehind:!0,inside:{keyword:{pattern:/^(\s*)at(?= )/,lookbehind:!0},source:[{pattern:/(\()\w+\.\w+:\d+(?=\))/,lookbehind:!0,inside:{file:/^\w+\.\w+/,punctuation:/:/,"line-number":{pattern:/\b\d+\b/,alias:"number"}}},{pattern:/(\()[^()]*(?=\))/,lookbehind:!0,inside:{keyword:/^(?:Native Method|Unknown Source)$/}}],"class-name":/[\w$]+(?=\.(?:|[\w$]+)\()/,function:/(?:|[\w$]+)(?=\()/,"class-loader":{pattern:/(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,lookbehind:!0,alias:"namespace",inside:{punctuation:/\./}},module:{pattern:/([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,lookbehind:!0,inside:{version:{pattern:/(@)[\s\S]+/,lookbehind:!0,alias:"number"},punctuation:/[@.]/}},namespace:{pattern:/(?:\b[a-z]\w*\.)+/,inside:{punctuation:/\./}},punctuation:/[()/.]/}},more:{pattern:/^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,lookbehind:!0,inside:{punctuation:/\.{3}/,number:/\d+/,keyword:/\b[a-z]+(?: [a-z]+)*\b/}}}; Prism.languages.jexl={string:/(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,transform:{pattern:/(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,alias:"function",lookbehind:!0},function:/[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+\b/,operator:/[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,boolean:/\b(?:false|true)\b/,keyword:/\bin\b/,punctuation:/[{}[\](),.]/}; Prism.languages.jolie=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,lookbehind:!0,greedy:!0},"class-name":{pattern:/((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,lookbehind:!0},keyword:/\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,function:/\b[a-z_]\w*(?=[ \t]*[@(])/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,operator:/-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,punctuation:/[()[\]{},;.:]/,builtin:/\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/}),Prism.languages.insertBefore("jolie","keyword",{aggregates:{pattern:/(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,lookbehind:!0,inside:{keyword:/\bwith\b/,"class-name":/\w+/,punctuation:/,/}},redirects:{pattern:/(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,lookbehind:!0,inside:{punctuation:/,/,"class-name":/\w+/,operator:/=>/}},property:{pattern:/\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/}}); !function(e){var n="\\\\\\((?:[^()]|\\([^()]*\\))*\\)",t=RegExp('(^|[^\\\\])"(?:[^"\r\n\\\\]|\\\\[^\r\n(]|__)*"'.replace(/__/g,(function(){return n}))),i={interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\{2})*)"+n),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},a=e.languages.jq={comment:/#.*/,property:{pattern:RegExp(t.source+"(?=\\s*:(?!:))"),lookbehind:!0,greedy:!0,inside:i},string:{pattern:t,lookbehind:!0,greedy:!0,inside:i},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};i.interpolation.inside.content.inside=a}(Prism); !function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism); !function(e){var a=e.languages.javascript,n="\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})+\\}",t="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(t+"(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?=\\s|$)"),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(t+"\\[(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?:=[^[\\]]+)?\\](?=\\s|$)"),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:a,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp("(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\\s+(?:\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*".replace(//g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(Prism); !function(a){function e(a,e){return RegExp(a.replace(//g,(function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"})),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r|.*(?:node_modules|\(\)|\(|$|\(internal\/|\(node\.js)).*/m,alias:"comment"},filename:{pattern:/(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,lookbehind:!0,alias:"url"},function:{pattern:/(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,lookbehind:!0,inside:{punctuation:/\./}},punctuation:/[()]/,keyword:/\b(?:at|new)\b/,alias:{pattern:/\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,alias:"variable"},"line-number":{pattern:/:\d+(?::\d+)?\b/,alias:"number",inside:{punctuation:/:/}}}}}; !function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],i=r.pattern.source;function o(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function p(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function l(t){var n={};n["interpolation-punctuation"]=a;var i=e.tokenize(t,n);if(3===i.length){var o=[1,1];o.push.apply(o,p(i[1],e.languages.javascript,"javascript")),i.splice.apply(i,o)}return new e.Token("interpolation",i,r.alias,t)}function g(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(i),lookbehind:!0}}),o=0,g={},u=p(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=s(o++,r)););return g[n]=a,n})).join(""),n,r),c=Object.keys(g);return o=0,function e(t){for(var n=0;n=c.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=c[o],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++o;var p=i.substring(0,s),u=l(g[a]),f=i.substring(s+a.length),y=[];if(p&&y.push(p),y.push(u),f){var v=[f];e(v),y.push.apply(y,v)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(y)),n+=y.length-1):r.content=y}}else{var d=r.content;Array.isArray(d)?e(d):e([d])}}}(u),new e.Token(r,u,"language-"+r,t)}e.languages.javascript["template-string"]=[o("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),o("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),o("svg","\\bsvg"),o("markdown","\\b(?:markdown|md)"),o("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),o("sql","\\bsql"),t].filter(Boolean);var u={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function c(e){return"string"==typeof e?e:Array.isArray(e)?e.map(c).join(""):c(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in u&&function t(n){for(var r=0,a=n.length;r]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,punctuation:/::?|[{}[\]();,.?]/,constant:/\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/}; Prism.languages.keepalived={comment:{pattern:/[#!].*/,greedy:!0},string:{pattern:/(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,lookbehind:!0,greedy:!0},ip:{pattern:RegExp("\\b(?:(?:(?:[\\da-f]{1,4}:){7}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}:[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){5}:(?:[\\da-f]{1,4}:)?[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){4}:(?:[\\da-f]{1,4}:){0,2}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){3}:(?:[\\da-f]{1,4}:){0,3}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){2}:(?:[\\da-f]{1,4}:){0,4}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}|(?:[\\da-f]{1,4}:){0,5}:|::(?:[\\da-f]{1,4}:){0,5}|[\\da-f]{1,4}::(?:[\\da-f]{1,4}:){0,5}[\\da-f]{1,4}|::(?:[\\da-f]{1,4}:){0,6}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){1,7}:)(?:/\\d{1,3})?|(?:/\\d{1,2})?)\\b".replace(//g,(function(){return"(?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))"})),"i"),alias:"number"},path:{pattern:/(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,lookbehind:!0,alias:"string"},variable:/\$\{?\w+\}?/,email:{pattern:/[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,alias:"string"},"conditional-configuration":{pattern:/@\^?[\w-]+/,alias:"variable"},operator:/=/,property:/\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,constant:/\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,number:{pattern:/(^|[^\w.-])-?\d+(?:\.\d+)?/,lookbehind:!0},boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\{\}]/}; Prism.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/}; !function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var e={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:e},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:e},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin}(Prism); !function(n){function o(n,o){return RegExp(n.replace(//g,"\\s\\x00-\\x1f\\x22-\\x2f\\x3a-\\x3f\\x5b-\\x5e\\x60\\x7b-\\x7e"),o)}n.languages.kumir={comment:{pattern:/\|.*/},prolog:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^\n\r"]*"|'[^\n\r']*'/,greedy:!0},boolean:{pattern:o("(^|[])(?:да|нет)(?=[]|$)"),lookbehind:!0},"operator-word":{pattern:o("(^|[])(?:и|или|не)(?=[]|$)"),lookbehind:!0,alias:"keyword"},"system-variable":{pattern:o("(^|[])знач(?=[]|$)"),lookbehind:!0,alias:"keyword"},type:[{pattern:o("(^|[])(?:вещ|лит|лог|сим|цел)(?:\\x20*таб)?(?=[]|$)"),lookbehind:!0,alias:"builtin"},{pattern:o("(^|[])(?:компл|сканкод|файл|цвет)(?=[]|$)"),lookbehind:!0,alias:"important"}],keyword:{pattern:o("(^|[])(?:алг|арг(?:\\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\\x20+|_)исп)?|кц(?:(?:\\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[]|$)"),lookbehind:!0},name:{pattern:o("(^|[])[^\\d][^]*(?:\\x20+[^]+)*(?=[]|$)"),lookbehind:!0},number:{pattern:o("(^|[])(?:\\B\\$[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)(?=[]|$)","i"),lookbehind:!0},punctuation:/:=|[(),:;\[\]]/,"operator-char":{pattern:/\*\*?|<[=>]?|>=?|[-+/=]/,alias:"operator"}},n.languages.kum=n.languages.kumir}(Prism); Prism.languages.kusto={comment:{pattern:/\/\/.*/,greedy:!0},string:{pattern:/```[\s\S]*?```|[hH]?(?:"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|@(?:"[^\r\n"]*"|'[^\r\n']*'))/,greedy:!0},verb:{pattern:/(\|\s*)[a-z][\w-]*/i,lookbehind:!0,alias:"keyword"},command:{pattern:/\.[a-z][a-z\d-]*\b/,alias:"keyword"},"class-name":/\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\b/,keyword:/\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\s+regex|nulls\s+(?:first|last))(?![\w-])/,boolean:/\b(?:false|null|true)\b/,function:/\b[a-z_]\w*(?=\s*\()/,datetime:[{pattern:/\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\s*,\s*)?\d{1,2}(?:\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\s+|-)\d{2}\s+\d{2}:\d{2}(?::\d{2})?(?:\s*(?:\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\d{4}))?\b/,alias:"number"},{pattern:/[+-]?\b(?:\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?|\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)Z?/,alias:"number"}],number:/\b(?:0x[0-9A-Fa-f]+|\d+(?:\.\d+)?(?:[Ee][+-]?\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\b)?|[+-]?\binf\b/,operator:/=>|[!=]~|[!=<>]=?|[-+*/%|]|\.\./,punctuation:/[()\[\]{},;.:]/}; !function(a){var e=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:e,alias:"regex"}};a.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:e,alias:"selector"},punctuation:/[[\]{}&]/},a.languages.tex=a.languages.latex,a.languages.context=a.languages.latex}(Prism); !function(a){a.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:a.languages.php}};var t=a.languages.extend("markup",{});a.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:a.languages.php}}}}}},t.tag),a.hooks.add("before-tokenize",(function(e){"latte"===e.language&&(a.languages["markup-templating"].buildPlaceholders(e,"latte",/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g),e.grammar=t)})),a.hooks.add("after-tokenize",(function(t){a.languages["markup-templating"].tokenizePlaceholders(t,"latte")}))}(Prism); Prism.languages.less=Prism.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),Prism.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}); !function(e){e.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(function(e){for(var r in e)e[r]=e[r].replace(/<[\w\s]+>/g,(function(r){return"(?:"+e[r].trim()+")"}));return e[r]}({"":"\\d+(?:/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[esfdl][+-]?\\d+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"(?:#d(?:#[ei])?|#[ei](?:#d)?)?","":"[0-9a-f]+(?:/[0-9a-f]+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"#[box](?:#[ei])?|(?:#[ei])?#[box]","":"(^|[()\\[\\]\\s])(?:|)(?=[()\\[\\]\\s]|$)"}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/}}(Prism); !function(e){for(var n='\\((?:[^();"#\\\\]|\\\\[^]|;.*(?!.)|"(?:[^"\\\\]|\\\\.)*"|#(?:\\{(?:(?!#\\})[^])*#\\}|[^{])|)*\\)',i=0;i<5;i++)n=n.replace(//g,(function(){return n}));n=n.replace(//g,"[^\\s\\S]");var d=e.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp('(^|[=\\s])#(?:"(?:[^"\\\\]|\\\\.)*"|[^\\s()"]*(?:[^\\s()]|))'.replace(//g,(function(){return n})),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:e.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};d["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=d,e.languages.ly=d}(Prism); Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},Prism.hooks.add("before-tokenize",(function(e){var t=!1;Prism.languages["markup-templating"].buildPlaceholders(e,"liquid",/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,(function(e){var n=/^\{%-?\s*(\w+)/.exec(e);if(n){var i=n[1];if("raw"===i&&!t)return t=!0,!0;if("endraw"===i)return t=!1,!0}return!t}))})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"liquid")})); !function(e){function n(e){return RegExp("(\\()(?:"+e+")(?=[\\s\\)])")}function a(e){return RegExp("([\\s([])(?:"+e+")(?=[\\s)])")}var t="(?!\\d)[-+*/~!@$%^=<>{}\\w]+",r="(\\()",i="(?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\))*\\))*\\))*",s={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+t+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+t),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+t),alias:"property"},splice:{pattern:RegExp(",@?"+t),alias:["symbol","variable"]},keyword:[{pattern:RegExp("(\\()(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)(?=\\s)"),lookbehind:!0},{pattern:RegExp("(\\()(?:append|by|collect|concat|do|finally|for|in|return)(?=\\s)"),lookbehind:!0}],declare:{pattern:n("declare"),lookbehind:!0,alias:"keyword"},interactive:{pattern:n("interactive"),lookbehind:!0,alias:"keyword"},boolean:{pattern:a("nil|t"),lookbehind:!0},number:{pattern:a("[-+]?\\d+(?:\\.\\d*)?"),lookbehind:!0},defvar:{pattern:RegExp("(\\()def(?:const|custom|group|var)\\s+"+t),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(t)}},defun:{pattern:RegExp("(\\()(?:cl-)?(?:defmacro|defun\\*?)\\s+"+t+"\\s+\\("+i+"\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+t),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp("(\\()lambda\\s+\\(\\s*(?:&?"+t+"(?:\\s+&?"+t+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(r+t),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},l={"lisp-marker":RegExp("&(?!\\d)[-+*/~!@$%^=<>{}\\w]+"),varform:{pattern:RegExp("\\("+t+"\\s+(?=\\S)"+i+"\\)"),inside:s},argument:{pattern:RegExp("(^|[\\s(])"+t),lookbehind:!0,alias:"variable"},rest:s},o="\\S+(?:\\s+\\S+)*",p={pattern:RegExp(r+i+"(?=\\))"),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+o),inside:l},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+o),inside:l},keys:{pattern:RegExp("&key\\s+"+o+"(?:\\s+&allow-other-keys)?"),inside:l},argument:{pattern:RegExp(t),alias:"variable"},punctuation:/[()]/}};s.lambda.inside.arguments=p,s.defun.inside.arguments=e.util.clone(p),s.defun.inside.arguments.inside.sublist=p,e.languages.lisp=s,e.languages.elisp=s,e.languages.emacs=s,e.languages["emacs-lisp"]=s}(Prism); Prism.languages.livescript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\])#.*/,lookbehind:!0}],"interpolated-string":{pattern:/(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,lookbehind:!0},interpolation:{pattern:/(^|[^\\])#\{[^}]+\}/m,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^#\{|\}$/,alias:"variable"}}},string:/[\s\S]+/}},string:[{pattern:/('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/<\[[\s\S]*?\]>/,greedy:!0},/\\[^\s,;\])}]+/],regex:[{pattern:/\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,greedy:!0,inside:{comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0}}},{pattern:/\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,greedy:!0}],keyword:{pattern:/(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,lookbehind:!0},"keyword-operator":{pattern:/(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,lookbehind:!0,alias:"operator"},boolean:{pattern:/(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,lookbehind:!0},argument:{pattern:/(^|(?!\.&\.)[^&])&(?!&)\d*/m,lookbehind:!0,alias:"variable"},number:/\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,identifier:/[a-z_](?:-?[a-z]|[\d_])*/i,operator:[{pattern:/( )\.(?= )/,lookbehind:!0},/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/],punctuation:/[(){}\[\]|.,:;`]/},Prism.languages.livescript["interpolated-string"].inside.interpolation.inside.rest=Prism.languages.livescript; !function(a){a.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:false|true)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}}(Prism); Prism.languages.log={string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,greedy:!0},exception:{pattern:/(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,lookbehind:!0,greedy:!0,alias:["javastacktrace","language-javastacktrace"],inside:Prism.languages.javastacktrace||{keyword:/\bat\b/,function:/[a-z_][\w$]*(?=\()/,punctuation:/[.:()]/}},level:[{pattern:/\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,alias:["error","important"]},{pattern:/\b(?:WARN|WARNING|WRN)\b/,alias:["warning","important"]},{pattern:/\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,alias:["info","keyword"]},{pattern:/\b(?:DBG|DEBUG|FINE)\b/,alias:["debug","keyword"]},{pattern:/\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,alias:["trace","comment"]}],property:{pattern:/((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,lookbehind:!0},separator:{pattern:/(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,lookbehind:!0,alias:"comment"},url:/\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,email:{pattern:/(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,lookbehind:!0,alias:"url"},"ip-address":{pattern:/\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,alias:"constant"},"mac-address":{pattern:/\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,alias:"constant"},domain:{pattern:/(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,lookbehind:!0,alias:"constant"},uuid:{pattern:/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,alias:"constant"},hash:{pattern:/\b(?:[a-f0-9]{32}){1,2}\b/i,alias:"constant"},"file-path":{pattern:/\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,lookbehind:!0,greedy:!0,alias:"string"},date:{pattern:RegExp("\\b\\d{4}[-/]\\d{2}[-/]\\d{2}(?:T(?=\\d{1,2}:)|(?=\\s\\d{1,2}:))|\\b\\d{1,4}[-/ ](?:\\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\\d{2,4}T?\\b|\\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\\s{1,2}\\d{1,2}\\b","i"),alias:"number"},time:{pattern:/\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,alias:"number"},boolean:/\b(?:false|null|true)\b/i,number:{pattern:/(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,lookbehind:!0},operator:/[;:?<=>~/@!$%&+\-|^(){}*#]/,punctuation:/[\[\].,]/}; Prism.languages.lolcode={comment:[/\bOBTW\s[\s\S]*?\sTLDR\b/,/\bBTW.+/],string:{pattern:/"(?::.|[^":])*"/,inside:{variable:/:\{[^}]+\}/,symbol:[/:\([a-f\d]+\)/i,/:\[[^\]]+\]/,/:[)>o":]/]},greedy:!0},number:/(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,symbol:{pattern:/(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,lookbehind:!0,inside:{keyword:/A(?=\s)/}},label:{pattern:/((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,lookbehind:!0,alias:"string"},function:{pattern:/((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,lookbehind:!0},keyword:[{pattern:/(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,lookbehind:!0},/'Z(?=\s|,|$)/],boolean:{pattern:/(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,lookbehind:!0},variable:{pattern:/(^|\s)IT(?=\s|,|$)/,lookbehind:!0},operator:{pattern:/(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,lookbehind:!0},punctuation:/\.{3}|…|,|!/}; Prism.languages.magma={output:{pattern:/^(>.*(?:\r(?:\n|(?!\n))|\n))(?!>)(?:.+|(?:\r(?:\n|(?!\n))|\n)(?!>).*)(?:(?:\r(?:\n|(?!\n))|\n)(?!>).*)*/m,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/(^|[^\\"])"(?:[^\r\n\\"]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\b/,boolean:/\b(?:false|true)\b/,generator:{pattern:/\b[a-z_]\w*(?=\s*<)/i,alias:"class-name"},function:/\b[a-z_]\w*(?=\s*\()/i,number:{pattern:/(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,lookbehind:!0},operator:/->|[-+*/^~!|#=]|:=|\.\./,punctuation:/[()[\]{}<>,;.:]/}; Prism.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}; !function(n){function e(n){return n=n.replace(//g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism); !function(t){var e="\\bvoid\\b||\\b(?:complex|numeric|pointer(?:\\s*\\([^()]*\\))?|real|string|(?:class|struct)\\s+\\w+|transmorphic)(?:\\s*)?".replace(//g,"\\b(?:(?:col|row)?vector|matrix|scalar)\\b");t.languages.mata={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/,lookbehind:!0},type:{pattern:RegExp(e),alias:"class-name",inside:{punctuation:/[()]/,keyword:/\b(?:class|function|struct|void)\b/}},keyword:/\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/,constant:/\bNULL\b/,number:{pattern:/(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i,lookbehind:!0},missing:{pattern:/(^|[^\w.])(?:\.[a-z]?)(?![\w.])/,lookbehind:!0,alias:"symbol"},function:/\b[a-z_]\w*(?=\s*\()/i,operator:/\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/,punctuation:/[()[\]{},;.]/}}(Prism); Prism.languages.matlab={comment:[/%\{[\s\S]*?\}%/,/%.+/],string:{pattern:/\B'(?:''|[^'\r\n])*'/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,keyword:/\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,function:/\b(?!\d)\w+(?=\s*\()/,operator:/\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,punctuation:/\.{3}|[.,;\[\](){}!]/}; !function(t){var e=/\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;t.languages.maxscript={comment:{pattern:/\/\*[\s\S]*?(?:\*\/|$)|--.*/,greedy:!0},string:{pattern:/(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,lookbehind:!0,greedy:!0},path:{pattern:/\$(?:[\w/\\.*?]|'[^']*')*/,greedy:!0,alias:"string"},"function-call":{pattern:RegExp("((?:^|[;=<>+\\-*/^({\\[]|\\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\\b)[ \t]*)(?!"+e.source+")[a-z_]\\w*\\b(?=[ \t]*(?:(?!"+e.source+")[a-z_]|\\d|-\\.?\\d|[({'\"$@#?]))","im"),lookbehind:!0,greedy:!0,alias:"function"},"function-definition":{pattern:/(\b(?:fn|function)\s+)\w+\b/i,lookbehind:!0,alias:"function"},argument:{pattern:/\b[a-z_]\w*(?=:)/i,alias:"attr-name"},keyword:e,boolean:/\b(?:false|true)\b/,time:{pattern:/(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,lookbehind:!0,alias:"number"},number:[{pattern:/(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,lookbehind:!0},/\b(?:e|pi)\b/],constant:/\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,color:{pattern:/\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,alias:"constant"},operator:/[-+*/<>=!]=?|[&^?]|#(?!\()/,punctuation:/[()\[\]{}.:,;]|#(?=\()|\\$/m}}(Prism); Prism.languages.mel={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},code:{pattern:/`(?:\\.|[^\\`])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},statement:{pattern:/[\s\S]+/,inside:null}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:{pattern:/((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im,lookbehind:!0,greedy:!0},"tensor-punctuation":{pattern:/<<|>>/,alias:"punctuation"},operator:/\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/,punctuation:/[.,:;?\[\](){}]/},Prism.languages.mel.code.inside.statement.inside=Prism.languages.mel; Prism.languages.mermaid={comment:{pattern:/%%.*/,greedy:!0},style:{pattern:/^([ \t]*(?:classDef|linkStyle|style)[ \t]+[\w$-]+[ \t]+)\w.*[^\s;]/m,lookbehind:!0,inside:{property:/\b\w[\w-]*(?=[ \t]*:)/,operator:/:/,punctuation:/,/}},"inter-arrow-label":{pattern:/([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \t]*(?:"[^"\r\n]*"|[^\s".=-](?:[^\r\n.=-]*[^\s.=-])?)[ \t]*(?:\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,lookbehind:!0,greedy:!0,inside:{arrow:{pattern:/(?:\.+->?|--+[->]|==+[=>])$/,alias:"operator"},label:{pattern:/^([\s\S]{2}[ \t]*)\S(?:[\s\S]*\S)?/,lookbehind:!0,alias:"property"},"arrow-head":{pattern:/^\S+/,alias:["arrow","operator"]}}},arrow:[{pattern:/(^|[^{}|o.-])[|}][|o](?:--|\.\.)[|o][|{](?![{}|o.-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>ox.=-])(?:[ox]?|(?:==+|--+|-\.*-)[>ox]|===+|---+|-\.+-)(?![<>ox.=-])/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,lookbehind:!0,alias:"operator"},{pattern:/(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\|?(?:--|\.\.)|(?:--|\.\.)\|?>|--|\.\.)(?![<>|*o.-])/,lookbehind:!0,alias:"operator"}],label:{pattern:/(^|[^|<])\|(?:[^\r\n"|]|"[^"\r\n]*")+\|/,lookbehind:!0,greedy:!0,alias:"property"},text:{pattern:/(?:[(\[{]+|\b>)(?:[^\r\n"()\[\]{}]|"[^"\r\n]*")+(?:[)\]}]+|>)/,alias:"string"},string:{pattern:/"[^"\r\n]*"/,greedy:!0},annotation:{pattern:/<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\[\[(?:choice|fork|join)\]\]/i,alias:"important"},keyword:[{pattern:/(^[ \t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\w$-])/m,lookbehind:!0,greedy:!0},{pattern:/(^[ \t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \t]+note)?|loop|opt|par|participant|rect|state|note[ \t]+(?:over|(?:left|right)[ \t]+of))(?![\w$-])/im,lookbehind:!0,greedy:!0}],entity:/#[a-z0-9]+;/,operator:{pattern:/(\w[ \t]*)&(?=[ \t]*\w)|:::|:/,lookbehind:!0},punctuation:/[(){};]/}; Prism.languages.metafont={comment:{pattern:/%.*/,greedy:!0},string:{pattern:/"[^\r\n"]*"/,greedy:!0},number:/\d*\.?\d+/,boolean:/\b(?:false|true)\b/,punctuation:[/[,;()]/,{pattern:/(^|[^{}])(?:\{|\})(?![{}])/,lookbehind:!0},{pattern:/(^|[^[])\[(?!\[)/,lookbehind:!0},{pattern:/(^|[^\]])\](?!\])/,lookbehind:!0}],constant:[{pattern:/(^|[^!?])\?\?\?(?![!?])/,lookbehind:!0},{pattern:/(^|[^/*\\])(?:\\|\\\\)(?![/*\\])/,lookbehind:!0},/\b(?:_|blankpicture|bp|cc|cm|dd|ditto|down|eps|epsilon|fullcircle|halfcircle|identity|in|infinity|left|mm|nullpen|nullpicture|origin|pc|penrazor|penspeck|pensquare|penstroke|proof|pt|quartercircle|relax|right|smoke|unitpixel|unitsquare|up)\b/],quantity:{pattern:/\b(?:autorounding|blacker|boundarychar|charcode|chardp|chardx|chardy|charext|charht|charic|charwd|currentwindow|day|designsize|displaying|fillin|fontmaking|granularity|hppp|join_radius|month|o_correction|pausing|pen_(?:bot|lft|rt|top)|pixels_per_inch|proofing|showstopping|smoothing|time|tolerance|tracingcapsules|tracingchoices|tracingcommands|tracingedges|tracingequations|tracingmacros|tracingonline|tracingoutput|tracingpens|tracingrestores|tracingspecs|tracingstats|tracingtitles|turningcheck|vppp|warningcheck|xoffset|year|yoffset)\b/,alias:"keyword"},command:{pattern:/\b(?:addto|batchmode|charlist|cull|display|errhelp|errmessage|errorstopmode|everyjob|extensible|fontdimen|headerbyte|inner|interim|let|ligtable|message|newinternal|nonstopmode|numspecial|openwindow|outer|randomseed|save|scrollmode|shipout|show|showdependencies|showstats|showtoken|showvariable|special)\b/,alias:"builtin"},operator:[{pattern:/(^|[^>=<:|])(?:<|<=|=|=:|\|=:|\|=:>|=:\|>|=:\||\|=:\||\|=:\|>|\|=:\|>>|>|>=|:|:=|<>|::|\|\|:)(?![>=<:|])/,lookbehind:!0},{pattern:/(^|[^+-])(?:\+|\+\+|-{1,3}|\+-\+)(?![+-])/,lookbehind:!0},{pattern:/(^|[^/*\\])(?:\*|\*\*|\/)(?![/*\\])/,lookbehind:!0},{pattern:/(^|[^.])(?:\.{2,3})(?!\.)/,lookbehind:!0},{pattern:/(^|[^@#&$])&(?![@#&$])/,lookbehind:!0},/\b(?:and|not|or)\b/],macro:{pattern:/\b(?:abs|beginchar|bot|byte|capsule_def|ceiling|change_width|clear_pen_memory|clearit|clearpen|clearxy|counterclockwise|cullit|cutdraw|cutoff|decr|define_blacker_pixels|define_corrected_pixels|define_good_x_pixels|define_good_y_pixels|define_horizontal_corrected_pixels|define_pixels|define_whole_blacker_pixels|define_whole_pixels|define_whole_vertical_blacker_pixels|define_whole_vertical_pixels|dir|direction|directionpoint|div|dotprod|downto|draw|drawdot|endchar|erase|fill|filldraw|fix_units|flex|font_coding_scheme|font_extra_space|font_identifier|font_normal_shrink|font_normal_space|font_normal_stretch|font_quad|font_size|font_slant|font_x_height|gfcorners|gobble|gobbled|good\.(?:bot|lft|rt|top|x|y)|grayfont|hide|hround|imagerules|incr|interact|interpath|intersectionpoint|inverse|italcorr|killtext|labelfont|labels|lft|loggingall|lowres_fix|makegrid|makelabel(?:\.(?:bot|lft|rt|top)(?:\.nodot)?)?|max|min|mod|mode_def|mode_setup|nodisplays|notransforms|numtok|openit|penlabels|penpos|pickup|proofoffset|proofrule|proofrulethickness|range|reflectedabout|rotatedabout|rotatedaround|round|rt|savepen|screenchars|screenrule|screenstrokes|shipit|showit|slantfont|softjoin|solve|stop|superellipse|tensepath|thru|titlefont|top|tracingall|tracingnone|undraw|undrawdot|unfill|unfilldraw|upto|vround)\b/,alias:"function"},builtin:/\b(?:ASCII|angle|char|cosd|decimal|directiontime|floor|hex|intersectiontimes|jobname|known|length|makepath|makepen|mexp|mlog|normaldeviate|oct|odd|pencircle|penoffset|point|postcontrol|precontrol|reverse|rotated|sind|sqrt|str|subpath|substring|totalweight|turningnumber|uniformdeviate|unknown|xpart|xxpart|xypart|ypart|yxpart|yypart)\b/,keyword:/\b(?:also|at|atleast|begingroup|charexists|contour|controls|curl|cycle|def|delimiters|doublepath|dropping|dump|else|elseif|end|enddef|endfor|endgroup|endinput|exitif|exitunless|expandafter|fi|for|forever|forsuffixes|from|if|input|inwindow|keeping|kern|of|primarydef|quote|readstring|scaled|scantokens|secondarydef|shifted|skipto|slanted|step|tension|tertiarydef|to|transformed|until|vardef|withpen|withweight|xscaled|yscaled|zscaled)\b/,type:{pattern:/\b(?:boolean|expr|numeric|pair|path|pen|picture|primary|secondary|string|suffix|tertiary|text|transform)\b/,alias:"property"},variable:{pattern:/(^|[^@#&$])(?:@#|#@|#|@)(?![@#&$])|\b(?:aspect_ratio|currentpen|currentpicture|currenttransform|d|extra_beginchar|extra_endchar|extra_setup|h|localfont|mag|mode|screen_cols|screen_rows|w|whatever|x|y|z)\b/,lookbehind:!0}}; Prism.languages.mizar={comment:/::.+/,keyword:/@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,parameter:{pattern:/\$(?:10|\d)/,alias:"variable"},variable:/\b\w+(?=:)/,number:/(?:\b|-)\d+\b/,operator:/\.\.\.|->|&|\.?=/,punctuation:/\(#|#\)|[,:;\[\](){}]/}; !function($){var e=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$setWindowFields","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$count","$dateAdd","$dateDiff","$dateSubtract","$dateTrunc","$getField","$rand","$sampleRate","$setField","$unsetField","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],t="(?:"+(e=e.map((function($){return $.replace("$","\\$")}))).join("|")+")\\b";$.languages.mongodb=$.languages.extend("javascript",{}),$.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp("^(['\"])?"+t+"(?:\\1)?$")}}}),$.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,greedy:!0}},$.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"].join("|")+")\\b"),alias:"keyword"}})}(Prism); Prism.languages.monkey={comment:{pattern:/^#Rem\s[\s\S]*?^#End|'.+/im,greedy:!0},string:{pattern:/"[^"\r\n]*"/,greedy:!0},preprocessor:{pattern:/(^[ \t]*)#.+/m,lookbehind:!0,greedy:!0,alias:"property"},function:/\b\w+(?=\()/,"type-char":{pattern:/\b[?%#$]/,alias:"class-name"},number:{pattern:/((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,lookbehind:!0},keyword:/\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,operator:/\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,punctuation:/[.,:;()\[\]]/}; Prism.languages.moonscript={comment:/--.*/,string:[{pattern:/'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,greedy:!0},{pattern:/"[^"]*"/,greedy:!0,inside:{interpolation:{pattern:/#\{[^{}]*\}/,inside:{moonscript:{pattern:/(^#\{)[\s\S]+(?=\})/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/#\{|\}/,alias:"punctuation"}}}}}],"class-name":[{pattern:/(\b(?:class|extends)[ \t]+)\w+/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,variable:/@@?\w*/,property:{pattern:/\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,lookbehind:!0},function:{pattern:/\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,inside:{punctuation:/\./}},boolean:/\b(?:false|true)\b/,number:/(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,operator:/\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,punctuation:/[.,()[\]{}\\]/},Prism.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside=Prism.languages.moonscript,Prism.languages.moon=Prism.languages.moonscript; Prism.languages.n1ql={comment:{pattern:/\/\*[\s\S]*?(?:$|\*\/)|--.*/,greedy:!0},string:{pattern:/(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,greedy:!0},identifier:{pattern:/`(?:\\[\s\S]|[^\\`]|``)*`/,greedy:!0},parameter:/\$[\w.]+/,keyword:/\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:FALSE|TRUE)\b/i,number:/(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,punctuation:/[;[\](),.{}:]/}; Prism.languages.n4js=Prism.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),Prism.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),Prism.languages.n4jsd=Prism.languages.n4js; Prism.languages["nand2tetris-hdl"]={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,keyword:/\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,boolean:/\b(?:false|true)\b/,function:/\b[A-Za-z][A-Za-z0-9]*(?=\()/,number:/\b\d+\b/,operator:/=|\.\./,punctuation:/[{}[\];(),:]/}; !function(e){var a=/\{[^\r\n\[\]{}]*\}/,n={"quoted-string":{pattern:/"(?:[^"\\]|\\.)*"/,alias:"operator"},"command-param-id":{pattern:/(\s)\w+:/,lookbehind:!0,alias:"property"},"command-param-value":[{pattern:a,alias:"selector"},{pattern:/([\t ])\S+/,lookbehind:!0,greedy:!0,alias:"operator"},{pattern:/\S(?:.*\S)?/,alias:"operator"}]};function t(e){return"string"==typeof e?e:Array.isArray(e)?e.map(t).join(""):t(e.content)}e.languages.naniscript={comment:{pattern:/^([\t ]*);.*/m,lookbehind:!0},define:{pattern:/^>.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:a,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:n}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:a,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:n},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},e.languages.nani=e.languages.naniscript,e.hooks.add("after-tokenize",(function(e){e.tokens.forEach((function(e){if("string"!=typeof e&&"generic-text"===e.type){var a=t(e);(function(e){for(var a=[],n=0;n=&|$!]/}; Prism.languages.neon={comment:{pattern:/#.*/,greedy:!0},datetime:{pattern:/(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,lookbehind:!0,alias:"number"},key:{pattern:/(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,lookbehind:!0,alias:"property"},number:{pattern:/(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,lookbehind:!0},boolean:{pattern:/(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,lookbehind:!0},null:{pattern:/(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,lookbehind:!0,alias:"keyword"},string:{pattern:/(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,lookbehind:!0,greedy:!0},literal:{pattern:/(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,lookbehind:!0,alias:"string"},punctuation:/[,:=[\]{}()-]/}; Prism.languages.nevod={comment:/\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,string:{pattern:/(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,greedy:!0,inside:{"string-attrs":/!$|!\*$|\*$/}},namespace:{pattern:/(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,lookbehind:!0},pattern:{pattern:/(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,lookbehind:!0,inside:{"pattern-name":{pattern:/^#?[a-zA-Z0-9\-.]+/,alias:"class-name"},fields:{pattern:/\(.*\)/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},punctuation:/[,()]/,operator:{pattern:/~/,alias:"field-hidden-mark"}}}}},search:{pattern:/(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,alias:"function",lookbehind:!0},keyword:/@(?:having|inside|namespace|outside|pattern|require|search|where)\b/,"standard-pattern":{pattern:/\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\b(?:\([a-zA-Z0-9\-.,\s+]*\))?/,inside:{"standard-pattern-name":{pattern:/^[a-zA-Z0-9\-.]+/,alias:"builtin"},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},"standard-pattern-attr":{pattern:/[a-zA-Z0-9\-.]+/,alias:"builtin"},punctuation:/[,()]/}},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},operator:[{pattern:/=/,alias:"pattern-def"},{pattern:/&/,alias:"conjunction"},{pattern:/~/,alias:"exception"},{pattern:/\?/,alias:"optionality"},{pattern:/[[\]]/,alias:"repetition"},{pattern:/[{}]/,alias:"variation"},{pattern:/[+_]/,alias:"sequence"},{pattern:/\.{2,3}/,alias:"span"}],"field-capture":[{pattern:/([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,lookbehind:!0,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}},{pattern:/[a-zA-Z0-9\-.]+\s*:/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}}],punctuation:/[:;,()]/,name:/[a-zA-Z0-9\-.]+/}; !function(e){var n=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;e.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0,greedy:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,greedy:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:n}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:n}},punctuation:/[{};]/}}(Prism); Prism.languages.nim={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,greedy:!0},char:{pattern:/'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,greedy:!0},function:{pattern:/(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,greedy:!0,inside:{operator:/\*$/}},identifier:{pattern:/`[^`\r\n]+`/,greedy:!0,inside:{punctuation:/`/}},number:/\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,keyword:/\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,operator:{pattern:/(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,lookbehind:!0},punctuation:/[({\[]\.|\.[)}\]]|[`(){}\[\],:]/}; Prism.languages.nix={comment:{pattern:/\/\*[\s\S]*?\*\/|#.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,greedy:!0,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,lookbehind:!0,inside:null}}},url:[/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,{pattern:/([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\$(?=\{)/,alias:"important"},number:/\b\d+\b/,keyword:/\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,function:/\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,punctuation:/[{}()[\].,:;]/},Prism.languages.nix.string.inside.interpolation.inside=Prism.languages.nix; Prism.languages.nsis={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,lookbehind:!0,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:{pattern:/(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|KnownFolderPath|LabelAddress|TempFileName|WinVer)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|RtlLanguage|ShellVarContextAll|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|Target|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,lookbehind:!0},property:/\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,constant:/\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,variable:/\$\w[\w\.]*/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,punctuation:/[{}[\];(),.:]/,important:{pattern:/(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,lookbehind:!0}}; Prism.languages.objectivec=Prism.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete Prism.languages.objectivec["class-name"],Prism.languages.objc=Prism.languages.objectivec; Prism.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/}; !function(e){var t=/\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/;e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:/'(?:\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\n\r'\\])'/,greedy:!0,inside:{symbol:t}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:/"(?:\\.|[^\n\r"\\])*"/,greedy:!0,inside:{symbol:t}}],directive:{pattern:/#\w+/,alias:"property"},number:/\b0(?:b[01_]+|d[\d_]+|h_*(?:(?:(?:[\dA-Fa-f]_*){8}){1,2}|(?:[\dA-Fa-f]_*){4})|o[0-7_]+|x[\dA-F_a-f]+|z[\dAB_ab]+)\b|(?:\b\d+(?:\.(?!\.)\d*)?|\B\.\d+)(?:[Ee][+-]?\d*)?[ijk]?(?!\w)/,discard:{pattern:/\b_\b/,alias:"keyword"},"procedure-definition":{pattern:/\b\w+(?=[ \t]*(?::\s*){2}proc\b)/,alias:"function"},keyword:/\b(?:asm|auto_cast|bit_set|break|case|cast|context|continue|defer|distinct|do|dynamic|else|enum|fallthrough|for|foreign|if|import|in|map|matrix|not_in|or_else|or_return|package|proc|return|struct|switch|transmute|typeid|union|using|when|where)\b/,"procedure-name":{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"},boolean:/\b(?:false|nil|true)\b/,"constant-parameter-sign":{pattern:/\$/,alias:"important"},undefined:{pattern:/---/,alias:"operator"},arrow:{pattern:/->/,alias:"punctuation"},operator:/\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,punctuation:/[(),.:;@\[\]{}]/}}(Prism); !function(E){E.languages.opencl=E.languages.extend("c",{keyword:/\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,boolean:/\b(?:false|true)\b/,"constant-opencl-kernel":{pattern:/\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,alias:"constant"}}),E.languages.insertBefore("opencl","class-name",{"builtin-type":{pattern:/\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,alias:"keyword"}});var _={"type-opencl-host":{pattern:/\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,alias:"keyword"},"boolean-opencl-host":{pattern:/\bCL_(?:FALSE|TRUE)\b/,alias:"boolean"},"constant-opencl-host":{pattern:/\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,alias:"constant"},"function-opencl-host":{pattern:/\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,alias:"function"}};E.languages.insertBefore("c","keyword",_),E.languages.cpp&&(_["type-opencl-host-cpp"]={pattern:/\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,alias:"keyword"},E.languages.insertBefore("cpp","keyword",_))}(Prism); Prism.languages.openqasm={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"[^"\r\n\t]*"|'[^'\r\n\t]*'/,greedy:!0},keyword:/\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\b|#pragma\b/,"class-name":/\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,function:/\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\b(?=\s*\()/,constant:/\b(?:euler|pi|tau)\b|π|𝜏|ℇ/,number:{pattern:/(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,lookbehind:!0},operator:/->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,punctuation:/[(){}\[\];,:.]/},Prism.languages.qasm=Prism.languages.openqasm; Prism.languages.oz={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},atom:{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,alias:"builtin"},keyword:/\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,function:[/\b[a-z][A-Za-z\d]*(?=\()/,{pattern:/(\{)[A-Z][A-Za-z\d]*\b/,lookbehind:!0}],number:/\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,variable:/`(?:[^`\\]|\\.)+`/,"attr-name":/\b\w+(?=[ \t]*:(?![:=]))/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,punctuation:/[\[\](){}.:;?]/}; Prism.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var r=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return r=r.map((function(r){return r.split("").join(" *")})).join("|"),RegExp("\\b(?:"+r+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}; !function(e){var n=e.languages.parser=e.languages.extend("markup",{keyword:{pattern:/(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,lookbehind:!0},variable:{pattern:/(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{punctuation:/\.|:+/}},function:{pattern:/(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{keyword:{pattern:/(^@)(?:GET_|SET_)/,lookbehind:!0},punctuation:/\.|:+/}},escape:{pattern:/\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,alias:"builtin"},punctuation:/[\[\](){};]/});n=e.languages.insertBefore("parser","keyword",{"parser-comment":{pattern:/(\s)#.*/,lookbehind:!0,alias:"comment"},expression:{pattern:/(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,greedy:!0,lookbehind:!0,inside:{string:{pattern:/(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,lookbehind:!0},keyword:n.keyword,variable:n.variable,function:n.function,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,escape:n.escape,operator:/[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,punctuation:n.punctuation}}}),e.languages.insertBefore("inside","punctuation",{expression:n.expression,keyword:n.keyword,variable:n.variable,function:n.function,escape:n.escape,"parser-punctuation":{pattern:n.punctuation,alias:"punctuation"}},n.tag.inside["attr-value"])}(Prism); Prism.languages.pascal={directive:{pattern:/\{\$[\s\S]*?\}/,greedy:!0,alias:["marco","property"]},comment:{pattern:/\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,greedy:!0},string:{pattern:/(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,greedy:!0},asm:{pattern:/(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,lookbehind:!0,greedy:!0,inside:null},keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/(?:[&%]\d+|\$[a-f\d]+)/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/},Prism.languages.pascal.asm.inside=Prism.languages.extend("pascal",{asm:void 0,keyword:void 0,operator:void 0}),Prism.languages.objectpascal=Prism.languages.pascal; !function(e){var n="(?:\\b\\w+(?:)?|)".replace(//g,(function(){return"\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)"})),t=e.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp("(\\btype\\s+\\w+\\s+is\\s+)".replace(//g,(function(){return n})),"i"),lookbehind:!0,inside:null},{pattern:RegExp("(?=\\s+is\\b)".replace(//g,(function(){return n})),"i"),inside:null},{pattern:RegExp("(:\\s*)".replace(//g,(function(){return n}))),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce((function(e,n){return e[n]=t[n],e}),{});t["class-name"].forEach((function(e){e.inside=i}))}(Prism); Prism.languages.psl={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0,inside:{symbol:/\\[ntrbA-Z"\\]/}},"heredoc-string":{pattern:/<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,alias:"string",greedy:!0},keyword:/\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,constant:/\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\b/,boolean:/\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\b/,variable:/\b(?:PslDebug|errno|exit_status)\b/,builtin:{pattern:/\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\b/,alias:"builtin-function"},"foreach-variable":{pattern:/(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,lookbehind:!0,greedy:!0},function:/\b[_a-z]\w*\b(?=\s*\()/i,number:/\b(?:0x[0-9a-f]+|\d+(?:\.\d+)?)\b/i,operator:/--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,punctuation:/[(){}\[\];,]/}; Prism.languages.pcaxis={string:/"[^"]*"/,keyword:{pattern:/((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,lookbehind:!0,greedy:!0,inside:{keyword:/^[-A-Z\d]+/,language:{pattern:/^(\s*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/^\[|\]$/,property:/[-\w]+/}},"sub-key":{pattern:/^(\s*)\S[\s\S]*/,lookbehind:!0,inside:{parameter:{pattern:/"[^"]*"/,alias:"property"},punctuation:/^\(|\)$|,/}}}},operator:/=/,tlist:{pattern:/TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,greedy:!0,inside:{function:/^TLIST/,property:{pattern:/^(\s*\(\s*)\w+/,lookbehind:!0},string:/"[^"]*"/,punctuation:/[(),]/,operator:/-/}},punctuation:/[;,]/,number:{pattern:/(^|\s)\d+(?:\.\d+)?(?!\S)/,lookbehind:!0},boolean:/NO|YES/},Prism.languages.px=Prism.languages.pcaxis; Prism.languages.peoplecode={comment:RegExp(["/\\*[^]*?\\*/","\\bREM[^;]*;","<\\*(?:[^<*]|\\*(?!>)|<(?!\\*)|<\\*(?:(?!\\*>)[^])*\\*>)*\\*>","/\\+[^]*?\\+/"].join("|")),string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},variable:/%\w+/,"function-definition":{pattern:/((?:^|[^\w-])(?:function|method)\s+)\w+/i,lookbehind:!0,alias:"function"},"class-name":{pattern:/((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,lookbehind:!0,inside:{punctuation:/:/}},keyword:/\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,"operator-keyword":{pattern:/\b(?:and|not|or)\b/i,alias:"operator"},function:/[_a-z]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/\b\d+(?:\.\d+)?\b/,operator:/<>|[<>]=?|!=|\*\*|[-+*/|=@]/,punctuation:/[:.;,()[\]]/},Prism.languages.pcode=Prism.languages.peoplecode; !function(e){var n="(?:\\((?:[^()\\\\]|\\\\[^])*\\)|\\{(?:[^{}\\\\]|\\\\[^])*\\}|\\[(?:[^[\\]\\\\]|\\\\[^])*\\]|<(?:[^<>\\\\]|\\\\[^])*>)";e.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp("\\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp("\\b(?:m|qr)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")[msixpodualngc]*"),greedy:!0},{pattern:RegExp("(^|[^-])\\b(?:s|tr|y)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2(?:(?!\\2)[^\\\\]|\\\\[^])*\\2","([a-zA-Z0-9])(?:(?!\\3)[^\\\\]|\\\\[^])*\\3(?:(?!\\3)[^\\\\]|\\\\[^])*\\3",n+"\\s*"+n].join("|")+")[msixpodualngcer]*"),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(Prism); !function(a){var e="(?:\\b[a-zA-Z]\\w*|[|\\\\[\\]])+";a.languages.phpdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:"+e+"\\s+)?)\\$\\w+"),lookbehind:!0}}),a.languages.insertBefore("phpdoc","keyword",{"class-name":[{pattern:RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)"+e),lookbehind:!0,inside:{keyword:/\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,punctuation:/[|\\[\]()]/}}]}),a.languages.javadoclike.addSupport("php",a.languages.phpdoc)}(Prism); Prism.languages.insertBefore("php","variable",{this:{pattern:/\$this\b/,alias:"keyword"},global:/\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/\b(?:parent|self|static)\b/,punctuation:/::|\\/}}}); !function(e){var t=/\$\w+|%[a-z]+%/;e.languages["plant-uml"]={comment:{pattern:/(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m,lookbehind:!0,greedy:!0},preprocessor:{pattern:/(^[ \t]*)!.*/m,lookbehind:!0,greedy:!0,alias:"property",inside:{variable:t}},delimiter:{pattern:/(^[ \t]*)@(?:end|start)uml\b/m,lookbehind:!0,greedy:!0,alias:"punctuation"},arrow:{pattern:RegExp("(^|[^-.<>?|\\\\[\\]ox])[[?]?[ox]?(?:(?:-+(?:[drlu]|do|down|le|left|ri|right|up)-+|\\.+(?:[drlu]|do|down|le|left|ri|right|up)\\.+|-+(?:\\[[^[\\]]*\\]-*)?|\\[[^[\\]]*\\]-+|\\.+(?:\\[[^[\\]]*\\]\\.*)?|\\[[^[\\]]*\\]\\.+)(?:>{1,2}|/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo])|(?:<{1,2}|/{1,2}|\\\\{1,2}|<\\||[#*^+}xo])(?:-+(?:[drlu]|do|down|le|left|ri|right|up)-+|\\.+(?:[drlu]|do|down|le|left|ri|right|up)\\.+|-+(?:\\[[^[\\]]*\\]-*)?|\\[[^[\\]]*\\]-+|\\.+(?:\\[[^[\\]]*\\]\\.*)?|\\[[^[\\]]*\\]\\.+)(?:(?:>{1,2}|/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo]))?)[ox]?[\\]?]?(?![-.<>?|\\\\\\]ox])"),lookbehind:!0,greedy:!0,alias:"operator",inside:{expression:{pattern:/(\[)[^[\]]+(?=\])/,lookbehind:!0,inside:null},punctuation:/\[(?=$|\])|^\]/}},string:{pattern:/"[^"]*"/,greedy:!0},text:{pattern:/(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/,lookbehind:!0,greedy:!0,alias:"string"},keyword:[{pattern:/^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m,lookbehind:!0,greedy:!0},/\b(?:elseif|equals|not|while)(?=\s*\()/,/\b(?:as|is|then)\b/],divider:{pattern:/^==.+==$/m,greedy:!0,alias:"important"},time:{pattern:/@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i,greedy:!0,alias:"number"},color:{pattern:/#(?:[a-z_]+|[a-fA-F0-9]+)\b/,alias:"symbol"},variable:t,punctuation:/[:,;()[\]{}]|\.{3}/},e.languages["plant-uml"].arrow.inside.expression.inside=e.languages["plant-uml"],e.languages.plantuml=e.languages["plant-uml"]}(Prism); Prism.languages.plsql=Prism.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/}),Prism.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}}); Prism.languages.powerquery={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},"quoted-identifier":{pattern:/#"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},string:{pattern:/(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},constant:[/\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,/\bOccurrence\.(?:All|First|Last)\b/,/\bOrder\.(?:Ascending|Descending)\b/,/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,/\bMissingField\.(?:Error|Ignore|UseNull)\b/,/\bQuoteStyle\.(?:Csv|None)\b/,/\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,/\bGroupKind\.(?:Global|Local)\b/,/\bExtraValues\.(?:Error|Ignore|List)\b/,/\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,/\bJoinSide\.(?:Left|Right)\b/,/\bPrecision\.(?:Decimal|Double)\b/,/\bRelativePosition\.From(?:End|Start)\b/,/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,/\bnull\b/],boolean:/\b(?:false|true)\b/,keyword:/\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,function:{pattern:/(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,lookbehind:!0},"data-type":{pattern:/\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,alias:"class-name"},number:{pattern:/\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,lookbehind:!0},operator:/[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,punctuation:/[,;\[\](){}]/},Prism.languages.pq=Prism.languages.powerquery,Prism.languages.mscript=Prism.languages.powerquery; !function(e){var i=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};i.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:i},boolean:i.boolean,variable:i.variable}}(Prism); Prism.languages.processing=Prism.languages.extend("clike",{keyword:/\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,function:/\b\w+(?=\s*\()/,operator:/<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/}),Prism.languages.insertBefore("processing","number",{constant:/\b(?!XML\b)[A-Z][A-Z\d_]+\b/,type:{pattern:/\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,alias:"class-name"}}); Prism.languages.prolog={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,greedy:!0},builtin:/\b(?:fx|fy|xf[xy]?|yfx?)\b/,function:/\b[a-z]\w*(?:(?=\()|\/\d+)/,number:/\b\d+(?:\.\d*)?/,operator:/[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,punctuation:/[(){}\[\],]/}; !function(t){var n=["on","ignoring","group_right","group_left","by","without"],a=["sum","min","max","avg","group","stddev","stdvar","count","count_values","bottomk","topk","quantile"].concat(n,["offset"]);t.languages.promql={comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},"vector-match":{pattern:new RegExp("((?:"+n.join("|")+")\\s*)\\([^)]*\\)"),lookbehind:!0,inside:{"label-key":{pattern:/\b[^,]+\b/,alias:"attr-name"},punctuation:/[(),]/}},"context-labels":{pattern:/\{[^{}]*\}/,inside:{"label-key":{pattern:/\b[a-z_]\w*(?=\s*(?:=|![=~]))/,alias:"attr-name"},"label-value":{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0,alias:"attr-value"},punctuation:/\{|\}|=~?|![=~]|,/}},"context-range":[{pattern:/\[[\w\s:]+\]/,inside:{punctuation:/\[|\]|:/,"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}},{pattern:/(\boffset\s+)\w+/,lookbehind:!0,inside:{"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}}],keyword:new RegExp("\\b(?:"+a.join("|")+")\\b","i"),function:/\b[a-z_]\w*(?=\s*\()/i,number:/[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,operator:/[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,punctuation:/[{};()`,.[\]]/}}(Prism); Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/}; !function(e){var s=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:s}},builtin:s,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism); !function(e){e.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:e.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:e.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:e.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:e.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:e.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:e.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:e.languages.javascript}],punctuation:/[.\-!=|]+/};for(var t=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],n={},a=0,i=t.length;a(?:(?:\r?\n|\r(?!\n))(?:\\2[\t ].+|\\s*?(?=\r?\n|\r)))+".replace("",(function(){return r.filter})),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[r.language,"language-"+r.language],inside:e.languages[r.language]}}})}e.languages.insertBefore("pug","filter",n)}(Prism); !function(e){e.languages.puppet={heredoc:[{pattern:/(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,greedy:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,alias:"string",inside:{punctuation:{pattern:/(\().+?(?=\))/,lookbehind:!0}}}],"multiline-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0,alias:"comment"},regex:{pattern:/((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,lookbehind:!0,greedy:!0,inside:{"extended-regex":{pattern:/^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,greedy:!0,inside:{"double-quoted":{pattern:/^"[\s\S]*"$/,inside:{}}}},variable:{pattern:/\$(?:::)?\w+(?:::\w+)*/,inside:{punctuation:/::/}},"attr-name":/(?:\b\w+|\*)(?=\s*=>)/,function:[{pattern:/(\.)(?!\d)\w+/,lookbehind:!0},/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/],number:/\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,boolean:/\b(?:false|true)\b/,keyword:/\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,datatype:{pattern:/\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,alias:"symbol"},operator:/=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,punctuation:/[\[\]{}().,;]|:+/};var n=[{pattern:/(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,lookbehind:!0,inside:{"short-variable":{pattern:/(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}},delimiter:{pattern:/^\$/,alias:"variable"},rest:e.languages.puppet}},{pattern:/(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}}];e.languages.puppet.heredoc[0].inside.interpolation=n,e.languages.puppet.string.inside["double-quoted"].inside.interpolation=n}(Prism); !function(e){e.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/},["c",{lang:"c++",alias:"cpp"},"fortran"].forEach((function(t){var a=t;if("string"!=typeof t&&(a=t.alias,t=t.lang),e.languages[a]){var r={};r["inline-lang-"+a]={pattern:RegExp("%< *-\\*- *\\d* *-\\*-[^]+?%>".replace("",t.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:e.util.clone(e.languages.pure["inline-lang"].inside)},r["inline-lang-"+a].inside.rest=e.util.clone(e.languages[a]),e.languages.insertBefore("pure","inline-lang",r)}})),e.languages.c&&(e.languages.pure["inline-lang"].inside.rest=e.util.clone(e.languages.c))}(Prism); Prism.languages.purebasic=Prism.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/}),Prism.languages.insertBefore("purebasic","keyword",{tag:/#\w+\$?/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|DEFAULT|FLOAT)\b.*/],function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete Prism.languages.purebasic["class-name"],delete Prism.languages.purebasic.boolean,Prism.languages.pbfasm=Prism.languages.purebasic; Prism.languages.purescript=Prism.languages.extend("haskell",{keyword:/\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import)\b/,punctuation:/\./}},builtin:/\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,operator:[Prism.languages.haskell.operator[0],Prism.languages.haskell.operator[2],/[\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\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\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-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\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-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/]}),Prism.languages.purs=Prism.languages.purescript; Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; !function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,r){return"(?:"+n[+r]+")"}))}function r(e,r,a){return RegExp(n(e,r),a||"")}var a=RegExp("\\b(?:"+"Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within".trim().replace(/ /g,"|")+")\\b"),t=n("<<0>>(?:\\s*\\.\\s*<<0>>)*",["\\b[A-Za-z_]\\w*\\b"]),i={keyword:a,punctuation:/[<>()?,.:[\]]/},s='"(?:\\\\.|[^\\\\"])*"';e.languages.qsharp=e.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:r("(^|[^$\\\\])<<0>>",[s]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:r("(\\b(?:as|open)\\s+)<<0>>(?=\\s*(?:;|as\\b))",[t]),lookbehind:!0,inside:i},{pattern:r("(\\bnamespace\\s+)<<0>>(?=\\s*\\{)",[t]),lookbehind:!0,inside:i}],keyword:a,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),e.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var o=function(e,n){for(var r=0;r<2;r++)e=e.replace(/<>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}(n('\\{(?:[^"{}]|<<0>>|<>)*\\}',[s]));e.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:r('\\$"(?:\\\\.|<<0>>|[^\\\\"{])*"',[o]),greedy:!0,inside:{interpolation:{pattern:r("((?:^|[^\\\\])(?:\\\\\\\\)*)<<0>>",[o]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:e.languages.qsharp}}},string:/[\s\S]+/}}})}(Prism),Prism.languages.qs=Prism.languages.qsharp; Prism.languages.q={string:/"(?:\\.|[^"\\\r\n])*"/,comment:[{pattern:/([\t )\]}])\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,lookbehind:!0,greedy:!0},{pattern:/^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,greedy:!0},{pattern:/^#!.+/m,greedy:!0}],symbol:/`(?::\S+|[\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,alias:"number"},number:/\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,keyword:/\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,adverb:{pattern:/['\/\\]:?|\beach\b/,alias:"function"},verb:{pattern:/(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,alias:"operator"},punctuation:/[(){}\[\];.]/}; !function(e){for(var r="(?:[^\\\\()[\\]{}\"'/]||/(?![*/])||\\(*\\)|\\[*\\]|\\{*\\}|\\\\[^])".replace(//g,(function(){return"\"(?:\\\\.|[^\\\\\"\r\n])*\"|'(?:\\\\.|[^\\\\'\r\n])*'"})).replace(//g,(function(){return"//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/"})),t=0;t<2;t++)r=r.replace(//g,(function(){return r}));r=r.replace(//g,"[^\\s\\S]"),e.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp("((?:^|;)[ \t]*)function\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*\\(*\\)\\s*\\{*\\}".replace(//g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp("(:[ \t]*)(?![\\s;}[])(?:(?!$|[;}]))+".replace(//g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}}(Prism); Prism.languages.qore=Prism.languages.extend("clike",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,lookbehind:!0},string:{pattern:/("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,boolean:/\b(?:false|true)\b/i,function:/\$?\b(?!\d)\w+(?=\()/,number:/\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,lookbehind:!0},variable:/\$(?!\d)\w+\b/}); Prism.languages.r={comment:/#.*/,string:{pattern:/(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},boolean:/\b(?:FALSE|TRUE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:Inf|NaN)\b/,/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/],keyword:/\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,operator:/->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,punctuation:/[(){}\[\],;]/}; Prism.languages.racket=Prism.languages.extend("scheme",{"lambda-parameter":{pattern:/([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,lookbehind:!0}}),Prism.languages.insertBefore("racket","string",{lang:{pattern:/^#lang.+/m,greedy:!0,alias:"keyword"}}),Prism.languages.rkt=Prism.languages.racket; !function(e){function s(e,s){for(var a=0;a/g,(function(){return"(?:"+e+")"}));return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|\'(?:(?:[^\r\n\'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})\'|(?=[^\\\\](?!\'))))').replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",1),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]||)*>",1)+")?"+a+"|"+t+")*(?![?!\\.(\\[]|<(?!/))",l="(?:\"[^\"@]*\"|'[^'@]*'|[^\\s'\"@>=]+(?=[\\s>])|[\"'][^\"'@]*(?:(?:@(?![\\w()])|"+n+")[^\"'@]*)+[\"'])",i="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,l),g="(?!\\d)[^\\s>/=$<%]+"+i+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+i+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+g+")";e.languages.cshtml=e.languages.extend("markup",{});var c={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},p={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:c}};e.languages.cshtml.tag.pattern=RegExp("*\\.{3}(?:[^{}]|)*\\})";function a(t,n){return t=t.replace(//g,(function(){return"(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)"})).replace(//g,(function(){return"(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})"})).replace(//g,(function(){return e})),RegExp(t,n)}e=a(e).source,t.languages.jsx=t.languages.extend("markup",n),t.languages.jsx.tag.pattern=a("+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[^]|[^\\\\\"])*\"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'\"/>=]+|))?|))**/?)?>"),t.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,t.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,t.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,t.languages.jsx.tag.inside.comment=n.comment,t.languages.insertBefore("inside","attr-name",{spread:{pattern:a(""),inside:t.languages.jsx}},t.languages.jsx.tag),t.languages.insertBefore("inside","special-attr",{script:{pattern:a("="),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:t.languages.jsx}}},t.languages.jsx.tag);var s=function(t){return t?"string"==typeof t?t:"string"==typeof t.content?t.content:t.content.map(s).join(""):""},g=function(n){for(var e=[],a=0;a0&&e[e.length-1].tagName===s(o.content[0].content[1])&&e.pop():"/>"===o.content[o.content.length-1].content||e.push({tagName:s(o.content[0].content[1]),openedBraces:0}):e.length>0&&"punctuation"===o.type&&"{"===o.content?e[e.length-1].openedBraces++:e.length>0&&e[e.length-1].openedBraces>0&&"punctuation"===o.type&&"}"===o.content?e[e.length-1].openedBraces--:i=!0),(i||"string"==typeof o)&&e.length>0&&0===e[e.length-1].openedBraces){var r=s(o);a0&&("string"==typeof n[a-1]||"plain-text"===n[a-1].type)&&(r=s(n[a-1])+r,n.splice(a-1,1),a--),n[a]=new t.Token("plain-text",r,null,r)}o.content&&"string"!=typeof o.content&&g(o.content)}};t.hooks.add("after-tokenize",(function(t){"jsx"!==t.language&&"tsx"!==t.language||g(t.tokens)}))}(Prism); !function(e){var a=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",a),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var t=e.languages.tsx.tag;t.pattern=RegExp("(^|[^\\w$]|(?=|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),Prism.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete Prism.languages.reason.function; !function(a){var e={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,t="(?:[^\\\\-]|"+n.source+")",s=RegExp(t+"-"+t),i={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};a.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":e,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":e,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":i}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|:=]=?|!=|\b_\b/,punctuation:/[,;.\[\]{}()]/}; Prism.languages.renpy={comment:{pattern:/(^|[^\\])#.+/,lookbehind:!0},string:{pattern:/("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\])*\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,greedy:!0},function:/\b[a-z_]\w*(?=\()/i,property:/\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\b/,tag:/\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\b|\$/,keyword:/\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\b/,boolean:/\b(?:[Ff]alse|[Tt]rue)\b/,number:/(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,punctuation:/[{}[\];(),.:]/},Prism.languages.rpy=Prism.languages.renpy; Prism.languages.rescript={comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},char:{pattern:/'(?:[^\r\n\\]|\\(?:.|\w+))'/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/,function:{pattern:/[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/,lookbehind:!0},number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,boolean:/\b(?:false|true)\b/,"attr-value":/[A-Za-z]\w*(?==)/,constant:{pattern:/(\btype\s+)[a-z]\w*/,lookbehind:!0},tag:{pattern:/(<)[a-z]\w*|(?:<\/)[a-z]\w*/,lookbehind:!0,inside:{operator:/<|>|\//}},keyword:/\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/,operator:/\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/,punctuation:/[(){}[\],;.]/},Prism.languages.insertBefore("rescript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"tag"},rest:Prism.languages.rescript}},string:/[\s\S]+/}}}),Prism.languages.res=Prism.languages.rescript; Prism.languages.rest={table:[{pattern:/(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,lookbehind:!0,inside:{punctuation:/\||(?:\+[=-]+)+\+/}},{pattern:/(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,lookbehind:!0,inside:{punctuation:/[=-]+/}}],"substitution-def":{pattern:/(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,lookbehind:!0,inside:{substitution:{pattern:/^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,alias:"attr-value",inside:{punctuation:/^\||\|$/}},directive:{pattern:/( )(?! )[^:]+::/,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}}}},"link-target":[{pattern:/(^[\t ]*\.\. )\[[^\]]+\]/m,lookbehind:!0,alias:"string",inside:{punctuation:/^\[|\]$/}},{pattern:/(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,lookbehind:!0,alias:"string",inside:{punctuation:/^_|:$/}}],directive:{pattern:/(^[\t ]*\.\. )[^:]+::/m,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}},comment:{pattern:/(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,lookbehind:!0},title:[{pattern:/^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,inside:{punctuation:/^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}},{pattern:/(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,lookbehind:!0,inside:{punctuation:/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}}],hr:{pattern:/((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,lookbehind:!0,alias:"punctuation"},field:{pattern:/(^[\t ]*):[^:\r\n]+:(?= )/m,lookbehind:!0,alias:"attr-name"},"command-line-option":{pattern:/(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,lookbehind:!0,alias:"symbol"},"literal-block":{pattern:/::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,inside:{"literal-block-punctuation":{pattern:/^::/,alias:"punctuation"}}},"quoted-literal-block":{pattern:/::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,inside:{"literal-block-punctuation":{pattern:/^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,alias:"punctuation"}}},"list-bullet":{pattern:/(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,lookbehind:!0,alias:"punctuation"},"doctest-block":{pattern:/(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,lookbehind:!0,inside:{punctuation:/^>>>/}},inline:[{pattern:/(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,lookbehind:!0,inside:{bold:{pattern:/(^\*\*).+(?=\*\*$)/,lookbehind:!0},italic:{pattern:/(^\*).+(?=\*$)/,lookbehind:!0},"inline-literal":{pattern:/(^``).+(?=``$)/,lookbehind:!0,alias:"symbol"},role:{pattern:/^:[^:]+:|:[^:]+:$/,alias:"function",inside:{punctuation:/^:|:$/}},"interpreted-text":{pattern:/(^`).+(?=`$)/,lookbehind:!0,alias:"attr-value"},substitution:{pattern:/(^\|).+(?=\|$)/,lookbehind:!0,alias:"attr-value"},punctuation:/\*\*?|``?|\|/}}],link:[{pattern:/\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,alias:"string",inside:{punctuation:/^\[|\]_$/}},{pattern:/(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,alias:"string",inside:{punctuation:/^_?`|`$|`?_?_$/}}],punctuation:{pattern:/(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,lookbehind:!0}}; Prism.languages.rip={comment:{pattern:/#.*/,greedy:!0},char:{pattern:/\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},regex:{pattern:/(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0},keyword:/(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,builtin:/@|\bSystem\b/,boolean:/\b(?:false|true)\b/,date:/\b\d{4}-\d{2}-\d{2}\b/,time:/\b\d{2}:\d{2}:\d{2}\b/,datetime:/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,symbol:/:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,number:/[+-]?\b(?:\d+\.\d+|\d+)\b/,punctuation:/(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,reference:/[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/}; Prism.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,lookbehind:!0},component:{pattern:/[\w-]+(?=[ \t]*\{)/,alias:"variable"},property:/[\w.-]+(?=[ \t]*:)/,value:{pattern:/(=[ \t]*(?![ \t]))[^,;]+/,lookbehind:!0,alias:"attr-value"},optional:{pattern:/\(optional\)/,alias:"builtin"},wildcard:{pattern:/(\.)\*/,lookbehind:!0,alias:"operator"},punctuation:/[{},.;:=]/}; !function(t){var n={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},e={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function a(t,a){var r={"section-header":{pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"}};for(var o in a)r[o]=a[o];return r.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},r.variable=e,r.comment=n,{pattern:RegExp("^ ?\\*{3}[ \t]*[ \t]*\\*{3}(?:.|[\r\n](?!\\*{3}))*".replace(//g,(function(){return t})),"im"),alias:"section",inside:r}}var r={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},o={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:e}},i={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:e}};t.languages.robotframework={settings:a("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:a("Variables"),"test-cases":a("Test Cases",{"test-name":o,documentation:r,property:i}),keywords:a("Keywords",{"keyword-name":o,documentation:r,property:i}),tasks:a("Tasks",{"task-name":o,documentation:r,property:i}),comment:n},t.languages.robot=t.languages.robotframework}(Prism); !function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,(function(){return a}));a=a.replace(//g,(function(){return"[^\\s\\S]"})),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); !function(e){var t="(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))",a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,n={pattern:RegExp(t+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},r={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},s={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},o=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],l={pattern:RegExp(t),greedy:!0},c=/[$%@.(){}\[\];,\\]/,d={pattern:/%?\b\w+(?=\()/,alias:"keyword"},p={function:d,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l},u={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},m={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},b={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},g={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},k="aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce",y={pattern:RegExp("(^|\\s)(?:action\\s+)?(?:)\\.[a-z]+\\b[^;]+".replace(//g,(function(){return k})),"i"),lookbehind:!0,inside:{keyword:RegExp("(?:)\\.[a-z]+\\b".replace(//g,(function(){return k})),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:o,function:d,"arg-value":p["arg-value"],operator:p.operator,argument:p.arg,number:a,"numeric-constant":n,punctuation:c,string:l}},S={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};e.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp("^[ \t]*(?:select|alter\\s+table|(?:create|describe|drop)\\s+(?:index|table(?:\\s+constraints)?|view)|create\\s+unique\\s+index|insert\\s+into|update)(?:|[^;\"'])+;".replace(//g,(function(){return t})),"im"),alias:"language-sql",inside:e.languages.sql},"global-statements":b,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,groovy:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,(function(){return t})),"im"),lookbehind:!0,alias:"language-groovy",inside:e.languages.groovy},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,lua:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,(function(){return t})),"im"),lookbehind:!0,alias:"language-lua",inside:e.languages.lua},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:p}},"cas-actions":y,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:p},step:s,keyword:S,function:d,format:u,altformat:m,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-args":{pattern:RegExp("(^proc\\s+\\w+\\s+)(?!\\s)(?:[^;\"']|)+;".replace(//g,(function(){return t})),"im"),lookbehind:!0,inside:p},"macro-keyword":r,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":r,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:c}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:o,number:a,"numeric-constant":n}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:p},"cas-actions":y,comment:o,function:d,format:u,altformat:m,"numeric-constant":n,datetime:{pattern:RegExp(t+"(?:dt?|t)"),alias:"number"},string:l,step:s,keyword:S,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:c}}(Prism); !function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var r=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:r,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:r,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(Prism); Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; Prism.languages.scala=Prism.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|derives|do|else|enum|extends|extension|final|finally|for|forSome|given|if|implicit|import|infix|inline|lazy|match|new|null|object|opaque|open|override|package|private|protected|return|sealed|self|super|this|throw|trait|transparent|try|type|using|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,symbol:/'[^\d\s\\]\w*/}),Prism.languages.insertBefore("scala","triple-quoted-string",{"string-interpolation":{pattern:/\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,greedy:!0,inside:{id:{pattern:/^\w+/,greedy:!0,alias:"function"},escape:{pattern:/\\\$"|\$[$"]/,greedy:!0,alias:"symbol"},interpolation:{pattern:/\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,greedy:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:Prism.languages.scala}}},string:/[\s\S]+/}}}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala.function,delete Prism.languages.scala.constant; !function(s){var n=['"(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"',"'[^']*'","\\$'(?:[^'\\\\]|\\\\[^])*'","<<-?\\s*([\"']?)(\\w+)\\1\\s[^]*?[\r\n]\\2"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#%*!/\\\\]+@[^\r\n@:$#%*!/\\\\]+(?::[^\0-\\x1F$#%*?"<>:;|]+)?|[/~.][^\0-\\x1F$#%*?"<>@:;|]*)?[$#%](?=\\s)'+"(?:[^\\\\\r\n \t'\"<$]|[ \t](?:(?!#)|#.*$)|\\\\(?:[^\r]|\r\n?)|\\$(?!')|<(?!<)|<>)+".replace(/<>/g,(function(){return n})),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism); Prism.languages.smali={comment:/#.*/,string:{pattern:/"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,greedy:!0},"class-name":{pattern:/(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,lookbehind:!0,inside:{"class-name":{pattern:/(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,lookbehind:!0},namespace:{pattern:/^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,lookbehind:!0,inside:{punctuation:/\//}},builtin:/^L/}},builtin:[{pattern:/([();\[])[BCDFIJSVZ]+/,lookbehind:!0},{pattern:/([\w$>]:)[BCDFIJSVZ]/,lookbehind:!0}],keyword:[{pattern:/(\.end\s+)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])\.(?!\d)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,lookbehind:!0}],function:{pattern:/(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,lookbehind:!0},field:{pattern:/[\w$]+(?=:)/,alias:"variable"},register:{pattern:/(^|[^\w.-])[vp]\d(?![\w.-])/,lookbehind:!0,alias:"variable"},boolean:{pattern:/(^|[^\w.-])(?:false|true)(?![\w.-])/,lookbehind:!0},number:{pattern:/(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,lookbehind:!0},label:{pattern:/(:)\w+/,lookbehind:!0,alias:"property"},operator:/->|\.\.|[\[=]/,punctuation:/[{}(),;:]/}; Prism.languages.smalltalk={comment:{pattern:/"(?:""|[^"])*"/,greedy:!0},char:{pattern:/\$./,greedy:!0},string:{pattern:/'(?:''|[^'])*'/,greedy:!0},symbol:/#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,"block-arguments":{pattern:/(\[\s*):[^\[|]*\|/,lookbehind:!0,inside:{variable:/:[\da-z]+/i,punctuation:/\|/}},"temporary-variables":{pattern:/\|[^|]+\|/,inside:{variable:/[\da-z]+/i,punctuation:/\|/}},keyword:/\b(?:new|nil|self|super)\b/,boolean:/\b(?:false|true)\b/,number:[/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,/\b\d+(?:\.\d+)?(?:e-?\d+)?/],operator:/[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,punctuation:/[.;:?\[\](){}]/}; !function(e){e.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:e.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},e.languages.smarty["embedded-php"].inside.smarty.inside=e.languages.smarty,e.languages.smarty.string[0].inside.interpolation.inside.expression.inside=e.languages.smarty;var n=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,t=RegExp("\\{\\*[^]*?\\*\\}|\\{php\\}[^]*?\\{/php\\}|"+"\\{(?:[^{}\"']||\\{(?:[^{}\"']||\\{(?:[^{}\"']|)*\\})*\\})*\\}".replace(//g,(function(){return n.source})),"g");e.hooks.add("before-tokenize",(function(n){var a=!1;e.languages["markup-templating"].buildPlaceholders(n,"smarty",t,(function(e){return"{/literal}"===e&&(a=!1),!a&&("{literal}"===e&&(a=!0),!0)}))})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"smarty")}))}(Prism); !function(e){var n=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;e.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp("((?:^|[^:]):\\s*)(?:\\s*(?:(?:\\*|->)\\s*|,\\s*(?:(?=)|(?!)\\s+)))*".replace(//g,(function(){return"\\s*(?:[*,]|->)"})).replace(//g,(function(){return"(?:'[\\w']*||\\((?:[^()]|\\([^()]*\\))*\\)|\\{(?:[^{}]|\\{[^{}]*\\})*\\})(?:\\s+)*"})).replace(//g,(function(){return"(?!)[a-z\\d_][\\w'.]*"})).replace(//g,(function(){return n.source})),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:n,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},e.languages.sml["class-name"][0].inside=e.languages.sml,e.languages.smlnj=e.languages.sml}(Prism); Prism.languages.solidity=Prism.languages.extend("clike",{"class-name":{pattern:/(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,lookbehind:!0},keyword:/\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,operator:/=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/}),Prism.languages.insertBefore("solidity","keyword",{builtin:/\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/}),Prism.languages.insertBefore("solidity","number",{version:{pattern:/([<>]=?|\^)\d+\.\d+\.\d+\b/,lookbehind:!0,alias:"number"}}),Prism.languages.sol=Prism.languages.solidity; !function(n){var t={pattern:/\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,alias:"constant",inside:{punctuation:/[{}]/}};n.languages["solution-file"]={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0,inside:{guid:t}},object:{pattern:/^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,lookbehind:!0,greedy:!0,alias:"keyword"},property:{pattern:/^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,lookbehind:!0,inside:{guid:t}},guid:t,number:/\b\d+(?:\.\d+)*\b/,boolean:/\b(?:FALSE|TRUE)\b/,operator:/=/,punctuation:/[(),]/},n.languages.sln=n.languages["solution-file"]}(Prism); !function(e){var a=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,t=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;e.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:a,greedy:!0},number:t,punctuation:/[\[\].?]/}},string:{pattern:a,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:t,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},e.hooks.add("before-tokenize",(function(a){var t=!1;e.languages["markup-templating"].buildPlaceholders(a,"soy",/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,(function(e){return"{/literal}"===e&&(t=!1),!t&&("{literal}"===e&&(t=!0),!0)}))})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"soy")}))}(Prism); Prism.languages.turtle={comment:{pattern:/#.*/,greedy:!0},"multiline-string":{pattern:/"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,greedy:!0,alias:"string",inside:{comment:/#.*/}},string:{pattern:/"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,greedy:!0},url:{pattern:/<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,greedy:!0,inside:{punctuation:/[<>]/}},function:{pattern:/(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,inside:{"local-name":{pattern:/([^:]*:)[\s\S]+/,lookbehind:!0},prefix:{pattern:/[\s\S]+/,inside:{punctuation:/:/}}}},number:/[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[{}.,;()[\]]|\^\^/,boolean:/\b(?:false|true)\b/,keyword:[/(?:\ba|@prefix|@base)\b|=/,/\b(?:base|graph|prefix)\b/i],tag:{pattern:/@[a-z]+(?:-[a-z\d]+)*/i,inside:{punctuation:/@/}}},Prism.languages.trig=Prism.languages.turtle; Prism.languages.sparql=Prism.languages.extend("turtle",{boolean:/\b(?:false|true)\b/i,variable:{pattern:/[?$]\w+/,greedy:!0}}),Prism.languages.insertBefore("sparql","punctuation",{keyword:[/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,/\b(?:BASE|GRAPH|PREFIX)\b/i]}),Prism.languages.rq=Prism.languages.sparql; Prism.languages["splunk-spl"]={comment:/`comment\("(?:\\.|[^\\"])*"\)`/,string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0},keyword:/\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,"operator-word":{pattern:/\b(?:and|as|by|not|or|xor)\b/i,alias:"operator"},function:/\b\w+(?=\s*\()/,property:/\b\w+(?=\s*=(?!=))/,date:{pattern:/\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,alias:"number"},number:/\b\d+(?:\.\d+)?\b/,boolean:/\b(?:f|false|t|true)\b/i,operator:/[<>=]=?|[-+*/%|]/,punctuation:/[()[\],]/}; Prism.languages.sqf=Prism.languages.extend("clike",{string:{pattern:/"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,greedy:!0},keyword:/\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,number:/(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,operator:/##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,"magic-variable":{pattern:/\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,alias:"keyword"},constant:/\bDIK(?:_[a-z\d]+)+\b/i}),Prism.languages.insertBefore("sqf","string",{macro:{pattern:/(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{directive:{pattern:/#[a-z]+\b/i,alias:"keyword"},comment:Prism.languages.sqf.comment}}}),delete Prism.languages.sqf["class-name"]; Prism.languages.squirrel=Prism.languages.extend("clike",{comment:[Prism.languages.clike.comment[0],{pattern:/(^|[^\\:])(?:\/\/|#).*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,lookbehind:!0,greedy:!0},"class-name":{pattern:/(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,lookbehind:!0,inside:{punctuation:/\./}},keyword:/\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\b/,number:/\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,operator:/\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,punctuation:/[(){}\[\],;.]/}),Prism.languages.insertBefore("squirrel","string",{char:{pattern:/(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,lookbehind:!0,greedy:!0}}),Prism.languages.insertBefore("squirrel","operator",{"attribute-punctuation":{pattern:/<\/|\/>/,alias:"important"},lambda:{pattern:/@(?=\()/,alias:"operator"}}); !function(e){var r=/\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;e.languages.stan={comment:/\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,string:{pattern:/"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,greedy:!0},directive:{pattern:/^([ \t]*)#include\b.*/m,lookbehind:!0,alias:"property"},"function-arg":{pattern:RegExp("("+r.source+"\\s*\\(\\s*)[a-zA-Z]\\w*"),lookbehind:!0,alias:"function"},constraint:{pattern:/(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,lookbehind:!0,inside:{expression:{pattern:/(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,lookbehind:!0,inside:null},property:/\b[a-z]\w*(?=\s*=)/i,operator:/=/,punctuation:/^<|>$|,/}},keyword:[{pattern:/\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,alias:"program-block"},/\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,r],function:/\b[a-z]\w*(?=\s*\()/i,number:/(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,boolean:/\b(?:false|true)\b/,operator:/<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,punctuation:/[()\[\]{},;]/},e.languages.stan.constraint.inside.expression.inside=e.languages.stan}(Prism); Prism.languages.stata={comment:[{pattern:/(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0}],"string-literal":{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,inside:{punctuation:/^\$\{|\}$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},mata:{pattern:/(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-mata",inside:Prism.languages.mata},java:{pattern:/(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-java",inside:Prism.languages.java},python:{pattern:/(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-python",inside:Prism.languages.python},command:{pattern:/(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,lookbehind:!0,greedy:!0,alias:"keyword"},variable:/\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,keyword:/\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,boolean:/\b(?:off|on)\b/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+/,function:/\b[a-z_]\w*(?=\()/i,operator:/\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,punctuation:/[(){}[\],:]/},Prism.languages.stata["string-literal"].inside.interpolation.inside.expression.inside=Prism.languages.stata; Prism.languages.iecst={comment:[{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:[/\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP)|VAR|METHOD|PROPERTY)\b/i,/\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\b/],"class-name":/\b(?:ANY|ARRAY|BOOL|BYTE|U?(?:D|L|S)?INT|(?:D|L)?WORD|DATE(?:_AND_TIME)?|DT|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\b/,address:{pattern:/%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,alias:"symbol"},number:/\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:D|DT|T|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/,operator:/S?R?:?=>?|&&?|\*\*?|<[=>]?|>=?|[-:^/+#]|\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,punctuation:/[()[\].,;]/}; !function(e){var n={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},t={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:n,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:n,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:r,punctuation:/[{}()\[\];:,]/};t.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:t}},t.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:t}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:t}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:t}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:t}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:t.interpolation,comment:t.comment,punctuation:/[{},]/}},func:t.func,string:t.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:t.interpolation,punctuation:/[{}()\[\];:.]/}}(Prism); Prism.languages.supercollider={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/,lookbehind:!0,greedy:!0},char:{pattern:/\$(?:[^\\\r\n]|\\.)/,greedy:!0},symbol:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|arg|classvar|const|nil|var|while)\b/,boolean:/\b(?:false|true)\b/,label:{pattern:/\b[a-z_]\w*(?=\s*:)/,alias:"property"},number:/\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/,"class-name":/\b[A-Z]\w*\b/,operator:/\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/,punctuation:/[{}()[\].:,;]|#[[{]/},Prism.languages.sclang=Prism.languages.supercollider; Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift})); !function(e){var t={pattern:/^[;#].*/m,greedy:!0},n='"(?:[^\r\n"\\\\]|\\\\(?:[^\r]|\r\n?))*"(?!\\S)';e.languages.systemd={comment:t,section:{pattern:/^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,greedy:!0,inside:{punctuation:/^\[|\]$/,"section-name":{pattern:/[\s\S]+/,alias:"selector"}}},key:{pattern:/^[^\s=]+(?=[ \t]*=)/m,greedy:!0,alias:"attr-name"},value:{pattern:RegExp("(=[ \t]*(?!\\s))(?:"+n+'|(?=[^"\r\n]))(?:[^\\s\\\\]|[ \t]+(?:(?![ \t"])|'+n+")|\\\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;]))*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:t,quoted:{pattern:RegExp("(^|\\s)"+n),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}}(Prism); !function(e){function t(e,t,a){return{pattern:RegExp("<#"+e+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+e+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:t,alias:a}}}}e.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:function(a){var n=e.languages[a],i="language-"+a;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:t("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:t("=",n,i),"class-feature":t("\\+",n,i),standard:t("",n,i)}}}}})}(Prism); Prism.languages.t4=Prism.languages["t4-cs"]=Prism.languages["t4-templating"].createT4("csharp"); Prism.languages.vbnet=Prism.languages.extend("basic",{comment:[{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},{pattern:/(^|[^\\:])'.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^"])"(?:""|[^"])*"(?!")/,lookbehind:!0,greedy:!0},keyword:/(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,punctuation:/[,;:(){}]/}); Prism.languages["t4-vb"]=Prism.languages["t4-templating"].createT4("vbnet"); !function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); Prism.languages.tap={fail:/not ok[^#{\n\r]*/,pass:/ok[^#{\n\r]*/,pragma:/pragma [+-][a-z]+/,bailout:/bail out!.*/i,version:/TAP version \d+/i,plan:/\b\d+\.\.\d+(?: +#.*)?/,subtest:{pattern:/# Subtest(?:: .*)?/,greedy:!0},punctuation:/[{}]/,directive:/#.*/,yamlish:{pattern:/(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,lookbehind:!0,inside:Prism.languages.yaml,alias:"language-yaml"}}; Prism.languages.tcl={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,greedy:!0},variable:[{pattern:/(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,lookbehind:!0},{pattern:/(\$)\{[^}]+\}/,lookbehind:!0},{pattern:/(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,lookbehind:!0}],function:{pattern:/(^[\t ]*proc[ \t]+)\S+/m,lookbehind:!0},builtin:[{pattern:/(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,lookbehind:!0},/\b(?:else|elseif)\b/],scope:{pattern:/(^[\t ]*)(?:global|upvar|variable)\b/m,lookbehind:!0,alias:"constant"},keyword:{pattern:/(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,lookbehind:!0},operator:/!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,punctuation:/[{}()\[\]]/}; !function(e){e.languages.tt2=e.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),e.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),e.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),e.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete e.languages.tt2.string,e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"tt2",/\[%[\s\S]+?%\]/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"tt2")}))}(Prism); !function(n){function e(n,e){return RegExp(n.replace(//g,(function(){return"(?:\\([^|()\n]+\\)|\\[[^\\]\n]+\\]|\\{[^}\n]+\\})"})).replace(//g,(function(){return"(?:\\)|\\((?![^|()\n]+\\)))"})),e||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},t=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:e("^[a-z]\\w*(?:||[<>=])*\\."),inside:{modifier:{pattern:e("(^[a-z]\\w*)(?:||[<>=])+(?=\\.)"),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:e("^[*#]+*\\s+\\S.*","m"),inside:{modifier:{pattern:e("(^[*#]+)+"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:e("^(?:(?:||[<>=^~])+\\.\\s*)?(?:\\|(?:(?:||[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:||[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|","m"),inside:{modifier:{pattern:e("(^|\\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:e("(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])*.+?\\2(?![a-zA-Z\\d])"),lookbehind:!0,inside:{bold:{pattern:e("(^(\\*\\*?)*).+?(?=\\2)"),lookbehind:!0},italic:{pattern:e("(^(__?)*).+?(?=\\2)"),lookbehind:!0},cite:{pattern:e("(^\\?\\?*).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:e("(^@*).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:e("(^\\+*).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:e("(^-*).+?(?=-)"),lookbehind:!0},span:{pattern:e("(^%*).+?(?=%)"),lookbehind:!0},modifier:{pattern:e("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])+"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:e('"*[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:e('(^"*)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:e('(^")+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:e("!(?:||[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:e("(^!(?:||[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:e("(^!)(?:||[<>=])+"),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),a=t.phrase.inside,o={inline:a.inline,link:a.link,image:a.image,footnote:a.footnote,acronym:a.acronym,mark:a.mark};t.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var r=a.inline.inside;r.bold.inside=o,r.italic.inside=o,r.inserted.inside=o,r.deleted.inside=o,r.span.inside=o;var d=a.table.inside;d.inline=o.inline,d.link=o.link,d.image=o.image,d.footnote=o.footnote,d.acronym=o.acronym,d.mark=o.mark}(Prism); !function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); !function(e){e.languages.tremor={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},"interpolated-string":null,extractor:{pattern:/\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,greedy:!0,inside:{regex:{pattern:/(^re)\|[\s\S]+/,lookbehind:!0},function:/^\w+/,value:/\|[\s\S]+/}},identifier:{pattern:/`[^`]*`/,greedy:!0},function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,keyword:/\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,boolean:/\b(?:false|null|true)\b/i,number:/\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,"pattern-punctuation":{pattern:/%(?=[({[])/,alias:"punctuation"},operator:/[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?>?=?|(?:absent|and|not|or|present|xor)\b/,punctuation:/::|[;\[\]()\{\},.:]/};var n='#\\{(?:[^"{}]|\\{[^{}]*\\}|"(?:[^"\\\\\r\n]|\\\\(?:\r\n|[^]))*")*\\}';e.languages.tremor["interpolated-string"]={pattern:RegExp('(^|[^\\\\])(?:"""(?:[^"\\\\#]|\\\\[^]|"(?!"")|#(?!\\{)|'+n+')*"""|"(?:[^"\\\\\r\n#]|\\\\(?:\r\n|[^])|#(?!\\{)|'+n+')*")'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:RegExp(n),inside:{punctuation:/^#\{|\}$/,expression:{pattern:/[\s\S]+/,inside:e.languages.tremor}}},string:/[\s\S]+/}},e.languages.troy=e.languages.tremor,e.languages.trickle=e.languages.tremor}(Prism); Prism.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},Prism.hooks.add("before-tokenize",(function(e){"twig"===e.language&&Prism.languages["markup-templating"].buildPlaceholders(e,"twig",/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g)})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"twig")})); !function(E){var n=/\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;E.languages.typoscript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^"'])#.*/,lookbehind:!0,greedy:!0}],function:[{pattern://,inside:{string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,inside:{keyword:n}},keyword:{pattern:/INCLUDE_TYPOSCRIPT/}}},{pattern:/@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,inside:{string:/"[^"\r\n]*"|'[^'\r\n]*'/}}],string:{pattern:/^([^=]*=[< ]?)(?:(?!\]\n).)*/,lookbehind:!0,inside:{function:/\{\$.*\}/,keyword:n,number:/^\d+$/,punctuation:/[,|:]/}},keyword:n,number:{pattern:/\b\d+\s*[.{=]/,inside:{operator:/[.{=]/}},tag:{pattern:/\.?[-\w\\]+\.?/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:|]/,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/},E.languages.tsconfig=E.languages.typoscript}(Prism); Prism.languages.unrealscript={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},category:{pattern:/(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,lookbehind:!0,greedy:!0,alias:"property"},metadata:{pattern:/(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,lookbehind:!0,greedy:!0,inside:{property:/\b\w+(?=\s*=)/,operator:/=/,punctuation:/[<>|]/}},macro:{pattern:/`\w+/,alias:"property"},"class-name":{pattern:/(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,lookbehind:!0},keyword:/\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/>>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:ClockwiseFrom|Cross|Dot)\b/,punctuation:/[()[\]{};,.]/},Prism.languages.uc=Prism.languages.uscript=Prism.languages.unrealscript; Prism.languages.uorazor={"comment-hash":{pattern:/#.*/,alias:"comment",greedy:!0},"comment-slash":{pattern:/\/\/.*/,alias:"comment",greedy:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/},greedy:!0},"source-layers":{pattern:/\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\b/i,alias:"function"},"source-commands":{pattern:/\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\b/,alias:"function"},"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},function:/\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\b/,keyword:/\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/}; Prism.languages.uri={scheme:{pattern:/^[a-z][a-z0-9+.-]*:/im,greedy:!0,inside:{"scheme-delimiter":/:$/}},fragment:{pattern:/#[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"fragment-delimiter":/^#/}},query:{pattern:/\?[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"query-delimiter":{pattern:/^\?/,greedy:!0},"pair-delimiter":/[&;]/,pair:{pattern:/^[^=][\s\S]*/,inside:{key:/^[^=]+/,value:{pattern:/(^=)[\s\S]+/,lookbehind:!0}}}}},authority:{pattern:RegExp("^//(?:[\\w\\-.~!$&'()*+,;=%:]*@)?(?:\\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\\.[\\w\\-.~!$&'()*+,;=]+)\\]|[\\w\\-.~!$&'()*+,;=%]*)(?::\\d*)?","m"),inside:{"authority-delimiter":/^\/\//,"user-info-segment":{pattern:/^[\w\-.~!$&'()*+,;=%:]*@/,inside:{"user-info-delimiter":/@$/,"user-info":/^[\w\-.~!$&'()*+,;=%:]+/}},"port-segment":{pattern:/:\d*$/,inside:{"port-delimiter":/^:/,port:/^\d+/}},host:{pattern:/[\s\S]+/,inside:{"ip-literal":{pattern:/^\[[\s\S]+\]$/,inside:{"ip-literal-delimiter":/^\[|\]$/,"ipv-future":/^v[\s\S]+/,"ipv6-address":/^[\s\S]+/}},"ipv4-address":/^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/}}}},path:{pattern:/^[\w\-.~!$&'()*+,;=%:@/]+/m,inside:{"path-separator":/\//}}},Prism.languages.url=Prism.languages.uri; !function(e){var n={pattern:/[\s\S]+/,inside:null};e.languages.v=e.languages.extend("clike",{string:{pattern:/r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,alias:"quoted-string",greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,lookbehind:!0,inside:{"interpolation-variable":{pattern:/^\$\w[\s\S]*$/,alias:"variable"},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},"interpolation-expression":n}}}},"class-name":{pattern:/(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,lookbehind:!0},keyword:/(?:\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:else|for|if)|#(?:flag|include))\b/,number:/\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,operator:/~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,builtin:/\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/}),n.inside=e.languages.v,e.languages.insertBefore("v","string",{char:{pattern:/`(?:\\`|\\?[^`]{1,2})`/,alias:"rune"}}),e.languages.insertBefore("v","operator",{attribute:{pattern:/(^[\t ]*)\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\]/m,lookbehind:!0,alias:"annotation",inside:{punctuation:/[\[\]]/,keyword:/\w+/}},generic:{pattern:/<\w+>(?=\s*[\)\{])/,inside:{punctuation:/[<>]/,"class-name":/\w+/}}}),e.languages.insertBefore("v","function",{"generic-function":{pattern:/\b\w+\s*<\w+>(?=\()/,inside:{function:/^\w+/,generic:{pattern:/<\w+>/,inside:e.languages.v.generic.inside}}}})}(Prism); Prism.languages.vala=Prism.languages.extend("clike",{"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],keyword:/\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,function:/\b\w+(?=\s*\()/,number:/(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,operator:/\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,punctuation:/[{}[\];(),.:]/,constant:/\b[A-Z0-9_]+\b/}),Prism.languages.insertBefore("vala","string",{"raw-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"template-string":{pattern:/@"[\s\S]*?"/,greedy:!0,inside:{interpolation:{pattern:/\$(?:\([^)]*\)|[a-zA-Z]\w*)/,inside:{delimiter:{pattern:/^\$\(?|\)$/,alias:"punctuation"},rest:Prism.languages.vala}},string:/[\s\S]+/}}}),Prism.languages.insertBefore("vala","keyword",{regex:{pattern:/\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\//,"regex-flags":/^[a-z]+$/}}}); !function(e){e.languages.velocity=e.languages.extend("markup",{});var n={variable:{pattern:/(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,lookbehind:!0,inside:{}},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},number:/\b\d+\b/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,punctuation:/[(){}[\]:,.]/};n.variable.inside={string:n.string,function:{pattern:/([^\w-])[a-z][\w-]*(?=\()/,lookbehind:!0},number:n.number,boolean:n.boolean,punctuation:n.punctuation},e.languages.insertBefore("velocity","comment",{unparsed:{pattern:/(^|[^\\])#\[\[[\s\S]*?\]\]#/,lookbehind:!0,greedy:!0,inside:{punctuation:/^#\[\[|\]\]#$/}},"velocity-comment":[{pattern:/(^|[^\\])#\*[\s\S]*?\*#/,lookbehind:!0,greedy:!0,alias:"comment"},{pattern:/(^|[^\\])##.*/,lookbehind:!0,greedy:!0,alias:"comment"}],directive:{pattern:/(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,lookbehind:!0,inside:{keyword:{pattern:/^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,inside:{punctuation:/[{}]/}},rest:n}},variable:n.variable}),e.languages.velocity.tag.inside["attr-value"].inside.rest=e.languages.velocity}(Prism); Prism.languages.verilog={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"kernel-function":{pattern:/\B\$\w+\b/,alias:"property"},constant:/\B`\w+\b/,function:/\b\w+(?=\()/,keyword:/\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,important:/\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,number:/\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,operator:/[-+{}^~%*\/?=!<>&|]+/,punctuation:/[[\];(),.:]/}; Prism.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}; Prism.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,function:/\b\w+(?=\()/,keyword:/\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/}; Prism.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,alias:"property",greedy:!0},string:{pattern:/\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,greedy:!0},date:{pattern:/#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,alias:"number"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,boolean:/\b(?:False|Nothing|True)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,operator:/[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,punctuation:/[{}().,:?]/},Prism.languages.vb=Prism.languages["visual-basic"],Prism.languages.vba=Prism.languages["visual-basic"]; Prism.languages.warpscript={comment:/#.*|\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,greedy:!0},variable:/\$\S+/,macro:{pattern:/@\S+/,alias:"property"},keyword:/\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,number:/[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,boolean:/\b(?:F|T|false|true)\b/,punctuation:/<%|%>|[{}[\]()]/,operator:/==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/}; Prism.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/}; !function(e){var n="(?:\\B-|\\b_|\\b)[A-Za-z][\\w-]*(?![\\w-])",t="(?:\\b(?:unsigned\\s+)?long\\s+long(?![\\w-])|\\b(?:unrestricted|unsigned)\\s+[a-z]+(?![\\w-])|(?!(?:unrestricted|unsigned)\\b)"+n+"(?:\\s*<(?:[^<>]|<[^<>]*>)*>)?)(?:\\s*\\?)?",i={};for(var r in e.languages["web-idl"]={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},string:{pattern:/"[^"]*"/,greedy:!0},namespace:{pattern:RegExp("(\\bnamespace\\s+)"+n),lookbehind:!0},"class-name":[{pattern:/(^|[^\w-])(?:iterable|maplike|setlike)\s*<(?:[^<>]|<[^<>]*>)*>/,lookbehind:!0,inside:i},{pattern:RegExp("(\\b(?:attribute|const|deleter|getter|optional|setter)\\s+)"+t),lookbehind:!0,inside:i},{pattern:RegExp("(\\bcallback\\s+"+n+"\\s*=\\s*)"+t),lookbehind:!0,inside:i},{pattern:RegExp("(\\btypedef\\b\\s*)"+t),lookbehind:!0,inside:i},{pattern:RegExp("(\\b(?:callback|dictionary|enum|interface(?:\\s+mixin)?)\\s+)(?!(?:interface|mixin)\\b)"+n),lookbehind:!0},{pattern:RegExp("(:\\s*)"+n),lookbehind:!0},RegExp(n+"(?=\\s+(?:implements|includes)\\b)"),{pattern:RegExp("(\\b(?:implements|includes)\\s+)"+n),lookbehind:!0},{pattern:RegExp(t+"(?=\\s*(?:\\.{3}\\s*)?"+n+"\\s*[(),;=])"),inside:i}],builtin:/\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\b/,keyword:[/\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\b/,/\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\b/],boolean:/\b(?:false|true)\b/,number:{pattern:/(^|[^\w-])-?(?:0x[0-9a-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|NaN|Infinity)(?![\w-])/i,lookbehind:!0},operator:/\.{3}|[=:?<>-]/,punctuation:/[(){}[\].,;]/},e.languages["web-idl"])"class-name"!==r&&(i[r]=e.languages["web-idl"][r]);e.languages.webidl=e.languages["web-idl"]}(Prism); Prism.languages.wgsl={comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},"builtin-attribute":{pattern:/(@)builtin\(.*?\)/,lookbehind:!0,inside:{attribute:{pattern:/^builtin/,alias:"attr-name"},punctuation:/[(),]/,"built-in-values":{pattern:/\b(?:frag_depth|front_facing|global_invocation_id|instance_index|local_invocation_id|local_invocation_index|num_workgroups|position|sample_index|sample_mask|vertex_index|workgroup_id)\b/,alias:"attr-value"}}},attributes:{pattern:/(@)(?:align|binding|compute|const|fragment|group|id|interpolate|invariant|location|size|vertex|workgroup_size)/i,lookbehind:!0,alias:"attr-name"},functions:{pattern:/\b(fn\s+)[_a-zA-Z]\w*(?=[(<])/,lookbehind:!0,alias:"function"},keyword:/\b(?:bitcast|break|case|const|continue|continuing|default|discard|else|enable|fallthrough|fn|for|function|if|let|loop|private|return|storage|struct|switch|type|uniform|var|while|workgroup)\b/,builtin:/\b(?:abs|acos|acosh|all|any|array|asin|asinh|atan|atan2|atanh|atomic|atomicAdd|atomicAnd|atomicCompareExchangeWeak|atomicExchange|atomicLoad|atomicMax|atomicMin|atomicOr|atomicStore|atomicSub|atomicXor|bool|ceil|clamp|cos|cosh|countLeadingZeros|countOneBits|countTrailingZeros|cross|degrees|determinant|distance|dot|dpdx|dpdxCoarse|dpdxFine|dpdy|dpdyCoarse|dpdyFine|exp|exp2|extractBits|f32|f64|faceForward|firstLeadingBit|floor|fma|fract|frexp|fwidth|fwidthCoarse|fwidthFine|i32|i64|insertBits|inverseSqrt|ldexp|length|log|log2|mat[2-4]x[2-4]|max|min|mix|modf|normalize|override|pack2x16float|pack2x16snorm|pack2x16unorm|pack4x8snorm|pack4x8unorm|pow|ptr|quantizeToF16|radians|reflect|refract|reverseBits|round|sampler|sampler_comparison|select|shiftLeft|shiftRight|sign|sin|sinh|smoothstep|sqrt|staticAssert|step|storageBarrier|tan|tanh|textureDimensions|textureGather|textureGatherCompare|textureLoad|textureNumLayers|textureNumLevels|textureNumSamples|textureSample|textureSampleBias|textureSampleCompare|textureSampleCompareLevel|textureSampleGrad|textureSampleLevel|textureStore|texture_1d|texture_2d|texture_2d_array|texture_3d|texture_cube|texture_cube_array|texture_depth_2d|texture_depth_2d_array|texture_depth_cube|texture_depth_cube_array|texture_depth_multisampled_2d|texture_multisampled_2d|texture_storage_1d|texture_storage_2d|texture_storage_2d_array|texture_storage_3d|transpose|trunc|u32|u64|unpack2x16float|unpack2x16snorm|unpack2x16unorm|unpack4x8snorm|unpack4x8unorm|vec[2-4]|workgroupBarrier)\b/,"function-calls":{pattern:/\b[_a-z]\w*(?=\()/i,alias:"function"},"class-name":/\b(?:[A-Z][A-Za-z0-9]*)\b/,"bool-literal":{pattern:/\b(?:false|true)\b/,alias:"boolean"},"hex-int-literal":{pattern:/\b0[xX][0-9a-fA-F]+[iu]?\b(?![.pP])/,alias:"number"},"hex-float-literal":{pattern:/\b0[xX][0-9a-fA-F]*(?:\.[0-9a-fA-F]*)?(?:[pP][+-]?\d+[fh]?)?/,alias:"number"},"decimal-float-literal":[{pattern:/\d*\.\d+(?:[eE](?:\+|-)?\d+)?[fh]?/,alias:"number"},{pattern:/\d+\.\d*(?:[eE](?:\+|-)?\d+)?[fh]?/,alias:"number"},{pattern:/\d+[eE](?:\+|-)?\d+[fh]?/,alias:"number"},{pattern:/\b\d+[fh]\b/,alias:"number"}],"int-literal":{pattern:/\b\d+[iu]?\b/,alias:"number"},operator:[{pattern:/(?:\^|~|\|(?!\|)|\|\||&&|<<|>>|!)(?!=)/},{pattern:/&(?![&=])/},{pattern:/(?:\+=|-=|\*=|\/=|%=|\^=|&=|\|=|<<=|>>=)/},{pattern:/(^|[^<>=!])=(?![=>])/,lookbehind:!0},{pattern:/(?:==|!=|<=|\+\+|--|(^|[^=])>=)/,lookbehind:!0},{pattern:/(?:(?:[+%]|(?:\*(?!\w)))(?!=))|(?:-(?!>))|(?:\/(?!\/))/},{pattern:/->/}],punctuation:/[@(){}[\],;<>:.]/}; Prism.languages.wiki=Prism.languages.extend("markup",{"block-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,alias:"comment"},heading:{pattern:/^(=+)[^=\r\n].*?\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\1/,inside:{"bold-italic":{pattern:/(''''').+?(?=\1)/,lookbehind:!0,alias:["bold","italic"]},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:"punctuation"},url:[/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,/\[\[.+?\]\]|\[.+?\]/],variable:[/__[A-Z]+__/,/\{{3}.+?\}{3}/,/\{\{.+?\}\}/],symbol:[/^#redirect/im,/~{3,5}/],"table-tag":{pattern:/((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,lookbehind:!0,inside:{"table-bar":{pattern:/\|$/,alias:"punctuation"},rest:Prism.languages.markup.tag.inside}},punctuation:/^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m}),Prism.languages.insertBefore("wiki","tag",{nowiki:{pattern:/<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,inside:Prism.languages.markup.tag.inside}}}}); Prism.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.mathematica=Prism.languages.wolfram,Prism.languages.wl=Prism.languages.wolfram,Prism.languages.nb=Prism.languages.wolfram; Prism.languages.wren={comment:[{pattern:/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*))*\*\/)*\*\/)*\*\//,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"string-literal":null,hashbang:{pattern:/^#!\/.+/,greedy:!0,alias:"comment"},attribute:{pattern:/#!?[ \t\u3000]*\w+/,alias:"keyword"},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},/\b[A-Z][a-z\d_]*\b/],constant:/\b[A-Z][A-Z\d_]*\b/,null:{pattern:/\bnull\b/,alias:"keyword"},keyword:/\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\b/,boolean:/\b(?:false|true)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,function:/\b[a-z_]\w*(?=\s*[({])/i,operator:/<<|>>|[=!<>]=?|&&|\|\||[-+*/%~^&|?:]|\.{2,3}/,punctuation:/[\[\](){}.,;]/},Prism.languages.wren["string-literal"]={pattern:/(^|[^\\"])"(?:[^\\"%]|\\[\s\S]|%(?!\()|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\))*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\)/,lookbehind:!0,inside:{expression:{pattern:/^(%\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:Prism.languages.wren},"interpolation-punctuation":{pattern:/^%\(|\)$/,alias:"punctuation"}}},string:/[\s\S]+/}}; !function(n){n.languages.xeora=n.languages.extend("markup",{constant:{pattern:/\$(?:DomainContents|PageRenderDuration)\$/,inside:{punctuation:{pattern:/\$/}}},variable:{pattern:/\$@?(?:#+|[-+*~=^])?[\w.]+\$/,inside:{punctuation:{pattern:/[$.]/},operator:{pattern:/#+|[-+*~=^@]/}}},"function-inline":{pattern:/\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,inside:{variable:{pattern:/(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,inside:{punctuation:{pattern:/[,.|]/},operator:{pattern:/#+|[-+*~=^@]/}}},punctuation:{pattern:/\$\w:|[$:?.,|]/}},alias:"function"},"function-block":{pattern:/\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,inside:{punctuation:{pattern:/[$:{}?.,|]/}},alias:"function"},"directive-inline":{pattern:/\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}}},alias:"function"},"directive-block-open":{pattern:/\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}},attribute:{pattern:/![A-Z]+$/,inside:{punctuation:{pattern:/!/}},alias:"keyword"}},alias:"function"},"directive-block-separator":{pattern:/\}:[-\w.]+:\{/,inside:{punctuation:{pattern:/[:{}]/}},alias:"function"},"directive-block-close":{pattern:/\}:[-\w.]+\$/,inside:{punctuation:{pattern:/[:{}$]/}},alias:"function"}}),n.languages.insertBefore("inside","punctuation",{variable:n.languages.xeora["function-inline"].inside.variable},n.languages.xeora["function-block"]),n.languages.xeoracube=n.languages.xeora}(Prism); !function(a){function e(e,n){a.languages[e]&&a.languages.insertBefore(e,"comment",{"doc-comment":n})}var n=a.languages.markup.tag,t={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:n}},g={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:n}};e("csharp",t),e("fsharp",t),e("vbnet",g)}(Prism); Prism.languages.xojo={comment:{pattern:/(?:'|\/\/|Rem\b).+/i,greedy:!0},string:{pattern:/"(?:""|[^"])*"/,greedy:!0},number:[/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,/&[bchou][a-z\d]+/i],directive:{pattern:/#(?:Else|ElseIf|Endif|If|Pragma)\b/i,alias:"property"},keyword:/\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,operator:/<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,punctuation:/[.,;:()]/}; !function(e){e.languages.xquery=e.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),e.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,e.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,e.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,e.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:e.languages.xquery,alias:"language-xquery"};var t=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(t).join("")},n=function(a){for(var o=[],i=0;i0&&o[o.length-1].tagName===t(r.content[0].content[1])&&o.pop():"/>"===r.content[r.content.length-1].content||o.push({tagName:t(r.content[0].content[1]),openedBraces:0}):!(o.length>0&&"punctuation"===r.type&&"{"===r.content)||a[i+1]&&"punctuation"===a[i+1].type&&"{"===a[i+1].content||a[i-1]&&"plain-text"===a[i-1].type&&"{"===a[i-1].content?o.length>0&&o[o.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?o[o.length-1].openedBraces--:"comment"!==r.type&&(s=!0):o[o.length-1].openedBraces++),(s||"string"==typeof r)&&o.length>0&&0===o[o.length-1].openedBraces){var l=t(r);i0&&("string"==typeof a[i-1]||"plain-text"===a[i-1].type)&&(l=t(a[i-1])+l,a.splice(i-1,1),i--),/^\s+$/.test(l)?a[i]=l:a[i]=new e.Token("plain-text",l,null,l)}r.content&&"string"!=typeof r.content&&n(r.content)}};e.hooks.add("after-tokenize",(function(e){"xquery"===e.language&&n(e.tokens)}))}(Prism); Prism.languages.yang={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"(?:[^\\"]|\\.)*"|'[^']*'/,greedy:!0},keyword:{pattern:/(^|[{};\r\n][ \t]*)[a-z_][\w.-]*/i,lookbehind:!0},namespace:{pattern:/(\s)[a-z_][\w.-]*(?=:)/i,lookbehind:!0},boolean:/\b(?:false|true)\b/,operator:/\+/,punctuation:/[{};:]/}; !function(e){function n(e){return function(){return e}}var r=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,a="\\b(?!"+r.source+")(?!\\d)\\w+\\b",o="align\\s*\\((?:[^()]|\\([^()]*\\))*\\)",s="(?!\\s)(?:!?\\s*(?:"+"(?:\\?|\\bpromise->|(?:\\[[^[\\]]*\\]|\\*(?!\\*)|\\*\\*)(?:\\s*|\\s*const\\b|\\s*volatile\\b|\\s*allowzero\\b)*)".replace(//g,n(o))+"\\s*)*"+"(?:\\bpromise\\b|(?:\\berror\\.)?(?:\\.)*(?!\\s+))".replace(//g,n(a))+")+";e.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp("(:\\s*)(?=\\s*(?:\\s*)?[=;,)])|(?=\\s*(?:\\s*)?\\{)".replace(//g,n(s)).replace(//g,n(o))),lookbehind:!0,inside:null},{pattern:RegExp("(\\)\\s*)(?=\\s*(?:\\s*)?;)".replace(//g,n(s)).replace(//g,n(o))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:r,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},e.languages.zig["class-name"].forEach((function(n){null===n.inside&&(n.inside=e.languages.zig)}))}(Prism); !function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e="line-numbers",n=/\n(?!$)/g,t=Prism.plugins.lineNumbers={getLine:function(n,t){if("PRE"===n.tagName&&n.classList.contains(e)){var i=n.querySelector(".line-numbers-rows");if(i){var r=parseInt(n.getAttribute("data-start"),10)||1,s=r+(i.children.length-1);ts&&(t=s);var l=t-r;return i.children[l]}}},resize:function(e){r([e])},assumeViewportIndependence:!0},i=void 0;window.addEventListener("resize",(function(){t.assumeViewportIndependence&&i===window.innerWidth||(i=window.innerWidth,r(Array.prototype.slice.call(document.querySelectorAll("pre.line-numbers"))))})),Prism.hooks.add("complete",(function(t){if(t.code){var i=t.element,s=i.parentNode;if(s&&/pre/i.test(s.nodeName)&&!i.querySelector(".line-numbers-rows")&&Prism.util.isActive(i,e)){i.classList.remove(e),s.classList.add(e);var l,o=t.code.match(n),a=o?o.length+1:1,u=new Array(a+1).join("");(l=document.createElement("span")).setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=u,s.hasAttribute("data-start")&&(s.style.counterReset="linenumber "+(parseInt(s.getAttribute("data-start"),10)-1)),t.element.appendChild(l),r([s]),Prism.hooks.run("line-numbers",t)}}})),Prism.hooks.add("line-numbers",(function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}))}function r(e){if(0!=(e=e.filter((function(e){var n,t=(n=e,n?window.getComputedStyle?getComputedStyle(n):n.currentStyle||null:null)["white-space"];return"pre-wrap"===t||"pre-line"===t}))).length){var t=e.map((function(e){var t=e.querySelector("code"),i=e.querySelector(".line-numbers-rows");if(t&&i){var r=e.querySelector(".line-numbers-sizer"),s=t.textContent.split(n);r||((r=document.createElement("span")).className="line-numbers-sizer",t.appendChild(r)),r.innerHTML="0",r.style.display="block";var l=r.getBoundingClientRect().height;return r.innerHTML="",{element:e,lines:s,lineHeights:[],oneLinerHeight:l,sizer:r}}})).filter(Boolean);t.forEach((function(e){var n=e.sizer,t=e.lines,i=e.lineHeights,r=e.oneLinerHeight;i[t.length-1]=void 0,t.forEach((function(e,t){if(e&&e.length>1){var s=n.appendChild(document.createElement("span"));s.style.display="block",s.textContent=e}else i[t]=r}))})),t.forEach((function(e){for(var n=e.sizer,t=e.lineHeights,i=0,r=0;rcode[class*="language-"],pre[class*="language-"]{background:#21252a}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999;}.token.punctuation{color:#ccc;}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a;}.token.function-name{color:#6196cc;}.token.boolean,.token.number,.token.function{color:#f08d49;}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555;}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd;}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699;}.token.operator,.token.entity,.token.url{color:#67cdcc;}.token.important,.token.bold{font-weight:bold;}.token.italic{font-style:italic;}.token.entity{cursor:help;}.token.inserted{color:green;}pre.line-numbers{counter-reset:linenumber}pre.line-numbers>code{white-space:inherit font-size:15px}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0px;font-size:100%;left:0em;width:3em;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;text-align:center;}div.code-toolbar{z-index:1;font-size:100%;border-radius:10px;position:relative;padding-top:30px;background-color:#161616;margin:20px 0 20px 0}.code-toolbar:before{content:" ";position:absolute;-webkit-border-radius:50%;border-radius:50%;background:#fc625d;width:11px;height:11px;left:10px;top:10px;-webkit-box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;z-index:2}div.code-toolbar>.toolbar{padding-right:.4em;position:absolute;top:.09em;right:.2em;width:100%;text-align:center;}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar>.toolbar .toolbar-item{padding:0 1px 1px 3px;display:inline-block}div.code-toolbar>.toolbar button{cursor:pointer;transition:all .3s;position:absolute;background-color:transparent;right:6px;top:4px;font-size:12px;line-height:12px;padding:3px 5px;border:1px solid;border-radius:6px;opacity:0;color:#FFF;}div.code-toolbar:hover button{opacity:1;}div.code-toolbar>.toolbar:hover{text-decoration:none!important}div.code-toolbar>.div.code-toolbar>.toolbar button,div.code-toolbar>.toolbar span{font-family:'Ubuntu',sans-serif;font-weight:bold;font-size:.9em;opacity:0;color:#FFF;}div.code-toolbar:hover .toolbar span{opacity:1;}#post-content .code-block-fullscreen{padding-top:32px;position:fixed;width:80vw;height:80vh;min-height:80vh;top:0;left:0;right:0;bottom:0;margin:auto;z-index:9999999;animation:elastic 1s;overflow:hidden;background:#21252a;}.code-block-fullscreen code{--widthA:100%;--widthB:calc(var(--widthA) - 30px);height:var(--widthB);min-height:99%;overflow-y:scroll;height:100%;}.code-block-fullscreen-html-scroll{overflow:hidden;}.shelter{width:6.5px;height:6.5px;z-index:100;position:absolute;bottom:0;right:0;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:2px;}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#cbcbcb}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:2px;}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar-track-piece{}code::-webkit-scrollbar{width:6px;height:12px;}code::-webkit-scrollbar-thumb{border-radius:6px;}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px;}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb}div.code-toolbar{overflow:hidden;}.shelter{overflow:hidden;}pre.line-numbers{margin-bottom:-3px}code::-webkit-scrollbar-corner{display:none;}code::-webkit-scrollbar-track-piece{display:none;}div.code-toolbar{overflow:hidden;padding-right:0;position:relative;}pre[class*="language-"]{overflow:auto;padding-right:8px !important;margin-right:0;padding-bottom:6px;}pre[class*="language-"]::-webkit-scrollbar{width:5px;}pre[class*="language-"]::-webkit-scrollbar:horizontal{height:4px;}pre[class*="language-"]::-webkit-scrollbar-track{background:rgba(0,0,0,0.2);border-radius:2px;margin:4px 0;}pre[class*="language-"]::-webkit-scrollbar-thumb{background:rgba(120,120,120,0.6);border:1px solid rgba(255,255,255,0.15);border-radius:3px;transition:all 0.3s cubic-bezier(0.4,0,0.2,1);}pre[class*="language-"]::-webkit-scrollbar-thumb:hover{background:rgba(160,160,160,0.8);transform:scaleX(1.1);}pre[class*="language-"]::-webkit-scrollbar-thumb:active{background:rgba(210,210,210,0.9);}pre[class*="language-"]{scrollbar-width:thin;scrollbar-color:rgba(120,120,120,0.6) rgba(0,0,0,0.2);}.line-numbers .line-numbers-rows{height:calc(100% - 8px);padding-right:5px;}.code-block-fullscreen pre[class*="language-"]{padding-right:10px;padding-bottom:8px;}.code-block-fullscreen pre[class*="language-"]::-webkit-scrollbar{width:6px;}.shelter{width:12px;height:12px;background:#161616;z-index:100;}pre[class*="language-"].line-numbers code{padding-left:50px!important;}pre[class*="language-"]:not(.line-numbers) code{padding-left: 10px!important;} ================================================ FILE: modules/codehightlight/static/styles/GrayMac.css ================================================ code[class*="language-"],pre[class*="language-"]{color:#f8f8f2;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:2;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;font-size:13px}pre[class*="language-"]{overflow:auto;}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#696969}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999;}.token.punctuation{color:#ccc;}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a;}.token.function-name{color:#6196cc;}.token.boolean,.token.number,.token.function{color:#f08d49;}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555;}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd;}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699;}.token.operator,.token.entity,.token.url{color:#67cdcc;}.token.important,.token.bold{font-weight:bold;}.token.italic{font-style:italic;}.token.entity{cursor:help;}.token.inserted{color:green;}pre.line-numbers{counter-reset:linenumber}pre.line-numbers>code{white-space:inherit font-size:15px}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0px;font-size:100%;left:0em;width:3em;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#D3D3D3;display:block;text-align:center;}div.code-toolbar{z-index:1;font-size:100%;border-radius:10px;position:relative;padding-top:30px;background-color:#3f3f3f;margin:20px 0 20px 0;}.code-toolbar:before{content:" ";position:absolute;-webkit-border-radius:50%;border-radius:50%;background:#fc625d;width:11px;height:11px;left:10px;top:10px;-webkit-box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;z-index:2}div.code-toolbar>.toolbar{padding-right:.4em;position:absolute;top:.09em;right:.2em;width:100%;text-align:center;}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar>.toolbar .toolbar-item{padding:0 1px 1px 3px;display:inline-block}div.code-toolbar>.toolbar button{cursor:pointer;transition:all .3s;position:absolute;background-color:transparent;right:6px;top:4px;font-size:12px;line-height:12px;padding:3px 5px;border:1px solid;border-radius:6px;opacity:0;color:#FFF;}div.code-toolbar:hover button{opacity:1;}div.code-toolbar>.toolbar:hover{text-decoration:none!important}div.code-toolbar>.div.code-toolbar>.toolbar button,div.code-toolbar>.toolbar span{font-family:'Ubuntu',sans-serif;font-weight:bold;font-size:.9em;opacity:0;color:#FFF;}div.code-toolbar:hover .toolbar span{opacity:1;}#post-content .code-block-fullscreen{padding-top:32px;position:fixed;width:80vw;height:80vh;min-height:80vh;top:0;left:0;right:0;bottom:0;margin:auto;z-index:9999999;box-shadow:0 0 20px 0 rgba(255,255,255,.4);animation:elastic 1s;overflow:hidden;background:#21252a;}.code-block-fullscreen code{--widthA:100%;--widthB:calc(var(--widthA) - 30px);height:var(--widthB);min-height:99%;overflow-y:scroll;height:100%;}.code-block-fullscreen-html-scroll{overflow:hidden;}.shelter{width:6.5px;height:6.5px;z-index:100;position:absolute;bottom:0;right:0;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:2px;}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:2px;}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar-track-piece{}code::-webkit-scrollbar{width:6px;height:12px;}code::-webkit-scrollbar-thumb{border-radius:6px;}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px;}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb}div.code-toolbar{overflow:hidden;}.shelter{overflow:hidden;}pre.line-numbers{margin-bottom:-3px}code::-webkit-scrollbar-corner{display:none;}code::-webkit-scrollbar-track-piece{display:none;}pre[class*="language-"] code{padding-left:50px!important;}div.code-toolbar{border-radius:8px;padding-right:0 !important;background:#696969;}pre[class*="language-"]{position:relative;overflow:auto;margin:0;padding-bottom:4px;max-height:65vh;}pre[class*="language-"]::-webkit-scrollbar{width:6px;}pre[class*="language-"]::-webkit-scrollbar:horizontal{height:6px;}pre[class*="language-"]::-webkit-scrollbar-track{background:transparent;margin:4px 0;border-radius:3px;}pre[class*="language-"]::-webkit-scrollbar-thumb{background:rgba(210,210,210,0.5);border-radius:3px;border:1px solid rgba(255,255,255,0.1);transition:all 0.3s;}pre[class*="language-"]::-webkit-scrollbar-thumb:hover{background:rgba(230,230,230,0.8);}pre[class*="language-"]::-webkit-scrollbar-thumb:active{background:rgba(255,255,255,0.9);}pre[class*="language-"]{scrollbar-width:thin;scrollbar-color:rgba(210,210,210,0.5) transparent;}.line-numbers .line-numbers-rows{height:calc(100% - 8px);}pre[class*="language-"] code{padding-right:12px;display:block;}pre[class*="language-"].line-numbers code{padding-left:50px!important;}pre[class*="language-"]:not(.line-numbers) code{padding-left: 10px!important;} ================================================ FILE: modules/codehightlight/static/styles/WhiteMac.css ================================================ code[class*="language-"],pre[class*="language-"]{background:#f3f3f3;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:2;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}pre[class*="language-"]{overflow:auto;}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:slategray;}.token.punctuation{color:#999;}.namespace{opacity:.7;}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#905;}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#690;}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:#9a6e3a;}.token.atrule,.token.attr-value,.token.keyword{color:#07a;}.token.function,.token.class-name{color:#DD4A68;}.token.regex,.token.important,.token.variable{color:#e90;}.token.important,.token.bold{font-weight:bold;}.token.italic{font-style:italic;}.token.entity{cursor:help;}pre.line-numbers>code{white-space:inherit font-size:15px}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-0.1em;width:3em;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;text-align:center;background:#f3f3f3}div.code-toolbar{z-index:1;font-size:100%;border-radius:10px;position:relative;box-shadow:0 0 1px 1px rgba(0,0,0,.4);padding-top:30px;background-color:#eee;margin:20px 0 20px 0;}.code-toolbar:before{content:" ";position:absolute;-webkit-border-radius:50%;border-radius:50%;background:#fc625d;width:11px;height:11px;left:10px;top:10px;-webkit-box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;z-index:2}div.code-toolbar>.toolbar{padding-right:.4em;position:absolute;top:.09em;right:.2em;width:100%;text-align:center;}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar>.toolbar .toolbar-item{padding:0 1px 1px 3px;display:inline-block}div.code-toolbar>.toolbar button{cursor:pointer;transition:all .3s;position:absolute;background-color:transparent;right:6px;top:4px;font-size:12px;line-height:12px;padding:3px 5px;border:1px solid;border-radius:6px;opacity:0;color:#848484}div.code-toolbar:hover button{opacity:1;}div.code-toolbar>.toolbar:hover{text-decoration:none!important}div.code-toolbar>.div.code-toolbar>.toolbar button,div.code-toolbar>.toolbar span{font-family:'Ubuntu',sans-serif;font-weight:bold;font-size:.9em;opacity:0;color:#848484;}div.code-toolbar:hover .toolbar span{opacity:1;}#post-content .code-block-fullscreen{padding-top:32px;position:fixed;width:80vw;height:80vh;min-height:80vh;top:0;left:0;right:0;bottom:0;margin:auto;z-index:9999999;box-shadow:0 0 20px 0 rgba(255,255,255,.4);animation:elastic 1s;overflow:hidden;background:#21252a;}.code-block-fullscreen code{--widthA:100%;--widthB:calc(var(--widthA) - 30px);height:var(--widthB);min-height:99%;overflow-y:scroll;height:100%;}.code-block-fullscreen-html-scroll{overflow:hidden;}.shelter{width:6.5px;height:6.5px;z-index:100;position:absolute;bottom:0;right:0;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:2px;}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:2px;}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar-track-piece{}code::-webkit-scrollbar{width:6px;height:12px;}code::-webkit-scrollbar-thumb{border-radius:6px;}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px;}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb}div.code-toolbar{overflow:hidden;}.shelter{overflow:hidden;}pre.line-numbers{margin-bottom:-3px}code::-webkit-scrollbar-corner{display:none;}code::-webkit-scrollbar-track-piece{display:none;}pre[class*="language-"] code{padding-left:50px!important;}div.code-toolbar{overflow:hidden;padding-right:0;border-radius:8px;background:#eee;box-shadow:0 2px 6px rgba(0,0,0,0.1);}pre[class*="language-"]{overflow:auto;background:#f3f3f3;padding-right:10px !important;margin:0;padding-bottom:8px;}pre[class*="language-"]::-webkit-scrollbar{width:5px;}pre[class*="language-"]::-webkit-scrollbar:horizontal{height:4px;}pre[class*="language-"]::-webkit-scrollbar-track{background:rgba(230,230,230,0.4);border-radius:3px;margin:4px 0;}pre[class*="language-"]::-webkit-scrollbar-thumb{background:rgba(120,120,120,0.4);border:1px solid rgba(255,255,255,0.8);border-radius:3px;transition:all 0.3s ease;}pre[class*="language-"]::-webkit-scrollbar-thumb:hover{background:rgba(90,90,90,0.6);}pre[class*="language-"]::-webkit-scrollbar-thumb:active{background:rgba(70,70,70,0.7);}pre[class*="language-"]{scrollbar-width:thin;scrollbar-color:rgba(120,120,120,0.4) rgba(230,230,230,0.4);}.line-numbers .line-numbers-rows{height:calc(100% - 8px);background:#f3f3f3;}.line-numbers-rows > span:before{background:#f3f3f3;color:#999;}div.code-toolbar > .toolbar button{border:1px solid #d0d0d0;background:rgba(255,255,255,0.8);color:#666;box-shadow:0 2px 3px rgba(0,0,0,0.1);}div.code-toolbar:hover > .toolbar button{opacity:1;}.code-block-fullscreen pre[class*="language-"]{background:#f7f7f7;padding:15px;}.shelter{background:#eee;width:10px;height:10px;}pre[class*="language-"].line-numbers code{padding-left:50px!important;}pre[class*="language-"]:not(.line-numbers) code{padding-left: 10px!important;} ================================================ FILE: modules/codehightlight/static/styles/coy.css ================================================ code[class*="language-"],pre[class*="language-"]{color:black;background:none;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}pre[class*="language-"]{position:relative;border-left:10px solid #358ccb;box-shadow:-1px 0 0 0 #358ccb,0 0 0 1px #dfdfdf;background-color:#fdfdfd;background-image:linear-gradient(transparent 50%,rgba(69,142,209,0.04) 50%);background-size:3em 3em;background-origin:content-box;background-attachment:local;padding:0.1em 0.2em 0.1em 1em;border-radius:0.3em;}pre[class*="language-"] > code{display:block;}:not(pre) > code[class*="language-"]{position:relative;padding:.2em;border-radius:0.3em;color:#c92c2c;border:1px solid rgba(0,0,0,0.1);display:inline;white-space:normal;background-color:#fdfdfd;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#7D8B99;}.token.punctuation{color:#5F6364;}.token.property,.token.tag,.token.boolean,.token.number,.token.function-name,.token.constant,.token.symbol,.token.deleted{color:#c92c2c;}.token.selector,.token.attr-name,.token.string,.token.char,.token.function,.token.builtin,.token.inserted{color:#2f9c0a;}.token.operator,.token.entity,.token.url,.token.variable{color:#a67f59;background:rgba(255,255,255,0.5);}.token.atrule,.token.attr-value,.token.keyword,.token.class-name{color:#1990b8;}.token.regex,.token.important{color:#e90;}.language-css .token.string,.style .token.string{color:#a67f59;background:rgba(255,255,255,0.5);}.token.important{font-weight:normal;}.token.bold{font-weight:bold;}.token.italic{font-style:italic;}.token.entity{cursor:help;}.token.namespace{opacity:.7;}pre[class*="language-"].line-numbers{padding-left:0;}pre[class*="language-"].line-numbers code{padding-left:3.8em!important;}pre[class*="language-"].line-numbers .line-numbers-rows{left:0;}pre[class*="language-"][data-line]{padding-top:0;padding-bottom:0;padding-left:0;}pre[data-line] code{position:relative;padding-left:4em;}pre .line-highlight{margin-top:0;}pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber;}pre.line-numbers > code{position:relative;white-space:inherit;}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers-rows > span{pointer-events:none;display:block;counter-increment:linenumber;}.line-numbers-rows > span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right;}div.code-toolbar{position:relative;}div.code-toolbar > .toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0;}div.code-toolbar:hover > .toolbar{opacity:1;}div.code-toolbar > .toolbar .toolbar-item{display:inline-block;}div.code-toolbar > .toolbar a{cursor:pointer;}div.code-toolbar > .toolbar button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}div.code-toolbar > .toolbar a,div.code-toolbar > .toolbar button,div.code-toolbar > .toolbar span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em;}div.code-toolbar > .toolbar a:hover,div.code-toolbar > .toolbar a:focus,div.code-toolbar > .toolbar button:hover,div.code-toolbar > .toolbar button:focus,div.code-toolbar > .toolbar span:hover,div.code-toolbar > .toolbar span:focus{color:inherit;text-decoration:none;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:6px;display:none;}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:6px;display:none;}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb;}code::-webkit-scrollbar-track-piece{display:none;}code::-webkit-scrollbar-corner{display:none;}code::-webkit-scrollbar{width:6px;height:6px;}code::-webkit-scrollbar:hover{display:block;}code::-webkit-scrollbar-thumb{border-radius:6px;background-color:#dfdfdf}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px;display:none;}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb} ================================================ FILE: modules/codehightlight/static/styles/gruvbox-light.css ================================================ code[class*="language-"],pre[class*="language-"]{border-radius:10px;color:#3c3836;font-family:Consolas,Monaco,"Andale Mono",monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}pre[class*="language-"]::-moz-selection,pre[class*="language-"]::-moz-selection,code[class*="language-"]::-moz-selection,code[class*="language-"]::-moz-selection{color:#282828;background:#a89984;}pre[class*="language-"]::selection,pre[class*="language-"]::selection,code[class*="language-"]::selection,code[class*="language-"]::selection{color:#282828;background:#a89984;}pre[class*="language-"]{padding:1em 0.2em 0.1em 1em;overflow:auto;}:not(pre) > code[class*="language-"],pre[class*="language-"]{background:#f9f5d7;}:not(pre) > code[class*="language-"]{padding:0.1em;border-radius:0.3em;}.token.comment,.token.prolog,.token.cdata{color:#7c6f64;}.token.delimiter,.token.boolean,.token.keyword,.token.selector,.token.important,.token.atrule{color:#9d0006;}.token.operator,.token.punctuation,.token.attr-name{color:#7c6f64;}.token.tag,.token.tag .punctuation,.token.doctype,.token.builtin{color:#b57614;}.token.entity,.token.number,.token.symbol{color:#8f3f71;}.token.property,.token.constant,.token.variable{color:#9d0006;}.token.string,.token.char{color:#797403;}.token.attr-value,.token.attr-value .punctuation{color:#7c6f64;}.token.url{color:#797403;text-decoration:underline;}.token.function{color:#b57614;}.token.regex{background:#797403;}.token.bold{font-weight:bold;}.token.italic{font-style:italic;}.token.inserted{background:#7c6f64;}.token.deleted{background:#9d0006;}pre[class*="language-"].line-numbers{padding-left:0;}pre[class*="language-"].line-numbers code{padding-left:3.8em!important;}pre[class*="language-"].line-numbers .line-numbers-rows{left:0;}pre[class*="language-"][data-line]{padding-top:0;padding-bottom:0;padding-left:0;}pre[data-line] code{position:relative;padding-left:4em;}pre .line-highlight{margin-top:0;}pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber;}pre.line-numbers > code{position:relative;white-space:inherit;}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers-rows > span{pointer-events:none;display:block;counter-increment:linenumber;}.line-numbers-rows > span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right;}div.code-toolbar{position:relative;}div.code-toolbar > .toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0;}div.code-toolbar:hover > .toolbar{opacity:1;}div.code-toolbar > .toolbar .toolbar-item{display:inline-block;}div.code-toolbar > .toolbar a{cursor:pointer;}div.code-toolbar > .toolbar button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}div.code-toolbar > .toolbar a,div.code-toolbar > .toolbar span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em;}div.code-toolbar > .toolbar a:hover,div.code-toolbar > .toolbar a:focus,div.code-toolbar > .toolbar button:hover,div.code-toolbar > .toolbar button:focus,div.code-toolbar > .toolbar span:hover,div.code-toolbar > .toolbar span:focus{color:inherit;text-decoration:none;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:6px;display:none;}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:6px;display:none;}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar-track-piece{display:none;}code::-webkit-scrollbar-corner{display:none;}code::-webkit-scrollbar{width:6px;height:6px;}code::-webkit-scrollbar-thumb{border-radius:6px;background-color:#dfdfdf}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px;display:none;}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb} ================================================ FILE: modules/codehightlight/static/styles/material-dark.css ================================================ code[class*="language-"],pre[class*="language-"]{border-radius:10px;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;color:#eee;background:#2f2f2f;font-family:Roboto Mono,monospace;font-size:1em;line-height:1.5em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}code[class*="language-"]::-moz-selection,pre[class*="language-"]::-moz-selection,code[class*="language-"]::-moz-selection,pre[class*="language-"]::-moz-selection{background:#363636;}code[class*="language-"]::selection,pre[class*="language-"]::selection,code[class*="language-"]::selection,pre[class*="language-"]::selection{background:#363636;}:not(pre) > code[class*="language-"]{white-space:normal;border-radius:0.2em;padding:0.1em;}pre[class*="language-"]{overflow:auto;position:relative;padding:1em 0.2em 0.1em 1em;}.language-css > code,.language-sass > code,.language-scss > code{color:#fd9170;}[class*="language-"] .namespace{opacity:0.7;}.token.atrule{color:#c792ea;}.token.attr-name{color:#ffcb6b;}.token.attr-value{color:#a5e844;}.token.attribute{color:#a5e844;}.token.boolean{color:#c792ea;}.token.builtin{color:#ffcb6b;}.token.cdata{color:#80cbc4;}.token.char{color:#80cbc4;}.token.class{color:#ffcb6b;}.token.class-name{color:#f2ff00;}.token.comment{color:#616161;}.token.constant{color:#c792ea;}.token.deleted{color:#ff6666;}.token.doctype{color:#616161;}.token.entity{color:#ff6666;}.token.function{color:#c792ea;}.token.hexcode{color:#f2ff00;}.token.id{color:#c792ea;font-weight:bold;}.token.important{color:#c792ea;font-weight:bold;}.token.inserted{color:#80cbc4;}.token.keyword{color:#c792ea;}.token.number{color:#fd9170;}.token.operator{color:#89ddff;}.token.prolog{color:#616161;}.token.property{color:#80cbc4;}.token.pseudo-class{color:#a5e844;}.token.pseudo-element{color:#a5e844;}.token.punctuation{color:#89ddff;}.token.regex{color:#f2ff00;}.token.selector{color:#ff6666;}.token.string{color:#a5e844;}.token.symbol{color:#c792ea;}.token.tag{color:#ff6666;}.token.unit{color:#fd9170;}.token.url{color:#ff6666;}.token.variable{color:#ff6666;}.token.tab:not(:empty):before,.token.cr:before,.token.lf:before{color:#e0d7d1;}.token.token.tab:not(:empty):before,.token.token.cr:before,.token.token.lf:before,.token.token.space:before{color:hsla(220,14%,71%,0.15);text-shadow:none;}div.code-toolbar > .toolbar.toolbar > .toolbar-item{margin-right:0.4em;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:hsl(220,13%,26%);color:hsl(220,9%,55%);padding:0.1em 0.4em;border-radius:0.3em;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:hsl(220,13%,28%);color:hsl(220,14%,71%);}.line-highlight.line-highlight{background:hsla(220,100%,80%,0.04);}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background:hsl(220,13%,26%);color:hsl(220,14%,71%);padding:0.1em 0.6em;border-radius:0.3em;box-shadow:0 2px 0 0 rgba(0,0,0,0.2);}pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before{background-color:hsla(220,100%,80%,0.04);}.line-numbers.line-numbers .line-numbers-rows,.command-line .command-line-prompt{border-right-color:hsla(220,14%,71%,0.15);}.line-numbers .line-numbers-rows > span:before,.command-line .command-line-prompt > span:before{color:hsl(220,14%,45%);}.rainbow-braces .token.token.punctuation.brace-level-1,.rainbow-braces .token.token.punctuation.brace-level-5,.rainbow-braces .token.token.punctuation.brace-level-9{color:hsl(355,65%,65%);}.rainbow-braces .token.token.punctuation.brace-level-2,.rainbow-braces .token.token.punctuation.brace-level-6,.rainbow-braces .token.token.punctuation.brace-level-10{color:hsl(95,38%,62%);}.rainbow-braces .token.token.punctuation.brace-level-3,.rainbow-braces .token.token.punctuation.brace-level-7,.rainbow-braces .token.token.punctuation.brace-level-11{color:hsl(207,82%,66%);}.rainbow-braces .token.token.punctuation.brace-level-4,.rainbow-braces .token.token.punctuation.brace-level-8,.rainbow-braces .token.token.punctuation.brace-level-12{color:hsl(286,60%,67%);}pre.diff-highlight > code .token.token.deleted:not(.prefix),pre > code.diff-highlight .token.token.deleted:not(.prefix){background-color:hsla(353,100%,66%,0.15);}pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection,pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection,pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection,pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection{background-color:hsla(353,95%,66%,0.25);}pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection,pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection,pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection,pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection{background-color:hsla(353,95%,66%,0.25);}pre.diff-highlight > code .token.token.inserted:not(.prefix),pre > code.diff-highlight .token.token.inserted:not(.prefix){background-color:hsla(137,100%,55%,0.15);}pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection,pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection,pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection,pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection{background-color:hsla(135,73%,55%,0.25);}pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection,pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection,pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection,pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection{background-color:hsla(135,73%,55%,0.25);}.prism-previewer.prism-previewer:before,.prism-previewer-gradient.prism-previewer-gradient div{border-color:hsl(224,13%,17%);}.prism-previewer-color.prism-previewer-color:before,.prism-previewer-gradient.prism-previewer-gradient div,.prism-previewer-easing.prism-previewer-easing:before{border-radius:0.3em;}.prism-previewer.prism-previewer:after{border-top-color:hsl(224,13%,17%);}.prism-previewer-flipped.prism-previewer-flipped.after{border-bottom-color:hsl(224,13%,17%);}.prism-previewer-angle.prism-previewer-angle:before,.prism-previewer-time.prism-previewer-time:before,.prism-previewer-easing.prism-previewer-easing{background:hsl(219,13%,22%);}.prism-previewer-angle.prism-previewer-angle circle,.prism-previewer-time.prism-previewer-time circle{stroke:hsl(220,14%,71%);stroke-opacity:1;}.prism-previewer-easing.prism-previewer-easing circle,.prism-previewer-easing.prism-previewer-easing path,.prism-previewer-easing.prism-previewer-easing line{stroke:hsl(220,14%,71%);}.prism-previewer-easing.prism-previewer-easing circle{fill:transparent;}.token.tab:not(:empty):before,.token.cr:before,.token.lf:before{color:#e0d7d1;}pre[class*="language-"].line-numbers{padding-left:0;}pre[class*="language-"].line-numbers code{padding-left:3.8em!important;}pre[class*="language-"].line-numbers .line-numbers-rows{left:0;}pre[class*="language-"][data-line]{padding-top:0;padding-bottom:0;padding-left:0;}pre[data-line] code{position:relative;padding-left:4em;}pre .line-highlight{margin-top:0;}pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber;}pre.line-numbers > code{position:relative;white-space:inherit;}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers-rows > span{pointer-events:none;display:block;counter-increment:linenumber;}.line-numbers-rows > span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right;}div.code-toolbar{position:relative;}div.code-toolbar > .toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0;}div.code-toolbar:hover > .toolbar{opacity:1;}div.code-toolbar > .toolbar .toolbar-item{display:inline-block;}div.code-toolbar > .toolbar a{cursor:pointer;}div.code-toolbar > .toolbar button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}div.code-toolbar > .toolbar a,div.code-toolbar > .toolbar button,div.code-toolbar > .toolbar span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em;}div.code-toolbar > .toolbar a:hover,div.code-toolbar > .toolbar a:focus,div.code-toolbar > .toolbar button:hover,div.code-toolbar > .toolbar button:focus,div.code-toolbar > .toolbar span:hover,div.code-toolbar > .toolbar span:focus{color:inherit;text-decoration:none;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:6px;display:none;}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:6px;display:none;}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar-track-piece{display:none;}code::-webkit-scrollbar-corner{display:none;}code::-webkit-scrollbar{width:6px;height:6px;}code::-webkit-scrollbar-thumb{border-radius:6px;background-color:#dfdfdf}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px;display:none;}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:none !important;color:inherit !important;padding:0 !important;border-radius:0 !important;box-shadow:none !important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:none !important;color:inherit !important;}div.code-toolbar > .toolbar a,div.code-toolbar > .toolbar button,div.code-toolbar > .toolbar span{background:none !important;box-shadow:none !important;border-radius:0 !important;padding:0 !important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:hsl(220,13%,26%)!important;color:hsl(220,9%,55%)!important;padding:0.1em 0.4em!important;border-radius:0.3em!important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:hsl(220,13%,28%)!important;color:hsl(220,14%,71%)!important;} ================================================ FILE: modules/codehightlight/static/styles/material-light.css ================================================ code[class*="language-"],pre[class*="language-"]{border-radius:10px;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;color:#90a4ae;background:#fafafa;font-family:Roboto Mono,monospace;font-size:1em;line-height:1.5em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}code[class*="language-"]::-moz-selection,pre[class*="language-"]::-moz-selection,code[class*="language-"]::-moz-selection,pre[class*="language-"]::-moz-selection{background:#cceae7;color:#263238;}code[class*="language-"]::selection,pre[class*="language-"]::selection,code[class*="language-"]::selection,pre[class*="language-"]::selection{background:#cceae7;color:#263238;}:not(pre) > code[class*="language-"]{white-space:normal;border-radius:0.2em;padding:0.1em;}pre[class*="language-"]{overflow:auto;position:relative;padding:1em 0.2em 0.1em 1em;}.language-css > code,.language-sass > code,.language-scss > code{color:#f76d47;}[class*="language-"] .namespace{opacity:0.7;}.token.atrule{color:#7c4dff;}.token.attr-name{color:#39adb5;}.token.attr-value{color:#f6a434;}.token.attribute{color:#f6a434;}.token.boolean{color:#7c4dff;}.token.builtin{color:#39adb5;}.token.cdata{color:#39adb5;}.token.char{color:#39adb5;}.token.class{color:#39adb5;}.token.class-name{color:#6182b8;}.token.comment{color:#aabfc9;}.token.constant{color:#7c4dff;}.token.deleted{color:#e53935;}.token.doctype{color:#aabfc9;}.token.entity{color:#e53935;}.token.function{color:#7c4dff;}.token.hexcode{color:#f76d47;}.token.id{color:#7c4dff;font-weight:bold;}.token.important{color:#7c4dff;font-weight:bold;}.token.inserted{color:#39adb5;}.token.keyword{color:#7c4dff;}.token.number{color:#f76d47;}.token.operator{color:#39adb5;}.token.prolog{color:#aabfc9;}.token.property{color:#39adb5;}.token.pseudo-class{color:#f6a434;}.token.pseudo-element{color:#f6a434;}.token.punctuation{color:#39adb5;}.token.regex{color:#6182b8;}.token.selector{color:#e53935;}.token.string{color:#f6a434;}.token.symbol{color:#7c4dff;}.token.tag{color:#e53935;}.token.unit{color:#f76d47;}.token.url{color:#e53935;}.token.variable{color:#e53935;}.token.tab:not(:empty):before,.token.cr:before,.token.lf:before{color:#e0d7d1;}.token.token.tab:not(:empty):before,.token.token.cr:before,.token.token.lf:before,.token.token.space:before{color:hsla(230,8%,24%,0.2);}div.code-toolbar > .toolbar.toolbar > .toolbar-item{margin-right:0.4em;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:hsl(230,1%,90%);color:hsl(230,6%,44%);padding:0.1em 0.4em;border-radius:0.3em;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:hsl(230,1%,78%);color:hsl(230,8%,24%);}.line-highlight.line-highlight{background:hsla(230,8%,24%,0.05);}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background:hsl(230,1%,90%);color:hsl(230,8%,24%);padding:0.1em 0.6em;border-radius:0.3em;box-shadow:0 2px 0 0 rgba(0,0,0,0.2);}pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before{background-color:hsla(230,8%,24%,0.05);}.line-numbers.line-numbers .line-numbers-rows,.command-line .command-line-prompt{border-right-color:hsla(230,8%,24%,0.2);}.line-numbers .line-numbers-rows > span:before,.command-line .command-line-prompt > span:before{color:hsl(230,1%,62%);}.rainbow-braces .token.token.punctuation.brace-level-1,.rainbow-braces .token.token.punctuation.brace-level-5,.rainbow-braces .token.token.punctuation.brace-level-9{color:hsl(5,74%,59%);}.rainbow-braces .token.token.punctuation.brace-level-2,.rainbow-braces .token.token.punctuation.brace-level-6,.rainbow-braces .token.token.punctuation.brace-level-10{color:hsl(119,34%,47%);}.rainbow-braces .token.token.punctuation.brace-level-3,.rainbow-braces .token.token.punctuation.brace-level-7,.rainbow-braces .token.token.punctuation.brace-level-11{color:hsl(221,87%,60%);}.rainbow-braces .token.token.punctuation.brace-level-4,.rainbow-braces .token.token.punctuation.brace-level-8,.rainbow-braces .token.token.punctuation.brace-level-12{color:hsl(301,63%,40%);}pre.diff-highlight > code .token.token.deleted:not(.prefix),pre > code.diff-highlight .token.token.deleted:not(.prefix){background-color:hsla(353,100%,66%,0.15);}pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection,pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection,pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection,pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection{background-color:hsla(353,95%,66%,0.25);}pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection,pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection,pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection,pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection{background-color:hsla(353,95%,66%,0.25);}pre.diff-highlight > code .token.token.inserted:not(.prefix),pre > code.diff-highlight .token.token.inserted:not(.prefix){background-color:hsla(137,100%,55%,0.15);}pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection,pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection,pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection,pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection{background-color:hsla(135,73%,55%,0.25);}pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection,pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection,pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection,pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection{background-color:hsla(135,73%,55%,0.25);}.prism-previewer.prism-previewer:before,.prism-previewer-gradient.prism-previewer-gradient div{border-color:hsl(0,0,95%);}.prism-previewer-color.prism-previewer-color:before,.prism-previewer-gradient.prism-previewer-gradient div,.prism-previewer-easing.prism-previewer-easing:before{border-radius:0.3em;}.prism-previewer.prism-previewer:after{border-top-color:hsl(0,0,95%);}.prism-previewer-flipped.prism-previewer-flipped.after{border-bottom-color:hsl(0,0,95%);}.prism-previewer-angle.prism-previewer-angle:before,.prism-previewer-time.prism-previewer-time:before,.prism-previewer-easing.prism-previewer-easing{background:hsl(0,0%,100%);}.prism-previewer-angle.prism-previewer-angle circle,.prism-previewer-time.prism-previewer-time circle{stroke:hsl(230,8%,24%);stroke-opacity:1;}.prism-previewer-easing.prism-previewer-easing circle,.prism-previewer-easing.prism-previewer-easing path,.prism-previewer-easing.prism-previewer-easing line{stroke:hsl(230,8%,24%);}.prism-previewer-easing.prism-previewer-easing circle{fill:transparent;}.token.tab:not(:empty):before,.token.cr:before,.token.lf:before{color:#e0d7d1;}pre[class*="language-"].line-numbers{padding-left:0;}pre[class*="language-"].line-numbers code{padding-left:3.8em!important;}pre[class*="language-"].line-numbers .line-numbers-rows{left:0;}pre[class*="language-"][data-line]{padding-top:0;padding-bottom:0;padding-left:0;}pre[data-line] code{position:relative;padding-left:4em;}pre .line-highlight{margin-top:0;}pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber;}pre.line-numbers > code{position:relative;white-space:inherit;}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers-rows > span{pointer-events:none;display:block;counter-increment:linenumber;}.line-numbers-rows > span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right;}div.code-toolbar{position:relative;}div.code-toolbar > .toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0;}div.code-toolbar:hover > .toolbar{opacity:1;}div.code-toolbar > .toolbar .toolbar-item{display:inline-block;}div.code-toolbar > .toolbar a{cursor:pointer;}div.code-toolbar > .toolbar button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}div.code-toolbar > .toolbar a,div.code-toolbar > .toolbar button,div.code-toolbar > .toolbar span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em;}div.code-toolbar > .toolbar a:hover,div.code-toolbar > .toolbar a:focus,div.code-toolbar > .toolbar button:hover,div.code-toolbar > .toolbar button:focus,div.code-toolbar > .toolbar span:hover,div.code-toolbar > .toolbar span:focus{color:inherit;text-decoration:none;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:6px;display:none;}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:6px;display:none;}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar-track-piece{display:none;}code::-webkit-scrollbar-corner{display:none;}code::-webkit-scrollbar{width:6px;height:6px;}code::-webkit-scrollbar-thumb{border-radius:6px;background-color:#dfdfdf}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px;display:none;}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:none !important;color:inherit !important;padding:0 !important;border-radius:0 !important;box-shadow:none !important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:none !important;color:inherit !important;}div.code-toolbar > .toolbar a,div.code-toolbar > .toolbar button,div.code-toolbar > .toolbar span{background:none !important;box-shadow:none !important;border-radius:0 !important;padding:0 !important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:hsl(230,1%,90%)!important;color:hsl(230,6%,44%)!important;padding:0.1em 0.4em!important;border-radius:0.3em!important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:hsl(230,1%,78%)!important;color:hsl(230,8%,24%)!important;} ================================================ FILE: modules/codehightlight/static/styles/one-dark.css ================================================ code[class*="language-"],pre[class*="language-"]{background:hsl(220,13%,18%);color:hsl(220,14%,71%);text-shadow:0 1px rgba(0,0,0,0.3);font-family:"Fira Code","Fira Mono",Menlo,Consolas,"DejaVu Sans Mono",monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}code[class*="language-"]::-moz-selection,code[class*="language-"] *::-moz-selection,pre[class*="language-"] *::-moz-selection{background:hsl(220,13%,28%);color:inherit;text-shadow:none;}code[class*="language-"]::selection,code[class*="language-"] *::selection,pre[class*="language-"] *::selection{background:hsl(220,13%,28%);color:inherit;text-shadow:none;}pre[class*="language-"]{padding:1em 0.2em 0.1em 1em;overflow:auto;border-radius:0.3em;}:not(pre) > code[class*="language-"]{padding:0.2em 0.3em;border-radius:0.3em;white-space:normal;}@media print{code[class*="language-"],pre[class*="language-"]{text-shadow:none;}}.token.comment,.token.prolog,.token.cdata{color:hsl(220,10%,40%);}.token.doctype,.token.punctuation,.token.entity{color:hsl(220,14%,71%);}.token.attr-name,.token.class-name,.token.boolean,.token.constant,.token.number,.token.atrule{color:hsl(29,54%,61%);}.token.keyword{color:hsl(286,60%,67%);}.token.property,.token.tag,.token.symbol,.token.deleted,.token.important{color:hsl(355,65%,65%);}.token.selector,.token.string,.token.char,.token.builtin,.token.inserted,.token.regex,.token.attr-value,.token.attr-value > .token.punctuation{color:hsl(95,38%,62%);}.token.variable,.token.operator,.token.function{color:hsl(207,82%,66%);}.token.url{color:hsl(187,47%,55%);}.token.attr-value > .token.punctuation.attr-equals,.token.special-attr > .token.attr-value > .token.value.css{color:hsl(220,14%,71%);}.language-css .token.selector{color:hsl(355,65%,65%);}.language-css .token.property{color:hsl(220,14%,71%);}.language-css .token.function,.language-css .token.url > .token.function{color:hsl(187,47%,55%);}.language-css .token.url > .token.string.url{color:hsl(95,38%,62%);}.language-css .token.important,.language-css .token.atrule .token.rule{color:hsl(286,60%,67%);}.language-javascript .token.operator{color:hsl(286,60%,67%);}.language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation{color:hsl(5,48%,51%);}.language-json .token.operator{color:hsl(220,14%,71%);}.language-json .token.null.keyword{color:hsl(29,54%,61%);}.language-markdown .token.url,.language-markdown .token.url > .token.operator,.language-markdown .token.url-reference.url > .token.string{color:hsl(220,14%,71%);}.language-markdown .token.url > .token.content{color:hsl(207,82%,66%);}.language-markdown .token.url > .token.url,.language-markdown .token.url-reference.url{color:hsl(187,47%,55%);}.language-markdown .token.blockquote.punctuation,.language-markdown .token.hr.punctuation{color:hsl(220,10%,40%);font-style:italic;}.language-markdown .token.code-snippet{color:hsl(95,38%,62%);}.language-markdown .token.bold .token.content{color:hsl(29,54%,61%);}.language-markdown .token.italic .token.content{color:hsl(286,60%,67%);}.language-markdown .token.strike .token.content,.language-markdown .token.strike .token.punctuation,.language-markdown .token.list.punctuation,.language-markdown .token.title.important > .token.punctuation{color:hsl(355,65%,65%);}.token.bold{font-weight:bold;}.token.comment,.token.italic{font-style:italic;}.token.entity{cursor:help;}.token.namespace{opacity:0.8;}.token.token.tab:not(:empty):before,.token.token.cr:before,.token.token.lf:before,.token.token.space:before{color:hsla(220,14%,71%,0.15);text-shadow:none;}div.code-toolbar > .toolbar.toolbar > .toolbar-item{margin-right:0.4em;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:hsl(220,13%,26%);color:hsl(220,9%,55%);padding:0.1em 0.4em;border-radius:0.3em;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:hsl(220,13%,28%);color:hsl(220,14%,71%);}.line-highlight.line-highlight{background:hsla(220,100%,80%,0.04);}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background:hsl(220,13%,26%);color:hsl(220,14%,71%);padding:0.1em 0.6em;border-radius:0.3em;box-shadow:0 2px 0 0 rgba(0,0,0,0.2);}pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before{background-color:hsla(220,100%,80%,0.04);}.line-numbers.line-numbers .line-numbers-rows,.command-line .command-line-prompt{border-right-color:hsla(220,14%,71%,0.15);}.line-numbers .line-numbers-rows > span:before,.command-line .command-line-prompt > span:before{color:hsl(220,14%,45%);}.rainbow-braces .token.token.punctuation.brace-level-1,.rainbow-braces .token.token.punctuation.brace-level-5,.rainbow-braces .token.token.punctuation.brace-level-9{color:hsl(355,65%,65%);}.rainbow-braces .token.token.punctuation.brace-level-2,.rainbow-braces .token.token.punctuation.brace-level-6,.rainbow-braces .token.token.punctuation.brace-level-10{color:hsl(95,38%,62%);}.rainbow-braces .token.token.punctuation.brace-level-3,.rainbow-braces .token.token.punctuation.brace-level-7,.rainbow-braces .token.token.punctuation.brace-level-11{color:hsl(207,82%,66%);}.rainbow-braces .token.token.punctuation.brace-level-4,.rainbow-braces .token.token.punctuation.brace-level-8,.rainbow-braces .token.token.punctuation.brace-level-12{color:hsl(286,60%,67%);}pre.diff-highlight > code .token.token.deleted:not(.prefix),pre > code.diff-highlight .token.token.deleted:not(.prefix){background-color:hsla(353,100%,66%,0.15);}pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection,pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection,pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection,pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection{background-color:hsla(353,95%,66%,0.25);}pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection,pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection,pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection,pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection{background-color:hsla(353,95%,66%,0.25);}pre.diff-highlight > code .token.token.inserted:not(.prefix),pre > code.diff-highlight .token.token.inserted:not(.prefix){background-color:hsla(137,100%,55%,0.15);}pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection,pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection,pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection,pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection{background-color:hsla(135,73%,55%,0.25);}pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection,pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection,pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection,pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection{background-color:hsla(135,73%,55%,0.25);}.prism-previewer.prism-previewer:before,.prism-previewer-gradient.prism-previewer-gradient div{border-color:hsl(224,13%,17%);}.prism-previewer-color.prism-previewer-color:before,.prism-previewer-gradient.prism-previewer-gradient div,.prism-previewer-easing.prism-previewer-easing:before{border-radius:0.3em;}.prism-previewer.prism-previewer:after{border-top-color:hsl(224,13%,17%);}.prism-previewer-flipped.prism-previewer-flipped.after{border-bottom-color:hsl(224,13%,17%);}.prism-previewer-angle.prism-previewer-angle:before,.prism-previewer-time.prism-previewer-time:before,.prism-previewer-easing.prism-previewer-easing{background:hsl(219,13%,22%);}.prism-previewer-angle.prism-previewer-angle circle,.prism-previewer-time.prism-previewer-time circle{stroke:hsl(220,14%,71%);stroke-opacity:1;}.prism-previewer-easing.prism-previewer-easing circle,.prism-previewer-easing.prism-previewer-easing path,.prism-previewer-easing.prism-previewer-easing line{stroke:hsl(220,14%,71%);}.prism-previewer-easing.prism-previewer-easing circle{fill:transparent;}.token.tab:not(:empty):before,.token.cr:before,.token.lf:before{color:#e0d7d1;}pre[class*="language-"].line-numbers{padding-left:0;}pre[class*="language-"].line-numbers code{padding-left:3.8em!important;}pre[class*="language-"].line-numbers .line-numbers-rows{left:0;}pre[class*="language-"][data-line]{padding-top:0;padding-bottom:0;padding-left:0;}pre[data-line] code{position:relative;padding-left:4em;}pre .line-highlight{margin-top:0;}pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber;}pre.line-numbers > code{position:relative;white-space:inherit;}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers-rows > span{pointer-events:none;display:block;counter-increment:linenumber;}.line-numbers-rows > span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right;}div.code-toolbar{position:relative;}div.code-toolbar > .toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0;}div.code-toolbar:hover > .toolbar{opacity:1;}div.code-toolbar > .toolbar .toolbar-item{display:inline-block;}div.code-toolbar > .toolbar a{cursor:pointer;}div.code-toolbar > .toolbar button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}div.code-toolbar > .toolbar a,div.code-toolbar > .toolbar button,div.code-toolbar > .toolbar span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em;}div.code-toolbar > .toolbar a:hover,div.code-toolbar > .toolbar a:focus,div.code-toolbar > .toolbar button:hover,div.code-toolbar > .toolbar button:focus,div.code-toolbar > .toolbar span:hover,div.code-toolbar > .toolbar span:focus{color:inherit;text-decoration:none;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:6px;display:none;}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:6px;display:none;}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar-track-piece{display:none;}code::-webkit-scrollbar-corner{display:none;}code::-webkit-scrollbar{width:6px;height:6px;}code::-webkit-scrollbar-thumb{border-radius:6px;background-color:#dfdfdf}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px;display:none;}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:none !important;color:inherit !important;padding:0 !important;border-radius:0 !important;box-shadow:none !important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:none !important;color:inherit !important;}div.code-toolbar > .toolbar a,div.code-toolbar > .toolbar button,div.code-toolbar > .toolbar span{background:none !important;box-shadow:none !important;border-radius:0 !important;padding:0 !important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:hsl(220,13%,26%)!important;color:hsl(220,9%,55%)!important;padding:0.1em 0.4em!important;border-radius:0.3em!important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:hsl(220,13%,28%)!important;color:hsl(220,14%,71%)!important;} ================================================ FILE: modules/codehightlight/static/styles/one-light.css ================================================ code[class*="language-"],pre[class*="language-"]{background:hsl(230,1%,98%);color:hsl(230,8%,24%);font-family:"Fira Code","Fira Mono",Menlo,Consolas,"DejaVu Sans Mono",monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}code[class*="language-"]::-moz-selection,code[class*="language-"] *::-moz-selection,pre[class*="language-"] *::-moz-selection{background:hsl(230,1%,90%);color:inherit;}code[class*="language-"]::selection,code[class*="language-"] *::selection,pre[class*="language-"] *::selection{background:hsl(230,1%,90%);color:inherit;}pre[class*="language-"]{padding:1em 0.2em 0.1em 1em;overflow:auto;border-radius:0.3em;}:not(pre) > code[class*="language-"]{padding:0.2em 0.3em;border-radius:0.3em;white-space:normal;}.token.comment,.token.prolog,.token.cdata{color:hsl(230,4%,64%);}.token.doctype,.token.punctuation,.token.entity{color:hsl(230,8%,24%);}.token.attr-name,.token.class-name,.token.boolean,.token.constant,.token.number,.token.atrule{color:hsl(35,99%,36%);}.token.keyword{color:hsl(301,63%,40%);}.token.property,.token.tag,.token.symbol,.token.deleted,.token.important{color:hsl(5,74%,59%);}.token.selector,.token.string,.token.char,.token.builtin,.token.inserted,.token.regex,.token.attr-value,.token.attr-value > .token.punctuation{color:hsl(119,34%,47%);}.token.variable,.token.operator,.token.function{color:hsl(221,87%,60%);}.token.url{color:hsl(198,99%,37%);}.token.attr-value > .token.punctuation.attr-equals,.token.special-attr > .token.attr-value > .token.value.css{color:hsl(230,8%,24%);}.language-css .token.selector{color:hsl(5,74%,59%);}.language-css .token.property{color:hsl(230,8%,24%);}.language-css .token.function,.language-css .token.url > .token.function{color:hsl(198,99%,37%);}.language-css .token.url > .token.string.url{color:hsl(119,34%,47%);}.language-css .token.important,.language-css .token.atrule .token.rule{color:hsl(301,63%,40%);}.language-javascript .token.operator{color:hsl(301,63%,40%);}.language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation{color:hsl(344,84%,43%);}.language-json .token.operator{color:hsl(230,8%,24%);}.language-json .token.null.keyword{color:hsl(35,99%,36%);}.language-markdown .token.url,.language-markdown .token.url > .token.operator,.language-markdown .token.url-reference.url > .token.string{color:hsl(230,8%,24%);}.language-markdown .token.url > .token.content{color:hsl(221,87%,60%);}.language-markdown .token.url > .token.url,.language-markdown .token.url-reference.url{color:hsl(198,99%,37%);}.language-markdown .token.blockquote.punctuation,.language-markdown .token.hr.punctuation{color:hsl(230,4%,64%);font-style:italic;}.language-markdown .token.code-snippet{color:hsl(119,34%,47%);}.language-markdown .token.bold .token.content{color:hsl(35,99%,36%);}.language-markdown .token.italic .token.content{color:hsl(301,63%,40%);}.language-markdown .token.strike .token.content,.language-markdown .token.strike .token.punctuation,.language-markdown .token.list.punctuation,.language-markdown .token.title.important > .token.punctuation{color:hsl(5,74%,59%);}.token.bold{font-weight:bold;}.token.comment,.token.italic{font-style:italic;}.token.entity{cursor:help;}.token.namespace{opacity:0.8;}.token.token.tab:not(:empty):before,.token.token.cr:before,.token.token.lf:before,.token.token.space:before{color:hsla(230,8%,24%,0.2);}div.code-toolbar > .toolbar.toolbar > .toolbar-item{margin-right:0.4em;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:hsl(230,1%,90%);color:hsl(230,6%,44%);padding:0.1em 0.4em;border-radius:0.3em;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:hsl(230,1%,78%);color:hsl(230,8%,24%);}.line-highlight.line-highlight{background:hsla(230,8%,24%,0.05);}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background:hsl(230,1%,90%);color:hsl(230,8%,24%);padding:0.1em 0.6em;border-radius:0.3em;box-shadow:0 2px 0 0 rgba(0,0,0,0.2);}pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before{background-color:hsla(230,8%,24%,0.05);}.line-numbers.line-numbers .line-numbers-rows,.command-line .command-line-prompt{border-right-color:hsla(230,8%,24%,0.2);}.line-numbers .line-numbers-rows > span:before,.command-line .command-line-prompt > span:before{color:hsl(230,1%,62%);}.rainbow-braces .token.token.punctuation.brace-level-1,.rainbow-braces .token.token.punctuation.brace-level-5,.rainbow-braces .token.token.punctuation.brace-level-9{color:hsl(5,74%,59%);}.rainbow-braces .token.token.punctuation.brace-level-2,.rainbow-braces .token.token.punctuation.brace-level-6,.rainbow-braces .token.token.punctuation.brace-level-10{color:hsl(119,34%,47%);}.rainbow-braces .token.token.punctuation.brace-level-3,.rainbow-braces .token.token.punctuation.brace-level-7,.rainbow-braces .token.token.punctuation.brace-level-11{color:hsl(221,87%,60%);}.rainbow-braces .token.token.punctuation.brace-level-4,.rainbow-braces .token.token.punctuation.brace-level-8,.rainbow-braces .token.token.punctuation.brace-level-12{color:hsl(301,63%,40%);}pre.diff-highlight > code .token.token.deleted:not(.prefix),pre > code.diff-highlight .token.token.deleted:not(.prefix){background-color:hsla(353,100%,66%,0.15);}pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection,pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection,pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection,pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection{background-color:hsla(353,95%,66%,0.25);}pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection,pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection,pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection,pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection{background-color:hsla(353,95%,66%,0.25);}pre.diff-highlight > code .token.token.inserted:not(.prefix),pre > code.diff-highlight .token.token.inserted:not(.prefix){background-color:hsla(137,100%,55%,0.15);}pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection,pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection,pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection,pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection{background-color:hsla(135,73%,55%,0.25);}pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection,pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection,pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection,pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection{background-color:hsla(135,73%,55%,0.25);}.prism-previewer.prism-previewer:before,.prism-previewer-gradient.prism-previewer-gradient div{border-color:hsl(0,0,95%);}.prism-previewer-color.prism-previewer-color:before,.prism-previewer-gradient.prism-previewer-gradient div,.prism-previewer-easing.prism-previewer-easing:before{border-radius:0.3em;}.prism-previewer.prism-previewer:after{border-top-color:hsl(0,0,95%);}.prism-previewer-flipped.prism-previewer-flipped.after{border-bottom-color:hsl(0,0,95%);}.prism-previewer-angle.prism-previewer-angle:before,.prism-previewer-time.prism-previewer-time:before,.prism-previewer-easing.prism-previewer-easing{background:hsl(0,0%,100%);}.prism-previewer-angle.prism-previewer-angle circle,.prism-previewer-time.prism-previewer-time circle{stroke:hsl(230,8%,24%);stroke-opacity:1;}.prism-previewer-easing.prism-previewer-easing circle,.prism-previewer-easing.prism-previewer-easing path,.prism-previewer-easing.prism-previewer-easing line{stroke:hsl(230,8%,24%);}.prism-previewer-easing.prism-previewer-easing circle{fill:transparent;}.token.tab:not(:empty):before,.token.cr:before,.token.lf:before{color:#e0d7d1;}pre[class*="language-"].line-numbers{padding-left:0;}pre[class*="language-"].line-numbers code{padding-left:3.8em!important;}pre[class*="language-"].line-numbers .line-numbers-rows{left:0;}pre[class*="language-"][data-line]{padding-top:0;padding-bottom:0;padding-left:0;}pre[data-line] code{position:relative;padding-left:4em;}pre .line-highlight{margin-top:0;}pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber;}pre.line-numbers > code{position:relative;white-space:inherit;}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers-rows > span{pointer-events:none;display:block;counter-increment:linenumber;}.line-numbers-rows > span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right;}div.code-toolbar{position:relative;}div.code-toolbar > .toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0;}div.code-toolbar:hover > .toolbar{opacity:1;}div.code-toolbar > .toolbar .toolbar-item{display:inline-block;}div.code-toolbar > .toolbar a{cursor:pointer;}div.code-toolbar > .toolbar button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}div.code-toolbar > .toolbar a,div.code-toolbar > .toolbar button,div.code-toolbar > .toolbar span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em;}div.code-toolbar > .toolbar a:hover,div.code-toolbar > .toolbar a:focus,div.code-toolbar > .toolbar button:hover,div.code-toolbar > .toolbar button:focus,div.code-toolbar > .toolbar span:hover,div.code-toolbar > .toolbar span:focus{color:inherit;text-decoration:none;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:6px;display:none;}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:6px;display:none;}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar-track-piece{display:none;}code::-webkit-scrollbar-corner{display:none;}code::-webkit-scrollbar{width:6px;height:6px;}code::-webkit-scrollbar-thumb{border-radius:6px;background-color:#dfdfdf}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px;display:none;}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button{background:none!important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:none !important;color:inherit !important;padding:0 !important;border-radius:0 !important;box-shadow:none !important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:none !important;color:inherit !important;}div.code-toolbar > .toolbar a,div.code-toolbar > .toolbar button,div.code-toolbar > .toolbar span{background:none !important;box-shadow:none !important;border-radius:0 !important;padding:0 !important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span{background:hsl(230,1%,90%)!important;color:hsl(230,6%,44%)!important;padding:0.1em 0.4em!important;border-radius:0.3em!important;}div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover,div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus{background:hsl(230,1%,78%)!important;color:hsl(230,8%,24%)!important;} ================================================ FILE: modules/lock.php ================================================
            分类「archiveTitle(array('category' => _t('%s')), '', ''); ?>」 getArchiveSlug()))['Cate_Encrypt_Note'])):?>
            getArchiveSlug()))['Cate_Encrypt_Note']; ?>
            提交
            ================================================ FILE: modules/lock_article.php ================================================
            widget('Widget_Metas_Category_List')->to($categorys);?> next()): ?> category == $categorys->slug):?> name; ?> slug; ?> 当前文章所属分类「」已被加密!
            提交
            ================================================ FILE: modules/poster.php ================================================
            ×
            生成中,请稍候...
            ================================================ FILE: modules/siteMaintenance/default.html ================================================ 本站正在维护中...
            非常抱歉地告知您:

            本站正在维护施工中!

            我们会尽快结束维护施工并恢复正常访问~若您还有其他问题,请联系博主。

            ================================================ FILE: modules/sticky.php ================================================ is('index') || $this->is('front')){ $sticky_cids = explode(',', strtr($sticky, ' ', ',')); $sticky_html = $this->options->sticky_html; $db = Typecho_Db::get(); $pageSize = $this->options->pageSize; $select1 = $this->select()->where('type = ?', 'post'); $select2 = $this->select()->where('type = ? && status = ? && created < ?', 'post','publish',time()); $this->row = []; $this->stack = []; $this->length = 0; $order = ''; foreach($sticky as $i => $cid) { if($i == 0) $select1->where('cid = ?', $cid); else $select1->orWhere('cid = ?', $cid); $order .= " when $cid then $i"; $select2->where('table.contents.cid != ?', $cid); } if ($order) $select1->order(null,"(case cid$order end)"); if ($this->_currentPage == 1) foreach($db->fetchAll($select1) as $sticky_post){ $sticky_post['sticky'] = $sticky_html; $this->push($sticky_post); } $uid = $this->user->uid; if($uid) $select2->orWhere('authorId = ? && status = ?',$uid,'private'); $sticky_posts = $db->fetchAll($select2->order('table.contents.created', Typecho_Db::SORT_DESC)->page($this->_currentPage, $this->parameter->pageSize)); foreach($sticky_posts as $sticky_post) $this->push($sticky_post); $this->setTotal($this->getTotal()-count($sticky)); } ================================================ FILE: modules/tools.php ================================================ ================================================ FILE: modules/translate.php ================================================
            全球语言
            ================================================ FILE: modules/tw_cn.js ================================================ var defaultEncoding = 2; var translateDelay = 0; var cookieDomain = "/"; var msgToTraditionalChinese = "简体"; var msgToSimplifiedChinese = "繁體"; var translateButtonId = "translateLink"; var currentEncoding = defaultEncoding; var targetEncodingCookie = "targetEncoding" + cookieDomain.replace(/\./g, ""); var targetEncoding = (getCookie(targetEncodingCookie) == null ? defaultEncoding: getCookie(targetEncodingCookie)); var translateButtonObject; function translateText(txt) { if (txt == "" || txt == null) return ""; if (currentEncoding == 1 && targetEncoding == 2) return Simplized(txt); else if (currentEncoding == 2 && targetEncoding == 1) return Traditionalized(txt); else return txt } function translateBody(fobj) { if (typeof(fobj) == "object") var objs = fobj.childNodes; else var objs = document.body.childNodes; for (var i = 0; i < objs.length; i++) { var obj = objs.item(i); if ("||BR|HR|TEXTAREA|".indexOf("|" + obj.tagName + "|") > 0 || obj == translateButtonObject) continue; if (obj.title != "" && obj.title != null) obj.title = translateText(obj.title); if (obj.alt != "" && obj.alt != null) obj.alt = translateText(obj.alt); if (obj.tagName == "INPUT" && obj.value != "" && obj.type != "text" && obj.type != "hidden") obj.value = translateText(obj.value); if (obj.nodeType == 3) obj.data = translateText(obj.data); else translateBody(obj) } } function translatePage() { if (targetEncoding == 1) { currentEncoding = 1; targetEncoding = 2; translateButtonObject.innerHTML = msgToTraditionalChinese; setCookie(targetEncodingCookie, targetEncoding, 7); translateBody() } else if (targetEncoding == 2) { currentEncoding = 2; targetEncoding = 1; translateButtonObject.innerHTML = msgToSimplifiedChinese; setCookie(targetEncodingCookie, targetEncoding, 7); translateBody() } } function JTPYStr() { return '万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾鼋鼌鼍鼗鼹齄齐齑齿龀龁龂龃龄龅龆龇龈龉龊龋龌龙龚龛龟志制咨只里系范松没尝尝闹面准钟别闲干尽脏拼' } function FTPYStr() { return '萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽黿鼂鼉鞀鼴齇齊齏齒齔齕齗齟齡齙齠齜齦齬齪齲齷龍龔龕龜誌製谘隻裡係範鬆冇嚐嘗鬨麵準鐘彆閒乾儘臟拚' } function Traditionalized(cc) { var str = ''; var ss = JTPYStr(); var tt = FTPYStr(); for (var i = 0; i < cc.length; i++) { if (cc.charCodeAt(i) > 10000 && ss.indexOf(cc.charAt(i)) != -1) str += tt.charAt(ss.indexOf(cc.charAt(i))); else str += cc.charAt(i) } return str } function Simplized(cc) { var str = ''; var ss = JTPYStr(); var tt = FTPYStr(); for (var i = 0; i < cc.length; i++) { if (cc.charCodeAt(i) > 10000 && tt.indexOf(cc.charAt(i)) != -1) str += ss.charAt(tt.indexOf(cc.charAt(i))); else str += cc.charAt(i) } return str } function setCookie(name, value, days) { if (days) { var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); var expires = "; expires=" + date.toGMTString() } else var expires = ""; document.cookie = name + "=" + value + expires + "; path=/" } function getCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') c = c.substring(1, c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length) } return null } function translateInitilization() { translateButtonObject = document.getElementById(translateButtonId); if (translateButtonObject) { with(translateButtonObject) { if (typeof(document.all) != "object") { href = "javascript:translatePage();" } else { href = "#"; onclick = new Function("translatePage(); return false;") } } if (currentEncoding != targetEncoding) { setTimeout("translateBody()", translateDelay); if (targetEncoding == 1) translateButtonObject.innerHTML = msgToSimplifiedChinese; else translateButtonObject.innerHTML = msgToTraditionalChinese } } } ================================================ FILE: page.php ================================================ need('compoment/head.php');?> need('pages/page.php'); ?> need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: pages/album.php ================================================

            archiveTitle(array( 'category' => _t('%s'), 'search' => _t('包含关键字「%s」的相册'), 'tag' => _t('标签「%s」下的相册'), 'author' => _t('「%s」发布的相册') ), '', ''); ?>

            is('category')): ?>

            getDescription();?>

            <?php echo $sliderpic['slider__desc'];?>
            have()): ?> pageNav('«','»', 1, ''); $content = ob_get_contents(); ob_end_clean(); if(Bsoptions('pagination_style') == '2'){ $content = preg_replace("/
              /sm", '', $content); } if(empty(Bsoptions('pagination_style')) || Bsoptions('pagination_style') == '1'){ $content = preg_replace("/
                /sm", '
                ', $content); $content = preg_replace("/
              1. (.*?)<\/span><\/li>/sm", '...', $content); $content = preg_replace("/
              2. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              3. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              4. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
              5. (.*?)<\/a><\/li>/sm", '下一页', $content); $content = preg_replace("/<\/ol>/sm", '
              6. ', $content); } echo $content; ?>

                这里暂时没有相册~

            ================================================ FILE: pages/archive.php ================================================
            archiveTitle(array( 'category' => _t(''), 'search' => _t(''), 'tag' => _t(''), 'author' => _t('作者「%s」的个人资料') ), '', ''); ?>

            archiveTitle(array( 'category' => _t('分类「%s」下的文章'), 'search' => _t('包含关键字「%s」的文章'), 'tag' => _t('标签「%s」下的文章'), 'author' => _t('作者「%s」的个人资料') ), '', ''); ?>

            is('category')): ?>

            getDescription();?>

            have()): ?> next()): ?>
            src=""> src="assets/images/cover_new.webp">

            target="_blank"> sticky(); ?> title, articletitlenum()); ?>

            fields->excerpt == null): ?> excerpt, articledecnum()); ?> fields->excerpt(); ?>

            target="_blank">sticky(); ?> title, articletitlenum()); ?>

            fields->excerpt == null): ?> excerpt, articledecnum()); ?> fields->excerpt(); ?>

            这里暂时没有文章~

            is('search') && (Bsoptions('more_posts') == true && Bsoptions('more_posts_archive') == true)): ?>
            pageNav('«','»', 1, ''); $content = ob_get_contents(); ob_end_clean(); if(Bsoptions('pagination_style') == '2'){ $content = preg_replace("/
              /sm", '', $content); } if(empty(Bsoptions('pagination_style')) || Bsoptions('pagination_style') == '1'){ $content = preg_replace("/
                /sm", '
                ', $content); $content = preg_replace("/
              1. (.*?)<\/span><\/li>/sm", '...', $content); $content = preg_replace("/
              2. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              3. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              4. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
              5. (.*?)<\/a><\/li>/sm", '下一页', $content); $content = preg_replace("/<\/ol>/sm", '
              6. ', $content); } echo $content; ?>
            have()): ?> getArchiveSlug())) > Bsoptions('infinite_pageSize') && $this->is('archive')): ?>
            getTotal() > Bsoptions('infinite_pageSize') && $this->is('search')): ?>

            啊哦,已经到底啦~

            ================================================ FILE: pages/author.php ================================================
            have()): ?>

            Ta暂时没有发表文章~

            pageNav('«','»', 1, ''); $content = ob_get_contents(); ob_end_clean(); if(Bsoptions('pagination_style') == '2'){ $content = preg_replace("/
              /sm", '', $content); } if(empty(Bsoptions('pagination_style')) || Bsoptions('pagination_style') == '1'){ $content = preg_replace("/
                /sm", '
                ', $content); $content = preg_replace("/
              1. (.*?)<\/span><\/li>/sm", '...', $content); $content = preg_replace("/
              2. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              3. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              4. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
              5. (.*?)<\/a><\/li>/sm", '下一页', $content); $content = preg_replace("/<\/ol>/sm", '
              6. ', $content); } echo $content; ?>

            ================================================ FILE: pages/index-z.php ================================================
            have()): ?> next()): ?>
            src=""> src="assets/images/cover_new.webp">

            target="_blank"> sticky(); ?> title, articletitlenum()); ?>

            fields->excerpt == null): ?> excerpt, articledecnum()); ?> fields->excerpt(); ?>

            target="_blank">sticky(); ?> title, articletitlenum()); ?>

            fields->excerpt == null): ?> excerpt, articledecnum()); ?> fields->excerpt(); ?>

            这里暂时没有文章~

            pageNav('«','»', 1, ''); $content = ob_get_contents(); ob_end_clean(); if(Bsoptions('pagination_style') == '2'){ $content = preg_replace("/
              /sm", '', $content); } if(empty(Bsoptions('pagination_style')) || Bsoptions('pagination_style') == '1'){ $content = preg_replace("/
                /sm", '
                ', $content); $content = preg_replace("/
              1. (.*?)<\/span><\/li>/sm", '...', $content); $content = preg_replace("/
              2. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              3. (.*?)<\/a><\/li>/sm", '$2', $content); $content = preg_replace("/
              4. (.*?)<\/a><\/li>/sm", '上一页', $content); $content = preg_replace("/
              5. (.*?)<\/a><\/li>/sm", '下一页', $content); $content = preg_replace("/<\/ol>/sm", '
              6. ', $content); } echo $content; ?>
            have()): ?> to($stat); ?> publishedPostsNum <= Bsoptions('infinite_pageSize')):?>

            啊哦,已经到底啦~

            ================================================ FILE: pages/page.php ================================================ content,$this,$this->user->hasLogin(),$this->fields->ArticleType,'readmode'))); ?>
            fields->articleplo !== null && $this->fields->articleplo !== '1'): ?>
            fields->articleplonr() ?>
            title() ?>
            need('modules/tools.php'); ?>
            fields->Overdue && $this->fields->Overdue !== 'close' && floor((time() - ($this->modified)) / 86400) > $this->fields->Overdue) : ?>
            温馨提示:

            本文最后更新于modified);?>,已超过modified))/86400);?>天没有更新,若内容或图片失效,请留言反馈。

            hidden||$this->titleshow): ?>

            Tips:
            user->hasLogin(),$this->remember('mail', true),reEmoPost(ShortCode($this->content,$this,$this->user->hasLogin(),$this->fields->ArticleType))); ?> content,$this,$this->user->hasLogin(),$this->fields->ArticleType)); ?>

            fields->copyright == '1'): ?>
            版权属于:author() ?> 所有, 采用《fields->copyright_cc);?>》进行许可, 转载请注明文章来源。
            need('modules/poster.php'); ?>
            hidden): ?> need('comments.php'); ?> need('thirdparty_comments.php'); ?>

            评论区已被封印~

            ================================================ FILE: pages/post.php ================================================ content,$this,$this->user->hasLogin(),$this->fields->ArticleType,'readmode'))); ?>
            fields->articleplo !== null && $this->fields->articleplo !== '1'): ?>
            fields->articleplonr() ?>
            title() ?>
            fields->Hot == '1'); if ($articleMetaShow === null) { $showAuthor = $showTime = $showCategory = true; $showAnyMeta = true; } elseif ($articleMetaShow === '') { $showAuthor = $showTime = $showCategory = false; $showAnyMeta = false; } elseif (is_array($articleMetaShow) && count($articleMetaShow) > 0) { $showAuthor = in_array('author', $articleMetaShow); $showTime = in_array('time', $articleMetaShow); $showCategory = in_array('category', $articleMetaShow); $showAnyMeta = $showAuthor || $showTime || $showCategory; } $hideEntireMeta = (!$showAnyMeta && !$showHot); ?>
            need('modules/tools.php'); ?>
            fields->Overdue && $this->fields->Overdue !== 'close' && floor((time() - ($this->modified)) / 86400) > $this->fields->Overdue) : ?>
            温馨提示:

            本文最后更新于modified);?>,已超过modified))/86400);?>天没有更新,若内容或图片失效,请留言反馈。

            hidden||$this->titleshow): ?>

            Tips:
            user->hasLogin(),$this->remember('mail', true),reEmoPost(ShortCode($this->content,$this,$this->user->hasLogin(),$this->fields->ArticleType))); ?> content,$this,$this->user->hasLogin(),$this->fields->ArticleType)); ?>

            fields->tags == '1'): ?>
            fields->copyright == '1'): ?>
            版权属于:author() ?> 所有, 采用《fields->copyright_cc);?>》进行许可, 转载请注明文章来源。
            created)?>
            thePrev('%s','没有了'); ?> theNext('%s','没有了'); ?>
            need('modules/poster.php'); ?>
            hidden): ?> need('comments.php'); ?> need('thirdparty_comments.php'); ?>

            评论区已被封印~

            ================================================ FILE: pages/sidebar.php ================================================
            ================================================ FILE: post.php ================================================ need('compoment/head.php');?> widget('Widget_Metas_Category_List')->to($categorys);?> next()): ?> category == $categorys->slug):?> slug; ?> title; ?> user->hasLogin()){ $cookie = true; } ?> need('modules/lock_article.php'); ?> need('pages/post.php'); ?> need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: steam.php ================================================ need('compoment/head.php');?>

            title() ?>


            need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: tags.php ================================================ need('compoment/head.php');?>

            title() ?>


            need('compoment/sidebar.php'); ?> need('compoment/foot.php'); ?> ================================================ FILE: thirdparty_comments.php ================================================

            评论区


            ================================================ FILE: vendors/BearSimpleCacheRules.js ================================================ /* eslint-disable no-unused-vars */ /* eslint-disable indent */ /* eslint-disable linebreak-style */ 'use strict'; (function () { 'use strict'; /** * Service Worker Toolbox caching */ var cacheVersion = '-toolbox-v1'; var dynamicVendorCacheName = 'dynamic-vendor' + cacheVersion; var staticVendorCacheName = 'static-vendor' + cacheVersion; var staticAssetsCacheName = 'static-assets' + cacheVersion; var contentCacheName = 'content' + cacheVersion; var maxEntries = 200; self.importScripts('usr/themes/bearsimple/assets/js/sw-toolbox.js'); self.toolbox.options.debug = false; // 缓存本站静态文件 self.toolbox.router.get('/usr/(.*)', self.toolbox.cacheFirst, { cache: { name: staticAssetsCacheName, maxEntries: maxEntries } }); // 缓存 Gravatar 头像 self.toolbox.router.get('/avatar/(.*)', self.toolbox.cacheFirst, { origin: /(secure\.gravatar\.com)/, cache: { name: staticVendorCacheName, maxEntries: maxEntries } }); // 缓存 Google 字体 self.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, { origin: /(fonts\.googleapis\.com)/, cache: { name: staticVendorCacheName, maxEntries: maxEntries } }); // 缓存 Emoji self.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, { origin: /(twemoji\.maxcdn\.com)/, cache: { name: staticVendorCacheName, maxEntries: maxEntries } }); self.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, { origin: /(fonts\.gstatic\.com)/, cache: { name: staticVendorCacheName, maxEntries: maxEntries } }); self.toolbox.router.get('/(.*)', self.toolbox.cacheFirst, { origin: /(puhuiti\.oss-cn-hangzhou\.aliyuncs\.com)/, cache: { name: staticVendorCacheName, maxEntries: maxEntries } }); // immediately activate this serviceworker self.addEventListener('install', function (event) { return event.waitUntil(self.skipWaiting()); }); self.addEventListener('activate', function (event) { return event.waitUntil(self.clients.claim()); }); })(); ================================================ FILE: vendors/Upload.php ================================================ trigger($hasDeleted)->deleteHandle($content); if ($hasDeleted) { return $result; } return @unlink(__TYPECHO_ROOT_DIR__ . '/' . $content['attachment']->path); } /** * 获取实际文件绝对访问路径 * * @param array $content 文件相关信息 * @return string */ public static function attachmentHandle(array $content): string { $result = Plugin::factory(Upload::class)->trigger($hasPlugged)->attachmentHandle($content); if ($hasPlugged) { return $result; } $options = Options::alloc(); return Common::url( $content['attachment']->path, defined('__TYPECHO_UPLOAD_URL__') ? __TYPECHO_UPLOAD_URL__ : $options->siteUrl ); } /** * 获取实际文件数据 * * @param array $content * @return string */ public static function attachmentDataHandle(array $content): string { $result = Plugin::factory(Upload::class)->trigger($hasPlugged)->attachmentDataHandle($content); if ($hasPlugged) { return $result; } return file_get_contents( Common::url( $content['attachment']->path, defined('__TYPECHO_UPLOAD_ROOT_DIR__') ? __TYPECHO_UPLOAD_ROOT_DIR__ : __TYPECHO_ROOT_DIR__ ) ); } /** * 初始化函数 */ public function action() { $options = Options::alloc(); if (isset($_POST['openid']) && $_POST['openid'] == $options->openId) { $this->upload(1,$_POST['cid']); } else{ if ($this->user->pass('contributor', true) && $this->request->isPost()) { $this->security->protect(); if ($this->request->is('do=modify&cid')) { $this->modify(); } else { $this->upload(); } } else { $this->response->setStatus(403); } } } /** * 执行升级程序 * * @throws Exception */ public function modify() { if (!empty($_FILES)) { $file = array_pop($_FILES); if (0 == $file['error'] && is_uploaded_file($file['tmp_name'])) { $this->db->fetchRow($this->select()->where('table.contents.cid = ?', $this->request->filter('int')->cid) ->where('table.contents.type = ?', 'attachment'), [$this, 'push']); if (!$this->have()) { $this->response->setStatus(404); exit; } if (!$this->allow('edit')) { $this->response->setStatus(403); exit; } // xhr的send无法支持utf8 if ($this->request->isAjax()) { $file['name'] = urldecode($file['name']); } $result = self::modifyHandle($this->row, $file); if (false !== $result) { self::pluginHandle()->beforeModify($result); $this->update([ 'text' => serialize($result) ], $this->db->sql()->where('cid = ?', $this->cid)); $this->db->fetchRow($this->select()->where('table.contents.cid = ?', $this->cid) ->where('table.contents.type = ?', 'attachment'), [$this, 'push']); /** 增加插件接口 */ self::pluginHandle()->modify($this); $this->response->throwJson([$this->attachment->url, [ 'cid' => $this->cid, 'title' => $this->attachment->name, 'type' => $this->attachment->type, 'size' => $this->attachment->size, 'bytes' => number_format(ceil($this->attachment->size / 1024)) . ' Kb', 'isImage' => $this->attachment->isImage, 'url' => $this->attachment->url, 'permalink' => $this->permalink ]]); } } } $this->response->throwJson(false); } /** * 修改文件处理函数,如果需要实现自己的文件哈希或者特殊的文件系统,请在options表里把modifyHandle改成自己的函数 * * @param array $content 老文件 * @param array $file 新上传的文件 * @return mixed */ public static function modifyHandle(array $content, array $file) { if (empty($file['name'])) { return false; } $result = self::pluginHandle()->trigger($hasModified)->modifyHandle($content, $file); if ($hasModified) { return $result; } $ext = self::getSafeName($file['name']); if ($content['attachment']->type != $ext) { return false; } $path = Common::url( $content['attachment']->path, defined('__TYPECHO_UPLOAD_ROOT_DIR__') ? __TYPECHO_UPLOAD_ROOT_DIR__ : __TYPECHO_ROOT_DIR__ ); $dir = dirname($path); //创建上传目录 if (!is_dir($dir)) { if (!self::makeUploadDir($dir)) { return false; } } if (isset($file['tmp_name'])) { @unlink($path); //移动上传文件 if (!@move_uploaded_file($file['tmp_name'], $path)) { return false; } } elseif (isset($file['bytes'])) { @unlink($path); //直接写入文件 if (!file_put_contents($path, $file['bytes'])) { return false; } } elseif (isset($file['bits'])) { @unlink($path); //直接写入文件 if (!file_put_contents($path, $file['bits'])) { return false; } } else { return false; } if (!isset($file['size'])) { $file['size'] = filesize($path); } //返回相对存储路径 return [ 'name' => $content['attachment']->name, 'path' => $content['attachment']->path, 'size' => $file['size'], 'type' => $content['attachment']->type, 'mime' => $content['attachment']->mime ]; } /** * 获取安全的文件名 * * @param string $name * @return string */ private static function getSafeName(string &$name): string { $name = str_replace(['"', '<', '>'], '', $name); $name = str_replace('\\', '/', $name); $name = false === strpos($name, '/') ? ('a' . $name) : str_replace('/', '/a', $name); $info = pathinfo($name); $name = substr($info['basename'], 1); return isset($info['extension']) ? strtolower($info['extension']) : ''; } /** * 创建上传路径 * * @param string $path 路径 * @return boolean */ private static function makeUploadDir(string $path): bool { $path = preg_replace("/\\\+/", '/', $path); $current = rtrim($path, '/'); $last = $current; while (!is_dir($current) && false !== strpos($path, '/')) { $last = $current; $current = dirname($current); } if ($last == $current) { return true; } if (!@mkdir($last, 0755)) { return false; } return self::makeUploadDir($path); } /** * 执行升级程序 * * @throws Exception */ public function upload($authorId = null,$ucid = null) { if (!empty($_FILES)) { $file = array_pop($_FILES); if (0 == $file['error'] && is_uploaded_file($file['tmp_name'])) { // xhr的send无法支持utf8 if ($this->request->isAjax()) { $file['name'] = urldecode($file['name']); } $result = self::uploadHandle($file); if (false !== $result) { self::pluginHandle()->beforeUpload($result); $struct = [ 'title' => $result['name'], 'slug' => $result['name'], 'type' => 'attachment', 'status' => 'publish', 'text' => serialize($result), 'allowComment' => 1, 'allowPing' => 0, 'allowFeed' => 1 ]; if(isset($authorId) && isset($ucid)){ $cid = $ucid; $struct['parent'] = $cid; $struct['authorId'] = 1; } else{ if (isset($this->request->cid)) { $cid = $this->request->filter('int')->cid; if ($this->isWriteable($this->db->sql()->where('cid = ?', $cid))) { $struct['parent'] = $cid; } } } $insertId = $this->insert($struct); $this->db->fetchRow($this->select()->where('table.contents.cid = ?', $insertId) ->where('table.contents.type = ?', 'attachment'), [$this, 'push']); /** 增加插件接口 */ self::pluginHandle()->upload($this); $this->response->throwJson([$this->attachment->url, [ 'cid' => $insertId, 'title' => $this->attachment->name, 'type' => $this->attachment->type, 'size' => $this->attachment->size, 'bytes' => number_format(ceil($this->attachment->size / 1024)) . ' Kb', 'isImage' => $this->attachment->isImage, 'url' => $this->attachment->url, 'permalink' => $this->permalink ]]); } } } $this->response->throwJson(false); } /** * 上传文件处理函数,如果需要实现自己的文件哈希或者特殊的文件系统,请在options表里把uploadHandle改成自己的函数 * * @param array $file 上传的文件 * @return mixed */ public static function uploadHandle(array $file) { if (empty($file['name'])) { return false; } $result = self::pluginHandle()->trigger($hasUploaded)->uploadHandle($file); if ($hasUploaded) { return $result; } $ext = self::getSafeName($file['name']); if (!self::checkFileType($ext)) { return false; } $date = new Date(); $path = Common::url( defined('__TYPECHO_UPLOAD_DIR__') ? __TYPECHO_UPLOAD_DIR__ : self::UPLOAD_DIR, defined('__TYPECHO_UPLOAD_ROOT_DIR__') ? __TYPECHO_UPLOAD_ROOT_DIR__ : __TYPECHO_ROOT_DIR__ ) . '/' . $date->year . '/' . $date->month; //创建上传目录 if (!is_dir($path)) { if (!self::makeUploadDir($path)) { return false; } } //获取文件名 $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext; $path = $path . '/' . $fileName; if (isset($file['tmp_name'])) { //移动上传文件 if (!@move_uploaded_file($file['tmp_name'], $path)) { return false; } } elseif (isset($file['bytes'])) { //直接写入文件 if (!file_put_contents($path, $file['bytes'])) { return false; } } elseif (isset($file['bits'])) { //直接写入文件 if (!file_put_contents($path, $file['bits'])) { return false; } } else { return false; } if (!isset($file['size'])) { $file['size'] = filesize($path); } //返回相对存储路径 return [ 'name' => $file['name'], 'path' => (defined('__TYPECHO_UPLOAD_DIR__') ? __TYPECHO_UPLOAD_DIR__ : self::UPLOAD_DIR) . '/' . $date->year . '/' . $date->month . '/' . $fileName, 'size' => $file['size'], 'type' => $ext, 'mime' => Common::mimeContentType($path) ]; } /** * 检查文件名 * * @access private * @param string $ext 扩展名 * @return boolean */ public static function checkFileType(string $ext): bool { $options = Options::alloc(); return in_array($ext, $options->allowedAttachmentTypes); } } ================================================ FILE: 配套插件/BsCore/Action.php ================================================ pluginDir('BsCore'). '/lib/phpmailer/Exception.php'; require_once Helper::options()->pluginDir('BsCore'). '/lib/phpmailer/PHPMailer.php'; require_once Helper::options()->pluginDir('BsCore'). '/lib/phpmailer/SMTP.php'; require_once dirname(__FILE__) . '/modules/Tinypng/Tinify/Exception.php'; require_once dirname(__FILE__) . '/modules/Tinypng/Tinify/ResultMeta.php'; require_once dirname(__FILE__) . '/modules/Tinypng/Tinify/Result.php'; require_once dirname(__FILE__) . '/modules/Tinypng/Tinify/Source.php'; require_once dirname(__FILE__) . '/modules/Tinypng/Tinify/Client.php'; require_once dirname(__FILE__) . '/modules/Tinypng/Tinify.php'; if(!class_exists('CSF')){ require_once Helper::options()->pluginDir('BsCore').'/bsoptions-framework.php'; } if (!class_exists('bsOptions')){ require_once \Utils\Helper::options()->pluginDir('BsCore').'/bsOptions.php'; } function curl_file_get_contents($_url, $type='www') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_REFERER, 'https://'.$type.'.douban.com/'); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'); $output = curl_exec($ch); curl_close($ch); return $output; } class Action extends Widget implements \Widget\ActionInterface { private string $_template_dir = __DIR__ . '/modules/MailServices/'; public function bsshortlink() { $requestString = $this->request->key; $siteUrl = preg_replace("/https?:\/\//", "", Helper::options()->siteUrl); $options = get_option('bearsimple'); $referer = $this->request->getReferer(); $template = $options['goLinkThemes'] == 'NULL' ? null : $options['goLinkThemes']; // 设置nofollow属性 $this->response->setHeader('X-Robots-Tag', 'noindex, nofollow'); if ($requestString === \BsCore\Plugin::urlSafeB64Encodes(\BsCore\Plugin::urlSafeB64Decodes($requestString))) { // 自动转换链接处理 $target = \BsCore\Plugin::urlSafeB64Decodes($requestString); $allow_redirect = false; // 默认不允许跳转 // 检查 referer $allow_redirect = \BsCore\Plugin::checkDomains($referer, $refererList); if (strpos($referer, $siteUrl) !== false) { $allow_redirect = true; } if (!$allow_redirect) { $this->response->redirect($siteUrl, 301); exit(); } }elseif(\BsCore\Plugin::bCore_getDiyLink($requestString)['url']) { $target = \BsCore\Plugin::bCore_getDiyLink($requestString)['url']; }else { throw new \Typecho\Widget\Exception(_t('您访问的网页不存在'), 404); } if ($template === 'NULL' || $template === null) { // 无跳转页面 $this->response->redirect($target, 301); } else { $filename = Helper::options()->themeUrl . '/modules/GoLinks/templates/'. $template . '.html'; if (PATH_SEPARATOR !== ':') { $filename = mb_convert_encoding($filename, 'GBK', "auto"); } $contents = file_get_contents($filename); $html = str_replace(array('{{url}}', '{{delay}}', '{{title}}', '{{siteUrl}}', '{{year}}'), array($target, '3',Helper::options()->title,Helper::options()->siteUrl,date('Y')), $contents); echo preg_replace_callback("/\{\{([_a-z0-9]+)\}\}/i", array(__CLASS__, '__relpaceCallbacks'), $html); exit(); } } public function tinypng_status() { $apikey = trim(get_option('bearsimple')['Tinypng_apikey']); \Tinify\setKey($apikey); \Tinify\validate(); $compressionsThisMonth = \Tinify\compressionCount(); $number = 500 - $compressionsThisMonth; echo $number; } public function clean_cache() { $options = get_option('bearsimple'); if ($options['Cache_choose'] == 'memcached' || $options['Cache_choose'] == 'redis' || $options['Cache_choose'] == 'apcu' || $options['Cache_choose'] == 'sqlite'|| $options['Cache_choose'] == 'memory'|| $options['Cache_choose'] == 'flysystem') { \BsCore\Plugin::initBackend($options['Cache_choose']); try { \BsCore\Plugin::$cache->flush(); $data['code'] = '1'; $data['message'] = '缓存清理成功!'; echo json_encode($data, JSON_UNESCAPED_UNICODE); } catch (Exception $e) { print $e->getMessage(); } } else{ // 关闭其他插件选项 if ($options['enable_gcache'] == '1'){ $options['enable_gcache'] = 0; } if ($options['enable_markcache'] == '1'){ $options['enable_markcache'] = 0; } $data['code'] = '0'; $data['message'] = '缓存清理失败,请检查缓存方式!'; echo json_encode($data, JSON_UNESCAPED_UNICODE); } bsOptions::update_option('bearsimple', $options); } //邮件功能 private $_db; private $_dir; private $_options; private $_isMailLog = false; private $_user; private $_email; /** * 读取缓存文件内容 */ public function process($fileName) { $this->init(); $options = get_option('bearsimple'); //获取评论内容 $file = $this->_dir . '/cache/' . $fileName; if (file_exists($file)) { $this->_email = unserialize(file_get_contents($file)); @unlink($file); if (!$this->_user->simpleLogin($this->_email->ownerId)) { $this->widget('Widget_Archive@404', 'type=404')->render(); exit; } } else { $this->widget('Widget_Archive@404', 'type=404')->render(); exit; } if($this->_email->banMail){ $this->ban($this->_email->coid,true); } //发件人邮箱 $this->_email->from = $options['CommentNotify__SenderForm'] ? $options['CommentNotify__SenderForm'] : $options['CommentNotify__Username']; //发件人名称 $this->_email->fromName = $options['CommentNotify__SenderName'] ? $options['CommentNotify__SenderName'] : $this->_email->siteTitle; //向博主发邮件的标题格式 $this->_email->titleForOwner = $options['CommentNotify__Author']; //向访客发邮件的标题格式 $this->_email->titleForGuest = $options['CommentNotify__Reader']; //验证博主是否接收自己的邮件 $toMe = (in_array('3', $options['CommentNotify__OtherSetting']) && $this->_email->ownerId == $this->_email->authorId) ? true : false; //向博主发信 if ( in_array($this->_email->status, $options['CommentNotify__NotifySetting']) && in_array('1', $options['CommentNotify__OtherSetting']) && ($toMe || $this->_email->ownerId != $this->_email->authorId) && 0 == $this->_email->parent ) { if (empty($options['CommentNotify__AcceptMailAddress'])) { \Typecho\Widget::widget('Widget_Users_Author@temp' . $this->_email->cid, array('uid' => $this->_email->ownerId))->to($user); $this->_email->to = $user->mail; } else { $this->_email->to = $options['CommentNotify__AcceptMailAddress']; } $this->authorMail()->sendMail(); } //向访客发信 if ( 0 != $this->_email->parent && 'approved' == $this->_email->status && in_array('2', $options['CommentNotify__OtherSetting']) && !$this->ban($this->_email->parent) ) { //如果联系我的邮件地址为空,则使用文章作者的邮件地址 if (empty($this->_email->contactme)) { if (!isset($user) || !$user) { \Typecho\Widget::widget('Widget_Users_Author@temp' . $this->_email->cid, array('uid' => $this->_email->ownerId))->to($user); } $this->_email->contactme = $user->mail; } else { $this->_email->contactme = $options['CommentNotify__TemplateContact']; } $original = $this->_db->fetchRow($this->_db->select('author', 'mail', 'text') ->from('table.comments') ->where('coid = ?', $this->_email->parent)); if ( in_array('3', $options['CommentNotify__OtherSetting']) || $this->_email->mail != $original['mail'] ) { $this->_email->to = $original['mail']; $this->_email->originalText = \BsCore\Plugin::getEmo($original['text']); $this->_email->originalAuthor = $original['author']; $this->guestMail()->sendMail(); } } $date = new \Typecho\Date(\Typecho\Date::gmtTime()); $time = $date->format('Y-m-d H:i:s'); $this->mailLog(false, $time . " 邮件发送完毕!\r\n"); } /** * 作者邮件信息 * @return $this */ public function authorMail() { error_reporting(0); $options = get_option('bearsimple'); $this->_email->toName = $this->_email->siteTitle; $date = new \Typecho\Date($this->_email->created); $time = $date->format('Y-m-d H:i:s'); $status = array( "approved" => '通过', "waiting" => '待审', "spam" => '垃圾' ); $search = array( '{siteTitle}', '{title}', '{author}', '{ip}', '{mail}', '{permalink}', '{manage}', '{text}', '{time}', '{status}', '{siteurl}' ); $replace = array( $this->_email->siteTitle, $this->_email->title, $this->_email->author, $this->_email->ip, $this->_email->mail, $this->_email->permalink, $this->_email->manage, $this->_email->text, $time, $status[$this->_email->status], $this->_options->siteUrl ); $this->_email->msgHtml = str_replace($search, $replace, file_get_contents(dirname(__FILE__)."/modules/MailServices/owner.html")); $this->_email->subject = str_replace($search, $replace, $this->_email->titleForOwner); $this->_email->altBody = "作者:" . $this->_email->author . "\r\n链接:" . $this->_email->permalink . "\r\n评论:\r\n" . $this->_email->text; return $this; } /** * 访问邮件信息 * @return $this */ public function guestMail() { error_reporting(0); $options = get_option('bearsimple'); $sysoptions = \Typecho\Widget::widget('Widget_Options'); $this->_email->toName = $this->_email->originalAuthor ? $this->_email->originalAuthor : $this->_email->siteTitle; $date = new \Typecho\Date($this->_email->created); $time = $date->format('Y-m-d H:i:s'); $search = array( '{siteTitle}', '{title}', '{author_p}', '{author}', '{permalink}', '{text}', '{contactme}', '{text_p}', '{time}', '{siteurl}' ); $replace = array( $this->_email->siteTitle, $this->_email->title, $this->_email->originalAuthor, $this->_email->author, $this->_email->permalink, $this->_email->text, $this->_email->contactme, $this->_email->originalText, $time, $this->_options->siteUrl ); $this->_email->msgHtml = str_replace($search, $replace, file_get_contents(dirname(__FILE__)."/modules/MailServices/guest.html")); $this->_email->subject = str_replace($search, $replace, $this->_email->titleForGuest); $this->_email->altBody = "作者:" . $this->_email->author . "\r\n链接:" . $this->_email->permalink . "\r\n评论:\r\n" . $this->_email->text; return $this; } /* * 发送邮件 */ public function sendMail() { error_reporting(0); /** 载入邮件组件 */ $mailer = new PHPMailer(true); $mailer->CharSet = 'UTF-8'; $mailer->Encoding = 'base64'; $options = get_option('bearsimple'); //选择发信模式 switch ($options['CommentNotify__Sendway']) { case 'smtp': $mailer->IsSMTP(); if (in_array('true', $options['CommentNotify__Verify'])) { $mailer->SMTPAuth = true; } switch ($options['CommentNotify__VerifyWay']) { case 'ssl': $mailer->SMTPSecure = "ssl"; break; case 'tls': $mailer->SMTPSecure = "tls"; break; case 'none': $mailer->SMTPSecure = ""; break; } $mailer->Host = $options['CommentNotify__Address']; $mailer->Port = $options['CommentNotify__Port']; $mailer->Username = $options['CommentNotify__Username']; $mailer->Password = $options['CommentNotify__Password']; break; } $mailer->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) ); $mailer->isHTML(true); $mailer->SetFrom($this->_email->from, $this->_email->fromName); $mailer->AddReplyTo($this->_email->to, $this->_email->toName); $mailer->Subject = $this->_email->subject; $mailer->AltBody = $this->_email->altBody; $mailer->MsgHTML($this->_email->msgHtml); $mailer->AddAddress($this->_email->to, $this->_email->toName); if ($result = $mailer->Send()) { $this->mailLog(); } else { $this->mailLog(false, $mailer->ErrorInfo . "\r\n"); $result = $mailer->ErrorInfo; } $mailer->ClearAddresses(); $mailer->ClearReplyTos(); return $result; } /* * 记录邮件发送日志和错误信息 */ public function mailLog($type = true, $content = null) { if (!$this->_isMailLog) { return false; } $fileName = $this->_dir . '/log/mailer_log.txt'; if ($type) { $guest = explode('@', $this->_email->to); $guest = substr($this->_email->to, 0, 1) . '***' . $guest[1]; $content = $content ? $content : "向 " . $guest . " 发送邮件成功!\r\n"; } file_put_contents($fileName, $content, FILE_APPEND); } /* * 验证原评论者是否接收评论 */ public function ban($parent, $isWrite = false) { if ($parent) { $index = ceil($parent / 500); $filename = $this->_dir . '/log/ban_' . $index . '.list'; if (!file_exists($filename)) { $list = array(); file_put_contents($filename, serialize($list)); } else { $list = unserialize(file_get_contents($filename)); } //写入记录 if ($isWrite) { $list[$parent] = 1; file_put_contents($filename, serialize($list)); return true; } else if (isset($list[$parent]) && $list[$parent]) { return true; } } return false; } /** * 邮件发送测试 */ public function testMail() { error_reporting(0); $options = get_option('bearsimple'); $this->init(); $this->_isMailLog = true; $this->_email->from = $options['CommentNotify__SenderForm'] ? $options['CommentNotify__SenderForm'] : $options['CommentNotify__Username']; $this->_email->fromName = $options['CommentNotify__SenderName'] ? $options['CommentNotify__SenderName'] : $this->_options->title; $this->_email->to = $this->_user->mail; $this->_email->toName = $this->_user->screenName; $this->_email->subject = '测试邮件'; $this->_email->altBody = '这是一封由BearSimple发出的测试邮件'; $this->_email->msgHtml = '这是一封由BearSimple发出的测试邮件'; $result = $this->sendMail(); $data['code'] = true === $result ? '1' : '0'; $data['message'] = true === $result ? _t('测试邮件发送成功,已发送至'.$this->_user->mail) : _t('测试邮件发送失败:' . $result); echo json_encode($data, JSON_UNESCAPED_UNICODE); } /* * 获取管理员信息 */ public function userInfo($value,$uid) { $db = \Typecho\Db::get(); $prow = $db->fetchRow($db->select($value)->from('table.users')->where('uid = ?', $uid)); $text = $prow[$value]; return $text; } /* * 邮件发送[友链] */ public function linkMail() { error_reporting(0); $options = get_option('bearsimple'); $sysoptions = \Typecho\Widget::widget('Widget_Options'); $this->init(); $this->_isMailLog = true; $this->_email->from = $options['CommentNotify__SenderForm'] ? $options['CommentNotify__SenderForm'] : $options['CommentNotify__Username']; $this->_email->fromName = $options['CommentNotify__SenderName'] ? $options['CommentNotify__SenderName'] : $this->_options->title; $search = array( '{siteTitle}', '{friendname}', '{siteurl}' ); $replace = array( $sysoptions->title, $_GET['friendname'], $sysoptions->siteUrl ); switch($_GET['type']){ case 'notifyaccept': $this->_email->to = self::userInfo('mail','1'); $this->_email->toName = $this->_user->screenName; $this->_email->subject = '您的站点有新的友链申请等待审核哦'; $this->_email->altBody = '友链审核提醒'; $this->_email->msgHtml = str_replace($search, $replace, file_get_contents(dirname(__FILE__)."/modules/MailServices/friendlink_notify.html")); //$this->_email->msgHtml = '主人,有人提交了友链申请啦,快去审核下叭~'; break; case 'notifysuccess': $this->_email->to = $_GET['mail']; $this->_email->toName = $_GET['mail']; $this->_email->subject = '友链审核结果'; $this->_email->altBody = '友链审核结果'; $this->_email->msgHtml = str_replace($search, $replace, file_get_contents(dirname(__FILE__)."/modules/MailServices/friendlink_approved.html")); //$this->_email->msgHtml = '您好,您在'.$this->_options->title.'提交的友链申请已经审核通过,后续还请您遵守本站关于互换友链的相关说明哦。'; break; case 'notifyfail': $this->_email->to = $_GET['mail']; $this->_email->toName = $_GET['mail']; $this->_email->subject = '友链审核结果'; $this->_email->altBody = '友链审核结果'; $this->_email->msgHtml = str_replace($search, $replace, file_get_contents(dirname(__FILE__)."/modules/MailServices/friendlink_reject.html")); //$this->_email->msgHtml = '您好,您在'.$this->_options->title.'提交的友链申请审核不通过,还请您参照本站关于互换友链的标准并检查是否符合哦。'; break; } $result = $this->sendMail(); $data['code'] = true === $result ? '1' : '0'; $data['message'] = true === $result ? _t('邮件发送成功') : _t('邮件发送失败:' . $result); echo json_encode($data, JSON_UNESCAPED_UNICODE); } public function editEmailTemplate($file) { $path = $this->_template_dir . $file; if (file_exists($path) && is_writeable($path)) { $handle = fopen($path, 'wb'); if ($handle && fwrite($handle, $this->request->content)) { fclose($handle); $this->widget('Widget_Notice')->set(_t("您所进行的编辑已经保存", $file), 'success'); } else { $this->widget('Widget_Notice')->set(_t("该文件 %s 无法被写入", $file), 'error'); } $this->response->goBack(); } else { throw new \Typecho\Widget\Exception(_t('您编辑的模板文件不存在')); } } /** * 初始化 * @return $this */ public function init() { $this->_dir = dirname(__FILE__); $this->_db = \Typecho\Db::get(); $this->_email = (object) $this->_user = $this->widget('Widget_User'); $this->_options = $this->widget('Widget_Options'); $this->mailLog(false, "开始发送邮件Action:" . $this->request->send . "\r\n"); } public function action() { $this->on($this->request->is('do=testMail'))->testMail(); $this->on($this->request->is('do=linkMail'))->linkMail(); $this->on($this->request->is('do=tinypng'))->tinypng_status(); $this->on($this->request->is('send'))->process($this->request->send); $this->on($this->request->is('do=editEmailTemplate'))->editEmailTemplate($this->request->edit); } private function __relpaceCallbacks($matches) { return $this->options->{$matches[1]}; } } ================================================ FILE: 配套插件/BsCore/Console.php ================================================ widget('Widget_User')->pass('administrator'); $files = glob($this->_template_dir . '*.html'); $this->_currentFile = $this->request->get('file', 'owner.html'); if (preg_match("/^([_0-9a-z-\.\ ])+$/i", $this->_currentFile) && file_exists($this->_template_dir . $this->_currentFile)) { foreach ($files as $file) { if (!file_exists($file)) continue; $file = basename($file); $this->push(array( 'file' => $file, 'current' => ($file == $this->_currentFile) )); } return; } throw new \Typecho\Widget\Exception('模板文件不存在', 404); } /** * 获取菜单标题 * * @return string */ public function getMenuTitle(): string { return _t('编辑文件 %s', $this->_currentFile); } /** * 获取文件内容 * * @return string */ public function currentContent(): string { return htmlspecialchars(file_get_contents($this->_template_dir . $this->_currentFile)); } /** * 获取文件是否可读 * * @return string */ public function currentIsWriteable(): string { return is_writeable($this->_template_dir . $this->_currentFile); } /** * 获取当前文件 * * @return string */ public function currentFile(): string { return $this->_currentFile; } } ================================================ FILE: 配套插件/BsCore/Plugin.php ================================================ 安装后无需进行其他设置 * @package BsCore * @author BearNotion * @version v2.9.9-release * @link https://www.bearnotion.ru/ * */ if (!defined('__TYPECHO_ROOT_DIR__')) exit; if (!defined('pluginName')) { define('pluginName', 'BsCore'); } require_once 'bsoptions-framework.php'; class Plugin implements PluginInterface { public static $action = 'bs-ajax'; #邮件 private static $_isMailLog = false; private static $_adapter = false; #上传文件目录 const UPLOAD_DIR = 'usr/uploads'; const PLUGIN_DIR = '/usr/plugins/BsCore/'; public static $cache = null; public static $html = null; public static $path = null; public static $sys_config = null; public static $plugin_config = null; public static $request = null; public static $passed = false; public static $_panel = 'BsCore/pages/panel.php'; public static function getNS(): string { return __NAMESPACE__; } public static function activate() { /* * * 初始化路由和方法 * */ bsRouter::initRouter(); Helper::addPanel(0, self::$_panel, 'BearSimple主题扩展控制', 'BearSimple主题扩展控制面板', 'administrator'); if(get_option('bearsimple')['goLinkOpen'] == true){ //外链转内链钩子 Helper::addRoute('go', '/go/[key]/', 'TypechoPlugin\BsCore\Action', 'bsshortlink'); \Typecho\Plugin::factory('Widget_Abstract_Contents')->contentEx_12 = [__CLASS__, 'replace']; \Typecho\Plugin::factory('Widget_Abstract_Contents')->excerptEx_12 = [__CLASS__, 'replace']; } \Typecho\Plugin::factory('index.php')->begin = [__CLASS__, 'initevent']; \Typecho\Plugin::factory('admin/header.php')->header_999 = [__CLASS__, 'enqueue_style']; \Typecho\Plugin::factory('admin/footer.php')->end_999 = [__CLASS__, 'enqueue_script']; if(get_option('bearsimple')['Cache'] == true && !empty(get_option('bearsimple')['Cache_choose']) && get_option('bearsimple')['Cache_choose'] !== '1'){ //缓存功能钩子 Helper::addRoute('clean-cache', '/clean-cache', 'TypechoPlugin\BsCore\Action', 'clean_cache'); \Typecho\Plugin::factory('index.php')->begin = array(__CLASS__, 'C'); \Typecho\Plugin::factory('index.php')->end = array(__CLASS__, 'S'); \Typecho\Plugin::factory('Widget_Contents_Post_Edit')->finishPublish = [__CLASS__, 'post_update']; \Typecho\Plugin::factory('Widget_Contents_Page_Edit')->finishPublish = [__CLASS__, 'post_update']; \Typecho\Plugin::factory('Widget_Contents_Post_Edit')->delete = [__CLASS__, 'post_del_update']; \Typecho\Plugin::factory('Widget_Contents_Page_Edit')->delete = [__CLASS__, 'post_del_update']; \Typecho\Plugin::factory('Widget_Feedback')->finishComment_1 = [__CLASS__, 'comment_update']; \Typecho\Plugin::factory('Widget_Comments_Edit')->finishDelete = [__CLASS__, 'comment_update2']; \Typecho\Plugin::factory('Widget_Comments_Edit')->finishEdit = [__CLASS__, 'comment_update2']; \Typecho\Plugin::factory('Widget_Comments_Edit')->finishComment = [__CLASS__, 'comment_update2']; \Typecho\Plugin::factory('Widget_Abstract_Contents')->contentEx = [__CLASS__, 'cache_contentEx']; \Typecho\Plugin::factory('BsCache.Widget_Cache')->getCache = [__CLASS__, 'BsCache_getCache']; \Typecho\Plugin::factory('BsCache.Widget_Cache')->setCache = [__CLASS__, 'BsCache_setCache']; } if(get_option('bearsimple')['Cache'] == true && !empty(get_option('bearsimple')['Cache_choose']) && get_option('bearsimple')['Cache_choose'] == '1'){ \Typecho\Plugin::factory('index.php')->begin = [__CLASS__, 'getCache_file']; \Typecho\Plugin::factory('index.php')->end = [__CLASS__, 'setCache_file']; } if(get_option('bearsimple')['Editors'] == '2'){ \Typecho\Plugin::factory('admin/write-post.php')->bottom_1000 = [__CLASS__,'btbutton']; \Typecho\Plugin::factory('admin/write-page.php')->bottom_1000 = [__CLASS__, 'btbutton']; } else{ \Typecho\Plugin::factory('admin/write-post.php')->richEditor_1000 = [__CLASS__, 'Editor']; \Typecho\Plugin::factory('admin/write-page.php')->richEditor_1000 = [__CLASS__, 'Editor']; } \Typecho\Plugin::factory('Widget_Feedback')->comment = [__CLASS__, 'filter']; \Typecho\Plugin::factory('Widget_Feedback')->finishComment_134 = [__CLASS__, 'filter2']; if(get_option('bearsimple')['Sticky'] == true){ //文章置顶 \Typecho\Plugin::factory('Widget_Archive')->indexHandle = [__CLASS__, 'sticky']; \Typecho\Plugin::factory('Widget_Archive')->categoryHandle =[__CLASS__, 'stickyC']; } if(get_option('bearsimple')['seo_push'] == true){ \Typecho\Plugin::factory('Widget_Contents_Post_Edit')->finishPublish = [__CLASS__, 'seo_publishpush']; } //LskyPro if(get_option('bearsimple')['bucket_choose'] == '8'){ \Typecho\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'lsky_uploadHandle']; \Typecho\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'lsky_modifyHandle']; \Typecho\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'lsky_deleteHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'lsky_attachmentHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'lsky_attachmentDataHandle']; } //腾讯云COS if(get_option('bearsimple')['bucket_choose'] == '2'){ \Typecho\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'uploadHandle']; \Typecho\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'modifyHandle']; \Typecho\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'deleteHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'attachmentHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'attachmentDataHandle']; \Typecho\Plugin::factory('Widget_Archive')->beforeRender = [__CLASS__, 'Widget_Archive_beforeRender']; } //阿里云COS if(get_option('bearsimple')['bucket_choose'] == '3'){ \Typecho\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'ali_uploadHandle']; \Typecho\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'ali_modifyHandle']; \Typecho\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'ali_deleteHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'ali_attachmentHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'ali_attachmentDataHandle']; } //七牛云Kodo if(get_option('bearsimple')['bucket_choose'] == '4'){ \Typecho\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'qiniu_uploadHandle']; \Typecho\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'qiniu_modifyHandle']; \Typecho\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'qiniu_deleteHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'qiniu_attachmentHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'qiniu_attachmentDataHandle']; } //又拍云USS if(get_option('bearsimple')['bucket_choose'] == '5'){ \Typecho\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'upyun_uploadHandle']; \Typecho\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'upyun_modifyHandle']; \Typecho\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'upyun_deleteHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'upyun_attachmentHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'upyun_attachmentDataHandle']; } //华为云OBS if(get_option('bearsimple')['bucket_choose'] == '7'){ \Typecho\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'hw_uploadHandle']; \Typecho\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'hw_modifyHandle']; \Typecho\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'hw_deleteHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'hw_attachmentHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'hw_attachmentDataHandle']; } //百度云BOS if(get_option('bearsimple')['bucket_choose'] == '6'){ \Typecho\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__, 'bd_uploadHandle']; \Typecho\Plugin::factory('Widget_Upload')->modifyHandle = [__CLASS__, 'bd_modifyHandle']; \Typecho\Plugin::factory('Widget_Upload')->deleteHandle = [__CLASS__, 'bd_deleteHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentHandle = [__CLASS__, 'bd_attachmentHandle']; \Typecho\Plugin::factory('Widget_Upload')->attachmentDataHandle = [__CLASS__, 'bd_attachmentDataHandle']; } //代码高亮 \Typecho\Plugin::factory('Widget_Archive')->header = [__CLASS__, 'headlink']; \Typecho\Plugin::factory('Widget_Archive')->footer = [__CLASS__, 'footlink']; //登陆验证逻辑 //\Typecho\Plugin::factory('admin/header.php')->header_1081 = [__CLASS__, 'loginverify']; //邮件 if(get_option('bearsimple')['CommentNotify__Open'] == true && get_option('bearsimple')['Smtp_open'] == true){ \Typecho\Plugin::factory('Widget_Feedback')->finishComment_28654 = [__CLASS__,'parseComment']; \Typecho\Plugin::factory('Widget_Comments_Edit')->finishComment_25674 = [__CLASS__,'parseComment']; \Typecho\Plugin::factory('Widget_Comments_Edit')->mark_25544 = [__CLASS__,'parseCommentMark']; } if(get_option('bearsimple')['Smtp_open'] == true){ Helper::addAction(self::$action, 'TypechoPlugin\BsCore\Action'); } if(get_option('bearsimple')['Comment_private'] == true){ \Typecho\Plugin::factory('Widget_Abstract_Comments')->contentEx = [__CLASS__,'secretComment']; } if(get_option('bearsimple')['Cate_Encrypt_open'] == true && get_option('bearsimple')['Cate_Encrypt_hide'] == false){ \Typecho\Plugin::factory('Widget_Archive')->indexHandle_133 = [__CLASS__,'CateFilter']; } //当腾讯云COS存储未开启时且Tinypng压缩开启 if(get_option('bearsimple')['Tinypng_open'] == true && get_option('bearsimple')['bucket_choose'] !== '2'&& get_option('bearsimple')['bucket_choose'] !== '3'&& get_option('bearsimple')['bucket_choose'] !== '4'&& get_option('bearsimple')['bucket_choose'] !== '5'&& get_option('bearsimple')['bucket_choose'] !== '6'&& get_option('bearsimple')['bucket_choose'] !== '7'){ \Typecho\Plugin::factory('Widget_Upload')->uploadHandle = [__CLASS__,'tinypng_uploadHandle']; } if(get_option('bearsimple')['Tinypng_open'] == true){ \Typecho\Plugin::factory('admin/write-post.php')->bottom = [__CLASS__,'tinypng_bottom']; } \Typecho\Plugin::factory('admin/write-post.php')->bottom_99 = [__CLASS__,'tags_bottom']; //当开启用户中心功能 if(get_option('bearsimple')['UserCenterOpen'] == true){ \Typecho\Plugin::factory('Widget_Register')->register_99 = [__CLASS__,'bregister']; \Typecho\Plugin::factory('Widget_Register')->finishRegister_99 = [__CLASS__,'bregister_finish']; } \Typecho\Plugin::factory('Widget_Abstract_Contents')->markdown = [__CLASS__, 'markdownparse']; \Typecho\Plugin::factory('Widget_Archive')->beforeRender_siteMaintenance_15613 = [__CLASS__, 'siteMaintenance']; \CSF::activateEvent(); /* * * 检测数据库并插入数据库表 * */ $db = \Typecho\Db::get(); $prefix = $db->getPrefix(); $table = $db->getPrefix() . 'bscore_friendlinks'; $table2 = $db->getPrefix() . 'bscore_sign_data'; $table3 = $db->getPrefix() . 'bscore_notify_data'; $table4 = $db->getPrefix() . 'bscore_says_data'; $table5 = $db->getPrefix() . 'bscore_memos_agree_data'; $adapter = $db->getAdapterName(); if ("Pdo_SQLite" === $adapter || "SQLite" === $adapter) { //友链表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table . " ( id INTEGER PRIMARY KEY, friendname TEXT, friendurl TEXT, friendpic TEXT, frienddec TEXT, contactmail TEXT, status TEXT)"); //用户中心签到表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table2 . " ( id INTEGER PRIMARY KEY, signuid TEXT, signtime TEXT, signcoin TEXT)"); //用户中心通知表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table3 . " ( id INTEGER PRIMARY KEY, notifyuid TEXT, notifytime TEXT, notifytitle TEXT, notifytext TEXT)"); //用户中心动态表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table4 . " ( id INTEGER PRIMARY KEY, saysuid TEXT, saystime TEXT, saystext TEXT, saysprivate TEXT, sayslike TEXT DEFAULT 0)"); //memos点赞表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table5 . " ( id INTEGER PRIMARY KEY, memosid TEXT, agree TEXT)"); if (!array_key_exists('coins', $db->fetchRow($db->select()->from('table.users')))) { $db->query('ALTER TABLE ' . $prefix . 'users ADD coins TEXT NOT NULL DEFAULT 0;'); } if (!array_key_exists('submission', $db->fetchRow($db->select()->from('table.users')))) { $db->query('ALTER TABLE ' . $prefix . 'users ADD submission TEXT NOT NULL DEFAULT true;'); } if (!array_key_exists('signature', $db->fetchRow($db->select()->from('table.users')))) { $db->query('ALTER TABLE ' . $prefix . 'users ADD signature TEXT NOT NULL DEFAULT 0;'); } if (strpos($db->fetchAll($db->query("select sql from sqlite_master where type = 'table' and name = '" . $table . "'"))[0]['sql'], 'checkurl') == false) { $db->query('ALTER TABLE ' . $prefix . 'bscore_friendlinks ADD checkurl TEXT NOT NULL DEFAULT 0;'); } if (strpos($db->fetchAll($db->query("select sql from sqlite_master where type = 'table' and name = '" . $table . "'"))[0]['sql'], 'type') == false) { $db->query('ALTER TABLE ' . $prefix . 'bscore_friendlinks ADD type TEXT NOT NULL DEFAULT 0;'); } if (strpos($db->fetchAll($db->query("select sql from sqlite_master where type = 'table' and name = '" . $table . "'"))[0]['sql'], 'rejectreason') == false) { $db->query('ALTER TABLE ' . $prefix . 'bscore_friendlinks ADD rejectreason TEXT NULL DEFAULT NULL;'); } } if("pgsql" === $adapter || "Pdo_Pgsql" === $adapter){ //友链表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table . " ( id INTEGER PRIMARY KEY, friendname TEXT, friendurl TEXT, friendpic TEXT, frienddec TEXT, contactmail TEXT, checkurl TEXT NOT NULL DEFAULT 0, type TEXT NOT NULL DEFAULT 0, rejectreason TEXT NULL DEFAULT NULL, status TEXT)"); //用户中心签到表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table2 . " ( id INTEGER PRIMARY KEY, signuid TEXT, signtime TEXT, signcoin TEXT)"); //用户中心通知表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table3 . " ( id INTEGER PRIMARY KEY, notifyuid TEXT, notifytime TEXT, notifytitle TEXT, notifytext TEXT)"); //用户中心动态表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table4 . " ( id INTEGER PRIMARY KEY, saysuid TEXT, saystime TEXT, saystext TEXT, saysprivate TEXT, sayslike TEXT DEFAULT 0)"); //memos点赞表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table5 . " ( id INTEGER PRIMARY KEY, memosid TEXT, agree TEXT)"); if (!array_key_exists('coins', $db->fetchRow($db->select()->from('table.users')))) { $db->query('ALTER TABLE ' . $prefix . 'users ADD coins TEXT NOT NULL DEFAULT 0;'); } if (!array_key_exists('submission', $db->fetchRow($db->select()->from('table.users')))) { $db->query('ALTER TABLE ' . $prefix . 'users ADD submission TEXT NOT NULL DEFAULT true;'); } if (!array_key_exists('signature', $db->fetchRow($db->select()->from('table.users')))) { $db->query('ALTER TABLE ' . $prefix . 'users ADD signature TEXT NOT NULL DEFAULT 0;'); } } if ("Pdo_Mysql" === $adapter || "Mysql" === $adapter || "Mysqli" === $adapter) { $dbConfig = null; if (class_exists('\Typecho\Db')) { $dbConfig = $db->getConfig($db::READ); } else { $dbConfig = $db->getConfig()[0]; } $charset = $dbConfig->charset; $db->query("CREATE TABLE IF NOT EXISTS " . $table . " ( `id` int(8) NOT NULL AUTO_INCREMENT, `friendname` varchar(1000) NOT NULL, `friendurl` varchar(1000) NOT NULL, `friendpic` varchar(1000) NOT NULL, `frienddec` varchar(1000) NOT NULL, `contactmail` varchar(1000) DEFAULT NULL, `status` varchar(1000) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); $db->query(" CREATE TABLE IF NOT EXISTS " . $table2 . " ( `id` int(8) NOT NULL AUTO_INCREMENT, `signuid` varchar(1000) NOT NULL, `signtime` varchar(1000) NOT NULL, `signcoin` varchar(1000) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); $db->query(" CREATE TABLE IF NOT EXISTS " . $table3 . " ( `id` int(8) NOT NULL AUTO_INCREMENT, `notifyuid` varchar(1000) NOT NULL, `notifytime` varchar(1000) NOT NULL, `notifytitle` varchar(1000) NOT NULL, `notifytext` varchar(1000) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); $db->query(" CREATE TABLE IF NOT EXISTS " . $table4 . " ( `id` int(8) NOT NULL AUTO_INCREMENT, `saysuid` varchar(1000) NOT NULL, `saystime` varchar(1000) NOT NULL, `saystext` varchar(1000) NOT NULL, `saysprivate` varchar(1000) NOT NULL, `sayslike` varchar(1000) NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); //memos点赞表检测初始化 $db->query(" CREATE TABLE IF NOT EXISTS " . $table5 . " ( `id` int(10) NOT NULL AUTO_INCREMENT, `memosid` varchar(150) NOT NULL, `agree` varchar(1000) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=$charset AUTO_INCREMENT=1"); if(json_decode(json_encode($db->fetchAll($db->query("SHOW FULL COLUMNS FROM ".$table))),true)[6]['Field'] !=='contactmail' && json_decode(json_encode($db->fetchAll($db->query("SHOW FULL COLUMNS FROM ".$table))),true)[5]['Field'] !=='contactmail'){ $db->query('ALTER TABLE '.$table.' ADD `contactmail` varchar(1000) DEFAULT null;'); } if (!array_key_exists('coins', $db->fetchRow($db->select()->from('table.users')))) { $db->query('ALTER TABLE `' . $prefix . 'users` ADD `coins` varchar(1000) NOT NULL DEFAULT 0;'); } if (!array_key_exists('submission', $db->fetchRow($db->select()->from('table.users')))) { $db->query('ALTER TABLE `' . $prefix . 'users` ADD `submission` varchar(1000) NOT NULL DEFAULT true;'); } if (!array_key_exists('signature', $db->fetchRow($db->select()->from('table.users')))) { $db->query('ALTER TABLE `' . $prefix . 'users` ADD `signature` varchar(1000) NOT NULL DEFAULT 0;'); } if(json_decode(json_encode($db->fetchAll($db->query("SHOW FULL COLUMNS FROM ".$table))),true)[8]['Field'] !=='checkurl'&&json_decode(json_encode($db->fetchAll($db->query("SHOW FULL COLUMNS FROM ".$table))),true)[7]['Field'] !=='checkurl'){ $db->query('ALTER TABLE ' . $table . ' ADD `checkurl` varchar(1000) NOT NULL DEFAULT 0;'); } if(json_decode(json_encode($db->fetchAll($db->query("SHOW FULL COLUMNS FROM ".$table))),true)[9]['Field'] !=='type'&&json_decode(json_encode($db->fetchAll($db->query("SHOW FULL COLUMNS FROM ".$table))),true)[8]['Field'] !=='type'){ $db->query('ALTER TABLE ' . $table . ' ADD `type` varchar(1000) NOT NULL DEFAULT 0;'); } if(json_decode(json_encode($db->fetchAll($db->query("SHOW FULL COLUMNS FROM ".$table))),true)[10]['Field'] !=='rejectreason'&&json_decode(json_encode($db->fetchAll($db->query("SHOW FULL COLUMNS FROM ".$table))),true)[9]['Field'] !=='rejectreason'){ $db->query('ALTER TABLE ' . $table . ' ADD `rejectreason` varchar(1000) NULL DEFAULT NULL;'); } } return _t('BsCore核心同步完成'); } public static function deactivate() { bsRouter::removeRouter(); Helper::removePanel(0, self::$_panel); Helper::removeAction('upload'); return _t('BsCore核心清除完成'); } public static function initevent() { if (!class_exists('bsOptions')){ require_once \Utils\Helper::options()->pluginDir('BsCore').'/bsOptions.php'; } } public static function send_request($url, $postdata,$sendtype,$header = 'Content-type: application/x-www-form-urlencoded') { if($postdata){ if(is_array($postdata)){ $data = http_build_query($postdata); } else{ $data = $postdata; } $options = array( 'http' => array( 'method' => $sendtype, 'header' => $header, 'content' => $data, 'timeout' => 5 ) ); } else{ $options = array( 'http' => array( 'method' => $sendtype, 'header' => "Content-type: application/x-www-form-urlencoded", 'timeout' => 5 ) ); } $context = stream_context_create($options); $result = file_get_contents($url, false, $context); if($http_response_header[0] !== 'HTTP/1.1 200 OK'){ $result = array( "result" => "success", "reason" => "request fail" ); return json_encode($result); }else{ return $result; } } public static function enqueue_style($header=null, $old=null) { \Typecho\Widget::widget('Widget_User')->to($user); if(\Typecho\Cookie::get('__typecho_notice_highlight') && \Typecho\Cookie::get('__typecho_notice_highlight') == 'plugin-BsCore'){ \Typecho\Cookie::delete('__typecho_notice_type'); \Typecho\Cookie::delete('__typecho_notice'); } $options = get_option('bearsimple'); if($user->hasLogin() && !$user->pass('administrator', true) && $options['UserCenterRedirect'] == true){ header('Location: '.Helper::options()->siteUrl.'/index.php/usercenter', true, 302); } if ($old!=null) $header = $old; return CSF::get_enqueue_style($header); } public static function enqueue_script($footer=null) { return CSF::get_enqueue_script($footer); } public static function config(Form $form) { } public static function personalConfig(Form $form) { } public static function configHandle($origin_config, $is_init) { return true; } public static function siteMaintenance(){ $options = bsOptions::getInstance()::get_option('bearsimple'); \Typecho\Widget::widget('Widget_User')->to($user); if($options['siteMaintenance_Open'] == true && (!$user->hasLogin() && !$user->pass('administrator', true))){ if(!$options['siteMaintenance_templates']){ $tem = 'default.html'; } else{ $tem = $options['siteMaintenance_templates']; } $content = file_get_contents(str_replace("/plugins","",dirname(__DIR__)).'/themes/bearsimple/modules/siteMaintenance/'.$tem); echo $content; exit; } } public static function bCore_parseMultilineData($str, $columnCount) { $result = array(); if (!empty($str)) { $data = explode("\n", $str); foreach ($data as $item) { $item = trim($item); if (!empty($item)) { $itemData = explode('|', $item, $columnCount); if (count($itemData) == $columnCount) { foreach ($itemData as $k => $v) { $itemData[$k] = trim($v); } $result[] = $itemData; } } } } return $result; } public static function bCore_seacharr_by_value($array, $index, $value){ if(is_array($array) && count($array)>0) { foreach(array_keys($array) as $key){ $temp[$key] = $array[$key][$index]; if ($temp[$key] == $value){ $newarray[$key] = $array[$key]; } } } return $newarray; } public static function bCore_getDiyLinkToArray($data){ $res = array(); foreach($data as $k=>$v){ $res[]= array( 'url' => $v[1], 'key'=>$v[0] ); } return $res; } //获取自定义内链 public static function bCore_getDiyLink($key){ $options = bsOptions::getInstance()::get_option('bearsimple'); $data = self::bCore_parseMultilineData($options['goLinkList'],2); $result = self::bCore_seacharr_by_value(self::bCore_getDiyLinkToArray($data),'key',$key); $res = array(); foreach($result as $k=>$v){ foreach ($v as $key=>$value) { $res[$key] = $value; } } return $res; } public static function markdownparse($text) { $parser = new \HyperDown\Parser(); return $parser->makeHtml($text); } public static function bregister($v) { $hasher = new PasswordHash(8, true); if(\Typecho\Widget::widget('Widget_Register')->request->password !== ''){ $generatedPassword = \Typecho\Widget::widget('Widget_Register')->request->password; }else{ $generatedPassword = \Typecho\Common::randString(7); } define('getpassd', (string)$generatedPassword); $wPassword = $hasher->HashPassword((string)$generatedPassword); $v['password']=$wPassword; if(\Typecho\Widget::widget('Widget_Register')->request->regtype == 'nobackend'){ $v['group']='contributor'; $v['submission']=1; } else{ $v['submission']=0; } return $v; } public static function bregister_finish($obj) { $wPassword=getpassd; \Typecho\Widget::widget('Widget_User')->to($user); $user->login($obj->request->name,$wPassword); \Typecho\Cookie::delete('__typecho_first_run'); \Typecho\Cookie::delete('__typecho_remember_name'); \Typecho\Cookie::delete('__typecho_remember_mail'); $obj->widget('Widget_Notice')->set(_t('用户 %s 已经成功注册, 密码为 %s', $obj->screenName, $wPassword), 'success'); if (NULL != $obj->request->referer) { $obj->response->redirect($obj->request->referer); }else if(NULL != $obj->request->tz){ if (Helper::options()->rewrite==0){$authorurl=Helper::options()->rootUrl.'/index.php/usercenter/';}else{$authorurl=Helper::options()->rootUrl.'/usercenter/';} $obj->response->redirect($authorurl.$obj->user->uid); }else{ $obj->response->redirect(Helper::options()->adminUrl); } } //外链转内链 public static function replace($text, $widget, $lastResult) { $text = empty($lastResult) ? $text : $lastResult; $options = get_option('bearsimple'); $target = ''; if($options['Pjax'] == 1){ $target .= ' pjax="no"'; } if($options['goLinkNewWindow'] == 1){ $target .= ' target="_blank"'; } $fields = unserialize($widget->fields); // 文章内容和评论内容处理 @preg_match_all('//', $text, $matches); if ($matches) { foreach ($matches[2] as $link) { $link = str_replace('mailto:','',$link); if (!filter_var($link, FILTER_VALIDATE_EMAIL)) { $text = str_replace("href=\"$link\"", "href=\"" . self::convertLinks($link) . "\"" . $target, $text); } } } return $text; } public static function urlSafeB64Encodes($str) { $data = base64_encode($str); return str_replace(array('+', '/', '='), array('-', '_', ''), $data); } public static function urlSafeB64Decodes($str) { $data = str_replace(array('-', '_'), array('+', '/'), $str); $mod = strlen($data) % 4; if ($mod) { $data .= substr('====', $mod); } return base64_decode($data); } public static function textareaToArrs($textarea) { $str = str_replace(array("\r\n", "\r", "\n"), "|", $textarea); if ($str == "") { return null; } return explode("|", $str); } public static function checkDomains($url, $arr) { if ($arr === null) { return false; } if (count($arr) === 0) { return false; } foreach ($arr as $a) { if (strpos($url, $a) !== false) { return true; } } return false; } public static function convertLinks($link, $check = true) { $options = get_option('bearsimple'); $linkBase = ltrim(rtrim(\Typecho\Router::get('go')['url'], '/'), '/'); // 防止链接形式修改后不能用 $siteUrl = Helper::options()->siteUrl; $nonConvertList = self::textareaToArrs($options['goLinkNonConvertList']); // 不转换列表 if ($check) { if (strpos($link, '://') !== false && strpos($link, rtrim($siteUrl, '/')) !== false) { return $link; } // 本站链接不处理 不转换列表中的不处理 if (self::checkDomains($link, $nonConvertList)) { return $link; } // 图片不处理 if (preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff)/i', $link)) { return $link; } } return \Typecho\Common::url(str_replace('[key]', self::urlSafeB64Encodes(htmlspecialchars_decode($link)), $linkBase), Helper::options()->index); } //取出所有加密分类mid并剔除重复值 public static function getCols($arr, $col) { $ret = array(); foreach ($arr as $row) { if (isset($row[$col])) { $ret[] = $row[$col]; } } return array_unique($ret); } //加密的分类排列 public static function EncryptCategory(){ $options = get_option('bearsimple'); $data = $options['Cate_Encrypt']; $res = self::getCols($data, 'Cate_Encrypt_Id'); return $res; } public static function CateFilter($thisx, $select) { \Typecho\Widget::widget('Widget_User')->to($user); $mid = self::EncryptCategory(); $db = \Typecho\Db::get(); if(empty($mid) || $user->hasLogin()) return $select; $encryptedMids = array_map('intval', (array)$mid); $encryptedMids = array_filter(array_unique($encryptedMids)); if(empty($encryptedMids)) return $select; $midList = implode(',', $encryptedMids); $prefix = $db->getPrefix(); $select = $select->join( $prefix.'relationships AS filter_rel', // 指定别名 "filter_rel.cid = {$prefix}contents.cid AND filter_rel.mid IN ($midList)", 'LEFT' ); $select->where('filter_rel.cid IS NULL'); return $select; } // 置顶 public static function sticky($archive, $select) { $config = get_option('bearsimple'); if(!empty($config['Sticky_cids'])&&!empty($config['Sticky_cids_pages'])){ $sticky_cids = array_merge($config['Sticky_cids'],$config['Sticky_cids_pages']); } if(!empty($config['Sticky_cids'])&&empty($config['Sticky_cids_pages'])){ $sticky_cids = $config['Sticky_cids']; } if(empty($config['Sticky_cids'])&&!empty($config['Sticky_cids_pages'])){ $sticky_cids = $config['Sticky_cids_pages']; } if (!$sticky_cids) return; $pagesize = Helper::options()->pageSize; $db = \Typecho\Db::get(); $paded = $archive->request->get('page', 1); $sticky_html = $config['Sticky_Mod'] ? $config['Sticky_Mod'] : "[置顶] "; foreach($sticky_cids as $cid) { if ($cid && $sticky_post = $db->fetchRow($archive->select()->where('cid = ?', $cid))) { if ($paded == 1) { $sticky_post['title'] = $sticky_post['title']; $sticky_post['sticky'] = $sticky_html; $archive->push($sticky_post); //$pagesize = $pagesize - 1; } $select->where('table.contents.cid != ?', $cid); if ($pagesize > 0) { $archive->parameter->pageSize = $pagesize; } } } } public static function stickyC($archive, $select) { $config = get_option('bearsimple'); $sticky_cid = $config['Sticky_cids_category']; if (!$sticky_cid) return; $pagesize = Helper::options()->pageSize; $db = \Typecho\Db::get(); $paded = $archive->request->get('page', 1); $sticky_html = $config['Sticky_Mod'] ? $config['Sticky_Mod'] : "[置顶] "; foreach($sticky_cid as $cid) { $sticky_post = $db->fetchRow($archive->select()->where('cid = ?', $cid)); if ($config['Sticky_Category']) { $archive->widget('Widget_Archive@'.$cid, 'pageSize=1&type=post', 'cid='.$cid)->to($slug); $pattern = preg_match("/".$slug->category."/i", $_SERVER['PHP_SELF']); }else { $pattern = true; } if ($cid && $sticky_post && $pattern) { if ($paded == 1) { $sticky_post['title'] = $sticky_post['title']; $sticky_post['sticky'] = $sticky_html; $archive->push($sticky_post); //$pagesize = $pagesize - 1; } $select->where('table.contents.cid != ?', $cid); if ($pagesize > 0) { $archive->parameter->pageSize = $pagesize; } } } } public function setField(string $name, string $type, string $value, int $cid) { $db = \Typecho\Db::get(); if ( empty($name) || !in_array($type, ['str', 'int', 'float']) ) { return false; } $exist = $db->fetchRow($db->select('cid')->from('table.fields') ->where('cid = ? AND name = ?', $cid, $name)); if (empty($exist)) { return $db->query($db->insert('table.fields') ->rows([ 'cid' => $cid, 'name' => $name, 'type' => $type, 'str_value' => 'str' == $type ? $value : null, 'int_value' => 'int' == $type ? intval($value) : 0, 'float_value' => 'float' == $type ? floatval($value) : 0 ])); } else { return $db->query($db->update('table.fields') ->rows([ 'type' => $type, 'str_value' => 'str' == $type ? $value : null, 'int_value' => 'int' == $type ? intval($value) : 0, 'float_value' => 'float' == $type ? floatval($value) : 0 ]) ->where('cid = ? AND name = ?', $cid, $name)); } } public static function C() { self::initEnv(); $op = Helper::options(); $scheme = parse_url($op->siteUrl)['scheme']; $host = parse_url($op->siteUrl)['host']; $ip = gethostbyname($_SERVER['HTTP_HOST']); if (self::$plugin_config->enable_gcache == '0') return ; if (self::$plugin_config->Cache_choose == '0') return; if (!self::preCheck()) return; if (!self::initPath()) return; try { $data = self::getCache(); if (!empty($data)) { if ($data['time'] + self::$plugin_config->expire < time()) self::$passed = false; //处理可能存在开启缓存后域名被替换为IP地址的问题 $html = $data['html']; $html = str_replace('https://'.$ip,$op->siteUrl,$html); $html = str_replace('http://'.$ip,$op->siteUrl,$html); $html = str_replace('http//','',$html); $html = str_replace('https//','',$html); $html = str_replace(':443/','',$html); $html = str_replace('http://'.$host.'/',$op->siteUrl,$html); $html = str_replace('https://'.$host.'/',$op->siteUrl,$html); $html = str_replace($op->siteUrl.'/',$op->siteUrl,$html); $html = str_replace($_SERVER['SERVER_ADDR'],$_SERVER['SERVER_NAME'],$html); header('BsCache: HIT'); echo $html; die; } } catch (Exception $e) { echo $e->getMessage(); } ob_flush(); } public static function S($html = '') { if (self::$plugin_config->Cache_choose == '0') return; if (is_null(self::$path) || !self::$passed) return; if (empty($html)) $html = ob_get_contents(); $data = array(); $data['time'] = time(); $data['html'] = $html; self::setCache($data); } public static function getCache($name = null) { if ($name) return unserialize(self::$cache->get($name)); return unserialize(self::$cache->get(self::$path)); } public static function setCache($data, $name = null) { if ($name) return self::$cache->set($name, serialize($data)); return self::$cache->set(self::$path, serialize($data)); } public static function delCache($path, $rmHome = True) { self::$cache->delete($path); if ($rmHome) self::$cache->delete('/'); } public static function preCheck($checkPost = True) { if ($checkPost && self::$request->isPost()) return false; if (self::$plugin_config->login && \Typecho\Widget::widget('Widget_User')->hasLogin()) return false; if (self::$plugin_config->Cache_choose == '0') return false; self::$passed = true; return true; } public static function initEnv() { if (!class_exists('bsOptions')){ require_once \Utils\Helper::options()->pluginDir('BsCore').'/bsOptions.php'; } if (is_null(self::$sys_config)) self::$sys_config = bsOptions::getInstance(); if (is_null(self::$plugin_config)) self::$plugin_config = (Object)self::$sys_config::get_option('bearsimple'); if (is_null(self::$request)) self::$request = new \Typecho\Request(); } public static function initPath($pathInfo='') { if(empty($pathInfo)) $pathInfo = self::$request->getPathInfo(); if (!self::needCache($pathInfo)){ return false; } self::$path = $pathInfo; return self::initBackend(self::$plugin_config->Cache_choose); } public static function initBackend($backend){ if ($backend == '0') return false; $options = get_option('bearsimple'); $class_name = "typecho_".$options['Cache_choose']; require_once 'modules/cache/cache.interface.php'; require_once "modules/cache/$class_name.class.php"; self::$cache = call_user_func(array($class_name, 'getInstance'), self::$plugin_config); if (is_null(self::$cache)) return false; return true; } public static function needCache($path) { $pattern = '#^' . __TYPECHO_ADMIN_DIR__ . '#i'; if (preg_match($pattern, $path)) return false; $pattern = '#^/action#i'; if (preg_match($pattern, $path)) return false; $requestUrl = self::$request->getRequestUri(); $pattern = '/.*?s=.*/i'; if (preg_match($pattern, $requestUrl)) return false; $pattern = '#^/search#i'; if (preg_match($pattern, $path) and in_array('search', self::$plugin_config->cache_page)) return true; $_routable = Helper::options()->routingTable; $post_regx = $_routable[0]['post']['regx']; if (array_key_exists('TePass', \Typecho\Plugin::export()['activated'])){ if (preg_match($post_regx,$path,$arr)){ if ($arr[1] and !empty($arr[1])){ $db = \Typecho\Db::get(); try { $database = $db->getConfig($db::READ)['database']; $tepass_exist = $db->fetchRow($db->select()->from('information_schema.TABLES')->where('TABLE_NAME = ?',$db->getPrefix().'tepass_posts')->where('TABLE_SCHEMA = ?',$database)); if (isset($tepass_exist) and count($tepass_exist) > 0){ $p_id = $db->fetchObject($db->select('id')->from('table.tepass_posts')->where('post_id = ?',$arr[1]))->id; if ($p_id) return false; } }catch (Typecho_Db_Query_Exception $e){ } } } } foreach ($_routable as $page => $route) { if ($route[0]['widget'] != '\Widget\Archive' and $route[0]['widget'] != 'Widget_Archive') continue; $regx = Router::get($page); if (preg_match($regx['regx'], $path)) { $exclude = array('_year', '_month', '_day', '_page'); $page = str_replace($exclude, '', $page); if (in_array($page, get_option('bearsimple')['cache_page'])) return true; } } return false; } public static function post_update($contents, $class) { if ('publish' != $contents['visibility'] || $contents['created'] > time()) return; self::initEnv(); if (self::$plugin_config->Cache_choose == '0') return; self::$passed = true; $type = $contents['type']; $routeExists = (NULL != \Typecho\Router::get($type)); if (!$routeExists) { self::initPath('#'); self::delCache(self::$path); return; } $db = \Typecho\Db::get(); $contents['cid'] = $class->cid; $contents['categories'] = $db->fetchAll($db->select()->from('table.metas') ->join('table.relationships', 'table.relationships.mid = table.metas.mid') ->where('table.relationships.cid = ?', $contents['cid']) ->where('table.metas.type = ?', 'category') ->order('table.metas.order', \Typecho\Db::SORT_ASC)); $contents['category'] = urlencode(current(\Typecho\Common::arrayFlatten($contents['categories'], 'slug'))); $contents['slug'] = urlencode(empty($contents['slug'])?$class->slug:$contents['slug']); $contents['date'] = new \Typecho\Date($contents['created']); $contents['year'] = $contents['date']->year; $contents['month'] = $contents['date']->month; $contents['day'] = $contents['date']->day; if (!self::initPath(\Typecho\Router::url($type, $contents))){ return; } self::delCache(self::$path); if ($class->cid) self::delCache(self::getPostMarkCacheName($class->cid)); } public static function post_del_update($cid, $obj) { if (self::$plugin_config->Cache_choose == '0') return; $db = \Typecho\Db::get(); $postObject = $db->fetchRow($db->select() ->from('table.contents')->where('cid = ?', $cid)); if (!$postObject['cid']){ return; } $val = \Typecho\Widget::widget('Widget_Abstract_Contents')->push($postObject); $url = str_replace(Helper::options()->siteUrl, "", $val['permalink']); $cacheUrl = str_replace('index.php', "", $url); self::initEnv(); self::initBackend(self::$plugin_config->Cache_choose); self::delCache($cacheUrl); if ($cid){ self::delCache($cacheUrl.'_'.$cid.'_markdown'); } } public static function comment_update($comment) { if (self::$plugin_config->Cache_choose == '0') return; self::initEnv(); if (!self::preCheck(false)) return; if (!self::initBackend(self::$plugin_config->Cache_choose)) return; $path_info = self::$request->getPathInfo(); $article_url = preg_replace('/\/comment$/i','',$path_info); self::delCache($article_url); if ($comment->cid) self::delCache(self::getPostMarkCacheName($comment->cid)); } public static function comment_update2($comment, $edit) { if (self::$plugin_config->Cache_choose == '0') return; self::initEnv(); self::preCheck(false); self::initBackend(self::$plugin_config->Cache_choose); $perm = stripslashes($edit->parentContent['permalink']); $perm = preg_replace('/(https?):\/\//', '', $perm); $perm = preg_replace('/'.$_SERVER['HTTP_HOST'].'/', '', $perm); self::delCache($perm); if ($edit->cid) self::delCache(self::getPostMarkCacheName($edit->cid)); if ($comment->cid) self::delCache(self::getPostMarkCacheName($comment->cid)); } public static function getPostMarkCacheName($cid){ if (!self::$path) self::$path = self::$request->getPathInfo(); return self::$path.'_'.$cid.'_markdown'; } public static function cache_contentEx($content, $obj, $lastResult){ if (self::$plugin_config->Cache_choose == '0') return $content; $content = empty( $lastResult ) ? $content : $lastResult; if (self::$plugin_config->enable_markcache == '0'){ return $content; } if (substr_count($content,'')) return $content; self::initEnv(); self::$path = self::$request->getPathInfo(); $cacheName = self::getPostMarkCacheName($obj->cid); self::initEnv(); if (!self::preCheck(false)) { return $content; } if (!self::initBackend(self::$plugin_config->Cache_choose)){ return $content; } try { $data = self::getCache($cacheName); if (!empty($data)) { if ($data['time'] + self::$plugin_config->expire < time()) self::$passed = false; return $data['html']; } } catch (Exception $e) { return $content; } if (is_null(self::$path) || !self::$passed) return $content; $data = array(); $data['time'] = time(); $data['html'] = $content; self::setCache($data,$cacheName); return $content; } public static function BsCache_setCache($cacheKey,$val){ self::initEnv(); if (!self::preCheck(false)) { return false; } if (!self::initBackend(self::$plugin_config->Cache_choose)){ return false; } $data = array(); $data['time'] = time(); $data['html'] = $val; self::setCache($data,$cacheKey); return true; } public static function BsCache_getCache($cacheKey){ self::initEnv(); if (!self::preCheck(false)) { return false; } if (!self::initBackend(self::$plugin_config->Cache_choose)){ return false; } try{ $data = self::getCache($cacheKey); if (!empty($data)) { if ($data['time'] + self::$plugin_config->expire < time()) self::$passed = false; return $data['html']; } } catch (Exception $e) { echo $e->getMessage(); return false; } return false; } public static function btbutton(){ $options = Helper::options(); $dir = $options->pluginUrl.'/BsCore/assets/vendors/'; if(get_option('bearsimple')['Editors'] == '2'){ if (strpos( $_SERVER['REQUEST_URI'],'write-post.php') !== false) { $url = 'post'; \Typecho\Widget::widget('Widget_Contents_Post_Edit')->to($post); } if (strpos( $_SERVER['REQUEST_URI'],'write-page.php') !== false) { $url = 'page'; \Typecho\Widget::widget('Widget_Contents_Page_Edit')->to($page); } if (isset($post) || isset($page)) { $cid = isset($post) ? $post->cid : $page->cid; if ($cid) { \Typecho\Widget::widget('Widget_Contents_Attachment_Related', 'parentId=' . $cid)->to($attachment); } else { \Typecho\Widget::widget('Widget_Contents_Attachment_Unattached')->to($attachment); } } ?> pluginUrl.'/BsCore/assets/vendors/'; $cssUrl = $dir.'easymde/easymde.min.css'; $jsUrl = $dir.'easymde/easymde.min.js'; if (strpos( $_SERVER['REQUEST_URI'],'write-post.php') !== false) { $url = 'post'; \Typecho\Widget::widget('Widget_Contents_Post_Edit')->to($post); } if (strpos( $_SERVER['REQUEST_URI'],'write-page.php') !== false) { $url = 'page'; \Typecho\Widget::widget('Widget_Contents_Page_Edit')->to($page); } if (isset($post) || isset($page)) { $cid = isset($post) ? $post->cid : $page->cid; if ($cid) { \Typecho\Widget::widget('Widget_Contents_Attachment_Related', 'parentId=' . $cid)->to($attachment); } else { \Typecho\Widget::widget('Widget_Contents_Attachment_Unattached')->to($attachment); } } ?> gmtTime); } $filePath = self::getUploadDir() . $date->year . '/' . $date->month; if (!isset($file['tmp_name'])) { return false; } //创建上传目录 if (!is_dir($filePath)) { if (!self::getTypechoMethod("makeUploadDir", $filePath)) { return false; } } $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext; $path = $filePath . '/' . $fileName; if (isset($file['tmp_name'])) { $content = file_get_contents($file['tmp_name']); } else if (isset($file['bytes'])) { $content = $file['bytes']; } else { return false; } //判断是否开启tinypng if($boptions['Tinypng_open'] == true){ $isimage = in_array($ext, array("jpg", "png", "jpeg")); if ($isimage) { $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']); \Tinify\setKey($apikey); $source = \Tinify\fromFile($file['tmp_name']); } if (!$isimage) { if (isset($file['tmp_name'])) { if (!@move_uploaded_file($file['tmp_name'], $path)) { return false; } } else if (isset($file['bytes'])) { if (!file_put_contents($path, $file['bytes'])) { return false; } } else { return false; } } if ($isimage) { $source->toFile($path); $file['size'] = filesize($path); } else if (!isset($file['size'])) { $file['size'] = filesize($path); } $file['tmp_name'] = $path; } $uploadfile = self::getUploadFile($file); /* 上传到COS */ #初始化COS $cosClient = self::CosInit(); try { #判断是否存在重名文件,重名则重新生成 $times = 10; while ($times > 0 && self::doesObjectExist($path)) { $fileName = sprintf('%u', crc32(uniqid($times--))) . '.' . $ext; $path = $fileDir . '/' . $fileName; } $cosClient->upload( $bucket = $boptions['bucket_name'], $key = $path, $body = fopen($uploadfile, 'rb'), $options = array( "ACL" => 'public-read', 'CacheControl' => 'private' ) ); } catch (Exception $e) { echo "$e\n"; return false; } if (!isset($file['size'])) { $fileInfo = $cosClient->headObject(array('Bucket' => $boptions['bucket_name'], 'Key' => $path))->toArray(); $file['size'] = $fileInfo['ContentLength']; } if ($boptions['bucket_localsave'] == true && self::makeUploadDir($filePath)) { #本地存储一份 @move_uploaded_file($uploadfile, $path); } #返回相对存储路径 return array( 'name' => $file['name'], 'path' => $path, 'size' => $file['size'], 'type' => $ext, 'mime' => @\Typecho\Common::mimeContentType($path) ); } /** * @description: 修改文件处理函数 * @param {array} $content 旧文件 * @param {array} $file 新文件 * @return {*} */ public static function modifyHandle(array $content, array $file) { if (empty($file['name'])) { return false; } if ($opts['bucket_other'] !== '') { $bucket_other = $opts['bucket_other']; } #获取扩展名 $ext = self::getSafeName($file['name']); #判定是否是允许的文件类型 if ($content['attachment']->type != $ext || \Typecho\Common::isAppEngine()) { return false; } #获取设置参数 $opt = get_option('bearsimple'); #获取文件路径 $path = $content['attachment']->path; #获得上传文件 $uploadfile = self::getUploadFile($file); #如果没有临时文件,则退出 if (!isset($uploadfile)) { return false; } /* 上传到COS */ $cosClient = self::CosInit(); try { $cosClient->upload( $bucket = $opt['bucket'], $key = $path, $body = fopen($uploadfile, 'rb'), $options = array( "ACL" => 'public-read', 'CacheControl' => 'private' ) ); } catch (Exception $e) { echo "$e\n"; return false; } if (!isset($file['size'])) { $fileInfo = $cosClient->headObject(array('Bucket' => $opt['bucket_name'], 'Key' => $path))->toArray(); $file['size'] = $fileInfo['ContentLength']; } if ($opt['bucket_localsave'] == true) { #本地存储一份 @move_uploaded_file($uploadfile, $path); } #返回相对存储路径 return array( 'name' => $content['attachment']->name, 'path' => $content['attachment']->path, 'size' => $file['size'], 'type' => $content['attachment']->type, 'mime' => $content['attachment']->mime ); } /** * @description: 删除文件 * @param {array} $content * @return {*} */ public static function deleteHandle(array $content) { #获取设置参数 $opt = get_option('bearsimple'); #删除本地文件 if ($opt['bucket_localsave'] == true && $opt['bucket_localdelete']== true) { @unlink($content['attachment']->path); } # 开启同步删除COS文件则执行 if ($opt['bucket_sync']==true) { #初始化COS $cosClient = self::CosInit(); try { $result = $cosClient->deleteObject(array( #bucket的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式 'Bucket' => $opt['bucket_name'], 'Key' => $content['attachment']->path )); } catch (Exception $e) { echo "$e\n"; return false; } } return true; } /** * @description: 获取对象访问Url * @param {array} $content * @return {*} */ public static function attachmentHandle(array $content) { $options = get_option('bearsimple'); if (preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) { $diy_style = $options['bucket_other']; } return \Typecho\Common::url($content['attachment']->path, self::tx_getDomain()).$diy_style; } /** * @description: 获取对象访问Url * @param array $content * @return {*} */ public static function attachmentDataHandle(array $content) { return file_get_contents(self::attachmentHandle($content)); } /** * @description: 更新正文中的对象网址钩子 * @return {*} */ public static function Widget_Archive_beforeRender() { ob_start(); $html = ob_get_contents(); ob_clean(); echo self::beforeRender($html); ob_end_flush(); } /** * @description: 更新正文中的对象网址(获得新的sign) * @param string $text 页面html * @return string */ public static function beforeRender($text) { $opt = get_option('bearsimple'); $cosClient = self::CosInit(); if ($opt['bucket_sign'] == 1) { return preg_replace_callback( '/https?:\/\/[-A-Za-z0-9+&@#\/\%?=~_|!:,.;]+[-A-Za-z0-9+&@#\/\%=~_|]/i', function ($matches) use ($opt, $cosClient) { $url = $matches[0]; if (strpos($url, self::getDomain()) !== false) { $expTime = explode('q-key-time%3D', $url); if (sizeof($expTime) > 1) { @$expTime = explode('%26q', $expTime[1])[0]; @$expTime = explode('%3B', $expTime)[1]; #未过期,不更新 if ($expTime > time()) { return $url; } } $path = str_replace(self::getDomain(), '', $url); $url = $cosClient->getObjectUrl($opt['bucket_name'], explode('?', $path)[0], '+10 minutes'); } return $url; }, $text ); } return $text; } /** * @description: COS初始化 * @param object $options 设置信息 * @return {*} */ public static function CosInit($options = '') { try { if (!$options) { $options = get_option('bearsimple'); } } catch (Exception $e) { } require_once 'phar://' . __DIR__ . '/modules/tencent_cos/phar/cos-sdk-v5-7.phar/vendor/autoload.php'; if(empty($options['bucket_secret_id'])||empty($options['bucket_secret_key'])){ return new \Qcloud\Cos\Client(array( 'region' => 'ap-beijing', 'schema' => 'https', #协议头部,默认为http 'credentials' => array( 'secretId' => 'fix', 'secretKey' => 'fix' ) )); } else{ return new \Qcloud\Cos\Client(array( 'region' => $options['bucket_region'], 'schema' => 'https', #协议头部,默认为http 'credentials' => array( 'secretId' => $options['bucket_secret_id'], 'secretKey' => $options['bucket_secret_key'] ) )); } } /** * @description: 判断存储桶是否存在 * @param {*} $opt * @return {*} */ public static function doesBucketExist($opt) { #初始化COS $cosClient = self::CosInit($opt); try { $result = $cosClient->doesBucketExist( $opt['bucket_name'] ); if (!$result) { return false; } } catch (Exception $e) { return false; } return true; } /** * @description: 判断对象是否已存在 * @param {*} $key * @return {*} */ public static function doesObjectExist($key) { #获取设置参数 $opt = get_option('bearsimple'); #初始化COS $cosClient = self::CosInit(); try { $result = $cosClient->doesObjectExist( $opt['bucket_name'], $key ); if ($result) { return true; } } catch (Exception $e) { return true; } return false; } //阿里处理方法 /** * 上传文件处理函数 * * @access public * @param array $file 上传的文件 * @return mixed */ public static function ali_uploadHandle($file) { $options = get_option('bearsimple'); $opt = Helper::options(); //文件名是否空 if (empty($file['name'])) { return false; } //文件名安全性检测 $ext = self::getSafeName($file['name']); if (!self::getTypechoMethod("checkFileType", $ext) || \Typecho\Common::isAppEngine()) { return false; } //判断格式 $ext = strtolower($ext); if (empty($date)) { $date = new \Typecho\Date($opt->gmtTime); } $filePath = self::ali_getUploadDir() . $date->year . '/' . $date->month; if (!isset($file['tmp_name'])) { return false; } //创建上传目录 if (!is_dir($filePath)) { if (!self::getTypechoMethod("makeUploadDir", $filePath)) { return false; } } $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext; $path = $filePath . '/' . $fileName; if (isset($file['tmp_name'])) { $content = file_get_contents($file['tmp_name']); } else if (isset($file['bytes'])) { $content = $file['bytes']; } else { return false; } //判断是否开启tinypng if($options['Tinypng_open'] == true){ $isimage = in_array($ext, array("jpg", "png", "jpeg")); if ($isimage) { $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']); \Tinify\setKey($apikey); $source = \Tinify\fromFile($file['tmp_name']); } if (!$isimage) { if (isset($file['tmp_name'])) { if (!@move_uploaded_file($file['tmp_name'], $path)) { return false; } } else if (isset($file['bytes'])) { if (!file_put_contents($path, $file['bytes'])) { return false; } } else { return false; } } if ($isimage) { $source->toFile($path); $file['size'] = filesize($path); } else if (!isset($file['size'])) { $file['size'] = filesize($path); } $file['tmp_name'] = $path; } $uploadfile = self::getUploadFile($file); if (!isset($uploadfile)) { return false; } $oss_client = self::ossInit(); try { $oss_client->doesBucketExist($options['ali_bucket_name']); } catch (Exception $e) { return false; } try { $oss_client->putObject($options['ali_bucket_name'], $path, $content); } catch (Exception $e) { return false; } if ($options['ali_bucket_localsave'] == true && self::makeUploadDir($filePath)) { #本地存储一份 @move_uploaded_file($uploadfile, $path); } else{ @unlink($path); } return array( 'name' => $file['name'], 'path' => $path, 'size' => $file['size'], 'type' => $ext, 'mime' => @\Typecho\Common::mimeContentType($path) ); } /** * 修改文件处理函数 * * @access public * @param array $content 老文件 * @param array $file 新上传的文件 * @return mixed */ public static function ali_modifyHandle($content, $file) { $options = get_option('bearsimple'); if (isset($file['tmp_name'])) { $contents = file_get_contents($file['tmp_name']); } else if (isset($file['bytes'])) { $contents = $file['bytes']; } else { return false; } if (empty($file['name'])) { return false; } $ext = self::getSafeName($file['name']); if (!\Widget\Upload::checkFileType($ext) || \Typecho\Common::isAppEngine()) { return false; } $uploadfile = self::getUploadFile($file); if (!isset($uploadfile)) { return false; } $oss_client = self::ossInit(); try{ $ali_response = $oss_client->putObject($options['ali_bucket_name'], $content['attachment']->path, $contents); } catch(OssException $e) { return false; } if ($options['ali_bucket_localsave'] == true) { #本地存储一份 @move_uploaded_file($uploadfile, $content['attachment']->path); } return array( 'name' => $content['attachment']->name, 'path' => $content['attachment']->path, 'size' => intval($ali_response['oss-requestheaders']['Content-Length']), 'type' => $ext, 'mime' => $ali_response['oss-requestheaders']['Content-Type'] ); } /** * 删除文件 * * @access public * @param array $content 文件相关信息 * @return string */ public static function ali_deleteHandle(array $content) { $options = get_option('bearsimple'); $oss_client = self::ossInit(); #删除本地文件 if ($options['ali_bucket_localsave'] == true && $options['ali_bucket_localdelete']== true) { @unlink($content['attachment']->path); } if ($options['ali_bucket_sync']==true) { try { $oss_client->deleteObject($options['bd_bucket_name'],$content['attachment']->path); return true; } catch (Exception $e) { return false; } } return true; } /** * 获取实际文件绝对访问路径 * * @access public * @param array $content 文件相关信息 * @return string */ public static function ali_attachmentHandle(array $content) { $options = get_option('bearsimple'); if (preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) { $diy_style = $options['ali_bucket_other']; } return \Typecho\Common::url($content['attachment']->path, self::ali_getDomain()).$diy_style; } /** * 获取实际文件数据 * * @access public * @param array $content * @return string */ public static function ali_attachmentDataHandle(array $content) { return file_get_contents(self::ali_attachmentHandle($content)); } /** * @description: OSS初始化 * @param object $options 设置信息 * @return {*} */ public static function ossInit($options = '') { try { if (!$options) { $options = get_option('bearsimple'); } } catch (Exception $e) { } $end_point = 'http://' . (($options['ali_bucket_region'] === "other") ? $options['ali_bucket_other_region'] : $options['ali_bucket_region'] . $options['ali_bucket_connect_type']); if(empty($options['ali_bucket_accesskey_id'])||empty($options['ali_bucket_accesskey_secret'])){ return new OssClient('fix', 'fix', $end_point); } else{ return new OssClient($options['ali_bucket_accesskey_id'], $options['ali_bucket_accesskey_secret'], $end_point); } } //七牛云Kodo public static function qiniu_uploadHandle($file) { $options = get_option('bearsimple'); $opt = Helper::options(); //文件名是否空 if (empty($file['name'])) { return false; } //文件名安全性检测 $ext = self::getSafeName($file['name']); if (!self::getTypechoMethod("checkFileType", $ext) || \Typecho\Common::isAppEngine()) { return false; } //判断格式 $ext = strtolower($ext); if (empty($date)) { $date = new \Typecho\Date($opt->gmtTime); } $filePath = self::qiniu_getUploadDir() . $date->year . '/' . $date->month; if (!isset($file['tmp_name'])) { return false; } //创建上传目录 if (!is_dir($filePath)) { if (!self::getTypechoMethod("makeUploadDir", $filePath)) { return false; } } $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext; $path = $filePath . '/' . $fileName; if (isset($file['tmp_name'])) { $content = file_get_contents($file['tmp_name']); } else if (isset($file['bytes'])) { $content = $file['bytes']; } else { return false; } //判断是否开启tinypng if($options['Tinypng_open'] == true){ $isimage = in_array($ext, array("jpg", "png", "jpeg")); if ($isimage) { $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']); \Tinify\setKey($apikey); $source = \Tinify\fromFile($file['tmp_name']); } if (!$isimage) { if (isset($file['tmp_name'])) { if (!@move_uploaded_file($file['tmp_name'], $path)) { return false; } } else if (isset($file['bytes'])) { if (!file_put_contents($path, $file['bytes'])) { return false; } } else { return false; } } if ($isimage) { $source->toFile($path); $file['size'] = filesize($path); } else if (!isset($file['size'])) { $file['size'] = filesize($path); } $file['tmp_name'] = $path; } $uploadfile = self::getUploadFile($file); $uploadMgr = new UploadManager(); list($ret, $err) = $uploadMgr->putFile(self::qiniu_getAuthToken(), ltrim($path, "/"), $uploadfile); if ($err !== null) { return false; } if (!isset($file['size'])) { $file['size'] = filesize($uploadfile); } if ($options['qiniu_bucket_localsave'] == true && self::makeUploadDir($filePath)) { #本地存储一份 @move_uploaded_file($uploadfile, $path); } else{ @unlink($path); } return array( 'name' => $file['name'], 'path' => $path, 'size' => $file['size'], 'type' => $ext, 'mime' => @\Typecho\Common::mimeContentType($path) ); } /** * 七牛修改文件 * * @access public * @param array $content 老文件 * @param array $file 新上传的文件 * @return mixed */ public static function qiniu_modifyHandle($content, $file) { if (empty($file['name'])) { return false; } //获取扩展名 $ext = self::getSafeName($file['name']); //判定是否是允许的文件类型 if ($content['attachment']->type != $ext || \Typecho\Common::isAppEngine()) { return false; } //获取文件路径 $path = $content['attachment']->path; //获得上传文件 $uploadfile = self::getUploadFile($file); //如果没有临时文件,则退出 if (!isset($uploadfile)) { return false; } $uploadMgr = new UploadManager(); $kodo_path = ltrim($path, "/"); list($ret, $err) = $uploadMgr->putFile(self::qiniu_getAuthToken($kodo_path), $kodo_path, $uploadfile, null, 'application/octet-stream', false, $resumeFile, $version, $partSize); if ($err !== null) { return false; } if (!isset($file['size'])) { $file['size'] = filesize($uploadfile); } if ($options['qiniu_bucket_localsave'] == true) { #本地存储一份 @move_uploaded_file($uploadfile, $content['attachment']->path); } //返回相对存储路径 return array( 'name' => $content['attachment']->name, 'path' => $content['attachment']->path, 'size' => $file['size'], 'type' => $content['attachment']->type, 'mime' => $content['attachment']->mime ); } /** * 七牛删除文件 * * @access public * @param array $content 文件相关信息 * @return string */ public static function qiniu_deleteHandle(array $content) { $options = get_option('bearsimple'); $bucket = $options['qiniu_bucket_name']; #删除本地文件 if ($options['qiniu_bucket_localsave'] == true && $options['qiniu_bucket_localdelete']== true) { @unlink($content['attachment']->path); } if ($options['qiniu_bucket_sync']==true) { $bucketManager = new BucketManager(self::qiniu_getAuthToken()); $err = $bucketManager->delete($bucket, ltrim($content['attachment']->path, "/")); if ($err != null) { return false; } } return true; } /** * 七牛获取域名 * * @access public * @param array $content 文件相关信息 * @return string */ public static function qiniu_attachmentHandle(array $content) { $options = get_option('bearsimple'); if (preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) { $diy_style = $options['qiniu_bucket_other']; } return \Typecho\Common::url($content['attachment']->path, $options['qiniu_bucket_domain']).$diy_style; } /** * 七牛获取实际文件数据 * * @access public * @param array $content * @return string */ public static function qiniu_attachmentDataHandle($content) { $options = get_option('bearsimple'); $bucket = $options['qiniu_bucket_name']; $bucketManager = new BucketManager(self::qiniu_getAuthToken()); list($fileInfo, $err) = $bucketManager->stat($bucket, ltrim($content['attachment']->path, "/")); if ($err != null) { var_dump($err); return false; } return $fileInfo; } public static function qiniu_getAuth() { $options = get_option('bearsimple'); $accessKey = trim($options['qiniu_bucket_accesskey']); $secretKey = trim($options['qiniu_bucket_secretKey']); return new Auth($accessKey, $secretKey); } public static function qiniu_getAuthToken($key = null) { $options = get_option('bearsimple'); return self::qiniu_getAuth()->uploadToken($options['qiniu_bucket_name'], $key); } //又拍云 public static function upyun_uploadHandle($file) { $options = get_option('bearsimple'); $opt = Helper::options(); //文件名是否空 if (empty($file['name'])) { return false; } //文件名安全性检测 $ext = self::getSafeName($file['name']); if (!self::getTypechoMethod("checkFileType", $ext) || \Typecho\Common::isAppEngine()) { return false; } //判断格式 $ext = strtolower($ext); if (empty($date)) { $date = new \Typecho\Date($opt->gmtTime); } $filePath = self::upyun_getUploadDir() . $date->year . '/' . $date->month; if (!isset($file['tmp_name'])) { return false; } //创建上传目录 if (!is_dir($filePath)) { if (!self::getTypechoMethod("makeUploadDir", $filePath)) { return false; } } $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext; $path = $filePath . '/' . $fileName; if (isset($file['tmp_name'])) { $content = file_get_contents($file['tmp_name']); } else if (isset($file['bytes'])) { $content = $file['bytes']; } else { return false; } //判断是否开启tinypng if($options['Tinypng_open'] == true){ $isimage = in_array($ext, array("jpg", "png", "jpeg")); if ($isimage) { $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']); \Tinify\setKey($apikey); $source = \Tinify\fromFile($file['tmp_name']); } if (!$isimage) { if (isset($file['tmp_name'])) { if (!@move_uploaded_file($file['tmp_name'], $path)) { return false; } } else if (isset($file['bytes'])) { if (!file_put_contents($path, $file['bytes'])) { return false; } } else { return false; } } if ($isimage) { $source->toFile($path); $file['size'] = filesize($path); } else if (!isset($file['size'])) { $file['size'] = filesize($path); } $file['tmp_name'] = $path; } $uploadfile = self::getUploadFile($file); if (!isset($uploadfile)) { return false; } else { //上传文件 $upyun = self::upyunInit(); $fh = fopen($uploadfile, 'rb'); $upyun->write($path, $fh, TRUE); if(is_resource($fh)) { fclose($fh); } } if (!isset($file['size'])) { $fileInfo = $upyun->getFileInfo($path); $file['size'] = $fileInfo['x-upyun-file-size']; } if ($options['upyun_bucket_localsave'] == true && self::makeUploadDir($filePath)) { #本地存储一份 @move_uploaded_file($uploadfile, $path); } else{ @unlink($path); } //返回相对存储路径 return array( 'name' => $file['name'], 'path' => $path, 'size' => $file['size'], 'type' => $ext, 'mime' => @\Typecho\Common::mimeContentType($path) ); } /** * 修改文件处理函数 * * @access public * @param array $content 老文件 * @param array $file 新上传的文件 * @return mixed */ public static function upyun_modifyHandle($content, $file) { $options = get_option('bearsimple'); if (empty($file['name'])) { return false; } //获取扩展名 $ext = self::getSafeName($file['name']); if ($content['attachment']->type != $ext || \Typecho\Common::isAppEngine()) { return false; } //获取文件路径 $path = $content['attachment']->path; $uploadfile = self::getUploadFile($file); if (!isset($uploadfile)) { return false; } else { //修改文件 $upyun = self::upyunInit(); $fh = fopen($uploadfile, 'rb'); $upyun->writeFile($path, $fh, TRUE); fclose($fh); } if (!isset($file['size'])) { $fileInfo = $upyun->getFileInfo($path); $file['size'] = $fileInfo['x-upyun-file-size']; } if ($options['upyun_bucket_localsave'] == true) { #本地存储一份 @move_uploaded_file($uploadfile, $content['attachment']->path); } //返回相对存储路径 return array( 'name' => $content['attachment']->name, 'path' => $content['attachment']->path, 'size' => $file['size'], 'type' => $content['attachment']->type, 'mime' => $content['attachment']->mime ); } /** * 删除文件 * * @access public * @param array $content 文件相关信息 * @return string */ public static function upyun_deleteHandle(array $content) { $options = get_option('bearsimple'); $upyun = self::upyunInit(); $path = $content['attachment']->path; #删除本地文件 if ($options['upyun_bucket_localsave'] == true && $options['upyun_bucket_localdelete']== true) { @unlink($content['attachment']->path); } if ($options['upyun_bucket_sync']==true) { $upyun->delete($path); } return true; } /** * 获取实际文件绝对访问路径 * * @access public * @param array $content 文件相关信息 * @return string */ public static function upyun_attachmentHandle(array $content) { $options = get_option('bearsimple'); if (preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) { $diy_style = $options['upyun_bucket_other']; } return \Typecho\Common::url($content['attachment']->path, $options['upyun_bucket_domain']).$diy_style; } /** * 获取实际文件数据 * * @access public * @param array $content * @return string */ public static function upyun_attachmentDataHandle(array $content) { $upyun = self::upyunInit(); return $upyun->getFileInfo($content['attachment']->path); } public static function upyunInit() { $options = get_option('bearsimple'); return new Upyun(new Config($options['upyun_bucket_name'], $options['upyun_bucket_actionUser'], $options['upyun_bucket_actionKey'])); } //华为云OBS public static function hw_uploadHandle($file) { $options = get_option('bearsimple'); $opt = Helper::options(); if (empty($file['name'])) { return false; } //文件名安全性检测 $ext = self::getSafeName($file['name']); if (!self::getTypechoMethod("checkFileType", $ext) || \Typecho\Common::isAppEngine()) { return false; } //判断格式 $ext = strtolower($ext); if (empty($date)) { $date = new \Typecho\Date($opt->gmtTime); } $filePath = self::hw_getUploadDir() . $date->year . '/' . $date->month; if (!isset($file['tmp_name'])) { return false; } //创建上传目录 if (!is_dir($filePath)) { if (!self::getTypechoMethod("makeUploadDir", $filePath)) { return false; } } $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext; $path = $filePath . '/' . $fileName; if (isset($file['tmp_name'])) { $content = file_get_contents($file['tmp_name']); } else if (isset($file['bytes'])) { $content = $file['bytes']; } else { return false; } //判断是否开启tinypng if($options['Tinypng_open'] == true){ $isimage = in_array($ext, array("jpg", "png", "jpeg")); if ($isimage) { $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']); \Tinify\setKey($apikey); $source = \Tinify\fromFile($file['tmp_name']); } if (!$isimage) { if (isset($file['tmp_name'])) { if (!@move_uploaded_file($file['tmp_name'], $path)) { return false; } } else if (isset($file['bytes'])) { if (!file_put_contents($path, $file['bytes'])) { return false; } } else { return false; } } if ($isimage) { $source->toFile($path); $file['size'] = filesize($path); } else if (!isset($file['size'])) { $file['size'] = filesize($path); } $file['tmp_name'] = $path; } $uploadfile = self::getUploadFile($file); if (!isset($uploadfile)) { return false; } $obsClient = self::obsInit(); try { $obsClient->putObject([ 'Bucket' => $options['hw_bucket_name'], 'Key' => $path, 'SourceFile' => $uploadfile ]); } catch (Exception $e) { return false; } finally { $obsClient->close(); } if ($options['hw_bucket_localsave'] == true && self::makeUploadDir($filePath)) { #本地存储一份 @move_uploaded_file($uploadfile, $path); } else{ @unlink($path); } //返回相对存储路径 return array( 'name' => $file['name'], 'path' => $path, 'size' => $file['size'], 'type' => $ext, 'mime' => @\Typecho\Common::mimeContentType($path) ); } public static function hw_modifyHandle($content, $file) { $options = get_option('bearsimple'); if (empty($file['name'])) { return false; } $ext = self::getSafeName($file['name']); if (!\Widget\Upload::checkFileType($ext) || \Typecho\Common::isAppEngine()) { return false; } $uploadfile = self::getUploadFile($file); if (!isset($uploadfile)) { return false; } $obsClient = self::obsInit(); try { $obsClient->putObject([ 'Bucket' => $options['hw_bucket_name'], 'Key' => $content['attachment']->path, 'SourceFile' => $uploadfile ]); } catch (Exception $e) { return false; } finally { $obsClient->close(); } if ($options['hw_bucket_localsave'] == true) { #本地存储一份 @move_uploaded_file($uploadfile, $content['attachment']->path); } return array( 'name' => $content['attachment']->name, 'path' => $content['attachment']->path, 'size' => $file['size'], 'type' => $content['attachment']->type, 'mime' => $content['attachment']->mime ); } public static function hw_deleteHandle(array $content) { $options = get_option('bearsimple'); $obsClient = self::obsInit(); if ($options['hw_bucket_localsave'] == true && $options['hw_bucket_localdelete']== true) { @unlink($content['attachment']->path); } if ($options['hw_bucket_sync']==true) { try { $obsClient->deleteObject([ 'Bucket' => $options['hw_bucket_name'], 'Key' => $content['attachment']->path ]); return true; } catch (Exception $e) { return false; } finally { $obsClient->close(); } } } public static function hw_attachmentHandle(array $content) { $options = get_option('bearsimple'); if (preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) { $diy_style = $options['hw_bucket_other']; } return \Typecho\Common::url($content['attachment']->path, self::hw_getDomain()).$diy_style; } public static function hw_attachmentDataHandle(array $content) { $options = get_option('bearsimple'); return file_get_contents(\Typecho\Common::url($content['attachment']->path, self::hw_getDomain())); } private static function obsInit() { $options = get_option('bearsimple'); return new ObsClient([ 'key' => $options['hw_bucket_accesskey_id'], 'secret' => $options['hw_bucket_accesskey_secret'], 'endpoint' => $options['hw_bucket_region'].'.myhuaweicloud.com', 'socket_timeout' => 30, 'connect_timeout' => 10 ]); } public static function bd_uploadHandle($file) { $options = get_option('bearsimple'); $opt = Helper::options(); //文件名是否空 if (empty($file['name'])) { return false; } //文件名安全性检测 $ext = self::getSafeName($file['name']); if (!self::getTypechoMethod("checkFileType", $ext) || \Typecho\Common::isAppEngine()) { return false; } //判断格式 $ext = strtolower($ext); if (empty($date)) { $date = new \Typecho\Date($opt->gmtTime); } $filePath = self::bd_getUploadDir() . $date->year . '/' . $date->month; if (!isset($file['tmp_name'])) { return false; } //创建上传目录 if (!is_dir($filePath)) { if (!self::getTypechoMethod("makeUploadDir", $filePath)) { return false; } } $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext; $path = $filePath . '/' . $fileName; if (isset($file['tmp_name'])) { $content = file_get_contents($file['tmp_name']); } else if (isset($file['bytes'])) { $content = $file['bytes']; } else { return false; } //判断是否开启tinypng if($options['Tinypng_open'] == true){ $isimage = in_array($ext, array("jpg", "png", "jpeg")); if ($isimage) { $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']); \Tinify\setKey($apikey); $source = \Tinify\fromFile($file['tmp_name']); } if (!$isimage) { if (isset($file['tmp_name'])) { if (!@move_uploaded_file($file['tmp_name'], $path)) { return false; } } else if (isset($file['bytes'])) { if (!file_put_contents($path, $file['bytes'])) { return false; } } else { return false; } } if ($isimage) { $source->toFile($path); $file['size'] = filesize($path); } else if (!isset($file['size'])) { $file['size'] = filesize($path); } $file['tmp_name'] = $path; } $uploadfile = self::getUploadFile($file); if (!isset($uploadfile)) { return false; } $bosClient = self::bosInit(); try { $bosClient->doesBucketExist($options['bd_bucket_name']); } catch (Exception $e) { return false; } try { $bosClient->putObjectFromString($options['bd_bucket_name'], $path, $content, array(BosOptions::CONTENT_TYPE => $file['type'])); } catch (Exception $e) { return false; } if ($options['bd_bucket_localsave'] == true && self::makeUploadDir($filePath)) { #本地存储一份 @move_uploaded_file($uploadfile, $path); } else{ @unlink($path); } //返回相对存储路径 return array( 'name' => $file['name'], 'path' => $path, 'size' => $file['size'], 'type' => $ext, 'mime' => @\Typecho\Common::mimeContentType($path) ); } public static function bd_modifyHandle($content, $file) { $options = get_option('bearsimple'); if (isset($file['tmp_name'])) { $contents = file_get_contents($file['tmp_name']); } else if (isset($file['bytes'])) { $contents = $file['bytes']; } else { return false; } if (empty($file['name'])) { return false; } $ext = self::getSafeName($file['name']); if (!\Widget\Upload::checkFileType($ext) || \Typecho\Common::isAppEngine()) { return false; } $uploadfile = self::getUploadFile($file); if (!isset($uploadfile)) { return false; } $bosClient = self::bosInit(); try { $bosClient->putObjectFromString($options['bd_bucket_name'], $content['attachment']->path, $contents, array(BosOptions::CONTENT_TYPE => $file['type'])); } catch (Exception $e) { return false; } if ($options['bd_bucket_localsave'] == true) { #本地存储一份 @move_uploaded_file($uploadfile, $content['attachment']->path); } return array( 'name' => $content['attachment']->name, 'path' => $content['attachment']->path, 'size' => $file['size'], 'type' => $content['attachment']->type, 'mime' => $content['attachment']->mime ); } public static function bd_deleteHandle(array $content) { $options = get_option('bearsimple'); $bosClient = self::bosInit(); #删除本地文件 if ($options['bd_bucket_localsave'] == true && $options['bd_bucket_localdelete']== true) { @unlink($content['attachment']->path); } if ($options['bd_bucket_sync']==true) { try { $bosClient->deleteObject($options['bd_bucket_name'],$content['attachment']->path); return true; } catch (Exception $e) { return false; } } return true; } public static function bd_attachmentHandle(array $content) { $options = get_option('bearsimple'); if (preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff|webp)/i', $content['attachment']->path)) { $diy_style = $options['bd_bucket_other']; } return \Typecho\Common::url($content['attachment']->path, self::bd_getDomain()).$diy_style; } public static function bd_attachmentDataHandle(array $content) { return file_get_contents(self::bd_attachmentHandle($content)); } private static function bosInit() { $options = get_option('bearsimple'); return new BosClient(array( 'credentials' => array( 'accessKeyId' => $options['bd_bucket_accesskey'], 'secretAccessKey' => $options['bd_bucket_secretkey'], ), 'endpoint' => 'http://' .$options['bd_bucket_region'], )); } private static function tx_getDomain() { $options = get_option('bearsimple'); $domain = $options['bucket_domain']; if (empty($domain)) $domain = 'https://' .$options['bucket_name'] . '.cos.' . $options['bucket_region'].'.myqcloud.com'; return $domain; } private static function ali_getDomain() { $options = get_option('bearsimple'); $domain = $options['ali_bucket_domain']; $bucket_name = $options['ali_bucket_name']; $end_point = ($options['ali_bucket_region'] === "other") ? $options['ali_bucket_other_region'] : $options['ali_bucket_region']; if (empty($domain)) $domain = 'https://' .$bucket_name . '.' . $end_point.'.aliyuncs.com'; return $domain; } private static function bd_getDomain() { $options = get_option('bearsimple'); $domain = $options['bd_bucket_domain']; if (empty($domain)) $domain = 'https://' .$options['bd_bucket_name'] . '.' . $options['bd_bucket_region']; return $domain; } private static function hw_getDomain() { $options = get_option('bearsimple'); $domain = $options['hw_bucket_domain']; if (empty($domain)) $domain = 'https://' .$options['hw_bucket_name'] . '.' . $options['hw_bucket_region']. '.myhuaweicloud.com'; return $domain; } private static function getDomain() { $opt = get_option('bearsimple'); $domain = $opt['bucket_domain']; if (empty($domain)) $domain = 'https://' . $opt['bucket_name'] . '.cos.' . $opt['bucket_region'] . '.myqcloud.com'; return $domain; } private static function checkFileType($ext) { $options = \Typecho\Widget::widget('Widget_Options'); return in_array($ext, $options->allowedAttachmentTypes); } private static function makeUploadDir(string $path) { $path = preg_replace("/\\\+/", '/', $path); $current = rtrim($path, '/'); $last = $current; while (!is_dir($current) && false !== strpos($path, '/')) { $last = $current; $current = dirname($current); } if ($last == $current) { return true; } if (!@mkdir($last, 0755)) { return false; } return self::makeUploadDir($path); } private static function makeUploadaDir($path) { $path = preg_replace("/\\\+/", '/', $path); $current = rtrim($path, '/'); $last = $current; while (!is_dir($current) && false !== strpos($path, '/')) { $last = $current; $current = dirname($current); } if ($last == $current) { return true; } if (!@mkdir($last)) { return false; } $stat = @stat($last); $perms = $stat['mode'] & 0007777; @chmod($last, $perms); return self::makeUploadaDir($path); } private static function getUploadDir() { $opt = get_option('bearsimple'); if ($opt['bucket_path']) { return $opt['bucket_path']; } else if (defined('__TYPECHO_UPLOAD_DIR__')) { return __TYPECHO_UPLOAD_DIR__; } else { return self::UPLOAD_DIR; } } private static function ali_getUploadDir() { $opt = get_option('bearsimple'); if ($opt['ali_bucket_path']) { return $opt['ali_bucket_path']; } else if (defined('__TYPECHO_UPLOAD_DIR__')) { return __TYPECHO_UPLOAD_DIR__; } else { return self::UPLOAD_DIR; } } private static function qiniu_getUploadDir() { $opt = get_option('bearsimple'); if ($opt['qiniu_bucket_path']) { return $opt['qiniu_bucket_path']; } else if (defined('__TYPECHO_UPLOAD_DIR__')) { return __TYPECHO_UPLOAD_DIR__; } else { return self::UPLOAD_DIR; } } private static function upyun_getUploadDir() { $opt = get_option('bearsimple'); if ($opt['upyun_bucket_path']) { return $opt['upyun_bucket_path']; } else if (defined('__TYPECHO_UPLOAD_DIR__')) { return __TYPECHO_UPLOAD_DIR__; } else { return self::UPLOAD_DIR; } } private static function hw_getUploadDir() { $opt = get_option('bearsimple'); if ($opt['hw_bucket_path']) { return $opt['hw_bucket_path']; } else if (defined('__TYPECHO_UPLOAD_DIR__')) { return __TYPECHO_UPLOAD_DIR__; } else { return self::UPLOAD_DIR; } } private static function bd_getUploadDir() { $opt = get_option('bearsimple'); if ($opt['bd_bucket_path']) { return $opt['bd_bucket_path']; } else if (defined('__TYPECHO_UPLOAD_DIR__')) { return __TYPECHO_UPLOAD_DIR__; } else { return self::UPLOAD_DIR; } } private static function getUploadFile($file) { return isset($file['tmp_name']) ? $file['tmp_name'] : (isset($file['bytes']) ? $file['bytes'] : (isset($file['bits']) ? $file['bits'] : '')); } private static function getSafeName(&$file) { $file = str_replace(array('"', '<', '>'), '', $file); $file = str_replace('\\', '/', $file); $file = false === strpos($file, '/') ? ('a' . $file) : str_replace('/', '/a', $file); $info = pathinfo($file); $file = substr($info['basename'], 1); return isset($info['extension']) ? strtolower($info['extension']) : ''; } private static function getSafeaName(&$name) { $name = str_replace(array('"', '<', '>'), '', $name); $name = str_replace('\\', '/', $name); $name = false === strpos($name, '/') ? ('a' . $name) : str_replace('/', '/a', $name); $info = pathinfo($name); $name = substr($info['basename'], 1); return $name; } private static function getExtentionName(&$name) { $info = pathinfo($name); return isset($info['extension']) ? strtolower($info['extension']) : ''; } private static function compareVersion($test) { $currentVersion = explode('.', PHP_VERSION); $testVersion = explode('.', $test); $ret = 0; for ($i = 0; $i < sizeof($currentVersion); $i++) { if ($currentVersion[$i] == $testVersion[$i]) { continue; } if ($currentVersion[$i] > $testVersion[$i]) { $ret = 1; break; } else { $ret = -1; break; } } return $ret; } //文章内容分页 public static function parseContent($obj,$u,$r,$con){ $options = \Typecho\Widget::widget('Widget_Options'); $db = \Typecho\Db::get(); $query= $db->select()->from('table.contents')->where('cid = ?', $obj->cid); $row = $db->fetchRow($query); $log_content=$row['text']; if(get_option('Scroll') == 1){ $menutree = 'window.tocManager.displayDisableTocTips = false;window.tocManager.generateToc();'; } $Page_Mark = "----------"; if(strpos($log_content, $Page_Mark)) $ob = "Y"; if(isset($ob)){ $content_list = explode($Page_Mark, $log_content); $page_count = count($content_list); $page_now = !empty($_GET['page_now']) ? intval($_GET['page_now']) : 1; $page_now = ($page_now > $page_count && $page_count>0) ? $page_count : $page_now; $log_content = stripslashes($content_list[$page_now -1]); $log_content = '
            '; return $log_content; ?> 0) { $xsscheck = true; break; } } } else { $xsscheck = true; }; return $xsscheck; } /** * PHP获取字符串中英文混合长度 */ public static function strLength($str){ preg_match_all('/./us', $str, $match); return count($match[0]); // 输出9 } /** * 检查$str中是否含有$words_str中的词汇 * */ public static function searchArray($keyword, $array) { foreach ($array as $item) { if (preg_match("/\b[a-zA-Z\x{4e00}-\x{9fa5}]{$keyword}\b/", $item)) { return true; } } return false; } public static function check_in($words_str, $str) { $words = explode("\n", $words_str); if (empty($words)) { return false; } $result = array_filter($words, function($word) use ($str){ if (false !== stripos($str, trim($word))) { return true; } else{ return false; } }); return $result; } /** * 检查$ip中是否在$words_ip的IP段中 * */ public static function check_ip($words_ip, $ip) { $words = explode("\n", $words_ip); if (empty($words)) { return false; } foreach ($words as $word) { $word = trim($word); if (false !== strpos($word, '*')) { $word = "/^".str_replace('*', '\d{1,3}', $word)."$/"; if (preg_match($word, $ip)) { return true; } } else { if (false !== strpos($ip, $word)) { return true; } } } return false; } public static function GetRandStr($length){ $str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $len = strlen($str)-1; $randstr = ''; for ($i=0;$i<$length;$i++) { $num=mt_rand(0,$len); $randstr .= $str[$num]; } return $randstr; } public static function secretComment($data, $obj,$last){ $text = empty($last)?$data:$last; $db = \Typecho\Db::get(); $iscircle = $db->fetchRow($db->select()->from('table.contents') ->where('cid = ? AND template = ?', $obj->cid,'friendcircle.php')->limit(1)); $iscross = $db->fetchRow($db->select()->from('table.contents') ->where('cid = ? AND template = ?', $obj->cid,'cross.php')->limit(1)); $parentid=array();$parentmail=array();//定义初始父级信息数组 if($obj->parent>0){//如果拥有父级,则循环将所有父级信息加入数组 $parent = $obj->parent; while ($parent > 0) { $parentRows = $db->fetchRow($db->select()->from('table.comments') ->where('coid = ? AND status = ?', $parent, 'approved')->limit(1)); if (!empty($parentRows)) { $coid = $parent; $parent = $parentRows['parent']; array_push($parentid,$parentRows['authorId']); array_push($parentmail,$parentRows['mail']); } else { break; } } } if($iscircle || $iscross){ return $text; } \Typecho\Widget::widget('Widget_User')->to($user);//获取当前用户信息 $stext = $text; if(strpos($text,'@私密@') !== false){ if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){ $stext = '该评论为私密评论,仅已登录者与评论双方可见'; $text = ''.str_replace("@私密@","",$text).''; } else{ $stext = '该评论为私密评论,仅已登录者与评论双方可见'; $text = ''.str_replace("@私密@","",$text).''; } if (\Typecho\Widget::widget('Widget_User')->hasLogin()){ if($user->group=="administrator"||$user->group=="editor"||$user->uid==$obj->authorId||$user->uid==$obj->ownerId||in_array($user->uid,$parentid)){ if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){ Helper::options()->commentsHTMLTagAllowed=''.Helper::options()->commentsHTMLTagAllowed; } else{ Helper::options()->commentsHTMLTagAllowed=''.Helper::options()->commentsHTMLTagAllowed; } return $text; }else{ if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){ Helper::options()->commentsHTMLTagAllowed=''.Helper::options()->commentsHTMLTagAllowed; } else{ Helper::options()->commentsHTMLTagAllowed=''.Helper::options()->commentsHTMLTagAllowed; } return $stext; } }else{ $commentsMail = \Typecho\Cookie::get('__typecho_remember_mail'); if(($obj->mail==$commentsMail && $obj->authorId==0)||(!empty($parentmail) && in_array($commentsMail,$parentmail))){ if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){ Helper::options()->commentsHTMLTagAllowed=''.Helper::options()->commentsHTMLTagAllowed; } else{ Helper::options()->commentsHTMLTagAllowed=''.Helper::options()->commentsHTMLTagAllowed; } return $text; }else{ if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){ Helper::options()->commentsHTMLTagAllowed=''.Helper::options()->commentsHTMLTagAllowed; } else{ Helper::options()->commentsHTMLTagAllowed=''.Helper::options()->commentsHTMLTagAllowed; } return $stext; } } } else{ if(get_option('bearsimple')['avatar__choose'] !== 'closeavatar'){ $text = ''.str_replace("@私密@","",$text).''; Helper::options()->commentsHTMLTagAllowed=''.Helper::options()->commentsHTMLTagAllowed; } else{ $text = ''.str_replace("@私密@","",$text).''; Helper::options()->commentsHTMLTagAllowed=''.Helper::options()->commentsHTMLTagAllowed; } return $text; } } public static function post_request($url, $postdata) { $data = http_build_query($postdata); $options = array( 'http' => array( 'method' => 'POST', 'header' => "Content-type: application/x-www-form-urlencoded", 'content' => $data, 'timeout' => 5 ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); if($http_response_header[0] != 'HTTP/1.1 200 OK'){ $result = array( "result" => "success", "reason" => "request geetest api fail" ); return json_encode($result); }else{ return $result; } } public static function spam_protection_mathjia(){ $num1=rand(1,49); $num2=rand(1,49); echo "
            \n"; echo "\n"; echo "\n"; echo ""; } public static function spam_protection_mathjian(){ $num1=rand(1,49); $num2=rand(1,49); echo "
            \n"; echo "\n"; echo "\n"; echo ""; } public static function spam_protection_question(){ $opt = get_option('bearsimple'); $rand = mt_rand(0,count($opt['VerifyQuestion'])-1); $rand_key = $opt['VerifyQuestion'][$rand]['VerifyQuestion_key']; $rand_answer = $opt['VerifyQuestion'][$rand]['VerifyQuestion_answer']; $rand_answer_tipshow = $opt['VerifyQuestion'][$rand]['VerifyQuestion_showtip']; $rand_answer_tipshow_text = $opt['VerifyQuestion'][$rand]['VerifyQuestion_showtiptext']; if($rand_answer_tipshow == true){ echo "

            显示答案提示 隐藏答案提示 「答案提示:$rand_answer_tipshow_text 」
            "; } else{ echo "

            显示答案 隐藏答案 「答案:$rand_answer 」
            "; } self::getSecurity('set','__typecho_comment_question_answer',$rand_answer); } public static function authToken($string, $operation = 'DECODE', $key = '', $expiry = 0) { $opurl = Helper::options()->siteUrl; $ckey_length = 4; $key = md5($key ? $key : $GLOBALS['discuz_auth_key']); $keya = md5(substr($key, 0, 16)); $keyb = md5(substr($key, 16, 16)); $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; $cryptkey = $keya.md5($keya.$keyc); $key_length = strlen($cryptkey); $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; $string_length = strlen($string); $result = ''; $box = range(0, 255); $rndkey = array(); for($i = 0; $i <= 255; $i++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } for($j = $i = 0; $i < 256; $i++) { $j = ($j + $box[$i] + $rndkey[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } for($a = $j = $i = 0; $i < $string_length; $i++) { $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); } if($operation == 'DECODE') { if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { return substr($result, 26); } else { return ''; } } else { return $keyc.str_replace('=', '', base64_encode($result)); } } public static function getSecurityToken($type = NULL){ $str = mt_rand(100001,999999); $key = Helper::options()->siteUrl; $securityToken = self::authToken($str,'ENCODE',$key,0); if($type == 'html'){ echo "\n"; } self::getSecurity('set','__typecho_security_token',$securityToken); } public static function getIpLocation($ip){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); if($options['Comment_ipget_data_choose'] == 2 && $options['Comment_ipget_data_tencent_key'] !== ''){ if(trim($options['Comment_ipget_data_tencent_sign']) !== ''){ $md5 = md5('/ws/location/v1/ip?ip='.$ip.'&key='.$options['Comment_ipget_data_tencent_key'].$options['Comment_ipget_data_tencent_sign']); $url = 'https://apis.map.qq.com/ws/location/v1/ip?key='.$options['Comment_ipget_data_tencent_key'].'&ip='.$ip.'&sig='.$md5; } else{ $url = 'https://apis.map.qq.com/ws/location/v1/ip?key='.$options['Comment_ipget_data_tencent_key'].'&ip='.$ip; } $headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0)'; foreach( $headers as $n => $v ) { $headerArr[] = $n .':' . $v; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, $headerArr); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $info = json_decode($response,true)['result']['ad_info']; $nation = $info['nation']; $province = $info['province']; $city = $info['city']; $district = $info['district']; if($nation !== NULL){ return $nation.$province.$city.$district; } else{ return '天外来客'; } } else{ $url = 'https://ip.zxinc.org/api.php?type=json&ip='.$ip; $headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0)'; foreach( $headers as $n => $v ) { $headerArr[] = $n .':' . $v; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, $headerArr); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $info = json_decode($response,true)['data']['country']; if($info == null){ $info = '未知'; } return $info; } } /** * 智能过滤 * */ public static function getLastCommentTimeByIp($ipAddress) { $db = \Typecho\Db::get(); $ipFind = $db->fetchRow($db->select()->from('table.comments')->where('table.comments.ip = ?', $ipAddress)->order('table.comments.created', \Typecho\Db::SORT_DESC));; if($ipFind){ return $ipFind['created']; } return 0; } public static function containsHiddenCharacters($str) { $hiddenChars = [ "\x01", // SOH (Start of Heading) "\x02", // STX (Start of Text) "\x03", // ETX (End of Text) "\x04", // EOT (End of Transmission) "\x05", // ENQ (Enquiry) "\x06", // ACK (Acknowledge) "\x07", // BEL (Bell) "\x08", // BS (Backspace) "\x09", // HT (Horizontal Tab) "\x0A", // LF (Line Feed) "\x0B", // VT (Vertical Tab) "\x0C", // FF (Form Feed) "\x0D", // CR (Carriage Return) "\x0E", // SO (Shift Out) "\x0F", // SI (Shift In) "\x10", // DLE (Data Link Escape) "\x11", // DC1 (Device Control 1) "\x12", // DC2 (Device Control 2) "\x13", // DC3 (Device Control 3) "\x14", // DC4 (Device Control 4) "\x15", // NAK (Negative Acknowledge) "\x16", // SYN (Synchronous Idle) "\x17", // ETB (End of Transmission Block) "\x18", // CAN (Cancel) "\x19", // EM (End of Medium) "\x1A", // Substitute character "\x1B", // ESC (Escape) "\x1C", // File Separator "\x1D", // Group Separator "\x1E", // Record Separator "\x1F" // Unit Separator ]; foreach ($hiddenChars as $char) { if (strpos($str, $char) !== false) { return true; } } return false; } public static function isUrl($text) { //$urlPattern = '/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/'; //return preg_match($urlPattern, $text); $urlPattern = '/\b(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?\b/'; return preg_match($urlPattern, $text); } public static function isBotComment($comment, $timeSinceLastComment = 60){ //一些常见的机器人用户代理字符串 $botUserAgents = [ 'bot', 'crawl', 'spider', 'robot', 'crawling', 'fetch', 'indexing', 'mediapartners' ]; // 检查用户代理是否包含机器人关键词 foreach ($botUserAgents as $botKeyword) { if (stripos($comment['agent'], $botKeyword) !== false) { return true; } } // 检查评论内容是否过于简单或重复 if (strlen($comment['text']) < 10 || preg_match('/^\s*$/', $comment['text'])) { return true; } // 检查IP地址是否在短时间内发送了多个评论 $lastCommentTime = self::getLastCommentTimeByIp($comment['ip']); if ($lastCommentTime && (time() - $lastCommentTime) < $timeSinceLastComment) { return true; } // 检查评论内容是否包含隐藏字符 if (self::containsHiddenCharacters($comment['text'])) { return true; } // 检查评论昵称是否包含网址 if (self::isUrl($comment['author'])) { return true; } // 如果以上条件都不满足,则认为不是机器人评论 return false; } public static function filter($comment,$post){ $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $db = \Typecho\Db::get(); $removeChar = ["https://", "http://"]; if (strpos($_SERVER['HTTP_REFERER'], str_replace($removeChar, "", Helper::options()->siteUrl)) == false ) { throw new \Typecho\Widget\Exception("抱歉,检测到来源错误,请在正确的页面进行评论。",200); } if($_POST['SecurityToken'] !== $_SESSION['token'] && !$_POST['vtype']){ throw new \Typecho\Widget\Exception("抱歉,安全检测未通过,请刷新页面后重新进行评论。",200); } if(Plugin::xsscheck($comment['text'])) { \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论包含危险内容,请返回修改后再试。",200); } $comment['url'] =htmlspecialchars($comment['url'],ENT_QUOTES,'UTF-8'); if ($comment['mail'] !== null && preg_match("/^[A-Za-z0-9\-]+([_\.][A-Za-z0-9\-]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,}$/", $comment['mail']) !== 1) { throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论包含危险内容,请返回修改后再试。", 200); } if(!$_POST['vtype'] && $_POST['vtype'] !== 'cross' && $_POST['vtype'] !== 'friendcircle' && $_POST['vtype'] !== 'circlecomment'){ //判断POST过来的vtype字段是否为指定类型或为空 if (strlen(trim(preg_replace('/\xc2\xa0/',' ',$comment['text']))) == 0) { \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论内容只有空格,请返回修改后再试。",200); } if($options['BearSpam_Auto'] == true){ if (self::isBotComment($comment)) { throw new \Typecho\Widget\Exception("抱歉,本条评论被判定为机器人评论,已自动拦截。",200); } } if($options['BearSpam_Pro'] == true){ if (!empty($options['BearSpam_IP'])) { if (Plugin::check_ip($options['BearSpam_IP'], $comment['ip'])) { throw new \Typecho\Widget\Exception("抱歉,系统检测到您的IP处于屏蔽范围内,已拦截本条评论。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); } } if (!empty($options['BearSpam_EMAIL'])) { if (Plugin::check_in($options['BearSpam_EMAIL'], $comment['mail'])) { throw new \Typecho\Widget\Exception("抱歉,系统检测到您的邮箱处于屏蔽范围内,已拦截本条评论。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); } } if (!empty($options['BearSpam_NAME'])) { if (Plugin::check_in($options['BearSpam_NAME'], $comment['author'])) { throw new \Typecho\Widget\Exception("抱歉,系统检测到您的昵称存在敏感禁止词汇,已拦截本条评论。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); } } if (!empty($options['BearSpam_URL'])) { if (Plugin::check_in($options['BearSpam_URL'], $comment['url'])) { throw new \Typecho\Widget\Exception("抱歉,系统检测到您的网址处于屏蔽范围内,已拦截本条评论。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); } } if (!empty($options['BearSpam_ArticleTitle'])&& $options['BearSpam_ArticleTitle'] == "1") { $db = \Typecho\Db::get(); // 获取评论所在文章 $pot = $db->fetchRow($db->select('title')->from('table.contents')->where('cid = ?', $comment['cid'])); if(strstr($comment['text'], $pot['title'])){ throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论内容疑似存在灌水内容,已自动拦截。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); } } if (!empty($options['BearSpam_NAMEMIN'])) { if(Plugin::strLength($comment['author']) < $options['BearSpam_NAMEMIN']){ throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论昵称过短,已自动拦截。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); } } if (!empty($options['BearSpam_NAMEMAX'])) { if (Plugin::strLength($comment['author']) > $options['BearSpam_NAMEMAX']) { throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论昵称过长,已自动拦截。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); }} if (!empty($options['BearSpam_NAMEURL'])&& $options['BearSpam_NAMEURL'] == "1") { if (preg_match(" /^((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*[\.。])+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$/ ", $comment['author']) > 0) { throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论昵称异常,已自动拦截。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); }} if (!empty($options['BearSpam_Chinese'])&& $options['BearSpam_Chinese'] == "1") { if (preg_match("/[\x{4e00}-\x{9fa5}]/u", $comment['text']) == 0) { throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论内容不包含中文,已自动拦截。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); }} if (!empty($options['BearSpam_MIN'])) { if(Plugin::strLength($comment['text']) < $options['BearSpam_MIN']){ throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论内容字数过少,已自动拦截。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); }} if (!empty($options['BearSpam_MAX'])) { if(Plugin::strLength($comment['text']) > $options['BearSpam_MAX']){ throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论内容字数过多,已自动拦截。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); }} if (!empty($options['BearSpam_Words'])) { if (Plugin::check_in($options['BearSpam_Words'], $comment['text'])) { throw new \Typecho\Widget\Exception("抱歉,系统检测到您的评论内容包含敏感禁止词汇,已自动拦截。",200); \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); } } } if ($options['VerifyChoose'] == '22-2'){ $answer = $_POST['answer']; $ganswer = self::getSecurity('get','__typecho_comment_question_answer'); switch($answer){ case $ganswer: break; case null: throw new \Typecho\Widget\Exception('对不起,请输入验证码。',200); break; default: throw new \Typecho\Widget\Exception('对不起,验证码错误,请重试。',200); } } if ($options['VerifyChoose'] == '1' || $options['VerifyChoose'] == '11'){ $sum = $_POST['sum']; switch($_POST['spam_protection_mathstyle']){ case 'addition': switch($sum){ case $_POST['num1'] + $_POST['num2']: break; case null: throw new \Typecho\Widget\Exception('对不起,请输入验证码。',200); break; default: throw new \Typecho\Widget\Exception('对不起,验证码错误,请重试。',200); } break; case 'subtraction': switch($sum){ case $_POST['num1'] - $_POST['num2']: break; case null: throw new \Typecho\Widget\Exception('对不起,请输入验证码。',200); break; default: throw new \Typecho\Widget\Exception('对不起,验证码错误,请重试。',200); } break; } } if ($options['VerifyChoose']== '2-2' && !empty($options['turnstile_key']) && !empty($options['turnstile_secretkey']) && $options['backendVerify_Turnstile'] == true) { if(empty($_POST['cf-turnstile-response'])){ \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new \Typecho\Widget\Exception("抱歉,系统检测到您的验证密钥已失效,需重新验证!",200); } elseif (isset($_POST['cf-turnstile-response'])) { $response_data = self::getTurnstileResult($_POST['cf-turnstile-response'], $options['turnstile_secretkey']); if ($response_data['success']) { if ($response_data['action'] == 'comment') { return $comment; } else { \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new Typecho_Widget_Exception(_t(self::getTurnstileResultMsg('场景验证失败')),200); } } else { \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new Typecho_Widget_Exception(_t(self::getTurnstileResultMsg($response_data)),200); } } else { \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new Typecho_Widget_Exception(_t('加载验证码失败, 请检查你的网络'),200); } } if ($options['VerifyChoose']== '2' && !empty($options['vid']) && !empty($options['vkey']) && $options['backendVerify_Vaptcha'] == true) { if(empty($_POST['vaptcha_server']) || empty($_POST['vaptcha_token'])){ \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new \Typecho\Widget\Exception("抱歉,系统检测到您的验证密钥已失效,需重新验证!",200); } $url = $_POST['vaptcha_server']; $data = array( 'id'=> $options['vid'], 'secretkey' => $options['vkey'], 'scene'=> '1', 'token'=> $_POST['vaptcha_token'], 'ip'=> $comment['ip'] ); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,3); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type'=>'application/json')); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $handles = curl_exec($ch); curl_close($ch); $result = json_decode($handles,true); if($result['success'] == 0){ \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new \Typecho\Widget\Exception("抱歉,您未通过人机验证,原因:".$result['msg'],200); } } if ($options['VerifyChoose']== '2-3' && !empty($options['geeid']) && !empty($options['geekey']) && $options['backendVerify_Geetest'] == true) { $captcha_id = $options['geeid']; $captcha_key = $options['geekey']; $api_server = "https://gcaptcha4.geetest.com"; $lot_number = $_POST['lot_number']; $captcha_output = $_POST['captcha_output']; $pass_token = $_POST['pass_token']; $gen_time = $_POST['gen_time']; $sign_token = hash_hmac('sha256', $lot_number, $captcha_key); $query = array( "lot_number" => $lot_number, "captcha_output" => $captcha_output, "pass_token" => $pass_token, "gen_time" => $gen_time, "sign_token" => $sign_token ); $url = sprintf($api_server . "/validate" . "?captcha_id=%s", $captcha_id); $res = self::post_request($url,$query); $obj = json_decode($res,true); if($obj['status'] == 'success' && $obj['result'] == 'fail'){ \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new \Typecho\Widget\Exception("抱歉,您未通过人机验证,原因:".$obj['reason'],200); } if($obj['status'] == 'error' && $obj['code']){ \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new \Typecho\Widget\Exception("抱歉,您未通过人机验证,错误码:".$obj['code'].",原因:".$obj['msg'],200); } } if ($options['VerifyChoose']== '2-1' && !empty($options['dx_domain']) && !empty($options['dx_appId']) && !empty($options['dx_appSecret']) && $options['backendVerify_Dingxiang'] == true) { if(empty($_POST['dx_token'])){ \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new \Typecho\Widget\Exception("抱歉,系统检测到您的验证密钥已失效,需重新验证!",200); } $appId = $options['dx_appId']; $appSecret = $options['dx_appSecret']; $client = new CaptchaClient($appId,$appSecret); $client->setTimeOut(2); $client->setCaptchaUrl("https://".$options['dx_domain']."/api/tokenVerify"); $response = $client->verifyToken($_POST['dx_token']); if(!$response->result){ \Typecho\Cookie::set('__typecho_remember_text', $comment['text']); throw new \Typecho\Widget\Exception("抱歉,您未通过人机验证,请返回重试。",200); } } \Typecho\Cookie::delete('__typecho_remember_text'); if(empty($comment['mail'])){ $comment['mail'] = self::GetRandStr(17).'@privatemail.com'; \Typecho\Cookie::set('__typecho_remember_mail', $comment['mail']); } if($_POST['privatecomment'] == 'on'){ $comment['text'] = '@私密@'.$comment['text']; } } return $comment; } public static function filter2($comment) { $options = get_option('bearsimple'); $db = \Typecho\Db::get(); if ($options['Comment_ipget'] == true && $options['Comment_ipget_data'] == true){ $ip = array( 'coid' => $comment->coid, 'location' => self::getIpLocation($comment->ip), ); $db->query($db->insert('table.bscore_iplocation_data')->rows($ip)); } if($_POST['vtype'] == 'friendcircle'){ if($_POST['getRead'] == 'on'){ $private = true; } else{ $private = false; } if($_POST['resources']){ $_POST['resources'] = json_encode(explode(',',$_POST['resources'])); } $circle_data = array( 'coid' => $comment->coid, 'location' => $_POST['getMapInput'], 'private' => $private, 'resources' => $_POST['resources'], ); $db->query($db->insert('table.bscore_friendcircle_data')->rows($circle_data)); } return true; } private static function getTurnstileResult($turnstile_response, $secretKey) { $beforeload = array('secret' => $secretKey, 'response' => $turnstile_response); $beforeload['remoteip'] = $_SERVER['REMOTE_ADDR']; $stream = stream_context_create(array( 'http' => array( 'method' => 'POST', 'content' => http_build_query($beforeload) ) )); $response = file_get_contents("https://challenges.cloudflare.com/turnstile/v0/siteverify", false, $stream); $response = json_decode($response, true); return $response; } private static function getTurnstileResultMsg($resp) { if ($resp['success'] == true) { return '验证通过'; } else { switch (strtolower($resp['error-codes'][0])) { case 'missing-input-response': return '请先完成验证'; case 'invalid-input-response': return '验证无效或已过期'; case 'timeout-or-duplicate': return '验证密钥已被使用, 请重新验证'; case 'bad-request': return '呜呜呜验证失败了,要不 再试一次?'; case 'internal-error': return '验证服务器寄了, 再试一次吧'; case 'missing-input-secret': case 'invalid-input-secret': return '未设置或设置了无效的 secretKey'; default: return '还请再试一次!'; } } } //文件缓存 public static function getCache_file(){ $req = \Typecho\Request::getInstance(); $url = $req->getRequestUri(); if(!$req->isGet()){ return; } if(strstr($url,'/action/') !== false || strstr($url,'/admin/') !== false){ return; } $hash = md5($url); @$settings = bsOptions::getInstance()::get_option( 'bearsimple' ); if(!$settings) return; $cache_timeout = intval($settings['cache_timeout']); $cache_root = $settings['cache_dir']; if(strstr($cache_root, '/') !== 0 ){ $cache_root = __TYPECHO_ROOT_DIR__.'/usr/'.$cache_root; } if($cache_timeout <= 0){ $cache_timeout = 60; //1min } $file = self::hash2dir($hash,$cache_root).$hash.".gz"; if(file_exists($file)){ $filetime = filemtime($file); if($filetime !== false && time() - $filetime < $cache_timeout){ $fh = fopen($file, "rb"); $content = fread($fh,filesize ($file)); fclose($fh); $html = gzuncompress($content); echo $html; exit(0); } }else{ } } public static function setCache_file(){ $req = \Typecho\Request::getInstance(); $url = $req->getRequestUri(); if(!$req->isGet()){ return; } if(strstr($url,'/action/') !== false || strstr($url,'/admin/') !== false){ return; } $_routingTable = Helper::options()->routingTable; $post_regx = $_routingTable[0]['post']['regx']; if (array_key_exists('TePass', \Typecho\Plugin::export()['activated'])){ if (preg_match($post_regx,$path,$arr)){ if ($arr[1] and !empty($arr[1])){ $db = \Typecho\Db::get(); try { $database = $db->getConfig($db::READ)['database']; $tepass_exist = $db->fetchRow($db->select()->from('information_schema.TABLES')->where('TABLE_NAME = ?',$db->getPrefix().'tepass_posts')->where('TABLE_SCHEMA = ?',$database)); if (isset($tepass_exist) and count($tepass_exist) > 0){ $p_id = $db->fetchObject($db->select('id')->from('table.tepass_posts')->where('post_id = ?',$arr[1]))->id; if ($p_id) return; } }catch (Typecho_Db_Query_Exception $e){ } } } } @$settings = bsOptions::getInstance()::get_option( 'bearsimple' ); if(!$settings) return; $cache_root = $settings['cache_dir']; if(strstr($cache_root, '/') !== 0 ){ $cache_root = __TYPECHO_ROOT_DIR__.'/usr/'.$cache_root; } $hash = md5($url); $file = self::hash2dir($hash,$cache_root).$hash.".gz"; $dir = dirname($file); if(!file_exists($dir)){ $ret = mkdir($dir,0777,true); if(!$ret){ return; } } $html = ob_get_contents(); $html_gz = gzcompress($html); $fp = fopen($file, 'w'); fwrite($fp, $html_gz); fclose($fp); } private static function hash2dir($hash,$base_dir=""){ $dir=""; for($i = 0; $i < strlen($hash) ; $i+=2){ $dir = $dir."/".substr($hash, $i, 2); } return rtrim($base_dir,'/').$dir.'/'; } //代码高亮 public static function headlink($cssUrl) { $options = Helper::options(); $dir = $options->themeUrl.'/'; if(bsOptions::getInstance()::get_option('bearsimple' )['Codehightlight'] == true){ $style = bsOptions::getInstance()::get_option('bearsimple' )['code_style']; if(empty($style)){ $style = 'coy.css'; } else{ $style = bsOptions::getInstance()::get_option( 'bearsimple' )['code_style']; } $cssUrl = $dir.'modules/codehightlight/static/styles/' . $style.'?v=2.9.9'; $playerUrl = $dir.'assets/vendors/player/player.min.css?v=2.3.4'; $mp3Url = $dir.'assets/vendors/mp3/mp3.min.css?v=2.3.4'; echo ''; echo ''; echo ''; } } /** * 底部脚本 * * @access public * @param unknown $footlink * @return unknown */ public static function footlink() { $options = Helper::options(); $dir = $options->themeUrl.'/'; if(bsOptions::getInstance()::get_option( 'bearsimple' )['article_videoExt'] !== '' && is_array(bsOptions::getInstance()::get_option( 'bearsimple' )['article_videoExt']) && in_array('ext_hls',bsOptions::getInstance()::get_option( 'bearsimple' )['article_videoExt'])){ echo << HTML; } if(bsOptions::getInstance()::get_option( 'bearsimple' )['article_videoExt'] !== '' && is_array(bsOptions::getInstance()::get_option( 'bearsimple' )['article_videoExt']) && in_array('ext_flv',bsOptions::getInstance()::get_option( 'bearsimple' )['article_videoExt'])){ echo << HTML; } echo << HTML; if(bsOptions::getInstance()::get_option('bearsimple')['seo_push'] == true && bsOptions::getInstance()::get_option('bearsimple')['seotabs']['baidu_token'] !== ''){ echo PHP_EOL.''.PHP_EOL; } if(bsOptions::getInstance()::get_option('bearsimple')['AdControl'] == true && bsOptions::getInstance()::get_option('bearsimple')['AdControl_Google'] == true){ echo ''; } } /**解析表情**/ public static function getEmo($comment){ $options = Helper::options(); $Temoptions = get_option('bearsimple'); $opts = array( 'http'=>array( 'method' => 'GET', 'header' => 'Content-type: application/json', 'timeout' => 60 * 10, 'Connection'=>"close" ) ); $context = stream_context_create($opts); if($Temoptions['Emoji_HideDefault'] == false || $Temoptions['Emoji_HideDefault'] == ''){ $res = json_decode(file_get_contents(str_replace("/plugins","",dirname(__DIR__)).'/themes/bearsimple/assets/vendors/bs-emoji/bs-emoji.json', false, $context),true); $emo = $res; } if($Temoptions['Emoji_Diy'] == true && $Temoptions['Emoji_DiyUrl'] !== ''){ $res2 = json_decode(file_get_contents($Temoptions['Emoji_DiyUrl'], false, $context),true); if($Temoptions['Emoji_HideDefault'] == false || $Temoptions['Emoji_HideDefault'] == ''){ $emo = array_merge($res,$res2); } else{ $emo = $res2; } } foreach ($emo as $v){ if($v['category'] !== ''){ if($type == 'comment'){ $comment = str_replace($v['data'], '', $comment); } elseif($type == 'reply'){ $comment = str_replace($v['data'], '', $comment); } else{ $comment = str_replace($v['data'], '', $comment); } } } //当评论没有私密评论时去除私密评论识别标签 $comment = str_replace('@私密@', '', $comment); return $comment; } //邮件 public static function parseCommentMark($comments,$comment,$status) { $options = \Typecho\Widget::widget('Widget_Options'); $Temoptions = get_option('bearsimple'); if($status == 'approved'){ $cfg = array( 'siteTitle' => $options->title, 'timezone' => $options->timezone, 'cid' => $comment->cid, 'coid' => $comment->coid, 'created' => $comment->created, 'author' => $comment->author, 'authorId' => $comment->authorId, 'ownerId' => $comment->ownerId, 'mail' => $comment->mail, 'ip' => $comment->ip, 'title' => $comment->title, 'text' => self::getEmo($comment->text), 'permalink' => $comment->permalink, 'status' => $status, 'parent' => $comment->parent, 'manage' => $options->adminUrl . "/manage-comments.php" ); self::$_isMailLog = in_array('4', $Temoptions['CommentNotify__OtherSetting']) ? true : false; if($_POST['accept'] == 'on'){ $cfg['banMail'] = 1; } else{ $cfg['banMail'] = 0; } $fileName = \Typecho\Common::randString(12); $cfg = (object)$cfg; file_put_contents(dirname(__FILE__) . '/cache/' . $fileName, serialize($cfg)); $url = ($options->rewrite) ? $options->siteUrl : $options->siteUrl . 'index.php'; $url = rtrim($url, '/') . '/action/' . self::$action . '?send=' . $fileName; $date = new \Typecho\Date(\Typecho\Date::gmtTime()); $time = $date->format('Y-m-d H:i:s'); self::saveLog("{$time} 开始发送请求:{$comment->parent}{$url}\n"); self::asyncRequest($url); } } /** * 获取邮件内容 * * @access public * @param $comment 调用参数 * @return void */ public static function parseComment($comment) { $options = \Typecho\Widget::widget('Widget_Options'); $Temoptions = get_option('bearsimple'); if($_POST['vtype'] == 'friendcircle'){ return true; } $cfg = array( 'siteTitle' => $options->title, 'timezone' => $options->timezone, 'cid' => $comment->cid, 'coid' => $comment->coid, 'created' => $comment->created, 'author' => $comment->author, 'authorId' => $comment->authorId, 'ownerId' => $comment->ownerId, 'mail' => $comment->mail, 'ip' => $comment->ip, 'title' => $comment->title, 'text' => self::getEmo($comment->text), 'permalink' => $comment->permalink, 'status' => $comment->status, 'parent' => $comment->parent, 'manage' => $options->adminUrl . "/manage-comments.php" ); self::$_isMailLog = in_array('4', $Temoptions['CommentNotify__OtherSetting']) ? true : false; if($_POST['accept'] == 'on'){ $cfg['banMail'] = 1; } else{ $cfg['banMail'] = 0; } $fileName = \Typecho\Common::randString(12); $cfg = (object)$cfg; file_put_contents(dirname(__FILE__) . '/cache/' . $fileName, serialize($cfg)); $url = ($options->rewrite) ? $options->siteUrl : $options->siteUrl . 'index.php'; $url = rtrim($url, '/') . '/action/' . self::$action . '?send=' . $fileName; $date = new \Typecho\Date(\Typecho\Date::gmtTime()); $time = $date->format('Y-m-d H:i:s'); self::saveLog("{$time} 开始发送请求:{$url}\n"); self::asyncRequest($url); } public static function asyncRequest($url) { self::isAvailable(); self::$_adapter == 'Socket' ? self::socket($url) : self::curl($url); } /** * Socket 请求 * @param $url * @return bool */ public static function socket($url) { $params = parse_url($url); $path = $params['path'] . '?' . $params['query']; $host = $params['host']; $port = 80; $scheme = ''; if ('https' == $params['scheme']) { $port = 443; $scheme = 'ssl://'; } if (function_exists('fsockopen')) { $fp = @fsockopen($scheme . $host, $port, $errno, $errstr, 30); } elseif (function_exists('pfsockopen')) { $fp = @pfsockopen($scheme . $host, $port, $errno, $errstr, 30); } else { $fp = stream_socket_client($scheme . $host . ":$port", $errno, $errstr, 30); } if ($fp === false) { self::saveLog("SOCKET错误," . $errno . ':' . $errstr); return false; } $out = "GET " . $path . " HTTP/1.1\r\n"; $out .= "Host: $host\r\n"; $out .= "Connection: Close\r\n\r\n"; self::saveLog("Socket 方式发送\r\n"); fwrite($fp, $out); sleep(1); fclose($fp); self::saveLog("请求结束\r\n"); } /** * Curl 请求 * @param $url */ public static function curl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPGET, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 将curl_exec()获取的信息以文件流的形式返回,不直接输出。 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); // 连接等待时间 curl_setopt($ch, CURLOPT_TIMEOUT, 1); // curl允许执行时间 self::saveLog("Curl 方式发送\r\n"); curl_exec($ch); curl_close($ch); self::saveLog("请求结束\r\n"); } /** * 检测 适配器 * @return string */ public static function isAvailable() { function_exists('ini_get') && ini_get('allow_url_fopen') && (self::$_adapter = 'Socket'); false == self::$_adapter && function_exists('curl_version') && (self::$_adapter = 'Curl'); return self::$_adapter; } /** * 检测 是否可写 * @param $file * @return bool */ public static function isWritable($file) { if (is_dir($file)) { $dir = $file; if ($fp = @fopen("$dir/check_writable", 'w')) { @fclose($fp); @unlink("$dir/check_writable"); $writeable = true; } else { $writeable = false; } } else { if ($fp = @fopen($file, 'a+')) { @fclose($fp); $writeable = true; } else { $writeable = false; } } return $writeable; } /** * 写入记录 * @param $content * @return bool */ public static function saveLog($content) { if (!self::$_isMailLog) { return false; } file_put_contents(dirname(__FILE__) . '/log/mailer_log.txt', $content, FILE_APPEND); } public function sign($msg, $key) { $signature = ''; $success = openssl_sign($msg, $signature, $key, 'SHA256'); if(!$success){ return false; } return $signature; } public function urlEncode($input) { return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); } public function encode($payload, $key, $alg = 'RS256') { $header = array('typ' => 'JWT', 'alg' => $alg); $segments = array(); $segments[] = $this->urlEncode(json_encode($header)); $segments[] = $this->urlEncode(json_encode($payload)); $signing_input = implode('.', $segments); $signature = $this->sign($signing_input, $key); $segments[] = $this->urlEncode($signature); return implode('.', $segments); } //百度推送 public static function seo_publishpush($content, $edit) { $bd_api = get_option('bearsimple')['seotabs']['baidu_token']; $sm_api = get_option('bearsimple')['seotabs']['shenma_token']; $bing_api = get_option('bearsimple')['seotabs']['bing_token']; $toutiao_api = get_option('bearsimple')['seotabs']['toutiao_token']; $indexnow_api = get_option('bearsimple')['seotabs']['indexnow_token']; $siteUrl = Helper::options()->siteUrl; $adminUrl = Helper::options()->adminUrl; $db = \Typecho\Db::get(); $content['cid'] = $edit->cid; $content['slug'] = $edit->slug; //获取分类缩略名 $content['category'] = urlencode(current(\Typecho\Common::arrayFlatten($db->fetchAll($db->select()->from('table.metas') ->join('table.relationships', 'table.relationships.mid = table.metas.mid') ->where('table.relationships.cid = ?', $content['cid']) ->where('table.metas.type = ?', 'category') ->order('table.metas.order', \Typecho\Db::SORT_ASC)), 'slug'))); //获取并格式化文章创建时间 $content['created'] = $edit->created; $created = new \Typecho\Date($content['created']); $content['year'] = $created->year; $content['month'] = $created->month; $content['day'] = $created->day; //生成URL $url = $edit->permalink; $urls = array(0=>$url); if($content['created'] > Helper::options()->time) exit(''); if($bd_api !== ''){ if(strpos($bd_api, 'data.zz.baidu.com') !== 7) exit(''); //发送请求 $ch = curl_init(); $options = array( CURLOPT_URL => $bd_api, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => $url, CURLOPT_HTTPHEADER => array('Content-Type: text/plain'), ); curl_setopt_array($ch, $options); $result = curl_exec($ch); $res = json_decode($result, true); //if(isset($res['error'])) exit(''); } if($sm_api !== ''){ //发送请求 $ch = curl_init(); $options = array( CURLOPT_URL => $sm_api, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => $url, CURLOPT_HTTPHEADER => array('Content-Type: text/plain'), ); curl_setopt_array($ch, $options); $result = curl_exec($ch); $res = json_decode($result, true); //if($res['returnCode'] !== 200) exit(''); } if($bing_api !== ''){ $submit_url = array(); $home_url = Helper::options()->siteUrl; $len = strlen($home_url); foreach($urls as $url){ $url = trim($url); if(empty($url)){ continue; } if(substr($url,0,$len)!=$home_url){ continue; } $submit_url[] = $url; } //发送请求 $ch = curl_init(); $options = array( CURLOPT_URL => 'https://ssl.bing.com/webmaster/api.svc/json/SubmitUrlbatch?apikey='.$bing_api, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode(array('siteUrl'=>$home_url,'urlList'=>$submit_url)), CURLOPT_HTTPHEADER => array('Content-Type: text/json; charset=utf-8'), ); curl_setopt_array($ch, $options); $result = curl_exec($ch); $res = json_decode($result, true); /* if(!$res) exit(''); if(isset($res['ErrorCode'])) exit(''); */ } if($toutiao_api !== ''){ $url = urlencode($url); //发送请求 $ch = curl_init(); $options = array( CURLOPT_URL => 'https://zhanzhang.toutiao.com/s.gif?url='.$url.'&token='.$toutiao_api, CURLOPT_POST => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array('Content-Type: text/json; charset=utf-8'), ); curl_setopt_array($ch, $options); $result = curl_exec($ch); $res = json_decode($result, true); //if($res['code'] == 8) exit(''); } if($indexnow_api !== ''){ //发送请求 $ch = curl_init(); $options = array( CURLOPT_URL => 'https://www.bing.com/indexnow?key='.$indexnow_api.'&url='.$url, CURLOPT_POST => FALSE, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, CURLOPT_HTTPHEADER => array('Content-Type: application/json; charset=utf-8'), ); curl_setopt_array($ch, $options); $result = curl_exec($ch); $resCode = curl_getinfo($ch,CURLINFO_HTTP_CODE); curl_close($ch); /* if($resCode !== 200){ $msg = [ 202=>'URL校验正常,IndexNow密钥已激活,该通知或许仅会显示这一次:).', 400=>'非法格式', 403=>'在密钥无效的情况下出现错误(例如,没有找到密钥,找到文件但密钥内容不在文件中)。', 422=>'如果URL不属于主机,或者密钥与协议中的模式不匹配,就会出现这种情况', 429=>'请求过多(被限制了)', ]; $err = $msg[$resCode] ? $msg[$resCode] : 'api error,response code['.$resCode.']'; exit(''); } */ } } public static function seo_autopush() { echo PHP_EOL.''.PHP_EOL; } public static function tags_bottom(){ ?> gmtTime); } $path = \Typecho\Common::url(defined('__TYPECHO_UPLOAD_DIR__') ? __TYPECHO_UPLOAD_DIR__ : \Widget\Upload::UPLOAD_DIR, defined('__TYPECHO_UPLOAD_ROOT_DIR__') ? __TYPECHO_UPLOAD_ROOT_DIR__ : __TYPECHO_ROOT_DIR__) . '/' . $date->year . '/' . $date->month; if (!isset($file['tmp_name'])) { return false; } if ($isimage) { $apikey = trim(bsOptions::getInstance()::get_option( 'bearsimple' )['Tinypng_apikey']); \Tinify\setKey($apikey); $source = \Tinify\fromFile($file['tmp_name']); } //创建上传目录 if (!is_dir($path)) { if (!self::getTypechoMethod("makeUploadDir", $path)) { return false; } } $fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext; $path = $path . '/' . $fileName; if (!$isimage) { if (isset($file['tmp_name'])) { if (!@move_uploaded_file($file['tmp_name'], $path)) { return false; } } else if (isset($file['bytes'])) { if (!file_put_contents($path, $file['bytes'])) { return false; } } else { return false; } } if ($isimage) { $source->toFile($path); $file['size'] = filesize($path); } else if (!isset($file['size'])) { $file['size'] = filesize($path); } return array( 'name' => $file['name'], 'path' => (defined('__TYPECHO_UPLOAD_DIR__') ? __TYPECHO_UPLOAD_DIR__ : \Widget\Upload::UPLOAD_DIR) . '/' . $date->year . '/' . $date->month . '/' . $fileName, 'size' => $file['size'], 'type' => $ext, 'mime' => \Typecho\Common::mimeContentType($path) ); } public static function lsky_uploadHandle($file) { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); if (empty($file['name'])) { return false; } $ext = self::_getSafeName($file['name']); if (!Upload::checkFileType($ext) || Common::isAppEngine()) { return false; } if (self::_isImage($ext)) { return self::_uploadImg($file, $ext); } return self::_uploadOtherFile($file, $ext); } public static function lsky_deleteHandle(array $content): bool { $ext = $content['attachment']->type; if (self::_isImage($ext)) { return self::_deleteImg($content); } return unlink($content['attachment']->path); } public static function lsky_modifyHandle($content, $file) { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); if (empty($file['name'])) { return false; } $ext = self::_getSafeName($file['name']); if ($content['attachment']->type != $ext || Common::isAppEngine()) { return false; } if (!self::_getUploadFile($file)) { return false; } $uploadfile = self::_getUploadFile($file); if (self::_isImage($ext)) { self::_deleteImg($content); return self::_uploadImg($file, $ext); } return self::_uploadOtherFile($file, $ext); } public static function lsky_attachmentHandle(array $content): string { $arr = unserialize($content['text']); $text = strstr($content['text'],'.'); $ext = substr($text,1,3); if (self::_isImage($ext)) { return $content['attachment']->path ?? ''; } $ret = explode('/'.self::UPLOAD_DIR, $arr['path']); return Common::url('/'.self::UPLOAD_DIR . @$ret[1], Options::alloc()->siteUrl); } public static function lsky_attachmentDataHandle(array $content) { return file_get_contents(self::lsky_attachmentHandle($content)); } private static function _getUploadDir($ext = ''): string { if (self::_isImage($ext)) { $url = parse_url(Options::alloc()->siteUrl); $DIR = str_replace('.', '_', $url['host']); return __TYPECHO_ROOT_DIR__ . '/'.self::UPLOAD_DIR; } elseif (defined('__TYPECHO_UPLOAD_DIR__')) { return __TYPECHO_UPLOAD_DIR__; } else { $path = Common::url('/'.self::UPLOAD_DIR, __TYPECHO_ROOT_DIR__); return $path; } } private static function _getUploadFile($file): string { return $file['tmp_name'] ?? ($file['bytes'] ?? ($file['bits'] ?? '')); } private static function _getSafeName(&$name): string { $name = str_replace(array('"', '<', '>'), '', $name); $name = str_replace('\\', '/', $name); $name = false === strpos($name, '/') ? ('a' . $name) : str_replace('/', '/a', $name); $info = pathinfo($name); $name = substr($info['basename'], 1); return isset($info['extension']) ? strtolower($info['extension']) : ''; } private static function _makeUploadDir($path): bool { $path = preg_replace("/\\\+/", '/', $path); $current = rtrim($path, '/'); $last = $current; while (!is_dir($current) && false !== strpos($path, '/')) { $last = $current; $current = dirname($current); } if ($last == $current) { return true; } if (!@mkdir($last)) { return false; } $stat = @stat($last); $perms = $stat['mode'] & 0007777; @chmod($last, $perms); return self::_makeUploadDir($path); } private static function _isImage($ext): bool { $img_ext_arr = array('gif','jpg','jpeg','png','tiff','bmp','ico','psd','webp','JPG','BMP','GIF','PNG','JPEG','ICO','PSD','TIFF','WEBP'); return in_array($ext, $img_ext_arr); } private static function _uploadOtherFile($file, $ext) { $dir = self::_getUploadDir($ext) . '/' . date('Y') . '/' . date('m'); if (!self::_makeUploadDir($dir)) { return false; } $path = sprintf('%s/%u.%s', $dir, crc32(uniqid()), $ext); if (!isset($file['tmp_name']) || !@move_uploaded_file($file['tmp_name'], $path)) { return false; } return [ 'name' => $file['name'], 'path' => $path, 'size' => $file['size'] ?? filesize($path), 'type' => $ext, 'mime' => @Common::mimeContentType($path) ]; } private static function _uploadImg($file, $ext) { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $api = $options['lskypro_api'] . '/api/v1/upload'; $token = 'Bearer '.$options['lskypro_token']; $strategyId = $options['lskypro_id']; $tmp = self::_getUploadFile($file); if (empty($tmp)) { return false; } $img = $file['name']; if (!rename($tmp, $img)) { return false; } $params = ['file' => new CURLFile($img)]; if ($strategyId) { $params['strategy_id'] = $strategyId; } $res = self::_curlPost($api, $params, $token); unlink($img); if (!$res) { return false; } $json = json_decode($res, true); if ($json['status'] === false) { return false; } $data = $json['data']; $data = $json['data']; return [ 'img_key' => $data['key'], 'img_id' => $data['md5'], 'name' => $data['origin_name'], 'path' => $data['links']['url'], 'size' => $data['size']*1024, 'type' => $data['extension'], 'mime' => $data['mimetype'], 'description' => $data['mimetype'], ]; } private static function _deleteImg(array $content): bool { $options = bsOptions::getInstance()::get_option( 'bearsimple' ); $api = $options['lskypro_api'] . '/api/v1/upload'; $token = 'Bearer '.$options['lskypro_token']; $id = $content['attachment']->img_key; if (empty($id)) { return false; } $res = self::_curlDelete($api . '/' . $id, ['key' => $id], $token); $json = json_decode($res, true); if (!is_array($json)) { return false; } return true; } private static function _curlDelete($api, $post, $token) { $headers = array( "Content-Type: multipart/form-data", "Accept: application/json", "Authorization: ".$token, ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $res = curl_exec($ch); curl_close($ch); return $res; } private static function _curlPost($api, $post, $token) { $headers = array( "Content-Type: multipart/form-data", "Accept: application/json", "Authorization: ".$token, ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $res = curl_exec($ch); curl_close($ch); return $res; } public static function getTypechoMethod($methodName, $inParams) { if (empty($objReflectClass)) { $objReflectClass = new ReflectionClass("Widget_Upload"); } $method = $objReflectClass->getMethod($methodName); $method->setAccessible(true); if ("getSafeName" == $methodName) { $result = $method->invokeArgs(null, array(&$inParams)); } else { $result = $method->invokeArgs(null, array($inParams)); } return $result; } /** * 异步更新可用压缩数 * @param $post */ public static function tinypng_bottom($post) { $options = Helper::options(); $statusPath = \Typecho\Common::url("/action/bs-ajax?do=tinypng", $options->index); echo << $("#tab-files").append("
            图片压缩可用数正在查询中...
            "); function statusfind() { $.ajax({ url: "{$statusPath}", async: true, dataType: "text", global: true, success: function(result) { //如果正常返回数字 if(!isNaN(result)){ $(".tinypngstatus").text("图片压缩可用:"+result+"张"); }else{ var sear=new RegExp('Provide an API key'); var unknownerror = true;    if(sear.test(result)){ unknownerror = false;    $(".tinypngstatus").html("TinyPNG APIKEY需要设置");    } //未知错误 if(unknownerror){ $(".tinypngstatus").html("TinyPNG出现错误"); } } }, error:function(result) { $(".tinypngstatus").html("TinyPNG状态获取失败,网络故障或者配置错误"); } }); } $("#tab-files-btn").click(statusfind); function statusfindsession(){ $(".tinypngstatus").text("图片压缩可用数查询中..."); statusfind(); } $(".tinypngstatus").click(statusfindsession); \n EOT; } public static function getSecurity($typeName,$name,$value = null){ if($typeName == 'get'){ $value = \Typecho\Cookie::get($name); return $value; } elseif($typeName == 'set'){ \Typecho\Cookie::set($name, $value); } else{ \Typecho\Cookie::delete($name, $value); } } } ================================================ FILE: 配套插件/BsCore/assets/css/color-picker.css ================================================ /* rtl:ignore */ .wp-color-picker { width: 80px; direction: ltr; } .wp-picker-container .hidden { display: none; } /* Needs higher specificiity. */ .wp-picker-container .wp-color-result.button { min-height: 30px; margin: 0 6px 6px 0; padding: 0 0 0 30px; font-size: 11px; } .wp-color-result-text { background: #f6f7f7; border-radius: 0 2px 2px 0; border-left: 1px solid #c3c4c7; color: #50575e; display: block; line-height: 2.54545455; /* 28px */ padding: 0 6px; text-align: center; } .wp-color-result:hover, .wp-color-result:focus { background: #f6f7f7; border-color: #8c8f94; color: #1d2327; } .wp-color-result:hover:after, .wp-color-result:focus:after { color: #1d2327; border-color: #a7aaad; border-left: 1px solid #8c8f94; } .wp-picker-container { display: inline-block; } .wp-color-result:focus { border-color: #4f94d4; box-shadow: 0 0 3px rgba(34, 113, 177, 0.8); } .wp-color-result:active { /* See Trac ticket #39662 */ transform: none !important; } .wp-picker-open + .wp-picker-input-wrap { display: inline-block; vertical-align: top; } .wp-picker-input-wrap label { display: inline-block; vertical-align: top; } /* For the old `custom-background` page, to override the inline-block and margins from `.form-table td fieldset label`. */ .form-table .wp-picker-input-wrap label { margin: 0 !important; } .wp-picker-input-wrap .button.wp-picker-default, .wp-picker-input-wrap .button.wp-picker-clear, .wp-customizer .wp-picker-input-wrap .button.wp-picker-default, .wp-customizer .wp-picker-input-wrap .button.wp-picker-clear { margin-left: 6px; padding: 0 8px; line-height: 2.54545455; /* 28px */ min-height: 30px; } .wp-picker-container .iris-square-slider .ui-slider-handle:focus { background-color: #50575e } .wp-picker-container .iris-picker { border-radius: 0; border-color: #dcdcde; margin-top: 6px; } .wp-picker-container input[type="text"].wp-color-picker { width: 4rem; font-size: 12px; font-family: monospace; line-height: 2.33333333; /* 28px */ margin: 0; padding: 0 5px; vertical-align: top; min-height: 30px; } .wp-color-picker::-webkit-input-placeholder { color: #646970; } .wp-color-picker::-moz-placeholder { color: #646970; opacity: 1; } .wp-color-picker:-ms-input-placeholder { color: #646970; } .wp-picker-container input[type="text"].iris-error { background-color: #fcf0f1; border-color: #d63638; color: #000; } .iris-picker .ui-square-handle:focus, .iris-picker .iris-strip .ui-slider-handle:focus { border-color: #3582c4; border-style: solid; box-shadow: 0 0 0 1px #3582c4; outline: 2px solid transparent; } .iris-picker .iris-palette:focus { box-shadow: 0 0 0 2px #3582c4; } @media screen and (max-width: 782px) { .wp-picker-container input[type="text"].wp-color-picker { width: 5rem; font-size: 16px; line-height: 1.875; /* 30px */ min-height: 32px; } .wp-customizer .wp-picker-container input[type="text"].wp-color-picker { padding: 0 5px; } .wp-picker-input-wrap .button.wp-picker-default, .wp-picker-input-wrap .button.wp-picker-clear { padding: 0 8px; line-height: 2.14285714; /* 30px */ min-height: 32px; } .wp-customizer .wp-picker-input-wrap .button.wp-picker-default, .wp-customizer .wp-picker-input-wrap .button.wp-picker-clear { padding: 0 8px; font-size: 14px; line-height: 2.14285714; /* 30px */ min-height: 32px; } .wp-picker-container .wp-color-result.button { padding: 0 0 0 40px; font-size: 14px; line-height: 2.14285714; /* 30px */ } .wp-customizer .wp-picker-container .wp-color-result.button { font-size: 14px; line-height: 2.14285714; /* 30px */ } .wp-picker-container .wp-color-result-text { padding: 0 14px; font-size: inherit; line-height: inherit; } .wp-customizer .wp-picker-container .wp-color-result-text { padding: 0 10px; } } ================================================ FILE: 配套插件/BsCore/assets/css/style.scss ================================================ .wp-core-ui .button-primary { background: #2271b1; border-color: #2271b1; color: #fff; text-decoration: none; text-shadow: none; } .wp-core-ui .button-primary:hover { background: #135e96; border-color: #135e96; color: #fff; } .wp-core-ui select:hover { color: #2271b1 } .wp-core-ui select { font-size: 14px; line-height: 2; color: #2c3338; border-color: #8c8f94; box-shadow: none; border-radius: 3px; padding: 0 24px 0 8px; min-height: 30px; max-width: 25rem; -webkit-appearance: none; background: #fff url(data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E) no-repeat right 5px top 55%; background-size: 16px 16px; cursor: pointer; vertical-align: middle; } .wp-core-ui select[multiple] { height: auto; padding-right: 8px; background: #fff; } .ui-autocomplete { padding: 0; margin: 0; list-style: none; position: absolute; z-index: 10000; border: 1px solid #4f94d4; box-shadow: 0 1px 2px rgba(79,148,212, 80%); background-color: #fff; } .ui-autocomplete li { margin-bottom: 0; padding: 4px 10px; white-space: nowrap; text-align: left; cursor: pointer; } @media (min-width: 768px) { .col-tb-offset-2 { margin-left: 0; } .col-tb-8 { width: 100%; } } /*! This file is auto-generated */ @font-face { font-family: dashicons; src: url("../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800"); src: url("../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800#iefix") format("embedded-opentype"), url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAHvwAAsAAAAA3EgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAAQAAAAFZAuk8lY21hcAAAAXwAAAk/AAAU9l+BPsxnbHlmAAAKvAAAYwIAAKlAcWTMRWhlYWQAAG3AAAAALwAAADYXkmaRaGhlYQAAbfAAAAAfAAAAJAQ3A0hobXR4AABuEAAAACUAAAVQpgT/9mxvY2EAAG44AAACqgAAAqps5EEYbWF4cAAAcOQAAAAfAAAAIAJvAKBuYW1lAABxBAAAATAAAAIiwytf8nBvc3QAAHI0AAAJvAAAEhojMlz2eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/Mc4gYGVgYOBhzGNgYHBHUp/ZZBkaGFgYGJgZWbACgLSXFMYHD4yfHVnAnH1mBgZGIE0CDMAAI/zCGl4nN3Y93/eVRnG8c/9JE2bstLdQIF0N8x0t8w0pSMt0BZKS5ml7F32lrL3hlKmCxEQtzjAhQMRRcEJijhQQWV4vgNBGV4nl3+B/mbTd8+reeVJvuc859znvgL0A5pkO2nW3xcJ8qee02ej7/NNDOz7fHPTw/r/LnTo60ale4ooWov2orOYXXQXPWVr2V52lrPL3qq3WlmtqlZXx1bnVFdVd9TNdWvdXnfWk+tZ9dx6wfvvQ6KgaCraio6iq+/VUbaVHWVX2V0trJb2vXpNtbZaV91YU7fUbXVH3VVPrbvrefnV//WfYJc4M86OS2N9PBCP9n08FS/E6w0agxtDG2P6ProaPY3ljaMaJzVOb1ze2NC4s3Ff46G+VzfRQn8GsBEbM4RN2YQtGMVlMY2v8COGai0Hxm6MjEWxOBZGb+zJArbidjajjUGxJHbgUzwYG/EJPsNDfJLFsYzpXM6Pmcd8Ps1BvB8LGEE7W7KSzdmGA9ifgzmau7ibcUxkB7bnHhZxb+xDgw/yYb7GU/yQp2NgDI9xMZ61sWVsFZtHkxb5+ZgQE2NSdMYmDOM5HmZrfs6H+Cbf4bt8m28xhb2YyjQWciDHxk7RGg2W8DFWxbyYE20cx/GcwImcxKmxWYyIGXr3l7MPp/MAn+PzfIFH+Co/4296Q2v+wdvRHP1iQIyKMTE2ZsZesW8QSzmHi7mFK7iWsziTs7mIG/gAl3Irl3Az13A117GeC7iSdVzIjdzGMXycP/ITfskv+B5PRk/MjT1iCPuyLAbF4Jgds2Jj7uOj7MmX+DI78hfejBa6+Kxmekp0s5TBXM/kiNg29uaNmM5p0c6fmMmMGMbLMZS/8w2+zh78lPFMYFvt9Ul0Moax/IA/s5P2+hy6mcXO7EoPu7F7bM1feSR25wzuZAN3xBasiJGxDSfH9pzLeVzF7NgxtmM0+/FK7MLrvBNTeZSXYlP+wO/5J//SV/2O3/Iiv+EFfs2veDf68xHOj53p5Yt8n72ZG6MZzhoO5wgO4VCO5CgOY3VM4S1epYxdYzKP8QSPx3xu4v7o4Fmdydbo4j1eo+IZbdaW/+Gc/L/82Tj/0zbS/4kVue5YrmzpP3L1Sw3T+SY1mU46qdl05kn9TKef1GL5J6T+popAGmCqDaRWU5UgDTTVC9JGpspB2ti4TOMmpmpC2tRUV0ibmSoMqc1Ua0iDLFfwNNhypU5DTJWINNTQGqRhFos0DrdYrHGExUKNIy16Nbabqhhpc1M9I21hqmykUaYaR9rSyM+7lZGfd2sjP2+HxRKNo01VkTTGVB9JY40HNY6zyGs23lQ9SRNMdZQ00VRRSZNMtZXUaeQ5bmOqt6RtTZWXtJ2pBpO2N1Vj0g6mukza0VShSV2mWk2abKrapClGvtumWuS1mmbkNZ5u5HWdYeQ1m2mq+KRZRl7v2UZ+9p1M9wFpZ9PNQNrFdEeQdjXdFqTdTPcGaXfTDULqNvK6zjHy+vUYed5zjbwee5juHNI8I++f+ca9GheYbiTSQiOfp17TLUVaZLqvSItNNxdpT9MdRtrLdJuR9jae1rjEIu/tpRZ5/y6zyHPZxyLvkX2NtRqXW+R13s8i780VFnmdV1rkc7+/5SKRVhnPazzAIu+7Ay3yuh1kkffdwRZ53x1ikc/0oUY+f6tNNxTpMNOtTFpj5LNyuOmmJh1hurNJR5pub9JRpnucdLTpRicdY7rbSceabnnScUbep8cbeb1PMPKePdHIe/YkI7+fJxt53muN/L1Psch781SLXPNOs8h74HQjv4dnmLoL0plGXuOzLPL+Otsi781zLHINOdfI8zjPyPM438jzuMDI8/iAkedxoZGfcZ1FrlEXWeSzebFFPpeXGLlWXWrkfXSZkffa5Uae3xWmjoh0pak3Il1l6pJIV5v6JdI1ps6JdK2phyJdZ+qmSNeb+irSDaYOi3Sjqdci3WTqukg3G29rvMUi3123WuQ74jaLfEett8j1+3aLXIM3WOQafIdFrk93WuQ9c5dFPmd3W75G0z2mbi8/ah/1fRRh6gDV85t6QYpmU1dI0c/UH1K0mDpFiv6mnpFigKl7pGg19ZEUbaaOkmKQqbekGGzqMimGmPpNiqGmzpNimKkHpRhu6kYpRpj6UoqRpg6Vot3Uq1J0mLpWitGm/pVijKmTpRhr6mkpxpm6W4rxpj6XYoKp46WYaOp9KSaZumCKTlM/TNFl6owpJpt6ZIoppm6ZYqrxpMZpFqrvxXQL1fdihoXqezHTIq/TLFOnTTHbUJ0tui3yGvdYaH3LsNDXlQ0Lvb5sMnXplM2mfp2yn6lzp2wx9fCU/U3dPOUAU19P2Wrq8CnbTL0+5SDjTY2DLXe95RBTEqAcasoElMMs195yuKH6VY4wJQbKkabsQNlu5O/dYcoTlKMNrXs5xiKvwVgL9RblOFPuoBxvvKFxgimLUE40VCvLSRb5Z3aakgpllymzUE429J6VUyzynKYaL2ucZpHnPd2UcihnmPIO5UxT8qGcZcpAlLNNaYiy28jPPsfIz95j5DnOtfybg3IPI89jnpHnMd/I67TAyOu00JSzKHtNiYtqoSl7UfWaUhjVUlMeo1pmSmZU+5gyGtW+prRGtdyU26j2MyU4qhWmLEe10lBvVK0y5Tuq1aakR7XGcq2uDrfIX3+EKQdSHWlKhFRHmbIh1dGGamh1jCkvUh1r5GdZa6E9V51iSpNUpxq6d6vTTAmT6nRT1qQ6w5Qnqc405U+qswy9l9XZFjo71TmmdEq1zpRTqS4y8jpdbLyi8RKLvP6XmvIs1WXGOxovN2VcqitMaZfqSuMljVeZEjDVjaYsTHWTKRVT3WzKx1S3mJIy1a3WN8fbTOmZar0pR1PdbkrUVBtM2ZrqDlPKztdlH+Vt6jAlb+qG8a7GJlMap2425XLqFkN9Rt3flNWpB5hSO3WrKb9Tt5mSPPUgU6anHmzozNRDTDmfeqgp8VMPM2V/6uGG9lw9wtCeq0ca6i/rdkP9Zd1haC/Wow3txXqMoV6zHmtof9fjLFRH6vHGWxonGK9qnGiUGidZ6EzVnRaqR3WX8ZjGycYTGqcaj2ucZqFaUE839N7XM4z7Nc60yPOYZTyrsdvybyfrOUZe7x6L/PPnGu9pnGe8pnG+UWlcYDzzb8iLsxoAeJysvQmcJMdZJ5qRlZmR91F5VWXdZ/bd0511zEzP9PSMPKOrS5JHEpJGI0uyRbUk27KMMMuitVU25lgW+cAyuGt3f17A2Muaw6bHwMIzC5g15jFlMNcaA7vAmp41ZtnfW1h48PbVvC8is46eGZnj97qrIiMjj7i/+H9HfMWwDPyh/wddZTRmnWEaYbfj+cl/F4dYcErIc7BgIAHDv9ftdDtnEASbkL7ZRS98qimf8DXL84pOsbr/qTWMc6Io59OWVFC0WiVfkDTFUbEr5kQX/8mnmgpniLqtmTzGQ7gb0rGH4Q5NKuTLdU0pSJZZUDHOY0yKFpfvV9CvMCpjQGyziBwdVddQaxvZbYyY7uVO5/Jzlzvdy898EP0KjXYuv/mxzvi3Pvt68ih9fohGTJph7GjTKyBHWEa4Xas2T6NWZ3DoFYteNIjcYhGNiu4VtzgY0MMk7y+iX2fKTASxTrsTNsMmruIN2hg4aZJtRFql20GdbvLv+cW4vdBvI4RYLKqYU+or9XVPVZRUyg/8SMnUcjl//ICnYlHgJT29YkoCVvOrC+iHUqwoSIKEkODnc7WMlgm8IMOynpI51lipj39AdxQ/LemylrKkak3J8VxS1hHUM2SOQT/WBOzjUMBurd0McdhthrV21OmGXb/TbUeu53d97PkR3uy0mlXB8dDoONYXOgte0At8OOq42xWMhU7o5XuBB0ddOP6l8urqzurqKOeH8Q30CT/YTZ44flzQQ5LwArltZ5UUKUXL9Qvo5xmJ0UkfICgWlMdvR9h3K22/XXPRMMx99KO5X+i3hsPx1VEfNZPzaGF/f/+lwWD6nq+i/8x4TJU5DnFoYQPpCAYs1MBATRiW28hLkVMyWh2vg7sevWWNpdd8GMzeJvqsaxhu6J7IP2uW18xnsU5OTvz2PxctX/xO0fTVZ0VI8o6fWIb7FtzjhWetyir693AP3KjjZ821svlsnpwYxvhL/1z0TYRpGNFUT9eXZ7dWSLE5WvZr6BpjM3lmielA/7RbzWUU1nCtKsCI9KLKZifc9Byh2mx1/MiKI9EmNA+G7pqcop6hLFf71WXZMGTEKMYw12i0m83RgISBgHv9KI4dXpGNKDJkOBifbLbJXeH4L+nd7LvelXuExqBYUjzJ0G8yPKPADHOZHIz2BrPIQPch2lMGCtswWqCjfHJeilMbPgwtGpArFdKNb37zm+3BINj7+n5/t4XpyX+n4XjQv4r6/auDFmq10H1PPGE///zWQw/bly61lpf3Hn88/fzzaRpGj1y69Ah8dyL4S8b076P/RtuN9jiGDjfYGoznDkw7bzZ8fyJrWdnCPfVjvWYv+6tprZA5dy7UHSfvOOjnsufOZgua+aD4ePQfG68twK3fQi7knckcJ/QhRdqia1UsPnIrVjREzPhwdJ2JBqg3Pggi1EvG4GfRLzMYWqkGcWiITpHF0Dow14GqkG46g9qtbscnFwyE7rv/2P1CxuF+079W0kqFzFNlpewpZSx9FpJtHt+P3gd3YN7xW4VrriaJZcWDW96QLVQvQbKdEe5PaNgfoD9mYDghyKxJhzWZSJTINGOiHHY9Os6Rsv6D6+6G5Vi8trZ9B3ayaU/W5LSB79hedzbSdppHB2s/sK5xEN1wyS1GWtYkP51x8e3bSfp0zo3QFRgXy8ztMGqtVrNWqQquFY/YRkSG7DKi4/M0qpFBugXV72x6rj9/VkDzd7bRyFDGB3QM9xTjOpNVDEPJirI4jQwCcjXACg5IEon0UYukja9C+F2GazQFDFWHyMsk8shNKZN5N2IRrB0R8wBzGVaAqo6cItrcRq015OsIr6Gw021WsQALXgER6t6EZux2Qph7ReRvdrpeClK7HZg/zRDuhgMl8ckS6cGITAG9F3Cne7j97Pb2s28nwTt535RWSrwh2YLEsaInNyqcqAeSXpDa60GR5QwO/x92iuU5JImKUMAqdLaPc4WgYpXltMln3DvfbZQk00McyyRvheCjVh6XI81SBFGxJA1xWgbZnosUxcgG9omKKWrjrzielrUlQ8EplktxUr6TFnguldILS0iqr4Tn0JsESTM4RWFg1s/aaAFWjlPMG29oJRtinS40BtS0RhpICGmjkVUvJO2jo2YXmsrzyaXmOnLXYCKQxvPIdCUDFK7FLUf+BZc0IcS2WeiAuTZTeUlkeV3lUq7Ga6JTNNQ0JxliKFsPWTlWQk7uQmpTcQRsBxBWNZ9nWVZjOY7n0rwoaBiX/BrmIDGFrbKSYhGbUrx7X3/M9eebcPxLWEKiyIoFQ0urCPE4lTJVhDmfFwsZS87ZXAlaS4BLLMe77xQMSYYsDF7UeFbiBMnzcx5b9FRXF6DAdU8xpAa09tqWZTptaE5rrk3TTIYpAK1YYNZgDJ5gdpjzzC5zkXmYeYx5A/PMDW3NR55fa3bbMLIAXvm1dujWyFgjIYZvJPiRW2v6pAlDWELJ9D+N4ABXyHUYpPCGELoJQpKSglO4kzyJ55p6/Ndnkdg1vti0RV6V2Mdqtwui3XyMlZpnOaMrBo9dlB4l1565wEP6ZQTpKfO4yCLpuJFqrqn+sfL/8tXVcnlV9TdKf+lrq+Vj8038f9eqlR+7z2hoeq1aO/8N9xla4w3na9Xz9Ur1wvnqbffqDc249x5I1b8hSa7Wq9VKfa9e8JbPFurL4/9aK3or54q1JW9Kh2h7nmTuuGl84s5kbIUwKEndaSQeeHS0wsgssnS+kqGKJ3fPtUjwNGAuXUqrvMilMvbpNdYo2Xb/LCBRjktrupgXZFHXontdG/NVuRMoJtAkTeXE1JGx9fndlapnq1jGHAFfkrxoq2pu+96Uk81nChYrcDbisF7K6apsqvfV1pqXli1d0hVBlmd49zfQFxgHxg1DAE6yqjRhvmAfIA3vJase+nj2Qvm77E7T/pimbZ4t3XXHXbI+/jD2DMMDBJTV9Y/Zzbb9L8rnN3XlrjvvKu18GhsE/Uzz+RlY9xxY6xlUJQ2yDjO5s+l7CdjHXUDbBTqDq+RiGzB3hBjH0CSBSwmW07MtPgUTQjWcC4VOOVerHrv/WLWaK7ZLyNYVW7e0Zr5czjc1S7cV/dx6tZPfwRIviryEdwrtygSffwHquwXHJmE0CKILm8YU2QHJIFgWlxCBr9toHU0uzI4Avj+j+2njkW2T41Kav6Zxosw5mllWXjl5SbtvLS3sfFAVRN5NYSWluT6HZdYIntR5AX1GEwT99QHQwxQGTKqlZIFzBcxrr2wL6bX7tEsnX1GrmuZwsshpGz45GKcfUhyfFF2gnYbRb1F0WwT0vcXcyzDtShv4AjZcY3G74ls1i9cJAWwDCoXx522jNehZD+gfjM5tBHO9SwhqkRDOW6QhZvtU67zjpHffsHmdObyKHta6gSqaq25g38/JmIUVBF30o4zAszLPLVRsJSVLbErncmdLgsBKAt9ZDdI0zY6w6dkPvKm1cVtGw8F4iPq/EdiaID1hibLW5VNIkgUkKk8akoBkmUdQXM3iWUHm/K6t80iCvJBQtHI8yytceYoTrgBOSAEygkXFrrQrqF1xMRx7qA95RACkaGQAseGwH83G+uQ5QBcVyydPHoyHMMyuMwckgFv5G95vAB6kediAOhsRBPDlJ3kdHqJsD/7G1+Yy3IuG0X70NcpaQNOyQqZHizp5Zjh5pgsd2k3yPdwfAZOyD+hkfPUK5DKXx/T+Btwfwt0ufNHBfmv6wLWoFTGvXj9aL8imFlGIHZevB+HhoNdLyrgfDYd/R91c0qoDWq8oadoj/RDjpF9DP8eYwFvdxzwKJRZqMOXJKh7BEg/TrNuMuX/AcQnPGwJMAoq6eQYR8ttuwVivEaLhRICaYKDDNexWAQH4ruN1XU9nARG2W+jDd97/lsspjl16+vjqgw0eL6dDI4VYw0hjWQC8YhhfcRd0Q4ZJVeU4nWP5XC3dyJR4vAJPuYEmppaW/Ry7cInlJEvWjG8tdRCXaoRBFgkpX+RUJMC6X5M5xGqNFrLSrsyyJU7Scj3ADRmF1dM1zPOsZrCaZfKmGGaUbO2fyWo2rVjmMsOIU16atKMJPFEWaHEFuCI6RslIwW6U8GptwLpd4K3dyZe0+WjcR3vjq6h1rUdY4ZNucbhH/0hahIZwuRf0epSfjqKimw32WnvBXjDpw2uzsYMIk1yxKg3CYR2OW1n6dDBEw1arB3MkCBIaegXKKxIZhwUcAhDKw1Y/OjiI+lCYUT84OAj6zFQecgXtkVFnEylAOBgM4EbUHwyyBwezewaoRWYo8DhosNdH0f7+7BrhCURaNpoVnuWBgiTb6b17cC9P3kNuTXJBcZ7Te3pQHpZKn1APhvPe1x/Np9uuhLRSEYribCaVO5oH4YF8PKRZJDlMrtP3A8CGyYr60/cnbdaoWbQa4bT004xuarMG5X6TCgxvarMeyecM8g/2+gfD4Q3pCEco2BtBHae079MwroDTtr2YlfO9WIBEVgmSoBOWhEJt36OAu0kQ9e9hFokqm0qrvl4IZN8vFng+W1jffMtl11akU43mDm4sSorI1xcUBf1ECnNKWjYV0ZSCjKDywtnOyehksZRqbyxF6/c73idMFKQ9RxcKlj2hR59Evw6UKAPlC2kJfbIA+6SJ12FMYJ+MfsLUhZMItJ/fjRp+F4e1b9D1Vmlrq9TS9ai8tVV+dOnUqQdObS3HEqRzlfbZ+s74z8qdnfoO+mfxfeT+cgT3/+KpB7fg5mwsRMqfUL/3xHee0D54ImmzX4dylZglIg9gdZagO8p9bLNrrE4Hmb/N4ma7u0EkFd0memzzJI4uv3mjvqktSQvFxgMXQn717gcu2Mdekteyl9+8LaJstvcC4tBPwtkbTuIgfbKeK22aNr0Nbm5m7v1gZvOk8EdY4V988WIHsTOaPQLqKQIuNQFHQf/CZOVxFEbJl5AKBOtYfzzid8SI38HwFccjSrtHe9ksjCHyd53IF2MsgT6PPg84YoFpM+cASbyRoKIEruKQoB0ikY3FskB6IblBZbFwreUTmEi6gkoHZidCtZtgSALunG6z1gFcAo8ChiQUXgBSHTkEVaInK2mP01Sd812loe1oWtrQ9ee0hvIRT+fG/zMSTE67y+QcQXiO1yX+OUFbmkQ5/RMQkYXnBD3FvVkWRbG44KQkvZ7VBEtkFcWtB/UsSnNekE2pluundX0HOADHAG7gLZr2MU7XT7R4XrvPFPQXBI17q6Bq3HMCWhLIgcYvvJVX9NRbgHgbb5btpbyIFUkLmpqAjaLipoNcY4Yr/jX0jUAkJg1YjmqwBLVblC1YQ1XBdQBmFaCVSIetIcS4xX7xxaUqAt4x7Zt8dZnNuyjyC0Cb3eJvbNW6MiuximXBlBK7jeN+KO/siM052jAkXB8iazX5EqFeBfKroUGvD6uOjvq6gvot+NOV0UjRp/Laa/Ac4Pxuxa3A6mi1OhHQeiLR6loE4xNJy2aHiqBg6pTJUTGMbWA94NOLVkuoVVodDwHVP4ICgqvHhzwVnKPp+2FCo8hK3r6FrBp5e1RBwyh+5+EhkbCgAGDX3tz7pu1I3nECxiJjAxyB8rnwOSr3EWoTAVByrIaThDYVAfkTMd0oWi/6+cAtFt0A8tA0CKJJJFgtR0PZIBwKOjyIiuue1ysuFUmSfJyjwp9WHHLHyWEvW149OKAMjZHMHbJmS4zP1OnseRuUmXR1t9PuNP1OE2oOk8GLNrudIxxkqhpLdoC9idUL3dm923AVGKFOd9PBG0QgC8QYLpK51N10McFDRC5C2CcBw6vpC18omTkO4ccE3TVyHBYs3TO01e7j3e7jz5Ggu3B7lrO4Uuvhpx9utR5eFXTHDDiZswyn+GjzfMbyMR8UzaKt8Szp6nwG81kvqBRE4XgtYxpcfmV1c/2e9fV70JNL3Ubt7Z4gCx/JlV1rJe2kTbSc5APB+IVCjnf5Ns0IgrfTu2yPrSOpnGM5JH9T2t/2bKyzqRTiX0wvV8sriqyXuML6Pa+7Z500a6KIgeGgAhJqAq06xewyj9+gjfHnmxQfvYKLMFbwNnCQTUzGARkPRP9A5RxRi1A3gw3pCghgdcLOI+bC286ff9t3k+DCuefPnn3+3SQ4t/XU1tZT30SCZ1y7FOpBZeVyaWVle2XlHs0xVMyzbNk1sqrU6XQaviXyLMpxItZVU9FYJnkhBFryQgiyyQshWFHxRjnwhIVcaSUgL91eGRiCqaU1Q+3kHXiZ224j18w5vl0PfJrfhHZfgbki0hm9GNNuuxVCq0B9u5MIbpOpUIgT5+I+UKcbphE8MFHFbVJYsA3tOtE2uXHznkZTdd1hVjZNx9gL6BzaiydGcuhvLPhlL/DK/sKG7S6JtqfaVaJFEpcWDkxHXZIqtmYcu/j6i8d0wy5Ljqc66CCTkwuuacjJ8b2PKIYpHw3M/Lp+xvR9c3eXhGf09eOer6WwxAkCJ+GUtvoWIWWxAD78Xn49l1vP93zFklhRSgkz3oOsoz5TY9aJlHkiR25S4gHw2sGU3vAVEtYqFHbPxxNqBDdCSHiMLn0DunTF9DxzkfXMwPTYRTgZ/+85IXKdKFAM5ToJtymVySe35uEE9aCxME8qxWPSdnFD9uLDruEZk4sQnfAMA6iHDr2/ypxmzjLnmTuZHh0DzXUK59xkJMyfpqgmKB4FUFs6JubPw66LzyDXQPER/6Eqaqqii6q/6g1VUVdUTVS9Vf8VQ45IdSLZGNKQnh9GwBomH/QmM5t2LctNZ82sbWePnI3/dkQeGZFXTGMfCSL6DzglaMF3uq78FNRznWpkiEIG10IhFov7BE/4AvbbaywlpmSF7dJlF2gw+u6qFBiR95rcbV7HCKSaZbP8Yg4bUbCqOCvbq7a8FrRNKb/IszZ6In1XzQvYwSCV82p3WxIyjcoZ05OffJ+49ZqtWg0C8QOvF7PmTsUwETO3Xo0YjeqLAOz4wK/FiNoOuyGGDyBXDGwPYo7dv1Qe991cUC81R48/rpwU/lCNxMcfln/gY2i0Uy6PD1HgZJy86Yy/4+7b5cpz2jdmxNvvVJ5+dkoT0RfRLzH3MA8xTzDPMS8y38F8ANAGUeKtI4d0sJEIvdsT+NUlgxNaCNqDDtFooh1JjvFAjm8g497zw8nS2Z3QTaLFJAMDhhGMEz8eLXESzJPO5Nyfi6Nf8FbP+KIqpSVbIpyApIr+mVXPdNI1lq8EelPiyJoMa00LviTKSaEWVDm2mguuSSYZ9A/FS/N5HtYm+Ka4gHuNxO3CJBd2BfzILtG5kKBEcQgJ/sbfWfW1Zt41RYUXVNF0cw3NX93xZU1eP6nq1ZMuLDuwxGvkWS0O4ZQ1BPdkVVdPrpvWU/F8i+LDBzgVgA+f2hGwCAhzCyuiqOAohkMJLTlEf0TXKTIHATtTxEygMqxDs5NOi5g1kI6aImPPwfz81IQGRYpSVt5PFHLvV9BptaS+T/VJ3HwjSXvjGlHlvZ8E4y8roqpIiiA5hlhFv6Mo71dLPrl2WonvgOD736iUfRWeou/wS+p70jnbteyMHeh+fiq/eRl9gXHpCsKQqUREr2GXcDmeTway3zQQgTCwWgKxCCn2wB7KfmN6uflAczn9gn6ieSbKamo6WN/4pgyAtoWglmnuOIG90/R8M0QXf6Pu2bZX/0Imh+6ub7iKId6lvmOFy6653x14q17AF1zgZyhdZpk5mZTP5IDzqgE/uAyzP2K6zBZzhmEIYvVr7Wjyxf+AOJGYUElWP4r2WsB8R6NXj/SJwAr+WKZHDtGA4OnWII7T8HCfxOZli7/KNJg1qm+Pp2IN+y4O292wGuumCBtAFk8CCrsA9SiAaaIDzcooQdpeNIMgveza2YyMJZF385X1zQvbJfOgHqqNVkMN790pe0Vd5FIrlV4+36uspDhDlUwtY+1g4BV0jNGLJ+85duy+4zP53K8yAZUUE9kKnqAeKMMWonpcWlLCS4fT4lw8HgTH12F9S/mF4nJYDJeLBT8lOO47F+FvUhbE9Or1nuo7DX+bZI7gK2z7DccX0ouL/+ekGNNyjKActzN3Q+uQpqkRAUsVC3F7dD1SlHYLmKcuEUEkIIOQNShTZ9KcIVGdxv8wZXwoNBqaWb2EspcvZ08WskG5ura4uFYtB+O/MhqczYsqLyqGnQHWTeMaJUfLcBxiBfNZU2ARx2U0Z29ra+tQF1KpzusuHw+8E3eIooAR9JUo3tE5rwoZK6jwgoB5nLJM1RRULKT0QFP8ghmGZsFXtEBPCXgleOWV6Ti4hgYwgksQq8zsLU4jAKExiCCWQJDkuUT2TMgf6kPI6+p4qOq6ivqqjgZFl16C4IAkDhRdVxiqtKH2A7GsZImi4/PMa5lLzOvi/CbacuC/mqmbpCYz8cnXuBTjQapXnyZ2iWxhcJ2hBSThoWbZvp3Wjhx6WhoIDJxNDukgnX7O9h04rUCib1vZ67Cqo9F8ZcffBhfgcxluBJj7UHw4uCExk7Gz/vdoaUe5RILjSfpDpEm0ZC3+EtCN0hF6cRsdc/cy98d8qXV0DXRrFBWRvqkK/lzcJis5kIstRMThkYtviE8oC3Dc437PL/l9+B7GK8NBfKBkBpjwPSApyWFICQsajgdokCVwLkvDHbKE7ZD1aBobfwuRm1+jJCdLiU1Aw2iCBW6u6z+sfu2K241VCvQb1wMwaB/A5y3qMWwNSbn30d7fUe5XDg+zV+gfMzcfRolNDWBnGJ90EsTygW6UmhrVDO5WDVMZP6uYhnp3rx9RId4pmOHq+DeUdFpBa6oZjQ9OPXgKPvP2IsSWhtjbkXpYNVxzuxPbpmEPDa5Fg2ul1dUzq6sIyDaMvqB1OEpMxhKbDfRtgKhX6FxiGk6i8OzW1lhCtWsTdEwbNIrDuB0rVMHmT5lMtAMtCA14eRGv7VTD4zhtFx1NbGzWL9Y3G6LmFMb/QzpXcyv4E9B+Jd//KHAJ8MRT1cgTcadZtCu6k200suTr6EW3VKvLQtknAww+Ezz8x+h/EK1fN5HeAl1M7EO2UaxXpclNCgmbVIabcHaYGlRgYi9IFYRHokKUvufC3T1b05S8bsmOKWmeKuCMVlJ9N49QvaaJMse5Ws4GUq+noctLxYqb9pfrHOIlrr6SNhdKHMvLXDFsWOkFs1qK2mWvUijIImfpHAZ4Y2IuhQQ97aTLnKcVlBNphfV0gDKqKRlmRpJUtbyaSUkim8qs5ooLHitjlnXDO7bOMsxMXzECxFWFsc90owln1rYSRo6M/gqu4ckYiKaD4XDCgFF+pacYaLd/qMVd8Fcm6TiPCngUxNBDdLDnQdrkMyfnGhLrLbtC5psPE4hIzPoHrSsB6sH46rUOZ7wmKWuBacIsPU70OVQoUaWrF4YjDjuzczQpKD81zZtE0EglUNXUntXKgdBJERSr7qJ9hYLk8X9SiA7e+P4YM0doS8joZPEwssIPy2k9lCRidqr5+DvRIIa2B0f4y+lcGs3rEOk/mVOjvagf7cWKpGB8OBrN8T5lZgNijoCtCmE3OpSB9qnoipySo1tEKQt7iZghJLo+jEaaMn7Hm3hoVtSAZRVfNjwT0IuibTwoQEcsKjD0LqKPKg43/sSPSjIhNxxvquxH1LTpp1Ip3h7/S1T4PrgCTDebxuy75nEY0c9QCSkwhW7oRlPhEGI2Lh4bXdm4+OT9x47dj5iDYxc3hleOkZMnL27EfDXLoDFgz1Wmw5xktplzzAXmLoKOPaoogVkkEDRPBN3rKBFzA49HzeLaa6gGM6wm+EnHbRoIkBU++kUbNaOUV50sQimOrWP8VdEVfxnjP8Oup7/DAGjCskjVJE9Vc/eLtIt+KP2D6V+efn/A/lz6B230V3WWwJmMq+bKel104QX4l+FVXxXP6S8Zdk5VPUnTUIpNWSLtZwueege84aW571zfEz6mfoOczY4lbLG0DZgC7APLsoEdxBx/Xbf7uudJcHzpwtLShQdIkEml0Au9LNRslFyEYLyfXIXgO1MIdS6++CKvzPPQQ8CGZYbYPLeILBSTgErN3RjMAB8adgkf/SJ/aqmwoRpK0EzVVtp1BFh7/Zcu1teerKPAkJdOl7N8Iyezwma13ulcaH3gtfW119fn5m3lVXLZQu1al8xlSsdvzOZS74UXdh+BrG7OBK70IKN52pCDY+vVq4Lenjq1VNzQZW2uEqsoSFn80mngZ2flvz2a0pFfR78FfXMnc5H5ZrLSUeUCwWik3JR+ABV0CblI6lJt8gQwd6iomTAePiH1XWroFQe+12k3G1N8Rwu8jNzYaN2jGgtPoAnkCpEeVJv/SpRVCTCwkTZYRVUV1kjDoiAi2VnLK36KXauH95cKWSwWyk+t5DVdFRSFNWXTcPzU+K+XycJ9SknBQ1gWJUmRiLxZSxsp8i6k5SWJZWWlgHlN0bEti4Yo29iQDf4Zt1jAjeWF16TTWi57d2OhWDf8vJk2RU1CuiCzrO8ET8bI4EXexrqi8bgAr+NkKS/y8Ir4dbM1hPQTBh4TRl03AcyNmA2HlZ2qRKKQtK4LLdkvekRnMx4V3QM4/H7YbofLGVtR7MyAkNknHRKOogc2Lzu5x4LpuP499HuA0pcSucBUnRZLBKhdEZ/YLPqxgeMZFKLPOW17HeYrdjEeiI6YFkVjzR5/ryMJMi9aaddVV1Tbeddl9DnbXktjnIZ7B6KYxq5ordvta44NN7hu2hJ5WZDgxjm6OIhtX7qRVbPh29sn5iSxrQbDHFnfBBhlDbdrAfFEzHAI38ceG1997LEb7kF8G1t+G42uT25CLbiJTeSTwyQ/K7JIfkQ91aOmKOQ7zY/cR/TlGoqLMiSq7CltuEJl3Izt4nal7eO23+66FTfsuoMIZff2gmh8bW8P9XrNj0a93WiYHGfl3Kd2DaQmoVuzIrdLjAuAyx+h05fHo8uXX3wRRS++OF8vYnNDauW3ocxtPBoOye2foVV78cXxVXL35P4gtgWwI8igFu0NBlAUgpjn8SkP6//5yT0NOvWcmIslmpxONyIrB2FxiRiTMr01eiWWvU8vRERwQHM4L+sZ03XNjC6zKSnFcjyyrbKlOarKcXII8A1WEJIuiaqoKBBIHCfxyNLzcel+l5PTQe11tSAtcwDmZFZK1zohAAaJk2XuPQs5XUQSL6UEUbWWLFUUUpLMs6KeY+b3FxApzXGCme3KBNcLFNcjAEaNVoxOyXaCmOndjBUwcTI98XHFrRxHL2tOWh0/r9g2+nZiEQUcuqSnc7pK2M20qSmiwPNQFNWsmyoU5o/pCDq0lfHvahabVtGiYo9HZOjsyTKVoV4h3PKeqXmmY8LH00wRK6L024SeitN+0RgPOChih0w0jncTvSjBZ3S1A1pgT9DXzVASd+NNEtNNFJXplZiZ2ew8gXbcDF3+Mp+K4dmjMTz7TzFoe+nrAMTtxXG0HV96m0GNKfu5czW6uh6vnUPZOK0VI7X48563EdnAcnc+rRe/ipnTTYqMA/U7BjzwvWRVn4h2gYUltmEA7dq41enW4tr6sN633VildpqqJWEMzieRIRmtEXNBmob6MTm3KFvaymcCQFYPXYaA6nWOXfTXgslJZUW+HDhZ7uyjxy4iJibTsQgtCoptR89oduFPdV/vaRkdTnoQfZOgZ/QenEBSFATaos8WbXJhrn4yrLRrgNFuI/jM/sdXJZo2jU+b5fDvXZnvi9tgiUgIUf8fWpW4IQ56u7ukSvP1Kty6XjdXA99Y1VvXi3Q5Dif1+sjRysxquXFDvaBve7uzer3jSEX6R2s5uLFeQOppxebHoworLtmRdPv8eHSPjsOv3Vc39e1kHP6T/datqzep08asnnNjMLh15eZ6aXC0nrfspzv//+mnkFrI/YO7yVy+K3359D+2n966Ak9vz+tGVVqvM6SP5sD/TS0f/p0JlNuaFPrviqK+nsmRYkJweLTM/Vl94KDvkavwTQ5zmG5ELSfrsxVpAmgr7QQq0/WJJ9KvCPdQn0gEBhHZFQTs/gDO0MPjq8HhIdkzdJ2RgezKQUAPRH177cqVYX+ebyFtlbmRYwrn9X4zLumne71o8jnCHR3OXWDm94hhRidWjxE1zfXJDI7aaC8aX23t9waDHuCk0WjY2h8O52wlfx19nuzIRMTGhAzGyVZaujuhGAvbO/EOrm0YeGRnG6zFnSb6abVQvuvsome7fNrAAPEVwRZ5XledQOSB3xZct1sweMPJp5csQUYve7aTquzUC13XJdt9eDlnqzrPi46gmIIi6K7g2h5b2jElKTOzF/499AcUE9qw2vrddRb7tu8JBkv3sX6k8smqUflk/csPKEj+fz9Z/3NTrXxf5ROQ9ok6Wn5AKcrj+if/pyKlZjj+t9FvA75KA11h7JpVadfIrDIQAL12t9M00Bnk9wHBjtBTFTEjQc/uYXa44791EQ3GBxG6rSKyOBiPhn0p8z3+zlsXJ+/9CXQA8zvZQ0oKCJjdI8w80eqip85LCI/eWxzh3On35t+z9978e9EPn5ey4ucL7/m8iO57X/59PwVp0zk1s7WmVltk/PHJEfWvoiygnmx8AJJElFM0ZL7W8/7k+egwsUPv3/T4qz3vJ/mTIzo4PCRm+TS84fGkLd4JmNiAFi5BG1sxO0j2FhAGF7djARyONqk9xPAb26eDohds3Vaq5YNMEC4eD/KQDG29WmlilgsLK4vvvssK08eXfG8OcxP73ijG9RExFjscDK6h4bXeXr/HzMsJeGppTq17bbJBAx/2+9nhsEdD1O+TXb3XGXqY42euUJ4c4He35nb9ShcazweEj6M2DiuY8DgfOHmy3C8/Me4/AYc4joYQR/c/MYbjXvnECQieQP1JfGqL99FYZkLkXgImwnSK5qlQD2YbEa/HWnmAxcxGlNaX9l/XsOwHP/CAbTYe23dVU7Qi9E3d9kYtl4P1qBquv+be+25bDytwpiuGWdlod0lW/LQuRN4d750FnsKtQaZhF/OkLn7Kx1C5CqlleDAcDvZKx59Ezl7pyeOl6taTpfEIolvE2rhfevLE7f3SiSfR7ZXHT5T6EH183qZfjTWZM/IPND0kBnbAqBLBBg4JGoY+BwbWxYkQoYoOEmIOwfcvqJahGJpXMCuNUsNwdbGJ9ayuZ+eXBUXRXeD2bdmo2MWs5RuKIt0rBCqQ+ilWv5aMXzIbParNrBIZCLByRBsTEaaw1iDR5Bslx95h0O9H8LnOHB7AMA/6ox4Z4kE224suPULgZ6/V2o0ich7N2viGvREomW0TXUk8a8jWiMM+0G6YNjD69qiqprXfn7Ph/hcxL4lgduBaN+rCF31L546O8aMmDWHSRdFhazpPR/Pz1AbWaP4/Fr/Ofw8I7qYqoUR/fm0qv/0a+nNi4U/XP3d+G0H89V/lGtF4VZI42RUAte/3okE0aME36s8njAbZEcpCFAHbPOj3e63p3+DatdHBwX6U/O3GqXM6Irpyo1o83rYQVVeR5Zou5TROkZIPLHzv58vtYrFd1kzbjD+BZJrmAI1K7TPt0r5smjKKSDge0XgPbtm72mdmtnNXoG3uZy4zTzBPMU8TqSCwpDCHHYOsuLVuwpOvI+KBoSoQDwcdv0kn9wakwwwgUu4OoXs4hhk+NTskeLUauqS4rdRml7wL+3w0Gz9okDJYIcUv3rFSYgWWZ/mUgkUeiYhs+dwQZRXWUlW3dZno1JEp8KoIHDyHeJlXeMzLoRdxnJOuyOO/uEb/UImFl/Apll9Mp4speI6XOY4kpFhR5j8mcgKv6ByWDZ7VeJ5Np1iOg7U9xad53VRQTby3n9XCYAj/8+0j0l26K8xF5uuodg37Z4iBFSE5wDtSC8GYPGB/mxJAWCbjy5RC+ARguBMMBotEtQntMls/yObSIVRDFdGdh4flFc1ICRw2LFnFqqCoQiplZGFZqtimo8tY5g1Fw1hXFQXrWEs7nqbJWgXWvV4/0CQsn4+CD6WRCvVUDRWzgqDzgiBAPY3A2AzuVjXF4FOqKFiCiVOcLViGrCHE6lYwoTNXbk1nanStxDAN/HbUoAQg/taS40EfZnJACA2aIzTDbJbqbG9FaGZ+Qip/nxGPBv+h3C6V2mUFWHzTIQZSAYxqMth32qUPUYvqiNhIjqlFHSJqnSlNGQFV02FmrRAkAxO8O7WP7t6kjiUG6sTBAqGh6PRt15nXnIplF98XkhePhyQMddRqXd1toVEvCHqJCimAq6NJQaxTp34Q5vvgpjJs3FQG2yJSZ5pWmxkvECM/+ER+Fz5HCvJFkv/4qk7LQ/A7NGgQtDeAqLeywZEijUdxWU6bSdm+eGUwgA+UK6Y5vwj02SaWMd3YCAawMNGDJtvQbpH2F6bipA1htVbbqi2K/Gajsvz5I0nCRrO8/GN5R4fpV7qQ3sy3tm5b74aVm1LmcP5PMQ6lez6RuydapdMo1isR/yLraCY4Rs/lTfPfGavGCcMgh3d9RBS72MM/hHFXdNF35Q0fUOq/M83jptfx4RZj/NUfwi7cgz8ieriLGeYfTm9LqP2Po7ejPpHxTuwVfo0iyHVYh04z54m0jQoEu82YZwZWpK3Htrg4CmHFhPXSfRWsSYhzaeLjgerUQvS9kiTIkrNateoVPy06kp/Jfil3Incyp291ukHBsDSjUHY8y9DN51Z0PiU+lbUsy8gBzgxGffTv2RTnynY901zEXorLHy9++3C4/Jah75oWh9i05tg7y7KnBAuWEtTVjPbBwSgY9qaY4RfQPcxZ5nbmXqCWl+gukK5LhbhhLbYUBsRZIx5YyO49GNWAUagI1IUujwgl3fTxGtQfMCSQRbjQwNE6EqANKN7CG7Uo1sW00AdlS0n7lbSRyvCFbLeeyRknjVwmU83k/LXVtCJhA7MVVpDKa46EbcnVJPbuu1lJHf8FnxMF7vmirJvWG1euoI3AND/LpVzsWAVRdTI7O8vLO8HOzk4KnnbgMVNN27KbEgzFChzZeFB3PNNcQqIvv2ZZzc5kO1eO4I7ZvsUb7O9mOxXjmRh/kn2wxDqmNYzxTDxG3011NDK8L0rVUtBqYa2L7j/2TKt/LP9G5WJzQLTRvfDtszVrSNcsl1oHNMnO/Yl2iyxKr3rycqz7P3Z4uHOLGDXNhngU7N8UmckC9tCArhpMbE8fxob11JS+7RIlej+qd9JOlCn+01LmEA2+pxHabu0D37taDsPS6k9CreM16Kvoq0wGkFsRZmebOQ6YbZtJvA8JOCSKI6AGbBi7H+J9IJEh9qncKPE85MdGp10+hPEGc8NPXBApVmc5JD6InNOWqBInRON3jYatfjQcjT5t2rXEBVH9lBValVUT8ZOL8DzxMKSK1lJIvBHZZ7qmQtwRnYWLo71+9H7rVB1Ol08c92q2uWCuViw3uUSqZE3Xuq+FS2M7LdJ6sKpaBMFHKEGdeA6B3ur4atfQsAcYfdi7zgSICbLDLDlcnQY3JaBREIwH2SzqZ8nfYBCQv2gaBJBCLkQ0IAlTe5QW1VHBcLATtb/XmNgE1SaRQXGpCB9EfH9B7HPxgSgWybEYX40/UxpN+O7V2H9Tbc6WMCSepoghQpVujiTD7QyRe3Q7RL2CDj1zvE/sItCe6VWEFPf0U5hPSannO93nUxLLC089zbGACP/Nv9FfPiSWFST4G0HhnngaCyn28Y2Nx9mUgJ9+glMEWX3nO9Up//1nUJ4i0foR7TAAiAZVQhPvCWTbaIklXpIcYE6uUqvGFoTC8ONEc8Rx3/+ulKygL78orvn/xXPFbyFH3737z19QMM8idPLjHIul2Xy6RnmnLJXkQVZQe8iIbIci0h1i0+T5bwBacGz8o8e+9CM8p1ji+78Hp+UUj4ZrX1yDzx+8hzMNln/DG3jWMDlmprcibUp8pBCL5xvsM3HNnbnCinzsu8R1WDds+0csNT9HNooVXV3t95vN3d2g2QS0V/SuEiMbCHp7RDlTFJ97GQAEDEDC/vfm91onvPuNuUOX3jq/198ql4/Nv1yYe7cNrVaClX31VvU7WquwDaOnOzXAO1LHg4Np5a6tFVumQsSt+nwJRvsvzJUhu9N01rZjqeyRtl6lnmhuUdupT6nmvD+pkHqcetW2/zNZTAluvoJNB+sKruRd2RexxApuz1X8b71VSw1EMSO5haqgati2hGreEVhJlDKKc5fLp47Nt+N8uX06Sm5uw5Aywt1XHx3RAHjiW3ZZfWOwVt07Miom+CHWp2aYPPWGdpPvq6ltWIUg9PkTdGjI4z71bjWUjfEg0Sg+NL7WmkUjRHcc0fvQd8XweH9/NInM2U0RDwRE5mwBE2ABKxAbLSFA2f3+Z56rf/zj9efQQexfY9R6rv4jP1J/jpm3uxJjz4cuGVrdmk109Ras/+7hKHpv/V8+HUXja6NWHx2MgnvfW/9X15ledICy0Wxv/ltgnXCJhQKgpBpxbbaF2k1qggkF+t27t+U7BMltZspL0Zkz0c/euZYW5bOpaLVz51TWNzoq/4/fc+Q1bqIGuAu9SQYm8um2eFpLl61iY7nd/iUJBvlIk8evyNqHt0PDOM4uh6vbH9ZkcjMzlR9cozbYs9VsTgcevxxROQpdyNp8cjzaDeNhtheMxlchoC7KhhOWZrx/7doIWEVgbAOqEpjKGr9EfXW0EwV6CbnYBbK/jtq9bKWy9sBapZId2F7FVNHLEcY8/URXDlK8qesvMUd9oLiJZ5H2xLmYK8Q29oOol615axvBci1YzrY3/GaEBuPBcCQiRGzjpZHKIowRO6Fpv0/bnOiZAXGRJk42GtamGw4npsfxcuFDF8T8RVXwYYwLc9fDVvOAF7NYga+KfUPP6IaPVwOgKuXVK7kG6zgQdRzURC9L3M6OgCfhA1aWpabyB2zWeoCTtOE+NTAfrODNmr+gf5ycfVxf8Gubc3Nusp+e+kCxcMUmIrCEC/a7tQBd3R+PdmOTleFwNBigw/FoHwE22AOIEAT9wax/rqFDsjrajQ4dCZOFBLsJY0NOWp0DRBRKd7XbDds+5KNqo9Vq2I6OPhmxpjL+xUa7fVdL+v7oT8orcJP0W3TQsdPy2gTXIjqSp15FY5vXqbdRN0zSUeC6tR7BG+6+V9wnR+haIEaoX7fXe72iS82X+nD0iru7RW9A/JDO2iZLLVepZcS85TZ1vRdvHid7GMh+nInRg9+ZGH3U2nPmHhEdrFYtFgah4SYVJnxKMWkE3a2YY6AC42sDArnLfgToQ1Q0M30trco8x6KUIGt2ThfZg6yp/AkamuRheHLTJA+Td30eZRPE/obEBGQ0VGVL1VXNkLWspsH7/0Qxs8yN9it5gq9vmrvAv9jTOk0MWax5Q5aNJJHET6Lv1tNpffyNEKLvGA8PYhTXS+xYYpvjcqAJsRFLuhyoGB0mD+jk4fEe5YFI3ywXi29U1UKmamfoXlHlIAqyUA9LVgNtNhYIP019aR2VU2DhFsKLJPH3bC3j2EJ7cWm51ky72tZyuPl/pbWMm8btxcWVatN2tJOQ9jOVjMnzfOOie9KpNlc333R2Nbw5aUoHr1GOq0g9wZ6IuXqHQlLil3KCLaKbIvgm6xrEvP3EsWMn/pYEcmyV/a0mtb3+1rhrfyVOPD3ZtX9scbh4jAZX5+2048/LyViKzWemcghSXonRAK3HfnbKk96HFbfjE7EDkT0kX7oLBBLpytoy3toKoh7wAoP4m+2Nh4P9/XgBRmhfNqgnKOIM6pDu3tijugB9ui6lKDerQ97OdN1oQh+ukN2tRJND1gu+WwPs6TZCtwuMHZSBOGMCxMHDlIJruBuWUNtAUXRwcO1g/PPN3mgA4SAMd0Kylg6Je48BAmwRhOGl5g4gkBHx+bHTHAwGcEsvbGrhdQZSgMEJw72wCbfuNBlmTlYnQPs4VLtE9EhUywYMZjuFY4UZ0ZeF3YPB2vnwjs+t3RGeX3shPL88WPub82uDtTvQaEDT4CokXmdCmkqun791HvFbqRTHjXiaU60SZ/xQ/Q54+PAOchh/jh5QH95Wh1zopTpNe4WGNH1ajy8AhiO7Y1p0X+YaIltTqf/kif57M1n1yJ4JHFtD0UXan3Bw3UkEfZ+y4A/9BSVv6IJjFKywqGfyvl5sWkXTEXTjMMgG8PkuzdHgs6Hbmmbr6AXbcezl4+2HdMWUSxnJMKRMSbIU/aH28TVyf9CUyY36kkwe02bryK9Su3rCC0fUPRu1BNz0u2sTWR1x/NAOm+gzP/88PruweZ5FpRPVldpWcEez+7rjx1/XPXlpg2VRc3dhg0XnN6tbdVQ8HuSpi4bo0ZO6fSPunOCYmyihn3jbnXjdnUcwPzdE/f2IBEcx6FXicIy6KUtoxK+gnwZezqO+h7aoTRPphk3Cy1UpcUqi/iya6naASpQQ2f0XwhG6Yh016XaCTY+wDtUw3vjyeU5R9WqgiIVq4bmU5BU8GWcL2T/kZIhKOFPIpsv6xrObRpkvheUP5ay8Vs1xOXVpVZY/v7qkQryqF6x8ipPRe6wl3Swu1TKZRb2ezdYLjmNMIuOrz60fP77+nJZOf6HZeVLU1ccW1hFaX3hM1cUnuk2OQ9P++1P0acK5Evam2wwnGwW6jWSfTgmh/1h/pO7p2W/6DuyKJYBS2a2ve+ZMLjACAb2u/lDdrQQ//M0Yl7CHxw1UzihZo4pn42OQ6BVnohIL7Qx24IOG3/7t44Nv+zbUm9z7m+iniFSqETt0IO7EBRxvUiDGIIg5vbESZHmvcTK7Ydsb2ZMNj49WNu4Klhc31h/Mr7GuabrsWv7rHl9cno6ZrwB+JLLcJnOK2WFi6+ZmTUcYcJxHBFFF1EWdFo+hwl0dxTYmJaBJmJiVLyPcKRHXA9Q7jgEx9LOiL28vLd35YpU3iivLIrIyEjovjr9S3Siu35nl3iyzsKrLP+hlsmWv8swpJ1A948xb65zGcdo39JdOoR/BeNtAd52RHbRQWBYzFpLQHVLmv1Tya+cyubuPSzkZ462ymc2UoxMBi9BWJDg8l5b6p2bt+jGYd4T3qlHLeWgwuljVKvGGd0IuCAlJPNpQvczLGmvYx9Yck9WIxen4kIRH01AAYb9TDguFsNKO+eOjZ3M8xRXoV5vKJtaZNvFEVqPMZsw9UP0rifsRkVq2a7hG3PzRG1LUIiKm1f2IiKei+uOVKKilmkHA5s08e3U3G/2vrS3zkUfWaNine5kHgGL3Bg89NLhvZ+e+QR85J7dKlx55Zetk6ZFLTOKvO1m74vWK9PhrmDuYXWgnQH54G51JdShhYl0yX1Ob3UQrhsNqst2ZjLRN4PFZYltb86catEpswEKEwsPrPE5xKUBMlibqIo8QD7yGrH4BVq2HambOEARRti090DXNteH8Cl1nqR050KT3pDAvi5LiG4KsYl6y4Iy7LYA1OrvumTm9TFwtAZCEA8eX9ZyVy2ZbQbBLQ2amoxgm9Tye1JPWkZ+rI3ZcH+rI/z3rF9dtfI0XWS7FskJaEzWoHM8Cw6IibvBdNSOvAypU0lA1Q42rdo2oqMbDPmp9IytysiTCYCfV4mSoFlSu3/d8K9DLQOFT8FIWsTypk9mmcsoomPn1A6iYBpyTgXokBr/JIgejBLgE14/a6LDfG/X7vYNe0OvvEcVln353s70DGBxTO/b/hr4wkXGiCTLmyUwn9NqfuBhFfbJl84FT4//e8JZfe5e3dPHXGq9d9u66uOShZ5eoseJ97sW73KWLd3qfdV2SfufFGSaH8hIZMSkzQ9iFCX1LAZ8KIxwwETq82rp6taUFO/0+YvqxGQbqUysMgqC1S/B3JX4fC2+E9+nJ+1y6grWJNV0jCv2KW8E1n2V68RvGf3Hl0gF5ySNXLqGA5HH1atT/KOTDTMpHfRIpVL5WINgI8G3UBva15jegrGTrrU81pyG8+mAzbYenzq/dhj4MXXk4gjwGdOPzoGY7ndtPPPRpwI6IOYyg3Ye3fD8MpG4NqI8LQKVRARIPhbdJa7SJkhZ9aPPibasXtkLbGr8L3gNvi3q7WZLBQw+duL3j2LcdEhwYXWd6B4dztlCERy1TlF4ku/aoUr4bIwoyeKvE+W3b3wZOf6e9eeLEZnvn1NPlc97ZxuLtS0u3LzbOumv7xypvQIfl4jMvPVMsd9fDQm3p9tfevlQtNltXFpeJK/fpfCIyf6IVyUOei8TrHBAHq0IaCapjQ9tFrSaBFt2IjCkSa0z4A79dpdCn5hL3iK1oPAImda/4K9lRH3irQTARnN+xVHV2nMryoIeYXg+qi6gXNeDUe3DDjw0GWcJSLRf7kQrQVR0cobVE4lakPgcJ919z426MqA3MdDt8mwCfLl+JI4BAI+LXNEK98egwLgM/Pgx61Ifs+BrxbHatFaEgGl27thdzgsPg6uHh/iA7OpzDXfP6EIZwGpXEFw/5lQMojEX3mcM3QFfHwAn/E806JH4ziRM/9OPjd6M9V01bX0e3NDPEX0WrNcfbphLvWUSSVpt6cwmPOiKj9qqx7ephq0VMChzTlM88e/r0s+8gwZmZndZg2I/1vv3kGgTjvZm117wNbqyBu8Ff14RoUGXYnFnsxWR/w7xJbLIt4vfpuJ3ZJSvQW1Q6SqSDber6DvD6vI2yPZ9lqtKuHLaojVQwZ3Fc26pWty6Q4H2EZIyoMdLw2MU3kKsQoFZ16/aT1erJ27eq40E0zf/aLH9Ec3ZpKV69SVNkngZfqwC/g/ooujH/8dVZ/sRajWSfmvYr6dUGxF8917myIeaWfem3dnfhgw5v3ZUoS662ZjxCbLtvUf8dj8/R/+5NrFJYrVVrsEoKxLGHAyslcTOyOfmdmtOIuO2lflH82GqKTHEiqSJiXmo/hc4vnFyAT/30w6fhk48R0rfxSsOu5l2OaIpYyc3X7EaxYdf0nJqk6HrNafyHSrXzb6OGkU4bS2s0gpgCedtCYYW87fQ5GFe+bm6wqqfpVbtRpm+VyCt4NWfU7Dp5K+SDWfTDD0SNSiW9mv232dU0jczJjq7QmevNpAczjokH6h/GprkxTOwRFxeJuwv0CIEsPeKRs2Wq6BXVRAe6MvGqoejR6KB/kCW/SzHf9vN+munOPbdGdvCliB6bWAYOBsPBYH9vbx8iRCUOqOMQBYAhYIkcZPeYmdyX+KWlnmuJ/qJHXENf37t6de/rmek974cxVmY249nr0p9ioro+6uuMCG/XETVmhelFfylmOblEZJGICc+FmgxcsmQofcWQgDeW9PBccygqWFcjVcOKiA6b50K35GUcMafEv8Ch5EQn45VcuHP8rOdppqppqjkb95+lbaASayxS7yk18yk8aAEj4cceL+gPPuz0ek07lwuD4IO7u5axZJg9362UTkUo/45cMwefH14ef/l7CmkTmVbpe35soxAIQmaCdY/qYTaZDtVNM93Eo8pEJ2O/qj7m1U/meefTt1TT3DoaxGx1/CTaT1xURf1JZO+mlCkt/gVKi4Gvb3TnPA9M3WP4XUCxuN0FjrRXNOxmu5E2i7GQ7dQDb//Xg8FzK5/4kFhMB81mkC6Kr4sla99SvdZqRYetxs/M7VUgFhdMvHFusr948ttdbeqhcSrkW7qw5JgFPg8sLa4aeb5gOpBUb7XuaMEiQKLVYpbznZVsdsXxuWyxWofEc9Gdrdads30EQ+rDr0G1nFN9w43aTuAvE5cEAqZaICKvHgQAUANqpMRA+HxLkTW/6CtqnQALFOwunzq1vGvKB+QWCK6c4GzZ8H1DTade3CWqvKP7P25c6Y7smD+yTX5G+I/s/zhIEiEgr535+OGovFCj2gmP0n1ikU2czPlRiKkKMpwL8WZn4lDMm3YxivbGV0e9Xn+ttLbWmwahlWFZJRIExGZMIpRWFDTaGwMHtNfTokALslor0LKBFmUh7GctqZzPFVUjd1qxFPgc6QdSznBWMpsaa0FXJP7gNgnl77rEHwmV/06KFAjcmyVeTOmOUxLNnmoLsmsZzrQc4799Nyc4rPIQ6xQcrOsPmlspXpALjnskb5lqLEnedOcNMMdk8w3NBFZPokXr9bIA1+LXjg+jVra3u9vLEl/47JE6TGswKeG0KDf2i3iTLUvyLNmoQ/oGDu1KgY3oL46F8SnlCumrgyEU62DYv870gXL3h0Qem+RFbNN7wMP1qIQQeNxsNjtlUxPsOilveqJ7nLU8LP0YuLtoHU0NnBIUOalTdBVeF5BsYgrzTb3ecNbk1/b3iVH2bgLKWq0ezdg8UvfY/3SGovo6tRA+xrQSnjkpS8IDT8ye8T8gTgt6hVjutIbQd7cKp+XtxYY5weRADXeyyaFFTXQSu6pb9dut+izZm3PLzor3ydOd7jd1VkRzh0+CESZ9RNH9pH9u9L5JdIOTfsmaco+6pZHN3WiuQ3bJEkkCYxDbm8Vj/0voT6Hl6a9/IM8lkAuo3zLy49W4G1InmWvUp8A2S382rDbdZY4SQXgsjqT7VgSq+YVFAn1BRGbJ4QSW437sBBZ6AkZBCUmu5Boidr6S4kTRWWmWTiJD9bBWMSpGSVMLpXIFi5Ysp0RdMLHBC5hV0dPFUn6zIrDoZXiIexkhUbJP5DPSd7MpjhX0WvRTnB60/FxUNlROWlp4rlD8NJvCtptRZAfuwHrG9SWNme1Lmf0mBvm9CvhaEMT2g/R72LrSQkyrNWunQeLzIHmmTdS709+nSL4D4vRv2Jo8wzIzPzhobkSwzJiZfNGAWJb19nu9adlumc9c2QiLPslnQncIT0E8m8576XXILqLYtjX5TbPpKkY3FRCNRBTzlXt3diMiY6ToIOrcBVMW1jbyczzBfqL1LbknHpTbMTBoyw+eIHeSBU425n1uD+O9hnZEERWgS7qnpj/dX4j6rcmuw6ntOrV+I7tUYocOwbT96Lp4grlAfa6R4daKf2SAuAQC6A/zihhUT2BCvGOCyoY9wrbEG4zCr8GqIsNSeJ7jMId5T/dFQ7WKjmmnTCWPNVUUZcOVVTFQjGw671mSIknp5pw37GOvPXbstU+QAAWcwkqSxPIoxaZLoizW65zlO4Gh6CleFDOqLEtq3lCMapiy5HyQwemfnXN2/a7kPRBMeCUYO4Q3aMLMJL5aGJj3tZkfGFzp6ogKSbdTAI1ifY5PpYaJNDHWeJxh6fJNnUOF2wgnu6uaLGNvVLMLiizbBWH8v38HGBcO8RiqiPkUYWJMDav4eSOjlyt6RlczYtEtitbXFxYXTzgStE3tm4NGAB90MB5VN3Ie51pfxqpgpiSR5wVJ4kSZ/MzY9xe0rEH8S2iFlIBSKcSxiycXbcPSA2z7j6RzuUa8Hk1kSteI1S+iFJxsUq3RbXyJQx0iYuzv0k9yRMzcCTlO5UUx9o5R9x3MffHMOOKfeIJr7NhbzYQvmf9hS/ITJlMWdRLBAEMAoTVRZMixW3fZiJItBUW3l02/Jp3tTawWg/FwP3F6Hx8+1HxHkzt5z0mY9onrMOPhZJPBwQiaOJ3NpqGtIVr88eEwwe5yfHAdxyatha5fT2jLg8SieWKtMTHhIG3390qbbGSeWX5Mtti4aEQZKrqrORjM4tlBMIsX3SNX3OJBvL6QIIpeJe4V58+KM19oL6GXKJ3E8Q+tEh0EeunRR+uPXmo8+mjj0qPoUXICMXKePPN+9H76zOwRH3Ue7V56tPMo/SDmUvfR5KQ7R6M4uks0rMH9qYqNtOhj6dCJUC8C8vSXP59NnNjE938efYZ6xmTs2Mx+YqvRrBIv+kVWmFjbC24tNvAgW5boXeQH3cjJnNDq91XRV2Tdz3sFP68s7VUMO7+ZZg0j1a6kzSXPGZTy6yvrGf/ia/RaaSGzoivloFbIWLvvi80Q0Gc4uRDU7bSbzmxkPC5dWm7Ki2fl7IWdS7ed7iw2TG6znc+kjdA2pEztKzETlrTXf0Z/NLMC1xFg/DUU/8YsoZ9Ev0jdkNFfJ9OpR0JiSknEfcLcD0iiK+RHS69kzuxkORJ7h3XM00TPe4cIK/s7sO7hd5DfRLI075h1xV8pplKSIAJUkDhhA/1s9ty5zKcyluFxmXPnsi9ZoiKI/hn/JWy4+CX6hvQxT00Lsmh9yttZQYjYinnEGT7LTuTB8Z52smO+CphxkzkJa2XicYvs3bYwHcg1ss3D9WPbPfpzR4m7kgiWVeLHInnkFQdWSjwYod4fO6YTrJnOM3mnXrcLj0fArvbGh1f671UURTeGARBFFBHndZ8x3GzfMdN2oZ93fEDB/eCwf9DSfWNeB6TQX8Ob+FaF9bwzdQrTnZDiKU2mJk8b9Ffrmq1pavemyBNoZ5Xyewcxth7Eh2/U72k2GqFurpbfnphjxheGiVuX43fEKv07/igmJ4uEaOn6rrbgWLv3aGZ5NRunKEcOE/nRj9P1qAR88gnqxW4zBoFk6BNOvTZ/LhRRl6ZT/8Tk1xNasfcywrV1af0hsglnpD3Qhm/qkpL2TaB096UV2TD9tCKxWvbXMpaZNn0I/rzqmemaZ1oXsyeaTbMVbBrLzRNoMZ8NPNMuZHKuadummw/yacu1wiDIZ/J2LpfN2fn7cu28HbRzmdWz+YrjVPJnV2e6qK8CN7ZKf5c5bMZChhLC5PfBsDBxtEx6hPiy9r1EDNHthHzYjB0flBBqCxKSexoPy9/eWz3V1mEJ9PDJJ+RA1OzierH0fEkgysazpiYI4vjTvMKyWk9RZR71BVmT79EQq/IvvbVYXCs5mhjI5x4RfQANSlp137oIC7LmnU1rqiF8mVdEXu3JrMTP6ZmJVQpxCk3kMV7shjkhUXQPqQDknSxe1NOxD3BJ2IjlKVNVDeI7C82wkBFSKS7lS8VK1C1kvUzN8K1UpqyoYglLiCtqLMZSOR1uV5fvRCPPOb9QaJssp6T5VP6+fLFSXFkuVVnHlI9V7TTWraxjvhhusmilLgYZzVi6cP9tzdk+n2sJxiW/17wxQ8eEV2pQ59aT7Q7dNjD8SZzKYhKGEIDHgBiTjkbou4e8IJpuobCQZweKnCkUlgrSXw/39sjG5thBd1RAgvC2VGGxkEm/lH+Eh0jB/QQW9ycOCvAN5crRPZvNoyXr3rCGElOjG4qztxc7ByXBww8+COdzpWjNfqPgSivqTX0rXP9bsqij65AzkX516CrY7ayxbeJklRrgEacblPoSQweINRtUMo5jt/BklhGXb5fvXbtX4GxX+aenT2Zydo4XO7nC+XvWz36b7Av02vhXVQmXFL+olp7M5opa8b+it5MLvs29DT9xbFM3RJUXtkvwVHThqzIn3Lt+kfNrWjmfeT0846slLGrOl5O18XfR7yZ+S4pIZ9fYbdZLzRQqLnplMZ9/7Zve9FoaXtjb24XWeGVhkgDh+CdJ2u7MB8KVxB5lakYV/+5gC7iCfRKZYcVYj3PDvQPqzqRHQvrz60k5D9BvQo9ukV9Bi61nyc+UEY0zZZfohshOy16DOnhxnCyMUJnkPuIDF118RobZyeoax4qOya2dW/OfwWmzVn3k4ddkMlUSF5/JWNaxc2czJZwVBMMRKsqHn5EDJ5XK6LLJif9fZVce3MZ13vft9fbGsVgssABxElyKBEGRi0MSKZKSTOowoYOU4viWFQW04qN2bcty3ThIrXQSJemRNrXJmcTNjNI2mTRNQ9e5HWfGaTIxWTfH1E3SNskfISepp+00bqedNlDf9xYAQcpuEhDcA8Du2337ju/4fb8vFMyMlg6Rw/QI4rK2feiWm7MXpGCIHHfwwO5QKJa5rYAjmiCV3w6X7ev/LVInJrn6GkVF5wHLRBE4E4gmUhCxnfedHpyYJ0IrGaHIx76wCzZ3PyFQgYahT1DAaWNBUtFg3BFZQ74cEQKnJZV9uIElXMPKU1oE/YFisMNIwQsKvoto22z4QVFhizza/wBPtHG8T8M8i5qacu38haQiTYZknNd1vfVtU1X+XlYKvIJ5vh+LX7R/KEoC0JxvPYcl8sx8zz/opmAuGOvopLjDlowaw1lH17PDRAFtm6hRI1+TPhw0ZfxNqZYnSmfIl7d79M5NonWCN8sPD3cxEOpOoTZqlA58oCn6/SSKfiM3NpaT5URr4zWulItls7uz4oIcMAVWilt4UUMbu2fH2ETrZ6hZcN+XG83liA60KNsJHoUMaVHs9Uv740UnCo0pgCeR/AOgpkbDxzo6Bxju/TGMy9NO4kcyes2ms7JSr9dpMAT4bzxE1zevkVfZcTbidaceX1taMtSmZjSblMK9tbnaqC/He3yaOvUiwUzWZgH2XMgf5ULxHqllF1t+go4K3qYFQMC97Qv9jGYoopTFAVaXjegsGw6usudOnDjH1g11BcwDEjtYHWQl1UAK2VFZ0HJV4/6Q7rp66Ey9fvpKOn3ldH2dkuaphgvmftdQmS285ia1NfYD43KHZRyC+4EBIUVqCFJ11cZyogCW3zEy2Lr06sto1Wk1nNxEPhGLJfITuda652RGEDOScepOmYhkmyjukc8VhfzG84byI4teZiQ/5N1r5zwv18uhCFbeuK9jYhpBWxE8oj/kBfIBmeSJlrm+1GjWyWNprdf7kgkPrSw1+/qcBmrMe+tgeNlT8p6dh6W3dV/PUZbfObCiFWiyKKKm1+xu4B45f87COUxT10W9LrXVFBK64p/o5lw/jzHwcUd9wnwiqaP1hCmFxMnJyCEzEY4YcoA/LLLOwao+4OiSQD2tmtFaD8fDZjy0OlgYyvM8i1E6m0sJAU0PR2Jh1vx5xGGJHHNXUA+RsyhSWLjfNRIFQ9Jy4CLOaWI0Arz6kfDhBG/zEstaPG8JUtGMmWY83KujQ+5lsPCAZcdHtFl536yy3lxebg7t3z/UbFImX6LlLjXqk2cmvV2HFw/vYnb6n/v+P/8zGLvfwO/81NobuZzXy+UeW0KFPA1S+fmyWxvvAMZhMBjIV3q8WFY7brxa8yi8nfQatBJ3pXu1v+KDXKJQqAyIz1p5O1k8UEzadnJyqK+kXZIGY+kSO7KatOPWF7iBSqGQUAKfC98rufFMsZghx18yRp3hyaRtpUYyqeJWG/wa6asxmuHPTyFGkTlE4vTAfGMRlRJ3A+meOLGndtvZX7ulfmNx5L0njr79qDtb63tPNJMZyWS8++64rVKrF4tH528+8vjherI6W0gXM5liuvusPoEe83OYUrLod3/ySP+930KXyOqebzLXj2FbGBLgiWmz4gCEXKDpYdvoQWCMoTTe15jGNWZpjYzpS8sNSHBCptzmChG7INLodfiizB0I4I1l1CBTOqB+nS2gb3dM/wJ6kWJ9aLYm38QHiTMByQOeY2qUJlM0blfVOKrllYQsa6GgpIdVFIo7CU1WHVEcvDWbMM3qkaOyUzlWLh9DH+x/yy4JS5om6URNCLKqqcmBgiRYejZx9EjVNJ93biyXb+yx/W6ir9I4yAWwkUNu0xJHZDKDx5ZIx5ApDhi9uS5lJx6APMIAWqhN8bVKlQaKGxzpfyUOPSOLTloWiZ6i2rZqhUMa6a4Xb+AUJ5MLu244l3HODJQHyPsHnV+aejSmm+Gg3v1l1nRdM5tx0L1GOiwaOKzJrCCw5PbDCpKUeTHgWAFOkriA5TzuwMkGFjq/lDhB4CQtGJE7vzTArG5YTi9XrkKxbrgCSFWYNbisH4JH7pj08339uwvCrYubyPFazX+fGz6OvMY80sPF2ePC8damt+v3kKO5nXb4FdLGcsBlQEc6MsS7PszDbjO9g4kSR4HuHT1EU61yD9gHR0YOxB7gIL/CAftBjnswSnMtZGR5wiEbzoQs05+SjTD5aJtcCFwo7exynk+Q20n70k5sBUgSxGAciiT7+vOlbNWJSIoSMIimaYQ0Q5RmZjImWud5BcwTT9x2aDgq84KkaEEzGk9lC7tKXrwnhsYvc88vUyqRCqgKWaGfUYIGCuT+RRfT5AXyx+fdvkG1KUdDTjgS/IUXuC6Sx2wn85Ks6Opqvr8vGQnrPXMhpihBpkblkZBne2be9tN9h1bK5aWlZPWO6gLZWFkrt9YgnL28Vka0X3T0uKXtfA01wETCyEHGCpgW3LZ61ERMa9UjR5NRYoW81tbiK/S11Cay6fhY1tt4GDK/dOIufTSMSXOX45U10K5g8fyK02jsCHek1L0bzW6//TZ6nNosimC9A32Y2ifG/HwC2/c5PytVbsDFKbRqpbAWDMZNnPoLsqkHgk4Y99UOP2LnzHOXzpk5+xH0OMRtc6yg0QQJ3c3WRxZvUPfMze1Rb1hktuLt6j5eBmVtL+si5xrTnEdME9UhC/MWD6hG7t0hsuQQ1Yl7GdMKNmlNRFrAFGTZJZ0AUwUuIdut1mxjO1X+qwNx9awxhtSzanwgPfaUDzD8vL/3T+0ve0AF/+h/c9L/Ztn3C0X8vWn/O6Y37kZjksxuyK+6bQY3aZwJzrngqoGomFzeDz2hjkH4KIV8hbaEqDGRqliI2XKrDLIav+uOosYLwvjSqBhFiOV1sfS2iqCznL7vsbLAs7uPHPIkncfSxNHFKlE3VHLnW96U73I8a6u6IsgooDnqqMjxCS3IYsGQw4E0r1eSokB2gwYXEsUsFxSDvXGRMmVqI0o2rtmQMzqNIHqq5pLxor58oW9lpe/Ccn3y0VPRS5eipx5FG8vmox+bn//Yo+bZS4FbL09OXr41sM2fIZP1652j50hme/mB68u/ruzryu2WuYQ2YPyDgGmfW8Emcw8djsA5RpPb+sGzzY1YOh27CZHZABuYTAlvJvvo6gF0UHDjenxAOHhQTqSseNxKJeSDB4UB8qHbnZ8pxjgDyHaTUpO0GUq2rfYjN0vUPNuPOvDHwAimnWzHBnYCpYCzY1FvER2n2WjqWoDHmO8bTfWsEjpiVNXMZMydS8h/nvnvZnOVlRVRDhCVxrK6a8Uga5PtznPALAXcqFkM+b/JI5qGCof8VPX19Y8Ui1L/mG2P9RNBdn39PGxJwyUp2+ufBD4q0GhrgocLOD8NilbErnkBMhdMsW7FRcm/bG14q8h55tjMC+dXB35wZOq5wfHKYhEJiFknL6f0/mK9fvzAxdJv9wfM+tLeOuePCazexrF3cQaFHuuKANw4vkmb/kP8LLr7jjuKd97ZepHVWk8/SV/oSOu7yP3M7aXbyfu30EutCvr4uSz5Q3e3nn6jcswt6GeFI+Vw5NxmT1lXaTF/y2ovwsmvXqYv9IxfSOuP/FJaT6O7aUlMx6epd/Py5WmkYq3i2jXLBVBDIV+hhAi4za1vV/wF1/XsYPtqNns1k3nx56+hVy+LzpMJ8cknw4EnY9LlPzx52l08OXhywV04iVAGZ7OZuey/wFUcdHCiVEpgB909GQ5MTMSk4dbayUV38ZR7cmFw4WR3Lnuduu5UNOC423Vda/8DjyI6d6z/GHm3PuxX9lXyvnyZ3PhL/3PsWO7YsavtuoZXevONyzE7FU1Kg7ouANEfYG5BCidlfdwv5uOklM/RUuh5XyL1fSstp/VZeqOkFCRups91sAedcvJg9doiEoY7cfOu75vP+rYKTARy9NcnT5HacxdOu6dPts6yWkbLjpQyRqvyTObLz2c/hF76PlTvqQH4waknoMir8GzbD3grN19n/n69SGgPN3oS2aL+awyR/HdSFvgggGYvNo6HvGzIs5DbRfUjZ/Uas4rm/UBntA57DR+gD4cp7fH0Web1eCwpd+UWw0+W4pp6GX86fJUwU6O11eYyIOfja2hto0FEmaVVb7WBVsHj3IToIZrdse60Xz0cnB32P1obvuW4G2sP8F4/dsTyGpThxnKaQP6BRgF061B87+YmWqW5QppNuvIcL16OM1v8optML6YXemqe8lRQ+1LFz1JJlHJvjb4o5eZa69m4nx+XeUPeLdQmL+itE6DWo2FINLPG0vIKWllvEJHLN29Tsl/for2lQ1Dew1rOHSsh6kZspzkeo7ZICwL9DES6mfd5Dqsyx9m2VlcNjxcl/NOqdFzkDaRC3kw+oipzVtBQg1dlLG9ID6uSsrzRLueb6G8oVzdEooylECWtAm92hPJVg+uPaC9EciKPE831lhN3egpq/QcA+7olWW863VvSFiZjkwmSeyozpyh+HVcofxAu1KJTRCusQQZ2opzSFOxpSHdadW24JAOBQdknyjajnp2tULtQxcO2P0f72WLsqECd8nYbjcAyTmQgELac1hOO6RrhiIO4vKBpX9FiQp5Xta+IghL69AsS5vJcAL8giWyeVURuVQ+hFhDIWAl8VNFNfV03LaG1oeHoN1RpHWvo9qMIEwUSH3nPESk86OKjrR+fJeecI+c+q8f4OVZdn+MMfBfGHFlLZwXc+rpSnycC4fFIgguqDd009REpFGlI6pExSVUZzccksAy1rk0SufAYqaMLzGPMO5h3Me+HDMOICNrbasuuQqhXClXdqJ0nX9ljUbBY1+xodZQdENMsBnbHUVJrmIi3JXB7TIP67Vo2iDKAcNlWlX5iajKliBGPTOJubXwggPJVXIaDa9TBDZioaSC8qgG1/vX1+5+Bwol6H/n3ckEkqkTU5Fk9wiocy8WiPMdLyKU7feHSWayjsPZgVRM4PlQYQsGArpypCImtur8vMXlm8k8LLKcYkZzKIz4mChGpGEveU+REpRS3kryOLib6AgENXTyCw4MD+OiVw7CWjv5wsJ7sP0n+P6KlWVEPBlUcSl7gkISwjESWHxq/wGEkG3g6bDRN7+whIyDbpczxBVbkpZvNkDV/IxkJj1tunwsgrRkdiWhw8jw5Hkn7zPAldWQ6KAUi2T3OkHZKE/jbT53osdP7/D1EDiUaf0XEFbGQtYjqWq2R0eSOM7ehQGsF8u989p7n7Oqx6k+ei9fqnsUI0AbomGuTUW+IuZHaS3zrJ6aRpltYEwvna/ZOd1pHtEkh0i3y5CkRnYw844FpEBRJLybKj0caCHJcLYrto/uHzSOUd2Q1mnqo7Dy0SrfJ4uWFvlMZLqQH8xKRsYKjlrU7RDbkfEgPsdMRsYpNhOqKNLvqNfwjrMaN4+0tGGyTtVoylA9gmY/JIU0LKXHSrwL9wbFwOh1GW3YhP38qxcWjnuwAYFLHHo1Jz3L+/bnIq2tGazWg1PlCqXCuztux6D3IsYPKZ+UAi1YMzXHUAFyAahhvbv1cNnSlq289T8qR20wTjIlDEHjp1SqkdQN/Lp1CwN8wG14olW78/fzM0p4TqDTT37/U34/WD7W+tWvXu1793oTnvXbo/PnzbT3hQ+ScSZBycvtRO+d2Bzxo0yzclRJC569IH7CyWesD2ZFUKrXvSjTDZp9R6umRdNVOp+1/rmaybNay0+1z/hh9nuYMaDt3wBMDCIASaq/2k+5fQjSVeFsHt6s1EVfRj81kOrNvZuH4QV054KV2y7Kk6dmhSNS09fxb93E1N9KvZxJqKoF+py+izUzOFIaG0CDqTyJOLOeQivRd49FimVUVtxY0cDAX5np4nCLQDinrrg+HtDqub+8XGax77dUWZCjazmO+lawHxqZ2PqYA3aCggTEfPADADtB+0MbUhScuTNHFhs9IslxMjxeL4+liysr1KZqAsVIwg+FIwMJKSFZTOSuFmOn2MVMX/tcnjHwMCzQImRcCMsZCbcrdw/E35PL9g/E8x7+tUibn6eHA+xh6npEoPvRXvWDml7/KL/0ql7aFl++jviDfGJ9vp5z1x4VuhmPb7c12STGrHoRedLJwBtQVRdHIdWqKghwaWUFDLwLqKuW9UQPP1gRTBSJD1RRqW/UCY1WIcm7BzBztEGPgPPBTe5RsCcxB0Fpq3gekqcFkKThszw0W58dx5eZbXrhlQpnc9hlyBrxY1EumB+eGl5a8JXc8Fh3ry5C9bpmvoj/3ywQ3hw0oRz9altyjmSM9BbCOPvUOWHSEkflxsXrLLZPy1GBid3A4PtdXrO/4BH1i8PBwo+GOx63xvkzrz3r3tu51hXKlGDRyFuCUHTP8OjjLl8uoXF4BgG4ZoLq9MWMgEQL7yYHrueRciGmnkm1HNezh++jYwl3KZk7NvtXadlnfoWjmryFN0kBw1qTWa5Kmfd/PJrMUMcJkCgsb7eQqncPimpSZL89nwH4PR6742X0fTYnxIAyfwbjIbOnnKzTGIANZddpBJBQuXwu5eAcglFxZE1STphpYXlqKb0E1UNP3Nj8C7g4PMqWqyzSurjdHt+lza/aesGaHoK12ZxWi6qx2MnGnzjyEmIe2tUOIVr+uhgsVG22krBY9B6pbqdYmZNmDvWuwHF3rxtX/hFwHsCdVGGCpoeZnPzcjRQvUgIii3fntHJBSiF0nZHnABToN9J1d75w9vG84JwR3zUxd2bcrwuu8JP2dnDDNhIknLmRHj8ad0b27+wL60dHsBaTv24vxULaqRvb1JbTBTEqwBFWbkU044At7xw/GUm5yLOmM9nFmvxE7OL53e2xv8PrY3lo+jboOnR7j5Bl5Xt4jh/tNM99r5Py3j370TXI6HE6He2UXwIWADuOLE6EsUYRq21AiXn0DxR0H8mHHEcRdtJqbNC+208MZDOcJv4HuZvco1O3H4dEo8X+dAdZj/43WKY4XNDey+l7n4/jMDNMbH4D99olcM2+6BaFL9wqmXeo6pvBScFd8WfM0MiKD/uW3SPV3k6KujJ2KxU6NKbqYRMx8axP1B5aWHKxKkopX9g6U2N2uu5stDfTmhghQK/Pw6/TocWgJVNraomKjzj/gXO7tu+vDJzKZE2+CxR2+rdgDAoS1FcRAv6GX+Mpgf2FwsNA/OE95TFOfcRzQXfV2m+/lPfRjf/Yy+8k4c4w5/jq8lURV7rAgUibEzkwGiiTIlu62D3b+ghILNenFN4HcEtVbq04dkBWt74oYaqvYaCw3my90d1Z7v2mgOh2DVsFsMbVU92Otm34tO06zLikSeTvA0y8B0Fvq+tL+Af2EtHXIIUw1EIuMmbXqOK65RJD9VL8k3U8eWagkWVeu9F8Jox/1Y0u6/79QsyT96D2FK9Wtdv0yepm0xxnauylOiegwIFURVYrmeWx7mSjR5XgUlKMIpgRHbXoqGAVonAT6ZOqu++4c51JCZF4qVybHR8e4xWCc19Rw3/SQxUckrAtExTBY4O7lOTYQicdkng3zAr8LeHHvJwfsu+u+UVyPCMk0OdkH4xxiOTU1FXfTFiY6dpYXWSwqLOaJKqsIWAjziLUENgA6wrVrRE9EpE4OMHVmkbl5h0wluHBLeSI8uv6kPOADTMm1+4ghdxwUaaLagXg5NiBGvTS7uwKoTJo4AgGgqJam37LM7MUrF2dnH3nvxdnW125KibwoWnEjkH7rRPFkOqAbAi8LRliWj8tYEHlBjMYC0QFR4EU7+3Vwkyb2l1/ZN2d+52Aunybda5ac6+J7HyGLG37KIkNHLBrdk0myimapmhTEMdeuJexXWJZog0QE4lAwyN6kISuUdscnpt+WkpIPHBofeueqJm/ZHeHxAhaiztzE3M68ZUdt7EwINl6FqhlGb1w1/i9yo2QmgpqhiFWX9ISCCRXTrZdH3kduAxbXeqRL7XhCILVgRnWj75aKeyShq7rIyZwWlKRZDD4CnnzpRE2R54Ro3wOHeIE0klit9am7vOmXJ1IZJ4GYufaJZx9BxS1xt/XMt1hdQ2hoPBlHsmIqmhTgonlrLBZ5gWUNA0RGsjz+pU/roXA8Xrz/zp+2fuacnyyd+GNV6vSBT1P8WIGMyRTeFvEA0AqT7TRbpWg4sPnYkIIA7AZf4owJ0n53zXCcwO1ThZlvcBwrwsYBdJqV+QkB8wvoQUUSZu/nRUF5YIXDnPLrD/ErAmkMT22LzTV3IlXyfrRBzxx1JLeYO3g5t80J98WHM1NPx5iOb+bD6Ema69bGcDj6zdwH4Rj0ZOyVhzP7u+X9CUWfQsQTOMpyFIIcafficT+djEDkgq9KyUpipP/USS1CpunOTlKSrjHvQpeSkgBJW/iItv/i/vaOlNw7PfFuyDXwfwVB8YUAAHicY2BkYGAA4lWM4ubx/DZfGbiZGEDgtpnQKRj9/9f//0y8TCCVHAxgaQAQawqVAHicY2BkYGBiAAI9Job/v/5/ZuJlYGRAAYwhAF9SBIQAeJxjYGBgYBrFo3gUD0H8/z8Zen4NvLtpHR7khAt1wh4A/0IMmAAAAAAAAAAAUABwAI4A5AEwAVQBsgIAAk4CgAKWAtIDDgNuBAAEqgVSBcgF/AZABqAHIgc+B1IHeAeSB6oHwgfmCAIIigjICOII+AkKCRgJLglACUwJYAlwCXwJkgmkCbAJvAoKClYKnArGC2oLoAu8C+wMDgxkDRINpA5ADqQPGA9mD5wQZhDGEQwRbBG2EfoScBKgEywTohP4FCYUSBSgFSAVYBV2FcwV5BYwFlAWyhcIFzwXbheaGEIYdBi8GNAY4hj0GQgZFhk2GU4ZZhl2GeIaQhqyGyIbjhv6HGIczh0sHWQdkh2uHf4eJh5SHngemB64HtgfCB8cHzgfZh+eH9AgGCBQIHQgjCCsIQohQiHSIkwihCK2IvgjRCOGI8Ij+iRqJOglFCUsJWoljiX6JmgmlCbcJxInPid+J6wn9ChQKIoozCjsKQ4pLiliKZwpwCnoKkQqbCqcKtIrQiuiK+YsPix6LM4tAC0yLZAtxi34LnAuoC62LuAvTC+ML9gwTDC0MNoxDDE0MVwxjDG+MfQyQjKCMrAy7jMaM1oznDPYNGA0ljS8NM41GDVONbQ16DYiNmQ2kjbmNyQ3SDdeN6A33Dg6OHI4ojkcOTY5UDlqOYQ5yDniOfA6bjroOww7fjvmPAA8GjwyPJg8/D1OPbY+ID6APtw/KD9mP8A/6D/+QBRAckDYQQRBQEGEQdhCGEJEQrpC3EMOQ1pDkEOiQ9BD7kQ0RKxE1EUKRURFnkXARehGEEZURmZGvEcoR1BHaEeKR75IIEhASHBIpEjYSSZJWkmOSchJ8koQSk5KgEqkSs5LAks4S8hMrEzKTUBNdE2eTchOEk40TpRO4E8gT1pPlk+wUBBQQlBkUIZQ3FEKUS5RYFGaUd5SUlJ2UtxTYlP4VDJUWFRqVKAAAHicY2BkYGAMYZjCIMgAAkxAzAWEDAz/wXwGACE9AhEAeJxtkE1OwzAQhV/6h2glVIGExM5iwQaR/iy66AHafRfZp6nTpEriyHEr9QKcgDNwBk7AkjNwFF7CKAuoR7K/efPGIxvAGJ/wUC8P181erw6umP1ylzQW7pEfhPsY4VF4QP1FeIhnLIRHuEPIG7xefdstnHAHN3gV7lJ/E+6R34X7uMeH8ID6l/AQAb6FR3jyFruwStLIFNVG749ZaNu8hUDbKjWFmvnTVlvrQtvQ6Z3anlV12s+di1VsTa5WpnA6y4wqrTnoyPmJc+VyMolF9yOTY8d3VUiQIoJBQd5AY48jMlbshfp/JWCH5Zk2ucIMPqYXfGv6isYb8gc1HQpbnLlXOHHmnKpDzDymxyAnrZre2p0xDJWyqR2oRNR9Tqi7SiwxYcR//H4zPf8B3ldh6nicbVcFdOO4Fu1Vw1Camd2dZeYsdJaZmeEzKbaSaCtbXktum/3MzMzMzMzMzMzMzP9JtpN0zu85je99kp+fpEeaY3P5X3Xu//7hJjDMo4IqaqijgSZaaKODLhawiCUsYwXbsB07sAf2xF7Yib2xD/bFftgfB+BAHISDcQgOxWE4HEfgSByFo3EMjkUPx+F4nIATsYpdOAkn4xScitNwOs7AmTgLZ+McnIvzcD4uwIW4CBfjElyKy3A5rsCVuApX4xpci+twPW7AjWTlzbgdbo874I64E+6Mu+CuuBvujnuAo48AIQQGGGIEiVuwBoUIMTQS3IoUBhYZ1rGBTYxxG+6Je+HeuA/ui/vh/ngAHogH4cF4CB6Kh+HheAQeiUfh0XgMHovH4fF4Ap6IJ+HJeAqeiqfh6XgGnoln4dl4Dp6L5+H5eAFeiBfhxXgJXoqX4eV4BV6JV+HVeA1ei9fh9XgD3og34c14C96Kt+HteAfeiXfh3XgP3ov34f34AD6ID+HD+Ag+io/h4/gEPolP4dP4DD6Lz+Hz+AK+iC/hy/gKvoqv4ev4Br6Jb+Hb+A6+i+/h+/gBfogf4cf4CX6Kn+Hn+AV+iV/h1/gNfovf4ff4A/6IP+HP+Av+ir/h7/gH/ol/4d/4D/7L5hgYY/OswqqsxuqswZqsxdqsw7psgS2yJbbMVtg2tp3tYHuwPdlebCfbm+3D9mX7sf3ZAexAdhA7mB3CDmWHscPZEexIdhQ7mh3DjmU9dhw7np3ATmSrbBc7iZ3MTmGnstPY6ewMdiY7i53NzmHnsvPY+ewCdiG7iF3MLmGXssvY5ewKdiW7il3NrmHXsuvY9ewGdiO7id08t8TDSMY9niSCpzwOxEIuCLRSPDFTGkUitqaYHmTG6kjeJtJuLhiKWKQyaOVspCPRzqGS8ZopcCRCyRcLnCkrjbSiUBALu6HTtUJBwoflQKKyoYxNOaCNLUwywloZD01JSVePK7u4la7uxne1prwwy2qtShMzI1LT4DJNFI9Flat+FnW4kkNaM61fpEs5GWRK9TZkaEetXKDEwBYw1rFYzGHiprmhpRmeyuHItnOBx8V7pE7UeMRv03GTx1yNrQxMnafBSK7TOaSp3uiFeiPOV7mFrramvJjpvjozs6TlTMeLIW+DG1vaja+2ZwSdHGeJG+nOktWVCQuzRMmAW9EoRfM8tTW+wdPQ1Po8WMuSSp/Ha5W+ECn9KNXtKx2s9UIx4OQSjb7Wa05pxYGVfhaGMtCx6fHAynVpx3tMRf1+kgpjekoP9c4ZMaHxdGTbdMQ5cRaTkqWpbKDTLDLLM4JUijg0M1OGqc4S05kKkmhmfipoyWJ2vtUJHdyM7TalhZOrNvqZVCGBdj8zMiYLIx4vlDghz9Nxt6QbmgZr/cxaHbcCroJMcavTDkGyj6dukxoloQmRSLmT1XI4H/CUIJ2CrdDDTbViqNNxKxgR7fFU8GYO++59jyhYRSFMJCElk76mo6sG7oza9JuFPcPXRdjJMR235n44CxcCHYqesdwZRKcd6MFAiA4lEp2SumBNpHUiWRSbLm2LTSnqes4lliaMDsN5ysJEkHAKyOlsCsrx4oTRzgtulyfcrJG5pG/7Fkmhc2UiXHc2CDJueXdR3A70ukh7MqL00wy5GfnVd0JueZ8byh9huDghYjPRqZ1yGW3lqYhIW3fC16XYaJSsHgqzRo5SD6WJpDENF7luL5uh80eK/LUWZUs6Ep6SLR66pFhxaMX9aOcBlDaKtDQrcrG9PCvIM04h6WsVdkpMXrC2oyD+/CYRvDiRxs5/Jwrz1O+cpFtIaCPozEv1I6GSckTGIVm3PGGUXG2kUzEZt2ResFCwW0izHIzL1a1JG4xETNGQbwWJlJ18VFMetao5YaUSnVn3zXI/Eipqw5Qno+WJwFAhsGLTbpVQ8Znsyq2ZtmLPguTHSF4UcV9vSlvo66UGCl2lyFZyvVJiU7km7Igyx3BUqqWTV6I0zFngQ6NcQqbKoYx2LXWh2J0IXBUt1axTmdAN+qJMjDRNEXGpXOC3Jmi16mFbRH0R9ngWSt3NcVGmi5FkpK1uFZgKayH2H+iIzUCkifVuWxGb0jbIYpFSXeoMeCDKPN0oSYOCPXThVxtIRRMrA8WHlYHWYSffvB43pHhCnFXtgpA32YUCD7lSIh2X83wslsQfTLcglGlsZsohb3TVEbPgirMJUiF8bdw2Q906nKw6pCRpakOth0o0h6kM/TpreaqvjTh1O2l9JLjL1lV6UhEbyZA8qznSWTpU3JjKyEaqRm+SPibDlre0F6Q66eQw34cdBaHjor4olVTdyeu3zUgp5VC8c7WcyyhjU/j5Ar2yRZKX4VlR/k3jLGhP4WrLxd1mL3C5S8YD7YLC+VPFkU4ehj0+IOO6Bek7Bxe1nDXpYV3URDVqASlJ0WNMKprOJG9EU7nffqb6DeeZ5JgxiUzuLB2qFdxK7Te/UZKFvMqX2aUW8ZQKQte3hL2ix2kXzLlGK8cuJxWTig5hoWA6yFxHupxT6ZKg7xFEITHUAvDQjISwhS4XcsUnvLc0IzGkzEDdWoM0Zc7cZglWJ2hXxaFWJN3Jusn1SNLeWFGlfjEzzYhEY+9THlVctqjH5F60ha2iqyUnqsXaO0qs2zohTxxQFhZpI+EqsuSazYRT/XcFdz4JB23C3q8pu1cSYU3Vf7mZ+GUKaoFdJfQ77jdrSv3CFoueuedzkggbxL1nNEuwWnGommh6uenKFplD4eiSQBFXTd9B2ZE09ST1n3XPdR6MG0mqwyywpkn3hdDfAmqpoF7HVuiha3nCbDgz6Voh51Njqr5naBiyJ8yU6ObRqBPnGKZmhDv/pqGS4lv01gStVj0kgRTKB1othzSZjHbOUTOKlmxa1Eql1u9SjQqqooMwNGPeaFM3iXZ1pUULo2IVJXbc9pDiUwlS5fCIq0HNl91xleoblSiT0SGMROqPrTlhiz6Lu+tRHkFLU54H0YwgFEpQIc0Frh2efcPxLW/4/t2/UfMCO08e1KB/3121Le2nJBeTXDWdJ+ftgPdpO8qivvHNf7PAWdJ2iyHXcebXC1yxtFdtKuexUT4qq4TNqGY3XK1tuwcZmL+R4woVI72dmmZKUobTmoPANdbusrC7sEZlimK8lSUhz+9atRzWii5x3YVv03uoP+YJWp3CXQSN7EtFXXqd+raYQmdpQyhq3X375Vc9EZS30pVSoMiV6G5Jm7pcilxK8re9HaWE7llDtzEurqevbqTuhkiXkWFjg8qRoRtx1zUF+U3C+cCEVTbJqvo4z7bz9Ky79Jj1xdzc/wARDj0u") format("woff"), url("../fonts/dashicons.ttf?99ac726223c749443b642ce33df8b800") format("truetype"); font-weight: 400; font-style: normal } .dashicons, .dashicons-before:before { font-family: dashicons, serif; display: inline-block; line-height: 1; font-weight: 400; font-style: normal; speak: never; text-decoration: inherit; text-transform: none; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; width: 20px; height: 20px; font-size: 20px; vertical-align: top; text-align: center; transition: color .1s ease-in } .dashicons-admin-appearance:before { content: "\f100" } .dashicons-admin-collapse:before { content: "\f148" } .dashicons-admin-comments:before { content: "\f101" } .dashicons-admin-customizer:before { content: "\f540" } .dashicons-admin-generic:before { content: "\f111" } .dashicons-admin-home:before { content: "\f102" } .dashicons-admin-links:before { content: "\f103" } .dashicons-admin-media:before { content: "\f104" } .dashicons-admin-multisite:before { content: "\f541" } .dashicons-admin-network:before { content: "\f112" } .dashicons-admin-page:before { content: "\f105" } .dashicons-admin-plugins:before { content: "\f106" } .dashicons-admin-post:before { content: "\f109" } .dashicons-admin-settings:before { content: "\f108" } .dashicons-admin-site-alt:before { content: "\f11d" } .dashicons-admin-site-alt2:before { content: "\f11e" } .dashicons-admin-site-alt3:before { content: "\f11f" } .dashicons-admin-site:before { content: "\f319" } .dashicons-admin-tools:before { content: "\f107" } .dashicons-admin-users:before { content: "\f110" } .dashicons-airplane:before { content: "\f15f" } .dashicons-album:before { content: "\f514" } .dashicons-align-center:before { content: "\f134" } .dashicons-align-full-width:before { content: "\f114" } .dashicons-align-left:before { content: "\f135" } .dashicons-align-none:before { content: "\f138" } .dashicons-align-pull-left:before { content: "\f10a" } .dashicons-align-pull-right:before { content: "\f10b" } .dashicons-align-right:before { content: "\f136" } .dashicons-align-wide:before { content: "\f11b" } .dashicons-amazon:before { content: "\f162" } .dashicons-analytics:before { content: "\f183" } .dashicons-archive:before { content: "\f480" } .dashicons-arrow-down-alt:before { content: "\f346" } .dashicons-arrow-down-alt2:before { content: "\f347" } .dashicons-arrow-down:before { content: "\f140" } .dashicons-arrow-left-alt:before { content: "\f340" } .dashicons-arrow-left-alt2:before { content: "\f341" } .dashicons-arrow-left:before { content: "\f141" } .dashicons-arrow-right-alt:before { content: "\f344" } .dashicons-arrow-right-alt2:before { content: "\f345" } .dashicons-arrow-right:before { content: "\f139" } .dashicons-arrow-up-alt:before { content: "\f342" } .dashicons-arrow-up-alt2:before { content: "\f343" } .dashicons-arrow-up-duplicate:before { content: "\f143" } .dashicons-arrow-up:before { content: "\f142" } .dashicons-art:before { content: "\f309" } .dashicons-awards:before { content: "\f313" } .dashicons-backup:before { content: "\f321" } .dashicons-bank:before { content: "\f16a" } .dashicons-beer:before { content: "\f16c" } .dashicons-bell:before { content: "\f16d" } .dashicons-block-default:before { content: "\f12b" } .dashicons-book-alt:before { content: "\f331" } .dashicons-book:before { content: "\f330" } .dashicons-buddicons-activity:before { content: "\f452" } .dashicons-buddicons-bbpress-logo:before { content: "\f477" } .dashicons-buddicons-buddypress-logo:before { content: "\f448" } .dashicons-buddicons-community:before { content: "\f453" } .dashicons-buddicons-forums:before { content: "\f449" } .dashicons-buddicons-friends:before { content: "\f454" } .dashicons-buddicons-groups:before { content: "\f456" } .dashicons-buddicons-pm:before { content: "\f457" } .dashicons-buddicons-replies:before { content: "\f451" } .dashicons-buddicons-topics:before { content: "\f450" } .dashicons-buddicons-tracking:before { content: "\f455" } .dashicons-building:before { content: "\f512" } .dashicons-businessman:before { content: "\f338" } .dashicons-businessperson:before { content: "\f12e" } .dashicons-businesswoman:before { content: "\f12f" } .dashicons-button:before { content: "\f11a" } .dashicons-calculator:before { content: "\f16e" } .dashicons-calendar-alt:before { content: "\f508" } .dashicons-calendar:before { content: "\f145" } .dashicons-camera-alt:before { content: "\f129" } .dashicons-camera:before { content: "\f306" } .dashicons-car:before { content: "\f16b" } .dashicons-carrot:before { content: "\f511" } .dashicons-cart:before { content: "\f174" } .dashicons-category:before { content: "\f318" } .dashicons-chart-area:before { content: "\f239" } .dashicons-chart-bar:before { content: "\f185" } .dashicons-chart-line:before { content: "\f238" } .dashicons-chart-pie:before { content: "\f184" } .dashicons-clipboard:before { content: "\f481" } .dashicons-clock:before { content: "\f469" } .dashicons-cloud-saved:before { content: "\f137" } .dashicons-cloud-upload:before { content: "\f13b" } .dashicons-cloud:before { content: "\f176" } .dashicons-code-standards:before { content: "\f13a" } .dashicons-coffee:before { content: "\f16f" } .dashicons-color-picker:before { content: "\f131" } .dashicons-columns:before { content: "\f13c" } .dashicons-controls-back:before { content: "\f518" } .dashicons-controls-forward:before { content: "\f519" } .dashicons-controls-pause:before { content: "\f523" } .dashicons-controls-play:before { content: "\f522" } .dashicons-controls-repeat:before { content: "\f515" } .dashicons-controls-skipback:before { content: "\f516" } .dashicons-controls-skipforward:before { content: "\f517" } .dashicons-controls-volumeoff:before { content: "\f520" } .dashicons-controls-volumeon:before { content: "\f521" } .dashicons-cover-image:before { content: "\f13d" } .dashicons-dashboard:before { content: "\f226" } .dashicons-database-add:before { content: "\f170" } .dashicons-database-export:before { content: "\f17a" } .dashicons-database-import:before { content: "\f17b" } .dashicons-database-remove:before { content: "\f17c" } .dashicons-database-view:before { content: "\f17d" } .dashicons-database:before { content: "\f17e" } .dashicons-desktop:before { content: "\f472" } .dashicons-dismiss:before { content: "\f153" } .dashicons-download:before { content: "\f316" } .dashicons-drumstick:before { content: "\f17f" } .dashicons-edit-large:before { content: "\f327" } .dashicons-edit-page:before { content: "\f186" } .dashicons-edit:before { content: "\f464" } .dashicons-editor-aligncenter:before { content: "\f207" } .dashicons-editor-alignleft:before { content: "\f206" } .dashicons-editor-alignright:before { content: "\f208" } .dashicons-editor-bold:before { content: "\f200" } .dashicons-editor-break:before { content: "\f474" } .dashicons-editor-code-duplicate:before { content: "\f494" } .dashicons-editor-code:before { content: "\f475" } .dashicons-editor-contract:before { content: "\f506" } .dashicons-editor-customchar:before { content: "\f220" } .dashicons-editor-expand:before { content: "\f211" } .dashicons-editor-help:before { content: "\f223" } .dashicons-editor-indent:before { content: "\f222" } .dashicons-editor-insertmore:before { content: "\f209" } .dashicons-editor-italic:before { content: "\f201" } .dashicons-editor-justify:before { content: "\f214" } .dashicons-editor-kitchensink:before { content: "\f212" } .dashicons-editor-ltr:before { content: "\f10c" } .dashicons-editor-ol-rtl:before { content: "\f12c" } .dashicons-editor-ol:before { content: "\f204" } .dashicons-editor-outdent:before { content: "\f221" } .dashicons-editor-paragraph:before { content: "\f476" } .dashicons-editor-paste-text:before { content: "\f217" } .dashicons-editor-paste-word:before { content: "\f216" } .dashicons-editor-quote:before { content: "\f205" } .dashicons-editor-removeformatting:before { content: "\f218" } .dashicons-editor-rtl:before { content: "\f320" } .dashicons-editor-spellcheck:before { content: "\f210" } .dashicons-editor-strikethrough:before { content: "\f224" } .dashicons-editor-table:before { content: "\f535" } .dashicons-editor-textcolor:before { content: "\f215" } .dashicons-editor-ul:before { content: "\f203" } .dashicons-editor-underline:before { content: "\f213" } .dashicons-editor-unlink:before { content: "\f225" } .dashicons-editor-video:before { content: "\f219" } .dashicons-ellipsis:before { content: "\f11c" } .dashicons-email-alt:before { content: "\f466" } .dashicons-email-alt2:before { content: "\f467" } .dashicons-email:before { content: "\f465" } .dashicons-embed-audio:before { content: "\f13e" } .dashicons-embed-generic:before { content: "\f13f" } .dashicons-embed-photo:before { content: "\f144" } .dashicons-embed-post:before { content: "\f146" } .dashicons-embed-video:before { content: "\f149" } .dashicons-excerpt-view:before { content: "\f164" } .dashicons-exit:before { content: "\f14a" } .dashicons-external:before { content: "\f504" } .dashicons-facebook-alt:before { content: "\f305" } .dashicons-facebook:before { content: "\f304" } .dashicons-feedback:before { content: "\f175" } .dashicons-filter:before { content: "\f536" } .dashicons-flag:before { content: "\f227" } .dashicons-food:before { content: "\f187" } .dashicons-format-aside:before { content: "\f123" } .dashicons-format-audio:before { content: "\f127" } .dashicons-format-chat:before { content: "\f125" } .dashicons-format-gallery:before { content: "\f161" } .dashicons-format-image:before { content: "\f128" } .dashicons-format-quote:before { content: "\f122" } .dashicons-format-status:before { content: "\f130" } .dashicons-format-video:before { content: "\f126" } .dashicons-forms:before { content: "\f314" } .dashicons-fullscreen-alt:before { content: "\f188" } .dashicons-fullscreen-exit-alt:before { content: "\f189" } .dashicons-games:before { content: "\f18a" } .dashicons-google:before { content: "\f18b" } .dashicons-googleplus:before { content: "\f462" } .dashicons-grid-view:before { content: "\f509" } .dashicons-groups:before { content: "\f307" } .dashicons-hammer:before { content: "\f308" } .dashicons-heading:before { content: "\f10e" } .dashicons-heart:before { content: "\f487" } .dashicons-hidden:before { content: "\f530" } .dashicons-hourglass:before { content: "\f18c" } .dashicons-html:before { content: "\f14b" } .dashicons-id-alt:before { content: "\f337" } .dashicons-id:before { content: "\f336" } .dashicons-image-crop:before { content: "\f165" } .dashicons-image-filter:before { content: "\f533" } .dashicons-image-flip-horizontal:before { content: "\f169" } .dashicons-image-flip-vertical:before { content: "\f168" } .dashicons-image-rotate-left:before { content: "\f166" } .dashicons-image-rotate-right:before { content: "\f167" } .dashicons-image-rotate:before { content: "\f531" } .dashicons-images-alt:before { content: "\f232" } .dashicons-images-alt2:before { content: "\f233" } .dashicons-index-card:before { content: "\f510" } .dashicons-info-outline:before { content: "\f14c" } .dashicons-info:before { content: "\f348" } .dashicons-insert-after:before { content: "\f14d" } .dashicons-insert-before:before { content: "\f14e" } .dashicons-insert:before { content: "\f10f" } .dashicons-instagram:before { content: "\f12d" } .dashicons-laptop:before { content: "\f547" } .dashicons-layout:before { content: "\f538" } .dashicons-leftright:before { content: "\f229" } .dashicons-lightbulb:before { content: "\f339" } .dashicons-linkedin:before { content: "\f18d" } .dashicons-list-view:before { content: "\f163" } .dashicons-location-alt:before { content: "\f231" } .dashicons-location:before { content: "\f230" } .dashicons-lock-duplicate:before { content: "\f315" } .dashicons-lock:before { content: "\f160" } .dashicons-marker:before { content: "\f159" } .dashicons-media-archive:before { content: "\f501" } .dashicons-media-audio:before { content: "\f500" } .dashicons-media-code:before { content: "\f499" } .dashicons-media-default:before { content: "\f498" } .dashicons-media-document:before { content: "\f497" } .dashicons-media-interactive:before { content: "\f496" } .dashicons-media-spreadsheet:before { content: "\f495" } .dashicons-media-text:before { content: "\f491" } .dashicons-media-video:before { content: "\f490" } .dashicons-megaphone:before { content: "\f488" } .dashicons-menu-alt:before { content: "\f228" } .dashicons-menu-alt2:before { content: "\f329" } .dashicons-menu-alt3:before { content: "\f349" } .dashicons-menu:before { content: "\f333" } .dashicons-microphone:before { content: "\f482" } .dashicons-migrate:before { content: "\f310" } .dashicons-minus:before { content: "\f460" } .dashicons-money-alt:before { content: "\f18e" } .dashicons-money:before { content: "\f526" } .dashicons-move:before { content: "\f545" } .dashicons-nametag:before { content: "\f484" } .dashicons-networking:before { content: "\f325" } .dashicons-no-alt:before { content: "\f335" } .dashicons-no:before { content: "\f158" } .dashicons-open-folder:before { content: "\f18f" } .dashicons-palmtree:before { content: "\f527" } .dashicons-paperclip:before { content: "\f546" } .dashicons-pdf:before { content: "\f190" } .dashicons-performance:before { content: "\f311" } .dashicons-pets:before { content: "\f191" } .dashicons-phone:before { content: "\f525" } .dashicons-pinterest:before { content: "\f192" } .dashicons-playlist-audio:before { content: "\f492" } .dashicons-playlist-video:before { content: "\f493" } .dashicons-plugins-checked:before { content: "\f485" } .dashicons-plus-alt:before { content: "\f502" } .dashicons-plus-alt2:before { content: "\f543" } .dashicons-plus:before { content: "\f132" } .dashicons-podio:before { content: "\f19c" } .dashicons-portfolio:before { content: "\f322" } .dashicons-post-status:before { content: "\f173" } .dashicons-pressthis:before { content: "\f157" } .dashicons-printer:before { content: "\f193" } .dashicons-privacy:before { content: "\f194" } .dashicons-products:before { content: "\f312" } .dashicons-randomize:before { content: "\f503" } .dashicons-reddit:before { content: "\f195" } .dashicons-redo:before { content: "\f172" } .dashicons-remove:before { content: "\f14f" } .dashicons-rest-api:before { content: "\f124" } .dashicons-rss:before { content: "\f303" } .dashicons-saved:before { content: "\f15e" } .dashicons-schedule:before { content: "\f489" } .dashicons-screenoptions:before { content: "\f180" } .dashicons-search:before { content: "\f179" } .dashicons-share-alt:before { content: "\f240" } .dashicons-share-alt2:before { content: "\f242" } .dashicons-share:before { content: "\f237" } .dashicons-shield-alt:before { content: "\f334" } .dashicons-shield:before { content: "\f332" } .dashicons-shortcode:before { content: "\f150" } .dashicons-slides:before { content: "\f181" } .dashicons-smartphone:before { content: "\f470" } .dashicons-smiley:before { content: "\f328" } .dashicons-sort:before { content: "\f156" } .dashicons-sos:before { content: "\f468" } .dashicons-spotify:before { content: "\f196" } .dashicons-star-empty:before { content: "\f154" } .dashicons-star-filled:before { content: "\f155" } .dashicons-star-half:before { content: "\f459" } .dashicons-sticky:before { content: "\f537" } .dashicons-store:before { content: "\f513" } .dashicons-superhero-alt:before { content: "\f197" } .dashicons-superhero:before { content: "\f198" } .dashicons-table-col-after:before { content: "\f151" } .dashicons-table-col-before:before { content: "\f152" } .dashicons-table-col-delete:before { content: "\f15a" } .dashicons-table-row-after:before { content: "\f15b" } .dashicons-table-row-before:before { content: "\f15c" } .dashicons-table-row-delete:before { content: "\f15d" } .dashicons-tablet:before { content: "\f471" } .dashicons-tag:before { content: "\f323" } .dashicons-tagcloud:before { content: "\f479" } .dashicons-testimonial:before { content: "\f473" } .dashicons-text-page:before { content: "\f121" } .dashicons-text:before { content: "\f478" } .dashicons-thumbs-down:before { content: "\f542" } .dashicons-thumbs-up:before { content: "\f529" } .dashicons-tickets-alt:before { content: "\f524" } .dashicons-tickets:before { content: "\f486" } .dashicons-tide:before { content: "\f10d" } .dashicons-translation:before { content: "\f326" } .dashicons-trash:before { content: "\f182" } .dashicons-twitch:before { content: "\f199" } .dashicons-twitter-alt:before { content: "\f302" } .dashicons-twitter:before { content: "\f301" } .dashicons-undo:before { content: "\f171" } .dashicons-universal-access-alt:before { content: "\f507" } .dashicons-universal-access:before { content: "\f483" } .dashicons-unlock:before { content: "\f528" } .dashicons-update-alt:before { content: "\f113" } .dashicons-update:before { content: "\f463" } .dashicons-upload:before { content: "\f317" } .dashicons-vault:before { content: "\f178" } .dashicons-video-alt:before { content: "\f234" } .dashicons-video-alt2:before { content: "\f235" } .dashicons-video-alt3:before { content: "\f236" } .dashicons-visibility:before { content: "\f177" } .dashicons-warning:before { content: "\f534" } .dashicons-welcome-add-page:before { content: "\f133" } .dashicons-welcome-comments:before { content: "\f117" } .dashicons-welcome-learn-more:before { content: "\f118" } .dashicons-welcome-view-site:before { content: "\f115" } .dashicons-welcome-widgets-menus:before { content: "\f116" } .dashicons-welcome-write-blog:before { content: "\f119" } .dashicons-whatsapp:before { content: "\f19a" } .dashicons-wordpress-alt:before { content: "\f324" } .dashicons-wordpress:before { content: "\f120" } .dashicons-xing:before { content: "\f19d" } .dashicons-yes-alt:before { content: "\f12a" } .dashicons-yes:before { content: "\f147" } .dashicons-youtube:before { content: "\f19b" } .dashicons-editor-distractionfree:before { content: "\f211" } .dashicons-exerpt-view:before { content: "\f164" } .dashicons-format-links:before { content: "\f103" } .dashicons-format-standard:before { content: "\f109" } .dashicons-post-trash:before { content: "\f182" } .dashicons-share1:before { content: "\f237" } .dashicons-welcome-edit-page:before { content: "\f119" } /*! This file is auto-generated */ html { --wp-admin--admin-bar--height: 32px; scroll-padding-top: var(--wp-admin--admin-bar--height) } /*! This file is auto-generated */ .wp-core-ui { .ui-content{ a { color: #2271b1; transition-property: border, background, color; transition-duration: .05s; transition-timing-function: ease-in-out } a, div { outline: 0 } a:active, a:hover { color: #135e96 } } .select:before, .select:after { content: none; } #wpwrap { height: auto; min-height: 100%; width: 100%; position: relative; -webkit-font-smoothing: subpixel-antialiased } #wpcontent { height: 100%; padding-left: 20px } .folded #wpcontent, .folded #wpfooter { margin-left: 36px } #wpbody-content { padding-bottom: 65px; float: left; width: 100%; overflow: visible } .inner-sidebar { float: right; clear: right; display: none; width: 281px; position: relative } .columns-2 .inner-sidebar { margin-right: auto; width: 286px; display: block } .columns-2 .inner-sidebar #side-sortables, .inner-sidebar #side-sortables { min-height: 300px; width: 280px; padding: 0 } .has-right-sidebar .inner-sidebar { display: block } .has-right-sidebar #post-body { float: left; clear: left; width: 100%; margin-right: -2000px } .has-right-sidebar #post-body-content { margin-right: 300px; float: none; width: auto } #col-left { float: left; width: 35% } #col-right { float: right; width: 65% } #col-left .col-wrap { padding: 0 6px 0 0 } #col-right .col-wrap { padding: 0 0 0 6px } .alignleft { float: left } .alignright { float: right } .textleft { text-align: left } .textright { text-align: right } .clear { clear: both } .wp-clearfix:after { content: ""; display: table; clear: both } .screen-reader-text, .screen-reader-text span, .ui-helper-hidden-accessible { border: 0; clip: rect(1px, 1px, 1px, 1px); -webkit-clip-path: inset(50%); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; word-wrap: normal !important } .button .screen-reader-text { height: auto } .screen-reader-shortcut { position: absolute; top: -1000em } .screen-reader-shortcut:focus { left: 6px; top: -25px; height: auto; width: auto; display: block; font-size: 14px; font-weight: 600; padding: 15px 23px 14px; background: #f0f0f1; color: #2271b1; z-index: 100000; line-height: normal; box-shadow: 0 0 2px 2px rgba(0, 0, 0, .6); text-decoration: none; outline: 2px solid transparent; outline-offset: -2px } .hidden, .js .closed .inside, .js .hide-if-js, .js .wp-core-ui .hide-if-js, .js.wp-core-ui .hide-if-js, .no-js .hide-if-no-js, .no-js .wp-core-ui .hide-if-no-js, .no-js.wp-core-ui .hide-if-no-js { display: none } #menu-management .menu-edit, #menu-settings-column .accordion-container, .comment-ays, .feature-filter, .imgedit-group, .manage-menus, .menu-item-handle, .popular-tags, .stuffbox, .widget-inside, .widget-top, .widgets-holder-wrap, .wp-editor-container, p.popular-tags, table.widefat { border: 1px solid #c3c4c7; box-shadow: 0 1px 1px rgba(0, 0, 0, .04) } .comment-ays, .feature-filter, .imgedit-group, .popular-tags, .stuffbox, .widgets-holder-wrap, .wp-editor-container, p.popular-tags, table.widefat { background: #fff } body, html { height: 100%; margin: 0; padding: 0 } body { background: #f0f0f1; color: #3c434a; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; line-height: 1.4em; min-width: 600px } body.iframe { min-width: 0; padding-top: 1px } body.modal-open { overflow: hidden } body.mobile.modal-open #wpwrap { overflow: hidden; position: fixed; height: 100% } iframe, img { border: 0 } td { font-family: inherit; font-size: inherit; font-weight: inherit; line-height: inherit } .wp-person a:focus .gravatar, a:focus, a:focus .media-icon img { color: #043959; box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8); outline: 1px solid transparent } #adminmenu a:focus { box-shadow: none; outline: 1px solid transparent; outline-offset: -1px } .screen-reader-text:focus { box-shadow: none; outline: 0 } blockquote, q { quotes: none } blockquote:after, blockquote:before, q:after, q:before { content: ""; content: none } .wp-die-message, p { font-size: 13px; line-height: 1.5; margin: 1em 0 } blockquote { margin: 1em } .wp-core-ui{ dd, li { margin-bottom: 6px } } h1, h2, h3, h4, h5, h6 { display: block; font-weight: 600 } h1 { color: #1d2327; font-size: 2em; margin: .67em 0 } h2, h3 { color: #1d2327; font-size: 1.3em; margin: 1em 0 } .update-core-php h2 { margin-top: 4em } .update-messages h2, .update-php h2, h4 { font-size: 1em; margin: 1.33em 0 } h5 { font-size: .83em; margin: 1.67em 0 } h6 { font-size: .67em; margin: 2.33em 0 } ol, ul { padding: 0 } ul { list-style: none } ol { list-style-type: decimal; margin-left: 2em } ul.ul-disc { list-style: disc outside } ul.ul-square { list-style: square outside } ol.ol-decimal { list-style: decimal outside } ol.ol-decimal, ul.ul-disc, ul.ul-square { margin-left: 1.8em } ol.ol-decimal > li, ul.ul-disc > li, ul.ul-square > li { margin: 0 0 .5em } .ltr { direction: ltr } .code, code { font-family: Consolas, Monaco, monospace; direction: ltr; unicode-bidi: embed } code, kbd { padding: 3px 5px 2px; margin: 0 1px; background: #f0f0f1; background: rgba(0, 0, 0, .07); font-size: 13px } .subsubsub { list-style: none; margin: 8px 0 0; padding: 0; font-size: 13px; float: left; color: #646970 } .subsubsub a { line-height: 2; padding: .2em; text-decoration: none } .subsubsub a .count, .subsubsub a.current .count { color: #50575e; font-weight: 400 } .subsubsub a.current { font-weight: 600; border: none } .subsubsub li { display: inline-block; margin: 0; padding: 0; white-space: nowrap } .widefat { border-spacing: 0; width: 100%; clear: both; margin: 0 } .widefat * { word-wrap: break-word } .widefat a, .widefat button.button-link { text-decoration: none } .widefat td, .widefat th { padding: 8px 10px } .widefat thead td, .widefat thead th { border-bottom: 1px solid #c3c4c7 } .widefat tfoot td, .widefat tfoot th { border-top: 1px solid #c3c4c7; border-bottom: none } .widefat .no-items td { border-bottom-width: 0 } .widefat td { vertical-align: top } .widefat td, .widefat td ol, .widefat td p, .widefat td ul { font-size: 13px; line-height: 1.5em } .widefat tfoot td, .widefat th, .widefat thead td { text-align: left; line-height: 1.3em; font-size: 14px } .updates-table td input, .widefat tfoot td input, .widefat th input, .widefat thead td input { margin: 0 0 0 8px; padding: 0; vertical-align: text-top } .widefat .check-column { width: 2.2em; padding: 6px 0 25px; vertical-align: top } .widefat tbody th.check-column { padding: 9px 0 22px } .updates-table tbody td.check-column, .widefat tbody th.check-column, .widefat tfoot td.check-column, .widefat thead td.check-column { padding: 11px 0 0 3px } .widefat tfoot td.check-column, .widefat thead td.check-column { padding-top: 4px; vertical-align: middle } .update-php div.error, .update-php div.updated { margin-left: 0 } .no-js .widefat tfoot .check-column input, .no-js .widefat thead .check-column input { display: none } .column-comments, .column-links, .column-posts, .widefat .num { text-align: center } .widefat th#comments { vertical-align: middle } .wrap { margin: 10px 20px 0 2px } .wrap.block-editor-no-js { padding-left: 20px } .postbox .inside h2, .wrap [class$=icon32] + h2, .wrap h1, .wrap > h2:first-child { font-size: 23px; font-weight: 400; margin: 0; padding: 9px 0 4px; line-height: 1.3 } .wrap h1.wp-heading-inline { display: inline-block; margin-right: 5px } .wp-header-end { visibility: hidden; margin: -2px 0 0 } .subtitle { margin: 0; padding-left: 25px; color: #50575e; font-size: 14px; font-weight: 400; line-height: 1 } .subtitle strong { word-break: break-all } .wrap .add-new-h2, .wrap .add-new-h2:active, .wrap .page-title-action, .wrap .page-title-action:active { margin-left: 4px; padding: 4px 8px; position: relative; top: -3px; text-decoration: none; border: 1px solid #2271b1; border-radius: 2px; text-shadow: none; font-weight: 600; font-size: 13px; line-height: normal; color: #2271b1; background: #f6f7f7; cursor: pointer } .wrap .wp-heading-inline + .page-title-action { margin-left: 0 } .wrap .add-new-h2:hover, .wrap .page-title-action:hover { background: #f0f0f1; border-color: #0a4b78; color: #0a4b78 } .page-title-action:focus { color: #0a4b78 } .form-table th label[for=WPLANG] .dashicons, .form-table th label[for=locale] .dashicons { margin-left: 5px } .wrap .page-title-action:focus { border-color: #3582c4; box-shadow: 0 0 0 1px #3582c4; outline: 2px solid transparent } .wrap h1.long-header { padding-right: 0 } .wp-dialog { background-color: #fff } #available-widgets .widget-top:hover, #widgets-left .widget-in-question .widget-top, #widgets-left .widget-top:hover, .widgets-chooser ul, div#widgets-right .widget-top:hover { border-color: #8c8f94; box-shadow: 0 1px 2px rgba(0, 0, 0, .1) } .sorthelper { background-color: #c5d9ed } .ac_match, .subsubsub a.current { color: #000 } .alternate, .striped > tbody > :nth-child(odd), ul.striped > :nth-child(odd) { background-color: #f6f7f7 } .bar { background-color: #f0f0f1; border-right-color: #4f94d4 } .highlight { background-color: #f0f6fc; color: #3c434a } .wp-ui-primary { color: #fff; background-color: #2c3338 } .wp-ui-text-primary { color: #2c3338 } .wp-ui-highlight { color: #fff; background-color: #2271b1 } .wp-ui-text-highlight { color: #2271b1 } .wp-ui-notification { color: #fff; background-color: #d63638 } .wp-ui-text-notification { color: #d63638 } .wp-ui-text-icon { color: #8c8f94 } img.emoji { display: inline !important; border: none !important; height: 1em !important; width: 1em !important; margin: 0 .07em !important; vertical-align: -.1em !important; background: 0 0 !important; padding: 0 !important; box-shadow: none !important } #nav-menu-footer, #nav-menu-header, #your-profile #rich_editing, .checkbox, .control-section .accordion-section-title, .menu-item-handle, .postbox .hndle, .side-info, .sidebar-name, .stuffbox .hndle, .widefat tfoot td, .widefat tfoot th, .widefat thead td, .widefat thead th, .widget .widget-top { line-height: 1.4em } .menu-item-handle, .widget .widget-top { background: #f6f7f7; color: #1d2327 } .stuffbox .hndle { border-bottom: 1px solid #c3c4c7 } .quicktags { background-color: #c3c4c7; color: #000; font-size: 12px } .icon32 { display: none } #bulk-titles div a:before, .notice-dismiss:before, .tagchecklist .ntdelbutton .remove-tag-icon:before, .welcome-panel .welcome-panel-close:before { background: 0 0; color: #787c82; content: "\f153"; display: block; font: normal 16px/20px dashicons; speak: never; height: 20px; text-align: center; width: 20px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .welcome-panel .welcome-panel-close:before { margin: 0 } #bulk-titles div a:before { margin: 1px 0 } .tagchecklist .ntdelbutton .remove-tag-icon:before { margin-left: 2px; border-radius: 50%; color: #2271b1; line-height: 1.28 } .tagchecklist .ntdelbutton:focus { outline: 0 } #bulk-titles div a:focus:before, #bulk-titles div a:hover:before, .tagchecklist .ntdelbutton:focus .remove-tag-icon:before, .tagchecklist .ntdelbutton:hover .remove-tag-icon:before { color: #d63638 } .tagchecklist .ntdelbutton:focus .remove-tag-icon:before { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8) } .key-labels label { line-height: 24px } b, strong { font-weight: 600 } .pre { white-space: pre-wrap; word-wrap: break-word } .howto { color: #646970; display: block } p.install-help { margin: 8px 0; font-style: italic } .no-break { white-space: nowrap } hr { border: 0; border-top: 1px solid #dcdcde; border-bottom: 1px solid #f6f7f7 } #all-plugins-table .plugins a.delete, #delete-link a.delete, #media-items a.delete, #media-items a.delete-permanently, #nav-menu-footer .menu-delete, #search-plugins-table .plugins a.delete, .plugins a.delete, .privacy_requests .remove-personal-data .remove-personal-data-handle, .row-actions span.delete a, .row-actions span.spam a, .row-actions span.trash a, .submitbox .submitdelete, a#remove-post-thumbnail { color: #b32d2e } #all-plugins-table .plugins a.delete:hover, #delete-link a.delete:hover, #media-items a.delete-permanently:hover, #media-items a.delete:hover, #nav-menu-footer .menu-delete:hover, #search-plugins-table .plugins a.delete:hover, .file-error, .plugins a.delete:hover, .privacy_requests .remove-personal-data .remove-personal-data-handle:hover, .row-actions .delete a:hover, .row-actions .spam a:hover, .row-actions .trash a:hover, .submitbox .submitdelete:hover, a#remove-post-thumbnail:hover, abbr.required, span.required { color: #b32d2e; border: none } #major-publishing-actions { padding: 10px; clear: both; border-top: 1px solid #dcdcde; background: #f6f7f7 } #delete-action { float: left; line-height: 2.30769231 } #delete-link { line-height: 2.30769231; vertical-align: middle; text-align: left; margin-left: 8px } #delete-link a { text-decoration: none } #publishing-action { text-align: right; float: right; line-height: 1.9 } #publishing-action .spinner { float: none; margin-top: 5px } #misc-publishing-actions { padding: 6px 0 0 } .misc-pub-section { padding: 6px 10px 8px } .misc-pub-filename { word-wrap: break-word } #minor-publishing-actions { padding: 10px 10px 0; text-align: right } #save-post { float: left } .preview { float: right } #sticky-span { margin-left: 18px } .approve, .unapproved .unapprove { display: none } .spam .approve, .trash .approve, .unapproved .approve { display: inline } td.action-links, th.action-links { text-align: right } #misc-publishing-actions .notice { margin-left: 10px; margin-right: 10px } .wp-filter { display: inline-block; position: relative; box-sizing: border-box; margin: 12px 0 25px; padding: 0 10px; width: 100%; box-shadow: 0 1px 1px rgba(0, 0, 0, .04); border: 1px solid #c3c4c7; background: #fff; color: #50575e; font-size: 13px } .wp-filter a { text-decoration: none } .filter-count { display: inline-block; vertical-align: middle; min-width: 4em } .filter-count .count, .title-count { display: inline-block; position: relative; top: -1px; padding: 4px 10px; border-radius: 30px; background: #646970; color: #fff; font-size: 14px; font-weight: 600 } .title-count { display: inline; top: -3px; margin-left: 5px; margin-right: 20px } .filter-items { float: left } .filter-links { display: inline-block; margin: 0 } .filter-links li { display: inline-block; margin: 0 } .filter-links li > a { display: inline-block; margin: 0 10px; padding: 15px 0; border-bottom: 4px solid #fff; color: #646970; cursor: pointer } .filter-links .current { box-shadow: none; border-bottom: 4px solid #646970; color: #1d2327 } .filter-links li > a:focus, .filter-links li > a:hover, .show-filters .filter-links a.current:focus, .show-filters .filter-links a.current:hover { color: #135e96 } .wp-filter .search-form { float: right; margin: 10px 0 } .wp-filter .search-form input[type=search] { margin: 1px 0; width: 280px; max-width: 100% } .wp-filter .search-form select { margin: 0 } .plugin-install-php .wp-filter { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center } .wp-filter .search-form.search-plugins { margin-top: 0 } .wp-filter .search-form.search-plugins .wp-filter-search, .wp-filter .search-form.search-plugins select { display: inline-block; margin-top: 10px; vertical-align: top } .wp-filter .button.drawer-toggle { margin: 10px 9px 0; padding: 0 10px 0 6px; border-color: transparent; background-color: transparent; color: #646970; vertical-align: baseline; box-shadow: none } .wp-filter .drawer-toggle:before { content: "\f111"; margin: 0 5px 0 0; color: #646970; font: normal 16px/1 dashicons; vertical-align: text-bottom; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .wp-filter .button.drawer-toggle:focus, .wp-filter .button.drawer-toggle:hover, .wp-filter .drawer-toggle:focus:before, .wp-filter .drawer-toggle:hover:before { background-color: transparent; color: #135e96 } .wp-filter .button.drawer-toggle:focus:active, .wp-filter .button.drawer-toggle:hover { border-color: transparent } .wp-filter .button.drawer-toggle:focus { border-color: #4f94d4 } .wp-filter .button.drawer-toggle:active { background: 0 0; box-shadow: none; transform: none } .wp-filter .drawer-toggle.current:before { color: #fff } .filter-drawer, .wp-filter .favorites-form { display: none; margin: 0 -10px 0 -20px; padding: 20px; border-top: 1px solid #f0f0f1; background: #f6f7f7; overflow: hidden } .show-favorites-form .favorites-form, .show-filters .filter-drawer { display: block } .show-filters .filter-links a.current { border-bottom: none } .show-filters .wp-filter .button.drawer-toggle { border-radius: 2px; background: #646970; color: #fff } .show-filters .wp-filter .drawer-toggle:focus, .show-filters .wp-filter .drawer-toggle:hover { background: #2271b1 } .show-filters .wp-filter .drawer-toggle:before { color: #fff } .filter-group { box-sizing: border-box; position: relative; float: left; margin: 0 1% 0 0; padding: 20px 10px 10px; width: 24%; background: #fff; border: 1px solid #dcdcde; box-shadow: 0 1px 1px rgba(0, 0, 0, .04) } .filter-group legend { position: absolute; top: 10px; display: block; margin: 0; padding: 0; font-size: 1em; font-weight: 600 } .filter-drawer .filter-group-feature { margin: 28px 0 0; list-style-type: none; font-size: 12px } .filter-drawer .filter-group-feature input, .filter-drawer .filter-group-feature label { line-height: 1.4 } .filter-drawer .filter-group-feature input { position: absolute; margin: 0 } .filter-group .filter-group-feature label { display: block; margin: 14px 0 14px 23px } .filter-drawer .buttons { clear: both; margin-bottom: 20px } .filter-drawer .filter-group + .buttons { margin-bottom: 0; padding-top: 20px } .filter-drawer .buttons .button span { display: inline-block; opacity: .8; font-size: 12px; text-indent: 10px } .wp-filter .button.clear-filters { display: none; margin-left: 10px } .wp-filter .button-link.edit-filters { padding: 0 5px; line-height: 2.2 } .filtered-by { display: none; margin: 0 } .filtered-by > span { font-weight: 600 } .filtered-by a { margin-left: 10px } .filtered-by .tags { display: inline } .filtered-by .tag { margin: 0 5px; padding: 4px 8px; border: 1px solid #dcdcde; box-shadow: 0 1px 1px rgba(0, 0, 0, .04); background: #fff; font-size: 11px } .filters-applied .filter-drawer .buttons, .filters-applied .filter-drawer br, .filters-applied .filter-group { display: none } .filters-applied .filtered-by { display: block } .filters-applied .filter-drawer { padding: 20px } .error .content-filterable, .loading-content .content-filterable, .show-filters .content-filterable, .show-filters .favorites-form, .show-filters.filters-applied.loading-content .content-filterable { display: none } .show-filters.filters-applied .content-filterable { display: block } .loading-content .spinner { display: block; margin: 40px auto 0; float: none } @media only screen and (max-width: 1120px) { .filter-drawer { border-bottom: 1px solid #f0f0f1 } .filter-group { margin-bottom: 0; margin-top: 5px; width: 100% } .filter-group li { margin: 10px 0 } } @media only screen and (max-width: 1000px) { .filter-items { float: none } .wp-filter .media-toolbar-primary, .wp-filter .media-toolbar-secondary, .wp-filter .search-form { float: none; position: relative; max-width: 100% } } @media only screen and (max-width: 782px) { .filter-group li { padding: 0; width: 50% } } @media only screen and (max-width: 320px) { .filter-count { display: none } .wp-filter .drawer-toggle { margin: 10px 0 } .filter-group li, .wp-filter .search-form input[type=search] { width: 100% } } .notice, div.error, div.updated { background: #fff; border: 1px solid #c3c4c7; border-left-width: 4px; box-shadow: 0 1px 1px rgba(0, 0, 0, .04); margin: 5px 15px 2px; padding: 1px 12px } div[class=update-message] { padding: .5em 12px .5em 0 } .form-table td .notice p, .notice p, .notice-title, div.error p, div.updated p { margin: .5em 0; padding: 2px } .error a { text-decoration: underline } .updated a { padding-bottom: 2px } .notice-alt { box-shadow: none } .notice-large { padding: 10px 20px } .notice-title { display: inline-block; color: #1d2327; font-size: 18px } .wp-core-ui .notice.is-dismissible { padding-right: 38px; position: relative } .notice-dismiss { position: absolute; top: 0; right: 1px; border: none; margin: 0; padding: 9px; background: 0 0; color: #787c82; cursor: pointer } .notice-dismiss:active:before, .notice-dismiss:focus:before, .notice-dismiss:hover:before { color: #d63638 } .notice-dismiss:focus { outline: 0; box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8) } .notice-success, div.updated { border-left-color: #00a32a } .notice-success.notice-alt { background-color: #edfaef } .notice-warning { border-left-color: #dba617 } .notice-warning.notice-alt { background-color: #fcf9e8 } .notice-error, div.error { border-left-color: #d63638 } .notice-error.notice-alt { background-color: #fcf0f1 } .notice-info { border-left-color: #72aee6 } .notice-info.notice-alt { background-color: #f0f6fc } .button.installed:before, .button.installing:before, .button.updated-message:before, .button.updating-message:before, .import-php .updating-message:before, .update-message p:before, .updated-message p:before, .updating-message p:before { display: inline-block; font: normal 20px/1 dashicons; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; vertical-align: top } .media-upload-form .notice, .media-upload-form div.error, .wrap .notice, .wrap div.error, .wrap div.updated { margin: 5px 0 15px } .wrap #templateside .notice { display: block; margin: 0; padding: 5px 8px; font-weight: 600; text-decoration: none } .wrap #templateside span.notice { margin-left: -12px } #templateside li.notice a { padding: 0 } .button.installing:before, .button.updating-message:before, .import-php .updating-message:before, .update-message p:before, .updating-message p:before { color: #d63638; content: "\f463" } .button.installing:before, .button.updating-message:before, .import-php .updating-message:before, .plugins .column-auto-updates .dashicons-update.spin, .theme-overlay .theme-autoupdate .dashicons-update.spin, .updating-message p:before { animation: rotation 2s infinite linear } @media (prefers-reduced-motion: reduce) { .button.installing:before, .button.updating-message:before, .import-php .updating-message:before, .plugins .column-auto-updates .dashicons-update.spin, .theme-overlay .theme-autoupdate .dashicons-update.spin, .updating-message p:before { animation: none } } .theme-overlay .theme-autoupdate .dashicons-update.spin { margin-right: 3px } .button.updated-message:before, .installed p:before, .updated-message p:before { color: #68de7c; content: "\f147" } .update-message.notice-error p:before { color: #d63638; content: "\f534" } .import-php .updating-message:before, .wrap .notice p:before { margin-right: 6px; vertical-align: bottom } #update-nag, .update-nag { display: inline-block; line-height: 1.4; padding: 11px 15px; font-size: 14px; margin: 25px 20px 0 2px } ul#dismissed-updates { display: none } #dismissed-updates li > p { margin-top: 0 } #dismiss, #undismiss { margin-left: .5em } form.upgrade { margin-top: 8px } form.upgrade .hint { font-style: italic; font-size: 85%; margin: -.5em 0 2em } .update-php .spinner { float: none; margin: -4px 0 } h2.wp-current-version { margin-bottom: .3em } p.update-last-checked { margin-top: 0 } p.auto-update-status { margin-top: 2em; line-height: 1.8 } #ajax-loading, .ajax-feedback, .ajax-loading, .imgedit-wait-spin, .list-ajax-loading { visibility: hidden } #ajax-response.alignleft { margin-left: 2em } .button.installed:before, .button.installing:before, .button.updated-message:before, .button.updating-message:before { margin: 3px 5px 0 -2px } .button-primary.updating-message:before { color: #fff } .button-primary.updated-message:before { color: #9ec2e6 } .button.updated-message { transition-property: border, background, color; transition-duration: .05s; transition-timing-function: ease-in-out } @media aural { .button.installed:before, .button.installing:before, .update-message p:before, .wrap .notice p:before { speak: never } } #adminmenu a, #catlist a, #taglist a { text-decoration: none } #contextual-help-wrap, #screen-options-wrap { margin: 0; padding: 8px 20px 12px; position: relative } #contextual-help-wrap { overflow: auto; margin-left: 0 } #screen-meta-links { float: right; margin: 0 20px 0 0 } #screen-meta { display: none; margin: 0 20px -1px 0; position: relative; background-color: #fff; border: 1px solid #c3c4c7; border-top: none; box-shadow: 0 0 0 transparent } #contextual-help-link-wrap, #screen-options-link-wrap { float: left; margin: 0 0 0 6px } #screen-meta-links .screen-meta-toggle { position: relative; top: 0 } #screen-meta-links .show-settings { border: 1px solid #c3c4c7; border-top: none; height: auto; margin-bottom: 0; padding: 3px 6px 3px 16px; background: #fff; border-radius: 0 0 4px 4px; color: #646970; line-height: 1.7; box-shadow: 0 0 0 transparent; transition: box-shadow .1s linear } #screen-meta-links .show-settings:active, #screen-meta-links .show-settings:focus, #screen-meta-links .show-settings:hover { color: #2c3338 } #screen-meta-links .show-settings:focus { border-color: #4f94d4; box-shadow: 0 0 3px rgba(34, 113, 177, .8) } #screen-meta-links .show-settings:active { transform: none } #screen-meta-links .show-settings:after { right: 0; content: "\f140"; font: normal 20px/1 dashicons; speak: never; display: inline-block; padding: 0 5px 0 0; bottom: 2px; position: relative; vertical-align: bottom; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-decoration: none } #screen-meta-links .screen-meta-active:after { content: "\f142" } .toggle-arrow { background-repeat: no-repeat; background-position: top left; background-color: transparent; height: 22px; line-height: 22px; display: block } .toggle-arrow-active { background-position: bottom left } #contextual-help-wrap h5, #screen-options-wrap h5, #screen-options-wrap legend { margin: 0; padding: 8px 0; font-size: 13px; font-weight: 600 } .metabox-prefs label { display: inline-block; padding-right: 15px; line-height: 2.35 } #number-of-columns { display: inline-block; vertical-align: middle; line-height: 30px } .metabox-prefs input[type=checkbox] { margin-top: 0; margin-right: 6px } .metabox-prefs label input, .metabox-prefs label input[type=checkbox] { margin: -4px 5px 0 0 } .metabox-prefs .columns-prefs label input { margin: -1px 2px 0 0 } .metabox-prefs label a { display: none } .metabox-prefs .screen-options input, .metabox-prefs .screen-options label { margin-top: 0; margin-bottom: 0; vertical-align: middle } .metabox-prefs .screen-options .screen-per-page { margin-right: 15px } .metabox-prefs .screen-options label { line-height: 2.2; padding-right: 0 } .screen-options + .screen-options { margin-top: 10px } .metabox-prefs .submit { margin-top: 1em; padding: 0 } #contextual-help-wrap { padding: 0 } #contextual-help-columns { position: relative } #contextual-help-back { position: absolute; top: 0; bottom: 0; left: 150px; right: 170px; border: 1px solid #c3c4c7; border-top: none; border-bottom: none; background: #f0f6fc } #contextual-help-wrap.no-sidebar #contextual-help-back { right: 0; border-right-width: 0; border-bottom-right-radius: 2px } .contextual-help-tabs { float: left; width: 150px; margin: 0 } .contextual-help-tabs ul { margin: 1em 0 } .contextual-help-tabs li { margin-bottom: 0; list-style-type: none; border-style: solid; border-width: 0 0 0 2px; border-color: transparent } .contextual-help-tabs a { display: block; padding: 5px 5px 5px 12px; line-height: 1.4; text-decoration: none; border: 1px solid transparent; border-right: none; border-left: none } .contextual-help-tabs a:hover { color: #2c3338 } .contextual-help-tabs .active { padding: 0; margin: 0 -1px 0 0; border-left: 2px solid #72aee6; background: #f0f6fc; box-shadow: 0 2px 0 rgba(0, 0, 0, .02), 0 1px 0 rgba(0, 0, 0, .02) } .contextual-help-tabs .active a { border-color: #c3c4c7; color: #2c3338 } .contextual-help-tabs-wrap { padding: 0 20px; overflow: auto } .help-tab-content { display: none; margin: 0 22px 12px 0; line-height: 1.6 } .help-tab-content.active { display: block } .help-tab-content ul li { list-style-type: disc; margin-left: 18px } .contextual-help-sidebar { width: 150px; float: right; padding: 0 8px 0 12px; overflow: auto } html.wp-toolbar { padding-top: 32px; box-sizing: border-box; -ms-overflow-style: scrollbar } .widefat td, .widefat th { color: #50575e } .widefat tfoot td, .widefat th, .widefat thead td { font-weight: 400 } .widefat tfoot tr td, .widefat tfoot tr th, .widefat thead tr td, .widefat thead tr th { color: #2c3338 } .widefat td p { margin: 2px 0 .8em } .widefat ol, .widefat p, .widefat ul { color: #2c3338 } .widefat .column-comment p { margin: .6em 0 } .widefat .column-comment ul { list-style: initial; margin-left: 2em } .postbox-container { float: left } .postbox-container .meta-box-sortables { box-sizing: border-box } #wpbody-content .metabox-holder { padding-top: 10px } .metabox-holder .postbox-container .meta-box-sortables { min-height: 1px; position: relative } #post-body-content { width: 100%; min-width: 463px; float: left } #post-body.columns-2 #postbox-container-1 { float: right; margin-right: -300px; width: 280px } #post-body.columns-2 #side-sortables { min-height: 250px } @media only screen and (max-width: 799px) { #wpbody-content .metabox-holder .postbox-container .empty-container { outline: 0; height: 0; min-height: 0 } } .js .postbox .hndle, .js .widget .widget-top { cursor: move } .js .postbox .hndle.is-non-sortable, .js .widget .widget-top.is-non-sortable { cursor: auto } .hndle a { font-size: 12px; font-weight: 400 } .postbox-header { display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid #c3c4c7 } .postbox-header .hndle { flex-grow: 1; display: flex; justify-content: space-between; align-items: center } .postbox-header .handle-actions { flex-shrink: 0 } .postbox .handle-order-higher, .postbox .handle-order-lower, .postbox .handlediv { width: 36px; height: 36px; margin: 0; padding: 0; border: 0; background: 0 0; cursor: pointer } .postbox .handle-order-higher, .postbox .handle-order-lower { color: #787c82; width: 1.62rem } .edit-post-meta-boxes-area .postbox .handle-order-higher, .edit-post-meta-boxes-area .postbox .handle-order-lower { width: 44px; height: 44px; color: #1d2327 } .postbox .handle-order-higher[aria-disabled=true], .postbox .handle-order-lower[aria-disabled=true] { cursor: default; color: #a7aaad } .sortable-placeholder { border: 1px dashed #c3c4c7; margin-bottom: 20px } .postbox, .stuffbox { margin-bottom: 20px; padding: 0; line-height: 1 } .postbox.closed { border-bottom: 0 } .postbox .hndle, .stuffbox .hndle { -webkit-user-select: none; user-select: none } .postbox .inside { padding: 0 12px 12px; line-height: 1.4; font-size: 13px } .stuffbox .inside { padding: 0; line-height: 1.4; font-size: 13px; margin-top: 0 } .postbox .inside { margin: 11px 0; position: relative } .postbox .inside > p:last-child, .rss-widget ul li:last-child { margin-bottom: 1px !important } .postbox.closed h3 { border: none; box-shadow: none } .postbox table.form-table { margin-bottom: 0 } .postbox table.widefat { box-shadow: none } .temp-border { border: 1px dotted #c3c4c7 } .columns-prefs label { padding: 0 10px 0 0 } #adminmenu .wp-submenu li.current, #adminmenu .wp-submenu li.current a, #adminmenu .wp-submenu li.current a:hover, #comment-status-display, #dashboard_right_now .versions .b, #ed_reply_toolbar #ed_reply_strong, #pass-strength-result.short, #pass-strength-result.strong, #post-status-display, #post-visibility-display, .feature-filter .feature-name, .item-controls .item-order a, .media-item .percent, .plugins .name { font-weight: 600 } #wpfooter { position: absolute; bottom: 0; left: 0; right: 0; padding: 10px 20px; color: #50575e } #wpfooter p { font-size: 13px; margin: 0; line-height: 1.55 } #footer-thankyou { font-style: italic } .nav-tab { float: left; border: 1px solid #c3c4c7; border-bottom: none; margin-left: .5em; padding: 5px 10px; font-size: 14px; line-height: 1.71428571; font-weight: 600; background: #dcdcde; color: #50575e; text-decoration: none; white-space: nowrap } .nav-tab-small .nav-tab, h3 .nav-tab { padding: 5px 14px; font-size: 12px; line-height: 1.33 } .nav-tab:focus, .nav-tab:hover { background-color: #fff; color: #3c434a } .nav-tab-active, .nav-tab:focus:active { box-shadow: none } .nav-tab-active { margin-bottom: -1px; color: #3c434a } .nav-tab-active, .nav-tab-active:focus, .nav-tab-active:focus:active, .nav-tab-active:hover { border-bottom: 1px solid #f0f0f1; background: #f0f0f1; color: #000 } .nav-tab-wrapper, .wrap h2.nav-tab-wrapper, h1.nav-tab-wrapper { border-bottom: 1px solid #c3c4c7; margin: 0; padding-top: 9px; padding-bottom: 0; line-height: inherit } .nav-tab-wrapper:not(.wp-clearfix):after { content: ""; display: table; clear: both } .spinner { background: url(images/spinner.gif) no-repeat; background-size: 20px 20px; display: inline-block; visibility: hidden; float: right; vertical-align: middle; opacity: .7; width: 20px; height: 20px; margin: 4px 10px 0 } .loading-content .spinner, .spinner.is-active { visibility: visible } #template > div { margin-right: 16em } #template .notice { margin-top: 1em; margin-right: 3% } #template .notice p { width: auto } #template .submit .spinner { float: none } .metabox-holder .postbox > h3, .metabox-holder .stuffbox > h3, .metabox-holder h2.hndle, .metabox-holder h3.hndle { font-size: 14px; padding: 8px 12px; margin: 0; line-height: 1.4 } .nav-menus-php .metabox-holder h3 { padding: 10px 10px 11px 14px; line-height: 1.5 } #templateside ul li a { text-decoration: none } .plugin-install #description, .plugin-install-network #description { width: 60% } table .column-rating, table .column-visible, table .vers { text-align: left } .attention, .error-message { color: #d63638; font-weight: 600 } body.iframe { height: 98% } .lp-show-latest p { display: none } .lp-show-latest .lp-error p, .lp-show-latest p:last-child { display: block } .media-icon { width: 62px; text-align: center } .media-icon img { border: 1px solid #dcdcde; border: 1px solid rgba(0, 0, 0, .07) } #howto { font-size: 11px; margin: 0 5px; display: block } .importers { font-size: 16px; width: auto } .importers td { padding-right: 14px; line-height: 1.4 } .importers .import-system { max-width: 250px } .importers td.desc { max-width: 500px } .importer-action, .importer-desc, .importer-title { display: block } .importer-title { color: #000; font-size: 14px; font-weight: 400; margin-bottom: .2em } .importer-action { line-height: 1.55; color: #50575e; margin-bottom: 1em } #post-body #post-body-content #namediv h2, #post-body #post-body-content #namediv h3 { margin-top: 0 } .edit-comment-author { color: #1d2327; border-bottom: 1px solid #f0f0f1 } #namediv h2 label, #namediv h3 label { vertical-align: baseline } #namediv table { width: 100% } #namediv td.first { width: 10px; white-space: nowrap } #namediv input { width: 100% } #namediv p { margin: 10px 0 } .zerosize { height: 0; width: 0; margin: 0; border: 0; padding: 0; overflow: hidden; position: absolute } br.clear { height: 2px; line-height: .15 } .checkbox { border: none; margin: 0; padding: 0 } fieldset { border: 0; padding: 0; margin: 0 } .post-categories { display: inline; margin: 0; padding: 0 } .post-categories li { display: inline } div.star-holder { position: relative; height: 17px; width: 100px; background: url(images/stars.png?ver=20121108) repeat-x bottom left } div.star-holder .star-rating { background: url(images/stars.png?ver=20121108) repeat-x top left; height: 17px; float: left } .star-rating { white-space: nowrap } .star-rating .star { display: inline-block; width: 20px; height: 20px; -webkit-font-smoothing: antialiased; font-size: 20px; line-height: 1; font-family: dashicons; text-decoration: inherit; font-weight: 400; font-style: normal; vertical-align: top; transition: color .1s ease-in; text-align: center; color: #dba617 } .star-rating .star-full:before { content: "\f155" } .star-rating .star-half:before { content: "\f459" } .rtl .star-rating .star-half { transform: rotateY(180deg) } .star-rating .star-empty:before { content: "\f154" } div.action-links { font-weight: 400; margin: 6px 0 0 } #plugin-information { background: #fff; position: fixed; top: 0; right: 0; bottom: 0; left: 0; height: 100%; padding: 0 } #plugin-information-scrollable { overflow: auto; -webkit-overflow-scrolling: touch; height: 100% } #plugin-information-title { padding: 0 26px; background: #f6f7f7; font-size: 22px; font-weight: 600; line-height: 2.4; position: relative; height: 56px } #plugin-information-title.with-banner { margin-right: 0; height: 250px; background-size: cover } #plugin-information-title h2 { font-size: 1em; font-weight: 600; padding: 0; margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap } #plugin-information-title.with-banner h2 { position: relative; font-family: "Helvetica Neue", sans-serif; display: inline-block; font-size: 30px; line-height: 1.68; box-sizing: border-box; max-width: 100%; padding: 0 15px; margin-top: 174px; color: #fff; background: rgba(29, 35, 39, .9); text-shadow: 0 1px 3px rgba(0, 0, 0, .4); box-shadow: 0 0 30px rgba(255, 255, 255, .1); border-radius: 8px } #plugin-information-title div.vignette { display: none } #plugin-information-title.with-banner div.vignette { position: absolute; display: block; top: 0; left: 0; height: 250px; width: 100%; background: 0 0; box-shadow: inset 0 0 50px 4px rgba(0, 0, 0, .2), inset 0 -1px 0 rgba(0, 0, 0, .1) } #plugin-information-tabs { padding: 0 16px; position: relative; right: 0; left: 0; min-height: 36px; font-size: 0; z-index: 1; border-bottom: 1px solid #dcdcde; background: #f6f7f7 } #plugin-information-tabs a { position: relative; display: inline-block; padding: 9px 10px; margin: 0; height: 18px; line-height: 1.3; font-size: 14px; text-decoration: none; transition: none } #plugin-information-tabs a.current { margin: 0 -1px -1px; background: #fff; border: 1px solid #dcdcde; border-bottom-color: #fff; padding-top: 8px; color: #2c3338 } #plugin-information-tabs.with-banner a.current { border-top: none; padding-top: 9px } #plugin-information-tabs a:active, #plugin-information-tabs a:focus { outline: 0 } #plugin-information-content { overflow: hidden; background: #fff; position: relative; top: 0; right: 0; left: 0; min-height: 100%; min-height: calc(100% - 152px) } #plugin-information-content.with-banner { min-height: calc(100% - 346px) } #section-holder { position: relative; top: 0; right: 250px; bottom: 0; left: 0; margin-top: 10px; margin-right: 250px; padding: 10px 26px 99999px; margin-bottom: -99932px } #section-holder .notice { margin: 5px 0 15px } #section-holder .updated { margin: 16px 0 } #plugin-information .fyi { float: right; position: relative; top: 0; right: 0; padding: 16px 16px 99999px; margin-bottom: -99932px; width: 217px; border-left: 1px solid #dcdcde; background: #f6f7f7; color: #646970 } #plugin-information .fyi strong { color: #3c434a } #plugin-information .fyi h3 { font-weight: 600; text-transform: uppercase; font-size: 12px; color: #646970; margin: 24px 0 8px } #plugin-information .fyi h2 { font-size: .9em; margin-bottom: 0; margin-right: 0 } #plugin-information .fyi ul { padding: 0; margin: 0; list-style: none } #plugin-information .fyi li { margin: 0 0 10px } #plugin-information .fyi-description { margin-top: 0 } #plugin-information .counter-container { margin: 3px 0 } #plugin-information .counter-label { float: left; margin-right: 5px; min-width: 55px } #plugin-information .counter-back { height: 17px; width: 92px; background-color: #dcdcde; float: left } #plugin-information .counter-bar { height: 17px; background-color: #f0c33c; float: left } #plugin-information .counter-count { margin-left: 5px } #plugin-information .fyi ul.contributors { margin-top: 10px } #plugin-information .fyi ul.contributors li { display: inline-block; margin-right: 8px; vertical-align: middle } #plugin-information .fyi ul.contributors li { display: inline-block; margin-right: 8px; vertical-align: middle } #plugin-information .fyi ul.contributors li img { vertical-align: middle; margin-right: 4px } #plugin-information-footer { padding: 13px 16px; position: absolute; right: 0; bottom: 0; left: 0; height: 40px; border-top: 1px solid #dcdcde; background: #f6f7f7 } #plugin-information .section { direction: ltr } #plugin-information .section ol, #plugin-information .section ul { list-style-type: disc; margin-left: 24px } #plugin-information .section, #plugin-information .section p { font-size: 14px; line-height: 1.7 } #plugin-information #section-screenshots ol { list-style: none; margin: 0 } #plugin-information #section-screenshots li img { vertical-align: text-top; margin-top: 16px; max-width: 100%; width: auto; height: auto; box-shadow: 0 1px 2px rgba(0, 0, 0, .3) } #plugin-information #section-screenshots li p { font-style: italic; padding-left: 20px } #plugin-information pre { padding: 7px; overflow: auto; border: 1px solid #c3c4c7 } #plugin-information blockquote { border-left: 2px solid #dcdcde; color: #646970; font-style: italic; margin: 1em 0; padding: 0 0 0 1em } #plugin-information .review { overflow: hidden; width: 100%; margin-bottom: 20px; border-bottom: 1px solid #dcdcde } #plugin-information .review-title-section { overflow: hidden } #plugin-information .review-title-section h4 { display: inline-block; float: left; margin: 0 6px 0 0 } #plugin-information .reviewer-info p { clear: both; margin: 0; padding-top: 2px } #plugin-information .reviewer-info .avatar { float: left; margin: 4px 6px 0 0 } #plugin-information .reviewer-info .star-rating { float: left } #plugin-information .review-meta { float: left; margin-left: .75em } #plugin-information .review-body { float: left; width: 100% } .plugin-version-author-uri { font-size: 13px } .update-php .button.button-primary { margin-right: 1em } @media screen and (max-width: 771px) { #plugin-information-title.with-banner { height: 100px } #plugin-information-title.with-banner h2 { margin-top: 30px; font-size: 20px; line-height: 2; max-width: 85% } #plugin-information-title.with-banner div.vignette { height: 100px } #plugin-information-tabs { overflow: hidden; padding: 0; height: auto } #plugin-information-tabs a.current { margin-bottom: 0; border-bottom: none } #plugin-information .fyi { float: none; border: 1px solid #dcdcde; position: static; width: auto; margin: 26px 26px 0; padding-bottom: 0 } #section-holder { position: static; margin: 0; padding-bottom: 70px } #plugin-information .fyi h3, #plugin-information .fyi small { display: none } #plugin-information-footer { padding: 12px 16px 0; height: 46px } } #TB_window.plugin-details-modal { background: #fff } #TB_window.plugin-details-modal.thickbox-loading:before { content: ""; display: block; width: 20px; height: 20px; position: absolute; left: 50%; top: 50%; z-index: -1; margin: -10px 0 0 -10px; background: #fff url(images/spinner.gif) no-repeat center; background-size: 20px 20px; transform: translateZ(0) } @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { #TB_window.plugin-details-modal.thickbox-loading:before { background-image: url(images/spinner-2x.gif) } } .plugin-details-modal #TB_title { float: left; height: 1px } .plugin-details-modal #TB_ajaxWindowTitle { display: none } .plugin-details-modal #TB_closeWindowButton { left: auto; right: -30px; color: #f0f0f1 } .plugin-details-modal #TB_closeWindowButton:focus, .plugin-details-modal #TB_closeWindowButton:hover { color: #135e96; outline: 0; box-shadow: none } .plugin-details-modal .tb-close-icon { display: none } .plugin-details-modal #TB_closeWindowButton:after { content: "\f335"; font: normal 32px/29px dashicons; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } @media screen and (max-width: 830px) { .plugin-details-modal #TB_closeWindowButton { right: 0; top: -30px } } img { border: none } .bulk-action-notice .toggle-indicator::before, .meta-box-sortables .postbox .order-higher-indicator::before, .meta-box-sortables .postbox .order-lower-indicator::before, .meta-box-sortables .postbox .toggle-indicator::before, .privacy-text-box .toggle-indicator::before, .sidebar-name .toggle-indicator::before { content: "\f142"; display: inline-block; font: normal 20px/1 dashicons; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-decoration: none } .bulk-action-notice .bulk-action-errors-collapsed .toggle-indicator::before, .js .widgets-holder-wrap.closed .toggle-indicator::before, .meta-box-sortables .postbox.closed .handlediv .toggle-indicator::before, .privacy-text-box.closed .toggle-indicator::before { content: "\f140" } .postbox .handle-order-higher .order-higher-indicator::before { content: "\f343"; color: inherit } .postbox .handle-order-lower .order-lower-indicator::before { content: "\f347"; color: inherit } .postbox .handle-order-higher .order-higher-indicator::before, .postbox .handle-order-lower .order-lower-indicator::before { position: relative; top: .11rem; width: 20px; height: 20px } .postbox .handlediv .toggle-indicator::before { width: 20px; border-radius: 50% } .postbox .handlediv .toggle-indicator::before { position: relative; top: .05rem; text-indent: -1px } .rtl .postbox .handlediv .toggle-indicator::before { text-indent: 1px } .bulk-action-notice .toggle-indicator::before { line-height: 16px; vertical-align: top; color: #787c82 } .postbox .handle-order-higher:focus, .postbox .handle-order-lower:focus, .postbox .handlediv:focus { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8); outline: 1px solid transparent } .postbox .handle-order-higher:focus .order-higher-indicator::before, .postbox .handle-order-lower:focus .order-lower-indicator::before, .postbox .handlediv:focus .toggle-indicator::before { box-shadow: none; outline: 1px solid transparent } #photo-add-url-div input[type=text] { width: 300px } .alignleft h2 { margin: 0 } #template textarea { font-family: Consolas, Monaco, monospace; font-size: 13px; background: #f6f7f7; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4 } #template .CodeMirror, #template textarea { width: 100%; min-height: 60vh; height: calc(100vh - 295px); border: 1px solid #dcdcde; box-sizing: border-box } #templateside > h2 { padding-top: 6px; padding-bottom: 7px; margin: 0 } #templateside ol, #templateside ul { margin: 0; padding: 0 } #templateside > ul { box-sizing: border-box; margin-top: 0; overflow: auto; padding: 0; min-height: 60vh; height: calc(100vh - 295px); background-color: #f6f7f7; border: 1px solid #dcdcde; border-left: none } #templateside ul ul { padding-left: 12px } #templateside > ul > li > ul[role=group] { padding-left: 0 } [role=treeitem][aria-expanded=false] > ul { display: none } [role=treeitem] span[aria-hidden] { display: inline; font-family: dashicons; font-size: 20px; position: absolute; pointer-events: none } [role=treeitem][aria-expanded=false] > .folder-label .icon:after { content: "\f139" } [role=treeitem][aria-expanded=true] > .folder-label .icon:after { content: "\f140" } [role=treeitem] .folder-label { display: block; padding: 3px 3px 3px 12px; cursor: pointer } [role=treeitem] { outline: 0 } [role=treeitem] .folder-label.focus { color: #043959; box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8) } [role=treeitem] .folder-label.hover, [role=treeitem].hover { background-color: #f0f0f1 } .tree-folder { margin: 0; position: relative } [role=treeitem] li { position: relative } .tree-folder .tree-folder::after { content: ""; display: block; position: absolute; left: 2px; border-left: 1px solid #c3c4c7; top: -13px; bottom: 10px } .tree-folder > li::before { content: ""; position: absolute; display: block; border-left: 1px solid #c3c4c7; left: 2px; top: -5px; height: 18px; width: 7px; border-bottom: 1px solid #c3c4c7 } .tree-folder > li::after { content: ""; position: absolute; display: block; border-left: 1px solid #c3c4c7; left: 2px; bottom: -7px; top: 0 } #templateside .current-file { margin: -4px 0 -2px } .tree-folder > .current-file::before { left: 4px; height: 15px; width: 0; border-left: none; top: 3px } .tree-folder > .current-file::after { bottom: -4px; height: 7px; left: 2px; top: auto } .tree-folder li:last-child > .tree-folder::after, .tree-folder > li:last-child::after { display: none } #documentation label, #theme-plugin-editor-label, #theme-plugin-editor-selector { font-weight: 600 } #theme-plugin-editor-label { display: inline-block; margin-bottom: 1em } #docs-list, #template textarea { direction: ltr } .fileedit-sub #plugin, .fileedit-sub #theme { max-width: 40% } .fileedit-sub .alignright { text-align: right } #template p { width: 97% } #file-editor-linting-error { margin-top: 1em; margin-bottom: 1em } #file-editor-linting-error > .notice { margin: 0; display: inline-block } #file-editor-linting-error > .notice > p { width: auto } #template .submit { margin-top: 1em; padding: 0 } #template .submit input[type=submit][disabled] { cursor: not-allowed } #templateside { float: right; width: 16em; word-wrap: break-word } #postcustomstuff p.submit { margin: 0 } #templateside h4 { margin: 1em 0 0 } #templateside li { margin: 4px 0 } #templateside li:not(.howto) a, .theme-editor-php .highlight { display: block; padding: 3px 0 3px 12px; text-decoration: none } #templateside li:not(.howto) > a:first-of-type { padding-top: 0 } #templateside li.howto { padding: 6px 12px 12px } .theme-editor-php .highlight { margin: -3px 3px -3px -12px } #templateside .highlight { border: none; font-weight: 600 } .nonessential { color: #646970; font-size: 11px; font-style: italic; padding-left: 12px } #documentation { margin-top: 10px } #documentation label { line-height: 1.8; vertical-align: baseline } .fileedit-sub { padding: 10px 0 8px; line-height: 180% } #file-editor-warning .file-editor-warning-content { margin: 25px } .accordion-section-title:after, .control-section .accordion-section-title:after, .nav-menus-php .item-edit:before, .widget-top .widget-action .toggle-indicator:before { content: "\f140"; font: normal 20px/1 dashicons; speak: never; display: block; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-decoration: none } .widget-top .widget-action .toggle-indicator:before { padding: 1px 2px 1px 0; border-radius: 50% } .accordion-section-title:after, .handlediv, .item-edit, .postbox .handlediv.button-link, .toggle-indicator { color: #787c82 } .widget-action { color: #50575e } .accordion-section-title:hover:after, .handlediv:focus, .handlediv:hover, .item-edit:focus, .item-edit:hover, .postbox .handlediv.button-link:focus, .postbox .handlediv.button-link:hover, .sidebar-name:hover .toggle-indicator, .widget-action:focus, .widget-top:hover .widget-action { color: #1d2327; outline: 1px solid transparent } .widget-top .widget-action:focus .toggle-indicator:before { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8) } .accordion-section-title:after, .control-section .accordion-section-title:after { float: right; right: 20px; top: -2px } #customize-info.open .accordion-section-title:after, .control-section.open .accordion-section-title:after, .nav-menus-php .menu-item-edit-active .item-edit:before, .widget.open .widget-top .widget-action .toggle-indicator:before, .widget.widget-in-question .widget-top .widget-action .toggle-indicator:before { content: "\f142" } button, input, select, textarea { box-sizing: border-box; font-family: inherit; font-size: inherit; font-weight: inherit } input, textarea { font-size: 14px } textarea { overflow: auto; padding: 2px 6px; line-height: 1.42857143; resize: vertical } label { cursor: pointer } input, select { margin: 0 1px } textarea.code { padding: 4px 6px 1px } input[type=color], input[type=date], input[type=datetime-local], input[type=datetime], input[type=email], input[type=month], input[type=number], input[type=password], input[type=search], input[type=tel], input[type=text], input[type=time], input[type=url], input[type=week], select, textarea { box-shadow: 0 0 0 transparent; border-radius: 4px; border: 1px solid #8c8f94; background-color: #fff; color: #2c3338 } input[type=date], input[type=datetime-local], input[type=datetime], input[type=email], input[type=month], input[type=number], input[type=password], input[type=search], input[type=tel], input[type=text], input[type=time], input[type=url], input[type=week] { padding: 0 8px; line-height: 2; min-height: 30px } ::-webkit-datetime-edit { line-height: 1.85714286 } input[type=checkbox]:focus, input[type=color]:focus, input[type=date]:focus, input[type=datetime-local]:focus, input[type=datetime]:focus, input[type=email]:focus, input[type=month]:focus, input[type=number]:focus, input[type=password]:focus, input[type=radio]:focus, input[type=search]:focus, input[type=tel]:focus, input[type=text]:focus, input[type=time]:focus, input[type=url]:focus, input[type=week]:focus, select:focus, textarea:focus { border-color: #2271b1; box-shadow: 0 0 0 1px #2271b1; outline: 2px solid transparent } input[type=email], input[type=url] { direction: ltr } input[type=checkbox], input[type=radio] { border: 1px solid #8c8f94; border-radius: 4px; background: #fff; color: #50575e; clear: none; cursor: pointer; display: inline-block; line-height: 0; height: 1rem; margin: -.25rem .25rem 0 0; outline: 0; padding: 0 !important; text-align: center; vertical-align: middle; width: 1rem; min-width: 1rem; -webkit-appearance: none; box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); transition: .05s border-color ease-in-out } input[type=radio]:checked + label:before { color: #8c8f94 } .wp-core-ui input[type=reset]:active, .wp-core-ui input[type=reset]:hover { color: #135e96 } .wp-admin p input[type=checkbox], .wp-admin p input[type=radio], td > input[type=checkbox] { margin-top: 0 } .wp-admin p label input[type=checkbox] { margin-top: -4px } .wp-admin p label input[type=radio] { margin-top: -2px } input[type=radio] { border-radius: 50%; margin-right: .25rem; line-height: .71428571 } input[type=checkbox]:checked::before, input[type=radio]:checked::before { float: left; display: inline-block; vertical-align: middle; width: 1rem; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } input[type=checkbox]:checked::before { content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%233582c4%27%2F%3E%3C%2Fsvg%3E"); margin: -.1875rem 0 0 -.25rem; height: 1.3125rem; width: 1.3125rem } input[type=radio]:checked::before { content: ""; border-radius: 50%; width: .5rem; height: .5rem; margin: .1875rem; background-color: #3582c4; line-height: 1.14285714 } @-moz-document url-prefix() { .form-table input.tog, input[type=checkbox], input[type=radio] { margin-bottom: -1px } } input[type=search] { -webkit-appearance: textfield } input[type=search]::-webkit-search-decoration { display: none } .wp-admin input[type=file] { padding: 3px 0; cursor: pointer } input.readonly, input[readonly], textarea.readonly, textarea[readonly] { background-color: #f0f0f1 } ::-webkit-input-placeholder { color: #646970 } ::-moz-placeholder { color: #646970; opacity: 1 } :-ms-input-placeholder { color: #646970 } .form-invalid .form-required, .form-invalid .form-required:focus, .form-invalid.form-required input, .form-invalid.form-required input:focus, .form-invalid.form-required select, .form-invalid.form-required select:focus { border-color: #d63638 !important; box-shadow: 0 0 2px rgba(214, 54, 56, .8) } .form-table .form-required.form-invalid td:after { content: "\f534"; font: normal 20px/1 dashicons; color: #d63638; margin-left: -25px; vertical-align: middle } .form-table .form-required.user-pass1-wrap.form-invalid td:after { content: "" } .form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after { content: "\f534"; font: normal 20px/1 dashicons; color: #d63638; margin: 0 6px 0 -29px; vertical-align: middle } .form-input-tip { color: #646970 } input.disabled, input:disabled, select.disabled, select:disabled, textarea.disabled, textarea:disabled { background: rgba(255, 255, 255, .5); border-color: rgba(220, 220, 222, .75); box-shadow: inset 0 1px 2px rgba(0, 0, 0, .04); color: rgba(44, 51, 56, .5) } input[type=file].disabled, input[type=file]:disabled, input[type=range].disabled, input[type=range]:disabled { background: 0 0; box-shadow: none; cursor: default } input[type=checkbox].disabled, input[type=checkbox].disabled:checked:before, input[type=checkbox]:disabled, input[type=checkbox]:disabled:checked:before, input[type=radio].disabled, input[type=radio].disabled:checked:before, input[type=radio]:disabled, input[type=radio]:disabled:checked:before { opacity: .7 } .wp-core-ui select { font-size: 14px; line-height: 2; color: #2c3338; border-color: #8c8f94; box-shadow: none; border-radius: 3px; padding: 0 24px 0 8px; min-height: 30px; max-width: 25rem; -webkit-appearance: none; background: #fff url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E') no-repeat right 5px top 55%; background-size: 16px 16px; cursor: pointer; vertical-align: middle } .wp-core-ui select:hover { color: #2271b1 } .wp-core-ui select:focus { border-color: #2271b1; color: #0a4b78; box-shadow: 0 0 0 1px #2271b1 } .wp-core-ui select:active { border-color: #8c8f94; box-shadow: none } .wp-core-ui select.disabled, .wp-core-ui select:disabled { color: #a7aaad; border-color: #dcdcde; background-color: #f6f7f7; background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23a0a5aa%22%2F%3E%3C%2Fsvg%3E'); box-shadow: none; text-shadow: 0 1px 0 #fff; cursor: default; transform: none } .wp-core-ui select:-moz-focusring { color: transparent; text-shadow: 0 0 0 #0a4b78 } .wp-core-ui select::-ms-value { background: 0 0; color: #50575e } .wp-core-ui select:hover::-ms-value { color: #2271b1 } .wp-core-ui select:focus::-ms-value { color: #0a4b78 } .wp-core-ui select.disabled::-ms-value, .wp-core-ui select:disabled::-ms-value { color: #a7aaad } .wp-core-ui select::-ms-expand { display: none } .wp-admin .button-cancel { display: inline-block; min-height: 28px; padding: 0 5px; line-height: 2 } .meta-box-sortables select { max-width: 100% } .meta-box-sortables input { vertical-align: middle } .misc-pub-post-status select { margin-top: 0 } .wp-core-ui select[multiple] { height: auto; padding-right: 8px; background: #fff } .submit { padding: 1.5em 0; margin: 5px 0; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border: none } form p.submit a.cancel:hover { text-decoration: none } p.submit { text-align: left; max-width: 100%; margin-top: 20px; padding-top: 10px } .textright p.submit { border: none; text-align: right } table.form-table + input + input + p.submit, table.form-table + input + p.submit, table.form-table + p.submit { border-top: none; padding-top: 0 } #major-publishing-actions input, #minor-publishing-actions .preview, #minor-publishing-actions input { text-align: center } input.all-options, textarea.all-options { width: 250px } input.large-text, textarea.large-text { width: 99% } .regular-text { width: 25em } input.small-text { width: 50px; padding: 0 6px } label input.small-text { margin-top: -4px } input[type=number].small-text { width: 65px; padding-right: 0 } input.tiny-text { width: 35px } input[type=number].tiny-text { width: 45px; padding-right: 0 } #doaction, #doaction2, #post-query-submit { margin: 0 8px 0 0 } .no-js input#changeit2, .no-js input#doaction2, .no-js label[for=bulk-action-selector-bottom], .no-js label[for=new_role2], .no-js select#bulk-action-selector-bottom, .no-js select#new_role2 { display: none } .tablenav .actions select { float: left; margin-right: 6px; max-width: 12.5rem } #timezone_string option { margin-left: 1em } .wp-cancel-pw > .dashicons, .wp-hide-pw > .dashicons { position: relative; top: 3px; width: 1.25rem; height: 1.25rem; top: .25rem; font-size: 20px } .wp-cancel-pw .dashicons-no { display: none } #your-profile label + a, label { vertical-align: middle } #your-profile label + a, fieldset label { vertical-align: middle } .options-media-php [for*="_size_"] { min-width: 10em; vertical-align: baseline } .options-media-php .small-text[name*="_size_"] { margin: 0 0 1em } .wp-generate-pw { margin-top: 1em } .wp-pwd { margin-top: 1em } #misc-publishing-actions label { vertical-align: baseline } #pass-strength-result { background-color: #f0f0f1; border: 1px solid #dcdcde; color: #1d2327; margin: -1px 1px 5px; padding: 3px 5px; text-align: center; width: 25em; box-sizing: border-box; opacity: 0 } #pass-strength-result.short { background-color: #ffabaf; border-color: #e65054; opacity: 1 } #pass-strength-result.bad { background-color: #facfd2; border-color: #f86368; opacity: 1 } #pass-strength-result.good { background-color: #f5e6ab; border-color: #f0c33c; opacity: 1 } #pass-strength-result.strong { background-color: #b8e6bf; border-color: #68de7c; opacity: 1 } .password-input-wrapper input { font-family: Consolas, Monaco, monospace } #pass1-text.short, #pass1.short { border-color: #e65054 } #pass1-text.bad, #pass1.bad { border-color: #f86368 } #pass1-text.good, #pass1.good { border-color: #f0c33c } #pass1-text.strong, #pass1.strong { border-color: #68de7c } .pw-weak { display: none } .indicator-hint { padding-top: 8px } .wp-pwd [type=password], .wp-pwd [type=text] { margin-bottom: 0; min-height: 30px } .wp-pwd input::-ms-reveal { display: none } #pass1-text, .show-password #pass1 { display: none } #pass1-text::-ms-clear { display: none } .show-password #pass1-text { display: inline-block } p.search-box { float: right; margin: 0 } .network-admin.themes-php p.search-box { clear: left } .search-box input[name="s"], .tablenav .search-plugins input[name="s"], .tagsdiv .newtag { float: left; margin: 0 4px 0 0 } .js.plugins-php .search-box .wp-filter-search { margin: 0; width: 280px } input[type=email].ui-autocomplete-loading, input[type=text].ui-autocomplete-loading { background-image: url(images/loading.gif); background-repeat: no-repeat; background-position: right center; visibility: visible } input.ui-autocomplete-input.open { border-bottom-color: transparent } ul#add-to-blog-users { margin: 0 0 0 14px } .ui-autocomplete { padding: 0; margin: 0; list-style: none; position: absolute; z-index: 10000; border: 1px solid #4f94d4; box-shadow: 0 1px 2px rgba(79, 148, 212, .8); background-color: #fff } .ui-autocomplete li { margin-bottom: 0; padding: 4px 10px; white-space: nowrap; text-align: left; cursor: pointer } .ui-autocomplete .ui-state-focus { background-color: #dcdcde } .wp-tags-autocomplete .ui-state-focus, .wp-tags-autocomplete [aria-selected=true] { background-color: #2271b1; color: #fff; outline: 2px solid transparent } .form-table { border-collapse: collapse; margin-top: .5em; width: 100%; clear: both } .form-table, .form-table td, .form-table td p, .form-table th { font-size: 14px } .form-table td { margin-bottom: 9px; padding: 15px 10px; line-height: 1.3; vertical-align: middle } .form-table th, .form-wrap label { color: #1d2327; font-weight: 400; text-shadow: none; vertical-align: baseline } .form-table th { vertical-align: top; text-align: left; padding: 20px 10px 20px 0; width: 200px; line-height: 1.3; font-weight: 600 } .form-table .td-full, .form-table th.th-full { width: auto; padding: 20px 10px 20px 0; font-weight: 400 } .form-table td p { margin-top: 4px; margin-bottom: 0 } .form-table .date-time-doc { margin-top: 1em } .form-table p.timezone-info { margin: 1em 0 } .form-table td fieldset label { margin: .35em 0 .5em !important; display: inline-block } .form-table td fieldset p label { margin-top: 0 !important } .form-table td fieldset label, .form-table td fieldset li, .form-table td fieldset p { line-height: 1.4 } .form-table input.tog, .form-table input[type=radio] { margin-top: -4px; margin-right: 4px; float: none } .form-table .pre { padding: 8px; margin: 0 } table.form-table td .updated { font-size: 13px } table.form-table td .updated p { font-size: 13px; margin: .3em 0 } #profile-page .form-table textarea { width: 500px; margin-bottom: 6px } #profile-page .form-table #rich_editing { margin-right: 5px } #your-profile legend { font-size: 22px } #display_name { width: 15em } #adduser .form-field input, #createuser .form-field input { width: 25em } .color-option { display: inline-block; width: 24%; padding: 5px 15px 15px; box-sizing: border-box; margin-bottom: 3px } .color-option.selected, .color-option:hover { background: #dcdcde } .color-palette { width: 100%; border-spacing: 0; border-collapse: collapse } .color-palette td { height: 20px; padding: 0; border: none } .color-option { cursor: pointer } .create-application-password .form-field { max-width: 25em } .create-application-password label { font-weight: 600 } .create-application-password p.submit { margin-bottom: 0; padding-bottom: 0; display: block } #application-passwords-section .notice { margin-top: 20px; margin-bottom: 0 } .application-password-display input.code { width: 19em } .auth-app-card.card { max-width: 768px } .authorize-application-php .form-wrap p { display: block } .tool-box .title { margin: 8px 0; font-size: 18px; font-weight: 400; line-height: 24px } .label-responsive { vertical-align: middle } #export-filters p { margin: 0 0 1em } #export-filters p.submit { margin: 7px 0 5px } .card { position: relative; margin-top: 20px; padding: .7em 2em 1em; min-width: 255px; max-width: 520px; border: 1px solid #c3c4c7; box-shadow: 0 1px 1px rgba(0, 0, 0, .04); background: #fff; box-sizing: border-box } .pressthis h4 { margin: 2em 0 1em } .pressthis textarea { width: 100%; font-size: 1em } #pressthis-code-wrap { overflow: auto } .pressthis-bookmarklet-wrapper { margin: 20px 0 8px; vertical-align: top; position: relative; z-index: 1 } .pressthis-bookmarklet, .pressthis-bookmarklet:active, .pressthis-bookmarklet:focus, .pressthis-bookmarklet:hover { display: inline-block; position: relative; cursor: move; color: #2c3338; background: #dcdcde; border-radius: 5px; border: 1px solid #c3c4c7; font-style: normal; line-height: 16px; font-size: 14px; text-decoration: none } .pressthis-bookmarklet:active { outline: 0 } .pressthis-bookmarklet:after { content: ""; width: 70%; height: 55%; z-index: -1; position: absolute; right: 10px; bottom: 9px; background: 0 0; transform: skew(20deg) rotate(6deg); box-shadow: 0 10px 8px rgba(0, 0, 0, .6) } .pressthis-bookmarklet:hover:after { transform: skew(20deg) rotate(9deg); box-shadow: 0 10px 8px rgba(0, 0, 0, .7) } .pressthis-bookmarklet span { display: inline-block; margin: 0; padding: 0 12px 8px 9px } .pressthis-bookmarklet span:before { color: #787c82; font: normal 20px/1 dashicons; content: "\f157"; position: relative; display: inline-block; top: 4px; margin-right: 4px } .pressthis-js-toggle { margin-left: 10px; padding: 0; height: auto; vertical-align: top } .pressthis-js-toggle.button.button { margin-left: 10px; padding: 0; height: auto; vertical-align: top } .pressthis-js-toggle .dashicons { margin: 5px 8px 6px 7px; color: #50575e } .timezone-info code { white-space: nowrap } .defaultavatarpicker .avatar { margin: 2px 0; vertical-align: middle } .options-general-php .date-time-text { display: inline-block; min-width: 10em } .options-general-php input.small-text { width: 56px; margin: -2px 0 } .options-general-php .spinner { float: none; margin: -3px 3px 0 } .options-general-php .language-install-spinner, .settings-php .language-install-spinner { display: inline-block; float: none; margin: -3px 5px 0; vertical-align: middle } .form-table.permalink-structure .available-structure-tags li { float: left; margin-right: 5px } .setup-php textarea { max-width: 100% } .form-field #site-address { max-width: 25em } .form-field #domain { max-width: 22em } .form-field #admin-email, .form-field #blog_last_updated, .form-field #blog_registered, .form-field #path, .form-field #site-title { max-width: 25em } .form-field #path { margin-bottom: 5px } #search-sites, #search-users { max-width: 60% } .request-filesystem-credentials-dialog { display: none; visibility: visible } .request-filesystem-credentials-dialog .notification-dialog { top: 10%; max-height: 85% } .request-filesystem-credentials-dialog-content { margin: 25px } #request-filesystem-credentials-title { font-size: 1.3em; margin: 1em 0 } .request-filesystem-credentials-form legend { font-size: 1em; padding: 1.33em 0; font-weight: 600 } .request-filesystem-credentials-form input[type=password], .request-filesystem-credentials-form input[type=text] { display: block } .request-filesystem-credentials-dialog input[type=password], .request-filesystem-credentials-dialog input[type=text] { width: 100% } .request-filesystem-credentials-form .field-title { font-weight: 600 } .request-filesystem-credentials-dialog label[for=hostname], .request-filesystem-credentials-dialog label[for=private_key], .request-filesystem-credentials-dialog label[for=public_key] { display: block; margin-bottom: 1em } .request-filesystem-credentials-dialog .ftp-password, .request-filesystem-credentials-dialog .ftp-username { float: left; width: 48% } .request-filesystem-credentials-dialog .ftp-password { margin-left: 4% } .request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons { text-align: right } .request-filesystem-credentials-dialog label[for=ftp] { margin-right: 10px } .request-filesystem-credentials-dialog #auth-keys-desc { margin-bottom: 0 } #request-filesystem-credentials-dialog .button:not(:last-child) { margin-right: 10px } #request-filesystem-credentials-form .cancel-button { display: none } #request-filesystem-credentials-dialog .cancel-button { display: inline } .request-filesystem-credentials-dialog .ftp-password, .request-filesystem-credentials-dialog .ftp-username { float: none; width: auto } .request-filesystem-credentials-dialog .ftp-username { margin-bottom: 1em } .request-filesystem-credentials-dialog .ftp-password { margin: 0 } .request-filesystem-credentials-dialog .ftp-password em { color: #8c8f94 } .request-filesystem-credentials-dialog label { display: block; line-height: 1.5; margin-bottom: 1em } .request-filesystem-credentials-form legend { padding-bottom: 0 } .request-filesystem-credentials-form #ssh-keys legend { font-size: 1.3em } .request-filesystem-credentials-form .notice { margin: 0 0 20px; clear: both } .tools-privacy-policy-page form { margin-bottom: 1.3em } .tools-privacy-policy-page input.button { margin: 0 1px 0 6px } .tools-privacy-policy-page select { margin: 0 1px .5em 6px } .tools-privacy-edit { margin: 1.5em 0 } .tools-privacy-policy-page span { line-height: 2 } .privacy_requests .column-email { width: 40% } .privacy_requests .column-type { text-align: center } .privacy_requests tfoot td:first-child, .privacy_requests thead td:first-child { border-left: 4px solid #fff } .privacy_requests tbody th { border-left: 4px solid #fff; background: #fff; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1) } .privacy_requests .row-actions { color: #787c82 } .privacy_requests .row-actions.processing { position: static } .privacy_requests tbody .has-request-results th { box-shadow: none } .privacy_requests tbody .request-results th .notice { margin: 0 0 5px } .privacy_requests tbody td { background: #fff; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1) } .privacy_requests tbody .has-request-results td { box-shadow: none } .privacy_requests .next_steps .button { word-wrap: break-word; white-space: normal } .privacy_requests .status-request-confirmed td, .privacy_requests .status-request-confirmed th { background-color: #fff; border-left-color: #72aee6 } .privacy_requests .status-request-failed td, .privacy_requests .status-request-failed th { background-color: #f6f7f7; border-left-color: #d63638 } .privacy_requests .export_personal_data_failed a { vertical-align: baseline } .status-label { font-weight: 600 } .status-label.status-request-pending { font-weight: 400; font-style: italic; color: #646970 } .status-label.status-request-failed { color: #d63638; font-weight: 600 } .wp-privacy-request-form { clear: both } .wp-privacy-request-form-field { margin: 1.5em 0 } .wp-privacy-request-form input { margin: 0 } .email-personal-data::before { display: inline-block; font: normal 20px/1 dashicons; margin: 3px 5px 0 -2px; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; vertical-align: top } .email-personal-data--sending::before { color: #d63638; content: "\f463"; animation: rotation 2s infinite linear } .email-personal-data--sent::before { color: #68de7c; content: "\f147" } @media screen and (max-width: 782px) { textarea { -webkit-appearance: none } input[type=date], input[type=datetime-local], input[type=datetime], input[type=email], input[type=month], input[type=number], input[type=password], input[type=search], input[type=tel], input[type=text], input[type=time], input[type=url], input[type=week] { -webkit-appearance: none; padding: 3px 10px; min-height: 40px } ::-webkit-datetime-edit { line-height: 1.875 } .widefat tfoot td input[type=checkbox], .widefat th input[type=checkbox], .widefat thead td input[type=checkbox], input[type=checkbox] { -webkit-appearance: none } .widefat tfoot td input[type=checkbox], .widefat th input[type=checkbox], .widefat thead td input[type=checkbox] { margin-bottom: 8px } .widefat tfoot td input[type=checkbox]:before, .widefat th input[type=checkbox]:before, .widefat thead td input[type=checkbox]:before, input[type=checkbox]:checked:before { width: 1.875rem; height: 1.875rem; margin: -.1875rem -.3125rem } input[type=checkbox], input[type=radio] { height: 1.5625rem; width: 1.5625rem } .wp-admin p input[type=checkbox], .wp-admin p input[type=radio] { margin-top: -.1875rem } input[type=radio]:checked:before { vertical-align: middle; width: .5625rem; height: .5625rem; margin: .4375rem; line-height: .76190476 } .wp-upload-form input[type=submit] { margin-top: 10px } .wp-admin .form-table select, .wp-core-ui select { min-height: 40px; font-size: 16px; line-height: 1.625; padding: 5px 24px 5px 8px } .wp-admin .button-cancel { margin-bottom: 0; padding: 2px 0; font-size: 14px; vertical-align: middle } #adduser .form-field input, #createuser .form-field input { width: 100% } .form-table { box-sizing: border-box } .form-table td, .form-table th, .label-responsive { display: block; width: auto; vertical-align: middle } .label-responsive { margin: .5em 0 } .export-filters li { margin-bottom: 0 } .form-table .color-palette td { display: table-cell; width: 15px } .form-table table.color-palette { margin-right: 10px } input, textarea { font-size: 16px } #profile-page .form-table textarea, .form-table span.description, .form-table td input[type=email], .form-table td input[type=password], .form-table td input[type=text], .form-table td select, .form-table td textarea { width: 100%; display: block; max-width: none; box-sizing: border-box } .form-table .form-required.form-invalid td:after { float: right; margin: -30px 3px 0 0 } .form-table input[type=text].small-text, input[type=number].small-text, input[type=password].small-text, input[type=search].small-text, input[type=text].small-text { width: auto; max-width: 4.375em; display: inline; padding: 3px 6px; margin: 0 3px } #pass-strength-result { width: 100%; box-sizing: border-box; padding: 8px } p.search-box { float: none; position: absolute; bottom: 0; width: 98%; height: 90px; margin-bottom: 20px } p.search-box input[name="s"] { float: none; width: 100%; margin-bottom: 10px; vertical-align: middle } p.search-box input[type=submit] { margin-bottom: 10px } .form-table span.description { display: inline; padding: 4px 0 0; line-height: 1.4; font-size: 14px } .form-table th { padding: 10px 0 0; border-bottom: 0 } .form-table td { margin-bottom: 0; padding: 4px 0 6px } .form-table.permalink-structure td code { margin-left: 32px; display: inline-block } .form-table.permalink-structure td input[type=text] { margin-left: 32px; margin-top: 4px; width: 96% } .form-table input.regular-text { width: 100% } .form-table label { font-size: 14px } .background-position-control .button-group > label { font-size: 0 } .form-table fieldset label { display: block } #local-time, #utc-time { display: block; float: none; margin-top: .5em } .form-field #domain { max-width: none } .wp-pwd { position: relative } #profile-page .form-table #pass1 { padding-right: 90px } .wp-pwd button.button { background: 0 0; border: 1px solid transparent; box-shadow: none; line-height: 2; margin: 0; padding: 5px 9px; position: absolute; right: 0; top: 0; width: 2.375rem; height: 2.375rem; min-width: 40px; min-height: 40px } .wp-pwd button.wp-hide-pw { right: 2.5rem } .wp-pwd button.button:focus, .wp-pwd button.button:hover { background: 0 0 } .wp-pwd button.button:active { background: 0 0; box-shadow: none; transform: none } .wp-pwd .button .text { display: none } .wp-pwd [type=password], .wp-pwd [type=text] { line-height: 2; padding-right: 5rem } .wp-cancel-pw .dashicons-no { display: inline-block } .options-general-php input[type=text].small-text { max-width: 6.25em; margin: 0 } .tools-privacy-policy-page form.wp-create-privacy-page { margin-bottom: 1em } .tools-privacy-policy-page input#set-page, .tools-privacy-policy-page select { margin: 10px 0 0 } .tools-privacy-policy-page .wp-create-privacy-page span { display: block; margin-bottom: 1em } .tools-privacy-policy-page .wp-create-privacy-page .button { margin-left: 0 } .wp-list-table.privacy_requests tr:not(.inline-edit-row):not(.no-items) td.column-primary:not(.check-column) { display: table-cell } .wp-list-table.privacy_requests.widefat th input, .wp-list-table.privacy_requests.widefat thead td input { margin-left: 5px } .wp-privacy-request-form-field input[type=text] { width: 100%; margin-bottom: 10px; vertical-align: middle } .regular-text { max-width: 100% } } @media only screen and (max-width: 768px) { .form-field input[type=email], .form-field input[type=password], .form-field input[type=text], .form-field select, .form-field textarea { width: 99% } .form-wrap .form-field { padding: 0 } } @media only screen and (max-height: 480px), screen and (max-width: 450px) { .file-editor-warning .notification-dialog, .request-filesystem-credentials-dialog .notification-dialog { width: 100%; height: 100%; max-height: 100%; position: fixed; top: 0; margin: 0; left: 0 } } @media screen and (max-width: 600px) { .color-option { width: 49% } } @media only screen and (max-width: 320px) { .options-general-php .date-time-text.date-time-custom-text { min-width: 0; margin-right: .5em } } @keyframes rotation { 0% { transform: rotate(0) } 100% { transform: rotate(359deg) } } .ui-draggable-handle, .ui-sortable-handle { touch-action: none } .accordion-section { border-bottom: 1px solid #dcdcde; margin: 0 } .accordion-section.open .accordion-section-content, .no-js .accordion-section .accordion-section-content { display: block } .accordion-section.open:hover { border-bottom-color: #dcdcde } .accordion-section-content { display: none; padding: 10px 20px 15px; overflow: hidden; background: #fff } .accordion-section-title { margin: 0; padding: 12px 15px 15px; position: relative; border-left: 1px solid #dcdcde; border-right: 1px solid #dcdcde; -webkit-user-select: none; user-select: none } .js .accordion-section-title { cursor: pointer } .js .accordion-section-title:after { position: absolute; top: 12px; right: 10px; z-index: 1 } .accordion-section-title:focus { outline: 1px solid transparent } .accordion-section-title:focus:after, .accordion-section-title:hover:after { border-color: #a7aaad transparent; outline: 1px solid transparent } .cannot-expand .accordion-section-title { cursor: auto } .cannot-expand .accordion-section-title:after { display: none } .control-section .accordion-section-title, .customize-pane-child .accordion-section-title { border-left: none; border-right: none; padding: 10px 10px 11px 14px; line-height: 1.55; background: #fff } .control-section .accordion-section-title:after, .customize-pane-child .accordion-section-title:after { top: calc(50% - 10px) } .js .control-section .accordion-section-title:focus, .js .control-section .accordion-section-title:hover, .js .control-section.open .accordion-section-title, .js .control-section:hover .accordion-section-title { color: #1d2327; background: #f6f7f7 } .control-section.open .accordion-section-title { border-bottom: 1px solid #dcdcde } .network-admin .edit-site-actions { margin-top: 0 } .my-sites { display: block; overflow: auto; zoom: 1 } .my-sites li { display: block; padding: 8px 3%; min-height: 130px; margin: 0 } @media only screen and (max-width: 599px) { .my-sites li { min-height: 0 } } @media only screen and (min-width: 600px) { .my-sites.striped li { background-color: #fff; position: relative } .my-sites.striped li:after { content: ""; width: 1px; height: 100%; position: absolute; top: 0; right: 0; background: #c3c4c7 } } @media only screen and (min-width: 600px) and (max-width: 699px) { .my-sites li { float: left; width: 44% } .my-sites.striped li { background-color: #fff } .my-sites.striped li:nth-of-type(2n+1) { clear: left } .my-sites.striped li:nth-of-type(2n+2):after { content: none } .my-sites li:nth-of-type(4n+1), .my-sites li:nth-of-type(4n+2) { background-color: #f6f7f7 } } @media only screen and (min-width: 700px) and (max-width: 1199px) { .my-sites li { float: left; width: 27.333333%; background-color: #fff } .my-sites.striped li:nth-of-type(3n+3):after { content: none } .my-sites li:nth-of-type(6n+1), .my-sites li:nth-of-type(6n+2), .my-sites li:nth-of-type(6n+3) { background-color: #f6f7f7 } } @media only screen and (min-width: 1200px) and (max-width: 1399px) { .my-sites li { float: left; width: 21%; padding: 8px 2%; background-color: #fff } .my-sites.striped li:nth-of-type(4n+1) { clear: left } .my-sites.striped li:nth-of-type(4n+4):after { content: none } .my-sites li:nth-of-type(8n+1), .my-sites li:nth-of-type(8n+2), .my-sites li:nth-of-type(8n+3), .my-sites li:nth-of-type(8n+4) { background-color: #f6f7f7 } } @media only screen and (min-width: 1400px) and (max-width: 1599px) { .my-sites li { float: left; width: 16%; padding: 8px 2%; background-color: #fff } .my-sites.striped li:nth-of-type(5n+1) { clear: left } .my-sites.striped li:nth-of-type(5n+5):after { content: none } .my-sites li:nth-of-type(10n+1), .my-sites li:nth-of-type(10n+2), .my-sites li:nth-of-type(10n+3), .my-sites li:nth-of-type(10n+4), .my-sites li:nth-of-type(10n+5) { background-color: #f6f7f7 } } @media only screen and (min-width: 1600px) { .my-sites li { float: left; width: 12.666666%; padding: 8px 2%; background-color: #fff } .my-sites.striped li:nth-of-type(6n+1) { clear: left } .my-sites.striped li:nth-of-type(6n+6):after { content: none } .my-sites li:nth-of-type(12n+1), .my-sites li:nth-of-type(12n+2), .my-sites li:nth-of-type(12n+3), .my-sites li:nth-of-type(12n+4), .my-sites li:nth-of-type(12n+5), .my-sites li:nth-of-type(12n+6) { background-color: #f6f7f7 } } .my-sites li a { text-decoration: none } @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { div.star-holder, div.star-holder .star-rating { background: url(images/stars-2x.png?ver=20121108) repeat-x bottom left; background-size: 21px 37px } .spinner { background-image: url(images/spinner-2x.gif) } } @media screen and (max-width: 782px) { html.wp-toolbar { padding-top: 46px } .screen-reader-shortcut:focus { top: -39px } body { min-width: 240px; overflow-x: hidden } body * { -webkit-tap-highlight-color: transparent !important } #wpcontent { position: relative; margin-left: 0; padding-left: 10px } #wpbody-content { padding-bottom: 100px } .wrap { clear: both; margin-right: 12px; margin-left: 0 } #col-left, #col-right { float: none; width: auto } #col-left .col-wrap, #col-right .col-wrap { padding: 0 } #collapse-menu, .post-format-select { display: none !important } .wrap h1.wp-heading-inline { margin-bottom: .5em } .wrap .add-new-h2, .wrap .add-new-h2:active, .wrap .page-title-action, .wrap .page-title-action:active { padding: 10px 15px; font-size: 14px; white-space: nowrap } .media-upload-form div.error, .notice, .wrap div.error, .wrap div.updated { margin: 20px 0 10px; padding: 5px 10px; font-size: 14px; line-height: 175% } .wp-core-ui .notice.is-dismissible { padding-right: 46px } .notice-dismiss { padding: 13px } .wrap .icon32 + h2 { margin-top: -2px } .wp-responsive-open #wpbody { right: -16em } code { word-wrap: break-word; word-wrap: anywhere; word-break: break-word } .postbox { font-size: 14px } .metabox-holder .postbox > h3, .metabox-holder .stuffbox > h3, .metabox-holder h2, .metabox-holder h3.hndle { padding: 12px } .postbox .handlediv { margin-top: 3px } .subsubsub { font-size: 16px; text-align: center; margin-bottom: 15px } #template .CodeMirror, #template textarea { box-sizing: border-box } #templateside { float: none; width: auto } #templateside > ul { border-left: 1px solid #dcdcde } #templateside li { margin: 0 } #templateside li:not(.howto) a { display: block; padding: 5px } #templateside li.howto { padding: 12px } #templateside .highlight { padding: 5px; margin-left: -5px; margin-top: -5px } #template .notice, #template > div { float: none; margin: 1em 0; width: auto } #template .CodeMirror, #template textarea { width: 100% } #templateside ul ul { padding-left: 1.5em } [role=treeitem] .folder-label { display: block; padding: 5px } .tree-folder .tree-folder::after, .tree-folder > li::after, .tree-folder > li::before { left: -8px } .tree-folder > li::before { top: 0; height: 13px } .tree-folder > .current-file::before { left: -5px; top: 7px; width: 4px } .tree-folder > .current-file::after { height: 9px; left: -8px } .wrap #templateside span.notice { margin-left: -5px; width: 100% } .fileedit-sub .alignright { float: left; margin-top: 15px; width: 100%; text-align: left } .fileedit-sub .alignright label { display: block } .fileedit-sub #plugin, .fileedit-sub #theme { margin-left: 0; max-width: 70% } .fileedit-sub input[type=submit] { margin-bottom: 0 } #documentation label[for=docs-list] { display: block } #documentation select[name=docs-list] { margin-left: 0; max-width: 60% } #documentation input[type=button] { margin-bottom: 0 } #wpfooter { display: none } #comments-form .checkforspam { display: none } .edit-comment-author { margin: 2px 0 0 } .filter-drawer .filter-group-feature input, .filter-drawer .filter-group-feature label { line-height: 2.1 } .filter-drawer .filter-group-feature label { margin-left: 32px } .wp-filter .button.drawer-toggle { font-size: 13px; line-height: 2; height: 28px } #screen-meta #contextual-help-wrap { overflow: visible } #screen-meta #contextual-help-back, #screen-meta .contextual-help-sidebar { display: none } #screen-meta .contextual-help-tabs { clear: both; width: 100%; float: none } #screen-meta .contextual-help-tabs ul { margin: 0 0 1em; padding: 1em 0 0 } #screen-meta .contextual-help-tabs .active { margin: 0 } #screen-meta .contextual-help-tabs-wrap { clear: both; max-width: 100%; float: none } #screen-meta, #screen-meta-links { margin-right: 10px } #screen-meta-links { margin-bottom: 20px } .wp-filter .search-form input[type=search] { font-size: 1rem } .wp-filter .search-form.search-plugins { min-width: 100% } } @media screen and (max-width: 600px) { #wpwrap.wp-responsive-open { overflow-x: hidden } html.wp-toolbar { padding-top: 0 } .screen-reader-shortcut:focus { top: 7px } #wpbody { padding-top: 46px } div#post-body.metabox-holder.columns-1 { overflow-x: hidden } .nav-tab-wrapper, .wrap h2.nav-tab-wrapper, h1.nav-tab-wrapper { border-bottom: 0 } h1 .nav-tab, h2 .nav-tab, h3 .nav-tab, nav .nav-tab { margin: 10px 10px 0 0; border-bottom: 1px solid #c3c4c7 } .nav-tab-active:focus, .nav-tab-active:focus:active, .nav-tab-active:hover { border-bottom: 1px solid #c3c4c7 } .wp-filter .search-form input[type=search] { width: 100% } } @media screen and (max-width: 320px) { #network_dashboard_right_now .subsubsub { font-size: 14px; text-align: left } } /*! This file is auto-generated */ /*! This file is auto-generated */ #adminmenu, #adminmenu .wp-submenu, #adminmenuback, #adminmenuwrap { width: 160px; background-color: #1d2327 } #adminmenuback { position: fixed; top: 0; bottom: -120px; z-index: 1 } .php-error #adminmenuback { position: absolute } .php-error #adminmenuback, .php-error #adminmenuwrap { margin-top: 2em } #adminmenu { clear: left; margin: 12px 0; padding: 0; list-style: none } .folded #adminmenu, .folded #adminmenu li.menu-top, .folded #adminmenuback, .folded #adminmenuwrap { width: 36px } .icon16 { height: 18px; width: 18px; padding: 6px; margin: -6px 0 0 -8px; float: left } .icon16:before { color: #8c8f94; font: normal 20px/1 dashicons; speak: never; padding: 6px 0; height: 34px; width: 20px; display: inline-block; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; transition: all .1s ease-in-out } .icon16.icon-dashboard:before { content: "\f226" } .icon16.icon-post:before { content: "\f109" } .icon16.icon-media:before { content: "\f104" } .icon16.icon-links:before { content: "\f103" } .icon16.icon-page:before { content: "\f105" } .icon16.icon-comments:before { content: "\f101"; margin-top: 1px } .icon16.icon-appearance:before { content: "\f100" } .icon16.icon-plugins:before { content: "\f106" } .icon16.icon-users:before { content: "\f110" } .icon16.icon-tools:before { content: "\f107" } .icon16.icon-settings:before { content: "\f108" } .icon16.icon-site:before { content: "\f541" } .icon16.icon-generic:before { content: "\f111" } .icon16.icon-appearance, .icon16.icon-comments, .icon16.icon-dashboard, .icon16.icon-generic, .icon16.icon-links, .icon16.icon-media, .icon16.icon-page, .icon16.icon-plugins, .icon16.icon-post, .icon16.icon-settings, .icon16.icon-site, .icon16.icon-tools, .icon16.icon-users, .menu-icon-appearance div.wp-menu-image, .menu-icon-comments div.wp-menu-image, .menu-icon-dashboard div.wp-menu-image, .menu-icon-generic div.wp-menu-image, .menu-icon-links div.wp-menu-image, .menu-icon-media div.wp-menu-image, .menu-icon-page div.wp-menu-image, .menu-icon-plugins div.wp-menu-image, .menu-icon-post div.wp-menu-image, .menu-icon-settings div.wp-menu-image, .menu-icon-site div.wp-menu-image, .menu-icon-tools div.wp-menu-image, .menu-icon-users div.wp-menu-image { background-image: none !important } #adminmenuwrap { position: relative; float: left; z-index: 9990 } #adminmenu * { -webkit-user-select: none; user-select: none } #adminmenu li { margin: 0; padding: 0 } #adminmenu a { display: block; line-height: 1.3; padding: 2px 5px; color: #f0f0f1 } #adminmenu .wp-submenu a { color: #c3c4c7; color: rgba(240, 246, 252, .7); font-size: 13px; line-height: 1.4; margin: 0; padding: 5px 0 } #adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover { background: 0 0 } #adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, #adminmenu a:hover, #adminmenu li.menu-top > a:focus { color: #72aee6 } #adminmenu a:focus, #adminmenu a:hover, .folded #adminmenu .wp-submenu-head:hover { box-shadow: inset 4px 0 0 0 currentColor; transition: box-shadow .1s linear } #adminmenu li.menu-top { border: none; min-height: 34px; position: relative } #adminmenu .wp-submenu { list-style: none; position: absolute; top: -1000em; left: 160px; overflow: visible; word-wrap: break-word; padding: 7px 0 8px; z-index: 9999; background-color: #2c3338; box-shadow: 0 3px 5px rgba(0, 0, 0, .2) } #adminmenu a.menu-top:focus + .wp-submenu, .js #adminmenu .opensub .wp-submenu, .js #adminmenu .sub-open, .no-js li.wp-has-submenu:hover .wp-submenu { top: -1px } #adminmenu a.wp-has-current-submenu:focus + .wp-submenu { top: 0 } #adminmenu .wp-has-current-submenu .wp-submenu, #adminmenu .wp-has-current-submenu .wp-submenu.sub-open, #adminmenu .wp-has-current-submenu.opensub .wp-submenu, .no-js li.wp-has-current-submenu:hover .wp-submenu { position: relative; z-index: 3; top: auto; left: auto; right: auto; bottom: auto; border: 0 none; margin-top: 0; box-shadow: none } .folded #adminmenu .wp-has-current-submenu .wp-submenu { box-shadow: 0 3px 5px rgba(0, 0, 0, .2) } #adminmenu li.menu-top:hover, #adminmenu li.opensub > a.menu-top, #adminmenu li > a.menu-top:focus { position: relative; background-color: #1d2327; color: #72aee6 } .folded #adminmenu li.menu-top:hover, .folded #adminmenu li.opensub > a.menu-top, .folded #adminmenu li > a.menu-top:focus { z-index: 10000 } #adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head, #adminmenu .wp-menu-arrow, #adminmenu .wp-menu-arrow div, #adminmenu li.current a.menu-top, #adminmenu li.wp-has-current-submenu a.wp-has-current-submenu { background: #2271b1; color: #fff } .folded #adminmenu .opensub .wp-submenu, .folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open, .folded #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu, .folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu, .folded #adminmenu .wp-submenu.sub-open, .folded #adminmenu a.menu-top:focus + .wp-submenu, .no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu { top: 0; left: 36px } .folded #adminmenu .wp-has-current-submenu .wp-submenu, .folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu { position: absolute; top: -1000em } #adminmenu .wp-not-current-submenu .wp-submenu, .folded #adminmenu .wp-has-current-submenu .wp-submenu { min-width: 160px; width: auto; border-left: 5px solid transparent } #adminmenu .opensub .wp-submenu li.current a, #adminmenu .wp-submenu li.current, #adminmenu .wp-submenu li.current a, #adminmenu .wp-submenu li.current a:focus, #adminmenu .wp-submenu li.current a:hover, #adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a { color: #fff } #adminmenu .wp-not-current-submenu li > a, .folded #adminmenu .wp-has-current-submenu li > a { padding-right: 16px; padding-left: 14px; transition: all .1s ease-in-out, outline 0s } #adminmenu .wp-has-current-submenu ul > li > a, .folded #adminmenu li.menu-top .wp-submenu > li > a { padding: 5px 12px } #adminmenu .wp-submenu-head, #adminmenu a.menu-top { font-size: 14px; font-weight: 400; line-height: 1.3; padding: 0 } #adminmenu .wp-submenu-head { display: none } .folded #adminmenu .wp-menu-name { position: absolute; left: -999px } .folded #adminmenu .wp-submenu-head { display: block } #adminmenu .wp-submenu li { padding: 0; margin: 0 } #adminmenu .wp-menu-image img { padding: 9px 0 0; opacity: .6 } #adminmenu div.wp-menu-name { padding: 8px 8px 8px 36px; overflow-wrap: break-word; word-wrap: break-word; -ms-word-break: break-all; word-break: break-word; -webkit-hyphens: auto; hyphens: auto } #adminmenu div.wp-menu-image { float: left; width: 36px; height: 34px; margin: 0; text-align: center } #adminmenu div.wp-menu-image.svg { background-repeat: no-repeat; background-position: center; background-size: 20px auto } div.wp-menu-image:before { color: #a7aaad; color: rgba(240, 246, 252, .6); padding: 7px 0; transition: all .1s ease-in-out } #adminmenu div.wp-menu-image:before { color: #a7aaad; color: rgba(240, 246, 252, .6) } #adminmenu .current div.wp-menu-image:before, #adminmenu .wp-has-current-submenu div.wp-menu-image:before, #adminmenu a.current:hover div.wp-menu-image:before, #adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before, #adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, #adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, #adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before { color: #fff } #adminmenu li a:focus div.wp-menu-image:before, #adminmenu li.opensub div.wp-menu-image:before, #adminmenu li:hover div.wp-menu-image:before { color: #72aee6 } .folded #adminmenu div.wp-menu-image { width: 35px; height: 30px; position: absolute; z-index: 25 } .folded #adminmenu a.menu-top { height: 34px } .sticky-menu #adminmenuwrap { position: fixed } .wp-menu-arrow { display: none !important } ul#adminmenu a.wp-has-current-submenu { position: relative } ul#adminmenu a.wp-has-current-submenu:after, ul#adminmenu > li.current > a.current:after { right: 0; border: solid 8px transparent; content: " "; height: 0; width: 0; position: absolute; pointer-events: none; border-right-color: #f0f0f1; top: 50%; margin-top: -8px } .folded ul#adminmenu li.wp-has-current-submenu:focus-within a.wp-has-current-submenu:after, .folded ul#adminmenu li:hover a.wp-has-current-submenu:after { display: none } .folded ul#adminmenu a.wp-has-current-submenu:after, .folded ul#adminmenu > li a.current:after { border-width: 4px; margin-top: -4px } #adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after, #adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { right: 0; border: 8px solid transparent; content: " "; height: 0; width: 0; position: absolute; pointer-events: none; top: 10px; z-index: 10000 } .folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after, .folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { border-width: 4px; margin-top: -4px; top: 18px } #adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after, #adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after { border-right-color: #2c3338 } #adminmenu li.menu-top:hover .wp-menu-image img, #adminmenu li.wp-has-current-submenu .wp-menu-image img { opacity: 1 } #adminmenu li.wp-menu-separator { height: 5px; padding: 0; margin: 0 0 6px; cursor: inherit } #adminmenu div.separator { height: 2px; padding: 0 } #adminmenu .wp-submenu .wp-submenu-head { color: #fff; font-weight: 400; font-size: 14px; padding: 5px 4px 5px 11px; margin: -7px 0 4px -5px; border-width: 3px 0 3px 5px; border-style: solid; border-color: transparent } #adminmenu li.current, .folded #adminmenu li.wp-menu-open { border: 0 none } #adminmenu .awaiting-mod, #adminmenu .update-plugins { display: inline-block; vertical-align: top; box-sizing: border-box; margin: 1px 0 -1px 2px; padding: 0 5px; min-width: 18px; height: 18px; border-radius: 9px; background-color: #d63638; color: #fff; font-size: 11px; line-height: 1.6; text-align: center; z-index: 26 } #adminmenu li a.wp-has-current-submenu .update-plugins, #adminmenu li.current a .awaiting-mod { background-color: #d63638; color: #fff } #adminmenu li span.count-0 { display: none } #collapse-button { display: block; width: 100%; height: 34px; margin: 0; border: none; padding: 0; position: relative; overflow: visible; background: 0 0; color: #a7aaad; cursor: pointer } #collapse-button:hover { color: #72aee6 } #collapse-button:focus { color: #72aee6; outline: 1px solid transparent; outline-offset: -1px } #collapse-button .collapse-button-icon, #collapse-button .collapse-button-label { display: block; position: absolute; top: 0; left: 0 } #collapse-button .collapse-button-label { top: 8px } #collapse-button .collapse-button-icon { width: 36px; height: 34px } #collapse-button .collapse-button-label { padding: 0 0 0 36px } .folded #collapse-button .collapse-button-label { display: none } #collapse-button .collapse-button-icon:after { content: "\f148"; display: block; position: relative; top: 7px; text-align: center; font: normal 20px/1 dashicons !important; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .folded #collapse-button .collapse-button-icon:after, .rtl #collapse-button .collapse-button-icon:after { transform: rotate(180deg) } .rtl.folded #collapse-button .collapse-button-icon:after { transform: none } #collapse-button .collapse-button-icon:after, #collapse-button .collapse-button-label { transition: all .1s ease-in-out } li#wp-admin-bar-menu-toggle { display: none } .customize-support #menu-appearance a[href="themes.php?page=custom-background"], .customize-support #menu-appearance a[href="themes.php?page=custom-header"] { display: none } @media only screen and (max-width: 960px) { .auto-fold #wpcontent, .auto-fold #wpfooter { margin-left: 36px } .auto-fold #adminmenu, .auto-fold #adminmenu li.menu-top, .auto-fold #adminmenuback, .auto-fold #adminmenuwrap { width: 36px } .auto-fold #adminmenu .opensub .wp-submenu, .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open, .auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu, .auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu, .auto-fold #adminmenu .wp-submenu.sub-open, .auto-fold #adminmenu a.menu-top:focus + .wp-submenu { top: 0; left: 36px } .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu, .auto-fold #adminmenu a.wp-has-current-submenu:focus + .wp-submenu { position: absolute; top: -1000em; margin-right: -1px; padding: 7px 0 8px; z-index: 9999 } .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu { min-width: 150px; width: auto } .auto-fold #adminmenu .wp-has-current-submenu li > a { padding-right: 16px; padding-left: 14px } .auto-fold #adminmenu li.menu-top .wp-submenu > li > a { padding-left: 12px } .auto-fold #adminmenu .wp-menu-name { position: absolute; left: -999px } .auto-fold #adminmenu .wp-submenu-head { display: block } .auto-fold #adminmenu div.wp-menu-image { height: 30px; width: 34px; position: absolute; z-index: 25 } .auto-fold #adminmenu a.menu-top { min-height: 34px } .auto-fold #adminmenu li.wp-menu-open { border: 0 none } .auto-fold #adminmenu .wp-has-current-submenu.menu-top-last { margin-bottom: 0 } .auto-fold ul#adminmenu li:focus-within a.wp-has-current-submenu:after, .auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after { display: none } .auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after, .auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { border-width: 4px; margin-top: -4px; top: 16px } .auto-fold ul#adminmenu a.wp-has-current-submenu:after, .auto-fold ul#adminmenu > li a.current:after { border-width: 4px; margin-top: -4px } .auto-fold #adminmenu li.menu-top:hover, .auto-fold #adminmenu li.opensub > a.menu-top, .auto-fold #adminmenu li > a.menu-top:focus { z-index: 10000 } .auto-fold #collapse-menu .collapse-button-label { display: none } .auto-fold #collapse-button .collapse-button-icon:after { transform: rotate(180deg) } .rtl.auto-fold #collapse-button .collapse-button-icon:after { transform: none } } @media screen and (max-width: 782px) { .auto-fold #wpcontent { position: relative; margin-left: 0; padding-left: 10px } .sticky-menu #adminmenuwrap { position: relative; z-index: auto; top: 0 } .auto-fold #adminmenu, .auto-fold #adminmenuback, .auto-fold #adminmenuwrap { position: absolute; width: 190px; z-index: 100 } .auto-fold #adminmenuback { position: fixed } .auto-fold #adminmenuback, .auto-fold #adminmenuwrap { display: none } .auto-fold .wp-responsive-open #adminmenuback, .auto-fold .wp-responsive-open #adminmenuwrap { display: block } .auto-fold #adminmenu li.menu-top { width: 100% } .auto-fold #adminmenu li a { font-size: 16px; padding: 5px } .auto-fold #adminmenu li.menu-top .wp-submenu > li > a { padding: 10px 10px 10px 20px } .auto-fold #adminmenu .wp-menu-name { position: static } .auto-fold ul#adminmenu a.wp-has-current-submenu:after, .auto-fold ul#adminmenu > li.current > a.current:after { border-width: 8px; margin-top: -8px } .auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after, .auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { display: none } #adminmenu .wp-submenu { position: relative; display: none } .auto-fold #adminmenu .selected .wp-submenu, .auto-fold #adminmenu .wp-menu-open .wp-submenu { position: relative; display: block; top: 0; left: -1px; box-shadow: none } .auto-fold #adminmenu .selected .wp-submenu:after, .auto-fold #adminmenu .wp-menu-open .wp-submenu:after { display: none } .auto-fold #adminmenu .opensub .wp-submenu { display: none } .auto-fold #adminmenu .selected .wp-submenu { display: block } .auto-fold ul#adminmenu li:focus-within a.wp-has-current-submenu:after, .auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after { display: block } .auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu, .auto-fold #adminmenu a.menu-top:focus + .wp-submenu { position: relative; left: -1px; right: 0; top: 0 } #adminmenu .wp-not-current-submenu .wp-submenu, .folded #adminmenu .wp-has-current-submenu .wp-submenu { border-left: none } #adminmenu .wp-submenu .wp-submenu-head { display: none } #wp-responsive-toggle { position: fixed; top: 5px; left: 4px; padding-right: 10px; z-index: 99999; border: none; box-sizing: border-box } #wpadminbar #wp-admin-bar-menu-toggle a { display: block; padding: 0; overflow: hidden; outline: 0; text-decoration: none; border: 1px solid transparent; background: 0 0; height: 44px; margin-left: -1px } .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { background: #2c3338 } li#wp-admin-bar-menu-toggle { display: block } #wpadminbar #wp-admin-bar-menu-toggle a:hover { border: 1px solid transparent } #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { content: "\f228"; display: inline-block; float: left; font: normal 40px/45px dashicons; vertical-align: middle; outline: 0; margin: 0; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; height: 44px; width: 50px; padding: 0; border: none; text-align: center; text-decoration: none; box-sizing: border-box } .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { color: #72aee6 } } @media screen and (max-width: 600px) { #adminmenuback, #adminmenuwrap { display: none } .wp-responsive-open #adminmenuback, .wp-responsive-open #adminmenuwrap { display: block } .auto-fold #adminmenu { top: 46px } } /*! This file is auto-generated */ #wpbody-content #dashboard-widgets.columns-1 .postbox-container { width: 100% } #wpbody-content #dashboard-widgets.columns-2 .postbox-container { width: 49.5% } #wpbody-content #dashboard-widgets.columns-2 #postbox-container-2, #wpbody-content #dashboard-widgets.columns-2 #postbox-container-3, #wpbody-content #dashboard-widgets.columns-2 #postbox-container-4 { float: right; width: 50.5% } #wpbody-content #dashboard-widgets.columns-3 .postbox-container { width: 33.5% } #wpbody-content #dashboard-widgets.columns-3 #postbox-container-1 { width: 33% } #wpbody-content #dashboard-widgets.columns-3 #postbox-container-3, #wpbody-content #dashboard-widgets.columns-3 #postbox-container-4 { float: right } #wpbody-content #dashboard-widgets.columns-4 .postbox-container { width: 25% } #dashboard-widgets .postbox-container { width: 25% } #dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container { border: none !important } #dashboard-widgets-wrap { overflow: hidden; margin: 0 -8px } #dashboard-widgets .postbox .inside { margin-bottom: 0 } #dashboard-widgets .meta-box-sortables { display: flow-root; min-height: 100px; margin: 0 8px 20px } #dashboard-widgets .postbox-container .empty-container { outline: 3px dashed #c3c4c7; height: 250px } .is-dragging-metaboxes #dashboard-widgets .meta-box-sortables { outline: 3px dashed #646970; display: flow-root } #dashboard-widgets .postbox-container .empty-container:after { content: attr(data-emptystring); margin: auto; position: absolute; top: 50%; left: 0; right: 0; transform: translateY(-50%); padding: 0 2em; text-align: center; color: #646970; font-size: 16px; line-height: 1.5; display: none } #the-comment-list td.comment p.comment-author { margin-top: 0; margin-left: 0 } #the-comment-list p.comment-author img { float: left; margin-right: 8px } #the-comment-list p.comment-author strong a { border: none } #the-comment-list td { vertical-align: top } #the-comment-list td.comment { word-wrap: break-word } #the-comment-list td.comment img { max-width: 100% } .index-php #screen-meta-links { margin: 0 20px 8px 0 } .welcome-panel { position: relative; overflow: auto; margin: 16px 0; background: #2271b1 url(images/about-texture.png) center repeat; background-size: 500px 500px; background-blend-mode: overlay; font-size: 14px; line-height: 1.3; clear: both } .welcome-panel::before { content: ""; position: absolute; top: -16px; right: 96px; z-index: 0; width: 300px; height: 382px; background: url(images/about-header-about.svg) no-repeat center; background-size: contain } .welcome-panel h2 { margin: 0; font-size: 48px; font-weight: 600; line-height: 1.25; color: #fff } .welcome-panel h3 { margin: 0; font-size: 20px; font-weight: 400; line-height: 1.4 } .welcome-panel p { font-size: inherit; line-height: inherit } .welcome-panel-header { color: #fff } .welcome-panel-header a { color: #fff } .welcome-panel-header a:focus, .welcome-panel-header a:hover { color: #f5e6ab; text-decoration: none } .welcome-panel .welcome-panel-close:focus, .welcome-panel-header a:focus { outline-color: currentColor; outline-offset: 1px; box-shadow: none } .welcome-panel-header p { margin: .5em 0 0; font-size: 20px; line-height: 1.4 } .welcome-panel .welcome-panel-close { position: absolute; top: 10px; right: 10px; padding: 10px 15px 10px 24px; font-size: 13px; line-height: 1.23076923; text-decoration: none } .welcome-panel .welcome-panel-close:before { position: absolute; top: 8px; left: 0; transition: all .1s ease-in-out; content: '\f335'; font-size: 24px; color: #fff } .welcome-panel .welcome-panel-close { color: #fff } .welcome-panel .welcome-panel-close:focus, .welcome-panel .welcome-panel-close:focus::before, .welcome-panel .welcome-panel-close:hover, .welcome-panel .welcome-panel-close:hover::before { color: #f5e6ab } .wp-core-ui .welcome-panel .button.button-hero { margin: 15px 13px 3px 0; padding: 12px 36px; height: auto; line-height: 1.4285714; white-space: normal } .welcome-panel-content { min-height: 400px; display: flex; flex-direction: column; justify-content: space-between } .welcome-panel-header { box-sizing: border-box; margin-left: auto; margin-right: auto; max-width: 1500px; width: 100%; padding: 48px 408px 48px 48px } .welcome-panel .welcome-panel-column-container { box-sizing: border-box; width: 100%; clear: both; display: grid; z-index: 1; margin-top: 32px; padding: 48px; grid-template-columns:repeat(3, 1fr); gap: 32px; align-self: flex-end; background: #fff } [class*=welcome-panel-icon] { height: 60px; width: 60px; background-color: #1d2327; background-position: center; background-size: 24px 24px; background-repeat: no-repeat; border-radius: 100% } .welcome-panel-column { display: grid; grid-template-columns:min-content 1fr; gap: 24px } .welcome-panel-icon-pages { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M7 13.8h6v-1.5H7v1.5zM18 16V4c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2zM5.5 16V4c0-.3.2-.5.5-.5h10c.3 0 .5.2.5.5v12c0 .3-.2.5-.5.5H6c-.3 0-.5-.2-.5-.5zM7 10.5h8V9H7v1.5zm0-3.3h8V5.8H7v1.4zM20.2 6v13c0 .7-.6 1.2-1.2 1.2H8v1.5h11c1.5 0 2.7-1.2 2.7-2.8V6h-1.5z' /%3E%3C/svg%3E") } .welcome-panel-icon-layout { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M18 5.5H6a.5.5 0 00-.5.5v3h13V6a.5.5 0 00-.5-.5zm.5 5H10v8h8a.5.5 0 00.5-.5v-7.5zm-10 0h-3V18a.5.5 0 00.5.5h2.5v-8zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z' /%3E%3C/svg%3E") } .welcome-panel-icon-styles { background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 4c-4.4 0-8 3.6-8 8v.1c0 4.1 3.2 7.5 7.2 7.9h.8c4.4 0 8-3.6 8-8s-3.6-8-8-8zm0 15V5c3.9 0 7 3.1 7 7s-3.1 7-7 7z' /%3E%3C/svg%3E") } .welcome-panel .welcome-widgets-menus { line-height: 1.14285714 } .welcome-panel .welcome-panel-column ul { margin: .8em 1em 1em 0 } .welcome-panel li { font-size: 14px } .welcome-panel li a { text-decoration: none } .welcome-panel .welcome-panel-column li { line-height: 1.14285714; list-style-type: none; padding: 0 0 8px } .welcome-panel .welcome-icon { background: 0 0 !important } #dashboard_right_now .search-engines-info:before, #dashboard_right_now li a:before, #dashboard_right_now li span:before, .welcome-panel .welcome-icon:before { color: #646970; font: normal 20px/1 dashicons; speak: never; display: inline-block; padding: 0 10px 0 0; position: relative; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-decoration: none !important; vertical-align: top } .welcome-panel .welcome-edit-page:before, .welcome-panel .welcome-write-blog:before { content: "\f119"; top: -3px } .welcome-panel .welcome-add-page:before { content: "\f132"; top: -1px } .welcome-panel .welcome-setup-home:before { content: "\f102"; top: -1px } .welcome-panel .welcome-view-site:before { content: "\f115"; top: -2px } .welcome-panel .welcome-widgets-menus:before { content: "\f116"; top: -2px } .welcome-panel .welcome-widgets:before { content: "\f538"; top: -2px } .welcome-panel .welcome-menus:before { content: "\f163"; top: -2px } .welcome-panel .welcome-comments:before { content: "\f117"; top: -1px } .welcome-panel .welcome-learn-more:before { content: "\f118"; top: -1px } #dashboard_right_now .search-engines-info:before, #dashboard_right_now li a:before, #dashboard_right_now li > span:before { content: "\f159"; padding: 0 5px 0 0 } #dashboard_right_now .page-count a:before, #dashboard_right_now .page-count span:before { content: "\f105" } #dashboard_right_now .post-count a:before, #dashboard_right_now .post-count span:before { content: "\f109" } #dashboard_right_now .comment-count a:before { content: "\f101" } #dashboard_right_now .comment-mod-count a:before { content: "\f125" } #dashboard_right_now .storage-count a:before { content: "\f104" } #dashboard_right_now .storage-count.warning a:before { content: "\f153" } #dashboard_right_now .search-engines-info:before { content: "\f348" } .community-events-errors { margin: 0 } .community-events-loading { padding: 10px 12px 8px } .community-events { margin-bottom: 6px; padding: 0 12px } .community-events .spinner { float: none; margin: 5px 2px 0; vertical-align: top } .community-events form[aria-hidden=true], .community-events-errors [aria-hidden=true], .community-events-errors[aria-hidden=true], .community-events-loading[aria-hidden=true], .community-events[aria-hidden=true] { display: none } .community-events .activity-block:first-child, .community-events h2 { padding-top: 12px; padding-bottom: 10px } .community-events-form { margin: 15px 0 5px } .community-events-form .regular-text { width: 40%; height: 29px; margin: 0; vertical-align: top } .community-events li.event-none { border-left: 4px solid #72aee6 } #dashboard-widgets .community-events li.event-none a { text-decoration: underline } .community-events-form label { display: inline-block; vertical-align: top; line-height: 2.15384615; height: 28px } .community-events .activity-block > p { margin-bottom: 0; display: inline } .community-events-toggle-location { vertical-align: middle } #community-events-submit { margin-left: 3px; margin-right: 3px } #dashboard-widgets .community-events-cancel.button-link { vertical-align: top; line-height: 2; height: 28px; text-decoration: underline } .community-events ul { background-color: #f6f7f7; padding-left: 0; padding-right: 0; padding-bottom: 0 } .community-events li { margin: 0; padding: 8px 12px; color: #2c3338 } .community-events li:first-child { border-top: 1px solid #f0f0f1 } .community-events li ~ li { border-top: 1px solid #f0f0f1 } .community-events .activity-block.last { border-bottom: 1px solid #f0f0f1; padding-top: 0; margin-top: -1px } .community-events .event-info { display: block } .event-icon { height: 18px; padding-right: 10px; width: 18px; display: none } .event-icon:before { color: #646970; font-size: 18px } .event-meetup .event-icon:before { content: "\f484" } .event-wordcamp .event-icon:before { content: "\f486" } .community-events .event-title { font-weight: 600; display: block } .community-events .event-date, .community-events .event-time { display: block } .community-events-footer { margin-top: 0; margin-bottom: 0; padding: 12px; border-top: 1px solid #f0f0f1; color: #dcdcde } .community-events-footer .screen-reader-text { height: inherit; white-space: nowrap } #dashboard_primary .inside { margin: 0; padding: 0 } #dashboard_primary .widget-loading { padding: 12px 12px 0; margin-bottom: 1em !important } #dashboard_primary .inside .notice { margin: 0 } body #dashboard-widgets .postbox form .submit { margin: 0 } .dashboard-widget-control-form p { margin-top: 0 } .rssSummary { color: #646970; margin-top: 4px } #dashboard_primary .rss-widget { font-size: 13px; padding: 0 12px } #dashboard_primary .rss-widget:last-child { border-bottom: none; padding-bottom: 8px } #dashboard_primary .rss-widget a { font-weight: 400 } #dashboard_primary .rss-widget span, #dashboard_primary .rss-widget span.rss-date { color: #646970 } #dashboard_primary .rss-widget span.rss-date { margin-left: 12px } #dashboard_primary .rss-widget ul li { padding: 4px 0; margin: 0 } #dashboard_right_now ul { margin: 0; display: inline-block; width: 100% } #dashboard_right_now li { width: 50%; float: left; margin-bottom: 10px } #dashboard_right_now .inside { padding: 0 } #dashboard_right_now .main { padding: 0 12px 11px } #dashboard_right_now .main p { margin: 0 } #dashboard_right_now #wp-version-message .button { float: right; position: relative; top: -5px; margin-left: 5px } #dashboard_right_now p.search-engines-info { margin: 1em 0 } .mu-storage { overflow: hidden } #dashboard-widgets h3.mu-storage { margin: 0 0 10px; padding: 0; font-size: 14px; font-weight: 400 } #dashboard_right_now .sub { color: #50575e; background: #f6f7f7; border-top: 1px solid #f0f0f1; padding: 10px 12px 6px } #dashboard_right_now .sub h3 { color: #50575e } #dashboard_right_now .sub p { margin: 0 0 1em } #dashboard_right_now .warning a:before, #dashboard_right_now .warning span:before { color: #d63638 } #dashboard_quick_press .inside { margin: 0; padding: 0 } #dashboard_quick_press div.updated { margin-bottom: 10px; border: 1px solid #f0f0f1; border-width: 1px 1px 1px 0 } #dashboard_quick_press form { margin: 12px } #dashboard_quick_press .drafts { padding: 10px 0 0 } #dashboard_quick_press label { display: inline-block; margin-bottom: 4px } #dashboard_quick_press input, #dashboard_quick_press textarea { box-sizing: border-box; margin: 0 } #dashboard-widgets .postbox form .submit { margin: -39px 0; float: right } #description-wrap { margin-top: 12px } #quick-press textarea#content { min-height: 90px; max-height: 1300px; margin: 0 0 8px; padding: 6px 7px; resize: none } .js #dashboard_quick_press .drafts { border-top: 1px solid #f0f0f1 } #dashboard_quick_press .drafts abbr { border: none } #dashboard_quick_press .drafts .view-all { float: right; margin: 0 12px 0 0 } #dashboard_primary a.rsswidget { font-weight: 400 } #dashboard_quick_press .drafts ul { margin: 0 12px } #dashboard_quick_press .drafts li { margin-bottom: 1em } #dashboard_quick_press .drafts li time { color: #646970 } #dashboard_quick_press .drafts p { margin: 0; word-wrap: break-word } #dashboard_quick_press .draft-title { word-wrap: break-word } #dashboard_quick_press .draft-title a, #dashboard_quick_press .draft-title time { margin: 0 5px 0 0 } #dashboard-widgets h3, #dashboard-widgets h4, #dashboard_quick_press .drafts h2 { margin: 0 12px 8px; padding: 0; font-size: 14px; font-weight: 400; color: #1d2327 } #dashboard_quick_press .drafts h2 { line-height: inherit } #dashboard-widgets .inside h3, #dashboard-widgets .inside h4 { margin-left: 0; margin-right: 0 } #dashboard_activity .comment-meta span.approve:before { content: "\f227"; font: 20px/.5 dashicons; margin-left: 5px; vertical-align: middle; position: relative; top: -1px; margin-right: 2px } #dashboard_activity .inside { margin: 0; padding-bottom: 0 } #dashboard_activity .no-activity { overflow: hidden; padding: 12px 0; text-align: center } #dashboard_activity .no-activity p { color: #646970; font-size: 16px } #dashboard_activity .subsubsub { float: none; border-top: 1px solid #f0f0f1; margin: 0 -12px; padding: 8px 12px 4px } #dashboard_activity .subsubsub a .count, #dashboard_activity .subsubsub a.current .count { color: #646970 } #future-posts ul, #published-posts ul { clear: both; margin-bottom: 0 } #future-posts li, #published-posts li { margin-bottom: 8px } #future-posts ul span, #published-posts ul span { display: inline-block; margin-right: 5px; min-width: 150px; color: #646970 } .activity-block { border-bottom: 1px solid #f0f0f1; margin: 0 -12px; padding: 8px 12px 4px } .activity-block:last-child { border-bottom: none } .activity-block .subsubsub li { color: #dcdcde } #activity-widget #the-comment-list div.undo, #activity-widget #the-comment-list tr.undo { background: 0 0; padding: 6px 0; margin-left: 12px } #activity-widget #the-comment-list .comment-item { background: #f6f7f7; padding: 12px; position: relative } #activity-widget #the-comment-list .avatar { position: absolute; top: 12px } #activity-widget #the-comment-list .dashboard-comment-wrap.has-avatar { padding-left: 63px } #activity-widget #the-comment-list .dashboard-comment-wrap blockquote { margin: 1em 0 } #activity-widget #the-comment-list .comment-item p.row-actions { margin: 4px 0 0 } #activity-widget #the-comment-list .comment-item:first-child { border-top: 1px solid #f0f0f1 } #activity-widget #the-comment-list .unapproved { background-color: #fcf9e8 } #activity-widget #the-comment-list .unapproved:before { content: ""; display: block; position: absolute; left: 0; top: 0; bottom: 0; background: #d63638; width: 4px } #activity-widget #the-comment-list .spam-undo-inside .avatar, #activity-widget #the-comment-list .trash-undo-inside .avatar { position: relative; top: 0 } #dashboard-widgets #dashboard_browser_nag.postbox .inside { margin: 10px } .postbox .button-link .edit-box { display: none } .edit-box { opacity: 0 } .edit-box:focus, .hndle:hover .edit-box { opacity: 1 } #dashboard-widgets form .input-text-wrap input { width: 100% } #dashboard-widgets form .textarea-wrap textarea { width: 100% } #dashboard-widgets .postbox form .submit { float: none; margin: .5em 0 0; padding: 0; border: none } #dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish { min-width: 0 } #dashboard-widgets .button-link, #dashboard-widgets li a, .community-events-footer a { text-decoration: none } #dashboard-widgets h2 a { text-decoration: underline } #dashboard-widgets .hndle .postbox-title-action { float: right; line-height: 1.2 } #dashboard_plugins h5 { font-size: 14px } #latest-comments #the-comment-list { position: relative; margin: 0 -12px } #activity-widget #the-comment-list .comment, #activity-widget #the-comment-list .pingback { box-shadow: inset 0 1px 0 rgba(0, 0, 0, .06) } #activity-widget .comments #the-comment-list .alt { background-color: transparent } #activity-widget #latest-comments #the-comment-list .comment-item { min-height: 50px; margin: 0; padding: 12px } #latest-comments #the-comment-list .pingback { padding-left: 12px !important } #latest-comments #the-comment-list .comment-item:first-child { border-top: none } #latest-comments #the-comment-list .comment-meta { line-height: 1.5; margin: 0; color: #646970 } #latest-comments #the-comment-list .comment-meta cite { font-style: normal; font-weight: 400 } #latest-comments #the-comment-list .comment-item blockquote, #latest-comments #the-comment-list .comment-item blockquote p { margin: 0; padding: 0; display: inline } #latest-comments #the-comment-list .comment-item p.row-actions { margin: 3px 0 0; padding: 0; font-size: 13px } .rss-widget ul { margin: 0; padding: 0; list-style: none } a.rsswidget { font-size: 13px; font-weight: 600; line-height: 1.4 } .rss-widget ul li { line-height: 1.5; margin-bottom: 12px } .rss-widget span.rss-date { color: #646970; font-size: 13px; margin-left: 3px } .rss-widget cite { display: block; text-align: right; margin: 0 0 1em; padding: 0 } .rss-widget cite:before { content: "\2014" } .dashboard-comment-wrap { word-wrap: break-word } #dashboard_browser_nag a.update-browser-link { font-size: 1.2em; font-weight: 600 } #dashboard_browser_nag a { text-decoration: underline } #dashboard_browser_nag p.browser-update-nag.has-browser-icon { padding-right: 128px } #dashboard_browser_nag .browser-icon { margin-top: -32px } #dashboard_browser_nag.postbox { background-color: #b32d2e; background-image: none; border-color: #b32d2e; color: #fff; box-shadow: none } #dashboard_browser_nag.postbox h2 { border-bottom-color: transparent; background: transparent none; color: #fff; box-shadow: none } #dashboard_browser_nag a { color: #fff } #dashboard_browser_nag.postbox .postbox-header { border-color: transparent } #dashboard_browser_nag h2.hndle { border: none; font-weight: 600; font-size: 20px; padding-top: 10px } .postbox#dashboard_browser_nag p a.dismiss { font-size: 14px } .postbox#dashboard_browser_nag a, .postbox#dashboard_browser_nag p, .postbox#dashboard_browser_nag p.browser-update-nag { font-size: 16px } #dashboard_php_nag .dashicons-warning { color: #dba617; padding-right: 6px } #dashboard_php_nag.php-insecure .dashicons-warning { color: #d63638 } #dashboard_php_nag h2 { display: inline-block } #dashboard_php_nag p { margin: 12px 0 } #dashboard_php_nag h3 { font-weight: 600 } #dashboard_php_nag .button .dashicons-external { line-height: 25px } @media only screen and (min-width: 1600px) { .welcome-panel .welcome-panel-column-container { display: flex; justify-content: center } .welcome-panel-column { width: 100%; max-width: 460px } } @media only screen and (max-width: 799px) { #wpbody-content #dashboard-widgets .postbox-container { width: 100% } #dashboard-widgets .meta-box-sortables { min-height: 0 } .is-dragging-metaboxes #dashboard-widgets .meta-box-sortables { min-height: 100px } #dashboard-widgets .meta-box-sortables.empty-container { margin-bottom: 0 } } @media only screen and (min-width: 800px) and (max-width: 1499px) { #wpbody-content #dashboard-widgets .postbox-container { width: 49.5% } #wpbody-content #dashboard-widgets #postbox-container-2, #wpbody-content #dashboard-widgets #postbox-container-3, #wpbody-content #dashboard-widgets #postbox-container-4 { float: right; width: 50.5% } #dashboard-widgets #postbox-container-3 .empty-container, #dashboard-widgets #postbox-container-4 .empty-container { outline: 0; height: 0; min-height: 0; margin-bottom: 0 } #dashboard-widgets #postbox-container-3 .empty-container:after, #dashboard-widgets #postbox-container-4 .empty-container:after { display: none } #wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container { width: 100% } #wpbody #dashboard-widgets .metabox-holder.columns-1 .postbox-container .empty-container { outline: 0; height: 0; min-height: 0; margin-bottom: 0 } .index-php .columns-prefs, .index-php .screen-layout { display: block } .columns-prefs .columns-prefs-3, .columns-prefs .columns-prefs-4 { display: none } #dashboard-widgets .postbox-container .empty-container:after { display: block } } @media only screen and (min-width: 1500px) and (max-width: 1800px) { #wpbody-content #dashboard-widgets .postbox-container { width: 33.5% } #wpbody-content #dashboard-widgets #postbox-container-1 { width: 33% } #wpbody-content #dashboard-widgets #postbox-container-3, #wpbody-content #dashboard-widgets #postbox-container-4 { float: right } #dashboard-widgets #postbox-container-4 .empty-container { outline: 0; height: 0; min-height: 0; margin-bottom: 0 } #dashboard-widgets #postbox-container-4 .empty-container:after { display: none } #dashboard-widgets .postbox-container .empty-container:after { display: block } } @media only screen and (min-width: 1801px) { #dashboard-widgets .postbox-container .empty-container:after { display: block } } @media screen and (max-width: 870px) { .welcome-panel .welcome-panel-column li { display: inline-block; margin-right: 13px } .welcome-panel .welcome-panel-column ul { margin: .4em 0 0 } } @media screen and (max-width: 1180px) and (min-width: 783px) { .welcome-panel-column { grid-template-columns:1fr } [class*=welcome-panel-icon] { display: none } } @media screen and (max-width: 782px) { .welcome-panel::before { width: 240px; height: 305px; right: 32px } .welcome-panel-header { padding: 32px 288px 32px 32px } .welcome-panel .welcome-panel-column-container { grid-template-columns:1fr; box-sizing: border-box; padding: 32px; width: 100% } .welcome-panel .welcome-panel-column-content { max-width: 520px } .welcome-panel .welcome-panel-close { overflow: hidden; text-indent: 40px; white-space: nowrap; width: 20px; height: 20px; padding: 5px; top: 5px; right: 5px } .welcome-panel .welcome-panel-close::before { top: 5px; left: -35px } #dashboard-widgets h2 { padding: 12px } #dashboard_recent_comments #the-comment-list .comment-item .avatar { height: 30px; width: 30px; margin: 4px 10px 5px 0 } .community-events-toggle-location { height: 38px; vertical-align: baseline } .community-events-form .regular-text { height: 32px } #community-events-submit { margin-bottom: 0; vertical-align: top } #dashboard-widgets .community-events-cancel.button-link, .community-events-form label { font-size: 14px; line-height: normal; height: auto; padding: 6px 0; border: 1px solid transparent } .community-events .spinner { margin-top: 7px } } @media screen and (max-width: 600px) { .welcome-panel::before { display: none } .welcome-panel-header { padding: 32px } } @media screen and (max-width: 480px) { .welcome-panel-column { gap: 16px } } @media screen and (max-width: 360px) { .welcome-panel-column { grid-template-columns:1fr } [class*=welcome-panel-icon] { display: none } } @media screen and (min-width: 355px) { .community-events .event-info { display: table-row; float: left; max-width: 59% } .event-icon, .event-icon[aria-hidden=true] { display: table-cell } .event-info-inner { display: table-cell } .community-events .event-date-time { float: right; max-width: 39% } .community-events .event-date, .community-events .event-time { text-align: right } } /*! This file is auto-generated */ .response-links { display: block; margin-bottom: 1em } .response-links a { display: block } .response-links a.comments-edit-item-link { font-weight: 600 } .response-links a.comments-view-item-link { font-size: 12px } .post-com-count-wrapper strong { font-weight: 400 } .comments-view-item-link { display: inline-block; clear: both } .column-comments .post-com-count-wrapper, .column-response .post-com-count-wrapper { white-space: nowrap; word-wrap: normal } .column-comments .post-com-count, .column-response .post-com-count { display: inline-block; vertical-align: top } .column-comments .post-com-count-approved, .column-comments .post-com-count-no-comments, .column-response .post-com-count-approved, .column-response .post-com-count-no-comments { margin-top: 5px } .column-comments .comment-count-approved, .column-comments .comment-count-no-comments, .column-response .comment-count-approved, .column-response .comment-count-no-comments { box-sizing: border-box; display: block; padding: 0 8px; min-width: 24px; height: 2em; border-radius: 5px; background-color: #646970; color: #fff; font-size: 11px; line-height: 1.90909090; text-align: center } .column-comments .post-com-count-approved:after, .column-comments .post-com-count-no-comments:after, .column-response .post-com-count-approved:after, .column-response .post-com-count-no-comments:after { content: ""; display: block; margin-left: 8px; width: 0; height: 0; border-top: 5px solid #646970; border-right: 5px solid transparent } .column-comments a.post-com-count-approved:focus .comment-count-approved, .column-comments a.post-com-count-approved:hover .comment-count-approved, .column-response a.post-com-count-approved:focus .comment-count-approved, .column-response a.post-com-count-approved:hover .comment-count-approved { background: #2271b1 } .column-comments a.post-com-count-approved:focus:after, .column-comments a.post-com-count-approved:hover:after, .column-response a.post-com-count-approved:focus:after, .column-response a.post-com-count-approved:hover:after { border-top-color: #2271b1 } .column-comments .post-com-count-pending, .column-response .post-com-count-pending { position: relative; left: -3px; padding: 0 5px; min-width: 7px; height: 17px; border: 2px solid #fff; border-radius: 11px; background: #d63638; color: #fff; font-size: 9px; line-height: 1.88888888; text-align: center } .column-comments .post-com-count-no-pending, .column-response .post-com-count-no-pending { display: none } .commentlist li { padding: 1em 1em .2em; margin: 0; border-bottom: 1px solid #c3c4c7 } .commentlist li li { border-bottom: 0; padding: 0 } .commentlist p { padding: 0; margin: 0 0 .8em } #submitted-on, .submitted-on { color: #50575e } #replyrow td { padding: 2px } #replysubmit { margin: 0; padding: 5px 7px 10px; overflow: hidden } #replysubmit .reply-submit-buttons { margin-bottom: 0 } #replysubmit .button { margin-right: 5px } #replysubmit .spinner { float: none; margin: -4px 0 0 } #replyrow.inline-edit-row fieldset.comment-reply { font-size: inherit; line-height: inherit } #replyrow legend { margin: 0; padding: .2em 5px 0; font-size: 13px; line-height: 1.4; font-weight: 600 } #replyrow.inline-edit-row label { display: inline; vertical-align: baseline; line-height: inherit } #commentsdiv #edithead .inside, #edithead .inside { float: left; padding: 3px 0 2px 5px; margin: 0; text-align: center } #edithead .inside input { width: 180px } #edithead label { padding: 2px 0 } #replycontainer { padding: 5px } #replycontent { height: 120px; box-shadow: none } #replyerror { border-color: #dcdcde; background-color: #f6f7f7 } .commentlist .avatar { vertical-align: text-top } #the-comment-list div.undo, #the-comment-list tr.undo { background-color: #f6f7f7 } #the-comment-list .unapproved td, #the-comment-list .unapproved th { background-color: #fcf9e8 } #the-comment-list .unapproved th.check-column { border-left: 4px solid #d63638 } #the-comment-list .unapproved th.check-column input { margin-left: 4px } #the-comment-list .approve a { color: #007017 } #the-comment-list .unapprove a { color: #996800 } #the-comment-list td, #the-comment-list th { box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1) } #the-comment-list tr:last-child td, #the-comment-list tr:last-child th { box-shadow: none } #the-comment-list tr.unapproved + tr.approved td, #the-comment-list tr.unapproved + tr.approved th { border-top: 1px solid rgba(0, 0, 0, .03) } .vim-current, .vim-current td, .vim-current th { background-color: #f0f6fc !important } th .comment-grey-bubble { height: 16px; width: 16px } th .comment-grey-bubble:before { content: "\f101"; font: normal 20px/.5 dashicons; speak: never; display: inline-block; padding: 0; top: 4px; left: -4px; position: relative; vertical-align: top; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-decoration: none !important; color: #3c434a } table.fixed { table-layout: fixed } .fixed .column-rating, .fixed .column-visible { width: 8% } .fixed .column-author, .fixed .column-format, .fixed .column-links, .fixed .column-parent, .fixed .column-posts { width: 10% } .fixed .column-date { width: 14% } .column-date span[title] { -webkit-text-decoration: dotted underline; text-decoration: dotted underline } .fixed .column-posts { width: 74px } .fixed .column-posts, .fixed .column-role { -webkit-hyphens: auto; hyphens: auto } .fixed .column-comment .comment-author { display: none } .fixed .column-categories, .fixed .column-rel, .fixed .column-response, .fixed .column-role, .fixed .column-tags { width: 15% } .fixed .column-slug { width: 25% } .fixed .column-locations { width: 35% } .fixed .column-comments { width: 5.5em; padding: 8px 0; text-align: left } .fixed .column-comments .vers { padding-left: 3px } td.column-title strong, td.plugin-title strong { display: block; margin-bottom: .2em; font-size: 14px } td.column-title p, td.plugin-title p { margin: 6px 0 } table.media .column-title .media-icon { float: left; min-height: 60px; margin: 0 9px 0 0 } table.media .column-title .media-icon img { max-width: 60px; height: auto; vertical-align: top } table.media .column-title .has-media-icon ~ .row-actions { margin-left: 70px } table.media .column-title .filename { margin-bottom: .2em } .wp-list-table a { transition: none } #the-list tr:last-child td, #the-list tr:last-child th { border-bottom: none !important; box-shadow: none } #comments-form .fixed .column-author { width: 20% } #commentsdiv.postbox .inside { margin: 0; padding: 0 } #commentsdiv .inside .row-actions { line-height: 1.38461538 } #commentsdiv .inside .column-author { width: 25% } #commentsdiv .column-comment p { margin: .6em 0; padding: 0 } #commentsdiv #replyrow td { padding: 0 } #commentsdiv p { padding: 8px 10px; margin: 0 } #commentsdiv .comments-box { border: 0 none } #commentsdiv .comments-box thead td, #commentsdiv .comments-box thead th { background: 0 0; padding: 0 7px 4px } #commentsdiv .comments-box tr:last-child td { border-bottom: 0 none } #commentsdiv #edithead .inside input { width: 160px } .sorting-indicator { display: block; visibility: hidden; width: 10px; height: 4px; margin-top: 8px; margin-left: 7px } .sorting-indicator:before { content: "\f142"; font: normal 20px/1 dashicons; speak: never; display: inline-block; padding: 0; top: -4px; left: -8px; color: #3c434a; line-height: .5; position: relative; vertical-align: top; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-decoration: none !important; color: #3c434a } .column-comments .sorting-indicator:before { top: 0; left: -10px } th.desc a:focus span.sorting-indicator:before, th.desc:hover span.sorting-indicator:before, th.sorted.asc .sorting-indicator:before { content: "\f142" } th.asc a:focus span.sorting-indicator:before, th.asc:hover span.sorting-indicator:before, th.sorted.desc .sorting-indicator:before { content: "\f140" } .wp-list-table .toggle-row { position: absolute; right: 8px; top: 10px; display: none; padding: 0; width: 40px; height: 40px; border: none; outline: 0; background: 0 0 } .wp-list-table .toggle-row:hover { cursor: pointer } .wp-list-table .toggle-row:focus:before { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8) } .wp-list-table .toggle-row:active { box-shadow: none } .wp-list-table .toggle-row:before { position: absolute; top: -5px; left: 10px; border-radius: 50%; display: block; padding: 1px 2px 1px 0; color: #3c434a; content: "\f140"; font: normal 20px/1 dashicons; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; speak: never } .wp-list-table .is-expanded .toggle-row:before { content: "\f142" } .locked-indicator { display: none; margin-left: 6px; height: 20px; width: 16px } .locked-indicator-icon:before { color: #8c8f94; content: "\f160"; display: inline-block; font: normal 20px/1 dashicons; speak: never; vertical-align: middle; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .locked-info { display: none; margin-top: 4px } .locked-text { vertical-align: top } .wp-locked .locked-indicator, .wp-locked .locked-info { display: block } tr.wp-locked .check-column input[type=checkbox], tr.wp-locked .check-column label, tr.wp-locked .row-actions .inline, tr.wp-locked .row-actions .trash { display: none } .fixed .column-comments .sorting-indicator { margin-top: 3px } #menu-locations-wrap .widefat { width: 60% } .widefat th.sortable, .widefat th.sorted { padding: 0 } th.sortable a, th.sorted a { display: block; overflow: hidden; padding: 8px } .fixed .column-comments.sortable a, .fixed .column-comments.sorted a { padding: 8px 0 } th.sortable a span, th.sorted a span { float: left; cursor: pointer } th.asc a:focus span.sorting-indicator, th.asc:hover span.sorting-indicator, th.desc a:focus span.sorting-indicator, th.desc:hover span.sorting-indicator, th.sorted .sorting-indicator { visibility: visible } .tablenav-pages .current-page { margin: 0 2px 0 0; font-size: 13px; text-align: center } .tablenav .total-pages { margin-right: 2px } .tablenav #table-paging { margin-left: 2px } .tablenav { clear: both; height: 30px; margin: 6px 0 4px; padding-top: 5px; vertical-align: middle } .tablenav.themes { max-width: 98% } .tablenav .tablenav-pages { float: right; margin: 0 0 9px } .tablenav .no-pages, .tablenav .one-page .pagination-links { display: none } .tablenav .tablenav-pages .button, .tablenav .tablenav-pages .tablenav-pages-navspan { display: inline-block; vertical-align: baseline; min-width: 30px; min-height: 30px; margin: 0; padding: 0 4px; font-size: 16px; line-height: 1.625; text-align: center } .tablenav .displaying-num { margin-right: 7px } .tablenav .one-page .displaying-num { display: inline-block; margin: 5px 0 } .tablenav .actions { padding: 0 8px 0 0 } .wp-filter .actions { display: inline-block; vertical-align: middle } .tablenav .delete { margin-right: 20px } .tablenav .view-switch { float: right; margin: 0 5px; padding-top: 3px } .wp-filter .view-switch { display: inline-block; vertical-align: middle; padding: 12px 0; margin: 0 8px 0 2px } .media-toolbar.wp-filter .view-switch { margin: 0 12px 0 2px } .view-switch a { float: left; width: 28px; height: 28px; text-align: center; line-height: 1.84615384; text-decoration: none } .view-switch a:before { color: #c3c4c7; display: inline-block; font: normal 20px/1 dashicons; speak: never; vertical-align: middle; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .view-switch a:focus:before, .view-switch a:hover:before { color: #787c82 } .view-switch a.current:before { color: #2271b1 } .view-switch .view-list:before { content: "\f163" } .view-switch .view-excerpt:before { content: "\f164" } .view-switch .view-grid:before { content: "\f509" } .filter { float: left; margin: -5px 0 0 10px } .filter .subsubsub { margin-left: -10px; margin-top: 13px } .screen-per-page { width: 4em } #posts-filter .wp-filter { margin-bottom: 0 } #posts-filter fieldset { float: left; margin: 0 1.5ex 1em 0; padding: 0 } #posts-filter fieldset legend { padding: 0 0 .2em 1px } p.pagenav { margin: 0; display: inline } .pagenav span { font-weight: 600; margin: 0 6px } .row-title { font-size: 14px !important; font-weight: 600 } .column-comment .comment-author { margin-bottom: .6em } .column-author img, .column-comment .comment-author img, .column-username img { float: left; margin-right: 10px; margin-top: 1px } .row-actions { color: #a7aaad; font-size: 13px; padding: 2px 0 0; position: relative; left: -9999em } .rtl .row-actions a { display: inline-block } .row-actions .network_active, .row-actions .network_only { color: #000 } .comment-item:hover .row-actions, .mobile .row-actions, .no-js .row-actions, .row-actions.visible, tr:hover .row-actions { position: static } .row-actions-visible { padding: 2px 0 0 } #wpbody-content .inline-edit-row fieldset { font-size: 12px; float: left; margin: 0; padding: 0; width: 100% } #wpbody-content .inline-edit-row fieldset .inline-edit-col, tr.inline-edit-row td { padding: 0 .5em } #wpbody-content .quick-edit-row-post .inline-edit-col-left { width: 40% } #wpbody-content .quick-edit-row-post .inline-edit-col-right { width: 39% } #wpbody-content .inline-edit-row-post .inline-edit-col-center { width: 20% } #wpbody-content .quick-edit-row-page .inline-edit-col-left { width: 50% } #wpbody-content .bulk-edit-row-post .inline-edit-col-right, #wpbody-content .quick-edit-row-page .inline-edit-col-right { width: 49% } #wpbody-content .bulk-edit-row .inline-edit-col-left { width: 30% } #wpbody-content .bulk-edit-row-page .inline-edit-col-right { width: 69% } #wpbody-content .bulk-edit-row .inline-edit-col-bottom { float: right; width: 69% } #wpbody-content .inline-edit-row-page .inline-edit-col-right { margin-top: 27px } .inline-edit-row fieldset .inline-edit-group { clear: both; line-height: 2.5 } .inline-edit-row .submit { clear: both; padding: .5em; margin: .5em 0 0 } .inline-edit-row .notice-error { margin-top: 1em } .inline-edit-row .notice-error .error { margin: .5em 0; padding: 2px } #the-list .inline-edit-row .inline-edit-legend { margin: 0; padding: .2em .5em 0; line-height: 2.5; font-weight: 600 } #the-list #bulk-edit.inline-edit-row .inline-edit-legend { padding: .2em .5em } .inline-edit-row fieldset span.checkbox-title, .inline-edit-row fieldset span.title { margin: 0; padding: 0 } .inline-edit-row fieldset label, .inline-edit-row fieldset span.inline-edit-categories-label { display: block; margin: .2em 0; line-height: 2.5 } .inline-edit-row fieldset.inline-edit-date label { display: inline-block; margin: 0; vertical-align: baseline; line-height: 2 } .inline-edit-row fieldset label.inline-edit-tags { margin-top: 0 } .inline-edit-row fieldset label.inline-edit-tags span.title { margin: .2em 0; width: auto } .inline-edit-row fieldset label span.title, .inline-edit-row fieldset.inline-edit-date legend { display: block; float: left; width: 6em; line-height: 2.5 } #posts-filter fieldset.inline-edit-date legend { padding: 0 } .inline-edit-row fieldset .timestamp-wrap, .inline-edit-row fieldset label span.input-text-wrap { display: block; margin-left: 6em } .quick-edit-row-post fieldset.inline-edit-col-right label span.title { width: auto; padding-right: .5em } .inline-edit-row .inline-edit-or { margin: .2em 6px .2em 0; line-height: 2.5 } .inline-edit-row .input-text-wrap input[type=text] { width: 100% } .inline-edit-row fieldset label input[type=checkbox] { vertical-align: middle } .inline-edit-row fieldset label textarea { width: 100%; height: 4em; vertical-align: top } #wpbody-content .bulk-edit-row fieldset .inline-edit-group label { max-width: 50% } #wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child { margin-right: .5em } .inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input { width: 6em } .inline-edit-row .inline-edit-legend { text-transform: uppercase } .inline-edit-row fieldset .inline-edit-date { float: left } .inline-edit-row fieldset input[name=aa], .inline-edit-row fieldset input[name=hh], .inline-edit-row fieldset input[name=jj], .inline-edit-row fieldset input[name=mn] { vertical-align: middle; text-align: center; padding: 0 4px } .inline-edit-row fieldset label input.inline-edit-password-input { width: 8em } ul.cat-checklist { height: 12em; border: solid 1px #dcdcde; overflow-y: scroll; padding: 0 5px; margin: 0; background-color: #fff } #bulk-titles { display: block; height: 12em; border: 1px solid #dcdcde; overflow-y: scroll; padding: 0 5px; margin: 0 0 5px } .inline-edit-row fieldset ul.cat-checklist input, .inline-edit-row fieldset ul.cat-checklist li { margin: 0; position: relative } .inline-edit-row #bulk-titles div, .inline-edit-row fieldset ul.cat-checklist label { font-style: normal; font-size: 11px } .inline-edit-row fieldset label input.inline-edit-menu-order-input { width: 3em } .inline-edit-row fieldset label input.inline-edit-slug-input { width: 75% } .inline-edit-row #post_parent, .inline-edit-row select[name=page_template] { max-width: 80% } .quick-edit-row-post fieldset label.inline-edit-status { float: left } #bulk-titles { line-height: 140% } #bulk-titles div { margin: .2em .3em } #bulk-titles div a { cursor: pointer; display: block; float: left; height: 18px; margin: 0 3px 0 -2px; overflow: hidden; position: relative; width: 20px } #bulk-titles div a:before { position: relative; top: -3px } .plugins tbody, .plugins tbody th.check-column { padding: 8px 0 0 2px } .plugins tbody th.check-column input[type=checkbox] { margin-top: 4px } .updates-table .plugin-title p { margin-top: 0 } .plugins .inactive th.check-column, .plugins tfoot td.check-column, .plugins thead td.check-column { padding-left: 6px } .plugins, .plugins td, .plugins th { color: #000 } .plugins tr { background: #fff } .plugins p { margin: 0 4px; padding: 0 } .plugins .desc p { margin: 0 0 8px } .plugins td.desc { line-height: 1.5 } .plugins .desc ol, .plugins .desc ul { margin: 0 0 0 2em } .plugins .desc ul { list-style-type: disc } .plugins .row-actions { font-size: 13px; padding: 0 } .plugins .active td, .plugins .active th, .plugins .inactive td, .plugins .inactive th { padding: 10px 9px } .plugins .active td, .plugins .active th { background-color: #f0f6fc } .plugins .update td, .plugins .update th { border-bottom: 0 } .plugin-install #the-list td, .plugins .active td, .plugins .active th, .plugins .inactive td, .plugins .inactive th, .upgrade .plugins td, .upgrade .plugins th { box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1) } .plugins tr.active + tr.inactive td, .plugins tr.active + tr.inactive th, .plugins tr.active.plugin-update-tr + tr.inactive td, .plugins tr.active.plugin-update-tr + tr.inactive th { border-top: 1px solid rgba(0, 0, 0, .03); box-shadow: inset 0 1px 0 rgba(0, 0, 0, .02), inset 0 -1px 0 #dcdcde } .plugins .update td, .plugins .update th, .plugins .updated td, .plugins .updated th, .plugins tr.active + tr.inactive.update td, .plugins tr.active + tr.inactive.update th, .plugins tr.active + tr.inactive.updated td, .plugins tr.active + tr.inactive.updated th, .upgrade .plugins tr:last-of-type td, .upgrade .plugins tr:last-of-type th { box-shadow: none } .plugin-update-tr.active td, .plugins .active th.check-column { border-left: 4px solid #72aee6 } .wp-list-table.plugins .plugin-title, .wp-list-table.plugins .theme-title { padding-right: 12px; white-space: nowrap } .plugins .plugin-title .dashicons, .plugins .plugin-title img { float: left; padding: 0 10px 0 0; width: 64px; height: 64px } .plugins .plugin-title .dashicons:before { padding: 2px; background-color: #f0f0f1; box-shadow: inset 0 0 10px rgba(167, 170, 173, .15); font-size: 60px; color: #c3c4c7 } #update-themes-table .plugin-title .dashicons, #update-themes-table .plugin-title img { width: 85px } .plugins .column-auto-updates { width: 14.2em } .plugins .inactive .plugin-title strong { font-weight: 400 } .plugins .row-actions, .plugins .second { padding: 0 0 5px } .plugins .row-actions { white-space: normal; min-width: 12em } .plugins .update .row-actions, .plugins .update .second, .plugins .updated .row-actions, .plugins .updated .second { padding-bottom: 0 } .plugins-php .widefat tfoot td, .plugins-php .widefat tfoot th { border-top-style: solid; border-top-width: 1px } .plugins .plugin-update-tr .plugin-update { box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1); overflow: hidden; padding: 0 } .plugins .plugin-update-tr .notice, .plugins .plugin-update-tr div[class=update-message] { margin: 5px 20px 15px 40px } .plugins .notice p { margin: .5em 0 } .plugins .plugin-description a, .plugins .plugin-update a, .updates-table .plugin-title a { text-decoration: underline } .plugins tr.paused th.check-column { border-left: 4px solid #d63638 } .plugins tr.paused td, .plugins tr.paused th { background-color: #f6f7f7 } .plugins .paused .dashicons-warning, .plugins tr.paused .plugin-title { color: #d63638 } .plugins .paused .error-display code, .plugins .paused .error-display p { font-size: 90%; color: rgba(0, 0, 0, .7) } .plugins .resume-link { color: #d63638 } .plugin-card .update-now:before { color: #d63638; content: "\f463"; display: inline-block; font: normal 20px/1 dashicons; margin: 3px 5px 0 -2px; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; vertical-align: top } .plugin-card .updating-message:before { content: "\f463"; animation: rotation 2s infinite linear } @keyframes rotation { 0% { transform: rotate(0) } 100% { transform: rotate(359deg) } } .plugin-card .updated-message:before { color: #68de7c; content: "\f147" } .plugin-install-php h2 { clear: both } .plugin-install-php h3 { margin: 2.5em 0 8px } .plugin-install-php .wp-filter { margin-bottom: 0 } .plugin-group { overflow: hidden; margin-top: 1.5em } .plugin-group h3 { margin-top: 0 } .plugin-card { float: left; margin: 0 8px 16px; width: 48.5%; width: calc(50% - 8px); background-color: #fff; border: 1px solid #dcdcde; box-sizing: border-box } .plugin-card:nth-child(odd) { clear: both; margin-left: 0 } .plugin-card:nth-child(even) { margin-right: 0 } @media screen and (min-width: 1600px) and (max-width: 2299px) { .plugin-card { width: 30%; width: calc(33.1% - 8px) } .plugin-card:nth-child(odd) { clear: none; margin-left: 8px } .plugin-card:nth-child(even) { margin-right: 8px } .plugin-card:nth-child(3n+1) { clear: both; margin-left: 0 } .plugin-card:nth-child(3n) { margin-right: 0 } } @media screen and (min-width: 2300px) { .plugin-card { width: 25%; width: calc(25% - 12px) } .plugin-card:nth-child(odd) { clear: none; margin-left: 8px } .plugin-card:nth-child(even) { margin-right: 8px } .plugin-card:nth-child(4n+1) { clear: both; margin-left: 0 } .plugin-card:nth-child(4n) { margin-right: 0 } } .plugin-card-top { position: relative; padding: 20px 20px 10px; min-height: 135px } .plugin-action-buttons, div.action-links { margin: 0 } .plugin-card h3 { margin: 0 12px 12px 0; font-size: 18px; line-height: 1.3 } .plugin-card .desc, .plugin-card .name { margin-left: 148px; margin-right: 128px } .plugin-card .action-links { position: absolute; top: 20px; right: 20px; width: 120px } .plugin-action-buttons { clear: right; float: right; margin-bottom: 1em; text-align: right } .plugin-action-buttons li { margin-bottom: 10px } .plugin-card-bottom { clear: both; padding: 12px 20px; background-color: #f6f7f7; border-top: 1px solid #dcdcde; overflow: hidden } .plugin-card-bottom .star-rating { display: inline } .plugin-card-update-failed .update-now { font-weight: 600 } .plugin-card-update-failed .notice-error { margin: 0; padding-left: 16px; box-shadow: 0 -1px 0 #dcdcde } .plugin-card-update-failed .plugin-card-bottom { display: none } .plugin-card .column-rating { line-height: 1.76923076 } .plugin-card .column-rating, .plugin-card .column-updated { margin-bottom: 4px } .plugin-card .column-downloaded, .plugin-card .column-rating { float: left; clear: left; max-width: 180px } .plugin-card .column-compatibility, .plugin-card .column-updated { text-align: right; float: right; clear: right; width: 65%; width: calc(100% - 180px) } .plugin-card .column-compatibility span:before { font: normal 20px/.5 dashicons; speak: never; display: inline-block; padding: 0; top: 4px; left: -2px; position: relative; vertical-align: top; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-decoration: none !important; color: #3c434a } .plugin-card .column-compatibility .compatibility-incompatible:before { content: "\f158"; color: #d63638 } .plugin-card .column-compatibility .compatibility-compatible:before { content: "\f147"; color: #007017 } .plugin-card .notice { margin: 20px 20px 0 } .plugin-icon { position: absolute; top: 20px; left: 20px; width: 128px; height: 128px; margin: 0 20px 20px 0 } .no-plugin-results { color: #646970; font-size: 18px; font-style: normal; margin: 0; padding: 100px 0 0; text-align: center } .wp-list-table .site-archived, .wp-list-table .site-deleted, .wp-list-table tr.site-archived, .wp-list-table tr.site-deleted { background: #fcf0f1 } .wp-list-table .site-mature, .wp-list-table .site-spammed, .wp-list-table tr.site-mature, .wp-list-table tr.site-spammed { background: #fcf9e8 } .sites.fixed .column-lastupdated, .sites.fixed .column-registered { width: 20% } .sites.fixed .column-users { width: 80px } @media screen and (max-width: 1100px) and (min-width: 782px), (max-width: 480px) { .plugin-card .action-links { position: static; margin-left: 148px; width: auto } .plugin-action-buttons { float: none; margin: 1em 0 0; text-align: left } .plugin-action-buttons li { display: inline-block; vertical-align: middle } .plugin-action-buttons li .button { margin-right: 20px } .plugin-card h3 { margin-right: 24px } .plugin-card .desc, .plugin-card .name { margin-right: 0 } .plugin-card .desc p:first-of-type { margin-top: 0 } } @media screen and (max-width: 782px) { .tablenav { height: auto } .tablenav.top { margin: 20px 0 5px } .tablenav.bottom { position: relative; margin-top: 15px } .tablenav br { display: none } .tablenav br.clear { display: block } .tablenav .view-switch, .tablenav.top .actions { display: none } .view-switch a { width: 36px; height: 36px; line-height: 2.53846153 } .tablenav.top .displaying-num { display: none } .tablenav.bottom .displaying-num { position: absolute; right: 0; top: 11px; margin: 0; font-size: 14px } .tablenav .tablenav-pages { width: 100%; text-align: center; margin: 0 0 25px } .tablenav.bottom .tablenav-pages { margin-top: 25px } .tablenav.top .tablenav-pages.one-page { display: none } .tablenav.bottom .tablenav-pages.one-page { margin-top: 15px; height: 0 } .tablenav-pages .pagination-links { font-size: 16px } .tablenav .tablenav-pages .button, .tablenav .tablenav-pages .tablenav-pages-navspan { min-width: 44px; padding: 12px 8px; font-size: 18px; line-height: 1 } .tablenav-pages .pagination-links .current-page { min-width: 44px; padding: 12px 6px; font-size: 16px; line-height: 1.125 } .form-wrap > p { display: none } .wp-list-table th.column-primary ~ th, .wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) { display: none } .wp-list-table thead th.column-primary { width: 100% } .wp-list-table tr th.check-column { display: table-cell } .wp-list-table .check-column { width: 2.5em } .wp-list-table .column-primary .toggle-row { display: block } .wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column) { position: relative; clear: both; width: auto !important } .wp-list-table td.column-primary { padding-right: 50px } .wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) { padding: 3px 8px 3px 35% } .wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before { position: absolute; left: 10px; display: block; overflow: hidden; width: 32%; content: attr(data-colname); white-space: nowrap; text-overflow: ellipsis } .wp-list-table .is-expanded td:not(.hidden) { display: block !important; overflow: hidden } .column-posts, .widefat .num { text-align: left } #comments-form .fixed .column-author, #commentsdiv .fixed .column-author { display: none !important } .fixed .column-comment .comment-author { display: block } .fixed .column-author.hidden ~ .column-comment .comment-author { display: none } #the-comment-list .is-expanded td { box-shadow: none } #the-comment-list .is-expanded td:last-child { box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1) } .post-com-count .screen-reader-text { position: static; -webkit-clip-path: none; clip-path: none; width: auto; height: auto; margin: 0 } .column-comments .post-com-count-approved:after, .column-comments .post-com-count-no-comments:after, .column-response .post-com-count-approved:after, .column-response .post-com-count-no-comments:after { content: none } .column-comments .post-com-count [aria-hidden=true], .column-response .post-com-count [aria-hidden=true] { display: none } .column-comments .post-com-count-wrapper, .column-response .post-com-count-wrapper { white-space: normal } .column-comments .post-com-count-wrapper > a, .column-response .post-com-count-wrapper > a { display: block } .column-comments .post-com-count-approved, .column-comments .post-com-count-no-comments, .column-response .post-com-count-approved, .column-response .post-com-count-no-comments { margin-top: 0; margin-right: .5em } .column-comments .post-com-count-pending, .column-response .post-com-count-pending { position: static; height: auto; min-width: 0; padding: 0; border: none; border-radius: 0; background: 0 0; color: #b32d2e; font-size: inherit; line-height: inherit; text-align: left } .column-comments .post-com-count-pending:hover, .column-response .post-com-count-pending:hover { color: #d63638 } .widefat tfoot td.check-column, .widefat thead td.check-column { padding-top: 10px } .row-actions { margin-left: -8px; margin-right: -8px; padding-top: 4px } body:not(.plugins-php) .row-actions { display: flex; flex-wrap: wrap; gap: 8px; color: transparent } .row-actions span .button-link, .row-actions span a { display: inline-block; padding: 4px 8px; line-height: 1.5 } .row-actions span.approve:before, .row-actions span.unapprove:before { content: "| " } #wpbody-content .bulk-edit-row .inline-edit-col-bottom, #wpbody-content .bulk-edit-row .inline-edit-col-left, #wpbody-content .bulk-edit-row-page .inline-edit-col-right, #wpbody-content .bulk-edit-row-post .inline-edit-col-right, #wpbody-content .inline-edit-row-post .inline-edit-col-center, #wpbody-content .quick-edit-row-page .inline-edit-col-left, #wpbody-content .quick-edit-row-page .inline-edit-col-right, #wpbody-content .quick-edit-row-post .inline-edit-col-left, #wpbody-content .quick-edit-row-post .inline-edit-col-right { float: none; width: 100% } #wpbody-content .bulk-edit-row fieldset .inline-edit-col label, #wpbody-content .bulk-edit-row fieldset .inline-edit-group label, #wpbody-content .quick-edit-row fieldset .inline-edit-col label, #wpbody-content .quick-edit-row fieldset .inline-edit-group label { max-width: none; float: none; margin-bottom: 5px } #wpbody .bulk-edit-row fieldset select { display: block; width: 100%; max-width: none; box-sizing: border-box } .inline-edit-row fieldset input[name=aa], .inline-edit-row fieldset input[name=hh], .inline-edit-row fieldset input[name=jj], .inline-edit-row fieldset input[name=mn] { font-size: 16px; line-height: 2; padding: 3px 4px } .inline-edit-row #bulk-titles div, .inline-edit-row fieldset ul.cat-checklist label { font-size: 16px } .inline-edit-row fieldset label span.title, .inline-edit-row fieldset.inline-edit-date legend { float: none } .inline-edit-row fieldset label.inline-edit-tags { padding: 0 .5em } .inline-edit-row fieldset .inline-edit-col label.inline-edit-tags { padding: 0 } .inline-edit-row fieldset .timestamp-wrap, .inline-edit-row fieldset label span.input-text-wrap { margin-left: 0 } .inline-edit-row .inline-edit-or { margin: 0 6px 0 0 } #commentsdiv #edithead .inside, #edithead .inside { float: none; text-align: left; padding: 3px 5px } #commentsdiv #edithead .inside input, #edithead .inside input { width: 100% } #edithead label { display: block } #bulk-titles div { margin: .8em .3em } #bulk-titles div a { height: 22px } #wpbody-content .updates-table .plugin-title { width: auto; white-space: normal } .link-manager-php #posts-filter { margin-top: 25px } .link-manager-php .tablenav.bottom { overflow: hidden } .comments-box .toggle-row, .wp-list-table.plugins .toggle-row { display: none } #wpbody-content .wp-list-table.plugins td { display: block; width: auto; padding: 10px 9px } #wpbody-content .wp-list-table.plugins .desc.hidden { display: none } #wpbody-content .wp-list-table.plugins .column-description { padding-top: 2px } #wpbody-content .wp-list-table.plugins .plugin-title, #wpbody-content .wp-list-table.plugins .theme-title { padding-right: 12px; white-space: normal } .wp-list-table.plugins .plugin-title, .wp-list-table.plugins .theme-title { padding-top: 13px; padding-bottom: 4px } .plugins #the-list .update td, .plugins #the-list .update th, .plugins #the-list tr > td:not(:last-child), .wp-list-table.plugins #the-list .theme-title { box-shadow: none; border-top: none } .plugins #the-list tr td { border-top: none } .plugins tbody { padding: 1px 0 0 } .plugins .plugin-update-tr:before, .plugins tr.active + tr.inactive td.column-description, .plugins tr.active + tr.inactive th.check-column { box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1) } .plugins tr.active + tr.inactive td, .plugins tr.active + tr.inactive th.check-column { border-top: none } .plugins .plugin-update-tr:before { content: ""; display: table-cell } .plugins #the-list .plugin-update-tr .plugin-update { border-left: none } .plugin-update-tr .update-message { margin-left: 0 } .plugins .active.update + .plugin-update-tr:before, .plugins .active.updated + .plugin-update-tr:before { background-color: #f0f6fc; border-left: 4px solid #72aee6 } .plugins .plugin-update-tr .update-message { margin-left: 0 } .wp-list-table.plugins .plugin-title strong, .wp-list-table.plugins .theme-title strong { font-size: 1.4em; line-height: 1.5 } .plugins tbody th.check-column { padding: 8px 0 0 5px } .plugins .inactive th.check-column, .plugins tfoot td.check-column, .plugins thead td.check-column { padding-left: 9px } table.plugin-install .column-description, table.plugin-install .column-name, table.plugin-install .column-rating, table.plugin-install .column-version { display: block; width: auto } table.plugin-install th.column-description, table.plugin-install th.column-name, table.plugin-install th.column-rating, table.plugin-install th.column-version { display: none } table.plugin-install td.column-name strong { font-size: 1.4em; line-height: 1.6em } table.plugin-install #the-list td { box-shadow: none } table.plugin-install #the-list tr { display: block; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1) } .plugin-card { margin-left: 0; margin-right: 0; width: 100% } table.media .column-title .has-media-icon ~ .row-actions { margin-left: 0; clear: both } } @media screen and (max-width: 480px) { .tablenav-pages .current-page { margin: 0 } .tablenav.bottom .displaying-num { position: relative; top: 0; display: block; text-align: right; padding-bottom: .5em } .tablenav.bottom .tablenav-pages.one-page { height: auto } .tablenav-pages .tablenav-paging-text { float: left; width: 100%; padding-top: .5em } } /*! This file is auto-generated */ #poststuff { padding-top: 10px; min-width: 763px } #poststuff #post-body { padding: 0 } #poststuff .postbox-container { width: 100% } #poststuff #post-body.columns-2 { margin-right: 300px } #show-comments { overflow: hidden } #save-action .spinner, #show-comments a { float: left } #show-comments .spinner { float: none; margin-top: 0 } #lost-connection-notice .spinner { visibility: visible; float: left; margin: 0 5px 0 0 } #titlediv { position: relative } #titlediv label { cursor: text } #titlediv div.inside { margin: 0 } #poststuff #titlewrap { border: 0; padding: 0 } #titlediv #title { padding: 3px 8px; font-size: 1.7em; line-height: 100%; height: 1.7em; width: 100%; outline: 0; margin: 0 0 3px; background-color: #fff } #titlediv #title-prompt-text { color: #646970; position: absolute; font-size: 1.7em; padding: 10px; pointer-events: none } input#link_description, input#link_url { width: 100% } #pending { background: 0 none; border: 0 none; padding: 0; font-size: 11px; margin-top: -1px } #comment-link-box, #edit-slug-box { line-height: 1.84615384; min-height: 25px; margin-top: 5px; padding: 0 10px; color: #646970 } #edit-slug-box .cancel { margin-right: 10px; padding: 0; font-size: 11px } #comment-link-box { margin: 5px 0; padding: 0 5px } #editable-post-name-full { display: none } #editable-post-name { font-weight: 600 } #editable-post-name input { font-size: 13px; font-weight: 400; height: 24px; margin: 0; width: 16em } .postarea h3 label { float: left } body.post-new-php .submitbox .submitdelete { display: none } .submitbox .submit a:hover { text-decoration: underline } .submitbox .submit input { margin-bottom: 8px; margin-right: 4px; padding: 6px } #post-status-select { margin-top: 3px } body.post-type-wp_navigation .inline-edit-status, body.post-type-wp_navigation div#minor-publishing { display: none } .is-dragging-metaboxes .metabox-holder .postbox-container .meta-box-sortables { outline: 3px dashed #646970; display: flow-root; min-height: 60px; margin-bottom: 20px } .postbox { position: relative; min-width: 255px; border: 1px solid #c3c4c7; box-shadow: 0 1px 1px rgba(0, 0, 0, .04); background: #fff } #trackback_url { width: 99% } #normal-sortables .postbox .submit { background: transparent none; border: 0 none; float: right; padding: 0 12px; margin: 0 } .category-add input[type=text], .category-add select { width: 100%; max-width: 260px; vertical-align: baseline } #side-sortables .category-add input[type=text], #side-sortables .category-add select { margin: 0 0 1em } #side-sortables .add-menu-item-tabs li, .wp-tab-bar li, ul.category-tabs li { display: inline; line-height: 1.35 } .no-js .category-tabs li.hide-if-no-js { display: none } #side-sortables .add-menu-item-tabs a, .category-tabs a, .wp-tab-bar a { text-decoration: none } #post-body ul.add-menu-item-tabs li.tabs a, #post-body ul.category-tabs li.tabs a, #side-sortables .add-menu-item-tabs .tabs a, #side-sortables .category-tabs .tabs a, .wp-tab-bar .wp-tab-active a { color: #2c3338 } .category-tabs { margin: 8px 0 5px } #category-adder h4 { margin: 0 } .taxonomy-add-new { display: inline-block; margin: 10px 0; font-weight: 600 } #side-sortables .add-menu-item-tabs, .wp-tab-bar { margin-bottom: 3px } #normal-sortables .postbox #replyrow .submit { float: none; margin: 0; padding: 5px 7px 10px; overflow: hidden } #side-sortables .submitbox .submit .preview, #side-sortables .submitbox .submit a.preview:hover, #side-sortables .submitbox .submit input { border: 0 none } ul.add-menu-item-tabs, ul.category-tabs, ul.wp-tab-bar { margin-top: 12px } ul.add-menu-item-tabs li, ul.category-tabs li { border: solid 1px transparent; position: relative } .wp-tab-active, ul.add-menu-item-tabs li.tabs, ul.category-tabs li.tabs { border: 1px solid #dcdcde; border-bottom-color: #fff; background-color: #fff } ul.add-menu-item-tabs li, ul.category-tabs li, ul.wp-tab-bar li { padding: 3px 5px 6px } #set-post-thumbnail { display: inline-block; max-width: 100% } #postimagediv .inside img { max-width: 100%; height: auto; width: auto; vertical-align: top; background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7); background-position: 0 0, 10px 10px; background-size: 20px 20px } form#tags-filter { position: relative } .ui-tabs-hide, .wp-hidden-children .wp-hidden-child { display: none } #post-body .tagsdiv #newtag { margin-right: 5px; width: 16em } #side-sortables input#post_password { width: 94% } #side-sortables .tagsdiv #newtag { width: 68% } #post-status-info { width: 100%; border-spacing: 0; border: 1px solid #c3c4c7; border-top: none; background-color: #f6f7f7; box-shadow: 0 1px 1px rgba(0, 0, 0, .04); z-index: 999 } #post-status-info td { font-size: 12px } .autosave-info { padding: 2px 10px; text-align: right } #editorcontent #post-status-info { border: none } #content-resize-handle { background: transparent url(images/resize.gif) no-repeat scroll right bottom; width: 12px; cursor: row-resize } .rtl #content-resize-handle { background-image: url(images/resize-rtl.gif); background-position: left bottom } .wp-editor-expand #content-resize-handle { display: none } #postdivrich #content { resize: none } #wp-word-count { padding: 2px 10px } #wp-content-editor-container { position: relative } .wp-editor-expand #wp-content-editor-tools { z-index: 1000; border-bottom: 1px solid #c3c4c7 } .wp-editor-expand #wp-content-editor-container { box-shadow: none; margin-top: -1px } .wp-editor-expand #wp-content-editor-container { border-bottom: 0 none } .wp-editor-expand div.mce-statusbar { z-index: 1 } .wp-editor-expand #post-status-info { border-top: 1px solid #c3c4c7 } .wp-editor-expand div.mce-toolbar-grp { z-index: 999 } .mce-fullscreen #wp-content-wrap .mce-edit-area, .mce-fullscreen #wp-content-wrap .mce-menubar, .mce-fullscreen #wp-content-wrap .mce-statusbar, .mce-fullscreen #wp-content-wrap .mce-toolbar-grp { position: static !important; width: auto !important; padding: 0 !important } .mce-fullscreen #wp-content-wrap .mce-statusbar { visibility: visible !important } .mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw { display: none } .mce-fullscreen #wp-content-wrap .mce-wp-dfw, .post-php.mce-fullscreen #wpadminbar { display: none } #wp-content-editor-tools { background-color: #f0f0f1; padding-top: 20px } #poststuff #post-body.columns-2 #side-sortables { width: 280px } #timestampdiv select { vertical-align: top; font-size: 12px; line-height: 2.33333333 } #aa, #hh, #jj, #mn { padding: 6px 1px; font-size: 12px; line-height: 1.16666666 } #hh, #jj, #mn { width: 2em } #aa { width: 3.4em } .curtime #timestamp { padding: 2px 0 1px; display: inline !important; height: auto !important } #post-body #visibility:before, #post-body .misc-pub-comment-status:before, #post-body .misc-pub-post-status:before, #post-body .misc-pub-response-to:before, #post-body .misc-pub-revisions:before, #post-body .misc-pub-uploadedby:before, #post-body .misc-pub-uploadedto:before, .curtime #timestamp:before { color: #8c8f94 } #post-body #visibility:before, #post-body .misc-pub-comment-status:before, #post-body .misc-pub-post-status:before, #post-body .misc-pub-response-to:before, #post-body .misc-pub-revisions:before, #post-body .misc-pub-uploadedby:before, #post-body .misc-pub-uploadedto:before, .curtime #timestamp:before { font: normal 20px/1 dashicons; speak: never; display: inline-block; margin-left: -1px; padding-right: 3px; vertical-align: top; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } #post-body .misc-pub-comment-status:before, #post-body .misc-pub-post-status:before { content: "\f173" } #post-body #visibility:before { content: "\f177" } .curtime #timestamp:before { content: "\f145"; position: relative; top: -1px } #post-body .misc-pub-uploadedby:before { content: "\f110"; position: relative; top: -1px } #post-body .misc-pub-uploadedto:before { content: "\f318"; position: relative; top: -1px } #post-body .misc-pub-revisions:before { content: "\f321" } #post-body .misc-pub-response-to:before { content: "\f101" } #timestampdiv { padding-top: 5px; line-height: 1.76923076 } #timestampdiv p { margin: 8px 0 6px } #timestampdiv input { text-align: center } .notification-dialog { position: fixed; top: 30%; max-height: 70%; left: 50%; width: 450px; margin-left: -225px; background: #fff; box-shadow: 0 3px 6px rgba(0, 0, 0, .3); line-height: 1.5; z-index: 1000005; overflow-y: auto } .notification-dialog-background { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: #000; opacity: .7; z-index: 1000000 } #post-lock-dialog .post-locked-message, #post-lock-dialog .post-taken-over { margin: 25px } #file-editor-warning .button, #post-lock-dialog .post-locked-message a.button { margin-right: 10px } #post-lock-dialog .post-locked-avatar { float: left; margin: 0 20px 20px 0 } #post-lock-dialog .wp-tab-first { outline: 0 } #post-lock-dialog .locked-saving img { float: left; margin-right: 3px } #post-lock-dialog.saved .locked-saved, #post-lock-dialog.saving .locked-saving { display: inline } #excerpt { display: block; margin: 12px 0 0; height: 4em; width: 100% } .tagchecklist { margin-left: 14px; font-size: 12px; overflow: auto } .tagchecklist br { display: none } .tagchecklist strong { margin-left: -8px; position: absolute } .tagchecklist > li { float: left; margin-right: 25px; font-size: 13px; line-height: 1.8; cursor: default; max-width: 100%; overflow: hidden; text-overflow: ellipsis } .tagchecklist .ntdelbutton { position: absolute; width: 24px; height: 24px; border: none; margin: 0 0 0 -19px; padding: 0; background: 0 0; cursor: pointer; text-indent: 0 } #poststuff .stuffbox > h3, #poststuff h2, #poststuff h3.hndle { font-size: 14px; padding: 8px 12px; margin: 0; line-height: 1.4 } #poststuff .stuffbox h2 { padding: 8px 10px } #poststuff .stuffbox > h2 { border-bottom: 1px solid #f0f0f1 } #poststuff .inside { margin: 6px 0 0 } .link-add-php #poststuff .inside, .link-php #poststuff .inside { margin-top: 12px } #poststuff .stuffbox .inside { margin: 0 } #poststuff .inside #page_template, #poststuff .inside #parent_id { max-width: 100% } .post-attributes-label-wrapper { margin-bottom: .5em } .post-attributes-label { vertical-align: baseline; font-weight: 600 } #comment-status-radio, #post-visibility-select { line-height: 1.5; margin-top: 3px } #linksubmitdiv .inside, #poststuff #submitdiv .inside { margin: 0; padding: 0 } #post-body-content, .edit-form-section { margin-bottom: 20px } .wp_attachment_details .attachment-content-description { margin-top: .5385em; display: inline-block; min-height: 1.6923em } .privacy-settings #wpcontent, .privacy-settings.auto-fold #wpcontent, .site-health #wpcontent, .site-health.auto-fold #wpcontent { padding-left: 0 } .health-check-header h1, .privacy-settings-header h1 { display: inline-block; font-weight: 600; margin: 0 .8rem 1rem; font-size: 23px; padding: 9px 0 4px; line-height: 1.3 } .health-check-header, .privacy-settings-header { text-align: center; margin: 0 0 1rem; background: #fff; border-bottom: 1px solid #dcdcde } .health-check-title-section, .privacy-settings-title-section { display: flex; align-items: center; justify-content: center; clear: both; padding-top: 8px } .privacy-settings-tabs-wrapper { display: -ms-inline-grid; -ms-grid-columns: 1fr 1fr; vertical-align: top; display: inline-grid; grid-template-columns:1fr 1fr } .privacy-settings-tab { display: block; text-decoration: none; color: inherit; padding: .5rem 1rem 1rem; margin: 0 1rem; transition: box-shadow .5s ease-in-out } .health-check-tab:nth-child(1), .privacy-settings-tab:nth-child(1) { -ms-grid-column: 1 } .health-check-tab:nth-child(2), .privacy-settings-tab:nth-child(2) { -ms-grid-column: 2 } .health-check-tab:focus, .privacy-settings-tab:focus { color: #1d2327; outline: 1px solid #787c82; box-shadow: none } .health-check-tab.active, .privacy-settings-tab.active { box-shadow: inset 0 -3px #3582c4; font-weight: 600 } .health-check-body, .privacy-settings-body { max-width: 800px; margin: 0 auto } .tools-privacy-policy-page th { min-width: 230px } .hr-separator { margin-top: 20px; margin-bottom: 15px } .health-check-accordion, .privacy-settings-accordion { border: 1px solid #c3c4c7 } .health-check-accordion-heading, .privacy-settings-accordion-heading { margin: 0; border-top: 1px solid #c3c4c7; font-size: inherit; line-height: inherit; font-weight: 600; color: inherit } .health-check-accordion-heading:first-child, .privacy-settings-accordion-heading:first-child { border-top: none } .health-check-accordion-trigger, .privacy-settings-accordion-trigger { background: #fff; border: 0; color: #2c3338; cursor: pointer; display: flex; font-weight: 400; margin: 0; padding: 1em 3.5em 1em 1.5em; min-height: 46px; position: relative; text-align: left; width: 100%; align-items: center; justify-content: space-between; -webkit-user-select: auto; user-select: auto } .health-check-accordion-trigger:active, .health-check-accordion-trigger:hover, .privacy-settings-accordion-trigger:active, .privacy-settings-accordion-trigger:hover { background: #f6f7f7 } .health-check-accordion-trigger:focus, .privacy-settings-accordion-trigger:focus { color: #1d2327; border: none; box-shadow: none; outline-offset: -1px; outline: 2px solid #2271b1; background-color: #f6f7f7 } .health-check-accordion-trigger .title, .privacy-settings-accordion-trigger .title { pointer-events: none; font-weight: 600; flex-grow: 1 } .health-check-accordion-trigger .icon, .privacy-settings-accordion-trigger .icon, .privacy-settings-view-read .icon, .site-health-view-passed .icon { border: solid #50575e; border-width: 0 2px 2px 0; height: .5rem; pointer-events: none; position: absolute; right: 1.5em; top: 50%; transform: translateY(-70%) rotate(45deg); width: .5rem } .health-check-accordion-trigger .badge, .privacy-settings-accordion-trigger .badge { padding: .1rem .5rem .15rem; color: #2c3338; font-weight: 600 } .privacy-settings-accordion-trigger .badge { margin-left: .5rem } .health-check-accordion-trigger .badge.blue, .privacy-settings-accordion-trigger .badge.blue { border: 1px solid #72aee6 } .health-check-accordion-trigger .badge.orange, .privacy-settings-accordion-trigger .badge.orange { border: 1px solid #dba617 } .health-check-accordion-trigger .badge.red, .privacy-settings-accordion-trigger .badge.red { border: 1px solid #e65054 } .health-check-accordion-trigger .badge.green, .privacy-settings-accordion-trigger .badge.green { border: 1px solid #00ba37 } .health-check-accordion-trigger .badge.purple, .privacy-settings-accordion-trigger .badge.purple { border: 1px solid #2271b1 } .health-check-accordion-trigger .badge.gray, .privacy-settings-accordion-trigger .badge.gray { border: 1px solid #c3c4c7 } .health-check-accordion-trigger[aria-expanded=true] .icon, .privacy-settings-accordion-trigger[aria-expanded=true] .icon, .privacy-settings-view-passed[aria-expanded=true] .icon, .site-health-view-passed[aria-expanded=true] .icon { transform: translateY(-30%) rotate(-135deg) } .health-check-accordion-panel, .privacy-settings-accordion-panel { margin: 0; padding: 1em 1.5em; background: #fff } .health-check-accordion-panel[hidden], .privacy-settings-accordion-panel[hidden] { display: none } .health-check-accordion-panel a .dashicons, .privacy-settings-accordion-panel a .dashicons { text-decoration: none } .privacy-settings-accordion-actions { text-align: right; display: block } .privacy-settings-accordion-actions .success { display: none; color: #008a20; padding-right: 1em; padding-top: 6px } .privacy-settings-accordion-actions .success.visible { display: inline-block } .privacy-settings-accordion-panel.hide-privacy-policy-tutorial .privacy-policy-tutorial, .privacy-settings-accordion-panel.hide-privacy-policy-tutorial .privacy-text-copy, .privacy-settings-accordion-panel.hide-privacy-policy-tutorial .wp-policy-help { display: none } .privacy-settings-accordion-panel strong.privacy-policy-tutorial, .privacy-settings-accordion-panel strong.wp-policy-help { display: block; margin: 0 0 1em } .privacy-text-copy span { pointer-events: none } .privacy-settings-accordion-panel .wp-suggested-text div > :not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.noticep), .privacy-settings-accordion-panel .wp-suggested-text > :not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.noticep), .privacy-settings-accordion-panel div > :not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.noticep), .privacy-settings-accordion-panel > :not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help):not(.privacy-text-copy):not(span.success):not(.noticep) { margin: 0; padding: 1em; border-left: 2px solid #787c82 } @media screen and (max-width: 782px) { .health-check-body, .privacy-settings-body { margin: 0 12px; width: auto } .privacy-settings .notice, .site-health .notice { margin: 5px 10px 15px } .privacy-settings .update-nag, .site-health .update-nag { margin-right: 10px; margin-left: 10px } input#create-page { margin-top: 10px } .wp-core-ui button.privacy-text-copy { white-space: normal; line-height: 1.8 } } @media only screen and (max-width: 1004px) { .health-check-body, .privacy-settings-body { margin: 0 22px; width: auto } } #postcustomstuff thead th { padding: 5px 8px 8px; background-color: #f0f0f1 } #postcustom #postcustomstuff .submit { border: 0 none; float: none; padding: 0 8px 8px } #side-sortables #postcustom #postcustomstuff .submit { margin: 0; padding: 0 } #side-sortables #postcustom #postcustomstuff #the-list textarea { height: 85px } #side-sortables #postcustom #postcustomstuff td.left input, #side-sortables #postcustom #postcustomstuff td.left select, #side-sortables #postcustomstuff #newmetaleft a { margin: 3px 3px 0 } #postcustomstuff table { margin: 0; width: 100%; border: 1px solid #dcdcde; border-spacing: 0; background-color: #f6f7f7 } #postcustomstuff tr { vertical-align: top } #postcustomstuff table input, #postcustomstuff table select, #postcustomstuff table textarea { width: 96%; margin: 8px } #side-sortables #postcustomstuff table input, #side-sortables #postcustomstuff table select, #side-sortables #postcustomstuff table textarea { margin: 3px } #postcustomstuff td.left, #postcustomstuff th.left { width: 38% } #postcustomstuff .submit input { margin: 0; width: auto } #postcustomstuff #newmetaleft a { display: inline-block; margin: 0 8px 8px; text-decoration: none } .no-js #postcustomstuff #enternew { display: none } #post-body-content .compat-attachment-fields { margin-bottom: 20px } .compat-attachment-fields th { padding-top: 5px; padding-right: 10px } #select-featured-image { padding: 4px 0; overflow: hidden } #select-featured-image img { max-width: 100%; height: auto; margin-bottom: 10px } #select-featured-image a { float: left; clear: both } #select-featured-image .remove { display: none; margin-top: 10px } .js #select-featured-image.has-featured-image .remove { display: inline-block } .no-js #select-featured-image .choose { display: none } .post-format-icon::before { display: inline-block; vertical-align: middle; height: 20px; width: 20px; margin-top: -4px; margin-right: 7px; color: #dcdcde; font: normal 20px/1 dashicons; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } a.post-format-icon:hover:before { color: #135e96 } #post-formats-select { line-height: 2 } #post-formats-select .post-format-icon::before { top: 5px } input.post-format { margin-top: 1px } label.post-format-icon { margin-left: 0; padding: 2px 0 } .post-format-icon.post-format-standard::before { content: "\f109" } .post-format-icon.post-format-image::before { content: "\f128" } .post-format-icon.post-format-gallery::before { content: "\f161" } .post-format-icon.post-format-audio::before { content: "\f127" } .post-format-icon.post-format-video::before { content: "\f126" } .post-format-icon.post-format-chat::before { content: "\f125" } .post-format-icon.post-format-status::before { content: "\f130" } .post-format-icon.post-format-aside::before { content: "\f123" } .post-format-icon.post-format-quote::before { content: "\f122" } .post-format-icon.post-format-link::before { content: "\f103" } .category-adder { margin-left: 120px; padding: 4px 0 } .category-adder h4 { margin: 0 0 8px } #side-sortables .category-adder { margin: 0 } .categorydiv div.tabs-panel, .customlinkdiv div.tabs-panel, .posttypediv div.tabs-panel, .taxonomydiv div.tabs-panel, .wp-tab-panel { min-height: 42px; max-height: 200px; overflow: auto; padding: 0 .9em; border: solid 1px #dcdcde; background-color: #fff } div.tabs-panel-active { display: block } div.tabs-panel-inactive { display: none } div.tabs-panel-active:focus { box-shadow: inset 0 0 0 1px #4f94d4, inset 0 0 2px 1px rgba(79, 148, 212, .8); outline: 0 none } #front-page-warning, #front-static-pages ul, .categorydiv ul.categorychecklist ul, .customlinkdiv ul.categorychecklist ul, .inline-editor ul.cat-checklist ul, .posttypediv ul.categorychecklist ul, .taxonomydiv ul.categorychecklist ul, ul.export-filters { margin-left: 18px } ul.categorychecklist li { margin: 0; padding: 0; line-height: 1.69230769; word-wrap: break-word } .categorydiv .tabs-panel, .customlinkdiv .tabs-panel, .posttypediv .tabs-panel, .taxonomydiv .tabs-panel { border-width: 3px; border-style: solid } .form-wrap label { display: block; padding: 2px 0 } .form-field input[type=email], .form-field input[type=number], .form-field input[type=password], .form-field input[type=search], .form-field input[type=tel], .form-field input[type=text], .form-field input[type=url], .form-field textarea { border-style: solid; border-width: 1px; width: 95% } .form-field p, .form-field select { max-width: 95% } .form-wrap p, p.description { margin: 2px 0 5px; color: #646970 } .form-wrap p, p.description, p.help, span.description { font-size: 13px } p.description code { font-style: normal } .form-wrap .form-field { margin: 1em 0; padding: 0 } .col-wrap h2 { margin: 12px 0; font-size: 1.1em } .col-wrap p.submit { margin-top: -10px } .edit-term-notes { margin-top: 2em } #poststuff .tagsdiv .ajaxtag { margin-top: 1em } #poststuff .tagsdiv .howto { margin: 1em 0 6px } .ajaxtag .newtag { position: relative } .tagsdiv .newtag { width: 180px } .tagsdiv .the-tags { display: block; height: 60px; margin: 0 auto; overflow: auto; width: 260px } #post-body-content .tagsdiv .the-tags { margin: 0 5px } p.popular-tags { border: none; line-height: 2em; padding: 8px 12px 12px; text-align: justify } p.popular-tags a { padding: 0 3px } .tagcloud { width: 97%; margin: 0 0 40px; text-align: justify } .tagcloud h2 { margin: 2px 0 12px } #poststuff .inside .the-tagcloud { margin: 5px 0 10px; padding: 8px; border: 1px solid #dcdcde; line-height: 1.2; word-spacing: 3px } .the-tagcloud ul { margin: 0 } .the-tagcloud ul li { display: inline-block } .ac_results { display: none; margin: -1px 0 0; padding: 0; list-style: none; position: absolute; z-index: 10000; border: 1px solid #4f94d4; background-color: #fff } .wp-customizer .ac_results { z-index: 500000 } .ac_results li { margin: 0; padding: 5px 10px; white-space: nowrap; text-align: left } .ac_over .ac_match, .ac_results .ac_over { background-color: #2271b1; color: #fff; cursor: pointer } .ac_match { text-decoration: underline } #addtag .spinner { float: none; vertical-align: top } #edittag { max-width: 800px } .edit-tag-actions { margin-top: 20px } .comment-php .wp-editor-area { height: 200px } .comment-ays td, .comment-ays th { padding: 10px 15px } .comment-ays .comment-content ul { list-style: initial; margin-left: 2em } .comment-ays .comment-content a[href]:after { content: "(" attr(href) ")"; display: inline-block; padding: 0 4px; color: #646970; font-size: 13px; word-break: break-all } .comment-ays .comment-content p.edit-comment { margin-top: 10px } .comment-ays .comment-content p.edit-comment a[href]:after { content: ""; padding: 0 } .comment-ays-submit .button-cancel { margin-left: 1em } .spam-undo-inside, .trash-undo-inside { margin: 1px 8px 1px 0; line-height: 1.23076923 } .spam-undo-inside .avatar, .trash-undo-inside .avatar { height: 20px; width: 20px; margin-right: 8px; vertical-align: middle } .stuffbox .editcomment { clear: none; margin-top: 0 } #namediv.stuffbox .editcomment input { width: 100% } #namediv.stuffbox .editcomment.form-table td { padding: 10px } #comment-status-radio p { margin: 3px 0 5px } #comment-status-radio input { margin: 2px 3px 5px 0; vertical-align: middle } #comment-status-radio label { padding: 5px 0 } table.links-table { width: 100%; border-spacing: 0 } .links-table th { font-weight: 400; text-align: left; vertical-align: top; min-width: 80px; width: 20%; word-wrap: break-word } .links-table td, .links-table th { padding: 5px 0 } .links-table td label { margin-right: 8px } .links-table td input[type=text], .links-table td textarea { width: 100% } .links-table #link_rel { max-width: 280px } #qt_content_dfw { display: none } .wp-editor-expand #qt_content_dfw { display: inline-block } .focus-on #screen-meta, .focus-on #screen-meta-links, .focus-on #wp-toolbar, .focus-on #wpfooter, .focus-on .page-title-action, .focus-on .postbox-container > *, .focus-on .update-nag, .focus-on .wrap > h1, .focus-on div.error, .focus-on div.notice, .focus-on div.updated { opacity: 0; transition-duration: .6s; transition-property: opacity; transition-timing-function: ease-in-out } .focus-on #wp-toolbar { opacity: .3 } .focus-off #screen-meta, .focus-off #screen-meta-links, .focus-off #wp-toolbar, .focus-off #wpfooter, .focus-off .page-title-action, .focus-off .postbox-container > *, .focus-off .update-nag, .focus-off .wrap > h1, .focus-off div.error, .focus-off div.notice, .focus-off div.updated { opacity: 1; transition-duration: .2s; transition-property: opacity; transition-timing-function: ease-in-out } .focus-off #wp-toolbar { -webkit-transform: translate(0, 0) } .focus-on #adminmenuback, .focus-on #adminmenuwrap { transition-duration: .6s; transition-property: transform; transition-timing-function: ease-in-out } .focus-on #adminmenuback, .focus-on #adminmenuwrap { transform: translateX(-100%) } .focus-off #adminmenuback, .focus-off #adminmenuwrap { transform: translateX(0); transition-duration: .2s; transition-property: transform; transition-timing-function: ease-in-out } @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { #content-resize-handle, #post-body .wp_themeSkin .mceStatusbar a.mceResize { background: transparent url(images/resize-2x.gif) no-repeat scroll right bottom; background-size: 11px 11px } .rtl #content-resize-handle, .rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize { background-image: url(images/resize-rtl-2x.gif); background-position: left bottom } } @media only screen and (max-width: 1200px) { .post-type-attachment #poststuff { min-width: 0 } .post-type-attachment #wpbody-content #poststuff #post-body { margin: 0 } .post-type-attachment #wpbody-content #post-body.columns-2 #postbox-container-1 { margin-right: 0; width: 100% } .post-type-attachment #poststuff #postbox-container-1 #side-sortables:empty, .post-type-attachment #poststuff #postbox-container-1 .empty-container { outline: 0; height: 0; min-height: 0 } .post-type-attachment #poststuff #post-body.columns-2 #side-sortables { min-height: 0; width: auto } .is-dragging-metaboxes.post-type-attachment #post-body .meta-box-sortables { outline: 0; min-height: 0; margin-bottom: 0 } .post-type-attachment .columns-prefs, .post-type-attachment .screen-layout { display: none } } @media only screen and (max-width: 850px) { #poststuff { min-width: 0 } #wpbody-content #poststuff #post-body { margin: 0 } #wpbody-content #post-body.columns-2 #postbox-container-1 { margin-right: 0; width: 100% } #poststuff #postbox-container-1 #side-sortables:empty, #poststuff #postbox-container-1 .empty-container { height: 0; min-height: 0 } #poststuff #post-body.columns-2 #side-sortables { min-height: 0; width: auto } .is-dragging-metaboxes #poststuff #post-body.columns-2 #side-sortables, .is-dragging-metaboxes #poststuff #post-body.columns-2 .meta-box-sortables, .is-dragging-metaboxes #poststuff #postbox-container-1 #side-sortables:empty, .is-dragging-metaboxes #poststuff #postbox-container-1 .empty-container { height: auto; min-height: 60px } .columns-prefs, .screen-layout { display: none } } @media screen and (max-width: 782px) { .wp-core-ui .edit-tag-actions .button-primary { margin-bottom: 0 } #post-body-content { min-width: 0 } #titlediv #title-prompt-text { padding: 10px } #poststuff .stuffbox .inside { padding: 0 2px 4px 0 } #poststuff .stuffbox > h3, #poststuff h2, #poststuff h3.hndle { padding: 12px } #namediv.stuffbox .editcomment.form-table td { padding: 5px 10px } .post-format-options { padding-right: 0 } .post-format-options a { margin-right: 5px; margin-bottom: 5px; min-width: 52px } .post-format-options .post-format-title { font-size: 11px } .post-format-options a div { height: 28px; width: 28px } .post-format-options a div:before { font-size: 26px !important } #post-visibility-select { line-height: 280% } .wp-core-ui .save-post-visibility, .wp-core-ui .save-timestamp { vertical-align: middle; margin-right: 15px } .timestamp-wrap select#mm { display: block; width: 100%; margin-bottom: 10px } .timestamp-wrap #aa, .timestamp-wrap #hh, .timestamp-wrap #jj, .timestamp-wrap #mn { padding: 12px 3px; font-size: 14px; margin-bottom: 5px; width: auto; text-align: center } ul.category-tabs { margin: 30px 0 15px } ul.category-tabs li.tabs { padding: 15px } ul.categorychecklist li { margin-bottom: 15px } ul.categorychecklist ul { margin-top: 15px } .category-add input[type=text], .category-add select { max-width: none; margin-bottom: 15px } .tagsdiv .newtag { width: 100%; height: auto; margin-bottom: 15px } .tagchecklist { margin: 25px 10px } .tagchecklist > li { font-size: 16px; line-height: 1.4 } #commentstatusdiv p { line-height: 2.8 } .mceToolbar * { white-space: normal !important } .mceToolbar td, .mceToolbar tr { float: left !important } .wp_themeSkin a.mceButton { width: 30px; height: 30px } .wp_themeSkin .mceButton .mceIcon { margin-top: 5px; margin-left: 5px } .wp_themeSkin .mceSplitButton { margin-top: 1px } .wp_themeSkin .mceSplitButton td a.mceAction { padding: 6px 3px 6px 6px } .wp_themeSkin .mceSplitButton td a.mceOpen, .wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen { padding-top: 6px; padding-bottom: 6px; background-position: 1px 6px } .wp_themeSkin table.mceListBox { margin: 5px } div.quicktags-toolbar input { padding: 10px 20px } button.wp-switch-editor { font-size: 16px; line-height: 1; margin: 7px 0 0 7px; padding: 8px 12px } #wp-content-media-buttons a { font-size: 14px; padding: 6px 10px } .wp-media-buttons span.jetpack-contact-form-icon, .wp-media-buttons span.wp-media-buttons-icon { width: 22px !important; margin-left: -2px !important } .wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before, .wp-media-buttons .add_media span.wp-media-buttons-icon:before { font-size: 20px !important } #content_wp_fullscreen { display: none } .misc-pub-section { padding: 20px 10px } .misc-pub-section > a { float: right; font-size: 16px } #delete-action, #publishing-action { line-height: 3.61538461 } #publishing-action .spinner { float: none; margin-top: -2px } .comment-ays td, .comment-ays th { padding-bottom: 0 } .comment-ays td { padding-top: 6px } .links-table #link_rel { max-width: none } .links-table td, .links-table th { padding: 10px 0 } .edit-term-notes { display: none } .privacy-text-box { width: auto } .privacy-text-box-toc { float: none; width: auto; height: 100%; display: flex; flex-direction: column } .privacy-text-section .return-to-top { margin: 2em 0 0 } } /*! This file is auto-generated */ .revisions-control-frame, .revisions-diff-frame { position: relative } .revisions-diff-frame { top: 10px } .revisions-controls { padding-top: 40px; z-index: 1 } .revisions-controls input[type=checkbox] { position: relative; top: -1px; vertical-align: text-bottom } .revisions.pinned .revisions-controls { position: fixed; top: 0; height: 82px; background: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, .1) } .revisions-tickmarks { position: relative; margin: 0 auto; height: .7em; top: 7px; max-width: 70%; box-sizing: border-box; background-color: #fff } .revisions-tickmarks > div { position: absolute; height: 100%; border-left: 1px solid #a7aaad; box-sizing: border-box } .revisions-tickmarks > div:first-child { border-width: 0 } .comparing-two-revisions .revisions-controls { height: 140px } .comparing-two-revisions.pinned .revisions-controls { height: 124px } .revisions .diff-error { position: absolute; text-align: center; margin: 0 auto; width: 100%; display: none } .revisions.diff-error .diff-error { display: block } .revisions .loading-indicator { position: absolute; vertical-align: middle; opacity: 0; width: 100%; width: calc(100% - 30px); top: 50%; top: calc(50% - 10px); transition: opacity .5s } body.folded .revisions .loading-indicator { margin-left: -32px } .revisions .loading-indicator span.spinner { display: block; margin: 0 auto; float: none } .revisions.loading .loading-indicator { opacity: 1 } .revisions .diff { transition: opacity .5s } .revisions.loading .diff { opacity: .5 } .revisions.diff-error .diff { visibility: hidden } .revisions-meta { margin-top: 20px; background-color: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, .1); overflow: hidden } .revisions.pinned .revisions-meta { box-shadow: none } .revision-toggle-compare-mode { position: absolute; top: 0; right: 0 } .comparing-two-revisions .revisions-next, .comparing-two-revisions .revisions-previous, .revisions-meta .diff-meta-to strong { display: none } .revisions-controls .author-card .date { color: #646970 } .revisions-controls .author-card.autosave { color: #d63638 } .revisions-controls .author-card .author-name { font-weight: 600 } .comparing-two-revisions .diff-meta-to strong { display: block } .revisions.pinned .revisions-buttons { padding: 0 11px } .revisions-next, .revisions-previous { position: relative; z-index: 1 } .revisions-previous { float: left } .revisions-next { float: right } .revisions-controls .wp-slider { max-width: 70%; margin: 0 auto; top: -3px } .revisions-diff { padding: 15px; background-color: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, .1) } .revisions-diff h3:first-child { margin-top: 0 } #revisions-meta-restored img, .post-revisions li img { vertical-align: middle } table.diff { table-layout: fixed; width: 100%; white-space: pre-wrap } table.diff col.content { width: auto } table.diff col.content.diffsplit { width: 48% } table.diff col.diffsplit.middle { width: auto } table.diff col.ltype { width: 30px } table.diff tr { background-color: transparent } table.diff td, table.diff th { font-family: Consolas, Monaco, monospace; font-size: 14px; line-height: 1.57142857; padding: .5em .5em .5em 2em; vertical-align: top; word-wrap: break-word } table.diff td h1, table.diff td h2, table.diff td h3, table.diff td h4, table.diff td h5, table.diff td h6 { margin: 0 } table.diff .diff-addedline ins, table.diff .diff-deletedline del { text-decoration: none } table.diff .diff-deletedline { position: relative; background-color: #fcf0f1 } table.diff .diff-deletedline del { background-color: #ffabaf } table.diff .diff-addedline { position: relative; background-color: #edfaef } table.diff .diff-addedline .dashicons, table.diff .diff-deletedline .dashicons { position: absolute; top: .85714286em; left: .5em; width: 1em; height: 1em; font-size: 1em; line-height: 1 } table.diff .diff-addedline .dashicons { top: .92857143em } table.diff .diff-addedline ins { background-color: #68de7c } .diff-meta { padding: 5px; clear: both; min-height: 32px } .diff-title strong { line-height: 2.46153846; min-width: 60px; text-align: right; float: left; margin-right: 5px } .revisions-controls .author-card .author-info { font-size: 12px; line-height: 1.33333333 } .revisions-controls .author-card .author-info, .revisions-controls .author-card .avatar { float: left; margin-left: 6px; margin-right: 6px } .revisions-controls .author-card .byline { display: block; font-size: 12px } .revisions-controls .author-card .avatar { vertical-align: middle } .diff-meta input.restore-revision { float: right; margin-left: 6px; margin-right: 6px; margin-top: 2px } .diff-meta-from { display: none } .comparing-two-revisions .diff-meta-from { display: block } .revisions-tooltip { position: absolute; bottom: 105px; margin-right: 0; margin-left: -69px; z-index: 0; max-width: 350px; min-width: 130px; padding: 8px 4px; display: none; opacity: 0 } .revisions-tooltip.flipped { margin-left: 0; margin-right: -70px } .revisions.pinned .revisions-tooltip { display: none !important } .comparing-two-revisions .revisions-tooltip { bottom: 145px } .revisions-tooltip-arrow { width: 70px; height: 15px; overflow: hidden; position: absolute; left: 0; margin-left: 35px; bottom: -15px } .revisions-tooltip.flipped .revisions-tooltip-arrow { margin-left: 0; margin-right: 35px; left: auto; right: 0 } .revisions-tooltip-arrow > span { content: ""; position: absolute; left: 20px; top: -20px; width: 25px; height: 25px; transform: rotate(45deg) } .revisions-tooltip.flipped .revisions-tooltip-arrow > span { left: auto; right: 20px } .revisions-tooltip, .revisions-tooltip-arrow > span { border: 1px solid #dcdcde; background-color: #fff } .revisions-tooltip { display: none } .arrow { width: 70px; height: 16px; overflow: hidden; position: absolute; left: 0; margin-left: -35px; bottom: 90px; z-index: 10000 } .arrow:after { z-index: 9999; background-color: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, .1) } .arrow.top { top: -16px; bottom: auto } .arrow.left { left: 20% } .arrow:after { content: ""; position: absolute; left: 20px; top: -20px; width: 25px; height: 25px; transform: rotate(45deg) } .revisions-tooltip, .revisions-tooltip-arrow:after { border-width: 1px; border-style: solid } div.revisions-controls > .wp-slider > .ui-slider-handle { margin-left: -10px } .rtl div.revisions-controls > .wp-slider > .ui-slider-handle { margin-right: -10px } .wp-slider.ui-slider { position: relative; border: 1px solid #dcdcde; text-align: left; cursor: pointer } .wp-slider .ui-slider-handle { border-radius: 50%; height: 18px; margin-top: -5px; outline: 0; padding: 2px; position: absolute; width: 18px; z-index: 2; touch-action: none } .wp-slider .ui-slider-handle, .wp-slider .ui-slider-handle.focus { background: #f6f7f7; border: 1px solid #c3c4c7; box-shadow: 0 1px 0 #c3c4c7 } .wp-slider .ui-slider-handle.ui-state-hover, .wp-slider .ui-slider-handle:hover { background: #f6f7f7; border-color: #8c8f94 } .wp-slider .ui-slider-handle.ui-state-active, .wp-slider .ui-slider-handle:active { background: #f0f0f1; border-color: #8c8f94; box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .5); transform: translateY(1px) } .wp-slider .ui-slider-handle:before { background: 0 0; position: absolute; top: 2px; left: 2px; color: #50575e; content: "\f229"; font: normal 18px/1 dashicons; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .wp-slider .ui-slider-handle.ui-state-hover:before, .wp-slider .ui-slider-handle:hover:before { color: #1d2327 } .wp-slider .ui-slider-handle.from-handle:before, .wp-slider .ui-slider-handle.to-handle:before { font-size: 20px !important; margin: -1px 0 0 -1px } .wp-slider .ui-slider-handle.from-handle:before { content: "\f139" } .wp-slider .ui-slider-handle.to-handle:before { content: "\f141" } .rtl .wp-slider .ui-slider-handle.from-handle:before { content: "\f141" } .rtl .wp-slider .ui-slider-handle.to-handle:before { content: "\f139"; right: -1px } .wp-slider .ui-slider-range { position: absolute; font-size: .7em; display: block; border: 0; background-color: transparent; background-image: none } .wp-slider.ui-slider-horizontal { height: .7em } .wp-slider.ui-slider-horizontal .ui-slider-handle { top: -.25em; margin-left: -.6em } .wp-slider.ui-slider-horizontal .ui-slider-range { top: 0; height: 100% } .wp-slider.ui-slider-horizontal .ui-slider-range-min { left: 0 } .wp-slider.ui-slider-horizontal .ui-slider-range-max { right: 0 } @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { .revision-tick.completed-false { background-image: url(images/spinner-2x.gif) } } @media screen and (max-width: 782px) { #diff-next-revision, #diff-previous-revision { margin-top: -1em } .revisions-buttons { overflow: hidden; margin-bottom: 15px } .comparing-two-revisions .revisions-controls, .revisions-controls { height: 170px } .revisions-tooltip { bottom: 130px; z-index: 2 } .diff-meta { overflow: hidden } table.diff { -ms-word-break: break-all; word-break: break-all; word-wrap: break-word } .diff-meta input.restore-revision { margin-top: 0 } } /*! This file is auto-generated */ .media-item .describe { border-collapse: collapse; width: 100%; border-top: 1px solid #dcdcde; clear: both; cursor: default } .media-item.media-blank .describe { border: 0 } .media-item .describe th { vertical-align: top; text-align: left; padding: 5px 10px 10px; width: 140px } .media-item .describe .align th { padding-top: 0 } .media-item .media-item-info tr { background-color: transparent } .media-item .describe td { padding: 0 8px 8px 0; vertical-align: top } .media-item thead.media-item-info td { padding: 4px 10px 0 } .media-item .media-item-info .A1B1 { padding: 0 0 0 10px } .media-item td.savesend { padding-bottom: 15px } .media-item .thumbnail { max-height: 128px; max-width: 128px } .media-list-subtitle { display: block } .media-list-title { display: block } #wpbody-content #async-upload-wrap a { display: none } .media-upload-form { margin-top: 20px } .media-upload-form td label { margin-right: 6px; margin-left: 2px } .media-upload-form .align .field label { display: inline; padding: 0 0 0 23px; margin: 0 1em 0 3px; font-weight: 600 } .media-upload-form tr.image-size label { margin: 0 0 0 5px; font-weight: 600 } .media-upload-form th.label label { font-weight: 600; margin: .5em; font-size: 13px } .media-upload-form th.label label span { padding: 0 5px } .media-item .describe input[type=text], .media-item .describe textarea { width: 460px } .media-item .describe p.help { margin: 0; padding: 0 0 0 5px } .describe-toggle-off, .describe-toggle-on { display: block; line-height: 2.76923076; float: right; margin-right: 10px } .media-item-wrapper { display: grid; grid-template-columns:1fr 1fr } .media-item .attachment-tools { display: flex; justify-content: flex-end; align-items: center } .media-item .edit-attachment { padding: 14px 0; display: block; margin-right: 10px } .media-item .edit-attachment.copy-to-clipboard-container { margin-top: 0 } .media-item-copy-container .success { line-height: 0 } .media-item button .copy-attachment-url { margin-top: 14px } .media-item .copy-to-clipboard-container { margin-top: 7px } .media-item .describe-toggle-off, .media-item.open .describe-toggle-on { display: none } .media-item.open .describe-toggle-off { display: block } .media-upload-form .media-item { min-height: 70px; margin-bottom: 1px; position: relative; width: 100%; background: #fff } .media-upload-form .media-item, .media-upload-form .media-item .error { box-shadow: 0 1px 0 #dcdcde } #media-items:empty { border: 0 none } .media-item .filename { padding: 14px 0; overflow: hidden; margin-left: 6px } .media-item .pinkynail { float: left; margin: 0 10px 0 0; max-height: 70px; max-width: 70px } .media-item .startclosed, .media-item .startopen { display: none } .media-item .original { position: relative; height: 34px } .media-item .progress { float: right; height: 22px; margin: 7px 6px; width: 200px; line-height: 2em; padding: 0; overflow: hidden; border-radius: 22px; background: #dcdcde; box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1) } .media-item .bar { z-index: 9; width: 0; height: 100%; margin-top: -22px; border-radius: 22px; background-color: #2271b1; box-shadow: inset 0 0 2px rgba(0, 0, 0, .3) } .media-item .progress .percent { z-index: 10; position: relative; width: 200px; padding: 0; color: #fff; text-align: center; line-height: 22px; font-weight: 400; text-shadow: 0 1px 2px rgba(0, 0, 0, .2) } .upload-php .fixed .column-parent { width: 15% } .js .html-uploader #plupload-upload-ui { display: none } .js .html-uploader #html-upload-ui { display: block } #html-upload-ui #async-upload { font-size: 1em } .media-upload-form .media-item .error, .media-upload-form .media-item.error { width: auto; margin: 0 0 1px } .media-upload-form .media-item .error { padding: 10px 0 10px 14px; min-height: 50px } .media-item .error-div button.dismiss { float: right; margin: 0 10px 0 15px } .find-box { background-color: #fff; box-shadow: 0 3px 6px rgba(0, 0, 0, .3); width: 600px; overflow: hidden; margin-left: -300px; position: fixed; top: 30px; bottom: 30px; left: 50%; z-index: 100105 } .find-box-head { background: #fff; border-bottom: 1px solid #dcdcde; height: 36px; font-size: 18px; font-weight: 600; line-height: 2; padding: 0 36px 0 16px; position: absolute; top: 0; left: 0; right: 0 } .find-box-inside { overflow: auto; padding: 16px; background-color: #fff; position: absolute; top: 37px; bottom: 45px; overflow-y: scroll; width: 100%; box-sizing: border-box } .find-box-search { padding-bottom: 16px } .find-box-search .spinner { float: none; left: 105px; position: absolute } #find-posts-response, .find-box-search { position: relative } #find-posts-input, #find-posts-search { float: left } #find-posts-input { width: 140px; height: 28px; margin: 0 4px 0 0 } .widefat .found-radio { padding-right: 0; width: 16px } #find-posts-close { width: 36px; height: 36px; border: none; padding: 0; position: absolute; top: 0; right: 0; cursor: pointer; text-align: center; background: 0 0; color: #646970 } #find-posts-close:focus, #find-posts-close:hover { color: #135e96 } #find-posts-close:focus { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8); outline: 2px solid transparent; outline-offset: -2px } #find-posts-close:before { font: normal 20px/36px dashicons; vertical-align: top; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f158" } .find-box-buttons { padding: 8px 16px; background: #fff; border-top: 1px solid #dcdcde; position: absolute; bottom: 0; left: 0; right: 0 } @media screen and (max-width: 782px) { .find-box-inside { bottom: 57px } } @media screen and (max-width: 660px) { .find-box { top: 0; bottom: 0; left: 0; right: 0; margin: 0; width: 100% } } .ui-find-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: #000; opacity: .7; z-index: 100100 } .drag-drop #drag-drop-area { border: 4px dashed #c3c4c7; height: 200px } .drag-drop .drag-drop-inside { margin: 60px auto 0; width: 250px } .drag-drop-inside p { font-size: 14px; margin: 5px 0; display: none } .drag-drop .drag-drop-inside p { text-align: center } .drag-drop-inside p.drag-drop-info { font-size: 20px } .drag-drop .drag-drop-inside p, .drag-drop-inside p.drag-drop-buttons { display: block } .drag-drop.drag-over #drag-drop-area { border-color: #9ec2e6 } #plupload-upload-ui { position: relative } .media-frame.mode-grid, .media-frame.mode-grid .attachments-browser.has-load-more .attachments-wrapper, .media-frame.mode-grid .attachments-browser:not(.has-load-more) .attachments, .media-frame.mode-grid .media-frame-content, .media-frame.mode-grid .uploader-inline-content { position: static } .media-frame.mode-grid .media-frame-menu, .media-frame.mode-grid .media-frame-router, .media-frame.mode-grid .media-frame-title { display: none } .media-frame.mode-grid .media-frame-content { background-color: transparent; border: none } .upload-php .mode-grid .media-sidebar { position: relative; width: auto; margin-top: 12px; padding: 0 16px; border-left: 4px solid #d63638; box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1); background-color: #fff } .upload-php .mode-grid .hide-sidebar .media-sidebar { display: none } .upload-php .mode-grid .media-sidebar .media-uploader-status { border-bottom: none; padding-bottom: 0; max-width: 100% } .upload-php .mode-grid .media-sidebar .upload-error { margin: 12px 0; padding: 4px 0 0; border: none; box-shadow: none; background: 0 0 } .upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2 { display: none } .media-frame.mode-grid .uploader-inline { position: relative; top: auto; right: auto; left: auto; bottom: auto; padding-top: 0; margin-top: 20px; border: 4px dashed #c3c4c7 } .media-frame.mode-select .attachments-browser.fixed:not(.has-load-more) .attachments, .media-frame.mode-select .attachments-browser.has-load-more.fixed .attachments-wrapper { position: relative; top: 94px; padding-bottom: 94px } .media-frame.mode-grid .attachment.details:focus, .media-frame.mode-grid .attachment:focus, .media-frame.mode-grid .selected.attachment:focus { box-shadow: inset 0 0 2px 3px #f0f0f1, inset 0 0 0 7px #4f94d4; outline: 2px solid transparent; outline-offset: -6px } .media-frame.mode-grid .selected.attachment { box-shadow: inset 0 0 0 5px #f0f0f1, inset 0 0 0 7px #c3c4c7 } .media-frame.mode-grid .attachment.details { box-shadow: inset 0 0 0 3px #f0f0f1, inset 0 0 0 7px #4f94d4 } .media-frame.mode-grid.mode-select .attachment .thumbnail { opacity: .65 } .media-frame.mode-select .attachment.selected .thumbnail { opacity: 1 } .media-frame.mode-grid .media-toolbar { margin-bottom: 15px; height: auto } .media-frame.mode-grid .media-toolbar select { margin: 0 10px 0 0 } .media-frame.mode-grid.mode-edit .media-toolbar-secondary > .select-mode-toggle-button { margin: 0 8px 0 0; vertical-align: middle } .media-frame.mode-grid .attachments-browser .bulk-select { display: inline-block; margin: 0 10px 0 0 } .media-frame.mode-grid .search { margin-top: 0 } .media-search-input-label { margin: 0 .2em 0 0; vertical-align: baseline } .media-frame.mode-grid .media-search-input-label { position: static; margin: 0 .5em 0 0 } .attachments-browser .media-toolbar-secondary > .media-button { margin-right: 10px } .media-frame.mode-select .attachments-browser.fixed .media-toolbar { position: fixed; top: 32px; left: auto; right: 20px; margin-top: 0 } .media-frame.mode-grid .attachments-browser { padding: 0 } .media-frame.mode-grid .attachments-browser .attachments { padding: 2px } .media-frame.mode-grid .attachments-browser .no-media { color: #646970; font-size: 18px; font-style: normal; margin: 0; padding: 100px 0 0; text-align: center } .edit-attachment-frame { display: block; height: 100%; width: 100% } .edit-attachment-frame .edit-media-header { overflow: hidden } .upload-php .media-modal-close .media-modal-icon:before { content: "\f335"; font-size: 22px } .edit-attachment-frame .edit-media-header .left, .edit-attachment-frame .edit-media-header .right, .upload-php .media-modal-close { cursor: pointer; color: #787c82; background-color: transparent; height: 50px; width: 50px; padding: 0; position: absolute; text-align: center; border: 0; border-left: 1px solid #dcdcde; transition: color .1s ease-in-out, background .1s ease-in-out } .upload-php .media-modal-close { top: 0; right: 0 } .edit-attachment-frame .edit-media-header .left { right: 102px } .edit-attachment-frame .edit-media-header .right { right: 51px } .edit-attachment-frame .media-frame-title { left: 0; right: 150px } .edit-attachment-frame .edit-media-header .left:before, .edit-attachment-frame .edit-media-header .right:before { font: normal 20px/50px dashicons !important; display: inline; font-weight: 300 } .edit-attachment-frame .edit-media-header .left:focus, .edit-attachment-frame .edit-media-header .left:hover, .edit-attachment-frame .edit-media-header .right:focus, .edit-attachment-frame .edit-media-header .right:hover, .upload-php .media-modal-close:focus, .upload-php .media-modal-close:hover { background: #dcdcde; border-color: #c3c4c7; color: #000; outline: 0; box-shadow: none } .edit-attachment-frame .edit-media-header .left:focus, .edit-attachment-frame .edit-media-header .right:focus, .upload-php .media-modal-close:focus { outline: 2px solid transparent; outline-offset: -2px } .upload-php .media-modal-close:focus .media-modal-icon:before, .upload-php .media-modal-close:hover .media-modal-icon:before { color: #000 } .edit-attachment-frame .edit-media-header .left:before { content: "\f341" } .edit-attachment-frame .edit-media-header .right:before { content: "\f345" } .edit-attachment-frame .edit-media-header [disabled], .edit-attachment-frame .edit-media-header [disabled]:hover { color: #c3c4c7; background: inherit; cursor: default } .edit-attachment-frame .media-frame-content, .edit-attachment-frame .media-frame-router { left: 0 } .edit-attachment-frame .media-frame-content { border-bottom: none; bottom: 0; top: 50px } .edit-attachment-frame .attachment-details { position: absolute; overflow: auto; top: 0; bottom: 0; right: 0; left: 0; box-shadow: inset 0 4px 4px -4px rgba(0, 0, 0, .1) } .edit-attachment-frame .attachment-media-view { float: left; width: 65%; height: 100% } .edit-attachment-frame .attachment-media-view .thumbnail { box-sizing: border-box; padding: 16px; height: 100% } .edit-attachment-frame .attachment-media-view .details-image { display: block; margin: 0 auto 16px; max-width: 100%; max-height: 90%; max-height: calc(100% - 42px); background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7); background-position: 0 0, 10px 10px; background-size: 20px 20px } .edit-attachment-frame .attachment-media-view .details-image.icon { background: 0 0 } .edit-attachment-frame .attachment-media-view .attachment-actions { text-align: center } .edit-attachment-frame .wp-media-wrapper { margin-bottom: 12px } .edit-attachment-frame input, .edit-attachment-frame textarea { padding: 6px 8px; line-height: 1.14285714 } .edit-attachment-frame .attachment-info { overflow: auto; box-sizing: border-box; margin-bottom: 0; padding: 12px 16px 0; width: 35%; height: 100%; box-shadow: inset 0 4px 4px -4px rgba(0, 0, 0, .1); border-bottom: 0; border-left: 1px solid #dcdcde; background: #f6f7f7 } .edit-attachment-frame .attachment-info .details, .edit-attachment-frame .attachment-info .settings { position: relative; overflow: hidden; float: none; margin-bottom: 15px; padding-bottom: 15px; border-bottom: 1px solid #dcdcde } .edit-attachment-frame .attachment-info .filename { font-weight: 400; color: #646970 } .edit-attachment-frame .attachment-info .thumbnail { margin-bottom: 12px } .attachment-info .actions { margin-bottom: 16px } .attachment-info .actions a { display: inline; text-decoration: none } .copy-to-clipboard-container { display: flex; align-items: center; margin-top: 8px; clear: both } .copy-to-clipboard-container .copy-attachment-url { white-space: normal } .copy-to-clipboard-container .success { color: #008a20; margin-left: 8px } .wp_attachment_details .attachment-alt-text { margin-bottom: 5px } .wp_attachment_details .attachment-alt-text-description { margin-top: 5px } .wp_attachment_details label[for=content] { font-size: 13px; line-height: 1.5; margin: 1em 0 } .wp_attachment_details #attachment_caption { height: 4em } .describe .image-editor { vertical-align: top } .imgedit-wrap { position: relative; padding-top: 10px } .imgedit-settings fieldset, .imgedit-settings p { margin: 8px 0 } .imgedit-settings legend { margin-bottom: 5px } .describe .imgedit-wrap .imgedit-settings { padding: 0 5px } .wp_attachment_holder div.updated { margin-top: 0 } .wp_attachment_holder .imgedit-wrap > div { height: auto } .wp_attachment_holder .imgedit-wrap .imgedit-panel-content { float: left; padding: 3px 16px 0 0; min-width: 400px; max-width: calc(100% - 266px) } .wp_attachment_holder .imgedit-wrap .imgedit-settings { float: right; width: 250px } .imgedit-settings input { margin-top: 0; vertical-align: middle } .imgedit-wait { position: absolute; top: 0; bottom: 0; width: 100%; background: #fff; opacity: .7; display: none } .imgedit-wait:before { content: ""; display: block; width: 20px; height: 20px; position: absolute; left: 50%; top: 50%; margin: -10px 0 0 -10px; background: transparent url(images/spinner.gif) no-repeat center; background-size: 20px 20px; transform: translateZ(0) } .no-float { float: none } .imgedit-settings .disabled, .media-disabled { color: #a7aaad } .A1B1 { overflow: hidden } .A1B1 .button, .wp_attachment_image .button { float: left } .no-js .wp_attachment_image .button { display: none } .A1B1 .spinner, .wp_attachment_image .spinner { float: left } .imgedit-menu { margin: 0 0 12px } .imgedit-menu .note-no-rotate { clear: both; margin: 0; padding: 1em 0 0 } .image-editor .imgedit-menu .button { display: inline-block; width: auto; min-height: 28px; font-size: 13px; line-height: 2; margin: 0 8px 8px 0; padding: 0 10px } .imgedit-menu .button:before { font: normal 16px/1 dashicons; margin-right: 8px; speak: never; vertical-align: middle; position: relative; top: -2px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .imgedit-menu .button.disabled { color: #a7aaad; border-color: #dcdcde; background: #f6f7f7; box-shadow: none; text-shadow: 0 1px 0 #fff; cursor: default; transform: none } .imgedit-crop:before { content: "\f165" } .imgedit-rleft:before { content: "\f166" } .imgedit-rright:before { content: "\f167" } .imgedit-flipv:before { content: "\f168" } .imgedit-fliph:before { content: "\f169" } .imgedit-undo:before { content: "\f171" } .imgedit-redo:before { content: "\f172" } .imgedit-crop-wrap { position: relative } .imgedit-crop-wrap img { background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7); background-position: 0 0, 10px 10px; background-size: 20px 20px } .imgedit-crop { margin: 0 8px 0 0 } .imgedit-rleft { margin: 0 3px } .imgedit-rright { margin: 0 8px 0 3px } .imgedit-flipv { margin: 0 3px } .imgedit-fliph { margin: 0 8px 0 3px } .imgedit-undo { margin: 0 3px } .imgedit-redo { margin: 0 8px 0 3px } .imgedit-thumbnail-preview { margin: 10px 8px 0 0 } .imgedit-thumbnail-preview-caption { display: block } #poststuff .imgedit-group-top h2 { display: inline-block; margin: 0; padding: 0; font-size: 14px; line-height: 1.4 } #poststuff .imgedit-group-top .button-link { text-decoration: none; color: #1d2327 } .imgedit-applyto .imgedit-label { display: block; padding: .5em 0 0 } .imgedit-help { display: none; padding-bottom: 8px } .imgedit-help.imgedit-restore { padding-bottom: 0 } .image-editor .imgedit-settings .imgedit-help-toggle, .image-editor .imgedit-settings .imgedit-help-toggle:active, .image-editor .imgedit-settings .imgedit-help-toggle:hover { border: 1px solid transparent; margin: -1px 0 0 -1px; padding: 0; background: 0 0; color: #2271b1; font-size: 20px; line-height: 1; cursor: pointer; box-sizing: content-box; box-shadow: none } .image-editor .imgedit-settings .imgedit-help-toggle:focus { color: #2271b1; border-color: #4f94d4; box-shadow: 0 0 3px rgba(34, 113, 177, .8); outline: 2px solid transparent } .form-table td.imgedit-response { padding: 0 } .imgedit-submit { margin: 8px 0 0 } .imgedit-submit-btn { margin-left: 20px } .imgedit-wrap .nowrap { white-space: nowrap; font-size: 12px; line-height: inherit } span.imgedit-scale-warn { color: #d63638; font-size: 20px; font-style: normal; visibility: hidden; vertical-align: middle } .imgedit-save-target { margin: 8px 0 } .imgedit-save-target legend { font-weight: 600 } .imgedit-group { margin-bottom: 8px; padding: 10px } .imgedit-settings .imgedit-original-dimensions { display: inline-block } .imgedit-settings .imgedit-crop-ratio input[type=text], .imgedit-settings .imgedit-crop-sel input[type=text], .imgedit-settings .imgedit-scale input[type=text] { width: 80px; font-size: 14px; padding: 0 8px } .imgedit-separator { display: inline-block; width: 7px; text-align: center; font-size: 13px; color: #3c434a } .imgedit-settings .imgedit-scale-button-wrapper { margin-top: .3077em; display: block } .imgedit-settings .imgedit-scale .button { margin-bottom: 0 } audio, video { display: inline-block; max-width: 100% } .wp-core-ui .mejs-container { width: 100%; max-width: 100% } .wp-core-ui .mejs-container * { box-sizing: border-box } .wp-core-ui .mejs-time { box-sizing: content-box } @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { .imgedit-wait:before { background-image: url(images/spinner-2x.gif) } } @media screen and (max-width: 782px) { .wp_attachment_details label[for=content] { font-size: 14px; line-height: 1.5 } .media-upload-form .media-item .error, .media-upload-form .media-item.error { font-size: 13px; line-height: 1.5 } .media-upload-form .media-item.error { padding: 1px 10px } .media-upload-form .media-item .error { padding: 10px 0 10px 12px } .imgedit-settings .imgedit-crop-ratio input[type=text], .imgedit-settings .imgedit-crop-sel input[type=text], .imgedit-settings .imgedit-scale input[type=text] { font-size: 16px; padding: 6px 10px } .wp_attachment_holder .imgedit-wrap .imgedit-panel-content, .wp_attachment_holder .imgedit-wrap .imgedit-settings { float: none; width: auto; max-width: none; padding-bottom: 16px } .copy-to-clipboard-container .success { font-size: 14px } } @media only screen and (max-width: 600px) { .media-item-wrapper { grid-template-columns:1fr } } @media only screen and (max-width: 1120px) { #wp-media-grid .wp-filter .attachment-filters { max-width: 100% } } @media only screen and (max-width: 782px) { .media-frame.mode-select .attachments-browser.fixed .media-toolbar { top: 46px; right: 10px } } @media only screen and (max-width: 600px) { .media-frame.mode-select .attachments-browser.fixed .media-toolbar { top: 0 } } @media only screen and (max-width: 480px) { .edit-attachment-frame .media-frame-title { right: 110px } .edit-attachment-frame .edit-media-header .left, .edit-attachment-frame .edit-media-header .right, .upload-php .media-modal-close { width: 40px; height: 40px } .edit-attachment-frame .edit-media-header .left:before, .edit-attachment-frame .edit-media-header .right:before { line-height: 40px !important } .edit-attachment-frame .edit-media-header .left { right: 82px } .edit-attachment-frame .edit-media-header .right { right: 41px } .edit-attachment-frame .media-frame-content { top: 40px } .edit-attachment-frame .attachment-media-view { float: none; height: auto; width: 100% } .edit-attachment-frame .attachment-info { height: auto; width: 100% } } @media only screen and (max-width: 640px), screen and (max-height: 400px) { .upload-php .mode-grid .media-sidebar { max-width: 100% } } /*! This file is auto-generated */ .themes-php { overflow-y: scroll } body.js .theme-browser.search-loading { display: none } .theme-browser .themes { clear: both } .themes-php:not(.network-admin) .wrap h1 { margin-bottom: 15px } .themes-php .wrap h1 .button { margin-left: 20px } .themes-php .search-form { display: inline } .themes-php .wp-filter-search { position: relative; top: -2px; left: 20px; margin: 0; width: 280px } .theme .notice, .theme .notice.is-dismissible { left: 0; margin: 0; position: absolute; right: 0; top: 0 } .theme-browser .theme { cursor: pointer; float: left; margin: 0 4% 4% 0; position: relative; width: 30.6%; border: 1px solid #dcdcde; box-shadow: 0 1px 1px -1px rgba(0, 0, 0, .1); box-sizing: border-box } .theme-browser .theme:nth-child(3n) { margin-right: 0 } .theme-browser .theme.focus, .theme-browser .theme:hover { cursor: pointer } .theme-browser .theme .theme-name { font-size: 15px; font-weight: 600; height: 18px; margin: 0; padding: 15px; box-shadow: inset 0 1px 0 rgba(0, 0, 0, .1); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; background: #fff; background: rgba(255, 255, 255, .65) } .theme-browser .theme .theme-actions { opacity: 0; transition: opacity .1s ease-in-out; height: auto; background: rgba(246, 247, 247, .7); border-left: 1px solid rgba(0, 0, 0, .05) } .theme-browser .theme.focus .theme-actions, .theme-browser .theme:hover .theme-actions { opacity: 1 } .theme-browser .theme .theme-actions .button-primary { margin-right: 3px } .theme-browser .theme .theme-actions .button { float: none; margin-left: 3px } .theme-browser .theme .theme-screenshot { display: block; overflow: hidden; position: relative; -webkit-backface-visibility: hidden; transition: opacity .2s ease-in-out } .theme-browser .theme .theme-screenshot:after { content: ""; display: block; padding-top: 66.66666% } .theme-browser .theme .theme-screenshot img { height: auto; position: absolute; left: 0; top: 0; width: 100%; transition: opacity .2s ease-in-out } .theme-browser .theme.focus .theme-screenshot, .theme-browser .theme:hover .theme-screenshot { background: #fff } .theme-browser.rendered .theme.focus .theme-screenshot img, .theme-browser.rendered .theme:hover .theme-screenshot img { opacity: .4 } .theme-browser .theme .more-details { opacity: 0; position: absolute; top: 35%; right: 20%; left: 20%; width: 60%; background: #1d2327; background: rgba(0, 0, 0, .7); color: #fff; font-size: 15px; text-shadow: 0 1px 0 rgba(0, 0, 0, .6); -webkit-font-smoothing: antialiased; font-weight: 600; padding: 15px 12px; text-align: center; border-radius: 3px; border: none; transition: opacity .1s ease-in-out } .theme-browser .theme .more-details:focus { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #2271b1 } .theme-browser .theme.focus { border-color: #4f94d4; box-shadow: 0 0 2px rgba(79, 148, 212, .8) } .theme-browser .theme.focus .more-details { opacity: 1 } .theme-browser .theme.active.focus .theme-actions { display: block } .theme-browser.rendered .theme.focus .more-details, .theme-browser.rendered .theme:hover .more-details { opacity: 1 } .theme-browser .theme.active .theme-name { background: #1d2327; color: #fff; padding-right: 110px; font-weight: 300; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .5) } .theme-browser .customize-control .theme.active .theme-name { padding-right: 15px } .theme-browser .theme.active .theme-name span { font-weight: 600 } .theme-browser .theme.active .theme-actions { background: rgba(44, 51, 56, .7); border-left: none; opacity: 1 } .theme-id-container { position: relative } .theme-browser .theme .theme-actions, .theme-browser .theme.active .theme-actions { position: absolute; top: 50%; transform: translateY(-50%); right: 0; padding: 9px 15px; box-shadow: inset 0 1px 0 rgba(0, 0, 0, .1) } .theme-browser .theme.active .theme-actions .button-primary { margin-right: 0 } .theme-browser .theme .theme-author { background: #1d2327; color: #f0f0f1; display: none; font-size: 14px; margin: 0 10px; padding: 5px 10px; position: absolute; bottom: 56px } .theme-browser .theme.display-author .theme-author { display: block } .theme-browser .theme.display-author .theme-author a { color: inherit } .theme-browser .theme.add-new-theme { border: none; box-shadow: none } .theme-browser .theme.add-new-theme a { text-decoration: none; display: block; position: relative; z-index: 1 } .theme-browser .theme.add-new-theme a:after { display: block; content: ""; background: 0 0; background: rgba(0, 0, 0, 0); position: absolute; top: 0; left: 0; right: 0; bottom: 0; padding: 0; text-shadow: none; border: 5px dashed #dcdcde; border: 5px dashed rgba(0, 0, 0, .1); box-sizing: border-box } .theme-browser .theme.add-new-theme span:after { background: #dcdcde; background: rgba(140, 143, 148, .1); border-radius: 50%; display: inline-block; content: "\f132"; -webkit-font-smoothing: antialiased; font: normal 74px/115px dashicons; width: 100px; height: 100px; vertical-align: middle; text-align: center; color: #8c8f94; position: absolute; top: 30%; left: 50%; margin-left: -50px; text-indent: -4px; padding: 0; text-shadow: none; z-index: 4 } .rtl .theme-browser .theme.add-new-theme span:after { text-indent: 4px } .theme-browser .theme.add-new-theme a:focus .theme-screenshot, .theme-browser .theme.add-new-theme a:hover .theme-screenshot { background: 0 0 } .theme-browser .theme.add-new-theme a:focus span:after, .theme-browser .theme.add-new-theme a:hover span:after { background: #fff; color: #2271b1 } .theme-browser .theme.add-new-theme a:focus:after, .theme-browser .theme.add-new-theme a:hover:after { border-color: transparent; color: #fff; background: #2271b1; content: "" } .theme-browser .theme.add-new-theme .theme-name { background: 0 0; text-align: center; box-shadow: none; font-weight: 400; position: relative; top: 0; margin-top: -18px; padding-top: 0; padding-bottom: 48px } .theme-browser .theme.add-new-theme a:focus .theme-name, .theme-browser .theme.add-new-theme a:hover .theme-name { color: #fff; z-index: 2 } .theme-overlay .theme-backdrop { position: absolute; left: -20px; right: 0; top: 0; bottom: 0; background: #f0f0f1; background: rgba(240, 240, 241, .9); z-index: 10000 } .theme-overlay .theme-header { position: absolute; top: 0; left: 0; right: 0; height: 48px; border-bottom: 1px solid #dcdcde } .theme-overlay .theme-header button { padding: 0 } .theme-overlay .theme-header .close { cursor: pointer; height: 48px; width: 50px; text-align: center; float: right; border: 0; border-left: 1px solid #dcdcde; background-color: transparent; transition: color .1s ease-in-out, background .1s ease-in-out } .theme-overlay .theme-header .close:before { font: normal 22px/50px dashicons !important; color: #787c82; display: inline-block; content: "\f335"; font-weight: 300 } .theme-overlay .theme-header .left, .theme-overlay .theme-header .right { cursor: pointer; color: #787c82; background-color: transparent; height: 48px; width: 54px; float: left; text-align: center; border: 0; border-right: 1px solid #dcdcde; transition: color .1s ease-in-out, background .1s ease-in-out } .theme-overlay .theme-header .close:focus, .theme-overlay .theme-header .close:hover, .theme-overlay .theme-header .left:focus, .theme-overlay .theme-header .left:hover, .theme-overlay .theme-header .right:focus, .theme-overlay .theme-header .right:hover { background: #dcdcde; border-color: #c3c4c7; color: #000 } .theme-overlay .theme-header .close:focus:before, .theme-overlay .theme-header .close:hover:before { color: #000 } .theme-overlay .theme-header .close:focus, .theme-overlay .theme-header .left:focus, .theme-overlay .theme-header .right:focus { box-shadow: none; outline: 0 } .theme-overlay .theme-header .left.disabled, .theme-overlay .theme-header .left.disabled:hover, .theme-overlay .theme-header .right.disabled, .theme-overlay .theme-header .right.disabled:hover { color: #c3c4c7; background: inherit; cursor: inherit } .theme-overlay .theme-header .left:before, .theme-overlay .theme-header .right:before { font: normal 20px/50px dashicons !important; display: inline; font-weight: 300 } .theme-overlay .theme-header .left:before { content: "\f341" } .theme-overlay .theme-header .right:before { content: "\f345" } .theme-overlay .theme-wrap { clear: both; position: fixed; top: 9%; left: 190px; right: 30px; bottom: 3%; background: #fff; box-shadow: 0 1px 20px 5px rgba(0, 0, 0, .1); z-index: 10000; box-sizing: border-box; -webkit-overflow-scrolling: touch } body.folded .theme-browser ~ .theme-overlay .theme-wrap { left: 70px } .theme-overlay .theme-about { position: absolute; top: 49px; bottom: 57px; left: 0; right: 0; overflow: auto; padding: 2% 4% } .theme-overlay .theme-actions { position: absolute; text-align: center; bottom: 0; left: 0; right: 0; padding: 10px 25px 5px; background: #f6f7f7; z-index: 30; box-sizing: border-box; border-top: 1px solid #f0f0f1 } .theme-overlay .theme-actions a { margin-right: 5px; margin-bottom: 5px } .customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-background"], .customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-header"] { display: none } .broken-themes a.delete-theme, .theme-overlay .theme-actions .delete-theme { color: #d63638; text-decoration: none; border-color: transparent; box-shadow: none; background: 0 0 } .theme-overlay .theme-actions .delete-theme { position: absolute; right: 10px; bottom: 5px } .broken-themes a.delete-theme:focus, .broken-themes a.delete-theme:hover, .theme-overlay .theme-actions .delete-theme:focus, .theme-overlay .theme-actions .delete-theme:hover { background: #d63638; color: #fff; border-color: #d63638 } .theme-overlay .theme-actions .active-theme, .theme-overlay.active .theme-actions .inactive-theme { display: none } .theme-overlay .theme-actions .inactive-theme, .theme-overlay.active .theme-actions .active-theme { display: block } .theme-overlay .theme-screenshots { float: left; margin: 0 30px 0 0; width: 55%; max-width: 1200px; text-align: center } .theme-overlay .screenshot { border: 1px solid #fff; box-sizing: border-box; overflow: hidden; position: relative; box-shadow: 0 0 0 1px rgba(0, 0, 0, .2) } .theme-overlay .screenshot:after { content: ""; display: block; padding-top: 75% } .theme-overlay .screenshot img { height: auto; position: absolute; left: 0; top: 0; width: 100% } .theme-overlay.small-screenshot .theme-screenshots { position: absolute; width: 302px } .theme-overlay.small-screenshot .theme-info { margin-left: 350px; width: auto } .theme-overlay .screenshot.thumb { background: #c3c4c7; border: 1px solid #f0f0f1; float: none; display: inline-block; margin: 10px 5px 0; width: 140px; height: 80px; cursor: pointer } .theme-overlay .screenshot.thumb:after { content: ""; display: block; padding-top: 100% } .theme-overlay .screenshot.thumb img { cursor: pointer; height: auto; position: absolute; left: 0; top: 0; width: 100%; height: auto } .theme-overlay .screenshot.selected { background: 0 0; border: 2px solid #72aee6 } .theme-overlay .screenshot.selected img { opacity: .8 } .theme-browser .theme .theme-screenshot.blank, .theme-overlay .screenshot.blank { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=) } .theme-overlay .theme-info { width: 40%; float: left } .theme-overlay .current-label { background: #2c3338; color: #fff; font-size: 11px; display: inline-block; padding: 2px 8px; border-radius: 2px; margin: 0 0 -10px; -webkit-user-select: none; user-select: none } .theme-overlay .theme-name { color: #1d2327; font-size: 32px; font-weight: 100; margin: 10px 0 0; line-height: 1.3; word-wrap: break-word; overflow-wrap: break-word } .theme-overlay .theme-version { color: #646970; font-size: 13px; font-weight: 400; float: none; display: inline-block; margin-left: 10px } .theme-overlay .theme-author { margin: 15px 0 25px; color: #646970; font-size: 16px; font-weight: 400; line-height: inherit } .theme-overlay .toggle-auto-update { display: inline-flex; align-items: center; min-height: 20px; vertical-align: top } .theme-overlay .theme-autoupdate .toggle-auto-update { text-decoration: none } .theme-overlay .theme-autoupdate .toggle-auto-update .label { text-decoration: underline } .theme-overlay .theme-description { color: #50575e; font-size: 15px; font-weight: 400; line-height: 1.5; margin: 30px 0 0 } .theme-overlay .theme-tags { border-top: 3px solid #f0f0f1; color: #646970; font-size: 13px; font-weight: 400; margin: 30px 0 0; padding-top: 20px } .theme-overlay .theme-tags span { color: #3c434a; font-weight: 600; margin-right: 5px } .theme-overlay .parent-theme { background: #fff; border: 1px solid #f0f0f1; border-left: 4px solid #72aee6; font-size: 14px; font-weight: 400; margin-top: 30px; padding: 10px 10px 10px 20px } .theme-overlay .parent-theme strong { font-weight: 600 } .single-theme .theme, .single-theme .theme-overlay .theme-backdrop, .single-theme .theme-overlay .theme-header { display: none } .single-theme .theme-overlay .theme-wrap { clear: both; min-height: 330px; position: relative; left: auto; right: auto; top: auto; bottom: auto; z-index: 10 } .single-theme .theme-overlay .theme-about { padding: 30px 30px 70px; position: static } .single-theme .theme-overlay .theme-actions { position: absolute } @media only screen and (min-width: 2000px) { #wpwrap .theme-browser .theme { width: 17.6%; margin: 0 3% 3% 0 } #wpwrap .theme-browser .theme:nth-child(3n), #wpwrap .theme-browser .theme:nth-child(4n) { margin-right: 3% } #wpwrap .theme-browser .theme:nth-child(5n) { margin-right: 0 } } @media only screen and (min-width: 1680px) { .theme-overlay .theme-wrap { width: 1450px; margin: 0 auto } } @media only screen and (min-width: 1640px) { .theme-browser .theme { width: 22.7%; margin: 0 3% 3% 0 } .theme-browser .theme .theme-screenshot:after { padding-top: 75% } .theme-browser .theme:nth-child(3n) { margin-right: 3% } .theme-browser .theme:nth-child(4n) { margin-right: 0 } } @media only screen and (max-width: 1120px) { .theme-browser .theme { width: 47.5%; margin-right: 0 } .theme-browser .theme:nth-child(even) { margin-right: 0 } .theme-browser .theme:nth-child(odd) { margin-right: 5% } } @media only screen and (max-width: 960px) { .theme-overlay .theme-wrap { left: 65px } } @media only screen and (max-width: 780px) { .theme-overlay .theme-wrap, body.folded .theme-overlay .theme-wrap { top: 0; right: 0; bottom: 0; left: 0; padding: 70px 20px 20px; border: none; z-index: 100000; position: fixed } .theme-browser .theme.active .theme-name span { display: none } .theme-overlay .theme-screenshots { width: 40% } .theme-overlay .theme-info { width: 50% } .single-theme .theme-wrap { padding: 10px } .theme-browser .theme .theme-actions { padding: 5px 10px 4px } .theme-overlay.small-screenshot .theme-screenshots { position: static; float: none; max-width: 302px } .theme-overlay.small-screenshot .theme-info { margin-left: 0; width: auto } .theme.focus .more-details, .theme:hover .more-details, .theme:not(.active):focus .theme-actions, .theme:not(.active):hover .theme-actions { display: none } .theme-browser.rendered .theme.focus .theme-screenshot img, .theme-browser.rendered .theme:hover .theme-screenshot img { opacity: 1 } } @media only screen and (max-width: 480px) { .theme-browser .theme { width: 100%; margin-right: 0 } .theme-browser .theme:nth-child(2n), .theme-browser .theme:nth-child(3n) { margin-right: 0 } .theme-overlay .theme-about { bottom: 105px } .theme-overlay .theme-actions { padding-left: 4%; padding-right: 4% } } @media only screen and (max-width: 650px) { .theme-overlay .theme-description { margin-left: 0 } .theme-overlay .theme-actions .delete-theme { position: relative; right: auto; bottom: auto } .theme-overlay .theme-actions .inactive-theme { display: inline } .theme-overlay .theme-screenshots { width: 100%; float: none } .theme-overlay .theme-info { width: 100% } .theme-overlay .theme-author { margin: 5px 0 15px } .theme-overlay .current-label { margin-top: 10px; font-size: 13px } .themes-php .wp-filter-search { float: none; clear: both; left: 0; right: 0; margin: -5px 0 20px; width: 100%; max-width: 280px } .theme-browser .theme.add-new-theme span:after { font: normal 60px/90px dashicons; width: 80px; height: 80px; top: 30%; left: 50%; text-indent: 0; margin-left: -40px } .single-theme .theme-wrap { margin: 0 -12px 0 -10px; padding: 10px } .single-theme .theme-overlay .theme-about { padding: 10px; overflow: visible } .single-theme .current-label { display: none } .single-theme .theme-overlay .theme-actions { position: static } } .broken-themes { clear: both } .broken-themes table { text-align: left; width: 50%; border-spacing: 3px; padding: 3px } .update-php .wrap { max-width: 40rem } .theme-browser .theme .theme-installed { background: #2271b1 } .theme-browser .theme .notice-success p:before { color: #68de7c; content: "\f147"; display: inline-block; font: normal 20px/1 dashicons; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; vertical-align: top } .theme-install.updated-message:before { content: "" } .theme-install-php .wp-filter { padding-left: 20px } .theme-install-php a.browse-themes, .theme-install-php a.upload { cursor: pointer } .plugin-install-tab-upload .upload-view-toggle .upload, .upload-view-toggle .browse { display: none } .plugin-install-tab-upload .upload-view-toggle .browse { display: inline } .upload-plugin, .upload-theme { box-sizing: border-box; display: none; margin: 0; padding: 50px 0; width: 100%; overflow: hidden; position: relative; top: 10px; text-align: center } .plugin-install-tab-upload .upload-plugin, .show-upload-view .upload-plugin, .show-upload-view .upload-plugin-wrap, .show-upload-view .upload-theme { display: block } .upload-plugin .wp-upload-form, .upload-theme .wp-upload-form { background: #f6f7f7; border: 1px solid #c3c4c7; padding: 30px; margin: 30px auto; display: inline-flex; justify-content: space-between; align-items: center } .upload-plugin .wp-upload-form input[type=file], .upload-theme .wp-upload-form input[type=file] { margin-right: 10px } .upload-plugin .install-help, .upload-theme .install-help { color: #50575e; font-size: 18px; font-style: normal; margin: 0; padding: 0; text-align: center } p.no-themes, p.no-themes-local { clear: both; color: #646970; font-size: 18px; font-style: normal; margin: 0; padding: 100px 0; text-align: center; display: none } .no-results p.no-themes { display: block } .theme-install-php .add-new-theme { display: none !important } @media only screen and (max-width: 1120px) { .upload-theme .wp-upload-form { margin: 20px 0; max-width: 100% } .upload-theme .install-help { font-size: 15px; padding: 20px 0 0 } } .theme-details .theme-rating { line-height: 1.9 } .theme-details .star-rating { display: inline } .theme-details .no-rating, .theme-details .num-ratings { font-size: 11px; color: #646970 } .theme-details .no-rating { display: block; line-height: 1.9 } .update-from-upload-comparison { border-top: 1px solid #dcdcde; border-bottom: 1px solid #dcdcde; text-align: left; margin: 1rem 0 1.4rem; border-collapse: collapse; width: 100% } .update-from-upload-comparison tr:last-child td { height: 1.4rem; vertical-align: top } .update-from-upload-comparison tr:first-child th { font-weight: 700; height: 1.4rem; vertical-align: bottom } .update-from-upload-comparison td.name-label { text-align: right } .update-from-upload-comparison td, .update-from-upload-comparison th { padding: .4rem 1.4rem } .update-from-upload-comparison td.warning { color: #d63638 } .update-from-upload-actions { margin-top: 1.4rem } .appearance_page_custom-header #headimg { border: 1px solid #dcdcde; overflow: hidden; width: 100% } .appearance_page_custom-header #upload-form p label { font-size: 12px } .appearance_page_custom-header .available-headers .default-header { float: left; margin: 0 20px 20px 0 } .appearance_page_custom-header .random-header { clear: both; margin: 0 20px 20px 0; vertical-align: middle } .appearance_page_custom-header .available-headers label input, .appearance_page_custom-header .random-header label input { margin-right: 10px } .appearance_page_custom-header .available-headers label img { vertical-align: middle } div#custom-background-image { min-height: 100px; border: 1px solid #dcdcde } div#custom-background-image img { max-width: 400px; max-height: 300px } .background-position-control input[type=radio]:checked ~ .button { background: #f0f0f1; border-color: #8c8f94; box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .5); z-index: 1 } .background-position-control input[type=radio]:focus ~ .button { border-color: #4f94d4; box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .5), 0 0 3px rgba(34, 113, 177, .8); color: #1d2327 } .background-position-control .background-position-center-icon, .background-position-control .background-position-center-icon:before { display: inline-block; line-height: 1; text-align: center; transition: background-color .1s ease-in } .background-position-control .background-position-center-icon { height: 20px; margin-top: 13px; vertical-align: top; width: 20px } .background-position-control .background-position-center-icon:before { background-color: #50575e; border-radius: 50%; content: ""; height: 12px; width: 12px } .background-position-control .button:hover .background-position-center-icon:before, .background-position-control input[type=radio]:focus ~ .button .background-position-center-icon:before { background-color: #1d2327 } .background-position-control .button-group { display: block } .background-position-control .button-group .button { border-radius: 0; box-shadow: none; height: 40px !important; line-height: 2.9 !important; margin: 0 -1px 0 0 !important; padding: 0 10px 1px !important; position: relative } .background-position-control .button-group .button:active, .background-position-control .button-group .button:focus, .background-position-control .button-group .button:hover { z-index: 1 } .background-position-control .button-group:last-child .button { box-shadow: 0 1px 0 #c3c4c7 } .background-position-control .button-group > label { margin: 0 !important } .background-position-control .button-group:first-child > label:first-child .button { border-radius: 3px 0 0 } .background-position-control .button-group:first-child > label:first-child .dashicons { transform: rotate(45deg) } .background-position-control .button-group:first-child > label:last-child .button { border-radius: 0 3px 0 0 } .background-position-control .button-group:first-child > label:last-child .dashicons { transform: rotate(-45deg) } .background-position-control .button-group:last-child > label:first-child .button { border-radius: 0 0 0 3px } .background-position-control .button-group:last-child > label:first-child .dashicons { transform: rotate(-45deg) } .background-position-control .button-group:last-child > label:last-child .button { border-radius: 0 0 3px } .background-position-control .button-group:last-child > label:last-child .dashicons { transform: rotate(45deg) } .background-position-control .button-group .dashicons { margin-top: 9px } .background-position-control .button-group + .button-group { margin-top: -1px } body.full-overlay-active { overflow: hidden; visibility: hidden } .wp-full-overlay { background: 0 0; z-index: 500000; position: fixed; overflow: visible; top: 0; bottom: 0; left: 0; right: 0; height: 100%; min-width: 0 } .wp-full-overlay-sidebar { box-sizing: border-box; position: fixed; min-width: 300px; max-width: 600px; width: 18%; height: 100%; top: 0; bottom: 0; left: 0; padding: 0; margin: 0; z-index: 10; background: #f0f0f1; border-right: none } .wp-full-overlay.collapsed .wp-full-overlay-sidebar { overflow: visible } .wp-full-overlay.collapsed, .wp-full-overlay.expanded .wp-full-overlay-sidebar { margin-left: 0 !important } .wp-full-overlay.expanded { margin-left: 300px } .wp-full-overlay.collapsed .wp-full-overlay-sidebar { margin-left: -300px } @media screen and (min-width: 1667px) { .wp-full-overlay.expanded { margin-left: 18% } .wp-full-overlay.collapsed .wp-full-overlay-sidebar { margin-left: -18% } } @media screen and (min-width: 3333px) { .wp-full-overlay.expanded { margin-left: 600px } .wp-full-overlay.collapsed .wp-full-overlay-sidebar { margin-left: -600px } } .wp-full-overlay-sidebar:after { content: ""; display: block; position: absolute; top: 0; bottom: 0; right: 0; width: 3px; z-index: 1000 } .wp-full-overlay-main { position: absolute; left: 0; right: 0; top: 0; bottom: 0; height: 100% } .wp-full-overlay-sidebar .wp-full-overlay-header { position: absolute; left: 0; right: 0; height: 45px; padding: 0 15px; line-height: 3.2; z-index: 10; margin: 0; border-top: none; box-shadow: none } .wp-full-overlay-sidebar .wp-full-overlay-header a.back { margin-top: 9px } .wp-full-overlay-sidebar .wp-full-overlay-footer { bottom: 0; border-bottom: none; border-top: none; box-shadow: none } .wp-full-overlay-sidebar .wp-full-overlay-sidebar-content { position: absolute; top: 45px; bottom: 45px; left: 0; right: 0; overflow: auto } .theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header { padding: 0 } .theme-install-overlay .close-full-overlay, .theme-install-overlay .next-theme, .theme-install-overlay .previous-theme { display: block; position: relative; float: left; width: 45px; height: 45px; background: #f0f0f1; border-right: 1px solid #dcdcde; color: #3c434a; cursor: pointer; text-decoration: none; transition: color .1s ease-in-out, background .1s ease-in-out } .theme-install-overlay .close-full-overlay:focus, .theme-install-overlay .close-full-overlay:hover, .theme-install-overlay .next-theme:focus, .theme-install-overlay .next-theme:hover, .theme-install-overlay .previous-theme:focus, .theme-install-overlay .previous-theme:hover { background: #dcdcde; border-color: #c3c4c7; color: #000; outline: 0; box-shadow: none } .theme-install-overlay .close-full-overlay:before { font: normal 22px/1 dashicons; content: "\f335"; position: relative; top: 7px; left: 13px } .theme-install-overlay .previous-theme:before { font: normal 20px/1 dashicons; content: "\f341"; position: relative; top: 6px; left: 14px } .theme-install-overlay .next-theme:before { font: normal 20px/1 dashicons; content: "\f345"; position: relative; top: 6px; left: 13px } .theme-install-overlay .next-theme.disabled, .theme-install-overlay .next-theme.disabled:focus, .theme-install-overlay .next-theme.disabled:hover, .theme-install-overlay .previous-theme.disabled, .theme-install-overlay .previous-theme.disabled:focus, .theme-install-overlay .previous-theme.disabled:hover { color: #c3c4c7; background: #f0f0f1; cursor: default; pointer-events: none } .theme-install-overlay .close-full-overlay, .theme-install-overlay .next-theme, .theme-install-overlay .previous-theme { border-left: 0; border-top: 0; border-bottom: 0 } .theme-install-overlay .close-full-overlay:before, .theme-install-overlay .next-theme:before, .theme-install-overlay .previous-theme:before { top: 2px; left: 0 } .wp-core-ui .wp-full-overlay .collapse-sidebar { position: fixed; bottom: 0; left: 0; padding: 9px 0 9px 10px; height: 45px; color: #646970; outline: 0; line-height: 1; background-color: transparent !important; border: none !important; box-shadow: none !important; border-radius: 0 !important } .wp-core-ui .wp-full-overlay .collapse-sidebar:focus, .wp-core-ui .wp-full-overlay .collapse-sidebar:hover { color: #2271b1 } .wp-full-overlay .collapse-sidebar-arrow, .wp-full-overlay .collapse-sidebar-label { display: inline-block; vertical-align: middle; line-height: 1.6 } .wp-full-overlay .collapse-sidebar-arrow { width: 20px; height: 20px; margin: 0 2px; border-radius: 50%; overflow: hidden } .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow, .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8) } .wp-full-overlay .collapse-sidebar-label { margin-left: 3px } .wp-full-overlay.collapsed .collapse-sidebar-label { display: none } .wp-full-overlay .collapse-sidebar-arrow:before { display: block; content: "\f148"; background: #f0f0f1; font: normal 20px/1 dashicons; speak: never; padding: 0; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .wp-core-ui .wp-full-overlay.collapsed .collapse-sidebar { padding: 9px 10px } .rtl .wp-full-overlay .collapse-sidebar-arrow:before, .wp-full-overlay.collapsed .collapse-sidebar-arrow:before { transform: rotate(180.001deg) } .rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before { transform: none } .wp-full-overlay, .wp-full-overlay .collapse-sidebar, .wp-full-overlay-main, .wp-full-overlay-sidebar { transition-property: left, right, top, bottom, width, margin; transition-duration: .2s } .wp-full-overlay { background: #1d2327 } .wp-full-overlay-main { background-color: #f0f0f1 } .expanded .wp-full-overlay-footer { position: fixed; bottom: 0; left: 0; min-width: 299px; max-width: 599px; width: 18%; width: calc(18% - 1px); height: 45px; border-top: 1px solid #dcdcde; background: #f0f0f1 } .wp-full-overlay-footer .devices-wrapper { float: right } .wp-full-overlay-footer .devices { position: relative; background: #f0f0f1; box-shadow: -20px 0 10px -5px #f0f0f1 } .wp-full-overlay-footer .devices button { cursor: pointer; background: 0 0; border: none; height: 45px; padding: 0 3px; margin: 0 0 0 -4px; box-shadow: none; border-top: 1px solid transparent; border-bottom: 4px solid transparent; transition: .15s color ease-in-out, .15s background-color ease-in-out, .15s border-color ease-in-out } .wp-full-overlay-footer .devices button:focus { box-shadow: none; outline: 0 } .wp-full-overlay-footer .devices button:before { display: inline-block; -webkit-font-smoothing: antialiased; font: normal 20px/30px dashicons; vertical-align: top; margin: 3px 0; padding: 4px 8px; color: #646970 } .wp-full-overlay-footer .devices button.active { border-bottom-color: #1d2327 } .wp-full-overlay-footer .devices button:focus, .wp-full-overlay-footer .devices button:hover { background-color: #fff } .wp-full-overlay-footer .devices button.active:hover, .wp-full-overlay-footer .devices button:focus { border-bottom-color: #2271b1 } .wp-full-overlay-footer .devices button.active:before { color: #1d2327 } .wp-full-overlay-footer .devices button:focus:before, .wp-full-overlay-footer .devices button:hover:before { color: #2271b1 } .wp-full-overlay-footer .devices .preview-desktop:before { content: "\f472" } .wp-full-overlay-footer .devices .preview-tablet:before { content: "\f471" } .wp-full-overlay-footer .devices .preview-mobile:before { content: "\f470" } @media screen and (max-width: 1024px) { .wp-full-overlay-footer .devices { display: none } } .collapsed .wp-full-overlay-footer .devices button:before { display: none } .preview-mobile .wp-full-overlay-main { margin: auto 0 auto -160px; width: 320px; height: 480px; max-height: 100%; max-width: 100%; left: 50% } .preview-tablet .wp-full-overlay-main { margin: auto 0 auto -360px; width: 720px; height: 1080px; max-height: 100%; max-width: 100%; left: 50% } .customize-support .hide-if-customize, .customize-support .wp-core-ui .hide-if-customize, .customize-support.wp-core-ui .hide-if-customize, .no-customize-support .hide-if-no-customize, .no-customize-support .wp-core-ui .hide-if-no-customize, .no-customize-support.wp-core-ui .hide-if-no-customize { display: none } #customize-container, #customize-controls .notice.notification-overlay { background: #f0f0f1; z-index: 500000; position: fixed; overflow: visible; top: 0; bottom: 0; left: 0; right: 0; height: 100% } #customize-container { display: none } #customize-container, .theme-install-overlay { visibility: visible } .customize-loading #customize-container iframe { opacity: 0 } #customize-container iframe, .theme-install-overlay iframe { height: 100%; width: 100%; z-index: 20; transition: opacity .3s } #customize-controls { margin-top: 0 } .theme-install-overlay { display: none } .theme-install-overlay.single-theme { display: block } .install-theme-info { display: none; padding: 10px 20px 60px } .single-theme .install-theme-info { padding-top: 15px } .theme-install-overlay .install-theme-info { display: block } .install-theme-info .theme-install { float: right; margin-top: 18px } .install-theme-info .theme-name { font-size: 16px; line-height: 1.5; margin-bottom: 0; margin-top: 0 } .install-theme-info .theme-screenshot { margin: 15px 0; width: 258px; border: 1px solid #c3c4c7 } .install-theme-info .theme-details { overflow: hidden } .theme-details .theme-version { margin: 15px 0 } .theme-details .theme-description { float: left; color: #646970; line-height: 1.6; max-width: 100% } .theme-install-overlay .wp-full-overlay-header .button { float: right; margin: 8px 10px 0 0 } .theme-install-overlay .wp-full-overlay-sidebar { background: #f0f0f1; border-right: 1px solid #dcdcde } .theme-install-overlay .wp-full-overlay-sidebar-content { background: #fff; border-top: 1px solid #dcdcde; border-bottom: 1px solid #dcdcde } .theme-install-overlay .wp-full-overlay-main { position: absolute; z-index: 0; background-color: #f0f0f1 } .customize-loading #customize-container { background-color: #f0f0f1 } #customize-controls .notice.notification-overlay.notification-loading:before, #customize-preview.wp-full-overlay-main:before, .customize-loading #customize-container:before, .theme-install-overlay .wp-full-overlay-main:before { content: ""; display: block; width: 20px; height: 20px; position: absolute; left: 50%; top: 50%; z-index: -1; margin: -10px 0 0 -10px; transform: translateZ(0); background: transparent url(images/spinner.gif) no-repeat center center; background-size: 20px 20px } #customize-preview.wp-full-overlay-main.iframe-ready:before, .theme-install-overlay.iframe-ready .wp-full-overlay-main:before { background-image: none } @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { .wp-full-overlay .collapse-sidebar-arrow { background-image: url(images/arrows-2x.png); background-size: 15px 123px } #customize-controls .notice.notification-overlay.notification-loading:before, #customize-preview.wp-full-overlay-main:before, .customize-loading #customize-container:before, .theme-install-overlay .wp-full-overlay-main:before { background-image: url(images/spinner-2x.gif) } } @media screen and (max-width: 782px) { .available-theme .action-links .delete-theme { float: none; margin: 0; padding: 0; clear: both } .available-theme .action-links .delete-theme a { padding: 0 } .broken-themes table { width: 100% } .theme-install-overlay .wp-full-overlay-header .button { font-size: 13px; line-height: 2.15384615; min-height: 30px } .theme-browser .theme .theme-actions .button { margin-bottom: 0 } .theme-browser .theme .theme-actions, .theme-browser .theme.active .theme-actions { padding-top: 4px; padding-bottom: 4px } .upload-plugin .wp-upload-form, .upload-theme .wp-upload-form { display: block } } @media aural { .theme .notice:before, .theme-info .updated-message:before, .theme-info .updating-message:before, .theme-install.updating-message:before { speak: never } } /*! This file is auto-generated */ .about__container { --background: transparent; --subtle-background: #def; --text: #000; --text-light: #fff; --accent-1: #3858e9; --accent-2: #3858e9; --nav-background: #fff; --nav-border: transparent; --nav-color: var(--text); --nav-current: var(--accent-1); --gap: 2rem } .about-php, .credits-php, .freedoms-php, .privacy-php { background: #f0f7ff } .about-php #wpcontent, .credits-php #wpcontent, .freedoms-php #wpcontent, .privacy-php #wpcontent { background: linear-gradient(180deg, #fff 50%, #f0f7ff 100%); padding: 0 24px } @media screen and (max-width: 782px) { .about-php.auto-fold #wpcontent, .credits-php.auto-fold #wpcontent, .freedoms-php.auto-fold #wpcontent, .privacy-php.auto-fold #wpcontent { padding-left: 24px } } .about__container { max-width: 1000px; margin: 24px auto; clear: both } .about__container .alignleft { float: left } .about__container .alignright { float: right } .about__container .aligncenter { text-align: center } .about__container .is-vertically-aligned-top { align-self: start } .about__container .is-vertically-aligned-center { align-self: center } .about__container .is-vertically-aligned-bottom { align-self: end } .about__section { background: var(--background); clear: both } .about__container .has-accent-background-color { background-color: var(--accent-1); color: var(--text-light) } .about__container .has-accent-background-color a { color: var(--text-light) } .about__container .has-transparent-background-color { background-color: transparent } .about__container .has-accent-color { color: var(--accent-1) } .about__container .has-border { border: 3px solid currentColor } .about__container .has-subtle-background-color { background-color: var(--subtle-background) } .about__container .has-background-image { background-size: contain; background-repeat: no-repeat; background-position: center } .about__section { margin: 0 0 var(--gap) } .about__section .column:not(.is-edge-to-edge) { padding: var(--gap) } .about__section + .about__section .is-section-header { padding-bottom: var(--gap) } .about__section .column.has-border, .about__section .column[class*=background-color], .about__section:where([class*=background-color]) .column { padding-top: var(--gap); padding-bottom: var(--gap) } .about__section .column p:first-of-type { margin-top: 0 } .about__section .column p:last-of-type { margin-bottom: 0 } .about__section .has-text-columns { columns: 2; column-gap: calc(var(--gap) * 2) } .about__section .is-section-header { margin-bottom: 0; padding: var(--gap) var(--gap) 0 } .about__section .is-section-header p:last-child { margin-bottom: 0 } .about__section .is-section-header:first-child:last-child { padding: 0 } .about__section.is-feature { padding: var(--gap) } .about__section.is-feature p { margin: 0 } .about__section.is-feature p + p { margin-top: calc(var(--gap) / 2) } .about__section.has-1-column { margin-left: auto; margin-right: auto; max-width: 36em } .about__section.has-2-columns, .about__section.has-3-columns, .about__section.has-4-columns, .about__section.has-overlap-style { display: grid } .about__section.has-gutters { gap: var(--gap); margin-bottom: calc(var(--gap) * 2) } .about__section.has-2-columns { grid-template-columns:1fr 1fr } .about__section.has-2-columns.is-wider-right { grid-template-columns:2fr 3fr } .about__section.has-2-columns.is-wider-left { grid-template-columns:3fr 2fr } .about__section.has-2-columns .is-section-header { grid-column-start: 1; -ms-grid-column-span: 2; grid-column-end: span 2 } .about__section.has-2-columns .column:nth-of-type(2n+1) { grid-column-start: 1 } .about__section.has-2-columns .column:nth-of-type(2n) { grid-column-start: 2 } .about__section.has-3-columns { grid-template-columns:repeat(3, 1fr) } .about__section.has-3-columns .is-section-header { grid-column-start: 1; -ms-grid-column-span: 3; grid-column-end: span 3 } .about__section.has-3-columns .column:nth-of-type(3n+1) { grid-column-start: 1 } .about__section.has-3-columns .column:nth-of-type(3n+2) { grid-column-start: 2 } .about__section.has-3-columns .column:nth-of-type(3n) { grid-column-start: 3 } .about__section.has-4-columns { grid-template-columns:repeat(4, 1fr) } .about__section.has-4-columns .is-section-header { grid-column-start: 1; -ms-grid-column-span: 4; grid-column-end: span 4 } .about__section.has-4-columns .column:nth-of-type(4n+1) { grid-column-start: 1 } .about__section.has-4-columns .column:nth-of-type(4n+2) { grid-column-start: 2 } .about__section.has-4-columns .column:nth-of-type(4n+3) { grid-column-start: 3 } .about__section.has-4-columns .column:nth-of-type(4n) { grid-column-start: 4 } .about__section.has-2-columns .is-section-header ~ .column, .about__section.has-3-columns .is-section-header ~ .column, .about__section.has-4-columns .is-section-header ~ .column, .about__section.has-overlap-style .is-section-header ~ .column { grid-row-start: 2 } .about__section.has-overlap-style { grid-template-columns:repeat(7, 1fr) } .about__section.has-overlap-style .column { grid-row-start: 1 } .about__section.has-overlap-style .column:nth-of-type(2n+1) { grid-column-start: 2; -ms-grid-column-span: 3; grid-column-end: span 3 } .about__section.has-overlap-style .column:nth-of-type(2n) { grid-column-start: 4; -ms-grid-column-span: 3; grid-column-end: span 3 } .about__section.has-overlap-style .column.is-top-layer { z-index: 1 } @media screen and (max-width: 782px) { .about__section.has-2-columns.is-wider-left, .about__section.has-2-columns.is-wider-right, .about__section.has-3-columns { display: block; margin-bottom: calc(var(--gap) / 2) } .about__section .column:not(.is-edge-to-edge) { padding-top: var(--gap); padding-bottom: var(--gap) } .about__section.has-2-columns.has-gutters.is-wider-left, .about__section.has-2-columns.has-gutters.is-wider-right, .about__section.has-3-columns.has-gutters { margin-bottom: calc(var(--gap) * 2) } .about__section.has-2-columns.has-gutters .column, .about__section.has-3-columns.has-gutters .column { margin-bottom: var(--gap) } .about__section.has-2-columns.has-gutters .column:last-child, .about__section.has-3-columns.has-gutters .column:last-child { margin-bottom: 0 } .about__section.has-3-columns .column:nth-of-type(n) { padding-top: calc(var(--gap) / 2); padding-bottom: calc(var(--gap) / 2) } .about__section.has-4-columns { grid-template-columns:repeat(2, 1fr) } .about__section.has-4-columns .column:nth-of-type(2n+1) { grid-column-start: 1 } .about__section.has-4-columns .column:nth-of-type(2n) { grid-column-start: 2 } .about__section.has-4-columns .column:nth-of-type(4n), .about__section.has-4-columns .column:nth-of-type(4n+3) { grid-row-start: 2 } .about__section.has-4-columns .is-section-header { -ms-grid-column-span: 2; grid-column-end: span 2 } .about__section.has-4-columns .is-section-header ~ .column:nth-of-type(4n), .about__section.has-4-columns .is-section-header ~ .column:nth-of-type(4n+3) { grid-row-start: 3 } .about__section.has-overlap-style { grid-template-columns:1fr } .about__section.has-overlap-style .column.column { grid-column-start: 1; -ms-grid-column-span: 1; grid-column-end: 2; grid-row-start: 1; -ms-grid-row-span: 1; grid-row-end: 2 } } @media screen and (max-width: 600px) { .about__section.has-2-columns { display: block; margin-bottom: var(--gap) } .about__section.has-2-columns:not(.has-gutters) .column:nth-of-type(n) { padding-top: calc(var(--gap) / 2); padding-bottom: calc(var(--gap) / 2) } .about__section.has-2-columns.has-gutters { margin-bottom: calc(var(--gap) * 2) } .about__section.has-2-columns.has-gutters .column { margin-bottom: var(--gap) } .about__section.has-2-columns.has-gutters .column:last-child { margin-bottom: 0 } } @media screen and (max-width: 480px) { .about__section.is-feature .column { padding: 0 } .about__section.has-4-columns { display: block; padding-bottom: calc(var(--gap) / 2) } .about__section.has-4-columns.has-gutters .column { margin-bottom: calc(var(--gap) / 2) } .about__section.has-4-columns.has-gutters .column:last-child { margin-bottom: 0 } .about__section.has-4-columns .column:nth-of-type(n) { padding-top: calc(var(--gap) / 2); padding-bottom: calc(var(--gap) / 2) } } .about__container { line-height: 1.4; color: var(--text) } .about__container h1 { padding: 0; color: inherit } .about__container h1, .about__container h2, .about__container h3.is-larger-heading { margin-top: 0; margin-bottom: .5em; font-size: 2em; line-height: 1.2; font-weight: 700 } .about__container h1.is-smaller-heading, .about__container h2.is-smaller-heading, .about__container h3 { margin-top: 0; font-size: 1.6em; line-height: 1.3; font-weight: 400 } .about__container p { font-size: inherit; line-height: inherit } .about__container p.is-subheading { margin-top: 0; font-size: 1.8em } .about__section a { color: var(--accent-1); text-decoration: underline } .about__section a:active, .about__section a:focus, .about__section a:hover { color: var(--accent-1); text-decoration: none } .wp-credits-list a { text-decoration: none } .wp-credits-list a:active, .wp-credits-list a:focus, .wp-credits-list a:hover { text-decoration: underline } .about__container ul { list-style: disc; margin-left: calc(var(--gap) / 2) } .about__container img { margin: 0; max-width: 100%; vertical-align: middle } .about__container .about__image { margin: 0 } .about__container .about__image img { max-width: 100%; width: 100%; height: auto } .about__container .about__image figcaption { margin-top: .5em; text-align: center } .about__container .about__image .wp-video { margin-left: auto; margin-right: auto } .about__container .about__image + h3 { margin-top: 1.5em } .about__container hr { margin: 0; height: var(--gap); border: none } .about__container hr.is-small { height: calc(var(--gap) / 4) } .about__container hr.is-large { height: calc(var(--gap) * 2); margin: calc(var(--gap) / 2) auto } .about__container .notice, .about__container div.error, .about__container div.updated { display: none !important } .about__section { font-size: 1.2em } .about__section.is-feature { font-size: 1.6em } @media screen and (max-width: 480px) { .about__section.is-feature { font-size: 1.4em } .about__container h1, .about__container h2, .about__container h3.is-larger-heading { font-size: 2em } } .about__header { position: relative; margin-bottom: var(--gap); padding-top: 0; background-image: url('images/about-texture.png'); background-color: var(--accent-2); background-size: 500px 500px; background-blend-mode: overlay; color: var(--text-light) } .about__header::before { content: ""; position: absolute; top: 0; right: 64px; z-index: 0; width: 300px; height: 382px; background: url(images/about-header-about.svg) no-repeat center; background-size: contain } .credits-php .about__header::before { top: auto; bottom: 70px; height: 310px; background-image: url('images/about-header-credits.svg') } .freedoms-php .about__header::before { top: calc(50% - 182px); right: 32px; width: 375px; height: 300px; background-image: url('images/about-header-freedoms.svg') } .privacy-php .about__header::before { top: auto; bottom: -16px; background-image: url('images/about-header-privacy.svg') } .about__header-image { margin: 0 var(--gap) 3em } .about__header-title { box-sizing: border-box; padding: 6rem 380px 0 0; margin: 0 2rem } .about__header-title h1 { margin: 0 0 .5rem; padding: 0; font-size: 4.5rem; line-height: 1; font-weight: 400 } .about__header-text { box-sizing: border-box; margin: 0 0 7rem; padding: 0 380px 0 2rem; font-size: 1.6rem; line-height: 1.15 } .freedoms-php .about__header-text, .freedoms-php .about__header-title { padding-right: 423px; margin-right: 0 } .about__header-navigation { position: relative; z-index: 1; display: flex; justify-content: center; padding-top: 0; background: var(--nav-background); color: var(--nav-color); border-bottom: 3px solid var(--nav-border) } .about__header-navigation .nav-tab { margin-left: 0; padding: calc(var(--gap) * .75) var(--gap); float: none; font-size: 1.4em; line-height: 1; border-width: 0 0 3px; border-style: solid; border-color: transparent; background: 0 0; color: inherit } .about__header-navigation .nav-tab:active, .about__header-navigation .nav-tab:hover { background-color: var(--nav-current); color: var(--text-light) } .about__header-navigation .nav-tab-active { margin-bottom: -3px; color: var(--nav-current); border-width: 0 0 6px; border-color: var(--nav-current) } .about__header-navigation .nav-tab-active:active, .about__header-navigation .nav-tab-active:hover { background-color: var(--nav-current); color: var(--text-light); border-color: var(--nav-current) } @media screen and (max-width: 960px) { .about__header-title h1 { font-size: 4.8em } } @media screen and (max-width: 782px) { .about__header::before { width: 240px; height: 305px; right: 32px } .credits-php .about__header::before { height: 248px } .freedoms-php .about__header::before { top: calc(50% - 132px); height: 192px; width: 240px } .privacy-php .about__header::before { bottom: 0; height: 280px } .about__container .about__header-text { font-size: 1.4em } .about__header-container { display: block } .about__header-text, .about__header-title { padding-right: 288px !important } .about__header-image, .about__header-title { margin-left: calc(var(--gap) / 2); margin-right: calc(var(--gap) / 2) } .about__header-text { margin-top: 0; margin-right: 0; padding-left: calc(var(--gap) / 2) } .about__header-navigation .nav-tab { margin-top: 0; margin-right: 0; padding-left: calc(var(--gap) / 2); padding-right: calc(var(--gap) / 2) } } @media screen and (max-width: 600px) { .about__header::before { display: none } .about__header-text, .about__header-title { padding-right: calc(var(--gap) / 2) !important } } @media screen and (max-width: 480px) { .about__header-title p { font-size: 2.4em } .about__header-title { padding-top: 2rem } .about__header-text { margin-bottom: 2rem } .about__header-navigation { display: block } .about__header-navigation .nav-tab { display: block; margin-bottom: 0; padding: calc(var(--gap) / 2); border-left-width: 6px; border-bottom: none } .about__header-navigation .nav-tab-active { border-bottom: none; border-left-width: 6px } } .about__section .wp-people-group-title { margin-bottom: calc(var(--gap) * 2); text-align: center } .about__section .wp-people-group { margin: 0; display: flex; flex-wrap: wrap } .about__section .wp-person { display: inline-block; vertical-align: top; box-sizing: border-box; margin-bottom: var(--gap); width: 25%; text-align: center } .about__section .compact .wp-person { height: auto; width: 20% } .about__section .wp-person-avatar { display: block; margin: 0 auto calc(var(--gap) / 2); width: 140px; height: 140px; border-radius: 100%; overflow: hidden; background: var(--accent-1) } .about__section .wp-person .gravatar { width: 140px; height: 140px; filter: grayscale(100%); mix-blend-mode: screen } .about__section .compact .wp-person .gravatar, .about__section .compact .wp-person-avatar { width: 80px; height: 80px } .about__section .wp-person .web { font-size: 1.4em; font-weight: 600; text-decoration: none } .about__section .wp-person .web:hover { text-decoration: underline } .about__section .compact .wp-person .web { font-size: 1.2em } .about__section .wp-person .title { display: block; margin-top: .5em } @media screen and (max-width: 782px) { .about__section .wp-person { width: 33% } .about__section .compact .wp-person { width: 25% } .about__section .wp-person .gravatar, .about__section .wp-person-avatar { width: 120px; height: 120px } } @media screen and (max-width: 600px) { .about__section .wp-person { width: 50% } .about__section .compact .wp-person { width: 33% } .about__section .wp-person .web { font-size: 1.2em } } @media screen and (max-width: 480px) { .about__section .wp-person { min-width: 100% } .about__section .wp-person .web { font-size: 1em } .about__section .compact .wp-person .web { font-size: 1em } } .about__section .column .freedom-image { margin-bottom: var(--gap); max-height: 140px } .about-wrap { position: relative; margin: 25px 40px 0 20px; max-width: 1050px; font-size: 15px } .about-wrap.full-width-layout { max-width: 1200px } .about-wrap-content { max-width: 1050px } .about-wrap .notice, .about-wrap div.error, .about-wrap div.updated { display: none !important } .about-wrap hr { border: 0; height: 0; margin: 3em 0 0; border-top: 1px solid rgba(0, 0, 0, .1) } .about-wrap img { margin: 0; width: 100%; height: auto; vertical-align: middle } .about-wrap .inline-svg img { max-width: 100%; width: auto; height: auto } .about-wrap video { margin: 1.5em auto } .wp-badge { background: #0073aa url(images/w-logo-white.png?ver=20160308) no-repeat; background-position: center 25px; background-size: 80px 80px; color: #fff; font-size: 14px; text-align: center; font-weight: 600; margin: 5px 0 0; padding-top: 120px; height: 40px; display: inline-block; width: 140px; text-rendering: optimizeLegibility; box-shadow: 0 1px 3px rgba(0, 0, 0, .2) } .svg .wp-badge { background-image: url(images/wordpress-logo-white.svg?ver=20160308) } .about-wrap .wp-badge { position: absolute; top: 0; right: 0 } .about-wrap .nav-tab { padding-right: 15px; padding-left: 15px; font-size: 18px; line-height: 1.33333333 } .about-wrap h1 { margin: .2em 200px 0 0; padding: 0; color: #32373c; line-height: 1.2; font-size: 2.8em; font-weight: 400 } .about-wrap h2 { margin: 40px 0 .6em; font-size: 2.7em; line-height: 1.3; font-weight: 300; text-align: center } .about-wrap h3 { margin: 1.25em 0 .6em; font-size: 1.4em; line-height: 1.5 } .about-wrap h4 { font-size: 16px; color: #23282d } .about-wrap p { line-height: 1.5; font-size: 16px } .about-wrap code, .about-wrap ol li p { font-size: 14px; font-weight: 400 } .about-wrap figcaption { font-size: 13px; text-align: center; color: #fff; text-overflow: ellipsis } .about-wrap .about-description, .about-wrap .about-text { margin-top: 1.4em; font-weight: 400; line-height: 1.6; font-size: 19px } .about-wrap .about-text { margin: 1em 200px 1em 0; color: #555d66 } .about-wrap .has-1-columns, .about-wrap .has-2-columns, .about-wrap .has-3-columns, .about-wrap .has-4-columns { display: grid; max-width: 800px; margin-top: 40px; margin-left: auto; margin-right: auto } .about-wrap .column { margin-right: 20px; margin-left: 20px } .about-wrap .is-wide { max-width: 760px } .about-wrap .is-fullwidth { max-width: 100% } .about-wrap .has-1-columns { display: block; max-width: 680px; margin: 0 auto 40px } .about-wrap .has-2-columns { grid-template-columns:1fr 1fr } .about-wrap .has-2-columns .column:nth-of-type(2n+1) { grid-column-start: 1 } .about-wrap .has-2-columns .column:nth-of-type(2n) { grid-column-start: 2 } .about-wrap .has-2-columns.is-wider-right { grid-template-columns:1fr 2fr } .about-wrap .has-2-columns.is-wider-left { grid-template-columns:2fr 1fr } .about-wrap .has-3-columns { grid-template-columns:repeat(3, 1fr) } .about-wrap .has-3-columns .column:nth-of-type(3n+1) { grid-column-start: 1 } .about-wrap .has-3-columns .column:nth-of-type(3n+2) { grid-column-start: 2 } .about-wrap .has-3-columns .column:nth-of-type(3n) { grid-column-start: 3 } .about-wrap .has-4-columns { grid-template-columns:repeat(4, 1fr) } .about-wrap .has-4-columns .column:nth-of-type(4n+1) { grid-column-start: 1 } .about-wrap .has-4-columns .column:nth-of-type(4n+2) { grid-column-start: 2 } .about-wrap .has-4-columns .column:nth-of-type(4n+3) { grid-column-start: 3 } .about-wrap .has-4-columns .column:nth-of-type(4n) { grid-column-start: 4 } .about-wrap .column :first-child { margin-top: 0 } .about-wrap .aligncenter { text-align: center } .about-wrap .alignleft { float: left; margin-right: 40px } .about-wrap .alignright { float: right; margin-left: 40px } .about-wrap .is-vertically-aligned-top { align-self: start } .about-wrap .is-vertically-aligned-center { align-self: center } .about-wrap .is-vertically-aligned-bottom { align-self: end } .about-wrap .point-releases { margin-top: 5px; border-bottom: 1px solid #ddd } .about-wrap .changelog { margin-bottom: 40px } .about-wrap .changelog.point-releases h3 { padding-top: 35px } .about-wrap .changelog.point-releases h3:first-child { padding-top: 7px } .about-wrap .changelog.feature-section .col { margin-top: 40px } .about-wrap .lead-description { font-size: 1.5em; text-align: center } .about-wrap .feature-section p { margin-top: .6em } .about-wrap .headline-feature { margin: 0 auto 40px; max-width: 680px } .about-wrap .headline-feature h2 { margin: 50px 0 0 } .about-wrap .headline-feature img { max-width: 600px; width: 100% } .about-wrap .return-to-dashboard { margin: 30px 0 0 -5px; font-size: 14px; font-weight: 600 } .about-wrap .return-to-dashboard a { text-decoration: none; padding: 0 5px } .about-wrap h2.wp-people-group { margin: 2.6em 0 1.33em; padding: 0; font-size: 16px; line-height: inherit; font-weight: 600; text-align: left } .about-wrap .wp-people-group { padding: 0 5px; margin: 0 -15px 0 -5px } .about-wrap .compact { margin-bottom: 0 } .about-wrap .wp-person { display: inline-block; vertical-align: top; margin-right: 10px; padding-bottom: 15px; height: 70px; width: 280px } .about-wrap .compact .wp-person { height: auto; width: 180px; padding-bottom: 0; margin-bottom: 0 } .about-wrap .wp-person .gravatar { float: left; margin: 0 10px 10px 0; padding: 1px; width: 60px; height: 60px } .about-wrap .compact .wp-person .gravatar { width: 30px; height: 30px } .about-wrap .wp-person .web { margin: 6px 0 2px; font-size: 16px; font-weight: 400; line-height: 2; text-decoration: none } .about-wrap .wp-person .title { display: block } .about-wrap #wp-people-group-validators + p.wp-credits-list { margin-top: 0 } .about-wrap p.wp-credits-list a { white-space: nowrap } .freedoms-php .about-wrap ol { margin: 40px 60px } .freedoms-php .about-wrap ol li { list-style-type: decimal; font-weight: 600 } .freedoms-php .about-wrap ol p { font-weight: 400; margin: .6em 0 } .freedoms-php .column .freedoms-image { background-image: url('images/freedoms.png'); background-size: 100%; padding-top: 100% } .freedoms-php .column:nth-of-type(2) .freedoms-image { background-position: 0 34% } .freedoms-php .column:nth-of-type(3) .freedoms-image { background-position: 0 66% } .freedoms-php .column:nth-of-type(4) .freedoms-image { background-position: 0 100% } @media screen and (max-width: 782px) { .about-wrap .has-3-columns, .about-wrap .has-4-columns { grid-template-columns:1fr 1fr } .about-wrap .has-3-columns .column:nth-of-type(3n+1), .about-wrap .has-4-columns .column:nth-of-type(4n+1) { grid-column-start: 1; grid-row-start: 1 } .about-wrap .has-3-columns .column:nth-of-type(3n+2), .about-wrap .has-4-columns .column:nth-of-type(4n+2) { grid-column-start: 2; grid-row-start: 1 } .about-wrap .has-3-columns .column:nth-of-type(3n), .about-wrap .has-4-columns .column:nth-of-type(4n+3) { grid-column-start: 1; grid-row-start: 2 } .about-wrap .has-4-columns .column:nth-of-type(4n) { grid-column-start: 2; grid-row-start: 2 } } @media screen and (max-width: 600px) { .about-wrap .has-2-columns, .about-wrap .has-3-columns, .about-wrap .has-4-columns { display: block } .about-wrap :not(.is-wider-right):not(.is-wider-left) .column { margin-right: 0; margin-left: 0 } .about-wrap .has-2-columns.is-wider-left, .about-wrap .has-2-columns.is-wider-right { display: grid } } @media only screen and (max-width: 500px) { .about-wrap { margin-right: 20px; margin-left: 10px } .about-wrap .about-text, .about-wrap h1 { margin-right: 0 } .about-wrap .about-text { margin-bottom: .25em } .about-wrap .wp-badge { position: relative; margin-bottom: 1.5em; width: 100% } } @media only screen and (max-width: 480px) { .about-wrap .has-2-columns.is-wider-left, .about-wrap .has-2-columns.is-wider-right { display: block } .about-wrap .column { margin-right: 0; margin-left: 0 } .about-wrap .has-2-columns.is-wider-left img, .about-wrap .has-2-columns.is-wider-right img { max-width: 160px } } /*! This file is auto-generated */ .no-js #message { display: block } ul.add-menu-item-tabs li { padding: 3px 5px 4px 8px } .accordion-section ul.add-menu-item-tabs, .accordion-section ul.category-tabs, .accordion-section ul.wp-tab-bar { margin: 0 } .accordion-section .categorychecklist { margin: 13px 0 } #nav-menu-meta .accordion-section-content { padding: 18px 13px } #nav-menu-meta .button-controls { margin-bottom: 0 } .has-no-menu-item .button-controls { display: none } #nav-menus-frame { margin-left: 300px; margin-top: 23px } #wpbody-content #menu-settings-column { display: inline; width: 281px; margin-left: -300px; clear: both; float: left; padding-top: 0 } #menu-settings-column .inside { clear: both; margin: 10px 0 0 } .metabox-holder-disabled .accordion-section-content, .metabox-holder-disabled .accordion-section-title, .metabox-holder-disabled .postbox { opacity: .5 } .metabox-holder-disabled .button-controls .select-all { display: none } #wpbody { position: relative } .is-submenu { color: #50575e; font-style: italic; font-weight: 400; margin-left: 4px } .manage-menus { margin-top: 23px; padding: 10px; overflow: hidden; background: #fff } .manage-menus .selected-menu, .manage-menus .submit-btn, .manage-menus select, .nav-menus-php .add-new-menu-action { display: inline-block; margin-right: 3px; vertical-align: middle } .manage-menus select, .menu-location-menus select { max-width: 100% } .menu-edit #post-body-content h3 { margin: 1em 0 10px } #nav-menu-bulk-actions-top { margin: 1em 0 } #nav-menu-bulk-actions-bottom { margin: 1em 0; margin: calc(1em + 9px) 0 } .bulk-actions input.button { margin-right: 12px } .bulk-select-button { position: relative; display: inline-block; padding: 0 10px; font-size: 13px; line-height: 2.15384615; height: auto; min-height: 30px; background: #f6f7f7; vertical-align: top; border: 1px solid #dcdcde; margin: 0; cursor: pointer; border-radius: 3px; white-space: nowrap; box-sizing: border-box } .bulk-selection .bulk-select-button { color: #2271b1; border-color: #2271b1; background: #f6f7f7; vertical-align: top } #pending-menu-items-to-delete { display: none } .bulk-selection #pending-menu-items-to-delete { display: block; margin-top: 1em } #pending-menu-items-to-delete p { margin-bottom: 0 } #pending-menu-items-to-delete ul { margin-top: 0; list-style: none } #pending-menu-items-to-delete ul li { display: inline } input.bulk-select-switcher + .bulk-select-button-label { vertical-align: inherit } label.bulk-select-button:active, label.bulk-select-button:focus-within, label.bulk-select-button:hover { background: #f0f0f1; border-color: #0a4b78; color: #0a4b78 } input.bulk-select-switcher:focus + .bulk-select-button-label { color: #0a4b78 } .bulk-actions input.menu-items-delete { -webkit-appearance: none; appearance: none; font-size: inherit; border: 0; line-height: 2.1em; background: 0 0; cursor: pointer; text-decoration: underline; color: #b32d2e } .bulk-actions input.menu-items-delete:hover { color: #b32d2e; border: none } .bulk-actions input.menu-items-delete.disabled { cursor: default; color: #a7aaad; box-shadow: none } .menu-settings { border-top: 1px solid #f0f0f1; margin-top: 2em } .menu-settings-group { margin: 0 0 10px; overflow: hidden; padding-left: 20% } .menu-settings-group:last-of-type { margin-bottom: 0 } .menu-settings-input { float: left; margin: 0; width: 100% } .menu-settings-group-name { float: left; clear: both; width: 25%; padding: 3px 0 0; margin-left: -25% } .menu-settings label { vertical-align: baseline } .menu-edit .checkbox-input { margin-top: 4px } .theme-location-set { color: #646970; font-size: 11px } #menu-management-liquid { float: left; min-width: 100%; margin-top: 3px } #menu-management { position: relative; margin-right: 20px; margin-top: -3px; width: 100% } #menu-management .menu-edit { margin-bottom: 20px } .nav-menus-php #post-body { padding: 0 10px; border-top: 1px solid #fff; border-bottom: 1px solid #dcdcde; background: #fff } #nav-menu-footer, #nav-menu-header { padding: 0 10px; background: #f6f7f7 } #nav-menu-header { border-bottom: 1px solid #dcdcde; margin-bottom: 0 } #nav-menu-header .menu-name-label { display: inline-block; vertical-align: middle; margin-right: 7px } .nav-menus-php #post-body div.error, .nav-menus-php #post-body div.updated { margin: 0 } .nav-menus-php #post-body-content { position: relative; float: none } .nav-menus-php #post-body-content .post-body-plain { margin-bottom: 0 } #menu-management .menu-add-new abbr { font-weight: 600 } #select-nav-menu-container { text-align: right; padding: 0 10px 3px; margin-bottom: 5px } #select-nav-menu { width: 100px; display: inline } #menu-name-label { margin-top: -2px } .widefat .menu-locations .menu-location-title { padding: 13px 10px 0 } .menu-location-title label { font-weight: 600 } .menu-location-menus select { float: left } #locations-nav-menu-wrapper { padding: 5px 0 } .locations-nav-menu-select select { float: left; width: 160px; margin-right: 5px } .locations-row-links { float: left; margin: 6px 0 0 6px } .locations-add-menu-link, .locations-edit-menu-link { margin: 0 3px } .locations-edit-menu-link { padding-right: 3px; border-right: 1px solid #c3c4c7 } #menu-management .inside { padding: 0 10px } .customlinkdiv .menu-item-textbox, .postbox .howto input { width: 180px; float: right } .accordion-container .outer-border { margin: 0 } .customlinkdiv p { margin-top: 0 } #nav-menu-theme-locations .howto select { width: 100% } #nav-menu-theme-locations .button-controls { text-align: right } .add-menu-item-view-all { height: 400px } #menu-container .submit { margin: 0 0 10px; padding: 0 } #cancel-save { text-decoration: underline; font-size: 12px; margin-left: 20px; margin-top: 5px } .button-primary.right, .button-secondary.right, .button.right { float: right } .list-controls { float: left; margin-top: 5px } .add-to-menu { float: right } .button-controls { clear: both; margin: 10px 0 } .hide-all, .show-all { cursor: pointer } .hide-all { display: none } #menu-name { width: 270px; vertical-align: middle } #manage-menu .inside { padding: 0 } #available-links dt { display: block } #add-custom-link .howto { font-size: 12px } #add-custom-link label span { display: block; float: left; margin-top: 5px; padding-right: 5px } .menu-item-textbox { width: 180px } .customlinkdiv label, .nav-menus-php .howto span { float: left; margin-top: 6px } .quick-search { width: 190px } .quick-search-wrap .spinner { float: none; margin: -3px -10px 0 0 } .nav-menus-php .list-wrap { display: none; clear: both; margin-bottom: 10px } .nav-menus-php .postbox p.submit { margin-bottom: 0 } .nav-menus-php .list li { display: none; margin: 0 0 5px } .nav-menus-php .list li .menu-item-title { cursor: pointer; display: block } .nav-menus-php .list li .menu-item-title input { margin-right: 3px; margin-top: -3px } .menu-item-title input[type=checkbox] { display: inline-block; margin-top: -4px } .menu-item-title .post-state { font-weight: 600 } #menu-container .inside { padding-bottom: 10px } .menu { padding-top: 1em } #menu-to-edit { margin: 0; padding: .1em 0 } .menu ul { width: 100% } .menu li { margin-bottom: 0; position: relative } .menu-item-bar { clear: both; line-height: 1.5; position: relative; margin: 9px 0 0 } .menu-item-bar .menu-item-handle { border: 1px solid #dcdcde; position: relative; padding: 10px 15px; height: auto; min-height: 20px; max-width: 382px; line-height: 2.30769230; overflow: hidden; word-wrap: break-word } .menu-item-bar .menu-item-handle:hover { border-color: #8c8f94 } #menu-to-edit .menu-item-invalid .menu-item-handle { background: #fcf0f1; border-color: #d63638 } .no-js .menu-item-edit-active .item-edit { display: none } .js .menu-item-handle { cursor: move } .menu li.deleting .menu-item-handle { background-image: none; background-color: #f86368 } .menu-item-handle .item-title { font-size: 13px; font-weight: 600; line-height: 1.53846153; display: block; margin-right: 13em } .menu-item-handle .menu-item-checkbox { display: none } .bulk-selection .menu-item-handle .menu-item-checkbox { display: inline-block; margin-right: 6px } .menu-item-handle .menu-item-title.no-title { color: #646970 } li.menu-item.ui-sortable-helper .menu-item-bar { margin-top: 0 } li.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar { margin-top: 9px } .menu .sortable-placeholder { height: 35px; width: 410px; margin-top: 9px } .menu-item .menu-item-transport:empty { display: none } .menu-item-depth-0 { margin-left: 0 } .menu-item-depth-1 { margin-left: 30px } .menu-item-depth-2 { margin-left: 60px } .menu-item-depth-3 { margin-left: 90px } .menu-item-depth-4 { margin-left: 120px } .menu-item-depth-5 { margin-left: 150px } .menu-item-depth-6 { margin-left: 180px } .menu-item-depth-7 { margin-left: 210px } .menu-item-depth-8 { margin-left: 240px } .menu-item-depth-9 { margin-left: 270px } .menu-item-depth-10 { margin-left: 300px } .menu-item-depth-11 { margin-left: 330px } .menu-item-depth-0 .menu-item-transport { margin-left: 0 } .menu-item-depth-1 .menu-item-transport { margin-left: -30px } .menu-item-depth-2 .menu-item-transport { margin-left: -60px } .menu-item-depth-3 .menu-item-transport { margin-left: -90px } .menu-item-depth-4 .menu-item-transport { margin-left: -120px } .menu-item-depth-5 .menu-item-transport { margin-left: -150px } .menu-item-depth-6 .menu-item-transport { margin-left: -180px } .menu-item-depth-7 .menu-item-transport { margin-left: -210px } .menu-item-depth-8 .menu-item-transport { margin-left: -240px } .menu-item-depth-9 .menu-item-transport { margin-left: -270px } .menu-item-depth-10 .menu-item-transport { margin-left: -300px } .menu-item-depth-11 .menu-item-transport { margin-left: -330px } body.menu-max-depth-0 { min-width: 950px !important } body.menu-max-depth-1 { min-width: 980px !important } body.menu-max-depth-2 { min-width: 1010px !important } body.menu-max-depth-3 { min-width: 1040px !important } body.menu-max-depth-4 { min-width: 1070px !important } body.menu-max-depth-5 { min-width: 1100px !important } body.menu-max-depth-6 { min-width: 1130px !important } body.menu-max-depth-7 { min-width: 1160px !important } body.menu-max-depth-8 { min-width: 1190px !important } body.menu-max-depth-9 { min-width: 1220px !important } body.menu-max-depth-10 { min-width: 1250px !important } body.menu-max-depth-11 { min-width: 1280px !important } .item-type { display: inline-block; padding: 12px 16px; color: #646970; font-size: 12px; line-height: 1.5 } .item-controls { font-size: 12px; position: absolute; right: 20px; top: -1px } .item-controls a { text-decoration: none } .item-controls a:hover { cursor: pointer } .item-controls .item-order { padding-right: 10px } .nav-menus-php .item-edit { position: absolute; right: -20px; top: 0; display: block; width: 30px; height: 40px; outline: 0 } .no-js.nav-menus-php .item-edit { position: static; float: right; width: auto; height: auto; margin: 12px -10px 12px 0; padding: 0; color: #2271b1; text-decoration: underline; font-size: 12px; line-height: 1.5 } .no-js.nav-menus-php .item-edit .screen-reader-text { position: static; -webkit-clip-path: none; clip-path: none; width: auto; height: auto; margin: 0 } .nav-menus-php .item-edit:before { margin-top: 10px; margin-left: 4px; width: 20px; border-radius: 50%; text-indent: -1px } .no-js.nav-menus-php .item-edit:before { display: none } .rtl .nav-menus-php .item-edit:before { text-indent: 1px } .js.nav-menus-php .item-edit:focus { box-shadow: none } .nav-menus-php .item-edit:focus:before { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8) } .menu-instructions-inactive { display: none } .menu-item-settings { display: block; max-width: 392px; padding: 10px; position: relative; z-index: 10; border: 1px solid #c3c4c7; border-top: none; box-shadow: 0 1px 1px rgba(0, 0, 0, .04) } .menu-item-settings .field-move { margin: 3px 0 5px; line-height: 1.5 } .field-move-visual-label { float: left; margin-right: 4px } .menu-item-settings .field-move .button-link { display: none; margin: 0 2px } .menu-item-edit-active .menu-item-settings { display: block } .menu-item-edit-inactive .menu-item-settings { display: none } .add-menu-item-pagelinks { margin: .5em -10px; text-align: center } .add-menu-item-pagelinks .page-numbers { display: inline-block; min-width: 20px } .add-menu-item-pagelinks .page-numbers.dots { min-width: 0 } .link-to-original { display: block; margin: 0 0 15px; padding: 3px 5px 5px; border: 1px solid #dcdcde; color: #646970; font-size: 12px } .link-to-original a { padding-left: 4px; font-style: normal } .hidden-field { display: none } .menu-item-settings .description-thin, .menu-item-settings .description-wide { margin-right: 10px; float: left } .description-thin { width: calc(50% - 5px) } .menu-item-settings .description-thin + .description-thin { margin-right: 0 } .description-wide { width: 100% } .menu-item-actions { padding-top: 15px; padding-bottom: 7px } #cancel-save { cursor: pointer } .nav-menus-php .major-publishing-actions { clear: both; padding: 10px 0; line-height: 2.15384615 } .nav-menus-php .major-publishing-actions .publishing-action { text-align: right; float: right } .nav-menus-php .delete-action { float: left; line-height: 2.1 } .nav-menus-php .major-publishing-actions .form-invalid { padding-left: 4px; margin-left: -4px } #menu-item-name-wrap, #menu-item-url-wrap, #nav-menus-frame, .button-controls { display: block } @media only screen and (min-width: 769px) and (max-width: 1000px) { body.menu-max-depth-0 { min-width: 0 !important } #menu-management-liquid { width: 100% } .nav-menus-php #post-body-content { min-width: 0 } } @media screen and (max-width: 782px) { body.nav-menus-php, body.wp-customizer { min-width: 0 !important } #nav-menus-frame { margin-left: 0; float: none; width: 100% } #wpbody-content #menu-settings-column { display: block; width: 100%; float: none; margin-left: 0 } #side-sortables .add-menu-item-tabs { margin: 15px 0 14px } ul.add-menu-item-tabs li.tabs { padding: 13px 15px 14px } .nav-menus-php .customlinkdiv .howto input { width: 65% } .nav-menus-php .quick-search { width: 85% } #menu-management-liquid { margin-top: 25px } .nav-menus-php .menu-name-label.howto span { margin-top: 13px } #menu-name { width: 100% } .nav-menus-php #nav-menu-header .major-publishing-actions .publishing-action { padding-top: 1em } .nav-menus-php .delete-action { font-size: 14px; line-height: 2.14285714 } .description-wide, .menu-item-bar .menu-item-handle, .menu-item-settings { width: auto } .menu-item-settings { padding: 10px } .menu-item-settings .description-thin, .menu-item-settings .description-wide { width: 100% } .menu-item-settings input { width: 100% } .menu-item-settings input[type=checkbox], .menu-item-settings input[type=radio] { width: 25px } .menu-settings-group { padding-left: 0; overflow: visible } .menu-settings-group-name { float: none; width: auto; margin-left: 0; margin-bottom: 15px } .menu-settings-input { float: none; margin-bottom: 15px } .menu-edit .checkbox-input { margin-top: 0 } .manage-menus select { margin: .5em 0 } .wp-core-ui .manage-menus .button { margin-bottom: 0 } .widefat .menu-locations .menu-location-title { padding-top: 16px } } @media only screen and (min-width: 783px) { @supports (position:sticky) and (scroll-margin-bottom:130px) { #nav-menu-footer { position: sticky; bottom: 0; z-index: 10; box-shadow: 0 -1px 0 0 #ddd } #save_menu_header { display: none } } } @media only screen and (max-width: 768px) { #menu-locations-wrap .widefat { width: 100% } } /*! This file is auto-generated */ .wp-pointer-content { padding: 0 0 10px; position: relative; font-size: 13px; background: #fff; border: 1px solid #c3c4c7; box-shadow: 0 3px 6px rgba(0, 0, 0, .08) } .wp-pointer-content h3 { position: relative; margin: -1px -1px 5px; padding: 15px 18px 14px 60px; border: 1px solid #2271b1; border-bottom: none; line-height: 1.4; font-size: 14px; color: #fff; background: #2271b1 } .wp-pointer-content h3:before { background: #fff; border-radius: 50%; color: #2271b1; content: "\f227"; font: normal 20px/1.6 dashicons; position: absolute; top: 8px; left: 15px; speak: never; text-align: center; width: 32px; height: 32px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .wp-pointer-content h4 { margin: 1.33em 20px 1em; font-size: 1.15em } .wp-pointer-content p { padding: 0 20px } .wp-pointer-buttons { margin: 0; padding: 5px 15px; overflow: auto } .wp-pointer-buttons a { float: right; display: inline-block; text-decoration: none } .wp-pointer-buttons a.close { padding-left: 3px; position: relative } .wp-pointer-buttons a.close:before { background: 0 0; color: #787c82; content: "\f153"; display: block !important; font: normal 16px/1 dashicons; speak: never; margin: 1px 0; text-align: center; -webkit-font-smoothing: antialiased !important; width: 10px; height: 100%; position: absolute; left: -15px; top: 1px } .wp-pointer-buttons a.close:hover:before { color: #d63638 } .wp-pointer-arrow, .wp-pointer-arrow-inner { position: absolute; width: 0; height: 0 } .wp-pointer-arrow { z-index: 10; width: 0; height: 0; border: 0 solid transparent } .wp-pointer-arrow-inner { z-index: 20 } .wp-pointer-top, .wp-pointer-undefined { padding-top: 13px } .wp-pointer-bottom { margin-top: -13px; padding-bottom: 13px } .wp-pointer-left { padding-left: 13px } .wp-pointer-right { margin-left: -13px; padding-right: 13px } .wp-pointer-bottom .wp-pointer-arrow, .wp-pointer-top .wp-pointer-arrow, .wp-pointer-undefined .wp-pointer-arrow { left: 50px } .wp-pointer-left .wp-pointer-arrow, .wp-pointer-right .wp-pointer-arrow { top: 50%; margin-top: -15px } .wp-pointer-top .wp-pointer-arrow, .wp-pointer-undefined .wp-pointer-arrow { top: 0; border-width: 0 13px 13px; border-bottom-color: #2271b1 } .wp-pointer-top .wp-pointer-arrow-inner, .wp-pointer-undefined .wp-pointer-arrow-inner { top: 1px; margin-left: -13px; margin-top: -13px; border: 13px solid transparent; border-bottom-color: #2271b1; display: block; content: " " } .wp-pointer-bottom .wp-pointer-arrow { bottom: 0; border-width: 13px 13px 0; border-top-color: #c3c4c7 } .wp-pointer-bottom .wp-pointer-arrow-inner { bottom: 1px; margin-left: -13px; margin-bottom: -13px; border: 13px solid transparent; border-top-color: #fff; display: block; content: " " } .wp-pointer-left .wp-pointer-arrow { left: 0; border-width: 13px 13px 13px 0; border-right-color: #c3c4c7 } .wp-pointer-left .wp-pointer-arrow-inner { left: 1px; margin-left: -13px; margin-top: -13px; border: 13px solid transparent; border-right-color: #fff; display: block; content: " " } .wp-pointer-right .wp-pointer-arrow { right: 0; border-width: 13px 0 13px 13px; border-left-color: #c3c4c7 } .wp-pointer-right .wp-pointer-arrow-inner { right: 1px; margin-right: -13px; margin-top: -13px; border: 13px solid transparent; border-left-color: #fff; display: block; content: " " } .wp-pointer.arrow-bottom .wp-pointer-content { margin-bottom: -45px } .wp-pointer.arrow-bottom .wp-pointer-arrow { top: 100%; margin-top: -30px } @media screen and (max-width: 782px) { .wp-pointer { display: none } } /*! This file is auto-generated */ .widget { margin: 0 auto 10px; position: relative; box-sizing: border-box } .widget.open { z-index: 99 } .widget.open:focus-within { z-index: 100 } .widget-top { font-size: 13px; font-weight: 600; background: #f6f7f7 } .widget-top .widget-action { border: 0; margin: 0; padding: 10px; background: 0 0; cursor: pointer } .widget-title h3, .widget-title h4 { margin: 0; padding: 15px; font-size: 1em; line-height: 1; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; -webkit-user-select: none; user-select: none } .widgets-holder-wrap .widget-inside { border-top: none; padding: 1px 15px 15px; line-height: 1.23076923 } .widget.widget-dirty .widget-control-close-wrapper { display: none } #available-widgets .widget-description, #widgets-right a.widget-control-edit, .in-widget-title { color: #646970 } .deleting .widget-title, .deleting .widget-top .widget-action .toggle-indicator:before { color: #a7aaad } .wp-core-ui .media-widget-control .selected, .wp-core-ui .media-widget-control.selected .not-selected, .wp-core-ui .media-widget-control.selected .placeholder { display: none } .media-widget-control.selected .selected { display: inline-block } .media-widget-buttons { text-align: left; margin-top: 0 } .media-widget-control .media-widget-buttons .button { width: auto; height: auto; margin-top: 12px; white-space: normal } .media-widget-buttons .button:first-child { margin-right: 8px } .media-widget-control .attachment-media-view .button-add-media, .media-widget-control .placeholder { border: 1px dashed #c3c4c7; box-sizing: border-box; cursor: pointer; line-height: 1.6; padding: 9px 0; position: relative; text-align: center; width: 100% } .media-widget-control .attachment-media-view .button-add-media { cursor: pointer; background-color: #f0f0f1; color: #2c3338 } .media-widget-control .attachment-media-view .button-add-media:hover { background-color: #fff } .media-widget-control .attachment-media-view .button-add-media:focus { background-color: #fff; border-style: solid; border-color: #4f94d4; box-shadow: 0 0 3px rgba(34, 113, 177, .8); outline: 2px solid transparent; outline-offset: -2px } .media-widget-control .media-widget-preview { background: 0 0; text-align: center } .media-widget-control .media-widget-preview .notice { text-align: initial } .media-frame .media-widget-embed-notice p code, .media-widget-control .notice p code { padding: 0 3px 0 0 } .media-frame .media-widget-embed-notice { margin-top: 16px } .media-widget-control .media-widget-preview img { max-width: 100%; vertical-align: middle; background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7); background-position: 0 0, 10px 10px; background-size: 20px 20px } .media-widget-control .media-widget-preview .wp-video-shortcode { background: #000 } .media-frame.media-widget .media-toolbar-secondary { min-width: 300px } .media-frame.media-widget .attachment-display-settings .setting.align, .media-frame.media-widget .checkbox-setting.autoplay, .media-frame.media-widget .embed-link-settings .setting.link-text, .media-frame.media-widget .embed-media-settings .legend-inline, .media-frame.media-widget .embed-media-settings .setting.align, .media-frame.media-widget .image-details .embed-media-settings .setting.align, .media-frame.media-widget .replace-attachment { display: none } .media-widget-video-preview { width: 100% } .media-widget-video-link { display: inline-block; min-height: 132px; width: 100%; background: #000 } .media-widget-video-link .dashicons { font: normal 60px/1 dashicons; position: relative; width: 100%; top: -90px; color: #fff; text-decoration: none } .media-widget-video-link.no-poster .dashicons { top: 30px } .media-frame #embed-url-field.invalid, .media-widget-image-link > .link:invalid { border: 1px solid #d63638 } .media-widget-image-link { margin: 1em 0 } .media-widget-gallery-preview { display: flex; justify-content: flex-start; flex-wrap: wrap; margin: -1.79104477% } .media-widget-preview.media_gallery, .media-widget-preview.media_image { cursor: pointer } .media-widget-preview .placeholder { background: #f0f0f1 } .media-widget-gallery-preview .gallery-item { box-sizing: border-box; width: 50%; margin: 0; background: 0 0 } .media-widget-gallery-preview .gallery-item .gallery-icon { margin: 4.5% } .media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child, .media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child ~ .gallery-item, .media-widget-gallery-preview .gallery-item:nth-last-child(n+5), .media-widget-gallery-preview .gallery-item:nth-last-child(n+5) ~ .gallery-item, .media-widget-gallery-preview .gallery-item:nth-last-child(n+6), .media-widget-gallery-preview .gallery-item:nth-last-child(n+6) ~ .gallery-item { max-width: 33.33% } .media-widget-gallery-preview .gallery-item img { height: auto; vertical-align: bottom } .media-widget-gallery-preview .gallery-icon { position: relative } .media-widget-gallery-preview .gallery-icon-placeholder { position: absolute; top: 0; bottom: 0; width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: center; background-color: rgba(0, 0, 0, .5) } .media-widget-gallery-preview .gallery-icon-placeholder-text { font-weight: 600; font-size: 2em; color: #fff } .widget.ui-draggable-dragging { min-width: 100% } .widget.ui-sortable-helper { opacity: .8 } .widget-placeholder { border: 1px dashed #c3c4c7; margin: 0 auto 10px; height: 45px; width: 100%; box-sizing: border-box } #widgets-right .widget-placeholder { margin-top: 0 } #widgets-right .closed .widget-placeholder { height: 0; border: 0; margin-top: -10px } .sidebar-name { position: relative; box-sizing: border-box } .js .sidebar-name { cursor: pointer } .sidebar-name .handlediv { float: right; width: 38px; height: 38px; border: 0; margin: 0; padding: 8px; background: 0 0; cursor: pointer; outline: 0 } #widgets-right .sidebar-name .handlediv { margin: 5px 3px 0 0 } .sidebar-name .handlediv:focus { box-shadow: none; outline: 1px solid transparent } #widgets-left .sidebar-name .toggle-indicator { display: none } #widgets-left .sidebar-name .handlediv:focus .toggle-indicator, #widgets-left .sidebar-name:hover .toggle-indicator, #widgets-left .widgets-holder-wrap.closed .sidebar-name .toggle-indicator { display: block } .sidebar-name .toggle-indicator:before { padding: 1px 2px 1px 0; border-radius: 50% } .sidebar-name .handlediv:focus .toggle-indicator:before { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8) } .sidebar-name h2, .sidebar-name h3 { margin: 0; padding: 8px 10px; overflow: hidden; white-space: normal; line-height: 1.5 } .widgets-holder-wrap .description { padding: 0 0 15px; margin: 0; font-style: normal; color: #646970 } .inactive-sidebar .description, .widget-holder .description { color: #50575e } #widgets-right .widgets-holder-wrap .description { padding-left: 7px; padding-right: 7px } div.widget-liquid-left { margin: 0; width: 38%; float: left } div.widget-liquid-right { float: right; width: 58% } div#widgets-left { padding-top: 12px } div#widgets-left .closed .sidebar-name, div#widgets-left .inactive-sidebar.closed .sidebar-name { margin-bottom: 10px } div#widgets-left .sidebar-name h2, div#widgets-left .sidebar-name h3 { padding: 10px 0; margin: 0 10px 0 0 } #widgets-left .widgets-holder-wrap, div#widgets-left .widget-holder { background: 0 0; border: none } #widgets-left .widgets-holder-wrap { border: none; box-shadow: none } #available-widgets .widget { margin: 0 } #available-widgets .widget:nth-child(odd) { clear: both } #available-widgets .widget .widget-description { display: block; padding: 10px 15px; font-size: 12px; overflow-wrap: break-word; word-wrap: break-word; -ms-word-break: break-all; word-break: break-word; -webkit-hyphens: auto; hyphens: auto } #available-widgets #widget-list { position: relative } #widgets-left .inactive-sidebar { clear: both; width: 100%; background: 0 0; padding: 0; margin: 0 0 20px; border: none; box-shadow: none } #widgets-left .inactive-sidebar.first { margin-top: 40px } div#widgets-left .inactive-sidebar .widget.expanded { left: auto } .widget-title-action { float: right; position: relative } div#widgets-left .inactive-sidebar .widgets-sortables { min-height: 42px; padding: 0; background: 0 0; margin: 0; position: relative } div#widgets-right .sidebars-column-1, div#widgets-right .sidebars-column-2 { max-width: 450px } div#widgets-right .widgets-holder-wrap { margin: 10px 0 0 } div#widgets-right .sidebar-description { min-height: 20px; margin-top: -5px } div#widgets-right .sidebar-name h2, div#widgets-right .sidebar-name h3 { padding: 15px 15px 15px 7px } div#widgets-right .widget-top { padding: 0 } div#widgets-right .widgets-sortables { padding: 0 8px; margin-bottom: 9px; position: relative; min-height: 123px } div#widgets-right .closed .widgets-sortables { min-height: 0; margin-bottom: 0 } .remove-inactive-widgets .spinner, .sidebar-name .spinner { float: none; position: relative; top: -2px; margin: -5px 5px } .sidebar-name .spinner { position: absolute; top: 18px; right: 30px } #widgets-right .widgets-holder-wrap.widget-hover { border-color: #787c82; box-shadow: 0 1px 2px rgba(0, 0, 0, .3) } .widget-access-link { float: right; margin: -5px 0 10px 10px } .widgets_access #widgets-left .widget .widget-top { cursor: auto } .widgets_access #wpwrap .widget-control-edit, .widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description, .widgets_access #wpwrap .widgets-holder-wrap.closed .widget { display: block } .widgets_access #widgets-left .widget .widget-top:hover, .widgets_access #widgets-right .widget .widget-top:hover { border-color: #dcdcde } #available-widgets .widget-action .edit, #available-widgets .widget-control-edit .edit, #widgets-left .inactive-sidebar .widget-action .add, #widgets-left .inactive-sidebar .widget-control-edit .add, #widgets-right .widget-action .add, #widgets-right .widget-control-edit .add { display: none } .widget-control-edit { display: block; color: #646970; background: #f0f0f1; padding: 0 15px; line-height: 3.30769230; border-left: 1px solid #dcdcde } #widgets-left .widget-control-edit:hover, #widgets-right .widget-control-edit:hover { color: #fff; background: #3c434a; border-left: 0; outline: 1px solid #3c434a } .widgets-holder-wrap .sidebar-description, .widgets-holder-wrap .sidebar-name { -webkit-user-select: none; user-select: none } .editwidget { margin: 0 auto } .editwidget .widget-inside { display: block; padding: 0 15px } .editwidget .widget-control-actions { margin-top: 20px } .js .closed br.clear, .js .widgets-holder-wrap.closed .description, .js .widgets-holder-wrap.closed .remove-inactive-widgets, .js .widgets-holder-wrap.closed .sidebar-description, .js .widgets-holder-wrap.closed .widget { display: none } .js .widgets-holder-wrap.closed .widget.ui-sortable-helper { display: block } .widget-description, .widget-inside { display: none } .widget-inside { background: #fff } .widget-inside select { max-width: 100% } #removing-widget { display: none; font-weight: 400; padding-left: 15px; font-size: 12px; line-height: 1; color: #000 } .js #removing-widget { color: #72aee6 } #access-off, .no-js .widget-holder .description, .widget-control-noform, .widgets_access #access-on, .widgets_access .handlediv, .widgets_access .widget-action, .widgets_access .widget-holder .description { display: none } .widgets_access #widget-list, .widgets_access .widget-holder { padding-top: 10px } .widgets_access #access-off { display: inline } .widgets_access .sidebar-name, .widgets_access .widget .widget-top { cursor: default } .widget-liquid-left #widgets-left.chooser #available-widgets .widget, .widget-liquid-left #widgets-left.chooser .inactive-sidebar { transition: opacity .1s linear } .widget-liquid-left #widgets-left.chooser #available-widgets .widget, .widget-liquid-left #widgets-left.chooser .inactive-sidebar { opacity: .2; pointer-events: none } .widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question { opacity: 1; pointer-events: auto } #available-widgets .widget-top:hover, #widgets-left .widget-in-question .widget-top, #widgets-left .widget-top:hover, .widgets-chooser ul, div#widgets-right .widget-top:hover { border-color: #8c8f94; box-shadow: 0 1px 2px rgba(0, 0, 0, .1) } .widgets-chooser ul.widgets-chooser-sidebars { margin: 0; list-style-type: none; max-height: 300px; overflow: auto } .widgets-chooser { display: none } .widgets-chooser ul { border: 1px solid #c3c4c7 } .widgets-chooser li { border-bottom: 1px solid #c3c4c7; background: #fff; margin: 0; position: relative } .widgets-chooser .widgets-chooser-button { width: 100%; padding: 10px 15px 10px 35px; background: 0 0; border: 0; box-sizing: border-box; text-align: left; cursor: pointer; transition: background .2s ease-in-out } .widgets-chooser .widgets-chooser-button:focus, .widgets-chooser .widgets-chooser-button:hover { outline: 0; text-decoration: underline } .widgets-chooser li:last-child { border: none } .widgets-chooser .widgets-chooser-selected .widgets-chooser-button { background: #2271b1; color: #fff } .widgets-chooser .widgets-chooser-selected:before { content: "\f147"; display: block; -webkit-font-smoothing: antialiased; font: normal 26px/1 dashicons; color: #fff; position: absolute; top: 7px; left: 5px } .widgets-chooser .widgets-chooser-actions { padding: 10px 0 12px; text-align: center } #available-widgets .widget .widget-top { cursor: pointer } #available-widgets .widget.ui-draggable-dragging .widget-top { cursor: move } .text-widget-fields { position: relative } .text-widget-fields [hidden] { display: none } .text-widget-fields .wp-pointer.wp-pointer-top { position: absolute; z-index: 3; top: 100px; right: 10px; left: 10px } .text-widget-fields .wp-pointer .wp-pointer-arrow { left: auto; right: 15px } .text-widget-fields .wp-pointer .wp-pointer-buttons { line-height: 1.4 } .custom-html-widget-fields > p > .CodeMirror { border: 1px solid #dcdcde } .custom-html-widget-fields code { padding-top: 1px; padding-bottom: 1px } ul.CodeMirror-hints { z-index: 101 } .widget-control-actions .custom-html-widget-save-button.button.validation-blocked { cursor: not-allowed } @media screen and (max-width: 782px) { .editwidget .widget-inside input[type=checkbox], .editwidget .widget-inside input[type=radio], .widgets-holder-wrap .widget-inside input[type=checkbox], .widgets-holder-wrap .widget-inside input[type=radio] { margin: .25rem .25rem .25rem 0 } } @media screen and (max-width: 480px) { div.widget-liquid-left { width: 100%; float: none; border-right: none; padding-right: 0 } #widgets-left .sidebar-name { margin-right: 0 } #widgets-left #available-widgets .widget-top { margin-right: 0 } #widgets-left .inactive-sidebar .widgets-sortables { margin-right: 0 } div.widget-liquid-right { width: 100%; float: none } div.widget { max-width: 480px } .widget-access-link { float: none; margin: 15px 0 0 } } @media screen and (max-width: 320px) { div.widget { max-width: 320px } } @media only screen and (min-width: 1250px) { #widgets-left #available-widgets .widget { width: 49%; float: left } .widget.ui-draggable-dragging { min-width: 49% } #widgets-left #available-widgets .widget:nth-child(even) { float: right } #widgets-right .sidebars-column-1, #widgets-right .sidebars-column-2 { float: left; width: 49% } #widgets-right .sidebars-column-1 { margin-right: 2% } #widgets-right.single-sidebar .sidebars-column-1, #widgets-right.single-sidebar .sidebars-column-2 { float: none; width: 100%; margin: 0 } } /*! This file is auto-generated */ .site-icon-preview .favicon-preview { margin: 5px 0 20px; overflow: hidden; position: relative; max-width: 180px } .site-icon-preview .browser-title, .site-icon-preview .favicon { height: 16px; left: 88px; overflow: hidden; position: absolute; top: 16px } .site-icon-preview .favicon { width: 16px } .site-icon-preview .browser-title { left: 109px; width: 72px; white-space: nowrap } .site-icon-preview .app-icon-preview { background-color: #000; border-radius: 16px; height: 64px; overflow: hidden; width: 64px; margin-top: 5px } .site-icon-preview .app-icon-preview, .site-icon-preview .favicon { direction: ltr } .customize-control-site_icon .favicon-preview { float: left; margin-right: 12px; margin-bottom: 0 } .customize-control-site_icon .app-icon-preview { margin-top: 9px } /*! This file is auto-generated */ body.rtl, body.rtl .press-this a.wp-switch-editor { font-family: Tahoma, Arial, sans-serif } .rtl h1, .rtl h2, .rtl h3, .rtl h4, .rtl h5, .rtl h6 { font-family: Arial, sans-serif; font-weight: 600 } body.locale-he-il, body.locale-he-il .press-this a.wp-switch-editor { font-family: Arial, sans-serif } .locale-he-il em { font-style: normal; font-weight: 600 } .locale-zh-cn #local-time, .locale-zh-cn #utc-time, .locale-zh-cn .form-wrap p, .locale-zh-cn .howto, .locale-zh-cn .inline-edit-row fieldset span.checkbox-title, .locale-zh-cn .inline-edit-row fieldset span.title, .locale-zh-cn .js .input-with-default-title, .locale-zh-cn .link-to-original, .locale-zh-cn .tablenav .displaying-num, .locale-zh-cn p.description, .locale-zh-cn p.help, .locale-zh-cn p.install-help, .locale-zh-cn span.description { font-style: normal } .locale-zh-cn .hdnle a { font-size: 12px } .locale-zh-cn form.upgrade .hint { font-style: normal; font-size: 100% } .locale-zh-cn #sort-buttons { font-size: 1em !important } .locale-de-de #customize-header-actions .button, .locale-de-de-formal #customize-header-actions .button { padding: 0 5px 1px } .locale-de-de #customize-header-actions .spinner, .locale-de-de-formal #customize-header-actions .spinner { margin: 16px 3px 0 } .locale-ru-ru #adminmenu { width: inherit } .locale-ru-ru #adminmenu, .locale-ru-ru #wpbody { margin-left: 0 } .locale-ru-ru .inline-edit-row fieldset label span.title, .locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend { width: 8em } .locale-ru-ru .inline-edit-row fieldset .timestamp-wrap, .locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap { margin-left: 8em } .locale-ru-ru.post-new-php .tagsdiv .newtag, .locale-ru-ru.post-php .tagsdiv .newtag { width: 165px } .locale-ru-ru.press-this .posting { margin-right: 277px } .locale-ru-ru .press-this-sidebar { width: 265px } .locale-ru-ru #customize-header-actions .button { padding: 0 5px 1px } .locale-ru-ru #customize-header-actions .spinner { margin: 16px 3px 0 } .locale-lt-lt .inline-edit-row fieldset label span.title, .locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend { width: 8em } .locale-lt-lt .inline-edit-row fieldset .timestamp-wrap, .locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap { margin-left: 8em } @media screen and (max-width: 782px) { .locale-lt-lt .inline-edit-row fieldset .timestamp-wrap, .locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap, .locale-ru-ru .inline-edit-row fieldset .timestamp-wrap, .locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap { margin-left: 0 } } /*! This file is auto-generated */ .wp-core-ui .button, .wp-core-ui .button-primary, .wp-core-ui .button-secondary { display: inline-block; text-decoration: none; font-size: 13px; line-height: 2.15384615; min-height: 30px; margin: 0; padding: 0 10px; cursor: pointer; border-width: 1px; border-style: solid; -webkit-appearance: none; border-radius: 3px; white-space: nowrap; box-sizing: border-box } .wp-core-ui button::-moz-focus-inner, .wp-core-ui input[type=button]::-moz-focus-inner, .wp-core-ui input[type=reset]::-moz-focus-inner, .wp-core-ui input[type=submit]::-moz-focus-inner { border-width: 0; border-style: none; padding: 0 } .wp-core-ui .button-group.button-large .button, .wp-core-ui .button.button-large { min-height: 32px; line-height: 2.30769231; padding: 0 12px } .wp-core-ui .button-group.button-small .button, .wp-core-ui .button.button-small { min-height: 26px; line-height: 2.18181818; padding: 0 8px; font-size: 11px } .wp-core-ui .button-group.button-hero .button, .wp-core-ui .button.button-hero { font-size: 14px; min-height: 46px; line-height: 3.14285714; padding: 0 36px } .wp-core-ui .button.hidden { display: none } .wp-core-ui input[type=reset], .wp-core-ui input[type=reset]:active, .wp-core-ui input[type=reset]:focus, .wp-core-ui input[type=reset]:hover { background: 0 0; border: none; box-shadow: none; padding: 0 2px 1px; width: auto } .wp-core-ui .button, .wp-core-ui .button-secondary { color: #2271b1; border-color: #2271b1; background: #f6f7f7; vertical-align: top } .wp-core-ui p .button { vertical-align: baseline } .wp-core-ui .button-secondary:hover, .wp-core-ui .button.hover, .wp-core-ui .button:hover { background: #f0f0f1; border-color: #0a4b78; color: #0a4b78 } .wp-core-ui .button-secondary:focus, .wp-core-ui .button.focus, .wp-core-ui .button:focus { background: #f6f7f7; border-color: #3582c4; color: #0a4b78; box-shadow: 0 0 0 1px #3582c4; outline: 2px solid transparent; outline-offset: 0 } .wp-core-ui .button-secondary:active, .wp-core-ui .button:active { background: #f6f7f7; border-color: #8c8f94; box-shadow: none } .wp-core-ui .button.active, .wp-core-ui .button.active:hover { background-color: #dcdcde; color: #135e96; border-color: #0a4b78; box-shadow: inset 0 2px 5px -3px #0a4b78 } .wp-core-ui .button.active:focus { border-color: #3582c4; box-shadow: inset 0 2px 5px -3px #0a4b78, 0 0 0 1px #3582c4 } .wp-core-ui .button-disabled, .wp-core-ui .button-secondary.disabled, .wp-core-ui .button-secondary:disabled, .wp-core-ui .button-secondary[disabled], .wp-core-ui .button.disabled, .wp-core-ui .button:disabled, .wp-core-ui .button[disabled] { color: #a7aaad !important; border-color: #dcdcde !important; background: #f6f7f7 !important; box-shadow: none !important; cursor: default; transform: none !important } .wp-core-ui .button-link { margin: 0; padding: 0; box-shadow: none; border: 0; border-radius: 0; background: 0 0; cursor: pointer; text-align: left; color: #2271b1; text-decoration: underline; transition-property: border, background, color; transition-duration: .05s; transition-timing-function: ease-in-out } .wp-core-ui .button-link:active, .wp-core-ui .button-link:hover { color: #135e96 } .wp-core-ui .button-link:focus { color: #043959; box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8); outline: 1px solid transparent } .wp-core-ui .button-link-delete { color: #d63638 } .wp-core-ui .button-link-delete:focus, .wp-core-ui .button-link-delete:hover { color: #d63638; background: 0 0 } .wp-core-ui .button-link-delete:disabled { background: 0 0 !important } .wp-core-ui .button-primary { background: #2271b1; border-color: #2271b1; color: #fff; text-decoration: none; text-shadow: none } .wp-core-ui .button-primary.focus, .wp-core-ui .button-primary.hover, .wp-core-ui .button-primary:focus, .wp-core-ui .button-primary:hover { background: #135e96; border-color: #135e96; color: #fff } .wp-core-ui .button-primary.focus, .wp-core-ui .button-primary:focus { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #2271b1 } .wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover, .wp-core-ui .button-primary:active { background: #135e96; border-color: #135e96; box-shadow: none; color: #fff } .wp-core-ui .button-primary-disabled, .wp-core-ui .button-primary.disabled, .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary[disabled] { color: #a7aaad !important; background: #f6f7f7 !important; border-color: #dcdcde !important; box-shadow: none !important; text-shadow: none !important; cursor: default } .wp-core-ui .button-group { position: relative; display: inline-block; white-space: nowrap; font-size: 0; vertical-align: middle } .wp-core-ui .button-group > .button { display: inline-block; border-radius: 0; margin-right: -1px } .wp-core-ui .button-group > .button:first-child { border-radius: 3px 0 0 3px } .wp-core-ui .button-group > .button:last-child { border-radius: 0 3px 3px 0 } .wp-core-ui .button-group > .button-primary + .button { border-left: 0 } .wp-core-ui .button-group > .button:focus { position: relative; z-index: 1 } .wp-core-ui .button-group > .button.active { background-color: #dcdcde; color: #135e96; border-color: #0a4b78; box-shadow: inset 0 2px 5px -3px #0a4b78 } .wp-core-ui .button-group > .button.active:focus { border-color: #3582c4; box-shadow: inset 0 2px 5px -3px #0a4b78, 0 0 0 1px #3582c4 } @media screen and (max-width: 782px) { .wp-core-ui .button, .wp-core-ui .button.button-large, .wp-core-ui .button.button-small, a.preview, input#publish, input#save-post { padding: 0 14px; line-height: 2.71428571; font-size: 14px; vertical-align: middle; min-height: 40px; margin-bottom: 4px } .wp-core-ui .copy-to-clipboard-container .copy-attachment-url { margin-bottom: 0 } #media-upload.wp-core-ui .button { padding: 0 10px 1px; min-height: 24px; line-height: 22px; font-size: 13px } .media-frame.mode-grid .bulk-select .button { margin-bottom: 0 } .wp-core-ui .save-post-status.button { position: relative; margin: 0 14px 0 10px } .wp-core-ui.wp-customizer .button { font-size: 13px; line-height: 2.15384615; min-height: 30px; margin: 0; vertical-align: inherit } .media-modal-content .media-toolbar-primary .media-button { margin-top: 10px; margin-left: 5px } .interim-login .button.button-large { min-height: 30px; line-height: 2; padding: 0 12px 2px } } /*! This file is auto-generated */ #wp-auth-check-wrap.hidden { display: none } #wp-auth-check-wrap #wp-auth-check-bg { position: fixed; top: 0; bottom: 0; left: 0; right: 0; background: #000; opacity: .7; z-index: 1000010 } #wp-auth-check-wrap #wp-auth-check { position: fixed; left: 50%; overflow: hidden; top: 40px; bottom: 20px; max-height: 415px; width: 380px; margin: 0 0 0 -190px; padding: 30px 0 0; background-color: #f0f0f1; z-index: 1000011; box-shadow: 0 3px 6px rgba(0, 0, 0, .3) } @media screen and (max-width: 380px) { #wp-auth-check-wrap #wp-auth-check { left: 0; width: 100%; margin: 0 } } #wp-auth-check-wrap.fallback #wp-auth-check { max-height: 180px; overflow: auto } #wp-auth-check-wrap #wp-auth-check-form { height: 100%; position: relative; overflow: auto; -webkit-overflow-scrolling: touch } #wp-auth-check-form.loading:before { content: ""; display: block; width: 20px; height: 20px; position: absolute; left: 50%; top: 50%; margin: -10px 0 0 -10px; background: url(../images/spinner.gif) no-repeat center; background-size: 20px 20px; transform: translateZ(0) } @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { #wp-auth-check-form.loading:before { background-image: url(../images/spinner-2x.gif) } } #wp-auth-check-wrap #wp-auth-check-form iframe { height: 98%; width: 100% } #wp-auth-check-wrap .wp-auth-check-close { position: absolute; top: 5px; right: 5px; height: 22px; width: 22px; color: #787c82; text-decoration: none; text-align: center } #wp-auth-check-wrap .wp-auth-check-close:before { content: "\f158"; font: normal 20px/22px dashicons; speak: never; -webkit-font-smoothing: antialiased !important; -moz-osx-font-smoothing: grayscale } #wp-auth-check-wrap .wp-auth-check-close:focus, #wp-auth-check-wrap .wp-auth-check-close:hover { color: #2271b1 } #wp-auth-check-wrap .wp-auth-fallback-expired { outline: 0 } #wp-auth-check-wrap .wp-auth-fallback { font-size: 14px; line-height: 1.5; padding: 0 25px; display: none } #wp-auth-check-wrap.fallback .wp-auth-check-close, #wp-auth-check-wrap.fallback .wp-auth-fallback { display: block } /*! This file is auto-generated */ .media-modal * { box-sizing: content-box } .media-modal input, .media-modal select, .media-modal textarea { box-sizing: border-box } .media-frame, .media-modal { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 12px; -webkit-overflow-scrolling: touch } .media-modal legend { padding: 0; font-size: 13px } .media-modal label { font-size: 13px } .media-modal .legend-inline { position: absolute; transform: translate(-100%, 50%); margin-left: -1%; line-height: 1.2 } .media-frame a { border-bottom: none; color: #2271b1 } .media-frame a:active, .media-frame a:hover { color: #135e96 } .media-frame a:focus { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8); color: #043959; outline: 1px solid transparent } .media-frame a.button { color: #2c3338 } .media-frame a.button:hover { color: #1d2327 } .media-frame a.button-primary, .media-frame a.button-primary:hover { color: #fff } .media-frame input, .media-frame textarea { padding: 6px 8px } .media-frame select, .wp-admin .media-frame select { min-height: 30px; vertical-align: middle } .media-frame input[type=color], .media-frame input[type=date], .media-frame input[type=datetime-local], .media-frame input[type=datetime], .media-frame input[type=email], .media-frame input[type=month], .media-frame input[type=number], .media-frame input[type=password], .media-frame input[type=search], .media-frame input[type=tel], .media-frame input[type=text], .media-frame input[type=time], .media-frame input[type=url], .media-frame input[type=week], .media-frame select, .media-frame textarea { box-shadow: 0 0 0 transparent; border-radius: 4px; border: 1px solid #8c8f94; background-color: #fff; color: #2c3338; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px } .media-frame input[type=date], .media-frame input[type=datetime-local], .media-frame input[type=datetime], .media-frame input[type=email], .media-frame input[type=month], .media-frame input[type=number], .media-frame input[type=password], .media-frame input[type=search], .media-frame input[type=tel], .media-frame input[type=text], .media-frame input[type=time], .media-frame input[type=url], .media-frame input[type=week] { padding: 0 8px; line-height: 2.15384615 } .media-frame.mode-grid .wp-filter input[type=search] { font-size: 14px; line-height: 2 } .media-frame input[type=email]:focus, .media-frame input[type=number]:focus, .media-frame input[type=password]:focus, .media-frame input[type=search]:focus, .media-frame input[type=text]:focus, .media-frame input[type=url]:focus, .media-frame select:focus, .media-frame textarea:focus { border-color: #3582c4; box-shadow: 0 0 0 1px #3582c4; outline: 2px solid transparent } .media-frame input:disabled, .media-frame input[readonly], .media-frame textarea:disabled, .media-frame textarea[readonly] { background-color: #f0f0f1 } .media-frame input[type=search] { -webkit-appearance: textfield } .media-frame ::-webkit-input-placeholder { color: #646970 } .media-frame ::-moz-placeholder { color: #646970; opacity: 1 } .media-frame :-ms-input-placeholder { color: #646970 } .media-frame .hidden, .media-frame .setting.hidden { display: none } /*! * jQuery UI Draggable/Sortable 1.11.4 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ .ui-draggable-handle, .ui-sortable-handle { touch-action: none } .media-modal { position: fixed; top: 30px; left: 30px; right: 30px; bottom: 30px; z-index: 160000 } .wp-customizer .media-modal { z-index: 560000 } .media-modal-backdrop { position: fixed; top: 0; left: 0; right: 0; bottom: 0; min-height: 360px; background: #000; opacity: .7; z-index: 159900 } .wp-customizer .media-modal-backdrop { z-index: 559900 } .media-modal-close { position: absolute; top: 0; right: 0; width: 50px; height: 50px; margin: 0; padding: 0; border: 1px solid transparent; background: 0 0; color: #646970; z-index: 1000; cursor: pointer; outline: 0; transition: color .1s ease-in-out, background .1s ease-in-out } .media-modal-close:active, .media-modal-close:hover { color: #135e96 } .media-modal-close:focus { color: #135e96; border-color: #4f94d4; box-shadow: 0 0 3px rgba(34, 113, 177, .8); outline: 2px solid transparent } .media-modal-close span.media-modal-icon { background-image: none } .media-modal-close .media-modal-icon:before { content: "\f158"; font: normal 20px/1 dashicons; speak: never; vertical-align: middle; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .media-modal-content { position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: auto; min-height: 300px; box-shadow: 0 5px 15px rgba(0, 0, 0, .7); background: #fff; -webkit-font-smoothing: subpixel-antialiased } .media-modal-content .media-frame select.attachment-filters { margin-top: 32px; margin-right: 2%; width: 42%; width: calc(48% - 12px) } .media-modal-content .attachments-browser .search { width: 100% } .wp-core-ui .media-modal-icon { background-image: url(../images/uploader-icons.png); background-repeat: no-repeat } .media-toolbar { position: absolute; top: 0; left: 0; right: 0; z-index: 100; height: 60px; padding: 0 16px; border: 0 solid #dcdcde; overflow: hidden } .media-frame-toolbar .media-toolbar { top: auto; bottom: -47px; height: auto; overflow: visible; border-top: 1px solid #dcdcde } .media-toolbar-primary { float: right; height: 100%; position: relative } .media-toolbar-secondary { float: left; height: 100% } .media-toolbar-primary > .media-button, .media-toolbar-primary > .media-button-group { margin-left: 10px; float: left; margin-top: 15px } .media-toolbar-secondary > .media-button, .media-toolbar-secondary > .media-button-group { margin-right: 10px; margin-top: 15px } .media-sidebar { position: absolute; top: 0; right: 0; bottom: 0; width: 267px; padding: 0 16px; z-index: 75; background: #f6f7f7; border-left: 1px solid #dcdcde; overflow: auto; -webkit-overflow-scrolling: touch } .media-sidebar::after { content: ""; display: flex; clear: both; height: 24px } .hide-toolbar .media-sidebar { bottom: 0 } .image-details h2:not(.media-attachments-filter-heading), .media-sidebar h2 { position: relative; font-weight: 600; text-transform: uppercase; font-size: 12px; color: #646970; margin: 24px 0 8px } .attachment-details .setting, .media-sidebar .setting { display: block; float: left; width: 100%; margin: 0 0 10px } .media-sidebar .collection-settings .setting { margin: 1px 0 } .attachment-details .setting.has-description, .media-sidebar .setting.has-description { margin-bottom: 5px } .media-sidebar .setting .link-to-custom { margin: 3px 2px 0 } .attachment-details .setting .name, .attachment-details .setting span, .media-sidebar .setting .name, .media-sidebar .setting .value, .media-sidebar .setting span { min-width: 30%; margin-right: 4%; font-size: 12px; text-align: right; word-wrap: break-word } .media-sidebar .setting .name { max-width: 80px } .media-sidebar .setting .value { text-align: left } .media-sidebar .setting select { max-width: 65% } .attachment-details .field input[type=checkbox], .attachment-details .field input[type=radio], .attachment-details .setting input[type=checkbox], .attachment-details .setting input[type=radio], .media-sidebar .field input[type=checkbox], .media-sidebar .field input[type=radio], .media-sidebar .setting input[type=checkbox], .media-sidebar .setting input[type=radio] { float: none; margin: 8px 3px 0; padding: 0 } .attachment-details .setting .name, .attachment-details .setting .value, .attachment-details .setting span, .compat-item label span, .media-sidebar .checkbox-label-inline, .media-sidebar .setting .name, .media-sidebar .setting .value, .media-sidebar .setting span { float: left; min-height: 22px; padding-top: 8px; line-height: 1.33333333; font-weight: 400; color: #646970 } .media-sidebar .checkbox-label-inline { font-size: 12px } .attachment-details .copy-to-clipboard-container, .media-sidebar .copy-to-clipboard-container { flex-wrap: wrap; margin-top: 10px; margin-left: calc(35% - 1px); padding-top: 10px } .attachment-details .attachment-info .copy-to-clipboard-container { float: none } .attachment-details .copy-to-clipboard-container .success, .media-sidebar .copy-to-clipboard-container .success { padding: 0; min-height: 0; line-height: 2.18181818; text-align: left; color: #008a20 } .compat-item label span { text-align: right } .attachment-details .setting .value, .attachment-details .setting input[type=email], .attachment-details .setting input[type=number], .attachment-details .setting input[type=password], .attachment-details .setting input[type=search], .attachment-details .setting input[type=tel], .attachment-details .setting input[type=text], .attachment-details .setting input[type=url], .attachment-details .setting textarea, .attachment-details .setting + .description, .media-sidebar .setting .value, .media-sidebar .setting input[type=email], .media-sidebar .setting input[type=number], .media-sidebar .setting input[type=password], .media-sidebar .setting input[type=search], .media-sidebar .setting input[type=tel], .media-sidebar .setting input[type=text], .media-sidebar .setting input[type=url], .media-sidebar .setting textarea { box-sizing: border-box; margin: 1px; width: 65%; float: right } .attachment-details .setting .value, .attachment-details .setting + .description, .media-sidebar .setting .value { margin: 0 1px; text-align: left } .attachment-details .setting + .description { clear: both; font-size: 12px; font-style: normal; margin-bottom: 10px } .attachment-details .setting textarea, .compat-item .field textarea, .media-sidebar .setting textarea { height: 62px; resize: vertical } .compat-item { float: left; width: 100%; overflow: hidden } .compat-item table { width: 100%; table-layout: fixed; border-spacing: 0; border: 0 } .compat-item tr { padding: 2px 0; display: block; overflow: hidden } .compat-item .field, .compat-item .label { display: block; margin: 0; padding: 0 } .compat-item .label { min-width: 30%; margin-right: 4%; float: left; text-align: right } .compat-item .label span { display: block; width: 100% } .compat-item .field { float: right; width: 65%; margin: 1px } .compat-item .field input[type=email], .compat-item .field input[type=number], .compat-item .field input[type=password], .compat-item .field input[type=search], .compat-item .field input[type=tel], .compat-item .field input[type=text], .compat-item .field input[type=url], .compat-item .field textarea { width: 100%; margin: 0; box-sizing: border-box } .sidebar-for-errors .attachment-details, .sidebar-for-errors .compat-item, .sidebar-for-errors .media-sidebar .media-progress-bar, .sidebar-for-errors .upload-details { display: none !important } .media-menu { position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: 0; padding: 50px 0 10px; background: #f6f7f7; border-right-width: 1px; border-right-style: solid; border-right-color: #c3c4c7; -webkit-user-select: none; user-select: none } .media-menu .media-menu-item { display: block; box-sizing: border-box; width: 100%; position: relative; border: 0; margin: 0; padding: 8px 20px; font-size: 14px; line-height: 1.28571428; background: 0 0; color: #2271b1; text-align: left; text-decoration: none; cursor: pointer } .media-menu .media-menu-item:hover { background: rgba(0, 0, 0, .04) } .media-menu .media-menu-item:active { color: #2271b1; outline: 0 } .media-menu .active, .media-menu .active:hover { color: #1d2327; font-weight: 600 } .media-menu .media-menu-item:focus { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8); color: #043959; outline: 1px solid transparent } .media-menu .separator { height: 0; margin: 12px 20px; padding: 0; border-top: 1px solid #dcdcde } .media-router { position: relative; padding: 0 6px; margin: 0; clear: both } .media-router .media-menu-item { position: relative; float: left; border: 0; margin: 0; padding: 8px 10px 9px; height: 18px; line-height: 1.28571428; font-size: 14px; text-decoration: none; background: 0 0; cursor: pointer; transition: none } .media-router .media-menu-item:last-child { border-right: 0 } .media-router .media-menu-item:active, .media-router .media-menu-item:hover { color: #2271b1 } .media-router .active, .media-router .active:hover { color: #1d2327 } .media-router .media-menu-item:focus { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8); color: #043959; outline: 1px solid transparent } .media-router .active, .media-router .media-menu-item.active:last-child { margin: -1px -1px 0; background: #fff; border: 1px solid #dcdcde; border-bottom: none } .media-router .active:after { display: none } .media-frame { overflow: hidden; position: absolute; top: 0; left: 0; right: 0; bottom: 0 } .media-frame-menu { position: absolute; top: 0; left: 0; bottom: 0; width: 200px; z-index: 150 } .media-frame-title { position: absolute; top: 0; left: 200px; right: 0; height: 50px; z-index: 200 } .media-frame-router { position: absolute; top: 50px; left: 200px; right: 0; height: 36px; z-index: 200 } .media-frame-content { position: absolute; top: 84px; left: 200px; right: 0; bottom: 61px; height: auto; width: auto; margin: 0; overflow: auto; background: #fff; border-top: 1px solid #dcdcde } .media-frame-toolbar { position: absolute; left: 200px; right: 0; z-index: 100; bottom: 60px; height: auto } .media-frame.hide-menu .media-frame-content, .media-frame.hide-menu .media-frame-router, .media-frame.hide-menu .media-frame-title, .media-frame.hide-menu .media-frame-toolbar { left: 0 } .media-frame.hide-toolbar .media-frame-content { bottom: 0 } .media-frame.hide-router .media-frame-content { top: 50px } .media-frame.hide-menu .media-frame-menu, .media-frame.hide-menu .media-frame-menu-heading, .media-frame.hide-router .media-frame-router, .media-frame.hide-toolbar .media-frame-toolbar { display: none } .media-frame-title h1 { padding: 0 16px; font-size: 22px; line-height: 2.27272727; margin: 0 } .media-attachments-filter-heading, .media-frame-menu-heading { position: absolute; left: 20px; top: 22px; margin: 0; font-size: 13px; line-height: 1; z-index: 151 } .media-attachments-filter-heading { top: 10px; left: 16px } .mode-grid .media-attachments-filter-heading { top: 0; left: -9999px } .mode-grid .media-frame-actions-heading { display: none } .wp-core-ui .button.media-frame-menu-toggle { display: none } .media-frame-title .suggested-dimensions { font-size: 14px; float: right; margin-right: 20px } .media-frame-content .crop-content { height: 100% } .wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon { margin-right: 300px } .media-frame-content .crop-content .crop-image { display: block; margin: auto; max-width: 100%; max-height: 100% } .media-frame-content .crop-content .upload-errors { position: absolute; width: 300px; top: 50%; left: 50%; margin-left: -150px; margin-right: -150px; z-index: 600000 } .media-frame .media-iframe { overflow: hidden } .media-frame .media-iframe, .media-frame .media-iframe iframe { height: 100%; width: 100%; border: 0 } .media-frame select.attachment-filters { margin-top: 11px; margin-right: 2%; max-width: 42%; max-width: calc(48% - 12px) } .media-frame select.attachment-filters:last-of-type { margin-right: 0; width: auto; max-width: 100% } .media-frame .search { margin: 32px 0 0; padding: 4px; font-size: 13px; color: #3c434a; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; -webkit-appearance: none } .media-toolbar-primary .search { max-width: 100% } .media-frame .media-search-input-label { position: absolute; left: 0; top: 10px; margin: 0; line-height: 1 } .wp-core-ui .attachments { margin: 0; -webkit-overflow-scrolling: touch } .wp-core-ui .attachment { position: relative; float: left; padding: 8px; margin: 0; color: #3c434a; cursor: pointer; list-style: none; text-align: center; -webkit-user-select: none; user-select: none; width: 25%; box-sizing: border-box } .wp-core-ui .attachment.details:focus, .wp-core-ui .attachment:focus, .wp-core-ui .selected.attachment:focus { box-shadow: inset 0 0 2px 3px #fff, inset 0 0 0 7px #4f94d4; outline: 2px solid transparent; outline-offset: -6px } .wp-core-ui .selected.attachment { box-shadow: inset 0 0 0 5px #fff, inset 0 0 0 7px #c3c4c7 } .wp-core-ui .attachment.details { box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #2271b1 } .wp-core-ui .attachment-preview { position: relative; box-shadow: inset 0 0 15px rgba(0, 0, 0, .1), inset 0 0 0 1px rgba(0, 0, 0, .05); background: #f0f0f1; cursor: pointer } .wp-core-ui .attachment-preview:before { content: ""; display: block; padding-top: 100% } .wp-core-ui .attachment .icon { margin: 0 auto; overflow: hidden } .wp-core-ui .attachment .thumbnail { overflow: hidden; position: absolute; top: 0; right: 0; bottom: 0; left: 0; opacity: 1; transition: opacity .1s } .wp-core-ui .attachment .portrait img { max-width: 100% } .wp-core-ui .attachment .landscape img { max-height: 100% } .wp-core-ui .attachment .thumbnail:after { content: ""; display: block; position: absolute; top: 0; left: 0; right: 0; bottom: 0; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .1); overflow: hidden } .wp-core-ui .attachment .thumbnail img { top: 0; left: 0 } .wp-core-ui .attachment .thumbnail .centered { position: absolute; top: 0; left: 0; width: 100%; height: 100%; transform: translate(50%, 50%) } .wp-core-ui .attachment .thumbnail .centered img { transform: translate(-50%, -50%) } .wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon { transform: translate(-50%, -70%) } .wp-core-ui .attachment .filename { position: absolute; left: 0; right: 0; bottom: 0; overflow: hidden; max-height: 100%; word-wrap: break-word; text-align: center; font-weight: 600; background: rgba(255, 255, 255, .8); box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .15) } .wp-core-ui .attachment .filename div { padding: 5px 10px } .wp-core-ui .attachment .thumbnail img { position: absolute } .wp-core-ui .attachment-close { display: block; position: absolute; top: 5px; right: 5px; height: 22px; width: 22px; padding: 0; background-color: #fff; background-position: -96px 4px; border-radius: 3px; box-shadow: 0 0 0 1px rgba(0, 0, 0, .3); transition: none } .wp-core-ui .attachment-close:focus, .wp-core-ui .attachment-close:hover { background-position: -36px 4px } .wp-core-ui .attachment .check { display: none; height: 24px; width: 24px; padding: 0; border: 0; position: absolute; z-index: 10; top: 0; right: 0; outline: 0; background: #f0f0f1; cursor: pointer; box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba(0, 0, 0, .15) } .wp-core-ui .attachment .check .media-modal-icon { display: block; background-position: -1px 0; height: 15px; width: 15px; margin: 5px } .wp-core-ui .attachment .check:hover .media-modal-icon { background-position: -40px 0 } .wp-core-ui .attachment.selected .check { display: block } .wp-core-ui .attachment.details .check, .wp-core-ui .attachment.selected .check:focus, .wp-core-ui .media-frame.mode-grid .attachment.selected .check { background-color: #2271b1; box-shadow: 0 0 0 1px #fff, 0 0 0 2px #2271b1 } .wp-core-ui .attachment.selected .check:focus { outline: 2px solid transparent } .wp-core-ui .attachment.details .check .media-modal-icon, .wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon { background-position: -21px 0 } .wp-core-ui .attachment.details .check:hover .media-modal-icon, .wp-core-ui .attachment.selected .check:focus .media-modal-icon, .wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon { background-position: -60px 0 } .wp-core-ui .media-frame .attachment .describe { position: relative; display: block; width: 100%; margin: 0; padding: 0 8px; font-size: 12px; border-radius: 0 } .media-frame .attachments-browser { position: relative; width: 100%; height: 100%; overflow: hidden } .attachments-browser .media-toolbar { right: 300px; height: 72px; background: #fff } .attachments-browser.hide-sidebar .media-toolbar { right: 0 } .attachments-browser .media-toolbar-primary > .media-button, .attachments-browser .media-toolbar-primary > .media-button-group, .attachments-browser .media-toolbar-secondary > .media-button, .attachments-browser .media-toolbar-secondary > .media-button-group { margin: 10px 0 } .attachments-browser .attachments { padding: 2px 8px 8px } .attachments-browser .uploader-inline, .attachments-browser.has-load-more .attachments-wrapper, .attachments-browser:not(.has-load-more) .attachments { position: absolute; top: 72px; left: 0; right: 300px; bottom: 0; overflow: auto; outline: 0 } .attachments-browser .uploader-inline.hidden { display: none } .attachments-browser .media-toolbar-primary { max-width: 33% } .mode-grid .attachments-browser .media-toolbar-primary { display: flex; align-items: center } .mode-grid .attachments-browser .media-toolbar-mode-select .media-toolbar-primary { display: none } .attachments-browser .media-toolbar-secondary { max-width: 66% } .uploader-inline .close { background-color: transparent; border: 0; cursor: pointer; height: 48px; outline: 0; padding: 0; position: absolute; right: 2px; text-align: center; top: 2px; width: 48px; z-index: 1 } .uploader-inline .close:before { font: normal 30px/1 dashicons !important; color: #50575e; display: inline-block; content: "\f335"; font-weight: 300; margin-top: 1px } .uploader-inline .close:focus { outline: 1px solid #4f94d4; box-shadow: 0 0 3px rgba(34, 113, 177, .8) } .attachments-browser.hide-sidebar .attachments, .attachments-browser.hide-sidebar .uploader-inline { right: 0; margin-right: 0 } .attachments-browser .instructions { display: inline-block; margin-top: 16px; line-height: 1.38461538; font-size: 13px; color: #646970 } .attachments-browser .no-media { padding: 2em 0 0 2em } .more-loaded .attachment:not(.found-media) { background: #dcdcde } .load-more-wrapper { clear: both; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; padding: 1em 0 } .load-more-wrapper .load-more-count { min-width: 100%; margin: 0 0 1em; text-align: center } .load-more-wrapper .load-more { margin: 0 } .media-frame .load-more-wrapper .load-more + .spinner { float: none; margin: 0 -30px 0 10px } .media-frame .load-more-wrapper .load-more.hidden + .spinner { margin: 0 } .load-more-wrapper::after { content: ""; min-width: 100%; order: 1 } .load-more-wrapper .load-more-jump { margin: 0 0 0 12px } .attachment.new-media { outline: 2px dotted #c3c4c7 } .load-more-wrapper { clear: both; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; padding: 1em 0 } .load-more-wrapper .load-more-count { min-width: 100%; margin: 0 0 1em; text-align: center } .load-more-wrapper .load-more { margin: 0 } .media-frame .load-more-wrapper .load-more + .spinner { float: none; margin: 0 -30px 0 10px } .media-frame .load-more-wrapper .load-more.hidden + .spinner { margin: 0 } .load-more-wrapper::after { content: ""; min-width: 100%; order: 1 } .load-more-wrapper .load-more-jump { margin: 0 0 0 12px } .media-progress-bar { position: relative; height: 10px; width: 70%; margin: 10px auto; border-radius: 10px; background: #dcdcde; background: rgba(0, 0, 0, .1) } .media-progress-bar div { height: 10px; min-width: 20px; width: 0; background: #2271b1; border-radius: 10px; transition: width .3s } .media-uploader-status .media-progress-bar { display: none; width: 100% } .uploading.media-uploader-status .media-progress-bar { display: block } .attachment-preview .media-progress-bar { position: absolute; top: 50%; left: 15%; width: 70%; margin: -5px 0 0 } .media-uploader-status { position: relative; margin: 0 auto; padding-bottom: 10px; max-width: 400px } .uploader-inline .media-uploader-status h2 { display: none } .media-uploader-status .upload-details { display: none; font-size: 12px; color: #646970 } .uploading.media-uploader-status .upload-details { display: block } .media-uploader-status .upload-detail-separator { padding: 0 4px } .media-uploader-status .upload-count { color: #3c434a } .media-uploader-status .upload-dismiss-errors, .media-uploader-status .upload-errors { display: none } .errors.media-uploader-status .upload-dismiss-errors, .errors.media-uploader-status .upload-errors { display: block } .media-uploader-status .upload-dismiss-errors { transition: none; text-decoration: none } .upload-errors .upload-error { padding: 12px; margin-bottom: 12px; background: #fff; border-left: 4px solid #d63638; box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1) } .uploader-inline .upload-errors .upload-error { padding: 12px 30px; background-color: #fcf0f1; box-shadow: none } .upload-errors .upload-error-filename { font-weight: 600 } .upload-errors .upload-error-message { display: block; padding-top: 8px; word-wrap: break-word } .uploader-window, .wp-editor-wrap .uploader-editor { top: 0; left: 0; right: 0; bottom: 0; text-align: center; display: none } .uploader-window { position: fixed; z-index: 250000; opacity: 0; transition: opacity 250ms } .wp-editor-wrap .uploader-editor { position: absolute; z-index: 99998; background: rgba(140, 143, 148, .9) } .uploader-window, .wp-editor-wrap .uploader-editor.droppable { background: rgba(10, 75, 120, .9) } .uploader-window-content, .wp-editor-wrap .uploader-editor-content { position: absolute; top: 10px; left: 10px; right: 10px; bottom: 10px; border: 1px dashed #fff } .uploader-window .uploader-editor-title, .uploader-window h1, .wp-editor-wrap .uploader-editor .uploader-editor-title { position: absolute; top: 50%; left: 0; right: 0; transform: translateY(-50%); font-size: 3em; line-height: 1.3; font-weight: 600; color: #fff; margin: 0; padding: 0 10px } .wp-editor-wrap .uploader-editor .uploader-editor-title { display: none } .wp-editor-wrap .uploader-editor.droppable .uploader-editor-title { display: block } .uploader-window .media-progress-bar { margin-top: 20px; max-width: 300px; background: 0 0; border-color: #fff; display: none } .uploader-window .media-progress-bar div { background: #fff } .uploading .uploader-window .media-progress-bar { display: block } .media-frame .uploader-inline { margin-bottom: 20px; padding: 0; text-align: center } .uploader-inline-content { position: absolute; top: 30%; left: 0; right: 0 } .uploader-inline-content .upload-ui { margin: 2em 0 } .uploader-inline-content .post-upload-ui { margin-bottom: 2em } .uploader-inline .has-upload-message .upload-ui { margin: 0 0 4em } .uploader-inline h2 { font-size: 20px; line-height: 1.4; font-weight: 400; margin: 0 } .uploader-inline .has-upload-message .upload-instructions { font-size: 14px; color: #3c434a; font-weight: 400 } .uploader-inline .drop-instructions { display: none } .supports-drag-drop .uploader-inline .drop-instructions { display: block } .uploader-inline p { margin: .5em 0 } .uploader-inline .media-progress-bar { display: none } .uploading.uploader-inline .media-progress-bar { display: block } .uploader-inline .browser { display: inline-block !important } .media-selection { position: absolute; top: 0; left: 0; right: 350px; height: 60px; padding: 0 0 0 16px; overflow: hidden; white-space: nowrap } .media-selection .selection-info { display: inline-block; font-size: 12px; height: 60px; margin-right: 10px; vertical-align: top } .media-selection.editing, .media-selection.empty { display: none } .media-selection.one .edit-selection { display: none } .media-selection .count { display: block; padding-top: 12px; font-size: 14px; line-height: 1.42857142; font-weight: 600 } .media-selection .button-link { float: left; padding: 1px 8px; margin: 1px 8px 1px -8px; line-height: 1.4; border-right: 1px solid #dcdcde; color: #2271b1; text-decoration: none } .media-selection .button-link:focus, .media-selection .button-link:hover { color: #135e96 } .media-selection .button-link:last-child { border-right: 0; margin-right: 0 } .selection-info .clear-selection { color: #d63638 } .selection-info .clear-selection:focus, .selection-info .clear-selection:hover { color: #d63638 } .media-selection .selection-view { display: inline-block; vertical-align: top } .media-selection .attachments { display: inline-block; height: 48px; margin: 6px; padding: 0; overflow: hidden; vertical-align: top } .media-selection .attachment { width: 40px; padding: 0; margin: 4px } .media-selection .attachment .thumbnail { top: 0; right: 0; bottom: 0; left: 0 } .media-selection .attachment .icon { width: 50% } .media-selection .attachment-preview { box-shadow: none; background: 0 0 } .wp-core-ui .media-selection .attachment.details:focus, .wp-core-ui .media-selection .attachment:focus, .wp-core-ui .media-selection .selected.attachment:focus { box-shadow: 0 0 0 1px #fff, 0 0 2px 3px #4f94d4; outline: 2px solid transparent } .wp-core-ui .media-selection .selected.attachment { box-shadow: none } .wp-core-ui .media-selection .attachment.details { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #2271b1 } .media-selection:after { content: ""; display: block; position: absolute; top: 0; right: 0; bottom: 0; width: 25px; background-image: linear-gradient(to left, #fff, rgba(255, 255, 255, 0)) } .media-selection .attachment .filename { display: none } .media-frame .spinner { background: url(../images/spinner.gif) no-repeat; background-size: 20px 20px; float: right; display: inline-block; visibility: hidden; opacity: .7; width: 20px; height: 20px; margin: 0; vertical-align: middle } .media-frame.mode-grid .spinner { margin: 0; float: none; vertical-align: middle } .media-modal .media-toolbar .spinner { float: none; vertical-align: bottom; margin: 0 0 5px 5px } .media-frame .instructions + .spinner.is-active { vertical-align: middle } .media-frame .spinner.is-active { visibility: visible } .attachment-details { position: relative; overflow: auto } .attachment-details .settings-save-status { float: right; text-transform: none; font-weight: 400 } .attachment-details .settings-save-status .spinner { float: none; margin-left: 5px } .attachment-details .settings-save-status .saved { display: none } .attachment-details.save-waiting .settings-save-status .spinner { visibility: visible } .attachment-details.save-complete .settings-save-status .saved { display: inline-block } .attachment-info { overflow: hidden; min-height: 60px; margin-bottom: 16px; line-height: 1.5; color: #646970; border-bottom: 1px solid #dcdcde; padding-bottom: 11px } .attachment-info .wp-media-wrapper { margin-bottom: 8px } .attachment-info .wp-media-wrapper.wp-audio { margin-top: 13px } .attachment-info .filename { font-weight: 600; color: #3c434a; word-wrap: break-word } .attachment-info .thumbnail { position: relative; float: left; max-width: 120px; max-height: 120px; margin-top: 5px; margin-right: 10px; margin-bottom: 5px } .uploading .attachment-info .thumbnail { width: 120px; height: 80px; box-shadow: inset 0 0 15px rgba(0, 0, 0, .1) } .uploading .attachment-info .media-progress-bar { margin-top: 35px } .attachment-info .thumbnail-image:after { content: ""; display: block; position: absolute; top: 0; left: 0; right: 0; bottom: 0; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .15); overflow: hidden } .attachment-info .thumbnail img { display: block; max-width: 120px; max-height: 120px; margin: 0 auto } .attachment-info .details { float: left; font-size: 12px; max-width: 100% } .attachment-info .delete-attachment, .attachment-info .edit-attachment, .attachment-info .trash-attachment, .attachment-info .untrash-attachment { display: block; text-decoration: none; white-space: nowrap } .attachment-details.needs-refresh .attachment-info .edit-attachment { display: none } .attachment-info .edit-attachment { display: block } .media-modal .delete-attachment, .media-modal .trash-attachment, .media-modal .untrash-attachment { display: inline; padding: 0; color: #d63638 } .media-modal .delete-attachment:focus, .media-modal .delete-attachment:hover, .media-modal .trash-attachment:focus, .media-modal .trash-attachment:hover, .media-modal .untrash-attachment:focus, .media-modal .untrash-attachment:hover { color: #d63638 } .attachment-display-settings { width: 100%; float: left; overflow: hidden } .collection-settings { overflow: hidden } .collection-settings .setting input[type=checkbox] { float: left; margin-right: 8px } .collection-settings .setting .name, .collection-settings .setting span { min-width: inherit } .media-modal .imgedit-wrap { position: static } .media-modal .imgedit-wrap .imgedit-panel-content { padding: 16px 16px 0; position: absolute; top: 0; right: 282px; bottom: 0; left: 0; overflow: auto } .media-modal .imgedit-wrap .imgedit-submit { margin-bottom: 16px } .media-modal .imgedit-wrap .imgedit-settings { background: #f6f7f7; border-left: 1px solid #dcdcde; padding: 20px 16px 0; position: absolute; top: 0; right: 0; bottom: 0; width: 250px; overflow: auto } .media-modal .imgedit-wrap .imgedit-save-target { margin: 8px 0 24px } .media-modal .imgedit-group { background: 0 0; border: none; border-bottom: 1px solid #dcdcde; box-shadow: none; margin: 0; margin-bottom: 16px; padding: 0; padding-bottom: 16px; position: relative } .media-modal .imgedit-group:last-of-type { border: none; margin: 0; padding: 0 } .media-modal .imgedit-group-top { margin: 0 } .media-modal .imgedit-group-top h2, .media-modal .imgedit-group-top h2 .button-link { display: inline-block; text-transform: uppercase; font-size: 12px; color: #646970; margin: 0; margin-top: 3px } .media-modal .imgedit-group-top h2 .button-link, .media-modal .imgedit-group-top h2 a { text-decoration: none; color: #646970 } .wp-core-ui.media-modal .image-editor .imgedit-help-toggle, .wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active, .wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover { border: 1px solid transparent; margin: 0; padding: 0; background: 0 0; color: #2271b1; font-size: 20px; line-height: 1; cursor: pointer; box-sizing: content-box; box-shadow: none } .wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus { color: #2271b1; border-color: #4f94d4; box-shadow: 0 0 3px rgba(34, 113, 177, .8); outline: 2px solid transparent } .wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle { margin-top: -3px } .wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle { margin-top: -2px } .media-modal .imgedit-help-toggled span.dashicons:before { content: "\f142" } .media-modal .imgedit-thumbnail-preview { margin: 10px 8px 0 0 } .imgedit-thumbnail-preview-caption { display: block } .media-modal .imgedit-wrap .notice, .media-modal .imgedit-wrap div.updated { margin: 0; margin-bottom: 16px } .embed-url { display: block; position: relative; padding: 16px; margin: 0; z-index: 250; background: #fff; font-size: 18px } .media-frame .embed-url input { font-size: 18px; line-height: 1.22222222; padding: 12px 40px 12px 14px; width: 100%; min-width: 200px; box-shadow: inset 2px 2px 4px -2px rgba(0, 0, 0, .1) } .media-frame .embed-url input::-ms-clear { display: none } .media-frame .embed-url .spinner { position: absolute; top: 32px; right: 26px } .media-frame .embed-loading .embed-url .spinner { visibility: visible } .embed-link-settings, .embed-media-settings { position: absolute; top: 82px; left: 0; right: 0; bottom: 0; padding: 0 16px; overflow: auto } .media-embed .embed-link-settings .link-text { margin-top: 0 } .embed-link-settings::after, .embed-media-settings::after { content: ""; display: flex; clear: both; height: 24px } .media-embed .embed-link-settings { overflow: visible } .embed-preview embed, .embed-preview iframe, .embed-preview img, .mejs-container video { max-width: 100%; vertical-align: middle } .embed-preview a { display: inline-block } .embed-preview img { display: block; height: auto } .mejs-container:focus { outline: 1px solid #4f94d4; box-shadow: 0 0 2px 1px rgba(79, 148, 212, .8) } .image-details .media-modal { left: 140px; right: 140px } .image-details .media-frame-content, .image-details .media-frame-router, .image-details .media-frame-title { left: 0 } .image-details .embed-media-settings { top: 0; overflow: visible; padding: 0 } .image-details .embed-media-settings::after { content: none } .image-details .embed-media-settings, .image-details .embed-media-settings div { box-sizing: border-box } .image-details .column-settings { background: #f6f7f7; border-right: 1px solid #dcdcde; min-height: 100%; width: 55%; position: absolute; top: 0; left: 0 } .image-details .column-settings h2 { margin: 20px; padding-top: 20px; border-top: 1px solid #dcdcde; color: #1d2327 } .image-details .column-image { width: 45%; position: absolute; left: 55%; top: 0 } .image-details .image { margin: 20px } .image-details .image img { max-width: 100%; max-height: 500px } .image-details .advanced-toggle { padding: 0; color: #646970; text-transform: uppercase; text-decoration: none } .image-details .advanced-toggle:active, .image-details .advanced-toggle:hover { color: #646970 } .image-details .advanced-toggle:after { font: normal 20px/1 dashicons; speak: never; vertical-align: top; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f140"; display: inline-block; margin-top: -2px } .image-details .advanced-visible .advanced-toggle:after { content: "\f142" } .image-details .custom-size .custom-size-setting, .image-details .custom-size label { display: block; float: left } .image-details .custom-size .custom-size-setting label { float: none } .image-details .custom-size input { width: 5em } .image-details .custom-size .sep { float: left; margin: 26px 6px 0 } .image-details .custom-size .description { margin-left: 0 } .media-embed .thumbnail { max-width: 100%; max-height: 200px; position: relative; float: left } .media-embed .thumbnail img { max-height: 200px; display: block } .media-embed .thumbnail:after { content: ""; display: block; position: absolute; top: 0; left: 0; right: 0; bottom: 0; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .1); overflow: hidden } .media-embed .setting, .media-embed .setting-group { width: 100%; margin: 10px 0; float: left; display: block; clear: both } .media-embed .setting-group .setting:not(.checkbox-setting) { margin: 0 } .media-embed .setting.has-description { margin-bottom: 5px } .media-embed .description { clear: both; font-style: normal } .media-embed .content-track + .description { line-height: 1.4; max-width: none !important } .media-embed .remove-track { margin-bottom: 10px } .image-details .embed-media-settings .setting, .image-details .embed-media-settings .setting-group { float: none; width: auto } .image-details .actions { margin: 10px 0 } .image-details .hidden { display: none } .media-embed .setting input[type=text], .media-embed .setting textarea, .media-embed fieldset { display: block; width: 100%; max-width: 400px } .image-details .embed-media-settings .setting input[type=text], .image-details .embed-media-settings .setting textarea { max-width: inherit; width: 70% } .image-details .description, .image-details .embed-media-settings .custom-size, .image-details .embed-media-settings .link-target, .image-details .embed-media-settings .setting input.link-to-custom, .image-details .embed-media-settings .setting-group { margin-left: 27%; width: 70% } .image-details .description { font-style: normal; margin-top: 0 } .image-details .embed-media-settings .link-target { margin-top: 16px } .audio-details .checkbox-label, .image-details .checkbox-label, .video-details .checkbox-label { vertical-align: baseline } .media-embed .setting input.hidden, .media-embed .setting textarea.hidden { display: none } .media-embed .setting .name, .media-embed .setting span, .media-embed .setting-group .name { display: inline-block; font-size: 13px; line-height: 1.84615384; color: #646970 } .media-embed .setting span { display: block; width: 200px } .image-details .embed-media-settings .setting .name, .image-details .embed-media-settings .setting span { float: left; width: 25%; text-align: right; margin: 8px 1% 0; line-height: 1.1 } .image-details .embed-media-settings .setting .button-group, .media-frame .setting-group .button-group { width: auto } .media-embed-sidebar { position: absolute; top: 0; left: 440px } .advanced-section, .link-settings { margin-top: 10px } .media-frame .setting .button-group { display: flex; margin: 0 !important; max-width: none !important } .rtl .media-frame, .rtl .media-frame .search, .rtl .media-frame input[type=email], .rtl .media-frame input[type=number], .rtl .media-frame input[type=password], .rtl .media-frame input[type=search], .rtl .media-frame input[type=tel], .rtl .media-frame input[type=text], .rtl .media-frame input[type=url], .rtl .media-frame select, .rtl .media-frame textarea, .rtl .media-modal { font-family: Tahoma, sans-serif } :lang(he-il) .rtl .media-frame, :lang(he-il) .rtl .media-frame .search, :lang(he-il) .rtl .media-frame input[type=email], :lang(he-il) .rtl .media-frame input[type=number], :lang(he-il) .rtl .media-frame input[type=password], :lang(he-il) .rtl .media-frame input[type=search], :lang(he-il) .rtl .media-frame input[type=text], :lang(he-il) .rtl .media-frame input[type=url], :lang(he-il) .rtl .media-frame select, :lang(he-il) .rtl .media-frame textarea, :lang(he-il) .rtl .media-modal { font-family: Arial, sans-serif } @media only screen and (max-width: 900px) { .media-modal .media-frame-title { height: 40px } .media-modal .media-frame-title h1 { line-height: 2.22222222; font-size: 18px } .media-modal-close { width: 42px; height: 42px } .media-frame .media-frame-title { position: static; padding: 0 44px; text-align: center } .media-frame:not(.hide-menu) .media-frame-content, .media-frame:not(.hide-menu) .media-frame-router, .media-frame:not(.hide-menu) .media-frame-toolbar { left: 0 } .media-frame:not(.hide-menu) .media-frame-router { top: 80px } .media-frame:not(.hide-menu) .media-frame-content { top: 114px } .media-frame.hide-router .media-frame-content { top: 80px } .media-frame:not(.hide-menu) .media-frame-menu { position: static; width: 0 } .media-frame:not(.hide-menu) .media-menu { display: none; width: auto; max-width: 80%; overflow: auto; z-index: 2000; top: 75px; left: 50%; transform: translateX(-50%); right: auto; bottom: auto; padding: 5px 0; border: 1px solid #c3c4c7 } .media-frame:not(.hide-menu) .media-menu.visible { display: block } .media-frame:not(.hide-menu) .media-menu > a { padding: 12px 16px; font-size: 16px } .media-frame:not(.hide-menu) .media-menu .separator { margin: 5px 10px } .media-frame-menu-heading { clip: rect(1px, 1px, 1px, 1px); -webkit-clip-path: inset(50%); clip-path: inset(50%); height: 1px; overflow: hidden; padding: 0; width: 1px; word-wrap: normal !important } .wp-core-ui .media-frame:not(.hide-menu) .button.media-frame-menu-toggle { display: inline-flex; align-items: center; position: absolute; left: 50%; transform: translateX(-50%); margin: -6px 0 0; padding: 0 2px 0 12px; font-size: .875rem; font-weight: 600; text-decoration: none; background: 0 0; height: .1%; min-height: 40px } .wp-core-ui .button.media-frame-menu-toggle:active, .wp-core-ui .button.media-frame-menu-toggle:hover { background: 0 0; transform: none } .wp-core-ui .button.media-frame-menu-toggle:focus { outline: 1px solid transparent } .media-sidebar { width: 230px } .attachments-browser .attachments, .attachments-browser .attachments-wrapper, .attachments-browser .media-toolbar, .attachments-browser .uploader-inline, .attachments-browser.has-load-more .attachments-wrapper { right: 262px } .attachment-details .setting, .media-sidebar .setting { margin: 6px 0 } .attachment-details .setting .name, .attachment-details .setting input, .attachment-details .setting textarea, .compat-item label span, .media-sidebar .setting .name, .media-sidebar .setting input, .media-sidebar .setting textarea { float: none; display: inline-block } .attachment-details .setting span, .media-sidebar .checkbox-label-inline, .media-sidebar .setting span { float: none } .media-sidebar .setting .select-label-inline { display: inline } .attachment-details .setting .name, .compat-item label span, .media-sidebar .checkbox-label-inline, .media-sidebar .setting .name { text-align: inherit; min-height: 16px; margin: 0; padding: 8px 2px 2px } .attachment-details .attachment-info .copy-to-clipboard-container, .media-sidebar .setting .copy-to-clipboard-container { margin-left: 0; padding-top: 0 } .attachment-details .attachment-info .copy-attachment-url, .media-sidebar .setting .copy-attachment-url { margin: 0 1px } .attachment-details .setting .value, .media-sidebar .setting .value { float: none; width: auto } .attachment-details .setting input[type=email], .attachment-details .setting input[type=number], .attachment-details .setting input[type=password], .attachment-details .setting input[type=search], .attachment-details .setting input[type=tel], .attachment-details .setting input[type=text], .attachment-details .setting input[type=url], .attachment-details .setting select, .attachment-details .setting textarea, .attachment-details .setting + .description, .media-sidebar .setting input[type=email], .media-sidebar .setting input[type=number], .media-sidebar .setting input[type=password], .media-sidebar .setting input[type=search], .media-sidebar .setting input[type=tel], .media-sidebar .setting input[type=text], .media-sidebar .setting input[type=url], .media-sidebar .setting select, .media-sidebar .setting textarea { float: none; width: 98%; max-width: none; height: auto } .media-frame .media-toolbar input[type=search] { line-height: 2.25 } .attachment-details .setting select.columns, .media-sidebar .setting select.columns { width: auto } .media-frame .search, .media-frame input, .media-frame textarea { padding: 3px 6px } .wp-admin .media-frame select { min-height: 40px; font-size: 16px; line-height: 1.625; padding: 5px 24px 5px 8px } .image-details .column-image { width: 30%; left: 70% } .image-details .column-settings { width: 70% } .image-details .media-modal { left: 30px; right: 30px } .image-details .embed-media-settings .setting, .image-details .embed-media-settings .setting-group { margin: 20px } .image-details .embed-media-settings .setting .name, .image-details .embed-media-settings .setting span { float: none; text-align: left; width: 100%; margin-bottom: 4px; margin-left: 0 } .media-modal .legend-inline { position: static; transform: none; margin-left: 0; margin-bottom: 6px } .image-details .embed-media-settings .setting-group .setting { margin-bottom: 0 } .image-details .embed-media-settings .setting input.link-to-custom, .image-details .embed-media-settings .setting input[type=text], .image-details .embed-media-settings .setting textarea { width: 100%; margin-left: 0 } .image-details .embed-media-settings .setting.has-description { margin-bottom: 5px } .image-details .description { width: auto; margin: 0 20px } .image-details .embed-media-settings .custom-size { margin-left: 20px } .collection-settings .setting input[type=checkbox] { float: none; margin-top: 0 } .media-selection { min-width: 120px } .media-selection:after { background: 0 0 } .media-selection .attachments { display: none } .media-modal .attachments-browser .media-toolbar .search { max-width: 100%; height: auto; float: right } .media-modal .attachments-browser .media-toolbar .attachment-filters { height: auto } .media-frame input[type=email], .media-frame input[type=number], .media-frame input[type=password], .media-frame input[type=search], .media-frame input[type=text], .media-frame input[type=url], .media-frame select, .media-frame textarea { font-size: 16px } .media-frame .media-toolbar input[type=search] { line-height: 2.3755 } .media-modal .media-toolbar .spinner { margin-bottom: 10px } } @media screen and (max-width: 782px) { .attachments-browser .media-toolbar { height: 82px } .attachments-browser .attachments, .attachments-browser .uploader-inline { top: 82px } .media-frame-toolbar .media-toolbar { bottom: -54px } .mode-grid .attachments-browser .media-toolbar-primary { display: block } .attachment-details .copy-to-clipboard-container .success, .media-sidebar .copy-to-clipboard-container .success { font-size: 14px; line-height: 2.71428571 } } @media only screen and (max-width: 640px), screen and (max-height: 400px) { .image-details .media-modal, .media-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0 } .media-modal-backdrop { position: fixed } .media-sidebar { z-index: 1900; max-width: 70%; bottom: 120%; box-sizing: border-box; padding-bottom: 0 } .media-sidebar.visible { bottom: 0 } .attachments-browser .attachments, .attachments-browser .media-toolbar, .attachments-browser .uploader-inline, .media-frame-content .attachments-browser .attachments-wrapper { right: 0 } .attachments-browser .attachments-wrapper { padding-top: 12px } .image-details .media-frame-title { display: block; top: 0; font-size: 14px } .image-details .column-image, .image-details .column-settings { width: 100%; position: relative; left: 0 } .image-details .column-settings { padding: 4px 0 } .media-frame-content .media-toolbar .instructions { display: none } .load-more-wrapper .load-more-jump { margin: 12px 0 0 } } @media only screen and (min-width: 901px) and (max-height: 400px) { .media-frame:not(.hide-menu) .media-menu, .media-menu { top: 0; padding-top: 44px } .load-more-wrapper .load-more-jump { margin: 12px 0 0 } } @media only screen and (max-width: 480px) { .wp-core-ui.wp-customizer .media-button { margin-top: 13px } } @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { .wp-core-ui .media-modal-icon { background-image: url(./images/uploader-icons-2x.png); background-size: 134px 15px } .media-frame .spinner { background-image: url(../images/spinner-2x.gif) } } .media-frame-content[data-columns="1"] .attachment { width: 100% } .media-frame-content[data-columns="2"] .attachment { width: 50% } .media-frame-content[data-columns="3"] .attachment { width: 33.33% } .media-frame-content[data-columns="4"] .attachment { width: 25% } .media-frame-content[data-columns="5"] .attachment { width: 20% } .media-frame-content[data-columns="6"] .attachment { width: 16.66% } .media-frame-content[data-columns="7"] .attachment { width: 14.28% } .media-frame-content[data-columns="8"] .attachment { width: 12.5% } .media-frame-content[data-columns="9"] .attachment { width: 11.11% } .media-frame-content[data-columns="10"] .attachment { width: 10% } .media-frame-content[data-columns="11"] .attachment { width: 9.09% } .media-frame-content[data-columns="12"] .attachment { width: 8.33% } /*! This file is auto-generated */ .wp-color-picker { width: 80px; direction: ltr } .wp-picker-container .hidden { display: none } .wp-picker-container .wp-color-result.button { min-height: 30px; margin: 0 6px 6px 0; padding: 0 0 0 30px; font-size: 11px } .wp-color-result-text { background: #f6f7f7; border-radius: 0 2px 2px 0; border-left: 1px solid #c3c4c7; color: #50575e; display: block; line-height: 2.54545455; padding: 0 6px; text-align: center } .wp-color-result:focus, .wp-color-result:hover { background: #f6f7f7; border-color: #8c8f94; color: #1d2327 } .wp-color-result:focus:after, .wp-color-result:hover:after { color: #1d2327; border-color: #a7aaad; border-left: 1px solid #8c8f94 } .wp-picker-container { display: inline-block } .wp-color-result:focus { border-color: #4f94d4; box-shadow: 0 0 3px rgba(34, 113, 177, .8) } .wp-color-result:active { transform: none !important } .wp-picker-open + .wp-picker-input-wrap { display: inline-block; vertical-align: top } .wp-picker-input-wrap label { display: inline-block; vertical-align: top } .form-table .wp-picker-input-wrap label { margin: 0 !important } .wp-customizer .wp-picker-input-wrap .button.wp-picker-clear, .wp-customizer .wp-picker-input-wrap .button.wp-picker-default, .wp-picker-input-wrap .button.wp-picker-clear, .wp-picker-input-wrap .button.wp-picker-default { margin-left: 6px; padding: 0 8px; line-height: 2.54545455; min-height: 30px } .wp-picker-container .iris-square-slider .ui-slider-handle:focus { background-color: #50575e } .wp-picker-container .iris-picker { border-radius: 0; border-color: #dcdcde; margin-top: 6px } .wp-picker-container input[type=text].wp-color-picker { width: 4rem; font-size: 12px; font-family: monospace; line-height: 2.33333333; margin: 0; padding: 0 5px; vertical-align: top; min-height: 30px } .wp-color-picker::-webkit-input-placeholder { color: #646970 } .wp-color-picker::-moz-placeholder { color: #646970; opacity: 1 } .wp-color-picker:-ms-input-placeholder { color: #646970 } .wp-picker-container input[type=text].iris-error { background-color: #fcf0f1; border-color: #d63638; color: #000 } .iris-picker .iris-strip .ui-slider-handle:focus, .iris-picker .ui-square-handle:focus { border-color: #3582c4; border-style: solid; box-shadow: 0 0 0 1px #3582c4; outline: 2px solid transparent } .iris-picker .iris-palette:focus { box-shadow: 0 0 0 2px #3582c4 } @media screen and (max-width: 782px) { .wp-picker-container input[type=text].wp-color-picker { width: 5rem; font-size: 16px; line-height: 1.875; min-height: 32px } .wp-customizer .wp-picker-container input[type=text].wp-color-picker { padding: 0 5px } .wp-picker-input-wrap .button.wp-picker-clear, .wp-picker-input-wrap .button.wp-picker-default { padding: 0 8px; line-height: 2.14285714; min-height: 32px } .wp-customizer .wp-picker-input-wrap .button.wp-picker-clear, .wp-customizer .wp-picker-input-wrap .button.wp-picker-default { padding: 0 8px; font-size: 14px; line-height: 2.14285714; min-height: 32px } .wp-picker-container .wp-color-result.button { padding: 0 0 0 40px; font-size: 14px; line-height: 2.14285714 } .wp-customizer .wp-picker-container .wp-color-result.button { font-size: 14px; line-height: 2.14285714 } .wp-picker-container .wp-color-result-text { padding: 0 14px; font-size: inherit; line-height: inherit } .wp-customizer .wp-picker-container .wp-color-result-text { padding: 0 10px } } /*! This file is auto-generated */ .mce-tinymce { box-shadow: none } .mce-container, .mce-container *, .mce-widget, .mce-widget * { color: inherit; font-family: inherit } .mce-container .mce-monospace, .mce-widget .mce-monospace { font-family: Consolas, Monaco, monospace; font-size: 13px; line-height: 150% } #mce-modal-block, #mce-modal-block.mce-fade { opacity: .7; transition: none; background: #000 } .mce-window { border-radius: 0; box-shadow: 0 3px 6px rgba(0, 0, 0, .3); -webkit-font-smoothing: subpixel-antialiased; transition: none } .mce-window .mce-container-body.mce-abs-layout { overflow: visible } .mce-window .mce-window-head { background: #fff; border-bottom: 1px solid #dcdcde; padding: 0; min-height: 36px } .mce-window .mce-window-head .mce-title { color: #3c434a; font-size: 18px; font-weight: 600; line-height: 36px; margin: 0; padding: 0 36px 0 16px } .mce-window .mce-window-head .mce-close, .mce-window-head .mce-close .mce-i-remove { color: transparent; top: 0; right: 0; width: 36px; height: 36px; padding: 0; line-height: 36px; text-align: center } .mce-window-head .mce-close .mce-i-remove:before { font: normal 20px/36px dashicons; text-align: center; color: #646970; width: 36px; height: 36px; display: block } .mce-window-head .mce-close:focus .mce-i-remove:before, .mce-window-head .mce-close:hover .mce-i-remove:before { color: #135e96 } .mce-window-head .mce-close:focus .mce-i-remove, div.mce-tab:focus { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8) } .mce-window .mce-window-head .mce-dragh { width: calc(100% - 36px) } .mce-window .mce-foot { border-top: 1px solid #dcdcde } #wp-link .query-results, .mce-checkbox i.mce-i-checkbox, .mce-textbox { border: 1px solid #dcdcde; border-radius: 0; box-shadow: inset 0 1px 2px rgba(0, 0, 0, .07); transition: .05s all ease-in-out } #wp-link .query-results:focus, .mce-checkbox:focus i.mce-i-checkbox, .mce-textbox.mce-focus, .mce-textbox:focus { border-color: #4f94d4; box-shadow: 0 0 2px rgba(79, 148, 212, .8) } .mce-window .mce-wp-help { height: 360px; width: 460px; overflow: auto } .mce-window .mce-wp-help * { box-sizing: border-box } .mce-window .mce-wp-help > .mce-container-body { width: auto !important } .mce-window .wp-editor-help { padding: 10px 10px 0 20px } .mce-window .wp-editor-help h2, .mce-window .wp-editor-help p { margin: 8px 0; white-space: normal; font-size: 14px; font-weight: 400 } .mce-window .wp-editor-help table { width: 100%; margin-bottom: 20px } .mce-window .wp-editor-help table.wp-help-single { margin: 0 8px 20px } .mce-window .wp-editor-help table.fixed { table-layout: fixed } .mce-window .wp-editor-help table.fixed td:nth-child(odd), .mce-window .wp-editor-help table.fixed th:nth-child(odd) { width: 12% } .mce-window .wp-editor-help table.fixed td:nth-child(even), .mce-window .wp-editor-help table.fixed th:nth-child(even) { width: 38% } .mce-window .wp-editor-help table.fixed th:nth-child(odd) { padding: 5px 0 0 } .mce-window .wp-editor-help td, .mce-window .wp-editor-help th { font-size: 13px; padding: 5px; vertical-align: middle; word-wrap: break-word; white-space: normal } .mce-window .wp-editor-help th { font-weight: 600; padding-bottom: 0 } .mce-window .wp-editor-help kbd { font-family: monospace; padding: 2px 7px 3px; font-weight: 600; margin: 0; background: #f0f0f1; background: rgba(0, 0, 0, .08) } .mce-window .wp-help-th-center td:nth-child(odd), .mce-window .wp-help-th-center th:nth-child(odd) { text-align: center } .mce-floatpanel.mce-popover, .mce-menu { border-color: rgba(0, 0, 0, .15); border-radius: 0; box-shadow: 0 3px 5px rgba(0, 0, 0, .2) } .mce-floatpanel.mce-popover.mce-bottom, .mce-menu { margin-top: 2px } .mce-floatpanel .mce-arrow { display: none } .mce-menu .mce-container-body { min-width: 160px } .mce-menu-item { border: none; margin-bottom: 2px; padding: 6px 15px 6px 12px } .mce-menu-has-icons i.mce-ico { line-height: 20px } div.mce-panel { border: 0; background: #fff } .mce-panel.mce-menu { border: 1px solid #dcdcde } div.mce-tab { line-height: 13px } div.mce-toolbar-grp { border-bottom: 1px solid #dcdcde; background: #f6f7f7; padding: 0; position: relative } div.mce-inline-toolbar-grp { border: 1px solid #a7aaad; border-radius: 2px; box-shadow: 0 1px 3px rgba(0, 0, 0, .15); box-sizing: border-box; margin-bottom: 8px; position: absolute; -webkit-user-select: none; user-select: none; max-width: 98%; z-index: 100100 } div.mce-inline-toolbar-grp > div.mce-stack-layout { padding: 1px } div.mce-inline-toolbar-grp.mce-arrow-up { margin-bottom: 0; margin-top: 8px } div.mce-inline-toolbar-grp:after, div.mce-inline-toolbar-grp:before { position: absolute; left: 50%; display: block; width: 0; height: 0; border-style: solid; border-color: transparent; content: "" } div.mce-inline-toolbar-grp.mce-arrow-up:before { top: -9px; border-bottom-color: #a7aaad; border-width: 0 9px 9px; margin-left: -9px } div.mce-inline-toolbar-grp.mce-arrow-down:before { bottom: -9px; border-top-color: #a7aaad; border-width: 9px 9px 0; margin-left: -9px } div.mce-inline-toolbar-grp.mce-arrow-up:after { top: -8px; border-bottom-color: #f6f7f7; border-width: 0 8px 8px; margin-left: -8px } div.mce-inline-toolbar-grp.mce-arrow-down:after { bottom: -8px; border-top-color: #f6f7f7; border-width: 8px 8px 0; margin-left: -8px } div.mce-inline-toolbar-grp.mce-arrow-left:after, div.mce-inline-toolbar-grp.mce-arrow-left:before { margin: 0 } div.mce-inline-toolbar-grp.mce-arrow-left:before { left: 20px } div.mce-inline-toolbar-grp.mce-arrow-left:after { left: 21px } div.mce-inline-toolbar-grp.mce-arrow-right:after, div.mce-inline-toolbar-grp.mce-arrow-right:before { left: auto; margin: 0 } div.mce-inline-toolbar-grp.mce-arrow-right:before { right: 20px } div.mce-inline-toolbar-grp.mce-arrow-right:after { right: 21px } div.mce-inline-toolbar-grp.mce-arrow-full { right: 0 } div.mce-inline-toolbar-grp.mce-arrow-full > div { width: 100%; overflow-x: auto } div.mce-toolbar-grp > div { padding: 3px } .has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first { padding-right: 32px } .mce-toolbar .mce-btn-group { margin: 0 } .block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child) { display: none } .block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar { display: block } div.mce-statusbar { border-top: 1px solid #dcdcde } div.mce-path { padding: 2px 10px; margin: 0 } .mce-path, .mce-path .mce-divider, .mce-path-item { font-size: 12px } .mce-toolbar .mce-btn, .qt-dfw { border-color: transparent; background: 0 0; box-shadow: none; text-shadow: none; cursor: pointer } .mce-btn .mce-txt { direction: inherit; text-align: inherit } .mce-toolbar .mce-btn-group .mce-btn, .qt-dfw { border: 1px solid transparent; margin: 2px; border-radius: 2px } .mce-toolbar .mce-btn-group .mce-btn:focus, .mce-toolbar .mce-btn-group .mce-btn:hover, .qt-dfw:focus, .qt-dfw:hover { background: #f6f7f7; border-color: #50575e; color: #1d2327; box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0, 0, 0, .08); outline: 0 } .mce-toolbar .mce-btn-group .mce-btn.mce-active, .mce-toolbar .mce-btn-group .mce-btn:active, .qt-dfw.active { background: #f0f0f1; border-color: #50575e; box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .3) } .mce-btn.mce-active, .mce-btn.mce-active button, .mce-btn.mce-active i, .mce-btn.mce-active:hover button, .mce-btn.mce-active:hover i { color: inherit } .mce-toolbar .mce-btn-group .mce-btn.mce-active:focus, .mce-toolbar .mce-btn-group .mce-btn.mce-active:hover { border-color: #1d2327 } .mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus, .mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover { color: #a7aaad; background: 0 0; border-color: #dcdcde; text-shadow: 0 1px 0 #fff; box-shadow: none } .mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus { border-color: #50575e } .mce-toolbar .mce-btn-group .mce-first, .mce-toolbar .mce-btn-group .mce-last { border-color: transparent } .mce-toolbar .mce-btn button, .qt-dfw { padding: 2px 3px; line-height: normal } .mce-toolbar .mce-listbox button { font-size: 13px; line-height: 1.53846153; padding-left: 6px; padding-right: 20px } .mce-toolbar .mce-btn i { text-shadow: none } .mce-toolbar .mce-btn-group > div { white-space: normal } .mce-toolbar .mce-colorbutton .mce-open { border-right: 0 } .mce-toolbar .mce-colorbutton .mce-preview { margin: 0; padding: 0; top: auto; bottom: 2px; left: 3px; height: 3px; width: 20px; background: #50575e } .mce-toolbar .mce-btn-group .mce-btn.mce-primary { min-width: 0; background: #3582c4; border-color: #2271b1 #135e96 #135e96; box-shadow: 0 1px 0 #135e96; color: #fff; text-decoration: none; text-shadow: none } .mce-toolbar .mce-btn-group .mce-btn.mce-primary button { padding: 2px 3px 1px } .mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico { color: #fff } .mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus, .mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover { background: #4f94d4; border-color: #135e96; color: #fff } .mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus { box-shadow: 0 0 1px 1px #72aee6 } .mce-toolbar .mce-btn-group .mce-btn.mce-primary:active { background: #2271b1; border-color: #135e96; box-shadow: inset 0 2px 0 #135e96 } .mce-toolbar .mce-btn-group .mce-btn.mce-listbox { border-radius: 0; direction: ltr; background: #fff; border: 1px solid #dcdcde; box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, .2) } .mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus, .mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover { border-color: #c3c4c7 } .mce-panel .mce-btn i.mce-caret { border-top: 6px solid #50575e; margin-left: 2px; margin-right: 2px } .mce-listbox i.mce-caret { right: 4px } .mce-panel .mce-btn:focus i.mce-caret, .mce-panel .mce-btn:hover i.mce-caret { border-top-color: #1d2327 } .mce-panel .mce-active i.mce-caret { border-top: 0; border-bottom: 6px solid #1d2327; margin-top: 7px } .mce-listbox.mce-active i.mce-caret { margin-top: -3px } .mce-toolbar .mce-splitbtn:hover .mce-open { border-right-color: transparent } .mce-toolbar .mce-splitbtn .mce-open.mce-active { background: 0 0; outline: 0 } .mce-menu .mce-menu-item.mce-active.mce-menu-item-normal, .mce-menu .mce-menu-item.mce-active.mce-menu-item-preview, .mce-menu .mce-menu-item.mce-selected, .mce-menu .mce-menu-item:focus, .mce-menu .mce-menu-item:hover { background: #2271b1; color: #fff } .mce-menu .mce-menu-item.mce-selected .mce-caret, .mce-menu .mce-menu-item:focus .mce-caret, .mce-menu .mce-menu-item:hover .mce-caret { border-left-color: #fff } .rtl .mce-menu .mce-menu-item.mce-selected .mce-caret, .rtl .mce-menu .mce-menu-item:focus .mce-caret, .rtl .mce-menu .mce-menu-item:hover .mce-caret { border-left-color: inherit; border-right-color: #fff } .mce-menu .mce-menu-item.mce-active .mce-menu-shortcut, .mce-menu .mce-menu-item.mce-disabled:hover .mce-ico, .mce-menu .mce-menu-item.mce-disabled:hover .mce-text, .mce-menu .mce-menu-item.mce-selected .mce-ico, .mce-menu .mce-menu-item.mce-selected .mce-text, .mce-menu .mce-menu-item:focus .mce-ico, .mce-menu .mce-menu-item:focus .mce-menu-shortcut, .mce-menu .mce-menu-item:focus .mce-text, .mce-menu .mce-menu-item:hover .mce-ico, .mce-menu .mce-menu-item:hover .mce-menu-shortcut, .mce-menu .mce-menu-item:hover .mce-text { color: inherit } .mce-menu .mce-menu-item.mce-disabled { cursor: default } .mce-menu .mce-menu-item.mce-disabled:hover { background: #c3c4c7 } div.mce-menubar { border-color: #dcdcde; background: #fff; border-width: 0 0 1px } .mce-menubar .mce-menubtn.mce-active, .mce-menubar .mce-menubtn:focus, .mce-menubar .mce-menubtn:hover { border-color: transparent; background: 0 0 } .mce-menubar .mce-menubtn:focus { color: #043959; box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8) } .mce-menu-item-sep:hover, div.mce-menu .mce-menu-item-sep { border-bottom: 1px solid #dcdcde; height: 0; margin: 5px 0 } .mce-menubtn span { margin-right: 0; padding-left: 3px } .mce-menu-has-icons i.mce-ico:before { margin-left: -2px } .mce-menu.mce-menu-align .mce-menu-item-normal { position: relative } .mce-menu.mce-menu-align .mce-menu-shortcut { bottom: .6em; font-size: .9em } .mce-primary button, .mce-primary button i { text-align: center; color: #fff; text-shadow: none; padding: 0; line-height: 1.85714285 } .mce-window .mce-btn { color: #50575e; background: #f6f7f7; text-decoration: none; font-size: 13px; line-height: 26px; height: 28px; margin: 0; padding: 0; cursor: pointer; border: 1px solid #c3c4c7; -webkit-appearance: none; border-radius: 3px; white-space: nowrap; box-shadow: 0 1px 0 #c3c4c7 } .mce-window .mce-btn::-moz-focus-inner { border-width: 0; border-style: none; padding: 0 } .mce-window .mce-btn:focus, .mce-window .mce-btn:hover { background: #f6f7f7; border-color: #8c8f94; color: #1d2327 } .mce-window .mce-btn:focus { border-color: #4f94d4; box-shadow: 0 0 3px rgba(34, 113, 177, .8) } .mce-window .mce-btn:active { background: #f0f0f1; border-color: #8c8f94; box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .5); transform: translateY(1px) } .mce-window .mce-btn.mce-disabled { color: #a7aaad !important; border-color: #dcdcde !important; background: #f6f7f7 !important; box-shadow: none !important; text-shadow: 0 1px 0 #fff !important; cursor: default; transform: none !important } .mce-window .mce-btn.mce-primary { background: #3582c4; border-color: #2271b1 #135e96 #135e96; box-shadow: 0 1px 0 #135e96; color: #fff; text-decoration: none; text-shadow: 0 -1px 1px #135e96, 1px 0 1px #135e96, 0 1px 1px #135e96, -1px 0 1px #135e96 } .mce-window .mce-btn.mce-primary:focus, .mce-window .mce-btn.mce-primary:hover { background: #4f94d4; border-color: #135e96; color: #fff } .mce-window .mce-btn.mce-primary:focus { box-shadow: 0 1px 0 #2271b1, 0 0 2px 1px #72aee6 } .mce-window .mce-btn.mce-primary:active { background: #2271b1; border-color: #135e96; box-shadow: inset 0 2px 0 #135e96; vertical-align: top } .mce-window .mce-btn.mce-primary.mce-disabled { color: #9ec2e6 !important; background: #4f94d4 !important; border-color: #3582c4 !important; box-shadow: none !important; text-shadow: 0 -1px 0 rgba(0, 0, 0, .1) !important; cursor: default } .mce-menubtn.mce-fixed-width span { overflow-x: hidden; text-overflow: ellipsis; width: 82px } .mce-charmap { margin: 3px } .mce-charmap td { padding: 0; border-color: #dcdcde; cursor: pointer } .mce-charmap td:hover { background: #f6f7f7 } .mce-charmap td div { width: 18px; height: 22px; line-height: 1.57142857 } .mce-tooltip { margin-top: 2px } .mce-tooltip-inner { border-radius: 3px; box-shadow: 0 3px 5px rgba(0, 0, 0, .2); color: #fff; font-size: 12px } .mce-ico { font-family: tinymce, Arial } .mce-btn-small .mce-ico { font-family: tinymce-small, Arial } .mce-toolbar .mce-ico { color: #50575e; line-height: 1; width: 20px; height: 20px; text-align: center; text-shadow: none; margin: 0; padding: 0 } .qt-dfw { color: #50575e; line-height: 1; width: 28px; height: 26px; text-align: center; text-shadow: none } .mce-toolbar .mce-btn .mce-open { line-height: 20px } .mce-toolbar .mce-btn.mce-active .mce-open, .mce-toolbar .mce-btn:focus .mce-open, .mce-toolbar .mce-btn:hover .mce-open { border-left-color: #1d2327 } div.mce-notification { left: 10% !important; right: 10% } .mce-notification button.mce-close { right: 6px; top: 3px; font-weight: 400; color: #50575e } .mce-notification button.mce-close:focus, .mce-notification button.mce-close:hover { color: #000 } i.mce-i-aligncenter, i.mce-i-alignjustify, i.mce-i-alignleft, i.mce-i-alignright, i.mce-i-backcolor, i.mce-i-blockquote, i.mce-i-bold, i.mce-i-bullist, i.mce-i-charmap, i.mce-i-dashicon, i.mce-i-dfw, i.mce-i-forecolor, i.mce-i-fullscreen, i.mce-i-help, i.mce-i-hr, i.mce-i-indent, i.mce-i-italic, i.mce-i-link, i.mce-i-ltr, i.mce-i-numlist, i.mce-i-outdent, i.mce-i-pastetext, i.mce-i-pasteword, i.mce-i-redo, i.mce-i-remove, i.mce-i-removeformat, i.mce-i-spellchecker, i.mce-i-strikethrough, i.mce-i-underline, i.mce-i-undo, i.mce-i-unlink, i.mce-i-wp-media-library, i.mce-i-wp_adv, i.mce-i-wp_code, i.mce-i-wp_fullscreen, i.mce-i-wp_help, i.mce-i-wp_more, i.mce-i-wp_page { font: normal 20px/1 dashicons; padding: 0; vertical-align: top; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; margin-left: -2px; padding-right: 2px } .qt-dfw { font: normal 20px/1 dashicons; vertical-align: top; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } i.mce-i-bold:before { content: "\f200" } i.mce-i-italic:before { content: "\f201" } i.mce-i-bullist:before { content: "\f203" } i.mce-i-numlist:before { content: "\f204" } i.mce-i-blockquote:before { content: "\f205" } i.mce-i-alignleft:before { content: "\f206" } i.mce-i-aligncenter:before { content: "\f207" } i.mce-i-alignright:before { content: "\f208" } i.mce-i-link:before { content: "\f103" } i.mce-i-unlink:before { content: "\f225" } i.mce-i-wp_more:before { content: "\f209" } i.mce-i-strikethrough:before { content: "\f224" } i.mce-i-spellchecker:before { content: "\f210" } .qt-dfw:before, i.mce-i-dfw:before, i.mce-i-fullscreen:before, i.mce-i-wp_fullscreen:before { content: "\f211" } i.mce-i-wp_adv:before { content: "\f212" } i.mce-i-underline:before { content: "\f213" } i.mce-i-alignjustify:before { content: "\f214" } i.mce-i-backcolor:before, i.mce-i-forecolor:before { content: "\f215" } i.mce-i-pastetext:before { content: "\f217" } i.mce-i-removeformat:before { content: "\f218" } i.mce-i-charmap:before { content: "\f220" } i.mce-i-outdent:before { content: "\f221" } i.mce-i-indent:before { content: "\f222" } i.mce-i-undo:before { content: "\f171" } i.mce-i-redo:before { content: "\f172" } i.mce-i-help:before, i.mce-i-wp_help:before { content: "\f223" } i.mce-i-wp-media-library:before { content: "\f104" } i.mce-i-ltr:before { content: "\f320" } i.mce-i-wp_page:before { content: "\f105" } i.mce-i-hr:before { content: "\f460" } i.mce-i-remove:before { content: "\f158" } i.mce-i-wp_code:before { content: "\f475" } .rtl i.mce-i-outdent:before { content: "\f222" } .rtl i.mce-i-indent:before { content: "\f221" } .wp-editor-wrap { position: relative } .wp-editor-tools { position: relative; z-index: 1 } .wp-editor-tools:after { clear: both; content: ""; display: table } .wp-editor-container { clear: both; border: 1px solid #dcdcde } .wp-editor-area { font-family: Consolas, Monaco, monospace; font-size: 13px; padding: 10px; margin: 1px 0 0; line-height: 150%; border: 0; outline: 0; display: block; resize: vertical; box-sizing: border-box } .rtl .wp-editor-area { font-family: Tahoma, Monaco, monospace } .locale-he-il .wp-editor-area { font-family: Arial, Monaco, monospace } .wp-editor-container textarea.wp-editor-area { width: 100%; margin: 0; box-shadow: none } .wp-editor-tabs { float: right } .wp-switch-editor { float: left; box-sizing: content-box; position: relative; top: 1px; background: #f0f0f1; color: #646970; cursor: pointer; font-size: 13px; line-height: 1.46153846; height: 20px; margin: 5px 0 0 5px; padding: 3px 8px 4px; border: 1px solid #dcdcde } .wp-switch-editor:focus { box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8); outline: 0; color: #1d2327 } .html-active .switch-html:focus, .tmce-active .switch-tmce:focus, .wp-switch-editor:active { box-shadow: none } .wp-switch-editor:active { background-color: #f6f7f7; box-shadow: none } .js .tmce-active .wp-editor-area { color: #fff } .tmce-active .quicktags-toolbar { display: none } .html-active .switch-html, .tmce-active .switch-tmce { background: #f6f7f7; color: #50575e; border-bottom-color: #f6f7f7 } .wp-media-buttons { float: left } .wp-media-buttons .button { margin-right: 5px; margin-bottom: 4px; padding-left: 7px; padding-right: 7px } .wp-media-buttons .button:active { position: relative; top: 1px; margin-top: -1px; margin-bottom: 1px } .wp-media-buttons .insert-media { padding-left: 5px } .wp-media-buttons a { text-decoration: none; color: #3c434a; font-size: 12px } .wp-media-buttons img { padding: 0 4px; vertical-align: middle } .wp-media-buttons span.wp-media-buttons-icon { display: inline-block; width: 20px; height: 20px; line-height: 1; vertical-align: middle; margin: 0 2px } .wp-media-buttons .add_media span.wp-media-buttons-icon { background: 0 0 } .wp-media-buttons .add_media span.wp-media-buttons-icon:before { font: normal 18px/1 dashicons; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .wp-media-buttons .add_media span.wp-media-buttons-icon:before { content: "\f104" } .mce-content-body dl.wp-caption { max-width: 100% } .quicktags-toolbar { padding: 3px; position: relative; border-bottom: 1px solid #dcdcde; background: #f6f7f7; min-height: 30px } .has-dfw .quicktags-toolbar { padding-right: 35px } .wp-core-ui .quicktags-toolbar input.button.button-small { margin: 2px } .quicktags-toolbar input[value=link] { text-decoration: underline } .quicktags-toolbar input[value=del] { text-decoration: line-through } .quicktags-toolbar input[value="i"] { font-style: italic } .quicktags-toolbar input[value="b"] { font-weight: 600 } .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw, .qt-dfw { position: absolute; top: 0; right: 0 } .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw { margin: 7px 7px 0 0 } .qt-dfw { margin: 5px 5px 0 0 } .qt-fullscreen { position: static; margin: 2px } @media screen and (max-width: 782px) { .mce-toolbar .mce-btn button, .qt-dfw { padding: 6px 7px } .mce-toolbar .mce-btn-group .mce-btn.mce-primary button { padding: 6px 7px 5px } .mce-toolbar .mce-btn-group .mce-btn { margin: 1px } .qt-dfw { width: 36px; height: 34px } .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw { margin: 4px 4px 0 0 } .mce-toolbar .mce-colorbutton .mce-preview { left: 8px; bottom: 6px } .mce-window .mce-btn { padding: 2px 0 } .has-dfw .quicktags-toolbar, .has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first { padding-right: 40px } } @media screen and (min-width: 782px) { .wp-core-ui .quicktags-toolbar input.button.button-small { font-size: 12px; min-height: 26px; line-height: 2 } } #wp_editbtns, #wp_gallerybtns { padding: 2px; position: absolute; display: none; z-index: 100020 } #wp_delgallery, #wp_delimgbtn, #wp_editgallery, #wp_editimgbtn { background-color: #f0f0f1; margin: 2px; padding: 2px; border: 1px solid #8c8f94; border-radius: 3px } #wp_delgallery:hover, #wp_delimgbtn:hover, #wp_editgallery:hover, #wp_editimgbtn:hover { border-color: #50575e; background-color: #c3c4c7 } #wp-link-wrap { display: none; background-color: #fff; box-shadow: 0 3px 6px rgba(0, 0, 0, .3); width: 500px; overflow: hidden; margin-left: -250px; margin-top: -125px; position: fixed; top: 50%; left: 50%; z-index: 100105; transition: height .2s, margin-top .2s } #wp-link-backdrop { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; min-height: 360px; background: #000; opacity: .7; z-index: 100100 } #wp-link { position: relative; height: 100% } #wp-link-wrap { height: 500px; margin-top: -250px } #wp-link-wrap .wp-link-text-field { display: none } #wp-link-wrap.has-text-field .wp-link-text-field { display: block } #link-modal-title { background: #fff; border-bottom: 1px solid #dcdcde; height: 36px; font-size: 18px; font-weight: 600; line-height: 2; margin: 0; padding: 0 36px 0 16px } #wp-link-close { color: #646970; padding: 0; position: absolute; top: 0; right: 0; width: 36px; height: 36px; text-align: center; background: 0 0; border: none; cursor: pointer } #wp-link-close:before { font: normal 20px/36px dashicons; vertical-align: top; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; width: 36px; height: 36px; content: "\f158" } #wp-link-close:focus, #wp-link-close:hover { color: #135e96 } #wp-link-close:focus { outline: 0; box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, .8); outline: 2px solid transparent; outline-offset: -2px } #wp-link-wrap #link-selector { -webkit-overflow-scrolling: touch; padding: 0 16px; position: absolute; top: 37px; left: 0; right: 0; bottom: 44px } #wp-link ol, #wp-link ul { list-style: none; margin: 0; padding: 0 } #wp-link input[type=text] { box-sizing: border-box } #wp-link #link-options { padding: 8px 0 12px } #wp-link p.howto { margin: 3px 0 } #wp-link p.howto a { text-decoration: none; color: inherit } #wp-link label input[type=text] { margin-top: 5px; width: 70% } #wp-link #link-options label span, #wp-link #search-panel label span.search-label { display: inline-block; width: 80px; text-align: right; padding-right: 5px; max-width: 24%; vertical-align: middle; word-wrap: break-word } #wp-link .link-search-field { width: 250px; max-width: 70% } #wp-link .link-search-wrapper { margin: 5px 0 9px; display: block; overflow: hidden } #wp-link .link-search-wrapper .spinner { float: none; margin: -3px 0 0 4px } #wp-link .link-target { padding: 3px 0 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis } #wp-link .link-target label { max-width: 70% } #wp-link .query-results { border: 1px #dcdcde solid; margin: 0 0 12px; background: #fff; overflow: auto; position: absolute; left: 16px; right: 16px; bottom: 0; top: 166px } .has-text-field #wp-link .query-results { top: 210px } #wp-link li { clear: both; margin-bottom: 0; border-bottom: 1px solid #f0f0f1; color: #2c3338; padding: 4px 6px 4px 10px; cursor: pointer; position: relative } #wp-link .query-notice { padding: 0; border-bottom: 1px solid #dcdcde; background-color: #fff; color: #000 } #wp-link .query-notice .query-notice-default, #wp-link .query-notice .query-notice-hint { display: block; padding: 6px; border-left: 4px solid #72aee6 } #wp-link .unselectable.no-matches-found { padding: 0; border-bottom: 1px solid #dcdcde; background-color: #f6f7f7 } #wp-link .no-matches-found .item-title { display: block; padding: 6px; border-left: 4px solid #d63638 } #wp-link .query-results em { font-style: normal } #wp-link li:hover { background: #f0f6fc; color: #101517 } #wp-link li.unselectable { border-bottom: 1px solid #dcdcde } #wp-link li.unselectable:hover { background: #fff; cursor: auto; color: #2c3338 } #wp-link li.selected { background: #dcdcde; color: #2c3338 } #wp-link li.selected .item-title { font-weight: 600 } #wp-link li:last-child { border: none } #wp-link .item-title { display: inline-block; width: 80%; width: calc(100% - 68px); word-wrap: break-word } #wp-link .item-info { text-transform: uppercase; color: #646970; font-size: 11px; position: absolute; right: 5px; top: 5px } #wp-link .river-waiting { display: none; padding: 10px 0 } #wp-link .submitbox { padding: 8px 16px; background: #fff; border-top: 1px solid #dcdcde; position: absolute; bottom: 0; left: 0; right: 0 } #wp-link-cancel { line-height: 1.92307692; float: left } #wp-link-update { line-height: 1.76923076; float: right } #wp-link-submit { float: right } @media screen and (max-width: 782px) { #wp-link-wrap { margin-top: -140px } #wp-link-wrap .query-results { top: 195px } #wp-link-wrap.has-text-field .query-results { top: 235px } #link-selector { padding: 0 16px 60px } #wp-link-wrap #link-selector { bottom: 52px } #wp-link-cancel { line-height: 2.46153846 } #wp-link .link-target { padding-top: 10px } #wp-link .submitbox .button { margin-bottom: 0 } } @media screen and (max-width: 520px) { #wp-link-wrap { width: auto; margin-left: 0; left: 10px; right: 10px; max-width: 500px } } @media screen and (max-height: 520px) { #wp-link-wrap { transition: none; height: auto; margin-top: 0; top: 10px; bottom: 10px } #link-selector { overflow: auto } #search-panel .query-results { position: static } } @media screen and (max-height: 290px) { #wp-link-wrap { height: auto; margin-top: 0; top: 10px; bottom: 10px } #link-selector { overflow: auto; height: calc(100% - 92px); padding-bottom: 2px } #search-panel .query-results { position: static } } div.wp-link-preview { float: left; margin: 5px; max-width: 694px; overflow: hidden; text-overflow: ellipsis } div.wp-link-preview a { color: #2271b1; text-decoration: underline; transition-property: border, background, color; transition-duration: .05s; transition-timing-function: ease-in-out; cursor: pointer } div.wp-link-preview a.wplink-url-error { color: #d63638 } div.wp-link-input { float: left; margin: 2px; max-width: 694px } div.wp-link-input input { width: 300px; padding: 3px; box-sizing: border-box; line-height: 1.28571429; min-height: 26px } .mce-toolbar div.wp-link-input ~ .mce-btn, .mce-toolbar div.wp-link-preview ~ .mce-btn { margin: 2px 1px } .mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child { margin-right: 2px } .ui-autocomplete.wplink-autocomplete { z-index: 100110; max-height: 200px; overflow-y: auto; padding: 0; margin: 0; list-style: none; position: absolute; border: 1px solid #4f94d4; box-shadow: 0 1px 2px rgba(79, 148, 212, .8); background-color: #fff } .ui-autocomplete.wplink-autocomplete li { margin-bottom: 0; padding: 4px 10px; clear: both; white-space: normal; text-align: left } .ui-autocomplete.wplink-autocomplete li .wp-editor-float-right { float: right } .ui-autocomplete.wplink-autocomplete li.ui-state-focus { background-color: #dcdcde; cursor: pointer } @media screen and (max-width: 782px) { div.wp-link-input, div.wp-link-preview { max-width: 70%; max-width: calc(100% - 86px) } div.wp-link-preview { margin: 8px 0 8px 5px } div.wp-link-input { width: 300px } div.wp-link-input input { width: 100%; font-size: 16px; padding: 5px } } .mce-fullscreen { z-index: 100010 } .rtl .quicktags-toolbar input, .rtl .wp-switch-editor { font-family: Tahoma, sans-serif } .mce-rtl .mce-flow-layout .mce-flow-layout-item > div { direction: rtl } .mce-rtl .mce-listbox i.mce-caret { left: 6px } html:lang(he-il) .rtl .quicktags-toolbar input, html:lang(he-il) .rtl .wp-switch-editor { font-family: Arial, sans-serif } @media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { .wp-media-buttons .add_media span.wp-media-buttons-icon { background: 0 0 } } ul { padding: 0; margin-block-start: 0; margin-block-end: 0px } .clear { clear: both } .csf { position: relative } .csf label { padding: 0; margin: 0; display: inline-block } .csf-ab-icon { top: 2px } #screen-meta-links + .csf-options { margin-top: 40px } .csf-options { margin-top: 20px; margin-right: 20px } .csf-header { position: relative } .csf-header-inner { padding: 25px; transition: box-shadow .3s ease } .csf-header-inner h1 { float: left; font-size: 1.5em; line-height: 26px; font-weight: 400; margin: 0 } .csf-header-inner h1 small { font-size: 11px; font-weight: 500 } .csf-sticky .csf-header-inner { position: fixed; z-index: 99; top: 0; box-shadow: 0 5px 10px rgba(0, 0, 0, .1) } .csf-buttons { float: right } .csf-buttons .button { margin: 0 2px; line-height: 26px } .csf-buttons .button:focus { outline: 0 !important; box-shadow: none !important } .csf-buttons .csf-save { min-width: 72px } .csf-header-left { float: left } .csf-header-right { float: right } .csf-nav { display: block; position: relative; z-index: 10; float: left } .csf-nav ul { clear: left; margin: 0; list-style-type: none } .csf-nav ul li { margin-bottom: 0 } .csf-nav ul li a { font-size: 13px; position: relative; display: block; padding: 14px 12px; text-decoration: none; transition-property: color, background; transition-duration: .2s; transition-timing-function: ease } .csf-nav ul li a:focus { outline: 0; box-shadow: none } .csf-nav ul li .csf-arrow:after { content: "\f054"; display: inline-block; font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", FontAwesome; font-weight: 900; font-size: 9px; line-height: 1; position: absolute; right: 10px; top: 50%; margin-top: -4px } .csf-nav ul li.csf-tab-expanded .csf-arrow:after { transform: rotate(90deg) } .csf-nav ul li.csf-tab-expanded ul { display: block } .csf-nav ul ul { display: none; position: relative } .csf-nav ul ul li a { font-size: 12px; padding: 12px 14px 12px 24px } .csf-nav .csf-tab-icon { width: 20px; margin-right: 5px; font-size: 13px; text-align: center } .csf-nav .csf-label-error { margin-left: 4px; vertical-align: top } .csf-nav-normal { width: 225px } .csf-nav-normal + .csf-content { margin-left: 225px } .csf-nav-inline { width: 100% } .csf-nav-inline ul li { display: inline-block; vertical-align: top } .csf-nav-background { position: absolute; top: 0; left: 0; bottom: 0; z-index: 9; width: 225px } .csf-wrapper { position: relative } .csf-content { position: relative; background-color: #fff } .csf-sections { float: left; width: 100% } .csf-section-title { display: none; padding: 20px 30px; background-color: #f5f5f5; border-top: 1px solid #eee; border-bottom: 1px solid #eee } .csf-section-title h3 { margin: 0; padding: 0; font-size: 13px; font-weight: 700; text-transform: uppercase } .csf-section-title .csf-section-icon { margin-right: 5px } .csf-footer { padding: 20px; font-size: 11px } .csf-copyright { float: left; margin-top: 5px } .csf-search-all .csf-nav, .csf-search-all .csf-nav-background, .csf-show-all .csf-nav, .csf-show-all .csf-nav-background { display: none } .csf-search-all .csf-content, .csf-show-all .csf-content { margin-left: 0 } .csf-search-all .csf-section, .csf-search-all .csf-section-title, .csf-show-all .csf-section, .csf-show-all .csf-section-title { display: block !important } .csf-search-all .csf-section-title { display: none !important } .csf-expand-all { float: left; padding: 0 8px; margin-right: 4px; z-index: 1; font-size: 13px; line-height: 30px; cursor: pointer; user-select: none; border-radius: 2px; transition: all .2s } .csf-expand-all span { font-size: 11px; vertical-align: middle } .csf-search { float: left } .csf-search input { margin: 0 2px 0 0; border: none; font-size: 12px; line-height: 30px; min-height: 30px; text-align: inherit; padding: 0 10px; border-radius: 2px; box-shadow: none } .csf-search input:focus { box-shadow: none } .csf-saving .csf-buttons, .csf-saving .csf-content { cursor: default; pointer-events: none; opacity: .5 } .csf-metabox { margin: -6px -12px -12px -12px } .csf-metabox .csf-field { padding: 20px } .csf-metabox .csf-section-title { padding: 20px } .block-editor-page .csf-metabox { margin: -6px -14px -14px -14px } .block-editor-editor-skeleton__content .csf-metabox { border-left: 1px solid #e2e4e7; border-right: 1px solid #e2e4e7 } .csf-sections-reset { float: left; width: 100%; text-align: right; border-top: 1px solid #eee } .csf-sections-reset .csf-button-cancel, .csf-sections-reset input { display: none } .csf-sections-reset label { padding: 10px } .csf-sections-reset span { -webkit-user-select: none; user-select: none } .csf-sections-reset input:checked ~ .csf-button-reset { display: none } .csf-sections-reset input:checked ~ .csf-button-cancel { display: inline-block } #side-sortables .csf-section-title { padding: 12px } #side-sortables .csf-field { padding: 10px 15px } #side-sortables .csf-field .csf-title { float: none; width: 100%; margin-bottom: 6px } #side-sortables .csf-field .csf-fieldset { float: none; width: 100% } #side-sortables .csf-field-text input { width: 100% } #side-sortables .csf-notice { padding: 10px 15px } .csf-comment-metabox { margin: -6px -12px -12px -12px } .csf-comment-metabox .csf-field { padding: 20px } .csf-comment-metabox .csf-section-title { padding: 20px } .csf-tooltip { position: absolute; z-index: 5000001; font-size: 12px; line-height: 1.4; text-align: center; text-decoration: none; padding: 6px 12px; max-width: 200px; color: #fff; background-color: #000; background-color: rgba(0, 0, 0, .85); border-radius: 4px } .csf-theme-dark .csf-header-inner { background-color: #050505 } .csf-theme-dark .csf-header-inner h1 { color: #fff } .csf-theme-dark .csf-header-inner h1 small { color: #555 } .csf-theme-dark .csf-expand-all { color: #999; background-color: #222 } .csf-theme-dark .csf-expand-all:hover { color: #fff; background-color: #333 } .csf-theme-dark .csf-search input { color: #fff; background-color: #222 } .csf-theme-dark .csf-search:focus { background-color: #444 } .csf-theme-dark .csf-search::-webkit-input-placeholder { color: #666 } .csf-theme-dark .csf-nav ul li a { color: #999; border-color: #2f2f2f; background-color: #222 } .csf-theme-dark .csf-nav ul li a:hover { color: #fff } .csf-theme-dark .csf-nav ul li .csf-active { color: #fff; background-color: #111 } .csf-theme-dark .csf-nav ul ul li a { border-color: #2f2f2f; background-color: #191919 } .csf-theme-dark .csf-nav ul ul li .csf-active { background-color: #101010 } .csf-theme-dark .csf-nav ul ul:before { background-color: rgba(34, 34, 34, .75) } .csf-theme-dark .csf-nav > ul > li:last-child > a { border: none } .csf-theme-dark .csf-nav-normal ul li a { border-bottom-width: 1px; border-bottom-style: solid } .csf-theme-dark .csf-nav-normal ul li .csf-active:after { content: " "; position: absolute; right: 0; top: 50%; height: 0; width: 0; pointer-events: none; border: solid transparent; border-right-color: #fff; border-width: 4px; margin-top: -4px } .csf-theme-dark .csf-nav-inline { background-color: #222 } .csf-theme-dark .csf-nav-inline ul li a { text-align: center; border-right-width: 1px; border-right-style: solid } .csf-theme-dark .csf-nav-inline ul li .csf-active:after { content: " "; position: absolute; left: 50%; bottom: 0; height: 0; width: 0; pointer-events: none; border: solid transparent; border-bottom-color: #fff; border-width: 4px; margin-left: -4px } .csf-theme-dark .csf-nav-background { background-color: #222 } .csf-theme-dark .csf-footer { color: #555; background-color: #050505 } .csf-theme-light .csf-container { border: 1px solid #ccd0d4; box-shadow: 0 0 15 rgba(0, 0, 0, .04) } .csf-theme-light .csf-header-inner { border-bottom: 1px solid #ccd0d4; background-color: #f5f5f5; background: linear-gradient(#fefefe, #f5f5f5) } .csf-theme-light .csf-header-inner h1 small { color: #999 } .csf-theme-light .csf-expand-all { color: #999; background-color: #eee } .csf-theme-light .csf-expand-all:hover { color: #555 } .csf-theme-light .csf-search input { color: #555; background-color: #eee } .csf-theme-light .csf-search input::-webkit-input-placeholder { color: #999 } .csf-theme-light .csf-nav ul li a { font-weight: 500; color: #444; background-color: #f5f5f5 } .csf-theme-light .csf-nav ul li a:hover { color: #111; background-color: #fff } .csf-theme-light .csf-nav ul li .csf-active { color: #111; background-color: #fff } .csf-theme-light .csf-nav ul ul li a { background-color: #eee } .csf-theme-light .csf-nav-normal > ul { margin-right: -1px; margin-bottom: -1px } .csf-theme-light .csf-nav-normal > ul li a { border-bottom: 1px solid #ccd0d4; border-right: 1px solid #ccd0d4 } .csf-theme-light .csf-nav-normal > ul li .csf-active { border-right-color: #fff } .csf-theme-light .csf-nav-inline { background-color: #f5f5f5; border-bottom: 1px solid #ccd0d4 } .csf-theme-light .csf-nav-inline > ul { margin-bottom: -1px } .csf-theme-light .csf-nav-inline > ul li a { text-align: center; border-right: 1px solid #ccd0d4; border-bottom: 1px solid #ccd0d4 } .csf-theme-light .csf-nav-inline > ul li .csf-active { border-bottom-color: #fff } .csf-theme-light .csf-nav-inline > ul ul { display: none !important } .csf-theme-light .csf-nav-inline .csf-arrow:after { display: none } .csf-theme-light .csf-nav-background { background-color: #f5f5f5; border-right: 1px solid #ccd0d4 } .csf-theme-light .csf-footer { color: #555; border-top: 1px solid #ccd0d4; background-color: #f5f5f5; background: linear-gradient(#fafafa, #f5f5f5) } .csf-field { position: relative; padding: 30px } .csf-field + .csf-field { border-top: 1px solid #eee } .csf-field p:first-child { margin-top: 0 } .csf-field p:last-child { margin-bottom: 0 } .csf-field:after, .csf-field:before { content: " "; display: table } .csf-field:after { clear: both } .csf-field h4 { margin-top: 0 } .csf-field .csf-title { position: relative; width: 20%; float: left } .csf-field .csf-title h4 { margin: 0; color: #23282d } .csf-field .csf-fieldset { float: right; width: calc(80% - 20px) } .csf-pseudo-field { padding: 0 5px 0 0 !important; display: inline-block } .csf-pseudo-field + .csf-pseudo-field { border: 0 } .csf-pseudo-field pre { display: none } .csf-field-accordion .csf-accordion-item { position: relative; margin-bottom: 5px } .csf-field-accordion .csf-accordion-item:last-child { margin-bottom: 0 } .csf-field-accordion .csf-accordion-item h4 { font-size: 1em } .csf-field-accordion .csf-accordion-title { display: block; cursor: pointer; position: relative; margin: 0; padding: 15px; min-height: 0; font-size: 100%; user-select: none; border: 1px solid #ccd0d4; background-color: #fafafa; box-shadow: 0 1px 1px rgba(0, 0, 0, .04); transition: border-color .15s } .csf-field-accordion .csf-accordion-title:active, .csf-field-accordion .csf-accordion-title:focus, .csf-field-accordion .csf-accordion-title:hover { outline: 0; border-color: #999 } .csf-field-accordion .csf-accordion-title .csf--icon { width: 20px; text-align: center; margin-right: 2px } .csf-field-accordion .csf-accordion-icon { width: 16px; text-align: center } .csf-field-accordion .csf-accordion-content { display: none; padding: 0; border: 1px solid #ccd0d4; border-top: none; background-color: #fff; box-shadow: 0 1px 1px rgba(0, 0, 0, .04) } .csf-field-accordion .csf-accordion-content > .csf-field { padding: 15px } .csf-field-accordion .csf-accordion-open { display: block } .csf-field-background .csf-field { border: 0 !important; padding: 0; margin-bottom: 6px; margin-right: 6px } .csf-field-background .csf--title { color: #777; font-size: 12px } .csf-field-background .csf--background-colors { display: flex; flex-wrap: wrap } .csf-field-background .csf--background-attributes { display: flex; flex-wrap: wrap } .csf-field-background .csf--background-attributes select { min-width: 100%; margin: 0 } .csf-field-background .csf--background-attributes .csf-field { flex: 1 } .csf-field-background .csf--attributes-hidden { display: none } .csf-field-backup textarea { width: 100%; min-height: 200px; margin-bottom: 5px } .csf-field-backup small { display: inline-block; margin: 5px } .csf-field-backup hr { margin: 20px 0; border: none; border-bottom: 1px solid #e5e5e5 } .csf-field-border .csf--inputs, .csf-field-dimensions .csf--inputs, .csf-field-spacing .csf--inputs { float: left; display: flex; flex-wrap: wrap } .csf-field-border .csf--input, .csf-field-dimensions .csf--input, .csf-field-spacing .csf--input { display: flex; padding-right: 6px; padding-bottom: 4px; box-sizing: border-box } .csf-field-border .csf--input select, .csf-field-dimensions .csf--input select, .csf-field-spacing .csf--input select { margin: 0 } .csf-field-border .csf--input input, .csf-field-dimensions .csf--input input, .csf-field-spacing .csf--input input { position: relative; z-index: 1; margin: 0; width: 65px; max-width: 100%; text-align: center } .csf-field-border .csf--color, .csf-field-dimensions .csf--color, .csf-field-spacing .csf--color { float: left } .csf-field-border .csf--label, .csf-field-dimensions .csf--label, .csf-field-spacing .csf--label { display: flex; flex-direction: column; justify-content: center; user-select: none; min-width: 20px; max-width: 100%; padding: 0 4px; font-size: 12px; text-align: center; color: #555; border: 1px solid #7b776c; background-color: #f5f5f5 } .csf-field-border .csf--icon, .csf-field-dimensions .csf--icon, .csf-field-spacing .csf--icon { border-right: 0; border-radius: 4px 0 0 4px } .csf-field-border .csf--icon + input, .csf-field-dimensions .csf--icon + input, .csf-field-spacing .csf--icon + input { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important } .csf-field-border .csf--unit, .csf-field-dimensions .csf--unit, .csf-field-spacing .csf--unit { border-left: 0; border-radius: 0 4px 4px 0 } .csf-field-border .csf--is-unit, .csf-field-dimensions .csf--is-unit, .csf-field-spacing .csf--is-unit { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important } .csf-field-button_set .csf--buttons { display: inline-block } .csf-field-button_set .csf--button { position: relative; z-index: 1; float: left; cursor: pointer; padding: 7px 14px; min-width: 16px; text-align: center; color: #555; border: 1px solid #ccc; background-color: #f7f7f7; user-select: none; box-shadow: 0 1px 0 rgba(0, 0, 0, .1) } .csf-field-button_set .csf--button:first-child { border-radius: 4px 0 0 4px } .csf-field-button_set .csf--button:last-child { border-radius: 0 4px 4px 0 } .csf-field-button_set .csf--button:not(:first-child) { margin-left: -1px } .csf-field-button_set .csf--button:hover { background-color: #eee } .csf-field-button_set .csf--active, .csf-field-button_set .csf--active:hover { z-index: 2; color: #fff; border-color: #006799; background-color: #0085ba } .csf-field-button_set input { display: none } .csf-field-checkbox ul, .csf-field-radio ul { margin: 0; padding: 0; list-style-type: none; overflow-y: auto; max-height: 305px } .csf-field-checkbox ul li, .csf-field-radio ul li { margin-bottom: 6px } .csf-field-checkbox ul ul, .csf-field-radio ul ul { max-height: none } .csf-field-checkbox ul ul li, .csf-field-radio ul ul li { margin-left: 8px } .csf-field-checkbox ul ul li:first-child, .csf-field-radio ul ul li:first-child { margin-left: 0 } .csf-field-checkbox input, .csf-field-radio input { margin: 0 1px } .csf-field-checkbox .csf--inline-list li, .csf-field-radio .csf--inline-list li { display: inline-block; margin-right: 15px } .csf-field-checkbox .csf--text, .csf-field-radio .csf--text { margin-left: 5px; vertical-align: middle } .csf-field-checkbox .csf-checker, .csf-field-radio .csf-checker { cursor: pointer } .csf-field-code_editor .CodeMirror { width: 100%; height: 400px } .csf-field-code_editor .cm-s-default { border: 1px solid #ccd0d4 } .csf-field-code_editor textarea { width: 100%; height: 400px } .csf-field-color > input { opacity: .75; width: 115px; max-width: 100% } .csf-field-color .button.wp-picker-clear { padding: 0 8px; margin-left: 6px; line-height: 2.54545455; min-height: 30px } .csf-field-color_group .csf--left { float: left; margin-right: 10px; margin-bottom: 5px } .csf-field-color_group .csf--title { color: #999; margin-bottom: 5px } .csf-field-fieldset .csf-fieldset-content { border: 1px solid #ccd0d4; background-color: #fff; box-shadow: 0 1px 1px rgba(0, 0, 0, .04) } .csf-field-fieldset .csf-fieldset-content > .csf-field { padding: 15px } .csf-field-fieldset .csf-field-subheading { font-size: 13px } .csf-field-date input { margin: 0 } .csf-field-date .csf--to { margin-left: 7px } .csf-datepicker-wrapper { margin-top: 5px; width: auto; background-color: #fff; z-index: 9999999 !important; box-shadow: 0 0 30px rgba(0, 0, 0, .15) } .csf-datepicker-wrapper * { float: none; margin: 0; padding: 0; font-family: inherit; font-weight: 400; font-style: normal; text-decoration: none; border: 0; border-radius: 0; box-shadow: none } .csf-datepicker-wrapper .ui-datepicker-header, .csf-datepicker-wrapper .ui-widget-header { color: #fff; background: #00a0d2 } .csf-datepicker-wrapper .ui-datepicker-header .ui-state-hover { cursor: pointer } .csf-datepicker-wrapper .ui-datepicker-title { font-size: 14px; line-height: 40px; height: 40px; text-align: center } .csf-datepicker-wrapper .ui-datepicker-next, .csf-datepicker-wrapper .ui-datepicker-prev { position: static; top: auto; left: auto; right: auto; font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", FontAwesome; font-weight: 900; font-size: 12px; text-align: center; width: 41px; height: 40px; line-height: 40px; color: #fff; background-color: rgba(255, 255, 255, .1); text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .csf-datepicker-wrapper .ui-datepicker-next span, .csf-datepicker-wrapper .ui-datepicker-prev span { display: none } .csf-datepicker-wrapper .ui-datepicker-prev { float: left } .csf-datepicker-wrapper .ui-datepicker-next { float: right } .csf-datepicker-wrapper .ui-datepicker-prev:before { content: '\f053' } .csf-datepicker-wrapper .ui-datepicker-next:before { content: '\f054' } .csf-datepicker-wrapper .ui-datepicker-next-hover, .csf-datepicker-wrapper .ui-datepicker-prev-hover { opacity: .75 } .csf-datepicker-wrapper tbody .ui-datepicker-week-col { background-color: #f7f7f7 } .csf-datepicker-wrapper .ui-datepicker-buttonpane { padding: 10px; text-align: center; background-color: #f7f7f7 } .csf-datepicker-wrapper .ui-datepicker-buttonpane button { cursor: pointer; margin: 0 5px; padding: 7px 14px; border: 1px solid #eee; background-color: #fff } .csf-datepicker-wrapper select { margin: 5px 5px } .csf-datepicker-wrapper select option { color: #555 } .csf-datepicker-wrapper table { font-size: 13px; border-collapse: collapse; width: 100% } .csf-datepicker-wrapper thead { color: #fff; background: #32373c } .csf-datepicker-wrapper th { text-align: center; padding: 7px; border: 1px solid #444 } .csf-datepicker-wrapper td { text-align: center; border: 1px solid #f4f4f4 } .csf-datepicker-wrapper td.ui-datepicker-other-month { border: transparent } .csf-datepicker-wrapper td .ui-state-default { color: #555; width: auto; display: block; padding: 6px 12px } .csf-datepicker-wrapper td .ui-state-active, .csf-datepicker-wrapper td .ui-state-hover { color: #fff; background-color: #0073aa } .csf-datepicker-wrapper td.ui-state-disabled .ui-state-default { opacity: .5 } .csf-field-datetime input { margin: 0 } .csf-field-datetime .csf--to { margin-left: 7px } .csf-flatpickr input, .csf-flatpickr select { min-height: auto } .csf-flatpickr input:focus, .csf-flatpickr select:focus { box-shadow: none } .csf-flatpickr.open { z-index: 9999999 !important } .csf-field-gallery ul { margin: 0; padding: 0; list-style-type: none } .csf-field-gallery ul li { display: inline-block; position: relative; padding: 4px; margin: 0 5px 10px 0; border: 1px solid #ccc; background-color: #f9f9f9; border-radius: 2px; box-shadow: 0 1px 0 rgba(0, 0, 0, .08) } .csf-field-gallery ul li img { max-height: 60px; display: inline-block; vertical-align: middle } .csf-field-gallery .button { margin-right: 5px; margin-bottom: 5px } .csf-field-group .csf-cloneable-hidden { display: none !important } .csf-field-group .csf-cloneable-wrapper { position: relative } .csf-field-group .csf-cloneable-item { display: none; position: relative; margin-bottom: 5px } .csf-field-group .csf-cloneable-item h4 { font-size: 1em } .csf-field-group .ui-accordion .csf-cloneable-item { display: block } .csf-field-group .csf-cloneable-content { border: 1px solid #ccd0d4; background-color: #fff; box-shadow: 0 1px 1px rgba(0, 0, 0, .04) } .csf-field-group .csf-cloneable-content > .csf-field { padding: 15px } .csf-field-group .csf-cloneable-title { display: block; cursor: pointer; position: relative; user-select: none; margin: 0; padding: 15px 65px 15px 10px; min-height: 0; font-size: 100%; border: 1px solid #ccd0d4; background-color: #fafafa; box-shadow: 0 1px 1px rgba(0, 0, 0, .04); transition: border-color .15s } .csf-field-group .csf-cloneable-title:active, .csf-field-group .csf-cloneable-title:focus, .csf-field-group .csf-cloneable-title:hover { border-color: #999; outline: 0 } .csf-field-group .csf-cloneable-helper { position: absolute; top: 12px; right: 10px; z-index: 1; font-size: 14px; line-height: 1em } .csf-field-group .csf-cloneable-helper i { display: inline-block; cursor: pointer; padding: 5px; color: #999 } .csf-field-group .csf-cloneable-helper i:hover { color: #555 } .csf-field-group .csf-cloneable-content { padding: 0; border-top: 0 } .csf-field-group .csf-cloneable-title-number, .csf-field-group .csf-cloneable-title-prefix { margin-right: 5px } .csf-field-group .csf-cloneable-alert { display: none; margin-bottom: 5px; padding: 10px 20px; color: #a94442; border: 1px solid #ebccd1; background-color: #f2dede } .csf-field-group .widget-placeholder { margin-bottom: 10px; border: 1px dashed #f1c40f; background-color: #fffae4 } .csf-field-group .csf-cloneable-header-icon { display: inline-block; text-align: center; font-size: 14px; width: 17px; text-indent: 0; vertical-align: text-top } .csf-field-group .csf-cloneable-placeholder { background-color: #ddd; margin-top: 4px; width: 100px; height: 10px; font-size: 10px; line-height: 10px; display: inline-block; vertical-align: top; border-radius: 2px } .csf-field-icon .csf-icon-select { display: flex; grid-gap: 5px } .csf-field-icon .csf-icon-preview:not(.hidden) { display: flex } .csf-field-icon .csf-icon-preview i { display: flex; justify-content: center; align-items: center; width: 30px; font-size: 14px; text-align: center; vertical-align: top; color: #555; border: 1px solid #ccc; background-color: #f7f7f7; border-radius: 3px; box-shadow: 0 1px 0 rgba(0, 0, 0, .08) } .csf-field-image_select .csf--image { display: inline-block; margin: 0 5px 5px 0 } .csf-field-image_select .csf--inline-list .csf--image { display: block } .csf-field-image_select figure { cursor: pointer; position: relative; display: inline-block; max-width: 100%; margin: 0; vertical-align: bottom; border: 2px solid transparent; background-color: #fff; user-select: none; transition: all .2s } .csf-field-image_select figure:before { position: absolute; top: 0; left: 0; text-align: center; font-size: 10px; font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", FontAwesome; font-weight: 900; content: "\f00c"; width: 16px; height: 16px; line-height: 14px; opacity: 0; color: #fff; background-color: #222; transition: opacity .2s } .csf-field-image_select .csf--active figure { border-color: #222; box-shadow: 0 0 20px rgba(0, 0, 0, .2) } .csf-field-image_select .csf--active figure:before { opacity: 1 } .csf-field-image_select img { max-width: 100%; height: auto; vertical-align: top } .csf-field-image_select input { display: none } .csf-field-link_color .csf--left { float: left; margin-right: 10px; margin-bottom: 5px } .csf-field-link_color .csf--title { color: #777; margin-bottom: 5px } .csf-field-map input { width: 100% } .csf-field-map input[type=text].ui-autocomplete-loading { background-position-x: calc(100% - 5px) } .csf-field-map .csf--map-search + .csf--map-osm-wrap { margin-top: 10px } .csf-field-map .csf--map-osm-wrap { position: relative; padding: 5px; border: 1px solid #eee; background-color: #fff; box-shadow: 0 1px 1px rgba(0, 0, 0, .04) } .csf-field-map .csf--map-osm { position: relative; z-index: 1; min-height: 250px } .csf-field-map .csf--map-inputs { margin-top: 10px; display: flex; justify-content: space-between } .csf-field-map .csf--map-input { flex: 1 } .csf-field-map .csf--map-input:last-child { padding-left: 10px } .csf-field-map label { display: block; color: #777; font-size: 12px; margin: 0 0 2px 0 } .csf-map-ui-autocomplate { z-index: 999999; border-radius: 4px; overflow: hidden } .csf-field-media .csf--placeholder { display: flex; align-items: flex-start } .csf-field-media .csf--placeholder input { width: 100%; margin: 0 } .csf-field-media .button { margin-left: 5px } .csf-field-media .hidden + .button { margin-left: 0 } .csf-field-media .csf--preview { position: relative } .csf-field-palette .csf--palette { position: relative; display: inline-block; cursor: pointer; border: 2px solid #ddd; margin-right: 10px; margin-bottom: 10px; user-select: none; -webkit-user-select: none; transition: all .2s } .csf-field-palette .csf--palette span { vertical-align: middle; display: inline-block; width: 22px; height: 60px; line-height: 60px; overflow: hidden; text-indent: -999px } .csf-field-palette .csf--palette:before { position: absolute; top: 0; left: 0; text-align: center; font-size: 10px; font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", FontAwesome; font-weight: 900; content: "\f00c"; width: 16px; height: 16px; line-height: 14px; opacity: 0; color: #fff; background-color: #222; transition: opacity .2s } .csf-field-palette .csf--active { border-color: #222; box-shadow: 0 0 20px rgba(0, 0, 0, .2) } .csf-field-palette .csf--active:before { opacity: 1 } .csf-field-palette input { display: none } .csf-field-repeater .csf-field-text input { width: 100% } .csf-field-repeater .csf-repeater-hidden { display: none !important } .csf-field-repeater .csf-repeater-wrapper .csf-repeater-item { display: table; width: 100%; margin-bottom: 5px; border: 1px solid #eee } .csf-field-repeater .csf-repeater-wrapper .csf-repeater-item h4 { font-size: 1em } .csf-field-repeater .csf-repeater-content { width: 100%; display: table-cell; vertical-align: middle; background-color: #fff } .csf-field-repeater .csf-repeater-content > .csf-field { padding: 15px } .csf-field-repeater .csf-repeater-helper { width: 100%; display: table-cell; vertical-align: middle; text-align: center; font-size: 14px; line-height: 1em; border-left: 1px solid #eee; background-color: #f7f7f7 } .csf-field-repeater .csf-repeater-helper i { display: inline-block; cursor: pointer; color: #999; padding: 5px } .csf-field-repeater .csf-repeater-helper i:hover { color: #555 } .csf-field-repeater .csf-repeater-helper-inner { width: 75px } .csf-field-repeater .csf-repeater-alert { display: none; margin-bottom: 5px; padding: 10px 20px; color: #a94442; border: 1px solid #ebccd1; background-color: #f2dede } .csf-field-repeater .widget-placeholder { height: 50px; margin-bottom: 3px; border: 1px dashed #f1c40f; background-color: #fffae4 } .csf-field-repeater .ui-sortable-helper { height: 50px !important; overflow: hidden !important; border-color: #ccc !important; background-color: #eee !important; opacity: .5 } .csf-field-repeater .ui-sortable-helper .csf-repeater-content, .csf-field-repeater .ui-sortable-helper .csf-repeater-helper { display: none } .csf-field-select .csf-fieldset { min-height: 30px } .csf-field-select .csf-chosen { display: none } .csf-field-select select { max-width: 100%; margin: 0 } .csf-field-select .csf-hide-select { display: none !important } .csf-field-slider .csf--wrap { display: flex; align-items: center } .csf-field-slider .csf--input { display: flex } .csf-field-slider .csf--unit { display: flex; justify-content: center; flex-direction: column; user-select: none; padding: 0 6px; font-size: 11px; line-height: 1; border-radius: 0 4px 4px 0; color: #555; border: 1px solid #7e8993; border-left: 0; background-color: #f5f5f5 } .csf-field-slider .csf-slider-ui { margin-right: 15px } .csf-field-slider input[type=number] { position: relative; z-index: 1; margin: 0; width: 50px; text-align: center } .csf-field-slider .csf--is-unit { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important } .csf-field-slider .ui-slider { position: relative; width: 100%; height: 3px; border: none; background: #ddd; border-radius: 2px } .csf-field-slider .ui-slider-range { height: 3px; border: none; background: #333; border-radius: 2px } .csf-field-slider .ui-slider-handle { position: absolute; width: 16px; height: 16px; top: -7px; margin-left: -8px; border: none; background: #333; border-radius: 2px } .csf-field-slider .ui-slider-handle:hover, .csf-field-slider .ui-state-active { cursor: pointer; background: #111 } .csf-field-sortable .csf-field-text input { width: 100%; max-width: 100% } .csf-field-sortable .csf-sortable .csf-sortable-item { display: table; width: 100%; margin-bottom: 5px; border: 1px solid #eee } .csf-field-sortable .csf-sortable .csf-sortable-item h4 { font-size: 1em } .csf-field-sortable .csf-sortable-content { width: 100%; display: table-cell; vertical-align: middle; background-color: #fff } .csf-field-sortable .csf-sortable-content > .csf-field { padding: 15px } .csf-field-sortable .csf-sortable-helper { width: 100%; display: table-cell; vertical-align: middle; text-align: center; font-size: 14px; line-height: 1em; border-left: 1px solid #eee; background-color: #f7f7f7 } .csf-field-sortable .csf-sortable-helper i { display: inline-block; cursor: pointer; width: 50px; color: #555 } .csf-field-sortable .csf-sortable-helper i:hover { opacity: .5 } .csf-field-sortable .widget-placeholder { height: 50px; margin-bottom: 3px; border: 1px dashed #f1c40f; background-color: #fffae4 } .csf-field-sortable .ui-sortable-helper { height: 50px !important; overflow: hidden !important; border-color: #ccc !important; background-color: #eee !important; opacity: .5 } .csf-field-sortable .ui-sortable-helper .csf-sortable-content, .csf-field-sortable .ui-sortable-helper .csf-sortable-helper { display: none } .csf-field-sorter .ui-sortable-placeholder { height: 20px; border: 1px dashed #f1c40f; background-color: #fffae4 } .csf-field-sorter .csf-modules { float: left; width: 50%; box-sizing: border-box } .csf-field-sorter .csf-modules:first-child { padding-right: 15px } .csf-field-sorter .csf-modules:last-child { padding-left: 15px } .csf-field-sorter .csf-disabled, .csf-field-sorter .csf-enabled { padding: 5px 15px; border: 1px dashed #ddd; background-color: #fff } .csf-field-sorter .csf-disabled li { opacity: .5; transition: opacity .15s } .csf-field-sorter .csf-disabled .ui-sortable-helper { opacity: 1 } .csf-field-sorter .csf-sorter-title { font-size: 13px; font-weight: 600; padding: 10px; text-align: center; border: 1px dashed #ddd; border-bottom: none; background-color: #f8f8f8; text-transform: uppercase } .csf-field-sorter ul { list-style-type: none; margin: 0; padding: 0; min-height: 62px } .csf-field-sorter ul li { margin: 10px 0; padding: 10px 15px; cursor: move; font-weight: 700; text-align: center; border: 1px solid #e5e5e5; background-color: #fafafa; transition: border-color .15s } .csf-field-sorter ul li:hover { border-color: #bbb } .csf-field-spinner .csf--spin { display: flex } .csf-field-spinner .ui-widget { font-family: inherit } .csf-field-spinner .ui-spinner { display: flex; align-items: stretch; overflow: unset; border: none; background: 0 0; border-radius: 0 } .csf-field-spinner .ui-spinner .ui-button { display: flex; flex-direction: column; justify-content: center; text-align: center; min-width: 20px; padding: 0 4px; margin: 0; color: #555; background-color: #f5f5f5; border: 1px solid #7e8993 } .csf-field-spinner .ui-spinner .ui-spinner-button { position: relative; cursor: pointer; height: auto } .csf-field-spinner .ui-spinner .ui-spinner-button:hover { background-color: #e7e7e7 } .csf-field-spinner .ui-spinner .ui-spinner-button:active { background-color: #ddd } .csf-field-spinner .ui-spinner .ui-spinner-button:before { font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", FontAwesome; font-weight: 900; font-size: 14px; line-height: 14px } .csf-field-spinner .ui-spinner .ui-spinner-down { border-right: 0; border-radius: 4px 0 0 4px } .csf-field-spinner .ui-spinner .ui-spinner-down:before { content: "\f0d9" } .csf-field-spinner .ui-spinner .ui-spinner-up { border-left: 0; border-radius: 0 4px 4px 0 } .csf-field-spinner .ui-spinner .ui-spinner-up:before { content: "\f0da" } .csf-field-spinner .ui-spinner .csf--unit { border-left: 0; user-select: none } .csf-field-spinner .ui-spinner .ui-button-icon, .csf-field-spinner .ui-spinner .ui-button-icon-space, .csf-field-spinner .ui-spinner .ui-button-text { display: none } .csf-field-spinner .ui-spinner input { font-family: inherit; font-size: inherit; position: relative; z-index: 1; width: 50px; text-align: center; margin: 0; padding: 0 8px; border-radius: 0 } .csf-field-spinner .ui-spinner-down { order: 1 } .csf-field-spinner .ui-spinner-input { order: 2 } .csf-field-spinner .csf--unit { order: 3 } .csf-field-spinner .ui-spinner-up { order: 4 } .csf-field-switcher .csf--switcher { float: left; cursor: pointer; position: relative; width: 60px; height: 26px; padding: 0; margin: 0; overflow: hidden; border-radius: 4px; background-color: #ed6f6f; user-select: none; -webkit-user-select: none } .csf-field-switcher .csf--ball { position: absolute; top: 4px; left: 4px; width: 24px; height: 18px; background-color: #fff; border-radius: 4px; transition: all .1s; box-shadow: 1px 1px 1px rgba(0, 0, 0, .15) } .csf-field-switcher .csf--off, .csf-field-switcher .csf--on { position: absolute; top: 0; left: 0; right: 0; font-size: 11px; line-height: 26px; font-weight: 500; font-style: normal; text-align: center; text-transform: uppercase; color: #fff; padding-right: 28px; opacity: 0; transition: all .1s } .csf-field-switcher .csf--off { padding-right: 0; padding-left: 28px; opacity: 1 } .csf-field-switcher .csf--active { background: #4fb845 } .csf-field-switcher .csf--active .csf--on { opacity: 1 } .csf-field-switcher .csf--active .csf--off { opacity: 0 } .csf-field-switcher .csf--active .csf--ball { left: 100%; margin-left: -28px } .csf-field-switcher .csf--label { float: left; margin-top: 4px; margin-left: 8px; font-weight: 400; color: #999 } .csf-field-tabbed .csf-tabbed-content { border: 1px solid #ccd0d4; background-color: #fff; box-shadow: 0 1px 1px rgba(0, 0, 0, .04) } .csf-field-tabbed .csf-tabbed-content > .csf-field { padding: 15px } .csf-field-tabbed .csf-tabbed-nav .csf--icon { padding-right: 5px } .csf-field-tabbed .csf-tabbed-nav a { display: inline-block; padding: 12px 15px; margin-top: 1px; margin-right: 5px; margin-bottom: -1px; position: relative; text-decoration: none; color: #444; font-weight: 600; border: 1px solid #ccd0d4; background-color: #f3f3f3; transition: all .2s } .csf-field-tabbed .csf-tabbed-nav a:hover { background-color: #f9f9f9 } .csf-field-tabbed .csf-tabbed-nav a.csf-tabbed-active { background-color: #fff; border-bottom-color: #fff } .csf-field-tabbed .csf-tabbed-nav a:focus { outline: 0; box-shadow: none } .csf-field-text input { width: 50%; max-width: 100%; margin: 0 } .csf-field-textarea textarea { width: 100%; max-width: 100%; min-height: 125px } .csf-field-textarea .csf-shortcode-button { margin-bottom: 10px; margin-right: 5px } .csf-field-typography select, .csf-field-typography textarea { margin: 0; min-width: 100%; max-width: 100% } .csf-field-typography .csf--title { color: #777; margin: 0 0 2px 0; font-size: 12px } .csf-field-typography .csf--title small { vertical-align: top } .csf-field-typography .csf--blocks { display: flex; flex-wrap: wrap } .csf-field-typography .csf--block { flex: 1; max-width: 100%; padding-right: 6px; padding-bottom: 6px } .csf-field-typography .csf--input { margin: 0; min-width: 100% } .csf-field-typography .csf--input-wrap { position: relative } .csf-field-typography .csf--unit { position: absolute; z-index: 1; right: 4px; top: 4px; bottom: 4px; padding: 2px 6px; color: #666; font-size: 11px; line-height: 1; border-radius: 2px; background: #eee; user-select: none; display: flex; justify-content: center; flex-direction: column } .csf-field-typography .csf--preview { font-size: 16px; line-height: 20px; padding: 20px; color: #222; border: 1px solid #eee; background-color: #fff; border-radius: 2.5px; user-select: none; -webkit-user-select: none; transition: background-color .2s, border-color .2s } .csf-field-typography .csf--block-preview { cursor: pointer; position: relative; overflow: hidden; margin-top: 10px; max-width: 100% } .csf-field-typography .csf--black-background { border-color: #000; background-color: #000 } .csf-field-typography .csf--toggle { position: absolute; top: 5px; right: 10px; color: #999 } .csf-field-typography .csf--block-extra-styles { margin-top: 5px } .csf-field-upload input { width: 100%; margin: 0 } .csf-field-upload .csf--wrap { display: flex; align-items: flex-start } .csf-field-upload .button { margin-left: 5px } .csf-field-upload .csf--preview { position: relative } .csf-field-wp_editor .csf-wp-editor { float: left; width: 100% } .csf-field-wp_editor .mce-toolbar-grp { border: none } .csf-field-wp_editor .mce-btn.mce-active button, .csf-field-wp_editor .mce-btn.mce-active i, .csf-field-wp_editor .mce-btn.mce-active:hover button, .csf-field-wp_editor .mce-btn.mce-active:hover i { color: #23282d } .csf-field-wp_editor .wp-media-buttons { position: relative; z-index: 2 } .csf-field-wp_editor .wp-editor-tabs { position: relative; z-index: 1 } .csf-field-wp_editor .csf-no-tinymce { border: 1px solid #e5e5e5 } .csf-field-wp_editor .csf-no-quicktags .wp-media-buttons { float: none; display: block } .csf-field-wp_editor .csf-no-quicktags .mce-tinymce { box-shadow: none; border: 1px solid #e5e5e5 } .csf-field-wp_editor textarea { width: 100%; max-width: 100%; margin: 0; box-shadow: none } .csf-field-heading { font-size: 1.5em; font-weight: 700; color: #23282d; background-color: #f5f5f5 } .csf-field-subheading { font-size: 14px; font-weight: 700; padding-top: 17px; padding-bottom: 17px; color: #23282d; background-color: #f7f7f7 } .csf-field-submessage { padding: 0 !important; border: 0 !important } .csf-field-submessage + .csf-field { border-top: 0 !important } .csf-submessage { font-size: 12px; padding: 17px 30px; border-top: 1px solid transparent; border-bottom: 1px solid transparent } .csf-submessage-success { color: #3c763d; border-color: #d6e9c6; background-color: #dff0d8 } .csf-submessage-info { color: #31708f; border-color: #bce8f1; background-color: #d9edf7 } .csf-submessage-warning { color: #8a6d3b; border-color: #faebcc; background-color: #fcf8e3 } .csf-submessage-danger { color: #a94442; border-color: #ebccd1; background-color: #f2dede } .csf-submessage-normal { color: #23282d; border-color: #eee; background-color: #f7f7f7 } .csf-field-notice { background-color: #f7f7f7 } .csf-notice { padding: 12px; background-color: #fff; border-left-style: solid; border-left-width: 4px; box-shadow: 0 1px 1px rgba(0, 0, 0, .1) } .csf-notice-success { border-color: #46b450 } .csf-notice-info { border-color: #339fd4 } .csf-notice-warning { border-color: #ffbc00 } .csf-notice-danger { border-color: #dc3232 } .csf-notice-normal { border-color: #222 } .csf-field-number input { width: 100%; margin: 0 } .csf-field-number .csf--wrap { position: relative; float: left; width: 100px } .csf-field-number .csf--unit { position: absolute; z-index: 1; right: 4px; top: 4px; bottom: 4px; padding: 2px 6px; color: #666; font-size: 11px; line-height: 1; border-radius: 2px; background: #eee; user-select: none; display: flex; justify-content: center; flex-direction: column } .csf-field-link .csf--result { display: inline-block; font-size: 12px; line-height: 16px; padding: 7px 10px; margin-bottom: 7px; color: #777; border: 1px solid #e5e5e5; background-color: #f5f5f5; border-radius: 2px; world-break: break-word } .csf-field-link .csf--wrap { position: relative; float: left; width: 100px } .csf-field-link .csf--unit { position: absolute; z-index: 1; right: 4px; top: 4px; bottom: 4px; padding: 2px 6px; color: #666; font-size: 11px; line-height: 1; border-radius: 2px; background: #eee; user-select: none; display: flex; justify-content: center; flex-direction: column } .csf-help { cursor: help; position: absolute; top: 0; right: 0; padding: 5px; font-size: 13px; color: #aaa } .csf-help .csf-help-text { display: none } .csf--preview { max-width: 100% } .csf-image-preview { display: inline-flex; align-items: center; justify-content: center; flex-direction: column; position: relative; padding: 6px; max-width: 120px; max-height: 120px; min-width: 40px; min-height: 40px; margin-bottom: 10px; text-align: center; border-radius: 2px; border: 1px solid #ccc; background-color: #f9f9f9; box-shadow: 0 1px 0 rgba(0, 0, 0, .08) } .csf-image-preview i { cursor: pointer; position: absolute; z-index: 1; right: 4px; top: 4px; font-size: 14px; width: 22px; height: 22px; line-height: 22px; text-align: center; text-decoration: none; color: #fff; background-color: #d33; opacity: .75; border-radius: 2px; transition: all .2s } .csf-image-preview i:hover { opacity: 1 } .csf-image-preview i:focus { box-shadow: none } .csf-image-preview span { position: relative; overflow: hidden; display: flex; height: 100%; width: 100% } .csf-image-preview img { max-width: 100%; height: auto; object-fit: contain } .csf-field-custom .csf-field { padding: 0 } .csf-field .chosen-container-single .chosen-single { height: 28px; line-height: 26px } .csf-field .chosen-container-single .chosen-single abbr { top: 0; right: 20px; font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", FontAwesome; font-weight: 900; font-size: 12px; height: 100%; width: 18px; color: #aaa; text-align: center; background: 0 0 } .csf-field .chosen-container-single .chosen-single abbr:before { content: "\f00d" } .csf-field .chosen-container-single .chosen-single abbr:hover { color: #555 } .csf-field .chosen-container-multi .chosen-choices li.search-choice .search-choice-close { font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", FontAwesome; font-weight: 900; font-size: 12px; height: 100%; width: 18px; color: #aaa; text-align: center; background: 0 0 } .csf-field .chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before { content: "\f00d"; display: inline-block; padding-top: 3px } .csf-field .chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { color: #555 } .csf-field .chosen-container-single .chosen-single div b { font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", FontAwesome; font-weight: 900; font-size: 14px; color: #aaa; background: 0 0 } .csf-field .chosen-container-single .chosen-single div b:before { content: "\f107" } .csf-field .chosen-container-single .chosen-single div b:hover { color: #555 } .csf-field .chosen-container-multi .chosen-choices li.search-choice-placeholder { border: 1px dashed #aaa; margin: 3px 5px 3px 0 } .csf-field .chosen-container-multi .ui-sortable li.search-choice span { cursor: move } .csf-field .chosen-container-active.chosen-with-drop .chosen-single div b:before { content: "\f106" } .csf-field .chosen-container-single .chosen-single-with-deselect span { margin-right: 40px } .csf-field .chosen-container-single .chosen-search input[type=text] { background: 0 0 } .csf-field .chosen-container-single .chosen-search:before { font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", FontAwesome; font-weight: 900; font-size: 11px; content: "\f002"; position: absolute; right: 12px; top: 10px; color: #aaa } .csf-field .wp-picker-container { display: inline-block } .csf-field .wp-picker-container .wp-color-result.button { margin-bottom: 0 } .csf-field .csf--transparent-wrap { display: none; position: relative; top: -1px; width: 235px; padding: 9px 10px; border: 1px solid #dfdfdf; border-top: none; background-color: #fff } .csf-field .wp-picker-active .csf--transparent-wrap { display: block } .csf-field .csf--transparent-slider { position: absolute; width: 190px; margin-left: 2px; height: 18px } .csf-field .csf--transparent-slider .ui-slider-handle { position: absolute; top: -3px; bottom: -3px; z-index: 5; border-color: #aaa; border-style: solid; border-width: 4px 3px; width: 10px; height: 16px; margin: 0 -5px; background: 0 0; cursor: ew-resize; opacity: .9; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, .2) } .csf-field .csf--transparent-slider .ui-slider-handle:before { content: " "; position: absolute; left: -2px; right: -2px; top: -3px; bottom: -3px; border: 2px solid #fff; border-radius: 3px } .csf-field .csf--transparent-offset { height: 18px; width: 200px; background: url(../images/checkerboard.png) repeat-y center left scroll #fff; border-radius: 2px; box-shadow: inset 0 0 5px rgba(0, 0, 0, .4) } .csf-field .csf--transparent-text { position: absolute; top: 12px; right: 10px; width: 30px; font-size: 12px; line-height: 12px; text-align: center; color: #999 } .csf-field .csf--transparent-button { cursor: pointer; user-select: none; margin-top: 10px; font-size: 11px; text-align: center; border-radius: 2px; padding: 3px 7px; box-shadow: 0 1px 0 rgba(0, 0, 0, .1); letter-spacing: .2px; color: #777; border: 1px solid #ccc; background-color: #f7f7f7; transition: background-color .2s, border-color .2s, color .2s } .csf-field .csf--transparent-active .wp-color-result { background-image: url(../images/checkerboard.png); background-size: 135px; background-position: center left; background-color: transparent !important } .csf-field .csf--transparent-active .csf--transparent-button { color: #fff; border-color: #3ea032; background-color: #4fb845 } .csf-field .csf--transparent-active .fa:before { content: "\f205" } .csf-widgets > .csf-field { position: relative; top: -1px; margin-left: -15px; margin-right: -15px; padding: 12px 15px } .csf-widgets > .csf-field .csf-title { float: none; width: 100%; margin-bottom: 5px } .csf-widgets > .csf-field .csf-fieldset { float: none; width: 100% } .csf-widgets .csf-field-text input { width: 100% } .csf-widgets .csf-field-notice .csf-notice { padding: 15px } .control-section .csf-widgets > .csf-field { margin-left: -10px; margin-right: -10px; padding: 10px 12px } .wp-block .csf-widgets { font-size: 13px } .wp-block .csf-widgets > .csf-field { margin-left: -10px; margin-right: -10px } .wp-block .csf-widgets > .csf-field .button-primary { color: #fff } .wp-block .csf-widgets > .csf-field > .csf-title > h4 { font-size: 13px } .control-section .csf-field { padding: 0 } .control-section .csf-field .csf-title { float: none; width: 100%; margin-bottom: 6px } .control-section .csf-field .csf-title h4 { display: block; font-size: 13px; line-height: 1; font-weight: 600; color: inherit } .control-section .csf-field .csf-fieldset { float: none; width: 100% } .control-section .csf-help { top: -5px; right: -5px } .control-section .csf-field-select select { width: 100% } .control-section .csf-field-heading { color: inherit; font-size: 14px; line-height: 1em; margin-right: -15px; margin-left: -15px; padding: 15px } .control-section .csf-field-subheading { color: inherit; font-size: 11px; margin-right: -15px; margin-left: -15px; padding: 10px 15px } .control-section .csf-subtitle-text { margin-top: 4px; font-size: 12px } .control-section .csf-field-submessage .csf-submessage { margin-right: -15px; margin-left: -15px; padding: 15px } .control-section .csf-fieldset .csf-field-heading, .control-section .csf-fieldset .csf-field-subheading, .control-section .csf-fieldset .csf-field-submessage .csf-submessage { margin-left: 0; margin-right: 0 } .control-section .csf-field-date label, .control-section .csf-field-datetime label { display: block } .control-section .csf-field-date .csf--to, .control-section .csf-field-datetime .csf--to { margin-top: 4px; margin-left: 0 } .control-section .csf-field-sorter ul li { padding: 5px } .control-section .csf-field-sorter .csf-modules { float: none; width: 100% } .control-section .csf-field-sorter .csf-modules:first-child { padding-right: 0; padding-bottom: 15px } .control-section .csf-field-background .csf--background-attributes { flex-direction: column } .control-section .csf-field-spacing input { width: 90px } .control-section .csf-field-border .csf--input { flex: 1 50% } .control-section .csf-field-border input, .control-section .csf-field-border select { width: 100% } .control-section .csf-field-spinner input { width: 50px } .control-section .csf-field-number .csf--wrap { width: 100% } .control-section .csf-field-backup .csf-export-data { display: none } .control-section .csf-field-fieldset .csf-fieldset-content { border-color: #e5e5e5 } .control-section .csf-accordion-content > .csf-field, .control-section .csf-cloneable-content > .csf-field, .control-section .csf-fieldset-content > .csf-field, .control-section .csf-repeater-content > .csf-field, .control-section .csf-sortable-content > .csf-field, .control-section .csf-tabbed-content > .csf-field { padding: 10px } .control-section .csf-accordion-content > .csf-field .csf-title, .control-section .csf-cloneable-content > .csf-field .csf-title, .control-section .csf-fieldset-content > .csf-field .csf-title, .control-section .csf-repeater-content > .csf-field .csf-title, .control-section .csf-sortable-content > .csf-field .csf-title, .control-section .csf-tabbed-content > .csf-field .csf-title { margin-bottom: 5px } .control-section .csf-accordion-content > .csf-field h4, .control-section .csf-cloneable-content > .csf-field h4, .control-section .csf-fieldset-content > .csf-field h4, .control-section .csf-repeater-content > .csf-field h4, .control-section .csf-sortable-content > .csf-field h4, .control-section .csf-tabbed-content > .csf-field h4 { font-size: 12px } .control-section .csf-depend-hidden.csf-depend-on { display: none !important } .control-section .csf-depend-visible.csf-depend-on { border-top: 0 !important } .csf-taxonomy { max-width: 95% } .csf-taxonomy > .csf-field { border-top: none !important } .csf-taxonomy > .csf-field-heading { font-size: 1.1em; padding: 20px !important; border: 1px solid #ddd } .csf-taxonomy > .csf-field-subheading { font-size: 12px; padding: 15px !important; border: 1px solid #ddd } .csf-taxonomy > .csf-field-submessage .csf-submessage { padding: 15px; border-left-width: 1px; border-left-style: solid; border-right-width: 1px; border-right-style: solid } .csf-taxonomy > .csf-field-notice { background-color: transparent } .csf-taxonomy .csf-section-title { display: block; padding: 15px; background-color: #f9f9f9; border: 1px solid #e5e5e5; box-shadow: 0 1px 1px rgba(0, 0, 0, .04) } .csf-taxonomy-add-fields > .csf-field { padding: 8px 0 } .csf-taxonomy-add-fields > .csf-field > .csf-title { float: none; width: 100%; padding: 2px 2px 4px 0 } .csf-taxonomy-add-fields > .csf-field > .csf-title h4 { font-size: 12px; font-weight: 400 } .csf-taxonomy-add-fields > .csf-field > .csf-fieldset { float: none; width: 100% } .csf-taxonomy-add-fields > .csf-field > .csf-fieldset > .csf-help { right: -5px } .csf-taxonomy-add-fields + p.submit { margin-top: 0 } .csf-taxonomy-edit-fields > .csf-field { padding: 20px 0 } .csf-taxonomy-edit-fields > .csf-field > .csf-title { width: 200px } .csf-taxonomy-edit-fields > .csf-field > .csf-title h4 { font-size: 14px; font-weight: 600; line-height: 1.3; display: inline-block; vertical-align: middle } .csf-taxonomy-edit-fields > .csf-field > .csf-fieldset { width: calc(100% - 220px) } .csf-taxonomy-edit-fields > .csf-field > .csf-fieldset > .csf-help { top: -5px; right: -5px } .csf-taxonomy-edit-fields > .csf-field-submessage { margin: 20px 0 } .csf-taxonomy-edit-fields > .csf-field-heading, .csf-taxonomy-edit-fields > .csf-field-subheading { margin: 20px 0; border: 1px solid #ddd } .csf-nav-menu-options { clear: both; float: left; width: 100% } .csf-nav-menu-options > .csf-fields { margin: 10px -10px; border-top: 1px solid #eee; border-bottom: 1px solid #eee } .csf-nav-menu-options > .csf-fields > .csf-field { padding: 12px } .csf-nav-menu-options > .csf-fields > .csf-field .csf-title { float: none; width: 100%; margin-bottom: 5px } .csf-nav-menu-options > .csf-fields > .csf-field .csf-fieldset { float: none; width: 100% } .csf-nav-menu-options .csf-field-text input { width: 100% } .csf-nav-menu-options .csf-field-notice .csf-notice { padding: 15px } .csf-nav-menu-title { padding: 12px; background-color: #f5f5f5; border-top: 1px solid #eee; border-bottom: 1px solid #eee } .csf-nav-menu-title:first-child { border-top: 0 } .csf-nav-menu-title h4 { margin: 0; padding: 0; color: #23282d } .csf-nav-menu-icon { margin-right: 5px } .csf-profile-options > h2 > .fa { padding-right: 7px } .csf-profile-options > .csf-field { max-width: 750px; padding: 15px 0; border-top: none !important } .csf-profile-options > .csf-field > .csf-title { width: 200px } .csf-profile-options > .csf-field > .csf-title h4 { font-size: 14px; font-weight: 600; line-height: 1.3; display: inline-block; vertical-align: middle } .csf-profile-options > .csf-field > .csf-fieldset { width: calc(100% - 220px) } .csf-profile-options > .csf-field > .csf-fieldset > .csf-help { top: -15px; right: -5px } .csf-profile-options > .csf-field-heading { font-size: 1.1em } .csf-profile-options > .csf-field-subheading { font-size: 12px } .csf-profile-options > .csf-field-heading, .csf-profile-options > .csf-field-subheading { margin: 10px 0; padding: 15px !important; border: 1px solid #ddd } .csf-profile-options > .csf-field-submessage { margin: 20px 0 } .csf-profile-options > .csf-field-submessage .csf-submessage { padding: 10px; border-left-width: 1px; border-left-style: solid; border-right-width: 1px; border-right-style: solid } .csf-profile-options > .csf-field-notice { background-color: transparent } .csf-modal { position: fixed; z-index: 100101; top: 0; left: 0; width: 100%; height: 100% } .csf-modal.hidden { display: none } .csf-modal-icon { z-index: 100102 } .csf-modal-table { display: table; width: 100%; height: 100% } .csf-modal-table-cell { display: table-cell; vertical-align: middle; margin: 100px 0 } .csf-modal-inner { position: relative; z-index: 10; width: 760px; height: 750px; margin: 0 auto; background-color: #fff } .csf-modal-content { position: relative; overflow: hidden; overflow-y: auto; height: 595px } .csf-modal-content .csf-shortcode-button { display: none } .csf-modal-content .csf-field { padding: 15px 30px 15px 15px } .csf-modal-content a:active, .csf-modal-content a:focus { outline: 0; box-shadow: none } .csf-modal-content h4 { font-size: 13px } .csf-modal-content h4 small { font-style: italic; font-weight: 400; color: #aaa } .csf-modal-title { position: relative; background-color: #fcfcfc; border-bottom: 1px solid #ddd; height: 36px; font-size: 16px; font-weight: 600; line-height: 36px; margin: 0; padding: 0 36px 0 16px } .csf-modal-header { width: 100%; padding: 14px 0; background-color: #f5f5f5; border-bottom: 1px solid #ddd } .csf-modal-header select { display: block; width: 250px; margin: 0 auto; font-size: 13px; line-height: 1; height: 30px; min-height: 30px; background-color: #fff } .csf-modal-close { color: #666; padding: 0; position: absolute; top: 0; right: 0; width: 36px; height: 36px; text-align: center; background: 0 0; border: none; cursor: pointer } .csf-modal-close:before { font: normal 20px/36px dashicons; content: "\f158"; vertical-align: top; width: 36px; height: 36px } .csf-modal-close:hover { opacity: .5 } .csf-modal-insert-wrapper { text-align: center; width: 100%; padding: 15px 0; background-color: #f5f5f5; border-top: 1px solid #ddd } .csf-modal-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: #000; opacity: .5 } .csf--repeatable { padding: 15px 15px 0 15px } .csf--repeat-button-block { text-align: center; padding-bottom: 15px } .csf--repeat-shortcode { position: relative; margin-bottom: 15px; border: 1px dashed #ddd } .csf--repeat-shortcode:first-child .csf-repeat-remove { display: none } .csf--repeat-shortcode .csf-repeat-remove { position: absolute; right: 10px; top: 10px; z-index: 10; cursor: pointer; display: inline-block; font-size: 11px; width: 18px; height: 18px; line-height: 18px; text-align: center; border-radius: 2px; color: #fff; background-color: #e14d43; opacity: .5 } .csf--repeat-shortcode .csf-repeat-remove:hover { opacity: .5 } .csf-shortcode-single .csf-modal-inner { height: 750px } .csf-shortcode-single .csf-modal-content { height: 652px } .elementor-editor-active .csf-shortcode-button { margin-left: 5px } .elementor-editor-active .csf-modal .hidden { display: none !important } .csf-shortcode-block { text-align: center; padding: 14px; font-size: 13px; background-color: #f5f5f5; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif } .csf-shortcode-block .components-button { margin-bottom: 10px } .csf-modal-icon .csf-icon-title { padding: 15px 0; margin: 4px; font-size: 14px; font-weight: 700; text-align: center; border: 1px solid #eee; background-color: #f7f7f7 } .csf-modal-icon .csf-modal-header { text-align: center } .csf-modal-icon .csf-icon-search { width: 50%; height: 40px; line-height: 40px } .csf-modal-icon i { cursor: pointer; display: inline-block; margin: 4px; width: 35px; height: 35px; line-height: 35px; font-size: 16px; color: #555; text-align: center; border: 1px solid #ccc; background-color: #f7f7f7; border-radius: 2px; box-shadow: 1px 1px 0 rgba(0, 0, 0, .05) } .csf-modal-icon i:hover { color: #fff; border-color: #222; background-color: #222 } .csf-modal-icon .csf-modal-content { padding: 10px; height: 618px } .csf-modal-icon .csf-error-text { padding: 10px } .csf-modal-loading { display: none; position: absolute; left: 15px; top: 15px } .csf-loading { position: relative; width: 20px; height: 20px; background: #ccc; border-radius: 20px; box-shadow: 0 2px 5px rgba(0, 0, 0, .07) } .csf-loading:after { position: absolute; top: 50%; left: 50%; width: 4px; height: 4px; content: ""; margin-top: -2px; margin-left: -2px; background-color: #fff; animation-duration: .5s; animation-iteration-count: infinite; animation-timing-function: linear; animation-name: csfLoader; border-radius: 4px } @keyframes csfLoader { 0% { transform: rotate(0) translateX(-6px) rotate(0) } 100% { transform: rotate(360deg) translateX(-6px) rotate(-360deg) } } .csf-subtitle-text { margin-top: 6px; font-weight: 400; color: #999 } .csf-desc-text { clear: both; float: left; width: 100%; margin-top: 6px; font-weight: 400; color: #999 } .csf-error-text { margin-top: 6px; color: #d02c21 } .csf-before-text { margin-bottom: 6px } .csf-after-text { margin-top: 6px } .csf-metabox-hide { display: none !important } .csf-metabox-show { display: block !important } .csf-depend-hidden.csf-depend-on { display: none } .csf-depend-visible.csf-depend-on { display: block; opacity: .75; filter: grayscale(1); user-select: none; border-top: 1px solid #eee } .csf-depend-visible.csf-depend-on .clear:before { content: ""; left: 0; top: 0; right: 0; bottom: 0; position: absolute; background-color: #eee; opacity: .25; z-index: 10 } .csf-warning-primary { color: #fff !important; border-color: #dc3545 !important; background: #dc3545 !important } .csf-warning-primary:focus, .csf-warning-primary:hover { border-color: #bd2130 !important; background: #bd2130 !important } .csf-warning-primary:focus { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #bd2130 !important } .csf-warning-primary:active { border-color: #bd2130 !important; background: #bd2130 !important } .csf-form-result { display: none; float: left; padding: 0 8px; margin-right: 4px; font-size: 11px; line-height: 30px; user-select: none; border-radius: 2px } .csf-form-show { display: block } .csf-form-success { color: #fff; background-color: #46b450 } .csf-form-warning { color: #8a6d3b; background-color: #faebcc } .csf-label-error { position: relative; top: -2px; display: inline-block; font-size: 10px; line-height: 10px; height: 10px; width: 10px; padding: 1px; font-style: normal; text-align: center; color: #fff; vertical-align: middle; background-color: #e10000; border-radius: 2px } .csf-no-option { padding: 30px } .csf-input-number { -moz-appearance: textfield } .csf-input-number::-webkit-inner-spin-button, .csf-input-number::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0 } .csf-fa5-shims .csf .fab, .csf-fa5-shims .csf .far, .csf-fa5-shims .csf .fas { font-family: FontAwesome; font-style: normal } .csf-welcome-wrap { position: relative; margin: 25px 40px 0 20px; font-size: 15px; max-width: 1200px } .csf-welcome-wrap p { font-size: 14px; line-height: 1.5 } .csf-welcome-wrap h1 { margin: .2em 200px 0 0; padding: 0; color: #32373c; line-height: 1.2em; font-size: 2.8em; font-weight: 400 } .csf-welcome-wrap .csf-logo { position: absolute; overflow: hidden; top: 0; right: 0; height: 160px; width: 140px; background-image: linear-gradient(45deg, #2d67cb, #ad19f3); box-shadow: 0 1px 4px rgba(0, 0, 0, .25), inset 0 0 0 4px rgba(0, 0, 0, .25) } .csf-welcome-wrap .csf-logo .csf--effects i { position: absolute; width: 200px; height: 100px; background-color: rgba(0, 0, 0, .15); transform: rotate(-45deg) } .csf-welcome-wrap .csf-logo .csf--effects i:nth-child(1) { bottom: -20px; right: -70px } .csf-welcome-wrap .csf-logo .csf--effects i:nth-child(2) { bottom: -35px; right: -80px } .csf-welcome-wrap .csf-logo .csf--effects i:nth-child(3) { bottom: -50px; right: -90px } .csf-welcome-wrap .csf-logo .csf--effects i:nth-child(4) { bottom: -65px; right: -100px } .csf-welcome-wrap .csf-logo .csf--wp-logos { position: relative; padding-top: 25px; text-align: center } .csf-welcome-wrap .csf-logo .csf--wp-logo { position: absolute; left: 20px; width: 20px; height: 20px; background-repeat: no-repeat; background-position: center center; background-image: url(../images/wp-logo.svg) } .csf-welcome-wrap .csf-logo .csf--wp-plugin-logo { display: inline-block; width: 50px; height: 50px; border: 3px solid #fff; background-size: 40px; background-repeat: no-repeat; background-position: center center; background-image: url(../images/wp-plugin-logo.svg); border-radius: 100%; vertical-align: middle } .csf-welcome-wrap .csf-logo .csf--text { position: absolute; left: 0; right: 0; top: 90px; color: #fff; font-size: 13px; line-height: 1.2em; font-weight: 600; text-align: center; text-transform: uppercase; text-shadow: 1px 1px 0 rgba(0, 0, 0, .25) } .csf-welcome-wrap .csf-logo .csf--version { top: auto; left: auto; right: 8px; bottom: 4px; font-size: 11px; text-transform: lowercase } .csf-welcome-wrap .csf-about-text { font-weight: 400; line-height: 1.6em; font-size: 19px; margin: 1em 200px 1em 0; color: #555d66 } .csf-welcome-wrap .csf-demo-button { margin: 1em 200px 2em 0 } .csf-welcome-wrap .nav-tab-wrapper { margin-bottom: 20px } .csf-welcome-wrap ul { list-style-type: disc; padding-left: 15px } .csf-welcome-wrap .csf--col { float: left; padding-right: 20px; box-sizing: border-box } .csf-welcome-wrap .csf--col-2 { width: 50% } .csf-welcome-wrap .csf--col-3 { width: 33.333% } .csf-welcome-wrap .csf--col-4 { width: 25% } .csf-welcome-wrap .csf--col-5 { width: 20% } .csf-welcome-wrap .csf--col-last { padding-right: 0 } .csf-welcome-wrap .csf--col-upgrade { padding: 10px 0; text-align: center; border-top: 1px solid #e5e5e5 } .csf--table-compare tfoot td, .csf--table-compare thead td { text-align: center } .csf--table-compare td { font-size: 14px; text-align: center; vertical-align: middle; padding: 10px } .csf--table-compare td:first-child { text-align: left } .csf--table-compare tfoot td { padding: 15px 0 } .csf--table-compare .fa { font-size: 18px } .csf--table-compare .fa-check-circle { color: #46b450 } .csf--table-compare .fa-times-circle { color: #dc3232 } .csf-welcome-cols { clear: both; margin: 20px 0; background-color: #fff; padding: 0 0; border-radius: 2px; border: 1px solid #e5e5e5 } .csf-welcome-cols .csf--col { width: 33.333%; float: left; padding: 20px; text-align: center; box-sizing: border-box; min-height: 200px; border-right: 1px solid #e5e5e5 } .csf-welcome-cols .csf--block, .csf-welcome-cols .csf--left { float: left; width: 20%; padding: 0 30px; text-align: center; box-sizing: border-box } .csf-welcome-cols .csf--block { width: 80% } .csf-welcome-cols .csf--col-first { border-bottom: 1px solid #e5e5e5 } .csf-welcome-cols .csf--last { border-right: none } .csf-welcome-cols .csf--space { height: 20px } .csf-welcome-cols .csf--icon { display: inline-block; font-size: 20px; width: 30px; height: 30px; line-height: 30px; text-align: center; margin-bottom: 10px; color: #fff; background-color: #555; border-radius: 30px } .csf-welcome-cols .csf--active { background-color: #5cb85c } .csf-welcome-cols .csf--deactive { background-color: #e14d43 } .csf-welcome-cols .csf--title { font-weight: 700; display: block } .csf-welcome-cols p:last-child { margin-bottom: 0 } .csf-features-cols .csf--key-features { width: 30% } .csf-features-cols .csf--available-fields { width: 70% } .csf-code-block { margin: 20px 0; padding: 5px 20px; background-color: #fff; border-radius: 2px; box-shadow: 0 1px 1px rgba(0, 0, 0, .15) } .csf-code-block pre { font-size: 13px; color: #0073aa } .csf-code-block pre span { color: #999 } .csf--table-fields td { font-size: 14px } .csf--upgrade a { color: #5cb85c; font-weight: 700 } .csf--upgrade a:focus, .csf--upgrade a:hover { color: #4aa14a; outline: 0; box-shadow: none } @media only screen and (max-width: 782px) { .csf-welcome-cols .csf--col { width: 100%; min-height: auto; border-right: none; border-bottom: 1px solid #e5e5e5 } .csf-features-cols .csf--key-features { width: 100% } .csf-features-cols .csf--available-fields { width: 100% } } @media only screen and (max-width: 1200px) { .csf-metabox .csf-field .csf-title { float: none; width: 100%; margin-bottom: 10px } .csf-metabox .csf-field .csf-fieldset { float: none; width: 100% } } @media only screen and (max-width: 782px) { .csf-header-inner { text-align: center } .csf-header-inner h1 { width: 100%; margin-bottom: 10px } .csf-form-result { float: none; margin-right: 0; margin-bottom: 10px } .csf-header-left, .csf-header-right, .csf-search { width: 100% } .csf-search { text-align: center; margin-bottom: 15px } .csf-footer { text-align: center } .csf-buttons { float: none } .csf-copyright { float: none; margin-top: 10px } .csf-expand-all, .csf-nav, .csf-nav-background, .csf-reset-section { display: none !important } .csf-nav-normal + .csf-content { margin-left: 0 } .csf-section, .csf-section-title { display: block !important } .csf-field .csf-title { float: none; width: 100%; margin-bottom: 10px } .csf-field .csf-fieldset { float: none; width: 100% } .csf-field-color .button.wp-picker-clear { padding: 0 8px; line-height: 2.14285714; min-height: 32px } .csf-profile-options > .csf-field > .csf-title, .csf-taxonomy-edit-fields > .csf-field > .csf-title { float: none; width: 100%; margin-bottom: 10px } .csf-profile-options > .csf-field > .csf-fieldset, .csf-taxonomy-edit-fields > .csf-field > .csf-fieldset { float: none; width: 100% } .csf-nav-menu-options > .csf-fields { margin-left: -10px; margin-right: -10px } .csf-nav-menu-options > .csf-fields > .csf-field { padding: 10px } } @media only screen and (max-width: 782px) { .csf-modal .csf-modal-inner { width: 90% } } @media only screen and (max-height: 750px) { .csf-modal .csf-modal-inner { height: auto } .csf-modal .csf-modal-content { height: calc(100vh - 200px) } } .chosen-container { position: relative; display: inline-block; vertical-align: middle; font-size: 13px; user-select: none } .chosen-container * { box-sizing: border-box } .chosen-container .chosen-drop { position: absolute; top: 100%; z-index: 1010; width: 100%; border: 1px solid #aaa; border-top: 0; background: #fff; box-shadow: 0 4px 5px rgba(0, 0, 0, .15); clip: rect(0, 0, 0, 0); clip-path: inset(100% 100%) } .chosen-container.chosen-with-drop .chosen-drop { clip: auto; clip-path: none } .chosen-container a { cursor: pointer } .chosen-container .chosen-single .group-name, .chosen-container .search-choice .group-name { margin-right: 4px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-weight: 400; color: #999 } .chosen-container .chosen-single .group-name:after, .chosen-container .search-choice .group-name:after { content: ":"; padding-left: 2px; vertical-align: top } .chosen-container-single .chosen-single { position: relative; display: block; overflow: hidden; padding: 0 0 0 8px; height: 25px; border: 1px solid #aaa; border-radius: 5px; background-color: #fff; background: linear-gradient(#fff 20%, #f6f6f6 50%, #eee 52%, #f4f4f4 100%); background-clip: padding-box; box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, .1); color: #444; text-decoration: none; white-space: nowrap; line-height: 24px } .chosen-container-single .chosen-default { color: #999 } .chosen-container-single .chosen-single span { display: block; overflow: hidden; margin-right: 26px; text-overflow: ellipsis; white-space: nowrap } .chosen-container-single .chosen-single-with-deselect span { margin-right: 38px } .chosen-container-single .chosen-single abbr { position: absolute; top: 6px; right: 26px; display: block; width: 12px; height: 12px; font-size: 1px } .chosen-container-single .chosen-single div { position: absolute; top: 0; right: 0; display: block; width: 18px; height: 100% } .chosen-container-single .chosen-single div b { display: block; width: 100%; height: 100% } .chosen-container-single .chosen-search { position: relative; z-index: 1010; margin: 0; padding: 3px 4px; white-space: nowrap } .chosen-container-single .chosen-search input[type=text] { margin: 1px 0; padding: 4px 20px 4px 5px; width: 100%; height: auto; outline: 0; border: 1px solid #aaa; font-size: 1em; font-family: sans-serif; line-height: normal; border-radius: 0 } .chosen-container-single .chosen-drop { margin-top: -1px; border-radius: 0 0 4px 4px; background-clip: padding-box } .chosen-container-single.chosen-container-single-nosearch .chosen-search { position: absolute; clip: rect(0, 0, 0, 0); clip-path: inset(100% 100%) } .chosen-container .chosen-results { color: #444; position: relative; overflow-x: hidden; overflow-y: auto; margin: 0 4px 4px 0; padding: 0 0 0 4px; max-height: 240px; -webkit-overflow-scrolling: touch } .chosen-container .chosen-results li { display: none; margin: 0; padding: 5px 6px; list-style: none; line-height: 15px; word-wrap: break-word; -webkit-touch-callout: none } .chosen-container .chosen-results li.active-result { display: list-item; cursor: pointer } .chosen-container .chosen-results li.disabled-result { display: list-item; color: #ccc; cursor: default } .chosen-container .chosen-results li.highlighted { background-color: #3875d7; background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); color: #fff } .chosen-container .chosen-results li.no-results { color: #777; display: list-item; background: #f4f4f4 } .chosen-container .chosen-results li.group-result { display: list-item; font-weight: 700; cursor: default } .chosen-container .chosen-results li.group-option { padding-left: 15px } .chosen-container .chosen-results li em { font-style: normal; text-decoration: underline } .chosen-container-multi .chosen-choices { position: relative; overflow: hidden; margin: 0; padding: 0 5px; width: 100%; height: auto; border: 1px solid #aaa; background-color: #fff; background-image: linear-gradient(#eee 1%, #fff 15%); cursor: text } .chosen-container-multi .chosen-choices li { float: left; list-style: none } .chosen-container-multi .chosen-choices li.search-field { margin: 0; padding: 0; white-space: nowrap } .chosen-container-multi .chosen-choices li.search-field input[type=text] { margin: 1px 0; padding: 0; outline: 0; border: 0 !important; background: 0 0 !important; box-shadow: none; color: #999; font-size: 100%; font-family: sans-serif; line-height: normal; border-radius: 0; width: 25px; height: 25px; min-height: 25px } .chosen-container-multi .chosen-choices li.search-choice { position: relative; margin: 3px 5px 3px 0; padding: 3px 20px 3px 6px; border: 1px solid #aaa; max-width: 100%; border-radius: 3px; background-color: #eee; background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); background-size: 100% 19px; background-repeat: repeat-x; background-clip: padding-box; box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, .05); color: #333; line-height: 13px; cursor: default } .chosen-container-multi .chosen-choices li.search-choice span { word-wrap: break-word; white-space: nowrap } .chosen-container-multi .chosen-choices li.search-choice .search-choice-close { position: absolute; top: 0; right: 0; display: block; width: 12px; height: 12px; font-size: 1px } .chosen-container-multi .chosen-choices li.search-choice-disabled { padding-right: 5px; border: 1px solid #ccc; background-color: #e4e4e4; background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); color: #666 } .chosen-container-multi .chosen-choices li.search-choice-focus { background: #d4d4d4 } .chosen-container-multi .chosen-results { margin: 0; padding: 0 } .chosen-container-multi .chosen-drop .result-selected { display: list-item; color: #ccc; cursor: default } .chosen-container-active .chosen-single { border: 1px solid #5897fb; box-shadow: 0 0 5px rgba(0, 0, 0, .3) } .chosen-container-active.chosen-with-drop .chosen-single { border: 1px solid #aaa; border-bottom-right-radius: 0; border-bottom-left-radius: 0; background-image: linear-gradient(#eee 20%, #fff 80%); box-shadow: 0 1px 0 #fff inset } .chosen-container-active.chosen-with-drop .chosen-single div { border-left: none; background: 0 0 } .chosen-container-active .chosen-choices { border: 1px solid #5897fb; box-shadow: 0 0 5px rgba(0, 0, 0, .3) } .chosen-container-active .chosen-choices li.search-field input[type=text] { color: #222 !important } .chosen-disabled { opacity: .5 !important; cursor: default } .chosen-disabled .chosen-single { cursor: default } .chosen-disabled .chosen-choices .search-choice .search-choice-close { cursor: default } .chosen-rtl { text-align: right } .chosen-rtl .chosen-single { overflow: visible; padding: 0 8px 0 0 } .chosen-rtl .chosen-single span { margin-right: 0; margin-left: 26px; direction: rtl } .chosen-rtl .chosen-single-with-deselect span { margin-left: 38px } .chosen-rtl .chosen-single div { right: auto; left: 3px } .chosen-rtl .chosen-single abbr { right: auto; left: 26px } .chosen-rtl .chosen-choices li { float: right } .chosen-rtl .chosen-choices li.search-field input[type=text] { direction: rtl } .chosen-rtl .chosen-choices li.search-choice { margin: 3px 5px 3px 0; padding: 3px 5px 3px 19px } .chosen-rtl .chosen-choices li.search-choice .search-choice-close { right: auto; left: 4px } .chosen-rtl.chosen-container-single .chosen-results { margin: 0 0 4px 4px; padding: 0 4px 0 0 } .chosen-rtl .chosen-results li.group-option { padding-right: 15px; padding-left: 0 } .chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { border-right: none } .chosen-rtl .chosen-search input[type=text] { padding: 4px 5px 4px 20px; direction: rtl } .flatpickr-calendar { background: 0 0; opacity: 0; display: none; text-align: center; visibility: hidden; padding: 0; -webkit-animation: none; animation: none; direction: ltr; border: 0; font-size: 14px; line-height: 24px; border-radius: 5px; position: absolute; width: 307.875px; -webkit-box-sizing: border-box; box-sizing: border-box; -ms-touch-action: manipulation; touch-action: manipulation; background: #fff; -webkit-box-shadow: 1px 0 0 #e6e6e6, -1px 0 0 #e6e6e6, 0 1px 0 #e6e6e6, 0 -1px 0 #e6e6e6, 0 3px 13px rgba(0, 0, 0, .08); box-shadow: 1px 0 0 #e6e6e6, -1px 0 0 #e6e6e6, 0 1px 0 #e6e6e6, 0 -1px 0 #e6e6e6, 0 3px 13px rgba(0, 0, 0, .08) } .flatpickr-calendar.inline, .flatpickr-calendar.open { opacity: 1; max-height: 640px; visibility: visible } .flatpickr-calendar.open { display: inline-block; z-index: 99999 } .flatpickr-calendar.animate.open { -webkit-animation: fpFadeInDown .3s cubic-bezier(.23, 1, .32, 1); animation: fpFadeInDown .3s cubic-bezier(.23, 1, .32, 1) } .flatpickr-calendar.inline { display: block; position: relative; top: 2px } .flatpickr-calendar.static { position: absolute; top: calc(100% + 2px) } .flatpickr-calendar.static.open { z-index: 999; display: block } .flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7) { -webkit-box-shadow: none !important; box-shadow: none !important } .flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1) { -webkit-box-shadow: -2px 0 0 #e6e6e6, 5px 0 0 #e6e6e6; box-shadow: -2px 0 0 #e6e6e6, 5px 0 0 #e6e6e6 } .flatpickr-calendar .hasTime .dayContainer, .flatpickr-calendar .hasWeeks .dayContainer { border-bottom: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 0 } .flatpickr-calendar .hasWeeks .dayContainer { border-left: 0 } .flatpickr-calendar.hasTime .flatpickr-time { height: 40px; border-top: 1px solid #e6e6e6 } .flatpickr-calendar.noCalendar.hasTime .flatpickr-time { height: auto } .flatpickr-calendar:after, .flatpickr-calendar:before { position: absolute; display: block; pointer-events: none; border: solid transparent; content: ''; height: 0; width: 0; left: 22px } .flatpickr-calendar.arrowRight:after, .flatpickr-calendar.arrowRight:before, .flatpickr-calendar.rightMost:after, .flatpickr-calendar.rightMost:before { left: auto; right: 22px } .flatpickr-calendar.arrowCenter:after, .flatpickr-calendar.arrowCenter:before { left: 50%; right: 50% } .flatpickr-calendar:before { border-width: 5px; margin: 0 -5px } .flatpickr-calendar:after { border-width: 4px; margin: 0 -4px } .flatpickr-calendar.arrowTop:after, .flatpickr-calendar.arrowTop:before { bottom: 100% } .flatpickr-calendar.arrowTop:before { border-bottom-color: #e6e6e6 } .flatpickr-calendar.arrowTop:after { border-bottom-color: #fff } .flatpickr-calendar.arrowBottom:after, .flatpickr-calendar.arrowBottom:before { top: 100% } .flatpickr-calendar.arrowBottom:before { border-top-color: #e6e6e6 } .flatpickr-calendar.arrowBottom:after { border-top-color: #fff } .flatpickr-calendar:focus { outline: 0 } .flatpickr-wrapper { position: relative; display: inline-block } .flatpickr-months { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex } .flatpickr-months .flatpickr-month { background: 0 0; color: rgba(0, 0, 0, .9); fill: rgba(0, 0, 0, .9); height: 34px; line-height: 1; text-align: center; position: relative; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; overflow: hidden; -webkit-box-flex: 1; -webkit-flex: 1; -ms-flex: 1; flex: 1 } .flatpickr-months .flatpickr-next-month, .flatpickr-months .flatpickr-prev-month { text-decoration: none; cursor: pointer; position: absolute; top: 0; height: 34px; padding: 10px; z-index: 3; color: rgba(0, 0, 0, .9); fill: rgba(0, 0, 0, .9) } .flatpickr-months .flatpickr-next-month.flatpickr-disabled, .flatpickr-months .flatpickr-prev-month.flatpickr-disabled { display: none } .flatpickr-months .flatpickr-next-month i, .flatpickr-months .flatpickr-prev-month i { position: relative } .flatpickr-months .flatpickr-next-month.flatpickr-prev-month, .flatpickr-months .flatpickr-prev-month.flatpickr-prev-month { left: 0 } .flatpickr-months .flatpickr-next-month.flatpickr-next-month, .flatpickr-months .flatpickr-prev-month.flatpickr-next-month { right: 0 } .flatpickr-months .flatpickr-next-month:hover, .flatpickr-months .flatpickr-prev-month:hover { color: #959ea9 } .flatpickr-months .flatpickr-next-month:hover svg, .flatpickr-months .flatpickr-prev-month:hover svg { fill: #f64747 } .flatpickr-months .flatpickr-next-month svg, .flatpickr-months .flatpickr-prev-month svg { width: 14px; height: 14px } .flatpickr-months .flatpickr-next-month svg path, .flatpickr-months .flatpickr-prev-month svg path { -webkit-transition: fill .1s; transition: fill .1s; fill: inherit } .numInputWrapper { position: relative; height: auto } .numInputWrapper input, .numInputWrapper span { display: inline-block } .numInputWrapper input { width: 100% } .numInputWrapper input::-ms-clear { display: none } .numInputWrapper input::-webkit-inner-spin-button, .numInputWrapper input::-webkit-outer-spin-button { margin: 0; -webkit-appearance: none } .numInputWrapper span { position: absolute; right: 0; width: 14px; padding: 0 4px 0 2px; height: 50%; line-height: 50%; opacity: 0; cursor: pointer; border: 1px solid rgba(57, 57, 57, .15); -webkit-box-sizing: border-box; box-sizing: border-box } .numInputWrapper span:hover { background: rgba(0, 0, 0, .1) } .numInputWrapper span:active { background: rgba(0, 0, 0, .2) } .numInputWrapper span:after { display: block; content: ""; position: absolute } .numInputWrapper span.arrowUp { top: 0; border-bottom: 0 } .numInputWrapper span.arrowUp:after { border-left: 4px solid transparent; border-right: 4px solid transparent; border-bottom: 4px solid rgba(57, 57, 57, .6); top: 26% } .numInputWrapper span.arrowDown { top: 50% } .numInputWrapper span.arrowDown:after { border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 4px solid rgba(57, 57, 57, .6); top: 40% } .numInputWrapper span svg { width: inherit; height: auto } .numInputWrapper span svg path { fill: rgba(0, 0, 0, .5) } .numInputWrapper:hover { background: rgba(0, 0, 0, .05) } .numInputWrapper:hover span { opacity: 1 } .flatpickr-current-month { font-size: 135%; line-height: inherit; font-weight: 300; color: inherit; position: absolute; width: 75%; left: 12.5%; padding: 7.48px 0 0 0; line-height: 1; height: 34px; display: inline-block; text-align: center; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0) } .flatpickr-current-month span.cur-month { font-family: inherit; font-weight: 700; color: inherit; display: inline-block; margin-left: .5ch; padding: 0 } .flatpickr-current-month span.cur-month:hover { background: rgba(0, 0, 0, .05) } .flatpickr-current-month .numInputWrapper { width: 6ch; display: inline-block } .flatpickr-current-month .numInputWrapper span.arrowUp:after { border-bottom-color: rgba(0, 0, 0, .9) } .flatpickr-current-month .numInputWrapper span.arrowDown:after { border-top-color: rgba(0, 0, 0, .9) } .flatpickr-current-month input.cur-year { background: 0 0; -webkit-box-sizing: border-box; box-sizing: border-box; color: inherit; cursor: text; padding: 0 0 0 .5ch; margin: 0; display: inline-block; font-size: inherit; font-family: inherit; font-weight: 300; line-height: inherit; height: auto; border: 0; border-radius: 0; vertical-align: initial; -webkit-appearance: textfield; -moz-appearance: textfield; appearance: textfield } .flatpickr-current-month input.cur-year:focus { outline: 0 } .flatpickr-current-month input.cur-year[disabled], .flatpickr-current-month input.cur-year[disabled]:hover { font-size: 100%; color: rgba(0, 0, 0, .5); background: 0 0; pointer-events: none } .flatpickr-current-month .flatpickr-monthDropdown-months { appearance: menulist; background: 0 0; border: none; border-radius: 0; box-sizing: border-box; color: inherit; cursor: pointer; font-size: inherit; font-family: inherit; font-weight: 300; height: auto; line-height: inherit; margin: -1px 0 0 0; outline: 0; padding: 0 0 0 .5ch; position: relative; vertical-align: initial; -webkit-box-sizing: border-box; -webkit-appearance: menulist; -moz-appearance: menulist; width: auto } .flatpickr-current-month .flatpickr-monthDropdown-months:active, .flatpickr-current-month .flatpickr-monthDropdown-months:focus { outline: 0 } .flatpickr-current-month .flatpickr-monthDropdown-months:hover { background: rgba(0, 0, 0, .05) } .flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month { background-color: transparent; outline: 0; padding: 0 } .flatpickr-weekdays { background: 0 0; text-align: center; overflow: hidden; width: 100%; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; height: 28px } .flatpickr-weekdays .flatpickr-weekdaycontainer { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-flex: 1; -webkit-flex: 1; -ms-flex: 1; flex: 1 } span.flatpickr-weekday { cursor: default; font-size: 90%; background: 0 0; color: rgba(0, 0, 0, .54); line-height: 1; margin: 0; text-align: center; display: block; -webkit-box-flex: 1; -webkit-flex: 1; -ms-flex: 1; flex: 1; font-weight: bolder } .dayContainer, .flatpickr-weeks { padding: 1px 0 0 0 } .flatpickr-days { position: relative; overflow: hidden; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-align: start; -webkit-align-items: flex-start; -ms-flex-align: start; align-items: flex-start; width: 307.875px } .flatpickr-days:focus { outline: 0 } .dayContainer { padding: 0; outline: 0; text-align: left; width: 307.875px; min-width: 307.875px; max-width: 307.875px; -webkit-box-sizing: border-box; box-sizing: border-box; display: inline-block; display: -ms-flexbox; display: -webkit-box; display: -webkit-flex; display: flex; -webkit-flex-wrap: wrap; flex-wrap: wrap; -ms-flex-wrap: wrap; -ms-flex-pack: justify; -webkit-justify-content: space-around; justify-content: space-around; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); opacity: 1 } .dayContainer + .dayContainer { -webkit-box-shadow: -1px 0 0 #e6e6e6; box-shadow: -1px 0 0 #e6e6e6 } .flatpickr-day { background: 0 0; border: 1px solid transparent; border-radius: 150px; -webkit-box-sizing: border-box; box-sizing: border-box; color: #393939; cursor: pointer; font-weight: 400; width: 14.2857143%; -webkit-flex-basis: 14.2857143%; -ms-flex-preferred-size: 14.2857143%; flex-basis: 14.2857143%; max-width: 39px; height: 39px; line-height: 39px; margin: 0; display: inline-block; position: relative; -webkit-box-pack: center; -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; text-align: center } .flatpickr-day.inRange, .flatpickr-day.nextMonthDay.inRange, .flatpickr-day.nextMonthDay.today.inRange, .flatpickr-day.nextMonthDay:focus, .flatpickr-day.nextMonthDay:hover, .flatpickr-day.prevMonthDay.inRange, .flatpickr-day.prevMonthDay.today.inRange, .flatpickr-day.prevMonthDay:focus, .flatpickr-day.prevMonthDay:hover, .flatpickr-day.today.inRange, .flatpickr-day:focus, .flatpickr-day:hover { cursor: pointer; outline: 0; background: #e6e6e6; border-color: #e6e6e6 } .flatpickr-day.today { border-color: #959ea9 } .flatpickr-day.today:focus, .flatpickr-day.today:hover { border-color: #959ea9; background: #959ea9; color: #fff } .flatpickr-day.endRange, .flatpickr-day.endRange.inRange, .flatpickr-day.endRange.nextMonthDay, .flatpickr-day.endRange.prevMonthDay, .flatpickr-day.endRange:focus, .flatpickr-day.endRange:hover, .flatpickr-day.selected, .flatpickr-day.selected.inRange, .flatpickr-day.selected.nextMonthDay, .flatpickr-day.selected.prevMonthDay, .flatpickr-day.selected:focus, .flatpickr-day.selected:hover, .flatpickr-day.startRange, .flatpickr-day.startRange.inRange, .flatpickr-day.startRange.nextMonthDay, .flatpickr-day.startRange.prevMonthDay, .flatpickr-day.startRange:focus, .flatpickr-day.startRange:hover { background: #569ff7; -webkit-box-shadow: none; box-shadow: none; color: #fff; border-color: #569ff7 } .flatpickr-day.endRange.startRange, .flatpickr-day.selected.startRange, .flatpickr-day.startRange.startRange { border-radius: 50px 0 0 50px } .flatpickr-day.endRange.endRange, .flatpickr-day.selected.endRange, .flatpickr-day.startRange.endRange { border-radius: 0 50px 50px 0 } .flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)), .flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)), .flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)) { -webkit-box-shadow: -10px 0 0 #569ff7; box-shadow: -10px 0 0 #569ff7 } .flatpickr-day.endRange.startRange.endRange, .flatpickr-day.selected.startRange.endRange, .flatpickr-day.startRange.startRange.endRange { border-radius: 50px } .flatpickr-day.inRange { border-radius: 0; -webkit-box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6; box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6 } .flatpickr-day.flatpickr-disabled, .flatpickr-day.flatpickr-disabled:hover, .flatpickr-day.nextMonthDay, .flatpickr-day.notAllowed, .flatpickr-day.notAllowed.nextMonthDay, .flatpickr-day.notAllowed.prevMonthDay, .flatpickr-day.prevMonthDay { color: rgba(57, 57, 57, .3); background: 0 0; border-color: transparent; cursor: default } .flatpickr-day.flatpickr-disabled, .flatpickr-day.flatpickr-disabled:hover { cursor: not-allowed; color: rgba(57, 57, 57, .1) } .flatpickr-day.week.selected { border-radius: 0; -webkit-box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7; box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7 } .flatpickr-day.hidden { visibility: hidden } .rangeMode .flatpickr-day { margin-top: 1px } .flatpickr-weekwrapper { float: left } .flatpickr-weekwrapper .flatpickr-weeks { padding: 0 12px; -webkit-box-shadow: 1px 0 0 #e6e6e6; box-shadow: 1px 0 0 #e6e6e6 } .flatpickr-weekwrapper .flatpickr-weekday { float: none; width: 100%; line-height: 28px } .flatpickr-weekwrapper span.flatpickr-day, .flatpickr-weekwrapper span.flatpickr-day:hover { display: block; width: 100%; max-width: none; color: rgba(57, 57, 57, .3); background: 0 0; cursor: default; border: none } .flatpickr-innerContainer { display: block; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-sizing: border-box; box-sizing: border-box; overflow: hidden } .flatpickr-rContainer { display: inline-block; padding: 0; -webkit-box-sizing: border-box; box-sizing: border-box } .flatpickr-time { text-align: center; outline: 0; display: block; height: 0; line-height: 40px; max-height: 40px; -webkit-box-sizing: border-box; box-sizing: border-box; overflow: hidden; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex } .flatpickr-time:after { content: ""; display: table; clear: both } .flatpickr-time .numInputWrapper { -webkit-box-flex: 1; -webkit-flex: 1; -ms-flex: 1; flex: 1; width: 40%; height: 40px; float: left } .flatpickr-time .numInputWrapper span.arrowUp:after { border-bottom-color: #393939 } .flatpickr-time .numInputWrapper span.arrowDown:after { border-top-color: #393939 } .flatpickr-time.hasSeconds .numInputWrapper { width: 26% } .flatpickr-time.time24hr .numInputWrapper { width: 49% } .flatpickr-time input { background: 0 0; -webkit-box-shadow: none; box-shadow: none; border: 0; border-radius: 0; text-align: center; margin: 0; padding: 0; height: inherit; line-height: inherit; color: #393939; font-size: 14px; position: relative; -webkit-box-sizing: border-box; box-sizing: border-box; -webkit-appearance: textfield; -moz-appearance: textfield; appearance: textfield } .flatpickr-time input.flatpickr-hour { font-weight: 700 } .flatpickr-time input.flatpickr-minute, .flatpickr-time input.flatpickr-second { font-weight: 400 } .flatpickr-time input:focus { outline: 0; border: 0 } .flatpickr-time .flatpickr-am-pm, .flatpickr-time .flatpickr-time-separator { height: inherit; float: left; line-height: inherit; color: #393939; font-weight: 700; width: 2%; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-align-self: center; -ms-flex-item-align: center; align-self: center } .flatpickr-time .flatpickr-am-pm { outline: 0; width: 18%; cursor: pointer; text-align: center; font-weight: 400 } .flatpickr-time .flatpickr-am-pm:focus, .flatpickr-time .flatpickr-am-pm:hover, .flatpickr-time input:focus, .flatpickr-time input:hover { background: #eee } .flatpickr-input[readonly] { cursor: pointer } @-webkit-keyframes fpFadeInDown { from { opacity: 0; -webkit-transform: translate3d(0, -20px, 0); transform: translate3d(0, -20px, 0) } to { opacity: 1; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0) } } @keyframes fpFadeInDown { from { opacity: 0; -webkit-transform: translate3d(0, -20px, 0); transform: translate3d(0, -20px, 0) } to { opacity: 1; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0) } } .disabled { pointer-events: none; filter: grayscale(100%); -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: url("data:image/svg+xml;utf8,#grayscale"); filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); -webkit-filter: grayscale(1) } .compact { padding-top: 0 !important; border-top: none !important; margin-top: -10px !important } i.added::after { content: 'HOT'; position: absolute; background: #ff0006; border-radius: 10px; padding: 1px 10px; font-size: 12px; color: #fff; right: 10px } .authorization-form, .vip-certificate { position: relative; overflow: hidden; background: #ffffff; border-radius: 10px; box-shadow: 0px 5px 20px rgba(0, 0, 0, .2) } .authorization-form { text-align: center } .aut-title { color: #fff; padding: 10px; background-color: #6b3bbc; background-image: linear-gradient(43deg, #6b3bbc 0%, #cd12be 46%, #ff0006 100%) } .aut-content { padding: 20px } .vip-certificate { display: flex; padding: 10px 20px; color: #fff; background-color: #6b3bbc; background-image: linear-gradient(43deg, #6b3bbc 0%, #cd12be 46%, #ff0006 100%); align-items: center } .vip-certificate .ok-icon { background: rgba(255, 255, 255, 0.2); border-radius: 50%; width: 50px; height: 50px; font-size: 30px; line-height: 45px; text-align: center; margin-right: 10px } .bnt-svg { width: 20px; height: 20px; margin-left: auto } .ajax-notice { margin-top: 10px } .csf-container { border: none !important; border-radius: 10px; overflow: hidden; box-shadow: 0 0 20px rgba(82,82,82, 10%) } .new > .csf-title { position: relative } .new > .csf-title::after { content: "new" !important; position: absolute; color: #fff; font-size: 10px; background-color: rgba(255, 0, 0, .7); padding: 0px 4px; border-radius: 6px; left: -15px; top: -15px } .csf-tab-item .new-item::before { content: ""; width: 6px; height: 6px; position: absolute; color: #fff; font-size: 10px; background-color: rgb(255, 0, 0); border-radius: 6px; left: 5px; top: 5px } .progress { background: #e6e6e6; padding: 2px; border-radius: 20px; position: relative; opacity: 0; transition: .5s } .progress .progress-bar { width: 1%; background-color: #ff4c76; background-image: linear-gradient(45deg, rgba(255, 255, 255, .25) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .25) 50%, rgba(255, 255, 255, .25) 75%, transparent 75%, transparent); animation: reverse progress-bar 1s linear infinite; background-size: 40px 40px; position: absolute; left: 0; height: 100%; top: 0; bottom: 0; border-radius: 20px } @keyframes progress-bar { 0% { background-position: 40px 0 } 100% { background-position: 0 0 } } .but { border-radius: 4px; display: inline-block; border-radius: 4px; -webkit-transition: .15s !important; transition: .15s !important; vertical-align: middle; font-size: 14px; padding: 5px 20px; text-align: center; box-shadow: none; background: rgba(136, 136, 136, .1); color: #888; border: 1px solid transparent; line-height: 1.44; margin: 2px; min-height: unset; text-decoration: none } .but a { color: inherit } .but svg.icon, .but > .fa { margin-right: .25em } .but.radius, .radius > .but { border-radius: 50px; padding: .3em .8em } .but.hollow { background: transparent; --this-border: var(--this-color) } .but:focus, .but:hover { opacity: .8; background: var(--this-bg); color: var(--this-color) } .but:focus { --this-shadow: inset 0 2px 3px rgba(0, 0, 0, .08) } .but:active { --this-shadow: inset 0 2px 3px rgba(0, 0, 0, .08); background: var(--this-bg); color: var(--this-color) } .but.hollow:hover { background: var(--this-color); color: #fff } [disabled] { opacity: .6 !important; filter: grayscale(40%); cursor: no-drop } .padding-lg, .but.padding-lg { padding: .5em 2em } .b-theme, .b-red, .b-yellow, .b-blue, .b-green, .b-purple, .jb-red, .jb-yellow, .jb-blue, .jb-green, .jb-purple { color: #fff; background: var(--this-bg); --this-color: #fff } .jb-red, .jb-yellow, .jb-blue, .jb-green, .jb-purple { border: none } .b-theme { --this-bg: var(--focus-color) } .b-red { --this-bg: #ff5473 } .b-yellow { --this-bg: #ff6f06 } .b-blue { --this-bg: #2997f7 } .b-green { --this-bg: #12b928 } .b-purple { --this-bg: #d448f5 } .c-red, .c-yellow, .c-blue, .c-green, .c-purple { color: var(--this-color) } .c-red { --this-color: #ff5473; --this-bg: rgba(255, 84, 115, .1) } .c-yellow { --this-color: #ff6f06; --this-bg: rgba(255, 111, 6, 0.1) } .c-blue { --this-color: #2997f7; --this-bg: rgba(41, 151, 247, .1) } .c-green { --this-color: #12b928; --this-bg: rgba(18, 185, 40, .1) } .c-purple { --this-color: #d448f5; --this-bg: rgba(213, 72, 245, 0.1) } .hide-box { display: none } .hide { display: none !important } .flex { display: flex } .flex.ac { align-items: center } .flex.jsb { justify-content: space-between } .shrink-0 { flex-shrink: 0 } .card-box { background: rgba(255, 255, 255, 0.5); border-radius: 4px; padding: 6px 15px } .backup-box { max-height: 350px; overflow-y: auto; max-width: 600px; font-size: 13px } .backup-box .backup-item { border-bottom: 1px solid rgba(0, 0, 0, 0.04); padding: 5px 0 } .backup-box .backup-item:last-of-type { border-bottom: unset } .backup-item .item-left > div { display: inline-block; margin-right: 6px } .backup-box .but { font-size: 13px; padding: 1px 10px } @media (min-width: 783px) { .csf-field.compact:not(.min) > .csf-title > h4 { margin-left: 15px; color: #343537 } } @media (max-width: 782px) { .csf-image-preview img { max-height: 50px } .csf-options { margin-right: 10px } .csf-after-text { word-wrap: break-word } } .text-help { color: #ad8a43 } .text-help:link { text-decoration: none } .text-help:active { text-decoration: none } .text-help:hover { text-decoration: none; color: #fdce75 } .csf-field.io-horizontal .csf-title { position: relative !important; width: 20% !important; float: left !important } .csf-field.io-horizontal .csf-fieldset { float: right !important; width: calc(80% - 20px) !important } } ================================================ FILE: 配套插件/BsCore/assets/js/IndexNowViewScript.js ================================================ var uuid = uuidv4.call().split('-').join(''); var guid = document.getElementsByClassName("guid"); function handleGenerate() { uuid = uuidv4.call().split('-').join(''); for (var i = 0; i < guid.length; i++) { var processedGuid = uuid .split('') .map(tranformGuidText) .join(''); guid[i].innerHTML = `${processedGuid}`; } var keys = document.getElementsByClassName("key"); for (var i = 0; i < keys.length; i++) { keys[i].innerHTML = uuid; } setUrlHref(); } function tranformGuidText(character) { if (character >= '0' && character <= '9') { return `${character}`; } else { return `${character}`; } } var downloadIcon = document.getElementById("download-icon"); downloadIcon.addEventListener("click", function () { var downloadMessage = "确认是否下载IndexNow密钥到本地?"; if (confirm(downloadMessage)) { var filename = uuid + ".txt"; var text = uuid; download(filename, text); } }) function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } function setUrlHref() { var urlWithKeys = document.getElementsByClassName("has-key"); for (var i = 0; i < urlWithKeys.length; i++) { urlWithKeys[i].href = urlWithKeys[i].innerText; } } handleGenerate(); let accordion = document.getElementsByClassName("custom-accordion-header"); for (let i = 0; i < accordion.length; i++) { accordion[i].addEventListener("click", () => { if (accordion[i].classList.contains("show")) { accordion[i].classList.remove("show"); } else { accordion[i].classList.add("show"); } let accordionBody = accordion[i].nextElementSibling; if (accordionBody.classList.contains("d-none")) { accordionBody.classList.remove("d-none"); } else { accordionBody.classList.add("d-none"); } }); } function toggleHamburger() { var mobileMenuList = document.getElementById("mobileMenu"); if (mobileMenuList.classList.contains("d-none")) { mobileMenuList.classList.remove("d-none"); } else { mobileMenuList.classList.add("d-none"); } } function redirectToIndexNowFaq() { var faqUrl = "https://www.indexnow.org/faq" window.location.assign(faqUrl); } ================================================ FILE: 配套插件/BsCore/assets/js/backend.js ================================================ $(function() { getwaitingdata(); getapproveddata(); getrejectdata(); $('#getLskyToken').on('click',function(){ const extensionId = $(this).attr('data-id'); layer.confirm('是否确认获取Token?注意:本主题不会保存您的账号密码信息,仅用于向站点发送以获取Token', { btn: ['确认获取','取消'], title:'获取LskyPro Token', }, function(){ layer.prompt({title: '填写LskyPro 账号', formType: 3}, function(username, index){ layer.close(index); layer.prompt({title: '填写LskyPro 密码', formType: 1}, function(password, index){ layer.close(index); layer.msg('正在获取Token,请勿刷新', {icon: 1}); layer.msg('Token获取中...', { icon: 16 ,shade: 0.01, time: 9999999 }); $.ajax({ type: "POST", async:true, url: siteUrl+"index.php/bUserAction", data: { "type": 'getLskyProToken', "lskypro_username":username, "lskypro_password":password, }, dateType: "json", success: function(data) { json = JSON.parse(data); if(json.code == 0){ layer.msg(json.msg, {icon: 2}); } else if(json.code == 1){ $('input[name="bearsimple[lskypro_token]"]').val(json.msg); layer.msg("Token获取完毕,已自动填入。", {icon: 1}); } else{ layer.msg('操作出错', {icon: 2}); } }, error: function() { layer.msg('操作出错,请稍后再试', {icon: 2}); } }); }); }); }); }); $('#rebuildCron').on('click',function(){ const extensionId = $(this).attr('data-id'); layer.confirm('当自动检查任务执行失败时可尝试重建此表,是否确认重建?', { btn: ['确认重建','取消'], title:'重建扩展表', }, function(){ layer.msg('正在重建计划任务表,请勿刷新', {icon: 1}); layer.msg('计划任务表重建中...', { icon: 16 ,shade: 0.01, time: 9999999 }); $.ajax({ type: "POST", async:true, url: siteUrl+"index.php/bsBackendAction", data: { "type": 'rebuildCron' }, dateType: "json", success: function(data) { json = JSON.parse(data); if(json.code == 0){ layer.msg(json.message, {icon: 2}); } else if(json.code == 1){ layer.msg(json.message, {icon: 1}); } else{ layer.msg('重建中出现错误,请稍后再试', {icon: 2}); } }, error: function() { layer.msg('重建中出现错误,请稍后再试', {icon: 2}); } }); }); }); $('#fixTable').on('click',function(){ const extensionId = $(this).attr('data-id'); layer.confirm('若使用微信公众号的朋友圈模式无法正常发表朋友圈,可尝试修复数据表,是否确认修复?', { btn: ['确认修复','取消'], title:'修复数据表', }, function(){ layer.msg('正在修复数据表,请勿刷新', {icon: 1}); layer.msg('数据表修复中...', { icon: 16 ,shade: 0.01, time: 9999999 }); $.ajax({ type: "POST", async:true, url: siteUrl+"index.php/bsBackendAction", data: { "type": 'fixTable' }, dateType: "json", success: function(data) { json = JSON.parse(data); if(json.code == 0){ layer.msg(json.message, {icon: 2}); } else if(json.code == 1){ layer.msg(json.message, {icon: 1}); } else{ layer.msg('修复中出现错误,请稍后再试', {icon: 2}); } }, error: function() { layer.msg('修复中出现错误,请稍后再试', {icon: 2}); } }); }); }); }); function isbMobile () { let isMobile = false; if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) { isMobile = true; } if (document.body.clientWidth < 800) { isMobile = true; } return isMobile } $(function(){ $("#driver_open").on('click',function(){ if(isbMobile() == true){ toastr.warning("抱歉,功能引导不支持手机端,请在电脑端查看"); return false; } const driver = window.driver.js.driver; const driverObj = driver({ nextBtnText: '前进', prevBtnText: '后退', doneBtnText: '✕', showProgress: true, popoverClass: "driverjs-theme", allowKeyboardControl: true, steps: [ { element: '#wpwrap', popover: { title: '欢迎来到BearSimple主题控制中心😄', description: '接下来由我来引导您熟悉主题的各项功能,点击区域外或者本框右上角的X按钮可退出引导并不再显示。', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(1)', popover: { title: '这里是使用说明', description: '使用主题前请先注意看使用说明,像申请站点展示、获取邀请码等都在这里', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(2)', popover: { title: '这里是基础设置', description: '基础设置中包含站点LOGO、Favicon图标以及一些全局性的设置', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(3)', popover: { title: '这里是首页及分类', description: '这里包含文章置顶、分类加密等功能', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(4)', popover: { title: '这里是顶部设置', description: '像要对导航栏进行设置或要添加顶部自定义代码都是在这里完成', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(5)', popover: { title: '这里是底部设置', description: '在这里对网站底部进行设置,如添加ICP备案和公安备案以及添加底部自定义代码等', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(6)', popover: { title: '这里是幻灯片设置', description: '您可以在这里添加幻灯片,会在导航栏下边显示', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(7)', popover: { title: '这里是公告栏设置', description: '您可以在这里添加网站公告,如网站维护等,访客可以在访问网站时看到', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(8)', popover: { title: '这里是友链设置', description: '这个应该就不需要多说了吧🤔,友链相关的功能设置都在这里', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(9)', popover: { title: '这里是加载设置', description: '加载设置中包含Pjax、图片懒加载、HTML压缩等功能', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(10)', popover: { title: '这里是行为验证', description: '行为验证支持了对网站评论、友链提交等进行验证,支持了多种行为验证方式', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(11)', popover: { title: '这里是存储设置', description: '通过存储设置您可以将腾讯云COS、阿里云OSS等作为网站的存储方式', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(12)', popover: { title: '这里是缓存设置', description: '通过缓存设置可以加快您的站点访问速度,支持了多种缓存方式', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(13)', popover: { title: '这里是SEO管理', description: 'SEO管理中集成了Sitemap地图生成、收录推送等功能,方便您更快更有效率的优化网站SEO', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(14)', popover: { title: '这里是模块管理', description: '这里包含了文章优化、Memos、微语等多个模块,一些独立页面的创建过程也需要这里的参与', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(15)', popover: { title: '这里是用户中心设置', description: '本主题的用户中心目前包含了投稿、发动态等功能,可以通过本设置对用户中心进行设置与管理', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(16)', popover: { title: '这里是打赏设置', description: '您可以在这里添加打赏方式,它将显示在文章页面', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(17)', popover: { title: '这里是评论设置', description: '评论设置中可以操作电邮通知、评论过滤等功能,便于您对网站的评论进行统一管理', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(18)', popover: { title: '这里是SMTP设置', description: 'SMTP设置统一控制了网站的电邮通知通道,所有电邮通知都需要这里进行配合参与,若要用到需进行电邮通知的功能,都请先在这里填写好相关信息', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(19)', popover: { title: '这里是文章设置', description: '您可以在这里对文章组件进行设置,如第三方分享、文章目录树等功能也是在这里哦', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(20)', popover: { title: '这里是图片设置', description: '图片设置主要对网站图片进行控制,如添加水印等', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(21)', popover: { title: '这里是海报设置', description: '您可以通过该功能开启文章海报分享,访客可以保存海报分享给别人', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(22)', popover: { title: '这里是区块设置', description: '区块设置中包含了对侧边栏和广告等区块的管理', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(23)', popover: { title: '这里是博主信息设置', description: '您可以在这里添加您的个人信息,便于访客能够进一步认识您', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(24)', popover: { title: '这里是其他设置', description: '其他设置中包含了日夜切换、语言切换等功能,若在其他地方没找到的功能不妨来这里找找', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(25)', popover: { title: '这里是实验室', description: '实验室主要包含仍处于实验阶段或仍会进行大幅度调整的功能', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(26)', popover: { title: '这里是短代码', description: '您可以通过这里了解目前主题支持的所有短代码', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(27)', popover: { title: '这里是数据备份', description: '在进行升级操作或其他关键性操作时可先通过数据备份将备份文件下载到本地,防止因一些意外状况导致主题设置丢失', side: "left", align: 'start' }}, { element: '#wpwrap li:nth-child(28)', popover: { title: '这里是在线升级', description: '您可以通过这里对主题进行在线升级操作,免去一些繁琐性操作', side: "left", align: 'start' }}, { popover: { title: '功能引导已完成🥰', description: '您现在可以关闭引导框或者点击后退按钮重新进行引导' } } ], onDestroyStarted: () => { if (!driverObj.hasNextStep() || confirm("确定退出功能引导?")) { localStorage.setItem('driver','true'); driverObj.destroy(); } }, }); driverObj.drive(); }); }); $("#linksearch").bind("input propertychange",function(event){ getsearchdata($("#linksearch").val()); }); $("#usersearch").bind("input propertychange",function(event){ getsearchuserdata($("#usersearch").val()); }); $(document).delegate(".ui.gray.icon.label.delete", "click", function() { $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfriendaction", data: { "type": 'delete', "linkid":$(this).attr('data-id') }, dateType: "json", success: function(data) { json = JSON.parse(data); toastr.success('该友链已成功删除'); getwaitingdata(); getapproveddata(); getrejectdata(); getsearchdata($("#linksearch").val()); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); }); $(document).delegate("#createlink", "click", function() { layer.open({ type: 1 ,btn:["确定新增","取消新增"] ,title: '新增友链' ,skin: 'layui-layer-prompt' ,content: "
            友链名称
            友链网址
            友链图标
            友链描述
            联系邮箱
            该站点的友链放置页面网址
            友链添加至
            " ,yes: function(index, callback){ if(!$(callback).find("#friendname").val()){ layer.msg('友链名称不能为空哦~'); return false; } if(!$(callback).find("#friendurl").val()){ layer.msg('友链网址不能为空哦~'); return false; } if(!$(callback).find("#friendpic").val()){ layer.msg('友链图标不能为空哦~'); return false; } if(!$(callback).find("#frienddec").val()){ layer.msg('友链描述不能为空哦~'); return false; } $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfriendaction", data: { "type": 'add', "addtype": $(callback).find("#addtype").val(), "friendname":$(callback).find("#friendname").val(), "friendurl":$(callback).find("#friendurl").val(), "friendpic":$(callback).find("#friendpic").val(), "frienddec":$(callback).find("#frienddec").val(), "contactmail":$(callback).find("#contactmail").val(), "checkurl":$(callback).find("#checkurl").val() }, dateType: "json", success: function(data) { json = JSON.parse(data); toastr.success('友链已成功新增,友链列表已自动刷新。'); layer.closeAll(); getwaitingdata(); getapproveddata(); getrejectdata(); getsearchdata($("#linksearch").val()); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); } }); }); $(document).delegate(".ui.yellow.icon.label.edit", "click", function() { if ($(this).data('checkurl') === undefined || $(this).data('checkurl') === "") { $(this).data('checkurl', '暂无'); } layer.open({ type: 1 ,btn:["确定修改","取消修改"] ,title: '修改友链' ,skin: 'layui-layer-prompt' ,content: "
            友链ID
            友链网址
            友链名称
            友链图标
            友链描述
            联系邮箱
            该站点的友链放置页面网址
            友链状态
            驳回原因
            " ,yes: function(index, callback){ if(!$(callback).find("#friendname").val()){ layer.msg('友链名称不能为空哦~'); return false; } if(!$(callback).find("#friendurl").val()){ layer.msg('友链网址不能为空哦~'); return false; } if(!$(callback).find("#friendpic").val()){ layer.msg('友链图标不能为空哦~'); return false; } if(!$(callback).find("#frienddec").val()){ layer.msg('友链描述不能为空哦~'); return false; } $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfriendaction", data: { "type": 'edit', "id":$(callback).find("#friendid").val(), "friendname":$(callback).find("#friendname").val(), "friendurl":$(callback).find("#friendurl").val(), "friendpic":$(callback).find("#friendpic").val(), "frienddec":$(callback).find("#frienddec").val(), "contactmail":$(callback).find("#contactmail").val(), "checkurl":$(callback).find("#checkurl").val(), "rejectreason":$(callback).find("#rejectreason").val(), }, dateType: "json", success: function(data) { json = JSON.parse(data); toastr.success('ID为'+$(callback).find("#friendid").val()+'的友链已修改成功。'); layer.closeAll(); getwaitingdata(); getapproveddata(); getrejectdata(); getsearchdata($("#linksearch").val()); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); } }); }); $(document).delegate(".ui.blue.icon.label.approved", "click", function() { var loading = layer.load(2); $(this).css("pointer-events","none"); $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfriendaction", data: { "type": 'approved', "linkid":$(this).attr('data-id'), "linkmail":$(this).attr('data-mail'), "linkname":$(this).attr('data-friendname') }, dateType: "json", success: function(data) { layer.close(loading); $(".ui.blue.icon.label.approved").css("pointer-events","auto"); json = JSON.parse(data); toastr.success('该友链已批准,已将其加入友链列表。'); getwaitingdata(); getapproveddata(); getrejectdata(); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); }); $(document).delegate(".ui.blue.icon.label.approved2", "click", function() { var loading = layer.load(2); $(this).css("pointer-events","none"); $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfriendaction", data: { "type": 'approved', "linkid":$(this).attr('data-id'), //"linkmail":$(this).attr('data-mail') }, dateType: "json", success: function(data) { layer.close(loading); $(".ui.blue.icon.label.approved2").css("pointer-events","auto"); json = JSON.parse(data); toastr.success('该友链已重新获得批准,已将其加入友链列表。'); getwaitingdata(); getapproveddata(); getrejectdata(); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); }); $(document).delegate(".ui.red.icon.label.reject", "click", function() { var loading = layer.load(2); $(this).css("pointer-events","none"); $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfriendaction", data: { "type": 'reject', "linkid":$(this).attr('data-id'), "linkmail":$(this).attr('data-mail'), "linkname":$(this).attr('data-friendname') }, dateType: "json", success: function(data) { layer.close(loading); $(".ui.red.icon.label.reject").css("pointer-events","auto"); json = JSON.parse(data); toastr.success('该友链已驳回,已将其加入已驳回列表,可在已驳回列表中重新审核。'); getwaitingdata(); getapproveddata(); getrejectdata(); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); }); $(document).delegate(".ui.red.icon.label.reject2", "click", function() { var loading = layer.load(2); $(this).css("pointer-events","none"); $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfriendaction", data: { "type": 'reject', "linkid":$(this).attr('data-id'), // "linkmail":$(this).attr('data-mail') }, dateType: "json", success: function(data) { layer.close(loading); $(".ui.red.icon.label.reject2").css("pointer-events","auto"); json = JSON.parse(data); toastr.success('该友链已重新驳回,已将其加入已驳回列表,可在已驳回列表中重新审核。'); getwaitingdata(); getapproveddata(); getrejectdata(); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); }); //获取已经审批通过的友链数据 var approvedpage = 1; var approvedn = 0; var approvedmax = 1; function getapproveddata(){ $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfrienddata", data: { "type": 'approved', "page": approvedpage }, dateType: "json", success: function(data) { json = JSON.parse(data); if(json.list == ''){ approvedn = json.total; approvedmax = json.max; var strs = " "; strs += '' $("#approvedfl").html(strs); } else{ approvedn = json.total; approvedmax = json.max; content2(json.list); } }, complete: function() { pageList(); }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); function pageList() { approvedpage = Math.min(approvedpage, approvedmax); approvedpage = Math.max(approvedpage, 1); var html = "
            共" + approvedn + "条第" + approvedpage + "/" + approvedmax + "页"; html += '首页'; html += (approvedpage > 1) ? '上一页' : '上一页'; html += (approvedpage < approvedmax) ? '下一页' : '下一页'; html += '尾页
            跳转到指定页
            '; var $html = $(html); $html.find("a").click(function() { if($(this).attr("id")!=='gopage'){ approvedpage = $(this).attr("data-page"); } else{ var dipage = document.getElementById("dipage").value; switch(dipage){ case dipage < 1 : approvedpage = 1; break; case dipage > approvedmax: approvedpage = approvedmax; break; default: approvedpage = dipage; }; }; getapproveddata(); }); $(".approvedpagelist").html($html); } function content2(lists) { var str2 = " "; for(var i in lists) { if(lists[i]['status'] == 'approved'){ lists[i]['status'] = '已通过'; } if(lists[i]['contactmail'] == null){ lists[i]['contactmail'] = '无'; } str2 += '' + lists[i]['friendname'] + '' + lists[i]['friendurl'] + '' + lists[i]['friendpic'] + '' + lists[i]['frienddec'] + '' + lists[i]['contactmail'] + '' + lists[i]['status'] + '
            ' $("#approvedfl").html(str2); } } } //获取审核中的友链数据 var waitingpage = 1; var waitingn = 0; var waitingmax = 1; function getwaitingdata(){ $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfrienddata", data: { "type": 'waiting', "page":waitingpage }, dateType: "json", success: function(data) { json = JSON.parse(data); if(json.list == ''){ waitingn = json.total; waitingmax = json.max; var strs = " "; strs += '' $("#waitingfl").html(strs); } else{ waitingn = json.total; waitingmax = json.max; content(json.list); } }, complete: function() { pageList(); }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); function pageList() { waitingpage = Math.min(waitingpage, waitingmax); waitingpage = Math.max(waitingpage, 1); var html = "
            共" + waitingn + "条第" + waitingpage + "/" + waitingmax + "页"; html += '首页'; html += (waitingpage > 1) ? '上一页' : '上一页'; html += (waitingpage < waitingmax) ? '下一页' : '下一页'; html += '尾页
            跳转到指定页
            '; var $html = $(html); $html.find("a").click(function() { if($(this).attr("id")!=='gopage'){ waitingpage = $(this).attr("data-page"); } else{ var dipage = document.getElementById("dipage").value; switch(dipage){ case dipage < 1 : waitingpage = 1; break; case dipage > waitingmax: waitingpage = waitingmax; break; default: waitingpage = dipage; }; }; getwaitingdata(); }); $(".waitingpagelist").html($html); } function content(list) { var str = " "; for(var i in list) { if(list[i]['status'] == 'waiting'){ list[i]['status'] = '待审核'; } if(list[i]['contactmail'] == null){ list[i]['contactmail'] = '无'; } str += '' + list[i]['friendname'] + '' + list[i]['friendurl'] + '' + list[i]['friendpic'] + '' + list[i]['frienddec'] + '' + list[i]['contactmail'] + '' + list[i]['status'] + '
            ' $("#waitingfl").html(str); } } } //获取已驳回的友链数据 var rejectpage = 1; var rejectn = 0; var rejectmax = 1; function getrejectdata(){ $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfrienddata", data: { "type": 'reject', "page":rejectpage }, dateType: "json", success: function(data) { json = JSON.parse(data); if(json.list == ''){ rejectn = json.total; rejectmax = json.max; var strs = " "; strs += '' $("#rejectfl").html(strs); } else{ rejectn = json.total; rejectmax = json.max; content3(json.list); } }, complete: function() { pageList(); }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); function pageList() { rejectpage = Math.min(rejectpage, rejectmax); rejectpage = Math.max(rejectpage, 1); var html = "
            共" + rejectn + "条第" + rejectpage + "/" + rejectmax + "页"; html += '首页'; html += (rejectpage > 1) ? '上一页' : '上一页'; html += (rejectpage < rejectmax) ? '下一页' : '下一页'; html += '尾页
            跳转到指定页
            '; var $html = $(html); $html.find("a").click(function() { if($(this).attr("id")!=='gopage'){ rejectpage = $(this).attr("data-page"); } else{ var dipage = document.getElementById("dipage").value; switch(dipage){ case dipage < 1 : rejectpage = 1; break; case dipage > rejectmax: rejectpage = rejectmax; break; default: rejectpage = dipage; }; }; getrejectdata(); }); $(".rejectpagelist").html($html); } function content3(listss) { var str3 = " "; for(var i in listss) { if(listss[i]['status'] == 'reject'){ listss[i]['status'] = '已驳回'; } if(listss[i]['contactmail'] == null){ listss[i]['contactmail'] = '无'; } str3 += '' + listss[i]['friendname'] + '' + listss[i]['friendurl'] + '' + listss[i]['friendpic'] + '' + listss[i]['frienddec'] + '' + listss[i]['contactmail'] + '' + listss[i]['status'] + '
            ' $("#rejectfl").html(str3); } } } //搜索 var searchpage = 1; var searchn = 0; var searchmax = 1; function getsearchdata(val){ $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfrienddata", data: { "type": 'search', 'searchval':val, "page": searchpage }, dateType: "json", success: function(data) { json = JSON.parse(data); if(json.list == ''){ var strs = " "; strs += '' $("#search").html(strs); searchn = json.total; searchmax = json.max; } else{ searchn = json.total; searchmax = json.max; content4(json.list); } }, complete: function() { searchpageList(); }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); function searchpageList() { searchpage = Math.min(searchpage, searchmax); searchpage = Math.max(searchpage, 1); var html = "
            共" + searchn + "条第" + searchpage + "/" + searchmax + "页"; html += '首页'; html += (searchpage > 1) ? '上一页' : '上一页'; html += (searchpage < searchmax) ? '下一页' : '下一页'; html += '尾页
            跳转到指定页
            '; var $html = $(html); $html.find("a").click(function() { if($(this).attr("id")!=='gopage'){ searchpage = $(this).attr("data-page"); } else{ var dipage = document.getElementById("dipage").value; switch(dipage){ case dipage < 1 : searchpage = 1; break; case dipage > searchmax: searchpage = searchmax; break; default: searchpage = dipage; }; }; getsearchdata($("#linksearch").val()); }); $(".searchpagelist").html($html); } function content4(listsss) { var str4 = " "; for(var i in listsss) { if(listsss[i]['contactmail'] == null){ listsss[i]['contactmail'] = '无'; } if(listsss[i]['status'] == 'reject'){ listsss[i]['status'] = '已驳回'; str4 += '' + listsss[i]['friendname'] + '' + listsss[i]['friendurl'] + '' + listsss[i]['friendpic'] + '' + listsss[i]['frienddec'] + '' + listsss[i]['contactmail'] + '' + listsss[i]['status'] + '
            ' } if(listsss[i]['status'] == 'waiting'){ listsss[i]['status'] = '待审核'; str4 += '' + listsss[i]['friendname'] + '' + listsss[i]['friendurl'] + '' + listsss[i]['friendpic'] + '' + listsss[i]['frienddec'] + '' + listsss[i]['contactmail'] + '' + listsss[i]['status'] + '
            ' } if(listsss[i]['status'] == 'approved'){ listsss[i]['status'] = '已通过'; str4 += '' + listsss[i]['friendname'] + '' + listsss[i]['friendurl'] + '' + listsss[i]['friendpic'] + '' + listsss[i]['frienddec'] + '' + listsss[i]['contactmail'] + '' + listsss[i]['status'] + '
            ' } $("#search").html(str4); } } } //用户中心 $(document).delegate("#sendtongzhi", "click", function() { layer.open({ type: 1 ,btn:["确定发送","取消发送"] ,title: '发送通知' ,skin: 'layui-layer-prompt' ,content: "
            搜索用户
            通知标题
            通知内容
            " ,yes: function(index, callback){ if(!$(callback).find("#searchUser").val()){ layer.msg('要发送通知的用户不能为空哦~'); return false; } if(!$(callback).find("#notifytitle").val()){ layer.msg('要发送的通知标题不能为空哦~'); return false; } if(!$(callback).find("#notifytext").val()){ layer.msg('要发送的通知内容不能为空哦~'); return false; } $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bs-usernotify", data: { "type": 'notify', "searchUser": $(callback).find("#searchUser").val(), "notifytitle":$(callback).find("#notifytitle").val(), "notifytext":$(callback).find("#notifytext").val(), }, dateType: "json", success: function(data) { json = JSON.parse(data); toastr.success('通知发送成功'); layer.closeAll(); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); } }); }); //搜索用户 var searchuserpage = 1; var searchusern = 0; var searchusermax = 1; function getsearchuserdata(val){ $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bUserAction", data: { "type": 'searchuser', 'searchval':val, "page": searchuserpage }, dateType: "json", success: function(data) { json = JSON.parse(data); if(json.list == ''){ var strs = " "; strs += '' $("#searchuser").html(strs); searchusern = json.total; searchusermax = json.max; } else{ searchusern = json.total; searchusermax = json.max; content4(json.list); } }, complete: function() { searchuserpageList(); }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); function searchuserpageList() { searchuserpage = Math.min(searchuserpage, searchusermax); searchuserpage = Math.max(searchuserpage, 1); var html = "
            共" + searchusern + "条第" + searchuserpage + "/" + searchusermax + "页"; html += '首页'; html += (searchuserpage > 1) ? '上一页' : '上一页'; html += (searchuserpage < searchusermax) ? '下一页' : '下一页'; html += '尾页
            跳转到指定页
            '; var $html = $(html); $html.find("a").click(function() { if($(this).attr("id")!=='gopage'){ searchuserpage = $(this).attr("data-page"); } else{ var dipage = document.getElementById("dipage").value; switch(dipage){ case dipage < 1 : searchuserpage = 1; break; case dipage > searchusermax: searchuserpage = searchusermax; break; default: searchuserpage = dipage; }; }; getsearchuserdata($("#usersearch").val()); }); $(".searchuserlist").html($html); } function content4(listsss) { var str4 = " "; for(var i in listsss) { str4 += '' + listsss[i]['uid'] + '' + listsss[i]['name'] + '' + listsss[i]['screenName'] + '' + listsss[i]['mail'] + '' + listsss[i]['post_num'] + '>' + listsss[i]['group'] + '' + listsss[i]['coins'] + '' + listsss[i]['submission'] + '
            ' $("#searchuser").html(str4); } } } $(document).delegate(".ui.yellow.icon.label.edituser", "click", function() { var select = $(this).attr('data-submission'); if(select == '开启'){ select = ''; } else{ select = ''; } layer.open({ type: 1 ,btn:["确定修改","取消修改"] ,title: '修改用户' ,skin: 'layui-layer-prompt' ,content: "
            UID
            账号
            昵称
            电邮
            "+$(this).attr('data-coin_name')+"
            投稿权限
            " ,yes: function(index, callback){ $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bUserAction", data: { "type": 'edituser', "uid":$(callback).find("#uid").val(), "coins":$(callback).find("#coins").val(), "submission_type":$(callback).find($("#submission_type")).find("option:selected").val() }, dateType: "json", success: function(data) { json = JSON.parse(data); toastr.success('UID为'+$(callback).find("#uid").val()+'的用户信息已修改成功。'); layer.closeAll(); getsearchuserdata($("#usersearch").val()); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); } }); }); $(document).delegate(".ui.black.icon.label.check", "click", function() { var loading = layer.load(2); $(this).css("pointer-events","none"); $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfriendaction", data: { "type": 'check', "friendurl":$(this).attr('data-friendurl'), "id":$(this).attr('data-id'), "checkurl":$(this).attr('data-checkurl'), "friendname":$(this).attr('data-friendname') }, dateType: "json", success: function(data) { layer.close(loading); $(".ui.black.icon.label.check").css("pointer-events","auto"); json = JSON.parse(data); if(json.message == '友链正常'){ layer.open({ type: 1 ,btn:["移动至已通过","取消"] ,title: '友链检查' ,skin: 'layui-layer-prompt' ,content: "
            "+json.message+"
            " ,yes: function(index, callback){ $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfriendaction", data: { "type": 'approved', "linkid":$(callback).find("#friendid").val(), "linkmail":$(callback).find("#friendmail").val() }, dateType: "json", success: function(data) { json = JSON.parse(data); toastr.success('该友链已批准,已将其加入友链列表。'); layer.closeAll(); getwaitingdata(); getapproveddata(); getrejectdata(); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); } }); } else{ layer.open({ type: 1 ,btn:["移动至已驳回","取消"] ,title: '友链检查' ,skin: 'layui-layer-prompt' ,content: "
            "+json.message+"
            " ,yes: function(index, callback){ $.ajax({ type: "POST", async:true, url: document.location.protocol+"/index.php/bsfriendaction", data: { "type": 'reject', "linkid":$(callback).find("#friendid").val(), "linkmail":$(callback).find("#friendmail").val() }, dateType: "json", success: function(data) { json = JSON.parse(data); toastr.success('该友链已驳回,已将其加入已驳回列表,可在已驳回列表中重新审核。'); layer.closeAll(); getwaitingdata(); getapproveddata(); getrejectdata(); }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); } }); } }, complete: function() { }, error: function() { toastr.warning('数据获取错误,请稍后再试~~'); } }); }); ================================================ FILE: 配套插件/BsCore/assets/js/color-picker.js ================================================ /** * @output wp-admin/js/color-picker.js */ ( function( $, undef ) { var ColorPicker, _before = '', _after = '
            ', _wrap = '
            ', _button = '', _wrappingLabel = '', _wrappingLabelText = '', __ = function (text){return text}; /** * Creates a jQuery UI color picker that is used in the theme customizer. * * @class $.widget.wp.wpColorPicker * * @since 3.5.0 */ ColorPicker = /** @lends $.widget.wp.wpColorPicker.prototype */{ options: { defaultColor: false, change: false, clear: false, hide: true, palettes: true, width: 255, mode: 'hsv', type: 'full', slider: 'horizontal' }, /** * Creates a color picker that only allows you to adjust the hue. * * @since 3.5.0 * @access private * * @return {void} */ _createHueOnly: function() { var self = this, el = self.element, color; el.hide(); // Set the saturation to the maximum level. color = 'hsl(' + el.val() + ', 100, 50)'; // Create an instance of the color picker, using the hsl mode. el.iris( { mode: 'hsl', type: 'hue', hide: false, color: color, /** * Handles the onChange event if one has been defined in the options. * * @ignore * * @param {Event} event The event that's being called. * @param {HTMLElement} ui The HTMLElement containing the color picker. * * @return {void} */ change: function( event, ui ) { if ( typeof self.options.change === 'function' ) { self.options.change.call( this, event, ui ); } }, width: self.options.width, slider: self.options.slider } ); }, /** * Creates the color picker, sets default values, css classes and wraps it all in HTML. * * @since 3.5.0 * @access private * * @return {void} */ _create: function() { // Return early if Iris support is missing. if ( ! $.support.iris ) { return; } var self = this, el = self.element; // Override default options with options bound to the element. $.extend( self.options, el.data() ); // Create a color picker which only allows adjustments to the hue. if ( self.options.type === 'hue' ) { return self._createHueOnly(); } // Bind the close event. self.close = self.close.bind( self ); self.initialValue = el.val(); // Add a CSS class to the input field. el.addClass( 'wp-color-picker' ); /* * Check if there's already a wrapping label, e.g. in the Customizer. * If there's no label, add a default one to match the Customizer template. */ if ( ! el.parent( 'label' ).length ) { // Wrap the input field in the default label. el.wrap( _wrappingLabel ); // Insert the default label text. self.wrappingLabelText = $( _wrappingLabelText ) .insertBefore( el ) .text( __( '颜色值' ) ); } /* * At this point, either it's the standalone version or the Customizer * one, we have a wrapping label to use as hook in the DOM, let's store it. */ self.wrappingLabel = el.parent(); // Wrap the label in the main wrapper. self.wrappingLabel.wrap( _wrap ); // Store a reference to the main wrapper. self.wrap = self.wrappingLabel.parent(); // Set up the toggle button and insert it before the wrapping label. self.toggler = $( _before ) .insertBefore( self.wrappingLabel ) .css( { backgroundColor: self.initialValue } ); // Set the toggle button span element text. self.toggler.find( '.wp-color-result-text' ).text( __( '选择颜色' ) ); // Set up the Iris container and insert it after the wrapping label. self.pickerContainer = $( _after ).insertAfter( self.wrappingLabel ); // Store a reference to the Clear/Default button. self.button = $( _button ); // Set up the Clear/Default button. if ( self.options.defaultColor ) { self.button .addClass( 'wp-picker-default' ) .val( __( '默认' ) ) .attr( 'aria-label', __( 'Select default color' ) ); } else { self.button .addClass( 'wp-picker-clear' ) .val( __( '清除' ) ) .attr( 'aria-label', __( '清除颜色' ) ); } // Wrap the wrapping label in its wrapper and append the Clear/Default button. self.wrappingLabel .wrap( '

            选择媒体动作

            select()->from('table.options') ->where('name = ?', $pluginName); $options = $db->fetchRow($select); if (empty($options)) { return $default; } else { $options = unserialize($options['value']); if (array_key_exists($option, $options)) { return $options[$option]; } else { return $default; } } } } if (!function_exists('update_option')) { function update_option($option, $value, $autoload = null) { $db = Db::get(); $pluginName = FRAMEWORK_PLUGIN_NAME; $select = $db->select()->from('table.options') ->where('name = ?', $pluginName); $options = $db->fetchRow($select); $settings = [$option => $value]; if (empty($options)) { $db->query($db->insert('table.options') ->rows([ 'name' => $pluginName, 'value' => serialize($settings), 'user' => 0 ])); } else { $options = unserialize($options['value']); $options[$option] = $value; $db->query($db->update('table.options') ->rows(['value' => serialize($options)]) ->where('name = ?', $pluginName) ->where('user = ?', 0)); } return true; } } if (!function_exists('update_bs_key_params')) { function update_bs_key_params($option, $value, $autoload = null) { $db = Db::get(); $pluginName = FRAMEWORK_KEY_PARMAS_NAME; $select = $db->select()->from('table.options') ->where('name = ?', $pluginName); $options = $db->fetchRow($select); $settings = [$option => $value]; if (empty($options)) { $db->query($db->insert('table.options') ->rows([ 'name' => $pluginName, 'value' => serialize($settings), 'user' => 0 ])); } else { $options = unserialize($options['value']); $options[$option] = $value; $db->query($db->update('table.options') ->rows(['value' => serialize($options)]) ->where('name = ?', $pluginName) ->where('user = ?', 0)); } } } if (!function_exists('get_bs_key_params')) { // get option for framework function get_bs_key_params($option, $default = false) { $db = Db::get(); $pluginName = FRAMEWORK_KEY_PARMAS_NAME; $select = $db->select()->from('table.options') ->where('name = ?', $pluginName); $options = $db->fetchRow($select); if (empty($options)) { return $default; } else { $options = unserialize($options['value']); if (array_key_exists($option, $options)) { return $options[$option]; } else { return $default; } } } } if (!function_exists('delete_option')) { function delete_option($option) { $db = Db::get(); $pluginName = FRAMEWORK_PLUGIN_NAME; if (is_scalar($option)) { $option = trim($option); } if (empty($option)) { return false; } wp_protect_special_option($option); // Get the ID, if no ID then return. $select = $db->select()->from('table.options') ->where('name = ?', $pluginName); $row = $db->fetchRow($select); if (is_null($row)) { return false; } $result = $db->query($db->delete('table.options')->where('name = ?', 'plugin:' . $pluginName)); if ($result) { return true; } return false; } } ================================================ FILE: 配套插件/BsCore/functions/plugin.php ================================================ add_filter($hook_name, $callback, $priority, $accepted_args); return true; } } if (!function_exists('_wp_filter_build_unique_id')) { function _wp_filter_build_unique_id($hook_name, $callback, $priority) { if (is_string($callback)) { return $callback; } if (is_object($callback)) { // Closures are currently implemented as objects. $callback = array($callback, ''); } else { $callback = (array)$callback; } if (is_object($callback[0])) { // Object class calling. return spl_object_hash($callback[0]) . $callback[1]; } elseif (is_string($callback[0])) { // Static calling. return $callback[0] . '::' . $callback[1]; } } } if (!function_exists('_wp_call_all_hook')) { function _wp_call_all_hook($args) { global $wp_filter; $wp_filter['all']->do_all_hook($args); } } if (!function_exists('do_action')) { function do_action($hook_name, ...$arg) { global $wp_filter, $wp_actions, $wp_current_filter; if (!isset($wp_actions[$hook_name])) { $wp_actions[$hook_name] = 1; } else { ++$wp_actions[$hook_name]; } // Do 'all' actions first. if (isset($wp_filter['all'])) { $wp_current_filter[] = $hook_name; $all_args = func_get_args(); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection _wp_call_all_hook($all_args); } if (!isset($wp_filter[$hook_name])) { if (isset($wp_filter['all'])) { array_pop($wp_current_filter); } return; } if (!isset($wp_filter['all'])) { $wp_current_filter[] = $hook_name; } if (empty($arg)) { $arg[] = ''; } elseif (is_array($arg[0]) && 1 === count($arg[0]) && isset($arg[0][0]) && is_object($arg[0][0])) { // Backward compatibility for PHP4-style passing of `array( &$this )` as action `$arg`. $arg[0] = $arg[0][0]; } $wp_filter[$hook_name]->do_action($arg); array_pop($wp_current_filter); } } if (!function_exists('remove_filter')) { function remove_filter($hook_name, $callback, $priority = 10) { global $wp_filter; $r = false; if (isset($wp_filter[$hook_name])) { $r = $wp_filter[$hook_name]->remove_filter($hook_name, $callback, $priority); if (!$wp_filter[$hook_name]->callbacks) { unset($wp_filter[$hook_name]); } } return $r; } } if (!function_exists('remove_action')) { function remove_action($hook_name, $callback, $priority = 10) { return remove_filter($hook_name, $callback, $priority); } } if (!class_exists('WP_Hook')) { final class WP_Hook implements Iterator, ArrayAccess { /** * Hook callbacks. * * @since 4.7.0 * @var array */ public $callbacks = array(); /** * The priority keys of actively running iterations of a hook. * * @since 4.7.0 * @var array */ private $iterations = array(); /** * The current priority of actively running iterations of a hook. * * @since 4.7.0 * @var array */ private $current_priority = array(); /** * Number of levels this hook can be recursively called. * * @since 4.7.0 * @var int */ private $nesting_level = 0; /** * Flag for if we're currently doing an action, rather than a filter. * * @since 4.7.0 * @var bool */ private $doing_action = false; /** * Adds a callback function to a filter hook. * * @param string $hook_name The name of the filter to add the callback to. * @param callable $callback The callback to be run when the filter is applied. * @param int $priority The order in which the functions associated with a particular filter * are executed. Lower numbers correspond with earlier execution, * and functions with the same priority are executed in the order * in which they were added to the filter. * @param int $accepted_args The number of arguments the function accepts. * @since 4.7.0 * */ public function add_filter($hook_name, $callback, $priority, $accepted_args) { $idx = _wp_filter_build_unique_id($hook_name, $callback, $priority); $priority_existed = isset($this->callbacks[$priority]); $this->callbacks[$priority][$idx] = array( 'function' => $callback, 'accepted_args' => $accepted_args, ); // If we're adding a new priority to the list, put them back in sorted order. if (!$priority_existed && count($this->callbacks) > 1) { ksort($this->callbacks, SORT_NUMERIC); } if ($this->nesting_level > 0) { $this->resort_active_iterations($priority, $priority_existed); } } /** * Handles resetting callback priority keys mid-iteration. * * @param false|int $new_priority Optional. The priority of the new filter being added. Default false, * for no priority being added. * @param bool $priority_existed Optional. Flag for whether the priority already existed before the new * filter was added. Default false. * @since 4.7.0 * */ private function resort_active_iterations($new_priority = false, $priority_existed = false) { $new_priorities = array_keys($this->callbacks); // If there are no remaining hooks, clear out all running iterations. if (!$new_priorities) { foreach ($this->iterations as $index => $iteration) { $this->iterations[$index] = $new_priorities; } return; } $min = min($new_priorities); foreach ($this->iterations as $index => &$iteration) { $current = current($iteration); // If we're already at the end of this iteration, just leave the array pointer where it is. if (false === $current) { continue; } $iteration = $new_priorities; if ($current < $min) { array_unshift($iteration, $current); continue; } while (current($iteration) < $current) { if (false === next($iteration)) { break; } } // If we have a new priority that didn't exist, but ::apply_filters() or ::do_action() thinks it's the current priority... if ($new_priority === $this->current_priority[$index] && !$priority_existed) { /* * ...and the new priority is the same as what $this->iterations thinks is the previous * priority, we need to move back to it. */ if (false === current($iteration)) { // If we've already moved off the end of the array, go back to the last element. $prev = end($iteration); } else { // Otherwise, just go back to the previous element. $prev = prev($iteration); } if (false === $prev) { // Start of the array. Reset, and go about our day. reset($iteration); } elseif ($new_priority !== $prev) { // Previous wasn't the same. Move forward again. next($iteration); } } } unset($iteration); } /** * Removes a callback function from a filter hook. * * @param string $hook_name The filter hook to which the function to be removed is hooked. * @param callable|string|array $callback The callback to be removed from running when the filter is applied. * This method can be called unconditionally to speculatively remove * a callback that may or may not exist. * @param int $priority The exact priority used when adding the original filter callback. * @return bool Whether the callback existed before it was removed. * @since 4.7.0 * */ public function remove_filter($hook_name, $callback, $priority) { $function_key = _wp_filter_build_unique_id($hook_name, $callback, $priority); $exists = isset($this->callbacks[$priority][$function_key]); if ($exists) { unset($this->callbacks[$priority][$function_key]); if (!$this->callbacks[$priority]) { unset($this->callbacks[$priority]); if ($this->nesting_level > 0) { $this->resort_active_iterations(); } } } return $exists; } /** * Checks if a specific callback has been registered for this hook. * * When using the `$callback` argument, this function may return a non-boolean value * that evaluates to false (e.g. 0), so use the `===` operator for testing the return value. * * @param string $hook_name Optional. The name of the filter hook. Default empty. * @param callable|string|array|false $callback Optional. The callback to check for. * This method can be called unconditionally to speculatively check * a callback that may or may not exist. Default false. * @return bool|int If `$callback` is omitted, returns boolean for whether the hook has * anything registered. When checking a specific function, the priority * of that hook is returned, or false if the function is not attached. * @since 4.7.0 * */ public function has_filter($hook_name = '', $callback = false) { if (false === $callback) { return $this->has_filters(); } $function_key = _wp_filter_build_unique_id($hook_name, $callback, false); if (!$function_key) { return false; } foreach ($this->callbacks as $priority => $callbacks) { if (isset($callbacks[$function_key])) { return $priority; } } return false; } /** * Checks if any callbacks have been registered for this hook. * * @return bool True if callbacks have been registered for the current hook, otherwise false. * @since 4.7.0 * */ public function has_filters() { foreach ($this->callbacks as $callbacks) { if ($callbacks) { return true; } } return false; } /** * Removes all callbacks from the current filter. * * @param int|false $priority Optional. The priority number to remove. Default false. * @since 4.7.0 * */ public function remove_all_filters($priority = false) { if (!$this->callbacks) { return; } if (false === $priority) { $this->callbacks = array(); } elseif (isset($this->callbacks[$priority])) { unset($this->callbacks[$priority]); } if ($this->nesting_level > 0) { $this->resort_active_iterations(); } } /** * Calls the callback functions that have been added to a filter hook. * * @param mixed $value The value to filter. * @param array $args Additional parameters to pass to the callback functions. * This array is expected to include $value at index 0. * @return mixed The filtered value after all hooked functions are applied to it. * @since 4.7.0 * */ public function apply_filters($value, $args) { if (!$this->callbacks) { return $value; } $nesting_level = $this->nesting_level++; $this->iterations[$nesting_level] = array_keys($this->callbacks); $num_args = count($args); do { $this->current_priority[$nesting_level] = current($this->iterations[$nesting_level]); $priority = $this->current_priority[$nesting_level]; foreach ($this->callbacks[$priority] as $the_) { if (!$this->doing_action) { $args[0] = $value; } // Avoid the array_slice() if possible. if (0 == $the_['accepted_args']) { $value = call_user_func($the_['function']); } elseif ($the_['accepted_args'] >= $num_args) { $value = call_user_func_array($the_['function'], $args); } else { $value = call_user_func_array($the_['function'], array_slice($args, 0, (int)$the_['accepted_args'])); } } } while (false !== next($this->iterations[$nesting_level])); unset($this->iterations[$nesting_level]); unset($this->current_priority[$nesting_level]); $this->nesting_level--; return $value; } /** * Calls the callback functions that have been added to an action hook. * * @param array $args Parameters to pass to the callback functions. * @since 4.7.0 * */ public function do_action($args) { $this->doing_action = true; $this->apply_filters('', $args); // If there are recursive calls to the current action, we haven't finished it until we get to the last one. if (!$this->nesting_level) { $this->doing_action = false; } } /** * Processes the functions hooked into the 'all' hook. * * @param array $args Arguments to pass to the hook callbacks. Passed by reference. * @since 4.7.0 * */ public function do_all_hook(&$args) { $nesting_level = $this->nesting_level++; $this->iterations[$nesting_level] = array_keys($this->callbacks); do { $priority = current($this->iterations[$nesting_level]); foreach ($this->callbacks[$priority] as $the_) { call_user_func_array($the_['function'], $args); } } while (false !== next($this->iterations[$nesting_level])); unset($this->iterations[$nesting_level]); $this->nesting_level--; } /** * Return the current priority level of the currently running iteration of the hook. * * @return int|false If the hook is running, return the current priority level. * If it isn't running, return false. * @since 4.7.0 * */ public function current_priority() { if (false === current($this->iterations)) { return false; } return current(current($this->iterations)); } /** * Normalizes filters set up before WordPress has initialized to WP_Hook objects. * * The `$filters` parameter should be an array keyed by hook name, with values * containing either: * * - A `WP_Hook` instance * - An array of callbacks keyed by their priorities * * Examples: * * $filters = array( * 'wp_fatal_error_handler_enabled' => array( * 10 => array( * array( * 'accepted_args' => 0, * 'function' => function() { * return false; * }, * ), * ), * ), * ); * * @param array $filters Filters to normalize. See documentation above for details. * @return WP_Hook[] Array of normalized filters. * @since 4.7.0 * */ public static function build_preinitialized_hooks($filters) { /** @var WP_Hook[] $normalized */ $normalized = array(); foreach ($filters as $hook_name => $callback_groups) { if (is_object($callback_groups) && $callback_groups instanceof WP_Hook) { $normalized[$hook_name] = $callback_groups; continue; } $hook = new WP_Hook(); // Loop through callback groups. foreach ($callback_groups as $priority => $callbacks) { // Loop through callbacks. foreach ($callbacks as $cb) { $hook->add_filter($hook_name, $cb['function'], $priority, $cb['accepted_args']); } } $normalized[$hook_name] = $hook; } return $normalized; } /** * Determines whether an offset value exists. * * @param mixed $offset An offset to check for. * @return bool True if the offset exists, false otherwise. * @since 4.7.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetexists.php * */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->callbacks[$offset]); } /** * Retrieves a value at a specified offset. * * @param mixed $offset The offset to retrieve. * @return mixed If set, the value at the specified offset, null otherwise. * @since 4.7.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetget.php * */ #[ReturnTypeWillChange] public function offsetGet($offset) { return isset($this->callbacks[$offset]) ? $this->callbacks[$offset] : null; } /** * Sets a value at a specified offset. * * @param mixed $offset The offset to assign the value to. * @param mixed $value The value to set. * @since 4.7.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetset.php * */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (is_null($offset)) { $this->callbacks[] = $value; } else { $this->callbacks[$offset] = $value; } } /** * Unsets a specified offset. * * @param mixed $offset The offset to unset. * @link https://www.php.net/manual/en/arrayaccess.offsetunset.php * * @since 4.7.0 * */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->callbacks[$offset]); } /** * Returns the current element. * * @return array Of callbacks at current priority. * @link https://www.php.net/manual/en/iterator.current.php * * @since 4.7.0 * */ #[ReturnTypeWillChange] public function current() { return current($this->callbacks); } /** * Moves forward to the next element. * * @return array Of callbacks at next priority. * @link https://www.php.net/manual/en/iterator.next.php * * @since 4.7.0 * */ #[ReturnTypeWillChange] public function next() { return next($this->callbacks); } /** * Returns the key of the current element. * * @return mixed Returns current priority on success, or NULL on failure * @link https://www.php.net/manual/en/iterator.key.php * * @since 4.7.0 * */ #[ReturnTypeWillChange] public function key() { return key($this->callbacks); } /** * Checks if current position is valid. * * @return bool Whether the current position is valid. * @link https://www.php.net/manual/en/iterator.valid.php * * @since 4.7.0 * */ #[ReturnTypeWillChange] public function valid() { return key($this->callbacks) !== null; } /** * Rewinds the Iterator to the first element. * * @since 4.7.0 * * @link https://www.php.net/manual/en/iterator.rewind.php */ #[ReturnTypeWillChange] public function rewind() { reset($this->callbacks); } } } ================================================ FILE: 配套插件/BsCore/functions/sanitize.php ================================================ add( 'required', esc_html__( 'Please enter a valid email address.', 'csf' ) ); } return $validity; } } /** * * Numeric validate for Customizer * * @since 1.0.0 * @version 1.0.0 * */ if ( ! function_exists( 'csf_customize_validate_numeric' ) ) { function csf_customize_validate_numeric( $validity, $value, $wp_customize ) { if ( ! is_numeric( $value ) ) { $validity->add( 'required', esc_html__( 'Please enter a valid number.', 'csf' ) ); } return $validity; } } /** * * Required validate for Customizer * * @since 1.0.0 * @version 1.0.0 * */ if ( ! function_exists( 'csf_customize_validate_required' ) ) { function csf_customize_validate_required( $validity, $value, $wp_customize ) { if ( empty( $value ) ) { $validity->add( 'required', esc_html__( 'This field is required.', 'csf' ) ); } return $validity; } } /** * * URL validate for Customizer * * @since 1.0.0 * @version 1.0.0 * */ if ( ! function_exists( 'csf_customize_validate_url' ) ) { function csf_customize_validate_url( $validity, $value, $wp_customize ) { if ( ! filter_var( $value, FILTER_VALIDATE_URL ) ) { $validity->add( 'required', esc_html__( 'Please enter a valid URL.', 'csf' ) ); } return $validity; } } ================================================ FILE: 配套插件/BsCore/functions/walker.php ================================================ ID, $item, $depth, $args ); $custom_fields = ob_get_clean(); $output .= preg_replace( '/(?=<(fieldset|p)[^>]+class="[^"]*field-move)/', $custom_fields, $html ); } } } ================================================ FILE: 配套插件/BsCore/functions/wp_query.php ================================================ filter($args, $operator); if ($field) { $util->pluck($field); } return $util->get_output(); } } if (!function_exists('get_taxonomies')) { function get_taxonomies($args = array(), $output = 'names', $operator = 'and') { global $wp_taxonomies; $field = ('names' === $output) ? 'name' : false; return wp_filter_object_list($wp_taxonomies, $args, $operator, $field); } } /** * The WordPress Query class. * * @link https://developer.wordpress.org/reference/classes/wp_query/ * * @since 1.5.0 * @since 4.5.0 Removed the `$comments_popup` property. */ if (!class_exists('WP_Query')) { class WP_Query { /** * Query vars set by the user. * * @since 1.5.0 * @var array */ public $query; /** * Query vars, after parsing. * * @since 1.5.0 * @var array */ public $query_vars = array(); /** * Taxonomy query, as passed to get_tax_sql(). * * @since 3.1.0 * @var WP_Tax_Query A taxonomy query instance. */ public $tax_query; /** * Metadata query container. * * @since 3.2.0 * @var WP_Meta_Query A meta query instance. */ public $meta_query = false; /** * Date query container. * * @since 3.7.0 * @var WP_Date_Query A date query instance. */ public $date_query = false; /** * Holds the data for a single object that is queried. * * Holds the contents of a post, page, category, attachment. * * @since 1.5.0 * @var WP_Term|WP_Post_Type|WP_Post|WP_User|null */ public $queried_object; /** * The ID of the queried object. * * @since 1.5.0 * @var int */ public $queried_object_id; /** * SQL for the database query. * * @since 2.0.1 * @var string */ public $request; /** * Array of post objects or post IDs. * * @since 1.5.0 * @var WP_Post[]|int[] */ public $posts; /** * The number of posts for the current query. * * @since 1.5.0 * @var int */ public $post_count = 0; /** * Index of the current item in the loop. * * @since 1.5.0 * @var int */ public $current_post = -1; /** * Whether the loop has started and the caller is in the loop. * * @since 2.0.0 * @var bool */ public $in_the_loop = false; /** * The current post. * * This property does not get populated when the `fields` argument is set to * `ids` or `id=>parent`. * * @since 1.5.0 * @var WP_Post|null */ public $post; /** * The list of comments for current post. * * @since 2.2.0 * @var WP_Comment[] */ public $comments; /** * The number of comments for the posts. * * @since 2.2.0 * @var int */ public $comment_count = 0; /** * The index of the comment in the comment loop. * * @since 2.2.0 * @var int */ public $current_comment = -1; /** * Current comment object. * * @since 2.2.0 * @var WP_Comment */ public $comment; /** * The number of found posts for the current query. * * If limit clause was not used, equals $post_count. * * @since 2.1.0 * @var int */ public $found_posts = 0; /** * The number of pages. * * @since 2.1.0 * @var int */ public $max_num_pages = 0; /** * The number of comment pages. * * @since 2.7.0 * @var int */ public $max_num_comment_pages = 0; /** * Signifies whether the current query is for a single post. * * @since 1.5.0 * @var bool */ public $is_single = false; /** * Signifies whether the current query is for a preview. * * @since 2.0.0 * @var bool */ public $is_preview = false; /** * Signifies whether the current query is for a page. * * @since 1.5.0 * @var bool */ public $is_page = false; /** * Signifies whether the current query is for an archive. * * @since 1.5.0 * @var bool */ public $is_archive = false; /** * Signifies whether the current query is for a date archive. * * @since 1.5.0 * @var bool */ public $is_date = false; /** * Signifies whether the current query is for a year archive. * * @since 1.5.0 * @var bool */ public $is_year = false; /** * Signifies whether the current query is for a month archive. * * @since 1.5.0 * @var bool */ public $is_month = false; /** * Signifies whether the current query is for a day archive. * * @since 1.5.0 * @var bool */ public $is_day = false; /** * Signifies whether the current query is for a specific time. * * @since 1.5.0 * @var bool */ public $is_time = false; /** * Signifies whether the current query is for an author archive. * * @since 1.5.0 * @var bool */ public $is_author = false; /** * Signifies whether the current query is for a category archive. * * @since 1.5.0 * @var bool */ public $is_category = false; /** * Signifies whether the current query is for a tag archive. * * @since 2.3.0 * @var bool */ public $is_tag = false; /** * Signifies whether the current query is for a taxonomy archive. * * @since 2.5.0 * @var bool */ public $is_tax = false; /** * Signifies whether the current query is for a search. * * @since 1.5.0 * @var bool */ public $is_search = false; /** * Signifies whether the current query is for a feed. * * @since 1.5.0 * @var bool */ public $is_feed = false; /** * Signifies whether the current query is for a comment feed. * * @since 2.2.0 * @var bool */ public $is_comment_feed = false; /** * Signifies whether the current query is for trackback endpoint call. * * @since 1.5.0 * @var bool */ public $is_trackback = false; /** * Signifies whether the current query is for the site homepage. * * @since 1.5.0 * @var bool */ public $is_home = false; /** * Signifies whether the current query is for the Privacy Policy page. * * @since 5.2.0 * @var bool */ public $is_privacy_policy = false; /** * Signifies whether the current query couldn't find anything. * * @since 1.5.0 * @var bool */ public $is_404 = false; /** * Signifies whether the current query is for an embed. * * @since 4.4.0 * @var bool */ public $is_embed = false; /** * Signifies whether the current query is for a paged result and not for the first page. * * @since 1.5.0 * @var bool */ public $is_paged = false; /** * Signifies whether the current query is for an administrative interface page. * * @since 1.5.0 * @var bool */ public $is_admin = false; /** * Signifies whether the current query is for an attachment page. * * @since 2.0.0 * @var bool */ public $is_attachment = false; /** * Signifies whether the current query is for an existing single post of any post type * (post, attachment, page, custom post types). * * @since 2.1.0 * @var bool */ public $is_singular = false; /** * Signifies whether the current query is for the robots.txt file. * * @since 2.1.0 * @var bool */ public $is_robots = false; /** * Signifies whether the current query is for the favicon.ico file. * * @since 5.4.0 * @var bool */ public $is_favicon = false; /** * Signifies whether the current query is for the page_for_posts page. * * Basically, the homepage if the option isn't set for the static homepage. * * @since 2.1.0 * @var bool */ public $is_posts_page = false; /** * Signifies whether the current query is for a post type archive. * * @since 3.1.0 * @var bool */ public $is_post_type_archive = false; /** * Stores the ->query_vars state like md5(serialize( $this->query_vars ) ) so we know * whether we have to re-parse because something has changed * * @since 3.1.0 * @var bool|string */ private $query_vars_hash = false; /** * Whether query vars have changed since the initial parse_query() call. Used to catch modifications to query vars made * via pre_get_posts hooks. * * @since 3.1.1 */ private $query_vars_changed = true; /** * Set if post thumbnails are cached * * @since 3.2.0 * @var bool */ public $thumbnails_cached = false; /** * Cached list of search stopwords. * * @since 3.7.0 * @var array */ private $stopwords; private $compat_fields = array('query_vars_hash', 'query_vars_changed'); private $compat_methods = array('init_query_flags', 'parse_tax_query'); /** * Resets query flags to false. * * The query flags are what page info WordPress was able to figure out. * * @since 2.0.0 */ private function init_query_flags() { $this->is_single = false; $this->is_preview = false; $this->is_page = false; $this->is_archive = false; $this->is_date = false; $this->is_year = false; $this->is_month = false; $this->is_day = false; $this->is_time = false; $this->is_author = false; $this->is_category = false; $this->is_tag = false; $this->is_tax = false; $this->is_search = false; $this->is_feed = false; $this->is_comment_feed = false; $this->is_trackback = false; $this->is_home = false; $this->is_privacy_policy = false; $this->is_404 = false; $this->is_paged = false; $this->is_admin = false; $this->is_attachment = false; $this->is_singular = false; $this->is_robots = false; $this->is_favicon = false; $this->is_posts_page = false; $this->is_post_type_archive = false; } /** * Initiates object properties and sets default values. * * @since 1.5.0 */ public function init() { unset($this->posts); unset($this->query); $this->query_vars = array(); unset($this->queried_object); unset($this->queried_object_id); $this->post_count = 0; $this->current_post = -1; $this->in_the_loop = false; unset($this->request); unset($this->post); unset($this->comments); unset($this->comment); $this->comment_count = 0; $this->current_comment = -1; $this->found_posts = 0; $this->max_num_pages = 0; $this->max_num_comment_pages = 0; $this->init_query_flags(); } /** * Reparse the query vars. * * @since 1.5.0 */ public function parse_query_vars() { $this->parse_query(); } /** * Fills in the query variables, which do not exist within the parameter. * * @param array $array Defined query variables. * @return array Complete query variables with undefined ones filled in empty. * @since 2.1.0 * @since 4.5.0 Removed the `comments_popup` public query variable. * */ public function fill_query_vars($array) { $keys = array( 'error', 'm', 'p', 'post_parent', 'subpost', 'subpost_id', 'attachment', 'attachment_id', 'name', 'pagename', 'page_id', 'second', 'minute', 'hour', 'day', 'monthnum', 'year', 'w', 'category_name', 'tag', 'cat', 'tag_id', 'author', 'author_name', 'feed', 'tb', 'paged', 'meta_key', 'meta_value', 'preview', 's', 'sentence', 'title', 'fields', 'menu_order', 'embed', ); foreach ($keys as $key) { if (!isset($array[$key])) { $array[$key] = ''; } } $array_keys = array( 'category__in', 'category__not_in', 'category__and', 'post__in', 'post__not_in', 'post_name__in', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'post_parent__in', 'post_parent__not_in', 'author__in', 'author__not_in', ); foreach ($array_keys as $key) { if (!isset($array[$key])) { $array[$key] = array(); } } return $array; } /** * Parse a query string and set query type booleans. * * @param string|array $query { * Optional. Array or string of Query parameters. * * @type int $attachment_id Attachment post ID. Used for 'attachment' post_type. * @type int|string $author Author ID, or comma-separated list of IDs. * @type string $author_name User 'user_nicename'. * @type int[] $author__in An array of author IDs to query from. * @type int[] $author__not_in An array of author IDs not to query from. * @type bool $cache_results Whether to cache post information. Default true. * @type int|string $cat Category ID or comma-separated list of IDs (this or any children). * @type int[] $category__and An array of category IDs (AND in). * @type int[] $category__in An array of category IDs (OR in, no children). * @type int[] $category__not_in An array of category IDs (NOT in). * @type string $category_name Use category slug (not name, this or any children). * @type array|int $comment_count Filter results by comment count. Provide an integer to match * comment count exactly. Provide an array with integer 'value' * and 'compare' operator ('=', '!=', '>', '>=', '<', '<=' ) to * compare against comment_count in a specific way. * @type string $comment_status Comment status. * @type int $comments_per_page The number of comments to return per page. * Default 'comments_per_page' option. * @type array $date_query An associative array of WP_Date_Query arguments. * See WP_Date_Query::__construct(). * @type int $day Day of the month. Default empty. Accepts numbers 1-31. * @type bool $exact Whether to search by exact keyword. Default false. * @type string $fields Post fields to query for. Accepts: * - '' Returns an array of complete post objects (`WP_Post[]`). * - 'ids' Returns an array of post IDs (`int[]`). * - 'id=>parent' Returns an associative array of parent post IDs, * keyed by post ID (`int[]`). * Default ''. * @type int $hour Hour of the day. Default empty. Accepts numbers 0-23. * @type int|bool $ignore_sticky_posts Whether to ignore sticky posts or not. Setting this to false * excludes stickies from 'post__in'. Accepts 1|true, 0|false. * Default false. * @type int $m Combination YearMonth. Accepts any four-digit year and month * numbers 1-12. Default empty. * @type string|string[] $meta_key Meta key or keys to filter by. * @type string|string[] $meta_value Meta value or values to filter by. * @type string $meta_compare MySQL operator used for comparing the meta value. * See WP_Meta_Query::__construct for accepted values and default value. * @type string $meta_compare_key MySQL operator used for comparing the meta key. * See WP_Meta_Query::__construct for accepted values and default value. * @type string $meta_type MySQL data type that the meta_value column will be CAST to for comparisons. * See WP_Meta_Query::__construct for accepted values and default value. * @type string $meta_type_key MySQL data type that the meta_key column will be CAST to for comparisons. * See WP_Meta_Query::__construct for accepted values and default value. * @type array $meta_query An associative array of WP_Meta_Query arguments. * See WP_Meta_Query::__construct for accepted values. * @type int $menu_order The menu order of the posts. * @type int $minute Minute of the hour. Default empty. Accepts numbers 0-59. * @type int $monthnum The two-digit month. Default empty. Accepts numbers 1-12. * @type string $name Post slug. * @type bool $nopaging Show all posts (true) or paginate (false). Default false. * @type bool $no_found_rows Whether to skip counting the total rows found. Enabling can improve * performance. Default false. * @type int $offset The number of posts to offset before retrieval. * @type string $order Designates ascending or descending order of posts. Default 'DESC'. * Accepts 'ASC', 'DESC'. * @type string|array $orderby Sort retrieved posts by parameter. One or more options may be passed. * To use 'meta_value', or 'meta_value_num', 'meta_key=keyname' must be * also be defined. To sort by a specific `$meta_query` clause, use that * clause's array key. Accepts: * - 'none' * - 'name' * - 'author' * - 'date' * - 'title' * - 'modified' * - 'menu_order' * - 'parent' * - 'ID' * - 'rand' * - 'relevance' * - 'RAND(x)' (where 'x' is an integer seed value) * - 'comment_count' * - 'meta_value' * - 'meta_value_num' * - 'post__in' * - 'post_name__in' * - 'post_parent__in' * - The array keys of `$meta_query`. * Default is 'date', except when a search is being performed, when * the default is 'relevance'. * @type int $p Post ID. * @type int $page Show the number of posts that would show up on page X of a * static front page. * @type int $paged The number of the current page. * @type int $page_id Page ID. * @type string $pagename Page slug. * @type string $perm Show posts if user has the appropriate capability. * @type string $ping_status Ping status. * @type int[] $post__in An array of post IDs to retrieve, sticky posts will be included. * @type int[] $post__not_in An array of post IDs not to retrieve. Note: a string of comma- * separated IDs will NOT work. * @type string $post_mime_type The mime type of the post. Used for 'attachment' post_type. * @type string[] $post_name__in An array of post slugs that results must match. * @type int $post_parent Page ID to retrieve child pages for. Use 0 to only retrieve * top-level pages. * @type int[] $post_parent__in An array containing parent page IDs to query child pages from. * @type int[] $post_parent__not_in An array containing parent page IDs not to query child pages from. * @type string|string[] $post_type A post type slug (string) or array of post type slugs. * Default 'any' if using 'tax_query'. * @type string|string[] $post_status A post status (string) or array of post statuses. * @type int $posts_per_page The number of posts to query for. Use -1 to request all posts. * @type int $posts_per_archive_page The number of posts to query for by archive page. Overrides * 'posts_per_page' when is_archive(), or is_search() are true. * @type string $s Search keyword(s). Prepending a term with a hyphen will * exclude posts matching that term. Eg, 'pillow -sofa' will * return posts containing 'pillow' but not 'sofa'. The * character used for exclusion can be modified using the * the 'wp_query_search_exclusion_prefix' filter. * @type int $second Second of the minute. Default empty. Accepts numbers 0-59. * @type bool $sentence Whether to search by phrase. Default false. * @type bool $suppress_filters Whether to suppress filters. Default false. * @type string $tag Tag slug. Comma-separated (either), Plus-separated (all). * @type int[] $tag__and An array of tag IDs (AND in). * @type int[] $tag__in An array of tag IDs (OR in). * @type int[] $tag__not_in An array of tag IDs (NOT in). * @type int $tag_id Tag id or comma-separated list of IDs. * @type string[] $tag_slug__and An array of tag slugs (AND in). * @type string[] $tag_slug__in An array of tag slugs (OR in). unless 'ignore_sticky_posts' is * true. Note: a string of comma-separated IDs will NOT work. * @type array $tax_query An associative array of WP_Tax_Query arguments. * See WP_Tax_Query->__construct(). * @type string $title Post title. * @type bool $update_post_meta_cache Whether to update the post meta cache. Default true. * @type bool $update_post_term_cache Whether to update the post term cache. Default true. * @type bool $lazy_load_term_meta Whether to lazy-load term meta. Setting to false will * disable cache priming for term meta, so that each * get_term_meta() call will hit the database. * Defaults to the value of `$update_post_term_cache`. * @type int $w The week number of the year. Default empty. Accepts numbers 0-53. * @type int $year The four-digit year. Default empty. Accepts any four-digit year. * } * @since 4.2.0 Introduced the ability to order by specific clauses of a `$meta_query`, by passing the clause's * array key to `$orderby`. * @since 4.4.0 Introduced `$post_name__in` and `$title` parameters. `$s` was updated to support excluded * search terms, by prepending a hyphen. * @since 4.5.0 Removed the `$comments_popup` parameter. * Introduced the `$comment_status` and `$ping_status` parameters. * Introduced `RAND(x)` syntax for `$orderby`, which allows an integer seed value to random sorts. * @since 4.6.0 Added 'post_name__in' support for `$orderby`. Introduced the `$lazy_load_term_meta` argument. * @since 4.9.0 Introduced the `$comment_count` parameter. * @since 5.1.0 Introduced the `$meta_compare_key` parameter. * @since 5.3.0 Introduced the `$meta_type_key` parameter. * * @since 1.5.0 */ public function parse_query($query = '') { if (!empty($query)) { $this->init(); $this->query = wp_parse_args($query); $this->query_vars = $this->query; } elseif (!isset($this->query)) { $this->query = $this->query_vars; } $this->query_vars = $this->fill_query_vars($this->query_vars); $qv = &$this->query_vars; $this->query_vars_changed = true; if (!empty($qv['robots'])) { $this->is_robots = true; } elseif (!empty($qv['favicon'])) { $this->is_favicon = true; } if (!is_scalar($qv['p']) || (int)$qv['p'] < 0) { $qv['p'] = 0; $qv['error'] = '404'; } else { $qv['p'] = (int)$qv['p']; } $qv['page_id'] = absint($qv['page_id']); $qv['year'] = absint($qv['year']); $qv['monthnum'] = absint($qv['monthnum']); $qv['day'] = absint($qv['day']); $qv['w'] = absint($qv['w']); $qv['m'] = is_scalar($qv['m']) ? preg_replace('|[^0-9]|', '', $qv['m']) : ''; $qv['paged'] = absint($qv['paged']); $qv['cat'] = preg_replace('|[^0-9,-]|', '', $qv['cat']); // Comma-separated list of positive or negative integers. $qv['author'] = preg_replace('|[^0-9,-]|', '', $qv['author']); // Comma-separated list of positive or negative integers. $qv['pagename'] = trim($qv['pagename']); $qv['name'] = trim($qv['name']); $qv['title'] = trim($qv['title']); if ('' !== $qv['hour']) { $qv['hour'] = absint($qv['hour']); } if ('' !== $qv['minute']) { $qv['minute'] = absint($qv['minute']); } if ('' !== $qv['second']) { $qv['second'] = absint($qv['second']); } if ('' !== $qv['menu_order']) { $qv['menu_order'] = absint($qv['menu_order']); } // Fairly large, potentially too large, upper bound for search string lengths. if (!is_scalar($qv['s']) || (!empty($qv['s']) && strlen($qv['s']) > 1600)) { $qv['s'] = ''; } // Compat. Map subpost to attachment. if ('' != $qv['subpost']) { $qv['attachment'] = $qv['subpost']; } if ('' != $qv['subpost_id']) { $qv['attachment_id'] = $qv['subpost_id']; } $qv['attachment_id'] = absint($qv['attachment_id']); if (('' !== $qv['attachment']) || !empty($qv['attachment_id'])) { $this->is_single = true; $this->is_attachment = true; } elseif ('' !== $qv['name']) { $this->is_single = true; } elseif ($qv['p']) { $this->is_single = true; } elseif ('' !== $qv['pagename'] || !empty($qv['page_id'])) { $this->is_page = true; $this->is_single = false; } else { // Look for archive queries. Dates, categories, authors, search, post type archives. if (isset($this->query['s'])) { $this->is_search = true; } if ('' !== $qv['second']) { $this->is_time = true; $this->is_date = true; } if ('' !== $qv['minute']) { $this->is_time = true; $this->is_date = true; } if ('' !== $qv['hour']) { $this->is_time = true; $this->is_date = true; } if ($qv['day']) { if (!$this->is_date) { $date = sprintf('%04d-%02d-%02d', $qv['year'], $qv['monthnum'], $qv['day']); if ($qv['monthnum'] && $qv['year'] && !wp_checkdate($qv['monthnum'], $qv['day'], $qv['year'], $date)) { $qv['error'] = '404'; } else { $this->is_day = true; $this->is_date = true; } } } if ($qv['monthnum']) { if (!$this->is_date) { if (12 < $qv['monthnum']) { $qv['error'] = '404'; } else { $this->is_month = true; $this->is_date = true; } } } if ($qv['year']) { if (!$this->is_date) { $this->is_year = true; $this->is_date = true; } } if ($qv['m']) { $this->is_date = true; if (strlen($qv['m']) > 9) { $this->is_time = true; } elseif (strlen($qv['m']) > 7) { $this->is_day = true; } elseif (strlen($qv['m']) > 5) { $this->is_month = true; } else { $this->is_year = true; } } if ($qv['w']) { $this->is_date = true; } $this->query_vars_hash = false; // there is no tax in typecho, so we don't concern it // $this->parse_tax_query( $qv ); // // foreach ( $this->tax_query->queries as $tax_query ) { // if ( ! is_array( $tax_query ) ) { // continue; // } // // if ( isset( $tax_query['operator'] ) && 'NOT IN' !== $tax_query['operator'] ) { // switch ( $tax_query['taxonomy'] ) { // case 'category': // $this->is_category = true; // break; // case 'tag': // $this->is_tag = true; // break; // default: // $this->is_tax = true; // } // } // } // unset( $tax_query ); if (empty($qv['author']) || ('0' == $qv['author'])) { $this->is_author = false; } else { $this->is_author = true; } if ('' !== $qv['author_name']) { $this->is_author = true; } if (!empty($qv['post_type']) && !is_array($qv['post_type'])) { $post_type_obj = get_post_type_object($qv['post_type']); if (!empty($post_type_obj->has_archive)) { $this->is_post_type_archive = true; } } if ($this->is_post_type_archive || $this->is_date || $this->is_author || $this->is_category || $this->is_tag || $this->is_tax) { $this->is_archive = true; } } if ('' != $qv['feed']) { $this->is_feed = true; } if ('' != $qv['embed']) { $this->is_embed = true; } if ('' != $qv['tb']) { $this->is_trackback = true; } if ('' != $qv['paged'] && ((int)$qv['paged'] > 1)) { $this->is_paged = true; } // If we're previewing inside the write screen. if ('' != $qv['preview']) { $this->is_preview = true; } if (ty_is_admin()) { $this->is_admin = true; } if (false !== strpos($qv['feed'], 'comments-')) { $qv['feed'] = str_replace('comments-', '', $qv['feed']); $qv['withcomments'] = 1; } $this->is_singular = $this->is_single || $this->is_page || $this->is_attachment; if ($this->is_feed && (!empty($qv['withcomments']) || (empty($qv['withoutcomments']) && $this->is_singular))) { $this->is_comment_feed = true; } if (!($this->is_singular || $this->is_archive || $this->is_search || $this->is_feed || (defined('REST_REQUEST') && REST_REQUEST && $this->is_main_query()) || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_robots || $this->is_favicon)) { $this->is_home = true; } // Correct `is_*` for 'page_on_front' and 'page_for_posts'. if ($this->is_home && 'page' === get_option('show_on_front') && get_option('page_on_front')) { $_query = wp_parse_args($this->query); // 'pagename' can be set and empty depending on matched rewrite rules. Ignore an empty 'pagename'. if (isset($_query['pagename']) && '' === $_query['pagename']) { unset($_query['pagename']); } unset($_query['embed']); if (empty($_query) || !array_diff(array_keys($_query), array('preview', 'page', 'paged', 'cpage'))) { $this->is_page = true; $this->is_home = false; $qv['page_id'] = get_option('page_on_front'); // Correct for 'page_on_front'. if (!empty($qv['paged'])) { $qv['page'] = $qv['paged']; unset($qv['paged']); } } } if ('' !== $qv['pagename']) { $this->queried_object = get_page_by_path($qv['pagename']); if ($this->queried_object && 'attachment' === $this->queried_object->post_type) { if (preg_match('/^[^%]*%(?:postname)%/', get_option('permalink_structure'))) { // See if we also have a post with the same slug. $post = get_page_by_path($qv['pagename'], OBJECT, 'post'); if ($post) { $this->queried_object = $post; $this->is_page = false; $this->is_single = true; } } } if (!empty($this->queried_object)) { $this->queried_object_id = (int)$this->queried_object->ID; } else { unset($this->queried_object); } if ('page' === get_option('show_on_front') && isset($this->queried_object_id) && get_option('page_for_posts') == $this->queried_object_id) { $this->is_page = false; $this->is_home = true; $this->is_posts_page = true; } if (isset($this->queried_object_id) && get_option('wp_page_for_privacy_policy') == $this->queried_object_id) { $this->is_privacy_policy = true; } } if ($qv['page_id']) { if ('page' === get_option('show_on_front') && get_option('page_for_posts') == $qv['page_id']) { $this->is_page = false; $this->is_home = true; $this->is_posts_page = true; } if (get_option('wp_page_for_privacy_policy') == $qv['page_id']) { $this->is_privacy_policy = true; } } if (!empty($qv['post_type'])) { if (is_array($qv['post_type'])) { $qv['post_type'] = array_map('sanitize_key', $qv['post_type']); } else { $qv['post_type'] = sanitize_key($qv['post_type']); } } if (!empty($qv['status'])) { if (is_array($qv['status'])) { $qv['status'] = array_map('sanitize_key', $qv['status']); } else { $qv['status'] = preg_replace('|[^a-z0-9_,-]|', '', $qv['status']); } } if ($this->is_posts_page && (!isset($qv['withcomments']) || !$qv['withcomments'])) { $this->is_comment_feed = false; } $this->is_singular = $this->is_single || $this->is_page || $this->is_attachment; // Done correcting `is_*` for 'page_on_front' and 'page_for_posts'. if ('404' == $qv['error']) { $this->set_404(); } $this->is_embed = $this->is_embed && ($this->is_singular || $this->is_404); $this->query_vars_hash = md5(serialize($this->query_vars)); $this->query_vars_changed = false; /** * Fires after the main query vars have been parsed. * * @param WP_Query $query The WP_Query instance (passed by reference). * @since 1.5.0 * */ // do_action_ref_array( 'parse_query', array( &$this ) ); } /** * Parses various taxonomy related query vars. * * For BC, this method is not marked as protected. See [28987]. * * @param array $q The query variables. Passed by reference. * @since 3.1.0 * */ public function parse_tax_query(&$q) { if (!empty($q['tax_query']) && is_array($q['tax_query'])) { $tax_query = $q['tax_query']; } else { $tax_query = array(); } if (!empty($q['taxonomy']) && !empty($q['term'])) { $tax_query[] = array( 'taxonomy' => $q['taxonomy'], 'terms' => array($q['term']), 'field' => 'slug', ); } foreach (get_taxonomies(array(), 'objects') as $taxonomy => $t) { if ('tag' === $taxonomy) { continue; // Handled further down in the $q['tag'] block. } if ($t->query_var && !empty($q[$t->query_var])) { $tax_query_defaults = array( 'taxonomy' => $taxonomy, 'field' => 'slug', ); if (!empty($t->rewrite['hierarchical'])) { $q[$t->query_var] = wp_basename($q[$t->query_var]); } $term = $q[$t->query_var]; if (is_array($term)) { $term = implode(',', $term); } if (strpos($term, '+') !== false) { $terms = preg_split('/[+]+/', $term); foreach ($terms as $term) { $tax_query[] = array_merge( $tax_query_defaults, array( 'terms' => array($term), ) ); } } else { $tax_query[] = array_merge( $tax_query_defaults, array( 'terms' => preg_split('/[,]+/', $term), ) ); } } } // If query string 'cat' is an array, implode it. if (is_array($q['cat'])) { $q['cat'] = implode(',', $q['cat']); } // Category stuff. if (!empty($q['cat']) && !$this->is_singular) { $cat_in = array(); $cat_not_in = array(); $cat_array = preg_split('/[,\s]+/', urldecode($q['cat'])); $cat_array = array_map('intval', $cat_array); $q['cat'] = implode(',', $cat_array); foreach ($cat_array as $cat) { if ($cat > 0) { $cat_in[] = $cat; } elseif ($cat < 0) { $cat_not_in[] = abs($cat); } } if (!empty($cat_in)) { $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $cat_in, 'field' => 'term_id', 'include_children' => true, ); } if (!empty($cat_not_in)) { $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $cat_not_in, 'field' => 'term_id', 'operator' => 'NOT IN', 'include_children' => true, ); } unset($cat_array, $cat_in, $cat_not_in); } if (!empty($q['category__and']) && 1 === count((array)$q['category__and'])) { $q['category__and'] = (array)$q['category__and']; if (!isset($q['category__in'])) { $q['category__in'] = array(); } $q['category__in'][] = absint(reset($q['category__and'])); unset($q['category__and']); } if (!empty($q['category__in'])) { $q['category__in'] = array_map('absint', array_unique((array)$q['category__in'])); $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $q['category__in'], 'field' => 'term_id', 'include_children' => false, ); } if (!empty($q['category__not_in'])) { $q['category__not_in'] = array_map('absint', array_unique((array)$q['category__not_in'])); $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $q['category__not_in'], 'operator' => 'NOT IN', 'include_children' => false, ); } if (!empty($q['category__and'])) { $q['category__and'] = array_map('absint', array_unique((array)$q['category__and'])); $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $q['category__and'], 'field' => 'term_id', 'operator' => 'AND', 'include_children' => false, ); } // If query string 'tag' is array, implode it. if (is_array($q['tag'])) { $q['tag'] = implode(',', $q['tag']); } // Tag stuff. if ('' !== $q['tag'] && !$this->is_singular && $this->query_vars_changed) { if (strpos($q['tag'], ',') !== false) { $tags = preg_split('/[,\r\n\t ]+/', $q['tag']); foreach ((array)$tags as $tag) { $tag = sanitize_term_field('slug', $tag, 0, 'tag', 'db'); $q['tag_slug__in'][] = $tag; } } elseif (preg_match('/[+\r\n\t ]+/', $q['tag']) || !empty($q['cat'])) { $tags = preg_split('/[+\r\n\t ]+/', $q['tag']); foreach ((array)$tags as $tag) { $tag = sanitize_term_field('slug', $tag, 0, 'tag', 'db'); $q['tag_slug__and'][] = $tag; } } else { $q['tag'] = sanitize_term_field('slug', $q['tag'], 0, 'tag', 'db'); $q['tag_slug__in'][] = $q['tag']; } } if (!empty($q['tag_id'])) { $q['tag_id'] = absint($q['tag_id']); $tax_query[] = array( 'taxonomy' => 'tag', 'terms' => $q['tag_id'], ); } if (!empty($q['tag__in'])) { $q['tag__in'] = array_map('absint', array_unique((array)$q['tag__in'])); $tax_query[] = array( 'taxonomy' => 'tag', 'terms' => $q['tag__in'], ); } if (!empty($q['tag__not_in'])) { $q['tag__not_in'] = array_map('absint', array_unique((array)$q['tag__not_in'])); $tax_query[] = array( 'taxonomy' => 'tag', 'terms' => $q['tag__not_in'], 'operator' => 'NOT IN', ); } if (!empty($q['tag__and'])) { $q['tag__and'] = array_map('absint', array_unique((array)$q['tag__and'])); $tax_query[] = array( 'taxonomy' => 'tag', 'terms' => $q['tag__and'], 'operator' => 'AND', ); } if (!empty($q['tag_slug__in'])) { $q['tag_slug__in'] = array_map('sanitize_title_for_query', array_unique((array)$q['tag_slug__in'])); $tax_query[] = array( 'taxonomy' => 'tag', 'terms' => $q['tag_slug__in'], 'field' => 'slug', ); } if (!empty($q['tag_slug__and'])) { $q['tag_slug__and'] = array_map('sanitize_title_for_query', array_unique((array)$q['tag_slug__and'])); $tax_query[] = array( 'taxonomy' => 'tag', 'terms' => $q['tag_slug__and'], 'field' => 'slug', 'operator' => 'AND', ); } // $this->tax_query = new WP_Tax_Query( $tax_query ); /** * Fires after taxonomy-related query vars have been parsed. * * @param WP_Query $query The WP_Query instance. * @since 3.7.0 * */ // do_action( 'parse_tax_query', $this ); } /** * Generates SQL for the WHERE clause based on passed search terms. * * @param array $q Query variables. * @return string WHERE clause. * @since 3.7.0 * * @global wpdb $wpdb WordPress database abstraction object. * */ protected function parse_search(&$q) { $wpdb = \Typecho\Db::get(); $wpdb->posts = $wpdb->getPrefix() . 'contents'; $search = ''; // Added slashes screw with quote grouping when done early, so done later. $q['s'] = stripslashes($q['s']); if (empty($_GET['s']) && $this->is_main_query()) { $q['s'] = urldecode($q['s']); } // There are no line breaks in fields. $q['s'] = str_replace(array("\r", "\n"), '', $q['s']); $q['search_terms_count'] = 1; if (!empty($q['sentence'])) { $q['search_terms'] = array($q['s']); } else { if (preg_match_all('/".*?("|$)|((?<=[\t ",+])|^)[^\t ",+]+/', $q['s'], $matches)) { $q['search_terms_count'] = count($matches[0]); $q['search_terms'] = $this->parse_search_terms($matches[0]); // If the search string has only short terms or stopwords, or is 10+ terms long, match it as sentence. if (empty($q['search_terms']) || count($q['search_terms']) > 9) { $q['search_terms'] = array($q['s']); } } else { $q['search_terms'] = array($q['s']); } } $n = !empty($q['exact']) ? '' : '%'; $searchand = ''; $q['search_orderby_title'] = array(); /** * Filters the prefix that indicates that a search term should be excluded from results. * * @param string $exclusion_prefix The prefix. Default '-'. Returning * an empty value disables exclusions. * @since 4.7.0 * */ $exclusion_prefix = apply_filters('wp_query_search_exclusion_prefix', '-'); foreach ($q['search_terms'] as $term) { // If there is an $exclusion_prefix, terms prefixed with it should be excluded. $exclude = $exclusion_prefix && (substr($term, 0, 1) === $exclusion_prefix); if ($exclude) { $like_op = 'NOT LIKE'; $andor_op = 'AND'; $term = substr($term, 1); } else { $like_op = 'LIKE'; $andor_op = 'OR'; } if ($n && !$exclude) { $like = '%' . esc_like($term) . '%'; $q['search_orderby_title'][] = "{$wpdb->posts}.title LIKE '$like'"; } $like = $n . esc_like($term) . $n; $search .= sprintf("{$searchand}({$wpdb->posts}.title $like_op '%s' $andor_op {$wpdb->posts}.text $like_op '%s')", $like, $like); $searchand = ' AND '; } if (!empty($search)) { $search = " AND ({$search}) "; if (!is_user_logged_in()) { $search .= " AND ({$wpdb->posts}.post_password = '') "; } } return $search; } /** * Check if the terms are suitable for searching. * * Uses an array of stopwords (terms) that are excluded from the separate * term matching when searching for posts. The list of English stopwords is * the approximate search engines list, and is translatable. * * @param string[] $terms Array of terms to check. * @return string[] Terms that are not stopwords. * @since 3.7.0 * */ protected function parse_search_terms($terms) { $strtolower = function_exists('mb_strtolower') ? 'mb_strtolower' : 'strtolower'; $checked = array(); $stopwords = $this->get_search_stopwords(); foreach ($terms as $term) { // Keep before/after spaces when term is for exact match. if (preg_match('/^".+"$/', $term)) { $term = trim($term, "\"'"); } else { $term = trim($term, "\"' "); } // Avoid single A-Z and single dashes. if (!$term || (1 === strlen($term) && preg_match('/^[a-z\-]$/i', $term))) { continue; } if (in_array(call_user_func($strtolower, $term), $stopwords, true)) { continue; } $checked[] = $term; } return $checked; } /** * Retrieve stopwords used when parsing search terms. * * @return string[] Stopwords. * @since 3.7.0 * */ protected function get_search_stopwords() { if (isset($this->stopwords)) { return $this->stopwords; } /* * translators: This is a comma-separated list of very common words that should be excluded from a search, * like a, an, and the. These are usually called "stopwords". You should not simply translate these individual * words into your language. Instead, look for and provide commonly accepted stopwords in your language. */ $words = explode( ',', _x( 'about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www', 'Comma-separated list of search stopwords in your language' ) ); $stopwords = array(); foreach ($words as $word) { $word = trim($word, "\r\n\t "); if ($word) { $stopwords[] = $word; } } /** * Filters stopwords used when parsing search terms. * * @param string[] $stopwords Array of stopwords. * @since 3.7.0 * */ $this->stopwords = apply_filters('wp_search_stopwords', $stopwords); return $this->stopwords; } /** * Generates SQL for the ORDER BY condition based on passed search terms. * * @param array $q Query variables. * @return string ORDER BY clause. * @since 3.7.0 * * @global wpdb $wpdb WordPress database abstraction object. * */ protected function parse_search_order(&$q) { $wpdb = \Typecho\Db::get(); if ($q['search_terms_count'] > 1) { $num_terms = count($q['search_orderby_title']); // If the search terms contain negative queries, don't bother ordering by sentence matches. $like = ''; if (!preg_match('/(?:\s|^)\-/', $q['s'])) { $like = '%' . esc_like($q['s']) . '%'; } $search_orderby = ''; // Sentence match in 'title'. if ($like) { $search_orderby .= sprintf("WHEN {$wpdb->posts}.title LIKE %s THEN 1 ", $like); } // Sanity limit, sort as sentence when more than 6 terms // (few searches are longer than 6 terms and most titles are not). if ($num_terms < 7) { // All words in title. $search_orderby .= 'WHEN ' . implode(' AND ', $q['search_orderby_title']) . ' THEN 2 '; // Any word in title, not needed when $num_terms == 1. if ($num_terms > 1) { $search_orderby .= 'WHEN ' . implode(' OR ', $q['search_orderby_title']) . ' THEN 3 '; } } // Sentence match in 'text' and 'post_excerpt'. if ($like) { $search_orderby .= sprintf("WHEN {$wpdb->posts}.text LIKE %s THEN 5 ", $like); } if ($search_orderby) { $search_orderby = '(CASE ' . $search_orderby . 'ELSE 6 END)'; } } else { // Single word or sentence search. $search_orderby = reset($q['search_orderby_title']) . ' DESC'; } return $search_orderby; } /** * Converts the given orderby alias (if allowed) to a properly-prefixed value. * * @param string $orderby Alias for the field to order by. * @return string|false Table-prefixed value to used in the ORDER clause. False otherwise. * @since 4.0.0 * * @global wpdb $wpdb WordPress database abstraction object. * */ protected function parse_orderby($orderby) { global $wpdb; // Used to filter values. $allowed_keys = array( 'post_name', 'post_author', 'post_date', 'title', 'post_modified', 'post_parent', 'post_type', 'name', 'author', 'date', 'title', 'modified', 'parent', 'type', 'ID', 'menu_order', 'comment_count', 'rand', 'post__in', 'post_parent__in', 'post_name__in', ); $primary_meta_key = ''; $primary_meta_query = false; $meta_clauses = $this->meta_query->get_clauses(); if (!empty($meta_clauses)) { $primary_meta_query = reset($meta_clauses); if (!empty($primary_meta_query['key'])) { $primary_meta_key = $primary_meta_query['key']; $allowed_keys[] = $primary_meta_key; } $allowed_keys[] = 'meta_value'; $allowed_keys[] = 'meta_value_num'; $allowed_keys = array_merge($allowed_keys, array_keys($meta_clauses)); } // If RAND() contains a seed value, sanitize and add to allowed keys. $rand_with_seed = false; if (preg_match('/RAND\(([0-9]+)\)/i', $orderby, $matches)) { $orderby = sprintf('RAND(%s)', (int)$matches[1]); $allowed_keys[] = $orderby; $rand_with_seed = true; } if (!in_array($orderby, $allowed_keys, true)) { return false; } $orderby_clause = ''; switch ($orderby) { case 'post_name': case 'post_author': case 'post_date': case 'title': case 'post_modified': case 'post_parent': case 'post_type': case 'ID': case 'menu_order': case 'comment_count': $orderby_clause = "{$wpdb->posts}.{$orderby}"; break; case 'rand': $orderby_clause = 'RAND()'; break; case $primary_meta_key: case 'meta_value': if (!empty($primary_meta_query['type'])) { $orderby_clause = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})"; } else { $orderby_clause = "{$primary_meta_query['alias']}.meta_value"; } break; case 'meta_value_num': $orderby_clause = "{$primary_meta_query['alias']}.meta_value+0"; break; case 'post__in': if (!empty($this->query_vars['post__in'])) { $orderby_clause = "FIELD({$wpdb->posts}.ID," . implode(',', array_map('absint', $this->query_vars['post__in'])) . ')'; } break; case 'post_parent__in': if (!empty($this->query_vars['post_parent__in'])) { $orderby_clause = "FIELD( {$wpdb->posts}.post_parent," . implode(', ', array_map('absint', $this->query_vars['post_parent__in'])) . ' )'; } break; case 'post_name__in': if (!empty($this->query_vars['post_name__in'])) { $post_name__in = array_map('sanitize_title_for_query', $this->query_vars['post_name__in']); $post_name__in_string = "'" . implode("','", $post_name__in) . "'"; $orderby_clause = "FIELD( {$wpdb->posts}.post_name," . $post_name__in_string . ' )'; } break; default: if (array_key_exists($orderby, $meta_clauses)) { // $orderby corresponds to a meta_query clause. $meta_clause = $meta_clauses[$orderby]; $orderby_clause = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})"; } elseif ($rand_with_seed) { $orderby_clause = $orderby; } else { // Default: order by post field. $orderby_clause = "{$wpdb->posts}.post_" . sanitize_key($orderby); } break; } return $orderby_clause; } /** * Parse an 'order' query variable and cast it to ASC or DESC as necessary. * * @param string $order The 'order' query variable. * @return string The sanitized 'order' query variable. * @since 4.0.0 * */ protected function parse_order($order) { if (!is_string($order) || empty($order)) { return 'DESC'; } if ('ASC' === strtoupper($order)) { return 'ASC'; } else { return 'DESC'; } } /** * Sets the 404 property and saves whether query is feed. * * @since 2.0.0 */ public function set_404() { $is_feed = $this->is_feed; $this->init_query_flags(); $this->is_404 = true; $this->is_feed = $is_feed; /** * Fires after a 404 is triggered. * * @param WP_Query $query The WP_Query instance (passed by reference). * @since 5.5.0 * */ // do_action_ref_array( 'set_404', array( $this ) ); } /** * Retrieves the value of a query variable. * * @param string $query_var Query variable key. * @param mixed $default Optional. Value to return if the query variable is not set. Default empty string. * @return mixed Contents of the query variable. * @since 3.9.0 The `$default` argument was introduced. * * @since 1.5.0 */ public function get($query_var, $default = '') { if (isset($this->query_vars[$query_var])) { return $this->query_vars[$query_var]; } return $default; } /** * Sets the value of a query variable. * * @param string $query_var Query variable key. * @param mixed $value Query variable value. * @since 1.5.0 * */ public function set($query_var, $value) { $this->query_vars[$query_var] = $value; } /** * Retrieves an array of posts based on query variables. * * There are a few filters and actions that can be used to modify the post * database query. * * @return WP_Post[]|int[] Array of post objects or post IDs. * @global wpdb $wpdb WordPress database abstraction object. * * @since 1.5.0 * */ public function get_posts() { $wpdb = Typecho\Db::get(); $this->parse_query(); // Shorthand. $q = &$this->query_vars; // Fill again in case 'pre_get_posts' unset some vars. $q = $this->fill_query_vars($q); // Parse meta query. // $this->meta_query = new WP_Meta_Query(); // $this->meta_query->parse_query_vars( $q ); // Set a flag if a 'pre_get_posts' hook changed the query vars. $hash = md5(serialize($this->query_vars)); if ($hash != $this->query_vars_hash) { $this->query_vars_changed = true; $this->query_vars_hash = $hash; } unset($hash); // First let's clear some variables. $distinct = ''; $whichauthor = ''; $whichmimetype = ''; $where = ''; $limits = ''; $join = ''; $search = ''; $groupby = ''; $post_status_join = false; $page = 1; if (isset($q['caller_get_posts'])) { if (!isset($q['ignore_sticky_posts'])) { $q['ignore_sticky_posts'] = $q['caller_get_posts']; } } if (!isset($q['ignore_sticky_posts'])) { $q['ignore_sticky_posts'] = false; } if (!isset($q['suppress_filters'])) { $q['suppress_filters'] = false; } if (!isset($q['cache_results'])) { if (wp_using_ext_object_cache()) { $q['cache_results'] = false; } else { $q['cache_results'] = true; } } if (!isset($q['update_post_term_cache'])) { $q['update_post_term_cache'] = true; } if (!isset($q['lazy_load_term_meta'])) { $q['lazy_load_term_meta'] = $q['update_post_term_cache']; } if (!isset($q['update_post_meta_cache'])) { $q['update_post_meta_cache'] = true; } if (!isset($q['post_type'])) { if ($this->is_search) { $q['post_type'] = 'any'; } else { $q['post_type'] = ''; } } $post_type = $q['post_type']; if (empty($q['posts_per_page'])) { $q['posts_per_page'] = get_option('posts_per_page'); } if (isset($q['showposts']) && $q['showposts']) { $q['showposts'] = (int)$q['showposts']; $q['posts_per_page'] = $q['showposts']; } if ((isset($q['posts_per_archive_page']) && 0 != $q['posts_per_archive_page']) && ($this->is_archive || $this->is_search)) { $q['posts_per_page'] = $q['posts_per_archive_page']; } if (!isset($q['nopaging'])) { if (-1 == $q['posts_per_page']) { $q['nopaging'] = true; } else { $q['nopaging'] = false; } } if ($this->is_feed) { // This overrides 'posts_per_page'. if (!empty($q['posts_per_rss'])) { $q['posts_per_page'] = $q['posts_per_rss']; } else { $q['posts_per_page'] = get_option('posts_per_rss'); } $q['nopaging'] = false; } $q['posts_per_page'] = (int)$q['posts_per_page']; if ($q['posts_per_page'] < -1) { $q['posts_per_page'] = abs($q['posts_per_page']); } elseif (0 == $q['posts_per_page']) { $q['posts_per_page'] = 1; } if (!isset($q['comments_per_page']) || 0 == $q['comments_per_page']) { $q['comments_per_page'] = get_option('comments_per_page'); } if ($this->is_home && (empty($this->query) || 'true' === $q['preview']) && ('page' === get_option('show_on_front')) && get_option('page_on_front')) { $this->is_page = true; $this->is_home = false; $q['page_id'] = get_option('page_on_front'); } if (isset($q['page'])) { $q['page'] = trim($q['page'], '/'); $q['page'] = absint($q['page']); } // If true, forcibly turns off SQL_CALC_FOUND_ROWS even when limits are present. if (isset($q['no_found_rows'])) { $q['no_found_rows'] = (bool)$q['no_found_rows']; } else { $q['no_found_rows'] = false; } switch ($q['fields']) { case 'ids': $fields = "{$wpdb->getPrefix()}contents.ID"; break; // case 'id=>parent': // $fields = "{$db->getPrefix()}contents.ID, {$wpdb->posts}.post_parent"; // break; default: $fields = "{$wpdb->getPrefix()}contents.*"; } if ('' !== $q['menu_order']) { $where .= " AND {$wpdb->posts}.menu_order = " . $q['menu_order']; } // The "m" parameter is meant for months but accepts datetimes of varying specificity. if ($q['m']) { $where .= " AND YEAR({$wpdb->posts}.post_date)=" . substr($q['m'], 0, 4); if (strlen($q['m']) > 5) { $where .= " AND MONTH({$wpdb->posts}.post_date)=" . substr($q['m'], 4, 2); } if (strlen($q['m']) > 7) { $where .= " AND DAYOFMONTH({$wpdb->posts}.post_date)=" . substr($q['m'], 6, 2); } if (strlen($q['m']) > 9) { $where .= " AND HOUR({$wpdb->posts}.post_date)=" . substr($q['m'], 8, 2); } if (strlen($q['m']) > 11) { $where .= " AND MINUTE({$wpdb->posts}.post_date)=" . substr($q['m'], 10, 2); } if (strlen($q['m']) > 13) { $where .= " AND SECOND({$wpdb->posts}.post_date)=" . substr($q['m'], 12, 2); } } // Handle the other individual date parameters. $date_parameters = array(); if ('' !== $q['hour']) { $date_parameters['hour'] = $q['hour']; } if ('' !== $q['minute']) { $date_parameters['minute'] = $q['minute']; } if ('' !== $q['second']) { $date_parameters['second'] = $q['second']; } if ($q['year']) { $date_parameters['year'] = $q['year']; } if ($q['monthnum']) { $date_parameters['monthnum'] = $q['monthnum']; } if ($q['w']) { $date_parameters['week'] = $q['w']; } if ($q['day']) { $date_parameters['day'] = $q['day']; } if ($date_parameters) { $date_query = new WP_Date_Query(array($date_parameters)); $where .= $date_query->get_sql(); } unset($date_parameters, $date_query); // Handle complex date queries. if (!empty($q['date_query'])) { $this->date_query = new WP_Date_Query($q['date_query']); $where .= $this->date_query->get_sql(); } // If we've got a post_type AND it's not "any" post_type. if (!empty($q['post_type']) && 'any' !== $q['post_type']) { foreach ((array)$q['post_type'] as $_post_type) { $ptype_obj = get_post_type_object($_post_type); if (!$ptype_obj || !$ptype_obj->query_var || empty($q[$ptype_obj->query_var])) { continue; } if (!$ptype_obj->hierarchical) { // Non-hierarchical post types can directly use 'name'. $q['name'] = $q[$ptype_obj->query_var]; } else { // Hierarchical post types will operate through 'pagename'. $q['pagename'] = $q[$ptype_obj->query_var]; $q['name'] = ''; } // Only one request for a slug is possible, this is why name & pagename are overwritten above. break; } // End foreach. unset($ptype_obj); } if ('' !== $q['title']) { $where .= sprintf(" AND {$wpdb->posts}.title = %s", stripslashes($q['title'])); } // Parameters related to 'post_name'. if ('' !== $q['name']) { // $q['name'] = sanitize_title_for_query( $q['name'] ); $where .= " AND {$wpdb->posts}.post_name = '" . $q['name'] . "'"; } elseif ('' !== $q['pagename']) { if (isset($this->queried_object_id)) { $reqpage = $this->queried_object_id; } else { if ('page' !== $q['post_type']) { foreach ((array)$q['post_type'] as $_post_type) { $ptype_obj = get_post_type_object($_post_type); if (!$ptype_obj || !$ptype_obj->hierarchical) { continue; } $reqpage = get_page_by_path($q['pagename'], OBJECT, $_post_type); if ($reqpage) { break; } } unset($ptype_obj); } else { $reqpage = get_page_by_path($q['pagename']); } if (!empty($reqpage)) { $reqpage = $reqpage->ID; } else { $reqpage = 0; } } $page_for_posts = get_option('page_for_posts'); if (('page' !== get_option('show_on_front')) || empty($page_for_posts) || ($reqpage != $page_for_posts)) { $q['pagename'] = sanitize_title_for_query(wp_basename($q['pagename'])); $q['name'] = $q['pagename']; $where .= " AND ({$wpdb->posts}.ID = '$reqpage')"; $reqpage_obj = get_post($reqpage); if (is_object($reqpage_obj) && 'attachment' === $reqpage_obj->post_type) { $this->is_attachment = true; $post_type = 'attachment'; $q['post_type'] = 'attachment'; $this->is_page = true; $q['attachment_id'] = $reqpage; } } } elseif ('' !== $q['attachment']) { $q['attachment'] = sanitize_title_for_query(wp_basename($q['attachment'])); $q['name'] = $q['attachment']; $where .= " AND {$wpdb->posts}.post_name = '" . $q['attachment'] . "'"; } elseif (is_array($q['post_name__in']) && !empty($q['post_name__in'])) { $q['post_name__in'] = array_map('sanitize_title_for_query', $q['post_name__in']); $post_name__in = "'" . implode("','", $q['post_name__in']) . "'"; $where .= " AND {$wpdb->posts}.post_name IN ($post_name__in)"; } // If an attachment is requested by number, let it supersede any post number. if ($q['attachment_id']) { $q['p'] = absint($q['attachment_id']); } // If a post number is specified, load that post. if ($q['p']) { $where .= " AND {$wpdb->posts}.ID = " . $q['p']; } elseif ($q['post__in']) { $post__in = implode(',', array_map('absint', $q['post__in'])); $where .= " AND {$wpdb->posts}.ID IN ($post__in)"; } elseif ($q['post__not_in']) { $post__not_in = implode(',', array_map('absint', $q['post__not_in'])); $where .= " AND {$wpdb->posts}.ID NOT IN ($post__not_in)"; } if (is_numeric($q['post_parent'])) { $where .= sprintf(" AND {$wpdb->posts}.post_parent = %d ", $q['post_parent']); } elseif ($q['post_parent__in']) { $post_parent__in = implode(',', array_map('absint', $q['post_parent__in'])); $where .= " AND {$wpdb->posts}.post_parent IN ($post_parent__in)"; } elseif ($q['post_parent__not_in']) { $post_parent__not_in = implode(',', array_map('absint', $q['post_parent__not_in'])); $where .= " AND {$wpdb->posts}.post_parent NOT IN ($post_parent__not_in)"; } if ($q['page_id']) { if (('page' !== get_option('show_on_front')) || (get_option('page_for_posts') != $q['page_id'])) { $q['p'] = $q['page_id']; $where = " AND {$wpdb->posts}.ID = " . $q['page_id']; } } // If a search pattern is specified, load the posts that match. if (strlen($q['s'])) { $search = $this->parse_search($q); } // Author/user stuff. if (!empty($q['author']) && '0' != $q['author']) { $q['author'] = addslashes_gpc('' . urldecode($q['author'])); $authors = array_unique(array_map('intval', preg_split('/[,\s]+/', $q['author']))); foreach ($authors as $author) { $key = $author > 0 ? 'author__in' : 'author__not_in'; $q[$key][] = abs($author); } $q['author'] = implode(',', $authors); } if (!empty($q['author__not_in'])) { $author__not_in = implode(',', array_map('absint', array_unique((array)$q['author__not_in']))); $where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) "; } elseif (!empty($q['author__in'])) { $author__in = implode(',', array_map('absint', array_unique((array)$q['author__in']))); $where .= " AND {$wpdb->posts}.post_author IN ($author__in) "; } // Author stuff for nice URLs. if ('' !== $q['author_name']) { if (strpos($q['author_name'], '/') !== false) { $q['author_name'] = explode('/', $q['author_name']); if ($q['author_name'][count($q['author_name']) - 1]) { $q['author_name'] = $q['author_name'][count($q['author_name']) - 1]; // No trailing slash. } else { $q['author_name'] = $q['author_name'][count($q['author_name']) - 2]; // There was a trailing slash. } } $q['author_name'] = sanitize_title_for_query($q['author_name']); $q['author'] = get_user_by('slug', $q['author_name']); if ($q['author']) { $q['author'] = $q['author']->ID; } $whichauthor .= " AND ({$wpdb->posts}.post_author = " . absint($q['author']) . ')'; } // Matching by comment count. if (isset($q['comment_count'])) { // Numeric comment count is converted to array format. if (is_numeric($q['comment_count'])) { $q['comment_count'] = array( 'value' => (int)$q['comment_count'], ); } if (isset($q['comment_count']['value'])) { $q['comment_count'] = array_merge( array( 'compare' => '=', ), $q['comment_count'] ); // Fallback for invalid compare operators is '='. $compare_operators = array('=', '!=', '>', '>=', '<', '<='); if (!in_array($q['comment_count']['compare'], $compare_operators, true)) { $q['comment_count']['compare'] = '='; } $where .= sprintf(" AND {$wpdb->posts}.comment_count {$q['comment_count']['compare']} %d", $q['comment_count']['value']); } } // MIME-Type stuff for attachment browsing. // if ( isset( $q['post_mime_type'] ) && '' !== $q['post_mime_type'] ) { // $whichmimetype = wp_post_mime_type_where( $q['post_mime_type'], $wpdb->posts ); // } // $where .= $search . $whichauthor . $whichmimetype; if (!empty($this->meta_query->queries)) { $clauses = $this->meta_query->get_sql('post', $wpdb->posts, 'ID', $this); $join .= $clauses['join']; $where .= $clauses['where']; } $rand = (isset($q['orderby']) && 'rand' === $q['orderby']); if (!isset($q['order'])) { $q['order'] = $rand ? '' : 'DESC'; } else { $q['order'] = $rand ? '' : $this->parse_order($q['order']); } // These values of orderby should ignore the 'order' parameter. $force_asc = array('post__in', 'post_name__in', 'post_parent__in'); if (isset($q['orderby']) && in_array($q['orderby'], $force_asc, true)) { $q['order'] = ''; } // Order by. if (empty($q['orderby'])) { /* * Boolean false or empty array blanks out ORDER BY, * while leaving the value unset or otherwise empty sets the default. */ if (isset($q['orderby']) && (is_array($q['orderby']) || false === $q['orderby'])) { $orderby = ''; } else { $orderby = "{$wpdb->getPrefix()}contents.created " . $q['order']; } } elseif ('none' === $q['orderby']) { $orderby = ''; } else { $orderby_array = array(); if (is_array($q['orderby'])) { foreach ($q['orderby'] as $_orderby => $order) { $orderby = addslashes_gpc(urldecode($_orderby)); $parsed = $this->parse_orderby($orderby); if (!$parsed) { continue; } $orderby_array[] = $parsed . ' ' . $this->parse_order($order); } $orderby = implode(', ', $orderby_array); } else { $q['orderby'] = urldecode($q['orderby']); $q['orderby'] = addslashes_gpc($q['orderby']); foreach (explode(' ', $q['orderby']) as $i => $orderby) { $parsed = $this->parse_orderby($orderby); // Only allow certain values for safety. if (!$parsed) { continue; } $orderby_array[] = $parsed; } $orderby = implode(' ' . $q['order'] . ', ', $orderby_array); if (empty($orderby)) { $orderby = "{$wpdb->posts}.post_date " . $q['order']; } elseif (!empty($q['order'])) { $orderby .= " {$q['order']}"; } } } // // Order search results by relevance only when another "orderby" is not specified in the query. // if ( ! empty( $q['s'] ) ) { // $search_orderby = ''; // if ( ! empty( $q['search_orderby_title'] ) && ( empty( $q['orderby'] ) && ! $this->is_feed ) || ( isset( $q['orderby'] ) && 'relevance' === $q['orderby'] ) ) { // $search_orderby = $this->parse_search_order( $q ); // } // // if ( ! $q['suppress_filters'] ) { // /** // * Filters the ORDER BY used when ordering search results. // * // * @since 3.7.0 // * // * @param string $search_orderby The ORDER BY clause. // * @param WP_Query $query The current WP_Query instance. // */ // $search_orderby = apply_filters( 'posts_search_orderby', $search_orderby, $this ); // } // if ( $search_orderby ) { // $orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby; // } // } if (is_array($post_type) && count($post_type) > 1) { $post_type_cap = 'multiple_post_type'; } else { if (is_array($post_type)) { $post_type = reset($post_type); } $post_type_object = get_post_type_object($post_type); if (empty($post_type_object)) { $post_type_cap = $post_type; } } if (isset($q['post_password'])) { $where .= sprintf(" AND {$wpdb->posts}.post_password = %s", $q['post_password']); if (empty($q['perm'])) { $q['perm'] = 'readable'; } } elseif (isset($q['has_password'])) { $where .= sprintf(" AND {$wpdb->posts}.post_password %s ''", $q['has_password'] ? '!=' : '='); } if (!empty($q['comment_status'])) { $where .= sprintf(" AND {$wpdb->posts}.comment_status = %s ", $q['comment_status']); } if (!empty($q['ping_status'])) { $where .= sprintf(" AND {$wpdb->posts}.ping_status = %s ", $q['ping_status']); } $skip_post_status = false; if ('any' === $post_type) { $in_search_post_types = get_post_types(array('exclude_from_search' => false)); if (empty($in_search_post_types)) { $post_type_where = ' AND 1=0 '; $skip_post_status = true; } else { $post_type_where = " AND {$wpdb->posts}.post_type IN ('" . implode("', '", array_map('esc_sql', $in_search_post_types)) . "')"; } } elseif (!empty($post_type) && is_array($post_type)) { $post_type_where = " AND {$wpdb->posts}.post_type IN ('" . implode("', '", esc_sql($post_type)) . "')"; } elseif (!empty($post_type)) { $post_type_where = sprintf(" AND {$wpdb->getPrefix()}contents.post_type = '%s'", $post_type); $post_type_object = get_post_type_object($post_type); } elseif ($this->is_attachment) { $post_type_where = " AND {$wpdb->posts}.post_type = 'attachment'"; $post_type_object = get_post_type_object('attachment'); } elseif ($this->is_page) { $post_type_where = " AND {$wpdb->posts}.post_type = 'page'"; $post_type_object = get_post_type_object('page'); } else { $post_type_where = " AND {$wpdb->posts}.post_type = 'post'"; $post_type_object = get_post_type_object('post'); } $edit_cap = 'edit_post'; $read_cap = 'read_post'; if (!empty($post_type_object)) { $edit_others_cap = $post_type_object->cap->edit_others_posts; $read_private_cap = $post_type_object->cap->read_private_posts; } else { $edit_others_cap = 'edit_others_' . $post_type_cap . 's'; $read_private_cap = 'read_private_' . $post_type_cap . 's'; } $user_id = get_current_user_id(); $q_status = array(); if ($skip_post_status) { $where .= $post_type_where; } elseif (!empty($q['status'])) { $where .= $post_type_where; $statuswheres = array(); $q_status = $q['status']; if (!is_array($q_status)) { $q_status = explode(',', $q_status); } $r_status = array(); $p_status = array(); $e_status = array(); if (in_array('any', $q_status, true)) { foreach (get_post_stati(array('exclude_from_search' => true)) as $status) { if (!in_array($status, $q_status, true)) { $e_status[] = "{$wpdb->getPrefix()}contents.status <> '$status'"; } } } else { foreach (get_post_stati() as $status) { if (in_array($status, $q_status, true)) { if ('private' === $status) { $p_status[] = "{$wpdb->getPrefix()}contents.status = '$status'"; } else { $r_status[] = "{$wpdb->getPrefix()}contents.status = '$status'"; } } } } if (empty($q['perm']) || 'readable' !== $q['perm']) { $r_status = array_merge($r_status, $p_status); unset($p_status); } if (!empty($e_status)) { $statuswheres[] = '(' . implode(' AND ', $e_status) . ')'; } if (!empty($r_status)) { if (!empty($q['perm']) && 'editable' === $q['perm'] && !current_user_can($edit_others_cap)) { $statuswheres[] = "({$wpdb->posts}.post_author = $user_id " . 'AND (' . implode(' OR ', $r_status) . '))'; } else { $statuswheres[] = '(' . implode(' OR ', $r_status) . ')'; } } if (!empty($p_status)) { if (!empty($q['perm']) && 'readable' === $q['perm'] && !current_user_can($read_private_cap)) { $statuswheres[] = "({$wpdb->posts}.post_author = $user_id " . 'AND (' . implode(' OR ', $p_status) . '))'; } else { $statuswheres[] = '(' . implode(' OR ', $p_status) . ')'; } } if ($post_status_join) { $join .= " LEFT JOIN {$wpdb->posts} AS p2 ON ({$wpdb->posts}.post_parent = p2.ID) "; foreach ($statuswheres as $index => $statuswhere) { $statuswheres[$index] = "($statuswhere OR ({$wpdb->getPrefix()}contents.status = 'inherit' AND " . str_replace($wpdb->posts, 'p2', $statuswhere) . '))'; } } $where_status = implode(' OR ', $statuswheres); if (!empty($where_status)) { $where .= " AND ($where_status)"; } } elseif (!$this->is_singular) { if ('any' === $post_type) { $queried_post_types = get_post_types(array('exclude_from_search' => false)); } elseif (is_array($post_type)) { $queried_post_types = $post_type; } elseif (!empty($post_type)) { $queried_post_types = array($post_type); } else { $queried_post_types = array('post'); } if (!empty($queried_post_types)) { $status_type_clauses = array(); foreach ($queried_post_types as $queried_post_type) { $queried_post_type_object = get_post_type_object($queried_post_type); $type_where = '(' . "{$wpdb->getPrefix()}contents.post_type = '$queried_post_type' AND ("; // Public statuses. $public_statuses = get_post_stati(array('public' => true)); $status_clauses = array(); foreach ($public_statuses as $public_status) { $status_clauses[] = "{$wpdb->getPrefix()}contents.status = '$public_status'"; } $type_where .= implode(' OR ', $status_clauses); // // Add protected states that should show in the admin all list. // if ( $this->is_admin ) { // $admin_all_statuses = get_post_stati( // array( // 'protected' => true, // 'show_in_admin_all_list' => true, // ) // ); // foreach ( $admin_all_statuses as $admin_all_status ) { // $type_where .= " OR {$wpdb->getPrefix()}contents.status = '$admin_all_status'"; // } // } // Add private states that are visible to current user. if (is_user_logged_in() && $queried_post_type_object instanceof WP_Post_Type) { $read_private_cap = $queried_post_type_object->cap->read_private_posts; $private_statuses = get_post_stati(array('private' => true)); foreach ($private_statuses as $private_status) { $type_where .= current_user_can($read_private_cap) ? " \nOR {$wpdb->posts}.status = '$private_status'" : " \nOR ({$wpdb->posts}.post_author = $user_id AND {$wpdb->posts}.status = '$private_status')"; } } $type_where .= '))'; $status_type_clauses[] = $type_where; } if (!empty($status_type_clauses)) { $where .= ' AND (' . implode(' OR ', $status_type_clauses) . ')'; } } else { $where .= ' AND 1=0 '; } } else { $where .= $post_type_where; } $where .= $search; // Paging. if (empty($q['nopaging']) && !$this->is_singular) { $page = absint($q['paged']); if (!$page) { $page = 1; } // If 'offset' is provided, it takes precedence over 'paged'. if (isset($q['offset']) && is_numeric($q['offset'])) { $q['offset'] = absint($q['offset']); $pgstrt = $q['offset'] . ', '; } else { $pgstrt = absint(($page - 1) * $q['posts_per_page']) . ', '; } $limits = 'LIMIT ' . $pgstrt . $q['posts_per_page']; } // // Comments feeds. // if ( $this->is_comment_feed && ! $this->is_singular ) { // if ( $this->is_archive || $this->is_search ) { // $cjoin = "JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID ) $join "; // $cwhere = "WHERE comment_approved = '1' $where"; // $cgroupby = "{$wpdb->comments}.comment_id"; // } else { // Other non-singular, e.g. front. // $cjoin = "JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID )"; // $cwhere = "WHERE ( status = 'publish' OR ( status = 'inherit' AND post_type = 'attachment' ) ) AND comment_approved = '1'"; // $cgroupby = ''; // } // // // $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : ''; // $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : ''; // $climits = ( ! empty( $climits ) ) ? $climits : ''; // // $comments = (array) $wpdb->get_results( "SELECT $distinct {$wpdb->comments}.* FROM {$wpdb->comments} $cjoin $cwhere $cgroupby $corderby $climits" ); // // Convert to WP_Comment. // /** @var WP_Comment[] */ // $this->comments = array_map( 'get_comment', $comments ); // $this->comment_count = count( $this->comments ); // // $post_ids = array(); // // foreach ( $this->comments as $comment ) { // $post_ids[] = (int) $comment->comment_post_ID; // } // // $post_ids = implode( ',', $post_ids ); // $join = ''; // if ( $post_ids ) { // $where = "AND {$wpdb->posts}.ID IN ($post_ids) "; // } else { // $where = 'AND 0'; // } // } $pieces = array('where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits'); if (!empty($groupby)) { $groupby = 'GROUP BY ' . $groupby; } if (!empty($orderby)) { $orderby = 'ORDER BY ' . $orderby; } $found_rows = ''; if (!$q['no_found_rows'] && !empty($limits)) { $found_rows = 'SQL_CALC_FOUND_ROWS'; } $old_request = "SELECT $found_rows $distinct $fields FROM {$wpdb->getPrefix()}contents $join WHERE 1=1 $where $groupby $orderby $limits"; $old_request = str_replace('post_type', 'type', $old_request); $this->request = $old_request; if ('ids' === $q['fields']) { if (null === $this->posts) { $this->posts = $wpdb->get_col($this->request); } /** @var int[] */ $this->posts = array_map('intval', $this->posts); $this->post_count = count($this->posts); $this->set_found_posts($q, $limits); return $this->posts; } if ('id=>parent' === $q['fields']) { if (null === $this->posts) { $this->posts = $wpdb->get_results($this->request); } $this->post_count = count($this->posts); $this->set_found_posts($q, $limits); /** @var int[] */ $r = array(); foreach ($this->posts as $key => $post) { $this->posts[$key]->ID = (int)$post->ID; $this->posts[$key]->post_parent = (int)$post->post_parent; $r[(int)$post->ID] = (int)$post->post_parent; } return $r; } if (null === $this->posts) { $split_the_query = ($old_request == $this->request && "{$wpdb->getPrefix()}contents.*" === $fields && !empty($limits) && $q['posts_per_page'] < 500); /** * Filters whether to split the query. * * Splitting the query will cause it to fetch just the IDs of the found posts * (and then individually fetch each post by ID), rather than fetching every * complete row at once. One massive result vs. many small results. * * @param bool $split_the_query Whether or not to split the query. * @param WP_Query $query The WP_Query instance. * @since 3.4.0 * */ $split_the_query = apply_filters('split_the_query', $split_the_query, $this); if ($split_the_query) { // First get the IDs and then fill in the objects. $this->request = "SELECT {$wpdb->getPrefix()}contents.cid FROM {$wpdb->getPrefix()}contents WHERE 1=1 $where $groupby $orderby"; //echo "SELECT $found_rows $distinct {$wpdb->getPrefix()}contents.cid FROM {$wpdb->getPrefix()}contents WHERE 1=1 $where $groupby $orderby $limits"; /** * Filters the Post IDs SQL request before sending. * * @param string $request The post ID request. * @param WP_Query $query The WP_Query instance. * @since 3.4.0 * */ $this->request = apply_filters('posts_request_ids', $this->request, $this); $this->request = str_replace('post_type', 'type', $this->request); $ids = $wpdb->fetchAll($this->request); $ids = array_column($ids, 'cid'); if ($ids) { $this->posts = $ids; $this->set_found_posts($q, $limits); // _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); } else { $this->posts = array(); } } else { $this->request = str_replace('post_type', 'type', $this->request); $this->posts = $wpdb->fetchAll($this->request); $this->set_found_posts($q, $limits); } } // Convert to WP_Post objects. if ($this->posts) { /** @var WP_Post[] */ $this->posts = array_map('get_post', $this->posts); } // Check post status to determine if post should be displayed. if (!empty($this->posts) && ($this->is_single || $this->is_page)) { $status = get_post_status($this->posts[0]); if ('attachment' === $this->posts[0]->post_type && 0 === (int)$this->posts[0]->post_parent) { $this->is_page = false; $this->is_single = true; $this->is_attachment = true; } // If the status was specifically requested, let it pass through. if (!in_array($status, $q_status, true)) { $post_status_obj = get_post_status_object($status); if ($post_status_obj && !$post_status_obj->public) { if (!is_user_logged_in()) { // User must be logged in to view unpublished posts. $this->posts = array(); } else { if ($post_status_obj->protected) { // User must have edit permissions on the draft to preview. if (!current_user_can($edit_cap, $this->posts[0]->ID)) { $this->posts = array(); } else { $this->is_preview = true; if ('future' !== $status) { $this->posts[0]->post_date = current_time('mysql'); } } } elseif ($post_status_obj->private) { if (!current_user_can($read_cap, $this->posts[0]->ID)) { $this->posts = array(); } } else { $this->posts = array(); } } } elseif (!$post_status_obj) { // Post status is not registered, assume it's not public. if (!current_user_can($edit_cap, $this->posts[0]->ID)) { $this->posts = array(); } } } } // Put sticky posts at the top of the posts array. $sticky_posts = get_option('sticky_posts'); if ($this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['ignore_sticky_posts']) { $num_posts = count($this->posts); $sticky_offset = 0; // Loop over posts and relocate stickies to the front. for ($i = 0; $i < $num_posts; $i++) { if (in_array($this->posts[$i]->ID, $sticky_posts, true)) { $sticky_post = $this->posts[$i]; // Remove sticky from current position. array_splice($this->posts, $i, 1); // Move to front, after other stickies. array_splice($this->posts, $sticky_offset, 0, array($sticky_post)); // Increment the sticky offset. The next sticky will be placed at this offset. $sticky_offset++; // Remove post from sticky posts array. $offset = array_search($sticky_post->ID, $sticky_posts, true); unset($sticky_posts[$offset]); } } // If any posts have been excluded specifically, Ignore those that are sticky. if (!empty($sticky_posts) && !empty($q['post__not_in'])) { $sticky_posts = array_diff($sticky_posts, $q['post__not_in']); } // Fetch sticky posts that weren't in the query results. if (!empty($sticky_posts)) { $stickies = get_posts( array( 'post__in' => $sticky_posts, 'post_type' => $post_type, 'status' => 'publish', 'nopaging' => true, ) ); foreach ($stickies as $sticky_post) { array_splice($this->posts, $sticky_offset, 0, array($sticky_post)); $sticky_offset++; } } } // If comments have been fetched as part of the query, make sure comment meta lazy-loading is set up. if (!empty($this->comments)) { wp_queue_comments_for_comment_meta_lazyload($this->comments); } // Ensure that any posts added/modified via one of the filters above are // of the type WP_Post and are filtered. if ($this->posts) { $this->post_count = count($this->posts); /** @var WP_Post[] */ $this->posts = array_map('get_post', $this->posts); if ($q['cache_results']) { // todo: add cache // update_post_caches( $this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); } /** @var WP_Post */ $this->post = reset($this->posts); } else { $this->post_count = 0; $this->posts = array(); } if ($q['lazy_load_term_meta']) { // tudo: add cache // wp_queue_posts_for_term_meta_lazyload( $this->posts ); } // fix: typecho cid return $this->posts; } /** * Set up the amount of found posts and the number of pages (if limit clause was used) * for the current query. * * @param array $q Query variables. * @param string $limits LIMIT clauses of the query. * @since 3.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * */ private function set_found_posts($q, $limits) { global $wpdb; // Bail if posts is an empty array. Continue if posts is an empty string, // null, or false to accommodate caching plugins that fill posts later. if ($q['no_found_rows'] || (is_array($this->posts) && !$this->posts)) { return; } if (!empty($limits)) { /** * Filters the query to run for retrieving the found posts. * * @param string $found_posts_query The query to run to find the found posts. * @param WP_Query $query The WP_Query instance (passed by reference). * @since 2.1.0 * */ // $found_posts_query = apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) ); // $this->found_posts = (int) $wpdb->get_var( $found_posts_query ); } else { if (is_array($this->posts)) { $this->found_posts = count($this->posts); } else { if (null === $this->posts) { $this->found_posts = 0; } else { $this->found_posts = 1; } } } /** * Filters the number of found posts for the query. * * @param int $found_posts The number of posts found. * @param WP_Query $query The WP_Query instance (passed by reference). * @since 2.1.0 * */ // $this->found_posts = (int) apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) ); if (!empty($limits)) { $this->max_num_pages = ceil($this->found_posts / $q['posts_per_page']); } } /** * Set up the next post and iterate current post index. * * @return WP_Post Next post. * @since 1.5.0 * */ public function next_post() { $this->current_post++; /** @var WP_Post */ $this->post = $this->posts[$this->current_post]; return $this->post; } /** * Sets up the current post. * * Retrieves the next post, sets up the post, sets the 'in the loop' * property to true. * * @since 1.5.0 * * @global WP_Post $post Global post object. */ public function the_post() { global $post; $this->in_the_loop = true; if (-1 == $this->current_post) { // Loop has just started. /** * Fires once the loop is started. * * @param WP_Query $query The WP_Query instance (passed by reference). * @since 2.0.0 * */ // do_action_ref_array( 'loop_start', array( &$this ) ); } $post = $this->next_post(); $this->setup_postdata($post); } /** * Determines whether there are more posts available in the loop. * * Calls the {@see 'loop_end'} action when the loop is complete. * * @return bool True if posts are available, false if end of the loop. * @since 1.5.0 * */ public function have_posts() { if ($this->current_post + 1 < $this->post_count) { return true; } elseif ($this->current_post + 1 == $this->post_count && $this->post_count > 0) { /** * Fires once the loop has ended. * * @param WP_Query $query The WP_Query instance (passed by reference). * @since 2.0.0 * */ // do_action_ref_array( 'loop_end', array( &$this ) ); // Do some cleaning up after the loop. $this->rewind_posts(); } elseif (0 === $this->post_count) { /** * Fires if no results are found in a post query. * * @param WP_Query $query The WP_Query instance. * @since 4.9.0 * */ // do_action( 'loop_no_results', $this ); } $this->in_the_loop = false; return false; } /** * Rewind the posts and reset post index. * * @since 1.5.0 */ public function rewind_posts() { $this->current_post = -1; if ($this->post_count > 0) { $this->post = $this->posts[0]; } } /** * Iterate current comment index and return WP_Comment object. * * @return WP_Comment Comment object. * @since 2.2.0 * */ public function next_comment() { $this->current_comment++; /** @var WP_Comment */ $this->comment = $this->comments[$this->current_comment]; return $this->comment; } /** * Sets up the current comment. * * @since 2.2.0 * * @global WP_Comment $comment Global comment object. */ public function the_comment() { global $comment; $comment = $this->next_comment(); if (0 == $this->current_comment) { /** * Fires once the comment loop is started. * * @since 2.2.0 */ do_action('comment_loop_start'); } } /** * Whether there are more comments available. * * Automatically rewinds comments when finished. * * @return bool True if comments are available, false if no more comments. * @since 2.2.0 * */ public function have_comments() { if ($this->current_comment + 1 < $this->comment_count) { return true; } elseif ($this->current_comment + 1 == $this->comment_count) { $this->rewind_comments(); } return false; } /** * Rewind the comments, resets the comment index and comment to first. * * @since 2.2.0 */ public function rewind_comments() { $this->current_comment = -1; if ($this->comment_count > 0) { $this->comment = $this->comments[0]; } } /** * Sets up the WordPress query by parsing query string. * * @param string|array $query URL query string or array of query arguments. * @return WP_Post[]|int[] Array of post objects or post IDs. * @since 1.5.0 * * @see WP_Query::parse_query() for all available arguments. * */ public function query($query) { $this->init(); $this->query = wp_parse_args($query); $this->query_vars = $this->query; return $this->get_posts(); } /** * Retrieves the currently queried object. * * If queried object is not set, then the queried object will be set from * the category, tag, taxonomy, posts page, single post, page, or author * query variable. After it is set up, it will be returned. * * @return WP_Term|WP_Post_Type|WP_Post|WP_User|null The queried object. * @since 1.5.0 * */ public function get_queried_object() { if (isset($this->queried_object)) { return $this->queried_object; } $this->queried_object = null; $this->queried_object_id = null; // todo return null; if ($this->is_category || $this->is_tag || $this->is_tax) { if ($this->is_category) { if ($this->get('cat')) { $term = get_term($this->get('cat'), 'category'); } elseif ($this->get('category_name')) { $term = get_term_by('slug', $this->get('category_name'), 'category'); } } elseif ($this->is_tag) { if ($this->get('tag_id')) { $term = get_term($this->get('tag_id'), 'tag'); } elseif ($this->get('tag')) { $term = get_term_by('slug', $this->get('tag'), 'tag'); } } else { // For other tax queries, grab the first term from the first clause. if (!empty($this->tax_query->queried_terms)) { $queried_taxonomies = array_keys($this->tax_query->queried_terms); $matched_taxonomy = reset($queried_taxonomies); $query = $this->tax_query->queried_terms[$matched_taxonomy]; if (!empty($query['terms'])) { if ('term_id' === $query['field']) { $term = get_term(reset($query['terms']), $matched_taxonomy); } else { $term = get_term_by($query['field'], reset($query['terms']), $matched_taxonomy); } } } } if (!empty($term) && !is_wp_error($term)) { $this->queried_object = $term; $this->queried_object_id = (int)$term->term_id; if ($this->is_category && 'category' === $this->queried_object->taxonomy) { _make_cat_compat($this->queried_object); } } } elseif ($this->is_post_type_archive) { $post_type = $this->get('post_type'); if (is_array($post_type)) { $post_type = reset($post_type); } $this->queried_object = get_post_type_object($post_type); } elseif ($this->is_posts_page) { $page_for_posts = get_option('page_for_posts'); $this->queried_object = get_post($page_for_posts); $this->queried_object_id = (int)$this->queried_object->ID; } elseif ($this->is_singular && !empty($this->post)) { $this->queried_object = $this->post; $this->queried_object_id = (int)$this->post->ID; } elseif ($this->is_author) { $this->queried_object_id = (int)$this->get('author'); $this->queried_object = get_userdata($this->queried_object_id); } return $this->queried_object; } /** * Retrieves the ID of the currently queried object. * * @return int * @since 1.5.0 * */ public function get_queried_object_id() { $this->get_queried_object(); if (isset($this->queried_object_id)) { return $this->queried_object_id; } return 0; } /** * Constructor. * * Sets up the WordPress query, if parameter is not empty. * * @param string|array $query URL query string or array of vars. * @see WP_Query::parse_query() for all available arguments. * * @since 1.5.0 * */ public function __construct($query = '') { if (!empty($query)) { $this->query($query); } } /** * Make private properties readable for backward compatibility. * * @param string $name Property to get. * @return mixed Property. * @since 4.0.0 * */ public function __get($name) { if (in_array($name, $this->compat_fields, true)) { return $this->$name; } } /** * Make private properties checkable for backward compatibility. * * @param string $name Property to check if set. * @return bool Whether the property is set. * @since 4.0.0 * */ public function __isset($name) { if (in_array($name, $this->compat_fields, true)) { return isset($this->$name); } } /** * Make private/protected methods readable for backward compatibility. * * @param string $name Method to call. * @param array $arguments Arguments to pass when calling. * @return mixed|false Return value of the callback, false otherwise. * @since 4.0.0 * */ public function __call($name, $arguments) { if (in_array($name, $this->compat_methods, true)) { return $this->$name(...$arguments); } return false; } /** * Is the query for an existing archive page? * * Archive pages include category, tag, author, date, custom post type, * and custom taxonomy based archives. * * @return bool Whether the query is for an existing archive page. * @see WP_Query::is_category() * @see WP_Query::is_tag() * @see WP_Query::is_author() * @see WP_Query::is_date() * @see WP_Query::is_post_type_archive() * @see WP_Query::is_tax() * * @since 3.1.0 * */ public function is_archive() { return (bool)$this->is_archive; } /** * Is the query for an existing post type archive page? * * @param string|string[] $post_types Optional. Post type or array of posts types * to check against. Default empty. * @return bool Whether the query is for an existing post type archive page. * @since 3.1.0 * */ public function is_post_type_archive($post_types = '') { if (empty($post_types) || !$this->is_post_type_archive) { return (bool)$this->is_post_type_archive; } $post_type = $this->get('post_type'); if (is_array($post_type)) { $post_type = reset($post_type); } $post_type_object = get_post_type_object($post_type); return in_array($post_type_object->name, (array)$post_types, true); } /** * Is the query for an existing attachment page? * * @param int|string|int[]|string[] $attachment Optional. Attachment ID, title, slug, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing attachment page. * @since 3.1.0 * */ public function is_attachment($attachment = '') { if (!$this->is_attachment) { return false; } if (empty($attachment)) { return true; } $attachment = array_map('strval', (array)$attachment); $post_obj = $this->get_queried_object(); if (in_array((string)$post_obj->ID, $attachment, true)) { return true; } elseif (in_array($post_obj->title, $attachment, true)) { return true; } elseif (in_array($post_obj->post_name, $attachment, true)) { return true; } return false; } /** * Is the query for an existing author archive page? * * If the $author parameter is specified, this function will additionally * check if the query is for one of the authors specified. * * @param int|string|int[]|string[] $author Optional. User ID, nickname, nicename, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing author archive page. * @since 3.1.0 * */ public function is_author($author = '') { if (!$this->is_author) { return false; } if (empty($author)) { return true; } $author_obj = $this->get_queried_object(); $author = array_map('strval', (array)$author); if (in_array((string)$author_obj->ID, $author, true)) { return true; } elseif (in_array($author_obj->nickname, $author, true)) { return true; } elseif (in_array($author_obj->user_nicename, $author, true)) { return true; } return false; } /** * Is the query for an existing category archive page? * * If the $category parameter is specified, this function will additionally * check if the query is for one of the categories specified. * * @param int|string|int[]|string[] $category Optional. Category ID, name, slug, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing category archive page. * @since 3.1.0 * */ public function is_category($category = '') { if (!$this->is_category) { return false; } if (empty($category)) { return true; } $cat_obj = $this->get_queried_object(); $category = array_map('strval', (array)$category); if (in_array((string)$cat_obj->term_id, $category, true)) { return true; } elseif (in_array($cat_obj->name, $category, true)) { return true; } elseif (in_array($cat_obj->slug, $category, true)) { return true; } return false; } /** * Is the query for an existing tag archive page? * * If the $tag parameter is specified, this function will additionally * check if the query is for one of the tags specified. * * @param int|string|int[]|string[] $tag Optional. Tag ID, name, slug, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing tag archive page. * @since 3.1.0 * */ public function is_tag($tag = '') { if (!$this->is_tag) { return false; } if (empty($tag)) { return true; } $tag_obj = $this->get_queried_object(); $tag = array_map('strval', (array)$tag); if (in_array((string)$tag_obj->term_id, $tag, true)) { return true; } elseif (in_array($tag_obj->name, $tag, true)) { return true; } elseif (in_array($tag_obj->slug, $tag, true)) { return true; } return false; } /** * Is the query for an existing custom taxonomy archive page? * * If the $taxonomy parameter is specified, this function will additionally * check if the query is for that specific $taxonomy. * * If the $term parameter is specified in addition to the $taxonomy parameter, * this function will additionally check if the query is for one of the terms * specified. * * @param string|string[] $taxonomy Optional. Taxonomy slug or slugs to check against. * Default empty. * @param int|string|int[]|string[] $term Optional. Term ID, name, slug, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing custom taxonomy archive page. * True for custom taxonomy archive pages, false for built-in taxonomies * (category and tag archives). * @global WP_Taxonomy[] $wp_taxonomies Registered taxonomies. * * @since 3.1.0 * */ public function is_tax($taxonomy = '', $term = '') { global $wp_taxonomies; if (!$this->is_tax) { return false; } if (empty($taxonomy)) { return true; } $queried_object = $this->get_queried_object(); $tax_array = array_intersect(array_keys($wp_taxonomies), (array)$taxonomy); $term_array = (array)$term; // Check that the taxonomy matches. if (!(isset($queried_object->taxonomy) && count($tax_array) && in_array($queried_object->taxonomy, $tax_array, true))) { return false; } // Only a taxonomy provided. if (empty($term)) { return true; } return isset($queried_object->term_id) && count( array_intersect( array($queried_object->term_id, $queried_object->name, $queried_object->slug), $term_array ) ); } /** * Whether the current URL is within the comments popup window. * * @return false Always returns false. * @deprecated 4.5.0 * * @since 3.1.0 */ public function is_comments_popup() { _deprecated_function(__FUNCTION__, '4.5.0'); return false; } /** * Is the query for an existing date archive? * * @return bool Whether the query is for an existing date archive. * @since 3.1.0 * */ public function is_date() { return (bool)$this->is_date; } /** * Is the query for an existing day archive? * * @return bool Whether the query is for an existing day archive. * @since 3.1.0 * */ public function is_day() { return (bool)$this->is_day; } /** * Is the query for a feed? * * @param string|string[] $feeds Optional. Feed type or array of feed types * to check against. Default empty. * @return bool Whether the query is for a feed. * @since 3.1.0 * */ public function is_feed($feeds = '') { if (empty($feeds) || !$this->is_feed) { return (bool)$this->is_feed; } $qv = $this->get('feed'); if ('feed' === $qv) { $qv = get_default_feed(); } return in_array($qv, (array)$feeds, true); } /** * Is the query for a comments feed? * * @return bool Whether the query is for a comments feed. * @since 3.1.0 * */ public function is_comment_feed() { return (bool)$this->is_comment_feed; } /** * Is the query for the front page of the site? * * This is for what is displayed at your site's main URL. * * Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_on_front'. * * If you set a static page for the front page of your site, this function will return * true when viewing that page. * * Otherwise the same as @return bool Whether the query is for the front page of the site. * @since 3.1.0 * * @see WP_Query::is_home() * */ public function is_front_page() { // Most likely case. if ('posts' === get_option('show_on_front') && $this->is_home()) { return true; } elseif ('page' === get_option('show_on_front') && get_option('page_on_front') && $this->is_page(get_option('page_on_front')) ) { return true; } else { return false; } } /** * Is the query for the blog homepage? * * This is the page which shows the time based blog content of your site. * * Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_for_posts'. * * If you set a static page for the front page of your site, this function will return * true only on the page you set as the "Posts page". * * @return bool Whether the query is for the blog homepage. * @see WP_Query::is_front_page() * * @since 3.1.0 * */ public function is_home() { return (bool)$this->is_home; } /** * Is the query for the Privacy Policy page? * * This is the page which shows the Privacy Policy content of your site. * * Depends on the site's "Change your Privacy Policy page" Privacy Settings 'wp_page_for_privacy_policy'. * * This function will return true only on the page you set as the "Privacy Policy page". * * @return bool Whether the query is for the Privacy Policy page. * @since 5.2.0 * */ public function is_privacy_policy() { if (get_option('wp_page_for_privacy_policy') && $this->is_page(get_option('wp_page_for_privacy_policy')) ) { return true; } else { return false; } } /** * Is the query for an existing month archive? * * @return bool Whether the query is for an existing month archive. * @since 3.1.0 * */ public function is_month() { return (bool)$this->is_month; } /** * Is the query for an existing single page? * * If the $page parameter is specified, this function will additionally * check if the query is for one of the pages specified. * * @param int|string|int[]|string[] $page Optional. Page ID, title, slug, path, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing single page. * @see WP_Query::is_singular() * * @since 3.1.0 * * @see WP_Query::is_single() */ public function is_page($page = '') { if (!$this->is_page) { return false; } if (empty($page)) { return true; } $page_obj = $this->get_queried_object(); $page = array_map('strval', (array)$page); if (in_array((string)$page_obj->ID, $page, true)) { return true; } elseif (in_array($page_obj->title, $page, true)) { return true; } elseif (in_array($page_obj->post_name, $page, true)) { return true; } else { foreach ($page as $pagepath) { if (!strpos($pagepath, '/')) { continue; } $pagepath_obj = get_page_by_path($pagepath); if ($pagepath_obj && ($pagepath_obj->ID == $page_obj->ID)) { return true; } } } return false; } /** * Is the query for a paged result and not for the first page? * * @return bool Whether the query is for a paged result. * @since 3.1.0 * */ public function is_paged() { return (bool)$this->is_paged; } /** * Is the query for a post or page preview? * * @return bool Whether the query is for a post or page preview. * @since 3.1.0 * */ public function is_preview() { return (bool)$this->is_preview; } /** * Is the query for the robots.txt file? * * @return bool Whether the query is for the robots.txt file. * @since 3.1.0 * */ public function is_robots() { return (bool)$this->is_robots; } /** * Is the query for the favicon.ico file? * * @return bool Whether the query is for the favicon.ico file. * @since 5.4.0 * */ public function is_favicon() { return (bool)$this->is_favicon; } /** * Is the query for a search? * * @return bool Whether the query is for a search. * @since 3.1.0 * */ public function is_search() { return (bool)$this->is_search; } /** * Is the query for an existing single post? * * Works for any post type excluding pages. * * If the $post parameter is specified, this function will additionally * check if the query is for one of the Posts specified. * * @param int|string|int[]|string[] $post Optional. Post ID, title, slug, path, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing single post. * @see WP_Query::is_singular() * * @since 3.1.0 * * @see WP_Query::is_page() */ public function is_single($post = '') { if (!$this->is_single) { return false; } if (empty($post)) { return true; } $post_obj = $this->get_queried_object(); $post = array_map('strval', (array)$post); if (in_array((string)$post_obj->ID, $post, true)) { return true; } elseif (in_array($post_obj->title, $post, true)) { return true; } elseif (in_array($post_obj->post_name, $post, true)) { return true; } else { foreach ($post as $postpath) { if (!strpos($postpath, '/')) { continue; } $postpath_obj = get_page_by_path($postpath, OBJECT, $post_obj->post_type); if ($postpath_obj && ($postpath_obj->ID == $post_obj->ID)) { return true; } } } return false; } /** * Is the query for an existing single post of any post type (post, attachment, page, * custom post types)? * * If the $post_types parameter is specified, this function will additionally * check if the query is for one of the Posts Types specified. * * @param string|string[] $post_types Optional. Post type or array of post types * to check against. Default empty. * @return bool Whether the query is for an existing single post * or any of the given post types. * @see WP_Query::is_single() * * @since 3.1.0 * * @see WP_Query::is_page() */ public function is_singular($post_types = '') { if (empty($post_types) || !$this->is_singular) { return (bool)$this->is_singular; } $post_obj = $this->get_queried_object(); return in_array($post_obj->post_type, (array)$post_types, true); } /** * Is the query for a specific time? * * @return bool Whether the query is for a specific time. * @since 3.1.0 * */ public function is_time() { return (bool)$this->is_time; } /** * Is the query for a trackback endpoint call? * * @return bool Whether the query is for a trackback endpoint call. * @since 3.1.0 * */ public function is_trackback() { return (bool)$this->is_trackback; } /** * Is the query for an existing year archive? * * @return bool Whether the query is for an existing year archive. * @since 3.1.0 * */ public function is_year() { return (bool)$this->is_year; } /** * Is the query a 404 (returns no results)? * * @return bool Whether the query is a 404 error. * @since 3.1.0 * */ public function is_404() { return (bool)$this->is_404; } /** * Is the query for an embedded post? * * @return bool Whether the query is for an embedded post. * @since 4.4.0 * */ public function is_embed() { return (bool)$this->is_embed; } /** * Is the query the main query? * * @return bool Whether the query is the main query. * @global WP_Query $wp_query WordPress Query object. * * @since 3.3.0 * */ public function is_main_query() { global $wp_the_query; return $wp_the_query === $this; } /** * Set up global post data. * * @param WP_Post|object|int $post WP_Post instance or Post ID/object. * @return true True when finished. * @since 4.1.0 * @since 4.4.0 Added the ability to pass a post ID to `$post`. * * @global int $id * @global WP_User $authordata * @global string $currentday * @global string $currentmonth * @global int $page * @global array $pages * @global int $multipage * @global int $more * @global int $numpages * */ public function setup_postdata($post) { global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages; if (!($post instanceof WP_Post)) { $post = get_post($post); } if (!$post) { return; } $elements = $this->generate_postdata($post); if (false === $elements) { return; } $id = $elements['id']; $authordata = $elements['authordata']; $currentday = $elements['currentday']; $currentmonth = $elements['currentmonth']; $page = $elements['page']; $pages = $elements['pages']; $multipage = $elements['multipage']; $more = $elements['more']; $numpages = $elements['numpages']; /** * Fires once the post data has been set up. * * @param WP_Post $post The Post object (passed by reference). * @param WP_Query $query The current Query object (passed by reference). * @since 2.8.0 * @since 4.1.0 Introduced `$query` parameter. * */ do_action_ref_array('the_post', array(&$post, &$this)); return true; } /** * Generate post data. * * @param WP_Post|object|int $post WP_Post instance or Post ID/object. * @return array|false Elements of post or false on failure. * @since 5.2.0 * */ public function generate_postdata($post) { if (!($post instanceof WP_Post)) { $post = get_post($post); } if (!$post) { return false; } $id = (int)$post->ID; $authordata = get_userdata($post->post_author); $currentday = mysql2date('d.m.y', $post->post_date, false); $currentmonth = mysql2date('m', $post->post_date, false); $numpages = 1; $multipage = 0; $page = $this->get('page'); if (!$page) { $page = 1; } /* * Force full post content when viewing the permalink for the $post, * or when on an RSS feed. Otherwise respect the 'more' tag. */ if (get_queried_object_id() === $post->ID && ($this->is_page() || $this->is_single())) { $more = 1; } elseif ($this->is_feed()) { $more = 1; } else { $more = 0; } $content = $post->text; if (false !== strpos($content, '')) { $content = str_replace("\n\n", '', $content); $content = str_replace("\n", '', $content); $content = str_replace("\n", '', $content); // Remove the nextpage block delimiters, to avoid invalid block structures in the split content. $content = str_replace('', '', $content); $content = str_replace('', '', $content); // Ignore nextpage at the beginning of the content. if (0 === strpos($content, '')) { $content = substr($content, 15); } $pages = explode('', $content); } else { $pages = array($post->text); } /** * Filters the "pages" derived from splitting the post content. * * "Pages" are determined by splitting the post content based on the presence * of `` tags. * * @param string[] $pages Array of "pages" from the post content split by `` tags. * @param WP_Post $post Current post object. * @since 4.4.0 * */ $pages = apply_filters('content_pagination', $pages, $post); $numpages = count($pages); if ($numpages > 1) { if ($page > 1) { $more = 1; } $multipage = 1; } else { $multipage = 0; } $elements = compact('id', 'authordata', 'currentday', 'currentmonth', 'page', 'pages', 'multipage', 'more', 'numpages'); return $elements; } /** * After looping through a nested query, this function * restores the $post global to the current post in this query. * * @since 3.7.0 * * @global WP_Post $post Global post object. */ public function reset_postdata() { if (!empty($this->post)) { $GLOBALS['post'] = $this->post; $this->setup_postdata($this->post); } } /** * Lazyload term meta for posts in the loop. * * @param mixed $check * @param int $term_id * @return mixed * @deprecated 4.5.0 See wp_queue_posts_for_term_meta_lazyload(). * * @since 4.4.0 */ public function lazyload_term_meta($check, $term_id) { return $check; } /** * Lazyload comment meta for comments in the loop. * * @param mixed $check * @param int $comment_id * @return mixed * @deprecated 4.5.0 See wp_queue_comments_for_comment_meta_lazyload(). * * @since 4.4.0 */ public function lazyload_comment_meta($check, $comment_id) { return $check; } } } ================================================ FILE: 配套插件/BsCore/index.php ================================================ \n" "Language-Team: \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.3\n" "Project-Id-Version: \n" #: classes/admin-options.class.php:226 msgid "Error while saving the changes." msgstr "保存失败" #: classes/admin-options.class.php:286 msgid "Settings successfully imported." msgstr "导入成功" #: classes/admin-options.class.php:298 classes/admin-options.class.php:314 msgid "Default settings restored." msgstr "恢复完成" #: classes/admin-options.class.php:385 msgid "Settings saved." msgstr "保存成功" #: classes/admin-options.class.php:565 msgid "You have unsaved changes, save your changes!" msgstr "配置发生改变,请勿忘记保存!" #: classes/admin-options.class.php:567 msgid "show all settings" msgstr "显示所有设置" #: classes/admin-options.class.php:569 fields/icon/icon.php:57 #: fields/map/map.php:23 msgid "Search..." msgstr "请输入关键词" #: classes/admin-options.class.php:572 classes/admin-options.class.php:695 msgid "Save" msgstr "保存配置" #: classes/admin-options.class.php:572 classes/admin-options.class.php:695 msgid "Saving..." msgstr "正在保存" #: classes/admin-options.class.php:573 classes/admin-options.class.php:696 msgid "Reset Section" msgstr "恢复此页" #: classes/admin-options.class.php:573 classes/admin-options.class.php:696 msgid "Are you sure to reset this section options?" msgstr "单击「确定」进行恢复,当前页面的配置将会丢失!" #: classes/admin-options.class.php:574 classes/admin-options.class.php:697 msgid "Reset All" msgstr "恢复全部" #: classes/admin-options.class.php:574 classes/admin-options.class.php:697 #: classes/comment-options.class.php:216 classes/metabox-options.class.php:294 #: fields/backup/backup.php:31 msgid "Reset" msgstr "恢复默认" #: classes/admin-options.class.php:574 classes/admin-options.class.php:697 msgid "Are you sure you want to reset all settings to default values?" msgstr "单击「确定」进行恢复,所有页面的配置都将丢失!" #: classes/admin-options.class.php:672 classes/comment-options.class.php:199 #: classes/metabox-options.class.php:277 fields/button_set/button_set.php:56 #: fields/checkbox/checkbox.php:76 fields/radio/radio.php:75 #: fields/select/select.php:113 functions/actions.php:41 msgid "No data available." msgstr "没有可用数据" #: classes/comment-options.class.php:217 classes/metabox-options.class.php:295 msgid "update post" msgstr "更新文章" #: classes/comment-options.class.php:217 classes/metabox-options.class.php:295 msgid "Cancel" msgstr "取消" #: classes/setup.class.php:592 msgid "Are you sure?" msgstr "单击「确定」进行下一步操作,该操作可能会丢失部分配置!" #: classes/setup.class.php:593 msgid "Please enter %s or more characters" msgstr "请输入 %s 或更多字符" #: classes/setup.class.php:594 msgid "Searching..." msgstr "搜索中..." #: classes/setup.class.php:595 msgid "No results found." msgstr "未找到结果。" #: classes/setup.class.php:696 msgid "Oops! Not allowed." msgstr "哎呀!不允许。" #: classes/setup.class.php:768 classes/setup.class.php:772 msgid "Field not found!" msgstr "没有找到任何数据" #: classes/shortcode-options.class.php:253 fields/group/group.php:23 msgid "Add New" msgstr "新增" #: classes/shortcode-options.class.php:290 functions/actions.php:16 #: functions/actions.php:68 functions/actions.php:106 functions/actions.php:141 #: functions/actions.php:170 msgid "Error: Invalid nonce verification." msgstr "错误: 无效的nonce验证。" #: fields/background/background.php:36 fields/media/media.php:59 msgid "Not selected" msgstr "未选择" #: fields/background/background.php:72 fields/date/date.php:31 msgid "From" msgstr "从" #: fields/background/background.php:90 fields/date/date.php:32 msgid "To" msgstr "到" #: fields/background/background.php:108 msgid "Direction" msgstr "方向" #: fields/background/background.php:114 msgid "Gradient Direction" msgstr "渐变方向" #: fields/background/background.php:115 msgid "⇓ top to bottom" msgstr "⇓ 从上到下" #: fields/background/background.php:116 msgid "⇒ left to right" msgstr "⇒从左到右" #: fields/background/background.php:117 msgid "⇘ corner top to right" msgstr "⇘ 右上角" #: fields/background/background.php:118 msgid "⇙ corner top to left" msgstr "⇘ 左上角" #: fields/background/background.php:161 msgid "Background Position" msgstr "背景位置" #: fields/background/background.php:162 msgid "Left Top" msgstr "左上" #: fields/background/background.php:163 msgid "Left Center" msgstr "左中" #: fields/background/background.php:164 msgid "Left Bottom" msgstr "左下" #: fields/background/background.php:165 msgid "Center Top" msgstr "中上" #: fields/background/background.php:166 msgid "Center Center" msgstr "居中" #: fields/background/background.php:167 msgid "Center Bottom" msgstr "中下" #: fields/background/background.php:168 msgid "Right Top" msgstr "右上" #: fields/background/background.php:169 msgid "Right Center" msgstr "右中" #: fields/background/background.php:170 msgid "Right Bottom" msgstr "右下" #: fields/background/background.php:184 msgid "Background Repeat" msgstr "背景重复" #: fields/background/background.php:185 msgid "Repeat" msgstr "重复" #: fields/background/background.php:186 msgid "No Repeat" msgstr "不重复" #: fields/background/background.php:187 msgid "Repeat Horizontally" msgstr "水平重复" #: fields/background/background.php:188 msgid "Repeat Vertically" msgstr "垂直重复" #: fields/background/background.php:202 msgid "Background Attachment" msgstr "背景附件" #: fields/background/background.php:203 msgid "Scroll" msgstr "滚动" #: fields/background/background.php:204 msgid "Fixed" msgstr "固定" #: fields/background/background.php:218 msgid "Background Size" msgstr "背景大小" #: fields/background/background.php:219 msgid "Cover" msgstr "覆盖" #: fields/background/background.php:220 msgid "Contain" msgstr "包含" #: fields/background/background.php:221 msgid "Auto" msgstr "自动" #: fields/background/background.php:235 msgid "Background Origin" msgstr "背景起源" #: fields/background/background.php:236 fields/background/background.php:254 msgid "Padding Box" msgstr "框内边距" #: fields/background/background.php:237 fields/background/background.php:253 msgid "Border Box" msgstr "边框" #: fields/background/background.php:238 fields/background/background.php:255 msgid "Content Box" msgstr "内容框" #: fields/background/background.php:252 msgid "Background Clip" msgstr "背景剪辑" #: fields/background/background.php:269 msgid "Background Blend Mode" msgstr "背景混合模式" #: fields/background/background.php:270 fields/link_color/link_color.php:36 #: fields/typography/typography.php:186 msgid "Normal" msgstr "正常" #: fields/background/background.php:271 msgid "Multiply" msgstr "乘" #: fields/background/background.php:272 msgid "Screen" msgstr "屏幕" #: fields/background/background.php:273 msgid "Overlay" msgstr "覆盖" #: fields/background/background.php:274 msgid "Darken" msgstr "变黑" #: fields/background/background.php:275 msgid "Lighten" msgstr "减轻" #: fields/background/background.php:276 msgid "Color Dodge" msgstr "颜色减淡" #: fields/background/background.php:277 msgid "Saturation" msgstr "饱和度" #: fields/background/background.php:278 msgid "Color" msgstr "颜色" #: fields/background/background.php:279 msgid "Luminosity" msgstr "光度" #: fields/backup/backup.php:26 msgid "Import" msgstr "导入" #: fields/backup/backup.php:29 msgid "Export & Download" msgstr "导出和下载" #: fields/border/border.php:25 fields/spacing/spacing.php:25 msgid "top" msgstr "顶部" #: fields/border/border.php:26 fields/spacing/spacing.php:26 msgid "right" msgstr "右" #: fields/border/border.php:27 fields/spacing/spacing.php:27 msgid "bottom" msgstr "底部" #: fields/border/border.php:28 fields/spacing/spacing.php:28 msgid "left" msgstr "左" #: fields/border/border.php:29 fields/spacing/spacing.php:29 msgid "all" msgstr "所有" #: fields/border/border.php:51 fields/typography/typography.php:214 msgid "Solid" msgstr "实线" #: fields/border/border.php:52 fields/typography/typography.php:217 msgid "Dashed" msgstr "虚线" #: fields/border/border.php:53 fields/typography/typography.php:216 msgid "Dotted" msgstr "点线" #: fields/border/border.php:54 fields/typography/typography.php:215 msgid "Double" msgstr "双线" #: fields/border/border.php:55 msgid "Inset" msgstr "插入" #: fields/border/border.php:56 msgid "Outset" msgstr "开始" #: fields/border/border.php:57 msgid "Groove" msgstr "凹槽" #: fields/border/border.php:58 msgid "ridge" msgstr "凸出" #: fields/border/border.php:59 fields/typography/typography.php:199 #: fields/typography/typography.php:213 msgid "None" msgstr "无" #: fields/dimensions/dimensions.php:22 msgid "width" msgstr "宽度" #: fields/dimensions/dimensions.php:23 msgid "height" msgstr "高度" #: fields/gallery/gallery.php:20 msgid "Add Gallery" msgstr "添加图库" #: fields/gallery/gallery.php:21 msgid "Edit Gallery" msgstr "编辑图库" #: fields/gallery/gallery.php:22 msgid "Clear" msgstr "清除" #: fields/group/group.php:35 fields/repeater/repeater.php:27 msgid "Error: Field ID conflict." msgstr "错误:字段ID冲突。" #: fields/group/group.php:46 fields/group/group.php:87 #: fields/repeater/repeater.php:48 fields/repeater/repeater.php:76 msgid "Are you sure to delete this item?" msgstr "确定要删除这个项目吗?" #: fields/group/group.php:121 fields/repeater/repeater.php:89 msgid "You cannot add more." msgstr "无法添加更多" #: fields/group/group.php:122 fields/repeater/repeater.php:90 msgid "You cannot remove more." msgstr "无法删除更多" #: fields/icon/icon.php:20 fields/icon/icon.php:53 msgid "Add Icon" msgstr "添加图标" #: fields/icon/icon.php:21 msgid "Remove Icon" msgstr "删除图标" #: fields/link/link.php:20 msgid "Add Link" msgstr "添加链接" #: fields/link/link.php:21 msgid "Edit Link" msgstr "编辑链接" #: fields/link/link.php:22 msgid "Remove Link" msgstr "移除链接" #: fields/link_color/link_color.php:37 msgid "Hover" msgstr "悬停" #: fields/link_color/link_color.php:38 msgid "Active" msgstr "启用" #: fields/link_color/link_color.php:39 msgid "Visited" msgstr "访问" #: fields/link_color/link_color.php:40 msgid "Focus" msgstr "焦点" #: fields/map/map.php:24 msgid "Latitude" msgstr "纬度" #: fields/map/map.php:25 msgid "Longitude" msgstr "经度" #: fields/media/media.php:25 fields/upload/upload.php:25 msgid "Upload" msgstr "上传" #: fields/media/media.php:26 fields/upload/upload.php:26 msgid "Remove" msgstr "删除" #: fields/sorter/sorter.php:21 msgid "Enabled" msgstr "启用" #: fields/sorter/sorter.php:22 msgid "Disabled" msgstr "禁用" #: fields/switcher/switcher.php:20 msgid "On" msgstr "启用" #: fields/switcher/switcher.php:21 msgid "Off" msgstr "禁用" #: fields/typography/typography.php:96 msgid "Font Family" msgstr "字体" #: fields/typography/typography.php:97 msgid "Select a font" msgstr "选择字体" #: fields/typography/typography.php:105 msgid "Backup Font Family" msgstr "备份字体系列" #: fields/typography/typography.php:119 fields/typography/typography.php:132 #: fields/typography/typography.php:145 fields/typography/typography.php:160 #: fields/typography/typography.php:176 fields/typography/typography.php:189 #: fields/typography/typography.php:203 fields/typography/typography.php:221 msgid "Default" msgstr "默认" #: fields/typography/typography.php:130 msgid "Font Style" msgstr "字体样式" #: fields/typography/typography.php:144 fields/typography/typography.php:145 msgid "Load Extra Styles" msgstr "加载额外样式" #: fields/typography/typography.php:158 msgid "Subset" msgstr "子集" #: fields/typography/typography.php:168 msgid "Text Align" msgstr "文本对齐" #: fields/typography/typography.php:170 msgid "Inherit" msgstr "继承" #: fields/typography/typography.php:171 msgid "Left" msgstr "左侧" #: fields/typography/typography.php:172 msgid "Center" msgstr "居中" #: fields/typography/typography.php:173 msgid "Right" msgstr "右侧" #: fields/typography/typography.php:174 msgid "Justify" msgstr "两端对齐" #: fields/typography/typography.php:175 msgid "Initial" msgstr "初始" #: fields/typography/typography.php:184 msgid "Font Variant" msgstr "字体变体" #: fields/typography/typography.php:187 msgid "Small Caps" msgstr "小写" #: fields/typography/typography.php:188 msgid "All Small Caps" msgstr "所有字母小写" #: fields/typography/typography.php:197 msgid "Text Transform" msgstr "文本转换" #: fields/typography/typography.php:200 msgid "Capitalize" msgstr "大写" #: fields/typography/typography.php:201 msgid "Uppercase" msgstr "大写" #: fields/typography/typography.php:202 msgid "Lowercase" msgstr "小写" #: fields/typography/typography.php:211 msgid "Text Decoration" msgstr "文本装饰" #: fields/typography/typography.php:218 msgid "Wavy" msgstr "波浪" #: fields/typography/typography.php:219 msgid "Overline" msgstr "上划线" #: fields/typography/typography.php:220 msgid "Line-through" msgstr "删除线" #: fields/typography/typography.php:233 msgid "Font Size" msgstr "字体大小" #: fields/typography/typography.php:245 msgid "Line Height" msgstr "线高度" #: fields/typography/typography.php:257 msgid "Letter Spacing" msgstr "字母间距" #: fields/typography/typography.php:269 msgid "Word Spacing" msgstr "字间距" #: fields/typography/typography.php:284 msgid "Font Color" msgstr "字体颜色" #: fields/typography/typography.php:295 msgid "Custom Style" msgstr "自定义样式" #: fields/typography/typography.php:362 msgid "Custom Web Fonts" msgstr "自定义 Web 字体" #: fields/typography/typography.php:368 msgid "Safe Web Fonts" msgstr "Web 安全字体" #: fields/typography/typography.php:388 msgid "Google Web Fonts" msgstr "Google Web 字体" #: functions/actions.php:72 functions/actions.php:110 msgid "Error: Invalid key." msgstr "错误:无效密钥。" #: functions/actions.php:114 msgid "Error: The response is not a valid JSON response." msgstr "错误:响应不是有效的 JSON 响应。" #: functions/actions.php:174 msgid "Error: Invalid term ID." msgstr "错误:无效的项目ID。" #: functions/actions.php:180 msgid "Error: You do not have permission to do that." msgstr "错误:您无权这样做。" #: functions/validate.php:14 functions/validate.php:86 msgid "Please enter a valid email address." msgstr "请输入正确的电子邮件地址。" #: functions/validate.php:32 functions/validate.php:106 msgid "Please enter a valid number." msgstr "请输入有效的数字" #: functions/validate.php:50 functions/validate.php:126 msgid "This field is required." msgstr "这是必填栏。" #: functions/validate.php:68 functions/validate.php:146 msgid "Please enter a valid URL." msgstr "请输入有效网址" #. Plugin Name of the plugin/theme msgid "Codestar Framework" msgstr "Codestar Framework" #. Plugin URI of the plugin/theme msgid "http://codestarframework.com/" msgstr "http://codestarframework.com/" #. Description of the plugin/theme msgid "A Simple and Lightweight WordPress Option Framework for Themes and Plugins" msgstr "一个简单且轻量的 WordPress 主题和插件选项框架" #. Author of the plugin/theme msgid "Codestar" msgstr "Codestar" #. Author URI of the plugin/theme msgid "http://codestarthemes.com/" msgstr "http://codestarthemes.com/" ================================================ FILE: 配套插件/BsCore/lib/phpmailer/DSNConfigurator.php ================================================ * @author Jim Jagielski (jimjag) * @author Andy Prevost (codeworxtech) * @author Brent R. Matzelle (original founder) * @copyright 2012 - 2023 Marcus Bointon * @copyright 2010 - 2012 Jim Jagielski * @copyright 2004 - 2009 Andy Prevost * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @note This program is distributed in the hope that it will be useful - WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. */ namespace PHPMailer\PHPMailer; /** * Configure PHPMailer with DSN string. * * @see https://en.wikipedia.org/wiki/Data_source_name * * @author Oleg Voronkovich */ class DSNConfigurator { /** * Create new PHPMailer instance configured by DSN. * * @param string $dsn DSN * @param bool $exceptions Should we throw external exceptions? * * @return PHPMailer */ public static function mailer($dsn, $exceptions = null) { static $configurator = null; if (null === $configurator) { $configurator = new DSNConfigurator(); } return $configurator->configure(new PHPMailer($exceptions), $dsn); } /** * Configure PHPMailer instance with DSN string. * * @param PHPMailer $mailer PHPMailer instance * @param string $dsn DSN * * @return PHPMailer */ public function configure(PHPMailer $mailer, $dsn) { $config = $this->parseDSN($dsn); $this->applyConfig($mailer, $config); return $mailer; } /** * Parse DSN string. * * @param string $dsn DSN * * @throws Exception If DSN is malformed * * @return array Configuration */ private function parseDSN($dsn) { $config = $this->parseUrl($dsn); if (false === $config || !isset($config['scheme']) || !isset($config['host'])) { throw new Exception( sprintf('Malformed DSN: "%s".', $dsn) ); } if (isset($config['query'])) { parse_str($config['query'], $config['query']); } return $config; } /** * Apply configuration to mailer. * * @param PHPMailer $mailer PHPMailer instance * @param array $config Configuration * * @throws Exception If scheme is invalid */ private function applyConfig(PHPMailer $mailer, $config) { switch ($config['scheme']) { case 'mail': $mailer->isMail(); break; case 'sendmail': $mailer->isSendmail(); break; case 'qmail': $mailer->isQmail(); break; case 'smtp': case 'smtps': $mailer->isSMTP(); $this->configureSMTP($mailer, $config); break; default: throw new Exception( sprintf( 'Invalid scheme: "%s". Allowed values: "mail", "sendmail", "qmail", "smtp", "smtps".', $config['scheme'] ) ); } if (isset($config['query'])) { $this->configureOptions($mailer, $config['query']); } } /** * Configure SMTP. * * @param PHPMailer $mailer PHPMailer instance * @param array $config Configuration */ private function configureSMTP($mailer, $config) { $isSMTPS = 'smtps' === $config['scheme']; if ($isSMTPS) { $mailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; } $mailer->Host = $config['host']; if (isset($config['port'])) { $mailer->Port = $config['port']; } elseif ($isSMTPS) { $mailer->Port = SMTP::DEFAULT_SECURE_PORT; } $mailer->SMTPAuth = isset($config['user']) || isset($config['pass']); if (isset($config['user'])) { $mailer->Username = $config['user']; } if (isset($config['pass'])) { $mailer->Password = $config['pass']; } } /** * Configure options. * * @param PHPMailer $mailer PHPMailer instance * @param array $options Options * * @throws Exception If option is unknown */ private function configureOptions(PHPMailer $mailer, $options) { $allowedOptions = get_object_vars($mailer); unset($allowedOptions['Mailer']); unset($allowedOptions['SMTPAuth']); unset($allowedOptions['Username']); unset($allowedOptions['Password']); unset($allowedOptions['Hostname']); unset($allowedOptions['Port']); unset($allowedOptions['ErrorInfo']); $allowedOptions = \array_keys($allowedOptions); foreach ($options as $key => $value) { if (!in_array($key, $allowedOptions)) { throw new Exception( sprintf( 'Unknown option: "%s". Allowed values: "%s"', $key, implode('", "', $allowedOptions) ) ); } switch ($key) { case 'AllowEmpty': case 'SMTPAutoTLS': case 'SMTPKeepAlive': case 'SingleTo': case 'UseSendmailOptions': case 'do_verp': case 'DKIM_copyHeaderFields': $mailer->$key = (bool) $value; break; case 'Priority': case 'SMTPDebug': case 'WordWrap': $mailer->$key = (int) $value; break; default: $mailer->$key = $value; break; } } } /** * Parse a URL. * Wrapper for the built-in parse_url function to work around a bug in PHP 5.5. * * @param string $url URL * * @return array|false */ protected function parseUrl($url) { if (\PHP_VERSION_ID >= 50600 || false === strpos($url, '?')) { return parse_url($url); } $chunks = explode('?', $url); if (is_array($chunks)) { $result = parse_url($chunks[0]); if (is_array($result)) { $result['query'] = $chunks[1]; } return $result; } return false; } } ================================================ FILE: 配套插件/BsCore/lib/phpmailer/Exception.php ================================================ * @author Jim Jagielski (jimjag) * @author Andy Prevost (codeworxtech) * @author Brent R. Matzelle (original founder) * @copyright 2012 - 2020 Marcus Bointon * @copyright 2010 - 2012 Jim Jagielski * @copyright 2004 - 2009 Andy Prevost * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @note This program is distributed in the hope that it will be useful - WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. */ namespace PHPMailer\PHPMailer; /** * PHPMailer exception handler. * * @author Marcus Bointon */ class Exception extends \Exception { /** * Prettify error message output. * * @return string */ public function errorMessage() { return '' . htmlspecialchars($this->getMessage(), ENT_COMPAT | ENT_HTML401) . "
            \n"; } } ================================================ FILE: 配套插件/BsCore/lib/phpmailer/OAuth.php ================================================ * @author Jim Jagielski (jimjag) * @author Andy Prevost (codeworxtech) * @author Brent R. Matzelle (original founder) * @copyright 2012 - 2020 Marcus Bointon * @copyright 2010 - 2012 Jim Jagielski * @copyright 2004 - 2009 Andy Prevost * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @note This program is distributed in the hope that it will be useful - WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. */ namespace PHPMailer\PHPMailer; use League\OAuth2\Client\Grant\RefreshToken; use League\OAuth2\Client\Provider\AbstractProvider; use League\OAuth2\Client\Token\AccessToken; /** * OAuth - OAuth2 authentication wrapper class. * Uses the oauth2-client package from the League of Extraordinary Packages. * * @see http://oauth2-client.thephpleague.com * * @author Marcus Bointon (Synchro/coolbru) */ class OAuth implements OAuthTokenProvider { /** * An instance of the League OAuth Client Provider. * * @var AbstractProvider */ protected $provider; /** * The current OAuth access token. * * @var AccessToken */ protected $oauthToken; /** * The user's email address, usually used as the login ID * and also the from address when sending email. * * @var string */ protected $oauthUserEmail = ''; /** * The client secret, generated in the app definition of the service you're connecting to. * * @var string */ protected $oauthClientSecret = ''; /** * The client ID, generated in the app definition of the service you're connecting to. * * @var string */ protected $oauthClientId = ''; /** * The refresh token, used to obtain new AccessTokens. * * @var string */ protected $oauthRefreshToken = ''; /** * OAuth constructor. * * @param array $options Associative array containing * `provider`, `userName`, `clientSecret`, `clientId` and `refreshToken` elements */ public function __construct($options) { $this->provider = $options['provider']; $this->oauthUserEmail = $options['userName']; $this->oauthClientSecret = $options['clientSecret']; $this->oauthClientId = $options['clientId']; $this->oauthRefreshToken = $options['refreshToken']; } /** * Get a new RefreshToken. * * @return RefreshToken */ protected function getGrant() { return new RefreshToken(); } /** * Get a new AccessToken. * * @return AccessToken */ protected function getToken() { return $this->provider->getAccessToken( $this->getGrant(), ['refresh_token' => $this->oauthRefreshToken] ); } /** * Generate a base64-encoded OAuth token. * * @return string */ public function getOauth64() { //Get a new token if it's not available or has expired if (null === $this->oauthToken || $this->oauthToken->hasExpired()) { $this->oauthToken = $this->getToken(); } return base64_encode( 'user=' . $this->oauthUserEmail . "\001auth=Bearer " . $this->oauthToken . "\001\001" ); } } ================================================ FILE: 配套插件/BsCore/lib/phpmailer/OAuthTokenProvider.php ================================================ * @author Jim Jagielski (jimjag) * @author Andy Prevost (codeworxtech) * @author Brent R. Matzelle (original founder) * @copyright 2012 - 2020 Marcus Bointon * @copyright 2010 - 2012 Jim Jagielski * @copyright 2004 - 2009 Andy Prevost * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @note This program is distributed in the hope that it will be useful - WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. */ namespace PHPMailer\PHPMailer; /** * OAuthTokenProvider - OAuth2 token provider interface. * Provides base64 encoded OAuth2 auth strings for SMTP authentication. * * @see OAuth * @see SMTP::authenticate() * * @author Peter Scopes (pdscopes) * @author Marcus Bointon (Synchro/coolbru) */ interface OAuthTokenProvider { /** * Generate a base64-encoded OAuth token ensuring that the access token has not expired. * The string to be base 64 encoded should be in the form: * "user=\001auth=Bearer \001\001" * * @return string */ public function getOauth64(); } ================================================ FILE: 配套插件/BsCore/lib/phpmailer/PHPMailer.php ================================================ * @author Jim Jagielski (jimjag) * @author Andy Prevost (codeworxtech) * @author Brent R. Matzelle (original founder) * @copyright 2012 - 2020 Marcus Bointon * @copyright 2010 - 2012 Jim Jagielski * @copyright 2004 - 2009 Andy Prevost * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @note This program is distributed in the hope that it will be useful - WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. */ namespace PHPMailer\PHPMailer; /** * PHPMailer - PHP email creation and transport class. * * @author Marcus Bointon (Synchro/coolbru) * @author Jim Jagielski (jimjag) * @author Andy Prevost (codeworxtech) * @author Brent R. Matzelle (original founder) */ class PHPMailer { const CHARSET_ASCII = 'us-ascii'; const CHARSET_ISO88591 = 'iso-8859-1'; const CHARSET_UTF8 = 'utf-8'; const CONTENT_TYPE_PLAINTEXT = 'text/plain'; const CONTENT_TYPE_TEXT_CALENDAR = 'text/calendar'; const CONTENT_TYPE_TEXT_HTML = 'text/html'; const CONTENT_TYPE_MULTIPART_ALTERNATIVE = 'multipart/alternative'; const CONTENT_TYPE_MULTIPART_MIXED = 'multipart/mixed'; const CONTENT_TYPE_MULTIPART_RELATED = 'multipart/related'; const ENCODING_7BIT = '7bit'; const ENCODING_8BIT = '8bit'; const ENCODING_BASE64 = 'base64'; const ENCODING_BINARY = 'binary'; const ENCODING_QUOTED_PRINTABLE = 'quoted-printable'; const ENCRYPTION_STARTTLS = 'tls'; const ENCRYPTION_SMTPS = 'ssl'; const ICAL_METHOD_REQUEST = 'REQUEST'; const ICAL_METHOD_PUBLISH = 'PUBLISH'; const ICAL_METHOD_REPLY = 'REPLY'; const ICAL_METHOD_ADD = 'ADD'; const ICAL_METHOD_CANCEL = 'CANCEL'; const ICAL_METHOD_REFRESH = 'REFRESH'; const ICAL_METHOD_COUNTER = 'COUNTER'; const ICAL_METHOD_DECLINECOUNTER = 'DECLINECOUNTER'; /** * Email priority. * Options: null (default), 1 = High, 3 = Normal, 5 = low. * When null, the header is not set at all. * * @var int|null */ public $Priority; /** * The character set of the message. * * @var string */ public $CharSet = self::CHARSET_ISO88591; /** * The MIME Content-type of the message. * * @var string */ public $ContentType = self::CONTENT_TYPE_PLAINTEXT; /** * The message encoding. * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable". * * @var string */ public $Encoding = self::ENCODING_8BIT; /** * Holds the most recent mailer error message. * * @var string */ public $ErrorInfo = ''; /** * The From email address for the message. * * @var string */ public $From = ''; /** * The From name of the message. * * @var string */ public $FromName = ''; /** * The envelope sender of the message. * This will usually be turned into a Return-Path header by the receiver, * and is the address that bounces will be sent to. * If not empty, will be passed via `-f` to sendmail or as the 'MAIL FROM' value over SMTP. * * @var string */ public $Sender = ''; /** * The Subject of the message. * * @var string */ public $Subject = ''; /** * An HTML or plain text message body. * If HTML then call isHTML(true). * * @var string */ public $Body = ''; /** * The plain-text message body. * This body can be read by mail clients that do not have HTML email * capability such as mutt & Eudora. * Clients that can read HTML will view the normal Body. * * @var string */ public $AltBody = ''; /** * An iCal message part body. * Only supported in simple alt or alt_inline message types * To generate iCal event structures, use classes like EasyPeasyICS or iCalcreator. * * @see http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/ * @see http://kigkonsult.se/iCalcreator/ * * @var string */ public $Ical = ''; /** * Value-array of "method" in Contenttype header "text/calendar" * * @var string[] */ protected static $IcalMethods = [ self::ICAL_METHOD_REQUEST, self::ICAL_METHOD_PUBLISH, self::ICAL_METHOD_REPLY, self::ICAL_METHOD_ADD, self::ICAL_METHOD_CANCEL, self::ICAL_METHOD_REFRESH, self::ICAL_METHOD_COUNTER, self::ICAL_METHOD_DECLINECOUNTER, ]; /** * The complete compiled MIME message body. * * @var string */ protected $MIMEBody = ''; /** * The complete compiled MIME message headers. * * @var string */ protected $MIMEHeader = ''; /** * Extra headers that createHeader() doesn't fold in. * * @var string */ protected $mailHeader = ''; /** * Word-wrap the message body to this number of chars. * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance. * * @see static::STD_LINE_LENGTH * * @var int */ public $WordWrap = 0; /** * Which method to use to send mail. * Options: "mail", "sendmail", or "smtp". * * @var string */ public $Mailer = 'mail'; /** * The path to the sendmail program. * * @var string */ public $Sendmail = '/usr/sbin/sendmail'; /** * Whether mail() uses a fully sendmail-compatible MTA. * One which supports sendmail's "-oi -f" options. * * @var bool */ public $UseSendmailOptions = true; /** * The email address that a reading confirmation should be sent to, also known as read receipt. * * @var string */ public $ConfirmReadingTo = ''; /** * The hostname to use in the Message-ID header and as default HELO string. * If empty, PHPMailer attempts to find one with, in order, * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value * 'localhost.localdomain'. * * @see PHPMailer::$Helo * * @var string */ public $Hostname = ''; /** * An ID to be used in the Message-ID header. * If empty, a unique id will be generated. * You can set your own, but it must be in the format "", * as defined in RFC5322 section 3.6.4 or it will be ignored. * * @see https://tools.ietf.org/html/rfc5322#section-3.6.4 * * @var string */ public $MessageID = ''; /** * The message Date to be used in the Date header. * If empty, the current date will be added. * * @var string */ public $MessageDate = ''; /** * SMTP hosts. * Either a single hostname or multiple semicolon-delimited hostnames. * You can also specify a different port * for each host by using this format: [hostname:port] * (e.g. "smtp1.example.com:25;smtp2.example.com"). * You can also specify encryption type, for example: * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). * Hosts will be tried in order. * * @var string */ public $Host = 'localhost'; /** * The default SMTP server port. * * @var int */ public $Port = 25; /** * The SMTP HELO/EHLO name used for the SMTP connection. * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find * one with the same method described above for $Hostname. * * @see PHPMailer::$Hostname * * @var string */ public $Helo = ''; /** * What kind of encryption to use on the SMTP connection. * Options: '', static::ENCRYPTION_STARTTLS, or static::ENCRYPTION_SMTPS. * * @var string */ public $SMTPSecure = ''; /** * Whether to enable TLS encryption automatically if a server supports it, * even if `SMTPSecure` is not set to 'tls'. * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. * * @var bool */ public $SMTPAutoTLS = true; /** * Whether to use SMTP authentication. * Uses the Username and Password properties. * * @see PHPMailer::$Username * @see PHPMailer::$Password * * @var bool */ public $SMTPAuth = false; /** * Options array passed to stream_context_create when connecting via SMTP. * * @var array */ public $SMTPOptions = []; /** * SMTP username. * * @var string */ public $Username = ''; /** * SMTP password. * * @var string */ public $Password = ''; /** * SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2. * If not specified, the first one from that list that the server supports will be selected. * * @var string */ public $AuthType = ''; /** * An implementation of the PHPMailer OAuthTokenProvider interface. * * @var OAuthTokenProvider */ protected $oauth; /** * The SMTP server timeout in seconds. * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2. * * @var int */ public $Timeout = 300; /** * Comma separated list of DSN notifications * 'NEVER' under no circumstances a DSN must be returned to the sender. * If you use NEVER all other notifications will be ignored. * 'SUCCESS' will notify you when your mail has arrived at its destination. * 'FAILURE' will arrive if an error occurred during delivery. * 'DELAY' will notify you if there is an unusual delay in delivery, but the actual * delivery's outcome (success or failure) is not yet decided. * * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY */ public $dsn = ''; /** * SMTP class debug output mode. * Debug output level. * Options: * @see SMTP::DEBUG_OFF: No output * @see SMTP::DEBUG_CLIENT: Client messages * @see SMTP::DEBUG_SERVER: Client and server messages * @see SMTP::DEBUG_CONNECTION: As SERVER plus connection status * @see SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed * * @see SMTP::$do_debug * * @var int */ public $SMTPDebug = 0; /** * How to handle debug output. * Options: * * `echo` Output plain-text as-is, appropriate for CLI * * `html` Output escaped, line breaks converted to `
            `, appropriate for browser output * * `error_log` Output to error log as configured in php.ini * By default PHPMailer will use `echo` if run from a `cli` or `cli-server` SAPI, `html` otherwise. * Alternatively, you can provide a callable expecting two params: a message string and the debug level: * * ```php * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; * ``` * * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug` * level output is used: * * ```php * $mail->Debugoutput = new myPsr3Logger; * ``` * * @see SMTP::$Debugoutput * * @var string|callable|\Psr\Log\LoggerInterface */ public $Debugoutput = 'echo'; /** * Whether to keep the SMTP connection open after each message. * If this is set to true then the connection will remain open after a send, * and closing the connection will require an explicit call to smtpClose(). * It's a good idea to use this if you are sending multiple messages as it reduces overhead. * See the mailing list example for how to use it. * * @var bool */ public $SMTPKeepAlive = false; /** * Whether to split multiple to addresses into multiple messages * or send them all in one message. * Only supported in `mail` and `sendmail` transports, not in SMTP. * * @var bool * * @deprecated 6.0.0 PHPMailer isn't a mailing list manager! */ public $SingleTo = false; /** * Storage for addresses when SingleTo is enabled. * * @var array */ protected $SingleToArray = []; /** * Whether to generate VERP addresses on send. * Only applicable when sending via SMTP. * * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path * @see http://www.postfix.org/VERP_README.html Postfix VERP info * * @var bool */ public $do_verp = false; /** * Whether to allow sending messages with an empty body. * * @var bool */ public $AllowEmpty = false; /** * DKIM selector. * * @var string */ public $DKIM_selector = ''; /** * DKIM Identity. * Usually the email address used as the source of the email. * * @var string */ public $DKIM_identity = ''; /** * DKIM passphrase. * Used if your key is encrypted. * * @var string */ public $DKIM_passphrase = ''; /** * DKIM signing domain name. * * @example 'example.com' * * @var string */ public $DKIM_domain = ''; /** * DKIM Copy header field values for diagnostic use. * * @var bool */ public $DKIM_copyHeaderFields = true; /** * DKIM Extra signing headers. * * @example ['List-Unsubscribe', 'List-Help'] * * @var array */ public $DKIM_extraHeaders = []; /** * DKIM private key file path. * * @var string */ public $DKIM_private = ''; /** * DKIM private key string. * * If set, takes precedence over `$DKIM_private`. * * @var string */ public $DKIM_private_string = ''; /** * Callback Action function name. * * The function that handles the result of the send email action. * It is called out by send() for each email sent. * * Value can be any php callable: http://www.php.net/is_callable * * Parameters: * bool $result result of the send action * array $to email addresses of the recipients * array $cc cc email addresses * array $bcc bcc email addresses * string $subject the subject * string $body the email body * string $from email address of sender * string $extra extra information of possible use * "smtp_transaction_id' => last smtp transaction id * * @var string */ public $action_function = ''; /** * What to put in the X-Mailer header. * Options: An empty string for PHPMailer default, whitespace/null for none, or a string to use. * * @var string|null */ public $XMailer = ''; /** * Which validator to use by default when validating email addresses. * May be a callable to inject your own validator, but there are several built-in validators. * The default validator uses PHP's FILTER_VALIDATE_EMAIL filter_var option. * * @see PHPMailer::validateAddress() * * @var string|callable */ public static $validator = 'php'; /** * An instance of the SMTP sender class. * * @var SMTP */ protected $smtp; /** * The array of 'to' names and addresses. * * @var array */ protected $to = []; /** * The array of 'cc' names and addresses. * * @var array */ protected $cc = []; /** * The array of 'bcc' names and addresses. * * @var array */ protected $bcc = []; /** * The array of reply-to names and addresses. * * @var array */ protected $ReplyTo = []; /** * An array of all kinds of addresses. * Includes all of $to, $cc, $bcc. * * @see PHPMailer::$to * @see PHPMailer::$cc * @see PHPMailer::$bcc * * @var array */ protected $all_recipients = []; /** * An array of names and addresses queued for validation. * In send(), valid and non duplicate entries are moved to $all_recipients * and one of $to, $cc, or $bcc. * This array is used only for addresses with IDN. * * @see PHPMailer::$to * @see PHPMailer::$cc * @see PHPMailer::$bcc * @see PHPMailer::$all_recipients * * @var array */ protected $RecipientsQueue = []; /** * An array of reply-to names and addresses queued for validation. * In send(), valid and non duplicate entries are moved to $ReplyTo. * This array is used only for addresses with IDN. * * @see PHPMailer::$ReplyTo * * @var array */ protected $ReplyToQueue = []; /** * The array of attachments. * * @var array */ protected $attachment = []; /** * The array of custom headers. * * @var array */ protected $CustomHeader = []; /** * The most recent Message-ID (including angular brackets). * * @var string */ protected $lastMessageID = ''; /** * The message's MIME type. * * @var string */ protected $message_type = ''; /** * The array of MIME boundary strings. * * @var array */ protected $boundary = []; /** * The array of available text strings for the current language. * * @var array */ protected $language = []; /** * The number of errors encountered. * * @var int */ protected $error_count = 0; /** * The S/MIME certificate file path. * * @var string */ protected $sign_cert_file = ''; /** * The S/MIME key file path. * * @var string */ protected $sign_key_file = ''; /** * The optional S/MIME extra certificates ("CA Chain") file path. * * @var string */ protected $sign_extracerts_file = ''; /** * The S/MIME password for the key. * Used only if the key is encrypted. * * @var string */ protected $sign_key_pass = ''; /** * Whether to throw exceptions for errors. * * @var bool */ protected $exceptions = false; /** * Unique ID used for message ID and boundaries. * * @var string */ protected $uniqueid = ''; /** * The PHPMailer Version number. * * @var string */ const VERSION = '6.8.0'; /** * Error severity: message only, continue processing. * * @var int */ const STOP_MESSAGE = 0; /** * Error severity: message, likely ok to continue processing. * * @var int */ const STOP_CONTINUE = 1; /** * Error severity: message, plus full stop, critical error reached. * * @var int */ const STOP_CRITICAL = 2; /** * The SMTP standard CRLF line break. * If you want to change line break format, change static::$LE, not this. */ const CRLF = "\r\n"; /** * "Folding White Space" a white space string used for line folding. */ const FWS = ' '; /** * SMTP RFC standard line ending; Carriage Return, Line Feed. * * @var string */ protected static $LE = self::CRLF; /** * The maximum line length supported by mail(). * * Background: mail() will sometimes corrupt messages * with headers headers longer than 65 chars, see #818. * * @var int */ const MAIL_MAX_LINE_LENGTH = 63; /** * The maximum line length allowed by RFC 2822 section 2.1.1. * * @var int */ const MAX_LINE_LENGTH = 998; /** * The lower maximum line length allowed by RFC 2822 section 2.1.1. * This length does NOT include the line break * 76 means that lines will be 77 or 78 chars depending on whether * the line break format is LF or CRLF; both are valid. * * @var int */ const STD_LINE_LENGTH = 76; /** * Constructor. * * @param bool $exceptions Should we throw external exceptions? */ public function __construct($exceptions = null) { if (null !== $exceptions) { $this->exceptions = (bool) $exceptions; } //Pick an appropriate debug output format automatically $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html'); } /** * Destructor. */ public function __destruct() { //Close any open SMTP connection nicely $this->smtpClose(); } /** * Call mail() in a safe_mode-aware fashion. * Also, unless sendmail_path points to sendmail (or something that * claims to be sendmail), don't pass params (not a perfect fix, * but it will do). * * @param string $to To * @param string $subject Subject * @param string $body Message Body * @param string $header Additional Header(s) * @param string|null $params Params * * @return bool */ private function mailPassthru($to, $subject, $body, $header, $params) { //Check overloading of mail function to avoid double-encoding if ((int)ini_get('mbstring.func_overload') & 1) { $subject = $this->secureHeader($subject); } else { $subject = $this->encodeHeader($this->secureHeader($subject)); } //Calling mail() with null params breaks $this->edebug('Sending with mail()'); $this->edebug('Sendmail path: ' . ini_get('sendmail_path')); $this->edebug("Envelope sender: {$this->Sender}"); $this->edebug("To: {$to}"); $this->edebug("Subject: {$subject}"); $this->edebug("Headers: {$header}"); if (!$this->UseSendmailOptions || null === $params) { $result = @mail($to, $subject, $body, $header); } else { $this->edebug("Additional params: {$params}"); $result = @mail($to, $subject, $body, $header, $params); } $this->edebug('Result: ' . ($result ? 'true' : 'false')); return $result; } /** * Output debugging info via a user-defined method. * Only generates output if debug output is enabled. * * @see PHPMailer::$Debugoutput * @see PHPMailer::$SMTPDebug * * @param string $str */ protected function edebug($str) { if ($this->SMTPDebug <= 0) { return; } //Is this a PSR-3 logger? if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) { $this->Debugoutput->debug($str); return; } //Avoid clash with built-in function names if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) { call_user_func($this->Debugoutput, $str, $this->SMTPDebug); return; } switch ($this->Debugoutput) { case 'error_log': //Don't output, just log /** @noinspection ForgottenDebugOutputInspection */ error_log($str); break; case 'html': //Cleans up output a bit for a better looking, HTML-safe output echo htmlentities( preg_replace('/[\r\n]+/', '', $str), ENT_QUOTES, 'UTF-8' ), "
            \n"; break; case 'echo': default: //Normalize line breaks $str = preg_replace('/\r\n|\r/m', "\n", $str); echo gmdate('Y-m-d H:i:s'), "\t", //Trim trailing space trim( //Indent for readability, except for trailing break str_replace( "\n", "\n \t ", trim($str) ) ), "\n"; } } /** * Sets message type to HTML or plain. * * @param bool $isHtml True for HTML mode */ public function isHTML($isHtml = true) { if ($isHtml) { $this->ContentType = static::CONTENT_TYPE_TEXT_HTML; } else { $this->ContentType = static::CONTENT_TYPE_PLAINTEXT; } } /** * Send messages using SMTP. */ public function isSMTP() { $this->Mailer = 'smtp'; } /** * Send messages using PHP's mail() function. */ public function isMail() { $this->Mailer = 'mail'; } /** * Send messages using $Sendmail. */ public function isSendmail() { $ini_sendmail_path = ini_get('sendmail_path'); if (false === stripos($ini_sendmail_path, 'sendmail')) { $this->Sendmail = '/usr/sbin/sendmail'; } else { $this->Sendmail = $ini_sendmail_path; } $this->Mailer = 'sendmail'; } /** * Send messages using qmail. */ public function isQmail() { $ini_sendmail_path = ini_get('sendmail_path'); if (false === stripos($ini_sendmail_path, 'qmail')) { $this->Sendmail = '/var/qmail/bin/qmail-inject'; } else { $this->Sendmail = $ini_sendmail_path; } $this->Mailer = 'qmail'; } /** * Add a "To" address. * * @param string $address The email address to send to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addAddress($address, $name = '') { return $this->addOrEnqueueAnAddress('to', $address, $name); } /** * Add a "CC" address. * * @param string $address The email address to send to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addCC($address, $name = '') { return $this->addOrEnqueueAnAddress('cc', $address, $name); } /** * Add a "BCC" address. * * @param string $address The email address to send to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addBCC($address, $name = '') { return $this->addOrEnqueueAnAddress('bcc', $address, $name); } /** * Add a "Reply-To" address. * * @param string $address The email address to reply to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addReplyTo($address, $name = '') { return $this->addOrEnqueueAnAddress('Reply-To', $address, $name); } /** * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still * be modified after calling this function), addition of such addresses is delayed until send(). * Addresses that have been added already return false, but do not throw exceptions. * * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' * @param string $address The email address * @param string $name An optional username associated with the address * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ protected function addOrEnqueueAnAddress($kind, $address, $name) { $pos = false; if ($address !== null) { $address = trim($address); $pos = strrpos($address, '@'); } if (false === $pos) { //At-sign is missing. $error_message = sprintf( '%s (%s): %s', $this->lang('invalid_address'), $kind, $address ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } if ($name !== null && is_string($name)) { $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim } else { $name = ''; } $params = [$kind, $address, $name]; //Enqueue addresses with IDN until we know the PHPMailer::$CharSet. //Domain is assumed to be whatever is after the last @ symbol in the address if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) { if ('Reply-To' !== $kind) { if (!array_key_exists($address, $this->RecipientsQueue)) { $this->RecipientsQueue[$address] = $params; return true; } } elseif (!array_key_exists($address, $this->ReplyToQueue)) { $this->ReplyToQueue[$address] = $params; return true; } return false; } //Immediately add standard addresses without IDN. return call_user_func_array([$this, 'addAnAddress'], $params); } /** * Set the boundaries to use for delimiting MIME parts. * If you override this, ensure you set all 3 boundaries to unique values. * The default boundaries include a "=_" sequence which cannot occur in quoted-printable bodies, * as suggested by https://www.rfc-editor.org/rfc/rfc2045#section-6.7 * * @return void */ public function setBoundaries() { $this->uniqueid = $this->generateId(); $this->boundary[1] = 'b1=_' . $this->uniqueid; $this->boundary[2] = 'b2=_' . $this->uniqueid; $this->boundary[3] = 'b3=_' . $this->uniqueid; } /** * Add an address to one of the recipient arrays or to the ReplyTo array. * Addresses that have been added already return false, but do not throw exceptions. * * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' * @param string $address The email address to send, resp. to reply to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ protected function addAnAddress($kind, $address, $name = '') { if (!in_array($kind, ['to', 'cc', 'bcc', 'Reply-To'])) { $error_message = sprintf( '%s: %s', $this->lang('Invalid recipient kind'), $kind ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } if (!static::validateAddress($address)) { $error_message = sprintf( '%s (%s): %s', $this->lang('invalid_address'), $kind, $address ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } if ('Reply-To' !== $kind) { if (!array_key_exists(strtolower($address), $this->all_recipients)) { $this->{$kind}[] = [$address, $name]; $this->all_recipients[strtolower($address)] = true; return true; } } elseif (!array_key_exists(strtolower($address), $this->ReplyTo)) { $this->ReplyTo[strtolower($address)] = [$address, $name]; return true; } return false; } /** * Parse and validate a string containing one or more RFC822-style comma-separated email addresses * of the form "display name
            " into an array of name/address pairs. * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. * Note that quotes in the name part are removed. * * @see http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation * * @param string $addrstr The address list string * @param bool $useimap Whether to use the IMAP extension to parse the list * @param string $charset The charset to use when decoding the address list string. * * @return array */ public static function parseAddresses($addrstr, $useimap = true, $charset = self::CHARSET_ISO88591) { $addresses = []; if ($useimap && function_exists('imap_rfc822_parse_adrlist')) { //Use this built-in parser if it's available $list = imap_rfc822_parse_adrlist($addrstr, ''); // Clear any potential IMAP errors to get rid of notices being thrown at end of script. imap_errors(); foreach ($list as $address) { if ( '.SYNTAX-ERROR.' !== $address->host && static::validateAddress($address->mailbox . '@' . $address->host) ) { //Decode the name part if it's present and encoded if ( property_exists($address, 'personal') && //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled defined('MB_CASE_UPPER') && preg_match('/^=\?.*\?=$/s', $address->personal) ) { $origCharset = mb_internal_encoding(); mb_internal_encoding($charset); //Undo any RFC2047-encoded spaces-as-underscores $address->personal = str_replace('_', '=20', $address->personal); //Decode the name $address->personal = mb_decode_mimeheader($address->personal); mb_internal_encoding($origCharset); } $addresses[] = [ 'name' => (property_exists($address, 'personal') ? $address->personal : ''), 'address' => $address->mailbox . '@' . $address->host, ]; } } } else { //Use this simpler parser $list = explode(',', $addrstr); foreach ($list as $address) { $address = trim($address); //Is there a separate name part? if (strpos($address, '<') === false) { //No separate name, just use the whole thing if (static::validateAddress($address)) { $addresses[] = [ 'name' => '', 'address' => $address, ]; } } else { list($name, $email) = explode('<', $address); $email = trim(str_replace('>', '', $email)); $name = trim($name); if (static::validateAddress($email)) { //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled //If this name is encoded, decode it if (defined('MB_CASE_UPPER') && preg_match('/^=\?.*\?=$/s', $name)) { $origCharset = mb_internal_encoding(); mb_internal_encoding($charset); //Undo any RFC2047-encoded spaces-as-underscores $name = str_replace('_', '=20', $name); //Decode the name $name = mb_decode_mimeheader($name); mb_internal_encoding($origCharset); } $addresses[] = [ //Remove any surrounding quotes and spaces from the name 'name' => trim($name, '\'" '), 'address' => $email, ]; } } } } return $addresses; } /** * Set the From and FromName properties. * * @param string $address * @param string $name * @param bool $auto Whether to also set the Sender address, defaults to true * * @throws Exception * * @return bool */ public function setFrom($address, $name = '', $auto = true) { $address = trim((string)$address); $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim //Don't validate now addresses with IDN. Will be done in send(). $pos = strrpos($address, '@'); if ( (false === $pos) || ((!$this->has8bitChars(substr($address, ++$pos)) || !static::idnSupported()) && !static::validateAddress($address)) ) { $error_message = sprintf( '%s (From): %s', $this->lang('invalid_address'), $address ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } $this->From = $address; $this->FromName = $name; if ($auto && empty($this->Sender)) { $this->Sender = $address; } return true; } /** * Return the Message-ID header of the last email. * Technically this is the value from the last time the headers were created, * but it's also the message ID of the last sent message except in * pathological cases. * * @return string */ public function getLastMessageID() { return $this->lastMessageID; } /** * Check that a string looks like an email address. * Validation patterns supported: * * `auto` Pick best pattern automatically; * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0; * * `pcre` Use old PCRE implementation; * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements. * * `noregex` Don't use a regex: super fast, really dumb. * Alternatively you may pass in a callable to inject your own validator, for example: * * ```php * PHPMailer::validateAddress('user@example.com', function($address) { * return (strpos($address, '@') !== false); * }); * ``` * * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator. * * @param string $address The email address to check * @param string|callable $patternselect Which pattern to use * * @return bool */ public static function validateAddress($address, $patternselect = null) { if (null === $patternselect) { $patternselect = static::$validator; } //Don't allow strings as callables, see SECURITY.md and CVE-2021-3603 if (is_callable($patternselect) && !is_string($patternselect)) { return call_user_func($patternselect, $address); } //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321 if (strpos($address, "\n") !== false || strpos($address, "\r") !== false) { return false; } switch ($patternselect) { case 'pcre': //Kept for BC case 'pcre8': /* * A more complex and more permissive version of the RFC5322 regex on which FILTER_VALIDATE_EMAIL * is based. * In addition to the addresses allowed by filter_var, also permits: * * dotless domains: `a@b` * * comments: `1234 @ local(blah) .machine .example` * * quoted elements: `'"test blah"@example.org'` * * numeric TLDs: `a@b.123` * * unbracketed IPv4 literals: `a@192.168.0.1` * * IPv6 literals: 'first.last@[IPv6:a1::]' * Not all of these will necessarily work for sending! * * @see http://squiloople.com/2009/12/20/email-address-validation/ * @copyright 2009-2010 Michael Rushton * Feel free to use and redistribute this code. But please keep this copyright notice. */ return (bool) preg_match( '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', $address ); case 'html5': /* * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. * * @see https://html.spec.whatwg.org/#e-mail-state-(type=email) */ return (bool) preg_match( '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', $address ); case 'php': default: return filter_var($address, FILTER_VALIDATE_EMAIL) !== false; } } /** * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the * `intl` and `mbstring` PHP extensions. * * @return bool `true` if required functions for IDN support are present */ public static function idnSupported() { return function_exists('idn_to_ascii') && function_exists('mb_convert_encoding'); } /** * Converts IDN in given email address to its ASCII form, also known as punycode, if possible. * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet. * This function silently returns unmodified address if: * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form) * - Conversion to punycode is impossible (e.g. required PHP functions are not available) * or fails for any reason (e.g. domain contains characters not allowed in an IDN). * * @see PHPMailer::$CharSet * * @param string $address The email address to convert * * @return string The encoded address in ASCII form */ public function punyencodeAddress($address) { //Verify we have required functions, CharSet, and at-sign. $pos = strrpos($address, '@'); if ( !empty($this->CharSet) && false !== $pos && static::idnSupported() ) { $domain = substr($address, ++$pos); //Verify CharSet string is a valid one, and domain properly encoded in this CharSet. if ($this->has8bitChars($domain) && @mb_check_encoding($domain, $this->CharSet)) { //Convert the domain from whatever charset it's in to UTF-8 $domain = mb_convert_encoding($domain, self::CHARSET_UTF8, $this->CharSet); //Ignore IDE complaints about this line - method signature changed in PHP 5.4 $errorcode = 0; if (defined('INTL_IDNA_VARIANT_UTS46')) { //Use the current punycode standard (appeared in PHP 7.2) $punycode = idn_to_ascii( $domain, \IDNA_DEFAULT | \IDNA_USE_STD3_RULES | \IDNA_CHECK_BIDI | \IDNA_CHECK_CONTEXTJ | \IDNA_NONTRANSITIONAL_TO_ASCII, \INTL_IDNA_VARIANT_UTS46 ); } elseif (defined('INTL_IDNA_VARIANT_2003')) { //Fall back to this old, deprecated/removed encoding $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_2003); } else { //Fall back to a default we don't know about $punycode = idn_to_ascii($domain, $errorcode); } if (false !== $punycode) { return substr($address, 0, $pos) . $punycode; } } } return $address; } /** * Create a message and send it. * Uses the sending method specified by $Mailer. * * @throws Exception * * @return bool false on error - See the ErrorInfo property for details of the error */ public function send() { try { if (!$this->preSend()) { return false; } return $this->postSend(); } catch (Exception $exc) { $this->mailHeader = ''; $this->setError($exc->getMessage()); if ($this->exceptions) { throw $exc; } return false; } } /** * Prepare a message for sending. * * @throws Exception * * @return bool */ public function preSend() { if ( 'smtp' === $this->Mailer || ('mail' === $this->Mailer && (\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0)) ) { //SMTP mandates RFC-compliant line endings //and it's also used with mail() on Windows static::setLE(self::CRLF); } else { //Maintain backward compatibility with legacy Linux command line mailers static::setLE(PHP_EOL); } //Check for buggy PHP versions that add a header with an incorrect line break if ( 'mail' === $this->Mailer && ((\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70017) || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70103)) && ini_get('mail.add_x_header') === '1' && stripos(PHP_OS, 'WIN') === 0 ) { trigger_error($this->lang('buggy_php'), E_USER_WARNING); } try { $this->error_count = 0; //Reset errors $this->mailHeader = ''; //Dequeue recipient and Reply-To addresses with IDN foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) { $params[1] = $this->punyencodeAddress($params[1]); call_user_func_array([$this, 'addAnAddress'], $params); } if (count($this->to) + count($this->cc) + count($this->bcc) < 1) { throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL); } //Validate From, Sender, and ConfirmReadingTo addresses foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) { $this->{$address_kind} = trim($this->{$address_kind}); if (empty($this->{$address_kind})) { continue; } $this->{$address_kind} = $this->punyencodeAddress($this->{$address_kind}); if (!static::validateAddress($this->{$address_kind})) { $error_message = sprintf( '%s (%s): %s', $this->lang('invalid_address'), $address_kind, $this->{$address_kind} ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } } //Set whether the message is multipart/alternative if ($this->alternativeExists()) { $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE; } $this->setMessageType(); //Refuse to send an empty message unless we are specifically allowing it if (!$this->AllowEmpty && empty($this->Body)) { throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL); } //Trim subject consistently $this->Subject = trim($this->Subject); //Create body before headers in case body makes changes to headers (e.g. altering transfer encoding) $this->MIMEHeader = ''; $this->MIMEBody = $this->createBody(); //createBody may have added some headers, so retain them $tempheaders = $this->MIMEHeader; $this->MIMEHeader = $this->createHeader(); $this->MIMEHeader .= $tempheaders; //To capture the complete message when using mail(), create //an extra header list which createHeader() doesn't fold in if ('mail' === $this->Mailer) { if (count($this->to) > 0) { $this->mailHeader .= $this->addrAppend('To', $this->to); } else { $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;'); } $this->mailHeader .= $this->headerLine( 'Subject', $this->encodeHeader($this->secureHeader($this->Subject)) ); } //Sign with DKIM if enabled if ( !empty($this->DKIM_domain) && !empty($this->DKIM_selector) && (!empty($this->DKIM_private_string) || (!empty($this->DKIM_private) && static::isPermittedPath($this->DKIM_private) && file_exists($this->DKIM_private) ) ) ) { $header_dkim = $this->DKIM_Add( $this->MIMEHeader . $this->mailHeader, $this->encodeHeader($this->secureHeader($this->Subject)), $this->MIMEBody ); $this->MIMEHeader = static::stripTrailingWSP($this->MIMEHeader) . static::$LE . static::normalizeBreaks($header_dkim) . static::$LE; } return true; } catch (Exception $exc) { $this->setError($exc->getMessage()); if ($this->exceptions) { throw $exc; } return false; } } /** * Actually send a message via the selected mechanism. * * @throws Exception * * @return bool */ public function postSend() { try { //Choose the mailer and send through it switch ($this->Mailer) { case 'sendmail': case 'qmail': return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody); case 'smtp': return $this->smtpSend($this->MIMEHeader, $this->MIMEBody); case 'mail': return $this->mailSend($this->MIMEHeader, $this->MIMEBody); default: $sendMethod = $this->Mailer . 'Send'; if (method_exists($this, $sendMethod)) { return $this->{$sendMethod}($this->MIMEHeader, $this->MIMEBody); } return $this->mailSend($this->MIMEHeader, $this->MIMEBody); } } catch (Exception $exc) { $this->setError($exc->getMessage()); $this->edebug($exc->getMessage()); if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true && $this->smtp->connected()) { $this->smtp->reset(); } if ($this->exceptions) { throw $exc; } } return false; } /** * Send mail using the $Sendmail program. * * @see PHPMailer::$Sendmail * * @param string $header The message headers * @param string $body The message body * * @throws Exception * * @return bool */ protected function sendmailSend($header, $body) { if ($this->Mailer === 'qmail') { $this->edebug('Sending with qmail'); } else { $this->edebug('Sending with sendmail'); } $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver //A space after `-f` is optional, but there is a long history of its presence //causing problems, so we don't use one //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html //Example problem: https://www.drupal.org/node/1057954 //PHP 5.6 workaround $sendmail_from_value = ini_get('sendmail_from'); if (empty($this->Sender) && !empty($sendmail_from_value)) { //PHP config has a sender address we can use $this->Sender = ini_get('sendmail_from'); } //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. if (!empty($this->Sender) && static::validateAddress($this->Sender) && self::isShellSafe($this->Sender)) { if ($this->Mailer === 'qmail') { $sendmailFmt = '%s -f%s'; } else { $sendmailFmt = '%s -oi -f%s -t'; } } else { //allow sendmail to choose a default envelope sender. It may //seem preferable to force it to use the From header as with //SMTP, but that introduces new problems (see //), and //it has historically worked this way. $sendmailFmt = '%s -oi -t'; } $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender); $this->edebug('Sendmail path: ' . $this->Sendmail); $this->edebug('Sendmail command: ' . $sendmail); $this->edebug('Envelope sender: ' . $this->Sender); $this->edebug("Headers: {$header}"); if ($this->SingleTo) { foreach ($this->SingleToArray as $toAddr) { $mail = @popen($sendmail, 'w'); if (!$mail) { throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); } $this->edebug("To: {$toAddr}"); fwrite($mail, 'To: ' . $toAddr . "\n"); fwrite($mail, $header); fwrite($mail, $body); $result = pclose($mail); $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); $this->doCallback( ($result === 0), [[$addrinfo['address'], $addrinfo['name']]], $this->cc, $this->bcc, $this->Subject, $body, $this->From, [] ); $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); if (0 !== $result) { throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); } } } else { $mail = @popen($sendmail, 'w'); if (!$mail) { throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); } fwrite($mail, $header); fwrite($mail, $body); $result = pclose($mail); $this->doCallback( ($result === 0), $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, [] ); $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); if (0 !== $result) { throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); } } return true; } /** * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters. * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows. * * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report * * @param string $string The string to be validated * * @return bool */ protected static function isShellSafe($string) { //It's not possible to use shell commands safely (which includes the mail() function) without escapeshellarg, //but some hosting providers disable it, creating a security problem that we don't want to have to deal with, //so we don't. if (!function_exists('escapeshellarg') || !function_exists('escapeshellcmd')) { return false; } if ( escapeshellcmd($string) !== $string || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""]) ) { return false; } $length = strlen($string); for ($i = 0; $i < $length; ++$i) { $c = $string[$i]; //All other characters have a special meaning in at least one common shell, including = and +. //Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here. //Note that this does permit non-Latin alphanumeric characters based on the current locale. if (!ctype_alnum($c) && strpos('@_-.', $c) === false) { return false; } } return true; } /** * Check whether a file path is of a permitted type. * Used to reject URLs and phar files from functions that access local file paths, * such as addAttachment. * * @param string $path A relative or absolute path to a file * * @return bool */ protected static function isPermittedPath($path) { //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1 return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path); } /** * Check whether a file path is safe, accessible, and readable. * * @param string $path A relative or absolute path to a file * * @return bool */ protected static function fileIsAccessible($path) { if (!static::isPermittedPath($path)) { return false; } $readable = is_file($path); //If not a UNC path (expected to start with \\), check read permission, see #2069 if (strpos($path, '\\\\') !== 0) { $readable = $readable && is_readable($path); } return $readable; } /** * Send mail using the PHP mail() function. * * @see http://www.php.net/manual/en/book.mail.php * * @param string $header The message headers * @param string $body The message body * * @throws Exception * * @return bool */ protected function mailSend($header, $body) { $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; $toArr = []; foreach ($this->to as $toaddr) { $toArr[] = $this->addrFormat($toaddr); } $to = trim(implode(', ', $toArr)); //If there are no To-addresses (e.g. when sending only to BCC-addresses) //the following should be added to get a correct DKIM-signature. //Compare with $this->preSend() if ($to === '') { $to = 'undisclosed-recipients:;'; } $params = null; //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver //A space after `-f` is optional, but there is a long history of its presence //causing problems, so we don't use one //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html //Example problem: https://www.drupal.org/node/1057954 //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. //PHP 5.6 workaround $sendmail_from_value = ini_get('sendmail_from'); if (empty($this->Sender) && !empty($sendmail_from_value)) { //PHP config has a sender address we can use $this->Sender = ini_get('sendmail_from'); } if (!empty($this->Sender) && static::validateAddress($this->Sender)) { if (self::isShellSafe($this->Sender)) { $params = sprintf('-f%s', $this->Sender); } $old_from = ini_get('sendmail_from'); ini_set('sendmail_from', $this->Sender); } $result = false; if ($this->SingleTo && count($toArr) > 1) { foreach ($toArr as $toAddr) { $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); $this->doCallback( $result, [[$addrinfo['address'], $addrinfo['name']]], $this->cc, $this->bcc, $this->Subject, $body, $this->From, [] ); } } else { $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params); $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, []); } if (isset($old_from)) { ini_set('sendmail_from', $old_from); } if (!$result) { throw new Exception($this->lang('instantiate'), self::STOP_CRITICAL); } return true; } /** * Get an instance to use for SMTP operations. * Override this function to load your own SMTP implementation, * or set one with setSMTPInstance. * * @return SMTP */ public function getSMTPInstance() { if (!is_object($this->smtp)) { $this->smtp = new SMTP(); } return $this->smtp; } /** * Provide an instance to use for SMTP operations. * * @return SMTP */ public function setSMTPInstance(SMTP $smtp) { $this->smtp = $smtp; return $this->smtp; } /** * Send mail via SMTP. * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. * * @see PHPMailer::setSMTPInstance() to use a different class. * * @uses \PHPMailer\PHPMailer\SMTP * * @param string $header The message headers * @param string $body The message body * * @throws Exception * * @return bool */ protected function smtpSend($header, $body) { $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; $bad_rcpt = []; if (!$this->smtpConnect($this->SMTPOptions)) { throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); } //Sender already validated in preSend() if ('' === $this->Sender) { $smtp_from = $this->From; } else { $smtp_from = $this->Sender; } if (!$this->smtp->mail($smtp_from)) { $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); throw new Exception($this->ErrorInfo, self::STOP_CRITICAL); } $callbacks = []; //Attempt to send to all recipients foreach ([$this->to, $this->cc, $this->bcc] as $togroup) { foreach ($togroup as $to) { if (!$this->smtp->recipient($to[0], $this->dsn)) { $error = $this->smtp->getError(); $bad_rcpt[] = ['to' => $to[0], 'error' => $error['detail']]; $isSent = false; } else { $isSent = true; } $callbacks[] = ['issent' => $isSent, 'to' => $to[0], 'name' => $to[1]]; } } //Only send the DATA command if we have viable recipients if ((count($this->all_recipients) > count($bad_rcpt)) && !$this->smtp->data($header . $body)) { throw new Exception($this->lang('data_not_accepted'), self::STOP_CRITICAL); } $smtp_transaction_id = $this->smtp->getLastTransactionID(); if ($this->SMTPKeepAlive) { $this->smtp->reset(); } else { $this->smtp->quit(); $this->smtp->close(); } foreach ($callbacks as $cb) { $this->doCallback( $cb['issent'], [[$cb['to'], $cb['name']]], [], [], $this->Subject, $body, $this->From, ['smtp_transaction_id' => $smtp_transaction_id] ); } //Create error message for any bad addresses if (count($bad_rcpt) > 0) { $errstr = ''; foreach ($bad_rcpt as $bad) { $errstr .= $bad['to'] . ': ' . $bad['error']; } throw new Exception($this->lang('recipients_failed') . $errstr, self::STOP_CONTINUE); } return true; } /** * Initiate a connection to an SMTP server. * Returns false if the operation failed. * * @param array $options An array of options compatible with stream_context_create() * * @throws Exception * * @uses \PHPMailer\PHPMailer\SMTP * * @return bool */ public function smtpConnect($options = null) { if (null === $this->smtp) { $this->smtp = $this->getSMTPInstance(); } //If no options are provided, use whatever is set in the instance if (null === $options) { $options = $this->SMTPOptions; } //Already connected? if ($this->smtp->connected()) { return true; } $this->smtp->setTimeout($this->Timeout); $this->smtp->setDebugLevel($this->SMTPDebug); $this->smtp->setDebugOutput($this->Debugoutput); $this->smtp->setVerp($this->do_verp); if ($this->Host === null) { $this->Host = 'localhost'; } $hosts = explode(';', $this->Host); $lastexception = null; foreach ($hosts as $hostentry) { $hostinfo = []; if ( !preg_match( '/^(?:(ssl|tls):\/\/)?(.+?)(?::(\d+))?$/', trim($hostentry), $hostinfo ) ) { $this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry)); //Not a valid host entry continue; } //$hostinfo[1]: optional ssl or tls prefix //$hostinfo[2]: the hostname //$hostinfo[3]: optional port number //The host string prefix can temporarily override the current setting for SMTPSecure //If it's not specified, the default value is used //Check the host name is a valid name or IP address before trying to use it if (!static::isValidHost($hostinfo[2])) { $this->edebug($this->lang('invalid_host') . ' ' . $hostinfo[2]); continue; } $prefix = ''; $secure = $this->SMTPSecure; $tls = (static::ENCRYPTION_STARTTLS === $this->SMTPSecure); if ('ssl' === $hostinfo[1] || ('' === $hostinfo[1] && static::ENCRYPTION_SMTPS === $this->SMTPSecure)) { $prefix = 'ssl://'; $tls = false; //Can't have SSL and TLS at the same time $secure = static::ENCRYPTION_SMTPS; } elseif ('tls' === $hostinfo[1]) { $tls = true; //TLS doesn't use a prefix $secure = static::ENCRYPTION_STARTTLS; } //Do we need the OpenSSL extension? $sslext = defined('OPENSSL_ALGO_SHA256'); if (static::ENCRYPTION_STARTTLS === $secure || static::ENCRYPTION_SMTPS === $secure) { //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled if (!$sslext) { throw new Exception($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL); } } $host = $hostinfo[2]; $port = $this->Port; if ( array_key_exists(3, $hostinfo) && is_numeric($hostinfo[3]) && $hostinfo[3] > 0 && $hostinfo[3] < 65536 ) { $port = (int) $hostinfo[3]; } if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { try { if ($this->Helo) { $hello = $this->Helo; } else { $hello = $this->serverHostname(); } $this->smtp->hello($hello); //Automatically enable TLS encryption if: //* it's not disabled //* we have openssl extension //* we are not already using SSL //* the server offers STARTTLS if ($this->SMTPAutoTLS && $sslext && 'ssl' !== $secure && $this->smtp->getServerExt('STARTTLS')) { $tls = true; } if ($tls) { if (!$this->smtp->startTLS()) { $message = $this->getSmtpErrorMessage('connect_host'); throw new Exception($message); } //We must resend EHLO after TLS negotiation $this->smtp->hello($hello); } if ( $this->SMTPAuth && !$this->smtp->authenticate( $this->Username, $this->Password, $this->AuthType, $this->oauth ) ) { throw new Exception($this->lang('authenticate')); } return true; } catch (Exception $exc) { $lastexception = $exc; $this->edebug($exc->getMessage()); //We must have connected, but then failed TLS or Auth, so close connection nicely $this->smtp->quit(); } } } //If we get here, all connection attempts have failed, so close connection hard $this->smtp->close(); //As we've caught all exceptions, just report whatever the last one was if ($this->exceptions && null !== $lastexception) { throw $lastexception; } if ($this->exceptions) { // no exception was thrown, likely $this->smtp->connect() failed $message = $this->getSmtpErrorMessage('connect_host'); throw new Exception($message); } return false; } /** * Close the active SMTP session if one exists. */ public function smtpClose() { if ((null !== $this->smtp) && $this->smtp->connected()) { $this->smtp->quit(); $this->smtp->close(); } } /** * Set the language for error messages. * The default language is English. * * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr") * Optionally, the language code can be enhanced with a 4-character * script annotation and/or a 2-character country annotation. * @param string $lang_path Path to the language file directory, with trailing separator (slash) * Do not set this from user input! * * @return bool Returns true if the requested language was loaded, false otherwise. */ public function setLanguage($langcode = 'en', $lang_path = '') { //Backwards compatibility for renamed language codes $renamed_langcodes = [ 'br' => 'pt_br', 'cz' => 'cs', 'dk' => 'da', 'no' => 'nb', 'se' => 'sv', 'rs' => 'sr', 'tg' => 'tl', 'am' => 'hy', ]; if (array_key_exists($langcode, $renamed_langcodes)) { $langcode = $renamed_langcodes[$langcode]; } //Define full set of translatable strings in English $PHPMAILER_LANG = [ 'authenticate' => 'SMTP Error: Could not authenticate.', 'buggy_php' => 'Your version of PHP is affected by a bug that may result in corrupted messages.' . ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' . ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.', 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', 'data_not_accepted' => 'SMTP Error: data not accepted.', 'empty_message' => 'Message body empty', 'encoding' => 'Unknown encoding: ', 'execute' => 'Could not execute: ', 'extension_missing' => 'Extension missing: ', 'file_access' => 'Could not access file: ', 'file_open' => 'File Error: Could not open file: ', 'from_failed' => 'The following From address failed: ', 'instantiate' => 'Could not instantiate mail function.', 'invalid_address' => 'Invalid address: ', 'invalid_header' => 'Invalid header name or value', 'invalid_hostentry' => 'Invalid hostentry: ', 'invalid_host' => 'Invalid host: ', 'mailer_not_supported' => ' mailer is not supported.', 'provide_address' => 'You must provide at least one recipient email address.', 'recipients_failed' => 'SMTP Error: The following recipients failed: ', 'signing' => 'Signing Error: ', 'smtp_code' => 'SMTP code: ', 'smtp_code_ex' => 'Additional SMTP info: ', 'smtp_connect_failed' => 'SMTP connect() failed.', 'smtp_detail' => 'Detail: ', 'smtp_error' => 'SMTP server error: ', 'variable_set' => 'Cannot set or reset variable: ', ]; if (empty($lang_path)) { //Calculate an absolute path so it can work if CWD is not here $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR; } //Validate $langcode $foundlang = true; $langcode = strtolower($langcode); if ( !preg_match('/^(?P[a-z]{2})(?P'); } elseif ($format === 'js') { self::writeOutput(self::generateScript()); } self::reset(); } } /** * Forget all logged records */ public static function reset() { self::$records = array(); } /** * Wrapper for register_shutdown_function to allow overriding */ protected function registerShutdownFunction() { if (PHP_SAPI !== 'cli') { register_shutdown_function(array('Monolog\Handler\BrowserConsoleHandler', 'send')); } } /** * Wrapper for echo to allow overriding * * @param string $str */ protected static function writeOutput($str) { echo $str; } /** * Checks the format of the response * * If Content-Type is set to application/javascript or text/javascript -> js * If Content-Type is set to text/html, or is unset -> html * If Content-Type is anything else -> unknown * * @return string One of 'js', 'html' or 'unknown' */ protected static function getResponseFormat() { // Check content type foreach (headers_list() as $header) { if (stripos($header, 'content-type:') === 0) { // This handler only works with HTML and javascript outputs // text/javascript is obsolete in favour of application/javascript, but still used if (stripos($header, 'application/javascript') !== false || stripos($header, 'text/javascript') !== false) { return 'js'; } if (stripos($header, 'text/html') === false) { return 'unknown'; } break; } } return 'html'; } private static function generateScript() { $script = array(); foreach (self::$records as $record) { $context = self::dump('Context', $record['context']); $extra = self::dump('Extra', $record['extra']); if (empty($context) && empty($extra)) { $script[] = self::call_array('log', self::handleStyles($record['formatted'])); } else { $script = array_merge($script, array(self::call_array('groupCollapsed', self::handleStyles($record['formatted']))), $context, $extra, array(self::call('groupEnd')) ); } } return "(function (c) {if (c && c.groupCollapsed) {\n" . implode("\n", $script) . "\n}})(console);"; } private static function handleStyles($formatted) { $args = array(self::quote('font-weight: normal')); $format = '%c' . $formatted; preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); foreach (array_reverse($matches) as $match) { $args[] = self::quote(self::handleCustomStyles($match[2][0], $match[1][0])); $args[] = '"font-weight: normal"'; $pos = $match[0][1]; $format = substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . substr($format, $pos + strlen($match[0][0])); } array_unshift($args, self::quote($format)); return $args; } private static function handleCustomStyles($style, $string) { static $colors = array('blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey'); static $labels = array(); return preg_replace_callback('/macro\s*:(.*?)(?:;|$)/', function ($m) use ($string, &$colors, &$labels) { if (trim($m[1]) === 'autolabel') { // Format the string as a label with consistent auto assigned background color if (!isset($labels[$string])) { $labels[$string] = $colors[count($labels) % count($colors)]; } $color = $labels[$string]; return "background-color: $color; color: white; border-radius: 3px; padding: 0 2px 0 2px"; } return $m[1]; }, $style); } private static function dump($title, array $dict) { $script = array(); $dict = array_filter($dict); if (empty($dict)) { return $script; } $script[] = self::call('log', self::quote('%c%s'), self::quote('font-weight: bold'), self::quote($title)); foreach ($dict as $key => $value) { $value = json_encode($value); if (empty($value)) { $value = self::quote(''); } $script[] = self::call('log', self::quote('%s: %o'), self::quote($key), $value); } return $script; } private static function quote($arg) { return '"' . addcslashes($arg, "\"\n\\") . '"'; } private static function call() { $args = func_get_args(); $method = array_shift($args); return self::call_array($method, $args); } private static function call_array($method, array $args) { return 'c.' . $method . '(' . implode(', ', $args) . ');'; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Buffers all records until closing the handler and then pass them as batch. * * This is useful for a MailHandler to send only one mail per request instead of * sending one per log message. * * @author Christophe Coevoet */ class BufferHandler extends AbstractHandler { protected $handler; protected $bufferSize = 0; protected $bufferLimit; protected $flushOnOverflow; protected $buffer = array(); protected $initialized = false; /** * @param HandlerInterface $handler Handler. * @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not * @param Boolean $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded */ public function __construct(HandlerInterface $handler, $bufferLimit = 0, $level = Logger::DEBUG, $bubble = true, $flushOnOverflow = false) { parent::__construct($level, $bubble); $this->handler = $handler; $this->bufferLimit = (int) $bufferLimit; $this->flushOnOverflow = $flushOnOverflow; } /** * {@inheritdoc} */ public function handle(array $record) { if ($record['level'] < $this->level) { return false; } if (!$this->initialized) { // __destructor() doesn't get called on Fatal errors register_shutdown_function(array($this, 'close')); $this->initialized = true; } if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) { if ($this->flushOnOverflow) { $this->flush(); } else { array_shift($this->buffer); $this->bufferSize--; } } if ($this->processors) { foreach ($this->processors as $processor) { $record = call_user_func($processor, $record); } } $this->buffer[] = $record; $this->bufferSize++; return false === $this->bubble; } public function flush() { if ($this->bufferSize === 0) { return; } $this->handler->handleBatch($this->buffer); $this->clear(); } public function __destruct() { // suppress the parent behavior since we already have register_shutdown_function() // to call close(), and the reference contained there will prevent this from being // GC'd until the end of the request } /** * {@inheritdoc} */ public function close() { $this->flush(); } /** * Clears the buffer without flushing any messages down to the wrapped handler. */ public function clear() { $this->bufferSize = 0; $this->buffer = array(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\ChromePHPFormatter; use Monolog\Logger; /** * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/) * * This also works out of the box with Firefox 43+ * * @author Christophe Coevoet */ class ChromePHPHandler extends AbstractProcessingHandler { /** * Version of the extension */ const VERSION = '4.0'; /** * Header name */ const HEADER_NAME = 'X-ChromeLogger-Data'; /** * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+) */ const USER_AGENT_REGEX = '{\b(?:Chrome/\d+(?:\.\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\d|\d{3,})(?:\.\d)*)\b}'; protected static $initialized = false; /** * Tracks whether we sent too much data * * Chrome limits the headers to 256KB, so when we sent 240KB we stop sending * * @var Boolean */ protected static $overflowed = false; protected static $json = array( 'version' => self::VERSION, 'columns' => array('label', 'log', 'backtrace', 'type'), 'rows' => array(), ); protected static $sendHeaders = true; /** * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($level = Logger::DEBUG, $bubble = true) { parent::__construct($level, $bubble); if (!function_exists('json_encode')) { throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s ChromePHPHandler'); } } /** * {@inheritdoc} */ public function handleBatch(array $records) { $messages = array(); foreach ($records as $record) { if ($record['level'] < $this->level) { continue; } $messages[] = $this->processRecord($record); } if (!empty($messages)) { $messages = $this->getFormatter()->formatBatch($messages); self::$json['rows'] = array_merge(self::$json['rows'], $messages); $this->send(); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new ChromePHPFormatter(); } /** * Creates & sends header for a record * * @see sendHeader() * @see send() * @param array $record */ protected function write(array $record) { self::$json['rows'][] = $record['formatted']; $this->send(); } /** * Sends the log header * * @see sendHeader() */ protected function send() { if (self::$overflowed || !self::$sendHeaders) { return; } if (!self::$initialized) { self::$initialized = true; self::$sendHeaders = $this->headersAccepted(); if (!self::$sendHeaders) { return; } self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; } $json = @json_encode(self::$json); $data = base64_encode(utf8_encode($json)); if (strlen($data) > 240 * 1024) { self::$overflowed = true; $record = array( 'message' => 'Incomplete logs, chrome header size limit reached', 'context' => array(), 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'monolog', 'datetime' => new \DateTime(), 'extra' => array(), ); self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); $json = @json_encode(self::$json); $data = base64_encode(utf8_encode($json)); } if (trim($data) !== '') { $this->sendHeader(self::HEADER_NAME, $data); } } /** * Send header string to the client * * @param string $header * @param string $content */ protected function sendHeader($header, $content) { if (!headers_sent() && self::$sendHeaders) { header(sprintf('%s: %s', $header, $content)); } } /** * Verifies if the headers are accepted by the current user agent * * @return Boolean */ protected function headersAccepted() { if (empty($_SERVER['HTTP_USER_AGENT'])) { return false; } return preg_match(self::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']); } /** * BC getter for the sendHeaders property that has been made static */ public function __get($property) { if ('sendHeaders' !== $property) { throw new \InvalidArgumentException('Undefined property '.$property); } return static::$sendHeaders; } /** * BC setter for the sendHeaders property that has been made static */ public function __set($property, $value) { if ('sendHeaders' !== $property) { throw new \InvalidArgumentException('Undefined property '.$property); } static::$sendHeaders = $value; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\JsonFormatter; use Monolog\Logger; /** * CouchDB handler * * @author Markus Bachmann */ class CouchDBHandler extends AbstractProcessingHandler { private $options; public function __construct(array $options = array(), $level = Logger::DEBUG, $bubble = true) { $this->options = array_merge(array( 'host' => 'localhost', 'port' => 5984, 'dbname' => 'logger', 'username' => null, 'password' => null, ), $options); parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record) { $basicAuth = null; if ($this->options['username']) { $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']); } $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname']; $context = stream_context_create(array( 'http' => array( 'method' => 'POST', 'content' => $record['formatted'], 'ignore_errors' => true, 'max_redirects' => 0, 'header' => 'Content-type: application/json', ), )); if (false === @file_get_contents($url, null, $context)) { throw new \RuntimeException(sprintf('Could not connect to %s', $url)); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Logs to Cube. * * @link http://square.github.com/cube/ * @author Wan Chen */ class CubeHandler extends AbstractProcessingHandler { private $udpConnection; private $httpConnection; private $scheme; private $host; private $port; private $acceptedSchemes = array('http', 'udp'); /** * Create a Cube handler * * @throws \UnexpectedValueException when given url is not a valid url. * A valid url must consist of three parts : protocol://host:port * Only valid protocols used by Cube are http and udp */ public function __construct($url, $level = Logger::DEBUG, $bubble = true) { $urlInfo = parse_url($url); if (!isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) { throw new \UnexpectedValueException('URL "'.$url.'" is not valid'); } if (!in_array($urlInfo['scheme'], $this->acceptedSchemes)) { throw new \UnexpectedValueException( 'Invalid protocol (' . $urlInfo['scheme'] . ').' . ' Valid options are ' . implode(', ', $this->acceptedSchemes)); } $this->scheme = $urlInfo['scheme']; $this->host = $urlInfo['host']; $this->port = $urlInfo['port']; parent::__construct($level, $bubble); } /** * Establish a connection to an UDP socket * * @throws \LogicException when unable to connect to the socket * @throws MissingExtensionException when there is no socket extension */ protected function connectUdp() { if (!extension_loaded('sockets')) { throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler'); } $this->udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0); if (!$this->udpConnection) { throw new \LogicException('Unable to create a socket'); } if (!socket_connect($this->udpConnection, $this->host, $this->port)) { throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port); } } /** * Establish a connection to a http server * @throws \LogicException when no curl extension */ protected function connectHttp() { if (!extension_loaded('curl')) { throw new \LogicException('The curl extension is needed to use http URLs with the CubeHandler'); } $this->httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put'); if (!$this->httpConnection) { throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port); } curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true); } /** * {@inheritdoc} */ protected function write(array $record) { $date = $record['datetime']; $data = array('time' => $date->format('Y-m-d\TH:i:s.uO')); unset($record['datetime']); if (isset($record['context']['type'])) { $data['type'] = $record['context']['type']; unset($record['context']['type']); } else { $data['type'] = $record['channel']; } $data['data'] = $record['context']; $data['data']['level'] = $record['level']; if ($this->scheme === 'http') { $this->writeHttp(json_encode($data)); } else { $this->writeUdp(json_encode($data)); } } private function writeUdp($data) { if (!$this->udpConnection) { $this->connectUdp(); } socket_send($this->udpConnection, $data, strlen($data), 0); } private function writeHttp($data) { if (!$this->httpConnection) { $this->connectHttp(); } curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']'); curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen('['.$data.']'), )); Curl\Util::execute($this->httpConnection, 5, false); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\Curl; class Util { private static $retriableErrorCodes = array( CURLE_COULDNT_RESOLVE_HOST, CURLE_COULDNT_CONNECT, CURLE_HTTP_NOT_FOUND, CURLE_READ_ERROR, CURLE_OPERATION_TIMEOUTED, CURLE_HTTP_POST_ERROR, CURLE_SSL_CONNECT_ERROR, ); /** * Executes a CURL request with optional retries and exception on failure * * @param resource $ch curl handler * @throws \RuntimeException */ public static function execute($ch, $retries = 5, $closeAfterDone = true) { while ($retries--) { if (curl_exec($ch) === false) { $curlErrno = curl_errno($ch); if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || !$retries) { $curlError = curl_error($ch); if ($closeAfterDone) { curl_close($ch); } throw new \RuntimeException(sprintf('Curl error (code %s): %s', $curlErrno, $curlError)); } continue; } if ($closeAfterDone) { curl_close($ch); } break; } } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Simple handler wrapper that deduplicates log records across multiple requests * * It also includes the BufferHandler functionality and will buffer * all messages until the end of the request or flush() is called. * * This works by storing all log records' messages above $deduplicationLevel * to the file specified by $deduplicationStore. When further logs come in at the end of the * request (or when flush() is called), all those above $deduplicationLevel are checked * against the existing stored logs. If they match and the timestamps in the stored log is * not older than $time seconds, the new log record is discarded. If no log record is new, the * whole data set is discarded. * * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers * that send messages to people, to avoid spamming with the same message over and over in case of * a major component failure like a database server being down which makes all requests fail in the * same way. * * @author Jordi Boggiano */ class DeduplicationHandler extends BufferHandler { /** * @var string */ protected $deduplicationStore; /** * @var int */ protected $deduplicationLevel; /** * @var int */ protected $time; /** * @var bool */ private $gc = false; /** * @param HandlerInterface $handler Handler. * @param string $deduplicationStore The file/path where the deduplication log should be kept * @param int $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes * @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(HandlerInterface $handler, $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, $time = 60, $bubble = true) { parent::__construct($handler, 0, Logger::DEBUG, $bubble, false); $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore; $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel); $this->time = $time; } public function flush() { if ($this->bufferSize === 0) { return; } $passthru = null; foreach ($this->buffer as $record) { if ($record['level'] >= $this->deduplicationLevel) { $passthru = $passthru || !$this->isDuplicate($record); if ($passthru) { $this->appendRecord($record); } } } // default of null is valid as well as if no record matches duplicationLevel we just pass through if ($passthru === true || $passthru === null) { $this->handler->handleBatch($this->buffer); } $this->clear(); if ($this->gc) { $this->collectLogs(); } } private function isDuplicate(array $record) { if (!file_exists($this->deduplicationStore)) { return false; } $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); if (!is_array($store)) { return false; } $yesterday = time() - 86400; $timestampValidity = $record['datetime']->getTimestamp() - $this->time; $expectedMessage = preg_replace('{[\r\n].*}', '', $record['message']); for ($i = count($store) - 1; $i >= 0; $i--) { list($timestamp, $level, $message) = explode(':', $store[$i], 3); if ($level === $record['level_name'] && $message === $expectedMessage && $timestamp > $timestampValidity) { return true; } if ($timestamp < $yesterday) { $this->gc = true; } } return false; } private function collectLogs() { if (!file_exists($this->deduplicationStore)) { return false; } $handle = fopen($this->deduplicationStore, 'rw+'); flock($handle, LOCK_EX); $validLogs = array(); $timestampValidity = time() - $this->time; while (!feof($handle)) { $log = fgets($handle); if (substr($log, 0, 10) >= $timestampValidity) { $validLogs[] = $log; } } ftruncate($handle, 0); rewind($handle); foreach ($validLogs as $log) { fwrite($handle, $log); } flock($handle, LOCK_UN); fclose($handle); $this->gc = false; } private function appendRecord(array $record) { file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . preg_replace('{[\r\n].*}', '', $record['message']) . "\n", FILE_APPEND); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\NormalizerFormatter; use Doctrine\CouchDB\CouchDBClient; /** * CouchDB handler for Doctrine CouchDB ODM * * @author Markus Bachmann */ class DoctrineCouchDBHandler extends AbstractProcessingHandler { private $client; public function __construct(CouchDBClient $client, $level = Logger::DEBUG, $bubble = true) { $this->client = $client; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record) { $this->client->postDocument($record['formatted']); } protected function getDefaultFormatter() { return new NormalizerFormatter; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Aws\Sdk; use Aws\DynamoDb\DynamoDbClient; use Aws\DynamoDb\Marshaler; use Monolog\Formatter\ScalarFormatter; use Monolog\Logger; /** * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/) * * @link https://github.com/aws/aws-sdk-php/ * @author Andrew Lawson */ class DynamoDbHandler extends AbstractProcessingHandler { const DATE_FORMAT = 'Y-m-d\TH:i:s.uO'; /** * @var DynamoDbClient */ protected $client; /** * @var string */ protected $table; /** * @var int */ protected $version; /** * @var Marshaler */ protected $marshaler; /** * @param DynamoDbClient $client * @param string $table * @param int $level * @param bool $bubble */ public function __construct(DynamoDbClient $client, $table, $level = Logger::DEBUG, $bubble = true) { if (defined('Aws\Sdk::VERSION') && version_compare(Sdk::VERSION, '3.0', '>=')) { $this->version = 3; $this->marshaler = new Marshaler; } else { $this->version = 2; } $this->client = $client; $this->table = $table; parent::__construct($level, $bubble); } /** * {@inheritdoc} */ protected function write(array $record) { $filtered = $this->filterEmptyFields($record['formatted']); if ($this->version === 3) { $formatted = $this->marshaler->marshalItem($filtered); } else { $formatted = $this->client->formatAttributes($filtered); } $this->client->putItem(array( 'TableName' => $this->table, 'Item' => $formatted, )); } /** * @param array $record * @return array */ protected function filterEmptyFields(array $record) { return array_filter($record, function ($value) { return !empty($value) || false === $value || 0 === $value; }); } /** * {@inheritdoc} */ protected function getDefaultFormatter() { return new ScalarFormatter(self::DATE_FORMAT); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\ElasticaFormatter; use Monolog\Logger; use Elastica\Client; use Elastica\Exception\ExceptionInterface; /** * Elastic Search handler * * Usage example: * * $client = new \Elastica\Client(); * $options = array( * 'index' => 'elastic_index_name', * 'type' => 'elastic_doc_type', * ); * $handler = new ElasticSearchHandler($client, $options); * $log = new Logger('application'); * $log->pushHandler($handler); * * @author Jelle Vink */ class ElasticSearchHandler extends AbstractProcessingHandler { /** * @var Client */ protected $client; /** * @var array Handler config options */ protected $options = array(); /** * @param Client $client Elastica Client object * @param array $options Handler configuration * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(Client $client, array $options = array(), $level = Logger::DEBUG, $bubble = true) { parent::__construct($level, $bubble); $this->client = $client; $this->options = array_merge( array( 'index' => 'monolog', // Elastic index name 'type' => 'record', // Elastic document type 'ignore_error' => false, // Suppress Elastica exceptions ), $options ); } /** * {@inheritDoc} */ protected function write(array $record) { $this->bulkSend(array($record['formatted'])); } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { if ($formatter instanceof ElasticaFormatter) { return parent::setFormatter($formatter); } throw new \InvalidArgumentException('ElasticSearchHandler is only compatible with ElasticaFormatter'); } /** * Getter options * @return array */ public function getOptions() { return $this->options; } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new ElasticaFormatter($this->options['index'], $this->options['type']); } /** * {@inheritdoc} */ public function handleBatch(array $records) { $documents = $this->getFormatter()->formatBatch($records); $this->bulkSend($documents); } /** * Use Elasticsearch bulk API to send list of documents * @param array $documents * @throws \RuntimeException */ protected function bulkSend(array $documents) { try { $this->client->addDocuments($documents); } catch (ExceptionInterface $e) { if (!$this->options['ignore_error']) { throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e); } } } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Logger; /** * Stores to PHP error_log() handler. * * @author Elan Ruusamäe */ class ErrorLogHandler extends AbstractProcessingHandler { const OPERATING_SYSTEM = 0; const SAPI = 4; protected $messageType; protected $expandNewlines; /** * @param int $messageType Says where the error should go. * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not * @param Boolean $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries */ public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = true, $expandNewlines = false) { parent::__construct($level, $bubble); if (false === in_array($messageType, self::getAvailableTypes())) { $message = sprintf('The given message type "%s" is not supported', print_r($messageType, true)); throw new \InvalidArgumentException($message); } $this->messageType = $messageType; $this->expandNewlines = $expandNewlines; } /** * @return array With all available types */ public static function getAvailableTypes() { return array( self::OPERATING_SYSTEM, self::SAPI, ); } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%'); } /** * {@inheritdoc} */ protected function write(array $record) { if ($this->expandNewlines) { $lines = preg_split('{[\r\n]+}', (string) $record['formatted']); foreach ($lines as $line) { error_log($line, $this->messageType); } } else { error_log((string) $record['formatted'], $this->messageType); } } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Simple handler wrapper that filters records based on a list of levels * * It can be configured with an exact list of levels to allow, or a min/max level. * * @author Hennadiy Verkh * @author Jordi Boggiano */ class FilterHandler extends AbstractHandler { /** * Handler or factory callable($record, $this) * * @var callable|\Monolog\Handler\HandlerInterface */ protected $handler; /** * Minimum level for logs that are passed to handler * * @var int[] */ protected $acceptedLevels; /** * Whether the messages that are handled can bubble up the stack or not * * @var Boolean */ protected $bubble; /** * @param callable|HandlerInterface $handler Handler or factory callable($record, $this). * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided * @param int $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, $bubble = true) { $this->handler = $handler; $this->bubble = $bubble; $this->setAcceptedLevels($minLevelOrList, $maxLevel); if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); } } /** * @return array */ public function getAcceptedLevels() { return array_flip($this->acceptedLevels); } /** * @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided * @param int|string $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array */ public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY) { if (is_array($minLevelOrList)) { $acceptedLevels = array_map('Monolog\Logger::toMonologLevel', $minLevelOrList); } else { $minLevelOrList = Logger::toMonologLevel($minLevelOrList); $maxLevel = Logger::toMonologLevel($maxLevel); $acceptedLevels = array_values(array_filter(Logger::getLevels(), function ($level) use ($minLevelOrList, $maxLevel) { return $level >= $minLevelOrList && $level <= $maxLevel; })); } $this->acceptedLevels = array_flip($acceptedLevels); } /** * {@inheritdoc} */ public function isHandling(array $record) { return isset($this->acceptedLevels[$record['level']]); } /** * {@inheritdoc} */ public function handle(array $record) { if (!$this->isHandling($record)) { return false; } // The same logic as in FingersCrossedHandler if (!$this->handler instanceof HandlerInterface) { $this->handler = call_user_func($this->handler, $record, $this); if (!$this->handler instanceof HandlerInterface) { throw new \RuntimeException("The factory callable should return a HandlerInterface"); } } if ($this->processors) { foreach ($this->processors as $processor) { $record = call_user_func($processor, $record); } } $this->handler->handle($record); return false === $this->bubble; } /** * {@inheritdoc} */ public function handleBatch(array $records) { $filtered = array(); foreach ($records as $record) { if ($this->isHandling($record)) { $filtered[] = $record; } } $this->handler->handleBatch($filtered); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\FingersCrossed; /** * Interface for activation strategies for the FingersCrossedHandler. * * @author Johannes M. Schmitt */ interface ActivationStrategyInterface { /** * Returns whether the given record activates the handler. * * @param array $record * @return Boolean */ public function isHandlerActivated(array $record); } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\FingersCrossed; use Monolog\Logger; /** * Channel and Error level based monolog activation strategy. Allows to trigger activation * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except * for records of the 'sql' channel; those should trigger activation on level 'WARN'. * * Example: * * * $activationStrategy = new ChannelLevelActivationStrategy( * Logger::CRITICAL, * array( * 'request' => Logger::ALERT, * 'sensitive' => Logger::ERROR, * ) * ); * $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy); * * * @author Mike Meessen */ class ChannelLevelActivationStrategy implements ActivationStrategyInterface { private $defaultActionLevel; private $channelToActionLevel; /** * @param int $defaultActionLevel The default action level to be used if the record's category doesn't match any * @param array $channelToActionLevel An array that maps channel names to action levels. */ public function __construct($defaultActionLevel, $channelToActionLevel = array()) { $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel); $this->channelToActionLevel = array_map('Monolog\Logger::toMonologLevel', $channelToActionLevel); } public function isHandlerActivated(array $record) { if (isset($this->channelToActionLevel[$record['channel']])) { return $record['level'] >= $this->channelToActionLevel[$record['channel']]; } return $record['level'] >= $this->defaultActionLevel; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\FingersCrossed; use Monolog\Logger; /** * Error level based activation strategy. * * @author Johannes M. Schmitt */ class ErrorLevelActivationStrategy implements ActivationStrategyInterface { private $actionLevel; public function __construct($actionLevel) { $this->actionLevel = Logger::toMonologLevel($actionLevel); } public function isHandlerActivated(array $record) { return $record['level'] >= $this->actionLevel; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; use Monolog\Handler\FingersCrossed\ActivationStrategyInterface; use Monolog\Logger; /** * Buffers all records until a certain level is reached * * The advantage of this approach is that you don't get any clutter in your log files. * Only requests which actually trigger an error (or whatever your actionLevel is) will be * in the logs, but they will contain all records, not only those above the level threshold. * * You can find the various activation strategies in the * Monolog\Handler\FingersCrossed\ namespace. * * @author Jordi Boggiano */ class FingersCrossedHandler extends AbstractHandler { protected $handler; protected $activationStrategy; protected $buffering = true; protected $bufferSize; protected $buffer = array(); protected $stopBuffering; protected $passthruLevel; /** * @param callable|HandlerInterface $handler Handler or factory callable($record, $fingersCrossedHandler). * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not * @param Boolean $stopBuffering Whether the handler should stop buffering after being triggered (default true) * @param int $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered */ public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true, $passthruLevel = null) { if (null === $activationStrategy) { $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING); } // convert simple int activationStrategy to an object if (!$activationStrategy instanceof ActivationStrategyInterface) { $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy); } $this->handler = $handler; $this->activationStrategy = $activationStrategy; $this->bufferSize = $bufferSize; $this->bubble = $bubble; $this->stopBuffering = $stopBuffering; if ($passthruLevel !== null) { $this->passthruLevel = Logger::toMonologLevel($passthruLevel); } if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); } } /** * {@inheritdoc} */ public function isHandling(array $record) { return true; } /** * Manually activate this logger regardless of the activation strategy */ public function activate() { if ($this->stopBuffering) { $this->buffering = false; } if (!$this->handler instanceof HandlerInterface) { $record = end($this->buffer) ?: null; $this->handler = call_user_func($this->handler, $record, $this); if (!$this->handler instanceof HandlerInterface) { throw new \RuntimeException("The factory callable should return a HandlerInterface"); } } $this->handler->handleBatch($this->buffer); $this->buffer = array(); } /** * {@inheritdoc} */ public function handle(array $record) { if ($this->processors) { foreach ($this->processors as $processor) { $record = call_user_func($processor, $record); } } if ($this->buffering) { $this->buffer[] = $record; if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) { array_shift($this->buffer); } if ($this->activationStrategy->isHandlerActivated($record)) { $this->activate(); } } else { $this->handler->handle($record); } return false === $this->bubble; } /** * {@inheritdoc} */ public function close() { if (null !== $this->passthruLevel) { $level = $this->passthruLevel; $this->buffer = array_filter($this->buffer, function ($record) use ($level) { return $record['level'] >= $level; }); if (count($this->buffer) > 0) { $this->handler->handleBatch($this->buffer); $this->buffer = array(); } } } /** * Resets the state of the handler. Stops forwarding records to the wrapped handler. */ public function reset() { $this->buffering = true; } /** * Clears the buffer without flushing any messages down to the wrapped handler. * * It also resets the handler to its initial buffering state. */ public function clear() { $this->buffer = array(); $this->reset(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\WildfireFormatter; /** * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol. * * @author Eric Clemmons (@ericclemmons) */ class FirePHPHandler extends AbstractProcessingHandler { /** * WildFire JSON header message format */ const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; /** * FirePHP structure for parsing messages & their presentation */ const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; /** * Must reference a "known" plugin, otherwise headers won't display in FirePHP */ const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3'; /** * Header prefix for Wildfire to recognize & parse headers */ const HEADER_PREFIX = 'X-Wf'; /** * Whether or not Wildfire vendor-specific headers have been generated & sent yet */ protected static $initialized = false; /** * Shared static message index between potentially multiple handlers * @var int */ protected static $messageIndex = 1; protected static $sendHeaders = true; /** * Base header creation function used by init headers & record headers * * @param array $meta Wildfire Plugin, Protocol & Structure Indexes * @param string $message Log message * @return array Complete header string ready for the client as key and message as value */ protected function createHeader(array $meta, $message) { $header = sprintf('%s-%s', self::HEADER_PREFIX, join('-', $meta)); return array($header => $message); } /** * Creates message header from record * * @see createHeader() * @param array $record * @return string */ protected function createRecordHeader(array $record) { // Wildfire is extensible to support multiple protocols & plugins in a single request, // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake. return $this->createHeader( array(1, 1, 1, self::$messageIndex++), $record['formatted'] ); } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new WildfireFormatter(); } /** * Wildfire initialization headers to enable message parsing * * @see createHeader() * @see sendHeader() * @return array */ protected function getInitHeaders() { // Initial payload consists of required headers for Wildfire return array_merge( $this->createHeader(array('Protocol', 1), self::PROTOCOL_URI), $this->createHeader(array(1, 'Structure', 1), self::STRUCTURE_URI), $this->createHeader(array(1, 'Plugin', 1), self::PLUGIN_URI) ); } /** * Send header string to the client * * @param string $header * @param string $content */ protected function sendHeader($header, $content) { if (!headers_sent() && self::$sendHeaders) { header(sprintf('%s: %s', $header, $content)); } } /** * Creates & sends header for a record, ensuring init headers have been sent prior * * @see sendHeader() * @see sendInitHeaders() * @param array $record */ protected function write(array $record) { if (!self::$sendHeaders) { return; } // WildFire-specific headers must be sent prior to any messages if (!self::$initialized) { self::$initialized = true; self::$sendHeaders = $this->headersAccepted(); if (!self::$sendHeaders) { return; } foreach ($this->getInitHeaders() as $header => $content) { $this->sendHeader($header, $content); } } $header = $this->createRecordHeader($record); if (trim(current($header)) !== '') { $this->sendHeader(key($header), current($header)); } } /** * Verifies if the headers are accepted by the current user agent * * @return Boolean */ protected function headersAccepted() { if (!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])) { return true; } return isset($_SERVER['HTTP_X_FIREPHP_VERSION']); } /** * BC getter for the sendHeaders property that has been made static */ public function __get($property) { if ('sendHeaders' !== $property) { throw new \InvalidArgumentException('Undefined property '.$property); } return static::$sendHeaders; } /** * BC setter for the sendHeaders property that has been made static */ public function __set($property, $value) { if ('sendHeaders' !== $property) { throw new \InvalidArgumentException('Undefined property '.$property); } static::$sendHeaders = $value; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Logger; /** * Sends logs to Fleep.io using Webhook integrations * * You'll need a Fleep.io account to use this handler. * * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation * @author Ando Roots */ class FleepHookHandler extends SocketHandler { const FLEEP_HOST = 'fleep.io'; const FLEEP_HOOK_URI = '/hook/'; /** * @var string Webhook token (specifies the conversation where logs are sent) */ protected $token; /** * Construct a new Fleep.io Handler. * * For instructions on how to create a new web hook in your conversations * see https://fleep.io/integrations/webhooks/ * * @param string $token Webhook token * @param bool|int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @throws MissingExtensionException */ public function __construct($token, $level = Logger::DEBUG, $bubble = true) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler'); } $this->token = $token; $connectionString = 'ssl://' . self::FLEEP_HOST . ':443'; parent::__construct($connectionString, $level, $bubble); } /** * Returns the default formatter to use with this handler * * Overloaded to remove empty context and extra arrays from the end of the log message. * * @return LineFormatter */ protected function getDefaultFormatter() { return new LineFormatter(null, null, true, true); } /** * Handles a log record * * @param array $record */ public function write(array $record) { parent::write($record); $this->closeSocket(); } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the header of the API Call * * @param string $content * @return string */ private function buildHeader($content) { $header = "POST " . self::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n"; $header .= "Host: " . self::FLEEP_HOST . "\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } /** * Builds the body of API call * * @param array $record * @return string */ private function buildContent($record) { $dataArray = array( 'message' => $record['formatted'], ); return http_build_query($dataArray); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\FlowdockFormatter; use Monolog\Formatter\FormatterInterface; /** * Sends notifications through the Flowdock push API * * This must be configured with a FlowdockFormatter instance via setFormatter() * * Notes: * API token - Flowdock API token * * @author Dominik Liebler * @see https://www.flowdock.com/api/push */ class FlowdockHandler extends SocketHandler { /** * @var string */ protected $apiToken; /** * @param string $apiToken * @param bool|int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * * @throws MissingExtensionException if OpenSSL is missing */ public function __construct($apiToken, $level = Logger::DEBUG, $bubble = true) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler'); } parent::__construct('ssl://api.flowdock.com:443', $level, $bubble); $this->apiToken = $apiToken; } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { if (!$formatter instanceof FlowdockFormatter) { throw new \InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); } return parent::setFormatter($formatter); } /** * Gets the default formatter. * * @return FormatterInterface */ protected function getDefaultFormatter() { throw new \InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); } /** * {@inheritdoc} * * @param array $record */ protected function write(array $record) { parent::write($record); $this->closeSocket(); } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the body of API call * * @param array $record * @return string */ private function buildContent($record) { return json_encode($record['formatted']['flowdock']); } /** * Builds the header of the API Call * * @param string $content * @return string */ private function buildHeader($content) { $header = "POST /v1/messages/team_inbox/" . $this->apiToken . " HTTP/1.1\r\n"; $header .= "Host: api.flowdock.com\r\n"; $header .= "Content-Type: application/json\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Gelf\IMessagePublisher; use Gelf\PublisherInterface; use Gelf\Publisher; use InvalidArgumentException; use Monolog\Logger; use Monolog\Formatter\GelfMessageFormatter; /** * Handler to send messages to a Graylog2 (http://www.graylog2.org) server * * @author Matt Lehner * @author Benjamin Zikarsky */ class GelfHandler extends AbstractProcessingHandler { /** * @var Publisher the publisher object that sends the message to the server */ protected $publisher; /** * @param PublisherInterface|IMessagePublisher|Publisher $publisher a publisher object * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($publisher, $level = Logger::DEBUG, $bubble = true) { parent::__construct($level, $bubble); if (!$publisher instanceof Publisher && !$publisher instanceof IMessagePublisher && !$publisher instanceof PublisherInterface) { throw new InvalidArgumentException('Invalid publisher, expected a Gelf\Publisher, Gelf\IMessagePublisher or Gelf\PublisherInterface instance'); } $this->publisher = $publisher; } /** * {@inheritdoc} */ public function close() { $this->publisher = null; } /** * {@inheritdoc} */ protected function write(array $record) { $this->publisher->publish($record['formatted']); } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new GelfMessageFormatter(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; /** * Forwards records to multiple handlers * * @author Lenar Lõhmus */ class GroupHandler extends AbstractHandler { protected $handlers; /** * @param array $handlers Array of Handlers. * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(array $handlers, $bubble = true) { foreach ($handlers as $handler) { if (!$handler instanceof HandlerInterface) { throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.'); } } $this->handlers = $handlers; $this->bubble = $bubble; } /** * {@inheritdoc} */ public function isHandling(array $record) { foreach ($this->handlers as $handler) { if ($handler->isHandling($record)) { return true; } } return false; } /** * {@inheritdoc} */ public function handle(array $record) { if ($this->processors) { foreach ($this->processors as $processor) { $record = call_user_func($processor, $record); } } foreach ($this->handlers as $handler) { $handler->handle($record); } return false === $this->bubble; } /** * {@inheritdoc} */ public function handleBatch(array $records) { if ($this->processors) { $processed = array(); foreach ($records as $record) { foreach ($this->processors as $processor) { $processed[] = call_user_func($processor, $record); } } $records = $processed; } foreach ($this->handlers as $handler) { $handler->handleBatch($records); } } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { foreach ($this->handlers as $handler) { $handler->setFormatter($formatter); } return $this; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; /** * Interface that all Monolog Handlers must implement * * @author Jordi Boggiano */ interface HandlerInterface { /** * Checks whether the given record will be handled by this handler. * * This is mostly done for performance reasons, to avoid calling processors for nothing. * * Handlers should still check the record levels within handle(), returning false in isHandling() * is no guarantee that handle() will not be called, and isHandling() might not be called * for a given record. * * @param array $record Partial log record containing only a level key * * @return Boolean */ public function isHandling(array $record); /** * Handles a record. * * All records may be passed to this method, and the handler should discard * those that it does not want to handle. * * The return value of this function controls the bubbling process of the handler stack. * Unless the bubbling is interrupted (by returning true), the Logger class will keep on * calling further handlers in the stack with a given log record. * * @param array $record The record to handle * @return Boolean true means that this handler handled the record, and that bubbling is not permitted. * false means the record was either not processed or that this handler allows bubbling. */ public function handle(array $record); /** * Handles a set of records at once. * * @param array $records The records to handle (an array of record arrays) */ public function handleBatch(array $records); /** * Adds a processor in the stack. * * @param callable $callback * @return self */ public function pushProcessor($callback); /** * Removes the processor on top of the stack and returns it. * * @return callable */ public function popProcessor(); /** * Sets the formatter. * * @param FormatterInterface $formatter * @return self */ public function setFormatter(FormatterInterface $formatter); /** * Gets the formatter. * * @return FormatterInterface */ public function getFormatter(); } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; /** * This simple wrapper class can be used to extend handlers functionality. * * Example: A custom filtering that can be applied to any handler. * * Inherit from this class and override handle() like this: * * public function handle(array $record) * { * if ($record meets certain conditions) { * return false; * } * return $this->handler->handle($record); * } * * @author Alexey Karapetov */ class HandlerWrapper implements HandlerInterface { /** * @var HandlerInterface */ protected $handler; /** * HandlerWrapper constructor. * @param HandlerInterface $handler */ public function __construct(HandlerInterface $handler) { $this->handler = $handler; } /** * {@inheritdoc} */ public function isHandling(array $record) { return $this->handler->isHandling($record); } /** * {@inheritdoc} */ public function handle(array $record) { return $this->handler->handle($record); } /** * {@inheritdoc} */ public function handleBatch(array $records) { return $this->handler->handleBatch($records); } /** * {@inheritdoc} */ public function pushProcessor($callback) { $this->handler->pushProcessor($callback); return $this; } /** * {@inheritdoc} */ public function popProcessor() { return $this->handler->popProcessor(); } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { $this->handler->setFormatter($formatter); return $this; } /** * {@inheritdoc} */ public function getFormatter() { return $this->handler->getFormatter(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Sends notifications through the hipchat api to a hipchat room * * Notes: * API token - HipChat API token * Room - HipChat Room Id or name, where messages are sent * Name - Name used to send the message (from) * notify - Should the message trigger a notification in the clients * version - The API version to use (HipChatHandler::API_V1 | HipChatHandler::API_V2) * * @author Rafael Dohms * @see https://www.hipchat.com/docs/api */ class HipChatHandler extends SocketHandler { /** * Use API version 1 */ const API_V1 = 'v1'; /** * Use API version v2 */ const API_V2 = 'v2'; /** * The maximum allowed length for the name used in the "from" field. */ const MAXIMUM_NAME_LENGTH = 15; /** * The maximum allowed length for the message. */ const MAXIMUM_MESSAGE_LENGTH = 9500; /** * @var string */ private $token; /** * @var string */ private $room; /** * @var string */ private $name; /** * @var bool */ private $notify; /** * @var string */ private $format; /** * @var string */ private $host; /** * @var string */ private $version; /** * @param string $token HipChat API Token * @param string $room The room that should be alerted of the message (Id or Name) * @param string $name Name used in the "from" field. * @param bool $notify Trigger a notification in clients or not * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param bool $useSSL Whether to connect via SSL. * @param string $format The format of the messages (default to text, can be set to html if you have html in the messages) * @param string $host The HipChat server hostname. * @param string $version The HipChat API version (default HipChatHandler::API_V1) */ public function __construct($token, $room, $name = 'Monolog', $notify = false, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $format = 'text', $host = 'api.hipchat.com', $version = self::API_V1) { if ($version == self::API_V1 && !$this->validateStringLength($name, static::MAXIMUM_NAME_LENGTH)) { throw new \InvalidArgumentException('The supplied name is too long. HipChat\'s v1 API supports names up to 15 UTF-8 characters.'); } $connectionString = $useSSL ? 'ssl://'.$host.':443' : $host.':80'; parent::__construct($connectionString, $level, $bubble); $this->token = $token; $this->name = $name; $this->notify = $notify; $this->room = $room; $this->format = $format; $this->host = $host; $this->version = $version; } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the body of API call * * @param array $record * @return string */ private function buildContent($record) { $dataArray = array( 'notify' => $this->version == self::API_V1 ? ($this->notify ? 1 : 0) : ($this->notify ? 'true' : 'false'), 'message' => $record['formatted'], 'message_format' => $this->format, 'color' => $this->getAlertColor($record['level']), ); if (!$this->validateStringLength($dataArray['message'], static::MAXIMUM_MESSAGE_LENGTH)) { if (function_exists('mb_substr')) { $dataArray['message'] = mb_substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH).' [truncated]'; } else { $dataArray['message'] = substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH).' [truncated]'; } } // if we are using the legacy API then we need to send some additional information if ($this->version == self::API_V1) { $dataArray['room_id'] = $this->room; } // append the sender name if it is set // always append it if we use the v1 api (it is required in v1) if ($this->version == self::API_V1 || $this->name !== null) { $dataArray['from'] = (string) $this->name; } return http_build_query($dataArray); } /** * Builds the header of the API Call * * @param string $content * @return string */ private function buildHeader($content) { if ($this->version == self::API_V1) { $header = "POST /v1/rooms/message?format=json&auth_token={$this->token} HTTP/1.1\r\n"; } else { // needed for rooms with special (spaces, etc) characters in the name $room = rawurlencode($this->room); $header = "POST /v2/room/{$room}/notification?auth_token={$this->token} HTTP/1.1\r\n"; } $header .= "Host: {$this->host}\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } /** * Assigns a color to each level of log records. * * @param int $level * @return string */ protected function getAlertColor($level) { switch (true) { case $level >= Logger::ERROR: return 'red'; case $level >= Logger::WARNING: return 'yellow'; case $level >= Logger::INFO: return 'green'; case $level == Logger::DEBUG: return 'gray'; default: return 'yellow'; } } /** * {@inheritdoc} * * @param array $record */ protected function write(array $record) { parent::write($record); $this->closeSocket(); } /** * {@inheritdoc} */ public function handleBatch(array $records) { if (count($records) == 0) { return true; } $batchRecords = $this->combineRecords($records); $handled = false; foreach ($batchRecords as $batchRecord) { if ($this->isHandling($batchRecord)) { $this->write($batchRecord); $handled = true; } } if (!$handled) { return false; } return false === $this->bubble; } /** * Combines multiple records into one. Error level of the combined record * will be the highest level from the given records. Datetime will be taken * from the first record. * * @param $records * @return array */ private function combineRecords($records) { $batchRecord = null; $batchRecords = array(); $messages = array(); $formattedMessages = array(); $level = 0; $levelName = null; $datetime = null; foreach ($records as $record) { $record = $this->processRecord($record); if ($record['level'] > $level) { $level = $record['level']; $levelName = $record['level_name']; } if (null === $datetime) { $datetime = $record['datetime']; } $messages[] = $record['message']; $messageStr = implode(PHP_EOL, $messages); $formattedMessages[] = $this->getFormatter()->format($record); $formattedMessageStr = implode('', $formattedMessages); $batchRecord = array( 'message' => $messageStr, 'formatted' => $formattedMessageStr, 'context' => array(), 'extra' => array(), ); if (!$this->validateStringLength($batchRecord['formatted'], static::MAXIMUM_MESSAGE_LENGTH)) { // Pop the last message and implode the remaining messages $lastMessage = array_pop($messages); $lastFormattedMessage = array_pop($formattedMessages); $batchRecord['message'] = implode(PHP_EOL, $messages); $batchRecord['formatted'] = implode('', $formattedMessages); $batchRecords[] = $batchRecord; $messages = array($lastMessage); $formattedMessages = array($lastFormattedMessage); $batchRecord = null; } } if (null !== $batchRecord) { $batchRecords[] = $batchRecord; } // Set the max level and datetime for all records foreach ($batchRecords as &$batchRecord) { $batchRecord = array_merge( $batchRecord, array( 'level' => $level, 'level_name' => $levelName, 'datetime' => $datetime, ) ); } return $batchRecords; } /** * Validates the length of a string. * * If the `mb_strlen()` function is available, it will use that, as HipChat * allows UTF-8 characters. Otherwise, it will fall back to `strlen()`. * * Note that this might cause false failures in the specific case of using * a valid name with less than 16 characters, but 16 or more bytes, on a * system where `mb_strlen()` is unavailable. * * @param string $str * @param int $length * * @return bool */ private function validateStringLength($str, $length) { if (function_exists('mb_strlen')) { return (mb_strlen($str) <= $length); } return (strlen($str) <= $length); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * IFTTTHandler uses cURL to trigger IFTTT Maker actions * * Register a secret key and trigger/event name at https://ifttt.com/maker * * value1 will be the channel from monolog's Logger constructor, * value2 will be the level name (ERROR, WARNING, ..) * value3 will be the log record's message * * @author Nehal Patel */ class IFTTTHandler extends AbstractProcessingHandler { private $eventName; private $secretKey; /** * @param string $eventName The name of the IFTTT Maker event that should be triggered * @param string $secretKey A valid IFTTT secret key * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($eventName, $secretKey, $level = Logger::ERROR, $bubble = true) { $this->eventName = $eventName; $this->secretKey = $secretKey; parent::__construct($level, $bubble); } /** * {@inheritdoc} */ public function write(array $record) { $postData = array( "value1" => $record["channel"], "value2" => $record["level_name"], "value3" => $record["message"], ); $postString = json_encode($postData); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postString); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type: application/json", )); Curl\Util::execute($ch); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * @author Robert Kaufmann III */ class LogEntriesHandler extends SocketHandler { /** * @var string */ protected $logToken; /** * @param string $token Log token supplied by LogEntries * @param bool $useSSL Whether or not SSL encryption should be used. * @param int $level The minimum logging level to trigger this handler * @param bool $bubble Whether or not messages that are handled should bubble up the stack. * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true) { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); } $endpoint = $useSSL ? 'ssl://data.logentries.com:443' : 'data.logentries.com:80'; parent::__construct($endpoint, $level, $bubble); $this->logToken = $token; } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { return $this->logToken . ' ' . $record['formatted']; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\LogglyFormatter; /** * Sends errors to Loggly. * * @author Przemek Sobstel * @author Adam Pancutt * @author Gregory Barchard */ class LogglyHandler extends AbstractProcessingHandler { const HOST = 'logs-01.loggly.com'; const ENDPOINT_SINGLE = 'inputs'; const ENDPOINT_BATCH = 'bulk'; protected $token; protected $tag = array(); public function __construct($token, $level = Logger::DEBUG, $bubble = true) { if (!extension_loaded('curl')) { throw new \LogicException('The curl extension is needed to use the LogglyHandler'); } $this->token = $token; parent::__construct($level, $bubble); } public function setTag($tag) { $tag = !empty($tag) ? $tag : array(); $this->tag = is_array($tag) ? $tag : array($tag); } public function addTag($tag) { if (!empty($tag)) { $tag = is_array($tag) ? $tag : array($tag); $this->tag = array_unique(array_merge($this->tag, $tag)); } } protected function write(array $record) { $this->send($record["formatted"], self::ENDPOINT_SINGLE); } public function handleBatch(array $records) { $level = $this->level; $records = array_filter($records, function ($record) use ($level) { return ($record['level'] >= $level); }); if ($records) { $this->send($this->getFormatter()->formatBatch($records), self::ENDPOINT_BATCH); } } protected function send($data, $endpoint) { $url = sprintf("https://%s/%s/%s/", self::HOST, $endpoint, $this->token); $headers = array('Content-Type: application/json'); if (!empty($this->tag)) { $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); Curl\Util::execute($ch); } protected function getDefaultFormatter() { return new LogglyFormatter(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Base class for all mail handlers * * @author Gyula Sallai */ abstract class MailHandler extends AbstractProcessingHandler { /** * {@inheritdoc} */ public function handleBatch(array $records) { $messages = array(); foreach ($records as $record) { if ($record['level'] < $this->level) { continue; } $messages[] = $this->processRecord($record); } if (!empty($messages)) { $this->send((string) $this->getFormatter()->formatBatch($messages), $messages); } } /** * Send a mail with the given content * * @param string $content formatted email body to be sent * @param array $records the array of log records that formed this content */ abstract protected function send($content, array $records); /** * {@inheritdoc} */ protected function write(array $record) { $this->send((string) $record['formatted'], array($record)); } protected function getHighestRecord(array $records) { $highestRecord = null; foreach ($records as $record) { if ($highestRecord === null || $highestRecord['level'] < $record['level']) { $highestRecord = $record; } } return $highestRecord; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * MandrillHandler uses cURL to send the emails to the Mandrill API * * @author Adam Nicholson */ class MandrillHandler extends MailHandler { protected $message; protected $apiKey; /** * @param string $apiKey A valid Mandrill API key * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($apiKey, $message, $level = Logger::ERROR, $bubble = true) { parent::__construct($level, $bubble); if (!$message instanceof \Swift_Message && is_callable($message)) { $message = call_user_func($message); } if (!$message instanceof \Swift_Message) { throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it'); } $this->message = $message; $this->apiKey = $apiKey; } /** * {@inheritdoc} */ protected function send($content, array $records) { $message = clone $this->message; $message->setBody($content); $message->setDate(time()); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array( 'key' => $this->apiKey, 'raw_message' => (string) $message, 'async' => false, ))); Curl\Util::execute($ch); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Exception can be thrown if an extension for an handler is missing * * @author Christian Bergau */ class MissingExtensionException extends \Exception { } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\NormalizerFormatter; /** * Logs to a MongoDB database. * * usage example: * * $log = new Logger('application'); * $mongodb = new MongoDBHandler(new \Mongo("mongodb://localhost:27017"), "logs", "prod"); * $log->pushHandler($mongodb); * * @author Thomas Tourlourat */ class MongoDBHandler extends AbstractProcessingHandler { protected $mongoCollection; public function __construct($mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true) { if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo || $mongo instanceof \MongoDB\Client)) { throw new \InvalidArgumentException('MongoClient, Mongo or MongoDB\Client instance required'); } $this->mongoCollection = $mongo->selectCollection($database, $collection); parent::__construct($level, $bubble); } protected function write(array $record) { if ($this->mongoCollection instanceof \MongoDB\Collection) { $this->mongoCollection->insertOne($record["formatted"]); } else { $this->mongoCollection->save($record["formatted"]); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new NormalizerFormatter(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\LineFormatter; /** * NativeMailerHandler uses the mail() function to send the emails * * @author Christophe Coevoet * @author Mark Garrett */ class NativeMailerHandler extends MailHandler { /** * The email addresses to which the message will be sent * @var array */ protected $to; /** * The subject of the email * @var string */ protected $subject; /** * Optional headers for the message * @var array */ protected $headers = array(); /** * Optional parameters for the message * @var array */ protected $parameters = array(); /** * The wordwrap length for the message * @var int */ protected $maxColumnWidth; /** * The Content-type for the message * @var string */ protected $contentType = 'text/plain'; /** * The encoding for the message * @var string */ protected $encoding = 'utf-8'; /** * @param string|array $to The receiver of the mail * @param string $subject The subject of the mail * @param string $from The sender of the mail * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param int $maxColumnWidth The maximum column width that the message lines will have */ public function __construct($to, $subject, $from, $level = Logger::ERROR, $bubble = true, $maxColumnWidth = 70) { parent::__construct($level, $bubble); $this->to = is_array($to) ? $to : array($to); $this->subject = $subject; $this->addHeader(sprintf('From: %s', $from)); $this->maxColumnWidth = $maxColumnWidth; } /** * Add headers to the message * * @param string|array $headers Custom added headers * @return self */ public function addHeader($headers) { foreach ((array) $headers as $header) { if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) { throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); } $this->headers[] = $header; } return $this; } /** * Add parameters to the message * * @param string|array $parameters Custom added parameters * @return self */ public function addParameter($parameters) { $this->parameters = array_merge($this->parameters, (array) $parameters); return $this; } /** * {@inheritdoc} */ protected function send($content, array $records) { $content = wordwrap($content, $this->maxColumnWidth); $headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n"); $headers .= 'Content-type: ' . $this->getContentType() . '; charset=' . $this->getEncoding() . "\r\n"; if ($this->getContentType() == 'text/html' && false === strpos($headers, 'MIME-Version:')) { $headers .= 'MIME-Version: 1.0' . "\r\n"; } $subject = $this->subject; if ($records) { $subjectFormatter = new LineFormatter($this->subject); $subject = $subjectFormatter->format($this->getHighestRecord($records)); } $parameters = implode(' ', $this->parameters); foreach ($this->to as $to) { mail($to, $subject, $content, $headers, $parameters); } } /** * @return string $contentType */ public function getContentType() { return $this->contentType; } /** * @return string $encoding */ public function getEncoding() { return $this->encoding; } /** * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML * messages. * @return self */ public function setContentType($contentType) { if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) { throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection'); } $this->contentType = $contentType; return $this; } /** * @param string $encoding * @return self */ public function setEncoding($encoding) { if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) { throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection'); } $this->encoding = $encoding; return $this; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\NormalizerFormatter; /** * Class to record a log on a NewRelic application. * Enabling New Relic High Security mode may prevent capture of useful information. * * @see https://docs.newrelic.com/docs/agents/php-agent * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security */ class NewRelicHandler extends AbstractProcessingHandler { /** * Name of the New Relic application that will receive logs from this handler. * * @var string */ protected $appName; /** * Name of the current transaction * * @var string */ protected $transactionName; /** * Some context and extra data is passed into the handler as arrays of values. Do we send them as is * (useful if we are using the API), or explode them for display on the NewRelic RPM website? * * @var bool */ protected $explodeArrays; /** * {@inheritDoc} * * @param string $appName * @param bool $explodeArrays * @param string $transactionName */ public function __construct( $level = Logger::ERROR, $bubble = true, $appName = null, $explodeArrays = false, $transactionName = null ) { parent::__construct($level, $bubble); $this->appName = $appName; $this->explodeArrays = $explodeArrays; $this->transactionName = $transactionName; } /** * {@inheritDoc} */ protected function write(array $record) { if (!$this->isNewRelicEnabled()) { throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler'); } if ($appName = $this->getAppName($record['context'])) { $this->setNewRelicAppName($appName); } if ($transactionName = $this->getTransactionName($record['context'])) { $this->setNewRelicTransactionName($transactionName); unset($record['formatted']['context']['transaction_name']); } if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) { newrelic_notice_error($record['message'], $record['context']['exception']); unset($record['formatted']['context']['exception']); } else { newrelic_notice_error($record['message']); } if (isset($record['formatted']['context']) && is_array($record['formatted']['context'])) { foreach ($record['formatted']['context'] as $key => $parameter) { if (is_array($parameter) && $this->explodeArrays) { foreach ($parameter as $paramKey => $paramValue) { $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue); } } else { $this->setNewRelicParameter('context_' . $key, $parameter); } } } if (isset($record['formatted']['extra']) && is_array($record['formatted']['extra'])) { foreach ($record['formatted']['extra'] as $key => $parameter) { if (is_array($parameter) && $this->explodeArrays) { foreach ($parameter as $paramKey => $paramValue) { $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue); } } else { $this->setNewRelicParameter('extra_' . $key, $parameter); } } } } /** * Checks whether the NewRelic extension is enabled in the system. * * @return bool */ protected function isNewRelicEnabled() { return extension_loaded('newrelic'); } /** * Returns the appname where this log should be sent. Each log can override the default appname, set in this * handler's constructor, by providing the appname in it's context. * * @param array $context * @return null|string */ protected function getAppName(array $context) { if (isset($context['appname'])) { return $context['appname']; } return $this->appName; } /** * Returns the name of the current transaction. Each log can override the default transaction name, set in this * handler's constructor, by providing the transaction_name in it's context * * @param array $context * * @return null|string */ protected function getTransactionName(array $context) { if (isset($context['transaction_name'])) { return $context['transaction_name']; } return $this->transactionName; } /** * Sets the NewRelic application that should receive this log. * * @param string $appName */ protected function setNewRelicAppName($appName) { newrelic_set_appname($appName); } /** * Overwrites the name of the current transaction * * @param string $transactionName */ protected function setNewRelicTransactionName($transactionName) { newrelic_name_transaction($transactionName); } /** * @param string $key * @param mixed $value */ protected function setNewRelicParameter($key, $value) { if (null === $value || is_scalar($value)) { newrelic_add_custom_parameter($key, $value); } else { newrelic_add_custom_parameter($key, @json_encode($value)); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new NormalizerFormatter(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Blackhole * * Any record it can handle will be thrown away. This can be used * to put on top of an existing stack to override it temporarily. * * @author Jordi Boggiano */ class NullHandler extends AbstractHandler { /** * @param int $level The minimum logging level at which this handler will be triggered */ public function __construct($level = Logger::DEBUG) { parent::__construct($level, false); } /** * {@inheritdoc} */ public function handle(array $record) { if ($record['level'] < $this->level) { return false; } return true; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Exception; use Monolog\Formatter\LineFormatter; use Monolog\Logger; use PhpConsole\Connector; use PhpConsole\Handler; use PhpConsole\Helper; /** * Monolog handler for Google Chrome extension "PHP Console" * * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely * * Usage: * 1. Install Google Chrome extension https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef * 2. See overview https://github.com/barbushin/php-console#overview * 3. Install PHP Console library https://github.com/barbushin/php-console#installation * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png) * * $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler())); * \Monolog\ErrorHandler::register($logger); * echo $undefinedVar; * $logger->addDebug('SELECT * FROM users', array('db', 'time' => 0.012)); * PC::debug($_SERVER); // PHP Console debugger for any type of vars * * @author Sergey Barbushin https://www.linkedin.com/in/barbushin */ class PHPConsoleHandler extends AbstractProcessingHandler { private $options = array( 'enabled' => true, // bool Is PHP Console server enabled 'classesPartialsTraceIgnore' => array('Monolog\\'), // array Hide calls of classes started with... 'debugTagsKeysInContext' => array(0, 'tag'), // bool Is PHP Console server enabled 'useOwnErrorsHandler' => false, // bool Enable errors handling 'useOwnExceptionsHandler' => false, // bool Enable exceptions handling 'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths 'registerHelper' => true, // bool Register PhpConsole\Helper that allows short debug calls like PC::debug($var, 'ta.g.s') 'serverEncoding' => null, // string|null Server internal encoding 'headersLimit' => null, // int|null Set headers size limit for your web-server 'password' => null, // string|null Protect PHP Console connection by password 'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed 'ipMasks' => array(), // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1') 'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required) 'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings 'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level 'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number 'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item 'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON 'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug 'dataStorage' => null, // PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ) ); /** @var Connector */ private $connector; /** * @param array $options See \Monolog\Handler\PHPConsoleHandler::$options for more details * @param Connector|null $connector Instance of \PhpConsole\Connector class (optional) * @param int $level * @param bool $bubble * @throws Exception */ public function __construct(array $options = array(), Connector $connector = null, $level = Logger::DEBUG, $bubble = true) { if (!class_exists('PhpConsole\Connector')) { throw new Exception('PHP Console library not found. See https://github.com/barbushin/php-console#installation'); } parent::__construct($level, $bubble); $this->options = $this->initOptions($options); $this->connector = $this->initConnector($connector); } private function initOptions(array $options) { $wrongOptions = array_diff(array_keys($options), array_keys($this->options)); if ($wrongOptions) { throw new Exception('Unknown options: ' . implode(', ', $wrongOptions)); } return array_replace($this->options, $options); } private function initConnector(Connector $connector = null) { if (!$connector) { if ($this->options['dataStorage']) { Connector::setPostponeStorage($this->options['dataStorage']); } $connector = Connector::getInstance(); } if ($this->options['registerHelper'] && !Helper::isRegistered()) { Helper::register(); } if ($this->options['enabled'] && $connector->isActiveClient()) { if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) { $handler = Handler::getInstance(); $handler->setHandleErrors($this->options['useOwnErrorsHandler']); $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']); $handler->start(); } if ($this->options['sourcesBasePath']) { $connector->setSourcesBasePath($this->options['sourcesBasePath']); } if ($this->options['serverEncoding']) { $connector->setServerEncoding($this->options['serverEncoding']); } if ($this->options['password']) { $connector->setPassword($this->options['password']); } if ($this->options['enableSslOnlyMode']) { $connector->enableSslOnlyMode(); } if ($this->options['ipMasks']) { $connector->setAllowedIpMasks($this->options['ipMasks']); } if ($this->options['headersLimit']) { $connector->setHeadersLimit($this->options['headersLimit']); } if ($this->options['detectDumpTraceAndSource']) { $connector->getDebugDispatcher()->detectTraceAndSource = true; } $dumper = $connector->getDumper(); $dumper->levelLimit = $this->options['dumperLevelLimit']; $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit']; $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit']; $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit']; $dumper->detectCallbacks = $this->options['dumperDetectCallbacks']; if ($this->options['enableEvalListener']) { $connector->startEvalRequestsListener(); } } return $connector; } public function getConnector() { return $this->connector; } public function getOptions() { return $this->options; } public function handle(array $record) { if ($this->options['enabled'] && $this->connector->isActiveClient()) { return parent::handle($record); } return !$this->bubble; } /** * Writes the record down to the log of the implementing handler * * @param array $record * @return void */ protected function write(array $record) { if ($record['level'] < Logger::NOTICE) { $this->handleDebugRecord($record); } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof Exception) { $this->handleExceptionRecord($record); } else { $this->handleErrorRecord($record); } } private function handleDebugRecord(array $record) { $tags = $this->getRecordTags($record); $message = $record['message']; if ($record['context']) { $message .= ' ' . json_encode($this->connector->getDumper()->dump(array_filter($record['context']))); } $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']); } private function handleExceptionRecord(array $record) { $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']); } private function handleErrorRecord(array $record) { $context = $record['context']; $this->connector->getErrorsDispatcher()->dispatchError( isset($context['code']) ? $context['code'] : null, isset($context['message']) ? $context['message'] : $record['message'], isset($context['file']) ? $context['file'] : null, isset($context['line']) ? $context['line'] : null, $this->options['classesPartialsTraceIgnore'] ); } private function getRecordTags(array &$record) { $tags = null; if (!empty($record['context'])) { $context = & $record['context']; foreach ($this->options['debugTagsKeysInContext'] as $key) { if (!empty($context[$key])) { $tags = $context[$key]; if ($key === 0) { array_shift($context); } else { unset($context[$key]); } break; } } } return $tags ?: strtolower($record['level_name']); } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new LineFormatter('%message%'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Psr\Log\LoggerInterface; /** * Proxies log messages to an existing PSR-3 compliant logger. * * @author Michael Moussa */ class PsrHandler extends AbstractHandler { /** * PSR-3 compliant logger * * @var LoggerInterface */ protected $logger; /** * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, $bubble = true) { parent::__construct($level, $bubble); $this->logger = $logger; } /** * {@inheritDoc} */ public function handle(array $record) { if (!$this->isHandling($record)) { return false; } $this->logger->log(strtolower($record['level_name']), $record['message'], $record['context']); return false === $this->bubble; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Sends notifications through the pushover api to mobile phones * * @author Sebastian Göttschkes * @see https://www.pushover.net/api */ class PushoverHandler extends SocketHandler { private $token; private $users; private $title; private $user; private $retry; private $expire; private $highPriorityLevel; private $emergencyLevel; private $useFormattedMessage = false; /** * All parameters that can be sent to Pushover * @see https://pushover.net/api * @var array */ private $parameterNames = array( 'token' => true, 'user' => true, 'message' => true, 'device' => true, 'title' => true, 'url' => true, 'url_title' => true, 'priority' => true, 'timestamp' => true, 'sound' => true, 'retry' => true, 'expire' => true, 'callback' => true, ); /** * Sounds the api supports by default * @see https://pushover.net/api#sounds * @var array */ private $sounds = array( 'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming', 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb', 'persistent', 'echo', 'updown', 'none', ); /** * @param string $token Pushover api token * @param string|array $users Pushover user id or array of ids the message will be sent to * @param string $title Title sent to the Pushover API * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not * @param Boolean $useSSL Whether to connect via SSL. Required when pushing messages to users that are not * the pushover.net app owner. OpenSSL is required for this option. * @param int $highPriorityLevel The minimum logging level at which this handler will start * sending "high priority" requests to the Pushover API * @param int $emergencyLevel The minimum logging level at which this handler will start * sending "emergency" requests to the Pushover API * @param int $retry The retry parameter specifies how often (in seconds) the Pushover servers will send the same notification to the user. * @param int $expire The expire parameter specifies how many seconds your notification will continue to be retried for (every retry seconds). */ public function __construct($token, $users, $title = null, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $highPriorityLevel = Logger::CRITICAL, $emergencyLevel = Logger::EMERGENCY, $retry = 30, $expire = 25200) { $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80'; parent::__construct($connectionString, $level, $bubble); $this->token = $token; $this->users = (array) $users; $this->title = $title ?: gethostname(); $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel); $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel); $this->retry = $retry; $this->expire = $expire; } protected function generateDataStream($record) { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } private function buildContent($record) { // Pushover has a limit of 512 characters on title and message combined. $maxMessageLength = 512 - strlen($this->title); $message = ($this->useFormattedMessage) ? $record['formatted'] : $record['message']; $message = substr($message, 0, $maxMessageLength); $timestamp = $record['datetime']->getTimestamp(); $dataArray = array( 'token' => $this->token, 'user' => $this->user, 'message' => $message, 'title' => $this->title, 'timestamp' => $timestamp, ); if (isset($record['level']) && $record['level'] >= $this->emergencyLevel) { $dataArray['priority'] = 2; $dataArray['retry'] = $this->retry; $dataArray['expire'] = $this->expire; } elseif (isset($record['level']) && $record['level'] >= $this->highPriorityLevel) { $dataArray['priority'] = 1; } // First determine the available parameters $context = array_intersect_key($record['context'], $this->parameterNames); $extra = array_intersect_key($record['extra'], $this->parameterNames); // Least important info should be merged with subsequent info $dataArray = array_merge($extra, $context, $dataArray); // Only pass sounds that are supported by the API if (isset($dataArray['sound']) && !in_array($dataArray['sound'], $this->sounds)) { unset($dataArray['sound']); } return http_build_query($dataArray); } private function buildHeader($content) { $header = "POST /1/messages.json HTTP/1.1\r\n"; $header .= "Host: api.pushover.net\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } protected function write(array $record) { foreach ($this->users as $user) { $this->user = $user; parent::write($record); $this->closeSocket(); } $this->user = null; } public function setHighPriorityLevel($value) { $this->highPriorityLevel = $value; } public function setEmergencyLevel($value) { $this->emergencyLevel = $value; } /** * Use the formatted message? * @param bool $value */ public function useFormattedMessage($value) { $this->useFormattedMessage = (boolean) $value; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Logger; use Raven_Client; /** * Handler to send messages to a Sentry (https://github.com/getsentry/sentry) server * using raven-php (https://github.com/getsentry/raven-php) * * @author Marc Abramowitz */ class RavenHandler extends AbstractProcessingHandler { /** * Translates Monolog log levels to Raven log levels. */ private $logLevels = array( Logger::DEBUG => Raven_Client::DEBUG, Logger::INFO => Raven_Client::INFO, Logger::NOTICE => Raven_Client::INFO, Logger::WARNING => Raven_Client::WARNING, Logger::ERROR => Raven_Client::ERROR, Logger::CRITICAL => Raven_Client::FATAL, Logger::ALERT => Raven_Client::FATAL, Logger::EMERGENCY => Raven_Client::FATAL, ); /** * @var string should represent the current version of the calling * software. Can be any string (git commit, version number) */ private $release; /** * @var Raven_Client the client object that sends the message to the server */ protected $ravenClient; /** * @var LineFormatter The formatter to use for the logs generated via handleBatch() */ protected $batchFormatter; /** * @param Raven_Client $ravenClient * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(Raven_Client $ravenClient, $level = Logger::DEBUG, $bubble = true) { parent::__construct($level, $bubble); $this->ravenClient = $ravenClient; } /** * {@inheritdoc} */ public function handleBatch(array $records) { $level = $this->level; // filter records based on their level $records = array_filter($records, function ($record) use ($level) { return $record['level'] >= $level; }); if (!$records) { return; } // the record with the highest severity is the "main" one $record = array_reduce($records, function ($highest, $record) { if ($record['level'] > $highest['level']) { return $record; } return $highest; }); // the other ones are added as a context item $logs = array(); foreach ($records as $r) { $logs[] = $this->processRecord($r); } if ($logs) { $record['context']['logs'] = (string) $this->getBatchFormatter()->formatBatch($logs); } $this->handle($record); } /** * Sets the formatter for the logs generated by handleBatch(). * * @param FormatterInterface $formatter */ public function setBatchFormatter(FormatterInterface $formatter) { $this->batchFormatter = $formatter; } /** * Gets the formatter for the logs generated by handleBatch(). * * @return FormatterInterface */ public function getBatchFormatter() { if (!$this->batchFormatter) { $this->batchFormatter = $this->getDefaultBatchFormatter(); } return $this->batchFormatter; } /** * {@inheritdoc} */ protected function write(array $record) { $previousUserContext = false; $options = array(); $options['level'] = $this->logLevels[$record['level']]; $options['tags'] = array(); if (!empty($record['extra']['tags'])) { $options['tags'] = array_merge($options['tags'], $record['extra']['tags']); unset($record['extra']['tags']); } if (!empty($record['context']['tags'])) { $options['tags'] = array_merge($options['tags'], $record['context']['tags']); unset($record['context']['tags']); } if (!empty($record['context']['fingerprint'])) { $options['fingerprint'] = $record['context']['fingerprint']; unset($record['context']['fingerprint']); } if (!empty($record['context']['logger'])) { $options['logger'] = $record['context']['logger']; unset($record['context']['logger']); } else { $options['logger'] = $record['channel']; } foreach ($this->getExtraParameters() as $key) { foreach (array('extra', 'context') as $source) { if (!empty($record[$source][$key])) { $options[$key] = $record[$source][$key]; unset($record[$source][$key]); } } } if (!empty($record['context'])) { $options['extra']['context'] = $record['context']; if (!empty($record['context']['user'])) { $previousUserContext = $this->ravenClient->context->user; $this->ravenClient->user_context($record['context']['user']); unset($options['extra']['context']['user']); } } if (!empty($record['extra'])) { $options['extra']['extra'] = $record['extra']; } if (!empty($this->release) && !isset($options['release'])) { $options['release'] = $this->release; } if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) { $options['extra']['message'] = $record['formatted']; $this->ravenClient->captureException($record['context']['exception'], $options); } else { $this->ravenClient->captureMessage($record['formatted'], array(), $options); } if ($previousUserContext !== false) { $this->ravenClient->user_context($previousUserContext); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new LineFormatter('[%channel%] %message%'); } /** * Gets the default formatter for the logs generated by handleBatch(). * * @return FormatterInterface */ protected function getDefaultBatchFormatter() { return new LineFormatter(); } /** * Gets extra parameters supported by Raven that can be found in "extra" and "context" * * @return array */ protected function getExtraParameters() { return array('checksum', 'release', 'event_id'); } /** * @param string $value * @return self */ public function setRelease($value) { $this->release = $value; return $this; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Logger; /** * Logs to a Redis key using rpush * * usage example: * * $log = new Logger('application'); * $redis = new RedisHandler(new Predis\Client("tcp://localhost:6379"), "logs", "prod"); * $log->pushHandler($redis); * * @author Thomas Tourlourat */ class RedisHandler extends AbstractProcessingHandler { private $redisClient; private $redisKey; protected $capSize; /** * @param \Predis\Client|\Redis $redis The redis instance * @param string $key The key name to push records to * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param int $capSize Number of entries to limit list size to */ public function __construct($redis, $key, $level = Logger::DEBUG, $bubble = true, $capSize = false) { if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) { throw new \InvalidArgumentException('Predis\Client or Redis instance required'); } $this->redisClient = $redis; $this->redisKey = $key; $this->capSize = $capSize; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record) { if ($this->capSize) { $this->writeCapped($record); } else { $this->redisClient->rpush($this->redisKey, $record["formatted"]); } } /** * Write and cap the collection * Writes the record to the redis list and caps its * * @param array $record associative record array * @return void */ protected function writeCapped(array $record) { if ($this->redisClient instanceof \Redis) { $this->redisClient->multi() ->rpush($this->redisKey, $record["formatted"]) ->ltrim($this->redisKey, -$this->capSize, -1) ->exec(); } else { $redisKey = $this->redisKey; $capSize = $this->capSize; $this->redisClient->transaction(function ($tx) use ($record, $redisKey, $capSize) { $tx->rpush($redisKey, $record["formatted"]); $tx->ltrim($redisKey, -$capSize, -1); }); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new LineFormatter(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use RollbarNotifier; use Exception; use Monolog\Logger; /** * Sends errors to Rollbar * * If the context data contains a `payload` key, that is used as an array * of payload options to RollbarNotifier's report_message/report_exception methods. * * Rollbar's context info will contain the context + extra keys from the log record * merged, and then on top of that a few keys: * * - level (rollbar level name) * - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8) * - channel * - datetime (unix timestamp) * * @author Paul Statezny */ class RollbarHandler extends AbstractProcessingHandler { /** * Rollbar notifier * * @var RollbarNotifier */ protected $rollbarNotifier; protected $levelMap = array( Logger::DEBUG => 'debug', Logger::INFO => 'info', Logger::NOTICE => 'info', Logger::WARNING => 'warning', Logger::ERROR => 'error', Logger::CRITICAL => 'critical', Logger::ALERT => 'critical', Logger::EMERGENCY => 'critical', ); /** * Records whether any log records have been added since the last flush of the rollbar notifier * * @var bool */ private $hasRecords = false; protected $initialized = false; /** * @param RollbarNotifier $rollbarNotifier RollbarNotifier object constructed with valid token * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(RollbarNotifier $rollbarNotifier, $level = Logger::ERROR, $bubble = true) { $this->rollbarNotifier = $rollbarNotifier; parent::__construct($level, $bubble); } /** * {@inheritdoc} */ protected function write(array $record) { if (!$this->initialized) { // __destructor() doesn't get called on Fatal errors register_shutdown_function(array($this, 'close')); $this->initialized = true; } $context = $record['context']; $payload = array(); if (isset($context['payload'])) { $payload = $context['payload']; unset($context['payload']); } $context = array_merge($context, $record['extra'], array( 'level' => $this->levelMap[$record['level']], 'monolog_level' => $record['level_name'], 'channel' => $record['channel'], 'datetime' => $record['datetime']->format('U'), )); if (isset($context['exception']) && $context['exception'] instanceof Exception) { $payload['level'] = $context['level']; $exception = $context['exception']; unset($context['exception']); $this->rollbarNotifier->report_exception($exception, $context, $payload); } else { $this->rollbarNotifier->report_message( $record['message'], $context['level'], $context, $payload ); } $this->hasRecords = true; } public function flush() { if ($this->hasRecords) { $this->rollbarNotifier->flush(); $this->hasRecords = false; } } /** * {@inheritdoc} */ public function close() { $this->flush(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Stores logs to files that are rotated every day and a limited number of files are kept. * * This rotation is only intended to be used as a workaround. Using logrotate to * handle the rotation is strongly encouraged when you can use it. * * @author Christophe Coevoet * @author Jordi Boggiano */ class RotatingFileHandler extends StreamHandler { const FILE_PER_DAY = 'Y-m-d'; const FILE_PER_MONTH = 'Y-m'; const FILE_PER_YEAR = 'Y'; protected $filename; protected $maxFiles; protected $mustRotate; protected $nextRotation; protected $filenameFormat; protected $dateFormat; /** * @param string $filename * @param int $maxFiles The maximal amount of files to keep (0 means unlimited) * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) * @param Boolean $useLocking Try to lock log file before doing any writes */ public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false) { $this->filename = $filename; $this->maxFiles = (int) $maxFiles; $this->nextRotation = new \DateTime('tomorrow'); $this->filenameFormat = '{filename}-{date}'; $this->dateFormat = 'Y-m-d'; parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking); } /** * {@inheritdoc} */ public function close() { parent::close(); if (true === $this->mustRotate) { $this->rotate(); } } public function setFilenameFormat($filenameFormat, $dateFormat) { if (!preg_match('{^Y(([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) { trigger_error( 'Invalid date format - format must be one of '. 'RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), RotatingFileHandler::FILE_PER_MONTH ("Y-m") '. 'or RotatingFileHandler::FILE_PER_YEAR ("Y"), or you can set one of the '. 'date formats using slashes, underscores and/or dots instead of dashes.', E_USER_DEPRECATED ); } if (substr_count($filenameFormat, '{date}') === 0) { trigger_error( 'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.', E_USER_DEPRECATED ); } $this->filenameFormat = $filenameFormat; $this->dateFormat = $dateFormat; $this->url = $this->getTimedFilename(); $this->close(); } /** * {@inheritdoc} */ protected function write(array $record) { // on the first record written, if the log is new, we should rotate (once per day) if (null === $this->mustRotate) { $this->mustRotate = !file_exists($this->url); } if ($this->nextRotation < $record['datetime']) { $this->mustRotate = true; $this->close(); } parent::write($record); } /** * Rotates the files. */ protected function rotate() { // update filename $this->url = $this->getTimedFilename(); $this->nextRotation = new \DateTime('tomorrow'); // skip GC of old logs if files are unlimited if (0 === $this->maxFiles) { return; } $logFiles = glob($this->getGlobPattern()); if ($this->maxFiles >= count($logFiles)) { // no files to remove return; } // Sorting the files by name to remove the older ones usort($logFiles, function ($a, $b) { return strcmp($b, $a); }); foreach (array_slice($logFiles, $this->maxFiles) as $file) { if (is_writable($file)) { // suppress errors here as unlink() might fail if two processes // are cleaning up/rotating at the same time set_error_handler(function ($errno, $errstr, $errfile, $errline) {}); unlink($file); restore_error_handler(); } } $this->mustRotate = false; } protected function getTimedFilename() { $fileInfo = pathinfo($this->filename); $timedFilename = str_replace( array('{filename}', '{date}'), array($fileInfo['filename'], date($this->dateFormat)), $fileInfo['dirname'] . '/' . $this->filenameFormat ); if (!empty($fileInfo['extension'])) { $timedFilename .= '.'.$fileInfo['extension']; } return $timedFilename; } protected function getGlobPattern() { $fileInfo = pathinfo($this->filename); $glob = str_replace( array('{filename}', '{date}'), array($fileInfo['filename'], '*'), $fileInfo['dirname'] . '/' . $this->filenameFormat ); if (!empty($fileInfo['extension'])) { $glob .= '.'.$fileInfo['extension']; } return $glob; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Sampling handler * * A sampled event stream can be useful for logging high frequency events in * a production environment where you only need an idea of what is happening * and are not concerned with capturing every occurrence. Since the decision to * handle or not handle a particular event is determined randomly, the * resulting sampled log is not guaranteed to contain 1/N of the events that * occurred in the application, but based on the Law of large numbers, it will * tend to be close to this ratio with a large number of attempts. * * @author Bryan Davis * @author Kunal Mehta */ class SamplingHandler extends AbstractHandler { /** * @var callable|HandlerInterface $handler */ protected $handler; /** * @var int $factor */ protected $factor; /** * @param callable|HandlerInterface $handler Handler or factory callable($record, $fingersCrossedHandler). * @param int $factor Sample factor */ public function __construct($handler, $factor) { parent::__construct(); $this->handler = $handler; $this->factor = $factor; if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); } } public function isHandling(array $record) { return $this->handler->isHandling($record); } public function handle(array $record) { if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) { // The same logic as in FingersCrossedHandler if (!$this->handler instanceof HandlerInterface) { $this->handler = call_user_func($this->handler, $record, $this); if (!$this->handler instanceof HandlerInterface) { throw new \RuntimeException("The factory callable should return a HandlerInterface"); } } if ($this->processors) { foreach ($this->processors as $processor) { $record = call_user_func($processor, $record); } } $this->handler->handle($record); } return false === $this->bubble; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\Slack; use Monolog\Logger; use Monolog\Formatter\NormalizerFormatter; use Monolog\Formatter\FormatterInterface; /** * Slack record utility helping to log to Slack webhooks or API. * * @author Greg Kedzierski * @author Haralan Dobrev * @see https://api.slack.com/incoming-webhooks * @see https://api.slack.com/docs/message-attachments */ class SlackRecord { const COLOR_DANGER = 'danger'; const COLOR_WARNING = 'warning'; const COLOR_GOOD = 'good'; const COLOR_DEFAULT = '#e3e4e6'; /** * Slack channel (encoded ID or name) * @var string|null */ private $channel; /** * Name of a bot * @var string|null */ private $username; /** * User icon e.g. 'ghost', 'http://example.com/user.png' * @var string */ private $userIcon; /** * Whether the message should be added to Slack as attachment (plain text otherwise) * @var bool */ private $useAttachment; /** * Whether the the context/extra messages added to Slack as attachments are in a short style * @var bool */ private $useShortAttachment; /** * Whether the attachment should include context and extra data * @var bool */ private $includeContextAndExtra; /** * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] * @var array */ private $excludeFields; /** * @var FormatterInterface */ private $formatter; /** * @var NormalizerFormatter */ private $normalizerFormatter; public function __construct($channel = null, $username = null, $useAttachment = true, $userIcon = null, $useShortAttachment = false, $includeContextAndExtra = false, array $excludeFields = array(), FormatterInterface $formatter = null) { $this->channel = $channel; $this->username = $username; $this->userIcon = trim($userIcon, ':'); $this->useAttachment = $useAttachment; $this->useShortAttachment = $useShortAttachment; $this->includeContextAndExtra = $includeContextAndExtra; $this->excludeFields = $excludeFields; $this->formatter = $formatter; if ($this->includeContextAndExtra) { $this->normalizerFormatter = new NormalizerFormatter(); } } public function getSlackData(array $record) { $dataArray = array(); $record = $this->excludeFields($record); if ($this->username) { $dataArray['username'] = $this->username; } if ($this->channel) { $dataArray['channel'] = $this->channel; } if ($this->formatter && !$this->useAttachment) { $message = $this->formatter->format($record); } else { $message = $record['message']; } if ($this->useAttachment) { $attachment = array( 'fallback' => $message, 'text' => $message, 'color' => $this->getAttachmentColor($record['level']), 'fields' => array(), 'mrkdwn_in' => array('fields'), 'ts' => $record['datetime']->getTimestamp() ); if ($this->useShortAttachment) { $attachment['title'] = $record['level_name']; } else { $attachment['title'] = 'Message'; $attachment['fields'][] = $this->generateAttachmentField('Level', $record['level_name']); } if ($this->includeContextAndExtra) { foreach (array('extra', 'context') as $key) { if (empty($record[$key])) { continue; } if ($this->useShortAttachment) { $attachment['fields'][] = $this->generateAttachmentField( ucfirst($key), $record[$key] ); } else { // Add all extra fields as individual fields in attachment $attachment['fields'] = array_merge( $attachment['fields'], $this->generateAttachmentFields($record[$key]) ); } } } $dataArray['attachments'] = array($attachment); } else { $dataArray['text'] = $message; } if ($this->userIcon) { if (filter_var($this->userIcon, FILTER_VALIDATE_URL)) { $dataArray['icon_url'] = $this->userIcon; } else { $dataArray['icon_emoji'] = ":{$this->userIcon}:"; } } return $dataArray; } /** * Returned a Slack message attachment color associated with * provided level. * * @param int $level * @return string */ public function getAttachmentColor($level) { switch (true) { case $level >= Logger::ERROR: return self::COLOR_DANGER; case $level >= Logger::WARNING: return self::COLOR_WARNING; case $level >= Logger::INFO: return self::COLOR_GOOD; default: return self::COLOR_DEFAULT; } } /** * Stringifies an array of key/value pairs to be used in attachment fields * * @param array $fields * * @return string */ public function stringify($fields) { $normalized = $this->normalizerFormatter->format($fields); $prettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128; $hasSecondDimension = count(array_filter($normalized, 'is_array')); $hasNonNumericKeys = !count(array_filter(array_keys($normalized), 'is_numeric')); return $hasSecondDimension || $hasNonNumericKeys ? json_encode($normalized, $prettyPrintFlag) : json_encode($normalized); } /** * Sets the formatter * * @param FormatterInterface $formatter */ public function setFormatter(FormatterInterface $formatter) { $this->formatter = $formatter; } /** * Generates attachment field * * @param string $title * @param string|array $value\ * * @return array */ private function generateAttachmentField($title, $value) { $value = is_array($value) ? sprintf('```%s```', $this->stringify($value)) : $value; return array( 'title' => $title, 'value' => $value, 'short' => false ); } /** * Generates a collection of attachment fields from array * * @param array $data * * @return array */ private function generateAttachmentFields(array $data) { $fields = array(); foreach ($data as $key => $value) { $fields[] = $this->generateAttachmentField($key, $value); } return $fields; } /** * Get a copy of record with fields excluded according to $this->excludeFields * * @param array $record * * @return array */ private function excludeFields(array $record) { foreach ($this->excludeFields as $field) { $keys = explode('.', $field); $node = &$record; $lastKey = end($keys); foreach ($keys as $key) { if (!isset($node[$key])) { break; } if ($lastKey === $key) { unset($node[$key]); break; } $node = &$node[$key]; } } return $record; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Logger; use Monolog\Handler\Slack\SlackRecord; /** * Sends notifications through Slack API * * @author Greg Kedzierski * @see https://api.slack.com/ */ class SlackHandler extends SocketHandler { /** * Slack API token * @var string */ private $token; /** * Instance of the SlackRecord util class preparing data for Slack API. * @var SlackRecord */ private $slackRecord; /** * @param string $token Slack API token * @param string $channel Slack channel (encoded ID or name) * @param string|null $username Name of a bot * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) * @param string|null $iconEmoji The emoji name to use (or null) * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style * @param bool $includeContextAndExtra Whether the attachment should include context and extra data * @param array $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] * @throws MissingExtensionException If no OpenSSL PHP extension configured */ public function __construct($token, $channel, $username = null, $useAttachment = true, $iconEmoji = null, $level = Logger::CRITICAL, $bubble = true, $useShortAttachment = false, $includeContextAndExtra = false, array $excludeFields = array()) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler'); } parent::__construct('ssl://slack.com:443', $level, $bubble); $this->slackRecord = new SlackRecord( $channel, $username, $useAttachment, $iconEmoji, $useShortAttachment, $includeContextAndExtra, $excludeFields, $this->formatter ); $this->token = $token; } public function getSlackRecord() { return $this->slackRecord; } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the body of API call * * @param array $record * @return string */ private function buildContent($record) { $dataArray = $this->prepareContentData($record); return http_build_query($dataArray); } /** * Prepares content data * * @param array $record * @return array */ protected function prepareContentData($record) { $dataArray = $this->slackRecord->getSlackData($record); $dataArray['token'] = $this->token; if (!empty($dataArray['attachments'])) { $dataArray['attachments'] = json_encode($dataArray['attachments']); } return $dataArray; } /** * Builds the header of the API Call * * @param string $content * @return string */ private function buildHeader($content) { $header = "POST /api/chat.postMessage HTTP/1.1\r\n"; $header .= "Host: slack.com\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } /** * {@inheritdoc} * * @param array $record */ protected function write(array $record) { parent::write($record); $this->finalizeWrite(); } /** * Finalizes the request by reading some bytes and then closing the socket * * If we do not read some but close the socket too early, slack sometimes * drops the request entirely. */ protected function finalizeWrite() { $res = $this->getResource(); if (is_resource($res)) { @fread($res, 2048); } $this->closeSocket(); } /** * Returned a Slack message attachment color associated with * provided level. * * @param int $level * @return string * @deprecated Use underlying SlackRecord instead */ protected function getAttachmentColor($level) { trigger_error( 'SlackHandler::getAttachmentColor() is deprecated. Use underlying SlackRecord instead.', E_USER_DEPRECATED ); return $this->slackRecord->getAttachmentColor($level); } /** * Stringifies an array of key/value pairs to be used in attachment fields * * @param array $fields * @return string * @deprecated Use underlying SlackRecord instead */ protected function stringify($fields) { trigger_error( 'SlackHandler::stringify() is deprecated. Use underlying SlackRecord instead.', E_USER_DEPRECATED ); return $this->slackRecord->stringify($fields); } public function setFormatter(FormatterInterface $formatter) { parent::setFormatter($formatter); $this->slackRecord->setFormatter($formatter); return $this; } public function getFormatter() { $formatter = parent::getFormatter(); $this->slackRecord->setFormatter($formatter); return $formatter; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Logger; use Monolog\Handler\Slack\SlackRecord; /** * Sends notifications through Slack Webhooks * * @author Haralan Dobrev * @see https://api.slack.com/incoming-webhooks */ class SlackWebhookHandler extends AbstractProcessingHandler { /** * Slack Webhook token * @var string */ private $webhookUrl; /** * Instance of the SlackRecord util class preparing data for Slack API. * @var SlackRecord */ private $slackRecord; /** * @param string $webhookUrl Slack Webhook URL * @param string|null $channel Slack channel (encoded ID or name) * @param string|null $username Name of a bot * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) * @param string|null $iconEmoji The emoji name to use (or null) * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style * @param bool $includeContextAndExtra Whether the attachment should include context and extra data * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param array $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] */ public function __construct($webhookUrl, $channel = null, $username = null, $useAttachment = true, $iconEmoji = null, $useShortAttachment = false, $includeContextAndExtra = false, $level = Logger::CRITICAL, $bubble = true, array $excludeFields = array()) { parent::__construct($level, $bubble); $this->webhookUrl = $webhookUrl; $this->slackRecord = new SlackRecord( $channel, $username, $useAttachment, $iconEmoji, $useShortAttachment, $includeContextAndExtra, $excludeFields, $this->formatter ); } public function getSlackRecord() { return $this->slackRecord; } /** * {@inheritdoc} * * @param array $record */ protected function write(array $record) { $postData = $this->slackRecord->getSlackData($record); $postString = json_encode($postData); $ch = curl_init(); $options = array( CURLOPT_URL => $this->webhookUrl, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array('Content-type: application/json'), CURLOPT_POSTFIELDS => $postString ); if (defined('CURLOPT_SAFE_UPLOAD')) { $options[CURLOPT_SAFE_UPLOAD] = true; } curl_setopt_array($ch, $options); Curl\Util::execute($ch); } public function setFormatter(FormatterInterface $formatter) { parent::setFormatter($formatter); $this->slackRecord->setFormatter($formatter); return $this; } public function getFormatter() { $formatter = parent::getFormatter(); $this->slackRecord->setFormatter($formatter); return $formatter; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Sends notifications through Slack's Slackbot * * @author Haralan Dobrev * @see https://slack.com/apps/A0F81R8ET-slackbot */ class SlackbotHandler extends AbstractProcessingHandler { /** * The slug of the Slack team * @var string */ private $slackTeam; /** * Slackbot token * @var string */ private $token; /** * Slack channel name * @var string */ private $channel; /** * @param string $slackTeam Slack team slug * @param string $token Slackbot token * @param string $channel Slack channel (encoded ID or name) * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($slackTeam, $token, $channel, $level = Logger::CRITICAL, $bubble = true) { parent::__construct($level, $bubble); $this->slackTeam = $slackTeam; $this->token = $token; $this->channel = $channel; } /** * {@inheritdoc} * * @param array $record */ protected function write(array $record) { $slackbotUrl = sprintf( 'https://%s.slack.com/services/hooks/slackbot?token=%s&channel=%s', $this->slackTeam, $this->token, $this->channel ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $slackbotUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $record['message']); Curl\Util::execute($ch); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Stores to any socket - uses fsockopen() or pfsockopen(). * * @author Pablo de Leon Belloc * @see http://php.net/manual/en/function.fsockopen.php */ class SocketHandler extends AbstractProcessingHandler { private $connectionString; private $connectionTimeout; private $resource; private $timeout = 0; private $writingTimeout = 10; private $lastSentBytes = null; private $persistent = false; private $errno; private $errstr; private $lastWritingAt; /** * @param string $connectionString Socket connection string * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true) { parent::__construct($level, $bubble); $this->connectionString = $connectionString; $this->connectionTimeout = (float) ini_get('default_socket_timeout'); } /** * Connect (if necessary) and write to the socket * * @param array $record * * @throws \UnexpectedValueException * @throws \RuntimeException */ protected function write(array $record) { $this->connectIfNotConnected(); $data = $this->generateDataStream($record); $this->writeToSocket($data); } /** * We will not close a PersistentSocket instance so it can be reused in other requests. */ public function close() { if (!$this->isPersistent()) { $this->closeSocket(); } } /** * Close socket, if open */ public function closeSocket() { if (is_resource($this->resource)) { fclose($this->resource); $this->resource = null; } } /** * Set socket connection to nbe persistent. It only has effect before the connection is initiated. * * @param bool $persistent */ public function setPersistent($persistent) { $this->persistent = (boolean) $persistent; } /** * Set connection timeout. Only has effect before we connect. * * @param float $seconds * * @see http://php.net/manual/en/function.fsockopen.php */ public function setConnectionTimeout($seconds) { $this->validateTimeout($seconds); $this->connectionTimeout = (float) $seconds; } /** * Set write timeout. Only has effect before we connect. * * @param float $seconds * * @see http://php.net/manual/en/function.stream-set-timeout.php */ public function setTimeout($seconds) { $this->validateTimeout($seconds); $this->timeout = (float) $seconds; } /** * Set writing timeout. Only has effect during connection in the writing cycle. * * @param float $seconds 0 for no timeout */ public function setWritingTimeout($seconds) { $this->validateTimeout($seconds); $this->writingTimeout = (float) $seconds; } /** * Get current connection string * * @return string */ public function getConnectionString() { return $this->connectionString; } /** * Get persistent setting * * @return bool */ public function isPersistent() { return $this->persistent; } /** * Get current connection timeout setting * * @return float */ public function getConnectionTimeout() { return $this->connectionTimeout; } /** * Get current in-transfer timeout * * @return float */ public function getTimeout() { return $this->timeout; } /** * Get current local writing timeout * * @return float */ public function getWritingTimeout() { return $this->writingTimeout; } /** * Check to see if the socket is currently available. * * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details. * * @return bool */ public function isConnected() { return is_resource($this->resource) && !feof($this->resource); // on TCP - other party can close connection. } /** * Wrapper to allow mocking */ protected function pfsockopen() { return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); } /** * Wrapper to allow mocking */ protected function fsockopen() { return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); } /** * Wrapper to allow mocking * * @see http://php.net/manual/en/function.stream-set-timeout.php */ protected function streamSetTimeout() { $seconds = floor($this->timeout); $microseconds = round(($this->timeout - $seconds) * 1e6); return stream_set_timeout($this->resource, $seconds, $microseconds); } /** * Wrapper to allow mocking */ protected function fwrite($data) { return @fwrite($this->resource, $data); } /** * Wrapper to allow mocking */ protected function streamGetMetadata() { return stream_get_meta_data($this->resource); } private function validateTimeout($value) { $ok = filter_var($value, FILTER_VALIDATE_FLOAT); if ($ok === false || $value < 0) { throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got $value)"); } } private function connectIfNotConnected() { if ($this->isConnected()) { return; } $this->connect(); } protected function generateDataStream($record) { return (string) $record['formatted']; } /** * @return resource|null */ protected function getResource() { return $this->resource; } private function connect() { $this->createSocketResource(); $this->setSocketTimeout(); } private function createSocketResource() { if ($this->isPersistent()) { $resource = $this->pfsockopen(); } else { $resource = $this->fsockopen(); } if (!$resource) { throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)"); } $this->resource = $resource; } private function setSocketTimeout() { if (!$this->streamSetTimeout()) { throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()"); } } private function writeToSocket($data) { $length = strlen($data); $sent = 0; $this->lastSentBytes = $sent; while ($this->isConnected() && $sent < $length) { if (0 == $sent) { $chunk = $this->fwrite($data); } else { $chunk = $this->fwrite(substr($data, $sent)); } if ($chunk === false) { throw new \RuntimeException("Could not write to socket"); } $sent += $chunk; $socketInfo = $this->streamGetMetadata(); if ($socketInfo['timed_out']) { throw new \RuntimeException("Write timed-out"); } if ($this->writingIsTimedOut($sent)) { throw new \RuntimeException("Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent $sent of $length)"); } } if (!$this->isConnected() && $sent < $length) { throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)"); } } private function writingIsTimedOut($sent) { $writingTimeout = (int) floor($this->writingTimeout); if (0 === $writingTimeout) { return false; } if ($sent !== $this->lastSentBytes) { $this->lastWritingAt = time(); $this->lastSentBytes = $sent; return false; } else { usleep(100); } if ((time() - $this->lastWritingAt) >= $writingTimeout) { $this->closeSocket(); return true; } return false; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Stores to any stream resource * * Can be used to store into php://stderr, remote and local files, etc. * * @author Jordi Boggiano */ class StreamHandler extends AbstractProcessingHandler { protected $stream; protected $url; private $errorMessage; protected $filePermission; protected $useLocking; private $dirCreated; /** * @param resource|string $stream * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) * @param Boolean $useLocking Try to lock log file before doing any writes * * @throws \Exception If a missing directory is not buildable * @throws \InvalidArgumentException If stream is not a resource or string */ public function __construct($stream, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false) { parent::__construct($level, $bubble); if (is_resource($stream)) { $this->stream = $stream; } elseif (is_string($stream)) { $this->url = $stream; } else { throw new \InvalidArgumentException('A stream must either be a resource or a string.'); } $this->filePermission = $filePermission; $this->useLocking = $useLocking; } /** * {@inheritdoc} */ public function close() { if ($this->url && is_resource($this->stream)) { fclose($this->stream); } $this->stream = null; } /** * Return the currently active stream if it is open * * @return resource|null */ public function getStream() { return $this->stream; } /** * Return the stream URL if it was configured with a URL and not an active resource * * @return string|null */ public function getUrl() { return $this->url; } /** * {@inheritdoc} */ protected function write(array $record) { if (!is_resource($this->stream)) { if (null === $this->url || '' === $this->url) { throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().'); } $this->createDir(); $this->errorMessage = null; set_error_handler(array($this, 'customErrorHandler')); $this->stream = fopen($this->url, 'a'); if ($this->filePermission !== null) { @chmod($this->url, $this->filePermission); } restore_error_handler(); if (!is_resource($this->stream)) { $this->stream = null; throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$this->errorMessage, $this->url)); } } if ($this->useLocking) { // ignoring errors here, there's not much we can do about them flock($this->stream, LOCK_EX); } $this->streamWrite($this->stream, $record); if ($this->useLocking) { flock($this->stream, LOCK_UN); } } /** * Write to stream * @param resource $stream * @param array $record */ protected function streamWrite($stream, array $record) { fwrite($stream, (string) $record['formatted']); } private function customErrorHandler($code, $msg) { $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg); } /** * @param string $stream * * @return null|string */ private function getDirFromStream($stream) { $pos = strpos($stream, '://'); if ($pos === false) { return dirname($stream); } if ('file://' === substr($stream, 0, 7)) { return dirname(substr($stream, 7)); } return; } private function createDir() { // Do not try to create dir if it has already been tried. if ($this->dirCreated) { return; } $dir = $this->getDirFromStream($this->url); if (null !== $dir && !is_dir($dir)) { $this->errorMessage = null; set_error_handler(array($this, 'customErrorHandler')); $status = mkdir($dir, 0777, true); restore_error_handler(); if (false === $status) { throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and its not buildable: '.$this->errorMessage, $dir)); } } $this->dirCreated = true; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\LineFormatter; use Swift; /** * SwiftMailerHandler uses Swift_Mailer to send the emails * * @author Gyula Sallai */ class SwiftMailerHandler extends MailHandler { protected $mailer; private $messageTemplate; /** * @param \Swift_Mailer $mailer The mailer to use * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true) { parent::__construct($level, $bubble); $this->mailer = $mailer; $this->messageTemplate = $message; } /** * {@inheritdoc} */ protected function send($content, array $records) { $this->mailer->send($this->buildMessage($content, $records)); } /** * Creates instance of Swift_Message to be sent * * @param string $content formatted email body to be sent * @param array $records Log records that formed the content * @return \Swift_Message */ protected function buildMessage($content, array $records) { $message = null; if ($this->messageTemplate instanceof \Swift_Message) { $message = clone $this->messageTemplate; $message->generateId(); } elseif (is_callable($this->messageTemplate)) { $message = call_user_func($this->messageTemplate, $content, $records); } if (!$message instanceof \Swift_Message) { throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it'); } if ($records) { $subjectFormatter = new LineFormatter($message->getSubject()); $message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); } $message->setBody($content); if (version_compare(Swift::VERSION, '6.0.0', '>=')) { $message->setDate(new \DateTimeImmutable()); } else { $message->setDate(time()); } return $message; } /** * BC getter, to be removed in 2.0 */ public function __get($name) { if ($name === 'message') { trigger_error('SwiftMailerHandler->message is deprecated, use ->buildMessage() instead to retrieve the message', E_USER_DEPRECATED); return $this->buildMessage(null, array()); } throw new \InvalidArgumentException('Invalid property '.$name); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Logs to syslog service. * * usage example: * * $log = new Logger('application'); * $syslog = new SyslogHandler('myfacility', 'local6'); * $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%"); * $syslog->setFormatter($formatter); * $log->pushHandler($syslog); * * @author Sven Paulus */ class SyslogHandler extends AbstractSyslogHandler { protected $ident; protected $logopts; /** * @param string $ident * @param mixed $facility * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID */ public function __construct($ident, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $logopts = LOG_PID) { parent::__construct($facility, $level, $bubble); $this->ident = $ident; $this->logopts = $logopts; } /** * {@inheritdoc} */ public function close() { closelog(); } /** * {@inheritdoc} */ protected function write(array $record) { if (!openlog($this->ident, $this->logopts, $this->facility)) { throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"'); } syslog($this->logLevels[$record['level']], (string) $record['formatted']); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\SyslogUdp; class UdpSocket { const DATAGRAM_MAX_LENGTH = 65023; protected $ip; protected $port; protected $socket; public function __construct($ip, $port = 514) { $this->ip = $ip; $this->port = $port; $this->socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); } public function write($line, $header = "") { $this->send($this->assembleMessage($line, $header)); } public function close() { if (is_resource($this->socket)) { socket_close($this->socket); $this->socket = null; } } protected function send($chunk) { if (!is_resource($this->socket)) { throw new \LogicException('The UdpSocket to '.$this->ip.':'.$this->port.' has been closed and can not be written to anymore'); } socket_sendto($this->socket, $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); } protected function assembleMessage($line, $header) { $chunkSize = self::DATAGRAM_MAX_LENGTH - strlen($header); return $header . substr($line, 0, $chunkSize); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Handler\SyslogUdp\UdpSocket; /** * A Handler for logging to a remote syslogd server. * * @author Jesper Skovgaard Nielsen */ class SyslogUdpHandler extends AbstractSyslogHandler { protected $socket; protected $ident; /** * @param string $host * @param int $port * @param mixed $facility * @param int $level The minimum logging level at which this handler will be triggered * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not * @param string $ident Program name or tag for each log message. */ public function __construct($host, $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $ident = 'php') { parent::__construct($facility, $level, $bubble); $this->ident = $ident; $this->socket = new UdpSocket($host, $port ?: 514); } protected function write(array $record) { $lines = $this->splitMessageIntoLines($record['formatted']); $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']]); foreach ($lines as $line) { $this->socket->write($line, $header); } } public function close() { $this->socket->close(); } private function splitMessageIntoLines($message) { if (is_array($message)) { $message = implode("\n", $message); } return preg_split('/$\R?^/m', $message, -1, PREG_SPLIT_NO_EMPTY); } /** * Make common syslog header (see rfc5424) */ protected function makeCommonSyslogHeader($severity) { $priority = $severity + $this->facility; if (!$pid = getmypid()) { $pid = '-'; } if (!$hostname = gethostname()) { $hostname = '-'; } return "<$priority>1 " . $this->getDateTime() . " " . $hostname . " " . $this->ident . " " . $pid . " - - "; } protected function getDateTime() { return date(\DateTime::RFC3339); } /** * Inject your own socket, mainly used for testing */ public function setSocket($socket) { $this->socket = $socket; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Used for testing purposes. * * It records all records and gives you access to them for verification. * * @author Jordi Boggiano * * @method bool hasEmergency($record) * @method bool hasAlert($record) * @method bool hasCritical($record) * @method bool hasError($record) * @method bool hasWarning($record) * @method bool hasNotice($record) * @method bool hasInfo($record) * @method bool hasDebug($record) * * @method bool hasEmergencyRecords() * @method bool hasAlertRecords() * @method bool hasCriticalRecords() * @method bool hasErrorRecords() * @method bool hasWarningRecords() * @method bool hasNoticeRecords() * @method bool hasInfoRecords() * @method bool hasDebugRecords() * * @method bool hasEmergencyThatContains($message) * @method bool hasAlertThatContains($message) * @method bool hasCriticalThatContains($message) * @method bool hasErrorThatContains($message) * @method bool hasWarningThatContains($message) * @method bool hasNoticeThatContains($message) * @method bool hasInfoThatContains($message) * @method bool hasDebugThatContains($message) * * @method bool hasEmergencyThatMatches($message) * @method bool hasAlertThatMatches($message) * @method bool hasCriticalThatMatches($message) * @method bool hasErrorThatMatches($message) * @method bool hasWarningThatMatches($message) * @method bool hasNoticeThatMatches($message) * @method bool hasInfoThatMatches($message) * @method bool hasDebugThatMatches($message) * * @method bool hasEmergencyThatPasses($message) * @method bool hasAlertThatPasses($message) * @method bool hasCriticalThatPasses($message) * @method bool hasErrorThatPasses($message) * @method bool hasWarningThatPasses($message) * @method bool hasNoticeThatPasses($message) * @method bool hasInfoThatPasses($message) * @method bool hasDebugThatPasses($message) */ class TestHandler extends AbstractProcessingHandler { protected $records = array(); protected $recordsByLevel = array(); public function getRecords() { return $this->records; } public function clear() { $this->records = array(); $this->recordsByLevel = array(); } public function hasRecords($level) { return isset($this->recordsByLevel[$level]); } public function hasRecord($record, $level) { if (is_array($record)) { $record = $record['message']; } return $this->hasRecordThatPasses(function ($rec) use ($record) { return $rec['message'] === $record; }, $level); } public function hasRecordThatContains($message, $level) { return $this->hasRecordThatPasses(function ($rec) use ($message) { return strpos($rec['message'], $message) !== false; }, $level); } public function hasRecordThatMatches($regex, $level) { return $this->hasRecordThatPasses(function ($rec) use ($regex) { return preg_match($regex, $rec['message']) > 0; }, $level); } public function hasRecordThatPasses($predicate, $level) { if (!is_callable($predicate)) { throw new \InvalidArgumentException("Expected a callable for hasRecordThatSucceeds"); } if (!isset($this->recordsByLevel[$level])) { return false; } foreach ($this->recordsByLevel[$level] as $i => $rec) { if (call_user_func($predicate, $rec, $i)) { return true; } } return false; } /** * {@inheritdoc} */ protected function write(array $record) { $this->recordsByLevel[$record['level']][] = $record; $this->records[] = $record; } public function __call($method, $args) { if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; $level = constant('Monolog\Logger::' . strtoupper($matches[2])); if (method_exists($this, $genericMethod)) { $args[] = $level; return call_user_func_array(array($this, $genericMethod), $args); } } throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Forwards records to multiple handlers suppressing failures of each handler * and continuing through to give every handler a chance to succeed. * * @author Craig D'Amelio */ class WhatFailureGroupHandler extends GroupHandler { /** * {@inheritdoc} */ public function handle(array $record) { if ($this->processors) { foreach ($this->processors as $processor) { $record = call_user_func($processor, $record); } } foreach ($this->handlers as $handler) { try { $handler->handle($record); } catch (\Exception $e) { // What failure? } catch (\Throwable $e) { // What failure? } } return false === $this->bubble; } /** * {@inheritdoc} */ public function handleBatch(array $records) { foreach ($this->handlers as $handler) { try { $handler->handleBatch($records); } catch (\Exception $e) { // What failure? } catch (\Throwable $e) { // What failure? } } } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\NormalizerFormatter; use Monolog\Logger; /** * Handler sending logs to Zend Monitor * * @author Christian Bergau */ class ZendMonitorHandler extends AbstractProcessingHandler { /** * Monolog level / ZendMonitor Custom Event priority map * * @var array */ protected $levelMap = array( Logger::DEBUG => 1, Logger::INFO => 2, Logger::NOTICE => 3, Logger::WARNING => 4, Logger::ERROR => 5, Logger::CRITICAL => 6, Logger::ALERT => 7, Logger::EMERGENCY => 0, ); /** * Construct * * @param int $level * @param bool $bubble * @throws MissingExtensionException */ public function __construct($level = Logger::DEBUG, $bubble = true) { if (!function_exists('zend_monitor_custom_event')) { throw new MissingExtensionException('You must have Zend Server installed in order to use this handler'); } parent::__construct($level, $bubble); } /** * {@inheritdoc} */ protected function write(array $record) { $this->writeZendMonitorCustomEvent( $this->levelMap[$record['level']], $record['message'], $record['formatted'] ); } /** * Write a record to Zend Monitor * * @param int $level * @param string $message * @param array $formatted */ protected function writeZendMonitorCustomEvent($level, $message, $formatted) { zend_monitor_custom_event($level, $message, $formatted); } /** * {@inheritdoc} */ public function getDefaultFormatter() { return new NormalizerFormatter(); } /** * Get the level map * * @return array */ public function getLevelMap() { return $this->levelMap; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Logger.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use Monolog\Handler\HandlerInterface; use Monolog\Handler\StreamHandler; use Psr\Log\LoggerInterface; use Psr\Log\InvalidArgumentException; /** * Monolog log channel * * It contains a stack of Handlers and a stack of Processors, * and uses them to store records that are added to it. * * @author Jordi Boggiano */ class Logger implements LoggerInterface { /** * Detailed debug information */ const DEBUG = 100; /** * Interesting events * * Examples: User logs in, SQL logs. */ const INFO = 200; /** * Uncommon events */ const NOTICE = 250; /** * Exceptional occurrences that are not errors * * Examples: Use of deprecated APIs, poor use of an API, * undesirable things that are not necessarily wrong. */ const WARNING = 300; /** * Runtime errors */ const ERROR = 400; /** * Critical conditions * * Example: Application component unavailable, unexpected exception. */ const CRITICAL = 500; /** * Action must be taken immediately * * Example: Entire website down, database unavailable, etc. * This should trigger the SMS alerts and wake you up. */ const ALERT = 550; /** * Urgent alert. */ const EMERGENCY = 600; /** * Monolog API version * * This is only bumped when API breaks are done and should * follow the major version of the library * * @var int */ const API = 1; /** * Logging levels from syslog protocol defined in RFC 5424 * * @var array $levels Logging levels */ protected static $levels = array( self::DEBUG => 'DEBUG', self::INFO => 'INFO', self::NOTICE => 'NOTICE', self::WARNING => 'WARNING', self::ERROR => 'ERROR', self::CRITICAL => 'CRITICAL', self::ALERT => 'ALERT', self::EMERGENCY => 'EMERGENCY', ); /** * @var \DateTimeZone */ protected static $timezone; /** * @var string */ protected $name; /** * The handler stack * * @var HandlerInterface[] */ protected $handlers; /** * Processors that will process all log records * * To process records of a single handler instead, add the processor on that specific handler * * @var callable[] */ protected $processors; /** * @var bool */ protected $microsecondTimestamps = true; /** * @param string $name The logging channel * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. * @param callable[] $processors Optional array of processors */ public function __construct($name, array $handlers = array(), array $processors = array()) { $this->name = $name; $this->handlers = $handlers; $this->processors = $processors; } /** * @return string */ public function getName() { return $this->name; } /** * Return a new cloned instance with the name changed * * @return static */ public function withName($name) { $new = clone $this; $new->name = $name; return $new; } /** * Pushes a handler on to the stack. * * @param HandlerInterface $handler * @return $this */ public function pushHandler(HandlerInterface $handler) { array_unshift($this->handlers, $handler); return $this; } /** * Pops a handler from the stack * * @return HandlerInterface */ public function popHandler() { if (!$this->handlers) { throw new \LogicException('You tried to pop from an empty handler stack.'); } return array_shift($this->handlers); } /** * Set handlers, replacing all existing ones. * * If a map is passed, keys will be ignored. * * @param HandlerInterface[] $handlers * @return $this */ public function setHandlers(array $handlers) { $this->handlers = array(); foreach (array_reverse($handlers) as $handler) { $this->pushHandler($handler); } return $this; } /** * @return HandlerInterface[] */ public function getHandlers() { return $this->handlers; } /** * Adds a processor on to the stack. * * @param callable $callback * @return $this */ public function pushProcessor($callback) { if (!is_callable($callback)) { throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given'); } array_unshift($this->processors, $callback); return $this; } /** * Removes the processor on top of the stack and returns it. * * @return callable */ public function popProcessor() { if (!$this->processors) { throw new \LogicException('You tried to pop from an empty processor stack.'); } return array_shift($this->processors); } /** * @return callable[] */ public function getProcessors() { return $this->processors; } /** * Control the use of microsecond resolution timestamps in the 'datetime' * member of new records. * * Generating microsecond resolution timestamps by calling * microtime(true), formatting the result via sprintf() and then parsing * the resulting string via \DateTime::createFromFormat() can incur * a measurable runtime overhead vs simple usage of DateTime to capture * a second resolution timestamp in systems which generate a large number * of log events. * * @param bool $micro True to use microtime() to create timestamps */ public function useMicrosecondTimestamps($micro) { $this->microsecondTimestamps = (bool) $micro; } /** * Adds a log record. * * @param int $level The logging level * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function addRecord($level, $message, array $context = array()) { if (!$this->handlers) { $this->pushHandler(new StreamHandler('php://stderr', static::DEBUG)); } $levelName = static::getLevelName($level); // check if any handler will handle this message so we can return early and save cycles $handlerKey = null; reset($this->handlers); while ($handler = current($this->handlers)) { if ($handler->isHandling(array('level' => $level))) { $handlerKey = key($this->handlers); break; } next($this->handlers); } if (null === $handlerKey) { return false; } if (!static::$timezone) { static::$timezone = new \DateTimeZone(date_default_timezone_get() ?: 'UTC'); } // php7.1+ always has microseconds enabled, so we do not need this hack if ($this->microsecondTimestamps && PHP_VERSION_ID < 70100) { $ts = \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), static::$timezone); } else { $ts = new \DateTime(null, static::$timezone); } $ts->setTimezone(static::$timezone); $record = array( 'message' => (string) $message, 'context' => $context, 'level' => $level, 'level_name' => $levelName, 'channel' => $this->name, 'datetime' => $ts, 'extra' => array(), ); foreach ($this->processors as $processor) { $record = call_user_func($processor, $record); } while ($handler = current($this->handlers)) { if (true === $handler->handle($record)) { break; } next($this->handlers); } return true; } /** * Adds a log record at the DEBUG level. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function addDebug($message, array $context = array()) { return $this->addRecord(static::DEBUG, $message, $context); } /** * Adds a log record at the INFO level. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function addInfo($message, array $context = array()) { return $this->addRecord(static::INFO, $message, $context); } /** * Adds a log record at the NOTICE level. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function addNotice($message, array $context = array()) { return $this->addRecord(static::NOTICE, $message, $context); } /** * Adds a log record at the WARNING level. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function addWarning($message, array $context = array()) { return $this->addRecord(static::WARNING, $message, $context); } /** * Adds a log record at the ERROR level. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function addError($message, array $context = array()) { return $this->addRecord(static::ERROR, $message, $context); } /** * Adds a log record at the CRITICAL level. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function addCritical($message, array $context = array()) { return $this->addRecord(static::CRITICAL, $message, $context); } /** * Adds a log record at the ALERT level. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function addAlert($message, array $context = array()) { return $this->addRecord(static::ALERT, $message, $context); } /** * Adds a log record at the EMERGENCY level. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function addEmergency($message, array $context = array()) { return $this->addRecord(static::EMERGENCY, $message, $context); } /** * Gets all supported logging levels. * * @return array Assoc array with human-readable level names => level codes. */ public static function getLevels() { return array_flip(static::$levels); } /** * Gets the name of the logging level. * * @param int $level * @return string */ public static function getLevelName($level) { if (!isset(static::$levels[$level])) { throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels))); } return static::$levels[$level]; } /** * Converts PSR-3 levels to Monolog ones if necessary * * @param string|int Level number (monolog) or name (PSR-3) * @return int */ public static function toMonologLevel($level) { if (is_string($level) && defined(__CLASS__.'::'.strtoupper($level))) { return constant(__CLASS__.'::'.strtoupper($level)); } return $level; } /** * Checks whether the Logger has a handler that listens on the given level * * @param int $level * @return Boolean */ public function isHandling($level) { $record = array( 'level' => $level, ); foreach ($this->handlers as $handler) { if ($handler->isHandling($record)) { return true; } } return false; } /** * Adds a log record at an arbitrary level. * * This method allows for compatibility with common interfaces. * * @param mixed $level The log level * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function log($level, $message, array $context = array()) { $level = static::toMonologLevel($level); return $this->addRecord($level, $message, $context); } /** * Adds a log record at the DEBUG level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function debug($message, array $context = array()) { return $this->addRecord(static::DEBUG, $message, $context); } /** * Adds a log record at the INFO level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function info($message, array $context = array()) { return $this->addRecord(static::INFO, $message, $context); } /** * Adds a log record at the NOTICE level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function notice($message, array $context = array()) { return $this->addRecord(static::NOTICE, $message, $context); } /** * Adds a log record at the WARNING level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function warn($message, array $context = array()) { return $this->addRecord(static::WARNING, $message, $context); } /** * Adds a log record at the WARNING level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function warning($message, array $context = array()) { return $this->addRecord(static::WARNING, $message, $context); } /** * Adds a log record at the ERROR level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function err($message, array $context = array()) { return $this->addRecord(static::ERROR, $message, $context); } /** * Adds a log record at the ERROR level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function error($message, array $context = array()) { return $this->addRecord(static::ERROR, $message, $context); } /** * Adds a log record at the CRITICAL level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function crit($message, array $context = array()) { return $this->addRecord(static::CRITICAL, $message, $context); } /** * Adds a log record at the CRITICAL level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function critical($message, array $context = array()) { return $this->addRecord(static::CRITICAL, $message, $context); } /** * Adds a log record at the ALERT level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function alert($message, array $context = array()) { return $this->addRecord(static::ALERT, $message, $context); } /** * Adds a log record at the EMERGENCY level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function emerg($message, array $context = array()) { return $this->addRecord(static::EMERGENCY, $message, $context); } /** * Adds a log record at the EMERGENCY level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return Boolean Whether the record has been processed */ public function emergency($message, array $context = array()) { return $this->addRecord(static::EMERGENCY, $message, $context); } /** * Set the timezone to be used for the timestamp of log records. * * This is stored globally for all Logger instances * * @param \DateTimeZone $tz Timezone object */ public static function setTimezone(\DateTimeZone $tz) { self::$timezone = $tz; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Logger; /** * Injects Git branch and Git commit SHA in all records * * @author Nick Otter * @author Jordi Boggiano */ class GitProcessor { private $level; private static $cache; public function __construct($level = Logger::DEBUG) { $this->level = Logger::toMonologLevel($level); } /** * @param array $record * @return array */ public function __invoke(array $record) { // return if the level is not high enough if ($record['level'] < $this->level) { return $record; } $record['extra']['git'] = self::getGitInfo(); return $record; } private static function getGitInfo() { if (self::$cache) { return self::$cache; } $branches = `git branch -v --no-abbrev`; if (preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { return self::$cache = array( 'branch' => $matches[1], 'commit' => $matches[2], ); } return self::$cache = array(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Logger; /** * Injects line/file:class/function where the log message came from * * Warning: This only works if the handler processes the logs directly. * If you put the processor on a handler that is behind a FingersCrossedHandler * for example, the processor will only be called once the trigger level is reached, * and all the log records will have the same file/line/.. data from the call that * triggered the FingersCrossedHandler. * * @author Jordi Boggiano */ class IntrospectionProcessor { private $level; private $skipClassesPartials; private $skipStackFramesCount; private $skipFunctions = array( 'call_user_func', 'call_user_func_array', ); public function __construct($level = Logger::DEBUG, array $skipClassesPartials = array(), $skipStackFramesCount = 0) { $this->level = Logger::toMonologLevel($level); $this->skipClassesPartials = array_merge(array('Monolog\\'), $skipClassesPartials); $this->skipStackFramesCount = $skipStackFramesCount; } /** * @param array $record * @return array */ public function __invoke(array $record) { // return if the level is not high enough if ($record['level'] < $this->level) { return $record; } /* * http://php.net/manual/en/function.debug-backtrace.php * As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added. * Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'. */ $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS); // skip first since it's always the current method array_shift($trace); // the call_user_func call is also skipped array_shift($trace); $i = 0; while ($this->isTraceClassOrSkippedFunction($trace, $i)) { if (isset($trace[$i]['class'])) { foreach ($this->skipClassesPartials as $part) { if (strpos($trace[$i]['class'], $part) !== false) { $i++; continue 2; } } } elseif (in_array($trace[$i]['function'], $this->skipFunctions)) { $i++; continue; } break; } $i += $this->skipStackFramesCount; // we should have the call source now $record['extra'] = array_merge( $record['extra'], array( 'file' => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null, 'line' => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null, 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null, 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null, ) ); return $record; } private function isTraceClassOrSkippedFunction(array $trace, $index) { if (!isset($trace[$index])) { return false; } return isset($trace[$index]['class']) || in_array($trace[$index]['function'], $this->skipFunctions); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Injects memory_get_peak_usage in all records * * @see Monolog\Processor\MemoryProcessor::__construct() for options * @author Rob Jensen */ class MemoryPeakUsageProcessor extends MemoryProcessor { /** * @param array $record * @return array */ public function __invoke(array $record) { $bytes = memory_get_peak_usage($this->realUsage); $formatted = $this->formatBytes($bytes); $record['extra']['memory_peak_usage'] = $formatted; return $record; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Some methods that are common for all memory processors * * @author Rob Jensen */ abstract class MemoryProcessor { /** * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported. */ protected $realUsage; /** * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size) */ protected $useFormatting; /** * @param bool $realUsage Set this to true to get the real size of memory allocated from system. * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size) */ public function __construct($realUsage = true, $useFormatting = true) { $this->realUsage = (boolean) $realUsage; $this->useFormatting = (boolean) $useFormatting; } /** * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is * * @param int $bytes * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as is */ protected function formatBytes($bytes) { $bytes = (int) $bytes; if (!$this->useFormatting) { return $bytes; } if ($bytes > 1024 * 1024) { return round($bytes / 1024 / 1024, 2).' MB'; } elseif ($bytes > 1024) { return round($bytes / 1024, 2).' KB'; } return $bytes . ' B'; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Injects memory_get_usage in all records * * @see Monolog\Processor\MemoryProcessor::__construct() for options * @author Rob Jensen */ class MemoryUsageProcessor extends MemoryProcessor { /** * @param array $record * @return array */ public function __invoke(array $record) { $bytes = memory_get_usage($this->realUsage); $formatted = $this->formatBytes($bytes); $record['extra']['memory_usage'] = $formatted; return $record; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Logger; /** * Injects Hg branch and Hg revision number in all records * * @author Jonathan A. Schweder */ class MercurialProcessor { private $level; private static $cache; public function __construct($level = Logger::DEBUG) { $this->level = Logger::toMonologLevel($level); } /** * @param array $record * @return array */ public function __invoke(array $record) { // return if the level is not high enough if ($record['level'] < $this->level) { return $record; } $record['extra']['hg'] = self::getMercurialInfo(); return $record; } private static function getMercurialInfo() { if (self::$cache) { return self::$cache; } $result = explode(' ', trim(`hg id -nb`)); if (count($result) >= 3) { return self::$cache = array( 'branch' => $result[1], 'revision' => $result[2], ); } return self::$cache = array(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Adds value of getmypid into records * * @author Andreas Hörnicke */ class ProcessIdProcessor { /** * @param array $record * @return array */ public function __invoke(array $record) { $record['extra']['process_id'] = getmypid(); return $record; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Processes a record's message according to PSR-3 rules * * It replaces {foo} with the value from $context['foo'] * * @author Jordi Boggiano */ class PsrLogMessageProcessor { /** * @param array $record * @return array */ public function __invoke(array $record) { if (false === strpos($record['message'], '{')) { return $record; } $replacements = array(); foreach ($record['context'] as $key => $val) { if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) { $replacements['{'.$key.'}'] = $val; } elseif (is_object($val)) { $replacements['{'.$key.'}'] = '[object '.get_class($val).']'; } else { $replacements['{'.$key.'}'] = '['.gettype($val).']'; } } $record['message'] = strtr($record['message'], $replacements); return $record; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Adds a tags array into record * * @author Martijn Riemers */ class TagProcessor { private $tags; public function __construct(array $tags = array()) { $this->setTags($tags); } public function addTags(array $tags = array()) { $this->tags = array_merge($this->tags, $tags); } public function setTags(array $tags = array()) { $this->tags = $tags; } public function __invoke(array $record) { $record['extra']['tags'] = $this->tags; return $record; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Adds a unique identifier into records * * @author Simon Mönch */ class UidProcessor { private $uid; public function __construct($length = 7) { if (!is_int($length) || $length > 32 || $length < 1) { throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32'); } $this->uid = substr(hash('md5', uniqid('', true)), 0, $length); } public function __invoke(array $record) { $record['extra']['uid'] = $this->uid; return $record; } /** * @return string */ public function getUid() { return $this->uid; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Injects url/method and remote IP of the current web request in all records * * @author Jordi Boggiano */ class WebProcessor { /** * @var array|\ArrayAccess */ protected $serverData; /** * Default fields * * Array is structured as [key in record.extra => key in $serverData] * * @var array */ protected $extraFields = array( 'url' => 'REQUEST_URI', 'ip' => 'REMOTE_ADDR', 'http_method' => 'REQUEST_METHOD', 'server' => 'SERVER_NAME', 'referrer' => 'HTTP_REFERER', ); /** * @param array|\ArrayAccess $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data * @param array|null $extraFields Field names and the related key inside $serverData to be added. If not provided it defaults to: url, ip, http_method, server, referrer */ public function __construct($serverData = null, array $extraFields = null) { if (null === $serverData) { $this->serverData = &$_SERVER; } elseif (is_array($serverData) || $serverData instanceof \ArrayAccess) { $this->serverData = $serverData; } else { throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.'); } if (null !== $extraFields) { if (isset($extraFields[0])) { foreach (array_keys($this->extraFields) as $fieldName) { if (!in_array($fieldName, $extraFields)) { unset($this->extraFields[$fieldName]); } } } else { $this->extraFields = $extraFields; } } } /** * @param array $record * @return array */ public function __invoke(array $record) { // skip processing if for some reason request data // is not present (CLI or wonky SAPIs) if (!isset($this->serverData['REQUEST_URI'])) { return $record; } $record['extra'] = $this->appendExtraFields($record['extra']); return $record; } /** * @param string $extraName * @param string $serverName * @return $this */ public function addExtraField($extraName, $serverName) { $this->extraFields[$extraName] = $serverName; return $this; } /** * @param array $extra * @return array */ private function appendExtraFields(array $extra) { foreach ($this->extraFields as $extraName => $serverName) { $extra[$extraName] = isset($this->serverData[$serverName]) ? $this->serverData[$serverName] : null; } if (isset($this->serverData['UNIQUE_ID'])) { $extra['unique_id'] = $this->serverData['UNIQUE_ID']; } return $extra; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/src/Monolog/Registry.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use InvalidArgumentException; /** * Monolog log registry * * Allows to get `Logger` instances in the global scope * via static method calls on this class. * * * $application = new Monolog\Logger('application'); * $api = new Monolog\Logger('api'); * * Monolog\Registry::addLogger($application); * Monolog\Registry::addLogger($api); * * function testLogger() * { * Monolog\Registry::api()->addError('Sent to $api Logger instance'); * Monolog\Registry::application()->addError('Sent to $application Logger instance'); * } * * * @author Tomas Tatarko */ class Registry { /** * List of all loggers in the registry (by named indexes) * * @var Logger[] */ private static $loggers = array(); /** * Adds new logging channel to the registry * * @param Logger $logger Instance of the logging channel * @param string|null $name Name of the logging channel ($logger->getName() by default) * @param bool $overwrite Overwrite instance in the registry if the given name already exists? * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists */ public static function addLogger(Logger $logger, $name = null, $overwrite = false) { $name = $name ?: $logger->getName(); if (isset(self::$loggers[$name]) && !$overwrite) { throw new InvalidArgumentException('Logger with the given name already exists'); } self::$loggers[$name] = $logger; } /** * Checks if such logging channel exists by name or instance * * @param string|Logger $logger Name or logger instance */ public static function hasLogger($logger) { if ($logger instanceof Logger) { $index = array_search($logger, self::$loggers, true); return false !== $index; } else { return isset(self::$loggers[$logger]); } } /** * Removes instance from registry by name or instance * * @param string|Logger $logger Name or logger instance */ public static function removeLogger($logger) { if ($logger instanceof Logger) { if (false !== ($idx = array_search($logger, self::$loggers, true))) { unset(self::$loggers[$idx]); } } else { unset(self::$loggers[$logger]); } } /** * Clears the registry */ public static function clear() { self::$loggers = array(); } /** * Gets Logger instance from the registry * * @param string $name Name of the requested Logger instance * @throws \InvalidArgumentException If named Logger instance is not in the registry * @return Logger Requested instance of Logger */ public static function getInstance($name) { if (!isset(self::$loggers[$name])) { throw new InvalidArgumentException(sprintf('Requested "%s" logger instance is not in the registry', $name)); } return self::$loggers[$name]; } /** * Gets Logger instance from the registry via static method call * * @param string $name Name of the requested Logger instance * @param array $arguments Arguments passed to static method call * @throws \InvalidArgumentException If named Logger instance is not in the registry * @return Logger Requested instance of Logger */ public static function __callStatic($name, $arguments) { return self::getInstance($name); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use Monolog\Handler\TestHandler; class ErrorHandlerTest extends \PHPUnit_Framework_TestCase { public function testHandleError() { $logger = new Logger('test', array($handler = new TestHandler)); $errHandler = new ErrorHandler($logger); $errHandler->registerErrorHandler(array(E_USER_NOTICE => Logger::EMERGENCY), false); trigger_error('Foo', E_USER_ERROR); $this->assertCount(1, $handler->getRecords()); $this->assertTrue($handler->hasErrorRecords()); trigger_error('Foo', E_USER_NOTICE); $this->assertCount(2, $handler->getRecords()); $this->assertTrue($handler->hasEmergencyRecords()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; class ChromePHPFormatterTest extends \PHPUnit_Framework_TestCase { /** * @covers Monolog\Formatter\ChromePHPFormatter::format */ public function testDefaultFormat() { $formatter = new ChromePHPFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('ip' => '127.0.0.1'), 'message' => 'log', ); $message = $formatter->format($record); $this->assertEquals( array( 'meh', array( 'message' => 'log', 'context' => array('from' => 'logger'), 'extra' => array('ip' => '127.0.0.1'), ), 'unknown', 'error', ), $message ); } /** * @covers Monolog\Formatter\ChromePHPFormatter::format */ public function testFormatWithFileAndLine() { $formatter = new ChromePHPFormatter(); $record = array( 'level' => Logger::CRITICAL, 'level_name' => 'CRITICAL', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14), 'message' => 'log', ); $message = $formatter->format($record); $this->assertEquals( array( 'meh', array( 'message' => 'log', 'context' => array('from' => 'logger'), 'extra' => array('ip' => '127.0.0.1'), ), 'test : 14', 'error', ), $message ); } /** * @covers Monolog\Formatter\ChromePHPFormatter::format */ public function testFormatWithoutContext() { $formatter = new ChromePHPFormatter(); $record = array( 'level' => Logger::DEBUG, 'level_name' => 'DEBUG', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ); $message = $formatter->format($record); $this->assertEquals( array( 'meh', 'log', 'unknown', 'log', ), $message ); } /** * @covers Monolog\Formatter\ChromePHPFormatter::formatBatch */ public function testBatchFormatThrowException() { $formatter = new ChromePHPFormatter(); $records = array( array( 'level' => Logger::INFO, 'level_name' => 'INFO', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ), array( 'level' => Logger::WARNING, 'level_name' => 'WARNING', 'channel' => 'foo', 'context' => array(), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log2', ), ); $this->assertEquals( array( array( 'meh', 'log', 'unknown', 'info', ), array( 'foo', 'log2', 'unknown', 'warn', ), ), $formatter->formatBatch($records) ); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; class ElasticaFormatterTest extends \PHPUnit_Framework_TestCase { public function setUp() { if (!class_exists("Elastica\Document")) { $this->markTestSkipped("ruflin/elastica not installed"); } } /** * @covers Monolog\Formatter\ElasticaFormatter::__construct * @covers Monolog\Formatter\ElasticaFormatter::format * @covers Monolog\Formatter\ElasticaFormatter::getDocument */ public function testFormat() { // test log message $msg = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('foo' => 7, 'bar', 'class' => new \stdClass), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ); // expected values $expected = $msg; $expected['datetime'] = '1970-01-01T00:00:00.000000+00:00'; $expected['context'] = array( 'class' => '[object] (stdClass: {})', 'foo' => 7, 0 => 'bar', ); // format log message $formatter = new ElasticaFormatter('my_index', 'doc_type'); $doc = $formatter->format($msg); $this->assertInstanceOf('Elastica\Document', $doc); // Document parameters $params = $doc->getParams(); $this->assertEquals('my_index', $params['_index']); $this->assertEquals('doc_type', $params['_type']); // Document data values $data = $doc->getData(); foreach (array_keys($expected) as $key) { $this->assertEquals($expected[$key], $data[$key]); } } /** * @covers Monolog\Formatter\ElasticaFormatter::getIndex * @covers Monolog\Formatter\ElasticaFormatter::getType */ public function testGetters() { $formatter = new ElasticaFormatter('my_index', 'doc_type'); $this->assertEquals('my_index', $formatter->getIndex()); $this->assertEquals('doc_type', $formatter->getType()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/FlowdockFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; use Monolog\TestCase; class FlowdockFormatterTest extends TestCase { /** * @covers Monolog\Formatter\FlowdockFormatter::format */ public function testFormat() { $formatter = new FlowdockFormatter('test_source', 'source@test.com'); $record = $this->getRecord(); $expected = array( 'source' => 'test_source', 'from_address' => 'source@test.com', 'subject' => 'in test_source: WARNING - test', 'content' => 'test', 'tags' => array('#logs', '#warning', '#test'), 'project' => 'test_source', ); $formatted = $formatter->format($record); $this->assertEquals($expected, $formatted['flowdock']); } /** * @ covers Monolog\Formatter\FlowdockFormatter::formatBatch */ public function testFormatBatch() { $formatter = new FlowdockFormatter('test_source', 'source@test.com'); $records = array( $this->getRecord(Logger::WARNING), $this->getRecord(Logger::DEBUG), ); $formatted = $formatter->formatBatch($records); $this->assertArrayHasKey('flowdock', $formatted[0]); $this->assertArrayHasKey('flowdock', $formatted[1]); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; use Monolog\TestCase; class FluentdFormatterTest extends TestCase { /** * @covers Monolog\Formatter\FluentdFormatter::__construct * @covers Monolog\Formatter\FluentdFormatter::isUsingLevelsInTag */ public function testConstruct() { $formatter = new FluentdFormatter(); $this->assertEquals(false, $formatter->isUsingLevelsInTag()); $formatter = new FluentdFormatter(false); $this->assertEquals(false, $formatter->isUsingLevelsInTag()); $formatter = new FluentdFormatter(true); $this->assertEquals(true, $formatter->isUsingLevelsInTag()); } /** * @covers Monolog\Formatter\FluentdFormatter::format */ public function testFormat() { $record = $this->getRecord(Logger::WARNING); $record['datetime'] = new \DateTime("@0"); $formatter = new FluentdFormatter(); $this->assertEquals( '["test",0,{"message":"test","extra":[],"level":300,"level_name":"WARNING"}]', $formatter->format($record) ); } /** * @covers Monolog\Formatter\FluentdFormatter::format */ public function testFormatWithTag() { $record = $this->getRecord(Logger::ERROR); $record['datetime'] = new \DateTime("@0"); $formatter = new FluentdFormatter(true); $this->assertEquals( '["test.error",0,{"message":"test","extra":[]}]', $formatter->format($record) ); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; class GelfMessageFormatterTest extends \PHPUnit_Framework_TestCase { public function setUp() { if (!class_exists('\Gelf\Message')) { $this->markTestSkipped("graylog2/gelf-php or mlehner/gelf-php is not installed"); } } /** * @covers Monolog\Formatter\GelfMessageFormatter::format */ public function testDefaultFormatter() { $formatter = new GelfMessageFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ); $message = $formatter->format($record); $this->assertInstanceOf('Gelf\Message', $message); $this->assertEquals(0, $message->getTimestamp()); $this->assertEquals('log', $message->getShortMessage()); $this->assertEquals('meh', $message->getFacility()); $this->assertEquals(null, $message->getLine()); $this->assertEquals(null, $message->getFile()); $this->assertEquals($this->isLegacy() ? 3 : 'error', $message->getLevel()); $this->assertNotEmpty($message->getHost()); $formatter = new GelfMessageFormatter('mysystem'); $message = $formatter->format($record); $this->assertInstanceOf('Gelf\Message', $message); $this->assertEquals('mysystem', $message->getHost()); } /** * @covers Monolog\Formatter\GelfMessageFormatter::format */ public function testFormatWithFileAndLine() { $formatter = new GelfMessageFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('file' => 'test', 'line' => 14), 'message' => 'log', ); $message = $formatter->format($record); $this->assertInstanceOf('Gelf\Message', $message); $this->assertEquals('test', $message->getFile()); $this->assertEquals(14, $message->getLine()); } /** * @covers Monolog\Formatter\GelfMessageFormatter::format * @expectedException InvalidArgumentException */ public function testFormatInvalidFails() { $formatter = new GelfMessageFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', ); $formatter->format($record); } /** * @covers Monolog\Formatter\GelfMessageFormatter::format */ public function testFormatWithContext() { $formatter = new GelfMessageFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('key' => 'pair'), 'message' => 'log', ); $message = $formatter->format($record); $this->assertInstanceOf('Gelf\Message', $message); $message_array = $message->toArray(); $this->assertArrayHasKey('_ctxt_from', $message_array); $this->assertEquals('logger', $message_array['_ctxt_from']); // Test with extraPrefix $formatter = new GelfMessageFormatter(null, null, 'CTX'); $message = $formatter->format($record); $this->assertInstanceOf('Gelf\Message', $message); $message_array = $message->toArray(); $this->assertArrayHasKey('_CTXfrom', $message_array); $this->assertEquals('logger', $message_array['_CTXfrom']); } /** * @covers Monolog\Formatter\GelfMessageFormatter::format */ public function testFormatWithContextContainingException() { $formatter = new GelfMessageFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger', 'exception' => array( 'class' => '\Exception', 'file' => '/some/file/in/dir.php:56', 'trace' => array('/some/file/1.php:23', '/some/file/2.php:3'), )), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ); $message = $formatter->format($record); $this->assertInstanceOf('Gelf\Message', $message); $this->assertEquals("/some/file/in/dir.php", $message->getFile()); $this->assertEquals("56", $message->getLine()); } /** * @covers Monolog\Formatter\GelfMessageFormatter::format */ public function testFormatWithExtra() { $formatter = new GelfMessageFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('key' => 'pair'), 'message' => 'log', ); $message = $formatter->format($record); $this->assertInstanceOf('Gelf\Message', $message); $message_array = $message->toArray(); $this->assertArrayHasKey('_key', $message_array); $this->assertEquals('pair', $message_array['_key']); // Test with extraPrefix $formatter = new GelfMessageFormatter(null, 'EXT'); $message = $formatter->format($record); $this->assertInstanceOf('Gelf\Message', $message); $message_array = $message->toArray(); $this->assertArrayHasKey('_EXTkey', $message_array); $this->assertEquals('pair', $message_array['_EXTkey']); } public function testFormatWithLargeData() { $formatter = new GelfMessageFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('exception' => str_repeat(' ', 32767)), 'datetime' => new \DateTime("@0"), 'extra' => array('key' => str_repeat(' ', 32767)), 'message' => 'log' ); $message = $formatter->format($record); $messageArray = $message->toArray(); // 200 for padding + metadata $length = 200; foreach ($messageArray as $key => $value) { if (!in_array($key, array('level', 'timestamp'))) { $length += strlen($value); } } $this->assertLessThanOrEqual(65792, $length, 'The message length is no longer than the maximum allowed length'); } public function testFormatWithUnlimitedLength() { $formatter = new GelfMessageFormatter('LONG_SYSTEM_NAME', null, 'ctxt_', PHP_INT_MAX); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('exception' => str_repeat(' ', 32767 * 2)), 'datetime' => new \DateTime("@0"), 'extra' => array('key' => str_repeat(' ', 32767 * 2)), 'message' => 'log' ); $message = $formatter->format($record); $messageArray = $message->toArray(); // 200 for padding + metadata $length = 200; foreach ($messageArray as $key => $value) { if (!in_array($key, array('level', 'timestamp'))) { $length += strlen($value); } } $this->assertGreaterThanOrEqual(131289, $length, 'The message should not be truncated'); } private function isLegacy() { return interface_exists('\Gelf\IMessagePublisher'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; use Monolog\TestCase; class JsonFormatterTest extends TestCase { /** * @covers Monolog\Formatter\JsonFormatter::__construct * @covers Monolog\Formatter\JsonFormatter::getBatchMode * @covers Monolog\Formatter\JsonFormatter::isAppendingNewlines */ public function testConstruct() { $formatter = new JsonFormatter(); $this->assertEquals(JsonFormatter::BATCH_MODE_JSON, $formatter->getBatchMode()); $this->assertEquals(true, $formatter->isAppendingNewlines()); $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES, false); $this->assertEquals(JsonFormatter::BATCH_MODE_NEWLINES, $formatter->getBatchMode()); $this->assertEquals(false, $formatter->isAppendingNewlines()); } /** * @covers Monolog\Formatter\JsonFormatter::format */ public function testFormat() { $formatter = new JsonFormatter(); $record = $this->getRecord(); $this->assertEquals(json_encode($record)."\n", $formatter->format($record)); $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); $record = $this->getRecord(); $this->assertEquals(json_encode($record), $formatter->format($record)); } /** * @covers Monolog\Formatter\JsonFormatter::formatBatch * @covers Monolog\Formatter\JsonFormatter::formatBatchJson */ public function testFormatBatch() { $formatter = new JsonFormatter(); $records = array( $this->getRecord(Logger::WARNING), $this->getRecord(Logger::DEBUG), ); $this->assertEquals(json_encode($records), $formatter->formatBatch($records)); } /** * @covers Monolog\Formatter\JsonFormatter::formatBatch * @covers Monolog\Formatter\JsonFormatter::formatBatchNewlines */ public function testFormatBatchNewlines() { $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES); $records = $expected = array( $this->getRecord(Logger::WARNING), $this->getRecord(Logger::DEBUG), ); array_walk($expected, function (&$value, $key) { $value = json_encode($value); }); $this->assertEquals(implode("\n", $expected), $formatter->formatBatch($records)); } public function testDefFormatWithException() { $formatter = new JsonFormatter(); $exception = new \RuntimeException('Foo'); $formattedException = $this->formatException($exception); $message = $this->formatRecordWithExceptionInContext($formatter, $exception); $this->assertContextContainsFormattedException($formattedException, $message); } public function testDefFormatWithPreviousException() { $formatter = new JsonFormatter(); $exception = new \RuntimeException('Foo', 0, new \LogicException('Wut?')); $formattedPrevException = $this->formatException($exception->getPrevious()); $formattedException = $this->formatException($exception, $formattedPrevException); $message = $this->formatRecordWithExceptionInContext($formatter, $exception); $this->assertContextContainsFormattedException($formattedException, $message); } public function testDefFormatWithThrowable() { if (!class_exists('Error') || !is_subclass_of('Error', 'Throwable')) { $this->markTestSkipped('Requires PHP >=7'); } $formatter = new JsonFormatter(); $throwable = new \Error('Foo'); $formattedThrowable = $this->formatException($throwable); $message = $this->formatRecordWithExceptionInContext($formatter, $throwable); $this->assertContextContainsFormattedException($formattedThrowable, $message); } /** * @param string $expected * @param string $actual * * @internal param string $exception */ private function assertContextContainsFormattedException($expected, $actual) { $this->assertEquals( '{"level_name":"CRITICAL","channel":"core","context":{"exception":'.$expected.'},"datetime":null,"extra":[],"message":"foobar"}'."\n", $actual ); } /** * @param JsonFormatter $formatter * @param \Exception|\Throwable $exception * * @return string */ private function formatRecordWithExceptionInContext(JsonFormatter $formatter, $exception) { $message = $formatter->format(array( 'level_name' => 'CRITICAL', 'channel' => 'core', 'context' => array('exception' => $exception), 'datetime' => null, 'extra' => array(), 'message' => 'foobar', )); return $message; } /** * @param \Exception|\Throwable $exception * * @return string */ private function formatExceptionFilePathWithLine($exception) { $options = 0; if (version_compare(PHP_VERSION, '5.4.0', '>=')) { $options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; } $path = substr(json_encode($exception->getFile(), $options), 1, -1); return $path . ':' . $exception->getLine(); } /** * @param \Exception|\Throwable $exception * * @param null|string $previous * * @return string */ private function formatException($exception, $previous = null) { $formattedException = '{"class":"' . get_class($exception) . '","message":"' . $exception->getMessage() . '","code":' . $exception->getCode() . ',"file":"' . $this->formatExceptionFilePathWithLine($exception) . ($previous ? '","previous":' . $previous : '"') . '}'; return $formattedException; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; /** * @covers Monolog\Formatter\LineFormatter */ class LineFormatterTest extends \PHPUnit_Framework_TestCase { public function testDefFormatWithString() { $formatter = new LineFormatter(null, 'Y-m-d'); $message = $formatter->format(array( 'level_name' => 'WARNING', 'channel' => 'log', 'context' => array(), 'message' => 'foo', 'datetime' => new \DateTime, 'extra' => array(), )); $this->assertEquals('['.date('Y-m-d').'] log.WARNING: foo [] []'."\n", $message); } public function testDefFormatWithArrayContext() { $formatter = new LineFormatter(null, 'Y-m-d'); $message = $formatter->format(array( 'level_name' => 'ERROR', 'channel' => 'meh', 'message' => 'foo', 'datetime' => new \DateTime, 'extra' => array(), 'context' => array( 'foo' => 'bar', 'baz' => 'qux', 'bool' => false, 'null' => null, ), )); $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foo {"foo":"bar","baz":"qux","bool":false,"null":null} []'."\n", $message); } public function testDefFormatExtras() { $formatter = new LineFormatter(null, 'Y-m-d'); $message = $formatter->format(array( 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime, 'extra' => array('ip' => '127.0.0.1'), 'message' => 'log', )); $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] {"ip":"127.0.0.1"}'."\n", $message); } public function testFormatExtras() { $formatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra.file% %extra%\n", 'Y-m-d'); $message = $formatter->format(array( 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime, 'extra' => array('ip' => '127.0.0.1', 'file' => 'test'), 'message' => 'log', )); $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] test {"ip":"127.0.0.1"}'."\n", $message); } public function testContextAndExtraOptionallyNotShownIfEmpty() { $formatter = new LineFormatter(null, 'Y-m-d', false, true); $message = $formatter->format(array( 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime, 'extra' => array(), 'message' => 'log', )); $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log '."\n", $message); } public function testContextAndExtraReplacement() { $formatter = new LineFormatter('%context.foo% => %extra.foo%'); $message = $formatter->format(array( 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('foo' => 'bar'), 'datetime' => new \DateTime, 'extra' => array('foo' => 'xbar'), 'message' => 'log', )); $this->assertEquals('bar => xbar', $message); } public function testDefFormatWithObject() { $formatter = new LineFormatter(null, 'Y-m-d'); $message = $formatter->format(array( 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime, 'extra' => array('foo' => new TestFoo, 'bar' => new TestBar, 'baz' => array(), 'res' => fopen('php://memory', 'rb')), 'message' => 'foobar', )); $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foobar [] {"foo":"[object] (Monolog\\\\Formatter\\\\TestFoo: {\\"foo\\":\\"foo\\"})","bar":"[object] (Monolog\\\\Formatter\\\\TestBar: bar)","baz":[],"res":"[resource] (stream)"}'."\n", $message); } public function testDefFormatWithException() { $formatter = new LineFormatter(null, 'Y-m-d'); $message = $formatter->format(array( 'level_name' => 'CRITICAL', 'channel' => 'core', 'context' => array('exception' => new \RuntimeException('Foo')), 'datetime' => new \DateTime, 'extra' => array(), 'message' => 'foobar', )); $path = str_replace('\\/', '/', json_encode(__FILE__)); $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException(code: 0): Foo at '.substr($path, 1, -1).':'.(__LINE__ - 8).')"} []'."\n", $message); } public function testDefFormatWithPreviousException() { $formatter = new LineFormatter(null, 'Y-m-d'); $previous = new \LogicException('Wut?'); $message = $formatter->format(array( 'level_name' => 'CRITICAL', 'channel' => 'core', 'context' => array('exception' => new \RuntimeException('Foo', 0, $previous)), 'datetime' => new \DateTime, 'extra' => array(), 'message' => 'foobar', )); $path = str_replace('\\/', '/', json_encode(__FILE__)); $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException(code: 0): Foo at '.substr($path, 1, -1).':'.(__LINE__ - 8).', LogicException(code: 0): Wut? at '.substr($path, 1, -1).':'.(__LINE__ - 12).')"} []'."\n", $message); } public function testBatchFormat() { $formatter = new LineFormatter(null, 'Y-m-d'); $message = $formatter->formatBatch(array( array( 'level_name' => 'CRITICAL', 'channel' => 'test', 'message' => 'bar', 'context' => array(), 'datetime' => new \DateTime, 'extra' => array(), ), array( 'level_name' => 'WARNING', 'channel' => 'log', 'message' => 'foo', 'context' => array(), 'datetime' => new \DateTime, 'extra' => array(), ), )); $this->assertEquals('['.date('Y-m-d').'] test.CRITICAL: bar [] []'."\n".'['.date('Y-m-d').'] log.WARNING: foo [] []'."\n", $message); } public function testFormatShouldStripInlineLineBreaks() { $formatter = new LineFormatter(null, 'Y-m-d'); $message = $formatter->format( array( 'message' => "foo\nbar", 'context' => array(), 'extra' => array(), ) ); $this->assertRegExp('/foo bar/', $message); } public function testFormatShouldNotStripInlineLineBreaksWhenFlagIsSet() { $formatter = new LineFormatter(null, 'Y-m-d', true); $message = $formatter->format( array( 'message' => "foo\nbar", 'context' => array(), 'extra' => array(), ) ); $this->assertRegExp('/foo\nbar/', $message); } } class TestFoo { public $foo = 'foo'; } class TestBar { public function __toString() { return 'bar'; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/LogglyFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\TestCase; class LogglyFormatterTest extends TestCase { /** * @covers Monolog\Formatter\LogglyFormatter::__construct */ public function testConstruct() { $formatter = new LogglyFormatter(); $this->assertEquals(LogglyFormatter::BATCH_MODE_NEWLINES, $formatter->getBatchMode()); $formatter = new LogglyFormatter(LogglyFormatter::BATCH_MODE_JSON); $this->assertEquals(LogglyFormatter::BATCH_MODE_JSON, $formatter->getBatchMode()); } /** * @covers Monolog\Formatter\LogglyFormatter::format */ public function testFormat() { $formatter = new LogglyFormatter(); $record = $this->getRecord(); $formatted_decoded = json_decode($formatter->format($record), true); $this->assertArrayHasKey("timestamp", $formatted_decoded); $this->assertEquals(new \DateTime($formatted_decoded["timestamp"]), $record["datetime"]); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; class LogstashFormatterTest extends \PHPUnit_Framework_TestCase { public function tearDown() { \PHPUnit_Framework_Error_Warning::$enabled = true; return parent::tearDown(); } /** * @covers Monolog\Formatter\LogstashFormatter::format */ public function testDefaultFormatter() { $formatter = new LogstashFormatter('test', 'hostname'); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']); $this->assertEquals('log', $message['@message']); $this->assertEquals('meh', $message['@fields']['channel']); $this->assertContains('meh', $message['@tags']); $this->assertEquals(Logger::ERROR, $message['@fields']['level']); $this->assertEquals('test', $message['@type']); $this->assertEquals('hostname', $message['@source']); $formatter = new LogstashFormatter('mysystem'); $message = json_decode($formatter->format($record), true); $this->assertEquals('mysystem', $message['@type']); } /** * @covers Monolog\Formatter\LogstashFormatter::format */ public function testFormatWithFileAndLine() { $formatter = new LogstashFormatter('test'); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('file' => 'test', 'line' => 14), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $this->assertEquals('test', $message['@fields']['file']); $this->assertEquals(14, $message['@fields']['line']); } /** * @covers Monolog\Formatter\LogstashFormatter::format */ public function testFormatWithContext() { $formatter = new LogstashFormatter('test'); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('key' => 'pair'), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $message_array = $message['@fields']; $this->assertArrayHasKey('ctxt_from', $message_array); $this->assertEquals('logger', $message_array['ctxt_from']); // Test with extraPrefix $formatter = new LogstashFormatter('test', null, null, 'CTX'); $message = json_decode($formatter->format($record), true); $message_array = $message['@fields']; $this->assertArrayHasKey('CTXfrom', $message_array); $this->assertEquals('logger', $message_array['CTXfrom']); } /** * @covers Monolog\Formatter\LogstashFormatter::format */ public function testFormatWithExtra() { $formatter = new LogstashFormatter('test'); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('key' => 'pair'), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $message_array = $message['@fields']; $this->assertArrayHasKey('key', $message_array); $this->assertEquals('pair', $message_array['key']); // Test with extraPrefix $formatter = new LogstashFormatter('test', null, 'EXT'); $message = json_decode($formatter->format($record), true); $message_array = $message['@fields']; $this->assertArrayHasKey('EXTkey', $message_array); $this->assertEquals('pair', $message_array['EXTkey']); } public function testFormatWithApplicationName() { $formatter = new LogstashFormatter('app', 'test'); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('key' => 'pair'), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $this->assertArrayHasKey('@type', $message); $this->assertEquals('app', $message['@type']); } /** * @covers Monolog\Formatter\LogstashFormatter::format */ public function testDefaultFormatterV1() { $formatter = new LogstashFormatter('test', 'hostname', null, 'ctxt_', LogstashFormatter::V1); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']); $this->assertEquals("1", $message['@version']); $this->assertEquals('log', $message['message']); $this->assertEquals('meh', $message['channel']); $this->assertEquals('ERROR', $message['level']); $this->assertEquals('test', $message['type']); $this->assertEquals('hostname', $message['host']); $formatter = new LogstashFormatter('mysystem', null, null, 'ctxt_', LogstashFormatter::V1); $message = json_decode($formatter->format($record), true); $this->assertEquals('mysystem', $message['type']); } /** * @covers Monolog\Formatter\LogstashFormatter::format */ public function testFormatWithFileAndLineV1() { $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('file' => 'test', 'line' => 14), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $this->assertEquals('test', $message['file']); $this->assertEquals(14, $message['line']); } /** * @covers Monolog\Formatter\LogstashFormatter::format */ public function testFormatWithContextV1() { $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('key' => 'pair'), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $this->assertArrayHasKey('ctxt_from', $message); $this->assertEquals('logger', $message['ctxt_from']); // Test with extraPrefix $formatter = new LogstashFormatter('test', null, null, 'CTX', LogstashFormatter::V1); $message = json_decode($formatter->format($record), true); $this->assertArrayHasKey('CTXfrom', $message); $this->assertEquals('logger', $message['CTXfrom']); } /** * @covers Monolog\Formatter\LogstashFormatter::format */ public function testFormatWithExtraV1() { $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('key' => 'pair'), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $this->assertArrayHasKey('key', $message); $this->assertEquals('pair', $message['key']); // Test with extraPrefix $formatter = new LogstashFormatter('test', null, 'EXT', 'ctxt_', LogstashFormatter::V1); $message = json_decode($formatter->format($record), true); $this->assertArrayHasKey('EXTkey', $message); $this->assertEquals('pair', $message['EXTkey']); } public function testFormatWithApplicationNameV1() { $formatter = new LogstashFormatter('app', 'test', null, 'ctxt_', LogstashFormatter::V1); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('key' => 'pair'), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $this->assertArrayHasKey('type', $message); $this->assertEquals('app', $message['type']); } public function testFormatWithLatin9Data() { if (version_compare(PHP_VERSION, '5.5.0', '<')) { // Ignore the warning that will be emitted by PHP <5.5.0 \PHPUnit_Framework_Error_Warning::$enabled = false; } $formatter = new LogstashFormatter('test', 'hostname'); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => '¯\_(ツ)_/¯', 'context' => array(), 'datetime' => new \DateTime("@0"), 'extra' => array( 'user_agent' => "\xD6WN; FBCR/OrangeEspa\xF1a; Vers\xE3o/4.0; F\xE4rist", ), 'message' => 'log', ); $message = json_decode($formatter->format($record), true); $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']); $this->assertEquals('log', $message['@message']); $this->assertEquals('¯\_(ツ)_/¯', $message['@fields']['channel']); $this->assertContains('¯\_(ツ)_/¯', $message['@tags']); $this->assertEquals(Logger::ERROR, $message['@fields']['level']); $this->assertEquals('test', $message['@type']); $this->assertEquals('hostname', $message['@source']); if (version_compare(PHP_VERSION, '5.5.0', '>=')) { $this->assertEquals('ÖWN; FBCR/OrangeEspaña; Versão/4.0; Färist', $message['@fields']['user_agent']); } else { // PHP <5.5 does not return false for an element encoding failure, // instead it emits a warning (possibly) and nulls the value. $this->assertEquals(null, $message['@fields']['user_agent']); } } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/MongoDBFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; /** * @author Florian Plattner */ class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase { public function setUp() { if (!class_exists('MongoDate')) { $this->markTestSkipped('mongo extension not installed'); } } public function constructArgumentProvider() { return array( array(1, true, 1, true), array(0, false, 0, false), ); } /** * @param $traceDepth * @param $traceAsString * @param $expectedTraceDepth * @param $expectedTraceAsString * * @dataProvider constructArgumentProvider */ public function testConstruct($traceDepth, $traceAsString, $expectedTraceDepth, $expectedTraceAsString) { $formatter = new MongoDBFormatter($traceDepth, $traceAsString); $reflTrace = new \ReflectionProperty($formatter, 'exceptionTraceAsString'); $reflTrace->setAccessible(true); $this->assertEquals($expectedTraceAsString, $reflTrace->getValue($formatter)); $reflDepth = new\ReflectionProperty($formatter, 'maxNestingLevel'); $reflDepth->setAccessible(true); $this->assertEquals($expectedTraceDepth, $reflDepth->getValue($formatter)); } public function testSimpleFormat() { $record = array( 'message' => 'some log message', 'context' => array(), 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', 'datetime' => new \DateTime('2014-02-01 00:00:00'), 'extra' => array(), ); $formatter = new MongoDBFormatter(); $formattedRecord = $formatter->format($record); $this->assertCount(7, $formattedRecord); $this->assertEquals('some log message', $formattedRecord['message']); $this->assertEquals(array(), $formattedRecord['context']); $this->assertEquals(Logger::WARNING, $formattedRecord['level']); $this->assertEquals(Logger::getLevelName(Logger::WARNING), $formattedRecord['level_name']); $this->assertEquals('test', $formattedRecord['channel']); $this->assertInstanceOf('\MongoDate', $formattedRecord['datetime']); $this->assertEquals('0.00000000 1391212800', $formattedRecord['datetime']->__toString()); $this->assertEquals(array(), $formattedRecord['extra']); } public function testRecursiveFormat() { $someObject = new \stdClass(); $someObject->foo = 'something'; $someObject->bar = 'stuff'; $record = array( 'message' => 'some log message', 'context' => array( 'stuff' => new \DateTime('2014-02-01 02:31:33'), 'some_object' => $someObject, 'context_string' => 'some string', 'context_int' => 123456, 'except' => new \Exception('exception message', 987), ), 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', 'datetime' => new \DateTime('2014-02-01 00:00:00'), 'extra' => array(), ); $formatter = new MongoDBFormatter(); $formattedRecord = $formatter->format($record); $this->assertCount(5, $formattedRecord['context']); $this->assertInstanceOf('\MongoDate', $formattedRecord['context']['stuff']); $this->assertEquals('0.00000000 1391221893', $formattedRecord['context']['stuff']->__toString()); $this->assertEquals( array( 'foo' => 'something', 'bar' => 'stuff', 'class' => 'stdClass', ), $formattedRecord['context']['some_object'] ); $this->assertEquals('some string', $formattedRecord['context']['context_string']); $this->assertEquals(123456, $formattedRecord['context']['context_int']); $this->assertCount(5, $formattedRecord['context']['except']); $this->assertEquals('exception message', $formattedRecord['context']['except']['message']); $this->assertEquals(987, $formattedRecord['context']['except']['code']); $this->assertInternalType('string', $formattedRecord['context']['except']['file']); $this->assertInternalType('integer', $formattedRecord['context']['except']['code']); $this->assertInternalType('string', $formattedRecord['context']['except']['trace']); $this->assertEquals('Exception', $formattedRecord['context']['except']['class']); } public function testFormatDepthArray() { $record = array( 'message' => 'some log message', 'context' => array( 'nest2' => array( 'property' => 'anything', 'nest3' => array( 'nest4' => 'value', 'property' => 'nothing', ), ), ), 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', 'datetime' => new \DateTime('2014-02-01 00:00:00'), 'extra' => array(), ); $formatter = new MongoDBFormatter(2); $formattedResult = $formatter->format($record); $this->assertEquals( array( 'nest2' => array( 'property' => 'anything', 'nest3' => '[...]', ), ), $formattedResult['context'] ); } public function testFormatDepthArrayInfiniteNesting() { $record = array( 'message' => 'some log message', 'context' => array( 'nest2' => array( 'property' => 'something', 'nest3' => array( 'property' => 'anything', 'nest4' => array( 'property' => 'nothing', ), ), ), ), 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', 'datetime' => new \DateTime('2014-02-01 00:00:00'), 'extra' => array(), ); $formatter = new MongoDBFormatter(0); $formattedResult = $formatter->format($record); $this->assertEquals( array( 'nest2' => array( 'property' => 'something', 'nest3' => array( 'property' => 'anything', 'nest4' => array( 'property' => 'nothing', ), ), ), ), $formattedResult['context'] ); } public function testFormatDepthObjects() { $someObject = new \stdClass(); $someObject->property = 'anything'; $someObject->nest3 = new \stdClass(); $someObject->nest3->property = 'nothing'; $someObject->nest3->nest4 = 'invisible'; $record = array( 'message' => 'some log message', 'context' => array( 'nest2' => $someObject, ), 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', 'datetime' => new \DateTime('2014-02-01 00:00:00'), 'extra' => array(), ); $formatter = new MongoDBFormatter(2, true); $formattedResult = $formatter->format($record); $this->assertEquals( array( 'nest2' => array( 'property' => 'anything', 'nest3' => '[...]', 'class' => 'stdClass', ), ), $formattedResult['context'] ); } public function testFormatDepthException() { $record = array( 'message' => 'some log message', 'context' => array( 'nest2' => new \Exception('exception message', 987), ), 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'test', 'datetime' => new \DateTime('2014-02-01 00:00:00'), 'extra' => array(), ); $formatter = new MongoDBFormatter(2, false); $formattedRecord = $formatter->format($record); $this->assertEquals('exception message', $formattedRecord['context']['nest2']['message']); $this->assertEquals(987, $formattedRecord['context']['nest2']['code']); $this->assertEquals('[...]', $formattedRecord['context']['nest2']['trace']); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; /** * @covers Monolog\Formatter\NormalizerFormatter */ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase { public function tearDown() { \PHPUnit_Framework_Error_Warning::$enabled = true; return parent::tearDown(); } public function testFormat() { $formatter = new NormalizerFormatter('Y-m-d'); $formatted = $formatter->format(array( 'level_name' => 'ERROR', 'channel' => 'meh', 'message' => 'foo', 'datetime' => new \DateTime, 'extra' => array('foo' => new TestFooNorm, 'bar' => new TestBarNorm, 'baz' => array(), 'res' => fopen('php://memory', 'rb')), 'context' => array( 'foo' => 'bar', 'baz' => 'qux', 'inf' => INF, '-inf' => -INF, 'nan' => acos(4), ), )); $this->assertEquals(array( 'level_name' => 'ERROR', 'channel' => 'meh', 'message' => 'foo', 'datetime' => date('Y-m-d'), 'extra' => array( 'foo' => '[object] (Monolog\\Formatter\\TestFooNorm: {"foo":"foo"})', 'bar' => '[object] (Monolog\\Formatter\\TestBarNorm: bar)', 'baz' => array(), 'res' => '[resource] (stream)', ), 'context' => array( 'foo' => 'bar', 'baz' => 'qux', 'inf' => 'INF', '-inf' => '-INF', 'nan' => 'NaN', ), ), $formatted); } public function testFormatExceptions() { $formatter = new NormalizerFormatter('Y-m-d'); $e = new \LogicException('bar'); $e2 = new \RuntimeException('foo', 0, $e); $formatted = $formatter->format(array( 'exception' => $e2, )); $this->assertGreaterThan(5, count($formatted['exception']['trace'])); $this->assertTrue(isset($formatted['exception']['previous'])); unset($formatted['exception']['trace'], $formatted['exception']['previous']); $this->assertEquals(array( 'exception' => array( 'class' => get_class($e2), 'message' => $e2->getMessage(), 'code' => $e2->getCode(), 'file' => $e2->getFile().':'.$e2->getLine(), ), ), $formatted); } public function testFormatSoapFaultException() { if (!class_exists('SoapFault')) { $this->markTestSkipped('Requires the soap extension'); } $formatter = new NormalizerFormatter('Y-m-d'); $e = new \SoapFault('foo', 'bar', 'hello', 'world'); $formatted = $formatter->format(array( 'exception' => $e, )); unset($formatted['exception']['trace']); $this->assertEquals(array( 'exception' => array( 'class' => 'SoapFault', 'message' => 'bar', 'code' => 0, 'file' => $e->getFile().':'.$e->getLine(), 'faultcode' => 'foo', 'faultactor' => 'hello', 'detail' => 'world', ), ), $formatted); } public function testFormatToStringExceptionHandle() { $formatter = new NormalizerFormatter('Y-m-d'); $this->setExpectedException('RuntimeException', 'Could not convert to string'); $formatter->format(array( 'myObject' => new TestToStringError(), )); } public function testBatchFormat() { $formatter = new NormalizerFormatter('Y-m-d'); $formatted = $formatter->formatBatch(array( array( 'level_name' => 'CRITICAL', 'channel' => 'test', 'message' => 'bar', 'context' => array(), 'datetime' => new \DateTime, 'extra' => array(), ), array( 'level_name' => 'WARNING', 'channel' => 'log', 'message' => 'foo', 'context' => array(), 'datetime' => new \DateTime, 'extra' => array(), ), )); $this->assertEquals(array( array( 'level_name' => 'CRITICAL', 'channel' => 'test', 'message' => 'bar', 'context' => array(), 'datetime' => date('Y-m-d'), 'extra' => array(), ), array( 'level_name' => 'WARNING', 'channel' => 'log', 'message' => 'foo', 'context' => array(), 'datetime' => date('Y-m-d'), 'extra' => array(), ), ), $formatted); } /** * Test issue #137 */ public function testIgnoresRecursiveObjectReferences() { // set up the recursion $foo = new \stdClass(); $bar = new \stdClass(); $foo->bar = $bar; $bar->foo = $foo; // set an error handler to assert that the error is not raised anymore $that = $this; set_error_handler(function ($level, $message, $file, $line, $context) use ($that) { if (error_reporting() & $level) { restore_error_handler(); $that->fail("$message should not be raised"); } }); $formatter = new NormalizerFormatter(); $reflMethod = new \ReflectionMethod($formatter, 'toJson'); $reflMethod->setAccessible(true); $res = $reflMethod->invoke($formatter, array($foo, $bar), true); restore_error_handler(); $this->assertEquals(@json_encode(array($foo, $bar)), $res); } public function testIgnoresInvalidTypes() { // set up the recursion $resource = fopen(__FILE__, 'r'); // set an error handler to assert that the error is not raised anymore $that = $this; set_error_handler(function ($level, $message, $file, $line, $context) use ($that) { if (error_reporting() & $level) { restore_error_handler(); $that->fail("$message should not be raised"); } }); $formatter = new NormalizerFormatter(); $reflMethod = new \ReflectionMethod($formatter, 'toJson'); $reflMethod->setAccessible(true); $res = $reflMethod->invoke($formatter, array($resource), true); restore_error_handler(); $this->assertEquals(@json_encode(array($resource)), $res); } public function testNormalizeHandleLargeArrays() { $formatter = new NormalizerFormatter(); $largeArray = range(1, 2000); $res = $formatter->format(array( 'level_name' => 'CRITICAL', 'channel' => 'test', 'message' => 'bar', 'context' => array($largeArray), 'datetime' => new \DateTime, 'extra' => array(), )); $this->assertCount(1000, $res['context'][0]); $this->assertEquals('Over 1000 items (2000 total), aborting normalization', $res['context'][0]['...']); } /** * @expectedException RuntimeException */ public function testThrowsOnInvalidEncoding() { if (version_compare(PHP_VERSION, '5.5.0', '<')) { // Ignore the warning that will be emitted by PHP <5.5.0 \PHPUnit_Framework_Error_Warning::$enabled = false; } $formatter = new NormalizerFormatter(); $reflMethod = new \ReflectionMethod($formatter, 'toJson'); $reflMethod->setAccessible(true); // send an invalid unicode sequence as a object that can't be cleaned $record = new \stdClass; $record->message = "\xB1\x31"; $res = $reflMethod->invoke($formatter, $record); if (PHP_VERSION_ID < 50500 && $res === '{"message":null}') { throw new \RuntimeException('PHP 5.3/5.4 throw a warning and null the value instead of returning false entirely'); } } public function testConvertsInvalidEncodingAsLatin9() { if (version_compare(PHP_VERSION, '5.5.0', '<')) { // Ignore the warning that will be emitted by PHP <5.5.0 \PHPUnit_Framework_Error_Warning::$enabled = false; } $formatter = new NormalizerFormatter(); $reflMethod = new \ReflectionMethod($formatter, 'toJson'); $reflMethod->setAccessible(true); $res = $reflMethod->invoke($formatter, array('message' => "\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE")); if (version_compare(PHP_VERSION, '5.5.0', '>=')) { $this->assertSame('{"message":"€ŠšŽžŒœŸ"}', $res); } else { // PHP <5.5 does not return false for an element encoding failure, // instead it emits a warning (possibly) and nulls the value. $this->assertSame('{"message":null}', $res); } } /** * @param mixed $in Input * @param mixed $expect Expected output * @covers Monolog\Formatter\NormalizerFormatter::detectAndCleanUtf8 * @dataProvider providesDetectAndCleanUtf8 */ public function testDetectAndCleanUtf8($in, $expect) { $formatter = new NormalizerFormatter(); $formatter->detectAndCleanUtf8($in); $this->assertSame($expect, $in); } public function providesDetectAndCleanUtf8() { $obj = new \stdClass; return array( 'null' => array(null, null), 'int' => array(123, 123), 'float' => array(123.45, 123.45), 'bool false' => array(false, false), 'bool true' => array(true, true), 'ascii string' => array('abcdef', 'abcdef'), 'latin9 string' => array("\xB1\x31\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE\xFF", '±1€ŠšŽžŒœŸÿ'), 'unicode string' => array('¤¦¨´¸¼½¾€ŠšŽžŒœŸ', '¤¦¨´¸¼½¾€ŠšŽžŒœŸ'), 'empty array' => array(array(), array()), 'array' => array(array('abcdef'), array('abcdef')), 'object' => array($obj, $obj), ); } /** * @param int $code * @param string $msg * @dataProvider providesHandleJsonErrorFailure */ public function testHandleJsonErrorFailure($code, $msg) { $formatter = new NormalizerFormatter(); $reflMethod = new \ReflectionMethod($formatter, 'handleJsonError'); $reflMethod->setAccessible(true); $this->setExpectedException('RuntimeException', $msg); $reflMethod->invoke($formatter, $code, 'faked'); } public function providesHandleJsonErrorFailure() { return array( 'depth' => array(JSON_ERROR_DEPTH, 'Maximum stack depth exceeded'), 'state' => array(JSON_ERROR_STATE_MISMATCH, 'Underflow or the modes mismatch'), 'ctrl' => array(JSON_ERROR_CTRL_CHAR, 'Unexpected control character found'), 'default' => array(-1, 'Unknown error'), ); } public function testExceptionTraceWithArgs() { if (defined('HHVM_VERSION')) { $this->markTestSkipped('Not supported in HHVM since it detects errors differently'); } // This happens i.e. in React promises or Guzzle streams where stream wrappers are registered // and no file or line are included in the trace because it's treated as internal function set_error_handler(function ($errno, $errstr, $errfile, $errline) { throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); }); try { // This will contain $resource and $wrappedResource as arguments in the trace item $resource = fopen('php://memory', 'rw+'); fwrite($resource, 'test_resource'); $wrappedResource = new TestFooNorm; $wrappedResource->foo = $resource; // Just do something stupid with a resource/wrapped resource as argument array_keys($wrappedResource); } catch (\Exception $e) { restore_error_handler(); } $formatter = new NormalizerFormatter(); $record = array('context' => array('exception' => $e)); $result = $formatter->format($record); $this->assertRegExp( '%"resource":"\[resource\] \(stream\)"%', $result['context']['exception']['trace'][0] ); if (version_compare(PHP_VERSION, '5.5.0', '>=')) { $pattern = '%"wrappedResource":"\[object\] \(Monolog\\\\\\\\Formatter\\\\\\\\TestFooNorm: \)"%'; } else { $pattern = '%\\\\"foo\\\\":null%'; } // Tests that the wrapped resource is ignored while encoding, only works for PHP <= 5.4 $this->assertRegExp( $pattern, $result['context']['exception']['trace'][0] ); } } class TestFooNorm { public $foo = 'foo'; } class TestBarNorm { public function __toString() { return 'bar'; } } class TestStreamFoo { public $foo; public $resource; public function __construct($resource) { $this->resource = $resource; $this->foo = 'BAR'; } public function __toString() { fseek($this->resource, 0); return $this->foo . ' - ' . (string) stream_get_contents($this->resource); } } class TestToStringError { public function __toString() { throw new \RuntimeException('Could not convert to string'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; class ScalarFormatterTest extends \PHPUnit_Framework_TestCase { private $formatter; public function setUp() { $this->formatter = new ScalarFormatter(); } public function buildTrace(\Exception $e) { $data = array(); $trace = $e->getTrace(); foreach ($trace as $frame) { if (isset($frame['file'])) { $data[] = $frame['file'].':'.$frame['line']; } else { $data[] = json_encode($frame); } } return $data; } public function encodeJson($data) { if (version_compare(PHP_VERSION, '5.4.0', '>=')) { return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } return json_encode($data); } public function testFormat() { $exception = new \Exception('foo'); $formatted = $this->formatter->format(array( 'foo' => 'string', 'bar' => 1, 'baz' => false, 'bam' => array(1, 2, 3), 'bat' => array('foo' => 'bar'), 'bap' => \DateTime::createFromFormat(\DateTime::ISO8601, '1970-01-01T00:00:00+0000'), 'ban' => $exception, )); $this->assertSame(array( 'foo' => 'string', 'bar' => 1, 'baz' => false, 'bam' => $this->encodeJson(array(1, 2, 3)), 'bat' => $this->encodeJson(array('foo' => 'bar')), 'bap' => '1970-01-01 00:00:00', 'ban' => $this->encodeJson(array( 'class' => get_class($exception), 'message' => $exception->getMessage(), 'code' => $exception->getCode(), 'file' => $exception->getFile() . ':' . $exception->getLine(), 'trace' => $this->buildTrace($exception), )), ), $formatted); } public function testFormatWithErrorContext() { $context = array('file' => 'foo', 'line' => 1); $formatted = $this->formatter->format(array( 'context' => $context, )); $this->assertSame(array( 'context' => $this->encodeJson($context), ), $formatted); } public function testFormatWithExceptionContext() { $exception = new \Exception('foo'); $formatted = $this->formatter->format(array( 'context' => array( 'exception' => $exception, ), )); $this->assertSame(array( 'context' => $this->encodeJson(array( 'exception' => array( 'class' => get_class($exception), 'message' => $exception->getMessage(), 'code' => $exception->getCode(), 'file' => $exception->getFile() . ':' . $exception->getLine(), 'trace' => $this->buildTrace($exception), ), )), ), $formatted); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; class WildfireFormatterTest extends \PHPUnit_Framework_TestCase { /** * @covers Monolog\Formatter\WildfireFormatter::format */ public function testDefaultFormat() { $wildfire = new WildfireFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('ip' => '127.0.0.1'), 'message' => 'log', ); $message = $wildfire->format($record); $this->assertEquals( '125|[{"Type":"ERROR","File":"","Line":"","Label":"meh"},' .'{"message":"log","context":{"from":"logger"},"extra":{"ip":"127.0.0.1"}}]|', $message ); } /** * @covers Monolog\Formatter\WildfireFormatter::format */ public function testFormatWithFileAndLine() { $wildfire = new WildfireFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('from' => 'logger'), 'datetime' => new \DateTime("@0"), 'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14), 'message' => 'log', ); $message = $wildfire->format($record); $this->assertEquals( '129|[{"Type":"ERROR","File":"test","Line":14,"Label":"meh"},' .'{"message":"log","context":{"from":"logger"},"extra":{"ip":"127.0.0.1"}}]|', $message ); } /** * @covers Monolog\Formatter\WildfireFormatter::format */ public function testFormatWithoutContext() { $wildfire = new WildfireFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ); $message = $wildfire->format($record); $this->assertEquals( '58|[{"Type":"ERROR","File":"","Line":"","Label":"meh"},"log"]|', $message ); } /** * @covers Monolog\Formatter\WildfireFormatter::formatBatch * @expectedException BadMethodCallException */ public function testBatchFormatThrowException() { $wildfire = new WildfireFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array(), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ); $wildfire->formatBatch(array($record)); } /** * @covers Monolog\Formatter\WildfireFormatter::format */ public function testTableFormat() { $wildfire = new WildfireFormatter(); $record = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'table-channel', 'context' => array( WildfireFormatter::TABLE => array( array('col1', 'col2', 'col3'), array('val1', 'val2', 'val3'), array('foo1', 'foo2', 'foo3'), array('bar1', 'bar2', 'bar3'), ), ), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'table-message', ); $message = $wildfire->format($record); $this->assertEquals( '171|[{"Type":"TABLE","File":"","Line":"","Label":"table-channel: table-message"},[["col1","col2","col3"],["val1","val2","val3"],["foo1","foo2","foo3"],["bar1","bar2","bar3"]]]|', $message ); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use Monolog\Formatter\LineFormatter; use Monolog\Processor\WebProcessor; class AbstractHandlerTest extends TestCase { /** * @covers Monolog\Handler\AbstractHandler::__construct * @covers Monolog\Handler\AbstractHandler::getLevel * @covers Monolog\Handler\AbstractHandler::setLevel * @covers Monolog\Handler\AbstractHandler::getBubble * @covers Monolog\Handler\AbstractHandler::setBubble * @covers Monolog\Handler\AbstractHandler::getFormatter * @covers Monolog\Handler\AbstractHandler::setFormatter */ public function testConstructAndGetSet() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array(Logger::WARNING, false)); $this->assertEquals(Logger::WARNING, $handler->getLevel()); $this->assertEquals(false, $handler->getBubble()); $handler->setLevel(Logger::ERROR); $handler->setBubble(true); $handler->setFormatter($formatter = new LineFormatter); $this->assertEquals(Logger::ERROR, $handler->getLevel()); $this->assertEquals(true, $handler->getBubble()); $this->assertSame($formatter, $handler->getFormatter()); } /** * @covers Monolog\Handler\AbstractHandler::handleBatch */ public function testHandleBatch() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); $handler->expects($this->exactly(2)) ->method('handle'); $handler->handleBatch(array($this->getRecord(), $this->getRecord())); } /** * @covers Monolog\Handler\AbstractHandler::isHandling */ public function testIsHandling() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array(Logger::WARNING, false)); $this->assertTrue($handler->isHandling($this->getRecord())); $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); } /** * @covers Monolog\Handler\AbstractHandler::__construct */ public function testHandlesPsrStyleLevels() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array('warning', false)); $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); $handler->setLevel('debug'); $this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG))); } /** * @covers Monolog\Handler\AbstractHandler::getFormatter * @covers Monolog\Handler\AbstractHandler::getDefaultFormatter */ public function testGetFormatterInitializesDefault() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); $this->assertInstanceOf('Monolog\Formatter\LineFormatter', $handler->getFormatter()); } /** * @covers Monolog\Handler\AbstractHandler::pushProcessor * @covers Monolog\Handler\AbstractHandler::popProcessor * @expectedException LogicException */ public function testPushPopProcessor() { $logger = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); $processor1 = new WebProcessor; $processor2 = new WebProcessor; $logger->pushProcessor($processor1); $logger->pushProcessor($processor2); $this->assertEquals($processor2, $logger->popProcessor()); $this->assertEquals($processor1, $logger->popProcessor()); $logger->popProcessor(); } /** * @covers Monolog\Handler\AbstractHandler::pushProcessor * @expectedException InvalidArgumentException */ public function testPushProcessorWithNonCallable() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); $handler->pushProcessor(new \stdClass()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use Monolog\Processor\WebProcessor; class AbstractProcessingHandlerTest extends TestCase { /** * @covers Monolog\Handler\AbstractProcessingHandler::handle */ public function testHandleLowerLevelMessage() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::WARNING, true)); $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG))); } /** * @covers Monolog\Handler\AbstractProcessingHandler::handle */ public function testHandleBubbling() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::DEBUG, true)); $this->assertFalse($handler->handle($this->getRecord())); } /** * @covers Monolog\Handler\AbstractProcessingHandler::handle */ public function testHandleNotBubbling() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::DEBUG, false)); $this->assertTrue($handler->handle($this->getRecord())); } /** * @covers Monolog\Handler\AbstractProcessingHandler::handle */ public function testHandleIsFalseWhenNotHandled() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::WARNING, false)); $this->assertTrue($handler->handle($this->getRecord())); $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG))); } /** * @covers Monolog\Handler\AbstractProcessingHandler::processRecord */ public function testProcessRecord() { $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler'); $handler->pushProcessor(new WebProcessor(array( 'REQUEST_URI' => '', 'REQUEST_METHOD' => '', 'REMOTE_ADDR' => '', 'SERVER_NAME' => '', 'UNIQUE_ID' => '', ))); $handledRecord = null; $handler->expects($this->once()) ->method('write') ->will($this->returnCallback(function ($record) use (&$handledRecord) { $handledRecord = $record; })) ; $handler->handle($this->getRecord()); $this->assertEquals(6, count($handledRecord['extra'])); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use PhpAmqpLib\Message\AMQPMessage; use PhpAmqpLib\Connection\AMQPConnection; /** * @covers Monolog\Handler\RotatingFileHandler */ class AmqpHandlerTest extends TestCase { public function testHandleAmqpExt() { if (!class_exists('AMQPConnection') || !class_exists('AMQPExchange')) { $this->markTestSkipped("amqp-php not installed"); } if (!class_exists('AMQPChannel')) { $this->markTestSkipped("Please update AMQP to version >= 1.0"); } $messages = array(); $exchange = $this->getMock('AMQPExchange', array('publish', 'setName'), array(), '', false); $exchange->expects($this->once()) ->method('setName') ->with('log') ; $exchange->expects($this->any()) ->method('publish') ->will($this->returnCallback(function ($message, $routing_key, $flags = 0, $attributes = array()) use (&$messages) { $messages[] = array($message, $routing_key, $flags, $attributes); })) ; $handler = new AmqpHandler($exchange, 'log'); $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); $expected = array( array( 'message' => 'test', 'context' => array( 'data' => array(), 'foo' => 34, ), 'level' => 300, 'level_name' => 'WARNING', 'channel' => 'test', 'extra' => array(), ), 'warn.test', 0, array( 'delivery_mode' => 2, 'content_type' => 'application/json', ), ); $handler->handle($record); $this->assertCount(1, $messages); $messages[0][0] = json_decode($messages[0][0], true); unset($messages[0][0]['datetime']); $this->assertEquals($expected, $messages[0]); } public function testHandlePhpAmqpLib() { if (!class_exists('PhpAmqpLib\Connection\AMQPConnection')) { $this->markTestSkipped("php-amqplib not installed"); } $messages = array(); $exchange = $this->getMock('PhpAmqpLib\Channel\AMQPChannel', array('basic_publish', '__destruct'), array(), '', false); $exchange->expects($this->any()) ->method('basic_publish') ->will($this->returnCallback(function (AMQPMessage $msg, $exchange = "", $routing_key = "", $mandatory = false, $immediate = false, $ticket = null) use (&$messages) { $messages[] = array($msg, $exchange, $routing_key, $mandatory, $immediate, $ticket); })) ; $handler = new AmqpHandler($exchange, 'log'); $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); $expected = array( array( 'message' => 'test', 'context' => array( 'data' => array(), 'foo' => 34, ), 'level' => 300, 'level_name' => 'WARNING', 'channel' => 'test', 'extra' => array(), ), 'log', 'warn.test', false, false, null, array( 'delivery_mode' => 2, 'content_type' => 'application/json', ), ); $handler->handle($record); $this->assertCount(1, $messages); /* @var $msg AMQPMessage */ $msg = $messages[0][0]; $messages[0][0] = json_decode($msg->body, true); $messages[0][] = $msg->get_properties(); unset($messages[0][0]['datetime']); $this->assertEquals($expected, $messages[0]); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * @covers Monolog\Handler\BrowserConsoleHandlerTest */ class BrowserConsoleHandlerTest extends TestCase { protected function setUp() { BrowserConsoleHandler::reset(); } protected function generateScript() { $reflMethod = new \ReflectionMethod('Monolog\Handler\BrowserConsoleHandler', 'generateScript'); $reflMethod->setAccessible(true); return $reflMethod->invoke(null); } public function testStyling() { $handler = new BrowserConsoleHandler(); $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord(Logger::DEBUG, 'foo[[bar]]{color: red}')); $expected = <<assertEquals($expected, $this->generateScript()); } public function testEscaping() { $handler = new BrowserConsoleHandler(); $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord(Logger::DEBUG, "[foo] [[\"bar\n[baz]\"]]{color: red}")); $expected = <<assertEquals($expected, $this->generateScript()); } public function testAutolabel() { $handler = new BrowserConsoleHandler(); $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord(Logger::DEBUG, '[[foo]]{macro: autolabel}')); $handler->handle($this->getRecord(Logger::DEBUG, '[[bar]]{macro: autolabel}')); $handler->handle($this->getRecord(Logger::DEBUG, '[[foo]]{macro: autolabel}')); $expected = <<assertEquals($expected, $this->generateScript()); } public function testContext() { $handler = new BrowserConsoleHandler(); $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord(Logger::DEBUG, 'test', array('foo' => 'bar'))); $expected = <<assertEquals($expected, $this->generateScript()); } public function testConcurrentHandlers() { $handler1 = new BrowserConsoleHandler(); $handler1->setFormatter($this->getIdentityFormatter()); $handler2 = new BrowserConsoleHandler(); $handler2->setFormatter($this->getIdentityFormatter()); $handler1->handle($this->getRecord(Logger::DEBUG, 'test1')); $handler2->handle($this->getRecord(Logger::DEBUG, 'test2')); $handler1->handle($this->getRecord(Logger::DEBUG, 'test3')); $handler2->handle($this->getRecord(Logger::DEBUG, 'test4')); $expected = <<assertEquals($expected, $this->generateScript()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; class BufferHandlerTest extends TestCase { private $shutdownCheckHandler; /** * @covers Monolog\Handler\BufferHandler::__construct * @covers Monolog\Handler\BufferHandler::handle * @covers Monolog\Handler\BufferHandler::close */ public function testHandleBuffers() { $test = new TestHandler(); $handler = new BufferHandler($test); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $this->assertFalse($test->hasDebugRecords()); $this->assertFalse($test->hasInfoRecords()); $handler->close(); $this->assertTrue($test->hasInfoRecords()); $this->assertTrue(count($test->getRecords()) === 2); } /** * @covers Monolog\Handler\BufferHandler::close * @covers Monolog\Handler\BufferHandler::flush */ public function testPropagatesRecordsAtEndOfRequest() { $test = new TestHandler(); $handler = new BufferHandler($test); $handler->handle($this->getRecord(Logger::WARNING)); $handler->handle($this->getRecord(Logger::DEBUG)); $this->shutdownCheckHandler = $test; register_shutdown_function(array($this, 'checkPropagation')); } public function checkPropagation() { if (!$this->shutdownCheckHandler->hasWarningRecords() || !$this->shutdownCheckHandler->hasDebugRecords()) { echo '!!! BufferHandlerTest::testPropagatesRecordsAtEndOfRequest failed to verify that the messages have been propagated' . PHP_EOL; exit(1); } } /** * @covers Monolog\Handler\BufferHandler::handle */ public function testHandleBufferLimit() { $test = new TestHandler(); $handler = new BufferHandler($test, 2); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $handler->handle($this->getRecord(Logger::WARNING)); $handler->close(); $this->assertTrue($test->hasWarningRecords()); $this->assertTrue($test->hasInfoRecords()); $this->assertFalse($test->hasDebugRecords()); } /** * @covers Monolog\Handler\BufferHandler::handle */ public function testHandleBufferLimitWithFlushOnOverflow() { $test = new TestHandler(); $handler = new BufferHandler($test, 3, Logger::DEBUG, true, true); // send two records $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::DEBUG)); $this->assertFalse($test->hasDebugRecords()); $this->assertCount(0, $test->getRecords()); // overflow $handler->handle($this->getRecord(Logger::INFO)); $this->assertTrue($test->hasDebugRecords()); $this->assertCount(3, $test->getRecords()); // should buffer again $handler->handle($this->getRecord(Logger::WARNING)); $this->assertCount(3, $test->getRecords()); $handler->close(); $this->assertCount(5, $test->getRecords()); $this->assertTrue($test->hasWarningRecords()); $this->assertTrue($test->hasInfoRecords()); } /** * @covers Monolog\Handler\BufferHandler::handle */ public function testHandleLevel() { $test = new TestHandler(); $handler = new BufferHandler($test, 0, Logger::INFO); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $handler->handle($this->getRecord(Logger::WARNING)); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->close(); $this->assertTrue($test->hasWarningRecords()); $this->assertTrue($test->hasInfoRecords()); $this->assertFalse($test->hasDebugRecords()); } /** * @covers Monolog\Handler\BufferHandler::flush */ public function testFlush() { $test = new TestHandler(); $handler = new BufferHandler($test, 0); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $handler->flush(); $this->assertTrue($test->hasInfoRecords()); $this->assertTrue($test->hasDebugRecords()); $this->assertFalse($test->hasWarningRecords()); } /** * @covers Monolog\Handler\BufferHandler::handle */ public function testHandleUsesProcessors() { $test = new TestHandler(); $handler = new BufferHandler($test); $handler->pushProcessor(function ($record) { $record['extra']['foo'] = true; return $record; }); $handler->handle($this->getRecord(Logger::WARNING)); $handler->flush(); $this->assertTrue($test->hasWarningRecords()); $records = $test->getRecords(); $this->assertTrue($records[0]['extra']['foo']); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * @covers Monolog\Handler\ChromePHPHandler */ class ChromePHPHandlerTest extends TestCase { protected function setUp() { TestChromePHPHandler::reset(); $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; Chrome/1.0'; } /** * @dataProvider agentsProvider */ public function testHeaders($agent) { $_SERVER['HTTP_USER_AGENT'] = $agent; $handler = new TestChromePHPHandler(); $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::WARNING)); $expected = array( 'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode(array( 'version' => ChromePHPHandler::VERSION, 'columns' => array('label', 'log', 'backtrace', 'type'), 'rows' => array( 'test', 'test', ), 'request_uri' => '', )))), ); $this->assertEquals($expected, $handler->getHeaders()); } public static function agentsProvider() { return array( array('Monolog Test; Chrome/1.0'), array('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'), array('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/56.0.2924.76 Chrome/56.0.2924.76 Safari/537.36'), array('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36'), ); } public function testHeadersOverflow() { $handler = new TestChromePHPHandler(); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 150 * 1024))); // overflow chrome headers limit $handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 100 * 1024))); $expected = array( 'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode(array( 'version' => ChromePHPHandler::VERSION, 'columns' => array('label', 'log', 'backtrace', 'type'), 'rows' => array( array( 'test', 'test', 'unknown', 'log', ), array( 'test', str_repeat('a', 150 * 1024), 'unknown', 'warn', ), array( 'monolog', 'Incomplete logs, chrome header size limit reached', 'unknown', 'warn', ), ), 'request_uri' => '', )))), ); $this->assertEquals($expected, $handler->getHeaders()); } public function testConcurrentHandlers() { $handler = new TestChromePHPHandler(); $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::WARNING)); $handler2 = new TestChromePHPHandler(); $handler2->setFormatter($this->getIdentityFormatter()); $handler2->handle($this->getRecord(Logger::DEBUG)); $handler2->handle($this->getRecord(Logger::WARNING)); $expected = array( 'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode(array( 'version' => ChromePHPHandler::VERSION, 'columns' => array('label', 'log', 'backtrace', 'type'), 'rows' => array( 'test', 'test', 'test', 'test', ), 'request_uri' => '', )))), ); $this->assertEquals($expected, $handler2->getHeaders()); } } class TestChromePHPHandler extends ChromePHPHandler { protected $headers = array(); public static function reset() { self::$initialized = false; self::$overflowed = false; self::$sendHeaders = true; self::$json['rows'] = array(); } protected function sendHeader($header, $content) { $this->headers[$header] = $content; } public function getHeaders() { return $this->headers; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; class CouchDBHandlerTest extends TestCase { public function testHandle() { $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); $handler = new CouchDBHandler(); try { $handler->handle($record); } catch (\RuntimeException $e) { $this->markTestSkipped('Could not connect to couchdb server on http://localhost:5984'); } } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/DeduplicationHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; class DeduplicationHandlerTest extends TestCase { /** * @covers Monolog\Handler\DeduplicationHandler::flush */ public function testFlushPassthruIfAllRecordsUnderTrigger() { $test = new TestHandler(); @unlink(sys_get_temp_dir().'/monolog_dedup.log'); $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $handler->flush(); $this->assertTrue($test->hasInfoRecords()); $this->assertTrue($test->hasDebugRecords()); $this->assertFalse($test->hasWarningRecords()); } /** * @covers Monolog\Handler\DeduplicationHandler::flush * @covers Monolog\Handler\DeduplicationHandler::appendRecord */ public function testFlushPassthruIfEmptyLog() { $test = new TestHandler(); @unlink(sys_get_temp_dir().'/monolog_dedup.log'); $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0); $handler->handle($this->getRecord(Logger::ERROR, 'Foo:bar')); $handler->handle($this->getRecord(Logger::CRITICAL, "Foo\nbar")); $handler->flush(); $this->assertTrue($test->hasErrorRecords()); $this->assertTrue($test->hasCriticalRecords()); $this->assertFalse($test->hasWarningRecords()); } /** * @covers Monolog\Handler\DeduplicationHandler::flush * @covers Monolog\Handler\DeduplicationHandler::appendRecord * @covers Monolog\Handler\DeduplicationHandler::isDuplicate * @depends testFlushPassthruIfEmptyLog */ public function testFlushSkipsIfLogExists() { $test = new TestHandler(); $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0); $handler->handle($this->getRecord(Logger::ERROR, 'Foo:bar')); $handler->handle($this->getRecord(Logger::CRITICAL, "Foo\nbar")); $handler->flush(); $this->assertFalse($test->hasErrorRecords()); $this->assertFalse($test->hasCriticalRecords()); $this->assertFalse($test->hasWarningRecords()); } /** * @covers Monolog\Handler\DeduplicationHandler::flush * @covers Monolog\Handler\DeduplicationHandler::appendRecord * @covers Monolog\Handler\DeduplicationHandler::isDuplicate * @depends testFlushPassthruIfEmptyLog */ public function testFlushPassthruIfLogTooOld() { $test = new TestHandler(); $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0); $record = $this->getRecord(Logger::ERROR); $record['datetime']->modify('+62seconds'); $handler->handle($record); $record = $this->getRecord(Logger::CRITICAL); $record['datetime']->modify('+62seconds'); $handler->handle($record); $handler->flush(); $this->assertTrue($test->hasErrorRecords()); $this->assertTrue($test->hasCriticalRecords()); $this->assertFalse($test->hasWarningRecords()); } /** * @covers Monolog\Handler\DeduplicationHandler::flush * @covers Monolog\Handler\DeduplicationHandler::appendRecord * @covers Monolog\Handler\DeduplicationHandler::isDuplicate * @covers Monolog\Handler\DeduplicationHandler::collectLogs */ public function testGcOldLogs() { $test = new TestHandler(); @unlink(sys_get_temp_dir().'/monolog_dedup.log'); $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0); // handle two records from yesterday, and one recent $record = $this->getRecord(Logger::ERROR); $record['datetime']->modify('-1day -10seconds'); $handler->handle($record); $record2 = $this->getRecord(Logger::CRITICAL); $record2['datetime']->modify('-1day -10seconds'); $handler->handle($record2); $record3 = $this->getRecord(Logger::CRITICAL); $record3['datetime']->modify('-30seconds'); $handler->handle($record3); // log is written as none of them are duplicate $handler->flush(); $this->assertSame( $record['datetime']->getTimestamp() . ":ERROR:test\n" . $record2['datetime']->getTimestamp() . ":CRITICAL:test\n" . $record3['datetime']->getTimestamp() . ":CRITICAL:test\n", file_get_contents(sys_get_temp_dir() . '/monolog_dedup.log') ); $this->assertTrue($test->hasErrorRecords()); $this->assertTrue($test->hasCriticalRecords()); $this->assertFalse($test->hasWarningRecords()); // clear test handler $test->clear(); $this->assertFalse($test->hasErrorRecords()); $this->assertFalse($test->hasCriticalRecords()); // log new records, duplicate log gets GC'd at the end of this flush call $handler->handle($record = $this->getRecord(Logger::ERROR)); $handler->handle($record2 = $this->getRecord(Logger::CRITICAL)); $handler->flush(); // log should now contain the new errors and the previous one that was recent enough $this->assertSame( $record3['datetime']->getTimestamp() . ":CRITICAL:test\n" . $record['datetime']->getTimestamp() . ":ERROR:test\n" . $record2['datetime']->getTimestamp() . ":CRITICAL:test\n", file_get_contents(sys_get_temp_dir() . '/monolog_dedup.log') ); $this->assertTrue($test->hasErrorRecords()); $this->assertTrue($test->hasCriticalRecords()); $this->assertFalse($test->hasWarningRecords()); } public static function tearDownAfterClass() { @unlink(sys_get_temp_dir().'/monolog_dedup.log'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; class DoctrineCouchDBHandlerTest extends TestCase { protected function setup() { if (!class_exists('Doctrine\CouchDB\CouchDBClient')) { $this->markTestSkipped('The "doctrine/couchdb" package is not installed'); } } public function testHandle() { $client = $this->getMockBuilder('Doctrine\\CouchDB\\CouchDBClient') ->setMethods(array('postDocument')) ->disableOriginalConstructor() ->getMock(); $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); $expected = array( 'message' => 'test', 'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34), 'level' => Logger::WARNING, 'level_name' => 'WARNING', 'channel' => 'test', 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), 'extra' => array(), ); $client->expects($this->once()) ->method('postDocument') ->with($expected); $handler = new DoctrineCouchDBHandler($client); $handler->handle($record); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; class DynamoDbHandlerTest extends TestCase { private $client; public function setUp() { if (!class_exists('Aws\DynamoDb\DynamoDbClient')) { $this->markTestSkipped('aws/aws-sdk-php not installed'); } $this->client = $this->getMockBuilder('Aws\DynamoDb\DynamoDbClient') ->setMethods(array('formatAttributes', '__call')) ->disableOriginalConstructor()->getMock(); } public function testConstruct() { $this->assertInstanceOf('Monolog\Handler\DynamoDbHandler', new DynamoDbHandler($this->client, 'foo')); } public function testInterface() { $this->assertInstanceOf('Monolog\Handler\HandlerInterface', new DynamoDbHandler($this->client, 'foo')); } public function testGetFormatter() { $handler = new DynamoDbHandler($this->client, 'foo'); $this->assertInstanceOf('Monolog\Formatter\ScalarFormatter', $handler->getFormatter()); } public function testHandle() { $record = $this->getRecord(); $formatter = $this->getMock('Monolog\Formatter\FormatterInterface'); $formatted = array('foo' => 1, 'bar' => 2); $handler = new DynamoDbHandler($this->client, 'foo'); $handler->setFormatter($formatter); $isV3 = defined('Aws\Sdk::VERSION') && version_compare(\Aws\Sdk::VERSION, '3.0', '>='); if ($isV3) { $expFormatted = array('foo' => array('N' => 1), 'bar' => array('N' => 2)); } else { $expFormatted = $formatted; } $formatter ->expects($this->once()) ->method('format') ->with($record) ->will($this->returnValue($formatted)); $this->client ->expects($isV3 ? $this->never() : $this->once()) ->method('formatAttributes') ->with($this->isType('array')) ->will($this->returnValue($formatted)); $this->client ->expects($this->once()) ->method('__call') ->with('putItem', array(array( 'TableName' => 'foo', 'Item' => $expFormatted, ))); $handler->handle($record); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\ElasticaFormatter; use Monolog\Formatter\NormalizerFormatter; use Monolog\TestCase; use Monolog\Logger; use Elastica\Client; use Elastica\Request; use Elastica\Response; class ElasticSearchHandlerTest extends TestCase { /** * @var Client mock */ protected $client; /** * @var array Default handler options */ protected $options = array( 'index' => 'my_index', 'type' => 'doc_type', ); public function setUp() { // Elastica lib required if (!class_exists("Elastica\Client")) { $this->markTestSkipped("ruflin/elastica not installed"); } // base mock Elastica Client object $this->client = $this->getMockBuilder('Elastica\Client') ->setMethods(array('addDocuments')) ->disableOriginalConstructor() ->getMock(); } /** * @covers Monolog\Handler\ElasticSearchHandler::write * @covers Monolog\Handler\ElasticSearchHandler::handleBatch * @covers Monolog\Handler\ElasticSearchHandler::bulkSend * @covers Monolog\Handler\ElasticSearchHandler::getDefaultFormatter */ public function testHandle() { // log message $msg = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('foo' => 7, 'bar', 'class' => new \stdClass), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ); // format expected result $formatter = new ElasticaFormatter($this->options['index'], $this->options['type']); $expected = array($formatter->format($msg)); // setup ES client mock $this->client->expects($this->any()) ->method('addDocuments') ->with($expected); // perform tests $handler = new ElasticSearchHandler($this->client, $this->options); $handler->handle($msg); $handler->handleBatch(array($msg)); } /** * @covers Monolog\Handler\ElasticSearchHandler::setFormatter */ public function testSetFormatter() { $handler = new ElasticSearchHandler($this->client); $formatter = new ElasticaFormatter('index_new', 'type_new'); $handler->setFormatter($formatter); $this->assertInstanceOf('Monolog\Formatter\ElasticaFormatter', $handler->getFormatter()); $this->assertEquals('index_new', $handler->getFormatter()->getIndex()); $this->assertEquals('type_new', $handler->getFormatter()->getType()); } /** * @covers Monolog\Handler\ElasticSearchHandler::setFormatter * @expectedException InvalidArgumentException * @expectedExceptionMessage ElasticSearchHandler is only compatible with ElasticaFormatter */ public function testSetFormatterInvalid() { $handler = new ElasticSearchHandler($this->client); $formatter = new NormalizerFormatter(); $handler->setFormatter($formatter); } /** * @covers Monolog\Handler\ElasticSearchHandler::__construct * @covers Monolog\Handler\ElasticSearchHandler::getOptions */ public function testOptions() { $expected = array( 'index' => $this->options['index'], 'type' => $this->options['type'], 'ignore_error' => false, ); $handler = new ElasticSearchHandler($this->client, $this->options); $this->assertEquals($expected, $handler->getOptions()); } /** * @covers Monolog\Handler\ElasticSearchHandler::bulkSend * @dataProvider providerTestConnectionErrors */ public function testConnectionErrors($ignore, $expectedError) { $clientOpts = array('host' => '127.0.0.1', 'port' => 1); $client = new Client($clientOpts); $handlerOpts = array('ignore_error' => $ignore); $handler = new ElasticSearchHandler($client, $handlerOpts); if ($expectedError) { $this->setExpectedException($expectedError[0], $expectedError[1]); $handler->handle($this->getRecord()); } else { $this->assertFalse($handler->handle($this->getRecord())); } } /** * @return array */ public function providerTestConnectionErrors() { return array( array(false, array('RuntimeException', 'Error sending messages to Elasticsearch')), array(true, false), ); } /** * Integration test using localhost Elastic Search server * * @covers Monolog\Handler\ElasticSearchHandler::__construct * @covers Monolog\Handler\ElasticSearchHandler::handleBatch * @covers Monolog\Handler\ElasticSearchHandler::bulkSend * @covers Monolog\Handler\ElasticSearchHandler::getDefaultFormatter */ public function testHandleIntegration() { $msg = array( 'level' => Logger::ERROR, 'level_name' => 'ERROR', 'channel' => 'meh', 'context' => array('foo' => 7, 'bar', 'class' => new \stdClass), 'datetime' => new \DateTime("@0"), 'extra' => array(), 'message' => 'log', ); $expected = $msg; $expected['datetime'] = $msg['datetime']->format(\DateTime::ISO8601); $expected['context'] = array( 'class' => '[object] (stdClass: {})', 'foo' => 7, 0 => 'bar', ); $client = new Client(); $handler = new ElasticSearchHandler($client, $this->options); try { $handler->handleBatch(array($msg)); } catch (\RuntimeException $e) { $this->markTestSkipped("Cannot connect to Elastic Search server on localhost"); } // check document id from ES server response $documentId = $this->getCreatedDocId($client->getLastResponse()); $this->assertNotEmpty($documentId, 'No elastic document id received'); // retrieve document source from ES and validate $document = $this->getDocSourceFromElastic( $client, $this->options['index'], $this->options['type'], $documentId ); $this->assertEquals($expected, $document); // remove test index from ES $client->request("/{$this->options['index']}", Request::DELETE); } /** * Return last created document id from ES response * @param Response $response Elastica Response object * @return string|null */ protected function getCreatedDocId(Response $response) { $data = $response->getData(); if (!empty($data['items'][0]['create']['_id'])) { return $data['items'][0]['create']['_id']; } } /** * Retrieve document by id from Elasticsearch * @param Client $client Elastica client * @param string $index * @param string $type * @param string $documentId * @return array */ protected function getDocSourceFromElastic(Client $client, $index, $type, $documentId) { $resp = $client->request("/{$index}/{$type}/{$documentId}", Request::GET); $data = $resp->getData(); if (!empty($data['_source'])) { return $data['_source']; } return array(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use Monolog\Formatter\LineFormatter; function error_log() { $GLOBALS['error_log'][] = func_get_args(); } class ErrorLogHandlerTest extends TestCase { protected function setUp() { $GLOBALS['error_log'] = array(); } /** * @covers Monolog\Handler\ErrorLogHandler::__construct * @expectedException InvalidArgumentException * @expectedExceptionMessage The given message type "42" is not supported */ public function testShouldNotAcceptAnInvalidTypeOnContructor() { new ErrorLogHandler(42); } /** * @covers Monolog\Handler\ErrorLogHandler::write */ public function testShouldLogMessagesUsingErrorLogFuncion() { $type = ErrorLogHandler::OPERATING_SYSTEM; $handler = new ErrorLogHandler($type); $handler->setFormatter(new LineFormatter('%channel%.%level_name%: %message% %context% %extra%', null, true)); $handler->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); $this->assertSame("test.ERROR: Foo\nBar\r\n\r\nBaz [] []", $GLOBALS['error_log'][0][0]); $this->assertSame($GLOBALS['error_log'][0][1], $type); $handler = new ErrorLogHandler($type, Logger::DEBUG, true, true); $handler->setFormatter(new LineFormatter(null, null, true)); $handler->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); $this->assertStringMatchesFormat('[%s] test.ERROR: Foo', $GLOBALS['error_log'][1][0]); $this->assertSame($GLOBALS['error_log'][1][1], $type); $this->assertStringMatchesFormat('Bar', $GLOBALS['error_log'][2][0]); $this->assertSame($GLOBALS['error_log'][2][1], $type); $this->assertStringMatchesFormat('Baz [] []', $GLOBALS['error_log'][3][0]); $this->assertSame($GLOBALS['error_log'][3][1], $type); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/FilterHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\TestCase; class FilterHandlerTest extends TestCase { /** * @covers Monolog\Handler\FilterHandler::isHandling */ public function testIsHandling() { $test = new TestHandler(); $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE); $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); $this->assertTrue($handler->isHandling($this->getRecord(Logger::INFO))); $this->assertTrue($handler->isHandling($this->getRecord(Logger::NOTICE))); $this->assertFalse($handler->isHandling($this->getRecord(Logger::WARNING))); $this->assertFalse($handler->isHandling($this->getRecord(Logger::ERROR))); $this->assertFalse($handler->isHandling($this->getRecord(Logger::CRITICAL))); $this->assertFalse($handler->isHandling($this->getRecord(Logger::ALERT))); $this->assertFalse($handler->isHandling($this->getRecord(Logger::EMERGENCY))); } /** * @covers Monolog\Handler\FilterHandler::handle * @covers Monolog\Handler\FilterHandler::setAcceptedLevels * @covers Monolog\Handler\FilterHandler::isHandling */ public function testHandleProcessOnlyNeededLevels() { $test = new TestHandler(); $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE); $handler->handle($this->getRecord(Logger::DEBUG)); $this->assertFalse($test->hasDebugRecords()); $handler->handle($this->getRecord(Logger::INFO)); $this->assertTrue($test->hasInfoRecords()); $handler->handle($this->getRecord(Logger::NOTICE)); $this->assertTrue($test->hasNoticeRecords()); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertFalse($test->hasWarningRecords()); $handler->handle($this->getRecord(Logger::ERROR)); $this->assertFalse($test->hasErrorRecords()); $handler->handle($this->getRecord(Logger::CRITICAL)); $this->assertFalse($test->hasCriticalRecords()); $handler->handle($this->getRecord(Logger::ALERT)); $this->assertFalse($test->hasAlertRecords()); $handler->handle($this->getRecord(Logger::EMERGENCY)); $this->assertFalse($test->hasEmergencyRecords()); $test = new TestHandler(); $handler = new FilterHandler($test, array(Logger::INFO, Logger::ERROR)); $handler->handle($this->getRecord(Logger::DEBUG)); $this->assertFalse($test->hasDebugRecords()); $handler->handle($this->getRecord(Logger::INFO)); $this->assertTrue($test->hasInfoRecords()); $handler->handle($this->getRecord(Logger::NOTICE)); $this->assertFalse($test->hasNoticeRecords()); $handler->handle($this->getRecord(Logger::ERROR)); $this->assertTrue($test->hasErrorRecords()); $handler->handle($this->getRecord(Logger::CRITICAL)); $this->assertFalse($test->hasCriticalRecords()); } /** * @covers Monolog\Handler\FilterHandler::setAcceptedLevels * @covers Monolog\Handler\FilterHandler::getAcceptedLevels */ public function testAcceptedLevelApi() { $test = new TestHandler(); $handler = new FilterHandler($test); $levels = array(Logger::INFO, Logger::ERROR); $handler->setAcceptedLevels($levels); $this->assertSame($levels, $handler->getAcceptedLevels()); $handler->setAcceptedLevels(array('info', 'error')); $this->assertSame($levels, $handler->getAcceptedLevels()); $levels = array(Logger::CRITICAL, Logger::ALERT, Logger::EMERGENCY); $handler->setAcceptedLevels(Logger::CRITICAL, Logger::EMERGENCY); $this->assertSame($levels, $handler->getAcceptedLevels()); $handler->setAcceptedLevels('critical', 'emergency'); $this->assertSame($levels, $handler->getAcceptedLevels()); } /** * @covers Monolog\Handler\FilterHandler::handle */ public function testHandleUsesProcessors() { $test = new TestHandler(); $handler = new FilterHandler($test, Logger::DEBUG, Logger::EMERGENCY); $handler->pushProcessor( function ($record) { $record['extra']['foo'] = true; return $record; } ); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertTrue($test->hasWarningRecords()); $records = $test->getRecords(); $this->assertTrue($records[0]['extra']['foo']); } /** * @covers Monolog\Handler\FilterHandler::handle */ public function testHandleRespectsBubble() { $test = new TestHandler(); $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE, false); $this->assertTrue($handler->handle($this->getRecord(Logger::INFO))); $this->assertFalse($handler->handle($this->getRecord(Logger::WARNING))); $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE, true); $this->assertFalse($handler->handle($this->getRecord(Logger::INFO))); $this->assertFalse($handler->handle($this->getRecord(Logger::WARNING))); } /** * @covers Monolog\Handler\FilterHandler::handle */ public function testHandleWithCallback() { $test = new TestHandler(); $handler = new FilterHandler( function ($record, $handler) use ($test) { return $test; }, Logger::INFO, Logger::NOTICE, false ); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $this->assertFalse($test->hasDebugRecords()); $this->assertTrue($test->hasInfoRecords()); } /** * @covers Monolog\Handler\FilterHandler::handle * @expectedException \RuntimeException */ public function testHandleWithBadCallbackThrowsException() { $handler = new FilterHandler( function ($record, $handler) { return 'foo'; } ); $handler->handle($this->getRecord(Logger::WARNING)); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; use Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy; use Psr\Log\LogLevel; class FingersCrossedHandlerTest extends TestCase { /** * @covers Monolog\Handler\FingersCrossedHandler::__construct * @covers Monolog\Handler\FingersCrossedHandler::handle * @covers Monolog\Handler\FingersCrossedHandler::activate */ public function testHandleBuffers() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $this->assertFalse($test->hasDebugRecords()); $this->assertFalse($test->hasInfoRecords()); $handler->handle($this->getRecord(Logger::WARNING)); $handler->close(); $this->assertTrue($test->hasInfoRecords()); $this->assertTrue(count($test->getRecords()) === 3); } /** * @covers Monolog\Handler\FingersCrossedHandler::handle * @covers Monolog\Handler\FingersCrossedHandler::activate */ public function testHandleStopsBufferingAfterTrigger() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test); $handler->handle($this->getRecord(Logger::WARNING)); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->close(); $this->assertTrue($test->hasWarningRecords()); $this->assertTrue($test->hasDebugRecords()); } /** * @covers Monolog\Handler\FingersCrossedHandler::handle * @covers Monolog\Handler\FingersCrossedHandler::activate * @covers Monolog\Handler\FingersCrossedHandler::reset */ public function testHandleRestartBufferingAfterReset() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test); $handler->handle($this->getRecord(Logger::WARNING)); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->reset(); $handler->handle($this->getRecord(Logger::INFO)); $handler->close(); $this->assertTrue($test->hasWarningRecords()); $this->assertTrue($test->hasDebugRecords()); $this->assertFalse($test->hasInfoRecords()); } /** * @covers Monolog\Handler\FingersCrossedHandler::handle * @covers Monolog\Handler\FingersCrossedHandler::activate */ public function testHandleRestartBufferingAfterBeingTriggeredWhenStopBufferingIsDisabled() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, Logger::WARNING, 0, false, false); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::WARNING)); $handler->handle($this->getRecord(Logger::INFO)); $handler->close(); $this->assertTrue($test->hasWarningRecords()); $this->assertTrue($test->hasDebugRecords()); $this->assertFalse($test->hasInfoRecords()); } /** * @covers Monolog\Handler\FingersCrossedHandler::handle * @covers Monolog\Handler\FingersCrossedHandler::activate */ public function testHandleBufferLimit() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, Logger::WARNING, 2); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertTrue($test->hasWarningRecords()); $this->assertTrue($test->hasInfoRecords()); $this->assertFalse($test->hasDebugRecords()); } /** * @covers Monolog\Handler\FingersCrossedHandler::handle * @covers Monolog\Handler\FingersCrossedHandler::activate */ public function testHandleWithCallback() { $test = new TestHandler(); $handler = new FingersCrossedHandler(function ($record, $handler) use ($test) { return $test; }); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $this->assertFalse($test->hasDebugRecords()); $this->assertFalse($test->hasInfoRecords()); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertTrue($test->hasInfoRecords()); $this->assertTrue(count($test->getRecords()) === 3); } /** * @covers Monolog\Handler\FingersCrossedHandler::handle * @covers Monolog\Handler\FingersCrossedHandler::activate * @expectedException RuntimeException */ public function testHandleWithBadCallbackThrowsException() { $handler = new FingersCrossedHandler(function ($record, $handler) { return 'foo'; }); $handler->handle($this->getRecord(Logger::WARNING)); } /** * @covers Monolog\Handler\FingersCrossedHandler::isHandling */ public function testIsHandlingAlways() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, Logger::ERROR); $this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG))); } /** * @covers Monolog\Handler\FingersCrossedHandler::__construct * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::__construct * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::isHandlerActivated */ public function testErrorLevelActivationStrategy() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING)); $handler->handle($this->getRecord(Logger::DEBUG)); $this->assertFalse($test->hasDebugRecords()); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertTrue($test->hasDebugRecords()); $this->assertTrue($test->hasWarningRecords()); } /** * @covers Monolog\Handler\FingersCrossedHandler::__construct * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::__construct * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::isHandlerActivated */ public function testErrorLevelActivationStrategyWithPsrLevel() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy('warning')); $handler->handle($this->getRecord(Logger::DEBUG)); $this->assertFalse($test->hasDebugRecords()); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertTrue($test->hasDebugRecords()); $this->assertTrue($test->hasWarningRecords()); } /** * @covers Monolog\Handler\FingersCrossedHandler::__construct * @covers Monolog\Handler\FingersCrossedHandler::activate */ public function testOverrideActivationStrategy() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy('warning')); $handler->handle($this->getRecord(Logger::DEBUG)); $this->assertFalse($test->hasDebugRecords()); $handler->activate(); $this->assertTrue($test->hasDebugRecords()); $handler->handle($this->getRecord(Logger::INFO)); $this->assertTrue($test->hasInfoRecords()); } /** * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::__construct * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::isHandlerActivated */ public function testChannelLevelActivationStrategy() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, new ChannelLevelActivationStrategy(Logger::ERROR, array('othertest' => Logger::DEBUG))); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertFalse($test->hasWarningRecords()); $record = $this->getRecord(Logger::DEBUG); $record['channel'] = 'othertest'; $handler->handle($record); $this->assertTrue($test->hasDebugRecords()); $this->assertTrue($test->hasWarningRecords()); } /** * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::__construct * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::isHandlerActivated */ public function testChannelLevelActivationStrategyWithPsrLevels() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, new ChannelLevelActivationStrategy('error', array('othertest' => 'debug'))); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertFalse($test->hasWarningRecords()); $record = $this->getRecord(Logger::DEBUG); $record['channel'] = 'othertest'; $handler->handle($record); $this->assertTrue($test->hasDebugRecords()); $this->assertTrue($test->hasWarningRecords()); } /** * @covers Monolog\Handler\FingersCrossedHandler::handle * @covers Monolog\Handler\FingersCrossedHandler::activate */ public function testHandleUsesProcessors() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, Logger::INFO); $handler->pushProcessor(function ($record) { $record['extra']['foo'] = true; return $record; }); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertTrue($test->hasWarningRecords()); $records = $test->getRecords(); $this->assertTrue($records[0]['extra']['foo']); } /** * @covers Monolog\Handler\FingersCrossedHandler::close */ public function testPassthruOnClose() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING), 0, true, true, Logger::INFO); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $handler->close(); $this->assertFalse($test->hasDebugRecords()); $this->assertTrue($test->hasInfoRecords()); } /** * @covers Monolog\Handler\FingersCrossedHandler::close */ public function testPsrLevelPassthruOnClose() { $test = new TestHandler(); $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING), 0, true, true, LogLevel::INFO); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); $handler->close(); $this->assertFalse($test->hasDebugRecords()); $this->assertTrue($test->hasInfoRecords()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * @covers Monolog\Handler\FirePHPHandler */ class FirePHPHandlerTest extends TestCase { public function setUp() { TestFirePHPHandler::reset(); $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; FirePHP/1.0'; } public function testHeaders() { $handler = new TestFirePHPHandler; $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::WARNING)); $expected = array( 'X-Wf-Protocol-1' => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2', 'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1', 'X-Wf-1-Plugin-1' => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3', 'X-Wf-1-1-1-1' => 'test', 'X-Wf-1-1-1-2' => 'test', ); $this->assertEquals($expected, $handler->getHeaders()); } public function testConcurrentHandlers() { $handler = new TestFirePHPHandler; $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::WARNING)); $handler2 = new TestFirePHPHandler; $handler2->setFormatter($this->getIdentityFormatter()); $handler2->handle($this->getRecord(Logger::DEBUG)); $handler2->handle($this->getRecord(Logger::WARNING)); $expected = array( 'X-Wf-Protocol-1' => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2', 'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1', 'X-Wf-1-Plugin-1' => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3', 'X-Wf-1-1-1-1' => 'test', 'X-Wf-1-1-1-2' => 'test', ); $expected2 = array( 'X-Wf-1-1-1-3' => 'test', 'X-Wf-1-1-1-4' => 'test', ); $this->assertEquals($expected, $handler->getHeaders()); $this->assertEquals($expected2, $handler2->getHeaders()); } } class TestFirePHPHandler extends FirePHPHandler { protected $headers = array(); public static function reset() { self::$initialized = false; self::$sendHeaders = true; self::$messageIndex = 1; } protected function sendHeader($header, $content) { $this->headers[$header] = $content; } public function getHeaders() { return $this->headers; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/Fixtures/.gitkeep ================================================ ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/FleepHookHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Logger; use Monolog\TestCase; /** * @coversDefaultClass \Monolog\Handler\FleepHookHandler */ class FleepHookHandlerTest extends TestCase { /** * Default token to use in tests */ const TOKEN = '123abc'; /** * @var FleepHookHandler */ private $handler; public function setUp() { parent::setUp(); if (!extension_loaded('openssl')) { $this->markTestSkipped('This test requires openssl extension to run'); } // Create instances of the handler and logger for convenience $this->handler = new FleepHookHandler(self::TOKEN); } /** * @covers ::__construct */ public function testConstructorSetsExpectedDefaults() { $this->assertEquals(Logger::DEBUG, $this->handler->getLevel()); $this->assertEquals(true, $this->handler->getBubble()); } /** * @covers ::getDefaultFormatter */ public function testHandlerUsesLineFormatterWhichIgnoresEmptyArrays() { $record = array( 'message' => 'msg', 'context' => array(), 'level' => Logger::DEBUG, 'level_name' => Logger::getLevelName(Logger::DEBUG), 'channel' => 'channel', 'datetime' => new \DateTime(), 'extra' => array(), ); $expectedFormatter = new LineFormatter(null, null, true, true); $expected = $expectedFormatter->format($record); $handlerFormatter = $this->handler->getFormatter(); $actual = $handlerFormatter->format($record); $this->assertEquals($expected, $actual, 'Empty context and extra arrays should not be rendered'); } /** * @covers ::__construct */ public function testConnectionStringisConstructedCorrectly() { $this->assertEquals('ssl://' . FleepHookHandler::FLEEP_HOST . ':443', $this->handler->getConnectionString()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/FlowdockHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FlowdockFormatter; use Monolog\TestCase; use Monolog\Logger; /** * @author Dominik Liebler * @see https://www.hipchat.com/docs/api */ class FlowdockHandlerTest extends TestCase { /** * @var resource */ private $res; /** * @var FlowdockHandler */ private $handler; public function setUp() { if (!extension_loaded('openssl')) { $this->markTestSkipped('This test requires openssl to run'); } } public function testWriteHeader() { $this->createHandler(); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/POST \/v1\/messages\/team_inbox\/.* HTTP\/1.1\\r\\nHost: api.flowdock.com\\r\\nContent-Type: application\/json\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); return $content; } /** * @depends testWriteHeader */ public function testWriteContent($content) { $this->assertRegexp('/"source":"test_source"/', $content); $this->assertRegexp('/"from_address":"source@test\.com"/', $content); } private function createHandler($token = 'myToken') { $constructorArgs = array($token, Logger::DEBUG); $this->res = fopen('php://memory', 'a'); $this->handler = $this->getMock( '\Monolog\Handler\FlowdockHandler', array('fsockopen', 'streamSetTimeout', 'closeSocket'), $constructorArgs ); $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); $reflectionProperty->setAccessible(true); $reflectionProperty->setValue($this->handler, 'localhost:1234'); $this->handler->expects($this->any()) ->method('fsockopen') ->will($this->returnValue($this->res)); $this->handler->expects($this->any()) ->method('streamSetTimeout') ->will($this->returnValue(true)); $this->handler->expects($this->any()) ->method('closeSocket') ->will($this->returnValue(true)); $this->handler->setFormatter(new FlowdockFormatter('test_source', 'source@test.com')); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerLegacyTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Gelf\Message; use Monolog\TestCase; use Monolog\Logger; use Monolog\Formatter\GelfMessageFormatter; class GelfHandlerLegacyTest extends TestCase { public function setUp() { if (!class_exists('Gelf\MessagePublisher') || !class_exists('Gelf\Message')) { $this->markTestSkipped("mlehner/gelf-php not installed"); } require_once __DIR__ . '/GelfMockMessagePublisher.php'; } /** * @covers Monolog\Handler\GelfHandler::__construct */ public function testConstruct() { $handler = new GelfHandler($this->getMessagePublisher()); $this->assertInstanceOf('Monolog\Handler\GelfHandler', $handler); } protected function getHandler($messagePublisher) { $handler = new GelfHandler($messagePublisher); return $handler; } protected function getMessagePublisher() { return new GelfMockMessagePublisher('localhost'); } public function testDebug() { $messagePublisher = $this->getMessagePublisher(); $handler = $this->getHandler($messagePublisher); $record = $this->getRecord(Logger::DEBUG, "A test debug message"); $handler->handle($record); $this->assertEquals(7, $messagePublisher->lastMessage->getLevel()); $this->assertEquals('test', $messagePublisher->lastMessage->getFacility()); $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage()); $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage()); } public function testWarning() { $messagePublisher = $this->getMessagePublisher(); $handler = $this->getHandler($messagePublisher); $record = $this->getRecord(Logger::WARNING, "A test warning message"); $handler->handle($record); $this->assertEquals(4, $messagePublisher->lastMessage->getLevel()); $this->assertEquals('test', $messagePublisher->lastMessage->getFacility()); $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage()); $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage()); } public function testInjectedGelfMessageFormatter() { $messagePublisher = $this->getMessagePublisher(); $handler = $this->getHandler($messagePublisher); $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX')); $record = $this->getRecord(Logger::WARNING, "A test warning message"); $record['extra']['blarg'] = 'yep'; $record['context']['from'] = 'logger'; $handler->handle($record); $this->assertEquals('mysystem', $messagePublisher->lastMessage->getHost()); $this->assertArrayHasKey('_EXTblarg', $messagePublisher->lastMessage->toArray()); $this->assertArrayHasKey('_CTXfrom', $messagePublisher->lastMessage->toArray()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Gelf\Message; use Monolog\TestCase; use Monolog\Logger; use Monolog\Formatter\GelfMessageFormatter; class GelfHandlerTest extends TestCase { public function setUp() { if (!class_exists('Gelf\Publisher') || !class_exists('Gelf\Message')) { $this->markTestSkipped("graylog2/gelf-php not installed"); } } /** * @covers Monolog\Handler\GelfHandler::__construct */ public function testConstruct() { $handler = new GelfHandler($this->getMessagePublisher()); $this->assertInstanceOf('Monolog\Handler\GelfHandler', $handler); } protected function getHandler($messagePublisher) { $handler = new GelfHandler($messagePublisher); return $handler; } protected function getMessagePublisher() { return $this->getMock('Gelf\Publisher', array('publish'), array(), '', false); } public function testDebug() { $record = $this->getRecord(Logger::DEBUG, "A test debug message"); $expectedMessage = new Message(); $expectedMessage ->setLevel(7) ->setFacility("test") ->setShortMessage($record['message']) ->setTimestamp($record['datetime']) ; $messagePublisher = $this->getMessagePublisher(); $messagePublisher->expects($this->once()) ->method('publish') ->with($expectedMessage); $handler = $this->getHandler($messagePublisher); $handler->handle($record); } public function testWarning() { $record = $this->getRecord(Logger::WARNING, "A test warning message"); $expectedMessage = new Message(); $expectedMessage ->setLevel(4) ->setFacility("test") ->setShortMessage($record['message']) ->setTimestamp($record['datetime']) ; $messagePublisher = $this->getMessagePublisher(); $messagePublisher->expects($this->once()) ->method('publish') ->with($expectedMessage); $handler = $this->getHandler($messagePublisher); $handler->handle($record); } public function testInjectedGelfMessageFormatter() { $record = $this->getRecord(Logger::WARNING, "A test warning message"); $record['extra']['blarg'] = 'yep'; $record['context']['from'] = 'logger'; $expectedMessage = new Message(); $expectedMessage ->setLevel(4) ->setFacility("test") ->setHost("mysystem") ->setShortMessage($record['message']) ->setTimestamp($record['datetime']) ->setAdditional("EXTblarg", 'yep') ->setAdditional("CTXfrom", 'logger') ; $messagePublisher = $this->getMessagePublisher(); $messagePublisher->expects($this->once()) ->method('publish') ->with($expectedMessage); $handler = $this->getHandler($messagePublisher); $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX')); $handler->handle($record); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Gelf\MessagePublisher; use Gelf\Message; class GelfMockMessagePublisher extends MessagePublisher { public function publish(Message $message) { $this->lastMessage = $message; } public $lastMessage = null; } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; class GroupHandlerTest extends TestCase { /** * @covers Monolog\Handler\GroupHandler::__construct * @expectedException InvalidArgumentException */ public function testConstructorOnlyTakesHandler() { new GroupHandler(array(new TestHandler(), "foo")); } /** * @covers Monolog\Handler\GroupHandler::__construct * @covers Monolog\Handler\GroupHandler::handle */ public function testHandle() { $testHandlers = array(new TestHandler(), new TestHandler()); $handler = new GroupHandler($testHandlers); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); foreach ($testHandlers as $test) { $this->assertTrue($test->hasDebugRecords()); $this->assertTrue($test->hasInfoRecords()); $this->assertTrue(count($test->getRecords()) === 2); } } /** * @covers Monolog\Handler\GroupHandler::handleBatch */ public function testHandleBatch() { $testHandlers = array(new TestHandler(), new TestHandler()); $handler = new GroupHandler($testHandlers); $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO))); foreach ($testHandlers as $test) { $this->assertTrue($test->hasDebugRecords()); $this->assertTrue($test->hasInfoRecords()); $this->assertTrue(count($test->getRecords()) === 2); } } /** * @covers Monolog\Handler\GroupHandler::isHandling */ public function testIsHandling() { $testHandlers = array(new TestHandler(Logger::ERROR), new TestHandler(Logger::WARNING)); $handler = new GroupHandler($testHandlers); $this->assertTrue($handler->isHandling($this->getRecord(Logger::ERROR))); $this->assertTrue($handler->isHandling($this->getRecord(Logger::WARNING))); $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); } /** * @covers Monolog\Handler\GroupHandler::handle */ public function testHandleUsesProcessors() { $test = new TestHandler(); $handler = new GroupHandler(array($test)); $handler->pushProcessor(function ($record) { $record['extra']['foo'] = true; return $record; }); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertTrue($test->hasWarningRecords()); $records = $test->getRecords(); $this->assertTrue($records[0]['extra']['foo']); } /** * @covers Monolog\Handler\GroupHandler::handle */ public function testHandleBatchUsesProcessors() { $testHandlers = array(new TestHandler(), new TestHandler()); $handler = new GroupHandler($testHandlers); $handler->pushProcessor(function ($record) { $record['extra']['foo'] = true; return $record; }); $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO))); foreach ($testHandlers as $test) { $this->assertTrue($test->hasDebugRecords()); $this->assertTrue($test->hasInfoRecords()); $this->assertTrue(count($test->getRecords()) === 2); $records = $test->getRecords(); $this->assertTrue($records[0]['extra']['foo']); $this->assertTrue($records[1]['extra']['foo']); } } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; /** * @author Alexey Karapetov */ class HandlerWrapperTest extends TestCase { /** * @var HandlerWrapper */ private $wrapper; private $handler; public function setUp() { parent::setUp(); $this->handler = $this->getMock('Monolog\\Handler\\HandlerInterface'); $this->wrapper = new HandlerWrapper($this->handler); } /** * @return array */ public function trueFalseDataProvider() { return array( array(true), array(false), ); } /** * @param $result * @dataProvider trueFalseDataProvider */ public function testIsHandling($result) { $record = $this->getRecord(); $this->handler->expects($this->once()) ->method('isHandling') ->with($record) ->willReturn($result); $this->assertEquals($result, $this->wrapper->isHandling($record)); } /** * @param $result * @dataProvider trueFalseDataProvider */ public function testHandle($result) { $record = $this->getRecord(); $this->handler->expects($this->once()) ->method('handle') ->with($record) ->willReturn($result); $this->assertEquals($result, $this->wrapper->handle($record)); } /** * @param $result * @dataProvider trueFalseDataProvider */ public function testHandleBatch($result) { $records = $this->getMultipleRecords(); $this->handler->expects($this->once()) ->method('handleBatch') ->with($records) ->willReturn($result); $this->assertEquals($result, $this->wrapper->handleBatch($records)); } public function testPushProcessor() { $processor = function () {}; $this->handler->expects($this->once()) ->method('pushProcessor') ->with($processor); $this->assertEquals($this->wrapper, $this->wrapper->pushProcessor($processor)); } public function testPopProcessor() { $processor = function () {}; $this->handler->expects($this->once()) ->method('popProcessor') ->willReturn($processor); $this->assertEquals($processor, $this->wrapper->popProcessor()); } public function testSetFormatter() { $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); $this->handler->expects($this->once()) ->method('setFormatter') ->with($formatter); $this->assertEquals($this->wrapper, $this->wrapper->setFormatter($formatter)); } public function testGetFormatter() { $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); $this->handler->expects($this->once()) ->method('getFormatter') ->willReturn($formatter); $this->assertEquals($formatter, $this->wrapper->getFormatter()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * @author Rafael Dohms * @see https://www.hipchat.com/docs/api */ class HipChatHandlerTest extends TestCase { private $res; /** @var HipChatHandler */ private $handler; public function testWriteHeader() { $this->createHandler(); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/POST \/v1\/rooms\/message\?format=json&auth_token=.* HTTP\/1.1\\r\\nHost: api.hipchat.com\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); return $content; } public function testWriteCustomHostHeader() { $this->createHandler('myToken', 'room1', 'Monolog', true, 'hipchat.foo.bar'); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/POST \/v1\/rooms\/message\?format=json&auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); return $content; } public function testWriteV2() { $this->createHandler('myToken', 'room1', 'Monolog', false, 'hipchat.foo.bar', 'v2'); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/POST \/v2\/room\/room1\/notification\?auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); return $content; } public function testWriteV2Notify() { $this->createHandler('myToken', 'room1', 'Monolog', true, 'hipchat.foo.bar', 'v2'); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/POST \/v2\/room\/room1\/notification\?auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); return $content; } public function testRoomSpaces() { $this->createHandler('myToken', 'room name', 'Monolog', false, 'hipchat.foo.bar', 'v2'); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/POST \/v2\/room\/room%20name\/notification\?auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); return $content; } /** * @depends testWriteHeader */ public function testWriteContent($content) { $this->assertRegexp('/notify=0&message=test1&message_format=text&color=red&room_id=room1&from=Monolog$/', $content); } public function testWriteContentV1WithoutName() { $this->createHandler('myToken', 'room1', null, false, 'hipchat.foo.bar', 'v1'); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/notify=0&message=test1&message_format=text&color=red&room_id=room1&from=$/', $content); return $content; } /** * @depends testWriteCustomHostHeader */ public function testWriteContentNotify($content) { $this->assertRegexp('/notify=1&message=test1&message_format=text&color=red&room_id=room1&from=Monolog$/', $content); } /** * @depends testWriteV2 */ public function testWriteContentV2($content) { $this->assertRegexp('/notify=false&message=test1&message_format=text&color=red&from=Monolog$/', $content); } /** * @depends testWriteV2Notify */ public function testWriteContentV2Notify($content) { $this->assertRegexp('/notify=true&message=test1&message_format=text&color=red&from=Monolog$/', $content); } public function testWriteContentV2WithoutName() { $this->createHandler('myToken', 'room1', null, false, 'hipchat.foo.bar', 'v2'); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/notify=false&message=test1&message_format=text&color=red$/', $content); return $content; } public function testWriteWithComplexMessage() { $this->createHandler(); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database "example" finished in 16 minutes.')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/message=Backup\+of\+database\+%22example%22\+finished\+in\+16\+minutes\./', $content); } public function testWriteTruncatesLongMessage() { $this->createHandler(); $this->handler->handle($this->getRecord(Logger::CRITICAL, str_repeat('abcde', 2000))); fseek($this->res, 0); $content = fread($this->res, 12000); $this->assertRegexp('/message='.str_repeat('abcde', 1900).'\+%5Btruncated%5D/', $content); } /** * @dataProvider provideLevelColors */ public function testWriteWithErrorLevelsAndColors($level, $expectedColor) { $this->createHandler(); $this->handler->handle($this->getRecord($level, 'Backup of database "example" finished in 16 minutes.')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/color='.$expectedColor.'/', $content); } public function provideLevelColors() { return array( array(Logger::DEBUG, 'gray'), array(Logger::INFO, 'green'), array(Logger::WARNING, 'yellow'), array(Logger::ERROR, 'red'), array(Logger::CRITICAL, 'red'), array(Logger::ALERT, 'red'), array(Logger::EMERGENCY,'red'), array(Logger::NOTICE, 'green'), ); } /** * @dataProvider provideBatchRecords */ public function testHandleBatch($records, $expectedColor) { $this->createHandler(); $this->handler->handleBatch($records); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/color='.$expectedColor.'/', $content); } public function provideBatchRecords() { return array( array( array( array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \DateTime()), array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()), array('level' => Logger::CRITICAL, 'message' => 'Everything is broken!', 'level_name' => 'critical', 'datetime' => new \DateTime()), ), 'red', ), array( array( array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \DateTime()), array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()), ), 'yellow', ), array( array( array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \DateTime()), array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()), ), 'green', ), array( array( array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \DateTime()), ), 'gray', ), ); } private function createHandler($token = 'myToken', $room = 'room1', $name = 'Monolog', $notify = false, $host = 'api.hipchat.com', $version = 'v1') { $constructorArgs = array($token, $room, $name, $notify, Logger::DEBUG, true, true, 'text', $host, $version); $this->res = fopen('php://memory', 'a'); $this->handler = $this->getMock( '\Monolog\Handler\HipChatHandler', array('fsockopen', 'streamSetTimeout', 'closeSocket'), $constructorArgs ); $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); $reflectionProperty->setAccessible(true); $reflectionProperty->setValue($this->handler, 'localhost:1234'); $this->handler->expects($this->any()) ->method('fsockopen') ->will($this->returnValue($this->res)); $this->handler->expects($this->any()) ->method('streamSetTimeout') ->will($this->returnValue(true)); $this->handler->expects($this->any()) ->method('closeSocket') ->will($this->returnValue(true)); $this->handler->setFormatter($this->getIdentityFormatter()); } /** * @expectedException InvalidArgumentException */ public function testCreateWithTooLongName() { $hipChatHandler = new HipChatHandler('token', 'room', 'SixteenCharsHere'); } public function testCreateWithTooLongNameV2() { // creating a handler with too long of a name but using the v2 api doesn't matter. $hipChatHandler = new HipChatHandler('token', 'room', 'SixteenCharsHere', false, Logger::CRITICAL, true, true, 'test', 'api.hipchat.com', 'v2'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * @author Robert Kaufmann III */ class LogEntriesHandlerTest extends TestCase { /** * @var resource */ private $res; /** * @var LogEntriesHandler */ private $handler; public function testWriteContent() { $this->createHandler(); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Critical write test')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] test.CRITICAL: Critical write test/', $content); } public function testWriteBatchContent() { $records = array( $this->getRecord(), $this->getRecord(), $this->getRecord(), ); $this->createHandler(); $this->handler->handleBatch($records); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/(testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] .* \[\] \[\]\n){3}/', $content); } private function createHandler() { $useSSL = extension_loaded('openssl'); $args = array('testToken', $useSSL, Logger::DEBUG, true); $this->res = fopen('php://memory', 'a'); $this->handler = $this->getMock( '\Monolog\Handler\LogEntriesHandler', array('fsockopen', 'streamSetTimeout', 'closeSocket'), $args ); $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); $reflectionProperty->setAccessible(true); $reflectionProperty->setValue($this->handler, 'localhost:1234'); $this->handler->expects($this->any()) ->method('fsockopen') ->will($this->returnValue($this->res)); $this->handler->expects($this->any()) ->method('streamSetTimeout') ->will($this->returnValue(true)); $this->handler->expects($this->any()) ->method('closeSocket') ->will($this->returnValue(true)); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\TestCase; class MailHandlerTest extends TestCase { /** * @covers Monolog\Handler\MailHandler::handleBatch */ public function testHandleBatch() { $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); $formatter->expects($this->once()) ->method('formatBatch'); // Each record is formatted $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); $handler->expects($this->once()) ->method('send'); $handler->expects($this->never()) ->method('write'); // write is for individual records $handler->setFormatter($formatter); $handler->handleBatch($this->getMultipleRecords()); } /** * @covers Monolog\Handler\MailHandler::handleBatch */ public function testHandleBatchNotSendsMailIfMessagesAreBelowLevel() { $records = array( $this->getRecord(Logger::DEBUG, 'debug message 1'), $this->getRecord(Logger::DEBUG, 'debug message 2'), $this->getRecord(Logger::INFO, 'information'), ); $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); $handler->expects($this->never()) ->method('send'); $handler->setLevel(Logger::ERROR); $handler->handleBatch($records); } /** * @covers Monolog\Handler\MailHandler::write */ public function testHandle() { $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); $record = $this->getRecord(); $records = array($record); $records[0]['formatted'] = '['.$record['datetime']->format('Y-m-d H:i:s').'] test.WARNING: test [] []'."\n"; $handler->expects($this->once()) ->method('send') ->with($records[0]['formatted'], $records); $handler->handle($record); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Raven_Client; class MockRavenClient extends Raven_Client { public function capture($data, $stack, $vars = null) { $data = array_merge($this->get_user_data(), $data); $this->lastData = $data; $this->lastStack = $stack; } public $lastData; public $lastStack; } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; class MongoDBHandlerTest extends TestCase { /** * @expectedException InvalidArgumentException */ public function testConstructorShouldThrowExceptionForInvalidMongo() { new MongoDBHandler(new \stdClass(), 'DB', 'Collection'); } public function testHandle() { $mongo = $this->getMock('Mongo', array('selectCollection'), array(), '', false); $collection = $this->getMock('stdClass', array('save')); $mongo->expects($this->once()) ->method('selectCollection') ->with('DB', 'Collection') ->will($this->returnValue($collection)); $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); $expected = array( 'message' => 'test', 'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34), 'level' => Logger::WARNING, 'level_name' => 'WARNING', 'channel' => 'test', 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), 'extra' => array(), ); $collection->expects($this->once()) ->method('save') ->with($expected); $handler = new MongoDBHandler($mongo, 'DB', 'Collection'); $handler->handle($record); } } if (!class_exists('Mongo')) { class Mongo { public function selectCollection() { } } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use InvalidArgumentException; function mail($to, $subject, $message, $additional_headers = null, $additional_parameters = null) { $GLOBALS['mail'][] = func_get_args(); } class NativeMailerHandlerTest extends TestCase { protected function setUp() { $GLOBALS['mail'] = array(); } /** * @expectedException InvalidArgumentException */ public function testConstructorHeaderInjection() { $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', "receiver@example.org\r\nFrom: faked@attacker.org"); } /** * @expectedException InvalidArgumentException */ public function testSetterHeaderInjection() { $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org'); $mailer->addHeader("Content-Type: text/html\r\nFrom: faked@attacker.org"); } /** * @expectedException InvalidArgumentException */ public function testSetterArrayHeaderInjection() { $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org'); $mailer->addHeader(array("Content-Type: text/html\r\nFrom: faked@attacker.org")); } /** * @expectedException InvalidArgumentException */ public function testSetterContentTypeInjection() { $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org'); $mailer->setContentType("text/html\r\nFrom: faked@attacker.org"); } /** * @expectedException InvalidArgumentException */ public function testSetterEncodingInjection() { $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org'); $mailer->setEncoding("utf-8\r\nFrom: faked@attacker.org"); } public function testSend() { $to = 'spammer@example.org'; $subject = 'dear victim'; $from = 'receiver@example.org'; $mailer = new NativeMailerHandler($to, $subject, $from); $mailer->handleBatch(array()); // batch is empty, nothing sent $this->assertEmpty($GLOBALS['mail']); // non-empty batch $mailer->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); $this->assertNotEmpty($GLOBALS['mail']); $this->assertInternalType('array', $GLOBALS['mail']); $this->assertArrayHasKey('0', $GLOBALS['mail']); $params = $GLOBALS['mail'][0]; $this->assertCount(5, $params); $this->assertSame($to, $params[0]); $this->assertSame($subject, $params[1]); $this->assertStringEndsWith(" test.ERROR: Foo Bar Baz [] []\n", $params[2]); $this->assertSame("From: $from\r\nContent-type: text/plain; charset=utf-8\r\n", $params[3]); $this->assertSame('', $params[4]); } public function testMessageSubjectFormatting() { $mailer = new NativeMailerHandler('to@example.org', 'Alert: %level_name% %message%', 'from@example.org'); $mailer->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); $this->assertNotEmpty($GLOBALS['mail']); $this->assertInternalType('array', $GLOBALS['mail']); $this->assertArrayHasKey('0', $GLOBALS['mail']); $params = $GLOBALS['mail'][0]; $this->assertCount(5, $params); $this->assertSame('Alert: ERROR Foo Bar Baz', $params[1]); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\TestCase; use Monolog\Logger; class NewRelicHandlerTest extends TestCase { public static $appname; public static $customParameters; public static $transactionName; public function setUp() { self::$appname = null; self::$customParameters = array(); self::$transactionName = null; } /** * @expectedException Monolog\Handler\MissingExtensionException */ public function testThehandlerThrowsAnExceptionIfTheNRExtensionIsNotLoaded() { $handler = new StubNewRelicHandlerWithoutExtension(); $handler->handle($this->getRecord(Logger::ERROR)); } public function testThehandlerCanHandleTheRecord() { $handler = new StubNewRelicHandler(); $handler->handle($this->getRecord(Logger::ERROR)); } public function testThehandlerCanAddContextParamsToTheNewRelicTrace() { $handler = new StubNewRelicHandler(); $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('a' => 'b'))); $this->assertEquals(array('context_a' => 'b'), self::$customParameters); } public function testThehandlerCanAddExplodedContextParamsToTheNewRelicTrace() { $handler = new StubNewRelicHandler(Logger::ERROR, true, self::$appname, true); $handler->handle($this->getRecord( Logger::ERROR, 'log message', array('a' => array('key1' => 'value1', 'key2' => 'value2')) )); $this->assertEquals( array('context_a_key1' => 'value1', 'context_a_key2' => 'value2'), self::$customParameters ); } public function testThehandlerCanAddExtraParamsToTheNewRelicTrace() { $record = $this->getRecord(Logger::ERROR, 'log message'); $record['extra'] = array('c' => 'd'); $handler = new StubNewRelicHandler(); $handler->handle($record); $this->assertEquals(array('extra_c' => 'd'), self::$customParameters); } public function testThehandlerCanAddExplodedExtraParamsToTheNewRelicTrace() { $record = $this->getRecord(Logger::ERROR, 'log message'); $record['extra'] = array('c' => array('key1' => 'value1', 'key2' => 'value2')); $handler = new StubNewRelicHandler(Logger::ERROR, true, self::$appname, true); $handler->handle($record); $this->assertEquals( array('extra_c_key1' => 'value1', 'extra_c_key2' => 'value2'), self::$customParameters ); } public function testThehandlerCanAddExtraContextAndParamsToTheNewRelicTrace() { $record = $this->getRecord(Logger::ERROR, 'log message', array('a' => 'b')); $record['extra'] = array('c' => 'd'); $handler = new StubNewRelicHandler(); $handler->handle($record); $expected = array( 'context_a' => 'b', 'extra_c' => 'd', ); $this->assertEquals($expected, self::$customParameters); } public function testThehandlerCanHandleTheRecordsFormattedUsingTheLineFormatter() { $handler = new StubNewRelicHandler(); $handler->setFormatter(new LineFormatter()); $handler->handle($this->getRecord(Logger::ERROR)); } public function testTheAppNameIsNullByDefault() { $handler = new StubNewRelicHandler(); $handler->handle($this->getRecord(Logger::ERROR, 'log message')); $this->assertEquals(null, self::$appname); } public function testTheAppNameCanBeInjectedFromtheConstructor() { $handler = new StubNewRelicHandler(Logger::DEBUG, false, 'myAppName'); $handler->handle($this->getRecord(Logger::ERROR, 'log message')); $this->assertEquals('myAppName', self::$appname); } public function testTheAppNameCanBeOverriddenFromEachLog() { $handler = new StubNewRelicHandler(Logger::DEBUG, false, 'myAppName'); $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('appname' => 'logAppName'))); $this->assertEquals('logAppName', self::$appname); } public function testTheTransactionNameIsNullByDefault() { $handler = new StubNewRelicHandler(); $handler->handle($this->getRecord(Logger::ERROR, 'log message')); $this->assertEquals(null, self::$transactionName); } public function testTheTransactionNameCanBeInjectedFromTheConstructor() { $handler = new StubNewRelicHandler(Logger::DEBUG, false, null, false, 'myTransaction'); $handler->handle($this->getRecord(Logger::ERROR, 'log message')); $this->assertEquals('myTransaction', self::$transactionName); } public function testTheTransactionNameCanBeOverriddenFromEachLog() { $handler = new StubNewRelicHandler(Logger::DEBUG, false, null, false, 'myTransaction'); $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('transaction_name' => 'logTransactName'))); $this->assertEquals('logTransactName', self::$transactionName); } } class StubNewRelicHandlerWithoutExtension extends NewRelicHandler { protected function isNewRelicEnabled() { return false; } } class StubNewRelicHandler extends NewRelicHandler { protected function isNewRelicEnabled() { return true; } } function newrelic_notice_error() { return true; } function newrelic_set_appname($appname) { return NewRelicHandlerTest::$appname = $appname; } function newrelic_name_transaction($transactionName) { return NewRelicHandlerTest::$transactionName = $transactionName; } function newrelic_add_custom_parameter($key, $value) { NewRelicHandlerTest::$customParameters[$key] = $value; return true; } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * @covers Monolog\Handler\NullHandler::handle */ class NullHandlerTest extends TestCase { public function testHandle() { $handler = new NullHandler(); $this->assertTrue($handler->handle($this->getRecord())); } public function testHandleLowerLevelRecord() { $handler = new NullHandler(Logger::WARNING); $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG))); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/PHPConsoleHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Exception; use Monolog\ErrorHandler; use Monolog\Logger; use Monolog\TestCase; use PhpConsole\Connector; use PhpConsole\Dispatcher\Debug as DebugDispatcher; use PhpConsole\Dispatcher\Errors as ErrorDispatcher; use PhpConsole\Handler; use PHPUnit_Framework_MockObject_MockObject; /** * @covers Monolog\Handler\PHPConsoleHandler * @author Sergey Barbushin https://www.linkedin.com/in/barbushin */ class PHPConsoleHandlerTest extends TestCase { /** @var Connector|PHPUnit_Framework_MockObject_MockObject */ protected $connector; /** @var DebugDispatcher|PHPUnit_Framework_MockObject_MockObject */ protected $debugDispatcher; /** @var ErrorDispatcher|PHPUnit_Framework_MockObject_MockObject */ protected $errorDispatcher; protected function setUp() { if (!class_exists('PhpConsole\Connector')) { $this->markTestSkipped('PHP Console library not found. See https://github.com/barbushin/php-console#installation'); } $this->connector = $this->initConnectorMock(); $this->debugDispatcher = $this->initDebugDispatcherMock($this->connector); $this->connector->setDebugDispatcher($this->debugDispatcher); $this->errorDispatcher = $this->initErrorDispatcherMock($this->connector); $this->connector->setErrorsDispatcher($this->errorDispatcher); } protected function initDebugDispatcherMock(Connector $connector) { return $this->getMockBuilder('PhpConsole\Dispatcher\Debug') ->disableOriginalConstructor() ->setMethods(array('dispatchDebug')) ->setConstructorArgs(array($connector, $connector->getDumper())) ->getMock(); } protected function initErrorDispatcherMock(Connector $connector) { return $this->getMockBuilder('PhpConsole\Dispatcher\Errors') ->disableOriginalConstructor() ->setMethods(array('dispatchError', 'dispatchException')) ->setConstructorArgs(array($connector, $connector->getDumper())) ->getMock(); } protected function initConnectorMock() { $connector = $this->getMockBuilder('PhpConsole\Connector') ->disableOriginalConstructor() ->setMethods(array( 'sendMessage', 'onShutDown', 'isActiveClient', 'setSourcesBasePath', 'setServerEncoding', 'setPassword', 'enableSslOnlyMode', 'setAllowedIpMasks', 'setHeadersLimit', 'startEvalRequestsListener', )) ->getMock(); $connector->expects($this->any()) ->method('isActiveClient') ->will($this->returnValue(true)); return $connector; } protected function getHandlerDefaultOption($name) { $handler = new PHPConsoleHandler(array(), $this->connector); $options = $handler->getOptions(); return $options[$name]; } protected function initLogger($handlerOptions = array(), $level = Logger::DEBUG) { return new Logger('test', array( new PHPConsoleHandler($handlerOptions, $this->connector, $level), )); } public function testInitWithDefaultConnector() { $handler = new PHPConsoleHandler(); $this->assertEquals(spl_object_hash(Connector::getInstance()), spl_object_hash($handler->getConnector())); } public function testInitWithCustomConnector() { $handler = new PHPConsoleHandler(array(), $this->connector); $this->assertEquals(spl_object_hash($this->connector), spl_object_hash($handler->getConnector())); } public function testDebug() { $this->debugDispatcher->expects($this->once())->method('dispatchDebug')->with($this->equalTo('test')); $this->initLogger()->addDebug('test'); } public function testDebugContextInMessage() { $message = 'test'; $tag = 'tag'; $context = array($tag, 'custom' => mt_rand()); $expectedMessage = $message . ' ' . json_encode(array_slice($context, 1)); $this->debugDispatcher->expects($this->once())->method('dispatchDebug')->with( $this->equalTo($expectedMessage), $this->equalTo($tag) ); $this->initLogger()->addDebug($message, $context); } public function testDebugTags($tagsContextKeys = null) { $expectedTags = mt_rand(); $logger = $this->initLogger($tagsContextKeys ? array('debugTagsKeysInContext' => $tagsContextKeys) : array()); if (!$tagsContextKeys) { $tagsContextKeys = $this->getHandlerDefaultOption('debugTagsKeysInContext'); } foreach ($tagsContextKeys as $key) { $debugDispatcher = $this->initDebugDispatcherMock($this->connector); $debugDispatcher->expects($this->once())->method('dispatchDebug')->with( $this->anything(), $this->equalTo($expectedTags) ); $this->connector->setDebugDispatcher($debugDispatcher); $logger->addDebug('test', array($key => $expectedTags)); } } public function testError($classesPartialsTraceIgnore = null) { $code = E_USER_NOTICE; $message = 'message'; $file = __FILE__; $line = __LINE__; $this->errorDispatcher->expects($this->once())->method('dispatchError')->with( $this->equalTo($code), $this->equalTo($message), $this->equalTo($file), $this->equalTo($line), $classesPartialsTraceIgnore ?: $this->equalTo($this->getHandlerDefaultOption('classesPartialsTraceIgnore')) ); $errorHandler = ErrorHandler::register($this->initLogger($classesPartialsTraceIgnore ? array('classesPartialsTraceIgnore' => $classesPartialsTraceIgnore) : array()), false); $errorHandler->registerErrorHandler(array(), false, E_USER_WARNING); $errorHandler->handleError($code, $message, $file, $line); } public function testException() { $e = new Exception(); $this->errorDispatcher->expects($this->once())->method('dispatchException')->with( $this->equalTo($e) ); $handler = $this->initLogger(); $handler->log( \Psr\Log\LogLevel::ERROR, sprintf('Uncaught Exception %s: "%s" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()), array('exception' => $e) ); } /** * @expectedException Exception */ public function testWrongOptionsThrowsException() { new PHPConsoleHandler(array('xxx' => 1)); } public function testOptionEnabled() { $this->debugDispatcher->expects($this->never())->method('dispatchDebug'); $this->initLogger(array('enabled' => false))->addDebug('test'); } public function testOptionClassesPartialsTraceIgnore() { $this->testError(array('Class', 'Namespace\\')); } public function testOptionDebugTagsKeysInContext() { $this->testDebugTags(array('key1', 'key2')); } public function testOptionUseOwnErrorsAndExceptionsHandler() { $this->initLogger(array('useOwnErrorsHandler' => true, 'useOwnExceptionsHandler' => true)); $this->assertEquals(array(Handler::getInstance(), 'handleError'), set_error_handler(function () { })); $this->assertEquals(array(Handler::getInstance(), 'handleException'), set_exception_handler(function () { })); } public static function provideConnectorMethodsOptionsSets() { return array( array('sourcesBasePath', 'setSourcesBasePath', __DIR__), array('serverEncoding', 'setServerEncoding', 'cp1251'), array('password', 'setPassword', '******'), array('enableSslOnlyMode', 'enableSslOnlyMode', true, false), array('ipMasks', 'setAllowedIpMasks', array('127.0.0.*')), array('headersLimit', 'setHeadersLimit', 2500), array('enableEvalListener', 'startEvalRequestsListener', true, false), ); } /** * @dataProvider provideConnectorMethodsOptionsSets */ public function testOptionCallsConnectorMethod($option, $method, $value, $isArgument = true) { $expectCall = $this->connector->expects($this->once())->method($method); if ($isArgument) { $expectCall->with($value); } new PHPConsoleHandler(array($option => $value), $this->connector); } public function testOptionDetectDumpTraceAndSource() { new PHPConsoleHandler(array('detectDumpTraceAndSource' => true), $this->connector); $this->assertTrue($this->connector->getDebugDispatcher()->detectTraceAndSource); } public static function provideDumperOptionsValues() { return array( array('dumperLevelLimit', 'levelLimit', 1001), array('dumperItemsCountLimit', 'itemsCountLimit', 1002), array('dumperItemSizeLimit', 'itemSizeLimit', 1003), array('dumperDumpSizeLimit', 'dumpSizeLimit', 1004), array('dumperDetectCallbacks', 'detectCallbacks', true), ); } /** * @dataProvider provideDumperOptionsValues */ public function testDumperOptions($option, $dumperProperty, $value) { new PHPConsoleHandler(array($option => $value), $this->connector); $this->assertEquals($value, $this->connector->getDumper()->$dumperProperty); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/PsrHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * @covers Monolog\Handler\PsrHandler::handle */ class PsrHandlerTest extends TestCase { public function logLevelProvider() { $levels = array(); $monologLogger = new Logger(''); foreach ($monologLogger->getLevels() as $levelName => $level) { $levels[] = array($levelName, $level); } return $levels; } /** * @dataProvider logLevelProvider */ public function testHandlesAllLevels($levelName, $level) { $message = 'Hello, world! ' . $level; $context = array('foo' => 'bar', 'level' => $level); $psrLogger = $this->getMock('Psr\Log\NullLogger'); $psrLogger->expects($this->once()) ->method('log') ->with(strtolower($levelName), $message, $context); $handler = new PsrHandler($psrLogger); $handler->handle(array('level' => $level, 'level_name' => $levelName, 'message' => $message, 'context' => $context)); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * Almost all examples (expected header, titles, messages) taken from * https://www.pushover.net/api * @author Sebastian Göttschkes * @see https://www.pushover.net/api */ class PushoverHandlerTest extends TestCase { private $res; private $handler; public function testWriteHeader() { $this->createHandler(); $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/POST \/1\/messages.json HTTP\/1.1\\r\\nHost: api.pushover.net\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); return $content; } /** * @depends testWriteHeader */ public function testWriteContent($content) { $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog×tamp=\d{10}$/', $content); } public function testWriteWithComplexTitle() { $this->createHandler('myToken', 'myUser', 'Backup finished - SQL1'); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/title=Backup\+finished\+-\+SQL1/', $content); } public function testWriteWithComplexMessage() { $this->createHandler(); $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database "example" finished in 16 minutes.')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/message=Backup\+of\+database\+%22example%22\+finished\+in\+16\+minutes\./', $content); } public function testWriteWithTooLongMessage() { $message = str_pad('test', 520, 'a'); $this->createHandler(); $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications $this->handler->handle($this->getRecord(Logger::CRITICAL, $message)); fseek($this->res, 0); $content = fread($this->res, 1024); $expectedMessage = substr($message, 0, 505); $this->assertRegexp('/message=' . $expectedMessage . '&title/', $content); } public function testWriteWithHighPriority() { $this->createHandler(); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog×tamp=\d{10}&priority=1$/', $content); } public function testWriteWithEmergencyPriority() { $this->createHandler(); $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog×tamp=\d{10}&priority=2&retry=30&expire=25200$/', $content); } public function testWriteToMultipleUsers() { $this->createHandler('myToken', array('userA', 'userB')); $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/token=myToken&user=userA&message=test1&title=Monolog×tamp=\d{10}&priority=2&retry=30&expire=25200POST/', $content); $this->assertRegexp('/token=myToken&user=userB&message=test1&title=Monolog×tamp=\d{10}&priority=2&retry=30&expire=25200$/', $content); } private function createHandler($token = 'myToken', $user = 'myUser', $title = 'Monolog') { $constructorArgs = array($token, $user, $title); $this->res = fopen('php://memory', 'a'); $this->handler = $this->getMock( '\Monolog\Handler\PushoverHandler', array('fsockopen', 'streamSetTimeout', 'closeSocket'), $constructorArgs ); $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); $reflectionProperty->setAccessible(true); $reflectionProperty->setValue($this->handler, 'localhost:1234'); $this->handler->expects($this->any()) ->method('fsockopen') ->will($this->returnValue($this->res)); $this->handler->expects($this->any()) ->method('streamSetTimeout') ->will($this->returnValue(true)); $this->handler->expects($this->any()) ->method('closeSocket') ->will($this->returnValue(true)); $this->handler->setFormatter($this->getIdentityFormatter()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use Monolog\Formatter\LineFormatter; class RavenHandlerTest extends TestCase { public function setUp() { if (!class_exists('Raven_Client')) { $this->markTestSkipped('raven/raven not installed'); } require_once __DIR__ . '/MockRavenClient.php'; } /** * @covers Monolog\Handler\RavenHandler::__construct */ public function testConstruct() { $handler = new RavenHandler($this->getRavenClient()); $this->assertInstanceOf('Monolog\Handler\RavenHandler', $handler); } protected function getHandler($ravenClient) { $handler = new RavenHandler($ravenClient); return $handler; } protected function getRavenClient() { $dsn = 'http://43f6017361224d098402974103bfc53d:a6a0538fc2934ba2bed32e08741b2cd3@marca.python.live.cheggnet.com:9000/1'; return new MockRavenClient($dsn); } public function testDebug() { $ravenClient = $this->getRavenClient(); $handler = $this->getHandler($ravenClient); $record = $this->getRecord(Logger::DEBUG, 'A test debug message'); $handler->handle($record); $this->assertEquals($ravenClient::DEBUG, $ravenClient->lastData['level']); $this->assertContains($record['message'], $ravenClient->lastData['message']); } public function testWarning() { $ravenClient = $this->getRavenClient(); $handler = $this->getHandler($ravenClient); $record = $this->getRecord(Logger::WARNING, 'A test warning message'); $handler->handle($record); $this->assertEquals($ravenClient::WARNING, $ravenClient->lastData['level']); $this->assertContains($record['message'], $ravenClient->lastData['message']); } public function testTag() { $ravenClient = $this->getRavenClient(); $handler = $this->getHandler($ravenClient); $tags = array(1, 2, 'foo'); $record = $this->getRecord(Logger::INFO, 'test', array('tags' => $tags)); $handler->handle($record); $this->assertEquals($tags, $ravenClient->lastData['tags']); } public function testExtraParameters() { $ravenClient = $this->getRavenClient(); $handler = $this->getHandler($ravenClient); $checksum = '098f6bcd4621d373cade4e832627b4f6'; $release = '05a671c66aefea124cc08b76ea6d30bb'; $eventId = '31423'; $record = $this->getRecord(Logger::INFO, 'test', array('checksum' => $checksum, 'release' => $release, 'event_id' => $eventId)); $handler->handle($record); $this->assertEquals($checksum, $ravenClient->lastData['checksum']); $this->assertEquals($release, $ravenClient->lastData['release']); $this->assertEquals($eventId, $ravenClient->lastData['event_id']); } public function testFingerprint() { $ravenClient = $this->getRavenClient(); $handler = $this->getHandler($ravenClient); $fingerprint = array('{{ default }}', 'other value'); $record = $this->getRecord(Logger::INFO, 'test', array('fingerprint' => $fingerprint)); $handler->handle($record); $this->assertEquals($fingerprint, $ravenClient->lastData['fingerprint']); } public function testUserContext() { $ravenClient = $this->getRavenClient(); $handler = $this->getHandler($ravenClient); $recordWithNoContext = $this->getRecord(Logger::INFO, 'test with default user context'); // set user context 'externally' $user = array( 'id' => '123', 'email' => 'test@test.com', ); $recordWithContext = $this->getRecord(Logger::INFO, 'test', array('user' => $user)); $ravenClient->user_context(array('id' => 'test_user_id')); // handle context $handler->handle($recordWithContext); $this->assertEquals($user, $ravenClient->lastData['user']); // check to see if its reset $handler->handle($recordWithNoContext); $this->assertInternalType('array', $ravenClient->context->user); $this->assertSame('test_user_id', $ravenClient->context->user['id']); // handle with null context $ravenClient->user_context(null); $handler->handle($recordWithContext); $this->assertEquals($user, $ravenClient->lastData['user']); // check to see if its reset $handler->handle($recordWithNoContext); $this->assertNull($ravenClient->context->user); } public function testException() { $ravenClient = $this->getRavenClient(); $handler = $this->getHandler($ravenClient); try { $this->methodThatThrowsAnException(); } catch (\Exception $e) { $record = $this->getRecord(Logger::ERROR, $e->getMessage(), array('exception' => $e)); $handler->handle($record); } $this->assertEquals($record['message'], $ravenClient->lastData['message']); } public function testHandleBatch() { $records = $this->getMultipleRecords(); $records[] = $this->getRecord(Logger::WARNING, 'warning'); $records[] = $this->getRecord(Logger::WARNING, 'warning'); $logFormatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); $logFormatter->expects($this->once())->method('formatBatch'); $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) { return $record['level'] == 400; })); $handler = $this->getHandler($this->getRavenClient()); $handler->setBatchFormatter($logFormatter); $handler->setFormatter($formatter); $handler->handleBatch($records); } public function testHandleBatchDoNothingIfRecordsAreBelowLevel() { $records = array( $this->getRecord(Logger::DEBUG, 'debug message 1'), $this->getRecord(Logger::DEBUG, 'debug message 2'), $this->getRecord(Logger::INFO, 'information'), ); $handler = $this->getMock('Monolog\Handler\RavenHandler', null, array($this->getRavenClient())); $handler->expects($this->never())->method('handle'); $handler->setLevel(Logger::ERROR); $handler->handleBatch($records); } public function testHandleBatchPicksProperMessage() { $records = array( $this->getRecord(Logger::DEBUG, 'debug message 1'), $this->getRecord(Logger::DEBUG, 'debug message 2'), $this->getRecord(Logger::INFO, 'information 1'), $this->getRecord(Logger::ERROR, 'error 1'), $this->getRecord(Logger::WARNING, 'warning'), $this->getRecord(Logger::ERROR, 'error 2'), $this->getRecord(Logger::INFO, 'information 2'), ); $logFormatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); $logFormatter->expects($this->once())->method('formatBatch'); $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) use ($records) { return $record['message'] == 'error 1'; })); $handler = $this->getHandler($this->getRavenClient()); $handler->setBatchFormatter($logFormatter); $handler->setFormatter($formatter); $handler->handleBatch($records); } public function testGetSetBatchFormatter() { $ravenClient = $this->getRavenClient(); $handler = $this->getHandler($ravenClient); $handler->setBatchFormatter($formatter = new LineFormatter()); $this->assertSame($formatter, $handler->getBatchFormatter()); } public function testRelease() { $ravenClient = $this->getRavenClient(); $handler = $this->getHandler($ravenClient); $release = 'v42.42.42'; $handler->setRelease($release); $record = $this->getRecord(Logger::INFO, 'test'); $handler->handle($record); $this->assertEquals($release, $ravenClient->lastData['release']); $localRelease = 'v41.41.41'; $record = $this->getRecord(Logger::INFO, 'test', array('release' => $localRelease)); $handler->handle($record); $this->assertEquals($localRelease, $ravenClient->lastData['release']); } private function methodThatThrowsAnException() { throw new \Exception('This is an exception'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use Monolog\Formatter\LineFormatter; class RedisHandlerTest extends TestCase { /** * @expectedException InvalidArgumentException */ public function testConstructorShouldThrowExceptionForInvalidRedis() { new RedisHandler(new \stdClass(), 'key'); } public function testConstructorShouldWorkWithPredis() { $redis = $this->getMock('Predis\Client'); $this->assertInstanceof('Monolog\Handler\RedisHandler', new RedisHandler($redis, 'key')); } public function testConstructorShouldWorkWithRedis() { $redis = $this->getMock('Redis'); $this->assertInstanceof('Monolog\Handler\RedisHandler', new RedisHandler($redis, 'key')); } public function testPredisHandle() { $redis = $this->getMock('Predis\Client', array('rpush')); // Predis\Client uses rpush $redis->expects($this->once()) ->method('rpush') ->with('key', 'test'); $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); $handler = new RedisHandler($redis, 'key'); $handler->setFormatter(new LineFormatter("%message%")); $handler->handle($record); } public function testRedisHandle() { $redis = $this->getMock('Redis', array('rpush')); // Redis uses rPush $redis->expects($this->once()) ->method('rPush') ->with('key', 'test'); $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); $handler = new RedisHandler($redis, 'key'); $handler->setFormatter(new LineFormatter("%message%")); $handler->handle($record); } public function testRedisHandleCapped() { $redis = $this->getMock('Redis', array('multi', 'rpush', 'ltrim', 'exec')); // Redis uses multi $redis->expects($this->once()) ->method('multi') ->will($this->returnSelf()); $redis->expects($this->once()) ->method('rpush') ->will($this->returnSelf()); $redis->expects($this->once()) ->method('ltrim') ->will($this->returnSelf()); $redis->expects($this->once()) ->method('exec') ->will($this->returnSelf()); $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); $handler = new RedisHandler($redis, 'key', Logger::DEBUG, true, 10); $handler->setFormatter(new LineFormatter("%message%")); $handler->handle($record); } public function testPredisHandleCapped() { $redis = $this->getMock('Predis\Client', array('transaction')); $redisTransaction = $this->getMock('Predis\Client', array('rpush', 'ltrim')); $redisTransaction->expects($this->once()) ->method('rpush') ->will($this->returnSelf()); $redisTransaction->expects($this->once()) ->method('ltrim') ->will($this->returnSelf()); // Redis uses multi $redis->expects($this->once()) ->method('transaction') ->will($this->returnCallback(function ($cb) use ($redisTransaction) { $cb($redisTransaction); })); $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); $handler = new RedisHandler($redis, 'key', Logger::DEBUG, true, 10); $handler->setFormatter(new LineFormatter("%message%")); $handler->handle($record); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/RollbarHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Exception; use Monolog\TestCase; use Monolog\Logger; use PHPUnit_Framework_MockObject_MockObject as MockObject; /** * @author Erik Johansson * @see https://rollbar.com/docs/notifier/rollbar-php/ * * @coversDefaultClass Monolog\Handler\RollbarHandler */ class RollbarHandlerTest extends TestCase { /** * @var MockObject */ private $rollbarNotifier; /** * @var array */ public $reportedExceptionArguments = null; protected function setUp() { parent::setUp(); $this->setupRollbarNotifierMock(); } /** * When reporting exceptions to Rollbar the * level has to be set in the payload data */ public function testExceptionLogLevel() { $handler = $this->createHandler(); $handler->handle($this->createExceptionRecord(Logger::DEBUG)); $this->assertEquals('debug', $this->reportedExceptionArguments['payload']['level']); } private function setupRollbarNotifierMock() { $this->rollbarNotifier = $this->getMockBuilder('RollbarNotifier') ->setMethods(array('report_message', 'report_exception', 'flush')) ->getMock(); $that = $this; $this->rollbarNotifier ->expects($this->any()) ->method('report_exception') ->willReturnCallback(function ($exception, $context, $payload) use ($that) { $that->reportedExceptionArguments = compact('exception', 'context', 'payload'); }); } private function createHandler() { return new RollbarHandler($this->rollbarNotifier, Logger::DEBUG); } private function createExceptionRecord($level = Logger::DEBUG, $message = 'test', $exception = null) { return $this->getRecord($level, $message, array( 'exception' => $exception ?: new Exception() )); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use PHPUnit_Framework_Error_Deprecated; /** * @covers Monolog\Handler\RotatingFileHandler */ class RotatingFileHandlerTest extends TestCase { /** * This var should be private but then the anonymous function * in the `setUp` method won't be able to set it. `$this` cant't * be used in the anonymous function in `setUp` because PHP 5.3 * does not support it. */ public $lastError; public function setUp() { $dir = __DIR__.'/Fixtures'; chmod($dir, 0777); if (!is_writable($dir)) { $this->markTestSkipped($dir.' must be writable to test the RotatingFileHandler.'); } $this->lastError = null; $self = $this; // workaround with &$self used for PHP 5.3 set_error_handler(function($code, $message) use (&$self) { $self->lastError = array( 'code' => $code, 'message' => $message, ); }); } private function assertErrorWasTriggered($code, $message) { if (empty($this->lastError)) { $this->fail( sprintf( 'Failed asserting that error with code `%d` and message `%s` was triggered', $code, $message ) ); } $this->assertEquals($code, $this->lastError['code'], sprintf('Expected an error with code %d to be triggered, got `%s` instead', $code, $this->lastError['code'])); $this->assertEquals($message, $this->lastError['message'], sprintf('Expected an error with message `%d` to be triggered, got `%s` instead', $message, $this->lastError['message'])); } public function testRotationCreatesNewFile() { touch(__DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400).'.rot'); $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot'); $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord()); $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot'; $this->assertTrue(file_exists($log)); $this->assertEquals('test', file_get_contents($log)); } /** * @dataProvider rotationTests */ public function testRotation($createFile, $dateFormat, $timeCallback) { touch($old1 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-1)).'.rot'); touch($old2 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-2)).'.rot'); touch($old3 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-3)).'.rot'); touch($old4 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-4)).'.rot'); $log = __DIR__.'/Fixtures/foo-'.date($dateFormat).'.rot'; if ($createFile) { touch($log); } $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2); $handler->setFormatter($this->getIdentityFormatter()); $handler->setFilenameFormat('{filename}-{date}', $dateFormat); $handler->handle($this->getRecord()); $handler->close(); $this->assertTrue(file_exists($log)); $this->assertTrue(file_exists($old1)); $this->assertEquals($createFile, file_exists($old2)); $this->assertEquals($createFile, file_exists($old3)); $this->assertEquals($createFile, file_exists($old4)); $this->assertEquals('test', file_get_contents($log)); } public function rotationTests() { $now = time(); $dayCallback = function($ago) use ($now) { return $now + 86400 * $ago; }; $monthCallback = function($ago) { return gmmktime(0, 0, 0, date('n') + $ago, 1, date('Y')); }; $yearCallback = function($ago) { return gmmktime(0, 0, 0, 1, 1, date('Y') + $ago); }; return array( 'Rotation is triggered when the file of the current day is not present' => array(true, RotatingFileHandler::FILE_PER_DAY, $dayCallback), 'Rotation is not triggered when the file of the current day is already present' => array(false, RotatingFileHandler::FILE_PER_DAY, $dayCallback), 'Rotation is triggered when the file of the current month is not present' => array(true, RotatingFileHandler::FILE_PER_MONTH, $monthCallback), 'Rotation is not triggered when the file of the current month is already present' => array(false, RotatingFileHandler::FILE_PER_MONTH, $monthCallback), 'Rotation is triggered when the file of the current year is not present' => array(true, RotatingFileHandler::FILE_PER_YEAR, $yearCallback), 'Rotation is not triggered when the file of the current year is already present' => array(false, RotatingFileHandler::FILE_PER_YEAR, $yearCallback), ); } /** * @dataProvider dateFormatProvider */ public function testAllowOnlyFixedDefinedDateFormats($dateFormat, $valid) { $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2); $handler->setFilenameFormat('{filename}-{date}', $dateFormat); if (!$valid) { $this->assertErrorWasTriggered( E_USER_DEPRECATED, 'Invalid date format - format must be one of RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), '. 'RotatingFileHandler::FILE_PER_MONTH ("Y-m") or RotatingFileHandler::FILE_PER_YEAR ("Y"), '. 'or you can set one of the date formats using slashes, underscores and/or dots instead of dashes.' ); } } public function dateFormatProvider() { return array( array(RotatingFileHandler::FILE_PER_DAY, true), array(RotatingFileHandler::FILE_PER_MONTH, true), array(RotatingFileHandler::FILE_PER_YEAR, true), array('m-d-Y', false), array('Y-m-d-h-i', false) ); } /** * @dataProvider filenameFormatProvider */ public function testDisallowFilenameFormatsWithoutDate($filenameFormat, $valid) { $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2); $handler->setFilenameFormat($filenameFormat, RotatingFileHandler::FILE_PER_DAY); if (!$valid) { $this->assertErrorWasTriggered( E_USER_DEPRECATED, 'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.' ); } } public function filenameFormatProvider() { return array( array('{filename}', false), array('{filename}-{date}', true), array('{date}', true), array('foobar-{date}', true), array('foo-{date}-bar', true), array('{date}-foobar', true), array('foobar', false), ); } public function testReuseCurrentFile() { $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot'; file_put_contents($log, "foo"); $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot'); $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord()); $this->assertEquals('footest', file_get_contents($log)); } public function tearDown() { foreach (glob(__DIR__.'/Fixtures/*.rot') as $file) { unlink($file); } restore_error_handler(); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SamplingHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; /** * @covers Monolog\Handler\SamplingHandler::handle */ class SamplingHandlerTest extends TestCase { public function testHandle() { $testHandler = new TestHandler(); $handler = new SamplingHandler($testHandler, 2); for ($i = 0; $i < 10000; $i++) { $handler->handle($this->getRecord()); } $count = count($testHandler->getRecords()); // $count should be half of 10k, so between 4k and 6k $this->assertLessThan(6000, $count); $this->assertGreaterThan(4000, $count); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\Slack; use Monolog\Logger; use Monolog\TestCase; /** * @coversDefaultClass Monolog\Handler\Slack\SlackRecord */ class SlackRecordTest extends TestCase { private $jsonPrettyPrintFlag; protected function setUp() { $this->jsonPrettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128; } public function dataGetAttachmentColor() { return array( array(Logger::DEBUG, SlackRecord::COLOR_DEFAULT), array(Logger::INFO, SlackRecord::COLOR_GOOD), array(Logger::NOTICE, SlackRecord::COLOR_GOOD), array(Logger::WARNING, SlackRecord::COLOR_WARNING), array(Logger::ERROR, SlackRecord::COLOR_DANGER), array(Logger::CRITICAL, SlackRecord::COLOR_DANGER), array(Logger::ALERT, SlackRecord::COLOR_DANGER), array(Logger::EMERGENCY, SlackRecord::COLOR_DANGER), ); } /** * @dataProvider dataGetAttachmentColor * @param int $logLevel * @param string $expectedColour RGB hex color or name of Slack color * @covers ::getAttachmentColor */ public function testGetAttachmentColor($logLevel, $expectedColour) { $slackRecord = new SlackRecord(); $this->assertSame( $expectedColour, $slackRecord->getAttachmentColor($logLevel) ); } public function testAddsChannel() { $channel = '#test'; $record = new SlackRecord($channel); $data = $record->getSlackData($this->getRecord()); $this->assertArrayHasKey('channel', $data); $this->assertSame($channel, $data['channel']); } public function testNoUsernameByDefault() { $record = new SlackRecord(); $data = $record->getSlackData($this->getRecord()); $this->assertArrayNotHasKey('username', $data); } /** * @return array */ public function dataStringify() { $jsonPrettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128; $multipleDimensions = array(array(1, 2)); $numericKeys = array('library' => 'monolog'); $singleDimension = array(1, 'Hello', 'Jordi'); return array( array(array(), '[]'), array($multipleDimensions, json_encode($multipleDimensions, $jsonPrettyPrintFlag)), array($numericKeys, json_encode($numericKeys, $jsonPrettyPrintFlag)), array($singleDimension, json_encode($singleDimension)) ); } /** * @dataProvider dataStringify */ public function testStringify($fields, $expectedResult) { $slackRecord = new SlackRecord( '#test', 'test', true, null, true, true ); $this->assertSame($expectedResult, $slackRecord->stringify($fields)); } public function testAddsCustomUsername() { $username = 'Monolog bot'; $record = new SlackRecord(null, $username); $data = $record->getSlackData($this->getRecord()); $this->assertArrayHasKey('username', $data); $this->assertSame($username, $data['username']); } public function testNoIcon() { $record = new SlackRecord(); $data = $record->getSlackData($this->getRecord()); $this->assertArrayNotHasKey('icon_emoji', $data); } public function testAddsIcon() { $record = $this->getRecord(); $slackRecord = new SlackRecord(null, null, false, 'ghost'); $data = $slackRecord->getSlackData($record); $slackRecord2 = new SlackRecord(null, null, false, 'http://github.com/Seldaek/monolog'); $data2 = $slackRecord2->getSlackData($record); $this->assertArrayHasKey('icon_emoji', $data); $this->assertSame(':ghost:', $data['icon_emoji']); $this->assertArrayHasKey('icon_url', $data2); $this->assertSame('http://github.com/Seldaek/monolog', $data2['icon_url']); } public function testAttachmentsNotPresentIfNoAttachment() { $record = new SlackRecord(null, null, false); $data = $record->getSlackData($this->getRecord()); $this->assertArrayNotHasKey('attachments', $data); } public function testAddsOneAttachment() { $record = new SlackRecord(); $data = $record->getSlackData($this->getRecord()); $this->assertArrayHasKey('attachments', $data); $this->assertArrayHasKey(0, $data['attachments']); $this->assertInternalType('array', $data['attachments'][0]); } public function testTextEqualsMessageIfNoAttachment() { $message = 'Test message'; $record = new SlackRecord(null, null, false); $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message)); $this->assertArrayHasKey('text', $data); $this->assertSame($message, $data['text']); } public function testTextEqualsFormatterOutput() { $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); $formatter ->expects($this->any()) ->method('format') ->will($this->returnCallback(function ($record) { return $record['message'] . 'test'; })); $formatter2 = $this->getMock('Monolog\\Formatter\\FormatterInterface'); $formatter2 ->expects($this->any()) ->method('format') ->will($this->returnCallback(function ($record) { return $record['message'] . 'test1'; })); $message = 'Test message'; $record = new SlackRecord(null, null, false, null, false, false, array(), $formatter); $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message)); $this->assertArrayHasKey('text', $data); $this->assertSame($message . 'test', $data['text']); $record->setFormatter($formatter2); $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message)); $this->assertArrayHasKey('text', $data); $this->assertSame($message . 'test1', $data['text']); } public function testAddsFallbackAndTextToAttachment() { $message = 'Test message'; $record = new SlackRecord(null); $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message)); $this->assertSame($message, $data['attachments'][0]['text']); $this->assertSame($message, $data['attachments'][0]['fallback']); } public function testMapsLevelToColorAttachmentColor() { $record = new SlackRecord(null); $errorLoggerRecord = $this->getRecord(Logger::ERROR); $emergencyLoggerRecord = $this->getRecord(Logger::EMERGENCY); $warningLoggerRecord = $this->getRecord(Logger::WARNING); $infoLoggerRecord = $this->getRecord(Logger::INFO); $debugLoggerRecord = $this->getRecord(Logger::DEBUG); $data = $record->getSlackData($errorLoggerRecord); $this->assertSame(SlackRecord::COLOR_DANGER, $data['attachments'][0]['color']); $data = $record->getSlackData($emergencyLoggerRecord); $this->assertSame(SlackRecord::COLOR_DANGER, $data['attachments'][0]['color']); $data = $record->getSlackData($warningLoggerRecord); $this->assertSame(SlackRecord::COLOR_WARNING, $data['attachments'][0]['color']); $data = $record->getSlackData($infoLoggerRecord); $this->assertSame(SlackRecord::COLOR_GOOD, $data['attachments'][0]['color']); $data = $record->getSlackData($debugLoggerRecord); $this->assertSame(SlackRecord::COLOR_DEFAULT, $data['attachments'][0]['color']); } public function testAddsShortAttachmentWithoutContextAndExtra() { $level = Logger::ERROR; $levelName = Logger::getLevelName($level); $record = new SlackRecord(null, null, true, null, true); $data = $record->getSlackData($this->getRecord($level, 'test', array('test' => 1))); $attachment = $data['attachments'][0]; $this->assertArrayHasKey('title', $attachment); $this->assertArrayHasKey('fields', $attachment); $this->assertSame($levelName, $attachment['title']); $this->assertSame(array(), $attachment['fields']); } public function testAddsShortAttachmentWithContextAndExtra() { $level = Logger::ERROR; $levelName = Logger::getLevelName($level); $context = array('test' => 1); $extra = array('tags' => array('web')); $record = new SlackRecord(null, null, true, null, true, true); $loggerRecord = $this->getRecord($level, 'test', $context); $loggerRecord['extra'] = $extra; $data = $record->getSlackData($loggerRecord); $attachment = $data['attachments'][0]; $this->assertArrayHasKey('title', $attachment); $this->assertArrayHasKey('fields', $attachment); $this->assertCount(2, $attachment['fields']); $this->assertSame($levelName, $attachment['title']); $this->assertSame( array( array( 'title' => 'Extra', 'value' => sprintf('```%s```', json_encode($extra, $this->jsonPrettyPrintFlag)), 'short' => false ), array( 'title' => 'Context', 'value' => sprintf('```%s```', json_encode($context, $this->jsonPrettyPrintFlag)), 'short' => false ) ), $attachment['fields'] ); } public function testAddsLongAttachmentWithoutContextAndExtra() { $level = Logger::ERROR; $levelName = Logger::getLevelName($level); $record = new SlackRecord(null, null, true, null); $data = $record->getSlackData($this->getRecord($level, 'test', array('test' => 1))); $attachment = $data['attachments'][0]; $this->assertArrayHasKey('title', $attachment); $this->assertArrayHasKey('fields', $attachment); $this->assertCount(1, $attachment['fields']); $this->assertSame('Message', $attachment['title']); $this->assertSame( array(array( 'title' => 'Level', 'value' => $levelName, 'short' => false )), $attachment['fields'] ); } public function testAddsLongAttachmentWithContextAndExtra() { $level = Logger::ERROR; $levelName = Logger::getLevelName($level); $context = array('test' => 1); $extra = array('tags' => array('web')); $record = new SlackRecord(null, null, true, null, false, true); $loggerRecord = $this->getRecord($level, 'test', $context); $loggerRecord['extra'] = $extra; $data = $record->getSlackData($loggerRecord); $expectedFields = array( array( 'title' => 'Level', 'value' => $levelName, 'short' => false, ), array( 'title' => 'tags', 'value' => sprintf('```%s```', json_encode($extra['tags'])), 'short' => false ), array( 'title' => 'test', 'value' => $context['test'], 'short' => false ) ); $attachment = $data['attachments'][0]; $this->assertArrayHasKey('title', $attachment); $this->assertArrayHasKey('fields', $attachment); $this->assertCount(3, $attachment['fields']); $this->assertSame('Message', $attachment['title']); $this->assertSame( $expectedFields, $attachment['fields'] ); } public function testAddsTimestampToAttachment() { $record = $this->getRecord(); $slackRecord = new SlackRecord(); $data = $slackRecord->getSlackData($this->getRecord()); $attachment = $data['attachments'][0]; $this->assertArrayHasKey('ts', $attachment); $this->assertSame($record['datetime']->getTimestamp(), $attachment['ts']); } public function testExcludeExtraAndContextFields() { $record = $this->getRecord( Logger::WARNING, 'test', array('info' => array('library' => 'monolog', 'author' => 'Jordi')) ); $record['extra'] = array('tags' => array('web', 'cli')); $slackRecord = new SlackRecord(null, null, true, null, false, true, array('context.info.library', 'extra.tags.1')); $data = $slackRecord->getSlackData($record); $attachment = $data['attachments'][0]; $expected = array( array( 'title' => 'info', 'value' => sprintf('```%s```', json_encode(array('author' => 'Jordi'), $this->jsonPrettyPrintFlag)), 'short' => false ), array( 'title' => 'tags', 'value' => sprintf('```%s```', json_encode(array('web'))), 'short' => false ), ); foreach ($expected as $field) { $this->assertNotFalse(array_search($field, $attachment['fields'])); break; } } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SlackHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use Monolog\Formatter\LineFormatter; use Monolog\Handler\Slack\SlackRecord; /** * @author Greg Kedzierski * @see https://api.slack.com/ */ class SlackHandlerTest extends TestCase { /** * @var resource */ private $res; /** * @var SlackHandler */ private $handler; public function setUp() { if (!extension_loaded('openssl')) { $this->markTestSkipped('This test requires openssl to run'); } } public function testWriteHeader() { $this->createHandler(); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/POST \/api\/chat.postMessage HTTP\/1.1\\r\\nHost: slack.com\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); } public function testWriteContent() { $this->createHandler(); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegExp('/username=Monolog/', $content); $this->assertRegExp('/channel=channel1/', $content); $this->assertRegExp('/token=myToken/', $content); $this->assertRegExp('/attachments/', $content); } public function testWriteContentUsesFormatterIfProvided() { $this->createHandler('myToken', 'channel1', 'Monolog', false); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->createHandler('myToken', 'channel1', 'Monolog', false); $this->handler->setFormatter(new LineFormatter('foo--%message%')); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test2')); fseek($this->res, 0); $content2 = fread($this->res, 1024); $this->assertRegexp('/text=test1/', $content); $this->assertRegexp('/text=foo--test2/', $content2); } public function testWriteContentWithEmoji() { $this->createHandler('myToken', 'channel1', 'Monolog', true, 'alien'); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/icon_emoji=%3Aalien%3A/', $content); } /** * @dataProvider provideLevelColors */ public function testWriteContentWithColors($level, $expectedColor) { $this->createHandler(); $this->handler->handle($this->getRecord($level, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/%22color%22%3A%22'.$expectedColor.'/', $content); } public function testWriteContentWithPlainTextMessage() { $this->createHandler('myToken', 'channel1', 'Monolog', false); $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); fseek($this->res, 0); $content = fread($this->res, 1024); $this->assertRegexp('/text=test1/', $content); } public function provideLevelColors() { return array( array(Logger::DEBUG, urlencode(SlackRecord::COLOR_DEFAULT)), array(Logger::INFO, SlackRecord::COLOR_GOOD), array(Logger::NOTICE, SlackRecord::COLOR_GOOD), array(Logger::WARNING, SlackRecord::COLOR_WARNING), array(Logger::ERROR, SlackRecord::COLOR_DANGER), array(Logger::CRITICAL, SlackRecord::COLOR_DANGER), array(Logger::ALERT, SlackRecord::COLOR_DANGER), array(Logger::EMERGENCY,SlackRecord::COLOR_DANGER), ); } private function createHandler($token = 'myToken', $channel = 'channel1', $username = 'Monolog', $useAttachment = true, $iconEmoji = null, $useShortAttachment = false, $includeExtra = false) { $constructorArgs = array($token, $channel, $username, $useAttachment, $iconEmoji, Logger::DEBUG, true, $useShortAttachment, $includeExtra); $this->res = fopen('php://memory', 'a'); $this->handler = $this->getMock( '\Monolog\Handler\SlackHandler', array('fsockopen', 'streamSetTimeout', 'closeSocket'), $constructorArgs ); $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); $reflectionProperty->setAccessible(true); $reflectionProperty->setValue($this->handler, 'localhost:1234'); $this->handler->expects($this->any()) ->method('fsockopen') ->will($this->returnValue($this->res)); $this->handler->expects($this->any()) ->method('streamSetTimeout') ->will($this->returnValue(true)); $this->handler->expects($this->any()) ->method('closeSocket') ->will($this->returnValue(true)); $this->handler->setFormatter($this->getIdentityFormatter()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SlackWebhookHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use Monolog\Formatter\LineFormatter; use Monolog\Handler\Slack\SlackRecord; /** * @author Haralan Dobrev * @see https://api.slack.com/incoming-webhooks * @coversDefaultClass Monolog\Handler\SlackWebhookHandler */ class SlackWebhookHandlerTest extends TestCase { const WEBHOOK_URL = 'https://hooks.slack.com/services/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E'; /** * @covers ::__construct * @covers ::getSlackRecord */ public function testConstructorMinimal() { $handler = new SlackWebhookHandler(self::WEBHOOK_URL); $record = $this->getRecord(); $slackRecord = $handler->getSlackRecord(); $this->assertInstanceOf('Monolog\Handler\Slack\SlackRecord', $slackRecord); $this->assertEquals(array( 'attachments' => array( array( 'fallback' => 'test', 'text' => 'test', 'color' => SlackRecord::COLOR_WARNING, 'fields' => array( array( 'title' => 'Level', 'value' => 'WARNING', 'short' => false, ), ), 'title' => 'Message', 'mrkdwn_in' => array('fields'), 'ts' => $record['datetime']->getTimestamp(), ), ), ), $slackRecord->getSlackData($record)); } /** * @covers ::__construct * @covers ::getSlackRecord */ public function testConstructorFull() { $handler = new SlackWebhookHandler( self::WEBHOOK_URL, 'test-channel', 'test-username', false, ':ghost:', false, false, Logger::DEBUG, false ); $slackRecord = $handler->getSlackRecord(); $this->assertInstanceOf('Monolog\Handler\Slack\SlackRecord', $slackRecord); $this->assertEquals(array( 'username' => 'test-username', 'text' => 'test', 'channel' => 'test-channel', 'icon_emoji' => ':ghost:', ), $slackRecord->getSlackData($this->getRecord())); } /** * @covers ::getFormatter */ public function testGetFormatter() { $handler = new SlackWebhookHandler(self::WEBHOOK_URL); $formatter = $handler->getFormatter(); $this->assertInstanceOf('Monolog\Formatter\FormatterInterface', $formatter); } /** * @covers ::setFormatter */ public function testSetFormatter() { $handler = new SlackWebhookHandler(self::WEBHOOK_URL); $formatter = new LineFormatter(); $handler->setFormatter($formatter); $this->assertSame($formatter, $handler->getFormatter()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SlackbotHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * @author Haralan Dobrev * @see https://slack.com/apps/A0F81R8ET-slackbot * @coversDefaultClass Monolog\Handler\SlackbotHandler */ class SlackbotHandlerTest extends TestCase { /** * @covers ::__construct */ public function testConstructorMinimal() { $handler = new SlackbotHandler('test-team', 'test-token', 'test-channel'); $this->assertInstanceOf('Monolog\Handler\AbstractProcessingHandler', $handler); } /** * @covers ::__construct */ public function testConstructorFull() { $handler = new SlackbotHandler( 'test-team', 'test-token', 'test-channel', Logger::DEBUG, false ); $this->assertInstanceOf('Monolog\Handler\AbstractProcessingHandler', $handler); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * @author Pablo de Leon Belloc */ class SocketHandlerTest extends TestCase { /** * @var Monolog\Handler\SocketHandler */ private $handler; /** * @var resource */ private $res; /** * @expectedException UnexpectedValueException */ public function testInvalidHostname() { $this->createHandler('garbage://here'); $this->writeRecord('data'); } /** * @expectedException \InvalidArgumentException */ public function testBadConnectionTimeout() { $this->createHandler('localhost:1234'); $this->handler->setConnectionTimeout(-1); } public function testSetConnectionTimeout() { $this->createHandler('localhost:1234'); $this->handler->setConnectionTimeout(10.1); $this->assertEquals(10.1, $this->handler->getConnectionTimeout()); } /** * @expectedException \InvalidArgumentException */ public function testBadTimeout() { $this->createHandler('localhost:1234'); $this->handler->setTimeout(-1); } public function testSetTimeout() { $this->createHandler('localhost:1234'); $this->handler->setTimeout(10.25); $this->assertEquals(10.25, $this->handler->getTimeout()); } public function testSetWritingTimeout() { $this->createHandler('localhost:1234'); $this->handler->setWritingTimeout(10.25); $this->assertEquals(10.25, $this->handler->getWritingTimeout()); } public function testSetConnectionString() { $this->createHandler('tcp://localhost:9090'); $this->assertEquals('tcp://localhost:9090', $this->handler->getConnectionString()); } /** * @expectedException UnexpectedValueException */ public function testExceptionIsThrownOnFsockopenError() { $this->setMockHandler(array('fsockopen')); $this->handler->expects($this->once()) ->method('fsockopen') ->will($this->returnValue(false)); $this->writeRecord('Hello world'); } /** * @expectedException UnexpectedValueException */ public function testExceptionIsThrownOnPfsockopenError() { $this->setMockHandler(array('pfsockopen')); $this->handler->expects($this->once()) ->method('pfsockopen') ->will($this->returnValue(false)); $this->handler->setPersistent(true); $this->writeRecord('Hello world'); } /** * @expectedException UnexpectedValueException */ public function testExceptionIsThrownIfCannotSetTimeout() { $this->setMockHandler(array('streamSetTimeout')); $this->handler->expects($this->once()) ->method('streamSetTimeout') ->will($this->returnValue(false)); $this->writeRecord('Hello world'); } /** * @expectedException RuntimeException */ public function testWriteFailsOnIfFwriteReturnsFalse() { $this->setMockHandler(array('fwrite')); $callback = function ($arg) { $map = array( 'Hello world' => 6, 'world' => false, ); return $map[$arg]; }; $this->handler->expects($this->exactly(2)) ->method('fwrite') ->will($this->returnCallback($callback)); $this->writeRecord('Hello world'); } /** * @expectedException RuntimeException */ public function testWriteFailsIfStreamTimesOut() { $this->setMockHandler(array('fwrite', 'streamGetMetadata')); $callback = function ($arg) { $map = array( 'Hello world' => 6, 'world' => 5, ); return $map[$arg]; }; $this->handler->expects($this->exactly(1)) ->method('fwrite') ->will($this->returnCallback($callback)); $this->handler->expects($this->exactly(1)) ->method('streamGetMetadata') ->will($this->returnValue(array('timed_out' => true))); $this->writeRecord('Hello world'); } /** * @expectedException RuntimeException */ public function testWriteFailsOnIncompleteWrite() { $this->setMockHandler(array('fwrite', 'streamGetMetadata')); $res = $this->res; $callback = function ($string) use ($res) { fclose($res); return strlen('Hello'); }; $this->handler->expects($this->exactly(1)) ->method('fwrite') ->will($this->returnCallback($callback)); $this->handler->expects($this->exactly(1)) ->method('streamGetMetadata') ->will($this->returnValue(array('timed_out' => false))); $this->writeRecord('Hello world'); } public function testWriteWithMemoryFile() { $this->setMockHandler(); $this->writeRecord('test1'); $this->writeRecord('test2'); $this->writeRecord('test3'); fseek($this->res, 0); $this->assertEquals('test1test2test3', fread($this->res, 1024)); } public function testWriteWithMock() { $this->setMockHandler(array('fwrite')); $callback = function ($arg) { $map = array( 'Hello world' => 6, 'world' => 5, ); return $map[$arg]; }; $this->handler->expects($this->exactly(2)) ->method('fwrite') ->will($this->returnCallback($callback)); $this->writeRecord('Hello world'); } public function testClose() { $this->setMockHandler(); $this->writeRecord('Hello world'); $this->assertInternalType('resource', $this->res); $this->handler->close(); $this->assertFalse(is_resource($this->res), "Expected resource to be closed after closing handler"); } public function testCloseDoesNotClosePersistentSocket() { $this->setMockHandler(); $this->handler->setPersistent(true); $this->writeRecord('Hello world'); $this->assertTrue(is_resource($this->res)); $this->handler->close(); $this->assertTrue(is_resource($this->res)); } /** * @expectedException \RuntimeException */ public function testAvoidInfiniteLoopWhenNoDataIsWrittenForAWritingTimeoutSeconds() { $this->setMockHandler(array('fwrite', 'streamGetMetadata')); $this->handler->expects($this->any()) ->method('fwrite') ->will($this->returnValue(0)); $this->handler->expects($this->any()) ->method('streamGetMetadata') ->will($this->returnValue(array('timed_out' => false))); $this->handler->setWritingTimeout(1); $this->writeRecord('Hello world'); } private function createHandler($connectionString) { $this->handler = new SocketHandler($connectionString); $this->handler->setFormatter($this->getIdentityFormatter()); } private function writeRecord($string) { $this->handler->handle($this->getRecord(Logger::WARNING, $string)); } private function setMockHandler(array $methods = array()) { $this->res = fopen('php://memory', 'a'); $defaultMethods = array('fsockopen', 'pfsockopen', 'streamSetTimeout'); $newMethods = array_diff($methods, $defaultMethods); $finalMethods = array_merge($defaultMethods, $newMethods); $this->handler = $this->getMock( '\Monolog\Handler\SocketHandler', $finalMethods, array('localhost:1234') ); if (!in_array('fsockopen', $methods)) { $this->handler->expects($this->any()) ->method('fsockopen') ->will($this->returnValue($this->res)); } if (!in_array('pfsockopen', $methods)) { $this->handler->expects($this->any()) ->method('pfsockopen') ->will($this->returnValue($this->res)); } if (!in_array('streamSetTimeout', $methods)) { $this->handler->expects($this->any()) ->method('streamSetTimeout') ->will($this->returnValue(true)); } $this->handler->setFormatter($this->getIdentityFormatter()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; class StreamHandlerTest extends TestCase { /** * @covers Monolog\Handler\StreamHandler::__construct * @covers Monolog\Handler\StreamHandler::write */ public function testWrite() { $handle = fopen('php://memory', 'a+'); $handler = new StreamHandler($handle); $handler->setFormatter($this->getIdentityFormatter()); $handler->handle($this->getRecord(Logger::WARNING, 'test')); $handler->handle($this->getRecord(Logger::WARNING, 'test2')); $handler->handle($this->getRecord(Logger::WARNING, 'test3')); fseek($handle, 0); $this->assertEquals('testtest2test3', fread($handle, 100)); } /** * @covers Monolog\Handler\StreamHandler::close */ public function testCloseKeepsExternalHandlersOpen() { $handle = fopen('php://memory', 'a+'); $handler = new StreamHandler($handle); $this->assertTrue(is_resource($handle)); $handler->close(); $this->assertTrue(is_resource($handle)); } /** * @covers Monolog\Handler\StreamHandler::close */ public function testClose() { $handler = new StreamHandler('php://memory'); $handler->handle($this->getRecord(Logger::WARNING, 'test')); $streamProp = new \ReflectionProperty('Monolog\Handler\StreamHandler', 'stream'); $streamProp->setAccessible(true); $handle = $streamProp->getValue($handler); $this->assertTrue(is_resource($handle)); $handler->close(); $this->assertFalse(is_resource($handle)); } /** * @covers Monolog\Handler\StreamHandler::write */ public function testWriteCreatesTheStreamResource() { $handler = new StreamHandler('php://memory'); $handler->handle($this->getRecord()); } /** * @covers Monolog\Handler\StreamHandler::__construct * @covers Monolog\Handler\StreamHandler::write */ public function testWriteLocking() { $temp = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'monolog_locked_log'; $handler = new StreamHandler($temp, Logger::DEBUG, true, null, true); $handler->handle($this->getRecord()); } /** * @expectedException LogicException * @covers Monolog\Handler\StreamHandler::__construct * @covers Monolog\Handler\StreamHandler::write */ public function testWriteMissingResource() { $handler = new StreamHandler(null); $handler->handle($this->getRecord()); } public function invalidArgumentProvider() { return array( array(1), array(array()), array(array('bogus://url')), ); } /** * @dataProvider invalidArgumentProvider * @expectedException InvalidArgumentException * @covers Monolog\Handler\StreamHandler::__construct */ public function testWriteInvalidArgument($invalidArgument) { $handler = new StreamHandler($invalidArgument); } /** * @expectedException UnexpectedValueException * @covers Monolog\Handler\StreamHandler::__construct * @covers Monolog\Handler\StreamHandler::write */ public function testWriteInvalidResource() { $handler = new StreamHandler('bogus://url'); $handler->handle($this->getRecord()); } /** * @expectedException UnexpectedValueException * @covers Monolog\Handler\StreamHandler::__construct * @covers Monolog\Handler\StreamHandler::write */ public function testWriteNonExistingResource() { $handler = new StreamHandler('ftp://foo/bar/baz/'.rand(0, 10000)); $handler->handle($this->getRecord()); } /** * @covers Monolog\Handler\StreamHandler::__construct * @covers Monolog\Handler\StreamHandler::write */ public function testWriteNonExistingPath() { $handler = new StreamHandler(sys_get_temp_dir().'/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000)); $handler->handle($this->getRecord()); } /** * @covers Monolog\Handler\StreamHandler::__construct * @covers Monolog\Handler\StreamHandler::write */ public function testWriteNonExistingFileResource() { $handler = new StreamHandler('file://'.sys_get_temp_dir().'/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000)); $handler->handle($this->getRecord()); } /** * @expectedException Exception * @expectedExceptionMessageRegExp /There is no existing directory at/ * @covers Monolog\Handler\StreamHandler::__construct * @covers Monolog\Handler\StreamHandler::write */ public function testWriteNonExistingAndNotCreatablePath() { if (defined('PHP_WINDOWS_VERSION_BUILD')) { $this->markTestSkipped('Permissions checks can not run on windows'); } $handler = new StreamHandler('/foo/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000)); $handler->handle($this->getRecord()); } /** * @expectedException Exception * @expectedExceptionMessageRegExp /There is no existing directory at/ * @covers Monolog\Handler\StreamHandler::__construct * @covers Monolog\Handler\StreamHandler::write */ public function testWriteNonExistingAndNotCreatableFileResource() { if (defined('PHP_WINDOWS_VERSION_BUILD')) { $this->markTestSkipped('Permissions checks can not run on windows'); } $handler = new StreamHandler('file:///foo/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000)); $handler->handle($this->getRecord()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SwiftMailerHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\TestCase; class SwiftMailerHandlerTest extends TestCase { /** @var \Swift_Mailer|\PHPUnit_Framework_MockObject_MockObject */ private $mailer; public function setUp() { $this->mailer = $this ->getMockBuilder('Swift_Mailer') ->disableOriginalConstructor() ->getMock(); } public function testMessageCreationIsLazyWhenUsingCallback() { $this->mailer->expects($this->never()) ->method('send'); $callback = function () { throw new \RuntimeException('Swift_Message creation callback should not have been called in this test'); }; $handler = new SwiftMailerHandler($this->mailer, $callback); $records = array( $this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO), ); $handler->handleBatch($records); } public function testMessageCanBeCustomizedGivenLoggedData() { // Wire Mailer to expect a specific Swift_Message with a customized Subject $expectedMessage = new \Swift_Message(); $this->mailer->expects($this->once()) ->method('send') ->with($this->callback(function ($value) use ($expectedMessage) { return $value instanceof \Swift_Message && $value->getSubject() === 'Emergency' && $value === $expectedMessage; })); // Callback dynamically changes subject based on number of logged records $callback = function ($content, array $records) use ($expectedMessage) { $subject = count($records) > 0 ? 'Emergency' : 'Normal'; $expectedMessage->setSubject($subject); return $expectedMessage; }; $handler = new SwiftMailerHandler($this->mailer, $callback); // Logging 1 record makes this an Emergency $records = array( $this->getRecord(Logger::EMERGENCY), ); $handler->handleBatch($records); } public function testMessageSubjectFormatting() { // Wire Mailer to expect a specific Swift_Message with a customized Subject $messageTemplate = new \Swift_Message(); $messageTemplate->setSubject('Alert: %level_name% %message%'); $receivedMessage = null; $this->mailer->expects($this->once()) ->method('send') ->with($this->callback(function ($value) use (&$receivedMessage) { $receivedMessage = $value; return true; })); $handler = new SwiftMailerHandler($this->mailer, $messageTemplate); $records = array( $this->getRecord(Logger::EMERGENCY), ); $handler->handleBatch($records); $this->assertEquals('Alert: EMERGENCY test', $receivedMessage->getSubject()); } public function testMessageHaveUniqueId() { $messageTemplate = new \Swift_Message(); $handler = new SwiftMailerHandler($this->mailer, $messageTemplate); $method = new \ReflectionMethod('Monolog\Handler\SwiftMailerHandler', 'buildMessage'); $method->setAccessible(true); $method->invokeArgs($handler, array($messageTemplate, array())); $builtMessage1 = $method->invoke($handler, $messageTemplate, array()); $builtMessage2 = $method->invoke($handler, $messageTemplate, array()); $this->assertFalse($builtMessage1->getId() === $builtMessage2->getId(), 'Two different messages have the same id'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; class SyslogHandlerTest extends \PHPUnit_Framework_TestCase { /** * @covers Monolog\Handler\SyslogHandler::__construct */ public function testConstruct() { $handler = new SyslogHandler('test'); $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); $handler = new SyslogHandler('test', LOG_USER); $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); $handler = new SyslogHandler('test', 'user'); $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); $handler = new SyslogHandler('test', LOG_USER, Logger::DEBUG, true, LOG_PERROR); $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); } /** * @covers Monolog\Handler\SyslogHandler::__construct */ public function testConstructInvalidFacility() { $this->setExpectedException('UnexpectedValueException'); $handler = new SyslogHandler('test', 'unknown'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; /** * @requires extension sockets */ class SyslogUdpHandlerTest extends TestCase { /** * @expectedException UnexpectedValueException */ public function testWeValidateFacilities() { $handler = new SyslogUdpHandler("ip", null, "invalidFacility"); } public function testWeSplitIntoLines() { $time = '2014-01-07T12:34'; $pid = getmypid(); $host = gethostname(); $handler = $this->getMockBuilder('\Monolog\Handler\SyslogUdpHandler') ->setConstructorArgs(array("127.0.0.1", 514, "authpriv")) ->setMethods(array('getDateTime')) ->getMock(); $handler->method('getDateTime') ->willReturn($time); $handler->setFormatter(new \Monolog\Formatter\ChromePHPFormatter()); $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('write'), array('lol', 'lol')); $socket->expects($this->at(0)) ->method('write') ->with("lol", "<".(LOG_AUTHPRIV + LOG_WARNING).">1 $time $host php $pid - - "); $socket->expects($this->at(1)) ->method('write') ->with("hej", "<".(LOG_AUTHPRIV + LOG_WARNING).">1 $time $host php $pid - - "); $handler->setSocket($socket); $handler->handle($this->getRecordWithMessage("hej\nlol")); } public function testSplitWorksOnEmptyMsg() { $handler = new SyslogUdpHandler("127.0.0.1", 514, "authpriv"); $handler->setFormatter($this->getIdentityFormatter()); $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('write'), array('lol', 'lol')); $socket->expects($this->never()) ->method('write'); $handler->setSocket($socket); $handler->handle($this->getRecordWithMessage(null)); } protected function getRecordWithMessage($msg) { return array('message' => $msg, 'level' => \Monolog\Logger::WARNING, 'context' => null, 'extra' => array(), 'channel' => 'lol'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; /** * @covers Monolog\Handler\TestHandler */ class TestHandlerTest extends TestCase { /** * @dataProvider methodProvider */ public function testHandler($method, $level) { $handler = new TestHandler; $record = $this->getRecord($level, 'test'.$method); $this->assertFalse($handler->hasRecords($level)); $this->assertFalse($handler->hasRecord($record, $level)); $this->assertFalse($handler->{'has'.$method}($record), 'has'.$method); $this->assertFalse($handler->{'has'.$method.'ThatContains'}('test'), 'has'.$method.'ThatContains'); $this->assertFalse($handler->{'has'.$method.'ThatPasses'}(function ($rec) { return true; }), 'has'.$method.'ThatPasses'); $this->assertFalse($handler->{'has'.$method.'ThatMatches'}('/test\w+/')); $this->assertFalse($handler->{'has'.$method.'Records'}(), 'has'.$method.'Records'); $handler->handle($record); $this->assertFalse($handler->{'has'.$method}('bar'), 'has'.$method); $this->assertTrue($handler->hasRecords($level)); $this->assertTrue($handler->hasRecord($record, $level)); $this->assertTrue($handler->{'has'.$method}($record), 'has'.$method); $this->assertTrue($handler->{'has'.$method}('test'.$method), 'has'.$method); $this->assertTrue($handler->{'has'.$method.'ThatContains'}('test'), 'has'.$method.'ThatContains'); $this->assertTrue($handler->{'has'.$method.'ThatPasses'}(function ($rec) { return true; }), 'has'.$method.'ThatPasses'); $this->assertTrue($handler->{'has'.$method.'ThatMatches'}('/test\w+/')); $this->assertTrue($handler->{'has'.$method.'Records'}(), 'has'.$method.'Records'); $records = $handler->getRecords(); unset($records[0]['formatted']); $this->assertEquals(array($record), $records); } public function methodProvider() { return array( array('Emergency', Logger::EMERGENCY), array('Alert' , Logger::ALERT), array('Critical' , Logger::CRITICAL), array('Error' , Logger::ERROR), array('Warning' , Logger::WARNING), array('Info' , Logger::INFO), array('Notice' , Logger::NOTICE), array('Debug' , Logger::DEBUG), ); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Handler\SyslogUdp\UdpSocket; /** * @requires extension sockets */ class UdpSocketTest extends TestCase { public function testWeDoNotTruncateShortMessages() { $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol')); $socket->expects($this->at(0)) ->method('send') ->with("HEADER: The quick brown fox jumps over the lazy dog"); $socket->write("The quick brown fox jumps over the lazy dog", "HEADER: "); } public function testLongMessagesAreTruncated() { $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol')); $truncatedString = str_repeat("derp", 16254).'d'; $socket->expects($this->exactly(1)) ->method('send') ->with("HEADER" . $truncatedString); $longString = str_repeat("derp", 20000); $socket->write($longString, "HEADER"); } public function testDoubleCloseDoesNotError() { $socket = new UdpSocket('127.0.0.1', 514); $socket->close(); $socket->close(); } /** * @expectedException LogicException */ public function testWriteAfterCloseErrors() { $socket = new UdpSocket('127.0.0.1', 514); $socket->close(); $socket->write('foo', "HEADER"); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; class WhatFailureGroupHandlerTest extends TestCase { /** * @covers Monolog\Handler\WhatFailureGroupHandler::__construct * @expectedException InvalidArgumentException */ public function testConstructorOnlyTakesHandler() { new WhatFailureGroupHandler(array(new TestHandler(), "foo")); } /** * @covers Monolog\Handler\WhatFailureGroupHandler::__construct * @covers Monolog\Handler\WhatFailureGroupHandler::handle */ public function testHandle() { $testHandlers = array(new TestHandler(), new TestHandler()); $handler = new WhatFailureGroupHandler($testHandlers); $handler->handle($this->getRecord(Logger::DEBUG)); $handler->handle($this->getRecord(Logger::INFO)); foreach ($testHandlers as $test) { $this->assertTrue($test->hasDebugRecords()); $this->assertTrue($test->hasInfoRecords()); $this->assertTrue(count($test->getRecords()) === 2); } } /** * @covers Monolog\Handler\WhatFailureGroupHandler::handleBatch */ public function testHandleBatch() { $testHandlers = array(new TestHandler(), new TestHandler()); $handler = new WhatFailureGroupHandler($testHandlers); $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO))); foreach ($testHandlers as $test) { $this->assertTrue($test->hasDebugRecords()); $this->assertTrue($test->hasInfoRecords()); $this->assertTrue(count($test->getRecords()) === 2); } } /** * @covers Monolog\Handler\WhatFailureGroupHandler::isHandling */ public function testIsHandling() { $testHandlers = array(new TestHandler(Logger::ERROR), new TestHandler(Logger::WARNING)); $handler = new WhatFailureGroupHandler($testHandlers); $this->assertTrue($handler->isHandling($this->getRecord(Logger::ERROR))); $this->assertTrue($handler->isHandling($this->getRecord(Logger::WARNING))); $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); } /** * @covers Monolog\Handler\WhatFailureGroupHandler::handle */ public function testHandleUsesProcessors() { $test = new TestHandler(); $handler = new WhatFailureGroupHandler(array($test)); $handler->pushProcessor(function ($record) { $record['extra']['foo'] = true; return $record; }); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertTrue($test->hasWarningRecords()); $records = $test->getRecords(); $this->assertTrue($records[0]['extra']['foo']); } /** * @covers Monolog\Handler\WhatFailureGroupHandler::handle */ public function testHandleException() { $test = new TestHandler(); $exception = new ExceptionTestHandler(); $handler = new WhatFailureGroupHandler(array($exception, $test, $exception)); $handler->pushProcessor(function ($record) { $record['extra']['foo'] = true; return $record; }); $handler->handle($this->getRecord(Logger::WARNING)); $this->assertTrue($test->hasWarningRecords()); $records = $test->getRecords(); $this->assertTrue($records[0]['extra']['foo']); } } class ExceptionTestHandler extends TestHandler { /** * {@inheritdoc} */ public function handle(array $record) { parent::handle($record); throw new \Exception("ExceptionTestHandler::handle"); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\TestCase; class ZendMonitorHandlerTest extends TestCase { protected $zendMonitorHandler; public function setUp() { if (!function_exists('zend_monitor_custom_event')) { $this->markTestSkipped('ZendServer is not installed'); } } /** * @covers Monolog\Handler\ZendMonitorHandler::write */ public function testWrite() { $record = $this->getRecord(); $formatterResult = array( 'message' => $record['message'], ); $zendMonitor = $this->getMockBuilder('Monolog\Handler\ZendMonitorHandler') ->setMethods(array('writeZendMonitorCustomEvent', 'getDefaultFormatter')) ->getMock(); $formatterMock = $this->getMockBuilder('Monolog\Formatter\NormalizerFormatter') ->disableOriginalConstructor() ->getMock(); $formatterMock->expects($this->once()) ->method('format') ->will($this->returnValue($formatterResult)); $zendMonitor->expects($this->once()) ->method('getDefaultFormatter') ->will($this->returnValue($formatterMock)); $levelMap = $zendMonitor->getLevelMap(); $zendMonitor->expects($this->once()) ->method('writeZendMonitorCustomEvent') ->with($levelMap[$record['level']], $record['message'], $formatterResult); $zendMonitor->handle($record); } /** * @covers Monolog\Handler\ZendMonitorHandler::getDefaultFormatter */ public function testGetDefaultFormatterReturnsNormalizerFormatter() { $zendMonitor = new ZendMonitorHandler(); $this->assertInstanceOf('Monolog\Formatter\NormalizerFormatter', $zendMonitor->getDefaultFormatter()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/LoggerTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use Monolog\Processor\WebProcessor; use Monolog\Handler\TestHandler; class LoggerTest extends \PHPUnit_Framework_TestCase { /** * @covers Monolog\Logger::getName */ public function testGetName() { $logger = new Logger('foo'); $this->assertEquals('foo', $logger->getName()); } /** * @covers Monolog\Logger::getLevelName */ public function testGetLevelName() { $this->assertEquals('ERROR', Logger::getLevelName(Logger::ERROR)); } /** * @covers Monolog\Logger::withName */ public function testWithName() { $first = new Logger('first', array($handler = new TestHandler())); $second = $first->withName('second'); $this->assertSame('first', $first->getName()); $this->assertSame('second', $second->getName()); $this->assertSame($handler, $second->popHandler()); } /** * @covers Monolog\Logger::toMonologLevel */ public function testConvertPSR3ToMonologLevel() { $this->assertEquals(Logger::toMonologLevel('debug'), 100); $this->assertEquals(Logger::toMonologLevel('info'), 200); $this->assertEquals(Logger::toMonologLevel('notice'), 250); $this->assertEquals(Logger::toMonologLevel('warning'), 300); $this->assertEquals(Logger::toMonologLevel('error'), 400); $this->assertEquals(Logger::toMonologLevel('critical'), 500); $this->assertEquals(Logger::toMonologLevel('alert'), 550); $this->assertEquals(Logger::toMonologLevel('emergency'), 600); } /** * @covers Monolog\Logger::getLevelName * @expectedException InvalidArgumentException */ public function testGetLevelNameThrows() { Logger::getLevelName(5); } /** * @covers Monolog\Logger::__construct */ public function testChannel() { $logger = new Logger('foo'); $handler = new TestHandler; $logger->pushHandler($handler); $logger->addWarning('test'); list($record) = $handler->getRecords(); $this->assertEquals('foo', $record['channel']); } /** * @covers Monolog\Logger::addRecord */ public function testLog() { $logger = new Logger(__METHOD__); $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle')); $handler->expects($this->once()) ->method('handle'); $logger->pushHandler($handler); $this->assertTrue($logger->addWarning('test')); } /** * @covers Monolog\Logger::addRecord */ public function testLogNotHandled() { $logger = new Logger(__METHOD__); $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'), array(Logger::ERROR)); $handler->expects($this->never()) ->method('handle'); $logger->pushHandler($handler); $this->assertFalse($logger->addWarning('test')); } public function testHandlersInCtor() { $handler1 = new TestHandler; $handler2 = new TestHandler; $logger = new Logger(__METHOD__, array($handler1, $handler2)); $this->assertEquals($handler1, $logger->popHandler()); $this->assertEquals($handler2, $logger->popHandler()); } public function testProcessorsInCtor() { $processor1 = new WebProcessor; $processor2 = new WebProcessor; $logger = new Logger(__METHOD__, array(), array($processor1, $processor2)); $this->assertEquals($processor1, $logger->popProcessor()); $this->assertEquals($processor2, $logger->popProcessor()); } /** * @covers Monolog\Logger::pushHandler * @covers Monolog\Logger::popHandler * @expectedException LogicException */ public function testPushPopHandler() { $logger = new Logger(__METHOD__); $handler1 = new TestHandler; $handler2 = new TestHandler; $logger->pushHandler($handler1); $logger->pushHandler($handler2); $this->assertEquals($handler2, $logger->popHandler()); $this->assertEquals($handler1, $logger->popHandler()); $logger->popHandler(); } /** * @covers Monolog\Logger::setHandlers */ public function testSetHandlers() { $logger = new Logger(__METHOD__); $handler1 = new TestHandler; $handler2 = new TestHandler; $logger->pushHandler($handler1); $logger->setHandlers(array($handler2)); // handler1 has been removed $this->assertEquals(array($handler2), $logger->getHandlers()); $logger->setHandlers(array( "AMapKey" => $handler1, "Woop" => $handler2, )); // Keys have been scrubbed $this->assertEquals(array($handler1, $handler2), $logger->getHandlers()); } /** * @covers Monolog\Logger::pushProcessor * @covers Monolog\Logger::popProcessor * @expectedException LogicException */ public function testPushPopProcessor() { $logger = new Logger(__METHOD__); $processor1 = new WebProcessor; $processor2 = new WebProcessor; $logger->pushProcessor($processor1); $logger->pushProcessor($processor2); $this->assertEquals($processor2, $logger->popProcessor()); $this->assertEquals($processor1, $logger->popProcessor()); $logger->popProcessor(); } /** * @covers Monolog\Logger::pushProcessor * @expectedException InvalidArgumentException */ public function testPushProcessorWithNonCallable() { $logger = new Logger(__METHOD__); $logger->pushProcessor(new \stdClass()); } /** * @covers Monolog\Logger::addRecord */ public function testProcessorsAreExecuted() { $logger = new Logger(__METHOD__); $handler = new TestHandler; $logger->pushHandler($handler); $logger->pushProcessor(function ($record) { $record['extra']['win'] = true; return $record; }); $logger->addError('test'); list($record) = $handler->getRecords(); $this->assertTrue($record['extra']['win']); } /** * @covers Monolog\Logger::addRecord */ public function testProcessorsAreCalledOnlyOnce() { $logger = new Logger(__METHOD__); $handler = $this->getMock('Monolog\Handler\HandlerInterface'); $handler->expects($this->any()) ->method('isHandling') ->will($this->returnValue(true)) ; $handler->expects($this->any()) ->method('handle') ->will($this->returnValue(true)) ; $logger->pushHandler($handler); $processor = $this->getMockBuilder('Monolog\Processor\WebProcessor') ->disableOriginalConstructor() ->setMethods(array('__invoke')) ->getMock() ; $processor->expects($this->once()) ->method('__invoke') ->will($this->returnArgument(0)) ; $logger->pushProcessor($processor); $logger->addError('test'); } /** * @covers Monolog\Logger::addRecord */ public function testProcessorsNotCalledWhenNotHandled() { $logger = new Logger(__METHOD__); $handler = $this->getMock('Monolog\Handler\HandlerInterface'); $handler->expects($this->once()) ->method('isHandling') ->will($this->returnValue(false)) ; $logger->pushHandler($handler); $that = $this; $logger->pushProcessor(function ($record) use ($that) { $that->fail('The processor should not be called'); }); $logger->addAlert('test'); } /** * @covers Monolog\Logger::addRecord */ public function testHandlersNotCalledBeforeFirstHandling() { $logger = new Logger(__METHOD__); $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler1->expects($this->never()) ->method('isHandling') ->will($this->returnValue(false)) ; $handler1->expects($this->once()) ->method('handle') ->will($this->returnValue(false)) ; $logger->pushHandler($handler1); $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler2->expects($this->once()) ->method('isHandling') ->will($this->returnValue(true)) ; $handler2->expects($this->once()) ->method('handle') ->will($this->returnValue(false)) ; $logger->pushHandler($handler2); $handler3 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler3->expects($this->once()) ->method('isHandling') ->will($this->returnValue(false)) ; $handler3->expects($this->never()) ->method('handle') ; $logger->pushHandler($handler3); $logger->debug('test'); } /** * @covers Monolog\Logger::addRecord */ public function testHandlersNotCalledBeforeFirstHandlingWithAssocArray() { $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler1->expects($this->never()) ->method('isHandling') ->will($this->returnValue(false)) ; $handler1->expects($this->once()) ->method('handle') ->will($this->returnValue(false)) ; $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler2->expects($this->once()) ->method('isHandling') ->will($this->returnValue(true)) ; $handler2->expects($this->once()) ->method('handle') ->will($this->returnValue(false)) ; $handler3 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler3->expects($this->once()) ->method('isHandling') ->will($this->returnValue(false)) ; $handler3->expects($this->never()) ->method('handle') ; $logger = new Logger(__METHOD__, array('last' => $handler3, 'second' => $handler2, 'first' => $handler1)); $logger->debug('test'); } /** * @covers Monolog\Logger::addRecord */ public function testBubblingWhenTheHandlerReturnsFalse() { $logger = new Logger(__METHOD__); $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler1->expects($this->any()) ->method('isHandling') ->will($this->returnValue(true)) ; $handler1->expects($this->once()) ->method('handle') ->will($this->returnValue(false)) ; $logger->pushHandler($handler1); $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler2->expects($this->any()) ->method('isHandling') ->will($this->returnValue(true)) ; $handler2->expects($this->once()) ->method('handle') ->will($this->returnValue(false)) ; $logger->pushHandler($handler2); $logger->debug('test'); } /** * @covers Monolog\Logger::addRecord */ public function testNotBubblingWhenTheHandlerReturnsTrue() { $logger = new Logger(__METHOD__); $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler1->expects($this->any()) ->method('isHandling') ->will($this->returnValue(true)) ; $handler1->expects($this->never()) ->method('handle') ; $logger->pushHandler($handler1); $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler2->expects($this->any()) ->method('isHandling') ->will($this->returnValue(true)) ; $handler2->expects($this->once()) ->method('handle') ->will($this->returnValue(true)) ; $logger->pushHandler($handler2); $logger->debug('test'); } /** * @covers Monolog\Logger::isHandling */ public function testIsHandling() { $logger = new Logger(__METHOD__); $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler1->expects($this->any()) ->method('isHandling') ->will($this->returnValue(false)) ; $logger->pushHandler($handler1); $this->assertFalse($logger->isHandling(Logger::DEBUG)); $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); $handler2->expects($this->any()) ->method('isHandling') ->will($this->returnValue(true)) ; $logger->pushHandler($handler2); $this->assertTrue($logger->isHandling(Logger::DEBUG)); } /** * @dataProvider logMethodProvider * @covers Monolog\Logger::addDebug * @covers Monolog\Logger::addInfo * @covers Monolog\Logger::addNotice * @covers Monolog\Logger::addWarning * @covers Monolog\Logger::addError * @covers Monolog\Logger::addCritical * @covers Monolog\Logger::addAlert * @covers Monolog\Logger::addEmergency * @covers Monolog\Logger::debug * @covers Monolog\Logger::info * @covers Monolog\Logger::notice * @covers Monolog\Logger::warn * @covers Monolog\Logger::err * @covers Monolog\Logger::crit * @covers Monolog\Logger::alert * @covers Monolog\Logger::emerg */ public function testLogMethods($method, $expectedLevel) { $logger = new Logger('foo'); $handler = new TestHandler; $logger->pushHandler($handler); $logger->{$method}('test'); list($record) = $handler->getRecords(); $this->assertEquals($expectedLevel, $record['level']); } public function logMethodProvider() { return array( // monolog methods array('addDebug', Logger::DEBUG), array('addInfo', Logger::INFO), array('addNotice', Logger::NOTICE), array('addWarning', Logger::WARNING), array('addError', Logger::ERROR), array('addCritical', Logger::CRITICAL), array('addAlert', Logger::ALERT), array('addEmergency', Logger::EMERGENCY), // ZF/Sf2 compat methods array('debug', Logger::DEBUG), array('info', Logger::INFO), array('notice', Logger::NOTICE), array('warn', Logger::WARNING), array('err', Logger::ERROR), array('crit', Logger::CRITICAL), array('alert', Logger::ALERT), array('emerg', Logger::EMERGENCY), ); } /** * @dataProvider setTimezoneProvider * @covers Monolog\Logger::setTimezone */ public function testSetTimezone($tz) { Logger::setTimezone($tz); $logger = new Logger('foo'); $handler = new TestHandler; $logger->pushHandler($handler); $logger->info('test'); list($record) = $handler->getRecords(); $this->assertEquals($tz, $record['datetime']->getTimezone()); } public function setTimezoneProvider() { return array_map( function ($tz) { return array(new \DateTimeZone($tz)); }, \DateTimeZone::listIdentifiers() ); } /** * @dataProvider useMicrosecondTimestampsProvider * @covers Monolog\Logger::useMicrosecondTimestamps * @covers Monolog\Logger::addRecord */ public function testUseMicrosecondTimestamps($micro, $assert) { $logger = new Logger('foo'); $logger->useMicrosecondTimestamps($micro); $handler = new TestHandler; $logger->pushHandler($handler); $logger->info('test'); list($record) = $handler->getRecords(); $this->{$assert}('000000', $record['datetime']->format('u')); } public function useMicrosecondTimestampsProvider() { return array( // this has a very small chance of a false negative (1/10^6) 'with microseconds' => array(true, 'assertNotSame'), 'without microseconds' => array(false, PHP_VERSION_ID >= 70100 ? 'assertNotSame' : 'assertSame'), ); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\TestCase; class GitProcessorTest extends TestCase { /** * @covers Monolog\Processor\GitProcessor::__invoke */ public function testProcessor() { $processor = new GitProcessor(); $record = $processor($this->getRecord()); $this->assertArrayHasKey('git', $record['extra']); $this->assertTrue(!is_array($record['extra']['git']['branch'])); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Acme; class Tester { public function test($handler, $record) { $handler->handle($record); } } function tester($handler, $record) { $handler->handle($record); } namespace Monolog\Processor; use Monolog\Logger; use Monolog\TestCase; use Monolog\Handler\TestHandler; class IntrospectionProcessorTest extends TestCase { public function getHandler() { $processor = new IntrospectionProcessor(); $handler = new TestHandler(); $handler->pushProcessor($processor); return $handler; } public function testProcessorFromClass() { $handler = $this->getHandler(); $tester = new \Acme\Tester; $tester->test($handler, $this->getRecord()); list($record) = $handler->getRecords(); $this->assertEquals(__FILE__, $record['extra']['file']); $this->assertEquals(18, $record['extra']['line']); $this->assertEquals('Acme\Tester', $record['extra']['class']); $this->assertEquals('test', $record['extra']['function']); } public function testProcessorFromFunc() { $handler = $this->getHandler(); \Acme\tester($handler, $this->getRecord()); list($record) = $handler->getRecords(); $this->assertEquals(__FILE__, $record['extra']['file']); $this->assertEquals(24, $record['extra']['line']); $this->assertEquals(null, $record['extra']['class']); $this->assertEquals('Acme\tester', $record['extra']['function']); } public function testLevelTooLow() { $input = array( 'level' => Logger::DEBUG, 'extra' => array(), ); $expected = $input; $processor = new IntrospectionProcessor(Logger::CRITICAL); $actual = $processor($input); $this->assertEquals($expected, $actual); } public function testLevelEqual() { $input = array( 'level' => Logger::CRITICAL, 'extra' => array(), ); $expected = $input; $expected['extra'] = array( 'file' => null, 'line' => null, 'class' => 'ReflectionMethod', 'function' => 'invokeArgs', ); $processor = new IntrospectionProcessor(Logger::CRITICAL); $actual = $processor($input); $this->assertEquals($expected, $actual); } public function testLevelHigher() { $input = array( 'level' => Logger::EMERGENCY, 'extra' => array(), ); $expected = $input; $expected['extra'] = array( 'file' => null, 'line' => null, 'class' => 'ReflectionMethod', 'function' => 'invokeArgs', ); $processor = new IntrospectionProcessor(Logger::CRITICAL); $actual = $processor($input); $this->assertEquals($expected, $actual); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\TestCase; class MemoryPeakUsageProcessorTest extends TestCase { /** * @covers Monolog\Processor\MemoryPeakUsageProcessor::__invoke * @covers Monolog\Processor\MemoryProcessor::formatBytes */ public function testProcessor() { $processor = new MemoryPeakUsageProcessor(); $record = $processor($this->getRecord()); $this->assertArrayHasKey('memory_peak_usage', $record['extra']); $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_peak_usage']); } /** * @covers Monolog\Processor\MemoryPeakUsageProcessor::__invoke * @covers Monolog\Processor\MemoryProcessor::formatBytes */ public function testProcessorWithoutFormatting() { $processor = new MemoryPeakUsageProcessor(true, false); $record = $processor($this->getRecord()); $this->assertArrayHasKey('memory_peak_usage', $record['extra']); $this->assertInternalType('int', $record['extra']['memory_peak_usage']); $this->assertGreaterThan(0, $record['extra']['memory_peak_usage']); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\TestCase; class MemoryUsageProcessorTest extends TestCase { /** * @covers Monolog\Processor\MemoryUsageProcessor::__invoke * @covers Monolog\Processor\MemoryProcessor::formatBytes */ public function testProcessor() { $processor = new MemoryUsageProcessor(); $record = $processor($this->getRecord()); $this->assertArrayHasKey('memory_usage', $record['extra']); $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_usage']); } /** * @covers Monolog\Processor\MemoryUsageProcessor::__invoke * @covers Monolog\Processor\MemoryProcessor::formatBytes */ public function testProcessorWithoutFormatting() { $processor = new MemoryUsageProcessor(true, false); $record = $processor($this->getRecord()); $this->assertArrayHasKey('memory_usage', $record['extra']); $this->assertInternalType('int', $record['extra']['memory_usage']); $this->assertGreaterThan(0, $record['extra']['memory_usage']); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/MercurialProcessorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\TestCase; class MercurialProcessorTest extends TestCase { /** * @covers Monolog\Processor\MercurialProcessor::__invoke */ public function testProcessor() { if (defined('PHP_WINDOWS_VERSION_BUILD')) { exec("where hg 2>NUL", $output, $result); } else { exec("which hg 2>/dev/null >/dev/null", $output, $result); } if ($result != 0) { $this->markTestSkipped('hg is missing'); return; } `hg init`; $processor = new MercurialProcessor(); $record = $processor($this->getRecord()); $this->assertArrayHasKey('hg', $record['extra']); $this->assertTrue(!is_array($record['extra']['hg']['branch'])); $this->assertTrue(!is_array($record['extra']['hg']['revision'])); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\TestCase; class ProcessIdProcessorTest extends TestCase { /** * @covers Monolog\Processor\ProcessIdProcessor::__invoke */ public function testProcessor() { $processor = new ProcessIdProcessor(); $record = $processor($this->getRecord()); $this->assertArrayHasKey('process_id', $record['extra']); $this->assertInternalType('int', $record['extra']['process_id']); $this->assertGreaterThan(0, $record['extra']['process_id']); $this->assertEquals(getmypid(), $record['extra']['process_id']); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/PsrLogMessageProcessorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; class PsrLogMessageProcessorTest extends \PHPUnit_Framework_TestCase { /** * @dataProvider getPairs */ public function testReplacement($val, $expected) { $proc = new PsrLogMessageProcessor; $message = $proc(array( 'message' => '{foo}', 'context' => array('foo' => $val), )); $this->assertEquals($expected, $message['message']); } public function getPairs() { return array( array('foo', 'foo'), array('3', '3'), array(3, '3'), array(null, ''), array(true, '1'), array(false, ''), array(new \stdClass, '[object stdClass]'), array(array(), '[array]'), ); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\TestCase; class TagProcessorTest extends TestCase { /** * @covers Monolog\Processor\TagProcessor::__invoke */ public function testProcessor() { $tags = array(1, 2, 3); $processor = new TagProcessor($tags); $record = $processor($this->getRecord()); $this->assertEquals($tags, $record['extra']['tags']); } /** * @covers Monolog\Processor\TagProcessor::__invoke */ public function testProcessorTagModification() { $tags = array(1, 2, 3); $processor = new TagProcessor($tags); $record = $processor($this->getRecord()); $this->assertEquals($tags, $record['extra']['tags']); $processor->setTags(array('a', 'b')); $record = $processor($this->getRecord()); $this->assertEquals(array('a', 'b'), $record['extra']['tags']); $processor->addTags(array('a', 'c', 'foo' => 'bar')); $record = $processor($this->getRecord()); $this->assertEquals(array('a', 'b', 'a', 'c', 'foo' => 'bar'), $record['extra']['tags']); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\TestCase; class UidProcessorTest extends TestCase { /** * @covers Monolog\Processor\UidProcessor::__invoke */ public function testProcessor() { $processor = new UidProcessor(); $record = $processor($this->getRecord()); $this->assertArrayHasKey('uid', $record['extra']); } public function testGetUid() { $processor = new UidProcessor(10); $this->assertEquals(10, strlen($processor->getUid())); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\TestCase; class WebProcessorTest extends TestCase { public function testProcessor() { $server = array( 'REQUEST_URI' => 'A', 'REMOTE_ADDR' => 'B', 'REQUEST_METHOD' => 'C', 'HTTP_REFERER' => 'D', 'SERVER_NAME' => 'F', 'UNIQUE_ID' => 'G', ); $processor = new WebProcessor($server); $record = $processor($this->getRecord()); $this->assertEquals($server['REQUEST_URI'], $record['extra']['url']); $this->assertEquals($server['REMOTE_ADDR'], $record['extra']['ip']); $this->assertEquals($server['REQUEST_METHOD'], $record['extra']['http_method']); $this->assertEquals($server['HTTP_REFERER'], $record['extra']['referrer']); $this->assertEquals($server['SERVER_NAME'], $record['extra']['server']); $this->assertEquals($server['UNIQUE_ID'], $record['extra']['unique_id']); } public function testProcessorDoNothingIfNoRequestUri() { $server = array( 'REMOTE_ADDR' => 'B', 'REQUEST_METHOD' => 'C', ); $processor = new WebProcessor($server); $record = $processor($this->getRecord()); $this->assertEmpty($record['extra']); } public function testProcessorReturnNullIfNoHttpReferer() { $server = array( 'REQUEST_URI' => 'A', 'REMOTE_ADDR' => 'B', 'REQUEST_METHOD' => 'C', 'SERVER_NAME' => 'F', ); $processor = new WebProcessor($server); $record = $processor($this->getRecord()); $this->assertNull($record['extra']['referrer']); } public function testProcessorDoesNotAddUniqueIdIfNotPresent() { $server = array( 'REQUEST_URI' => 'A', 'REMOTE_ADDR' => 'B', 'REQUEST_METHOD' => 'C', 'SERVER_NAME' => 'F', ); $processor = new WebProcessor($server); $record = $processor($this->getRecord()); $this->assertFalse(isset($record['extra']['unique_id'])); } public function testProcessorAddsOnlyRequestedExtraFields() { $server = array( 'REQUEST_URI' => 'A', 'REMOTE_ADDR' => 'B', 'REQUEST_METHOD' => 'C', 'SERVER_NAME' => 'F', ); $processor = new WebProcessor($server, array('url', 'http_method')); $record = $processor($this->getRecord()); $this->assertSame(array('url' => 'A', 'http_method' => 'C'), $record['extra']); } public function testProcessorConfiguringOfExtraFields() { $server = array( 'REQUEST_URI' => 'A', 'REMOTE_ADDR' => 'B', 'REQUEST_METHOD' => 'C', 'SERVER_NAME' => 'F', ); $processor = new WebProcessor($server, array('url' => 'REMOTE_ADDR')); $record = $processor($this->getRecord()); $this->assertSame(array('url' => 'B'), $record['extra']); } /** * @expectedException UnexpectedValueException */ public function testInvalidData() { new WebProcessor(new \stdClass); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use Monolog\Handler\TestHandler; use Monolog\Formatter\LineFormatter; use Monolog\Processor\PsrLogMessageProcessor; use Psr\Log\Test\LoggerInterfaceTest; class PsrLogCompatTest extends LoggerInterfaceTest { private $handler; public function getLogger() { $logger = new Logger('foo'); $logger->pushHandler($handler = new TestHandler); $logger->pushProcessor(new PsrLogMessageProcessor); $handler->setFormatter(new LineFormatter('%level_name% %message%')); $this->handler = $handler; return $logger; } public function getLogs() { $convert = function ($record) { $lower = function ($match) { return strtolower($match[0]); }; return preg_replace_callback('{^[A-Z]+}', $lower, $record['formatted']); }; return array_map($convert, $this->handler->getRecords()); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/RegistryTest.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; class RegistryTest extends \PHPUnit_Framework_TestCase { protected function setUp() { Registry::clear(); } /** * @dataProvider hasLoggerProvider * @covers Monolog\Registry::hasLogger */ public function testHasLogger(array $loggersToAdd, array $loggersToCheck, array $expectedResult) { foreach ($loggersToAdd as $loggerToAdd) { Registry::addLogger($loggerToAdd); } foreach ($loggersToCheck as $index => $loggerToCheck) { $this->assertSame($expectedResult[$index], Registry::hasLogger($loggerToCheck)); } } public function hasLoggerProvider() { $logger1 = new Logger('test1'); $logger2 = new Logger('test2'); $logger3 = new Logger('test3'); return array( // only instances array( array($logger1), array($logger1, $logger2), array(true, false), ), // only names array( array($logger1), array('test1', 'test2'), array(true, false), ), // mixed case array( array($logger1, $logger2), array('test1', $logger2, 'test3', $logger3), array(true, true, false, false), ), ); } /** * @covers Monolog\Registry::clear */ public function testClearClears() { Registry::addLogger(new Logger('test1'), 'log'); Registry::clear(); $this->setExpectedException('\InvalidArgumentException'); Registry::getInstance('log'); } /** * @dataProvider removedLoggerProvider * @covers Monolog\Registry::addLogger * @covers Monolog\Registry::removeLogger */ public function testRemovesLogger($loggerToAdd, $remove) { Registry::addLogger($loggerToAdd); Registry::removeLogger($remove); $this->setExpectedException('\InvalidArgumentException'); Registry::getInstance($loggerToAdd->getName()); } public function removedLoggerProvider() { $logger1 = new Logger('test1'); return array( array($logger1, $logger1), array($logger1, 'test1'), ); } /** * @covers Monolog\Registry::addLogger * @covers Monolog\Registry::getInstance * @covers Monolog\Registry::__callStatic */ public function testGetsSameLogger() { $logger1 = new Logger('test1'); $logger2 = new Logger('test2'); Registry::addLogger($logger1, 'test1'); Registry::addLogger($logger2); $this->assertSame($logger1, Registry::getInstance('test1')); $this->assertSame($logger2, Registry::test2()); } /** * @expectedException \InvalidArgumentException * @covers Monolog\Registry::getInstance */ public function testFailsOnNonExistantLogger() { Registry::getInstance('test1'); } /** * @covers Monolog\Registry::addLogger */ public function testReplacesLogger() { $log1 = new Logger('test1'); $log2 = new Logger('test2'); Registry::addLogger($log1, 'log'); Registry::addLogger($log2, 'log', true); $this->assertSame($log2, Registry::getInstance('log')); } /** * @expectedException \InvalidArgumentException * @covers Monolog\Registry::addLogger */ public function testFailsOnUnspecifiedReplacement() { $log1 = new Logger('test1'); $log2 = new Logger('test2'); Registry::addLogger($log1, 'log'); Registry::addLogger($log2, 'log'); } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/monolog/monolog/tests/Monolog/TestCase.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; class TestCase extends \PHPUnit_Framework_TestCase { /** * @return array Record */ protected function getRecord($level = Logger::WARNING, $message = 'test', $context = array()) { return array( 'message' => $message, 'context' => $context, 'level' => $level, 'level_name' => Logger::getLevelName($level), 'channel' => 'test', 'datetime' => \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true))), 'extra' => array(), ); } /** * @return array */ protected function getMultipleRecords() { return array( $this->getRecord(Logger::DEBUG, 'debug message 1'), $this->getRecord(Logger::DEBUG, 'debug message 2'), $this->getRecord(Logger::INFO, 'information'), $this->getRecord(Logger::WARNING, 'warning'), $this->getRecord(Logger::ERROR, 'error'), ); } /** * @return Monolog\Formatter\FormatterInterface */ protected function getIdentityFormatter() { $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); $formatter->expects($this->any()) ->method('format') ->will($this->returnCallback(function ($record) { return $record['message']; })); return $formatter; } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/CHANGELOG.md ================================================ # Changelog All notable changes to this project will be documented in this file, in reverse chronological order by release. ## 1.0.1 - 2016-08-06 ### Added - Nothing. ### Deprecated - Nothing. ### Removed - Nothing. ### Fixed - Updated all `@return self` annotation references in interfaces to use `@return static`, which more closelly follows the semantics of the specification. - Updated the `MessageInterface::getHeaders()` return annotation to use the value `string[][]`, indicating the format is a nested array of strings. - Updated the `@link` annotation for `RequestInterface::withRequestTarget()` to point to the correct section of RFC 7230. - Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation to add the parameter name (`$uploadedFiles`). - Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()` method to correctly reference the method parameter (it was referencing an incorrect parameter name previously). ## 1.0.0 - 2016-05-18 Initial stable release; reflects accepted PSR-7 specification. ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/LICENSE ================================================ Copyright (c) 2014 PHP Framework Interoperability Group Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/README.md ================================================ PSR Http Message ================ This repository holds all interfaces/classes/traits related to [PSR-7](http://www.php-fig.org/psr/psr-7/). Note that this is not a HTTP message implementation of its own. It is merely an interface that describes a HTTP message. See the specification for more details. Usage ----- We'll certainly need some stuff in here. ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/composer.json ================================================ { "name": "psr/http-message", "description": "Common interface for HTTP messages", "keywords": ["psr", "psr-7", "http", "http-message", "request", "response"], "homepage": "https://github.com/php-fig/http-message", "license": "MIT", "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } } } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/src/MessageInterface.php ================================================ getHeaders() as $name => $values) { * echo $name . ": " . implode(", ", $values); * } * * // Emit headers iteratively: * foreach ($message->getHeaders() as $name => $values) { * foreach ($values as $value) { * header(sprintf('%s: %s', $name, $value), false); * } * } * * While header names are not case-sensitive, getHeaders() will preserve the * exact case in which headers were originally specified. * * @return string[][] Returns an associative array of the message's headers. Each * key MUST be a header name, and each value MUST be an array of strings * for that header. */ public function getHeaders(); /** * Checks if a header exists by the given case-insensitive name. * * @param string $name Case-insensitive header field name. * @return bool Returns true if any header names match the given header * name using a case-insensitive string comparison. Returns false if * no matching header name is found in the message. */ public function hasHeader($name); /** * Retrieves a message header value by the given case-insensitive name. * * This method returns an array of all the header values of the given * case-insensitive header name. * * If the header does not appear in the message, this method MUST return an * empty array. * * @param string $name Case-insensitive header field name. * @return string[] An array of string values as provided for the given * header. If the header does not appear in the message, this method MUST * return an empty array. */ public function getHeader($name); /** * Retrieves a comma-separated string of the values for a single header. * * This method returns all of the header values of the given * case-insensitive header name as a string concatenated together using * a comma. * * NOTE: Not all header values may be appropriately represented using * comma concatenation. For such headers, use getHeader() instead * and supply your own delimiter when concatenating. * * If the header does not appear in the message, this method MUST return * an empty string. * * @param string $name Case-insensitive header field name. * @return string A string of values as provided for the given header * concatenated together using a comma. If the header does not appear in * the message, this method MUST return an empty string. */ public function getHeaderLine($name); /** * Return an instance with the provided value replacing the specified header. * * While header names are case-insensitive, the casing of the header will * be preserved by this function, and returned from getHeaders(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new and/or updated header and value. * * @param string $name Case-insensitive header field name. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withHeader($name, $value); /** * Return an instance with the specified header appended with the given value. * * Existing values for the specified header will be maintained. The new * value(s) will be appended to the existing list. If the header did not * exist previously, it will be added. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new header and/or value. * * @param string $name Case-insensitive header field name to add. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withAddedHeader($name, $value); /** * Return an instance without the specified header. * * Header resolution MUST be done without case-sensitivity. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the named header. * * @param string $name Case-insensitive header field name to remove. * @return static */ public function withoutHeader($name); /** * Gets the body of the message. * * @return StreamInterface Returns the body as a stream. */ public function getBody(); /** * Return an instance with the specified message body. * * The body MUST be a StreamInterface object. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return a new instance that has the * new body stream. * * @param StreamInterface $body Body. * @return static * @throws \InvalidArgumentException When the body is not valid. */ public function withBody(StreamInterface $body); } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/src/RequestInterface.php ================================================ getQuery()` * or from the `QUERY_STRING` server param. * * @return array */ public function getQueryParams(); /** * Return an instance with the specified query string arguments. * * These values SHOULD remain immutable over the course of the incoming * request. They MAY be injected during instantiation, such as from PHP's * $_GET superglobal, or MAY be derived from some other value such as the * URI. In cases where the arguments are parsed from the URI, the data * MUST be compatible with what PHP's parse_str() would return for * purposes of how duplicate query parameters are handled, and how nested * sets are handled. * * Setting query string arguments MUST NOT change the URI stored by the * request, nor the values in the server params. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated query string arguments. * * @param array $query Array of query string arguments, typically from * $_GET. * @return static */ public function withQueryParams(array $query); /** * Retrieve normalized file upload data. * * This method returns upload metadata in a normalized tree, with each leaf * an instance of Psr\Http\Message\UploadedFileInterface. * * These values MAY be prepared from $_FILES or the message body during * instantiation, or MAY be injected via withUploadedFiles(). * * @return array An array tree of UploadedFileInterface instances; an empty * array MUST be returned if no data is present. */ public function getUploadedFiles(); /** * Create a new instance with the specified uploaded files. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param array $uploadedFiles An array tree of UploadedFileInterface instances. * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles); /** * Retrieve any parameters provided in the request body. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, this method MUST * return the contents of $_POST. * * Otherwise, this method may return any results of deserializing * the request body content; as parsing returns structured content, the * potential types MUST be arrays or objects only. A null value indicates * the absence of body content. * * @return null|array|object The deserialized body parameters, if any. * These will typically be an array or object. */ public function getParsedBody(); /** * Return an instance with the specified body parameters. * * These MAY be injected during instantiation. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, use this method * ONLY to inject the contents of $_POST. * * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of * deserializing the request body content. Deserialization/parsing returns * structured data, and, as such, this method ONLY accepts arrays or objects, * or a null value if nothing was available to parse. * * As an example, if content negotiation determines that the request data * is a JSON payload, this method could be used to create a request * instance with the deserialized parameters. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ public function withParsedBody($data); /** * Retrieve attributes derived from the request. * * The request "attributes" may be used to allow injection of any * parameters derived from the request: e.g., the results of path * match operations; the results of decrypting cookies; the results of * deserializing non-form-encoded message bodies; etc. Attributes * will be application and request specific, and CAN be mutable. * * @return array Attributes derived from the request. */ public function getAttributes(); /** * Retrieve a single derived request attribute. * * Retrieves a single derived request attribute as described in * getAttributes(). If the attribute has not been previously set, returns * the default value as provided. * * This method obviates the need for a hasAttribute() method, as it allows * specifying a default value to return if the attribute is not found. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $default Default value to return if the attribute does not exist. * @return mixed */ public function getAttribute($name, $default = null); /** * Return an instance with the specified derived request attribute. * * This method allows setting a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated attribute. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. * @return static */ public function withAttribute($name, $value); /** * Return an instance that removes the specified derived request attribute. * * This method allows removing a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the attribute. * * @see getAttributes() * @param string $name The attribute name. * @return static */ public function withoutAttribute($name); } ================================================ FILE: 配套插件/BsCore/modules/huawei_obs/vendor/psr/http-message/src/StreamInterface.php ================================================ * [user-info@]host[:port] * * * If the port component is not set or is the standard port for the current * scheme, it SHOULD NOT be included. * * @see https://tools.ietf.org/html/rfc3986#section-3.2 * @return string The URI authority, in "[user-info@]host[:port]" format. */ public function getAuthority(); /** * Retrieve the user information component of the URI. * * If no user information is present, this method MUST return an empty * string. * * If a user is present in the URI, this will return that value; * additionally, if the password is also present, it will be appended to the * user value, with a colon (":") separating the values. * * The trailing "@" character is not part of the user information and MUST * NOT be added. * * @return string The URI user information, in "username[:password]" format. */ public function getUserInfo(); /** * Retrieve the host component of the URI. * * If no host is present, this method MUST return an empty string. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.2.2. * * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 * @return string The URI host. */ public function getHost(); /** * Retrieve the port component of the URI. * * If a port is present, and it is non-standard for the current scheme, * this method MUST return it as an integer. If the port is the standard port * used with the current scheme, this method SHOULD return null. * * If no port is present, and no scheme is present, this method MUST return * a null value. * * If no port is present, but a scheme is present, this method MAY return * the standard port for that scheme, but SHOULD return null. * * @return null|int The URI port. */ public function getPort(); /** * Retrieve the path component of the URI. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Normally, the empty path "" and absolute path "/" are considered equal as * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically * do this normalization because in contexts with a trimmed base path, e.g. * the front controller, this difference becomes significant. It's the task * of the user to handle both "" and "/". * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.3. * * As an example, if the value should include a slash ("/") not intended as * delimiter between path segments, that value MUST be passed in encoded * form (e.g., "%2F") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.3 * @return string The URI path. */ public function getPath(); /** * Retrieve the query string of the URI. * * If no query string is present, this method MUST return an empty string. * * The leading "?" character is not part of the query and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.4. * * As an example, if a value in a key/value pair of the query string should * include an ampersand ("&") not intended as a delimiter between values, * that value MUST be passed in encoded form (e.g., "%26") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.4 * @return string The URI query string. */ public function getQuery(); /** * Retrieve the fragment component of the URI. * * If no fragment is present, this method MUST return an empty string. * * The leading "#" character is not part of the fragment and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.5. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.5 * @return string The URI fragment. */ public function getFragment(); /** * Return an instance with the specified scheme. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified scheme. * * Implementations MUST support the schemes "http" and "https" case * insensitively, and MAY accommodate other schemes if required. * * An empty scheme is equivalent to removing the scheme. * * @param string $scheme The scheme to use with the new instance. * @return static A new instance with the specified scheme. * @throws \InvalidArgumentException for invalid or unsupported schemes. */ public function withScheme($scheme); /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; an empty string for the user is equivalent to removing user * information. * * @param string $user The user name to use for authority. * @param null|string $password The password associated with $user. * @return static A new instance with the specified user information. */ public function withUserInfo($user, $password = null); /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * An empty host value is equivalent to removing the host. * * @param string $host The hostname to use with the new instance. * @return static A new instance with the specified host. * @throws \InvalidArgumentException for invalid hostnames. */ public function withHost($host); /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * Implementations MUST raise an exception for ports outside the * established TCP and UDP port ranges. * * A null value provided for the port is equivalent to removing the port * information. * * @param null|int $port The port to use with the new instance; a null value * removes the port information. * @return static A new instance with the specified port. * @throws \InvalidArgumentException for invalid ports. */ public function withPort($port); /** * Return an instance with the specified path. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified path. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * If the path is intended to be domain-relative rather than path relative then * it must begin with a slash ("/"). Paths not starting with a slash ("/") * are assumed to be relative to some base path known to the application or * consumer. * * Users can provide both encoded and decoded path characters. * Implementations ensure the correct encoding as outlined in getPath(). * * @param string $path The path to use with the new instance. * @return static A new instance with the specified path. * @throws \InvalidArgumentException for invalid paths. */ public function withPath($path); /** * Return an instance with the specified query string. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified query string. * * Users can provide both encoded and decoded query characters. * Implementations ensure the correct encoding as outlined in getQuery(). * * An empty query string value is equivalent to removing the query string. * * @param string $query The query string to use with the new instance. * @return static A new instance with the specified query string. * @throws \InvalidArgumentException for invalid query strings. */ public function withQuery($query); /** * Return an instance with the specified URI fragment. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified URI fragment. * * Users can provide both encoded and decoded fragment characters. * Implementations ensure the correct encoding as outlined in getFragment(). * * An empty fragment value is equivalent to removing the fragment. * * @param string $fragment The fragment to use with the new instance. * @return static A new instance with the specified fragment. */ public function withFragment($fragment); /** * Return the string representation as a URI reference. * * Depending on which components of the URI are present, the resulting * string is either a full URI or relative reference according to RFC 3986, * Section 4.1. The method concatenates the various components of the URI, * using the appropriate delimiters: * * - If a scheme is present, it MUST be suffixed by ":". * - If an authority is present, it MUST be prefixed by "//". * - The path can be concatenated without delimiters. But there are two * cases where the path has to be adjusted to make the URI reference * valid as PHP does not allow to throw an exception in __toString(): * - If the path is rootless and an authority is present, the path MUST * be prefixed by "/". * - If the path is starting with more than one "/" and no authority is * present, the starting slashes MUST be reduced to one. * - If a query is present, it MUST be prefixed by "?". * - If a fragment is present, it MUST be prefixed by "#". * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @return string */ public function __toString(); } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/autoload.php ================================================ accessKey = $accessKey; $this->secretKey = $secretKey; } public function getAccessKey() { return $this->accessKey; } public function sign($data) { $hmac = hash_hmac('sha1', $data, $this->secretKey, true); return $this->accessKey . ':' . \Qiniu\base64_urlSafeEncode($hmac); } public function signWithData($data) { $encodedData = \Qiniu\base64_urlSafeEncode($data); return $this->sign($encodedData) . ':' . $encodedData; } public function signRequest($urlString, $body, $contentType = null) { $url = parse_url($urlString); $data = ''; if (array_key_exists('path', $url)) { $data = $url['path']; } if (array_key_exists('query', $url)) { $data .= '?' . $url['query']; } $data .= "\n"; if ($body !== null && $contentType === 'application/x-www-form-urlencoded') { $data .= $body; } return $this->sign($data); } public function verifyCallback($contentType, $originAuthorization, $url, $body) { $authorization = 'QBox ' . $this->signRequest($url, $body, $contentType); return $originAuthorization === $authorization; } public function privateDownloadUrl($baseUrl, $expires = 3600) { $deadline = time() + $expires; $pos = strpos($baseUrl, '?'); if ($pos !== false) { $baseUrl .= '&e='; } else { $baseUrl .= '?e='; } $baseUrl .= $deadline; $token = $this->sign($baseUrl); return "$baseUrl&token=$token"; } public function uploadToken($bucket, $key = null, $expires = 3600, $policy = null, $strictPolicy = true) { $deadline = time() + $expires; $scope = $bucket; if ($key !== null) { $scope .= ':' . $key; } $args = self::copyPolicy($args, $policy, $strictPolicy); $args['scope'] = $scope; $args['deadline'] = $deadline; $b = json_encode($args); return $this->signWithData($b); } /** *上传策略,参数规格详见 *http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html */ private static $policyFields = array( 'callbackUrl', 'callbackBody', 'callbackHost', 'callbackBodyType', 'callbackFetchKey', 'returnUrl', 'returnBody', 'endUser', 'saveKey', 'insertOnly', 'detectMime', 'mimeLimit', 'fsizeMin', 'fsizeLimit', 'persistentOps', 'persistentNotifyUrl', 'persistentPipeline', 'deleteAfterDays', 'fileType', 'isPrefixalScope', ); private static function copyPolicy(&$policy, $originPolicy, $strictPolicy) { if ($originPolicy === null) { return array(); } foreach ($originPolicy as $key => $value) { if (!$strictPolicy || in_array((string)$key, self::$policyFields, true)) { $policy[$key] = $value; } } return $policy; } public function authorization($url, $body = null, $contentType = null) { $authorization = 'QBox ' . $this->signRequest($url, $body, $contentType); return array('Authorization' => $authorization); } public function authorizationV2($url, $method, $body = null, $contentType = null) { $urlItems = parse_url($url); $host = $urlItems['host']; if (isset($urlItems['port'])) { $port = $urlItems['port']; } else { $port = ''; } $path = $urlItems['path']; if (isset($urlItems['query'])) { $query = $urlItems['query']; } else { $query = ''; } //write request uri $toSignStr = $method . ' ' . $path; if (!empty($query)) { $toSignStr .= '?' . $query; } //write host and port $toSignStr .= "\nHost: " . $host; if (!empty($port)) { $toSignStr .= ":" . $port; } //write content type if (!empty($contentType)) { $toSignStr .= "\nContent-Type: " . $contentType; } $toSignStr .= "\n\n"; //write body if (!empty($body)) { $toSignStr .= $body; } $sign = $this->sign($toSignStr); $auth = 'Qiniu ' . $sign; return array('Authorization' => $auth); } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Cdn/CdnManager.php ================================================ auth = $auth; $this->server = 'http://fusion.qiniuapi.com'; } /** * @param array $urls 待刷新的文件链接数组 * @return array */ public function refreshUrls(array $urls) { return $this->refreshUrlsAndDirs($urls, array()); } /** * @param array $dirs 待刷新的文件链接数组 * @return array * 目前客户默认没有目录刷新权限,刷新会有400038报错,参考:https://developer.qiniu.com/fusion/api/1229/cache-refresh * 需要刷新目录请工单联系技术支持 https://support.qiniu.com/tickets/category */ public function refreshDirs(array $dirs) { return $this->refreshUrlsAndDirs(array(), $dirs); } /** * @param array $urls 待刷新的文件链接数组 * @param array $dirs 待刷新的目录链接数组 * * @return array 刷新的请求回复和错误,参考 examples/cdn_manager.php 代码 * @link http://developer.qiniu.com/article/fusion/api/refresh.html * * 目前客户默认没有目录刷新权限,刷新会有400038报错,参考:https://developer.qiniu.com/fusion/api/1229/cache-refresh * 需要刷新目录请工单联系技术支持 https://support.qiniu.com/tickets/category */ public function refreshUrlsAndDirs(array $urls, array $dirs) { $req = array(); if (!empty($urls)) { $req['urls'] = $urls; } if (!empty($dirs)) { $req['dirs'] = $dirs; } $url = $this->server . '/v2/tune/refresh'; $body = json_encode($req); return $this->post($url, $body); } /** * @param array $urls 待预取的文件链接数组 * * @return array 预取的请求回复和错误,参考 examples/cdn_manager.php 代码 * * @link http://developer.qiniu.com/article/fusion/api/refresh.html */ public function prefetchUrls(array $urls) { $req = array( 'urls' => $urls, ); $url = $this->server . '/v2/tune/prefetch'; $body = json_encode($req); return $this->post($url, $body); } /** * @param array $domains 待获取带宽数据的域名数组 * @param string $startDate 开始的日期,格式类似 2017-01-01 * @param string $endDate 结束的日期,格式类似 2017-01-01 * @param string $granularity 获取数据的时间间隔,可以是 5min, hour 或者 day * * @return array 带宽数据和错误信息,参考 examples/cdn_manager.php 代码 * * @link http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html */ public function getBandwidthData(array $domains, $startDate, $endDate, $granularity) { $req = array(); $req['domains'] = implode(';', $domains); $req['startDate'] = $startDate; $req['endDate'] = $endDate; $req['granularity'] = $granularity; $url = $this->server . '/v2/tune/bandwidth'; $body = json_encode($req); return $this->post($url, $body); } /** * @param array $domains 待获取流量数据的域名数组 * @param string $startDate 开始的日期,格式类似 2017-01-01 * @param string $endDate 结束的日期,格式类似 2017-01-01 * @param string $granularity 获取数据的时间间隔,可以是 5min, hour 或者 day * * @return array 流量数据和错误信息,参考 examples/cdn_manager.php 代码 * * @link http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html */ public function getFluxData(array $domains, $startDate, $endDate, $granularity) { $req = array(); $req['domains'] = implode(';', $domains); $req['startDate'] = $startDate; $req['endDate'] = $endDate; $req['granularity'] = $granularity; $url = $this->server . '/v2/tune/flux'; $body = json_encode($req); return $this->post($url, $body); } /** * @param array $domains 待获取日志下载链接的域名数组 * @param string $logDate 获取指定日期的日志下载链接,格式类似 2017-01-01 * * @return array 日志下载链接数据和错误信息,参考 examples/cdn_manager.php 代码 * * @link http://developer.qiniu.com/article/fusion/api/log.html */ public function getCdnLogList(array $domains, $logDate) { $req = array(); $req['domains'] = implode(';', $domains); $req['day'] = $logDate; $url = $this->server . '/v2/tune/log/list'; $body = json_encode($req); return $this->post($url, $body); } private function post($url, $body) { $headers = $this->auth->authorization($url, $body, 'application/json'); $headers['Content-Type'] = 'application/json'; $ret = Client::post($url, $body, $headers); if (!$ret->ok()) { return array(null, new Error($url, $ret)); } $r = ($ret->body === null) ? array() : $ret->json(); return array($r, null); } /** * 构建时间戳防盗链鉴权的访问外链 * * @param string $rawUrl 需要签名的资源url * @param string $encryptKey 时间戳防盗链密钥 * @param string $durationInSeconds 链接的有效期(以秒为单位) * * @return string 带鉴权信息的资源外链,参考 examples/cdn_timestamp_antileech.php 代码 */ public static function createTimestampAntiLeechUrl($rawUrl, $encryptKey, $durationInSeconds) { $parsedUrl = parse_url($rawUrl); $deadline = time() + $durationInSeconds; $expireHex = dechex($deadline); $path = isset($parsedUrl['path']) ? $parsedUrl['path'] : ''; $strToSign = $encryptKey . $path . $expireHex; $signStr = md5($strToSign); if (isset($parsedUrl['query'])) { $signedUrl = $rawUrl . '&sign=' . $signStr . '&t=' . $expireHex; } else { $signedUrl = $rawUrl . '?sign=' . $signStr . '&t=' . $expireHex; } return $signedUrl; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Config.php ================================================ zone = $z; $this->useHTTPS = false; $this->useCdnDomains = false; $this->zoneCache = array(); } public function getUpHost($accessKey, $bucket) { $zone = $this->getZone($accessKey, $bucket); if ($this->useHTTPS === true) { $scheme = "https://"; } else { $scheme = "http://"; } $host = $zone->srcUpHosts[0]; if ($this->useCdnDomains === true) { $host = $zone->cdnUpHosts[0]; } return $scheme . $host; } public function getUpBackupHost($accessKey, $bucket) { $zone = $this->getZone($accessKey, $bucket); if ($this->useHTTPS === true) { $scheme = "https://"; } else { $scheme = "http://"; } $host = $zone->cdnUpHosts[0]; if ($this->useCdnDomains === true) { $host = $zone->srcUpHosts[0]; } return $scheme . $host; } public function getRsHost($accessKey, $bucket) { $zone = $this->getZone($accessKey, $bucket); if ($this->useHTTPS === true) { $scheme = "https://"; } else { $scheme = "http://"; } return $scheme . $zone->rsHost; } public function getRsfHost($accessKey, $bucket) { $zone = $this->getZone($accessKey, $bucket); if ($this->useHTTPS === true) { $scheme = "https://"; } else { $scheme = "http://"; } return $scheme . $zone->rsfHost; } public function getIovipHost($accessKey, $bucket) { $zone = $this->getZone($accessKey, $bucket); if ($this->useHTTPS === true) { $scheme = "https://"; } else { $scheme = "http://"; } return $scheme . $zone->iovipHost; } public function getApiHost($accessKey, $bucket) { $zone = $this->getZone($accessKey, $bucket); if ($this->useHTTPS === true) { $scheme = "https://"; } else { $scheme = "http://"; } return $scheme . $zone->apiHost; } private function getZone($accessKey, $bucket) { $cacheId = "$accessKey:$bucket"; if (isset($this->zoneCache[$cacheId])) { $zone = $this->zoneCache[$cacheId]; } elseif (isset($this->zone)) { $zone = $this->zone; $this->zoneCache[$cacheId] = $zone; } else { $zone = Zone::queryZone($accessKey, $bucket); $this->zoneCache[$cacheId] = $zone; } return $zone; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Etag.php ================================================ $val) { array_push($data, '--' . $mimeBoundary); array_push($data, "Content-Disposition: form-data; name=\"$key\""); array_push($data, ''); array_push($data, $val); } array_push($data, '--' . $mimeBoundary); $finalMimeType = empty($mimeType) ? 'application/octet-stream' : $mimeType; $finalFileName = self::escapeQuotes($fileName); array_push($data, "Content-Disposition: form-data; name=\"$name\"; filename=\"$finalFileName\""); array_push($data, "Content-Type: $finalMimeType"); array_push($data, ''); array_push($data, $fileBody); array_push($data, '--' . $mimeBoundary . '--'); array_push($data, ''); $body = implode("\r\n", $data); $contentType = 'multipart/form-data; boundary=' . $mimeBoundary; $headers['Content-Type'] = $contentType; $request = new Request('POST', $url, $headers, $body); return self::sendRequest($request); } private static function userAgent() { $sdkInfo = "QiniuPHP/" . Config::SDK_VER; $systemInfo = php_uname("s"); $machineInfo = php_uname("m"); $envInfo = "($systemInfo/$machineInfo)"; $phpVer = phpversion(); $ua = "$sdkInfo $envInfo PHP/$phpVer"; return $ua; } public static function sendRequest($request) { $t1 = microtime(true); $ch = curl_init(); $options = array( CURLOPT_USERAGENT => self::userAgent(), CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HEADER => true, CURLOPT_NOBODY => false, CURLOPT_CUSTOMREQUEST => $request->method, CURLOPT_URL => $request->url, ); // Handle open_basedir & safe mode if (!ini_get('safe_mode') && !ini_get('open_basedir')) { $options[CURLOPT_FOLLOWLOCATION] = true; } if (!empty($request->headers)) { $headers = array(); foreach ($request->headers as $key => $val) { array_push($headers, "$key: $val"); } $options[CURLOPT_HTTPHEADER] = $headers; } curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); if (!empty($request->body)) { $options[CURLOPT_POSTFIELDS] = $request->body; } curl_setopt_array($ch, $options); $result = curl_exec($ch); $t2 = microtime(true); $duration = round($t2 - $t1, 3); $ret = curl_errno($ch); if ($ret !== 0) { $r = new Response(-1, $duration, array(), null, curl_error($ch)); curl_close($ch); return $r; } $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $headers = self::parseHeaders(substr($result, 0, $header_size)); $body = substr($result, $header_size); curl_close($ch); return new Response($code, $duration, $headers, $body, null); } private static function parseHeaders($raw) { $headers = array(); $headerLines = explode("\r\n", $raw); foreach ($headerLines as $line) { $headerLine = trim($line); $kv = explode(':', $headerLine); if (count($kv) > 1) { $kv[0] = ucwords($kv[0], '-'); $headers[$kv[0]] = trim($kv[1]); } } return $headers; } private static function escapeQuotes($str) { $find = array("\\", "\""); $replace = array("\\\\", "\\\""); return str_replace($find, $replace, $str); } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Http/Error.php ================================================ * {"error" : "detailed error message"} * */ final class Error { private $url; private $response; public function __construct($url, $response) { $this->url = $url; $this->response = $response; } public function code() { return $this->response->statusCode; } public function getResponse() { return $this->response; } public function message() { return $this->response->error; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Http/Request.php ================================================ method = strtoupper($method); $this->url = $url; $this->headers = $headers; $this->body = $body; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Http/Response.php ================================================ 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-Status', 208 => 'Already Reported', 226 => 'IM Used', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 308 => 'Permanent Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Reserved for WebDAV advanced collections expired proposal', 426 => 'Upgrade required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 506 => 'Variant Also Negotiates (Experimental)', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 510 => 'Not Extended', 511 => 'Network Authentication Required', ); /** * @param int $code 状态码 * @param double $duration 请求时长 * @param array $headers 响应头部 * @param string $body 响应内容 * @param string $error 错误描述 */ public function __construct($code, $duration, array $headers = array(), $body = null, $error = null) { $this->statusCode = $code; $this->duration = $duration; $this->headers = $headers; $this->body = $body; $this->error = $error; $this->jsonData = null; if ($error !== null) { return; } if ($body === null) { if ($code >= 400) { $this->error = self::$statusTexts[$code]; } return; } if (self::isJson($headers)) { try { $jsonData = self::bodyJson($body); if ($code >= 400) { $this->error = $body; if ($jsonData['error'] !== null) { $this->error = $jsonData['error']; } } $this->jsonData = $jsonData; } catch (\InvalidArgumentException $e) { $this->error = $body; if ($code >= 200 && $code < 300) { $this->error = $e->getMessage(); } } } elseif ($code >= 400) { $this->error = $body; } return; } public function json() { return $this->jsonData; } private static function bodyJson($body) { return \Qiniu\json_decode((string) $body, true, 512); } public function xVia() { $via = $this->headers['X-Via']; if ($via === null) { $via = $this->headers['X-Px']; } if ($via === null) { $via = $this->headers['Fw-Via']; } return $via; } public function xLog() { return $this->headers['X-Log']; } public function xReqId() { return $this->headers['X-Reqid']; } public function ok() { return $this->statusCode >= 200 && $this->statusCode < 300 && $this->error === null; } public function needRetry() { $code = $this->statusCode; if ($code < 0 || ($code / 100 === 5 and $code !== 579) || $code === 996) { return true; } } private static function isJson($headers) { return array_key_exists('Content-Type', $headers) && strpos($headers['Content-Type'], 'application/json') === 0; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Processing/ImageUrlBuilder.php ================================================ */ public function thumbnail( $url, $mode, $width, $height, $format = null, $interlace = null, $quality = null, $ignoreError = 1 ) { // url合法效验 if (!$this->isUrl($url)) { return $url; } // 参数合法性效验 if (!in_array(intval($mode), $this->modeArr, true)) { return $url; } if (!$width || !$height) { return $url; } $thumbStr = 'imageView2/' . $mode . '/w/' . $width . '/h/' . $height . '/'; // 拼接输出格式 if (!is_null($format) && in_array($format, $this->formatArr) ) { $thumbStr .= 'format/' . $format . '/'; } // 拼接渐进显示 if (!is_null($interlace) && in_array(intval($interlace), array(0, 1), true) ) { $thumbStr .= 'interlace/' . $interlace . '/'; } // 拼接图片质量 if (!is_null($quality) && intval($quality) >= 0 && intval($quality) <= 100 ) { $thumbStr .= 'q/' . $quality . '/'; } $thumbStr .= 'ignore-error/' . $ignoreError . '/'; // 如果有query_string用|线分割实现多参数 return $url . ($this->hasQuery($url) ? '|' : '?') . $thumbStr; } /** * 图片水印 * * @param string $url 图片链接 * @param string $image 水印图片链接 * @param numeric $dissolve 透明度 * @param string $gravity 水印位置 * @param numeric $dx 横轴边距 * @param numeric $dy 纵轴边距 * @param numeric $watermarkScale 自适应原图的短边比例 * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html * @return string * @author Sherlock Ren */ public function waterImg( $url, $image, $dissolve = 100, $gravity = 'SouthEast', $dx = null, $dy = null, $watermarkScale = null ) { // url合法效验 if (!$this->isUrl($url)) { return $url; } $waterStr = 'watermark/1/image/' . \Qiniu\base64_urlSafeEncode($image) . '/'; // 拼接水印透明度 if (is_numeric($dissolve) && $dissolve <= 100 ) { $waterStr .= 'dissolve/' . $dissolve . '/'; } // 拼接水印位置 if (in_array($gravity, $this->gravityArr, true)) { $waterStr .= 'gravity/' . $gravity . '/'; } // 拼接横轴边距 if (!is_null($dx) && is_numeric($dx) ) { $waterStr .= 'dx/' . $dx . '/'; } // 拼接纵轴边距 if (!is_null($dy) && is_numeric($dy) ) { $waterStr .= 'dy/' . $dy . '/'; } // 拼接自适应原图的短边比例 if (!is_null($watermarkScale) && is_numeric($watermarkScale) && $watermarkScale > 0 && $watermarkScale < 1 ) { $waterStr .= 'ws/' . $watermarkScale . '/'; } // 如果有query_string用|线分割实现多参数 return $url . ($this->hasQuery($url) ? '|' : '?') . $waterStr; } /** * 文字水印 * * @param string $url 图片链接 * @param string $text 文字 * @param string $font 文字字体 * @param string $fontSize 文字字号 * @param string $fontColor 文字颜色 * @param numeric $dissolve 透明度 * @param string $gravity 水印位置 * @param numeric $dx 横轴边距 * @param numeric $dy 纵轴边距 * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html#text-watermark * @return string * @author Sherlock Ren */ public function waterText( $url, $text, $font = '黑体', $fontSize = 0, $fontColor = null, $dissolve = 100, $gravity = 'SouthEast', $dx = null, $dy = null ) { // url合法效验 if (!$this->isUrl($url)) { return $url; } $waterStr = 'watermark/2/text/' . \Qiniu\base64_urlSafeEncode($text) . '/font/' . \Qiniu\base64_urlSafeEncode($font) . '/'; // 拼接文字大小 if (is_int($fontSize)) { $waterStr .= 'fontsize/' . $fontSize . '/'; } // 拼接文字颜色 if (!is_null($fontColor) && $fontColor ) { $waterStr .= 'fill/' . \Qiniu\base64_urlSafeEncode($fontColor) . '/'; } // 拼接水印透明度 if (is_numeric($dissolve) && $dissolve <= 100 ) { $waterStr .= 'dissolve/' . $dissolve . '/'; } // 拼接水印位置 if (in_array($gravity, $this->gravityArr, true)) { $waterStr .= 'gravity/' . $gravity . '/'; } // 拼接横轴边距 if (!is_null($dx) && is_numeric($dx) ) { $waterStr .= 'dx/' . $dx . '/'; } // 拼接纵轴边距 if (!is_null($dy) && is_numeric($dy) ) { $waterStr .= 'dy/' . $dy . '/'; } // 如果有query_string用|线分割实现多参数 return $url . ($this->hasQuery($url) ? '|' : '?') . $waterStr; } /** * 效验url合法性 * * @param string $url url链接 * @return string * @author Sherlock Ren */ protected function isUrl($url) { $urlArr = parse_url($url); return $urlArr['scheme'] && in_array($urlArr['scheme'], array('http', 'https')) && $urlArr['host'] && $urlArr['path']; } /** * 检测是否有query * * @param string $url url链接 * @return string * @author Sherlock Ren */ protected function hasQuery($url) { $urlArr = parse_url($url); return !empty($urlArr['query']); } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Processing/Operation.php ================================================ auth = $auth; $this->domain = $domain; $this->token_expire = $token_expire; } /** * 对资源文件进行处理 * * @param $key 待处理的资源文件名 * @param $fops string|array fop操作,多次fop操作以array的形式传入。 * eg. imageView2/1/w/200/h/200, imageMogr2/thumbnail/!75px * * @return array 文件处理后的结果及错误。 * * @link http://developer.qiniu.com/docs/v6/api/reference/fop/ */ public function execute($key, $fops) { $url = $this->buildUrl($key, $fops); $resp = Client::get($url); if (!$resp->ok()) { return array(null, new Error($url, $resp)); } if ($resp->json() !== null) { return array($resp->json(), null); } return array($resp->body, null); } public function buildUrl($key, $fops, $protocol = 'http') { if (is_array($fops)) { $fops = implode('|', $fops); } $url = $protocol . "://$this->domain/$key?$fops"; if ($this->auth !== null) { $url = $this->auth->privateDownloadUrl($url, $this->token_expire); } return $url; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Processing/PersistentFop.php ================================================ auth = $auth; if ($config == null) { $this->config = new Config(); } else { $this->config = $config; } } /** * 对资源文件进行异步持久化处理 * @param $bucket 资源所在空间 * @param $key 待处理的源文件 * @param $fops string|array 待处理的pfop操作,多个pfop操作以array的形式传入。 * eg. avthumb/mp3/ab/192k, vframe/jpg/offset/7/w/480/h/360 * @param $pipeline 资源处理队列 * @param $notify_url 处理结果通知地址 * @param $force 是否强制执行一次新的指令 * * * @return array 返回持久化处理的persistentId, 和返回的错误。 * * @link http://developer.qiniu.com/docs/v6/api/reference/fop/ */ public function execute($bucket, $key, $fops, $pipeline = null, $notify_url = null, $force = false) { if (is_array($fops)) { $fops = implode(';', $fops); } $params = array('bucket' => $bucket, 'key' => $key, 'fops' => $fops); \Qiniu\setWithoutEmpty($params, 'pipeline', $pipeline); \Qiniu\setWithoutEmpty($params, 'notifyURL', $notify_url); if ($force) { $params['force'] = 1; } $data = http_build_query($params); $scheme = "http://"; if ($this->config->useHTTPS === true) { $scheme = "https://"; } $url = $scheme . Config::API_HOST . '/pfop/'; $headers = $this->auth->authorization($url, $data, 'application/x-www-form-urlencoded'); $headers['Content-Type'] = 'application/x-www-form-urlencoded'; $response = Client::post($url, $data, $headers); if (!$response->ok()) { return array(null, new Error($url, $response)); } $r = $response->json(); $id = $r['persistentId']; return array($id, null); } public function status($id) { $scheme = "http://"; if ($this->config->useHTTPS === true) { $scheme = "https://"; } $url = $scheme . Config::API_HOST . "/status/get/prefop?id=$id"; $response = Client::get($url); if (!$response->ok()) { return array(null, new Error($url, $response)); } return array($response->json(), null); } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Storage/BucketManager.php ================================================ auth = $auth; if ($config == null) { $this->config = new Config(); } else { $this->config = $config; } } /** * 获取指定账号下所有的空间名。 * * @return string[] 包含所有空间名 */ public function buckets($shared = true) { $includeShared = "false"; if ($shared === true) { $includeShared = "true"; } return $this->rsGet('/buckets?shared=' . $includeShared); } /** * 获取指定空间绑定的所有的域名 * * @return string[] 包含所有空间域名 */ public function domains($bucket) { return $this->apiGet('/v6/domain/list?tbl=' . $bucket); } /** * 获取空间绑定的域名列表 * @return string[] 包含空间绑定的所有域名 */ /** * 列取空间的文件列表 * * @param $bucket 空间名 * @param $prefix 列举前缀 * @param $marker 列举标识符 * @param $limit 单次列举个数限制 * @param $delimiter 指定目录分隔符 * * @return array 包含文件信息的数组,类似:[ * { * "hash" => "", * "key" => "", * "fsize" => "", * "putTime" => "" * }, * ... * ] * @link http://developer.qiniu.com/docs/v6/api/reference/rs/list.html */ public function listFiles($bucket, $prefix = null, $marker = null, $limit = 1000, $delimiter = null) { $query = array('bucket' => $bucket); \Qiniu\setWithoutEmpty($query, 'prefix', $prefix); \Qiniu\setWithoutEmpty($query, 'marker', $marker); \Qiniu\setWithoutEmpty($query, 'limit', $limit); \Qiniu\setWithoutEmpty($query, 'delimiter', $delimiter); $url = $this->getRsfHost() . '/list?' . http_build_query($query); return $this->get($url); } /** * 获取资源的元信息,但不返回文件内容 * * @param $bucket 待获取信息资源所在的空间 * @param $key 待获取资源的文件名 * * @return array 包含文件信息的数组,类似: * [ * "hash" => "", * "key" => "", * "fsize" => , * "putTime" => "" * "fileType" => * ] * * @link http://developer.qiniu.com/docs/v6/api/reference/rs/stat.html */ public function stat($bucket, $key) { $path = '/stat/' . \Qiniu\entry($bucket, $key); return $this->rsGet($path); } /** * 删除指定资源 * * @param $bucket 待删除资源所在的空间 * @param $key 待删除资源的文件名 * * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error * @link http://developer.qiniu.com/docs/v6/api/reference/rs/delete.html */ public function delete($bucket, $key) { $path = '/delete/' . \Qiniu\entry($bucket, $key); list(, $error) = $this->rsPost($path); return $error; } /** * 给资源进行重命名,本质为move操作。 * * @param $bucket 待操作资源所在空间 * @param $oldname 待操作资源文件名 * @param $newname 目标资源文件名 * * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error */ public function rename($bucket, $oldname, $newname) { return $this->move($bucket, $oldname, $bucket, $newname); } /** * 给资源进行重命名,本质为move操作。 * * @param $from_bucket 待操作资源所在空间 * @param $from_key 待操作资源文件名 * @param $to_bucket 目标资源空间名 * @param $to_key 目标资源文件名 * * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error * @link http://developer.qiniu.com/docs/v6/api/reference/rs/copy.html */ public function copy($from_bucket, $from_key, $to_bucket, $to_key, $force = false) { $from = \Qiniu\entry($from_bucket, $from_key); $to = \Qiniu\entry($to_bucket, $to_key); $path = '/copy/' . $from . '/' . $to; if ($force === true) { $path .= '/force/true'; } list(, $error) = $this->rsPost($path); return $error; } /** * 将资源从一个空间到另一个空间 * * @param $from_bucket 待操作资源所在空间 * @param $from_key 待操作资源文件名 * @param $to_bucket 目标资源空间名 * @param $to_key 目标资源文件名 * * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error * @link http://developer.qiniu.com/docs/v6/api/reference/rs/move.html */ public function move($from_bucket, $from_key, $to_bucket, $to_key, $force = false) { $from = \Qiniu\entry($from_bucket, $from_key); $to = \Qiniu\entry($to_bucket, $to_key); $path = '/move/' . $from . '/' . $to; if ($force) { $path .= '/force/true'; } list(, $error) = $this->rsPost($path); return $error; } /** * 主动修改指定资源的文件类型 * * @param $bucket 待操作资源所在空间 * @param $key 待操作资源文件名 * @param $mime 待操作文件目标mimeType * * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error * @link http://developer.qiniu.com/docs/v6/api/reference/rs/chgm.html */ public function changeMime($bucket, $key, $mime) { $resource = \Qiniu\entry($bucket, $key); $encode_mime = \Qiniu\base64_urlSafeEncode($mime); $path = '/chgm/' . $resource . '/mime/' . $encode_mime; list(, $error) = $this->rsPost($path); return $error; } /** * 修改指定资源的存储类型 * * @param $bucket 待操作资源所在空间 * @param $key 待操作资源文件名 * @param $fileType 待操作文件目标文件类型 * * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error * @link https://developer.qiniu.com/kodo/api/3710/modify-the-file-type */ public function changeType($bucket, $key, $fileType) { $resource = \Qiniu\entry($bucket, $key); $path = '/chtype/' . $resource . '/type/' . $fileType; list(, $error) = $this->rsPost($path); return $error; } /** * 从指定URL抓取资源,并将该资源存储到指定空间中 * * @param $url 指定的URL * @param $bucket 目标资源空间 * @param $key 目标资源文件名 * * @return array 包含已拉取的文件信息。 * 成功时: [ * [ * "hash" => "", * "key" => "" * ], * null * ] * * 失败时: [ * null, * Qiniu/Http/Error * ] * @link http://developer.qiniu.com/docs/v6/api/reference/rs/fetch.html */ public function fetch($url, $bucket, $key = null) { $resource = \Qiniu\base64_urlSafeEncode($url); $to = \Qiniu\entry($bucket, $key); $path = '/fetch/' . $resource . '/to/' . $to; $ak = $this->auth->getAccessKey(); $ioHost = $this->config->getIovipHost($ak, $bucket); $url = $ioHost . $path; return $this->post($url, null); } /** * 从镜像源站抓取资源到空间中,如果空间中已经存在,则覆盖该资源 * * @param $bucket 待获取资源所在的空间 * @param $key 代获取资源文件名 * * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error * @link http://developer.qiniu.com/docs/v6/api/reference/rs/prefetch.html */ public function prefetch($bucket, $key) { $resource = \Qiniu\entry($bucket, $key); $path = '/prefetch/' . $resource; $ak = $this->auth->getAccessKey(); $ioHost = $this->config->getIovipHost($ak, $bucket); $url = $ioHost . $path; list(, $error) = $this->post($url, null); return $error; } /** * 在单次请求中进行多个资源管理操作 * * @param $operations 资源管理操作数组 * * @return array 每个资源的处理情况,结果类似: * [ * { "code" => , "data" => }, * { "code" => }, * { "code" => }, * { "code" => }, * { "code" => , "data" => { "error": "" } }, * ... * ] * @link http://developer.qiniu.com/docs/v6/api/reference/rs/batch.html */ public function batch($operations) { $params = 'op=' . implode('&op=', $operations); return $this->rsPost('/batch', $params); } /** * 设置文件的生命周期 * * @param $bucket 设置文件生命周期文件所在的空间 * @param $key 设置文件生命周期文件的文件名 * @param $days 设置该文件多少天后删除,当$days设置为0时表示取消该文件的生命周期 * * @return Mixed * @link https://developer.qiniu.com/kodo/api/update-file-lifecycle */ public function deleteAfterDays($bucket, $key, $days) { $entry = \Qiniu\entry($bucket, $key); $path = "/deleteAfterDays/$entry/$days"; list(, $error) = $this->rsPost($path); return $error; } private function getRsfHost() { $scheme = "http://"; if ($this->config->useHTTPS == true) { $scheme = "https://"; } return $scheme . Config::RSF_HOST; } private function getRsHost() { $scheme = "http://"; if ($this->config->useHTTPS == true) { $scheme = "https://"; } return $scheme . Config::RS_HOST; } private function getApiHost() { $scheme = "http://"; if ($this->config->useHTTPS == true) { $scheme = "https://"; } return $scheme . Config::API_HOST; } private function rsPost($path, $body = null) { $url = $this->getRsHost() . $path; return $this->post($url, $body); } private function apiGet($path) { $url = $this->getApiHost() . $path; return $this->get($url); } private function rsGet($path) { $url = $this->getRsHost() . $path; return $this->get($url); } private function get($url) { $headers = $this->auth->authorization($url); $ret = Client::get($url, $headers); if (!$ret->ok()) { return array(null, new Error($url, $ret)); } return array($ret->json(), null); } private function post($url, $body) { $headers = $this->auth->authorization($url, $body, 'application/x-www-form-urlencoded'); $ret = Client::post($url, $body, $headers); if (!$ret->ok()) { return array(null, new Error($url, $ret)); } $r = ($ret->body === null) ? array() : $ret->json(); return array($r, null); } public static function buildBatchCopy($source_bucket, $key_pairs, $target_bucket, $force) { return self::twoKeyBatch('/copy', $source_bucket, $key_pairs, $target_bucket, $force); } public static function buildBatchRename($bucket, $key_pairs, $force) { return self::buildBatchMove($bucket, $key_pairs, $bucket, $force); } public static function buildBatchMove($source_bucket, $key_pairs, $target_bucket, $force) { return self::twoKeyBatch('/move', $source_bucket, $key_pairs, $target_bucket, $force); } public static function buildBatchDelete($bucket, $keys) { return self::oneKeyBatch('/delete', $bucket, $keys); } public static function buildBatchStat($bucket, $keys) { return self::oneKeyBatch('/stat', $bucket, $keys); } public static function buildBatchDeleteAfterDays($bucket, $key_day_pairs) { $data = array(); foreach ($key_day_pairs as $key => $day) { array_push($data, '/deleteAfterDays/' . \Qiniu\entry($bucket, $key) . '/' . $day); } return $data; } public static function buildBatchChangeMime($bucket, $key_mime_pairs) { $data = array(); foreach ($key_mime_pairs as $key => $mime) { array_push($data, '/chgm/' . \Qiniu\entry($bucket, $key) . '/mime/' . base64_encode($mime)); } return $data; } public static function buildBatchChangeType($bucket, $key_type_pairs) { $data = array(); foreach ($key_type_pairs as $key => $type) { array_push($data, '/chtype/' . \Qiniu\entry($bucket, $key) . '/type/' . $type); } return $data; } private static function oneKeyBatch($operation, $bucket, $keys) { $data = array(); foreach ($keys as $key) { array_push($data, $operation . '/' . \Qiniu\entry($bucket, $key)); } return $data; } private static function twoKeyBatch($operation, $source_bucket, $key_pairs, $target_bucket, $force) { if ($target_bucket === null) { $target_bucket = $source_bucket; } $data = array(); $forceOp = "false"; if ($force) { $forceOp = "true"; } foreach ($key_pairs as $from_key => $to_key) { $from = \Qiniu\entry($source_bucket, $from_key); $to = \Qiniu\entry($target_bucket, $to_key); array_push($data, $operation . '/' . $from . '/' . $to . "/force/" . $forceOp); } return $data; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Storage/FormUploader.php ================================================ "", * "key" => "" * ] */ public static function put( $upToken, $key, $data, $config, $params, $mime, $fname ) { $fields = array('token' => $upToken); if ($key === null) { $fname='nullkey'; } else { $fields['key'] = $key; } //enable crc32 check by default $fields['crc32'] = \Qiniu\crc32_data($data); if ($params) { foreach ($params as $k => $v) { $fields[$k] = $v; } } list($accessKey, $bucket, $err) = \Qiniu\explodeUpToken($upToken); if ($err != null) { return array(null, $err); } $upHost = $config->getUpHost($accessKey, $bucket); $response = Client::multipartPost($upHost, $fields, 'file', $fname, $data, $mime); if (!$response->ok()) { return array(null, new Error($upHost, $response)); } return array($response->json(), null); } /** * 上传文件到七牛,内部使用 * * @param $upToken 上传凭证 * @param $key 上传文件名 * @param $filePath 上传文件的路径 * @param $config 上传配置 * @param $params 自定义变量,规格参考 * http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar * @param $mime 上传数据的mimeType * * @return array 包含已上传文件的信息,类似: * [ * "hash" => "", * "key" => "" * ] */ public static function putFile( $upToken, $key, $filePath, $config, $params, $mime ) { $fields = array('token' => $upToken, 'file' => self::createFile($filePath, $mime)); if ($key !== null) { $fields['key'] = $key; } $fields['crc32'] = \Qiniu\crc32_file($filePath); if ($params) { foreach ($params as $k => $v) { $fields[$k] = $v; } } $fields['key'] = $key; $headers = array('Content-Type' => 'multipart/form-data'); list($accessKey, $bucket, $err) = \Qiniu\explodeUpToken($upToken); if ($err != null) { return array(null, $err); } $upHost = $config->getUpHost($accessKey, $bucket); $response = Client::post($upHost, $fields, $headers); if (!$response->ok()) { return array(null, new Error($upHost, $response)); } return array($response->json(), null); } private static function createFile($filename, $mime) { // PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax // See: https://wiki.php.net/rfc/curl-file-upload if (function_exists('curl_file_create')) { return curl_file_create($filename, $mime); } // Use the old style if using an older version of PHP $value = "@{$filename}"; if (!empty($mime)) { $value .= ';type=' . $mime; } return $value; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Storage/ResumeUploader.php ================================================ upToken = $upToken; $this->key = $key; $this->inputStream = $inputStream; $this->size = $size; $this->params = $params; $this->mime = $mime; $this->contexts = array(); $this->config = $config; list($accessKey, $bucket, $err) = \Qiniu\explodeUpToken($upToken); if ($err != null) { return array(null, $err); } $upHost = $config->getUpHost($accessKey, $bucket); if ($err != null) { throw new \Exception($err->message(), 1); } $this->host = $upHost; } /** * 上传操作 */ public function upload($fname) { $uploaded = 0; while ($uploaded < $this->size) { $blockSize = $this->blockSize($uploaded); $data = fread($this->inputStream, $blockSize); if ($data === false) { throw new \Exception("file read failed", 1); } $crc = \Qiniu\crc32_data($data); $response = $this->makeBlock($data, $blockSize); $ret = null; if ($response->ok() && $response->json() != null) { $ret = $response->json(); } if ($response->statusCode < 0) { list($accessKey, $bucket, $err) = \Qiniu\explodeUpToken($this->upToken); if ($err != null) { return array(null, $err); } $upHostBackup = $this->config->getUpBackupHost($accessKey, $bucket); $this->host = $upHostBackup; } if ($response->needRetry() || !isset($ret['crc32']) || $crc != $ret['crc32']) { $response = $this->makeBlock($data, $blockSize); $ret = $response->json(); } if (!$response->ok() || !isset($ret['crc32']) || $crc != $ret['crc32']) { return array(null, new Error($this->currentUrl, $response)); } array_push($this->contexts, $ret['ctx']); $uploaded += $blockSize; } return $this->makeFile($fname); } /** * 创建块 */ private function makeBlock($block, $blockSize) { $url = $this->host . '/mkblk/' . $blockSize; return $this->post($url, $block); } private function fileUrl($fname) { $url = $this->host . '/mkfile/' . $this->size; $url .= '/mimeType/' . \Qiniu\base64_urlSafeEncode($this->mime); if ($this->key != null) { $url .= '/key/' . \Qiniu\base64_urlSafeEncode($this->key); } $url .= '/fname/' . \Qiniu\base64_urlSafeEncode($fname); if (!empty($this->params)) { foreach ($this->params as $key => $value) { $val = \Qiniu\base64_urlSafeEncode($value); $url .= "/$key/$val"; } } return $url; } /** * 创建文件 */ private function makeFile($fname) { $url = $this->fileUrl($fname); $body = implode(',', $this->contexts); $response = $this->post($url, $body); if ($response->needRetry()) { $response = $this->post($url, $body); } if (!$response->ok()) { return array(null, new Error($this->currentUrl, $response)); } return array($response->json(), null); } private function post($url, $data) { $this->currentUrl = $url; $headers = array('Authorization' => 'UpToken ' . $this->upToken); return Client::post($url, $data, $headers); } private function blockSize($uploaded) { if ($this->size < $uploaded + Config::BLOCK_SIZE) { return $this->size - $uploaded; } return Config::BLOCK_SIZE; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Storage/UploadManager.php ================================================ config = $config; } /** * 上传二进制流到七牛 * * @param $upToken 上传凭证 * @param $key 上传文件名 * @param $data 上传二进制流 * @param $params 自定义变量,规格参考 * http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar * @param $mime 上传数据的mimeType * @param $checkCrc 是否校验crc32 * * @return array 包含已上传文件的信息,类似: * [ * "hash" => "", * "key" => "" * ] */ public function put( $upToken, $key, $data, $params = null, $mime = 'application/octet-stream', $fname = null ) { $params = self::trimParams($params); return FormUploader::put( $upToken, $key, $data, $this->config, $params, $mime, $fname ); } /** * 上传文件到七牛 * * @param $upToken 上传凭证 * @param $key 上传文件名 * @param $filePath 上传文件的路径 * @param $params 自定义变量,规格参考 * http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar * @param $mime 上传数据的mimeType * @param $checkCrc 是否校验crc32 * * @return array 包含已上传文件的信息,类似: * [ * "hash" => "", * "key" => "" * ] */ public function putFile( $upToken, $key, $filePath, $params = null, $mime = 'application/octet-stream', $checkCrc = false ) { $file = fopen($filePath, 'rb'); if ($file === false) { throw new \Exception("file can not open", 1); } $params = self::trimParams($params); $stat = fstat($file); $size = $stat['size']; if ($size <= Config::BLOCK_SIZE) { $data = fread($file, $size); fclose($file); if ($data === false) { throw new \Exception("file can not read", 1); } return FormUploader::put( $upToken, $key, $data, $this->config, $params, $mime, $checkCrc, basename($filePath) ); } $up = new ResumeUploader( $upToken, $key, $file, $size, $params, $mime, $this->config ); $ret = $up->upload(basename($filePath)); fclose($file); return $ret; } public static function trimParams($params) { if ($params === null) { return null; } $ret = array(); foreach ($params as $k => $v) { $pos = strpos($k, 'x:'); if ($pos === 0 && !empty($v)) { $ret[$k] = $v; } } return $ret; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/Zone.php ================================================ srcUpHosts = $srcUpHosts; $this->cdnUpHosts = $cdnUpHosts; $this->rsHost = $rsHost; $this->rsfHost = $rsfHost; $this->apiHost = $apiHost; $this->iovipHost = $iovipHost; } //华东机房 public static function zone0() { $Zone_z0 = new Zone( array("up.qiniup.com", 'up-jjh.qiniup.com', 'up-xs.qiniup.com'), array('upload.qiniup.com', 'upload-jjh.qiniup.com', 'upload-xs.qiniup.com'), 'rs.qiniu.com', 'rsf.qiniu.com', 'api.qiniu.com', 'iovip.qbox.me' ); return $Zone_z0; } //华北机房 public static function zone1() { $Zone_z1 = new Zone( array('up-z1.qiniup.com'), array('upload-z1.qiniup.com'), "rs-z1.qiniu.com", "rsf-z1.qiniu.com", "api-z1.qiniu.com", "iovip-z1.qbox.me" ); return $Zone_z1; } //华南机房 public static function zone2() { $Zone_z2 = new Zone( array('up-z2.qiniup.com', 'up-dg.qiniup.com', 'up-fs.qiniup.com'), array('upload-z2.qiniup.com', 'upload-dg.qiniup.com', 'upload-fs.qiniup.com'), "rs-z2.qiniu.com", "rsf-z2.qiniu.com", "api-z2.qiniu.com", "iovip-z2.qbox.me" ); return $Zone_z2; } //北美机房 public static function zoneNa0() { //北美机房 $Zone_na0 = new Zone( array('up-na0.qiniup.com'), array('upload-na0.qiniup.com'), "rs-na0.qiniu.com", "rsf-na0.qiniu.com", "api-na0.qiniu.com", "iovip-na0.qbox.me" ); return $Zone_na0; } //新加坡机房 public static function zoneAs0() { //新加坡机房 $Zone_as0 = new Zone( array('up-as0.qiniup.com'), array('upload-as0.qiniup.com'), "rs-as0.qiniu.com", "rsf-as0.qiniu.com", "api-as0.qiniu.com", "iovip-as0.qbox.me" ); return $Zone_as0; } /* * GET /v2/query?ak=&&bucket= **/ public static function queryZone($ak, $bucket) { $zone = new Zone(); $url = Config::UC_HOST . '/v2/query' . "?ak=$ak&bucket=$bucket"; $ret = Client::Get($url); if (!$ret->ok()) { return array(null, new Error($url, $ret)); } $r = ($ret->body === null) ? array() : $ret->json(); //print_r($ret); //parse zone; $iovipHost = $r['io']['src']['main'][0]; $zone->iovipHost = $iovipHost; $accMain = $r['up']['acc']['main'][0]; array_push($zone->cdnUpHosts, $accMain); if (isset($r['up']['acc']['backup'])) { foreach ($r['up']['acc']['backup'] as $key => $value) { array_push($zone->cdnUpHosts, $value); } } $srcMain = $r['up']['src']['main'][0]; array_push($zone->srcUpHosts, $srcMain); if (isset($r['up']['src']['backup'])) { foreach ($r['up']['src']['backup'] as $key => $value) { array_push($zone->srcUpHosts, $value); } } //set specific hosts if (strstr($zone->iovipHost, "z1") !== false) { $zone->rsHost = "rs-z1.qiniu.com"; $zone->rsfHost = "rsf-z1.qiniu.com"; $zone->apiHost = "api-z1.qiniu.com"; } elseif (strstr($zone->iovipHost, "z2") !== false) { $zone->rsHost = "rs-z2.qiniu.com"; $zone->rsfHost = "rsf-z2.qiniu.com"; $zone->apiHost = "api-z2.qiniu.com"; } elseif (strstr($zone->iovipHost, "na0") !== false) { $zone->rsHost = "rs-na0.qiniu.com"; $zone->rsfHost = "rsf-na0.qiniu.com"; $zone->apiHost = "api-na0.qiniu.com"; } elseif (strstr($zone->iovipHost, "as0") !== false) { $zone->rsHost = "rs-as0.qiniu.com"; $zone->rsfHost = "rsf-as0.qiniu.com"; $zone->apiHost = "api-as0.qiniu.com"; } else { $zone->rsHost = "rs.qiniu.com"; $zone->rsfHost = "rsf.qiniu.com"; $zone->apiHost = "api.qiniu.com"; } return $zone; } } ================================================ FILE: 配套插件/BsCore/modules/qiniu_kodo/src/Qiniu/functions.php ================================================ 'JSON_ERROR_DEPTH - Maximum stack depth exceeded', JSON_ERROR_STATE_MISMATCH => 'JSON_ERROR_STATE_MISMATCH - Underflow or the modes mismatch', JSON_ERROR_CTRL_CHAR => 'JSON_ERROR_CTRL_CHAR - Unexpected control character found', JSON_ERROR_SYNTAX => 'JSON_ERROR_SYNTAX - Syntax error, malformed JSON', JSON_ERROR_UTF8 => 'JSON_ERROR_UTF8 - Malformed UTF-8 characters, possibly incorrectly encoded' ); if (empty($json)) { return null; } $data = \json_decode($json, $assoc, $depth); if (JSON_ERROR_NONE !== json_last_error()) { $last = json_last_error(); throw new \InvalidArgumentException( 'Unable to parse JSON data: ' . (isset($jsonErrors[$last]) ? $jsonErrors[$last] : 'Unknown error') ); } return $data; } /** * 计算七牛API中的数据格式 * * @param $bucket 待操作的空间名 * @param $key 待操作的文件名 * * @return string 符合七牛API规格的数据格式 * @link http://developer.qiniu.com/docs/v6/api/reference/data-formats.html */ function entry($bucket, $key) { $en = $bucket; if (!empty($key)) { $en = $bucket . ':' . $key; } return base64_urlSafeEncode($en); } /** * array 辅助方法,无值时不set * * @param $array 待操作array * @param $key key * @param $value value 为null时 不设置 * * @return array 原来的array,便于连续操作 */ function setWithoutEmpty(&$array, $key, $value) { if (!empty($value)) { $array[$key] = $value; } return $array; } /** * 缩略图链接拼接 * * @param string $url 图片链接 * @param int $mode 缩略模式 * @param int $width 宽度 * @param int $height 长度 * @param string $format 输出类型 * @param int $quality 图片质量 * @param int $interlace 是否支持渐进显示 * @param int $ignoreError 忽略结果 * @return string * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/imageview2.html * @author Sherlock Ren */ function thumbnail( $url, $mode, $width, $height, $format = null, $quality = null, $interlace = null, $ignoreError = 1 ) { static $imageUrlBuilder = null; if (is_null($imageUrlBuilder)) { $imageUrlBuilder = new \Qiniu\Processing\ImageUrlBuilder; } return call_user_func_array(array($imageUrlBuilder, 'thumbnail'), func_get_args()); } /** * 图片水印 * * @param string $url 图片链接 * @param string $image 水印图片链接 * @param numeric $dissolve 透明度 * @param string $gravity 水印位置 * @param numeric $dx 横轴边距 * @param numeric $dy 纵轴边距 * @param numeric $watermarkScale 自适应原图的短边比例 * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html * @return string * @author Sherlock Ren */ function waterImg( $url, $image, $dissolve = 100, $gravity = 'SouthEast', $dx = null, $dy = null, $watermarkScale = null ) { static $imageUrlBuilder = null; if (is_null($imageUrlBuilder)) { $imageUrlBuilder = new \Qiniu\Processing\ImageUrlBuilder; } return call_user_func_array(array($imageUrlBuilder, 'waterImg'), func_get_args()); } /** * 文字水印 * * @param string $url 图片链接 * @param string $text 文字 * @param string $font 文字字体 * @param string $fontSize 文字字号 * @param string $fontColor 文字颜色 * @param numeric $dissolve 透明度 * @param string $gravity 水印位置 * @param numeric $dx 横轴边距 * @param numeric $dy 纵轴边距 * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html#text-watermark * @return string * @author Sherlock Ren */ function waterText( $url, $text, $font = '黑体', $fontSize = 0, $fontColor = null, $dissolve = 100, $gravity = 'SouthEast', $dx = null, $dy = null ) { static $imageUrlBuilder = null; if (is_null($imageUrlBuilder)) { $imageUrlBuilder = new \Qiniu\Processing\ImageUrlBuilder; } return call_user_func_array(array($imageUrlBuilder, 'waterText'), func_get_args()); } /** * 从uptoken解析accessKey和bucket * * @param $upToken * @return array(ak,bucket,err=null) */ function explodeUpToken($upToken) { $items = explode(':', $upToken); if (count($items) != 3) { return array(null, null, "invalid uptoken"); } $accessKey = $items[0]; $putPolicy = json_decode(base64_decode($items[2])); $scope = $putPolicy->scope; $scopeItems = explode(':', $scope); $bucket = $scopeItems[0]; return array($accessKey, $bucket, null); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/src/Upyun/Api/Form.php ================================================ config->serviceName; if (!isset($params['expiration'])) { $params['expiration'] = time() + 30 * 60 * 60; // 30 分钟 } $policy = Util::base64Json($params); $method = 'POST'; $signature = Signature::getBodySignature($this->config, $method, '/' . $params['service'], null, $policy); $client = new Client([ 'timeout' => $this->config->timeout, ]); $response = $client->request($method, $this->endpoint, array( 'multipart' => array( array( 'name' => 'policy', 'contents' => $policy, ), array( 'name' => 'authorization', 'contents' => $signature, ), array( 'name' => 'file', 'contents' => $stream, ) ) )); return $response->getStatusCode() === 200; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/src/Upyun/Api/Pretreat.php ================================================ processNotifyUrl) { throw new \Exception("should config prosessNotifyUrl first."); } $this->config = $config; } public function process($tasks, $optionalParams = array()) { $encodedTasks = Util::base64Json($tasks); $client = new Client([ 'timeout' => $this->config->timeout, ]); $params = array( 'service' => $this->config->serviceName, 'notify_url' => $this->config->processNotifyUrl, 'tasks' => $encodedTasks, ); $params = array_merge($params, $optionalParams); $path = '/pretreatment/'; $method = 'POST'; $signedHeaders = Signature::getHeaderSign($this->config, $method, $path); $url = $this->config->getPretreatEndPoint() . $path; $response = $client->request($method, $url, [ 'headers' => $signedHeaders, 'form_params' => $params ]); $body = $response->getBody()->getContents(); return json_decode($body, true); } public function query($taskIds, $path) { $client = new Client([ 'timeout' => $this->config->timeout, ]); $params = array( 'service' => $this->config->serviceName, 'task_ids' => implode(',', $taskIds) ); $path = $path . '?' . http_build_query($params); $method = 'GET'; $url = $this->config->getPretreatEndPoint() . $path; $signedHeaders = Signature::getHeaderSign($this->config, $method, $path); $response = $client->request($method, $url, [ 'headers' => $signedHeaders ]); if ($response->getStatusCode() === 200) { $body = $response->getBody()->getContents(); $result = json_decode($body, true); if (is_array($result)) { return $result['tasks']; } } return false; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/src/Upyun/Api/Rest.php ================================================ config = $config; $this->endpoint = $config->getProtocol() . Config::$restApiEndPoint . '/' . $config->serviceName; } public function request($method, $storagePath) { $this->method = strtoupper($method); $this->storagePath = '/' . ltrim($storagePath, '/'); return $this; } /** * @param string|resource $file * * @return $this */ public function withFile($file) { $stream = Psr7\stream_for($file); $this->file = $stream; return $this; } /** * @return mixed|\Psr\Http\Message\ResponseInterface */ public function send() { $client = new Client([ 'timeout' => $this->config->timeout, ]); $url = $this->endpoint . $this->storagePath; $body = null; if ($this->file && $this->method === 'PUT') { $body = $this->file; } $request = new Psr7\Request( $this->method, Util::encodeURI($url), $this->headers, $body ); $authHeader = Signature::getHeaderSign($this->config, $this->method, $request->getUri()->getPath() ); foreach ($authHeader as $head => $value) { $request = $request->withHeader($head, $value); } $response = $client->send($request, [ 'debug' => $this->config->debug ]); return $response; } public function withHeader($header, $value) { $header = strtolower(trim($header)); $this->headers[$header] = $value; return $this; } public function withHeaders($headers) { if (is_array($headers)) { foreach ($headers as $header => $value) { $this->withHeader($header, $value); } } return $this; } public function toRequest() { $url = $this->endpoint . $this->storagePath; $body = null; if ($this->file && $this->method === 'PUT') { $body = $this->file; } $request = new Psr7\Request( $this->method, Util::encodeURI($url), $this->headers, $body ); $authHeader = Signature::getHeaderSign($this->config, $this->method, $request->getUri()->getPath() ); foreach ($authHeader as $head => $value) { $request = $request->withHeader($head, $value); } return $request; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/src/Upyun/Api/SyncVideo.php ================================================ config = $config; } public function process($params, $path) { $client = new Client([ 'timeout' => $this->config->timeout, ]); $path = '/' . $this->config->serviceName . $path; $method = 'POST'; $signedHeaders = Signature::getHeaderSign($this->config, $method, $path); $url = $this->config->getSyncVideoEndPoint() . $path; $response = $client->request($method, $url, [ 'headers' => $signedHeaders, 'json' => $params ]); $body = $response->getBody()->getContents(); return json_decode($body, true); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/src/Upyun/Config.php ================================================ serviceName = $serviceName; $this->bucketName = $serviceName; $this->operatorName = $operatorName; $this->setOperatorPassword($operatorPassword); $this->useSsl = false; self::$restApiEndPoint = self::ED_AUTO; } public function setOperatorPassword($operatorPassword) { $this->operatorPassword = md5($operatorPassword); } public function getFormApiKey() { if (! $this->formApiKey) { throw new \Exception('form api key is empty.'); } return $this->formApiKey; } public function setFormApiKey($key) { $this->formApiKey = $key; } public function getVersion() { return $this->version; } public function getPretreatEndPoint() { return $this->getProtocol() . self::ED_VIDEO; } public function getSyncVideoEndPoint() { return $this->getProtocol() . self::ED_SYNC_VIDEO; } public function getProtocol() { return $this->useSsl ? 'https://' : 'http://'; } public function setUploadType($uploadType) { $this->uploadType = $uploadType; } public function setConcurrency($concurrency) { $this->concurrency = $concurrency; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/src/Upyun/Signature.php ================================================ $sign, 'Date' => $gmtDate, 'User-agent' => 'Php-Sdk/' . $serviceConfig->getVersion() ); return $headers; } /** * 获取请求缓存刷新接口需要的签名头 * * @param Config $serviceConfig * @param $urlString * * @return array */ public static function getPurgeSignHeader(Config $serviceConfig, $urlString) { $gmtDate = gmdate('D, d M Y H:i:s \G\M\T'); $sign = md5("$urlString&{$serviceConfig->serviceName}&$gmtDate&{$serviceConfig->operatorPassword}"); return array( 'Authorization' => "UpYun {$serviceConfig->serviceName}:{$serviceConfig->operatorName}:$sign", 'Date' => $gmtDate, 'User-agent' => 'Php-Sdk/' . $serviceConfig->getVersion() . ' (purge api)' ); } /** * 获取表单 API 需要的签名,依据 body 签名规则计算 * @param Config $serviceConfig * @param $method 请求方法 * @param $uri 请求路径 * @param $date 请求时间 * @param $policy * @param $contentMd5 请求 body 的 md5 * * @return array */ public static function getBodySignature(Config $serviceConfig, $method, $uri, $date = null, $policy = null, $contentMd5 = null) { $data = array( $method, $uri ); if ($date) { $data[] = $date; } if ($policy) { $data[] = $policy; } if ($contentMd5) { $data[] = $contentMd5; } $signature = base64_encode(hash_hmac('sha1', implode('&', $data), $serviceConfig->operatorPassword, true)); return 'UPYUN ' . $serviceConfig->operatorName . ':' . $signature; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/src/Upyun/Uploader.php ================================================ config = $config; } public function upload($path, $file, $params, $withAsyncProcess) { $stream = Psr7\stream_for($file); $size = $stream->getSize(); $useBlock = $this->needUseBlock($size); if ($withAsyncProcess) { $req = new Form($this->config); return $req->upload($path, $stream, $params); } if (! $useBlock) { $req = new Rest($this->config); return $req->request('PUT', $path) ->withHeaders($params) ->withFile($stream) ->send(); } elseif ($this->config->uploadType === 'BLOCK_PARALLEL') { return $this->concurrentPointUpload($path, $stream, $params); } else { return $this->pointUpload($path, $stream, $params); } } /** * 串行式断点续传 * @param $path * @param $stream * @param $params * * @return mixed|\Psr\Http\Message\ResponseInterface * @throws \Exception */ private function pointUpload($path, $stream, $params) { $req = new Rest($this->config); $headers = array(); if (is_array($params)) { foreach ($params as $key => $val) { $headers['X-Upyun-Meta-' . $key] = $val; } } $res = $req->request('PUT', $path) ->withHeaders(array_merge(array( 'X-Upyun-Multi-Stage' => 'initiate', 'X-Upyun-Multi-Type' => Psr7\mimetype_from_filename($path), 'X-Upyun-Multi-Length' => $stream->getSize(), ), $headers)) ->send(); if ($res->getStatusCode() !== 204) { throw new \Exception('init request failed when poinit upload!'); } $init = Util::getHeaderParams($res->getHeaders()); $uuid = $init['x-upyun-multi-uuid']; $blockSize = 1024 * 1024; $partId = 0; do { $fileBlock = $stream->read($blockSize); $res = $req->request('PUT', $path) ->withHeaders(array( 'X-Upyun-Multi-Stage' => 'upload', 'X-Upyun-Multi-Uuid' => $uuid, 'X-Upyun-Part-Id' => $partId )) ->withFile(Psr7\stream_for($fileBlock)) ->send(); if ($res->getStatusCode() !== 204) { throw new \Exception('upload request failed when poinit upload!'); } $data = Util::getHeaderParams($res->getHeaders()); $partId = $data['x-upyun-next-part-id']; } while ($partId != -1); $res = $req->request('PUT', $path) ->withHeaders(array( 'X-Upyun-Multi-Uuid' => $uuid, 'X-Upyun-Multi-Stage' => 'complete' )) ->send(); if ($res->getStatusCode() != 204 && $res->getStatusCode() != 201) { throw new \Exception('end request failed when poinit upload!'); } return $res; } private function needUseBlock($fileSize) { if ($this->config->uploadType === 'BLOCK' || $this->config->uploadType === 'BLOCK_PARALLEL') { return true; } elseif ($this->config->uploadType === 'AUTO' && $fileSize >= $this->config->sizeBoundary) { return true; } else { return false; } } /** * 并行式断点续传 * @param $path * @param $stream * @param $params * * @return mixed|\Psr\Http\Message\ResponseInterface * @throws \Exception */ private function concurrentPointUpload($path, $stream, $params) { $req = new Rest($this->config); $headers = array(); if (is_array($params)) { foreach ($params as $key => $val) { $headers['X-Upyun-Meta-' . $key] = $val; } } $res = $req->request('PUT', $path) ->withHeaders(array_merge(array( 'X-Upyun-Multi-Disorder' => 'true', 'X-Upyun-Multi-Stage' => 'initiate', 'X-Upyun-Multi-Type' => Psr7\mimetype_from_filename($path), 'X-Upyun-Multi-Length' => $stream->getSize(), ), $headers)) ->send(); if ($res->getStatusCode() !== 204) { throw new \Exception('init request failed when poinit upload!'); } $init = Util::getHeaderParams($res->getHeaders()); $uuid = $init['x-upyun-multi-uuid']; $requests = function ($req, $path, $stream, $uuid) { $blockSize = 1024 * 1024; $total = ceil($stream->getSize() / $blockSize); for ($i = 0; $i < $total; $i++) { $fileBlock = $stream->read($blockSize); yield $req->request('PUT', $path) ->withHeaders(array( 'X-Upyun-Multi-Stage' => 'upload', 'X-Upyun-Multi-Uuid' => $uuid, 'X-Upyun-Part-Id' => $i )) ->withFile(Psr7\stream_for($fileBlock)) ->toRequest(); } }; $client = new Client([ 'timeout' => $this->config->timeout, ]); $pool = new Pool($client, $requests($req, $path, $stream, $uuid), [ 'concurrency' => $this->config->concurrency, 'fulfilled' => function ($res) { if ($res->getStatusCode() !== 204) { throw new \Exception('upload request failed when poinit upload!'); } }, 'rejected' => function () { throw new \Exception('upload request failed when poinit upload!'); }, ]); $promise = $pool->promise(); $promise->wait(); $res = $req->request('PUT', $path) ->withHeaders(array( 'X-Upyun-Multi-Uuid' => $uuid, 'X-Upyun-Multi-Stage' => 'complete' )) ->send(); if ($res->getStatusCode() != 204 && $res->getStatusCode() != 201) { throw new \Exception('end request failed when poinit upload!'); } return $res; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/src/Upyun/Upyun.php ================================================ setConfig($config); } /** * 配置服务信息 * * 当需要操作的新的服务时,使用该方法传入新的服务配置即可 * * @param Config $config 服务配置 * * @return $this */ public function setConfig(Config $config) { $this->config = $config; return $this; } /** * 上传一个文件到又拍云存储 * * 上传的文件格式支持文件流或者字符串方式上传。除简单的文件上传外,针对多媒体资源(图片、音视频),还可以设置同步/异步预处理多媒体资源,例如:图片的裁剪缩放,音视频的转码截图等等众多又拍云强大的云处理功能 * * @param string $path 被上传的文件在又拍云存储服务中保存的路径 * @param string|resource $content 被上传的文件内容(字符串),或者打开该文件获得的文件句柄(文件流)。当上传本地大文件时,推荐使用文件流的方式上传 * @param array $params 上传文件时,附加的自定义参数。支持 Content-MD5 Content-Type Content-Secret 等,详见 [上传参数](http://docs.upyun.com/api/rest_api/#_2),例如: * - 设置文件[保护秘钥](http://docs.upyun.com/api/rest_api/#Content-Secret) `write($path, $content, array('Content-Secret' => 'my-secret'))`; * - 添加[文件元信息](http://docs.upyun.com/api/rest_api/#metadata) `write($path, $content, array('X-Upyun-Meta-Foo' => * 'bar'))` * - [图片同步预处理](http://docs.upyun.com/cloud/image/#_5) `write($path, $content, array('x-gmkerl-thumb' => '/format/png'))` * @param bool $withAsyncProcess 默认为 `false`,当上传图片或者音视频资源时,可以设置该参数为 `true`,开启图片音视频的[异步处理功能](http://docs.upyun.com/api/form_api/#_6) ,例如: *``` * // 以下参数会将新上传的图片,再异步生成另一份 png 格式的图片,原图不受影响 * write($path, $content, array( * 'apps' => array( * array( * 'name' => 'thumb', //异步图片处理任务 * 'x-gmkerl-thumb' => '/format/png', // 格式化图片为 png 格式 * 'save_as': '/iamge/png/new.png', // 处理成功后的图片保存路径 * 'notify_url': 'http://your.notify.url' // 异步任务完成后的回调地址 * ) * ) * ), true); *``` * * * * @return array|bool 若文件是图片则返回图片基本信息,如:`array('x-upyun-width' => 123, 'x-upyun-height' => 50, 'x-upyun-frames' * => 1, 'x-upyun-file-type' => 'JPEG')`,否则返回空数组。当使用异步预处理功能时,返回结果为布尔值,成功为 `true`。 * * @throws \Exception 上传失败时,抛出异常 */ public function write($path, $content, $params = array(), $withAsyncProcess = false) { if (!$content) { throw new \Exception('write content can not be empty.'); } $upload = new Uploader($this->config); $response = $upload->upload($path, $content, $params, $withAsyncProcess); if ($withAsyncProcess) { return $response; } return Util::getHeaderParams($response->getHeaders()); } /** * 读取云存储文件/目录内容 * * @param string $path 又拍云存储中的文件或者目录路径 * @param resource $saveHandler 文件内容写入本地文件流。例如 `$saveHandler = fopen('/local/file', 'w') * `。当设置该参数时,将以文件流的方式,直接将又拍云中的文件写入本地的文件流,或其他可以写入的流 * @param array $params 可选参数,读取目录内容时,需要设置三个参数: `X-List-Iter` 分页开始位置(第一页不需要设置),`X-List-Limit` 获取的文件数量(默认 100,最大 * 10000),`X-List-Order` 结果以时间正序或者倒序 * * @return mixed $return 当读取文件且没有设置 `$saveHandler` 参数时,返回一个字符串类型,表示文件内容;设置了 `$saveHandler` 参数时,返回布尔值 * `true`。当读取目录时,返回一个数组,表示目录下的文件列表。目录下文件内容过多时,需要通过判断返回数组中的 `is_end` 属性,进行分页读取内容 * * @throws \Exception */ public function read($path, $saveHandler = null, $params = array()) { $req = new Rest($this->config); $response = $req->request('GET', $path) ->withHeaders($params) ->send(); $params = Util::getHeaderParams($response->getHeaders()); if (! isset($params['x-upyun-list-iter'])) { if (is_resource($saveHandler)) { Psr7\copy_to_stream($response->getBody(), Psr7\stream_for($saveHandler)); return true; } else { return $response->getBody()->getContents(); } } else { $files = Util::parseDir($response->getBody()->getContents()); return array('files' => $files, 'is_end' => $params['x-upyun-list-iter'] === 'g2gCZAAEbmV4dGQAA2VvZg', 'iter' => $params['x-upyun-list-iter']); } } /** * 判断文件是否存在于又拍云存储 * * 注意: 对刚删除的文件, 立即调用该方法可能会返回 true, 因为服务端执行删除操作后可能会有很短暂的延迟. * * @param string $path 云存储的文件路径 * * @return bool 存在时返回 `true`,否则返回 `false` * @throws \Exception */ public function has($path) { $req = new Rest($this->config); try { $req->request('HEAD', $path) ->send(); } catch (GuzzleHttp\Exception\BadResponseException $e) { $statusCode = $e->getResponse()->getStatusCode(); if ($statusCode === 404) { return false; } else { throw $e; } } return true; } /** * 获取云存储文件/目录的基本信息 * * @param string $path 云存储的文件路径 * @param array $otherHeaders 设置了后,方法将返回其他 http header 中的信息,默认为空 * * @return array 返回一个数组,默认包含以下 key * - `x-upyun-file-type` 当 $path 是目录时,值为 *folder*,当 $path 是文件时,值为 *file*, * - `x-upyun-file-size` 文件大小 * - `x-upyun-file-date` 文件的创建时间 */ public function info($path, $otherHeaders = array()) { $req = new Rest($this->config); $response = $req->request('HEAD', $path) ->send(); return Util::getHeaderParams($response->getHeaders(), $otherHeaders); } /** * 获取文件的文档类型 * @param string $path 云存储文件路径 * @return string 文档类型,e.g: `appcation/json`,获取失败返回空字符串 */ public function getMimetype($path) { $params = $this->info($path, array('content-type')); if (isset($params['content-type'])) { return explode(';', $params['content-type'])[0]; } return ''; } /** * 删除文件或者目录 * * @param string $path 文件或目录在又拍云存储的路径 * @param bool $async 是否异步删除,默认为 false,表示同步删除。当需要批量删除大量文件时,必须选择异步删除 * * @return bool 删除成功返回 true,否则 false * @throws \Exception 删除不存在的文件将会抛出异常 */ public function delete($path, $async = false) { $req = new Rest($this->config); $req->request('DELETE', $path); if ($async) { $req->withHeader('x-upyun-async', 'true'); } $res = $req->send(); return $res->getStatusCode() === 200; } /** * 创建目录 * * @param string $path 需要在又拍云存储创建的目录路径 * * @return bool 创建成功返回 true,否则返回 false * @throws \Exception */ public function createDir($path) { $path = rtrim($path, '/') . '/'; $req = new Rest($this->config); $res = $req->request('POST', $path) ->withHeader('folder', 'true') ->send(); return $res->getStatusCode() === 200; } /** * 删除文件或者目录 * * @param string $path 需要被删除的云存储文件或目录路径 * * @return bool 成功返回 true,否则 false * @throws \Exception */ public function deleteDir($path) { return $this->delete($path); } /** * 获取目录下存储使用量 * * @param string $path 云存储目录路径,默认为根目录,表示整个云存储服务使用的空间大小 * @return string 存储使用量,单位字节 * @throws \Exception */ public function usage($path = '/') { $path = rtrim($path, '/') . '/'; $req = new Rest($this->config); $response = $req->request('GET', $path . '?usage') ->send(); return $response->getBody()->getContents(); } /** * 复制文件。只能操作文件,不能操作文件夹。 * * @param string $source 源文件地址 * @param string $target 目标文件地址 * @return bool 复制成功返回 true,否则 false * @throws \Exception */ public function copy($source, $target) { $source = '/' . $this->config->serviceName . '/' . ltrim($source, '/'); $req = new Rest($this->config); $response = $req->request('PUT', $target) ->withHeader('X-Upyun-Copy-Source', $source) ->send(); return util::isSuccess($response->getStatusCode()); } /** * 移动文件。可以进行文件重命名、文件移动,只能操作文件,不能操作文件夹。 * * @param string $source 源文件地址 * @param string $target 目标文件地址 * @return bool 移动成功返回 true,否则 false * @throws \Exception */ public function move($source, $target) { $source = '/' . $this->config->serviceName . '/' . ltrim($source, '/'); $req = new Rest($this->config); $response = $req->request('PUT', $target) ->withHeader('X-Upyun-Move-Source', $source) ->send(); return util::isSuccess($response->getStatusCode()); } /** * 刷新缓存 * * @param array|string $urls 需要刷新的文件 url 列表 * * @return array 刷新失败的 url 列表,若全部刷新成功则为空数组 */ public function purge($urls) { $urlString = $urls; if (is_array($urls)) { $urlString = implode("\n", $urls); } $client = new Client([ 'timeout' => $this->config->timeout ]); $response = $client->request('POST', Config::ED_PURGE, [ 'headers' => Signature::getPurgeSignHeader($this->config, $urlString), 'form_params' => ['purge' => $urlString] ]); $result = json_decode($response->getBody()->getContents(), true); return $result['invalid_domain_of_url']; } /** * 异步云处理 * * 该方法是基于[又拍云云处理](http://docs.upyun.com/cloud/) 服务实现,可以实现音视频的转码、切片、剪辑;文件的压缩解压缩;文件拉取功能 * * 注意: * - 所有需要调用该方法处理的资源,必须已经上传到云存储服务 * - 使用 `process` 之前,必须配置 `config->processNotifyUrl`,否则会提交任务失败 * * 例如视频转码: * ``` * process(array( * array( * 'type' => 'video', // video 表示视频任务, audio 表示音频任务 * 'avopts' => '/s/240p(4:3)/as/1/r/30', // 处理参数,`s` 表示输出的分辨率,`r` 表示视频帧率,`as` 表示是否自动调整分辨率 * 'save_as' => '/video/240/new.mp4', // 新视频在又拍云存储的保存路径 * ), * ... // 同时还可以添加其他任务 * ), Upyun::$PROCESS_TYPE_MEDIA, $source) * ``` * * @param array $tasks 需要处理的任务 * @param string $type 异步云处理任务类型,可选值: * - `Upyun::$PROCESS_TYPE_MEDIA` 异步音视频处理 * - `Upyun::$PROCESS_TYPE_ZIP` 文件压缩 * - `Upyun::$PROCESS_TYPE_UNZIP` 文件解压 * - `Upyun::$PROCESS_TYPE_SYNC_FILE` 文件拉取 * - `Upyun::$PROCESS_TYPE_STITCH` 图片拼接 * @param string $source 可选参数,处理异步音视频任务时,需要传递该参数,表示需要处理的文件路径 * * @return array 任务 ID,提交了多少任务,便会返回多少任务 ID,与提交任务的顺序保持一致。可以通过任务 ID 查询处理进度。格式如下: * ``` * array( * '35f0148d414a688a275bf915ba7cebb2', * '98adbaa52b2f63d6d7f327a0ff223348', * ) * ``` * @throws \Exception */ public function process($tasks, $type, $source = '') { $video = new Api\Pretreat($this->config); $options = array(); switch($type) { case self::$PROCESS_TYPE_MEDIA: $options['accept'] = 'json'; $options['source'] = $source; break; case self::$PROCESS_TYPE_ZIP: $options['app_name'] = 'compress'; break; case self::$PROCESS_TYPE_UNZIP: $options['app_name'] = 'depress'; break; case self::$PROCESS_TYPE_SYNC_FILE: $options['app_name'] = 'spiderman'; break; case self::$PROCESS_TYPE_CONVERT: $options['app_name'] = 'uconvert'; break; case self::$PROCESS_TYPE_STITCH: $options['app_name'] = 'jigsaw'; break; default: throw new \Exception('upyun - not support process type.'); } return $video->process($tasks, $options); } /** * 查询异步云处理任务进度 * * 根据 `process` 方法返回的任务 ID,通过该访问查询处理进度 * * @param array $taskIds 任务 ID * * @return bool|array 查询失败返回布尔值 `false`,否则返回每个任务的百分比进度信息,格式如下: * ``` * array( * '35f0148d414a688a275bf915ba7cebb2' => 100, // 100 表示任务完成 * 'c3103189fa906a5354d29bd807e8dc51' => 35, * '98adbaa52b2f63d6d7f327a0ff223348' => null, // null 表示任务未开始,或异常 * ) * ``` */ public function queryProcessStatus($taskIds) { $video = new Api\Pretreat($this->config); return $video->query($taskIds, '/status/'); } /** * 查询异步云处理任务结果 * * 根据 `process` 方法返回的任务 ID,通过该访问查询处理结果,会包含每个任务详细信息 * @param array $taskIds 任务 ID * * @return bool|mixed 查询失败返回 `false`,否则返回每个任务的处理结果,格式如下: * ``` * array( * '9d9c32b63a1034834e77672c6f51f661' => array( * 'path' => array('/v2.mp4'), * 'signature' => '4042c1f07f546d28', * 'status_code' => 200, * 'service_name' => 'your_storage_service', * 'description' => 'OK', * 'task_id' => '9d9c32b63a1034834e77672c6f51f661', * 'timestamp' => 1472010684 * ) * ) * ``` */ public function queryProcessResult($taskIds) { $video = new Api\Pretreat($this->config); return $video->query($taskIds, '/result/'); } /** * 多个 m3u8 文件拼接 * @param array $files 保存在又拍云云存储中的多个 m3u8 文件路径 * @param string $saveAs 拼接生成的新 m3u8 文件保存路径 * * @return array 见 [m3u8 拼接 - 响应](http://docs.upyun.com/cloud/sync_video/#_3) */ public function m3u8Concat($files, $saveAs) { $p = new Api\SyncVideo($this->config); return $p->process([ 'm3u8s' => $files, 'save_as' => $saveAs, ], '/m3u8er/concat'); } /** * 单个 m3u8 文件剪辑 * @param string $file 需要剪辑的又拍云云存储中的 m3u8 文件路径 * @param string $saveAs 剪辑完成后新的 m3u8 文件保存路径 * @param array $slice 需要被保留或删除的片段。 * @param bool $isInclude 默认为 `true` 表示 `$slice` 参数描述的片段被保留,否则表示 `$slice` 参数描述的片段被删除 * @param bool $index 指定 `$slice` 参数的格式,默认为 `false` 表示使用时间范围描述片段,单位秒:`[<开始时间>, <结束时间>]`;`true` 表示使用 `m3u8` 文件的分片序号,从 0 开始,这种方式可以一次对多个片段操作 * * @return array 见 [m3u8 剪辑 - 响应](http://docs.upyun.com/cloud/sync_video/#_6) */ public function m3u8Clip($file, $saveAs, $slice = array(), $isInclude = true, $index = false) { $p = new Api\SyncVideo($this->config); $params = [ 'm3u8' => $file, 'save_as' => $saveAs, 'index' => $index, ]; if ($isInclude) { $params['include'] = $slice; } else { $params['exclude'] = $slice; } return $p->process($params, '/m3u8er/clip'); } /** * 获取单个 m3u8 文件描述信息 * @param string $file 又拍云云存储的中的 m3u8 文件路径 * * @return array 见 [获取 m3u8 信息 - 响应](http://docs.upyun.com/cloud/sync_video/#_6) */ public function m3u8Meta($file) { $p = new Api\SyncVideo($this->config); return $p->process([ 'm3u8' => $file, ], '/m3u8er/get_meta'); } /** * 视频截图,可以对 mp4、m3u8 等视频文件进行截图 * @param string $file 需要截图的又拍云云存储中的视频文件路径 * @param string $saveAs 截图保存路径 * @param string $point 截图时间点,`HH:MM:SS` 格式 * @param string $size 截图尺寸 `宽x高` 格式的字符串。默认和视频尺寸一致 * @param string $format 截图保存的格式,默认根据 `$saveAs` 参数的后缀生成,可以指定 `jpg | png | webp` 三种格式 * * @return array 见 [视频截图 - 响应](http://docs.upyun.com/cloud/sync_video/#m3u8_2) */ public function snapshot($file, $saveAs, $point, $size = '', $format = '') { $p = new Api\SyncVideo($this->config); $params = [ 'source' => $file, 'save_as' => $saveAs, 'point' => $point, ]; if ($size) { $params['size'] = $size; } if ($format) { $params['format'] = $format; } return $p->process($params, '/snapshot'); } /** * 获取音视频文件元信息 * @param string $file 又拍云云存储的中的音视频文件路径 * * @return array 见 [获取音视频文件信息 - 响应](http://docs.upyun.com/cloud/sync_video/#_16) */ public function avMeta($file) { $p = new Api\SyncVideo($this->config); return $p->process([ 'source' => $file, ], '/avmeta/get_meta'); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/src/Upyun/Util.php ================================================ $value) { $header = strtolower($header); if (strpos($header, 'x-upyun-') !== false) { $params[$header] = $value[0]; } else if (in_array($header, $otherParams)) { $params[$header] = $value[0]; } } return $params; } public static function parseDir($body) { $files = array(); if (!$body) { return array(); } $lines = explode("\n", $body); foreach ($lines as $line) { $file = []; list($file['name'], $file['type'], $file['size'], $file['time']) = explode("\t", $line, 4); $files[] = $file; } return $files; } public static function base64Json($params) { return base64_encode(json_encode($params, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); } public static function stringifyHeaders($headers) { $return = array(); foreach ($headers as $key => $value) { $return[] = "$key: $value"; } return $return; } public static function md5Hash($resource) { rewind($resource); $ctx = hash_init('md5'); hash_update_stream($ctx, $resource); $md5 = hash_final($ctx); return $md5; } /** * GuzzleHttp\Psr\Uri use `parse_url`,not good for utf-8, * So should `encodeURI` first, before `new Psr7\Request` * @see http://stackoverflow.com/questions/4929584/encodeuri-in-php */ public static function encodeURI($url) { $unescaped = array( '%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~', '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')' ); $reserved = array( '%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','%3A'=>':', '%40'=>'@','%26'=>'&','%3D'=>'=','%2B'=>'+','%24'=>'$' ); $score = array( '%23'=>'#' ); return strtr(rawurlencode($url), array_merge($reserved, $unescaped, $score)); } public static function isSuccess($code) { return $code >= 200 && $code < 300; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/autoload.php ================================================ * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see http://www.php-fig.org/psr/psr-0/ * @see http://www.php-fig.org/psr/psr-4/ */ class ClassLoader { // PSR-4 private $prefixLengthsPsr4 = array(); private $prefixDirsPsr4 = array(); private $fallbackDirsPsr4 = array(); // PSR-0 private $prefixesPsr0 = array(); private $fallbackDirsPsr0 = array(); private $useIncludePath = false; private $classMap = array(); private $classMapAuthoritative = false; private $missingClasses = array(); private $apcuPrefix; public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', $this->prefixesPsr0); } return array(); } public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } public function getFallbackDirs() { return $this->fallbackDirsPsr0; } public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } public function getClassMap() { return $this->classMap; } /** * @param array $classMap Class to filename map */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 base directories */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); } /** * Unregisters this instance as an autoloader. */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); } /** * Loads the given class or interface. * * @param string $class The name of the class * @return bool|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath.'\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. */ function includeFile($file) { include $file; } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/composer/LICENSE ================================================ Copyright (c) Nils Adermann, Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_classmap.php ================================================ $vendorDir . '/guzzlehttp/guzzle/src/Client.php', 'GuzzleHttp\\ClientInterface' => $vendorDir . '/guzzlehttp/guzzle/src/ClientInterface.php', 'GuzzleHttp\\Cookie\\CookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php', 'GuzzleHttp\\Cookie\\CookieJarInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php', 'GuzzleHttp\\Cookie\\FileCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php', 'GuzzleHttp\\Cookie\\SessionCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php', 'GuzzleHttp\\Cookie\\SetCookie' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php', 'GuzzleHttp\\Exception\\BadResponseException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php', 'GuzzleHttp\\Exception\\ClientException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ClientException.php', 'GuzzleHttp\\Exception\\ConnectException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ConnectException.php', 'GuzzleHttp\\Exception\\GuzzleException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php', 'GuzzleHttp\\Exception\\InvalidArgumentException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php', 'GuzzleHttp\\Exception\\RequestException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/RequestException.php', 'GuzzleHttp\\Exception\\SeekException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/SeekException.php', 'GuzzleHttp\\Exception\\ServerException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ServerException.php', 'GuzzleHttp\\Exception\\TooManyRedirectsException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php', 'GuzzleHttp\\Exception\\TransferException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TransferException.php', 'GuzzleHttp\\HandlerStack' => $vendorDir . '/guzzlehttp/guzzle/src/HandlerStack.php', 'GuzzleHttp\\Handler\\CurlFactory' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php', 'GuzzleHttp\\Handler\\CurlFactoryInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php', 'GuzzleHttp\\Handler\\CurlHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php', 'GuzzleHttp\\Handler\\CurlMultiHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php', 'GuzzleHttp\\Handler\\EasyHandle' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php', 'GuzzleHttp\\Handler\\MockHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/MockHandler.php', 'GuzzleHttp\\Handler\\Proxy' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/Proxy.php', 'GuzzleHttp\\Handler\\StreamHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php', 'GuzzleHttp\\MessageFormatter' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatter.php', 'GuzzleHttp\\Middleware' => $vendorDir . '/guzzlehttp/guzzle/src/Middleware.php', 'GuzzleHttp\\Pool' => $vendorDir . '/guzzlehttp/guzzle/src/Pool.php', 'GuzzleHttp\\PrepareBodyMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php', 'GuzzleHttp\\Promise\\AggregateException' => $vendorDir . '/guzzlehttp/promises/src/AggregateException.php', 'GuzzleHttp\\Promise\\CancellationException' => $vendorDir . '/guzzlehttp/promises/src/CancellationException.php', 'GuzzleHttp\\Promise\\Coroutine' => $vendorDir . '/guzzlehttp/promises/src/Coroutine.php', 'GuzzleHttp\\Promise\\EachPromise' => $vendorDir . '/guzzlehttp/promises/src/EachPromise.php', 'GuzzleHttp\\Promise\\FulfilledPromise' => $vendorDir . '/guzzlehttp/promises/src/FulfilledPromise.php', 'GuzzleHttp\\Promise\\Promise' => $vendorDir . '/guzzlehttp/promises/src/Promise.php', 'GuzzleHttp\\Promise\\PromiseInterface' => $vendorDir . '/guzzlehttp/promises/src/PromiseInterface.php', 'GuzzleHttp\\Promise\\PromisorInterface' => $vendorDir . '/guzzlehttp/promises/src/PromisorInterface.php', 'GuzzleHttp\\Promise\\RejectedPromise' => $vendorDir . '/guzzlehttp/promises/src/RejectedPromise.php', 'GuzzleHttp\\Promise\\RejectionException' => $vendorDir . '/guzzlehttp/promises/src/RejectionException.php', 'GuzzleHttp\\Promise\\TaskQueue' => $vendorDir . '/guzzlehttp/promises/src/TaskQueue.php', 'GuzzleHttp\\Promise\\TaskQueueInterface' => $vendorDir . '/guzzlehttp/promises/src/TaskQueueInterface.php', 'GuzzleHttp\\Psr7\\AppendStream' => $vendorDir . '/guzzlehttp/psr7/src/AppendStream.php', 'GuzzleHttp\\Psr7\\BufferStream' => $vendorDir . '/guzzlehttp/psr7/src/BufferStream.php', 'GuzzleHttp\\Psr7\\CachingStream' => $vendorDir . '/guzzlehttp/psr7/src/CachingStream.php', 'GuzzleHttp\\Psr7\\DroppingStream' => $vendorDir . '/guzzlehttp/psr7/src/DroppingStream.php', 'GuzzleHttp\\Psr7\\FnStream' => $vendorDir . '/guzzlehttp/psr7/src/FnStream.php', 'GuzzleHttp\\Psr7\\InflateStream' => $vendorDir . '/guzzlehttp/psr7/src/InflateStream.php', 'GuzzleHttp\\Psr7\\LazyOpenStream' => $vendorDir . '/guzzlehttp/psr7/src/LazyOpenStream.php', 'GuzzleHttp\\Psr7\\LimitStream' => $vendorDir . '/guzzlehttp/psr7/src/LimitStream.php', 'GuzzleHttp\\Psr7\\MessageTrait' => $vendorDir . '/guzzlehttp/psr7/src/MessageTrait.php', 'GuzzleHttp\\Psr7\\MultipartStream' => $vendorDir . '/guzzlehttp/psr7/src/MultipartStream.php', 'GuzzleHttp\\Psr7\\NoSeekStream' => $vendorDir . '/guzzlehttp/psr7/src/NoSeekStream.php', 'GuzzleHttp\\Psr7\\PumpStream' => $vendorDir . '/guzzlehttp/psr7/src/PumpStream.php', 'GuzzleHttp\\Psr7\\Request' => $vendorDir . '/guzzlehttp/psr7/src/Request.php', 'GuzzleHttp\\Psr7\\Response' => $vendorDir . '/guzzlehttp/psr7/src/Response.php', 'GuzzleHttp\\Psr7\\Rfc7230' => $vendorDir . '/guzzlehttp/psr7/src/Rfc7230.php', 'GuzzleHttp\\Psr7\\ServerRequest' => $vendorDir . '/guzzlehttp/psr7/src/ServerRequest.php', 'GuzzleHttp\\Psr7\\Stream' => $vendorDir . '/guzzlehttp/psr7/src/Stream.php', 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => $vendorDir . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', 'GuzzleHttp\\Psr7\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php', 'GuzzleHttp\\Psr7\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php', 'GuzzleHttp\\Psr7\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php', 'GuzzleHttp\\Psr7\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php', 'GuzzleHttp\\Psr7\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php', 'GuzzleHttp\\RedirectMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RedirectMiddleware.php', 'GuzzleHttp\\RequestOptions' => $vendorDir . '/guzzlehttp/guzzle/src/RequestOptions.php', 'GuzzleHttp\\RetryMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RetryMiddleware.php', 'GuzzleHttp\\TransferStats' => $vendorDir . '/guzzlehttp/guzzle/src/TransferStats.php', 'GuzzleHttp\\UriTemplate' => $vendorDir . '/guzzlehttp/guzzle/src/UriTemplate.php', 'GuzzleHttp\\Utils' => $vendorDir . '/guzzlehttp/guzzle/src/Utils.php', 'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', 'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', 'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', 'Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php', 'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', 'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', 'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => $vendorDir . '/symfony/polyfill-intl-idn/Idn.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', 'Symfony\\Polyfill\\Php72\\Php72' => $vendorDir . '/symfony/polyfill-php72/Php72.php', 'Upyun\\Api\\Form' => $baseDir . '/src/Upyun/Api/Form.php', 'Upyun\\Api\\Pretreat' => $baseDir . '/src/Upyun/Api/Pretreat.php', 'Upyun\\Api\\Rest' => $baseDir . '/src/Upyun/Api/Rest.php', 'Upyun\\Api\\SyncVideo' => $baseDir . '/src/Upyun/Api/SyncVideo.php', 'Upyun\\Config' => $baseDir . '/src/Upyun/Config.php', 'Upyun\\Signature' => $baseDir . '/src/Upyun/Signature.php', 'Upyun\\Uploader' => $baseDir . '/src/Upyun/Uploader.php', 'Upyun\\Upyun' => $baseDir . '/src/Upyun/Upyun.php', 'Upyun\\Util' => $baseDir . '/src/Upyun/Util.php', ); ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_files.php ================================================ $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', ); ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_namespaces.php ================================================ array($baseDir . '/tests'), 'Upyun\\' => array($baseDir . '/src/Upyun'), 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), ); ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_real.php ================================================ = 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } $loader->register(true); if ($useStaticLoader) { $includeFiles = Composer\Autoload\ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c::$files; } else { $includeFiles = require __DIR__ . '/autoload_files.php'; } foreach ($includeFiles as $fileIdentifier => $file) { composerRequireca3246bd34aef60b57a2fdabc131a50c($fileIdentifier, $file); } return $loader; } } function composerRequireca3246bd34aef60b57a2fdabc131a50c($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { require $file; $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/composer/autoload_static.php ================================================ __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', ); public static $prefixLengthsPsr4 = array ( 'U' => array ( 'Upyun\\Tests\\' => 12, 'Upyun\\' => 6, ), 'S' => array ( 'Symfony\\Polyfill\\Php72\\' => 23, 'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Intl\\Idn\\' => 26, ), 'P' => array ( 'Psr\\Http\\Message\\' => 17, ), 'G' => array ( 'GuzzleHttp\\Psr7\\' => 16, 'GuzzleHttp\\Promise\\' => 19, 'GuzzleHttp\\' => 11, ), ); public static $prefixDirsPsr4 = array ( 'Upyun\\Tests\\' => array ( 0 => __DIR__ . '/../..' . '/tests', ), 'Upyun\\' => array ( 0 => __DIR__ . '/../..' . '/src/Upyun', ), 'Symfony\\Polyfill\\Php72\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', ), 'Symfony\\Polyfill\\Mbstring\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', ), 'Symfony\\Polyfill\\Intl\\Idn\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn', ), 'Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-message/src', ), 'GuzzleHttp\\Psr7\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', ), 'GuzzleHttp\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', ), 'GuzzleHttp\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', ), ); public static $classMap = array ( 'GuzzleHttp\\Client' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Client.php', 'GuzzleHttp\\ClientInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/ClientInterface.php', 'GuzzleHttp\\Cookie\\CookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php', 'GuzzleHttp\\Cookie\\CookieJarInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php', 'GuzzleHttp\\Cookie\\FileCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php', 'GuzzleHttp\\Cookie\\SessionCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php', 'GuzzleHttp\\Cookie\\SetCookie' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php', 'GuzzleHttp\\Exception\\BadResponseException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php', 'GuzzleHttp\\Exception\\ClientException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ClientException.php', 'GuzzleHttp\\Exception\\ConnectException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ConnectException.php', 'GuzzleHttp\\Exception\\GuzzleException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php', 'GuzzleHttp\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php', 'GuzzleHttp\\Exception\\RequestException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/RequestException.php', 'GuzzleHttp\\Exception\\SeekException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/SeekException.php', 'GuzzleHttp\\Exception\\ServerException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ServerException.php', 'GuzzleHttp\\Exception\\TooManyRedirectsException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php', 'GuzzleHttp\\Exception\\TransferException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TransferException.php', 'GuzzleHttp\\HandlerStack' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/HandlerStack.php', 'GuzzleHttp\\Handler\\CurlFactory' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php', 'GuzzleHttp\\Handler\\CurlFactoryInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php', 'GuzzleHttp\\Handler\\CurlHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php', 'GuzzleHttp\\Handler\\CurlMultiHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php', 'GuzzleHttp\\Handler\\EasyHandle' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php', 'GuzzleHttp\\Handler\\MockHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/MockHandler.php', 'GuzzleHttp\\Handler\\Proxy' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/Proxy.php', 'GuzzleHttp\\Handler\\StreamHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php', 'GuzzleHttp\\MessageFormatter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatter.php', 'GuzzleHttp\\Middleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Middleware.php', 'GuzzleHttp\\Pool' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Pool.php', 'GuzzleHttp\\PrepareBodyMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php', 'GuzzleHttp\\Promise\\AggregateException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/AggregateException.php', 'GuzzleHttp\\Promise\\CancellationException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/CancellationException.php', 'GuzzleHttp\\Promise\\Coroutine' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Coroutine.php', 'GuzzleHttp\\Promise\\EachPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/EachPromise.php', 'GuzzleHttp\\Promise\\FulfilledPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/FulfilledPromise.php', 'GuzzleHttp\\Promise\\Promise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Promise.php', 'GuzzleHttp\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromiseInterface.php', 'GuzzleHttp\\Promise\\PromisorInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromisorInterface.php', 'GuzzleHttp\\Promise\\RejectedPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectedPromise.php', 'GuzzleHttp\\Promise\\RejectionException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectionException.php', 'GuzzleHttp\\Promise\\TaskQueue' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueue.php', 'GuzzleHttp\\Promise\\TaskQueueInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueueInterface.php', 'GuzzleHttp\\Psr7\\AppendStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/AppendStream.php', 'GuzzleHttp\\Psr7\\BufferStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/BufferStream.php', 'GuzzleHttp\\Psr7\\CachingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/CachingStream.php', 'GuzzleHttp\\Psr7\\DroppingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/DroppingStream.php', 'GuzzleHttp\\Psr7\\FnStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/FnStream.php', 'GuzzleHttp\\Psr7\\InflateStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/InflateStream.php', 'GuzzleHttp\\Psr7\\LazyOpenStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LazyOpenStream.php', 'GuzzleHttp\\Psr7\\LimitStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LimitStream.php', 'GuzzleHttp\\Psr7\\MessageTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MessageTrait.php', 'GuzzleHttp\\Psr7\\MultipartStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MultipartStream.php', 'GuzzleHttp\\Psr7\\NoSeekStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/NoSeekStream.php', 'GuzzleHttp\\Psr7\\PumpStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/PumpStream.php', 'GuzzleHttp\\Psr7\\Request' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Request.php', 'GuzzleHttp\\Psr7\\Response' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Response.php', 'GuzzleHttp\\Psr7\\Rfc7230' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Rfc7230.php', 'GuzzleHttp\\Psr7\\ServerRequest' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/ServerRequest.php', 'GuzzleHttp\\Psr7\\Stream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Stream.php', 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', 'GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php', 'GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php', 'GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php', 'GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php', 'GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php', 'GuzzleHttp\\RedirectMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RedirectMiddleware.php', 'GuzzleHttp\\RequestOptions' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RequestOptions.php', 'GuzzleHttp\\RetryMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RetryMiddleware.php', 'GuzzleHttp\\TransferStats' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/TransferStats.php', 'GuzzleHttp\\UriTemplate' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/UriTemplate.php', 'GuzzleHttp\\Utils' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Utils.php', 'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', 'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', 'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', 'Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php', 'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', 'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', 'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Idn.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', 'Symfony\\Polyfill\\Php72\\Php72' => __DIR__ . '/..' . '/symfony/polyfill-php72/Php72.php', 'Upyun\\Api\\Form' => __DIR__ . '/../..' . '/src/Upyun/Api/Form.php', 'Upyun\\Api\\Pretreat' => __DIR__ . '/../..' . '/src/Upyun/Api/Pretreat.php', 'Upyun\\Api\\Rest' => __DIR__ . '/../..' . '/src/Upyun/Api/Rest.php', 'Upyun\\Api\\SyncVideo' => __DIR__ . '/../..' . '/src/Upyun/Api/SyncVideo.php', 'Upyun\\Config' => __DIR__ . '/../..' . '/src/Upyun/Config.php', 'Upyun\\Signature' => __DIR__ . '/../..' . '/src/Upyun/Signature.php', 'Upyun\\Uploader' => __DIR__ . '/../..' . '/src/Upyun/Uploader.php', 'Upyun\\Upyun' => __DIR__ . '/../..' . '/src/Upyun/Upyun.php', 'Upyun\\Util' => __DIR__ . '/../..' . '/src/Upyun/Util.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c::$prefixDirsPsr4; $loader->classMap = ComposerStaticInitca3246bd34aef60b57a2fdabc131a50c::$classMap; }, null, ClassLoader::class); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/composer/installed.json ================================================ [ { "name": "guzzlehttp/guzzle", "version": "6.5.5", "version_normalized": "6.5.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", "shasum": "", "mirrors": [ { "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", "preferred": true } ] }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.0", "guzzlehttp/psr7": "^1.6.1", "php": ">=5.5", "symfony/polyfill-intl-idn": "^1.17.0" }, "require-dev": { "ext-curl": "*", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "psr/log": "^1.1" }, "suggest": { "psr/log": "Required for using the Log middleware" }, "time": "2020-06-16T21:01:06+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "6.5-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "GuzzleHttp\\": "src/" }, "files": [ "src/functions_include.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" } ], "description": "Guzzle is a PHP HTTP client library", "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", "framework", "http", "http client", "rest", "web service" ] }, { "name": "guzzlehttp/promises", "version": "v1.3.1", "version_normalized": "1.3.1.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", "shasum": "", "mirrors": [ { "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", "preferred": true } ] }, "require": { "php": ">=5.5.0" }, "require-dev": { "phpunit/phpunit": "^4.0" }, "time": "2016-12-20T10:07:11+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.4-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "GuzzleHttp\\Promise\\": "src/" }, "files": [ "src/functions_include.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" } ], "description": "Guzzle promises library", "keywords": [ "promise" ] }, { "name": "guzzlehttp/psr7", "version": "1.6.1", "version_normalized": "1.6.1.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", "reference": "239400de7a173fe9901b9ac7c06497751f00727a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", "reference": "239400de7a173fe9901b9ac7c06497751f00727a", "shasum": "", "mirrors": [ { "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", "preferred": true } ] }, "require": { "php": ">=5.4.0", "psr/http-message": "~1.0", "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" }, "provide": { "psr/http-message-implementation": "1.0" }, "require-dev": { "ext-zlib": "*", "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" }, "suggest": { "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" }, "time": "2019-07-01T23:21:34+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.6-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" }, "files": [ "src/functions_include.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "Tobias Schultze", "homepage": "https://github.com/Tobion" } ], "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ "http", "message", "psr-7", "request", "response", "stream", "uri", "url" ] }, { "name": "psr/http-message", "version": "1.0.1", "version_normalized": "1.0.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "shasum": "", "mirrors": [ { "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", "preferred": true } ] }, "require": { "php": ">=5.3.0" }, "time": "2016-08-06T14:39:51+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", "http-message", "psr", "psr-7", "request", "response" ] }, { "name": "ralouphie/getallheaders", "version": "3.0.3", "version_normalized": "3.0.3.0", "source": { "type": "git", "url": "https://github.com/ralouphie/getallheaders.git", "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "", "mirrors": [ { "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", "preferred": true } ] }, "require": { "php": ">=5.6" }, "require-dev": { "php-coveralls/php-coveralls": "^2.1", "phpunit/phpunit": "^5 || ^6.5" }, "time": "2019-03-08T08:55:37+00:00", "type": "library", "installation-source": "dist", "autoload": { "files": [ "src/getallheaders.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ralph Khattar", "email": "ralph.khattar@gmail.com" } ], "description": "A polyfill for getallheaders." }, { "name": "symfony/polyfill-intl-idn", "version": "v1.17.1", "version_normalized": "1.17.1.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", "reference": "a57f8161502549a742a63c09f0a604997bf47027" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a57f8161502549a742a63c09f0a604997bf47027", "reference": "a57f8161502549a742a63c09f0a604997bf47027", "shasum": "", "mirrors": [ { "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", "preferred": true } ] }, "require": { "php": ">=5.3.3", "symfony/polyfill-mbstring": "^1.3", "symfony/polyfill-php72": "^1.10" }, "suggest": { "ext-intl": "For best performance" }, "time": "2020-06-06T08:46:27+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.17-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, "installation-source": "dist", "autoload": { "psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" }, "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Laurent Bassin", "email": "laurent@bassin.info" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "idn", "intl", "polyfill", "portable", "shim" ] }, { "name": "symfony/polyfill-mbstring", "version": "v1.17.1", "version_normalized": "1.17.1.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", "reference": "7110338d81ce1cbc3e273136e4574663627037a7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7110338d81ce1cbc3e273136e4574663627037a7", "reference": "7110338d81ce1cbc3e273136e4574663627037a7", "shasum": "", "mirrors": [ { "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", "preferred": true } ] }, "require": { "php": ">=5.3.3" }, "suggest": { "ext-mbstring": "For best performance" }, "time": "2020-06-06T08:46:27+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.17-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, "installation-source": "dist", "autoload": { "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", "mbstring", "polyfill", "portable", "shim" ] }, { "name": "symfony/polyfill-php72", "version": "v1.17.0", "version_normalized": "1.17.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", "reference": "f048e612a3905f34931127360bdd2def19a5e582" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582", "reference": "f048e612a3905f34931127360bdd2def19a5e582", "shasum": "", "mirrors": [ { "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", "preferred": true } ] }, "require": { "php": ">=5.3.3" }, "time": "2020-05-12T16:47:27+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.17-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Symfony\\Polyfill\\Php72\\": "" }, "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ] } ] ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/.php_cs ================================================ setRiskyAllowed(true) ->setRules([ '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], 'declare_strict_types' => false, 'concat_space' => ['spacing'=>'one'], 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], 'ordered_imports' => true, // 'phpdoc_align' => ['align'=>'vertical'], // 'native_function_invocation' => true, ]) ->setFinder( PhpCsFixer\Finder::create() ->in(__DIR__.'/src') ->in(__DIR__.'/tests') ->name('*.php') ) ; return $config; ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/CHANGELOG.md ================================================ # Change Log ## 6.5.5 - 2020-06-16 * Unpin version constraint for `symfony/polyfill-intl-idn` [#2678](https://github.com/guzzle/guzzle/pull/2678) ## 6.5.4 - 2020-05-25 * Fix various intl icu issues [#2626](https://github.com/guzzle/guzzle/pull/2626) ## 6.5.3 - 2020-04-18 * Use Symfony intl-idn polyfill [#2550](https://github.com/guzzle/guzzle/pull/2550) * Remove use of internal functions [#2548](https://github.com/guzzle/guzzle/pull/2548) ## 6.5.2 - 2019-12-23 * idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489) ## 6.5.1 - 2019-12-21 * Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454) * IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424) ## 6.5.0 - 2019-12-07 * Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143) * Improvement: Added support to pass arbitrary options to `curl_multi_init`. [#2287](https://github.com/guzzle/guzzle/pull/2287) * Fix: Gracefully handle passing `null` to the `header` option. [#2132](https://github.com/guzzle/guzzle/pull/2132) * Fix: `RetryMiddleware` did not do exponential delay between retries due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132) Previously, `RetryMiddleware` would sleep for 1 millisecond, then 2 milliseconds, then 4 milliseconds. **After this change, `RetryMiddleware` will sleep for 1 second, then 2 seconds, then 4 seconds.** `Middleware::retry()` accepts a second callback parameter to override the default timeouts if needed. * Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348) * Deprecated `ClientInterface::VERSION` ## 6.4.1 - 2019-10-23 * No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that * Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar` ## 6.4.0 - 2019-10-23 * Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108) * Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081) * Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161) * Improvement: Added `GuzzleHttp\Exception\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163) * Improvement: Added `GuzzleHttp\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242) * Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284) * Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273) * Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335) * Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362) ## 6.3.3 - 2018-04-22 * Fix: Default headers when decode_content is specified ## 6.3.2 - 2018-03-26 * Fix: Release process ## 6.3.1 - 2018-03-26 * Bug fix: Parsing 0 epoch expiry times in cookies [#2014](https://github.com/guzzle/guzzle/pull/2014) * Improvement: Better ConnectException detection [#2012](https://github.com/guzzle/guzzle/pull/2012) * Bug fix: Malformed domain that contains a "/" [#1999](https://github.com/guzzle/guzzle/pull/1999) * Bug fix: Undefined offset when a cookie has no first key-value pair [#1998](https://github.com/guzzle/guzzle/pull/1998) * Improvement: Support PHPUnit 6 [#1953](https://github.com/guzzle/guzzle/pull/1953) * Bug fix: Support empty headers [#1915](https://github.com/guzzle/guzzle/pull/1915) * Bug fix: Ignore case during header modifications [#1916](https://github.com/guzzle/guzzle/pull/1916) + Minor code cleanups, documentation fixes and clarifications. ## 6.3.0 - 2017-06-22 * Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659) * Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621) * Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580) * Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609) * Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641) * Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611) * Bug fix: PHP 7.x fixes [#1685](https://github.com/guzzle/guzzle/pull/1685), [#1686](https://github.com/guzzle/guzzle/pull/1686), [#1811](https://github.com/guzzle/guzzle/pull/1811) * Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642) * Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569) * Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711) * Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745) * Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721) * Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318) * Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684) * Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827) + Minor code cleanups, documentation fixes and clarifications. ## 6.2.3 - 2017-02-28 * Fix deprecations with guzzle/psr7 version 1.4 ## 6.2.2 - 2016-10-08 * Allow to pass nullable Response to delay callable * Only add scheme when host is present * Fix drain case where content-length is the literal string zero * Obfuscate in-URL credentials in exceptions ## 6.2.1 - 2016-07-18 * Address HTTP_PROXY security vulnerability, CVE-2016-5385: https://httpoxy.org/ * Fixing timeout bug with StreamHandler: https://github.com/guzzle/guzzle/pull/1488 * Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when a server does not honor `Connection: close`. * Ignore URI fragment when sending requests. ## 6.2.0 - 2016-03-21 * Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`. https://github.com/guzzle/guzzle/pull/1389 * Bug fix: Fix sleep calculation when waiting for delayed requests. https://github.com/guzzle/guzzle/pull/1324 * Feature: More flexible history containers. https://github.com/guzzle/guzzle/pull/1373 * Bug fix: defer sink stream opening in StreamHandler. https://github.com/guzzle/guzzle/pull/1377 * Bug fix: do not attempt to escape cookie values. https://github.com/guzzle/guzzle/pull/1406 * Feature: report original content encoding and length on decoded responses. https://github.com/guzzle/guzzle/pull/1409 * Bug fix: rewind seekable request bodies before dispatching to cURL. https://github.com/guzzle/guzzle/pull/1422 * Bug fix: provide an empty string to `http_build_query` for HHVM workaround. https://github.com/guzzle/guzzle/pull/1367 ## 6.1.1 - 2015-11-22 * Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4 * Feature: HandlerStack is now more generic. https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e * Bug fix: setting verify to false in the StreamHandler now disables peer verification. https://github.com/guzzle/guzzle/issues/1256 * Feature: Middleware now uses an exception factory, including more error context. https://github.com/guzzle/guzzle/pull/1282 * Feature: better support for disabled functions. https://github.com/guzzle/guzzle/pull/1287 * Bug fix: fixed regression where MockHandler was not using `sink`. https://github.com/guzzle/guzzle/pull/1292 ## 6.1.0 - 2015-09-08 * Feature: Added the `on_stats` request option to provide access to transfer statistics for requests. https://github.com/guzzle/guzzle/pull/1202 * Feature: Added the ability to persist session cookies in CookieJars. https://github.com/guzzle/guzzle/pull/1195 * Feature: Some compatibility updates for Google APP Engine https://github.com/guzzle/guzzle/pull/1216 * Feature: Added support for NO_PROXY to prevent the use of a proxy based on a simple set of rules. https://github.com/guzzle/guzzle/pull/1197 * Feature: Cookies can now contain square brackets. https://github.com/guzzle/guzzle/pull/1237 * Bug fix: Now correctly parsing `=` inside of quotes in Cookies. https://github.com/guzzle/guzzle/pull/1232 * Bug fix: Cusotm cURL options now correctly override curl options of the same name. https://github.com/guzzle/guzzle/pull/1221 * Bug fix: Content-Type header is now added when using an explicitly provided multipart body. https://github.com/guzzle/guzzle/pull/1218 * Bug fix: Now ignoring Set-Cookie headers that have no name. * Bug fix: Reason phrase is no longer cast to an int in some cases in the cURL handler. https://github.com/guzzle/guzzle/pull/1187 * Bug fix: Remove the Authorization header when redirecting if the Host header changes. https://github.com/guzzle/guzzle/pull/1207 * Bug fix: Cookie path matching fixes https://github.com/guzzle/guzzle/issues/1129 * Bug fix: Fixing the cURL `body_as_string` setting https://github.com/guzzle/guzzle/pull/1201 * Bug fix: quotes are no longer stripped when parsing cookies. https://github.com/guzzle/guzzle/issues/1172 * Bug fix: `form_params` and `query` now always uses the `&` separator. https://github.com/guzzle/guzzle/pull/1163 * Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set. https://github.com/guzzle/guzzle/pull/1189 ## 6.0.2 - 2015-07-04 * Fixed a memory leak in the curl handlers in which references to callbacks were not being removed by `curl_reset`. * Cookies are now extracted properly before redirects. * Cookies now allow more character ranges. * Decoded Content-Encoding responses are now modified to correctly reflect their state if the encoding was automatically removed by a handler. This means that the `Content-Encoding` header may be removed an the `Content-Length` modified to reflect the message size after removing the encoding. * Added a more explicit error message when trying to use `form_params` and `multipart` in the same request. * Several fixes for HHVM support. * Functions are now conditionally required using an additional level of indirection to help with global Composer installations. ## 6.0.1 - 2015-05-27 * Fixed a bug with serializing the `query` request option where the `&` separator was missing. * Added a better error message for when `body` is provided as an array. Please use `form_params` or `multipart` instead. * Various doc fixes. ## 6.0.0 - 2015-05-26 * See the UPGRADING.md document for more information. * Added `multipart` and `form_params` request options. * Added `synchronous` request option. * Added the `on_headers` request option. * Fixed `expect` handling. * No longer adding default middlewares in the client ctor. These need to be present on the provided handler in order to work. * Requests are no longer initiated when sending async requests with the CurlMultiHandler. This prevents unexpected recursion from requests completing while ticking the cURL loop. * Removed the semantics of setting `default` to `true`. This is no longer required now that the cURL loop is not ticked for async requests. * Added request and response logging middleware. * No longer allowing self signed certificates when using the StreamHandler. * Ensuring that `sink` is valid if saving to a file. * Request exceptions now include a "handler context" which provides handler specific contextual information. * Added `GuzzleHttp\RequestOptions` to allow request options to be applied using constants. * `$maxHandles` has been removed from CurlMultiHandler. * `MultipartPostBody` is now part of the `guzzlehttp/psr7` package. ## 5.3.0 - 2015-05-19 * Mock now supports `save_to` * Marked `AbstractRequestEvent::getTransaction()` as public. * Fixed a bug in which multiple headers using different casing would overwrite previous headers in the associative array. * Added `Utils::getDefaultHandler()` * Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated. * URL scheme is now always lowercased. ## 6.0.0-beta.1 * Requires PHP >= 5.5 * Updated to use PSR-7 * Requires immutable messages, which basically means an event based system owned by a request instance is no longer possible. * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7). * Removed the dependency on `guzzlehttp/streams`. These stream abstractions are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\Psr7` namespace. * Added middleware and handler system * Replaced the Guzzle event and subscriber system with a middleware system. * No longer depends on RingPHP, but rather places the HTTP handlers directly in Guzzle, operating on PSR-7 messages. * Retry logic is now encapsulated in `GuzzleHttp\Middleware::retry`, which means the `guzzlehttp/retry-subscriber` is now obsolete. * Mocking responses is now handled using `GuzzleHttp\Handler\MockHandler`. * Asynchronous responses * No longer supports the `future` request option to send an async request. Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`, `getAsync`, etc.). * Utilizing `GuzzleHttp\Promise` instead of React's promise library to avoid recursion required by chaining and forwarding react promises. See https://github.com/guzzle/promises * Added `requestAsync` and `sendAsync` to send request asynchronously. * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests asynchronously. * Request options * POST and form updates * Added the `form_fields` and `form_files` request options. * Removed the `GuzzleHttp\Post` namespace. * The `body` request option no longer accepts an array for POST requests. * The `exceptions` request option has been deprecated in favor of the `http_errors` request options. * The `save_to` request option has been deprecated in favor of `sink` request option. * Clients no longer accept an array of URI template string and variables for URI variables. You will need to expand URI templates before passing them into a client constructor or request method. * Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are now magic methods that will send synchronous requests. * Replaced `Utils.php` with plain functions in `functions.php`. * Removed `GuzzleHttp\Collection`. * Removed `GuzzleHttp\BatchResults`. Batched pool results are now returned as an array. * Removed `GuzzleHttp\Query`. Query string handling is now handled using an associative array passed into the `query` request option. The query string is serialized using PHP's `http_build_query`. If you need more control, you can pass the query string in as a string. * `GuzzleHttp\QueryParser` has been replaced with the `GuzzleHttp\Psr7\parse_query`. ## 5.2.0 - 2015-01-27 * Added `AppliesHeadersInterface` to make applying headers to a request based on the body more generic and not specific to `PostBodyInterface`. * Reduced the number of stack frames needed to send requests. * Nested futures are now resolved in the client rather than the RequestFsm * Finishing state transitions is now handled in the RequestFsm rather than the RingBridge. * Added a guard in the Pool class to not use recursion for request retries. ## 5.1.0 - 2014-12-19 * Pool class no longer uses recursion when a request is intercepted. * The size of a Pool can now be dynamically adjusted using a callback. See https://github.com/guzzle/guzzle/pull/943. * Setting a request option to `null` when creating a request with a client will ensure that the option is not set. This allows you to overwrite default request options on a per-request basis. See https://github.com/guzzle/guzzle/pull/937. * Added the ability to limit which protocols are allowed for redirects by specifying a `protocols` array in the `allow_redirects` request option. * Nested futures due to retries are now resolved when waiting for synchronous responses. See https://github.com/guzzle/guzzle/pull/947. * `"0"` is now an allowed URI path. See https://github.com/guzzle/guzzle/pull/935. * `Query` no longer typehints on the `$query` argument in the constructor, allowing for strings and arrays. * Exceptions thrown in the `end` event are now correctly wrapped with Guzzle specific exceptions if necessary. ## 5.0.3 - 2014-11-03 This change updates query strings so that they are treated as un-encoded values by default where the value represents an un-encoded value to send over the wire. A Query object then encodes the value before sending over the wire. This means that even value query string values (e.g., ":") are url encoded. This makes the Query class match PHP's http_build_query function. However, if you want to send requests over the wire using valid query string characters that do not need to be encoded, then you can provide a string to Url::setQuery() and pass true as the second argument to specify that the query string is a raw string that should not be parsed or encoded (unless a call to getQuery() is subsequently made, forcing the query-string to be converted into a Query object). ## 5.0.2 - 2014-10-30 * Added a trailing `\r\n` to multipart/form-data payloads. See https://github.com/guzzle/guzzle/pull/871 * Added a `GuzzleHttp\Pool::send()` convenience method to match the docs. * Status codes are now returned as integers. See https://github.com/guzzle/guzzle/issues/881 * No longer overwriting an existing `application/x-www-form-urlencoded` header when sending POST requests, allowing for customized headers. See https://github.com/guzzle/guzzle/issues/877 * Improved path URL serialization. * No longer double percent-encoding characters in the path or query string if they are already encoded. * Now properly encoding the supplied path to a URL object, instead of only encoding ' ' and '?'. * Note: This has been changed in 5.0.3 to now encode query string values by default unless the `rawString` argument is provided when setting the query string on a URL: Now allowing many more characters to be present in the query string without being percent encoded. See http://tools.ietf.org/html/rfc3986#appendix-A ## 5.0.1 - 2014-10-16 Bugfix release. * Fixed an issue where connection errors still returned response object in error and end events event though the response is unusable. This has been corrected so that a response is not returned in the `getResponse` method of these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867 * Fixed an issue where transfer statistics were not being populated in the RingBridge. https://github.com/guzzle/guzzle/issues/866 ## 5.0.0 - 2014-10-12 Adding support for non-blocking responses and some minor API cleanup. ### New Features * Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`. * Added a public API for creating a default HTTP adapter. * Updated the redirect plugin to be non-blocking so that redirects are sent concurrently. Other plugins like this can now be updated to be non-blocking. * Added a "progress" event so that you can get upload and download progress events. * Added `GuzzleHttp\Pool` which implements FutureInterface and transfers requests concurrently using a capped pool size as efficiently as possible. * Added `hasListeners()` to EmitterInterface. * Removed `GuzzleHttp\ClientInterface::sendAll` and marked `GuzzleHttp\Client::sendAll` as deprecated (it's still there, just not the recommended way). ### Breaking changes The breaking changes in this release are relatively minor. The biggest thing to look out for is that request and response objects no longer implement fluent interfaces. * Removed the fluent interfaces (i.e., `return $this`) from requests, responses, `GuzzleHttp\Collection`, `GuzzleHttp\Url`, `GuzzleHttp\Query`, `GuzzleHttp\Post\PostBody`, and `GuzzleHttp\Cookie\SetCookie`. This blog post provides a good outline of why I did this: http://ocramius.github.io/blog/fluent-interfaces-are-evil/. This also makes the Guzzle message interfaces compatible with the current PSR-7 message proposal. * Removed "functions.php", so that Guzzle is truly PSR-4 compliant. Except for the HTTP request functions from function.php, these functions are now implemented in `GuzzleHttp\Utils` using camelCase. `GuzzleHttp\json_decode` moved to `GuzzleHttp\Utils::jsonDecode`. `GuzzleHttp\get_path` moved to `GuzzleHttp\Utils::getPath`. `GuzzleHttp\set_path` moved to `GuzzleHttp\Utils::setPath`. `GuzzleHttp\batch` should now be `GuzzleHttp\Pool::batch`, which returns an `objectStorage`. Using functions.php caused problems for many users: they aren't PSR-4 compliant, require an explicit include, and needed an if-guard to ensure that the functions are not declared multiple times. * Rewrote adapter layer. * Removing all classes from `GuzzleHttp\Adapter`, these are now implemented as callables that are stored in `GuzzleHttp\Ring\Client`. * Removed the concept of "parallel adapters". Sending requests serially or concurrently is now handled using a single adapter. * Moved `GuzzleHttp\Adapter\Transaction` to `GuzzleHttp\Transaction`. The Transaction object now exposes the request, response, and client as public properties. The getters and setters have been removed. * Removed the "headers" event. This event was only useful for changing the body a response once the headers of the response were known. You can implement a similar behavior in a number of ways. One example might be to use a FnStream that has access to the transaction being sent. For example, when the first byte is written, you could check if the response headers match your expectations, and if so, change the actual stream body that is being written to. * Removed the `asArray` parameter from `GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header value as an array, then use the newly added `getHeaderAsArray()` method of `MessageInterface`. This change makes the Guzzle interfaces compatible with the PSR-7 interfaces. * `GuzzleHttp\Message\MessageFactory` no longer allows subclasses to add custom request options using double-dispatch (this was an implementation detail). Instead, you should now provide an associative array to the constructor which is a mapping of the request option name mapping to a function that applies the option value to a request. * Removed the concept of "throwImmediately" from exceptions and error events. This control mechanism was used to stop a transfer of concurrent requests from completing. This can now be handled by throwing the exception or by cancelling a pool of requests or each outstanding future request individually. * Updated to "GuzzleHttp\Streams" 3.0. * `GuzzleHttp\Stream\StreamInterface::getContents()` no longer accepts a `maxLen` parameter. This update makes the Guzzle streams project compatible with the current PSR-7 proposal. * `GuzzleHttp\Stream\Stream::__construct`, `GuzzleHttp\Stream\Stream::factory`, and `GuzzleHttp\Stream\Utils::create` no longer accept a size in the second argument. They now accept an associative array of options, including the "size" key and "metadata" key which can be used to provide custom metadata. ## 4.2.2 - 2014-09-08 * Fixed a memory leak in the CurlAdapter when reusing cURL handles. * No longer using `request_fulluri` in stream adapter proxies. * Relative redirects are now based on the last response, not the first response. ## 4.2.1 - 2014-08-19 * Ensuring that the StreamAdapter does not always add a Content-Type header * Adding automated github releases with a phar and zip ## 4.2.0 - 2014-08-17 * Now merging in default options using a case-insensitive comparison. Closes https://github.com/guzzle/guzzle/issues/767 * Added the ability to automatically decode `Content-Encoding` response bodies using the `decode_content` request option. This is set to `true` by default to decode the response body if it comes over the wire with a `Content-Encoding`. Set this value to `false` to disable decoding the response content, and pass a string to provide a request `Accept-Encoding` header and turn on automatic response decoding. This feature now allows you to pass an `Accept-Encoding` header in the headers of a request but still disable automatic response decoding. Closes https://github.com/guzzle/guzzle/issues/764 * Added the ability to throw an exception immediately when transferring requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760 * Updating guzzlehttp/streams dependency to ~2.1 * No longer utilizing the now deprecated namespaced methods from the stream package. ## 4.1.8 - 2014-08-14 * Fixed an issue in the CurlFactory that caused setting the `stream=false` request option to throw an exception. See: https://github.com/guzzle/guzzle/issues/769 * TransactionIterator now calls rewind on the inner iterator. See: https://github.com/guzzle/guzzle/pull/765 * You can now set the `Content-Type` header to `multipart/form-data` when creating POST requests to force multipart bodies. See https://github.com/guzzle/guzzle/issues/768 ## 4.1.7 - 2014-08-07 * Fixed an error in the HistoryPlugin that caused the same request and response to be logged multiple times when an HTTP protocol error occurs. * Ensuring that cURL does not add a default Content-Type when no Content-Type has been supplied by the user. This prevents the adapter layer from modifying the request that is sent over the wire after any listeners may have already put the request in a desired state (e.g., signed the request). * Throwing an exception when you attempt to send requests that have the "stream" set to true in parallel using the MultiAdapter. * Only calling curl_multi_select when there are active cURL handles. This was previously changed and caused performance problems on some systems due to PHP always selecting until the maximum select timeout. * Fixed a bug where multipart/form-data POST fields were not correctly aggregated (e.g., values with "&"). ## 4.1.6 - 2014-08-03 * Added helper methods to make it easier to represent messages as strings, including getting the start line and getting headers as a string. ## 4.1.5 - 2014-08-02 * Automatically retrying cURL "Connection died, retrying a fresh connect" errors when possible. * cURL implementation cleanup * Allowing multiple event subscriber listeners to be registered per event by passing an array of arrays of listener configuration. ## 4.1.4 - 2014-07-22 * Fixed a bug that caused multi-part POST requests with more than one field to serialize incorrectly. * Paths can now be set to "0" * `ResponseInterface::xml` now accepts a `libxml_options` option and added a missing default argument that was required when parsing XML response bodies. * A `save_to` stream is now created lazily, which means that files are not created on disk unless a request succeeds. ## 4.1.3 - 2014-07-15 * Various fixes to multipart/form-data POST uploads * Wrapping function.php in an if-statement to ensure Guzzle can be used globally and in a Composer install * Fixed an issue with generating and merging in events to an event array * POST headers are only applied before sending a request to allow you to change the query aggregator used before uploading * Added much more robust query string parsing * Fixed various parsing and normalization issues with URLs * Fixing an issue where multi-valued headers were not being utilized correctly in the StreamAdapter ## 4.1.2 - 2014-06-18 * Added support for sending payloads with GET requests ## 4.1.1 - 2014-06-08 * Fixed an issue related to using custom message factory options in subclasses * Fixed an issue with nested form fields in a multi-part POST * Fixed an issue with using the `json` request option for POST requests * Added `ToArrayInterface` to `GuzzleHttp\Cookie\CookieJar` ## 4.1.0 - 2014-05-27 * Added a `json` request option to easily serialize JSON payloads. * Added a `GuzzleHttp\json_decode()` wrapper to safely parse JSON. * Added `setPort()` and `getPort()` to `GuzzleHttp\Message\RequestInterface`. * Added the ability to provide an emitter to a client in the client constructor. * Added the ability to persist a cookie session using $_SESSION. * Added a trait that can be used to add event listeners to an iterator. * Removed request method constants from RequestInterface. * Fixed warning when invalid request start-lines are received. * Updated MessageFactory to work with custom request option methods. * Updated cacert bundle to latest build. 4.0.2 (2014-04-16) ------------------ * Proxy requests using the StreamAdapter now properly use request_fulluri (#632) * Added the ability to set scalars as POST fields (#628) ## 4.0.1 - 2014-04-04 * The HTTP status code of a response is now set as the exception code of RequestException objects. * 303 redirects will now correctly switch from POST to GET requests. * The default parallel adapter of a client now correctly uses the MultiAdapter. * HasDataTrait now initializes the internal data array as an empty array so that the toArray() method always returns an array. ## 4.0.0 - 2014-03-29 * For more information on the 4.0 transition, see: http://mtdowling.com/blog/2014/03/15/guzzle-4-rc/ * For information on changes and upgrading, see: https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 * Added `GuzzleHttp\batch()` as a convenience function for sending requests in parallel without needing to write asynchronous code. * Restructured how events are added to `GuzzleHttp\ClientInterface::sendAll()`. You can now pass a callable or an array of associative arrays where each associative array contains the "fn", "priority", and "once" keys. ## 4.0.0.rc-2 - 2014-03-25 * Removed `getConfig()` and `setConfig()` from clients to avoid confusion around whether things like base_url, message_factory, etc. should be able to be retrieved or modified. * Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface * functions.php functions were renamed using snake_case to match PHP idioms * Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and `GUZZLE_CURL_SELECT_TIMEOUT` environment variables * Added the ability to specify custom `sendAll()` event priorities * Added the ability to specify custom stream context options to the stream adapter. * Added a functions.php function for `get_path()` and `set_path()` * CurlAdapter and MultiAdapter now use a callable to generate curl resources * MockAdapter now properly reads a body and emits a `headers` event * Updated Url class to check if a scheme and host are set before adding ":" and "//". This allows empty Url (e.g., "") to be serialized as "". * Parsing invalid XML no longer emits warnings * Curl classes now properly throw AdapterExceptions * Various performance optimizations * Streams are created with the faster `Stream\create()` function * Marked deprecation_proxy() as internal * Test server is now a collection of static methods on a class ## 4.0.0-rc.1 - 2014-03-15 * See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 ## 3.8.1 - 2014-01-28 * Bug: Always using GET requests when redirecting from a 303 response * Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in `Guzzle\Http\ClientInterface::setSslVerification()` * Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL * Bug: The body of a request can now be set to `"0"` * Sending PHP stream requests no longer forces `HTTP/1.0` * Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of each sub-exception * Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than clobbering everything). * Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators) * Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`. For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`. * Now properly escaping the regular expression delimiter when matching Cookie domains. * Network access is now disabled when loading XML documents ## 3.8.0 - 2013-12-05 * Added the ability to define a POST name for a file * JSON response parsing now properly walks additionalProperties * cURL error code 18 is now retried automatically in the BackoffPlugin * Fixed a cURL error when URLs contain fragments * Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were CurlExceptions * CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e) * Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS` * Fixed a bug that was encountered when parsing empty header parameters * UriTemplate now has a `setRegex()` method to match the docs * The `debug` request parameter now checks if it is truthy rather than if it exists * Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin * Added the ability to combine URLs using strict RFC 3986 compliance * Command objects can now return the validation errors encountered by the command * Various fixes to cache revalidation (#437 and 29797e5) * Various fixes to the AsyncPlugin * Cleaned up build scripts ## 3.7.4 - 2013-10-02 * Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430) * Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp (see https://github.com/aws/aws-sdk-php/issues/147) * Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots * Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420) * Updated the bundled cacert.pem (#419) * OauthPlugin now supports adding authentication to headers or query string (#425) ## 3.7.3 - 2013-09-08 * Added the ability to get the exception associated with a request/command when using `MultiTransferException` and `CommandTransferException`. * Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description * Schemas are only injected into response models when explicitly configured. * No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of an EntityBody. * Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator. * Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`. * Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody() * Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin * Bug fix: Visiting XML attributes first before visiting XML children when serializing requests * Bug fix: Properly parsing headers that contain commas contained in quotes * Bug fix: mimetype guessing based on a filename is now case-insensitive ## 3.7.2 - 2013-08-02 * Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander See https://github.com/guzzle/guzzle/issues/371 * Bug fix: Cookie domains are now matched correctly according to RFC 6265 See https://github.com/guzzle/guzzle/issues/377 * Bug fix: GET parameters are now used when calculating an OAuth signature * Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted * `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched * `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input. See https://github.com/guzzle/guzzle/issues/379 * Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See https://github.com/guzzle/guzzle/pull/380 * cURL multi cleanup and optimizations ## 3.7.1 - 2013-07-05 * Bug fix: Setting default options on a client now works * Bug fix: Setting options on HEAD requests now works. See #352 * Bug fix: Moving stream factory before send event to before building the stream. See #353 * Bug fix: Cookies no longer match on IP addresses per RFC 6265 * Bug fix: Correctly parsing header parameters that are in `<>` and quotes * Added `cert` and `ssl_key` as request options * `Host` header can now diverge from the host part of a URL if the header is set manually * `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter * OAuth parameters are only added via the plugin if they aren't already set * Exceptions are now thrown when a URL cannot be parsed * Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails * Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin ## 3.7.0 - 2013-06-10 * See UPGRADING.md for more information on how to upgrade. * Requests now support the ability to specify an array of $options when creating a request to more easily modify a request. You can pass a 'request.options' configuration setting to a client to apply default request options to every request created by a client (e.g. default query string variables, headers, curl options, etc.). * Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`. See `Guzzle\Http\StaticClient::mount`. * Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests created by a command (e.g. custom headers, query string variables, timeout settings, etc.). * Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the headers of a response * Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`) * ServiceBuilders now support storing and retrieving arbitrary data * CachePlugin can now purge all resources for a given URI * CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource * CachePlugin now uses the Vary header to determine if a resource is a cache hit * `Guzzle\Http\Message\Response` now implements `\Serializable` * Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters * `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable * Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()` * Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size * `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message * Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older Symfony users can still use the old version of Monolog. * Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`. Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`. * Several performance improvements to `Guzzle\Common\Collection` * Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: createRequest, head, delete, put, patch, post, options, prepareRequest * Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` * Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` * Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a resource, string, or EntityBody into the $options parameter to specify the download location of the response. * Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a default `array()` * Added `Guzzle\Stream\StreamInterface::isRepeatable` * Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`. * Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`. * Removed `Guzzle\Http\ClientInterface::expandTemplate()` * Removed `Guzzle\Http\ClientInterface::setRequestFactory()` * Removed `Guzzle\Http\ClientInterface::getCurlMulti()` * Removed `Guzzle\Http\Message\RequestInterface::canCache` * Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect` * Removed `Guzzle\Http\Message\RequestInterface::isRedirect` * Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. * You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting `Guzzle\Common\Version::$emitWarnings` to true. * Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead. * Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. * Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. * Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. * Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. * Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated * Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0 * Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params]. * Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. * Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`. * Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. * Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. * Marked `Guzzle\Common\Collection::inject()` as deprecated. * Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');` * CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a CacheStorageInterface. These two objects and interface will be removed in a future version. * Always setting X-cache headers on cached responses * Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin * `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface $request, Response $response);` * `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` * `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` * Added `CacheStorageInterface::purge($url)` * `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, CanCacheStrategyInterface $canCache = null)` * Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` ## 3.6.0 - 2013-05-29 * ServiceDescription now implements ToArrayInterface * Added command.hidden_params to blacklist certain headers from being treated as additionalParameters * Guzzle can now correctly parse incomplete URLs * Mixed casing of headers are now forced to be a single consistent casing across all values for that header. * Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution * Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). * Specific header implementations can be created for complex headers. When a message creates a header, it uses a HeaderFactory which can map specific headers to specific header classes. There is now a Link header and CacheControl header implementation. * Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate * Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() * Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in Guzzle\Http\Curl\RequestMediator * Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. * Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface * Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() * Removed Guzzle\Parser\ParserRegister::get(). Use getParser() * Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). * All response header helper functions return a string rather than mixing Header objects and strings inconsistently * Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle directly via interfaces * Removed the injecting of a request object onto a response object. The methods to get and set a request still exist but are a no-op until removed. * Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a `Guzzle\Service\Command\ArrayCommandInterface`. * Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response on a request while the request is still being transferred * The ability to case-insensitively search for header values * Guzzle\Http\Message\Header::hasExactHeader * Guzzle\Http\Message\Header::raw. Use getAll() * Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object instead. * `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess * Added the ability to cast Model objects to a string to view debug information. ## 3.5.0 - 2013-05-13 * Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times * Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove itself from the EventDispatcher) * Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values * Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too * Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a non-existent key * Bug: All __call() method arguments are now required (helps with mocking frameworks) * Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference to help with refcount based garbage collection of resources created by sending a request * Deprecating ZF1 cache and log adapters. These will be removed in the next major version. * Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the HistoryPlugin for a history. * Added a `responseBody` alias for the `response_body` location * Refactored internals to no longer rely on Response::getRequest() * HistoryPlugin can now be cast to a string * HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests and responses that are sent over the wire * Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects ## 3.4.3 - 2013-04-30 * Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response * Added a check to re-extract the temp cacert bundle from the phar before sending each request ## 3.4.2 - 2013-04-29 * Bug fix: Stream objects now work correctly with "a" and "a+" modes * Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present * Bug fix: AsyncPlugin no longer forces HEAD requests * Bug fix: DateTime timezones are now properly handled when using the service description schema formatter * Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails * Setting a response on a request will write to the custom request body from the response body if one is specified * LogPlugin now writes to php://output when STDERR is undefined * Added the ability to set multiple POST files for the same key in a single call * application/x-www-form-urlencoded POSTs now use the utf-8 charset by default * Added the ability to queue CurlExceptions to the MockPlugin * Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send) * Configuration loading now allows remote files ## 3.4.1 - 2013-04-16 * Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost. * Exceptions are now properly grouped when sending requests in parallel * Redirects are now properly aggregated when a multi transaction fails * Redirects now set the response on the original object even in the event of a failure * Bug fix: Model names are now properly set even when using $refs * Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax * Added support for oauth_callback in OAuth signatures * Added support for oauth_verifier in OAuth signatures * Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection ## 3.4.0 - 2013-04-11 * Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289 * Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289 * Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263 * Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264. * Bug fix: Added `number` type to service descriptions. * Bug fix: empty parameters are removed from an OAuth signature * Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header * Bug fix: Fixed "array to string" error when validating a union of types in a service description * Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream * Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin. * Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs. * The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections. * Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if the Content-Type can be determined based on the entity body or the path of the request. * Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder. * Added support for a PSR-3 LogAdapter. * Added a `command.after_prepare` event * Added `oauth_callback` parameter to the OauthPlugin * Added the ability to create a custom stream class when using a stream factory * Added a CachingEntityBody decorator * Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized. * The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar. * You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies * POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use POST fields or files (the latter is only used when emulating a form POST in the browser). * Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest ## 3.3.1 - 2013-03-10 * Added the ability to create PHP streaming responses from HTTP requests * Bug fix: Running any filters when parsing response headers with service descriptions * Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing * Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across response location visitors. * Bug fix: Removed the possibility of creating configuration files with circular dependencies * RequestFactory::create() now uses the key of a POST file when setting the POST file name * Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set ## 3.3.0 - 2013-03-03 * A large number of performance optimizations have been made * Bug fix: Added 'wb' as a valid write mode for streams * Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned * Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()` * BC: Removed `Guzzle\Http\Utils` class * BC: Setting a service description on a client will no longer modify the client's command factories. * BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' * BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to lowercase * Operation parameter objects are now lazy loaded internally * Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses * Added support for instantiating responseType=class responseClass classes. Classes must implement `Guzzle\Service\Command\ResponseClassInterface` * Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These additional properties also support locations and can be used to parse JSON responses where the outermost part of the JSON is an array * Added support for nested renaming of JSON models (rename sentAs to name) * CachePlugin * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error * Debug headers can now added to cached response in the CachePlugin ## 3.2.0 - 2013-02-14 * CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients. * URLs with no path no longer contain a "/" by default * Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url. * BadResponseException no longer includes the full request and response message * Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface * Adding getResponseBody() to Guzzle\Http\Message\RequestInterface * Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription * Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list * xmlEncoding can now be customized for the XML declaration of a XML service description operation * Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value aggregation and no longer uses callbacks * The URL encoding implementation of Guzzle\Http\QueryString can now be customized * Bug fix: Filters were not always invoked for array service description parameters * Bug fix: Redirects now use a target response body rather than a temporary response body * Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded * Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives ## 3.1.2 - 2013-01-27 * Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the response body. For example, the XmlVisitor now parses the XML response into an array in the before() method. * Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent * CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444) * Fixed a bug where redirect responses were not chained correctly using getPreviousResponse() * Setting default headers on a client after setting the user-agent will not erase the user-agent setting ## 3.1.1 - 2013-01-20 * Adding wildcard support to Guzzle\Common\Collection::getPath() * Adding alias support to ServiceBuilder configs * Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface ## 3.1.0 - 2013-01-12 * BC: CurlException now extends from RequestException rather than BadResponseException * BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse() * Added getData to ServiceDescriptionInterface * Added context array to RequestInterface::setState() * Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http * Bug: Adding required content-type when JSON request visitor adds JSON to a command * Bug: Fixing the serialization of a service description with custom data * Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing an array of successful and failed responses * Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection * Added Guzzle\Http\IoEmittingEntityBody * Moved command filtration from validators to location visitors * Added `extends` attributes to service description parameters * Added getModels to ServiceDescriptionInterface ## 3.0.7 - 2012-12-19 * Fixing phar detection when forcing a cacert to system if null or true * Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()` * Cleaning up `Guzzle\Common\Collection::inject` method * Adding a response_body location to service descriptions ## 3.0.6 - 2012-12-09 * CurlMulti performance improvements * Adding setErrorResponses() to Operation * composer.json tweaks ## 3.0.5 - 2012-11-18 * Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin * Bug: Response body can now be a string containing "0" * Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert * Bug: QueryString::fromString now properly parses query string parameters that contain equal signs * Added support for XML attributes in service description responses * DefaultRequestSerializer now supports array URI parameter values for URI template expansion * Added better mimetype guessing to requests and post files ## 3.0.4 - 2012-11-11 * Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value * Bug: Cookies can now be added that have a name, domain, or value set to "0" * Bug: Using the system cacert bundle when using the Phar * Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures * Enhanced cookie jar de-duplication * Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added * Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies * Added the ability to create any sort of hash for a stream rather than just an MD5 hash ## 3.0.3 - 2012-11-04 * Implementing redirects in PHP rather than cURL * Added PECL URI template extension and using as default parser if available * Bug: Fixed Content-Length parsing of Response factory * Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams. * Adding ToArrayInterface throughout library * Fixing OauthPlugin to create unique nonce values per request ## 3.0.2 - 2012-10-25 * Magic methods are enabled by default on clients * Magic methods return the result of a command * Service clients no longer require a base_url option in the factory * Bug: Fixed an issue with URI templates where null template variables were being expanded ## 3.0.1 - 2012-10-22 * Models can now be used like regular collection objects by calling filter, map, etc. * Models no longer require a Parameter structure or initial data in the constructor * Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator` ## 3.0.0 - 2012-10-15 * Rewrote service description format to be based on Swagger * Now based on JSON schema * Added nested input structures and nested response models * Support for JSON and XML input and output models * Renamed `commands` to `operations` * Removed dot class notation * Removed custom types * Broke the project into smaller top-level namespaces to be more component friendly * Removed support for XML configs and descriptions. Use arrays or JSON files. * Removed the Validation component and Inspector * Moved all cookie code to Guzzle\Plugin\Cookie * Magic methods on a Guzzle\Service\Client now return the command un-executed. * Calling getResult() or getResponse() on a command will lazily execute the command if needed. * Now shipping with cURL's CA certs and using it by default * Added previousResponse() method to response objects * No longer sending Accept and Accept-Encoding headers on every request * Only sending an Expect header by default when a payload is greater than 1MB * Added/moved client options: * curl.blacklist to curl.option.blacklist * Added ssl.certificate_authority * Added a Guzzle\Iterator component * Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin * Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin) * Added a more robust caching plugin * Added setBody to response objects * Updating LogPlugin to use a more flexible MessageFormatter * Added a completely revamped build process * Cleaning up Collection class and removing default values from the get method * Fixed ZF2 cache adapters ## 2.8.8 - 2012-10-15 * Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did ## 2.8.7 - 2012-09-30 * Bug: Fixed config file aliases for JSON includes * Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests * Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload * Bug: Hardening request and response parsing to account for missing parts * Bug: Fixed PEAR packaging * Bug: Fixed Request::getInfo * Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail * Adding the ability for the namespace Iterator factory to look in multiple directories * Added more getters/setters/removers from service descriptions * Added the ability to remove POST fields from OAuth signatures * OAuth plugin now supports 2-legged OAuth ## 2.8.6 - 2012-09-05 * Added the ability to modify and build service descriptions * Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command * Added a `json` parameter location * Now allowing dot notation for classes in the CacheAdapterFactory * Using the union of two arrays rather than an array_merge when extending service builder services and service params * Ensuring that a service is a string before doing strpos() checks on it when substituting services for references in service builder config files. * Services defined in two different config files that include one another will by default replace the previously defined service, but you can now create services that extend themselves and merge their settings over the previous * The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like '_default' with a default JSON configuration file. ## 2.8.5 - 2012-08-29 * Bug: Suppressed empty arrays from URI templates * Bug: Added the missing $options argument from ServiceDescription::factory to enable caching * Added support for HTTP responses that do not contain a reason phrase in the start-line * AbstractCommand commands are now invokable * Added a way to get the data used when signing an Oauth request before a request is sent ## 2.8.4 - 2012-08-15 * Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin * Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable. * Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream * Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream * Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5()) * Added additional response status codes * Removed SSL information from the default User-Agent header * DELETE requests can now send an entity body * Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries * Added the ability of the MockPlugin to consume mocked request bodies * LogPlugin now exposes request and response objects in the extras array ## 2.8.3 - 2012-07-30 * Bug: Fixed a case where empty POST requests were sent as GET requests * Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body * Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new * Added multiple inheritance to service description commands * Added an ApiCommandInterface and added `getParamNames()` and `hasParam()` * Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything * Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles ## 2.8.2 - 2012-07-24 * Bug: Query string values set to 0 are no longer dropped from the query string * Bug: A Collection object is no longer created each time a call is made to `Guzzle\Service\Command\AbstractCommand::getRequestHeaders()` * Bug: `+` is now treated as an encoded space when parsing query strings * QueryString and Collection performance improvements * Allowing dot notation for class paths in filters attribute of a service descriptions ## 2.8.1 - 2012-07-16 * Loosening Event Dispatcher dependency * POST redirects can now be customized using CURLOPT_POSTREDIR ## 2.8.0 - 2012-07-15 * BC: Guzzle\Http\Query * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl) * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding() * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool) * Changed the aggregation functions of QueryString to be static methods * Can now use fromString() with querystrings that have a leading ? * cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters * Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body * Cookies are no longer URL decoded by default * Bug: URI template variables set to null are no longer expanded ## 2.7.2 - 2012-07-02 * BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser. * BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty() * CachePlugin now allows for a custom request parameter function to check if a request can be cached * Bug fix: CachePlugin now only caches GET and HEAD requests by default * Bug fix: Using header glue when transferring headers over the wire * Allowing deeply nested arrays for composite variables in URI templates * Batch divisors can now return iterators or arrays ## 2.7.1 - 2012-06-26 * Minor patch to update version number in UA string * Updating build process ## 2.7.0 - 2012-06-25 * BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes. * BC: Removed magic setX methods from commands * BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method * Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable. * Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity) * Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace * Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin * Added the ability to set POST fields and files in a service description * Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method * Adding a command.before_prepare event to clients * Added BatchClosureTransfer and BatchClosureDivisor * BatchTransferException now includes references to the batch divisor and transfer strategies * Fixed some tests so that they pass more reliably * Added Guzzle\Common\Log\ArrayLogAdapter ## 2.6.6 - 2012-06-10 * BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin * BC: Removing Guzzle\Service\Command\CommandSet * Adding generic batching system (replaces the batch queue plugin and command set) * Updating ZF cache and log adapters and now using ZF's composer repository * Bug: Setting the name of each ApiParam when creating through an ApiCommand * Adding result_type, result_doc, deprecated, and doc_url to service descriptions * Bug: Changed the default cookie header casing back to 'Cookie' ## 2.6.5 - 2012-06-03 * BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource() * BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from * BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data * BC: Renaming methods in the CookieJarInterface * Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations * Making the default glue for HTTP headers ';' instead of ',' * Adding a removeValue to Guzzle\Http\Message\Header * Adding getCookies() to request interface. * Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber() ## 2.6.4 - 2012-05-30 * BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class. * BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand * Bug: Fixing magic method command calls on clients * Bug: Email constraint only validates strings * Bug: Aggregate POST fields when POST files are present in curl handle * Bug: Fixing default User-Agent header * Bug: Only appending or prepending parameters in commands if they are specified * Bug: Not requiring response reason phrases or status codes to match a predefined list of codes * Allowing the use of dot notation for class namespaces when using instance_of constraint * Added any_match validation constraint * Added an AsyncPlugin * Passing request object to the calculateWait method of the ExponentialBackoffPlugin * Allowing the result of a command object to be changed * Parsing location and type sub values when instantiating a service description rather than over and over at runtime ## 2.6.3 - 2012-05-23 * [BC] Guzzle\Common\FromConfigInterface no longer requires any config options. * [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields. * You can now use an array of data when creating PUT request bodies in the request factory. * Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable. * [Http] Adding support for Content-Type in multipart POST uploads per upload * [Http] Added support for uploading multiple files using the same name (foo[0], foo[1]) * Adding more POST data operations for easier manipulation of POST data. * You can now set empty POST fields. * The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files. * Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate. * CS updates ## 2.6.2 - 2012-05-19 * [Http] Better handling of nested scope requests in CurlMulti. Requests are now always prepares in the send() method rather than the addRequest() method. ## 2.6.1 - 2012-05-19 * [BC] Removing 'path' support in service descriptions. Use 'uri'. * [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache. * [BC] Removing Guzzle\Common\NullObject. Use https://github.com/mtdowling/NullObject if you need it. * [BC] Removing Guzzle\Common\XmlElement. * All commands, both dynamic and concrete, have ApiCommand objects. * Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits. * Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored. * Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible. ## 2.6.0 - 2012-05-15 * [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder * [BC] Executing a Command returns the result of the command rather than the command * [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed. * [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args. * [BC] Moving ResourceIterator* to Guzzle\Service\Resource * [BC] Completely refactored ResourceIterators to iterate over a cloned command object * [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate * [BC] Guzzle\Guzzle is now deprecated * Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject * Adding Guzzle\Version class to give version information about Guzzle * Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate() * Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data * ServiceDescription and ServiceBuilder are now cacheable using similar configs * Changing the format of XML and JSON service builder configs. Backwards compatible. * Cleaned up Cookie parsing * Trimming the default Guzzle User-Agent header * Adding a setOnComplete() method to Commands that is called when a command completes * Keeping track of requests that were mocked in the MockPlugin * Fixed a caching bug in the CacheAdapterFactory * Inspector objects can be injected into a Command object * Refactoring a lot of code and tests to be case insensitive when dealing with headers * Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL * Adding the ability to set global option overrides to service builder configs * Adding the ability to include other service builder config files from within XML and JSON files * Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method. ## 2.5.0 - 2012-05-08 * Major performance improvements * [BC] Simplifying Guzzle\Common\Collection. Please check to see if you are using features that are now deprecated. * [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component. * [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates. Use "{}" * Added the ability to passed parameters to all requests created by a client * Added callback functionality to the ExponentialBackoffPlugin * Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies. * Rewinding request stream bodies when retrying requests * Exception is thrown when JSON response body cannot be decoded * Added configurable magic method calls to clients and commands. This is off by default. * Fixed a defect that added a hash to every parsed URL part * Fixed duplicate none generation for OauthPlugin. * Emitting an event each time a client is generated by a ServiceBuilder * Using an ApiParams object instead of a Collection for parameters of an ApiCommand * cache.* request parameters should be renamed to params.cache.* * Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle. * Added the ability to disable type validation of service descriptions * ServiceDescriptions and ServiceBuilders are now Serializable ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/Dockerfile ================================================ FROM composer:latest as setup RUN mkdir /guzzle WORKDIR /guzzle RUN set -xe \ && composer init --name=guzzlehttp/test --description="Simple project for testing Guzzle scripts" --author="Márk Sági-Kazár " --no-interaction \ && composer require guzzlehttp/guzzle FROM php:7.3 RUN mkdir /guzzle WORKDIR /guzzle COPY --from=setup /guzzle /guzzle ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/LICENSE ================================================ Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/README.md ================================================ Guzzle, PHP HTTP client ======================= [![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases) [![Build Status](https://img.shields.io/travis/guzzle/guzzle.svg?style=flat-square)](https://travis-ci.org/guzzle/guzzle) [![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle) Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and trivial to integrate with web services. - Simple interface for building query strings, POST requests, streaming large uploads, streaming large downloads, using HTTP cookies, uploading JSON data, etc... - Can send both synchronous and asynchronous requests using the same interface. - Uses PSR-7 interfaces for requests, responses, and streams. This allows you to utilize other PSR-7 compatible libraries with Guzzle. - Abstracts away the underlying HTTP transport, allowing you to write environment and transport agnostic code; i.e., no hard dependency on cURL, PHP streams, sockets, or non-blocking event loops. - Middleware system allows you to augment and compose client behavior. ```php $client = new \GuzzleHttp\Client(); $response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle'); echo $response->getStatusCode(); # 200 echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8' echo $response->getBody(); # '{"id": 1420053, "name": "guzzle", ...}' # Send an asynchronous request. $request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org'); $promise = $client->sendAsync($request)->then(function ($response) { echo 'I completed! ' . $response->getBody(); }); $promise->wait(); ``` ## Help and docs - [Documentation](http://guzzlephp.org/) - [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle) - [Gitter](https://gitter.im/guzzle/guzzle) ## Installing Guzzle The recommended way to install Guzzle is through [Composer](http://getcomposer.org). ```bash # Install Composer curl -sS https://getcomposer.org/installer | php ``` Next, run the Composer command to install the latest stable version of Guzzle: ```bash composer require guzzlehttp/guzzle ``` After installing, you need to require Composer's autoloader: ```php require 'vendor/autoload.php'; ``` You can then later update Guzzle using composer: ```bash composer update ``` ## Version Guidance | Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version | |---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------| | 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >= 5.3.3 | | 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >= 5.4 | | 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >= 5.4 | | 6.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >= 5.5 | [guzzle-3-repo]: https://github.com/guzzle/guzzle3 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x [guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3 [guzzle-6-repo]: https://github.com/guzzle/guzzle [guzzle-3-docs]: http://guzzle3.readthedocs.org [guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/ [guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/ ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/UPGRADING.md ================================================ Guzzle Upgrade Guide ==================== 5.0 to 6.0 ---------- Guzzle now uses [PSR-7](http://www.php-fig.org/psr/psr-7/) for HTTP messages. Due to the fact that these messages are immutable, this prompted a refactoring of Guzzle to use a middleware based system rather than an event system. Any HTTP message interaction (e.g., `GuzzleHttp\Message\Request`) need to be updated to work with the new immutable PSR-7 request and response objects. Any event listeners or subscribers need to be updated to become middleware functions that wrap handlers (or are injected into a `GuzzleHttp\HandlerStack`). - Removed `GuzzleHttp\BatchResults` - Removed `GuzzleHttp\Collection` - Removed `GuzzleHttp\HasDataTrait` - Removed `GuzzleHttp\ToArrayInterface` - The `guzzlehttp/streams` dependency has been removed. Stream functionality is now present in the `GuzzleHttp\Psr7` namespace provided by the `guzzlehttp/psr7` package. - Guzzle no longer uses ReactPHP promises and now uses the `guzzlehttp/promises` library. We use a custom promise library for three significant reasons: 1. React promises (at the time of writing this) are recursive. Promise chaining and promise resolution will eventually blow the stack. Guzzle promises are not recursive as they use a sort of trampolining technique. Note: there has been movement in the React project to modify promises to no longer utilize recursion. 2. Guzzle needs to have the ability to synchronously block on a promise to wait for a result. Guzzle promises allows this functionality (and does not require the use of recursion). 3. Because we need to be able to wait on a result, doing so using React promises requires wrapping react promises with RingPHP futures. This overhead is no longer needed, reducing stack sizes, reducing complexity, and improving performance. - `GuzzleHttp\Mimetypes` has been moved to a function in `GuzzleHttp\Psr7\mimetype_from_extension` and `GuzzleHttp\Psr7\mimetype_from_filename`. - `GuzzleHttp\Query` and `GuzzleHttp\QueryParser` have been removed. Query strings must now be passed into request objects as strings, or provided to the `query` request option when creating requests with clients. The `query` option uses PHP's `http_build_query` to convert an array to a string. If you need a different serialization technique, you will need to pass the query string in as a string. There are a couple helper functions that will make working with query strings easier: `GuzzleHttp\Psr7\parse_query` and `GuzzleHttp\Psr7\build_query`. - Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware system based on PSR-7, using RingPHP and it's middleware system as well adds more complexity than the benefits it provides. All HTTP handlers that were present in RingPHP have been modified to work directly with PSR-7 messages and placed in the `GuzzleHttp\Handler` namespace. This significantly reduces complexity in Guzzle, removes a dependency, and improves performance. RingPHP will be maintained for Guzzle 5 support, but will no longer be a part of Guzzle 6. - As Guzzle now uses a middleware based systems the event system and RingPHP integration has been removed. Note: while the event system has been removed, it is possible to add your own type of event system that is powered by the middleware system. - Removed the `Event` namespace. - Removed the `Subscriber` namespace. - Removed `Transaction` class - Removed `RequestFsm` - Removed `RingBridge` - `GuzzleHttp\Subscriber\Cookie` is now provided by `GuzzleHttp\Middleware::cookies` - `GuzzleHttp\Subscriber\HttpError` is now provided by `GuzzleHttp\Middleware::httpError` - `GuzzleHttp\Subscriber\History` is now provided by `GuzzleHttp\Middleware::history` - `GuzzleHttp\Subscriber\Mock` is now provided by `GuzzleHttp\Handler\MockHandler` - `GuzzleHttp\Subscriber\Prepare` is now provided by `GuzzleHttp\PrepareBodyMiddleware` - `GuzzleHttp\Subscriber\Redirect` is now provided by `GuzzleHttp\RedirectMiddleware` - Guzzle now uses `Psr\Http\Message\UriInterface` (implements in `GuzzleHttp\Psr7\Uri`) for URI support. `GuzzleHttp\Url` is now gone. - Static functions in `GuzzleHttp\Utils` have been moved to namespaced functions under the `GuzzleHttp` namespace. This requires either a Composer based autoloader or you to include functions.php. - `GuzzleHttp\ClientInterface::getDefaultOption` has been renamed to `GuzzleHttp\ClientInterface::getConfig`. - `GuzzleHttp\ClientInterface::setDefaultOption` has been removed. - The `json` and `xml` methods of response objects has been removed. With the migration to strictly adhering to PSR-7 as the interface for Guzzle messages, adding methods to message interfaces would actually require Guzzle messages to extend from PSR-7 messages rather then work with them directly. ## Migrating to middleware The change to PSR-7 unfortunately required significant refactoring to Guzzle due to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event system from plugins. The event system relied on mutability of HTTP messages and side effects in order to work. With immutable messages, you have to change your workflow to become more about either returning a value (e.g., functional middlewares) or setting a value on an object. Guzzle v6 has chosen the functional middleware approach. Instead of using the event system to listen for things like the `before` event, you now create a stack based middleware function that intercepts a request on the way in and the promise of the response on the way out. This is a much simpler and more predictable approach than the event system and works nicely with PSR-7 middleware. Due to the use of promises, the middleware system is also asynchronous. v5: ```php use GuzzleHttp\Event\BeforeEvent; $client = new GuzzleHttp\Client(); // Get the emitter and listen to the before event. $client->getEmitter()->on('before', function (BeforeEvent $e) { // Guzzle v5 events relied on mutation $e->getRequest()->setHeader('X-Foo', 'Bar'); }); ``` v6: In v6, you can modify the request before it is sent using the `mapRequest` middleware. The idiomatic way in v6 to modify the request/response lifecycle is to setup a handler middleware stack up front and inject the handler into a client. ```php use GuzzleHttp\Middleware; // Create a handler stack that has all of the default middlewares attached $handler = GuzzleHttp\HandlerStack::create(); // Push the handler onto the handler stack $handler->push(Middleware::mapRequest(function (RequestInterface $request) { // Notice that we have to return a request object return $request->withHeader('X-Foo', 'Bar'); })); // Inject the handler into the client $client = new GuzzleHttp\Client(['handler' => $handler]); ``` ## POST Requests This version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params) and `multipart` request options. `form_params` is an associative array of strings or array of strings and is used to serialize an `application/x-www-form-urlencoded` POST request. The [`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart) option is now used to send a multipart/form-data POST request. `GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add POST files to a multipart/form-data request. The `body` option no longer accepts an array to send POST requests. Please use `multipart` or `form_params` instead. The `base_url` option has been renamed to `base_uri`. 4.x to 5.0 ---------- ## Rewritten Adapter Layer Guzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor is still supported, but it has now been renamed to `handler`. Instead of passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP `callable` that follows the RingPHP specification. ## Removed Fluent Interfaces [Fluent interfaces were removed](http://ocramius.github.io/blog/fluent-interfaces-are-evil) from the following classes: - `GuzzleHttp\Collection` - `GuzzleHttp\Url` - `GuzzleHttp\Query` - `GuzzleHttp\Post\PostBody` - `GuzzleHttp\Cookie\SetCookie` ## Removed functions.php Removed "functions.php", so that Guzzle is truly PSR-4 compliant. The following functions can be used as replacements. - `GuzzleHttp\json_decode` -> `GuzzleHttp\Utils::jsonDecode` - `GuzzleHttp\get_path` -> `GuzzleHttp\Utils::getPath` - `GuzzleHttp\Utils::setPath` -> `GuzzleHttp\set_path` - `GuzzleHttp\Pool::batch` -> `GuzzleHttp\batch`. This function is, however, deprecated in favor of using `GuzzleHttp\Pool::batch()`. The "procedural" global client has been removed with no replacement (e.g., `GuzzleHttp\get()`, `GuzzleHttp\post()`, etc.). Use a `GuzzleHttp\Client` object as a replacement. ## `throwImmediately` has been removed The concept of "throwImmediately" has been removed from exceptions and error events. This control mechanism was used to stop a transfer of concurrent requests from completing. This can now be handled by throwing the exception or by cancelling a pool of requests or each outstanding future request individually. ## headers event has been removed Removed the "headers" event. This event was only useful for changing the body a response once the headers of the response were known. You can implement a similar behavior in a number of ways. One example might be to use a FnStream that has access to the transaction being sent. For example, when the first byte is written, you could check if the response headers match your expectations, and if so, change the actual stream body that is being written to. ## Updates to HTTP Messages Removed the `asArray` parameter from `GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header value as an array, then use the newly added `getHeaderAsArray()` method of `MessageInterface`. This change makes the Guzzle interfaces compatible with the PSR-7 interfaces. 3.x to 4.0 ---------- ## Overarching changes: - Now requires PHP 5.4 or greater. - No longer requires cURL to send requests. - Guzzle no longer wraps every exception it throws. Only exceptions that are recoverable are now wrapped by Guzzle. - Various namespaces have been removed or renamed. - No longer requiring the Symfony EventDispatcher. A custom event dispatcher based on the Symfony EventDispatcher is now utilized in `GuzzleHttp\Event\EmitterInterface` (resulting in significant speed and functionality improvements). Changes per Guzzle 3.x namespace are described below. ## Batch The `Guzzle\Batch` namespace has been removed. This is best left to third-parties to implement on top of Guzzle's core HTTP library. ## Cache The `Guzzle\Cache` namespace has been removed. (Todo: No suitable replacement has been implemented yet, but hoping to utilize a PSR cache interface). ## Common - Removed all of the wrapped exceptions. It's better to use the standard PHP library for unrecoverable exceptions. - `FromConfigInterface` has been removed. - `Guzzle\Common\Version` has been removed. The VERSION constant can be found at `GuzzleHttp\ClientInterface::VERSION`. ### Collection - `getAll` has been removed. Use `toArray` to convert a collection to an array. - `inject` has been removed. - `keySearch` has been removed. - `getPath` no longer supports wildcard expressions. Use something better like JMESPath for this. - `setPath` now supports appending to an existing array via the `[]` notation. ### Events Guzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses `GuzzleHttp\Event\Emitter`. - `Symfony\Component\EventDispatcher\EventDispatcherInterface` is replaced by `GuzzleHttp\Event\EmitterInterface`. - `Symfony\Component\EventDispatcher\EventDispatcher` is replaced by `GuzzleHttp\Event\Emitter`. - `Symfony\Component\EventDispatcher\Event` is replaced by `GuzzleHttp\Event\Event`, and Guzzle now has an EventInterface in `GuzzleHttp\Event\EventInterface`. - `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the event emitter of a request, client, etc. now uses the `getEmitter` method rather than the `getDispatcher` method. #### Emitter - Use the `once()` method to add a listener that automatically removes itself the first time it is invoked. - Use the `listeners()` method to retrieve a list of event listeners rather than the `getListeners()` method. - Use `emit()` instead of `dispatch()` to emit an event from an emitter. - Use `attach()` instead of `addSubscriber()` and `detach()` instead of `removeSubscriber()`. ```php $mock = new Mock(); // 3.x $request->getEventDispatcher()->addSubscriber($mock); $request->getEventDispatcher()->removeSubscriber($mock); // 4.x $request->getEmitter()->attach($mock); $request->getEmitter()->detach($mock); ``` Use the `on()` method to add a listener rather than the `addListener()` method. ```php // 3.x $request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } ); // 4.x $request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } ); ``` ## Http ### General changes - The cacert.pem certificate has been moved to `src/cacert.pem`. - Added the concept of adapters that are used to transfer requests over the wire. - Simplified the event system. - Sending requests in parallel is still possible, but batching is no longer a concept of the HTTP layer. Instead, you must use the `complete` and `error` events to asynchronously manage parallel request transfers. - `Guzzle\Http\Url` has moved to `GuzzleHttp\Url`. - `Guzzle\Http\QueryString` has moved to `GuzzleHttp\Query`. - QueryAggregators have been rewritten so that they are simply callable functions. - `GuzzleHttp\StaticClient` has been removed. Use the functions provided in `functions.php` for an easy to use static client instance. - Exceptions in `GuzzleHttp\Exception` have been updated to all extend from `GuzzleHttp\Exception\TransferException`. ### Client Calling methods like `get()`, `post()`, `head()`, etc. no longer create and return a request, but rather creates a request, sends the request, and returns the response. ```php // 3.0 $request = $client->get('/'); $response = $request->send(); // 4.0 $response = $client->get('/'); // or, to mirror the previous behavior $request = $client->createRequest('GET', '/'); $response = $client->send($request); ``` `GuzzleHttp\ClientInterface` has changed. - The `send` method no longer accepts more than one request. Use `sendAll` to send multiple requests in parallel. - `setUserAgent()` has been removed. Use a default request option instead. You could, for example, do something like: `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`. - `setSslVerification()` has been removed. Use default request options instead, like `$client->setConfig('defaults/verify', true)`. `GuzzleHttp\Client` has changed. - The constructor now accepts only an associative array. You can include a `base_url` string or array to use a URI template as the base URL of a client. You can also specify a `defaults` key that is an associative array of default request options. You can pass an `adapter` to use a custom adapter, `batch_adapter` to use a custom adapter for sending requests in parallel, or a `message_factory` to change the factory used to create HTTP requests and responses. - The client no longer emits a `client.create_request` event. - Creating requests with a client no longer automatically utilize a URI template. You must pass an array into a creational method (e.g., `createRequest`, `get`, `put`, etc.) in order to expand a URI template. ### Messages Messages no longer have references to their counterparts (i.e., a request no longer has a reference to it's response, and a response no loger has a reference to its request). This association is now managed through a `GuzzleHttp\Adapter\TransactionInterface` object. You can get references to these transaction objects using request events that are emitted over the lifecycle of a request. #### Requests with a body - `GuzzleHttp\Message\EntityEnclosingRequest` and `GuzzleHttp\Message\EntityEnclosingRequestInterface` have been removed. The separation between requests that contain a body and requests that do not contain a body has been removed, and now `GuzzleHttp\Message\RequestInterface` handles both use cases. - Any method that previously accepts a `GuzzleHttp\Response` object now accept a `GuzzleHttp\Message\ResponseInterface`. - `GuzzleHttp\Message\RequestFactoryInterface` has been renamed to `GuzzleHttp\Message\MessageFactoryInterface`. This interface is used to create both requests and responses and is implemented in `GuzzleHttp\Message\MessageFactory`. - POST field and file methods have been removed from the request object. You must now use the methods made available to `GuzzleHttp\Post\PostBodyInterface` to control the format of a POST body. Requests that are created using a standard `GuzzleHttp\Message\MessageFactoryInterface` will automatically use a `GuzzleHttp\Post\PostBody` body if the body was passed as an array or if the method is POST and no body is provided. ```php $request = $client->createRequest('POST', '/'); $request->getBody()->setField('foo', 'bar'); $request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r'))); ``` #### Headers - `GuzzleHttp\Message\Header` has been removed. Header values are now simply represented by an array of values or as a string. Header values are returned as a string by default when retrieving a header value from a message. You can pass an optional argument of `true` to retrieve a header value as an array of strings instead of a single concatenated string. - `GuzzleHttp\PostFile` and `GuzzleHttp\PostFileInterface` have been moved to `GuzzleHttp\Post`. This interface has been simplified and now allows the addition of arbitrary headers. - Custom headers like `GuzzleHttp\Message\Header\Link` have been removed. Most of the custom headers are now handled separately in specific subscribers/plugins, and `GuzzleHttp\Message\HeaderValues::parseParams()` has been updated to properly handle headers that contain parameters (like the `Link` header). #### Responses - `GuzzleHttp\Message\Response::getInfo()` and `GuzzleHttp\Message\Response::setInfo()` have been removed. Use the event system to retrieve this type of information. - `GuzzleHttp\Message\Response::getRawHeaders()` has been removed. - `GuzzleHttp\Message\Response::getMessage()` has been removed. - `GuzzleHttp\Message\Response::calculateAge()` and other cache specific methods have moved to the CacheSubscriber. - Header specific helper functions like `getContentMd5()` have been removed. Just use `getHeader('Content-MD5')` instead. - `GuzzleHttp\Message\Response::setRequest()` and `GuzzleHttp\Message\Response::getRequest()` have been removed. Use the event system to work with request and response objects as a transaction. - `GuzzleHttp\Message\Response::getRedirectCount()` has been removed. Use the Redirect subscriber instead. - `GuzzleHttp\Message\Response::isSuccessful()` and other related methods have been removed. Use `getStatusCode()` instead. #### Streaming responses Streaming requests can now be created by a client directly, returning a `GuzzleHttp\Message\ResponseInterface` object that contains a body stream referencing an open PHP HTTP stream. ```php // 3.0 use Guzzle\Stream\PhpStreamRequestFactory; $request = $client->get('/'); $factory = new PhpStreamRequestFactory(); $stream = $factory->fromRequest($request); $data = $stream->read(1024); // 4.0 $response = $client->get('/', ['stream' => true]); // Read some data off of the stream in the response body $data = $response->getBody()->read(1024); ``` #### Redirects The `configureRedirects()` method has been removed in favor of a `allow_redirects` request option. ```php // Standard redirects with a default of a max of 5 redirects $request = $client->createRequest('GET', '/', ['allow_redirects' => true]); // Strict redirects with a custom number of redirects $request = $client->createRequest('GET', '/', [ 'allow_redirects' => ['max' => 5, 'strict' => true] ]); ``` #### EntityBody EntityBody interfaces and classes have been removed or moved to `GuzzleHttp\Stream`. All classes and interfaces that once required `GuzzleHttp\EntityBodyInterface` now require `GuzzleHttp\Stream\StreamInterface`. Creating a new body for a request no longer uses `GuzzleHttp\EntityBody::factory` but now uses `GuzzleHttp\Stream\Stream::factory` or even better: `GuzzleHttp\Stream\create()`. - `Guzzle\Http\EntityBodyInterface` is now `GuzzleHttp\Stream\StreamInterface` - `Guzzle\Http\EntityBody` is now `GuzzleHttp\Stream\Stream` - `Guzzle\Http\CachingEntityBody` is now `GuzzleHttp\Stream\CachingStream` - `Guzzle\Http\ReadLimitEntityBody` is now `GuzzleHttp\Stream\LimitStream` - `Guzzle\Http\IoEmittyinEntityBody` has been removed. #### Request lifecycle events Requests previously submitted a large number of requests. The number of events emitted over the lifecycle of a request has been significantly reduced to make it easier to understand how to extend the behavior of a request. All events emitted during the lifecycle of a request now emit a custom `GuzzleHttp\Event\EventInterface` object that contains context providing methods and a way in which to modify the transaction at that specific point in time (e.g., intercept the request and set a response on the transaction). - `request.before_send` has been renamed to `before` and now emits a `GuzzleHttp\Event\BeforeEvent` - `request.complete` has been renamed to `complete` and now emits a `GuzzleHttp\Event\CompleteEvent`. - `request.sent` has been removed. Use `complete`. - `request.success` has been removed. Use `complete`. - `error` is now an event that emits a `GuzzleHttp\Event\ErrorEvent`. - `request.exception` has been removed. Use `error`. - `request.receive.status_line` has been removed. - `curl.callback.progress` has been removed. Use a custom `StreamInterface` to maintain a status update. - `curl.callback.write` has been removed. Use a custom `StreamInterface` to intercept writes. - `curl.callback.read` has been removed. Use a custom `StreamInterface` to intercept reads. `headers` is a new event that is emitted after the response headers of a request have been received before the body of the response is downloaded. This event emits a `GuzzleHttp\Event\HeadersEvent`. You can intercept a request and inject a response using the `intercept()` event of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and `GuzzleHttp\Event\ErrorEvent` event. See: http://docs.guzzlephp.org/en/latest/events.html ## Inflection The `Guzzle\Inflection` namespace has been removed. This is not a core concern of Guzzle. ## Iterator The `Guzzle\Iterator` namespace has been removed. - `Guzzle\Iterator\AppendIterator`, `Guzzle\Iterator\ChunkedIterator`, and `Guzzle\Iterator\MethodProxyIterator` are nice, but not a core requirement of Guzzle itself. - `Guzzle\Iterator\FilterIterator` is no longer needed because an equivalent class is shipped with PHP 5.4. - `Guzzle\Iterator\MapIterator` is not really needed when using PHP 5.5 because it's easier to just wrap an iterator in a generator that maps values. For a replacement of these iterators, see https://github.com/nikic/iter ## Log The LogPlugin has moved to https://github.com/guzzle/log-subscriber. The `Guzzle\Log` namespace has been removed. Guzzle now relies on `Psr\Log\LoggerInterface` for all logging. The MessageFormatter class has been moved to `GuzzleHttp\Subscriber\Log\Formatter`. ## Parser The `Guzzle\Parser` namespace has been removed. This was previously used to make it possible to plug in custom parsers for cookies, messages, URI templates, and URLs; however, this level of complexity is not needed in Guzzle so it has been removed. - Cookie: Cookie parsing logic has been moved to `GuzzleHttp\Cookie\SetCookie::fromString`. - Message: Message parsing logic for both requests and responses has been moved to `GuzzleHttp\Message\MessageFactory::fromMessage`. Message parsing is only used in debugging or deserializing messages, so it doesn't make sense for Guzzle as a library to add this level of complexity to parsing messages. - UriTemplate: URI template parsing has been moved to `GuzzleHttp\UriTemplate`. The Guzzle library will automatically use the PECL URI template library if it is installed. - Url: URL parsing is now performed in `GuzzleHttp\Url::fromString` (previously it was `Guzzle\Http\Url::factory()`). If custom URL parsing is necessary, then developers are free to subclass `GuzzleHttp\Url`. ## Plugin The `Guzzle\Plugin` namespace has been renamed to `GuzzleHttp\Subscriber`. Several plugins are shipping with the core Guzzle library under this namespace. - `GuzzleHttp\Subscriber\Cookie`: Replaces the old CookiePlugin. Cookie jar code has moved to `GuzzleHttp\Cookie`. - `GuzzleHttp\Subscriber\History`: Replaces the old HistoryPlugin. - `GuzzleHttp\Subscriber\HttpError`: Throws errors when a bad HTTP response is received. - `GuzzleHttp\Subscriber\Mock`: Replaces the old MockPlugin. - `GuzzleHttp\Subscriber\Prepare`: Prepares the body of a request just before sending. This subscriber is attached to all requests by default. - `GuzzleHttp\Subscriber\Redirect`: Replaces the RedirectPlugin. The following plugins have been removed (third-parties are free to re-implement these if needed): - `GuzzleHttp\Plugin\Async` has been removed. - `GuzzleHttp\Plugin\CurlAuth` has been removed. - `GuzzleHttp\Plugin\ErrorResponse\ErrorResponsePlugin` has been removed. This functionality should instead be implemented with event listeners that occur after normal response parsing occurs in the guzzle/command package. The following plugins are not part of the core Guzzle package, but are provided in separate repositories: - `Guzzle\Http\Plugin\BackoffPlugin` has been rewritten to be much simpler to build custom retry policies using simple functions rather than various chained classes. See: https://github.com/guzzle/retry-subscriber - `Guzzle\Http\Plugin\Cache\CachePlugin` has moved to https://github.com/guzzle/cache-subscriber - `Guzzle\Http\Plugin\Log\LogPlugin` has moved to https://github.com/guzzle/log-subscriber - `Guzzle\Http\Plugin\Md5\Md5Plugin` has moved to https://github.com/guzzle/message-integrity-subscriber - `Guzzle\Http\Plugin\Mock\MockPlugin` has moved to `GuzzleHttp\Subscriber\MockSubscriber`. - `Guzzle\Http\Plugin\Oauth\OauthPlugin` has moved to https://github.com/guzzle/oauth-subscriber ## Service The service description layer of Guzzle has moved into two separate packages: - http://github.com/guzzle/command Provides a high level abstraction over web services by representing web service operations using commands. - http://github.com/guzzle/guzzle-services Provides an implementation of guzzle/command that provides request serialization and response parsing using Guzzle service descriptions. ## Stream Stream have moved to a separate package available at https://github.com/guzzle/streams. `Guzzle\Stream\StreamInterface` has been given a large update to cleanly take on the responsibilities of `Guzzle\Http\EntityBody` and `Guzzle\Http\EntityBodyInterface` now that they have been removed. The number of methods implemented by the `StreamInterface` has been drastically reduced to allow developers to more easily extend and decorate stream behavior. ## Removed methods from StreamInterface - `getStream` and `setStream` have been removed to better encapsulate streams. - `getMetadata` and `setMetadata` have been removed in favor of `GuzzleHttp\Stream\MetadataStreamInterface`. - `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been removed. This data is accessible when using streams that implement `GuzzleHttp\Stream\MetadataStreamInterface`. - `rewind` has been removed. Use `seek(0)` for a similar behavior. ## Renamed methods - `detachStream` has been renamed to `detach`. - `feof` has been renamed to `eof`. - `ftell` has been renamed to `tell`. - `readLine` has moved from an instance method to a static class method of `GuzzleHttp\Stream\Stream`. ## Metadata streams `GuzzleHttp\Stream\MetadataStreamInterface` has been added to denote streams that contain additional metadata accessible via `getMetadata()`. `GuzzleHttp\Stream\StreamInterface::getMetadata` and `GuzzleHttp\Stream\StreamInterface::setMetadata` have been removed. ## StreamRequestFactory The entire concept of the StreamRequestFactory has been removed. The way this was used in Guzzle 3 broke the actual interface of sending streaming requests (instead of getting back a Response, you got a StreamInterface). Streaming PHP requests are now implemented through the `GuzzleHttp\Adapter\StreamAdapter`. 3.6 to 3.7 ---------- ### Deprecations - You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.: ```php \Guzzle\Common\Version::$emitWarnings = true; ``` The following APIs and options have been marked as deprecated: - Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead. - Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. - Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. - Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. - Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. - Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated - Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. - Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. - Marked `Guzzle\Common\Collection::inject()` as deprecated. - Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` 3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational request methods. When paired with a client's configuration settings, these options allow you to specify default settings for various aspects of a request. Because these options make other previous configuration options redundant, several configuration options and methods of a client and AbstractCommand have been deprecated. - Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`. - Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`. - Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')` - Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0 $command = $client->getCommand('foo', array( 'command.headers' => array('Test' => '123'), 'command.response_body' => '/path/to/file' )); // Should be changed to: $command = $client->getCommand('foo', array( 'command.request_options' => array( 'headers' => array('Test' => '123'), 'save_as' => '/path/to/file' ) )); ### Interface changes Additions and changes (you will need to update any implementations or subclasses you may have created): - Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: createRequest, head, delete, put, patch, post, options, prepareRequest - Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` - Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` - Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a resource, string, or EntityBody into the $options parameter to specify the download location of the response. - Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a default `array()` - Added `Guzzle\Stream\StreamInterface::isRepeatable` - Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. The following methods were removed from interfaces. All of these methods are still available in the concrete classes that implement them, but you should update your code to use alternative methods: - Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or `$client->setDefaultOption('headers/{header_name}', 'value')`. or `$client->setDefaultOption('headers', array('header_name' => 'value'))`. - Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`. - Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail. - Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail. - Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail. - Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin. - Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin. - Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin. ### Cache plugin breaking changes - CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a CacheStorageInterface. These two objects and interface will be removed in a future version. - Always setting X-cache headers on cached responses - Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin - `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface $request, Response $response);` - `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` - `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` - Added `CacheStorageInterface::purge($url)` - `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, CanCacheStrategyInterface $canCache = null)` - Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` 3.5 to 3.6 ---------- * Mixed casing of headers are now forced to be a single consistent casing across all values for that header. * Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution * Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader(). Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request. * Specific header implementations can be created for complex headers. When a message creates a header, it uses a HeaderFactory which can map specific headers to specific header classes. There is now a Link header and CacheControl header implementation. * Moved getLinks() from Response to just be used on a Link header object. If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the HeaderInterface (e.g. toArray(), getAll(), etc.). ### Interface changes * Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate * Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() * Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in Guzzle\Http\Curl\RequestMediator * Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. * Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface * Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() ### Removed deprecated functions * Removed Guzzle\Parser\ParserRegister::get(). Use getParser() * Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). ### Deprecations * The ability to case-insensitively search for header values * Guzzle\Http\Message\Header::hasExactHeader * Guzzle\Http\Message\Header::raw. Use getAll() * Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object instead. ### Other changes * All response header helper functions return a string rather than mixing Header objects and strings inconsistently * Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle directly via interfaces * Removed the injecting of a request object onto a response object. The methods to get and set a request still exist but are a no-op until removed. * Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a `Guzzle\Service\Command\ArrayCommandInterface`. * Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response on a request while the request is still being transferred * `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess 3.3 to 3.4 ---------- Base URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs. 3.2 to 3.3 ---------- ### Response::getEtag() quote stripping removed `Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header ### Removed `Guzzle\Http\Utils` The `Guzzle\Http\Utils` class was removed. This class was only used for testing. ### Stream wrapper and type `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getStreamType()` are no longer converted to lowercase. ### curl.emit_io became emit_io Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' 3.1 to 3.2 ---------- ### CurlMulti is no longer reused globally Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added to a single client can pollute requests dispatched from other clients. If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is created. ```php $multi = new Guzzle\Http\Curl\CurlMulti(); $builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json'); $builder->addListener('service_builder.create_client', function ($event) use ($multi) { $event['client']->setCurlMulti($multi); } }); ``` ### No default path URLs no longer have a default path value of '/' if no path was specified. Before: ```php $request = $client->get('http://www.foo.com'); echo $request->getUrl(); // >> http://www.foo.com/ ``` After: ```php $request = $client->get('http://www.foo.com'); echo $request->getUrl(); // >> http://www.foo.com ``` ### Less verbose BadResponseException The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and response information. You can, however, get access to the request and response object by calling `getRequest()` or `getResponse()` on the exception object. ### Query parameter aggregation Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is responsible for handling the aggregation of multi-valued query string variables into a flattened hash. 2.8 to 3.x ---------- ### Guzzle\Service\Inspector Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig` **Before** ```php use Guzzle\Service\Inspector; class YourClient extends \Guzzle\Service\Client { public static function factory($config = array()) { $default = array(); $required = array('base_url', 'username', 'api_key'); $config = Inspector::fromConfig($config, $default, $required); $client = new self( $config->get('base_url'), $config->get('username'), $config->get('api_key') ); $client->setConfig($config); $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); return $client; } ``` **After** ```php use Guzzle\Common\Collection; class YourClient extends \Guzzle\Service\Client { public static function factory($config = array()) { $default = array(); $required = array('base_url', 'username', 'api_key'); $config = Collection::fromConfig($config, $default, $required); $client = new self( $config->get('base_url'), $config->get('username'), $config->get('api_key') ); $client->setConfig($config); $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); return $client; } ``` ### Convert XML Service Descriptions to JSON **Before** ```xml Get a list of groups Uses a search query to get a list of groups Create a group Delete a group by ID Update a group ``` **After** ```json { "name": "Zendesk REST API v2", "apiVersion": "2012-12-31", "description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users", "operations": { "list_groups": { "httpMethod":"GET", "uri": "groups.json", "summary": "Get a list of groups" }, "search_groups":{ "httpMethod":"GET", "uri": "search.json?query=\"{query} type:group\"", "summary": "Uses a search query to get a list of groups", "parameters":{ "query":{ "location": "uri", "description":"Zendesk Search Query", "type": "string", "required": true } } }, "create_group": { "httpMethod":"POST", "uri": "groups.json", "summary": "Create a group", "parameters":{ "data": { "type": "array", "location": "body", "description":"Group JSON", "filters": "json_encode", "required": true }, "Content-Type":{ "type": "string", "location":"header", "static": "application/json" } } }, "delete_group": { "httpMethod":"DELETE", "uri": "groups/{id}.json", "summary": "Delete a group", "parameters":{ "id":{ "location": "uri", "description":"Group to delete by ID", "type": "integer", "required": true } } }, "get_group": { "httpMethod":"GET", "uri": "groups/{id}.json", "summary": "Get a ticket", "parameters":{ "id":{ "location": "uri", "description":"Group to get by ID", "type": "integer", "required": true } } }, "update_group": { "httpMethod":"PUT", "uri": "groups/{id}.json", "summary": "Update a group", "parameters":{ "id": { "location": "uri", "description":"Group to update by ID", "type": "integer", "required": true }, "data": { "type": "array", "location": "body", "description":"Group JSON", "filters": "json_encode", "required": true }, "Content-Type":{ "type": "string", "location":"header", "static": "application/json" } } } } ``` ### Guzzle\Service\Description\ServiceDescription Commands are now called Operations **Before** ```php use Guzzle\Service\Description\ServiceDescription; $sd = new ServiceDescription(); $sd->getCommands(); // @returns ApiCommandInterface[] $sd->hasCommand($name); $sd->getCommand($name); // @returns ApiCommandInterface|null $sd->addCommand($command); // @param ApiCommandInterface $command ``` **After** ```php use Guzzle\Service\Description\ServiceDescription; $sd = new ServiceDescription(); $sd->getOperations(); // @returns OperationInterface[] $sd->hasOperation($name); $sd->getOperation($name); // @returns OperationInterface|null $sd->addOperation($operation); // @param OperationInterface $operation ``` ### Guzzle\Common\Inflection\Inflector Namespace is now `Guzzle\Inflection\Inflector` ### Guzzle\Http\Plugin Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below. ### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively. **Before** ```php use Guzzle\Common\Log\ClosureLogAdapter; use Guzzle\Http\Plugin\LogPlugin; /** @var \Guzzle\Http\Client */ $client; // $verbosity is an integer indicating desired message verbosity level $client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE); ``` **After** ```php use Guzzle\Log\ClosureLogAdapter; use Guzzle\Log\MessageFormatter; use Guzzle\Plugin\Log\LogPlugin; /** @var \Guzzle\Http\Client */ $client; // $format is a string indicating desired message format -- @see MessageFormatter $client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT); ``` ### Guzzle\Http\Plugin\CurlAuthPlugin Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`. ### Guzzle\Http\Plugin\ExponentialBackoffPlugin Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes. **Before** ```php use Guzzle\Http\Plugin\ExponentialBackoffPlugin; $backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge( ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429) )); $client->addSubscriber($backoffPlugin); ``` **After** ```php use Guzzle\Plugin\Backoff\BackoffPlugin; use Guzzle\Plugin\Backoff\HttpBackoffStrategy; // Use convenient factory method instead -- see implementation for ideas of what // you can do with chaining backoff strategies $backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge( HttpBackoffStrategy::getDefaultFailureCodes(), array(429) )); $client->addSubscriber($backoffPlugin); ``` ### Known Issues #### [BUG] Accept-Encoding header behavior changed unintentionally. (See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e) In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen. See issue #217 for a workaround, or use a version containing the fix. ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/composer.json ================================================ { "name": "guzzlehttp/guzzle", "type": "library", "description": "Guzzle is a PHP HTTP client library", "keywords": [ "framework", "http", "rest", "web service", "curl", "client", "HTTP client" ], "homepage": "http://guzzlephp.org/", "license": "MIT", "authors": [ { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" } ], "require": { "php": ">=5.5", "ext-json": "*", "symfony/polyfill-intl-idn": "^1.17.0", "guzzlehttp/promises": "^1.0", "guzzlehttp/psr7": "^1.6.1" }, "require-dev": { "ext-curl": "*", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "psr/log": "^1.1" }, "suggest": { "psr/log": "Required for using the Log middleware" }, "config": { "sort-packages": true }, "extra": { "branch-alias": { "dev-master": "6.5-dev" } }, "autoload": { "psr-4": { "GuzzleHttp\\": "src/" }, "files": [ "src/functions_include.php" ] }, "autoload-dev": { "psr-4": { "GuzzleHttp\\Tests\\": "tests/" } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Client.php ================================================ 'http://www.foo.com/1.0/', * 'timeout' => 0, * 'allow_redirects' => false, * 'proxy' => '192.168.16.1:10' * ]); * * Client configuration settings include the following options: * * - handler: (callable) Function that transfers HTTP requests over the * wire. The function is called with a Psr7\Http\Message\RequestInterface * and array of transfer options, and must return a * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a * Psr7\Http\Message\ResponseInterface on success. * If no handler is provided, a default handler will be created * that enables all of the request options below by attaching all of the * default middleware to the handler. * - base_uri: (string|UriInterface) Base URI of the client that is merged * into relative URIs. Can be a string or instance of UriInterface. * - **: any request option * * @param array $config Client configuration settings. * * @see \GuzzleHttp\RequestOptions for a list of available request options. */ public function __construct(array $config = []) { if (!isset($config['handler'])) { $config['handler'] = HandlerStack::create(); } elseif (!is_callable($config['handler'])) { throw new \InvalidArgumentException('handler must be a callable'); } // Convert the base_uri to a UriInterface if (isset($config['base_uri'])) { $config['base_uri'] = Psr7\uri_for($config['base_uri']); } $this->configureDefaults($config); } /** * @param string $method * @param array $args * * @return Promise\PromiseInterface */ public function __call($method, $args) { if (count($args) < 1) { throw new \InvalidArgumentException('Magic request methods require a URI and optional options array'); } $uri = $args[0]; $opts = isset($args[1]) ? $args[1] : []; return substr($method, -5) === 'Async' ? $this->requestAsync(substr($method, 0, -5), $uri, $opts) : $this->request($method, $uri, $opts); } /** * Asynchronously send an HTTP request. * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ public function sendAsync(RequestInterface $request, array $options = []) { // Merge the base URI into the request URI if needed. $options = $this->prepareDefaults($options); return $this->transfer( $request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')), $options ); } /** * Send an HTTP request. * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. * * @return ResponseInterface * @throws GuzzleException */ public function send(RequestInterface $request, array $options = []) { $options[RequestOptions::SYNCHRONOUS] = true; return $this->sendAsync($request, $options)->wait(); } /** * Create and send an asynchronous HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string $method HTTP method * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ public function requestAsync($method, $uri = '', array $options = []) { $options = $this->prepareDefaults($options); // Remove request modifying parameter because it can be done up-front. $headers = isset($options['headers']) ? $options['headers'] : []; $body = isset($options['body']) ? $options['body'] : null; $version = isset($options['version']) ? $options['version'] : '1.1'; // Merge the URI into the base URI. $uri = $this->buildUri($uri, $options); if (is_array($body)) { $this->invalidBody(); } $request = new Psr7\Request($method, $uri, $headers, $body, $version); // Remove the option so that they are not doubly-applied. unset($options['headers'], $options['body'], $options['version']); return $this->transfer($request, $options); } /** * Create and send an HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. * * @param string $method HTTP method. * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. * * @return ResponseInterface * @throws GuzzleException */ public function request($method, $uri = '', array $options = []) { $options[RequestOptions::SYNCHRONOUS] = true; return $this->requestAsync($method, $uri, $options)->wait(); } /** * Get a client configuration option. * * These options include default request options of the client, a "handler" * (if utilized by the concrete client), and a "base_uri" if utilized by * the concrete client. * * @param string|null $option The config option to retrieve. * * @return mixed */ public function getConfig($option = null) { return $option === null ? $this->config : (isset($this->config[$option]) ? $this->config[$option] : null); } /** * @param string|null $uri * * @return UriInterface */ private function buildUri($uri, array $config) { // for BC we accept null which would otherwise fail in uri_for $uri = Psr7\uri_for($uri === null ? '' : $uri); if (isset($config['base_uri'])) { $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri); } if (isset($config['idn_conversion']) && ($config['idn_conversion'] !== false)) { $idnOptions = ($config['idn_conversion'] === true) ? IDNA_DEFAULT : $config['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; } /** * Configures the default options for a client. * * @param array $config * @return void */ private function configureDefaults(array $config) { $defaults = [ 'allow_redirects' => RedirectMiddleware::$defaultSettings, 'http_errors' => true, 'decode_content' => true, 'verify' => true, 'cookies' => false, 'idn_conversion' => true, ]; // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. // We can only trust the HTTP_PROXY environment variable in a CLI // process due to the fact that PHP has no reliable mechanism to // get environment variables that start with "HTTP_". if (php_sapi_name() === 'cli' && getenv('HTTP_PROXY')) { $defaults['proxy']['http'] = getenv('HTTP_PROXY'); } if ($proxy = getenv('HTTPS_PROXY')) { $defaults['proxy']['https'] = $proxy; } if ($noProxy = getenv('NO_PROXY')) { $cleanedNoProxy = str_replace(' ', '', $noProxy); $defaults['proxy']['no'] = explode(',', $cleanedNoProxy); } $this->config = $config + $defaults; if (!empty($config['cookies']) && $config['cookies'] === true) { $this->config['cookies'] = new CookieJar(); } // Add the default user-agent header. if (!isset($this->config['headers'])) { $this->config['headers'] = ['User-Agent' => default_user_agent()]; } else { // Add the User-Agent header if one was not already set. foreach (array_keys($this->config['headers']) as $name) { if (strtolower($name) === 'user-agent') { return; } } $this->config['headers']['User-Agent'] = default_user_agent(); } } /** * Merges default options into the array. * * @param array $options Options to modify by reference * * @return array */ private function prepareDefaults(array $options) { $defaults = $this->config; if (!empty($defaults['headers'])) { // Default headers are only added if they are not present. $defaults['_conditional'] = $defaults['headers']; unset($defaults['headers']); } // Special handling for headers is required as they are added as // conditional headers and as headers passed to a request ctor. if (array_key_exists('headers', $options)) { // Allows default headers to be unset. if ($options['headers'] === null) { $defaults['_conditional'] = []; unset($options['headers']); } elseif (!is_array($options['headers'])) { throw new \InvalidArgumentException('headers must be an array'); } } // Shallow merge defaults underneath options. $result = $options + $defaults; // Remove null values. foreach ($result as $k => $v) { if ($v === null) { unset($result[$k]); } } return $result; } /** * Transfers the given request and applies request options. * * The URI of the request is not modified and the request options are used * as-is without merging in default options. * * @param array $options See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ private function transfer(RequestInterface $request, array $options) { // save_to -> sink if (isset($options['save_to'])) { $options['sink'] = $options['save_to']; unset($options['save_to']); } // exceptions -> http_errors if (isset($options['exceptions'])) { $options['http_errors'] = $options['exceptions']; unset($options['exceptions']); } $request = $this->applyOptions($request, $options); /** @var HandlerStack $handler */ $handler = $options['handler']; try { return Promise\promise_for($handler($request, $options)); } catch (\Exception $e) { return Promise\rejection_for($e); } } /** * Applies the array of request options to a request. * * @param RequestInterface $request * @param array $options * * @return RequestInterface */ private function applyOptions(RequestInterface $request, array &$options) { $modify = [ 'set_headers' => [], ]; if (isset($options['headers'])) { $modify['set_headers'] = $options['headers']; unset($options['headers']); } if (isset($options['form_params'])) { if (isset($options['multipart'])) { throw new \InvalidArgumentException('You cannot use ' . 'form_params and multipart at the same time. Use the ' . 'form_params option if you want to send application/' . 'x-www-form-urlencoded requests, and the multipart ' . 'option to send multipart/form-data requests.'); } $options['body'] = http_build_query($options['form_params'], '', '&'); unset($options['form_params']); // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded'; } if (isset($options['multipart'])) { $options['body'] = new Psr7\MultipartStream($options['multipart']); unset($options['multipart']); } if (isset($options['json'])) { $options['body'] = \GuzzleHttp\json_encode($options['json']); unset($options['json']); // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/json'; } if (!empty($options['decode_content']) && $options['decode_content'] !== true ) { // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']); $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; } if (isset($options['body'])) { if (is_array($options['body'])) { $this->invalidBody(); } $modify['body'] = Psr7\stream_for($options['body']); unset($options['body']); } if (!empty($options['auth']) && is_array($options['auth'])) { $value = $options['auth']; $type = isset($value[2]) ? strtolower($value[2]) : 'basic'; switch ($type) { case 'basic': // Ensure that we don't have the header in different case and set the new value. $modify['set_headers'] = Psr7\_caseless_remove(['Authorization'], $modify['set_headers']); $modify['set_headers']['Authorization'] = 'Basic ' . base64_encode("$value[0]:$value[1]"); break; case 'digest': // @todo: Do not rely on curl $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_DIGEST; $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]"; break; case 'ntlm': $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_NTLM; $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]"; break; } } if (isset($options['query'])) { $value = $options['query']; if (is_array($value)) { $value = http_build_query($value, null, '&', PHP_QUERY_RFC3986); } if (!is_string($value)) { throw new \InvalidArgumentException('query must be a string or array'); } $modify['query'] = $value; unset($options['query']); } // Ensure that sink is not an invalid value. if (isset($options['sink'])) { // TODO: Add more sink validation? if (is_bool($options['sink'])) { throw new \InvalidArgumentException('sink must not be a boolean'); } } $request = Psr7\modify_request($request, $modify); if ($request->getBody() instanceof Psr7\MultipartStream) { // Use a multipart/form-data POST if a Content-Type is not set. // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' . $request->getBody()->getBoundary(); } // Merge in conditional headers if they are not present. if (isset($options['_conditional'])) { // Build up the changes so it's in a single clone of the message. $modify = []; foreach ($options['_conditional'] as $k => $v) { if (!$request->hasHeader($k)) { $modify['set_headers'][$k] = $v; } } $request = Psr7\modify_request($request, $modify); // Don't pass this internal value along to middleware/handlers. unset($options['_conditional']); } return $request; } /** * Throw Exception with pre-set message. * @return void * @throws \InvalidArgumentException Invalid body. */ private function invalidBody() { throw new \InvalidArgumentException('Passing in the "body" request ' . 'option as an array to send a POST request has been deprecated. ' . 'Please use the "form_params" request option to send a ' . 'application/x-www-form-urlencoded request, or the "multipart" ' . 'request option to send a multipart/form-data request.'); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/ClientInterface.php ================================================ strictMode = $strictMode; foreach ($cookieArray as $cookie) { if (!($cookie instanceof SetCookie)) { $cookie = new SetCookie($cookie); } $this->setCookie($cookie); } } /** * Create a new Cookie jar from an associative array and domain. * * @param array $cookies Cookies to create the jar from * @param string $domain Domain to set the cookies to * * @return self */ public static function fromArray(array $cookies, $domain) { $cookieJar = new self(); foreach ($cookies as $name => $value) { $cookieJar->setCookie(new SetCookie([ 'Domain' => $domain, 'Name' => $name, 'Value' => $value, 'Discard' => true ])); } return $cookieJar; } /** * @deprecated */ public static function getCookieValue($value) { return $value; } /** * Evaluate if this cookie should be persisted to storage * that survives between requests. * * @param SetCookie $cookie Being evaluated. * @param bool $allowSessionCookies If we should persist session cookies * @return bool */ public static function shouldPersist( SetCookie $cookie, $allowSessionCookies = false ) { if ($cookie->getExpires() || $allowSessionCookies) { if (!$cookie->getDiscard()) { return true; } } return false; } /** * Finds and returns the cookie based on the name * * @param string $name cookie name to search for * @return SetCookie|null cookie that was found or null if not found */ public function getCookieByName($name) { // don't allow a non string name if ($name === null || !is_scalar($name)) { return null; } foreach ($this->cookies as $cookie) { if ($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) { return $cookie; } } return null; } public function toArray() { return array_map(function (SetCookie $cookie) { return $cookie->toArray(); }, $this->getIterator()->getArrayCopy()); } public function clear($domain = null, $path = null, $name = null) { if (!$domain) { $this->cookies = []; return; } elseif (!$path) { $this->cookies = array_filter( $this->cookies, function (SetCookie $cookie) use ($domain) { return !$cookie->matchesDomain($domain); } ); } elseif (!$name) { $this->cookies = array_filter( $this->cookies, function (SetCookie $cookie) use ($path, $domain) { return !($cookie->matchesPath($path) && $cookie->matchesDomain($domain)); } ); } else { $this->cookies = array_filter( $this->cookies, function (SetCookie $cookie) use ($path, $domain, $name) { return !($cookie->getName() == $name && $cookie->matchesPath($path) && $cookie->matchesDomain($domain)); } ); } } public function clearSessionCookies() { $this->cookies = array_filter( $this->cookies, function (SetCookie $cookie) { return !$cookie->getDiscard() && $cookie->getExpires(); } ); } public function setCookie(SetCookie $cookie) { // If the name string is empty (but not 0), ignore the set-cookie // string entirely. $name = $cookie->getName(); if (!$name && $name !== '0') { return false; } // Only allow cookies with set and valid domain, name, value $result = $cookie->validate(); if ($result !== true) { if ($this->strictMode) { throw new \RuntimeException('Invalid cookie: ' . $result); } else { $this->removeCookieIfEmpty($cookie); return false; } } // Resolve conflicts with previously set cookies foreach ($this->cookies as $i => $c) { // Two cookies are identical, when their path, and domain are // identical. if ($c->getPath() != $cookie->getPath() || $c->getDomain() != $cookie->getDomain() || $c->getName() != $cookie->getName() ) { continue; } // The previously set cookie is a discard cookie and this one is // not so allow the new cookie to be set if (!$cookie->getDiscard() && $c->getDiscard()) { unset($this->cookies[$i]); continue; } // If the new cookie's expiration is further into the future, then // replace the old cookie if ($cookie->getExpires() > $c->getExpires()) { unset($this->cookies[$i]); continue; } // If the value has changed, we better change it if ($cookie->getValue() !== $c->getValue()) { unset($this->cookies[$i]); continue; } // The cookie exists, so no need to continue return false; } $this->cookies[] = $cookie; return true; } public function count() { return count($this->cookies); } public function getIterator() { return new \ArrayIterator(array_values($this->cookies)); } public function extractCookies( RequestInterface $request, ResponseInterface $response ) { if ($cookieHeader = $response->getHeader('Set-Cookie')) { foreach ($cookieHeader as $cookie) { $sc = SetCookie::fromString($cookie); if (!$sc->getDomain()) { $sc->setDomain($request->getUri()->getHost()); } if (0 !== strpos($sc->getPath(), '/')) { $sc->setPath($this->getCookiePathFromRequest($request)); } $this->setCookie($sc); } } } /** * Computes cookie path following RFC 6265 section 5.1.4 * * @link https://tools.ietf.org/html/rfc6265#section-5.1.4 * * @param RequestInterface $request * @return string */ private function getCookiePathFromRequest(RequestInterface $request) { $uriPath = $request->getUri()->getPath(); if ('' === $uriPath) { return '/'; } if (0 !== strpos($uriPath, '/')) { return '/'; } if ('/' === $uriPath) { return '/'; } if (0 === $lastSlashPos = strrpos($uriPath, '/')) { return '/'; } return substr($uriPath, 0, $lastSlashPos); } public function withCookieHeader(RequestInterface $request) { $values = []; $uri = $request->getUri(); $scheme = $uri->getScheme(); $host = $uri->getHost(); $path = $uri->getPath() ?: '/'; foreach ($this->cookies as $cookie) { if ($cookie->matchesPath($path) && $cookie->matchesDomain($host) && !$cookie->isExpired() && (!$cookie->getSecure() || $scheme === 'https') ) { $values[] = $cookie->getName() . '=' . $cookie->getValue(); } } return $values ? $request->withHeader('Cookie', implode('; ', $values)) : $request; } /** * If a cookie already exists and the server asks to set it again with a * null value, the cookie must be deleted. * * @param SetCookie $cookie */ private function removeCookieIfEmpty(SetCookie $cookie) { $cookieValue = $cookie->getValue(); if ($cookieValue === null || $cookieValue === '') { $this->clear( $cookie->getDomain(), $cookie->getPath(), $cookie->getName() ); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php ================================================ filename = $cookieFile; $this->storeSessionCookies = $storeSessionCookies; if (file_exists($cookieFile)) { $this->load($cookieFile); } } /** * Saves the file when shutting down */ public function __destruct() { $this->save($this->filename); } /** * Saves the cookies to a file. * * @param string $filename File to save * @throws \RuntimeException if the file cannot be found or created */ public function save($filename) { $json = []; foreach ($this as $cookie) { /** @var SetCookie $cookie */ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } $jsonStr = \GuzzleHttp\json_encode($json); if (false === file_put_contents($filename, $jsonStr, LOCK_EX)) { throw new \RuntimeException("Unable to save file {$filename}"); } } /** * Load cookies from a JSON formatted file. * * Old cookies are kept unless overwritten by newly loaded ones. * * @param string $filename Cookie file to load. * @throws \RuntimeException if the file cannot be loaded. */ public function load($filename) { $json = file_get_contents($filename); if (false === $json) { throw new \RuntimeException("Unable to load file {$filename}"); } elseif ($json === '') { return; } $data = \GuzzleHttp\json_decode($json, true); if (is_array($data)) { foreach (json_decode($json, true) as $cookie) { $this->setCookie(new SetCookie($cookie)); } } elseif (strlen($data)) { throw new \RuntimeException("Invalid cookie file: {$filename}"); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php ================================================ sessionKey = $sessionKey; $this->storeSessionCookies = $storeSessionCookies; $this->load(); } /** * Saves cookies to session when shutting down */ public function __destruct() { $this->save(); } /** * Save cookies to the client session */ public function save() { $json = []; foreach ($this as $cookie) { /** @var SetCookie $cookie */ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } $_SESSION[$this->sessionKey] = json_encode($json); } /** * Load the contents of the client session into the data array */ protected function load() { if (!isset($_SESSION[$this->sessionKey])) { return; } $data = json_decode($_SESSION[$this->sessionKey], true); if (is_array($data)) { foreach ($data as $cookie) { $this->setCookie(new SetCookie($cookie)); } } elseif (strlen($data)) { throw new \RuntimeException("Invalid cookie data"); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php ================================================ null, 'Value' => null, 'Domain' => null, 'Path' => '/', 'Max-Age' => null, 'Expires' => null, 'Secure' => false, 'Discard' => false, 'HttpOnly' => false ]; /** @var array Cookie data */ private $data; /** * Create a new SetCookie object from a string * * @param string $cookie Set-Cookie header string * * @return self */ public static function fromString($cookie) { // Create the default return array $data = self::$defaults; // Explode the cookie string using a series of semicolons $pieces = array_filter(array_map('trim', explode(';', $cookie))); // The name of the cookie (first kvp) must exist and include an equal sign. if (empty($pieces[0]) || !strpos($pieces[0], '=')) { return new self($data); } // Add the cookie pieces into the parsed data array foreach ($pieces as $part) { $cookieParts = explode('=', $part, 2); $key = trim($cookieParts[0]); $value = isset($cookieParts[1]) ? trim($cookieParts[1], " \n\r\t\0\x0B") : true; // Only check for non-cookies when cookies have been found if (empty($data['Name'])) { $data['Name'] = $key; $data['Value'] = $value; } else { foreach (array_keys(self::$defaults) as $search) { if (!strcasecmp($search, $key)) { $data[$search] = $value; continue 2; } } $data[$key] = $value; } } return new self($data); } /** * @param array $data Array of cookie data provided by a Cookie parser */ public function __construct(array $data = []) { $this->data = array_replace(self::$defaults, $data); // Extract the Expires value and turn it into a UNIX timestamp if needed if (!$this->getExpires() && $this->getMaxAge()) { // Calculate the Expires date $this->setExpires(time() + $this->getMaxAge()); } elseif ($this->getExpires() && !is_numeric($this->getExpires())) { $this->setExpires($this->getExpires()); } } public function __toString() { $str = $this->data['Name'] . '=' . $this->data['Value'] . '; '; foreach ($this->data as $k => $v) { if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) { if ($k === 'Expires') { $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; '; } else { $str .= ($v === true ? $k : "{$k}={$v}") . '; '; } } } return rtrim($str, '; '); } public function toArray() { return $this->data; } /** * Get the cookie name * * @return string */ public function getName() { return $this->data['Name']; } /** * Set the cookie name * * @param string $name Cookie name */ public function setName($name) { $this->data['Name'] = $name; } /** * Get the cookie value * * @return string */ public function getValue() { return $this->data['Value']; } /** * Set the cookie value * * @param string $value Cookie value */ public function setValue($value) { $this->data['Value'] = $value; } /** * Get the domain * * @return string|null */ public function getDomain() { return $this->data['Domain']; } /** * Set the domain of the cookie * * @param string $domain */ public function setDomain($domain) { $this->data['Domain'] = $domain; } /** * Get the path * * @return string */ public function getPath() { return $this->data['Path']; } /** * Set the path of the cookie * * @param string $path Path of the cookie */ public function setPath($path) { $this->data['Path'] = $path; } /** * Maximum lifetime of the cookie in seconds * * @return int|null */ public function getMaxAge() { return $this->data['Max-Age']; } /** * Set the max-age of the cookie * * @param int $maxAge Max age of the cookie in seconds */ public function setMaxAge($maxAge) { $this->data['Max-Age'] = $maxAge; } /** * The UNIX timestamp when the cookie Expires * * @return mixed */ public function getExpires() { return $this->data['Expires']; } /** * Set the unix timestamp for which the cookie will expire * * @param int $timestamp Unix timestamp */ public function setExpires($timestamp) { $this->data['Expires'] = is_numeric($timestamp) ? (int) $timestamp : strtotime($timestamp); } /** * Get whether or not this is a secure cookie * * @return bool|null */ public function getSecure() { return $this->data['Secure']; } /** * Set whether or not the cookie is secure * * @param bool $secure Set to true or false if secure */ public function setSecure($secure) { $this->data['Secure'] = $secure; } /** * Get whether or not this is a session cookie * * @return bool|null */ public function getDiscard() { return $this->data['Discard']; } /** * Set whether or not this is a session cookie * * @param bool $discard Set to true or false if this is a session cookie */ public function setDiscard($discard) { $this->data['Discard'] = $discard; } /** * Get whether or not this is an HTTP only cookie * * @return bool */ public function getHttpOnly() { return $this->data['HttpOnly']; } /** * Set whether or not this is an HTTP only cookie * * @param bool $httpOnly Set to true or false if this is HTTP only */ public function setHttpOnly($httpOnly) { $this->data['HttpOnly'] = $httpOnly; } /** * Check if the cookie matches a path value. * * A request-path path-matches a given cookie-path if at least one of * the following conditions holds: * * - The cookie-path and the request-path are identical. * - The cookie-path is a prefix of the request-path, and the last * character of the cookie-path is %x2F ("/"). * - The cookie-path is a prefix of the request-path, and the first * character of the request-path that is not included in the cookie- * path is a %x2F ("/") character. * * @param string $requestPath Path to check against * * @return bool */ public function matchesPath($requestPath) { $cookiePath = $this->getPath(); // Match on exact matches or when path is the default empty "/" if ($cookiePath === '/' || $cookiePath == $requestPath) { return true; } // Ensure that the cookie-path is a prefix of the request path. if (0 !== strpos($requestPath, $cookiePath)) { return false; } // Match if the last character of the cookie-path is "/" if (substr($cookiePath, -1, 1) === '/') { return true; } // Match if the first character not included in cookie path is "/" return substr($requestPath, strlen($cookiePath), 1) === '/'; } /** * Check if the cookie matches a domain value * * @param string $domain Domain to check against * * @return bool */ public function matchesDomain($domain) { // Remove the leading '.' as per spec in RFC 6265. // http://tools.ietf.org/html/rfc6265#section-5.2.3 $cookieDomain = ltrim($this->getDomain(), '.'); // Domain not set or exact match. if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) { return true; } // Matching the subdomain according to RFC 6265. // http://tools.ietf.org/html/rfc6265#section-5.1.3 if (filter_var($domain, FILTER_VALIDATE_IP)) { return false; } return (bool) preg_match('/\.' . preg_quote($cookieDomain, '/') . '$/', $domain); } /** * Check if the cookie is expired * * @return bool */ public function isExpired() { return $this->getExpires() !== null && time() > $this->getExpires(); } /** * Check if the cookie is valid according to RFC 6265 * * @return bool|string Returns true if valid or an error message if invalid */ public function validate() { // Names must not be empty, but can be 0 $name = $this->getName(); if (empty($name) && !is_numeric($name)) { return 'The cookie name must not be empty'; } // Check if any of the invalid characters are present in the cookie name if (preg_match( '/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/', $name )) { return 'Cookie name must not contain invalid characters: ASCII ' . 'Control characters (0-31;127), space, tab and the ' . 'following characters: ()<>@,;:\"/?={}'; } // Value must not be empty, but can be 0 $value = $this->getValue(); if (empty($value) && !is_numeric($value)) { return 'The cookie value must not be empty'; } // Domains must not be empty, but can be 0 // A "0" is not a valid internet domain, but may be used as server name // in a private network. $domain = $this->getDomain(); if (empty($domain) && !is_numeric($domain)) { return 'The cookie domain must not be empty'; } return true; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php ================================================ getStatusCode() : 0; parent::__construct($message, $code, $previous); $this->request = $request; $this->response = $response; $this->handlerContext = $handlerContext; } /** * Wrap non-RequestExceptions with a RequestException * * @param RequestInterface $request * @param \Exception $e * * @return RequestException */ public static function wrapException(RequestInterface $request, \Exception $e) { return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e); } /** * Factory method to create a new exception with a normalized error message * * @param RequestInterface $request Request * @param ResponseInterface $response Response received * @param \Exception $previous Previous exception * @param array $ctx Optional handler context. * * @return self */ public static function create( RequestInterface $request, ResponseInterface $response = null, \Exception $previous = null, array $ctx = [] ) { if (!$response) { return new self( 'Error completing request', $request, null, $previous, $ctx ); } $level = (int) floor($response->getStatusCode() / 100); if ($level === 4) { $label = 'Client error'; $className = ClientException::class; } elseif ($level === 5) { $label = 'Server error'; $className = ServerException::class; } else { $label = 'Unsuccessful request'; $className = __CLASS__; } $uri = $request->getUri(); $uri = static::obfuscateUri($uri); // Client Error: `GET /` resulted in a `404 Not Found` response: // ... (truncated) $message = sprintf( '%s: `%s %s` resulted in a `%s %s` response', $label, $request->getMethod(), $uri, $response->getStatusCode(), $response->getReasonPhrase() ); $summary = static::getResponseBodySummary($response); if ($summary !== null) { $message .= ":\n{$summary}\n"; } return new $className($message, $request, $response, $previous, $ctx); } /** * Get a short summary of the response * * Will return `null` if the response is not printable. * * @param ResponseInterface $response * * @return string|null */ public static function getResponseBodySummary(ResponseInterface $response) { return \GuzzleHttp\Psr7\get_message_body_summary($response); } /** * Obfuscates URI if there is a username and a password present * * @param UriInterface $uri * * @return UriInterface */ private static function obfuscateUri(UriInterface $uri) { $userInfo = $uri->getUserInfo(); if (false !== ($pos = strpos($userInfo, ':'))) { return $uri->withUserInfo(substr($userInfo, 0, $pos), '***'); } return $uri; } /** * Get the request that caused the exception * * @return RequestInterface */ public function getRequest() { return $this->request; } /** * Get the associated response * * @return ResponseInterface|null */ public function getResponse() { return $this->response; } /** * Check if a response was received * * @return bool */ public function hasResponse() { return $this->response !== null; } /** * Get contextual information about the error from the underlying handler. * * The contents of this array will vary depending on which handler you are * using. It may also be just an empty array. Relying on this data will * couple you to a specific handler, but can give more debug information * when needed. * * @return array */ public function getHandlerContext() { return $this->handlerContext; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php ================================================ stream = $stream; $msg = $msg ?: 'Could not seek the stream to position ' . $pos; parent::__construct($msg); } /** * @return StreamInterface */ public function getStream() { return $this->stream; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php ================================================ maxHandles = $maxHandles; } public function create(RequestInterface $request, array $options) { if (isset($options['curl']['body_as_string'])) { $options['_body_as_string'] = $options['curl']['body_as_string']; unset($options['curl']['body_as_string']); } $easy = new EasyHandle; $easy->request = $request; $easy->options = $options; $conf = $this->getDefaultConf($easy); $this->applyMethod($easy, $conf); $this->applyHandlerOptions($easy, $conf); $this->applyHeaders($easy, $conf); unset($conf['_headers']); // Add handler options from the request configuration options if (isset($options['curl'])) { $conf = array_replace($conf, $options['curl']); } $conf[CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); $easy->handle = $this->handles ? array_pop($this->handles) : curl_init(); curl_setopt_array($easy->handle, $conf); return $easy; } public function release(EasyHandle $easy) { $resource = $easy->handle; unset($easy->handle); if (count($this->handles) >= $this->maxHandles) { curl_close($resource); } else { // Remove all callback functions as they can hold onto references // and are not cleaned up by curl_reset. Using curl_setopt_array // does not work for some reason, so removing each one // individually. curl_setopt($resource, CURLOPT_HEADERFUNCTION, null); curl_setopt($resource, CURLOPT_READFUNCTION, null); curl_setopt($resource, CURLOPT_WRITEFUNCTION, null); curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null); curl_reset($resource); $this->handles[] = $resource; } } /** * Completes a cURL transaction, either returning a response promise or a * rejected promise. * * @param callable $handler * @param EasyHandle $easy * @param CurlFactoryInterface $factory Dictates how the handle is released * * @return \GuzzleHttp\Promise\PromiseInterface */ public static function finish( callable $handler, EasyHandle $easy, CurlFactoryInterface $factory ) { if (isset($easy->options['on_stats'])) { self::invokeStats($easy); } if (!$easy->response || $easy->errno) { return self::finishError($handler, $easy, $factory); } // Return the response if it is present and there is no error. $factory->release($easy); // Rewind the body of the response if possible. $body = $easy->response->getBody(); if ($body->isSeekable()) { $body->rewind(); } return new FulfilledPromise($easy->response); } private static function invokeStats(EasyHandle $easy) { $curlStats = curl_getinfo($easy->handle); $curlStats['appconnect_time'] = curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME); $stats = new TransferStats( $easy->request, $easy->response, $curlStats['total_time'], $easy->errno, $curlStats ); call_user_func($easy->options['on_stats'], $stats); } private static function finishError( callable $handler, EasyHandle $easy, CurlFactoryInterface $factory ) { // Get error information and release the handle to the factory. $ctx = [ 'errno' => $easy->errno, 'error' => curl_error($easy->handle), 'appconnect_time' => curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME), ] + curl_getinfo($easy->handle); $ctx[self::CURL_VERSION_STR] = curl_version()['version']; $factory->release($easy); // Retry when nothing is present or when curl failed to rewind. if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65) ) { return self::retryFailedRewind($handler, $easy, $ctx); } return self::createRejection($easy, $ctx); } private static function createRejection(EasyHandle $easy, array $ctx) { static $connectionErrors = [ CURLE_OPERATION_TIMEOUTED => true, CURLE_COULDNT_RESOLVE_HOST => true, CURLE_COULDNT_CONNECT => true, CURLE_SSL_CONNECT_ERROR => true, CURLE_GOT_NOTHING => true, ]; // If an exception was encountered during the onHeaders event, then // return a rejected promise that wraps that exception. if ($easy->onHeadersException) { return \GuzzleHttp\Promise\rejection_for( new RequestException( 'An error was encountered during the on_headers event', $easy->request, $easy->response, $easy->onHeadersException, $ctx ) ); } if (version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) { $message = sprintf( 'cURL error %s: %s (%s)', $ctx['errno'], $ctx['error'], 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html' ); } else { $message = sprintf( 'cURL error %s: %s (%s) for %s', $ctx['errno'], $ctx['error'], 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html', $easy->request->getUri() ); } // Create a connection exception if it was a specific error code. $error = isset($connectionErrors[$easy->errno]) ? new ConnectException($message, $easy->request, null, $ctx) : new RequestException($message, $easy->request, $easy->response, null, $ctx); return \GuzzleHttp\Promise\rejection_for($error); } private function getDefaultConf(EasyHandle $easy) { $conf = [ '_headers' => $easy->request->getHeaders(), CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), CURLOPT_RETURNTRANSFER => false, CURLOPT_HEADER => false, CURLOPT_CONNECTTIMEOUT => 150, ]; if (defined('CURLOPT_PROTOCOLS')) { $conf[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS; } $version = $easy->request->getProtocolVersion(); if ($version == 1.1) { $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1; } elseif ($version == 2.0) { $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0; } else { $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0; } return $conf; } private function applyMethod(EasyHandle $easy, array &$conf) { $body = $easy->request->getBody(); $size = $body->getSize(); if ($size === null || $size > 0) { $this->applyBody($easy->request, $easy->options, $conf); return; } $method = $easy->request->getMethod(); if ($method === 'PUT' || $method === 'POST') { // See http://tools.ietf.org/html/rfc7230#section-3.3.2 if (!$easy->request->hasHeader('Content-Length')) { $conf[CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; } } elseif ($method === 'HEAD') { $conf[CURLOPT_NOBODY] = true; unset( $conf[CURLOPT_WRITEFUNCTION], $conf[CURLOPT_READFUNCTION], $conf[CURLOPT_FILE], $conf[CURLOPT_INFILE] ); } } private function applyBody(RequestInterface $request, array $options, array &$conf) { $size = $request->hasHeader('Content-Length') ? (int) $request->getHeaderLine('Content-Length') : null; // Send the body as a string if the size is less than 1MB OR if the // [curl][body_as_string] request value is set. if (($size !== null && $size < 1000000) || !empty($options['_body_as_string']) ) { $conf[CURLOPT_POSTFIELDS] = (string) $request->getBody(); // Don't duplicate the Content-Length header $this->removeHeader('Content-Length', $conf); $this->removeHeader('Transfer-Encoding', $conf); } else { $conf[CURLOPT_UPLOAD] = true; if ($size !== null) { $conf[CURLOPT_INFILESIZE] = $size; $this->removeHeader('Content-Length', $conf); } $body = $request->getBody(); if ($body->isSeekable()) { $body->rewind(); } $conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) { return $body->read($length); }; } // If the Expect header is not present, prevent curl from adding it if (!$request->hasHeader('Expect')) { $conf[CURLOPT_HTTPHEADER][] = 'Expect:'; } // cURL sometimes adds a content-type by default. Prevent this. if (!$request->hasHeader('Content-Type')) { $conf[CURLOPT_HTTPHEADER][] = 'Content-Type:'; } } private function applyHeaders(EasyHandle $easy, array &$conf) { foreach ($conf['_headers'] as $name => $values) { foreach ($values as $value) { $value = (string) $value; if ($value === '') { // cURL requires a special format for empty headers. // See https://github.com/guzzle/guzzle/issues/1882 for more details. $conf[CURLOPT_HTTPHEADER][] = "$name;"; } else { $conf[CURLOPT_HTTPHEADER][] = "$name: $value"; } } } // Remove the Accept header if one was not set if (!$easy->request->hasHeader('Accept')) { $conf[CURLOPT_HTTPHEADER][] = 'Accept:'; } } /** * Remove a header from the options array. * * @param string $name Case-insensitive header to remove * @param array $options Array of options to modify */ private function removeHeader($name, array &$options) { foreach (array_keys($options['_headers']) as $key) { if (!strcasecmp($key, $name)) { unset($options['_headers'][$key]); return; } } } private function applyHandlerOptions(EasyHandle $easy, array &$conf) { $options = $easy->options; if (isset($options['verify'])) { if ($options['verify'] === false) { unset($conf[CURLOPT_CAINFO]); $conf[CURLOPT_SSL_VERIFYHOST] = 0; $conf[CURLOPT_SSL_VERIFYPEER] = false; } else { $conf[CURLOPT_SSL_VERIFYHOST] = 2; $conf[CURLOPT_SSL_VERIFYPEER] = true; if (is_string($options['verify'])) { // Throw an error if the file/folder/link path is not valid or doesn't exist. if (!file_exists($options['verify'])) { throw new \InvalidArgumentException( "SSL CA bundle not found: {$options['verify']}" ); } // If it's a directory or a link to a directory use CURLOPT_CAPATH. // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO. if (is_dir($options['verify']) || (is_link($options['verify']) && is_dir(readlink($options['verify'])))) { $conf[CURLOPT_CAPATH] = $options['verify']; } else { $conf[CURLOPT_CAINFO] = $options['verify']; } } } } if (!empty($options['decode_content'])) { $accept = $easy->request->getHeaderLine('Accept-Encoding'); if ($accept) { $conf[CURLOPT_ENCODING] = $accept; } else { $conf[CURLOPT_ENCODING] = ''; // Don't let curl send the header over the wire $conf[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; } } if (isset($options['sink'])) { $sink = $options['sink']; if (!is_string($sink)) { $sink = \GuzzleHttp\Psr7\stream_for($sink); } elseif (!is_dir(dirname($sink))) { // Ensure that the directory exists before failing in curl. throw new \RuntimeException(sprintf( 'Directory %s does not exist for sink value of %s', dirname($sink), $sink )); } else { $sink = new LazyOpenStream($sink, 'w+'); } $easy->sink = $sink; $conf[CURLOPT_WRITEFUNCTION] = function ($ch, $write) use ($sink) { return $sink->write($write); }; } else { // Use a default temp stream if no sink was set. $conf[CURLOPT_FILE] = fopen('php://temp', 'w+'); $easy->sink = Psr7\stream_for($conf[CURLOPT_FILE]); } $timeoutRequiresNoSignal = false; if (isset($options['timeout'])) { $timeoutRequiresNoSignal |= $options['timeout'] < 1; $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; } // CURL default value is CURL_IPRESOLVE_WHATEVER if (isset($options['force_ip_resolve'])) { if ('v4' === $options['force_ip_resolve']) { $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4; } elseif ('v6' === $options['force_ip_resolve']) { $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6; } } if (isset($options['connect_timeout'])) { $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1; $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; } if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { $conf[CURLOPT_NOSIGNAL] = true; } if (isset($options['proxy'])) { if (!is_array($options['proxy'])) { $conf[CURLOPT_PROXY] = $options['proxy']; } else { $scheme = $easy->request->getUri()->getScheme(); if (isset($options['proxy'][$scheme])) { $host = $easy->request->getUri()->getHost(); if (!isset($options['proxy']['no']) || !\GuzzleHttp\is_host_in_noproxy($host, $options['proxy']['no']) ) { $conf[CURLOPT_PROXY] = $options['proxy'][$scheme]; } } } } if (isset($options['cert'])) { $cert = $options['cert']; if (is_array($cert)) { $conf[CURLOPT_SSLCERTPASSWD] = $cert[1]; $cert = $cert[0]; } if (!file_exists($cert)) { throw new \InvalidArgumentException( "SSL certificate not found: {$cert}" ); } $conf[CURLOPT_SSLCERT] = $cert; } if (isset($options['ssl_key'])) { if (is_array($options['ssl_key'])) { if (count($options['ssl_key']) === 2) { list($sslKey, $conf[CURLOPT_SSLKEYPASSWD]) = $options['ssl_key']; } else { list($sslKey) = $options['ssl_key']; } } $sslKey = isset($sslKey) ? $sslKey: $options['ssl_key']; if (!file_exists($sslKey)) { throw new \InvalidArgumentException( "SSL private key not found: {$sslKey}" ); } $conf[CURLOPT_SSLKEY] = $sslKey; } if (isset($options['progress'])) { $progress = $options['progress']; if (!is_callable($progress)) { throw new \InvalidArgumentException( 'progress client option must be callable' ); } $conf[CURLOPT_NOPROGRESS] = false; $conf[CURLOPT_PROGRESSFUNCTION] = function () use ($progress) { $args = func_get_args(); // PHP 5.5 pushed the handle onto the start of the args if (is_resource($args[0])) { array_shift($args); } call_user_func_array($progress, $args); }; } if (!empty($options['debug'])) { $conf[CURLOPT_STDERR] = \GuzzleHttp\debug_resource($options['debug']); $conf[CURLOPT_VERBOSE] = true; } } /** * This function ensures that a response was set on a transaction. If one * was not set, then the request is retried if possible. This error * typically means you are sending a payload, curl encountered a * "Connection died, retrying a fresh connect" error, tried to rewind the * stream, and then encountered a "necessary data rewind wasn't possible" * error, causing the request to be sent through curl_multi_info_read() * without an error status. */ private static function retryFailedRewind( callable $handler, EasyHandle $easy, array $ctx ) { try { // Only rewind if the body has been read from. $body = $easy->request->getBody(); if ($body->tell() > 0) { $body->rewind(); } } catch (\RuntimeException $e) { $ctx['error'] = 'The connection unexpectedly failed without ' . 'providing an error. The request would have been retried, ' . 'but attempting to rewind the request body failed. ' . 'Exception: ' . $e; return self::createRejection($easy, $ctx); } // Retry no more than 3 times before giving up. if (!isset($easy->options['_curl_retries'])) { $easy->options['_curl_retries'] = 1; } elseif ($easy->options['_curl_retries'] == 2) { $ctx['error'] = 'The cURL request was retried 3 times ' . 'and did not succeed. The most likely reason for the failure ' . 'is that cURL was unable to rewind the body of the request ' . 'and subsequent retries resulted in the same error. Turn on ' . 'the debug option to see what went wrong. See ' . 'https://bugs.php.net/bug.php?id=47204 for more information.'; return self::createRejection($easy, $ctx); } else { $easy->options['_curl_retries']++; } return $handler($easy->request, $easy->options); } private function createHeaderFn(EasyHandle $easy) { if (isset($easy->options['on_headers'])) { $onHeaders = $easy->options['on_headers']; if (!is_callable($onHeaders)) { throw new \InvalidArgumentException('on_headers must be callable'); } } else { $onHeaders = null; } return function ($ch, $h) use ( $onHeaders, $easy, &$startingResponse ) { $value = trim($h); if ($value === '') { $startingResponse = true; $easy->createResponse(); if ($onHeaders !== null) { try { $onHeaders($easy->response); } catch (\Exception $e) { // Associate the exception with the handle and trigger // a curl header write error by returning 0. $easy->onHeadersException = $e; return -1; } } } elseif ($startingResponse) { $startingResponse = false; $easy->headers = [$value]; } else { $easy->headers[] = $value; } return strlen($h); }; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php ================================================ factory = isset($options['handle_factory']) ? $options['handle_factory'] : new CurlFactory(3); } public function __invoke(RequestInterface $request, array $options) { if (isset($options['delay'])) { usleep($options['delay'] * 1000); } $easy = $this->factory->create($request, $options); curl_exec($easy->handle); $easy->errno = curl_errno($easy->handle); return CurlFactory::finish($this, $easy, $this->factory); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php ================================================ factory = isset($options['handle_factory']) ? $options['handle_factory'] : new CurlFactory(50); if (isset($options['select_timeout'])) { $this->selectTimeout = $options['select_timeout']; } elseif ($selectTimeout = getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { $this->selectTimeout = $selectTimeout; } else { $this->selectTimeout = 1; } $this->options = isset($options['options']) ? $options['options'] : []; } public function __get($name) { if ($name === '_mh') { $this->_mh = curl_multi_init(); foreach ($this->options as $option => $value) { // A warning is raised in case of a wrong option. curl_multi_setopt($this->_mh, $option, $value); } // Further calls to _mh will return the value directly, without entering the // __get() method at all. return $this->_mh; } throw new \BadMethodCallException(); } public function __destruct() { if (isset($this->_mh)) { curl_multi_close($this->_mh); unset($this->_mh); } } public function __invoke(RequestInterface $request, array $options) { $easy = $this->factory->create($request, $options); $id = (int) $easy->handle; $promise = new Promise( [$this, 'execute'], function () use ($id) { return $this->cancel($id); } ); $this->addRequest(['easy' => $easy, 'deferred' => $promise]); return $promise; } /** * Ticks the curl event loop. */ public function tick() { // Add any delayed handles if needed. if ($this->delays) { $currentTime = Utils::currentTime(); foreach ($this->delays as $id => $delay) { if ($currentTime >= $delay) { unset($this->delays[$id]); curl_multi_add_handle( $this->_mh, $this->handles[$id]['easy']->handle ); } } } // Step through the task queue which may add additional requests. P\queue()->run(); if ($this->active && curl_multi_select($this->_mh, $this->selectTimeout) === -1 ) { // Perform a usleep if a select returns -1. // See: https://bugs.php.net/bug.php?id=61141 usleep(250); } while (curl_multi_exec($this->_mh, $this->active) === CURLM_CALL_MULTI_PERFORM); $this->processMessages(); } /** * Runs until all outstanding connections have completed. */ public function execute() { $queue = P\queue(); while ($this->handles || !$queue->isEmpty()) { // If there are no transfers, then sleep for the next delay if (!$this->active && $this->delays) { usleep($this->timeToNext()); } $this->tick(); } } private function addRequest(array $entry) { $easy = $entry['easy']; $id = (int) $easy->handle; $this->handles[$id] = $entry; if (empty($easy->options['delay'])) { curl_multi_add_handle($this->_mh, $easy->handle); } else { $this->delays[$id] = Utils::currentTime() + ($easy->options['delay'] / 1000); } } /** * Cancels a handle from sending and removes references to it. * * @param int $id Handle ID to cancel and remove. * * @return bool True on success, false on failure. */ private function cancel($id) { // Cannot cancel if it has been processed. if (!isset($this->handles[$id])) { return false; } $handle = $this->handles[$id]['easy']->handle; unset($this->delays[$id], $this->handles[$id]); curl_multi_remove_handle($this->_mh, $handle); curl_close($handle); return true; } private function processMessages() { while ($done = curl_multi_info_read($this->_mh)) { $id = (int) $done['handle']; curl_multi_remove_handle($this->_mh, $done['handle']); if (!isset($this->handles[$id])) { // Probably was cancelled. continue; } $entry = $this->handles[$id]; unset($this->handles[$id], $this->delays[$id]); $entry['easy']->errno = $done['result']; $entry['deferred']->resolve( CurlFactory::finish( $this, $entry['easy'], $this->factory ) ); } } private function timeToNext() { $currentTime = Utils::currentTime(); $nextTime = PHP_INT_MAX; foreach ($this->delays as $time) { if ($time < $nextTime) { $nextTime = $time; } } return max(0, $nextTime - $currentTime) * 1000000; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php ================================================ headers)) { throw new \RuntimeException('No headers have been received'); } // HTTP-version SP status-code SP reason-phrase $startLine = explode(' ', array_shift($this->headers), 3); $headers = \GuzzleHttp\headers_from_lines($this->headers); $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers); if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding']) ) { $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; unset($headers[$normalizedKeys['content-encoding']]); if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $bodyLength = (int) $this->sink->getSize(); if ($bodyLength) { $headers[$normalizedKeys['content-length']] = $bodyLength; } else { unset($headers[$normalizedKeys['content-length']]); } } } // Attach a response to the easy handle with the parsed headers. $this->response = new Response( $startLine[1], $headers, $this->sink, substr($startLine[0], 5), isset($startLine[2]) ? (string) $startLine[2] : null ); } public function __get($name) { $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name; throw new \BadMethodCallException($msg); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php ================================================ onFulfilled = $onFulfilled; $this->onRejected = $onRejected; if ($queue) { call_user_func_array([$this, 'append'], $queue); } } public function __invoke(RequestInterface $request, array $options) { if (!$this->queue) { throw new \OutOfBoundsException('Mock queue is empty'); } if (isset($options['delay']) && is_numeric($options['delay'])) { usleep($options['delay'] * 1000); } $this->lastRequest = $request; $this->lastOptions = $options; $response = array_shift($this->queue); if (isset($options['on_headers'])) { if (!is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } try { $options['on_headers']($response); } catch (\Exception $e) { $msg = 'An error was encountered during the on_headers event'; $response = new RequestException($msg, $request, $response, $e); } } if (is_callable($response)) { $response = call_user_func($response, $request, $options); } $response = $response instanceof \Exception ? \GuzzleHttp\Promise\rejection_for($response) : \GuzzleHttp\Promise\promise_for($response); return $response->then( function ($value) use ($request, $options) { $this->invokeStats($request, $options, $value); if ($this->onFulfilled) { call_user_func($this->onFulfilled, $value); } if (isset($options['sink'])) { $contents = (string) $value->getBody(); $sink = $options['sink']; if (is_resource($sink)) { fwrite($sink, $contents); } elseif (is_string($sink)) { file_put_contents($sink, $contents); } elseif ($sink instanceof \Psr\Http\Message\StreamInterface) { $sink->write($contents); } } return $value; }, function ($reason) use ($request, $options) { $this->invokeStats($request, $options, null, $reason); if ($this->onRejected) { call_user_func($this->onRejected, $reason); } return \GuzzleHttp\Promise\rejection_for($reason); } ); } /** * Adds one or more variadic requests, exceptions, callables, or promises * to the queue. */ public function append() { foreach (func_get_args() as $value) { if ($value instanceof ResponseInterface || $value instanceof \Exception || $value instanceof PromiseInterface || is_callable($value) ) { $this->queue[] = $value; } else { throw new \InvalidArgumentException('Expected a response or ' . 'exception. Found ' . \GuzzleHttp\describe_type($value)); } } } /** * Get the last received request. * * @return RequestInterface */ public function getLastRequest() { return $this->lastRequest; } /** * Get the last received request options. * * @return array */ public function getLastOptions() { return $this->lastOptions; } /** * Returns the number of remaining items in the queue. * * @return int */ public function count() { return count($this->queue); } public function reset() { $this->queue = []; } private function invokeStats( RequestInterface $request, array $options, ResponseInterface $response = null, $reason = null ) { if (isset($options['on_stats'])) { $transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0; $stats = new TransferStats($request, $response, $transferTime, $reason); call_user_func($options['on_stats'], $stats); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php ================================================ withoutHeader('Expect'); // Append a content-length header if body size is zero to match // cURL's behavior. if (0 === $request->getBody()->getSize()) { $request = $request->withHeader('Content-Length', '0'); } return $this->createResponse( $request, $options, $this->createStream($request, $options), $startTime ); } catch (\InvalidArgumentException $e) { throw $e; } catch (\Exception $e) { // Determine if the error was a networking error. $message = $e->getMessage(); // This list can probably get more comprehensive. if (strpos($message, 'getaddrinfo') // DNS lookup failed || strpos($message, 'Connection refused') || strpos($message, "couldn't connect to host") // error on HHVM || strpos($message, "connection attempt failed") ) { $e = new ConnectException($e->getMessage(), $request, $e); } $e = RequestException::wrapException($request, $e); $this->invokeStats($options, $request, $startTime, null, $e); return \GuzzleHttp\Promise\rejection_for($e); } } private function invokeStats( array $options, RequestInterface $request, $startTime, ResponseInterface $response = null, $error = null ) { if (isset($options['on_stats'])) { $stats = new TransferStats( $request, $response, Utils::currentTime() - $startTime, $error, [] ); call_user_func($options['on_stats'], $stats); } } private function createResponse( RequestInterface $request, array $options, $stream, $startTime ) { $hdrs = $this->lastHeaders; $this->lastHeaders = []; $parts = explode(' ', array_shift($hdrs), 3); $ver = explode('/', $parts[0])[1]; $status = $parts[1]; $reason = isset($parts[2]) ? $parts[2] : null; $headers = \GuzzleHttp\headers_from_lines($hdrs); list($stream, $headers) = $this->checkDecode($options, $headers, $stream); $stream = Psr7\stream_for($stream); $sink = $stream; if (strcasecmp('HEAD', $request->getMethod())) { $sink = $this->createSink($stream, $options); } $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); if (isset($options['on_headers'])) { try { $options['on_headers']($response); } catch (\Exception $e) { $msg = 'An error was encountered during the on_headers event'; $ex = new RequestException($msg, $request, $response, $e); return \GuzzleHttp\Promise\rejection_for($ex); } } // Do not drain when the request is a HEAD request because they have // no body. if ($sink !== $stream) { $this->drain( $stream, $sink, $response->getHeaderLine('Content-Length') ); } $this->invokeStats($options, $request, $startTime, $response, null); return new FulfilledPromise($response); } private function createSink(StreamInterface $stream, array $options) { if (!empty($options['stream'])) { return $stream; } $sink = isset($options['sink']) ? $options['sink'] : fopen('php://temp', 'r+'); return is_string($sink) ? new Psr7\LazyOpenStream($sink, 'w+') : Psr7\stream_for($sink); } private function checkDecode(array $options, array $headers, $stream) { // Automatically decode responses when instructed. if (!empty($options['decode_content'])) { $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers); if (isset($normalizedKeys['content-encoding'])) { $encoding = $headers[$normalizedKeys['content-encoding']]; if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') { $stream = new Psr7\InflateStream( Psr7\stream_for($stream) ); $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; // Remove content-encoding header unset($headers[$normalizedKeys['content-encoding']]); // Fix content-length header if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $length = (int) $stream->getSize(); if ($length === 0) { unset($headers[$normalizedKeys['content-length']]); } else { $headers[$normalizedKeys['content-length']] = [$length]; } } } } } return [$stream, $headers]; } /** * Drains the source stream into the "sink" client option. * * @param StreamInterface $source * @param StreamInterface $sink * @param string $contentLength Header specifying the amount of * data to read. * * @return StreamInterface * @throws \RuntimeException when the sink option is invalid. */ private function drain( StreamInterface $source, StreamInterface $sink, $contentLength ) { // If a content-length header is provided, then stop reading once // that number of bytes has been read. This can prevent infinitely // reading from a stream when dealing with servers that do not honor // Connection: Close headers. Psr7\copy_to_stream( $source, $sink, (strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1 ); $sink->seek(0); $source->close(); return $sink; } /** * Create a resource and check to ensure it was created successfully * * @param callable $callback Callable that returns stream resource * * @return resource * @throws \RuntimeException on error */ private function createResource(callable $callback) { $errors = null; set_error_handler(function ($_, $msg, $file, $line) use (&$errors) { $errors[] = [ 'message' => $msg, 'file' => $file, 'line' => $line ]; return true; }); $resource = $callback(); restore_error_handler(); if (!$resource) { $message = 'Error creating resource: '; foreach ($errors as $err) { foreach ($err as $key => $value) { $message .= "[$key] $value" . PHP_EOL; } } throw new \RuntimeException(trim($message)); } return $resource; } private function createStream(RequestInterface $request, array $options) { static $methods; if (!$methods) { $methods = array_flip(get_class_methods(__CLASS__)); } // HTTP/1.1 streams using the PHP stream wrapper require a // Connection: close header if ($request->getProtocolVersion() == '1.1' && !$request->hasHeader('Connection') ) { $request = $request->withHeader('Connection', 'close'); } // Ensure SSL is verified by default if (!isset($options['verify'])) { $options['verify'] = true; } $params = []; $context = $this->getDefaultContext($request); if (isset($options['on_headers']) && !is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } if (!empty($options)) { foreach ($options as $key => $value) { $method = "add_{$key}"; if (isset($methods[$method])) { $this->{$method}($request, $context, $value, $params); } } } if (isset($options['stream_context'])) { if (!is_array($options['stream_context'])) { throw new \InvalidArgumentException('stream_context must be an array'); } $context = array_replace_recursive( $context, $options['stream_context'] ); } // Microsoft NTLM authentication only supported with curl handler if (isset($options['auth']) && is_array($options['auth']) && isset($options['auth'][2]) && 'ntlm' == $options['auth'][2] ) { throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler'); } $uri = $this->resolveHost($request, $options); $context = $this->createResource( function () use ($context, $params) { return stream_context_create($context, $params); } ); return $this->createResource( function () use ($uri, &$http_response_header, $context, $options) { $resource = fopen((string) $uri, 'r', null, $context); $this->lastHeaders = $http_response_header; if (isset($options['read_timeout'])) { $readTimeout = $options['read_timeout']; $sec = (int) $readTimeout; $usec = ($readTimeout - $sec) * 100000; stream_set_timeout($resource, $sec, $usec); } return $resource; } ); } private function resolveHost(RequestInterface $request, array $options) { $uri = $request->getUri(); if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) { if ('v4' === $options['force_ip_resolve']) { $records = dns_get_record($uri->getHost(), DNS_A); if (!isset($records[0]['ip'])) { throw new ConnectException( sprintf( "Could not resolve IPv4 address for host '%s'", $uri->getHost() ), $request ); } $uri = $uri->withHost($records[0]['ip']); } elseif ('v6' === $options['force_ip_resolve']) { $records = dns_get_record($uri->getHost(), DNS_AAAA); if (!isset($records[0]['ipv6'])) { throw new ConnectException( sprintf( "Could not resolve IPv6 address for host '%s'", $uri->getHost() ), $request ); } $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']'); } } return $uri; } private function getDefaultContext(RequestInterface $request) { $headers = ''; foreach ($request->getHeaders() as $name => $value) { foreach ($value as $val) { $headers .= "$name: $val\r\n"; } } $context = [ 'http' => [ 'method' => $request->getMethod(), 'header' => $headers, 'protocol_version' => $request->getProtocolVersion(), 'ignore_errors' => true, 'follow_location' => 0, ], ]; $body = (string) $request->getBody(); if (!empty($body)) { $context['http']['content'] = $body; // Prevent the HTTP handler from adding a Content-Type header. if (!$request->hasHeader('Content-Type')) { $context['http']['header'] .= "Content-Type:\r\n"; } } $context['http']['header'] = rtrim($context['http']['header']); return $context; } private function add_proxy(RequestInterface $request, &$options, $value, &$params) { if (!is_array($value)) { $options['http']['proxy'] = $value; } else { $scheme = $request->getUri()->getScheme(); if (isset($value[$scheme])) { if (!isset($value['no']) || !\GuzzleHttp\is_host_in_noproxy( $request->getUri()->getHost(), $value['no'] ) ) { $options['http']['proxy'] = $value[$scheme]; } } } } private function add_timeout(RequestInterface $request, &$options, $value, &$params) { if ($value > 0) { $options['http']['timeout'] = $value; } } private function add_verify(RequestInterface $request, &$options, $value, &$params) { if ($value === true) { // PHP 5.6 or greater will find the system cert by default. When // < 5.6, use the Guzzle bundled cacert. if (PHP_VERSION_ID < 50600) { $options['ssl']['cafile'] = \GuzzleHttp\default_ca_bundle(); } } elseif (is_string($value)) { $options['ssl']['cafile'] = $value; if (!file_exists($value)) { throw new \RuntimeException("SSL CA bundle not found: $value"); } } elseif ($value === false) { $options['ssl']['verify_peer'] = false; $options['ssl']['verify_peer_name'] = false; return; } else { throw new \InvalidArgumentException('Invalid verify request option'); } $options['ssl']['verify_peer'] = true; $options['ssl']['verify_peer_name'] = true; $options['ssl']['allow_self_signed'] = false; } private function add_cert(RequestInterface $request, &$options, $value, &$params) { if (is_array($value)) { $options['ssl']['passphrase'] = $value[1]; $value = $value[0]; } if (!file_exists($value)) { throw new \RuntimeException("SSL certificate not found: {$value}"); } $options['ssl']['local_cert'] = $value; } private function add_progress(RequestInterface $request, &$options, $value, &$params) { $this->addNotification( $params, function ($code, $a, $b, $c, $transferred, $total) use ($value) { if ($code == STREAM_NOTIFY_PROGRESS) { $value($total, $transferred, null, null); } } ); } private function add_debug(RequestInterface $request, &$options, $value, &$params) { if ($value === false) { return; } static $map = [ STREAM_NOTIFY_CONNECT => 'CONNECT', STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', STREAM_NOTIFY_PROGRESS => 'PROGRESS', STREAM_NOTIFY_FAILURE => 'FAILURE', STREAM_NOTIFY_COMPLETED => 'COMPLETED', STREAM_NOTIFY_RESOLVE => 'RESOLVE', ]; static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max']; $value = \GuzzleHttp\debug_resource($value); $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment(''); $this->addNotification( $params, function () use ($ident, $value, $map, $args) { $passed = func_get_args(); $code = array_shift($passed); fprintf($value, '<%s> [%s] ', $ident, $map[$code]); foreach (array_filter($passed) as $i => $v) { fwrite($value, $args[$i] . ': "' . $v . '" '); } fwrite($value, "\n"); } ); } private function addNotification(array &$params, callable $notify) { // Wrap the existing function if needed. if (!isset($params['notification'])) { $params['notification'] = $notify; } else { $params['notification'] = $this->callArray([ $params['notification'], $notify ]); } } private function callArray(array $functions) { return function () use ($functions) { $args = func_get_args(); foreach ($functions as $fn) { call_user_func_array($fn, $args); } }; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/HandlerStack.php ================================================ push(Middleware::httpErrors(), 'http_errors'); $stack->push(Middleware::redirect(), 'allow_redirects'); $stack->push(Middleware::cookies(), 'cookies'); $stack->push(Middleware::prepareBody(), 'prepare_body'); return $stack; } /** * @param callable $handler Underlying HTTP handler. */ public function __construct(callable $handler = null) { $this->handler = $handler; } /** * Invokes the handler stack as a composed handler * * @param RequestInterface $request * @param array $options * * @return ResponseInterface|PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $handler = $this->resolve(); return $handler($request, $options); } /** * Dumps a string representation of the stack. * * @return string */ public function __toString() { $depth = 0; $stack = []; if ($this->handler) { $stack[] = "0) Handler: " . $this->debugCallable($this->handler); } $result = ''; foreach (array_reverse($this->stack) as $tuple) { $depth++; $str = "{$depth}) Name: '{$tuple[1]}', "; $str .= "Function: " . $this->debugCallable($tuple[0]); $result = "> {$str}\n{$result}"; $stack[] = $str; } foreach (array_keys($stack) as $k) { $result .= "< {$stack[$k]}\n"; } return $result; } /** * Set the HTTP handler that actually returns a promise. * * @param callable $handler Accepts a request and array of options and * returns a Promise. */ public function setHandler(callable $handler) { $this->handler = $handler; $this->cached = null; } /** * Returns true if the builder has a handler. * * @return bool */ public function hasHandler() { return (bool) $this->handler; } /** * Unshift a middleware to the bottom of the stack. * * @param callable $middleware Middleware function * @param string $name Name to register for this middleware. */ public function unshift(callable $middleware, $name = null) { array_unshift($this->stack, [$middleware, $name]); $this->cached = null; } /** * Push a middleware to the top of the stack. * * @param callable $middleware Middleware function * @param string $name Name to register for this middleware. */ public function push(callable $middleware, $name = '') { $this->stack[] = [$middleware, $name]; $this->cached = null; } /** * Add a middleware before another middleware by name. * * @param string $findName Middleware to find * @param callable $middleware Middleware function * @param string $withName Name to register for this middleware. */ public function before($findName, callable $middleware, $withName = '') { $this->splice($findName, $withName, $middleware, true); } /** * Add a middleware after another middleware by name. * * @param string $findName Middleware to find * @param callable $middleware Middleware function * @param string $withName Name to register for this middleware. */ public function after($findName, callable $middleware, $withName = '') { $this->splice($findName, $withName, $middleware, false); } /** * Remove a middleware by instance or name from the stack. * * @param callable|string $remove Middleware to remove by instance or name. */ public function remove($remove) { $this->cached = null; $idx = is_callable($remove) ? 0 : 1; $this->stack = array_values(array_filter( $this->stack, function ($tuple) use ($idx, $remove) { return $tuple[$idx] !== $remove; } )); } /** * Compose the middleware and handler into a single callable function. * * @return callable */ public function resolve() { if (!$this->cached) { if (!($prev = $this->handler)) { throw new \LogicException('No handler has been specified'); } foreach (array_reverse($this->stack) as $fn) { $prev = $fn[0]($prev); } $this->cached = $prev; } return $this->cached; } /** * @param string $name * @return int */ private function findByName($name) { foreach ($this->stack as $k => $v) { if ($v[1] === $name) { return $k; } } throw new \InvalidArgumentException("Middleware not found: $name"); } /** * Splices a function into the middleware list at a specific position. * * @param string $findName * @param string $withName * @param callable $middleware * @param bool $before */ private function splice($findName, $withName, callable $middleware, $before) { $this->cached = null; $idx = $this->findByName($findName); $tuple = [$middleware, $withName]; if ($before) { if ($idx === 0) { array_unshift($this->stack, $tuple); } else { $replacement = [$tuple, $this->stack[$idx]]; array_splice($this->stack, $idx, 1, $replacement); } } elseif ($idx === count($this->stack) - 1) { $this->stack[] = $tuple; } else { $replacement = [$this->stack[$idx], $tuple]; array_splice($this->stack, $idx, 1, $replacement); } } /** * Provides a debug string for a given callable. * * @param array|callable $fn Function to write as a string. * * @return string */ private function debugCallable($fn) { if (is_string($fn)) { return "callable({$fn})"; } if (is_array($fn)) { return is_string($fn[0]) ? "callable({$fn[0]}::{$fn[1]})" : "callable(['" . get_class($fn[0]) . "', '{$fn[1]}'])"; } return 'callable(' . spl_object_hash($fn) . ')'; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/MessageFormatter.php ================================================ >>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; /** @var string Template used to format log messages */ private $template; /** * @param string $template Log message template */ public function __construct($template = self::CLF) { $this->template = $template ?: self::CLF; } /** * Returns a formatted message string. * * @param RequestInterface $request Request that was sent * @param ResponseInterface $response Response that was received * @param \Exception $error Exception that was received * * @return string */ public function format( RequestInterface $request, ResponseInterface $response = null, \Exception $error = null ) { $cache = []; return preg_replace_callback( '/{\s*([A-Za-z_\-\.0-9]+)\s*}/', function (array $matches) use ($request, $response, $error, &$cache) { if (isset($cache[$matches[1]])) { return $cache[$matches[1]]; } $result = ''; switch ($matches[1]) { case 'request': $result = Psr7\str($request); break; case 'response': $result = $response ? Psr7\str($response) : ''; break; case 'req_headers': $result = trim($request->getMethod() . ' ' . $request->getRequestTarget()) . ' HTTP/' . $request->getProtocolVersion() . "\r\n" . $this->headers($request); break; case 'res_headers': $result = $response ? sprintf( 'HTTP/%s %d %s', $response->getProtocolVersion(), $response->getStatusCode(), $response->getReasonPhrase() ) . "\r\n" . $this->headers($response) : 'NULL'; break; case 'req_body': $result = $request->getBody(); break; case 'res_body': $result = $response ? $response->getBody() : 'NULL'; break; case 'ts': case 'date_iso_8601': $result = gmdate('c'); break; case 'date_common_log': $result = date('d/M/Y:H:i:s O'); break; case 'method': $result = $request->getMethod(); break; case 'version': $result = $request->getProtocolVersion(); break; case 'uri': case 'url': $result = $request->getUri(); break; case 'target': $result = $request->getRequestTarget(); break; case 'req_version': $result = $request->getProtocolVersion(); break; case 'res_version': $result = $response ? $response->getProtocolVersion() : 'NULL'; break; case 'host': $result = $request->getHeaderLine('Host'); break; case 'hostname': $result = gethostname(); break; case 'code': $result = $response ? $response->getStatusCode() : 'NULL'; break; case 'phrase': $result = $response ? $response->getReasonPhrase() : 'NULL'; break; case 'error': $result = $error ? $error->getMessage() : 'NULL'; break; default: // handle prefixed dynamic headers if (strpos($matches[1], 'req_header_') === 0) { $result = $request->getHeaderLine(substr($matches[1], 11)); } elseif (strpos($matches[1], 'res_header_') === 0) { $result = $response ? $response->getHeaderLine(substr($matches[1], 11)) : 'NULL'; } } $cache[$matches[1]] = $result; return $result; }, $this->template ); } /** * Get headers from message as string * * @return string */ private function headers(MessageInterface $message) { $result = ''; foreach ($message->getHeaders() as $name => $values) { $result .= $name . ': ' . implode(', ', $values) . "\r\n"; } return trim($result); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Middleware.php ================================================ withCookieHeader($request); return $handler($request, $options) ->then( function ($response) use ($cookieJar, $request) { $cookieJar->extractCookies($request, $response); return $response; } ); }; }; } /** * Middleware that throws exceptions for 4xx or 5xx responses when the * "http_error" request option is set to true. * * @return callable Returns a function that accepts the next handler. */ public static function httpErrors() { return function (callable $handler) { return function ($request, array $options) use ($handler) { if (empty($options['http_errors'])) { return $handler($request, $options); } return $handler($request, $options)->then( function (ResponseInterface $response) use ($request) { $code = $response->getStatusCode(); if ($code < 400) { return $response; } throw RequestException::create($request, $response); } ); }; }; } /** * Middleware that pushes history data to an ArrayAccess container. * * @param array|\ArrayAccess $container Container to hold the history (by reference). * * @return callable Returns a function that accepts the next handler. * @throws \InvalidArgumentException if container is not an array or ArrayAccess. */ public static function history(&$container) { if (!is_array($container) && !$container instanceof \ArrayAccess) { throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess'); } return function (callable $handler) use (&$container) { return function ($request, array $options) use ($handler, &$container) { return $handler($request, $options)->then( function ($value) use ($request, &$container, $options) { $container[] = [ 'request' => $request, 'response' => $value, 'error' => null, 'options' => $options ]; return $value; }, function ($reason) use ($request, &$container, $options) { $container[] = [ 'request' => $request, 'response' => null, 'error' => $reason, 'options' => $options ]; return \GuzzleHttp\Promise\rejection_for($reason); } ); }; }; } /** * Middleware that invokes a callback before and after sending a request. * * The provided listener cannot modify or alter the response. It simply * "taps" into the chain to be notified before returning the promise. The * before listener accepts a request and options array, and the after * listener accepts a request, options array, and response promise. * * @param callable $before Function to invoke before forwarding the request. * @param callable $after Function invoked after forwarding. * * @return callable Returns a function that accepts the next handler. */ public static function tap(callable $before = null, callable $after = null) { return function (callable $handler) use ($before, $after) { return function ($request, array $options) use ($handler, $before, $after) { if ($before) { $before($request, $options); } $response = $handler($request, $options); if ($after) { $after($request, $options, $response); } return $response; }; }; } /** * Middleware that handles request redirects. * * @return callable Returns a function that accepts the next handler. */ public static function redirect() { return function (callable $handler) { return new RedirectMiddleware($handler); }; } /** * Middleware that retries requests based on the boolean result of * invoking the provided "decider" function. * * If no delay function is provided, a simple implementation of exponential * backoff will be utilized. * * @param callable $decider Function that accepts the number of retries, * a request, [response], and [exception] and * returns true if the request is to be retried. * @param callable $delay Function that accepts the number of retries and * returns the number of milliseconds to delay. * * @return callable Returns a function that accepts the next handler. */ public static function retry(callable $decider, callable $delay = null) { return function (callable $handler) use ($decider, $delay) { return new RetryMiddleware($decider, $handler, $delay); }; } /** * Middleware that logs requests, responses, and errors using a message * formatter. * * @param LoggerInterface $logger Logs messages. * @param MessageFormatter $formatter Formatter used to create message strings. * @param string $logLevel Level at which to log requests. * * @return callable Returns a function that accepts the next handler. */ public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info' /* \Psr\Log\LogLevel::INFO */) { return function (callable $handler) use ($logger, $formatter, $logLevel) { return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) { return $handler($request, $options)->then( function ($response) use ($logger, $request, $formatter, $logLevel) { $message = $formatter->format($request, $response); $logger->log($logLevel, $message); return $response; }, function ($reason) use ($logger, $request, $formatter) { $response = $reason instanceof RequestException ? $reason->getResponse() : null; $message = $formatter->format($request, $response, $reason); $logger->notice($message); return \GuzzleHttp\Promise\rejection_for($reason); } ); }; }; } /** * This middleware adds a default content-type if possible, a default * content-length or transfer-encoding header, and the expect header. * * @return callable */ public static function prepareBody() { return function (callable $handler) { return new PrepareBodyMiddleware($handler); }; } /** * Middleware that applies a map function to the request before passing to * the next handler. * * @param callable $fn Function that accepts a RequestInterface and returns * a RequestInterface. * @return callable */ public static function mapRequest(callable $fn) { return function (callable $handler) use ($fn) { return function ($request, array $options) use ($handler, $fn) { return $handler($fn($request), $options); }; }; } /** * Middleware that applies a map function to the resolved promise's * response. * * @param callable $fn Function that accepts a ResponseInterface and * returns a ResponseInterface. * @return callable */ public static function mapResponse(callable $fn) { return function (callable $handler) use ($fn) { return function ($request, array $options) use ($handler, $fn) { return $handler($request, $options)->then($fn); }; }; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Pool.php ================================================ $rfn) { if ($rfn instanceof RequestInterface) { yield $key => $client->sendAsync($rfn, $opts); } elseif (is_callable($rfn)) { yield $key => $rfn($opts); } else { throw new \InvalidArgumentException('Each value yielded by ' . 'the iterator must be a Psr7\Http\Message\RequestInterface ' . 'or a callable that returns a promise that fulfills ' . 'with a Psr7\Message\Http\ResponseInterface object.'); } } }; $this->each = new EachPromise($requests(), $config); } /** * Get promise * * @return PromiseInterface */ public function promise() { return $this->each->promise(); } /** * Sends multiple requests concurrently and returns an array of responses * and exceptions that uses the same ordering as the provided requests. * * IMPORTANT: This method keeps every request and response in memory, and * as such, is NOT recommended when sending a large number or an * indeterminate number of requests concurrently. * * @param ClientInterface $client Client used to send the requests * @param array|\Iterator $requests Requests to send concurrently. * @param array $options Passes through the options available in * {@see GuzzleHttp\Pool::__construct} * * @return array Returns an array containing the response or an exception * in the same order that the requests were sent. * @throws \InvalidArgumentException if the event format is incorrect. */ public static function batch( ClientInterface $client, $requests, array $options = [] ) { $res = []; self::cmpCallback($options, 'fulfilled', $res); self::cmpCallback($options, 'rejected', $res); $pool = new static($client, $requests, $options); $pool->promise()->wait(); ksort($res); return $res; } /** * Execute callback(s) * * @return void */ private static function cmpCallback(array &$options, $name, array &$results) { if (!isset($options[$name])) { $options[$name] = function ($v, $k) use (&$results) { $results[$k] = $v; }; } else { $currentFn = $options[$name]; $options[$name] = function ($v, $k) use (&$results, $currentFn) { $currentFn($v, $k); $results[$k] = $v; }; } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php ================================================ nextHandler = $nextHandler; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $fn = $this->nextHandler; // Don't do anything if the request has no body. if ($request->getBody()->getSize() === 0) { return $fn($request, $options); } $modify = []; // Add a default content-type if possible. if (!$request->hasHeader('Content-Type')) { if ($uri = $request->getBody()->getMetadata('uri')) { if ($type = Psr7\mimetype_from_filename($uri)) { $modify['set_headers']['Content-Type'] = $type; } } } // Add a default content-length or transfer-encoding header. if (!$request->hasHeader('Content-Length') && !$request->hasHeader('Transfer-Encoding') ) { $size = $request->getBody()->getSize(); if ($size !== null) { $modify['set_headers']['Content-Length'] = $size; } else { $modify['set_headers']['Transfer-Encoding'] = 'chunked'; } } // Add the expect header if needed. $this->addExpectHeader($request, $options, $modify); return $fn(Psr7\modify_request($request, $modify), $options); } /** * Add expect header * * @return void */ private function addExpectHeader( RequestInterface $request, array $options, array &$modify ) { // Determine if the Expect header should be used if ($request->hasHeader('Expect')) { return; } $expect = isset($options['expect']) ? $options['expect'] : null; // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0 if ($expect === false || $request->getProtocolVersion() < 1.1) { return; } // The expect header is unconditionally enabled if ($expect === true) { $modify['set_headers']['Expect'] = '100-Continue'; return; } // By default, send the expect header when the payload is > 1mb if ($expect === null) { $expect = 1048576; } // Always add if the body cannot be rewound, the size cannot be // determined, or the size is greater than the cutoff threshold $body = $request->getBody(); $size = $body->getSize(); if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { $modify['set_headers']['Expect'] = '100-Continue'; } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php ================================================ 5, 'protocols' => ['http', 'https'], 'strict' => false, 'referer' => false, 'track_redirects' => false, ]; /** @var callable */ private $nextHandler; /** * @param callable $nextHandler Next handler to invoke. */ public function __construct(callable $nextHandler) { $this->nextHandler = $nextHandler; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $fn = $this->nextHandler; if (empty($options['allow_redirects'])) { return $fn($request, $options); } if ($options['allow_redirects'] === true) { $options['allow_redirects'] = self::$defaultSettings; } elseif (!is_array($options['allow_redirects'])) { throw new \InvalidArgumentException('allow_redirects must be true, false, or array'); } else { // Merge the default settings with the provided settings $options['allow_redirects'] += self::$defaultSettings; } if (empty($options['allow_redirects']['max'])) { return $fn($request, $options); } return $fn($request, $options) ->then(function (ResponseInterface $response) use ($request, $options) { return $this->checkRedirect($request, $options, $response); }); } /** * @param RequestInterface $request * @param array $options * @param ResponseInterface $response * * @return ResponseInterface|PromiseInterface */ public function checkRedirect( RequestInterface $request, array $options, ResponseInterface $response ) { if (substr($response->getStatusCode(), 0, 1) != '3' || !$response->hasHeader('Location') ) { return $response; } $this->guardMax($request, $options); $nextRequest = $this->modifyRequest($request, $options, $response); if (isset($options['allow_redirects']['on_redirect'])) { call_user_func( $options['allow_redirects']['on_redirect'], $request, $response, $nextRequest->getUri() ); } /** @var PromiseInterface|ResponseInterface $promise */ $promise = $this($nextRequest, $options); // Add headers to be able to track history of redirects. if (!empty($options['allow_redirects']['track_redirects'])) { return $this->withTracking( $promise, (string) $nextRequest->getUri(), $response->getStatusCode() ); } return $promise; } /** * Enable tracking on promise. * * @return PromiseInterface */ private function withTracking(PromiseInterface $promise, $uri, $statusCode) { return $promise->then( function (ResponseInterface $response) use ($uri, $statusCode) { // Note that we are pushing to the front of the list as this // would be an earlier response than what is currently present // in the history header. $historyHeader = $response->getHeader(self::HISTORY_HEADER); $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER); array_unshift($historyHeader, $uri); array_unshift($statusHeader, $statusCode); return $response->withHeader(self::HISTORY_HEADER, $historyHeader) ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader); } ); } /** * Check for too many redirects * * @return void * * @throws TooManyRedirectsException Too many redirects. */ private function guardMax(RequestInterface $request, array &$options) { $current = isset($options['__redirect_count']) ? $options['__redirect_count'] : 0; $options['__redirect_count'] = $current + 1; $max = $options['allow_redirects']['max']; if ($options['__redirect_count'] > $max) { throw new TooManyRedirectsException( "Will not follow more than {$max} redirects", $request ); } } /** * @param RequestInterface $request * @param array $options * @param ResponseInterface $response * * @return RequestInterface */ public function modifyRequest( RequestInterface $request, array $options, ResponseInterface $response ) { // Request modifications to apply. $modify = []; $protocols = $options['allow_redirects']['protocols']; // Use a GET request if this is an entity enclosing request and we are // not forcing RFC compliance, but rather emulating what all browsers // would do. $statusCode = $response->getStatusCode(); if ($statusCode == 303 || ($statusCode <= 302 && !$options['allow_redirects']['strict']) ) { $modify['method'] = 'GET'; $modify['body'] = ''; } $uri = $this->redirectUri($request, $response, $protocols); if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) { $idnOptions = ($options['idn_conversion'] === true) ? IDNA_DEFAULT : $options['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } $modify['uri'] = $uri; Psr7\rewind_body($request); // Add the Referer header if it is told to do so and only // add the header if we are not redirecting from https to http. if ($options['allow_redirects']['referer'] && $modify['uri']->getScheme() === $request->getUri()->getScheme() ) { $uri = $request->getUri()->withUserInfo(''); $modify['set_headers']['Referer'] = (string) $uri; } else { $modify['remove_headers'][] = 'Referer'; } // Remove Authorization header if host is different. if ($request->getUri()->getHost() !== $modify['uri']->getHost()) { $modify['remove_headers'][] = 'Authorization'; } return Psr7\modify_request($request, $modify); } /** * Set the appropriate URL on the request based on the location header * * @param RequestInterface $request * @param ResponseInterface $response * @param array $protocols * * @return UriInterface */ private function redirectUri( RequestInterface $request, ResponseInterface $response, array $protocols ) { $location = Psr7\UriResolver::resolve( $request->getUri(), new Psr7\Uri($response->getHeaderLine('Location')) ); // Ensure that the redirect URI is allowed based on the protocols. if (!in_array($location->getScheme(), $protocols)) { throw new BadResponseException( sprintf( 'Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, implode(', ', $protocols) ), $request, $response ); } return $location; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/RequestOptions.php ================================================ decider = $decider; $this->nextHandler = $nextHandler; $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; } /** * Default exponential backoff delay function. * * @param int $retries * * @return int milliseconds. */ public static function exponentialDelay($retries) { return (int) pow(2, $retries - 1) * 1000; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { if (!isset($options['retries'])) { $options['retries'] = 0; } $fn = $this->nextHandler; return $fn($request, $options) ->then( $this->onFulfilled($request, $options), $this->onRejected($request, $options) ); } /** * Execute fulfilled closure * * @return mixed */ private function onFulfilled(RequestInterface $req, array $options) { return function ($value) use ($req, $options) { if (!call_user_func( $this->decider, $options['retries'], $req, $value, null )) { return $value; } return $this->doRetry($req, $options, $value); }; } /** * Execute rejected closure * * @return callable */ private function onRejected(RequestInterface $req, array $options) { return function ($reason) use ($req, $options) { if (!call_user_func( $this->decider, $options['retries'], $req, null, $reason )) { return \GuzzleHttp\Promise\rejection_for($reason); } return $this->doRetry($req, $options); }; } /** * @return self */ private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) { $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response); return $this($request, $options); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/TransferStats.php ================================================ request = $request; $this->response = $response; $this->transferTime = $transferTime; $this->handlerErrorData = $handlerErrorData; $this->handlerStats = $handlerStats; } /** * @return RequestInterface */ public function getRequest() { return $this->request; } /** * Returns the response that was received (if any). * * @return ResponseInterface|null */ public function getResponse() { return $this->response; } /** * Returns true if a response was received. * * @return bool */ public function hasResponse() { return $this->response !== null; } /** * Gets handler specific error data. * * This might be an exception, a integer representing an error code, or * anything else. Relying on this value assumes that you know what handler * you are using. * * @return mixed */ public function getHandlerErrorData() { return $this->handlerErrorData; } /** * Get the effective URI the request was sent to. * * @return UriInterface */ public function getEffectiveUri() { return $this->request->getUri(); } /** * Get the estimated time the request was being transferred by the handler. * * @return float|null Time in seconds. */ public function getTransferTime() { return $this->transferTime; } /** * Gets an array of all of the handler specific transfer data. * * @return array */ public function getHandlerStats() { return $this->handlerStats; } /** * Get a specific handler statistic from the handler by name. * * @param string $stat Handler specific transfer stat to retrieve. * * @return mixed|null */ public function getHandlerStat($stat) { return isset($this->handlerStats[$stat]) ? $this->handlerStats[$stat] : null; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/UriTemplate.php ================================================ ['prefix' => '', 'joiner' => ',', 'query' => false], '+' => ['prefix' => '', 'joiner' => ',', 'query' => false], '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false], '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false], '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false], ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true], '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true], '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true] ]; /** @var array Delimiters */ private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=']; /** @var array Percent encoded delimiters */ private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', '%3B', '%3D']; public function expand($template, array $variables) { if (false === strpos($template, '{')) { return $template; } $this->template = $template; $this->variables = $variables; return preg_replace_callback( '/\{([^\}]+)\}/', [$this, 'expandMatch'], $this->template ); } /** * Parse an expression into parts * * @param string $expression Expression to parse * * @return array Returns an associative array of parts */ private function parseExpression($expression) { $result = []; if (isset(self::$operatorHash[$expression[0]])) { $result['operator'] = $expression[0]; $expression = substr($expression, 1); } else { $result['operator'] = ''; } foreach (explode(',', $expression) as $value) { $value = trim($value); $varspec = []; if ($colonPos = strpos($value, ':')) { $varspec['value'] = substr($value, 0, $colonPos); $varspec['modifier'] = ':'; $varspec['position'] = (int) substr($value, $colonPos + 1); } elseif (substr($value, -1) === '*') { $varspec['modifier'] = '*'; $varspec['value'] = substr($value, 0, -1); } else { $varspec['value'] = (string) $value; $varspec['modifier'] = ''; } $result['values'][] = $varspec; } return $result; } /** * Process an expansion * * @param array $matches Matches met in the preg_replace_callback * * @return string Returns the replacement string */ private function expandMatch(array $matches) { static $rfc1738to3986 = ['+' => '%20', '%7e' => '~']; $replacements = []; $parsed = self::parseExpression($matches[1]); $prefix = self::$operatorHash[$parsed['operator']]['prefix']; $joiner = self::$operatorHash[$parsed['operator']]['joiner']; $useQuery = self::$operatorHash[$parsed['operator']]['query']; foreach ($parsed['values'] as $value) { if (!isset($this->variables[$value['value']])) { continue; } $variable = $this->variables[$value['value']]; $actuallyUseQuery = $useQuery; $expanded = ''; if (is_array($variable)) { $isAssoc = $this->isAssoc($variable); $kvp = []; foreach ($variable as $key => $var) { if ($isAssoc) { $key = rawurlencode($key); $isNestedArray = is_array($var); } else { $isNestedArray = false; } if (!$isNestedArray) { $var = rawurlencode($var); if ($parsed['operator'] === '+' || $parsed['operator'] === '#' ) { $var = $this->decodeReserved($var); } } if ($value['modifier'] === '*') { if ($isAssoc) { if ($isNestedArray) { // Nested arrays must allow for deeply nested // structures. $var = strtr( http_build_query([$key => $var]), $rfc1738to3986 ); } else { $var = $key . '=' . $var; } } elseif ($key > 0 && $actuallyUseQuery) { $var = $value['value'] . '=' . $var; } } $kvp[$key] = $var; } if (empty($variable)) { $actuallyUseQuery = false; } elseif ($value['modifier'] === '*') { $expanded = implode($joiner, $kvp); if ($isAssoc) { // Don't prepend the value name when using the explode // modifier with an associative array. $actuallyUseQuery = false; } } else { if ($isAssoc) { // When an associative array is encountered and the // explode modifier is not set, then the result must be // a comma separated list of keys followed by their // respective values. foreach ($kvp as $k => &$v) { $v = $k . ',' . $v; } } $expanded = implode(',', $kvp); } } else { if ($value['modifier'] === ':') { $variable = substr($variable, 0, $value['position']); } $expanded = rawurlencode($variable); if ($parsed['operator'] === '+' || $parsed['operator'] === '#') { $expanded = $this->decodeReserved($expanded); } } if ($actuallyUseQuery) { if (!$expanded && $joiner !== '&') { $expanded = $value['value']; } else { $expanded = $value['value'] . '=' . $expanded; } } $replacements[] = $expanded; } $ret = implode($joiner, $replacements); if ($ret && $prefix) { return $prefix . $ret; } return $ret; } /** * Determines if an array is associative. * * This makes the assumption that input arrays are sequences or hashes. * This assumption is a tradeoff for accuracy in favor of speed, but it * should work in almost every case where input is supplied for a URI * template. * * @param array $array Array to check * * @return bool */ private function isAssoc(array $array) { return $array && array_keys($array)[0] !== 0; } /** * Removes percent encoding on reserved characters (used with + and # * modifiers). * * @param string $string String to fix * * @return string */ private function decodeReserved($string) { return str_replace(self::$delimsPct, self::$delims, $string); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/Utils.php ================================================ getHost()) { $asciiHost = self::idnToAsci($uri->getHost(), $options, $info); if ($asciiHost === false) { $errorBitSet = isset($info['errors']) ? $info['errors'] : 0; $errorConstants = array_filter(array_keys(get_defined_constants()), function ($name) { return substr($name, 0, 11) === 'IDNA_ERROR_'; }); $errors = []; foreach ($errorConstants as $errorConstant) { if ($errorBitSet & constant($errorConstant)) { $errors[] = $errorConstant; } } $errorMessage = 'IDN conversion failed'; if ($errors) { $errorMessage .= ' (errors: ' . implode(', ', $errors) . ')'; } throw new InvalidArgumentException($errorMessage); } else { if ($uri->getHost() !== $asciiHost) { // Replace URI only if the ASCII version is different $uri = $uri->withHost($asciiHost); } } } return $uri; } /** * @param string $domain * @param int $options * @param array $info * * @return string|false */ private static function idnToAsci($domain, $options, &$info = []) { if (\preg_match('%^[ -~]+$%', $domain) === 1) { return $domain; } if (\extension_loaded('intl') && defined('INTL_IDNA_VARIANT_UTS46')) { return \idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $info); } /* * The Idn class is marked as @internal. Verify that class and method exists. */ if (method_exists(Idn::class, 'idn_to_ascii')) { return Idn::idn_to_ascii($domain, $options, Idn::INTL_IDNA_VARIANT_UTS46, $info); } throw new \RuntimeException('ext-intl or symfony/polyfill-intl-idn not loaded or too old'); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/functions.php ================================================ expand($template, $variables); } /** * Debug function used to describe the provided value type and class. * * @param mixed $input * * @return string Returns a string containing the type of the variable and * if a class is provided, the class name. */ function describe_type($input) { switch (gettype($input)) { case 'object': return 'object(' . get_class($input) . ')'; case 'array': return 'array(' . count($input) . ')'; default: ob_start(); var_dump($input); // normalize float vs double return str_replace('double(', 'float(', rtrim(ob_get_clean())); } } /** * Parses an array of header lines into an associative array of headers. * * @param iterable $lines Header lines array of strings in the following * format: "Name: Value" * @return array */ function headers_from_lines($lines) { $headers = []; foreach ($lines as $line) { $parts = explode(':', $line, 2); $headers[trim($parts[0])][] = isset($parts[1]) ? trim($parts[1]) : null; } return $headers; } /** * Returns a debug stream based on the provided variable. * * @param mixed $value Optional value * * @return resource */ function debug_resource($value = null) { if (is_resource($value)) { return $value; } elseif (defined('STDOUT')) { return STDOUT; } return fopen('php://output', 'w'); } /** * Chooses and creates a default handler to use based on the environment. * * The returned handler is not wrapped by any default middlewares. * * @return callable Returns the best handler for the given system. * @throws \RuntimeException if no viable Handler is available. */ function choose_handler() { $handler = null; if (function_exists('curl_multi_exec') && function_exists('curl_exec')) { $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); } elseif (function_exists('curl_exec')) { $handler = new CurlHandler(); } elseif (function_exists('curl_multi_exec')) { $handler = new CurlMultiHandler(); } if (ini_get('allow_url_fopen')) { $handler = $handler ? Proxy::wrapStreaming($handler, new StreamHandler()) : new StreamHandler(); } elseif (!$handler) { throw new \RuntimeException('GuzzleHttp requires cURL, the ' . 'allow_url_fopen ini setting, or a custom HTTP handler.'); } return $handler; } /** * Get the default User-Agent string to use with Guzzle * * @return string */ function default_user_agent() { static $defaultAgent = ''; if (!$defaultAgent) { $defaultAgent = 'GuzzleHttp/' . Client::VERSION; if (extension_loaded('curl') && function_exists('curl_version')) { $defaultAgent .= ' curl/' . \curl_version()['version']; } $defaultAgent .= ' PHP/' . PHP_VERSION; } return $defaultAgent; } /** * Returns the default cacert bundle for the current system. * * First, the openssl.cafile and curl.cainfo php.ini settings are checked. * If those settings are not configured, then the common locations for * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X * and Windows are checked. If any of these file locations are found on * disk, they will be utilized. * * Note: the result of this function is cached for subsequent calls. * * @return string * @throws \RuntimeException if no bundle can be found. */ function default_ca_bundle() { static $cached = null; static $cafiles = [ // Red Hat, CentOS, Fedora (provided by the ca-certificates package) '/etc/pki/tls/certs/ca-bundle.crt', // Ubuntu, Debian (provided by the ca-certificates package) '/etc/ssl/certs/ca-certificates.crt', // FreeBSD (provided by the ca_root_nss package) '/usr/local/share/certs/ca-root-nss.crt', // SLES 12 (provided by the ca-certificates package) '/var/lib/ca-certificates/ca-bundle.pem', // OS X provided by homebrew (using the default path) '/usr/local/etc/openssl/cert.pem', // Google app engine '/etc/ca-certificates.crt', // Windows? 'C:\\windows\\system32\\curl-ca-bundle.crt', 'C:\\windows\\curl-ca-bundle.crt', ]; if ($cached) { return $cached; } if ($ca = ini_get('openssl.cafile')) { return $cached = $ca; } if ($ca = ini_get('curl.cainfo')) { return $cached = $ca; } foreach ($cafiles as $filename) { if (file_exists($filename)) { return $cached = $filename; } } throw new \RuntimeException( <<< EOT No system CA bundle could be found in any of the the common system locations. PHP versions earlier than 5.6 are not properly configured to use the system's CA bundle by default. In order to verify peer certificates, you will need to supply the path on disk to a certificate bundle to the 'verify' request option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not need a specific certificate bundle, then Mozilla provides a commonly used CA bundle which can be downloaded here (provided by the maintainer of cURL): https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP ini setting to point to the path to the file, allowing you to omit the 'verify' request option. See http://curl.haxx.se/docs/sslcerts.html for more information. EOT ); } /** * Creates an associative array of lowercase header names to the actual * header casing. * * @param array $headers * * @return array */ function normalize_header_keys(array $headers) { $result = []; foreach (array_keys($headers) as $key) { $result[strtolower($key)] = $key; } return $result; } /** * Returns true if the provided host matches any of the no proxy areas. * * This method will strip a port from the host if it is present. Each pattern * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" == * "baz.foo.com", but ".foo.com" != "foo.com"). * * Areas are matched in the following cases: * 1. "*" (without quotes) always matches any hosts. * 2. An exact match. * 3. The area starts with "." and the area is the last part of the host. e.g. * '.mit.edu' will match any host that ends with '.mit.edu'. * * @param string $host Host to check against the patterns. * @param array $noProxyArray An array of host patterns. * * @return bool */ function is_host_in_noproxy($host, array $noProxyArray) { if (strlen($host) === 0) { throw new \InvalidArgumentException('Empty host provided'); } // Strip port if present. if (strpos($host, ':')) { $host = explode($host, ':', 2)[0]; } foreach ($noProxyArray as $area) { // Always match on wildcards. if ($area === '*') { return true; } elseif (empty($area)) { // Don't match on empty values. continue; } elseif ($area === $host) { // Exact matches. return true; } else { // Special match if the area when prefixed with ".". Remove any // existing leading "." and add a new leading ".". $area = '.' . ltrim($area, '.'); if (substr($host, -(strlen($area))) === $area) { return true; } } } return false; } /** * Wrapper for json_decode that throws when an error occurs. * * @param string $json JSON data to parse * @param bool $assoc When true, returned objects will be converted * into associative arrays. * @param int $depth User specified recursion depth. * @param int $options Bitmask of JSON decode options. * * @return mixed * @throws Exception\InvalidArgumentException if the JSON cannot be decoded. * @link http://www.php.net/manual/en/function.json-decode.php */ function json_decode($json, $assoc = false, $depth = 512, $options = 0) { $data = \json_decode($json, $assoc, $depth, $options); if (JSON_ERROR_NONE !== json_last_error()) { throw new Exception\InvalidArgumentException( 'json_decode error: ' . json_last_error_msg() ); } return $data; } /** * Wrapper for JSON encoding that throws when an error occurs. * * @param mixed $value The value being encoded * @param int $options JSON encode option bitmask * @param int $depth Set the maximum depth. Must be greater than zero. * * @return string * @throws Exception\InvalidArgumentException if the JSON cannot be encoded. * @link http://www.php.net/manual/en/function.json-encode.php */ function json_encode($value, $options = 0, $depth = 512) { $json = \json_encode($value, $options, $depth); if (JSON_ERROR_NONE !== json_last_error()) { throw new Exception\InvalidArgumentException( 'json_encode error: ' . json_last_error_msg() ); } return $json; } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/guzzle/src/functions_include.php ================================================ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/Makefile ================================================ all: clean test test: vendor/bin/phpunit coverage: vendor/bin/phpunit --coverage-html=artifacts/coverage view-coverage: open artifacts/coverage/index.html clean: rm -rf artifacts/* ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/README.md ================================================ # Guzzle Promises [Promises/A+](https://promisesaplus.com/) implementation that handles promise chaining and resolution iteratively, allowing for "infinite" promise chaining while keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/) for a general introduction to promises. - [Features](#features) - [Quick start](#quick-start) - [Synchronous wait](#synchronous-wait) - [Cancellation](#cancellation) - [API](#api) - [Promise](#promise) - [FulfilledPromise](#fulfilledpromise) - [RejectedPromise](#rejectedpromise) - [Promise interop](#promise-interop) - [Implementation notes](#implementation-notes) # Features - [Promises/A+](https://promisesaplus.com/) implementation. - Promise resolution and chaining is handled iteratively, allowing for "infinite" promise chaining. - Promises have a synchronous `wait` method. - Promises can be cancelled. - Works with any object that has a `then` function. - C# style async/await coroutine promises using `GuzzleHttp\Promise\coroutine()`. # Quick start A *promise* represents the eventual result of an asynchronous operation. The primary way of interacting with a promise is through its `then` method, which registers callbacks to receive either a promise's eventual value or the reason why the promise cannot be fulfilled. ## Callbacks Callbacks are registered with the `then` method by providing an optional `$onFulfilled` followed by an optional `$onRejected` function. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $promise->then( // $onFulfilled function ($value) { echo 'The promise was fulfilled.'; }, // $onRejected function ($reason) { echo 'The promise was rejected.'; } ); ``` *Resolving* a promise means that you either fulfill a promise with a *value* or reject a promise with a *reason*. Resolving a promises triggers callbacks registered with the promises's `then` method. These callbacks are triggered only once and in the order in which they were added. ## Resolving a promise Promises are fulfilled using the `resolve($value)` method. Resolving a promise with any value other than a `GuzzleHttp\Promise\RejectedPromise` will trigger all of the onFulfilled callbacks (resolving a promise with a rejected promise will reject the promise and trigger the `$onRejected` callbacks). ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $promise ->then(function ($value) { // Return a value and don't break the chain return "Hello, " . $value; }) // This then is executed after the first then and receives the value // returned from the first then. ->then(function ($value) { echo $value; }); // Resolving the promise triggers the $onFulfilled callbacks and outputs // "Hello, reader". $promise->resolve('reader.'); ``` ## Promise forwarding Promises can be chained one after the other. Each then in the chain is a new promise. The return value of a promise is what's forwarded to the next promise in the chain. Returning a promise in a `then` callback will cause the subsequent promises in the chain to only be fulfilled when the returned promise has been fulfilled. The next promise in the chain will be invoked with the resolved value of the promise. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $nextPromise = new Promise(); $promise ->then(function ($value) use ($nextPromise) { echo $value; return $nextPromise; }) ->then(function ($value) { echo $value; }); // Triggers the first callback and outputs "A" $promise->resolve('A'); // Triggers the second callback and outputs "B" $nextPromise->resolve('B'); ``` ## Promise rejection When a promise is rejected, the `$onRejected` callbacks are invoked with the rejection reason. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $promise->then(null, function ($reason) { echo $reason; }); $promise->reject('Error!'); // Outputs "Error!" ``` ## Rejection forwarding If an exception is thrown in an `$onRejected` callback, subsequent `$onRejected` callbacks are invoked with the thrown exception as the reason. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise(); $promise->then(null, function ($reason) { throw new \Exception($reason); })->then(null, function ($reason) { assert($reason->getMessage() === 'Error!'); }); $promise->reject('Error!'); ``` You can also forward a rejection down the promise chain by returning a `GuzzleHttp\Promise\RejectedPromise` in either an `$onFulfilled` or `$onRejected` callback. ```php use GuzzleHttp\Promise\Promise; use GuzzleHttp\Promise\RejectedPromise; $promise = new Promise(); $promise->then(null, function ($reason) { return new RejectedPromise($reason); })->then(null, function ($reason) { assert($reason === 'Error!'); }); $promise->reject('Error!'); ``` If an exception is not thrown in a `$onRejected` callback and the callback does not return a rejected promise, downstream `$onFulfilled` callbacks are invoked using the value returned from the `$onRejected` callback. ```php use GuzzleHttp\Promise\Promise; use GuzzleHttp\Promise\RejectedPromise; $promise = new Promise(); $promise ->then(null, function ($reason) { return "It's ok"; }) ->then(function ($value) { assert($value === "It's ok"); }); $promise->reject('Error!'); ``` # Synchronous wait You can synchronously force promises to complete using a promise's `wait` method. When creating a promise, you can provide a wait function that is used to synchronously force a promise to complete. When a wait function is invoked it is expected to deliver a value to the promise or reject the promise. If the wait function does not deliver a value, then an exception is thrown. The wait function provided to a promise constructor is invoked when the `wait` function of the promise is called. ```php $promise = new Promise(function () use (&$promise) { $promise->resolve('foo'); }); // Calling wait will return the value of the promise. echo $promise->wait(); // outputs "foo" ``` If an exception is encountered while invoking the wait function of a promise, the promise is rejected with the exception and the exception is thrown. ```php $promise = new Promise(function () use (&$promise) { throw new \Exception('foo'); }); $promise->wait(); // throws the exception. ``` Calling `wait` on a promise that has been fulfilled will not trigger the wait function. It will simply return the previously resolved value. ```php $promise = new Promise(function () { die('this is not called!'); }); $promise->resolve('foo'); echo $promise->wait(); // outputs "foo" ``` Calling `wait` on a promise that has been rejected will throw an exception. If the rejection reason is an instance of `\Exception` the reason is thrown. Otherwise, a `GuzzleHttp\Promise\RejectionException` is thrown and the reason can be obtained by calling the `getReason` method of the exception. ```php $promise = new Promise(); $promise->reject('foo'); $promise->wait(); ``` > PHP Fatal error: Uncaught exception 'GuzzleHttp\Promise\RejectionException' with message 'The promise was rejected with value: foo' ## Unwrapping a promise When synchronously waiting on a promise, you are joining the state of the promise into the current state of execution (i.e., return the value of the promise if it was fulfilled or throw an exception if it was rejected). This is called "unwrapping" the promise. Waiting on a promise will by default unwrap the promise state. You can force a promise to resolve and *not* unwrap the state of the promise by passing `false` to the first argument of the `wait` function: ```php $promise = new Promise(); $promise->reject('foo'); // This will not throw an exception. It simply ensures the promise has // been resolved. $promise->wait(false); ``` When unwrapping a promise, the resolved value of the promise will be waited upon until the unwrapped value is not a promise. This means that if you resolve promise A with a promise B and unwrap promise A, the value returned by the wait function will be the value delivered to promise B. **Note**: when you do not unwrap the promise, no value is returned. # Cancellation You can cancel a promise that has not yet been fulfilled using the `cancel()` method of a promise. When creating a promise you can provide an optional cancel function that when invoked cancels the action of computing a resolution of the promise. # API ## Promise When creating a promise object, you can provide an optional `$waitFn` and `$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is expected to resolve the promise. `$cancelFn` is a function with no arguments that is expected to cancel the computation of a promise. It is invoked when the `cancel()` method of a promise is called. ```php use GuzzleHttp\Promise\Promise; $promise = new Promise( function () use (&$promise) { $promise->resolve('waited'); }, function () { // do something that will cancel the promise computation (e.g., close // a socket, cancel a database query, etc...) } ); assert('waited' === $promise->wait()); ``` A promise has the following methods: - `then(callable $onFulfilled, callable $onRejected) : PromiseInterface` Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler. - `otherwise(callable $onRejected) : PromiseInterface` Appends a rejection handler callback to the promise, and returns a new promise resolving to the return value of the callback if it is called, or to its original fulfillment value if the promise is instead fulfilled. - `wait($unwrap = true) : mixed` Synchronously waits on the promise to complete. `$unwrap` controls whether or not the value of the promise is returned for a fulfilled promise or if an exception is thrown if the promise is rejected. This is set to `true` by default. - `cancel()` Attempts to cancel the promise if possible. The promise being cancelled and the parent most ancestor that has not yet been resolved will also be cancelled. Any promises waiting on the cancelled promise to resolve will also be cancelled. - `getState() : string` Returns the state of the promise. One of `pending`, `fulfilled`, or `rejected`. - `resolve($value)` Fulfills the promise with the given `$value`. - `reject($reason)` Rejects the promise with the given `$reason`. ## FulfilledPromise A fulfilled promise can be created to represent a promise that has been fulfilled. ```php use GuzzleHttp\Promise\FulfilledPromise; $promise = new FulfilledPromise('value'); // Fulfilled callbacks are immediately invoked. $promise->then(function ($value) { echo $value; }); ``` ## RejectedPromise A rejected promise can be created to represent a promise that has been rejected. ```php use GuzzleHttp\Promise\RejectedPromise; $promise = new RejectedPromise('Error'); // Rejected callbacks are immediately invoked. $promise->then(null, function ($reason) { echo $reason; }); ``` # Promise interop This library works with foreign promises that have a `then` method. This means you can use Guzzle promises with [React promises](https://github.com/reactphp/promise) for example. When a foreign promise is returned inside of a then method callback, promise resolution will occur recursively. ```php // Create a React promise $deferred = new React\Promise\Deferred(); $reactPromise = $deferred->promise(); // Create a Guzzle promise that is fulfilled with a React promise. $guzzlePromise = new \GuzzleHttp\Promise\Promise(); $guzzlePromise->then(function ($value) use ($reactPromise) { // Do something something with the value... // Return the React promise return $reactPromise; }); ``` Please note that wait and cancel chaining is no longer possible when forwarding a foreign promise. You will need to wrap a third-party promise with a Guzzle promise in order to utilize wait and cancel functions with foreign promises. ## Event Loop Integration In order to keep the stack size constant, Guzzle promises are resolved asynchronously using a task queue. When waiting on promises synchronously, the task queue will be automatically run to ensure that the blocking promise and any forwarded promises are resolved. When using promises asynchronously in an event loop, you will need to run the task queue on each tick of the loop. If you do not run the task queue, then promises will not be resolved. You can run the task queue using the `run()` method of the global task queue instance. ```php // Get the global task queue $queue = \GuzzleHttp\Promise\queue(); $queue->run(); ``` For example, you could use Guzzle promises with React using a periodic timer: ```php $loop = React\EventLoop\Factory::create(); $loop->addPeriodicTimer(0, [$queue, 'run']); ``` *TODO*: Perhaps adding a `futureTick()` on each tick would be faster? # Implementation notes ## Promise resolution and chaining is handled iteratively By shuffling pending handlers from one owner to another, promises are resolved iteratively, allowing for "infinite" then chaining. ```php then(function ($v) { // The stack size remains constant (a good thing) echo xdebug_get_stack_depth() . ', '; return $v + 1; }); } $parent->resolve(0); var_dump($p->wait()); // int(1000) ``` When a promise is fulfilled or rejected with a non-promise value, the promise then takes ownership of the handlers of each child promise and delivers values down the chain without using recursion. When a promise is resolved with another promise, the original promise transfers all of its pending handlers to the new promise. When the new promise is eventually resolved, all of the pending handlers are delivered the forwarded value. ## A promise is the deferred. Some promise libraries implement promises using a deferred object to represent a computation and a promise object to represent the delivery of the result of the computation. This is a nice separation of computation and delivery because consumers of the promise cannot modify the value that will be eventually delivered. One side effect of being able to implement promise resolution and chaining iteratively is that you need to be able for one promise to reach into the state of another promise to shuffle around ownership of handlers. In order to achieve this without making the handlers of a promise publicly mutable, a promise is also the deferred value, allowing promises of the same parent class to reach into and modify the private properties of promises of the same type. While this does allow consumers of the value to modify the resolution or rejection of the deferred, it is a small price to pay for keeping the stack size constant. ```php $promise = new Promise(); $promise->then(function ($value) { echo $value; }); // The promise is the deferred value, so you can deliver a value to it. $promise->resolve('foo'); // prints "foo" ``` ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/composer.json ================================================ { "name": "guzzlehttp/promises", "description": "Guzzle promises library", "keywords": ["promise"], "license": "MIT", "authors": [ { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" } ], "require": { "php": ">=5.5.0" }, "require-dev": { "phpunit/phpunit": "^4.0" }, "autoload": { "psr-4": { "GuzzleHttp\\Promise\\": "src/" }, "files": ["src/functions_include.php"] }, "scripts": { "test": "vendor/bin/phpunit", "test-ci": "vendor/bin/phpunit --coverage-text" }, "extra": { "branch-alias": { "dev-master": "1.4-dev" } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/AggregateException.php ================================================ then(function ($v) { echo $v; }); * * @param callable $generatorFn Generator function to wrap into a promise. * * @return Promise * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration */ final class Coroutine implements PromiseInterface { /** * @var PromiseInterface|null */ private $currentPromise; /** * @var Generator */ private $generator; /** * @var Promise */ private $result; public function __construct(callable $generatorFn) { $this->generator = $generatorFn(); $this->result = new Promise(function () { while (isset($this->currentPromise)) { $this->currentPromise->wait(); } }); $this->nextCoroutine($this->generator->current()); } public function then( callable $onFulfilled = null, callable $onRejected = null ) { return $this->result->then($onFulfilled, $onRejected); } public function otherwise(callable $onRejected) { return $this->result->otherwise($onRejected); } public function wait($unwrap = true) { return $this->result->wait($unwrap); } public function getState() { return $this->result->getState(); } public function resolve($value) { $this->result->resolve($value); } public function reject($reason) { $this->result->reject($reason); } public function cancel() { $this->currentPromise->cancel(); $this->result->cancel(); } private function nextCoroutine($yielded) { $this->currentPromise = promise_for($yielded) ->then([$this, '_handleSuccess'], [$this, '_handleFailure']); } /** * @internal */ public function _handleSuccess($value) { unset($this->currentPromise); try { $next = $this->generator->send($value); if ($this->generator->valid()) { $this->nextCoroutine($next); } else { $this->result->resolve($value); } } catch (Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } /** * @internal */ public function _handleFailure($reason) { unset($this->currentPromise); try { $nextYield = $this->generator->throw(exception_for($reason)); // The throw was caught, so keep iterating on the coroutine $this->nextCoroutine($nextYield); } catch (Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/EachPromise.php ================================================ iterable = iter_for($iterable); if (isset($config['concurrency'])) { $this->concurrency = $config['concurrency']; } if (isset($config['fulfilled'])) { $this->onFulfilled = $config['fulfilled']; } if (isset($config['rejected'])) { $this->onRejected = $config['rejected']; } } public function promise() { if ($this->aggregate) { return $this->aggregate; } try { $this->createPromise(); $this->iterable->rewind(); $this->refillPending(); } catch (\Throwable $e) { $this->aggregate->reject($e); } catch (\Exception $e) { $this->aggregate->reject($e); } return $this->aggregate; } private function createPromise() { $this->mutex = false; $this->aggregate = new Promise(function () { reset($this->pending); if (empty($this->pending) && !$this->iterable->valid()) { $this->aggregate->resolve(null); return; } // Consume a potentially fluctuating list of promises while // ensuring that indexes are maintained (precluding array_shift). while ($promise = current($this->pending)) { next($this->pending); $promise->wait(); if ($this->aggregate->getState() !== PromiseInterface::PENDING) { return; } } }); // Clear the references when the promise is resolved. $clearFn = function () { $this->iterable = $this->concurrency = $this->pending = null; $this->onFulfilled = $this->onRejected = null; }; $this->aggregate->then($clearFn, $clearFn); } private function refillPending() { if (!$this->concurrency) { // Add all pending promises. while ($this->addPending() && $this->advanceIterator()); return; } // Add only up to N pending promises. $concurrency = is_callable($this->concurrency) ? call_user_func($this->concurrency, count($this->pending)) : $this->concurrency; $concurrency = max($concurrency - count($this->pending), 0); // Concurrency may be set to 0 to disallow new promises. if (!$concurrency) { return; } // Add the first pending promise. $this->addPending(); // Note this is special handling for concurrency=1 so that we do // not advance the iterator after adding the first promise. This // helps work around issues with generators that might not have the // next value to yield until promise callbacks are called. while (--$concurrency && $this->advanceIterator() && $this->addPending()); } private function addPending() { if (!$this->iterable || !$this->iterable->valid()) { return false; } $promise = promise_for($this->iterable->current()); $idx = $this->iterable->key(); $this->pending[$idx] = $promise->then( function ($value) use ($idx) { if ($this->onFulfilled) { call_user_func( $this->onFulfilled, $value, $idx, $this->aggregate ); } $this->step($idx); }, function ($reason) use ($idx) { if ($this->onRejected) { call_user_func( $this->onRejected, $reason, $idx, $this->aggregate ); } $this->step($idx); } ); return true; } private function advanceIterator() { // Place a lock on the iterator so that we ensure to not recurse, // preventing fatal generator errors. if ($this->mutex) { return false; } $this->mutex = true; try { $this->iterable->next(); $this->mutex = false; return true; } catch (\Throwable $e) { $this->aggregate->reject($e); $this->mutex = false; return false; } catch (\Exception $e) { $this->aggregate->reject($e); $this->mutex = false; return false; } } private function step($idx) { // If the promise was already resolved, then ignore this step. if ($this->aggregate->getState() !== PromiseInterface::PENDING) { return; } unset($this->pending[$idx]); // Only refill pending promises if we are not locked, preventing the // EachPromise to recursively invoke the provided iterator, which // cause a fatal error: "Cannot resume an already running generator" if ($this->advanceIterator() && !$this->checkIfFinished()) { // Add more pending promises if possible. $this->refillPending(); } } private function checkIfFinished() { if (!$this->pending && !$this->iterable->valid()) { // Resolve the promise if there's nothing left to do. $this->aggregate->resolve(null); return true; } return false; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/FulfilledPromise.php ================================================ value = $value; } public function then( callable $onFulfilled = null, callable $onRejected = null ) { // Return itself if there is no onFulfilled function. if (!$onFulfilled) { return $this; } $queue = queue(); $p = new Promise([$queue, 'run']); $value = $this->value; $queue->add(static function () use ($p, $value, $onFulfilled) { if ($p->getState() === self::PENDING) { try { $p->resolve($onFulfilled($value)); } catch (\Throwable $e) { $p->reject($e); } catch (\Exception $e) { $p->reject($e); } } }); return $p; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = true, $defaultDelivery = null) { return $unwrap ? $this->value : null; } public function getState() { return self::FULFILLED; } public function resolve($value) { if ($value !== $this->value) { throw new \LogicException("Cannot resolve a fulfilled promise"); } } public function reject($reason) { throw new \LogicException("Cannot reject a fulfilled promise"); } public function cancel() { // pass } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/Promise.php ================================================ waitFn = $waitFn; $this->cancelFn = $cancelFn; } public function then( callable $onFulfilled = null, callable $onRejected = null ) { if ($this->state === self::PENDING) { $p = new Promise(null, [$this, 'cancel']); $this->handlers[] = [$p, $onFulfilled, $onRejected]; $p->waitList = $this->waitList; $p->waitList[] = $this; return $p; } // Return a fulfilled promise and immediately invoke any callbacks. if ($this->state === self::FULFILLED) { return $onFulfilled ? promise_for($this->result)->then($onFulfilled) : promise_for($this->result); } // It's either cancelled or rejected, so return a rejected promise // and immediately invoke any callbacks. $rejection = rejection_for($this->result); return $onRejected ? $rejection->then(null, $onRejected) : $rejection; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = true) { $this->waitIfPending(); $inner = $this->result instanceof PromiseInterface ? $this->result->wait($unwrap) : $this->result; if ($unwrap) { if ($this->result instanceof PromiseInterface || $this->state === self::FULFILLED ) { return $inner; } else { // It's rejected so "unwrap" and throw an exception. throw exception_for($inner); } } } public function getState() { return $this->state; } public function cancel() { if ($this->state !== self::PENDING) { return; } $this->waitFn = $this->waitList = null; if ($this->cancelFn) { $fn = $this->cancelFn; $this->cancelFn = null; try { $fn(); } catch (\Throwable $e) { $this->reject($e); } catch (\Exception $e) { $this->reject($e); } } // Reject the promise only if it wasn't rejected in a then callback. if ($this->state === self::PENDING) { $this->reject(new CancellationException('Promise has been cancelled')); } } public function resolve($value) { $this->settle(self::FULFILLED, $value); } public function reject($reason) { $this->settle(self::REJECTED, $reason); } private function settle($state, $value) { if ($this->state !== self::PENDING) { // Ignore calls with the same resolution. if ($state === $this->state && $value === $this->result) { return; } throw $this->state === $state ? new \LogicException("The promise is already {$state}.") : new \LogicException("Cannot change a {$this->state} promise to {$state}"); } if ($value === $this) { throw new \LogicException('Cannot fulfill or reject a promise with itself'); } // Clear out the state of the promise but stash the handlers. $this->state = $state; $this->result = $value; $handlers = $this->handlers; $this->handlers = null; $this->waitList = $this->waitFn = null; $this->cancelFn = null; if (!$handlers) { return; } // If the value was not a settled promise or a thenable, then resolve // it in the task queue using the correct ID. if (!method_exists($value, 'then')) { $id = $state === self::FULFILLED ? 1 : 2; // It's a success, so resolve the handlers in the queue. queue()->add(static function () use ($id, $value, $handlers) { foreach ($handlers as $handler) { self::callHandler($id, $value, $handler); } }); } elseif ($value instanceof Promise && $value->getState() === self::PENDING ) { // We can just merge our handlers onto the next promise. $value->handlers = array_merge($value->handlers, $handlers); } else { // Resolve the handlers when the forwarded promise is resolved. $value->then( static function ($value) use ($handlers) { foreach ($handlers as $handler) { self::callHandler(1, $value, $handler); } }, static function ($reason) use ($handlers) { foreach ($handlers as $handler) { self::callHandler(2, $reason, $handler); } } ); } } /** * Call a stack of handlers using a specific callback index and value. * * @param int $index 1 (resolve) or 2 (reject). * @param mixed $value Value to pass to the callback. * @param array $handler Array of handler data (promise and callbacks). * * @return array Returns the next group to resolve. */ private static function callHandler($index, $value, array $handler) { /** @var PromiseInterface $promise */ $promise = $handler[0]; // The promise may have been cancelled or resolved before placing // this thunk in the queue. if ($promise->getState() !== self::PENDING) { return; } try { if (isset($handler[$index])) { $promise->resolve($handler[$index]($value)); } elseif ($index === 1) { // Forward resolution values as-is. $promise->resolve($value); } else { // Forward rejections down the chain. $promise->reject($value); } } catch (\Throwable $reason) { $promise->reject($reason); } catch (\Exception $reason) { $promise->reject($reason); } } private function waitIfPending() { if ($this->state !== self::PENDING) { return; } elseif ($this->waitFn) { $this->invokeWaitFn(); } elseif ($this->waitList) { $this->invokeWaitList(); } else { // If there's not wait function, then reject the promise. $this->reject('Cannot wait on a promise that has ' . 'no internal wait function. You must provide a wait ' . 'function when constructing the promise to be able to ' . 'wait on a promise.'); } queue()->run(); if ($this->state === self::PENDING) { $this->reject('Invoking the wait callback did not resolve the promise'); } } private function invokeWaitFn() { try { $wfn = $this->waitFn; $this->waitFn = null; $wfn(true); } catch (\Exception $reason) { if ($this->state === self::PENDING) { // The promise has not been resolved yet, so reject the promise // with the exception. $this->reject($reason); } else { // The promise was already resolved, so there's a problem in // the application. throw $reason; } } } private function invokeWaitList() { $waitList = $this->waitList; $this->waitList = null; foreach ($waitList as $result) { while (true) { $result->waitIfPending(); if ($result->result instanceof Promise) { $result = $result->result; } else { if ($result->result instanceof PromiseInterface) { $result->result->wait(false); } break; } } } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/PromiseInterface.php ================================================ reason = $reason; } public function then( callable $onFulfilled = null, callable $onRejected = null ) { // If there's no onRejected callback then just return self. if (!$onRejected) { return $this; } $queue = queue(); $reason = $this->reason; $p = new Promise([$queue, 'run']); $queue->add(static function () use ($p, $reason, $onRejected) { if ($p->getState() === self::PENDING) { try { // Return a resolved promise if onRejected does not throw. $p->resolve($onRejected($reason)); } catch (\Throwable $e) { // onRejected threw, so return a rejected promise. $p->reject($e); } catch (\Exception $e) { // onRejected threw, so return a rejected promise. $p->reject($e); } } }); return $p; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = true, $defaultDelivery = null) { if ($unwrap) { throw exception_for($this->reason); } } public function getState() { return self::REJECTED; } public function resolve($value) { throw new \LogicException("Cannot resolve a rejected promise"); } public function reject($reason) { if ($reason !== $this->reason) { throw new \LogicException("Cannot reject a rejected promise"); } } public function cancel() { // pass } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/RejectionException.php ================================================ reason = $reason; $message = 'The promise was rejected'; if ($description) { $message .= ' with reason: ' . $description; } elseif (is_string($reason) || (is_object($reason) && method_exists($reason, '__toString')) ) { $message .= ' with reason: ' . $this->reason; } elseif ($reason instanceof \JsonSerializable) { $message .= ' with reason: ' . json_encode($this->reason, JSON_PRETTY_PRINT); } parent::__construct($message); } /** * Returns the rejection reason. * * @return mixed */ public function getReason() { return $this->reason; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/TaskQueue.php ================================================ run(); */ class TaskQueue implements TaskQueueInterface { private $enableShutdown = true; private $queue = []; public function __construct($withShutdown = true) { if ($withShutdown) { register_shutdown_function(function () { if ($this->enableShutdown) { // Only run the tasks if an E_ERROR didn't occur. $err = error_get_last(); if (!$err || ($err['type'] ^ E_ERROR)) { $this->run(); } } }); } } public function isEmpty() { return !$this->queue; } public function add(callable $task) { $this->queue[] = $task; } public function run() { /** @var callable $task */ while ($task = array_shift($this->queue)) { $task(); } } /** * The task queue will be run and exhausted by default when the process * exits IFF the exit is not the result of a PHP E_ERROR error. * * You can disable running the automatic shutdown of the queue by calling * this function. If you disable the task queue shutdown process, then you * MUST either run the task queue (as a result of running your event loop * or manually using the run() method) or wait on each outstanding promise. * * Note: This shutdown will occur before any destructors are triggered. */ public function disableShutdown() { $this->enableShutdown = false; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/TaskQueueInterface.php ================================================ * while ($eventLoop->isRunning()) { * GuzzleHttp\Promise\queue()->run(); * } * * * @param TaskQueueInterface $assign Optionally specify a new queue instance. * * @return TaskQueueInterface */ function queue(TaskQueueInterface $assign = null) { static $queue; if ($assign) { $queue = $assign; } elseif (!$queue) { $queue = new TaskQueue(); } return $queue; } /** * Adds a function to run in the task queue when it is next `run()` and returns * a promise that is fulfilled or rejected with the result. * * @param callable $task Task function to run. * * @return PromiseInterface */ function task(callable $task) { $queue = queue(); $promise = new Promise([$queue, 'run']); $queue->add(function () use ($task, $promise) { try { $promise->resolve($task()); } catch (\Throwable $e) { $promise->reject($e); } catch (\Exception $e) { $promise->reject($e); } }); return $promise; } /** * Creates a promise for a value if the value is not a promise. * * @param mixed $value Promise or value. * * @return PromiseInterface */ function promise_for($value) { if ($value instanceof PromiseInterface) { return $value; } // Return a Guzzle promise that shadows the given promise. if (method_exists($value, 'then')) { $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null; $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null; $promise = new Promise($wfn, $cfn); $value->then([$promise, 'resolve'], [$promise, 'reject']); return $promise; } return new FulfilledPromise($value); } /** * Creates a rejected promise for a reason if the reason is not a promise. If * the provided reason is a promise, then it is returned as-is. * * @param mixed $reason Promise or reason. * * @return PromiseInterface */ function rejection_for($reason) { if ($reason instanceof PromiseInterface) { return $reason; } return new RejectedPromise($reason); } /** * Create an exception for a rejected promise value. * * @param mixed $reason * * @return \Exception|\Throwable */ function exception_for($reason) { return $reason instanceof \Exception || $reason instanceof \Throwable ? $reason : new RejectionException($reason); } /** * Returns an iterator for the given value. * * @param mixed $value * * @return \Iterator */ function iter_for($value) { if ($value instanceof \Iterator) { return $value; } elseif (is_array($value)) { return new \ArrayIterator($value); } else { return new \ArrayIterator([$value]); } } /** * Synchronously waits on a promise to resolve and returns an inspection state * array. * * Returns a state associative array containing a "state" key mapping to a * valid promise state. If the state of the promise is "fulfilled", the array * will contain a "value" key mapping to the fulfilled value of the promise. If * the promise is rejected, the array will contain a "reason" key mapping to * the rejection reason of the promise. * * @param PromiseInterface $promise Promise or value. * * @return array */ function inspect(PromiseInterface $promise) { try { return [ 'state' => PromiseInterface::FULFILLED, 'value' => $promise->wait() ]; } catch (RejectionException $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; } catch (\Throwable $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; } catch (\Exception $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; } } /** * Waits on all of the provided promises, but does not unwrap rejected promises * as thrown exception. * * Returns an array of inspection state arrays. * * @param PromiseInterface[] $promises Traversable of promises to wait upon. * * @return array * @see GuzzleHttp\Promise\inspect for the inspection state array format. */ function inspect_all($promises) { $results = []; foreach ($promises as $key => $promise) { $results[$key] = inspect($promise); } return $results; } /** * Waits on all of the provided promises and returns the fulfilled values. * * Returns an array that contains the value of each promise (in the same order * the promises were provided). An exception is thrown if any of the promises * are rejected. * * @param mixed $promises Iterable of PromiseInterface objects to wait on. * * @return array * @throws \Exception on error * @throws \Throwable on error in PHP >=7 */ function unwrap($promises) { $results = []; foreach ($promises as $key => $promise) { $results[$key] = $promise->wait(); } return $results; } /** * Given an array of promises, return a promise that is fulfilled when all the * items in the array are fulfilled. * * The promise's fulfillment value is an array with fulfillment values at * respective positions to the original array. If any promise in the array * rejects, the returned promise is rejected with the rejection reason. * * @param mixed $promises Promises or values. * * @return PromiseInterface */ function all($promises) { $results = []; return each( $promises, function ($value, $idx) use (&$results) { $results[$idx] = $value; }, function ($reason, $idx, Promise $aggregate) { $aggregate->reject($reason); } )->then(function () use (&$results) { ksort($results); return $results; }); } /** * Initiate a competitive race between multiple promises or values (values will * become immediately fulfilled promises). * * When count amount of promises have been fulfilled, the returned promise is * fulfilled with an array that contains the fulfillment values of the winners * in order of resolution. * * This prommise is rejected with a {@see GuzzleHttp\Promise\AggregateException} * if the number of fulfilled promises is less than the desired $count. * * @param int $count Total number of promises. * @param mixed $promises Promises or values. * * @return PromiseInterface */ function some($count, $promises) { $results = []; $rejections = []; return each( $promises, function ($value, $idx, PromiseInterface $p) use (&$results, $count) { if ($p->getState() !== PromiseInterface::PENDING) { return; } $results[$idx] = $value; if (count($results) >= $count) { $p->resolve(null); } }, function ($reason) use (&$rejections) { $rejections[] = $reason; } )->then( function () use (&$results, &$rejections, $count) { if (count($results) !== $count) { throw new AggregateException( 'Not enough promises to fulfill count', $rejections ); } ksort($results); return array_values($results); } ); } /** * Like some(), with 1 as count. However, if the promise fulfills, the * fulfillment value is not an array of 1 but the value directly. * * @param mixed $promises Promises or values. * * @return PromiseInterface */ function any($promises) { return some(1, $promises)->then(function ($values) { return $values[0]; }); } /** * Returns a promise that is fulfilled when all of the provided promises have * been fulfilled or rejected. * * The returned promise is fulfilled with an array of inspection state arrays. * * @param mixed $promises Promises or values. * * @return PromiseInterface * @see GuzzleHttp\Promise\inspect for the inspection state array format. */ function settle($promises) { $results = []; return each( $promises, function ($value, $idx) use (&$results) { $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; }, function ($reason, $idx) use (&$results) { $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; } )->then(function () use (&$results) { ksort($results); return $results; }); } /** * Given an iterator that yields promises or values, returns a promise that is * fulfilled with a null value when the iterator has been consumed or the * aggregate promise has been fulfilled or rejected. * * $onFulfilled is a function that accepts the fulfilled value, iterator * index, and the aggregate promise. The callback can invoke any necessary side * effects and choose to resolve or reject the aggregate promise if needed. * * $onRejected is a function that accepts the rejection reason, iterator * index, and the aggregate promise. The callback can invoke any necessary side * effects and choose to resolve or reject the aggregate promise if needed. * * @param mixed $iterable Iterator or array to iterate over. * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface */ function each( $iterable, callable $onFulfilled = null, callable $onRejected = null ) { return (new EachPromise($iterable, [ 'fulfilled' => $onFulfilled, 'rejected' => $onRejected ]))->promise(); } /** * Like each, but only allows a certain number of outstanding promises at any * given time. * * $concurrency may be an integer or a function that accepts the number of * pending promises and returns a numeric concurrency limit value to allow for * dynamic a concurrency size. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface */ function each_limit( $iterable, $concurrency, callable $onFulfilled = null, callable $onRejected = null ) { return (new EachPromise($iterable, [ 'fulfilled' => $onFulfilled, 'rejected' => $onRejected, 'concurrency' => $concurrency ]))->promise(); } /** * Like each_limit, but ensures that no promise in the given $iterable argument * is rejected. If any promise is rejected, then the aggregate promise is * rejected with the encountered rejection. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * * @return PromiseInterface */ function each_limit_all( $iterable, $concurrency, callable $onFulfilled = null ) { return each_limit( $iterable, $concurrency, $onFulfilled, function ($reason, $idx, PromiseInterface $aggregate) { $aggregate->reject($reason); } ); } /** * Returns true if a promise is fulfilled. * * @param PromiseInterface $promise * * @return bool */ function is_fulfilled(PromiseInterface $promise) { return $promise->getState() === PromiseInterface::FULFILLED; } /** * Returns true if a promise is rejected. * * @param PromiseInterface $promise * * @return bool */ function is_rejected(PromiseInterface $promise) { return $promise->getState() === PromiseInterface::REJECTED; } /** * Returns true if a promise is fulfilled or rejected. * * @param PromiseInterface $promise * * @return bool */ function is_settled(PromiseInterface $promise) { return $promise->getState() !== PromiseInterface::PENDING; } /** * @see Coroutine * * @param callable $generatorFn * * @return PromiseInterface */ function coroutine(callable $generatorFn) { return new Coroutine($generatorFn); } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/promises/src/functions_include.php ================================================ withPath('foo')->withHost('example.com')` will throw an exception because the path of a URI with an authority must start with a slash "/" or be empty - `(new Uri())->withScheme('http')` will return `'http://localhost'` ### Deprecated - `Uri::resolve` in favor of `UriResolver::resolve` - `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` ### Fixed - `Stream::read` when length parameter <= 0. - `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory. - `ServerRequest::getUriFromGlobals` when `Host` header contains port. - Compatibility of URIs with `file` scheme and empty host. ## [1.3.1] - 2016-06-25 ### Fixed - `Uri::__toString` for network path references, e.g. `//example.org`. - Missing lowercase normalization for host. - Handling of URI components in case they are `'0'` in a lot of places, e.g. as a user info password. - `Uri::withAddedHeader` to correctly merge headers with different case. - Trimming of header values in `Uri::withAddedHeader`. Header values may be surrounded by whitespace which should be ignored according to RFC 7230 Section 3.2.4. This does not apply to header names. - `Uri::withAddedHeader` with an array of header values. - `Uri::resolve` when base path has no slash and handling of fragment. - Handling of encoding in `Uri::with(out)QueryValue` so one can pass the key/value both in encoded as well as decoded form to those methods. This is consistent with withPath, withQuery etc. - `ServerRequest::withoutAttribute` when attribute value is null. ## [1.3.0] - 2016-04-13 ### Added - Remaining interfaces needed for full PSR7 compatibility (ServerRequestInterface, UploadedFileInterface, etc.). - Support for stream_for from scalars. ### Changed - Can now extend Uri. ### Fixed - A bug in validating request methods by making it more permissive. ## [1.2.3] - 2016-02-18 ### Fixed - Support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote streams, which can sometimes return fewer bytes than requested with `fread`. - Handling of gzipped responses with FNAME headers. ## [1.2.2] - 2016-01-22 ### Added - Support for URIs without any authority. - Support for HTTP 451 'Unavailable For Legal Reasons.' - Support for using '0' as a filename. - Support for including non-standard ports in Host headers. ## [1.2.1] - 2015-11-02 ### Changes - Now supporting negative offsets when seeking to SEEK_END. ## [1.2.0] - 2015-08-15 ### Changed - Body as `"0"` is now properly added to a response. - Now allowing forward seeking in CachingStream. - Now properly parsing HTTP requests that contain proxy targets in `parse_request`. - functions.php is now conditionally required. - user-info is no longer dropped when resolving URIs. ## [1.1.0] - 2015-06-24 ### Changed - URIs can now be relative. - `multipart/form-data` headers are now overridden case-insensitively. - URI paths no longer encode the following characters because they are allowed in URIs: "(", ")", "*", "!", "'" - A port is no longer added to a URI when the scheme is missing and no port is present. ## 1.0.0 - 2015-05-19 Initial release. Currently unsupported: - `Psr\Http\Message\ServerRequestInterface` - `Psr\Http\Message\UploadedFileInterface` [Unreleased]: https://github.com/guzzle/psr7/compare/1.6.0...HEAD [1.6.0]: https://github.com/guzzle/psr7/compare/1.5.2...1.6.0 [1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2 [1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1 [1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0 [1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2 [1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1 [1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0 [1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1 [1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0 [1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3 [1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2 [1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1 [1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0 ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/LICENSE ================================================ Copyright (c) 2015 Michael Dowling, https://github.com/mtdowling Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/README.md ================================================ # PSR-7 Message Implementation This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/) message implementation, several stream decorators, and some helpful functionality like query string parsing. [![Build Status](https://travis-ci.org/guzzle/psr7.svg?branch=master)](https://travis-ci.org/guzzle/psr7) # Stream implementation This package comes with a number of stream implementations and stream decorators. ## AppendStream `GuzzleHttp\Psr7\AppendStream` Reads from multiple streams, one after the other. ```php use GuzzleHttp\Psr7; $a = Psr7\stream_for('abc, '); $b = Psr7\stream_for('123.'); $composed = new Psr7\AppendStream([$a, $b]); $composed->addStream(Psr7\stream_for(' Above all listen to me')); echo $composed; // abc, 123. Above all listen to me. ``` ## BufferStream `GuzzleHttp\Psr7\BufferStream` Provides a buffer stream that can be written to fill a buffer, and read from to remove bytes from the buffer. This stream returns a "hwm" metadata value that tells upstream consumers what the configured high water mark of the stream is, or the maximum preferred size of the buffer. ```php use GuzzleHttp\Psr7; // When more than 1024 bytes are in the buffer, it will begin returning // false to writes. This is an indication that writers should slow down. $buffer = new Psr7\BufferStream(1024); ``` ## CachingStream The CachingStream is used to allow seeking over previously read bytes on non-seekable streams. This can be useful when transferring a non-seekable entity body fails due to needing to rewind the stream (for example, resulting from a redirect). Data that is read from the remote stream will be buffered in a PHP temp stream so that previously read bytes are cached first in memory, then on disk. ```php use GuzzleHttp\Psr7; $original = Psr7\stream_for(fopen('http://www.google.com', 'r')); $stream = new Psr7\CachingStream($original); $stream->read(1024); echo $stream->tell(); // 1024 $stream->seek(0); echo $stream->tell(); // 0 ``` ## DroppingStream `GuzzleHttp\Psr7\DroppingStream` Stream decorator that begins dropping data once the size of the underlying stream becomes too full. ```php use GuzzleHttp\Psr7; // Create an empty stream $stream = Psr7\stream_for(); // Start dropping data when the stream has more than 10 bytes $dropping = new Psr7\DroppingStream($stream, 10); $dropping->write('01234567890123456789'); echo $stream; // 0123456789 ``` ## FnStream `GuzzleHttp\Psr7\FnStream` Compose stream implementations based on a hash of functions. Allows for easy testing and extension of a provided stream without needing to create a concrete class for a simple extension point. ```php use GuzzleHttp\Psr7; $stream = Psr7\stream_for('hi'); $fnStream = Psr7\FnStream::decorate($stream, [ 'rewind' => function () use ($stream) { echo 'About to rewind - '; $stream->rewind(); echo 'rewound!'; } ]); $fnStream->rewind(); // Outputs: About to rewind - rewound! ``` ## InflateStream `GuzzleHttp\Psr7\InflateStream` Uses PHP's zlib.inflate filter to inflate deflate or gzipped content. This stream decorator skips the first 10 bytes of the given stream to remove the gzip header, converts the provided stream to a PHP stream resource, then appends the zlib.inflate filter. The stream is then converted back to a Guzzle stream resource to be used as a Guzzle stream. ## LazyOpenStream `GuzzleHttp\Psr7\LazyOpenStream` Lazily reads or writes to a file that is opened only after an IO operation take place on the stream. ```php use GuzzleHttp\Psr7; $stream = new Psr7\LazyOpenStream('/path/to/file', 'r'); // The file has not yet been opened... echo $stream->read(10); // The file is opened and read from only when needed. ``` ## LimitStream `GuzzleHttp\Psr7\LimitStream` LimitStream can be used to read a subset or slice of an existing stream object. This can be useful for breaking a large file into smaller pieces to be sent in chunks (e.g. Amazon S3's multipart upload API). ```php use GuzzleHttp\Psr7; $original = Psr7\stream_for(fopen('/tmp/test.txt', 'r+')); echo $original->getSize(); // >>> 1048576 // Limit the size of the body to 1024 bytes and start reading from byte 2048 $stream = new Psr7\LimitStream($original, 1024, 2048); echo $stream->getSize(); // >>> 1024 echo $stream->tell(); // >>> 0 ``` ## MultipartStream `GuzzleHttp\Psr7\MultipartStream` Stream that when read returns bytes for a streaming multipart or multipart/form-data stream. ## NoSeekStream `GuzzleHttp\Psr7\NoSeekStream` NoSeekStream wraps a stream and does not allow seeking. ```php use GuzzleHttp\Psr7; $original = Psr7\stream_for('foo'); $noSeek = new Psr7\NoSeekStream($original); echo $noSeek->read(3); // foo var_export($noSeek->isSeekable()); // false $noSeek->seek(0); var_export($noSeek->read(3)); // NULL ``` ## PumpStream `GuzzleHttp\Psr7\PumpStream` Provides a read only stream that pumps data from a PHP callable. When invoking the provided callable, the PumpStream will pass the amount of data requested to read to the callable. The callable can choose to ignore this value and return fewer or more bytes than requested. Any extra data returned by the provided callable is buffered internally until drained using the read() function of the PumpStream. The provided callable MUST return false when there is no more data to read. ## Implementing stream decorators Creating a stream decorator is very easy thanks to the `GuzzleHttp\Psr7\StreamDecoratorTrait`. This trait provides methods that implement `Psr\Http\Message\StreamInterface` by proxying to an underlying stream. Just `use` the `StreamDecoratorTrait` and implement your custom methods. For example, let's say we wanted to call a specific function each time the last byte is read from a stream. This could be implemented by overriding the `read()` method. ```php use Psr\Http\Message\StreamInterface; use GuzzleHttp\Psr7\StreamDecoratorTrait; class EofCallbackStream implements StreamInterface { use StreamDecoratorTrait; private $callback; public function __construct(StreamInterface $stream, callable $cb) { $this->stream = $stream; $this->callback = $cb; } public function read($length) { $result = $this->stream->read($length); // Invoke the callback when EOF is hit. if ($this->eof()) { call_user_func($this->callback); } return $result; } } ``` This decorator could be added to any existing stream and used like so: ```php use GuzzleHttp\Psr7; $original = Psr7\stream_for('foo'); $eofStream = new EofCallbackStream($original, function () { echo 'EOF!'; }); $eofStream->read(2); $eofStream->read(1); // echoes "EOF!" $eofStream->seek(0); $eofStream->read(3); // echoes "EOF!" ``` ## PHP StreamWrapper You can use the `GuzzleHttp\Psr7\StreamWrapper` class if you need to use a PSR-7 stream as a PHP stream resource. Use the `GuzzleHttp\Psr7\StreamWrapper::getResource()` method to create a PHP stream from a PSR-7 stream. ```php use GuzzleHttp\Psr7\StreamWrapper; $stream = GuzzleHttp\Psr7\stream_for('hello!'); $resource = StreamWrapper::getResource($stream); echo fread($resource, 6); // outputs hello! ``` # Function API There are various functions available under the `GuzzleHttp\Psr7` namespace. ## `function str` `function str(MessageInterface $message)` Returns the string representation of an HTTP message. ```php $request = new GuzzleHttp\Psr7\Request('GET', 'http://example.com'); echo GuzzleHttp\Psr7\str($request); ``` ## `function uri_for` `function uri_for($uri)` This function accepts a string or `Psr\Http\Message\UriInterface` and returns a UriInterface for the given value. If the value is already a `UriInterface`, it is returned as-is. ```php $uri = GuzzleHttp\Psr7\uri_for('http://example.com'); assert($uri === GuzzleHttp\Psr7\uri_for($uri)); ``` ## `function stream_for` `function stream_for($resource = '', array $options = [])` Create a new stream based on the input type. Options is an associative array that can contain the following keys: * - metadata: Array of custom metadata. * - size: Size of the stream. This method accepts the following `$resource` types: - `Psr\Http\Message\StreamInterface`: Returns the value as-is. - `string`: Creates a stream object that uses the given string as the contents. - `resource`: Creates a stream object that wraps the given PHP stream resource. - `Iterator`: If the provided value implements `Iterator`, then a read-only stream object will be created that wraps the given iterable. Each time the stream is read from, data from the iterator will fill a buffer and will be continuously called until the buffer is equal to the requested read size. Subsequent read calls will first read from the buffer and then call `next` on the underlying iterator until it is exhausted. - `object` with `__toString()`: If the object has the `__toString()` method, the object will be cast to a string and then a stream will be returned that uses the string value. - `NULL`: When `null` is passed, an empty stream object is returned. - `callable` When a callable is passed, a read-only stream object will be created that invokes the given callable. The callable is invoked with the number of suggested bytes to read. The callable can return any number of bytes, but MUST return `false` when there is no more data to return. The stream object that wraps the callable will invoke the callable until the number of requested bytes are available. Any additional bytes will be buffered and used in subsequent reads. ```php $stream = GuzzleHttp\Psr7\stream_for('foo'); $stream = GuzzleHttp\Psr7\stream_for(fopen('/path/to/file', 'r')); $generator = function ($bytes) { for ($i = 0; $i < $bytes; $i++) { yield ' '; } } $stream = GuzzleHttp\Psr7\stream_for($generator(100)); ``` ## `function parse_header` `function parse_header($header)` Parse an array of header values containing ";" separated data into an array of associative arrays representing the header key value pair data of the header. When a parameter does not contain a value, but just contains a key, this function will inject a key with a '' string value. ## `function normalize_header` `function normalize_header($header)` Converts an array of header values that may contain comma separated headers into an array of headers with no comma separated values. ## `function modify_request` `function modify_request(RequestInterface $request, array $changes)` Clone and modify a request with the given changes. This method is useful for reducing the number of clones needed to mutate a message. The changes can be one of: - method: (string) Changes the HTTP method. - set_headers: (array) Sets the given headers. - remove_headers: (array) Remove the given headers. - body: (mixed) Sets the given body. - uri: (UriInterface) Set the URI. - query: (string) Set the query string value of the URI. - version: (string) Set the protocol version. ## `function rewind_body` `function rewind_body(MessageInterface $message)` Attempts to rewind a message body and throws an exception on failure. The body of the message will only be rewound if a call to `tell()` returns a value other than `0`. ## `function try_fopen` `function try_fopen($filename, $mode)` Safely opens a PHP stream resource using a filename. When fopen fails, PHP normally raises a warning. This function adds an error handler that checks for errors and throws an exception instead. ## `function copy_to_string` `function copy_to_string(StreamInterface $stream, $maxLen = -1)` Copy the contents of a stream into a string until the given number of bytes have been read. ## `function copy_to_stream` `function copy_to_stream(StreamInterface $source, StreamInterface $dest, $maxLen = -1)` Copy the contents of a stream into another stream until the given number of bytes have been read. ## `function hash` `function hash(StreamInterface $stream, $algo, $rawOutput = false)` Calculate a hash of a Stream. This method reads the entire stream to calculate a rolling hash (based on PHP's hash_init functions). ## `function readline` `function readline(StreamInterface $stream, $maxLength = null)` Read a line from the stream up to the maximum allowed buffer length. ## `function parse_request` `function parse_request($message)` Parses a request message string into a request object. ## `function parse_response` `function parse_response($message)` Parses a response message string into a response object. ## `function parse_query` `function parse_query($str, $urlEncoding = true)` Parse a query string into an associative array. If multiple values are found for the same key, the value of that key value pair will become an array. This function does not parse nested PHP style arrays into an associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed into `['foo[a]' => '1', 'foo[b]' => '2']`). ## `function build_query` `function build_query(array $params, $encoding = PHP_QUERY_RFC3986)` Build a query string from an array of key value pairs. This function can use the return value of parse_query() to build a query string. This function does not modify the provided keys when an array is encountered (like http_build_query would). ## `function mimetype_from_filename` `function mimetype_from_filename($filename)` Determines the mimetype of a file by looking at its extension. ## `function mimetype_from_extension` `function mimetype_from_extension($extension)` Maps a file extensions to a mimetype. # Additional URI Methods Aside from the standard `Psr\Http\Message\UriInterface` implementation in form of the `GuzzleHttp\Psr7\Uri` class, this library also provides additional functionality when working with URIs as static methods. ## URI Types An instance of `Psr\Http\Message\UriInterface` can either be an absolute URI or a relative reference. An absolute URI has a scheme. A relative reference is used to express a URI relative to another URI, the base URI. Relative references can be divided into several forms according to [RFC 3986 Section 4.2](https://tools.ietf.org/html/rfc3986#section-4.2): - network-path references, e.g. `//example.com/path` - absolute-path references, e.g. `/path` - relative-path references, e.g. `subpath` The following methods can be used to identify the type of the URI. ### `GuzzleHttp\Psr7\Uri::isAbsolute` `public static function isAbsolute(UriInterface $uri): bool` Whether the URI is absolute, i.e. it has a scheme. ### `GuzzleHttp\Psr7\Uri::isNetworkPathReference` `public static function isNetworkPathReference(UriInterface $uri): bool` Whether the URI is a network-path reference. A relative reference that begins with two slash characters is termed an network-path reference. ### `GuzzleHttp\Psr7\Uri::isAbsolutePathReference` `public static function isAbsolutePathReference(UriInterface $uri): bool` Whether the URI is a absolute-path reference. A relative reference that begins with a single slash character is termed an absolute-path reference. ### `GuzzleHttp\Psr7\Uri::isRelativePathReference` `public static function isRelativePathReference(UriInterface $uri): bool` Whether the URI is a relative-path reference. A relative reference that does not begin with a slash character is termed a relative-path reference. ### `GuzzleHttp\Psr7\Uri::isSameDocumentReference` `public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool` Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its fragment component, identical to the base URI. When no base URI is given, only an empty URI reference (apart from its fragment) is considered a same-document reference. ## URI Components Additional methods to work with URI components. ### `GuzzleHttp\Psr7\Uri::isDefaultPort` `public static function isDefaultPort(UriInterface $uri): bool` Whether the URI has the default port of the current scheme. `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used independently of the implementation. ### `GuzzleHttp\Psr7\Uri::composeComponents` `public static function composeComponents($scheme, $authority, $path, $query, $fragment): string` Composes a URI reference string from its various components according to [RFC 3986 Section 5.3](https://tools.ietf.org/html/rfc3986#section-5.3). Usually this method does not need to be called manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__toString`. ### `GuzzleHttp\Psr7\Uri::fromParts` `public static function fromParts(array $parts): UriInterface` Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components. ### `GuzzleHttp\Psr7\Uri::withQueryValue` `public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface` Creates a new URI with a specific query string value. Any existing query string values that exactly match the provided key are removed and replaced with the given key value pair. A value of null will set the query string key without a value, e.g. "key" instead of "key=value". ### `GuzzleHttp\Psr7\Uri::withQueryValues` `public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface` Creates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an associative array of key => value. ### `GuzzleHttp\Psr7\Uri::withoutQueryValue` `public static function withoutQueryValue(UriInterface $uri, $key): UriInterface` Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the provided key are removed. ## Reference Resolution `GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according to [RFC 3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5). This is for example also what web browsers do when resolving a link in a website based on the current request URI. ### `GuzzleHttp\Psr7\UriResolver::resolve` `public static function resolve(UriInterface $base, UriInterface $rel): UriInterface` Converts the relative URI into a new URI that is resolved against the base URI. ### `GuzzleHttp\Psr7\UriResolver::removeDotSegments` `public static function removeDotSegments(string $path): string` Removes dot segments from a path and returns the new path according to [RFC 3986 Section 5.2.4](https://tools.ietf.org/html/rfc3986#section-5.2.4). ### `GuzzleHttp\Psr7\UriResolver::relativize` `public static function relativize(UriInterface $base, UriInterface $target): UriInterface` Returns the target URI as a relative reference from the base URI. This method is the counterpart to resolve(): ```php (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) ``` One use-case is to use the current request URI as base URI and then generate relative links in your documents to reduce the document size or offer self-contained downloadable document archives. ```php $base = new Uri('http://example.com/a/b/'); echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. ``` ## Normalization and Comparison `GuzzleHttp\Psr7\UriNormalizer` provides methods to normalize and compare URIs according to [RFC 3986 Section 6](https://tools.ietf.org/html/rfc3986#section-6). ### `GuzzleHttp\Psr7\UriNormalizer::normalize` `public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface` Returns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface. This methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask of normalizations to apply. The following normalizations are available: - `UriNormalizer::PRESERVING_NORMALIZATIONS` Default normalizations which only include the ones that preserve semantics. - `UriNormalizer::CAPITALIZE_PERCENT_ENCODING` All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized. Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b` - `UriNormalizer::DECODE_UNRESERVED_CHARACTERS` Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers. Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/` - `UriNormalizer::CONVERT_EMPTY_PATH` Converts the empty path to "/" for http and https URIs. Example: `http://example.org` → `http://example.org/` - `UriNormalizer::REMOVE_DEFAULT_HOST` Removes the default host of the given URI scheme from the URI. Only the "file" scheme defines the default host "localhost". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to RFC 3986. Example: `file://localhost/myfile` → `file:///myfile` - `UriNormalizer::REMOVE_DEFAULT_PORT` Removes the default port of the given URI scheme from the URI. Example: `http://example.org:80/` → `http://example.org/` - `UriNormalizer::REMOVE_DOT_SEGMENTS` Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would change the semantics of the URI reference. Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html` - `UriNormalizer::REMOVE_DUPLICATE_SLASHES` Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization may change the semantics. Encoded slashes (%2F) are not removed. Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html` - `UriNormalizer::SORT_QUERY_PARAMETERS` Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be significant (this is not defined by the standard). So this normalization is not safe and may change the semantics of the URI. Example: `?lang=en&article=fred` → `?article=fred&lang=en` ### `GuzzleHttp\Psr7\UriNormalizer::isEquivalent` `public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool` Whether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given `$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent. This of course assumes they will be resolved against the same base URI. If this is not the case, determination of equivalence or difference of relative references does not mean anything. ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/composer.json ================================================ { "name": "guzzlehttp/psr7", "type": "library", "description": "PSR-7 message implementation that also provides common utility methods", "keywords": ["request", "response", "message", "stream", "http", "uri", "url", "psr-7"], "license": "MIT", "authors": [ { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { "name": "Tobias Schultze", "homepage": "https://github.com/Tobion" } ], "require": { "php": ">=5.4.0", "psr/http-message": "~1.0", "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" }, "require-dev": { "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8", "ext-zlib": "*" }, "provide": { "psr/http-message-implementation": "1.0" }, "suggest": { "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" }, "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" }, "files": ["src/functions_include.php"] }, "autoload-dev": { "psr-4": { "GuzzleHttp\\Tests\\Psr7\\": "tests/" } }, "extra": { "branch-alias": { "dev-master": "1.6-dev" } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/AppendStream.php ================================================ addStream($stream); } } public function __toString() { try { $this->rewind(); return $this->getContents(); } catch (\Exception $e) { return ''; } } /** * Add a stream to the AppendStream * * @param StreamInterface $stream Stream to append. Must be readable. * * @throws \InvalidArgumentException if the stream is not readable */ public function addStream(StreamInterface $stream) { if (!$stream->isReadable()) { throw new \InvalidArgumentException('Each stream must be readable'); } // The stream is only seekable if all streams are seekable if (!$stream->isSeekable()) { $this->seekable = false; } $this->streams[] = $stream; } public function getContents() { return copy_to_string($this); } /** * Closes each attached stream. * * {@inheritdoc} */ public function close() { $this->pos = $this->current = 0; $this->seekable = true; foreach ($this->streams as $stream) { $stream->close(); } $this->streams = []; } /** * Detaches each attached stream. * * Returns null as it's not clear which underlying stream resource to return. * * {@inheritdoc} */ public function detach() { $this->pos = $this->current = 0; $this->seekable = true; foreach ($this->streams as $stream) { $stream->detach(); } $this->streams = []; } public function tell() { return $this->pos; } /** * Tries to calculate the size by adding the size of each stream. * * If any of the streams do not return a valid number, then the size of the * append stream cannot be determined and null is returned. * * {@inheritdoc} */ public function getSize() { $size = 0; foreach ($this->streams as $stream) { $s = $stream->getSize(); if ($s === null) { return null; } $size += $s; } return $size; } public function eof() { return !$this->streams || ($this->current >= count($this->streams) - 1 && $this->streams[$this->current]->eof()); } public function rewind() { $this->seek(0); } /** * Attempts to seek to the given position. Only supports SEEK_SET. * * {@inheritdoc} */ public function seek($offset, $whence = SEEK_SET) { if (!$this->seekable) { throw new \RuntimeException('This AppendStream is not seekable'); } elseif ($whence !== SEEK_SET) { throw new \RuntimeException('The AppendStream can only seek with SEEK_SET'); } $this->pos = $this->current = 0; // Rewind each stream foreach ($this->streams as $i => $stream) { try { $stream->rewind(); } catch (\Exception $e) { throw new \RuntimeException('Unable to seek stream ' . $i . ' of the AppendStream', 0, $e); } } // Seek to the actual position by reading from each stream while ($this->pos < $offset && !$this->eof()) { $result = $this->read(min(8096, $offset - $this->pos)); if ($result === '') { break; } } } /** * Reads from all of the appended streams until the length is met or EOF. * * {@inheritdoc} */ public function read($length) { $buffer = ''; $total = count($this->streams) - 1; $remaining = $length; $progressToNext = false; while ($remaining > 0) { // Progress to the next stream if needed. if ($progressToNext || $this->streams[$this->current]->eof()) { $progressToNext = false; if ($this->current === $total) { break; } $this->current++; } $result = $this->streams[$this->current]->read($remaining); // Using a loose comparison here to match on '', false, and null if ($result == null) { $progressToNext = true; continue; } $buffer .= $result; $remaining = $length - strlen($buffer); } $this->pos += strlen($buffer); return $buffer; } public function isReadable() { return true; } public function isWritable() { return false; } public function isSeekable() { return $this->seekable; } public function write($string) { throw new \RuntimeException('Cannot write to an AppendStream'); } public function getMetadata($key = null) { return $key ? null : []; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/BufferStream.php ================================================ hwm = $hwm; } public function __toString() { return $this->getContents(); } public function getContents() { $buffer = $this->buffer; $this->buffer = ''; return $buffer; } public function close() { $this->buffer = ''; } public function detach() { $this->close(); } public function getSize() { return strlen($this->buffer); } public function isReadable() { return true; } public function isWritable() { return true; } public function isSeekable() { return false; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = SEEK_SET) { throw new \RuntimeException('Cannot seek a BufferStream'); } public function eof() { return strlen($this->buffer) === 0; } public function tell() { throw new \RuntimeException('Cannot determine the position of a BufferStream'); } /** * Reads data from the buffer. */ public function read($length) { $currentLength = strlen($this->buffer); if ($length >= $currentLength) { // No need to slice the buffer because we don't have enough data. $result = $this->buffer; $this->buffer = ''; } else { // Slice up the result to provide a subset of the buffer. $result = substr($this->buffer, 0, $length); $this->buffer = substr($this->buffer, $length); } return $result; } /** * Writes data to the buffer. */ public function write($string) { $this->buffer .= $string; // TODO: What should happen here? if (strlen($this->buffer) >= $this->hwm) { return false; } return strlen($string); } public function getMetadata($key = null) { if ($key == 'hwm') { return $this->hwm; } return $key ? null : []; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/CachingStream.php ================================================ remoteStream = $stream; $this->stream = $target ?: new Stream(fopen('php://temp', 'r+')); } public function getSize() { return max($this->stream->getSize(), $this->remoteStream->getSize()); } public function rewind() { $this->seek(0); } public function seek($offset, $whence = SEEK_SET) { if ($whence == SEEK_SET) { $byte = $offset; } elseif ($whence == SEEK_CUR) { $byte = $offset + $this->tell(); } elseif ($whence == SEEK_END) { $size = $this->remoteStream->getSize(); if ($size === null) { $size = $this->cacheEntireStream(); } $byte = $size + $offset; } else { throw new \InvalidArgumentException('Invalid whence'); } $diff = $byte - $this->stream->getSize(); if ($diff > 0) { // Read the remoteStream until we have read in at least the amount // of bytes requested, or we reach the end of the file. while ($diff > 0 && !$this->remoteStream->eof()) { $this->read($diff); $diff = $byte - $this->stream->getSize(); } } else { // We can just do a normal seek since we've already seen this byte. $this->stream->seek($byte); } } public function read($length) { // Perform a regular read on any previously read data from the buffer $data = $this->stream->read($length); $remaining = $length - strlen($data); // More data was requested so read from the remote stream if ($remaining) { // If data was written to the buffer in a position that would have // been filled from the remote stream, then we must skip bytes on // the remote stream to emulate overwriting bytes from that // position. This mimics the behavior of other PHP stream wrappers. $remoteData = $this->remoteStream->read( $remaining + $this->skipReadBytes ); if ($this->skipReadBytes) { $len = strlen($remoteData); $remoteData = substr($remoteData, $this->skipReadBytes); $this->skipReadBytes = max(0, $this->skipReadBytes - $len); } $data .= $remoteData; $this->stream->write($remoteData); } return $data; } public function write($string) { // When appending to the end of the currently read stream, you'll want // to skip bytes from being read from the remote stream to emulate // other stream wrappers. Basically replacing bytes of data of a fixed // length. $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell(); if ($overflow > 0) { $this->skipReadBytes += $overflow; } return $this->stream->write($string); } public function eof() { return $this->stream->eof() && $this->remoteStream->eof(); } /** * Close both the remote stream and buffer stream */ public function close() { $this->remoteStream->close() && $this->stream->close(); } private function cacheEntireStream() { $target = new FnStream(['write' => 'strlen']); copy_to_stream($this, $target); return $this->tell(); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/DroppingStream.php ================================================ stream = $stream; $this->maxLength = $maxLength; } public function write($string) { $diff = $this->maxLength - $this->stream->getSize(); // Begin returning 0 when the underlying stream is too large. if ($diff <= 0) { return 0; } // Write the stream or a subset of the stream if needed. if (strlen($string) < $diff) { return $this->stream->write($string); } return $this->stream->write(substr($string, 0, $diff)); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/FnStream.php ================================================ methods = $methods; // Create the functions on the class foreach ($methods as $name => $fn) { $this->{'_fn_' . $name} = $fn; } } /** * Lazily determine which methods are not implemented. * @throws \BadMethodCallException */ public function __get($name) { throw new \BadMethodCallException(str_replace('_fn_', '', $name) . '() is not implemented in the FnStream'); } /** * The close method is called on the underlying stream only if possible. */ public function __destruct() { if (isset($this->_fn_close)) { call_user_func($this->_fn_close); } } /** * An unserialize would allow the __destruct to run when the unserialized value goes out of scope. * @throws \LogicException */ public function __wakeup() { throw new \LogicException('FnStream should never be unserialized'); } /** * Adds custom functionality to an underlying stream by intercepting * specific method calls. * * @param StreamInterface $stream Stream to decorate * @param array $methods Hash of method name to a closure * * @return FnStream */ public static function decorate(StreamInterface $stream, array $methods) { // If any of the required methods were not provided, then simply // proxy to the decorated stream. foreach (array_diff(self::$slots, array_keys($methods)) as $diff) { $methods[$diff] = [$stream, $diff]; } return new self($methods); } public function __toString() { return call_user_func($this->_fn___toString); } public function close() { return call_user_func($this->_fn_close); } public function detach() { return call_user_func($this->_fn_detach); } public function getSize() { return call_user_func($this->_fn_getSize); } public function tell() { return call_user_func($this->_fn_tell); } public function eof() { return call_user_func($this->_fn_eof); } public function isSeekable() { return call_user_func($this->_fn_isSeekable); } public function rewind() { call_user_func($this->_fn_rewind); } public function seek($offset, $whence = SEEK_SET) { call_user_func($this->_fn_seek, $offset, $whence); } public function isWritable() { return call_user_func($this->_fn_isWritable); } public function write($string) { return call_user_func($this->_fn_write, $string); } public function isReadable() { return call_user_func($this->_fn_isReadable); } public function read($length) { return call_user_func($this->_fn_read, $length); } public function getContents() { return call_user_func($this->_fn_getContents); } public function getMetadata($key = null) { return call_user_func($this->_fn_getMetadata, $key); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/InflateStream.php ================================================ read(10); $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header); // Skip the header, that is 10 + length of filename + 1 (nil) bytes $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength); $resource = StreamWrapper::getResource($stream); stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ); $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); } /** * @param StreamInterface $stream * @param $header * @return int */ private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header) { $filename_header_length = 0; if (substr(bin2hex($header), 6, 2) === '08') { // we have a filename, read until nil $filename_header_length = 1; while ($stream->read(1) !== chr(0)) { $filename_header_length++; } } return $filename_header_length; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/LazyOpenStream.php ================================================ filename = $filename; $this->mode = $mode; } /** * Creates the underlying stream lazily when required. * * @return StreamInterface */ protected function createStream() { return stream_for(try_fopen($this->filename, $this->mode)); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/LimitStream.php ================================================ stream = $stream; $this->setLimit($limit); $this->setOffset($offset); } public function eof() { // Always return true if the underlying stream is EOF if ($this->stream->eof()) { return true; } // No limit and the underlying stream is not at EOF if ($this->limit == -1) { return false; } return $this->stream->tell() >= $this->offset + $this->limit; } /** * Returns the size of the limited subset of data * {@inheritdoc} */ public function getSize() { if (null === ($length = $this->stream->getSize())) { return null; } elseif ($this->limit == -1) { return $length - $this->offset; } else { return min($this->limit, $length - $this->offset); } } /** * Allow for a bounded seek on the read limited stream * {@inheritdoc} */ public function seek($offset, $whence = SEEK_SET) { if ($whence !== SEEK_SET || $offset < 0) { throw new \RuntimeException(sprintf( 'Cannot seek to offset %s with whence %s', $offset, $whence )); } $offset += $this->offset; if ($this->limit !== -1) { if ($offset > $this->offset + $this->limit) { $offset = $this->offset + $this->limit; } } $this->stream->seek($offset); } /** * Give a relative tell() * {@inheritdoc} */ public function tell() { return $this->stream->tell() - $this->offset; } /** * Set the offset to start limiting from * * @param int $offset Offset to seek to and begin byte limiting from * * @throws \RuntimeException if the stream cannot be seeked. */ public function setOffset($offset) { $current = $this->stream->tell(); if ($current !== $offset) { // If the stream cannot seek to the offset position, then read to it if ($this->stream->isSeekable()) { $this->stream->seek($offset); } elseif ($current > $offset) { throw new \RuntimeException("Could not seek to stream offset $offset"); } else { $this->stream->read($offset - $current); } } $this->offset = $offset; } /** * Set the limit of bytes that the decorator allows to be read from the * stream. * * @param int $limit Number of bytes to allow to be read from the stream. * Use -1 for no limit. */ public function setLimit($limit) { $this->limit = $limit; } public function read($length) { if ($this->limit == -1) { return $this->stream->read($length); } // Check if the current position is less than the total allowed // bytes + original offset $remaining = ($this->offset + $this->limit) - $this->stream->tell(); if ($remaining > 0) { // Only return the amount of requested data, ensuring that the byte // limit is not exceeded return $this->stream->read(min($remaining, $length)); } return ''; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/MessageTrait.php ================================================ array of values */ private $headers = []; /** @var array Map of lowercase header name => original name at registration */ private $headerNames = []; /** @var string */ private $protocol = '1.1'; /** @var StreamInterface */ private $stream; public function getProtocolVersion() { return $this->protocol; } public function withProtocolVersion($version) { if ($this->protocol === $version) { return $this; } $new = clone $this; $new->protocol = $version; return $new; } public function getHeaders() { return $this->headers; } public function hasHeader($header) { return isset($this->headerNames[strtolower($header)]); } public function getHeader($header) { $header = strtolower($header); if (!isset($this->headerNames[$header])) { return []; } $header = $this->headerNames[$header]; return $this->headers[$header]; } public function getHeaderLine($header) { return implode(', ', $this->getHeader($header)); } public function withHeader($header, $value) { $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = strtolower($header); $new = clone $this; if (isset($new->headerNames[$normalized])) { unset($new->headers[$new->headerNames[$normalized]]); } $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; return $new; } public function withAddedHeader($header, $value) { $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = strtolower($header); $new = clone $this; if (isset($new->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; $new->headers[$header] = array_merge($this->headers[$header], $value); } else { $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; } return $new; } public function withoutHeader($header) { $normalized = strtolower($header); if (!isset($this->headerNames[$normalized])) { return $this; } $header = $this->headerNames[$normalized]; $new = clone $this; unset($new->headers[$header], $new->headerNames[$normalized]); return $new; } public function getBody() { if (!$this->stream) { $this->stream = stream_for(''); } return $this->stream; } public function withBody(StreamInterface $body) { if ($body === $this->stream) { return $this; } $new = clone $this; $new->stream = $body; return $new; } private function setHeaders(array $headers) { $this->headerNames = $this->headers = []; foreach ($headers as $header => $value) { if (is_int($header)) { // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass. $header = (string) $header; } $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = strtolower($header); if (isset($this->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; $this->headers[$header] = array_merge($this->headers[$header], $value); } else { $this->headerNames[$normalized] = $header; $this->headers[$header] = $value; } } } private function normalizeHeaderValue($value) { if (!is_array($value)) { return $this->trimHeaderValues([$value]); } if (count($value) === 0) { throw new \InvalidArgumentException('Header value can not be an empty array.'); } return $this->trimHeaderValues($value); } /** * Trims whitespace from the header values. * * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. * * header-field = field-name ":" OWS field-value OWS * OWS = *( SP / HTAB ) * * @param string[] $values Header values * * @return string[] Trimmed header values * * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 */ private function trimHeaderValues(array $values) { return array_map(function ($value) { if (!is_scalar($value) && null !== $value) { throw new \InvalidArgumentException(sprintf( 'Header value must be scalar or null but %s provided.', is_object($value) ? get_class($value) : gettype($value) )); } return trim((string) $value, " \t"); }, $values); } private function assertHeader($header) { if (!is_string($header)) { throw new \InvalidArgumentException(sprintf( 'Header name must be a string but %s provided.', is_object($header) ? get_class($header) : gettype($header) )); } if ($header === '') { throw new \InvalidArgumentException('Header name can not be empty.'); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/MultipartStream.php ================================================ boundary = $boundary ?: sha1(uniqid('', true)); $this->stream = $this->createStream($elements); } /** * Get the boundary * * @return string */ public function getBoundary() { return $this->boundary; } public function isWritable() { return false; } /** * Get the headers needed before transferring the content of a POST file */ private function getHeaders(array $headers) { $str = ''; foreach ($headers as $key => $value) { $str .= "{$key}: {$value}\r\n"; } return "--{$this->boundary}\r\n" . trim($str) . "\r\n\r\n"; } /** * Create the aggregate stream that will be used to upload the POST data */ protected function createStream(array $elements) { $stream = new AppendStream(); foreach ($elements as $element) { $this->addElement($stream, $element); } // Add the trailing boundary with CRLF $stream->addStream(stream_for("--{$this->boundary}--\r\n")); return $stream; } private function addElement(AppendStream $stream, array $element) { foreach (['contents', 'name'] as $key) { if (!array_key_exists($key, $element)) { throw new \InvalidArgumentException("A '{$key}' key is required"); } } $element['contents'] = stream_for($element['contents']); if (empty($element['filename'])) { $uri = $element['contents']->getMetadata('uri'); if (substr($uri, 0, 6) !== 'php://') { $element['filename'] = $uri; } } list($body, $headers) = $this->createElement( $element['name'], $element['contents'], isset($element['filename']) ? $element['filename'] : null, isset($element['headers']) ? $element['headers'] : [] ); $stream->addStream(stream_for($this->getHeaders($headers))); $stream->addStream($body); $stream->addStream(stream_for("\r\n")); } /** * @return array */ private function createElement($name, StreamInterface $stream, $filename, array $headers) { // Set a default content-disposition header if one was no provided $disposition = $this->getHeader($headers, 'content-disposition'); if (!$disposition) { $headers['Content-Disposition'] = ($filename === '0' || $filename) ? sprintf('form-data; name="%s"; filename="%s"', $name, basename($filename)) : "form-data; name=\"{$name}\""; } // Set a default content-length header if one was no provided $length = $this->getHeader($headers, 'content-length'); if (!$length) { if ($length = $stream->getSize()) { $headers['Content-Length'] = (string) $length; } } // Set a default Content-Type if one was not supplied $type = $this->getHeader($headers, 'content-type'); if (!$type && ($filename === '0' || $filename)) { if ($type = mimetype_from_filename($filename)) { $headers['Content-Type'] = $type; } } return [$stream, $headers]; } private function getHeader(array $headers, $key) { $lowercaseHeader = strtolower($key); foreach ($headers as $k => $v) { if (strtolower($k) === $lowercaseHeader) { return $v; } } return null; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/NoSeekStream.php ================================================ source = $source; $this->size = isset($options['size']) ? $options['size'] : null; $this->metadata = isset($options['metadata']) ? $options['metadata'] : []; $this->buffer = new BufferStream(); } public function __toString() { try { return copy_to_string($this); } catch (\Exception $e) { return ''; } } public function close() { $this->detach(); } public function detach() { $this->tellPos = false; $this->source = null; } public function getSize() { return $this->size; } public function tell() { return $this->tellPos; } public function eof() { return !$this->source; } public function isSeekable() { return false; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = SEEK_SET) { throw new \RuntimeException('Cannot seek a PumpStream'); } public function isWritable() { return false; } public function write($string) { throw new \RuntimeException('Cannot write to a PumpStream'); } public function isReadable() { return true; } public function read($length) { $data = $this->buffer->read($length); $readLen = strlen($data); $this->tellPos += $readLen; $remaining = $length - $readLen; if ($remaining) { $this->pump($remaining); $data .= $this->buffer->read($remaining); $this->tellPos += strlen($data) - $readLen; } return $data; } public function getContents() { $result = ''; while (!$this->eof()) { $result .= $this->read(1000000); } return $result; } public function getMetadata($key = null) { if (!$key) { return $this->metadata; } return isset($this->metadata[$key]) ? $this->metadata[$key] : null; } private function pump($length) { if ($this->source) { do { $data = call_user_func($this->source, $length); if ($data === false || $data === null) { $this->source = null; return; } $this->buffer->write($data); $length -= strlen($data); } while ($length > 0); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/Request.php ================================================ assertMethod($method); if (!($uri instanceof UriInterface)) { $uri = new Uri($uri); } $this->method = strtoupper($method); $this->uri = $uri; $this->setHeaders($headers); $this->protocol = $version; if (!isset($this->headerNames['host'])) { $this->updateHostFromUri(); } if ($body !== '' && $body !== null) { $this->stream = stream_for($body); } } public function getRequestTarget() { if ($this->requestTarget !== null) { return $this->requestTarget; } $target = $this->uri->getPath(); if ($target == '') { $target = '/'; } if ($this->uri->getQuery() != '') { $target .= '?' . $this->uri->getQuery(); } return $target; } public function withRequestTarget($requestTarget) { if (preg_match('#\s#', $requestTarget)) { throw new InvalidArgumentException( 'Invalid request target provided; cannot contain whitespace' ); } $new = clone $this; $new->requestTarget = $requestTarget; return $new; } public function getMethod() { return $this->method; } public function withMethod($method) { $this->assertMethod($method); $new = clone $this; $new->method = strtoupper($method); return $new; } public function getUri() { return $this->uri; } public function withUri(UriInterface $uri, $preserveHost = false) { if ($uri === $this->uri) { return $this; } $new = clone $this; $new->uri = $uri; if (!$preserveHost || !isset($this->headerNames['host'])) { $new->updateHostFromUri(); } return $new; } private function updateHostFromUri() { $host = $this->uri->getHost(); if ($host == '') { return; } if (($port = $this->uri->getPort()) !== null) { $host .= ':' . $port; } if (isset($this->headerNames['host'])) { $header = $this->headerNames['host']; } else { $header = 'Host'; $this->headerNames['host'] = 'Host'; } // Ensure Host is the first header. // See: http://tools.ietf.org/html/rfc7230#section-5.4 $this->headers = [$header => [$host]] + $this->headers; } private function assertMethod($method) { if (!is_string($method) || $method === '') { throw new \InvalidArgumentException('Method must be a non-empty string.'); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/Response.php ================================================ 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 511 => 'Network Authentication Required', ]; /** @var string */ private $reasonPhrase = ''; /** @var int */ private $statusCode = 200; /** * @param int $status Status code * @param array $headers Response headers * @param string|null|resource|StreamInterface $body Response body * @param string $version Protocol version * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) */ public function __construct( $status = 200, array $headers = [], $body = null, $version = '1.1', $reason = null ) { $this->assertStatusCodeIsInteger($status); $status = (int) $status; $this->assertStatusCodeRange($status); $this->statusCode = $status; if ($body !== '' && $body !== null) { $this->stream = stream_for($body); } $this->setHeaders($headers); if ($reason == '' && isset(self::$phrases[$this->statusCode])) { $this->reasonPhrase = self::$phrases[$this->statusCode]; } else { $this->reasonPhrase = (string) $reason; } $this->protocol = $version; } public function getStatusCode() { return $this->statusCode; } public function getReasonPhrase() { return $this->reasonPhrase; } public function withStatus($code, $reasonPhrase = '') { $this->assertStatusCodeIsInteger($code); $code = (int) $code; $this->assertStatusCodeRange($code); $new = clone $this; $new->statusCode = $code; if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) { $reasonPhrase = self::$phrases[$new->statusCode]; } $new->reasonPhrase = $reasonPhrase; return $new; } private function assertStatusCodeIsInteger($statusCode) { if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) { throw new \InvalidArgumentException('Status code must be an integer value.'); } } private function assertStatusCodeRange($statusCode) { if ($statusCode < 100 || $statusCode >= 600) { throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.'); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/Rfc7230.php ================================================ @,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m"; const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/ServerRequest.php ================================================ serverParams = $serverParams; parent::__construct($method, $uri, $headers, $body, $version); } /** * Return an UploadedFile instance array. * * @param array $files A array which respect $_FILES structure * @throws InvalidArgumentException for unrecognized values * @return array */ public static function normalizeFiles(array $files) { $normalized = []; foreach ($files as $key => $value) { if ($value instanceof UploadedFileInterface) { $normalized[$key] = $value; } elseif (is_array($value) && isset($value['tmp_name'])) { $normalized[$key] = self::createUploadedFileFromSpec($value); } elseif (is_array($value)) { $normalized[$key] = self::normalizeFiles($value); continue; } else { throw new InvalidArgumentException('Invalid value in files specification'); } } return $normalized; } /** * Create and return an UploadedFile instance from a $_FILES specification. * * If the specification represents an array of values, this method will * delegate to normalizeNestedFileSpec() and return that return value. * * @param array $value $_FILES struct * @return array|UploadedFileInterface */ private static function createUploadedFileFromSpec(array $value) { if (is_array($value['tmp_name'])) { return self::normalizeNestedFileSpec($value); } return new UploadedFile( $value['tmp_name'], (int) $value['size'], (int) $value['error'], $value['name'], $value['type'] ); } /** * Normalize an array of file specifications. * * Loops through all nested files and returns a normalized array of * UploadedFileInterface instances. * * @param array $files * @return UploadedFileInterface[] */ private static function normalizeNestedFileSpec(array $files = []) { $normalizedFiles = []; foreach (array_keys($files['tmp_name']) as $key) { $spec = [ 'tmp_name' => $files['tmp_name'][$key], 'size' => $files['size'][$key], 'error' => $files['error'][$key], 'name' => $files['name'][$key], 'type' => $files['type'][$key], ]; $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); } return $normalizedFiles; } /** * Return a ServerRequest populated with superglobals: * $_GET * $_POST * $_COOKIE * $_FILES * $_SERVER * * @return ServerRequestInterface */ public static function fromGlobals() { $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; $headers = getallheaders(); $uri = self::getUriFromGlobals(); $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); return $serverRequest ->withCookieParams($_COOKIE) ->withQueryParams($_GET) ->withParsedBody($_POST) ->withUploadedFiles(self::normalizeFiles($_FILES)); } private static function extractHostAndPortFromAuthority($authority) { $uri = 'http://'.$authority; $parts = parse_url($uri); if (false === $parts) { return [null, null]; } $host = isset($parts['host']) ? $parts['host'] : null; $port = isset($parts['port']) ? $parts['port'] : null; return [$host, $port]; } /** * Get a Uri populated with values from $_SERVER. * * @return UriInterface */ public static function getUriFromGlobals() { $uri = new Uri(''); $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); $hasPort = false; if (isset($_SERVER['HTTP_HOST'])) { list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); if ($host !== null) { $uri = $uri->withHost($host); } if ($port !== null) { $hasPort = true; $uri = $uri->withPort($port); } } elseif (isset($_SERVER['SERVER_NAME'])) { $uri = $uri->withHost($_SERVER['SERVER_NAME']); } elseif (isset($_SERVER['SERVER_ADDR'])) { $uri = $uri->withHost($_SERVER['SERVER_ADDR']); } if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { $uri = $uri->withPort($_SERVER['SERVER_PORT']); } $hasQuery = false; if (isset($_SERVER['REQUEST_URI'])) { $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2); $uri = $uri->withPath($requestUriParts[0]); if (isset($requestUriParts[1])) { $hasQuery = true; $uri = $uri->withQuery($requestUriParts[1]); } } if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { $uri = $uri->withQuery($_SERVER['QUERY_STRING']); } return $uri; } /** * {@inheritdoc} */ public function getServerParams() { return $this->serverParams; } /** * {@inheritdoc} */ public function getUploadedFiles() { return $this->uploadedFiles; } /** * {@inheritdoc} */ public function withUploadedFiles(array $uploadedFiles) { $new = clone $this; $new->uploadedFiles = $uploadedFiles; return $new; } /** * {@inheritdoc} */ public function getCookieParams() { return $this->cookieParams; } /** * {@inheritdoc} */ public function withCookieParams(array $cookies) { $new = clone $this; $new->cookieParams = $cookies; return $new; } /** * {@inheritdoc} */ public function getQueryParams() { return $this->queryParams; } /** * {@inheritdoc} */ public function withQueryParams(array $query) { $new = clone $this; $new->queryParams = $query; return $new; } /** * {@inheritdoc} */ public function getParsedBody() { return $this->parsedBody; } /** * {@inheritdoc} */ public function withParsedBody($data) { $new = clone $this; $new->parsedBody = $data; return $new; } /** * {@inheritdoc} */ public function getAttributes() { return $this->attributes; } /** * {@inheritdoc} */ public function getAttribute($attribute, $default = null) { if (false === array_key_exists($attribute, $this->attributes)) { return $default; } return $this->attributes[$attribute]; } /** * {@inheritdoc} */ public function withAttribute($attribute, $value) { $new = clone $this; $new->attributes[$attribute] = $value; return $new; } /** * {@inheritdoc} */ public function withoutAttribute($attribute) { if (false === array_key_exists($attribute, $this->attributes)) { return $this; } $new = clone $this; unset($new->attributes[$attribute]); return $new; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/Stream.php ================================================ size = $options['size']; } $this->customMetadata = isset($options['metadata']) ? $options['metadata'] : []; $this->stream = $stream; $meta = stream_get_meta_data($this->stream); $this->seekable = $meta['seekable']; $this->readable = (bool)preg_match(self::READABLE_MODES, $meta['mode']); $this->writable = (bool)preg_match(self::WRITABLE_MODES, $meta['mode']); $this->uri = $this->getMetadata('uri'); } /** * Closes the stream when the destructed */ public function __destruct() { $this->close(); } public function __toString() { try { $this->seek(0); return (string) stream_get_contents($this->stream); } catch (\Exception $e) { return ''; } } public function getContents() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } $contents = stream_get_contents($this->stream); if ($contents === false) { throw new \RuntimeException('Unable to read stream contents'); } return $contents; } public function close() { if (isset($this->stream)) { if (is_resource($this->stream)) { fclose($this->stream); } $this->detach(); } } public function detach() { if (!isset($this->stream)) { return null; } $result = $this->stream; unset($this->stream); $this->size = $this->uri = null; $this->readable = $this->writable = $this->seekable = false; return $result; } public function getSize() { if ($this->size !== null) { return $this->size; } if (!isset($this->stream)) { return null; } // Clear the stat cache if the stream has a URI if ($this->uri) { clearstatcache(true, $this->uri); } $stats = fstat($this->stream); if (isset($stats['size'])) { $this->size = $stats['size']; return $this->size; } return null; } public function isReadable() { return $this->readable; } public function isWritable() { return $this->writable; } public function isSeekable() { return $this->seekable; } public function eof() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } return feof($this->stream); } public function tell() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } $result = ftell($this->stream); if ($result === false) { throw new \RuntimeException('Unable to determine stream position'); } return $result; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = SEEK_SET) { $whence = (int) $whence; if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->seekable) { throw new \RuntimeException('Stream is not seekable'); } if (fseek($this->stream, $offset, $whence) === -1) { throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . var_export($whence, true)); } } public function read($length) { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->readable) { throw new \RuntimeException('Cannot read from non-readable stream'); } if ($length < 0) { throw new \RuntimeException('Length parameter cannot be negative'); } if (0 === $length) { return ''; } $string = fread($this->stream, $length); if (false === $string) { throw new \RuntimeException('Unable to read from stream'); } return $string; } public function write($string) { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->writable) { throw new \RuntimeException('Cannot write to a non-writable stream'); } // We can't know the size after writing anything $this->size = null; $result = fwrite($this->stream, $string); if ($result === false) { throw new \RuntimeException('Unable to write to stream'); } return $result; } public function getMetadata($key = null) { if (!isset($this->stream)) { return $key ? null : []; } elseif (!$key) { return $this->customMetadata + stream_get_meta_data($this->stream); } elseif (isset($this->customMetadata[$key])) { return $this->customMetadata[$key]; } $meta = stream_get_meta_data($this->stream); return isset($meta[$key]) ? $meta[$key] : null; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php ================================================ stream = $stream; } /** * Magic method used to create a new stream if streams are not added in * the constructor of a decorator (e.g., LazyOpenStream). * * @param string $name Name of the property (allows "stream" only). * * @return StreamInterface */ public function __get($name) { if ($name == 'stream') { $this->stream = $this->createStream(); return $this->stream; } throw new \UnexpectedValueException("$name not found on class"); } public function __toString() { try { if ($this->isSeekable()) { $this->seek(0); } return $this->getContents(); } catch (\Exception $e) { // Really, PHP? https://bugs.php.net/bug.php?id=53648 trigger_error('StreamDecorator::__toString exception: ' . (string) $e, E_USER_ERROR); return ''; } } public function getContents() { return copy_to_string($this); } /** * Allow decorators to implement custom methods * * @param string $method Missing method name * @param array $args Method arguments * * @return mixed */ public function __call($method, array $args) { $result = call_user_func_array([$this->stream, $method], $args); // Always return the wrapped object if the result is a return $this return $result === $this->stream ? $this : $result; } public function close() { $this->stream->close(); } public function getMetadata($key = null) { return $this->stream->getMetadata($key); } public function detach() { return $this->stream->detach(); } public function getSize() { return $this->stream->getSize(); } public function eof() { return $this->stream->eof(); } public function tell() { return $this->stream->tell(); } public function isReadable() { return $this->stream->isReadable(); } public function isWritable() { return $this->stream->isWritable(); } public function isSeekable() { return $this->stream->isSeekable(); } public function rewind() { $this->seek(0); } public function seek($offset, $whence = SEEK_SET) { $this->stream->seek($offset, $whence); } public function read($length) { return $this->stream->read($length); } public function write($string) { return $this->stream->write($string); } /** * Implement in subclasses to dynamically create streams when requested. * * @return StreamInterface * @throws \BadMethodCallException */ protected function createStream() { throw new \BadMethodCallException('Not implemented'); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/StreamWrapper.php ================================================ isReadable()) { $mode = $stream->isWritable() ? 'r+' : 'r'; } elseif ($stream->isWritable()) { $mode = 'w'; } else { throw new \InvalidArgumentException('The stream must be readable, ' . 'writable, or both.'); } return fopen('guzzle://stream', $mode, null, self::createStreamContext($stream)); } /** * Creates a stream context that can be used to open a stream as a php stream resource. * * @param StreamInterface $stream * * @return resource */ public static function createStreamContext(StreamInterface $stream) { return stream_context_create([ 'guzzle' => ['stream' => $stream] ]); } /** * Registers the stream wrapper if needed */ public static function register() { if (!in_array('guzzle', stream_get_wrappers())) { stream_wrapper_register('guzzle', __CLASS__); } } public function stream_open($path, $mode, $options, &$opened_path) { $options = stream_context_get_options($this->context); if (!isset($options['guzzle']['stream'])) { return false; } $this->mode = $mode; $this->stream = $options['guzzle']['stream']; return true; } public function stream_read($count) { return $this->stream->read($count); } public function stream_write($data) { return (int) $this->stream->write($data); } public function stream_tell() { return $this->stream->tell(); } public function stream_eof() { return $this->stream->eof(); } public function stream_seek($offset, $whence) { $this->stream->seek($offset, $whence); return true; } public function stream_cast($cast_as) { $stream = clone($this->stream); return $stream->detach(); } public function stream_stat() { static $modeMap = [ 'r' => 33060, 'rb' => 33060, 'r+' => 33206, 'w' => 33188, 'wb' => 33188 ]; return [ 'dev' => 0, 'ino' => 0, 'mode' => $modeMap[$this->mode], 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => $this->stream->getSize() ?: 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0 ]; } public function url_stat($path, $flags) { return [ 'dev' => 0, 'ino' => 0, 'mode' => 0, 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0 ]; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/UploadedFile.php ================================================ setError($errorStatus); $this->setSize($size); $this->setClientFilename($clientFilename); $this->setClientMediaType($clientMediaType); if ($this->isOk()) { $this->setStreamOrFile($streamOrFile); } } /** * Depending on the value set file or stream variable * * @param mixed $streamOrFile * @throws InvalidArgumentException */ private function setStreamOrFile($streamOrFile) { if (is_string($streamOrFile)) { $this->file = $streamOrFile; } elseif (is_resource($streamOrFile)) { $this->stream = new Stream($streamOrFile); } elseif ($streamOrFile instanceof StreamInterface) { $this->stream = $streamOrFile; } else { throw new InvalidArgumentException( 'Invalid stream or file provided for UploadedFile' ); } } /** * @param int $error * @throws InvalidArgumentException */ private function setError($error) { if (false === is_int($error)) { throw new InvalidArgumentException( 'Upload file error status must be an integer' ); } if (false === in_array($error, UploadedFile::$errors)) { throw new InvalidArgumentException( 'Invalid error status for UploadedFile' ); } $this->error = $error; } /** * @param int $size * @throws InvalidArgumentException */ private function setSize($size) { if (false === is_int($size)) { throw new InvalidArgumentException( 'Upload file size must be an integer' ); } $this->size = $size; } /** * @param mixed $param * @return boolean */ private function isStringOrNull($param) { return in_array(gettype($param), ['string', 'NULL']); } /** * @param mixed $param * @return boolean */ private function isStringNotEmpty($param) { return is_string($param) && false === empty($param); } /** * @param string|null $clientFilename * @throws InvalidArgumentException */ private function setClientFilename($clientFilename) { if (false === $this->isStringOrNull($clientFilename)) { throw new InvalidArgumentException( 'Upload file client filename must be a string or null' ); } $this->clientFilename = $clientFilename; } /** * @param string|null $clientMediaType * @throws InvalidArgumentException */ private function setClientMediaType($clientMediaType) { if (false === $this->isStringOrNull($clientMediaType)) { throw new InvalidArgumentException( 'Upload file client media type must be a string or null' ); } $this->clientMediaType = $clientMediaType; } /** * Return true if there is no upload error * * @return boolean */ private function isOk() { return $this->error === UPLOAD_ERR_OK; } /** * @return boolean */ public function isMoved() { return $this->moved; } /** * @throws RuntimeException if is moved or not ok */ private function validateActive() { if (false === $this->isOk()) { throw new RuntimeException('Cannot retrieve stream due to upload error'); } if ($this->isMoved()) { throw new RuntimeException('Cannot retrieve stream after it has already been moved'); } } /** * {@inheritdoc} * @throws RuntimeException if the upload was not successful. */ public function getStream() { $this->validateActive(); if ($this->stream instanceof StreamInterface) { return $this->stream; } return new LazyOpenStream($this->file, 'r+'); } /** * {@inheritdoc} * * @see http://php.net/is_uploaded_file * @see http://php.net/move_uploaded_file * @param string $targetPath Path to which to move the uploaded file. * @throws RuntimeException if the upload was not successful. * @throws InvalidArgumentException if the $path specified is invalid. * @throws RuntimeException on any error during the move operation, or on * the second or subsequent call to the method. */ public function moveTo($targetPath) { $this->validateActive(); if (false === $this->isStringNotEmpty($targetPath)) { throw new InvalidArgumentException( 'Invalid path provided for move operation; must be a non-empty string' ); } if ($this->file) { $this->moved = php_sapi_name() == 'cli' ? rename($this->file, $targetPath) : move_uploaded_file($this->file, $targetPath); } else { copy_to_stream( $this->getStream(), new LazyOpenStream($targetPath, 'w') ); $this->moved = true; } if (false === $this->moved) { throw new RuntimeException( sprintf('Uploaded file could not be moved to %s', $targetPath) ); } } /** * {@inheritdoc} * * @return int|null The file size in bytes or null if unknown. */ public function getSize() { return $this->size; } /** * {@inheritdoc} * * @see http://php.net/manual/en/features.file-upload.errors.php * @return int One of PHP's UPLOAD_ERR_XXX constants. */ public function getError() { return $this->error; } /** * {@inheritdoc} * * @return string|null The filename sent by the client or null if none * was provided. */ public function getClientFilename() { return $this->clientFilename; } /** * {@inheritdoc} */ public function getClientMediaType() { return $this->clientMediaType; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/Uri.php ================================================ 80, 'https' => 443, 'ftp' => 21, 'gopher' => 70, 'nntp' => 119, 'news' => 119, 'telnet' => 23, 'tn3270' => 23, 'imap' => 143, 'pop' => 110, 'ldap' => 389, ]; private static $charUnreserved = 'a-zA-Z0-9_\-\.~'; private static $charSubDelims = '!\$&\'\(\)\*\+,;='; private static $replaceQuery = ['=' => '%3D', '&' => '%26']; /** @var string Uri scheme. */ private $scheme = ''; /** @var string Uri user info. */ private $userInfo = ''; /** @var string Uri host. */ private $host = ''; /** @var int|null Uri port. */ private $port; /** @var string Uri path. */ private $path = ''; /** @var string Uri query string. */ private $query = ''; /** @var string Uri fragment. */ private $fragment = ''; /** * @param string $uri URI to parse */ public function __construct($uri = '') { // weak type check to also accept null until we can add scalar type hints if ($uri != '') { $parts = parse_url($uri); if ($parts === false) { throw new \InvalidArgumentException("Unable to parse URI: $uri"); } $this->applyParts($parts); } } public function __toString() { return self::composeComponents( $this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment ); } /** * Composes a URI reference string from its various components. * * Usually this method does not need to be called manually but instead is used indirectly via * `Psr\Http\Message\UriInterface::__toString`. * * PSR-7 UriInterface treats an empty component the same as a missing component as * getQuery(), getFragment() etc. always return a string. This explains the slight * difference to RFC 3986 Section 5.3. * * Another adjustment is that the authority separator is added even when the authority is missing/empty * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to * that format). * * @param string $scheme * @param string $authority * @param string $path * @param string $query * @param string $fragment * * @return string * * @link https://tools.ietf.org/html/rfc3986#section-5.3 */ public static function composeComponents($scheme, $authority, $path, $query, $fragment) { $uri = ''; // weak type checks to also accept null until we can add scalar type hints if ($scheme != '') { $uri .= $scheme . ':'; } if ($authority != ''|| $scheme === 'file') { $uri .= '//' . $authority; } $uri .= $path; if ($query != '') { $uri .= '?' . $query; } if ($fragment != '') { $uri .= '#' . $fragment; } return $uri; } /** * Whether the URI has the default port of the current scheme. * * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used * independently of the implementation. * * @param UriInterface $uri * * @return bool */ public static function isDefaultPort(UriInterface $uri) { return $uri->getPort() === null || (isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]); } /** * Whether the URI is absolute, i.e. it has a scheme. * * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative * to another URI, the base URI. Relative references can be divided into several forms: * - network-path references, e.g. '//example.com/path' * - absolute-path references, e.g. '/path' * - relative-path references, e.g. 'subpath' * * @param UriInterface $uri * * @return bool * @see Uri::isNetworkPathReference * @see Uri::isAbsolutePathReference * @see Uri::isRelativePathReference * @link https://tools.ietf.org/html/rfc3986#section-4 */ public static function isAbsolute(UriInterface $uri) { return $uri->getScheme() !== ''; } /** * Whether the URI is a network-path reference. * * A relative reference that begins with two slash characters is termed an network-path reference. * * @param UriInterface $uri * * @return bool * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isNetworkPathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() !== ''; } /** * Whether the URI is a absolute-path reference. * * A relative reference that begins with a single slash character is termed an absolute-path reference. * * @param UriInterface $uri * * @return bool * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isAbsolutePathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() === '' && isset($uri->getPath()[0]) && $uri->getPath()[0] === '/'; } /** * Whether the URI is a relative-path reference. * * A relative reference that does not begin with a slash character is termed a relative-path reference. * * @param UriInterface $uri * * @return bool * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isRelativePathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() === '' && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/'); } /** * Whether the URI is a same-document reference. * * A same-document reference refers to a URI that is, aside from its fragment * component, identical to the base URI. When no base URI is given, only an empty * URI reference (apart from its fragment) is considered a same-document reference. * * @param UriInterface $uri The URI to check * @param UriInterface|null $base An optional base URI to compare against * * @return bool * @link https://tools.ietf.org/html/rfc3986#section-4.4 */ public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null) { if ($base !== null) { $uri = UriResolver::resolve($base, $uri); return ($uri->getScheme() === $base->getScheme()) && ($uri->getAuthority() === $base->getAuthority()) && ($uri->getPath() === $base->getPath()) && ($uri->getQuery() === $base->getQuery()); } return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === ''; } /** * Removes dot segments from a path and returns the new path. * * @param string $path * * @return string * * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead. * @see UriResolver::removeDotSegments */ public static function removeDotSegments($path) { return UriResolver::removeDotSegments($path); } /** * Converts the relative URI into a new URI that is resolved against the base URI. * * @param UriInterface $base Base URI * @param string|UriInterface $rel Relative URI * * @return UriInterface * * @deprecated since version 1.4. Use UriResolver::resolve instead. * @see UriResolver::resolve */ public static function resolve(UriInterface $base, $rel) { if (!($rel instanceof UriInterface)) { $rel = new self($rel); } return UriResolver::resolve($base, $rel); } /** * Creates a new URI with a specific query string value removed. * * Any existing query string values that exactly match the provided key are * removed. * * @param UriInterface $uri URI to use as a base. * @param string $key Query string key to remove. * * @return UriInterface */ public static function withoutQueryValue(UriInterface $uri, $key) { $result = self::getFilteredQueryString($uri, [$key]); return $uri->withQuery(implode('&', $result)); } /** * Creates a new URI with a specific query string value. * * Any existing query string values that exactly match the provided key are * removed and replaced with the given key value pair. * * A value of null will set the query string key without a value, e.g. "key" * instead of "key=value". * * @param UriInterface $uri URI to use as a base. * @param string $key Key to set. * @param string|null $value Value to set * * @return UriInterface */ public static function withQueryValue(UriInterface $uri, $key, $value) { $result = self::getFilteredQueryString($uri, [$key]); $result[] = self::generateQueryString($key, $value); return $uri->withQuery(implode('&', $result)); } /** * Creates a new URI with multiple specific query string values. * * It has the same behavior as withQueryValue() but for an associative array of key => value. * * @param UriInterface $uri URI to use as a base. * @param array $keyValueArray Associative array of key and values * * @return UriInterface */ public static function withQueryValues(UriInterface $uri, array $keyValueArray) { $result = self::getFilteredQueryString($uri, array_keys($keyValueArray)); foreach ($keyValueArray as $key => $value) { $result[] = self::generateQueryString($key, $value); } return $uri->withQuery(implode('&', $result)); } /** * Creates a URI from a hash of `parse_url` components. * * @param array $parts * * @return UriInterface * @link http://php.net/manual/en/function.parse-url.php * * @throws \InvalidArgumentException If the components do not form a valid URI. */ public static function fromParts(array $parts) { $uri = new self(); $uri->applyParts($parts); $uri->validateState(); return $uri; } public function getScheme() { return $this->scheme; } public function getAuthority() { $authority = $this->host; if ($this->userInfo !== '') { $authority = $this->userInfo . '@' . $authority; } if ($this->port !== null) { $authority .= ':' . $this->port; } return $authority; } public function getUserInfo() { return $this->userInfo; } public function getHost() { return $this->host; } public function getPort() { return $this->port; } public function getPath() { return $this->path; } public function getQuery() { return $this->query; } public function getFragment() { return $this->fragment; } public function withScheme($scheme) { $scheme = $this->filterScheme($scheme); if ($this->scheme === $scheme) { return $this; } $new = clone $this; $new->scheme = $scheme; $new->removeDefaultPort(); $new->validateState(); return $new; } public function withUserInfo($user, $password = null) { $info = $this->filterUserInfoComponent($user); if ($password !== null) { $info .= ':' . $this->filterUserInfoComponent($password); } if ($this->userInfo === $info) { return $this; } $new = clone $this; $new->userInfo = $info; $new->validateState(); return $new; } public function withHost($host) { $host = $this->filterHost($host); if ($this->host === $host) { return $this; } $new = clone $this; $new->host = $host; $new->validateState(); return $new; } public function withPort($port) { $port = $this->filterPort($port); if ($this->port === $port) { return $this; } $new = clone $this; $new->port = $port; $new->removeDefaultPort(); $new->validateState(); return $new; } public function withPath($path) { $path = $this->filterPath($path); if ($this->path === $path) { return $this; } $new = clone $this; $new->path = $path; $new->validateState(); return $new; } public function withQuery($query) { $query = $this->filterQueryAndFragment($query); if ($this->query === $query) { return $this; } $new = clone $this; $new->query = $query; return $new; } public function withFragment($fragment) { $fragment = $this->filterQueryAndFragment($fragment); if ($this->fragment === $fragment) { return $this; } $new = clone $this; $new->fragment = $fragment; return $new; } /** * Apply parse_url parts to a URI. * * @param array $parts Array of parse_url parts to apply. */ private function applyParts(array $parts) { $this->scheme = isset($parts['scheme']) ? $this->filterScheme($parts['scheme']) : ''; $this->userInfo = isset($parts['user']) ? $this->filterUserInfoComponent($parts['user']) : ''; $this->host = isset($parts['host']) ? $this->filterHost($parts['host']) : ''; $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null; $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : ''; $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : ''; if (isset($parts['pass'])) { $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']); } $this->removeDefaultPort(); } /** * @param string $scheme * * @return string * * @throws \InvalidArgumentException If the scheme is invalid. */ private function filterScheme($scheme) { if (!is_string($scheme)) { throw new \InvalidArgumentException('Scheme must be a string'); } return strtolower($scheme); } /** * @param string $component * * @return string * * @throws \InvalidArgumentException If the user info is invalid. */ private function filterUserInfoComponent($component) { if (!is_string($component)) { throw new \InvalidArgumentException('User info must be a string'); } return preg_replace_callback( '/(?:[^%' . self::$charUnreserved . self::$charSubDelims . ']+|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $component ); } /** * @param string $host * * @return string * * @throws \InvalidArgumentException If the host is invalid. */ private function filterHost($host) { if (!is_string($host)) { throw new \InvalidArgumentException('Host must be a string'); } return strtolower($host); } /** * @param int|null $port * * @return int|null * * @throws \InvalidArgumentException If the port is invalid. */ private function filterPort($port) { if ($port === null) { return null; } $port = (int) $port; if (0 > $port || 0xffff < $port) { throw new \InvalidArgumentException( sprintf('Invalid port: %d. Must be between 0 and 65535', $port) ); } return $port; } /** * @param UriInterface $uri * @param array $keys * * @return array */ private static function getFilteredQueryString(UriInterface $uri, array $keys) { $current = $uri->getQuery(); if ($current === '') { return []; } $decodedKeys = array_map('rawurldecode', $keys); return array_filter(explode('&', $current), function ($part) use ($decodedKeys) { return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true); }); } /** * @param string $key * @param string|null $value * * @return string */ private static function generateQueryString($key, $value) { // Query string separators ("=", "&") within the key or value need to be encoded // (while preventing double-encoding) before setting the query string. All other // chars that need percent-encoding will be encoded by withQuery(). $queryString = strtr($key, self::$replaceQuery); if ($value !== null) { $queryString .= '=' . strtr($value, self::$replaceQuery); } return $queryString; } private function removeDefaultPort() { if ($this->port !== null && self::isDefaultPort($this)) { $this->port = null; } } /** * Filters the path of a URI * * @param string $path * * @return string * * @throws \InvalidArgumentException If the path is invalid. */ private function filterPath($path) { if (!is_string($path)) { throw new \InvalidArgumentException('Path must be a string'); } return preg_replace_callback( '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $path ); } /** * Filters the query string or fragment of a URI. * * @param string $str * * @return string * * @throws \InvalidArgumentException If the query or fragment is invalid. */ private function filterQueryAndFragment($str) { if (!is_string($str)) { throw new \InvalidArgumentException('Query and fragment must be a string'); } return preg_replace_callback( '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $str ); } private function rawurlencodeMatchZero(array $match) { return rawurlencode($match[0]); } private function validateState() { if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) { $this->host = self::HTTP_DEFAULT_HOST; } if ($this->getAuthority() === '') { if (0 === strpos($this->path, '//')) { throw new \InvalidArgumentException('The path of a URI without an authority must not start with two slashes "//"'); } if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) { throw new \InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon'); } } elseif (isset($this->path[0]) && $this->path[0] !== '/') { @trigger_error( 'The path of a URI with an authority must start with a slash "/" or be empty. Automagically fixing the URI ' . 'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.', E_USER_DEPRECATED ); $this->path = '/'. $this->path; //throw new \InvalidArgumentException('The path of a URI with an authority must start with a slash "/" or be empty'); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/UriNormalizer.php ================================================ getPath() === '' && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https') ) { $uri = $uri->withPath('/'); } if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { $uri = $uri->withHost(''); } if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { $uri = $uri->withPort(null); } if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); } if ($flags & self::REMOVE_DUPLICATE_SLASHES) { $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath())); } if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { $queryKeyValues = explode('&', $uri->getQuery()); sort($queryKeyValues); $uri = $uri->withQuery(implode('&', $queryKeyValues)); } return $uri; } /** * Whether two URIs can be considered equivalent. * * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be * resolved against the same base URI. If this is not the case, determination of equivalence or difference of * relative references does not mean anything. * * @param UriInterface $uri1 An URI to compare * @param UriInterface $uri2 An URI to compare * @param int $normalizations A bitmask of normalizations to apply, see constants * * @return bool * @link https://tools.ietf.org/html/rfc3986#section-6.1 */ public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS) { return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); } private static function capitalizePercentEncoding(UriInterface $uri) { $regex = '/(?:%[A-Fa-f0-9]{2})++/'; $callback = function (array $match) { return strtoupper($match[0]); }; return $uri->withPath( preg_replace_callback($regex, $callback, $uri->getPath()) )->withQuery( preg_replace_callback($regex, $callback, $uri->getQuery()) ); } private static function decodeUnreservedCharacters(UriInterface $uri) { $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; $callback = function (array $match) { return rawurldecode($match[0]); }; return $uri->withPath( preg_replace_callback($regex, $callback, $uri->getPath()) )->withQuery( preg_replace_callback($regex, $callback, $uri->getQuery()) ); } private function __construct() { // cannot be instantiated } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/UriResolver.php ================================================ getScheme() != '') { return $rel->withPath(self::removeDotSegments($rel->getPath())); } if ($rel->getAuthority() != '') { $targetAuthority = $rel->getAuthority(); $targetPath = self::removeDotSegments($rel->getPath()); $targetQuery = $rel->getQuery(); } else { $targetAuthority = $base->getAuthority(); if ($rel->getPath() === '') { $targetPath = $base->getPath(); $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); } else { if ($rel->getPath()[0] === '/') { $targetPath = $rel->getPath(); } else { if ($targetAuthority != '' && $base->getPath() === '') { $targetPath = '/' . $rel->getPath(); } else { $lastSlashPos = strrpos($base->getPath(), '/'); if ($lastSlashPos === false) { $targetPath = $rel->getPath(); } else { $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); } } } $targetPath = self::removeDotSegments($targetPath); $targetQuery = $rel->getQuery(); } } return new Uri(Uri::composeComponents( $base->getScheme(), $targetAuthority, $targetPath, $targetQuery, $rel->getFragment() )); } /** * Returns the target URI as a relative reference from the base URI. * * This method is the counterpart to resolve(): * * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) * * One use-case is to use the current request URI as base URI and then generate relative links in your documents * to reduce the document size or offer self-contained downloadable document archives. * * $base = new Uri('http://example.com/a/b/'); * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. * * This method also accepts a target that is already relative and will try to relativize it further. Only a * relative-path reference will be returned as-is. * * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well * * @param UriInterface $base Base URI * @param UriInterface $target Target URI * * @return UriInterface The relative URI reference */ public static function relativize(UriInterface $base, UriInterface $target) { if ($target->getScheme() !== '' && ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '') ) { return $target; } if (Uri::isRelativePathReference($target)) { // As the target is already highly relative we return it as-is. It would be possible to resolve // the target with `$target = self::resolve($base, $target);` and then try make it more relative // by removing a duplicate query. But let's not do that automatically. return $target; } if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { return $target->withScheme(''); } // We must remove the path before removing the authority because if the path starts with two slashes, the URI // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also // invalid. $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); if ($base->getPath() !== $target->getPath()) { return $emptyPathUri->withPath(self::getRelativePath($base, $target)); } if ($base->getQuery() === $target->getQuery()) { // Only the target fragment is left. And it must be returned even if base and target fragment are the same. return $emptyPathUri->withQuery(''); } // If the base URI has a query but the target has none, we cannot return an empty path reference as it would // inherit the base query component when resolving. if ($target->getQuery() === '') { $segments = explode('/', $target->getPath()); $lastSegment = end($segments); return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); } return $emptyPathUri; } private static function getRelativePath(UriInterface $base, UriInterface $target) { $sourceSegments = explode('/', $base->getPath()); $targetSegments = explode('/', $target->getPath()); array_pop($sourceSegments); $targetLastSegment = array_pop($targetSegments); foreach ($sourceSegments as $i => $segment) { if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { unset($sourceSegments[$i], $targetSegments[$i]); } else { break; } } $targetSegments[] = $targetLastSegment; $relativePath = str_repeat('../', count($sourceSegments)) . implode('/', $targetSegments); // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) { $relativePath = "./$relativePath"; } elseif ('/' === $relativePath[0]) { if ($base->getAuthority() != '' && $base->getPath() === '') { // In this case an extra slash is added by resolve() automatically. So we must not add one here. $relativePath = ".$relativePath"; } else { $relativePath = "./$relativePath"; } } return $relativePath; } private function __construct() { // cannot be instantiated } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/functions.php ================================================ getMethod() . ' ' . $message->getRequestTarget()) . ' HTTP/' . $message->getProtocolVersion(); if (!$message->hasHeader('host')) { $msg .= "\r\nHost: " . $message->getUri()->getHost(); } } elseif ($message instanceof ResponseInterface) { $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' . $message->getStatusCode() . ' ' . $message->getReasonPhrase(); } else { throw new \InvalidArgumentException('Unknown message type'); } foreach ($message->getHeaders() as $name => $values) { $msg .= "\r\n{$name}: " . implode(', ', $values); } return "{$msg}\r\n\r\n" . $message->getBody(); } /** * Returns a UriInterface for the given value. * * This function accepts a string or {@see Psr\Http\Message\UriInterface} and * returns a UriInterface for the given value. If the value is already a * `UriInterface`, it is returned as-is. * * @param string|UriInterface $uri * * @return UriInterface * @throws \InvalidArgumentException */ function uri_for($uri) { if ($uri instanceof UriInterface) { return $uri; } elseif (is_string($uri)) { return new Uri($uri); } throw new \InvalidArgumentException('URI must be a string or UriInterface'); } /** * Create a new stream based on the input type. * * Options is an associative array that can contain the following keys: * - metadata: Array of custom metadata. * - size: Size of the stream. * * @param resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource Entity body data * @param array $options Additional options * * @return StreamInterface * @throws \InvalidArgumentException if the $resource arg is not valid. */ function stream_for($resource = '', array $options = []) { if (is_scalar($resource)) { $stream = fopen('php://temp', 'r+'); if ($resource !== '') { fwrite($stream, $resource); fseek($stream, 0); } return new Stream($stream, $options); } switch (gettype($resource)) { case 'resource': return new Stream($resource, $options); case 'object': if ($resource instanceof StreamInterface) { return $resource; } elseif ($resource instanceof \Iterator) { return new PumpStream(function () use ($resource) { if (!$resource->valid()) { return false; } $result = $resource->current(); $resource->next(); return $result; }, $options); } elseif (method_exists($resource, '__toString')) { return stream_for((string) $resource, $options); } break; case 'NULL': return new Stream(fopen('php://temp', 'r+'), $options); } if (is_callable($resource)) { return new PumpStream($resource, $options); } throw new \InvalidArgumentException('Invalid resource type: ' . gettype($resource)); } /** * Parse an array of header values containing ";" separated data into an * array of associative arrays representing the header key value pair * data of the header. When a parameter does not contain a value, but just * contains a key, this function will inject a key with a '' string value. * * @param string|array $header Header to parse into components. * * @return array Returns the parsed header values. */ function parse_header($header) { static $trimmed = "\"' \n\t\r"; $params = $matches = []; foreach (normalize_header($header) as $val) { $part = []; foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { $m = $matches[0]; if (isset($m[1])) { $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); } else { $part[] = trim($m[0], $trimmed); } } } if ($part) { $params[] = $part; } } return $params; } /** * Converts an array of header values that may contain comma separated * headers into an array of headers with no comma separated values. * * @param string|array $header Header to normalize. * * @return array Returns the normalized header field values. */ function normalize_header($header) { if (!is_array($header)) { return array_map('trim', explode(',', $header)); } $result = []; foreach ($header as $value) { foreach ((array) $value as $v) { if (strpos($v, ',') === false) { $result[] = $v; continue; } foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) { $result[] = trim($vv); } } } return $result; } /** * Clone and modify a request with the given changes. * * The changes can be one of: * - method: (string) Changes the HTTP method. * - set_headers: (array) Sets the given headers. * - remove_headers: (array) Remove the given headers. * - body: (mixed) Sets the given body. * - uri: (UriInterface) Set the URI. * - query: (string) Set the query string value of the URI. * - version: (string) Set the protocol version. * * @param RequestInterface $request Request to clone and modify. * @param array $changes Changes to apply. * * @return RequestInterface */ function modify_request(RequestInterface $request, array $changes) { if (!$changes) { return $request; } $headers = $request->getHeaders(); if (!isset($changes['uri'])) { $uri = $request->getUri(); } else { // Remove the host header if one is on the URI if ($host = $changes['uri']->getHost()) { $changes['set_headers']['Host'] = $host; if ($port = $changes['uri']->getPort()) { $standardPorts = ['http' => 80, 'https' => 443]; $scheme = $changes['uri']->getScheme(); if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { $changes['set_headers']['Host'] .= ':'.$port; } } } $uri = $changes['uri']; } if (!empty($changes['remove_headers'])) { $headers = _caseless_remove($changes['remove_headers'], $headers); } if (!empty($changes['set_headers'])) { $headers = _caseless_remove(array_keys($changes['set_headers']), $headers); $headers = $changes['set_headers'] + $headers; } if (isset($changes['query'])) { $uri = $uri->withQuery($changes['query']); } if ($request instanceof ServerRequestInterface) { return (new ServerRequest( isset($changes['method']) ? $changes['method'] : $request->getMethod(), $uri, $headers, isset($changes['body']) ? $changes['body'] : $request->getBody(), isset($changes['version']) ? $changes['version'] : $request->getProtocolVersion(), $request->getServerParams() )) ->withParsedBody($request->getParsedBody()) ->withQueryParams($request->getQueryParams()) ->withCookieParams($request->getCookieParams()) ->withUploadedFiles($request->getUploadedFiles()); } return new Request( isset($changes['method']) ? $changes['method'] : $request->getMethod(), $uri, $headers, isset($changes['body']) ? $changes['body'] : $request->getBody(), isset($changes['version']) ? $changes['version'] : $request->getProtocolVersion() ); } /** * Attempts to rewind a message body and throws an exception on failure. * * The body of the message will only be rewound if a call to `tell()` returns a * value other than `0`. * * @param MessageInterface $message Message to rewind * * @throws \RuntimeException */ function rewind_body(MessageInterface $message) { $body = $message->getBody(); if ($body->tell()) { $body->rewind(); } } /** * Safely opens a PHP stream resource using a filename. * * When fopen fails, PHP normally raises a warning. This function adds an * error handler that checks for errors and throws an exception instead. * * @param string $filename File to open * @param string $mode Mode used to open the file * * @return resource * @throws \RuntimeException if the file cannot be opened */ function try_fopen($filename, $mode) { $ex = null; set_error_handler(function () use ($filename, $mode, &$ex) { $ex = new \RuntimeException(sprintf( 'Unable to open %s using mode %s: %s', $filename, $mode, func_get_args()[1] )); }); $handle = fopen($filename, $mode); restore_error_handler(); if ($ex) { /** @var $ex \RuntimeException */ throw $ex; } return $handle; } /** * Copy the contents of a stream into a string until the given number of * bytes have been read. * * @param StreamInterface $stream Stream to read * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * @return string * @throws \RuntimeException on error. */ function copy_to_string(StreamInterface $stream, $maxLen = -1) { $buffer = ''; if ($maxLen === -1) { while (!$stream->eof()) { $buf = $stream->read(1048576); // Using a loose equality here to match on '' and false. if ($buf == null) { break; } $buffer .= $buf; } return $buffer; } $len = 0; while (!$stream->eof() && $len < $maxLen) { $buf = $stream->read($maxLen - $len); // Using a loose equality here to match on '' and false. if ($buf == null) { break; } $buffer .= $buf; $len = strlen($buffer); } return $buffer; } /** * Copy the contents of a stream into another stream until the given number * of bytes have been read. * * @param StreamInterface $source Stream to read from * @param StreamInterface $dest Stream to write to * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @throws \RuntimeException on error. */ function copy_to_stream( StreamInterface $source, StreamInterface $dest, $maxLen = -1 ) { $bufferSize = 8192; if ($maxLen === -1) { while (!$source->eof()) { if (!$dest->write($source->read($bufferSize))) { break; } } } else { $remaining = $maxLen; while ($remaining > 0 && !$source->eof()) { $buf = $source->read(min($bufferSize, $remaining)); $len = strlen($buf); if (!$len) { break; } $remaining -= $len; $dest->write($buf); } } } /** * Calculate a hash of a Stream * * @param StreamInterface $stream Stream to calculate the hash for * @param string $algo Hash algorithm (e.g. md5, crc32, etc) * @param bool $rawOutput Whether or not to use raw output * * @return string Returns the hash of the stream * @throws \RuntimeException on error. */ function hash( StreamInterface $stream, $algo, $rawOutput = false ) { $pos = $stream->tell(); if ($pos > 0) { $stream->rewind(); } $ctx = hash_init($algo); while (!$stream->eof()) { hash_update($ctx, $stream->read(1048576)); } $out = hash_final($ctx, (bool) $rawOutput); $stream->seek($pos); return $out; } /** * Read a line from the stream up to the maximum allowed buffer length * * @param StreamInterface $stream Stream to read from * @param int $maxLength Maximum buffer length * * @return string */ function readline(StreamInterface $stream, $maxLength = null) { $buffer = ''; $size = 0; while (!$stream->eof()) { // Using a loose equality here to match on '' and false. if (null == ($byte = $stream->read(1))) { return $buffer; } $buffer .= $byte; // Break when a new line is found or the max length - 1 is reached if ($byte === "\n" || ++$size === $maxLength - 1) { break; } } return $buffer; } /** * Parses a request message string into a request object. * * @param string $message Request message string. * * @return Request */ function parse_request($message) { $data = _parse_message($message); $matches = []; if (!preg_match('/^[\S]+\s+([a-zA-Z]+:\/\/|\/).*/', $data['start-line'], $matches)) { throw new \InvalidArgumentException('Invalid request string'); } $parts = explode(' ', $data['start-line'], 3); $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1'; $request = new Request( $parts[0], $matches[1] === '/' ? _parse_request_uri($parts[1], $data['headers']) : $parts[1], $data['headers'], $data['body'], $version ); return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); } /** * Parses a response message string into a response object. * * @param string $message Response message string. * * @return Response */ function parse_response($message) { $data = _parse_message($message); // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space // between status-code and reason-phrase is required. But browsers accept // responses without space and reason as well. if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']); } $parts = explode(' ', $data['start-line'], 3); return new Response( $parts[1], $data['headers'], $data['body'], explode('/', $parts[0])[1], isset($parts[2]) ? $parts[2] : null ); } /** * Parse a query string into an associative array. * * If multiple values are found for the same key, the value of that key * value pair will become an array. This function does not parse nested * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']). * * @param string $str Query string to parse * @param int|bool $urlEncoding How the query string is encoded * * @return array */ function parse_query($str, $urlEncoding = true) { $result = []; if ($str === '') { return $result; } if ($urlEncoding === true) { $decoder = function ($value) { return rawurldecode(str_replace('+', ' ', $value)); }; } elseif ($urlEncoding === PHP_QUERY_RFC3986) { $decoder = 'rawurldecode'; } elseif ($urlEncoding === PHP_QUERY_RFC1738) { $decoder = 'urldecode'; } else { $decoder = function ($str) { return $str; }; } foreach (explode('&', $str) as $kvp) { $parts = explode('=', $kvp, 2); $key = $decoder($parts[0]); $value = isset($parts[1]) ? $decoder($parts[1]) : null; if (!isset($result[$key])) { $result[$key] = $value; } else { if (!is_array($result[$key])) { $result[$key] = [$result[$key]]; } $result[$key][] = $value; } } return $result; } /** * Build a query string from an array of key value pairs. * * This function can use the return value of parse_query() to build a query * string. This function does not modify the provided keys when an array is * encountered (like http_build_query would). * * @param array $params Query string parameters. * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 * to encode using RFC3986, or PHP_QUERY_RFC1738 * to encode using RFC1738. * @return string */ function build_query(array $params, $encoding = PHP_QUERY_RFC3986) { if (!$params) { return ''; } if ($encoding === false) { $encoder = function ($str) { return $str; }; } elseif ($encoding === PHP_QUERY_RFC3986) { $encoder = 'rawurlencode'; } elseif ($encoding === PHP_QUERY_RFC1738) { $encoder = 'urlencode'; } else { throw new \InvalidArgumentException('Invalid type'); } $qs = ''; foreach ($params as $k => $v) { $k = $encoder($k); if (!is_array($v)) { $qs .= $k; if ($v !== null) { $qs .= '=' . $encoder($v); } $qs .= '&'; } else { foreach ($v as $vv) { $qs .= $k; if ($vv !== null) { $qs .= '=' . $encoder($vv); } $qs .= '&'; } } } return $qs ? (string) substr($qs, 0, -1) : ''; } /** * Determines the mimetype of a file by looking at its extension. * * @param $filename * * @return null|string */ function mimetype_from_filename($filename) { return mimetype_from_extension(pathinfo($filename, PATHINFO_EXTENSION)); } /** * Maps a file extensions to a mimetype. * * @param $extension string The file extension. * * @return string|null * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types */ function mimetype_from_extension($extension) { static $mimetypes = [ '3gp' => 'video/3gpp', '7z' => 'application/x-7z-compressed', 'aac' => 'audio/x-aac', 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'asc' => 'text/plain', 'asf' => 'video/x-ms-asf', 'atom' => 'application/atom+xml', 'avi' => 'video/x-msvideo', 'bmp' => 'image/bmp', 'bz2' => 'application/x-bzip2', 'cer' => 'application/pkix-cert', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'css' => 'text/css', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'deb' => 'application/x-debian-package', 'doc' => 'application/msword', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dvi' => 'application/x-dvi', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'etx' => 'text/x-setext', 'flac' => 'audio/flac', 'flv' => 'video/x-flv', 'gif' => 'image/gif', 'gz' => 'application/gzip', 'htm' => 'text/html', 'html' => 'text/html', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ini' => 'text/plain', 'iso' => 'application/x-iso9660-image', 'jar' => 'application/java-archive', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'js' => 'text/javascript', 'json' => 'application/json', 'latex' => 'application/x-latex', 'log' => 'text/plain', 'm4a' => 'audio/mp4', 'm4v' => 'video/mp4', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mov' => 'video/quicktime', 'mkv' => 'video/x-matroska', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4v' => 'video/mp4', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'oga' => 'audio/ogg', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'pbm' => 'image/x-portable-bitmap', 'pdf' => 'application/pdf', 'pgm' => 'image/x-portable-graymap', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'ppm' => 'image/x-portable-pixmap', 'ppt' => 'application/vnd.ms-powerpoint', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'ps' => 'application/postscript', 'qt' => 'video/quicktime', 'rar' => 'application/x-rar-compressed', 'ras' => 'image/x-cmu-raster', 'rss' => 'application/rss+xml', 'rtf' => 'application/rtf', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'svg' => 'image/svg+xml', 'swf' => 'application/x-shockwave-flash', 'tar' => 'application/x-tar', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'torrent' => 'application/x-bittorrent', 'ttf' => 'application/x-font-ttf', 'txt' => 'text/plain', 'wav' => 'audio/x-wav', 'webm' => 'video/webm', 'webp' => 'image/webp', 'wma' => 'audio/x-ms-wma', 'wmv' => 'video/x-ms-wmv', 'woff' => 'application/x-font-woff', 'wsdl' => 'application/wsdl+xml', 'xbm' => 'image/x-xbitmap', 'xls' => 'application/vnd.ms-excel', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xml' => 'application/xml', 'xpm' => 'image/x-xpixmap', 'xwd' => 'image/x-xwindowdump', 'yaml' => 'text/yaml', 'yml' => 'text/yaml', 'zip' => 'application/zip', ]; $extension = strtolower($extension); return isset($mimetypes[$extension]) ? $mimetypes[$extension] : null; } /** * Parses an HTTP message into an associative array. * * The array contains the "start-line" key containing the start line of * the message, "headers" key containing an associative array of header * array values, and a "body" key containing the body of the message. * * @param string $message HTTP request or response to parse. * * @return array * @internal */ function _parse_message($message) { if (!$message) { throw new \InvalidArgumentException('Invalid message'); } $message = ltrim($message, "\r\n"); $messageParts = preg_split("/\r?\n\r?\n/", $message, 2); if ($messageParts === false || count($messageParts) !== 2) { throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); } list($rawHeaders, $body) = $messageParts; $rawHeaders .= "\r\n"; // Put back the delimiter we split previously $headerParts = preg_split("/\r?\n/", $rawHeaders, 2); if ($headerParts === false || count($headerParts) !== 2) { throw new \InvalidArgumentException('Invalid message: Missing status line'); } list($startLine, $rawHeaders) = $headerParts; if (preg_match("/(?:^HTTP\/|^[A-Z]+ \S+ HTTP\/)(\d+(?:\.\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); } /** @var array[] $headerLines */ $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER); // If these aren't the same, then one line didn't match and there's an invalid header. if ($count !== substr_count($rawHeaders, "\n")) { // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); } throw new \InvalidArgumentException('Invalid header syntax'); } $headers = []; foreach ($headerLines as $headerLine) { $headers[$headerLine[1]][] = $headerLine[2]; } return [ 'start-line' => $startLine, 'headers' => $headers, 'body' => $body, ]; } /** * Constructs a URI for an HTTP request message. * * @param string $path Path from the start-line * @param array $headers Array of headers (each value an array). * * @return string * @internal */ function _parse_request_uri($path, array $headers) { $hostKey = array_filter(array_keys($headers), function ($k) { return strtolower($k) === 'host'; }); // If no host is found, then a full URI cannot be constructed. if (!$hostKey) { return $path; } $host = $headers[reset($hostKey)][0]; $scheme = substr($host, -4) === ':443' ? 'https' : 'http'; return $scheme . '://' . $host . '/' . ltrim($path, '/'); } /** * Get a short summary of the message body * * Will return `null` if the response is not printable. * * @param MessageInterface $message The message to get the body summary * @param int $truncateAt The maximum allowed size of the summary * * @return null|string */ function get_message_body_summary(MessageInterface $message, $truncateAt = 120) { $body = $message->getBody(); if (!$body->isSeekable() || !$body->isReadable()) { return null; } $size = $body->getSize(); if ($size === 0) { return null; } $summary = $body->read($truncateAt); $body->rewind(); if ($size > $truncateAt) { $summary .= ' (truncated...)'; } // Matches any printable character, including unicode characters: // letters, marks, numbers, punctuation, spacing, and separators. if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) { return null; } return $summary; } /** @internal */ function _caseless_remove($keys, array $data) { $result = []; foreach ($keys as &$key) { $key = strtolower($key); } foreach ($data as $k => $v) { if (!in_array(strtolower($k), $keys)) { $result[$k] = $v; } } return $result; } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/guzzlehttp/psr7/src/functions_include.php ================================================ =5.3.0" }, "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/src/MessageInterface.php ================================================ getHeaders() as $name => $values) { * echo $name . ": " . implode(", ", $values); * } * * // Emit headers iteratively: * foreach ($message->getHeaders() as $name => $values) { * foreach ($values as $value) { * header(sprintf('%s: %s', $name, $value), false); * } * } * * While header names are not case-sensitive, getHeaders() will preserve the * exact case in which headers were originally specified. * * @return string[][] Returns an associative array of the message's headers. Each * key MUST be a header name, and each value MUST be an array of strings * for that header. */ public function getHeaders(); /** * Checks if a header exists by the given case-insensitive name. * * @param string $name Case-insensitive header field name. * @return bool Returns true if any header names match the given header * name using a case-insensitive string comparison. Returns false if * no matching header name is found in the message. */ public function hasHeader($name); /** * Retrieves a message header value by the given case-insensitive name. * * This method returns an array of all the header values of the given * case-insensitive header name. * * If the header does not appear in the message, this method MUST return an * empty array. * * @param string $name Case-insensitive header field name. * @return string[] An array of string values as provided for the given * header. If the header does not appear in the message, this method MUST * return an empty array. */ public function getHeader($name); /** * Retrieves a comma-separated string of the values for a single header. * * This method returns all of the header values of the given * case-insensitive header name as a string concatenated together using * a comma. * * NOTE: Not all header values may be appropriately represented using * comma concatenation. For such headers, use getHeader() instead * and supply your own delimiter when concatenating. * * If the header does not appear in the message, this method MUST return * an empty string. * * @param string $name Case-insensitive header field name. * @return string A string of values as provided for the given header * concatenated together using a comma. If the header does not appear in * the message, this method MUST return an empty string. */ public function getHeaderLine($name); /** * Return an instance with the provided value replacing the specified header. * * While header names are case-insensitive, the casing of the header will * be preserved by this function, and returned from getHeaders(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new and/or updated header and value. * * @param string $name Case-insensitive header field name. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withHeader($name, $value); /** * Return an instance with the specified header appended with the given value. * * Existing values for the specified header will be maintained. The new * value(s) will be appended to the existing list. If the header did not * exist previously, it will be added. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new header and/or value. * * @param string $name Case-insensitive header field name to add. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withAddedHeader($name, $value); /** * Return an instance without the specified header. * * Header resolution MUST be done without case-sensitivity. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the named header. * * @param string $name Case-insensitive header field name to remove. * @return static */ public function withoutHeader($name); /** * Gets the body of the message. * * @return StreamInterface Returns the body as a stream. */ public function getBody(); /** * Return an instance with the specified message body. * * The body MUST be a StreamInterface object. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return a new instance that has the * new body stream. * * @param StreamInterface $body Body. * @return static * @throws \InvalidArgumentException When the body is not valid. */ public function withBody(StreamInterface $body); } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/src/RequestInterface.php ================================================ getQuery()` * or from the `QUERY_STRING` server param. * * @return array */ public function getQueryParams(); /** * Return an instance with the specified query string arguments. * * These values SHOULD remain immutable over the course of the incoming * request. They MAY be injected during instantiation, such as from PHP's * $_GET superglobal, or MAY be derived from some other value such as the * URI. In cases where the arguments are parsed from the URI, the data * MUST be compatible with what PHP's parse_str() would return for * purposes of how duplicate query parameters are handled, and how nested * sets are handled. * * Setting query string arguments MUST NOT change the URI stored by the * request, nor the values in the server params. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated query string arguments. * * @param array $query Array of query string arguments, typically from * $_GET. * @return static */ public function withQueryParams(array $query); /** * Retrieve normalized file upload data. * * This method returns upload metadata in a normalized tree, with each leaf * an instance of Psr\Http\Message\UploadedFileInterface. * * These values MAY be prepared from $_FILES or the message body during * instantiation, or MAY be injected via withUploadedFiles(). * * @return array An array tree of UploadedFileInterface instances; an empty * array MUST be returned if no data is present. */ public function getUploadedFiles(); /** * Create a new instance with the specified uploaded files. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param array $uploadedFiles An array tree of UploadedFileInterface instances. * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles); /** * Retrieve any parameters provided in the request body. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, this method MUST * return the contents of $_POST. * * Otherwise, this method may return any results of deserializing * the request body content; as parsing returns structured content, the * potential types MUST be arrays or objects only. A null value indicates * the absence of body content. * * @return null|array|object The deserialized body parameters, if any. * These will typically be an array or object. */ public function getParsedBody(); /** * Return an instance with the specified body parameters. * * These MAY be injected during instantiation. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, use this method * ONLY to inject the contents of $_POST. * * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of * deserializing the request body content. Deserialization/parsing returns * structured data, and, as such, this method ONLY accepts arrays or objects, * or a null value if nothing was available to parse. * * As an example, if content negotiation determines that the request data * is a JSON payload, this method could be used to create a request * instance with the deserialized parameters. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ public function withParsedBody($data); /** * Retrieve attributes derived from the request. * * The request "attributes" may be used to allow injection of any * parameters derived from the request: e.g., the results of path * match operations; the results of decrypting cookies; the results of * deserializing non-form-encoded message bodies; etc. Attributes * will be application and request specific, and CAN be mutable. * * @return array Attributes derived from the request. */ public function getAttributes(); /** * Retrieve a single derived request attribute. * * Retrieves a single derived request attribute as described in * getAttributes(). If the attribute has not been previously set, returns * the default value as provided. * * This method obviates the need for a hasAttribute() method, as it allows * specifying a default value to return if the attribute is not found. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $default Default value to return if the attribute does not exist. * @return mixed */ public function getAttribute($name, $default = null); /** * Return an instance with the specified derived request attribute. * * This method allows setting a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated attribute. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. * @return static */ public function withAttribute($name, $value); /** * Return an instance that removes the specified derived request attribute. * * This method allows removing a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the attribute. * * @see getAttributes() * @param string $name The attribute name. * @return static */ public function withoutAttribute($name); } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/psr/http-message/src/StreamInterface.php ================================================ * [user-info@]host[:port] * * * If the port component is not set or is the standard port for the current * scheme, it SHOULD NOT be included. * * @see https://tools.ietf.org/html/rfc3986#section-3.2 * @return string The URI authority, in "[user-info@]host[:port]" format. */ public function getAuthority(); /** * Retrieve the user information component of the URI. * * If no user information is present, this method MUST return an empty * string. * * If a user is present in the URI, this will return that value; * additionally, if the password is also present, it will be appended to the * user value, with a colon (":") separating the values. * * The trailing "@" character is not part of the user information and MUST * NOT be added. * * @return string The URI user information, in "username[:password]" format. */ public function getUserInfo(); /** * Retrieve the host component of the URI. * * If no host is present, this method MUST return an empty string. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.2.2. * * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 * @return string The URI host. */ public function getHost(); /** * Retrieve the port component of the URI. * * If a port is present, and it is non-standard for the current scheme, * this method MUST return it as an integer. If the port is the standard port * used with the current scheme, this method SHOULD return null. * * If no port is present, and no scheme is present, this method MUST return * a null value. * * If no port is present, but a scheme is present, this method MAY return * the standard port for that scheme, but SHOULD return null. * * @return null|int The URI port. */ public function getPort(); /** * Retrieve the path component of the URI. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Normally, the empty path "" and absolute path "/" are considered equal as * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically * do this normalization because in contexts with a trimmed base path, e.g. * the front controller, this difference becomes significant. It's the task * of the user to handle both "" and "/". * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.3. * * As an example, if the value should include a slash ("/") not intended as * delimiter between path segments, that value MUST be passed in encoded * form (e.g., "%2F") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.3 * @return string The URI path. */ public function getPath(); /** * Retrieve the query string of the URI. * * If no query string is present, this method MUST return an empty string. * * The leading "?" character is not part of the query and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.4. * * As an example, if a value in a key/value pair of the query string should * include an ampersand ("&") not intended as a delimiter between values, * that value MUST be passed in encoded form (e.g., "%26") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.4 * @return string The URI query string. */ public function getQuery(); /** * Retrieve the fragment component of the URI. * * If no fragment is present, this method MUST return an empty string. * * The leading "#" character is not part of the fragment and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.5. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.5 * @return string The URI fragment. */ public function getFragment(); /** * Return an instance with the specified scheme. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified scheme. * * Implementations MUST support the schemes "http" and "https" case * insensitively, and MAY accommodate other schemes if required. * * An empty scheme is equivalent to removing the scheme. * * @param string $scheme The scheme to use with the new instance. * @return static A new instance with the specified scheme. * @throws \InvalidArgumentException for invalid or unsupported schemes. */ public function withScheme($scheme); /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; an empty string for the user is equivalent to removing user * information. * * @param string $user The user name to use for authority. * @param null|string $password The password associated with $user. * @return static A new instance with the specified user information. */ public function withUserInfo($user, $password = null); /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * An empty host value is equivalent to removing the host. * * @param string $host The hostname to use with the new instance. * @return static A new instance with the specified host. * @throws \InvalidArgumentException for invalid hostnames. */ public function withHost($host); /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * Implementations MUST raise an exception for ports outside the * established TCP and UDP port ranges. * * A null value provided for the port is equivalent to removing the port * information. * * @param null|int $port The port to use with the new instance; a null value * removes the port information. * @return static A new instance with the specified port. * @throws \InvalidArgumentException for invalid ports. */ public function withPort($port); /** * Return an instance with the specified path. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified path. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * If the path is intended to be domain-relative rather than path relative then * it must begin with a slash ("/"). Paths not starting with a slash ("/") * are assumed to be relative to some base path known to the application or * consumer. * * Users can provide both encoded and decoded path characters. * Implementations ensure the correct encoding as outlined in getPath(). * * @param string $path The path to use with the new instance. * @return static A new instance with the specified path. * @throws \InvalidArgumentException for invalid paths. */ public function withPath($path); /** * Return an instance with the specified query string. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified query string. * * Users can provide both encoded and decoded query characters. * Implementations ensure the correct encoding as outlined in getQuery(). * * An empty query string value is equivalent to removing the query string. * * @param string $query The query string to use with the new instance. * @return static A new instance with the specified query string. * @throws \InvalidArgumentException for invalid query strings. */ public function withQuery($query); /** * Return an instance with the specified URI fragment. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified URI fragment. * * Users can provide both encoded and decoded fragment characters. * Implementations ensure the correct encoding as outlined in getFragment(). * * An empty fragment value is equivalent to removing the fragment. * * @param string $fragment The fragment to use with the new instance. * @return static A new instance with the specified fragment. */ public function withFragment($fragment); /** * Return the string representation as a URI reference. * * Depending on which components of the URI are present, the resulting * string is either a full URI or relative reference according to RFC 3986, * Section 4.1. The method concatenates the various components of the URI, * using the appropriate delimiters: * * - If a scheme is present, it MUST be suffixed by ":". * - If an authority is present, it MUST be prefixed by "//". * - The path can be concatenated without delimiters. But there are two * cases where the path has to be adjusted to make the URI reference * valid as PHP does not allow to throw an exception in __toString(): * - If the path is rootless and an authority is present, the path MUST * be prefixed by "/". * - If the path is starting with more than one "/" and no authority is * present, the starting slashes MUST be reduced to one. * - If a query is present, it MUST be prefixed by "?". * - If a fragment is present, it MUST be prefixed by "#". * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @return string */ public function __toString(); } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/ralouphie/getallheaders/LICENSE ================================================ The MIT License (MIT) Copyright (c) 2014 Ralph Khattar Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/ralouphie/getallheaders/README.md ================================================ getallheaders ============= PHP `getallheaders()` polyfill. Compatible with PHP >= 5.3. [![Build Status](https://travis-ci.org/ralouphie/getallheaders.svg?branch=master)](https://travis-ci.org/ralouphie/getallheaders) [![Coverage Status](https://coveralls.io/repos/ralouphie/getallheaders/badge.png?branch=master)](https://coveralls.io/r/ralouphie/getallheaders?branch=master) [![Latest Stable Version](https://poser.pugx.org/ralouphie/getallheaders/v/stable.png)](https://packagist.org/packages/ralouphie/getallheaders) [![Latest Unstable Version](https://poser.pugx.org/ralouphie/getallheaders/v/unstable.png)](https://packagist.org/packages/ralouphie/getallheaders) [![License](https://poser.pugx.org/ralouphie/getallheaders/license.png)](https://packagist.org/packages/ralouphie/getallheaders) This is a simple polyfill for [`getallheaders()`](http://www.php.net/manual/en/function.getallheaders.php). ## Install For PHP version **`>= 5.6`**: ``` composer require ralouphie/getallheaders ``` For PHP version **`< 5.6`**: ``` composer require ralouphie/getallheaders "^2" ``` ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/ralouphie/getallheaders/composer.json ================================================ { "name": "ralouphie/getallheaders", "description": "A polyfill for getallheaders.", "license": "MIT", "authors": [ { "name": "Ralph Khattar", "email": "ralph.khattar@gmail.com" } ], "require": { "php": ">=5.6" }, "require-dev": { "phpunit/phpunit": "^5 || ^6.5", "php-coveralls/php-coveralls": "^2.1" }, "autoload": { "files": ["src/getallheaders.php"] }, "autoload-dev": { "psr-4": { "getallheaders\\Tests\\": "tests/" } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/ralouphie/getallheaders/src/getallheaders.php ================================================ 'Content-Type', 'CONTENT_LENGTH' => 'Content-Length', 'CONTENT_MD5' => 'Content-Md5', ); foreach ($_SERVER as $key => $value) { if (substr($key, 0, 5) === 'HTTP_') { $key = substr($key, 5); if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) { $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key)))); $headers[$key] = $value; } } elseif (isset($copy_server[$key])) { $headers[$copy_server[$key]] = $value; } } if (!isset($headers['Authorization'])) { if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; } elseif (isset($_SERVER['PHP_AUTH_USER'])) { $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass); } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) { $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST']; } } return $headers; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-intl-idn/Idn.php ================================================ * @author Sebastian Kroczek * @author Dmitry Lukashin * @author Laurent Bassin * * @internal */ final class Idn { const INTL_IDNA_VARIANT_2003 = 0; const INTL_IDNA_VARIANT_UTS46 = 1; private static $encodeTable = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ); private static $decodeTable = array( 'a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4, 'f' => 5, 'g' => 6, 'h' => 7, 'i' => 8, 'j' => 9, 'k' => 10, 'l' => 11, 'm' => 12, 'n' => 13, 'o' => 14, 'p' => 15, 'q' => 16, 'r' => 17, 's' => 18, 't' => 19, 'u' => 20, 'v' => 21, 'w' => 22, 'x' => 23, 'y' => 24, 'z' => 25, '0' => 26, '1' => 27, '2' => 28, '3' => 29, '4' => 30, '5' => 31, '6' => 32, '7' => 33, '8' => 34, '9' => 35, ); public static function idn_to_ascii($domain, $options, $variant, &$idna_info = array()) { if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { @trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', E_USER_DEPRECATED); } if (self::INTL_IDNA_VARIANT_UTS46 === $variant) { $domain = mb_strtolower($domain, 'utf-8'); } $parts = explode('.', $domain); foreach ($parts as $i => &$part) { if ('' === $part && \count($parts) > 1 + $i) { return false; } if (false === $part = self::encodePart($part)) { return false; } } $output = implode('.', $parts); $idna_info = array( 'result' => \strlen($output) > 255 ? false : $output, 'isTransitionalDifferent' => false, 'errors' => 0, ); return $idna_info['result']; } public static function idn_to_utf8($domain, $options, $variant, &$idna_info = array()) { if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { @trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', E_USER_DEPRECATED); } $parts = explode('.', $domain); foreach ($parts as &$part) { $length = \strlen($part); if ($length < 1 || 63 < $length) { continue; } if (0 !== strpos($part, 'xn--')) { continue; } $part = substr($part, 4); $part = self::decodePart($part); } $output = implode('.', $parts); $idna_info = array( 'result' => \strlen($output) > 255 ? false : $output, 'isTransitionalDifferent' => false, 'errors' => 0, ); return $idna_info['result']; } private static function encodePart($input) { if (\substr($input, 0, 1) === '-' || \substr($input, -1) === '-') { return false; } $codePoints = self::listCodePoints($input); $n = 128; $bias = 72; $delta = 0; $h = $b = \count($codePoints['basic']); $output = ''; foreach ($codePoints['basic'] as $code) { $output .= mb_chr($code, 'utf-8'); } if ($input === $output) { return $output; } if ($b > 0) { $output .= '-'; } $codePoints['nonBasic'] = array_unique($codePoints['nonBasic']); sort($codePoints['nonBasic']); $i = 0; $length = mb_strlen($input, 'utf-8'); while ($h < $length) { $m = $codePoints['nonBasic'][$i++]; $delta += ($m - $n) * ($h + 1); $n = $m; foreach ($codePoints['all'] as $c) { if ($c < $n || $c < 128) { ++$delta; } if ($c === $n) { $q = $delta; for ($k = 36;; $k += 36) { $t = self::calculateThreshold($k, $bias); if ($q < $t) { break; } $code = $t + (($q - $t) % (36 - $t)); $output .= self::$encodeTable[$code]; $q = ($q - $t) / (36 - $t); } $output .= self::$encodeTable[$q]; $bias = self::adapt($delta, $h + 1, ($h === $b)); $delta = 0; ++$h; } } ++$delta; ++$n; } $output = 'xn--'.$output; return \strlen($output) < 1 || 63 < \strlen($output) ? false : strtolower($output); } private static function listCodePoints($input) { $codePoints = array( 'all' => array(), 'basic' => array(), 'nonBasic' => array(), ); $length = mb_strlen($input, 'utf-8'); for ($i = 0; $i < $length; ++$i) { $char = mb_substr($input, $i, 1, 'utf-8'); $code = mb_ord($char, 'utf-8'); if ($code < 128) { $codePoints['all'][] = $codePoints['basic'][] = $code; } else { $codePoints['all'][] = $codePoints['nonBasic'][] = $code; } } return $codePoints; } private static function calculateThreshold($k, $bias) { if ($k <= $bias + 1) { return 1; } if ($k >= $bias + 26) { return 26; } return $k - $bias; } private static function adapt($delta, $numPoints, $firstTime) { $delta = (int) ($firstTime ? $delta / 700 : $delta / 2); $delta += (int) ($delta / $numPoints); $k = 0; while ($delta > 35 * 13) { $delta = (int) ($delta / 35); $k = $k + 36; } return $k + (int) (36 * $delta / ($delta + 38)); } private static function decodePart($input) { $n = 128; $i = 0; $bias = 72; $output = ''; $pos = strrpos($input, '-'); if (false !== $pos) { $output = substr($input, 0, $pos++); } else { $pos = 0; } $outputLength = \strlen($output); $inputLength = \strlen($input); while ($pos < $inputLength) { $oldi = $i; $w = 1; for ($k = 36;; $k += 36) { $digit = self::$decodeTable[$input[$pos++]]; $i += $digit * $w; $t = self::calculateThreshold($k, $bias); if ($digit < $t) { break; } $w *= 36 - $t; } $bias = self::adapt($i - $oldi, ++$outputLength, 0 === $oldi); $n = $n + (int) ($i / $outputLength); $i = $i % $outputLength; $output = mb_substr($output, 0, $i, 'utf-8').mb_chr($n, 'utf-8').mb_substr($output, $i, $outputLength - 1, 'utf-8'); ++$i; } return $output; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-intl-idn/LICENSE ================================================ Copyright (c) 2018-2019 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-intl-idn/README.md ================================================ Symfony Polyfill / Intl: Idn ============================ This component provides [`idn_to_ascii`](https://php.net/idn-to-ascii) and [`idn_to_utf8`](https://php.net/idn-to-utf8) functions to users who run php versions without the [Intl](https://php.net/intl) extension. More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). License ======= This library is released under the [MIT license](LICENSE). ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-intl-idn/bootstrap.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Intl\Idn as p; if (extension_loaded('intl')) { return; } if (!defined('U_IDNA_PROHIBITED_ERROR')) { define('U_IDNA_PROHIBITED_ERROR', 66560); } if (!defined('U_IDNA_ERROR_START')) { define('U_IDNA_ERROR_START', 66560); } if (!defined('U_IDNA_UNASSIGNED_ERROR')) { define('U_IDNA_UNASSIGNED_ERROR', 66561); } if (!defined('U_IDNA_CHECK_BIDI_ERROR')) { define('U_IDNA_CHECK_BIDI_ERROR', 66562); } if (!defined('U_IDNA_STD3_ASCII_RULES_ERROR')) { define('U_IDNA_STD3_ASCII_RULES_ERROR', 66563); } if (!defined('U_IDNA_ACE_PREFIX_ERROR')) { define('U_IDNA_ACE_PREFIX_ERROR', 66564); } if (!defined('U_IDNA_VERIFICATION_ERROR')) { define('U_IDNA_VERIFICATION_ERROR', 66565); } if (!defined('U_IDNA_LABEL_TOO_LONG_ERROR')) { define('U_IDNA_LABEL_TOO_LONG_ERROR', 66566); } if (!defined('U_IDNA_ZERO_LENGTH_LABEL_ERROR')) { define('U_IDNA_ZERO_LENGTH_LABEL_ERROR', 66567); } if (!defined('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR')) { define('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR', 66568); } if (!defined('U_IDNA_ERROR_LIMIT')) { define('U_IDNA_ERROR_LIMIT', 66569); } if (!defined('U_STRINGPREP_PROHIBITED_ERROR')) { define('U_STRINGPREP_PROHIBITED_ERROR', 66560); } if (!defined('U_STRINGPREP_UNASSIGNED_ERROR')) { define('U_STRINGPREP_UNASSIGNED_ERROR', 66561); } if (!defined('U_STRINGPREP_CHECK_BIDI_ERROR')) { define('U_STRINGPREP_CHECK_BIDI_ERROR', 66562); } if (!defined('IDNA_DEFAULT')) { define('IDNA_DEFAULT', 0); } if (!defined('IDNA_ALLOW_UNASSIGNED')) { define('IDNA_ALLOW_UNASSIGNED', 1); } if (!defined('IDNA_USE_STD3_RULES')) { define('IDNA_USE_STD3_RULES', 2); } if (!defined('IDNA_CHECK_BIDI')) { define('IDNA_CHECK_BIDI', 4); } if (!defined('IDNA_CHECK_CONTEXTJ')) { define('IDNA_CHECK_CONTEXTJ', 8); } if (!defined('IDNA_NONTRANSITIONAL_TO_ASCII')) { define('IDNA_NONTRANSITIONAL_TO_ASCII', 16); } if (!defined('IDNA_NONTRANSITIONAL_TO_UNICODE')) { define('IDNA_NONTRANSITIONAL_TO_UNICODE', 32); } if (!defined('INTL_IDNA_VARIANT_2003')) { define('INTL_IDNA_VARIANT_2003', 0); } if (!defined('INTL_IDNA_VARIANT_UTS46')) { define('INTL_IDNA_VARIANT_UTS46', 1); } if (!defined('IDNA_ERROR_EMPTY_LABEL')) { define('IDNA_ERROR_EMPTY_LABEL', 1); } if (!defined('IDNA_ERROR_LABEL_TOO_LONG')) { define('IDNA_ERROR_LABEL_TOO_LONG', 2); } if (!defined('IDNA_ERROR_DOMAIN_NAME_TOO_LONG')) { define('IDNA_ERROR_DOMAIN_NAME_TOO_LONG', 4); } if (!defined('IDNA_ERROR_LEADING_HYPHEN')) { define('IDNA_ERROR_LEADING_HYPHEN', 8); } if (!defined('IDNA_ERROR_TRAILING_HYPHEN')) { define('IDNA_ERROR_TRAILING_HYPHEN', 16); } if (!defined('IDNA_ERROR_HYPHEN_3_4')) { define('IDNA_ERROR_HYPHEN_3_4', 32); } if (!defined('IDNA_ERROR_LEADING_COMBINING_MARK')) { define('IDNA_ERROR_LEADING_COMBINING_MARK', 64); } if (!defined('IDNA_ERROR_DISALLOWED')) { define('IDNA_ERROR_DISALLOWED', 128); } if (!defined('IDNA_ERROR_PUNYCODE')) { define('IDNA_ERROR_PUNYCODE', 256); } if (!defined('IDNA_ERROR_LABEL_HAS_DOT')) { define('IDNA_ERROR_LABEL_HAS_DOT', 512); } if (!defined('IDNA_ERROR_INVALID_ACE_LABEL')) { define('IDNA_ERROR_INVALID_ACE_LABEL', 1024); } if (!defined('IDNA_ERROR_BIDI')) { define('IDNA_ERROR_BIDI', 2048); } if (!defined('IDNA_ERROR_CONTEXTJ')) { define('IDNA_ERROR_CONTEXTJ', 4096); } if (PHP_VERSION_ID < 70400) { if (!function_exists('idn_to_ascii')) { function idn_to_ascii($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_2003, &$idna_info = array()) { return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info); } } if (!function_exists('idn_to_utf8')) { function idn_to_utf8($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_2003, &$idna_info = array()) { return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info); } } } else { if (!function_exists('idn_to_ascii')) { function idn_to_ascii($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info); } } if (!function_exists('idn_to_utf8')) { function idn_to_utf8($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info); } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-intl-idn/composer.json ================================================ { "name": "symfony/polyfill-intl-idn", "type": "library", "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "idn"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Laurent Bassin", "email": "laurent@bassin.info" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=5.3.3", "symfony/polyfill-mbstring": "^1.3", "symfony/polyfill-php72": "^1.10" }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" }, "files": [ "bootstrap.php" ] }, "suggest": { "ext-intl": "For best performance" }, "minimum-stability": "dev", "extra": { "branch-alias": { "dev-master": "1.17-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/LICENSE ================================================ Copyright (c) 2015-2019 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/Mbstring.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Mbstring; /** * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. * * Implemented: * - mb_chr - Returns a specific character from its Unicode code point * - mb_convert_encoding - Convert character encoding * - mb_convert_variables - Convert character code in variable(s) * - mb_decode_mimeheader - Decode string in MIME header field * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED * - mb_decode_numericentity - Decode HTML numeric string reference to character * - mb_encode_numericentity - Encode character to HTML numeric string reference * - mb_convert_case - Perform case folding on a string * - mb_detect_encoding - Detect character encoding * - mb_get_info - Get internal settings of mbstring * - mb_http_input - Detect HTTP input character encoding * - mb_http_output - Set/Get HTTP output character encoding * - mb_internal_encoding - Set/Get internal character encoding * - mb_list_encodings - Returns an array of all supported encodings * - mb_ord - Returns the Unicode code point of a character * - mb_output_handler - Callback function converts character encoding in output buffer * - mb_scrub - Replaces ill-formed byte sequences with substitute characters * - mb_strlen - Get string length * - mb_strpos - Find position of first occurrence of string in a string * - mb_strrpos - Find position of last occurrence of a string in a string * - mb_str_split - Convert a string to an array * - mb_strtolower - Make a string lowercase * - mb_strtoupper - Make a string uppercase * - mb_substitute_character - Set/Get substitution character * - mb_substr - Get part of string * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive * - mb_stristr - Finds first occurrence of a string within another, case insensitive * - mb_strrchr - Finds the last occurrence of a character in a string within another * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive * - mb_strstr - Finds first occurrence of a string within another * - mb_strwidth - Return width of string * - mb_substr_count - Count the number of substring occurrences * * Not implemented: * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) * - mb_ereg_* - Regular expression with multibyte support * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable * - mb_preferred_mime_name - Get MIME charset string * - mb_regex_encoding - Returns current encoding for multibyte regex as string * - mb_regex_set_options - Set/Get the default options for mbregex functions * - mb_send_mail - Send encoded mail * - mb_split - Split multibyte string using regular expression * - mb_strcut - Get part of string * - mb_strimwidth - Get truncated string with specified width * * @author Nicolas Grekas * * @internal */ final class Mbstring { const MB_CASE_FOLD = PHP_INT_MAX; private static $encodingList = array('ASCII', 'UTF-8'); private static $language = 'neutral'; private static $internalEncoding = 'UTF-8'; private static $caseFold = array( array('µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"), array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'), ); public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) { if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) { $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); } else { $fromEncoding = self::getEncoding($fromEncoding); } $toEncoding = self::getEncoding($toEncoding); if ('BASE64' === $fromEncoding) { $s = base64_decode($s); $fromEncoding = $toEncoding; } if ('BASE64' === $toEncoding) { return base64_encode($s); } if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { $fromEncoding = 'Windows-1252'; } if ('UTF-8' !== $fromEncoding) { $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); } return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s); } if ('HTML-ENTITIES' === $fromEncoding) { $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8'); $fromEncoding = 'UTF-8'; } return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); } public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { $vars = array(&$a, &$b, &$c, &$d, &$e, &$f); $ok = true; array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { $ok = false; } }); return $ok ? $fromEncoding : false; } public static function mb_decode_mimeheader($s) { return iconv_mime_decode($s, 2, self::$internalEncoding); } public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) { trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING); } public static function mb_decode_numericentity($s, $convmap, $encoding = null) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING); return null; } if (!\is_array($convmap) || !$convmap) { return false; } if (null !== $encoding && !\is_scalar($encoding)) { trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING); return ''; // Instead of null (cf. mb_encode_numericentity). } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = iconv($encoding, 'UTF-8//IGNORE', $s); } $cnt = floor(\count($convmap) / 4) * 4; for ($i = 0; $i < $cnt; $i += 4) { // collector_decode_htmlnumericentity ignores $convmap[$i + 3] $convmap[$i] += $convmap[$i + 2]; $convmap[$i + 1] += $convmap[$i + 2]; } $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; for ($i = 0; $i < $cnt; $i += 4) { if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { return Mbstring::mb_chr($c - $convmap[$i + 2]); } } return $m[0]; }, $s); if (null === $encoding) { return $s; } return iconv('UTF-8', $encoding.'//IGNORE', $s); } public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING); return null; } if (!\is_array($convmap) || !$convmap) { return false; } if (null !== $encoding && !\is_scalar($encoding)) { trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING); return null; // Instead of '' (cf. mb_decode_numericentity). } if (null !== $is_hex && !\is_scalar($is_hex)) { trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING); return null; } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = iconv($encoding, 'UTF-8//IGNORE', $s); } static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); $cnt = floor(\count($convmap) / 4) * 4; $i = 0; $len = \strlen($s); $result = ''; while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; $uchr = substr($s, $i, $ulen); $i += $ulen; $c = self::mb_ord($uchr); for ($j = 0; $j < $cnt; $j += 4) { if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; continue 2; } } $result .= $uchr; } if (null === $encoding) { return $result; } return iconv('UTF-8', $encoding.'//IGNORE', $result); } public static function mb_convert_case($s, $mode, $encoding = null) { $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = iconv($encoding, 'UTF-8//IGNORE', $s); } if (MB_CASE_TITLE == $mode) { static $titleRegexp = null; if (null === $titleRegexp) { $titleRegexp = self::getData('titleCaseRegexp'); } $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s); } else { if (MB_CASE_UPPER == $mode) { static $upper = null; if (null === $upper) { $upper = self::getData('upperCase'); } $map = $upper; } else { if (self::MB_CASE_FOLD === $mode) { $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s); } static $lower = null; if (null === $lower) { $lower = self::getData('lowerCase'); } $map = $lower; } static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); $i = 0; $len = \strlen($s); while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; $uchr = substr($s, $i, $ulen); $i += $ulen; if (isset($map[$uchr])) { $uchr = $map[$uchr]; $nlen = \strlen($uchr); if ($nlen == $ulen) { $nlen = $i; do { $s[--$nlen] = $uchr[--$ulen]; } while ($ulen); } else { $s = substr_replace($s, $uchr, $i - $ulen, $ulen); $len += $nlen - $ulen; $i += $nlen - $ulen; } } } } if (null === $encoding) { return $s; } return iconv('UTF-8', $encoding.'//IGNORE', $s); } public static function mb_internal_encoding($encoding = null) { if (null === $encoding) { return self::$internalEncoding; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) { self::$internalEncoding = $encoding; return true; } return false; } public static function mb_language($lang = null) { if (null === $lang) { return self::$language; } switch ($lang = strtolower($lang)) { case 'uni': case 'neutral': self::$language = $lang; return true; } return false; } public static function mb_list_encodings() { return array('UTF-8'); } public static function mb_encoding_aliases($encoding) { switch (strtoupper($encoding)) { case 'UTF8': case 'UTF-8': return array('utf8'); } return false; } public static function mb_check_encoding($var = null, $encoding = null) { if (null === $encoding) { if (null === $var) { return false; } $encoding = self::$internalEncoding; } return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var); } public static function mb_detect_encoding($str, $encodingList = null, $strict = false) { if (null === $encodingList) { $encodingList = self::$encodingList; } else { if (!\is_array($encodingList)) { $encodingList = array_map('trim', explode(',', $encodingList)); } $encodingList = array_map('strtoupper', $encodingList); } foreach ($encodingList as $enc) { switch ($enc) { case 'ASCII': if (!preg_match('/[\x80-\xFF]/', $str)) { return $enc; } break; case 'UTF8': case 'UTF-8': if (preg_match('//u', $str)) { return 'UTF-8'; } break; default: if (0 === strncmp($enc, 'ISO-8859-', 9)) { return $enc; } } } return false; } public static function mb_detect_order($encodingList = null) { if (null === $encodingList) { return self::$encodingList; } if (!\is_array($encodingList)) { $encodingList = array_map('trim', explode(',', $encodingList)); } $encodingList = array_map('strtoupper', $encodingList); foreach ($encodingList as $enc) { switch ($enc) { default: if (strncmp($enc, 'ISO-8859-', 9)) { return false; } // no break case 'ASCII': case 'UTF8': case 'UTF-8': } } self::$encodingList = $encodingList; return true; } public static function mb_strlen($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strlen($s); } return @iconv_strlen($s, $encoding); } public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return strpos($haystack, $needle, $offset); } $needle = (string) $needle; if ('' === $needle) { trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING); return false; } return iconv_strpos($haystack, $needle, $offset, $encoding); } public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return strrpos($haystack, $needle, $offset); } if ($offset != (int) $offset) { $offset = 0; } elseif ($offset = (int) $offset) { if ($offset < 0) { if (0 > $offset += self::mb_strlen($needle)) { $haystack = self::mb_substr($haystack, 0, $offset, $encoding); } $offset = 0; } else { $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); } } $pos = iconv_strrpos($haystack, $needle, $encoding); return false !== $pos ? $offset + $pos : false; } public static function mb_str_split($string, $split_length = 1, $encoding = null) { if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) { trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING); return null; } if (1 > $split_length = (int) $split_length) { trigger_error('The length of each segment must be greater than zero', E_USER_WARNING); return false; } if (null === $encoding) { $encoding = mb_internal_encoding(); } if ('UTF-8' === $encoding = self::getEncoding($encoding)) { $rx = '/('; while (65535 < $split_length) { $rx .= '.{65535}'; $split_length -= 65535; } $rx .= '.{'.$split_length.'})/us'; return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); } $result = array(); $length = mb_strlen($string, $encoding); for ($i = 0; $i < $length; $i += $split_length) { $result[] = mb_substr($string, $i, $split_length, $encoding); } return $result; } public static function mb_strtolower($s, $encoding = null) { return self::mb_convert_case($s, MB_CASE_LOWER, $encoding); } public static function mb_strtoupper($s, $encoding = null) { return self::mb_convert_case($s, MB_CASE_UPPER, $encoding); } public static function mb_substitute_character($c = null) { if (0 === strcasecmp($c, 'none')) { return true; } return null !== $c ? false : 'none'; } public static function mb_substr($s, $start, $length = null, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return (string) substr($s, $start, null === $length ? 2147483647 : $length); } if ($start < 0) { $start = iconv_strlen($s, $encoding) + $start; if ($start < 0) { $start = 0; } } if (null === $length) { $length = 2147483647; } elseif ($length < 0) { $length = iconv_strlen($s, $encoding) + $length - $start; if ($length < 0) { return ''; } } return (string) iconv_substr($s, $start, $length, $encoding); } public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); return self::mb_strpos($haystack, $needle, $offset, $encoding); } public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) { $pos = self::mb_stripos($haystack, $needle, 0, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return strrchr($haystack, $needle, $part); } $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = iconv_strrpos($haystack, $needle, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = self::mb_strripos($haystack, $needle, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); return self::mb_strrpos($haystack, $needle, $offset, $encoding); } public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) { $pos = strpos($haystack, $needle); if (false === $pos) { return false; } if ($part) { return substr($haystack, 0, $pos); } return substr($haystack, $pos); } public static function mb_get_info($type = 'all') { $info = array( 'internal_encoding' => self::$internalEncoding, 'http_output' => 'pass', 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', 'func_overload' => 0, 'func_overload_list' => 'no overload', 'mail_charset' => 'UTF-8', 'mail_header_encoding' => 'BASE64', 'mail_body_encoding' => 'BASE64', 'illegal_chars' => 0, 'encoding_translation' => 'Off', 'language' => self::$language, 'detect_order' => self::$encodingList, 'substitute_character' => 'none', 'strict_detection' => 'Off', ); if ('all' === $type) { return $info; } if (isset($info[$type])) { return $info[$type]; } return false; } public static function mb_http_input($type = '') { return false; } public static function mb_http_output($encoding = null) { return null !== $encoding ? 'pass' === $encoding : 'pass'; } public static function mb_strwidth($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('UTF-8' !== $encoding) { $s = iconv($encoding, 'UTF-8//IGNORE', $s); } $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); return ($wide << 1) + iconv_strlen($s, 'UTF-8'); } public static function mb_substr_count($haystack, $needle, $encoding = null) { return substr_count($haystack, $needle); } public static function mb_output_handler($contents, $status) { return $contents; } public static function mb_chr($code, $encoding = null) { if (0x80 > $code %= 0x200000) { $s = \chr($code); } elseif (0x800 > $code) { $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); } elseif (0x10000 > $code) { $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); } else { $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); } if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { $s = mb_convert_encoding($s, $encoding, 'UTF-8'); } return $s; } public static function mb_ord($s, $encoding = null) { if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { $s = mb_convert_encoding($s, 'UTF-8', $encoding); } if (1 === \strlen($s)) { return \ord($s); } $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; if (0xF0 <= $code) { return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; } if (0xE0 <= $code) { return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; } if (0xC0 <= $code) { return (($code - 0xC0) << 6) + $s[2] - 0x80; } return $code; } private static function getSubpart($pos, $part, $haystack, $encoding) { if (false === $pos) { return false; } if ($part) { return self::mb_substr($haystack, 0, $pos, $encoding); } return self::mb_substr($haystack, $pos, null, $encoding); } private static function html_encoding_callback(array $m) { $i = 1; $entities = ''; $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8')); while (isset($m[$i])) { if (0x80 > $m[$i]) { $entities .= \chr($m[$i++]); continue; } if (0xF0 <= $m[$i]) { $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; } elseif (0xE0 <= $m[$i]) { $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; } else { $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; } $entities .= '&#'.$c.';'; } return $entities; } private static function title_case(array $s) { return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8'); } private static function getData($file) { if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { return require $file; } return false; } private static function getEncoding($encoding) { if (null === $encoding) { return self::$internalEncoding; } if ('UTF-8' === $encoding) { return 'UTF-8'; } $encoding = strtoupper($encoding); if ('8BIT' === $encoding || 'BINARY' === $encoding) { return 'CP850'; } if ('UTF8' === $encoding) { return 'UTF-8'; } return $encoding; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/README.md ================================================ Symfony Polyfill / Mbstring =========================== This component provides a partial, native PHP implementation for the [Mbstring](https://php.net/mbstring) extension. More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). License ======= This library is released under the [MIT license](LICENSE). ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php ================================================ 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', 'À' => 'à', 'Á' => 'á', 'Â' => 'â', 'Ã' => 'ã', 'Ä' => 'ä', 'Å' => 'å', 'Æ' => 'æ', 'Ç' => 'ç', 'È' => 'è', 'É' => 'é', 'Ê' => 'ê', 'Ë' => 'ë', 'Ì' => 'ì', 'Í' => 'í', 'Î' => 'î', 'Ï' => 'ï', 'Ð' => 'ð', 'Ñ' => 'ñ', 'Ò' => 'ò', 'Ó' => 'ó', 'Ô' => 'ô', 'Õ' => 'õ', 'Ö' => 'ö', 'Ø' => 'ø', 'Ù' => 'ù', 'Ú' => 'ú', 'Û' => 'û', 'Ü' => 'ü', 'Ý' => 'ý', 'Þ' => 'þ', 'Ā' => 'ā', 'Ă' => 'ă', 'Ą' => 'ą', 'Ć' => 'ć', 'Ĉ' => 'ĉ', 'Ċ' => 'ċ', 'Č' => 'č', 'Ď' => 'ď', 'Đ' => 'đ', 'Ē' => 'ē', 'Ĕ' => 'ĕ', 'Ė' => 'ė', 'Ę' => 'ę', 'Ě' => 'ě', 'Ĝ' => 'ĝ', 'Ğ' => 'ğ', 'Ġ' => 'ġ', 'Ģ' => 'ģ', 'Ĥ' => 'ĥ', 'Ħ' => 'ħ', 'Ĩ' => 'ĩ', 'Ī' => 'ī', 'Ĭ' => 'ĭ', 'Į' => 'į', 'İ' => 'i', 'IJ' => 'ij', 'Ĵ' => 'ĵ', 'Ķ' => 'ķ', 'Ĺ' => 'ĺ', 'Ļ' => 'ļ', 'Ľ' => 'ľ', 'Ŀ' => 'ŀ', 'Ł' => 'ł', 'Ń' => 'ń', 'Ņ' => 'ņ', 'Ň' => 'ň', 'Ŋ' => 'ŋ', 'Ō' => 'ō', 'Ŏ' => 'ŏ', 'Ő' => 'ő', 'Œ' => 'œ', 'Ŕ' => 'ŕ', 'Ŗ' => 'ŗ', 'Ř' => 'ř', 'Ś' => 'ś', 'Ŝ' => 'ŝ', 'Ş' => 'ş', 'Š' => 'š', 'Ţ' => 'ţ', 'Ť' => 'ť', 'Ŧ' => 'ŧ', 'Ũ' => 'ũ', 'Ū' => 'ū', 'Ŭ' => 'ŭ', 'Ů' => 'ů', 'Ű' => 'ű', 'Ų' => 'ų', 'Ŵ' => 'ŵ', 'Ŷ' => 'ŷ', 'Ÿ' => 'ÿ', 'Ź' => 'ź', 'Ż' => 'ż', 'Ž' => 'ž', 'Ɓ' => 'ɓ', 'Ƃ' => 'ƃ', 'Ƅ' => 'ƅ', 'Ɔ' => 'ɔ', 'Ƈ' => 'ƈ', 'Ɖ' => 'ɖ', 'Ɗ' => 'ɗ', 'Ƌ' => 'ƌ', 'Ǝ' => 'ǝ', 'Ə' => 'ə', 'Ɛ' => 'ɛ', 'Ƒ' => 'ƒ', 'Ɠ' => 'ɠ', 'Ɣ' => 'ɣ', 'Ɩ' => 'ɩ', 'Ɨ' => 'ɨ', 'Ƙ' => 'ƙ', 'Ɯ' => 'ɯ', 'Ɲ' => 'ɲ', 'Ɵ' => 'ɵ', 'Ơ' => 'ơ', 'Ƣ' => 'ƣ', 'Ƥ' => 'ƥ', 'Ʀ' => 'ʀ', 'Ƨ' => 'ƨ', 'Ʃ' => 'ʃ', 'Ƭ' => 'ƭ', 'Ʈ' => 'ʈ', 'Ư' => 'ư', 'Ʊ' => 'ʊ', 'Ʋ' => 'ʋ', 'Ƴ' => 'ƴ', 'Ƶ' => 'ƶ', 'Ʒ' => 'ʒ', 'Ƹ' => 'ƹ', 'Ƽ' => 'ƽ', 'DŽ' => 'dž', 'Dž' => 'dž', 'LJ' => 'lj', 'Lj' => 'lj', 'NJ' => 'nj', 'Nj' => 'nj', 'Ǎ' => 'ǎ', 'Ǐ' => 'ǐ', 'Ǒ' => 'ǒ', 'Ǔ' => 'ǔ', 'Ǖ' => 'ǖ', 'Ǘ' => 'ǘ', 'Ǚ' => 'ǚ', 'Ǜ' => 'ǜ', 'Ǟ' => 'ǟ', 'Ǡ' => 'ǡ', 'Ǣ' => 'ǣ', 'Ǥ' => 'ǥ', 'Ǧ' => 'ǧ', 'Ǩ' => 'ǩ', 'Ǫ' => 'ǫ', 'Ǭ' => 'ǭ', 'Ǯ' => 'ǯ', 'DZ' => 'dz', 'Dz' => 'dz', 'Ǵ' => 'ǵ', 'Ƕ' => 'ƕ', 'Ƿ' => 'ƿ', 'Ǹ' => 'ǹ', 'Ǻ' => 'ǻ', 'Ǽ' => 'ǽ', 'Ǿ' => 'ǿ', 'Ȁ' => 'ȁ', 'Ȃ' => 'ȃ', 'Ȅ' => 'ȅ', 'Ȇ' => 'ȇ', 'Ȉ' => 'ȉ', 'Ȋ' => 'ȋ', 'Ȍ' => 'ȍ', 'Ȏ' => 'ȏ', 'Ȑ' => 'ȑ', 'Ȓ' => 'ȓ', 'Ȕ' => 'ȕ', 'Ȗ' => 'ȗ', 'Ș' => 'ș', 'Ț' => 'ț', 'Ȝ' => 'ȝ', 'Ȟ' => 'ȟ', 'Ƞ' => 'ƞ', 'Ȣ' => 'ȣ', 'Ȥ' => 'ȥ', 'Ȧ' => 'ȧ', 'Ȩ' => 'ȩ', 'Ȫ' => 'ȫ', 'Ȭ' => 'ȭ', 'Ȯ' => 'ȯ', 'Ȱ' => 'ȱ', 'Ȳ' => 'ȳ', 'Ⱥ' => 'ⱥ', 'Ȼ' => 'ȼ', 'Ƚ' => 'ƚ', 'Ⱦ' => 'ⱦ', 'Ɂ' => 'ɂ', 'Ƀ' => 'ƀ', 'Ʉ' => 'ʉ', 'Ʌ' => 'ʌ', 'Ɇ' => 'ɇ', 'Ɉ' => 'ɉ', 'Ɋ' => 'ɋ', 'Ɍ' => 'ɍ', 'Ɏ' => 'ɏ', 'Ͱ' => 'ͱ', 'Ͳ' => 'ͳ', 'Ͷ' => 'ͷ', 'Ϳ' => 'ϳ', 'Ά' => 'ά', 'Έ' => 'έ', 'Ή' => 'ή', 'Ί' => 'ί', 'Ό' => 'ό', 'Ύ' => 'ύ', 'Ώ' => 'ώ', 'Α' => 'α', 'Β' => 'β', 'Γ' => 'γ', 'Δ' => 'δ', 'Ε' => 'ε', 'Ζ' => 'ζ', 'Η' => 'η', 'Θ' => 'θ', 'Ι' => 'ι', 'Κ' => 'κ', 'Λ' => 'λ', 'Μ' => 'μ', 'Ν' => 'ν', 'Ξ' => 'ξ', 'Ο' => 'ο', 'Π' => 'π', 'Ρ' => 'ρ', 'Σ' => 'σ', 'Τ' => 'τ', 'Υ' => 'υ', 'Φ' => 'φ', 'Χ' => 'χ', 'Ψ' => 'ψ', 'Ω' => 'ω', 'Ϊ' => 'ϊ', 'Ϋ' => 'ϋ', 'Ϗ' => 'ϗ', 'Ϙ' => 'ϙ', 'Ϛ' => 'ϛ', 'Ϝ' => 'ϝ', 'Ϟ' => 'ϟ', 'Ϡ' => 'ϡ', 'Ϣ' => 'ϣ', 'Ϥ' => 'ϥ', 'Ϧ' => 'ϧ', 'Ϩ' => 'ϩ', 'Ϫ' => 'ϫ', 'Ϭ' => 'ϭ', 'Ϯ' => 'ϯ', 'ϴ' => 'θ', 'Ϸ' => 'ϸ', 'Ϲ' => 'ϲ', 'Ϻ' => 'ϻ', 'Ͻ' => 'ͻ', 'Ͼ' => 'ͼ', 'Ͽ' => 'ͽ', 'Ѐ' => 'ѐ', 'Ё' => 'ё', 'Ђ' => 'ђ', 'Ѓ' => 'ѓ', 'Є' => 'є', 'Ѕ' => 'ѕ', 'І' => 'і', 'Ї' => 'ї', 'Ј' => 'ј', 'Љ' => 'љ', 'Њ' => 'њ', 'Ћ' => 'ћ', 'Ќ' => 'ќ', 'Ѝ' => 'ѝ', 'Ў' => 'ў', 'Џ' => 'џ', 'А' => 'а', 'Б' => 'б', 'В' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'М' => 'м', 'Н' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'р', 'С' => 'с', 'Т' => 'т', 'У' => 'у', 'Ф' => 'ф', 'Х' => 'х', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ъ' => 'ъ', 'Ы' => 'ы', 'Ь' => 'ь', 'Э' => 'э', 'Ю' => 'ю', 'Я' => 'я', 'Ѡ' => 'ѡ', 'Ѣ' => 'ѣ', 'Ѥ' => 'ѥ', 'Ѧ' => 'ѧ', 'Ѩ' => 'ѩ', 'Ѫ' => 'ѫ', 'Ѭ' => 'ѭ', 'Ѯ' => 'ѯ', 'Ѱ' => 'ѱ', 'Ѳ' => 'ѳ', 'Ѵ' => 'ѵ', 'Ѷ' => 'ѷ', 'Ѹ' => 'ѹ', 'Ѻ' => 'ѻ', 'Ѽ' => 'ѽ', 'Ѿ' => 'ѿ', 'Ҁ' => 'ҁ', 'Ҋ' => 'ҋ', 'Ҍ' => 'ҍ', 'Ҏ' => 'ҏ', 'Ґ' => 'ґ', 'Ғ' => 'ғ', 'Ҕ' => 'ҕ', 'Җ' => 'җ', 'Ҙ' => 'ҙ', 'Қ' => 'қ', 'Ҝ' => 'ҝ', 'Ҟ' => 'ҟ', 'Ҡ' => 'ҡ', 'Ң' => 'ң', 'Ҥ' => 'ҥ', 'Ҧ' => 'ҧ', 'Ҩ' => 'ҩ', 'Ҫ' => 'ҫ', 'Ҭ' => 'ҭ', 'Ү' => 'ү', 'Ұ' => 'ұ', 'Ҳ' => 'ҳ', 'Ҵ' => 'ҵ', 'Ҷ' => 'ҷ', 'Ҹ' => 'ҹ', 'Һ' => 'һ', 'Ҽ' => 'ҽ', 'Ҿ' => 'ҿ', 'Ӏ' => 'ӏ', 'Ӂ' => 'ӂ', 'Ӄ' => 'ӄ', 'Ӆ' => 'ӆ', 'Ӈ' => 'ӈ', 'Ӊ' => 'ӊ', 'Ӌ' => 'ӌ', 'Ӎ' => 'ӎ', 'Ӑ' => 'ӑ', 'Ӓ' => 'ӓ', 'Ӕ' => 'ӕ', 'Ӗ' => 'ӗ', 'Ә' => 'ә', 'Ӛ' => 'ӛ', 'Ӝ' => 'ӝ', 'Ӟ' => 'ӟ', 'Ӡ' => 'ӡ', 'Ӣ' => 'ӣ', 'Ӥ' => 'ӥ', 'Ӧ' => 'ӧ', 'Ө' => 'ө', 'Ӫ' => 'ӫ', 'Ӭ' => 'ӭ', 'Ӯ' => 'ӯ', 'Ӱ' => 'ӱ', 'Ӳ' => 'ӳ', 'Ӵ' => 'ӵ', 'Ӷ' => 'ӷ', 'Ӹ' => 'ӹ', 'Ӻ' => 'ӻ', 'Ӽ' => 'ӽ', 'Ӿ' => 'ӿ', 'Ԁ' => 'ԁ', 'Ԃ' => 'ԃ', 'Ԅ' => 'ԅ', 'Ԇ' => 'ԇ', 'Ԉ' => 'ԉ', 'Ԋ' => 'ԋ', 'Ԍ' => 'ԍ', 'Ԏ' => 'ԏ', 'Ԑ' => 'ԑ', 'Ԓ' => 'ԓ', 'Ԕ' => 'ԕ', 'Ԗ' => 'ԗ', 'Ԙ' => 'ԙ', 'Ԛ' => 'ԛ', 'Ԝ' => 'ԝ', 'Ԟ' => 'ԟ', 'Ԡ' => 'ԡ', 'Ԣ' => 'ԣ', 'Ԥ' => 'ԥ', 'Ԧ' => 'ԧ', 'Ԩ' => 'ԩ', 'Ԫ' => 'ԫ', 'Ԭ' => 'ԭ', 'Ԯ' => 'ԯ', 'Ա' => 'ա', 'Բ' => 'բ', 'Գ' => 'գ', 'Դ' => 'դ', 'Ե' => 'ե', 'Զ' => 'զ', 'Է' => 'է', 'Ը' => 'ը', 'Թ' => 'թ', 'Ժ' => 'ժ', 'Ի' => 'ի', 'Լ' => 'լ', 'Խ' => 'խ', 'Ծ' => 'ծ', 'Կ' => 'կ', 'Հ' => 'հ', 'Ձ' => 'ձ', 'Ղ' => 'ղ', 'Ճ' => 'ճ', 'Մ' => 'մ', 'Յ' => 'յ', 'Ն' => 'ն', 'Շ' => 'շ', 'Ո' => 'ո', 'Չ' => 'չ', 'Պ' => 'պ', 'Ջ' => 'ջ', 'Ռ' => 'ռ', 'Ս' => 'ս', 'Վ' => 'վ', 'Տ' => 'տ', 'Ր' => 'ր', 'Ց' => 'ց', 'Ւ' => 'ւ', 'Փ' => 'փ', 'Ք' => 'ք', 'Օ' => 'օ', 'Ֆ' => 'ֆ', 'Ⴀ' => 'ⴀ', 'Ⴁ' => 'ⴁ', 'Ⴂ' => 'ⴂ', 'Ⴃ' => 'ⴃ', 'Ⴄ' => 'ⴄ', 'Ⴅ' => 'ⴅ', 'Ⴆ' => 'ⴆ', 'Ⴇ' => 'ⴇ', 'Ⴈ' => 'ⴈ', 'Ⴉ' => 'ⴉ', 'Ⴊ' => 'ⴊ', 'Ⴋ' => 'ⴋ', 'Ⴌ' => 'ⴌ', 'Ⴍ' => 'ⴍ', 'Ⴎ' => 'ⴎ', 'Ⴏ' => 'ⴏ', 'Ⴐ' => 'ⴐ', 'Ⴑ' => 'ⴑ', 'Ⴒ' => 'ⴒ', 'Ⴓ' => 'ⴓ', 'Ⴔ' => 'ⴔ', 'Ⴕ' => 'ⴕ', 'Ⴖ' => 'ⴖ', 'Ⴗ' => 'ⴗ', 'Ⴘ' => 'ⴘ', 'Ⴙ' => 'ⴙ', 'Ⴚ' => 'ⴚ', 'Ⴛ' => 'ⴛ', 'Ⴜ' => 'ⴜ', 'Ⴝ' => 'ⴝ', 'Ⴞ' => 'ⴞ', 'Ⴟ' => 'ⴟ', 'Ⴠ' => 'ⴠ', 'Ⴡ' => 'ⴡ', 'Ⴢ' => 'ⴢ', 'Ⴣ' => 'ⴣ', 'Ⴤ' => 'ⴤ', 'Ⴥ' => 'ⴥ', 'Ⴧ' => 'ⴧ', 'Ⴭ' => 'ⴭ', 'Ꭰ' => 'ꭰ', 'Ꭱ' => 'ꭱ', 'Ꭲ' => 'ꭲ', 'Ꭳ' => 'ꭳ', 'Ꭴ' => 'ꭴ', 'Ꭵ' => 'ꭵ', 'Ꭶ' => 'ꭶ', 'Ꭷ' => 'ꭷ', 'Ꭸ' => 'ꭸ', 'Ꭹ' => 'ꭹ', 'Ꭺ' => 'ꭺ', 'Ꭻ' => 'ꭻ', 'Ꭼ' => 'ꭼ', 'Ꭽ' => 'ꭽ', 'Ꭾ' => 'ꭾ', 'Ꭿ' => 'ꭿ', 'Ꮀ' => 'ꮀ', 'Ꮁ' => 'ꮁ', 'Ꮂ' => 'ꮂ', 'Ꮃ' => 'ꮃ', 'Ꮄ' => 'ꮄ', 'Ꮅ' => 'ꮅ', 'Ꮆ' => 'ꮆ', 'Ꮇ' => 'ꮇ', 'Ꮈ' => 'ꮈ', 'Ꮉ' => 'ꮉ', 'Ꮊ' => 'ꮊ', 'Ꮋ' => 'ꮋ', 'Ꮌ' => 'ꮌ', 'Ꮍ' => 'ꮍ', 'Ꮎ' => 'ꮎ', 'Ꮏ' => 'ꮏ', 'Ꮐ' => 'ꮐ', 'Ꮑ' => 'ꮑ', 'Ꮒ' => 'ꮒ', 'Ꮓ' => 'ꮓ', 'Ꮔ' => 'ꮔ', 'Ꮕ' => 'ꮕ', 'Ꮖ' => 'ꮖ', 'Ꮗ' => 'ꮗ', 'Ꮘ' => 'ꮘ', 'Ꮙ' => 'ꮙ', 'Ꮚ' => 'ꮚ', 'Ꮛ' => 'ꮛ', 'Ꮜ' => 'ꮜ', 'Ꮝ' => 'ꮝ', 'Ꮞ' => 'ꮞ', 'Ꮟ' => 'ꮟ', 'Ꮠ' => 'ꮠ', 'Ꮡ' => 'ꮡ', 'Ꮢ' => 'ꮢ', 'Ꮣ' => 'ꮣ', 'Ꮤ' => 'ꮤ', 'Ꮥ' => 'ꮥ', 'Ꮦ' => 'ꮦ', 'Ꮧ' => 'ꮧ', 'Ꮨ' => 'ꮨ', 'Ꮩ' => 'ꮩ', 'Ꮪ' => 'ꮪ', 'Ꮫ' => 'ꮫ', 'Ꮬ' => 'ꮬ', 'Ꮭ' => 'ꮭ', 'Ꮮ' => 'ꮮ', 'Ꮯ' => 'ꮯ', 'Ꮰ' => 'ꮰ', 'Ꮱ' => 'ꮱ', 'Ꮲ' => 'ꮲ', 'Ꮳ' => 'ꮳ', 'Ꮴ' => 'ꮴ', 'Ꮵ' => 'ꮵ', 'Ꮶ' => 'ꮶ', 'Ꮷ' => 'ꮷ', 'Ꮸ' => 'ꮸ', 'Ꮹ' => 'ꮹ', 'Ꮺ' => 'ꮺ', 'Ꮻ' => 'ꮻ', 'Ꮼ' => 'ꮼ', 'Ꮽ' => 'ꮽ', 'Ꮾ' => 'ꮾ', 'Ꮿ' => 'ꮿ', 'Ᏸ' => 'ᏸ', 'Ᏹ' => 'ᏹ', 'Ᏺ' => 'ᏺ', 'Ᏻ' => 'ᏻ', 'Ᏼ' => 'ᏼ', 'Ᏽ' => 'ᏽ', 'Ა' => 'ა', 'Ბ' => 'ბ', 'Გ' => 'გ', 'Დ' => 'დ', 'Ე' => 'ე', 'Ვ' => 'ვ', 'Ზ' => 'ზ', 'Თ' => 'თ', 'Ი' => 'ი', 'Კ' => 'კ', 'Ლ' => 'ლ', 'Მ' => 'მ', 'Ნ' => 'ნ', 'Ო' => 'ო', 'Პ' => 'პ', 'Ჟ' => 'ჟ', 'Რ' => 'რ', 'Ს' => 'ს', 'Ტ' => 'ტ', 'Უ' => 'უ', 'Ფ' => 'ფ', 'Ქ' => 'ქ', 'Ღ' => 'ღ', 'Ყ' => 'ყ', 'Შ' => 'შ', 'Ჩ' => 'ჩ', 'Ც' => 'ც', 'Ძ' => 'ძ', 'Წ' => 'წ', 'Ჭ' => 'ჭ', 'Ხ' => 'ხ', 'Ჯ' => 'ჯ', 'Ჰ' => 'ჰ', 'Ჱ' => 'ჱ', 'Ჲ' => 'ჲ', 'Ჳ' => 'ჳ', 'Ჴ' => 'ჴ', 'Ჵ' => 'ჵ', 'Ჶ' => 'ჶ', 'Ჷ' => 'ჷ', 'Ჸ' => 'ჸ', 'Ჹ' => 'ჹ', 'Ჺ' => 'ჺ', 'Ჽ' => 'ჽ', 'Ჾ' => 'ჾ', 'Ჿ' => 'ჿ', 'Ḁ' => 'ḁ', 'Ḃ' => 'ḃ', 'Ḅ' => 'ḅ', 'Ḇ' => 'ḇ', 'Ḉ' => 'ḉ', 'Ḋ' => 'ḋ', 'Ḍ' => 'ḍ', 'Ḏ' => 'ḏ', 'Ḑ' => 'ḑ', 'Ḓ' => 'ḓ', 'Ḕ' => 'ḕ', 'Ḗ' => 'ḗ', 'Ḙ' => 'ḙ', 'Ḛ' => 'ḛ', 'Ḝ' => 'ḝ', 'Ḟ' => 'ḟ', 'Ḡ' => 'ḡ', 'Ḣ' => 'ḣ', 'Ḥ' => 'ḥ', 'Ḧ' => 'ḧ', 'Ḩ' => 'ḩ', 'Ḫ' => 'ḫ', 'Ḭ' => 'ḭ', 'Ḯ' => 'ḯ', 'Ḱ' => 'ḱ', 'Ḳ' => 'ḳ', 'Ḵ' => 'ḵ', 'Ḷ' => 'ḷ', 'Ḹ' => 'ḹ', 'Ḻ' => 'ḻ', 'Ḽ' => 'ḽ', 'Ḿ' => 'ḿ', 'Ṁ' => 'ṁ', 'Ṃ' => 'ṃ', 'Ṅ' => 'ṅ', 'Ṇ' => 'ṇ', 'Ṉ' => 'ṉ', 'Ṋ' => 'ṋ', 'Ṍ' => 'ṍ', 'Ṏ' => 'ṏ', 'Ṑ' => 'ṑ', 'Ṓ' => 'ṓ', 'Ṕ' => 'ṕ', 'Ṗ' => 'ṗ', 'Ṙ' => 'ṙ', 'Ṛ' => 'ṛ', 'Ṝ' => 'ṝ', 'Ṟ' => 'ṟ', 'Ṡ' => 'ṡ', 'Ṣ' => 'ṣ', 'Ṥ' => 'ṥ', 'Ṧ' => 'ṧ', 'Ṩ' => 'ṩ', 'Ṫ' => 'ṫ', 'Ṭ' => 'ṭ', 'Ṯ' => 'ṯ', 'Ṱ' => 'ṱ', 'Ṳ' => 'ṳ', 'Ṵ' => 'ṵ', 'Ṷ' => 'ṷ', 'Ṹ' => 'ṹ', 'Ṻ' => 'ṻ', 'Ṽ' => 'ṽ', 'Ṿ' => 'ṿ', 'Ẁ' => 'ẁ', 'Ẃ' => 'ẃ', 'Ẅ' => 'ẅ', 'Ẇ' => 'ẇ', 'Ẉ' => 'ẉ', 'Ẋ' => 'ẋ', 'Ẍ' => 'ẍ', 'Ẏ' => 'ẏ', 'Ẑ' => 'ẑ', 'Ẓ' => 'ẓ', 'Ẕ' => 'ẕ', 'ẞ' => 'ß', 'Ạ' => 'ạ', 'Ả' => 'ả', 'Ấ' => 'ấ', 'Ầ' => 'ầ', 'Ẩ' => 'ẩ', 'Ẫ' => 'ẫ', 'Ậ' => 'ậ', 'Ắ' => 'ắ', 'Ằ' => 'ằ', 'Ẳ' => 'ẳ', 'Ẵ' => 'ẵ', 'Ặ' => 'ặ', 'Ẹ' => 'ẹ', 'Ẻ' => 'ẻ', 'Ẽ' => 'ẽ', 'Ế' => 'ế', 'Ề' => 'ề', 'Ể' => 'ể', 'Ễ' => 'ễ', 'Ệ' => 'ệ', 'Ỉ' => 'ỉ', 'Ị' => 'ị', 'Ọ' => 'ọ', 'Ỏ' => 'ỏ', 'Ố' => 'ố', 'Ồ' => 'ồ', 'Ổ' => 'ổ', 'Ỗ' => 'ỗ', 'Ộ' => 'ộ', 'Ớ' => 'ớ', 'Ờ' => 'ờ', 'Ở' => 'ở', 'Ỡ' => 'ỡ', 'Ợ' => 'ợ', 'Ụ' => 'ụ', 'Ủ' => 'ủ', 'Ứ' => 'ứ', 'Ừ' => 'ừ', 'Ử' => 'ử', 'Ữ' => 'ữ', 'Ự' => 'ự', 'Ỳ' => 'ỳ', 'Ỵ' => 'ỵ', 'Ỷ' => 'ỷ', 'Ỹ' => 'ỹ', 'Ỻ' => 'ỻ', 'Ỽ' => 'ỽ', 'Ỿ' => 'ỿ', 'Ἀ' => 'ἀ', 'Ἁ' => 'ἁ', 'Ἂ' => 'ἂ', 'Ἃ' => 'ἃ', 'Ἄ' => 'ἄ', 'Ἅ' => 'ἅ', 'Ἆ' => 'ἆ', 'Ἇ' => 'ἇ', 'Ἐ' => 'ἐ', 'Ἑ' => 'ἑ', 'Ἒ' => 'ἒ', 'Ἓ' => 'ἓ', 'Ἔ' => 'ἔ', 'Ἕ' => 'ἕ', 'Ἠ' => 'ἠ', 'Ἡ' => 'ἡ', 'Ἢ' => 'ἢ', 'Ἣ' => 'ἣ', 'Ἤ' => 'ἤ', 'Ἥ' => 'ἥ', 'Ἦ' => 'ἦ', 'Ἧ' => 'ἧ', 'Ἰ' => 'ἰ', 'Ἱ' => 'ἱ', 'Ἲ' => 'ἲ', 'Ἳ' => 'ἳ', 'Ἴ' => 'ἴ', 'Ἵ' => 'ἵ', 'Ἶ' => 'ἶ', 'Ἷ' => 'ἷ', 'Ὀ' => 'ὀ', 'Ὁ' => 'ὁ', 'Ὂ' => 'ὂ', 'Ὃ' => 'ὃ', 'Ὄ' => 'ὄ', 'Ὅ' => 'ὅ', 'Ὑ' => 'ὑ', 'Ὓ' => 'ὓ', 'Ὕ' => 'ὕ', 'Ὗ' => 'ὗ', 'Ὠ' => 'ὠ', 'Ὡ' => 'ὡ', 'Ὢ' => 'ὢ', 'Ὣ' => 'ὣ', 'Ὤ' => 'ὤ', 'Ὥ' => 'ὥ', 'Ὦ' => 'ὦ', 'Ὧ' => 'ὧ', 'ᾈ' => 'ᾀ', 'ᾉ' => 'ᾁ', 'ᾊ' => 'ᾂ', 'ᾋ' => 'ᾃ', 'ᾌ' => 'ᾄ', 'ᾍ' => 'ᾅ', 'ᾎ' => 'ᾆ', 'ᾏ' => 'ᾇ', 'ᾘ' => 'ᾐ', 'ᾙ' => 'ᾑ', 'ᾚ' => 'ᾒ', 'ᾛ' => 'ᾓ', 'ᾜ' => 'ᾔ', 'ᾝ' => 'ᾕ', 'ᾞ' => 'ᾖ', 'ᾟ' => 'ᾗ', 'ᾨ' => 'ᾠ', 'ᾩ' => 'ᾡ', 'ᾪ' => 'ᾢ', 'ᾫ' => 'ᾣ', 'ᾬ' => 'ᾤ', 'ᾭ' => 'ᾥ', 'ᾮ' => 'ᾦ', 'ᾯ' => 'ᾧ', 'Ᾰ' => 'ᾰ', 'Ᾱ' => 'ᾱ', 'Ὰ' => 'ὰ', 'Ά' => 'ά', 'ᾼ' => 'ᾳ', 'Ὲ' => 'ὲ', 'Έ' => 'έ', 'Ὴ' => 'ὴ', 'Ή' => 'ή', 'ῌ' => 'ῃ', 'Ῐ' => 'ῐ', 'Ῑ' => 'ῑ', 'Ὶ' => 'ὶ', 'Ί' => 'ί', 'Ῠ' => 'ῠ', 'Ῡ' => 'ῡ', 'Ὺ' => 'ὺ', 'Ύ' => 'ύ', 'Ῥ' => 'ῥ', 'Ὸ' => 'ὸ', 'Ό' => 'ό', 'Ὼ' => 'ὼ', 'Ώ' => 'ώ', 'ῼ' => 'ῳ', 'Ω' => 'ω', 'K' => 'k', 'Å' => 'å', 'Ⅎ' => 'ⅎ', 'Ⅰ' => 'ⅰ', 'Ⅱ' => 'ⅱ', 'Ⅲ' => 'ⅲ', 'Ⅳ' => 'ⅳ', 'Ⅴ' => 'ⅴ', 'Ⅵ' => 'ⅵ', 'Ⅶ' => 'ⅶ', 'Ⅷ' => 'ⅷ', 'Ⅸ' => 'ⅸ', 'Ⅹ' => 'ⅹ', 'Ⅺ' => 'ⅺ', 'Ⅻ' => 'ⅻ', 'Ⅼ' => 'ⅼ', 'Ⅽ' => 'ⅽ', 'Ⅾ' => 'ⅾ', 'Ⅿ' => 'ⅿ', 'Ↄ' => 'ↄ', 'Ⓐ' => 'ⓐ', 'Ⓑ' => 'ⓑ', 'Ⓒ' => 'ⓒ', 'Ⓓ' => 'ⓓ', 'Ⓔ' => 'ⓔ', 'Ⓕ' => 'ⓕ', 'Ⓖ' => 'ⓖ', 'Ⓗ' => 'ⓗ', 'Ⓘ' => 'ⓘ', 'Ⓙ' => 'ⓙ', 'Ⓚ' => 'ⓚ', 'Ⓛ' => 'ⓛ', 'Ⓜ' => 'ⓜ', 'Ⓝ' => 'ⓝ', 'Ⓞ' => 'ⓞ', 'Ⓟ' => 'ⓟ', 'Ⓠ' => 'ⓠ', 'Ⓡ' => 'ⓡ', 'Ⓢ' => 'ⓢ', 'Ⓣ' => 'ⓣ', 'Ⓤ' => 'ⓤ', 'Ⓥ' => 'ⓥ', 'Ⓦ' => 'ⓦ', 'Ⓧ' => 'ⓧ', 'Ⓨ' => 'ⓨ', 'Ⓩ' => 'ⓩ', 'Ⰰ' => 'ⰰ', 'Ⰱ' => 'ⰱ', 'Ⰲ' => 'ⰲ', 'Ⰳ' => 'ⰳ', 'Ⰴ' => 'ⰴ', 'Ⰵ' => 'ⰵ', 'Ⰶ' => 'ⰶ', 'Ⰷ' => 'ⰷ', 'Ⰸ' => 'ⰸ', 'Ⰹ' => 'ⰹ', 'Ⰺ' => 'ⰺ', 'Ⰻ' => 'ⰻ', 'Ⰼ' => 'ⰼ', 'Ⰽ' => 'ⰽ', 'Ⰾ' => 'ⰾ', 'Ⰿ' => 'ⰿ', 'Ⱀ' => 'ⱀ', 'Ⱁ' => 'ⱁ', 'Ⱂ' => 'ⱂ', 'Ⱃ' => 'ⱃ', 'Ⱄ' => 'ⱄ', 'Ⱅ' => 'ⱅ', 'Ⱆ' => 'ⱆ', 'Ⱇ' => 'ⱇ', 'Ⱈ' => 'ⱈ', 'Ⱉ' => 'ⱉ', 'Ⱊ' => 'ⱊ', 'Ⱋ' => 'ⱋ', 'Ⱌ' => 'ⱌ', 'Ⱍ' => 'ⱍ', 'Ⱎ' => 'ⱎ', 'Ⱏ' => 'ⱏ', 'Ⱐ' => 'ⱐ', 'Ⱑ' => 'ⱑ', 'Ⱒ' => 'ⱒ', 'Ⱓ' => 'ⱓ', 'Ⱔ' => 'ⱔ', 'Ⱕ' => 'ⱕ', 'Ⱖ' => 'ⱖ', 'Ⱗ' => 'ⱗ', 'Ⱘ' => 'ⱘ', 'Ⱙ' => 'ⱙ', 'Ⱚ' => 'ⱚ', 'Ⱛ' => 'ⱛ', 'Ⱜ' => 'ⱜ', 'Ⱝ' => 'ⱝ', 'Ⱞ' => 'ⱞ', 'Ⱡ' => 'ⱡ', 'Ɫ' => 'ɫ', 'Ᵽ' => 'ᵽ', 'Ɽ' => 'ɽ', 'Ⱨ' => 'ⱨ', 'Ⱪ' => 'ⱪ', 'Ⱬ' => 'ⱬ', 'Ɑ' => 'ɑ', 'Ɱ' => 'ɱ', 'Ɐ' => 'ɐ', 'Ɒ' => 'ɒ', 'Ⱳ' => 'ⱳ', 'Ⱶ' => 'ⱶ', 'Ȿ' => 'ȿ', 'Ɀ' => 'ɀ', 'Ⲁ' => 'ⲁ', 'Ⲃ' => 'ⲃ', 'Ⲅ' => 'ⲅ', 'Ⲇ' => 'ⲇ', 'Ⲉ' => 'ⲉ', 'Ⲋ' => 'ⲋ', 'Ⲍ' => 'ⲍ', 'Ⲏ' => 'ⲏ', 'Ⲑ' => 'ⲑ', 'Ⲓ' => 'ⲓ', 'Ⲕ' => 'ⲕ', 'Ⲗ' => 'ⲗ', 'Ⲙ' => 'ⲙ', 'Ⲛ' => 'ⲛ', 'Ⲝ' => 'ⲝ', 'Ⲟ' => 'ⲟ', 'Ⲡ' => 'ⲡ', 'Ⲣ' => 'ⲣ', 'Ⲥ' => 'ⲥ', 'Ⲧ' => 'ⲧ', 'Ⲩ' => 'ⲩ', 'Ⲫ' => 'ⲫ', 'Ⲭ' => 'ⲭ', 'Ⲯ' => 'ⲯ', 'Ⲱ' => 'ⲱ', 'Ⲳ' => 'ⲳ', 'Ⲵ' => 'ⲵ', 'Ⲷ' => 'ⲷ', 'Ⲹ' => 'ⲹ', 'Ⲻ' => 'ⲻ', 'Ⲽ' => 'ⲽ', 'Ⲿ' => 'ⲿ', 'Ⳁ' => 'ⳁ', 'Ⳃ' => 'ⳃ', 'Ⳅ' => 'ⳅ', 'Ⳇ' => 'ⳇ', 'Ⳉ' => 'ⳉ', 'Ⳋ' => 'ⳋ', 'Ⳍ' => 'ⳍ', 'Ⳏ' => 'ⳏ', 'Ⳑ' => 'ⳑ', 'Ⳓ' => 'ⳓ', 'Ⳕ' => 'ⳕ', 'Ⳗ' => 'ⳗ', 'Ⳙ' => 'ⳙ', 'Ⳛ' => 'ⳛ', 'Ⳝ' => 'ⳝ', 'Ⳟ' => 'ⳟ', 'Ⳡ' => 'ⳡ', 'Ⳣ' => 'ⳣ', 'Ⳬ' => 'ⳬ', 'Ⳮ' => 'ⳮ', 'Ⳳ' => 'ⳳ', 'Ꙁ' => 'ꙁ', 'Ꙃ' => 'ꙃ', 'Ꙅ' => 'ꙅ', 'Ꙇ' => 'ꙇ', 'Ꙉ' => 'ꙉ', 'Ꙋ' => 'ꙋ', 'Ꙍ' => 'ꙍ', 'Ꙏ' => 'ꙏ', 'Ꙑ' => 'ꙑ', 'Ꙓ' => 'ꙓ', 'Ꙕ' => 'ꙕ', 'Ꙗ' => 'ꙗ', 'Ꙙ' => 'ꙙ', 'Ꙛ' => 'ꙛ', 'Ꙝ' => 'ꙝ', 'Ꙟ' => 'ꙟ', 'Ꙡ' => 'ꙡ', 'Ꙣ' => 'ꙣ', 'Ꙥ' => 'ꙥ', 'Ꙧ' => 'ꙧ', 'Ꙩ' => 'ꙩ', 'Ꙫ' => 'ꙫ', 'Ꙭ' => 'ꙭ', 'Ꚁ' => 'ꚁ', 'Ꚃ' => 'ꚃ', 'Ꚅ' => 'ꚅ', 'Ꚇ' => 'ꚇ', 'Ꚉ' => 'ꚉ', 'Ꚋ' => 'ꚋ', 'Ꚍ' => 'ꚍ', 'Ꚏ' => 'ꚏ', 'Ꚑ' => 'ꚑ', 'Ꚓ' => 'ꚓ', 'Ꚕ' => 'ꚕ', 'Ꚗ' => 'ꚗ', 'Ꚙ' => 'ꚙ', 'Ꚛ' => 'ꚛ', 'Ꜣ' => 'ꜣ', 'Ꜥ' => 'ꜥ', 'Ꜧ' => 'ꜧ', 'Ꜩ' => 'ꜩ', 'Ꜫ' => 'ꜫ', 'Ꜭ' => 'ꜭ', 'Ꜯ' => 'ꜯ', 'Ꜳ' => 'ꜳ', 'Ꜵ' => 'ꜵ', 'Ꜷ' => 'ꜷ', 'Ꜹ' => 'ꜹ', 'Ꜻ' => 'ꜻ', 'Ꜽ' => 'ꜽ', 'Ꜿ' => 'ꜿ', 'Ꝁ' => 'ꝁ', 'Ꝃ' => 'ꝃ', 'Ꝅ' => 'ꝅ', 'Ꝇ' => 'ꝇ', 'Ꝉ' => 'ꝉ', 'Ꝋ' => 'ꝋ', 'Ꝍ' => 'ꝍ', 'Ꝏ' => 'ꝏ', 'Ꝑ' => 'ꝑ', 'Ꝓ' => 'ꝓ', 'Ꝕ' => 'ꝕ', 'Ꝗ' => 'ꝗ', 'Ꝙ' => 'ꝙ', 'Ꝛ' => 'ꝛ', 'Ꝝ' => 'ꝝ', 'Ꝟ' => 'ꝟ', 'Ꝡ' => 'ꝡ', 'Ꝣ' => 'ꝣ', 'Ꝥ' => 'ꝥ', 'Ꝧ' => 'ꝧ', 'Ꝩ' => 'ꝩ', 'Ꝫ' => 'ꝫ', 'Ꝭ' => 'ꝭ', 'Ꝯ' => 'ꝯ', 'Ꝺ' => 'ꝺ', 'Ꝼ' => 'ꝼ', 'Ᵹ' => 'ᵹ', 'Ꝿ' => 'ꝿ', 'Ꞁ' => 'ꞁ', 'Ꞃ' => 'ꞃ', 'Ꞅ' => 'ꞅ', 'Ꞇ' => 'ꞇ', 'Ꞌ' => 'ꞌ', 'Ɥ' => 'ɥ', 'Ꞑ' => 'ꞑ', 'Ꞓ' => 'ꞓ', 'Ꞗ' => 'ꞗ', 'Ꞙ' => 'ꞙ', 'Ꞛ' => 'ꞛ', 'Ꞝ' => 'ꞝ', 'Ꞟ' => 'ꞟ', 'Ꞡ' => 'ꞡ', 'Ꞣ' => 'ꞣ', 'Ꞥ' => 'ꞥ', 'Ꞧ' => 'ꞧ', 'Ꞩ' => 'ꞩ', 'Ɦ' => 'ɦ', 'Ɜ' => 'ɜ', 'Ɡ' => 'ɡ', 'Ɬ' => 'ɬ', 'Ɪ' => 'ɪ', 'Ʞ' => 'ʞ', 'Ʇ' => 'ʇ', 'Ʝ' => 'ʝ', 'Ꭓ' => 'ꭓ', 'Ꞵ' => 'ꞵ', 'Ꞷ' => 'ꞷ', 'Ꞹ' => 'ꞹ', 'Ꞻ' => 'ꞻ', 'Ꞽ' => 'ꞽ', 'Ꞿ' => 'ꞿ', 'Ꟃ' => 'ꟃ', 'Ꞔ' => 'ꞔ', 'Ʂ' => 'ʂ', 'Ᶎ' => 'ᶎ', 'Ꟈ' => 'ꟈ', 'Ꟊ' => 'ꟊ', 'Ꟶ' => 'ꟶ', 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', '𐐀' => '𐐨', '𐐁' => '𐐩', '𐐂' => '𐐪', '𐐃' => '𐐫', '𐐄' => '𐐬', '𐐅' => '𐐭', '𐐆' => '𐐮', '𐐇' => '𐐯', '𐐈' => '𐐰', '𐐉' => '𐐱', '𐐊' => '𐐲', '𐐋' => '𐐳', '𐐌' => '𐐴', '𐐍' => '𐐵', '𐐎' => '𐐶', '𐐏' => '𐐷', '𐐐' => '𐐸', '𐐑' => '𐐹', '𐐒' => '𐐺', '𐐓' => '𐐻', '𐐔' => '𐐼', '𐐕' => '𐐽', '𐐖' => '𐐾', '𐐗' => '𐐿', '𐐘' => '𐑀', '𐐙' => '𐑁', '𐐚' => '𐑂', '𐐛' => '𐑃', '𐐜' => '𐑄', '𐐝' => '𐑅', '𐐞' => '𐑆', '𐐟' => '𐑇', '𐐠' => '𐑈', '𐐡' => '𐑉', '𐐢' => '𐑊', '𐐣' => '𐑋', '𐐤' => '𐑌', '𐐥' => '𐑍', '𐐦' => '𐑎', '𐐧' => '𐑏', '𐒰' => '𐓘', '𐒱' => '𐓙', '𐒲' => '𐓚', '𐒳' => '𐓛', '𐒴' => '𐓜', '𐒵' => '𐓝', '𐒶' => '𐓞', '𐒷' => '𐓟', '𐒸' => '𐓠', '𐒹' => '𐓡', '𐒺' => '𐓢', '𐒻' => '𐓣', '𐒼' => '𐓤', '𐒽' => '𐓥', '𐒾' => '𐓦', '𐒿' => '𐓧', '𐓀' => '𐓨', '𐓁' => '𐓩', '𐓂' => '𐓪', '𐓃' => '𐓫', '𐓄' => '𐓬', '𐓅' => '𐓭', '𐓆' => '𐓮', '𐓇' => '𐓯', '𐓈' => '𐓰', '𐓉' => '𐓱', '𐓊' => '𐓲', '𐓋' => '𐓳', '𐓌' => '𐓴', '𐓍' => '𐓵', '𐓎' => '𐓶', '𐓏' => '𐓷', '𐓐' => '𐓸', '𐓑' => '𐓹', '𐓒' => '𐓺', '𐓓' => '𐓻', '𐲀' => '𐳀', '𐲁' => '𐳁', '𐲂' => '𐳂', '𐲃' => '𐳃', '𐲄' => '𐳄', '𐲅' => '𐳅', '𐲆' => '𐳆', '𐲇' => '𐳇', '𐲈' => '𐳈', '𐲉' => '𐳉', '𐲊' => '𐳊', '𐲋' => '𐳋', '𐲌' => '𐳌', '𐲍' => '𐳍', '𐲎' => '𐳎', '𐲏' => '𐳏', '𐲐' => '𐳐', '𐲑' => '𐳑', '𐲒' => '𐳒', '𐲓' => '𐳓', '𐲔' => '𐳔', '𐲕' => '𐳕', '𐲖' => '𐳖', '𐲗' => '𐳗', '𐲘' => '𐳘', '𐲙' => '𐳙', '𐲚' => '𐳚', '𐲛' => '𐳛', '𐲜' => '𐳜', '𐲝' => '𐳝', '𐲞' => '𐳞', '𐲟' => '𐳟', '𐲠' => '𐳠', '𐲡' => '𐳡', '𐲢' => '𐳢', '𐲣' => '𐳣', '𐲤' => '𐳤', '𐲥' => '𐳥', '𐲦' => '𐳦', '𐲧' => '𐳧', '𐲨' => '𐳨', '𐲩' => '𐳩', '𐲪' => '𐳪', '𐲫' => '𐳫', '𐲬' => '𐳬', '𐲭' => '𐳭', '𐲮' => '𐳮', '𐲯' => '𐳯', '𐲰' => '𐳰', '𐲱' => '𐳱', '𐲲' => '𐳲', '𑢠' => '𑣀', '𑢡' => '𑣁', '𑢢' => '𑣂', '𑢣' => '𑣃', '𑢤' => '𑣄', '𑢥' => '𑣅', '𑢦' => '𑣆', '𑢧' => '𑣇', '𑢨' => '𑣈', '𑢩' => '𑣉', '𑢪' => '𑣊', '𑢫' => '𑣋', '𑢬' => '𑣌', '𑢭' => '𑣍', '𑢮' => '𑣎', '𑢯' => '𑣏', '𑢰' => '𑣐', '𑢱' => '𑣑', '𑢲' => '𑣒', '𑢳' => '𑣓', '𑢴' => '𑣔', '𑢵' => '𑣕', '𑢶' => '𑣖', '𑢷' => '𑣗', '𑢸' => '𑣘', '𑢹' => '𑣙', '𑢺' => '𑣚', '𑢻' => '𑣛', '𑢼' => '𑣜', '𑢽' => '𑣝', '𑢾' => '𑣞', '𑢿' => '𑣟', '𖹀' => '𖹠', '𖹁' => '𖹡', '𖹂' => '𖹢', '𖹃' => '𖹣', '𖹄' => '𖹤', '𖹅' => '𖹥', '𖹆' => '𖹦', '𖹇' => '𖹧', '𖹈' => '𖹨', '𖹉' => '𖹩', '𖹊' => '𖹪', '𖹋' => '𖹫', '𖹌' => '𖹬', '𖹍' => '𖹭', '𖹎' => '𖹮', '𖹏' => '𖹯', '𖹐' => '𖹰', '𖹑' => '𖹱', '𖹒' => '𖹲', '𖹓' => '𖹳', '𖹔' => '𖹴', '𖹕' => '𖹵', '𖹖' => '𖹶', '𖹗' => '𖹷', '𖹘' => '𖹸', '𖹙' => '𖹹', '𖹚' => '𖹺', '𖹛' => '𖹻', '𖹜' => '𖹼', '𖹝' => '𖹽', '𖹞' => '𖹾', '𖹟' => '𖹿', '𞤀' => '𞤢', '𞤁' => '𞤣', '𞤂' => '𞤤', '𞤃' => '𞤥', '𞤄' => '𞤦', '𞤅' => '𞤧', '𞤆' => '𞤨', '𞤇' => '𞤩', '𞤈' => '𞤪', '𞤉' => '𞤫', '𞤊' => '𞤬', '𞤋' => '𞤭', '𞤌' => '𞤮', '𞤍' => '𞤯', '𞤎' => '𞤰', '𞤏' => '𞤱', '𞤐' => '𞤲', '𞤑' => '𞤳', '𞤒' => '𞤴', '𞤓' => '𞤵', '𞤔' => '𞤶', '𞤕' => '𞤷', '𞤖' => '𞤸', '𞤗' => '𞤹', '𞤘' => '𞤺', '𞤙' => '𞤻', '𞤚' => '𞤼', '𞤛' => '𞤽', '𞤜' => '𞤾', '𞤝' => '𞤿', '𞤞' => '𞥀', '𞤟' => '𞥁', '𞤠' => '𞥂', '𞤡' => '𞥃', ); ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php ================================================ 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', 'µ' => 'Μ', 'à' => 'À', 'á' => 'Á', 'â' => 'Â', 'ã' => 'Ã', 'ä' => 'Ä', 'å' => 'Å', 'æ' => 'Æ', 'ç' => 'Ç', 'è' => 'È', 'é' => 'É', 'ê' => 'Ê', 'ë' => 'Ë', 'ì' => 'Ì', 'í' => 'Í', 'î' => 'Î', 'ï' => 'Ï', 'ð' => 'Ð', 'ñ' => 'Ñ', 'ò' => 'Ò', 'ó' => 'Ó', 'ô' => 'Ô', 'õ' => 'Õ', 'ö' => 'Ö', 'ø' => 'Ø', 'ù' => 'Ù', 'ú' => 'Ú', 'û' => 'Û', 'ü' => 'Ü', 'ý' => 'Ý', 'þ' => 'Þ', 'ÿ' => 'Ÿ', 'ā' => 'Ā', 'ă' => 'Ă', 'ą' => 'Ą', 'ć' => 'Ć', 'ĉ' => 'Ĉ', 'ċ' => 'Ċ', 'č' => 'Č', 'ď' => 'Ď', 'đ' => 'Đ', 'ē' => 'Ē', 'ĕ' => 'Ĕ', 'ė' => 'Ė', 'ę' => 'Ę', 'ě' => 'Ě', 'ĝ' => 'Ĝ', 'ğ' => 'Ğ', 'ġ' => 'Ġ', 'ģ' => 'Ģ', 'ĥ' => 'Ĥ', 'ħ' => 'Ħ', 'ĩ' => 'Ĩ', 'ī' => 'Ī', 'ĭ' => 'Ĭ', 'į' => 'Į', 'ı' => 'I', 'ij' => 'IJ', 'ĵ' => 'Ĵ', 'ķ' => 'Ķ', 'ĺ' => 'Ĺ', 'ļ' => 'Ļ', 'ľ' => 'Ľ', 'ŀ' => 'Ŀ', 'ł' => 'Ł', 'ń' => 'Ń', 'ņ' => 'Ņ', 'ň' => 'Ň', 'ŋ' => 'Ŋ', 'ō' => 'Ō', 'ŏ' => 'Ŏ', 'ő' => 'Ő', 'œ' => 'Œ', 'ŕ' => 'Ŕ', 'ŗ' => 'Ŗ', 'ř' => 'Ř', 'ś' => 'Ś', 'ŝ' => 'Ŝ', 'ş' => 'Ş', 'š' => 'Š', 'ţ' => 'Ţ', 'ť' => 'Ť', 'ŧ' => 'Ŧ', 'ũ' => 'Ũ', 'ū' => 'Ū', 'ŭ' => 'Ŭ', 'ů' => 'Ů', 'ű' => 'Ű', 'ų' => 'Ų', 'ŵ' => 'Ŵ', 'ŷ' => 'Ŷ', 'ź' => 'Ź', 'ż' => 'Ż', 'ž' => 'Ž', 'ſ' => 'S', 'ƀ' => 'Ƀ', 'ƃ' => 'Ƃ', 'ƅ' => 'Ƅ', 'ƈ' => 'Ƈ', 'ƌ' => 'Ƌ', 'ƒ' => 'Ƒ', 'ƕ' => 'Ƕ', 'ƙ' => 'Ƙ', 'ƚ' => 'Ƚ', 'ƞ' => 'Ƞ', 'ơ' => 'Ơ', 'ƣ' => 'Ƣ', 'ƥ' => 'Ƥ', 'ƨ' => 'Ƨ', 'ƭ' => 'Ƭ', 'ư' => 'Ư', 'ƴ' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'ƿ' => 'Ƿ', 'Dž' => 'DŽ', 'dž' => 'DŽ', 'Lj' => 'LJ', 'lj' => 'LJ', 'Nj' => 'NJ', 'nj' => 'NJ', 'ǎ' => 'Ǎ', 'ǐ' => 'Ǐ', 'ǒ' => 'Ǒ', 'ǔ' => 'Ǔ', 'ǖ' => 'Ǖ', 'ǘ' => 'Ǘ', 'ǚ' => 'Ǚ', 'ǜ' => 'Ǜ', 'ǝ' => 'Ǝ', 'ǟ' => 'Ǟ', 'ǡ' => 'Ǡ', 'ǣ' => 'Ǣ', 'ǥ' => 'Ǥ', 'ǧ' => 'Ǧ', 'ǩ' => 'Ǩ', 'ǫ' => 'Ǫ', 'ǭ' => 'Ǭ', 'ǯ' => 'Ǯ', 'Dz' => 'DZ', 'dz' => 'DZ', 'ǵ' => 'Ǵ', 'ǹ' => 'Ǹ', 'ǻ' => 'Ǻ', 'ǽ' => 'Ǽ', 'ǿ' => 'Ǿ', 'ȁ' => 'Ȁ', 'ȃ' => 'Ȃ', 'ȅ' => 'Ȅ', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'ȋ' => 'Ȋ', 'ȍ' => 'Ȍ', 'ȏ' => 'Ȏ', 'ȑ' => 'Ȑ', 'ȓ' => 'Ȓ', 'ȕ' => 'Ȕ', 'ȗ' => 'Ȗ', 'ș' => 'Ș', 'ț' => 'Ț', 'ȝ' => 'Ȝ', 'ȟ' => 'Ȟ', 'ȣ' => 'Ȣ', 'ȥ' => 'Ȥ', 'ȧ' => 'Ȧ', 'ȩ' => 'Ȩ', 'ȫ' => 'Ȫ', 'ȭ' => 'Ȭ', 'ȯ' => 'Ȯ', 'ȱ' => 'Ȱ', 'ȳ' => 'Ȳ', 'ȼ' => 'Ȼ', 'ȿ' => 'Ȿ', 'ɀ' => 'Ɀ', 'ɂ' => 'Ɂ', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'ɋ' => 'Ɋ', 'ɍ' => 'Ɍ', 'ɏ' => 'Ɏ', 'ɐ' => 'Ɐ', 'ɑ' => 'Ɑ', 'ɒ' => 'Ɒ', 'ɓ' => 'Ɓ', 'ɔ' => 'Ɔ', 'ɖ' => 'Ɖ', 'ɗ' => 'Ɗ', 'ə' => 'Ə', 'ɛ' => 'Ɛ', 'ɜ' => 'Ɜ', 'ɠ' => 'Ɠ', 'ɡ' => 'Ɡ', 'ɣ' => 'Ɣ', 'ɥ' => 'Ɥ', 'ɦ' => 'Ɦ', 'ɨ' => 'Ɨ', 'ɩ' => 'Ɩ', 'ɪ' => 'Ɪ', 'ɫ' => 'Ɫ', 'ɬ' => 'Ɬ', 'ɯ' => 'Ɯ', 'ɱ' => 'Ɱ', 'ɲ' => 'Ɲ', 'ɵ' => 'Ɵ', 'ɽ' => 'Ɽ', 'ʀ' => 'Ʀ', 'ʂ' => 'Ʂ', 'ʃ' => 'Ʃ', 'ʇ' => 'Ʇ', 'ʈ' => 'Ʈ', 'ʉ' => 'Ʉ', 'ʊ' => 'Ʊ', 'ʋ' => 'Ʋ', 'ʌ' => 'Ʌ', 'ʒ' => 'Ʒ', 'ʝ' => 'Ʝ', 'ʞ' => 'Ʞ', 'ͅ' => 'Ι', 'ͱ' => 'Ͱ', 'ͳ' => 'Ͳ', 'ͷ' => 'Ͷ', 'ͻ' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ͽ', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Β', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Μ', 'ν' => 'Ν', 'ξ' => 'Ξ', 'ο' => 'Ο', 'π' => 'Π', 'ρ' => 'Ρ', 'ς' => 'Σ', 'σ' => 'Σ', 'τ' => 'Τ', 'υ' => 'Υ', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ϊ' => 'Ϊ', 'ϋ' => 'Ϋ', 'ό' => 'Ό', 'ύ' => 'Ύ', 'ώ' => 'Ώ', 'ϐ' => 'Β', 'ϑ' => 'Θ', 'ϕ' => 'Φ', 'ϖ' => 'Π', 'ϗ' => 'Ϗ', 'ϙ' => 'Ϙ', 'ϛ' => 'Ϛ', 'ϝ' => 'Ϝ', 'ϟ' => 'Ϟ', 'ϡ' => 'Ϡ', 'ϣ' => 'Ϣ', 'ϥ' => 'Ϥ', 'ϧ' => 'Ϧ', 'ϩ' => 'Ϩ', 'ϫ' => 'Ϫ', 'ϭ' => 'Ϭ', 'ϯ' => 'Ϯ', 'ϰ' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Ϳ', 'ϵ' => 'Ε', 'ϸ' => 'Ϸ', 'ϻ' => 'Ϻ', 'а' => 'А', 'б' => 'Б', 'в' => 'В', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'М', 'н' => 'Н', 'о' => 'О', 'п' => 'П', 'р' => 'Р', 'с' => 'С', 'т' => 'Т', 'у' => 'У', 'ф' => 'Ф', 'х' => 'Х', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ъ' => 'Ъ', 'ы' => 'Ы', 'ь' => 'Ь', 'э' => 'Э', 'ю' => 'Ю', 'я' => 'Я', 'ѐ' => 'Ѐ', 'ё' => 'Ё', 'ђ' => 'Ђ', 'ѓ' => 'Ѓ', 'є' => 'Є', 'ѕ' => 'Ѕ', 'і' => 'І', 'ї' => 'Ї', 'ј' => 'Ј', 'љ' => 'Љ', 'њ' => 'Њ', 'ћ' => 'Ћ', 'ќ' => 'Ќ', 'ѝ' => 'Ѝ', 'ў' => 'Ў', 'џ' => 'Џ', 'ѡ' => 'Ѡ', 'ѣ' => 'Ѣ', 'ѥ' => 'Ѥ', 'ѧ' => 'Ѧ', 'ѩ' => 'Ѩ', 'ѫ' => 'Ѫ', 'ѭ' => 'Ѭ', 'ѯ' => 'Ѯ', 'ѱ' => 'Ѱ', 'ѳ' => 'Ѳ', 'ѵ' => 'Ѵ', 'ѷ' => 'Ѷ', 'ѹ' => 'Ѹ', 'ѻ' => 'Ѻ', 'ѽ' => 'Ѽ', 'ѿ' => 'Ѿ', 'ҁ' => 'Ҁ', 'ҋ' => 'Ҋ', 'ҍ' => 'Ҍ', 'ҏ' => 'Ҏ', 'ґ' => 'Ґ', 'ғ' => 'Ғ', 'ҕ' => 'Ҕ', 'җ' => 'Җ', 'ҙ' => 'Ҙ', 'қ' => 'Қ', 'ҝ' => 'Ҝ', 'ҟ' => 'Ҟ', 'ҡ' => 'Ҡ', 'ң' => 'Ң', 'ҥ' => 'Ҥ', 'ҧ' => 'Ҧ', 'ҩ' => 'Ҩ', 'ҫ' => 'Ҫ', 'ҭ' => 'Ҭ', 'ү' => 'Ү', 'ұ' => 'Ұ', 'ҳ' => 'Ҳ', 'ҵ' => 'Ҵ', 'ҷ' => 'Ҷ', 'ҹ' => 'Ҹ', 'һ' => 'Һ', 'ҽ' => 'Ҽ', 'ҿ' => 'Ҿ', 'ӂ' => 'Ӂ', 'ӄ' => 'Ӄ', 'ӆ' => 'Ӆ', 'ӈ' => 'Ӈ', 'ӊ' => 'Ӊ', 'ӌ' => 'Ӌ', 'ӎ' => 'Ӎ', 'ӏ' => 'Ӏ', 'ӑ' => 'Ӑ', 'ӓ' => 'Ӓ', 'ӕ' => 'Ӕ', 'ӗ' => 'Ӗ', 'ә' => 'Ә', 'ӛ' => 'Ӛ', 'ӝ' => 'Ӝ', 'ӟ' => 'Ӟ', 'ӡ' => 'Ӡ', 'ӣ' => 'Ӣ', 'ӥ' => 'Ӥ', 'ӧ' => 'Ӧ', 'ө' => 'Ө', 'ӫ' => 'Ӫ', 'ӭ' => 'Ӭ', 'ӯ' => 'Ӯ', 'ӱ' => 'Ӱ', 'ӳ' => 'Ӳ', 'ӵ' => 'Ӵ', 'ӷ' => 'Ӷ', 'ӹ' => 'Ӹ', 'ӻ' => 'Ӻ', 'ӽ' => 'Ӽ', 'ӿ' => 'Ӿ', 'ԁ' => 'Ԁ', 'ԃ' => 'Ԃ', 'ԅ' => 'Ԅ', 'ԇ' => 'Ԇ', 'ԉ' => 'Ԉ', 'ԋ' => 'Ԋ', 'ԍ' => 'Ԍ', 'ԏ' => 'Ԏ', 'ԑ' => 'Ԑ', 'ԓ' => 'Ԓ', 'ԕ' => 'Ԕ', 'ԗ' => 'Ԗ', 'ԙ' => 'Ԙ', 'ԛ' => 'Ԛ', 'ԝ' => 'Ԝ', 'ԟ' => 'Ԟ', 'ԡ' => 'Ԡ', 'ԣ' => 'Ԣ', 'ԥ' => 'Ԥ', 'ԧ' => 'Ԧ', 'ԩ' => 'Ԩ', 'ԫ' => 'Ԫ', 'ԭ' => 'Ԭ', 'ԯ' => 'Ԯ', 'ա' => 'Ա', 'բ' => 'Բ', 'գ' => 'Գ', 'դ' => 'Դ', 'ե' => 'Ե', 'զ' => 'Զ', 'է' => 'Է', 'ը' => 'Ը', 'թ' => 'Թ', 'ժ' => 'Ժ', 'ի' => 'Ի', 'լ' => 'Լ', 'խ' => 'Խ', 'ծ' => 'Ծ', 'կ' => 'Կ', 'հ' => 'Հ', 'ձ' => 'Ձ', 'ղ' => 'Ղ', 'ճ' => 'Ճ', 'մ' => 'Մ', 'յ' => 'Յ', 'ն' => 'Ն', 'շ' => 'Շ', 'ո' => 'Ո', 'չ' => 'Չ', 'պ' => 'Պ', 'ջ' => 'Ջ', 'ռ' => 'Ռ', 'ս' => 'Ս', 'վ' => 'Վ', 'տ' => 'Տ', 'ր' => 'Ր', 'ց' => 'Ց', 'ւ' => 'Ւ', 'փ' => 'Փ', 'ք' => 'Ք', 'օ' => 'Օ', 'ֆ' => 'Ֆ', 'ა' => 'Ა', 'ბ' => 'Ბ', 'გ' => 'Გ', 'დ' => 'Დ', 'ე' => 'Ე', 'ვ' => 'Ვ', 'ზ' => 'Ზ', 'თ' => 'Თ', 'ი' => 'Ი', 'კ' => 'Კ', 'ლ' => 'Ლ', 'მ' => 'Მ', 'ნ' => 'Ნ', 'ო' => 'Ო', 'პ' => 'Პ', 'ჟ' => 'Ჟ', 'რ' => 'Რ', 'ს' => 'Ს', 'ტ' => 'Ტ', 'უ' => 'Უ', 'ფ' => 'Ფ', 'ქ' => 'Ქ', 'ღ' => 'Ღ', 'ყ' => 'Ყ', 'შ' => 'Შ', 'ჩ' => 'Ჩ', 'ც' => 'Ც', 'ძ' => 'Ძ', 'წ' => 'Წ', 'ჭ' => 'Ჭ', 'ხ' => 'Ხ', 'ჯ' => 'Ჯ', 'ჰ' => 'Ჰ', 'ჱ' => 'Ჱ', 'ჲ' => 'Ჲ', 'ჳ' => 'Ჳ', 'ჴ' => 'Ჴ', 'ჵ' => 'Ჵ', 'ჶ' => 'Ჶ', 'ჷ' => 'Ჷ', 'ჸ' => 'Ჸ', 'ჹ' => 'Ჹ', 'ჺ' => 'Ჺ', 'ჽ' => 'Ჽ', 'ჾ' => 'Ჾ', 'ჿ' => 'Ჿ', 'ᏸ' => 'Ᏸ', 'ᏹ' => 'Ᏹ', 'ᏺ' => 'Ᏺ', 'ᏻ' => 'Ᏻ', 'ᏼ' => 'Ᏼ', 'ᏽ' => 'Ᏽ', 'ᲀ' => 'В', 'ᲁ' => 'Д', 'ᲂ' => 'О', 'ᲃ' => 'С', 'ᲄ' => 'Т', 'ᲅ' => 'Т', 'ᲆ' => 'Ъ', 'ᲇ' => 'Ѣ', 'ᲈ' => 'Ꙋ', 'ᵹ' => 'Ᵹ', 'ᵽ' => 'Ᵽ', 'ᶎ' => 'Ᶎ', 'ḁ' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'ḍ' => 'Ḍ', 'ḏ' => 'Ḏ', 'ḑ' => 'Ḑ', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'ḝ' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'ṁ' => 'Ṁ', 'ṃ' => 'Ṃ', 'ṅ' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'ṍ' => 'Ṍ', 'ṏ' => 'Ṏ', 'ṑ' => 'Ṑ', 'ṓ' => 'Ṓ', 'ṕ' => 'Ṕ', 'ṗ' => 'Ṗ', 'ṙ' => 'Ṙ', 'ṛ' => 'Ṛ', 'ṝ' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'Ṡ', 'ṣ' => 'Ṣ', 'ṥ' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'ṭ' => 'Ṭ', 'ṯ' => 'Ṯ', 'ṱ' => 'Ṱ', 'ṳ' => 'Ṳ', 'ṵ' => 'Ṵ', 'ṷ' => 'Ṷ', 'ṹ' => 'Ṹ', 'ṻ' => 'Ṻ', 'ṽ' => 'Ṽ', 'ṿ' => 'Ṿ', 'ẁ' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'ẍ' => 'Ẍ', 'ẏ' => 'Ẏ', 'ẑ' => 'Ẑ', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'Ṡ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'ề' => 'Ề', 'ể' => 'Ể', 'ễ' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'ọ' => 'Ọ', 'ỏ' => 'Ỏ', 'ố' => 'Ố', 'ồ' => 'Ồ', 'ổ' => 'Ổ', 'ỗ' => 'Ỗ', 'ộ' => 'Ộ', 'ớ' => 'Ớ', 'ờ' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'Ỡ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'ử' => 'Ử', 'ữ' => 'Ữ', 'ự' => 'Ự', 'ỳ' => 'Ỳ', 'ỵ' => 'Ỵ', 'ỷ' => 'Ỷ', 'ỹ' => 'Ỹ', 'ỻ' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'ἀ' => 'Ἀ', 'ἁ' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'ἅ' => 'Ἅ', 'ἆ' => 'Ἆ', 'ἇ' => 'Ἇ', 'ἐ' => 'Ἐ', 'ἑ' => 'Ἑ', 'ἒ' => 'Ἒ', 'ἓ' => 'Ἓ', 'ἔ' => 'Ἔ', 'ἕ' => 'Ἕ', 'ἠ' => 'Ἠ', 'ἡ' => 'Ἡ', 'ἢ' => 'Ἢ', 'ἣ' => 'Ἣ', 'ἤ' => 'Ἤ', 'ἥ' => 'Ἥ', 'ἦ' => 'Ἦ', 'ἧ' => 'Ἧ', 'ἰ' => 'Ἰ', 'ἱ' => 'Ἱ', 'ἲ' => 'Ἲ', 'ἳ' => 'Ἳ', 'ἴ' => 'Ἴ', 'ἵ' => 'Ἵ', 'ἶ' => 'Ἶ', 'ἷ' => 'Ἷ', 'ὀ' => 'Ὀ', 'ὁ' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'ὅ' => 'Ὅ', 'ὑ' => 'Ὑ', 'ὓ' => 'Ὓ', 'ὕ' => 'Ὕ', 'ὗ' => 'Ὗ', 'ὠ' => 'Ὠ', 'ὡ' => 'Ὡ', 'ὢ' => 'Ὢ', 'ὣ' => 'Ὣ', 'ὤ' => 'Ὤ', 'ὥ' => 'Ὥ', 'ὦ' => 'Ὦ', 'ὧ' => 'Ὧ', 'ὰ' => 'Ὰ', 'ά' => 'Ά', 'ὲ' => 'Ὲ', 'έ' => 'Έ', 'ὴ' => 'Ὴ', 'ή' => 'Ή', 'ὶ' => 'Ὶ', 'ί' => 'Ί', 'ὸ' => 'Ὸ', 'ό' => 'Ό', 'ὺ' => 'Ὺ', 'ύ' => 'Ύ', 'ὼ' => 'Ὼ', 'ώ' => 'Ώ', 'ᾀ' => 'ᾈ', 'ᾁ' => 'ᾉ', 'ᾂ' => 'ᾊ', 'ᾃ' => 'ᾋ', 'ᾄ' => 'ᾌ', 'ᾅ' => 'ᾍ', 'ᾆ' => 'ᾎ', 'ᾇ' => 'ᾏ', 'ᾐ' => 'ᾘ', 'ᾑ' => 'ᾙ', 'ᾒ' => 'ᾚ', 'ᾓ' => 'ᾛ', 'ᾔ' => 'ᾜ', 'ᾕ' => 'ᾝ', 'ᾖ' => 'ᾞ', 'ᾗ' => 'ᾟ', 'ᾠ' => 'ᾨ', 'ᾡ' => 'ᾩ', 'ᾢ' => 'ᾪ', 'ᾣ' => 'ᾫ', 'ᾤ' => 'ᾬ', 'ᾥ' => 'ᾭ', 'ᾦ' => 'ᾮ', 'ᾧ' => 'ᾯ', 'ᾰ' => 'Ᾰ', 'ᾱ' => 'Ᾱ', 'ᾳ' => 'ᾼ', 'ι' => 'Ι', 'ῃ' => 'ῌ', 'ῐ' => 'Ῐ', 'ῑ' => 'Ῑ', 'ῠ' => 'Ῠ', 'ῡ' => 'Ῡ', 'ῥ' => 'Ῥ', 'ῳ' => 'ῼ', 'ⅎ' => 'Ⅎ', 'ⅰ' => 'Ⅰ', 'ⅱ' => 'Ⅱ', 'ⅲ' => 'Ⅲ', 'ⅳ' => 'Ⅳ', 'ⅴ' => 'Ⅴ', 'ⅵ' => 'Ⅵ', 'ⅶ' => 'Ⅶ', 'ⅷ' => 'Ⅷ', 'ⅸ' => 'Ⅸ', 'ⅹ' => 'Ⅹ', 'ⅺ' => 'Ⅺ', 'ⅻ' => 'Ⅻ', 'ⅼ' => 'Ⅼ', 'ⅽ' => 'Ⅽ', 'ⅾ' => 'Ⅾ', 'ⅿ' => 'Ⅿ', 'ↄ' => 'Ↄ', 'ⓐ' => 'Ⓐ', 'ⓑ' => 'Ⓑ', 'ⓒ' => 'Ⓒ', 'ⓓ' => 'Ⓓ', 'ⓔ' => 'Ⓔ', 'ⓕ' => 'Ⓕ', 'ⓖ' => 'Ⓖ', 'ⓗ' => 'Ⓗ', 'ⓘ' => 'Ⓘ', 'ⓙ' => 'Ⓙ', 'ⓚ' => 'Ⓚ', 'ⓛ' => 'Ⓛ', 'ⓜ' => 'Ⓜ', 'ⓝ' => 'Ⓝ', 'ⓞ' => 'Ⓞ', 'ⓟ' => 'Ⓟ', 'ⓠ' => 'Ⓠ', 'ⓡ' => 'Ⓡ', 'ⓢ' => 'Ⓢ', 'ⓣ' => 'Ⓣ', 'ⓤ' => 'Ⓤ', 'ⓥ' => 'Ⓥ', 'ⓦ' => 'Ⓦ', 'ⓧ' => 'Ⓧ', 'ⓨ' => 'Ⓨ', 'ⓩ' => 'Ⓩ', 'ⰰ' => 'Ⰰ', 'ⰱ' => 'Ⰱ', 'ⰲ' => 'Ⰲ', 'ⰳ' => 'Ⰳ', 'ⰴ' => 'Ⰴ', 'ⰵ' => 'Ⰵ', 'ⰶ' => 'Ⰶ', 'ⰷ' => 'Ⰷ', 'ⰸ' => 'Ⰸ', 'ⰹ' => 'Ⰹ', 'ⰺ' => 'Ⰺ', 'ⰻ' => 'Ⰻ', 'ⰼ' => 'Ⰼ', 'ⰽ' => 'Ⰽ', 'ⰾ' => 'Ⰾ', 'ⰿ' => 'Ⰿ', 'ⱀ' => 'Ⱀ', 'ⱁ' => 'Ⱁ', 'ⱂ' => 'Ⱂ', 'ⱃ' => 'Ⱃ', 'ⱄ' => 'Ⱄ', 'ⱅ' => 'Ⱅ', 'ⱆ' => 'Ⱆ', 'ⱇ' => 'Ⱇ', 'ⱈ' => 'Ⱈ', 'ⱉ' => 'Ⱉ', 'ⱊ' => 'Ⱊ', 'ⱋ' => 'Ⱋ', 'ⱌ' => 'Ⱌ', 'ⱍ' => 'Ⱍ', 'ⱎ' => 'Ⱎ', 'ⱏ' => 'Ⱏ', 'ⱐ' => 'Ⱐ', 'ⱑ' => 'Ⱑ', 'ⱒ' => 'Ⱒ', 'ⱓ' => 'Ⱓ', 'ⱔ' => 'Ⱔ', 'ⱕ' => 'Ⱕ', 'ⱖ' => 'Ⱖ', 'ⱗ' => 'Ⱗ', 'ⱘ' => 'Ⱘ', 'ⱙ' => 'Ⱙ', 'ⱚ' => 'Ⱚ', 'ⱛ' => 'Ⱛ', 'ⱜ' => 'Ⱜ', 'ⱝ' => 'Ⱝ', 'ⱞ' => 'Ⱞ', 'ⱡ' => 'Ⱡ', 'ⱥ' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'ⱳ' => 'Ⱳ', 'ⱶ' => 'Ⱶ', 'ⲁ' => 'Ⲁ', 'ⲃ' => 'Ⲃ', 'ⲅ' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'ⲍ' => 'Ⲍ', 'ⲏ' => 'Ⲏ', 'ⲑ' => 'Ⲑ', 'ⲓ' => 'Ⲓ', 'ⲕ' => 'Ⲕ', 'ⲗ' => 'Ⲗ', 'ⲙ' => 'Ⲙ', 'ⲛ' => 'Ⲛ', 'ⲝ' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'Ⲡ', 'ⲣ' => 'Ⲣ', 'ⲥ' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'ⲭ' => 'Ⲭ', 'ⲯ' => 'Ⲯ', 'ⲱ' => 'Ⲱ', 'ⲳ' => 'Ⲳ', 'ⲵ' => 'Ⲵ', 'ⲷ' => 'Ⲷ', 'ⲹ' => 'Ⲹ', 'ⲻ' => 'Ⲻ', 'ⲽ' => 'Ⲽ', 'ⲿ' => 'Ⲿ', 'ⳁ' => 'Ⳁ', 'ⳃ' => 'Ⳃ', 'ⳅ' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'ⳍ' => 'Ⳍ', 'ⳏ' => 'Ⳏ', 'ⳑ' => 'Ⳑ', 'ⳓ' => 'Ⳓ', 'ⳕ' => 'Ⳕ', 'ⳗ' => 'Ⳗ', 'ⳙ' => 'Ⳙ', 'ⳛ' => 'Ⳛ', 'ⳝ' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'Ⳡ', 'ⳣ' => 'Ⳣ', 'ⳬ' => 'Ⳬ', 'ⳮ' => 'Ⳮ', 'ⳳ' => 'Ⳳ', 'ⴀ' => 'Ⴀ', 'ⴁ' => 'Ⴁ', 'ⴂ' => 'Ⴂ', 'ⴃ' => 'Ⴃ', 'ⴄ' => 'Ⴄ', 'ⴅ' => 'Ⴅ', 'ⴆ' => 'Ⴆ', 'ⴇ' => 'Ⴇ', 'ⴈ' => 'Ⴈ', 'ⴉ' => 'Ⴉ', 'ⴊ' => 'Ⴊ', 'ⴋ' => 'Ⴋ', 'ⴌ' => 'Ⴌ', 'ⴍ' => 'Ⴍ', 'ⴎ' => 'Ⴎ', 'ⴏ' => 'Ⴏ', 'ⴐ' => 'Ⴐ', 'ⴑ' => 'Ⴑ', 'ⴒ' => 'Ⴒ', 'ⴓ' => 'Ⴓ', 'ⴔ' => 'Ⴔ', 'ⴕ' => 'Ⴕ', 'ⴖ' => 'Ⴖ', 'ⴗ' => 'Ⴗ', 'ⴘ' => 'Ⴘ', 'ⴙ' => 'Ⴙ', 'ⴚ' => 'Ⴚ', 'ⴛ' => 'Ⴛ', 'ⴜ' => 'Ⴜ', 'ⴝ' => 'Ⴝ', 'ⴞ' => 'Ⴞ', 'ⴟ' => 'Ⴟ', 'ⴠ' => 'Ⴠ', 'ⴡ' => 'Ⴡ', 'ⴢ' => 'Ⴢ', 'ⴣ' => 'Ⴣ', 'ⴤ' => 'Ⴤ', 'ⴥ' => 'Ⴥ', 'ⴧ' => 'Ⴧ', 'ⴭ' => 'Ⴭ', 'ꙁ' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ꙅ' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ꙍ' => 'Ꙍ', 'ꙏ' => 'Ꙏ', 'ꙑ' => 'Ꙑ', 'ꙓ' => 'Ꙓ', 'ꙕ' => 'Ꙕ', 'ꙗ' => 'Ꙗ', 'ꙙ' => 'Ꙙ', 'ꙛ' => 'Ꙛ', 'ꙝ' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'Ꙡ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ꙭ' => 'Ꙭ', 'ꚁ' => 'Ꚁ', 'ꚃ' => 'Ꚃ', 'ꚅ' => 'Ꚅ', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'ꚋ' => 'Ꚋ', 'ꚍ' => 'Ꚍ', 'ꚏ' => 'Ꚏ', 'ꚑ' => 'Ꚑ', 'ꚓ' => 'Ꚓ', 'ꚕ' => 'Ꚕ', 'ꚗ' => 'Ꚗ', 'ꚙ' => 'Ꚙ', 'ꚛ' => 'Ꚛ', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ꝁ' => 'Ꝁ', 'ꝃ' => 'Ꝃ', 'ꝅ' => 'Ꝅ', 'ꝇ' => 'Ꝇ', 'ꝉ' => 'Ꝉ', 'ꝋ' => 'Ꝋ', 'ꝍ' => 'Ꝍ', 'ꝏ' => 'Ꝏ', 'ꝑ' => 'Ꝑ', 'ꝓ' => 'Ꝓ', 'ꝕ' => 'Ꝕ', 'ꝗ' => 'Ꝗ', 'ꝙ' => 'Ꝙ', 'ꝛ' => 'Ꝛ', 'ꝝ' => 'Ꝝ', 'ꝟ' => 'Ꝟ', 'ꝡ' => 'Ꝡ', 'ꝣ' => 'Ꝣ', 'ꝥ' => 'Ꝥ', 'ꝧ' => 'Ꝧ', 'ꝩ' => 'Ꝩ', 'ꝫ' => 'Ꝫ', 'ꝭ' => 'Ꝭ', 'ꝯ' => 'Ꝯ', 'ꝺ' => 'Ꝺ', 'ꝼ' => 'Ꝼ', 'ꝿ' => 'Ꝿ', 'ꞁ' => 'Ꞁ', 'ꞃ' => 'Ꞃ', 'ꞅ' => 'Ꞅ', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'Ꞌ', 'ꞑ' => 'Ꞑ', 'ꞓ' => 'Ꞓ', 'ꞔ' => 'Ꞔ', 'ꞗ' => 'Ꞗ', 'ꞙ' => 'Ꞙ', 'ꞛ' => 'Ꞛ', 'ꞝ' => 'Ꞝ', 'ꞟ' => 'Ꞟ', 'ꞡ' => 'Ꞡ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'ꞩ' => 'Ꞩ', 'ꞵ' => 'Ꞵ', 'ꞷ' => 'Ꞷ', 'ꞹ' => 'Ꞹ', 'ꞻ' => 'Ꞻ', 'ꞽ' => 'Ꞽ', 'ꞿ' => 'Ꞿ', 'ꟃ' => 'Ꟃ', 'ꟈ' => 'Ꟈ', 'ꟊ' => 'Ꟊ', 'ꟶ' => 'Ꟶ', 'ꭓ' => 'Ꭓ', 'ꭰ' => 'Ꭰ', 'ꭱ' => 'Ꭱ', 'ꭲ' => 'Ꭲ', 'ꭳ' => 'Ꭳ', 'ꭴ' => 'Ꭴ', 'ꭵ' => 'Ꭵ', 'ꭶ' => 'Ꭶ', 'ꭷ' => 'Ꭷ', 'ꭸ' => 'Ꭸ', 'ꭹ' => 'Ꭹ', 'ꭺ' => 'Ꭺ', 'ꭻ' => 'Ꭻ', 'ꭼ' => 'Ꭼ', 'ꭽ' => 'Ꭽ', 'ꭾ' => 'Ꭾ', 'ꭿ' => 'Ꭿ', 'ꮀ' => 'Ꮀ', 'ꮁ' => 'Ꮁ', 'ꮂ' => 'Ꮂ', 'ꮃ' => 'Ꮃ', 'ꮄ' => 'Ꮄ', 'ꮅ' => 'Ꮅ', 'ꮆ' => 'Ꮆ', 'ꮇ' => 'Ꮇ', 'ꮈ' => 'Ꮈ', 'ꮉ' => 'Ꮉ', 'ꮊ' => 'Ꮊ', 'ꮋ' => 'Ꮋ', 'ꮌ' => 'Ꮌ', 'ꮍ' => 'Ꮍ', 'ꮎ' => 'Ꮎ', 'ꮏ' => 'Ꮏ', 'ꮐ' => 'Ꮐ', 'ꮑ' => 'Ꮑ', 'ꮒ' => 'Ꮒ', 'ꮓ' => 'Ꮓ', 'ꮔ' => 'Ꮔ', 'ꮕ' => 'Ꮕ', 'ꮖ' => 'Ꮖ', 'ꮗ' => 'Ꮗ', 'ꮘ' => 'Ꮘ', 'ꮙ' => 'Ꮙ', 'ꮚ' => 'Ꮚ', 'ꮛ' => 'Ꮛ', 'ꮜ' => 'Ꮜ', 'ꮝ' => 'Ꮝ', 'ꮞ' => 'Ꮞ', 'ꮟ' => 'Ꮟ', 'ꮠ' => 'Ꮠ', 'ꮡ' => 'Ꮡ', 'ꮢ' => 'Ꮢ', 'ꮣ' => 'Ꮣ', 'ꮤ' => 'Ꮤ', 'ꮥ' => 'Ꮥ', 'ꮦ' => 'Ꮦ', 'ꮧ' => 'Ꮧ', 'ꮨ' => 'Ꮨ', 'ꮩ' => 'Ꮩ', 'ꮪ' => 'Ꮪ', 'ꮫ' => 'Ꮫ', 'ꮬ' => 'Ꮬ', 'ꮭ' => 'Ꮭ', 'ꮮ' => 'Ꮮ', 'ꮯ' => 'Ꮯ', 'ꮰ' => 'Ꮰ', 'ꮱ' => 'Ꮱ', 'ꮲ' => 'Ꮲ', 'ꮳ' => 'Ꮳ', 'ꮴ' => 'Ꮴ', 'ꮵ' => 'Ꮵ', 'ꮶ' => 'Ꮶ', 'ꮷ' => 'Ꮷ', 'ꮸ' => 'Ꮸ', 'ꮹ' => 'Ꮹ', 'ꮺ' => 'Ꮺ', 'ꮻ' => 'Ꮻ', 'ꮼ' => 'Ꮼ', 'ꮽ' => 'Ꮽ', 'ꮾ' => 'Ꮾ', 'ꮿ' => 'Ꮿ', 'a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', '𐐨' => '𐐀', '𐐩' => '𐐁', '𐐪' => '𐐂', '𐐫' => '𐐃', '𐐬' => '𐐄', '𐐭' => '𐐅', '𐐮' => '𐐆', '𐐯' => '𐐇', '𐐰' => '𐐈', '𐐱' => '𐐉', '𐐲' => '𐐊', '𐐳' => '𐐋', '𐐴' => '𐐌', '𐐵' => '𐐍', '𐐶' => '𐐎', '𐐷' => '𐐏', '𐐸' => '𐐐', '𐐹' => '𐐑', '𐐺' => '𐐒', '𐐻' => '𐐓', '𐐼' => '𐐔', '𐐽' => '𐐕', '𐐾' => '𐐖', '𐐿' => '𐐗', '𐑀' => '𐐘', '𐑁' => '𐐙', '𐑂' => '𐐚', '𐑃' => '𐐛', '𐑄' => '𐐜', '𐑅' => '𐐝', '𐑆' => '𐐞', '𐑇' => '𐐟', '𐑈' => '𐐠', '𐑉' => '𐐡', '𐑊' => '𐐢', '𐑋' => '𐐣', '𐑌' => '𐐤', '𐑍' => '𐐥', '𐑎' => '𐐦', '𐑏' => '𐐧', '𐓘' => '𐒰', '𐓙' => '𐒱', '𐓚' => '𐒲', '𐓛' => '𐒳', '𐓜' => '𐒴', '𐓝' => '𐒵', '𐓞' => '𐒶', '𐓟' => '𐒷', '𐓠' => '𐒸', '𐓡' => '𐒹', '𐓢' => '𐒺', '𐓣' => '𐒻', '𐓤' => '𐒼', '𐓥' => '𐒽', '𐓦' => '𐒾', '𐓧' => '𐒿', '𐓨' => '𐓀', '𐓩' => '𐓁', '𐓪' => '𐓂', '𐓫' => '𐓃', '𐓬' => '𐓄', '𐓭' => '𐓅', '𐓮' => '𐓆', '𐓯' => '𐓇', '𐓰' => '𐓈', '𐓱' => '𐓉', '𐓲' => '𐓊', '𐓳' => '𐓋', '𐓴' => '𐓌', '𐓵' => '𐓍', '𐓶' => '𐓎', '𐓷' => '𐓏', '𐓸' => '𐓐', '𐓹' => '𐓑', '𐓺' => '𐓒', '𐓻' => '𐓓', '𐳀' => '𐲀', '𐳁' => '𐲁', '𐳂' => '𐲂', '𐳃' => '𐲃', '𐳄' => '𐲄', '𐳅' => '𐲅', '𐳆' => '𐲆', '𐳇' => '𐲇', '𐳈' => '𐲈', '𐳉' => '𐲉', '𐳊' => '𐲊', '𐳋' => '𐲋', '𐳌' => '𐲌', '𐳍' => '𐲍', '𐳎' => '𐲎', '𐳏' => '𐲏', '𐳐' => '𐲐', '𐳑' => '𐲑', '𐳒' => '𐲒', '𐳓' => '𐲓', '𐳔' => '𐲔', '𐳕' => '𐲕', '𐳖' => '𐲖', '𐳗' => '𐲗', '𐳘' => '𐲘', '𐳙' => '𐲙', '𐳚' => '𐲚', '𐳛' => '𐲛', '𐳜' => '𐲜', '𐳝' => '𐲝', '𐳞' => '𐲞', '𐳟' => '𐲟', '𐳠' => '𐲠', '𐳡' => '𐲡', '𐳢' => '𐲢', '𐳣' => '𐲣', '𐳤' => '𐲤', '𐳥' => '𐲥', '𐳦' => '𐲦', '𐳧' => '𐲧', '𐳨' => '𐲨', '𐳩' => '𐲩', '𐳪' => '𐲪', '𐳫' => '𐲫', '𐳬' => '𐲬', '𐳭' => '𐲭', '𐳮' => '𐲮', '𐳯' => '𐲯', '𐳰' => '𐲰', '𐳱' => '𐲱', '𐳲' => '𐲲', '𑣀' => '𑢠', '𑣁' => '𑢡', '𑣂' => '𑢢', '𑣃' => '𑢣', '𑣄' => '𑢤', '𑣅' => '𑢥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', '𑣍' => '𑢭', '𑣎' => '𑢮', '𑣏' => '𑢯', '𑣐' => '𑢰', '𑣑' => '𑢱', '𑣒' => '𑢲', '𑣓' => '𑢳', '𑣔' => '𑢴', '𑣕' => '𑢵', '𑣖' => '𑢶', '𑣗' => '𑢷', '𑣘' => '𑢸', '𑣙' => '𑢹', '𑣚' => '𑢺', '𑣛' => '𑢻', '𑣜' => '𑢼', '𑣝' => '𑢽', '𑣞' => '𑢾', '𑣟' => '𑢿', '𖹠' => '𖹀', '𖹡' => '𖹁', '𖹢' => '𖹂', '𖹣' => '𖹃', '𖹤' => '𖹄', '𖹥' => '𖹅', '𖹦' => '𖹆', '𖹧' => '𖹇', '𖹨' => '𖹈', '𖹩' => '𖹉', '𖹪' => '𖹊', '𖹫' => '𖹋', '𖹬' => '𖹌', '𖹭' => '𖹍', '𖹮' => '𖹎', '𖹯' => '𖹏', '𖹰' => '𖹐', '𖹱' => '𖹑', '𖹲' => '𖹒', '𖹳' => '𖹓', '𖹴' => '𖹔', '𖹵' => '𖹕', '𖹶' => '𖹖', '𖹷' => '𖹗', '𖹸' => '𖹘', '𖹹' => '𖹙', '𖹺' => '𖹚', '𖹻' => '𖹛', '𖹼' => '𖹜', '𖹽' => '𖹝', '𖹾' => '𖹞', '𖹿' => '𖹟', '𞤢' => '𞤀', '𞤣' => '𞤁', '𞤤' => '𞤂', '𞤥' => '𞤃', '𞤦' => '𞤄', '𞤧' => '𞤅', '𞤨' => '𞤆', '𞤩' => '𞤇', '𞤪' => '𞤈', '𞤫' => '𞤉', '𞤬' => '𞤊', '𞤭' => '𞤋', '𞤮' => '𞤌', '𞤯' => '𞤍', '𞤰' => '𞤎', '𞤱' => '𞤏', '𞤲' => '𞤐', '𞤳' => '𞤑', '𞤴' => '𞤒', '𞤵' => '𞤓', '𞤶' => '𞤔', '𞤷' => '𞤕', '𞤸' => '𞤖', '𞤹' => '𞤗', '𞤺' => '𞤘', '𞤻' => '𞤙', '𞤼' => '𞤚', '𞤽' => '𞤛', '𞤾' => '𞤜', '𞤿' => '𞤝', '𞥀' => '𞤞', '𞥁' => '𞤟', '𞥂' => '𞤠', '𞥃' => '𞤡', ); ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/bootstrap.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Mbstring as p; if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); } } if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); } } if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); } } if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity($s, $convmap, $enc = null) { return p\Mbstring::mb_decode_numericentity($s, $convmap, $enc); } } if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = false) { return p\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex); } } if (!function_exists('mb_convert_case')) { function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); } } if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); } } if (!function_exists('mb_language')) { function mb_language($lang = null) { return p\Mbstring::mb_language($lang); } } if (!function_exists('mb_list_encodings')) { function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } } if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } } if (!function_exists('mb_check_encoding')) { function mb_check_encoding($var = null, $encoding = null) { return p\Mbstring::mb_check_encoding($var, $encoding); } } if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\Mbstring::mb_detect_encoding($str, $encodingList, $strict); } } if (!function_exists('mb_detect_order')) { function mb_detect_order($encodingList = null) { return p\Mbstring::mb_detect_order($encodingList); } } if (!function_exists('mb_parse_str')) { function mb_parse_str($s, &$result = array()) { parse_str($s, $result); } } if (!function_exists('mb_strlen')) { function mb_strlen($s, $enc = null) { return p\Mbstring::mb_strlen($s, $enc); } } if (!function_exists('mb_strpos')) { function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strpos($s, $needle, $offset, $enc); } } if (!function_exists('mb_strtolower')) { function mb_strtolower($s, $enc = null) { return p\Mbstring::mb_strtolower($s, $enc); } } if (!function_exists('mb_strtoupper')) { function mb_strtoupper($s, $enc = null) { return p\Mbstring::mb_strtoupper($s, $enc); } } if (!function_exists('mb_substitute_character')) { function mb_substitute_character($char = null) { return p\Mbstring::mb_substitute_character($char); } } if (!function_exists('mb_substr')) { function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\Mbstring::mb_substr($s, $start, $length, $enc); } } if (!function_exists('mb_stripos')) { function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_stripos($s, $needle, $offset, $enc); } } if (!function_exists('mb_stristr')) { function mb_stristr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_stristr($s, $needle, $part, $enc); } } if (!function_exists('mb_strrchr')) { function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrchr($s, $needle, $part, $enc); } } if (!function_exists('mb_strrichr')) { function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrichr($s, $needle, $part, $enc); } } if (!function_exists('mb_strripos')) { function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strripos($s, $needle, $offset, $enc); } } if (!function_exists('mb_strrpos')) { function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strrpos($s, $needle, $offset, $enc); } } if (!function_exists('mb_strstr')) { function mb_strstr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strstr($s, $needle, $part, $enc); } } if (!function_exists('mb_get_info')) { function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } } if (!function_exists('mb_http_output')) { function mb_http_output($enc = null) { return p\Mbstring::mb_http_output($enc); } } if (!function_exists('mb_strwidth')) { function mb_strwidth($s, $enc = null) { return p\Mbstring::mb_strwidth($s, $enc); } } if (!function_exists('mb_substr_count')) { function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); } } if (!function_exists('mb_output_handler')) { function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); } } if (!function_exists('mb_http_input')) { function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); } } if (!function_exists('mb_convert_variables')) { function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f); } } if (!function_exists('mb_ord')) { function mb_ord($s, $enc = null) { return p\Mbstring::mb_ord($s, $enc); } } if (!function_exists('mb_chr')) { function mb_chr($code, $enc = null) { return p\Mbstring::mb_chr($code, $enc); } } if (!function_exists('mb_scrub')) { function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } } if (!function_exists('mb_str_split')) { function mb_str_split($string, $split_length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $split_length, $encoding); } } if (extension_loaded('mbstring')) { return; } if (!defined('MB_CASE_UPPER')) { define('MB_CASE_UPPER', 0); } if (!defined('MB_CASE_LOWER')) { define('MB_CASE_LOWER', 1); } if (!defined('MB_CASE_TITLE')) { define('MB_CASE_TITLE', 2); } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-mbstring/composer.json ================================================ { "name": "symfony/polyfill-mbstring", "type": "library", "description": "Symfony polyfill for the Mbstring extension", "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=5.3.3" }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, "files": [ "bootstrap.php" ] }, "suggest": { "ext-mbstring": "For best performance" }, "minimum-stability": "dev", "extra": { "branch-alias": { "dev-master": "1.17-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-php72/LICENSE ================================================ Copyright (c) 2015-2019 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-php72/Php72.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Php72; /** * @author Nicolas Grekas * @author Dariusz Rumiński * * @internal */ final class Php72 { private static $hashMask; public static function utf8_encode($s) { $s .= $s; $len = \strlen($s); for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { switch (true) { case $s[$i] < "\x80": $s[$j] = $s[$i]; break; case $s[$i] < "\xC0": $s[$j] = "\xC2"; $s[++$j] = $s[$i]; break; default: $s[$j] = "\xC3"; $s[++$j] = \chr(\ord($s[$i]) - 64); break; } } return substr($s, 0, $j); } public static function utf8_decode($s) { $s = (string) $s; $len = \strlen($s); for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) { switch ($s[$i] & "\xF0") { case "\xC0": case "\xD0": $c = (\ord($s[$i] & "\x1F") << 6) | \ord($s[++$i] & "\x3F"); $s[$j] = $c < 256 ? \chr($c) : '?'; break; case "\xF0": ++$i; // no break case "\xE0": $s[$j] = '?'; $i += 2; break; default: $s[$j] = $s[$i]; } } return substr($s, 0, $j); } public static function php_os_family() { if ('\\' === \DIRECTORY_SEPARATOR) { return 'Windows'; } $map = array( 'Darwin' => 'Darwin', 'DragonFly' => 'BSD', 'FreeBSD' => 'BSD', 'NetBSD' => 'BSD', 'OpenBSD' => 'BSD', 'Linux' => 'Linux', 'SunOS' => 'Solaris', ); return isset($map[PHP_OS]) ? $map[PHP_OS] : 'Unknown'; } public static function spl_object_id($object) { if (null === self::$hashMask) { self::initHashMask(); } if (null === $hash = spl_object_hash($object)) { return; } // On 32-bit systems, PHP_INT_SIZE is 4, return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); } public static function sapi_windows_vt100_support($stream, $enable = null) { if (!\is_resource($stream)) { trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); return false; } $meta = stream_get_meta_data($stream); if ('STDIO' !== $meta['stream_type']) { trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', E_USER_WARNING); return false; } // We cannot actually disable vt100 support if it is set if (false === $enable || !self::stream_isatty($stream)) { return false; } // The native function does not apply to stdin $meta = array_map('strtolower', $meta); $stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri']; return !$stdin && (false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI') || 'xterm' === getenv('TERM') || 'Hyper' === getenv('TERM_PROGRAM')); } public static function stream_isatty($stream) { if (!\is_resource($stream)) { trigger_error('stream_isatty() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); return false; } if ('\\' === \DIRECTORY_SEPARATOR) { $stat = @fstat($stream); // Check if formatted mode is S_IFCHR return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; } return \function_exists('posix_isatty') && @posix_isatty($stream); } private static function initHashMask() { $obj = (object) array(); self::$hashMask = -1; // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below $obFuncs = array('ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush'); foreach (debug_backtrace(\PHP_VERSION_ID >= 50400 ? DEBUG_BACKTRACE_IGNORE_ARGS : false) as $frame) { if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) { $frame['line'] = 0; break; } } if (!empty($frame['line'])) { ob_start(); debug_zval_dump($obj); self::$hashMask = (int) substr(ob_get_clean(), 17); } self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); } public static function mb_chr($code, $encoding = null) { if (0x80 > $code %= 0x200000) { $s = \chr($code); } elseif (0x800 > $code) { $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); } elseif (0x10000 > $code) { $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); } else { $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); } if ('UTF-8' !== $encoding) { $s = mb_convert_encoding($s, $encoding, 'UTF-8'); } return $s; } public static function mb_ord($s, $encoding = null) { if (null == $encoding) { $s = mb_convert_encoding($s, 'UTF-8'); } elseif ('UTF-8' !== $encoding) { $s = mb_convert_encoding($s, 'UTF-8', $encoding); } if (1 === \strlen($s)) { return \ord($s); } $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; if (0xF0 <= $code) { return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; } if (0xE0 <= $code) { return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; } if (0xC0 <= $code) { return (($code - 0xC0) << 6) + $s[2] - 0x80; } return $code; } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-php72/README.md ================================================ Symfony Polyfill / Php72 ======================== This component provides functions added to PHP 7.2 core: - [`spl_object_id`](https://php.net/spl_object_id) - [`stream_isatty`](https://php.net/stream_isatty) On Windows only: - [`sapi_windows_vt100_support`](https://php.net/sapi_windows_vt100_support) Moved to core since 7.2 (was in the optional XML extension earlier): - [`utf8_encode`](https://php.net/utf8_encode) - [`utf8_decode`](https://php.net/utf8_decode) Also, it provides constants added to PHP 7.2: - [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig) - [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family) More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). License ======= This library is released under the [MIT license](LICENSE). ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-php72/bootstrap.php ================================================ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Php72 as p; if (PHP_VERSION_ID >= 70200) { return; } if (!defined('PHP_FLOAT_DIG')) { define('PHP_FLOAT_DIG', 15); } if (!defined('PHP_FLOAT_EPSILON')) { define('PHP_FLOAT_EPSILON', 2.2204460492503E-16); } if (!defined('PHP_FLOAT_MIN')) { define('PHP_FLOAT_MIN', 2.2250738585072E-308); } if (!defined('PHP_FLOAT_MAX')) { define('PHP_FLOAT_MAX', 1.7976931348623157E+308); } if (!defined('PHP_OS_FAMILY')) { define('PHP_OS_FAMILY', p\Php72::php_os_family()); } if ('\\' === DIRECTORY_SEPARATOR && !function_exists('sapi_windows_vt100_support')) { function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } } if (!function_exists('stream_isatty')) { function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } } if (!function_exists('utf8_encode')) { function utf8_encode($s) { return p\Php72::utf8_encode($s); } } if (!function_exists('utf8_decode')) { function utf8_decode($s) { return p\Php72::utf8_decode($s); } } if (!function_exists('spl_object_id')) { function spl_object_id($s) { return p\Php72::spl_object_id($s); } } if (!function_exists('mb_ord')) { function mb_ord($s, $enc = null) { return p\Php72::mb_ord($s, $enc); } } if (!function_exists('mb_chr')) { function mb_chr($code, $enc = null) { return p\Php72::mb_chr($code, $enc); } } if (!function_exists('mb_scrub')) { function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } } ================================================ FILE: 配套插件/BsCore/modules/upyun_uss/vendor/symfony/polyfill-php72/composer.json ================================================ { "name": "symfony/polyfill-php72", "type": "library", "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "keywords": ["polyfill", "shim", "compatibility", "portable"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=5.3.3" }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Php72\\": "" }, "files": [ "bootstrap.php" ] }, "minimum-stability": "dev", "extra": { "branch-alias": { "dev-master": "1.17-dev" } } } ================================================ FILE: 配套插件/BsCore/pages/panel.php ================================================ get('act', 'index'); $theme = $request->get('file', 'owner.html'); if($theme == 'owner.html'){ $themeText = '博主所收到的评论邮件模板'; } elseif($theme == 'guest.html'){ $themeText = '访客所收到的评论邮件模板'; } elseif($theme == 'friendlink_approved.html'){ $themeText = '友链审核通过的邮件模板'; } elseif($theme == 'friendlink_notify.html'){ $themeText = '提醒博主审核友链的邮件模板'; } elseif($theme == 'friendlink_reject.html'){ $themeText = '友链审核不通过的邮件模板'; } else{ $themeText = '未知邮件模板'; } $title = $current == 'index' ? $menu->title : '邮件发送模板 ' . $theme.'('.$themeText.')'; ?>

            to($files);?>

            currentIsWriteable()) : ?>

            • 模板文件
            • next()) : ?>
            • current) echo "class='current'"; ?>> file(); ?>